《机器学习》决策树 集成学习 随机森林 参数及实例解析

目录

一、集成学习

1、含义

2、集成学习代表

        1)bagging方法

        2)boosting方法

        3)stacking方法

二、随机森林

1、什么是随机森林

2、特点

        1)数据采样随机

        2)特征选取随机

        3)森林

        4)基分类器为决策树

3、为什么使用随机森林?

4、随机森林生成步骤

5、库及参数介绍

1)n_estimators :(随机森林独有)

2)criterion:节点分割依据(同决策树)

3)max_depth:决策树最大深度,最大层数(同决策树)

4)min_samples_split :非叶子节点最小样本数 (同决策树)

5)min_samples_leaf  :最小叶子节点数样本数 (同决策树)

6)min_weight_fraction_leaf : (同决策树)

7)max_features : 最大特征数 (随机森林独有)

8)max_leaf_nodes:最大叶子结点数 (同决策树)

9)min_impurity_split:(同决策树)

10)bootstrap=True (随机森林独有)

11)n_jobs=1:

6、代码实现


一、集成学习

1、含义

        集成学习(Ensemble Learning)是一种通过将多个机器学习模型组合起来来解决问题的方法。在集成学习中,多个模型被训练并预测,然后通过一定的策略将它们的预测结果进行组合,从而得到最终的预测结果。

        集成学习的基本理论基础是"集思广益",即通过结合多个模型的优点提高整体的性能表现。通过集成学习,可以减小单一模型的局限性降低模型的方差提高模型的鲁棒性和预测稳定性。集成学习可以应用于分类问题、回归问题和聚类问题等多个领域。

2、集成学习代表

        1)bagging方法

                典型:随机森林

        2)boosting方法

                典型:Xgboost

        3)stacking方法

                典型:堆叠模型

二、随机森林

1、什么是随机森林

        随机森林(Random Forest)是一种集成学习方法,基于决策树构建的模型。随机森林在训练过程中生成多个决策树,并通过投票或平均的方式来进行最终的预测。

如图所示,即为随机森林的模型:

2、特点

        1)数据采样随机

        在每个决策树的训练过程中,随机森林会从原始训练集中有放回地抽取样本,用于构建决策树。这样可以增加样本的多样性,减小过拟合的风险。

        2)特征选取随机

        在每个决策树的训练过程中,随机森林会从原始训练集中有放回地抽取样本,用于构建决策树。这样可以增加样本的多样性,减小过拟合的风险。

        3)森林

        在进行预测时,随机森林会对每个决策树的预测结果进行投票(分类问题)或求平均(回归问题),以得到最终的预测结果。

        4)基分类器为决策树

        随机森林由多个决策树构成,每个决策树都是独立训练的。每个决策树都对输入数据进行特征选择和分裂,通过递归地选择最佳分割特征和阈值来构建决策树。

3、为什么使用随机森林?

        随机森林具有良好的泛化能力,对于处理高维数据大规模数据集也有较好的效果。它可以用于分类回归问题,并且能够给出特征的重要性评估,用于特征选择特征工程

        随机森林的训练速度较快,并且对于缺失值异常值具有较好的处理能力。因此,随机森林是机器学习中一种常用的集成学习方法。

4、随机森林生成步骤

5、库及参数介绍

class 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=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)
1)n_estimators :(随机森林独有)

        随机森林中决策树的个数。

        在0.20版本中默认是10个决策树;

        在0.22版本中默认是100个决策树;

2)criterion节点分割依据(同决策树)

        默认为基尼系数,可选entropy,信息增益

3)max_depth:决策树最大深度,最大层数(同决策树

        default=(None)设置决策树的最大深度,默认为None。

        (1)数据少或者特征少的时候,可以不用管这个参数,按照默认的不限制生长即可

        (2)如果数据比较多特征也比较多的情况下,可以限制这个参数,范围在10~100之间比较好

4)min_samples_split :非叶子节点最小样本数 (同决策树)

        这个值限制了子树继续划分的条件,如果某节点的样本数少于设定值,则不会再继续分裂。默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则建议增大这个值。

5)min_samples_leaf  :最小叶子节点数样本数 (同决策树)

        这个值限制了叶子节点最少的样本数

6)min_weight_fraction_leaf : (同决策树)

         这个值限制了叶子节点所有样本权重和的最小值,

7)max_features : 最大特征数 (随机森林独有)

        随机森林允许单个决策树使用特征的最大数量。选择最适属性时划分的特征不能超过此值。

当为整数时,即最大特征数;当为小数时,训练集特征数*小数;

8)max_leaf_nodes:最大叶子结点数 (同决策树)

        通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

9)min_impurity_split:(同决策树)

        这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。

10)bootstrap=True (随机森林独有)

        是否有放回的采样,按默认,有放回采样

11)n_jobs=1:

        并行job个数。这个在是bagging训练过程中有重要作用,可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job。

6、代码实现

import pandas as pd
from sklearn import tree
from sklearn.model_selection import train_test_split

# 回执混淆矩阵
def cm_plot(y, yp):    # 可视化混淆矩阵,网上都是包装好的,可以直接复制使用
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt

    cm = confusion_matrix(y, yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt


# data = pd.read_csv('data.csv')
df = pd.read_csv("spambase.csv")  # 导入数据

x = df.iloc[:,:-1]  # 切分特征集和标签集
y = df.iloc[:,-1]

xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.2,random_state=100)  # 对原始数据集进行切分

# 随机森林
from sklearn.ensemble import RandomForestClassifier   # 导入随机森林库
# 定义参数
rf = RandomForestClassifier(   # 定义模型并调整参数
    n_estimators=100,  # 决策树个数
    max_features=0.8,  # 最多传递多少个特征 80%
    random_state=0   # 随机种子
)

rf.fit(xtrain,ytrain)  # 对训练集进行训练

train_predicted = rf.predict(xtrain)  # 预测训练集本身正确率

from sklearn import metrics
# 打印分类报告
print(metrics.classification_report(ytrain,train_predicted))
# 绘制混淆矩阵
cm_plot(ytrain,train_predicted).show()

test_predicted = rf.predict(xtest)  # 对测试集进行测试,同时打印分类报告
print(metrics.classification_report(ytest,test_predicted))
cm_plot(ytest,test_predicted).show()

import matplotlib.pyplot as plt   # 导入绘图库

importances = rf.feature_importances_  # 将rf模型中特征的重要性评估保存在importances变量中
im = pd.DataFrame(importances,columns=['importances'])  # 将importances转换成DataFrame对象,并设置列名为importances
clos = df.columns  # 将数据集df的列名保存在clos变量中
clos_1 = clos.values   # 将clos转换成一个一维numpy数组,存放在clos_1中
clos_2 = clos_1.tolist()   # 将clos_1转换成一个python列表
clos = clos_2[0:-1]   # 取出除了最后一个的全部数据
im['clos'] = clos   #  将处理后的特征列名增加到DataFrame im中

im = im.sort_values(by=['importances'],ascending=False)[:10]  # 根据特征重要性的值对im进行降序排序,并选取前十个重要特征。

index = range(len(im))  # 生成一个范围对象,表示条形图的纵轴刻度
plt.yticks(index,im.clos)  # 设置纵轴的刻度标签为im中的特征列名
plt.barh(index,im['importances'])  # 绘制水平条形图,横轴表示特征重要性,纵轴表示特征名。
plt.show()

运行结果如下:

 

 

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜就多练_0828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值