1. 程式人生 > >python 實現周志華 機器學習書中的決策樹 c3.0

python 實現周志華 機器學習書中的決策樹 c3.0

hello,上篇文章實現的是svm

本文實現決策樹演算法。主要是依照周志華那本機器學習的書籍,進行實現。


其中紅色部分我未寫。因為我在選擇屬性劃分的時候,不可能導致資料集為空。所以這部分對我來說沒有必要了

這裡是用字典來儲存樹,開始還準備用list,發現字典要好些,但是我沒有畫圖。如果需要就自己去畫吧,我就不畫了。

具體程式碼如下:

# coding=utf-8
import pprint
import uniout
import math
from collections import Counter

'''
@author :chenyuqing
@mail   :[email protected]
''' from numpy import * def load_data(path): ''' :param path:傳遞路徑,返回樣例的資料和標籤,格式採用矩陣,便於進行矩陣運算 :return: ''' data_set=[] label_set=[] file_object=open(path) for line in file_object.readlines(): lineArr = line.strip().split(',') label_set.append(lineArr[-1]) #最後一列預設為標記
data_set.append(lineArr) #這裡提取三個部分:屬性集、標籤集、資料集 attri_set=array(data_set[0])[1:-1] data_set=array(data_set)[1:,1:-1] label_set=array(label_set)[1:] return data_set,label_set,attri_set def is_same_class(label_set): ''' :param label_set: :return:#判斷節點中是否是同一類 ''' if len(unique(label_set))==1
: return True return False def info_entropy(label_set): ''' :param data_set: :return:計算資訊熵,資訊熵越小,純度越高,全部為一個型別,則資訊熵為0 ''' info_entro=0 #設定初始資訊熵為0 class_set=unique(label_set) #得到有幾類 for item in class_set: tempsult=0 for sample_item in label_set: if(item==sample_item): tempsult=tempsult+1 ratio=float(tempsult)/len(label_set) info_entro =info_entro+ratio*math.log(ratio,2) info_entro=0-info_entro return info_entro def info_gain(data_set,label_set,attri_set): ''' :param data_set: :param label_set: :param attri_set: :return:計算資訊增益, 返回資訊增益最大的那個屬性 ''' data_set=array(data_set) #必須將list轉換成array root_info_entro=info_entropy(label_set=label_set) #計算根節點的資訊熵 m,n=shape(data_set) result_gain=[] for i in range(n): #對給出的資料,每個特徵計算資訊增益 i_gain=0 #設定初始的資訊增益為0 col_data=data_set[:,i] #提取第i列資料 col_attr=unique(col_data) #一個特徵有幾個屬性 for item_attr in col_attr: label_set_attr=[] #初始化當前的標籤結果為空 for j in range(len(col_data)): if(item_attr==col_data[j]): label_set_attr.append(label_set[j]) attr_entropy=info_entropy(label_set_attr) ratio=float(len(label_set_attr))/len(col_data) i_gain=i_gain+ratio*attr_entropy i_gain=root_info_entro-i_gain result_gain.append(i_gain) print result_gain return result_gain.index(max(result_gain)) def is_repeat(data_set): ''' :param data_set: :return:判斷陣列是否是重複元素 ''' data_set=array(data_set) #必須將list轉換成array m,n=shape(data_set) for i in range(n): if len(unique(data_set[:,i]))<>1: return False return True def TreeGenerate(data_set,label_set,attri_set): ''' :param data_set: :param label_set: :param attri_set: :return:返回生成的決策樹,採用list來表示決策樹 ''' data_set=array(data_set) #必須將list轉換成array if(is_same_class(label_set=label_set)): return list(unique(label_set)) #這裡轉換成list,主要是為了好看 if(len(attri_set)==0 or is_repeat(data_set)):#如果屬性集合為空或者資料集合一致,將節點標記為葉子節點,標記為做多的類 return list(Counter(label_set).keys()[0]) attr_num=info_gain(data_set,label_set,attri_set)#得到那一列作為最優劃分 col_set=data_set[:,attr_num] col_uni=unique(col_set) #最優劃分屬性的每個取值都要新增 print "本次選擇的劃分屬性為:%s"%attri_set[attr_num] bestFeatLabel = attri_set[attr_num] myTree = {bestFeatLabel:{}} m,n =shape(data_set) attri_set_temp=attri_set[attri_set<>attri_set[attr_num]] #屬性這一列剔除掉劃分屬性 for item in col_uni: data_set_temp=[] label_set_temp=[] for i in range(m): if(item==data_set[i,attr_num]): data_set_temp.append([data_set[i][k] for k in range(len(data_set[i])) if k!=attr_num ]) #將這個樣本放入到下一個資料集中,樣本也要把這列刪除 label_set_temp.append(label_set[i]) myTree[bestFeatLabel][item]=TreeGenerate(data_set=data_set_temp,label_set=label_set_temp,attri_set=attri_set_temp) return myTree if __name__ == '__main__': print("------------my desion tree-----------") path=u"./西瓜資料集2.0.txt" data_set,label_set,attri_set=load_data(path=path) result=TreeGenerate(data_set=data_set,label_set=label_set,attri_set=attri_set) print("-------------the result tree is ------------") pprint.pprint(result)

