当前位置:   article > 正文

机器学习——KNN算法_在这个数据驱动的时代,机器学习技术已经成为了我们解决问题的重要工具。knn(k-nea

在这个数据驱动的时代,机器学习技术已经成为了我们解决问题的重要工具。knn(k-nea

前言(机器学习概述)

        机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构,从而不断改善自身的性能。机器学习是人工智能的核心,是使计算机具有智能的根本途径。机器学习的发展历程可以追溯到17世纪,贝叶斯、拉普拉斯关于最小二乘法的推导和马尔可夫链等构成了机器学习广泛使用的工具和基础。从20世纪50年代开始,机器学习的发展经历了不同的阶段,包括主要研究“有无知识的学习”的第一阶段,将各个领域的知识植入到系统里的第二阶段,以及开始将学习系统与各种应用结合起来的第三阶段。近年来,随着大数据和计算能力的飞跃,神经网络特别是深度学习技术得到了快速发展,机器学习技术也在各个领域得到了广泛应用。机器学习的主要应用领域包括自然语言处理、图像识别、推荐系统、金融风控、医学诊断、智能制造等。

AI,ML,DL 之间的关系:

        机器学习ML其实就是实现人工智能的一种途径,深度学习是机器学习的一种方法。

机器学习发展三要素:        

        数据、算法、算力相互作用,是AI发展的基石。

机器学习算法分类:

        有监督、无监督、半监督、强化学习。

有监督学习:输入数据有特征值和目标值,即输入训练数据有标签。需要人工标注数据,所用与分类和回归问题。分类问题目标值是不连续的,回归问题目标值连续。

无监督学习:输入数据没有被标记,即样本数据类别未知,没有标签,根据样本间相似性,对样本集聚类以发现事物内部的结构及相互关系。不需要人为标注数据。

半监督学习:人为标注少量数据,利用已经标注好的数据(带有标签的)训练出一个模型,再利用该模型套用未标记的数据,通过查看分类结果与模型结果对比,从而进一步对模型该杀和提高。

强化学习:它是机器学习一个重要分支,应用场景:AlphaGo围棋、各类游戏、对抗比赛、无人驾驶场景。基本原理:通过构建四个要素agent,环境状态,行动,奖励。

机器学习建模流程:

1.获取数据

2.数据基本处理:处理缺失值异常值等

3.特征工程:利用专业背景知识和技巧处理数据,让机器学习算法效果最好。

4.机器学习模型训练

5.模型评估:

特征工程:

1.特征提取:从原始数据中提取与任务型相关的特征,构成特征向量

2.特征预处理:将不同单位的特征数据转换成同一个范围内,使训练数据中不同特征对模型产生较为一致的影响

3.特征降维:将原始数据维度降低。会丢失部分信息,降维就需要保证数据主要的信息保留下来,原始数据会发生变化。

4.特征选择:原始数据特征很多,但是对任务相关的其中一个特征集合子集

5.特征组合:把多个特征合并到一个特征。

模型拟合:

        用来表示模型对样本的拟合情况

1.欠拟合:模型在训练集和测试集表现的都很差,原因:模型过于简单。

2.过拟合:模型在训练集表现好,测试集表现差,原因:模型复杂,数据不纯,训练数据太少。

3.泛化:模型在新数据集上表现好坏的能力。

4.奥卡姆剃刀原则:给定两个具有相同泛化误差的模型,较简单的模型比较复杂的模型更可取。

一、KNN算法思想

K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别,它是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。

1.样本相似性:样本都是属于一个任务数据集的。样本距离越近则越相似。
2.K值的选择:不要选偶数,尽量选奇数;不要选类别个数倍数

(1)K值过大:相当于用较小领域的训练实例进行预测,容易受到异常点的影响,k值减少意味着整体模型复杂,易发生过拟合

(2)K值过小:相当于用较大领域的训练实例进行预测,容易受到样本均衡的影响,k值增大意味着整体模型简单,易发生欠拟合

(3)K=N(训练样本个数):无论输入什么实例,只会按照训练集中最多的类别进行预测,受到样本均衡的影响

(4)K超参数的调优:可以用交叉验证,网格搜索的方法

二、KNN的应用

  • 解决问题:分类问题、回归问题

  • 算法思想:若一个样本在特征空间中的 k 个最相似的样本大多数属于某一个类别,则该样本也属于这个类别

  • 相似性:欧氏距离

1.分类问题

1.计算未知样本到每个训练样本的距离
2.将训练样本根据距离大小升序排列
3.取出距离最近的k个训练样本
4.进行多数表决,统计k个样本中哪个类别的样本个数最多
5.将未知样本归属到出现次数最多的类别

2.回归问题

1.计算未知样本到每个训练样本的距离
2.将训练样本根据距离大小升序排列
3.取出距离最近的k个训练样本
4.把这个k 个样本的目标值计算其平均值
5.作为将未知的样本预测的值

三、距离度量方法

1.欧氏距离

2.曼哈顿距离

3.切比雪夫距离

4.闵氏距离

其中p是一个变参数:
    当 p=1 时,就是曼哈顿距离;
    当 p=2 时,就是欧氏距离;
    当 p→∞ 时,就是切比雪夫距离
根据 p 的不同,闵氏距离可表示某一类种的距离

四、KNN算法API介绍

1.分类问题API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5) 

  1. from sklearn.neighbors import KNeighborsClassifier
  2. # 准备数据
  3. X = [[1], [2], [3], [4], [5], [6]]
  4. y = ['A', 'B', 'B', 'C', 'A', 'C']
  5. # 实例化模型
  6. knn=KNeighborsClassifier(n_neighbors=3) # k=3选取要预测的值在内的周围三个出现次数最多的类别
  7. # 模型训练
  8. knn.fit(X,y)
  9. # 模型预测
  10. print(knn.predict([[3]])) #['B']
  11. print(knn.predict([[7]])) #['C']
  12. print(knn.predict([[5]])) #['C']

2.回归问题API

sklearn.neighbors.KNeighborsRegressor(n_neighbors=5)

  1. from sklearn.neighbors import KNeighborsClassifier,KNeighborsRegressor
  2. # 准备数据
  3. # X = [[1,2], [2,3], [3,4], [4,5], [5,6], [6,7]]
  4. X = [[1], [2], [3], [4], [5], [6]]
  5. y = [0.1, 0.3, 0.2, 0.3, 0.4, 0.5]
  6. # 实例化模型
  7. knn=KNeighborsRegressor(n_neighbors=3) # k=3选取要预测的值在内的周围三个目标值的平均值为预测的结果
  8. # 模型训练
  9. knn.fit(X,y)
  10. # 模型预测
  11. # print(knn.predict([[1,2]])) #[0.2]
  12. # print(knn.predict([[2,1]])) #[0.2]
  13. # print(knn.predict([[4,6]])) #[0.3]
  14. print(knn.predict([[4]])) #[0.3]
  15. print(knn.predict([[2]])) #[0.2]

五、特征预处理

一.归一化

通过对原始数据进行变换把数据映射到【mi,mx】(默认为[0,1])之间

1.归一化API

sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )

