2019-06-20 12:04:09 weixin_31866177 阅读数 893
  • Kubernetes 实战系列

    Kubernetes(KS8) 实战系列教程,该课程将对Kubernetes的Node、Pod、Replication Controller、Service等基本核心概念进行讲解,这些组件共同构成了Kubernetes的系统框架和计算模型。通过对它们进行灵活的组合,用户就可以快速、方便地对容器集群进行配置、创建和管理。

    9522 人正在学习 去看看 CSDN讲师

KS检验-风控角度

分类模型评判指标 - KS曲线与KS值

从统计角度,我们知道KS是分析两组数据分布是否相同的检验指标在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布。好的信用风控模型一般从准确性、稳定性和可解释性来评估模型。

一般来说。好人样本的分布同坏人样本的分布应该是有很大不同的,KS正好是有效性指标中的区分能力指标:KS用于模型风险区分能力进行评估,KS指标衡量的是好坏样本累计分布之间的差值。好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强。

横轴:阈值or数据集百分比

纵轴:TPR(真正率)与FPR(假正率)

实现:

def compute_ks(data1,data2):
    df1 = DataFrame()
    df1['pred'] = data2
    df1['label'] = data1
    # 按照样本为正样本的概率值升序排序,也即坏样本的概率从高到低排序
    sorted_list = df1.sort_values(['pred'], ascending=[True])
    # print(sorted_list)
    """
      pred     label
17  0.055966    0.0
8   0.056266    0.0
14  0.063441    0.0
15  0.066217    0.0
0   0.070942    0.0
4   0.074102    0.0
3   0.087055    0.0
2   0.090387    0.0
18  0.092003    1.0
6   0.098286    0.0
16  0.105280    0.0
10  0.107256    0.0
12  0.123415    0.0
5   0.137829    0.0
7   0.139731    0.0
1   0.159905    0.0
13  0.180385    0.0
9   0.203199    0.0
11  0.217903    0.0
    """
    total_good = sorted_list['label'].sum() # label为1的样本有多少个,真实为1的样本
    # print(sorted_list['label'])
    # print(total_good)
    total_bad = sorted_list.shape[0] - total_good # label为0的样本有多少个,真实为0的样本

    max_ks = 0.0
    good_count = 0.0
    bad_count = 0.0
    for index, row in sorted_list.iterrows(): #按照标签和每行拆开
        # print(index)
        # print('-'*5)
        # print(row)
        """
        index: 17
        row:
            pred     0.055966
            label    0.000000
        """
        if row['label'] == 0:
            bad_count += 1
        else:
            good_count += 1
        val = abs(bad_count/total_bad - good_count/total_good)
        max_ks = max(max_ks, val)
    return max_ks



def cal_auc(labels, preds):
    """
    先排序,然后统计有多少正负样本对满足:正样本预测值>负样本预测值, 再除以总的正负样本对个数
    复杂度 O(NlogN), N为样本数
    """
    n_pos = sum(labels)
    n_neg = len(labels) - n_pos
    total_pair = n_pos * n_neg

    labels_preds = zip(labels, preds)
    labels_preds = sorted(labels_preds, key=lambda x: x[1])
    accumulated_neg = 0
    satisfied_pair = 0
    for i in range(len(labels_preds)):
        if labels_preds[i][0] == 1:
            satisfied_pair += accumulated_neg
        else:
            accumulated_neg += 1

    return satisfied_pair / float(total_pair)

def approximate_auc(labels, preds, n_bins=100):
    """
    近似方法,将预测值分桶(n_bins),对正负样本分别构建直方图,再统计满足条件的正负样本对
    复杂度 O(N)
    这种方法有什么缺点?怎么分桶?

    """
    n_pos = sum(labels)
    n_neg = len(labels) - n_pos
    total_pair = n_pos * n_neg

    pos_histogram = [0 for _ in range(n_bins)]
    neg_histogram = [0 for _ in range(n_bins)]
    bin_width = 1.0 / n_bins
    for i in range(len(labels)):
        nth_bin = int(preds[i] / bin_width)
        if labels[i] == 1:
            pos_histogram[nth_bin] += 1
        else:
            neg_histogram[nth_bin] += 1

    accumulated_neg = 0
    satisfied_pair = 0
    for i in range(n_bins):
        satisfied_pair += (pos_histogram[i] * accumulated_neg + pos_histogram[i] * neg_histogram[i] * 0.5)
        accumulated_neg += neg_histogram[i]

    return satisfied_pair / float(total_pair)

掉包侠的结果好像是错的,逃不掉自己写

# official
def calc_ks(y_true, y_prob, n_bins=10):
    percentile = np.linspace(0, 100, n_bins + 1).tolist()
    bins = [np.percentile(y_prob, i) for i in percentile]
    bins[0] = bins[0] - 0.01
    bins[-1] = bins[-1] + 0.01
    binids = np.digitize(y_prob, bins) - 1
    y_1 = sum(y_true == 1)
    y_0 = sum(y_true == 0)
    bin_true = np.bincount(binids, weights=y_true, minlength=len(bins))
    bin_total = np.bincount(binids, minlength=len(bins))
    bin_false = bin_total - bin_true
    true_pdf = bin_true / y_1
    false_pdf = bin_false / y_0
    true_cdf = np.cumsum(true_pdf)
    false_cdf = np.cumsum(false_pdf)
    ks_list = np.abs(true_cdf - false_cdf).tolist()
    ks = max(ks_list)
    return ks


# 在网上看其他人实现的方案,但是感觉是错的,和我们的问题可能有出入,
# 等之后再研究吧
from scipy.stats import ks_2samp
get_ks = lambda y_pred,y_true: ks_2samp(y_pred[y_true==1], y_pred[y_true!=1]).statistic
get_ks(x,y)
# mine
ks = ks_2samp(y, y_pred)
print("ks:",ks.statistic)

首先我们有一份样本数据,包含两个指标,1.label(0,1) 2.信用分(假定是0到5)

label指标属于原始数据,有过逾期的用户为0, bad clients; 信用一直良好的为1,good clients信用分为预测指标,模型输出数据(0到5)。

作为一个常识,我们应该知道信用分的分布应该符合正态分布,也就是说接近5的人和接近0的人应该是极少极少的,大部分都在2到4之间。

信用分是0到5,那现在想知道,如果我们要贷款给用户,那把钱贷给信用分为多少的人呢?
在选择这个值的时候,我们需要考虑是希望能把钱贷给尽可能多的好人和尽可能少的坏人。如果我们选择信用分大于4的人,也许确实能过滤掉大部分坏人,但好人也被过滤掉了,用户也就少了。
这个时候我们就需要ks值了。

