weka J48決策樹學習

hnsd983704669發表於2015-06-10

Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。


一、演算法

J48是基於C4.5實現的決策樹演算法,對於C4.5演算法相關資料太多了,筆者在這裡轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)

 C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個資料集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的對映關係,並且這個對映能用於對新的類別未知的實體進行分類。

    C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或引數設定,適合於探測性的知識發現。

    從ID3演算法中衍生出了C4.5和CART兩種演算法,這兩種演算法在資料探勘中都非常重要。下圖就是一棵典型的C4.5演算法對資料集產生的決策樹。

資料集如圖1所示,它表示的是天氣情況與去不去打高爾夫球之間的關係。

image

圖1  資料集

        image

        圖2   在資料集上通過C4.5生成的決策樹

    演算法描述

    C4.5並不一個演算法,而是一組演算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的演算法將給出C4.5的基本工作流程:

    image

    圖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中的元組分類所需的期望資訊為下式:

        image (1)

Info(D)又稱為熵。

    現在假定按照屬性A劃分D中的元組,且屬性A將D劃分成v個不同的類。在該劃分之後,為了得到準確的分類還需要的資訊由下面的式子度量:

        image       (2)

    資訊增益定義為原來的資訊需求(即僅基於類比例)與新需求(即對A劃分之後得到的)之間的差,即

        image       (3)

    我想很多人看到這個地方都覺得不是很好理解,所以我自己的研究了文獻中關於這一塊的描述,也對比了上面的三個公式,下面說說我自己的理解。

    一般說來,對於一個具有多個屬性的元組,用一個屬性就將它們完全分開幾乎不可能,否則的話,決策樹的深度就只能是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),定義如下:

        image    (4)

這個值表示通過將訓練資料集D劃分成對應於屬性A測試的v個輸出的v個劃分產生的資訊。資訊增益率定義:

        image         (5)

選擇具有最大增益率的屬性作為分裂屬性。


二、演算法說明

(1)我們是要構造一個決策樹,很自然地,樹的每一層代表一個屬性的取值,最後的葉子節點指向劃分的類。如圖二所示。

(2)因此很自然的問題就是如何在每一層選擇合適的節點去構造這個樹使這個樹的結構儘可能最優,也就是查詢路徑儘可能的短。

(3)因此最關鍵的問題就是如何在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。

(4)其中ID3演算法選擇最優節點的方式是:選出資訊增益增益最高的屬性。資訊增益可以簡單理解成使用某個屬性劃分後,不確定性的減少量。

(5)而C4.5演算法做了一個改進,使用資訊增益最高的屬性,這樣做的好處是,可以避免樹過寬。

(6)構建好了樹之後還要進行一些剪枝的操作,當然這個不體現在演算法主流行裡,也沒有做強求,但可以注意一下Weka是如何實現的。


三、演算法中用到的主要資料結構

(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樹。


http://blog.csdn.net/roger__wong/article/details/38987639

Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。


一、演算法

J48是基於C4.5實現的決策樹演算法,對於C4.5演算法相關資料太多了,筆者在這裡轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)

 C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個資料集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的對映關係,並且這個對映能用於對新的類別未知的實體進行分類。

    C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或引數設定,適合於探測性的知識發現。

    從ID3演算法中衍生出了C4.5和CART兩種演算法,這兩種演算法在資料探勘中都非常重要。下圖就是一棵典型的C4.5演算法對資料集產生的決策樹。

資料集如圖1所示,它表示的是天氣情況與去不去打高爾夫球之間的關係。

image

圖1  資料集

        image

        圖2   在資料集上通過C4.5生成的決策樹

    演算法描述

    C4.5並不一個演算法,而是一組演算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的演算法將給出C4.5的基本工作流程:

    image

    圖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中的元組分類所需的期望資訊為下式:

        image (1)

