Python 在NN中缩放数据会在时间和误差上产生更差的结果

Python 在NN中缩放数据会在时间和误差上产生更差的结果,python,scikit-learn,neural-network,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 de

请看下面的两个代码。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
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)
缩放数据代码:

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
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)

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


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

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


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

通常,缩放应用于功能。在这里,您还可以将其应用于目标

尝试删除:

sy = StandardScaler()
y = sy.fit_transform(y)
然后使用原始
y=np.array([[0,1,0]])
并查看这一情况

编辑1


您可以尝试使用例如LabelBinarizer链接对标签进行二值化

如果你有像80140180这样的y值。。。您可以使用它对y值进行二值化,然后在缩放X特征后,可以训练NN

编辑2

使用多层感知器回归器且无需缩放的简单示例:

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
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]
[ 10.03179535]
附言:您可以对数据进行标准化/缩放,并使用相同的方法,但这次使用X_缩放(如果是这种情况,则使用y_缩放)。见下文

编辑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)
结果:

[ 29.28949475]
[ 10.03179535]
编辑4

如果要对值进行二值化,可以使用以下方法:

替换

sc_y = StandardScaler()
y_scaled = sc_y.fit_transform(y)

重要提示:

如果使用
LabelBinarizer
,则
y=np.数组([200,60,20])
将变为
y\u缩放

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

通常,缩放应用于特征。在这里,您还可以将其应用于目标

尝试删除:

sy = StandardScaler()
y = sy.fit_transform(y)
然后使用原始
y=np.array([[0,1,0]])
并查看这一情况

编辑1


您可以尝试使用例如LabelBinarizer链接对标签进行二值化

如果你有像80140180这样的y值。。。您可以使用它对y值进行二值化,然后在缩放X特征后,可以训练NN

编辑2

使用多层感知器回归器且无需缩放的简单示例:

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
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]
[ 10.03179535]
附言:您可以对数据进行标准化/缩放,并使用相同的方法,但这次使用X_缩放(如果是这种情况,则使用y_缩放)。见下文

编辑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)
结果:

[ 29.28949475]
[ 10.03179535]
编辑4

如果要对值进行二值化,可以使用以下方法:

替换

sc_y = StandardScaler()
y_scaled = sc_y.fit_transform(y)

重要提示:

如果使用
LabelBinarizer
,则
y=np.数组([200,60,20])
将变为
y\u缩放

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

尝试删除sy=StandardScaler()和y=sy.fit\u变换(y)。通常情况下,缩放应用于不在targetsTry上的功能,以删除sy=StandardScaler()和y=sy.fit_变换(y)。一般来说,缩放应用于功能,而不是目标。谢谢您的回复。但是请考虑一下,我可能有一些类似的值:x= NP。数组([20[30],[50],[40],[50],[90],[20],[22])[y(n],[2])[t(80, 180, 144)]。在这种情况下,t是必须的。我有分类和回归数据的混合。规模将是重要的,但我不知道如何。我知道我可以在示例中使用回归,但是我想训练NN来找到它的解决方案。您可以尝试使用例如LabelBinarizer对标签进行二值化。您可以使用它对y值进行二值化,然后在缩放X特征后,可以训练NN。再次,如果你上传你的数据,我可以提供更多的解决方案谢谢。这里是一个样本X=np.array([[0100200],[1,22,44],[0,40,50]等]),其中特征1是分类的。标签是np.array([200]、[60]、[20]等)。分类数据和标签之间存在相关性,我知道我可以使用其他机器学习模型,但我正在尝试构建一个神经网络。好的,我明白了。你想预测y吗?因此,如果你训练模型,然后使用一个新的X=[1,2,3],你想得到y作为一个值(比如200)或标签(类别1)?谢谢你的回答。但是请考虑一下,我可能有一些类似的值:x= NP。数组([20[30],[50],[40],[50],[90],[20],[22])[y(n],[2])[t(80, 180, 144)]。在这种情况下,t是必须的。我有分类和回归数据的混合。规模将是重要的,但我不知道如何。我知道我可以在示例中使用回归,但是我想训练NN来找到它的解决方案。您可以尝试使用例如LabelBinarizer对标签进行二值化。您可以使用它对y值进行二值化,然后在缩放X特征后,可以训练NN。再次,如果你上传你的数据,我可以提供更多的解决方案谢谢。这里是一个样本X=np.array([[0100200],[1,22,44],[0,40,50]等]),其中特征1是分类的。标签是np.array([200]、[60]、[20]等)。分类数据和标签之间存在相关性,我知道我可以使用其他机器学习模型,但我正在尝试构建一个神经网络。好的,我明白了。你想预测y吗?因此,如果你训练模型,然后使用一个新的X=[1,2,3],你想得到y作为一个值(比如200)或标签(类1)?二进制不是问题。但让我们假设我有混合的分类