机器学习之KNN与KNN算法解决鸢尾花分类问题

kNN(k-Nearest Neighbor Classification)

平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)

图中测试样本属于正例还是反例?
在这里插入图片描述
kNN (k Nearest Neighbor Classification) ,即k近邻分类算法。
近朱者赤,近墨者黑。

简单说,如果knn样本大多数属于正例,那测试样就是正例;如果knn样本大多数属于负例,那测试样就是负例;
●一个样本在特征空间中,总会有k个最相似(即特征空间中最邻近)的样本。其中,大多数样本属于某个类别,则该样本也属于这个类别。
●是理论上比较成熟的方法,也是最简单的机器学习算法之一。
行业应用:

  1. 客户流失预测
  2. 欺诈侦测等(更适合于稀有事件的分类问题)
1、计算步骤:

1.算距离: 给定测试对象,计算它与训练集中的每个对象的距离
2.找邻居: 圈定距离最近的k个训练对象,作为测试对象的近邻
3.做分类: 根据这k个近邻归属的主要类别,来对测试对象分类

懒惰算法
●平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)
●懒惰的后果:模型简单,计算开销大。

1.算距离(测试样本到训练样本的距离)

距离越近应该意味着这两个点属于一个分类的可能性越大。
●计算的距离衡量包括欧式距离、夹角余弦等。
●欧式距离:在这里插入图片描述
在这里插入图片描述典型的距离定义
在这里插入图片描述

2.找邻居

由哪几个(K)已知样本决定测试样本类别?
在这里插入图片描述在这里插入图片描述

3.做分类
  1. 投票决定:少数服从多数;
    2.加权投票法: 根据距离的远近,距离越近则权重越大(权重为距离平方的倒数)。权重:测试样本到训练样本的距离平方的倒数
2、 算法流程