Info(D)又稱為熵。

    現在假定按照屬性A劃分D中的元組,且屬性A將D劃分成v個不同的類。在該劃分之後,為了得到準確的分類還需要的資訊由下面的式子度量:

        image       (2)

    資訊增益定義為原來的資訊需求(即僅基於類比例)與新需求(即對A劃分之後得到的)之間的差,即

        image       (3)

    我想很多人看到這個地方都覺得不是很好理解,所以我自己的研究了文獻中關於這一塊的描述,也對比了上面的三個公式,下面說說我自己的理解。

    一般說來,對於一個具有多個屬性的元組,用一個屬性就將它們完全分開幾乎不可能,否則的話,決策樹的深度就只能是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),定義如下:

        image    (4)

這個值表示通過將訓練資料集D劃分成對應於屬性A測試的v個輸出的v個劃分產生的資訊。資訊增益率定義:

        image         (5)

選擇具有最大增益率的屬性作為分裂屬性。


二、演算法說明

(1)我們是要構造一個決策樹,很自然地,樹的每一層代表一個屬性的取值,最後的葉子節點指向劃分的類。如圖二所示。

(2)因此很自然的問題就是如何在每一層選擇合適的節點去構造這個樹使這個樹的結構儘可能最優,也就是查詢路徑儘可能的短。

(3)因此最關鍵的問題就是如何在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。

(4)其中ID3演算法選擇最優節點的方式是:選出資訊增益增益最高的屬性。資訊增益可以簡單理解成使用某個屬性劃分後,不確定性的減少量。

(5)而C4.5演算法做了一個改進,使用資訊增益最高的屬性,這樣做的好處是,可以避免樹過寬。

(6)構建好了樹之後還要進行一些剪枝的操作,當然這個不體現在演算法主流行裡,也沒有做強求,但可以注意一下Weka是如何實現的。


三、演算法中用到的主要資料結構

(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樹。


http://blog.csdn.net/roger__wong/article/details/38987639

Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。


一、演算法

J48是基於C4.5實現的決策樹演算法,對於C4.5演算法相關資料太多了,筆者在這裡轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)

 C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個資料集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的對映關係,並且這個對映能用於對新的類別未知的實體進行分類。

    C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或引數設定,適合於探測性的知識發現。

    從ID3演算法中衍生出了C4.5和CART兩種演算法,這兩種演算法在資料探勘中都非常重要。下圖就是一棵典型的C4.5演算法對資料集產生的決策樹。

資料集如圖1所示,它表示的是天氣情況與去不去打高爾夫球之間的關係。

image

圖1  資料集

        image

        圖2   在資料集上通過C4.5生成的決策樹

    演算法描述

    C4.5並不一個演算法,而是一組演算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的演算法將給出C4.5的基本工作流程:

    image

    圖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中的元組分類所需的期望資訊為下式:

        image (1)

Info(D)又稱為熵。

    現在假定按照屬性A劃分D中的元組,且屬性A將D劃分成v個不同的類。在該劃分之後,為了得到準確的分類還需要的資訊由下面的式子度量:

        image       (2)

    資訊增益定義為原來的資訊需求(即僅基於類比例)與新需求(即對A劃分之後得到的)之間的差,即

        image       (3)

    我想很多人看到這個地方都覺得不是很好理解,所以我自己的研究了文獻中關於這一塊的描述,也對比了上面的三個公式,下面說說我自己的理解。

    一般說來,對於一個具有多個屬性的元組,用一個屬性就將它們完全分開幾乎不可能,否則的話,決策樹的深度就只能是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),定義如下:

        image    (4)

這個值表示通過將訓練資料集D劃分成對應於屬性A測試的v個輸出的v個劃分產生的資訊。資訊增益率定義:

        image         (5)

選擇具有最大增益率的屬性作為分裂屬性。


二、演算法說明

(1)我們是要構造一個決策樹,很自然地,樹的每一層代表一個屬性的取值,最後的葉子節點指向劃分的類。如圖二所示。

(2)因此很自然的問題就是如何在每一層選擇合適的節點去構造這個樹使這個樹的結構儘可能最優,也就是查詢路徑儘可能的短。

