带你看数据挖掘与机器学习-厦大EDP上课出勤预测
标签: 数据挖掘 特征工程 机器学习 出勤预测
write by xmhexi 2019/3/22
内容提要
首先说明本文是一篇科普文章,通过一个实际案例,帮助理解什么是数据挖掘、特征工程、机器学习等,文章中并不涉及详细的技术与参数。
本人刚刚起步初学,文章中均为本人的理解,有不妥之处,敬请指出。
文章中涉及的的姓名,电话等信息均做了模糊处理。
案例说明
事情的开始很简单,我的EDP课程已经上了8次课了,在班级群里,老师发了一张上课出勤表,让大家核对。 出勤表大概长这个样子的:
看着这张出勤表,我在想我们能做些什么呢?
能不能知道下次上课,谁会来,谁不会来,或者只来半天?
正好开始学习数据分析,那就用这些数据来做一个“上课出勤预测模型”吧,通过这些数据来最终预测下一次上课的出勤情况。
预测目标:下节课所有同学的出勤情况。
数据准备
说干就干,首先要获取这些数据,把出勤表图片经过剪切、识别:
最终得到对应的数据:
同学们有没来上课,跟什么会有关系呢?
寻找“有没来上课”有关系的东西,并把这些东西变成数字,就叫做“特征工程”了。
接下来就来寻找这些特征了。
特征工程
手上还有的资料就是同学录了,就从同学录入手。
脱敏处理
有些数据是比较敏感的,不适合到处传播,比如姓名,手机号,公司名称等,需要先进行一些处理,让这些数据可以使用但又不会被猜出来。
比如姓名就换成拼音的首字母,手机就保留前7位,公司名称就用序号来表示,其它的就可以删除了。
班委
都说“有担当 重责任”,担任班委职务是不是跟出勤有点关系?
班委信息按级别,小组长是1,班长是4; 责任越大应该越会来上课吧?
性别
都说男女有别,在决定去不去上课的时候,应该也是有差别的吧。
性别变成数字,女=0 男=1;
距离
在哪里上班(公司地点);离学校远不远? 外地的同学来上课肯定是阻力重重啊。
这个特征可以从公司名称查到公司地址,为了省事,我就用手机查询到手机号所的省、市。
先导入手机归属地数据,然后查看下同学们的手机所在地的情况:
根据手机所在的省和市,把同学们离学校的距离分成了4种类型: 本地的,周边的地区的,本省的;外省的;
职务
同学在公司的职务级别会不会影响来上课? 越是领导越忙,肯定有关系呢。
看一下有哪些职位:
职位太杂了,做下归类:
可以看出,大多同学都是经理和总监级别。
最后归成几类数字越大,级别越高:
结伴同行
都说“青春做伴好还乡”,同一个公司如果同时有几个伙伴一起来上课,那来上课的干劲应该高一点。
先看看各个公司派出伙伴的情况:
可以看出大多公司都是1个小伙伴,最高的有10个小伙伴。
最后按照派出小伙伴的数量高低分成5个级别:
星座
都说处女座的做事特别不一样,脑洞大开一下,如果找到同学的星座信息,这也可能成为影响来不来上课的因素!
找到班级同学过生日的信息:
对应计算出同学属于哪个星座,变成一个数字:
天气
天气会不会影响来上课的决定? 有可能噢。
上网找出了所有上课日期对应上课地点的天气情况。
不过这个特征没有加进去,留做以后再处理吧。
合成数据
找了这么多东西,最终得到了一些数据,把每个同学每节课的出勤情况做为一条记录,得到了1104条数据。
数据模型
上面找了这么多影响上课的因素(特征),到底哪些因素有关系,怎么样的关系呢,这个不用我们操心,建立一个数据模型就可以自动计算了。 我用了一个最简单的“决策树模型”,并进行“训练”,其实就是得到这些参数对结果的影响。
训练完成后,对已知的数据进行测试验证,看下准确度有多少:
哈哈,还不错哦,准确率有80%,也就是说用这个模型去预测未来,有8成的准确率。
那就用这个模型来计算下所有同学下一次上课的出勤情况,看下谁来谁不来,这个就叫“预测”:
预测完了是一堆的数据,为了好看,要处理成对应的格式:
怎么看数据呢?这张图中最后面的表格:
name_py就是同学的姓名拼音首字母;
"C9-1","C9-2"分别是下次上课的两天课程;
“1.0"表示这位同学来上课;
“0.0”表示这位同学不来上课;
“0.5"表示这位同学来上半天后就走了(嘻);
完整的预测结果
为了方便同学位查一下预测结果里自己来不来,我把所有的预测结果放在下面,重申一下:结果是预测出来的,准确度有限,权当游戏一把,别当真!
name_py,C9-1,C9-2
CXF,1,1
CDL,0,0
CMS,1,1
CQL,0,0
CYF,0,0
CZY,1,1
DX,1,1
FCX,1,1
FJT,0,0
FRK,0,0
FZY,1,1
FPP,1,1
GQH,1,1
GBS,1,1
HLM,0,0
HSJ,0,0
HX,1,1
HQJ,1,1
HHD,1,1
HHS,0,0
HTY,0,0
HYL,1,1
KZT,1,1
KYP,1,1
LFL,0,0
LWJ,1,1
LXH,0,0
LBC,1,1
LJG,1,1
LLH,1,1
LPH,0,0
LSJ,1,1
LYF,1,1
LBR,1,1
LGQ,0,0
LKC,1,1
LDF,1,1
LSB,1,1
LSF,0,0
PDZ,1,1
PSZ,0,0
QWH,1,1
QXH,1,1
SGZ,0,0
SYP,1,1
WJP,1,1
WXM_188,0,0
WYJ,1,1
WZ,1,1
WQL,1,1
WXM_155,1,1
XGC,1,1
XYH,1,1
YXB,1,1
YCP,1,1
YQX,0,0
ZH,1,1
ZJQ,0,0
ZSC,1,1
ZXY,1,1
ZY,1,1
ZWJ,0,0
ZLF,0,0
ZWF,1,1
ZYQ,1,1
ZQH,0,0
ZJW,1,1
ZYN,0,0
ZLJ,1,1
特别注明:有两位同学的拼音都是WXM,所以用手机号前3位附在后面以示区别。
调整模型后重新更新了预测数据,最后更新时间:2019.4.1
结束语
当然,上面的数据中还可以分析出很多有价值的信息;还可以使用更为复杂的模型,来做出更加准确的预测。
从开始有想法到完成整个项目,花了很多时间和精力,毕竟是本人首个完成的实际案例。
在此过程中要感谢EDP老师、同学提供了这么好的素材;
感谢QQ群里为我提供帮助的小伙伴们;
还要感谢我的家人和同事,提供了让我完成的时间与环境,谢谢你们!
后记
关于案例还是有些内容想要补充一下:
模型优化
上面文章中提到,这个模型的准确度只有80%,好象不太准。 还需要对模型进行优化,有几个方向:
-
对模型的参数进行调整,也就是常说的“调参”
-
再挖掘数据中更多的特征点;
本文中可以挖掘的特征点还很多,比如:
“上课时间是在一个月的什么时间,上旬中旬还是下旬?”
“有没有连续不来上课的记录或者是请假的记录?”
“对于外地游学这个课程,重要程度比其它课程高。”
“同一次课程里,第二天来上课与第一天有点不同。”
“在公司是从事哪个部门,技术、人力还是销售?”
“所在的公司是哪个行业,生产型还是互联网?”
-
使用不同的模型来做训练,并做对比;
-
扩充数据,看看其它班级还有数据加进来,让数据更丰富;
视野
“当你知道的越多,未知的也会越多。”
分析完数据后,能带给我们什么呢,除了预测结果以外,其实还可以分析训练完的模型。
模型中每个因素(特征)都有一个对应的系数,表示它对结果的影响程度,有的因素(特征)的系数比较大,属于关键因素(关键特征)。从模型里可以看到,哪个因素(特征)对结果的影响比较大。
这就为我们提供了控制结果的可能性,只要控制好这些核心因素,就能对最终的结果产生想要的影响。例如:
- 在上面案例中,如果我们发现“离学校的距离”,“公司职位的高低”是影响“出勤率”的关键因素,那么在招生时进行优化,老师也可以对这些学生给予特别的关注。
- 如果在“用户下单预测模型”中发现,“有没有咨询过客服”是“最终下单”这个结果的关键因素之一,那么就可以通过“主动发起”等动作来促进用户下单。
来源:oschina
链接:https://my.oschina.net/u/1156588/blog/3026038