人工智能--k近邻算法2-归一化、交叉验证、网格搜索、数据分割方法总结、两案例实现

news2024/11/18 6:01:44

人工智能-第三阶段-k近邻算法1-算法理论、kd树、鸢尾花数据
人工智能–k近邻算法2-归一化、交叉验证、网格搜索、数据分割方法总结、两案例实现

1.7 特征工程-特征值预处理

1.7.1 介绍

通过一些转换函数奖特征数据转换为更加适合算法模型的特征数据过程
为什么要进行归一化/标准化?
特征的单位或者大小相差很大,或者某特征的方差比其他特征要大出几个量级,容易影响目标结果
例如如下数据:在这里插入图片描述

1.7.2 归一化

x1 = (x-min)/(max-min)

1,实例化
2,转换

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

#归一化
def minmax_demo():
	data = pd.read_csv('./data/dating.txt')#路径-读取
	print(data)
	#1,实例化
	transfer = MinMaxScaler(feature_range=(3,5)) #归一化到3-5之间
	#2,转换,调用fit_transform
	ret_data= transfer.fit_transform(data[['milage','Liters','Consumtime']]) #转换data中的这几列
	#二维数据,所以两个中括号
	print('归一化之后的数据为:\n',ret_data)

minmax_demo() #调用归一化函数

问题:如果异常值过多,怎么办?
归一化容易受到异常点的影响,所以归一化的鲁棒性(确定性,稳定性)较差,只适合传统精确小数据场景。

1.7.3 标准化

x1 = (x-mean)/标准差

归一化:出现异常点,影响较大
标准化:由于异常点的个数少量,对平均值的影响并不大,从而方差改变较小
在这里插入图片描述

import pandas as pd
from sklearn.preprocessing import StandardScaler

#标准化
def stand_demo():
	data = pd.read_csv('./data/dating.txt')#路径-读取
	print(data)
	#1,实例化
	transfer = StandardScaler() #默认归一化到均值0,方差1
	#2,转换,调用fit_transform
	ret_data= transfer.fit_transform(data[['milage','Liters','Consumtime']]) #转换data中的这几列
	#二维数据,所以两个中括号
	print('标准化之后的数据为:\n',ret_data)
	print('每一列的方差为:\n',transfer.var_)
	print('每一列的平均值为:\n',transfer.mean_)
	
stand_demo() #调用标准化函数

1.8 案例1:鸢尾花种类预测-流程实现

k近邻的API:
在这里插入图片描述
利用鸢尾花数据进行预测的完整代码:

from sklearn.datasets import load_iris  #导数据
from sklearnmodel_selection import train_test_split #分割数据
from sklearn.preprocessing import StandardScaler #标准化
from sklearn.neighbors import KNeighborsClassifier #K近邻
 
#1,获取数据
iris = load_iris()
#2,数据基本处理
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size = 0.2,random_state = 22)

#3,特征工程-特征预处理
transfer = StandarScaler()
x_train = transfer.fit_transform(x_train) #对训练集标准化
x_test = transfer.transform(x_test)  #对测试集标准化

#4,机器学习-kNN
#4.1 实例化一个估计器
estimator = KNeighborsClassifier(n_neighbors = 5) #邻居数选为5
#4.2 模型训练
estimator.fit(x_train,y_train)

#5,模型评估
#5.1 预测值结果输出
y_pre = estimator.predict(x_test)
print('预测值是:\n',y_pre)
print('预测值和真实值的对比是:\n',y_pre==y_test)

#5.2 准确率计算
score = estimator.score(x_test,y_test)
print('准确率为:\n',score)

导库包—读取数据—数据预处理(划分训练与预测)—特征工程(标准化)–模型训练—模型评估

1.9 K-近邻算法总结

欧式距离
k值的选择
kd树的构建

K近邻算法
优点:简单有效、重新训练的代价低、适合类域交叉样本、适合大样本自动分类
缺点:惰性学习、类别划分不是规格化、输出可解释性不强、对不均衡的样本不擅长、计算量较大

