menc
2016-06-07 00:19:35 +08:00
我不懂你的问题是什么,但是举一个差不多的例子。
一个开在电影院旁边的奶茶店卖奶茶和果汁,让你预测明天的销量,应该怎么找特征呢?
第一步,用脑子想,有什么因素可能影响销量呢?恩,考虑饮品销量可能不会突变,会平滑变化,那么过去几天的销量可能和明天的销量相关;恩,夏天果汁和奶茶会卖的多一些;恩,旁边电影院放大片的时候顾客多,销量会多一些;恩星期六星期日销量会多一些;法定节假日人也会多,卖的也会多一些等等等等。。。
然后去搜集相关的数据。
那么已知:
今天的总销售量
昨天的总销售量
前天的总销售量
今天的奶茶销售量
今天的果汁销售量
今天的天气(阴晴雨雪雾霾冰雹大风)
今天是星期几
明天是星期几
今天是否是节假日
明天是否是节假日
今天电影院上映的电影过去七天的票房
....
林林总总的数据。
第二步,要把相关的特征去掉,取特征尽量取正交的特征,这样训练起来不会在 loss function 那里飘忽不定。也不会让特征有一个钦定的初始权重,假设你使用 LR 模型,选用了两个基本一样的特征,那么该特征的权重就天然是其他特征的二倍了。
比如饮品店里,有三个特征,今日销售额,今日奶茶销售额,今日其他饮品销售额,显然今日销售额是今日奶茶销售额和其他饮品销售额的现行叠加,第一个特征和第二,第三个特征成相关性,那么就应该将其舍弃,至于舍弃特征一还是舍弃特征二三,看你的取舍咯,或者各自做一下实验看看效果。
第三步,上一步经过选择后,得到一系列原始特征,下一步要做的是数值化。
数值化又分这几种:
第一种,离散的。 比如预测奶茶销售额的 case ,明天是星期几可能非常影响销售量,星期六星期日最高,星期一星期五次之,星期二到星期四最低,那么可以采用 one hot representation 的方式,把 weekday 拆分成一个 7 维的向量,明天是星期几就在星期几置 1 ,比如明天是星期日,那么 weekday 特征就是[0,0,0,0,0,0,1]七维。
第二种, scale 非常大的数值特征,但又不能舍弃的。比如假设淡季每天只卖 1k 元,节假日每天能卖 20k 元,而一般的时候能卖 10k ,那么这个特征的范围就过大,在 normalization 中会大大影响特征的表示能力,会影响特征的权重。这时候应该做的是,将特征拆分开,即使特征是连续的。
那么销售额就拆分成一个 n 维的 01 特征: 0-4k,4-8k,8-12k,12-16k,16-20k;然后每一个销售额都是一个五维向量,当然你也可以分得更细,不要害怕, LR 模型里面几万维度都有可能。
比如一个 17k 的销售额,特征向量就是[0,0,0,0,1]五维。
第三种,很平凡的数值特征, scale 也不太大,比如门口过路的游客数量,如果固定在 10k-20k ,且分布均匀,就可直接当数值特征。
第四步,现在你拥有了一系列的数值特征,我们大可以抽象掉他们,叫特征 1 ,特征 2 ,特征 3 , f4, f5...
f1:1800
f2:[0,0,0,0,0,0,1]
f3:[0,0,0,1,0]
f4:2k
...
下一步要做的是 normalization ,用脚趾想想值为 1800 的特征对结果的贡献是值为 1 的特征的一千八百倍,而 1800 在这个特征中可能表示一个非常弱的结果(比如游客数量,日均 5k ,今天只有 1k8 ),我们要尽量缩小这种特征表示上的差距,而让对结果的贡献显示在特征本身的含义和特征的权重上,而不让数值来影响,这个就叫做 normalization ,
对每个数值特征(就是还没被打散的特征),取所有数据中最大和最小的,然后映射到[0,1]区间内,[-1,1]也可以,[-0.5-0.5]也能接受,总之就是一个小区间内,让数值特征的数量级和其他数值特征大致等同。
那么现在,你可能得到了
f1:0.18
f2:[0,0,0,0,0,0,1]
f3:[0,0,0,1,0]
f4:0.66
第五步,拉伸成一个特征向量( f1,f2,f3,f4,f5)
[0.18,0,0,0,0,0,0,1,0,0,0,1,0,0.66]
这个就是你的输入特征咯,特征工程到此结束,下一步训练模型。
不论是分类还是回归,都是这么个路数,分类和回归的区别就是放的模型不一样。
你要用 LR 或者 SVM ,就放到 LR 或者 SVM 中,要是 DART 就放到 DART 中,特征都是一样的。