发动态
综合 最新发布 最新回复
图文
列表
置顶
HDI高密度互连板正式上线
上期我们介绍了Python的环境配置,本期我们介绍ROC曲线以及如何绘制ROC曲线。 ROC(Receiver Operating Characteristic)曲线是用于评估二分类模型性能的一种工具。它显示了在不同阈值下,真正例率(True Positive Rate,也称为灵敏度或召回率)与假正例率(False Positive Rate)之间的权衡关系。当我们讨论ROC曲线时,可以想象一个二分类模型,例如医学诊断中的癌症检测。我们用“正例”表示病患患有癌症,而“负例”表示患者没有癌症。真正例率 (TPR,也叫灵敏度或召回率): 假设我们的模型通过某个阈值,成功地找出了患有癌症的病患。 这就是一个真正例。 TPR告诉我们在所有实际患有癌症的病患中,有多少被成功地找出来了。 假正例率 (FPR): 然而,模型可能会犯错误,将一些实际上是健康的人错误地判定为患有癌症。 这就是一个假正例。 FPR告诉我们在所有实际健康的人中,有多少被错误地认为患有癌症。 现在 ,我们可以考虑不同的 阈值。 如果我们把阈值设置得很低,模型可能会把很多人都判定为患有癌症,这会增加TPR,但同时也增加了FPR。 反之,如果我们把阈值设置得很高,模型只会把那些非常确信患有癌症的人判定为患有癌症,这样会减少FPR,但可能也减少了TPR。ROC曲线就是在不同阈值下,TPR和FPR之间的权衡。如果你能画出ROC曲线,你可以看到在整个权衡范围内的模型表现情况。比如,一条理想的ROC曲线可能如下图所示: 这个图形展示了在不同阈值下,TPR和FPR的变化。曲线越靠近左上角,说明模型在保持高召回率的同时,控制假正例率的能力越好。ROC曲线正是通过不断移动分类器的“阈值”来生成曲线上的一组关键点 (也可以参考老师给的这篇博客:机器学习基础(1)- ROC曲线理解 - 简书 (jianshu.com)可能讲的更清晰一点) import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import roc_curve, auc 我们导入我们需要使用的库,我们使用import导入特定的库,使用from从特定关键字导入,使用as作为库的别称。y_true = np.random.randint(2, size=100) y_scores = np.random.rand(100) 我们使用random生成随机的一百组数据。fpr, tpr, thresholds = roc_curve(y_true, y_scores) 接着调用roc_curve代入我们生成的数 据 计算 ROC曲线的参数。roc_auc = auc(fpr, tpr) 计算ROC曲线的面积。plt.figure(figsize=(8, 8)) plt.plot(fpr, tpr, label='ROC曲线(AUC = {:.2f})'.format(roc_auc)) plt.plot([0, 1], [0, 1], linestyle='--', label='数据') plt.xlabel('FPR') plt.ylabel('TPR') plt.legend(loc='lower right') plt.show() 最后利用matplotlib生成我们的图像并显示就完成了我们的ROC曲线的绘制。
人工智能导论(1.2)——ROC曲线介绍以及绘制ROC曲线
嘉立创PCB
上一期我们实现了串口助手收发数据之后,这期我们为我们的串口助手加上我们的波形图功能。 我们在前面有一期中介绍如何在C#中使用chart画图库 本期我们利用我们上一期制作的串口助手来实现我们的串口示波器。 准备工作 首先我们在上一期的基础上加上我们的chart库using System.Windows.Forms.DataVisualization.Charting; 其次,简单的布置一下我们的界面。 其中图表和按钮的默认状态是隐藏的,当我们勾选波形显示时显示。 private void ChartShow_CheckedChanged(object sender, EventArgs e) { if (ChartShow.Checked == true) { Receive.Height = 680/2; chart.Show(); ClearChart.Show(); } else { Receive.Height = 680; chart.Hide(); ClearChart.Hide(); } } 我们勾选按钮的时候,将接收区的高度减少一半,让按键和图表显形。 数据解析与存放 我们希望我们的数据格式是类似“a:xxx,b:xxx”等等。因此,我们需要解析我们的数据private Dictionary<string, string> ParseData(string input) {             Dictionary<string, string> result = new Dictionary<string, string>(); // 按逗号分割字符串             string[] pairs = input.Split(','); foreach (string pair in pairs) { // 再按冒号分割键值对                 string[] keyValue = pair.Split(':'); if (keyValue.Length == 2) { string key = keyValue[0].Trim();                     string value = keyValue[1].Trim(); result[key] = value; } } return result; } 我们定义一个解析键值对函数,利用逗号分隔字符串,冒号分隔将解析的结果返回,这样子我们就可以获取我们的键值对。 // 添加解析数据的代码 string[] lines = data.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); lines = lines.Skip(1).Take(lines.Length - 2).ToArray(); 由于我们的数据可能有很多行,因此我们在更新图表的代码中需要将数据按照换行符分开,并且由于第一行和最后一行的数据可能不完整,我们需要删除第一行和最后一行的数据。foreach (string line in lines) {     // 对每一行进行解析     Dictionary<string, string> parsedData = ParseData(line);     foreach (var kvp in parsedData) {        // 继续处理解析后的数据       int existingIndex = chart.Series.IndexOf(kvp.Key);       if (existingIndex != -1)       {          //如果该系列的图表存在           chart.Series[existingIndex].Points.AddXY(chart.Series[existingIndex].Points.Count, double.Parse(kvp.Value));      } else { //如果该系列的图表不存在 string seriesName = new string(kvp.Key.TakeWhile(char.IsLetter).ToArray()); // 获取字符串中的所有字母前缀 Series newSeries = new Series(seriesName); newSeries.ChartType = SeriesChartType.Spline; // 设置图表类型为 Spline newSeries.Points.AddXY(0, double.Parse(kvp.Value)); chart.Series.Add(newSeries); } } } 我们将我们解析的数据放入图表,按照数据的前缀来划分数据。 判断图表是否存在,如果不存在就添加相应的系列。 效果展示 接着让我们看看效果
基于C#的软件大杂烩(1.2)——串口示波器
嘉立创PCB
1-32层pcb打样,真A级板材,最快12小时出货,自营制造,品质可靠!
打赏记录
服务时间:周一至周六 9::00-18:00 · 联系地址:中国·深圳(福田区商报路奥林匹克大厦27楼) · 媒体沟通:pr@jlc.com · 集团介绍
移动社区