স্ট্রিটেড ট্রেন / স্কিটি-শিখায় টেস্ট-বিভক্ত


95

আমার ডেটাগুলিকে প্রশিক্ষণ সেট (75%) এবং পরীক্ষার সেট (25%) এ বিভক্ত করতে হবে। আমি বর্তমানে নীচের কোডটি দিয়ে এটি করছি:

X, Xt, userInfo, userInfo_train = sklearn.cross_validation.train_test_split(X, userInfo)   

তবে, আমি আমার প্রশিক্ষণের ডেটাসেটটি স্ট্রাইফ করতে চাই। আমি কেমন করে ঐটি করি? আমি StratifiedKFoldপদ্ধতিটি খতিয়ে দেখছি , তবে আমাকে 75% / 25% বিভাজন নির্দিষ্ট করতে এবং প্রশিক্ষণ ডেটাসেটকে কেবল স্তরিত করতে দিচ্ছি না।

উত্তর:


161

[০.০7 এর জন্য আপডেট]

এর ডক্স দেখুন sklearn.model_selection.train_test_split:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    stratify=y, 
                                                    test_size=0.25)

[/ ০.০7 এর জন্য আপডেট]

এখানে একটি টান অনুরোধ আছে । তবে আপনি চাইলে train, test = next(iter(StratifiedKFold(...))) ট্রেন এবং সূচকগুলি পরীক্ষা করতে এবং করতে পারেন simply


4
@ অ্যান্ড্রেসমুয়েলার কি রিগ্রেশন ডেটা স্ট্র্যাফাই করার সহজ উপায় আছে?
জর্দান

4
@ জর্দান কিছুই নয় বিজ্ঞান-শিখায় প্রয়োগ করা হয়। আমি একটি মানক উপায় জানি না। আমরা পারসেন্টাইল ব্যবহার করতে পারি।
আন্দ্রেয়াস মুলার

@ আন্দ্রেসমুয়েলার আপনি কি কখনও এমন আচরণ দেখেছেন যেখানে স্ট্রেটেইডশফ্লস্প্লিটের চেয়ে এই পদ্ধতিটি যথেষ্ট ধীর? আমি এমএনআইএসটি ডেটাসেট ব্যবহার করছিলাম।
অ্যাক্টিভেটেড

@ অ্যাক্টিভেটেডজিক যা খুব অদ্ভুত বলে মনে হচ্ছে, যেমন ট্রেন_স্টেস্ট_স্প্লিট (... স্ট্র্যাটিফাই =) কেবল স্ট্রেটিফাইডশফ্লস্প্লিটকে কল করছে এবং প্রথম বিভাজন নিচ্ছে। প্রজননযোগ্য উদাহরণ সহ ট্র্যাকারে কোনও সমস্যা খোলার দ্বিধা বোধ করুন।
Andreas Mueller

@ আন্দ্রেয়াস মিউলার আমি আসলেই একটি সমস্যা খুলিনি কারণ আমার দৃ feeling় অনুভূতি রয়েছে যে আমি কিছু ভুল করছি (যদিও এটি মাত্র 2 লাইন)। তবে আমি যদি আজও এটি একাধিকবার পুনরুত্পাদন করতে সক্ষম হয়ে থাকি তবে আমি তা করব!
অ্যাক্টিভেটেজিক

29

টিএল; ডিআর: এর সাথে স্ট্র্যাটেইডশফ্লস্প্লিট ব্যবহার করুনtest_size=0.25

স্কাইকিট-লার্ন স্ট্র্যাফাইড বিভাজনের জন্য দুটি মডিউল সরবরাহ করে:

  1. স্ট্র্যাটেডিকেফোর্ড : এই মডিউলটি সরাসরি কে-ভাঁজ ক্রস-বৈধকরণ অপারেটর হিসাবে দরকারী: এটি n_foldsপ্রশিক্ষণ / পরীক্ষার সেটগুলি সেট করবে যে উভয় শ্রেণিতে সমান ভারসাম্যপূর্ণ।

এখানে কিছু কোড (সরাসরি উপরের ডকুমেন্টেশন থেকে)

>>> skf = cross_validation.StratifiedKFold(y, n_folds=2) #2-fold cross validation
>>> len(skf)
2
>>> for train_index, test_index in skf:
...    print("TRAIN:", train_index, "TEST:", test_index)
...    X_train, X_test = X[train_index], X[test_index]
...    y_train, y_test = y[train_index], y[test_index]
...    #fit and predict with X_train/test. Use accuracy metrics to check validation performance
  1. স্ট্র্যাটেডশফ্লস্প্লিট : এই মডিউলটি একটি একক প্রশিক্ষণ / পরীক্ষার সেট তৈরি করে যা সমান ভারসাম্যযুক্ত (স্তরযুক্ত) শ্রেণিযুক্ত। মূলত আপনি এর সাথে এটিই চান n_iter=1। আপনি এখানে পরীক্ষার আকার উল্লেখ করতে পারেনtrain_test_split

কোড:

