机器学习之决策树(Decision Tree)
文章目录
- 1. 决策树概念
- 2. 决策树实操
- 2.1 决策树多分类
- 2.2 决策树回归
- 2.3 决策树调参案例(Tatanic)
1. 决策树概念
决策树是根据特征进行树的构造,主要内容如下:
通过属性构造节点:
(1)二元属性
(2)三元属性
(3)序数属性:离散化或者分区间进行分支
根据指标选择属性:
信息熵:
Entropy=−∑i=0n−1p(i)log2p(i)Entropy=-\sum_{i=0}^{n-1}p(i)log_2p(i)Entropy=−i=0∑n−1p(i)log2p(i)
Gini值:
Gini=1−−∑i=0n−1[p(i)]2Gini=1--\sum_{i=0}^{n-1}[p(i)]^2Gini=1−−i=0∑n−1[p(i)]2
如,label=0label=0label=0的样本有5个,label=1label=1label=1的样本也有5个,则有p(0)=0.5p(0)=0.5p(0)=0.5, p(1)=0.5p(1)=0.5p(1)=0.5,对应的Gini值:Gini=1−∑i=01[p(i)]2=1−[0.52+0.52]=0.5Gini=1-\sum_{i=0}^{1}[p(i)]^2=1-[0.5^2+0.5^2]=0.5Gini=1−i=0∑1[p(i)]2=1−[0.52+0.52]=0.5
根据属性计算对应的Gini值或者Entropy来选择作为节点的属性,对应值越小的属性越好。分支后的Gini值或Entropy是通过子节点的值加权和得到的,通过属性选择后使得指标变小,上一层节点的对应指标值和下一层的差就称为信息增益(熵值下降或Gini系数降低,意味着纯度上升)。
进一步选取子节点的方案:
- ID3
信息增益=原始熵值−下降后的熵值信息增益=原始熵值-下降后的熵值信息增益=原始熵值−下降后的熵值选取使得信息增益最大的方案 - C4.5
信息增益率=信息增益/自身熵值信息增益率=信息增益/自身熵值信息增益率=信息增益/自身熵值 - Gini系数的增益
决策树的评价函数:C(T)=∑t∈leafNtH(t)C(T)=\sum_{t\in leaf}N_tH(t)C(T)=t∈leaf∑NtH(t)其中NtN_tNt为当前叶子节点样本个数,H(t)H(t)H(t)则表示当前叶子结点的熵值或Gini值。
决策树剪枝:决策树高度过高容易过拟合。
{预剪枝:在构建决策树的过程提前截止后剪枝:决策树构建好后再进行裁剪\begin{cases} 预剪枝:在构建决策树的过程提前截止 \\ 后剪枝:决策树构建好后再进行裁剪 \end{cases}{预剪枝:在构建决策树的过程提前截止后剪枝:决策树构建好后再进行裁剪
预剪枝方法:指定深度/指定最小样本数
后剪枝方法:
后剪枝损失函数:Cα(T)=C(T)+α∣Tleaf∣C_\alpha (T)=C(T)+\alpha |T_{leaf}|Cα(T)=C(T)+α∣Tleaf∣其中α\alphaα表示叶子节点个数对结果的影响程度,TleafT_{leaf}Tleaf的加入会使得叶子节点数越多,损失就越大。遍历节点,按后剪枝损失函数确定是否进行修剪。
2. 决策树实操
2.1 决策树多分类
import matplotlib.pyplot as plt
import pydotplus
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split# 导入红酒数据集
wine = load_wine()
# 划分成训练集和测试集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)# 实例化分类器
# random_state控制随机性
# 确定最优参数
test_scores = []
for i in range(10):clf = tree.DecisionTreeClassifier(criterion='entropy', random_state=30, splitter='random',max_depth=i+1)clf = clf.fit(Xtrain, Ytrain)score = clf.score(Xtest, Ytest) # 返回预测的准确度test_scores.append(score)
plt.plot(range(1, 11), test_scores, color='red', label='max_depth')
plt.legend()
plt.show()
print(score)
score1 = clf.score(Xtrain, Ytrain)
print(score1)
import graphvizfeature_name = ['酒精', '苹果酸', '灰', '灰的碱性', '镁', '总酚', '类黄酮', '非黄烷类酚类', '花青素','颜色强度', '色调', 'od280/od315稀释葡萄酒', '脯氨酸']# filled属性是填充颜色
# rounded属性是框的形状
dot_data = tree.export_graphviz(clf, feature_names=feature_name,class_names=['琴酒', '雪莉', '贝尔摩德'],filled=True,rounded=True)# 决策树的可视化
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_png('1.png')
print([*zip(feature_name, clf.feature_importances_)])
2.2 决策树回归
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor
import numpy as np
import matplotlib.pyplot as plt# boston = load_boston()
# # 构建回归树
# regressor = DecisionTreeRegressor(random_state=0)
# # 10次交叉验证
# cross_val_score(regressor, boston.data, boston.target, cv=10,
# scoring='neg_mean_squared_error')
# print(cross_val_score)
rng = np.random.RandomState(1)
# (80,1)二维
X = np.sort(5 * rng.rand(80, 1), axis=0)
# ravel()降维函数修改成一维数据
y = np.sin(X).ravel()
# plt.figure()
# plt.scatter(X, y, s=20, edgecolors='black', c='darkorange', label='data')
# plt.show()
# 在y的数据上加入噪声,每隔5个步长加入噪声
y[::5] += 3 * (0.5 - rng.rand(16))
# plt.figure()
# plt.scatter(X, y, s=20, edgecolors='black', c='darkorange', label='data')
# plt.show()
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)
# 生成0.0-5.0之间的步长为0.01的有序数列
# [:np.newaxis]用于扩展维度生成shape(n,1)
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
plt.figure()
plt.scatter(X, y, s=20, edgecolors='black', c='darkorange', label='data')
plt.plot(X_test, y_1, color='cornflowerblue', label='max_depth=2', linewidth=2)
plt.plot(X_test, y_2, color='yellowgreen', label='max_depth=5', linewidth=2)
plt.xlabel('data')
plt.ylabel('target')
plt.title('Decision Tree Regression')
plt.legend()
plt.show()
2.3 决策树调参案例(Tatanic)
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV, train_test_split, cross_val_scoredata = pd.read_csv(r'./titanic/train.csv')
# print(data.head()) # 展示前多少行
# print(data.info()) # 展示整个表# 数据预处理
# 筛选特征,删除缺失值过多的特征,以及和幸存与否无关的特征,对列进行操作(列)
data.drop(['Cabin', 'Name', 'Ticket'], inplace=True, axis=1)
# data = data.drop(['Cabin', 'Name', 'Ticket'], inplace=False, axis=1)# 处理缺失值(均值或中值)
data['Age'] = data['Age'].fillna(data['Age'].mean())# 对于缺失比较小的样本直接删掉(行)
data = data.dropna()# 查看Embarked属性有多少取值,转换非数值的特征,映射到数值取值(分类之间相互独立)
# S\C\Q三种,并转换成列表对应index:0\1\2
labels = data['Embarked'].unique().tolist()
data['Embarked'] = data['Embarked'].apply(lambda x: labels.index(x))# 性别转换成二分类,将bool值转换成0-1
# loc为标签索引,数字索引对应iloc
data.loc[:, 'Sex'] = (data['Sex'] == 'male').astype(int)# 将标签和特征分离
# 除了survive列之外的列
x = data.iloc[:, data.columns != 'Survived']
y = data.iloc[:, data.columns == 'Survived']Xtrian, Xtest, Ytrain, Ytest = train_test_split(x, y, test_size=0.3)
# 恢复索引,恢复成正序,避免索引发生混乱
for i in [Xtrian, Xtest, Ytrain, Ytest]:i.index = range(i.shape[0])# clf = DecisionTreeClassifier(random_state=25)
# clf = clf.fit(Xtrian, Ytrain)
# # score = clf.score(Xtest, Ytest)
# score = cross_val_score(clf, x, y, cv=10).mean()
# print(score)
# tr = []
# te = []
# for i in range(10):
# clf = DecisionTreeClassifier(random_state=25,
# max_depth=i+1,
# criterion='entropy')
# clf = clf.fit(Xtrian, Ytrain)
# score_tr = clf.score(Xtrian, Ytrain)
# score_te = cross_val_score(clf, x, y, cv=10).mean()
# tr.append(score_tr)
# te.append(score_te)
#
# print(max(te))
# plt.plot(range(1, 11), tr, color='red', label='train')
# plt.plot(range(1, 11), te, color='blue', label='test')
# plt.xticks(range(1, 11))
# plt.legend()
# plt.show()# 网格搜索调整多个参数,枚举技术,计算量很大
# 一串参数及其对应的取值范围的字典
import numpy as np
gini_thresholds = np.linspace(0, 0.5, 50)
# entrop[y_thresholds = np.linspace(0, 1, 50)
# 一般一两个参数组合,分别进行调试
# 过多的参数组合,会导致分数无法舍弃,得到的是平均的调参结果
parameters = {'criterion': ('gini', 'entropy'), 'splitter': ('best', 'random'), 'max_depth': [*range(1, 10)], 'min_samples_leaf': [*range(1, 50, 5)], 'min_impurity_decrease': [*np.linspace(0, 0.5, 20)]
}clf = DecisionTreeClassifier(random_state=25)
GS = GridSearchCV(clf, parameters, cv=10)
GS.fit(Xtrian, Ytrain)
GS.best_params_ # 返回输入的参数列表的最佳组合
GS.best_score_ # 网格搜索后的模型评判标准
机器学习之决策树(Decision Tree)相关推荐
- 机器学习(五)决策树(decision tree)
决策树(decision tree)(一)--构造决策树方法 决策树算法起源于E.B.Hunt等人于1966年发表的论文"experiments in Induction",但真正 ...
- 机器学习:决策树(Decision Tree)介绍
简介 决策树是一种常见的机器学习算法,它的实现方式类似于我们平时利用多个不同权重选择做决策的过程.以下介绍一个现实生活中的例子. 当父母给自己的女儿介绍对象时,女儿往往会根据对方的年龄.富贵.高矮.美 ...
- 机器学习笔记——决策树(Decision Tree)(1)
决策树 1.引入 1.1定义 决策树,顾名思义,就是帮我们做出决策的树.现实生活中我们往往会遇到各种各样的抉择,把我们的决策过程整理一下,就可以发现,该过程实际上就是一个树的模型.比如相亲的时候: ...
- 机器学习:决策树(Decision Tree)--ID3算法
决策树的主要算法 构建决策树的关键:按照什么样的次序来选择变量(属性/特征)作为分类依据. 根据不同的目标函数,建立决策树主要有以下三种算法 ID3(J.Ross Quinlan-1975) 核心:信 ...
- 机器学习算法实践:决策树 (Decision Tree)(转载)
前言 最近打算系统学习下机器学习的基础算法,避免眼高手低,决定把常用的机器学习基础算法都实现一遍以便加深印象.本文为这系列博客的第一篇,关于决策树(Decision Tree)的算法实现,文中我将对决 ...
- [机器学习笔记] (四)决策树 Decision Tree
(四)决策树 Decision Tree 基本概念 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性 ...
- 【机器学习实验二】决策树(Decision Tree)及其在图像识别任务上的应用
经典有监督学习算法:决策树(Decision Tree) --本篇博客的决策树算法以及实验仅针对分类问题 文章目录 经典有监督学习算法:决策树(Decision Tree) 1.算法简介 2.算法思想 ...
- Machine Learning | (7) Scikit-learn的分类器算法-决策树(Decision Tree)
Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...
- 决策树分类python代码_分类算法-决策树 Decision Tree
决策树(Decision Tree)是一个非参数的监督式学习方法,决策树又称为判定树,是运用于分类的一种树结构,其中的每个内部节点代表对某一属性的一次测试,每条边代表一个测试结果,叶节点代表某个类或类 ...
- Python数据挖掘入门与实践 第三章 用决策树预测获胜球队(一)pandas的数据预处理与决策树(Decision tree)
作为一个NBA球迷,看到这一章还是挺激动的. 不过内容有点难,研究了半天... 要是赌球的,用这章的预测+凯利公式,是不是就能提升赢钱概率了? 数据预处理 回归书本内容,既然要分析,首先需要有数据: ...
最新文章
- 小学五年级计算机备考方案,小学五年级备考方案(2)
- OpenCV极变换polar transforms的实例(附完整代码)
- 参数binlog_rows_query_log_events和binlog_row_image 与用 binlog恢复数据
- 在阿里云的Ubuntu ECS instance 使用Apt-get安装git
- 工作108:精准的v-for和if
- protobuf3 自定义option_ProtoBuf3语法指南(Protocol Buffers)_下
- 《Linux指令从入门到精通》——4.4 Linux下的文本编辑指令
- Win7 安装.Net 4.7.2 失败
- 正则表达式数字、字母、中文、符号
- matlab插图放大模糊,PPT中怎样简单处理放大后失真的图片
- Apache Spark源码阅读环境搭建
- ipad无法更新最新版本ipadOS 16、不再连接到互联网解决方法
- 基于服务树的动态资源管理方法
- 简单方法保持屏幕常亮
- Fluent学习笔记
- 前端权限设计实现——按钮级
- 【对讲机的那点事】如何利用写频软件预置海能达数字对讲机的加密功能
- 2022年的云革命:云转移、云模型和云未来
- 二分与贪心-誊写书籍(算法基础 第9周)
- 如何有趣地「做人」?Cocos 即将推出虚拟角色编辑器