機器學習——決策樹


決策樹是一種用於分類和回歸的非參數監督學習方法。目標是創建一個模型,通過從數據特性中推導出簡單的決策規則來預測目標變量的值

導入類庫

1 import numpy as np
2 import pandas as pd
3 from sklearn.feature_extraction import DictVectorizer
4 from sklearn.tree import DecisionTreeClassifier
5 from sklearn.model_selection import train_test_split

簡單版

 1 def decide_play1():
 2     df = pd.read_csv('dtree.csv')
 3     dict_train = df.to_dict(orient='record')
 4 
 5     dv = DictVectorizer(sparse=False)
 6     dv_train = dv.fit_transform(dict_train)
 7     # print(dv_train)
 8     # dv_train1 = np.append(dv_train, dv_train[:, 5].reshape(-1, 1), axis=1)
 9     # dv_train2 = np.delete(dv_train1, 5, axis=1)
10     # print('*' * 50)
11     # print(dv_train2)
12 
13     # print(dv_train[:,:5])
14     # print(dv_train[:,6:])
15     # print(dv_train[:,5])
16     y = dv_train[:, 5]
17     x = np.delete(dv_train, 5, axis=1)
18     print(x)
19     print(y)
20     dtc = DecisionTreeClassifier()
21     dtc.fit(x, y.reshape(-1, 1))
22     print(dtc.predict(np.array([x[3]])))

正式版

 1 def decide_play():
 2     # ID3
 3     df = pd.read_csv('dtree.csv')
 4     # 將數據轉換為字典格式,orient='record'參數指定數據格式為{column:value,column:value}的形式
 5     dict_train = df.loc[:, ['Outlook', 'Temperatur', 'Humidity', 'Windy']].to_dict(orient='record')
 6     dict_target = pd.DataFrame(df['PlayGolf'], columns=['PlayGolf']).to_dict(orient='record')
 7 
 8 
 9     # 訓練數據字典向量化
10     dv_train = DictVectorizer(sparse=False)
11     x_train = dv_train.fit_transform(dict_train)
12 
13     # 目標數據字典向量化
14     dv_target = DictVectorizer(sparse=False)
15     y_target = dv_target.fit_transform(dict_target)
16 
17     # 創建訓練模型並訓練
18     d_tree = DecisionTreeClassifier()
19     d_tree.fit(x_train, y_target)
20 
21     data_predict = {
22         'Humidity': 85,
23         'Outlook': 'sunny',
24         'Temperatur': 85,
25         'Windy': False
26     }
27 
28     x_data = dv_train.transform(data_predict)
29     print(dv_target.inverse_transform(d_tree.predict(x_data)))
30 
31 
32 if __name__ == '__main__':
33     decide_play()

泰坦尼克生存率決策

 1 import numpy as np
 2 import pandas as pd
 3 from sklearn.feature_extraction import DictVectorizer
 4 from sklearn.model_selection import train_test_split
 5 from sklearn.tree import DecisionTreeClassifier
 6 from sklearn.metrics import r2_score
 7 
 8 
 9 def titanic_tree():
10     # 獲取數據
11     df = pd.read_csv('Titanic.csv')
12     # df = df.fillna(0)
13     # dict_train = df.loc[:, ['Pclass', 'Age', 'Sex']].to_dict(orient='record')
14     # dict_target = pd.DataFrame(df['Survived'], columns=['Survived']).to_dict(orient='record')
15     # x_train, x_test, y_train, y_test = train_test_split(dict_train, dict_target, test_size=0.25)
16 
17     # 處理數據,找出特征值和目標值
18     x = df.loc[:, ['Pclass', 'Age', 'Sex']]
19     y = df.loc[:, ['Survived']]
20     # 缺失值處理
21     x['Age'].fillna(x['Age'].mean(), inplace=True)
22     # 分割數據集到訓練集和測試集
23     x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
24     # print(y_test)
25     dv_train = DictVectorizer(sparse=False)
26     x_train = dv_train.fit_transform(x_train.to_dict(orient='record'))
27     x_test = dv_train.transform(x_test.to_dict(orient='record'))
28 
29     dv_target = DictVectorizer(sparse=False)
30     y_target = dv_target.fit_transform(y_train.to_dict(orient='record'))
31     y_test = dv_target.transform(y_test.to_dict(orient='record'))
32     # print(y_test)
33     # 用決策樹進行預測
34     d_tree = DecisionTreeClassifier()
35     d_tree.fit(x_train, y_train)
36 
37     data_predict = {
38         'Pclass': 1,
39         'Age': 38,
40         'Sex': 'female'
41 
42     }
43 
44     x_data = dv_train.transform(data_predict)
45     print(dv_target.inverse_transform(d_tree.predict(x_data).reshape(-1,1)))
46     # print(d_tree.predict(x_test))
47     # print(y_test)
48     # 預測准確率
49     # print(d_tree.score(x_test, y_test))
50 
51 
52 if __name__ == '__main__':
53     titanic_tree()

 (Decision Tree)及其變種是另一類將輸入空間分成不同的區域,每個區域有獨立參數的算法。

決策樹分類算法是一種基於實例的歸納學習方法,它能從給定的無序的訓練樣本中,提煉出樹型的分類模型。樹中的每個非葉子節點記錄了使用哪個特征來進行類別的判斷,每個葉子節點則代表了最后判斷的類別。根節點到每個葉子節點均形成一條分類的路徑規則。而對新的樣本進行測試時,只需要從根節點開始,在每個分支節點進行測試,沿着相應的分支遞歸地進入子樹再測試,一直到達葉子節點,該葉子節點所代表的類別即是當前測試樣本的預測類別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM