Scikit-learn 管道 returns 零列表
Scikit-learn pipeline returns list of zeroes
我不明白为什么我得到这个错误的管道输出。
流水线代码:
my_pipeline = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('std_scaler', StandardScaler())
])
真实数据:
real = [[0.02498, 0.0, 1.89, 0.0, 0.518, 6.54, 59.7, 6.2669, 1.0, 422.0, 15.9, 389.96, 8.65]]
我想要的流水线输出:
want = [[-0.44228927, -0.4898311 , -1.37640684, -0.27288841, -0.34321545, 0.36524574, -0.33092752, 1.20235683, -1.0016859 , 0.05733231, -1.21003475, 0.38110555, -0.57309194]]
但是在 运行 下面的代码之后:
getting = my_pipeline.fit_transform(real)
我得到:
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
问题
这是预期的行为,因为您将数据定义为列表。
在管道的第一步(即 SimpleImputer)之后,返回的输出是一个形状为 (1,13)
.
的 numpy 数组
si = SimpleImputer()
si_out = si.fit_transform(real)
si_out.shape
# (1, 13)
返回的 (1,13)
数组是这里的问题。 这是因为 StandardScaler
删除了每列的平均值并除以标准差。 因此,它“看到”了 13 列,并且最终输出全为 0,因为均值已被删除。
sc = StandardScaler()
sc.fit_transform(si_out)
returns
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
解决方案
您似乎只有一个名为 real
的 variable/feature。
适配前先整形。
import numpy as np
real = np.array([[0.02498, 0.0, 1.89, 0.0, 0.518, 6.54, 59.7, 6.2669, 1.0, 422.0, 15.9, 389.96, 8.65]]).reshape(-1,1)
my_pipeline = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('std_scaler', StandardScaler())
])
my_pipeline.fit_transform(real)
array([[-0.48677709],
[-0.4869504 ],
[-0.47383804],
[-0.4869504 ],
[-0.48335664],
[-0.44157747],
[-0.07276633],
[-0.44347217],
[-0.48001264],
[ 2.44078289],
[-0.37664007],
[ 2.21849716],
[-0.4269388 ]])
我不明白为什么我得到这个错误的管道输出。
流水线代码:
my_pipeline = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('std_scaler', StandardScaler())
])
真实数据:
real = [[0.02498, 0.0, 1.89, 0.0, 0.518, 6.54, 59.7, 6.2669, 1.0, 422.0, 15.9, 389.96, 8.65]]
我想要的流水线输出:
want = [[-0.44228927, -0.4898311 , -1.37640684, -0.27288841, -0.34321545, 0.36524574, -0.33092752, 1.20235683, -1.0016859 , 0.05733231, -1.21003475, 0.38110555, -0.57309194]]
但是在 运行 下面的代码之后:
getting = my_pipeline.fit_transform(real)
我得到:
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
问题
这是预期的行为,因为您将数据定义为列表。
在管道的第一步(即 SimpleImputer)之后,返回的输出是一个形状为 (1,13)
.
si = SimpleImputer()
si_out = si.fit_transform(real)
si_out.shape
# (1, 13)
返回的 (1,13)
数组是这里的问题。 这是因为 StandardScaler
删除了每列的平均值并除以标准差。 因此,它“看到”了 13 列,并且最终输出全为 0,因为均值已被删除。
sc = StandardScaler()
sc.fit_transform(si_out)
returns
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
解决方案
您似乎只有一个名为 real
的 variable/feature。
适配前先整形。
import numpy as np
real = np.array([[0.02498, 0.0, 1.89, 0.0, 0.518, 6.54, 59.7, 6.2669, 1.0, 422.0, 15.9, 389.96, 8.65]]).reshape(-1,1)
my_pipeline = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('std_scaler', StandardScaler())
])
my_pipeline.fit_transform(real)
array([[-0.48677709],
[-0.4869504 ],
[-0.47383804],
[-0.4869504 ],
[-0.48335664],
[-0.44157747],
[-0.07276633],
[-0.44347217],
[-0.48001264],
[ 2.44078289],
[-0.37664007],
[ 2.21849716],
[-0.4269388 ]])