決策樹
生活中的決策樹模型:
顯然:判斷依據(jù)的重要性從前往后越來越小
信息的度量和作用
在不知道任何信息的情況下猜測32支球隊中的冠軍:如果用二分法,需要猜5次,即需要的代價為5bit,這個5bit我們稱之為信息熵(H)
5 = -(1/32log(1/32) + 1/32log(1/32) + ... + 1/32log(1/32))
公式:概率log概率 之和

如果我們知道了一些球隊的信息,需要的代價會小于5bit
5 > -(1/4log(1/32) + 1/8log(1/32) + ... + 1/24log(1/32))
信息熵越大(比如,當每個球隊的奪冠幾率相等),不確定性越大
結(jié)合決策數(shù),之所以我們先對某些條件進行判斷,是因為能夠減少我們更多的不確定性
決策樹的劃分依據(jù)——信息增益
信息增益:當?shù)弥粋€條件之后,減少的信息熵的大小

常見決策樹使用的算法
- ID3:信息增益 最大的準則
- C4.5:信息增益比 最大的準則
- CART
- 回歸樹: 平方誤差 最小
- 分類樹: 基尼系數(shù) 最小的準則 在sklearn中可以選擇劃分的默認原則。基尼系數(shù)的劃分比信息增益更加仔細
決策樹的api
案例:泰坦尼克號乘客生存狀態(tài)
在泰坦尼克號和titanic2數(shù)據(jù)幀描述泰坦尼克號上的個別乘客的生存狀態(tài)。在泰坦尼克號的數(shù)據(jù)幀不包含從劇組信息,但它確實包含了乘客的一半的實際年齡。關于泰坦尼克號旅客的數(shù)據(jù)的主要來源是百科全書Titanica。這里使用的數(shù)據(jù)集是由各種研究人員開始的。其中包括許多研究人員創(chuàng)建的旅客名單,由Michael A. Findlay編輯。
我們提取的數(shù)據(jù)集中的特征是票的類別,存活,乘坐班,年齡,登陸,home.dest,房間,票,船和性別。乘坐班是指乘客班(1,2,3),是社會經(jīng)濟階層的代表。
其中age數(shù)據(jù)存在缺失。
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
def decision():
"""
決策樹對泰坦尼克進行預測生死
:return: None
"""
#獲取數(shù)據(jù)
taitan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
#處理數(shù)據(jù),找出特征值和目標值
x = taitan[['pclass', 'age', 'sex']]
y = taitan[['survived']]
print(x)
#缺失值處理
x['age'].fillna(x['age'].mean(), inplace=True)
#分割數(shù)據(jù)集到訓練集和測試集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
#進行處理(特征工程):當特征是類別的信息需要進行one-hot編碼
dict = DictVectorizer(sparse=False)
x_train = dict.fit_transform(x_train.to_dict(orient="records")) #to_dict的參數(shù),把一行轉(zhuǎn)換成一個字典
print(dict.get_feature_names())
x_test = dict.fit_transform(x_test.to_dict(orient="records"))
print(x_train)
#用決策樹進行預測
dec = DecisionTreeClassifier(max_depth=5) #參數(shù)限定決策樹的深度
dec.fit(x_train, y_train)
print("預測的準確率為:",dec.score(x_test, y_test))
#導出決策樹的結(jié)構(gòu)
export_graphviz(dec, out_file="./tree.dot", feature_names=['年齡', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])
#導出的文件用Graphviz打開
return None
if __name__ == "__main__":
decision()
決策樹部分圖例:
決策樹的優(yōu)缺點以及改進
優(yōu)點:
- 簡單理解和解釋,數(shù)目可視化
- 需要很少的數(shù)據(jù)準備,其他技術通常需要數(shù)據(jù)歸一化
缺點:
- 決策樹學習者可以創(chuàng)建不能很好地推廣數(shù)據(jù)的過于復雜的樹,這被稱為過擬合
改進:
- 減枝cart算法:如果是用sklearn,在DecisionTreeClassifier中指定超參數(shù)即可
- 隨機森林:準確率非常高
集成學習方法
集成學習通過建立幾個模型組合的來解決單一預測問題。它的工作原理是生成多個分類器/模型,各自獨立地學習和作出預測。這些預測最后結(jié)合成單預測,因此優(yōu)于任何一個單分類的做出預測。
隨機森林是一個包含多個決策樹的分類器,并且其輸出的類別是由個別樹輸出的類別的眾數(shù)而定。
隨機森林建立多個決策樹的過程:
-
單個決策樹的建立過程:
- 隨機在N個樣本當中選擇一個樣本,重復N次 可能重復
- 隨機在M個特征中選出m個特征
建立多顆決策樹,樣本、特征大多不一樣 隨機有放回的抽樣,稱bootstrap抽樣
ps:為什么要隨機抽樣?避免每顆樹的訓練集的一樣,那么最終訓練出的上面的分類結(jié)果也是完全一樣的
-
隨機森林的api
在這里插入圖片描述
隨機森林案例:
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
def randomforest():
"""
隨機森林對泰坦尼克進行預測生死
:return: None
"""
#獲取數(shù)據(jù)
taitan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
#處理數(shù)據(jù),找出特征值和目標值
x = taitan[['pclass', 'age', 'sex']]
y = taitan[['survived']]
print(x)
#缺失值處理
x['age'].fillna(x['age'].mean(), inplace=True)
#分割數(shù)據(jù)集到訓練集和測試集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
#進行處理(特征工程):當特征是類別的信息需要進行one-hot編碼
dict = DictVectorizer(sparse=False)
x_train = dict.fit_transform(x_train.to_dict(orient="records")) #to_dict的參數(shù),把一行轉(zhuǎn)換成一個字典
print(dict.get_feature_names())
x_test = dict.fit_transform(x_test.to_dict(orient="records"))
print(x_train)
rf = RandomForestClassifier()
#網(wǎng)格搜索與交叉驗證
param = {"n_estimators":[120, 200, 300, 500, 800, 1200], "max_depth":[5, 8, 15, 25, 30]}
gc = GridSearchCV(rf, param_grid=param, cv=5)
gc.fit(x_train, y_train)
print("預測的準確率為:", gc.score(x_test, y_test))
print("查看選擇的參數(shù)模型:", gc.best_estimator_)
print("最佳的參數(shù):", gc.best_params_)
#注意:隨機森林的圖不支持導出
return None
if __name__ == "__main__":
randomforest()
隨機森林的優(yōu)點:
- 在當前所有算法中,具有極好的準確率
- 能夠有效地運行在大數(shù)據(jù)集上(大體現(xiàn)在樣本數(shù)和特征數(shù)兩方面)
- 能夠處理具有高維特征的輸入樣本,而且不需要降維
- 能夠評估各個特征在分類問題上的重要性
- 對于缺省值問題也能夠獲得很好得結(jié)果
隨機森林幾乎沒有缺點