feature_range=(0,1)缩放区间

调用 fit_transform(X) 将特征进行归一化缩放

  1. from sklearn.preprocessing import MinMaxScaler
  2. trandformer=MinMaxascaler()
  3. tf=trandformer.fit(X_train)
  4. X_train=tf.transform(X_train)

2.测试一下

  1. #导包
  2. import numpy as np
  3. from sklearn.preprocessing import MinMaxScaler
  4. # 给出数据
  5. data=[[50,2,1,10],
  6. [60,3,3,20],
  7. [70,4,5,50]]
  8. # 实例化特征工程方法
  9. transformer=MinMaxScaler()
  10. # 对原始特征进行变换
  11. # tf=transformer.fit(data)
  12. # data=tf.transform(data)
  13. data=transformer.fit_transform(data)
  14. # 打印归一化后的数据
  15. print(data)

运行结果如下:代入公式计算后得出的结果和下面结果一样,大家可以自己试一试。

 

二、标准化

通过对原始数据进行标准化,转换为均值为0标准差为1的标准正态分布的数据

1.标准化API

  1. from sklearn.preprocessing import StandardScaler
  2. ss=StandardScaler()
  3. ssf=ss.fit(X_train)
  4. X_train=ssf.transform(X_train)

2.测试一下

  1. #导包
  2. import numpy as np
  3. from sklearn.preprocessing import StandardScaler
  4. # 给出数据
  5. data=[[50,2,1,10],
  6. [60,3,3,20],
  7. [70,4,5,50]]
  8. # 实例化特征工程方法
  9. ss=StandardScaler()
  10. # # 对原始特征进行变换
  11. data=ss.fit_transform(data)
  12. # ssf=ss.fit(data) # 先计算数据的均值和方差
  13. # data=ssf.transform(data) # 在对数据进行标准化
  14. # 打印标准化后的数据
  15. print(data)
  16. # 打印均值和方差
  17. print(transformer.mean_)
  18. print(transformer.var_)