(3)因此最關鍵的問題就是如何在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。

(4)其中ID3演算法選擇最優節點的方式是:選出資訊增益增益最高的屬性。資訊增益可以簡單理解成使用某個屬性劃分後,不確定性的減少量。

(5)而C4.5演算法做了一個改進,使用資訊增益最高的屬性,這樣做的好處是,可以避免樹過寬。

(6)構建好了樹之後還要進行一些剪枝的操作,當然這個不體現在演算法主流行裡,也沒有做強求,但可以注意一下Weka是如何實現的。


三、演算法中用到的主要資料結構

(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樹。


http://blog.csdn.net/roger__wong/article/details/38987639

Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。


一、演算法

J48是基於C4.5實現的決策樹演算法,對於C4.5演算法相關資料太多了,筆者在這裡轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)

 C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個資料集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的對映關係,並且這個對映能用於對新的類別未知的實體進行分類。

    C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或引數設定,適合於探測性的知識發現。

    從ID3演算法中衍生出了C4.5和CART兩種演算法,這兩種演算法在資料探勘中都非常重要。下圖就是一棵典型的C4.5演算法對資料集產生的決策樹。

資料集如圖1所示,它表示的是天氣情況與去不去打高爾夫球之間的關係。

image

圖1  資料集

        image

        圖2   在資料集上通過C4.5生成的決策樹

    演算法描述

    C4.5並不一個演算法,而是一組演算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的演算法將給出C4.5的基本工作流程:

    image

    圖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中的元組分類所需的期望資訊為下式:

        image (1)

Info(D)又稱為熵。

    現在假定按照屬性A劃分D中的元組,且屬性A將D劃分成v個不同的類。在該劃分之後,為了得到準確的分類還需要的資訊由下面的式子度量:

        image       (2)

    資訊增益定義為原來的資訊需求(即僅基於類比例)與新需求(即對A劃分之後得到的)之間的差,即

        image       (3)

    我想很多人看到這個地方都覺得不是很好理解,所以我自己的研究了文獻中關於這一塊的描述,也對比了上面的三個公式,下面說說我自己的理解。

    一般說來,對於一個具有多個屬性的元組,用一個屬性就將它們完全分開幾乎不可能,否則的話,決策樹的深度就只能是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),定義如下:

        image    (4)

這個值表示通過將訓練資料集D劃分成對應於屬性A測試的v個輸出的v個劃分產生的資訊。資訊增益率定義:

        image         (5)

選擇具有最大增益率的屬性作為分裂屬性。


二、演算法說明

(1)我們是要構造一個決策樹,很自然地,樹的每一層代表一個屬性的取值,最後的葉子節點指向劃分的類。如圖二所示。

(2)因此很自然的問題就是如何在每一層選擇合適的節點去構造這個樹使這個樹的結構儘可能最優,也就是查詢路徑儘可能的短。

(3)因此最關鍵的問題就是如何在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。

(4)其中ID3演算法選擇最優節點的方式是:選出資訊增益增益最高的屬性。資訊增益可以簡單理解成使用某個屬性劃分後,不確定性的減少量。

(5)而C4.5演算法做了一個改進,使用資訊增益最高的屬性,這樣做的好處是,可以避免樹過寬。

(6)構建好了樹之後還要進行一些剪枝的操作,當然這個不體現在演算法主流行裡,也沒有做強求,但可以注意一下Weka是如何實現的。


三、演算法中用到的主要資料結構

(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樹。


http://blog.csdn.net/roger__wong/article/details/38987639

Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。


一、演算法

J48是基於C4.5實現的決策樹演算法,對於C4.5演算法相關資料太多了,筆者在這裡轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)

 C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個資料集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的對映關係,並且這個對映能用於對新的類別未知的實體進行分類。

    C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或引數設定,適合於探測性的知識發現。

    從ID3演算法中衍生出了C4.5和CART兩種演算法,這兩種演算法在資料探勘中都非常重要。下圖就是一棵典型的C4.5演算法對資料集產生的決策樹。

