`
huangyongxing310
  • 浏览: 499100 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

决策树

 
阅读更多
决策树


树形模型是一个一个特征进行处理,之前线性模型是所有特征给予权重相加得到一个新的值。

采用自顶向下的递归的方法,基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处熵值为0(叶节点中的实例都属于一类)

根节点(最重要的特征);父节点与子节点是一对,先有父节点,才会有子节点;叶节点(最终标签)。



原理:
就是从样本中得到一个用于进行判断的树(判断特征的顺序),方法就是从样要中计算每个特征对结果的贡献大小来决定顺序.




随机森林(RandomForestClassifier)
同一批数据,用同样的算法只能产生一棵树,这时Bagging策略可以帮助我们产生不同的数据集。Bagging策略来源于bootstrap aggregation:从样本集(假设样本集N个数据点)中重采样选出Nb个样本(有放回的采样,样本数据点个数仍然不变为N),在所有样本上,对这n个样本建立分类器(ID3\C4.5\CART\SVM\LOGISTIC),重复以上两步m次,获得m个分类器,最后根据这m个分类器的投票结果,决定数据属于哪一类。

随机森林在bagging的基础上更进一步:

1.  样本的随机:从样本集中用Bootstrap随机选取n个样本

2.  特征的随机:从所有属性中随机选取K个属性,选择最佳分割属性作为节点建立CART决策树(泛化的理解,这里面也可以是其他类型的分类器,比如SVM、Logistics)

3.  重复以上两步m次,即建立了m棵CART决策树

4.  这m个CART形成随机森林,通过投票表决结果,决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)


关于调参:1.如何选取K,可以考虑有N个属性,取K=根号N
               2.最大深度(不超过8层)
               3.棵数
               4.最小分裂样本树
               5.类别比例



# coding=utf-8

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import tree
import numpy as np
from sklearn.externals.six import StringIO
import pydot


def main():
    iris = datasets.load_iris()  # 典型分类数据模型
    # 这里我们数据统一用pandas处理
    data = pd.DataFrame(iris.data, columns=iris.feature_names)
    data['class'] = iris.target

    # 这里只取两类
    data = data[data['class'] != 2]
    # 为了可视化方便,这里取两个属性为例
    X = data[['sepal length (cm)', 'sepal width (cm)']]
    Y = data[['class']]
    # 划分数据集
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y)
    # 创建决策树模型对象,默认为CART
    dt = tree.DecisionTreeClassifier()
    dt.fit(X_train, Y_train)

    # 返回树中的决策路径
    dp = dt.decision_path(X_test)
    print('X_test')
    print(X_test)
    print('决策路径')
    print(dp)

    print("特征重要性(数组)")  # 特征重要性(数组)
    print(dt.feature_importances_)#特征重要性(数组)

    print("类别标签(数组或列表)")  #类别标签(数组或列表)
    print(dt.classes_)  # 类别标签(数组或列表)

    print("max_features的inferred(推测?)值(int)")  # max_features的inferred(推测?)值(int)
    print(dt.max_features_)  # max_features的inferred(推测?)值(int)

    print("类别数目(int)")  # 类别数目(int)
    print(dt.n_classes_)  # 类别数目(int)

    print("特征数目(int)")  #特征数目(int)
    print(dt.n_features_)  # 特征数目(int)

    print("输出数目(int)")  # 输出数目(int)
    print(dt.n_outputs_)  # 输出数目(int)

    print("树对象")  # 树对象
    print(dt.tree_)  # 树对象






    # 显示训练结果
    print(dt.score(X_test, Y_test))
      # score是指分类的正确率

    # 作图
    h = 0.02
    x_min, x_max = X.iloc[:, 0].min() - 1, X.iloc[:, 0].max() + 1
    y_min, y_max = X.iloc[:, 1].min() - 1, X.iloc[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    Z = dt.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)

    # 做出原来的散点图
    class1_x = X.loc[Y['class'] == 0, 'sepal length (cm)']
    class1_y = X.loc[Y['class'] == 0, 'sepal width (cm)']
    l1 = plt.scatter(class1_x, class1_y, color='b', label=iris.target_names[0])
    class1_x = X.loc[Y['class'] == 1, 'sepal length (cm)']
    class1_y = X.loc[Y['class'] == 1, 'sepal width (cm)']
    l2 = plt.scatter(class1_x, class1_y, color='r', label=iris.target_names[1])
    plt.legend(handles=[l1, l2], loc='best')

    plt.grid(True)
    plt.show()
    # 导出决策树的图片,需要配置graphviz,并且添加到环境变量
    dot_data = StringIO()
    tree.export_graphviz(dt, out_file=dot_data, feature_names=X.columns,
                         class_names=['healthy', 'infected'],
                         filled=True, rounded=True,
                         special_characters=True)
    graph = pydot.graph_from_dot_data(dot_data.getvalue())[0]
    # graph.write_png("Iris.png")


if __name__ == '__main__':
    main()




# coding=utf-8

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import tree
import numpy as np
from sklearn.externals.six import StringIO
import pydot
from sklearn.externals.six import StringIO
import pydot
import pydotplus
import os



def main():
    # ['有房', '有工作', '有车','年龄']
    X_train = np.array([[1, 1, 1, 25],
                        [1, 1, 0, 35],
                        [1, 0, 1, 32],
                        [0, 1, 1, 31],
                        [0, 0, 1, 20],
                        [0, 1, 0, 20],
                        [1, 0, 0, 21],
                        [1, 1, 0, 28],
                        [1, 0, 1, 30],
                        [1, 1, 0, 32]])

    Y_train = np.array([1, 0, 0, 0, 1,
                        1, 0, 1, 1, 1])

    X_test = np.array([[1, 1, 0, 33]])
    Y_test = np.array([1])

    # 创建决策树模型对象,默认为CART
    dt = tree.DecisionTreeClassifier()
    dt.fit(X_train, Y_train)

    print("特征重要性(数组)")  # 特征重要性(数组)
    print(dt.feature_importances_)  # 特征重要性(数组)
    # [0.         0.33333333 0.         0.66666667]

    print("类别标签(数组或列表)")  # 类别标签(数组或列表)
    print(dt.classes_)  # 类别标签(数组或列表)

    print("max_features的inferred(推测?)值(int)")  # max_features的inferred(推测?)值(int)
    print(dt.max_features_)  # max_features的inferred(推测?)值(int)
    # 4

    print("类别数目(int)")  # 类别数目(int)
    print(dt.n_classes_)  # 类别数目(int)

    print("特征数目(int)")  # 特征数目(int)
    print(dt.n_features_)  # 特征数目(int)

    print("输出数目(int)")  # 输出数目(int)
    print(dt.n_outputs_)  # 输出数目(int)

    print("树对象")  # 树对象
    print(dt.tree_)  # 树对象

    predict_y = dt.predict(X_test)

    print("predict_y = ", predict_y)
    # predict_y = [1]

    # score是指分类的正确率
    print("score = ", dt.score(X_test, Y_test))
    # score =  1.0

    # 返回每个样本被预测的叶子结点索引
    print("apply = ", dt.apply(X_test))
    # apply =  [6]

    # 返回决策路径
    print("decision_path = ", dt.decision_path(X_test))
    # decision_path =    (0, 0)	1
    #   (0, 2)	1
    #   (0, 6)	1

    # 获取参数
    print("get_params = ", dt.get_params())

    # 预测输入样本的类别对数概率
    print("predict_log_proba = ", dt.predict_log_proba(X_test))
    # 预测输入样本的类别概率
    print("predict_proba = ", dt.predict_proba(X_test))


    #
    dot_data = StringIO()
    tree.export_graphviz(dt, out_file=dot_data)
    graph = pydot.graph_from_dot_data(dot_data.getvalue())
    # graph[0].write_dot('test002.dot')
    graph[0].write_png('test002.png')

    # graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
    # graph.write_pdf("test002.pdf")
    # graph.

    # graph = pydot.graph_from_dot_data(dot_data.getvalue())
    # graph[0].write_pdf("test002.pdf")

if __name__ == '__main__':
    os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'
    main()








  • 大小: 30.7 KB
分享到:
评论

相关推荐

    基于MapReduce实现决策树算法

    基于MapReduce实现决策树算法的知识点 基于MapReduce实现决策树算法是一种使用MapReduce框架来实现决策树算法的方法。在这个方法中,主要使用Mapper和Reducer来实现决策树算法的计算。下面是基于MapReduce实现决策...

    决策树分类实验(乳腺癌).zip_wpbc数据集_乳腺癌数据_决策树 cancer_决策树分类程序(使用乳腺癌数据集)_决策树数

    决策树是一种广泛应用于数据分析和机器学习的算法,尤其在分类问题中表现突出。在这个"决策树分类实验(乳腺癌)"中,我们看到一个利用决策树进行乳腺癌预测的实例。该实验基于wpbc(Wisconsin Breast Cancer)数据...

    机器学习+决策树+python实现对率回归决策树

    对于正确率相同的节点,选取优先遍历的属性作为根节点,与基于信息增益进行划分选择的方法相比,可知两种方法绘制的决策树正确率均为100%,但对率回归方法容易忽略在同一正确率下划分较佳的节点,从而使决策树层数...

    决策树算法经典优秀论文(1).zip

    决策树算法经典优秀论文(1).zip 决策树算法经典优秀论文(1).zip 决策树算法经典优秀论文(1).zip 决策树算法经典优秀论文(1).zip 决策树算法经典优秀论文(1).zip 决策树算法经典优秀论文(1).zip 决策树算法经典优秀...

    决策树绘制graphviz

    决策树是一种广泛应用于机器学习领域的算法,主要用于分类和回归任务。它通过构建一系列规则和条件来模拟人类的决策过程,从而对数据进行预测。Graphviz是一款强大的图形渲染工具,能够帮助我们可视化这些决策树模型...

    python决策树代码

    决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画...

    决策树算法及其实现

    决策树算法是数据挖掘和机器学习领域中一个非常重要的分类方法,它通过一系列规则对数据集进行分治,直到每个分支都对应一个单一的类别为止。决策树是基于监督学习方法实现的,这意味着它需要一个事先已标记的数据集...

    决策树实验内容2

    在本次"决策树实验内容2"中,我们将深入探讨决策树这一重要的机器学习算法,主要分为以下几个部分: **1.1 决策树处理分类任务** 在这个环节,我们将使用`sklearn.tree.DecisionTreeClassifier`来解决Dota2比赛...

    波士顿房价决策树python编码

    第二步,决策树的剪枝:决策树的剪枝是对上一阶段生成的决策树进行检验、校正和修下的过程,主要是用新的样本数据集(称为测试数据集)中的数据校验决策树生成过程中产生的初步规则,将那些影响预衡准确性的分枝剪除...

    决策树回归算法

    决策树回归算法是一种基础的机器学习算法,主要用于回归分析,在分类问题中也有应用。其核心思想是将特征空间划分成若干个子空间,每个子空间都有一个对应的输出值,这种方法特别适合处理具有层次关系的问题。 首先...

    决策树资料合集.rar_决策树_决策树 word_决策树 文档_源代码

    决策树是一种广泛应用于数据分析、机器学习以及人工智能领域的算法模型,它通过模拟人类做决策的过程,以树状结构来表示可能的决策路径和结果。在这个"决策树资料合集"中,包含了关于决策树的源文件、实例、内容详解...

    决策树天气预测

    决策树是一种常用的数据挖掘工具,尤其在预测任务中表现出色,如天气预测。在这个场景中,我们使用MATLAB作为编程环境来实现决策树算法。MATLAB不仅提供了强大的数学计算功能,还内置了丰富的数据处理和机器学习库,...

    广工人工智能决策树

    ### 广工人工智能决策树知识点解析 #### 一、决策树概述 决策树是一种常用的机器学习方法,尤其在监督学习中被广泛应用于分类与回归任务。它通过一系列判断条件来划分数据集,最终达到对未知数据进行预测的目的。...

    基于决策树的鸢尾花分类

    【基于决策树的鸢尾花分类】 决策树是一种广泛应用的机器学习算法,尤其适用于分类问题。在本案例中,鸢尾花的分类是基于决策树模型进行的。鸢尾花有三个不同种类:Iris Setosa (Se),Iris Versicolour (Ve),和 ...

    鸢尾花分类实验-决策树_鸢尾花实验_鸢尾花分类实验-决策树_

    在这个实验中,我们利用决策树算法来实现这一目标。决策树是一种直观且易于理解的监督学习方法,常用于分类任务。 决策树的工作原理是通过一系列的“如果-那么”规则来构建一个树形结构,每个内部节点代表一个特征...

    广工人工智能作业--决策树

    决策树ID3算法实现 本文档旨在讲解决策树ID3算法的实现,通过C++语言编写的源代码来实现决策树和决策树对应的规则集。 一、决策树概述 决策树是一种常用的机器学习算法,用于分类和预测问题。决策树由节点和边...

    决策树.zip

    决策树是一种广泛应用于数据分析和机器学习的算法,尤其在分类问题中表现突出。它通过构建一个树状模型来做出预测,每个内部节点代表一个特征,每个分支代表该特征的一个值,而叶节点则对应于一个类别或连续值的预测...

    决策树实现对鸢尾花分类

    决策树是一种广泛应用于数据挖掘和机器学习的算法,它的核心思想是通过一系列的规则划分,将数据集分割成不同的类别。在这个案例中,我们将详细探讨如何利用Python来实现决策树对鸢尾花数据集的分类,并对其进行可视...

    西瓜书《机器学习》---第四章 决策树python代码实现

    4.3 编程实现基于信息熵进行划分选择的决策树算法,并为西瓜数据集3.0中的数据生成一颗决策树。 4.4 编程实现基于基尼指数进行划分选择的决策树算法,为西瓜数据集2.0生成预剪枝、后剪枝决策树,并与未剪枝决策树...

    模式识别中的决策树程序

    决策树是一种广泛应用于模式识别和数据挖掘的机器学习算法,它的主要任务是通过构建一棵树状模型来实现对数据的分类或回归。在这个程序中,我们重点探讨的是决策树在模式识别中的应用,以及它是如何用C语言实现的。 ...

Global site tag (gtag.js) - Google Analytics