机器学习各类算法思路总结四(决策树与随机森林、集成学习了解)

决策树

  • 简单来说,决策树,就是将数据集转化为一棵树,按照这棵树的规则,对于样本进行归类。
  • 决策树是一种非参数监督学习方法,用于分类与回归。 目标是创建一个模型,从数据特征中进行学习,进而推断出的简单决策规则,用来预测目标变量的值。
  • 决策树是一种树形结构,通过做出一系列决策(选择)来对数据进行划分,这类似于针对一系列问题进行选择。
  • 决策树的决策过程就是从根节点开始,测试待分类项中对应的特征属性,并按照其值选择输出分支,直到叶子节点,将叶子节点的存放的类别作为决策结果。
决策树的大概构建过程
  • 这里只会大概说,详细的请看:
    • https://blog.csdn.net/qq_24499745/article/details/88821450
  • 决策树由若干个节点构成,根节点存放着所有样本的数量,旗下的每个节点存放着一定数量的样本,根据从特征中得出的条件,逐步的分化节点,一直到指定的深度,或者所有的叶子节点都只是一个类别,所有的样本数量小于指定的最小分类的样本数量。
  • 分裂的时候,根据信息熵求出每个特征的信息增益,然后找出最大信息增益的特征
  • 求信息增益的时候,有个问题就是,特征中,有俩种类型,一种为离散型,一种为连续型;
  • 对于离散型,一般就是 类似于 是与不是的值,直接求信息增益就可以了
  • 对于连续值,需要将特征进行排序,然后根据对应的标签,找出分界点,然后将所有的分界点分别求信息增益
  • 然后找出所有的信息增益中,最大的信息增益,不断地根据最大的信息增益的特征,进行分裂属性。
构建决策树有三种算法
  • ID3
  • C4.5
  • CART(Classification And Regression Tree)
    机器学习各类算法思路总结四(决策树与随机森林、集成学习了解)_第1张图片
参数与实现说明
  • sklearn中提供的决策树是CART模型。因此构建的树为二叉树结构。
  • 参数max_feature,值切分时,选择的最大特征的数量。因为如果随机选择特征作为切分标准,则效果可能较差。这时,我们可以指定max_feature,即从原有的所有特征中,最多选择max_feature个特征,然后在这些特征中选择一个最好的,缓解了因为随机选择特征,而导致分类不好的情况。尽管在选择的max_feature特征中,挑选出来的最好的效果的特征,不一定是所有全局中最好的,但已经是局部(max_feature)特征中最好的。
  • 决策树算法不依赖于数据集的标准化
  • 无论是分类还是回归,如果决策树的深度过小,则容易发生欠拟合,反之,如果树的深度过大,则容易发生过拟合。因此,合理控制树的深度是重要的。
代码实现(依旧使用鸢尾花的案例)
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.datasets import load_iris
# sklearn.tree提供树形结构的模块,DecisionTreeClassifier用于分类的决策树。
from sklearn.tree import DecisionTreeClassifier

mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False

iris = load_iris()
iris.feature_names = ["花萼长度", "花萼宽度", "花瓣长度", "花瓣宽度"]
cmap = ListedColormap(["r", "g", "b"])
plt.figure(figsize=(18, 9))
# 处于可视化角度考虑,我们只考虑其中的两个特征。
# 依次选择不同的两个鸢尾花特征,进行分类。
for pairidx, pair in enumerate([[0, 1]]):
    # 根据索引数组提取元素。
    X = iris.data[:, pair]
    y = iris.target
    # 创建决策树对象,用于分类。
    # 决策树的深度会影响模型的效果。如果没有指定,则不限制树的生长。
    clf = DecisionTreeClassifier(max_depth=None).fit(X, y)
    plt.subplot(2, 3, pairidx + 1)
    plt.title(f"正确率:{clf.score(X, y):.3f}")
    x1_min, x2_min = np.min(X, axis=0)
    x1_max, x2_max = np.max(X, axis=0)
    x1 = np.linspace(x1_min - 1, x1_max + 1, 100)
    x2 = np.linspace(x2_min - 1, x2_max + 1, 100)  
    X1, X2 = np.meshgrid(x1, x2)
#     # np.c_是按行连接矩阵,将俩个矩阵连接起来
    Z = clf.predict(np.c_[X1.ravel(), X2.ravel()])
    Z = Z.reshape(X1.shape)
    cs = plt.contourf(X1, X2, Z, cmap=cmap, alpha=0.5)
    plt.xlabel(iris.feature_names[pair[0]], fontsize=16)
    plt.ylabel(iris.feature_names[pair[1]], fontsize=16)
    for i in range(3):
        # np.where 的第二种语法格式,仅有一个参数。
        # 当只有一个参数时,返回值为True的元素对应的索引。
        # 这里idx存储的是每个类别的索引(数组)
        idx = np.where(y == i)
        # X[idx, 0] 通过索引数组提取元素。
        plt.scatter(X[idx, 0], X[idx, 1], c=cmap(i), label=iris.target_names[i],
                    cmap=cmap, edgecolor="black")
plt.suptitle("决策树决策边界", fontsize=16)
plt.legend(loc="lower right", fontsize=16)
    # 调整子绘图区域之间的距离(主要高度距离),避免字体重叠。
