ゼファーネットのロゴ

データのバランスを取り直さずに、不均衡な分類に対処する方法

日付:

データのバランスを取り直さずに、不均衡な分類に対処する方法

偏ったデータのオーバーサンプリングを検討する前に、Pythonで分類決定のしきい値を調整してみてください。


By デビッドBローゼン(PhD)、IBM GlobalFinancingの自動クレジット承認のリードデータサイエンティスト



による写真 エレナ・モズビロ on Unsplash

 

機械学習では、あるクラスのインスタンスが別のクラスよりもはるかに多いデータを使用して分類モデルを構築する場合、ほとんどすべてのケースを多数派クラスとして分類するため、初期のデフォルト分類子では不十分なことがよくあります。 多くの記事は、オーバーサンプリングをどのように使用できるかを示しています(例: スモート)または、「リバランスされた」データでモデルを再トレーニングするために、アンダーサンプリングまたは単にクラスベースのサンプル重み付けを行うこともありますが、これは必ずしも必要ではありません。 ここでは、代わりにあなたがどれだけできるかを示すことを目指しています 無し データのバランスを取るか、モデルを再トレーニングします。

これを行うには、モデルのクラス1の予測確率が1クラス分類でそれを上回っている場合に、「クラス0.5」と言うしきい値を調整するだけで、予測されるクラスを選択するデフォルトの分類ルールを単純に使用するのではありません。最も可能性が高い(確率しきい値XNUMX)。 これにより、データのリバランスによって生じる問題を回避しながら、誤検知と誤検知の分類の間で必要なトレードオフを行う柔軟性がどのように得られるかを見ていきます。

我々は、使用します クレジットカード詐欺識別データセット 説明するためにKaggleから。 データセットの各行はクレジットカードトランザクションを表し、ターゲット変数Class == 0は 正当な トランザクションおよびClass == 1は、トランザクションが 詐欺。 284,807件のトランザクションがあり、そのうち492件(0.173%)のみが詐欺であり、実際には非常に不均衡です。

を使用します 勾配ブースティング これらはしばしば良い結果をもたらすため、分類器。 具体的には、Scikit-Learnの新しいHistGradientBoostingClassifierは、データセットがこのように比較的大きい場合、元のGradientBoostingClassifierよりもはるかに高速であるためです。

まず、いくつかのライブラリをインポートして、データセットを読み込みます。

import numpy as np
import pandas as pd
from sklearn import model_selection, metrics
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier
df=pd.read_csv('creditcard.csv')
df.info()



V1からV28(主成分分析から)およびトランザクション金額は機能であり、すべて数値であり、欠落データはありません。 ツリーベースの分類子のみを使用しているため、機能を標準化または正規化する必要はありません。

データをトレーニングセットとテストセットに分割した後、モデルをトレーニングします。 これは私のラップトップで約XNUMX分かかりました。 過剰適合のために検証サブセットのパフォーマンスが低下し始めた場合は、n_iter_no_changeを使用してトレーニングを早期に停止します。 個別に少しハイパーパラメータ調整を行ってlearning_rateとmax_leaf_nodesを選択しましたが、これは現在の記事の焦点では​​ありません。

Xtrain, Xtest, ytrain, ytest = model_selection.train_test_split( df.loc[:,'V1':'Amount'], df.Class, stratify=df.Class, test_size=0.3, random_state=42)
gbc=HistGradientBoostingClassifier(learning_rate=0.01, max_iter=2000, max_leaf_nodes=6, validation_fraction=0.2, n_iter_no_change=15, random_state=42).fit(Xtrain,ytrain)

ここで、このモデルをデフォルトとしてテストデータに適用します ハード分類子、トランザクションごとに0または1を予測します。 モデルの連続性に決定しきい値0.5を暗黙的に適用しています 確率予測 として ソフト分類子。 確率予測が0.5を超える場合は「1」と言い、0.5未満の場合は「0」と言います。

また、 混同行列 結果として、クラス1(詐欺)を 「ポジティブ」 クラス、それはよりまれなクラスであるため、慣例により。 混同行列は、真のネガティブ、偽のポジティブ、偽のネガティブ、および真のポジティブの数を示します。 NS 正規化された混同行列 レート(例:FNR = False Negative Rate)は、括弧内のパーセンテージとして含まれています。

hardpredtst=gbc.predict(Xtest)
def conf_matrix(y,pred): ((tn, fp), (fn, tp)) = metrics.confusion_matrix(y, pred) ((tnr,fpr),(fnr,tpr))= metrics.confusion_matrix(y, pred, normalize='true') return pd.DataFrame([[f'TN = {tn} (TNR = {tnr:1.2%})', f'FP = {fp} (FPR = {fpr:1.2%})'], [f'FN = {fn} (FNR = {fnr:1.2%})', f'TP = {tp} (TPR = {tpr:1.2%})']], index=['True 0(Legit)', 'True 1(Fraud)'], columns=['Pred 0(Approve as Legit)', 'Pred 1(Deny as Fraud)'])
conf_matrix(ytest,hardpredtst)