西瓜資料集2.0如下:

編號,色澤,根蒂,敲聲,紋理,臍部,觸感,好瓜
1,青綠,蜷縮,濁響,清晰,凹陷,硬滑,是
2,烏黑,蜷縮,沉悶,清晰,凹陷,硬滑,是
3,烏黑,蜷縮,濁響,清晰,凹陷,硬滑,是
4,青綠,蜷縮,沉悶,清晰,凹陷,硬滑,是
5,淺白,蜷縮,濁響,清晰,凹陷,硬滑,是
6,青綠,稍蜷,濁響,清晰,稍凹,軟粘,是
7,烏黑,稍蜷,濁響,稍糊,稍凹,軟粘,是
8,烏黑,稍蜷,濁響,清晰,稍凹,硬滑,是
9,烏黑,稍蜷,沉悶,稍糊,稍凹,硬滑,否
10,青綠,硬挺,清脆,清晰,平坦,軟粘,否
11,淺白,硬挺,清脆,模糊,平坦,硬滑,否
12,淺白,蜷縮,濁響,模糊,平坦,軟粘,否
13,青綠,稍蜷,濁響,稍糊,凹陷,硬滑,否
14,淺白,稍蜷,沉悶,稍糊,凹陷,硬滑,否
15,烏黑,稍蜷,濁響,清晰,稍凹,軟粘,否
16,淺白,蜷縮,濁響,模糊,平坦,硬滑,否
17,青綠,蜷縮,沉悶,稍糊,稍凹,硬滑,否

得到的結果如下:

-------------the result tree is ------------
{'紋理': {'模糊': ['否'],
                              '清晰': {'根蒂': {'硬挺': ['否'],
                                                                                        '稍蜷': {'色澤': {'烏黑': {'觸感': {'硬滑': ['是'],
                                                                                                                                                                                                            '軟粘': ['否']}},
                                                                                                                                                  '青綠': ['是']}},
                                                                                        '蜷縮': ['是']}},
                              '稍糊': {'觸感': {'硬滑': ['否'],
                                                                                        '軟粘': ['是']}}}}


Process finished with exit code 0

相關推薦

python 實現 機器習書 k-means 演算法

hello,all 上節採用python實現了決策樹,本節使用python實現k-means演算法,後一節將會採用map-reduce實現k-means演算法 演算法程式如下: 演算法程式碼如下: # coding=utf-8 import pprint import

python 實現 機器習書決策 c3.0

hello,上篇文章實現的是svm 本文實現決策樹演算法。主要是依照周志華那本機器學習的書籍,進行實現。 其中紅色部分我未寫。因為我在選擇屬性劃分的時候,不可能導致資料集為空。所以這部分對我來說沒有必要了 這裡是用字典來儲存樹,開始還準備用list,發現字典要好些,但是我

python實現西瓜書《機器學習》習題3.5LDA判別

本題感謝大神 https://blog.csdn.net/Snoopy_Yuan/article/details/64443841 #抄https://blog.csdn.net/Snoopy_Yuan/article/details/64443841 import numpy as n

python實現西瓜書《機器學習》習題3.4 對比10折交叉驗證和留一法的對率迴歸錯誤率

這道題仍然在抄大神程式碼的基礎上寫註釋,首先感謝原始碼: https://blog.csdn.net/Snoopy_Yuan/article/details/64131129 感想是:sklearn是個好東西,如果沒有現成的驗證方法,光是10折驗證就要造10個表格才行,而用現成的庫,一

python實現西瓜書《機器學習》習題3.3對數機率迴歸

python小白入手,第一個程式。 首先感謝大牛的原始碼: https://blog.csdn.net/onthewaygogoing/article/details/68485682 大牛的思路很巧妙,把矩陣操作轉化成列表操作,時刻保證列表代表的矩陣維度一致。 我

機器學習》()第4章 決策 筆記 理論及實現——“西瓜

取數據 dataset 結點 (六) eight dot 都是 ret 集合 參考書籍:《機器學習》(周誌華) 說 明:本篇內容為讀書筆記,主要參考教材為《機器學習》(周誌華)。詳細內容請參閱書籍——第4章 決策樹。部分內容參考網絡資源

(二)《機器學習》()第4章 決策 筆記 理論及實現——“西瓜”——CART決策

cati create def __main__ element iuc 文件 取數 min CART決策樹 (一)《機器學習》(周誌華)第4章 決策樹 筆記 理論及實現——“西瓜樹” 參照上一篇ID3算法實現的決策樹(點擊上面鏈接直達),進一步實現CART決策樹。 其實

