(新手向)在matlab中运用SMOTE和前馈神经网络对wilt(枯萎)数据集进行机器学习

2023-10-28

一.概述

近日,有位同学因为搞不懂matlab中的神经网络来问我怎么做,我说你把数据集发来给我看看,我稍微一看好像没啥毛病,他跟我说是UCI上面找的一个wilt数据集,而且已经划分好了训练集和测试集,我粗粗一看没啥毛病就把它直接放进了matlab的神经网络工具箱中进行训练,没想到训练出来的网络在测试集上表现如此糟糕,全都分类成了正常,此时再回去看数据集发现原来这涉及到了机器学习中的类不平衡问题,于是采用了SMOTE(过采样)方法先对少数类进行扩充,扩充成了原来的4倍,再进行训练,此时的表现已经好了很多,在测试集上达到了88%的准确率。要知道提供该数据集的论文运用了SMOTE+SVM,可惜在测试集上的准确率才70%多,可见科技发展是迅速的。
此处matlab版本为 R2018a。

二.数据集描述

数据集来源:https://archive.ics.uci.edu/ml/datasets/Wilt
这个数据集通俗的说是遥感领域对树进行拍照,然后把照片中的像素多少和生病的树这二者结合做成了这个数据集,通过5项属性来预测树是否枯萎(生病)。实际上就是个2分类问题。下载该数据集后得到了一个training.csv和testing.csv文件,让我们先来看看里面具体长啥样。首先是training.csv文件。
training
左边第一列是分类,类有2类,w类(枯萎)和n(正常)类,作为我们的输出变量,右边5列5个属性,也就是我们需要的输入变量。
traing2
这里我们可以很明显的看到只有74个样本属于w类,剩下还有4264个样本均属于n类,这里出现了类别不平衡问题,w类的样本太少,提供的信息也太少,模型得不到足够的信息就会把少数类给忽视,这显然不是我们想看到的。

对于测试集的信息此处省略。总共500个样本,其中313个属于n类,187个属于w类。与训练集不同的地方在于它的排序是乱的,需要自己处理,不像训练集给你按class排好了。

三.方法

数据预处理

拿到数据集第一步,不是急急忙忙去套模型,是先分析数据特征,不然就会犯和我一样的错,前文中也提到了,这个数据集最特殊的就是类别不平衡问题,这个用SMOTE解决,在接下来的部分中详细阐述。这里对数据并不进行归一化,原文献提供的数据集已经经过了一定的处理,且归一化后实际效果要比归一前差很多。

SMOTE算法

http://freesourcecode.net/matlabprojects/64007/smote-(synthetic-minority-over-sampling-technique)-in-matlab#.XLfieKR5uUl
这个链接提供了简单易行的smote算法,把它下载下来后得到两个主要函数SMOTE.m和nearestneighbour.m。把它放进你的工程目录。smote算法简单来说就是对少数样本进行插值生成,而这其中涉及到一个k值(近邻大小),该k值在SMOTE.m中通过函数nearestneighbour.m自动选择,默认将样本放大4倍。

我们在这里先打开training.csv,为了方便matlab处理,我们先在excel中多加一个label列,1表示生病,0表示正常。
插入
接下来让我们把前74个样本提取出另保存至一个excel表格。在matlab中选择上方的“导入数据”按钮,可得到以下界面:
在这里插入图片描述
选中数值矩阵,选中5列属性,变量名称命名x_train,点击导入。
在这里插入图片描述同理选择数值矩阵输出,导入label列,命名为y_train。
把matlab的工作空间切换到你的工程目录下(放有smote函数的地方)
接下来只要在命令行窗口中输入以下代码

// SMOTE算法扩展样本
[feature,label]= SMOTE (x_train,y_train);

原来的74个样本就变成了296个样本!

把这些新样本复制进训练集的excel中,总共得到4581个训练样本。同理再进行导入,得到以下初始化的工作区:
工作区
干干净净,有没有,保存工作区为wilt.mat文件,到此我们的数据处理就结束了,接下来就可以建立模型了。

