使用Scikit-Learn实现多标签分类,助力机器学习

大家好,在机器学习任务中,分类是一种监督学习方法,用于根据输入数据预测标签。例如,我们想要根据历史特征预测某人是否对销售优惠感兴趣,通过使用可用的训练数据训练机器学习模型,可以对输入数据执行分类任务。

平常会遇到一些经典分类任务,例如二元分类(两个标签)和多类分类(两个以上标签)。在这种情况下,我们会训练分类器,模型会尝试从所有可用标签中预测一个标签。用于分类的数据集类似于下面的图像:

写真

上面的图像显示目标(销售优惠)在二元分类中包含两个标签,在多类分类中包含三个标签,模型会从可用特征中进行训练,然后仅输出一个标签。

多标签分类与二元或多类分类不同,在多标签分类中,我们不仅尝试预测一个输出标签,相反,多标签分类会尝试预测尽可能多的适用于输入数据的标签,输出可以是从没有标签到最大数量的可用标签。

多标签分类通常用于文本数据分类任务,下面是一个多标签分类的示例数据集。

在上面的示例中,假设文本1到文本5是可以归类为四个类别的句子:事件、体育、流行文化和自然。通过上述训练数据,多标签分类任务可以预测哪个标签适用于给定的句子。每个类别之间并不相互对立,因为它们不是互斥的;每个标签可以被视为独立的。

更详细地说,我们可以看到文本1标记为体育和流行文化,而文本2标记为流行文化和自然。这表明每个标签是互斥的,多标签分类的预测输出可以是没有标签或同时包含所有标签。

有了上述介绍,接下来尝试使用Scikit-Learn搭建多标签分类器。

使用Scikit-Learn进行多标签分类

本文将使用Kaggle上公开可用的生物医学PubMed多标签分类数据集,该数据集包含各种特征,但本文只使用abstractText特征和它们的MeSH分类(A:解剖学,B:有机体,C:疾病等)。示例数据如下图所示:

[生物医学 PubMed マルチラベル分類データセット]: https://www.kaggle.com/datasets/owaiskhan9654/pubmed-multilabel-text-classification

上記のデータセットは、各論文が複数のカテゴリに分類できることを示しています。これは、マルチラベル分類のケースです。このデータ セットを使用すると、Scikit-Learn を使用してマルチラベル分類器を構築できます。モデルをトレーニングする前に、まずデータ セットを準備します。

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

df = pd.read_csv('PubMed Multi Label Text Classification Dataset Processed.csv')
df = df.drop(['Title', 'meshMajor', 'pmid', 'meshid', 'meshroot'], axis =1)

X = df["abstractText"]
y = np.asarray(df[df.columns[1:]])

vectorizer = TfidfVectorizer(max_features=2500, max_df=0.9)
vectorizer.fit(X)

上記のコードでは、Scikit-Learn モデルがトレーニング データを受け入れられるように、テキスト データが TF-IDF 表現に変換されます。さらに、チュートリアルを簡略化するために、この記事ではストップワードの削除など、データの前処理の手順を省略しています。

データ変換が完了したら、データ セットをトレーニング セットとテスト セットに分割します。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=101)
  
X_train_tfidf = vectorizer.transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)

すべての準備が完了したら、マルチラベル分類器のトレーニングを開始します。Scikit-Learn では、MultiOutputClassifier オブジェクトを使用して、マルチラベル分類子モデルをトレーニングします。このモデルの背後にある戦略は、ラベルごとに分類子をトレーニングすることであり、各ラベルには独自の分類子があります。

この例では、ロジスティック回帰を使用し、MultiOutputClassifier を使用してそれをすべてのラベルに拡張します。

from sklearn.multioutput import MultiOutputClassifier
from sklearn.linear_model import LogisticRegression

clf = MultiOutputClassifier(LogisticRegression()).fit(X_train_tfidf, y_train)

モデルを変更したり、MultiOutputClasiffier に渡すモデル パラメーターを調整したりすることができますので、要件に応じて管理してください。トレーニングが完了したら、モデルを使用してテスト データを予測します。

prediction = clf.predict(X_test_tfidf)
prediction

写真

予測結果は各 MeSH カテゴリのラベルの配列であり、各行は文を表し、各列はラベルを表します。

最後に、マルチラベル分類器を評価する必要があります。精度メトリックを使用してモデルを評価できます。

from sklearn.metrics import accuracy_score
print('Accuracy Score: ', accuracy_score(y_test, prediction))****

精度スコアは 0.145 です。

精度スコアの結果は 0.145 でした。これは、モデルが正しいラベルの組み合わせを予測できる確率が 14.5% 未満であることを示しています。ただし、精度スコアには、マルチラベル予測評価の欠点があります。精度スコアでは、各文のすべてのラベルが正確な位置に表示されることが必要です。そうでない場合は、間違っていると見なされます。

たとえば、予測の最初の行は、テスト データと 1 つのラベルだけ異なります。

写真

精度スコアの場合、ラベルの組み合わせが異なるため、これは誤った予測とみなされます。そのため、モデルのメトリック スコアは低くなります。

この問題を解決するには、ラベルの組み合わせではなくラベルの予測を評価する必要があります。この場合、ハミング損失評価指標を使用できます。ハミング損失は、ラベルの総数に対する誤った予測の比率を計算することによって計算されます。これは、ハミング損失は損失関数であり、スコアが低いほど優れているためです (0 は誤った予測がないことを意味し、1 はすべての予測が誤っていることを意味します)。

from sklearn.metrics import hamming_loss
print('Hamming Loss: ', round(hamming_loss(y_test, prediction),2))

ハミング損失は 0.13 です。

マルチラベル分類器のハミング損失モデルは 0.13 です。これは、モデルが独立して約 13% 誤って予測していることを意味します。つまり、各ラベルの予測は 13% 誤る可能性があります。

要約する

マルチラベル分類は機械学習タスクであり、その出力はラベルなし、または入力データが与えられた場合に考えられるすべてのラベルのいずれかになります。これは、ラベル出力が相互排他的なバイナリ分類やマルチクラス分類とは異なります。

Scikit-Learn の MultiOutputClassifier を使用すると、ラベルごとに 1 つの分類器をトレーニングするマルチラベル分類器を開発できます。モデルの評価に関しては、精度スコアが全体的な状況を正しく反映していない可能性があるため、ハミング損失メトリクスを使用することをお勧めします。

 

Supongo que te gusta

Origin blog.csdn.net/csdn1561168266/article/details/132383752
Recomendado
Clasificación