4.sklearn-K近邻算法、模型选择与调优

news2024/11/13 15:21:15

文章目录

  • 环境配置(必看)
  • 头文件引用
    • 1.sklearn转换器和估计器
        • 1.1 转换器 - 特征工程的父类
        • 1.2 估计器(sklearn机器学习算法的实现)
    • 2.K-近邻算法
      • 2.1 简介:
      • 2.2 K-近邻算法API
      • 2.3 K-近邻算法代码
      • 2.4 运行结果
      • 2.5 K-近邻算法优缺点
    • 3.模型选择与调优
      • 3.1 交叉验证(cross validation)
      • 3.2 网格搜索(Grid Search)
      • 3.3 交叉验证,网格搜索(模型选择与调优)API:
      • 3.4 代码
      • 3.5 运行结果
  • 本章学习资源

环境配置(必看)

Anaconda-创建虚拟环境的手把手教程相关环境配置看此篇文章,本专栏深度学习相关的版本和配置,均按照此篇文章进行安装。

头文件引用

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

1.sklearn转换器和估计器

1.1 转换器 - 特征工程的父类
1 实例化 (实例化的是一个转换器类(Transformer))
2 调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)
  标准化:
  		(x - mean) / std	(特征 - 均值)/ 标准差
  		fit_transform()
  		fit()           	计算 每一列的平均值、标准差
  		transform()     	(x - mean) / std进行最终的转换
1.2 估计器(sklearn机器学习算法的实现)
1 实例化一个estimator
2 estimator.fit(x_train, y_train) 计算
  —— 调用完毕,模型生成
3 模型评估:
	1)直接比对真实值和预测值
   		y_predict = estimator.predict(x_test)
        y_test == y_predict
    2)计算准确率
        accuracy = estimator.score(x_test, y_test)

2.K-近邻算法

2.1 简介:

KNN核心思想:
   你的“邻居”来推断出你的类别
    1 K-近邻算法(KNN)原理
      k = 1
      容易受到异常点的影响
   如何确定谁是邻居?
       计算距离:
        	距离公式
        	欧氏距离  --  算法默认的是使用欧式距离
        	曼哈顿距离 绝对值距离
        	明可夫斯基距离

	如果取的k值不一样?会是什么结果?
        k 值取得过小,容易受到异常点的影响
        k 值取得过大,样本不均衡的影响

2.2 K-近邻算法API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

API注释:

n_neighbors:
	int,可选(默认= 5),k_neighbors查询默认使用的邻居数
algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}
	快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。除此之外,用户也可以自己指定搜索算法ball_tree、kd_tree、brute方法进行搜索,
brute:
	是蛮力搜索,也就是线性扫描,当训练集很大时,计算非常耗时。
kd_tree:
	构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树。以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。
ball tree:
	是为了克服kd树高维失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体

2.3 K-近邻算法代码

分析:

  1. x_test = transfer.transform(x_test),测试集只是使用transform进行标准化,是因为要和训练集x_train 做一样的处理,训练集调用transfer.fit_transform()计算出的均值,标准差的值均在模型中,x_test = transfer.transform(x_test)就是直接使用测试集的参数进行计算。
def knn_iris():
    """
    用KNN算法对鸢尾花进行分类
    :return:
    """

    # 1.获取数据
    iris = load_iris()
    # 2.划分数据集  参数:特征值,目标值,随机数种子
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
    # 3.特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)                                 
    # 4.KNN算法预估器  n_neighbors=3就是K值等于3
    estimator = KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train, y_train)
    # 5.模型评估
    # 方法1: 直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print(f"y_predict:\n{y_predict}")
    print(f"直接比对真实值和预测值: {y_test == y_predict}")
    # 方法2: 计算准确率
    score = estimator.score(x_test, y_test)
    print(f"准确率为: {score}")

    return None

2.4 运行结果

在这里插入图片描述

2.5 K-近邻算法优缺点

优点:简单,易于理解,易于实现,无需训练
缺点:
    1)必须指定K值,K值选择不当则分类精度不能保证
    2)懒惰算法,对测试样本分类时的计算量大,内存开销大
    使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试

3.模型选择与调优

3.1 交叉验证(cross validation)

交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中一份作为验证集。然后经过4()的测试,每次都更换
不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。

在这里插入图片描述

3.2 网格搜索(Grid Search)

通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。
每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。

在这里插入图片描述

