平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)
图中测试样本属于正例还是反例?
kNN (k Nearest Neighbor Classification) ,即k近邻分类算法。
近朱者赤,近墨者黑。
简单说,如果knn样本大多数属于正例,那测试样就是正例;如果knn样本大多数属于负例,那测试样就是负例;
●一个样本在特征空间中,总会有k个最相似(即特征空间中最邻近)的样本。其中,大多数样本属于某个类别,则该样本也属于这个类别。
●是理论上比较成熟的方法,也是最简单的机器学习算法之一。
行业应用:
1.算距离: 给定测试对象,计算它与训练集中的每个对象的距离
2.找邻居: 圈定距离最近的k个训练对象,作为测试对象的近邻
3.做分类: 根据这k个近邻归属的主要类别,来对测试对象分类
懒惰算法
●平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)
●懒惰的后果:模型简单,计算开销大。
距离越近应该意味着这两个点属于一个分类的可能性越大。
●计算的距离衡量包括欧式距离、夹角余弦等。
●欧式距离:
典型的距离定义
1、 计算已知类别数据集中的点与当前点之间的距离;
2.按照距离递增次序排序;
3.选取与当前点距离最小的k个点:
4.确定前k个点所在类别对应的出现频率; (即正例反例在K出现的次数)
5.返回前k个点出现频率最高的类别作为当前点的预测分类。
优点
1.简单,易于理解,易于实现,无需估计参数,无需训练;
2.适合对稀有事件进行分类(例如当流失率很低时,比如低于0.5%,构造流失预测模型) ;
3.特别适合 于多分类问题(multi modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,
kNN比SVM的表现要好。
缺点
1.对测试样本分类时的计算量大,内存开销大,评分慢;
2.可解释性较差, 无法给出决策树那样的规则。
•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)