Press "Enter" to skip to content

机器学习算法(六):基于决策树的分类预测

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

声明:本次撰写以Datawhale团队提供的学习材料以自学为主,代码为Datawhale团队提供,利用阿里云天池实验室与编辑器pycharm完成测试。

 

学习目标

了解 的理论知识
掌握 决策树 的 sklearn 函数调用使用并将其运用到企鹅数据集预测

决策树介绍与应用

 

决策树介绍

 

决策树(decision tree)是一种基本的分类与回归方法。决策树的主要优点:

 

 

    1. 具有很好的解释性,模型可以生成可以理解的规则。

 

    1. 可以发现特征的重要程度。

 

    1. 模型的计算复杂度较低。

 

 

决策树的主要缺点:

 

 

    1. 模型容易过拟合,需要采用减枝技术处理。

 

    1. 不能很好利用连续型特征。

 

    1. 预测能力有限,无法达到其他强监督模型效果。

 

    1. 方差较高,数据分布的轻微改变很容易造成树结构完全不同。

 

 

算例:

 

此算例为书中摘抄过来,主要是为了计算一遍,熟悉一下算法的计算流程。

 

 

为了得到最优的决策结果。我们必须向决策树中引入熵和信息增益的概念。

 

 

 

决策树的应用

 

由于决策树模型中自变量与因变量的非线性关系以及决策树简单的计算方法,使得它成为集成学习中最为广泛使用的基模型。梯度提升树(GBDT),XGBoost以及LightGBM等先进的集成模型都采用了决策树作为基模型,在广告计算、CTR预估、金融风控等领域大放异彩,成为当今与神经网络相提并论的复杂模型,更是数据挖掘比赛中的常客。在新的研究中,南京大学周志华老师提出一种多粒度级联森林模型,创造了一种全新的基于决策树的深度集成方法,为我们提供了决策树发展的另一种可能。

 

同时决策树在一些需要明确可解释甚至提取分类规则的场景中被广泛应用,而其他机器学习模型在这一点很难做到。例如在医疗辅助系统中,为了方便专业人员发现错误,常常将决策树算法用于辅助病症检测。例如在一个预测哮喘患者的模型中,医生发现测试的许多高级模型的效果非常差。所以他们在数据上运行了一个决策树的模型,发现算法认为剧烈咳嗽的病人患哮喘的风险很小。但医生非常清楚剧烈咳嗽一般都会被立刻检查治疗,这意味着患有剧烈咳嗽的哮喘病人都会马上得到收治。用于建模的数据认为这类病人风险很小,是因为所有这类病人都得到了及时治疗,所以极少有人在此之后患病或死亡。

 

代码流程

 

Part1 Demo实践

Step1:库函数导入
Step2:模型训练
Step3:数据和模型可视化
Step4:模型预测

Part2 数据分析

Step1:库函数导入
Step2:数据读取/载入
Step3:数据信息简单查看
Step4:可视化描述

Part3 建模预测

Step1:利用 决策树模型 在二分类上 进行训练和预测
Step2:利用 决策树模型 在三分类(多分类)上 进行训练和预测

决策

 

程序

 

Step1: 库函数导入

 

##  基础函数库
import numpy as np 
## 导入画图库
import matplotlib.pyplot as plt
import seaborn as sns
## 导入决策树模型函数
from sklearn.tree import DecisionTreeClassifier
from 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可视化库,关于graphviz安装的一些问题,请参见 CSDN连接

 

