随机森林的概念
介绍
- 集成学习——Bagging思想 -----> Bagging是Bootstrap Aggregating的缩写,通过并行地构造多个个体分类器,然后以一定的方式将它们组合成一个强学习器
- RF是基于决策树的集成模型,随机森林是机器学习中最成功的算法之一,他能做二分类、多分类和回归任务。随机森林里集成了很多棵决策树,目的是减小过拟合的风险(减小模型方差)。
优点
- 像决策树一样,RF可以处理类别特征与连续特征,能扩展到多类分类,不需要特征缩放,能捕获非线性关系和特征间的影响
- 算法可以并行
森林
- 树的集合
样本随机和特征随机
随机森林的随机体现在样本随机和特征随机
注入随机性
- 样本随机的目的是,增大样本的随机性,进而减少了模型的相似性,那么就降低了模型的相关性,也就是说提高了整体模型的健壮性,统一地说就是为了增加模型的泛化能力。
- 特征随机的目的是,不使用所有特征,可以更简单地划分平面,增强模型的可解释性,缩短了模型的训练时间,移除不重要的特征,达到降维效果的同时,去除选择不好特征的可能性。
样本随机:训练每一个决策树使用的都是bootstrapping(拔靴法)产生的数据集
特征随机:在每一个树结点上进行结点划分时,考虑特征子空间
- 简单做法:从原始特征中随机不重复地抽取一些特征;
- 延伸做法:从原始特征中随机不重复地抽取一些特征,然后将某些特征线性合并,产生一系列组合特征。
做特征选择优点
- 高效:更简单的分割平面、更短的训练预测时间
- 泛化能力增强:无用特征被移除
- 可解释性增强
做特征选择缺点
- 计算代价
- 如果没有选好 特征的话,会影响模型精度
随机森林的训练伪代码
function RandomForest(D,T)
for t=1,2,...,T //可以并行执行
①通过 bootstrapping 采样得到N'尺寸的数据集
②使用特征随机采样后的数据集,训练弱学习器gt
return G=Uniform(gt) 将多个弱学习器结合起来
随机森林的结合策略
分类
- 投票,少数服从多数。每个树的预测结果就是给某个类别投一票,最终随机森林的输出值就是得票最多的类别
回归
- 平均法,每一个树都会输出一个实数,随机森林的输出值就是所有决策树输出值的均值
特征选择的思考
如果可以计算出每个特征的重要性,即 importance(k) for k = 1, 2, … ,d。那就能将不重要的特征舍弃,达到降维的效果
置换检验
- 介绍:置换检验是统计学中显著性检测的一种
- 思想:如果特征k是重要的,那么用随机的值将该特征破坏,重新训练和评估,计算模型泛化能力的退化程度,即,importance(k) = performance(G) - performance(G’) ,这个退化程度就可以度量特征k的重要性
- 随机数:均匀分布,高斯分布,置换(这里更倾向于将原来的数据进行乱序排列后覆盖原来的数据,这样做的好处是没有破坏数据的原有结构,噪声是较小的)
- 置换检验的原始做法是:n个特征列,进行n次置换,n次训练,依次比较训练好的模型的评估指标的下降程度,下降程度越大,证明原有特征越重要。这样做的缺点是,大大增加的训练时间和计算量。
- 置换检验的改进思想是:n个特征列,进行一次训练,依次改变测试集的n列特征,这样大大减少了训练时间,只需要将改变后的数据的预测指标进行大小排列,指标越小的,证明被改变的那列特征是越重要的。
代码实现
import pandas as pd
df = pd.read_csv("../datas/covtype.data",sep=",",header=None)
X = df.iloc[:,0:-1]
Y = df.iloc[:,-1]
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.3)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=20)
model.fit(X_train,Y_train)
print(model.score(X_test,Y_test))
pd.crosstab(Y_test,model.predict(X_test),rownames=["label"],colnames=["predict"])
print(model.oob_score_)
0.9471899669542868
随机森林超参数(RandomForestClassifier)
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 =无,bootstrap =是的,oob_score = False,n_jobs = None,random_state = None,verbose = 0,warm_start = False,class_weight = None )
随机森林分类器。
随机森林是一种元估计器,它适用于数据集的各个子样本上的多个决策树分类器,并使用平均来提高预测精度和控制过拟合。
子样本大小始终与原始输入样本大小相同,但是如果bootstrap=True(默认)则使用替换绘制样本 。
参数
-
n_estimators : 整数,可选(default = 10) 森林里的树木数量。在版本0.20中更改:默认值n_estimators将从版本0.20中的10更改为版本0.22中的100。
-
criterion : string,optional(default =“gini”) 衡量分裂质量的功能。支持的标准是基尼杂质的“gini”和信息增益的“熵”。注意:此参数是特定于树的。
-
max_depth : 整数或无,可选(default =None)
树的最大深度。如果为None,则扩展节点直到所有叶子都是纯的或直到所有叶子包含少于min_samples_split样本。 -
min_samples_split : int,float,optional(default = 2)
拆分内部节点所需的最小样本数:
如果是int,则考虑min_samples_split为最小数量。
如果是浮点数,那么它min_samples_split是一个分数, 是每个分割的最小样本数。ceil(min_samples_split * n_samples)
更改版本0.18:添加了分数的浮点值。 -
min_samples_leaf : int,float,optional(default = 1)
叶节点所需的最小样本数。只有min_samples_leaf在每个左右分支中留下至少训练样本时,才会考虑任何深度的分裂点。这可能具有平滑模型的效果,尤其是在回归中。
如果是int,则考虑min_samples_leaf为最小数量。
如果是float,那么它min_samples_leaf是一个分数, 是每个节点的最小样本数。ceil(min_samples_leaf * n_samples)
更改版本0.18:添加了分数的浮点值。 -
min_weight_fraction_leaf : float,optional(default = 0。)
需要在叶节点处的权重总和(所有输入样本的总和)的最小加权分数。当未提供sample_weight时,样本具有相同的权重。 -
max_features : int,float,string或None,optional(default =“auto”)
寻找最佳分割时要考虑的功能数量:
如果是int,则考虑max_features每次拆分时的功能。
如果是浮点数,那么它max_features是一个分数,并且 每次拆分时都会考虑特征。int(max_features * n_features)
如果是“自动”,那么max_features=sqrt(n_features)。
如果是“sqrt”,那么max_features=sqrt(n_features)(与“auto”相同)。
如果是“log2”,那么max_features=log2(n_features)。
如果没有,那么max_features=n_features。
注意:在找到节点样本的至少一个有效分区之前,搜索分割不会停止,即使它需要有效地检查多个max_features功能。 -
max_leaf_nodes : int或None,可选(default =None)
max_leaf_nodes以最好的方式种植树木。最佳节点定义为杂质的相对减少。如果为None则无限数量的叶节点。 -
min_impurity_decrease : float,optional(default = 0。)
如果该分裂导致杂质的减少大于或等于该值,则将分裂节点。
加权杂质减少方程式如下:
N_t / N * (impurity - N_t_R / N_t * right_impurity
- N_t_L / N_t * left_impurity )N样本总数在哪里,N_t是当前节点N_t_L的样本数,左子项中N_t_R的样本数,以及右子项中的样本数。
N,N_t,N_t_R并且N_t_L都指的是加权和,如果sample_weight获得通过。
版本0.19中的新功能。 -
min_impurity_split : float,(default = 1e-7)
树木生长早期停止的门槛。如果节点的杂质高于阈值,节点将分裂,否则它是叶子。
从版本0.19min_impurity_split开始不推荐使用:已被弃用,支持 min_impurity_decrease0.19。默认值 min_impurity_split将在0.23中从1e-7变为0,并且将在0.25中删除。请min_impurity_decrease改用。 -
bootstrap : boolean,optional(default = True)
是否在构建树时使用bootstrap样本。如果为False,则使用整个数据集构建每个树。 -
oob_score : bool(default = False)
是否使用袋外样品来估计泛化精度。 -
n_jobs : int或None,可选(default =None)
就业人数在两个并行运行fit和predict。 None除非在joblib.parallel_backend上下文中,否则表示1 。 -1表示使用所有处理器。有关 详细信息,请参阅词汇表。 -
random_state : int,RandomState实例或None,可选(default =None)
如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果为None,则随机数生成器是由其使用的RandomState实例np.random。 -
verbose : int,optional(default = 0)
在拟合和预测时控制详细程度。 -
warm_start : bool,optional(default = False)
设置True为时,重用上一个调用的解决方案以适应并向整体添加更多估算器,否则,只需适合整个新林。请参阅词汇表。 -
class_weight : dict,dicts 列表,“balanced”,“balanced_subsample”或None,可选(default =None)
与表单中的类相关联的权重。如果没有给出,所有课程都应该有一个重量。对于多输出问题,可以按与y列相同的顺序提供dicts列表。{class_label: weight}
请注意,对于多输出(包括多标记),应为其自己的dict中的每个列的每个类定义权重。例如,对于四类多标签分类权重应为[{0:1,1:1},{0:1,1:5},{0:1,1:1},{0:1,1: 1}]而不是[{1:1},{2:5},{3:1},{4:1}]。
“平衡”模式使用y的值自动调整与输入数据中的类频率成反比的权重 n_samples / (n_classes * np.bincount(y))
balanced_subsample”模式与“balanced”相同,只是基于每个生长的树的bootstrap样本计算权重。
对于多输出,y的每列的权重将相乘。
请注意,如果指定了sample_weight,这些权重将与sample_weight(通过fit方法传递)相乘。
属性
-
estimators_ : DecisionTreeClassifier列表
拟合子估算器的集合。 -
classes_ : shape = [n_classes]的数组或此类数组的列表
类标签(单输出问题),或类标签数组列表(多输出问题)。 -
n_classes_ : int或list
类的数量(单输出问题),或包含每个输出的类数的列表(多输出问题)。 -
n_features_ : int
fit执行时的功能数量。 -
n_outputs_ : int
fit执行时的输出数量。 -
feature_importances_ : shape数组= [n_features]
返回要素重要性(越高,功能越重要)。 -
oob_score_ : float
使用袋外估计获得的训练数据集的分数。 -
oob_decision_function_ : shape数组= [n_samples,n_classes]
通过对训练集进行袋外估计来计算决策函数。如果n_estimators很小,则可能在引导期间从未遗漏数据点。在这种情况下, oob_decision_function_可能包含NaN。
方法
- apply(self, X) ----------------------------将林中的树应用于X,返回叶索引。
- decision_path(self,X) ------------返回森林中的决策路径
- fit(self,X,y [,sample_weight]) 从训练集(X,y)建立一片树林。
- get_params(self[, deep]) ---------------获取此估算工具的参数。
- predict(self,X) ------------------------预测X的类。
- predict_log_proba(self,X) ---------预测X的类日志概率。
- predict_proba(self,X)--------------- 预测X的类概率。
- score(self,X,y [,sample_weight]) 返回给定测试数据和标签的平均精度。
- set_params(self,\ * \ * params) 设置此估算器的参数。