আমি কীভাবে পান্ডার সাথে একটি ডেটা ফ্রেম থেকে পরীক্ষার এবং ট্রেনের নমুনা তৈরি করব?


322

আমার কাছে ডেটাফ্রেমের আকারে মোটামুটি বড় ডেটাসেট রয়েছে এবং আমি ভাবছিলাম যে কীভাবে আমি প্রশিক্ষণ এবং পরীক্ষার জন্য ডেটাফ্রেমকে দুটি এলোমেলো নমুনায় (৮০% এবং ২০%) বিভক্ত করতে সক্ষম হব?

ধন্যবাদ!

উত্তর:


346

আমি কেবল নপীর ব্যবহার করব randn:

In [11]: df = pd.DataFrame(np.random.randn(100, 2))

In [12]: msk = np.random.rand(len(df)) < 0.8

In [13]: train = df[msk]

In [14]: test = df[~msk]

এবং শুধু এটি কাজ করেছে তা দেখতে:

In [15]: len(test)
Out[15]: 21

In [16]: len(train)
Out[16]: 79

3
দুঃখিত আমার ভুল. যতদিন হিসাবে mskdtype হয় bool, df[msk], df.iloc[msk]এবং df.loc[msk]সবসময় একই ফলাফল ফিরে যান।
unutbu

2
আমার মনে হয় আপনি ব্যবহার করা উচিত randকরার < 0.8কারণ এটি অবিশেষে 0 এবং 1 এর মধ্যে র্যান্ডম সংখ্যা বিতরণ ফেরৎ জানার জন্য
আর সর্বাধিক

4
লাইনগুলিতে ঠিক কী ঘটে in[12], কেউ অজগর শর্তে বিশুদ্ধভাবে ব্যাখ্যা করতে পারে in[13],, in[14]? আমি এখানে পাইথন কোডটি নিজেই বুঝতে চাই
কুয়াট্রোকা

7
Gobrewers14 থেকে স্কলারন ব্যবহার করে উত্তরটি আরও ভাল। এটি কম জটিল এবং ডিবাগ করা সহজ। আমি নীচের উত্তরটি ব্যবহার করার পরামর্শ দিচ্ছি।
সুতরাং এস

2
@ কুয়াট্রোকা np.random.rand(len(df))হ'ল আকারের একটি অ্যারে len(df)এবং এলোমেলোভাবে এবং অভিন্নভাবে বিতরণ করা ভাসমান মানগুলি পরিসীমা [0, 1] এর মধ্যে রয়েছে। < 0.8তুলনা উপাদান-অনুযায়ী ও সঞ্চয় জায়গায় ফলাফলের প্রযোজ্য। সুতরাং মানগুলি <0.8 হয়ে Trueও মান> = 0.8 হয়ে যায়False
কেনটজো

623

সাইকিট লার্নিংtrain_test_split একটি ভাল।

from sklearn.model_selection import train_test_split

train, test = train_test_split(df, test_size=0.2)

22
এটি পণ্ডাস ডেটাফ্রেমগুলিতে নয়, তবে অদৃশ্য অ্যারেগুলি ফিরিয়ে দেবে
বার

124
বিটিডব্লিউ, এটি এখন একটি পান্ডাস ডেটাফ্রেম ফেরত দেয় (সবেমাত্র স্কেলের্ন ০.০6.১-তে পরীক্ষা করা হয়েছে)
জুলিয়েন মারেক

5
আপনি যদি কেফোল্ডের সন্ধান করছেন তবে দুঃখের বিষয় এটি কিছুটা জটিল। kf = KFold(n, n_folds=folds) for train_index, test_index in kf: X_train, X_test = X.ix[train_index], X.ix[test_index]এখানে পূর্ণ উদাহরণ দেখুন: quantstart.com/articles/…
ihadanny

12
নতুন সংস্করণে (0.18, সম্ভবত আগে), from sklearn.model_selection import train_test_splitপরিবর্তে আমদানি করুন।
চিহ্নিত করুন

7
সর্বাধিক সায়কিট সংস্করণে আপনাকে এখনই এটি কল করতে হবে:from sklearn.cross_validation import train_test_split
হর্সশো

289

পান্ডসের এলোমেলো নমুনাও কাজ করবে

train=df.sample(frac=0.8,random_state=200) #random state is a seed value
test=df.drop(train.index)

.Index এর অর্থ কী / কোনও ডাটাফ্রেমে .index এর জন্য ডকুমেন্টেশন কোথায়? আমি এটি খুঁজে পাচ্ছি না।
ডেমোনপলি

