降维及集成算法原理及代码实现
本文接着上篇文章继续讲述机器学习算法中常用的特征降维和集成算法。
机器学习包括两大数据降维问题:特征选取、特征提取。很多大神都说过,在数据挖掘过程中特征工程比建模的过程还要重要,选择适合的特征能够让你的工作事半功倍,因此下面我们介绍常见的降维算法。除此之外还介绍了部分集成算法和关联规则算法。
- 降维:PCA(主成分分析)、因子分析。降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。之所以使用降维后的数据表示是因为在原始的高维空间中,包含有冗余信息以及噪音信息,在实际应用例如图像识别中造成了误差,降低了准确率;而通过降维,我们希望减少冗余信息 所造成的误差,提高识别(或其他应用)的精度。又或者希望通过降维算法来寻找数据内部的本质结构特征。
PCA(主成分分析):PCA是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中表示,并期望在所投影的维度上数据的方差最大,以此使用较少的数据维度,同时保留住较多的原数据点的特性。
实现:from sklearn.decomposition import PCA
pca = PCA(n_components=2)
new_pca = pd.DataFrame(pca.fit_transform(new_df))
FA(因子分析):因子分析法(factor analysis)的核心是对若干综合指标进行因子分析并提取公共因子,再以每个因子的方差贡献率作为权数与该因子的得分乘数之和构造得分函数。
实现:from factor_analyzer import FactorAnalyzer
fa = FactorAnalyzer()
fa.analyze(data, 5, rotation=None)
- 集成算法:有多个较弱的模型集成模型组,其中的模型可以单独进行训练,并且它们的预测能以某种方式结合起来去做一个总体预测。
集成思想:Boosting:基于错误提升分类器性能,通过集中关注被已有分类器分类错误的样本,构建新分类器并集成。
Bagging:基于数据随机重抽样的分类器构建方法。
算法实例:boosting、bagging、随机森林、Adaboost、梯度提升树
随机森林:将训练集进行有放回的随机抽取,获得n个新的训练集,训练出n个决策树,再投票决定分类结果。
实现:from sklearn.ensemble import RandomForestClassifier
Clf= RandomForestClassifier(n_estimators=10)
Clf.fit(X,Y)
Adaboost:训练数据中的每个样本,并赋予其一个权重,这些权重构成了向量D。一开始,这些权重都初始化为相等值。首先在训练集上训练出一个弱分类器并计算该分类器的错误率,然后在同一数据上再训练分类器,在第二次训练中,会调高那些前一个分类器分类错误的样本的权重。如此反复,训练出许多个分类器来进行加权投票,每个分类器的权重是基于该分类器的错误率计算出来的。
实现:from sklearn.cross_validation import cross_val_score
From sklearn.ensemble import AdaBoostClassifier
Clf= AdaBoostClassifier(n_estimators=100)
Scores= cross_val_score(clf,iris.data,iris.target)
梯度提升树(GBDT):与Adaboost类似,反复训练出多个决策树,每次更新训练集的权重是按照损失函数负梯度的方向。
实现:from sklearn.ensemble import GradientBoostingClassifier
Clf=GradientBoostingClassifier(n_estimators=100,learning_rate=1.0, max_depth=1,random_state=0).fit(x_train,y_train)
#n_estimators是弱分类器个数
#max_depth或max_leaf_nodes用来控制每棵树的规模
#learning_rate是超参数(学习率),取值范围为(0,1),用来控制欠拟合与过拟合
自己设计:根据bagging或者boosting思想,自己选择弱分类器来集成。
实现:from sklearn.ensemble import BaggingClassifier
From sklearn.neighbors import KNeighborsClassifier
Bagging= BaggingClassifier(KNeighborsClassifier(),max_samples=0.5,max_features=0.5)
- 关联规则:关联规则学习方法能够提取出对数据中的变量之间的关系的最佳解释,发现数据背后存在的某种规则或者联系。关联规则可以应用的场景有:优化货架商品摆放或者优化邮寄商品的目录、交叉销售或者捆绑销售、交叉销售或者捆绑销售。
使用关联规则的过程主要包含以下三个步骤:
(1)根据支持度(support),从事务集合中找出频繁项集(使用算法:Apriori算法,FP-Growth算法)
(2)根据置信度(confidence),从频繁项集中找出强关联规则(置信度阈值需要根据实验或者经验而定)
(3)根据提升度(lift),从强关联规则中筛选出有效的强关联规则(提升度的设定需要经过多次试验确定)
Apriori算法:如果某个项集是频繁的,那么它的所有子集也是频繁的。如果某一个项集是非频繁的,那么它的所有超集(包含该集合的集合)也是非频繁的。Apriori原理的出现,可以在得知某些项集是非频繁之后,不需要计算该集合的超集,有效地避免项集数目的指数增长,从而在合理时间内计算出频繁项集。
实现:from pymining import itemmining, assocrules
relim_input = itemmining.get_relim_input(transactions)
report = itemmining.relim(relim_input, min_support=2)
rules1=assocrules.mine_assoc_rules(report, min_support=2, min_confidence=0.5)
FP-Growth算法:Apriori算法是关联规则的基本算法,很多用于发现关联规则的算法都是基于Apriori算法,但Apriori算法需要多次访问数据库,具有严重的性能问题。FP-Growth算法把数据集中的事务映射到一棵FP-Tree上面,再根据这棵树找出频繁项集。FP-Tree的构建过程只需要扫描两次数据集,相比于Apriori减少了I/O操作,克服了Apriori算法需要多次扫描数据库的问题。