コンペチュートリアル 前処理 機械学習

不均衡データの取り扱い | PortoSeguro コンペ

投稿日:

概要説明

本記事は、機械学習を始めて基本的な操作を覚え、次に精度を上げるために何をすればよいのか?という悩みを持つ方たちのために、機械学習のコンペサイトkaggleの練習問題をベースに事例を紹介していきたいと思います。
今回は特に、不均衡データの取り扱いを中心にしたノートとなっています。

本記事では、Rafael Alencarさんのノートブックを参考にしています。

コンペの説明

ブラジル最大の自動車および住宅所有者保険会社の1つであるPorto Seguroの事例です。
このコンペでは、保険加入者が翌年に自動車保険の請求を行う確率を予測するモデルの構築に挑戦します。

インデックス

  • 不均衡データセット
  • メトリックの罠
  • Confusion matrix
  • Resampling
  • Random under-sampling
  • Random over-sampling*
  • Python imbalanced-learn module
  • Random under-sampling and over-sampling with imbalanced-learn
  • Under-sampling: Tomek links
  • Under-sampling: Cluster Centroids
  • Over-sampling: SMOTE
  • Over-sampling followed by under-sampling
  • 参考資料

不均衡データセット

このノートではリサンプリングの手法を中心とした不均衡データ処理のテクニックを扱います。
このコンペでは、portoSeguroの全保険加入者から保険請求者を予測するモデルを作ります。このとき、保険請求者がごく稀であるため不均衡データとなります。

不均衡データの他の典型的な例は、金融詐欺の検出とコンピューターネットワークへの攻撃などがあります。

Class 0: 573518 Class 1: 21694 Proportion: 26.44 : 1

正例と負例の比率は26:1と偏りが確認できました。

メトリックの罠

不均衡データを扱う際、初心者が陥る主な問題の一つは、モデル評価に使用するメトリックに関連しています。
例えば、今回のように負例4%、正例96%といった不均衡データの場合、
単純に分類モデルを生成すると、
少数派(今回の場合負例)の分類精度が著しく低いモデルとなってしまいます。

参考)https://qiita.com/ryouta0506/items/619d9ac0d80f8c0aed92

Accuracy: 96.36%

XGBを使って分類すると、Accuracy: 96.36%と高い精度で分類ができているように見えます。

次に、特徴量を1つだけに絞って、同様にXGBをつかって分類してみます。

Accuracy: 96.36%

特徴量を一つにしたにも関わらず、ほど同じ精度で予測ができてしまっています。

どのような現象が起きているのかはコンフュージョンマトリクスを見るとよく理解できます。

Confusion matrix:

[[114709 0]

[ 4334 0]]

コンフュージョンマトリクスから、全てのデータを負例(class:0)と予測しており、負例の分類ができていないことがわかります。

このコンペでは、評価指標は正規化されたGini係数であり、不均衡データセットに対して、堅牢的な指標であり、Gini係数で評価すると全くうまく分類できていないことになってしまいます。

参考)https://bellcurve.jp/statistics/course/3798.html

Resampling

不均衡データの処理技術としてリサンプリングという手法が広く活用されています。
これは多数クラスのデータをサンプリングによりデータを削減する(アンダーサンプリング)と
少数クラスからサンプリングを追加する(オーバーサンプリング)の2種があります。

これらの手法は不均衡データを解消できる一方で、問題もあります。 オーバーサンプリングの問題は、少数派データからランダムサンプリングすることにより、過学習を起こす可能性が高くなります。 アンダーサンプリングの問題は、多数派クラスからランダムデータを削除することにより、重要な情報が失われる可能性があります。

DataFrame.sampleメソッドを使用してアンダーサンプリングとオーバーサンプリングを実装します。

Random under-sampling

Random under-sampling:

1 21694

0 21694

Name: target, dtype: int64

アンダーサンプリングによりバランスされました。

Random over-sampling

Random over-sampling:

1 573518

0 573518

Name: target, dtype: int64

