16 ответов:
Я бы просто использовать NumPy и обратно в
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
пакет scikit узнать
train_test_split- это хорошо.import pandas as pd import numpy as np from sklearn.model_selection import train_test_split train, test = train_test_split(df, test_size=0.2)
панды случайная выборка также будет работать
train=df.sample(frac=0.8,random_state=200) test=df.drop(train.index)
Я бы использовал собственный training_test_split scikit-learn и генерировал его из индекса
from sklearn.cross_validation 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
вы можете использовать приведенный ниже код для создания тестовых и обучающих образцов:
from sklearn.model_selection import train_test_split trainingSet, testSet = train_test_split(df, test_size=0.2)размер теста может варьироваться в зависимости от процента данных, которые вы хотите поместить в свой тестовый и обучающий набор данных.
есть много правильных ответов. Добавляя еще один в кучу. от sklearn.cross_validation импорт train_test_split
#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)]
вы также можете рассмотреть стратифицированное разделение на набор обучения и тестирования. Startified division также генерирует набор обучения и тестирования случайным образом, но таким образом, что оригинальные пропорции классов сохраняются. Это позволяет обучающим и тестовым наборам лучше отражать свойства исходного набора данных.
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_indsdf[train_inds] и df[test_inds] дают вам обучающие и тестовые наборы вашего исходного фрейма данных df.
Это то, что я написал, когда мне нужно было разделить таблицу данных. Я рассматривал возможность использования подхода Энди выше, но мне не понравилось, что я не мог точно контролировать размер наборов данных (т. е. иногда это было бы 79, иногда 81 и т. д.).
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()
просто выберите строку диапазона из df, как это
row_count = df.shape[0] split_point = int(row_count*1/5) test_data, train_data = df[:split_point], df[split_point:]
Если вы хотите иметь один фрейм данных и два фрейма данных (не массивы numpy), это должно сделать трюк:
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
Я думаю, что вам также нужно получить копию, а не фрагмент фрейма данных, если вы хотите добавить столбцы позже.
msk = np.random.rand(len(df)) < 0.8 train, test = df[msk].copy(deep = True), df[~msk].copy(deep = True)
вы можете использовать функцию df.as_matrix() и создать Numpy-массив и передать его.
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)
Как насчет этого? df - это мой фрейм данных
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)
Если вам нужно разделить ваши данные относительно столбца lables в вашем наборе данных, вы можете использовать это:
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)вы также можете передать random_state, если вы хотите контролировать случайность разделения или использовать некоторые глобальные случайные семена.
чтобы разделить на более чем два класса, такие как train, test и validation, можно сделать:
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% в проверке.
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)
Comments