1、 计算已知类别数据集中的点与当前点之间的距离;
2.按照距离递增次序排序;
3.选取与当前点距离最小的k个点:
4.确定前k个点所在类别对应的出现频率; (即正例反例在K出现的次数
5.返回前k个点出现频率最高的类别作为当前点的预测分类。

优点
1.简单,易于理解,易于实现,无需估计参数,无需训练;
2.适合对稀有事件进行分类(例如当流失率很低时,比如低于0.5%,构造流失预测模型) ;
3.特别适合 于多分类问题(multi modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,
kNN比SVM的表现要好。
缺点
1.对测试样本分类时的计算量大,内存开销大,评分慢;
2.可解释性较差, 无法给出决策树那样的规则。

3、 Python实现

•sklearn库中提供KNeighborsClassifier实现kNN算法,此外,还提供RadiusNeighborsClassifier(非均匀采样时比较合适,以半径为选取方法)做最近邻分类

•sklearn.neighbors.KNeighborsClassifier(n_neighbors=5 #邻居数,默认为5
 , weights='uniform' #用于预测的权重方法
 , algorithm='auto' #用于计算最近邻的算法(ball_tree、kd_tree、brute、auto)
 , leaf_size=30 #传递给BallTree 或KDTree 叶大小
 , p=2 #
 , metric='minkowski' #用于树的度量距离
 , metric_params=None #度量参数
 , **kwargs)
•from sklearn.neighbors import KNeighborsClassifier

KNN算法解决鸢尾花分类问题
数据:

from sklearn.datasets import load_iris
iris=load_iris()
iris

在这里插入图片描述
在这里插入图片描述sklearn.neighbors.KNeighborsClassifier
了解更多链接

类sklearn.neighbors.KNeighborsClassifier(n_neighbors = 5,*,weights =‘uniform’,algorithm =‘auto’,leaf_size = 30,p = 2,metric =‘minkowski’,metric_params = None,n_jobs = None,** kwargs )
参量:
n_neighbors int,默认= 5
默认情况下用于kneighbors查询的邻居数。

权重{'uniform''distance'}或可调用,默认='uniform'
预测中使用的权重函数。可能的值:

'uniform':均匀的重量。每个邻域中的所有点的权重均相等。

'distance':权重点按其距离的倒数表示。在这种情况下,查询点的近邻比远处的近邻具有更大的影响力。

[callable]:用户定义的函数,它接受距离数组,并返回包含权重的相同形状的数组。

算法{'auto''ball_tree''kd_tree''brute'},默认='auto'
用于计算最近邻居的算法:

'ball_tree'将使用 BallTree

'kd_tree'将使用 KDTree

'brute'将使用暴力搜索。

“auto”将尝试根据传递给fit方法的值来决定最合适的算法。

注意:在稀疏输入上进行拟合将使用蛮力覆盖此参数的设置。

leaf_size int,默认为30
叶大小传递给BallTree或KDTree。这会影响构造和查询的速度,以及存储树所需的内存。最佳值取决于问题的性质。

p int,默认= 2
Minkowski指标的功率参数。当p = 1时,这等效于对p = 2使用manhattan_distance(l1)和euclidean_distance(l2)。对于任意p,使用minkowski_distance(l_p)。

metric:str or callable,默认='minkowski'
树使用的距离度量。默认度量标准为minkowski,p = 2等于标准欧几里德度量标准。有关DistanceMetric可用指标的列表,请参见的文档。如果度量是“预先计算的”,则X被假定为距离矩阵,并且在拟合过程中必须为平方。X可能是一个稀疏图,在这种情况下,只有“非零”元素可以被视为邻居。

metric_params dict,默认=
度量功能的其他关键字参数。

n_jobs int,默认=
为邻居搜索运行的并行作业数。 None除非joblib.parallel_backend上下文中,否则表示1  -1表示使用所有处理器。有关 更多详细信息,请参见词汇表。不影响fit方法。

属性
classes_ 形状的数组(n_classes,)
分类器已知的类标签

effective_metric_ 海峡或callble
使用的距离度量。与metric参数或其同义词相同,例如,如果metric参数设置为“ minkowski”且p参数设置为2,则为“ euclidean” 

effective_metric_params_:dict
度量功能的其他关键字参数。对于大多数指标,metric_params参数将与参数相同,但p如果effective_metric_属性设置为“ minkowski” ,则也可能包含 参数值。

outputs_2d_:bool
y在拟合期间当形状为(n_samples,)或(n_samples,1)时为False,否则为True。

方法

fit(self, X, y)

使用X作为训练数据和y作为目标值拟合模型

get_params(self[, deep])

获取此估计量的参数。

kneighbors(self[, X, n_neighbors, …])

查找点的K邻居。

kneighbors_graph(self [,X,n_neighbors,mode]

计算X中点的k邻居的(加权)图

predict(self, X)

预测提供的数据的类标签。

predict_proba(self, X)

测试数据X的返回概率估计。

score(self, X, y[, sample_weight])

返回给定测试数据和标签上的平均准确度。

set_params(self, \*\*params)

设置此估算器的参数。

__init__(self,n_neighbors = 5*,weights ='uniform',algorithm ='auto',leaf_size = 30,p = 2,metric ='minkowski',metric_params = None,n_jobs = None,** kwargs [资源]

完整代码

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# K-近邻算法
# 导入数据
load_data = load_iris()
x = load_data.data
y = load_data.target

# 数据预处理,分割数据分别为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size = 0.25)
# 特征工程 对训练集和测试集中的特征数据进行标准化
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
# 进行算法处理,使用K-近邻
knn = KNeighborsClassifier()
# 输入训练集数据
knn.fit(x_train,y_train)
# 输入测试集,查看训练结果
result = knn.predict(x_test)
# 查看准确率
r_result = knn.score(x_test,y_test)
print("训练的结果为:",result)
print("正确的结果为:",y_test)
print("识别成功率为:",r_result)

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值