下面解释ks值:

f(bad) 预测为负,真实为负除以所有真实负样本数。假正例率:

  • FPRate的意义是所有真实类别为0的样本中,预测类别为1的比例。(好人为1)

f(good) 预测为负,真实为正除以所有真实正样本数。真正例率:

  • TPRate的意义是所有真实类别为1的样本中,预测类别为1的比例。(坏人为0)

这里的负指的是bad clients,也就是逾期用户。而我们的目标就是希望找到一个值,区分bad和good用户,使f(bad)尽可能大,f(good)尽可能小。

可以画出如下类似的图:

横坐标代表信用分,纵坐标代表比率。 两条曲线分别是f(bad) 和 f(good)

极端情况下,我们假设信用分小于5的都是坏人,这样所有的人都是坏人了f(bad)=1了,但f(good)=1(也就是右上角的两个点),表明模型还是很不好的,把好人也当坏人了。 而ks值在这里恰好可以找到一个信用分点,满足上述的条件:f(bad)大,f(good)小。

如图所示,在横坐标2.5处,找到了我们的ks值0.4,在这个点我们找到了70%的真实坏人,而且只把30%的好人误认为是坏人了。 ks=70% - 30%; 相对于其它点来说已经是最好的了。

所以,ks值是越大越好的,再考虑极端情况,如果有模型能找到所有的坏人(也就是f(bad)=100%),并且没有误判任何一个好人f(good)=0,那么它的ks值就=1了,属于完美模型了。 当然,对于风控模型,因为信用分几乎都符合正态分布,是不可能出现这种情况的,也只能说越大越好。

def ks_2samp(data1, data2):
    """
    Computes the Kolmogorov-Smirnov statistic on 2 samples.
    This is a two-sided test for the null hypothesis that 2 independent samples
    are drawn from the same continuous distribution.

功能:计算ks值,输出对应分割点和累计分布函数曲线图
输入值:
data: 而为数组或dataframe,包括模型得分和真实的标签
score_col:一维数组或series,代表模型得分(一般为预测正类的概率)
class_col:一维数组或series,代表真实的标签((0,1)or(-1,1))
输出值:
ks:ks值
cdf_df:好坏人累积概率分布以及其差值gap

    Parameters
    ----------
    data1, data2 : sequence of 1-D ndarrays
        two arrays of sample observations assumed to be drawn from a continuous
        distribution, sample sizes can be different
    Returns
    -------
    statistic : float
        KS statistic
    pvalue : float
        two-tailed p-value
    Notes
    -----
    This tests whether 2 samples are drawn from the same distribution. Note
    that, like in the case of the one-sample K-S test, the distribution is
    assumed to be continuous.
    This is the two-sided test, one-sided tests are not implemented.
    The test uses the two-sided asymptotic Kolmogorov-Smirnov distribution.
    If the K-S statistic is small or the p-value is high, then we cannot
    reject the hypothesis that the distributions of the two samples
    are the same.
    Examples
    --------
    >>> from scipy import stats
    >>> np.random.seed(12345678)  #fix random seed to get the same result
    >>> n1 = 200  # size of first sample
    >>> n2 = 300  # size of second sample
    For a different distribution, we can reject the null hypothesis since the
    pvalue is below 1%:
    >>> rvs1 = stats.norm.rvs(size=n1, loc=0., scale=1)
    >>> rvs2 = stats.norm.rvs(size=n2, loc=0.5, scale=1.5)
    >>> stats.ks_2samp(rvs1, rvs2)
    (0.20833333333333337, 4.6674975515806989e-005)
    For a slightly different distribution, we cannot reject the null hypothesis
    at a 10% or lower alpha since the p-value at 0.144 is higher than 10%
    >>> rvs3 = stats.norm.rvs(size=n2, loc=0.01, scale=1.0)
    >>> stats.ks_2samp(rvs1, rvs3)
    (0.10333333333333333, 0.14498781825751686)
    For an identical distribution, we cannot reject the null hypothesis since
    the p-value is high, 41%:
    >>> rvs4 = stats.norm.rvs(size=n2, loc=0.0, scale=1.0)
    >>> stats.ks_2samp(rvs1, rvs4)
    (0.07999999999999996, 0.41126949729859719)
    """
    data1 = np.sort(data1)
    data2 = np.sort(data2)
    n1 = data1.shape[0]
    n2 = data2.shape[0]
    data_all = np.concatenate([data1, data2])
    cdf1 = np.searchsorted(data1, data_all, side='right') / (1.0*n1)
    cdf2 = np.searchsorted(data2, data_all, side='right') / (1.0*n2)
    d = np.max(np.absolute(cdf1 - cdf2))
    # Note: d absolute not signed distance
    en = np.sqrt(n1 * n2 / float(n1 + n2))
    try:
        prob = distributions.kstwobign.sf((en + 0.12 + 0.11 / en) * d)
    except:
        prob = 1.0

    return Ks_2sampResult(d, prob)

在实际情况下,我们一般计算违约概率的ks值,这时是不存在NAN值的。所以以上三种方法计算ks值均可。但是当我们计算单变量的ks值时,有时数据质量不好,存在NAN值时,继续采用ks_calc_auc和ks_calc_2samp就会存在问题。

解决办法有两个 1. 提前去除数据中的NAN值 2. 直接采用ks_calc_cross计算。 


参考:

houhaichao830

4.4.2分类模型评判指标(四) - ROC,AUC,GINI,KS,Lift,Gain,MSE总结

python绘制 

auc和ks是强相关的指标

互联网金融:Vintage的应用

astype转成一样的浮点数才可以进行减法操作!!!要dtype查看,之前这里报错辽~?

2018-12-06 16:22:35 zwqjoy 阅读数 8457
  • Kubernetes 实战系列

    Kubernetes(KS8) 实战系列教程,该课程将对Kubernetes的Node、Pod、Replication Controller、Service等基本核心概念进行讲解,这些组件共同构成了Kubernetes的系统框架和计算模型。通过对它们进行灵活的组合,用户就可以快速、方便地对容器集群进行配置、创建和管理。

    9522 人正在学习 去看看 CSDN讲师

目录

 

背景介绍

一 ROC曲线和AUC值

二 KS曲线

三 GINI系数

四 Lift , Gain

五 模型稳定度指标PSI

 


参考另一篇:[机器学习] 性能评估指标(精确率、召回率、ROC、AUC) 

背景介绍

