热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ML学习笔记20210824分类算法模型选择与调优

3.模型选择和调优3.1交叉验证定义目的为了让模型得精度更加可信3.2超参数搜索GridSearch对K值进行选择。k[1,2,3,4,5,6]循环遍历搜索。API参数1&
3. 模型选择和调优

3.1 交叉验证


  1. 定义
    在这里插入图片描述
    在这里插入图片描述
  2. 目的为了让模型得精度更加可信

3.2 超参数搜索 Grid Search


  1. 对K值进行选择。k=[1,2,3,4,5,6]循环遍历搜索。
  2. API
    参数1:传入预估器。
    参数2:超参数得取值,字典类型,{‘超参数名称’:[参数列表]}
    参数3:cv 几折交叉验证
    返回值:可查看最佳参数啥的。
    在这里插入图片描述

3.3 鸢尾花案例增加K值调优

def KNN_optimal(): # 模型选择和调优# 网格搜索和交叉验证x_train, x_test, y_train, y_test = load_data()estimator = KNeighborsClassifier() # 默认都是欧式距离, 采用的是minkowski推广算法,p=1是曼哈顿, p=2是欧式, 而默认值为2# 开始调优# 第一个参数是estimator# 第二个是估计器参数,参数名称(字符串)作为key,要测试的参数列表作为value的字典,或这样的字典构成的列表# 第三个是指定cv=K, K折交叉验证# https://www.cnblogs.com/dblsha/p/10161798.htmlparam_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)# 结束调优estimator.fit(x_train, y_train)# 传入测试值通过前面的预估器获得预测值y_predict = estimator.predict(x_test)print("预测值为:", y_predict, "\n真实值为:", y_test, "\n比较结果为:", y_test == y_predict)score = estimator.score(x_test, y_test)print("准确率为: ", score)# ------------------print("最佳参数:\n", estimator.best_params_)print("最佳结果:\n", estimator.best_score_)print("最佳估计器:\n", estimator.best_estimator_)print("交叉验证结果:\n", estimator.cv_results_)# -----------------以上是自动筛选出的最佳参数, 调优结果return None

3.4 预测 facebook 签到位置


  • 数据集介绍
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • . 流程分析
    1)获取数据
    2)数据处理:
  • 特征值:x
  • 目标值:y
  • a.缩小范围:2
  • b.time -> 年月日时分秒
  • c.过滤签到次数少的地点
    3)特征工程:特征提取,特征预处理:标准化,特征降维
    4)算法训练:KNN算法得预估流程
    5)模型评估:模型选择与调优
    6)应用

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScalerdef load_data():data &#61; pd.read_csv("../../resources/FBlocation/train.csv")# data &#61; data.query("x<2.5 & x>1 & y<1.5 & y>1.0") # query 方法处理数据data &#61; data.copy()# 处理时间特征time_value &#61; pd.to_datetime(data["time"], unit&#61;"s") # 通用datetime时间类型数据date &#61; pd.DatetimeIndex(time_value) # 转换为可筛选的时间格式data["day"] &#61; date.daydata["weekday"] &#61; date.weekdaydata["hour"] &#61; date.hour# 过滤签到次数少的地点print("计数count统计\n", data.groupby("place_id").count()) # 展示为可观测列表数据, 这里计数, 并且后面的所有的字段数据全是代表出现的总次数place_count &#61; data.groupby("place_id").count()["row_id"] # 签到place的次数统计, 方便直观展示而只过滤place和次数, row_id是随便加的, 现在所有字段都代表count值, 所以可以取其他的也行print("签到place的次数统计\n", place_count)place_count[place_count > 3] # 过滤所有数据筛选出签到(这里是row_id>3)次数大于3的print("过滤所有数据,筛选出签到次数大于10的\n", place_count[place_count > 10])data["place_id"].isin(place_count[place_count > 3].index.values) # 布尔值索引print("布尔值索引\n", data["place_id"].isin(place_count[place_count > 10].index.values))final_data &#61; data[data["place_id"].isin(place_count[place_count > 10].index.values)] # 通过布尔索引筛选print("处理后的data:\n", final_data)return final_datadef implement():used_data_x &#61; load_data()[["x", "y", "accuracy", "day", "weekday", "hour"]]used_data_y &#61; load_data()["place_id"]x_train, x_test, y_train, y_test &#61; \train_test_split(used_data_x, used_data_y)transfer &#61; StandardScaler()x_train &#61; transfer.fit_transform(x_train)x_test &#61; transfer.transform(x_test)estimator &#61; KNeighborsClassifier()param_dict &#61; {"n_neighbors": [5, 10, 15, 20]}estimator &#61; GridSearchCV(estimator, param_grid&#61;param_dict, cv&#61;4)estimator.fit(x_train, y_train) # 训练集里面的数据和目标值# 传入测试值通过前面的预估器获得预测值y_predict &#61; estimator.predict(x_test)print("预测值为:", y_predict, "\n真实值为:", y_test, "\n比较结果为:", y_test &#61;&#61; y_predict)score &#61; estimator.score(x_test, y_test)print("准确率为: ", score)# ------------------print("最佳参数:\n", estimator.best_params_)print("最佳结果:\n", estimator.best_score_)print("最佳估计器:\n", estimator.best_estimator_)print("交叉验证结果:\n", estimator.cv_results_)# -----------------以上是自动筛选出的最佳参数, 调优结果return Noneif __name__ &#61;&#61; &#39;__main__&#39;:implement()


