【机器学习算法】KNN鸢尾花种类预测案例和特征预处理。全md文档笔记(已分享,附代码)

本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用,结合场景解决实际问题。包括K-近邻算法,线性回归,逻辑回归,决策树算法,集成学习,聚类算法。K-近邻算法的距离公式,应用LinearRegression或SGDRegressor实现回归预测,应用LogisticRegression实现逻辑回归预测,应用DecisionTreeClassifier实现决策树分类,应用RandomForestClassifie实现随机森林算法,应用Kmeans实现聚类任务。

全套笔记和代码自取移步gitee仓库: gitee仓库获取完整文档和代码

感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~


共 7 章,44 子模块

K-近邻算法

学习目标

  • 掌握K-近邻算法实现过程
  • 知道K-近邻算法的距离公式
  • 知道K-近邻算法的超参数K值以及取值问题
  • 知道kd树实现搜索的过程
  • 应用KNeighborsClassifier实现分类
  • 知道K-近邻算法的优缺点
  • 知道交叉验证实现过程
  • 知道超参数搜索过程
  • 应用GridSearchCV实现算法参数的调优

1.6 案例:鸢尾花种类预测--数据集介绍

本实验介绍了使用Python进行机器学习的一些基本概念。 在本案例中,将使用K-Nearest Neighbor(KNN)算法对鸢尾花的种类进行分类,并测量花的特征。

本案例目的:

  1. 遵循并理解完整的机器学习过程
  2. 对机器学习原理和相关术语有基本的了解。
  3. 了解评估机器学习模型的基本过程。

1 案例:鸢尾花种类预测

Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。关于数据集的具体介绍:

2 scikit-learn中数据集介绍

2.1 scikit-learn数据集API介绍

  • sklearn.datasets

  • 加载获取流行数据集

  • datasets.load_*()

    • 获取小规模数据集,数据包含在datasets里
  • datasets.fetch_*(data_home=None)

    • 获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
2.1.1 sklearn小数据集
  • sklearn.datasets.load_iris()

加载并返回鸢尾花数据集

img

2.1.2 sklearn大数据集
  • sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)

  • subset:'train'或者'test','all',可选,选择要加载的数据集。

  • 训练集的“训练”,测试集的“测试”,两者的“全部”

2.2 sklearn数据集返回值介绍

  • load和fetch返回的数据类型datasets.base.Bunch(字典格式)

  • data:特征数据数组,是 [n_samples * n_features] 的二维 numpy.ndarray 数组

  • target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
  • DESCR:数据描述
  • feature_names:特征名,新闻数据,手写数字、回归数据集没有
  • target_names:标签名

```python from sklearn.datasets import load_iris

获取鸢尾花数据集

iris = load_iris() print("鸢尾花数据集的返回值:\n", iris)

返回值是一个继承自字典的Bench

print("鸢尾花的特征值:\n", iris["data"]) print("鸢尾花的目标值:\n", iris.target) print("鸢尾花特征的名字:\n", iris.feature_names) print("鸢尾花目标值的名字:\n", iris.target_names) print("鸢尾花的描述:\n", iris.DESCR) ```

2.3 查看数据分布

通过创建一些图,以查看不同类别是如何通过特征来区分的。 在理想情况下,标签类将由一个或多个特征对完美分隔。 在现实世界中,这种理想情况很少会发生。

  • seaborn介绍

  • Seaborn 是基于 Matplotlib 核心库进行了更高级的 API 封装,可以让你轻松地画出更漂亮的图形。而 Seaborn 的漂亮主要体现在配色更加舒服、以及图形元素的样式更加细腻。

  • 安装 pip3 install seaborn
  • seaborn.lmplot() 是一个非常有用的方法,它会在绘制二维散点图时,自动完成回归拟合

    • sns.lmplot() 里的 x, y 分别代表横纵坐标的列名,
    • data= 是关联到数据集,
    • hue=*代表按照 species即花的类别分类显示,
    • fit_reg=是否进行线性拟合。
  • 参考链接: api链接

```python %matplotlib inline

内嵌绘图

import seaborn as sns import matplotlib.pyplot as plt import pandas as pd

把数据转换成dataframe的格式

iris_d = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width']) iris_d['Species'] = iris.target

def plot_iris(iris, col1, col2): sns.lmplot(x = col1, y = col2, data = iris, hue = "Species", fit_reg = False) plt.xlabel(col1) plt.ylabel(col2) plt.title('鸢尾花种类分布图') plt.show() plot_iris(iris_d, 'Petal_Width', 'Sepal_Length') ```

image-20190225193311519

2.4 数据集的划分

机器学习一般的数据集会划分为两个部分:

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

划分比例:

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

