2

我正在做一个机器学习项目,我的数据集的一个特征是分类数据。该数据首先存储在尺寸为 的熊猫系列 ( <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另一个。正如您在示例中看到的那样,同一类别可能会出现多次,但如果该类别仅在字符串中出现一次,则编码应该没有不同。

我希望使用 one-hot 编码来表示它们。为此,我使用以下代码:

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 的回答:

替换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
4

1 回答 1

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]])
于 2017-04-14T10:43:30.510 回答