基于企鹅数据集的决策树分类预测
1 逻决策树的介绍和应用
1.1 决策树的介绍
决策树是一种常见的分类模型,在金融风控、医疗辅助诊断等诸多行业具有较为广泛的应用。决策树的核心思想是基于树结构对数据进行划分,这种思想是人类处理问题时的本能方法。例如在婚恋市场中,女方通常会先询问男方是否有房产,如果有房产再了解是否有车产,如果有车产再看是否有稳定工作……最后得出是否要深入了解的判断。
主要应用:
由于决策树模型中自变量与因变量的非线性关系以及决策树简单的计算方法,使得它成为集成学习中最为广泛使用的基模型。梯度提升树(GBDT),XGBoost以及LightGBM等先进的集成模型都采用了决策树作为基模型,在广告计算、CTR预估、金融风控等领域大放异彩,成为当今与神经网络相提并论的复杂模型,更是数据挖掘比赛中的常客。在新的研究中,南京大学周志华教授提出一种多粒度级联森林模型,创造了一种全新的基于决策树的深度集成方法,为我们提供了决策树发展的另一种可能。
同时决策树在一些明确需要可解释性或者提取分类规则的场景中被广泛应用,而其他机器学习模型在这一点很难做到。例如在医疗辅助系统中,为了方便专业人员发现错误,常常将决策树算法用于辅助病症检测。例如在一个预测哮喘患者的模型中,医生发现测试的许多高级模型的效果非常差。在他们运行了一个决策树模型后发现,算法认为剧烈咳嗽的病人患哮喘的风险很小。但医生非常清楚剧烈咳嗽一般都会被立刻检查治疗,这意味着患有剧烈咳嗽的哮喘病人都会马上得到收治。用于建模的数据认为这类病人风险很小,是因为所有这类病人都得到了及时治疗,所以极少有人在此之后患病或死亡。
1.2 相关流程
了解 决策树 的理论知识
掌握 决策树 的 sklearn 函数调用并将其运用在企鹅数据集的预测中
Part1 Demo实践
Step1:库函数导入
Step2:模型训练
Step3:数据和模型可视化
Step4:模型预测
Part2 基于企鹅(penguins)数据集的决策树分类实践
Step1:库函数导入
Step2:数据读取/载入
Step3:数据信息简单查看
Step4:可视化描述
Step5:利用 决策树模型 在二分类上 进行训练和预测
Step6:利用 决策树模型 在三分类(多分类)上 进行训练和预测
3 算法实战
3.1Demo实践
Step1: 库函数导入
## 基础函数库import numpy as np
## 导入画图库import matplotlib.pyplot as pltimport seaborn as sns## 导入决策树模型函数from sklearn.tree import DecisionTreeClassifierfrom sklearn import tree
Step2: 训练模型
##Demo演示LogisticRegression分类## 构造数据集x_fearures = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])
y_label = np.array([0, 1, 0, 1, 0, 1])## 调用决策树回归模型tree_clf = DecisionTreeClassifier()## 调用决策树模型拟合构造的数据集tree_clf = tree_clf.fit(x_fearures, y_label)
Step3: 数据和模型可视化(需要用到graphviz可视化库)
## 可视化构造的数据样本点plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
plt.show()

