Day18_【机器学习—交叉验证与网格搜索】

一、 交叉验证 (Cross Validation)

  • 目的:更准确、可靠地评估模型性能,减少因单次数据划分带来的随机性偏差。
  • 核心思想 (以K折交叉验证为例):
    1. 将训练数据平均分成K份
    2. 进行K轮训练和验证:每轮使用其中1份作为验证集其余K-1份作为训练集
    3. 计算K轮验证结果(如准确率)的平均值,作为模型的最终评估分数。
  • 关键点:它本身不提升模型性能,而是提供一个更可信的性能评估。

二、网格搜索 (Grid Search)

  • 目的 :自动寻找模型的最优超参数组合(如KNN中的K值)。
  • 核心思想
    1. 定义一个包含多个超参数及其候选值的参数网格(字典)。
    2. 网格搜索会穷举所有可能的参数组合
    3. 每一个参数组合 ,都使用交叉验证来评估其性能。
    4. 选择交叉验证得分最高的参数组合作为最优超参数。
  • 关键点:它是超参数调优的自动化方法,通常与交叉验证紧密结合。

三、. 二者关系与整合 (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()