blu*_*blu 6 python scikit-learn train-test-split
这里已经有一个关于如何通过train_test_split进行分层训练/测试分裂的描述(分层训练/在scikit-learn中测试分裂)以及如何通过np.split进行随机训练/验证/测试分裂的描述(如何将数据分成3组(训练,验证和测试)?).但是如何进行分层训练/验证/测试分割呢.
对于进行分层(类标签)训练/验证/测试分割而想到的最接近的近似值如下,但我怀疑有一种更好的方法可以在一个函数调用中或以更准确的方式实现:
假设我们想要进行60/20/20列车/验证/测试拆分,那么我目前的方法是首先进行60/40分层拆分,然后在前40个进行50/50 stratifeid拆分,最终得到一个60/20/20分层分裂.
from sklearn.cross_validation import train_test_split
SEED = 2000
x_train, x_validation_and_test, y_train, y_validation_and_test = train_test_split(x, y, test_size=.4, random_state=SEED)
x_validation, x_test, y_validation, y_test = train_test_split(x_validation_and_test, y_validation_and_test, test_size=.5, random_state=SEED)
Run Code Online (Sandbox Code Playgroud)
如果我的方法是正确的和/或你有更好的方法,请回来.
谢谢
小智 5
解决方案是仅使用 StratifiedShuffleSplit 两次,如下所示:
from sklearn.model_selection import StratifiedShuffleSplit
split = StratifiedShuffleSplit(n_splits=1, test_size=0.4, random_state=42)
for train_index, test_valid_index in split.split(df, df.target):
train_set = df.iloc[train_index]
test_valid_set = df.iloc[test_valid_index]
split2 = StratifiedShuffleSplit(n_splits=1, test_size=0.5, random_state=42)
for test_index, valid_index in split2.split(test_valid_set, test_valid_set.target):
test_set = test_valid_set.iloc[test_index]
valid_set = test_valid_set.iloc[valid_index]
Run Code Online (Sandbox Code Playgroud)
是的,我就是这么做的——跑train_test_split()两次。将第一个视为分割训练集,然后该训练集可能会被分成不同的折叠或保留。
事实上,如果您最终使用包含内置交叉验证的 scikit 模型来测试您的模型,您甚至可能不需要再次显式运行train_test_split()。如果您使用(非常方便!)model_selection.cross_val_score功能,也是如此。
| 归档时间: |
|
| 查看次数: |
4899 次 |
| 最近记录: |