kNN处理iris数据集-使用交叉验证方法确定最优 k 值
基本流程:
1、计算测试实例到所有训练集实例的距离;
2、对所有的距离进行排序,找到k个最近的邻居;
3、对k个近邻对应的结果进行合并,再排序,返回出现次数最多的那个结果。
交叉验证:
对每一个k,使用验证集计算,记录k对应的错误次数,取错误数最小的k
# -*- coding: utf-8 -*-
import os
import pandas as pd
import matplotlib.pyplot as plt
import math
import operator
#按照8:2的比例分割数据
#testSetIndex : 第几组为测试样本,取值范围0 - 4
def splitData(trainSet, testSet, testSetIndex):
    #data = pd.read_csv('iris.txt', skiprows=0, skipfooter=0, sep=r'\s+', encoding="utf-8", engine='python', header=None)
    data = pd.read_csv('iris.txt', encoding="utf-8", engine='python', header=None)
    for i in range(150):
        if testSetIndex == (i % 50) / 10:
            testSet.append(data.iloc[i])
        else:
            trainSet.append(data.iloc[i])
    return
#计算欧氏距离
#instance1 : 实例1
#instance2 : 实例2
#dimension :维度
def computeDistance(instance1, instance2, dimension):
    distance = 0
    for i in xrange(dimension):
        #print(instance1[i], instance2[i])
        distance += pow((instance1[i] - instance2[i]), 2)
    return math.sqrt(distance)
#trainSet : 训练样本集
#instance : 实例数据
#k : 1 - 120
def kNN(trainSet, instance, k):
    distances = []
    dimension = len(instance) - 1
    #计算测试实例到训练集实例的距离
    for i in xrange(len(trainSet)):
        dist = computeDistance(instance, trainSet[i], dimension)
        distances.append((trainSet[i], dist))
    #对所有的距离进行排序
    distances.sort(key=operator.itemgetter(1))
    neighbors = []
    #返回k个最近邻
    for i in range(k):
        neighbors.append(distances[i][0])
    #对k个近邻进行合并,返回最多的那个
    listClass = {}
    for i in xrange(len(neighbors)):
        response = neighbors[i][4]
        if response in listClass:
            listClass[response] += 1
        else:
            listClass[response] = 1
    #排序
    sortResult = sorted(listClass.iteritems(), key = operator.itemgetter(1), reverse=True)
    return sortResult[0][0]
def main():
    trainSet = []     #训练数据集
    testSet = []      #测试数据集
    #1. 数据分割8:2
    splitData(trainSet, testSet, 4)
    #2. 使用交叉验证方法确定最优 k 值,并给出在该情形下分类器的错误分类率
    errCountSet = [0] * 120
    #9总数据切割方式,对每一个k,记录k对应的总错误次数
    for j in xrange(0, 5):
        trainSet = []
        testSet = []
        splitData(trainSet, testSet, j)
        for k in xrange(0, 120):
            #对每一个k,使用验证集计算,记录k对应的错误次数
            for i in xrange(len(testSet)):
                trainResult = kNN(trainSet, testSet[i], k + 1)
                if trainResult != testSet[i][4]:
                    errCountSet[k] = errCountSet[k] + 1
    #取错误数最小的k 有多个
    min = 1
    for i in xrange(0, 120):
        errCountSet[i] = errCountSet[i] / (30 * 5.0)
        if min > errCountSet[i]:
            min = errCountSet[i]
            #k = i + 1
    #打印错误率最小的k值
    for i in xrange(0, 120):
        if min == errCountSet[i]:
            print i + 1, min
    fig = plt.figure(figsize=(20, 15))
    ax1 = fig.add_subplot(111)
    #ax2 = fig.add_subplot(122)
    ax1.plot(range(1, 121), errCountSet)
    ax1.set_xlabel('k')
    ax1.set_ylabel('Error Rate')
    plt.show()
    return
if __name__ == "__main__":
    main()
分别使用参数k=1~120进行实验,并进行交叉验证,错误分类率曲线如下:

kNN处理iris数据集-使用交叉验证方法确定最优 k 值的更多相关文章
- 使用KNN对iris数据集进行分类——python
		
filename='g:\data\iris.csv' lines=fr.readlines()Mat=zeros((len(lines),4))irisLabels=[]index=0for lin ...
 - 十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集
		
