柚子快報激活碼778899分享:回歸 【機器學(xué)習(xí)】決策樹算法
目錄
算法引入?
基尼系數(shù):
決策樹算法概述
決策樹的關(guān)鍵概念
決策樹的構(gòu)建
代碼實現(xiàn)
1. 定義決策樹節(jié)點
2. 計算信息增益
3. 選擇最佳分割特征
4. 構(gòu)建決策樹
5. 決策樹預(yù)測
?決策樹的評估指標(biāo):
決策樹的優(yōu)缺點
優(yōu)點:
缺點:
決策樹的優(yōu)化
人工智能領(lǐng)域在當(dāng)今可謂炙手可熱,在人工智能與機器學(xué)習(xí)領(lǐng)域,決策樹是一種簡單直觀卻又功能強大的分類與回歸方法。它的思想是通過構(gòu)建一棵樹狀模型來進行決策或數(shù)據(jù)分類,其結(jié)構(gòu)主要是以二叉樹的形式為主。決策樹是一種常用的機器學(xué)習(xí)算法,用于分類和回歸任務(wù)。它通過學(xué)習(xí)簡單的決策規(guī)則推斷出目標(biāo)值。
算法引入?
小明大學(xué)畢業(yè)了,去了一家銀行當(dāng)行長,上班第一天就有了10人申請了貸款,剛剛?cè)胄械男∶髯屑毜卣砹丝蛻粜畔?。包括是否有工作,是否有房子,是否信譽良好,經(jīng)過了深思熟慮,小明對這10份申請給出了批復(fù)。小明想能不能讓AI根據(jù)自己所做出的規(guī)律進行自動批復(fù),這樣小明就大大減少了工作量,又可以上班摸魚了。申請人的信息如下:
申請人是否工作有無房子信譽結(jié)果1否否一般拒絕2否否良好拒絕3是是一般同意4是是很好同意5否是很好同意6否是一般拒絕7是否一般同意8否是很好同意9否否很好拒絕10是否良好同意
根據(jù)上面信息我們能不能推出某一個規(guī)律,使規(guī)律都滿足上面的結(jié)果,如果我們按照是否有工作分類,有工作的批準,沒工作的不批準,顯然不行,在第5個申請人沒有工作也批準了。那么我們按照有無房子分類?在第7、10個申請人沒有房子也通過了申請,那按照信譽?第9個申請人信譽很好也被拒絕了。那么我們?nèi)绾芜M行批準,這就是要我們的決策樹出馬了。
基尼系數(shù):
那么在建樹的時候,誰當(dāng)那個頭結(jié)點呢,這就要引出了我們的基尼系數(shù)的概念。
根據(jù)上面的公式我們可以計算出Gini=1-(5/10)^2-(5/10)^2=0.5。
Gini(工作,是)=1-(4/4)^2-0=0,Gini(工作,否)=1-(2/6)^2-(4/6)^2=0.44。
根據(jù)加權(quán)方式求和:Gini(工作)=4/10*(Gini(工作,是))+6/10*(Gini(工作,否))=0.27。
Gini(房子,是)=1-(4/5)^2-(1/5)^2=0.32,Gini(房子,否)=1-(2/5)^2-(3/5)^2=0.48。
根據(jù)加權(quán)方式求和:Gini(房子)=5/10*(Gini(房子,是))+5/10*(Gini(房子,否))=0.4。
Gini(信譽,一般)=1-(2/4)^2-(2/4)^2=0.5,Gini(信譽,良好)=1-(1/2)^2-(1/2)^2=0.5,Gini(信譽,很好)=1-(3/4)^2-(1/4)^2=0.375。
根據(jù)加權(quán)方式求和:Gini(信譽)=4/10*(Gini(信譽,一般))+2/10*(Gini(信譽,良好))+4/10*(Gini(信譽,很好))=0.45。
我們比較這三個數(shù)Gini(工作)=0.27、Gini(房子)=0.4、Gini(信譽)=0.45。我們發(fā)現(xiàn)這個三個數(shù)字中Gini(工作)=0.27最小,所以我們按照它來建立決策樹。
此時頭結(jié)點建立完成,然后我們在沒有工作的里面,有2個客戶是被批準的,4個客戶被拒絕了,那么我們在此基礎(chǔ)上繼續(xù)進行分類,繼續(xù)求解Gini(房子),Gini(信譽)。Gini(房子,是)=1-(2/2)^2- 0=0,Gini(房子,否)=1- 0 -(4/4)^2=0。根據(jù)加權(quán)方式求和:Gini(房子)=2/6*(Gini(房子,是))+4/6*(Gini(房子,否))=0。此時Gini(信譽)就不用算了,Gini(房子)已經(jīng)達到最小0了,下一個結(jié)點就放是否有房子,那么此時最終的決策樹就出來了。
先根據(jù)是否有工作進行判斷,如果有,那么直接進行批準,沒有的話,再進行判斷是否有房子,有房子的話直接批準,沒有房子的話直接拒絕,當(dāng)然,我們這個例子沒有涉及到信譽一項,如果在沒有房子的人里面還有被批準的,那么需要再加一個內(nèi)部節(jié)點信譽,再根據(jù)信譽的三個分類:一般、良好、很好,進行批復(fù)。這些判斷是建立在前一項的基礎(chǔ)之上的,只有進行了前一項的判斷才能進行下一項的判斷,進而給出批復(fù)。
決策樹算法概述
決策樹通過樹狀圖的形式模擬決策過程,在每一個結(jié)點都會有分支(除了葉子結(jié)點),每個內(nèi)部節(jié)點都代表一個屬性上的判斷,如果為是則走一個分支,如果為否則走另外一個分支。每個分支代表判斷的結(jié)果,每個葉節(jié)點代表一種決策結(jié)果。
決策樹的關(guān)鍵概念
- 節(jié)點(Node):決策樹中的一個決策點。 - 根節(jié)點(Root):決策樹的起始點。 - 分支(Branch):從一個節(jié)點到另一個節(jié)點的連接。 - 葉節(jié)點(Leaf):沒有子節(jié)點的節(jié)點,是一棵樹最下面的結(jié)點。代表最終決策。 - 路徑(Path):從根節(jié)點到葉節(jié)點的一系列決策。
決策樹的構(gòu)建
構(gòu)建決策樹通常涉及以下步驟:
1. 選擇最佳屬性:使用某種度量(如信息增益、基尼不純度)選擇最佳屬性進行分割。2. 創(chuàng)建節(jié)點:為所選屬性的每個可能值創(chuàng)建一個分支。3. 分割數(shù)據(jù):根據(jù)屬性值將數(shù)據(jù)分割成不同的子集。4. 遞歸構(gòu)建:對每個子集遞歸地重復(fù)上述步驟,直到滿足停止條件(如所有數(shù)據(jù)屬于同一類別,或已達到樹的最大深度)。
代碼實現(xiàn)
1. 定義決策樹節(jié)點
class TreeNode:
def __init__(self, feature_index=None, threshold=None, left=None, right=None, *, value=None):
self.feature_index = feature_index # 特征索引
self.threshold = threshold # 閾值
self.left = left # 左子樹
self.right = right # 右子樹
self.value = value # 節(jié)點值(葉節(jié)點時的分類結(jié)果)
2. 計算信息增益
def information_gain(X, y, split_feature_index, threshold):
# 計算信息熵
def calculate_entropy(y):
# 實現(xiàn)信息熵的計算
pass
# 劃分數(shù)據(jù)集
left_indices = [i for i in range(len(X)) if X[i][split_feature_index] < threshold]
right_indices = [i for i in range(len(X)) if X[i][split_feature_index] >= threshold]
# 計算信息增益
total_entropy = calculate_entropy(y)
left_entropy = calculate_entropy([y[i] for i in left_indices])
right_entropy = calculate_entropy([y[i] for i in right_indices])
weight_left = len(left_indices) / len(X)
weight_right = len(right_indices) / len(X)
information_gain = total_entropy - (weight_left * left_entropy + weight_right * right_entropy)
return information_gain
3. 選擇最佳分割特征
def best_split(X, y):
best_feature = None
best_threshold = None
max_information_gain = -1
for feature_index in range(X.shape[1]):
for i in range(X.shape[0]):
threshold = X[i][feature_index]
gain = information_gain(X, y, feature_index, threshold)
if gain > max_information_gain:
best_feature = feature_index
best_threshold = threshold
max_information_gain = gain
return best_feature, best_threshold
4. 構(gòu)建決策樹
def build_tree(X, y, max_depth=None, current_depth=0):
if len(np.unique(y)) == 1 or current_depth == max_depth:
return TreeNode(value=np.argmax(np.unique(y)))
best_feature, best_threshold = best_split(X, y)
if best_feature is None:
return TreeNode(value=np.argmax(np.unique(y)))
left_indices = [i for i in range(len(X)) if X[i][best_feature] < best_threshold]
right_indices = [i for i in range(len(X)) if X[i][best_feature] >= best_threshold]
left_X = [X[i] for i in left_indices]
left_y = [y[i] for i in left_indices]
right_X = [X[i] for i in right_indices]
right_y = [y[i] for i in right_indices]
left_child = build_tree(left_X, left_y, max_depth, current_depth + 1)
right_child = build_tree(right_X, right_y, max_depth, current_depth + 1)
return TreeNode(feature_index=best_feature, threshold=best_threshold, left=left_child, right=right_child)
5. 決策樹預(yù)測
def predict(tree, x):
if tree.value is not None:
return tree.value
if x[tree.feature_index] < tree.threshold:
return predict(tree.left, x)
else:
return predict(tree.right, x)
?決策樹的評估指標(biāo):
準確率:正確分類的樣本數(shù)占總樣本數(shù)的比例。精確度:預(yù)測為正的樣本中實際為正的比例。召回率:實際為正的樣本中預(yù)測為正的比例。F1分數(shù):精確度和召回率的調(diào)和平均。
決策樹的優(yōu)缺點
優(yōu)點:
- 易于理解和解釋。 - 可以處理數(shù)值和類別數(shù)據(jù)。 - 不需要數(shù)據(jù)標(biāo)準化。 - 可以可視化。
缺點:
- 容易過擬合。 - 對于某些數(shù)據(jù)集,構(gòu)建的樹可能非常大。 - 對于缺失數(shù)據(jù)敏感。
決策樹的優(yōu)化
- 剪枝:通過減少樹的大小來減少過擬合。 - 集成方法:如隨機森林和梯度提升樹,可以提高模型的泛化能力。
下一篇文章更新決策樹算法ID3、C4.5、CART的介紹以及實現(xiàn)。執(zhí)筆至此,感觸彼多,全文將至,落筆為終,感謝各位的支持。
柚子快報激活碼778899分享:回歸 【機器學(xué)習(xí)】決策樹算法
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。