মাল্টি-লেবেল শ্রেণিবদ্ধগুলিতে স্কাইকিট-লার্নের ক্রস বৈধকরণ কার্যগুলি কীভাবে ব্যবহার করবেন


20

আমি একটি ডেটা সেটে বিভিন্ন শ্রেণিবদ্ধ পরীক্ষা করছি যেখানে 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 এর মধ্যে শ্রেণীর মধ্যে নির্দেশিত সদস্যতার জন্য। আমি সে সম্পর্কে খুব বেশি ডকুমেন্টেশন না দেখায় আমি কি সঠিক বিন্যাসটি ব্যবহার করছি?

উত্তর:


10

স্তরযুক্ত নমুনা মানে ক্লাসের সদস্যপদ বিতরণটি আপনার কেফোোল্ড নমুনায় সংরক্ষণ করা হয়েছে। মাল্টিলেবল ক্ষেত্রে এটি আপনার লক্ষ্যমাত্রা ভেক্টরের কাছে প্রতি পর্যবেক্ষণে একাধিক লেবেল থাকতে পারে তাতে খুব একটা বোঝা যায় না।

এই অর্থে স্তরিত দুটি সম্ভাব্য ব্যাখ্যা রয়েছে।

জন্য লেবেল যেখানে তাদের অন্তত একটি পূর্ণ দেয় যে আপনার অনন্য লেবেলগুলি। আপনি প্রতিটি অনন্য লেবেলের বিনের উপর স্ট্র্যাটেড নমুনা প্রদর্শন করতে পারেন।n i = 1 2 এনএনΣআমি=1এন2এন

অন্য বিকল্পটি হ'ল প্রশিক্ষণ ডেটা সেন্ট করার চেষ্টা করুন এবং লেবেল ভেক্টরগুলির বিতরণের সম্ভাব্যতা ভরগুলি প্রায় ভাঁজগুলির সমান। যেমন

import numpy as np

np.random.seed(1)
y = np.random.randint(0, 2, (5000, 5))
y = y[np.where(y.sum(axis=1) != 0)[0]]


def proba_mass_split(y, folds=7):
    obs, classes = y.shape
    dist = y.sum(axis=0).astype('float')
    dist /= dist.sum()
    index_list = []
    fold_dist = np.zeros((folds, classes), dtype='float')
    for _ in xrange(folds):
        index_list.append([])
    for i in xrange(obs):
        if i < folds:
            target_fold = i
        else:
            normed_folds = fold_dist.T / fold_dist.sum(axis=1)
            how_off = normed_folds.T - dist
            target_fold = np.argmin(np.dot((y[i] - .5).reshape(1, -1), how_off.T))
        fold_dist[target_fold] += y[i]
        index_list[target_fold].append(i)
    print("Fold distributions are")
    print(fold_dist)
    return index_list

if __name__ == '__main__':
    proba_mass_split(y)

সাধারণ প্রশিক্ষণ পেতে, কেএফোল্ডের উত্পাদিত সূচকগুলির পরীক্ষার সূচিগুলি আপনাকে আবার লিখতে চান যে এটিতে প্রতিটি সূচকের এনপি.সেটডিফ 1 ডি ফেরত দেয়, তারপরে এটির পদ্ধতিতে ক্লাসে মোড়কে ।


এই ব্যাখ্যার জন্য ধন্যবাদ। আমি ঠিক কিছু পরীক্ষা করতে চাই, OneVsRestClassifier2 ডি অ্যারে গ্রহণ করে (উদাহরণস্বরূপ yআপনার উদাহরণ কোডে) বা শ্রেণীর লেবেলের তালিকার একটি টুপল? আমি জিজ্ঞাসা করছি কারণ আমি এখনই সাইকিট-শিখার উপর মাল্টি-লেবেল শ্রেণিবদ্ধকরণের উদাহরণটি দেখেছি এবং দেখেছি যে make_multilabel_classificationফাংশনটি ক্লাস লেবেলের তালিকার একটি দ্বিগুণ দেয় , যেমন ([2], [0], [0, 2], [0]...)3 ক্লাস ব্যবহার করার সময়?
চিপিজ

2
এটি উভয় উপায়েই কাজ করে। যখন টিপলগুলির একটি তালিকা পাস হয় এটি এটিতে একটি sklearn.preprocessing.LabelBinarizer ফিট করে। আপনি জানেন যে মাল্টিক্লাস মাল্টিলেবল ক্ষেত্রে কয়েকটি অ্যালগরিদম কাজ করে। উল্লেখযোগ্য র্যান্ডমফোরস্ট।
জেসিকা মিক

