共计 1410 个字符,预计需要花费 4 分钟才能阅读完成。
下午的会议整的我得好好想一想。
做算法其实最头疼的一件事应该就是想特征,一版接着一版,无穷无尽的迭代下去。相比较模型,并不是高大上的模型才会起到更大的作用,数据是天花板,模型的优化排在最后面。
那么,特征应该就是机器学习的核心了。
Q1 如何去挖掘特征?
1、正面思考
个人觉得从这个角度去思考,大部分会倾向于直观上的经验构造出特征,直觉。
eg1、
不同的行业面临着不同的业务背景,特征也是从业务中来得。比如金融行业,用户的日常消费流水,用户的基金购买情况都是比较重要的特征,直观
上去看跟当前的业务强相关。或者电商平台推荐,用户的点击序列特征就很重要,强烈反应用户的兴趣,阿里的DIN或者DIEN都是这样的体现。
eg2、常见的基础属性特征,比如电商中的商品ID ,分类之类的特征,都是属于 Lowlevel 特征,也就是最原始的特征,没有经过任何的加工
eg3、经过加工过的特征,号称 HighLevel ,比如对用户的兴趣偏好,人群划分,这些可能需要经过模型或者特殊的规则策略来构建出来的特征
2、反向思考
这种情况下其实是在你算法模型上线之后,发现一些问题之后反向回溯寻找构建新的特征。
比如你电商推荐中新产品推不出来,或者某些分类的商品推不出来,你要去寻找到底要不要推出来,如果要我还需要从哪些特征入手
eg youtube 就出过一篇论文,文中提到了物料 Example age 特征,线下样本里会有相应的值,线上全部置为 0 来消除样本之间的偏差,
那么我觉得在构建新一版的特征的时候可以从两个角度去同时并行去开发。
Q2 挖掘出来的特征需要考虑哪些点?
1、数据获取难度
如果你想到的特征获取的难度很大,你需要消耗大量的精力去做,也不一定能做好,比如很多获取不到的还需要依赖模型去预测,那么精度的问题也需要考虑
2、数据覆盖率
比如历史行为吧,新用户没有,怎么处理?或者你的埋点无法获取某些用户的特有信息比如位置?
3、数据准确率
数据准确性是至关重要,garbage in garbage out 这个道理都懂。
Q3 找到的特征如何去验证有效?
1、特征独立的角度
假设各个特征都是相互独立的,那么可以通过计算与label 之间的关联程度,比如信息熵 ,皮尔逊系数,卡方检验等手段来实现。还有就是特征很多使用 LR 模型来输出各个特征的重要性。
这里重点说一下,如果只是单变量分析,你是无法区分共线性,比如年龄,出生日期这样的两个特征,你用卡方检验或者其他,发现它都很重要,所以你都留下来了,也就是说冗余信息你无法做到判断。
2、非线性特征组合
如果考虑特征之间的交互,可以使用RF或者XGBoost来进行特征选择,具体方法不赘述,概括来说就是将想要检验重要性的特征在样本上进行排列组合,然后观察OOB错误的上升程度,上升越大,说明这个特征越重要
你在组合分析的时候可以去发现上面的举例中的年龄和出生日期可以去掉一个。
Q4 不要指望深度模型给出特征重要性的判断
毕竟END-TO-END黑盒子就是这么简单粗暴,想要可解释型,只能是人工特征的可解释性
Q5 快速验证的手段:个人觉得还是跑模型,快速迭代
快速迭代,但是也不是无意义的快速迭代。
在 Q3 里其实多个特征的情况下还是要生成样本去跑模型,对于数据流而言,离线特征可以通过回刷数据的方式实现,在线特征可能需要积累。
如果特征很少,一两个通过画图看方差,或者区分度这些能够说明在样本中的差异性,也是可以直接用Excel 等工具或者简单的代码可以绘图展示出来也行。