データ解析

不均衡データの扱い方と評価指標!SmoteをPythonで実装して検証していく!

smote
ウマたん
ウマたん
本記事では、実データによくありがちな不均衡データの特徴とどのように分析していったら良いかについてまとめました!最終的にSMOTEというオーバーサンプリング手法を使ってPythonで解析していきます!

こんにちは!

消費財メーカーでデジタルマーケター・データサイエンスティストをやっているウマたん(@statistics1012)です!

実データを扱っていると度々現れるのが不均衡データ!

不均衡データとはデータの比率に偏りがあるもの。

金融取引の不正利用データやメールのCVデータなど、母数が大量にありその中で該当する正例が非常に少ないケースはよくあります。

そんな不均衡データを通常通り分析してしまうと少々不都合があるんです。

ロボたん
ロボたん
確かに、なんとなく直感的にまともなモデリングが出来なさそうだよねー!
ウマたん
ウマたん
うんうん、不均衡データをそのまま分析してしまうと、一見良さそうな結果が出てくるんだけどモデリングの意味がなかったりするんだ!

この記事では、そんな不均衡データの扱い方について徹底的に見ていきますよー!

不均衡データはどんな問題があるのか

不均衡データとは「データ構造に偏りがあるデータ群」のことを指します。

例えばクレジットカードの不正利用を判別したいとしましょう。

その場合、ほとんどのデータは正常と一部のデータが異常という不均衡データになります。

仮に正常データと異常データの比率が999:1だとしましょう。

このデータを使ってそのまま分類モデルを構築するとどのような問題が生じるのでしょうか?

ロボたん
ロボたん
うーん、異常が少なすぎて判定できない??
ウマたん
ウマたん
発想は近いよ!異常を判別できない分類モデルの方が一見すると精度が良くなってしまうんだ!

どういうことか説明していきます。

仮にこのデータに対して、全てのデータを正常と判定する分類モデルを作ったとしましょう。

すると、データの予実は以下のようなマトリックスで表されますね。

予測されたクラス
異常正常
実際のクラス異常01
正常0999

本来正常のデータは全て正常と予測され、本来は異常のデータは正常と予測されてしまっています。

この場合、予実の精度は999/1000=99.9%となるのです。

ロボたん
ロボたん
たしかに!!異常を全く判別できていないので全体で見ると精度が高く見える!
ウマたん
ウマたん
こんな適当なモデルがここまでの精度を出力してしまうのは恐ろしいね。

これだけ見るといかにも精度が高そうに見えますが、その裏には不均衡データという罠が潜んでいるのです。

これは極端な例ですが、多くの実データは少なからず不均衡の要素を持っているので分類モデルを作る際には細心の注意が必要になってくるのです。

不均衡データの扱い方と対処法

PC

それでは、そんな不均衡データを解消するためのテクニックをいくつか見ていきましょう!

不均衡データの解消には大きく分けて4つの方法があります。

・アンダーサンプリング
・オーバーサンプリング
・重み付け
・異常検知問題として扱う

それぞれについて詳しく見ていきましょう!

アンダーサンプリング

最も定番なのがアンダーサンプリング。

シンプルに「少数派のデータ群に合わせて多数派のデータ群を削除する」という方法です。

直感的に分かりやすく、スタンダードな方法になります。

削除する方法はいくつかありますが、以下のような方式が考えられます。

A群とB群を識別する上で重要なのは、A群とB群の境界線付近に分布するデータ。

そのため、境界線付近以外に分布するあまり意味のないデータは削除してA群とB群のデータバランスを取る。

もしくは、全体のデータのバランスを崩さないために多数派群をクラスター分類し各群から均等にランダムサンプリングするという方法。

いくつかの方法がありますが、最もカンタンで分かりやすい方法です。

オーバーサンプリング

続いてオーバーサンプリング。

オーバーサンプリングはアンダーサンプリングとは違い、逆に「少数派のデータを多数派に合わせて増やす」という方法です。

オーバーサンプリングの中で特によく使われる手法がSMOTEと呼ばれるものです。

SMOTEは、Synthetic Minority Over-sampling TEchniqueの略でK近傍法のアルゴリズムを利用して少数派のサンプルを増やしていきます。

K近傍法は以下の記事で詳しくまとめているので参考にしてみて欲しいのですが、

