मैं एक डेटा सेट पर अलग-अलग क्लासीफायर का परीक्षण कर रहा हूं, जहां 5 कक्षाएं हैं और प्रत्येक उदाहरण इन वर्गों में से एक या अधिक से संबंधित हो सकता है, इसलिए मैं विशेष रूप से स्किकिट-लर्न के मल्टी-लेबल क्लासिफायर का उपयोग कर रहा हूं sklearn.multiclass.OneVsRestClassifier
। अब मैं क्रॉस-वैलिडेशन का उपयोग करना चाहता हूं sklearn.cross_validation.StratifiedKFold
। यह निम्न त्रुटि उत्पन्न करता है:
Traceback (most recent call last):
File "mlfromcsv.py", line 93, in <module>
main()
File "mlfromcsv.py", line 77, in main
test_classifier_multilabel(svm.LinearSVC(), X, Y, 'Linear Support Vector Machine')
File "mlfromcsv.py", line 44, in test_classifier_multilabel
scores = cross_validation.cross_val_score(clf_ml, X, Y_list, cv=cv, score_func=metrics.precision_recall_fscore_support, n_jobs=jobs)
File "/usr/lib/pymodules/python2.7/sklearn/cross_validation.py", line 1046, in cross_val_score
X, y = check_arrays(X, y, sparse_format='csr')
File "/usr/lib/pymodules/python2.7/sklearn/utils/validation.py", line 144, in check_arrays
size, n_samples))
ValueError: Found array with dim 5. Expected 98816
ध्यान दें कि मल्टी-लेबल क्लासिफायरियर का प्रशिक्षण दुर्घटनाग्रस्त नहीं होता है, लेकिन क्रॉस-सत्यापन करता है। इस मल्टी-लेबल क्लासिफायर के लिए मुझे क्रॉस-सत्यापन कैसे करना चाहिए?
मैंने एक दूसरा संस्करण भी लिखा है जो प्रशिक्षण में समस्या को तोड़ता है और 5 अलग-अलग क्लासीफायर को पार करता है। यह ठीक काम करता है।
यहाँ मेरा कोड है। फ़ंक्शन test_classifier_multilabel
समस्या देने वाला है। test_classifier
मेरा दूसरा प्रयास है (5 क्लासिफायर और 5 क्रॉस-वैरिफिकेशन में समस्या को तोड़ना)।
import numpy as np
from sklearn import *
from sklearn.multiclass import OneVsRestClassifier
from sklearn.neighbors import KNeighborsClassifier
import time
def test_classifier(clf, X, Y, description, jobs=1):
print '=== Testing classifier {0} ==='.format(description)
for class_idx in xrange(Y.shape[1]):
print ' > Cross-validating for class {:d}'.format(class_idx)
n_samples = X.shape[0]
cv = cross_validation.StratifiedKFold(Y[:,class_idx], 3)
t_start = time.clock()
scores = cross_validation.cross_val_score(clf, X, Y[:,class_idx], cv=cv, score_func=metrics.precision_recall_fscore_support, n_jobs=jobs)
t_end = time.clock();
print 'Cross validation time: {:0.3f}s.'.format(t_end-t_start)
str_tbl_fmt = '{:>15s}{:>15s}{:>15s}{:>15s}{:>15s}'
str_tbl_entry_fmt = '{:0.2f} +/- {:0.2f}'
print str_tbl_fmt.format('', 'Precision', 'Recall', 'F1 score', 'Support')
for (score_class, lbl) in [(0, 'Negative'), (1, 'Positive')]:
mean_precision = scores[:,0,score_class].mean()
std_precision = scores[:,0,score_class].std()
mean_recall = scores[:,1,score_class].mean()
std_recall = scores[:,1,score_class].std()
mean_f1_score = scores[:,2,score_class].mean()
std_f1_score = scores[:,2,score_class].std()
support = scores[:,3,score_class].mean()
print str_tbl_fmt.format(
lbl,
str_tbl_entry_fmt.format(mean_precision, std_precision),
str_tbl_entry_fmt.format(mean_recall, std_recall),
str_tbl_entry_fmt.format(mean_f1_score, std_f1_score),
'{:0.2f}'.format(support))
def test_classifier_multilabel(clf, X, Y, description, jobs=1):
print '=== Testing multi-label classifier {0} ==='.format(description)
n_samples = X.shape[0]
Y_list = [value for value in Y.T]
print 'Y_list[0].shape:', Y_list[0].shape, 'len(Y_list):', len(Y_list)
cv = cross_validation.StratifiedKFold(Y_list, 3)
clf_ml = OneVsRestClassifier(clf)
accuracy = (clf_ml.fit(X, Y).predict(X) != Y).sum()
print 'Accuracy: {:0.2f}'.format(accuracy)
scores = cross_validation.cross_val_score(clf_ml, X, Y_list, cv=cv, score_func=metrics.precision_recall_fscore_support, n_jobs=jobs)
str_tbl_fmt = '{:>15s}{:>15s}{:>15s}{:>15s}{:>15s}'
str_tbl_entry_fmt = '{:0.2f} +/- {:0.2f}'
print str_tbl_fmt.format('', 'Precision', 'Recall', 'F1 score', 'Support')
for (score_class, lbl) in [(0, 'Negative'), (1, 'Positive')]:
mean_precision = scores[:,0,score_class].mean()
std_precision = scores[:,0,score_class].std()
mean_recall = scores[:,1,score_class].mean()
std_recall = scores[:,1,score_class].std()
mean_f1_score = scores[:,2,score_class].mean()
std_f1_score = scores[:,2,score_class].std()
support = scores[:,3,score_class].mean()
print str_tbl_fmt.format(
lbl,
str_tbl_entry_fmt.format(mean_precision, std_precision),
str_tbl_entry_fmt.format(mean_recall, std_recall),
str_tbl_entry_fmt.format(mean_f1_score, std_f1_score),
'{:0.2f}'.format(support))
def main():
nfeatures = 13
nclasses = 5
ncolumns = nfeatures + nclasses
data = np.loadtxt('./feature_db.csv', delimiter=',', usecols=range(ncolumns))
print data, data.shape
X = np.hstack((data[:,0:3], data[:,(nfeatures-1):nfeatures]))
print 'X.shape:', X.shape
Y = data[:,nfeatures:ncolumns]
print 'Y.shape:', Y.shape
test_classifier(svm.LinearSVC(), X, Y, 'Linear Support Vector Machine', jobs=-1)
test_classifier_multilabel(svm.LinearSVC(), X, Y, 'Linear Support Vector Machine')
if __name__ =='__main__':
main()
मैं Ubuntu 13.04 और scikit-0.12 सीख रहा हूं। मेरा डेटा दो सरणियों (एक्स और वाई) के रूप में है, जिनकी आकृतियाँ (98816, 4) और (98816, 5) हैं, अर्थात प्रति उदाहरण 4 सुविधाएँ और 5 वर्ग लेबल। लेबल या तो उस कक्षा के भीतर इंगित सदस्यता के लिए 1 या 0 हैं। क्या मैं सही प्रारूप का उपयोग कर रहा हूं क्योंकि मुझे इसके बारे में अधिक दस्तावेज नहीं दिख रहे हैं?
OneVsRestClassifier
एक 2D सरणी (जैसेy
आपके उदाहरण कोड में) या क्लास लेबल की सूचियों का एक हिस्सा स्वीकार करता है ? मैं पूछता हूं क्योंकि मैंने अभी-अभी शिक-सीख पर मल्टी-लेबल वर्गीकरण उदाहरण को देखा और देखा किmake_multilabel_classification
फ़ंक्शन([2], [0], [0, 2], [0]...)
3 वर्गों का उपयोग करते समय , क्लास लेबल की सूचियों की एक टुकड़ी लौटाता है ?