## 可视化决策树import graphviz
dot_data = tree.export_graphviz(tree_clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("pengunis")
'pengunis.pdf'
Step4:模型预测
## 创建新样本x_fearures_new1 = np.array([[0, -1]])
x_fearures_new2 = np.array([[2, 1]])## 在训练集和测试集上分布利用训练好的模型进行预测y_label_new1_predict = tree_clf.predict(x_fearures_new1)
y_label_new2_predict = tree_clf.predict(x_fearures_new2)print('The New point 1 predict class:\n',y_label_new1_predict)print('The New point 2 predict class:\n',y_label_new2_predict)
The New point 1 predict class: [1]The New point 2 predict class: [0]
3.2 基于penguins_raw数据集的决策树实战
在实践的最开始,我们首先需要导入一些基础的函数库包括:numpy (Python进行科学计算的基础软件包),pandas(pandas是一种快速,强大,灵活且易于使用的开源数据分析和处理工具),matplotlib和seaborn绘图。
#下载需要用到的数据集!wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/6tree/penguins_raw.csv
--2023-03-22 16:21:32-- https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/6tree/penguins_raw.csv
正在解析主机 tianchi-media.oss-cn-beijing.aliyuncs.com (tianchi-media.oss-cn-beijing.aliyuncs.com)... 49.7.22.39
正在连接 tianchi-media.oss-cn-beijing.aliyuncs.com (tianchi-media.oss-cn-beijing.aliyuncs.com)|49.7.22.39|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 53098 (52K) [text/csv]
正在保存至: “penguins_raw.csv”
penguins_raw.csv 100%[===================>] 51.85K --.-KB/s in 0.04s
2023-03-22 16:21:33 (1.23 MB/s) - 已保存 “penguins_raw.csv” [53098/53098])
Step1:函数库导入
## 基础函数库import numpy as np
import pandas as pd## 绘图函数库import matplotlib.pyplot as pltimport seaborn as sns
本次我们选择企鹅数据(palmerpenguins)进行方法的尝试训练,该数据集一共包含8个变量,其中7个特征变量,1个目标分类变量。共有150个样本,目标变量为 企鹅的类别 其都属于企鹅类的三个亚属,分别是(Adélie, Chinstrap and Gentoo)。包含的三种种企鹅的七个特征,分别是所在岛屿,嘴巴长度,嘴巴深度,脚蹼长度,身体体积,性别以及年龄。
变量描述speciesa factor denoting penguin speciesislanda factor denoting island in Palmer Archipelago, Antarcticabill_length_mma number denoting bill lengthbill_depth_mma number denoting bill depthflipper_length_mman integer denoting flipper lengthbody_mass_gan integer denoting body masssexa factor denoting penguin sexyearan integer denoting the study year
Step2:数据读取/载入
## 我们利用Pandas自带的read_csv函数读取并转化为DataFrame格式data = pd.read_csv('./penguins_raw.csv')
## 为了方便我们仅选取四个简单的特征,有兴趣的同学可以研究下其他特征的含义以及使用方法data = data[['Species','Culmen Length (mm)','Culmen Depth (mm)', 'Flipper Length (mm)','Body Mass (g)']]
Step3:数据信息简单查看
## 利用.info()查看数据的整体信息data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 344 entries, 0 to 343Data columns (total 5 columns):
# Column Non-Null Count Dtype --- ------ -------------- -----
0 Species 344 non-null object
1 Culmen Length (mm) 342 non-null float64 2 Culmen Depth (mm) 342 non-null float64 3 Flipper Length (mm) 342 non-null float64 4 Body Mass (g) 342 non-null float64
dtypes: float64(4), object(1)
memory usage: 13.6+ KB
## 进行简单的数据查看,我们可以利用 .head() 头部.tail()尾部data.head()
SpeciesCulmen Length (mm)Culmen Depth (mm)Flipper Length (mm)Body Mass (g)0Adelie Penguin (Pygoscelis adeliae)39.118.7181.03750.01Adelie Penguin (Pygoscelis adeliae)39.517.4186.03800.02Adelie Penguin (Pygoscelis adeliae)40.318.0195.03250.03Adelie Penguin (Pygoscelis adeliae)NaNNaNNaNNaN4Adelie Penguin (Pygoscelis adeliae)36.719.3193.03450.0
这里我们发现数据集中存在NaN,一般的我们认为NaN在数据集中代表了缺失值,可能是数据采集或处理时产生的一种错误。这里我们采用-1将缺失值进行填补,还有其他例如“中位数填补、平均数填补”的缺失值处理方法有兴趣的同学也可以尝试。