机器学习方法对多维特征数据进行分类:本文用到非常经典的机器学习方法,使用递归特征消除进行特征选择,使用支持向量机构建分类模型,使用留一交叉验证的方法来评判模型的性能。

构建模型:支持向量机(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)的更多相关文章

  1. 特征选择:方差选择法、卡方检验、互信息法、递归特征消除、L1范数、树模型

    转载:https://www.cnblogs.com/jasonfreak/p/5448385.html 特征选择主要从两个方面入手: 特征是否发散:特征发散说明特征的方差大,能够根据取值的差异化度量 ...

  2. 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 ...

  3. 转:机器学习中的算法(2)-支持向量机(SVM)基础

    机器学习中的算法(2)-支持向量机(SVM)基础 转:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/02/basic-of-svm.html 版 ...

  4. 机器学习概念之特征处理(Feature processing)

    不多说,直接上干货! 肯定也有不少博友,跟我一样,刚开始接触的时候,会对这三个概念混淆. 以下是,特征处理.特征提取.特征转换和特征选择的区别! 特征处理主要包含三个方面:特征提取.特征转换和特征选择 ...

  5. 100天搞定机器学习|Day16 通过内核技巧实现SVM

    前情回顾 机器学习100天|Day1数据预处理100天搞定机器学习|Day2简单线性回归分析100天搞定机器学习|Day3多元线性回归100天搞定机器学习|Day4-6 逻辑回归100天搞定机器学习| ...

  6. Spark机器学习API之特征处理(二)

    Spark机器学习库中包含了两种实现方式,一种是spark.mllib,这种是基础的API,基于RDDs之上构建,另一种是spark.ml,这种是higher-level API,基于DataFram ...

  7. Spark机器学习API之特征处理(一)

    Spark机器学习库中包含了两种实现方式,一种是spark.mllib,这种是基础的API,基于RDDs之上构建,另一种是spark.ml,这种是higher-level API,基于DataFram ...

  8. 机器学习技法笔记:Homework #5 特征变换&Soft-Margin SVM相关习题

    原文地址:https://www.jianshu.com/p/6bf801bdc644 特征变换 问题描述 程序实现 # coding: utf-8 import numpy as np from c ...

  9. 机器学习基石--学习笔记01--linear hard SVM

    背景 支持向量机(SVM)背后的数学知识比较复杂,之前尝试过在网上搜索一些资料自学,但是效果不佳.所以,在我的数据挖掘工具箱中,一直不会使用SVM这个利器.最近,台大林轩田老师在Coursera上的机 ...

  10. 机器学习中的特征缩放(feature scaling)

    参考:https://blog.csdn.net/iterate7/article/details/78881562 在运用一些机器学习算法的时候不可避免地要对数据进行特征缩放(feature sca ...

随机推荐

  1. WPF 使用 Skia 解析绘制 SVG 图片

    本文告诉大家如何在 WPF 里面,使用 Skia 解析绘制 SVG 图片.本文也适合控制台使用 SkiaSharp 解析绘制 SVG 图片,本文的 WPF 部分只是在 Skia 绘制完成之后,将 Sk ...

  2. dotnet 启动进程传入不存在的文件夹作为工作目录行为变更

    本文记录在 dotnet 下,启动进程,传入不存在的文件夹作为进程的工作目录,分别在 .NET Framework 和 .NET Core 的行为 在 dotnet 6 下,可以使用 ProcessS ...

  3. dotnet 在 UOS 国产系统上使用 MonoDevelop 进行拖控件开发 GTK 应用

    先从一个 Hello World 应用开始,试试和古老的 WinForms 一样的拖控件式开发 在创建完成一个 GTK# 2.0 应用之后,咱可以试试开始拖控件的开发,当然这个开发方式开发出来的应用界 ...

  4. Anaconda环境下GPT2-Chinese的基本使用记录

    偶然在看到了这个项目,感觉很厉害,于是就折腾了下,跑了一跑 项目地址:https://github.com/Morizeyao/GPT2-Chinese 如果Github下载太慢的可以用这个代下载:h ...

  5. SQL server 批量删除表

    select 'drop table '+name+';' from sys.tables declare c cursor forselect NAME from sysobjects where ...

  6. RTThread 重定义rt_hw_console_output函数

    在学习单片机时,我们会经常使用printf函数进行信息输出,方便调试程序,而学习RT-Thread时也会经常使用rt_kprintf函数进行信息输出,所以在移植完RT-Thread时,我们首先需要定义 ...

  7. 您可知道如何通过`HTTP2`实现TCP的内网穿透???

    可能有人很疑惑应用层 转发传输层?,为什么会有这样的需求啊???哈哈技术无所不用其极,由于一些场景下,对于一个服务器存在某一个内部网站中,但是对于这个服务器它没有访问外网的权限,虽然也可以申请端口访问 ...

  8. IPD、CMMI、敏捷

    华为公司早在2009年正式发文在全公司现在流程IPD.CMMI的基础上,所有产品线的软件开发团队全面推行敏捷开发.除了华为之外,不仅是互联网企业,现在凡是涉及到软件开发的企业对敏捷都不陌生,那么IPD ...

  9. 基于webapi的websocket聊天室(四)

    上一篇实现了多聊天室.这一片要继续改进的是实现收发文件,以及图片显示. 效果 问题 websocket本身就是二进制传输.文件刚好也是二进制存储的. 文件本身的传输问题不太,但是需要传输文件元数据,比 ...

  10. 京东二面:Sychronized的锁升级过程是怎样的

    引言 Java作为主流的面向对象编程语言,提供了丰富的并发工具来帮助开发者解决多线程环境下的数据一致性问题.其中,内置的关键字"Synchronized"扮演了至关重要的角色,它能 ...