在模型建立之后,必须对模型的效果进行评估,因为数据挖掘是一个探索的过程,评估-优化是一个永恒的过程。在分类模型评估中,最常用的两种评估标准就是KS值和GINI, AUC值.可能有人会问了,为什么不直接看正确率呢?你可以这么想,如果一批样本中,正样本占到90%,负样本只占10%,那么我即使模型什么也不做,把样本全部判定为正,也能有90%的正确率咯?所以,用AUC值够保证你在样本不均衡的情况下也能准确评估模型的好坏,而KS值不仅能告诉你准确与否,还能告诉你模型对好坏客户是否有足够的区分度。

 

这里先整体给大家一个直观的介绍。

概括:

Confusion Matrix -> Lift,Gain,ROC。

ROC -> AUC,KS -> GINI。

 

在介绍之前,我们先重新明确一下这些图表的名称,中文、英文、简称,全部来熟悉一下:

记住这个之后,我们来理解一下他们之间的关系。

拟人化概括

其实,这些图之间的关系不是很复杂。我尝试着用一个小故事概括一下人物之间的关系。

故事是这样的:

首先,混淆矩阵是个元老,年龄最大也资历最老。创建了两个帮派,一个夫妻帮,一个阶级帮。

之后,夫妻帮里面是夫妻两个,一个Lift曲线,一个Gain曲线,两个人不分高低,共用一个横轴。

再次,阶级帮里面就比较混乱。

           1. 帮主是ROC曲线。

           2. 副帮主是KS曲线,AUC面积

           3. AUC养了一个小弟,叫GINI系数

 

下图是曲线与指标的综合对比图

 

一 ROC曲线和AUC值

在逻辑回归、随机森林、GBDT、XGBoost这些模型中,模型训练完成之后,每个样本都会获得对应的两个概率值,一个是样本为正样本的概率,一个是样本为负样本的概率。把每个样本为正样本的概率取出来,进行排序,然后选定一个阈值,将大于这个阈值的样本判定为正样本,小于阈值的样本判定为负样本,然后可以得到两个值,一个是真正率,一个是假正率。

真正率即判定为正样本且实际为正样本的样本数/所有的正样本数,假正率为判定为正样本实际为负样本的样本数/所有的负样本数。每选定一个阈值,就能得到一对真正率和假正率,由于判定为正样本的概率值区间为[0,1],那么阈值必然在这个区间内选择,因此在此区间内不停地选择不同的阈值,重复这个过程,就能得到一系列的真正率和假正率,以这两个序列作为横纵坐标,即可得到ROC曲线了。而ROC曲线下方的面积,即为AUC值。

对于AUC值,也许有一个更直观的理解,那就是,在按照正样本概率值对所有样本排序后,任意选取一对正负样本,正样本排在负样本之前的概率值,即为AUC值。也就是说,当所有的正样本在排序后都能排在负样本之前时,就证明所有的样本都被正确分类了,此时的AUC值也会为1。那么AUC值也就很好算了,如果有N个负样本,其中正样本有M个,那么可取的所有带正样本的样本对数对于排在第一位的正样本来说,有M+N-1个,但其中包含M-1对(正,正)的样本,而对于后面所有的正样本而言,能够取到的正样本概率大于负样本对数肯定小于其位置-1。


二 KS曲线

KS曲线其实数据来源和本质和ROC曲线是一致的,只是ROC曲线是把真正率和假正率当作横纵轴,而K-S曲线是把真正率和假正率都当作是纵轴,横轴则由选定的阈值来充当。

KS(Kolmogorov-Smirnov):KS用于模型风险区分能力进行评估,指标衡量的是好坏样本累计分部之间的差值。好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强。

KS的计算步骤如下:
1. 计算每个评分区间的好坏账户数。
2. 计算每个评分区间的累计好账户数占总好账户数比率(good%)和累计坏账户数占总坏账户数比率(bad%)。
3. 计算每个评分区间累计坏账户占比与累计好账户占比差的绝对值(累计good%-累计bad%),然后对这些绝对值取最大值即得此评分卡的KS值。

 

下面这一段解释得更详细的KS和AUC的区别是参考的这篇博客:

https://blog.csdn.net/sinat_30316741/article/details/80018932

由于KS值能找出模型中差异最大的一个分段,因此适合用于cut_off,像评分卡这种就很适合用ks值来评估。但是ks值只能反映出哪个分段是区分最大的,而不能总体反映出所有分段的效果,因果AUC值更能胜任。
ROC值一般在0.5-1.0之间。值越大表示模型判断准确性越高,即越接近1越好。ROC=0.5表示模型的预测能力与随机结果没有差别。
KS值表示了模型将+和-区分开来的能力。值越大,模型的预测准确性越好。一般,KS>0.2即可认为模型有比较好的预测准确性。
KS值一般是很难达到0.6的,在0.2~0.6之间都不错。一般如果是如果负样本对业务影响极大,那么区分度肯定就很重要,此时K-S比AUC更合适用作模型评估,如果没什么特别的影响,那么用AUC就很好了。

区分度指标(KS)是度量具体模型下正常样本和违约样本分布的最大差距,首先按照样本的信用分数或预测违约率从小到大进行排序,然后计算每一个分数或违约率下好坏样本的累计占比。正常和违约样本的累计占比差值的最大值即为区分度指标(KS)

 

风控分类模型种类(决策、排序)比较与模型评估体系(ROC/gini/KS/lift)
 

实际上是就是你建立好模型后,按照评分从大到小排列后:检验你所谓的好客户和坏客户两类客户分布的差异性,即模型区分度。分布根据好坏两个客户评分的累积密度分布曲线,画出来的:比如好坏客户共100个,按照评分排序后前百分之十的客户即10个,其中好的客户有8个,坏的客户有2个(总体样本中好客户80个,坏客户20个),那么前10%的客户的累积密度为:好客户10%,坏客户10%。同理前20%的客户中其中好的客户有15个,坏的客户有5个那么前20%的客户的累积密度为:好客户18.75%,坏客户25%
以此类推可以得出前30%,40%。。。。100%的累积密度。以10%,20%,30%。。。100%为横坐标,以两类客户累积密度为纵坐标,即可画出KS曲线图。

 

三 GINI系数

 

·GINI系数:也是用于模型风险区分能力进行评估。
GINI统计值衡量坏账户数在好账户数上的的累积分布与随机分布曲线之间的面积,好账户与坏账户分布之间的差异越大,GINI指标越高,表明模型的风险区分能力越强。

