習題
4.1
試證明對於不含沖突數據 (即特征向量完全相同但標記不同) 的訓練集, 必存在與訓練集一致 (即訓練誤差為 0)的決策樹.
既然每個標記不同的數據特征向量都不同, 只要樹的每一條 (從根解點到一個葉節點算一條) 枝干代表一種向量, 這個決策樹就與訓練集一致.
4.2
試析使用 "最小訓練誤差" 作為決策樹划分選擇准則的缺陷.
\(4.1\) 說明了如果數據不沖突, 可以完全擬合數據集, 這正是使用 "最小訓練誤差" 作為決策樹划分選擇准則的結果. 而這是絕對的過擬合.
4.3
試編程實現基於信息熵進行划分選擇的決策樹算法, 並為表 \(4.3\) 中數據生成一棵決策樹.
4.4
試編程實現基於基尼指數進行划分選擇的決策樹算法, 為表 \(4.2\) 中數據生成預剪枝、后剪枝決策樹, 並與未剪枝決策樹進行比較.
4.5
試編程實現基於対率回歸進行划分選擇的決策樹算法, 並為表 \(4.3\) 中數據生成一棵決策樹.
4.6
試選擇 \(4\) 個 \(\mathrm{UCI}\) 數據集, 對上述 \(3\) 種算法所產生的未剪枝、預剪枝、后剪枝決策樹進行實驗比較, 並進行適當的統計顯著性檢驗.
4.7
圖 \(4.2\) 是一種遞歸算法, 若面臨巨量數據, 則決策樹的層數會很深, 使用遞歸方法易導致 "棧" 溢出. 試使用 "隊列" 數據結構, 以參數 \(MaxDepth\) 控制樹的最大深度, 寫出與圖 \(4.2\) 等價、但不使用遞歸的決策樹生成算法.
偽代碼:
# 輸入: 訓練集 D
# 屬性集 A
array[0] = [D, A]
for D, A in array:
生成節點node;
if D中樣本全屬於同一類別C:
將node標記為C類葉節點
continue
elif A = 空 or D中樣本在A上取值相同:
將node標記為葉節點, 其類別標記為D中樣本數最多的類
continue
從A中選擇最優划分屬性a
for a_v in a每個取值:
為node生成一個分支, 令D_v表示D在a上取值為a_v的樣本子集
if D_v == null:
將分支節點標記為葉節點, 其類別標記為D中樣本最多的類
continue
elif
array.append([D_v, A \ {a}])
# 輸出: 以node為根節點的一棵決策樹
4.8*
試將決策樹生成的深度優先搜索過程修改為廣度優先搜索, 以參數 \(MaxNode\) 控制樹的最大結點數, 將題 \(4.7\) 中基於隊列的決策樹算法進行改寫. 對比題 \(4.7\) 中的算法, 試析哪種方式更易於控制決策樹所需存儲不超出內存.
\(4.7\) 其實已經是廣度優先搜索了...
防止內存溢出就是要讓深度優先搜索不要遞歸過深, 廣度優先搜索不要太多結點在同一個深度, 因此如果樹比較長, 建議用廣度優先搜索, 如果樹比較寬, 建議用深度優先搜索.
4.9
試將 \(4.4.2\) 節對缺失值的處理機制推廣到基尼指數的計算中去.
\(w_{\boldsymbol{x}}\) 是權值, 初始化為 \(1\) .
那么推廣后的基尼指數為:
同時如果按某屬性 \(a\) 划分, 那么某個缺失該屬性的樣本按照總體屬性比例改變權值進入下一結點 (見書 \(\mathrm{P}88\)).
4.10
從網上下載或自己編程實現任意一種多變量決策樹算法, 並觀察其在西瓜數據集 \(3.0\) 上產生的結果.