অনেক ধন্যবাদ, এটি কমপক্ষে আমাকে ক্র্যাশগুলি পেরিয়ে গেছে। এই মুহুর্তের জন্য আমি কে-ফোল্ড ক্রস বৈধকরণটিতে চলে এসেছি তবে আমি মনে করি আমি শীঘ্রই আপনার কোডটি ব্যবহার করব। তবে এখন, ক্রস_ওয়াল_স্কোর দ্বারা ফিরে আসা স্কোরটিতে কেবল দুটি কলাম রয়েছে, যেমন কেবল দুটি ক্লাস রয়েছে। metrics.confusion_matrix2x2 কনফিউশন ম্যাট্রিক্স তৈরিতে পরিবর্তন করা হচ্ছে । কোন মেট্রিকগুলি মাল্টি-লেবেল শ্রেণিবদ্ধীদের সমর্থন করে?
চিপিজ

আমি আমার নিজের সাব-প্রশ্নের উত্তর দিয়েছি। মেট্রিকগুলি যেগুলি মাল্টি-লেবেল শ্রেণিবদ্ধীদের সমর্থন করে কেবল সাইকিট-লার্ন 0.14-আরসি তে উপস্থিত হয়েছিল, তাই আমি যদি সেই ক্ষমতাটি চাই তবে আমাকে নিজেই আপগ্রেড করতে হবে। সাহায্য এবং কোডের জন্য ধন্যবাদ।
চিপিজ

আমি রিটার্নের স্টেটমেন্টে অ্যারে করা সরিয়েছি। এমন কোনও কারণ নেই যে আপনি সর্বদা ডেটা পয়েন্টগুলির একটি নিখুঁতভাবে বিভাজনযুক্ত সেট পাবেন। যদি এটি কাজ করে তবে আমাকে জানান। আপনার কোডেও কিছু পরীক্ষা লিখতে হবে। সারাদিন উত্তল অপ্টিমাইজেশান অ্যালগরিদমগুলি ঘুরে দেখার পরে আমি এই ধরনের অ্যালগরিদমটি শ্বাস ফেলেছিলাম।
জেসিকা মিক

3

আপনি যাচাই করতে চাইতে পারেন: মাল্টি-লেবেল ডেটা স্তরবিন্যাসের উপর

এখানে লেখকরা প্রথমে অনন্য লেবেলসেটগুলি থেকে নমুনা নেওয়ার সহজ ধারণাটি জানান এবং তারপরে মাল্টি-লেবেল ডেটাসেটগুলির জন্য একটি নতুন পদ্ধতির পুনরাবৃত্তি স্তরকে প্রবর্তন করেন ।

পুনরাবৃত্ত স্তরবদ্ধতার পদ্ধতির লোভী।

তাত্ক্ষণিক পর্যালোচনার জন্য, পুনরাবৃত্ত স্তরগুলি যা এখানে করে:

প্রথমে তারা খুঁজে বের করে যে প্রতিটি কে-ফোল্ডে কতগুলি উদাহরণ দেওয়া উচিত।

  • আমিআমি

  • ডি

  • ডি

মূল ধারণাটি প্রথমে বিরল বিরল এমন লেবেলগুলিতে ফোকাস করা, এই ধারণাটি অনুমান থেকে আসে from

"যদি বিরল লেবেলগুলির অগ্রাধিকার হিসাবে পরীক্ষা না করা হয়, তবে সেগুলি অনাকাঙ্ক্ষিত উপায়ে বিতরণ করা যেতে পারে এবং পরবর্তীকালে এটি মেরামত করা যায় না"

সম্পর্কগুলি কীভাবে ভাঙা হয়েছে এবং অন্যান্য বিবরণগুলি বোঝার জন্য, আমি কাগজটি পড়ার পরামর্শ দেব। এছাড়াও, পরীক্ষাগুলি বিভাগ থেকে যা আমি বুঝতে পারি তা হ'ল লেবেলসেট / উদাহরণ অনুপাতের উপর নির্ভর করে কেউ অনন্য লেবেল ভিত্তিক বা এই প্রস্তাবিত পুনরাবৃত্ত স্তরটির পদ্ধতি ব্যবহার করতে পারেন। এই অনুপাতের নিম্ন মানের জন্য ভাঁজগুলি জুড়ে লেবেলের বিতরণ পুনরাবৃত্ত স্তরকের হিসাবে কয়েকটি ক্ষেত্রে কাছাকাছি বা আরও ভাল। এই অনুপাতের উচ্চতর মানগুলির জন্য, পুনরাবৃত্ত স্তরগুলি স্তরগুলিতে ভাঁজগুলিতে আরও ভাল বিতরণ বজায় রেখেছিল বলে দেখানো হয়।


1
উল্লিখিত কাগজের পিডিএফ-তে লিঙ্ক করুন: lpis.csd.auth.gr/publications/sechidis-ecmlpkdd-2011.pdf
তেমাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.