1. 归一化

1.1 距离类模型归一化的需求

什么是归一化呢?我们把X放到数据框中来看一一眼, 你是否观察到,每个特征的均值差异很大?有的特征数值很大。有的特征数值很小,这种现象在机器学习中被称为"星纲不统一"。 NN是距离类模型,欧氏距离的计算公式中存在若特征上的平方和:

试想看看,如果某个特征x的取值非常大,其他特征的取值和它比起来都不算什么,那距离的大小很大程度上都会由这个巨大特征x来决定,其他的特征之间的距离可能就无法对d(A,B) 的大小产生什么影响了,这种现象会让KNN这样的距离类模型的效果大打折扣。然而在实际分析情景当中,绝大多数数据集都会存在各特征值量纲不同的情况,此时若要使用KNN分类器,则需要先对数据集进行归一化处理, 即是将所有的数据压缩都同一个范围内。

1.2 preprocessing.MinMaxScaler

当数据(x) 按照最小值中心化后,再按极差(最大值最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这个过程,就称作数据归一化(Normalization, 又称Min-Max Scaling)

在sklear当中,我们使用preprocessing.MinMaxScaler来实现这个功能。MinMaxScaler有 一个 重要参数,feature. range, 控制我们希望把数据压缩到的范围,默认是[0, 1]。

1.3 先分数据集,再做归一化!

最初的时候,为了让大家能够最快地看到模型的效果变化,这里直接在全数据集X上进行了归一化,然后放入交叉验证绘制学习曲线,这种做法是错误的,只是为了教学目的方便才这样操作。真正正确的方式是,先分训练集和测试集,再归一化!
为什么呢?想想看归一化的处理手段, 我们是使用数据中的最小值和极差在对数据进行压缩处理,如果我们在全数据集上进行归一化,那最小值和极差的选取是会参考测试集中的数据的状况的。因此,当我们归一化后,无论我们如何分割数据,都会由一部分测试集的信息被"泄露”给训练集(当然,也有部分训练集的信息被泄露给了测试集,但我们不关心这个), 这会使得我们的模型效果被高估。在现实业务中,我们只知道训练集的数据,不了解测试集究竟会长什么样,所以我们要利用训练集.上的最小值和极差
来归一化测试集。

1.4 实现归一化

# 归一化
from sklearn.preprocessing import MinMaxScaler
data = [[-1,2],[-0.5,6],[0,10],[1,18]]
# 如果换成表是什么样子?
d = pd.DataFrame(data)
d

# 实现归一化
scaler = MinMaxScaler()
scaler.fit(d)
scaler.transform(d)


或者

# 训练和导出结果一步达成
scaler.fit_transform(d)

from sklearn.preprocessing import MinMaxScaler as mms
data = load_breast_cancer()
x = data.data
y = data.targetMMS = mms()
MMS.fit(x) # 先训练数据
x_new = MMS.transform(x) #再对数据进行归一化
#不能先对数据进行归一化,再对数据进行训练
#因为先做归一化就先知道测试集的信息,导致产生信息的泄露
score = []
var_ = []
krange=range(1,20)for i in krange:clf = KNeighborsClassifier(n_neighbors=i)cvresult = CVS(clf,x_new,y,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='--')# pd.Series(score, index = krange).idxmax()
print(bestindex)
print(score[bestindex])

2.距离的惩罚

2.1 以距离作为惩罚因子的优化

用最近邻点距离远近修正在对未知分类过程中,“- 点一票”的规则是KNN模型优化的一个重要步骤。也就是说,对于原始分类模型而言,在选取最近的k个元素之后,将参考这些点的所属类别,并对其进行简单计数,而在计数的过程中这些点“一 点-票”,这些点每个点对分类目标点的分类过程中影响效力相同。但这实际上是不公平的,就算是最近邻的k个点,每个点的分类目标点的距离仍然有远近之别,而近的点往往和目标分类点有更大的可能性属于同一类别(该假设也是KNN分类模型的基本假设)。因此,我们可以选择合适的惩罚因子,让入选的k个点在最终判别目标点属于某类别过程发挥的作用不相同,即让相对较远的点判别效力更弱,而相对较近的点判别效力更强。这一点也可以减少KNN算法对k取值的敏感度。

2.2 重要参数: weights

关于惩罚因子的选取有很多种方法,最常用的就是根据每个最近邻x;距离的不同对其作加权,加权方法为设置w;权
重,该权重计算公式为:

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

weights = 'distance'
score = []
var_ = []
krange=range(1,20)for i in krange:clf = KNeighborsClassifier(n_neighbors=i, weights = 'distance')cvresult = CVS(clf,x_new,y,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='--')#pd.Series(score, index = krange).idxmax()
print(bestindex)
print(score[bestindex])

结果

12
0.9648657040832169

Python机器学习--KNN归一化、距离的惩罚相关推荐

  1. Python机器学习---KNN模型评价、追求

    文章目录 1. KNN模型评价 1.1 计算效率低,耗费计算资源较大 1.2 抗噪性较弱,对噪声数据(异常值)较为敏感 1.3 模型不稳定,可重复性较弱 1.4要进行归化处理: 2.模型的追求 2.1 ...

  2. Python机器学习-- KNN学习曲线、K值、交叉验证

    文章目录 1.breast_cancer 数据集准确度计算 2.学习曲线 2.1 选择最优K值 2.2 不同K取值对模型的影响 2.3 神器之一:学习曲线 2.3.1 选取最优的K值 2.4交叉验证 ...

  3. [python机器学习]机器学习简单示例-KNN、决策树、线性回归、逻辑回归

    1.KNN 查找距离已知的几个点最近的类型,并返回这个类型进行预测. 如小明在北京,小红在北京,小刚在河南,而我距离小明和小红比小刚近,则我最可能在北京而不是河南 #!/usr/bin/env pyt ...

  4. 惩罚线性回归---Python机器学习:预测分析核心算法

    惩罚线性回归 参考教材:Python机器学习预测分析核心算法,书中代码较为过时,借用sklearn等工具包进行了重写. 实践中遇到的绝大多数预测分析(函数逼近)问题,惩罚线性回归和集成方法都具有最优或 ...

  5. Python机器学习实验二:1.编写代码,实现对iris数据集的KNN算法分类及预测

    Python机器学习实验二:编写代码,实现对iris数据集的KNN算法分类及预测 1.编写代码,实现对iris数据集的KNN算法分类及预测,要求: (1)数据集划分为测试集占20%: (2)n_nei ...

  6. Python机器学习:KNN算法02scikit-learn中的机器学习算法封装

    学习scikit-learn中的knn使用 并自己实现一个封装 学习scikit-learn中的knn使用 ps:代码块加标题会让字变红 python 首先引入库 在这里插入代码片 #在这个库里面所有 ...

  7. Python机器学习基础篇二《监督学习》

    前言 前期回顾: Python机器学习基础篇一<为什么用Python进行机器学习> 前面说过,监督学习是最常用也是最成功的机器学习类型之一.本章将会详细介绍监督学 习,并解释几种常用的监督 ...

  8. python机器学习常用模型

    python机器学习 算法分类 监督学习 定义︰输入数据是由输入特征值和目标值所组成.函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类). 分类: k-近邻 贝叶斯 决策树 ...

  9. Python 机器学习实战 —— 无监督学习(上)

    ​​​ 前言 在上篇<Python 机器学习实战 -- 监督学习>介绍了 支持向量机.k近邻.朴素贝叶斯分类 .决策树.决策树集成等多种模型,这篇文章将为大家介绍一下无监督学习的使用. 无 ...

