机器学习day3-KNN算法、模型调优与选择

五 sklearn机器学习概述

1.实例化预估器(估计器)对象(estimator), 预估器对象很多,都是estimator的子类(1)用于分类的预估器sklearn.neighbors.KNeighborsClassifier k-近邻sklearn.naive_bayes.MultinomialNB 贝叶斯sklearn.linear_model.LogisticRegressioon 逻辑回归sklearn.tree.DecisionTreeClassifier 决策树sklearn.ensemble.RandomForestClassifier 随机森林(2)用于回归的预估器sklearn.linear_model.LinearRegression线性回归sklearn.linear_model.Ridge岭回归(3)用于无监督学习的预估器sklearn.cluster.KMeans 聚类
2.进行训练,训练结束后生成模型estimator.fit(x_train, y_train)
3.模型评估(1)方式1,直接对比y_predict = estimator.predict(x_test)y_test == y_predict(2)方式2, 计算准确率accuracy = estimator.score(x_test, y_test)
4.使用模型(预测)
y_predict = estimator.predict(x_true)

六 KNN算法-分类

1.样本距离判断

①.欧式距离
②.曼哈顿距离

2.KNN算法原理

K-近邻算法(K-Nearest Neighbors,简称KNN),根据K个邻居样本的类别来判断当前样本的类别。

(物以类聚,人以群分)

3.KNN缺点

大规模数据集,计算量大。

维度灾难:对于高维数据,距离度量意义不大

合适的k值和距离度量,需要实验调整

4.API

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, algorithm='auto')
参数:                                             
(1)n_neighbors: int, default=5, 默认情况下用于kneighbors查询的近邻数,就是K
(2)algorithm:{‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’。找到近邻的方式,注意不是计算距离的方式,与机器学习算法没有什么关系,开发中请使用默认值'auto'*:关键词参数,*后面的关键词都要写
方法:(1) fit(x, y) 使用X作为训练数据和y作为目标数据  (2) predict(X) 预测提供的数据,得到预测数据   
eg1
#KNN算法
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import numpy as np
import joblib
#获取数据
iris=load_iris()
x,y=iris.data,iris.target
print(x)
print(y)
#对数据集进行分割
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.5,random_state=666)
​
#对x进行标准化处理
stander=StandardScaler()
x_stand=stander.fit_transform(x_train)
x_stande1=stander.transform(x_test)
#创建knn工具
model=KNeighborsClassifier(n_neighbors=5,algorithm='auto')
#训练
model.fit(x_train,y_train)
#预测
y_predict=model.predict(x_test)
print("x_test:\n",x_test)
print("y_target_names\n",iris.target_names)
print("y_predict:\n",y_predict)
print("y_test:\n",y_test)
#评估1
res=y_predict==y_test
print(res)
score=np.sum(res)/len(res)
print(score)#准确率
#评估2
score=model.score(x_test,y_test)
print(score)#准确率
#模型保存
joblib.dump(model,"./model/knn.pkl")
# #推理(detect)
# x_new=[[5.1,3.5,1.4,0.2],[2.1,1.5,4.4,0.2],[5.1,5.5,1.4,5.2],[1.1,2.3,1.4,3.2]]
# x_new_stand=stander.transform(x_new)
# y_detect=model.predict(x_new_stand)
# print("推理的结果",iris.target_names[y_detect])
import joblib
#加载模型
model=joblib.load("./model/knn.pkl")
#推理
x=stander.transform([[1,2,3,3]])
y=model.predict(x)
print(y)

七 模型选择与调优

1.交叉验证

①.保留交叉验证HoldOut

HoldOut Cross-validation(Train-Test Split)整个数据集被随机地划分为训练集和验证集。根据经验法则,整个数据集的近70%被用作训练集,其余30%被用作验证集。(最常使用的直接划分数据集的方法)

优点:简单容易

缺点:不适用于不平衡的数据,一大块数据被剥夺了训练模型的机会

②.K-折交叉验证(K-fold)

(K-fold Cross Validation,记为K-CV或K-fold)

K-Fold交叉验证技术中,整个数据集被划分为K个大小相同的部分。每个分区被称为 一个”Fold”。所以有K个部分,称之为K-Fold。