資料集如圖1所示,它表示的是天氣情況與去不去打高爾夫球之間的關係。

image

圖1  資料集

        image

        圖2   在資料集上通過C4.5生成的決策樹

    演算法描述

    C4.5並不一個演算法,而是一組演算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的演算法將給出C4.5的基本工作流程:

    image

    圖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中的元組分類所需的期望資訊為下式:

        image (1)

Info(D)又稱為熵。

    現在假定按照屬性A劃分D中的元組,且屬性A將D劃分成v個不同的類。在該劃分之後,為了得到準確的分類還需要的資訊由下面的式子度量:

        image       (2)

    資訊增益定義為原來的資訊需求(即僅基於類比例)與新需求(即對A劃分之後得到的)之間的差,即

        image       (3)

    我想很多人看到這個地方都覺得不是很好理解,所以我自己的研究了文獻中關於這一塊的描述,也對比了上面的三個公式,下面說說我自己的理解。

    一般說來,對於一個具有多個屬性的元組,用一個屬性就將它們完全分開幾乎不可能,否則的話,決策樹的深度就只能是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),定義如下:

        image    (4)

這個值表示通過將訓練資料集D劃分成對應於屬性A測試的v個輸出的v個劃分產生的資訊。資訊增益率定義:

        image         (5)

選擇具有最大增益率的屬性作為分裂屬性。


二、演算法說明

(1)我們是要構造一個決策樹,很自然地,樹的每一層代表一個屬性的取值,最後的葉子節點指向劃分的類。如圖二所示。

(2)因此很自然的問題就是如何在每一層選擇合適的節點去構造這個樹使這個樹的結構儘可能最優,也就是查詢路徑儘可能的短。

(3)因此最關鍵的問題就是如何在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。

(4)其中ID3演算法選擇最優節點的方式是:選出資訊增益增益最高的屬性。資訊增益可以簡單理解成使用某個屬性劃分後,不確定性的減少量。

(5)而C4.5演算法做了一個改進,使用資訊增益最高的屬性,這樣做的好處是,可以避免樹過寬。

(6)構建好了樹之後還要進行一些剪枝的操作,當然這個不體現在演算法主流行裡,也沒有做強求,但可以注意一下Weka是如何實現的。


三、演算法中用到的主要資料結構

(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樹。


http://blog.csdn.net/roger__wong/article/details/38987639
轉載自

Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。


一、演算法

J48是基於C4.5實現的決策樹演算法,對於C4.5演算法相關資料太多了,筆者在這裡轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)

 C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個資料集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的對映關係,並且這個對映能用於對新的類別未知的實體進行分類。

    C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或引數設定,適合於探測性的知識發現。

    從ID3演算法中衍生出了C4.5和CART兩種演算法,這兩種演算法在資料探勘中都非常重要。下圖就是一棵典型的C4.5演算法對資料集產生的決策樹。

資料集如圖1所示,它表示的是天氣情況與去不去打高爾夫球之間的關係。

image

圖1  資料集

        image

        圖2   在資料集上通過C4.5生成的決策樹

    演算法描述

    C4.5並不一個演算法,而是一組演算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的演算法將給出C4.5的基本工作流程:

    image

    圖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中的元組分類所需的期望資訊為下式:

        image (1)

Info(D)又稱為熵。

    現在假定按照屬性A劃分D中的元組,且屬性A將D劃分成v個不同的類。在該劃分之後,為了得到準確的分類還需要的資訊由下面的式子度量:

        image       (2)

    資訊增益定義為原來的資訊需求(即僅基於類比例)與新需求(即對A劃分之後得到的)之間的差,即

        image       (3)

    我想很多人看到這個地方都覺得不是很好理解,所以我自己的研究了文獻中關於這一塊的描述,也對比了上面的三個公式,下面說說我自己的理解。

    一般說來,對於一個具有多個屬性的元組,用一個屬性就將它們完全分開幾乎不可能,否則的話,決策樹的深度就只能是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),定義如下:

        image    (4)

