如果我们有一个数据集,我们通保留20%作为验证集,其余作为训练集。但是我们训练的模型可能在这个验证集表现很好,在其他数据上表现不好。
通常情况下,验证集越大,我们的模型质量度量中的随机性(也就是“噪声”)就越小,它就越可靠。不幸的是,我们只能通过从我们的训练数据中删除行来获得一个大的验证集,而更小的训练数据集意味着更糟糕的模型!
交叉验证:例如,我们将数据等分成五份,实验一用第一份作为验证集,其余部分作为训练集。实验二用第二份作为验证集,其余作为训练集。以此类推,重复直到每一份都做了验证集。最后我们得到了基于整个数据集的模型质量度量。
交叉验证提供了更准确的模型质量度量,如果您正在做出许多建模决策,则这一点尤为重要。然而,它可能需要更长的运行时间,因为它估计了多个模型。
1.对于小数据集,在这些数据集中,额外的计算负担并不是什么大问题,您应该使用交叉验证。
2.对于较大的数据集,一个验证集就足够了。你的代码将运行得更快,并且您可能有足够的数据,因此没有必要使用交叉验证。
假设我们已经加载了数据X,y.
预处理和定义模型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))
])
使用交叉验证
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')#使用负MAE然后乘以-1
print("MAE scores:\n", scores)
print("Average MAE score (across experiments):")
print(scores.mean())#求平均值