机器学习基础03

目录

1.KNN算法-分类

1.1样本距离判断

1.1.1欧式距离

1.1.2曼哈顿距离

1.2KNN 算法原理

1.3KNN缺点

1.4API

2.模型选择与调优

2.1保留交叉验证

2.2K-折交叉验证

2.3分层k-折交叉验证Stratified k-fold

2.4其它验证 

2.5API

3.模型保存与加载

3.1保存模型

3.2加载模型

4.超参数搜索


1.KNN算法-分类

1.1样本距离判断

1.1.1欧式距离

1.1.2曼哈顿距离

二维平面

1.2KNN 算法原理

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

如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于

这个类别。

1.3KNN缺点

(1)对于大规模数据集,计算量大。

(2)对于高维数据,距离度量可能变得不那么有意义,这就是所谓的“维度灾难”

(3)需要选择合适的k值和距离度量。

1.4API

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

参数:                                             
(1)n_neighbors: 
        默认为:5,n_neighbors就是 KNN中的K
(2)algorithm:
    {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’。找到近邻的方式:排列后存储的数据结构。
示例

# 导入库
import numpy as np
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.decomposition import PCA# 加载数据集
dataSet = load_wine()
# print(data.data)
# print(data.feature_names)# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(dataSet.data,dataSet.target,train_size=0.7, random_state=44)# 数据集标准化
transfer1 = StandardScaler()
standard_x_train = transfer1.fit_transform(x_train)
standard_x_test = transfer1.transform(x_test)
# print(standard_x_train )
# print(standard_x_test)# 数据降维
transfer2 = PCA(n_components=5)
pca_x_train=transfer2.fit_transform(standard_x_train)
pca_x_test=transfer2.transform(standard_x_test)
# print(pca_x_train )
# print(pca_x_test)# 模型训练
transfer3=KNeighborsClassifier(n_neighbors=7)
estimator =transfer3.fit(pca_x_train,y_train)# 模型测试# 模型评估
# 方法一:调用predict(),对比预测值与真实值
y_predict = estimator.predict(pca_x_test)
result = y_predict==y_test
# print(result)
accuracy_radio=np.sum(result)/len(result)
print(accuracy_radio)# 方法二:调用score()查看准确率
accuracy_radio2=estimator.score(pca_x_test,y_test)
print(accuracy_radio2)

2.模型选择与调优

2.1保留交叉验证

HoldOut Cross-validation(Train-Test Split)

在这种交叉验证技术中,整个数据集被随机地划分为训练集和验证集。根据经验法则,整个数据集的近70%被用作训练集,其余30%被用作验证集。也就是我们最常使用的,直接划分数据集的方法。

优点:很简单很容易执行。

缺点1:①不适用于不平衡的数据集。②可能有数据没有训练模型的机会。

from sklearn.model_selection import train_test_split

x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.7,shuffle=True,random_state=44)

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifierx,y = load_iris(return_X_y=True)
# print(b)# 数据标准化处理器
standar_transfer = StandardScaler()# k邻近分类器
classifier =KNeighborsClassifier(n_neighbors=7)# 保留交叉验证   
x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.7,shuffle=True,random_state=44)standard_x_train =standar_transfer.fit_transform(x_train)
standard_x_test =standar_transfer.transform(x_test)# 训练模型
classifier.fit(standard_x_train,y_train)# 输出每次折叠的准确性得分
score = classifier.score(standard_x_test,y_test)print(score)

2.2K-折交叉验证

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

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

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

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

2.3分层k-折交叉验证Stratified k-fold

Stratified k-fold cross validation,

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

2.4其它验证 

(1)去除p交叉验证
(2)留一交叉验证
(3)蒙特卡罗交叉验证
(4)时间序列交叉验证

2.5API

from sklearn.model_selection import StratifiedKFold

from sklearn.model_selection import KFold

strat_k_fold=sklearn.model_selection.StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

k_fold=sklearn.model_selection.KFold(n_splits=5, shuffle=True, random_state=42)

