那天我到底为啥折腾crucio
事情得从上个月说起,手头这个推荐系统项目刚搭完骨架,准备塞数据训练了。同事老张提了一嘴:“缺省值处理用crucio呗,听说贼快。”我嘴上嗯嗯答应着,心里犯嘀咕:这玩意儿名字听着就疼,靠谱吗?
结果第二天真给我整破防了。两千多万条用户行为数据,pandas的fillna跑得像老牛拉破车,半小时进度条才挪了5%。我鼠标一甩就打开了GitHub,搜crucio的文档。完犊子,文档写得跟天书似的,满屏参数名连个中文解释都没。
开整第一步就栽坑里
按着官方安装说明敲完pip install crucio,终端突然飙红字。我盯着报错信息懵了:“Visual C++ 14.0 required”?我就是个写Python的还得装C++?骂骂咧咧翻了三十多个论坛帖子,靠安装老版本vs_buildtools才搞定,光环境配置就耗掉两小时。
好不容易跑通安装,兴冲冲导了份测试数据进去:
- 左手刚敲完*.fit_transform(df)
- 右手就弹窗报错:”DataFrame object has no attribute ’get_iloc‘”
对着报错查源码才发现,这破库强制要求列名必须是字符串!我三列datetime类型字段全得先*(columns=str)
参数调到我怀疑人生
最坑爹的是参数组合。官方示例里轻飘飘一句“设置n=5”,我试了才知道n代表最近邻数量:
- 设n=3,500万数据跑了8分钟
- 改n=10直接卡死半小时
- 降到n=2结果准确率跌成狗
更绝的是weight参数,文档就写了句“可选uniform或distance”。实际跑起来distance模式比uniform慢三倍不说,出来的模型AUC还低了0.04。合着我服务器烧着电费就为了开倒车?
最终暴力解决方案
折腾到凌晨三点终于悟了:所有花哨功能都是坑。回归原始操作:
- 1. 简单模式开满workers=8
- 2. 只选median补数值型字段
- 3. 分块读取大文件处理
凌晨四点跑完一批数据时,发现最新版crucio的GitHub仓库已经404了。合着我熬通宵研究的库原作者跑路了?查了下果然有人提issue骂:“作者去年说好的更新文档鸽到”
所以给大伙儿血泪建议:小规模数据拿sklearn的SimpleImputer顶一顶得了,别像我一样蹲坑里等源码更新,等到马桶都结冰了人家早注销账号跑路了!
还没有评论,来说两句吧...