3.3 交叉验证,网格搜索(模型选择与调优)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:每次交叉验证后的验证集准确率结果和训练集准确率结果

3.4 代码

def knn_iris_gscv():
    """
    用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
    :return:
    """

    # 1.获取数据
    iris = load_iris()

    # 2.划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=20)

    # 3.特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4.KNN算法预估器
    estimator = KNeighborsClassifier()

    # 加入网格搜索和交叉验证
    # 参数准备
    param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}   # 网格搜索
    # cv=10 代表10折运算(交叉验证)
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)
    estimator.fit(x_train, y_train)

    # 5.模型评估
    # 方法1: 直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print(f"y_predict:\n{y_predict}")
    print(f"直接比对真实值和预测值: {y_test == y_predict}")
    # 方法2: 计算准确率
    score = estimator.score(x_test, y_test)
    print(f"准确率为: {score}")

    # 最佳参数:
    print("最佳参数: \n", estimator.best_params_)
    # 最佳结果:
    print("最佳结果: \n", estimator.best_score_)
    # 最佳参数:
    print("最佳估计器: \n", estimator.best_estimator_)
    # 交叉验证结果:
    print("交叉验证结果: \n", estimator.cv_results_)
    return None

3.5 运行结果

在这里插入图片描述

本章学习资源

黑马程序员3天快速入门python机器学习
我是跟着视频进行的学习,欢迎大家一起来学习!

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

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

相关文章

uni-app插槽(默认插槽,命名插槽,作用域插槽)

目录 什么是插槽? 基本概念 默认插槽 命名插槽 作用域插槽 场景一:子插槽向父组件传递一个字符串 场景二:子插槽向父组件传递对象 什么是插槽? 在 UniApp 中,插槽(Slot)是一种允许父组件向子组件特定位置插入HTML内容的方式。这种方式使得组…

ROS 2 Jazzy和QT组合开发教程

ROS2 Jazzy和QT组合开发教程 ROS2 和 Qt 组合开发是一个强大且灵活的组合,可以用来构建具有 GUI 的机器人应用程序。这个组合让你能够将 Qt 的图形界面与 ROS 2 的分布式通信功能结合在一起,实现数据的展示、机器人控制、调试等功能。 环境如下&#x…

掌握人事管理,这张报表帮你轻松搞定

在人事管理中,数据分析的重要性不言而喻。无论是了解员工的整体情况,还是洞察人才流失的原因,数据都能为我们提供有力的支持。但是,面对海量的数据,很多HR都会感到不知所措。那么,如何通过一张报表解决所有…

数字化转型升级探索(三)

在数字化转型升级的探索过程中,我们将通过深入应用人工智能、物联网、大数据和云计算等技术,全面重塑业务流程和运营模式,推动信息流、业务流和价值流的高度融合,实现从传统手工操作到智能自动化的全方位升级,提升业务…

【Python报错已解决】`SyntaxError`:`invalid syntax`

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言 在Python编程中,SyntaxError是最常见的错误类型之一,它表示代码中存在语法错误。本文将探讨一个具…

★ 算法OJ题 ★ 力扣202 - 快乐数

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起做一道双指针算法题--快乐数~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 题⽬告诉我们&#xff0c;当我们不断重复操作…

数字化转型升级探索(四)

在数字化转型升级的探索中&#xff0c;我们将致力于通过整合先进的技术手段&#xff0c;如人工智能、区块链、大数据和云计算&#xff0c;全面改造传统业务模式&#xff0c;实现智能化运营和数据驱动决策&#xff0c;从而提高企业的效率与灵活性&#xff1b;通过实施全新的数字…

【微处理器系统原理与设计应用入门】典型的微处理器及系统

一. 基于微处理器的系统结构 首先明确什么是处理器&#xff1f; 我们在设计一个系统完成一个功能时&#xff0c;必不可少的一个环节就是信息处理&#xff0c;我们人脑处理信息是依靠神经系统传递神经冲动&#xff0c;而对于机器而言需要指令来完成信息处理&#xff0c;所以一…

Golang 小项目(3)

Golang 小项目(3) 前言 本项目适合 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 前往 torna.top 免费查阅 项目结构 D:. ├─ go.mod ├─ go.sum │ ├─cmd │ └─main │ main.go │ └─pkg├─config│ app.go│…

CSDN的技术人员真牛,3分钟定位到问题所在

