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

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

  • 决策树的介绍和应用
    • 简介
      • 决策树构建的伪代码
    • 特征划分选择
      • 信息增益
      • 信息增益率
      • 基尼系数
    • 应用场景
    • 优缺点
  • 基于企鹅数据集的决策树实战
    • Step1:函数库导入
    • Step2:数据读取/载入
    • Step3:数据信息简单查看
    • Step4:可视化描述
    • Step5:利用 决策树模型 在二分类上 进行训练和预测
    • Step6:利用 决策树模型 在三分类(多分类)上 进行训练和预测

决策树的介绍和应用

简介

决策树是一种基本的分类与回归方法。它可以认为是 if-then 规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。

决策树是一种自上而下,对样本数据进行树形分类的过程,由节点和有向边组成。节点分为内部节点和叶节点。根节点包含样本全集,每个内部节点表示一个特征或属性,叶节点表示类别,边代表划分的条件。从根节点开始,所有样本聚在一起,经过根节点的划分,样本被分到不同的子节点中,再根据子节点的特征进一步划分,直至所有样本都被归到某个类别。

构建决策树就是一个递归的选择内部节点,计算划分条件的边,最后到达叶子节点的过程。

决策树构建的伪代码

机器学习算法(二):基于决策树的分类预测_第1张图片

特征划分选择

决策树的关键在于所有属性中选择最优划分属性 ∗ ,一般我们希望决策树每次划分节点中包含的样本尽量属于同一类别,也就是节点的“纯度”更高。

信息增益

机器学习算法(二):基于决策树的分类预测_第2张图片
著名的ID3决策树学习算法就是以信息增益为准则来选择划分属性。

信息增益率

实际上,信息增益准则第可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,著名的C4.5算法不直接使用信息增益,而是使用“增益率”来选择最优划分属性。
机器学习算法(二):基于决策树的分类预测_第3张图片
需注意的是,信息增益率准则对可取值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式的方法选择最优划分属性:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的.。

基尼系数

机器学习算法(二):基于决策树的分类预测_第4张图片

应用场景

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

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

优缺点

主要优点:

  1. 具有很好的解释性,模型可以生成可以理解的规则。
  2. 可以发现特征的重要程度。
  3. 模型的计算复杂度较低。

主要缺点:

  1. 模型容易过拟合,需要采用减枝技术处理。
  2. 不能很好利用连续型特征。
  3. 预测能力有限,无法达到其他强监督模型效果。
  4. 方差较高,数据分布的轻微改变很容易造成树结构完全不同。

基于企鹅数据集的决策树实战

Step1:函数库导入

## 基础函数库
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)。包含的三种种企鹅的七个特征,分别是所在岛屿,嘴巴长度,嘴巴深度,脚蹼长度,身体体积,性别以及年龄。
机器学习算法(二):基于决策树的分类预测_第5张图片

Step2:数据读取/载入

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()


RangeIndex: 344 entries, 0 to 343
Data columns (total 5 columns):
Species 344 non-null object
Culmen Length (mm) 342 non-null float64
Culmen Depth (mm) 342 non-null float64
Flipper Length (mm) 342 non-null float64
Body Mass (g) 342 non-null float64
dtypes: float64(4), object(1)
memory usage: 13.6+ KB

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

机器学习算法(二):基于决策树的分类预测_第6张图片
这里我们发现数据集中存在NaN,一般的我们认为NaN在数据集中代表了缺失值,可能是数据采集或处理时产生的一种错误。这里我们采用-1将缺失值进行填补,还有其他例如“中位数填补、平均数填补”的缺失值处理方法有兴趣的同学也可以尝试。

data = data.fillna(-1)

data.tail()

机器学习算法(二):基于决策树的分类预测_第7张图片

## 利用value_counts函数查看每个类别数量
pd.Series(data['Species']).value_counts()

