gpt4 book ai didi

python - 使用 Sklearn 进行多标签文本分类

转载 作者:行者123 更新时间:2023-12-04 04:10:24 26 4
gpt4 key购买 nike

为了解决我在 Python 中的多标签文本分类问题,我已经尝试了所有我能想到的方法,非常感谢任何帮助。我的结果基于 here使用 multilabelbinarizer 并在此网站中 page .

我正在尝试预测用西类牙语编写的数据集中的某些类别,其中我有 7 个不同的标签,其中显示了我的数据集 here .我为每一行写了一条消息和不同的标签。每条短信都有一个或两个标签,具体取决于消息。

df2=df.copy()
df2.drop(["mensaje", "pregunta_parseada", "tags_totales"], axis=1, inplace=True)

# Divide into train and test
X_train, X_test, y_train, y_test = train_test_split(df['pregunta_parseada'],
df2,
test_size=0.15,
random_state=42)

from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer

features_train = tfidf.fit_transform(X_train).toarray()
labels_train = y_train

features_test = tfidf.transform(X_test).toarray()
labels_test = y_test


from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
from sklearn.multiclass import OneVsRestClassifier


lr = LogisticRegression(solver='sag', n_jobs=1)
clf = OneVsRestClassifier(lr)

# fit model on train data
clf.fit(features_train, labels_train)

# make predictions for validation set
y_pred = clf.predict(features_test)

到目前为止,还不错,但是当我尝试验证问题时,似乎几乎每个类别都被归类为“无”

y_pred[2]
accuracy_score(y_test,y_pred)

输出

array([0, 0, 0, 0, 0, 0, 0])
0.2574626865671642

我也尝试过使用 MultiLabelBinarizer,我遇到了同样的问题,我做错了什么?尝试使用 MultiLabelBinarizer 会产生以下结果:

z=[["Generico"],["Mantenimiento"],["Motor"],["Generico"],["Motor"], 
["Generico"],["Motor"],["Generico","Configuracion"],["Generico"],
["Motor"],["Consumo"],...,["Consumo"]]

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
y=mlb.fit_transform(z)

message = df["pregunta_parseada"].to_numpy()
X_train, X_test, y_train, y_test = train_test_split(message,
y,
test_size=0.15,
random_state=42)
classifier = Pipeline([
('vectorizer', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', OneVsRestClassifier(LinearSVC()))])

classifier.fit(X_train, y_train)
predicted = classifier.predict(X_test)
accuracy_score(y_test, predicted)
#predicted[150]
all_labels = mlb.inverse_transform(predicted)
all_labels

具有以下输出

 (),
(),
(),
(),
('Generico',),
(),
(),
(),
(),
('Compra',),
('Motor', 'extras'),

非常感谢您的帮助

最佳答案

我认为问题出在您的数据上。它可能太稀疏了。

我看到您正在使用 OneVsRestClassifier,因此它构建了多个二元分类器来决定标签。

我认为,您的代码中没有直接的错误,但模型的选择不适合任务。

这些二元分类器的问题是数据不平衡,假设即使每个类 (c) 的样本数 (n) 完全相同,二元分类器将数据分为 n vs (n-1) x c 个样本,用于正类和负类。

因此,显然对于所有分类器,负类的数据多于正类。它们偏向于负类,因此每个二元分类器都倾向于预测(All in oneVsall 场景)大多数情况。

如果您不想更改设置,那么您可以做的一件事是:

  1. 不使用 predict,而是使用 predict_proba 来获取每个类别的概率并设置一个较低的阈值 (<0.5) 来决定选择哪一组类别。

你的测试准确率很低,也许重新调整阈值以获得更好的准确率。

  1. 尽可能使用基于深度学习的方法,例如 Bert,这将提供更好的性能。

关于python - 使用 Sklearn 进行多标签文本分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61835773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com