Day18_【机器学习—交叉验证与网格搜索】
一、 交叉验证 (Cross Validation)
- 目的:更准确、可靠地评估模型性能,减少因单次数据划分带来的随机性偏差。
- 核心思想(以K折交叉验证为例):
- 将训练数据平均分成K份。
- 进行K轮训练和验证:每轮使用其中1份作为验证集,其余K-1份作为训练集。
- 计算K轮验证结果(如准确率)的平均值,作为模型的最终评估分数。
- 关键点:它本身不提升模型性能,而是提供一个更可信的性能评估。
二、网格搜索 (Grid Search)
- 目的:自动寻找模型的最优超参数组合(如KNN中的K值)。
- 核心思想:
- 定义一个包含多个超参数及其候选值的参数网格(字典)。
- 网格搜索会穷举所有可能的参数组合。
- 对每一个参数组合,都使用交叉验证来评估其性能。
- 选择交叉验证得分最高的参数组合作为最优超参数。
- 关键点:它是超参数调优的自动化方法,通常与交叉验证紧密结合。
三、. 二者关系与整合 (GridSearchCV)
- 协同工作:网格搜索利用交叉验证来评估每个超参数组合的性能,确保选出的“最优”参数是稳定可靠的。
- API体现:在
scikit-learn
中,GridSearchCV
这一个API就整合了两者:estimator
:要调优的模型。param_grid
:超参数网格(字典)。cv
:指定交叉验证的折数。
- 输出:
best_params_
:找到的最优超参数。best_score_
:最优参数在交叉验证下的平均得分。best_estimator_
:使用最优参数训练好的最终模型。
一句话总结: 交叉验证用于可靠评估模型,网格搜索利用交叉验证来自动寻找模型的最佳超参数,二者结合 (GridSearchCV
) 是机器学习模型调优的标准流程。
四、在线数据集 鸢尾花案例
def model_precdit_evaluate():# 获取鸢尾花数据iris_data=load_iris()# 数据基本处理——数据分割为训练集和测试集x_train,x_test,y_train,y_test=train_test_split(iris_data.data,iris_data.target,test_size=0.2,random_state=22)#特征工程——特征列标准化transfer=StandardScaler()x_train=transfer.fit_transform(x_train)# 测试集不使用fit,目的就是 避免数据泄露,更详细来说是为了测试集的信息不应该影响模型效果,从而得到更准确的模型评估结果x_test=transfer.transform(x_test)#模型训练 分类处理es=KNeighborsClassifier()parm_dict={'n_neighbors':[i for i in range(1,20)]}es=GridSearchCV(es,parm_dict,cv=4)es.fit(x_train,y_train)# 打印最优的超参组合print(f"最优评分:{es.best_score_}") # 最优组合的平均分print(f"最优超参组合:{es.best_params_}") # 最优超参组合(供参考)print(f"最优的估计器对象:{es.best_estimator_}") # 最优组合的模型对象print(f"具体交叉验证结果:{es.cv_results_}") # 所有组合的 评估结果(过程)#模型预测y_predict=es.best_estimator_.predict(x_test)print("查看预测对比")print(y_test)print(y_predict)#模型评估print(f"预测精度:{accuracy_score(y_test,y_predict)}")
if __name__ == '__main__':model_precdit_evaluate()