## 可视化构造的数据样本点
plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
plt.show()
###### 本段代码实际效果为本地生成PDF可视化文档,在体验过程中可以不运行,可能无法正常展示结果;
###### 代码生成的可视化结果会截图展示实际效果
import graphviz
dot_data = tree.export_graphviz(tree_clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("pengunis") #pdf名称
###### '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]

 

预测结果:

 

The New point 1 predict class:

 

[1]

 

The New point 2 predict class:

 

[0]

 

##### 数据分析

 

在实践的最开始,我们首先需要导入一些基础的函数库包括:numpy (Python进行科学计算的基础软件包),pandas(pandas是一种快速,强大,灵活且易于使用的开源数据分析和处理工具),matplotlib和seaborn绘图。

 

##  基础函数库
import numpy as np 
import pandas as pd
## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns

 

本次我们选择企鹅数据(palmerpenguins)进行方法的尝试训练,该数据集一共包含8个变量,其中7个特征变量,1个目标分类变量。共有150个样本,目标变量为 企鹅的类别 其都属于企鹅类的三个亚属,分别是(Adélie, Chinstrap and Gentoo)。包含的三种种企鹅的七个特征,分别是所在岛屿,嘴巴长度,嘴巴深度,脚蹼长度,身体体积,性别以及年龄。

 

 

Step2:数据读取/载入

 

## 我们利用Pandas自带的read_csv函数读取并转化为DataFrame格式
data = pd.read_csv('datalab/531811/Datawhale/penguins_raw.csv')
## 为了方便我们仅选取四个简单的特征,有兴趣的同学可以研究下其他特征的含义以及使用方法
data = data[['Species','Culmen Length (mm)','Culmen Depth (mm)',
            'Flipper Length (mm)','Body Mass (g)']]

 

Step3:数据信息简单查看

 

## 利用.info()查看数据的整体信息
data.info()

 

## 进行简单的数据查看,我们可以利用 .head() 头部.tail()尾部
data.head()

 

 

这里我们发现数据集中存在NaN,一般的我们认为NaN在数据集中代表了缺失值,可能是数据采集或处理时产生的一种错误。这里我们采用-1将缺失值进行填补,还有其他例如“中位数填补、平均数填补”的缺失值处理方法有兴趣的同学也可以尝试。

 

 

data = data.fillna(-1)
data.tail()
## 其对应的类别标签为'Adelie Penguin', 'Gentoo penguin', 'Chinstrap penguin'三种不同企鹅的类别。
data['Species'].unique()
## array(['Adelie Penguin (Pygoscelis adeliae)',
##       'Gentoo penguin (Pygoscelis papua)',
##       'Chinstrap penguin (Pygoscelis antarctica)'], dtype=object)

 

利用value_counts函数查看每个类别数量

 

pd.Series(data[‘Species’]).value_counts()

 

对于特征进行一些统计描述

 

data.describe()

 

![image.png](/img/bVbLGZl)

 

特征与标签组合的散点可视化

 

sns.pairplot(data=data, diag_kind=’hist’, hue= ‘Species’)

 

plt.show()

 

def trans(x):

 

if x == data['Species'].unique()[0]:
    return 0
if x == data['Species'].unique()[1]:
    return 1
if x == data['Species'].unique()[2]:
    return 2

 

data[‘Species’] = data[‘Species’].apply(trans)

 

for col in data.columns:

 

if col != 'Species':
    sns.boxplot(x='Species', y=col, saturation=0.5, palette='pastel', data=data)
    plt.title(col)
    plt.show()

 

利用箱型图我们也可以得到不同类别在不同特征上的分布差异情况

 

选取其前三个特征绘制三维散点图

 

from mpl_toolkits.mplot3d import Axes3D

 

fig = plt.figure(figsize=(10,8))

 

ax = fig.add_subplot(111, projection=’3d’)

 

data_class0 = data[data[‘Species’]==0].values

 

data_class1 = data[data[‘Species’]==1].values

 

data_class2 = data[data[‘Species’]==2].values

 

‘setosa'(0), ‘versicolor'(1), ‘virginica'(2)

 

ax.scatter(data_class0[:,0], data_class0[:,1], data_class0[:,2],label=data[‘Species’].unique()[0])

 

ax.scatter(data_class1[:,0], data_class1[:,1], data_class1[:,2],label=data[‘Species’].unique()[1])

 

ax.scatter(data_class2[:,0], data_class2[:,1], data_class2[:,2],label=data[‘Species’].unique()[2])

 

plt.legend()

 

plt.show()

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注