推荐阅读
  • 掌握Mosek矩阵运算,轻松应对优化挑战
    本篇文章继续深入探讨Mosek学习笔记系列,特别是矩阵运算部分,这对于优化问题的解决至关重要。通过本文,您将了解到如何高效地使用Mosek进行矩阵初始化、线性代数运算及约束域的设定。 ... [详细]
  • 交互式左右滑动导航菜单设计
    本文介绍了一种使用HTML和JavaScript实现的左右可点击滑动导航菜单的方法,适用于需要展示多个链接或项目的网页布局。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • 深入理解KMP算法及其应用
    本文详细介绍了KMP算法的原理和实现方法,包括如何计算next数组以及如何利用next数组进行高效的字符串匹配。 ... [详细]
  • 本文探讨了如何使用pg-promise库在PostgreSQL中高效地批量插入多条记录,包括通过事务和单一查询两种方法。 ... [详细]
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
  • LambdaMART算法详解
    本文详细介绍了LambdaMART算法的背景、原理及其在信息检索中的应用。首先回顾了LambdaMART的发展历程,包括其前身RankNet和LambdaRank,然后深入探讨了LambdaMART如何结合梯度提升决策树(GBDT)和LambdaRank来优化排序问题。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • 详细指南:使用IntelliJ IDEA构建多模块Maven项目
    本文在前两篇文章的基础上,进一步指导读者如何在IntelliJ IDEA中创建和配置多模块Maven项目。通过详细的步骤说明,帮助读者掌握项目模块化管理的方法。 ... [详细]
  • 前文|功能型_品读鸿蒙HDF架构
    前文|功能型_品读鸿蒙HDF架构 ... [详细]
  • 本文概述了五种常用的查找算法:线性查找、二分查找、二叉搜索树查找、哈希查找和索引查找。每种方法都有其适用场景和性能特点。 ... [详细]
  • Docker入门与实践指南
    本文介绍了Docker的基础知识,包括其作为开源应用容器引擎的特点,以及如何利用Docker将应用程序及其依赖项打包成轻量级的容器镜像。同时,还详细讲解了Docker的核心概念、安装过程及基本命令操作。 ... [详细]
  • 本文概述了算法的基础概念,包括时间复杂度的计算规则,以及常见的递归算法的时间复杂度分析。同时,详细介绍了数组和链表的基本特性及其操作的时间复杂度,并提供了几个关于链表操作的具体示例。最后,探讨了栈和队列的概念及其应用,包括如何利用这些数据结构解决实际问题。 ... [详细]
  • 随着技术的发展,黑客开始利用AI技术在暗网中创建用户的‘数字孪生’,这一现象引起了安全专家的高度关注。 ... [详细]
author-avatar
大航
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有