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

我正在尝试使用 scikit-learn 的 LabelEncoder 对字符串标签的 pandas 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)

Traceback (most recent call last): File "", line 1, in File "/Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/preprocessing/label.py", line 103, in fit y = column_or_1d(y, warn=True) File "/Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py", line 306, in column_or_1d raise ValueError("bad input shape {0}".format(shape)) ValueError: bad input shape (6, 3)

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

最佳答案

不过,您可以轻松做到这一点,

df.apply(LabelEncoder().fit_transform)

EDIT2:

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

MOAR 编辑:

使用 Neuraxle 的 FlattenForEach步骤,也可以使用相同的 LabelEncoder一次处理所有展平的数据:

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

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

https://stackoverflow.com/questions/24458645/

相关文章:

linux - 查看 PS 命令的完整输出

linux - SVN check out 文件夹的内容,而不是文件夹本身

linux - 如何在 Linux 中遍历目录?

linux - 如何在 bash 中在一行中运行多个后台命令?

python - 'setdefault' dict 方法的用例

python - 如何将 numpy 数组转换为(并显示)图像?

python - 如何获得 Python 类的 parent ?

python - 如何消除数独方 block 中的凸性缺陷?

linux - libtool 的 .la 文件有什么用?

python - 如何检查我的 python 对象是否为数字?