オーバーサンプリングによりバランスされました。

科学文献では、より洗練されたリサンプリング技術が数多く提案されています。
例えば、多数派クラスのレコードをクラスター化し、各クラスターからレコードを削減することで
アンダーサンプリングを行い、情報削減の偏りをなくすことができます。

オーバーサンプリングでは、少数派レコードをコピーするのではなく、小さなバリエーションを乗せルコとでより多様的な合成サンプリングを作成できます。

これらの手法は、
Pythonライブラリーimbalanced-learnを使用して実装が可能です。

テスト用にmake_classificationメソッドを使用して、不均衡サンプルデータセットを作成します。

データの分布を確認用に2次元プロット関数plot_2d_spaceを作ります。

主成分分析(PCA)を使って次元を2次元に圧縮し、plot_2d_spaceで可視化します。

Random under-sampling and over-sampling with imbalanced-learn

Removed indexes: [88 5 12 93 62 57 50 47 33 23 4 8 9 14 16 40 67 70 71 74]

80 new random picked points

Under-sampling: Tomek links


分布の近い反対クラスのペアをTomek linkと呼び、 各ペアの多数派クラスのインスタンスを削除すると、 2つのクラス間のスペースが明確になり、分類が容易になります。

以下のコードでは、ratio = ‘majority’を使用して多数派クラスをリサンプリングします。

Removed indexes: [ 0 1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 91 92 93 94 95 97 98 99]

Under-sampling: Cluster Centroids

この手法は、クラスタリング手法に基づいて重心を生成し、重心をデータとすることで、アンダーサンプリングとします。
この例では、多数派クラス(0)とすべての少数派クラス(1)からの10個の要素を保持するために、
パラメーター比に{0:10} dictを渡します。

Over-sampling: SMOTE

SMOTE(Synthetic Minority Oversampling TEchnique)は、
少数派の要素を合成することでサンプリング数を増加させます。

手順は、少数派からポイントをランダムに選択し、そのポイントのk最近傍を計算します。
選択したポイントとその隣接ポイントの間に合成ポイントを追加することでサンプル数を増加させます。

ratio = ‘minority’を使用して、少数派をリサンプリングします。

Over-sampling followed by under-sampling

次に、SMOTEおよびTomekリンクの手法を使用して、オーバーサンプリングとアンダーサンプリングの組み合わせを行います。

参考資料

The imbalanced-learn GitHub:
https://github.com/scikit-learn-contrib/imbalanced-learn

-コンペチュートリアル, 前処理, 機械学習

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

機械学習スタッキング例

汎化性能を上げるためkaggleでよく利用されている、スタッキングの実行例をメモしておきます。 スタッキングとは、単一の学習器をそのまま使うのではなく、複数の学習きを組み合わせることで、過学習を防ぎ予 …

no image

kaggle:House Price チュートリアル(EDA探索的データ解析)

Contents1 概要説明1.1 データ探索の流れ2 ライブラリインポート3 データの読み込み4 データ項目からの考察5 SalePriceの分析5.1 ヒストグラムで分布の可視化5.2 数値変数と …

no image

kaggle:メルカリ チュートリアル(EDA探索的データ解析)

Contents1 概要説明1.1 データ探索の流れ2 ライブラリインポート3 データ読み込み4 目的変数5 送料6 アイテムカテゴリ¶7 ブランド8 アイテム説明8.1 前処理 tokenizati …

no image

python/sklearn/単回帰(LinearRegression)

2次元のデータに対して単回帰分析を行う。 Contents0.1 データ取得0.2 メソッド0.3 可視化0.4 学習データとテストデータに分割0.5 単回帰分析0.6 結果のプロット1 決定係数の算 …

no image

クラスタリングの実践(好きなアイスクリームアンケート)

Contents1 概要2 データの読み込み3 データの確認4 主成分分析5 クラスタリング 概要 ・目的:このデータを使ってアイスクリームの好みの違いをクラスタリングで分類し、好みのパターンを理解す …