类域交叉样本:
在这里插入图片描述

1.10 交叉验证,网格搜索

1.10.1 交叉验证

四折交叉验证:
在这里插入图片描述
交叉验证的最后准确率是每次验证的准确值后的平均值

交叉验证的目的:没法提高模型预测的精度,但能让被评估的模型更加可信可靠

1.10.2 网格搜索

超参数:机器学习中需要手动指定的参数(例如k近邻中的K值)

网格搜索:对于超参数,采用交叉验证对各种可能 的取值进行评估,返回最优的参数组合。通过选定最优的超参数,来提高模型的精确性

在这里插入图片描述
代码在上面那段上改,增加了4.2与5.3

from sklearn.datasets import load_iris  #导数据
from sklearnmodel_selection import train_test_split #分割数据
from sklearn.preprocessing import StandardScaler #标准化
from sklearn.neighbors import KNeighborsClassifier #K近邻
 
#1,获取数据
iris = load_iris()
#2,数据基本处理
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size = 0.2,random_state = 22)

#3,特征工程-特征预处理
transfer = StandarScaler()
x_train = transfer.fit_transform(x_train) #对训练集标准化
x_test = transfer.transform(x_test)  #对测试集标准化

#4,机器学习-kNN
#4.1 实例化一个估计器
estimator = KNeighborsClassifier()

#4.2 模型调优--交叉验证,网格搜索
param_grid = {'n_neighbors':[1,3,5,7]} #邻居数试1,3,5,7
estimator = GridSearchCV(estimator,para_grid=param_grid,cv=5)#交叉5次


#4.3 模型训练
estimator.fit(x_train,y_train)

#5,模型评估
#5.1 预测值结果输出
y_pre = estimator.predict(x_test)
print('预测值是:\n',y_pre)
print('预测值和真实值的对比是:\n',y_pre==y_test)

#5.2 准确率计算
score = estimator.score(x_test,y_test)
print('准确率为:\n',score)

#5.3 查看交叉验证,网格搜索的一些属性
print('在交叉验证中,得到的最好结果是:\n',estimator.best_score_)  #测试集上的分数
print('在交叉验证中,得到的最好模型是:\n',estimator.best_estimator_)  #在训练集上的分数
print('在交叉验证中,得到的模型结果是:\n',estimator.cv_results_)

1.11 案例2 预测facebook签到位置

目的:预测一个人将要签到的地方。根据用户的位置,准确性和时间戳等预测用户下一次的签到位置。
在这里插入图片描述
在这里插入图片描述

import pandas as pd
data = pd.read_csv('./data/train.csv')
data.head()
data.describe()

步骤:
1,获取数据集
2,基本数据处理
2.1缩小数据集范围 ---- 为了演示方便,节省时间
2.2选取有用的时间特征
2.3将签到数量少于n个的签到位置删除
2.4 确定特征值和目标值
2.5 分割数据集
3,特征工程
4,机器学习 – knn
5,模型评估

from pandas as pd
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
#1,获取数据集
data = pd.read_csv('./data/train.csv')
data.head()
data.describe()
data.shape

#2,基本数据处理
#2.1缩小数据集范围 ---- 为了演示方便,节省时间
partial_data=data.query('x>2.0 & x<2.5 & y>2.0 & y<2.5')
partial_data.head()
partial_data.shape

#2.2选取有用的时间特征
partial_data['time'].head()
#to_datetime转换时间戳为时间形式
time = pd.to_datetime(partial_data['time'],unit='s')
time.head()

在这里插入图片描述

#time.hour #此时会报错,time类型还不是时间类型
time = pd.DatetimeIndex(time)
partial_data['hour']=time.hour
partial_data['day']=time.day
partial_data['weekday']=time.weekday

