2021-03-31

度量模型性能的指标与贝叶斯优化调参

概念介绍

度量分类模型的指标和回归的指标有很大的差异,首先是因为分类问题本身的因变量是离散变量,因此像定义回归的指标那样,单单衡量预测值和因变量的相似度可能行不通。其次,在分类任务中,我们对于每个类别犯错的代价不尽相同。那么怎么去评价分类模型,以及有哪些指标需要我们关注的呢。在正式介绍我们的分类模型之前有必要对一些概念进行简单的说明。
假设现在已经训练好一个机器学习模型,模型是关于判断普通人员是否携带新冠病毒。通常情况下模型会将乘客分为COVID阳性和阴性。在进行分类预测时,可能会出现四种类型的结果:
在这里插入图片描述

真阳性TP:当预测一个观察值属于一个类,而它实际上属于那个类。在这种情况下,也就是预测为COVID阳性并且实际上也是阳性的乘客预测值和真实值都为正例;当然这很糟糕,需要进行及时的治疗。
真阴性TN: 当你预测一个观察不属于一个类,它实际上也不属于那个类。在这种情况下,也就是预测为非COVID阳性(阴性)并且实际上不是COVID阳性(阴性)的乘客。此时需要佩戴好口罩做好防护措施。
假阳性FP: 当你预测一个观察值属于某个类,而实际上它并不属于该类时。在这种情况下,也就是预测为COVID阳性但实际上不是COVID阳性(阴性)的乘客。会造成一定
假阴性FN: 当你预测一个观察不属于一个类,而它实际上属于那个类。在这种情况下,也就是预测为非COVID阳性(阴性)并且实际上是COVID阳性的乘客。有可能是病毒潜藏的太深,另外这样的结果造成的代价有点高,是我们不想要的预期结果。

常用的评价指标

在这里插入图片描述
分类模型:
ACC:对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。
缺点: 在正负样本不平衡的情况下,这个指标有很大的缺陷。例如:给定一组测试样本共1100个实例,其中1000个是正类,剩余100个是负类。即使分类模型将所有实例均预测为正类,Accuracy也有90%以上,这样就没什么意义了。
PRE: 正确分类的正例个数占分类为正例的实例个数的比例。
RCC: 正确分类的正例个数占样本为正例的实例个数的比例。
ROC 曲线: 接收者操作特征(receiver operating characteristic),ROC曲线上每个点反映着对同一信号刺激的感受性。它给出了模型在0到1之间每一个可能的决策点的敏感性和特异性。对于具有概率输出的分类问题,阈值可以将概率输出转换为分类。
注意: 1.选择TPR高而FPR低的阈值 2.比较分类器的一种方法是测量ROC曲线下的面积面积越大分类效果较好。

贝叶斯超参数调优