這個值表示通過將訓練資料集D劃分成對應於屬性A測試的v個輸出的v個劃分產生的資訊。資訊增益率定義:

        image         (5)

選擇具有最大增益率的屬性作為分裂屬性。


二、演算法說明

(1)我們是要構造一個決策樹,很自然地,樹的每一層代表一個屬性的取值,最後的葉子節點指向劃分的類。如圖二所示。

(2)因此很自然的問題就是如何在每一層選擇合適的節點去構造這個樹使這個樹的結構儘可能最優,也就是查詢路徑儘可能的短。

(3)因此最關鍵的問題就是如何在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。

(4)其中ID3演算法選擇最優節點的方式是:選出資訊增益增益最高的屬性。資訊增益可以簡單理解成使用某個屬性劃分後,不確定性的減少量。

(5)而C4.5演算法做了一個改進,使用資訊增益最高的屬性,這樣做的好處是,可以避免樹過寬。

(6)構建好了樹之後還要進行一些剪枝的操作,當然這個不體現在演算法主流行裡,也沒有做強求,但可以注意一下Weka是如何實現的。


三、演算法中用到的主要資料結構

(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樹。


http://blog.csdn.net/roger__wong/article/details/38987639

Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。


一、演算法

J48是基於C4.5實現的決策樹演算法,對於C4.5演算法相關資料太多了,筆者在這裡轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)

 C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個資料集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的對映關係,並且這個對映能用於對新的類別未知的實體進行分類。

    C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或引數設定,適合於探測性的知識發現。

    從ID3演算法中衍生出了C4.5和CART兩種演算法,這兩種演算法在資料探勘中都非常重要。下圖就是一棵典型的C4.5演算法對資料集產生的決策樹。

資料集如圖1所示,它表示的是天氣情況與去不去打高爾夫球之間的關係。

image

圖1  資料集

        image

        圖2   在資料集上通過C4.5生成的決策樹

    演算法描述

    C4.5並不一個演算法,而是一組演算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的演算法將給出C4.5的基本工作流程:

    image

    圖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中的元組分類所需的期望資訊為下式:

        image (1)

Info(D)又稱為熵。

    現在假定按照屬性A劃分D中的元組,且屬性A將D劃分成v個不同的類。在該劃分之後,為了得到準確的分類還需要的資訊由下面的式子度量:

        image       (2)

    資訊增益定義為原來的資訊需求(即僅基於類比例)與新需求(即對A劃分之後得到的)之間的差,即

        image       (3)

    我想很多人看到這個地方都覺得不是很好理解,所以我自己的研究了文獻中關於這一塊的描述,也對比了上面的三個公式,下面說說我自己的理解。

    一般說來,對於一個具有多個屬性的元組,用一個屬性就將它們完全分開幾乎不可能,否則的話,決策樹的深度就只能是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),定義如下:

        image    (4)

這個值表示通過將訓練資料集D劃分成對應於屬性A測試的v個輸出的v個劃分產生的資訊。資訊增益率定義:

        image         (5)

選擇具有最大增益率的屬性作為分裂屬性。


二、演算法說明

(1)我們是要構造一個決策樹,很自然地,樹的每一層代表一個屬性的取值,最後的葉子節點指向劃分的類。如圖二所示。

(2)因此很自然的問題就是如何在每一層選擇合適的節點去構造這個樹使這個樹的結構儘可能最優,也就是查詢路徑儘可能的短。

(3)因此最關鍵的問題就是如何在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。

(4)其中ID3演算法選擇最優節點的方式是:選出資訊增益增益最高的屬性。資訊增益可以簡單理解成使用某個屬性劃分後,不確定性的減少量。

(5)而C4.5演算法做了一個改進,使用資訊增益最高的屬性,這樣做的好處是,可以避免樹過寬。

