一、 交叉验证 (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()