天天看點

使用決策樹(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)算法由于其直覺的可視化方法和對資料模式的快速捕捉,在資料科學和機器學習中得到廣泛應用。它能夠幫助我們直覺地了解變量間的複雜關系,進而優化預測和決策過程。