ট্রেন / পরীক্ষা / বৈধকরণ স্কেলনারিতে বিভক্তকরণ


59

আমি কীভাবে এলোমেলোভাবে একটি ডেটা ম্যাট্রিক্স এবং সংশ্লিষ্ট লেবেল ভেক্টরকে একটি এক্স_ট্রেইন, এক্স_টেষ্ট, এক্স_ওয়াল, ওয়_ট্রেইন, ওয়াই_স্টেস্ট, ওয়_ওয়ালায় স্ক্লেয়ার্ন দিয়ে বিভক্ত করতে পারি? আমি যতদূর জানি, sklearn.cross_validation.train_test_splitকেবল তিনটি নয়, কেবল দুটিতে বিভক্ত করতে সক্ষম ...

উত্তর:


81

আপনি শুধু sklearn.model_selection.train_test_splitদুবার ব্যবহার করতে পারেন । প্রথমে ট্রেনে বিভক্ত, পরীক্ষা এবং তারপরে আবার ট্রেনকে বৈধকরণ এবং ট্রেনে বিভক্ত করুন। এটার মতো কিছু:

 X_train, X_test, y_train, y_test 
    = train_test_split(X, y, test_size=0.2, random_state=1)

 X_train, X_val, y_train, y_val 
    = train_test_split(X_train, y_train, test_size=0.2, random_state=1)

1
হ্যাঁ, এটি অবশ্যই কাজ করে তবে আমি আরও মার্জিত কিছু আশা করি;) কিছু মনে করবেন না, আমি এই উত্তরটি গ্রহণ করি।
হেন্ডরিক

1
আমি যুক্ত করতে চেয়েছিলাম যে আপনি যদি সেরা হাইপার-প্যারামিটারগুলি অনুসন্ধানের জন্য বৈধতা সেটটি ব্যবহার করতে চান তবে বিভক্তির পরে নিম্নলিখিতগুলি করতে পারেন: gist.github.com/albertotb/1bad123363b186267e3aeaa26610b54b
স্কেডি

12
সুতরাং এই উদাহরণে চূড়ান্ত ট্রেন, পরীক্ষা, বৈধতা অনুপাত কী? কারণ দ্বিতীয়টি train_test_split , আপনি এটি পূর্ববর্তী 80/20 বিভাজনের চেয়ে বেশি করছেন। সুতরাং আপনার ভল 80% এর 20%। বিভক্ত অনুপাত এইভাবে খুব সোজা না।
মনিকা হেডনেক

1
আমি @ মনিকা হেডনেকের সাথে একমত যে %৪% ট্রেন, ১ 16% বৈধতা এবং ২০% পরীক্ষার স্প্লট আরও পরিষ্কার হতে পারে। আপনি এই সমাধানটি করতে হবে এটি একটি বিরক্তিকর দিক।
পেরি

32

এই প্রশ্নটির দুর্দান্ত উত্তর এসও- তে রয়েছে যা ন্যাপি এবং পান্ডাস ব্যবহার করে।

আদেশটি (আলোচনার উত্তর দেখুন):

train, validate, test = np.split(df.sample(frac=1), [int(.6*len(df)), int(.8*len(df))])

প্রশিক্ষণ, বৈধতা এবং পরীক্ষা সেটগুলির জন্য একটি 60%, 20%, 20% বিভাজন উত্পাদন করে।


2
আমি .660% অর্থ দেখতে পাচ্ছি ... তবে এর .8অর্থ কী?
টম হেল

1
@ টমহেল পরিবর্তিত np.splitঅ্যারের দৈর্ঘ্যের 60% এ বিভক্ত হবে, তারপরে 80% দৈর্ঘ্য (যা অতিরিক্ত 20% ডেটা), ফলে বাকী 20% ডেটা ছেড়ে যায়। এটি ফাংশনটির সংজ্ঞার কারণে। আপনি এর সাথে টেস্ট / খেলতে পারেন: x = np.arange(10.0)এরপরেnp.split(x, [ int(len(x)*0.6), int(len(x)*0.8)])
0_0

3

প্রায়শই আপনি নিজেকে একবার এটি বিভক্ত করতে দেখবেন না তবে প্রথম ধাপে আপনি একটি প্রশিক্ষণ এবং পরীক্ষার সেটে আপনার ডেটা বিভক্ত করবেন। এরপরে ক্রস-বৈধকরণের মতো 'স্প্লিট কে-ফোল্ড' বা 'লেভ-ওয়ান-আউট (এলইউ)' অ্যালগরিদমের সাথে আরও জটিল স্প্লিটেশন যুক্ত করে একটি প্যারামিটার অনুসন্ধান করা হবে।


3