Adelie Penguin (Pygoscelis adeliae) 152
Gentoo penguin (Pygoscelis papua) 124
Chinstrap penguin (Pygoscelis antarctica) 68
Name: Species, dtype: int64

Step4:可视化描述

## 特征与标签组合的散点可视化
sns.pairplot(data=data, diag_kind='hist', hue= 'Species')
plt.show()

机器学习算法(二):基于决策树的分类预测_第8张图片
从上图可以发现,在2D情况下不同的特征组合对于不同类别的企鹅的散点分布,以及大概的区分能力。Culmen Lenth与其他特征的组合散点的重合较少,所以对于数据集的划分能力最好。

'''为了方便我们将标签转化为数字
       'Adelie Penguin (Pygoscelis adeliae)'        ------0
       'Gentoo penguin (Pygoscelis papua)'          ------1
       'Chinstrap penguin (Pygoscelis antarctica)   ------2 '''

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()

机器学习算法(二):基于决策树的分类预测_第9张图片
机器学习算法(二):基于决策树的分类预测_第10张图片
机器学习算法(二):基于决策树的分类预测_第11张图片
机器学习算法(二):基于决策树的分类预测_第12张图片
利用箱型图我们也可以得到不同类别在不同特征上的分布差异情况。

# 选取其前三个特征绘制三维散点图
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()

机器学习算法(二):基于决策树的分类预测_第13张图片

Step5:利用 决策树模型 在二分类上 进行训练和预测

## 为了正确评估模型性能,将数据划分为训练集和测试集,并在训练集上训练模型,在测试集上验证模型性能。
from sklearn.model_selection import train_test_split

## 选择其类别为0和1的样本 (不包括类别为2的样本)
data_target_part = data[data['Species'].isin([0,1])][['Species']]
data_features_part = data[data['Species'].isin([0,1])][['Culmen Length (mm)','Culmen Depth (mm)',
            'Flipper Length (mm)','Body Mass (g)']]

## 测试集大小为20%, 80%/20%分
x_train, x_test, y_train, y_test = train_test_split(data_features_part, data_target_part, test_size = 0.2, random_state = 2020)
## 从sklearn中导入决策树模型
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
## 定义 决策树模型 
clf = DecisionTreeClassifier(criterion='entropy')
# 在训练集上训练决策树模型
clf.fit(x_train, y_train)
## 可视化
import graphviz
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("penguins")

机器学习算法(二):基于决策树的分类预测_第14张图片

## 在训练集和测试集上分别利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)

from sklearn import metrics
## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('The accuracy of the train is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the test is:',metrics.accuracy_score(y_test,test_predict))

## 查看混淆矩阵 (预测值和真实值的各类情况统计矩阵)
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)

# 利用热力图对于结果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()

The accuracy of the train is: 0.9954545454545455
The accuracy of the test is: 1.0
The confusion matrix result:
[[31 0]
[ 0 25]]
机器学习算法(二):基于决策树的分类预测_第15张图片
我们可以发现其准确度为1,代表所有的样本都预测正确了。

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

## 测试集大小为20%, 80%/20%分
x_train, x_test, y_train, y_test = train_test_split(data[['Culmen Length (mm)','Culmen Depth (mm)',
            'Flipper Length (mm)','Body Mass (g)']], data[['Species']], test_size = 0.2, random_state = 2020)
## 定义 决策树模型 
clf = DecisionTreeClassifier()
# 在训练集上训练决策树模型
clf.fit(x_train, y_train)
## 在训练集和测试集上分别利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)

## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('The accuracy of the train is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the test is:',metrics.accuracy_score(y_test,test_predict))

The accuracy of the train is: 0.9963636363636363
The accuracy of the test is: 0.9565217391304348

## 查看混淆矩阵
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)

# 利用热力图对于结果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()

The confusion matrix result:
[[30 1 0]
[ 0 23 0]
[ 2 0 13]]
机器学习算法(二):基于决策树的分类预测_第16张图片

你可能感兴趣的:(机器学习算法,决策树,机器学习,python)