Kaggle 快速模型之 Random Forrest 随机森林

2024-05-18 00:09

1. Kaggle 快速模型之 Random Forrest 随机森林

随机森林 RF 在 Kaggle 大名远播,称霸很久。
  
 那么,我们这里就先聊聊 原因 。以下分析来自 University of San Francisco, CS 硕士课程。 
  
 随机森林(文中记为 RF)有以下 5 个优点:
  
  1。用法 :RF 支持针对连续对象的回归算法,也支持针对离散对象的分类算法。
  
  2。过拟合 :RF 不太容易过拟合,因为 RF 本质上是模型集成(model ensemble),从  Leo Breiman 的理论来看 RF 也不会因为 树 数量的增加,而导致过拟合,因为这些数都是集合在一起的单独模型,效果不好的树会被 downvote。但是使用 out of bagging 的方法是推荐来帮助 RF 减少过拟合的方法,就是保留一个 validation 数据集在多个模型中选取评价指标更好的模型。
  
  3。范化能力 :RF 的范化能力也比较好,比较能够处理异常值,不太容易出现波动。
  
  4。数据分布要求 :不像线性模型,RF 也不要求数据分布符合正态分布,来得到统计结果上的近似。因此任意的数据分布都可以使用 RF。
  
  5。特征工程 :对于一些简单的线性模型,为了增加特征,我们往往需要增加   这样的特征来作为模型的输入,帮助模型构建更多的特征。但是在 RF 中,这些基础的特征工程是不必要的。但是,需要记得,额高阶特征工程可以帮助增加 RF 的精度(类似日期上的处理,提取出月份,周数等)。
  
  6。数据预处理 :类似神经网络需要对数据作预处理来得到 0 ~ 1 之间的数据分布,在 RF 这里往往都不太需要,因此 RF 对于数据的要求也不高。
  
 讲完了 RF 的特性之后,我们似乎发现 RF 是万能,但是他真的这么万能麻?我们再来看看 机器学习届广为流传的两个理论,在 RF 上是不是也会存在。
  
  a。高维诅咒 :这个理论是说随着数据纬度的增加,即数据特征的增加,所有的数据都会十分的分散,使得计算数据点之间的距离变得没有意义,也就是说模型的预测变得不可能实现。当然理论上的确是可以如此证明,这个理论在数学上完全没有问题。但是到了实际的世界上,我们的所有数据其实互相之间是存在依赖的,因此你会发现,这个高维距离始终有意义,并且真实地提供模型预测。
  
  b。无免费的午餐理论 :这个理论名字就很明显,没有一个模型可以适用于各种数据。当然,从数学理论上可以验证这个结论。但是在实际的工作中,RF 是相对比较全面的一个模型,我们总是可以用他先作出一个 benchmark ,再来优化。尤其是 Kaggle 等赛事上,对模型的精度要求十分明确,我们无需在数据的其他层面上(如收集、确认等)作任何的工作。RF 是很适合开始的模型。
  
 那下节内容,我们就可以说说理论以外的操作了。

Kaggle 快速模型之 Random Forrest 随机森林

