#Python机器学习#KNN分类算法(附算法原理+网格搜索+演示代码)

KNN分类算法

 
1、KNN分类算法起源
  KNN,K-Nearest Neighbor的简写,即K-最近邻法算法,由Cover和Hart于1968年提出。其核心思想是借助“物以类聚,人以群分”,通过周围的事物属性来判断自身的属性,即自身属性由身边最近的K个物体的属性来决定,属于监督学习算法的一种。
 

2、算法流程:
#Python机器学习#KNN分类算法(附算法原理+网格搜索+演示代码)_第1张图片

 
3、距离计算方法介绍
 

闵可夫斯基距离

d i s t ( X , Y ) = ∑ ∣ x i − y i ∣ p p dist(X,Y) = \sqrt[p]{\sum|x_i-y_i|^p} dist(X,Y)=pxiyip
 
01-曼哈顿距离(当p=1)
 
d i s t ( X , Y ) = ∑ ∣ x i − y i ∣ dist(X,Y) = {\sum|x_i-y_i|} dist(X,Y)=xiyi
02-欧式距离(当p=2)
d i s t ( X , Y ) = ∑ ∣ x i − y i ∣ 2 2 dist(X,Y) = \sqrt[2]{\sum|x_i-y_i|^2} dist(X,Y)=2xiyi2

 
03-切比雪夫距离(当p=无穷大)
d i s t ( X , Y ) = max ⁡ ∑ ∣ x i − y i ∣ dist(X,Y) = \max{\sum|x_i-y_i|} dist(X,Y)=maxxiyi
 

欧氏距离、曼哈顿距离、切比雪夫距离都是闵可夫距离的特殊情况,在实际的应用过程中,选择欧式距离居多,平时我们计算两点之间的距离默认选用的也是欧式距离。

 
4、交叉验证法:
 将原始数据集进行多次划分,得到n个验证集和n个测试集合,分别对n个不同划分的数据集合进行训练和建模,得到n个预测结果,n个结果的平均值作为最终的分类结果。
 
5、网格搜索法介绍
  网格搜索算法是一种通过遍历给定的参数组合来优化模型表现的方法,自动遍历我们给定的超参数,从而得到范围内的最优模型。

#网格搜索法和交叉验证接口
sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=None)
##参数说明
estimator:估计器对象  #KNN,决策树等
param_grid:估计器的参数

cv:指定交叉验证的折数
##输出结果
best_params_
best_score_
best_estimator_
cv_results_

 
KNN算法函数说明

##调用代码
from sklearn.neighbors import KNeighborsClassifier
sklearn.neighbors. KNeighborsClassifier(n_neighbor=5,algorithm='auto')
##超参数
#n_neighbors:使用的邻居数量,默认为5
#algorithm:计算最近邻居的算法,可选'auto','ball_tree','kd_tree','brute'

 
iris数据集展示

##读取数据集
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris=load_iris()   

##展示数据集
##这一步是想让大家看到数据集合的格式,正式应用的时候可以不需要
#iris.target=pd.DataFrame(iris.data)
#iris_data.shape
iris_data=pd.DataFrame(iris.data)
iris_data.columns=iris.feature_names
iris_data['target']=iris.target
print(iris_data.shape)
iris_data.head()

#Python机器学习#KNN分类算法(附算法原理+网格搜索+演示代码)_第2张图片
 
6、代码示例-无网格搜索

##监督算法01-KNN

##划分数据集和训练集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=13)

##特征工程:标准化
from sklearn.preprocessing import StandardScaler
transfer=StandardScaler()  ##相当于导入一个计算机
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)

##KNN预估器
from sklearn.neighbors import KNeighborsClassifier
estimator=KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train,y_train)

##模型的评估-方法1
y_predict=estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("真实值&预测值:\n",y_test==y_predict)

##模型的评估-方法2
score=estimator.score(x_test,y_test)
print("KNN算法准确率:\n",score)

#Python机器学习#KNN分类算法(附算法原理+网格搜索+演示代码)_第3张图片
 
结果解释:当选定K=3时,算法准确率为0.95.
 
采用十折交叉验证和网格搜索法对模型进行调优

##读取数据集
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris=load_iris()

from sklearn.neighbors import KNeighborsClassifier
##划分数据集和训练集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=13)

##特征工程:标准化
from sklearn.preprocessing import StandardScaler
transfer=StandardScaler()  ##相当于导入一个计算机
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)

##KNN预估器
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
estimator=KNeighborsClassifier()

##确定网格交叉验证的参数
param_dict={"n_neighbors":[3,5,7,8,10]}
estimator=GridSearchCV(estimator,param_grid=param_dict,cv=3)
estimator.fit(x_train,y_train)

##预测
y_predict=estimator.predict(x_test)

##模型评估

##打印最佳参数
print("最佳参数:\n",estimator.best_params_)
##最佳结果
print("最佳结果:\n",estimator.best_score_)
##最佳预估器
print("最佳预估器:\n",estimator.best_estimator_)


结果:
#Python机器学习#KNN分类算法(附算法原理+网格搜索+演示代码)_第4张图片 

根据网格搜索结果,在CV=3的前提下,当K=8时模型效果最佳,预测准确度为0.96。最后选取K=8的KNN模型作为本次建模的最终模型。

 
KNN算法的优缺点
优点:算法简单、易于理解
缺点:
1、当样本量较少,K值过大,不均衡样本对结果影响大;
2、K值的取值对结果影响大,K过小可能收到异常值的影响。

你可能感兴趣的:(机器学习,机器学习,算法,python)