Feed-forward网络

这是我建立该网络并测试用的wilt.m,代码如下:

clear;
clc;
load wilt.mat;      %装入事先处理好的wilt数据集
inputnum = 5;       %第一层输入神经元为5
hiddennum = 8;      %第二层隐含神经元为8
outputnum = 1;      %第三层输出神经元为1
x_train = x_train'; %输入为500x5 转置为5x500 以下类似
x_test = x_test';
y_train = y_train';
y_test = y_test';
net = newff(minmax(x_train),[inputnum,hiddennum,outputnum],...
    {'tansig','logsig','purelin'},'trainlm');  %创建feed-forward神经网络
view(net)                     %输出网络图
net.trainParam.epochs = 5000; %设定最大迭代次数
net.trainParam.goal = 0.0000000001; %设定学习目标(最小误差)
[net,tr]=train(net,x_train,y_train);%拟合训练集
outputs = net(x_test);        %输出测试集结果
perf = perform(net,outputs,y_test);  %比较预测和测试集表现
final = round(outputs);      %对测试集结果取整
final = final';             %转置
y_test = y_test';           %转置
k = 0;                      %k为预测(final)和测试集(y_test)相同样本个数
for i = 1:500               %循环 相同则k加一
    if final(i,1) == y_test(i,1)
        k = k+1;
    end
end 
fprintf('算法准确率为: %2.2f%%\n', mean(double(k/500)) * 100) %打印算法准确率

这其中要说明的是此处建立了三层神经网络,结果可以在下面看,隐含层神经元选取了8个,网上有不少公式计算选取神经元,但还是自己试试比较好,调参还是要看实际情况的,跑出来结果好,这个参数就好。传递函数的选取也是一样的道理。至于为什么要转置,是因为matlab的神经网络默认是按列选取,当然也可以按行,此处习惯按列了。

还有一个比较重要的点是,一定要用训练集去拟合模型,测试集去测试,不能再用训练集去测试,这反映不出模型对新数据的预测能力,同时还有可能反映不出对原有训练集过度拟合的现象。

四.结果

网络
这个图就是神经网络的预设图,三层,输入层5个神经元,隐含层8个神经元,输出层1个神经元。
在这里插入图片描述
运行时会跳出神经网络工具箱,Epoch为迭代次数,PERFORMANCE为误差表现。

在这里插入图片描述
差不多在1000次迭代之后误差就很难继续缩小了,拟合已经完毕,这个时候已经可以按stop停止训练了。

在这里插入图片描述
这是最后得到的准确率,500个测试样本中测试成功的样本有441个,对于这个数据集来说效果还是可以的。
在这里插入图片描述
这是我最后输出的工作区,其中5449个训练样本是我再一次运用SMOTE算法之后得到的训练总样本数,此时已经有1000多个w类样本,可惜如同我预测的一样,再进行新样本的生成已经不能使模型获得更新的信息,模型拟合已然到达极限。

后记(2021年5月)