#2.3 将签到数量少于n个的签到位置删除
#例如:用于广告投入,更关注人流量多的地方
place_count = partial_data.groupby('place_id').count() #先分组后聚合
place_count.head() 

在这里插入图片描述

place_count = place_count[place_count['row_id']>3]
place_count.head()
#partial_data['place_id'].isin(place_count.index)--返回是一堆ture或者false
#用isin进行判断,partial_data['place_id']与place_count进行对比
partial_data = partial_data[partial_data['place_id'].isin(place_count.index)]
partial_data.shape

# 2.4 确定特征值和目标值
x = partial_data[['x','y','accuracy','hour','day','weekday']]
y = partial_data['place_id']

#2.5 分割数据集
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=2,test_size=0.25)
#3,特征工程--特征预处理(标准化)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

#4,机器学习 -- knn+cv
#4.1 实例化一个训练器
estimator = KNeighborsClassifier()

#4.2 交叉验证,网格搜索实现
param_grid = {'n_neighbors':[3,5,7,9]}
estimator = GridSearchCV(estimator = estimator,param_grid = param_grid,cv=3,n_jobs = 4)#n_jobs是控制运行的CPU个数,设置为-1即让所有CPU跑(满负荷)

#4.3 模型训练
estimator.fit(x_train,y_train)
#5,模型评估
#5.1 准确率输出
score_ret = estimator.score(x_test,y_test)
print('准确率为:\n',ascore_ret)

#5.2 预测结果
y_pre = estimator.predict(x_test)
print('预测值是:\n',y_pre)
print('预测值和真实值的对比是:\n',y_pre==y_test)

#5.3 其他结果输出
print('在交叉验证中,得到的最好结果是:\n',estimator.best_score_)  #测试集上的分数
print('在交叉验证中,得到的最好模型是:\n',estimator.best_estimator_)  #在训练集上的分数
print('在交叉验证中,得到的模型结果是:\n',estimator.cv_results_)

1.12 知识补充 : 再议论数据分割

测试样本最好不出现在训练集中—避免模型泛化能力差

分割数据的方法:留出法、交叉验证法、自助法

1.12.1 留出法:分层采样,train_test_split

分层采样可以缓解留出法中带来的数据分割后分布不一致的问题

from sklearn.model_selection import train_test_split
train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.2,random_state = 2)

如果数据量太小,采用:留一法

from sklearn.model_selection import LeaveOneOut
#留一法
data = [1,2,3,4]
loo = LeaveOneOut() #实例化对象
for train,test in loo.split(data):
	print('%s %s'%(train,test))

在这里插入图片描述
在这里插入图片描述

1.12.2 交叉验证法

在这里插入图片描述
交叉验证法:除了GridSearchCV 外,还有KFold与StratifiedKFold

区别:
KFold并没有考虑到正反样本的比例,是随机的。对应地,StratifiedKFold是分层采用,所以更推荐StratifiedKFold。
在这里插入图片描述

import numpy as np
from sklearn.model_selection import KFold,StratifiedKFold

#交叉验证法--KFold与StratifiedKFold
x = np.array([
[1,2,3,4],
[11,12,13,14],
[21,12,23,45],
[31,32,13,14],
[31,32,23,45],
[41,42,13,14],
[31,52,23,45],
[31,22,13,15]])
y = np.array([1,1,0,0,1,1,0,0])

folder = KFold(n_splits =4,random_state=0,shuffle=False)
sfolder = StratifiedKFold(n_splits =4,random_state=0,shuffle=False)

#KFold
print('KFold')
for train,test in folder.split(data):
	print('train:%s,test:%s'%(train,test))
#返回的是下标

在这里插入图片描述

#StratifiedKFold
print('StratifiedKFold')
for train,test in sfolder.split(data):
	print('train:%s,test:%s'%(train,test))
#返回的是下标

在这里插入图片描述

1.12.3 自助法

在这里插入图片描述