GINI系数的计算步骤如下:
1. 计算每个评分区间的好坏账户数。
2. 计算每个评分区间的累计好账户数占总好账户数比率(累计good%)和累计坏账户数占总坏账户数比率(累计bad%)。
3. 按照累计好账户占比和累计坏账户占比得出下图所示曲线ADC。
4. 计算出图中阴影部分面积,阴影面积占直角三角形ABC面积的百分比,即为GINI系数。

 

四 Lift , Gain

前三个指标应用场景更多一些


Lift图衡量的是,与不利用模型相比,模型的预测能力“变好”了多少,lift(提升指数)越大,模型的运行效果越好。
Gain图是描述整体精准度的指标。
计算公式如下:
                                       
                                                       
                  
作图步骤:
1. 根据学习器的预测结果(注意,是正例的概率值,非0/1变量)对样本进行排序(从大到小)-----这就是截断点依次选取的顺序
2. 按顺序选取截断点,并计算Lift和Gain ---也可以只选取n个截断点,分别在1/n,2/n,3/n等位置
例图:

   
 

 

 

五 模型稳定度指标PSI

群体稳定性指标PSI(Population Stability Index)是衡量模型的预测值与实际值偏差大小的指标。

PSI = sum((实际占比-预期占比)* ln(实际占比/预期占比))

举例:

比如训练一个logistic回归模型,预测时候会有个概率输出p。
测试集上的输出设定为p1吧,将它从小到大排序后10等分,如0-0.1,0.1-0.2,......。
现在用这个模型去对新的样本进行预测,预测结果叫p2,按p1的区间也划分为10等分。
实际占比就是p2上在各区间的用户占比,预期占比就是p1上各区间的用户占比。
意义就是如果模型跟稳定,那么p1和p2上各区间的用户应该是相近的,占比不会变动很大,也就是预测出来的概率不会差距很大。

一般认为PSI小于0.1时候模型稳定性很高,0.1-0.25一般,大于0.25模型稳定性差,建议重做。

PS:除了按概率值大小等距十等分外,还可以对概率排序后按数量十等分,两种方法计算得到的psi可能有所区别但数值相差不大。

 

 

参考:

  1. https://blog.csdn.net/Orange_Spotty_Cat/article/details/82425113
  2. https://blog.csdn.net/shy19890510/article/details/79501582
2018-06-27 15:56:49 sinat_36264666 阅读数 642
  • Kubernetes 实战系列

    Kubernetes(KS8) 实战系列教程,该课程将对Kubernetes的Node、Pod、Replication Controller、Service等基本核心概念进行讲解,这些组件共同构成了Kubernetes的系统框架和计算模型。通过对它们进行灵活的组合,用户就可以快速、方便地对容器集群进行配置、创建和管理。

    9522 人正在学习 去看看 CSDN讲师

在上一节中我们主要讲到机器学习的评估方法,其中重点是讲解了三种对数据集的划分方式,包括留出法(hold-out)、交叉验证法(k-fold cross validation)、自助法(bootstrap)

本节来看看机器学习的评估度量标准,其中我们将从回归(Regression)与分类(Classification)两个大类来讨论其中的评估度量标准。


==================分割线=====================

1.性能度量(Performance Measure)

性能度量即评估指标(Evaluation Metrics)可以说明模型的性能,辨别模型的结果

我们建立一个模型后,计算指标,从指标获取反馈,再继续改进模型,直到达到理想的准确度。在预测之前检查模型的准确度至关重要,而不应该建立一个模型后,就直接将模型应用到看不见的数据上。

性能度量特点

  • 性能度量是衡量模型泛化能力的数值评价标准,反映了当前问题(任务需求);
  • 使用不同的性能度量可能会导致不同的评判结果;
  • 关于模型“好坏”的判断,不仅取决于算法和数据,还取决于当前任务需求;


========================分割线==================

2.回归(Regression)问题的评估指标

以下为一元变量和二元变量的线性回归示意图:


怎样来衡量回归模型的好坏呢?

我们第一眼自然而然会想到采用残差(实际值与预测值差值)的均值来衡量,即:


问题 1:用残差的均值合理吗?

当实际值分布在拟合曲线两侧时,对于不同样本而言有正有负,相互抵消,因此我们想到采用预测值和真实值之间的距离来衡量。


==================分割线======================

2.1 平均绝对误差 MAE(Mean Absolute Error)

平均绝对误差MAEMean Absolute Error)又被称为范数损失

问题 2MAE有哪些不足?
MAE虽能较好衡量回归模型的好坏,但是绝对值的存在导致函数不光滑,在某些点上不能求导,可以考虑将绝对值
改为残差的平方,这就是均方误差 。


===================分割线======================

2.2 均方误差 MSE(Mean Square Error)

均方误差MSEMean Squared Error)又被称为范数损失


问题 3: 还有没有比MSE更合理一些的指标?

由于MSE与我们的目标变量的量纲不一致,为了保证量纲一致性,我们需要对MSE进行开方。

问题 4什么是量纲不一致呢?

这就好比如说,测量体重,它的单位是KG,但是呢,由MSE计算后的单位却发生了变化,变成了,这就发生了量纲不一致。


===================分割线======================

2.3 均方根误差 RMSE (Root Mean Square Error)

问题 5RMSE有没有不足的地方?有没有规范化(无量纲化的指标)?

上面的几种衡量标准的取值大小与具体的应用场景有关系,很难定义统一的规则来衡量模型的好坏。比如说利用机器学习算法预测上海的房价RMSE2000元,我们是可以接受的,但是当四五线城市的房价RMSE2000元,我们还可以接受吗?下面介绍的决定系数就是一个无量纲化的指标。


===================分割线======================

2.4 决定系数

变量之所以有价值,就是因为变量是变化的。什么意思呢?比如说一组因变量为[0, 0, 0, 0, 0],显然该因变量的结果是一个常数0,我们也没有必要建模对该因变量进行预测。假如一组的因变量为[1, 3, 7, 10, 12],该因变量是变化的,也就是有变异,因此需要通过建立回归模型进行预测。这里的变异可以理解为一组数据的方差不为0。决定系数又称为反应因变量的全部变异能通过回归关系被自变量解释的比例。


如果结果是0,就说明模型预测不能预测因变量。 如果结果是1。就说明是函数关系。 如果结果是0-1之间的数,就是我们模型的好坏程度。

化简上面的公式 ,分子就变成了我们的均方误差MSE,下面分母就变成了方差:

问题 6: 以上评估指标有没有缺陷,如果有,该怎样改进?

以上的评估指标是基于误差的均值对进行评估的,均值对异常点(outliers)较敏感,如果样本中有一些异常值出现,会对以上指标的值有较大影响,即均值是非鲁棒的。


