【机器学习】第四节:监督学习算法对比评估

news2024/11/20 12:39:15

 作者🕵️‍♂️:让机器理解语言か

专栏🎇:机器学习sklearn

描述🎨:本专栏主要分享博主学习机器学习的笔记和一些心得体会。

寄语💓:🐾没有白走的路,每一步都算数!🐾 

0、介绍

        监督学习(英语:Supervised learning)是机器学习中最为常见、应用最为广泛的分支之一。本次实验将带你了解监督学习中常见的分类方法,并学会使用 scikit-learn 来构建预测模型,用于解决实际问题。

知识点

  • 常用监督学习方法
  • 常用算法对比评估

除了前面两节介绍过的线性模型以及支持向量机,还有很多监督学习方法都非常流行。例如:K 近邻、决策树、随机森林、朴素贝叶斯等。

1、K 近邻

        K 近邻是一种十分常用的监督学习算法。简单来讲,K 近邻就是假设一个给定的数据集,且数据的类别已经确定。这些数据的特征所构成的特征向量可以映射到对应的特征空间中。现在,假设一个输入实例,我们可以计算该输入和其他数据点之间的距离,再通过多数表决的方式,来确定新输入实例的类别,最后完成分类。

        其中,K 近邻中的「近邻」代表原有特征空间中与新输入实例距离最近的那些样本。而 K 代表距离最近的 K 个样本。所以,对于 K 近邻而言。K 值的大小和距离的度量方式欧式距离或者曼哈顿距离)是其构成的两个关键因素。

        如上图所示,原数据集由红、绿两类组成。现在,我们新输入一个橙色实例,图中表示了样本对应在特征空间的位置。现在,我们确定 K = 3,然后可以圈定出距离橙色实例最近的 3 个样本点。其中,红色样本为 1 个,绿色 2 个。根据多数表决的规则,最终确定新输入的橙色样本数据被判定为 B 类别。而当我们指定 K = 7 时,红色样本 4 个,绿色样本 3 个,则橙色样本被判定为 A 类别。

2、决策树和随机森林

决策树也是一种十分常见的监督学习方法。它是一种特殊的树形结构,一般由节点和有向边组成。其中,节点表示特征、属性或者一个类。而有向边包含有判断条件

        如图所示,决策树从根节点开始延伸,经过不同的判断条件后,到达不同的子节点。而上层子节点又可以作为父节点被进一步划分为下层子节点。一般情况下,我们从根节点输入数据,经过多次判断后,这些数据就会被分为不同的类别。这就构成了一颗简单的分类决策树。

        当我们使用决策树分类时,对于已有训练集只建立一颗决策树。而随机森林的概念是,对于一个训练集随机建立多颗决策树。而建立这些决策树时,会采取一种叫 Bootstrap 的取样方式,即每一次从数据集中又放回的取出一部分数据,再用这部分数据去建立小决策树。对于随机森林而言,最终的分类结果由众多小决策树输出类别的众数确定。下图展示了一个由 3 颗决策树构成的随机森林过程。

        由于随机森林的特点,有效地降低过拟合程度,具有较好的泛化误差。另外,训练速度也非常快,模型的表现往往都比较好,是十分受欢迎的一种机器学习方法。

        监督学习包含的方法众多,在此就不再一一介绍。下面我们直接上手,看一看 scikit-learn 中一些常用监督学习方法的分类效果如何。

3、常见监督学习方法

下面,我们通过同一个示例数据集来对常见的监督学习算法分类性能做一个比较。

为了更方便可视化,这里选用了一个随机生成的二分类数据集。总共包含 300 条数据,类别为 0 和 1。

接下来,你可以通过 Pandas 读取数据集并预览这些数据。

import pandas as pd  # 加载 pandas 模块
import warnings
warnings.filterwarnings('ignore')

# 读取 csv 文件, 并将第一行设为表头
data = pd.read_csv(
    "https://labfile.oss.aliyuncs.com/courses/866/class_data.csv", header=0)

