サンプルの不均衡の問題を処理する


1.データセットの拡大
2.評価指標の変更
サンプルの不均衡なデータにとって,モデルの良し悪しを精度で評価することは,予測の正しい結果のみを反映し,予測の誤りを反映できないため偏差がある.モデルは「リコール率(Recall)」、「精度(Precision)」、「総合評価指標(F-Mmeasure)」で評価した.
3.データセットの再サンプリング
上サンプリング(オーバーサンプリング、増少):正逆例サンプルを同じように多くし、通常は少ないデータに対してデータ生成を行い、多くのデータと同じように多くする.少数のクラスにランダムノイズを加えたり、データを干渉したり、SMOTEアルゴリズムのような一定の規則によって新しい合成サンプルを生成したりすることによって、データを生成することができ、生成データはトレーニングデータのみを生成することに注意してください.
下サンプリング(欠サンプリング、減多):正逆例サンプルを同じように少なくし、通常はより多くのデータをランダムにサンプリングし、より少ないデータと同じように少なくする.下サンプリングの場合、通常のモデルトレーニング方式は、下サンプリングされたデータをクロス検証トレーニングモデルとし、元のデータセットのテストデータでモデルテストを行う必要があることに注意してください.
from imblearn.over_sampling import SMOTE #       SMOTE
from imblearn.under_sampling import RandomUnderSampler #       RandomUnderSampler

#   SMOTE         
model_smote = SMOTE() #   SMOTE    
x_smote_resampled, y_smote_resampled = model_smote.fit_sample(x,y) #            
x_smote_resampled = pd.DataFrame(x_smote_resampled, columns=['col1','col2', 'col3', 'col4', 'col5']) #               
y_smote_resampled = pd.DataFrame(y_smote_resampled,columns=['label']) #               
smote_resampled = pd.concat([x_smote_resampled, y_smote_resampled],axis=1) #        
groupby_data_smote = smote_resampled.groupby('label').count() #  label     
print (groupby_data_smote) #       SMOTE             

#   RandomUnderSampler         
model_RandomUnderSampler = RandomUnderSampler() #   RandomUnderSampler    
x_RandomUnderSampler_resampled, y_RandomUnderSampler_resampled =model_RandomUnderSampler.fit_sample(x,y) #            
x_RandomUnderSampler_resampled =pd.DataFrame(x_RandomUnderSampler_resampled,columns=['col1','col2','col3','col4','col5'])
#               
y_RandomUnderSampler_resampled =pd.DataFrame(y_RandomUnderSampler_resampled,columns=['label']) #               
RandomUnderSampler_resampled =pd.concat([x_RandomUnderSampler_resampled, y_RandomUnderSampler_resampled], axis= 1) #        
groupby_data_RandomUnderSampler =RandomUnderSampler_resampled.groupby('label').count() #  label     
print (groupby_data_RandomUnderSampler) #       RandomUnderSampler             



4.分類アルゴリズムの変更
たとえば、決定ツリーモデル、boostingアルゴリズムなどです.
5.モデルに対するペナルティ
分類中の異なるサンプル数のカテゴリにそれぞれ異なる重み(分類中の小サンプル量カテゴリの重みが高く、大サンプル量カテゴリの重みが低い)を与え、計算とモデリングを行う.
この方法を使用する場合は、アルゴリズムモデルのパラメータに適切な設定を行うだけで、サンプル自体を追加処理する必要があります.多くのモデルとアルゴリズムにはカテゴリパラメータに基づく調整設定があり、scikit-learnのSVMを例にclass_weight:{dict,'balanced'}では、異なるカテゴリに対して異なる重みに対して、異なるカテゴリの重みを手動で指定します.デフォルトのメソッドbalancedを使用すると、SVMは異なるカテゴリのサンプル数に反比例する重みを設定して自動等化処理を行い、計算式はn_samples/(n_classes * np.bincount(y)).
from sklearn.svm import SVC #SVM      SVC
#   SVM            
model_svm = SVC(class_weight='balanced') #   SVC           
model_svm.fit(x, y) #   x y     

6.問題を異常検出、または分類問題に変換する
この場合、分類器は、分類器が単一のクラス分類器(One Class Classifier)である大クラスの決定インタフェースを学習する必要がある.
7.データ合成
分類中の大サンプル量からランダムにデータを抽出して小サンプル量と組み合わせて訓練セットを構成することで,複数回繰り返し多くの訓練セットと訓練モデルが得られる.最後に,適用時に,組合せ手法(例えば投票,重み付け投票など)を用いて分類予測結果を生成する.
例えば、データセットの正、負の例のサンプルは、それぞれ100および10000個であり、割合は1:100である.この場合、負のサンプル(カテゴリ内の大量のサンプルセット)をランダムに100部(もちろんそれ以上に分けてもよい)に分けることができ、各100個のデータに分けることができる.次に、トレーニングセットを形成するたびに、すべての正のサンプル(100個)とランダムに抽出された負のサンプル(100個)を用いて新しいデータセットを形成する.このように繰り返して100個の訓練セットと対応する訓練モデルを得ることができる.
from imblearn.ensemble import EasyEnsemble #       EasyEnsemble
#       EasyEnsemble       
model_EasyEnsemble = EasyEnsemble() #   EasyEnsemble    
x_EasyEnsemble_resampled, y_EasyEnsemble_resampled =
model_EasyEnsemble.fit_sample(x, y) #              
print (x_EasyEnsemble_resampled.shape) #             x     
print (y_EasyEnsemble_resampled.shape) #             y     

#            
index_num = 1 #          
x_EasyEnsemble_resampled_t =pd.DataFrame(x_EasyEnsemble_resampled[index_num],columns=['col1','col2','col3','col4','col5'])
#               
y_EasyEnsemble_resampled_t =pd.DataFrame(y_EasyEnsemble_resampled[index_num],columns=['label']) #               
EasyEnsemble_resampled = pd.concat([x_EasyEnsemble_resampled_t,
y_EasyEnsemble_resampled_t], axis = 1) #        
groupby_data_EasyEnsemble =EasyEnsemble_resampled.groupby('label').count() #  label     
print (groupby_data_EasyEnsemble) #       EasyEnsemble             

テクニカルリファレンス:https://imbalanced-learn.readthedocs.io/en/stable/user_guide.html