===================分割线======================

2.5 解决评估指标鲁棒性问题

我们通常用一下两种方法解决评估指标的鲁棒性问题:
  • 剔除异常值
设定一个相对误差,当该值超过一定的阈值时,则认为其是一个异常点,剔除这个异常点,将异常点剔除之后。再计算平均误差来对模型进行评价。
  • 使用误差的分位数来代替

如利用中位数来代替平均数。例如 MAPE:


MAPE是一个相对误差的中位数,当然也可以使用别的分位数。


=======================分割线========================

3.分类(Regression)算法评估指标

3.1 精度 (Acc)

预测正确的样本的占总样本的比例,取值范围为[0,1],取值越大,模型预测能力越好。


注:精度是我们最常见的评价指标,而且很容易理解,就是被分对的样本数除以所有的样本数,通常来说,正确率越高,分类器越好。精度评价指标对平等对待每个类别,即每一个样本判对 (0) 和判错 (1) 的代价都是一样的。

问题 7: 精度有什么缺陷?什么时候精度指标会失效?
  • 对于有倾向性的问题,往往不能用精度指标来衡量。比如,判断空中的飞行物是导弹还是其他飞行物,很显然为了减少损失,我们更倾向于相信是导弹而采用相应的防护措施。此时判断为导弹实际上是其他飞行物与判断为其他飞行物实际上是导弹这两种情况的重要性是不一样的;
  • 对于样本类别数量严重不均衡的情况,也不能用精度指标来衡量。比如银行客户样本中好客户990个,坏客户10个。如果一个模型直接把所有客户都判断为好客户,得到精度为99%,但这显然是没有意义的。
  • 又比如某个地区某天地震的预测,假设我们有一堆的特征作为地震分类的属性,类别只有两个:0-不发生地震、1-发生地震。一个不加思考的分类器,对每一个测试用例都将类别划分为0,那那么它就可能达到99%的精度,但真的地震来临时,这个分类器毫无察觉,这个分类带来的损失是巨大的。为什么99%的精度的分类器却不是我们想要的,因为这里数据分布不均衡,类别1的数据太少,完全错分类别1依然可以达到很高的精度却忽视了我们关注的东西。

对于以上几种情况,单纯根据Accuracy来衡量算法的优劣已经失效。这个时候就需要对目标变量的真实值和预测值做更深入的分析


===================分割线======================

3.2 混淆矩阵(Confusion Matrix)

混淆矩阵,在无监督学习中被称为匹配矩阵(matching matrix),之所以叫混淆矩阵,是因为我们能够很 easy 从图表中看到分类器有没有将样本的类别给混淆了。矩阵每一列表示分类器预测值,每一行表示样本真实值。混淆矩阵如下图所示:

这里牵扯到三个方面:真实值,预测值,预测值和真实值之间的关系,其中任意两个方面都可以确定第三个。
通常取预测值和真实值之间的关系、预测值对矩阵进行划分。
混淆矩阵:

  • True Positive(真正, TP):将正类预测为正类数;
  • True Negative(真负 , TN):将负类预测为负类数;
  • False Positive(假正, FP):将负类预测为正类数,误报 (Type I error);
  • False Negative(假负 , FN):将正类预测为负类数,漏报 (Type II error);


===================分割线======================

3.3 查准率(准确率) Precision

Precision 是分类器预测的正样本中预测正确的比例,取值范围为[0,1],取值越大,模型预测能力越好。

需要注意的是准确率(Precision)和精度(Accuracy)是不一样的。在正负样本不平衡的情况下,精度这个评价指标有很大的缺陷。比如在互联网广告里面,点击的数量是很少的,一般只有千分之几,如果用acc,即使全部预测成负类(不点击)acc 也有 99% 以上,没有意义。


===================分割线======================

3.4查全率召回率Recall

Recall 是分类器所预测正确的正样本占所有正样本的比例,取值范围为[0,1],取值越大,模型预测能力越好。
应用场景:
  • 地震的预测
对于地震的预测,我们希望的是Recall非常高,也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲Precision。情愿发出1000次警报,把10次地震都预测正确了;也不要预测100次对了8次漏了两次。
  • 嫌疑人定罪

基于不错怪一个好人的原则,对于嫌疑人的定罪我们希望是非常准确的。即使有时候放过了一些罪犯,但也是值得的。因此我们希望有较高的Precision值,可以合理地牺牲Recall


刚开始接触这两个概念的时候总搞混,时间一长就记不清了。
实际上非常简单,准确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是对的。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP)。
而召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。


在信息检索领域,准确率和召回率又被称为查准率查全率。

问题 8: 某一家互联网金融公司风控部门的主要工作是利用机器模型抓取坏客户。互联网金融公司要扩大业务量,尽量多的吸引好客户,此时风控部门该怎样调整RecallPrecision?如果公司坏账扩大,公司缩紧业务,尽可能抓住更多的坏客户,此时风控部门该怎样调整RecallPrecision
如果互联网公司要扩大业务量,为了减少好客户的误抓率,保证吸引更多的好客户,风控部门就会提高阈值,从而提高模型的查准率Precision,同时,也会放进一部分坏客户,导致查全率Recall下降。如果公司要缩紧业务,尽可能抓住更多的坏客户,风控部门就会降低阈值,从而提高模型的查全率Recall,但是这样会导致一部分好客户误抓,从而降低模型的查准率 Precision

根据以上几个案,我们知道随着阈值的变化RecallPrecision往往会向着反方向变化,这种规律很难满足我们的期望,即RecallPrecision同时增大。

问题 9: 有没有什么方法权衡RecallPrecision 的矛盾?
我们可以用一个指标来统一RecallPrecision的矛盾,即利用RecallPrecision的加权调和平均值作为衡量标准。


===================分割线======================

3.5

PrecisionRecall 是互相影响的,理想情况下肯定是做到两者都高,但是一般情况下Precision高、Recall 就低,Recall 高、Precision就低。为了均衡两个指标,我们可以采用PrecisionRecall的加权调和平均(weighted harmonic mean)来衡量,即公式如下:



>1时查全率有更大影响;<1时差准率有更大影响。由于无法直观反映数据的情况,同时业务含义相对较弱,实际工作用到的不多。


问题 10: 有没有办法观察模型好坏随阈值的变化趋势呢(提示:利用TPR, FPR两个指标)?

有,ROCReceiver Operating Characteristic)曲线。

问题 11lr模型输出的是概率,需要设置阈值才能得到好坏客户,从而得到混淆矩阵,有没有一种指标不依赖于
阈值?

