「Pythonを使用したアンダーサンプリング手法」
「Pythonを使ったアンダーサンプリング手法の活用法」
進化するデジタルの世界では、多様な情報源から膨大なデータが生成され、キャプチャされています。これらのデータは非常に価値がありますが、しばしば現実世界の現象の不均衡な分布を反映しています。データの不均衡な問題は単なる統計的な課題にとどまらず、データ駆動型モデルの正確性と信頼性に深刻な影響を及ぼします。
たとえば、金融業界での不正検出という永遠に成長し続ける問題を考えてみましょう。不正行為は非常に損害が大きいため、機械(さらには人間)は不正な取引の例(まれなものですが)から学び、日常の正当な取引と区別する必要があります。
不正および正当なトランザクションのデータ分布の不均衡は、このような異常な活動を検出することを目的とした機械学習モデルにとって重大な課題を提起します。データの不均衡な取り扱いが適切に行われない場合、これらのモデルはトランザクションを正当なものと予測する方向に偏ったり、不正のまれなインスタンスを見落としたりする可能性があります。
医療もまた、がんやまれな遺伝子疾患などの不均衡な結果を予測するために機械学習モデルが利用される分野です。これらの結果は、その良性な対応事例よりもはるかに頻繁に発生します。したがって、このような不均衡なデータに基づいて訓練されたモデルは、誤った予測や診断を行いやすくなります。このような見落とされた健康アラートは、初めにモデルの目的である早期疾患の検出を挫折させます。
これらはデータの不均衡な分布、つまり一方のクラスが他方を圧倒している場合の深刻な影響を示すわずかな例です。オーバーサンプリングとアンダーサンプリングは、データセットをバランスさせるための2つの標準的なデータ前処理技術です。この記事では、アンダーサンプリングに焦点を当てます。
次に、与えられた分布からアンダーサンプリングするためのいくつかの人気のある手法について説明します。
理解・不均衡のデメリット
不均衡データの重要性をよりよく理解するため、具体例からアンダーサンプリングの影響を説明しましょう。以下の可視化は、線形カーネルを持つサポートベクターマシンによって実行された各クラスの相対的なポイントの数量の影響を示しています。以下のコードとプロットは、Kaggleノートブックから参照されています。
import matplotlib.pyplot as pltfrom sklearn.svm import LinearSVCimport numpy as npfrom collections import Counterfrom sklearn.datasets import make_classificationdef create_dataset( n_samples=1000, weights=(0.01, 0.01, 0.98), n_classes=3, class_sep=0.8, n_clusters=1): return make_classification( n_samples=n_samples, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, n_classes=n_classes, n_clusters_per_class=n_clusters, weights=list(weights), class_sep=class_sep, random_state=0, )def plot_decision_function(X, y, clf, ax): plot_step = 0.02 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid( np.arange(x_min, x_max, plot_step), np.arange(y_min, y_max, plot_step) ) Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) ax.contourf(xx, yy, Z, alpha=0.4) ax.scatter(X[:, 0], X[:, 1], alpha=0.8, c=y, edgecolor="k")fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 12))ax_arr = (ax1, ax2, ax3, ax4)weights_arr = ( (0.01, 0.01, 0.98), (0.01, 0.05, 0.94), (0.2, 0.1, 0.7), (0.33, 0.33, 0.33),)for ax, weights in zip(ax_arr, weights_arr): X, y = create_dataset(n_samples=1000, weights=weights) clf = LinearSVC().fit(X, y) plot_decision_function(X, y, clf, ax) ax.set_title("Linear SVC with y={}".format(Counter(y)))
上記のコードは、一つのクラスが全体の97%を占める非常に不均衡なデータセットから始まり、四つの異なる分布のプロットを生成します。二番目と三番目のプロットでは、それぞれシングルクラスのインスタンスが93%と69%を占めており、最後のプロットでは完全にバランスの取れた分布であり、つまり全てのクラスがインスタンスの3分の1を寄与しています。最も不均衡なプロットから最も均衡なものまでのデータセットのプロットは以下に表示されます。このデータでSVMをフィットさせると、最初のプロット(非常に不均衡)のハイパープレーンはチャートの一方に押しやられます。これは、アルゴリズムが各インスタンスをクラスに関係なく等しく扱い、最大のマージンでクラスを分離しようとするためです。したがって、中央付近に多数の黄色い集団がいると、ハイパープレーンが隅に押しやられ、アルゴリズムが少数派のクラスを誤分類することになります。
データの分布がよりバランスの取れたものに移行するにつれて、アルゴリズムはすべての興味のあるクラスを正しく分類します。
要約すると、データセットが1つまたは数つのクラスに支配されている場合、結果として得られる解決策はしばしば誤分類が増えるモデルとなります。しかし、観測値のクラスごとの分布が均等に近づくにつれて、分類器のバイアスは減少します。
この場合、黄色のポイントをアンダーサンプリングすることは、レアクラスの問題から生じるモデルのエラーに対処するための最も簡単な解決策です。すべてのデータセットがこの問題に直面するわけではないことに注意する価値がありますが、この不均衡を修正することは、データのモデリングにおいて重要な初期段階となります。
Imbalanced-Learnライブラリ
Imbalanced-Learn Pythonライブラリ(imbalanced-learnまたはimblearn)を使用します。pipを使用してインストールすることができます:
pip install -U imbalanced-learn
ハンズオン!
最も人気のあるアンダーサンプリング技術のいくつかについて議論し、実験してみましょう。クラス「0」がクラス「1」よりもはるかに多いバイナリ分類データセットがあるとします。
NearMissアンダーサンプリング
NearMissは、多数派サンプルの数を少数派クラスに近づけるアンダーサンプリング技術です。これにより、空間分離や次元空間を2つのクラス間で分割するアルゴリズムによるクリーンな分類が可能になります。NearMissには3つのバージョンがあります:
NearMiss-1:最も近い3つの少数派クラスサンプルとの平均距離が最小の多数派クラスサンプル。
NearMiss-2:3つの最も遠い少数派クラスサンプルとの平均距離が最小の多数派クラスサンプル。
NearMiss-3:各少数派クラスサンプルとの最小距離を持つ多数派クラスサンプル。
NearMiss-1アンダーサンプリングアルゴリズムをコード例を通じて説明しましょう:
# 必要なライブラリとモジュールをインポートimport numpy as npimport matplotlib.pyplot as pltfrom collections import Counterfrom sklearn.datasets import make_classificationfrom imblearn.under_sampling import NearMiss# 異なるクラスの重みがあるデータセットを生成features、labels = make_classification( n_samples=1000, n_features=2, n_redundant=0, n_clusters_per_class=1, weights=[0.95, 0.05], flip_y=0, random_state=0,)# クラスの分布を表示dist_classes = Counter(labels)print("アンダーサンプリング前:")print(dist_classes)# クラスごとにインスタンスを散布図としてプロットfor class_label, _ in dist_classes.items(): instances = np.where(labels == class_label)[0] plt.scatter(features[instances, 0], features[instances, 1], label=str(class_label))plt.legend()plt.show()# アンダーサンプリングのメソッドを設定undersampler = NearMiss(version=1, n_neighbors=3)# データセットに変換を適用features、labels = undersampler.fit_resample(features, labels)# 新しいクラスの分布を表示dist_classes = Counter(labels)print("アンダーサンプリング後:")print(dist_classes)# クラスごとにインスタンスを散布図としてプロットfor class_label, _ in dist_classes.items(): instances = np.where(labels == class_label)[0] plt.scatter(features[instances, 0], features[instances, 1], label=str(class_label))plt.legend()plt.show()
version=1をversion=2またはversion=3に変更すると、NearMiss()クラスでNearMiss-2またはNearMiss-3アンダーサンプリングアルゴリズムを使用することができます。
NearMiss-2は、2つのクラス間の重複領域の中心にあるインスタンスを選択します。NearMiss-3アルゴリズムでは、少数クラスと多数クラスの重複領域にあるすべてのインスタンスが、多数クラスから最大3つの隣接インスタンスを持つことが観察されます。上記のコードサンプルでの属性n_neighborsがこれを定義しています。
コンデンスド・ニアレスト・ネイバー(CNN)ルール
このメソッドは、多数クラスの部分集合をノイズとして考慮します。次に、1-Nearest Neighborアルゴリズムを使用してインスタンスを分類します。多数クラスのインスタンスが誤分類された場合、それは部分集合に含まれます。インスタンスがもはや部分集合に含まれなくなるまで、プロセスは続行されます。
from imblearn.under_sampling import CondensedNearestNeighbourcnn = CondensedNearestNeighbour(random_state=42)X_res, y_res = cnn.fit_resample(X, y)
トメックリンクのアンダーサンプリング
トメックリンクは、対立クラスインスタンスの近くに位置するペアです。各ペアの多数クラスのインスタンスを削除することで、2つのクラス間のスペースが増え、分類プロセスが容易になります。
from imblearn.under_sampling import TomekLinkstl = TomekLinks()X_res, y_res = tl.fit_resample(X, y)print('Original dataset shape:', Counter(y))print('Resample dataset shape:', Counter(y_res))
これにより、Pythonでのアンダーサンプリング手法の重要な側面にまで深入りし、Near Missアンダーサンプリング、コンデンスド・ニアレスト・ネイバー、およびトメックリンクアンダーサンプリングという3つの代表的な手法をカバーしました。
アンダーサンプリングは、機械学習におけるクラスの不均衡問題に対処するための重要なデータ処理ステップであり、モデルの性能と公平性の向上にも役立ちます。これらの手法はそれぞれ独自の利点を提供し、特定のデータセットと機械学習プロジェクトの目標に合わせてカスタマイズすることができます。
この記事では、アンダーサンプリング手法とそのPythonでの適用について包括的な理解を提供しました。これによって、クラスの不均衡課題に取り組む際に情報を元にした意思決定を行えることを願っています。
[Vidhi Chugh](https://vidhi-chugh.medium.com/)は、スケーラブルな機械学習システムの構築を実現するために、プロダクト、科学、エンジニアリングの交差点で働くAI戦略家およびデジタルトランスフォーメーションリーダーです。彼女は受賞歴のあるイノベーションリーダー、著者、国際的なスピーカーです。彼女は機械学習を民主化し、誰もがこの変革の一部になるためのジャーゴンを壊す使命を担っています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles