F1是合适的指标吗?那么F2 F3…F_beta呢?

使用F1分数进行二元分类的度量是很常见的。这就是所谓的调和均值。然而,更通用的F_beta评分标准可能更好地评估模型性能。那么F2 F3和F_beta呢?在这篇文章中,我们将回顾F指标。

介绍

根据许多数据科学家的说法,最可靠的模型性能度量是准确率。但是确定的模型指标不只有一个,还有很多其他指标。 例如,准确率可能很高,但是假阴性也很高。 另一个关键度量是当今机器学习中常见的F指标,用于评估模型性能。 它按比例结合了精度和召回率。 在这篇文章中,我们探讨了建议两者不平衡的不同方法。

混淆矩阵,精度和召回

混淆矩阵总结了ML中有监督学习算法的性能。它比一般的精度度量提供了更详细的分析,因此更有益。在混淆矩阵中,每一行表示预测类中的实例,每一列表示实际类中的实例。简化后的混淆矩阵包含两行两列,如前所述,其中:

我们定义两个重要的度量:精度:TP样本的数量除以所有P样本(真和假),召回:TP样本的数量除以(TP+FN)。

由于这两项措施都具有高度的重要性,因此需要一项措施将两者结合起来。因此,提出了精度和召回的调和均值,也称为F1分数。

F1分数

计算方式如下:

F1分数的主要优点(同时也是缺点)是召回和精度同样重要。在许多应用程序中,情况并非如此,应该使用一些权重来打破这种平衡假设。这种平衡假设可能适用于数据分布不均匀的情况,如大量正负数据。

F2和F3分数

使用加权平均值,我们可以很容易地得到F2分数:


同样,F3得分为:

F_beta分数

推广加权平均法得到的F beta测度,由:

这种方法允许我们定义召回比精度重要多少。在sklearn中使用F beta度量非常简单,请查看以下例子:

>>> from sklearn.metrics import fbeta_score
>>> y_true = [0, 1, 2, 0, 1, 2]
>>> y_pred = [0, 2, 1, 0, 0, 1]
>>> fbeta_score(y_true, y_pred, average='macro', beta=0.5)
0.23...
>>> fbeta_score(y_true, y_pred, average='micro', beta=0.5)
0.33...
>>> fbeta_score(y_true, y_pred, average='weighted', beta=0.5)
0.23...
>>> fbeta_score(y_true, y_pred, average=None, beta=0.5)
array([0.71..., 0.        , 0.        ])

总结

在这篇文章中,我回顾了F指标。我希望所提供的数据能够帮助那些处理分类任务的人,并帮助他们在使用准确性的同时使用F分数。

以下是·sklearn的文档,有兴趣的可以详细进行阅读:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.fbeta_score.html?highlight=f%20beta#sklearn.metrics.fbeta_score

作者:Barak Or

deephub翻译组

function [F1, F2, F3] = Calculate_Objectives(x) % 假设x为优化变量(例如机组出力、储能充放电功率等) % 经济性目标(公式16-18) C_grid = 0.5 * x(1); % 购电成本 C_gas = 0.3 * x(2); % 购气成本 C_om = 0.1 * sum(x(3:5)); % 维护成本(假设x3-x5为设备出力) C_carbon = 0.2 * x(6); % 碳交易成本(假设x6为碳排放量) F1 = C_grid + C_gas + C_om + C_carbon; % 低碳性目标(公式19-20) E_direct = 1.5 * x(2); % 直接碳排放(假设与天然气消耗量相关) E_loss = 0.05 * x(1); % 网损追溯碳排放 F2 = E_direct + E_loss; % 能效性目标(公式21-22) E_in = 0.9 * x(2) + 1.0 * x(7); % 输入端㶲(x7为风光电能输入) E_out = 1.0 * x(1) + 0.8 * x(8); % 输出端㶲(x8为热负荷) F3 = E_out / E_in; % 㶲效率 end pop_size = 30; % 种群数量 max_iter = 50; % 最大迭代次数 dim = 10; % 优化变量维度(假设10个决策变量) lb = zeros(1,dim); % 变量下限(假设非负) ub = 100 * ones(1,dim); % 变量上限(假设最大值为100) function positions = Tent_Initialization(pop_size, dim, lb, ub) positions = zeros(pop_size, dim); for i = 1:pop_size x = rand(); % 初始随机值 for j = 1:dim if x < 0.5 x = 2 * x; else x = 2 * (1 - x); end positions(i,j) = lb(j) + x * (ub(j) - lb(j)); % 映射到搜索空间 end end end function ref_point = TOPSIS_Reference(objectives, weights) % 标准化决策矩阵 norm_matrix = objectives ./ vecnorm(objectives, 2, 1); % 加权标准化矩阵 weighted_matrix = norm_matrix .* weights; % 正负理想解 PIS = max(weighted_matrix); NIS = min(weighted_matrix); % 计算距离 distance_PIS = sqrt(sum((weighted_matrix - PIS).^2, 2)); distance_NIS = sqrt(sum((weighted_matrix - NIS).^2, 2)); % 综合贴近度 closeness = distance_NIS ./ (distance_PIS + distance_NIS); [~, idx] = max(closeness); ref_point = objectives(idx, :); end function c = Nonlinear_Convergence(iter, max_iter) beta = 0.4; % 前期beta=0.4 if iter > max_iter/2 beta = 0.8; % 后期beta=0.8 end Cmax = 0.9; Cmin = 0.6; c = Cmin + (Cmax - Cmin) * (iter/max_iter)^beta; end % 主函数 function main() positions = Tent_Initialization(pop_size, dim, lb, ub); convergence = zeros(1, max_iter); for iter = 1:max_iter % 计算目标函数 objectives = zeros(pop_size, 3); for i = 1:pop_size [F1, F2, F3] = Calculate_Objectives(positions(i,:)); objectives(i,:) = [F1, F2, F3]; end % 熵权法计算权重 weights = Entropy_Weight(objectives); % 动态参考点选择 ref_point = TOPSIS_Reference(objectives, weights); % 更新灰狼位置 c = Nonlinear_Convergence(iter, max_iter); positions = Update_Positions(positions, ref_point, c); % 记录最优经济性值 convergence(iter) = min(objectives(:,1)); end % 绘制收敛曲线 plot(1:max_iter, convergence, &#39;LineWidth&#39;, 1.5); xlabel(&#39;迭代次数&#39;); ylabel(&#39;经济性目标值&#39;); title(&#39;改进灰狼算法收敛曲线&#39;); grid on; end % 调用主函数 main();修改此代码,使其能正确输出
最新发布
03-17
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值