机器学习day02
机器学习day2
KNN算法#
KNN算法简介#
1.KNN#
- K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别
- KNN算法思想:如果一个样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别
1.1K-近邻算法#
- 样本相似性:样本都是属于一个任务数据集的。样本距离越近则越相似。
- 利用K近邻算法预测电影类
1.2KNN算法#
-
解决问题:分类问题、回归问题
-
算法思想:若一个样本在特征空间中的 k 个最相似的样本大多数属于某一个类别,则该样本也属于这个类 别
-
相似性:欧氏距离
分类流程
- 计算未知样本到每一个训练样本的距离
- 将训练样本根据距离大小升序排列
- 取出距离最近的 K 个训练样本
- 进行多数表决,统计 K 个样本中哪个类别 的样本个数最多
- 将未知的样本归属到出现次数最多的类别
回归流程
- 计算未知样本到每一个训练样本的距离
- 将训练样本根据距离大小升序排列
- 取出距离最近的 K 个训练样本
- 把这个 K 个样本的目标值计算其平均值
- 作为将未知的样本预测的值
1.3K值选择#
- K值过小:用较小邻域中的训练实例进行预测 容易受到异常点的影响 K值的减小就意味着整体模型变得复杂,容易发生过拟合
- K值过大:用较大邻域中的训练实例进行预测 受到样本均衡的问题 且K值的增大就意味着整体的模型变得简单,欠拟合
1.4总结#
- KNN概念 K Nearest Neighbor • 一个样本最相似的 k 个样本中的大多数属于某一个类别,则该样本也属于这个类别
- KNN分类流程
- 计算未知样本到每一个训练样本的距离
- 将训练样本根据距离大小升序排列
- 取出距离最近的 K 个训练样本
- 进行多数表决,统计 K 个样本中哪个类别的样本个数最多
- 将未知的样本归属到出现次数最多的类别
- KNN回归流程
- 计算未知样本到每一个训练样本的距离
- 将训练样本根据距离大小升序排列
- 取出距离最近的 K 个训练样本
- 把这个 K 个样本的目标值计算其平均值 5.将未知的样本预测的值了
- K值的选择 • K值过小:过拟合 • K值过大:欠拟合
KNN算法API介绍#
# - *- coding: utf-8 -*- """ ----------------------- File Name:knn_01 Author:chizhayuehai Date 2024/6/18 ------------------------ Deos TODO K近邻算法演示 # todo 1.导包 # todo 2.导数据 # todo 3.模型实例化 # todo 4.训练 # todo 5.预测 # todo(直接挪上去shift+CTRL+上下键) # todo(CTRL+y 光标在那一行删除哪一行) # todo (多光标选中,鼠标滚轮或shift+alt+鼠标左键) """ def dm1_classifier(): # todo 1.导包 from sklearn.neighbors import KNeighborsClassifier # todo 2.导数据 x = [[0, 2], [1, 3], [2, 5], [3, 6], [4, 2]] y = [0, 0, 0, 1, 1] # todo 3.模型实例化 (实例化:在编程中创建类的实例或对象的过程。在面向对象的编程语言中,类是一种模板或蓝图,描述了对象的属性和行为。通过实例化,程序可以根据类的定义创建具体的对象,这些对象可以在程序中被使用和操作。) estimator = KNeighborsClassifier(n_neighbors=3) # todo 4.训练 (fit:表示训练) estimator.fit(x, y) # todo 5.预测 mypre = estimator.predict([[3, 6], [2, 5], [4, 2]]) print(f'mypre:{mypre}') print('mypre:', mypre) def dm2_regressor(): # todo 1.导包 from sklearn.neighbors import KNeighborsRegressor # todo 2.导数据 x = [[0, 2], [1, 3], [2, 5], [3, 6], [4, 2]] y = [0.1, 0.3, 0.5, 0.7, 0.9] # todo 3.模型实例化 estimator = KNeighborsRegressor(n_neighbors=3) # todo 4.训练 estimator.fit(x, y) # todo 5.预测 mypre = estimator.predict([[3, 6], [2, 5], [3, 4]]) print(f'mypre:{mypre}') if __name__ == '__main__': dm1_classifier() dm2_regressor()
距离度量#
1.1距离度量 distance measure – 常见距离公式#
欧氏距离 Euclidean Distance 直观的距离度量方法, 两个点在空间中的距离一般都是指欧氏距离
曼哈顿距离(Manhattan Distance) 也称为“城市街区距离”(City Block distance),曼哈顿城市特点:横平竖直
切比雪夫距离 Chebyshev Distance 国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。 国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?这个距离就叫切比雪夫距离。
闵可夫斯基距离 MinkowskiDistance 闵氏距离
- 不是一种新的距离的度量方式。
- 是对多个距离度量公式的概括性的表述
- 两个n维变量a(x11 ,x12, …, x1n) 与 b(x21, x22,…, x2n) 间的闵可夫斯基距离定义为
其中p是一个变参数: 当 p=1 时,就是曼哈顿距离; 当 p=2 时,就是欧氏距离; 当 p→∞ 时,就是切比雪夫距离 根据 p 的不同,闵氏距离可表示某一类种的距离
特征预处理#
1.1为什么要做归一化和标准化#
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响 (支配)目标结果,使得一些模型(算法)无法学习到其它的特征。
归一化:通过对原始数据进行变换把数据映射到【mi,mx】(默认为[0,1])之间
数据归一化:通过对原始数据进行变换把数据映射到【mi,mx】(默认为[0,1])之间
数据归一化API: 1.sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… ) feature_range 缩放区间 2. fit_transform(X) 将特征进行归一化缩放
数据标准化:通过对原始数据进行标准化,转换为均值为0标准差为1的标准正态分布的数据
数据标准化API: 1.sklearn.preprocessing. StandardScaler() 2. fit_transform(X) 将特征进行归一化缩放
正态分布是一种概率分布,大自然很多数据符合正态分布 也叫高斯分布,钟形分布。正态分布记作N(μ,σ ) μ决定了其位置,其标准差σ决定了分布的幅度 当μ = 0, σ = 1时的正态分布是标准正态分布
- 方差𝞼𝟐是在概率论和统计方差衡量一组数据时离散程度的度量 其中M为均值 n为数据总数
- 标准差σ是方差开根号
- 正态分布的3σ法则(68-95-99.7 法则)
1.2特征预处理#
- 数据归一化
- 如果出现异常点,影响了最大值和最小值,那么结果 显然会发生改变
- 应用场景:最大值与最小值非常容易受异常点影响,鲁棒性较差,只适合传统精确小数据场景
- sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
- 数据标准化
- 如果出现异常点,由于具有一定数据量,少量的异 常点对于平均值的影响并不大
- 应用场景:适合现代嘈杂大数据场景。(以后就是 用你了)
- sklearn.preprocessing.StandardScaler( )
案例:归一化处理#
#!/usr/bin/env python # -*- coding: UTF-8 -*- ''' ---------------------------------- @Project :pythonclass @File :MinMaxScaler_02.py @IDE :PyCharm @Author :chizhayuehaiyuyumao @Date :2024/6/18 15:24 ---------------------------------- Deos TODO 数据归一化 # todo 1.导包 # todo 2.造数据 # todo 3.实例化对象 # todo 4.对数据进行归一化 ---------------------------------- ''' def dmo1_minmaxscaler(): # todo 1.导包 from sklearn.preprocessing import MinMaxScaler import numpy as np # todo 2.造数据 data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # todo 3.实例化对象 scaler = MinMaxScaler() # todo 4.对数据进行归一化 data_scaled = scaler.fit_transform(data) print(f'data_scaled{data_scaled}') if __name__ == '__main__': dmo1_minmaxscaler()
案例:数据标准化#
#!/usr/bin/env python # -*- coding: UTF-8 -*- ''' ---------------------------------- @Project :pythonclass @File :StandardScaler_03.py @IDE :PyCharm @Author :chizhayuehaiyuyumao @Date :2024/6/18 15:28 ---------------------------------- Deos TODO 数据标准化 # todo 1.导包 # todo 2.造数据 # todo 3.实例化对象(标准化) # todo 4.对数据进行标准化 ---------------------------------- ''' # todo 1.导包 from sklearn.preprocessing import StandardScaler # todo 2.造数据 x = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] # todo 3.实例化对象(标准化) ss = StandardScaler() # todo 4.对数据进行标准化 x_new = ss.fit_transform(x) print(f'标准化前的数据:\n{x}') print(f'标准化后的数据:\n{ss.fit_transform(x_new)}') print(f'均值:{ss.mean_}') print(f'方差:{ss.var_}')
案例:利用KNN算法对鸢尾花分类#
实现流程:
- 获取数据集
- 数据基本处理
- 数据集预处理-数据标准化
- 机器学习(模型训练)
- 模型评估
- 模型预测
#!/usr/bin/env python # -*- coding: UTF-8 -*- ''' ---------------------------------- @Project :pythonclass @File :knn_iris_04.py @IDE :PyCharm @Author :chizhayuehaiyuyumao @Date :2024/6/18 15:56 ---------------------------------- Deos TODO knn处理鸢尾花案例 # todo 1.导包 # todo 2.加载数据集 # todo 3.数据展示 # todo 4.数据基本处理 # todo 5.实例化模型 # todo 6.模型训练 # todo 7.评估 # todo 8.预测 ---------------------------------- ''' # todo 1.导包 from sklearn.metrics import accuracy_score from sklearn.neighbors import KNeighborsClassifier # 导入knn分类算法 from sklearn.datasets import load_iris # 导入鸢尾花数据集 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split # todo 2.加载数据集 iris_data = load_iris() print(iris_data.DESCR) print(f'数据集-->\n{iris_data.feature_names}\n{iris_data.data[:10]}') # iris_data.feature_names:特征值名称 iris_data.data:特征值数据 :10从头到10行 print(f'数据集-->\n{iris_data.target_names}\n{iris_data.target[:10]}') # todo 3.数据展示 def demo1_iris_data(): iris_df = pd.DataFrame(iris_data['data'], columns=iris_data.feature_names) # 两种方式都行⬆ # iris_df['target'] = iris_data['target'] iris_df['target'] = iris_data.target print(f'转化为DF格式的数据:\n{iris_df}') # 指定横纵轴,指定纵轴 col1 = 'sepal length (cm)' col2 = 'petal width (cm)' # 作图 # sns.lmplot(x=col1, y=col2, data=iris_df, hue='target', fit_reg=False) # plt.xlabel(f'{col1}') # plt.ylabel(f'{col2}') # plt.title('iris') # plt.show() feature_names = iris_data.feature_names # print(f'特征值名称:{feature_names}') for i in range(len(feature_names)): for j in range(i + 1, len(feature_names)): col1 = feature_names[i] col2 = feature_names[j] sns.lmplot(x=col1, y=col2, data=iris_df, hue='target', fit_reg=False) plt.xlabel(f'{col1}') plt.ylabel(f'{col2}') plt.title('iris') plt.show() # todo 4.数据基本处理 x = iris_data.data y = iris_data.target # todo 4.1划分数据集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=22) # random_state=22 : 随机数种子(为了不影响结果不同) # print(f'数据集总量:{len(x)}') # print(f'训练数据集数量:{len(x_train)}') # print(f'测试集数据集数量:{len(x_test)}') # todo 4.2 数据预处理(标准化) scaler = StandardScaler() x_train = scaler.fit_transform(x_train) x_test = scaler.transform(x_test) # 为什么不用fit 是因为可以直接使用已经拟合好的函数 # todo 5.实例化模型 knn = KNeighborsClassifier(n_neighbors=5) # todo 6.模型训练 knn.fit(x_train, y_train) # todo 7.评估 y_pre = knn.predict(x_test) score = accuracy_score(y_pre, y_test) print(f'模型准确率:{score}') # print(f'模型准确率:{knn.score(x_test, y_test)}') # todo 8.预测 mydata = [[5.1, 3.5, 1.4, 0.2], [4.6, 3.1, 1.5, 0.2]] mydata = scaler.transform(mydata) mydata = knn.predict(mydata) print(f'预测结果:{mydata}') # print(f'预测结果:{knn.predict(x_test)}')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律