決策樹(decision tree)是一種分類與回歸方法。在分類過程中可以理解為基於特徵對例項進行分類,也可以認為是if else的集合,也可以認為是定義在特徵空間與類空間上的條件概率分布。決策樹學習過程通常包括三個步驟:(1)特徵選擇 (2)決策樹的生成 (3)決策樹的剪枝。決策樹常用演算法有id3(iterative dichotomiser 3 迭代二叉樹三代)、c4.5、cart(classification and regression tree,分類與回歸樹)
這裡介紹兩種特徵選擇的方法:資訊增益與資訊增益比。
特徵選擇對於機器學習演算法來說尤為重要,有句話這麼說的「演算法作用於特徵之上」。特徵是用來描述乙個例項的,特徵選擇的好壞直接影響演算法的效果,這句話不只適用於決策樹演算法,好多演算法均適用。(以我自己的經驗為例,使用隨機數作為文字的特徵輸入rnn裡與使用某種方法得到的特徵輸入到rnn裡,其結果是不同的,後者的f1值要優於前者)
在決策樹方法中,特徵選擇是用來決定 用哪個特徵來劃分空間。
資訊增益由熵與條件熵計算而來。
熵是表示隨機變數不確定性的度量,熵只和分布有關,和變數具體的值無關。熵表示為h(
x)條件熵h(
y|x)
表示在已知隨機變數
x 的條件下,隨機變數
y的不確定性。
資訊增益表示 知道特徵
x 的資訊而使得類別
y的資訊的不確定性減少程度。資訊增益大的特徵具有更強的分類能力。
公式就不敲了,比較麻煩(我太懶了。。。)
來個例子,算一下資訊增益,當然還是使用李航大牛的例子。
#輸入資料,a表示特徵,d表示類別
a1 =np.array([1,1,1,1,1,2,2,2,2,2,3,3,3,3,3]) # a1表示特徵年齡,1表示特徵的取值為青年,2中年 3 老年
d = np.array([2,2,1,1,2,2,2,1,1,1,1,1,1,1,2]) #d表示類別,是否會給這個人貸款 1是 2否
class
information_gain
(object):
def__init__
(self,x):
# x表示特徵 ,d表示分類
self.x = x
defcal_entropy
(self,d):
# 計算熵
set_class = list(set(d))
# print("set_class",set_class)
num_class = len(set_class)
list_p =
for i in range(num_class):
num = 0
for j in range(len(d)):
if set_class[i]==d[j]:
num = num+1
# print(list_p)
p = np.array(list_p)/len(d)
p_log_p = p*np.log2(p)
return np.sum(p_log_p)*-1
defcal_con_entropy
(self,d):
set_x = list(set(self.x))
len_x = len(set_x)
num_x = # 記錄特徵x的取值集合
entropy_d = #記錄
for i in range(len_x):
sub_list = # 記錄類別的子集合
num = 0
for j in range(len(self.x)):
if set_x[i] == self.x[j]:
num = num+1
# print(sub_list)
result =np.sum((np.array(num_x)/len(self.x))*np.array(entropy_d))
return result
deflast_result
(self,d):
return self.cal_entropy(d)-self.cal_con_entropy(d)
inf_g = information_gain(a1)
result = inf_g.last_result(d)
print(result)
>>>0.0830074998558
經過計算得到特徵a3的資訊增益最大,所以選擇a3作為最優特徵
資訊增益的大小是相對於訓練集而言的,沒有絕對意義,當訓練資料集大的熵比較大的時候,資訊增益也會比較大。可以使用資訊增益比進行校正。
資訊增益比是資訊增益g(
d,a)
與訓練資料集
d 的熵h(
d)之比id3生成演算法
id3演算法的核心是在決策樹各個節點上應用資訊增益準則選擇特徵,遞迴地構建決策樹。具體方法是:從根節點出發,對節點計算所有可能的特徵的資訊增益,選擇資訊增益最大的特徵作為節點的特徵,由該特徵的不同取值建立子節點;再對子節點遞迴地呼叫以上方法,構建決策樹。
決策樹生成演算法往往是過擬合的,對訓練集很準,對測試集不是那麼準。過擬合的原因是為了使決策樹對訓練集正確分類,決策樹過於複雜。將決策樹進行簡化就可以減少過擬合,簡化的過程稱為「剪枝」,就是去掉一些子樹或者葉節點,將父節點作為新的子節點。
剪枝一般是通過極小化決策樹整體損失函式來實現的。損失函式的定義涉及到模型的準確度與複雜度,是對二者的均衡。若父節點的損失小則回縮至父節點,反之不回縮。
cart演算法既可以用於回歸也可以用於分類。具體細節這裡不說了。
提一點基尼指數,表示集合的不確定性,和熵類似。
主要展示一下sklearn的使用
#! /usr/local/bin/python3
#coding:utf-8
# anuthor:liushui
import numpy as np
from sklearn import tree
x = np.array([[1,2,2,3],[1,2,2,2],[2,1,1,2]])
y = np.array([2,2,1])
clf = tree.decisiontreeclassifier(criterion="gini")
clf.fit(x,y)
print(clf.predict([[1,2,2,1]]))
# >>> [2]
# 這個工具還可以將決策樹顯示出來,這裡不演示了
python實現決策樹
決策樹是乙個 模型 他代表的是物件屬性與物件值之間的一種對映關係。樹中每個節點表示某個物件,而每個分叉路徑則代表某個可能的屬性值,而每個葉節點則對應從根節點到該葉節點所經歷的路徑所表示的物件的值。詳細關於決策樹的討論,請自行google。一 找到最優分割位置 1 針對樣本資料,需要在其不同的維度 d...
決策樹(原理與實現) 知識整理
決策樹演算法 減枝策略 模組 預剪枝引數選擇 小結基本介紹 採用熵構造決策樹例項說明 然後根據資料統計,outlook取值分別為sunny overcast rainy的概率分別為 5 14 frac 145 4 14 frac 144 和5 14 frac 145 總體熵值計算 514 0.971...
機器學習之決策樹原理與Python實現
有一段時間沒來更新部落格了,這段時間總體把機器學習的幾個基本原理理解了一遍,又利用keras opencv tensorflow等將人臉識別,漢字識別等功能重新實現了一遍,算是有點小感悟。接下來會針對每一種機器學習演算法原理做詳細講解以及工程實現。因為在實際工作中,雖然有很多很成熟的框架可以用,但是...