找回密码
 会员注册
查看: 14|回复: 0

基于Python的机器学习系列(1):交叉验证

[复制链接]

1

主题

0

回帖

4

积分

新手上路

积分
4
发表于 2024-9-11 13:58:33 | 显示全部楼层 |阅读模式
在我们前面的数据科学系列文章中,我们通过两个案例研究(回归和分类)对数据分析和建模进行了详细探讨。在这些基础上,本系列将深入探讨机器学习中的各种技术和方法,旨在帮助读者掌握更复杂的机器学习模型及其应用。        本系列的第一篇文章将重点介绍交叉验证,这是一种用于模型评估和优化的重要技术。通过交叉验证,我们可以更准确地评估模型的性能,并有效避免过拟合和欠拟合问题。交叉验证概述        交叉验证是一种将数据集分成多个子集的方法,以便对模型进行多次训练和测试,从而获得更可靠的性能评估。通过这种方法,我们可以更好地了解模型在不同数据分布下的表现,减少由于数据分割带来的偏差。数据形状要求                在使用Scikit-Learn之前,需要了解数据形状的基本要求。大多数算法需要两个输入,即X和y:X:特征矩阵,形状为[n_samples,n_features]y:目标/标签向量,形状为[n_samples,]或[n_samples,n_targets](取决于算法是否支持多标签)注意:如果X只有一个特征,形状必须是[n_samples,1]而不是[n_samples,]。Scikit-Learn支持numpy和pandas数据,只要形状正确。例如,如果使用pandas,X可以是DataFrame,y可以是Series或DataFrame。Scikit-LearnAPI基础用法使用Scikit-LearnAPI的常见步骤如下:导入模型类通过实例化该类选择模型的超参数将数据安排成特征矩阵和目标向量使用fit()方法将模型拟合到数据上使用predict()方法进行推断实践操作        首先,我们加载一个回归数据集,并进行预处理。importnumpyasnpfromsklearn.datasetsimportload_diabetesfromsklearn.preprocessingimportStandardScalerfromsklearn.model_selectionimporttrain_test_splitdiabetes=load_diabetes()X=diabetes.datay=diabetes.targetX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)scaler=StandardScaler()X_train=scaler.fit_transform(X_train)X_test=scaler.transform(X_test)导入模型类fromsklearn.linear_modelimportLinearRegression选择模型超参数        对于线性回归示例,我们可以实例化LinearRegression类,并指定我们希望通过fit_intercept超参数来拟合截距:model=LinearRegression(fit_intercept=True)model数据安排        确保特征矩阵和目标向量的形状正确:assertlen(X_train.shape)==2andlen(X_test.shape)==2#确保特征矩阵形状正确assertlen(y_train.shape)==1andlen(y_test.shape)==1#确保目标向量形状正确拟合模型model.fit(X_train,y_train)#使用训练集拟合模型进行预测y_hat=model.predict(X_test)#使用测试集进行预测计算均方误差fromsklearn.metricsimportmean_squared_errormean_squared_error(y_test,y_hat)交叉验证的应用        仅使用训练集和测试集进行模型评估并不可靠,因为这可能会导致模型对数据分割方式的偶然性过于敏感。交叉验证通过多次分割数据并重复训练和测试,提供了更可靠的模型评估方法。K折交叉验证        K折交叉验证是一种常见的交叉验证方法,将数据分成K个子集,每次使用其中一个子集进行测试,其余子集用于训练。fromsklearn.model_selectionimportcross_val_scorecross_val_score(model,X_train,y_train,cv=5)#5折交叉验证ShuffleSplit        ShuffleSplit是KFold的一种变体,允许更精细地控制迭代次数和每次分割的样本比例。fromsklearn.model_selectionimportShuffleSplitshuffle_cv=ShuffleSplit(n_splits=5,test_size=0.3,random_state=0)cross_val_score(model,X_train,y_train,cv=shuffle_cv)分层K折交叉验证        分层K折交叉验证确保每个子集中各类样本的比例与原始数据集中相同,适用于分类问题。fromsklearn.model_selectionimportStratifiedKFoldsk_cv=StratifiedKFold(n_splits=3)cross_val_score(model,X_train,y_train,cv=sk_cv)GroupKFold        GroupKFold确保同一组的数据不会同时出现在训练集和测试集中,适用于需要避免组数据泄露的情况。fromsklearn.model_selectionimportGroupKFoldgkf=GroupKFold(n_splits=5)groups=np.random.randint(0,5,size=y_train.shape[0])cross_val_score(model,X_train,y_train,cv=gkf,groups=groups)网格搜索与嵌套交叉验证网格搜索        网格搜索通过自动尝试多种超参数组合,找到模型的最佳配置。fromsklearn.model_selectionimportGridSearchCVparam_grid={'fit_intercept':[True,False],'positive':[True,False]}grid=GridSearchCV(model,param_grid,cv=shuffle_cv,refit=True)grid.fit(X_train,y_train)grid.best_params_嵌套交叉验证        嵌套交叉验证通过将交叉验证嵌套在另一个交叉验证中,进一步提高模型评估的稳定性和可靠性。fromsklearn.model_selectionimportKFoldinner_cv=KFold(n_splits=4,shuffle=True,random_state=1)outer_cv=KFold(n_splits=4,shuffle=True,random_state=1)inner_model=GridSearchCV(model,param_grid=param_grid,cv=inner_cv)nested_score=cross_val_score(inner_model,X,y,scoring='neg_mean_squared_error',cv=outer_cv)nested_score.mean()结语        在本篇文章中,我们详细介绍了交叉验证的基本概念和实际应用。交叉验证是确保模型稳定性和可靠性的关键技术,在机器学习中扮演着重要角色。在接下来的机器学习系列文章中,我们将进一步探讨监督学习、无监督学习、深度学习和强化学习等主题,帮助你全面掌握机器学习的核心技能。        希望你能通过这个系列的学习,深入理解机器学习的原理和应用,提升自己的数据科学技能。如果你对某个主题有特别的兴趣或疑问,欢迎在评论区留言,我们将尽力解答。如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。谢谢大家的支持!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-28 09:01 , Processed in 1.113793 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表