Kaggle学习笔记之交叉验证

Kaggle Intermediate Machine Learning cross validation

交叉验证流程

交叉验证最基本的方法被称之为,k-折交叉验证 。 k-折交叉验证将训练集划分为 k 个较小的集合(folds)。 每一个k折都会遵循下面的过程:

  • k-1份训练集子集作为 training data (训练集)训练模型,
  • 将剩余的 1 份训练集子集用于模型验证。

计算每个fold对应的模型效果,取平均值判断模型的整体效果。

grid_search_cross_validation.png

使用场景

对于小的数据集或者运行耗时较短的模型来说,交叉验证非常有效。

对于大的数据集,一个单独的验证集就足够了。

也可以先尝试使用交叉验证,判断每个实验的分数是否接近。如果每个实验都产生相同的结果,那么一个验证集可能就足够了。

交叉验证举例

加载数据

import pandas as pd

# Read the data
data = pd.read_csv('../input/melbourne-housing-snapshot/melb_data.csv')

# Select subset of predictors
cols_to_use = ['Rooms', 'Distance', 'Landsize', 'BuildingArea', 'YearBuilt']
X = data[cols_to_use]

# Select target
y = data.Price

Pipeline 插补缺失值和建立模型

from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer

my_pipeline = Pipeline(steps=[('preprocessor', SimpleImputer()),
                              ('model', RandomForestRegressor(n_estimators=50,
                                                              random_state=0))
                             ])

评估交叉验证结果

cross_val_score() 函数获取交叉验证得分,其中cv表示folds数,scoring选择一种评估模型质量的方式,scikit-learn得到的是负值,所以乘以-1。

from sklearn.model_selection import cross_val_score

# Multiply by -1 since sklearn calculates *negative* MAE
scores = -1 * cross_val_score(my_pipeline, X, y,
                              cv=5,
                              scoring='neg_mean_absolute_error')

print("MAE scores:\n", scores)
MAE scores:
 [301628.7893587  303164.4782723  287298.331666   236061.84754543
 260383.45111427]
print("Average MAE score (across experiments):")
print(scores.mean())
Average MAE score (across experiments):
277707.3795913405

总结

使用交叉验证可以获得更好的模型质量度量,也不再需要跟踪单独的训练和验证集。

posted @ 2022-03-19 16:41  ikventure  阅读(217)  评论(0编辑  收藏  举报