决策树概述
决策树是机器学习中常用的一种算法,它即可用于解决分类问题,也可用于解决回归问题。
在开始介绍决策树的构建之前,首先介绍几个相关概念,信息熵、条件熵以及信息增益:
首先介绍熵的概念:
熵: 指的是体系的混乱的程度,在不同的学科中也有引申出的更为具体的定义,是各领域十分重要的参量。
信息熵:
在物理界中熵是描述事物无序性的参数,熵越大则越混乱。在这里可以用来描述随机变量取值的不确定性。
条件熵
描述 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()
决策树 算法特点
优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。
缺点:可能会产生过度匹配问题。
适用数据类型:数值型和标称型。