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

目录

一、集成学习

1、含义

2、集成学习代表

1)bagging方法

2)boosting方法

3)stacking方法

二、随机森林

1、什么是随机森林

2、特点

1)数据采样随机

2)特征选取随机

3)森林

4)基分类器为决策树

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

4、随机森林生成步骤

5、库及参数介绍

[1)n_estimators :(随机森林独有)](#1)n_estimators :(随机森林独有))

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

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

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

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

[6)min_weight_fraction_leaf : (同决策树)](#6)min_weight_fraction_leaf : (同决策树))

[7)max_features : 最大特征数 (随机森林独有)](#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、库及参数介绍

python 复制代码
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、代码实现

python 复制代码
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()

运行结果如下:

相关推荐
qq_529025291 小时前
Torch.gather
python·深度学习·机器学习
XiaoLeisj1 小时前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
IT古董1 小时前
【漫话机器学习系列】017.大O算法(Big-O Notation)
人工智能·机器学习
海棠AI实验室2 小时前
AI的进阶之路:从机器学习到深度学习的演变(三)
人工智能·深度学习·机器学习
古希腊掌管学习的神3 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
martian6653 小时前
【人工智能数学基础篇】——深入详解多变量微积分:在机器学习模型中优化损失函数时应用
人工智能·机器学习·微积分·数学基础
人机与认知实验室4 小时前
人、机、环境中各有其神经网络系统
人工智能·深度学习·神经网络·机器学习
古希腊掌管学习的神8 小时前
[机器学习]XGBoost(3)——确定树的结构
人工智能·机器学习
海棠AI实验室11 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习