আমি একটি ডেটা সেটে বিভিন্ন শ্রেণিবদ্ধ পরীক্ষা করছি যেখানে 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()
আমি উবুন্টু 13.04 এবং সাইকিট-লার্ন 0.12 ব্যবহার করছি। আমার ডেটা দুটি অ্যারে (এক্স এবং ওয়াই) আকারে রয়েছে যা আকার (98816, 4) এবং (98816, 5), উদাহরণস্বরূপ 4 টি বৈশিষ্ট্য এবং 5 শ্রেণির লেবেল রয়েছে। লেবেলগুলি 1 বা 0 এর মধ্যে শ্রেণীর মধ্যে নির্দেশিত সদস্যতার জন্য। আমি সে সম্পর্কে খুব বেশি ডকুমেন্টেশন না দেখায় আমি কি সঠিক বিন্যাসটি ব্যবহার করছি?
OneVsRestClassifier2 ডি অ্যারে গ্রহণ করে (উদাহরণস্বরূপyআপনার উদাহরণ কোডে) বা শ্রেণীর লেবেলের তালিকার একটি টুপল? আমি জিজ্ঞাসা করছি কারণ আমি এখনই সাইকিট-শিখার উপর মাল্টি-লেবেল শ্রেণিবদ্ধকরণের উদাহরণটি দেখেছি এবং দেখেছি যেmake_multilabel_classificationফাংশনটি ক্লাস লেবেলের তালিকার একটি দ্বিগুণ দেয় , যেমন([2], [0], [0, 2], [0]...)3 ক্লাস ব্যবহার করার সময়?