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