一个Fold被用作验证集,其余的K-1个Fold被用作训练集。

该技术重复K次,直到每个Fold都被用作验证集,其余的作为训练集。

模型的最终准确度是通过取k个模型验证数据的平均准确度来计算的。

③.分层k-折交叉验证Stratified k-fold

Stratified k-fold cross validation,

K-折交叉验证的变种, 分层的意思是说在每一折中都保持着原始数据中各个类别的比例关系。

④.其他验证

去除p交叉验证) 留一交叉验证) 蒙特卡罗交叉验证 时间序列交叉验证

⑤.API
from sklearn.model_selection import KFold
​
from sklearn.model_selection import StratifiedKFold
​
strat_k_fold=sklearn.model_selection.StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
​
•   n_splits划分为几个折叠 
•   shuffle是否在拆分之前被打乱(随机化),False则按照顺序拆分
•   random_state随机因子
​
indexs=strat_k_fold.split(X,y) 
​
•   返回一个可迭代对象,一共有5个折叠,每个折叠对应的是训练集和测试集的下标
​
•   然后可以用for循环取出每一个折叠对应的X和y下标来访问到对应的测试数据集和训练数据集 以及测试目标集和训练目标集
​
for train_index, test_index in indexs:
​
•   X[train_index]    y[train_index]   X[test_index ]  y[test_index ]
eg2
from sklearn.datasets import load_iris
from sklearn.model_selection import StratifiedKFold
from sklearn.neighbors import KNeighborsClassifier
x,y=load_iris(return_X_y=True)
folder=StratifiedKFold(n_splits=5,shuffle=True,random_state=666)
iter=folder.split(x,y)
knn=KNeighborsClassifier(n_neighbors=7)
score_arr=[]
for train_index,test_index in iter:print(train_index,test_index,'-----------')model=knn.fit(x[train_index],y[train_index])# model.predict(x[test_index])s=model.score(x[test_index],y[test_index])score_arr.append(s)
print(score_arr)
print("平均准备率为:\n",sum(score_arr)/len(score_arr))

2.超参数搜索

超参数搜索也叫网格搜索(Grid Search),能自动的帮助我们找到最好的超参数值。

API
class sklearn.model_selection.GridSearchCV(estimator, param_grid)
​
说明:
同时进行交叉验证(CV)、和网格搜索(GridSearch),GridSearchCV实际上也是一个估计器(estimator),同时它有几个重要属性:best_params_  最佳参数best_score_ 在训练集中的准确率best_estimator_ 最佳估计器cv_results_ 交叉验证过程描述best_index_最佳k在列表中的下标
参数:estimator: scikit-learn估计器实例param_grid:以参数名称(str)作为键,将参数设置列表尝试作为值的字典示例: {"n_neighbors": [1, 3, 5, 7, 9, 11]}cv: 确定交叉验证切分策略,值为:(1)None  默认5折(2)integer  设置多少折如果估计器是分类器,使用"分层k-折交叉验证(StratifiedKFold)"。在所有其他情况下,使用KFold。
eg3
#超参数的选择(网格搜索)
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
model=KNeighborsClassifier()
model=GridSearchCV(estimator=model,param_grid={"n_neighbors":[5,7,9,10]})
x_train,y_train=load_iris(return_X_y=True)
model.fit(x_train,y_train)
model
# best_params_  最佳参数
# best_score_ 在训练集中的准确率
# best_estimator_ 最佳估计器
# cv_results_ 交叉验证过程描述
# best_index_最佳k在列表中的下标
print(model.best_params_)
print(model.best_score_)
print(model.best_estimator_)
#model.best_estimator_.predict()
print(model.cv_results_)
print(model.best_index_)
# 用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
​
def knn_iris_gscv():# 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了,交给GridSearchCV来传递estimator = KNeighborsClassifier()# 加入网格搜索与交叉验证, GridSearchCV会让k分别等于1,2,5,7,9,11进行网格搜索偿试。cv=10表示进行10次交叉验证estimator = GridSearchCV(estimator, param_grid={"n_neighbors": [1, 3, 5, 7, 9, 11]}, cv=10)estimator.fit(x_train, y_train)
​# 5)模型评估# 方法1:直接比对真实值和预测值y_predict = estimator.predict(x_test)print("y_predict:\n", y_predict)print("直接比对真实值和预测值:\n", y_test == y_predict)
​# 方法2:计算准确率score = estimator.score(x_test, y_test)print("在测试集中的准确率为:\n", score)  #0.9736842105263158
​# 最佳参数:best_params_print("最佳参数:\n", estimator.best_params_) #{'n_neighbors': 3}, 说明k=3时最好# 最佳结果:best_score_print("在训练集中的准确率:\n", estimator.best_score_)  #0.9553030303030303# 最佳估计器:best_estimator_print("最佳估计器:\n", estimator.best_estimator_) # KNeighborsClassifier(n_neighbors=3)# 交叉验证结果:cv_results_print("交叉验证过程描述:\n", estimator.cv_results_)#最佳参数组合的索引:最佳k在列表中的下标print("最佳参数组合的索引:\n",estimator.best_index_)#通常情况下,直接使用best_params_更为方便return None
​
knn_iris_gscv()

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

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