>>> sss = StratifiedShuffleSplit(y, n_iter=1, test_size=0.5, random_state=0)
>>> len(sss)
1
>>> for train_index, test_index in sss:
...    print("TRAIN:", train_index, "TEST:", test_index)
...    X_train, X_test = X[train_index], X[test_index]
...    y_train, y_test = y[train_index], y[test_index]
>>> # fit and predict with your classifier using the above X/y train/test

4
লক্ষ্য করুন হিসাবে 0.18.x, n_iterহওয়া উচিত n_splitsজন্য StratifiedShuffleSplit - এবং এটা জন্য একটি কিছুটা ভিন্ন এপিআই যে: scikit-learn.org/stable/modules/generated/...
lollercoaster

4
যদি yকোনও পান্ডাস সিরিজ হয় তবেy.iloc[train_index], y.iloc[test_index]
Owlright

4
@ অলাইট্রেট আমি একটি পান্ডাস ডেটা ফ্রেম ব্যবহার করার চেষ্টা করেছি এবং স্ট্রেটিফাইডশফ্লস্প্লিট যে সূচকগুলি প্রদান করে তা ডেটাফ্রেমের সূচক নয়। dataframe index: 2,3,5 the first split in sss:[(array([2, 1]), array([0]))]:(
মেঘনা নাটরাজ

4
@ ট্যাঙ্গি কেন এটি লুপের জন্য? এটা কি এমন নয় যে যখন কোনও লাইন X_train, X_test = X[train_index], X[test_index]চালু হয় তখন এটি ওভাররাইড হয় X_trainএবং X_test? তবে কেন শুধু একক নয় next(sss)?
বারটেক ওয়াজিক

13

আপনি এটিকে সহজ train_test_split()পদ্ধতিতে স্কাইকিট শিখতে সহজভাবে করতে পারেন:

from sklearn.model_selection import train_test_split 
train, test = train_test_split(X, test_size=0.25, stratify=X['YOUR_COLUMN_LABEL']) 

আমি একটি সংক্ষিপ্ত গিটহাব গিস্টও প্রস্তুত করেছি যা দেখায় যে stratifyবিকল্প কীভাবে কাজ করে:

https://gist.github.com/SHi-ON/63839f3a3647051a180cb03af0f7d0d9


13

অবিচ্ছিন্ন / রিগ্রেশন ডেটার জন্য এখানে উদাহরণ রয়েছে ( গিটহাবের এই সমস্যাটি সমাধান না হওয়া পর্যন্ত )।

min = np.amin(y)
max = np.amax(y)

# 5 bins may be too few for larger datasets.
bins     = np.linspace(start=min, stop=max, num=5)
y_binned = np.digitize(y, bins, right=True)

X_train, X_test, y_train, y_test = train_test_split(
    X, 
    y, 
    stratify=y_binned
)
  • startসর্বনিম্ন কোথায় এবং stopআপনার অবিচ্ছিন্ন লক্ষ্য সর্বাধিক।
  • যদি আপনি সেট না করে থাকেন right=Trueতবে এটি আপনার সর্বাধিক মানকে একটি পৃথক বিন হিসাবে তৈরি করবে এবং আপনার বিভাজন সর্বদা ব্যর্থ হবে কারণ খুব অল্প পরিমাণে নমুনা সেই অতিরিক্ত বাক্সে থাকবে।

6

@ আন্ড্রেয়াস মুয়েলারের গৃহীত উত্তর ছাড়াও, উপরে উল্লিখিত @ ট্যাঙ্গি হিসাবে এটি যুক্ত করতে চান:

স্ট্র্যাটেডশফ্লস্প্লিটগুলি এর সাথে যুক্ত বৈশিষ্ট্যের সাথে ট্রেন_স্টেস্ট_স্প্লিট ( স্ট্রেটিফাই = ওয়াই) এর সাথে সর্বাধিক ঘনিষ্ঠভাবে সাদৃশ্যযুক্ত :

  1. ডিফল্ট দ্বারা স্তরিত
  2. n_splits নির্দিষ্ট করে , এটি বারবার ডেটা বিভক্ত করে

0
#train_size is 1 - tst_size - vld_size
tst_size=0.15
vld_size=0.15

X_train_test, X_valid, y_train_test, y_valid = train_test_split(df.drop(y, axis=1), df.y, test_size = vld_size, random_state=13903) 

X_train_test_V=pd.DataFrame(X_train_test)
X_valid=pd.DataFrame(X_valid)

X_train, X_test, y_train, y_test = train_test_split(X_train_test, y_train_test, test_size=tst_size, random_state=13903)

0

উপরে বিজ্ঞানী-শিখার বর্তমান সংস্করণে @ টাংগির উত্তর আপডেট করা হচ্ছে: 0.23.2 (স্ট্রাইটেডশফ্লস্প্লিট ডকুমেন্টেশন )।

from sklearn.model_selection import StratifiedShuffleSplit

n_splits = 1  # We only want a single split in this case
sss = StratifiedShuffleSplit(n_splits=n_splits, test_size=0.25, random_state=0)

for train_index, test_index in sss.split(X, y):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.