使用scikit-learn的单热编码

时间:2017-04-14 10:33:06

标签: python numpy scikit-learn categorical-data one-hot-encoding

我正在研究机器学习项目,我的数据集的一个功能包括分类数据。此数据首先存储在大小为<class 'pandas.core.series.Series'>的熊猫系列(mesh(2000,)中。行数对应于数据实例的总数。每行包含该数据实例所属的类别的字符串,其中类别由逗号分隔。有几百个不同的类别。例如,

0       Aged, Angiotensin-Converting Enzyme Inhibitors...
1       Aged, Angiotensin-Converting Enzyme Inhibitors...
2       Adult, Aged, Aged, 80 and over, Angiotensin-Co...
....

在此示例中,Aged是一个类别,Angiotensin-Converting Enzyme Inhibitors是另一个类别。正如您在示例中所看到的,相同的类别可能会多次出现,但如果类别只在字符串中一次,则编码应该没有区别。

我希望使用单热编码来表示它们。为了尝试这样做,我使用以下代码:

mlb = MultiLabelBinarizer(sparse_output=True)
for s in data:
   pre_data = mlb.fit_transform(str(s).split(', '))
return pre_data, len(mlb.classes_)

然而,这会产生一个numpy维数组(19, 37)。为什么会这样?

回复MaxU's回复:

使用str(s).split(', ')重新s.str.split(',\s*')时,会产生此错误:

Traceback (most recent call last):
  File ".../guidedLearning.py", line 166, in <module>
    X, y = processTrainingData(directory, filename)
  File ".../guidedLearning.py", line 130, in processTrainingData
    pre_mesh, meshN = oneHot(mesh)
  File ".../guidedLearning.py", line 73, in oneHot
    pre_data = mlb.fit_transform(data.str.split(',\s*'))
  File ".../sklearn/preprocessing/label.py", line 723, in fit_transform
    yt = self._transform(y, class_mapping)
  File ".../sklearn/preprocessing/label.py", line 781, in _transform
    indices.extend(set(class_mapping[label] for label in labels))
TypeError: 'float' object is not iterable

1 个答案:

答案 0 :(得分:1)

str(s)将Pandas.Series字符串转换为单个字符串,由'\n'分隔,因此请改用Pandas.Series.str.split()方法。

替换

str(s).split(', ')

s.str.split(',\s*')

演示:

In [88]: s
Out[88]:
0       Aged, Angiotensin-Converting Enzyme Inhibitors
1       Aged, Angiotensin-Converting Enzyme Inhibitors
2    Adult, Aged, Aged, 80 and over, Angiotensin-Co...
Name: s, dtype: object

In [89]: mlb = MultiLabelBinarizer(sparse_output=True)

In [90]: pre_data = mlb.fit_transform(s.str.split(',\s*'))

In [91]: mlb.classes_
Out[91]: array(['80 and over', 'Adult', 'Aged', 'Angiotensin-Converting Enzyme Inhibitors'], dtype=object)

In [92]: pre_data.toarray()
Out[92]:
array([[0, 0, 1, 1],
       [0, 0, 1, 1],
       [1, 1, 1, 1]])