机器学习理论入门:第二章 经典监督学习算法-决策树
第二章 經(jīng)典監(jiān)督學(xué)習(xí)算法-決策樹
一、決策樹總體概覽
概念:是在已知各種情況發(fā)生概率的基礎(chǔ)上,通過構(gòu)成決策樹來(lái)求取凈現(xiàn)值的期望值大于等于零的概率,評(píng)價(jià)項(xiàng)目風(fēng)險(xiǎn),判斷其可行性的決策分析方法,是直觀運(yùn)用概率分析的一種圖解法。由于這種決策分支畫成圖形很像一棵樹的枝干,故稱決策樹。
能解決的問題
–分類問題(較多使用)
–回歸問題
決策樹的種類(主要根據(jù)屬性劃分的依據(jù)來(lái)進(jìn)行算法的分類)
–ID3決策樹
–C4.5決策樹
–CART(Classification And Regression Tree)決策樹
優(yōu)缺點(diǎn)
二、信息論-信息熵
隨機(jī)事件及其信息
–概念:隨機(jī)事件是在隨機(jī)試驗(yàn)中,可能出現(xiàn)也可能不出現(xiàn),而在大量重復(fù)試驗(yàn)中具有某種規(guī)律性的事件叫做隨機(jī)事件
–信息:對(duì)于一個(gè)隨機(jī)變量X,它的每一個(gè)可能值的出現(xiàn)都可以看作是一個(gè)信息,每當(dāng)X的一個(gè)可能值被觀測(cè)到,我們稱不確定性減少了,即信息增加了
信息熵
–概念:是信息增益的數(shù)學(xué)期望
熱力學(xué)中的熵
–概念:表示系統(tǒng)混亂程度的量度
最大熵增原則
–概念:當(dāng)根據(jù)不完整的信息作為依據(jù)進(jìn)行推斷時(shí),應(yīng)該由滿足分布限制條件的具有最大熵的概率分布推得
–推論:對(duì)于給定的方差,在任意的隨機(jī)變量中高斯隨機(jī)變量的熵最大
三、信息論-交叉熵與KL散度
聯(lián)合熵
–概念:若X,Y是一對(duì)離散型隨機(jī)變量,且聯(lián)合概率分布為p(x,y),則X,Y的聯(lián)合熵為:
–作用:描述了一對(duì)隨機(jī)變量的平均信息量
條件熵
–概念:給定隨機(jī)變量X的情況下,隨機(jī)變量Y的條件熵為:
熵的連鎖規(guī)則
互信息
–定義
–作用:反應(yīng)的是知道了Y以后X的不確定性的減少量
相對(duì)熵(KL散度)
–定義
–推論
交叉熵(在深度學(xué)習(xí)中占據(jù)重要地位)
–定義
–作用:衡量估計(jì)出來(lái)的概率分布和真實(shí)概率分布之間的差異情況
四、屬性選擇的依據(jù)
決策樹的結(jié)構(gòu)及作用
–葉節(jié)點(diǎn):輸出分類結(jié)果
–內(nèi)部節(jié)點(diǎn):用于屬性測(cè)試
–根節(jié)點(diǎn):內(nèi)節(jié)點(diǎn)的一種,位置特殊
決策樹的輸入
根節(jié)點(diǎn)的一些特殊情況
–若訓(xùn)練集中的數(shù)據(jù)都屬于同一類,那么將RootNode標(biāo)記為該類的葉節(jié)點(diǎn)。返回(返回也意味著算法的結(jié)束)
–若屬性集為空集,或者訓(xùn)練集中的所有數(shù)據(jù)的所有屬性都相等,那么將RootNode標(biāo)記為訓(xùn)練集中出現(xiàn)次數(shù)最多的類的葉節(jié)點(diǎn),返回
決策樹的一般算法流程
信息增益
–計(jì)算樣本集的信息熵
–使用特定屬性a進(jìn)行劃分的信息增益
–用法
A)某個(gè)屬性的信息增益越大,則使用該屬性進(jìn)行劃分所得的“純度提升”越大
B)ID3算法使用信息增益作為屬性選擇的依據(jù)
–缺點(diǎn)
A)對(duì)可取值數(shù)目較多的屬性有偏好
增益率
–定義
–缺點(diǎn)
A)對(duì)可取值數(shù)目較少的屬性有偏好
–缺點(diǎn)的解決辦法(C4.5算法):先從屬性中找到信息增益高于平均水平的屬性,然后再?gòu)闹羞x出增益率最高的
基尼指數(shù)
–樣本集的基尼值公式
–基尼值作用:反映了隨機(jī)抽取兩個(gè)樣本,其所屬的類別不一致的概率
–屬性a的基尼指數(shù)定義
–選擇標(biāo)準(zhǔn):選擇基尼指數(shù)最小的屬性
五、剪枝操作
決策樹中的過擬合
–概念:決策樹的生成過程有時(shí)候?qū)е聸Q策樹的分支過多(分支過多意味著考慮了過多的邊緣情況,邊緣情況很多時(shí)候由個(gè)體差異引起),從而導(dǎo)致過擬合
驗(yàn)證集
–概念:決策樹在構(gòu)造的過程中使用驗(yàn)證集進(jìn)行測(cè)試,來(lái)決定當(dāng)前屬性是否要進(jìn)行分裂
剪枝的定義:將本來(lái)為內(nèi)部節(jié)點(diǎn)的節(jié)點(diǎn)變成葉節(jié)點(diǎn)的過程叫做剪枝
預(yù)剪枝(決策樹邊生成邊進(jìn)行剪枝操作)
–操作:在決策樹生成過程中,每個(gè)節(jié)點(diǎn)在劃分之前先在驗(yàn)證集上進(jìn)行一次測(cè)試,若當(dāng)前節(jié)點(diǎn)的劃分無(wú)法提高泛化性能,則不做劃分處理,直接將此節(jié)點(diǎn)作為葉節(jié)點(diǎn)(使得一些分支不能展開,降低了過擬合)
后剪枝(決策樹完全生成之后才開始剪枝,并且是自下向上的進(jìn)行)
–優(yōu)點(diǎn):樹的分支相對(duì)于預(yù)剪枝較多;泛化性能優(yōu)于預(yù)剪枝
–缺點(diǎn):訓(xùn)練時(shí)間較長(zhǎng)
六、決策樹的拓展
–連續(xù)屬性離散化
A)C4.5算法采用“二分法”:假設(shè)有一個(gè)連續(xù)屬性a,那么將數(shù)據(jù)劃分為a≤t和a>t兩個(gè)部分
2.多變量決策樹
–屬性的線性組合
七、編程實(shí)現(xiàn)(Python)
from math import log import operatordef calc_entropy(labels):# 計(jì)算信息熵label_num = len(labels)label_show_up_times_dict = {}for label in labels:if label not in label_show_up_times_dict.keys():label_show_up_times_dict[label] = 0label_show_up_times_dict[label] += 1entropy = 0.0for key in label_show_up_times_dict:prob = float(label_show_up_times_dict[key]) / label_numentropy += prob * log(prob, 2)return -entropydef split_dataset(dataset, labels, index, value):# 根據(jù)特征所在的位置index和特征的值value,從原數(shù)據(jù)集中分割出那些值等于value的子集和標(biāo)簽子集sub_dataset = []sub_labels = []fc_index = 0for fc in dataset:if fc[index] == value:# 如果遇到了值相等的,那么把這個(gè)索引剔除,然后把剔除該索引之后的特征向量加入到子集中temp = fc[:index]temp.extend(fc[index + 1:])sub_dataset.append(temp)# 把該特征向量對(duì)應(yīng)的標(biāo)簽也挑出來(lái)fc_index += 1return sub_dataset, sub_labelsdef select_best_attribute(dataset, labels):# 選擇最佳屬性,依據(jù)信息增益,即找到信息增益最大的屬性feature_num = len(dataset[0]) # 特征個(gè)數(shù)base_entropy = calc_entropy(labels) # 當(dāng)前數(shù)據(jù)集的信息熵max_info_gain = -1 # 最大信息增益best_feature = -1 # 最佳的特征所在的索引for i in range(feature_num):# 當(dāng)前特征位置上所有值的Listfeature_value_list = [example[i] for example in dataset]# 獲取所有可能的值(不重復(fù))unique_vals = set(feature_value_list)# 此特征的信息熵new_entropy = 0.0for value in unique_vals:# 獲取子集sub_dataset, sub_labels = split_dataset(dataset, i, value)# 子集占的比例prob = float(len(sub_dataset)) / len(dataset)# new_entropy加上相應(yīng)的部分new_entropy += prob * calc_entropy(sub_labels)# 計(jì)算當(dāng)前特征的信息增益info_gain = base_entropy - new_entropyif info_gain > max_info_gain:# 如果比best_info_gain高,那么更新best_info_gain和best_featuremax_info_gain = info_gainbest_feature = ireturn best_featuredef majority_count(labels):# 選出所占比例最高的labellabel_count = {}for vote in labels:if vote not in label_count.keys():label_count[vote] = 0label_count[vote] += 1sorted_class_count = sorted(label_count.iteritem(), key=operator.itemgetter(1), reverse=True)return sorted_class_countdef decision_tree(dataset, feature_names, labels):if labels.count(labels[0]) == len(labels):# label中所有元素都相等,及類別完全相同,停止劃分return labels[0]if len(dataset[0]) == 1:# 如果只有一個(gè)特征return majority_count(labels)# 選出根節(jié)點(diǎn)的最最佳屬性best_feature_index = select_best_attribute(dataset, labels)best_feature_name = feature_names[best_feature_index]tree = {best_feature_name: {}}del (feature_names[best_feature_index])attr_values = [example[best_feature_index] for example in dataset]unique_vals = set(attr_values)for value in unique_vals:sub_dataset, sub_labels = split_dataset(dataset, best_feature_index, value)tree[best_feature_name][value] = decision_tree(sub_dataset, sub_labels)return tree總結(jié)
以上是生活随笔為你收集整理的机器学习理论入门:第二章 经典监督学习算法-决策树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习理论入门:第一章 监督学习与非监
- 下一篇: 交互式计算机图形学总结:第三章 几何对象