有,AUC


===================分割线======================

3.6 ROC AUC

AUC是一种模型分类指标,且仅仅是二分类模型的评价指标AUCArea Under Curve的简称,那么Curve就是ROCReceiver Operating Characteristic),翻译为"接受者操作特性曲线"。也就是说ROC是一条曲线,AUC是一个面积值

3.6.1 ROC

ROC曲线为 FPR TPR 之间的关系曲线,这个组合以 FPR TPR,即是以代价 (costs) 对收益 (benefits),显然收益越高,代价越低,模型的性能就越好。

  • x 轴为假阳性率(FPR):在所有的负样本中,分类器预测错误的比例;
  • y 轴为真阳性率(TPR):在所有的正样本中,分类器预测正确的比例(等于Recall);

为了更好地理解ROC曲线,我们使用具体的实例来说明
如在医学诊断的主要任务是尽量把生病的人群都找出来,也就是
TPR越高越好。而尽量降低没病误诊为有病的人数,也就是FPR越低越好。
不难发现,这两个指标之间是相互制约的。如果某个医生对于有病的症状比较敏感,稍微的小症状都判断为有病,那么他的
TPR应该会很高,但是FPR也就相应地变高。最极端的情况下,他把所有的样本都看做有病,那么TPR达到1FPR也为1

我们以FPR为横轴,TPR为纵轴,得到如下ROC空间。


我们可以看出,左上角的点(TPR=1FPR=0),为完美分类,也就是这个医生医术高明,诊断全对。点A(TPR>FPR),医生A的判断大体是正确的。中线上的点B(TPR=FPR),也就是医生B全都是蒙的,蒙对一半,蒙错一半;下半平面的点C(TPR<FPR),这个医生说你有病,那么你很可能没有病,医生C的话我们要反着听,为真庸医。上图中一个阈值,得到一个点。现在我们需要一个独立于阈值的评价指标来衡量这个医生的医术如何,也就是遍历所有的阈值,得到 ROC 曲线。
假设下图是某医生的诊断统计图,为未得病人群(上图)和得病人群(下图)的模型输出概率分布图(横坐标表示模型输出概率,纵坐标表示概率对应的人群的数量),显然未得病人群的概率值普遍低于得病人群的输出概率值(即正常人诊断出疾病的概率小于得病人群诊断出疾病的概率)。

竖线代表阈值。显然,图中给出了某个阈值对应的混淆矩阵,通过改变不同的阈值1.0-->0,得到一系列的混淆矩阵,进而得到一系列的TPR和FPR,绘制出ROC曲线。

阈值为1时,不管你什么症状,医生均未诊断出疾病(预测值都为N),此时FPR=TPR=0,位于左下。阈值为 0 时,不管你什么症状,医生都诊断结果都是得病(预测值都为P),此时FPR=TPR=1,位于右上。


问题 12:如下,是三个模型对于 ROC 曲线,请按照模型性能好坏对齐进行排序。

显然是classifier4最好,classifier1最差。classifier2和classifier3暂时看不出来,需要用AUC来计算。


===================分割线======================

3.6.2 AUC

AUC定义:
AUC 值为 ROC 曲线所覆盖的区域面积,显然,AUC越大,分类器分类效果越好。
  • AUC = 1,是完美分类器。
  • 0.5 < AUC < 1,优于随机猜测。有预测价值。
  • AUC = 0.5,跟随机猜测一样(例:丢铜板),没有预测价值。
  • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

注:对于AUC小于 0.5 的模型,我们可以考虑取反(模型预测为positive,那我们就取negtive),这样就可以保证模型的性能不可能比随机猜测差。

以下为ROC曲线和AUC值的实例:



AUC的物理意义
AUC的物理意义正样本的预测结果大于负样本的预测结果的概率。所以AUC反应的是分类器对样本的排序能力。另外值得注意的是,AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常用AUC评价分类器性能的一个原因。

  • 1. AUC更多的是关注对计算概率的排序,关注的是概率值的相对大小,与阈值和概率值的绝对大小没有关系。
  • 2. AUC只关注正负样本之间的排序,并不关心正样本内部,或者负样本内部的排序。这也体现了AUC的本质:任意个正样本的概率都大于负样本的概率的能力 。

AUC的计算:

  • 1AUCROC曲线下的面积,那我们直接计算面积可得。面积为一个个小的梯形面积(曲线)之和。计算的精度与阈值的精度有关。
  • 2:根据AUC的物理意义,我们计算正样本预测结果大于负样本预测结果的概率。取n1*n0(n1为正样本数,n0为负样本数)个二元组,比较score(预测结果),最后得到AUC。时间复杂度为O(N*M)
  • 3:我们首先把所有样本按照score排序,依次用rank表示他们,如最大score的样本,rank=n (n=n0+n1,其中n0为负样本个数,n1为正样本个数),其次为n-1。那么对于正样本中rank最大的样本,rank_max,有n1-1个其他正样本比他score,那么就有(rank_max-1)-(n1-1)个负样本比他score小。其次为(rank_second-1)-(n1-2)。最后我们得到正样本大于负样本的概率为:计算复杂度为O(N+M)

问题 13:为什么说 ROC AUC都能应用于非均衡的分类问题?
ROC曲线只与横坐标 (FPR) 和 纵坐标 (TPR) 有关系,我们知道:

以及混淆矩阵:

我们可以发现TPR只是正样本中(第一行)预测正确的概率,而FPR只是负样本中(第二行)预测错误的概率。和正负样本的比例没有关系。因此 ROC 的值与实际的正负样本比例无关,因此既可以用于均衡问题,也可以用于非均衡问题。而 AUC 的几何意义为ROC曲线下的面积,因此也和实际的正负样本比例无关。


===================分割线======================

3.7 KS Kolmogorov-Smirnov

KS值是在模型中用于区分预测正负样本分隔程度的评价指标,一般应用于金融风控领域。与ROC曲线相似,ROC是以FPR作为横坐标,TPR作为纵坐标,通过改变不同阈值,从而得到ROC曲线。而在KS曲线中,则是以阈值作为横坐标,以FPR和TPR作为纵坐标,ks曲线则为TPR-FPR,ks曲线的最大值通常为ks值。
为什么这样求KS值呢?我们知道,当阈值减小时,TPR和FPR会同时减小,当阈值增大时,TPR和FPR会同时增大。而在实际工程中,我们希望TPR更大一些,FPR更小一些,即TPR-FPR越大越好,即ks值越大越好。
KS值的取值范围是[0,1]。通常来说,值越大,模型区分正负样本的能力越强(一般0.3以上,说明模型的效果比较好)。
以下为ks曲线的实例 (这里的红色为ks曲线,是将score升序排列之后,进行了分组,所以 x 轴是分组号,而不是阈值):