参数:

n_splits划分为几个折叠 ​

shuffle是否在拆分之前被打乱(随机化),False则按照顺序拆分 ​

random_state随机因子

indexs1=strat_k_fold.split(X,y)

indexs2=k_fold.split(X,y)

返回一个可迭代对象,一共有n_splits个折叠,每个折叠对应的是训练集和测试集的下标

然后可以用for循环取出每一个折叠对应的X和y下标来访问到对应的测试数据集和训练数据集 以及测试目标集和训练目标集

for train_index, test_index in indexs1:

        x[train_index],x[test_index ]=train_index, test_index

        y[train_index ],y[test_index ]=train_index, test_index

for train_index, test_index in indexs2:

        x[train_index],x[test_index ]=train_index, test_index

        y[train_index ],y[test_index ]=train_index, test_index

 StratifiedKFold示例:

from sklearn.model_selection import StratifiedKFold
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifierx,y = load_iris(return_X_y=True)
# print(b)fold1 = StratifiedKFold(n_splits=5,shuffle=True,random_state=44)# 数据标准化处理器
standar_transfer = StandardScaler()# k邻近分类器
classifier =KNeighborsClassifier(n_neighbors=7)# 分层K折叠交叉验证
accuracies =[]
for train_index,test_index in fold1.split(x,y):# print(train_index)# print(test_index)x_train,x_test = x[train_index],x[test_index]y_train,y_test = y[train_index],y[test_index]standard_x_train =standar_transfer.fit_transform(x_train)standard_x_test =standar_transfer.transform(x_test)# 训练模型classifier.fit(standard_x_train,y_train)# 输出每次折叠的准确性得分score = classifier.score(standard_x_test,y_test)# print(score)accuracies.append(score)print(sum(accuracies)/len(accuracies))
del accuracies

KFold示例:

from sklearn.model_selection import KFold
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifierx,y = load_iris(return_X_y=True)
# print(b)fold1 = StratifiedKFold(n_splits=5,shuffle=True,random_state=44)
fold2 = KFold(n_splits=5,shuffle=True,random_state=44)# 数据标准化处理器
standar_transfer = StandardScaler()# k邻近分类器
classifier =KNeighborsClassifier(n_neighbors=7)# K折叠交叉验证   
accuracies2 =[]
for train_index,test_index in fold2.split(x,y):# print(train_index)# print(test_index)x_train,x_test = x[train_index],x[test_index]y_train,y_test = y[train_index],y[test_index]standard_x_train =standar_transfer.fit_transform(x_train)standard_x_test =standar_transfer.transform(x_test)# 训练模型classifier.fit(standard_x_train,y_train)# 输出每次折叠的准确性得分score = classifier.score(standard_x_test,y_test)# print(score)accuracies2.append(score)print(sum(accuracies2)/len(accuracies2))
del accuracies2

3.模型保存与加载

3.1保存模型

joblib.dump(estimator,model_path)

参数:

estimator:估计器名

model_path:模型存储路径

3.2加载模型

estimator = joblib.load(model_path)

参数: 

model_path:模型存储路径

import joblib
# 保存模型
joblib.dump(estimator,'model/wine.pkl')# 加载模型
estimator = joblib.load('./model/wine.pkl')# 输入数据,用模型进行预测
y_predict= estimator.predict([[0.89221896, -1.92495677, -0.24116668, 0.19771249, 0.93709413]])
wine_type = dataSet.target_names[y_predict]
print(wine_type)

4.超参数搜索

超参数:即 可人为设置的参数

超参数搜索也叫网格搜索(Grid Search)

比如在KNN算法中,k是一个可以人为设置的参数,所以就是一个超参数。网格搜索能自动的帮助我们找到最好的超参数值。

class sklearn.model_selection.GridSearchCV(estimator, param_grid)

