中山自助建站系统,手机app制作多少钱,wordpress设置仅对会员可见,东营建设网国科大2023模式识别与机器学习实践作业
作业内容
从四类方法中选三类方法#xff0c;从选定的每类方法中 #xff0c;各选一种具体的方法#xff0c;从给定的数据集中选一 个数据集#xff08;MNIST#xff0c;CIFAR-10#xff0c;电信用户流失数据集 #xff09;对这…国科大2023模式识别与机器学习实践作业
作业内容
从四类方法中选三类方法从选定的每类方法中 各选一种具体的方法从给定的数据集中选一 个数据集MNISTCIFAR-10电信用户流失数据集 对这三种方法进行测试比较。
第一类方法: 线性方法线性SVM、 Logistic Regression第二类方法: 非线性方法Kernel SVM 决策树第三类方法: 集成学习Bagging Boosting第四类方法: 神经元网络自选结构
选择数据集
MNIST
方法
线性SVM
方法介绍
支持向量机SVM是一种二分类模型它的基本模型是定义在特征空间上的间隔最大的线性分类器。SVM的的学习策略就是间隔最大化可形式化为一个求解凸二次规划的问题或者求解其对偶问题。 SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。如上图所示 w ⋅ x b 0 w \cdot xb0 w⋅xb0即为分离超平面对于线性可分的数据集来说这样的超平面有无穷多个即感知机但是几何间隔最大的分离超平面却是唯一的。
实验结果
对于每一个参数设置做了三次实验得到的模型准确率分别是ACC_1ACC_2ACC_3平均值是ACC_M。
正则参数是正则项前面的系数。
正则参数迭代次数ACC_1ACC_2ACC_3ACC_m10100086.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_1ACC_2ACC_3平均值是ACC_M。
分割类型损失函数ACC_1ACC_2ACC_3ACC_Mbestgini87.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等。简单来说池化就是在该区域上指定一个值来代表整个区域。激活函数激活函数非线性激活函数如果激活函数使用线性函数的话那么它的输出还是一个线性函数。但使用非线性激活函数可以得到非线性的输出值。全连接层在全连接层中每个神经元都与前一层中的所有神经元相连因此它的输入是一个向量输出也是一个向量。它对提取的特征进行非线性组合以得到输出。全连接层本身不具有特征提取能力而是使得目标特征图失去空间拓扑结构被展开为向量。
实验结果
迭代次数为epoch10使用带动量的随机梯度下降SGD进行优化损失函数是交叉熵损失。
使用的卷积神经网络含有两层含有卷积层池化层ReLU激活函数和批归一化层和一个全连接层输出的特征维度为10因为MINIST只有10类。
批处理大小学习率ACC640.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_dataif __name__ __main__:minist_path ./datasets/mnist-original.matmethod_type linear_svmX_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_size10000, random_state42)print(fTrain data size:{X_train.shape})print(fTest 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_iter2000)l_svm.fit(X_train, Y_train)print(Training over!)print(The function is:)print(fw:{l_svm.coef_})print(fb:{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(C100, max_iter1000)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_channels1, out_channels10, kernel_size5),nn.MaxPool2d(kernel_size2),nn.ReLU(True),nn.BatchNorm2d(10),)self.block2 nn.Sequential(nn.Conv2d(in_channels10, out_channels20, kernel_size5),nn.MaxPool2d(kernel_size2),nn.ReLU(True),nn.BatchNorm2d(20),)# 输出10个类别self.fc nn.Sequential(nn.Flatten(),nn.Linear(in_features320, out_features10))def forward(self, x):# x: B C10 H12 W12x self.block1(x)x self.block2(x)x self.fc(x)return xdef construct_data_loader(batch_size):# 数据的归一化transform transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])# 训练集train_dataset datasets.MNIST(root./datasets, trainTrue, transformtransform, downloadTrue)train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue)# 测试集test_dataset datasets.MNIST(root./datasets, trainFalse, transformtransform, downloadTrue)test_loader DataLoader(test_dataset, batch_sizebatch_size, shuffleFalse)return train_loader, test_loaderdef train_model(train_loader):for (images, target) in train_loader:# images shape: B C1 H Woutputs model(images)loss criterion(outputs, target)optimizer.zero_grad()loss.backward()optimizer.step()def test_model(test_loader):correct, total 0, 0with torch.no_grad():for (images, target) in test_loader:outputs model(images)_, predicted torch.max(outputs.data, dim1)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(), lrlr, momentummomentum)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博客