在多数数据和机器学习的blog里,特征工程 Feature Engineering 都很少被提到。做模型的或者搞Kaggle比赛的人认为这些搞feature工作繁琐又不重要不如多堆几个模型,想入手实际问题的小朋友又不知道怎么提取feature来建模型。我就用个性化推荐系统做个例子,简单说说特征工程在实际的问题里是怎么做。
定义
特征工程 Feature Engineering 在一篇Kaggle blog上有很好的定义:
By feature engineering, I mean using domain specific knowledge or automatic methods for generating, extracting, removing or altering features in the data set.
基本上说是,用目标问题所在的特定领域知识或者自动化的方法来生成、提取、删减或者组合变化得到特征。这些特征可能是显而易见比如说商品的品牌,也有可能需要复杂的模型计算,比如Facebook上用户A和用户B之间关系的紧密程度(FB使用了一个决策树来生成一个描述这个程度的向量,这个向量决定了他们News Feed推荐内容。)。这篇blog覆盖了一些用领域知识的方法,自动化方法在这里没有提及。
背景
个性化推荐系统 Personalized recommender system 比其他的机器学习方法更依赖特征工程,所以我拿它来当作问题的背景,结合我之前做过的一个推荐系统里相关经验来说说特征工程具体是个什么东西。
关于推荐系统和个性化推荐系统,可以参看 wikipedia 具体不赘述,以下的要点也尽量点到为止,否则这篇又成了“收藏了Mark了”但是不会读的冗余长文。以下如果不特别指出,我就用推荐系统作为“个性化商品推荐系统”的简称。简单来说,推荐系统就是你买了商品A,我们给你算出来个推荐列表 B C D E 等等。商业上来说个性化的推荐比一般化的推荐更能吸引顾客点击或购买,所以利用特征功能提取这些“个性化”的特征放到推荐模型里就很重要,比如在我们的推荐系统里,把“品牌”的特征加进去,相对于 baseline 提高了20%左右的nDCG。推荐系统可以是机器学习的模型也可以是基于关联或者统计规则的模型,对后者来说特征对推荐效果的提升占的比重更大。
利用领域知识生成和提取特征
这几乎是特征工程里占大半时间的工作了:如何描述个性化并且用变量表示成特征。一般方法就是,想想你就是该商品的目标用户,你会想要什么样的个性化。
比如说我们做一个女性衣服类的推荐引擎,这个网站卖各种牌子颜色尺寸等。我们列出可能相关的一些特征,然后在实际购买数据里面检查他们是否对购买结果产生影响和关联性。比如,从购买数据里可以看出,女性对衣服的品牌多数有固定偏好,比如我太太就很喜欢LOFT的衣服。这些能对购买产生影响的因素都可以成为特征。
这部分工作需要很多领域知识,一般需要一组的研究人员讨论,要认真的思考这个特定问题有些什么和别的问题不同的特征,也建议和市场部销售部等有领域知识的专家讨论。经验上来说,这些特征提取的越多越好,并不用担心特征过多,因为推荐系统的数据量都比较大,并且基于一些规则可以很好的筛选特征。
很多机器学习的方法也可以拿来提取一些比较不容易得到的直接特征,比如说原始数据里面没有人工标记过商品的颜色,这些颜色可以通过图像识别得到。统计规则也可以从销售数据里得到一些特征,比如该商品的流行程度。
注意,这些特征可能是固定不变的,比如颜色,品牌等。它也有可能随着时间变化,比如商品的销售排名。实际经验来说,时间变化采样的颗粒度要按照实际推荐效果来决定,很可能过去三个月的销售排名对推荐效果来说可以很稳定,也或许昨天的排名对今天的推荐效果比三个月平均更好。
特征的表达
大家都知道特征可以是“红”“绿”“蓝”这些离散特征,也可以是1.57这样的连续值特征。一个特征具体如何表达,要看在它在具体模型上怎么用。某些特定问题更倾向于离散特征,因为像推荐系统这样数据很大的情况可以利用模型训练这些特征得到比连续值表达更好的效果。