Kaggle学习笔记之交叉验证
Kaggle Intermediate Machine Learning cross validation
交叉验证流程
交叉验证最基本的方法被称之为,k-折交叉验证
。 k-折交叉验证将训练集划分为 k 个较小的集合(folds)。 每一个k
折都会遵循下面的过程:
- 将
k-1
份训练集子集作为 training data (训练集)训练模型, - 将剩余的 1 份训练集子集用于模型验证。
计算每个fold对应的模型效果,取平均值判断模型的整体效果。
使用场景
对于小的数据集或者运行耗时较短的模型来说,交叉验证非常有效。
对于大的数据集,一个单独的验证集就足够了。
也可以先尝试使用交叉验证,判断每个实验的分数是否接近。如果每个实验都产生相同的结果,那么一个验证集可能就足够了。
交叉验证举例
加载数据
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
总结
使用交叉验证可以获得更好的模型质量度量,也不再需要跟踪单独的训练和验证集。