一、问题描述

在UC Irvine Machine Learning数据集上选择三个数据,编写KNN算法预测结果,并使用十次-十折交叉验证

二、数据集选用

1.Wine.data
2.Iris.data
3.O-ring-erosion-only.data
实验平台:Python3.7
数据集下载
提取码:7060

三、 KNN分类器

kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。
原理:
1.存在一个训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。
2.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。在这里距离一般用欧式距离或曼哈顿距离。

3.一般的,我们只选择样本数据集中前k个最相似的数据,通常k是不大于20的整数,最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

四、 十折交叉验证

十折交叉验证是将训练集分割成10个子样本,一个单独的子样本被保留作为验证模型的数据,其他9个样本用来训练。交叉验证重复10次,每个子样本验证一次,平均10次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10次交叉验证是最常用的。

五、源码

'''1、计算已知类别数据集中的点与当前点之间的距离2、按照距离递增次序排序3、选取与当前点距离最小的k个点4、确定前k个点所在类别的出现概率5、返回前k个点出现频率最高的类别作为当前点的预测分类
'''
import numpy as np
import operator#处理文本
def fileToMatrix(iris):fr = open(iris)arrayOLines = fr.readlines()numberOfLines = len(arrayOLines)returnMat = np.zeros((numberOfLines, 5))classLabelVector = []index = 0for line in arrayOLines:line = line.strip()listFromLine = line.split(',')returnMat[index,:] = listFromLine[0:5]classLabelVector.append(listFromLine[-1])index += 1return returnMat, classLabelVector#功能:归一化数据,避免某些数据的特征值过大
#def autoNorm(dataSet):
def autoNorm(dataSet):minVals = dataSet.min(0)#取列值的最小值maxVals = dataSet.max(0)ranges = maxVals - minValsnormDataSet = np.zeros(np.shape(dataSet))m = dataSet.shape[0]normDataSet = dataSet - np.tile(minVals, (m,1))normDataSet = normDataSet/np.tile(ranges, (m, 1))#特征值相除return normDataSet, ranges, minVals#功能:kNN核心算法
#intX - 输入向量,dataSet - 输入训练样本集,labels - 标签向量,k表示用于选择最近邻居的数目
#def classify(inX, dataSet, labels, k):
def classify(inX, dataSet, labels,k):#欧式距离的计算dataSize = dataSet.shape[0]#数据的行数diffMat = np.tile(inX, (dataSize,1)) - dataSet#将输入向量inX纵向重复dataSet的行数次sqDiffMat = diffMat ** 2 #距离度量,度量公示为欧氏距离sqDistances = sqDiffMat.sum(axis = 1)# 每行数据相加distances = sqDistances ** 0.5#得到训练样本集每一点与当前点的距离sortedDistIndicies = distances.argsort() #对欧式距离进行排序#选择距离最小的k个点classCount = {}for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]#最近K个的距离对应的类别classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#类别分别出现的概率sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)#选择发生频率最高的元素标签进行排序return sortedClassCount[0][0]#功能:#功能:十折交叉验证
#思路:将数据集分成十份,轮流将其中9份做训练1份做测试,10次结果的均值作为对算法精度的估计
#一般还要进行多次10倍交叉验证#def dataClassTest(iris, k):
if __name__=='__main__':file_data = 'iris.data'k=5testRate = 0.1datingDataMat, datingLabels = fileToMatrix(file_data)datingDataMat = datingDataMat[:,:k-1]normMat, ranges, minVals = autoNorm(datingDataMat)m = normMat.shape[0]numTestVecs = int(m * testRate)all = 0for k in range(1,11):t = normMat[0:numTestVecs]p = datingLabels[0:numTestVecs]for i in range(numTestVecs):errorCount = 0classifierResult = classify(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)if(classifierResult != datingLabels[i]):    errorCount += 1.0#----------将第几折的数据拿出来,放回到normMat的前面b = normMat[numTestVecs*(k-1):numTestVecs*k]normMat[0:numTestVecs] = bnormMat[numTestVecs*(k-1):numTestVecs*k] = terrorRate = errorCount/float(numTestVecs)#----------将第几折类别拿出来,放回到datingLabels的前面c = datingLabels[numTestVecs*(k-1):numTestVecs*k]datingLabels[0:numTestVecs] = cdatingLabels[numTestVecs*(k-1):numTestVecs*k] = perrorRate = errorCount/float(numTestVecs)all = all + errorRate#------------------------------------------------------------------print("第%d折分类的错误率为%f" % (k,(errorCount/float(numTestVecs))))#获得平均错误率print("平均正确率为%f" % (1-(all/10)))

六、实验结果

6.1 wine.data

6.2 iris.data

6.3 o-ring-erosion-only.data

七、 实验结果分析总结:

   通过对比三个数据集,数据类型相似或相近,在酒和鸢尾花上交叉验证的准确率分别高达94%和99%,在O形圈上的准确率是50%,这是与数据中的数据特征相关,数据本身数值影响了分类准确率。KNN算法优点是精度较高、无数据输入假定;缺点是空间复杂度高。验证法与2折、3折相比,10折同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,能得到更精确的分类器。

