预测公司的优秀员工评选

trac_winner_predict

Try to predict who is winner of Next Quarter in company based on history info, just for fun

背景

公司每个季度都会有优秀员工的评选,需要每位员工参与提名他们认为合适的候选人,再由leader组成的委员会对于候选人做最终评定。在本次评定中, 新增加了一项最佳预测奖,即如果提名和实际获奖员工的一致程度越大,那么就可以认为是越准确的预测。
对于这一情况,我想可以抽象为一个候选人获奖的预测模型,根据历史的评奖行为来计算候选人新获奖的可能性。

前期处理

这里主要是评估数据源(毕竟这不是一个准备好数据的模型处理问题,而是一个从原始数据都要自己去搞的模型)、可行性以及相关取舍,通俗来说就是看看能不能做,得怎么做,什么不做。主要的方式就是看数据。 可以发现的规律: (1) 有当期评价后预估获奖可能性 – 更合理一些,因为描述和评估结果本身是有较强相关性的 – 最基本的是评价条数,条数越多代表越受欢迎 经过观察后发现,如果了解本次数据,依赖本次的评价长度和个数,基本就可以判定获奖对象了 – 实际上有可能最终评定的方法也就是依赖于此 (2) 无当期评价时预估获奖可能性 先验知识: 连续获奖概率很小 但相隔一次的获奖概率并不低 :比如今年Q2和去年Q3,重合人数达到4人,但这种规律只出现了一次,可信性不大

因为是周三提出评选,周日前要给出提名,同时这周工作上的事情又很多,所以并没有很多时间处理这个问题,那么就要涉及用时的评估。在最初的设想中,因为我们直接会用到的数据是候选人的评价数据,而评价本身是一大段一大段的语句,因此我想到是否应该在NLP方面做一些事情,也看了python相关的一些中文处理库的方法,但是考虑到这个问题并非提取每个候选人的特性,而是去搞最终获奖人的共性,而共性提取中又要涉及到词性的处理,blabla,而且很可能提出的共性会是一些没什么用的常用词,所以最终放弃了对语言方面的处理,而是将评价简单抽象为评价个数和单个评价的字数长度。但如果只用这两个信息,显然评估上又不太靠谱,因此想想可以把用户的特征抽取的更仔细一些,包括性别、职位、部门,这些可以从公司网站上抓取。还有一个重要的信息就是入职时间,入职时间和评奖时间的时间差可能对结果也会产生影响。

数据抓取:

因为这是一次实际问题的抽象,好处就是好玩,坏处就是所有数据源,从抓取开始都要自己处理。在这里我主要用到了reqeusts和Beautifulsoup,具体细节时间所限不表了

数据预处理: 1. 根据user的部门、入职时间、性别、描述、以及之前的描述计算获奖概率 1.1 user position/gender/desc/onboard time : 来源是domobfamily 1.2 评奖记录:从trac上面抓取,比较坑,各种数据不一致 user: time, pre_comment_num, pre_comment_value, [关键字], Y(是否获奖) – 这里说明,第一次的获奖记录名单暂时没有利用 1.3 将1.1和1.2的数据做join
也就是说以Q3评奖数据和Q1获奖记录做用户级别combine 如1.1中有但1.2中无的数据: 如用户入职时间晚于12月,则忽略 如用户入职时间早于12月,则增加一行为0记录 如1.2中有但1.1中无的数据: 抛弃 (说明已经不在了) 此时将time转换为入职时间的距离,以及其它类别数据的转换–comment的长度

– 至此形成训练数据 (两个季度的数据作为训练 ) – 根据两组时间,先遍历name 如果name对应的入职时间小于组时间,则忽略 否则: 根据name和组时间查找 是否有评价信息, 如有则归并name信息后生成一条记录 如无则生成一条未被选中的记录

这里说的生成还包括数据的重新编码: pre_comment_value / onboard_date

其它数据格式匹配

  1. 名称匹配 “丹丹”和“柳丹丹”
  2. 日期格式转换
  3. 职位名称处理: 先用部门,如果不清楚部门就用title
  4. description转换
  5. 评价描述转换 – 转为 条数 和 字数

模型训练

分类树

交叉验证

平均准确率可以达到80%

最终结果

待了解。。。

感悟

其实最主要的感悟是,通过思考,是可以把生活中的实际问题抽象成一个模型,并且用模型去做一些事情。所以不管最终预测的实际结果如何,这都是一件很有乐趣的事情