数据原型
广告特征 adFeature.csv
1 | aid advertiserId campaignId creativeId creativeSize adCategoryId \ |
用户特征 user_feature_sample.csv
1 | Unnamed: 0 LBS age appIdAction appIdInstall carrier \ |
用户特征里出现了空值 NaN,以及用空格分开的一对多的值,在下一段介绍怎么处理
用户-广告关系 train.csv
1 | aid uid label |
特征提取
代码参考的是参考资料里的 baseline 的代码,稍做改动
1 | import pandas as pd |
数字的特征提取
对于纯数字的特征,要先 LabelEncoder().fit_transform() 后再 OneHotEncoder().fit_transform()。
LanbelEncoder 会给值重新赋值,这样可以忽略值的大小。例如
1 | In [3]: LabelEncoder().fit_transform([111,0.2,3000,42,25]) |
关系的特征提取
用户特征分为三层
- 第一层是广告和用户的信息
- 第二层是广告和用户的关系,这里用pd.merge 合并成一个二维数组
- 第三层是用户和其他信息的关系,是字符串格式,内容是用空格隔开的数字,被当成单词后会按词向量处理,即忽略顺序。
第三层处理完后用 sparse.hstack 压成一个二维数组,就成了最终训练用的特征。
特殊的关系特征
用户特征里面有一类
1 | ['os','ct'] |
这类值是用空格隔开的数字,但是数字只有1位。例子里用 LabelEncoder,会被当成整个字符串,显然不合适。用 CountVectorizer 则会报
1 | ValueError: empty vocabulary; perhaps the documents only contain stop words |
我的做法是去掉空格(不去也一样)后用 CountVectorizer(analyzer=’char’)
关系的数量
关系特征里面还有一项是数量,比如 interest1,有些人只有一个,有些人有很多,更高分的选手把这项也计算出来作为特征。
参考资料:
2018腾讯广告算法大赛baseline:https://github.com/YouChouNoBB/2018-tencent-ad-competition-baseline