机器学习(四)——Lasso线性回归预测构建分类模型(matlab)

lasso,matlab · 浏览次数 : 0

小编点评

本文介绍了Lasso线性回归算法,该算法通过引入L1正则化项来实现特征选择和防止过拟合。文章首先解释了Lasso回归的基本原理,即在损失函数中加入模型权重系数的绝对值,从而使得模型参数尽可能小,提高模型的泛化能力。接着,文章通过留一交叉验证的方法来选择最优的Lambda值及其对应的特征,并展示了均方误差与特征数量的关系曲线、Lambda与均方误差的变化关系曲线以及分类结果的ROC曲线。 文章还提供了一个Matlab实现的代码示例,包括数据的预处理、Lambda值的选取、特征的选择、模型的构建和评估等步骤。通过这个代码示例,读者可以更好地理解Lasso线性回归算法的实现过程。 最后,文章统计了每次迭代后选择的特征,并按照出现次数进行降序排序,展示了最可靠的特征。通过这个实验,可以进一步验证Lasso线性回归算法的有效性。

正文

Lasso线性回归(Least Absolute Shrinkage and Selection Operator)是一种能够进行特征选择和正则化的线性回归方法。其重要的思想是L1正则化:其基本原理为在损失函数中加上模型权重系数的绝对值,要想让模型的拟合效果比较好,就要使损失函数尽可能的小,因此这样会使很多权重变为0或者权重值变得尽可能小,这样通过减少权重、降低权重值的方法能够防止模型过拟合,增加模型的泛化能力。其中还有另外一种类似的方法叫做岭回归,其基本原理是在损失函数中加上含有模型权重系数的平方的惩罚项,其他原理基本相同。

Lasso线性回归的目标是最小化以下损失函数:

其中:

理论上来说当模型的损失函数越小时,构建的模型越接近真实分布,但是当模型的参数远远大于用来训练模型的数量的时候,很容易造成过拟合(模型学到的特征不是样本之间的共同特征,而是样本自身的特异性特征)。
通过L1正则化,可以约束线性模型中的权重系数,而且会减少特征量,保留权重系数有效的特征,同时能够减少系数之间的差距,让模型更具有泛化性。
当模型的损失函数达到最小的时候,惩罚项λ达到最优,模型的性能达到最优。

本文同样使用留一交叉验证的方法验证模型的分类性能,具体应用场景可以参考:机器学习(一)——递归特征消除法实现SVM(matlab)。
本文还提供了均方误差与特征数量的变化关系曲线、λ与均方误差的变化关系曲线以及分类结果的ROC曲线画法,如有需要请选择对应模块进行调整作图。

matlab实现代码如下:

labels = res(:, 1);  % 第一列是标签
features = res(:, 2:end);  % 后面的列是特征
features = zscore(features);   %归一化处理


%% 使用留一法交叉验证选择最优的 Lambda 值及其对应的特征
numSamples = size(features, 1);
lambda_values = logspace(-2, 2, 60); % 选择一系列 Lambda 值

mse_values = zeros(size(lambda_values)); % 存储每个 Lambda 值的均方误差
selected_features_all = cell(length(lambda_values), 1); % 存储每个 Lambda 值选择的特征

for i = 1:length(lambda_values)
    mse_fold = zeros(numSamples, 1);
    selected_feature = []; % 重置选择的特征
    
    for j = 1:numSamples
        % 划分训练集和验证集
        X_train = features([1:j-1, j+1:end], :); % 使用除了当前样本之外的所有样本作为训练集
        y_train = labels([1:j-1, j+1:end]); % 训练集标签
        X_valid = features(j, :); % 当前样本作为验证集
        y_valid = labels(j); % 验证集标签
        
        % 训练 LASSO 模型
        B = lasso(X_train, y_train, 'Lambda', lambda_values(i));
        
        % 在验证集上进行预测
        y_pred = X_valid * B;
        
        % 计算均方误差
        mse_fold(j) = mean((y_pred - y_valid).^2);
        
        % 将选择的特征添加到列表中
        selected_feature = [selected_feature; find(B ~= 0)]; % 使用分号进行垂直串联

    end
    
    % 计算当前 Lambda 值的平均均方误差
    mse_values(i) = mean(mse_fold);
   selected_feature= unique(selected_feature);%消除重复的特征
    % 保存每个 Lambda 值选择的特征
    selected_features_all{i} = selected_feature;
end

% 找到使均方误差最小的 Lambda 值

[min_mse, min_idx] = min(mse_values);
min_idx=min_idx-2;    %相当于当λ达到最优时,特征数量为0,所以要找最靠近最优λ的λ值来构建模型,此处可调
min_mse=mse_values(min_idx);
optimal_lambda = lambda_values(min_idx);

% 找到最优 Lambda 值对应的特征
selected_features_optimal = selected_features_all{min_idx};
selected_features_optimal = unique(selected_features_optimal);  %%%%%%%保留不同的特征,防止特征重复出现
% 显示最优的 Lambda 值及其对应的特征
disp(['最优的 Lambda 值:', num2str(optimal_lambda)]);




%% 对挑选出来的向量构建模型,并使用留一交叉验证计算其平均准确率

% 初始化变量来存储准确率
num_samples = size(features, 1);
accuracies = zeros(num_samples, 1);
Prediction_probability=zeros(num_samples, 1);%声明一个空数组用于储存预测的概率

