【问题标题】:scaling data in NN gives worse results in time and errorNN 中的缩放数据会在时间和错误上产生更差的结果
【发布时间】:2017-07-20 20:07:52
【问题描述】:

请看下面两个代码。 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)。通常,缩放应用于不在目标上的特征

标签: python scikit-learn neural-network


【解决方案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]]

【讨论】:

  • 感谢您的回复。但请考虑一下,我可能会继续。像这样的值:X = np.array([[20,30,50], [40,50,90], [20,22,100]]) y = np.array([[80, 180, 144]])。 T 在这种情况下,缩放是必须的。
  • 我混合了分类数据和回归数据。规模很重要,但我不确定如何。我知道我可以在示例案例中使用回归,但是我想训练 NN 找到解决方案。
  • 您可以尝试使用例如 LabelBinarizer link 对标签进行二值化。您可以使用它来二值化 y 值,然后在缩放 X 特征后,您可以训练 NN。同样,如果您上传数据,我可以提供更多解决方案
  • 谢谢。这是一个样本 X = np.array([[0,100,200], [1,22,44], [0,40,50] 等])),其中特征一是分类的。标签是 np.array([200], [60], [20],etc]))。分类数据和标签之间存在相关性,我知道我可以为此使用其他机器学习模型,但我正在尝试构建一个 NN。
  • 好的,我明白了。你想预测 y 吗?因此,如果您训练模型然后使用新的 X = [1,2,3] ,您希望将 y 作为值(如 200)或标签(第 1 类)?
【解决方案2】:

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

但通常您不需要缩放二进制变量。使用缩放以使所有特征具有相似的界限。你已经有了它们。

【讨论】:

  • 二进制不是问题。但是让我们假设我混合了分类和连续。功能和续。标签。在这种情况下,结果根本不会好。
  • 如果你还有一些其他的功能——当然是有必要做点什么的。连续特征应该被缩放和分类一个热编码。只是这个例子的训练数据太少了。网络根本无法学习。在更大的数据集上性能应该会更好。
  • 谢谢。我只是在构建百万大小的数据集,看看会发生什么:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
相关资源
最近更新 更多