最新文章

  1. 国赛来咯,全国大学生智能汽车竞赛百度赛道正式开启
  2. 【Linux】JDK+Eclipse 搭建C/C++开发环境
  3. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板成员函数的实例化
  4. 执行Plugins下的install:install报错:The packaging for this project did not assign a file to the build artif
  5. nginx epoll详解
  6. JS判断正则表达式验证规则
  7. 数字信号处理5:FIR滤波器设计
  8. 从城市到矿山!成都睿铂与Microdrones 海外三维建模案例
  9. 双网卡mode6模式 同时工作 冗余互备
  10. Android 扩展ViewFlipper做导航页(一)
  11. C#检测驱动是否安装的问题
  12. 电力系统暂态稳定性仿真 matlab/simulink 仿真模型+设计报告
  13. 请求的url中带#是什么意思呢?
  14. 构建数据平台探索智能应用,做企业数字化升级的得力助手
  15. Delphi名称的由来(原作:Borland公司Danny Thorpe)
  16. 【HBZ分享】数仓里面的概念-宽表-维度表-事实表概念讲解
  17. 精选文章:人生第一辆车购车八大流程及提车注意事项之最强攻略
  18. 3an推客CPC、CPM和CPS是什么意思?有什么区别
  19. Linux下使用hiredis库与libevent实现异步接口的I/O复用
  20. Windows操作命令(1)

热门文章

  1. 剑指offer(17)树的子结构
  2. tsp 选边 matlab,【转载】蚁群算法TSP(旅行商问题)通用matlab程序
  3. fastadmin 批量上传不成功_shopee批量上传产品步骤
  4. vue中如何实现点击某个地方,让echarts生成的图表发生变化
  5. java集合作为参数 传递的是_Java:数组和集合类作为参数传递时的差别
  6. iOS7下隐藏status bar的详细研究
  7. Python基础知识细节点总结,零基础一分钟也能掌握
  8. 微信公众号之微信买单
  9. DataTabel中关于ImpotRow的一点尝试
  10. 巧妙设备MTU的大小,轻松提网速