Python-机器学习基础-K近邻算法
K近邻算法
- 简介
- 定义
- 通俗来讲,通过你的"邻居"来判断你属于哪个类别
- 计算你到"邻居"的距离
- 一般情况,使用欧氏距离
- 定义
- K近邻算法API初步使用
- sklearn优势
- 资料文档多且规范
- 包含的算法多
- 实现起来容易
- sklearn内容
- 分类,聚类,回归
- 特征工程
- 模型选择、调优
- Knn中的API
- sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
- 参数:n_neighbors -- 选定参考几个邻居
- 机器学习中实现的过程
- 实例化一个估计器
- 使用fit方法进行训练
- sklearn优势
- 距离度量
- 1、欧氏距离
- 通过距离平方值进行计算
- 2、曼哈顿距离
- 通过距离的绝对值进行计算
- 3、切比雪夫距离
- 维度最大值进行计算
- 4、闵可夫斯基距离
- p = 1,曼哈顿距离
- p = 2,欧氏距离
- p = ∞,切比雪夫距离
- 小结
- 前面四个距离公式都把单位相同看待,所以计算过程不是很科学
- 5、标准欧氏距离
- 在计算过程中添加了标准差,对量纲数据进行处理
- 6、余弦距离
- 通过cos函数思想
- 7、汉明距离
- 一个字符串到另一个字符串需要变换几个字母,进行统计
- 8、杰卡德距离
- 通过交并集进行统计
- 9、马氏距离
- 通过样本分布进行计算
- 1、欧氏距离
- K值选择
- K值过小
- 容易受到异常点的影响
- 过拟合
- K值过大
- 受到样本均衡的问题
- 欠拟合
- 拓展
- 近似误差 -- 过拟合 -- 在训练集上表现好,测试集表现不好 估计误差好才是真的好
- K值过小
- kd树
- 构建树
- 最近邻域搜索
- 案例
- 构建树
- 第一次
- x轴 -- 2,5,9,4,8,7 --> 2,4,5,7,8,9 y轴 -- 2,4,6,7,1,2 --> 1,2,3,4,6,7
- 首先选择x轴,找中间点,发现是(7,2)
- 第二次
- 左面:(2,3), (4,7), (5,4) --> 3,4,7 右面:(8,1), (9,6) --> 1,6
- 从y轴开始选择点(5,4),右边选择点(9,6)
- 第三次
- 从x轴开始选择
- 第一次
- 搜索
- 在本域内,没有进行跨域搜索
- 要跨到其他域进行搜索
- 构建树
- 案例:鸢尾花种类预测--数据集介绍
- 获取数据集
- sklearn.datasets
- 小数据
- sklearn.datasets.load_*
- 数据从本地获取
- 大数据
- sklearn.datasets.fetch_*
- 数据从网上下载
- subset--表示获取到的数据集类型
- 数据集返回值介绍
- 返回值类型bunch--字典类型
- 返回值的属性
- data:特征数据数组
- target:标签(目标)数组
- DESCR:数据描述
- feature_name:特证名
- target_names:标签(目标值)名
- 数据可视化
- 导入imort seaborn
- seaborn.lmplot()
- x,y -- 具体x轴,y轴数据的索引值
- data -- 具体数据
- hue -- 目标值是什么
- fit_reg -- 是否进行线性拟合
- 数据集划分
- API
- from sklearn.model_selection import train_test_split
- sklearn.model_selection.train_test_split(arrays, *options)
- 参数
- x -- 特征值
- y -- 目标值
- test_size -- 测试集大小
- random_state -- 随机数种子
- 返回值
- x_train, x_test, y_train, y_test
- 参数
- API
- 获取数据集
- 特征工程-特征预处理
- 定义
- 通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
- 包含内容
- 归一化
- 标准化
- API
- sklearn.preprocessing
- 归一化
- 定义
- 对原始数据进行变换把数据映射到(默认为[0,1]之间)
- API
- sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)...)
- 参数:feature_range -- 自己指定范围,默认0-1
- 总结
- 鲁棒性比较差(容易受到异常点影响)
- 只适合传统精确小数据场景(以后不会使用)
- 定义
- 标准化
- 定义
- 对原始数据进行变换把数据变换到均值为0,标准差为1范围内
- API
- sklearn.preprocessing.StandardScaler()
- 总结
- 异常值影响小
- 适合现在嘈杂的大数据场景(基本都是用这个)
- 定义
- 定义
- 案例:鸢尾花种类预测--流程实现
- API
- sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
- algorithm -- 选择什么样的算法进行计算
- auto、ball_tree、kd_tree、brute
- 一般流程
- 1、获取数据集
- 2、数据基本处理
- 3、特征工程
- 4、机器学习(模型训练)
- 5、模型评估
- API
- K近邻算法总结
- 优点
- 简单有效
- 重新训练代价低
- 适合大样本自动分类
- 适合类域交叉样本
- 缺点
- 惰性学习
- 类别评分不是规格化
- 输出可解释性不强
- 对不均衡样本不擅长
- 样本不均衡:收集到的数据每个类别严重失衡
- 基本解决:重新采样
- 计算量大
- 优点
- 交叉验证和网格搜索
- 交叉验证
- 定义:将拿到的训练数据,分为训练和验证集*折交叉验证
- 分割方式
- 训练集:训练集+验证集
- 测试集:测试集
- 为什么需要交叉验证
- 为了让评估的模型更加准确可信
- 注意:交叉验证不能提高模型的准确率
- 网格搜索
- 超参数
- sklearn中,需要手动指定的参数,叫做超参数
- 网格搜索就是把这些超参数的值,通过字典的形式传递进去,然后进行最优值
- 超参数
- API
- sklearn.model_selection.GridSearchCV(estimator, param_grid=None, cv=None)
- estimator -- 选择哪个训练模型
- param_grid -- 需要传递的超参数
- cv -- 几折交叉验证
- sklearn.model_selection.GridSearchCV(estimator, param_grid=None, cv=None)
- 交叉验证
案例流程
""" 1.获取数据集 2.数据基本处理 3.特征工程 4.机器学习(模型训练) 5.模型评估 """ from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier # 1.获取数据集 iris = load_iris() # 2.数据基本处理 # 2.1 数据分割 x_train,x_test,y_train,y_test = train_test_split(iris.data, iris.target, random_state=22, test_size=0.2) # 3.特征工程 # 3.1 实例化一个转换器 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.fit_transform(x_test) # 4.机器学习(模型训练) # 4.1 实例化一个估计器 estimator = KNeighborsClassifier(n_neighbors=1) # 4.2 调用交叉验证网格搜索模型 param_grid = {"n_neighbors":[1,3,5,7]} estimator = GridSearchCV(estimator, param_grid=param_grid, cv=10, n_jobs=1) # 4.3 模型训练 estimator.fit(x_train,y_train) # 5.模型评估 # 5.1输出预测值 y_pre = estimator.predict(x_test) print("预测值是:\n",y_pre) print("预测值和真实值对比:\n",y_pre == y_test) # 5.2 输出准确率 ret = estimator.score(x_test, y_test) print("准确率是:\n",ret) # 5.3 其他评价指标 print("最好的模型:\n",estimator.best_estimator_) print("最好的结果:\n",estimator.best_score_) print("整体模型结果:\n",estimator.cv_results_)
结果:
预测值是: [0 2 1 1 1 1 1 1 1 0 2 1 2 2 0 2 1 1 1 1 0 2 0 1 1 0 1 1 2 1] 预测值和真实值对比: [ True True True False True True True False True True True True True True True True True True False True True True True True False True False False True False] 准确率是: 0.7666666666666667 最好的模型: KNeighborsClassifier() 最好的结果: 0.9666666666666666 整体模型结果: {'mean_fit_time': array([0.00055301, 0.00039883, 0.00050271, 0.00099938]), 'std_fit_time': array([4.70469869e-04, 4.88460843e-04, 5.02844264e-04, 7.18352449e-06]), 'mean_score_time': array([0.00099759, 0.00099237, 0.00099008, 0.00099123]), 'std_score_time': array([4.45478308e-04, 1.30509076e-05, 1.65153877e-05, 1.30099887e-05]), 'param_n_neighbors': masked_array(data=[1, 3, 5, 7], mask=[False, False, False, False], fill_value='?', dtype=object), 'params': [{'n_neighbors': 1}, {'n_neighbors': 3}, {'n_neighbors': 5}, {'n_neighbors': 7}], 'split0_test_score': array([1., 1., 1., 1.]), 'split1_test_score': array([0.91666667, 0.91666667, 1. , 1. ]), 'split2_test_score': array([1. , 0.91666667, 1. , 1. ]), 'split3_test_score': array([0.91666667, 0.91666667, 0.91666667, 0.91666667]), 'split4_test_score': array([0.91666667, 1. , 1. , 1. ]), 'split5_test_score': array([1., 1., 1., 1.]), 'split6_test_score': array([0.91666667, 0.91666667, 0.91666667, 0.91666667]), 'split7_test_score': array([0.83333333, 0.83333333, 0.91666667, 0.91666667]), 'split8_test_score': array([0.91666667, 0.91666667, 0.91666667, 0.91666667]), 'split9_test_score': array([1., 1., 1., 1.]), 'mean_test_score': array([0.94166667, 0.94166667, 0.96666667, 0.96666667]), 'std_test_score': array([0.05335937, 0.05335937, 0.04082483, 0.04082483]), 'rank_test_score': array([3, 3, 1, 1])}