ID3算法是一種貪心算法,用來構造決策樹。ID3算法起源於概念學習系統(CLS),以信息熵的下降速度為選取測試屬性的標准,即在每個節點選取還尚未被用來划分的具有最高信息增益的屬性作為划分標准,然后繼續這個過程,直到生成的決策樹能完美分類訓練樣例。
①對當前樣本集合,計算所有屬性的信息增益;
②選擇信息增益最大的屬性作為測試屬性,把測試屬性取值相同的樣本划為同一個子樣本集;
③若子樣本集的類別屬性只含有單個屬性,則分支為葉子節點,判斷其屬性值並標上相應的符號,然后返回調用處;否則對子樣本集遞歸調用本算法。
結合餐飲案例實現ID3的具體實施步驟。
T餐飲企業作為大型的連鎖企業,生產的產品種類比較多,另外涉及的分店所處的位置也不同、數目也比較多。對於企業的高層來講,了解周末和非周末銷量是否有大的區別,以及天氣、促銷活動等因素是否能夠影響門店的銷量這些信息至關重要。因此,為了讓決策者准確地了解和銷量有關的一系列影響因素,需要構建模型來分析天氣、是否周末和是否有促銷活動對其銷量的影響,下面以單個門店來進行分析。
①計算總的信息熵,其中數據中總記錄數為34,而銷售數量為“高”的數據有18,“低”的有16。$$I(18,16)=-\frac{18}{34} \log _{2} \frac{18}{34}-\frac{16}{34} \log _{2} \frac{16}{34}=0.997503$$
②計算每個測試屬性的信息熵。
對於天氣屬性,其屬性值有“好”和“壞”兩種。
其中天氣為“好”的條件下,銷售數量為“高”的記錄為11,銷售數量為“低”的記錄為6,可表示為(11,6);
天氣為“壞”的條件下,銷售數量為“高”的記錄為7,銷售數量為“低”的記錄為10,可表示為(7,10)。
$$\begin{array}{*{20}{l}}
{I(11,6) = - \frac{{11}}{{17}}{{\log }_2}\frac{{11}}{{17}} - \frac{6}{{17}}{{\log }_2}\frac{6}{{17}} = 0.936667}\\
{I(7,10) = - \frac{7}{{17}}{{\log }_2}\frac{7}{{17}} - \frac{{10}}{{17}}{{\log }_2}\frac{{10}}{{17}} = 0.977418}\\
{E\left( {天氣} \right) = \frac{{17}}{{34}}I(11,6) + \frac{{17}}{{34}}I(7,10) = 0.957043}
\end{array}$$
對於是否周末屬性,其屬性值有“是”和“否”兩種。
其中是否周末屬性為“是”的條件下,銷售數量為“高”的記錄為11,銷售數量為“低”的記錄為3,可表示為(11,3);
是否周末屬性為“否”的條件下,銷售數量為“高”的記錄為7,銷售數量為“低”的記錄為13,可表示為(7,13)。
$$\begin{array}{*{20}{l}}
{\begin{array}{*{20}{l}}
{I(11,3) = - \frac{{11}}{{14}}{{\log }_2}\frac{{11}}{{14}} - \frac{3}{{14}}{{\log }_2}\frac{3}{{14}} = 0.749595}\\
{I(7,13) = - \frac{7}{{20}}{{\log }_2}\frac{7}{{20}} - \frac{{13}}{{20}}{{\log }_2}\frac{{13}}{{20}} = 0.934068}
\end{array}}\\
{E\left( {是否周末} \right) = \frac{{14}}{{34}}I(11,3) + \frac{{20}}{{34}}I(7,13) = 0.858109}
\end{array}$$
對於是否有促銷屬性,其屬性值有“是”和“否”兩種。
其中是否有促銷屬性為“是”的條件下,銷售數量為“高”的記錄為15,銷售數量為“低”的記錄為7,可表示為(15,7);
其中是否有促銷屬性為“否”的條件下,銷售數量為“高”的記錄為3,銷售數量為“低”的記錄為9,可表示為(3,9)。
$$\begin{array}{*{20}{c}}
{I(15,7) = - \frac{{15}}{{22}}{{\log }_2}\frac{{15}}{{22}} - \frac{7}{{22}}{{\log }_2}\frac{7}{{22}} = 0.902393}\\
{I(3,9) = - \frac{3}{{12}}{{\log }_2}\frac{3}{{12}} - \frac{9}{{12}}{{\log }_2}\frac{9}{{12}} = 0.811278}\\
{E\left( {是否有促銷} \right) = \frac{{22}}{{34}}I(15,7) + \frac{{12}}{{34}}I(3,9) = 0.870235}
\end{array}$$
③計算天氣、是否周末和是否有促銷屬性的信息增益值。
天氣:$0.997503-0.957043=0.04046$
是否周末:$0.997503-0.858109=0.139394$
有無促銷屬性:$0.997503-0.870235=0.127268$
其中,是否周末的信息增益值最大,以其為根節點,其左右分支為“是”與“否”,
④依據增益值生成決策樹。
代碼:
%% 使用ID3決策樹算法預測銷量高低
clear ;
% 參數初始化 inputfile = '../data/sales_data.xls'; % 銷量及其他屬性數據 %% 數據預處理 disp('正在進行數據預處理...'); [matrix,attributes_label,attributes] = id3_preprocess(inputfile); %% 構造ID3決策樹,其中id3()為自定義函數 disp('數據預處理完成,正在進行構造樹...'); tree = id3(matrix,attributes_label,attributes); %% 打印並畫決策樹 [nodeids,nodevalues] = print_tree(tree); tree_plot(nodeids,nodevalues); disp('ID3算法構建決策樹完成!');
依據結果,我們可以得出以下結論:
若周末屬性為“是”,天氣為“好”,則銷售數量為“高”;
若周末屬性為“是”,天氣為“壞”,促銷屬性為“是”,則銷售數量為“高”;
若周末屬性為“是”,天氣為“壞”,促銷屬性為“否”,則銷售數量為“低”;
若周末屬性為“否”,促銷屬性為“否”,則銷售數量為“低”;
若周末屬性為“否”,促銷屬性為“是”,天氣為“好”,則銷售數量為“高”;
若周末屬性為“否”,促銷屬性為“是”,天氣為“壞”,則銷售數量為“低”。
由於ID3決策樹算法采用了信息增益作為選擇測試屬性的標准,會偏向於選擇取值較多的即所謂的高度分支屬性,而這類屬性並不一定是最優的屬性。同時,ID3決策樹算法只能處理離散屬性,對於連續型的屬性,在分類前需要對其進行離散化。