2017-08-02 22 views
3

私は、データの80%がクラスxに属し、データの20%がクラスyに属するバイナリ分類問題を解決しようとしています。すべてのモデル(AdaBoost、Neural Networks、SVC)は、すべてのデータがクラスxの一部であると予測しています。これは、これが達成できる最も高い精度です。機械学習:移動を移動

私の目標は、クラスxのすべてのエントリに対してより高い精度を達成することですが、いくつのエントリがクラスyの一部であると誤って分類されても気にしません。

私の考えは、モデルがスーパークラスについて確信していればクラスxにエントリを入れ、そうでなければクラスyに入れることです。

これをどのように達成できますか?非常に明白なエントリだけがクラスxとして分類されるようにしきい値を移動する方法はありますか?私はPythonとsklearnを使用してい

サンプルコード:

SVMで
adaboost = AdaBoostClassifier(random_state=1) 
adaboost.fit(X_train, y_train) 
adaboost_prediction = adaboost.predict(X_test) 

confusion_matrix(adaboost_prediction,y_test) outputs: 

array([[ 0, 0], 
     [10845, 51591]]) 

答えて

2

、しきい値を移動するための1つの方法は、あなたがデータにはるかに体重をかけるようにclass_weightを選択することですクラスyからのポイント。 SVM: Separating hyperplane for unbalanced classesから取られ、以下の例を考えてみましょう:

enter image description here

直線はあなたがSVCを使用するときに、デフォルトのクラスの重みを取得する決定境界(クラスごとに同じ重量)です。破線は、class_weight={1: 10}を使用した場合(つまり、クラス0に対して相対的にクラス1のほうがはるかに大きな重みを付けた場合)に得られる決定境界です。

クラスの重みがbesically SVMでペナルティパラメータを調整する:

class_weight:{辞書、 'バランス'}、任意

iはclass_weightするクラスのパラメータCを[I] * C用SVC。 が指定されていない場合は、すべてのクラスに重み1が設定されています。 「平衡」 モードでは出力できAdaBoostClassifierを使用n_samples/ (n_classes * np.bincount(Y))

4

として入力データのクラスの周波数に反比例 重みを自動的に調整するために、yの値を使用しクラス確率とpredict_probaを使用して代わりにpredictことにより、しきい値それら:

adaboost = AdaBoostClassifier(random_state=1) 
adaboost.fit(X_train, y_train) 
adaboost_probs = adaboost.predict_proba(X_test) 

threshold = 0.8 # for example  
thresholded_adaboost_prediction = adaboost_probs > threshold 

信頼レベルは、あなたの最終的なモデルにどのように変化するかをあなたにも(グラフ上だけでデバッグプリント、または多分ソートやプロットを)点検ができ、このアプローチを使用oテストデータは、それ以上の価値があるかどうかを判断するのに役立ちます。

問題に近づく方法は複数ありますが、たとえば、トレーニング中に80/20クラスの不均衡に合わせて分類器を再重み付けすることを見ているMiriam Farber's answerを参照してください。おそらく、使用しているクラシファイアが現在のデータで現実的にxクラスとyクラスを分離できないなど、他の問題があるかもしれません。このようなデータ問題の可能性をすべて検討するには、いくつかの方法があります。

コードとは対照的に、あなたはデータの問題の問題について多くの質問がある場合は、あなただけでなく、スタックオーバーフロー(投稿する前にサイトのガイドラインをお読みください)を助けることができるスタックExchangeサイトがあります。Data ScienceCross Validatedは。