0.决策树整理
0.0 文章索引
- 0.建议根据个人需要和实际情况调整各个小节的阅读顺序;
- 1.Python-sklearn使用:调用sklearn已有工具包实现应用;
- 2.书籍案例介绍:《数据挖掘——你必须知道的32个经典案例(第2版)》;
- 3.其他。
1.Python-sklearn使用
1.1 过程描述
- 模型初始化–DecisionTreeClassifier();
- 模型训练–fit(x_train, y_train);
- 模型预测评价–score(x, y)、predict(x)、apply(x)。
- fit()、apply()、predict()、score()四个主要掌握的函数,具体解释在代码中有。
1.1.2 程序流程解释
- 导入必要的模块:(1)sklearn.tree用于调用决策树类;(2)sklearn.datasets导入自带的测试用数据集;(3)sklearn.model_selection.train_test_split()用于划分训练、测试集;(4)graphviz用于可视化决策树–需要自行官网安装、环境变量配置。
- 通过load_wine()导入酒数据集:获取特征数据、标签数据、特征列名和标签列名的属性列在代码里。
- 通过train_test_split()划分数据集:分别传入特征数据、标签数据、训练集(或测试集)所占比例、random_state(限定随机性,即种子不变随机结果固定的知识点)。
- 初始化决策树对象:clf = tree.DecisionTreeClassifier(),其中传入参数criterion可选gini或entropy;splitter和random_state消除决策树生成的随机性(设置该参数后,其他条件不变的情况下,可以保证每次运行结果不变);其他参数(如剪枝作用的参数)在代码中有介绍。
- 训练分类器:clf = clf.fit(x_train, y_train)。
- 评价模型:clf.score(x_test, y_test)评价测试集accuracy效果–若传入x_train和y_train则得到模型在训练集上的表现;其他评价指标如查全率、查准率等也可以通过sklearm.metrics中的函数得到,暂不赘述。
- 模型预测:predict(x_test)函数得到的是特定特征数据下的预测标签值–尽管不调用这个函数也能实现模型评价,但是预测函数在很多场景下也是必要的。
- 可视化、特征重要性:graphviz的使用见代码;特征重要性可以通过模型的属性clf.feature_importances_进行调用。
- 其他:zip()函数可以将两个可迭代对象按照对应位置元素打包成元组,返回元组组成的列表,但是数据类型依然为zip无法直接print()打印,因此可以使用list()函数先将其转化为列表再打印;x_train.shape返回列表数据的行列数。
1.2 代码
- 主要来自于菜菜的sklearn课堂-看视频跟着敲的;
- 推荐一下:菜菜TsaiTsai-哔哩哔哩。
# 导入模块
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import graphviz
def main():
wine = load_wine()
# wine.data 特征数据
# wine.target 标签数据
# wine.feature_names 特征列名
# wine.target_names 标签列名
"""将数据转为pandas中的dataframe类型
import pandas as pd
pd.concat([pd.DataFrame(wine.data), pd.DataFrame(wine.target)], axis=1)
"""
x_train, x_test, y_train, y_test = train_test_split(wine.data, wine.target, test_size=0.3, random_state=1)
print(y_train.dtype)
# x_train.shape 训练集的行列大小
"""
sklearn调用三部曲:1.初始化模型;2.训练模型;3.获取结果;
需要注意的是:
1.决策树的生成具有一定的随机性,因此可以通过random_state以及splitter调整随机性;
2.剪枝:通过设置max_depth(限定决策树最深层数),
min_samples_leaf(限定属于叶子节点的样本量)
以及min_samples_split(限定分出分支的样本量条件)
等参数进行;
"""
clf = tree.DecisionTreeClassifier(criterion="entropy",
random_state=30,
splitter="random",
max_depth=3) # 初始化分类器 clf=classifier
clf = clf.fit(x_train, y_train) # 训练分类器
score = clf.score(x_test, y_test) # 导出结果,返回accuracy(测试集上的表现)
# 也可以输出在训练集上的表现:score_train = clf.score(x_train, y_train)
print(score)
# 除了fit,score函数以外,apply以及predit也是重要的接口函数
# 其中,apply(x_test)函数返回每个测试样本所在叶子节点的索引,predict(x_test)返回每个测试样本的分类预测结果
"""
画决策树:
通过graphviz配合tree.export_graphviz()函数使用
函数的参数分别为clf训练好的模型,feature_nmes特征名称和class_names标签名称;
以及rounded(节点形状是否圆角)和filled(节点颜色,颜色越浅不纯度越高)参数设置为True或False
"""
dot_data = tree.export_graphviz(clf,
feature_names=wine.feature_names,
class_names=wine.target_names,
filled=True,
rounded=True)
graph = graphviz.Source(dot_data)
graph.view()
"""
输出特征的重要性:
feature_importances_属性返回特征的重要性(数值越大越重要),对于决策树来说有可能有些特征没有被用到;
list()函数使得其可以直接print输出
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表;
"""
# clf.feature_importances_
print(list(zip(wine.feature_names, clf.feature_importances_)))
pass
if __name__ == '__main__':
main()
1.3案例练习
- 在其他数据集中测试决策树的效果。
- 来自于课程菜菜课程的课件:菜菜TsaiTsai-哔哩哔哩。
- 导入需要的模块:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons, make_circles, make_classification
from sklearn.tree import DecisionTreeClassifier
-
生成三种数据集(月亮型数据、环形数据和二分型数据):
2.《数据挖掘——你必须知道的32个经典案例(第2版)》
- 书中第4章:经典的模式识别案例中-4.4决策树分析——“沸腾时刻”准确判断用户健康水平。
2.1 原文整理
- 决策树是一种典型的分类方法,是最著名的模式识别算法之一。
- 沸腾时刻APP利用决策树方法,将“用户体能测试数据”和“健身课程难易系数”挂钩。
其做法是,将体能测试数据离散化,然后输入决策树算法,从而对用户进行分类。
决策树能够针对用户体能数据的不同方面赋予不同的重要性。- 决策树的最终结果和决策树判断条件的顺序有关。
决策树模型引入“熵”和“信息增益”概念,是为了找到能够获得最佳结果的条件顺序。
备注:正例的概念含义指的是,使得结果为正的记录。- 一个决策树只能输出一个结果,需要输出多个结果时,构建多个决策树即可。
- 当前流行(该书出版时间是2018年10月)的决策树算法包括:ID3算法、C4.5算法、CART算法。
其中ID3算法善于构造低深度、高精度的决策树;C4.5能给处理连续型数据,在剪枝规则和派生规则方面有提高;CART算法是一种简洁的二叉树模型。- 决策树能够解决的问题主要有:分类问题、预测问题和回归问题。常用于预测贷款人是否按期归还银行贷款,移动电话用户是否会流失,房价的上涨曲线等。
- 决策树的优点:适合处理多类变量、对异常值不敏感、准确度高。
- 决策树的缺点:(1)作为典型的监督学习算法,决策树在训练时需要大量数据和计算空间。决策树需要反复计算变量的熵和信息增益,以此获得最佳决策变量排序,耗费时间。(2)作为贪心算法,追求局部最优可能会达不到全局最优。(3)剪枝减少了决策节点,同时也降低了准确性;同时剪枝本身也需要大量计算。(4)决策树不算很擅长连续型变量,连续型变量增多会使其犯错概率增大。