2013-05-04 4 views
24

के साथ विज्ञान में के-गुना क्रॉस सत्यापन का उपयोग कैसे करें मेरे पास एक छोटा सा कॉर्पस है और मैं 10 गुना क्रॉस सत्यापन का उपयोग करके बेवकूफ बेयस क्लासिफायर की सटीकता की गणना करना चाहता हूं, यह कैसे कर सकता है।बेवकूफ बेयस वर्गीकृत और एनएलटीके

+0

लूप की कोई आवश्यकता नहीं है, [scikit एक सहायक कार्य प्रदान करता है] (http://stackoverflow.com/a/38711253/1090562) जो आपके लिए सबकुछ करता है। –

उत्तर

23

आपके विकल्प या तो इसे स्वयं सेट अप करने या NLTK-Trainer जैसे कुछ एनएलटीके doesn't directly support cross-validation for machine learning algorithms के बाद उपयोग करने के लिए हैं।

मैं शायद आपके लिए यह करने के लिए बस एक और मॉड्यूल का उपयोग करने की अनुशंसा करता हूं लेकिन यदि आप वास्तव में अपना कोड लिखना चाहते हैं तो आप निम्न की तरह कुछ कर सकते हैं।

होता जाना चाहिए तुम्हें 10 गुना चाहते हैं, आप 10 सबसेट, 9/10 पर ट्रेन, परीक्षण में सेट अपने प्रशिक्षण शेष 1/10 पर विभाजन, और सबसेट के प्रत्येक संयोजन (10) के लिए यह करने के लिए किया है।

अपने प्रशिक्षण सेट मानते हुए, training, पूरा करने के लिए इस होगा एक आसान तरीका नामक एक सूची में है

num_folds = 10 
subset_size = len(training)/num_folds 
for i in range(num_folds): 
    testing_this_round = training[i*subset_size:][:subset_size] 
    training_this_round = training[:i*subset_size] + training[(i+1)*subset_size:] 
    # train using training_this_round 
    # evaluate against testing_this_round 
    # save accuracy 

# find mean accuracy over all rounds 
+0

आपके उत्तर के लिए जेरेड धन्यवाद, लेकिन मैं पुस्तकालय scikit cross_validation.KFold का उपयोग कैसे कर सकता हूं- एनएलटीके के बेवकूफ बेयस वर्गीकरण के साथ सीखें? – user2284345

+1

यह स्केलेर्न के cross_validation से बेहतर प्रतीत होता है। –

+1

आपको लगता है कि यह sklearn की तुलना में बेहतर क्यों है? – 12MonthsASlav

13

मैं इस प्रकार crossvalidation के लिए दोनों पुस्तकालयों और NLTK naivebayes sklearn के लिए उपयोग किया है:

import nltk 
from sklearn import cross_validation 
training_set = nltk.classify.apply_features(extract_features, documents) 
cv = cross_validation.KFold(len(training_set), n_folds=10, indices=True, shuffle=False, random_state=None, k=None) 

for traincv, testcv in cv: 
    classifier = nltk.NaiveBayesClassifier.train(training_set[traincv[0]:traincv[len(traincv)-1]]) 
    print 'accuracy:', nltk.classify.util.accuracy(classifier, training_set[testcv[0]:testcv[len(testcv)-1]]) 

और अंत में मैं औसत सटीकता

1

संशोधित दूसरा जवाब गणना:

cv = cross_validation.KFold(len(training_set), n_folds=10, shuffle=True, random_state=None) 
1

Jared's answer से प्रेरित होकर, यहाँ एक संस्करण एक जनरेटर का उपयोग है:

def k_fold_generator(X, y, k_fold): 
    subset_size = len(X)/k_fold # Cast to int if using Python 3 
    for k in range(k_fold): 
     X_train = X[:k * subset_size] + X[(k + 1) * subset_size:] 
     X_valid = X[k * subset_size:][:subset_size] 
     y_train = y[:k * subset_size] + y[(k + 1) * subset_size:] 
     y_valid = y[k * subset_size:][:subset_size] 

     yield X_train, y_train, X_valid, y_valid 

मैं अपने डेटा सेट कि X एन डेटा अंक हैं संभालने हूँ (= 4 उदाहरण में) और डी विशेषताएं (= 2 उदाहरण में)। संबंधित एन लेबल y में संग्रहीत हैं।

X = [[ 1, 2], [3, 4], [5, 6], [7, 8]] 
y = [0, 0, 1, 1] 
k_fold = 2 

for X_train, y_train, X_valid, y_valid in k_fold_generator(X, y, k_fold): 
    # Train using X_train and y_train 
    # Evaluate using X_valid and y_valid 
8

असल में लंबे लूप पुनरावृत्तियों की आवश्यकता नहीं है जो सबसे ऊपर दिए गए उत्तर में प्रदान की जाती हैं। वर्गीकरण की पसंद भी अप्रासंगिक है (यह कोई वर्गीकृत हो सकता है)।

Scikit cross_val_score प्रदान करता है, जो हुड के नीचे सभी लूपिंग करता है।

from sklearn.cross_validation import KFold, cross_val_score 
k_fold = KFold(len(y), n_folds=10, shuffle=True, random_state=0) 
clf = <any classifier> 
print cross_val_score(clf, X, y, cv=k_fold, n_jobs=1) 
+1

KFold और cross_val_score को v0.18 – Nash

+1

'kFold (n_splits = 3, shuffle = गलत, random_state = none) में sklearn.model_selection में स्थानांतरित कर दिया गया है। [डॉक्स] (http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html) को भी देखें – Nash

संबंधित मुद्दे