大数据-198 数据挖掘 机器学习理论 - scikit-learn 归一化 距离的惩罚

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(已更完)
  • DataX(已更完)
  • Tez(已更完)
  • 数据挖掘(正在更新…)

章节内容

上节我们完成了如下的内容:

  • scikit-learn 泛化能力
  • scikit-learn 交叉验证

在这里插入图片描述

归一化

距离类模型归一化要求

我们把 X 放到数据框中看一眼,是否观察到,每个特征值的均值差异很大?有的特征数值很大,有的特征数据很小,这种现象在机器学习中称为“量纲不统一”,KNN 是距离类模型,欧式距离的计算公式中存在着特征上的平方和:
在这里插入图片描述
如果某个特征 Xi 的取值非常大,其他特征的取值和它比起来就不算什么,那么距离的大小很大程度上都回由这个 Xi 来决定,其他的特征之间的距离可能无法对 d(A,B)的大小产生什么影响,这种现象会让 KNN 这样的距离类模型的效果大打折扣。
然而实际分析情况中,绝大多数数据集都会存在各特征量纲不同的情况,此时若要使用KNN 分类器,则需要先对数据集进行归一化处理,即是将所有的数据压缩都同一个范围内。
当数据(X)按照最小值中心化后,再按极差(最大值-最小值)缩放,数据移动了最小值个单位,并且会被收敛到【0,1】之间,而这个过程,就称做数据归一化(Normalization,又称 Min-Max Scaling)。

在这里插入图片描述

先分数据集 再做归一化

直接在全数据集 X 上进行归一化,然后放入交叉验证绘制学习曲线,这种做法是错误的。
真正正确的方式是,先分训练集和测试集,再归一化。
我们是使用数据中的最小值和极差在对数据进行压缩处理,如果我们在全数据集上进行归一化,那最小值和极差的选取是会参考测试集中的数据状况的。因此,当我们归一化后,无论我们如何分割数据,都会有一部分测试集的信息被“泄露”给训练集,这会使我们的模型效果被高估。
在现实业务中,我们只知道训练集的数据,不了解测试集究竟会长什么样子,所以我们要训练集上的最小值和极差归一化测试集。

data = [[-1,2],[-0.5,6],[0,10],[1,18]]
data=pd.DataFrame(data)
(data-np.min(data,axis=0))/(np.max(data,axis=0)-np.min(data,axis=0))

运行结果如下所示:
在这里插入图片描述

通过 sklearn 实现

from sklearn.preprocessing import MinMaxScaler as mms

Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,y,test_size=0.2,random_state=420)
# 归一化
# 求训练集最大/小值
MMS_01=mms().fit(Xtrain) 
# 求测试集最大/小值
MMS_02=mms().fit(Xtest) 

# 转换
X_train=MMS_01.transform(Xtrain)
X_test =MMS_02.transform(Xtest)

score=[]
var=[]
for i in range(1,20):
    clf=KNeighborsClassifier(n_neighbors=i)
    # 交叉验证的每次得分
    cvresult=CVS(clf,X_train,Ytrain,cv=5) 
    score.append(cvresult.mean())
    var.append(cvresult.var())

plt.plot(krange,score,color="k")
plt.plot(krange,np.array(score)+np.array(var)*2,c="red",linestyle="--")
plt.plot(krange,np.array(score)-np.array(var)*2,c="red",linestyle="--")
plt.show()

运行之后,我们查看结果如下所示:
在这里插入图片描述

再次查看最大值,运行结果:

score.index(max(score))+1

输出结果是:
在这里插入图片描述

最终值是:7
无论 random_state取什么值,最优的 K 值都不会相差太多。

把经过交叉验证、归一化处理之后,我们得到最优 K 是 8,放在归一化后的训练集重新建模,然后在归一化后的测试集中查看结果分数:

clf=KNeighborsClassifier(n_neighbors=6,weights='distance').fit(X_train,Ytrain)
score=clf.score(X_test,Ytest)
score

执行结果如下图所示:
在这里插入图片描述

距离的惩罚

