【问题标题】:Scikit-learn pipeline returns list of zeroesScikit-learn 管道返回零列表
【发布时间】:2022-01-11 00:21:46
【问题描述】:

我无法理解为什么我会得到这个错误的管道输出。

管道代码:

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

【问题讨论】:

  • 问题在于real 的形状为(1, 13),因此被认为是 13 个特征上的 1 个样本,而不是 1 个特征上的 13 个样本。要解决此问题,您可以将 real 转换为 numpy 数组并将其转置:my_pipeline.fit_transform(np.transpose(np.array(real)))

标签: python scikit-learn data-preprocessing


【解决方案1】:

问题

这是一种预期行为,因为您将数据定义为列表。

在管道的第一步即 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)

返回

array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

解决方案

您似乎只有一个名为real 的变量/功能。 在适合之前重新塑造它。

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

【讨论】:

  • 嘿@seralouk 让我确认一件事,您所说的平均值(正在减去)是从“给定列的所有行”中计算出来的。正确的?在二维数组中
  • 是的。平均值和标准差基于每一列,因为 sklearn 将每一列视为一个特征/变量
猜你喜欢
  • 2015-08-14
  • 2020-02-07
  • 2017-02-25
  • 2021-03-17
  • 2016-08-09
  • 2018-01-29
  • 2021-03-02
  • 2020-01-24
  • 1970-01-01
相关资源
最近更新 更多