大約一年,我沒有照顧的博客,再次拿起筆不知從何寫上,想來想去手從最近使用Weka要正確書寫。算法
Weka爲一個Java基礎上的機器學習工具。上手簡單,並提供圖形化界面。提供如分類、聚類、頻繁項挖掘等工具。本篇文章主要寫一下分類器算法中的J48算法及事實上現。數據結構
1、算法機器學習
J48是基於C4.5實現的決策樹算法。對於C4.5算法相關資料太多了。筆者在這裏轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)工具
C4.5是一系列用在機器學習和數據挖掘的分類問題中的算法。學習
它的目標是監督學習:給定一個數據集,當中的每一個元組都能用一組屬性值來描寫敘述,每一個元組屬於一個相互排斥的類別中的某一類。C4.5的目標是經過學習。找到一個從屬性值到類別的映射關係,並且這個映射能用於對新的類別未知的實體進行分類。ui
C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3算法用來構造決策樹。決策樹是一種相似流程圖的樹結構,當中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝表明一個測試輸出。而每個樹葉節點存放一個類標號。一旦創建好了決策樹。對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放着該元組的預測。決策樹的優點在於不需要不論什麼領域知識或參數設置。適合於探測性的知識發現。spa
從ID3算法中衍生出了C4.5和CART兩種算法。這兩種算法在數據挖掘中都很重要。下圖就是一棵典型的C4.5算法對數據集產生的決策樹。.net
數據集如圖1所看到的。它表示的是天氣狀況與去不去打高爾夫球之間的關係。對象
圖1 數據集blog
圖2 在數據集上經過C4.5生成的決策樹
算法描寫敘述
C4.5並不一個算法,而是一組算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的算法將給出C4.5的基本工做流程:
圖3 C4.5算法流程
咱們可能有疑問,一個元組自己有很是多屬性,咱們怎麼知道首先要對哪一個屬性進行推斷,接下來要對哪一個屬性進行推斷?換句話說,在圖2中,咱們怎麼知道第一個要測試的屬性是Outlook,而不是Windy?事實上,能回答這些問題的一個概念就是屬性選擇度量。
屬性選擇度量
屬性選擇度量又稱分裂規則,因爲它們決定給定節點上的元組怎樣分裂。屬性選擇度量提供了每個屬性描寫敘述給定訓練元組的秩評定。具備最好度量得分的屬性被選做給定元組的分裂屬性。眼下比較流行的屬性選擇度量有--信息增益、增益率和Gini指標。
先作一些若是,設D是類標記元組訓練集,類標號屬性具備m個不一樣值,m個不一樣類Ci(i=1,2,…,m),CiD是D中Ci類的元組的集合,|D|和|CiD|各自是D和CiD中的元組個數。
(1)信息增益
信息增益其實是ID3算法中用來進行屬性選擇度量的。它選擇具備最高信息增益的屬性來做爲節點N的分裂屬性。該屬性使結果劃分中的元組分類所需信息量最小。對D中的元組分類所需的指望信息爲下式:
Info(D)又稱爲熵。
現在假定依照屬性A劃分D中的元組,且屬性A將D劃分紅v個不一樣的類。
在該劃分以後,爲了獲得準確的分類還需要的信息由如下的式子度量:
信息增益定義爲原來的信息需求(即僅基於類比例)與新需求(即對A劃分以後獲得的)之間的差。即
我想很是多人看到這個地方都認爲不是很是好理解,因此我本身的研究了文獻中關於這一塊的描寫敘述,也對照了上面的三個公式。如下說說我本身的理解。
通常說來。對於一個具備多個屬性的元組,用一個屬性就將它們全然分開差點兒不可能,不然的話。決策樹的深度就僅僅能是2了。從這裏可以看出,一旦咱們選擇一個屬性A,若是將元組分紅了兩個部分A1和A2,由於A1和A2還可以用其餘屬性接着再分,因此又引出一個新的問題:接下來咱們要選擇哪一個屬性來分類?對D中元組分類所需的指望信息是Info(D) ,那麼同理,當咱們經過A將D劃分紅v個子集Dj(j=1,2,…,v)以後。咱們要對Dj的元組進行分類,需要的指望信息就是Info(Dj),而一共同擁有v個類。因此對v個集合再分類,需要的信息就是公式(2)了。由此可知,假設公式(2)越小,是否是意味着咱們接下來對A分出來的幾個集合再進行分類所需要的信息就越小?而對於給定的訓練集,實際上Info(D)已經固定了,因此選擇信息增益最大的屬性做爲分裂點。
但是。使用信息增益的話事實上是有一個缺點,那就是它偏向於具備大量值的屬性。
什麼意思呢?就是說在訓練集中。某個屬性所取的不一樣值的個數越多。那麼越有可能拿它來做爲分裂屬性。
好比一個訓練集中有10個元組,對於某一個屬相A,它分別取1-10這十個數,假設對A進行分裂將會分紅10個類。那麼對於每一個類Info(Dj)=0,從而式(2)爲0,該屬性劃分所獲得的信息增益(3)最大,但是很是顯然,這樣的劃分沒有意義。
(2)信息增益率
正是基於此,ID3後面的C4.5採用了信息增益率這樣一個概念。信息增益率使用「分裂信息」值將信息增益規範化。分類信息相似於Info(D),定義例如如下:
這個值表示經過將訓練數據集D劃分紅相應於屬性A測試的v個輸出的v個劃分產生的信息。信息增益率定義:
選擇具備最大增益率的屬性做爲分裂屬性。
2、算法說明
(1)咱們是要構造一個決策樹。很是天然地,樹的每一層表明一個屬性的取值,最後的葉子節點指向劃分的類。
如圖二所看到的。
(2)所以很是天然的問題就是怎樣在每一層選擇合適的節點去構造這個樹使這個樹的結構儘量最優,也就是查找路徑儘量的短。
(3)所以最關鍵的問題就是怎樣在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。
(4)當中ID3算法選擇最優節點的方式是:選出信息增益增益最高的屬性。信息增益可以簡單理解成使用某個屬性劃分後,不肯定性的下降量。
(5)而C4.5算法作了一個改進。使用信息增益率最高的屬性,這樣作的優勢是,可以避免樹過寬。
(6)構建好了樹以後還要進行一些剪枝的操做,固然這個不體現在算法主流行裏。也沒有作強求。但可以注意一下Weka是怎樣實現的。
3、算法中用到的主要數據結構
(1)Instances對象
一個Instances表明一張表。可以相應一個arff文件或者是一個csv文件,經過Instances對象可以取某一列的均值方差等,主要就是若干行記錄的一個封裝。
(2)Instance
一個Instance表明一行記錄。換言之中的一個個Instances的數據包括多個Instance。每個Instance會有一個特殊的列ClassIndex,該列值表明該Instance屬於哪一類。詳細來講就是圖一里面的Golf。
(3)Classifier接口
Weka中每一個分類器都繼承與這個接口(儘管從意義上來講是個接口但事實上是個子類)。該接口提供一個buildClassifier方法傳入一個Instances對象用於訓練。還有classifyInstance方法用於傳入一個Instance來推斷其屬於哪一個類。
(4)J48
分類器主類,實現了Classifier接口。
(5)ClassifierTree接口
表明樹中的一個節點。維護和組成樹的結構。當中J48用到的是C45PruneableClassifierTree和PruneableClassifierTree。
(6)ModelSelection接口
該接口負責推斷和選取最優的屬性。而後依據該屬性將不一樣的Instance放到不一樣的subset中,ClassifierTree接口使用ModelSelection來生成樹的結構。
這樣的抽象方式仍是很是值得學習的。J48中用到的該接口的實現有BinC45ModelSelection和C45ModelSelection,經過名字大概也能看出來前一個是生成二叉樹(即每個節點僅僅含有是否兩種回答)。後一個是生成標準的C45樹。
未完待續。。
。。。
。