计算和可视化准确度、F值、混淆矩阵和ROC曲线

简介: 计算和可视化准确度、F值、混淆矩阵和ROC曲线

基于MATLAB的分类模型评估,包含准确度、F值、混淆矩阵和ROC曲线的计算与可视化,结合多分类与二分类场景:


一、基础指标计算与混淆矩阵可视化

%% 输入数据准备
trueLabels = [1 0 1 1 0 1 0 0 1 0]; % 真实标签(示例数据)
predictedLabels = [1 0 0 1 0 1 1 0 1 0]; % 预测标签
scores = [0.92, 0.15, 0.45, 0.88, 0.22, 0.73, 0.31, 0.66, 0.89, 0.18]; % 预测得分(二分类概率)

%% 1. 准确度计算
accuracy = sum(trueLabels == predictedLabels) / numel(trueLabels);
fprintf('准确度: %.2f%%
', accuracy*100);

%% 2. F值计算(二分类)
C = confusionmat(trueLabels, predictedLabels);
TP = C(2,2); TN = C(1,1);
FP = C(1,2); FN = C(2,1);
precision = TP/(TP+FP);
recall = TP/(TP+FN);
F1 = 2*(precision*recall)/(precision+recall);
fprintf('F1值: %.3f
', F1);

%% 3. 混淆矩阵可视化(支持多分类)
figure;
cm = confusionmat(trueLabels, predictedLabels);
cmChart = confusionchart(cm);
cmChart.Title = '混淆矩阵';
cmChart.XLabel = '预测类别';
cmChart.YLabel = '真实类别';
colormap([0.2 0.7 0.4; 0.9 0.1 0.1]); % 自定义颜色(绿/红)

二、ROC曲线与AUC计算(二分类)

%% ROC曲线绘制与AUC计算
[~, ~, ~, auc] = perfcurve(trueLabels, scores, 1); % 自动计算阈值点
figure;
plot(perfcurve(trueLabels, scores, 1)); % 自动生成FPR-TPR曲线
hold on;
plot([0 1], [0 1], 'r--'); % 随机猜测参考线
xlabel('假阳性率 (FPR)');
ylabel('真阳性率 (TPR)');
title(sprintf('ROC曲线 (AUC = %.3f)', auc));
grid on;

%% 手动计算ROC曲线(教学示例)
thresholds = unique(scores);
[TPR, FPR] = deal(zeros(length(thresholds),1));
for i = 1:length(thresholds)
    pred = scores >= thresholds(i);
    TP = sum(pred & (trueLabels==1));
    FP = sum(pred & (trueLabels==0));
    TN = sum(~pred & (trueLabels==0));
    FN = sum(~pred & (trueLabels==1));
    TPR(i) = TP/(TP+FN);
    FPR(i) = FP/(FP+TN);
end
figure;
plot(FPR, TPR, 'b-o', 'LineWidth',2);
hold on;
plot([0 1], [0 1], 'r--');
xlabel('FPR'); ylabel('TPR');
title('手动计算ROC曲线');
grid on;

三、多分类扩展方案

%% 多分类混淆矩阵(以3分类为例)
trueLabels = [1 2 3 1 2 3 1 2 3 1];
predictedLabels = [1 2 3 2 2 3 1 1 3 1];
cm = confusionmat(trueLabels, predictedLabels);
figure;
cmPlot = confusionchart(cm);
cmPlot.ClassNames = {'Class1','Class2','Class3'};
cmPlot.Title = '多分类混淆矩阵';
cmPlot.XLabel = '预测类别';
cmPlot.YLabel = '真实类别';
cmPlot.Colors = parula(3); % 使用渐变色

%% 多分类ROC曲线(One-vs-All方法)
numClasses = 3;
fpr = zeros(numClasses, 100);
tpr = zeros(numClasses, 100);
for cls = 1:numClasses
    binaryLabels = (trueLabels == cls);
    [~, ~, ~, auc] = perfcurve(binaryLabels, scores, 1);
    [X,Y] = perfcurve(binaryLabels, scores, 1);
    fpr(cls,:) = X;
    tpr(cls,:) = Y;
end
figure;
hold on;
for cls = 1:numClasses
    plot(fpr(cls,:), tpr(cls,:), 'DisplayName', sprintf('Class%d', cls));
end
plot([0 1], [0 1], 'k--');
xlabel('FPR'); ylabel('TPR');
title('多分类ROC曲线(OvA)');
legend;
grid on;

参考代码 计算和可视化准确度、F值、混淆矩阵和ROC曲线的matlabd代码

四、关键参数说明

  1. 输入数据要求
    • trueLabels:真实标签(数值型或分类变量)
    • predictedLabels:模型预测的类别标签
    • scores:模型输出的概率/得分(需为数值型向量)
  2. 性能优化建议
    • 使用crossval进行交叉验证避免过拟合
    • 通过fitcsvm/fitctree等函数调整模型超参数
    • 对不平衡数据使用classifCost设置类别权重

五、结果解读

指标 理想值 判断标准
准确度 100% 高准确度需结合业务场景验证
F1值 1.0 平衡精确率与召回率的综合指标
AUC值 1.0 >0.9优秀,>0.8良好
混淆矩阵 对角线高 对角线元素代表正确分类数

六、应用场景示例

  1. 医疗诊断:通过AUC评估癌症筛查模型的整体性能
  2. 欺诈检测:用F1值平衡欺诈识别率与误报率
  3. 自动驾驶:混淆矩阵分析信号灯识别错误类型

完整代码可通过替换示例数据适配实际项目,建议结合MATLAB的Classification Learner工具箱进行模型迭代优化。

相关文章
|
存储 数据采集 数据可视化
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
17008 1
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
|
5月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
319 15
|
5月前
|
数据采集 监控 前端开发
如何开发生产小工单中的数字化看板(附架构图+流程图+代码参考)
本文介绍了如何通过数字化看板优化生产小工单管理。内容涵盖生产小工单的概念、数字化看板的功能模块(如生产监控、执行统计、数据统计、员工工资统计)、业务流程设计、技术架构与开发技巧,并提供代码示例,助力企业实现高效、可视化的生产管理。
|
5月前
|
程序员 编译器 C#
C#语言中使用"using"关键字的介绍
以上就是 C# 中 "using" 关键字的主要用法。了解并熟练应用这个关键字,对于提高代码质量、解决命名冲突、管理资源都有着重要的作用。它是 C# 编程中不可或缺的一部分,无论是对初学者还是有经验的开发者而言,掌握它都是提高编写高效、清晰、可维护代码的关键。
202 7
|
5月前
|
数据采集 监控 数据处理
基于STM32实现多模态生物电信号采集与传输
基于STM32实现多模态生物电信号采集与传输
149 0
|
5月前
|
缓存 Java 数据库连接
怎么使用注解开启二级缓存,注解应该放在那里?
在 MyBatis 中,使用 `@CacheNamespace` 注解可开启二级缓存,该注解应添加在 Mapper 接口上。通过配置 `eviction`、`flushInterval`、`size` 等参数,可以控制缓存行为。此外,实体类需实现 `Serializable` 接口以确保缓存正常工作。
131 1
|
机器学习/深度学习 Python
【Python 机器学习专栏】混淆矩阵与 ROC 曲线分析
【4月更文挑战第30天】本文介绍了机器学习中评估模型性能的两种工具——混淆矩阵和ROC曲线。混淆矩阵显示了模型在不同类别上的预测情况,包括真正例、假正例、真反例和假反例,帮助评估模型错误类型和数量。ROC曲线则通过假正率和真正率展示了模型的二分类性能,曲线越接近左上角,性能越好。文章还提供了Python中计算混淆矩阵和ROC曲线的代码示例,强调它们在模型选择、参数调整和理解模型行为中的应用价值。
587 0
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
255 0
|
12月前
|
JSON 算法 Java
Nettyの网络聊天室&扩展序列化算法
通过本文的介绍,我们详细讲解了如何使用Netty构建一个简单的网络聊天室,并扩展序列化算法以提高数据传输效率。Netty的高性能和灵活性使其成为实现各种网络应用的理想选择。希望本文能帮助您更好地理解和使用Netty进行网络编程。
174 12
|
数据可视化
混淆矩阵的生成
混淆矩阵的生成

热门文章

最新文章