k近傍法とは?理論とRでの実装方法!当サイト【統計ラボ】の本記事では、アルゴリズムがシンプルで分かりやすいk近傍法について理解を深めていきます。最終的にはRでの実装を行うことで理論と実装の両輪を理解していきましょう!...

あるサンプルに対して近傍のK個のデータから判別を行うというシンプルなロジック。

K近傍法 K近傍法

この場合K=3であれば未知データは青〇だと分類され、K=5であれば緑△だと判別されます。

K近傍法の場合は、未知データに対しての判別に使いますがSMOTEではこれをオーバーサンプリングに利用します。

smote

ある少数派のサンプル(ピンク)を選び、k=3であれば「近傍3つのデータからランダムで1つ選び新たなサンプルを内挿する」というロジック。

それを少数派のサンプル全てに適応するというシンプルなアルゴリズムです。

kというパラメータを大きく設定すれば、多数派のデータも近傍に含まれる可能性が高くなります。kが小さめの方が保守的なオーバーサンプリングになります。

smote

この場合k=5で多数派データが2つ近傍に入ってくるので、少数派のオーバーサンプリングは多数派に近いところに置かれる可能性が高くなります。

内挿の仕方は通常のSMOTEではランダムですが、SMOTEの拡張モデルで様々なロジックが開発されています。

重み付け

少数派のサンプルに対して重みを付けて重要視するという方法もあります。

例えば、よく分類問題に使われる勾配ブースティング手法の1つであるXgboostではそれぞれのサンプルごとに重みを付けることができます。

Xgboostは決定木アンサンブル学習させたものですので、基本的には決定木モデルになります。

決定木モデルではある特徴量において分類した場合の損失関数を基に分類を行いますが、少数派カテゴリはなかなか出てこないので分類できなくても損失にあまり影響を及ぼしません。

そこで少数派の重みを高めて少数派カテゴリも上手く分類できるようにしようというのが、不均衡データに対する重み付けアプローチになります。

異常検知問題として扱う

あまりにもデータに偏りがある場合は、そもそも問題の定義を分類問題ではなく異常検知問題として扱ってしまうという方法もあります。

クレジットカードの不正利用データについては、異常検知問題としてもよさそうですね。

異常検知問題では、正常データを基に正常空間を作り、定めた閾値を超えるデータに関しては異常値とみなします。

品質工学の分野でよく用いられ(不良品の検出など)、以下のような手法があります。

MT法管理図には様々な派生手法がありますので、ぜひチェックしてみてください。

異常検知問題に関して勉強したい方は以下の記事でおすすめ書籍をまとめているのでチェックしてみてください!

厳選3冊!異常検知を勉強する上でおすすめな本!当サイト【統計ラボ】の本記事では、異常検知のおすすめ本についてまとめていきます。異常検知が学べる書籍はそれほど多くないのですが、ここで紹介している書籍さえ読めばおおかた問題ないです。機械学習手法で分類できないデータも異常検知問題としてとらえれば解決できることがあるんです。...

不均衡データへ対応した評価指標

さて、不均衡データへどのように対応したらよいのかについて見てきましたが不均衡データを正しく分類できたかどうかはどのように評価したらよいのでしょうか?

ここでは、不均衡データを正しく評価する指標について見ていきたいと思います。

正解率(Accuracy)

さきほどのクレジットカードの不正利用の例をそれぞれマトリックスに当てて見てみましょう!

予測されたクラス
異常正常
実際のクラス異常ab
正常cd

まず最も分かりやすいのが正解率(Accuracy)!

これは、

$$ Accuracy=\frac{a+d}{a+b+c+d} $$

で表します。

シンプルに全てのサンプルの中で実測値と予測値が一致した割合ですね。

ただ、Accuracyだけを評価の指標にしてしまうと先ほどの

予測されたクラス
異常正常
実際のクラス異常01
正常0999

このような例でも99.9%となり良いモデルだねという判断をしてしまいます。

適合率(precision)

それを避けるためには他の指標も見てみる必要があります。

適合率(precision)は以下のように求めます。

$$ Precision=\frac{a}{a+c} $$

異常と予測されたクラスのうち実際に異常だったクラスの割合が適合率になります。

先ほどの例だと適合率は0%になっていまいますね・・

再現率(recall)

