本文参考自http://www.aboutyun.com/thread-20148-1-1.html
最近在做一个广告推荐的比赛,所以从头开始学起,首先就是数据的处理,然后进行特征的提取及处理,下面列出。
评价指标
Python库
确定问题
划分样本
from sklearn.cross_validation import StratifiedKFold
ecal_size = 0.10 # 使用样本全集中10%作为验证集的规模
kf = StratifiedKFold(y, round(1./eval_size))
train_indices, valiz_indices = next(iter(kf))
x_train, y_train = X[train_indices], Y[train_indices]
x_valid, yvalid = X[valid_indices], y[valid_indices]
在商品推荐中参考其他人的模型使用训练集中最后一天样本作为验证集,因为在这些行为通常具有时间特征。
注意验证集和训练集永远不能掺和在一起,否则会导致过拟合,深有体会。
识别特征
数值型变量,这些变量几乎不需要任何的处理,常见的方式是正规化(normalization)。
属性变量处理通常有两步:
把属性变量转变为标签:
from sklearn.preproessing import LabelEncoder
lbl_enc = labelEncoder()
lbl_enc.fit(xtrain[categorical_features])
xtrain_cat = lbl_end.transform(xtrain[categorical_dearutes])
把标签转变为二元数值:
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
ohe.fit(xtrain[categorical_features])
xtrain_cat = ohe.transform(xtrain[categorical_features])
文字变量处理:
可以用CountVectorizer或者TfidfVectorizer来实现
from sklearn.feature_extraction.text import CountVectorizer
ctv = CountVectorizer()
text_data_train = ctv.fit_transform(text_data_train)
text_data_valid = ctv.fit_transform(text_data_valid)
from sklearn.feature_extraaction.text import TfidfVectorizer
tfv = TfidfVectorizer()
text_data_train = tfv.fit_transform(text_data_train)
text_data_valid = tfv.fit_transform(text_data_valid)
一般来说第二种方法往往比较优越,下面代码框中所展示的参数长期以来都取得了良好的效果(如有需要参考链接)。
如果你对训练集数据采用了上述处理方式,那么也要保证对验证及数据做相同处理。
from sklearn.decomposition import PCA
SVD = TruncatedSVD(n_components=120)
svd.fit(xtrain)
xtrain = svd.transform(train)
一般在TF-IDF中SVD主成分的数目大约在120~200之间,但是也可以采用更多的成分,但是相应的计算成本也会增加。
还有一种特征选择的方式是在建模的过程中就得到了最佳特征子集。比如我们可以观察logit模型的系数或者拟合一个随机森林模型从而直接把这些甄选后的特征用在其它模型中。
对于稀疏的数据集我们可以用随机森林、xgboost或卡方等方式来进行特征选择。