在 NN 中缩放数据会在时间和错误方面产生更糟糕的结果



请看下面的两个代码。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)

重要:

如果您使用LabelBinarizery = np.array([200, 60, 20])将变得y_scaled

[[0 0 1]
[0 1 0]
[1 0 0]]

如果没有任何关于架构和参数的信息,就很难指出问题所在。

但一般来说,您不需要缩放二进制变量。使用缩放,以便所有要素具有相似的边界。你已经有了它们。

最新更新