===================分割线======================

4. 评估指标和代价函数是一家人吗?

代价函数:,又称Cost function,loss function objective function。一般用在训练过程中,用来定义预测值和真实值之间的距离(也就是衡量模型在训练集上的性能),作为模型调整参数的反馈。代价函数越小,模型性能越好。

评判指标:,一般用于训练和测试过程中,用于评估模型好坏。评判指标越大(或越小),模型越好。

本质上代价函数和评判指标都是一家人,只他们的应用场景不同,分工不同。代价函数是用来优化模型参数的,评价指标是用来评判模型好坏的。

作为评判指标所具备的条件:
1. 直观,可以理解
......
作为代价函数所具备的条件:
1. 函数光滑且可导:可用梯度下降求解极值
2. 函数为凸函数:可用梯度下降求解最优解......

例如我们经常使用的分类器评判指标 AUC 就不能直接被优化,因此我们常采用交叉熵来代替 AUC 进行优化。 一般情况下,交叉熵越小,AUC 就会越大。


===================分割线======================

5. 补充小知识点:micro还是macro

假如我们有n个二分类混淆矩阵,怎样综合评价我们的模型呢?我们通常有两种方式一种叫macro,一种叫micro

5.1 macro方法

1. 计算出各混淆矩阵的RecallPrecision,记为


2. 对各个混淆矩阵的RecallPrecision求平均,然后再根据求得的RecallPrecision计算F1


===================分割线======================

5.2 micro方法

1. 将各混淆矩阵对应的元素进行平均,得到平均混淆矩阵:

2. 再基于平均混淆矩阵计算RecallPrecision,然后再根据求得的RecallPrecision计算F1


====================分割线==================

参考文献:

ROC和AUC介绍以及如何计算AUC

ROC曲线与AUC

=====================END======================

2017-04-02 20:06:19 u011092188 阅读数 3851
  • Kubernetes 实战系列

    Kubernetes(KS8) 实战系列教程,该课程将对Kubernetes的Node、Pod、Replication Controller、Service等基本核心概念进行讲解,这些组件共同构成了Kubernetes的系统框架和计算模型。通过对它们进行灵活的组合,用户就可以快速、方便地对容器集群进行配置、创建和管理。

    9522 人正在学习 去看看 CSDN讲师

 在机器学习中我们把数据分为测试数据训练数据

测试数据就是测试集,是用来测试已经训练好的模型的泛化能力。

训练数据常被划分为训练集(training set)验证集(validation set),比如在K-折交叉验证中,整个训练数据集D,就被分为K个部分,每次挑选其中的(K-1)部分做训练集,剩下的部分为验证集。

训练集是用来训练模型或确定模型参数的,如ANN中权值,CNN中的权值等;验证集是用来做模型结构选择,确定模型中的一些超参数,比如正则项系数,CNN各个隐层神经元的个数等;

 以下是维基百科中的解释:

  • Training set: A set of examples used for learning, which is to fit the parameters [i.e., weights] of the classifier.

  • Validation set: A set of examples used to tune the parameters [i.e., architecture, not weights] of a classifier, for example to choose the number of hidden units in a neural network.

  • Test set: A set of examples used only to assess the performance [generalization] of a fully specified classifier.

2019-05-23 14:22:42 a794922102 阅读数 86
  • Kubernetes 实战系列

    Kubernetes(KS8) 实战系列教程,该课程将对Kubernetes的Node、Pod、Replication Controller、Service等基本核心概念进行讲解,这些组件共同构成了Kubernetes的系统框架和计算模型。通过对它们进行灵活的组合,用户就可以快速、方便地对容器集群进行配置、创建和管理。

    9522 人正在学习 去看看 CSDN讲师

8.学习理论

1.交叉验证

k-折交叉验证

将数据集划分为k份,每次选取一份作为测试数据,其他的为训练数据。重复k次。计算每次错误的平均值。以此验证模型的性能。

  1. 随机将训练集 SS 切分成 kk 个不相交的子集。其中每一个子集的规模为 m/km/k 个训练样本。这些子集为 S1,&ThinSpace;,SkS_1,\cdots,S_k

  2. 对每个模型 MiM_i,我们都按照下面的步骤进行评估(evaluate):

    j=1,&ThinSpace;,kj=1,\cdots,k

    • S1Sj1Sj+1SkS_1\cup\cdots\cup S_{j-1}\cup S_{j+1}\cup\cdots\cup S_k (也就是除了 SjS_j 之外的其他数据),对模型 MiM_i 得到假设 hijh_{ij} 。接下来针对 SjS_j 使用假设 hijh_{ij} 进行测试,得到经验误差 ϵ^Scv(hij)\hat\epsilon_{S_{cv}}(h_{ij})

      ϵ^Scv(hij)\hat\epsilon_{S_{cv}}(h_{ij}) 取平均值,计算得到的值就当作是模型 MiM_i 的估计泛化误差(estimated generalization error)

  3. 选择具有最小估计泛化误差(lowest estimated generalization error)的模型 MiM_i 的,然后在整个训练样本集 SS 上重新训练该模型。这样得到的假设 (hypothesis)就可以输出作为最终结果了。

2.特征选择

向前搜索

  1. 初始化一个集合为空集 F=\mathcal F=\emptyset

  2. 循环下面的过程{

    (a) 对于 i=1,&ThinSpace;,ni=1,\cdots,n 如果 iFi\notin \mathcal F,则令 Fi=F{i}\mathcal F_i=\mathcal F\cup \{i\},然后使用某种交叉验证来评估特征 Fi\mathcal F_i

    (b) 令 F\mathcal F 为(a)中最佳特征子集

    }

  3. 整个搜索过程中筛选出来了最佳特征子集(best feature subset),将其输出。

算法的外层循环可以在 F={1,&ThinSpace;,n}\mathcal F=\{1,\cdots,n\} 达到全部特征规模时停止,也可以在 F|\mathcal F| 超过某个预先设定的阈值时停止(阈值和你想要算法用到特征数量最大值有关)。

向后搜索

F={1,...,n}\mathcal F = \{1, ..., n\} ,即规模等同于全部特征开始,然后重复,每次删减一个特征,直到 F\mathcal F 为空集时终止。

过滤器特征选择

