學(xué)AI,好工作 就找北大青鳥
關(guān)注小青 聽課做題,輕松學(xué)習(xí)
周一至周日
4000-9696-28

決策樹算法——選擇困難癥的“良藥”

來源:北大青鳥總部 2023年02月28日 16:29

摘要: 人們在面臨選擇難題的時候經(jīng)常想:如果能未卜先知,那該多好。實際上,在人工智能領(lǐng)域,就有一種預(yù)測算法,利用樹杈的形狀,非常形象地來解決這種選擇問題,這就是決策樹算法。

“To be,or not to be:that is the question”(生存還是毀滅:這是一個問題),這是著名的莎士比亞悲劇《哈姆雷特》中的主人公一句非常經(jīng)典的獨白,也是數(shù)百年來經(jīng)常困擾人們的選擇問題。這段哈姆雷特式問題的臺詞,經(jīng)常用來形容一個人在猶豫在思考時候的兩難情況,用現(xiàn)代人的說法就是“選擇困難癥”。人們經(jīng)常糾結(jié)于各種選擇,生怕選錯了,就會陷入困境。



人們在面臨選擇難題的時候經(jīng)常想:如果能未卜先知,那該多好。實際上,在人工智能領(lǐng)域,就有一種預(yù)測算法,利用樹杈的形狀,非常形象地來解決這種選擇問題,這就是決策樹算法,它是一個非常廣泛應(yīng)用的算法,其原理是通過對一系列問題進行“是/否”的推導(dǎo),最終實現(xiàn)決策。在機器學(xué)習(xí)發(fā)展到如今,決策樹算法越來越得到更多的應(yīng)用,我們也可以說它是解決“選擇困難癥”的良藥。本文為了讓讀者朋友較好理解該算法,用python編程進行一個實際應(yīng)用的示范。


新冠檢測和決策樹的基本原理

決策樹算法是一種典型的、逼近離散函數(shù)值的分類方法。主要是先對數(shù)據(jù)進行處理,利用歸納算法生成可讀的規(guī)則和決策樹,然后使用決策對新數(shù)據(jù)進行分析。決策樹算法應(yīng)用非常廣泛,例如在目前新冠疫情下,由于核酸檢測條件和資源有限,不能夠?qū)λ腥硕歼M行檢測,因此對有疑似感染人員的一些行為特征進行推導(dǎo),最終判斷其是否需要進行核酸檢測來進一步確診,也是很有必要的。比如調(diào)查和征詢病人的近期行為:“去過醫(yī)院或高危聚集地、防護措施是否到位、有病患接觸史、是否發(fā)燒咳嗽”,這四個行為特征來判斷是否需要對該人進行核酸檢測,從而進一步確診。



圖中最末端的5個節(jié)點,就是選擇后的判定結(jié)果,也稱為決策樹的樹葉。如果樣本的特征特別多、數(shù)據(jù)量大,就需要使用機器學(xué)習(xí)的辦法來建立決策樹的模型進行預(yù)測了。其中,決策樹算法的最大深度,也就是其max_depth參數(shù),代表了決策樹的復(fù)雜程度,即上述例子中做出問題判斷的數(shù)量,問題判斷數(shù)量越多,就代表決策樹的深度越深,這個模型的計算也越復(fù)雜。

在上面的例子中,決策樹很形象地把新冠疑似人員的幾類行為做了推導(dǎo),如果一個疑似人員雖然“沒有去過醫(yī)院或高危聚集地、但是有病患接觸史”,就要考慮做核酸檢測;如果一個疑似人員“去過醫(yī)院或高危聚集地、防護措施不到位、并且發(fā)燒咳嗽”,說明該病人感染可能性較大,就需要做核酸檢測。通過決策樹算法,對疑似人員進行選擇核酸檢測或不檢測的判定進行預(yù)測,解決了核算檢測的選擇問題。

(注:以上例子僅為了解釋決策樹算法的模擬描述,不一定代表真實情況)


決策樹算法解決選擇困難癥

隨著新冠疫情逐步得到緩解,長期宅在家中的人們都開始考慮去戶外游玩,可是天氣越來越熱、或者下雨、大風(fēng)等,能不能帶家人一起出去游山玩水還得看老天爺?shù)哪樕P∶骷矣幸粋€剛滿四歲的小孩,疫情期間,“小神獸”在家里都快憋瘋了,天天在家里是上躥下跳的。馬上就是周末了,小明看著家里被折騰的一片狼藉,他必須要做出周末是否能出行游玩的決策。同時他正好是一個大數(shù)據(jù)工程師,當(dāng)然可以借助人工智能算法來預(yù)測天氣以及出行的可能性,從而做出一個全家出行游玩的計劃。本文就通過決策樹算法,利用積累了一定時間的歷史天氣數(shù)據(jù),模擬一下小明的預(yù)測,看看這個周末他能不能帶全家一起出行游玩。


一、準(zhǔn)備數(shù)據(jù)集

我們采用的數(shù)據(jù)集包含如下特征字段(為簡略過程,將數(shù)據(jù)集的各自段值全部轉(zhuǎn)換為數(shù)字):

日期-date、天氣-outlook(0-晴天、1-陰天、2-雨天)、氣溫-temperature(0-炎熱、1-適中、2-寒冷)、濕度-humidity(0-高、1-中、2-低)、大風(fēng)-strong wind(0-有、1-無),另外還有一個輸出分類結(jié)果:出行的選擇-choice of journey(1-是、0-否)。

下面我們使用python導(dǎo)入數(shù)據(jù)集,并進行查看


#載入numpy、pandas,

import numpy as np

import pandas as pd

#使用pandas加載天氣數(shù)據(jù)集

data = pd.read_csv('weather.csv')