1
random_stateআরগ কি করছে?
habষভ অগ্রহরি

1
@ Habষভআগ্রহরি এলোমেলোভাবে frac আরগ অনুযায়ী প্রতিবার বিভিন্ন ডেটা বিভক্ত পরিবর্তন করে। আপনি যদি এলোমেলোতা নিয়ন্ত্রণ করতে চান তবে উদাহরণস্বরূপ আপনি নিজের বীজ বলতে পারেন।
মাইকএল

4
এটি স্কেলার্ন আনার চেয়ে আরও ভাল এবং কার্যকর সমাধান হিসাবে কাজ করছে বলে মনে হচ্ছে। এটির চেয়ে ভাল গ্রহণযোগ্য উত্তর না হওয়ার কোনও কারণ আছে কি?
রাজভি

1
@peer যে সীমাবদ্ধতা সহজে প্রতিবিহিত একটি এলোমেলো হয় testসেট হিসাবে এখানে উল্লেখ পছন্দসই stackoverflow.com/questions/29576430/shuffle-dataframe-rowstest=df.drop(train.index).sample(frac=1.0)
অলোক লাল

32

আমি সাইকিট-লার্নের নিজস্ব প্রশিক্ষণ_তিনিষ্ঠ_স্প্লিট ব্যবহার করব এবং এটি সূচক থেকে উত্পন্ন করব

from sklearn.model_selection import train_test_split


y = df.pop('output')
X = df

X_train,X_test,y_train,y_test = train_test_split(X.index,y,test_size=0.2)
X.iloc[X_train] # return dataframe train

3
cross_validationমডিউল বর্তমানে অবচিত হয়েছে:DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
হ্যারি

19

ট্রেন / পরীক্ষা এমনকি বৈধকরণের নমুনা তৈরির অনেকগুলি উপায় রয়েছে।

কেস 1: train_test_splitকোনও বিকল্প ছাড়াই ক্লাসিক উপায় :

from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.3)

কেস 2: খুব ছোট ডেটাসেটের ক্ষেত্রে (<500 টি সারি): এই ক্রস-বৈধতা সহ আপনার সমস্ত লাইনের ফলাফল পাওয়ার জন্য। শেষে, আপনার উপলব্ধ প্রশিক্ষণের সেটটির প্রতিটি লাইনের জন্য একটি পূর্বাভাস থাকবে।

from sklearn.model_selection import KFold
kf = KFold(n_splits=10, random_state=0)
y_hat_all = []
for train_index, test_index in kf.split(X, y):
    reg = RandomForestRegressor(n_estimators=50, random_state=0)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    clf = reg.fit(X_train, y_train)
    y_hat = clf.predict(X_test)
    y_hat_all.append(y_hat)

কেস 3 এ: শ্রেণিবিন্যাসের জন্য ভারসাম্যহীন ডেটাসেট। কেস 1 অনুসরণ করে, এখানে সমতুল্য সমাধান:

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.3)

কেস 3 বি: শ্রেণিবিন্যাসের জন্য ভারসাম্যহীন ডেটাসেট। কেস 2 অনুসরণ করে, এখানে সমতুল্য সমাধান:

from sklearn.model_selection import StratifiedKFold
kf = StratifiedKFold(n_splits=10, random_state=0)
y_hat_all = []
for train_index, test_index in kf.split(X, y):
    reg = RandomForestRegressor(n_estimators=50, random_state=0)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    clf = reg.fit(X_train, y_train)
    y_hat = clf.predict(X_test)
    y_hat_all.append(y_hat)

কেস।: হাইপারপ্যারামিটারগুলি (60% ট্রেন, 20% পরীক্ষা এবং 20% ভাল) টিউন করতে আপনাকে বড় ডেটাতে একটি ট্রেন / পরীক্ষা / বৈধতা সেট তৈরি করতে হবে।

from sklearn.model_selection import train_test_split
X_train, X_test_val, y_train, y_test_val = train_test_split(X, y, test_size=0.6)
X_test, X_val, y_test, y_val = train_test_split(X_test_val, y_test_val, stratify=y, test_size=0.5)

13

আপনি পরীক্ষা এবং ট্রেনের নমুনা তৈরি করতে নীচের কোডটি ব্যবহার করতে পারেন:

from sklearn.model_selection import train_test_split
trainingSet, testSet = train_test_split(df, test_size=0.2)

পরীক্ষার আকার আপনি নিজের পরীক্ষা এবং ট্রেনের ডেটাসেটে যে পরিমাণ ডেটা রাখতে চান তার উপর নির্ভর করে পরিবর্তিত হতে পারে।


