2016-08-18 10 views
8

Google'da arama yaptım ve bu hata hakkında stackoverflow yayınına bakın. Benim durumum değiller.sklearn auc ValueError: y_true içinde sadece bir sınıf var

Basit sinir ağını eğitmek ve bölünmüş test veri kümesinde bazı ön tanımlamalar yapmak için keras kullanıyorum. Ama auc hesaplamak için roc_auc_score kullanın, "ValueError: y_true içinde sadece bir sınıf mevcut. Bu durumda ROC AUC puanı tanımlanmadı".

Hedef etiket dağılımını inceliyorum ve çok dengesiz. Bazı etiketler (toplam 29 etikette) sadece 1 örneğe sahiptir. Bu yüzden test etiketinde hiç pozitif etiket örneği bulunmayacaktır. Yani, sklearn'in roc_auc_score işlevi, tek bir sınıf sorununu bildirdi. Bu makul.

Ama merak ediyorum, sklearn'in cross_val_score işlevini kullandığım gibi, AUC hesaplamasını hatasız işleyebilir.

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

Ben cross_val_score bir tabakalı çapraz doğrulama verisi bölümünü kullanacak çünkü öyle, cross_val_score happend acaba?

== GÜNCELLEME ==
biraz araştırma yapmaya devam, ama yine de bir skorer dönmek için bu cross_val_score çağrısı check_scoring(estimator, scoring=None, allow_none=False) bkz behind.I fark bulamıyorum ve scorer=SCORERS[scoring]

dönecektir hangi check_scoring get_scorer(scoring) arayacak ,
roc_auc_scorer Yani

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

tarafından yapılır;

Ve SCORERS['roc_auc']roc_auc_scorer olduğunu hala roc_auc_score işlevini kullanıyor. Cross_val_score'un neden doğrudan roc_auc_score’yu çağırarak farklı davrandığını anlamıyorum.

+0

:

Sen böyle bir şey yapabilir? – maxymoo

+0

@maxymoo 'roc_auc' dizesini kullanıyorum, geçerli bir değer. –

+0

Doğrulamayı geçerseniz ve çok az bir tür etiketiniz varsa, bazı kıvrımlar bu tür etiketlerden yoksun olabilir. Katlama sayısını azaltmayı deneyin ve tabakalı örnekleme kullandığınızdan emin olun. – Kris

cevap

3

Bence öküzün doğru. AUC (ROC eğrisi altındaki alan), anlamlı olmak için yeterli sayıda her iki sınıfa ihtiyaç duyar.

Varsayılan olarak, cross_val_score, her kat ayrı ayrı performans metriğini hesaplar. Başka bir seçenek cross_val_predict yapmak ve birleştirilmiş tüm katlar üzerinde AUC hesaplamak olabilir. `My_metric` nedir

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)