1.12.4 总结

  • 数据量充足–留出法简单省时,在牺牲很小的准确度情况下,换取计算的简便
  • 数据量较小–交叉验证发,因为此时划分样本集会使得训练集过少
  • 数据量特别少–留一法

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

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

相关文章

最新最全面的Spring详解(二)——classpath扫描和组件管理

前言 本文为 【Spring】classpath扫描和组件管理 相关知识&#xff0c;下边将对Component 和及其派生出的其他注解&#xff0c;自动检测类和注册beanDifination&#xff0c;组件命名&#xff0c;为自动检测组件提供scope&#xff0c;使用过滤器自定义扫描&#xff0c;在组件中定…

【Java开发】 Spring 03:云服务器 Docker 环境下安装 MongoDB 并连接 Spring 项目实现简单 CRUD:

接下来介绍一下 NoSQL &#xff0c;相比于 Mysql 等关系型的数据库&#xff0c;NoSQL &#xff08;文档型数据库&#xff09;由于存储的数据之间无关系&#xff0c;因此具备大数据量&#xff0c;高性能等特点&#xff0c;用于解决大规模数据集合多重数据种类带来的挑战&#xf…

Aspose.OMR for .NET 22.11.X Crack

Aspose.OMR for .NET 是一个可靠且通用的编程 API&#xff0c;用于设计和自动识别手填答题卡、调查、测试、选票、SAT 考试表格、保险索赔以及受访者通过随机抽取答案来回答问题的类似文件在圆形或正方形中标记。从成百上千个表单中手动读取和汇总结果的漫长且容易出错的过程归…

深入学习函数(2)

目录 一、函数的嵌套调用和链式访问 1、嵌套调用 2、链式访问 二、函数的声明和定义 1、函数的声明 2、函数的定义 声明和定义的拓展 拆成三个文件的好处 一、函数的嵌套调用和链式访问 当代码写的越来越多时&#xff0c;就会发现&#xff0c;其实一个程序都…

Day802.JVM热点问题 -Java 性能调优实战

JVM部分热点问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习JVM部分热点问题的内容。 1、字符串常量不是在java8中已经被放入到堆中了吗&#xff0c;应该不在方法区中了&#xff0c;咋一些图中还在方法区中&#xff1f; JVM 的内存模型只是一个规范&#xff0c;方法区也是…

Fiddler基础使用

目录预备知识关于web的一些基础知识实验目的实验环境实验步骤一实验步骤二实验步骤三预备知识 关于web的一些基础知识 要分析Fiddler抓取的数据包&#xff0c;我们首先要熟悉HTTP协议。HTTP即超文本传输协议&#xff0c;是一个基于请求/响应模式的、无状态的、应用层的协议&a…

【Python开发】Flask项目的组织架构

Flask项目的组织架构在大型Flask项目中&#xff0c;主要有三种常见的项目组织架构&#xff1a;功能式架构&#xff08;也就是 Bluelog 程序使用的架构&#xff09;、分区式架构和混合式架构。我们将以一个示例程序 myapp 作为示例来介绍这三种架构的特点和区别&#xff0c;这个…

教你用HTML+CSS实现百叶窗动画效果

推荐学习专栏&#xff1a; 【JavaWeb】Web前端JavaWeb学习专栏 文章目录前言1、百叶窗效果2、原理讲解3、制作百叶窗4、资源下载5、完整代码总结前言 我们浏览网页的时候总能看见一些炫酷的特效&#xff0c;比如百叶窗效果&#xff0c;本文我们就用HTMLCSS制作一个百叶窗小项…

副业该怎么选择,适合新手的四个副业项目,零基础也可操作的兼职

副业有可能有时挣得并不多&#xff0c;但它是一个改变未来的好机会。假如玩的开了&#xff0c;盈利并不比你工资少。95%的人自主创业也是从第二职业做起&#xff0c;做着干着就全职的了。 四个全员第二职业&#xff0c;新手如何做到单月9000&#xff0c;深入分析看下文&#xf…

license授权服务器

