回答:
私は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]
?私はここでpythonコード自体を理解したいと思います
np.random.rand(len(df))
は、len(df)
[0、1]の範囲でランダムかつ均一に分散されたfloat値を持つサイズの配列です。< 0.8
比較要素単位適用され、代わりに結果を格納します。したがって、値<0.8となりTrue
、値> = 0.8になるFalse
scikit learntrain_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行)の場合:この相互検証ですべてのラインの結果を取得するため。最後に、使用可能なトレーニングセットの行ごとに1つの予測があります。
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)
テストのサイズは、テストに入れてデータセットをトレーニングするデータの割合によって異なります。
また、トレーニングとテストセットへの層別分割を検討することもできます。Startified除算では、トレーニングとテストのセットがランダムに生成されますが、元のクラスの比率は維持されます。これにより、トレーニングセットとテストセットが元のデータセットのプロパティをより適切に反映します。
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のトレーニングセットとテストセットを提供します。
データセットのラベル列に関してデータを分割する必要がある場合は、これを使用できます。
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を渡すこともできます。
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()を使用してサンプリングされた行を除外し、パンダのみがインデックスのサンプリングとフィルタリングを処理できるようにして、2つのセットを取得できます。
train_df = df.sample(frac=0.8, random_state=100)
test_df = df[~df.index.isin(train_df.index)]
これは、DataFrameを分割する必要があるときに書いたものです。上記のアンディのアプローチを使用することを検討しましたが、データセットのサイズを正確に制御できなかった(つまり、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
ライブラリーだけを使用してトレインセットとテストセットの正確なサンプル数を指定する場合は、もう1つ例を追加したいと思います。
# 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]
トレーニング、テスト、検証などの3つ以上のクラスに分割するには、次のようにします。
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)
私の好みにもう少しエレガントなのは、ランダムな列を作成してから分割することです。これにより、ニーズに合ったランダムな分割を取得できます。
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
これはどう?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)
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]
常に同じ結果を返します。