如何将我的数据集拆分为测试和训练而不重复?

问题描述 投票:0回答:1

我正在开发一个Python脚本来测试算法。我有一个数据集,需要将其分成 80% 用于训练,20% 用于测试。但是,我想保存测试集以供进一步分析,确保与之前的测试集不重叠。

虽然我的代码总体运行良好,但我遇到了一个问题:测试数据集有时包含由于随机选择过程而在之前的测试运行中已选择的记录。

在此过程结束时,应在其中一次运行中测试所有 100% 的记录

用一个例子来澄清:

  • 第一次运行时,我的数据集
    {0,1,2,3,4,5,6,7,8,9}
    分为训练集
    {0,1,2,4,5,7,8,9}
    和测试集
    {3,6}
  • 第二次运行时,训练集为
    {0,1,2,3,4,5,7,9}
    ,测试集为
    {6,8}

正如你所看到的,记录

{6}
被选择了两次进行测试,这是我想避免的。

如何修改代码以确保每次随机选择 20% 测试集,但排除之前选择的任何记录?

这是当前代码:

df = pd.read_csv("CustomersInfo.csv")
y = df['CustomerRank']
X = df.drop('CustomerRank', axis=1, errors='ignore')


#-------------------------------------------------------------------
#This is the part that need to be fixed
for RandStat in [11, 22, 33, 44, 55]:
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=RandStat)
#-------------------------------------------------------------------



    clf = XGBClassifier(random_state=RandStat)
    clf.fit(X_train, y_train)
    fnStoreAnalyse(y_train)
python machine-learning train-test-split
1个回答
0
投票

您正在描述折叠交叉验证,而

train_test_split
实际上是为“保留”验证而设计的。请阅读 Raschka 2018 了解完整内幕。

为了避免样本出现在多个“折叠”中,您需要分组,例如在

GroupKFold
中实现。

通过这种方式,您可以根据需要自行将样本分配到组中,然后使用这些数据来分割数据以进行交叉验证,例如使用

sklearn.model_selection.cross_val_score()
sklearn.model_selection.cross_validate()
,如《用户指南》中所述。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.