不均衡なデータの処理: 技術的な詳細とケーススタディ

不均衡なデータセットは、機械学習とデータ サイエンスの世界ではよくある問題です。不均衡なデータセットとは、ターゲット変数のカテゴリが不均一に分布している、つまり、特定のカテゴリのサンプル数が他のカテゴリのサンプル数をはるかに上回っている分類問題を指します。この記事では、リサンプリング方法、アンサンブル方法、不均衡なデータのパフォーマンス メトリクスなど、不均衡なデータに対処する方法について詳しく説明します。

目次

1. リサンプリング方法

オーバーサンプリング

アンダーサンプリング

2. 統合方法

袋詰め

ブースト

3. パフォーマンス指標

結論は


1. リサンプリング方法

リサンプリングは、主にオーバーサンプリングとアンダーサンプリングを含む、不均衡なデータを処理する一般的な方法です。

オーバーサンプリング

オーバーサンプリングとは、少数派クラスと多数派クラスのサンプル数が同等になるように、少数派クラスのサンプル数を増やすことを指します。以下は、Python の不均衡学習ライブラリを使用したオーバーサンプリングの例です。

from imblearn.over_sampling import RandomOverSampler
from sklearn.datasets import make_classification
import numpy as np

# 创建不平衡数据集
X, y = make_classification(n_classes=2, class_sep=1.5, weights=[0.9, 0.1], n_informative=3, n_redundant=1, flip_y=0, n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)

# 打印原始数据集的类别分布
print('Original dataset shape %s' % np.bincount(y))

# 过采样
ros = RandomOverSampler(random_state=42)
X_res, y_res = ros.fit_resample(X, y)

# 打印过采样后的数据集的类别分布
print('Resampled dataset shape %s' % np.bincount(y_res))

この例では、最初に不均衡バイナリ分類データセットを作成し、次にRandomOverSamplerクラスでランダムにオーバーサンプリングし、最後に元のデータセットとオーバーサンプリングされたデータセットのクラス分布を出力します。

アンダーサンプリング

アンダーサンプリングとは、多数派クラスと少数派クラスのサンプル数が同等になるように、多数派クラスのサンプル数を減らすことを指します。以下は、不均衡学習ライブラリを使用したアンダーサンプリングの例です。

from imblearn.under_sampling import RandomUnderSampler

# 欠采样
rus = RandomUnderSampler(random_state=42)
X_res, y_res = rus.fit_resample(X, y)

# 打印欠采样后的数据集的类别分布
print('Resampled dataset shape %s' % np.bincount(y_res))

この例では、RandomUnderSamplerクラスをランダムにアンダーサンプリングし、アンダーサンプリングされたデータセットのクラス分布を出力します。

2. 統合方法

アンサンブル手法は、バギングやブースティングなど、不均衡なデータを処理するためのもう 1 つの一般的な手法です。

袋詰め

バギング法では、複数のサブセットを作成して複数のモデルをトレーニングし、これらのモデルの予測結果を結合します。不均衡なデータを扱う場合は、アンダーサンプリングとバギングを組み合わせること、つまり各サブセットでのアンダーサンプリングを組み合わせて、これらのサブセットを使用してモデルをトレーニングすることができます。

以下は、Python の不均衡学習ライブラリを使用したアンダーサンプリングとバギングの例です。

from imblearn.ensemble import BalancedBaggingClassifier
from sklearn.tree import DecisionTreeClassifier

# 创建基分类器
base_cls = DecisionTreeClassifier()

# 创建BalancedBaggingClassifier
bbc = BalancedBaggingClassifier(base_estimator=base_cls, random_state=42)

# 训练模型
bbc.fit(X, y)

この例では、最初に基本分類子としてデシジョン ツリー分類子を作成し、それをBalancedBaggingClassifierアンダーサンプリングとバギングに使用します。

ブースト

ブースティングは複数のモデルをトレーニングすることで機能し、各モデルが前のモデルの間違いを修正しようとします。不均衡なデータを扱う場合、AdaBoost や Gradient Boosting などの改良されたブースティング手法を使用できます。

以下は、Python の scikit-learn ライブラリを使用した AdaBoost の例です。

from sklearn.ensemble import AdaBoostClassifier

# 创建AdaBoostClassifier
abc = AdaBoostClassifier(random_state=42)

# 训练模型
abc.fit(X, y)

この例では、AdaBoostClassifierAdaBoost を使用します。

3. パフォーマンス指標

不均衡なデータを扱う場合、モデルのパフォーマンスを評価するために正解率のみに依存することはできません。モデルが多数派クラスのみを予測する場合でも、多数派クラスのサンプル数が少数派クラスのサンプル数をはるかに上回るためです。正解率は高いかもしれない。したがって、混同行列、適合率、再現率、F1 スコア、ROC 曲線、AUC 値など、不均衡なデータに適したパフォーマンス指標を使用する必要があります。

以下は、Python の scikit-learn ライブラリを使用してこれらのメトリクスを計算する例です。

from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score, roc_auc_score

# 预测
y_pred = bbc.predict(X)

# 计算混淆矩阵
print('Confusion Matrix:\n', confusion_matrix(y, y_pred))

# 计算精确率
print('Precision: ', precision_score(y, y_pred))

# 计算召回率
print('Recall: ', recall_score(y, y_pred))

# 计算F1分数
print('F1 Score: ', f1_score(y, y_pred))

# 计算AUC值
print('AUC: ', roc_auc_score(y, y_pred))

この例では、最初にモデルを使用して予測を行い、次に混同行列、適合率、再現率、F1 スコア、および AUC 値を計算します。

結論は

不均衡なデータの処理は重要かつ複雑なタスクであり、リサンプリング、アンサンブル手法、不均衡なデータに適用できるパフォーマンス メトリクスなどのさまざまな手法を使用する必要があります。不均衡なデータを扱う場合、あらゆる状況において最も効率的な方法はありません。特定の問題とデータセットに応じて方法を選択し、適応させる必要があります。

たとえば、データセット内のサンプル数が多い場合、オーバーサンプリングではコンピューティング リソースが不足する可能性があり、アンダーサンプリングでは情報の損失が発生する可能性があります。この場合、アンサンブル手法の使用、またはリサンプリング手法とアンサンブル手法の組み合わせを検討できます。さらに、モデルのパフォーマンスを評価するために、さまざまなパフォーマンス メトリクスを使用することもできます。たとえば、医療または金融リスク管理の分野では、少数派クラス (病気や詐欺) の再現率をより懸念します。

理論的な学習が終わったら、これらの方法をよりよく理解し習得するために、実際のデータや問題で複数回練習することをお勧めします。この記事が、不均衡なデータに対処する方法をより深く理解し、機械学習プロジェクトでより良い結果を達成するのに役立つことを願っています。

次回の投稿では、データが欠落している場合の対処方法について説明しますので、お楽しみに!

おすすめ

転載: blog.csdn.net/a871923942/article/details/131418778