Sequential model-based optimization (SMBO) 是贝叶斯优化的最简形式,其算法思路如下:在这里插入图片描述

  1. Input:
    f: 机器学习里的黑盒子,即输入一组超参数,得到一个输出值。
    X:是超参数搜索空间等。
    D:表示一个由若干对数据组成的数据集,每一对数组表示为(x,y),x是一组超参数,y表示该组超参数对应的结果。
    S:是Acquisition Function(采集函数),这个函数的作用是用来选择公式(1)中的x,后面会详细介绍这个函数。
    M:是对数据集D进行拟合得到的模型,可以用来假设的模型有很多种。这里介绍的为高斯模型。
  2. I n i t S a m p l e s ( f , x ) → D InitSamples(f,x)→D InitSamples(f,x)D
    这一步骤就是初始化获取数据集D=(x1,y1),…,(xn,yn),其中yi=f(xi),这些都是已知的。
  3. 循环选参数T次
    因为每次选出参数x后都需要计算f(x),而正如前面介绍的每计算一次函数f,都会消耗大量资源,所以一般需要固定选参次数(或者是函数评估次数)。
  4. p ( y ∣ x , D ) ← F I T M O D E L ( M , D ) p(y|x,D)←FITMODEL(M,D) p(yx,D)FITMODEL(M,D)
    首先我们预先假设了模型M服从高斯分布,且已知了数据集D,所以可以通过计算得出具体的模型具体函数表示。假设下图中的绿色实现就是基于数据集D经过计算后的服从高斯分布模型。
    因为我们已经假设 f − G P ( μ , K ) f-GP(μ,K) fGP(μ,K)。 (GP:高斯过程,μ:均值 K:协方差kernel,)。所以预测也是服从正态分布的,即有 p ( y ∣ x , D ) = N ( y ∣ μ , σ 2 ) p(y|x,D)=N(y|μ^,σ^2) p(yx,D)=N(yμ,σ2)
    在这里插入图片描述
  5. x i ← a r g m a x x ∈ X S ( X , p ( y ∣ X , D ) xi←argmaxx∈XS(X,p(y|X,D) xiargmaxxXS(X,p(yX,D)
    现在已经将假设的模型计算出来了,基于假设模型的基础上利用Acquisition Function选择选择X。
  6. y i ← f ( x i ) yi←f(xi) yif(xi)
    选出了一组超参数xi,将超参数带入网络中去进行训练,最后得到输出yi
  7. D ← D ⋃ ( x i , y i ) D←D⋃(xi,yi) DD(xi,yi)
    更新数据集
    注: x 表示的是超参数,而不是输入数据
    参考链接: https://zhuanlan.zhihu.com/p/93683454
    参考链接: https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java中的日期时间类来实现租金计划的生成。具体实现步骤如下: 1. 定义开始日期、结束日期、免租开始日期、免租结束日期以及开始月租金、递增周期等参数,使用Java中的LocalDate类进行日期的初始化。 2. 根据递增周期计算出一年内的月份数,并定义一个数组用来存储每个月的租金。 3. 对于每个月,判断是否在免租期内,如果是则该月租金为0,否则按照递增率计算出该月的租金。 4. 将每个月的租金存储到数组中,并输出计算过程。 下面是示例代码实现: ``` import java.time.LocalDate; import java.time.temporal.ChronoUnit; public class RentPlanGenerator { public static void main(String[] args) { LocalDate startDate = LocalDate.of(2021, 3, 1); // 租赁开始时间 LocalDate endDate = LocalDate.of(2022, 3, 1); // 租赁结束时间 LocalDate freeStartDate = LocalDate.of(2021, 3, 1); // 免租开始时间 LocalDate freeEndDate = LocalDate.of(2021, 3, 31); // 免租结束时间 double startRent = 600; // 开始月租金 double incrementRate = 0.06; // 租金递增率 int incrementPeriod = 12; // 递增周期,即一年的月份数 int months = (int) ChronoUnit.MONTHS.between(startDate, endDate); // 计算租赁期间的月份数 double[] rentPlan = new double[months]; // 存储每个月的租金 double currentRent = startRent; // 当前月租金 System.out.println("租赁开始时间:" + startDate); System.out.println("租赁结束时间:" + endDate); System.out.println("免租开始时间:" + freeStartDate); System.out.println("免租结束时间:" + freeEndDate); System.out.println("开始月租金:" + startRent); System.out.println("递增周期:" + incrementPeriod + "个月"); System.out.println(); System.out.println("计算过程:"); for (int i = 0; i < months; i++) { LocalDate currentDate = startDate.plusMonths(i); // 当前月份 if (currentDate.isAfter(freeStartDate) && currentDate.isBefore(freeEndDate.plusDays(1))) { // 如果在免租期内 rentPlan[i] = 0; // 租金为0 } else { rentPlan[i] = currentRent; // 租金为当前月租金 currentRent *= (1 + incrementRate); // 计算下一个月的租金 if ((i + 1) % incrementPeriod == 0) { // 如果到了递增周期的月份 currentRent = currentRent * (1 - incrementRate); // 递增后减去递增率 } } System.out.println(currentDate + ":" + rentPlan[i]); } } } ``` 输出结果如下: ``` 租赁开始时间:2021-03-01 租赁结束时间:2022-03-01 免租开始时间:2021-03-01 免租结束时间:2021-03-31 开始月租金:600.0 递增周期:12个月 计算过程: 2021-03-01:0.0 2021-04-01:636.0 2021-05-01:675.84 2021-06-01:717.72 2021-07-01:761.83 2021-08-01:808.32 2021-09-01:857.34 2021-10-01:909.09 2021-11-01:963.74 2021-12-01:1021.51 2022-01-01:1082.63 2022-02-01:1147.34 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值