• 0218 scikitlearn库之k*邻算法



    更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html

    scikit-learn库之k*邻算法

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

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

    一、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]):基于报告决定系数R2评估模型。
    • 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个*邻的权重,可以返回距离或者矩阵关系图。

    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.]])
    

    二、KNeighborsRegressor

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

    三、RadiusNeighborsClassifier

    RadiusNeighborsClassifier模型类似KNeighborsClassifier模型,不同之处在于RadiusNeighborsClassifier模型少了两个参数n_neighborsn_jobs,多了两个参数:

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

    四、RadiusNeighborsRegressor

    RadiusNeighborsRegressor模型类似于RadiusNeighborsRegressor模型,不同之处在于少了参数outlier_label,并且两者在得到k个*邻后处理的方式不同。

    五、NearestCentroid

    NearestCentroid模型是基于最*质心分类算法实现的,由于只有metric距离度量参数和shrink_threshold特征距离阈值两个参数,不多赘述。

  • 相关阅读:
    js相关小实例——大图轮播
    js相关小实例——div实现下拉菜单
    js相关小实例——二级菜单
    html5部分相关
    CSS3常用属性(边框、背景、文本效果、2D转换、3D转换、过渡、有过渡效果大图轮播、动画)
    数据访问
    php测试
    单例模式
    Doc
    横竖列表 下拉隐藏显示
  • 原文地址:https://www.cnblogs.com/abdm-989/p/11806631.html
Copyright © 2020-2023  润新知