KNN算法
KNN算法(K-NearestNeighbor)或者叫最近邻算法
算法原理:
找到k个与新数据最近的样本,取样本中最多的一个类别作为新数据的类别
算法的优点:
1.简单易实现
实际上并没有抽象出任何模型,而是把全部数据直接当作模型本身,当一条新数据来了之后跟数据集里的每一条数据进行对比
2.对于边界不规则的数据效果较好
最终的预测是把未知数据作为中心点,然后画一个圈,使得圈里有k个数据,所以对边界不规则的数据要比线性的分类器效果要好
(线性分类器可以理解为画一条直线来分类不规则的数据,则很难找到一条线将其分成左右两边)
算法的缺点:
1.只适合小数据集
每次预测新数据都需要使用全部数据集
2.数据不平衡效果不好
有的数据特别多,有的特别少,数据多的更占竞争优势
3.必须要做数据标准化
由于使用距离来进行计算,由于数据的量纲不同,数值较大的字段影响就会变大,所以需要进行标准化
4.不适合特征维度太多的数据
由于只能处理小数据集,如果数据维度太多,那么样本在每个维度上的分布就很少
关于k的选取
k值的选取会影响到模型的效果。
当k值越小的时候越容易过拟合(因为结果的判断与某一个点强相关),k越大的时候越容易欠拟合(因为要考虑所有样本的情况)
合适的k值需要根据经验和效果进行尝试(一般k从1开始不断地尝试查看准确率,随着k的增加,一般情况下准确率会先变大后变小,然后选取效果最好的k值就可以了)
#knn算法 from sklearn import datasets #sklearn的数据集 from sklearn.neighbors import KNeighborsClassifier #sklearn模块的KNN类 import numpy as np #矩形运算库numpy np.random.seed(0) #设置随机种子,不设置的话默认是按系统时间作为参数,设置后可以保证我们每次产生的随机数是一样的 iris = datasets.load_iris() #获取鸢尾花数据集 iris_x = iris.data #数据部分 iris_y = iris.target #类别部分 #从150条数据中选取140条作为训练集,10条作为测试集。permutation接收一个数作为参数(这里为数据集长度150), #产生一个0-149乱序一维数组 randomarr = np.random.permutation(len(iris_x)) iris_x_train = iris_x[randomarr[:-10]] #训练集数据 iris_y_train = iris_y[randomarr[:-10]] #训练集标签 iris_x_test = iris_x[randomarr[-10:]] #测试集数据 iris_y_test = iris_y[randomarr[-10:]] #测试集数据 #定义一个KNN分类器对象 knn = KNeighborsClassifier() #调用该对象的训练方法,主要接收两个参数:训练数据集及其类别标签 knn.fit(iris_x_train,iris_y_train) #调用预测方法,主要接收一个参数:测试数据集 iris_y_predict = knn.predict(iris_x_test) #计算个测试样本预测的概率值。这里没有用概率值。但实际生活中可能会参考拉进行最后结果的筛查, #而不是直接使用给出的预测标签 probility = knn.predict_proba(iris_x_test) #计算与最后一个测试样本距离最近的5个点,返回的是这些样本的序号组成的数组 neighborpoint = knn.kneighbors([iris_x_test[-1]],5) #调用该对象的打分方法,计算出准确率 score = knn.score(iris_x_test,iris_y_test,sample_weight=None) #输出测试结果 print('iris_y_predict=') print(iris_y_predict) #输出原始测试数据集的正确标签,以方便对比 print('iris_y_test=') print(iris_y_test) #输出准确率计算结果 print('Accuracy:',score)
#knn算法 from sklearn import datasets #sklearn的数据集 from sklearn.neighbors import KNeighborsClassifier #sklearn模块的KNN类 import numpy as np #矩形运算库numpy np.random.seed(0) #设置随机种子,不设置的话默认是按系统时间作为参数,设置后可以保证我们每次产生的随机数是一样的 iris = datasets.load_iris() #获取鸢尾花数据集 iris_x = iris.data #数据部分 iris_y = iris.target #类别部分 #从150条数据中选取140条作为训练集,10条作为测试集。permutation接收一个数作为参数(这里为数据集长度150), #产生一个0-149乱序一维数组 randomarr = np.random.permutation(len(iris_x)) iris_x_train = iris_x[randomarr[:-10]] #训练集数据 iris_y_train = iris_y[randomarr[:-10]] #训练集标签 iris_x_test = iris_x[randomarr[-10:]] #测试集数据 iris_y_test = iris_y[randomarr[-10:]] #测试集数据 #定义一个KNN分类器对象 knn = KNeighborsClassifier() #调用该对象的训练方法,主要接收两个参数:训练数据集及其类别标签 knn.fit(iris_x_train,iris_y_train) #调用预测方法,主要接收一个参数:测试数据集 iris_y_predict = knn.predict(iris_x_test) #计算个测试样本预测的概率值。这里没有用概率值。但实际生活中可能会参考拉进行最后结果的筛查, #而不是直接使用给出的预测标签 probility = knn.predict_proba(iris_x_test) #计算与最后一个测试样本距离最近的5个点,返回的是这些样本的序号组成的数组 neighborpoint = knn.kneighbors([iris_x_test[-1]],5) #调用该对象的打分方法,计算出准确率 score = knn.score(iris_x_test,iris_y_test,sample_weight=None) #输出测试结果 print('iris_y_predict=') print(iris_y_predict) #输出原始测试数据集的正确标签,以方便对比 print('iris_y_test=') print(iris_y_test) #输出准确率计算结果 print('Accuracy:',score)