svm支持向量机分类预测 案例提供数据先进行随机打乱再划分训练测试集,结果更有说服力(若不需要可自行删除修改),数据包含归一化处理,网格搜索寻优确定最优参数 matlab代码,备注详细,根据自己需要修改案例数据即可
在机器学习的领域中,SVM(支持向量机)是一种广泛应用且非常有效的分类算法。今天咱们就来聊聊如何使用Matlab进行SVM支持向量机分类预测,并且会穿插详细的代码讲解。
数据处理
首先,数据处理是构建一个好模型的关键步骤。咱们先来说说数据的打乱和划分训练测试集。随机打乱数据能让模型的训练和测试结果更具说服力,因为它避免了数据可能存在的顺序性对模型造成的偏差。
随机打乱与划分数据集
% 假设已经从文件中读取数据到data矩阵,data的最后一列是标签 data = load('your_data_file.txt'); % 随机打乱数据 rng('default'); % 为了结果可重复性设置随机种子 shuffled_data = data(randperm(size(data, 1)), :); % 划分训练集和测试集,这里按70%训练,30%测试划分 train_ratio = 0.7; train_size = floor(train_ratio * size(shuffled_data, 1)); train_data = shuffled_data(1:train_size, :); test_data = shuffled_data(train_size + 1:end, :);在这段代码中,我们先假设已经从文件中读取了数据到data矩阵,并且数据的最后一列是标签列。rng('default')这行代码设置了随机种子,这样每次运行代码时打乱的顺序都是一样的,方便结果的复现。randperm(size(data, 1))生成一个从1到数据行数的随机排列,然后用这个排列对数据进行重新排序,就实现了数据的打乱。接着按照设定的比例划分出了训练集和测试集。
数据归一化处理
归一化能让不同特征在相同的尺度上进行比较,有助于提升模型的性能。
% 提取训练数据的特征 train_features = train_data(:, 1:end - 1); % 对训练特征进行归一化 [train_norm_features, mu, sigma] = zscore(train_features); % 对测试数据的特征进行同样的归一化处理 test_features = test_data(:, 1:end - 1); test_norm_features = bsxfun(@minus, test_features, mu); test_norm_features = bsxfun(@rdivide, test_norm_features, sigma);这里我们先提取了训练数据中的特征部分(不包含标签列),然后使用zscore函数对训练特征进行归一化,这个函数会返回归一化后的特征,以及用于归一化的均值mu和标准差sigma。对于测试数据,我们使用bsxfun函数,根据训练数据得到的均值和标准差对测试数据的特征进行同样的归一化操作。
网格搜索寻优确定最优参数
SVM的性能很大程度上取决于其参数,网格搜索是一种寻找最优参数的有效方法。
% 设置参数搜索范围 C_range = logspace(-2, 2, 5); % C值范围 gamma_range = logspace(-2, 2, 5); % gamma值范围 best_acc = 0; best_C = 0; best_gamma = 0; for i = 1:length(C_range) for j = 1:length(gamma_range) C = C_range(i); gamma = gamma_range(j); % 创建SVM模型 model = fitcsvm(train_norm_features, train_data(:, end), 'KernelFunction', 'rbf', 'BoxConstraint', C, 'KernelScale', gamma); % 对测试集进行预测 predicted_labels = predict(model, test_norm_features); % 计算准确率 acc = sum(predicted_labels == test_data(:, end)) / size(test_data, 1); if acc > best_acc best_acc = acc; best_C = C; best_gamma = gamma; end end end在这段代码里,我们先设定了C值(惩罚参数)和gamma值(核函数系数)的搜索范围,通过logspace函数生成对数等间距的取值。然后进行双重循环遍历所有可能的参数组合。在每次循环中,使用当前的C和gamma值创建SVM模型,对测试集进行预测,并计算预测的准确率。如果当前参数组合得到的准确率高于之前记录的最高准确率,就更新最高准确率以及对应的最优C和gamma值。
最终模型构建与评估
% 使用最优参数构建最终的SVM模型 final_model = fitcsvm(train_norm_features, train_data(:, end), 'KernelFunction', 'rbf', 'BoxConstraint', best_C, 'KernelScale', best_gamma); % 最终预测 final_predicted_labels = predict(final_model, test_norm_features); % 计算最终准确率 final_acc = sum(final_predicted_labels == test_data(:, end)) / size(test_data, 1); fprintf('最终准确率: %.2f%%\n', final_acc * 100);这部分代码使用找到的最优参数构建最终的SVM模型,对测试集进行最终的预测,并计算出最终的准确率输出。
通过上述从数据处理到模型优化的步骤,我们就能使用SVM支持向量机在Matlab中进行有效的分类预测啦。记得根据自己实际的案例数据来修改代码中的数据读取部分哦。希望这篇博文能帮助大家更好地理解和运用SVM进行分类任务。