2016-08-18 10 views
8

में केवल एक वर्ग मौजूद है, मैंने Google की खोज की, और इस त्रुटि के बारे में stackoverflow पोस्ट देखें। वे मेरे मामले नहीं हैं।sklearn auc ValueError: y_true

मैं एक साधारण तंत्रिका नेटवर्क को प्रशिक्षित करने के लिए कैमरे का उपयोग करता हूं और विभाजित परीक्षण डेटासेट पर कुछ भविष्यवाणी करता हूं। लेकिन जब Auc की गणना करने के लिए roc_auc_score का उपयोग करें, तो मुझे "ValueError: y_true में केवल एक वर्ग मौजूद है। आरओसी एयूसी स्कोर उस मामले में परिभाषित नहीं किया गया है।"

मैं लक्ष्य लेबल वितरण का निरीक्षण करता हूं, और वे अत्यधिक असंतुलित हैं। कुछ लेबल (कुल 2 9 लेबल में) में केवल 1 उदाहरण होता है। तो संभव है कि उनके पास टेस्ट लेबल में कोई सकारात्मक लेबल उदाहरण नहीं होगा। तो sklearn के roc_auc_score समारोह ने केवल एक वर्ग की समस्या की सूचना दी। यह उचित है।

लेकिन मैं उत्सुक हूं, जब मैं sklearn के cross_val_score फ़ंक्शन का उपयोग करता हूं, तो यह त्रुटि के बिना एयूसी गणना को संभाल सकता है।

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

मुझे आश्चर्य है कि क्या cross_val_score में happend ऐसा इसलिए है क्योंकि cross_val_score एक स्तरीकृत पार सत्यापन डेटा विभाजन का उपयोग करें?

== अद्यतन ==
मैं कुछ खुदाई करना जारी रखा, लेकिन अभी भी अंतर पीछे कि cross_val_score कॉल check_scoring(estimator, scoring=None, allow_none=False) देखना एक गणक वापस जाने के लिए नहीं मिल रहा है, और check_scoringget_scorer(scoring) फोन करेगा जो scorer=SCORERS[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

'my_metric' क्या है:

आप की तरह कुछ कर सकता है? – maxymoo

+0

@maxymoo मैं स्ट्रिंग 'roc_auc' का उपयोग करता हूं, यह एक मान्य मान है। –

+0

यदि आप क्रॉस सत्यापन करते हैं और आपके पास एक प्रकार का लेबल है, तो कुछ फ़ोल्डर्स ऐसे किसी भी लेबल से रहित हो सकते हैं। फ़ोल्डरों की संख्या घटाने का प्रयास करें और सुनिश्चित करें कि आप स्तरीकृत नमूनाकरण का उपयोग करें। – Kris

उत्तर

3

मुझे लगता है कि आपका झुकाव सही है। एयूसी (आरओसी वक्र के तहत क्षेत्र) को समझ में आने के लिए कक्षाओं की पर्याप्त संख्या की आवश्यकता होती है।

डिफ़ॉल्ट रूप से, cross_val_score निष्पादन मीट्रिक को प्रत्येक गुना अलग से गणना करता है। एक और विकल्प cross_val_predict करना और संयुक्त रूप से सभी गुनाओं पर एयूसी की गणना करना हो सकता है।

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) 
संबंधित मुद्दे