我在 sklearn 的RandomForestRegressor的帮助下尝试在波士顿数据集上使用随机森林算法来预测房价。medv
只是为了评估模型的性能有多好,我用下面的代码尝试了 sklearn 的学习曲线
train_sizes = [1, 25, 50, 100, 200, 390] # 390 is 80% of shape(X)
from sklearn.model_selection import learning_curve
def learning_curves(estimator, X, y, train_sizes, cv):
train_sizes, train_scores, validation_scores = learning_curve(
estimator, X, y, train_sizes = train_sizes,
cv = cv, scoring = 'neg_mean_squared_error')
#print('Training scores:\n\n', train_scores)
#print('\n', '-' * 70) # separator to make the output easy to read
#print('\nValidation scores:\n\n', validation_scores)
train_scores_mean = -train_scores.mean(axis = 1)
print(train_scores_mean)
validation_scores_mean = -validation_scores.mean(axis = 1)
print(validation_scores_mean)
plt.plot(train_sizes, train_scores_mean, label = 'Training error')
plt.plot(train_sizes, validation_scores_mean, label = 'Validation error')
plt.ylabel('MSE', fontsize = 14)
plt.xlabel('Training set size', fontsize = 14)
title = 'Learning curves for a ' + str(estimator).split('(')[0] + ' model'
plt.title(title, fontsize = 18, y = 1.03)
plt.legend()
plt.ylim(0,40)
如果你注意到我已经过去了,而X, y不是。X_train, y_trainlearning_curve
我不明白我应该通过X, y还是只将训练子集传递X_train, y_train给learning_curve.
更新 1
Dimensions of my Train/Test split (75%:Train and 25%:Test)
X.shape: (489, 11)
X_train.shape: (366, 11)
X_test.shape: (123, 11)
我有几个关于工作的其他问题learning_curve
测试数据集的大小是否根据列表中提到的训练数据集的大小而变化,
train_sizes或者它总是固定的(根据训练/测试拆分为 123 个样本,在我的情况下为 25%),例如- 什么时候
train dataset size = 1测试数据大小是488还是123(X_test的大小) - 什么时候
train dataset size = 25测试数据大小是464还是123(X_test的大小) - 什么时候
train dataset size = 50测试数据大小是439还是123(X_test的大小)
- 什么时候
更新 2
在博客中,数据集有 9568 个观察值,博主将整个数据集传递X给learning_curve.
train_sizes = [1, 100, 500, 2000, 5000, 7654]
在第一次迭代中,当train_size是 1 那么test_size应该是9567,但他为什么这么说
但在验证集(有 1914 个实例)上进行测试时,MSE 飙升至大约 423.4。
第一次迭代不应该test_size是 9567 而不是 1914
在第二次迭代中,当train_size为 100 时,test_size应该是9468
我的意思是如果我错了,test_size将根据纠正我的变化train_size