广告点击率(CTR)预测项目
点击率(Click through rate)预估用来判断一条广告被用户点击的概率,对每次广告的点击做出预测,把用户最有可能点击的广告找出来,是广告技术最重要的算法之一。
https://www.kaggle.com/c/avazu-ctr-prediction
模型评估
任何的AI系统需要有一个合理的评价指标,在没有想好评价标准之前最好暂时不要去开启项目的实施。因为一个没有办法评估的系统是没有办法去持续优化的,这是搭建任何AI系统时必须要考虑关键点。
对于广告点击率预测任务来说, 合理的评价指标是 F1-Score,由于此项目中, 正负样本的比例有较大的差距, 更适合使用 F1-Score来评估训练好的模型。
1. 特征选择技术
- 尝试所有的组合;
- 贪心算法;
- L1正则;
- 使用树算法;
- 相关性技术;
尝试所有的组合
一个数据中有10 个特征, 假如我们考虑包含3个以上(包括3个)特征的组合, 总共有多少种组合? (2^10 - 56)种组合;
由于只考虑3个特征以上的组合, 也就意味着要排除包含1个特征的组合和包含2个特征的组合, 分别是10个和45个 (10*9/2), 另外我们也需要排除空集合, 所以答案是 2^10-56。
我们完全可以把所有的可能性都罗列出来,并尝试每一种组合,但这样的问题点在于时间复杂度特别高,这种复杂度我们也称之为指数级复杂度(exponential complexity)。
贪心算法
对于贪心算法的特征选择, 它找出来的是sub-optimal特征组合; 这种方法需要借助于某个具体的模型一起使用;贪心算法的效率高;
贪心算法在特征选择的问题上, 并不能保证找出来的特征组合是全局最优解。
L1正则 => Sparse
L1正则特别适用于样本量少,但特征维度高的情况。一个经典的场景就是神经科学,如果把每个人大脑里的神经元看作是特征,那这个特征维度非常之高。另外,在建模环节里,有时候我们希望模型训练过程
中产生一些稀疏性的特点,这时候L1的正则必然是我们的首选。
使用树算法(决策树)
相关性计算
特征选择总结
那最后的问题是,特征选择到底用什么方法比较好呢? 其实也没有正确的答案,要看问题本身。比如我们要构建一个评分卡系统,而且这是跟钱直接打交道的,所以每一个使用的变量都要精心地设计。这时候,
我们通常花一些精力在变量相关性分析上,并决定哪些变量要放在模型里。通过相关性分析来选择变量有一个很大的好处:就是很强的可解释性,这也是金融领域的需求。
另外, sklearn里其实也提供了几个常用的特征选择的方法,可以去看下官方的文档:https://scikit-learn.org/stable/modules/feature_selection.html
2. 网格搜索和贝叶斯优化
两种用于超参数搜索的方法,分别为网格搜索和贝叶斯优化。
网格搜索技术
对于超参数的搜索,最常用的方法叫作网格搜索 (Grid Search),就是在可选的空间里,把每一种可能性逐一去尝试,也是工业界里最常用的方法。网格搜索核心思想无非就是把预先定义好的所有可能的组合全部
搜索一遍,最终定下来哪一组超参数组合的效果最好。
网络搜索(Grid Seard)
一个模型有3个超参数a, b, c, 对于这三个超参数我们去搜索最好的一种组合。
- 对于参数a, 使用np.linspace(1, 10, 10)来搜索,
- 对于参数b, 使用np.linspace(1,10,5)来搜索,
- 对于参数c, 使用np.logspace(0.01, 100, 5)
来搜索。请问: 对于此网格搜索,总共要考虑多少个组合? 10×5×5=250种
需要先了解 np.linspace和 np.logspace的用法。
np.linspace(1,10,10)的意思是在1和10的区间里取出10个点使得每个点之间的距离是一样的。
网格搜索是最简单的用于搜索超参数的方法。但由于需要把所有可能的组合全部考虑进来,时间复杂度非常高。但好处是,在网格搜索的前提下,这些操作都可以并行进行下去。
启发式搜索
遗传算法和贝叶斯优化都属于经典的启发式算法范畴。对于遗传算法,我们也可以用它来做量化投资。另外,对于贝叶斯优化,这是一个崭新的领域,它的内核是基于了贝叶斯思想,并内部使用了高斯过程等技
术。可以参考Ryan Adams的工作: http://www.cs.princeton.edu/~rpa