数据集划分api

  • sklearn.model_selection.train_test_split(arrays, *options)

  • x 数据集的特征值

  • y 数据集的标签值
  • test_size 测试集的大小,一般为float
  • random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
  • return 测试集特征训练集特征值值,训练标签,测试标签(默认随机取)

```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split

1、获取鸢尾花数据集

iris = load_iris()

对鸢尾花数据集进行分割

训练集的特征值x_train 测试集的特征值x_test 训练集的目标值y_train 测试集的目标值y_test

x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22) print("x_train:\n", x_train.shape)

随机数种子

x_train1, x_test1, y_train1, y_test1 = train_test_split(iris.data, iris.target, random_state=6) x_train2, x_test2, y_train2, y_test2 = train_test_split(iris.data, iris.target, random_state=6) print("如果随机数种子不一致:\n", x_train == x_train1) print("如果随机数种子一致:\n", x_train1 == x_train2) ```

1.7 特征工程-特征预处理

1 什么是特征预处理

1.1 特征预处理定义

scikit-learn的解释

provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.

翻译过来:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程

特征预处理图

为什么我们要进行归一化/标准化?
  • 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
举例:约会对象数据

约会对象数据

我们需要用到一些方法进行无量纲化使不同规格的数据转换到同一规格

1.2 包含内容(数值型数据的无量纲化)

  • 归一化
  • 标准化

1.3 特征预处理API

python sklearn.preprocessing

2 归一化

2.1 定义

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

2.2 公式

归一化公式

作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0

那么怎么理解这个过程呢?我们通过一个例子

归一化计算过程

2.3 API

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

  • MinMaxScalar.fit_transform(X)

    • X:numpy array格式的数据[n_samples,n_features]
  • 返回值:转换后的形状相同的array

2.4 数据计算

我们对以下数据进行运算,在dating.txt中。保存的就是之前的约会对象数据

python milage,Liters,Consumtime,target 40920,8.326976,0.953952,3 14488,7.153469,1.673904,2 26052,1.441871,0.805124,1 75136,13.147394,0.428964,1 38344,1.669788,0.134296,1

  • 分析

1、实例化MinMaxScalar

2、通过fit_transform转换

```python import pandas as pd from sklearn.preprocessing import MinMaxScaler

def minmax_demo(): """ 归一化演示 :return: None """ data = pd.read_csv("dating.txt") print(data) # 1、实例化一个转换器类 transfer = MinMaxScaler(feature_range=(2, 3)) # 2、调用fit_transform data = transfer.fit_transform(data[['milage','Liters','Consumtime']]) print("最小值最大值归一化处理的结果:\n", data)

return None

```

返回结果:

```python milage Liters Consumtime target 0 40920 8.326976 0.953952 3 1 14488 7.153469 1.673904 2 2 26052 1.441871 0.805124 1 3 75136 13.147394 0.428964 1 .. ... ... ... ... 998 48111 9.134528 0.728045 3 999 43757 7.882601 1.332446 3

[1000 rows x 4 columns] 最小值最大值归一化处理的结果: [[ 2.44832535 2.39805139 2.56233353] [ 2.15873259 2.34195467 2.98724416] [ 2.28542943 2.06892523 2.47449629] ..., [ 2.29115949 2.50910294 2.51079493] [ 2.52711097 2.43665451 2.4290048 ] [ 2.47940793 2.3768091 2.78571804]] ```

问题:如果数据中异常点较多,会有什么影响?

异常点对归一化影响

2.5 归一化总结

注意最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

怎么办?

3 标准化

3.1 定义

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内

3.2 公式

æ ‡å‡†åŒ–å…¬å¼

作用于每一列,mean为平均值,σ为标准差

所以回到刚才异常点的地方,我们再来看看标准化

  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
  • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

3.3 API

  • sklearn.preprocessing.StandardScaler( )

  • 处理之后每列来说所有数据都聚集在均值0附近标准差差为1

  • StandardScaler.fit_transform(X)

    • X:numpy array格式的数据[n_samples,n_features]
  • 返回值:转换后的形状相同的array

3.4 数据计算

同样对上面的数据进行处理

  • 分析

1、实例化StandardScaler

2、通过fit_transform转换

```python import pandas as pd from sklearn.preprocessing import StandardScaler

def stand_demo(): """ 标准化演示 :return: None """ data = pd.read_csv("dating.txt") print(data) # 1、实例化一个转换器类 transfer = StandardScaler() # 2、调用fit_transform data = transfer.fit_transform(data[['milage','Liters','Consumtime']]) print("标准化的结果:\n", data) print("每一列特征的平均值:\n", transfer.mean_) print("每一列特征的方差:\n", transfer.var_)

return None

```

返回结果:

