機械学習(八):サンプル分布の不均衡問題の処理
これは機械学習の紹介であり,本文は公式の導出に関与せず,主にいくつかのアルゴリズム思想の随筆記録である.適用人群:機械学習初心者、AIの開発者.プログラミング言語:Python
自分でプロジェクトの中でデータを手に入れて、大部分の情況はすべて自分で訓練集、テスト集を切り分けて、訓練集に対して、よく正負のサンプルの割合がとても不均衡な情況に出会うことができて、すなわち偏斜類(Skewed Class)の問題、時にはよくまたとても深刻で、例えばデータ量の上で負のサンプル:正のサンプル>=100、これは比較的に深刻な偏斜類の問題で、以下はこのような問題に対して、検討します:
解決策
サンプル分布のアンバランスの問題を解決する
傾斜問題については、主に3つの方法で解決されます.オーバーサンプリング/オーバーサンプリング(over-sampling):分類中の少数クラスのサンプルの数を増やすことでサンプル等化を実現し、比較的良い方法はSMOTEアルゴリズム、ADASYN(適応総合オーバーサンプリング)である.欠点:この方法はオーバーフィットを引き起こす可能性があります. 欠サンプリング(under-sampling):分類中の多数のクラスサンプルの数を減らすことによってサンプル等化を実現する.欠点:多くのクラスの重要な情報が失われる可能性があります. 重みの調整:分類中の異なるサンプル数のカテゴリに対してそれぞれ異なる重みを与え、一般的には小サンプル量カテゴリの重みが高く、大サンプル量カテゴリの重みが低い.
上記の3つの一般的な方法に加えて、問題の思考角度を変換することもできます.例えば、それらの小クラスのサンプルを異常点(outliers)とすることができ、そのため、この問題は異常点検出(anomaly detection)と変化傾向検出問題(change detection)に変換されます.異常点検出とは、それらの珍しいイベントを識別することである.例えば、銀行のクレジットカード詐欺識別では、数十万のサンプルの中に数百人の詐欺ユーザーがいる可能性があります.これらのイベントは通常の状況に比べて珍しい.変化傾向検出は異常点検出と同様であり、異常な変化傾向を検出することによって識別されるのではない.例えば、ユーザモードまたは銀行取引を観察することによって、ユーザの行動の異常な変化を検出する.
分類でよく見られるカテゴリのアンバランス問題の解決方法
測定指標
スキュークラスの問題では、モデルの良し悪しの測定指標として精度accuracyを使用しなくなりました.データ量の多い分類はaccuracy全体に深刻な影響を及ぼしているため、具体的には各分類のリコール率recall(一般的には正サンプル、すなわち1のrecall値に注目します)を見て、roc曲線のauc値(sklearnではroc_aucで表される)を測定指標として使用することをお勧めします.
上層部のリーダーは精度、すなわち精度、すなわちaccuracyしか知らない可能性があり、recall、aucなどを知らないため、精度はリーダーが注目している問題である.
測定指標の問題については、後で単独で紹介します.
実際の背景
経験した2つのプロジェクトには,いずれも深刻な傾斜類の問題がある.
1つ目の項目は正負サンプルデータ量が十分(総量120 w程度)であり、正サンプル:負サンプル=96:4であり、十分な正サンプルがあるため、これは厄介な問題ではなく、サンプリング不足の方式で解決できる.原データ量の分布96:4に従って25 wのデータを訓練セット(原データ量の分布は線上のシーンにできるだけ合致するようにしたaccuracyがより実態に近づき,データ量25 wが学習曲線から得られ,学習曲線の後続章が単独で紹介される)程度の正サンプルと1を取り,モデルが良好に表現される.
2つ目の項目は、正のサンプルが少なすぎて1000程度しかありませんが、負のサンプルは100万以上あります.この正のサンプルが少なすぎるのは、比較的厄介な問題です.では、上記の3つの方法を採用することができます.まず,訓練セットの正負サンプル区分割合が及ぼす影響について述べる.
トレーニングセットの正負サンプル区分スケールの影響
正のサンプルが少なすぎる偏斜類の問題に対して,異なる量の負のサンプルと全量の正のサンプルを採取するたびに,以下のような効果をもたらした(採用したxgboostアルゴリズムは,同様にsvmを試用したが,データ量が少ない場合でもxgboostの得点が高く,フィッティングを排除しない場合).データ量:負2 w/正1 k recall(1):30%accuracy:98% データ量:負1 w/正1 k recall(1):37%accuracy:96% データ量:負5 k/正1 k recall(1):48%accuracy:93.5% データ量:負1 k/正1 k recall(1):62%accuracy:91% データ量:負500/正1 k recall(1):80%accuracy:89% 以上のように、負のサンプル量が少ないほど全体精度accuracyは少ないが、正のサンプルのrecallは高い.実際、accuracyとrecallの計算式から見ると、accuracyは量が多いことによって決定され、負のサンプル量を絶えず低減し、正のサンプルのrecallは高くなるが、全体のデータ量が少ないほど、全体のモデルに対する信頼性(信頼性)は少なくなり、結局、人々はビッグデータを信じ、モデルもビッグデータからより多くの情報を学ぶことを望んでいる.
したがって,合数の訓練量を見つける必要があり,これは経験と学習曲線から得ることができる.
3つの方法の解決
上記の2番目の項目について、3つの方法で処理し、実際にテストしてみます.
正サンプルのオーバーサンプリング
2つの考え方に分けられる:a.正サンプルのコピーを累加して検証した.この方式は有効であり、複雑な少数サンプルを通じて、少数サンプルのrecallを高め、auc b.SMOTEアルゴリズムまたはADASYN(適応総合サンプリング)を高めた.ここでSMOTEアルゴリズムを例にとると、SMOTEアルゴリズムはsklearnに集積されていない.lmblearnパッケージを単独でダウンロードする必要がある.以下のように使用する.
上記のコードのように、num(正のサンプル):num(負のサンプル)=1:1となるように、正のサンプルに新しい値が生成されます.
負のサンプルをサンプリングしない
この方式では多くの負のサンプルの情報を減らすことができ,この情報を保持するために負のサンプルを1 kまたは500で10部に分割し,各部を全量の正のサンプルと訓練して分類器を得,その後assembleを集積学習する方式で1つの分類器に組み合わせる.
ウェイトの調整(Adjust Weights)
トレーニング中に重みを調整する:a.xgboostについて、xgboostはsklearnに属しないため、scale_を調整する必要がある.pos_Weightパラメータ値、実測結果--改善は大きくなく、自分で重み値を試し続ける必要がある.b.sklearnの分類方法、例えばsvmに対してclass_を調節するWeightパラメータ
実測-class_Weightは「balanced」に設定されており、効果の改善は明らかではありません
実測-class_Weightは重みを指定し、「balanced」に設定するよりも効果的ですが、具体的な重みの値はなぜ数値を設定するのか、テストが必要です.グリッド検索と組み合わせて最適な重みを探すことができます.
XGBoost、LightGBMの詳細比較紹介
まとめ
正のサンプル量が十分で、負のサンプルが不足している偏斜類の問題は、十分な正のサンプルがあるため、欠サンプリング方式で解決することができる.
正サンプル量が極端に不足し、負サンプルが多すぎるスキュー類の問題は、正サンプルが非常に不足しているため、上記の3つの方法で解決することができ、重みを調整する方法を採用すれば、重みの値は絶えず試みる必要があり、オーバーサンプリング方式を採用すれば、単純に少数サンプルデータをコピーすることもできるし、SMOTEアルゴリズムで少数サンプルを生成することもできるので、みんな試してみることができます.
自分でプロジェクトの中でデータを手に入れて、大部分の情況はすべて自分で訓練集、テスト集を切り分けて、訓練集に対して、よく正負のサンプルの割合がとても不均衡な情況に出会うことができて、すなわち偏斜類(Skewed Class)の問題、時にはよくまたとても深刻で、例えばデータ量の上で負のサンプル:正のサンプル>=100、これは比較的に深刻な偏斜類の問題で、以下はこのような問題に対して、検討します:
解決策
サンプル分布のアンバランスの問題を解決する
傾斜問題については、主に3つの方法で解決されます.
上記の3つの一般的な方法に加えて、問題の思考角度を変換することもできます.例えば、それらの小クラスのサンプルを異常点(outliers)とすることができ、そのため、この問題は異常点検出(anomaly detection)と変化傾向検出問題(change detection)に変換されます.異常点検出とは、それらの珍しいイベントを識別することである.例えば、銀行のクレジットカード詐欺識別では、数十万のサンプルの中に数百人の詐欺ユーザーがいる可能性があります.これらのイベントは通常の状況に比べて珍しい.変化傾向検出は異常点検出と同様であり、異常な変化傾向を検出することによって識別されるのではない.例えば、ユーザモードまたは銀行取引を観察することによって、ユーザの行動の異常な変化を検出する.
分類でよく見られるカテゴリのアンバランス問題の解決方法
測定指標
スキュークラスの問題では、モデルの良し悪しの測定指標として精度accuracyを使用しなくなりました.データ量の多い分類はaccuracy全体に深刻な影響を及ぼしているため、具体的には各分類のリコール率recall(一般的には正サンプル、すなわち1のrecall値に注目します)を見て、roc曲線のauc値(sklearnではroc_aucで表される)を測定指標として使用することをお勧めします.
上層部のリーダーは精度、すなわち精度、すなわちaccuracyしか知らない可能性があり、recall、aucなどを知らないため、精度はリーダーが注目している問題である.
測定指標の問題については、後で単独で紹介します.
実際の背景
経験した2つのプロジェクトには,いずれも深刻な傾斜類の問題がある.
1つ目の項目は正負サンプルデータ量が十分(総量120 w程度)であり、正サンプル:負サンプル=96:4であり、十分な正サンプルがあるため、これは厄介な問題ではなく、サンプリング不足の方式で解決できる.原データ量の分布96:4に従って25 wのデータを訓練セット(原データ量の分布は線上のシーンにできるだけ合致するようにしたaccuracyがより実態に近づき,データ量25 wが学習曲線から得られ,学習曲線の後続章が単独で紹介される)程度の正サンプルと1を取り,モデルが良好に表現される.
2つ目の項目は、正のサンプルが少なすぎて1000程度しかありませんが、負のサンプルは100万以上あります.この正のサンプルが少なすぎるのは、比較的厄介な問題です.では、上記の3つの方法を採用することができます.まず,訓練セットの正負サンプル区分割合が及ぼす影響について述べる.
トレーニングセットの正負サンプル区分スケールの影響
正のサンプルが少なすぎる偏斜類の問題に対して,異なる量の負のサンプルと全量の正のサンプルを採取するたびに,以下のような効果をもたらした(採用したxgboostアルゴリズムは,同様にsvmを試用したが,データ量が少ない場合でもxgboostの得点が高く,フィッティングを排除しない場合).
したがって,合数の訓練量を見つける必要があり,これは経験と学習曲線から得ることができる.
3つの方法の解決
上記の2番目の項目について、3つの方法で処理し、実際にテストしてみます.
正サンプルのオーバーサンプリング
2つの考え方に分けられる:a.正サンプルのコピーを累加して検証した.この方式は有効であり、複雑な少数サンプルを通じて、少数サンプルのrecallを高め、auc b.SMOTEアルゴリズムまたはADASYN(適応総合サンプリング)を高めた.ここでSMOTEアルゴリズムを例にとると、SMOTEアルゴリズムはsklearnに集積されていない.lmblearnパッケージを単独でダウンロードする必要がある.以下のように使用する.
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=42) # ,
X_res,y_res = sm.fit_sample(X_train,y_train)
上記のコードのように、num(正のサンプル):num(負のサンプル)=1:1となるように、正のサンプルに新しい値が生成されます.
負のサンプルをサンプリングしない
この方式では多くの負のサンプルの情報を減らすことができ,この情報を保持するために負のサンプルを1 kまたは500で10部に分割し,各部を全量の正のサンプルと訓練して分類器を得,その後assembleを集積学習する方式で1つの分類器に組み合わせる.
ウェイトの調整(Adjust Weights)
トレーニング中に重みを調整する:a.xgboostについて、xgboostはsklearnに属しないため、scale_を調整する必要がある.pos_Weightパラメータ値、実測結果--改善は大きくなく、自分で重み値を試し続ける必要がある.b.sklearnの分類方法、例えばsvmに対してclass_を調節するWeightパラメータ
from sklearn.svm import SVC
model_svm=SVC(class_weight='balanced') #
model_svm.fit(x,y)
実測-class_Weightは「balanced」に設定されており、効果の改善は明らかではありません
from sklearn.svm import SVC
model_svm=SVC(class_weight={0:1,1:10}) #
model_svm.fit(x,y)
実測-class_Weightは重みを指定し、「balanced」に設定するよりも効果的ですが、具体的な重みの値はなぜ数値を設定するのか、テストが必要です.グリッド検索と組み合わせて最適な重みを探すことができます.
XGBoost、LightGBMの詳細比較紹介
まとめ
正のサンプル量が十分で、負のサンプルが不足している偏斜類の問題は、十分な正のサンプルがあるため、欠サンプリング方式で解決することができる.
正サンプル量が極端に不足し、負サンプルが多すぎるスキュー類の問題は、正サンプルが非常に不足しているため、上記の3つの方法で解決することができ、重みを調整する方法を採用すれば、重みの値は絶えず試みる必要があり、オーバーサンプリング方式を採用すれば、単純に少数サンプルデータをコピーすることもできるし、SMOTEアルゴリズムで少数サンプルを生成することもできるので、みんな試してみることができます.