class sklearn.neighbors.KNeighborsClassifier K近邻(KNN)参数详解

k近邻法(k-nearest neighbor, kNN)

是一种基本分类与回归方法,其基本做法是:给定测试实例,基于某种距离度量找出训练集中与其最靠近的k个实例点,然后基于这k个最近邻的信息来进行预测。
通常,在分类任务中可使用“投票法”,即选择这k个实例中出现最多的标记类别作为预测结果;在回归任务中可使用“平均法”,即将这k个实例的实值输出标记的平均值作为预测结果;还可基于距离远近进行加权平均或加权投票,距离越近的实例权重越大。

k近邻法用于分类的函数:https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neighbors

class 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:寻找的邻居数,默认是5。也就是K值
  • weights:预测中使用的权重函数。可能的取值:‘uniform’:统一权重,即每个邻域中的所有点均被加权。‘distance’:权重点与其距离的倒数,在这种情况下,查询点的近邻比远处的近邻具有更大的影响力。[callable]:用户定义的函数,该函数接受距离数组,并返回包含权重的相同形状的数组。
  • algorithm:用于计算最近邻居的算法:“ ball_tree”将使用BallTree,“ kd_tree”将使用KDTree,“brute”将使用暴力搜索。“auto”将尝试根据传递给fit方法的值来决定最合适的算法。注意:在稀疏输入上进行拟合将使用蛮力覆盖此参数的设置。
  • leaf_size:叶大小传递给BallTree或KDTree。这会影响构造和查询的速度,以及存储树所需的内存。最佳值取决于问题的性质。默认30。
  • p:Minkowski距离的指标的功率参数。当p = 1时,等效于使用manhattan_distance(l1)和p=2时使用euclidean_distance(l2)。对于任意p,使用minkowski_distance(l_p)。默认是2。
  • metric:树使用的距离度量。默认度量标准为minkowski,p = 2等于标准欧几里德度量标准。
  • metric_params:度量函数的其他关键字参数。
  • n_jobs:并行计算数

属性:

  • classes_:类别
  • effective_metric_:使用的距离度量。它将与度量参数相同或与其相同,例如如果metric参数设置为“ minkowski”,而p参数设置为2,则为“ euclidean”。
  • effective_metric_params_:度量功能的其他关键字参数。对于大多数指标而言,它与metric_params参数相同,但是,如果将valid_metric_属性设置为“ minkowski”,则也可能包含p参数值。
  • outputs_2d_:在拟合的时候,当y的形状为(n_samples,)或(n_samples,1)时为False,否则为True。

方法:

  • fit(X, y):使用X作为训练数据和y作为目标值拟合模型
  • get_params([deep]): 获取此估计量的参数。
  • kneighbors([X, n_neighbors, return_distance]) :查找点的K邻居。查找点的K邻居。返回每个点的邻居的索引和与之的距离
  • kneighbors_graph([X, n_neighbors, mode]):计算X中点的k邻居的(加权)图
  • predict(X):预测提供的数据的类标签。
  • predict_proba(X):测试数据X的返回概率估计。
  • score(X, y[, sample_weight]):返回给定测试数据和标签上的平均准确度
  • set_params(**params):设置此估算器的参数

方法中kneighbors例子:https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html

#kneighbors(X = None,n_neighbors = None,return_distance = True )
samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(n_neighbors=1)
neigh.fit(samples)
#NearestNeighbors(n_neighbors=1)
print(neigh.kneighbors([[1., 1., 1.]]))
#(array([[0.5]]), array([[2]]))
#如您所见,它返回[[0.5]]和[[2]],这意味着该元素位于距离0.5处,并且是样本的第三个元素(索引从0开始)

值得注意的是:KNN容易过拟合,因为在高维空间上,随着维数越来越大,特征空间越来越稀疏,大家可以想象在一个球体里面,大部分的信息集中在球面,那KNN需要找最近的点就会十分困难,那么也就无法合适进行估计

鸢尾花例子:

import numpy as np
import matplotlib.pyplot as plt
# 导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split

# 载入鸢尾花数据集
# iris是一个对象类型的数据,其中包括了data(鸢尾花的特征)和target(也就是分类标签)
iris = datasets.load_iris()

# 将样本与标签分开
x = iris['data']
y = iris['target']
print(x.shape, y.shape)  # (150, 4) (150,)

# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2)  # 8:2
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)

# (120, 4) (30, 4) (120,) (30,)

#使用KNeighborsClassifier来训练模型,这里我们设置参数k(n_neighbors)=5, 使用欧式距离(metric=minkowski & p=2):

clf = KNeighborsClassifier(n_neighbors=5, p=2, metric="minkowski")
clf.fit(x_train, y_train)  # fit可以简单的认为是表格存储

# KNeighborsClassifier()

y_predict = clf.predict(x_test)
y_predict.shape  # (30,)

acc = sum(y_predict == y_test) / y_test.shape[0]
acc
#0.933

K近邻用于回归

class sklearn.neighbors.KNeighborsRegressor(n_neighbors=5, *, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None, **kwargs)

可以看出参数和用于分类基本一致 ,这里就不赘述了

注意:建模时可以多搜索超参数k值和algorithm =[' auto ', ' ball_tree ', ' kd_tree ', ' brute ']

原文地址:https://www.cnblogs.com/cgmcoding/p/13612140.html