Skip to main content
 首页 » 编程设计

python之为什么在手动拆分测试和训练数据时会得到不同的结果,而不是使用 Python 拆分函数

2025年05月04日16虾米哥

如果我通过 train_test_split 函数使用数据运行一个简单的 dtree 回归模型,我会得到不错的 r2 分数和较低的 mse 值。

training_data = pandas.read_csv('data.csv',usecols=['y','x1','x2','x3']) 
y = training_data.iloc[:,0] 
x = training_data.iloc[:,1:] 
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.33) 
regressor = DecisionTreeRegressor(random_state = 0)   
# fit the regressor with X and Y data  
regressor.fit(X_train, y_train) 
y_pred = regressor.predict(X_test) 

然而,如果我手动将数据文件拆分为两个文件 2/3 train 和 1/3 test。有一个名为 human 的列,它给出了 1 到 9 的值,它是人,我使用 human 1-6 进行训练,7-9 进行测试

我得到负的 r2 分数和高的 mse

training_data = pandas.read_csv("train"+".csv",usecols=['y','x1','x2','x3']) 
testing_data  = pandas.read_csv("test"+".csv", usecols=['y','x1','x2','x3']) 
 
y_train = training_data.iloc[:,training_data.columns.str.contains('y')] 
X_train = training_data.iloc[:,training_data.columns.str.contains('|'.join(['x1','x2','x3']))]  
y_test = testing_data.iloc[:,testing_data.columns.str.contains('y')] 
X_test = testing_data.iloc[:,testing_data.columns.str.contains('|'.join(l_vars))]  
 
y_train = pandas.Series(y_train['y'], index=y_train.index) 
y_test = pandas.Series(y_test['y'], index=y_test.index) 
 
regressor = DecisionTreeRegressor(random_state = 0)   
regressor.fit(X_train, y_train) 
y_pred = regressor.predict(X_test) 

我原本期望得到或多或少相同的结果,而且两次调用的所有数据类型似乎都相同。

我错过了什么?

请您参考如下方法:

我假设这里的两种方法实际上都在做您打算做的事情,并且这两种方法的 X_train/test 和 y_train/tests 的形状相同。您可以绘制数据集的基本分布或将您的第二个实现与交叉验证模型进行比较(为了更严格)。


绘制初始训练中标签 (y) 的分布(即制作条形图/密度图)- 测试集与第二个训练集(来自手动实现)。您可以深入研究并绘制数据中的其他列,看看两种实现的结果集之间的数据分布是否有任何不同。如果分布与合理范围不同,您的两个模型之间就会出现差异。如果您的差异很大,则可能是您的标签(或其他列)实际上是针对您的手动实现进行排序的,因此您在比较的数据集中会得到非常不同的分布。

此外,如果您想确保您的手动拆分结果是基于模型结果而不是基础数据分布的“代表性”集(可以很好地概括),我会将其与交叉验证的结果进行比较模型,而不是一组结果。

本质上,尽管概率很小并且 train_test_split 进行了一些改组,但如果运气不好,您基本上可以获得表现良好的“训练/测试”对。 (为了在不进行交叉验证的情况下减少这种情况的可能性,我建议使用 train_test_split 函数的 stratify 参数。那么至少你确定第一个实现“更加努力”以获得平衡的训练/测试对。)

如果您决定交叉验证(使用 test_train_split),您将获得折叠的平均模型预测及其周围的置信区间,并可以检查您的第二个模型结果是否落在该区间内。如果它不再出现,则仅意味着您的拆分实际上以某种方式“损坏”了(例如,通过对值进行排序)。


附言我还要补充一点,决策树是众所周知的过度拟合模型 [1]。也许改用随机森林? (由于引导/装袋,您应该获得更稳定的结果,这将类似于交叉验证以减少过度拟合的机会。)

1 - http://cv.znu.ac.ir/afsharchim/AI/lectures/Decision%20Trees%203.pdf