(6)構建好了樹之後還要進行一些剪枝的操作,當然這個不體現在演算法主流行裡,也沒有做強求,但可以注意一下Weka是如何實現的。


三、演算法中用到的主要資料結構

(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樹。


http://blog.csdn.net/roger__wong/article/details/38987639

Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。


一、演算法

J48是基於C4.5實現的決策樹演算法,對於C4.5演算法相關資料太多了,筆者在這裡轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)

 C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個資料集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的對映關係,並且這個對映能用於對新的類別未知的實體進行分類。

    C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或引數設定,適合於探測性的知識發現。

    從ID3演算法中衍生出了C4.5和CART兩種演算法,這兩種演算法在資料探勘中都非常重要。下圖就是一棵典型的C4.5演算法對資料集產生的決策樹。

資料集如圖1所示,它表示的是天氣情況與去不去打高爾夫球之間的關係。

image

圖1  資料集

        image

        圖2   在資料集上通過C4.5生成的決策樹

    演算法描述

    C4.5並不一個演算法,而是一組演算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的演算法將給出C4.5的基本工作流程:

    image

    圖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中的元組分類所需的期望資訊為下式:

        image (1)

Info(D)又稱為熵。

    現在假定按照屬性A劃分D中的元組,且屬性A將D劃分成v個不同的類。在該劃分之後,為了得到準確的分類還需要的資訊由下面的式子度量:

        image       (2)

    資訊增益定義為原來的資訊需求(即僅基於類比例)與新需求(即對A劃分之後得到的)之間的差,即

        image       (3)

    我想很多人看到這個地方都覺得不是很好理解,所以我自己的研究了文獻中關於這一塊的描述,也對比了上面的三個公式,下面說說我自己的理解。

    一般說來,對於一個具有多個屬性的元組,用一個屬性就將它們完全分開幾乎不可能,否則的話,決策樹的深度就只能是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),定義如下:

        image    (4)

這個值表示通過將訓練資料集D劃分成對應於屬性A測試的v個輸出的v個劃分產生的資訊。資訊增益率定義:

        image         (5)

選擇具有最大增益率的屬性作為分裂屬性。


二、演算法說明

(1)我們是要構造一個決策樹,很自然地,樹的每一層代表一個屬性的取值,最後的葉子節點指向劃分的類。如圖二所示。

(2)因此很自然的問題就是如何在每一層選擇合適的節點去構造這個樹使這個樹的結構儘可能最優,也就是查詢路徑儘可能的短。

(3)因此最關鍵的問題就是如何在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。

(4)其中ID3演算法選擇最優節點的方式是:選出資訊增益增益最高的屬性。資訊增益可以簡單理解成使用某個屬性劃分後,不確定性的減少量。

(5)而C4.5演算法做了一個改進,使用資訊增益最高的屬性,這樣做的好處是,可以避免樹過寬。

(6)構建好了樹之後還要進行一些剪枝的操作,當然這個不體現在演算法主流行裡,也沒有做強求,但可以注意一下Weka是如何實現的。


三、演算法中用到的主要資料結構

(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樹。


http://blog.csdn.net/roger__wong/article/details/38987639

Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。


一、演算法

J48是基於C4.5實現的決策樹演算法,對於C4.5演算法相關資料太多了,筆者在這裡轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)

 C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個資料集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的對映關係,並且這個對映能用於對新的類別未知的實體進行分類。

    C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或引數設定,適合於探測性的知識發現。

    從ID3演算法中衍生出了C4.5和CART兩種演算法,這兩種演算法在資料探勘中都非常重要。下圖就是一棵典型的C4.5演算法對資料集產生的決策樹。

資料集如圖1所示,它表示的是天氣情況與去不去打高爾夫球之間的關係。

image

圖1  資料集

        image

        圖2   在資料集上通過C4.5生成的決策樹

    演算法描述

    C4.5並不一個演算法,而是一組演算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的演算法將給出C4.5的基本工作流程:

    image

    圖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中的元組分類所需的期望資訊為下式:

        image (1)

