在机器学习和深度学习中,验证集都是很常见的概念。但是显示的验证集似乎在使用sklearn的机器学习的模型上不常见,比如有train_test_split却没有train_validation_test_split。
可能原因之一在于设计者为sklearn提供了交叉验证cross_validation和网格搜索Grid_search,给定参数池、交叉验证的折数和评价方式,就可以直接提供最优参数和最优得分。这一点可以去查阅相应的API。
但,如果想要显示的体现验证集的参数调优,再在测试集上计算泛化误差。
这一点比较适合一些想用机器学习搞时间序列预测的,比如当前期的数据集有6个月,想用前4个月作为训练集,第5个月作为
验证集,测试第6个月的泛化误差。
可以先给定参数池如
RF_params = {'max_depth': [2, 3], 'n_estimators': [30, 50]}
分训练、验证、测试集可以在dataframe上用sample方法,但更方便的是用sklearn的train_test_split:
然后用 train_test_split 先分train_set
和validation_test_set
再用 train_test_split将validation_test_set
分validation_set
和test_set
然后用网格搜索的方式(本质就是暴力搜索)找最优参数和对应的误差(以MAE为例):
best_param = {}
MAE_min = np.inf
for n_tree in RF_params["n_estimators"]:
for depth in RF_params["max_depth"]:
rf = RandomForestRegressor(n_estimators=n_tree, max_depth=depth, n_jobs=2, random_state=0) # 构造
rf.fit(train_X, train_Y) # 训练
pred_val_Y = rf.predict(val_X) # 在验证集上预测
# 计算MAE误差
MAE = metrics.mean_absolute_error(val_Y, pred_val_Y)
if MAE < MAE_min:
MAE_min = MAE
best_param["n_estimators"] = n_tree
best_param["max_depth"] = depth