我正在开发一个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)
您正在描述折叠交叉验证,而
train_test_split
实际上是为“保留”验证而设计的。请阅读 Raschka 2018 了解完整内幕。
GroupKFold
中实现。
通过这种方式,您可以根据需要自行将样本分配到组中,然后使用这些数据来分割数据以进行交叉验证,例如使用
sklearn.model_selection.cross_val_score()
或 sklearn.model_selection.cross_validate()
,如《用户指南》中所述。