クラス1のリコール(上記のTPRとして示されている感度または真陽性率)は71.62%にすぎないことがわかります。これは、真の不正の71.62%が不正として正しく識別され、拒否されたことを意味します。 したがって、実際の詐欺の28.38%は、残念ながら合法であるかのように承認されています。

特に不均衡なデータの場合(または一般に、誤検知と誤検知が異なる結果をもたらす可能性がある場合)、上記の「.predict()」を使用して行ったように、デフォルトの暗黙的な分類決定しきい値0.5の使用に制限しないことが重要です。 クラス1のリコール(TPR)を改善して、不正損失を減らします(誤検知を減らします)。 これを行うには、しきい値を超える確率を予測するときに「クラス1」と言うしきい値を下げることができます。 このように、より広い範囲の予測確率に対して「クラス1」と言います。 そのような戦略はとして知られています しきい値移動.

モデルの確率に適用するしきい値を調整すると、トレードオフとして誤検知(不正として拒否された真の正当なトランザクション)の数が必然的に増加するため、最終的には、これらの誤検知をどの程度削減するかはビジネス上の決定です。予測(「.predict()」ではなく「.predict_proba()」から取得)。

このトレードオフを解明し、しきい値の選択を支援するために、しきい値に対して偽陽性率と偽陰性率をプロットします。 これはの変種です 受信者動作特性 (ROC)曲線ですが、しきい値を強調しています。

predtst=gbc.predict_proba(Xtest)[:,1]
fpr, tpr, thresholds = metrics.roc_curve(ytest, predtst)
dfplot=pd.DataFrame({'Threshold':thresholds, 'False Positive Rate':fpr, 'False Negative Rate': 1.-tpr})
ax=dfplot.plot(x='Threshold', y=['False Positive Rate', 'False Negative Rate'], figsize=(10,6))
ax.plot([0.00035,0.00035],[0,0.1]) #mark example thresh.
ax.set_xbound(0,0.0008); ax.set_ybound(0,0.3) #zoom in



最適なしきい値を選択するための経験則または提案されたメトリックがいくつかありますが、最終的には、誤検知と誤検知のビジネスのコストにのみ依存します。 たとえば、上のプロットを見ると、次のように0.00035のしきい値を適用することを選択できます(垂直の緑色の線が追加されています)。

hardpredtst_tuned_thresh = np.where(predtst >= 0.00035, 1, 0)
conf_matrix(ytest, hardpredtst_tuned_thresh)



偽陰性率を28.38%から9.46%に下げました(つまり、真の不正の90.54%を新しい再現率または感度、または真陽性率またはTPRとして識別および拒否しました)。一方、偽陽性率(FPR)は0.01%から5.75%(つまり、正当な取引の94.25%がまだ承認されています)。 不正取引の6%未満のみを承認するために支払う価格として、正当な取引の約10%を拒否することは、非常にコストのかかる不正の28%から、トレードオフの価値があるかもしれません。暗黙的な分類決定しきい値が0.5のデフォルトのハード分類子を使用していました。

不均衡なデータのバランスをとらない理由

 
 
不均衡なトレーニングデータの「バランス」を回避する理由のXNUMXつは、そのような方法が、結果として得られるトレーニング済みモデルの確率予測にバイアスをかけたり歪めたりして、次のようになることです。 誤校正、元のマイノリティクラスのモデルの予測確率を体系的に増加させることにより、単に相対的なものになります。 序数判別スコア or 意思決定機能 or 信頼スコア 元の(「不均衡な」)トレインとテストセット、および分類器が予測を行う可能性のある将来のデータで、潜在的に正確な予測クラス確率ではありません。 トレーニングのためのそのようなリバランスが発生した場合 is 本当に必要ですが、数値的に正確な確率予測が依然として望まれているので、 再較正する 元の/不均衡なクラス比率を持つデータセットに対する予測確率。 または、平衡モデルから予測された確率に修正を適用することもできます。を参照してください。 バランスはアンバランスです & この返信 その作者による。

オーバーサンプリングによるデータのバランス調整に関する別の問題(この問題がないクラス依存のインスタンス均等化とは対照的に)は、ナイーブクロス検証にバイアスをかけ、クロス検証で検出されない過剰適合につながる可能性があることです。 相互検証では、データが「フォールド」サブセットに分割されるたびに、別のフォールドのインスタンスと重複するか、別のフォールドのインスタンスから生成されたインスタンスがXNUMXつのフォールドに存在する場合があります。 したがって、交差検定が想定しているように、折り畳みは完全に独立しているわけではありません。データの「ブリード」または「リーク」があります。 たとえば、を参照してください 不均衡なデータセットの相互検証 これは、この状況に対して相互検証を正しく再実装する方法を説明しています。 ただし、scikit-learnでは、少なくともインスタンスの複製によるオーバーサンプリングの場合(必ずしもSMOTEである必要はありません)、これは代わりに次を使用して回避できます。 model_selection.GroupKFold 特定のインスタンスのすべての重複に対して同じ値を持つ、選択されたグループ識別子に従ってインスタンスをグループ化する相互検証の場合-を参照してください。 私の返事 前述の記事への応答に。