现在回过头来看这个提供的SMOTE算法,其实最大的问题就是没有提供修改抽样比例的接口,我也不建议大家在源代码上修改,如果还要解决这种不平衡问题请使用python的imblearn库里预设的各类SMOTE算法,支持直接修改抽样比例,适用性也更加广泛。
另外,虽然这种方法能使你的测试集上的表现提高,但并不意味着你在新的数据集上的表现良好!!!!!!
这种方法很容易产生过拟合问题,泛化能力不行,写论文展现一下技巧可以,投入实际解决问题还请慎重。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(新手向)在matlab中运用SMOTE和前馈神经网络对wilt(枯萎)数据集进行机器学习 的相关文章

  • 在matlab中融合2个以上的图像

    在 MATLAB 中 如何融合两个以上的图像 例如 我想要做什么imfuse但对于超过 2 个图像 使用两张图像 这是我的代码 A imread file1 jpg B imread file2 jpg C imfuse A B blend
  • Matlab的uicontrol在Octave中的实现?

    我正在尝试在 Octave 中运行我们实验室中使用的图形程序的 m Matlab 代码 Octave 告诉我代码中使用的函数 uicontrol 没有定义 经过一番搜索 我发现 JHandles 包有一个 uicontrol GUI 功能的
  • Matlab 错误:()-索引必须出现在索引表达式的最后

    我有这段代码 想要在制表符分隔的 txt 文件中写入一个数组 fid fopen oo txt wt for x 1 length s fprintf fid s t n s x 1 end fclose fid 但我收到此错误 Error
  • 如何从一个清晰的例子计算二维图像中的吉布斯能量

    我有一个关于矩阵的有趣问题 在吉布斯分布中 吉布斯能量U x 可以计算为 这是所有可能的派系 C 上的派系势 Vc x 的总和 右图 团 c 被定义为 S 中站点的子集 x 蓝色像素的邻域是左图中黄色像素的邻居 其中每对不同的站点都是邻居
  • MATLAB 中的内存映射文件?

    我决定使用 memmapfile 因为我的数据 通常为 30Gb 到 60Gb 太大 无法放入计算机内存中 我的数据文件由两列数据组成 对应于两个传感器的输出 并且它们采用 bin 和 txt 格式 m memmapfile G E Str
  • 在 Matlab 中将绘图从高斯混合变换为均匀分布

    考虑以下抽签2x1Matlab 中的向量 其概率分布是两个高斯分量的混合 P 10 3 number draws v 1 First component mu a 0 0 5 sigma a v 0 0 v Second component
  • 如何使用神经网络保存 Sift 特征向量进行分类

    SIFT 特征的 Matlab 实现发现于http www cs ubc ca lowe keypoints http www cs ubc ca lowe keypoints 在 stackoverflow 的帮助下 我想将功能保存到 m
  • 如何在 MATLAB 的 for 循环中读取多个图像?

    我已将结果分段放在一个文件夹中 这些需要在 for 循环中读取并在循环中进一步处理 我尝试阅读如下 for i 1 10 file name dir strcat C Users adminp Desktop dinosaurs im im
  • 如何将条形图的 XtickLabels 向左移动?

    我目前正在尝试创建频率直方图 为此 我必须创建一个条形图 条形图之间没有空格 然而 这集中于XTickLabels在酒吧的中间 由于它是一个直方图 我希望数值位于每个条形之间的线上 以便它可以直观地指示间隔 本质上 我需要将所有刻度标签移至
  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • 如何在Matlab中自定义轮廓线?

    我正在准备一个等高线图 我应该在其中突出显示特定级别的等高线 例如 我的轮廓线值位于 1 和 1 之间 我想突出显示与值 0 相对应的线 我尝试使用以下过程来执行此操作 M c contourf longitude latitude del
  • 如何让MCR启动时间快

    我将 matlab 程序转换为 net 程序集 即 dll 文件 我制作了一个控制台 C 应用程序 添加了 dll 文件并从 php 调用它 每次调用 exe 时都会调用 MCR 如何使 MCR 在服务器启动时初始化 并且即使在一段时间后调
  • 在 MATLAB 中使用 FFT 的频率响应

    这是场景 使用频谱分析仪 我有输入值和输出值 样本数是32000采样率为2000样本 秒 输入是正弦波50 hz 输入为电流 输出为压力 单位 psi 我如何使用 MATLAB 根据这些数据计算频率响应 使用 MATLAB 中的 FFT 函
  • 扩展 MATLAB 函数名称的最大长度

    我编写了一个 MATLAB 程序 可以动态创建自定义 MATLAB 函数 并使用以下命令在其他 MATLAB 实例中启动它们unix命令 我使用这个程序来自动化 fMRI 神经影像分析 使用 SPM8 for MATLAB 一切正常 但是
  • Matlab - 如果值包含xxx,则删除元胞数组中的行

    在 Matlab 中 如何删除包含变量字符串的元胞数组中的元胞 假设我的元胞数组是 C svnTrunk RadarLib radarlb utilities scatteredInterpolant m C svnTrunk RadarL
  • 如何在 Matlab 中使用谷歌翻译?

    我正在编写一个程序 使用 Matlab 列出电影字幕文件中的所有唯一单词 现在我有一个独特的单词列表 我想将其翻译成我的语言并在观看电影之前了解其含义 有谁知道如何在 Matlab 中使用 Google Translate 以便完成我的脚本
  • Simulink 仿真引擎如何工作?

    我想了解 Simulink 仿真引擎的工作原理 它是否使用离散事件模拟机制 那么如何处理连续时间 它是否依赖于基于静态循环的代码生成 或者 在第一个周期之前 它会计算出块的执行顺序 从不需要任何其他块输入的块开始 每个周期 它都会根据输入和
  • 如何在没有安装Visual Studio的另一台机器上使用Visual Studio生成的dll?

    我已经在 Visual Studio 2012 中生成了动态库 我想在另一台机器上使用该库 但我不想在远程机器上安装 Visual Studio 我有 mex 库和 dll 我想运行一个使用这两个库的脚本 当我运行脚本时 出现以下错误 缺少
  • MATLAB 教程中的 SIFT 实现

    我正在寻找 MATLAB 中的一些基本 SIFT 实现 我需要从第一原则来写它 另外 我正在寻找一些可以解释程序中发生的事情的内容 Vedali 的代码和 David Lowe 的代码超出了我的理解范围 如果您是 Matlab 用户 您一定
  • 如何在 Matlab 中将数组打印到 .txt 文件?

    我才刚刚开始学习Matlab 所以这个问题可能非常基本 我有一个变量 a 2 3 3 422 6 121 9 4 55 我希望将值输出到 txt 文件 如下所示 2 3 3 422 6 121 9 4 55 我怎样才能做到这一点 fid f

