本片博文对应的代码在github:https://github.com/kunguang/SelectFeature/tree/develop ,develop分支下
转载请注明:http://blog.csdn.net/zkwdn/article/details/53390923
背景
在ctr训练模型之前,我们需要特征交叉,特征选择,特征编号,单特征auc和logloss(这3步是一个重复的循环,得到每个特征的auc和logloss后,选择一些有用的特征重新开始编号),映射成训练样本(libsvm格式或者其他格式)这5个过程。但是,其中特征交叉和特征编号这2个过程有点复杂,当我们实验一个新的特征的时候,要改写大量的代码。我们熟知的特征交叉形式有如下3种形式:单特征和单特征的交叉,比如性别和年龄的交叉;单特征和多特征的交叉,比如年龄和用户的兴趣;多特征和多特征的交叉,比如用户的兴趣和当前搜索的query包含的关键词。我们最后选取的特征既有连续特征,又有ID特征,其中连续特征需要等频离散或者其他离散方式进行编号,将他们统一编号有些复杂。所以,本代码的目的就是为了能够在不改变代码的前提下,紧紧通过配置文件(xml格式)便可以完成上述5个过程,最终的到训练集和测试集。
模块描述
本小节按照上面的5个过程描述一个真正的实例,
假设现在输入的数据格式如下,
label |
uid |
sex(性别) |
age(年龄) |
location(地域) |
custuid(广告主ID) |
inters(用户兴趣) |
搜索query包含关键词 |
日期 |
1 |
1 |
女 |
18 |
北京 |
1 |
足球|篮球 |
体育|足球 |
20161102 |
0 |
2 |
男 |
19 |
上海 |
2 |
军事|娱乐 |
飞机|大炮 |
20161102 |
0 |
3 |
女 |
18 |
北京 |
1 |
体育|娱乐 |
范冰冰|电影 |
20161103 |
1 |
4 |
男 |
19 |
上海 |
2 |
足球|篮球 |
足球|奥运 |
20161103 |
1.特征交叉和特征选择
特征交叉的形式如背景中描述,有3种形式:
1.单特征和单特征的交叉:比如性别和年龄,广告主三者的交叉,相当于在本来的6个特征中额外又加入了一列sex_age_custuid,
sex_age_custuid |
女_18_1 |
男_19_2 |
女_18_1 |
男_19_2 |
2.单特征和多特征的交叉,比如性别和用户兴趣的2者交叉,相当于在本来的6个特征中额外加入了一列,sex_inters
sex_inters |
女_体育|女_足球 |
男_飞机|男_大炮 |
女_体育|女_娱乐 |
男_足球|男_篮球 |
3.多特征和多特征的交叉,比如兴趣和当前搜索词的交叉,相当于在本来的6个特征中额外加入了一列,inters_query
inters_query |
足球_体育|足球_足球|篮球_体育|篮球_足球 |
军事_飞机|军事_大炮|娱乐_飞机|娱乐_大炮 |
体育_范冰冰|体育_电影|娱乐_范冰冰|娱乐_电影 |
足球_足球|足球_奥运|篮球_足球|篮球_奥运 |
配置文件如下:
每个特征用<item></item>包括,包含4个属性:
1.index:
用来描述输入数据中该特征在第几列,从0开始.比如性别这个特征,index就是1.对于交叉特征,即输入数据中没有的这个特征,这个属性不应该存在。
2.name : 用来描述该特征的名字,比如性别这个特征的名字叫sex
3.category:有2个取值,singlefeature,crossfeature。对于输入数据中所有的特征都取值single feature,对于所有输入数据中没有需要交叉才能得到的叫做cross feature。
4.selectindex:用来描述输入数据中,该特征应该在第几列。比如想让性别这个特征在输出中是第3列,那么数值就是3。如果不想让性别这个特征在输出数据中存在,就不要这个属性或者值默认为-1。用作特征选择
这样来看,其实category这个属性和index冗余了,即当Index属性不存在时,category的值应该是cross feature,表明这个特征在输入数据中不存在,需要交叉获取。但是为了以后理解起来方便,还是加上吧。
<allitem>
<item>
<index>0</index>
<name>label</name>
<category>singlefeature</category>
<selectindex>0</selectindex>
</item>
<item>
<index>1</index>
<name>uid</name>
<category>singlefeature</category>
<selectindex>-1</selectindex>
</item>
<item>
<index>2</index>
<name>sex</name>
<category>singlefeature</category>
<selectindex>-1</selectindex>
</item>
<item>
<index>3</index>
<name>age</name>
<category>singlefeature</category>
<selectindex>-1</selectindex>
</item>
<item>
<index>4</index>
<name>location</name>
<category>singlefeature</category>
<selectindex>-1</selectindex>
</item>
<item>
<index>5</index>
<name>custuid</name>
<category>singlefeature</category>
<selectindex>1</selectindex>
</item>
<item>
<index>5</index>
<name>inters</name>
<category>singlefeature</category>
<selectindex>-1</selectindex>
</item>
<item>
<index>6</index>
<name>query</name>
<category>singlefeature</category>
<selectindex>-1</<