V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SlipStupig
V2EX  ›  程序员

机器学习如何对已经上线的模型进行召回 & 重新训练

  •  
  •   SlipStupig · 2020-01-28 18:45:33 +08:00 · 5028 次点击
    这是一个创建于 1760 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题一:我做了一个新闻分类器,在本地训练和测试的准确率是 70%,我上线之后,如何评估线上的准确率呢?

    问题二:假设我有一些类别分错了,我想定期自动分拣出错误的结果,然后加入到训练模型里面重新训练,然后再上线(相当于一个自动召回系统?)

    28 条回复    2020-02-01 17:43:29 +08:00
    shikimoon
        1
    shikimoon  
       2020-01-28 19:19:28 +08:00
    问题一不说了,问题二不一定总是有效
    classyk
        2
    classyk  
       2020-01-28 19:25:21 +08:00 via iPhone
    在线学习 online learning 了解一下
    SlipStupig
        3
    SlipStupig  
    OP
       2020-01-28 20:30:05 +08:00
    @shikimoon 结果是 1 和 2 我都不知道该怎么办。。
    SpencerCJH
        4
    SpencerCJH  
       2020-01-28 20:40:02 +08:00
    有请算法工程师登场 (逃
    paopjian
        5
    paopjian  
       2020-01-28 21:01:45 +08:00 via Android
    线上准确率不就是接着打标签再算吗?
    sethverlo
        6
    sethverlo  
       2020-01-28 21:24:29 +08:00
    1. 打日志就行了嘛…

    2. 看你用的是什么框架啊,有的框架不支持 continue training 的,比如说 fasttext

    (其实 fasttext 支持 unsupervised 的再训练,但我用的是 supervised learning
    SlipStupig
        7
    SlipStupig  
    OP
       2020-01-28 21:36:56 +08:00
    @sethverlo 框架用的是 sklearn,日志确实能知道分类结果,但是我如何知道哪些是正确的哪些是错误的,如果数据过大靠人工似乎不现实。我想的是有没有一个相对自动的一点方案能让我分拣出漏报和误报的样本,然后让我重新进行训练,类似汽车召回一样的机制。

    @paopjian 比如我又 100 个样本以及被分类了,我离线的时候可以划分测试集和训练集,线上实际生产环境如何划分呢?我如何知道哪些被分错了的,并纠正然后继续训练?
    SlipStupig
        8
    SlipStupig  
    OP
       2020-01-28 21:41:11 +08:00
    @sethverlo 还有一种情况就是加入了新的样本,进行增量训练
    razrlele
        9
    razrlele  
       2020-01-28 21:43:06 +08:00   ❤️ 1
    Q1:
    可以用 AUC 来衡量离线在线指标。

    Q2:
    定期更新模型。
    shikimoon
        10
    shikimoon  
       2020-01-28 22:00:38 +08:00   ❤️ 1
    @SlipStupig 你这是想当然了,把识别错误的 case 加进训练集重新训练效果就能变好,那一直加 acc 不是变 100%?
    Xs0ul
        11
    Xs0ul  
       2020-01-28 22:43:39 +08:00   ❤️ 1
    线上如果没有用户反馈给你标 label,没法知道预测是对是错. 不然你把这套流程移到输出之前,岂不是凭空提高了准确率
    paopjian
        12
    paopjian  
       2020-01-29 00:17:30 +08:00 via Android   ❤️ 1
    你要想在线学习我建议走 deeplearning,不用打标签,你这也太理想化了,监督学习引入非监督变量,那怎么判错?
    SlipStupig
        13
    SlipStupig  
    OP
       2020-01-29 00:28:28 +08:00
    @paopjian
    @Xs0ul
    @shikimoon

    感谢各位指正,这方面我水平不够,确实走入了误区。想请教一下各位,实际生产环境中模型上线了之后如何进行优化,有没有什么流程性的东西可以指点一下?
    HankAviator
        14
    HankAviator  
       2020-01-29 00:29:41 +08:00 via Android   ❤️ 1
    1. 看你关注的指标,AUC,lift,误分类率都可能用得上。
    2. 持续训练是成本最低且现实的方案,主流企业也都是采用这个办法。样本量够大就足以生成令人满意的模型。
    HankAviator
        15
    HankAviator  
       2020-01-29 00:31:07 +08:00 via Android   ❤️ 1
    另外采用复杂算法(集合树)相对简单二分类树可能有更好的效果
    HankAviator
        16
    HankAviator  
       2020-01-29 00:33:18 +08:00 via Android   ❤️ 1
    上线模型一般都做周期性检验,然后测试环境跑一下,没问题就迭代到生产。引入尽可能多的变量也会有帮助(如果成本允许)
    SlipStupig
        17
    SlipStupig  
    OP
       2020-01-29 00:44:17 +08:00
    @HankAviator 问一个小白问题,指标该如何选择?
    paopjian
        18
    paopjian  
       2020-01-29 01:35:32 +08:00 via Android
    建议看一下 Hands - On.Machine.Learning.with.Scikit - Learn.and.TensorFlow。里面的机器学习方法都有讲,你这个 70 正确率也不是太好的
    Mrpasserby
        19
    Mrpasserby  
       2020-01-29 03:13:20 +08:00
    你需要收集日志
    t6attack
        20
    t6attack  
       2020-01-29 06:27:46 +08:00
    现实生产环境中,比如 预测金融市场、预测天气,都是用事实结果作为新数据持续训练的。
    你这种,事实结果只能人工判断。没有其他办法。如果有,那就形成了逻辑悖论。如果有其他“非人工”方式可以知道分类结果是否准确,为什么不直接用这个方式进行分类呢?
    pandachow
        21
    pandachow  
       2020-01-29 07:20:46 +08:00   ❤️ 1
    如果线上环境没有引入用户反馈机制,那么分类器的分类效果是没有办法自动提升的。

    例如广告点击这样的业务场景,给用户看若干广告,用户可以选择无视,点击,或者点击 X 关闭,进而可以通过用户的反馈 target,再把新样本放进去不断训练。所以建议结合产品和业务场景引入一个合适合理的反馈机制。

    错误样本不需要重新训练,你可以手动设定他们的权重,如果是 heavily imbalanced dataset 的分类场景,建议使用 ROC & AUC (或带权重的)来作为评估。
    otato
        22
    otato  
       2020-01-29 09:17:41 +08:00   ❤️ 2
    如果不靠人工能分辨对错,为什么还需要你这个系统,直接上线分辨系统啊
    icylogic
        23
    icylogic  
       2020-01-29 10:52:37 +08:00 via iPhone   ❤️ 1
    supervised 只能持续人工标注新样本然后继续训练 /重新训练啊,你能做的只是提取出大小合理的 sample 送标注
    p2pCoder
        24
    p2pCoder  
       2020-01-29 14:01:25 +08:00   ❤️ 1
    线上的业务指标和离线指标是不一样的
    线上的业务指标是需要通过实验平台进行 abtest 的,比如一般的 ctr cvr,日活的变化,留存率的变化,以及总的转化,这些需要业务方确定指标
    实验平台也是一个比较大的工程,具体可参考谷歌的论文
    你最终的目标是通过这个分类器,使在新闻分类这个栏目下,各个新闻分类下,总的业务指标提升,比如用户 ctr,用户停留时长,用户总的点击量,平均每个用户点击量之类的指标

    至于样本滚动更新,正负样本的选取,模型的例行训练,模型的滚动更新,甚至在线学习,这些又是其他很复杂的东西了

    机器学习落地是一个大的系统性工程
    SlipStupig
        25
    SlipStupig  
    OP
       2020-01-29 19:53:57 +08:00
    @p2pCoder 大哥,太感谢了,能留个联系方式么,想深入交流一下,顺带表示感谢
    p2pCoder
        26
    p2pCoder  
       2020-01-30 13:28:32 +08:00
    @SlipStupig wx:emdiZ3gx
    SlipStupig
        27
    SlipStupig  
    OP
       2020-01-30 22:40:39 +08:00
    @p2pCoder 查找不到哦 😯
    p2pCoder
        28
    p2pCoder  
       2020-02-01 17:43:29 +08:00
    @SlipStupig base64
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2434 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:46 · PVG 23:46 · LAX 07:46 · JFK 10:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.