網站彈窗客服代碼/刷推廣鏈接
決策樹
- 決策樹
- 1. 簡介
- 2. ID3 決策樹
- 3. C4.5決策樹
- 4. CART決策樹
- 5. 決策樹對比
- 6. 正則化 剪枝
決策樹
1. 簡介
"""
簡介一種樹形結構樹中每個內部節(jié)點表示一個特征的判斷每個分支代表一個判斷結果的輸出每個葉節(jié)點代表一種分類結果建立過程1. 特征選擇選取有較強分類能力的特征2. 決策樹生成根據選擇的特征生成決策樹3. 決策樹 易過擬合采用剪枝的方法緩解過擬合
"""
2. ID3 決策樹
"""
ID3 決策樹熵 Entropy信息論中代表隨機變量不確定度的度量熵越大 數(shù)據的不確定性越高 信息越多熵越小 數(shù)據的不確定性越低信息熵公式其中 P(xi) 表示數(shù)據中類別出現(xiàn)的概率,H(x) 表示信息的信息熵值信息增益概念特征a對訓練數(shù)據集D的信息增益 定義為集合D的熵H(D)與特征a給定條件下D的熵(H|a)之差公式條件熵構建流程1. 計算每個特征的信息增益2. 使用信息增益最大特征將數(shù)據集 拆分為子集3. 使用該特征作為決策樹的一個節(jié)點4. 使用剩余特征對子集重復上述 1 2 3 過程不足偏向于選擇種類多的特征作為分裂依據
"""
信息熵 公式
信息增益 公式
3. C4.5決策樹
"""
信息增益率信息增益率 = 信息增益 /特征熵特征熵本質特征的信息增益 除以 特征的內在信息相當于對信息增益進行修正, 增加一個懲罰系數(shù)特征取值個數(shù)較多時 懲罰系數(shù)較小, 特征取值個數(shù)較少時, 懲罰系數(shù)較大懲罰系數(shù): 數(shù)據集D以特征a作為隨機變量的熵的倒數(shù)
"""
信息增益率 公式
特征熵 公式
4. CART決策樹
"""
CART決策樹一種決策樹模型, 可以用于分類 可以用于回歸回歸樹: 使用平方誤差最小化策略預測輸出的是一個連續(xù)值采用葉子節(jié)點里均值作為預測輸出分類生成樹: 采用基尼指數(shù)最小化策略預測輸出的是一個離散值采用葉子節(jié)點多數(shù)類別作為預測類別基尼值從數(shù)據集D中隨機抽取兩個樣本,其類別標記不一致的概率Gini(D)值越小,數(shù)據集D的純度越高基尼指數(shù)選擇使劃分后基尼系數(shù)最小的屬性作為最優(yōu)化分屬性特殊說明信息增益(ID3)、信息增益率值越大(C4.5),則說明優(yōu)先選擇該特征基尼指數(shù)值越小(CART),則說明優(yōu)先選擇該特征"""
# 1.導入依賴包
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt
from sklearn.tree import plot_treedef titanicCase():# 2.讀數(shù)據到內存并預處理# 2.1 讀取數(shù)據taitan_df = pd.read_csv("./data/titanic/train.csv")print(taitan_df.head()) # 查看前5條數(shù)據print(taitan_df.info) # 查看特性信息# 2.2 數(shù)據處理,確定x yx = taitan_df[['Pclass', 'Age', 'Sex']]y = taitan_df['Survived']# 2.3 缺失值處理x['Age'].fillna(x['Age'].mean(), inplace = True)print('x -->1', x.head(10))# 2.4 pclass類別型數(shù)據,需要轉數(shù)值one-hot編碼x = pd.get_dummies(x)print('x -->2', x.head(10))# 2.5 數(shù)據集劃分x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=33)# 3.訓練模型,實例化決策樹模型estimator = DecisionTreeClassifier()estimator.fit(x_train, y_train)# 4.模型預測y_pred = estimator.predict(x_test)# 5.模型評估# 5.1 輸出預測準確率myret = estimator.score(x_test, y_test)print('myret-->\n', myret)# 5.2 更加詳細的分類性能myreport = classification_report(y_pred, y_test, target_names=['died', 'survived'])print('myreport-->\n', myreport)# 5.3 決策樹可視化plot_tree(estimator,max_depth=10,filled=True,feature_names=['Pclass', 'Age', 'Sex_female', 'Sex_male'],class_names=['died', 'survived'])plt.show()
基尼值 公式
基尼指數(shù)公式
5. 決策樹對比
"""
對比ID3信息增益1. ID3 只能對離散屬性的數(shù)據集構成決策樹2. 傾向于選擇取值較多的屬性C4.5信息增益率1. 緩解了ID3 分支過程中總喜歡偏向于選擇值較多的屬性2. 可處理連續(xù)數(shù)值型屬性, 增加了對缺失值的處理方法3. 只適合于能夠駐留于內存的數(shù)據集, 大數(shù)據集無能為力CART基尼指數(shù)1. 可以進行分類和回歸 可處理離散屬性, 也可以處理連續(xù)屬性2. 采用基尼指數(shù) 計算 量減小3. 一定是二叉樹構建過程1. 選擇一個特征,將該特征的值進行排序, 取相鄰點計算均值作為待劃分點2. 根據所有劃分點, 將數(shù)據集分成兩部分, R1 R23. R1 和 R2 兩部分的平方損失相加作為該切分點平方損失4. 取最小的平方損失的劃分點, 作為當前特征的劃分點5. 以此計算其他特征的最優(yōu)劃分點 以及該劃分點對應的損失值6. 在所有的特征的劃分點中, 選擇出最小平方損失的劃分點 作為當前樹的分裂點"""
# 1.導入依賴包
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeRegressor # 回歸決策樹
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as pltdef contrastRegressor():"""線性回歸與回歸決策樹對比:return:"""# 2.準備數(shù)據x = np.array(list(range(1, 11))).reshape(-1, 1)y = np.array([5.56, 5.70, 5.91, 6.40, 6.80, 7.05, 8.90, 8.70, 9.00, 9.05])print('x -->', x)print('y -->', y)# 3.模型訓練,實例化模型model1 = DecisionTreeRegressor(max_depth=1)model2 = DecisionTreeRegressor(max_depth=3)model3 = LinearRegression()model1.fit(x, y)model2.fit(x, y)model3.fit(x, y)# 4.模型預測 # 等差數(shù)組-按照間隔x_test = np.arange(0.0, 10.0, 0.01).reshape(-1, 1)y_pre1 = model1.predict(x_test)y_pre2 = model2.predict(x_test)y_pre3 = model3.predict(x_test)print(y_pre1.shape, y_pre2.shape, y_pre3.shape)# 5.結果可視化plt.figure(figsize=(10, 6), dpi=100)plt.scatter(x, y, label='data')plt.plot(x_test, y_pre1, label='max_depth=1') # 深度1層plt.plot(x_test, y_pre2, label='max_depth=3') # 深度3層plt.plot(x_test, y_pre3, label='linear')plt.xlabel('data')plt.ylabel('target')plt.title('DecisionTreeRegressor')plt.legend()plt.show()
6. 正則化 剪枝
"""
正則化-剪枝預剪枝指在決策樹生成過程中, 對每個節(jié)點在劃分前先進行估計, 若當前節(jié)點的劃分不能帶來決策樹泛化性能提升, 則停止劃分并將當前節(jié)點標記為葉節(jié)點優(yōu)點預剪枝使決策樹很多分支沒有展開, 降低了過擬合風險, 顯著的減少了決策樹的訓練和測試時間的開銷缺點有些分支的當前劃分雖不能提升泛化性能, 單后續(xù)劃分卻有可能導致性能的顯著提高, 預剪枝決策時有欠擬合的風險后剪枝是先從訓練集生成一顆完整的決策樹, 然后自底向上地對非葉節(jié)點進行考察, 若將該節(jié)點對應的子樹替換為葉節(jié)點能帶來決策樹泛化性能提升, 則將該子樹替換為葉節(jié)點優(yōu)點比預剪枝保留了更多的分支, 一般情況下, 后剪枝決策樹的欠擬合風險很小, 泛化性能往往優(yōu)于預剪枝缺點訓練時間開銷比未剪枝的決策樹和預剪枝的決策樹都長的多"""