随机森林原理详解及python代码实现

随机森林(RF)算法

  • 1、算法原理
  • 2、对数据的要求(无需规范化)
  • 3、算法的优缺点
  • 4、算法需要注意的点
  • 5、python代码实现(待更......)
    • 导入相关包
    • 读取数据并预处理(必须处理缺失值)
    • 训练
    • 评估

1、算法原理

步骤(booststrap sampling):
1、从数据集中有放回的随机抽m个样本
2、从样本中选取n个特征进行建树
3、重复1-2

2、对数据的要求(无需规范化)

与cart类似 https://blog.csdn.net/weixin_41851055/article/details/106234426

3、算法的优缺点

一、优点:

  • 有效解决决策树的过拟合
  • 能输出变量重要性
  • 容易理解并且效果好
  • 具有很好的抗躁能力

二、缺点:

  • 小数据集及低维度效果一般
  • 速度较单个决策树慢
  • 随机生成、结果不稳定(KPI值较大)

4、算法需要注意的点

随机森林不易过拟合的原因
1、两个随机抽样
2、bagging集成算法

随机森林特征重要性原理
1、使用OOB(贷外数据)计算贷外数据误差(errorB1)(一棵树)
2、随机对特征x加入噪声干扰(改变特征x的值等),再次计算贷外数据误差(errorB2)(一棵树)
3、 i m p o r t a n c e = 1 N ∑ i = 1 N ( e r r o r B 2 − e r r o r B 1 ) importance=\frac{1}{N}\sum_{i=1}^N(errorB2-errorB1) importance=N1i=1N(errorB2errorB1) N N N为随机森林总的棵数

RF为什么随机抽样/随机特征
保证基分类器多样性,增加泛化能力与抗躁能力

为什么有放回抽样
分布不同,使各棵决策树差异性很大

RF需要剪枝与限制树的深度吗
不需要

RF为什么比bagging效率高
可并行实现而且引入了两个随机

5、python代码实现(待更…)

导入相关包

import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder #分类变量编码包
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
import variable_iv as vi
import Logistic_model as lm
from sklearn.ensemble import RandomForestClassifier

import os
os.chdir('E:/wyz/Desktop/rf/')

读取数据并预处理(必须处理缺失值)

data = pd.read_excel('ceshi.xlsx',sheet_name = 'Sheet2')
#分类变量编码
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
str_variable = list(data.dtypes[data.dtypes.values == object].index)
for col in str_variable:    
    data[col] = le.fit_transform(data[col].astype(str))
#在单变量分析的基础上填充缺失值(看哪一组的1的比率最接近于缺失值的那一组)
data['var1'] = data['var1'].fillna(0.42089)
data['var2'] = data['var2'].fillna(125.854)
#划分数据集
y = data_model['target']
x = data_model.drop('target', axis=1)
x_train, x_test, y_train, y_test = train_test_split(x, y,random_state=0,train_size=0.7)

训练

model_rf = RandomForestClassifier(n_estimators=100,#树的数量
                               criterion='gini',#分裂指标
                               max_depth=None,#树的深度
                               max_leaf_nodes=None,#最大叶子节点数量
                               min_samples_leaf=1,#叶子最小样本数
                               min_samples_split=2,#分裂节点所需最小样本数
                               random_state=50, 
                               max_features = 'sqrt',#划分时最多考虑的特征数量
                               n_jobs=-1, 
                               verbose = 1)

model_rf.fit(x_train, y_train)

评估

#预测结果
rf_class = model_rf.predict(x_test)
rf_prob = model_rf.predict_proba(x_test)[:, 1]
# Calculate roc auc
print('测试集准确率: %.4f'%roc_auc_score(y_test, rf_class))
print('测试集AUC: %.4f'%roc_auc_score(y_test, rf_prob))

决策树参数详解

参数 默认值及输入类型 介绍
n_estimators 默认值:100
输入:int
也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易过拟合,n_estimators太大,又容易欠拟合,一般选择一个适中的数值。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。
oob_scorer 默认值:False
输入:bool
是否采用袋外样本来评估模型的好坏。个人推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力。
criterion 默认值:Gini CART树做划分时对特征的评价标准。分类模型和回归模型的损失函数是不一样的。分类RF对应的CART分类树默认是基尼系数gini,另一个可选择的标准是信息增益。回归RF对应的CART回归树默认是均方差mse,另一个可以选择的标准是绝对值差mae。一般来说选择默认的标准就已经很好的。
max_features 默认值:None 决策树划分时考虑的最大特征数max_features:可以使用很多种类型的值,默认是”None”,意味着划分时考虑所有的特征数;如果是”log2”意味着划分时最多考虑log2(n_features)个特征;如果是”sqrt”或者”auto”意味着划分时最多考虑sqrt(n_features) 个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。 参数效果:max_features 值越大,模型学习能学习到的信息越多,越容易过拟合。
max_depth 决策树最大深度max_depth, 默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。 参数效果:值越大,决策树越复杂,越容易过拟合。
min_samples_split 默认值:2 内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。 参数效果:值越大,决策树越简单,越不容易过拟合。
min_samples_leaf 默认值:1 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。 参数效果:值越大,叶子节点越容易被被剪枝,决策树越简单,越不容易过拟合。
min_weight_fraction_leaf 默认值:0 叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
max_leaf_nodes 默认值:None 最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是”None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。 参数效果:值越小,叶子节点个数越少,可以防止过拟合。
min_impurity_split 默认值:1e-7 节点划分最小不纯度min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
n_jobs 这个参数告诉引擎有多少处理器是它可以使用。 “-1”意味着没有限制,而“1”值意味着它只能使用一个处理器
random_state 此参数让结果容易复现。 一个确定的随机值将会产生相同的结果,在参数和训练数据不变的情况下。 我曾亲自尝试过将不同的随机状态的最优参数模型集成,有时候这种方法比单独的随机状态更好。
oob_score 这是一个随机森林交叉验证方法。 它和留一验证方法非常相似,但这快很多。 这种方法只是简单的标记在每颗子树中用的观察数据。 然后对每一个观察样本找出一个最大投票得分,是由那些没有使用该观察样本进行训练的子树投票得到。

你可能感兴趣的:(机器学习算法(分类))