请看下面的两个代码。NN 系统有两种设置。第一个代码(带有结果(显示数据未缩放的结果,第二个代码显示缩放数据的结果。我很担心,因为数据集很小且分类,我找不到扩展过程的解决方案。现在假设特征也将具有连续值和标签。结果会更糟。我可以做些什么来改进缩放代码结果?
在python中设置NN,没有缩放器:
import numpy as np
X = np.array([[1,0,0], [1,1,0], [0,0,1]])
y = np.array([[0,1,0]]).T
def relu(x):
return np.maximum(x,0,x) #relu activation
def relu_d(x): #derivate of relu
x[x<0] = 0
return x
np.random.seed(0)
w0 = np.random.normal(size=(3,5), scale=0.1)
w1 = np.random.normal(size=(5,1), scale=0.1)
结果:
epoch nr:0 results in mean square error: 0.572624041985418
epoch nr:100000 results in mean square error: 0.1883460901967186
epoch nr:200000 results in mean square error: 0.08173913195938957
epoch nr:300000 results in mean square error: 0.04658778224325014
epoch nr:400000 results in mean square error: 0.03058257621363338
缩放数据代码:
import numpy as np
X = np.array([[1,0,0], [1,1,0], [0,0,1]])
y = np.array([[0,1,0]]).T
from sklearn.preprocessing import StandardScaler
sx = StandardScaler()
X = sx.fit_transform(X)
sy = StandardScaler()
y = sy.fit_transform(y)
def relu(x):
return np.maximum(x,0,x)
def relu_d(x):
x[x<0] = 0
return x
np.random.seed(0)
w0 = np.random.normal(size=(3,5), scale=0.1)
w1 = np.random.normal(size=(5,1), scale=0.1)
结果是:
epoch nr:0 results in mean square error: 1.0039400468232
epoch nr:100000 results in mean square error: 0.5778610517002227
epoch nr:200000 results in mean square error: 0.5773502691896257
epoch nr:300000 results in mean square error: 0.5773502691896257
epoch nr:400000 results in mean square error: 0.5773502691896257
通常,缩放应用于要素。在这里,您也可以将其应用于目标。
尝试删除:
sy = StandardScaler()
y = sy.fit_transform(y)
并使用原始y = np.array([[0,1,0]])
,看看这种情况发生
编辑 1
您可以尝试使用例如标签二值化器链接来二值化标签。
如果你有像 80,140,180 这样的 y 值......你可以使用它来二值化 y 值,然后在缩放 X 特征后,你可以训练 NN。
编辑 2
使用多层感知器回归器且不缩放的简单示例:
from sklearn.neural_network import MLPRegressor
import numpy as np
X = np.array([[0,100,200], [1,22,44], [0,40,50] ])
y = np.array([200, 60, 20])
nn= MLPRegressor()
nn.fit(X,y)
X_new = np.array([[21,10,22]])
y_pred = nn.predict(X_new)
print(y_pred)
结果:
[ 29.28949475]
PS:您可以规范化/缩放数据并使用相同的方法,但这次使用X_scaled(如果是这种情况,则y_scaled(。见下文
编辑 3
相同但使用缩放
from sklearn.neural_network import MLPRegressor
import numpy as np
from sklearn.preprocessing import StandardScaler
X = np.array([[0,100,200], [1,22,44], [0,40,50] ])
y = np.array([200, 60, 20])
nn= MLPRegressor()
sc_x = StandardScaler()
X_scaled = sc_x.fit_transform(X)
sc_y = StandardScaler()
y_scaled = sc_y.fit_transform(y)
nn.fit(X_scaled,y_scaled)
X_new = np.array([[21,10,22]])
X_new_scaled = sc_x.fit_transform(X_new)
y_pred = nn.predict(X_new)
print(y_pred)
结果:
[ 10.03179535]
编辑 4
如果要对值进行二值化,可以使用以下内容:
取代
sc_y = StandardScaler()
y_scaled = sc_y.fit_transform(y)
跟
sc_y = LabelBinarizer()
y_scaled = sc_y.fit_transform(y)
重要:
如果您使用LabelBinarizer
则y = np.array([200, 60, 20])
将变得y_scaled
[[0 0 1]
[0 1 0]
[1 0 0]]
如果没有任何关于架构和参数的信息,就很难指出问题所在。
但一般来说,您不需要缩放二进制变量。使用缩放,以便所有要素具有相似的边界。你已经有了它们。