我在Python中研究一个多标签分类问题。我有一个数据集与文本和约20k独特的标签。我将文本转换为单词嵌入,现在我在ChainClassifier中使用它来预测每个文本可能具有的标记。
from skmultilearn.problem_transform import LabelPowerset, ClassifierChain, BinaryRelevance
from sklearn.svm import SVC
df = pd.read_csv('sample_fos.csv')
df = df.dropna()
df.fos = df.fos.str.split(',')
mlb = MultiLabelBinarizer()
data = df.join(pd.DataFrame(mlb.fit_transform(df.pop('fos')),
columns=mlb.classes_,
index=df.index))
labels = mlb.classes_
X_train, X_test, y_train, y_test = train_test_split(data[features], data[labels], test_size=0.20, shuffle=True)
clf = ClassifierChain(classifier=SVC(gamma="auto"))
clf.fit(X_train,y_train)
y_pred = clf.predict(X_test)我得到以下错误:
File "<ipython-input-54-976064cc6433>", line 30, in <module>
clf.fit(X_train,y_train)
File "/lib/python3.7/site-packages/skmultilearn/problem_transform/cc.py", line 155, in fit
X_extended), self._ensure_output_format(y_subset))
File "/lib/python3.7/site-packages/sklearn/svm/base.py", line 147, in fit
y = self._validate_targets(y)
File "/lib/python3.7/site-packages/sklearn/svm/base.py", line 521, in _validate_targets
" class" % len(cls))
ValueError: The number of classes has to be greater than one; got 1 class据我所知,这意味着标签列中只有一个类( 0或1)。
但是,运行下面的代码段,我发现我的所有列都有两个唯一的值
b = []
for i in labels:
b.append(len(data[i].unique()))
print(min(b),max(b))
>> 2, 2发布于 2020-04-21 10:51:03
你能看到有多少个班在接受训练和考试吗?
y_train.unique()
y_test.unique()可能会发生这样的情况:在某个时候,只有一个标签的分割,如果数据很小或严重不平衡,就会有更多的机会。解决这一问题的一种方法是对目标进行分层。
train_test_split(data[features], data[labels], test_size=0.20, shuffle=True,stratify=data[labels])https://datascience.stackexchange.com/questions/72536
复制相似问题