Bagging 框架
Bagging框架,即 Bootstrap Aggregating,是一个用于提高机器学习算法稳定性和准确性的方法。Bagging 算法通过对原始数据集进行有放回的抽样,生成多个不同的数据子集,然后分别在这些子集上训练模型。最后,通过对这些模型的预测结果进行投票(分类问题)或求平均(回归问题),得到最终的预测。Bagging 方法可以有效减少模型的方差,防止过拟合,并提高模型的泛化能力。
假设我们有一个数据集,包含100个样本,每个样本有5个特征。我们的任务是对一个新的样本进行分类。
首先,我们从原始数据集中随机抽取(有放回)100个样本,形成一个新的数据集。这个过程称为Bootstrap抽样。
然后,我们使用这个新的数据集训练一个基分类器,例如决策树。
接下来,我们重复步骤1和2,创建更多的数据集,并训练更多的基分类器。假设我们训练了10个基分类器。
当我们需要对新的样本进行分类时,我们将这个样本分别送入这10个基分类器进行预测。每个基分类器都会给出一个预测结果。
最后,我们根据这10个基分类器的预测结果进行投票,得到最终的分类结果。如果有超过一半的基分类器将样本分为类别A,那么最终的预测结果就是类别A。
通过这种方式,Bagging框架可以有效地减少模型的方差,提高模型的稳定性和准确性。
Bagging算法首先采用M轮自助采样法,获得M个包含N个训练样本的采样集。然后,基于这些采样集训练出一个基学习器。最后将这M个基学习器进行组合。
分类任务采用简单投票法:每个学习器一票。
回归问题使用简单平均法:每个学习器的预测值取平均值。
随机森林
随机森林是基于 Bagging 思想实现的一种集成学习算法,它采用决策树模型作为每一个基学习器。其构造过程:
>> 集成学习通过构建多个学习器来提高整体模型的性能,主要通过降低方差和偏差来实现 。
以下是集成学习采用不同模型分别随机采样的原因:(每个模型随机采样数据)
首先,对样本数据进行有放回的抽样,得到多个样本集。具体来讲就是每次从原来的N个训练样本中有放回地随机抽取m个样本(包括可能重复样本)。
然后,从候选的特征中随机抽取k个特征,作为当前节点下决策的备选特征,从这些特征中选择最好地划分训练样本的特征。用每个样本集作为训练样本构造决策树。单个决策树在产生样本集和确定特征后,使用CART算法计算,不剪枝。
随机森林中有两个可控制参数:森林中树的数量、抽取的属性值m的大小。
随机森林API
sklearn.ensemble.RandomForestClassifier()
n_estimators:决策树数量,(default = 10)
Criterion:entropy、或者 gini, (default = gini)
max_depth:指定树的最大深度,(default = None )
max_features="auto”, 决策树构建时使用的最大特征数量
min_samples_split: 结点分裂所需最小样本数
min_samples_leaf: 叶子节点的最小样本数(default = 1)
min_impurity_split: 节点划分最小不纯度
此外,还有其他库如XGBoost和LightGBM等也提供了随机森林的实现,它们在计算效率和内存使用上可能有所不同。
demo案例
import pandas as pd
titanic=pd.read_csv("泰坦尼克.csv")
# 选择特征pclass,age,sex
X=titanic[['pclass','Age','Sex']]
y=titanic['Survived']
#数据的填补
X['Age'].fillna(X['Age'].mean(),inplace=True)
X = pd.get_dummies(X)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.25,random_state=22)
from sklearn.ensemble import RandomForestClassifier
rfc=RandomForestClassifier(max_depth=6,random_state=9)
rfc.fit(X_train,y_train)
rfc_y_pred=rfc.predict(X_test)
rfc.score(X_test,y_test)
#6.性能评估
from sklearn.metrics import classification_report
print("rfc_report:",classification_report(rfc_y_pred,y_test))
可以通过交叉验证配合GridsearchCV寻找最佳参数:
rf = RandomForestClassifier()
param={"n_estimators":[80,100,200], "max_depth": [2,4,6,8,10,12],"random_state":[9]}
# 3 使用GridSearchCV进行网格搜索
from sklearn.model_selection import GridSearchCV
gc = GridSearchCV(rf, param_grid=param, cv=2)
gc.fit(X_train, y_train)
print("随机森林预测准确率:", gc.score(X_test, y_test))
随机森林通过自助法、特征采样方法训练学习器,最后采用投票方式决定未知样本的最后预测。
随机森林的总结: