我有一个如下所示的数据集:
Clean_Tweet cEXT cNEU cAGR cCON cOPN
0 thanks questions watch season premiere tonight 0 1 1 1 0
1 couple films coming book 0 0 0 1 1
2 naked afford price 0 1 0 1 1
我想在这个数据集上应用多标签分类。由于我的数据集不平衡,我需要使用分层抽样。
我对准备y
值并将其传递给iterative_train_test_split
.
我已经通过两种方式完成了并且得到了非常不同的结果。我想知道您是否可以帮助我了解哪种方式是正确的方式。
第一个场景:
1.我将我的数据集转换成这个形状:
0 thanks questions watch season premiere tonight [cNeu, cAgr, cCon]
1 couple films coming book [cCON, cOPN]
2 naked afford price [cNeu, cCON, cOPN]
2.然后使用multilabel-binarizer:
multilabel_binarizer = MultiLabelBinarizer()
multilabel_binarizer.fit(df.personality)
y = multilabel_binarizer.transform(df.personality)
3.然后调用采样:
X_train, y_train, X_test, y_test = iterative_train_test_split(np.array(df['Clean_Tweet']).reshape(-1,1), y, test_size = 0.33)
然后使用tfidf
矢量化器并传递给OneVSRest linear svc
分类(如果知道该代码也可能有帮助,请告诉我我会在这里发布)
这样我的表现f1, precision, recall
就在附近95 percent
第二个场景
1.我将我的数据集转换成这个形状:
0 thanks questions watch season premiere tonight [cNeu, cAgr, cCon]
1 couple films coming book [cCON, cOPN]
2 naked afford price [cNeu, cCON, cOPN]
2.然后使用multilabel-binarizer:
multilabel_binarizer = MultiLabelBinarizer()
multilabel_binarizer.fit(df.personality)
y = multilabel_binarizer.transform(df.personality)
3.然后我在二值化目标上应用 LabelEncoding:
def get_new_labels(y):
y_new = LabelEncoder().fit_transform([''.join(str(l)) for l in y])
return y_new
y_new = get_new_labels(y)
y_new = y_new.reshape(len(y_new), 1)
4.然后:
X_train, y_train, X_test, y_test = iterative_train_test_split(np.array(df['Clean_Tweet']).reshape(-1,1), y_new, test_size = 0.33)
使用相同的tfidf
and OneVSRest linear svc
,我绕过了68 percent
性能。
我的问题是哪种方法是正确的方法,为什么会有这种差异?