7

অনেক বৈধ উত্তর আছে। গুচ্ছটিতে আরও একটি যুক্ত করা হচ্ছে। sklearn.cورس_ বৈধকরণ আমদানি ট্রেন_স্টেস্ট_স্প্লিট থেকে

#gets a random 80% of the entire set
X_train = X.sample(frac=0.8, random_state=1)
#gets the left out portion of the dataset
X_test = X.loc[~df_model.index.isin(X_train.index)]

5

আপনি স্তরিত বিভাগকে প্রশিক্ষণ এবং পরীক্ষার সেট হিসাবে বিবেচনা করতে পারেন। স্টার্টিফায়েড বিভাগ এলোমেলোভাবে প্রশিক্ষণ ও পরীক্ষার সেট জেনারেট করে তবে এমনভাবে যাতে মূল শ্রেণীর অনুপাত সংরক্ষণ করা হয়। এটি প্রশিক্ষণ এবং পরীক্ষার সেটগুলি মূল ডেটাসেটের বৈশিষ্ট্যগুলিকে আরও ভালভাবে প্রতিবিম্বিত করে।

import numpy as np  

def get_train_test_inds(y,train_proportion=0.7):
    '''Generates indices, making random stratified split into training set and testing sets
    with proportions train_proportion and (1-train_proportion) of initial sample.
    y is any iterable indicating classes of each observation in the sample.
    Initial proportions of classes inside training and 
    testing sets are preserved (stratified sampling).
    '''

    y=np.array(y)
    train_inds = np.zeros(len(y),dtype=bool)
    test_inds = np.zeros(len(y),dtype=bool)
    values = np.unique(y)
    for value in values:
        value_inds = np.nonzero(y==value)[0]
        np.random.shuffle(value_inds)
        n = int(train_proportion*len(value_inds))

        train_inds[value_inds[:n]]=True
        test_inds[value_inds[n:]]=True

    return train_inds,test_inds

df [train_inds] এবং df [test_inds] আপনাকে আপনার আসল ডেটা ফ্রেম df এর প্রশিক্ষণ এবং পরীক্ষার সেট দেয়।


তত্ত্বাবধানে শেখার কাজের জন্য এটিই পছন্দনীয় কৌশল।
ভিনসেন্টমাজর

এটি ব্যবহার করার চেষ্টা করার সময় আমি একটি ত্রুটি পাচ্ছি। ভ্যালুআরআর: অ্যাসাইনমেন্টের গন্তব্যটি কেবলমাত্র "np.random.shuffle (value_inds)" লাইনে পঠনযোগ্য
মার্কাস ডব্লিউ

4

আপনার ডেটা সেটে লেবেল কলামের ক্ষেত্রে আপনার ডেটা বিভক্ত করার প্রয়োজন হলে আপনি এটি ব্যবহার করতে পারেন:

def split_to_train_test(df, label_column, train_frac=0.8):
    train_df, test_df = pd.DataFrame(), pd.DataFrame()
    labels = df[label_column].unique()
    for lbl in labels:
        lbl_df = df[df[label_column] == lbl]
        lbl_train_df = lbl_df.sample(frac=train_frac)
        lbl_test_df = lbl_df.drop(lbl_train_df.index)
        print '\n%s:\n---------\ntotal:%d\ntrain_df:%d\ntest_df:%d' % (lbl, len(lbl_df), len(lbl_train_df), len(lbl_test_df))
        train_df = train_df.append(lbl_train_df)
        test_df = test_df.append(lbl_test_df)

    return train_df, test_df

এবং এটি ব্যবহার করুন:

train, test = split_to_train_test(data, 'class', 0.7)

আপনি বিভক্ত র‌্যান্ডমকে নিয়ন্ত্রণ করতে বা কিছু বিশ্বব্যাপী এলোমেলো বীজ ব্যবহার করতে চাইলে আপনি এলোমেলো_স্টেটও পাস করতে পারেন।


3
import pandas as pd

from sklearn.model_selection import train_test_split

datafile_name = 'path_to_data_file'

data = pd.read_csv(datafile_name)

target_attribute = data['column_name']

X_train, X_test, y_train, y_test = train_test_split(data, target_attribute, test_size=0.8)

2
আপনার একটি সংক্ষিপ্ত ভুল আছে। আপনার টার্গেট কলামটি আগে ড্রপ করা উচিত, আপনি এটিকে ট্রেন_স্টেস্ট_স্প্লিটে রেখেছেন। ডেটা = ডেটাড্রপ (কলাম = ['কলাম_নাম'], অক্ষ = 1)
আন্তন এরজমিন

