分类算法系列③:模型选择与调优 (Facebook签到位置预测)

news2024/11/18 21:49:15

目录

模型选择与调优

1、介绍

模型选择(Model Selection):

调优(Hyperparameter Tuning):

本章重点

2、交叉验证

介绍

为什么需要交叉验证

数据处理

3、⭐超参数搜索-网格搜索(Grid Search)

介绍

API

🔺Facebook签到位置预测K值调优


 🍃作者介绍:准大三网络工程专业在读,努力学习Java,涉猎深度学习,积极输出优质文章

⭐分类算法系列①:初识概念

⭐分类算法系列②:KNN(K-近邻)算法

🍁您的三连支持,是我创作的最大动力🌹

模型选择与调优

1、介绍

在机器学习中,模型选择(Model Selection)和调优(Hyperparameter Tuning)是优化模型性能的关键步骤。模型选择涉及选择合适的算法或模型架构,而调优则涉及调整模型的超参数以达到最佳性能。以下是关于这两个步骤的详细介绍:

模型选择(Model Selection):

模型选择是选择在给定任务中使用哪种算法或模型的过程。不同的算法适用于不同的问题,因此选择适当的算法对于取得良好的性能至关重要。模型选择通常涉及以下步骤:

  1. 问题定义:明确定义要解决的问题,例如分类、回归、聚类等。
  2. 数据准备:对数据进行预处理、清洗和特征工程,以确保数据适用于所选的算法。
  3. 候选模型:根据问题和数据类型,选择几种合适的模型作为候选,例如决策树、支持向量机、神经网络等。
  4. 训练和验证:使用交叉验证等技术,在训练数据上训练候选模型,并在验证集上评估其性能。
  5. 性能比较:比较不同模型在验证集上的性能指标,如准确率、精确度、召回率等。
  6. 选择最佳模型:根据性能比较,选择性能最佳的模型作为最终模型。

调优(Hyperparameter Tuning):

调优是指为机器学习模型选择最佳的超参数,以优化模型的性能。超参数是在训练过程之外设置的参数,它们决定了模型的结构和行为,如学习率、正则化参数、树的深度等。调优的目标是找到使模型在验证集上表现最佳的超参数组合。调优通常包括以下步骤:

  1. 选择超参数空间:选择要调优的超参数和它们的可能取值范围。
  2. 搜索方法:选择超参数搜索方法,如网格搜索、随机搜索、贝叶斯优化等。
  3. 交叉验证:使用交叉验证将数据分为训练集和验证集,以评估不同超参数组合的性能。
  4. 评价指标:选择适当的评价指标来衡量不同超参数组合的性能。
  5. 调优过程:根据选择的搜索方法,不断尝试不同的超参数组合,并记录它们的性能。
  6. 选择最佳组合:从调优过程中选择在验证集上性能最佳的超参数组合作为最终模型的超参数。

模型选择和调优是迭代过程,可能需要多次尝试不同的模型和超参数组合,以找到最适合任务的模型并达到最佳性能。使用交叉验证、可视化工具和自动化调优库(如scikit-learn中的GridSearchCV和RandomizedSearchCV)可以帮助更有效地进行模型选择和调优。

本章重点

本章重点是交叉验证!结合的示例是之前的Facebook签到位置问题,对之前使用KNN算法完成的Facebook签到位置预测进行调优,使其结果更加准确。

2、交叉验证

介绍

交叉验证(Cross-Validation)是一种用于评估机器学习模型性能的技术,它有助于更准确地估计模型在未知数据上的表现。交叉验证通过在不同的数据子集上进行多次训练和验证,提供了对模型泛化性能的更稳定估计。

在传统的训练-测试集划分中,数据被划分为训练集和测试集,然后使用训练集训练模型,使用测试集评估模型性能。然而,这种方法可能因为数据的划分方式而导致评估结果不稳定,特别是在数据量有限的情况下。交叉验证通过将数据划分为多个折(folds),多次进行训练和测试,从而克服了这些问题。

