提供做網(wǎng)站費(fèi)用百度指數(shù)資訊指數(shù)
(為了節(jié)約時(shí)間,后面關(guān)于機(jī)器學(xué)習(xí)和有關(guān)內(nèi)容哦就是用中文進(jìn)行書(shū)寫(xiě)了,如果有需要的話,我在目前手頭項(xiàng)目交工以后,用英文重寫(xiě)一遍)
(祝,本文同時(shí)用于比賽學(xué)習(xí)筆記和機(jī)器學(xué)習(xí)基礎(chǔ)課程)
俺前兩天參加了一個(gè)ai類的比賽,其中用到了一種名為baseline的模型來(lái)進(jìn)行一些數(shù)據(jù)的識(shí)別。而這個(gè)識(shí)別的底層原理就是決策樹(shù)。正好原本的學(xué)習(xí)進(jìn)度剛剛完成這部分,所以集成一個(gè)筆記了,本文中所有的截圖絕大多數(shù)來(lái)自吳恩達(dá)老師的公開(kāi)課程,為了方便理解,把相關(guān)的圖片搬過(guò)來(lái)了)
決策樹(shù)是什么
決策樹(shù)是一種機(jī)器學(xué)習(xí)算法,在一個(gè)類似二叉樹(shù)的結(jié)構(gòu)上實(shí)現(xiàn)的分支判斷算法。每個(gè)節(jié)點(diǎn)都視為一個(gè)“判斷語(yǔ)句”,將一批數(shù)據(jù)劃分成不同的部分。節(jié)點(diǎn)上(除了葉子)都要判斷“是”/“否”。
?一個(gè)具體化以后的模型差不多長(zhǎng)這樣子:給出一堆寵物的數(shù)據(jù),根據(jù)不同的特征(耳朵,臉型什么的),我們判斷輸入案例是狗還是貓貓。
如果還是不好理解,那么想象一下我們平時(shí)在寫(xiě)代碼時(shí)候大量if else嵌套,展開(kāi)以后也是一模一樣的結(jié)構(gòu)。去別在于可能if構(gòu)成的判斷樹(shù)的后代可能多于決策樹(shù),決策樹(shù)只能是二叉樹(shù),輸出“是”“不是”這種問(wèn)題,當(dāng)面對(duì)多個(gè)離散的特征值的時(shí)候,我們還有別的技術(shù)可以使用.
簡(jiǎn)而言之,決策樹(shù)是一種區(qū)別于神經(jīng)網(wǎng)絡(luò)的另一種判斷算法,在一些數(shù)據(jù)的處理上可能比神經(jīng)網(wǎng)絡(luò)更快更有效,由于其結(jié)構(gòu)類似二叉樹(shù),所以稱之為決策樹(shù)(decision tree).決策樹(shù)的生成是要根據(jù)已經(jīng)給出的數(shù)據(jù)案例創(chuàng)建的,數(shù)據(jù)有多少特征用于區(qū)分,就會(huì)有多少個(gè)節(jié)點(diǎn)進(jìn)行分裂(split).
具體的訓(xùn)練過(guò)程和訓(xùn)練中遇到的問(wèn)題會(huì)在下面解釋
在訓(xùn)練之前要接觸的一些名詞
純凈(purity)/雜質(zhì)(impurity):純度和不純是根據(jù)某個(gè)節(jié)點(diǎn)來(lái)說(shuō)的,例如我們輸入一堆寵物的數(shù)據(jù)(包括耳朵形狀,毛發(fā)長(zhǎng)度,臉型這些特征),在判斷某個(gè)屬性的節(jié)點(diǎn)上,我們會(huì)根據(jù)"符合"/"不符合"把已有的數(shù)據(jù)劃分為兩撥.比如這樣子
?原型的部分中,有四個(gè)是貓貓,三個(gè)是狗子.對(duì)于這個(gè)節(jié)點(diǎn)來(lái)說(shuō),我們可以認(rèn)為這個(gè)節(jié)點(diǎn)的純度是(4/7)
同理,另一個(gè)節(jié)點(diǎn)的純度視為(1/3)
(純度是一個(gè)相對(duì)的概念,如果你判斷的是狗子,那么純度就要變了)
熵:這個(gè)熵不是化學(xué)中的概念,而是代表混亂程度,當(dāng)純度和為0.5的時(shí)候,代表兩種東西對(duì)半開(kāi),也就是最混亂的情況.根據(jù)純度,我們有相關(guān)的公式可以計(jì)算出純度對(duì)應(yīng)熵的大小(假設(shè)純度為p)
整個(gè)函數(shù)的圖像大概就是這樣子
信息增益:信息增益也是根據(jù)某一個(gè)點(diǎn)來(lái)說(shuō)的,這個(gè)數(shù)值是訓(xùn)練時(shí)候的重要依據(jù),信息增益越大,代表整個(gè)節(jié)點(diǎn)進(jìn)行的劃分越有效,信息增益的計(jì)算方式為
0.5對(duì)應(yīng)的熵,減去左側(cè)的熵和右側(cè)的熵的加權(quán)平均和即可.比如上面的圖,我們可以計(jì)算為
決策樹(shù)如何進(jìn)行訓(xùn)練
決策樹(shù)底層的訓(xùn)練原理其實(shí)很簡(jiǎn)單,首先我們需要給定一個(gè)數(shù)據(jù)集合,這個(gè)數(shù)據(jù)集合中的每個(gè)事物都有一些共同的特征,類似這樣,通常我們可以把有效的特征組合起來(lái)形成一個(gè)表格.
?前面的特征為輸入,而cat一列作為輸出,決定這個(gè)寵物到底是不是貓,由此構(gòu)成一系列符合監(jiān)督學(xué)習(xí)要求的訓(xùn)練數(shù)據(jù)集合.
然后會(huì)從這些信息中,選擇分裂時(shí)產(chǎn)生更小熵的特征,算法會(huì)基于某種標(biāo)準(zhǔn)(例如信息增益、基尼不純度等)來(lái)評(píng)估每個(gè)可能的劃分,并選擇最優(yōu)的劃分特征。這些標(biāo)準(zhǔn)用于衡量數(shù)據(jù)的不純度和分割后的純度。這里我們使用上面講到的信息增益來(lái)判斷這個(gè)劃分成都
?由此可見(jiàn),以耳朵形狀作為劃分所產(chǎn)生的分裂節(jié)點(diǎn),信息增益更大,純度也更好.
接下來(lái)再根據(jù)其他的特征進(jìn)行劃分即可,當(dāng)遇到以下幾種情況的時(shí)候,我們可以認(rèn)為這個(gè)節(jié)點(diǎn)不用再繼續(xù)分裂了
- 樹(shù)的高度達(dá)到某些限制
- 純度已經(jīng)是100%
- 數(shù)據(jù)全部低于閾值
- ........
?兩個(gè)特殊情況
(1)分裂時(shí)候的數(shù)據(jù)不是二元的離散數(shù)值,而是一個(gè)連續(xù)的情況
這個(gè)很簡(jiǎn)單,設(shè)置一個(gè)閾值,比如0.5,0,7,....反正到最后還是二元的
(2)分裂的時(shí)候,可能數(shù)據(jù)是多元的離散數(shù)值,比如毛發(fā)可能是長(zhǎng)發(fā),短發(fā),卷發(fā)這三種.我們總不能搞出三叉樹(shù)來(lái),所以這里我們把"是什么"轉(zhuǎn)變?yōu)?#34;是不是"的問(wèn)題.比如這樣一個(gè)特征,我們可以劃分為"是不是長(zhǎng)發(fā),是不是短發(fā),是不是卷毛"三個(gè)二元的特征
隨機(jī)森林算法
給定一個(gè)數(shù)據(jù)集合,我們可以計(jì)算出一個(gè)決策樹(shù)來(lái)進(jìn)行一些判斷,給定一個(gè)動(dòng)物,決策樹(shù)最紅會(huì)給出我們這個(gè)是不是貓貓的答案.但是這有兩個(gè)問(wèn)題,節(jié)點(diǎn)不一定是純凈的(雖然大多數(shù)情況下,只要不超過(guò)我們的限定高度,是可以把一個(gè)決策樹(shù)修煉到高度純凈的),造成判斷結(jié)果不一定準(zhǔn)確.
另一個(gè)問(wèn)題就是,一些數(shù)據(jù)發(fā)生擾動(dòng)以后,可能會(huì)影響決策樹(shù)這個(gè)依托信息增益產(chǎn)生的精密系統(tǒng).
最簡(jiǎn)單粗暴的方法就是,訓(xùn)練多個(gè)樹(shù),形成一個(gè)森林.但是一個(gè)數(shù)據(jù)集合練出來(lái)的樹(shù)是一樣的,沒(méi)啥必要,所以我們產(chǎn)生了隨機(jī)森林算法.
sampling with replacement(放回抽樣)這東西我們?cè)诟咧芯蛯W(xué)過(guò),所以這里不加簡(jiǎn)述了.我們要做的就是確定一個(gè)規(guī)模,比如10,每次從原始數(shù)據(jù)集中抽取10個(gè)案例,然后用來(lái)訓(xùn)練一棵樹(shù).
如此循環(huán)多次,我們就能得到多個(gè)決策樹(shù),組成一個(gè)森林,這其中難免會(huì)有一些決策樹(shù)是一樣的,我們忽視掉它
這樣我們計(jì)算結(jié)果的時(shí)候,要考慮到整個(gè)森林所有樹(shù)木的輸出效果,然后綜合考慮我們?cè)鯓哟_定輸出效果?
XGBoost算法和使用
在眾多隨機(jī)森林算法中,XGBoost是一種使用很廣泛的隨機(jī)森林算法,并且XGBoost也是一個(gè)開(kāi)源庫(kù)(不是放在tf或者pytorch的庫(kù)中的).XGBoost非常像我們之前聊過(guò)的增強(qiáng)算法(啥,哦博客還沒(méi)寫(xiě)出來(lái),8好意思,盡快補(bǔ)上)
XGBoost算法和普通決策樹(shù)的區(qū)別在于放回抽樣的不瘋魔,傳統(tǒng)的決策樹(shù)是平等地抽取,xgb算法則是會(huì)根據(jù)上一次,估計(jì)錯(cuò)了哪些數(shù)值,在本次抽取中優(yōu)先提取上一次參與訓(xùn)練并且估計(jì)失敗的數(shù)值案例.
比如
?構(gòu)建某一次決策樹(shù)的時(shí)候,2,6,8號(hào)數(shù)據(jù)估計(jì)錯(cuò)誤,則下一次會(huì)優(yōu)先提取出這些作為訓(xùn)練案例之一.
當(dāng)然這些主要是底層實(shí)現(xiàn)了(注意對(duì)應(yīng)的函數(shù)從xgboost包中導(dǎo)入,這個(gè)包需要提前下載)
下面來(lái)看一下具體的使用案例.
pip3 install xgboost
#xgboost算法 這里沒(méi)有使用訓(xùn)練集合什么de
# 定義特征矩陣和標(biāo)簽
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])# 創(chuàng)建并訓(xùn)練模型
model = XGBClassifier()
model.fit(X, y)# 預(yù)測(cè)一個(gè)數(shù)據(jù)
data_to_predict = np.array([[2, 3]])
prediction = model.predict(data_to_predict)print(f"預(yù)測(cè)結(jié)果: {prediction}")#xgboost算法 這里沒(méi)有使用訓(xùn)練集合什么de
# 定義特征矩陣和標(biāo)簽
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])# 創(chuàng)建并訓(xùn)練模型
model = XGBClassifier()
model.fit(X, y)# 預(yù)測(cè)一個(gè)數(shù)據(jù)
data_to_predict = np.array([[2, 3]])
prediction = model.predict(data_to_predict)print(f"預(yù)測(cè)結(jié)果: {prediction}")
和神經(jīng)網(wǎng)絡(luò)有什么區(qū)別捏?
相比于神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),決策樹(shù)和隨機(jī)森林算法更適合一些有固定相似數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)集合.換句話說(shuō),更容易處理那種可以形成表格的數(shù)據(jù).
而神經(jīng)網(wǎng)絡(luò)則用來(lái)處理一些非相似結(jié)構(gòu)的數(shù)據(jù),這一點(diǎn)就是他們的主要區(qū)別
決策樹(shù)同樣是一種很重要的監(jiān)督學(xué)習(xí)算法.
關(guān)于baseline(未完待續(xù))
baseline是一種基于決策樹(shù)的大模型,適用于多重二元分析等操作,在競(jìng)賽和論文中應(yīng)用很廣泛.
(至少與我們之前用到tensorflow要廣泛.....tf都快開(kāi)擺了)
不過(guò)這個(gè)模型我現(xiàn)在也不是很熟悉,僅僅是停留在"用過(guò)"這個(gè)層面上,后面有機(jī)會(huì)我會(huì)繼續(xù)在這里補(bǔ)充這個(gè)模型的使用和優(yōu)缺點(diǎn),