机器学习(十一)

一、决策树与随机森林

决策树原理图如下:
在这里插入图片描述

一、信息熵函数:

在这里插入图片描述
可以分解为下式:
在这里插入图片描述

其中p(x)为某一事件发生的概率,H(x)单位为比特。从上式可以看出,信息熵越大,其发生的概率的不确定性越大。

二·、决策树的划分依据:

(1)、信息增益:
信息增益表示得知特征w的信息而使得类q的信息的不确定性减小的程度。
在这里插入图片描述
g(D,A)为特征A对训练集D的信息增益,H(D)为训练集D的信息熵,H(D|A)为在特征A给改定条件下D的信息条件熵
其中:
在这里插入图片描述
在这里插入图片描述
Ck表示属于某一类别的样本数。下面是公式运用案例:

在这里插入图片描述
在这里插入图片描述
D1,D2,D3分别为青年、中年、老年的信息熵
(2)、其余的依据:
信息增益比
回归树:平均误差最小
分类树:基尼系数、最小准则

三、实例应用

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz


def detect():
    """
    用决策树预测生死
    :return:
    """
    titain = pd.read_csv("./Kaggle6773/titanic/train.csv")

    # 处理缺失值
    titain["Age"].fillna(titain["Age"].mean(), inplace=True)

    # 提取特征值与目标值
    x = titain[["Pclass", "Age", "Sex"]]
    y = titain["Survived"]

    # 分割数据集
    x_train, x_test, y_train, y_tset = train_test_split(x, y, test_size=0.25)
    # print(x_train)

    # 特征工程
    dir = DictVectorizer(sparse=False)
    x_train = dir.fit_transform(x_train.to_dict(orient="records"))
    x_test = dir.transform(x_test.to_dict(orient="records"))
    print(dir.get_feature_names())
    # print(x_train)

    # 用决策树预测准确率
    DTC = DecisionTreeClassifier()
    DTC.fit(x_train, y_train)

    # 生成决策树结构文件
    export_graphviz(DTC, out_file="./out.dot", feature_names=['Age', 'Pclass', 'Sex=female', 'Sex=male'])
   


四、优缺点

优点:
不需要将数据进行归一化处理;
可以查看最终形成决策树的结果
缺点:
在生成模型时容易过拟合,通常我们可以通过剪枝技术来减少过拟合程度

二、随机森林

集成学习可以通过生成多个模型(可以是不同种类的预测器)来解决单一的问题,生成的每一个模型可以独立的学习和做出预测处理,后将这些结果结合成单预测输出。随机森林就是这种原理,即将多个决策树进行组合,形成一个随机森林。其输出的类别是由个别树输出的类别与众数决定的(假设一共有五棵树,四棵树的输出为4,则最后结果即为4)

(一)建立过程

单个树建立的过程:
设一个数据集中有M个样本,N个特征
步骤一:随机的在数据集中复制出1个样本,共复制M次。由于是概率事件,故可能不会对整个数据集全覆盖
步骤二:随机的在N个特征中选择n(n<N)个特征。
上述抽样方式采用随机放回抽样(bootstrap)

(二)、演示样例:

import pandas as pd
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier


def random():
    """
    用随机森林进行预测
    :return:
    """

    titain = pd.read_csv("./Kaggle6773/titanic/train.csv")

    # 处理缺失值
    titain["Age"].fillna(titain["Age"].mean(), inplace=True)

    # 提取特征值与目标值
    x = titain[["Pclass", "Age", "Sex"]]
    y = titain["Survived"]

    # 分割数据集
    x_train, x_test, y_train, y_tset = train_test_split(x, y, test_size=0.25)
    # print(x_train)

    # 特征工程
    dir = DictVectorizer(sparse=False)
    x_train = dir.fit_transform(x_train.to_dict(orient="records"))
    x_test = dir.transform(x_test.to_dict(orient="records"))
    print(dir.get_feature_names())
    # print(x_train)

    # 网络搜索交叉验证的方式进行模型训练
    rf = RandomForestClassifier()
    param = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}

    # 开始交叉验证
    gc = GridSearchCV(rf, param_grid=param)
    gc.fit(x_train, y_train)

    # 输出参数
    print("预测的最好模型是", gc.best_estimator_)
    print("预测的最好参数为:", gc.best_params_)
    print("预测的最好结果是:", gc.best_score_)

(三)、优缺点分析

1、准确率相对较高
2、大数据集运行可靠
3、不需要对特征数量进行降维处理
4、能够分析出特征对结果的重要性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值