- 如何讓machine來學習構建這樣的決策樹?
- 哪個feature(occupation, gender)在何時需要被抽取出來當作決策?
- 在看另外一個例子,如何用決策樹來解決之前說的的學生錄取問題。
- 利用多個直線段一一切割(x=5, y=7, y=2),再來構建出決策樹。
Entropy
- 是一個物理概念。
- Entropy可以精準測量一個粒子的自由程度。
- 水蒸氣的Entropy最高,冰的Entropy最低。
- 用機率來解釋。
- 最左邊的桶子,不管我們怎樣重新擺放球的位置,都是一樣的結果,所以Entropy最低。
- 最右邊的桶子,隨著重新擺放球的位置,擁有多種的可能性,所以Entropy最高。
集合越穩固或越具有同類性其Entropy越低
- 用知識來解釋。
- 最左邊的桶子,我們非常確定球一定是紅色,所以是high knowledge,對應的Entropy最低。
- 最右邊的桶子,確定球是紅色越低,所以是low knowledge,對應的Entropy最高。
- 從每個桶子都抽出4顆球(抽完都放回去),其顏色組合跟桶子內的球原本的顏色組合一樣就贏。
- 最左邊的桶子,贏的機率最高。
- 最右邊的桶子,贏的機率最低。
利用log函數讓這些機率乘積改成和,方便計算
- 最後一行就是我們的Entropy。
- 多幾顆球的Entropy計算例子。
- 熵公式(公式“m-n" 应该为"m+n")。
Information Gain
- Information Gain就是將**"老爸的Entropy減掉兒子們的Entropy平均"**。
- 決策樹在構建過程中,會根據Information Gain來決定如何構建,在這個例子決策樹會選擇最右邊的構建方式。
- 先算出根節點的Entropy(3個pokemon, 2個whatapp, 1個snapchat)。
- 分別計算出以occupation跟gender所得到information gain。
- 決定會先從gender(information gain高)開始建構決策樹。
- 隨著特徵數據量的變多,決策樹很容易遇到overfitting的問題。
- 隨機森林: 利用表中隨機挑選不同的特徵值來構建多個決策樹。
- 讓多個決策樹同時進行決策,並選取結果中顯示最多的。
- 最大深度(max_depth)
- 每片叶子的最小样本数(min_samples_leaf)
- 在分裂节点时,很有可能一片叶子上有 99 个样本,而另一片叶子上只有 1 个样本。这将使我们陷入困境,并造成资源和时间的浪费。如果想避免这种问题,我们可以设置每片叶子允许的最小样本数。
- 这个数字可以被指定为一个整数,也可以是一个浮点数。如果它是整数,它将表示这片叶子上的最小样本数。如果它是个浮点数,它将被视作每片叶子上的最小样本比例。比如,0.1 或 10% 表示如果一片叶子上的样本数量小于该节点中样本数量的 10%,这种分裂将不被允许。
- 每次分裂的最小样本数(min_samples_split)
- 这个参数与每片叶子上的最小样本树相同,只不过是应用在节点的分裂当中。
- 最大特征数(max_features)
- 限制每个分裂中查找的特征数。如果这个数字足够庞大,我们很有可能在查找的特征中找到良好特征(尽管也许并不是完美特征)。然而,如果这个数字小于特征数,这将极大加快我们的计算速度。
# Import statements
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np
# Read the data.
data = np.asarray(pd.read_csv('data.csv', header=None))
# Assign the features to the variable X, and the labels to the variable y.
X = data[:,0:2]
y = data[:,2]
# TODO: Create the decision tree model and assign it to the variable model.
# You won't need to, but if you'd like, play with hyperparameters such
# as max_depth and min_samples_leaf and see what they do to the decision
# boundary.
# 如果不設置超參數,默认的超参数将以 100% 的准确率拟合数据
# 盡量調整这些超参数,例如 max_depth 和 min_samples_leaf
# 并尝试找到最简单的潜在模型,不要太过拟合模型!
model = DecisionTreeClassifier()
# DecisionTreeClassifier(max_depth = 7, min_samples_leaf = 10)
# TODO: Fit the model.
model.fit(X, y)
# TODO: Make predictions. Store them in the variable y_pred.
y_pred = model.predict(X)