以下是交叉验证的常见方法:

  1. k折交叉验证(k-Fold Cross-Validation)
    • 将数据分为k个大小相似的折(folds)。
    • 每次将其中一个折作为验证集,其他k-1个折作为训练集。
    • 重复这个过程k次,每次选择不同的折作为验证集,其他折作为训练集。
    • 计算k次验证的平均性能作为最终性能评估。
  2. 留一交叉验证(Leave-One-Out Cross-Validation,LOOCV)
    • 将每个样本单独作为一个折,其他样本作为训练集。
    • 执行n次训练和验证,n为样本数量。
    • 计算n次验证的平均性能作为最终性能评估。
    • 适用于小样本数据集,但计算开销较大。
  3. 随机折交叉验证(Stratified k-Fold Cross-Validation)
    • 类似于k折交叉验证,但在划分折时会保持各个类别的比例相同。
    • 对于不均衡的数据集,这种方法可以更好地保持类别分布。

交叉验证的优势在于它能够提供更可靠的模型性能估计,因为每个样本都会被用于训练和验证,减少了数据划分可能引发的偶然性影响。交叉验证还有助于选择合适的模型和调整超参数,从而提高模型的泛化性能。在实际应用中,k折交叉验证是最常用的方法之一,但根据问题的特点和数据集的大小,选择适当的交叉验证方法非常重要。

为什么需要交叉验证

交叉验证目的:为了让被评估的模型更加准确可信

数据处理

一般情况下,数据分为训练集和测试集,但是为了让从训练得到模型结果更加准确。

做以下处理:

  1. 训练集:训练集+验证集
  2. 测试集:测试集

那么对于之前的Facebook签到位置预测问题的k值,如何取得一个合理的值?下面使用超参数搜索-网格搜索(Grid Search)

3超参数搜索-网格搜索(Grid Search)

介绍

超参数网格搜索(Grid Search)是一种常用的超参数调优方法,用于寻找最佳的超参数组合,从而优化机器学习模型的性能。它通过在预定义的超参数空间中搜索所有可能的组合,然后评估每个组合的性能,最终选择性能最佳的组合作为最终的超参数设置。

以下是超参数网格搜索的步骤和原理:

  1. 超参数空间定义: 首先,为模型选择要调优的超参数,并为每个超参数指定可能的取值范围。例如,对于支持向量机,可以选择C(正则化参数)和kernel(核函数类型)作为需要调优的超参数,为它们指定一组候选取值。
  2. 生成网格: 将每个超参数的可能取值组合成一个网格,生成所有可能的超参数组合。这个网格中的每个点都代表一组超参数设置。
  3. 交叉验证: 对于每个超参数组合,使用交叉验证来评估模型在验证集上的性能。通常使用k折交叉验证,对于每个超参数组合,训练模型k次,并计算平均性能指标。
  4. 选择最佳组合: 根据交叉验证的结果,选择性能最佳的超参数组合作为最终的选择。通常根据准确率、F1得分、均方误差等评价指标来衡量性能。
  5. 应用最佳超参数: 使用在步骤4中选择的最佳超参数组合来训练模型,然后在独立的测试集上评估其性能。

超参数网格搜索的优点在于它是一种简单而有效的方法,可以在有限的计算资源下尝试多种超参数组合。然而,网格搜索的缺点是它可能会对计算资源造成较大的负担,特别是在超参数空间较大时。为了提高效率,可以使用随机搜索等方法来在超参数空间中采样,以更快地找到性能较好的超参数组合。

API

sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)

        对估计器的指定参数值进行详尽搜索

        estimator:估计器对象

        param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}

        cv:指定几折交叉验证

        fit:输入训练数据

        score:准确率

结果分析:

        bestscore:在交叉验证中验证的最好结果

        bestestimator:最好的参数模型

        cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果

🔺Facebook签到位置预测K值调优