相关文章

k8s集群安装(kubeadm)

k8s集群安装(kubeadm) 1、环境准备(master和node节点都执行)1.1、替换yum源1.2、关闭selinux1.3、永久关闭防火墙1.4、永久关闭swap1.5、修改主机名添加host1.6、时间同步1.7、将桥接的IPv4流量传递到iptables的链1.8、docker安装…

使用Matlab建立随机森林

综述 除了神经网络模型以外,树模型及基于树的集成学习模型是较为常用的效果较好的预测模型。我们以下构建一个随机森林模型。 随机森林是一种集成学习方法,通过构建多个决策树并结合其预测结果来提高模型的准确性和稳定性。在MATLAB中,可以…

Wireshark

目录 解题思路 题目设计原理 总结 解题思路 首先下载文件,用 wireshark 打开一头雾水。 但是看看题目的提示,说管理员的密码就是 flag 的内容,我们可以知道,关键词估计是密码,passwd、password、pwd之类的。 所以我…

FreeRTOS学习13——任务相关API函数

任务相关API函数 任务相关API函数任务相关API函数介绍任务相关 API 函数详解函数 uxTaskPriorityGet()函数 vTaskPrioritySet()函数 uxTaskGetSystemState()函数 vTaskGetInfo()函数 xTaskGetApplicationTaskTag()函数 xTaskGetCurrentHandle()函数 xTaskGetHandle()函数 xTask…

使用kalibr_calibration标定相机(realsense)和imu(h7min)

vslam-evaluation/VINS/Installation documentation/4.IMU和相机联合标定kalibr_calibration.md at master DroidAITech/vslam-evaluation GitHub 目录 1.kalibr安装 1.1安装依赖项 1.2创建工作空间 1.3下载kalibr并编译 1.4设置环境变量 2.准备标定板 3.配置驱动和打…

