【课程作业_01】国科大2023模式识别与机器学习实践作业

国科大2023模式识别与机器学习实践作业

作业内容

从四类方法中选三类方法,从选定的每类方法中
,各选一种具体的方法,从给定的数据集中选一
个数据集(MNIST,CIFAR-10,电信用户流失数据集 )对这三种方法进行测试比较。

  • 第一类方法:: 线性方法:线性SVM、 Logistic Regression
  • 第二类方法: 非线性方法:Kernel SVM, 决策树
  • 第三类方法: 集成学习:Bagging, Boosting
  • 第四类方法: 神经元网络:自选结构

选择数据集

  • MNIST

方法

线性SVM

方法介绍

支持向量机(SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,或者求解其对偶问题。

img

SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。如上图所示, w ⋅ x + b = 0 w \cdot x+b=0 wx+b=0即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。

实验结果

对于每一个参数设置,做了三次实验,得到的模型准确率分别是ACC_1,ACC_2,ACC_3,平均值是ACC_M。

正则参数是正则项前面的系数。

正则参数迭代次数ACC_1ACC_2ACC_3ACC_m
10100086.37%87.57%87.15%87.03%
10200086.9%88.45%86.4%87.25%
50100087.61%86.17%87.77%87.18%
50200086.97%88.02%88.1%87.7%
100100085.67%86.99%86.58%86.41%
100200086.94%86.29%86.84%86.69%
结果分析

从结果可以看出,迭代次数一定时,一定范围内,随着正则参数的增大,模型预测的准确率会上升,但是超过一定范围,模型性能会下降,可能是正则参数过大导致模型欠拟合了。

当正则参数一定时,随着迭代次数的增大,模型的性能会逐渐变好。

决策树

方法介绍

决策树是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。具体来说,它是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果,本质是一颗由多个判断节点组成的树。

构建决策树的基本步骤为:

  • 开始将所有记录看作一个节点
  • 遍历每个变量的每一种分割方式,找到最好的分割点
  • 分割成两个节点N1和N2
  • 对N1和N2分别继续执行2-3步,直到每个节点不能再分。
实验结果

对于每一个参数设置,做了三次实验,得到的模型准确率分别是ACC_1,ACC_2,ACC_3,平均值是ACC_M。

分割类型损失函数ACC_1ACC_2ACC_3ACC_M
bestgini87.61%87.87%88.03%87.84%
bestentropy88.54%88.40%88.38%88.44%
bestlog_loss88.62%88.34%88.42%88.46%
randomgini86.61%87.09%87.01%86.90%
randomentropy87.55%87.82%88.20%87.86%
randomlog_loss87.87%87.79%88.09%87.92%
结果分析

从结果可以看出,当对节点分割时,选取最好的进行分割比随机分割的性能要好,因为可以获得的信息增益最好,而随机选取没有保障。

使用entropy和log_loss的性能比gini要好,而gini代表基尼系数,entropy代表信息增益,因此选择跟信息增益有关的损失更能提高决策树的性能。

神经元网络,使用简单的卷积神经网络

方法介绍

卷积神经网络(CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。

卷积神经网络的基本结构由以下几个部分组成:输入层(input layer),卷积层(convolution layer),池化层(pooling layer),激活函数层和全连接层(full-connection layer)。

  • 卷积层:对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的卷积操作
  • 池化层:池化操作将输入矩阵某一位置相邻区域的总体统计特征作为该位置的输出,主要有平均池化(Average Pooling)、最大池化(Max Pooling)等。简单来说池化就是在该区域上指定一个值来代表整个区域。
  • 激活函数:激活函数(非线性激活函数,如果激活函数使用线性函数的话,那么它的输出还是一个线性函数。)但使用非线性激活函数可以得到非线性的输出值。
  • 全连接层:在全连接层中,每个神经元都与前一层中的所有神经元相连,因此它的输入是一个向量,输出也是一个向量。它对提取的特征进行非线性组合以得到输出。全连接层本身不具有特征提取能力,而是使得目标特征图失去空间拓扑结构,被展开为向量。
实验结果

迭代次数为epoch=10,使用带动量的随机梯度下降(SGD)进行优化,损失函数是交叉熵损失。

使用的卷积神经网络含有两层(含有卷积层,池化层,ReLU激活函数和批归一化层)和一个全连接层,输出的特征维度为10,因为MINIST只有10类。

批处理大小学习率ACC
640.199.03%
640.0198.95%
640.00198.09%
1280.199.16%
1280.0198.95%
1280.00197.35%
1280.0299.02%
1280.00298.12%
结果分析

从结果可以看出,当批处理大小相同时,学习率为0.1时性能最好,之后随着学习率的减小模型的性能逐渐降低。

当学习率一致时,大多数情况下,批处理大小增加模型的性能也会更好,但有些情况不是,如学习率等于0.001时,此时需要将学习率扩大2倍(跟批处理大小增加的倍数一致),模型的性能才会比之前更好。

代码

线性SVM和决策树

# -*- encoding: utf-8 -*-
"""
File machine_learning_methods.py
Created on 2024/1/20 18:55
Copyright (c) 2024/1/20
@author: 
"""
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from load_minist import load_minist_data

if __name__ == '__main__':
    minist_path = "./datasets/mnist-original.mat"
    method_type = "linear_svm"
    X_data, Y_data = load_minist_data(minist_path)
    # 数据规范化
    scaler = StandardScaler()
    X = scaler.fit_transform(X_data)
    # 分割得到训练和测试数据集
    X_train, X_test, Y_train, Y_test = train_test_split(X_data, Y_data, test_size=10000, random_state=42)
    print(f"Train data size:{X_train.shape}")
    print(f"Test data size:{X_test.shape}")
    if method_type == "linear_svm":
        print("Start training Linear SVM...")
        # 构建linear svm C表示正则项的权重
        l_svm = svm.LinearSVC(C = 10, max_iter=2000)
        l_svm.fit(X_train, Y_train)
        print("Training over!")
        print("The function is:")
        print(f"w:{l_svm.coef_}")
        print(f"b:{l_svm.intercept_}")

        print("Start testing...")
        # 打印模型的精确度
        print(f"{l_svm.score(X_test, Y_test) * 100}%")
    elif method_type == "kernel_svm":
        print("Start training Kernel SVM...")
        # 构建linear svm C表示正则项的权重
        k_svm = svm.SVC(C=100, max_iter=1000)
        k_svm.fit(X_train, Y_train)
        print("Training over!")

        print("Start testing...")
        # 打印模型的精确度
        print(f"{k_svm.score(X_test, Y_test) * 100}%")
    elif method_type == "decision_tree":
        print("Start training Decision Tree...")
        # 构建决策树
        d_tree = DecisionTreeClassifier(criterion = "gini", splitter = "best")
        d_tree.fit(X_train, Y_train)
        print("Training over!")

        print("Start testing...")
        # 打印模型的精确度
        print(f"{d_tree.score(X_test, Y_test) * 100}%")

卷积神经网络

# -*- encoding: utf-8 -*-
"""
File neural_net.py
Created on 2024/1/20 18:55
Copyright (c) 2024/1/20
@author: 
"""
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms

# 设计模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.block1 = nn.Sequential(
            nn.Conv2d(in_channels=1, out_channels=10, kernel_size=5),
            nn.MaxPool2d(kernel_size=2),
            nn.ReLU(True),
            nn.BatchNorm2d(10),
        )
        self.block2 = nn.Sequential(
            nn.Conv2d(in_channels=10, out_channels=20, kernel_size=5),
            nn.MaxPool2d(kernel_size=2),
            nn.ReLU(True),
            nn.BatchNorm2d(20),
        )
        # 输出10个类别
        self.fc = nn.Sequential(
            nn.Flatten(),
            nn.Linear(in_features=320, out_features=10)
        )

    def forward(self, x):
        # x: B C=10 H=12 W=12
        x = self.block1(x)
        x = self.block2(x)
        x = self.fc(x)
        return x

def construct_data_loader(batch_size):
    # 数据的归一化
    transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
    # 训练集
    train_dataset = datasets.MNIST(root='./datasets', train=True, transform=transform, download=True)
    train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
    # 测试集
    test_dataset = datasets.MNIST(root='./datasets', train=False, transform=transform, download=True)
    test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
    return train_loader, test_loader

def train_model(train_loader):
    for (images, target) in train_loader:
        # images shape: B C=1 H W
        outputs = model(images)
        loss = criterion(outputs, target)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

def test_model(test_loader):
    correct, total = 0, 0
    with torch.no_grad():
        for (images, target) in test_loader:
            outputs = model(images)
            _, predicted = torch.max(outputs.data, dim=1)
            total += target.size(0)
            correct += (predicted == target).sum().item()
    print('[%d / %d]: %.2f %% ' % (i + 1, epoch, 100 * correct / total))

if __name__ == '__main__':
    # 定义超参数
    # 批处理大小
    batch_size = 128
    # 学习率
    lr = 0.002
    # 动量
    momentum = 0.5
    # 训练的epoch数
    epoch = 10
    # 构建模型
    model = Net()
    # 损失函数和优化器
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.SGD(model.parameters(), lr=lr, momentum=momentum)
    train_loader, test_loader = construct_data_loader(batch_size)
    for i in range(epoch):
        # 训练
        train_model(train_loader)
        # 测试
        test_model(test_loader)

参考资料

基于决策树模型和支持向量机模型的手写数字识别_手写数字识别决策树-CSDN博客

ResNet18实现——MNIST手写数字识别(突破0.995)_mnist resnet-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP TIME_WAIT 过多怎么处理

文章目录 1.什么是 TCP TIME_WAIT?2.为什么要 TIME_WAIT?3.TIME_WAIT 过多的影响4.解决办法4.1 调整短连接为长连接4.2 调整系统内核参数 5.小结参考文献 1.什么是 TCP TIME_WAIT? TCP 断开连接四次挥手过程中,主动断开连接的一方&#xff…

ctfshow——文件包含

文章目录 web 78——php伪协议第一种方法——php://input第二种方法——data://text/plain第三种方法——远程包含(http://协议) web 78——str_replace过滤字符php第一种方法——远程包含(http://协议)第二种方法——data://&…

游戏被DDOS攻击无法访问时该如何处理

游戏行业随着时代的发展有着突飞猛进的变化,尤其是互联网时代智能手机的普及,让游戏行业发展上了一个新的台阶。因为游戏带来的巨大利润,游戏行业一直是DDoS攻击的首选目标。 DDoS是Distributed Denial of Service的缩写,即分布式…

学习Android的第二天

目录 Android User Interface 用户界面 UI Android View与ViewGroup的概念 Android View android.view.View android.view.View XML 属性 android:id 属性 Android ViewGroup android.view.ViewGroup ViewGroup.LayoutParams ViewGroup.MarginLayoutParams ViewGr…

Redis核心技术与实战【学习笔记】 - 19.Pika:基于SSD实现大容量“Redis”

前言 随着业务数据的增加(比如电商业务中,随着用户规模和商品数量的增加),就需要 Redis 能保存更多的数据。你可能会想到使用 Redis 切片集群,把数据分散保存到不同的实例上。但是这样做的话,如果要保存的…

java社区养老年人服务系统springboot+vue

为了帮助用户更好的了解和理解程序的开发流程与相关内容,本文将通过六个章节进行内容阐述。 第一章:描述了程序的开发背景,程序运用于现实生活的目的与意义,以及程序文档的结构安排信息; 第二章:描述了程序…

uniapp 高德地图显示

1. uniapp 高德地图显示 使用前需到**高德开放平台(https://lbs.amap.com/)**创建应用并申请Key   登录 高德开放平台,进入“控制台”,如果没有注册账号请先根据页面提示注册账号   打开 “应用管理” -> “我的应用”页面…

Leetcode 85. 最大矩形

题目信息 LeetoCode地址: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目理解 该题是84题的升级版。84题给出了一个一维数组,即一行数据,每个元素是高度。而该题则是给出了二维数组,只需我们将每一行的高度…

太强了,AI数字人从制作到变现一次搞定

AI数字人从制作到变现 如果说GPT类大模型是我们人类的第二大脑,数字人就是我们人类在互联网上的第二个身体。随着 AI 的迅速发展,2024 年 AI 模型开始从大型语言模型向大型视觉模型转变。数字人技术作为其分支之一,正日益成为科技、娱乐、教…

【GAMES101】Lecture 14 15 辐射度量学

目录 辐射度量学 Radiant flux(光通量) intensity(发光强度) irradiance radiance 辐射度量学 主要讲述了物理学中的Basic radiometry (辐射度量学),就是我们在之前的计算光照中没有用具体的物理单位去衡量和描述…

C++新特性 协程

本篇文章我们来讲述一下C协程 协程(Coroutine)是一种能够挂起个恢复的函数过程 是一种轻量级的并发编程方式,也称为用户级线程。它与传统的线程(Thread)相比,具有更低的开销和更高的执行效率。 协程通常运…

爬虫学习笔记-scrapy爬取汽车之家

1.终端运行scrapy startproject scrapy_carhome,创建项目 2.接口查找 3.终端cd到spiders,cd scrapy_carhome/scrapy_carhome/spiders,运行 scrapy genspider audi https://car.autohome.com.cn/price/brand-33.html 4.打开audi,编写代码,xpath获取页面车型价格列表 5.运行项目…

深度学习技巧应用35-L1正则化和L2正则在神经网络模型训练中的应用

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用35-L1 正则化和L2正则在神经网络模型训练中的应用。L1正则化和L2正则化是机器学习中常用的两种正则化方法,用于防止模型过拟合并提高模型的泛化能力。这两种正则化方法通过在损失函数中添加惩罚项来控制模型的复杂性。…

面试八股文(4)

文章目录 1.sleep和wait区别2.为什么调用start()方法会执行run()方法,为什么不能直接调用run()方法3.synchronized关键字4.并发编程的三个重要特性5.synchronized和volatile关键字区别6.ThreadLocal7.为什么要用线程池?8.实现Runnable接口和Callable接口…

课时13:变量基础_变量场景

2.1.1 变量场景 学习目标 这一节, 我们从 数据存储、变量场景、小结 三个方面来学习。 数据存储 数据存储 所谓的数据存储,我们从三方面来理解这句话:1、数据保存到哪里 -- 各种媒介,CPU、内存、磁盘、磁带、网盘...2、数据保…

react+ts+antd-mobile 动态tabs➕下拉加载

1.初始化项目 //搭建项目 npm create vitelatest react-jike-mobile -- --template react-ts//安装依赖 npm i //运行 npm run dev清理项目目录结构 安装ant design mobile ant design mobile是ant design家族里专门针对于移动端的组件库 npm install --save antd-mobile测试…

日志报错 git -c dif.mnemonicprefix=false -c core.guotepath=false 解决方法

前言: 在进行下面操作前,必须确保,你是否安装了Git。 查看Git 在命令行窗口中输入`git --version`: 如果这个命令成功显示了Git的版本信息,这表明Git已经被安装。 1. 使用Sourcetree SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端…

C++核心deque容器,stack容器,queue容器,list容器,set容器,pair ,map容器

3.deque容器 1.deque容器的基本概念 Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。 deque容器和vector容器最…

MongoDB索引详情

文章目录 MongoDB索引MongoDB索引数据结构WiredTiger数据文件在磁盘的存储结构 索引的分类索引设计原则索引操作创建索引查看索引删除索引 索引类型单键索引(Single Field Indexes)复合索引(Compound Index)多键索引(M…

学成在线:采用XXL-JOB任务调度方案使用FFmpeg处理视频转码业务

分片技术方案 概述 XXL-JOB并不直接提供数据处理的功能,它只会给所有注册的执行器分配好分片序号,在向执行器下发任务调度的同时携带分片总数和当前分片序号等参数 设计作业分片方案保证多个执行器之间不会查询到重复的任务,保证任务不会重复执行 任…