2017-11-30 3 views
0

sklearn.GridSearchCVをsklearn.SVC(確率= True)に使用すると、トレーニングデータが小さくバランスが取れていれば(小さいと不均衡)。この例を考えてみましょう:sklearn.SVCは、小さな均衡のあるデータセットでGridSearchCVを利用する場合、根本的に異なる予測(モデル)を返します

from sklearn.model_selection import GridSearchCV 
from sklearn.svm import SVC 
from sklearn import svm, datasets 
iris = datasets.load_iris() 
# Take the first two features. We could avoid this by using a two-dim dataset 
X = iris.data[:, :2] 
y = iris.target 

index = [0,1,2,3,51,52,53,54] 
index_unequal = [0,1,2,3,51,52,53,54,55] 
new_predictions = [5, 6, 7, 56, 57, 58] 
pred_mat, pred_y = X[new_predictions], y[new_predictions] 
c_s = [0.01, 0.1, 1.0, 10.0, 100.0] 
gamma = [1e-4, 1e-3, 1e-2, 1e-1, 1, 10] 
svc_params = [{'kernel': ['rbf'], 'gamma': gamma, 'C': c_s}, 
       {'kernel': ['linear'], 'C': c_s}] 
mat, ye = X[index], y[index] 
mat_unequal, y_unequal = X[index_unequal], y[index_unequal] 

balanced = GridSearchCV(SVC(probability=True), svc_params, cv=4).fit(mat, ye) 
unbalanced = GridSearchCV(SVC(probability=True), svc_params, cv=4).fit(mat_unequal, y_unequal) 

print(balanced.predict_proba(pred_mat)) 
print(unbalanced.predict_proba(pred_mat)) 

バランスの取れたデータに訓練されたモデルは、すべての新しいデータのために0.5の確率を返し、モデルがアンバランスなデータリターンを使用して訓練を受け、一方、1つは、一般的に期待される結果。私は、この例で使用されているトレーニングデータが小さいことを理解していますが、違いはわずか1です。私は、そのような根本的に異なるモデル/確率を与えるためにどのようなメカニズムが変更されているのか不思議です。

更新#1 もう少しこの掘り下げると、以下のVivekの応答を考慮した後(本当に素晴らしいリンクに感謝を!)、predictpredict_probaの違いを理解することは、戦いの半分です。決定関数ではなく確率を最適化するGridSearchのスコアリング関数を選択することができます(例えばscoring='neg_log_loss'GridSearchCVコールに追加)。これは、2つのモデルの間のより良いリストラを与えるだろう。しかし、私はまだ上記の問題の結果に不思議です。 2つのモデルの違いを掘り下げてみると、追加のデータと、クロスバリデーションジェネレータ(つまり、StratifiedKFoldのcv属性)がデータを分割する方法が異なります。例えば、これらの層状のk倍なインデックスを考慮してください

balanced_cv_iter = [(np.array([1, 2, 3, 5, 6, 7]), np.array([0, 4])), 
      (np.array([0, 2, 3, 4, 6, 7]), np.array([1, 5])), 
      (np.array([0, 1, 3, 4, 5, 7]), np.array([2, 6])), 
      (np.array([0, 1, 2, 4, 5, 6]), np.array([3, 7]))] 

unbalanced_cv_iter = [(np.array([1, 2, 3, 6, 7, 8]), np.array([0, 4, 5])), 
       (np.array([0, 2, 3, 4, 5, 7, 8]), np.array([1, 6])), 
       (np.array([0, 1, 3, 4, 5, 6, 8]), np.array([2, 7])), 
       (np.array([0, 1, 2, 4, 5, 6, 7]), np.array([3, 8]))] 

balanced_cv_iter_new = [(np.array([1, 2, 3, 5, 6]), np.array([0, 4, 7])), 
      (np.array([0, 2, 3, 4, 6, 7, 1]), np.array([5])), 
      (np.array([0, 1, 3, 4, 5, 7, 2]), np.array([6])), 
      (np.array([0, 1, 2, 4, 5, 6]), np.array([3, 7]))] 

balanced_cv_iterunbalanced_cv_iter 2つのモデルのためのトレーニング/テストデータに上記のコードおよび関連によって生成された2つの潜在的なリストです。しかし、訓練/テストに奇数の要素(不平衡列車/テストセット)を持たせることによってbalanced_cv_iterを変更すると、balanced_cv_iter_newを得ることができます。そうすることで、バランスモデルとアンバランスモデルの両方の予測が似通ったものになります。 ここで教訓は、モデルの意図された使用(つまり、モデルの使用に合わせてスコアリング機能を選択する)のために最適化することであると思いますか?しかし、GridSearchが、不均衡フレームワークの下でより良い確率モデルにつながる超過パラメータを持つSVM見積もりを選択する理由についての追加の考え/コメントがある場合、私は知りたいと思います。

答えて

0

あなたは間違っていると思っています。これはGridSearchCVとは関係ありません。しかし、SVMで。

predict_proba()をSVCで使用しようとしていますが、これは混乱する出力があり、これらの出力はpredict()機能の実際の出力と一致しないことがあります。

私は1つの小さな変化にあなたのコードを実行しました:

print(balanced.predict(pred_mat)) 
print(unbalanced.predict(pred_mat)) 

、出力は次のとおりです。

[0 0 0 1 0 1] 
[0 0 0 1 1 1] 

ご覧のように、2例のために異なるそのあまりありません。これらの2つの出力で考えられる違いの唯一の原因は、第2のケースで第2のクラスに関する1つの余分なデータがあることです。これは、第1のケースよりも優れた認識に役立ちます。これは、クラスのサンプルを変更することで確認できます。

今predict_probaは、このような結果にご覧下さい与えている理由の説明によう:scikitの開発者の一人

でStackOverflowの上に約 it in documentation

  • This answer

    • Scikit-学ぶ明確化を

    • This excellent explanation他のScikit開発者の違いです。 (コメントを読んでください)

  • +0

    Vivek、この問題を調べる時間を割いてくれてありがとう。上記の私の記事を更新し、あなたのコメントとリンクを使用して、他のユーザーの潜在的な解決策を説明しました。しかし、私はまだ不均衡な設計がこの場合より良い確率モデルにつながるのはなぜか不思議です(たとえ私が不均衡な設計を引き起こす交差検証オブジェクトを選択したとしても)。 – benneely

    関連する問題