決策樹算法實例操演——基于ModelArts平臺(小白機器學習初體驗)
一、決策樹算法簡介
決策樹算法是機器學習的經典算法之一,產生于上世紀六十年代,當下主要分為ID3算法、C4.5算法以及CART算法。ID3算法和C4.5算法核心思想均為通過計算樣本信息熵進行分類,兩者的區別在于ID3算法基于信息增益作為特征選擇的指標,而C4.5則是基于信息增益率作為特征選擇的指標,本例中使用ID3算法進行分類。CART算法則是使用基尼指數作為特征選擇的指標。
二、ID3算法的基本思想
ID3算法的核心是統計學中信息熵的概念,通過計算信息熵來判斷該數據樣本的“純度”,信息熵越大,數據樣本越不“純”,分類需要的數據量就越大。
信息熵的計算公式:
i
n
f
o
(
D
)
info(D)
info(D)=-
∑
i
=
1
k
p
i
?
log
?
2
(
p
i
)
\displaystyle\sum_{i=1}^{k} p_i*\log_2(p_i)
i=1∑k pi ?log2 (pi )
其中
p
i
p_i
pi 是概率
下面介紹一下ID3算法的步驟
1.計算類別信息熵
將所得到的數據集按照類別逐個計算其信息熵再相加,假設在數據集D中有k個類別,且第i個類別在數據集中所占的概率為
p
i
p_i
pi ,則信息類別熵為:
i
n
f
o
(
D
)
info(D)
info(D)=-
∑
i
=
1
k
p
i
?
log
?
2
(
p
i
)
\displaystyle\sum_{i=1}^{k} p_i*\log_2(p_i)
i=1∑k pi ?log2 (pi )
2.計算每個特征的信息熵
將數據集根據某個特征進行分類后,計算該種特征的條件下各種類別的類別信息熵,也稱條件熵。假設將數據集按照特征A進行分類,且A有m個類別,則其計算公式為:
i
n
f
o
A
(
D
)
info_A(D)
infoA (D)=-
∑
j
=
1
m
∣
D
j
∣
/
∣
D
∣
?
i
n
f
o
(
D
j
)
\displaystyle\sum_{j=1}^{m} |D_j|/|D|*info(D_j)
j=1∑m ∣Dj ∣/∣D∣?info(Dj )
其中的
D
j
D_j
Dj 是指數據集的類別在A特征的各個類別下的樣本數量
(注意數據集的類別和A特征的類別是不同的概念,比如要在一個數據集中判斷一個人在某天心情的好壞,好和壞就是數據集的類別,而一天中有一個特征是天氣,天氣的類別是晴天、雨天和陰天,我們要算的是心情好和壞分別在晴天,雨天和陰天中的分布的離散情況)
其他特征的條件熵也是相同的計算方法
3.計算信息增益
通過前面兩個步驟我們得到了數據集的信息熵和屬于各個特征的條件熵,根據第二個步驟我先進行的分類再進行信息熵(或者說條件熵)的計算,分類之后數據的混亂程度肯定降低,也就是說條件熵會小于數據集的信息熵,信息增益則是條件熵和信息熵之間的差值,用來衡量使用該特征分類的效果好壞,假設用特征A進行分類,其信息增益公式為:
G
a
i
n
(
A
)
Gain(A)
Gain(A)=
i
n
f
o
(
D
)
info(D)
info(D)-
i
n
f
o
A
(
D
)
info_A(D)
infoA (D)
通常我們選擇信息增益最大的特征作為分類的節點
三、基于ModelArts平臺實現ID3算法
1.數據集來源
數據集選用的是AIGallery的表格類型數據集《硬盤故障預測數據集》
網址鏈接:https://marketplace.huaweicloud.com/markets/aihub/datasets/detail/?content_id=1b5d6ec0-adc0-4fdd-b03f-fecad119eab5
2.sklearn實現模型部署
#導入相關庫 import matplotlib.pyplot as plt import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn import tree from sklearn.metrics import accuracy_score import time #載入數據集 train_test_set = pd.read_csv("dataset_2020.csv",header=0) data = train_test_set.values #分出標簽集和特征集 features = data[::,5::2] lables = data[::,4] features = pd.DataFrame(features) lables = pd.DataFrame(lables) lables = lables.astype("float32") #刪去整列都是空值的列 features = features.dropna(axis=1,how="all") #將缺失值用中位數填充 features = np.array(features) for i in range(features.shape[1]): temp = np.array(features)[:,i].tolist() median = np.nanmedian(temp) features[np.argwhere(pd.isna(features[:,i].T)),i] = median features = pd.DataFrame(features,dtype="float32") #分出訓練集和測試集 train_features,test_features,train_lables,test_lables = train_test_split(features,lables,test_size=0.33,random_state=0) time_1 = time.time() #選用ID3算法 clf = tree.DecisionTreeClassifier(criterion='entropy', random_state=10, splitter='random', ) clf.fit(train_features,train_lables) time_2 = time.time() print('Training cost:{}s'.format(time_2-time_1)) #預測 test_predict = clf.predict(test_features) time_3 = time.time() print("Predicting cost:{}s".format(time_3-time_2)) #得分 score = accuracy_score(test_lables,test_predict) print("score is {}".format(score)) #學習曲線 scores1 = [] for x in range(4,20): clf = tree.DecisionTreeClassifier(criterion='entropy', random_state=10, #使得每一次生成的樹都一樣 splitter='random',#分類的特征隨機,減少過擬合的可能性 max_depth=x #樹的最大深度 ) clf.fit(train_features,train_lables) test_predict = clf.predict(test_features) score = accuracy_score(test_lables,test_predict) scores1.append(score) plt.plot(range(4,20),scores1,color='red',label="max_depth") plt.legend() plt.show() scores2 = [] for y in range(2,30): clf = tree.DecisionTreeClassifier(criterion='entropy', random_state=10, splitter='random', max_depth=18, min_samples_split=y #至少有y個樣本才會分枝 ) clf.fit(train_features,train_lables) test_predict = clf.predict(test_features) score = accuracy_score(test_lables,test_predict) scores2.append(score) plt.plot(range(2,30),scores2,color='red',label="min_samples_split") plt.legend() plt.show() #手動調參到目前為止效果最好的參數 clf = tree.DecisionTreeClassifier(criterion='entropy', random_state=10, splitter='random', max_depth=18, min_samples_split=16, ) clf.fit(train_features,train_lables) test_predict = clf.predict(test_features) score = accuracy_score(test_lables,test_predict) print(score) #目前最好的預測得分達到0.7815
3.部分參數解釋
tree.DecisionTreeClassifier():
criterion:決策樹衡量劃分質量的方法,默認值為‘gini’(基尼指數),默認值下為CART算法,另外一個可選參數為 ‘entropy’(信息增益),選擇此參數為ID3算法。
random_state:默認值為 ‘None’,可任意設為一個常數,設為常數時可以簡單理解為使得每次運行模型都會得到一個相同的樹。
splitter:節點劃分策略,默認值為 ‘best’(最優劃分),模型會在特征的所有劃分點中找出最優的劃分點;可選參數有 ‘random’(隨機局部最優劃分),模型會隨機地在部分劃分點中找到局部最優的劃分點。'best’適合樣本量不大的情況下, 'random’適合樣本量比較大的時候,是減少過擬合的方法之一。
max_depth:樹的最大深度,默認值為 ‘None’,指定模型中樹的的最大深度。
min_samples_split:內部節點能繼續劃分所包含的最小樣本數,是防止過擬合的方法之一。
AI開發平臺ModelArts 決策樹 機器學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。