一种思路是使用 xix_iyy 之间的相关系数的值(或其绝对值),这可以在训练 样本数据中算出。这样我们选出的就是与分类标签(class labels)的关系最密切的特征值(features)。实践中,通常(尤其当特征 xix_i 为离散值(discrete-valued features))选择 xix_iyy互信息( mutual information, MI(xi,y){\rm{MI}}(x_i, y) ) 来作为 S(i)S(i)
MI(xi,y)=xi{0,1}y{0,1}p(xi,y)logp(xi,y)p(xi)p(y) {\rm{MI}}(x_i, y)=\sum_{x_i\in\{0, 1\}}\sum_{y\in\{0,1\}}p(x_i,y)\log\frac{p(x_i,y)}{p(x_i)p(y)}
(上面这个等式假设了 xix_iyy 都是二值化;更广泛的情况下将会超过变量的范围 。)上式中的概率p(xi,y)p(x_i,y)p(xi)p(x_i)p(y)p(y) 都可以根据它们在训练集上的经验分布(empirical distributions)而推测(estimated)得到。

要对这个信息量分值的作用有一个更直观的印象,也可以将互信息(mutual information)表达成 KLKL 散度(Kullback-Leibler divergence,也称 KLKL 距离,常用来衡量两个概率分布的距离):
MI(xi,y)=KL(p(xi,y)&ThinSpace;&ThinSpace;p(xi)p(y)) {\rm{MI}}(x_i,y)={\rm KL}(p(x_i,y)\,\|\,p(x_i)p(y))

3.贝叶斯统计和正则化

在本章的开头部分,我们谈到了使用最大似然(maximum likelihood,缩写为 ML)来进行参数拟合,然后根据下面的式子来选择参数:
θML=argmaxθi=1mp(y(i)x(i);θ) \theta_{\rm ML}=\arg \max_{\theta}\prod_{i=1}^{m}p(y^{(i)}|x^{(i)};\theta)
给定一个训练集合 S={(x(i),y(i))}i=1mS = \{(x^{(i)},y^{(i)})\}^m_{i=1}
p(Sθ)=i=1mp(y(i)x(i),θ)p(S,θ)=p(Sθ)p(θ)=i=1mp(y(i)x(i),θ)p(θ)p(S)=θp(S,θ)dθ=θ(i=1mp(y(i)x(i),θ)p(θ))dθ \begin{aligned} p(S|\theta)&amp;=\prod_{i=1}^{m}p(y^{(i)}|x^{(i)},\theta)\\ p(S,\theta)&amp;=p(S|\theta)p(\theta)=\prod_{i=1}^{m}p(y^{(i)}|x^{(i)},\theta)p(\theta)\\ p(S)&amp;=\int_{\theta} {p(S,\theta)}d\theta=\int_{\theta} {\left(\prod_{i=1}^{m}p(y^{(i)}|x^{(i)},\theta)p(\theta)\right)}d\theta \end{aligned}
当我们被要求对一个新的 xx 的值进行预测的时候,我们可以计算在参数上的后验分布 (posterior distribution):
p(θS)=p(Sθ)p(θ)p(S)=(i=1mp(y(i)x(i),θ))p(θ)θ(i=1mp(y(i)x(i),θ)p(θ))dθ \begin{aligned} p(\theta|S) &amp;=\frac{p(S|\theta)p(\theta)}{p(S)}\\ &amp;=\frac{(\prod_{i=1}^{m}p(y^{(i)}|x^{(i)},\theta))p(\theta)}{\int_{\theta} {\left(\prod_{i=1}^{m}p(y^{(i)}|x^{(i)},\theta)p(\theta)\right)}d\theta}\qquad \end{aligned}
在上面的等式中,p(yi)x(i),θ)p(y^{i)}|x^{(i)},\theta) 来自你所用的机器学习问题中的模型。例如,如果你使用贝叶斯逻辑回归(Bayesian logistic regression),你可能就会选择 p(y(i)x(i),θ)=hθ(x(i))y(i)(1hθ(x(i)))(1y(i))p(y^{(i)}|x^{(i)},\theta)=h_\theta(x^{(i)})^{y^{(i)}} (1-h_\theta(x^{(i)}))^{(1-y^{(i)})} 其中,hθ(x(i))=1/(1+exp(θTx(i)))h_\theta(x^{(i)})=1/(1+\exp(-\theta^Tx^{(i)})).

若有一个新的测试样本 xx,然后要求我们对这个新样本进行预测,我们可以使用 θ\theta 上的后验分布(posterior distribution)来计算分类标签(class label)上的后验分布:
p(yx,S)=θp(yx,θ)p(θS)dθ \begin{aligned} p(y|x,S)&amp;=\int_\theta p(y|x,\theta)p(\theta|S)d\theta\qquad \\ \end{aligned}
在上面这个等式中,p(θS)p(\theta|S) 来自等式 (1)。例如,如果目标是要根据给定的 xx 来预测对应的 yy 的值,那就可以输出4^4:

4 如果 yy 是一个离散值(discrete-valued),那么此处的积分(integral)就用求和(summation)来替代。

E[yx,S]=yyp(yx,S)dy E[y|x,S]=\int_y y p(y|x,S)dy

这里我们简单概述的这个过程,可认为是一种“完全贝叶斯 (fully Bayesian)”预测,其中我们的预测是通过计算相对于 θ\theta 上的后验概率 p(θS)p(\theta|S) 的平均值而得出的。然而很不幸,这 个后验分布的计算通常是比较困难的。这是因为这个计算需要对 θ\theta 进行积分(integral),而 θ\theta 通常是高维度的(high-dimensional),这通常是不能以闭合形式 (closed-form)来实现的。

因此在实际应用中,我们都是用一个与 θ\theta 的后验分布 (posterior distribution)近似的分布来替代。常用的一个近似是把对 θ\theta 的后验分布(正如等式(2)(2)中所示)替换为一个单点估计(single point estimate)。对 θ\theta 的最大后验估计 (MAP,maximum a posteriori estimate)为:
θMAP=argmaxθi=1mp(y(i)x(i))p(θ) \theta_{MAP}=\arg \max_\theta \prod_{i=1}^{m} p(y^{(i)}|x^{(i)})p(\theta)
注意到了么,这个式子基本和对 θ\theta 的最大似然估计(ML (maximum likelihood) estimate)是一样的方程,除了末尾多了 一个先验概率分布 p(θ)p(\theta)。 实际应用里面,对先验概率分布 p(θ)p(\theta) 的常见选择是假设 θN(0,τ2I)\theta\sim N(0 , \tau ^2I)

没有更多推荐了,返回首页