天天看點

機器學習常用算法——決策樹決策樹參考文獻

決策樹

決策樹是一個非參數的監督式學習方法,主要用于分類和回歸,算法的目标是通過推斷資料特征,學習決策規則進而建立一個預測目标變量的模型。決策樹(decision tree)是一個樹結構(可以是二叉樹或非二叉樹)。其每個非葉節點表示一個特征屬性上的測試,每個分支代表這個特征屬性在某個值域上的輸出,而每個葉節點存放一個類别。使用決策樹進行決策的過程就是從根節點開始,測試待分類項中相應的特征屬性,并按照其值選擇輸出分支,直到到達葉子節點,将葉子節點存放的類别作為決策結果。

機器學習常用算法——決策樹決策樹參考文獻

決策樹(Decision Tree)是一種簡單但是廣泛使用的分類器。通過訓練資料建構決策樹,可以高效的對未知的資料進行分類。決策數有兩大優點:

  1. 決策樹模型可以讀性好,具有描述性,有助于人工分析;
  2. 效率高,決策樹隻需要一次建構,反複使用,每一次預測的最大計算次數不超過決策樹的深度。

決策樹既可以做分類,也可以做回歸。

  1. 分類樹的輸出是樣本的類标。
  2. 回歸樹的輸出是一個實數 (例如房子的價格,病人呆在醫院的時間等)。

分類

以文章開始的圖檔為例子,假設銀行貸款前需要審查使用者資訊,來确定是否準許貸款,構造資料 data.scv 如下:

house, married, income, give_loan

1, 1, 80, 1

1, 0, 30, 1

1, 1, 30, 1

0, 1, 30, 1

0, 1, 40, 1

0, 0, 80, 1

0, 0, 78, 0

0, 0, 70, 1

0, 0, 88, 1

0, 0, 45, 0

0, 1, 87, 1

0, 0, 89, 1

0, 0, 100, 1

from numpy import genfromtxt
from sklearn import tree
# 加載資料
dataset = genfromtxt('data.csv', delimiter=",")
x = dataset[1:, 0:3]
y = dataset[1:, 3]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(x, y)
# 預測
print(clf.predict([[0, 0, 50]])) # [ 0.] 說明此使用者不滿足貸款條件           

複制

回歸

回歸和分類不同的是向量 y 可以是浮點數。

from sklearn import tree
X = [[0, 0], [2, 2]]
y = [0.5, 2.5]
clf = tree.DecisionTreeRegressor()
clf = clf.fit(X, y)
clf.predict([[1, 1]])           

複制

scikit-learn 官網給出的例子是:

import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
# 建立随機資料集
rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - rng.rand(16))
# 訓練決策樹回歸模型
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)
# 預測
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
# 結果展示
plt.figure()
plt.scatter(X, y, c="darkorange", label="data")
plt.plot(X_test, y_1, color="cornflowerblue", label="max_depth=2", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()           

複制

決策樹的使用

  1. 如果資料量大,決策樹容易過拟合。樣本和特征的比例非常重要。如果決策樹樣本少,特征多,非常可能過拟合。
  2. 可以考慮事先做次元約減(PCA,ICA),以産生一個特征之間差別性大的決策樹
  3. 通過 export 将你的訓練的決策樹可視化,使用 max_depth =3 作為一個初始的樹的深度,有一個資料拟合決策樹模型的大概感覺,然後逐漸增加深度

    資料的樣本量的增加将加深決策樹的深度,使用 max_depth 控制決策樹的尺寸以防止過拟合

  4. 使用 min_samples_split 或者 min_samples_leaf 來控制葉節點的樣本數量。一個非常小的數量往往意味着過拟合,而一個較大的數可以防止過拟合。可以将 min_samples_leaf=5 作為一個初始值。如果樣本資料變化巨大,可以采用一個浮點數。兩者的差別在于 min_samples_leaf 保證了葉節點最小的數量,min_samples_split 能夠建立任意數量的葉子節點,在文學上用到也更多
  5. 如果樣本是有權重的,可以使用 min_weight_fraction_leaf 來實作基于權重的預修剪規則來優化決策樹結構
  6. 決策樹内部使用 np.float32 向量,如果樣本不是這個形式的,将産生一個資料集的樣本
  7. 如果資料矩陣 X 是非常稀疏的,建議在拟合和預測之前轉換為稀疏矩陣 csc_matrix。稀疏矩陣将比稠密矩陣快數量級的速度

代碼位址

參考文獻

  • 算法雜貨鋪——分類算法之決策樹(Decision tree)
  • 《機器學習實戰》基于資訊論的三種決策樹算法(ID3,C4.5,CART)
  • Scikit-learn中的決策樹