我正在研究机器学习项目,我的数据集的一个功能包括分类数据。此数据首先存储在大小为<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
答案 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]])