逻辑回归:MNrval 和 Mnrfit 应用于多分类问题

本代码示例演示了如何使用 MATLAB 的 mnrfitmnrval 函数进行逻辑回归多分类,并使用 5 倍交叉验证评估模型性能。代码还包含了混淆矩阵的输出、各个类别的 ROC 曲线以及关键评价指标的计算和展示。

代码:

%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行

%% 设置随机种子
 rng(250); % 设置随机种子为0,确保结果可复现
%% 导入数据
res = xlsread('7变量170样本.xlsx');
% 获取输入特征和目标变量
x = res (:, 1:end-1);
y = res (:, end);
% 数据归一化
   [x, ps_input] = mapminmax(x, 0, 1);
    X = mapminmax('apply', x, ps_input);

% 将标签变量转换为分类变量
y = categorical(y);

% 将数据集分为训练集和测试集(5倍交叉验证)
cv = cvpartition(y, 'KFold', 5);
accuracy = zeros(cv.NumTestSets, 1);
precision = zeros(cv.NumTestSets, 1);
recall = zeros(cv.NumTestSets, 1);
f1score = zeros(cv.NumTestSets, 1);
AUC_micro = zeros(cv.NumTestSets, 1);

for i = 1:cv.NumTestSets
    X_train = X(training(cv, i), :);
    y_train = y(training(cv, i));
    X_test = X(test(cv, i), :);
    y_test = y(test(cv, i));

    % 训练逻辑回归模型
   mdl = mnrfit(X_train, y_train);

% 预测模型
y_pred = mnrval(mdl, X_test);
% 预测测试集标签
[~, y_pred] = max(y_pred, [], 2);
y_pred = categorical(y_pred);
    % 计算混淆矩阵
    C = confusionmat(y_test, y_pred);
    
    % 输出混淆矩阵
    disp('混淆矩阵:')
    disp(C)
    
    % 计算精度、召回率和 F1 分数
    TP_FP = sum(C, 1)';
    TP_FN = sum(C, 2);
    TP = diag(C);
    precision(i) = sum(TP ./ TP_FP) / numel(TP_FP);
    recall(i) = sum(TP ./ TP_FN) / numel(TP_FN);
    f1score(i) = 2 * precision(i) * recall(i) / (precision(i) + recall(i));

    % 计算准确率
    accuracy(i) = sum(y_pred == y_test) / numel(y_test);

    % 计算每个类别的真阳性率(TPR)和假阳性率(FPR)
    scores_all = categorical(y_pred); 
    Y_test_encoded = dummyvar(y_pred);
    scores_all = double(Y_test_encoded);
    [X1, Y1, ~, AUC1] = perfcurve(double(y_test)==1, scores_all(:, 1), 1);
    [X2, Y2, ~, AUC2] = perfcurve(double(y_test)==2, scores_all(:, 2), 1);
    [X3, Y3, ~, AUC3] = perfcurve(double(y_test)==3, scores_all(:, 3), 1);
    [X4, Y4, ~, AUC4] = perfcurve(double(y_test)==4, scores_all(:, 4), 1);

    % 计算微平均AUC
    AUC_micro(i) = (AUC1 + AUC2 + AUC3 + AUC4) / 4;

    % 绘制ROC曲线
    figure;
    subplot(2, 2, 1);
    plot(X1, Y1);
    xlabel('False Positive Rate');
    ylabel('True Positive Rate');
    title(['Class 1 - AUC: ' num2str(AUC1)]);
    grid on;

    subplot(2, 2, 2);
    plot(X2, Y2);
    xlabel('False Positive Rate');
    ylabel('True Positive Rate');
    title(['Class 2 - AUC: ' num2str(AUC2)]);
    grid on;

    subplot(2, 2, 3);
    plot(X3, Y3);
    xlabel('False Positive Rate');
    ylabel('True Positive Rate');
    title(['Class 3 - AUC: ' num2str(AUC3)]);
    grid on;

    subplot(2, 2, 4);
    plot(X4, Y4);
    xlabel('False Positive Rate');
    ylabel('True Positive Rate');
    title(['Class 4 - AUC: ' num2str(AUC4)]);
    grid on;
% 输出评价指标
fprintf('Accuracy %d: %f
', i, accuracy(i));
fprintf('Precision %d: %f
', i, precision(i));
fprintf('Recall %d: %f
', i, recall(i));
fprintf('F1 score %d: %f
', i, f1score(i));
fprintf('Micro-average AUC %d: %f
', i, AUC_micro(i));
    
end

% 输出评价指标的平均值
fprintf('Average Accuracy: %f
', mean(accuracy));
fprintf('Average Precision: %f
', mean(precision));
fprintf('Average Recall: %f
', mean(recall));
fprintf('Average F1 score: %f
', mean(f1score));
fprintf('Average Micro-average AUC: %f
', mean(AUC_micro));

代码解释

  1. 数据准备:
    • 导入数据集 7变量170样本.xlsx,提取特征和目标变量。
    • 使用 mapminmax 函数对特征进行归一化处理。
    • 将目标变量转换为分类变量。
  2. 交叉验证:
    • 使用 cvpartition 函数将数据集划分为 5 个交叉验证的子集。
  3. 模型训练和预测:
    • 使用 mnrfit 函数训练逻辑回归模型。
    • 使用 mnrval 函数对测试集进行预测。
  4. 评价指标:
    • 计算混淆矩阵,并输出结果。
    • 计算精度、召回率、F1 分数和准确率。
    • 计算每个类别的 ROC 曲线和 AUC 值。
    • 计算微平均 AUC。
    • 输出每个子集的评价指标和平均评价指标。

总结

该代码示例展示了如何使用 mnrfitmnrval 函数进行逻辑回归多分类,并使用 5 倍交叉验证评估模型性能。代码包含了完整的流程,并提供了清晰的注释,方便理解和学习。

进一步学习

  • 您可以尝试调整代码中的参数,例如交叉验证的折数、正则化参数等,以优化模型性能。
  • 您可以参考 MATLAB 文档学习更多关于 mnrfitmnrval 函数的使用方法和参数设置。
  • 您可以探索其他分类算法,例如支持向量机、决策树等,并比较它们在该数据集上的性能。

原文地址: https://www.cveoy.top/t/topic/hKJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录