从分类到回归:用LibSVM+Matlab搞定你的第一个机器学习项目(附完整代码与数据集)
从分类到回归:用LibSVM+Matlab搞定你的第一个机器学习项目
机器学习不再是实验室里的神秘黑箱,而是每个工程师和研究者工具箱里的实用利器。当你手握LibSVM这样强大的支持向量机库,配合Matlab的交互式环境,就能快速验证各种机器学习想法。本文将带你完整走通一个微型项目流程:从鸢尾花分类到波士顿房价回归,用实际代码演示如何让LibSVM解决真实问题。
1. 项目准备与环境配置
虽然我们假设读者已经完成LibSVM的基本安装,但这里有几个实战中容易忽略的配置细节值得注意:
% 检查LibSVM是否在Matlab路径中 if exist('libsvmtrain', 'file') ~= 3 error('请先将LibSVM的matlab目录添加到路径'); end % 设置随机种子保证实验可复现 rng(42);关键工具准备清单:
- Matlab R2018b或更新版本
- LibSVM 3.25+ (建议使用最新版)
- 数据集:UCI Iris和Boston Housing
- 可视化工具:Matlab统计与机器学习工具箱
提示:在长期项目中,建议创建专门的实验环境配置脚本,记录所有依赖库的版本信息。
2. 分类实战:鸢尾花物种识别
2.1 数据加载与探索
我们从UCI获取经典的鸢尾花数据集,这个三分类问题非常适合入门:
% 加载数据 load fisheriris X = meas; % 150x4的特征矩阵 Y = grp2idx(species); % 将类别标签转为数字 % 查看数据分布 figure gscatter(X(:,1), X(:,2), species, 'rgb', 'osd'); xlabel('花萼长度'); ylabel('花萼宽度'); title('鸢尾花前两维特征分布');特征统计摘要:
| 特征 | 均值 | 标准差 | 最小值 | 最大值 |
|---|---|---|---|---|
| 花萼长度 | 5.843 | 0.828 | 4.300 | 7.900 |
| 花萼宽度 | 3.057 | 0.436 | 2.000 | 4.400 |
| 花瓣长度 | 3.758 | 1.765 | 1.000 | 6.900 |
| 花瓣宽度 | 1.199 | 0.762 | 0.100 | 2.500 |
2.2 模型训练与评估
我们使用RBF核函数进行多分类:
% 划分训练测试集(70%-30%) cv = cvpartition(Y, 'HoldOut', 0.3); X_train = X(cv.training,:); Y_train = Y(cv.training); X_test = X(cv.test,:); Y_test = Y(cv.test); % 训练模型 model = libsvmtrain(Y_train, X_train, '-s 0 -t 2 -c 10 -g 0.5'); % 预测测试集 [pred, acc, ~] = libsvmpredict(Y_test, X_test, model);参数选择经验:
-c(惩罚系数):从小值(如0.1)开始尝试,逐步增大-g(gamma):通常设为特征数的倒数附近-t 2表示使用RBF核,适合大多数非线性问题
3. 回归实战:波士顿房价预测
3.1 数据预处理
回归任务需要不同的数据处理方式:
% 加载数据 load boston.mat % 包含housing数据和price标签 % 数据标准化 X = zscore(housing); Y = price; % 检查离群值 boxplot(Y); title('房价分布箱线图');特征工程技巧:
- 对偏态分布的特征取对数
- 对分类特征进行独热编码
- 使用PCA降维消除多重共线性
3.2 回归模型实现
使用ε-SVR进行房价预测:
% 设置SVR参数 params = '-s 3 -t 2 -c 5 -g 0.1 -p 0.5'; % 5折交叉验证 mse = libsvmcrossval(Y, X, params, 5); % 全数据训练 model = libsvmtrain(Y, X, params); % 预测效果可视化 pred = libsvmpredict(Y, X, model); plot(Y, pred, 'bo'); hold on; plot([min(Y) max(Y)], [min(Y) max(Y)], 'r--'); xlabel('实际价格'); ylabel('预测价格');4. 模型优化与调参技巧
4.1 网格搜索实现
自动化参数搜索能显著提升模型性能:
% 定义搜索范围 c_range = 2.^(-5:2:15); g_range = 2.^(-15:2:3); % 初始化最佳参数 best_acc = 0; best_c = 0; best_g = 0; % 网格搜索 for c = c_range for g = g_range acc = libsvmcrossval(Y_train, X_train, ... sprintf('-s 0 -t 2 -c %f -g %f', c, g), 5); if acc > best_acc best_acc = acc; best_c = c; best_g = g; end end end4.2 高级优化策略
贝叶斯优化示例:
% 定义优化目标函数 obj_fun = @(params) -libsvmcrossval(Y_train, X_train, ... sprintf('-s 0 -t 2 -c %f -g %f', exp(params.logc), exp(params.logg)), 5); % 设置优化参数 params = struct('logc', 0, 'logg', 0); results = bayesopt(obj_fun, params, 'Verbose', 1);模型选择参考表:
| 问题类型 | 推荐-s参数 | 适用核函数 | 典型应用场景 |
|---|---|---|---|
| 多分类 | 0 (C-SVC) | RBF (-t 2) | 图像分类、物种识别 |
| 回归 | 3 (ε-SVR) | 线性 (-t 0) | 房价预测、销量预估 |
| 异常检测 | 2 (One-class) | 多项式 (-t 1) | 工业缺陷检测 |
5. 结果可视化与报告生成
5.1 分类决策边界
可视化能直观理解模型工作原理:
% 选择两个特征进行可视化 [~,~,~,auc] = perfcurve(Y_test, pred, 1); fprintf('AUC: %.2f\n', auc); % 绘制决策边界 d = 0.02; [x1,x2] = meshgrid(min(X(:,1)):d:max(X(:,1)), ... min(X(:,2)):d:max(X(:,2))); X_grid = [x1(:), x2(:), repmat(mean(X(:,3:4),1), numel(x1), 1)]; pred_grid = libsvmpredict(ones(size(X_grid,1),1), X_grid, model);5.2 回归诊断图
检查回归模型的残差分布:
residuals = Y - pred; figure subplot(1,2,1); plot(pred, residuals, 'o'); xlabel('预测值'); ylabel('残差'); title('残差图'); subplot(1,2,2); normplot(residuals); title('残差正态性检验');在真实项目中,我通常会保存关键图表和参数设置到项目报告里。一个实用的技巧是使用Matlab的publish功能自动生成HTML报告:
options = struct('format', 'html', 'outputDir', './report'); publish('svm_project.m', options);