3

আপনি df.sample () ব্যবহার করে নমুনাযুক্ত সারিগুলি বাদ দেওয়ার জন্য ~ (টিল্ড অপারেটর) ব্যবহার করতে পারেন, দুটি সেট পাওয়ার জন্য পান্ডাকে একা নমুনা স্যাম্পলিং এবং ফিল্টারিং পরিচালনা করতে দেয়।

train_df = df.sample(frac=0.8, random_state=100)
test_df = df[~df.index.isin(train_df.index)]

2

যখন আমি ডেটা ফ্রেম বিভক্ত করার প্রয়োজন ছিল তখন এটি আমি লিখেছিলাম। আমি উপরে অ্যান্ডির পদ্ধতির ব্যবহার বিবেচনা করেছি, তবে আমি পছন্দ করি না যে আমি ডেটা সেটগুলির আকারটি ঠিকঠাকভাবে নিয়ন্ত্রণ করতে পারি না (অর্থাত এটি কখনও কখনও 79৯, কখনও কখনও ৮১ ইত্যাদি)।

def make_sets(data_df, test_portion):
    import random as rnd

    tot_ix = range(len(data_df))
    test_ix = sort(rnd.sample(tot_ix, int(test_portion * len(data_df))))
    train_ix = list(set(tot_ix) ^ set(test_ix))

    test_df = data_df.ix[test_ix]
    train_df = data_df.ix[train_ix]

    return train_df, test_df


train_df, test_df = make_sets(data_df, 0.2)
test_df.head()

2

এই জাতীয় df থেকে সীমা সারিটি নির্বাচন করুন

row_count = df.shape[0]
split_point = int(row_count*1/5)
test_data, train_data = df[:split_point], df[split_point:]

3
এটি কেবল তখনই কাজ করবে যদি ডেটা ফ্রেমের ডেটা ইতিমধ্যে এলোমেলোভাবে অর্ডার করা হয়। যদি ডেটাসেটটি আল্টিটল উত্স থেকে উদ্ভূত হয় এবং একই ডেটাফ্রেমে সংযুক্ত করা থাকে তবে উপরেরটি ব্যবহার করে প্রশিক্ষণ / পরীক্ষার জন্য খুব স্কিউ ডেটাসেট পাওয়া সম্ভব।
এমিল এইচ

1
আপনি dataframe এলোমেলো করতে বিভক্ত আগেই stackoverflow.com/questions/29576430/shuffle-dataframe-rows
Makio

1
Absolutelty! যদি আপনি নিজের dfকোডটিতে স্নিপেট যুক্ত করেন (বা হওয়া উচিত) তবে এটি উত্তরটির উন্নতি করবে।
এমিল এইচ

2

উপরে অনেক দুর্দান্ত উত্তর রয়েছে তাই আমি কেবলমাত্র সেই ক্ষেত্রে আরও একটি উদাহরণ যুক্ত করতে চাই যে আপনি কেবল numpyলাইব্রেরি ব্যবহার করে ট্রেন এবং পরীক্ষার সেটগুলির জন্য সঠিক নমুনার সংখ্যা নির্দিষ্ট করতে চান ।

# set the random seed for the reproducibility
np.random.seed(17)

# e.g. number of samples for the training set is 1000
n_train = 1000

# shuffle the indexes
shuffled_indexes = np.arange(len(data_df))
np.random.shuffle(shuffled_indexes)

# use 'n_train' samples for training and the rest for testing
train_ids = shuffled_indexes[:n_train]
test_ids = shuffled_indexes[n_train:]

train_data = data_df.iloc[train_ids]
train_labels = labels_df.iloc[train_ids]

test_data = data_df.iloc[test_ids]
test_labels = data_df.iloc[test_ids]

2

ট্রেন, পরীক্ষা এবং বৈধকরণের মতো দুটিরও বেশি শ্রেণিতে বিভক্ত হওয়ার জন্য, কেউ এটি করতে পারেন:

probs = np.random.rand(len(df))
training_mask = probs < 0.7
test_mask = (probs>=0.7) & (probs < 0.85)
validatoin_mask = probs >= 0.85


df_training = df[training_mask]
df_test = df[test_mask]
df_validation = df[validatoin_mask]

এটি প্রশিক্ষণে প্রায় 70% ডেটা, পরীক্ষায় 15% এবং বৈধতার 15% রাখবে।


