机器学习之集成学习(Ensemble Learning )②——随机森林( Random Forest)

文章目录

    • 随机森林的概念
    • 样本随机和特征随机
    • 随机森林的训练伪代码
    • 随机森林的结合策略
    • 特征选择的思考
    • 代码实现
    • 随机森林超参数(RandomForestClassifier)

随机森林的概念

介绍

  • 集成学习——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) 设置此估算器的参数。

参考文献:
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier

你可能感兴趣的:(机器学习,集成学习,随机森林)