运行结果如下:

 六、超参数调优

在机器学习中,超参数优化或调整是为学习算法选择一组最佳的超参数的问题。超参数是一个参数,其值被用来控制学习过程。相比之下,其他参数(通常是节点权重)的值是学习的。同一种机器学习模型可能需要不同的约束条件、权重或学习率来概括不同的数据模式。这些措施被称为超参数,必须进行调整,以便模型能够最佳地解决机器学习问题。超参数优化找到一个超参数的元组,产生一个最佳的模型,使给定的独立数据上的预定损失函数最小。目标函数采用一个超参数的元组,并返回相关的损失。交叉验证通常被用来估计这种泛化性能。

1.交叉验证

交叉验证是一种数据集的分割方法,将训练集划分为 n 份,其中一份做验证集、其他n-1份做训练集。

首先将数据集划分成cv=10份(假设奥)

(1)把第一份数据当作验证集,剩下的做训练集

(2)把第二份数据做验证集,其余数据做训练集

(3)依此类推,一共训练10次,评估10次

(4)利用验证集和训练集多次评估模型,取平均值作为交叉验证为模型得分

(5)如果k=5时模型得分最好,在使用全部训练集和验证集对K=5模型在训练一次,再用测试集对k=5模型做评估

2.网格搜索

网格搜索是最直观的超参数调优方法之一,它通过遍历所有可能的参数组合,每组超参数都采用交叉验证评估,来找到最优的超参数建立模型。这种方法简单直接,易于理解和实现,适用于参数量较少的情况。

总结:网格搜索和交叉验证强强组合更利于模型选择和调优,交叉验证解决模型数据的划分问题,从而得到更可靠的模型,网格搜索解决超参数的组合。

3.交叉验证+网格搜索的API

  1. from sklearn.model_selection import train_test_split,GridSearchCV
  2. estimator=sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=None)
  3. estimator.fit(X_train,y_train)
  4. # estimator估计器对象
  5. # param_grid={'n_neighbors':[3,5,7]}估计器参数
  6. # cv几折交叉验证
  7. print(estimator.best_score_) #交叉验证中验证的最好结果
  8. print(estimator.best_estimator__) #最好的参数模型
  9. print(estimator.best_params__) #选出来的最好的超参数组合
  10. print(estimator.cv_results_) #交叉验证结果

七、案例分析

这里利用鸢尾花数据集简单串联以下上面的内容(分类问题)

  1. from sklearn.datasets import load_iris
  2. import seaborn as sns
  3. import matplotlib.pyplot as plt
  4. import pandas as pd
  5. from sklearn.model_selection import train_test_split
  6. from sklearn.preprocessing import StandardScaler
  7. from sklearn.neighbors import KNeighborsClassifier
  8. from sklearn.metrics import accuracy_score
  9. from sklearn.model_selection import GridSearchCV
  10. # 数据集
  11. iris = load_iris()
  12. #数据集划分
  13. X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
  14. # 标准化
  15. #实例化特征工程方法中的标准化方法
  16. ss=StandardScaler()
  17. #把训练集扔进去标准化
  18. X_train=ss.fit_transform(X_train)
  19. #在把测试集扔进去
  20. X_test=ss.transform(X_test)
  21. # 模型训练
  22. knn=KNeighborsClassifier(n_neighbors=1)
  23. # 网格搜索,交叉验证
  24. estimator=GridSearchCV(estimator=knn,param_grid={'n_neighbors':[3,5,7]},cv=3)
  25. estimator.fit(X_train,y_train)
  26. print(estimator.best_score_) #交叉验证中验证的最好结果
  27. print(estimator.best_estimator__) #最好的参数模型
  28. # print(estimator.best_params__) #选出来的最好的超参数组合
  29. print(estimator.cv_results_) #交叉验证结果
  30. # 模型评估
  31. print(estimator.score(X_test, y_test))
  32. # 模型预测
  33. data = [[5.1, 3.5, 1.4, 0.2],
  34. [4.6, 3.1, 1.5, 0.2]]
  35. # 由于上面训练完的模型是基于标准化后的数据,所以对于新传入数据也需要标准化
  36. data = ss.transform(data)
  37. print(estimator.predict(data)) #[0 0] 意味着预测结果为第一个种类的花
  38. # 查看预测更接近的概率
  39. print(estimator.predict_proba(data))

运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/919021
推荐阅读
相关标签
  

闽ICP备14008679号