Python 在NN中缩放数据会在时间和误差上产生更差的结果
请看下面的两个代码。NN系统有两种设置。第一个代码(带结果)显示未缩放数据的结果,第二个代码显示带缩放数据的结果。我很担心,因为数据集很小而且是分类的,我找不到一个解决方案来扩展这个过程。现在想象一下,功能将具有连续的值和标签。结果会更糟。我可以做些什么来改进缩放代码的结果吗 在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
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)?二进制不是问题。但让我们假设我有混合的分类