精华内容
下载资源
问答
  • 机器学习模型评估

    2021-02-16 22:20:03
    机器学习模型评估 模型评估是模型开发过程不可或缺的一部分。它有助于发现表达数据的最佳模型和所选模型将来工作的性能如何。 按照数据集的目标值不同,可以把模型评估分为分类模型评估和回归模型评估。 1 分类...

    机器学习模型评估


    模型评估是模型开发过程不可或缺的一部分。它有助于发现表达数据的最佳模型和所选模型将来工作的性能如何。

    按照数据集的目标值不同,可以把模型评估分为分类模型评估和回归模型评估。

    1 分类模型评估

    • 准确率

      • 预测正确的数占样本总数的比例。
    • 其他评价指标:精确率、召回率、F1-score、AUC指标等

    • 【精准率:正确预测为正占全部预测为正的比例】

    • 【召回率:正确预测为正占全部正校本的比例】

    • 【F1-score:主要用于评估模型的稳健性】

    • 【AUC:主要用于评估样本不均衡的情况】

    2 回归模型评估

    均方根误差(Root Mean Squared Error,RMSE)

    • RMSE是一个衡量回归模型误差率的常用公式。 不过,它仅能比较误差是相同单位的模型。

    举例:

    假设上面的房价预测,只有五个样本,对应的
    真实值为:100,120,125,230,400
    预测值为:105,119,120,230,410
    

    那么使用均方根误差求解得:

    其他评价指标:相对平方误差(Relative Squared Error,RSE)、平均绝对误差(Mean Absolute Error,MAE)、相对绝对误差(Relative Absolute Error,RAE)

    3 拟合

    模型评估用于评价训练好的的模型的表现效果,其表现效果大致可以分为两类:过拟合、欠拟合。

    在训练过程中,你可能会遇到如下问题:

    训练数据训练的很好啊,误差也不大,为什么在测试集上面有问题呢?

    当算法在某个数据集当中出现这种情况,可能就出现了拟合问题。

    3.1 欠拟合

    因为机器学习到的天鹅特征太少了,导致区分标准太粗糙,不能准确识别出天鹅。

    欠拟合(under-fitting)模型学习的太过粗糙,连训练集中的样本数据特征关系都没有学出来

    3.2 过拟合

    机器已经基本能区别天鹅和其他动物了。然后,很不巧已有的天鹅图片全是白天鹅的,于是机器经过学习后,会认为天鹅的羽毛都是白的,以后看到羽毛是黑的天鹅就会认为那不是天鹅。

    过拟合(over-fitting):所建的机器学习模型或者是深度学习模型在训练样本中表现得过于优越,导致在测试数据集中表现不佳

    • 上问题解答:
      • 训练数据训练的很好啊,误差也不大,为什么在测试集上面有问题呢?

    4 小结

    • 分类模型评估
      • 准确率
    • 回归模型评估
      • RMSE -- 均方根误差
    • 拟合
      • 举例 -- 判断是否是人
      • 欠拟合
        • 学习到的东西太少
        • 模型学习的太过粗糙
      • 过拟合
        • 学习到的东西太多
        • 学习到的特征多,不好泛化
    展开全文
  • 机器学习Author:太子长琴From:Datawhale本文对机器学习模型评估指标进行了完整总结。机器学习的数据集一般被划分为训练集和测试集,训练集用于训练模型,测试集则用于评估模型。针对不同的机器学习问题(分类、排序...
     机器学习 Author:太子长琴From:Datawhale

    本文对机器学习模型评估指标进行了完整总结。机器学习的数据集一般被划分为训练集和测试集,训练集用于训练模型,测试集则用于评估模型。针对不同的机器学习问题(分类、排序、回归、序列预测等),评估指标决定了我们如何衡量模型的好坏。

    aeed336b3021e9d7f0ec4e5dd6797c8a.png

    一、Accuracy

    准确率是最简单的评价指标,公式如下:

    但是存在明显的缺陷:

    • 当样本分布不均匀时,指标的结果由占比大的类别决定。比如正样本占 99%,只要分类器将所有样本都预测为正样本就能获得 99% 的准确率。
    • 结果太笼统,实际应用中,我们可能更加关注某一类别样本的情况。比如搜索时会关心 “检索出的信息有多少是用户感兴趣的”,“用户感兴趣的信息有多少被检测出来了” 等等。

    相应地还有错误率:分类错误的样本占总样本的比例。

    from sklearn.metrics import accuracy_score

    y_pred = [0, 0, 1, 1]
    y_true = [1, 0, 1, 0]
    accuracy_score(y_true, y_pred) # 0.5

    二、Precision Recall 和 F1

    精准率(Precision)也叫查准率,衡量的是所有预测为正例的结果中,预测正确的(为真正例)比例。

    召回率(Recall)也叫查全率,衡量的是实际的正例有多少被模型预测为正例。

    在排序问题中,一般以 TopN 的结果作为正例,然后计算前 N 个位置上的精准率 Precision@N 和召回率 Recall@N。

    精确率和召回率是一对相互矛盾的指标,一般来说高精准往往低召回,相反亦然。其实这个是比较直观的,比如我们想要一个模型准确率达到 100%,那就意味着要保证每一个结果都是真正例,这就会导致有些正例被放弃;相反,要保证模型能将所有正例都预测为正例,意味着有些反例也会混进来。这背后的根本原因就在于我们的数据往往是随机、且充满噪声的,并不是非黑即白。

    精准率和召回率与混淆矩阵密切相关,混淆矩阵是将分类(二分类)结果通过矩阵的形式直观展现出来:

    真实情况预测结果正例预测结果反例
    正例TP(真正例)FN(假反例)
    反例FP(假正例)TN(真反例)

    然后,很容易就得到精准率(P)和召回率(R)的计算公式:

    得到 P 和 R 后就可以画出更加直观的P-R 图(P-R 曲线),横坐标为召回率,纵坐标是精准率。绘制方法如下:

    • 对模型的学习结果进行排序(一般都有一个概率值)
    • 按照上面的顺序逐个把样本作为正例进行预测,每次都可以得到一个 P R 值
    • 将得到的 P R 值按照 R 为横坐标,P 为纵坐标绘制曲线图。
    from typing import List, Tuple
    import matplotlib.pyplot as plt

    def get_confusion_matrix(
    y_pred: List[int],
    y_true: List[int]
    )
    -> Tuple[int, int, int, int]:


    length = len(y_pred)
    assert length == len(y_true)
    tp, fp, fn, tn = 0, 0, 0, 0
    for i in range(length):
    if y_pred[i] == y_true[i] and y_pred[i] == 1:
    tp += 1
    elif y_pred[i] == y_true[i] and y_pred[i] == 0:
    tn += 1
    elif y_pred[i] == 1 and y_true[i] == 0:
    fp += 1
    elif y_pred[i] == 0 and y_true[i] == 1:
    fn += 1
    return (tp, fp, tn, fn)
    def calc_p(tp: int, fp: int) -> float:
    return tp / (tp + fp)
    def calc_r(tp: int, fn: int) -> float:
    return tp / (tp + fn)
    def get_pr_pairs(
    y_pred_prob: List[float],
    y_true: List[int]
    )
    -> Tuple[List[int], List[int]]:

    ps = [1]
    rs = [0]
    for prob1 in y_pred_prob:
    y_pred_i = []
    for prob2 in y_pred_prob:
    if prob2 < prob1:
    y_pred_i.append(0)
    else:
    y_pred_i.append(1)
    tp, fp, tn, fn = get_confusion_matrix(y_pred_i, y_true)
    p = calc_p(tp, fp)
    r = calc_r(tp, fn)
    ps.append(p)
    rs.append(r)
    ps.append(0)
    rs.append(1)
    return ps, rs

    y_pred_prob = [0.9, 0.8, 0.7, 0.6, 0.55, 0.54, 0.53, 0.52, 0.51, 0.505,
    0.4, 0.39, 0.38, 0.37, 0.36, 0.35, 0.34, 0.33, 0.3, 0.1]
    y_true = [1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0]
    y_pred = [1] * 10 + [0] * 10
    ps, rs = get_pr_pairs(y_pred_prob, y_true)
    fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(12, 5))
    ax.plot(rs, ps);
    2ac0e8f3b478d7809c3b2b0171dad524.png

    如果有多个模型就可以绘制多条 P-R 曲线:

    • 如果某个模型的曲线完全被另外一个模型 “包住”(即后者更加凹向原点),那么后者的性能一定优于前者。

    • 如果多个模型的曲线发生交叉,此时不好判断哪个模型较优,一个较为合理的方法是计算曲线下面积,但这个值不太好估算。

    为了获得模型优劣,需要综合 P 和 R,平衡点 BEP(Break-Even Point)就是这样一个度量,它是 P=R 时的取值,BPE 越远离原点,说明模型效果越好。由于 BPE 过于简单,实际中常用 F1 值衡量:

    F1 有更一般的形式:

    • 当 β > 1 时,更偏好召回
    • 当 β < 1 时,更偏好精准
    • 当 β = 1 时,平衡精准和召回,即为 F1

    F1 其实来自精准和召回的加权调和平均:

    当有多个混淆矩阵(多次训练、多个数据集、多分类任务)时,有两种方式估算 “全局” 性能:

    • macro 方法:先计算每个 PR,取平均后,再计算 F1
    • micro 方法:先计算混淆矩阵元素的平均,再计算 PR 和 F1

    三、RMSE

    均方根误差 RMSE(Root Mearn Square Error)主要用在回归模型,也就是俗称的 R 方。计算公式为:

    但是如果有非常严重的离群点时,那些点会影响 RMSE 的结果,针对这个问题:

    • 如果离群点为噪声,则去除这些点

    • 如果离群点为正常样本,可以重新建模

    • 换一个评估指标,比如平均绝对百分比误差 MAPE(Mean Absolute Percent Error),MAPE 对每个误差进行了归一化,一定程度上降低了离群点的影响。

    四、ROC 和 AUC

    受试者工作特征 ROC(Receiver Operating Characteristic)曲线是另一个重要的二分类指标。它的横坐标是 “假正例率” FPR(False Positive Rate),纵坐标是 “真正例率” TPR(True Positive Rate),计算公式如下:

    绘制方法和上面的 P-R 曲线类似,不再赘述。

    def calc_fpr(fp: int, tn: int) -> float:
    return fp / (fp + tn)
    def calc_tpr(tp: int, fn: int) -> float:
    return tp / (tp + fn)
    def get_ftpr_pairs(
    y_pred_prob: List[float],
    y_true: List[int]
    )
    -> Tuple[List[int], List[int]]:

    fprs = [0]
    tprs = [0]
    for prob1 in y_pred_prob:
    y_pred_i = []
    for prob2 in y_pred_prob:
    if prob2 < prob1:
    y_pred_i.append(0)
    else:
    y_pred_i.append(1)
    tp, fp, tn, fn = get_confusion_matrix(y_pred_i, y_true)
    fpr = calc_fpr(fp, tn)
    tpr = calc_tpr(tp, fn)
    fprs.append(fpr)
    tprs.append(tpr)
    fprs.append(1)
    tprs.append(1)
    return fprs, tprs
    fprs, tprs = get_ftpr_pairs(y_pred_prob, y_true)
    fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(12, 5))
    ax.plot(fprs, tprs);
    d13751dc341fc86c20a3156140fba529.png

    除此之外,还有一种绘制 ROC 曲线的方法:

    • 假设有 m+ 个正例,m- 个负例,对模型输出的预测概率按从高到低排序
    • 然后依次将每个样本的预测值作为阈值(即将该样本作为正例),假设前一个坐标为(x, y),若当前为真正例,对应标记点为(x, y+1/m+),若当前为假正例,则对应标记点为(x+1/m-, y)
    • 将所有点相连即可得到 ROC 曲线

    该方法和这种做法是一样的:将纵坐标的刻度间隔设为 1/m+,横坐标的刻度间隔设为 1/m-,从(0,0)开始,每遇到一个真正例就沿着纵轴绘制一个刻度间隔的曲线,假正例就沿着横轴绘制一个刻度间隔的曲线,最终就可以得到 ROC 曲线。

    def get_ftpr_pairs2(
    y_pred_prob: List[float],
    y_true: List[int]
    )
    -> Tuple[List[int], List[int]]:

    mplus = sum(y_true)
    msub = len(y_true) - mplus
    pairs = [(0, 0)]
    prev = (0, 0)
    length = len(y_pred_prob)
    assert length == len(y_true)
    for i in range(length):
    if y_true[i] == 1:
    pair = (prev[0], prev[1] + 1/mplus)
    else:
    pair = (prev[0] + 1/msub, prev[1])
    pairs.append(pair)
    prev = pair
    pairs.append((1, 1))
    fprs, tprs = [], []
    for pair in pairs:
    fprs.append(pair[0])
    tprs.append(pair[1])
    return fprs, tprs
    fprs, tprs = get_ftpr_pairs2(y_pred_prob, y_true)
    fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(12, 5))
    ax.plot(fprs, tprs);
    4d76c3f8dced72b2f387e98f2268f57f.png

    该方法和上面第一种方法得到的曲线完全一致。

    多个模型时,与 P-R 曲线也是类似,如果某个模型的曲线完全 “包住” 另一个,则前者性能好于后者。如果曲线相互交叉,则比较曲线下面积:AUC(Area Under ROC Curve)。

    AUC 取值一般在 0.5-1 之间,处于 y=x 直线的上方(如果不是的话,把预测概率翻转成 1-p 就能获得更好的模型)。AUC 值越大,说明模型越可能把真正例排在前面,性能越好。此时,假正例率很低同时真正例率很高,意味着召回高并且误判率小。对角线对应着随机模型(各占 50%),(0,1)点对应的是理想模型,即所有正例 100% 召回且没有一个负例被判别为正例。

    AUC 面积可以通过以下公式进行估算:

    AUC 考虑的是样本预测的排序质量,与排序误差紧密相连,排序 “损失” loss 可定义为:

    该式子的意思是,如果正例预测值小于负例,计 1 个罚分,如果相等则计 0.5 个罚分。显然,该式对应的就是 ROC 曲线上面的面积。因此有:

    与 P-R 曲线相比,ROC 曲线有一个特点:当正负样本的分布发生变化时,ROC 曲线形状能基本保持不变,而 P-R 曲线的形状一般会发生比较剧烈的变化。因此,当数据不均匀时,ROC 曲线更能够反映模型好坏。而这背后的原因是:

    • P-R 曲线关注的是真实的正例和预测的正例中(分别对应 Recall 和 Precision),实际是正例的比例

    • ROC 曲线关注的是真实的正例和负例中(分别对应 TPR 和 FPR),被预测为正例的比例

    五、KS

    作为一个工程师,看到 KS 我们的第一反应应该是:既然已经有了 PR、ROC 等评价指标,为什么还需要 KS?它解决了前面指标解决不了的什么问题?它究竟有什么特点?

    KS Test(Kolmogorov-Smirnov)是由两位苏联数学家 A.N. Kolmogorov 和 N.V. Smirnov 提出的,用于比较样本与参考概率分布或比较两个样本的非参数检验。

    我们以两样本为例,假设 m 个 sample 来自分布 F(x),n 个来自 G(x),定义 KS 统计量(KS 距离)为:

    其中 F(x) 和 G(x) 都是经验累积分布函数 ECDF(empirical distribution function),定义如下:

    sup 表示上确界,也是最小上界。

    原始假设 H0:两组 sample 来自统一分布,在大样本上,在置信水平 α 下如果满足下面的条件则拒绝零假设(认为两组样本来自不同分布):

    代入后得到:

    常用的值如下:

    966b836e4da0d8050f8dff6d919b5e99.png
    from scipy import stats
    rvs1 = stats.norm.rvs(size=200, loc=0., scale=1)
    rvs2 = stats.norm.rvs(size=300, loc=0.5, scale=1.5)
    stats.ks_2samp(rvs1, rvs2)
    # 在置信度 0.05 水平下:1.358 * np.sqrt(500/60000) = 0.124
    # Ks_2sampResult(statistic=0.265, pvalue=7.126401335710852e-08)
    # 0.265 > 0.124 所以拒绝原假设,即认为两组样本来自不同分布
    # 事实上,即便是 0.005 的置信水平下依然要拒绝原假设
    fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(12, 5))
    ax.hist(rvs1, density=False, histtype='stepfilled', alpha=0.2, color='red');
    ax.hist(rvs2, density=False, histtype='stepfilled', alpha=0.2, color='blue');

    其中 statistic 就是 ks 统计量。

    07df1ddeca05552ed49af92826578e5c.png

    那这又和评价指标有啥关联呢?

    我们考虑这么一种情况,假设数据集的 Label 并不是离散的(如二分类的 0-1),而是可能满足一定分布,也就是说标签有很多灰色地带。其实这在实际生活中倒是更加常见,以金融风控为例,不少特征都是基于某个时间点做划分的,比如逾期还款 x 天,这个 x 是非常灵活的,而且也很难说 x-1 天的就一定比 x+1 天的信用好。这就意味着给定特征下,我们的标签最好能够有一定 “弹性”。

    那么,怎么去体现这个 “弹性” 呢?因为 KS 正好是衡量两个 “分布” 的 “距离”,我们可以构造一个函数:

    然后我们可以画出 KS 曲线,可以证明,KS 和 ROC 等价,且满足如下公式:

    KS 的最大值就用来评估模型的区分度。而所谓的区分度正可以看作是正负例的差异,具体而言,如果正负例对于标签没有区分度,说明两个样本重叠较大;区分度越大,说明两个概率分布相隔越远。回到 KS 上:

    • 如果 KS 的最大值很小,说明 TPR 和 FPR 接近同一分布,也就意味着真实的正例和负例被预测为正例的比例相似,说明模型很差。
    • 如果 KS 的最大值很大,说明 TPR 和 FPR 区别很大,意味着真实的正例被预测为正例和真实的负例被预测为正例相差很大,说明模型效果较好(能够区分真实正例和真实负例)。

    事实上,KS 的确常用在金融风控中,用来评估模型的区分度,区分度越大说明模型的风险排序能力越强。但值太大也有问题(可能过拟合),一般超过 0.75 就认为过高,而低于 0.2 则过低。关于这个我们可以看图说明:

    2991f4e1211553535215d78c3e168bc9.png

    我们假设曲线光滑,那么 AUC_KS ≈ 1/2 × max_KS,根据前面的公式:

    由于上面提到的金融风控中 Label 的弹性,当 KS 过高时,ROC 的 AUC 就会很高,说明结果并没有这种弹性(模糊性、连续性),此时模型有过拟合风险。

    既然 KS 可以,那我们自然就要问了,t 检验行不行?因为 t 检验也是检验两组样本是否来自同一个分布的统计量啊。答案是:不行。因为我们实际上是使用了它的定义(距离),而 t-test 的定义并没有体现出这一点。

    独立双样本 t 检验,方差不相等:

    独立双样本 t 检验,样本数相同,方差相似:

    这里的图也可以说明这一点:

    dfc7d0496093ec70bdcad415ac37cdb7.png

    其他距离其实也没有太多意义,因为 FPR 和 TPR 的 x 是一样的,不同的也就是 y 值。

    六、评分卡

    评分卡模型是一个线性回归模型:

    特征覆盖率高,保持稳定,特征变量有明显的可解释性。样本为 0 时可以根据专家历史经验设定权重;样本为几百时,可根据单特征区分能力如 KS/IV 值等进行权重设定。

    6.1 非线性处理

    有两种方式:WOE 处理和分桶。

    证据权重 WOE(Weight of Evidence)是一种自变量编码方案,定义为:

    其中,Bi 表示第 i 个分组里 bad label 的数量,Bt 为总的 bad label 数量;G 表示 good label。WOE 越大,bad label 比例越高,此时的 WOE 值可以作为该分组的特征值。

    分桶是指对有一定跳变的连续值特征进行分桶,将弱线性特征转化为强线性特征。

    6.2 交叉特征处理

    主要采取对客户分群的方式,对细分群体进行单独建模(本质上是一种交叉特征的体现)。

    往期精彩:

      2020,从TF Boy 变成 Torch User

    【原创首发】机器学习公式推导与代码实现30讲.pdf

    【原创首发】深度学习语义分割理论与实战指南.pdf

    1459c494da619dee88c6107b5c762326.png

    喜欢您就点个在看!

    展开全文
  • 机器学习模型评估指标示例选择正确的度量来评估机器学习模型我们什么时候评估我们的机器学习模型呢?答案不是只有一次。通常,我们在实际的数据科学工作流中两次使用机器学习模型验证指标:模型比较:为您的任务选择...

    5444cae20932

    机器学习模型评估指标示例

    选择正确的度量来评估机器学习模型

    我们什么时候评估我们的机器学习模型呢?答案不是只有一次。通常,我们在实际的数据科学工作流中两次使用机器学习模型验证指标:

    模型比较:为您的任务选择最佳机器学习(ML)模型

    模型改进:调整超参数

    为了更清楚地了解这两者之间的区别,让我通过机器学习(ML)实现的工作流程来解释。在为任务y设置所有特征X后,您可以准备多个机器学习模型作为候选。

    那么你怎么才能最终为你的任务选择一个呢?是的,这是使用模型验证度量的第一点。Scikit-learn提供了一些快捷方法来比较模型,比如cross - validation。

    在您选择了一个准确度最好的机器学习模型后,您将跳转到超参数调优部分,以提高精度和通用性。这里是您将使用这些度量的第二点。

    在本文中,我试图制作机器学习模型评估指标的总结。

    交叉验证用于模型比较

    5444cae20932

    机器学习模型评估指标示例

    训练/测试拆分和交叉验证的可视化表示

    我们拆分数据的原因和方式的起点是泛化。因为我们构建机器学习模型的目标是使用未来未知数据的真实实现。因此,我们不需要过度拟合过去数据的无用模型。

    Holdout 方法

    from sklearn.model_selection import train_test_split

    from sklearn.datasets import load_wine

    wine = load_wine()

    X, y = wine.data, wine.target

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

    5444cae20932

    机器学习模型评估指标示例

    交叉验证方法

    5444cae20932

    机器学习模型评估指标示例

    K-Folds的视觉表示

    # Decision Tree Classifieras for estimator

    from sklearn.tree import DecisionTreeClassifier

    clf = DecisionTreeClassifier(random_state=0)

    5444cae20932

    机器学习模型评估指标示例

    cross_val_score:最简单的编码方法

    我们可以通过参数“cv”来决定数据拆分的数量。通常5被认为是标准拆分数。

    # X, y = wine.data, wine.target

    from sklearn.model_selection import cross_val_score

    scores = cross_val_score(clf, X, y, cv=5)

    print(scores) # cv = number of splited data

    print(scores.mean())

    5444cae20932

    机器学习模型评估指标示例

    5444cae20932

    机器学习模型评估指标示例

    cross_validate:我推荐这个可自定义的

    scoring = ['precision_macro', 'recall_macro']

    scores = cross_validate(clf, X, y, scoring=scoring, cv=5)

    print(scores)

    5444cae20932

    机器学习模型评估指标示例

    5444cae20932

    机器学习模型评估指标示例

    回归度量

    TL; DR:在大多数情况下,我们使用R2或RMSE。

    5444cae20932

    机器学习模型评估指标示例

    我将使用Boston House Price数据集。

    # Data Preparation

    from sklearn.datasets import load_boston

    boston = load_boston()

    X, y = boston.data, boston.target

    # Train data and Test data Splitting

    from sklearn.model_selection import train_test_split

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

    5444cae20932

    机器学习模型评估指标示例

    模型1:线性回归

    reg = LinearRegression()

    reg.fit(X_train, y_train)

    y_pred1 = reg1.predict(X_test)

    5444cae20932

    机器学习模型评估指标示例

    模型2:决策树回归

    from sklearn.tree import DecisionTreeRegressor

    reg2 = DecisionTreeRegressor(max_depth=3)

    reg2.fit(X_train, y_train)

    y_pred2 = reg2.predict(X_test)

    5444cae20932

    机器学习模型评估指标示例

    现在我们准备评估我们的两个机器学习模型并选择一个!

    R2:决定系数

    from sklearn.metrics import r2_score

    r2_score(y_test, y_pred1) # Linear Regression

    r2_score(y_test, y_pred2) # Decision Tree Regressor

    5444cae20932

    机器学习模型评估指标示例

    5444cae20932

    机器学习模型评估指标示例

    MSE:均方误差

    from sklearn.metrics import mean_squared_error

    mean_squared_error(y_test, y_pred)

    5444cae20932

    机器学习模型评估指标示例

    23.873348..

    RMSE:均方根误差

    import numpy as np

    np.sqrt(mean_squared_error(y_test, y_pred))

    5444cae20932

    机器学习模型评估指标示例

    4.886036..

    MAE:平均绝对误差

    reg = LinearRegression()

    reg.fit(X_train, y_train)

    y_pred = reg.predict(X_test)

    mean_absolute_error(y_test, y_pred)

    5444cae20932

    机器学习模型评估指标示例

    3.465279..

    分类指标

    5444cae20932

    机器学习模型评估指标示例

    分类问题:

    一对一分类:例如付费用户或免费

    One vs. Rest分类:例如高级会员或付费或免费

    我将使用Iris数据集作为多类分类问题。

    # Data Preparation

    from sklearn.datasets import load_iris

    iris = load_iris()

    X, y = iris.data, iris.target

    # Train data and Test data Splitting

    from sklearn.model_selection import train_test_split

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

    5444cae20932

    机器学习模型评估指标示例

    模型1:SVM

    from sklearn.svm import SVC

    clf1 = SVC(kernel = 'linear', C = 0.01)

    clf1.fit(X_train, y_train)

    y_pred1 = clf1.predict(X_test)

    5444cae20932

    机器学习模型评估指标示例

    模型2:朴素贝叶斯

    from sklearn.naive_bayes import GaussianNB

    clf2 = GaussianNB()

    clf2.fit(X_train, y_train)

    y_pred2 = clf2.predict(X_test)

    5444cae20932

    机器学习模型评估指标示例

    现在我们准备评估我们的两个模型并选择一个!

    1.准确性:

    from sklearn.metrics import accuracy_score

    accuracy_score(y_test, y_pred1)

    accuracy_score(y_test, y_pred2)

    5444cae20932

    机器学习模型评估指标示例

    5444cae20932

    机器学习模型评估指标示例

    2.精度:

    from sklearn.metrics import precision_score

    precision_score(y_test, y_pred1, average=None)

    precision_score(y_test, y_pred2, average=None)

    5444cae20932

    机器学习模型评估指标示例

    5444cae20932

    机器学习模型评估指标示例

    3.召回或灵敏度:

    from sklearn.metrics import recall_score

    recall_score(y_test, y_pred2, average=None)

    5444cae20932

    机器学习模型评估指标示例

    array([1. , 1. , 0.85714286]) # GNB

    4. F分数:

    from sklearn.metrics import f1_score

    f1_score(y_test, y_pred2, average=None)

    5444cae20932

    机器学习模型评估指标示例

    array([1. , 0.9375 , 0.92307692]) # GNB

    5.混淆矩阵

    from sklearn.metrics import confusion_matrix

    confusion_matrix(y_test, y_pred2)

    5444cae20932

    机器学习模型评估指标示例

    5444cae20932

    机器学习模型评估指标示例

    5444cae20932

    机器学习模型评估指标示例

    6. ROC

    如果你不使用OneVsRest Classifier,它不起作用......

    from sklearn.multiclass import OneVsRestClassifier

    from sklearn.svm import LinearSVC

    clf = OneVsRestClassifier(LinearSVC(random_state=0))

    clf.fit(X_train, y_train)

    y_pred = clf.predict(X_test)

    5444cae20932

    机器学习模型评估指标示例

    现在我们将通过ROC Curve进行检查。

    from sklearn.metrics import roc_curve

    fpr, tpr, thresholds = roc_curve(y_test, y_pred, pos_label=2)

    fpr, tpr, thresholds

    5444cae20932

    机器学习模型评估指标示例

    5444cae20932

    机器学习模型评估指标示例

    7. AUC:曲线下面积

    from sklearn.metrics import auc

    auc(fpr, tpr)

    5444cae20932

    机器学习模型评估指标示例

    0.913333... # auc

    8.多类对数损失

    这是一个概率。并且需要使用OneVsRestClassifier。

    # clf = OneVsRestClassifier(LinearSVC(random_state=0))

    from sklearn.metrics import log_loss

    y_pred = clf.predict_proba(X_test) # not .predict()

    log_loss(y_test, y_pred)

    5444cae20932

    机器学习模型评估指标示例

    0.09970990582482485

    聚类度量

    5444cae20932

    机器学习模型评估指标示例

    基本上在真正的聚类任务中,(我的意思是无监督聚类),我们没有任何方法来测量准确度或精度,因为没有人知道。

    然而,作为分类任务的过程,有时我们使用有监督的聚类来了解数据的特征。(在实际工作中也是如此。)

    因此,我将快速介绍一些监督聚类的指标。

    我只使用了Iris数据集中的特征来解决聚类问题。

    from sklearn.datasets import load_iris

    iris = load_iris()

    X, y = iris.data, iris.target

    5444cae20932

    机器学习模型评估指标示例

    作为聚类问题的代表模型,这次我使用了K-means。

    from sklearn.cluster import KMeans

    kmeans = KMeans(n_clusters=3, random_state=0)

    kmeans.fit(X)

    y_means = kmeans.predict(X)

    5444cae20932

    机器学习模型评估指标示例

    现在,监督聚类的结果是在y_means中。

    5444cae20932

    机器学习模型评估指标示例

    同质性得分,Completeness Score,V度量得分

    from sklearn.metrics import homogeneity_score, completeness_score, v_measure_score

    hg = homogeneity_score(y, y_means)

    co = completeness_score(y, y_means)

    vm = v_measure_score(y, y_means)

    print(hg, co, vm)

    5444cae20932

    机器学习模型评估指标示例

    5444cae20932

    机器学习模型评估指标示例

    附加:学习曲线可视化

    from sklearn.model_selection import learning_curve

    from sklearn.model_selection import ShuffleSplit

    def plot_learning_curve(clf, title, X, y, ylim=None, cv=None,

    n_jobs=None, train_sizes=np.linspace(.1, 1.0, 5)):

    plt.figure()

    plt.title(title)

    if ylim is not None:

    plt.ylim(*ylim)

    plt.xlabel("Training examples")

    plt.ylabel("Score")

    train_sizes, train_scores, test_scores = learning_curve(

    clf, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)

    train_scores_mean = np.mean(train_scores, axis=1)

    train_scores_std = np.std(train_scores, axis=1)

    test_scores_mean = np.mean(test_scores, axis=1)

    test_scores_std = np.std(test_scores, axis=1)

    plt.grid()

    plt.fill_between(train_sizes, train_scores_mean - train_scores_std,

    train_scores_mean + train_scores_std, alpha=0.1,

    color="r")

    plt.fill_between(train_sizes, test_scores_mean - test_scores_std,

    test_scores_mean + test_scores_std, alpha=0.1, color="g")

    plt.plot(train_sizes, train_scores_mean, 'o-', color="r",

    label="Training score")

    plt.plot(train_sizes, test_scores_mean, 'o-', color="g",

    label="Cross-validation score")

    plt.legend(loc="best")

    return plt

    title = "Learning Curves (Decision Tree, max_depth=2)"

    cv = ShuffleSplit(n_splits=100, test_size=0.2, random_state=0)

    clf = DecisionTreeClassifier(max_depth=2, random_state=0)

    plot_learning_curve(clf, title, X, y, ylim=(0.7, 1.01), cv=cv, n_jobs=4)

    title = "Learning Curves (SVM, Decision Tree, max_depth=5)"

    cv = ShuffleSplit(n_splits=10, test_size=0.2, random_state=0)

    clf = DecisionTreeClassifier(max_depth=5, random_state=0)

    plot_learning_curve(clf, title, X, y, (0.7, 1.01), cv=cv, n_jobs=4)

    plt.show()

    5444cae20932

    机器学习模型评估指标示例

    5444cae20932

    机器学习模型评估指标示例

    【转载自:https://www.toutiao.com/i6674196111701312008/?tt_from=weixin&utm_campaign=client_share&wxshare_count=2&from=groupmessage&timestamp=1554041865&app=news_article&utm_source=weixin&utm_medium=toutiao_android&group_id=6674196111701312008&pbid=6674712277877835267】

    展开全文
  • 选择正确的度量来评估机器学习模型我们什么时候评估我们的机器学习模型呢?答案不是只有一次。通常,我们在实际的数据科学工作流中两次使用机器学习模型验证指标:模型比较:为您的任务选择最佳机器学习(ML)模型模型...
    4ed23aea1e33ac00dde53eac43860744.png

    选择正确的度量来评估机器学习模型

    我们什么时候评估我们的机器学习模型呢?答案不是只有一次。通常,我们在实际的数据科学工作流中两次使用机器学习模型验证指标:

    1. 模型比较:为您的任务选择最佳机器学习(ML)模型
    2. 模型改进:调整超参数

    为了更清楚地了解这两者之间的区别,让我通过机器学习(ML)实现的工作流程来解释。在为任务y设置所有特征X后,您可以准备多个机器学习模型作为候选。

    那么你怎么才能最终为你的任务选择一个呢?是的,这是使用模型验证度量的第一点。Scikit-learn提供了一些快捷方法来比较模型,比如cross - validation。

    在您选择了一个准确度最好的机器学习模型后,您将跳转到超参数调优部分,以提高精度和通用性。这里是您将使用这些度量的第二点。

    在本文中,我试图制作机器学习模型评估指标的总结。

    交叉验证用于模型比较

    36adfca2d868191cf53dff77615feb55.png

    训练/测试拆分和交叉验证的可视化表示

    我们拆分数据的原因和方式的起点是泛化。因为我们构建机器学习模型的目标是使用未来未知数据的真实实现。因此,我们不需要过度拟合过去数据的无用模型。

    • Holdout 方法
    from sklearn.model_selection import train_test_splitfrom sklearn.datasets import load_winewine = load_wine()X, y = wine.data, wine.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
    cce697675fc7560a85e58a4ce9db7264.png
    • 交叉验证方法
    c594d1e87b4c6d11744a541a902bddc0.png

    K-Folds的视觉表示

    # Decision Tree Classifieras for estimatorfrom sklearn.tree import DecisionTreeClassifierclf = DecisionTreeClassifier(random_state=0)
    ebd7f8edc1e4d7208ecdccca9a9caa51.png

    cross_val_score:最简单的编码方法

    我们可以通过参数“cv”来决定数据拆分的数量。通常5被认为是标准拆分数。

    # X, y = wine.data, wine.targetfrom sklearn.model_selection import cross_val_scorescores = cross_val_score(clf, X, y, cv=5)print(scores) # cv = number of splited dataprint(scores.mean())
    74e11743edc2dbac3e60729ec9540a79.png
    57748528b0bd1aae3a153e5eb1cd4d3e.png

    cross_validate:我推荐这个可自定义的

    scoring = ['precision_macro', 'recall_macro']scores = cross_validate(clf, X, y, scoring=scoring, cv=5)print(scores)
    eb38e77104ff70c6cd02d7322183aca2.png
    cffb9d13d6da8aaca51d07e7bd30581f.png

    回归度量

    TL; DR:在大多数情况下,我们使用R2或RMSE。

    d71b2567d2896831ca3f4600ace06b53.png

    我将使用Boston House Price数据集。

    # Data Preparationfrom sklearn.datasets import load_bostonboston = load_boston()X, y = boston.data, boston.target# Train data and Test data Splittingfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
    8e821af1dd8aa6ad76557eeaddd874d8.png

    模型1:线性回归

    reg = LinearRegression()reg.fit(X_train, y_train)y_pred1 = reg1.predict(X_test)
    597e85502f5f3087cc1f98c7243f0bd0.png

    模型2:决策树回归

    from sklearn.tree import DecisionTreeRegressorreg2 = DecisionTreeRegressor(max_depth=3)reg2.fit(X_train, y_train)y_pred2 = reg2.predict(X_test)
    37f610881c0a921440176c966b1838df.png

    现在我们准备评估我们的两个机器学习模型并选择一个!

    R2:决定系数

    from sklearn.metrics import r2_score

    r2_score(y_test, y_pred1) # Linear Regression

    r2_score(y_test, y_pred2) # Decision Tree Regressor

    a95329814e13949c6ac37ef61820d300.png
    25ece328ad51bd097de13c1285d42738.png

    MSE:均方误差

    from sklearn.metrics import mean_squared_errormean_squared_error(y_test, y_pred)
    930f76fd52a60ccac0aa0b57beab757a.png

    >>> 23.873348..

    RMSE:均方根误差

    import numpy as npnp.sqrt(mean_squared_error(y_test, y_pred))
    01a3dd6b5afc9e9f8a6de8eb198f0355.png

    >>> 4.886036..

    MAE:平均绝对误差

    reg = LinearRegression()reg.fit(X_train, y_train)y_pred = reg.predict(X_test)mean_absolute_error(y_test, y_pred)
    883446545c53f9a29197903520ee6506.png

    >>> 3.465279..

    分类指标

    3d96bc3f7a5799774812f54b7752b112.png

    分类问题:

    1. 一对一分类:例如付费用户或免费
    2. One vs. Rest分类:例如高级会员或付费或免费

    我将使用Iris数据集作为多类分类问题。

    # Data Preparationfrom sklearn.datasets import load_irisiris = load_iris()X, y = iris.data, iris.target# Train data and Test data Splittingfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
    6a00425ad6e8e360042705553ee4b333.png

    模型1:SVM

    from sklearn.svm import SVCclf1 = SVC(kernel = 'linear', C = 0.01)clf1.fit(X_train, y_train)y_pred1 = clf1.predict(X_test)
    01a3f4407cc06bc2ff2b69a3a564d801.png

    模型2:朴素贝叶斯

    from sklearn.naive_bayes import GaussianNBclf2 = GaussianNB()clf2.fit(X_train, y_train)y_pred2 = clf2.predict(X_test)
    06222522f1522cd2954b735b6188930e.png

    现在我们准备评估我们的两个模型并选择一个!

    1.准确性:

    from sklearn.metrics import accuracy_score

    accuracy_score(y_test, y_pred1)

    accuracy_score(y_test, y_pred2)

    1ec9ea9e6b0ab54aff380601810c0824.png
    eaeae430c8c593617d83ea26c716214f.png

    2.精度:

    from sklearn.metrics import precision_score

    precision_score(y_test, y_pred1, average=None)

    precision_score(y_test, y_pred2, average=None)

    7fc6fa39a1b1c14c068f9abad9b9f447.png
    73a23a980b3e26697d510ba2cd3b0be8.png

    3.召回或灵敏度:

    from sklearn.metrics import recall_scorerecall_score(y_test, y_pred2, average=None)
    3a48c6a0ef4eb4b59979fe2fa6b07706.png

    >>> array([1. , 1. , 0.85714286]) # GNB

    4. F分数:

    from sklearn.metrics import f1_scoref1_score(y_test, y_pred2, average=None)
    226af005a32eb38b24bf126e20d6a1ff.png

    >>> array([1. , 0.9375 , 0.92307692]) # GNB

    5.混淆矩阵

    from sklearn.metrics import confusion_matrix

    confusion_matrix(y_test, y_pred2)

    041f930c2751b228133b94322682124a.png
    4821f37e85cb08fed43509c6a1e825eb.png
    464917bd0e8f4d5df151f4bf670f1166.png

    6. ROC

    如果你不使用OneVsRest Classifier,它不起作用......

    from sklearn.multiclass import OneVsRestClassifierfrom sklearn.svm import LinearSVCclf = OneVsRestClassifier(LinearSVC(random_state=0))clf.fit(X_train, y_train)y_pred = clf.predict(X_test)
    b5be7d30e3a3c43b0de0d42e43208a4b.png

    现在我们将通过ROC Curve进行检查。

    from sklearn.metrics import roc_curvefpr, tpr, thresholds = roc_curve(y_test, y_pred, pos_label=2)fpr, tpr, thresholds
    6408e0e650b2697068fedcee64c4c71b.png
    999d358e0c963280a2f64b3f5e8b621c.png

    7. AUC:曲线下面积

    from sklearn.metrics import aucauc(fpr, tpr)
    5c29bb70f93e431a515f0cf58d08d4ed.png

    >>> 0.913333... # auc

    8.多类对数损失

    这是一个概率。并且需要使用OneVsRestClassifier。

    # clf = OneVsRestClassifier(LinearSVC(random_state=0))from sklearn.metrics import log_lossy_pred = clf.predict_proba(X_test) # not .predict()log_loss(y_test, y_pred)
    9407916206b600c19feb9dee998f92df.png

    >>> 0.09970990582482485

    聚类度量

    a3c8681f8a723762357ccbd7146ea8ae.gif

    基本上在真正的聚类任务中,(我的意思是无监督聚类),我们没有任何方法来测量准确度或精度,因为没有人知道。

    然而,作为分类任务的过程,有时我们使用有监督的聚类来了解数据的特征。(在实际工作中也是如此。)

    因此,我将快速介绍一些监督聚类的指标。

    我只使用了Iris数据集中的特征来解决聚类问题。

    from sklearn.datasets import load_irisiris = load_iris()X, y = iris.data, iris.target
    c773f50c1555d7186149bc66901cd39c.png

    作为聚类问题的代表模型,这次我使用了K-means。

    from sklearn.cluster import KMeanskmeans = KMeans(n_clusters=3, random_state=0)kmeans.fit(X)y_means = kmeans.predict(X)
    04b5028653fb71b595f9316167bda712.png

    现在,监督聚类的结果是在y_means中。

    fe5265ac628e35989111fb960f69a523.png

    同质性得分,Completeness Score,V度量得分

    from sklearn.metrics import homogeneity_score, completeness_score, v_measure_score

    hg = homogeneity_score(y, y_means)

    co = completeness_score(y, y_means)

    vm = v_measure_score(y, y_means)

    print(hg, co, vm)

    6900a1072100e5a9807fd689afe17dc6.png
    9fa54290a9118dafa7f526880d4fc55c.png

    附加:学习曲线可视化

    from sklearn.model_selection import learning_curvefrom sklearn.model_selection import ShuffleSplitdef plot_learning_curve(clf, title, X, y, ylim=None, cv=None, n_jobs=None, train_sizes=np.linspace(.1, 1.0, 5)): plt.figure() plt.title(title) if ylim is not None: plt.ylim(*ylim) plt.xlabel("Training examples") plt.ylabel("Score") train_sizes, train_scores, test_scores = learning_curve( clf, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes) train_scores_mean = np.mean(train_scores, axis=1) train_scores_std = np.std(train_scores, axis=1) test_scores_mean = np.mean(test_scores, axis=1) test_scores_std = np.std(test_scores, axis=1) plt.grid()plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std, alpha=0.1, color="r") plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std, alpha=0.1, color="g") plt.plot(train_sizes, train_scores_mean, 'o-', color="r
    展开全文
  • 机器学习模型评估方法

    千次阅读 2017-11-24 10:33:18
    机器学习模型评估方案,包括训练集测试集划分方案,常用评估指标,AUC的具体含义等
  • 选择正确的度量来评估机器学习模型我们什么时候评估我们的机器学习模型呢?答案不是只有一次。通常,我们在实际的数据科学工作流中两次使用机器学习模型验证指标:模型比较:为您的任务选择最佳机器学习(ML)模型模型...
  • 尊重原创者机器学习模型评估指标汇总 在使用机器学习算法过程中,针对不同的问题需要不用的模型评估标准,这里统一汇总。主要以两大类分类与回归分别阐述。 一、分类问题 1、混淆矩阵 混淆矩阵是监督学习中的一种...
  • 机器学习模型评估与超参数调优详解
  • Datawhale干货作者:太子长琴,Datawhale优秀学习者本文对机器学习模型评估指标进行了完整总结。机器学习的数据集一般被划分为训练集和测试集,训练集用于训练模型,测试集则用于评估模型。针对不同的机器学习问题...
  • 关于机器学习模型评估的更全面的自述文件,详细描述了指标 创建GIF并添加到自述文件 刷新更流畅,绘图更新更快。 可以通过使用matplotlib的笔记本或窗口小部件后端来实现,但目前不起作用,请参见。
  • Datawhale干货作者:太子长琴,Datawhale优秀学习者本文对机器学习模型评估指标进行了完整总结。机器学习的数据集一般被划分为训练集和测试集,训练集用于训练模型,测试集则用...
  • 机器学习模型评估策略及相关术语 目录机器学习模型评估策略及相关术语1.模型评估1.1 训练集和测试集1.2 损失函数1.3 训练误差和测试误差1.4 过拟合和欠拟合2.模型选择2.1 正则化2.2 奥卡姆剃刀原则3 交叉验证3.1 ...
  • 机器学习模型评估与选择1 经验误差与过拟合2 评估方法2.1 留出法2.2 交叉验证法2.3 性能度量 1 经验误差与过拟合 误差:学习器的实际预测输出与样本的真实输出之间的差异 经验误差(训练误差):学习器在训练集上的...
  • 机器学习模型评估ppt

    2020-11-09 16:43:24
    模型评估,是通过某种实验方法,评估测得某学习器的性能度量,以此做为评判方法。 除此之外,还可以辅助以假设检验,比较学习器之间的泛化能力。 我们可通过实验测试来对学习器的泛化误差进行评估并进而做出选择。 ...
  • 作者:太子长琴,Datawhale优秀学习者本文对机器学习模型评估指标进行了完整总结。机器学习的数据集一般被划分为训练集和测试集,训练集用于训练模型,测试集则用于评估模型。针对不同的机器...
  • 15 机器学习模型评估指标–机器学习基础理论入门 7.1 回归问题评估指标 绝对误差 绝对误差为预测点与真实点之间距离之差的绝对值的平均值,即: 均方误差 均方误差为预测点与实际点之间距离之差平方和的均值,即 ...
  • 机器学习模型评估指标汇总 在使用机器学习算法过程中,针对不同的问题需要不用的模型评估标准,这里统一汇总。主要以两大类分类与回归分别阐述。 一、分类问题 1、混淆矩阵 混淆矩阵是监督学习中的一种可视化工具,...
  • 在上一篇中我们介绍了二分类模型效果评估常用的一些指标,当然在机器学习中除了二分类模型,还有多分类、预测、线性回归、聚类等许多其他模型,这些模型评估方法各有差异,将会在后续的内容中结合模型原理一起介绍...
  • 译者:追风者,Datawhale成员如何在投入生产前评估机器学习模型性能?想象一下,你训练了一个机器学习模型。也许,可以从中选几个候选方案。你在测试集上运行它,得到了一些质量评估。模型没有...
  • 【导读】:评估一个模型是建立一个有效的机器学习模型的核心部分,本文为大家介绍了一些机器学习模型评估指标,希望对大家有所帮助。 概览 评估一个模型是建立一个有效的机器学习模型的核心部分 评价指标有混淆矩阵...
  • 机器学习模型评估变得容易:绘图,表格,HTML报告,实验跟踪和Jupyter笔记本分析。 支持Python 3.6及更高版本。 安装 pip install sklearn-evaluation 产品特点 (混淆矩阵,特征重要性,精度调用,ROC) 报告...
  • 那本次分享的内容就是关于机器学习模型评估与超参数调优的。本次分享的内容包括:用管道简化工作流使用k折交叉验证评估模型性能使用学习和验证曲线调试算法通过网格搜索进行超参数调优比较不同的性能评估指标1. 用管...
  • 这里写目录标题机器学习评估报告格式常用评价指标分类模型混淆矩阵F1值AUC曲线ROC曲线实现代码 格式 找一个格式还不错的报告参考一下 常用评价指标 分类模型 混淆矩阵 就是二分类,真值正负类和预测结果的正负类。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,015
精华内容 2,406
关键字:

机器学习模型评估