標籤:class blog code http tar ext
一、決策樹分類演算法概述 決策樹演算法是從資料的屬性(或者特徵)出發,以屬性作為基礎,劃分不同的類。例如對於如下資料集(資料集)其中,第一列和第二列為屬性(特徵),最後一列為類別標籤,1表示是,0表示否。決策樹演算法的思想是基於屬性對資料分類,對於以上的資料我們可以得到以下的決策樹模型(決策樹模型)先是根據第一個屬性將一部份資料區分開,再根據第二個屬性將剩餘的區分開。 實現決策樹的演算法有很多種,有ID3、C4.5和CART等演算法。下面我們介紹ID3演算法。二、ID3演算法的概述 ID3演算法是由Quinlan首先提出的,該演算法是以資訊理論為基礎,以資訊熵和資訊增益為衡量標準,從而實現對資料的歸納分類。 首先,ID3演算法需要解決的問題是如何選擇特徵作為劃分資料集的標準。在ID3演算法中,選擇資訊增益最大的屬性作為當前的特徵對資料集分類。資訊增益的概念將在下面介紹,通過不斷的選擇特徵對資料集不斷劃分; 其次,ID3演算法需要解決的問題是如何判斷劃分的結束。分為兩種情況,第一種為劃分出來的類屬於同一個類,如中的最左端的“非魚類”,即為資料集中的第5行和第6行資料;最右邊的“魚類”,即為資料集中的第2行和第3行資料。第二種為已經沒有屬性可供再分了。此時就結束了。 通過迭代的方式,我們就可以得到這樣的決策樹模型。(ID3演算法基本流程)三、劃分資料的依據 ID3演算法是以資訊熵和資訊增益作為衡量標準的分類演算法。1、資訊熵(Entropy) 熵的概念主要是指資訊的混亂程度,變數的不確定性越大,熵的值也就越大,熵的公式可以表示為:其中,,為類別在樣本中出現的機率。2、資訊增益(Information gain) 資訊增益指的是劃分前後熵的變化,可以用下面的公式表示:其中,表示樣本的屬性,是屬性所有的取值集合。是的其中一個屬性值,是中的值為的範例集合。四、實驗模擬1、資料預先處理 我們以下面的資料為例,來實現ID3演算法:摘自 http://blog.sina.com.cn/s/blog_6e85bf420100ohma.html我們首先需要對資料處理,例如age屬性,我們用0表示youth,1表示middle_aged,2表示senior等等。(將表格式資料化)2、實驗結果(原始的資料)(劃分1)(劃分2)(劃分3)(最終的決策樹)MATLAB代碼主程式
[plain] view plaincopy
- %% Decision Tree
- % ID3
-
- %匯入資料
- %data = [1,1,1;1,1,1;1,0,0;0,1,0;0,1,0];
-
- data = [0,2,0,0,0;
- 0,2,0,1,0;
- 1,2,0,0,1;
- 2,1,0,0,1;
- 2,0,1,0,1;
- 2,0,1,1,0;
- 1,0,1,1,1;
- 0,1,0,0,0;
- 0,0,1,0,1;
- 2,1,1,0,1;
- 0,1,1,1,1;
- 1,1,0,1,1;
- 1,2,1,0,1;
- 2,1,0,1,0];
-
- % 產生決策樹
- createTree(data);
產生決策樹
[plain] view plaincopy
- function [ output_args ] = createTree( data )
- [m,n] = size(data);
- disp(‘original data:‘);
- disp(data);
- classList = data(:,n);
- classOne = 1;%記錄第一個類的個數
- for i = 2:m
- if classList(i,:) == classList(1,:)
- classOne = classOne+1;
- end
- end
-
- % 類別全相同
- if classOne == m
- disp(‘final data: ‘);
- disp(data);
- return;
- end
-
- % 特徵全部用完
- if n == 1
- disp(‘final data: ‘);
- disp(data);
- return;
- end
-
- bestFeat = chooseBestFeature(data);
- disp([‘bestFeat: ‘, num2str(bestFeat)]);
- featValues = unique(data(:,bestFeat));
- numOfFeatValue = length(featValues);
-
- for i = 1:numOfFeatValue
- createTree(splitData(data, bestFeat, featValues(i,:)));
- disp(‘-------------------------‘);
- end
- end
選擇資訊增益最大的特徵
[plain] view plaincopy
- %% 選擇資訊增益最大的特徵
- function [ bestFeature ] = chooseBestFeature( data )
- [m,n] = size(data);% 得到資料集的大小
-
- % 統計特徵的個數
- numOfFeatures = n-1;%最後一列是類別
- % 原始的熵
- baseEntropy = calEntropy(data);
-
- bestInfoGain = 0;%初始化資訊增益
- bestFeature = 0;% 初始化最佳的特徵位
-
- % 挑選最佳的特徵位
- for j = 1:numOfFeatures
- featureTemp = unique(data(:,j));
- numF = length(featureTemp);%屬性的個數
- newEntropy = 0;%劃分之後的熵
- for i = 1:numF
- subSet = splitData(data, j, featureTemp(i,:));
- [m_1, n_1] = size(subSet);
- prob = m_1./m;
- newEntropy = newEntropy + prob * calEntropy(subSet);
- end
-
- %計算增益
- infoGain = baseEntropy - newEntropy;
-
- if infoGain > bestInfoGain
- bestInfoGain = infoGain;
- bestFeature = j;
- end
- end
- end
計算熵
[plain] view plaincopy
- function [ entropy ] = calEntropy( data )
- [m,n] = size(data);
-
- % 得到類別的項
- label = data(:,n);
-
- % 處理完的label
- label_deal = unique(label);
-
- numLabel = length(label_deal);
- prob = zeros(numLabel,2);
-
- % 統計標籤
- for i = 1:numLabel
- prob(i,1) = label_deal(i,:);
- for j = 1:m
- if label(j,:) == label_deal(i,:)
- prob(i,2) = prob(i,2)+1;
- end
- end
- end
-
- % 計算熵
- prob(:,2) = prob(:,2)./m;
- entropy = 0;
- for i = 1:numLabel
- entropy = entropy - prob(i,2) * log2(prob(i,2));
- end
- end
劃分資料
[plain] view plaincopy
- function [ subSet ] = splitData( data, axis, value )
- [m,n] = size(data);%得到待劃分資料的大小
-
- subSet = data;
- subSet(:,axis) = [];
- k = 0;
- for i = 1:m
- if data(i,axis) ~= value
- subSet(i-k,:) = [];
- k = k+1;
- end
- end
- end
原文連結是:http://blog.csdn.net/google19890102/article/details/28611225