使用网格搜索估计器,在原来的KNN算法实现Facebook签到位置预测的代码基础上,新的修改如下代码:

# 使用网格搜索和交叉验证找到合适的参数
knn = KNeighborsClassifier()

param = {"n_neighbors": [3, 5, 10]}

gc = GridSearchCV(knn, param_grid=param, cv=2)

gc.fit(x_train, y_train)

print("选择了某个模型测试集当中预测的准确率为:", gc.score(x_test, y_test))

# 训练验证集的结果
print("在交叉验证当中验证的最好结果:", gc.best_score_)
print("gc选择了的模型K值是:", gc.best_estimator_)
print("每次交叉验证的结果为:", gc.cv_results_)

代码解释:

创建KNN分类器:knn = KNeighborsClassifier()

定义超参数空间:param = {"n_neighbors": [3, 5, 10]}

创建GridSearchCV实例,传入KNN分类器实例和定义好的超参数空间,cv=2表示使用2折交叉验证gc = GridSearchCV(knn, param_grid=param, cv=2)

执行网格搜索和交叉验证:gc.fit(x_train, y_train)

评估测试集性能,使用训练好的网格搜索模型在测试集上进行预测并输出准确率:print("选择了某个模型测试集当中预测的准确率为:", gc.score(x_test, y_test))

打印交叉验证结果:

  • gc.best_score_:输出在交叉验证中获得的最佳性能指标。
  • gc.best_estimator_:输出最佳性能对应的模型,包括超参数设置。
  • gc.cv_results_:输出每次交叉验证的结果,包括参数设置和性能指标。

回顾k值交叉验证:

KNN调优全部代码:

# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2023/8/30 23:48
import pandas as pd
from sklearn.model_selection import train_test_split  # 将数据集分割为训练集和测试集。
from sklearn.neighbors import KNeighborsClassifier  # 实现KNN分类器
from sklearn.preprocessing import StandardScaler  # 特征标准化
from sklearn.model_selection import GridSearchCV  # 网格搜索

'''
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
    对估计器的指定参数值进行详尽搜索
    estimator:估计器对象
    param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
    cv:指定几折交叉验证
    fit:输入训练数据
    score:准确率
结果分析:
    bestscore:在交叉验证中验证的最好结果_
    bestestimator:最好的参数模型
    cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果
'''
def knn_GridSearch():
    """
        K近邻算法预测入住位置类别
        :return:
        """
    # 一、处理数据以及特征工程
    # 1、读取收,缩小数据的范围
    data = pd.read_csv("./data/FBlocation/train.csv")
    # 数据逻辑筛选操作 df.query()
    data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")
    # 删除time这一列特征
    data = data.drop(['time'], axis=1)
    print(data)
    # 删除入住次数少于三次位置
    place_count = data.groupby('place_id').count()
    tf = place_count[place_count.row_id > 3].reset_index()
    data = data[data['place_id'].isin(tf.place_id)]
    # 3、取出特征值和目标值
    y = data['place_id']
    # y = data[['place_id']]
    x = data.drop(['place_id', 'row_id'], axis=1)
    # 4、数据分割与特征工程?
    # (1)、数据分割
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
    # (2)、标准化
    std = StandardScaler()
    # 队训练集进行标准化操作
    x_train = std.fit_transform(x_train)
    print(x_train)
    # 进行测试集的标准化操作
    x_test = std.fit_transform(x_test)
    # 二、算法的输入训练预测
    # K值:算法传入参数不定的值    理论上:k = 根号(样本数)
    # K值:后面会使用参数调优方法,去轮流试出最好的参数[1,3,5,10,20,100,200]
    # 使用网格搜索和交叉验证找到合适的参数
    knn = KNeighborsClassifier()
    param = {"n_neighbors": [3, 5, 10]}
    gc = GridSearchCV(knn, param_grid=param, cv=2)
    gc.fit(x_train, y_train)
    print("选择了某个模型测试集当中预测的准确率为:", gc.score(x_test, y_test))
    # 训练验证集的结果
    print("在交叉验证当中验证的最好结果:", gc.best_score_)
    print("gc选择了的模型K值是:", gc.best_estimator_)
    print("每次交叉验证的结果为:", gc.cv_results_)


