• 机器学习02--K-近邻算法


    数据集介绍

    数据集划分

    • 训练数据:用于训练,构建模型
    • 测试数据:在模型检验时使用,用于评估模型是否有效

    划分比例:

    • 训练集:70% 80% 75%
    • 测试集:30% 20% 30%

    API

    • sklearn.model_selection.train_test_split(arrays, *options)
      • x 数据集的特征值
      • y 数据集的标签值(目标值)
      • test_size 测试集的大小,一般为float
      • random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
      • return ,训练集特征值,测试集特征值,训练集目标值,测试集目标值
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)

    sklearn转换器和估计器

    转换器

    转换器 - 特征工程的父类,实例化的是一个转换器类(Transformer)

    估计器(sklearn机器学习算法的实现)

    1、用于分类的估计器:

    • sklearn.neighbors k-近邻算法
    • sklearn.naive_bayes 贝叶斯
    • sklearn.linear_model.LogisticRegression 逻辑回归
    • sklearn.tree 决策树与随机森林

    2、用于回归的估计器:

    • sklearn.linear_model.LinearRegression 线性回归
    • sklearn.linear_model.Ridge 岭回归

    3、用于无监督学习的估计器

    • sklearn.cluster.KMeans 聚类

    估计器工作流程

    1. 实例化一个estimator
    2. estimator.fit(x_train, y_train) 计算
    3. 模型评估
      • 直接比对真实值和预测值:y_predict = estimator.predict(x_test)    y_test == y_predict
      • 计算准确率:accuracy = estimator.score(x_test, y_test)

    模型选择与调优

    交叉验证

    定义

    将拿到的训练数据,分为训练和验证集。比如:将数据分成5份,其中一份作为验证集。然后经过5次(组)的测试,每次都更换不同的验证集。即得到5组模型的结果,取平均值作为最终结果。又称5折交叉验证。

    • 训练集:训练集+验证集
    • 测试集:测试集

    通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。

    模型选择与调优

    sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)

    • 对估计器的指定参数值进行详尽搜索
    • estimator:估计器对象
    • param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
    • cv:指定几折交叉验证
    • fit:输入训练数据
    • score:准确率
    • 结果分析:
      • bestscore:在交叉验证中验证的最好结果_
      • bestestimator:最好的参数模型
      • cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果

    K-近邻算法(KNN)

    定义

    如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。即根据你的“邻居”来推断出你的类别

    K-近邻算法API

    sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

    • n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
    • algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)

    案例:鸢尾花种类预测

    代码

    def knn_iris_gscv():
        """
        用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
        :return:
        """
        # 1)获取数据
        iris = load_iris()
    
        # 2)划分数据集
        x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
    
        # 3)特征工程:标准化
        transfer = StandardScaler()
        x_train = transfer.fit_transform(x_train)
        x_test = transfer.transform(x_test)
    
        # 4)KNN算法预估器
        estimator = KNeighborsClassifier()
    
        # 加入网格搜索与交叉验证
        # 参数准备
        param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}
        estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)
        estimator.fit(x_train, y_train)
    
        # 5)模型评估
        # 方法1:直接比对真实值和预测值
        y_predict = estimator.predict(x_test)
        print("y_predict:
    ", y_predict)
        print("直接比对真实值和预测值:
    ", y_test == y_predict)
    
        # 方法2:计算准确率
        score = estimator.score(x_test, y_test)
        print("准确率为:
    ", score)
    
        # 最佳参数:best_params_
        print("最佳参数:
    ", estimator.best_params_)
        # 最佳结果:best_score_
        print("最佳结果:
    ", estimator.best_score_)
        # 最佳估计器:best_estimator_
        print("最佳估计器:
    ", estimator.best_estimator_)
        # 交叉验证结果:cv_results_
        print("交叉验证结果:
    ", estimator.cv_results_)
    
        return None

    K-近邻总结

    • 优点:
      • 简单,易于理解,易于实现,无需训练
    • 缺点:
      • 懒惰算法,对测试样本分类时的计算量大,内存开销大
      • 必须指定K值,K值选择不当则分类精度不能保证
    • 使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试
  • 相关阅读:
    Atitit 图像金字塔原理与概率 attilax的理解总结qb23
    Atitit.软件中见算法 程序设计五大种类算法
    百度之星
    linux下编程IDE环境
    c++多态的实现 VC++消息映射的实现
    static_cast, const_cast,dynamic_cast和reinterpret_cast
    X Window研究笔记(1)~22
    关于串口发送短信
    模式识别中的核方法
    IC设计,verilog学习链接
  • 原文地址:https://www.cnblogs.com/MoooJL/p/14310819.html
Copyright © 2020-2023  润新知