加密社 昨天晚上&#xff0c;我为了方便写文后一键同步至我的其他账号&#xff0c;安装了个浏览器插件 然后今天一来&#xff0c;我发现csdn的内容管理-创作者平台打不开了 我试了各种办法&#xff0c; 包括清缓存&#xff0c;换浏览器重试&#xff0c;换网络&#xff0c;重…

14%电抗器可以过滤几次谐波

14%电抗器&#xff08;也称为14%阻抗电抗器&#xff09;是一种用于限制电流谐波的设备&#xff0c;主要通过增加系统的阻抗来减少谐波电流的幅度。它的“14%”表示电抗器的阻抗相对于电力变压器的额定阻抗的比例&#xff0c;即电抗器的阻抗是变压器阻抗的14%。 一、谐波过滤能力…

【递归深搜之记忆化搜索算法】

1. 斐波那契数 解法一&#xff1a;递归 class Solution { public:int fib(int n) {return dfs(n);}int dfs(int n){if(n 0 || n 1)return n;return dfs(n - 1) dfs(n - 2);} }; 解法二&#xff1a;记忆化搜索 class Solution {int nums[31]; // 备忘录 public:int fib(int …

carbonyl浏览器使用

仓库 carbonyl上提供了两种在线方式安装&#xff0c;一是docker方式 $ docker run --rm -ti fathyb/carbonyl https://youtube.com另一种是 $ npm install --global carbonyl $ carbonyl https://github.com此外还提供了mac和linux的二进制包&#xff0c;可直接下载运行。 二…

[BFS广度优先搜索] 迷宫

描述 给定一个仅由数字 0 与 1 组成的 n 行 m 列的迷宫。若你位于一格 0 上&#xff0c;那么你可以移动到相邻 4 格中的任意一格 1 上&#xff1b;同样地&#xff0c;若你位于一格 1 上, 那么你可以移动到相邻 4 格中的任意一格 0 上。 现在&#xff0c;有 q 次询问。每次询问…

11.STL

STL阶段 禁止复制 文本查询扩展作业解析 get_file函数的作用就是进行预处理操作&#xff0c;将文件中的每一行的内容放在shared_ptr<vector<string>> file里面进行存储&#xff1b;然后对每一个单词进行处理&#xff0c;将单词与行号放在map<string, shared_p…

【C/C++】C++类与对象基本概念(抽象封装、类的定义与使用、构造函数、析构函数、静态成员、友元)

目录 七、类与对象基本概念7.1 抽象7.2 类的定义与声明7.3 访问控制7.4 类的实现与使用7.5 对象指针、this指针与对象引用7.6 构造函数7.7 析构函数7.8 拷贝构造函数7.9 类类型作为函数参数7.10 对象数组7.11 静态成员7.12 常对象与常成员&#xff08;const&#xff09;7.13 友…

金融知识普及月答题活动

金融知识普及月答题活动 关键词&#xff1a;金融安全、风险防范、金融常识、反诈宣传 推荐功能&#xff1a;答题、倡议书 宣传角度&#xff1a; 1. 普及金融知识&#xff1a;讲解货币、信用、利率、汇率等基本金融概念&#xff0c;以及储蓄、贷款、信用卡、保险等常见金融产…

揭秘Xinstall:如何降低你的App推广成本?

在移动互联网时代&#xff0c;App推广成为了每个开发者都必须面对的问题。然而&#xff0c;随着市场竞争的加剧&#xff0c;App推广成本也水涨船高&#xff0c;让许多开发者望而却步。今天&#xff0c;我们就来聊聊如何借助Xinstall这一神器&#xff0c;有效降低App推广成本&am…

电商人必看:1个工具,5倍效率,批量处理图片就是这么简单

作为电商运营者或经常处理图片的你&#xff0c;是否厌倦了繁琐的图片编辑工作&#xff1f;今天&#xff0c;我要分享一个实用的解决方案——图片批量处理工具。 神器介绍&#x1f447; 千鹿设计助手&#xff0c;是一款轻量级、功能非常丰富的设计插件工具合集软件。 拥有多款…

宏集MIRO-L230工业路由器: 一站式全球联网解决方案

在日益互联的世界中&#xff0c;全球覆盖的稳定连接已成为业务成功的关键因素。宏集非常高兴地向您介绍我们的最新创新产品——MIRO-L230工业路由器&#xff0c;这是一款为现代企业量身定制的LTE路由器&#xff0c;为用户带来前所未有的稳定连接体验。 宏集MIRO-L230工业路由器…