2017-11-30 6 views
0

パイプライニングとグリッド検索と組み合わせてscikit-learnsサポートベクター分類器(svm.SVC)で小さな例を構築しました。フィッティングと評価をした後、私は非常に興味深いROC曲線を得ます。このROC曲線のグラフは奇妙に見えます(sklearn SVC)

ROC curve of an SVC

私はここに、曲線形状の多くを得るだろうと思いました。誰がこの行動を説明できますか?最小限のワーキングサンプルコード:

# Imports 
import sklearn as skl 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.datasets import make_classification 
from sklearn import preprocessing 
from sklearn import svm 
from sklearn.model_selection import GridSearchCV 
from sklearn.pipeline import Pipeline 
from sklearn import metrics 
from tempfile import mkdtemp 
from shutil import rmtree 
from sklearn.externals.joblib import Memory 


def plot_roc(y_test, y_pred): 
    fpr, tpr, thresholds = skl.metrics.roc_curve(y_test, y_pred, pos_label=1) 
    roc_auc = skl.metrics.auc(fpr, tpr) 
    plt.figure() 
    lw = 2 
    plt.plot(fpr, tpr, color='darkorange', lw=lw, label='ROC curve (area ={0:.2f})'.format(roc_auc)) 
    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--') 
    plt.xlim([0.0, 1.0]) 
    plt.ylim([0.0, 1.05]) 
    plt.xlabel('False Positive Rate') 
    plt.ylabel('True Positive Rate') 
    plt.title('Receiver operating characteristic example') 
    plt.legend(loc="lower right") 
    plt.show(); 

# Generate a random dataset 
X, y = skl.datasets.make_classification(n_samples=1400, n_features=11, n_informative=5, n_classes=2, weights=[0.94, 0.06], flip_y=0.05, random_state=42) 
X_train, X_test, y_train, y_test = skl.model_selection.train_test_split(X, y, test_size=0.3, random_state=42) 

#Instantiate Classifier 
normer = preprocessing.Normalizer() 
svm1 = svm.SVC(probability=True, class_weight={1: 10}) 

cached = mkdtemp() 
memory = Memory(cachedir=cached, verbose=3) 
pipe_1 = Pipeline(steps=[('normalization', normer), ('svm', svm1)], memory=memory) 

cv = skl.model_selection.KFold(n_splits=5, shuffle=True, random_state=42) 

param_grid = [ {"svm__kernel": ["linear"], "svm__C": [1, 10, 100, 1000]}, {"svm__kernel": ["rbf"], "svm__C": [1, 10, 100, 1000], "svm__gamma": [0.001, 0.0001]} ] 
grd = GridSearchCV(pipe_1, param_grid, scoring='roc_auc', cv=cv) 

#Training 
y_pred = grd.fit(X_train, y_train).predict(X_test) 
rmtree(cached) 

#Evaluation 
confmatrix = skl.metrics.confusion_matrix(y_test, y_pred) 
print(confmatrix) 
plot_roc(y_test, y_pred) 
+1

'y_pred = grd.fit(X_train、y_train).predict_proba(X_test)[:, 1]'を試してからplotメソッドに送信してください。 –

+0

これは完全に動作します。私の深刻なデータセットにこれを適用します。 – Ulu83

答えて

1

あなたplot_roc(y_test, y_pred)機能は、内部roc_curveを呼び出します。

y_score:documentation of roc_curve 1として

アレイ、形状= [n_samples]

ターゲットスコアは、いずれかの正のクラス、信頼値、または非閾値処理尺度の確率推定することができますいくつかの分類子では "decision_function"によって返されます( )。

これは、y_predがハード予測クラスではなく、正のクラスの確率である場合に最適です。

は、次のコードを試してみてください。

y_pred = grd.fit(X_train, y_train).predict_proba(X_test)[:,1] 

をしてからプロット法にy_predを送ります。

関連する問題