如何在 sklearn 中一次在多个列上应用预处理方法

Posted

技术标签:

【中文标题】如何在 sklearn 中一次在多个列上应用预处理方法【英文标题】:how to apply preprocessing methods on several columns at one time in sklearn 【发布时间】:2014-09-04 22:06:31 【问题描述】:

我的问题是我的 pandas 数据框中有这么多列,我正在尝试使用 sklearn-pandas 库中的数据帧映射器应用 sklearn 预处理,例如

mapper= DataFrameMapper([
    ('gender',sklearn.preprocessing.LabelBinarizer()),
    ('gradelevel',sklearn.preprocessing.LabelEncoder()),
    ('subject',sklearn.preprocessing.LabelEncoder()),
    ('districtid',sklearn.preprocessing.LabelEncoder()),
    ('sbmRate',sklearn.preprocessing.StandardScaler()),
    ('pRate',sklearn.preprocessing.StandardScaler()),
    ('assn1',sklearn.preprocessing.StandardScaler()),
    ('assn2',sklearn.preprocessing.StandardScaler()),
    ('assn3',sklearn.preprocessing.StandardScaler()),
    ('assn4',sklearn.preprocessing.StandardScaler()),
    ('assn5',sklearn.preprocessing.StandardScaler()),
    ('attd1',sklearn.preprocessing.StandardScaler()),
    ('attd2',sklearn.preprocessing.StandardScaler()),
    ('attd3',sklearn.preprocessing.StandardScaler()),
    ('attd4',sklearn.preprocessing.StandardScaler()),
    ('attd5',sklearn.preprocessing.StandardScaler()),
    ('sbm1',sklearn.preprocessing.StandardScaler()),
    ('sbm2',sklearn.preprocessing.StandardScaler()),
    ('sbm3',sklearn.preprocessing.StandardScaler()),
    ('sbm4',sklearn.preprocessing.StandardScaler()),
    ('sbm5',sklearn.preprocessing.StandardScaler())
 ])

我只是想知道是否还有另一种更简洁的方法可以一次预处理多个变量而无需明确写出它们。

另一件我觉得有点烦人的事情是,当我将所有 pandas 数据框转换为 sklearn 可以使用的数组时,它们会丢失列名特征,这使得选择变得非常困难。有谁知道在将 pandas 数据帧更改为 np 数组时如何将列名保留为键?

非常感谢!

【问题讨论】:

我只是创建一个新的编码列并将它们传递给 scikit 学习如果你想要漂亮的列名,你可以编写一个缩放函数来获取列并根据类型应用适当的编码器并生成通过添加前缀 _encoded 或类似的新列名称 嗨@EdChum 非常感谢您的回复!但我仍然无法通过 prefix_encoded 部分。请您发布一些关于此的代码吗?非常感谢你的帮助! :) 【参考方案1】:
from sklearn.preprocessing import LabelBinarizer, LabelEncoder, StandardScaler
from sklearn_pandas import DataFrameMapper

encoders = ['gradelevel', 'subject', 'districtid']
scalars = ['sbmRate', 'pRate', 'assn1', 'assn2', 'assn3', 'assn4', 'assn5', 'attd1', 'attd2', 'attd3', 'attd4', 'attd5', 'sbm1', 'sbm2', 'sbm3', 'sbm4', 'sbm5']
mapper = DataFrameMapper(
    [('gender', LabelBinarizer())] +
    [(encoder, LabelEncoder()) for encoder in encoders] +
    [(scalar, StandardScaler()) for scalar in scalars]
)

如果你经常这样做,你甚至可以编写自己的函数:

mapper = data_frame_mapper(binarizers=['gender'],
    encoders=['gradelevel', 'subject', 'districtid'],
    scalars=['sbmRate', 'pRate', 'assn1', 'assn2', 'assn3', 'assn4', 'assn5', 'attd1', 'attd2', 'attd3', 'attd4', 'attd5', 'sbm1', 'sbm2', 'sbm3', 'sbm4', 'sbm5'])

【讨论】:

嗨@U2EF1 非常感谢您的回复!但是当我将它们更改为 np 数组时,你知道如何保留列的名称吗?太感谢了! 我也有点不明白 +\ 是什么意思...我认为它是两行代码的分隔符。为什么逗号在这里不起作用?抱歉,我对 Python 世界真的很陌生。再次感谢! @MYjx 我不知道如何推动您的列。 Numpy 有结构化数组,但我不确定 sklearn 会对它们做什么。你是对的, \ 只是让你继续这条线,但在括号内是不必要的。

以上是关于如何在 sklearn 中一次在多个列上应用预处理方法的主要内容,如果未能解决你的问题,请参考以下文章

在R中一次在目录内创建子目录

将多个预处理步骤应用于 sklearn 管道中的列

在 go 中一次处理多个 GET 请求

如何一次在多个表中添加行?

我可以一次在多个 iOS 模拟器上运行我的 Expo 应用程序吗?

如何一次在一个解决方案中编写多个项目中的代码? [Visual Studio / Xamarin]