機器學習總結

Lecture3 線性模型 基本形式 一般向量形式: 優點: 線性迴歸 廣義線性模型 對數機率迴歸 由對數機率函式確定 $\boldsymbol{\omega}$ 和 $b$

機器學習 筆記

第1章 1.4歸納偏好 學習演算法自身的歸納偏好與問題是否相配,往往會起到決定作用。 對於上面這句話:你的輸入資料被怎麼處理,最終得到什麼結果,我認為偏好指的就是這個處理的過程。線性非線性?那些feature忽略掉?怎麼利用這些資料?更具體一些,你用網路處理,還是傳統方法,資料的分佈和你

機器學習 效能度量

2.5 效能度量 效能度量(performance measure)是衡量模型泛化能力的評價標準,在對比不同模型的能力時,使用不同的效能度量往往會導致不同的評判結果。本節除2.5.1外,其它主要介紹分類模型的效能度量。 2.5.1 最常見的效能度量 在迴歸任務中,即預測連續值的問題,最常

機器學習

盜用weka 緒論 1.2基本術語 學習任務大致分為兩類: 監督學習:分類、迴歸 無監督學習:聚類 泛化:訓練得到的模型適用於新樣本的能力 機器學習領域最重要的國際學術會議是國際機器學習會議 (ICML)、國

機器學習筆記

http://blog.sina.cn/dpool/blog/s/blog_cfa68e330102ycy9.html?md=gd https://www.cnblogs.com/shiwanghualuo/p/7192678.html 首先的階段由卷積層和池化層組成,卷積的節點組織在特徵對映塊

[機器學習]ID3決策 詳細計算流程 機器學習 筆記 原創Excel手算方法

1.用到的主要三條熵公式: 1.1 資訊熵 詳情見夏農資訊理論 概率越平衡 事件所含有的資訊量越大 1.2 條件熵 代表某一屬性下不同分類的資訊熵之和 1.3 資訊增益 等於資訊熵減去條件熵,從數值上,越大的資訊增益在資訊熵一定的情況下,代表條件熵越小,條件熵越

-機器學習-筆記(五)- 強化學習

#### 任務與獎賞 ####   “強化學習”(reinforcement learning)可以講述為在任務過程中不斷摸索,然後總結出較好的完成任務策略。   強化學習任務通常用馬爾可夫決策過程(Markov Decision Process,簡稱M

機器學習筆記(一)

新人一枚,既是機器學習的初學者,也是首次發部落格。謹以此記錄我的學習體會,做一些總結。望與大家共同學習、共同進步。文中若有內容錯誤或有措詞不嚴謹之處,望大家不吝指出。謝謝! 機器學習中的基本概念 基本術語 根據上圖我們可以用一個三維空間來了解以

機器學習讀後總結 第10、11章

降維與度量學習 什麼是降維學習 降維是一種分類演算法,它是一種解決維數災難的重要途徑。例如二維資料經過投影變為一維資料從而更好的表徵資料的特徵,然後再進行識別;這就利用了降維的方法。 K鄰近學習 k近鄰學習是一種監督學習演算法,它給定測試樣本,基於某種距離度量找出與訓練集

機器學習讀後總結 第三章

線性模型 基本形式 線性模型試圖學得一個通過屬性的線性組合來進行預測的函式,即f(x)=w1x1+w2x2+…+wdxd+b,w和b學得之後,模型就得以確定,而w直觀表達了各屬性在預測中的重要性。線性迴歸 線性迴歸試圖學得一個線性模型以儘可能準確的預測實值輸出標記。線性迴歸

機器學習讀後總結 第12、13章

計算學習理論 什麼是計算學習理論 計算學習理論是關於機器學習的理論基礎,其目的是分析學習任務的困難本質,為學習演算法提供理論保證,並根據分析結果指導演算法設計。泛化誤差和經驗誤差是計算學習理論的兩個重要概念,現實中我們常用經驗誤差作為泛化誤差的近擬。 PAC學習 PAC學

【用python實現《統計學習方法》】之決策C4.5/ID3

宣告:本文根據李航博士的《統計學校方法》中的決策樹章節的原理:最大熵資訊增益、資訊增益比進行決策樹的實現。在視覺化方面主要參考的這篇博文。 決策樹演算法是一類在資料探勘中應用的特別多的符號學派分類器,並在整合學習中被大大采用。經典的c4.5和id3以及後來的c

機器學習》 學習筆記第四章 決策(課後習題)python 實現

一、基本內容 1.基本流程 決策樹的生成過程是一個遞迴過程,有三種情形會導致遞迴返回 (1)當前節點包含的yangben全屬於同一類別,無需劃分; (2)當前屬性集為空,或是所有yangben在所有屬性上的取值相同,無法劃分; (3)當前結點包含的yangben集合為空,不能