最近邻点距离远近修正在对未知分类过程中,一点一票的规则是 KNN 模型优化的一个重要步骤,也就是说,对于原始分类模型而言,在选取最近的 K 个元素之后,将参考这些点的所属类别,并对其进行简单计数,而在计数的过程中这些点一点一票,这些点每个点对分类目标点的分类过程中影响效力相同。
但这实际上不公平的,就算是最近邻的 K 个点,每个点的分类目标点的距离仍然有远近之别,而近的点往往和目标分类点有更大的可能性属于同一类别(该假设也是 KNN 分类模型的基本假设)。
关于惩罚因子的选取有很多种方法,最常用的就是根据每个近邻 x=距离的不同对其做加权,加权方法设置 Wi 权重,该权重计算公式为:

在这里插入图片描述
这里需要注意的是,关于模型的优化方法只是在理论上而言进行优化会提升模型判别效力,但实际应用过程中最终能否发挥作用,本质上缓释取决于优化方法和实际数据情况的契合程度,如果数据本身存在大量异常值点,则采用距离远近作为惩罚因子则会有较好的效果,反之则不然。
因此在实际我们进行模型优化的过程中,是否起到优化效果还是要以最终模型运行结果为准,在 sklearn 中,我们可以通过参数 weights 来控制是否适用距离作为惩罚因子。

for i in range(1,20):
    clf=KNeighborsClassifier(n_neighbors=i,weights='distance')
# 交叉验证的每次得分
    cvresult=CVS(clf,X_train,Ytrain,cv=5) 
    score.append(cvresult.mean())
    var.append(cvresult.var())
plt.plot(krange,score,color="k")
plt.plot(krange,np.array(score)+np.array(var)*2,c="red",linestyle="--")
plt.plot(krange,np.array(score)-np.array(var)*2,c="red",linestyle="--")
plt.show()

执行结果如下所示:
在这里插入图片描述
生成的图片如下所示:
在这里插入图片描述
此时查看最大值:

score.index(max(score))+1

输出结果如下:
在这里插入图片描述

clf=KNeighborsClassifier(n_neighbors=6,weights='distance').fit(X_train,Ytrain)
score=clf.score(X_test,Ytest)
score

执行结果如下所示:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu UFW防火墙规则与命令示例大全

在服务器安全领域,防火墙是守护网络安全的坚实盾牌。UFW(Uncomplicated Firewall),即“不复杂的防火墙”,是一个运行在iptables之上的防火墙配置工具,它为Ubuntu系统默认提供了一个简洁的命令行界面&#x…

(蓝桥杯C/C++)——常用库函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、 二分查找 1.二分查找的前提 2.binary_ search函数 3.lower_bound和upper_bound 二、排序 1.sort概念 2.sort的用法 3.自定义比较函数 三、全排列 1.next p…

iOS Swift5算法恢复——HMAC

demangle的时候看到了CryptoSwift,HMAC,于是写一个helloworld,用于对照。 sudo gem install cocoapods pod init pods文件,注意要标注静态链接: # Uncomment the next line to define a global platform for your p…

为什么架构设计禁止IP直连?

什么是IP直连? IP直连指应用程序直接在代码中硬编码IP地址,比如,连接mysql数据库的数据库链接,如下的定义方式,就属于IP直连。 这种写法在开发环境中很常见,但是,在正式生产环境中,…

Java Deeplearning4j:实现文本分类

🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科…

Java程序设计:spring boot(10)——单元测试

1 pom.xml 测试依赖添加 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId> </dependency> 2 Service业务方法测试 以 UserService 为例&#xff0c;src/test/java ⽬录下添…

xshell上使用lrzsz工具通过串口传输文件

注意事项 最好加"-E" 选项&#xff0c;这样不会覆盖现有的同名文件。

人工智能与数据安全:Facebook如何应对隐私挑战

在数字时代&#xff0c;数据隐私和安全成为了用户和企业关注的核心问题。作为全球最大的社交媒体平台之一&#xff0c;Facebook面临着日益严峻的隐私挑战。近年来&#xff0c;频繁发生的数据泄露事件和对用户隐私的质疑&#xff0c;使得Facebook在保护用户数据方面倍感压力。为…

MPSK(BPSK/QPSK/8PSK)调制解调的Matlab仿真全套

