目录
一、集成学习的含义
二、集成学习的代表
三、集成学习的应用
1、分类问题集成。(基学习器是分类模型)
2、回归问题集成。(基学习器是回归模型)
3、特征选取集成。
四、Bagging之随机森林
1、随机森林是有多个决策树,我们将他们构成出森林。
2、随机森林总共有四个特点:
(1)数据采样随机
(2)特征选取随机
(3)森林
(4)基分类器为决策树
3、随机森林的生成步骤
1、对原始数据集进行随机采样
2、每个基分类器获取不同的数据集,每个数据的的特征也是随机抽取的
3、将随机抽取的数据及特征传递给决策树进行训练
4、通过强分类器投票,选出性能指标占比最多的作为结果(例如结果中很多预测的是0,那么最终就会通过强分类器预测为0)
五、Bagging之随机森林的优缺点(集成学习的共有优点)
1、具有极高的准确率
2、随机性的引入,使得随机森林的抗噪声能力很强
3、随机性的引入,使得随机森林不容易过拟合
4、能够处理很高维度的数据,不用做特征选择
5、容易实现并行化计算
6、缺点
六、随机森林模型的简单使用
1、随机森林模型的参数
一、集成学习的含义
集成学习是将多个基学习器进行组合,来实现比单一学习器显著优越的学习性能。
这里的每个基学习器可以是任意机器学习的模型,可以是线性回归、逻辑回归、KNN、决策树等模型,基学习器可以使用单一模型组合,也可以使用多模型随机组合。
使用训练数据进行模型训练,然后将测试集的数据传入,选择结果。
二、集成学习的代表
.bagging方法:典型的是随机森林方法
.boosting方法:典型的Xgboost
.stacking方法:堆叠模型
三、集成学习的应用
1、分类问题集成。(基学习器是分类模型)
2、回归问题集成。(基学习器是回归模型)
3、特征选取集成。
(场景:当我们的数据集特别大时,就会有很多的特征,那么这些特征对分离结果的影响有多大,我们可以计算该特征与分类结果之间的相关系数来进行估量,在随机森林模型中可以对每个特征进行特征选取,它可以内部对每个特征量化一个指标,最终结果会选择尽可能多的相关性比较大的特征。)
所以集成学习之随机森林既可以做分类问题也可以做回归问题。
四、Bagging之随机森林
1、随机森林是有多个决策树,我们将他们构成出森林。
2、随机森林总共有四个特点:
(1)数据采样随机
假设我们有一个数据集,那么针对每一个基分类器,我们都会随机抽取一定比例(例如80%)的数据做为训练集,其余作为测试集,特别要注意,针对每一个基分类器都是随机抽取,这保证了我们的数据会被充分使用,同时随机抽取会最大程度的覆盖所有可能的情况。
(2)特征选取随机
针对同一个数据集,那么我们每次选取数据时,会随机抽取80%(这时认为根据实际情况设定的)的特征,那么对于每个数据集的特征选取会出现有的数据集抽到很差的特征那么该数据集展现的性能就会很差,如果抽取到的都是好的特征,那么模型的性能也会很好。
(3)森林
有多个决策树,所以称之为森林。
(4)基分类器为决策树
每个决策树学习的数据都是不同的。
3、随机森林的生成步骤
1、对原始数据集进行随机采样
2、每个基分类器获取不同的数据集,每个数据的的特征也是随机抽取的
3、将随机抽取的数据及特征传递给决策树进行训练
4、通过强分类器投票,选出性能指标占比最多的作为结果(例如结果中很多预测的是0,那么最终就会通过强分类器预测为0)
五、Bagging之随机森林的优缺点(集成学习的共有优点)
1、具有极高的准确率
2、随机性的引入,使得随机森林的抗噪声能力很强
数据的随机抽取会使得某些基分类器抽取到噪声数据,也会有抽取不到噪声数据的基分类器,因为噪声数据出现的概率占少数,所以在强分类器投票选择时,这些抽取到噪声的基分类器对我们最终分类结果的影响特别小,因此我们的抗噪声能力特别强。
3、随机性的引入,使得随机森林不容易过拟合
因为随机森林的结果是由多个决策树决定的,所以不容易出现过拟合,过拟合的表现是在训练集上表现得很好,但是在测试集上得效果很差,产生原因是由于受单一数据影响太大,而随机森林会根据多个结果共同决定基本不会出现过拟合得情况。
4、能够处理很高维度的数据,不用做特征选择
不用做特征选取的原因,很差的特征对决策树的影响很小,因为即使是很差的特征,我们每个基分类器抽取是随机的,不会有很多分类器抽到这个差的特征,所以对最终结果的影响不大,就不用去特意选择特征。
5、容易实现并行化计算
随机森林的结构是由多个基分类器构成,那么每个基分类器都可以部署在一个单独的服务器上,多个分类器可以放在多个服务器上,实现了多个分类器同时训练,并行计算。
6、缺点
1、当随机森林中的决策树的个数很多时,训练时需要的空间和时间会比较大。
2、随机森林模型还有许多不好解释的地方,有点像个黑盒模型。
六、随机森林模型的简单使用
1、随机森林模型的参数
class sklearn.ensemble.RandomForestClassifier(n_estimators=’warn’, criterion=’gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)
随机森林重要的一些参数:
1.n_estimators :(随机森林独有)
随机森林中决策树的个数。
在0.20版本中默认是10个决策树;
在0.22版本中默认是100个决策树;
2. criterion :(同决策树)
节点分割依据,默认为基尼系数。
可选【entropy:信息增益】
3.max_depth:(同决策树)【重要】
default=(None)设置决策树的最大深度,默认为None。
(1)数据少或者特征少的时候,可以不用管这个参数,按照默认的不限制生长即可
(2)如果数据比较多特征也比较多的情况下,可以限制这个参数,范围在10~100之间比较好
4.min_samples_split : (同决策树)【重要】
这个值限制了子树继续划分的条件,如果某节点的样本数少于设定值,则不会再继续分裂。默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则建议增大这个值。
5.min_samples_leaf :(同决策树)【重要】
这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
【叶是决策树的末端节点。 较小的叶子使模型更容易捕捉训练数据中的噪声。 一般来说,我更偏向于将最小叶子节点数目设置为大于50。在你自己的情况中,你应该尽量尝试多种叶子大小种类,以找到最优的那个。】
【比如,设定为50,此时,上一个节点(100个样本)进行分裂,分裂为两个节点,其中一个节点的样本数小于50个,那么这两个节点都会被剪枝】
6.min_weight_fraction_leaf : (同决策树)
这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。【一般不需要注意】
7.max_features : (随机森林独有)【重要】
随机森林允许单个决策树使用特征的最大数量。选择最适属性时划分的特征不能超过此值。
当为整数时,即最大特征数;当为小数时,训练集特征数*小数;if “auto”, then max_features=sqrt(n_features).If “sqrt”, then max_features=sqrt(n_features).If “log2”, then max_features=log2(n_features).If None, then max_features=n_features.
【增加max_features一般能提高模型的性能,因为在每个节点上,我们有更多的选择可以考虑。 然而,这未必完全是对的,因为它降低了单个树的多样性,而这正是随机森林独特的优点。 但是,可以肯定,你通过增加max_features会降低算法的速度。 因此,你需要适当的平衡和选择最佳max_features。】
8.max_leaf_nodes:(同决策树)
通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
【比如,一颗决策树,如果不加限制的话,可以分裂100个叶子节点,如果设置此参数等于50,那么最多可以分裂50个叶子节点】
9.min_impurity_split:(同决策树)
这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
10.bootstrap=True(随机森林独有)
是否有放回的采样,按默认,有放回采样
11. n_jobs=1:
并行job个数。这个在是bagging训练过程中有重要作用,可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job。
2、代码简单实现
(1)导入必要的库
import pandas as pd
(2)数据读取及预处理
data=pd.read_csv('./data/spambase.csv')
x=data.iloc[:,:-1]
y=data.iloc[:,-1]
3、数据集划分
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test= \
train_test_split(x,y,test_size=0.2,random_state=2)
4、模型导入训练
from sklearn.ensemble import RandomForestClassifier
rf=RandomForestClassifier(
n_estimators=100,
max_features='auto',
# max_leaf_nodes=50,
random_state=4
)
rf.fit(x_train,y_train)
5、模型效果预测
from sklearn import metrics
# 自测
train_predicted=rf.predict(x_train)
print(metrics.classification_report(y_train,train_predicted))
# cm_plot(y_train,train_predicted)
# 测试集
test_predicted=rf.predict(x_test)
print(metrics.classification_report(y_test,test_predicted))
# cm_plot(y_test,test_predicted)
6、数据可视化
import matplotlib.pyplot as plt
importances=rf.feature_importances_
im=pd.DataFrame(importances,columns=['importances'])
clos=data.columns
clos_1=clos.values
clos_2=clos_1.tolist()
clos=clos_2[0:-1]
im['clos']=clos
im=im.sort_values(by=['importances'],ascending=False)[:10]
index=range(len(im))
plt.yticks(index,im.clos)
plt.barh(index,im['importances'])
plt.show()
7、最终效果