2017-07-04 19 views
0

DS競技では、SVMを使用してバイナリ分類を行っていました。ここでは、tdata、vdataの両方に256の機能があります。 tlabels、vlabelsは両方ともディメンションn_samples x 1を持ち、固有の値は0/1です。scikit-learn SVMを使用した確率スコア予測/ AUCへのラベル予測

競合規則に従って、ラベルの代わりに確率スコア(0〜1の間)を提出し、AUCを使用して順位を決定する必要があります。

私はSVMとSklearnにとってかなり新しいです。確率スコアとAUCを生成するためにこのコードをどのように変換するかについては、大きな助けになるでしょう。

コード:

classifier=svm.SVC(gamma=g,C=c,kernel='rbf',class_weight='balanced') 
classifier.fit(tdata, tlabels) 
expected = vlabels 
predicted = classifier.predict(vdata) 

print("Classification report for classifier %s:\n%s\n" 
     % (classifier, metrics.classification_report(expected, predicted))) 
cm = metrics.confusion_matrix(expected, predicted) 
accuracy = (cm[0,0]+cm[1,1])*100.0/sum(sum(cm)) 
print("accuracy = "+str(accuracy)) 

出力:

Classification report for classifier SVC(C=1.0, cache_size=200, class_weight='balanced', coef0=0.0, 
    decision_function_shape=None, degree=3, gamma=0.00020000000000000001, 
    kernel='rbf', max_iter=-1, probability=False, random_state=None, 
    shrinking=True, tol=0.001, verbose=False): 
      precision recall f1-score support 

     0.0  0.93  0.88  0.90  1881 
     1.0  0.92  0.95  0.94  2686 

avg/total  0.92  0.92  0.92  4567 


accuracy = 92.3144296037 
+0

あなたは[sklearn.metrics.auc](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.auc.html)を見てきました – shanmuga

+0

はい、しかし、0と1の間の確率スコアを出力するように分類器を変更するにはどうすればよいですか? – dharm0us

+0

確率については、AUC sklearn.metrics.aucの答えを投稿しました – sera

答えて

1

代わりにクラスの確率を得るためSVCpredict_proba機能を使用してください。
predict_probaを使用するには、SVCパラメータprobability=Trueを有効にする必要があります。

classifier=svm.SVC(gamma=g,C=c,kernel='rbf',class_weight='balanced', probability=True) # parameter probability=True should be given 
classifier.fit(tdata, tlabels) 
expected = vlabels 
predicted = classifier.predict(vdata) 
pred_proba = classifier.predict_proba(vdata) # predict_proba function call 

fpr, tpr, thresholds = metrics.roc_curve(labels, proba_one) 
metrics.auc(fpr, tpr) 

参考:
http://scikit-learn.org/stable/modules/generated/sklearn.metrics.auc.html
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

+0

予測確率をクラスラベルに変換する方法を知っていますか?私の分類はバイナリではありません。私は2つのモデルの平均を取って、ラベルに戻す必要があります。 – Saif

+0

'predict_proba'はすべてのレコードの各クラスラベルの確率を与えます。 4つのクラスラベルがあるとすると、これはすべてのレコードに対して4つの確率(1.0まで加算)を持つことを意味します。最も高い確率でクラスラベルを選択します。 – shanmuga

+0

'predict_proba'は各レコードの1つの確率値である1次元配列を返します。理解を深めるために、この[質問](https://stackoverflow.com/questions/47486385/scikit-learn-convert-prediciton-probabilities-to-labelled-predictions)を参照してください。 – Saif

1

ステップ1

定義:probability=True in SVCを(このパラメータは、SVCのために利用可能である)linkを参照してください。

classifier=svm.SVC(gamma=g,C=c,kernel='rbf',class_weight='balanced', probability=True) 

ステップ2

その後、あなたはpredict_probaメソッドを使用する必要があります。

例:

classifier.fit(X,y) 
classifier.predict_proba(X) 

結果は、あなたが範囲内にしたい確率[0,1]です。

これが役に立ちます。

SVC link

predict_proba

関連する問題