机器学习基础_KNN

01 什么是KNN

1.1 定义

如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

1.2 距离公式

欧氏距离

两个样本各维度之差的平方之和

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rVE5guxy-1625640862978)(C:\Users\q\AppData\Roaming\Typora\typora-user-images\image-20201118172854126.png)]

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)

n_neighbors:int,可选,默认5,k_neighbors查询默认使用的邻居数

algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}=============》选择最近邻算法

brute:蛮力实现。比较适合于少量样本的简单模型的时候用。

kd_tree:KD树算法提高了KNN搜索的效率(r仍采用欧式距离)

auto:自动选择

1.3 分析

1.3.1 缩小数据范围

DataFrame.query(”查询条件“)

1.3.2 删除没用的数据格式

DataFrame.drop

from sklearn.model_selection import train_test_split

import pandas as pd

from sklearn.neighbors import  KNeigborsClassifier

from sklearn.preprocessing import StandardScaler



def knncls():

​	#读入数据

​	data=pd.read_csv("路径")

​	#1、缩小数据范围

​	data=data.query("x > 1.0 & x <  1.25 & y > 2.5 & y < 2.75")

​	#2、把签到位置小于N个人的位置删掉

​	#3、分割数据集到训练集、测试集

​	#取出特征值和目标值

​	y = data["place_id"]

​	x = data[['x','y','accuracy','time']]

​	x_train,y_train,,x_test,y_test = train_test_split(x,y,test_szie=0.3)

   #4、进行标准化

​	std=Standscaler()

​	#训练集

​	std.fit_transform(x_train)

​	#训练集

​	std.fit_transform(y_train)

​	#5.利用KNN

​	knn = KNeighborsClassfier(n_neighbors=5)

​	#fit

​	knn.fit(x_train,y_train)

​	#预测

​	y_predict = knn.predict(x_test)

​	#评估(predict()与score()无关系)

​	knn.score(x_test,y_test)

02 总结

优点:简单,易于理解,易于实现,无需训练

缺点:准确率不高,性能不好;必须指定K值,且K值影响很大

懒惰算法

适用场景:小场景——几千、几万

KNN的主要优点有:

1) 理论成熟,思想简单,既可以用来做分类也可以用来做回归

2) 可用于非线性分类

3) 训练时间复杂度比支持向量机之类的算法低,仅为O(n)

4) 和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感

5) 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合

6)该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分

KNN的主要缺点有:

1)计算量大,尤其是特征数非常多的时候

2)样本不平衡的时候,对稀有类别的预测准确率低

3)KD树,球树之类的模型建立需要大量的内存

4)使用懒散学习方法,基本上不学习,导致预测时速度比起逻辑回归之类的算法慢

5)相比决策树模型,KNN模型可解释性不强

03 模型选择与调优

3.1 交叉验证

3.1.1 目的

为了被评估的模型更可靠

3.1.2 what