项目介绍 为软件提供授权制的使用方式&#xff0c;license申请端可以为产品生成license授权文件&#xff0c;集成了flowable工作流&#xff0c;经审批后生成license文件。 然后导入到服务端。客户端与服务端netty通信。实时判断license是否合法&#xff0c;从而使软件得到安全…

辣椒辣素修饰卵清蛋白 Capsaicin-ova,苍耳亭偶联鸡卵白蛋白 Xanthatin-ovalbumin

产品名称&#xff1a;辣椒辣素修饰卵清蛋白 英文名称&#xff1a; Capsaicin-ova 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 辣椒碱又称辣椒辣素&#xf…

抓包工具总结对照【fiddler F12 Charles wireshark】

本文主要对比fiddler Charles wireshark&#xff0c;纯手敲制作&#xff0c;动动小手点赞 文章目录抓包fidderF12开发者工具wiresharkCharles下载安装使用web抓包APP 抓包IOSAndroidCharles过滤弱网测试篡改数据修改请求数据重复发送请求Compose编辑接口服务器压力测试本地映射…

前端:Node.js遇到的错误整理

node.js当前错误汇总&#xff1a;错误1npm WARN config global --global, --local are deprecated. Use --locationglobal instead.原因&#xff1a;初步判断是node.js版本问题解决方法&#xff1a;错误2npm WARN logfile could not create logs-dir: Error: EPERM: operation …

MySQL主从复制最全教程(CentOS7 yum)

一、MySQL主从复制介绍 &#xff08;1&#xff09;MySQL数据库默认是支持主从复制的&#xff0c;不需要借助于其他的技术&#xff0c;我们只需要在数据库中简单的配置即可。 &#xff08;2&#xff09;MySQL主从复制是一个异步的复制过程&#xff0c;底层是基于Mysql数据库自…

在Docker里安装FastDFS分布式文件系统详细步骤

安装需要的软件包 yum install -y yum-utils 设置yum源 yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo 安装docker yum install -y docker-ce 查看docker版本验证安装是否成功 docker -v 启动docker systemctl start d…

C++ 实用指南

C 发展得非常快&#xff01;例如&#xff0c;C 标准的页数从 C98/03 的 879 页增加到了 C20 的 1834 页&#xff0c;多了近 1000 页&#xff01;更重要的是&#xff0c;C 每次修订后&#xff0c;我们都会获得几十个新特性。你需要学习所有这些东西才能写出好代码吗&#xff1f;…

【计算机毕业设计】旅游网站ssm源码

下载链接:https://download.csdn.net/download/licongzhuo/87051535https://download.csdn.net/download/licongzhuo/87051535 一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是…

Redis数据结构之——跳表skiplist

写在前面 以下内容是基于Redis 6.2.6 版本整理总结 一、跳表&#xff08;skiplist&#xff09; 如何理解跳表&#xff1f;在了解跳表之前&#xff0c;我们先从普通链表开始&#xff0c;一点点揭开跳表的神秘面纱~ 首先&#xff0c;普通单链表来说&#xff0c;即使链表是有序…

第2-3-4章 上传附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

文章目录5.3 接口开发-上传附件5.3.1 接口文档5.3.2 代码实现5.3.3 接口测试5.3 接口开发-上传附件 第2-1-2章 传统方式安装FastDFS-附FastDFS常用命令 第2-1-3章 docker-compose安装FastDFS,实现文件存储服务 第2-1-5章 docker安装MinIO实现文件存储服务-springboot整合minio…

MindMaster思维导图及亿图图示会员 超值获取途径

MindMaster思维导图及亿图图示会员 超值获取途径 会员九折优惠方法分享给大家&#xff01;如果有需要&#xff0c;可以上~ 以下是食用方法&#xff1a; MindMaster 截图 亿图图示 截图 如果需要MindMaster思维导图或者亿图图示会员&#xff0c;可按照如下操作领取超值折扣优惠…