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

目录

模型选择与调优

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.mzph.cn/news/61719.shtml

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

相关文章

Maven报错 [ERROR] Malformed \uxxxx encoding.

IDEA刷新项目&#xff0c;报错[ERROR] Malformed \uxxxx encoding. 现象 1.控制台报错 [ERROR] Malformed \uxxxx encoding.2.项目代码大部分爆红 3.Pom文件不爆红 4.IDEA未能构建Dependencies 尝试清除IDEA缓存无效&#xff0c;重新克隆项目无效&#xff0c;更换低版本mav…

Vue2里监听localstorage里值的变化

有的时候,我们需要根据本地缓存在localstorage里值的变化做出相应的操作,这就需要我们监听localstorage: 首先,我们在src下的libs文件夹下新建一个stroage.js用于重写setItem事件,当使用setItem的时候,触发,window.dispatchEvent派发事件 const Stroage = {// 重写set…

考生作弊行为分析算法

考生作弊行为分析系统利用pythonyolo系列网络模型算法框架&#xff0c;考生作弊行为分析算法利用图像处理和智能算法对考生的行为进行分析和识别&#xff0c;经过算法服务器的复杂计算和逻辑判断&#xff0c;算法将根据考生行为的特征和规律&#xff0c;判定是否存在作弊行为。…

Git基础教程-常用命令整理:学会Git使用方法和错误解决

目录 一、了解Git的基本概念 二、Git的安装和配置 Git的安装 Git的配置 用户信息 文本编辑器 差异分析工具 查看配置信息 三、Git的基本操作 基本原理 基本操作命令 基本操作示例 场景一&#xff1a;创建新仓库 场景二&#xff1a;拉取并编辑远程仓库 四、常见问…

开源PHP 代挂机源码,可对接QQ、网易云、哔哩哔哩、QQ空间、等级加速等等

本程序运行环境PHP5.6 95dg/config.php修改系统数据库 进入数据库绑定 你搭建的域名即可 部署完成 进入数据库 找到data 输入绑定授权域名即可进行授权打开此网站 网站是无对接接口 需要您自行找对接接口即可 本源码有点乱 有实力的铁铁 可以修改一下哦&#xff01;

Spring MVC介绍

MVC模式是什么 MVC 模式&#xff0c;全称为 Model-View-Controller&#xff08;模型-视图-控制器&#xff09;模式&#xff0c;它是一种软件架构模式&#xff0c;其目标是将软件的用户界面&#xff08;即前台页面&#xff09;和业务逻辑分离&#xff0c;使代码具有更高的可扩展…

造测试数据

对应sql&#xff1a; from openpyxl import Workbook from faker import Faker# 创建一个Workbook对象 workbook Workbook() # 获取默认的活动工作表 sheet workbook.active# 创建一个Faker对象 fake Faker()# 写入表头 header [Name, Address, Email] sheet.append(heade…

ChatGPT 与 Python进行动态可视化分析

Python数据分析目前最为热门的岗位操作。 想使用Python进行可视化分析,但是又不想写代码,测试,验证。可以交给ChatGPT,open AI 来进行操作。 这样的动态图显示,我们只需要给ChatGPT发送一个指令,人工智能就能很快的实现这一操作。 请使用Python与Echarts做一个动态可视…

【LeetCode】3. 无重复字符的最长子串

3. 无重复字符的最长子串&#xff08;中等&#xff09; 方法&#xff1a;滑动窗口 哈希表 思路 这道题主要用到思路是&#xff1a;滑动窗口 什么是滑动窗口&#xff1f; 其实就是一个队列,比如例题中的 abcabcbb&#xff0c;进入这个队列&#xff08;窗口&#xff09;为 ab…

Vue安装过程的困惑解答——nodejs和vue关系、vue的项目结构

文章目录 一、为什么在使用vue前要下载nodejs&#xff1f;二、为什么安装nodejs后就能使用NPM包管理工具&#xff1f;三、为什么是V8引擎并且使用C实现&#xff1f;四、为什么会安装淘宝镜像&#xff1f;五、什么是webpack模板&#xff0c;为什么需要他&#xff1f;六、vue项目…

GIT命令只会抄却不理解?看完原理才能事半功倍!

系列文章目录 手把手教你安装Git&#xff0c;萌新迈向专业的必备一步 GIT命令只会抄却不理解&#xff1f;看完原理才能事半功倍&#xff01; 系列文章目录一、Git 的特征1. 文件系统2. 分布式 二、GIT的术语1. 区域术语2. 名词术语1. 提交对象2. 分支3. HEAD4. 标签&#xff0…

无涯教程-Android - Linear Layout函数

Android LinearLayout是一个视图组&#xff0c;该视图组将垂直或水平的所有子级对齐。 Linear Layout - 属性 以下是LinearLayout特有的重要属性- Sr.NoAttribute & 描述1 android:id 这是唯一标识布局的ID。 2 android:baselineAligned 此值必须是布尔值&#xff0c;为…

chatGPT训练过程

强化学习基础 强化学习是指智能体在不确定环境中最大化其获得的奖励从而达到自主决策的目的。其执行过程为&#xff1a;智能体依据策略决策从而执行动作&#xff0c;然后感知环境获取环境的状态&#xff0c;进而得到奖励(以便下次再到相同状态时能采取更优的动作)&#xff0c;…

(数学) 剑指 Offer 39. 数组中出现次数超过一半的数字 ——【Leetcode每日一题】

❓ 剑指 Offer 39. 数组中出现次数超过一半的数字 难度&#xff1a;简单 数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输…

matlab使用教程(26)—常微分方程的求解

1.求解非刚性 ODE 本页包含两个使用 ode45 来求解非刚性常微分方程的示例。MATLAB 提供几个非刚性 ODE 求解器。 • ode45 • ode23 • ode78 • ode89 • ode113 对于大多数非刚性问题&#xff0c;ode45 的性能最佳。但对于允许较宽松的误差容限或刚度适中的问题&…

DataLoader的使用

示例代码&#xff1a; import torchvision from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter# 准备的测试数据集 test_data torchvision.datasets.CIFAR10("./dataset", trainFalse, transformtorchvision.transforms.…

控制goroutine 的并发执行数量

goroutine的数量上限是1048575吗&#xff1f; 正常项目&#xff0c;协程数量超过十万就需要引起重视。如果有上百万goroutine&#xff0c;一般是有问题的。 但并不是说协程数量的上限是100多w 1048575的来自类似如下的demo代码: package mainimport ( "fmt" "ma…

CXL 内存交织(Memory Interleaving)

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

Web后端开发(请求响应)上

请求响应的概述 浏览器&#xff08;请求&#xff09;<--------------------------(HTTP协议)---------------------->&#xff08;响应&#xff09;Web服务器 请求&#xff1a;获取请求数据 响应&#xff1a;设置响应数据 BS架构&#xff1a;浏览器/服务器架构模式。…

uniapp项目实战系列(3):底部导航栏与头部导航栏的配置

目录 系列往期文章&#xff08;点击跳转&#xff09;uniapp项目实战系列(1)&#xff1a;导入数据库&#xff0c;启动后端服务&#xff0c;开启代码托管&#xff08;点击跳转&#xff09;uniapp项目实战系列(2)&#xff1a;新建项目&#xff0c;项目搭建&#xff0c;微信开发工具…