2. RandomForest随机森林算法

  https://blog.csdn.net/qq_16633405/article/details/61200502     http://blog.itpub.net/12199764/viewspace-1572056/     https://blog.csdn.net/colourful_sky/article/details/82082854 
   
   
                                           随机森林中随机是核心,通过随机的选择样本、特征,降低了决策树之间的相关性。随机森林中的随机主要有两层意思,一是随机在原始训练数据中有放回的选取等量的数据作为训练样本,二是在建立决策树时,随机的选特征中选取一部分特征建立决策树。这两种随机使得各个决策树之间的相关性小,进一步提高模型的准确性。   随机森林未用到决策树的剪枝,那怎样控制模型的过拟合呢?主要通过控制 树的深度(max_depth),结点停止分裂的最小样本数(min_size)等参数。随机森林还可以处理缺失值。
   假设训练集中n个样本,每个样本有d个特征,需要训练一个包含T棵数的随机森林,具体的算法流程如下所示:   1、对于T棵决策树,分别重复如下操作:a、使用Bootstrap抽样,从训练集D获得大小为n的训练集D; b、从d个特征中随机选取m(m   2、如果是回归问题,则最后的输出是 每个树输出的均值;   3、如果是分类问题,则根据投票原则,确定最终的类别。   每棵树的生成都是随机的,至于随机选取的特征数,如何决定随机选取的特征数的大小呢,主要有两种方法,一种是交叉验证,另外一种的经验性设置 m= log_2 d +1。
   1、分类间隔:分类间隔是指森林中正确分类样本的决策树的比例减去错误分类的决策树的比例,通过平均每个样本的分类间隔得到随机森林的分类间隔。对于分类间隔,当然是越大越好,大的分类间隔说明模型的分类效果比较稳定,泛化效果好。   2、袋外误差:对于每棵树都有一部分样本而没有被抽取到,这样的样本就被称为袋外样本,随机森林对袋外样本的预测错误率被称为袋外误差(Out-Of-Bag Error,OOB)。计算方式如下所示:   (1)对于每个样本,计算把该样本作为袋外样本的分类情况;   (2)以投票的方式确定该样本的分类结果;   (3)将误分类样本个数占总数的比率作为随机森林的袋外误差。   3、变量重要程度刻画:其实变量重要程度刻画不能算是模型性能评估里面,因为有的实际应用中需要查看这么多的特征中到底那一部分特征是相对重要的特征,这个时候变量的重要程度的刻画就显得尤为重要了。其计算方式主要有一下两种方式:   (1)通过计算特征的平均信息增益大小得出;   (2)通过计算每个特征对模型准确率的影响,通过打乱样本中某一特征的特征值顺序,产生新样本,将新样本放入建立好的随机森林模型计算准确率。相对于不重要的特征,即使打乱了顺序也不会对结果产生很大的影响,对于重要的特征,会对结果产生很大的影响的。
    优点 :   1、对于大部分的数据,它的分类效果比较好。   2、能处理高维特征,不容易产生过拟合,模型训练速度比较快,特别是对于大数据而言。   3、在决定类别时,它可以评估变数的重要性。   4、对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化。    缺点 :   1、随机森林容易产生过拟合,特别是在数据集相对小或者是低维数据集的时候。   2、 计算速度比单个的决策树慢。   3、 当我们需要推断超出范围的独立变量或非独立变量,随机森林做得并不好。
    分类问题 
    回归问题 
    常用方法 :参考 https://blog.csdn.net/w952470866/article/details/78987265    predict_proba(x):给出带有概率值的结果。每个点在所有label(类别)的概率和为1。   predict(x):预测X的结果。内部还是调用的predict_proba(),根据概率的结果看哪个类型的预测值最高就是哪个类型。   predict_log_proba(x):和predict_proba基本上一样,只是把结果给做了log()处理。   fit(X, y, sample_weight=None): 从训练数据集(X,y)上建立一个决策树森林。x为训练样本,y为目标值(分类中的类标签,回归中的实数)。    参数    和GBDT对比,GBDT的框架参数比较多,重要的有最大迭代器个数,步长和子采样比例,调参起来比较费力。但是RandomForest则比较简单,这是因为bagging框架里的各个弱学习器之间是没有依赖关系的,这减小的调参的难度。换句话说,达到同样的调参效果,RandomForest调参时间要比GBDT少一些。    Bagging框架参数 :   n_estimators:最大的弱学习器个数(建立随机森林分类器(树)的个数)。太小容易欠拟合,太大又容易过拟合,一般选择一个适中的数值。增大可以降低整体模型的方差,提升模型的准确度,且不会对子模型的偏差和方差有任何影响。由于降低的是整体模型方差公式的第二项,故准确度的提高有一个上限。在实际应用中,可以在1至200之间取值;   n_jobs:引擎允许使用处理器的数量。 若值为1则只能使用一个处理器, 值为-1则表示没有限制。设置n_jobs可以加快模型计算速度;   oob_score:是否采用袋外误差来评估模型的好坏,默认为 False,推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力;    CART决策树参数 :   max_features: RF划分时考虑的最大特征数。可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数,其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。   max_depth: 决策树最大深度。默认为"None",决策树在建立子树的时候不会限制子树的深度这样建树时,会使每一个叶节点只有一个类别,或是达到min_samples_split。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。   min_samples_split: 内部节点再划分所需最小样本数,默认2。这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。   min_samples_leaf:叶子节点最少样本数。 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。   min_weight_fraction_leaf:叶子节点最小的样本权重和。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。   max_leaf_nodes: 最大叶子节点数。通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。   min_impurity_split: 节点划分最小不纯度。这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点,即为叶子节点 。一般不推荐改动默认值1e-7。   上面的决策树参数中最重要的包括最大特征数 max_features , 最大深度 max_depth , 内部节点再划分所需最小样本数 min_samples_split 和叶子节点最少样本数 min_samples_leaf 。    参数调优 :随机森林参数的调优在数据分析和挖掘中也占有一定的地位,学会好的调优方法能够达到事半功倍的效果。调优参考 https://blog.csdn.net/cherdw/article/details/54971771