if __name__ == '__main__':
    knn_GridSearch()

执行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/956121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

合宙Air724UG LuatOS-Air LVGL API控件--图表 (Chart)

图表 (Chart) 一幅图胜过一千个字&#xff0c;通过图表展示出的数据内容能让用户更快速有效的了解数据特征。 代码示例 – 创建图表 chart lvgl.chart_create(lvgl.scr_act(), nil) lvgl.obj_set_size(chart, 200, 150) lvgl.obj_align(chart, nil, lvgl.ALIGN_CENTER, 0, …

聊聊Http服务化改造实践

在微服务架构体系中远程RPC调用主要包括Dubbo与Http调用两个大类&#xff0c;由于Dubbo拥有服务注册中心&#xff0c;并且起服务的命名非常规范&#xff0c;使用包名.类名.方法名进行描述。 而http调用通常都是使用httpclient等相关类库&#xff0c;这些在使用上并没有问题&am…

常见问题。

警告&#xff1a;There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene. 解决&#xff1a;两个摄像机两个audio listeners组件&#xff0c;禁用一个就好了。 错误&#xff1a;Scene ‘xxxxx’ couldn’t be loa…

在 Amazon 搭建无代码可视化的数据分析和建模平台

现代企业常常会有利用数据分析和机器学习帮助解决业务痛点的需求。如制造业中&#xff0c;利用设备采集上来的数据做预测性维护&#xff0c;质量控制&#xff1b;在零售业中&#xff0c;利用客户端端采集的数据做渠道转化率分析&#xff0c;个性化推荐等。 亚马逊云科技开发者…

能直接运营的发接任务平台小程序搭建开发演示

有个项目估计做过互联网的小伙伴都听说过——发接任务平台。 基本每年都有发接任务平台关站&#xff0c;但又有新的平台出来&#xff0c;往复循环&#xff0c;无比热闹。这在互联网圈不常见&#xff0c;互联网项目很多都是风头过去了就结束了&#xff0c;但发接任务年年似乎都…

HTML 播放器效果

效果图 实现代码 <!DOCTYPE HTML> <html><head><title>爱看动漫社区 | 首页 </title><link href"css/bootstrap.css" relstylesheet typetext/css /><!-- jQuery --><script src"js/jquery-1.11.0.min.js"…

进程间通信-Binder

Binder Binder框架概述服务端Binder驱动客户端 设计服务端和客户端设计服务端客户端设计 Binder与ServiceServiceAIDL 保证包裹内参数顺序IMusicPlayerServiceProxyStub 系统服务中的Binder对象ServiceManger管理的服务理解Manger功能快捷键合理的创建标题&#xff0c;有助于目…

19 Linux之Python定制篇-apt软件管理和远程登录

19 Linux之Python定制篇-apt软件管理和远程登录 文章目录 19 Linux之Python定制篇-apt软件管理和远程登录19.1 apt软件管理19.1.1 apt介绍19.1.2 更新软件下载地址-阿里源19.1.3 使用apt完成安装和卸载vim 19.2 远程登录Ubuntu 学习视频来自于B站【小白入门 通俗易懂】2021韩顺…

两个pdf文件合并为一个怎么操作?分享pdf合并操作步骤

不管是初入职场的小白&#xff0c;还是久经职场的高手&#xff0c;都必须深入了解pdf&#xff0c;特别是关于pdf的各种操作&#xff0c;如编辑、合并、压缩等操作&#xff0c;其中合并是这么多操作里面必需懂的技能之一&#xff0c;但是很多人还是不知道两个pdf文件合并为一个怎…

