【活动打卡】【Datawhale】第16期 机器学习算法梳理(AI入门体验) Task02:基于决策树的分类预测
1.决策树的介绍和应用
1.1 决策树的介绍
决策树是一种常见的分类模型,在金融风控、医疗辅助诊断等诸多行业具有较为广泛的应用。决策树的核心思想是基于树结构对数据进行划分,这种思想是人类处理问题时的本能方法。例如在婚恋市场中,女方通常会先询问男方是否有房产,如果有房产再了解是否有车产,如果有车产再看是否有稳定工作……最后得出是否要深入了解的判断。
决策树的主要优点:
- 具有很好的解释性,模型可以生成可以理解的规则。
- 可以发现特征的重要程度。
- 模型的计算复杂度较低。
决策树的主要缺点:
- 模型容易过拟合,需要采用减枝技术处理。
- 不能很好利用连续型特征。
- 预测能力有限,无法达到其他强监督模型效果。
- 方差较高,数据分布的轻微改变很容易造成树结构完全不同。
1.2 决策树的应用
由于决策树模型中自变量与因变量的非线性关系以及决策树简单的计算方法,使得它成为集成学习中最为广泛使用的基模型。梯度提升树(GBDT),XGBoost以及LightGBM等先进的集成模型都采用了决策树作为基模型,在广告计算、CTR预估、金融风控等领域大放异彩,成为当今与神经网络相提并论的复杂模型,更是数据挖掘比赛中的常客。在新的研究中,南京大学周志华教授提出一种多粒度级联森林模型,创造了一种全新的基于决策树的深度集成方法,为我们提供了决策树发展的另一种可能。
同时决策树在一些明确需要可解释性或者提取分类规则的场景中被广泛应用,而其他机器学习模型在这一点很难做到。例如在医疗辅助系统中,为了方便专业人员发现错误,常常将决策树算法用于辅助病症检测。例如在一个预测哮喘患者的模型中,医生发现测试的许多高级模型的效果非常差。在他们运行了一个决策树模型后发现,算法认为剧烈咳嗽的病人患哮喘的风险很小。但医生非常清楚剧烈咳嗽一般都会被立刻检查治疗,这意味着患有剧烈咳嗽的哮喘病人都会马上得到收治。用于建模的数据认为这类病人风险很小,是因为所有这类病人都得到了及时治疗,所以极少有人在此之后患病或死亡。
2.Demo实践
scikit-learn 是基于 Python 语言的机器学习工具,决策树在 sklearn 中是用 sklearn.tree 中的 DecisionTreeClassifier 实现。
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演示DecisionTreeClassifier分类## 构造数据集
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()
## 本段代码实际效果为本地生成PDF可视化文档,在体验过程中可以不运行,可能无法正常展示结果;
## 代码生成的可视化结果会截图展示实际效果
!pip install graphviz
import graphviz
dot_data = tree.export_graphviz(tree_clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("pengunis")
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.基于企鹅数据集的决策树实战
Step1:函数库导入
在实践的最开始,我们首先需要导入一些基础的函数库包括:numpy,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)。包含的三种种企鹅的七个特征,分别是所在岛屿,嘴巴长度,嘴巴深度,脚蹼长度,身体体积,性别以及年龄。
变量 | 描述 |
---|---|
species | a factor denoting penguin species |
island | a factor denoting island in Palmer Archipelago, Antarctica |
bill_length_mm | a number denoting bill length |
bill_depth_mm | a number denoting bill depth |
flipper_length_mm | an integer denoting flipper length |
body_mass_g | an integer denoting body mass |
sex | a factor denoting penguin sex |
year | an 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 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
## 数据集中存在NaN,一般的我们认为NaN在数据集中代表了缺失值,可能是数据采集或处理时产生的一种错误。
data = data.fillna(-1)
## 其对应的类别标签为'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()
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()
从上图可以发现,在2D情况下不同的特征组合对于不同类别的企鹅的散点分布,以及大概的区分能力。
'''为了方便我们将标签转化为数字'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 0if x == data['Species'].unique()[1]:return 1if x == data['Species'].unique()[2]:return 2data['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 Axes3Dfig = 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()
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)
## DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,
## max_features=None, max_leaf_nodes=None,
## min_impurity_decrease=0.0, min_impurity_split=None,
## min_samples_leaf=1, min_samples_split=2,
## min_weight_fraction_leaf=0.0, presort=False, random_state=None,
## splitter='best')## 可视化
## 本段代码实际效果为本地生成PDF可视化文档,在体验过程中可以不运行,可能无法正常展示结果;
## 代码生成的可视化结果会截图展示实际效果
import graphviz
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("penguins")
## 'penguins.pdf'
## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
from sklearn import metrics
## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression 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 Logistic Regression is: 0.9954545454545455
The accuracy of the Logistic Regression is: 1.0
The confusion matrix result:
[[31 0]
[ 0 25]]
我们可以发现其准确度为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)
## DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
## max_features=None, max_leaf_nodes=None,
## min_impurity_decrease=0.0, min_impurity_split=None,
## min_samples_leaf=1, min_samples_split=2,
## min_weight_fraction_leaf=0.0, presort=False, random_state=None,
## splitter='best')## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
## 由于逻辑回归模型是概率预测模型(前文介绍的 p = p(y=1|x,\theta)),所有我们可以利用 predict_proba 函数预测其概率
train_predict_proba = clf.predict_proba(x_train)
test_predict_proba = clf.predict_proba(x_test)
print('The test predict Probability of each class:\n',test_predict_proba)
## 其中第一列代表预测为0类的概率,第二列代表预测为1类的概率,第三列代表预测为2类的概率。
## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))
The test predict Probability of each class:
[[0. 0. 1.]
[0. 1. 0.]
[0. 1. 0.]
[1. 0. 0.]
…………
[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]
[1. 0. 0.]]
The accuracy of the Logistic Regression is: 0.996363636364The accuracy of the Logistic Regression is: 0.971014492754
## 查看混淆矩阵
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]]
4.问题解答
- Q:决策树ID3,C4. 5,CART的区别
- A:ID3,C4.5,CART都是决策树的算法,区别如下:
- ID3用于处理标称型数据集。在节点上选取能对该节点处的训练数据进行最优划分的属性。最后划分的标准是信息增益。ID3的特点是:(1)容易造成过度拟合。(2) 使用标称型数据,但是很难处理连续型数据。
- C4.5是对ID3的改进,其基本过程与ID3类似,改进的地方在于:(1)既能处理标称型数据,又能连续型数据。为了处理连续型数据,该算法在相应的节点使用一个属性的阈值,利用阈值将样本划分成两部分。(2)能处理缺失了一些属性的数据。该算法允许属性值缺失时被标记为?,属性值缺失的样本在计算熵增益时被忽略。(3)构造完成后可以剪枝。合并相邻的无法产生大量信息增益的叶节点,消除过渡匹配问题。
- CART称为分类决策树,既能处理分类问题,又能处理回归问题。与ID3不能直接处理连续型特征不同的是,CART使用二元切分,即使用一个属性阈值对样本数据进行划分。划分的标准除了使用熵增益外,还有基尼纯净度和方差缩减(用于回归)。
- Q:掌握Bagging 和Boosting
- A:Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法。即将弱分类器组装成强分类器的方法。
- Bagging即套袋法,其算法过程如下:
(1)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)(2)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)(3)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同) - Boosting主要思想是将弱分类器组装成一个强分类器。在PAC(概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。
- Bagging即套袋法,其算法过程如下:
- Q:掌握随机森林,XGBoost原理
- A:这两种算法都是基于决策树的。
- 随机森林(RandomForest)是Bagging的扩展变体,它在以决策树为基础学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择,其流程大概分为四个步骤:
- 随机选择样本(放回抽样)
- 随机选择特征属性
- 构建决策树
- 随机森林投票(平均)
- XGBoost原理:XGBoost属于集成学习Boosting,是在GBDT的基础上对Boosting算法进行的改进,并加入了模型复杂度的正则项。GBDT是用模型在数据上的负梯度作为残差的近似值,从而拟合残差。XGBoost也是拟合数据残差,并用泰勒展开式对模型损失残差的近似,同时在损失函数上添加了正则化项。
- 随机森林(RandomForest)是Bagging的扩展变体,它在以决策树为基础学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择,其流程大概分为四个步骤:
- Q:随机森林,XGB,LGB的各自区别
- A:随机森林属于Bagging,也就是有放回抽样,多数表决或简单平均。Bagging之间的基学习器是并列生成的。RF就是以决策树为基学习器的Bagging,进一步在决策树的训练过程中引入了随机特征选择,这会使单棵树的偏差增加,但总体而言有利于集成。
- XGB 和 LGB 区别:
- 树的切分策略不同:XGB 是 level-wise,而 LGB 是leaf-wise。level-wise 的建树方式对当前层的所有叶节点一视同仁,有些叶节点的分裂收益很小仍然需要进行分裂,增加了计算代价。leaf-wise 方式的精度更高,但容易过拟合,所以要控制树的最大深度。
- 在选择数据分割点时:XGB 是通过预排序的方式,空间消耗较大;LGB是通过直方图算法,不需要进行预排序,内存占用更低。
- 在并行策略上,XGB 主要集中在特征并行上,而 LGB 的并行策略包含特征并行、数据并行和投票并行。
- Q:GBDT和XGB的区别
- A:GBDT的基本原理是Boosting里面的提升树,并使用Gradient Boost。其关键是利用损失函数的负梯度方向在当前模型的值作为残差的近似值,进而拟合一颗CART回归树。
- 传统的GBDT在优化的时候只用到了一阶导数信息,而XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数,并且XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。
- 另外XGBoost还支持线性分类器,通过在代价函数中加入正则项,降低了模型的方差,使学习出来的模型更加简单,避免过拟合。
参考文章
- 第16期 Datawhale 组队学习活动
- 阿里云AI开发者体验中心——机器学习算法(六):基于决策树的分类预测
- 决策树ID3 C4.5 CART的区别
- Bagging和Boosting 概念及区别
- RF/GBDT/XGBoost/LightGBM简单总结(完结)
- 随机森林RF、XGBoost、GBDT和LightGBM的原理和区别
【活动打卡】【Datawhale】第16期 机器学习算法梳理(AI入门体验) Task02:基于决策树的分类预测相关推荐
- ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测
ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测 目录 输出结果 数据集展示 输出结果 1.k-NN 2.LoR 4.DT 5.RF ...
- 机器学习算法(二):基于决策树的分类预测
机器学习算法(二):基于决策树的分类预测 决策树的介绍和应用 简介 决策树构建的伪代码 特征划分选择 信息增益 信息增益率 基尼系数 应用场景 优缺点 基于企鹅数据集的决策树实战 Step1:函数库导 ...
- 机器学习算法(六):基于决策树的分类预测
机器学习算法(六):基于决策树的分类预测 1 决策树的介绍和应用 1.1决策树的介绍 1.2 决策树的应用 2. 实验室手册 2.1 学习目标 2.2 代码流程 2.3 算法实战 2.3.1 Demo ...
- 机器学习算法(七): 基于LightGBM的分类预测(基于英雄联盟10分钟数据判断红蓝方胜负)
机器学习算法(七)基于LightGBM的分类预测 1. 实验室介绍 1.1 LightGBM的介绍 LightGBM是2017年由微软推出的可扩展机器学习系统,是微软旗下DMKT的一个开源项目,由20 ...
- 机器学习应用篇(七)——基于LightGBM的分类预测
机器学习应用篇(七)--基于LightGBM的分类预测 文章目录 机器学习应用篇(七)--基于LightGBM的分类预测 一.Introduction 1 LightGBM的优点 2 LightGBM ...
- ML之回归预测:利用十类机器学习算法(线性回归、kNN、SVM、决策树、随机森林、极端随机树、SGD、提升树、LightGBM、XGBoost)对波士顿数据集回归预测(模型评估、推理并导到csv)
ML之回归预测:利用十类机器学习算法(线性回归.kNN.SVM.决策树.随机森林.极端随机树.SGD.提升树.LightGBM.XGBoost)对波士顿数据集[13+1,506]回归预测(模型评估.推 ...
- Datawhale组队学习:初级算法梳理课程任务
背景 Datawhale 是国内很有名的一个开源学习组织.这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起,营造出一种互促高效的学习环境,一起为开源学习付出努力. Datawhale ...
- 机器学习(三):基于LightGBM的分类预测
LightGBM介绍 LightGBM是2017年由微软推出的可扩展机器学习系统,是微软旗下DMKT的一个开源项目,由2014年首届阿里巴巴大数据竞赛获胜者之一柯国霖老师带领开发.它是一款基于GBDT ...
- 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集
各位同学好,今天我向大家介绍python机器学习中的朴素贝叶斯算法.内容有:算法的基本原理:案例实战--新闻文档的分类预测. 案例简介:新闻数据有20个主题,有10万多篇文章,每篇文章对应不同的主题, ...
最新文章
- 企业网络推广期间影响企业网络推广自然排名的因素有哪些?
- block关键字的使用
- Android模拟多线程下载
- 谷歌语音文本转换python代码_python - Python Google语音到文本的转换 - SO中文参考 - www.soinside.com...
- matlab inpainting,MATLAB-Python-inpainting-codes-master
- 搭建Cacti监控系统(三)-- 监控Linux 主机
- 如何使用Orchard搭建敏捷个人的网站(1)
- 单片机ADC采样算法----一阶低通滤波
- 开源内容管理系统 Joomla 数据遭泄露
- 基于Jenkins 快速搭建持续集成环境
- 手机号码归属地查询练习
- 计算机 绘图 教案,工程制图基础
- java配置文件密码加密解密_Java-从配置文件加密/解密用户名和密码
- NEFU 262 贪吃的九头龙(树形背包,4级)
- “差不多先生”引发的悲剧
- 一篇文章带你发中文核心期刊《计算机科学》
- 说说抖音和小红书的交互和界面设计,您更喜欢哪一个?
- 三个基本的布尔逻辑算符是_布尔逻辑算符.ppt
- MCU电子方案开发 MUC单片机 EM78P372N 8位OTP微控制器
- 考研英语近义词与反义词·十一
热门文章
- 论文解读:6mA-Pred: identifying DNA N6-methyladenine sites based on deep learning
- uniapp禁止单页面侧滑返回
- Node.js获取AJAX参数Demo
- cadence 通孔焊盘_allegro软件通孔类焊盘制作方法及步骤
- ES的聚合操作(API版本)
- python贷款_python算账,贷款表
- coredns hosts插件
- 天数智芯亮相2019世界人工智能大会 软硬协同深耕AI极致算力
- 量子侦探社之“寻猫记”
- BI神器Power Query(17)-- PQ制作时间维度表(6)