尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MATLAB读取Excel训练分类模型:从数据导入到评估的完整脚本

MATLAB读取Excel训练分类模型:从数据导入到评估的完整脚本 1. 需求拆解这一小段脚本到底能干什么先说结论这段代码解决的是“表格数据 输入输出建模”这个高频需求。你在桌面放一个data.xlsx第一列到倒数第二列是特征输入最后一列是你要预测的结果输出脚本读进来、自动切分、训练模型、给出评估——一条龙。这种表格布局在真实项目里太常见了无论是做实验记录、设备参数采集、用户行为数据还是课程设计里的鸢尾花分类大多数人最后都会把数据整理成“前面全是条件最后一列是结论”的格式。这个脚本就是专门吃这种格式的。我用鸢尾花数据集做演示每一行是一朵花的四个测量值花萼长宽、花瓣长宽最后一列是品种标签。第一列到第四列是输入第五列是输出。这个数据集在 MATLAB 里可以直接用fisheriris加载但为了演示表格导入流程我故意把它存成了data.xlsx让整个流程更贴近你手头数据的情况。适合谁来参考刚接触 MATLAB 数据处理的学生、需要批量分析实验表格的研究人员、做课程设计想快速出个分类模型的开发者都能从这里拿到能直接跑的模板。不懂机器学习也没关系后面会解释清楚每一步在做什么。2. 为什么推荐这种“数据布局 脚本模板”的组合2.1 表格布局的设计逻辑“前 N 列输入、最后一列输出”这种布局本质上对应的是监督学习的标准输入格式特征矩阵X和标签向量y。代码里只需要一行切分操作X data(:, 1:end-1); % 所有行从第1列到倒数第2列 y data(:, end); % 所有行最后一列这样写的好处是不需要关心具体有多少列。哪怕你的表格从 5 列变成 50 列只要最后一列还是输出这两行代码就不用改。这在写通用工具脚本时非常重要——我见过太多人写死data(:, 1:4)换一份数据就要改代码纯粹给自己找麻烦。2.2 为什么用readmatrix而不是xlsread老版本 MATLAB 里常用xlsread但新版本R2019a 之后官方更推荐readmatrix和readtable。readmatrix直接把 Excel 内容读成纯数值矩阵省去了单元格对象转数组的步骤代码更干净速度还更快。data readmatrix(data.xlsx);当然这里有一个重要前提你的 Excel 表格里不能有文本表头。如果第一行是“花萼长”“品种”这样的文字readmatrix会把这些列全部变成NaN数据就废了。解决方案有两个在 Excel 里删掉表头行让数据从第一行开始。用readmatrix(data.xlsx, NumHeaderLines, 1)跳过一行表头。我在脚本里加了一个可选参数注释实际用的时候可以按需调整。注意如果你的表格里有文本列比如“设备编号”这种字符串readmatrix会直接报错或产生NaN。这种场景要改用readtable读成 table 类型再做文本转数值处理。后面第 5 节我会专门讲这个坑。3. 核心代码逐行解析与完整演示直接打开 MATLAB新建脚本把下面这段贴进去桌面准备好data.xlsx就能跑%% 数据导入与预处理 % 读取桌面上的 data.xlsx确保当前文件夹是桌面或写成绝对路径 data readmatrix(data.xlsx); % 分离输入特征与输出标签 X data(:, 1:end-1); % 输入特征第一列到倒数第二列 y data(:, end); % 输出结果最后一列 % 数据标准化Z-score让特征均值为0、方差为1 mu mean(X); % 每个特征的均值 sigma std(X); % 每个特征的标准差 X_norm (X - mu) ./ sigma; %% 划分训练集与测试集80% / 20% rng(42); % 固定随机种子保证结果可复现 cv cvpartition(size(X, 1), HoldOut, 0.2); idxTrain training(cv); idxTest test(cv); X_train X_norm(idxTrain, :); y_train y(idxTrain); X_test X_norm(idxTest, :); y_test y(idxTest); %% 训练模型以线性判别分析 LDA 为例 mdl fitcdiscr(X_train, y_train); %% 预测与评估 y_pred predict(mdl, X_test); % 计算准确率 acc sum(y_pred y_test) / length(y_test); fprintf(测试集准确率: %.2f%%\n, acc * 100); % 混淆矩阵 confMat confusionmat(y_test, y_pred); disp(混淆矩阵:); disp(confMat); % 可视化取前两个特征画散点图 figure; gscatter(X_test(:,1), X_test(:,2), y_test, rgb, o*); hold on; % 画出预测错误的样本用黑色叉号标出 misIdx find(y_pred ~ y_test); plot(X_test(misIdx,1), X_test(misIdx,2), kx, MarkerSize, 10); legend(真实类别, 预测错误样本); xlabel(特征1标准化后); ylabel(特征2标准化后); title(测试集样本分布与预测错误点);3.1 每一段代码的意图数据导入段readmatrix负责把 Excel 表格变成 MATLAB 的矩阵变量data。分拆X和y是建模的第一步后面所有操作都建立在“特征是特征、标签是标签”的基础上。标准化这一段很多人会问为什么需要标准化。以鸢尾花数据为例花瓣长度单位是厘米数值在 1~7 之间而花萼长度在 4~8 之间看起来差不多但如果换成“房屋面积几百”和“卧室数量几个”这种量纲差异巨大的数据机器学习模型里距离计算会被大面积数值主导小数值特征直接被忽略。Z-score 标准化就是让每个特征站在同一个起跑线上。训练/测试划分cvpartition按比例把数据随机分成训练集和测试集。设置rng(42)是为了复现——你跑出来什么样别人跑出来也什么样这对论文和课程报告来说很重要。模型选择fitcdiscr是线性判别分析适合多分类问题鸢尾花这种三类问题用起来特别顺。你完全可以把这一行替换成fitcknnK近邻、fitctree决策树或fitcensemble集成学习后续预测和评估代码完全不用改。这也是写脚本时的一个思路——把模型训练封装成单行调用方便快速对比不同算法的效果。3.2 运行结果长什么样我用鸢尾花数据实测测试集准确率在 95% 左右混淆矩阵大概长这样随机划分会导致数据略有差异混淆矩阵: 10 0 0 0 9 0 0 1 10意思是第一类 10 个全对第二类 9 个对、1 个被错分到第三类第三类 10 个全对。整体就是一个样本预测错了。可视化图上会有一个黑色叉号落在两类边界附近直观展示分类器的错误位置。这种“准确率 混淆矩阵 可视化”三件套放在课程设计报告或项目总结里信息量很足。4. 把脚本推广到更多场景回归、多分类、图像特征上面用的是“分类 鸢尾花”来做演示但同样的脚本骨架可以快速改造成更多场景。这里我给出几个高频变体。4.1 最后一列是连续数值改造成回归模型如果data.xlsx的最后一列是连续数值比如房价、温度、浓度把训练那句模型换成回归器就行% 回归用线性回归、支持向量回归或高斯过程回归 mdl fitlm(X_train, y_train); % 线性回归 % mdl fitrsvm(X_train, y_train); % SVM回归 % mdl fitrgp(X_train, y_train); % 高斯过程回归 y_pred predict(mdl, X_test); % 回归用 RMSE 和 R^2 来评估 rmse sqrt(mean((y_pred - y_test).^2)); ssRes sum((y_pred - y_test).^2); ssTot sum((y_test - mean(y_test)).^2); r2 1 - ssRes / ssTot; fprintf(RMSE: %.4f, R^2: %.4f\n, rmse, r2);回归评估不看准确率看预测值和真实值的贴近程度。RMSE是均方根误差越小越好R^2越接近 1 说明模型解释力越强。这两个指标加一行figure; scatter(y_test, y_pred)画出“预测 vs 真实”散点图数据点越贴近对角线说明效果越好。4.2 分类标签是字符串把文本标签变成数值有些表格最后一列是“是”“否”“高”“中”“低”这样的文本。readmatrix读不进来必须用readtablecategorical组合拳T readtable(data.xlsx); % 按表格方式读取能保留文本 % 假设最后一列变量名是 Result y_raw T.Result; % 取出文本标签列 y categorical(y_raw); % 转成分类变量 X T{:, 1:end-1}; % 方括号提取数值特征前面变量部分categorical会把 “是”“否” 内部编码成 1、2但显示的时候依然显示原文本confusionmat也能直接处理。这是实战里最频繁踩坑的一个点后面排查部分还会提到。4.3 一表多用循环快速对比多个模型脚本骨架最值钱的部分在于“换行就可以换模型”。我建议把建模评估部分写成一个for循环一次跑完 KNN、决策树、SVMmodelNames {LDA, KNN, 决策树, SVM}; modelFuncs { () fitcdiscr(X_train, y_train), ... () fitcknn(X_train, y_train, NumNeighbors, 5), ... () fitctree(X_train, y_train), ... () fitcsvm(X_train, y_train, KernelFunction, rbf) }; for i 1:length(modelFuncs) mdl modelFuncs{i}(); y_pred predict(mdl, X_test); acc sum(y_pred y_test) / length(y_test); fprintf(%-6s 准确率: %.2f%%\n, modelNames{i}, acc * 100); end这样跑出来的结果就是一张小报告哪个模型在你数据上表现好一目了然。实际项目中“多模型对比”就是机器学习工作的核心流程所有模型统一输入、统一评估口径结果才有说服力。5. 常见问题与排查技巧实录5.1readmatrix读出来全是 NaN现象data变量里全是NaN或者部分列是NaN。排查步骤用 Excel 打开文件看第一行是不是文字表头。如果是加NumHeaderLines, 1。看有没有合并单元格、空行、空列这些都会让矩阵解析出错。确认里面没有公式产生的#N/A、#DIV/0!等错误值readmatrix 对这类内容不友好。我的建议数据文件在入库之前先做一次清洗——把表头删掉或标记好、去掉空行列、把错误值替换成空或 0。这是所有数据处理工作的第一步值得你花两分钟手动处理。5.2 提示“无法识别文件格式”或“文件不存在”原因多半是路径不对。你把脚本和data.xlsx都放在桌面但 MATLAB 当前工作目录Current Folder可能是默认的C:\Users\...\Documents\MATLAB。解决两种办法推荐第二种在 MATLAB 界面左上角把当前文件夹切换到桌面。代码里写完整绝对路径比如data readmatrix(C:\Users\你的用户名\Desktop\data.xlsx);绝对路径的唯一缺点是换电脑要改路径所以更通用的做法是第一行加cd(fileparts(mfilename(fullpath))); % 把工作目录切到脚本所在文件夹这个操作把“读取脚本所在目录”当作基准不管脚本放在桌面还是 D 盘数据文件只要和脚本在同一个文件夹就能找到。5.3 安装 MATLAB 或激活 License 时报错如果是新装的 MATLAB比如 2026b打开时报错或提示许可证问题常见原因是激活时 HostID 不匹配、或者杀毒软件拦截了 License Manager。这类问题属于环境层面的不影响写代码逻辑。我的经验是先看 MATLAB 自带工具ver能否正常输出版本信息再看license(test)返回是否为 1。如果是 0那就需要重新激活或检查许可证文件license.lic的位置。在 Windows 上许可证文件默认放在C:\Program Files\MATLAB\R2026b\licenses目录确保里面的 HostID 和你网卡的物理地址对上。5.4 矩阵维度对不上X_train和y_train行数不一致原因data里有空行导致X取了 100 行、y只有 99 行。或者在划分数据集前X和y的行数本来就不一致。解决办法在读取完数据后加一行校验assert(size(X, 1) length(y), X 和 y 的行数不一致请检查数据);这行代码会在行数不一致时立刻报错省得你拿着错误信息满世界找原因。做数据处理脚本断言检查是成本最低的防呆手段。5.5 中文显示乱码或标签错乱gscatter的图例里中文变方框这是 MATLAB 默认字体不支持中文导致的。在画图前加一行set(groot, defaultAxesFontName, Microsoft YaHei); set(groot, defaultTextFontName, Microsoft YaHei);把字体设为微软雅黑中文就能正常显示。数据里的中文标签建议用categorical处理显示层没问题。如果你的队友用英文版 Windows可能需要换SimHei或Arial Unicode MS这在跨电脑共享脚本时是常事。5.6 文件很大xlsx 读起来慢怎么办热搜里提到“为什么 xlsx 的存储膨胀”“矩阵读取卡死”——Excel 文件本质是 XML 压缩包文件大时解析很慢。如果你的data.xlsx有几十 MBreadmatrix可能要卡十几秒。改进策略把数据另存为 CSV 或 TXT 格式用readmatrix或readtable读速度能快一个数量级。数据特别大的话几 GB就应该考虑datastore或分块读取但这就属于大数据流程了日常表格处理用 CSV 就是性价比最高的选择。6. 实操心得从“跑通脚本”到“做出可信结果”的几个习惯6.1 用rng(42)固定随机种子不固定随机种子的话同一个脚本每次跑出来的准确率都不一样可能是 93%也可能是 97%。这不是代码有 bug而是随机划分训练/测试集带来的正常波动。但如果你在写论文或做对比实验这种波动会严重影响结论可信度。固定随机种子rng(42)里的 42 只是一个惯用数字你可以改成任何整数之后每次跑的结果完全一致。这个习惯我从一开始就强调因为它只花一行代码收益却极大——你的实验从此可复现了。6.2 数据标准化是分类模型的隐形开关我在第 3 节已经做过标准化处理。很多人用fitcknn、fitcsvm这类基于距离或几何间隔的模型时忘了标准化结果准确率就是上不去。换成带标准化的版本准确率立刻提升几个百分点原因很简单量纲差异太大时模型几乎只看数值大的特征数值小但同样重要的特征被压制。但注意决策树和随机森林不需要标准化。它们基于特征阈值切分不受数值范围影响。所以标准化可以说“分组适用”不是所有模型的必选项。6.3 多分类问题首选观察混淆矩阵准确率只是一个数信息量有限。比如三分类问题准确率 95% 看似很好但你可能不知道A 类全对、B 类全错、C 类全对这三个类别的错误率分别是 0%、100%、0%。只有混淆矩阵才能暴露这种类别不平衡的问题。所以评估分类模型我永远建议“准确率 混淆矩阵”一起看条件允许再加一个比例可视化用heatmap(confMat)画热力图。单看准确率就是管中窥豹。6.4 模型只是其中一环数据质量才是天花板这个脚本帮你完成了从导入数据到模型评估的全流程但最终预测效果的上限由数据质量和特征工程决定。如果数据本身噪声大、特征选得不好任何模型都救不回来。实际操作中特征选择、异常值处理、新特征构造所占的时间和精力远超模型调参。用这个模板跑通流程之后我强烈建议把主要精力放在“检查数据靠不靠谱、特征能不能更好”上而不是反复切换模型、微调超参数。7. 后续扩展从“单文件脚本”到“自动化分析工具”这个脚本还可以继续往下走几步批量处理用dir(*.xlsx)遍历文件夹里所有 Excel对每份文件训练模型输出汇总报告这就是一个最简单的批处理工具。结合并行计算数据量和模型数量上来后用parfor并行跑多个模型训练时间能缩短不少。导出结果报告把准确率、混淆矩阵、特征重要性等信息写入新的 Excel 表格用writetable或writecell组合输出形成闭环。我在做设备老化测试数据自动分析的时候就吃过这种“手工操作”的亏每天拿到几十份测试表格手动建模、手动记录结果浪费大把时间。后来我把上面这套逻辑写成脚本让 MATLAB 自己读数、训练、生成报告剩下的人工只做“看一眼结论对不对”这件事。这就是脚本模板实用价值最好的体现——把重复劳动交给机器把判断留给人。如果你手头正好有一份排成“输入多列 输出一列”的表格现在就可以打开 MATLAB把这段代码贴进去跑一下。跑通之后再去调整模型、优化特征你会发现自己已经离“用 MATLAB 做数据建模”这门手艺更近了一步。
返回列表