KNN算法(10折交叉验证)相关推荐

  1. matlab.10折交叉验证

    clc clear all % 导入数据 data = load('F:\work_matlab\Matlab\wdbc.txt'); [data_r, data_c] = size(data); % ...

  2. 机器学习 - 随机森林手动10 折交叉验证

    随机森林的 10 折交叉验证 再回到之前的随机森林(希望还没忘记,机器学习算法-随机森林初探(1)) library(randomForest) set.seed(304) rf1000 <- ...

  3. 10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)

    10折交叉验证我们构建一个分类器,输入为运动员的身高.体重,输出为其从事的体育项目-体操.田径或篮球. 一旦构建了分类器,我们就可能有兴趣回答类似下述的问题: 1. 该分类器的精确率怎么样? 2. 该 ...

  4. 10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)...

    10折交叉验证 我们构建一个分类器,输入为运动员的身高.体重,输出为其从事的体育项目-体操.田径或篮球. 一旦构建了分类器,我们就可能有兴趣回答类似下述的问题: 1. 该分类器的精确率怎么样? 2. ...

  5. R语言caret包构建xgboost模型实战:特征工程(连续数据离散化、因子化、无用特征删除)、配置模型参数(随机超参数寻优、10折交叉验证)并训练模型

    R语言caret包构建xgboost模型实战:特征工程(连续数据离散化.因子化.无用特征删除).配置模型参数(随机超参数寻优.10折交叉验证)并训练模型 目录

  6. 《写给程序员的数据挖掘实践指南》——5.2. 10折交叉验证的例子

    本节书摘来自异步社区出版社<写给程序员的数据挖掘实践指南>一书中的第5章,第5.2节,作者:[美]Ron Zacharski(扎哈尔斯基),更多章节内容可以访问云栖社区"异步社区 ...

  7. 《机器学习》课后习题 3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对率回归的错误率.

    参考了han同学的答案,数据集也可在han同学的github上下载. 3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对率回归的错误率. import numpy as n ...

  8. R语言惩罚逻辑回归、线性判别分析LDA、广义加性模型GAM、多元自适应回归样条MARS、KNN、二次判别分析QDA、决策树、随机森林、支持向量机SVM分类优质劣质葡萄酒十折交叉验证和ROC可视化

    最近我们被客户要求撰写关于葡萄酒的研究报告,包括一些图形和统计输出. 介绍 数据包含有关葡萄牙"Vinho Verde"葡萄酒的信息.该数据集有1599个观测值和12个变量,分别是 ...

  9. 机器学习基础|K折交叉验证与超参数搜索

    文章目录 交叉验证 交叉验证的概念 K的取值 为什么要用K折交叉验证 Sklearn交叉验证API 超参数搜索 超参数的概念 超参数搜索的概念 超参数搜索的原理 Sklearn超参数搜索API 实例 ...

  10. 十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集

    机器学习 数据挖掘 数据集划分 训练集 验证集 测试集 Q:如何将数据集划分为测试数据集和训练数据集? A:three ways: 1.像sklearn一样,提供一个将数据集切分成训练集和测试集的函数 ...

最新文章

  1. 跟我做CVS版本管理试验
  2. hihocoder 网络流二·最大流最小割定理
  3. 【ML】 李宏毅机器学习二:Logistic Regression
  4. IOS https抓包及10.3.3版本证书不生效问题解决
  5. 谈谈分布式事务(Distributed Transaction)[共5篇]
  6. 微信JS-SDK实现分享功能
  7. linux下keepalived+nginx的负载均衡搭建
  8. 远程桌面连接--“发生身份验证错误。要求的函数不受支持
  9. 鸿蒙会像IOS,你更看好鸿蒙还是苹果?iOS系统升级 分享与互联成苹果发布会主题...
  10. 小型仓库管理系统——毕业论文
  11. Invisible Backdoor Attack with Sample-Specific Triggers
  12. 讲座记录——科技论文写作及科研方法
  13. 常见的非线性回归模型
  14. 计算机 控制面板都打不开怎么办,控制面板打不开怎么办?控制面板打开办法大全...
  15. 熔断机制什么意思_熔断机制是什么意思?什么是熔断机制?
  16. oracle e-bussiness 简称
  17. BeyondCompare去掉时间戳的匹配
  18. 给你一本武林秘籍,和KeeWiDB一起登顶高性能
  19. python+人工智能学习线路
  20. 118、验证有效期JWT实施方案

热门文章

  1. html转word 文档 doc docx
  2. 2022软考中级软件设计师---易混淆知识点总结1
  3. 山东理工大学2021年下半年实验室安全考试
  4. java 对象转换成map_Java中对象(Object)转换成Map
  5. ORBSLAM3 的改进
  6. 如何在idea中设置Tomcat热部署
  7. 吴裕雄--天生自然 高等数学学习:函数展开成幂级数
  8. Win10取消开机密码
  9. crt连接中兴服务器,利用SecureCRT实现中兴C220自动登录
  10. 推荐系统之ALS算法详解