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)
可以看出参数和用于分类基本一致 ,这里就不赘述了