参数:
    estimator: scikit-learn估计器实例
    param_grid:以参数名称(str)作为键,将参数设置列表尝试作为值的字典
        示例: {"n_neighbors": [1, 3, 5, 7, 9, 11]}
    cv: 确定交叉验证切分策略,值为:
        (1)None  默认5折
        (2)integer  设置多少折
        如果估计器是分类器,使用"分层k-折交叉验证(StratifiedKFold)"。在所有其他情况下,使用KFold。

说明:
同时进行交叉验证(CV) 和 网格搜索(GridSearch),GridSearchCV实际上也是一个估计器(estimator),同时它有几个重要属性

best_params_最佳参数
best_score_best_score_
best_estimator_最佳估计器
cv_results_交叉验证过程描述
best_index_最佳k在列表中的下标
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier# 加载数据集
dataSet = load_breast_cancer()# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(dataSet.data, dataSet.target, train_size=0.7, random_state=8)# 数据标准化
scaler = StandardScaler()
standard_x_train = scaler.fit_transform(x_train)
standard_x_test = scaler.transform(x_test)# 特征降维
pca = PCA(n_components=10)
pca_x_train = pca.fit_transform(standard_x_train)
pca_x_test = pca.transform(standard_x_test)# knn预估器,n_neighbors不传参
knn = KNeighborsClassifier()# 超参数搜索器
grid_search = GridSearchCV(knn, param_grid={'n_neighbors': [1, 3, 5, 7, 9]}, cv=10)# 模型训练
grid_search.fit(pca_x_train, y_train)# 模型测试与评估
best_model = grid_search.best_estimator_
y_predict = best_model.score(pca_x_test, y_test)
print(f"Mean_score: {y_predict}")
print(f"Best_params_: {grid_search.best_params_}")
print(f"Best_score_: {grid_search.best_score_}")
print(f"Best_estimator_: {grid_search.best_estimator_}")
print(f"Best_results_: {grid_search.cv_results_}")
# print(type(grid_search.cv_results_))
print(f"Best_index_: {grid_search.best_index_}")

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

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

相关文章

【go从零单排】go语言中testing的几种类型

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 Go 语言中的 testing 包是用于编写和运行测试的标准库。它提供了丰富的功能&…

[笔记]自动化中破解验证码

01需求分析 1.打开一个chrome浏览器 2.输入论坛的网址: http://114.116.2.138:8090/forum.php 3.输入用户名admin 4.输入密码123456 5.点击登录 6.输入验证码 7.再点击登录 02准备工作 selenium环境搭建 参考地址: https://blog.csdn.net/python_jeff/article/details…

2024下半年软考系统架构设计师案例分析题试题与答案

解析中包含所有真题图片 解析中包含所有真题图片 解析中包含所有真题图片 解析中包含所有真题图片 第一题 解析见(点我):https://blog.csdn.net/u014624241/article/details/143701384 第二题 解析见(点我)&#…

使用 Python 和 Selenium 解决 hCaptcha:完整指南

如果你跟我一样,你可能也曾遇到过在抓取数据或自动化任务时试图绕过 hCaptcha 的挫折感。你懂的,hCaptcha 弹出来,你的脚本就戛然而止。但别担心!我们都经历过。好消息是,用 Python 和 Selenium 解决 hCaptcha 挑战并不…

[HAOI2015] 树上染色(树形 DP)

题目传送门https://www.luogu.com.cn/problem/P3177 解题思路 设 表示以 为根的子树染 个黑点的最大收益值。 设一共有 个节点,要染 个点。 完成 DP 状态的设计后,开始推导转移方程…… 对于一个点 ,它下面有一条通向 ,权…

Python学习从0到1 day28 Python 高阶技巧 ⑧ 递归

那就祝我们爬不同的山,还能回到同一条路上,不是时时见面,但是时时惦记之人 —— 24.11.13 递归 1.什么是递归 递归在编程中是一种非常重要的算法 递归:即方法(函数)自己调用自己的一种特殊编程写法 函数调用自己,即…

代码随想录算法训练营第二十二天|491.递增子序列、46.全排列、47.全排列 II

