逻辑回归:MNrval 和 Mnrfit 应用于多分类问题
逻辑回归:MNrval 和 Mnrfit 应用于多分类问题
本代码示例演示了如何使用 MATLAB 的 mnrfit 和 mnrval 函数进行逻辑回归多分类,并使用 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));
代码解释
- 数据准备:
- 导入数据集
7变量170样本.xlsx,提取特征和目标变量。 - 使用
mapminmax函数对特征进行归一化处理。 - 将目标变量转换为分类变量。
- 导入数据集
- 交叉验证:
- 使用
cvpartition函数将数据集划分为 5 个交叉验证的子集。
- 使用
- 模型训练和预测:
- 使用
mnrfit函数训练逻辑回归模型。 - 使用
mnrval函数对测试集进行预测。
- 使用
- 评价指标:
- 计算混淆矩阵,并输出结果。
- 计算精度、召回率、F1 分数和准确率。
- 计算每个类别的 ROC 曲线和 AUC 值。
- 计算微平均 AUC。
- 输出每个子集的评价指标和平均评价指标。
总结
该代码示例展示了如何使用 mnrfit 和 mnrval 函数进行逻辑回归多分类,并使用 5 倍交叉验证评估模型性能。代码包含了完整的流程,并提供了清晰的注释,方便理解和学习。
进一步学习
- 您可以尝试调整代码中的参数,例如交叉验证的折数、正则化参数等,以优化模型性能。
- 您可以参考 MATLAB 文档学习更多关于
mnrfit和mnrval函数的使用方法和参数设置。 - 您可以探索其他分类算法,例如支持向量机、决策树等,并比较它们在该数据集上的性能。
原文地址: https://www.cveoy.top/t/topic/hKJ 著作权归作者所有。请勿转载和采集!