将训练数据集分为若干份(n份-》n折交叉验证,通常n=10),分为训练、验证(每份依次做验证集

准确率取平均值反映参数效果

比较不同参数的表现结果(每组的超参数都采用交叉验证

from sklearn.model_selection import GridSearchCV

  • estimator:估计器对象

  • param_grid:估计其参数,字典dict{“n_neighbors”:[1,3,5]}

  • cv:几折交叉验证

  • fit:输入训练集

  • score:准确率

  • 结果分析

  • bestscore:在交叉验证中最好的结果

  • bestestimator:最好的参数模型

  • cvresults:每次交叉验证后的验证结果和训练集准确率

  • from  sklearn.model_selection import GridSearchCV
    
    param = {"n_neighbors":[1,3,5,7,10]}
    
    gc=GridSearchCV(knn,param_grid=param,cv=10)
    
    gc.fit(x_train,y_train)
    
    print(gc.best_score_)
    

前文

from sklearn.model_selection import train_test_split

import pandas as pd

from sklearn.neighbors import  KNeigborsClassifier

from sklearn.preprocessing import StandardScaler



def knncls():

​	#读入数据

​	data=pd.read_csv("路径")

​	#1、缩小数据范围

​	data=data.query("x > 1.0 & x <  1.25 & y > 2.5 & y < 2.75")

​	#2、把签到位置小于N个人的位置删掉

​	#3、分割数据集到训练集、测试集

​	#取出特征值和目标值

​	y = data["place_id"]

​	x = data[['x','y','accuracy','time']]

​	x_train,y_train,,x_test,y_test = train_test_split(x,y,test_szie=0.3)

   #4、进行标准化

​	std=Standscaler()

​	#训练集

​	std.fit_transform(x_train)

​	#训练集

​	std.fit_transform(y_train)

​	#5.利用KNN

​	knn = KNeighborsClassfier(n_neighbors=5)

04 实验

4.1 wine

4.1.1
4.1.1.1 调试:

test_size=0.3

4.1.1.2 统一量纲

KNeighborsClassifier( n_neighbors=5, algorithm=“brute” )

花费:14s

cv=2

param = {“n_neighbors”: [1, 3, 5, 7, 10]},

4.1.1.4 测试集预测准确率

0.9444444444444444
1.0
0.9444444444444444
0.9629629629629629
0.9259259259259259
0.9444444444444444
0.9259259259259259
0.9444444444444444
0.9444444444444444
0.9629629629629629
0.9074074074074074
0.9259259259259259
0.9444444444444444
0.9074074074074074
0.9259259259259259
0.9629629629629629
0.8888888888888888
0.9259259259259259
0.9259259259259259
1.0
0.9814814814814815
0.9444444444444444
0.9444444444444444
0.9814814814814815
1.0
0.9814814814814815
0.9259259259259259
0.8333333333333334
0.9814814814814815
0.9259259259259259
1.0
0.9629629629629629
0.9444444444444444
0.8888888888888888
0.9629629629629629
0.9629629629629629
0.8888888888888888
0.9814814814814815
0.9444444444444444
0.9629629629629629
0.9814814814814815
0.9629629629629629
0.9629629629629629
0.9629629629629629
1.0
0.9259259259259259
1.0
0.8888888888888888
0.9444444444444444
0.9259259259259259

4.1.1.3 方差:

0.04599761051373952
0.003285543608124164
0.023297491039426577
0.011350059737156415
0.03793309438470727
0.015232974910394326
0.1054360812425329
0.007168458781362075
0.052270011947431305
0.04599761051373952
0.007168458781362075
0.017622461170848314
0.033751493428912815
0.032258064516129004
0.019414575866188666
0.048387096774193505
0.003285543608124164
0.004778972520908087
0.023297491039426577
0.005675029868578263
0.02897252090800484
0.044205495818399054
0.023297491039426577
0.048387096774193505
0.023297491039426577
0.04599761051373952
0.003285543608124164
0.04988052568697732
0.04988052568697732
0.021804062126642765
0.03136200716845883
0.032258064516129004
0.005675029868578263
0.04988052568697732
0.033751493428912815
0.032258064516129004
0.023297491039426577
0.004778972520908087
0.012843488649940338
0.012843488649940338
0.1738351254480287
0.09498207885304666
0.03793309438470727
0.007168458781362075
0.003285543608124164
0.04749103942652333
0.007168458781362075
0.06600955794504182
0.021804062126642765
0.03136200716845883

4.1.2
4.1.2.1 调试:

test_size=0.3

4.1.2.2 统一量纲

KNeighborsClassifier( n_neighbors=5, algorithm=“kd_tree” )

花费:9s

cv=2

param = {“n_neighbors”: [1, 3, 5, 7, 10]},

4.1.2.4 测试集预测准确率

0.9444444444444444
0.9629629629629629
0.9814814814814815
1.0
0.9444444444444444
0.9814814814814815
0.9629629629629629
0.8888888888888888
0.8888888888888888
0.9444444444444444
0.9814814814814815
0.9259259259259259
0.9259259259259259
0.9444444444444444
0.9629629629629629
1.0
0.9259259259259259
0.9629629629629629
0.9444444444444444
0.9444444444444444
0.9074074074074074
0.9629629629629629
0.9259259259259259
0.9444444444444444
0.8888888888888888
0.9814814814814815
0.9444444444444444
0.9814814814814815
0.9444444444444444
0.9629629629629629
0.8888888888888888
0.9629629629629629
0.9444444444444444
0.9259259259259259
0.9814814814814815
1.0
0.9074074074074074
0.9074074074074074
0.9259259259259259
0.9629629629629629
0.9074074074074074
0.8148148148148148
0.9814814814814815
0.9814814814814815
0.9444444444444444
0.8888888888888888
0.9629629629629629
0.9074074074074074
1.0
0.9814814814814815

4.1.2.3 方差:

0.021804062126642765
0.002389486260453988
0.017622461170848314
0.015232974910394326
0.019414575866188666
0.003285543608124164
0.029868578255675016
0.002389486260453988
0.004778972520908087
0.003285543608124164
0.0008960573476701761
0.025686977299880565
0.03136200716845883
0.012843488649940338
0.07885304659498216
0.013739545997610514
0.004778972520908087
0.007168458781362075
0.03136200716845883
0.003285543608124164
0.060334528076463556
0.16905615292712073
0.044205495818399054
0.021804062126642765
0.013739545997610514
0.023297491039426577
0.0893070489844684
0.06451612903225801
0.003285543608124164
0.027479091995220917
0.013739545997610514
0.023297491039426577
0.012843488649940338
0.013739545997610514
0.04988052568697732
0.013739545997610514
0.0707885304659499
0.033751493428912815
0.015232974910394326
0.01702508960573479
0.015232974910394326
0.044205495818399054
0.013739545997610514
0.012843488649940338
0.013739545997610514
0.041816009557945066
0.07646356033452806
0.025686977299880565
0.052270011947431305
0.011350059737156415

4.1.3
4.1.3.1 调试:

test_size=0.3

4.1.3.2 统一量纲

KNeighborsClassifier( n_neighbors=5, algorithm=“ball_tree” )

花费:9s

cv=2

param = {“n_neighbors”: [1, 3, 5, 7, 10]},

4.1.3.4 测试集预测准确率

0.9814814814814815
0.9814814814814815
0.9074074074074074
0.9444444444444444
1.0
1.0
0.9444444444444444
0.9814814814814815
0.9629629629629629
0.9814814814814815
0.9814814814814815
0.9444444444444444
0.9814814814814815
0.9259259259259259
0.9259259259259259
0.9629629629629629
0.9444444444444444
0.9259259259259259
0.9814814814814815
0.9444444444444444
0.9629629629629629
0.9629629629629629
0.9814814814814815
0.9259259259259259
0.9814814814814815
0.9259259259259259
0.8888888888888888
0.9629629629629629
0.9074074074074074
0.9444444444444444
0.8703703703703703
0.9444444444444444
0.9444444444444444
0.9629629629629629
0.9444444444444444
0.8888888888888888
0.9629629629629629
0.9259259259259259
0.9259259259259259
1.0
0.9074074074074074
0.9259259259259259
0.8888888888888888
0.9444444444444444
0.9444444444444444
0.9629629629629629
0.9814814814814815
0.9444444444444444
0.9444444444444444
0.9444444444444444

4.1.3.3 方差:

0.11589008363201914
0.032258064516129004
0.04659498207885315
0.032258064516129004
0.023297491039426577
0.021804062126642765
0.019414575866188666
0.03136200716845883
0.07646356033452806
0.015232974910394326
0.012843488649940338
0.003285543608124164
0.011350059737156415
0.021804062126642765
0.03942652329749108
0.040322580645161255
0.0361409796893668
0.060334528076463556
0.025686977299880565
0.033751493428912815
0.0008960573476701761
0.05794504181600957
0.004778972520908087
0.004778972520908087
0.06839904420549581
0.03554360812425328
0.012843488649940338
0.012843488649940338
0.027479091995220917
0.015232974910394326
0.041816009557945066
0.04988052568697732
0.023297491039426577
0.025686977299880565
0.004778972520908087
0.027479091995220917
0.025686977299880565
0.06839904420549581
0.011350059737156415
0.011350059737156415
0.019414575866188666
0.041816009557945066
0.005675029868578263
0.09498207885304666
0.019414575866188666
0.021804062126642765
0.08691756272401441
0.054659498207885404
0.004778972520908087
8960573476701761
0.05794504181600957
0.004778972520908087
0.004778972520908087
0.06839904420549581
0.03554360812425328
0.012843488649940338
0.012843488649940338
0.027479091995220917
0.015232974910394326
0.041816009557945066
0.04988052568697732
0.023297491039426577
0.025686977299880565
0.004778972520908087
0.027479091995220917
0.025686977299880565
0.06839904420549581
0.011350059737156415
0.011350059737156415
0.019414575866188666
0.041816009557945066
0.005675029868578263
0.09498207885304666
0.019414575866188666
0.021804062126642765
0.08691756272401441
0.054659498207885404
0.004778972520908087
0.04599761051373952

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值