Info(D)又稱為熵。

    現在假定按照屬性A劃分D中的元組,且屬性A將D劃分成v個不同的類。在該劃分之後,為了得到準確的分類還需要的資訊由下面的式子度量:

        image       (2)

    資訊增益定義為原來的資訊需求(即僅基於類比例)與新需求(即對A劃分之後得到的)之間的差,即

        image       (3)

    我想很多人看到這個地方都覺得不是很好理解,所以我自己的研究了文獻中關於這一塊的描述,也對比了上面的三個公式,下面說說我自己的理解。

    一般說來,對於一個具有多個屬性的元組,用一個屬性就將它們完全分開幾乎不可能,否則的話,決策樹的深度就只能是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),定義如下:

        image    (4)

這個值表示通過將訓練資料集D劃分成對應於屬性A測試的v個輸出的v個劃分產生的資訊。資訊增益率定義:

        image         (5)

選擇具有最大增益率的屬性作為分裂屬性。


二、演算法說明

(1)我們是要構造一個決策樹,很自然地,樹的每一層代表一個屬性的取值,最後的葉子節點指向劃分的類。如圖二所示。

(2)因此很自然的問題就是如何在每一層選擇合適的節點去構造這個樹使這個樹的結構儘可能最優,也就是查詢路徑儘可能的短。

(3)因此最關鍵的問題就是如何在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。

(4)其中ID3演算法選擇最優節點的方式是:選出資訊增益增益最高的屬性。資訊增益可以簡單理解成使用某個屬性劃分後,不確定性的減少量。

(5)而C4.5演算法做了一個改進,使用資訊增益最高的屬性,這樣做的好處是,可以避免樹過寬。

(6)構建好了樹之後還要進行一些剪枝的操作,當然這個不體現在演算法主流行裡,也沒有做強求,但可以注意一下Weka是如何實現的。


三、演算法中用到的主要資料結構

(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樹。


http://blog.csdn.net/roger__wong/article/details/38987639

Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。


一、演算法

J48是基於C4.5實現的決策樹演算法,對於C4.5演算法相關資料太多了,筆者在這裡轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)

 C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個資料集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的對映關係,並且這個對映能用於對新的類別未知的實體進行分類。

    C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或引數設定,適合於探測性的知識發現。

    從ID3演算法中衍生出了C4.5和CART兩種演算法,這兩種演算法在資料探勘中都非常重要。下圖就是一棵典型的C4.5演算法對資料集產生的決策樹。

資料集如圖1所示,它表示的是天氣情況與去不去打高爾夫球之間的關係。

image

圖1  資料集

        image

        圖2   在資料集上通過C4.5生成的決策樹

    演算法描述

    C4.5並不一個演算法,而是一組演算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的演算法將給出C4.5的基本工作流程:

    image

    圖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中的元組分類所需的期望資訊為下式:

        image (1)

Info(D)又稱為熵。

    現在假定按照屬性A劃分D中的元組,且屬性A將D劃分成v個不同的類。在該劃分之後,為了得到準確的分類還需要的資訊由下面的式子度量:

        image       (2)

    資訊增益定義為原來的資訊需求(即僅基於類比例)與新需求(即對A劃分之後得到的)之間的差,即

        image       (3)

    我想很多人看到這個地方都覺得不是很好理解,所以我自己的研究了文獻中關於這一塊的描述,也對比了上面的三個公式,下面說說我自己的理解。

    一般說來,對於一個具有多個屬性的元組,用一個屬性就將它們完全分開幾乎不可能,否則的話,決策樹的深度就只能是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),定義如下:

        image    (4)

這個值表示通過將訓練資料集D劃分成對應於屬性A測試的v個輸出的v個劃分產生的資訊。資訊增益率定義:

        image         (5)

選擇具有最大增益率的屬性作為分裂屬性。


二、演算法說明

(1)我們是要構造一個決策樹,很自然地,樹的每一層代表一個屬性的取值,最後的葉子節點指向劃分的類。如圖二所示。

