02-18 scikit-learn库之k近邻算法

[TOC] 更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlhtml

scikit-learn库之k近邻算法

因为k近邻能够作回归又能够作分类,因此最普通的k近邻算法在scikit-learn库中有两种实现,即KNeighborsClassifier和KNeighborsRegressor;上次讲到了k近邻的两个扩展限定半径k近邻,所以该方法在scikit-learn中也有两种实现,即RadiusNeighborsClassifier和RadiusNeighborsRegressor;k近邻还有一种扩展,即最近质心分类算法NearestCentroid。python

接下来将会讨论这五者的区别,因为是从官方文档翻译而来,翻译会略有偏颇,有兴趣的也能够去scikit-learn官方文档查看https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neighbors算法

1、KNeighborsClassifier

1.1 使用场景

KNeighborsClassfier模型就是最普通的k近邻算法,能够经过参数控制使用高斯距离、kd树、球树找到实例的$k$个近邻。数据结构

1.2 代码

from sklearn.neighbors import KNeighborsClassifier
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=3, p=2,
           weights='uniform')
print(neigh.predict([[1.1]]))
[0]
print(neigh.predict_proba([[0.9]]))
[[0.66666667 0.33333333]]

1.3 参数详解

  • n_neighbors:$k$值选择,int类型。通常选择一个较小的$k$值,而后经过交叉验证选择一个较好的$k$值。默认为5。
  • **weights:**近邻权重,str类型。若是weights='uniform',则意味着全部近邻的权重都同样;若是weights='distance',则意味着权重和距离成反比,即距离目标点更近的点有更高的权重;能够自定定义函数自定义权重,输入是距离值,输出是权重值。默认为'uniform'。
  • **algorithm:**算法实现,str类型。若是algorithm='brute',即最原始的k近邻算法,计算出全部点与点之间的距离;若是algorithm='kd_tree',即kd树实现;若是algorithm='ball_tree',即球树实现;若是algorithm='auto',则模型会选择一个拟合最好的算法。若是样本特征少,使用'auto'便可;若是数据量大或者样本特征多,推荐使用kd树以后再尝试球树,如此作能够提升准确度;若是输入的样本特征是稀疏的时候,scikit-learn始终会自行选择'brute'实现。默认为'auto'。
  • **leaf_size:**叶子节点阈值,int类型。只有当algorithm={'kd_tree','ball_tree'}时该参数才生效,这个值越小,则生成的kd树或球树层数越大,建树时间越长,泛指层数越小,建树时间短。若是样本数量过大,则必须得增大该值,由于树的层数越大,则树越容易过拟合,推荐使用交叉验证选择一个较优值。默认为30。
  • **p:**距离度量附属参数,int类型。只有当metric='minkowski'时该参数才生效,p=1时为曼哈顿距离,p=2时为欧氏距离。默认为2。
  • **metric:**距离度量类型,str类型。metric='euclidean'为欧氏距离;metric='manhattan'为曼哈顿距离;metric='chebyshev'为切比雪夫距离;metric='minkowski'为闵可夫斯基距离;metric='wminkowski'为带权重闵可夫斯基距离;metric='seuclidean'为标准化欧氏距离;metric='mahalanobis'为马氏距离,一般状况下默认的metric='minkowski'+p=2即欧式距离就能够知足大多数业务的需求。默认为'minkowski'。
  • **metric_params:**距离度量附属参数,dict类型。如带权重闵可夫斯基距离的参数,通常不会用到。
  • **n_jobs:**并行数,int类型。n_jobs=1使用1个cpu运行程序;n_jobs=2,使用2个cpu运行程序;n_jobs=-1,使用全部cpu运行程序。默认为1。

1.4 方法

  • **fit(X,y):**把数据放入模型中训练模型。
  • **get_params([deep]):**返回模型的参数,能够用于Pipeline中。
  • **predict(X):**预测样本X的分类类别。
  • **predict_proba(X):**返回样本X在各个类别上对应的几率。
  • **score(X,y[,sample_weight]):**基于报告决定系数$R^2$评估模型。
  • **set_prams(**params):**建立模型参数。

1.4.1 kneighbors([X, n_neighbors, return_distance])

找到某个点的n_neighbors个近邻。机器学习

# 为方便测试接下来的方法测试咱们将经过最近邻模型演示
samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(n_neighbors=1)
neigh.fit(samples)
NearestNeighbors(algorithm='auto', leaf_size=30, metric='minkowski',
         metric_params=None, n_jobs=None, n_neighbors=1, p=2, radius=1.0)
print(neigh.kneighbors([[1., 1., 1.]]))
(array([[0.5]]), array([[2]]))
X = [[0., 1., 0.], [1., 0., 1.]]
neigh.kneighbors(X, return_distance=False)
array([[1],
       [2]])

1.4.2 kneighbors_graph([X, n_neighbors, mode])

计算样本X的n_neighbors个近邻的权重,能够返回距离或者矩阵关系图。ide

X = [[0], [3], [1]]
from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(n_neighbors=2)
neigh.fit(X) 
A = neigh.kneighbors_graph(X)
A.toarray()
array([[1., 0., 1.],
       [0., 1., 1.],
       [1., 0., 1.]])

2、KNeighborsRegressor

KNeighborsRegressor模型相似于KNeighborsClassifier模型,不一样的是两个模型找到$k$个近邻的时候KNeighborsClassifier模型使用了多数表决发选择类别,而KNeighborsRegressor模型使用了对$k$近邻去平均数或者中位数的方法获得预测值。函数

3、RadiusNeighborsClassifier

RadiusNeighborsClassifier模型相似KNeighborsClassifier模型,不一样之处在于RadiusNeighborsClassifier模型少了两个参数n_neighborsn_jobs,多了两个参数:学习

  • radius半径大小,float类型。即选择半径大小的参数。默认为1。
  • outlier_label,异常点类别,str类型。即假设限定半径后,目标点半径内没有近邻时该选择哪一个类别做为输出。默认为None,不建议使用默认值。

4、RadiusNeighborsRegressor

RadiusNeighborsRegressor模型相似于RadiusNeighborsRegressor模型,不一样之处在于少了参数outlier_label,而且二者在获得$k$个近邻后处理的方式不一样。测试

5、NearestCentroid

NearestCentroid模型是基于最近质心分类算法实现的,因为只有metric距离度量参数和shrink_threshold特征距离阈值两个参数,很少赘述。网站

相关文章
相关标签/搜索