এক্সজিবিস্টের সাথে ভারসাম্যহীন মাল্টিক্লাস ডেটা


20

এই বিতরণ সহ আমার 3 টি ক্লাস রয়েছে:

Class 0: 0.1169
Class 1: 0.7668
Class 2: 0.1163

এবং আমি xgboostশ্রেণিবদ্ধকরণের জন্য ব্যবহার করছি। আমি জানি যে সেখানে একটি প্যারামিটার বলা হয়েছে scale_pos_weight

তবে কীভাবে এটি 'মাল্টিক্লাস' কেসের জন্য পরিচালিত হয় এবং আমি কীভাবে এটি সঠিকভাবে সেট করতে পারি?

উত্তর:


18

scale_pos_weightআপনার বক্তব্য অনুসারে বাইনারি শ্রেণিবদ্ধকরণের জন্য ব্যবহৃত হয়। ভারসাম্যহীন ক্লাস পরিচালনা করার জন্য এটি আরও সাধারণ সমাধান। একটি মান নির্ধারণ করার সময় একটি ভাল পদ্ধতির scale_pos_weightহ'ল:

sum(negative instances) / sum(positive instances)

আপনার নির্দিষ্ট কেসের জন্য, পৃথক ডেটা পয়েন্টগুলি ওজন করতে এবং বুস্টারটির সাথে কাজ করার সময় তাদের ওজনগুলিকে বিবেচনায় আনতে আরও একটি বিকল্প রয়েছে এবং প্রতিটি ওজনকে সমানভাবে প্রতিনিধিত্ব করার জন্য তাদের ওজন সম্পর্কে অনুকূলিতকরণটি ঘটতে দিন। আপনাকে কেবল সহজভাবে ব্যবহার করতে হবে:

xgboost.DMatrix(..., weight = *weight array for individual weights*)

আপনি নিজের পছন্দ অনুযায়ী ওজনকে সংজ্ঞায়িত করতে পারেন এবং এটি করে আপনি এমনকি ক্লাসের মধ্যে ভারসাম্যহীনতার পাশাপাশি বিভিন্ন ক্লাসে ভারসাম্যহীনতা পরিচালনা করতে পারেন।


> স্কেল_পোস_ওয়েটের জন্য কোনও মূল্য নির্ধারণ করার সময় একটি ভাল পদ্ধতির বিষয়টি হল: যোগফল (নেতিবাচক উদাহরণ) / যোগফল (ধনাত্মক দৃষ্টান্ত)
lcrmorin

1
আমি এই পরামর্শটি সর্বত্রই দেখছি এবং কম প্রতিনিধিত্বশীল শ্রেণিতে উচ্চতর ওজন নির্ধারণ করা বুদ্ধিমান। তবে এই সঠিক মানটি নিয়ে আলোচনা করার উত্স খুঁজে পেতে আমার খুব কষ্ট হয়েছে। আমি সেই নির্দিষ্ট মানের পিছনে অন্তর্নিহিততা পেয়েছি (নমুনাকে সুষম করে তুলুন) তবে আমার সন্দেহ আছে যে কোথাও কোনও বৈকল্পিক বাণিজ্য রয়েছে, এটি আপনাকে কম ওজন বিবেচনা করতে চাইবে।
lcrmorin

7

@ কেরেম্টের এই উত্তরটি সঠিক। আমি এখনও তাদের সঠিক উদাহরণ কার্যকর করতে সমস্যা আছে যারা একটি উদাহরণ প্রদান।

weightএক্সজিবিস্টে প্যারামিটার প্রতি ক্লাসে নয় প্রতি উদাহরণে। সুতরাং, আমাদের প্রতিটি শ্রেণীর ভারটিকে তার দৃষ্টান্তগুলিতে নির্ধারণ করতে হবে, যা একই জিনিস।

উদাহরণস্বরূপ, আমাদের যদি অনুপাত সহ তিনটি ভারসাম্যহীন ক্লাস থাকে

class A = 10%
class B = 30%
class C = 60%

তাদের ওজন হবে (অন্যদের দ্বারা ক্ষুদ্রতম শ্রেণি ভাগ করা)

class A = 1.000
class B = 0.333
class C = 0.167

তারপরে, যদি প্রশিক্ষণের ডেটা হয়

index   class
0       A
1       A
2       B
3       C
4       B

আমরা weightনিম্নলিখিত হিসাবে ভেক্টর নির্মাণ :

index   class    weight
0       A        1.000
1       A        1.000
2       B        0.333
3       C        0.167
4       B        0.333

5

আরবিতে এক্সজিবিস্ট ব্যবহার করে ভারসাম্যহীন মাল্টিক্লাস শ্রেণিবদ্ধকরণের সমস্যাটি মোকাবেলা করার সময় সবাই এই প্রশ্নটিতে হোঁচট খায়! আমিও করেছি!

কীভাবে এটি প্রয়োগ করা যায় তা আরও ভাল করে বোঝার জন্য আমি একটি উদাহরণ খুঁজছিলাম। নীচে উল্লিখিত লিঙ্কটি খুঁজতে প্রায় এক ঘন্টা বিনিয়োগ করেছেন ted যারা উদাহরণ খুঁজছেন তাদের জন্য, এখানে যায় -

/datascience//a/9493/37156

ধন্যবাদ ওয়্যাকাক্স


1

আপনার ট্রেনের ডেটা প্রতিটি শ্রেণীর ওজন সহ কেবল নিযুক্ত করুন। প্রথমে class_weight.compute_class_weightস্কেলনার দিয়ে ক্লাস ওজন পান তারপরে ট্রেনের প্রতিটি সারি এর যথাযথ ওজন নির্ধারণ করুন।

আমি এখানে ধরে নিয়েছি যে ট্রেনের ডেটাতে ক্লাস নম্বর সহ কলাম 'শ্রেণি' রয়েছে। আমি এটাও ধরে নিয়েছি যে এখানে এনবি_ক্ল্যাশগুলি রয়েছে যা 1 থেকে শুরু করে এনবি_ ক্লাসে রয়েছে।

from sklearn.utils import class_weight
class_weights = list(class_weight.compute_class_weight('balanced',
                                             np.unique(train['class']),
                                             train['class']))

w_array = np.ones(y_train.shape[0], dtype = 'float')
for i, val in enumerate(y_train):
    w_array[i] = class_weights[val-1]

xgb_classifier.fit(X, y, sample_weight=w_array)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.