基于材料生成算法优化的BP神经网络(预测应用) - 附代码

基于材料生成算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于材料生成算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.材料生成优化BP神经网络2.1 BP神经网络参数设置2.2 材料生成算法应用 4.测试结果&#xff1a;5…

【Tkinter系列09/15】小部件(Scrollbar

22. 小部件Scrollbar 许多小部件&#xff08;如列表框和画布&#xff09;可以 就像将窗口滑动到更大的虚拟区域一样。你 可以将滚动条小部件连接到它们&#xff0c;为用户提供 相对于内容滑动视图的方式。 下面是带有关联条目小部件的屏幕截图 滚动条小部件&#xff1a; 滚动条…

CSS学习笔记03

CSS笔记03 盒子模型 什么是盒子模型 概念&#xff1a; CSS 盒子模型就是在网页设计中经常用到的一种思维模型&#xff0c;是 CSS 布局的基石&#xff0c;主要规定了元素是如何显示的以及元素间的相互关系。定义所有元素都可以有像盒子一样的平面空间和外形。包含内容区、内边…

汉服网上购物商城穿搭交流的微信小程序的设计与实现

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。手机具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要求的操作系统是非…

Redis项目实战——优惠券秒杀

目录 Redis自增功能解决全局唯一IDRedis实现优惠券秒杀的主要思路实现过程中出现的问题及解决方法超卖问题方案1 悲观锁方案2 乐观锁 一人一单问题分布式锁如何用Redis实现分布式锁&#xff1f; Redis优化秒杀消息队列实现异步秒杀List发布订阅模式Stream Redis自增功能解决全局…

通过RISC-V预认证解决方案应对功能安全挑战

安全之安全(security)博客目录导读 2023 RISC-V中国峰会 安全相关议题汇总 说明&#xff1a;本文参考RISC-V 2023中国峰会如下议题&#xff0c;版权归原作者所有。

Nuxt3_2_SEO and Meta+Transitions

1. SEO and Meta 使用强大的head配置、可组合组件和组件来改善nuxt应用的SEO。 nuxt开箱即用&#xff0c;提供了相同的默认值&#xff0c;如果需要&#xff0c;你可以覆盖这些默认值。 charset: utf-8viewport: widthdevice-width, initial-scale1 可以在nuxt.config.ts中进…

Unity3D 连接 SQLite 作为数据库基础功能【详细图文教程】

一、简单介绍一下SQLite的优势&#xff08;来自ChatGPT&#xff09; 轻量级: SQLite是一个嵌入式数据库引擎&#xff0c;它的库文件非常小巧&#xff0c;没有独立的服务器进程&#xff0c;适用于嵌入到其他应用程序中&#xff0c;对于轻量级的项目或移动应用程序非常适用。零配…

云原生Kubernetes:K8S概述

目录 一、理论 1.云原生 2.K8S 3.k8s集群架构与组件 二、总结 一、理论 1.云原生 &#xff08;1&#xff09;概念 云原生是一种基于容器、微服务和自动化运维的软件开发和部署方法。它可以使应用程序更加高效、可靠和可扩展&#xff0c;适用于各种不同的云平台。 如果…

执行公开网数据采集-技术人员撤退

首先逼逼&#xff0c;此贴仅为秀肌肉&#xff0c;技术人员想学习的话可以绕道了 打开控制台&#xff0c;看cookie&#xff0c;ST&#xff0c;某数 第一个请求412&#xff0c;看VM 然后就是替换js&#xff0c;hook&#xff0c;之类的&#xff0c;扣代码流程&#xff0c;此处省…

C语言:函数原型声明时的参数列表

相关阅读 C语言专栏https://blog.csdn.net/weixin_45791458/category_12423166.html 在C语言中&#xff0c;使用函数前&#xff0c;要么对函数进行了定义&#xff0c;要么对函数原型进行了声明&#xff0c;ANSI C形式的函数原型声明形式如下&#xff1a; void show(char ch, …