続いて、再現率(recall)!

再現率は以下のように求めます。

$$ recall=\frac{a}{a+b} $$

実際に異常だったクラスのうち、どのくらい異常と予測されたかです。

これも0%になってしまいます。

これは少々極端な例ですが、正解率は99.9%なのに適合率と再現率は0%といういびつな結果になってしまいました。

F-measure

そしてそれら適合率と再現率を組み合わせて作られた指標がF-measureというものです。

F-measureは適合率と再現率の調和平均を取ります。

$$ F-measure=\frac{2}{\frac{1}{適合率}+\frac{1}{再現率}} $$

F-measureは不均衡データを分類する上での指標としてよく使われるので覚えておきましょう!

不均衡データを実際にPythonで分析(SMOTE)

それでは、そんな不均衡データを実際にPythonで分析していきます。

今回取り扱うのは、何度も登場しているクレジットカードの不正使用データ。

データ解析コンペKaggleで公開されているデータを使っていきます。

以下のURLからダウンロードしましょう!

まずは、クレジットカードデータを読み込んでいきます。

ここでクレジットカードの構造を確認しておきましょう!

31項目があり、284807のサンプルがあるようです。さらに不正利用のクラスはそのうち492とあきらかな不均衡データになっています。

そんな不均衡データをまずは、そのまま分析してみましょう!

データを説明変数と目的変数に分け、さらにテストデータと学習データに分けます。

そして、今回は単純にロジスティック回帰を使って分類をしていきます。

最後に混合マトリクスと正解率、適合率、再現率、F-measureを指標として算出しています。

正解率は99.9%と非常に高いですが、再現率は62%になっていて実際に不正をした人のうち62%しか見抜けていないということになります。

不正を見抜くモデルとしてこれは果たして妥当なのでしょうか?

ロボたん
ロボたん
うーんそもそも不正利用データを見抜くためのモデルだからなー・・・
ウマたん
ウマたん
そうなんだよねー、今回の課題設定ではできるだけ不正利用を検出することが大事だよね!

それでは、ここでSMOTEを使ってオーバーサンプリングしていきましょう!

imblearnというライブラリをインストールします。

そしてSMOTEをインポートして・・・こんなにカンタンに使えちゃうんです。

さて、実際に少数派データを増やすことができたか確認してみましょう!

少数派データが多数派データを同じサンプル数になっているのが分かります。

それでは、ここから同様にロジスティック回帰をおこなっていきましょう!

結果は・・・

再現率は62%から84%になりました。

これで不正利用データの84%を見抜くことができます。

ただ、それに伴って適合率が大きく下がり8%になってしまっています。

すなわち不正だと判定した人のうち92%は正常であるということですね。

この適合率と再現率は、統計の第1種の過誤・第2種の過誤と同じ考え方でありモデル構築者に毎回付きまとう問題です。

今回のケースは不正利用データがあまりにも少なく2値分類であるため異常値問題として分析してもよかったかもしれません。

不均衡データの扱い方 まとめ

不均衡データについて様々な観点からみてきました。

不均衡データは実データで非常に多く存在するクセのあるデータセットです。

分析する前にデータセットの傾向を確認し不均衡ではないか必ず確認するようにしましょう!

ロボたん
ロボたん
なるほどー、実データを扱うのってなかなか難しいんだねー・・・
ウマたん
ウマたん
分析手法に注目しがちだけど、分析前の前処理が意外と大事なんだよねー!

最後に不均衡データの解決方法と評価指標についてまとめておきます。

不均衡データの対処方法はデータサイエンスにおける1つの方法論。

データサイエンティストへのロードマップを以下の記事でまとめているのでぜひチェックしてみてください!

データサイエンティスト
【入門者向け】データサイエンティストに必要なスキルと独学勉強ロードマップ!当サイト【統計ラボ】の本記事では、データサイエンティストに求められるスキルとそれを身に付けるための勉強法について徹底的にまとめていきます!入門者でも、しっかりデータサイエンティストについて理解しある程度独学で駆け出しの状態までいけることを目指します。...
Pythonを初学者が最短で習得する勉強法

Pythonを使うと様々なことができます。しかしどんなことをやりたいかという明確な目的がないと勉強は捗りません。

Pythonを習得するためのロードマップをまとめましたのでぜひチェックしてみてくださいね!