답변:
나는 단지 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
rand
하는 < 0.8
균일 0과 1 사이의 임의의 숫자를 분산 반환하기 때문에 이해
in[12]
, in[13]
, in[14]
? 여기에서 파이썬 코드 자체를 이해하고 싶습니다
np.random.rand(len(df))
는 len(df)
[0, 1] 범위의 임의적이고 균일하게 분포 된 float 값을 가진 크기의 배열입니다 . 는 < 0.8
장소에 비교 결과 소자 와이즈 저장을인가한다. 따라서 값 <0.8이 True
되고 값> = 0.8이됩니다False
scikit learn 'strain_test_split
는 좋은 것입니다.
from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.2)
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/...
from sklearn.model_selection import train_test_split
대신 가져옵니다 .
from sklearn.cross_validation import train_test_split
팬더 랜덤 샘플도 작동합니다
train=df.sample(frac=0.8,random_state=200) #random state is a seed value
test=df.drop(train.index)
random_state
arg 는 무엇을 하고 있습니까?
test
여기서 지적 세트가 요구된다 stackoverflow.com/questions/29576430/shuffle-dataframe-rows . test=df.drop(train.index).sample(frac=1.0)
scikit-learn 자신의 training_test_split을 사용하여 색인에서 생성합니다.
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
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.
학습 / 테스트 및 검증 샘플을 작성하는 방법에는 여러 가지가 있습니다.
사례 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)
사례 3a : 분류 목적을위한 불균형 데이터 세트. 사례 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)
사례 3b : 분류 목적을위한 불균형 데이터 세트. 사례 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)
사례 4 : 하이퍼 파라미터 (60 % 트레인, 20 % 테스트 및 20 % Val)를 튜닝하려면 빅 데이터에 트레인 / 테스트 / 검증 세트를 생성해야합니다.
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)
아래 코드를 사용하여 테스트 및 교육 샘플을 만들 수 있습니다.
from sklearn.model_selection import train_test_split
trainingSet, testSet = train_test_split(df, test_size=0.2)
시험 크기는 시험 및 훈련 데이터 세트에 넣을 데이터의 백분율에 따라 달라질 수 있습니다.
계층화 된 훈련 및 테스트 세트를 고려할 수도 있습니다. 시작 부서는 또한 무작위로 교육 및 테스트 세트를 생성하지만 원래 클래스 비율이 유지됩니다. 이를 통해 훈련 및 테스트 세트가 원래 데이터 세트의 속성을 더 잘 반영합니다.
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]는 원본 DataFrame df의 교육 및 테스트 세트를 제공합니다.
데이터 세트의 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)
split randomness를 제어하거나 global random seed를 사용하려는 경우 random_state를 전달할 수도 있습니다.
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)
~ (물결 연산자)를 사용하여 df.sample ()을 사용하여 샘플링 된 행을 제외하고 팬더 만 인덱스의 샘플링 및 필터링을 처리하여 두 세트를 얻을 수 있습니다.
train_df = df.sample(frac=0.8, random_state=100)
test_df = df[~df.index.isin(train_df.index)]
이것은 DataFrame을 분할해야 할 때 쓴 것입니다. 위의 Andy의 접근 방식을 사용하는 것을 고려했지만 데이터 세트의 크기를 정확하게 제어 할 수 없다는 점은 마음에 들지 않았습니다 (예 : 때로는 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:]
df
코드 스 니펫에 추가하면 (또는 셔플해야합니다) 대답이 향상됩니다.
위의 많은 훌륭한 답변이 있으므로 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]
학습, 테스트 및 유효성 검사와 같은 둘 이상의 클래스로 분할하기 위해 다음을 수행 할 수 있습니다.
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 %의 데이터가 추가됩니다.
팬더 데이터 프레임을 numpy 배열로 변환 한 다음 numpy 배열을 데이터 프레임으로 다시 변환해야합니다
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)
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]
msk
DTYPE이며bool
,df[msk]
,df.iloc[msk]
그리고df.loc[msk]
항상 같은 결과를 반환합니다.