请看下面的两个代码。 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
答案 0 :(得分:1)
如果没有关于架构和参数的任何信息,很难找到问题。
但一般来说,您不需要缩放二进制变量。使用缩放以使所有要素具有相似的边界。你已经拥有它们了。
答案 1 :(得分:1)
通常,缩放应用于要素。在这里,您也可以将其应用于目标。
尝试删除:
sy = StandardScaler()
y = sy.fit_transform(y)
并使用原始y = np.array([[0,1,0]])
并查看发生情况
编辑1
您可以尝试使用LabelBinarizer链接对标签进行二值化。
如果您有y值80,140,180 ...您可以使用它来二值化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]
P.S:您可以规范化/缩放数据并使用相同的方法,但这一次使用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]]