随机推荐

  • Vivado将.v文件作为模块加入Block Design

    用Vivado开发ZYNQ时 常用到Block Design Block Design中不仅仅可以添加IP核 还可以将未封装成IP的 v或 vhd文件作为模块加入其中 我们以往Block Design中加一个闪灯的模块为例 说明如何向Blo
  • python Scrapy的spider中回调函数的多个参数传递方法

    https blog csdn net Homewm article details 83054326
  • elasticsearch的入门使用01

    目录 一 索引库操作 1 mapping映射属性 2 索引库的CRUD 2 1 创建索引库和映射 2 2 查询索引库 2 3 修改索引库 2 4 删除索引库 二 文档操作 1 新增文档 2 查询文档 3 删除文档 4 修改文档 4 1 全量
  • 微信小程序组建监听observers

    一 作用 用于监听和响应任何属性和数据字段的变化 二 限制 1 小程序基础库2 6 1开始支持 2 只能在自定义组建中使用 再页面中无法使用 三 使用 1 自定义组件的properties中的数据属性 Component 组件的属性列表 d
  • vue中使用element-ui表格table组件错行出现场景和解决方案

    在项目开发中表格错行的问题经常出现 现在整理如下 希望共同学习进步 1 element ui表格table表格内容错行 1 情况一 表格中有el tooltip时候 数据过长的时候hover 往上滑动会出现错行 解决方案 固定高度或者给出
  • 二叉树实验报告

    实验报告 实验题目 二叉树 实验目的 1 熟悉二叉树的结点类型和二叉树的基本操作 2 掌握二叉树的前序 中序和后序遍历的算法 3 加深对二叉树的理解 逐步培养解决实际问题的编程能力 基本要求 1 编写程序bitree cpp实现ADTBiT
  • java 基础重学(三)-源码阅读

    1 String 1 String定义为 final 这说明String不可继承 再看下面 String类的主力成员字段value是个char 数组 而且是用final修饰的 final修饰的字段创建以后就不可改变 是线程安全的 publi
  • python爬取软件内数据_各种数据爬取工具爬虫合集整理

    却道天凉好个秋 不用编程敲代码的爬取数据的工具合集 简单上手易用的爬虫脚本工具软件汇总 1 工具软件类 Microsoft Excel excel也可以爬一些规整的表格数据等 没想到吧 八爪鱼 一款可视化免编程的网页采集软件 可以从不同网站
  • osgexp安装与使用

    osg系列文章目录 文章目录 osg系列文章目录 前言 一 下载osgexp和3d max 二 osgexp安装 三 编译OSGExp 参考 前言 3ds max文件导出osg或者ive格式 一 下载osgexp和3d max 1 首先下载
  • 列举ADO.NET在操作数据库时,常用的对象及作用。

    connection 连接对象 用于对数据库的连接操作 参数是连接字符串 command 命令对象 用于执行对数据库的操作 参数是连接字符串或存储过程 也必须传入连接对象实例 SqlDataReader 数据读取对象 用于读取操作 Read
  • 【BP时序预测】基于BP神经网络的时间序列预测附matlab完整代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 基于BP神经网络的时间序列预测是一种常用的预测方法 它可以通过训练神经网络模型来学习
  • Ubuntu 18.04安装RTX2080Ti显卡驱动

    Ubuntu 18 04 2080Ti安装显卡驱动 PPA仓库安装 网上的方法太多了 尝试了几种各种失败 这里记录一种本人电脑有效的方法 有的电脑需要先卸载Ubuntu 自带的驱动 sudo add apt repository ppa g
  • unity 获取鼠标停留处UI

    修改新华社项目 需要为鼠标停留加个标示 暂定为旋转UI 的fillAmount 期间需要获得UI名字 因为名字太多了 个别环影响 所以找到了这个工具方法
  • 如何在你的windows系统电脑里面设置个人私密空间

    1 前几天我在网上搜了一下windows系统的垃圾清理软件看看哪个好用 2 诶 还别说 还真的找到了一个好用的 他就是 完美卸载 最麻烦就是这些杀毒 清理类的软件 所以我下载了个不需要安装的绿色版 3 我要介绍的就是里面的 数据保险箱 界面
  • 利用SCCM进行横向移动

    01SCCM介绍 SCCM全名为System Center Configuration Manager 从版本1910开始 微软官方将其从Microsoft System Center产品移除 重新命名为Microsoft Endpoint
  • 9种基本数据类型

    9种基本数据类型以及封装类 基本类型 大小 默认值 封装类 byte 1 byte 0 Byte short 2 short 0 Short int 4 0 Int Long 8 0L Long float 4 0 0f Float dou
  • 跳过交货单ATP CHECK的方法

    物料启用ATP CHECK会影响到交货 对于那些启用了ATP CHECK而又没有做合理规划的系统 想要搞清楚ATP是如何计算的 我只能说呵呵 你会发现批次拆分 过账的BAPI会有莫名其妙的 报错 搞不清楚库存里明明有东西为什么还不让交货 这
  • 【深度学习】数据集打标签:生成train.txt和val.txt

    当我们在Github上下载一篇论文的代码后 我们如何在自己的数据集上进行复现呢 准备自己的数据集 这是在百度爬的十分类的服装数据集 其中train文件夹下每类大概300张 val文件夹下每类大概100张 总共在4000张左右 设置目录 我们
  • mysql二进制文件下载教程_mysql 二进制文件增量备份

    1 首先在my cnf下添加二进制文件路径 windows下文件名称为my ini 在 mysqld 下添加 log bin mysql bin 2 centos下默认安装mysql 5 6 数据默认文件夹下为 var lib mysql
  • (新手向)在matlab中运用SMOTE和前馈神经网络对wilt(枯萎)数据集进行机器学习

    目录 一 概述 二 数据集描述 三 方法 数据预处理 SMOTE算法 Feed forward网络 四 结果 后记 2021年5月 一 概述 近日 有位同学因为搞不懂matlab中的神经网络来问我怎么做 我说你把数据集发来给我看看 我稍微一