机器学习(一)——递归特征消除法实现SVM(matlab)

svm,matlab · 浏览次数 : 3

小编点评

本文主要介绍了如何使用经典机器学习方法对多维特征数据进行分类。具体包括支持向量机(SVM)、递归特征消除(RFE)和留一交叉验证(LOOCV)的应用。以下是文章的详细内容: 1. 支持向量机(SVM):SVM是一种二分类模型,其目标是在特征空间中找到一个超平面,使得两个不同类别的数据点之间的间隔最大化。SVM适用于线性可分和非线性可分的数据,可以通过调整核函数来提高分类性能。 2. 递归特征消除(RFE):RFE是一种特征选择方法,通过递归地消除最不重要的特征,从而找到最优的特征组合。RFE的工作原理是首先使用所有特征构建SVM模型,然后评估每个特征的重要性,最后移除对模型性能贡献最小的特征。 3. 留一交叉验证(LOOCV):LOOCV是一种小样本情况下的分类模型评估方法,其基本思想是依次使用数据集中的每一个样本作为验证集,其余样本作为训练集,从而得到n个模型,计算这n个模型分类结果的平均值作为模型性能的评价指标。 文章通过实验展示了这些方法的性能,并给出了最终选定的特征索引和最优的分类准确性。

正文

机器学习方法对多维特征数据进行分类:本文用到非常经典的机器学习方法,使用递归特征消除进行特征选择,使用支持向量机构建分类模型,使用留一交叉验证的方法来评判模型的性能。
构建模型:支持向量机(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)相似的内容:

机器学习(一)——递归特征消除法实现SVM(matlab)

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

AI人工智能(ArtificialIntelligence,AI)、 机器学习(MachineLearning,ML)、 深度学习(DeepLearning,DL) 学习路径及推荐书籍

人工智能、机器学习和深度学习覆盖的技术范畴是逐层递减的,三者的关系:人工智能 > 机器学习 > 深度学习。 人工智能(ArtificialIntelligence,AI)是最宽泛的概念,是研发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学 机器学习(MachineLear

机器学习算法(一):1. numpy从零实现线性回归

系列文章目录 机器学习算法(一):1. numpy从零实现线性回归 机器学习算法(一):2. 线性回归之多项式回归(特征选取) @目录系列文章目录前言一、理论介绍二、代码实现1、导入库2、准备数据集3、定义预测函数(predict)4 代价(损失)函数5 计算参数梯度6 批量梯度下降7 训练8 可视

国产大模型参加高考,同写2024年高考作文,及格分(通义千问、Kimi、智谱清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)

大家好,我是章北海 今天高考,上午的语文结束,市面上又要来一场大模型参考的文章了。 我也凑凑热闹,让通义千问、Kimi、智谱清言一起来写一下高考作文。 公平起见,不加任何其他prompt,直接把题目甩过去。 感觉写的都很一般,通篇口水文,都能拿个及格分吧。 有点好奇,就加了几个国外选手参赛:Gemi

机器学习(三)——K最临近方法构建分类模型(matlab)

K最临近(K-Nearest Neighbors,KNN)方法是一种简单且直观的分类和回归算法,主要用于分类任务。其基本原理是用到表决的方法,找到距离其最近的K个样本,然后通过K个样本的标签进行表决,预测结果给出的标签是表决多的一方。 在使用K最临近方法的时候,有两个方面可调: 一是K值的大小,K一

聚类模型的算法性能评价

一、概述 作为机器学习领域的重要内容之一,聚类模型在许多方面能够发挥举足轻重的作用。所谓聚类,就是通过一定的技术方法将一堆数据样本依照其特性划分为不同的簇类,使得同一个簇内的样本有着更相近的属性。依不同的实现策略,聚类算法有很多种,如基于距离的k-means、基于密度的DBSCAN等。在聚类完成之后

分类模型的算法性能评价

一、概述 分类模型是机器学习中一种最常见的问题模型,在许多问题场景中有着广泛的运用,是模式识别问题中一种主要的实现手段。分类问题概况起来就是,对一堆高度抽象了的样本,由经验标定了每个样本所属的实际类别,由特定算法训练得到一个分类器,输入样本属性即自动计算出其所属类别,从而完成特定的识别任务。依实现原

算法金 | 一文彻底理解机器学习 ROC-AUC 指标

​ 大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 在机器学习和数据科学的江湖中,评估模型的好坏是非常关键的一环。而 ROC(Receiver Operating Characteristic)曲线和 AUC(Area Under C

算法金 | 吴恩达:机器学习的六个核心算法!

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 人工智能领域的权威吴恩达教授,在其创立的《The Batch》周报中发表了一篇博文,概述了机器学习领域六种基础算法的历史和重要性。他强调了在这一领域不断学习和更新知识的必要性。 这些算法

算法金 | 10 大必知的自动化机器学习库(Python)

大侠幸会,在下全网同名[算法金] 0 基础转 AI 上岸,多个算法赛 Top [日更万日,让更多人享受智能乐趣] 一、入门级自动化机器学习库 1.1 Auto-Sklearn 简介: Auto-Sklearn 是一个自动机器学习库,基于 Python 的 scikit-learn 接口。它主要用于自