網(wǎng)站彈窗客服代碼/刷推廣鏈接
決策樹
- 決策樹
- 1. 簡介
- 2. ID3 決策樹
- 3. C4.5決策樹
- 4. CART決策樹
- 5. 決策樹對比
- 6. 正則化 剪枝
決策樹
1. 簡介
"""
簡介一種樹形結(jié)構(gòu)樹中每個內(nèi)部節(jié)點表示一個特征的判斷每個分支代表一個判斷結(jié)果的輸出每個葉節(jié)點代表一種分類結(jié)果建立過程1. 特征選擇選取有較強(qiáng)分類能力的特征2. 決策樹生成根據(jù)選擇的特征生成決策樹3. 決策樹 易過擬合采用剪枝的方法緩解過擬合
"""
2. ID3 決策樹
"""
ID3 決策樹熵 Entropy信息論中代表隨機(jī)變量不確定度的度量熵越大 數(shù)據(jù)的不確定性越高 信息越多熵越小 數(shù)據(jù)的不確定性越低信息熵公式其中 P(xi) 表示數(shù)據(jù)中類別出現(xiàn)的概率,H(x) 表示信息的信息熵值信息增益概念特征a對訓(xùn)練數(shù)據(jù)集D的信息增益 定義為集合D的熵H(D)與特征a給定條件下D的熵(H|a)之差公式條件熵構(gòu)建流程1. 計算每個特征的信息增益2. 使用信息增益最大特征將數(shù)據(jù)集 拆分為子集3. 使用該特征作為決策樹的一個節(jié)點4. 使用剩余特征對子集重復(fù)上述 1 2 3 過程不足偏向于選擇種類多的特征作為分裂依據(jù)
"""
信息熵 公式
信息增益 公式
3. C4.5決策樹
"""
信息增益率信息增益率 = 信息增益 /特征熵特征熵本質(zhì)特征的信息增益 除以 特征的內(nèi)在信息相當(dāng)于對信息增益進(jìn)行修正, 增加一個懲罰系數(shù)特征取值個數(shù)較多時 懲罰系數(shù)較小, 特征取值個數(shù)較少時, 懲罰系數(shù)較大懲罰系數(shù): 數(shù)據(jù)集D以特征a作為隨機(jī)變量的熵的倒數(shù)
"""
信息增益率 公式
特征熵 公式
4. CART決策樹
"""
CART決策樹一種決策樹模型, 可以用于分類 可以用于回歸回歸樹: 使用平方誤差最小化策略預(yù)測輸出的是一個連續(xù)值采用葉子節(jié)點里均值作為預(yù)測輸出分類生成樹: 采用基尼指數(shù)最小化策略預(yù)測輸出的是一個離散值采用葉子節(jié)點多數(shù)類別作為預(yù)測類別基尼值從數(shù)據(jù)集D中隨機(jī)抽取兩個樣本,其類別標(biāo)記不一致的概率Gini(D)值越小,數(shù)據(jù)集D的純度越高基尼指數(shù)選擇使劃分后基尼系數(shù)最小的屬性作為最優(yōu)化分屬性特殊說明信息增益(ID3)、信息增益率值越大(C4.5),則說明優(yōu)先選擇該特征基尼指數(shù)值越小(CART),則說明優(yōu)先選擇該特征"""
# 1.導(dǎo)入依賴包
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ù)據(jù)到內(nèi)存并預(yù)處理# 2.1 讀取數(shù)據(jù)taitan_df = pd.read_csv("./data/titanic/train.csv")print(taitan_df.head()) # 查看前5條數(shù)據(jù)print(taitan_df.info) # 查看特性信息# 2.2 數(shù)據(jù)處理,確定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ù)據(jù),需要轉(zhuǎn)數(shù)值one-hot編碼x = pd.get_dummies(x)print('x -->2', x.head(10))# 2.5 數(shù)據(jù)集劃分x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=33)# 3.訓(xùn)練模型,實例化決策樹模型estimator = DecisionTreeClassifier()estimator.fit(x_train, y_train)# 4.模型預(yù)測y_pred = estimator.predict(x_test)# 5.模型評估# 5.1 輸出預(yù)測準(zhǔn)確率myret = estimator.score(x_test, y_test)print('myret-->\n', myret)# 5.2 更加詳細(xì)的分類性能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ù)據(jù)集構(gòu)成決策樹2. 傾向于選擇取值較多的屬性C4.5信息增益率1. 緩解了ID3 分支過程中總喜歡偏向于選擇值較多的屬性2. 可處理連續(xù)數(shù)值型屬性, 增加了對缺失值的處理方法3. 只適合于能夠駐留于內(nèi)存的數(shù)據(jù)集, 大數(shù)據(jù)集無能為力CART基尼指數(shù)1. 可以進(jìn)行分類和回歸 可處理離散屬性, 也可以處理連續(xù)屬性2. 采用基尼指數(shù) 計算 量減小3. 一定是二叉樹構(gòu)建過程1. 選擇一個特征,將該特征的值進(jìn)行排序, 取相鄰點計算均值作為待劃分點2. 根據(jù)所有劃分點, 將數(shù)據(jù)集分成兩部分, R1 R23. R1 和 R2 兩部分的平方損失相加作為該切分點平方損失4. 取最小的平方損失的劃分點, 作為當(dāng)前特征的劃分點5. 以此計算其他特征的最優(yōu)劃分點 以及該劃分點對應(yīng)的損失值6. 在所有的特征的劃分點中, 選擇出最小平方損失的劃分點 作為當(dāng)前樹的分裂點"""
# 1.導(dǎo)入依賴包
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.準(zhǔn)備數(shù)據(jù)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.模型訓(xùn)練,實例化模型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.模型預(yù)測 # 等差數(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.結(jié)果可視化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. 正則化 剪枝
"""
正則化-剪枝預(yù)剪枝指在決策樹生成過程中, 對每個節(jié)點在劃分前先進(jìn)行估計, 若當(dāng)前節(jié)點的劃分不能帶來決策樹泛化性能提升, 則停止劃分并將當(dāng)前節(jié)點標(biāo)記為葉節(jié)點優(yōu)點預(yù)剪枝使決策樹很多分支沒有展開, 降低了過擬合風(fēng)險, 顯著的減少了決策樹的訓(xùn)練和測試時間的開銷缺點有些分支的當(dāng)前劃分雖不能提升泛化性能, 單后續(xù)劃分卻有可能導(dǎo)致性能的顯著提高, 預(yù)剪枝決策時有欠擬合的風(fēng)險后剪枝是先從訓(xùn)練集生成一顆完整的決策樹, 然后自底向上地對非葉節(jié)點進(jìn)行考察, 若將該節(jié)點對應(yīng)的子樹替換為葉節(jié)點能帶來決策樹泛化性能提升, 則將該子樹替換為葉節(jié)點優(yōu)點比預(yù)剪枝保留了更多的分支, 一般情況下, 后剪枝決策樹的欠擬合風(fēng)險很小, 泛化性能往往優(yōu)于預(yù)剪枝缺點訓(xùn)練時間開銷比未剪枝的決策樹和預(yù)剪枝的決策樹都長的多"""