1
আপনি "আনুমানিক" যোগ করার জন্য আপনার উত্তরটি সম্পাদনা করতে চাইতে পারেন, আপনি কোডটি চালনা করলে দেখতে পাবেন যে এটি সঠিক শতাংশ থেকে বেশ দূরে থাকতে পারে। উদাহরণস্বরূপ আমি এটি 1000 টি আইটেম দিয়ে চেষ্টা করেছি এবং পেয়েছি: 700, 141, 159 - সুতরাং 70%, 14% এবং 16%।
stason

2

আপনাকে পান্ডাস ডেটাফ্রেমকে নম্পি অ্যারে রূপান্তর করতে হবে এবং তারপরে নম্পি অ্যারেটিকে ডেটাফ্রেমে রূপান্তর করতে হবে

 import pandas as pd
df=pd.read_csv('/content/drive/My Drive/snippet.csv', sep='\t')
from sklearn.model_selection import train_test_split

train, test = train_test_split(df, test_size=0.2)
train1=pd.DataFrame(train)
test1=pd.DataFrame(test)
train1.to_csv('/content/drive/My Drive/train.csv',sep="\t",header=None, encoding='utf-8', index = False)
test1.to_csv('/content/drive/My Drive/test.csv',sep="\t",header=None, encoding='utf-8', index = False)

কোড-কেবল উত্তরগুলি স্ট্যাক ওভারফ্লোতে গ্রহণযোগ্য নয়।
ভিএফডান

1

যদি আপনার ইচ্ছাটি একটি ডেটাফ্র্যাম ইন এবং দুটি ডেটাফ্রেম বেরিয়ে আসে (ন্যাপি অ্যারে নয়) তবে এই কৌশলটি করা উচিত:

def split_data(df, train_perc = 0.8):

   df['train'] = np.random.rand(len(df)) < train_perc

   train = df[df.train == 1]

   test = df[df.train == 0]

   split_data ={'train': train, 'test': test}

   return split_data

1

আপনি df.as_matrix () ফাংশনটি ব্যবহার করতে পারেন এবং নম্পি-অ্যারে তৈরি করে এটি পাস করতে পারেন।

Y = df.pop()
X = df.as_matrix()
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2)
model.fit(x_train, y_train)
model.test(x_test)

1

আমার স্বাদে আরও খানিকটা মার্জিত হ'ল একটি এলোমেলো কলাম তৈরি করা এবং তারপরে এর দ্বারা বিভক্ত হওয়া, এইভাবে আমরা একটি বিভাজন পেতে পারি যা আমাদের প্রয়োজনের সাথে খাপ খায় এবং এলোমেলো হয়ে যায়।

def split_df(df, p=[0.8, 0.2]):
import numpy as np
df["rand"]=np.random.choice(len(p), len(df), p=p)
r = [df[df["rand"]==val] for val in df["rand"].unique()]
return r

0

আমি মনে করি আপনার পরে কলাম যুক্ত করতে চাইলে আপনার একটি অনুলিপি ডেটাফ্রেমের একটি টুকরো নয় get

msk = np.random.rand(len(df)) < 0.8
train, test = df[msk].copy(deep = True), df[~msk].copy(deep = True)

0

এ কেমন? ডিএফ আমার ডেটাফ্রেম

total_size=len(df)

train_size=math.floor(0.66*total_size) (2/3 part of my dataset)

#training dataset
train=df.head(train_size)
#test dataset
test=df.tail(len(df) -train_size)

0

নম্পিতে রূপান্তর করার দরকার নেই। বিভাজনটি করতে কেবল একটি পান্ডাস ডিএফ ব্যবহার করুন এবং এটি একটি পান্ডাস ডিএফ ফিরিয়ে দেবে।

from sklearn.model_selection import train_test_split

train, test = train_test_split(df, test_size=0.2)

0
shuffle = np.random.permutation(len(df))
test_size = int(len(df) * 0.2)
test_aux = shuffle[:test_size]
train_aux = shuffle[test_size:]
TRAIN_DF =df.iloc[train_aux]
TEST_DF = df.iloc[test_aux]

2
আপনি প্রদত্ত কোডটি কীভাবে প্রশ্নের উত্তর দেয় তা যদি আপনি ব্যাখ্যা করেন তবে এটি আরও ভাল উত্তর হবে।
পিপ্পির

যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
শোনাকদে

প্রথম লাইন একটি বদলানো পরিসীমা প্রদান করে (ডাটাফ্রেমের আকারের সাথে)। দ্বিতীয় লাইনটি পরীক্ষার সেটটির কাঙ্ক্ষিত ভগ্নাংশকে উপস্থাপন করে third .Regards।
এলিট ডি জেনারেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.