机器学习(一)——递归特征消除法实现SVM(matlab)
机器学习方法对多维特征数据进行分类:本文用到非常经典的机器学习方法,使用递归特征消除进行特征选择,使用支持向量机构建分类模型,使用留一交叉验证的方法来评判模型的性能。
构建模型:支持向量机(Support Vector Machine,SVM);
特征选择:递归特征消除(Recursive Feature Elimination,RFE);
交叉验证:留一交叉验证(Leave one out cross validation,LOOCV)。
下面本问将逐一开始介绍这些方法。
支持向量机
适用场景:
1、只能用于2分类任务
2、目的是寻找一个超平面来对样本进行分割
3、注意:构建超平面不一定用到所有样本,只用到距离超平面最近的那些样本
模型调参:
1、当样本之间线性可分时,选用线性核函数(linear kernel)构建分类模型。
2、当模型线性不可分时候,需要适用非线性核函数(rbf,Gaussian,Polynomial)将数据分布映射到更高维的空间中来构建超平面,进而来构建分类模型。
3、选择哪种核函数,一般通过改变核函数来比较模型的分类性能来确定。matlab中自带的核函数只有四种,如果需要使用其他核函数请自行下载相关软件包。
递归特征消除
作用:
1、降低特征维度
2、选择最优的特征组合,使模型达到最好的分类效果(类似于贪心算法)。
步骤:
1、对于一个具有n维特征的数据集合,首先用n维特征构建SVM分类器模型,通过交叉验证的方法计算模型的分类准确性。
2、从当前特征集合中依次移除每一个特征,然后用剩下特征构建分类模型,使用交叉验证的方法计算特征移除后的分类准确率。
3、若某特征移除后模型的分类准确率反而上升,则该特征对分类模型没有贡献度,则将该特征移除,剩下特征作为保留特征。
4、使用剩下特征重复步骤2,直到所有的特征子集为空后便可以得到n个模型,选择分类准确率最高的特征集合作为最优的特征集合。
留一交叉验证
适用场景:
小样本构建分类模型,当样本量很小时,不足以区分单独的训练集和测试集时,通常使用这种方法。该方法的基本思想就是,当有n个样本的情况下,依次保留其中1个样本,用剩下n-1个样本构建分类模型,用保留的样本进行测试。这样就可以得到n个模型,计算这n个模型分类结果的平均值就可以得到在该数据分布情况下,使用某种分类方法构建分类模型的性能。
matlab实现的代码如下:
labels = res(:, 1);
features = res(:, 2:end);
features=zscore(features);%特征进行归一化
% 加载数据集并准备标签和特征数组
[num_samples, num_features] = size(features);
selected_indices = 1:num_features; % 初始选定所有特征的索引
selected_features_history = cell(num_features, num_features); % 存储选定的特征历史记录
accuracy_history = zeros(num_features, num_features); % 存储准确率历史记录
feature_to_remove = -1;
% 开始逐步特征选择
for i = 1:num_features
best_accuracy = 0;
temp_indices = selected_indices; % 创建临时特征索引列表
% 对每个特征进行评估
for j = 1:length(temp_indices)
features_subset = temp_indices(temp_indices ~= j);%去除特征后输入分类器的特征
[num1,num2]=size(features_subset);
% 使用留一交叉验证评估SVM分类器性能
accuracy = 0;
for k = 1:num_samples
% 留一样本作为验证集,其余样本作为训练集
train_features = features(:, features_subset);
train_features(k, :) = []; % 删除验证样本的特征
train_labels = labels;
train_labels(k) = []; % 删除验证样本的标签
test_feature = features(k, features_subset);
test_label = labels(k);
% 训练SVM模型
svm_model = fitcsvm(train_features, train_labels, 'KernelFunction', 'linear');
% 在验证集上进行预测并计算准确率
predicted_label = predict(svm_model, test_feature);
if predicted_label == test_label
accuracy = accuracy + 1;
end
end
accuracy = accuracy / num_samples; % 计算准确率
accuracy_history(i,j)=accuracy; %将每次分类的准确率存到一个数组中
selected_features_history{i,j} = features_subset;%将每次分类用到的特征存到一个数组里
%temp_indices
% 如果当前特征组合的准确率更高,则更新最佳特征及其对应的准确率
if (accuracy_history(i,j) > best_accuracy)
best_accuracy = accuracy_history(i,j);
feature_to_remove = temp_indices(j);
end
end
% 删除性能下降最快的特征
selected_indices = selected_indices(selected_indices ~= feature_to_remove);
% selected_features_history{i} = selected_indices; % 更新选定的特征历史记录
% accuracy_history(i) = best_accuracy; % 更新准确率历史记录
disp(['Removed feature index: ', num2str(feature_to_remove)]);
end
[max_value, max_index] = max(accuracy_history(:));
% max_value 将是数组中的最大值
% max_index 将是数组中最大值所在的位置(线性索引)
[row, col] = ind2sub(size(accuracy_history), max_index);
% row 和 col 将是数组中最大值的行和列索引
% 输出最终选定的特征索引
% disp('最优的分类准确性为');
% disp(max_value);
disp('对应的选择的特征索引为:');
disp(selected_features_history{row,col});
%利用选出来的特征重新建模求准确率
features_new=features(:,selected_features_history{row,col});
%features_new=features;
% lables是样本标签
predictedScores=zeros(56,2);
accuracy_new=0;
for k = 1:num_samples
% 留一样本作为验证集,其余样本作为训练集
train_features = features_new(:,:);
train_features(k, :) = []; % 删除验证样本的特征
train_labels = labels;
train_labels(k) = []; % 删除验证样本的标签
test_feature = features_new(k,:);
test_label = labels(k);
% 训练SVM模型
svm_model = fitcsvm(train_features, train_labels, 'KernelFunction', 'linear');
% 在验证集上进行预测并计算准确率
% predicted_label = predict(svm_model, test_feature);
[predicted_label,predictedScore] = predict(svm_model, test_feature);
predictedScores(k,:)=predictedScore;
if predicted_label == test_label
accuracy_new = accuracy_new + 1;
end
end
accuracy_new = accuracy_new / num_samples; % 计算准确率
% 输出最终选定的特征索引
disp('最优的分类准确性为');
disp(accuracy_new);```
机器学习(一)——递归特征消除法实现SVM(matlab)的更多相关文章
- 特征选择:方差选择法、卡方检验、互信息法、递归特征消除、L1范数、树模型
转载:https://www.cnblogs.com/jasonfreak/p/5448385.html 特征选择主要从两个方面入手: 特征是否发散:特征发散说明特征的方差大,能够根据取值的差异化度量 ...
- SVM matlab 代码详解说明
x=[0 1 0 1 2 -1];y=[0 0 1 1 2 -1];z=[-1 1 1 -1 1 1]; %其中,(x,y)代表二维的数据点,z 表示相应点的类型属性. data=[1,0;0,1;2 ...
- 转:机器学习中的算法(2)-支持向量机(SVM)基础
机器学习中的算法(2)-支持向量机(SVM)基础 转:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/02/basic-of-svm.html 版 ...
- 机器学习概念之特征处理(Feature processing)
不多说,直接上干货! 肯定也有不少博友,跟我一样,刚开始接触的时候,会对这三个概念混淆. 以下是,特征处理.特征提取.特征转换和特征选择的区别! 特征处理主要包含三个方面:特征提取.特征转换和特征选择 ...
- 100天搞定机器学习|Day16 通过内核技巧实现SVM
前情回顾 机器学习100天|Day1数据预处理100天搞定机器学习|Day2简单线性回归分析100天搞定机器学习|Day3多元线性回归100天搞定机器学习|Day4-6 逻辑回归100天搞定机器学习| ...
- Spark机器学习API之特征处理(二)
Spark机器学习库中包含了两种实现方式,一种是spark.mllib,这种是基础的API,基于RDDs之上构建,另一种是spark.ml,这种是higher-level API,基于DataFram ...
- Spark机器学习API之特征处理(一)
Spark机器学习库中包含了两种实现方式,一种是spark.mllib,这种是基础的API,基于RDDs之上构建,另一种是spark.ml,这种是higher-level API,基于DataFram ...
- 机器学习技法笔记:Homework #5 特征变换&Soft-Margin SVM相关习题
原文地址:https://www.jianshu.com/p/6bf801bdc644 特征变换 问题描述 程序实现 # coding: utf-8 import numpy as np from c ...
- 机器学习基石--学习笔记01--linear hard SVM
背景 支持向量机(SVM)背后的数学知识比较复杂,之前尝试过在网上搜索一些资料自学,但是效果不佳.所以,在我的数据挖掘工具箱中,一直不会使用SVM这个利器.最近,台大林轩田老师在Coursera上的机 ...
- 机器学习中的特征缩放(feature scaling)
参考:https://blog.csdn.net/iterate7/article/details/78881562 在运用一些机器学习算法的时候不可避免地要对数据进行特征缩放(feature sca ...
随机推荐
- [Blockchain] 开发完真实的 DApp 后才能得出的结论与看法
1. 最近经常看到地方新闻有关 区块链在追踪溯源方面被实际应用,但是我本人认为这很大程度上可能是伪命题. 因为,是不是区块链.或者说有没有办法更改数据,这都很难说,本质上这个链还是由机构控制,所以对此 ...
- WPF 字体 FontStyle 的 Italic 和 Oblique 的区别
本文介绍在 WPF 里面的字体属性 FontStyle 的 Italic 和 Oblique 的斜体差别 本文的图片和知识来自: #265 – Specifying Values for FontSt ...
- 使用 WPF 做个 PowerPoint 系列 文本 BodyProperties 的 FontScale 与文本字号缩放
本文来告诉大家,在 OpenXML 的 BodyProperties 的 NormalAutoFit 的 FontScale 属性缩放文本框的文本字号的方法 通过 ECMA 376 文档可以了解到 B ...
- WPF 触摸底层 PenImc 是如何工作的
在 WPF 里面有其他软件完全比不上的超快速的触摸,这个触摸是通过 PenImc 获取的.现在 WPF 开源了,本文就带大家来阅读触摸底层的代码,阅读本文需要一点 C# 和 C++ 基础 现在 WPF ...
- Gradle8.4构建SpringBoot多模块项目
Gradle8.4构建SpringBoot多模块项目 一.基本 1.版本 这个版本是Jdk8最后一个SpringBoot版本 软件 版本 Gradle 8.4 SpringBoot 2.7.15 JD ...
- 泊松盘采样(Poisson Disk Sampling)生成均匀随机点
当需要生成随机点且要求随机点自然均匀的分布时,使用泊松盘采样就较为适合. 但该方法与统计学上的概念关联不大,这个只相当于点在面积上服从泊松分布, 而实现这个结果有很多做法. 最终效果: 圆形为含半径的 ...
- rsync备份服务器部署详情
rsync -avz --bwlimit=1024M /data/wanxhe rsync_backup@10.x.x.38::backup/gpu007/data/ --password-fil ...
- springcloud整合stream解决项目升级的多个消息中间件的收发问题
cloud stream (一)简介Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架.它可以基于 Spring Boot 来创建独立的.可用于生产的 Spring ...
- ajax跨域(跨源)方案之CORS
ajax跨域(跨源)方案:后端授权[CORS],jsonp,服务端代理 CORS是一个W3C标准,全称是"跨域资源共享",它允许浏览器向跨源的后端服务器发出ajax请求,从而克服了 ...
- win11通过注册表禁用鼠标右键
本经验分为5个步骤,详情如下. 工具/原料 华硕K5 win11专业版21H2 注册表22000.556 方法/步骤 同时按下"win"+"R"键,打开运行 ...