考虑如下数据:

from sklearn.preprocessing import OneHotEncoder
import numpy as np
dt = 'object, i4, i4'
d = np.array([('aaa', 1, 1), ('bbb', 2, 2)], dtype=dt)

我想使用OHE功能排除文本列。

为什么下面的方法不起作用?
ohe = OneHotEncoder(categorical_features=np.array([False,True,True], dtype=bool))
ohe.fit(d)
ValueError: could not convert string to float: 'bbb'

它在documentation中说:
categorical_features: “all” or array of indices or mask :
  Specify what features are treated as categorical.
   ‘all’ (default): All features are treated as categorical.
   array of indices: Array of categorical feature indices.
   mask: Array of length n_features and with dtype=bool.

我正在使用蒙版,但它仍尝试转换为浮点型。

即使使用
ohe = OneHotEncoder(categorical_features=np.array([False,True,True], dtype=bool),
                    dtype=dt)
ohe.fit(d)

同样的错误。

并且在“索引数组”的情况下:
ohe = OneHotEncoder(categorical_features=np.array([1, 2]), dtype=dt)
ohe.fit(d)

最佳答案

您应该了解,Scikit-Learn中的所有估计量都仅用于数字输入。因此,从这种角度来看,以这种形式保留文本列是没有意义的。您必须以某种数字形式转换该文本列,或者摆脱它。

如果您是从Pandas DataFrame获得数据集的,那么可以看一下这个小的包装:https://github.com/paulgb/sklearn-pandas。这将帮助您同时转换所有需要的列(或以数字形式保留一些行)

import pandas as pd
import numpy as np
from sklearn_pandas import DataFrameMapper
from sklearn.preprocessing import OneHotEncoder

data = pd.DataFrame({'text':['aaa', 'bbb'], 'number_1':[1, 1], 'number_2':[2, 2]})

#    number_1  number_2 text
# 0         1         2  aaa
# 1         1         2  bbb

# SomeEncoder here must be any encoder which will help you to get
# numerical representation from text column
mapper = DataFrameMapper([
    ('text', SomeEncoder),
    (['number_1', 'number_2'], OneHotEncoder())
])
mapper.fit_transform(data)

关于python - 适用于onehotencoder的sklearn蒙版不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34089906/

10-12 19:23