机器学习 数据挖掘 数据集划分 训练集 验证集 测试集 Q:如何将数据集划分为测试数据集和训练数据集? A:three ways: 1.像sklearn一样,提供一个将数据集切分成训练集和测试集的函数 ...
 - 用交叉验证改善模型的预测表现-着重k重交叉验证
		
机器学习技术在应用之前使用“训练+检验”的模式(通常被称作”交叉验证“). 预测模型为何无法保持稳定? 让我们通过以下几幅图来理解这个问题: 此处我们试图找到尺寸(size)和价格(price)的关系 ...
 - 机器学习——交叉验证,GridSearchCV,岭回归
		
0.交叉验证 交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set) ...
 - 机器学习基础:(Python)训练集测试集分割与交叉验证
		
在上一篇关于Python中的线性回归的文章之后,我想再写一篇关于训练测试分割和交叉验证的文章.在数据科学和数据分析领域中,这两个概念经常被用作防止或最小化过度拟合的工具.我会解释当使用统计模型时,通常 ...
 - S折交叉验证(S-fold cross validation)
		
S折交叉验证(S-fold cross validation) 觉得有用的话,欢迎一起讨论相互学习~Follow Me 仅为个人观点,欢迎讨论 参考文献 https://blog.csdn.net/a ...
 - 总结:Bias(偏差),Error(误差),Variance(方差)及CV(交叉验证)
		
犀利的开头 在机器学习中,我们用训练数据集去训练(学习)一个model(模型),通常的做法是定义一个Loss function(误差函数),通过将这个Loss(或者叫error)的最小化过程,来提高模 ...
 - 验证和交叉验证(Validation & Cross Validation)
		
之前在<训练集,验证集,测试集(以及为什么要使用验证集?)(Training Set, Validation Set, Test Set)>一文中已经提过对模型进行验证(评估)的几种方式. ...
 - MATLAB曲面插值及交叉验证
		
在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点.插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值.曲面插值是对三维数据进行离 ...
 
随机推荐
- (转)tasklist命令参数应用详细图解
			
原文:https://blog.csdn.net/bcbobo21cn/article/details/51759521 一 操作实例不带参数: /svc参数: /SVC 显示每个进程中的服务信息,当 ...
 - nmcli工具详解
			
目录 1. nmcli 安装 2. nmcli 基本选项 3. general 常规选项 3.1 status 3.2 hostname 3.3 permissions 3.4 loggin 4. n ...
 - 干货 | 请收下这份2018学习清单:150个最好的机器学习,NLP和Python教程
			
机器学习的发展可以追溯到1959年,有着丰富的历史.这个领域也正在以前所未有的速度进化.在之前的一篇文章中,我们讨论过为什么通用人工智能领域即将要爆发.有兴趣入坑ML的小伙伴不要拖延了,时不我待! 在 ...
 - 【Spark笔记】Windows10 本地搭建单机版Spark开发环境
			
0x00 环境及软件 1.系统环境 OS:Windows10_x64 专业版 2.所需软件或工具 JDK1.8.0_131 spark-2.3.0-bin-hadoop2.7.tgz hadoop-2 ...
 - thinkphp常用标签总结
			
三元运算标签 {$v['member_id'] == 1 ? 正常 : 不正常} volist标签 <volist name="data" id="v"& ...
 - POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)
			
题目链接: https://cn.vjudge.net/problem/POJ-3037 Bessie and the rest of Farmer John's cows are taking a ...
 - npm包
			
https://www.cnblogs.com/xinxingyu/p/5736244.html node - glob模块讲解 https://github.com/isaacs/node- ...
 - c# 正则格式化文本防止SQL注入
			
/// <summary> /// 格式化文本(防止SQL注入) /// </summary> /// <param name="str">&l ...
 - SQL SERVER 如何声明一个变量
			
DECLARE @i AS INT; ; GO 或者 ; GO 表表达式形式 ); SET @empname = (SELECT firstname + N' ' + lastname FROM HR ...
 - 菜鸟入门【ASP.NET Core】4:在CentOS上安装.NET Core运行时、部署到CentOS
			
下载.NET Core SDK 下载地址:https://www.microsoft.com/net/download/windows 第一步:Add the dotnet product feed( ...