本文参考自http://www.aboutyun.com/thread-20148-1-1.html
最近在做一个广告推荐的比赛,所以从头开始学起,首先就是数据的处理,然后进行特征的提取及处理,下面列出。
标签(label)的类型
根据我们要研究的问题,标签的类型也不一:
- 单列0-1值(二分类问题,一个样本只属于一类并且一共只有两类)
- 单列连续值(单回归问题,要预测的值只有一个)
- 多列0-1值(多分类问题,同样是一个样本只属于一类但是一共有多类)
- 多列连续值(多回归问题,能够预测多个值)
- 多标签(多标签分类问题,但是一个样本可以属于多类)
评价指标
对于多个机器学习方法,我们必须找到一个评价指标来衡量它们的好坏。比如一个二元分类的问题我们一般选用AUC ROC或者仅仅用AUC曲线下面的面积来衡量。在多标签和多分类问题上,我们选择交叉熵或对数损失函数。在回归问题上我们选择常用的均方误差(MSE)。
Python库
在安装机器学习的几个库之前,应该安装两个基础库:numpy和scipy。
- Pandas 处理数据最强大的库
- scikit-learn 涵盖机器学习几乎所有方法的库
- xgboost 优化了传统的梯度提升算法
- keras 神经网络
- matplotlib用来作图的库
- tpdm 显示过程
确定问题
确定要研究的问题,也就是通过观察标签的类别确定究竟是分类还是回归问题。
划分样本
第二步是将所有的样本划分为训练集(training data)和验证集(validation data)。
划分样本的这一过程必须要根据标签来做。
比如对于一个类别不平衡的分类问题,必须要用分层抽样的方法,比如每种标签抽多少,这样才能保证抽出来的两个样本子集分布类似。在Python中,我们可以用scikit-learn轻松实现。
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]
在商品推荐中参考其他人的模型使用训练集中最后一天样本作为验证集,因为在这些行为通常具有时间特征。
注意验证集和训练集永远不能掺和在一起,否则会导致过拟合,深有体会。
识别特征
一个数据集总是带有很多的变量(variables),或者称之为特征(features),他们对应着数据框的维度。一般特征的值有三种类型:数值变量、属性变量和文字变量。
数值型变量,这些变量几乎不需要任何的处理,常见的方式是正规化(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)
一般来说第二种方法往往比较优越,下面代码框中所展示的参数长期以来都取得了良好的效果(如有需要参考链接)。
如果你对训练集数据采用了上述处理方式,那么也要保证对验证及数据做相同处理。
特征融合是指将不同的特征融合,要区别对待密集型变量和稀疏型变量。特征融合有多种方法,根据不同问题考虑使用不同的方法(待完善)。
不能直接把没有经过规范化的数值变量直接用线性模型拟合,可以用scikitlearn里面的规范化(Normalized)和标准化(StandardScaler)命令分别对密集和稀疏的数据进行相应的处理。
特征降维和特征选择
如果以上方式处理后的数据可以产生一个优秀的模型,那就可以直接进行参数调整了。如果不行则还要继续进行特征降维和特征选择。降维的方法有以下几种:PCA、LDA、Original、QDA、SVD
对于高维数据来说,PCA是常用的降维方式,对于图像数据一般我们选用10~15组主成分,当然如果模型效果会提升的话也可以选择更多的主成分。对于其他类型的数据我们一般选择50~60个主成分。
from sklearn.decomposition import PCA
SVD = TruncatedSVD(n_components=120)
svd.fit(xtrain)
xtrain = svd.transform(train)
一般在TF-IDF中SVD主成分的数目大约在120~200之间,但是也可以采用更多的成分,但是相应的计算成本也会增加。
在特征降维之后我们可以进行建模的训练过程了,但是有的时候如果这样降维后的结果仍不理想,可以进行特征选择:
特征选择也有很多实用的方法,比如说常用的向前或向后搜索。那就是一个接一个地把特征加入模型训练,如果加入一个新的特征后模型效果不好,那就不加入这一特征。直到选出最好的特征子集。对于这种方法有一个提升的方式是用AUC作为评价指标,当然这个提升也不是尽善尽美的,还是需要实际应用进行改善和调整的。
还有一种特征选择的方式是在建模的过程中就得到了最佳特征子集。比如我们可以观察logit模型的系数或者拟合一个随机森林模型从而直接把这些甄选后的特征用在其它模型中。
对于稀疏的数据集我们可以用随机森林、xgboost或卡方等方式来进行特征选择。
一般而言,常用的机器学习模型有以下几种,我们将在这些模型中选择最好的模型:
- 分类问题
- 随机森林
- 梯度提升算法(GBM)
- Logistic 回归
- 朴素贝叶斯分类器
- 支持向量机
- k临近分类器
- 回归问题
- 随机森林
- 梯度提升算法(GBM)
- 线性回归
- 岭回归
- Lasso
- 支持向量回归
下表中展示了每种模型分别需要优化的参数(参考链接)。