一、决策树算法原理

1、定义

决策树算法定义:决策树算法是一种非参数的决策算法,它根据数据的不同特征进行多层次的分类和判断,最终决策出所需要预测的结果。它既可以解决分类算法,也可以解决回归问题,具有很好的解释能力。

2、原理

(1)决策树原理图
在这里插入图片描述(2)对于决策树的构建方法具有多种出发点,它具有多种构建方式,如何构建决策树的出发点主要在于决策树每一个决策点上需要在哪些维度上进行划分以及在这些维度的哪些阈值节点做划分等细节问题。
(3)信息熵entropy是决策树构建过程中最为常见的一种构建方式,熵在信息论中的含义是随机变量的不确定度,熵越大,不确定性越大,越不确定,熵越小,表示不确定度越小,越确定。
熵在信息论中代表随机变量不确定性的度量。熵越大,代表数据的不确定性越高;反之,熵越小,代表数据的不确定性越低。
信息熵的划分方式总体原则是不断地使得整体的决策系统的熵值越来越小,使得系统越来越确定的方向发展。
(4)基尼系数gini是决策树划分的另外一种方式,它和信息熵的原理是类似的,随着基尼系数的增大,整体的随机性在不断地增大。
(5)对于基尼系数和信息熵的决策树划分方式,其效果一般情况下都是大致相同的,只是信息熵的计算方式比起基尼系数要慢一些,sklearn中默认选用的是基尼系数。因此,对于决策树的决策方式信息熵和基尼系数这个超参数对于模型的好坏并没有太大的影响。 一般情况下,entropy是欠拟合的情况下才使用。

二、决策树算法小案例

1、数据挖掘流程

数据挖掘流程:数据读取-探索性数据分析-info-数据清洗-特征筛选-数据预处理-模型构建-模型评估-模型部署(生成环境)

2、根据流程实现决策树算法

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier # 分类决策树
from sklearn.model_selection import train_test_split # 训练集和测试集的划分
from sklearn.model_selection import GridSearchCV   # 网格搜索
from sklearn.model_selection import cross_val_score  # 交叉验证模块
import matplotlib.pyplot as plt

(1)读取数据

data=pd.read_csv("train.csv")
data.head()  #Survived属性表示的是最终标签,相当于输出的y

在这里插入图片描述Embarked只存在三个值

(2)探索性数据分析

data.info()

在这里插入图片描述

(3)数据清洗

通过查看data数据,发现age和Cabin存在缺失值,其中age用均值来填充,cabin因缺失较多,可直接删除。通过观测判断来说和预测的y没有关系的列(Name,Ticket)也删除。

data.drop("cabin",inplace=True,axis=1) #删除字段cabin
data.drop("name",inplace=True,axis=1) 
data.drop("Ticket",inplace=True,axis=1) #删除字段Ticket
data["Age"]=data["Age"].fillna(data["Age"].mean()) #均值填充
data.info()

在这里插入图片描述字段Embarked字段仅很少部分的缺失值,可直接dropna删除掉只要有缺失值的行,全部字段剩下889条数据。
在这里插入图片描述
Embark中存在[“S”, “C”, “Q”]3种结果:现将结果转成列表,再从列表中取出对应的索引(数字)

labels=data["Embarked"].unique().tolist()  #将Embarked的不同值的放在一个列表中
data["Embarked"]=data["Embarked"].apply(lambda x:labels.index(x)) #将Embarked属性中的["S","Q","C"]转化成0,1,2

对分类变量Sex也采样相似办法进行转化

data["Sex"]=(data["Sex"]=="male").astype("int")  ## 先获取bool值,再将bool值转成0-1

看标签是否平衡

data.Survived.value_counts() #看标签是否平衡

(4)特征筛选

根据某个属性将数据分成特征数据和标签数据(最后的预测值或者输出值)

x = data.iloc[:, data.columns != "Survived"]
y = data.iloc[:, data.columns == "Survived"]

(5)数据预处理

第一步:划分训练集和测试集

Xtrain, Xtest, ytrain, ytest = train_test_split(x, y, test_size=0.3)

第二步:划分完训练集后会存在索引混乱的情况,需要重新对索引进行排序

for i in [Xtrain, Xtest, ytrain, ytest]:
    i.index = range(i.shape[0]) # shape属性的第一个元素就是索引的总个数
Xtrain  #索引恢复正常

(6)建模

clf = DecisionTreeClassifier(random_state=25)
clf = clf.fit(Xtrain, ytrain)
score = clf.score(Xtest, ytest)
score

在这里插入图片描述
建模得分0.73,不算太好,也还不错。

(7)模型评估

此案例模型评估方法:交叉验证

clf = DecisionTreeClassifier(random_state=25)
score = cross_val_score(clf, x, y, cv=10).mean()  # 10次交叉验证求均值,结果降低
score  

在这里插入图片描述
交叉验证结果降低,

tr = []  # 两个空列表用来存储训练得到的两个分数
te = []
for i in range(10):
    clf = DecisionTreeClassifier(random_state=25   # 实例化模型,设定决策树的最大深度
                                ,max_depth=i+1
                                ,criterion="entropy" )
    clf = clf.fit(Xtrain, ytrain)  # fit训练过程
    score_tr = clf.score(Xtrain, ytrain)  # 训练集score
    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")  # x,y,颜色,label
plt.plot(range(1,11), te, color="blue", label="test")
plt.xticks(range(1,11)) # 横坐标范围固定在1-10
plt.legend()  # 图例
plt.show()

在这里插入图片描述
未完待续,可点击关注哦。

更多推荐