plt.subplots_adjust(top=0.9, hspace=0.25)
plt.show()
决策树回归
  • 分类树采用信息增益、信息增益率、基尼系数来评价树的效果,都是基于概率值进行判断的;而分类树的叶子节点的预测值一般为叶子节点中概率最大的类别作为当前叶子的预测值。
  • 在回归树中,叶子节点的预测值一般为叶子节点中所有值的均值来作为当前叶子节点的预测值。所以在回归树中一般采用MSE作为树的评价指标,即均方差。
  • 一般情况下,只会使用CART算法构建回归树。

集成学习了解

  • 集成学习实际上,不算是一种算法,而是一种解决问题的思路。
  • 集成学习是将若干个基本的评估器(分类器/回归器)进行组合,然后利用这些基本的评估器综合的对于未知的样本进行预测
  • 集成学习具有更好的广泛能力与稳健性
集成学习的分类
  • 根据个体学习器的生成方式,目前的集成学习方法大致可以分为两大类:
  • 个体学习器间不存在强依赖关系、可同时生成的并行化方法
    • 训练多个基本的评估器,最终使用多个评估器的结果综合得到最终的预测值。如果是分类型的任务,那么预测结果中,类别最多的作为预测的结果。如果是回归类型的任务,那么多个评估器预测结果的平均值作为预测结果
    • 通过综合考量的方式得到预测结果,有效的减少方差,所以通常其预测的结果可以优于任何一个基本的评估器
    • 代表为Bagging和随机森林
  • 个体学习器间存在强依赖关系、必须串行生成的序列化方法
    • 多个基本评估器按照顺序训练的,然后将若干个模型(通常是弱评估器)进行组合,进而产生一个预测能力强的模型
    • 基本评估器不是独立的,后续的评估器是需要依赖于之前的评估器,训练过程中,会试图减少组合之后的评估器的方差
    • 代表为Boosting(Adboost、GBDT、Xgboost)
  • 对于基分类器最终的结合策略常见的方法有如下几种:
    • 平均法,其中为基学习器的输出结果,为最终学习器的结果,为基学习器的个数。
    • 加权平均法,其中是个体学习器的权重,通常要求。显然,简单平均法是加权平均法令的特例。
    • 投票法,预测结果为得票最多的标记,若同时有多个标记获得相同的票数,则从中随机选取一个。
    • 学习法,当训练数据很多时,可以通过另一个学习器来对所有基学习器产生结果的结合方法进行学习,这时候个体学习器称为初级学习器,用于结合的学习器成为次级学习器或元学习器。

随机森林

  • 随机森林属于集成学习下的一种算法
  • 从 随机森林 这个名字来看,森林,是由很多颗树组成。而我们上述学习过的一种算法: 决策树,随机,从所有的特征中随机选择一些特征。
  • 从平均方法的概念和随机森林的字面意思,个人理解,所谓随机森林,就是使用多个基本的评估器对于数据进行训练,最后综合的得出结果,而这多个基本的评估器,都是决策树,构建决策树的时候,使用的是从所有的数据特征中,随机选择k个特征,从这k个特征中找最大的信息增益,然后进行构建决策树,由指定颗决策树组合出一个森林,由森林中的每颗树分别独立对于数据进行训练,最后综合所有的树的结果得出最后的结果
随机森林的概念详解
  • 在随机森林中,用于训练决策树的子集样本数量与原始数据集的样本数量是相同的。
  • 从原始的数据集中拿出所有的数据进行训练
  • 使用所有的样本进行构建一颗决策树(从所有的特征中随机选择k个特征,根据目标函数的要求,比如说信息增益,使用选择的特征对于节点进行划分)
  • 重复以上的俩步n次,建立n颗决策树
  • n颗决策树形成随机森林,通过投票选择(分类)或者均值决定的方式(回归)决定最终的预测值
随机森林说明
  • 用于训练基本评估器(决策树)的数据子集,其样本数量与原始数据集的样本数量相同。
  • 默认情况下,随机森林中的决策树在拆分节点时,不是从所有的特征中选择一个最优的特征,而是从随机的特征子集中,选择一个最优的特征。
  • 由于这样的随机性,随机森林的偏差通常会增加(相对于单个的决策树来说),但是由于使用了多颗决策树平均预测,其方差也会减小,从而在整体上来讲,模型更加优秀。
  • 对于回归任务,通常设置max_features=n_features,对于分类任务,通常设置max_features=sqrt(n_features)。
  • max_depth=None结合min_samples_split=2,通常可以获得很好的结果,但是,这往往会消耗大量的内存。
随机森林必要的包
  • RandomForestRegressor,随机森林的实现类,在sklearn.ensemble包下
随机森林代码实现
# 葡萄酒数据集
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.ensemble import  RandomForestClassifier
# 得到葡萄酒的数据集
X, y = load_wine(return_X_y=True)
# 为了方便进行可视化,这里只选择两个特征。
X = X[:, [0, 10]]
# 去掉类别为0的数据。
X = X[y != 0]
y = y[y != 0]
# 分隔数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)
# 得到随机森林,这个随机森林有一百颗树,
# criterion 不纯度的度量标准,这边选择计算属性的gini(基尼不纯度)
# max_depth  决策树最大深度
# 设置随机种子
rf = RandomForestClassifier(n_estimators=100, criterion="gini", random_state=0, max_depth=None)
# 开始训练
rf.fit(X_train, y_train)
print("随机森林准确率:")
print(rf.score(X_train, y_train))
print(rf.score(X_test, y_test))

你可能感兴趣的:(机器学习)