data.head()  # 输出数据预览

  

通常情况下,可视化是直观认识陌生数据的很好方法。这里,我们通过 Matplotlib 来可视化这些数据。只需要 3 行代码,就可以画出数据集的散点图。

from matplotlib import pyplot as plt  # 加载绘图模块
%matplotlib inline

plt.scatter(data["X"], data['Y'], c=data['CLASS'])  # 绘制散点图

  

上面,我们用 c=data['CLASS'] 参数来控制散点的颜色。

接下来,加载本次实验需要的模块,以及 scikit-learn 中常见的分类器。你也可以通过  官方文档 对应的页面来查看这些分类方法。

# 集成方法分类器
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import RandomForestClassifier
# 高斯过程分类器
from sklearn.gaussian_process import GaussianProcessClassifier
# 广义线性分类器
from sklearn.linear_model import PassiveAggressiveClassifier
from sklearn.linear_model import RidgeClassifier
from sklearn.linear_model import SGDClassifier
# K近邻分类器
from sklearn.neighbors import KNeighborsClassifier
# 朴素贝叶斯分类器
from sklearn.naive_bayes import GaussianNB
# 神经网络分类器
from sklearn.neural_network import MLPClassifier
# 决策树分类器
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import ExtraTreeClassifier
# 支持向量机分类器
from sklearn.svm import SVC
from sklearn.svm import LinearSVC

接下来,建立预测模型,采用默认参数即可。由于方法较多,所有这里就不再依次单独定义模型,而是用列表形式管理。

# 建立模型
models = [
    AdaBoostClassifier(),
    BaggingClassifier(),
    ExtraTreesClassifier(),
    GradientBoostingClassifier(),
    RandomForestClassifier(),
    GaussianProcessClassifier(),
    PassiveAggressiveClassifier(),
    RidgeClassifier(),
    SGDClassifier(),
    KNeighborsClassifier(),
    GaussianNB(),
    MLPClassifier(),
    DecisionTreeClassifier(),
    ExtraTreeClassifier(),
    SVC(),
    LinearSVC()
]

# 依次为模型命名
classifier_Names = ['AdaBoost', 'Bagging', 'ExtraTrees',
                    'GradientBoosting', 'RandomForest', 'GaussianProcess',
                    'PassiveAggressive', 'Ridge', 'SGD',
                    'KNeighbors', 'GaussianNB', 'MLP',
                    'DecisionTree', 'ExtraTree', 'SVC', 'LinearSVC']

然后,划分数据集。70% 用于训练,另外 30% 用于测试。

from sklearn.model_selection import train_test_split  # 导入数据集切分模块

feature = data[['X', 'Y']]  # 指定特征变量
target = data['CLASS']  # 指定标签变量
X_train, X_test, y_train, y_test = train_test_split(
    feature, target, test_size=.3)  # 切分数据集

准备好数据之后,就可以开始模型训练和测试了。

from sklearn.metrics import accuracy_score  # 导入准确度评估模块

# 遍历所有模型
for name, model in zip(classifier_Names, models):
    model.fit(X_train, y_train)  # 训练模型
    pre_labels = model.predict(X_test)  # 模型预测
    score = accuracy_score(y_test, pre_labels)  # 计算预测准确度
    print('%s: %.2f' % (name, score))  # 输出模型准确度

输出结果: 

AdaBoost: 0.82
Bagging: 0.86
ExtraTrees: 0.87
GradientBoosting: 0.86
RandomForest: 0.84
GaussianProcess: 0.88
PassiveAggressive: 0.76
Ridge: 0.86
SGD: 0.81
KNeighbors: 0.86
GaussianNB: 0.86
MLP: 0.87
DecisionTree: 0.79
ExtraTree: 0.84
SVC: 0.90
LinearSVC: 0.86 

        我们可以看到,这 16 个分类器最终的准确度均在 80% ~ 90% 之间,差距不是很大。对于这种现象,主要有两个原因。首先,本次使用的是一个非常规范整洁的线性分类数据集。其次,所有的分类器均采用了默认参数,而 scikit-learn 提供的默认参数一般已经较优。

        接下来,我们通过可视化的方法将每一个模型在分类时的决策边界展示出来,这样能更加直观的感受到机器学习模型在执行分类预测时发生的变化。