一、概述 MPSK(BPSK、QPSK、8PSK)等是常用的相位调制方式,本文对数据获取、比特流组织、基带调制、上变频发送、添加噪声、接收下变频、基带解调、数据还原等过程进行仿真。 模块化、通用化设计,将函数分为(1)数据读取转比特流;(2)基带调制【参数控制调制类型】;(…

Python实现全国岗位招聘信息可视化分析(源码+论文+部署讲解)

项目源码&数据源获取 利用Python实现全国岗位招聘信息可视化分析 项目背景&#xff1a; 1.为企业招聘决策提供科学的依据和参考&#xff0c;可以帮助人力资源部门、招聘机构和求职者了解当前的就业形势、行业趋势和人才需求&#xff0c;从而做出更明智的招聘和求职决策。…

【c语言】运算符汇总(万字解析)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C语言 目录 前言 一、c语言运算符的分类 二、各运算符的功能及使用 1. 算数运算符 - * / % 2. 位运算符 二进制和进制转换 二进制转十进制 十进制…

C# OpenCvSharp DNN UNet 推理

目录 效果 模型 项目 代码 下载 效果 模型 Inputs ------------------------- name&#xff1a;data tensor&#xff1a;Float[1, 3, 256, 256] --------------------------------------------------------------- Outputs ------------------------- name&#xff1a;p…

C语言中的位操作

第一章 变量某位赋值与连续赋值 寄存器 | 值 //例如&#xff1a;a 1000 0011b a | (1<<2) //a 1000 0111 b 单独赋值 a | (3<<2*2) // 1011 0011b 连续赋值 第二章 变量某位清零与连续清零 寄存器 & ~&#xff08;&#xff09; 值 //例子&#xff1a;a …

【宠物狗狗数据集】 犬类品种识别 宠物狗检测 深度学习 目标检测(含数据集)

一、背景意义 随着人们对宠物狗的喜爱日益增加&#xff0c;犬种的多样性也逐渐受到重视。狗狗不仅是家庭的好伴侣&#xff0c;更在多个领域中发挥着重要作用&#xff0c;如导盲、搜救、疗愈等。因此&#xff0c;准确识别和分类各种犬种显得尤为重要。传统的犬种识别方法往往依赖…

【ROS 基础教学系列】ROS话题(Topic)通信

ROS 基础教学系列-ROS话题(Topic)通信 文章目录 ROS 基础教学系列-ROS话题(Topic)通信前言一、话题通讯模型二、Topic Hello World2.1 创建并初始化功能包2.2 确定Topic名称及消息格式2.3 实现发布者与订阅者&#xff08;C版&#xff09;2.4 实现发布者与订阅者&#xff08;Pyt…

大东方码险引领彩票行业新纪元:全球保险巨头携手共创新篇章

在全球经济多元化发展的今天,彩票行业作为兼具娱乐与公益特性的特殊市场,正迎来前所未有的变革机遇。面对这一广阔且充满潜力的市场前景,大东方保险——这一国际保险业的领航者,凭借其深厚的行业影响力和技术优势,携手安盛集团、富卫保险、法通保险、永明保险、泰禾保险、亚洲保…

逆向 解密接口信息附Demo(二)

目录 前言1. 加密2. 解密 前言 原先写过另外一篇&#xff0c;推荐阅读&#xff1a;逆向 解密接口信息&#xff08;附Demo&#xff09; 下文以 https://login1.scrape.center/ 进行讲解&#xff0c; 1. 加密 登录过程中可以使用断点进行一步一步排查 或者在js文件中搜索enco…

Linux安装es和kibana

安装Elasticsearch 参考文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html#targz-enable-indices 基本步骤下载包&#xff0c;解压&#xff0c;官网提示&#xff1a; wget https://artifacts.elastic.co/downloads/elasticsearc…

如何选择适合自己的 Python IDE

集成开发环境&#xff08;IDE&#xff09;是指提供广泛软件开发能力的软件应用程序。IDE 通常包括源代码编辑器、构建自动化工具和调试器。大多数现代 IDE 都配备了智能代码补全功能。在本文中&#xff0c;你将发现目前市场上最好的 Python IDE。 什么是 IDE&#xff1f; IDE…

《HelloGitHub》第 103 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…