2017-12-18 11 views
3

私は最近、自分のプロジェクトにsklearnを使用することに苦労しています。 私は分類器を作り、私のデータを6つのグループに分類したいと思っていました。総サンプルサイズが88、私は電車(66)にデータを分割し、テスト(22) たsklearnのドキュメントが示したように私はここに、正確にやった私のコードはマルチクラスのクロス検証で平均ROCを計算する方法

ある
from sklearn.multiclass import OneVsRestClassifier 
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis as QDA 

clf = OneVsRestClassifier(QDA()) 
QDA_score = clf.fit(train,label).decision_function(test) 
from sklearn.metrics import roc_curve, auc 
from sklearn.metrics import roc_curve 
fpr = dict() 
tpr = dict() 
roc_auc = dict() 
for i in range(3): 
    fpr[i], tpr[i], _ = roc_curve(label_test[:, i], QDA_score[:, i]) 
    roc_auc[i] = auc(fpr[i], tpr[i]) 
from itertools import cycle 
import matplotlib.pyplot as plt 
plt.figure() 
lw = 2 

colors = cycle(['aqua', 'darkorange', 'cornflowerblue']) 
for i, color,n in zip(range(3), colors,['_000','_15_30_45','60']): 
plt.plot(fpr[i], tpr[i], color=color, lw=lw, 
     label='ROC curve of {0} (area = {1:0.2f})' 
     ''.format(n , roc_auc[i])) 
plt.plot([0, 1], [0, 1], 'k--', lw=lw) 
plt.xlim([0.0, 1.0]) 
plt.ylim([0.0, 1.05]) 
plt.xlabel('False Positive Rate') 
plt.ylabel('True Positive Rate') 
plt.title('ROC for multi-classes') 
plt.legend(loc="lower right") 
plt.show() 

リンク私の結果です。 しかし、コードを実行するたびに結果が変わります。とにかくこれをクロスバリデーションと組み合わせて、各クラスの平均的で安定したROCを計算できるかどうか疑問に思っています。

ありがとう!

+0

こんにちは、ようこそ!私は最初の投稿を見直しています。作業しているドキュメントへのリンクを追加することをお勧めします。また、あなたが参照している結果とのリンクは見逃されているようです。また、行動を変えているコード部分をよりよく分離して、それが予期せぬ理由を説明できる場合にも役立ちます。そうでなければ、これはかなり良い最初の投稿です。がんばろう! – Praxeolitic

答えて

0

あなたが解決しようとしている問題のデータと複雑さの詳細がわからないのは難しいですが、あなたのような不規則な学習パフォーマンスは、データセットがデータの不規則性や複雑さに対して小さすぎることを示している可能性があります。あなたがサンプルを取るたびに違う電車のデータセットを得ることができます。

一般的なテスト対列車のテクニックは、あなたも見ることができるk-foldクロスバリデーションです。

更新日: K倍クロス検証は、基本的にデータをk個の部分にスライスし、k回の学習プロセスを実行し、その結果を平均します。データの異なる部分がテストデータセットと残りのk -1部は電車のデータセットです。

+0

は、sklearnのクロスバリデーションの方法がたくさんあるようです。 k-fold関数とcross_val_scoreの違いは何ですか? –

+0

私は概念を知っていますが、私はちょうど2つの関数の違いについて混乱しています。 –

+0

k-foldは本質的にcross_val_scoreのk回のランを平均しています。 –