[Docker#8] 容器配置 | Mysql | Redis | C++ | 资源控制 | 命令对比

目录 一:Mysql 容器化安装 二:Redis 容器化安装 Redis 简介 Redis 容器创建 三:C容器制作 四:容器资源更新 常见问题 一:Mysql 容器化安装 进入 mysql 的镜像网站,查找 mysql 的镜像 mysql docker…

1小时构建Vue3知识体系之vue的生命周期函数

本文转载自:https://fangcaicoding.cn/course/12/63 大家好!我是方才,目前是8人后端研发团队的负责人,拥有6年后端经验&3年团队管理经验。 系统学习践行者!近期在系统化输出前端入门相关技术文章,期望能…

数据结构-集合

一.集合的表示 一个重要的操作是查某个元素属于哪个集合,另一个操作是合并操作 从这个树的节点去找树根也就是从下往上找,要把树并起来只需把两个根并在一起就可以了 不存在已知一个节点去找孩子节点,根重要的是已知一个节点找它的父亲节点,与之前的二…

unity基础,点乘叉乘。

简单记录下点乘叉乘&#xff0c;要不每次用完就忘&#xff0c;忘了又查。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class TestCrossDot : MonoBehaviour {/// <summary>/// 原点/// </summary>public Transform t…

springboot 之 整合springdoc2.6 (swagger 3)

版本 springboot 3.3.5 jdk 17 springdoc 2.6.0 依赖pom <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version> </dependency>注解对比…

数据结构与算法-前缀和数组

前缀和问题 什么是前缀和? 对于一个一般数组 nums,如果我们需要知道 S1 nums[0] nums[1]的结果&#xff0c; S2 nums[0] nums[1] nums[2] … 计算公式相当于: S2 S1 nums[2] … Sn Sn-1 nums[n]; 所谓前缀和&#xff1a;用来记录数组前项和的一个新数组&#xff0c;提…

R语言机器学习与临床预测模型77--机器学习预测常用R语言包

R小盐准备介绍R语言机器学习与预测模型的学习笔记 你想要的R语言学习资料都在这里&#xff0c; 快来收藏关注【科研私家菜】 01 预测模型常用R包 常见回归分析包: rpart 包含有分类回归树的方法; earth 包可以实现多元自适应样条回归; mgev包含广义加性模型回归; Rweka 包中的M…

Elasticsearch可视化工具Elasticvue插件用法

目录 1.打开浏览器扩展程序(示例Edge浏览器) ​2.搜索elasticvue并安装 3.打开elasticvue ​4.连接Es 5.有些浏览器无法下载安装扩展&#xff0c;例如谷歌。可以打包扩展给别的浏览器使用。 5.1打开浏览器扩展&#xff0c;打开开发人员模式&#xff0c;记住扩展程序id 5…

大数据技术之HBase中的HRegion

如果你正在学习大数据&#xff0c;你应该知道HBase是一个列式存储的NoSQL分布式数据库&#xff0c;可以配合Hadoop来使用。今天自己简单做了几页PPT&#xff0c;解释了一下HBase当中HRegion的基本概念&#xff0c;很多初学者在学习的时候对HRegion这个概念一直懵懵懂懂&#xf…

Spring Cloud Contract快速入门Demo

1.什么是Spring Cloud Contract &#xff1f; Spring Cloud Contract 是 Spring 提供的一套工具&#xff0c;用于帮助开发者通过契约&#xff08;Contract&#xff09;驱动的方式进行微服务的测试和集成。它主要解决微服务之间通信时&#xff0c;如何确保服务提供者和消费者之…

GISBox VS ArcGIS:分别适用于大型和小型项目的两款GIS软件

在现代地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;有许多大家耳熟能详的GIS软件。它们各自具有独特的优势&#xff0c;适用于不同的行业需求和使用场景。在众多企业和开发者面前&#xff0c;如何选择合适的 GIS 软件成为了一个值得深入思考的问题。今天&#xff…

Linux 进程线程间通信总结

线程 线程共享存储空间主要带来的问题是数据同步和互斥。由于线程在同一进程中运行&#xff0c;它们共享相同的内存空间&#xff0c;任何线程都可以访问共享数据。这样&#xff0c;多个线程并发执行时&#xff0c;可能会导致以下两种主要问题&#xff1a; 互斥问题&#xff0…

【再谈设计模式】抽象工厂模式~对象创建的统筹者

一、引言 在软件开发的世界里&#xff0c;高效、灵活且易于维护的代码结构是每个开发者追求的目标。设计模式就像是建筑蓝图中的经典方案&#xff0c;为我们提供了应对各种常见问题的有效策略。其中&#xff0c;抽象工厂模式在对象创建方面扮演着重要的角色&#xff0c;它如同一…

Web安全之SQL注入---基础

文章目录 SQL注入简介SQL注入基础SQL注入分类SQL注入流程 SQL注入简介 什么是SQL注入&#xff1f; SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理…

机器学习——贝叶斯

&#x1f33a;历史文章列表&#x1f33a; 机器学习——损失函数、代价函数、KL散度机器学习——特征工程、正则化、强化学习机器学习——常见算法汇总机器学习——感知机、MLP、SVM机器学习——KNN机器学习——贝叶斯机器学习——决策树机器学习——随机森林、Bagging、Boostin…