मैं हैरान हूं कि क्रॉस-सत्यापन के बिना एक यादृच्छिक वन वर्गीकरण मॉडल .996 का औसत सटीकता स्कोर क्यों देता है, लेकिन 5 गुना क्रॉस-सत्यापन के साथ, मॉडल का औसत सटीकता स्कोर .687 है।

275,956 नमूने हैं। कक्षा ० = २१७८९१, कक्षा १ = ६०७३, कक्षा २ = ५१९९२

मैं "TARGET" कॉलम की भविष्यवाणी करने की कोशिश कर रहा हूं, जो 3 वर्ग [0,1,2] है:

data.head()
bottom_temperature  bottom_humidity top_temperature top_humidity    external_temperature    external_humidity   weight  TARGET  
26.35   42.94   27.15   40.43   27.19   0.0  0.0    1   
36.39   82.40   33.39   49.08   29.06   0.0  0.0    1   
36.32   73.74   33.84   42.41   21.25   0.0  0.0    1   

डॉक्स से, डेटा को प्रशिक्षण और परीक्षण में विभाजित किया जाता है

# link to docs http://scikit-learn.org/stable/modules/cross_validation.html
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import svm

# Create a list of the feature column's names
features = data.columns[:7]

# View features
features
Out[]: Index([u'bottom_temperature', u'bottom_humidity', u'top_temperature',
       u'top_humidity', u'external_temperature', u'external_humidity',
       u'weight'],
      dtype='object')


#split data
X_train, X_test, y_train, y_test = train_test_split(data[features], data.TARGET, test_size=0.4, random_state=0)

#build model
clf = RandomForestClassifier(n_jobs=2, random_state=0)
clf.fit(X_train, y_train)

#predict
preds = clf.predict(X_test)

#accuracy of predictions
accuracy = accuracy_score(y_test, preds)
print('Mean accuracy score:', accuracy)

('Mean accuracy score:', 0.96607267423425713)

#verify - its the same
clf.score(X_test, y_test)
0.96607267423425713

क्रॉस सत्यापन पर:

from sklearn.model_selection import cross_val_score
scores = cross_val_score(clf, data[features], data.TARGET, cv=5)
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

Accuracy: 0.69 (+/- 0.07)

यह बहुत कम है!

और दूसरा तरीका सत्यापित करने के लिए:

#predict with CV
# http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_predict.html#sklearn.model_selection.cross_val_predict
from sklearn.model_selection import cross_val_predict
predicted = cross_val_predict(clf, data[features], data.queen3, cv=5)
metrics.accuracy_score(data.queen3, predicted) 

Out[]: 0.68741031178883594

मेरी समझ से, क्रॉस सत्यापन इस राशि से भविष्यवाणियों की सटीकता को कम नहीं करना चाहिए, लेकिन मॉडल की भविष्यवाणी में सुधार करना चाहिए क्योंकि मॉडल ने सभी डेटा का "बेहतर" प्रतिनिधित्व देखा है।

4
Evan 29 मार्च 2018, 01:09

3 जवाब

सबसे बढ़िया उत्तर

आम तौर पर मैं विवेक से सहमत होता और आपको अपने क्रॉस-वेलिडेशन पर भरोसा करने के लिए कहता।

हालांकि, सीवी का कुछ स्तर एक यादृच्छिक जंगल में निहित है क्योंकि प्रत्येक पेड़ बूटस्ट्रैप किए गए नमूने से उगाया जाता है, इसलिए क्रॉस-सत्यापन चलाते समय आपको सटीकता में इतनी बड़ी कमी देखने की उम्मीद नहीं करनी चाहिए। मुझे संदेह है कि आपकी समस्या आपके डेटा सॉर्टिंग में किसी प्रकार के समय- या स्थान-निर्भरता के कारण है।

जब आप train_test_split का उपयोग करते हैं, तो डेटा डेटासेट से बेतरतीब ढंग से निकाला जाता है, इसलिए आपके सभी 80 वातावरण आपके ट्रेन और परीक्षण डेटासेट में मौजूद होने की संभावना है। हालांकि, जब आप सीवी के लिए डिफ़ॉल्ट विकल्पों का उपयोग करके विभाजित होते हैं, तो मेरा मानना ​​​​है कि प्रत्येक तह क्रम में खींची गई है, इसलिए आपका प्रत्येक वातावरण प्रत्येक तह के भीतर मौजूद नहीं है (यह मानते हुए कि आपका डेटा पर्यावरण द्वारा आदेशित है)। यह कम सटीकता की ओर ले जाता है क्योंकि आप दूसरे से डेटा का उपयोग करके एक वातावरण की भविष्यवाणी कर रहे हैं।

इसका सरल उपाय cv=ms.StratifiedKFold(n_splits=5, shuffle=True) को सेट करना है।

मैंने पहले भी कई बार इस समस्या का सामना किया है जब समसामयिक डेटासेट का उपयोग किया जाता है और ऐसे सैकड़ों अन्य लोग होने चाहिए जिनके पास समस्या है और यह नहीं पता है कि समस्या क्या है। डिफ़ॉल्ट व्यवहार का विचार एक समय श्रृंखला में आदेश बनाए रखना है (जो मैंने गिटहब चर्चाओं में देखा है)।

5
Stev 29 मार्च 2018, 15:16

train_test_split में, आप प्रशिक्षण के लिए 60% डेटा का उपयोग कर रहे हैं (test_size=0.4) केवल एक बार। लेकिन cross_val_score में डेटा को 80% ट्रेन (cv = 5) में 5 बार विभाजित किया जाएगा (हर बार 4 गुना ट्रेन बन जाएगी और शेष 1 परीक्षण के रूप में)।

अब आपको सोचना चाहिए कि 80% प्रशिक्षण डेटा 60% से अधिक है, इसलिए सटीकता कम नहीं होनी चाहिए। लेकिन यहां एक बात और गौर करने वाली है।

train_test_split डिफ़ॉल्ट रूप से विभाजन को स्तरीकृत नहीं करेगा, लेकिन यह cross_val_score में करेगा। स्तरीकरण प्रत्येक तह में वर्गों (लक्ष्यों) के अनुपात को समान रखता है। तो शायद, ऐसा हो रहा है कि ट्रेन_टेस्ट_स्प्लिट में लक्ष्य का अनुपात बनाए नहीं रखा जाता है जो क्लासिफायरियर के ओवर-फिटिंग की ओर जाता है और इसलिए यह उच्च स्कोर है।

मैं cross_val_score को अंतिम स्कोर के रूप में लेने का सुझाव दूंगा।

4
Vivek Kumar 29 मार्च 2018, 10:54

आपके डेटा में कुछ अंतर्निहित क्रम होने की संभावना है। जब आप सीवी कर रहे हों तो "शफल" को सही में बदलें।

2
Adrian 10 जुलाई 2019, 13:23