আপনি train_test_splitদুবার ব্যবহার করতে পারেন । আমি মনে করি এটি সবচেয়ে সোজা straight

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=1)
X_train, X_val, y_train, y_val = train_test_split(
    X_train, y_train, test_size=0.25, random_state=1)

এই ভাবে, train, val, testসেট 60%, 20% যথাক্রমে ডেটাসেটের 20% হতে হবে।


2

উপরের সেরা উত্তরে উল্লেখ করা যায় না যে train_test_splitপার্টিশনের আকার পরিবর্তন না করে দুটি বার পৃথক করে প্রাথমিকভাবে পার্টিশন দেবে না:

x_train, x_remain = train_test_split(x, test_size=(val_size + test_size))

তারপরে বৈধতা এবং পরীক্ষার অংশটি x_remain পরিবর্তনতে সেট করে এবং এটি গণনা করা যেতে পারে

new_test_size = np.around(test_size / (val_size + test_size), 2)
# To preserve (new_test_size + new_val_size) = 1.0 
new_val_size = 1.0 - new_test_size

x_val, x_test = train_test_split(x_remain, test_size=new_test_size)

এই উপলক্ষে সমস্ত প্রাথমিক পার্টিশন সংরক্ষণ করা হয়।


1

এখানে আরও একটি পদ্ধতি রয়েছে (সমান ত্রি-উপায়ে বিভাজন)

# randomly shuffle the dataframe
df = df.reindex(np.random.permutation(df.index))

# how many records is one-third of the entire dataframe
third = int(len(df) / 3)

# Training set (the top third from the entire dataframe)
train = df[:third]

# Testing set (top half of the remainder two third of the dataframe)
test = df[third:][:third]

# Validation set (bottom one third)
valid = df[-third:]

এটি আরও সংক্ষিপ্ত করে তোলা যেতে পারে তবে আমি এটিকে ব্যাখ্যাের উদ্দেশ্যে ভারবজ করে রেখেছি।


0

প্রদত্ত train_frac=0.8, এই ফাংশনটি একটি 80% / 10% / 10% বিভাজন তৈরি করে:

import sklearn

def data_split(examples, labels, train_frac, random_state=None):
    ''' https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
    param data:       Data to be split
    param train_frac: Ratio of train set to whole dataset

    Randomly split dataset, based on these ratios:
        'train': train_frac
        'valid': (1-train_frac) / 2
        'test':  (1-train_frac) / 2

    Eg: passing train_frac=0.8 gives a 80% / 10% / 10% split
    '''

    assert train_frac >= 0 and train_frac <= 1, "Invalid training set fraction"

    X_train, X_tmp, Y_train, Y_tmp = sklearn.model_selection.train_test_split(
                                        examples, labels, train_size=train_frac, random_state=random_state)

    X_val, X_test, Y_val, Y_test   = sklearn.model_selection.train_test_split(
                                        X_tmp, Y_tmp, train_size=0.5, random_state=random_state)

    return X_train, X_val, X_test,  Y_train, Y_val, Y_test

0

কোনও পূর্বনির্ধারিত অনুপাত যেমন (75, 15, 10) সম্মান করে @ hh32 এর উত্তরে যুক্ত করা :

train_ratio = 0.75
validation_ratio = 0.15
test_ratio = 0.10

# train is now 75% of the entire data set
# the _junk suffix means that we drop that variable completely
x_train, x_test, y_train, y_test = train_test_split(dataX, dataY, test_size=1 - train_ratio)

# test is now 10% of the initial data set
# validation is now 15% of the initial data set
x_val, x_test, y_val, y_test = train_test_split(x_test, y_test, test_size=test_ratio/(test_ratio + validation_ratio)) 

print(x_train, x_val, x_test)

0

সংরক্ষিত অনুপাতের সাথে @ hh32 এর উত্তরের সম্প্রসারণ ।

# Defines ratios, w.r.t. whole dataset.
ratio_train = 0.8
ratio_val = 0.1
ratio_test = 0.1

# Produces test split.
x_remaining, x_test, y_remaining, y_test = train_test_split(
    x, y, test_size=test_ratio)

# Adjusts val ratio, w.r.t. remaining dataset.
ratio_remaining = 1 - ratio_test
ratio_val_adjusted = ratio_val / ratio_remaining

# Produces train and val splits.
x_train, x_val, y_train, y_val = train_test_split(
    x_remaining, y_remaining, test_size=ratio_val_adjusted)

যেহেতু প্রথম বিভাজনের পরে বাকী ডেটাসেট হ্রাস পেয়েছে, সমীকরণ সমাধান করে হ্রাস করা ডেটাসেটের সাথে সম্পর্কিত নতুন অনুপাতগুলি গণনা করতে হবে:

RremainingRnew=Rold

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