KNN分类器(十折交叉验证)

k-近邻算法采用测量不同特征值之间的距离方法(上面写的公式)进行分类。

优点:精度高、对异常值不敏感、无数据输入假定。

缺点:计算复杂度高、空间复杂度高。

原理:1.存在一个训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。

  2.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相思数据(最近邻)的分类标签。

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

 1 ‘‘‘
 2     1、计算已知类别数据集中的点与当前点之间的距离
 3     2、按照距离递增次序排序
 4     3、选取与当前点距离最小的k个点
 5     4、确定前k个点所在类别的出现概率
 6     5、返回前k个点出现频率最高的类别作为当前点的预测分类
 7 ‘‘‘
 8 import numpy as np
 9 import operator
10
11 #处理文本
12 def fileToMatrix(filename):
13     fr = open(filename)
14     arrayOLines = fr.readlines()
15     numberOfLines = len(arrayOLines)
16     returnMat = np.zeros((numberOfLines, 5))
17     classLabelVector = []
18     index = 0
19     for line in arrayOLines:
20         line = line.strip()
21         listFromLine = line.split(‘,‘)
22         returnMat[index,:] = listFromLine[0:5]
23         classLabelVector.append(listFromLine[-1])
24         index += 1
25     return returnMat, classLabelVector
26
27 #功能:归一化数据,避免某些数据的特征值过大
28 def autoNorm(dataSet):
29     minVals = dataSet.min(0)#取列值的最小值
30     maxVals = dataSet.max(0)
31     ranges = maxVals - minVals
32     normDataSet = np.zeros(np.shape(dataSet))
33     m = dataSet.shape[0]
34     normDataSet = dataSet - np.tile(minVals, (m,1))
35     normDataSet = normDataSet/np.tile(ranges, (m, 1))#特征值相除
36     return normDataSet, ranges, minVals
37
38 #功能:kNN核心算法
39 #intX - 输入向量,dataSet - 输入训练样本集,labels - 标签向量
40 def classify(inX, dataSet, labels, k):
41     #欧式距离的计算
42     dataSize = dataSet.shape[0]#数据的行数
43     diffMat = np.tile(inX, (dataSize,1)) - dataSet#将输入向量inX纵向重复dataSet的行数次
44     sqDiffMat = diffMat ** 2
45     sqDistances = sqDiffMat.sum(axis = 1)# 每行数据相加
46     distances = sqDistances ** 0.5#得到训练样本集每一点与当前点的距离
47     sortedDistIndicies = distances.argsort()
48     #选择距离最小的k个点
49     classCount = {}
50     for i in range(k):
51         voteIlabel = labels[sortedDistIndicies[i]]#最近K个的距离对应的类别
52         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#类别分别出现的概率
53     sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)#选择发生频率最高的元素标签
54     return sortedClassCount[0][0]
55
56 #功能:#功能:十折交叉验证
57 #思路:将数据集分成十份,轮流将其中9份做训练1份做测试,10次结果的均值作为对算法精度的估计
58 #一般还要进行多次10倍交叉验证
59 def dataClassTest(filename,k):
60     testRate = 0.1
61     datingDataMat, datingLabels = fileToMatrix(filename)
62     datingDataMat = datingDataMat[:,:k-1]
63     normMat, ranges, minVals = autoNorm(datingDataMat)
64     m = normMat.shape[0]
65     numTestVecs = int(m * testRate)
66     all = 0
67     for k in range(1,11):
68         t = normMat[0:numTestVecs]
69         p = datingLabels[0:numTestVecs]
70         for i in range(numTestVecs):
71             errorCount = 0
72             classifierResult = classify(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
73             if(classifierResult != datingLabels[i]):    errorCount += 1.0
74         #----------将第几折的数据拿出来,放回到normMat的前面
75         b = normMat[numTestVecs*(k-1):numTestVecs*k]
76         normMat[0:numTestVecs] = b
77         normMat[numTestVecs*(k-1):numTestVecs*k] = t
78         errorRate = errorCount/float(numTestVecs)
79         #----------将第几折类别拿出来,放回到datingLabels的前面
80         c = datingLabels[numTestVecs*(k-1):numTestVecs*k]
81         datingLabels[0:numTestVecs] = c
82         datingLabels[numTestVecs*(k-1):numTestVecs*k] = p
83         errorRate = errorCount/float(numTestVecs)
84         all = all + errorRate
85         #------------------------------------------------------------------
86         print("第%d折分类的错误率为%f" % (k,(errorCount/float(numTestVecs))))
87     #获得平均错误率
88     print("平均错误率为%f" % (all/10))

欢迎加邮箱一起讨论机器学习[email protected]

原文地址:https://www.cnblogs.com/bigstrawberrywakaka/p/9038390.html

时间: 2024-10-29 01:03:03

KNN分类器(十折交叉验证)的相关文章

(数据挖掘-入门-6)十折交叉验证和K近邻

主要内容: 1.十折交叉验证 2.混淆矩阵 3.K近邻 4.python实现 一.十折交叉验证 前面提到了数据集分为训练集和测试集,训练集用来训练模型,而测试集用来测试模型的好坏,那么单一的测试是否就能很好的衡量一个模型的性能呢? 答案自然是否定的,单一的测试集具有偶然性和随机性.因此本文介绍一种衡量模型(比如分类器)性能的方法——十折交叉验证(10-fold cross validation) 什么是十折交叉验证? 假设有个数据集,需要建立一个分类器,如何验证分类器的性能呢? 将数据集随机均为

R语言——K折交叉验证之随机均分数据集

今天,在阅读吴喜之教授的<复杂数据统计方法>时,遇到了把一个数据集按照某个因子分成若干子集,再把若干子集随机平均分成n份的问题,吴教授的方法也比较好理解,但是我还是觉得有点繁琐,因此自己编写了一个函数,此后遇到这种问题只需要运行一下函数就可以了. 这里采用R中自带的iris数据集, > str(iris) 'data.frame': 150 obs. of 5 variables: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4

留出法、K折交叉验证、留一法进行数据集划分

from sklearn import datasets from sklearn import model_selection #引入sklearn库中手写数字的数据集 digits = datasets.load_digits() #留出法 X_train, X_test, y_train, y_test = model_selection.train_test_split(digits.data, digits.target, test_size = 0.2, shuffle = True

cross_val_score 交叉验证与 K折交叉验证,嗯都是抄来的,自己作个参考

因为sklearn cross_val_score 交叉验证,这个函数没有洗牌功能,添加K 折交叉验证,可以用来选择模型,也可以用来选择特征 sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs') 这里的cv 可以用下面的kf 关于s

K折交叉验证

交叉验证的思想 交叉验证主要用于防止模型过于复杂而引起的过拟合,是一种评价训练数据的数据集泛化能力的统计方法.其基本思想是将原始数据进行划分,分成训练集和测试集,训练集用来对模型进行训练,测试集用来测试训练得到的模型,以此来作为模型的评价指标. 简单的交叉验证 将原始数据D按比例划分,比如7:3,从D中随机选择70%的数据作为训练集train_data,剩余的作为测试集test_data(绿色部分).如下图所示,这里的数据都只利用了一次,并没有充分利用,对于小数据集,需要充分利用其数据的信息来训

小白学习之pytorch框架(6)-模型选择(K折交叉验证)、欠拟合、过拟合(权重衰减法(=L2范数正则化)、丢弃法)、正向传播、反向传播

下面要说的基本都是<动手学深度学习>这本花书上的内容,图也采用的书上的 首先说的是训练误差(模型在训练数据集上表现出的误差)和泛化误差(模型在任意一个测试数据集样本上表现出的误差的期望) 模型选择 验证数据集(validation data set),又叫验证集(validation set),指用于模型选择的在train set和test set之外预留的一小部分数据集 若训练数据不够时,预留验证集也是一种luxury.常采用的方法为K折交叉验证.原理为:把train set分割成k个不重合

机器学习中数据的划分,N折交叉验证

1:对于分类数据来说,它们的target可能分配是不均匀的,比如在医疗数据当中得癌症的人比不得癌症的人少很多,这个时候,使用的数据划分方法有  StratifiedKFold  ,StratifiedShuffleSplit 2:对于分组数据来说,它的划分方法是不一样的,主要的方法有 GroupKFold,LeaveOneGroupOut,LeavePGroupOut,GroupShuffleSplit 3:对于时间关联的数据,方法有TimeSeriesSplit eg: 采用Stratifie

机器学习-CrossValidation交叉验证详解

版权声明:本文为原创文章,转载请注明来源. 1.原理 1.1 概念 交叉验证(Cross-validation)主要用于模型训练或建模应用中,如分类预测.PCR.PLS回归建模等.在给定的样本空间中,拿出大部分样本作为训练集来训练模型,剩余的小部分样本使用刚建立的模型进行预测,并求这小部分样本的预测误差或者预测精度,同时记录它们的加和平均值.这个过程迭代K次,即K折交叉.其中,把每个样本的预测误差平方加和,称为PRESS(predicted Error Sum of Squares). 1.2

使用交叉验证对鸢尾花分类模型进行调参(超参数)

如何选择超参数: 交叉验证: 如图, 大训练集分块,使用不同的分块方法分成N对小训练集和验证集. 使用小训练集进行训练,使用验证集进行验证,得到准确率,求N个验证集上的平均正确率: 使用平均正确率最高的超参数,对整个大训练集进行训练,训练出参数. 在训练集上训练. 十折交叉验证 网格搜索 诸如你有多个可调节的超参数,那么选择超参数的方法通常是网格搜索,即固定一个参.变化其他参,像网格一样去搜索. # 人工智能数据源下载地址:https://video.mugglecode.com/data_ai