from matplotlib.colors import ListedColormap  # 加载色彩模块
import numpy as np  # 导入数值计算模块
from tqdm.notebook import tqdm

# 绘制数据集
i = 1  # 为绘制子图设置的初始编号参数
cm = plt.cm.Reds  # 为绘制等高线选择的样式
cm_color = ListedColormap(['red', 'yellow'])  # 为绘制训练集和测试集选择的样式

# 栅格化
x_min, x_max = data['X'].min() - .5, data['X'].max() + .5
y_min, y_max = data['Y'].min() - .5, data['Y'].max() + .5

xx, yy = np.meshgrid(np.arange(x_min, x_max, .1),
                     np.arange(y_min, y_max, .1))

# 模型迭代
plt.figure(figsize=(20, 10))

for name, model in tqdm(zip(classifier_Names, models)):
    ax = plt.subplot(4, 4, i)  # 绘制 4x4 子图

    model.fit(X_train, y_train)  # 模型训练
    pre_labels = model.predict(X_test)  # 模型测试
    score = accuracy_score(y_test, pre_labels)  # 模型准确度

    # 根据类的不同选择决策边界计算方法
    if hasattr(model, "decision_function"):
        Z = model.decision_function(np.c_[xx.ravel(), yy.ravel()])
    else:
        Z = model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]

    # 绘制决策边界等高线
    Z = Z.reshape(xx.shape)
    ax.contourf(xx, yy, Z, cmap=cm, alpha=.6)

    # 绘制训练集和测试集
    ax.scatter(X_train['X'], X_train['Y'], c=y_train, cmap=cm_color)
    ax.scatter(X_test['X'], X_test['Y'], c=y_test,
               cmap=cm_color, edgecolors='black')

    # 图形样式设定
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xticks(())
    ax.set_yticks(())
    ax.set_title('%s | %.2f' % (name, score))
    i += 1

按照上面的步骤执行,你就能看到如下图所示的对比图了。

上面将决策边界绘制出来,并用等高线图显示。其中,颜色越深表示偏向于黄色散点分类的概率越高,而颜色越浅,则表示偏向红色散点的概率越高。

为了进一步探索各分类器对于不同特征分布的数据集的适用情况。接下来,我们将原有数据集做一些变换。

在前几节的课程中,我们都知道了 sklearn.datasets 这个模块可以导入一些预设的数据集。其实,不仅如此,这个模块开提供了一些数据集的生成方法。比如:

  • sklearn.datasets.make_circles 方法可以生成大圆环包小圆环样式的数据集。
  • sklearn.datasets.make_moons 方法可以生成两个交织间隔圆环样式的数据集。
from sklearn import datasets

# 生成 200 个包含噪声的环状样本
circles = datasets.make_circles(n_samples=200, noise=.1)
plt.scatter(circles[0][:, 0], circles[0][:, 1], c=circles[1])

​  

# 生成 300 个包含噪声的月牙状样本
moons = datasets.make_moons(n_samples=300, noise=.2, random_state=1)
plt.scatter(moons[0][:, 0], moons[0][:, 1], c=moons[1])

​  

这两组数据都是无法进行线性分类,所以如果是非线性分类器,其结果应该会好很多。

# 对月牙状样本进行分割测试
X_train, X_test, y_train, y_test = train_test_split(
    moons[0], moons[1], test_size=0.3)

for name, model in zip(classifier_Names, models):
    model.fit(X_train, y_train)  # 训练模型
    pre_labels = model.predict(X_test)  # 模型预测
    score = accuracy_score(y_test, pre_labels)  # 计算预测准确度
    print('%s: %.2f' % (name, score))  # 输出模型准确度