491.递增子序列 题目链接:. - 力扣(LeetCode) 文章讲解:代码随想录 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦…

二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,null,2] 输出…

要读文献 | Acta Pharmacol Sin | 上海药物所徐华强团队发表综述:基于生成扩散模型的 AI 驱动抗体设计

近日,来自中国科学院上海药物研究所的徐华强团队在 Acta Pharmacologica Sinica 发表综述文章“AI-driven antibody design with generative diffusion models: current insights and future directions”。文章主要讨论了基于生成扩散模型的抗体设计的最新进展&…

Collections 工具类

在 Java 编程中,集合(Collections)是处理数据的核心工具之一。为了简化集合操作并提高代码的可读性和可维护性,JDK 提供了一个强大的工具类:java.util.Collections。这个类包含了一系列静态方法,用于对集合…

机器学习引领流体动力学新纪元:CFD、Fluent与OpenFOAM的深度融合

在科技日新月异的今天,机器学习正以前所未有的力量重塑着众多学科领域,其中,流体动力学便是受益匪浅的典范。作为计算流体力学(CFD)领域的两大巨头,Fluent与OpenFOAM正携手机器学习技术,共同开启…

django入门【05】模型介绍(二)——字段选项

文章目录 1、null 和 blank示例说明⭐ null 和 blank 结合使用的几种情况总结: 2、choices**choices 在 Django 中有以下几种形式:**(1) **简单的列表或元组形式**(2) **字典映射形式**(3&#…

PL/SQL执行.sql文件

1.编写.sql文件,创建update.sql文件,文件如下: set feedback offset define off--更新表中所有人的年龄update a set age18;prompt Done. 2.打开plsql选择命令窗口,即选择File->New->Command Window; 打开后的…

论文5—《基于改进YOLOv5s的轻量化金银花识别方法》文献阅读分析报告

论文报告:基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档 基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档摘要国内外研究现状国内研究现状国外研究现状 研究目的研究问题使用的研究方法试验研究结果文献结论创新点和对现有研究的贡献1. 目标检测技术2. …

【数据结构】ArrayList与LinkedList详解!!!——Java

目录 一🌞、List 1🍅.什么是List? 2🍅.List中的常用方法 二🌞、ArrayList 1🍍.什么是ArrayList? 2🍍.ArrayList的实例化 3🍍.ArrayList的使用 4🍍.ArrayList的遍…

modbus协议 Mthings模拟器使用

进制转换 HEX 16进制 (0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F表示0-15) dec 10进制 n(16进制) -> 10 abcd.efg(n) d*n^0 c*n^1 b*n^2 a*n^3 e*n^-1 f*n^-2 g*n^-3(10) 10 -> n(16进制) Modbus基础概念 高位为NUM_H&…

微信版产品目录如何制作?

微信作为我国最流行的社交媒体平台,拥有庞大的用户群体。许多企业都希望通过微信来推广自己的产品,提高品牌知名度。制作一份精美、实用的微信版产品目录,是企业微信营销的重要手段。微信版产品目录的制作方法,帮助您轻松入门。 ​…

消息推送之SSE

一、简介 市面上很多系统都有 以上三种的消息提醒。但大多分为2类,一类移动端,一类web端比,通常在服务端会有若干张消息推送表,用来记录用户触发不同事件所推送不同类型的消息,前端主动查询(拉&#x…

react中如何在一张图片上加一个灰色蒙层,并添加事件?

最终效果: 实现原理: 移动到图片上的时候,给img加一个伪类 !!此时就要地方要注意了,因为img标签是闭合的标签,无法直接添加 伪类(::after),所以 我是在img外…

微搭低代码入门03函数

目录 1 函数的定义与调用2 参数与返回值3 默认参数4 将功能拆分成小函数5 函数表达式6 箭头函数7 低代码中的函数总结 在用低代码开发软件的时候,除了我们上两节介绍的变量、条件语句外,还有一个重要的概念叫函数。函数是执行特定功能的代码片段&#xf…