```python milage Liters Consumtime target 0 40920 8.326976 0.953952 3 1 14488 7.153469 1.673904 2 2 26052 1.441871 0.805124 1 .. ... ... ... ... 997 26575 10.650102 0.866627 3 998 48111 9.134528 0.728045 3 999 43757 7.882601 1.332446 3

[1000 rows x 4 columns] 标准化的结果: [[ 0.33193158 0.41660188 0.24523407] [-0.87247784 0.13992897 1.69385734] [-0.34554872 -1.20667094 -0.05422437] ..., [-0.32171752 0.96431572 0.06952649] [ 0.65959911 0.60699509 -0.20931587] [ 0.46120328 0.31183342 1.00680598]] 每一列特征的平均值: [ 3.36354210e+04 6.55996083e+00 8.32072997e-01] 每一列特征的方差: [ 4.81628039e+08 1.79902874e+01 2.46999554e-01] ```

3.5 标准化总结

在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

未完待续, 同学们请等待下一期

全套笔记和代码自取移步gitee仓库: gitee仓库获取完整文档和代码

感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/479402.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode C/C++无法跳转到定义(又是你 clangd !)

原博客:VSCode C/C无法跳转到定义、自动补全、悬停提示功能_c/c:edit configurations(json)-CSDN博客 我在此基础上加一点: 首先确保自己有这个插件: 点击 齿轮⚙ 符号,进入 配置设置,找到 把 C_cpp : Intelli Sens…

二叉树基本概念与遍历

什么是二叉树 二叉树不同于别的树,因为他每个节点最多只有两个子节点,而别的树可以有无数个子节点。 所以二叉树就是只最多只有两个子节点的树,一个子节点叫右子节点,另一个子节点叫左子结点 而他们的上一层就是父子节点&#xf…

TCP和UDP的使用方法和注意事项

文章目录 客户端和服务器TCP和UDP的特点UDP socket api的使用DatagramSocketDatagramPacketInetSocketAddress API 做一个简单的回显服务器UDP版本的回显服务器TCP版本的回显服务器 客户端和服务器 在网络中,主动发起通信的一方是客户端,被动接受的这一方…

OpenAI最新Sora视频学习与生成的技术分析与最新体验渠道

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

2024阿里云云服务器ECS价格表出炉

2024年最新阿里云服务器租用费用优惠价格表,轻量2核2G3M带宽轻量服务器一年61元,折合5元1个月,新老用户同享99元一年服务器,2核4G5M服务器ECS优惠价199元一年,2核4G4M轻量服务器165元一年,2核4G服务器30元3…

MBD_入门篇_17_Simulink逻辑和位运算模块

17.Simulink逻辑和位运算模块 17.1 概述 Logic And Bit Operation,逻辑和位运算操作模块。 17.2 逻辑运算模块LogicalOperator 可以对输入做与、或、非、异或等逻辑运算。 简单示例。 17.3 比较运算模块RelationOperation 比较两个数的大小等运算。 注意&#xff0c…

QT中事件过滤器

Qt添加事件过滤器,设置拖放listWidget、TreeWidget、TableWidget控件。 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this)…

【JAVA】《接口,抽象方法,抽象类 》之二 、抽象方法详解

抽象方法 详解 一、接口二、抽象方法2.1、抽象方法概念2.2、抽象方法的特点:2.3、抽象方法的作用:2.4、抽象方法的应用:2.5、抽象方法的实践:2.6、使用抽象方法的注意事项 三、抽象类四、开发实践 一、接口 1.1、接口的概念 1.2、…

如何利用Idea创建一个Servlet项目(新手向)

💕"Echo"💕 作者:Mylvzi 文章主要内容:如何利用Idea创建一个Servlet项目(新手向) Servlet是tomcat的api,利用Servlet进行webapp开发很方便,本文将介绍如何通过Idea创建一个Servlet项目(一共分为七步,这可能是我们写过的…

简介高效的 CV 入门指南: 100 行实现 ConvNext 图像分类

简介高效的 CV 入门指南: 100 行实现 ConvNext 图像分类 概述ConvNext架构创新参数效率计算效率100 行代码实现 ConvNext 图像分类ConvNext tinyConvNext Base 概述 在当今快速发展的人工智能领域, 计算机视觉 (Computer Vision, CV) 已称为一个关键的研究和应用领域. CV 可以…

学习鸿蒙基础(4)

1.条件渲染 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用if、else和else if渲染对应状态下的UI内容。 当if、else if后跟随的状态判断中使用的状态变量值变化时,条件渲染语句会进行更新。。 Entry Component struct PageIfElse {Stat…

统信操作系统下数据库管理利器

PL/SQL是一款荷兰公司开发的数据库管理软件,尽管只支持Oracle一种数据库,但是在这一种数据库的支持上深度耕耘了30年,做到了Oracle管理的极致,从而拥有量海量的用户。 当然,随着时间的推移,PL/SQL也出现了一…