zoukankan      html  css  js  c++  java
  • 机器学习之分类算法-KNN(2.1)

    KNN核心思想
              你的“邻居”来推断出你的类别

    计算距离:
               欧氏距离
               曼哈顿距离 绝对值距离
               明可夫斯基距离

    如果取的最近的电影数量不一样?会是什么结果?
             k 值取得过小,容易受到异常点的影响
             k 值取得过大,样本不均衡的影响(投票机制,少数服从多数,一般取奇数)
    结合前面数据,分析K-近邻算法需要做什么样的处理
             无量纲化的处理
             标准化

    基本流程:

           1)获取数据
           2)数据集划分
           3)特征工程
                        标准化
           4)KNN预估器流程
           5)模型评估

    优点:简单,易于理解,易于实现,无需训练
    缺点
             1)必须指定K值,K值选择不当则分类精度不能保证
             2)懒惰算法,对测试样本分类时的计算量大,内存开销大
    使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试

    模型调优:交叉验证,超参数搜索-网格搜索

    案例

    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.neighbors import KNeighborsClassifier
    
    
    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()
    
        # 加入网格搜索与交叉验证
        # 参数准备;cv为几折验证
        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
  • 相关阅读:
    if()中的判断条件为什么被判断不通过
    2016-10-1219:50:40
    学习C语言主流编译器的使用方法
    请帮忙看下为什么返回值不正确
    puts()和putchar()的差异
    这题的最短路线怎么求~
    各路大神大显神通!帮帮忙如何使用顺序表实现以下任务
    网络协议学习笔记(九)CDN和数据中心
    网络协议学习笔记(八)DNS协议和HttpDNS协议
    网络协议学习笔记(七)流媒体协议和P2P协议
  • 原文地址:https://www.cnblogs.com/sima-3/p/14812457.html
Copyright © 2011-2022 走看看