網(wǎng)站策劃書十大外貿(mào)電商平臺(tái)
課程開源地址及相關(guān)視頻鏈接:(當(dāng)然這里也希望大家支持一下正版西瓜書和南瓜書圖書,支持文睿、秦州等等致力于開源生態(tài)建設(shè)的大佬??ヽ(°▽°)ノ?)
Datawhale-學(xué)用 AI,從此開始
【吃瓜教程】《機(jī)器學(xué)習(xí)公式詳解》(南瓜書)與西瓜書公式推導(dǎo)_嗶哩嗶哩_bilibili
正文部分
決策樹是一種有監(jiān)督的機(jī)器學(xué)習(xí)算法,可用于解決分類和回歸問題,是使用分支方法說明決策的所有可能結(jié)果的圖,可理解為實(shí)現(xiàn)某一特定結(jié)果的決策,隨機(jī)森林是基于樹的機(jī)器學(xué)習(xí)算法,是隨機(jī)創(chuàng)造的決策樹組成的森林,該算法利用了多棵決策樹來進(jìn)行決策,是用于分類、回歸和其他任務(wù)的集成學(xué)習(xí)方法,輸出結(jié)果是將單個(gè)決策樹的輸出整合起來生成最后的輸出結(jié)果。主要區(qū)別:
- 輸出結(jié)果不同
- 復(fù)雜度不同
決策樹的一些優(yōu)點(diǎn)是
-
易于理解和解釋。樹可以可視化。
-
需要很少的數(shù)據(jù)準(zhǔn)備。其他技術(shù)通常需要數(shù)據(jù)歸一化,需要?jiǎng)?chuàng)建虛擬變量,并刪除空白值。一些樹和算法組合支持?缺失值。
-
使用樹的成本(即預(yù)測(cè)數(shù)據(jù))與用于訓(xùn)練樹的數(shù)據(jù)點(diǎn)的數(shù)量的對(duì)數(shù)成正比。
-
能夠處理數(shù)值數(shù)據(jù)和分類數(shù)據(jù)。但是,scikit-learn 實(shí)現(xiàn)目前不支持分類變量。其他技術(shù)通常專門用于分析僅包含一種變量類型的數(shù)據(jù)集。有關(guān)更多信息,請(qǐng)參閱?算法。
-
能夠處理多輸出問題。
-
使用白盒模型。如果在模型中觀察到特定情況,則該條件的解釋可以通過布爾邏輯輕松解釋。相比之下,在黑盒模型(例如,在人工神經(jīng)網(wǎng)絡(luò)中),結(jié)果可能更難解釋。
-
可以使用統(tǒng)計(jì)檢驗(yàn)來驗(yàn)證模型。這使得可以考慮模型的可靠性。
-
即使其假設(shè)在一定程度上被生成數(shù)據(jù)的真實(shí)模型所違反,也能表現(xiàn)良好。
決策樹的缺點(diǎn)包括
-
決策樹學(xué)習(xí)器可以創(chuàng)建過度復(fù)雜的樹,這些樹不能很好地概括數(shù)據(jù)。這被稱為過擬合。為了避免這個(gè)問題,需要使用修剪、設(shè)置葉節(jié)點(diǎn)所需的最小樣本數(shù)或設(shè)置樹的最大深度等機(jī)制。
-
決策樹可能不穩(wěn)定,因?yàn)閿?shù)據(jù)中的微小變化可能會(huì)導(dǎo)致生成完全不同的樹。這個(gè)問題可以通過在集成中使用決策樹來緩解。
-
決策樹的預(yù)測(cè)既不平滑也不連續(xù),而是如上圖所示的分段常數(shù)逼近。因此,它們不擅長(zhǎng)外推。
-
學(xué)習(xí)最優(yōu)決策樹的問題在幾個(gè)方面(包括最優(yōu)性和簡(jiǎn)單概念)都是已知的 NP 完全問題。因此,實(shí)際的決策樹學(xué)習(xí)算法基于啟發(fā)式算法,例如貪婪算法,在每個(gè)節(jié)點(diǎn)上做出局部最優(yōu)決策。此類算法不能保證返回全局最優(yōu)決策樹。這可以通過在集成學(xué)習(xí)器中訓(xùn)練多棵樹來緩解,其中特征和樣本是隨機(jī)抽取并替換的。
-
有一些概念很難學(xué)習(xí),因?yàn)闆Q策樹不容易表達(dá)它們,例如 XOR、奇偶校驗(yàn)或多路復(fù)用器問題。
-
如果某些類占主導(dǎo)地位,決策樹學(xué)習(xí)器會(huì)創(chuàng)建有偏差的樹。因此,建議在使用決策樹擬合之前平衡數(shù)據(jù)集。
決策樹算法的主要步驟
(1)選擇最優(yōu)屬性(根節(jié)點(diǎn))
決策樹判斷一個(gè)屬性是不是當(dāng)前數(shù)據(jù)集的最優(yōu)屬性,是依靠信息熵變化的程度來選擇的。選擇某個(gè)屬性,依照這個(gè)屬性的值,對(duì)訓(xùn)練集進(jìn)行劃分,劃分后的子訓(xùn)練集的信息熵之和,相比未分割前的數(shù)據(jù)集信息熵,下降最多的,就是當(dāng)前的最優(yōu)屬性。也就是說,根據(jù)這個(gè)屬性,我們就可以對(duì)數(shù)據(jù)集進(jìn)行很大程度上的區(qū)分,例如貓和狗之間用耳朵區(qū)分,非???。
(2)生成決策樹。(葉子節(jié)點(diǎn)的選擇)
選取最優(yōu)屬性后,根據(jù)此屬性的取值,對(duì)原始數(shù)據(jù)集劃分,得到子數(shù)據(jù)集,再將每個(gè)子數(shù)據(jù)集當(dāng)作完整數(shù)據(jù)集,迭代進(jìn)行最優(yōu)屬性的選取,直到數(shù)據(jù)集中樣本都是同一個(gè)分類標(biāo)簽時(shí),決策樹生成過程結(jié)束。
有時(shí)根據(jù)場(chǎng)景業(yè)務(wù)需求的不同,也不要求數(shù)據(jù)集分割到無(wú)法再分類的程度,而是指定迭代的次數(shù),即決策樹到第幾層就不再分割了,直接把當(dāng)前葉子數(shù)據(jù)集中數(shù)量最多的分類標(biāo)簽作為葉子節(jié)點(diǎn)。這是不同的停止規(guī)則。
而決策樹的三種常見算法,則是根據(jù)選擇最優(yōu)屬性時(shí)計(jì)算的信息熵函數(shù)不同劃分的。ID3 是根據(jù)信息熵,C4.5是根據(jù)信息增益率。CART是采用了基尼Gini系數(shù)。
(3)剪枝(防止過擬合)
剪枝就是給決策樹瘦身,這一步想實(shí)現(xiàn)的目標(biāo)就是,不需要太多的判斷,同樣可以得到不錯(cuò)的結(jié)果。
之所以這么做,是為了防止“過擬合”(Overfitting)現(xiàn)象的發(fā)生。
過擬合:指的是模型的訓(xùn)練結(jié)果“太好了”,以至于在實(shí)際應(yīng)用的過程中,會(huì)存在“死板”的情況,導(dǎo)致分類錯(cuò)誤。
欠擬合:指的是模型的訓(xùn)練結(jié)果不理想。
數(shù)據(jù)集為:
input = [[0.697, 0.460, 1],
[0.774, 0.376, 1],
[0.634, 0.264, 1],
[0.608, 0.318, 1],
[0.556, 0.215, 1],
[0.403, 0.237, 1],
[0.481, 0.149, 1],
[0.437, 0.211, 1],
[0.666, 0.091, 0],
[0.243, 0.267, 0],
[0.245, 0.057, 0],
[0.343, 0.099, 0],
[0.639, 0.161, 0],
[0.657, 0.198, 0],
[0.360, 0.370, 0],
[0.593, 0.042, 0],
[0.719, 0.103, 0]]
pandas
:決策樹的構(gòu)建涉及到數(shù)據(jù)集的一些操作,利用pandas的DataFrame
數(shù)據(jù)結(jié)構(gòu)可以很好方便的完成
copy
?:在遞歸時(shí)淺拷貝會(huì)導(dǎo)致問題,使用copy.deepcopy()
進(jìn)行深拷貝
matplot.pyplot
:繪制決策樹的劃分圖像
import pandas as pd
import copy
import matplotlib.pyplot as plt
import numpy as np
from math import fabs
定義回歸樹的節(jié)點(diǎn)類Node
attrList 節(jié)點(diǎn)剩下的屬性列表
Dataset 節(jié)點(diǎn)劃分到的數(shù)據(jù)集
left/right 左右子樹
c 葉節(jié)點(diǎn)的預(yù)測(cè)值
description 該節(jié)點(diǎn)的描述(可選)
attr 該節(jié)點(diǎn)劃分屬性
s 劃分屬性的值
class Node:def __init__(self, description="", c = -1, Dataset=pd.DataFrame(), attrList=[]):self.attrList = attrListself.Dataset = Datasetself.left = Noneself.right = Noneself.c = cself.attr = ""self.s = -1self.desciption = description
?損失函數(shù)計(jì)算:
def loss(attr, s, data):D1 = data[data[attr] <= s]D1_mean = D1['label'].std() * D1.sizeD2 = data[data[attr] > s]D2_mean = D2['label'].std() * D2.sizereturn D1_mean + D2_mean
?
def findOptDiv(root):losses = []for attr in root.attrList:for s in root.Dataset[attr]:losses.append((loss(attr, s, root.Dataset), attr, s))minLoss = min(losses)return minLoss
二叉樹的構(gòu)建
在以下情況返回IF
len(attrList) == 0
:此時(shí)所有屬性已經(jīng)劃分完畢, 就以該集合所有樣本的label
的均值作預(yù)測(cè)值?Dataset.size == 1
:此時(shí)該節(jié)點(diǎn)的樣本僅有一個(gè) 就 以該樣本的label
值做預(yù)測(cè)值
ELSE?將樣本按最優(yōu)劃分劃分為兩個(gè)集合D1,D2,并分別構(gòu)建subTree
def buildTree(root):# if root.Dataset.size() <= 1:# description = "leaf node"# c_p = root.Dataset['label'].mean()# leaf = Node(description=description, c = c_p) # 如果樣本集合中只有一個(gè)樣本那么該節(jié)點(diǎn)為葉節(jié)點(diǎn),該葉節(jié)點(diǎn)的預(yù)測(cè)值是該唯一樣本的labelif root.Dataset.size == 1:root.c = root.Dataset['label']return# 如果已經(jīng)將屬性分完了,那么該節(jié)點(diǎn)為葉節(jié)點(diǎn),剩下的樣本集中l(wèi)abel的期望為該葉節(jié)點(diǎn)的預(yù)測(cè)值elif len(root.attrList) == 0:root.description = "leaf node"root.c = root.Dataset['label'].mean()return else:# 找到最優(yōu)化分(_, attr, s) = findOptDiv(root)# 將節(jié)點(diǎn)的劃分屬性設(shè)為找到的attrroot.attr = copy.deepcopy(attr)# 將按屬性attr劃分該節(jié)點(diǎn)值劃分值s設(shè)為最優(yōu)的sroot.s = copy.deepcopy(s)# 將樣本集合按照找到的最優(yōu)化分劃分為D1, D2D1 = copy.deepcopy(root.Dataset[root.Dataset[attr] <= s])D2 = copy.deepcopy(root.Dataset[root.Dataset[attr] > s])# 將劃分該節(jié)點(diǎn)屬性從屬性集合中刪除list_notremoved = copy.deepcopy(root.attrList)root.attrList.remove(attr)list_removed = copy.deepcopy(root.attrList)root.attrList = copy.deepcopy(list_notremoved)# 構(gòu)建左子樹和右子樹root.left = Node(Dataset = D1, attrList=copy.deepcopy(list_removed))root.right = Node(Dataset = D2, attrList=copy.deepcopy(list_removed))buildTree(root.left)buildTree(root.right)return root
可以大致看出決策過程
- 先看含糖率:
- 小于.13
- 小于.666 壞瓜
- 大于.666 好瓜
- 大于.13
- 小于.697 0.6的概率是好瓜
- 大于.697 1的概率是好瓜
- 小于.13
參考文獻(xiàn)
算法——感知機(jī)詳解(推導(dǎo)+證明)
數(shù)學(xué)基礎(chǔ)-機(jī)器學(xué)習(xí)
?1.10. Decision Trees — scikit-learn 1.5.2 documentation