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

时间:2017-07-19 18:08:57

标签: python scikit-learn neural-network

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

2 个答案:

答案 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]]