scikit-learn 中跨多列的标签编码

新手上路,请多包涵

我正在尝试使用 scikit-learn 的 LabelEncoder DataFrame --- 进行编码。由于数据框有很多(50+)列,我想避免为每一列创建一个 LabelEncoder 对象;我宁愿只有一个大的 LabelEncoder 对象来处理我 所有 的数据列。

将整个 DataFrame 投入 LabelEncoder 会产生以下错误。请记住,我在这里使用的是虚拟数据;实际上,我正在处理大约 50 列字符串标记数据,因此需要一个不按名称引用任何列的解决方案。

 import pandas
from sklearn import preprocessing

df = pandas.DataFrame({
    'pets': ['cat', 'dog', 'cat', 'monkey', 'dog', 'dog'],
    'owner': ['Champ', 'Ron', 'Brick', 'Champ', 'Veronica', 'Ron'],
    'location': ['San_Diego', 'New_York', 'New_York', 'San_Diego', 'San_Diego',
                 'New_York']
})

le = preprocessing.LabelEncoder()

le.fit(df)

回溯(最近调用最后一次):文件“”,第 1 行,在文件“/Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/preprocessing/label.py”,第 103 行,适合 y = column_or_1d(y, warn=True) 文件“/Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py”,第 306 行,在 column_or_1d 中引发 ValueError(“错误的输入形状 { 0}“.format(shape)) ValueError: 错误的输入形状 (6, 3)

关于如何解决这个问题的任何想法?

原文由 Bryan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 477
1 个回答

你可以很容易地做到这一点,

 df.apply(LabelEncoder().fit_transform)

编辑2:

在 scikit-learn 0.20 中,推荐的方式是

OneHotEncoder().fit_transform(df)

因为 OneHotEncoder 现在支持字符串输入。使用 ColumnTransformer 可以将 OneHotEncoder 仅应用于某些列。

编辑:

由于这个原始答案是一年多以前的,并且产生了许多赞成票(包括赏金),我可能应该进一步扩展它。

对于 inverse_transform 和 transform,你必须做一些 hack。

 from collections import defaultdict
d = defaultdict(LabelEncoder)

这样,您现在将所有列 LabelEncoder 保留为字典。

 # Encoding the variable
fit = df.apply(lambda x: d[x.name].fit_transform(x))

# Inverse the encoded
fit.apply(lambda x: d[x.name].inverse_transform(x))

# Using the dictionary to label future data
df.apply(lambda x: d[x.name].transform(x))

摩尔编辑:

使用 Neuraxle 的 FlattenForEach 步骤,也可以同时对所有展平数据使用相同的 LabelEncoder

 FlattenForEach(LabelEncoder(), then_unflatten=True).fit_transform(df)

对于根据您的数据列使用单独的 LabelEncoder s,或者如果只有部分数据列需要标签编码而不是其他列,则使用 ColumnTransformer 是一种解决方案这允许对您的列选择和您的 LabelEncoder 实例进行更多控制。

原文由 Napitupulu Jon 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题