2016-08-18 9 views
8

私はGoogleを検索し、このエラーについてのstackoverflowの投稿を参照してください。彼らは私の場合ではありません。sklearn auc ValueError:y_trueに1つのクラスしかありません

私はケラスを使って、単純なニューラルネットワークを訓練し、分割されたテストデータセットにいくつかの前提を作ります。しかし、roc_auc_scoreを使用してaucを計算すると、 "ValueError:y_trueに1つのクラスしか存在しません.ROC AUCスコアはこの場合定義されていません。"

私はターゲットラベルの分布を検査しますが、それらは非常に不均衡です。一部のラベル(合計29個のラベル)にはインスタンスが1つしかありません。したがって、テストラベルにポジティブなラベルインスタンスがない可能性があります。だから、Sklearnのroc_auc_score関数が唯一のクラス問題を報告しました。それは合理的です。

しかし、私はsklearnのcross_val_score機能を使用する場合、それはエラーなしでAUCの計算を扱うことができるように私は、興味があります。 cross_val_scoreが成層クロス検証データ分割を使用しているため、私はcross_val_scoreに起こったのだろうか

my_metric = 'roc_auc' 
scores = cross_validation.cross_val_score(myestimator, data, 
            labels, cv=5,scoring=my_metric) 

は、それはありますか?

== UPDATE ==
私はいくつかの掘削を続け、それでもbehind.Iはスコアラーを返すために、そのcross_val_scoreコールcheck_scoring(estimator, scoring=None, allow_none=False)を参照してください違いを見つけることができない、とcheck_scoringscorer=SCORERS[scoring]

を返しますどの get_scorer(scoring)を呼び出します

そしてSCORERS['roc_auc']roc_auc_scorerです。
roc_auc_scorerはそう

roc_auc_scorer = make_scorer(roc_auc_score, greater_is_better=True, 
           needs_threshold=True) 

によって作られ、それでもroc_auc_score関数を使用しています。私はcross_val_scoreがroc_auc_scoreを直接呼び出して異なる振る舞いをする理由を知りません。

+0

あなたのような何かをするだろうか? – maxymoo

+0

@maxymoo文字列 'roc_auc'を使用します。これは有効な値です。 –

+0

クロスバリデーションを行い、1種類のラベルが少なすぎる場合は、いくつかの折り目にそのようなラベルがない場合があります。折り畳みの数を減らし、層別サンプリングを使用するようにしてください。 – Kris

答えて

3

あなたの勘が正しいと思います。 AUC(ROC曲線の下の面積)は意味を成立させるために十分な数のいずれかのクラスを必要とする。デフォルトでは

cross_val_scoreは、それぞれが個別に折り畳むパフォーマンスメトリック1を計算します。もう1つの選択肢は、cross_val_predictを実行し、すべてのフォールドを合わせたAUCを計算することです。 `my_metric`は何である

from sklearn.metrics import roc_auc_score 
from sklearn.cross_validation import cross_val_predict 
from sklearn.linear_model import LogisticRegression 
from sklearn.datasets import make_classification 


class ProbaEstimator(LogisticRegression): 
    """ 
    This little hack needed, because `cross_val_predict` 
    uses `estimator.predict(X)` internally. 

    Replace `LogisticRegression` with whatever classifier you like. 

    """ 
    def predict(self, X): 
     return super(self.__class__, self).predict_proba(X)[:, 1] 


# some example data 
X, y = make_classification() 

# define your estimator 
estimator = ProbaEstimator() 

# get predictions 
pred = cross_val_predict(estimator, X, y, cv=5) 

# compute AUC score 
roc_auc_score(y, pred) 
関連する問題