(2)因此很自然的問題就是如何在每一層選擇合適的節點去構造這個樹使這個樹的結構儘可能最優,也就是查詢路徑儘可能的短。

(3)因此最關鍵的問題就是如何在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。

(4)其中ID3演算法選擇最優節點的方式是:選出資訊增益增益最高的屬性。資訊增益可以簡單理解成使用某個屬性劃分後,不確定性的減少量。

(5)而C4.5演算法做了一個改進,使用資訊增益最高的屬性,這樣做的好處是,可以避免樹過寬。

(6)構建好了樹之後還要進行一些剪枝的操作,當然這個不體現在演算法主流行裡,也沒有做強求,但可以注意一下Weka是如何實現的。


三、演算法中用到的主要資料結構

(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樹。

Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。


一、演算法

J48是基於C4.5實現的決策樹演算法,對於C4.5演算法相關資料太多了,筆者在這裡轉載一部分(來源:http://blog.csdn.net/zjd950131/article/details/8027081)

 C4.5是一系列用在機器學習和資料探勘的分類問題中的演算法。它的目標是監督學習:給定一個資料集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的對映關係,並且這個對映能用於對新的類別未知的實體進行分類。

    C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或引數設定,適合於探測性的知識發現。

    從ID3演算法中衍生出了C4.5和CART兩種演算法,這兩種演算法在資料探勘中都非常重要。下圖就是一棵典型的C4.5演算法對資料集產生的決策樹。

資料集如圖1所示,它表示的是天氣情況與去不去打高爾夫球之間的關係。

image

圖1  資料集

        image

        圖2   在資料集上通過C4.5生成的決策樹

    演算法描述

    C4.5並不一個演算法,而是一組演算法—C4.5,非剪枝C4.5和C4.5規則。下圖中的演算法將給出C4.5的基本工作流程:

    image

    圖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中的元組分類所需的期望資訊為下式:

        image (1)

Info(D)又稱為熵。

    現在假定按照屬性A劃分D中的元組,且屬性A將D劃分成v個不同的類。在該劃分之後,為了得到準確的分類還需要的資訊由下面的式子度量:

        image       (2)

    資訊增益定義為原來的資訊需求(即僅基於類比例)與新需求(即對A劃分之後得到的)之間的差,即

        image       (3)

    我想很多人看到這個地方都覺得不是很好理解,所以我自己的研究了文獻中關於這一塊的描述,也對比了上面的三個公式,下面說說我自己的理解。

    一般說來,對於一個具有多個屬性的元組,用一個屬性就將它們完全分開幾乎不可能,否則的話,決策樹的深度就只能是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),定義如下:

        image    (4)

這個值表示通過將訓練資料集D劃分成對應於屬性A測試的v個輸出的v個劃分產生的資訊。資訊增益率定義:

        image         (5)

選擇具有最大增益率的屬性作為分裂屬性。


二、演算法說明

(1)我們是要構造一個決策樹,很自然地,樹的每一層代表一個屬性的取值,最後的葉子節點指向劃分的類。如圖二所示。

(2)因此很自然的問題就是如何在每一層選擇合適的節點去構造這個樹使這個樹的結構儘可能最優,也就是查詢路徑儘可能的短。

(3)因此最關鍵的問題就是如何在每一層,從剩下的還沒被分配的節點中找出最合適的分裂節點。

(4)其中ID3演算法選擇最優節點的方式是:選出資訊增益增益最高的屬性。資訊增益可以簡單理解成使用某個屬性劃分後,不確定性的減少量。

(5)而C4.5演算法做了一個改進,使用資訊增益最高的屬性,這樣做的好處是,可以避免樹過寬。

(6)構建好了樹之後還要進行一些剪枝的操作,當然這個不體現在演算法主流行裡,也沒有做強求,但可以注意一下Weka是如何實現的。


三、演算法中用到的主要資料結構

(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樹。

相關文章