まとめ

 
 
ナイーブまたは暗黙的にデフォルトのしきい値0.5を適用したり、再調整されたトレーニングデータを使用してすぐに再トレーニングしたりする代わりに、元のモデル(元の「不均衡な」データセットでトレーニングされた)を使用して、次のトレードオフをプロットすることができます。誤検知と誤検知により、望ましいビジネス結果を生み出す可能性のあるしきい値を選択します。

ご質問やご意見がございましたら、ご返信ください。

編集:デフォルトの0.5しきい値が適切でなかったことが唯一の本当の「問題」であったとしても、トレーニングデータのリバランスが「機能する」のはなぜですか?

 
 
モデルによって生成される平均確率予測は、クラス1であるトレーニングインスタンスの比率を概算します。これは、ターゲットクラス変数(値が0と1)の実際の平均値であるためです。 回帰でも同じことが言えます。ターゲット変数の平均予測値は、ターゲット変数の平均実際値に近似すると予想されます。 データの不均衡が大きく、クラス1がマイノリティクラスの場合、この平均確率予測は0.5未満になり、クラス1の確率の予測の大部分は0.5未満になるため、クラス0(マジョリティクラス)に分類されます。 )。 トレーニングデータのバランスを取り直すと、平均予測確率が0.5に増加するため、多くのインスタンスは次のようになります。 上記の. デフォルトのしきい値である0.5とそれ以下の多くのしきい値—予測されるクラスはよりバランスが取れています。 したがって、しきい値を下げて確率予測がそれを上回り、クラス1(マイノリティクラス)を与える代わりに、リバランスによって予測確率が増加し、確率予測がデフォルトのしきい値である0.5を上回り、クラス1を与えることが多くなります。 。

実際にデータのリバランスや再重み付けを行わずに、リバランスの結果と同様の(同一ではない)結果を取得したい場合は、モデルのクラス1の予測確率の平均値または中央値に等しいしきい値を設定してみてください。これは、必ずしも特定のビジネス問題の誤検知と誤検知の最適なバランスを提供するしきい値ではなく、データのバランスを取り直して0.5のしきい値を使用することもありません。

データのリバランスによって、平均予測確率をデフォルトのしきい値である0.5に等しくするだけでなく、モデルが大幅に改善される状況やモデルが存在する可能性があります。 ただし、デフォルトのしきい値0.5を使用する場合、モデルが大多数の時間で多数派クラスを選択するという単なる事実は、データのリバランスが平均確率予測をしきい値に等しくする以上のことを達成するという主張をそれ自体はサポートしません。 平均確率予測をしきい値と等しくしたい場合は、確率予測を歪めるためにトレーニングデータを変更または再重み付けすることなく、しきい値を平均確率予測と等しく設定するだけで済みます。

編集:信頼スコアと確率予測についての注意

 
 
分類器にpredict_probaメソッドがない場合(サポートベクター分類器など)、代わりにdecision_functionメソッドを使用して、 序数識別スコア or 自信スコア たとえそれがそうであるとしても同じ方法で閾値化することができるモデル出力   として解釈可能 確率予測 0から1の間。特定の分類器モデルがXNUMXつのクラスの信頼スコアを計算する方法に応じて、 かもしれない クラス1の信頼スコアに直接しきい値を適用する代わりに(クラス1の予測確率は単に0からそれを引いたものであるため、クラスXNUMXの予測確率として上記で行った)、代わりにしきい値を適用する必要がある場合があります。 違い クラス0の信頼スコアとクラス1の信頼スコアの間で、誤検知のコストが誤検知のコストと同じであると想定される場合のデフォルトのしきい値は0です。 この記事では、XNUMXつのクラスの分類問題を想定しています。

 
バイオ: デビッドBローゼン(PhD) IBM GlobalFinancingの自動クレジット承認のリードデータサイエンティストです。 デビッドの著作の詳細については、 dabruro.medium.com.

元の。 許可を得て転載。

関連する


PlatoAi。 Web3の再考。 増幅されたデータインテリジェンス。
アクセスするには、ここをクリックしてください。

出典:https://www.kdnuggets.com/2021/09/imbalanced-classification-without-re-balancing-data.html

スポット画像

最新のインテリジェンス

スポット画像

私たちとチャット

やあ! どんな御用でしょうか?