% 遍历每个样本
for i = 1:num_samples
    % 留出第 i 个样本作为验证集,其余样本作为训练集
    X_train = features([1:i-1, i+1:end], selected_features_optimal); % 选择选出来的特征
    y_train = labels([1:i-1, i+1:end]);
    X_valid = features(i, selected_features_optimal);
    y_valid = labels(i);
    
    % 训练逻辑回归模型
    mdl = fitglm(X_train, y_train, 'Distribution', 'binomial', 'Link', 'logit');
    
    % 在验证集上进行预测
    y_pred = predict(mdl, X_valid);
    
    % 将预测概率转换为类别标签
    y_pred_label = round(y_pred);
    

    Prediction_probability(i)=y_pred;
    % 计算准确率
    accuracies(i) = (y_pred_label == y_valid);
end

% 计算平均准确率
average_accuracy = mean(accuracies);

% 显示平均准确率
disp(['平均准确率:', num2str(average_accuracy)]);


% 计算选取的特征个数
num_selected_features = cellfun(@length, selected_features_all);



% 绘制三维图像
figure;
plot3(lambda_values, mse_values, num_selected_features, 'b-', 'LineWidth', 2);
xlabel('λ值');
ylabel('均方误差');
zlabel('特征数量');
title('λ值与均方误差以及特征数量的变化关系');
grid on;



% 绘制 λ 和平均误差曲线
figure;
semilogx(lambda_values, mse_values, 'b-', 'LineWidth', 2);
xlabel('λ值');
ylabel('均方误差');
title('λ值与均方误差的变化关系');
grid on;


%计算ROC模型的相关参数
[fpr, tpr, thresholds] = perfcurve(labels, Prediction_probability, 1);

% 绘制 ROC 曲线
figure;
plot(fpr, tpr);
xlabel('假阳性率 (FPR)');
ylabel('真阳性率 (TPR)');
title('Lasso回归模型下ROC 曲线');

% 计算曲线下面积(AUC)
auc = trapz(fpr, tpr);
legend(['AUC = ' num2str(auc)]);


%%    统计每次迭代后选择的特征的,然后出一个排名,迭代过程中出现最多次的特征认为是可靠的特征

% 初始化一个空的结构数组
unique_elements_struct = struct('value', {}, 'count', {});

% 遍历每个单元格中的数组,统计每个元素出现的次数
for i = 1:numel(selected_features_all)
    current_array = selected_features_all{i};
    unique_elements = unique(current_array);
    for j = 1:numel(unique_elements)
        element = unique_elements(j);
        idx = find([unique_elements_struct.value] == element);
        if isempty(idx)
            % 如果元素不在结构数组中,则添加它
            unique_elements_struct(end+1).value = element;
            unique_elements_struct(end).count = sum(current_array == element);
        else
            % 否则更新该元素的计数
            unique_elements_struct(idx).count = unique_elements_struct(idx).count + sum(current_array == element);
        end
    end
end

% 按照出现次数进行降序排序
[~, sorted_indices] = sort([unique_elements_struct.count], 'descend');
unique_elements_struct = unique_elements_struct(sorted_indices);

% 显示结果
for i = 1:numel(unique_elements_struct)
    disp(['Element ', num2str(unique_elements_struct(i).value), ' appeared ', num2str(unique_elements_struct(i).count), ' times.']);
end

与机器学习(四)——Lasso线性回归预测构建分类模型(matlab)相似的内容:

机器学习(四)——Lasso线性回归预测构建分类模型(matlab)

Lasso线性回归(Least Absolute Shrinkage and Selection Operator)是一种能够进行特征选择和正则化的线性回归方法。其重要的思想是L1正则化:其基本原理为在损失函数中加上模型权重系数的绝对值,要想让模型的拟合效果比较好,就要使损失函数尽可能的小,因此这样

[转帖]Redis学习四(运维指南).

阅读目录 一、上线规划 二、常见运维操作 三、测试方法 回到顶部 一、上线规划 一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性。 redis 的运行机器 CPU 不求核数多,但求主频高,Cache大,因为 redis

【单片机入门】(四)应用层软件开发的单片机学习之路-----ESP32开发板PWM控制电机以及中断的使用

引言 各位大佬,晚上好啊,在上一篇博客中,我们讲了什么是UART串口通讯,以及使用USB转TTL使得单片机可以和c#上位机做一个串口通讯,接下来,为大家带来PWM的概念原理,以及实际案例,使用PWM对电机进行速度调制,因为本课程的最后是做一个红外遥控的智能小车,所以是需要电机四个,驱动四个,轮胎四个

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

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

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

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

机器学习笔记(3): 神经网络初步

神经网络应该由若干神经元组成。 前面的每一个神经元都会给到一个参数,将传递的所有参数看作一个向量 \(\vec x\),那么此神经元的净输入为: \[z = x \omega + b \]其中 \(\omega\) 称为权重向量。 这里认为 \(x\) 是行向量,而 \(\omega\) 是列向量。

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

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

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

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

[机器学习] 低代码机器学习工具PyCaret库使用指北

PyCaret是一个开源、低代码Python机器学习库,能够自动化机器学习工作流程。它是一个端到端的机器学习和模型管理工具,极大地加快了实验周期,提高了工作效率。PyCaret本质上是围绕几个机器学习库和框架(如scikit-learn、XGBoost、LightGBM、CatBoost、spaCy

机器学习数据顺序随机打乱:Python实现

本文介绍基于Python语言,实现机器学习、深度学习等模型训练时,数据集打乱的具体操作~