#顯示以下數(shù)據(jù)集前10行

data.head(10)


輸出運行結(jié)果如下:



將數(shù)據(jù)集不必要的字段裁剪掉。


#把去掉預(yù)測目標(biāo)Choice of journey后的數(shù)據(jù)集作為訓(xùn)練數(shù)據(jù)集X

data.drop(['date'], axis = 1, inplace = True)

X = data.drop(['choice of journey'], axis = 1)

#把預(yù)測目標(biāo)賦值給y

y = data['choice of journey'].values


二、建立決策樹模型并訓(xùn)練

生成訓(xùn)練集和測試集、使用決策樹算法建模并評估模型分?jǐn)?shù)。


from sklearn.model_selection import train_test_split

#將數(shù)據(jù)集拆分為訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

#導(dǎo)入用于分類的決策樹模型

from sklearn import tree

#設(shè)定決策樹分類器最大深度為5

DT_clf = tree.DecisionTreeClassifier(max_depth=5)

#擬合訓(xùn)練數(shù)據(jù)集

DT_clf.fit(X_train,y_train)

#打印模型的得分

print('決策樹模型得分:{:.2f}'.format(DT_clf.score(X_test, y_test)))


輸出結(jié)果為:

決策樹模型得分:0.85


可以看到,基于這個天氣數(shù)據(jù)集訓(xùn)練的模型得到了0.85的評分,也就是說這個模型的預(yù)測準(zhǔn)確率在85%,可以說預(yù)測準(zhǔn)確率還不錯,應(yīng)該能夠為小明解決出行的選擇問題了。


三、顯示決策樹的決策流程

在這個過程中,決策樹在每一層當(dāng)中都做了哪些事情呢?我們可以在Jupyter notebook中用一個名叫g(shù)raphviz的庫(首先需要借助Anaconda安裝這個庫),它能將決策樹的工作流程展示出來。輸入代碼:


#導(dǎo)入graphviz工具

import graphviz

#導(dǎo)入決策樹中輸出graphviz的接口

from sklearn.tree import export_graphviz

#加載決策樹分類模型,將工作流程輸出到dot文件

export_graphviz(DT_clf, out_file=" weather.dot", class_names="choice of journey", feature_names=["outlook","temperature","humidity","strong wind"], impurity=False, filled=True)

#打開這個dot文件

with open("weather.dot") as f:

dot_graph = f.read()

#顯示dot文件中的圖形

graphviz.Source(dot_graph)


輸出結(jié)果為:



上圖非常清晰地展現(xiàn)了決策樹是如何進行預(yù)測的,可以看出,決策樹模型首先對濕度進行判斷,在濕度小于或等于0.5這個條件為True的情況下,決策樹判斷分類為c,如果是False,則判斷為h,到下一層則對天氣和溫度進行判斷,進一步對樣本進行分類,以此類推,直到將樣本全部放進2個分類當(dāng)中。


四、預(yù)測周末是否出行游玩

模型建立好了,小明可以開始籌備周末的出行大計了,剛剛天氣預(yù)告廣播報道:本周末天氣為——多云、氣溫26度(適中)、濕度65%(稍高)、風(fēng)力3級(無大風(fēng))。

按之前對特征字段設(shè)定的對應(yīng)關(guān)系,各特征值解釋為數(shù)字是:[1,1,0,1]

我們可以利用上面步驟建立的決策樹模型來預(yù)測一下,看看小明周末能不能帶全家出去游玩。


#輸入本周末的天氣數(shù)據(jù)

weekend =[[1,1,0,1]]

#使用決策樹模型做出預(yù)測

pre = DT_clf.predict(weekend)

if pre == 1:

print("預(yù)測結(jié)果:[周末天氣不錯,可以去游玩!]")

else:

print("預(yù)測結(jié)果:[很遺憾,周末天氣不好,別去了]")


輸出結(jié)果如下:

預(yù)測結(jié)果:[周末天氣不錯,可以去游玩!]


小明得到以上預(yù)測結(jié)果也很興奮,馬上開始準(zhǔn)備出行計劃、路線和設(shè)備。周末小明全家人高高興興地踏了一次青,大家反映都很不錯,小明的父親形象頓時偉岸起來J。決策樹算法解決了小明出行的“選擇困難癥”,小明也算利用他掌握的算法知識為家里做了一次貢獻。


決策樹的優(yōu)化算法

決策樹算法(DecisionTree)在機器學(xué)習(xí)算法中,算是一個非?;A(chǔ)的算法,使用和預(yù)測也比較簡單。以上的例子是一個理想狀況的闡述,在機器學(xué)習(xí)的實際項目中,決策樹算法經(jīng)常會出現(xiàn)過擬合的問題,這會讓模型的泛化性能大打折扣。為了避免過擬合的問題出現(xiàn),在決策書算法的基礎(chǔ)之上,科學(xué)家們又衍生出隨機森林(Random Forests)和梯度上升決策樹(Gradient Boosted Decision Trees,簡稱GBDT)算法,大大優(yōu)化了決策樹算法。限于篇幅,本文對這兩個算法就不再深入介紹了,有興趣的讀者朋友可以自行學(xué)習(xí)和編程操作。


標(biāo)簽: 人工智能
熱門班型時間
人工智能就業(yè)班 即將爆滿
AI應(yīng)用線上班 即將爆滿
UI設(shè)計全能班 即將爆滿
數(shù)據(jù)分析綜合班 即將爆滿
軟件開發(fā)全能班 爆滿開班
網(wǎng)絡(luò)安全運營班 爆滿開班
報名優(yōu)惠
免費試聽
課程資料
官方微信
返回頂部
培訓(xùn)課程 熱門話題 站內(nèi)鏈接