天天看点

使用决策树(Decision Tree)进行探索性数据分析(EDA)

作者:新语数据故事汇
使用决策树(Decision Tree)进行探索性数据分析(EDA)

决策树(Decision Tree, DT)在机器学习和数据科学领域的成功源于其仿效人类决策过程的逻辑流程。这一过程类似于一张流程图,每个节点都通过简单的二分决策处理给定的变量,直至最终做出决策。

以购买T恤为例,决策可能基于预算、品牌、尺码和颜色等变量展开:

  • 如果价格超过30元,我会放弃购买;否则,会考虑购买。
  • 如果价格低于30元且是我喜欢的品牌,进一步考虑尺码。
  • 最后,如果价格低于30元、是我喜欢的品牌且尺码合适,且颜色是黑色,我会购买。
使用决策树(Decision Tree)进行探索性数据分析(EDA)

这种逻辑简单而合理,适用于各种数据。然而,决策树对数据集变化非常敏感,特别是在小数据集上,容易过拟合。

探索性数据分析(Exploratory Data Analysis, EDA)是数据科学项目中的关键阶段,旨在深入探索数据集及其变量,尽可能多地理解哪些因素对目标变量的影响最大。在这一阶段,数据科学家通过理解数据分布、检查错误或缺失数据,并通过可视化分析每个解释变量如何影响目标变量,从而获取初步见解。

决策树在EDA过程中的应用极为有益,因其能够捕捉数据中微小的模式和关系。在探索性阶段,不需过度关注数据分割或算法微调,简单地运行决策树即可获得深刻见解。

以下是从学生表现数据集中探索影响最终成绩G3的示例:

下面使用的数据集是来自UCI存储库的学生表现数据集进行示例,首先加载包和数据集:

# Importing libraries
import pandas as pd
import seaborn as sns
sns.set_style()
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.tree import plot_tree


# Loading a dataset
from ucimlrepo import fetch_ucirepo
student_performance = fetch_ucirepo(id=320)


# data (as pandas dataframes)
X = student_performance.data.features
y = student_performance.data.targets


df = pd.concat([X,y], axis=1)
df.head(3)           
使用决策树(Decision Tree)进行探索性数据分析(EDA)

以下两个示例是从学生表现数据集中探索影响最终成绩G3的示例。

示例一:'failures', 'absences', 'studytime' 对G3的影响

通过构建决策树分析失败次数、缺勤次数和学习时间对成绩的影响。观察到失败次数较少且学习时间超过2.5的学生成绩更高。

# Columns to explore
cols = ['failures', 'absences', 'studytime']
X = df[cols]
y = df.G3


# Fit Decision Tree
dt = DecisionTreeRegressor().fit(X,y)


# Plot DT
plt.figure(figsize=(20,9))
plot_tree(dt, filled=True, feature_names=X.columns, max_depth=3, fontsize=8)           
使用决策树(Decision Tree)进行探索性数据分析(EDA)

现在我们有了一个很好的可视化图表来理解我们列出的这些变量之间的关系。以下是我们可以从这棵树中获得的见解:

  • 对于每个框内第一行的条件,左边表示“是”,右边表示“否”。
  • 失败次数较少的学生(<0.5,或者我们可以说是零)成绩较高。只需观察左边每个框的值都高于右边的值。
  • 在没有失败记录的学生中,学习时间超过2.5的学生成绩更高。这个值几乎高出一个点。
  • 没有失败记录、学习时间少于1.5且缺勤次数少于22次的学生,其最终成绩高于那些学习时间少且缺勤次数多的学生。

示例二:'freetime', 'goout'对G3的影响

通过自由时间和外出频率探索学生成绩。发现不经常外出且自由时间较少的学生,以及外出频率高且有较多自由时间的学生,成绩较低。最佳成绩的学生通常外出频率在1.5以上且自由时间在1.5到2.5之间。

cols = ['freetime', 'goout']


# Split X & Y
X = df[cols]
y = df.G3


# Fit Decision Tree
dt = DecisionTreeRegressor().fit(X,y)


# Plot DT
plt.figure(figsize=(20,9))
plot_tree(dt, filled=True, feature_names=X.columns, max_depth=3, fontsize=10);           
使用决策树(Decision Tree)进行探索性数据分析(EDA)

变量goout和freetime的评分范围为1(非常低)到5(非常高)。注意到那些不经常外出(<1.5)且没有自由时间(<1.5)的学生,以及那些外出频繁(>4.5)且有较多自由时间的学生,成绩都较低。成绩最好的是那些外出频率在1.5以上且自由时间在1.5到2.5范围内的学生。

示例三:用分类决策树进行探索

同样的示例可以使用分类树算法来完成。逻辑和编码是相同的,但现在显示的结果是预测的类别,而不是一个数值。让我们看看使用另一个数据集的简单示例,该数据集是Seaborn包(BSD许可证)中的Taxis,包含纽约市的一组出租车行程数据。

通过分类决策树分析行程总金额与支付方式之间的关系。观察到较低的总金额更有可能使用现金支付:

# Load the dataset
df = sns.load_dataset('taxis').dropna()


cols = ['total']
X = df[cols]
y = df['payment']


# Fit Decision Tree
dt = DecisionTreeClassifier().fit(X,y)


#Plot Tree
plt.figure(figsize=(21,9))
plot_tree(dt, filled=True, feature_names=X.columns, max_depth=3, 
          fontsize=10, class_names=['cash', 'credit_card'])           
使用决策树(Decision Tree)进行探索性数据分析(EDA)

仅通过浏览生成的决策树,我们可以看到较低的总金额更大可能以现金支付。总金额在9.32美元以下的行程通常都是以现金支付的。

决策树(Decision Tree)算法由于其直观的可视化方法和对数据模式的快速捕捉,在数据科学和机器学习中得到广泛应用。它能够帮助我们直观地理解变量间的复杂关系,从而优化预测和决策过程。