sklearn學習04——DecisionTree

hitsugaya837 2022-01-07 16:02:26 阅读数:599

sklearn decisiontree


前言

本篇簡單回顧一下决策樹原理,然後采用sklearn的鳶尾花數據集實現决策樹模型的訓練和預測。

一、决策樹原理

這裏只說明决策樹的基本算法流程和最優劃分屬性的選擇(核心思想),具體細節可以參考我的另一篇文章:機器學習第四章—决策樹

1.1、算法基本流程

學習算法
顯然,决策樹的生成過程是一個遞歸過程。這裏,分支完成的標志有三種情况,也是遞歸返回的三種情况:

  • 當前結點包含的樣本全屬於同一類別,無需劃分; (即已經分好類的情况)
  • 當前屬性集為空,或是所有樣本在所有屬性上取值相同,無法劃分;(所有屬性都被判斷過,或者每個樣本特征都相同導致無法劃分)
  • 當前結點包含的樣本集合為空,不能劃分。(當前結點已經沒有樣本,不需要再劃分)

處理方式:

  • 在第(1)種情形下,直接把當前結點標記為葉結點,類別也就是當前所有樣本所屬的這個類別;
  • 在第(2)種情形下,我們把當前結點標記為葉結點,並將其類別設定為該結點所含樣本最多的類別;(所有屬性都判斷完了還沒分好,這就看該結點下的這些樣本哪一類多了)
  • 在第(3)種情形下,同樣把當前結點標記為葉結點,但將其類別設定為其父結點所含樣本最多的類別(也就是這種特征的樣本,訓練集中沒有,所以要靠父結點來幫助,其實就是决策樹能力不够,使得判斷條件松了一級)。

1.2、最優劃分屬性的選擇

决策樹的生成過程中,關鍵一步是:最優劃分屬性的生成。即找到能將當前數據集劃分最好的屬性(劃分之後的幾個集合純度越高,劃分的越好)。關於選擇最劃分優屬性的標准,一般有以下三種:

  • 信息增益。代錶實現: ID3 决策樹
  • 增益率。代錶實現:C4.5 决策樹
  • 基尼指數。代錶實現: CART 决策樹

這三種標准的具體數學形式不再展開,詳見上述鏈接。下面使用sklearn所實現的一種决策樹就是按照基尼指數的標准進行劃分、生成决策樹的。

二、sklearn代碼實踐

2.1、引入庫

這裏使用 iris (鳶尾花)數據集。數據集內包含 3 類共 150 條記錄,每類各 50 個數據,每條記錄都有 4 項特征:花萼長度、花萼寬度、花瓣長度、花瓣寬度,可以通過這4個特征預測鳶尾花卉屬於(iris-setosa, iris-versicolour, iris-virginica)中的哪一品種。

代碼如下:

import seaborn as sns
from pandas import plotting
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn import tree

2.2、查看數據集信息

打印輸出鳶尾花數據集特征、種類(樣本標記)的信息,順帶查看前幾條樣本。

代碼如下:

# 加載數據集
data = load_iris()
# 轉換成.DataFrame形式
df = pd.DataFrame(data.data, columns = data.feature_names)
# 添加品種列
df['Species'] = data.target
# 查看數據集信息
print(f"數據集信息:\n{df.info()}")
# 查看前5條數據
print(f"前5條數據:\n{df.head()}")
# 查看各特征列的摘要信息
df.describe()

2.3、使用可視化類直觀分析各個特征與品種的關系

代碼如下:

# 設置顏色主題
antV = ['#1890FF', '#2FC25B', '#FACC14', '#223273', '#8543E0', '#13C2C2', '#3436c7', '#F04864']
# 繪制violinplot
f, axes = plt.subplots(2, 2, figsize=(8, 8), sharex=True)
sns.despine(left=True) # 删除上方和右方坐標軸上不需要的邊框,這在matplotlib中是無法通過參數實現的
sns.violinplot(x='Species', y=df.columns[0], data=df, palette=antV, ax=axes[0, 0])
sns.violinplot(x='Species', y=df.columns[1], data=df, palette=antV, ax=axes[0, 1])
sns.violinplot(x='Species', y=df.columns[2], data=df, palette=antV, ax=axes[1, 0])
sns.violinplot(x='Species', y=df.columns[3], data=df, palette=antV, ax=axes[1, 1])
plt.show()
# 繪制pointplot
f, axes = plt.subplots(2, 2, figsize=(8, 6), sharex=True)
sns.despine(left=True)
sns.pointplot(x='Species', y=df.columns[0], data=df, color=antV[1], ax=axes[0, 0])
sns.pointplot(x='Species', y=df.columns[1], data=df, color=antV[1], ax=axes[0, 1])
sns.pointplot(x='Species', y=df.columns[2], data=df, color=antV[1], ax=axes[1, 0])
sns.pointplot(x='Species', y=df.columns[3], data=df, color=antV[1], ax=axes[1, 1])
plt.show()
# g = sns.pairplot(data=df, palette=antV, hue= 'Species')
# 安德魯曲線
plt.subplots(figsize = (8,6))
plotting.andrews_curves(df, 'Species', colormap='cool')
plt.show()

得到以下的鳶尾花四個特征與品種的關系圖:
關系圖1
關系圖2
關系圖3

2.4、訓練决策樹(基於Gini值)

代碼如下:

# 加載數據集
data = load_iris()
# 轉換成.DataFrame形式
df = pd.DataFrame(data.data, columns = data.feature_names)
# 添加品種列
df['Species'] = data.target
# 用數值替代品種名作為標簽
target = np.unique(data.target)
target_names = np.unique(data.target_names)
targets = dict(zip(target, target_names))
df['Species'] = df['Species'].replace(targets)
# 提取數據和標簽
X = df.drop(columns="Species")
y = df["Species"]
feature_names = X.columns
labels = y.unique()
X_train, test_x, y_train, test_lab = train_test_split(X,y,
test_size = 0.4,
random_state = 42)
model = DecisionTreeClassifier(max_depth =3, random_state = 42)
model.fit(X_train, y_train)
# 以文字形式輸出樹
text_representation = tree.export_text(model)
print(text_representation)
# 用圖片畫出
plt.figure(figsize=(30,10), facecolor ='g') #
a = tree.plot_tree(model,
feature_names = feature_names,
class_names = labels,
rounded = True,
filled = True,
fontsize=14)
plt.show()

最後可以得到一棵如下的决策樹模型:

决策樹模型
控制臺的如下運行結果,代錶著决策樹劃分時屬性的先後順序,這個順當然對應了上邊的决策樹模型的各個結點。下圖即錶示:先判斷第 2 個特征的值,根據其值劃分出兩個分支;> 2.45 的分支會優先選擇第 3 個特征,第 3 個特征判斷完之後又選擇了第 2 個特征(因為特征值是連續的,所以可能會重複出現在多層!)…

在這裏插入圖片描述

總結

本篇首先介紹决策樹的原理,其關鍵點就是 最優屬性的劃分,有三個不同的選擇標准供我們選擇,詳細數學形式和背後的含義可以參考西瓜書或者我的另一篇博文(機器學習第四章—决策樹);然後在使用sklearn實現一個决策樹模型,加强理解决策樹的分類思想。

版权声明:本文为[hitsugaya837]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071602259568.html