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の応答を考慮した後(本当に素晴らしいリンクに感謝を!)、predict
とpredict_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_iter
とunbalanced_cv_iter
2つのモデルのためのトレーニング/テストデータに上記のコードおよび関連によって生成された2つの潜在的なリストです。しかし、訓練/テストに奇数の要素(不平衡列車/テストセット)を持たせることによってbalanced_cv_iter
を変更すると、balanced_cv_iter_new
を得ることができます。そうすることで、バランスモデルとアンバランスモデルの両方の予測が似通ったものになります。 ここで教訓は、モデルの意図された使用(つまり、モデルの使用に合わせてスコアリング機能を選択する)のために最適化することであると思いますか?しかし、GridSearchが、不均衡フレームワークの下でより良い確率モデルにつながる超過パラメータを持つSVM見積もりを選択する理由についての追加の考え/コメントがある場合、私は知りたいと思います。
Vivek、この問題を調べる時間を割いてくれてありがとう。上記の私の記事を更新し、あなたのコメントとリンクを使用して、他のユーザーの潜在的な解決策を説明しました。しかし、私はまだ不均衡な設計がこの場合より良い確率モデルにつながるのはなぜか不思議です(たとえ私が不均衡な設計を引き起こす交差検証オブジェクトを選択したとしても)。 – benneely