• 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 ']

  • 相关阅读:
    SGU 187 Twist and whirl
    伸展树---初步学习
    poj 2503 Babelfish
    sublime 3 phpfmt配置(大括号对齐)
    Linux Shell 错误: $' ': command not found错误解决
    redis 使用场景
    wireshake tcp 三次握手详解
    ip地址和子网掩码
    phpstorm 远程调式 php
    win10,ubuntu时间不对问题
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/13612140.html
Copyright © 2020-2023  润新知