输出结果: 

 小练习

自己尝试通过 sklearn.datasets.make_multilabel_classification方法生成一个多类别的数据集,并通过常见的非线性分类器完成分类。

3、实验总结

本次实验对比了 scikit-learn 中常见的监督学习方法,我们可以看出不同方法之间差别。另外,对于不同空间分布的数据集,模型的适用性也不一样。大多数非线性分类模型的表现和适用性都较好。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言:指针【进阶】习题练习及分析讲解

目录 一维数组关于strlen函数和sizeof()的练习整型数组字符数组指针 二维数组笔试题 前言: 前面我们刚刚学完了C语言:指针详解【进阶】的知识,这部分的知识还是要重在理解加实践,今天我这里就分享一些有关C语言指针方面的练习供大…

优雅编程,从空格、空行、缩进和注释开始

很多初学者的代码其实都不够“漂亮”,那是因为没有养成好的编码习惯。本篇博客以C语言为例,总结一些好习惯。其实,很多习惯都是肌肉记忆,举个例子:请你写一个程序,输入2个整数并输出它们的和。有些朋友可能…

使用eclipse创建一个图书管理系统(1)-----搭建架构

目录 思维导图: 图书管理系统的创建: 第一步:搭建框架-------使用者 第二步:搭建框架------被使用者 第三步:操作方法 第四步:main函数 思维导图: 前言: 昨天学了一下使用Java…

演出剧院门票售票预约小程序开发制作功能介绍

基于微信小程序的票务预约小程序,广泛适用于演出主办方、剧院、艺术中心、活动中心售票、景区门票售票、儿童游乐园售票、会务签到、展会售票签到、教育培训报名预约、健身预约功能。 多场景售票支持: 售票软件支持多种场景的售票,支持选座、…

python3+Scrapy:爬虫框架问题合集 【参考转载大佬文章 + 自己解决方法】

1、发送请求403报错排查 参考链接链接: 使用scrapy做爬虫遇到的一些坑:爬虫使用scrapy爬取网页返回403错误大全以及解决方案 参考链接链接: 使用scrapy做爬虫遇到的一些坑:网站常用的反爬虫策略,如何机智的躲过反爬虫Crawled (403) 参考链接…

javaEE 初阶 — Cookie 与 Session

文章目录 Cookie 的四个问题Cookie 的典型应用Cookie 与 Session 的区别代码示例体现两者的关联关系1. 设计思路2. 编写前端登录页面3 编写 LoginServlet 处理登录请求3.1 服务器是如何组织会话的 4. 编写 IndexServlet 生成主页4.1 抓包观察交互过程 Cookie 的四个问题 1、Coo…

Doris(25):Doris的函数—Bitmap函数

