您的位置:首页 > 其它

机器学习分类之结合实际应用介绍KNN算法原理以及利用sklearn进行分类预测

2017-10-16 13:25 856 查看
KNN算法原理:
存在一个训练样本集,并且每个样本都存在标签(有监督学习)。输入没有标签的新样本数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取出与样本集中特征最相似的数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,而且k通常不大于20。最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

(一)KNN依然是一种监督学习算法
KNN(K Nearest Neighbors,K近邻 )算法是机器学习所有算法中理论最简单,最好理解的。KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判断(投票法)或者回归。如果K=1,那么新数据被简单分配给其近邻的类。KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义。对于监督学习,数据都有明确的label(分类针对离散分布,回归针对连续分布),根据机器学习产生的模型可以将新数据分到一个明确的类或得到一个预测值。对于非监督学习,数据没有label,机器学习出的模型是从数据中提取出来的pattern(提取决定性特征或者聚类等)。例如聚类是机器根据学习得到的模型来判断新数据“更像”哪些原数据集合。KNN算法用于分类时,每个训练数据都有明确的label,也可以明确的判断出新数据的label,KNN用于回归时也会根据邻居的值预测出一个明确的值,因此KNN属于监督学习。
(二)KNN算法的过程为:
1.选择一种距离计算方式, 通过数据所有的特征计算新数据与已知类别数据集中的数据点的距离
2.按照距离递增次序进行排序,选取与当前距离最小的k个点
3.对于离散分类,返回k个点出现频率最多的类别作预测分类;对于回归则返回k个点的加权值作为预测值
(三)KNN算法关键
KNN算法的理论和过程就是那么简单,为了使其获得更好的学习效果,有下面几个需要注意的地方。
1、数据的所有特征都要做可比较的量化。
若是数据特征中存在非数值的类型,必须采取手段将其量化为数值。举个例子,若样本特征中包含颜色(红黑蓝)一项,颜色之间是没有距离可言的,可通过将颜色转换为灰度值来实现距离计算。另外,样本有多个参数,每一个参数都有自己的定义域和取值范围,他们对distance计算的影响也就不一样,如取值较大的影响力会盖过取值较小的参数。为了公平,样本参数必须做一些scale处理,最简单的方式就是所有特征的数值都采取归一化处置。
2、需要一个distance函数以计算两个样本之间的距离。
距离的定义有很多,如欧氏距离、余弦距离、汉明距离、曼哈顿距离等等,关于相似性度量的方法可参考‘漫谈:机器学习中距离和相似性度量方法’。一般情况下,选欧氏距离作为距离度量,但是这是只适用于连续变量。在文本分类这种非连续变量情况下,汉明距离可以用来作为度量。通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。
3,确定K的值 K值选的太大易引起欠拟合,太小容易过拟合。交叉验证确定K值。
K是一个自定义的常数,K的值也直接影响最后的估计,一种选择K值得方法是使用
cross-validate(交叉验证)误差统计选择法。交叉验证的概念之前提过,就是数据样本的一部分作为训练样本,一部分作为测试样本,比如选择95%作为训练样本,剩下的用作测试样本。通过训练数据训练一个机器学习模型,然后利用测试数据测试其误差率。 cross-validate(交叉验证)误差统计选择法就是比较不同K值时的交叉验证平均误差率,选择误差率最小的那个K值。例如选择K=1,2,3,…
, 对每个K=i做100次交叉验证,计算出平均误差,然后比较、选出最小的那个。
(四)KNN分类
训练样本是多维特征空间向量,其中每个训练样本带有一个类别标签(喜欢或者不喜欢、保留或者删除)。分类算法常采用“多数表决”决定,即k个邻居中出现次数最多的那个类作为预测类。“多数表决”分类的一个缺点是出现频率较多的样本将会主导测试点的预测结果,那是因为他们比较大可能出现在测试点的K邻域而测试点的属性又是通过K领域内的样本计算出来的。解决这个缺点的方法之一是在进行分类时将K个邻居到测试点的距离考虑进去。例如,若样本到测试点距离为d,则选1/d为该邻居的权重(也就是得到了该邻居所属类的权重),接下来统计统计k个邻居所有类标签的权重和,值最大的那个就是新数据点的预测类标签。
举例,K=5,计算出新数据点到最近的五个邻居的举例是(1,3,3,4,5),五个邻居的类标签是(yes,no,no,yes,no)
若是按照多数表决法,则新数据点类别为no(3个no,2个yes);若考虑距离权重类别则为yes(no:2/3+1/5,yes:1+1/4)。
(五)KNN优缺点
算法优点:

精度高、对异常值不敏感、无数据输入设定、简单易于理解、通过对k的选择具备丢噪音数据的健壮性。
算法缺点:

1.KNN算法是懒散学习方法(lazy learning,基本上不学习),一些积极学习的算法要快很多。
2.类别评分不是规格化的(不像概率评分)(???)。
3.输出的可解释性不强,例如决策树的可解释性较强。
4.该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算最近的邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
5.计算量较大。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。

(六)KNN运用sklearn对测试集进行分类预测
from sklearn import neighbors

from sklearn import datasets

knn = neighbors.KNeighborsClassifier()

iris = datasets.load_iris()

# save data

# f = open("iris.data.csv", 'wb')

# f.write(str(iris))

# f.close()

print iris

knn.fit(iris.data, iris.target)

predictedLabel = knn.predict([[0.1, 0.2, 0.3, 0.4]])

print "hello"

#print ("predictedLabel is :" + predictedLabel)

print predictedLabel

(七)KNN运用sklearn的主要步骤

From sklearn.neighbors import KNeighborsClassifier

X-----特征

Y------标签

Knc = KNeighborsClassifier(n_neighbors=(所谓的K个数), weights=’uniform’(可查阅文档调整))

Knc.fit(X, Y)

Knc.predict()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: