机器算法之决策树

决策树概述

决策树是机器学习中常用的一种算法,它即可用于解决分类问题,也可用于解决回归问题。

在开始介绍决策树的构建之前,首先介绍几个相关概念,信息熵、条件熵以及信息增益:
首先介绍的概念:

: 指的是体系的混乱的程度,在不同的学科中也有引申出的更为具体的定义,是各领域十分重要的参量。

信息熵
在物理界中熵是描述事物无序性的参数,熵越大则越混乱。在这里可以用来描述随机变量取值的不确定性。

条件熵
描述 X 和 Y 所需的信息是描述 X 自己所需的信息,加上给定 X 的条件下具体化 Y 所需的额外信息

信息增益
信息增益表示为g(Y, X),其含义为给定X的能够使随机变量Y的确定性增加的程度。信息增益就是熵和特征条件熵的差。

决策树 开发流程

收集数据:可以使用任何方法。
准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化(独热编码)。
分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期。
训练算法:构造树的数据结构。
测试算法:使用经验树计算错误率。(经验树没有搜索到较好的资料,有兴趣的同学可以来补充)
使用算法:此步骤可以适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。

决策树Demo

def decision():
    """
    决策树预测乘客生存分类
    :return:
    """
    # 1、获取乘客数据
    titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")

    # 2、确定特征值和目标值,缺失值处理,特征类别数据 -->one-hot编码
    x = titan[['pclass', 'age', 'sex']]

    y = titan['survived']

    # 填充
    x['age'].fillna(x['age'].mean(), inplace=True)

    # 特征类别数据 -->one-hot编码
    dic = DictVectorizer(sparse=False)

    # [["1st","2","female"],[]]--->[{"pclass":, "age":2, "sex: female"}, ]
    x = dic.fit_transform(x.to_dict(orient="records"))

    print(dic.get_feature_names())
    print(x)

    # 3、分割数据集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

    # 4、决策树进行预测
    # dec = DecisionTreeClassifier(max_depth=5)
    #
    # dec.fit(x_train, y_train)
    #
    # print("预测的准确率为:", dec.score(x_test, y_test))
    #
    # # 导出到dot文件
    # export_graphviz(dec, out_file="./test.dot", feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])

    # 4、 随机森林进行预测
    rf = RandomForestClassifier()

    # 构造超参数的字典
    param = {"n_estimators": [120, 200],
             "max_depth": [5, 8],
             "min_samples_split": [2]}

    gc = GridSearchCV(rf, param_grid=param, cv=2)

    gc.fit(x_train, y_train)

    print("随机森林的准确率:", gc.score(x_test, y_test))
    print("交叉验证选择的参数:", gc.best_estimator_)

    return None

scikit-learn决策树算法类库介绍

scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法,既可以做分类,又可以做回归。分类决策树的类对应的是DecisionTreeClassifier,而回归决策树的类对应的是DecisionTreeRegressor。两者的参数定义几乎完全相同,但是意义不全相同。

scikit-learn决策树结果的可视化

#完整代码
import  matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn import tree

iris = load_iris()

clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
with open("iris.dot", 'w') as f:
    f = tree.export_graphviz(clf, out_file=f)
    
from IPython.display import Image  
import pydotplus


dot_datadot_dat  = tree.export_graphviz(clf, out_file=None, 
                         feature_names=iris.feature_names,  
                         class_names=iris.target_names,  
                         filled=True, rounded=True,  
                         special_characters=True)

graph = pydotplus.graph_from_dot_data(dot_data)

Image(graph.create_png())

dot_data = tree.export_graphviz(clf, out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data) 
graph.write_pdf("iris.pdf")

在这里插入图片描述

DecisionTreeClassifier实例

from itertools import product

import numpy as np
import matplotlib.pyplot as plt

from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier


# 仍然使用自带的iris数据
iris = datasets.load_iris()
X = iris.data[:, [0, 2]]
y = iris.target

# 训练模型,限制树的最大深度4
clf = DecisionTreeClassifier(max_depth=4)
#拟合模型
clf.fit(X, y)


# 画图
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                     np.arange(y_min, y_max, 0.1))

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8)
plt.show()

在这里插入图片描述

决策树 算法特点

优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。

缺点:可能会产生过度匹配问题。
适用数据类型:数值型和标称型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值