1 BITMAP_AND(BITMAP lhs, BITMAP rhs) 计算两个输入bitmap的交集,返回新的bitmap. select bitmap_count(bitmap_and(to_bitmap(1), to_bitmap(2))) cnt; select bitmap_count(bitmap_and(to_bitmap(1), to_bitmap(1))) cnt; 2 BITMAP_CONTAINS(BITMAP bitmap, BIGINT input…

VGAM | tobit模型

专注系列化、高质量的R语言教程 推文索引 | 联系小编 | 付费合集 本篇来介绍tobit模型,使用的工具包是VGAM。 library(VGAM) 目录如下: 1 Tobit分布2 tobit模型3 运行模型 例1例2例34 其他 1 Tobit分布 tobit模型主要应用于因变量存在删失的情况。以正态…

交换机-Exchanges

交换机 Exchanges 概念 RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。相反,生产者只能将消息发送到交换机(exchange),交换机工作的内容非常简…

Threejs进阶之十:让模型移动到鼠标点击的指定位置

上一节中我们实现了物体沿指定轨迹移动的动画效果,这一节我们来实现让模型移动到鼠标点击的制定位置的动画效果。 先看下实现后的最终效果 要实现上面的动画效果,我们需要通过以下步骤来实现 第一步,监听鼠标事件 我们需要监听鼠标的点击事…

2 ROS2话题通讯基础(2)

ROS2话题通讯基础 2.5 自定义话题通讯2.5.1 自定义话题通讯的一般流程2.5.2 创建自定义话题消息简单例子2.5.3 快速创建C/C和Python自定义话题通讯的Student.msg 2.6 使用C/C实现自定义话题通讯2.6.1 创建C/C自定义话题发布方功能包并编写节点文件2.6.2 配置C/C自定义话题发布方…

如何选择适合企业的网盘?必须要考虑这几个方面

随着云存储技术的发展,传统的文件存储服务已逐渐不能满足企业日益增长的文件应用、共享和存储需求。越来越多的企业开始将目光转移到企业网盘上。 在选择企业网盘工具时,比较重要的有两个方面,一个是数据的安全性,一个是协同办公。…

Java 将增加虚拟线程,挑战 Go 协程

Java19 正式发布,带来了一个 Java 开发者垂涎已久的新特性 —— 虚拟线程。在 Java 有这个新特性之前,Go 语言的协程风靡已久,在并发编程领域可以说是叱咤风云。随着国内 Go 语言的快速发展与推广,协程好像成为了一个世界上最好语…

K8S二进制单节点 一键部署K8S_V1.21.x

1、安装前注意事项 安装shell脚本在文章最后位置 1、提前配置静态IP 把脚本的IP 192.168.1.31 换成你的IP 2、创建安装包路径 /home/software/shell 所有的tar包 shell脚本 放在这里 3、免密登录配置所有节点 提前下载镜像如下: [rootmaster01 ~]# docker image…

Ubuntu搜狗输入法安装指南

Ubuntu搜狗输入法安装指南 Ubuntu搜狗输入法安装指南搜狗输入法已支持Ubuntu1604、1804、1910、2004、2010Ubuntu20.04及以上安装搜狗输入法步骤 Ubuntu搜狗输入法安装指南 下载地址:https://shurufa.sogou.com/ 计算为amd64的选择x86_64,以下教程来源…

ORBBEC(奥比中光)AstraPro相机在ROS2下的标定与D2C(配准与对齐)

文章目录 1.rgb、depth相机标定矫正1.1.标定rgb相机1.2.标定depth相机1.3.rgb、depth相机一起标定(效果重复了)1.4.取得标定结果1.4.1.得到的标定结果的意义:1.5.IR、RGB相机分别应用标定结果1.5.1.openCV应用标定结果1.5.2.ros2工程应用标定…

[stable-diffusion-art] 指北-2 如何为sd提出好的prompt

https://stable-diffusion-art.com/how-to-come-up-with-good-prompts-for-ai-image-generation/https://stable-diffusion-art.com/how-to-come-up-with-good-prompts-for-ai-image-generation/1.prompt可以促使模型生成以前不存在的高质量的图片,例如:…

windows如何使用脚本打开多个软件

文章目录 windows如何使用脚本打开多个软件问题缘由省流版本制作脚本步骤新建文本找到文件的安装位置方法一:方法二: 总结 windows如何使用脚本打开多个软件 问题缘由 因为强迫症,不想让软件自启,会导致开机变慢,电脑…

Lecture7 处理多维特征的输入(Multiple Dimension Input)

以实际代码出发,逐行讲解。 完整代码: import numpy as np import torch import matplotlib.pyplot as plt# load data xy np.loadtxt(C:\\Users\\14185\\Desktop\\diabetes.csv, delimiter,, dtypenp.float32) x_data torch.from_numpy(xy[:, :-1])…

226. 翻转二叉树【58】

难度等级:容易 上一篇算法: 543. 二叉树的直径【71】 力扣此题地址: 226. 翻转二叉树 - 力扣(Leetcode) 1.题目:226. 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返…