【问题标题】:Sklearn Scaler output behaviorSklearn Scaler 输出行为
【发布时间】:2018-04-29 21:07:26
【问题描述】:

我有一种情况,我想将 sklearn 的 StandardScaler 对象应用于我的数据框的一列。代码如下:

import pandas as pd
from sklearn.preprocessing import StandardScaler

df = pd.DataFrame([(1,2,3), (2,3,4), (3,4,5)], columns=['a','b','c'])
scaler = StandardScaler().fit(df['c'].values.reshape(-1,1))
df['d'] = df['c'].apply(scaler.transform)
df

当我缩放 c 列并将结果输出到 d 列时,d 中的值看起来像 [[-1.224744871391589]],形状为 (1,1)

我本来希望输出值是一个数值,而不是上面看到的列表。我当然可以通过像df['d'] = df['d'].apply(lambda x: x[0][0]) 那样做一些事情来解决它,但如果没有必要,我想避免这种额外的复杂情况。

我是否错误地使用了缩放器对象,或者这是解决它的唯一方法?提前致谢!

【问题讨论】:

  • apply() 将该列的单个值作为缩放器的输入。 scaler.transform() 的输出形状为 [n_samples,n_columns]。所以它作为 [1,1] 数组正确返回。所以这里没有解决方法。请参阅@KRKirov 答案的最后一行以获得转换列的正确方法。

标签: python pandas scikit-learn data-processing


【解决方案1】:

习惯是先实例化转换器/估计器,然后进行拟合和转换。以下是一些小改动后的输出:

import pandas as pd
from sklearn.preprocessing import StandardScaler

df = pd.DataFrame([(1,2,3), (2,3,4), (3,4,5)], columns=['a','b','c'])

scaler = StandardScaler()

scaler.fit(df['c'].values.reshape(-1,1))

df['d'] = scaler.transform(df['c'].values.reshape(-1,1))
df

Out[84]: 
   a  b  c         d
0  1  2  3 -1.224745
1  2  3  4  0.000000
2  3  4  5  1.224745

【讨论】:

  • 此错误与此无关。我们可以很好地完成 OP 所做的事情,因为 fit() 返回 self 对象。这里的错误是pandas如何将输入提供给scaler,以及scaler如何给出输出。
  • 我并不是说这个错误是由于 StandardScaler 没有被单独实例化。只是分享好的做法。更改出现在以下两个命令行中。如您所见,我的输出与 Calpis 的输出不同。
  • 我注意到了。他也得到了相同的输出,每个值只有一个单例数组。我只是在谈论这一行:scaler = StandardScaler().fit(df['c'].values.reshape(-1,1))
  • 我喜欢你上面的评论。解释问题来自于应用的使用非常有用。
猜你喜欢
  • 2021-06-06
  • 2019-04-09
  • 2018-08-16
  • 2018-04-11
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2017-04-07
相关资源
最近更新 更多