Python機器學習【二】 - 決策樹
原文地址:Python機器學習【二】 - 決策樹
上一篇基于sklearn Python庫創建K近鄰模型(KNN)實作了機器學習Hello World示例,KNN屬于最簡單的分類演算法,簡單來講就是當預測一個新的值時,根據它最近的K個點是什么型別來判斷屬于哪個類別,掌握了KNN也算是簡單入門機器學習了,學習新東西總是要由淺入深,這次準備學習另一種分類演算法:決策樹
一、決策樹
決策樹演算法采用樹形結構,使用層層推理來實作最終的分類,是一種基于 if-then-else 規則的有監督學習演算法,決策樹的這些規則通過訓練得到,而不是人工制定的,
有監督學習: 給定資料,預測標簽,它從有標記的訓練資料中推匯出預測函式,
無監督學習: 給定資料,尋找隱藏的結構,它從無標記的訓練資料中推斷結論,
我們的生活中有很多決策樹的案例,舉個簡單栗子:銀行要對客戶進行信用登記評估,可能會根據有無逾期記錄、有無逾期未還款記錄、有無房產等指標進行評估,得到下面最簡單的模型:
二、目標
已知有178個葡萄酒樣本資料,每個樣本采樣酒精、蘋果酸、灰、灰的堿性、鎂、總酚等共13個特征,葡萄酒分為三個型別,分別用class_0、class_1、class_2表示,
178個葡萄酒中:class_0有59個,class_1有71個,class_2有48個,我們仍然取178條資料的70%作為訓練資料,經過訓練模型、模型評估,預測剩余30%資料樣本的型別,計算出準確率以及查看學習生成的決策樹,
三、實作步驟
- 安裝sklearn
pip install -U scikit-learn
- Python實作
- 獲取資料
from sklearn import datasets
# 獲取葡萄酒據集,sklearn庫提供
wines = datasets.load_wine()
"""
共178個樣本,樣本具有13個特征值(feature_names)
feature_names:
alcohol: 酒精
malic_acid: 蘋果酸
ash: 灰
alcalinity_of_ash: 灰的堿性
magnesium: 鎂
total_phenols: 總酚
flavanoids: 類黃酮
nonflavanoid_phenols: 非黃烷類酚類
proanthocyanins: 花青素
color_intensity: 顏色強度
hue: 色調
od280/od315_of_diluted_wines: od280/od315稀釋葡萄酒
proline: 脯氨酸
三種紅酒型別(classes)
classes:
class_0
class_1
class_2
"""
print("葡萄酒型別", list(wines.target_names)) # ['class_0', 'class_1', 'class_2']
print("樣本特征值", list(wines.feature_names)) # 太長,見注釋
print("資料規模", wines.data.shape) # (178, 13)
- 資料預處理
x_train, x_test, y_train, y_test = train_test_split(wines.data, wines.target, test_size=0.3) # 分訓練集、測驗集 測驗集占0.3
print("訓練集", x_train.shape) # (124, 13)
print("測驗集", x_test.shape) # (54, 13)
- 訓練模型
clf = tree.DecisionTreeClassifier(criterion="entropy") # 載入決策樹分類模型
clf = clf.fit(x_train, y_train)
- 模型評估
score = clf.score(x_test, y_test)
print("準確度", score) # 0.9629629629629629
- 畫出該決策樹
graphviz是一個繪圖工具,可以根據dot腳本畫出樹形圖,windows平臺使用graphviz需要先安裝graphviz軟體,再安裝graphviz python模塊
- 安裝graphviz軟體
下載地址:graphviz軟體
注意安裝時勾選 Add Graphviz to the system PATH,安裝成功后,需要重啟 PyCharm
- 安裝graphviz模塊
pip install graphviz
- 畫出決策樹
import graphviz
feature_name = ['酒精', '蘋果酸', '灰', '灰的堿性', '鎂', '總酚', '類黃酮', '非黃烷類酚類', '花青素', '顏色強度', '色調', 'od280/od315稀釋葡萄酒', '脯氨酸']
class_names = ["class_0", "class_1", "class_2"]
dot_data = tree.export_graphviz(clf, out_file='tree.dot', feature_names=feature_name, class_names=class_names, filled=True, rounded=True)
# 處理中文亂碼
with open("tree.dot", encoding='utf-8') as f:
dot_graph = f.read()
graph = graphviz.Source(dot_graph.replace("helvetica", "FangSong"))
graph.view()
完整代碼
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import tree
import graphviz
# 獲取葡萄酒據集,sklearn庫提供
wines = datasets.load_wine()
"""
共178個樣本,樣本具有13個特征值(feature_names)
feature_names:
alcohol: 酒精
malic_acid: 蘋果酸
ash: 灰
alcalinity_of_ash: 灰的堿性
magnesium: 鎂
total_phenols: 總酚
flavanoids: 類黃酮
nonflavanoid_phenols: 非黃烷類酚類
proanthocyanins: 花青素
color_intensity: 顏色強度
hue: 色調
od280/od315_of_diluted_wines: od280/od315稀釋葡萄酒
proline: 脯氨酸
三種紅酒型別(classes)
classes:
class_0
class_1
class_2
"""
print("葡萄酒型別", list(wines.target_names)) # ['class_0', 'class_1', 'class_2']
print("樣本特征值", list(wines.feature_names)) # 太長,見注釋
print("資料規模", wines.data.shape) # (178, 13)
x_train, x_test, y_train, y_test = train_test_split(wines.data, wines.target, test_size=0.3) # 分訓練集、測驗集 測驗集占0.3
print("訓練集", x_train.shape)
print("測驗集", x_test.shape)
clf = tree.DecisionTreeClassifier(criterion="entropy") # 載入決策樹分類模型
clf = clf.fit(x_train, y_train)
score = clf.score(x_test, y_test)
print("準確度", score)
feature_name = ['酒精', '蘋果酸', '灰', '灰的堿性', '鎂', '總酚', '類黃酮', '非黃烷類酚類', '花青素', '顏色強度', '色調', 'od280/od315稀釋葡萄酒', '脯氨酸']
class_names = ["class_0", "class_1", "class_2"]
dot_data = tree.export_graphviz(clf, out_file='tree.dot', feature_names=feature_name, class_names=class_names, filled=True, rounded=True)
# 處理中文亂碼
with open("tree.dot", encoding='utf-8') as f:
dot_graph = f.read()
graph = graphviz.Source(dot_graph.replace("helvetica", "FangSong"))
graph.view()
參考
- 決策樹在sklearn中的實作–實戰紅酒分類案例
- Graphviz圖片顯示中文亂碼問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/259732.html
標籤:python
