『機(jī)器學(xué)習(xí)』分享機(jī)器學(xué)習(xí)課程學(xué)習(xí)筆記,逐步講述從簡(jiǎn)單的線性回歸、邏輯回歸到 ? 決策樹算法 ? 樸素貝葉斯算法 ? 支持向量機(jī)算法 ? 隨機(jī)森林算法 ? 人工神經(jīng)網(wǎng)絡(luò)算法 等算法的內(nèi)容。
歡迎關(guān)注 『機(jī)器學(xué)習(xí)』 系列,持續(xù)更新中
歡迎關(guān)注 『機(jī)器學(xué)習(xí)』 系列,持續(xù)更新中
資源下載
拿來(lái)即用,所見(jiàn)即所得。
項(xiàng)目倉(cāng)庫(kù):https://gitee.com/miao-zehao/machine-learning/tree/master
實(shí)現(xiàn)思路與核心函數(shù)解讀
基于Python機(jī)器學(xué)習(xí)庫(kù)sklearn.tree.DecisionTreeClassifier決策樹分類模型,對(duì)鳶尾花數(shù)據(jù)集iris.csv建立決策樹模型。
DecisionTreeClassifier分類決策樹
sklearn.tree.DecisionTreeClassifier
創(chuàng)建一個(gè)決策樹分類器模型實(shí)例:tree_model=DecisionTreeClassifier(criterion=“gini”,max_depth=3,random_state=0,splitter=“best”)
參數(shù)解讀:
- 特征選擇標(biāo)準(zhǔn) criterion: string, 默認(rèn)是 “gini”) 設(shè)置為‘gini’(基尼系數(shù))或是‘entropy’(信息熵)
- 決策樹最大深度 max_depth:int或None,可選(默認(rèn)=None)樹的最大深度。如果為 None,則擴(kuò)展節(jié)點(diǎn)直到所有葉子都是純的或直到所有葉子包含少于 min_samples_split 樣本。
- 隨機(jī)數(shù)生成器使用的種子 random_state:int,建議設(shè)置一個(gè)常數(shù)保證在研究參數(shù)時(shí)不會(huì)被隨機(jī)數(shù)干擾。如果為 None,則隨機(jī)數(shù)生成器是 RandomState 使用的實(shí)例np.random
- 拆分器 splitter:字符串,可選(默認(rèn)=“最佳”)用于在每個(gè)節(jié)點(diǎn)處選擇拆分的策略。默認(rèn)是 default=”best”,或者是“random”
tree.plot_tree決策樹可視化
sklearn.tree.plot_tree
創(chuàng)建一個(gè)決策樹可視化實(shí)例:tree_model=DecisionTreeClassifier(criterion=“gini”,max_depth=3,random_state=0,splitter=“best”)
參數(shù)解讀:
- 模型對(duì)象名
- feature_names 特征名稱的列表
- class_names 分類名稱的列表
ps:可能會(huì)遇到如下報(bào)錯(cuò),這個(gè)時(shí)候更新
sklearn
庫(kù)到最新版本,報(bào)錯(cuò)就不會(huì)發(fā)生。
1. 對(duì)決策樹最大深度的研究與可視化
將“決策樹最大深度”分別設(shè)置為3和5建立決策樹模型,并進(jìn)行結(jié)果可視化,對(duì)比建模結(jié)果。
import matplotlib
import sklearn.tree
from sklearn.datasets import load_iris
# 導(dǎo)入決策樹分類器
from sklearn.tree import DecisionTreeClassifier, plot_tree
# 導(dǎo)入分割數(shù)據(jù)集的方法
from sklearn.model_selection import train_test_split
# 導(dǎo)入科學(xué)計(jì)算包
import numpy as np
# 導(dǎo)入繪圖庫(kù)
import matplotlib.pyplot as plt
# 加載鳶尾花數(shù)據(jù)集
iris_dataset = load_iris()
# 分割訓(xùn)練集與測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],test_size=0.2,random_state=0)
def Mytest_max_depth(my_max_depth):
# 創(chuàng)建決策時(shí)分類器-
tree_model=DecisionTreeClassifier(criterion="gini",max_depth=my_max_depth,random_state=0,splitter="best")
# - 特征選擇標(biāo)準(zhǔn) criterion: string, 默認(rèn)是 “gini”) 設(shè)置為‘gini’(基尼系數(shù))或是‘entropy’(信息熵)
# - 決策樹最大深度 max_depth:int或None,可選(默認(rèn)=None)樹的最大深度。如果為 None,則擴(kuò)展節(jié)點(diǎn)直到所有葉子都是純的或直到所有葉子包含少于 min_samples_split 樣本。
# - 隨機(jī)數(shù)生成器使用的種子 random_state:int,建議設(shè)置一個(gè)常數(shù)保證在研究參數(shù)時(shí)不會(huì)被隨機(jī)數(shù)干擾。如果為 None,則隨機(jī)數(shù)生成器是 RandomState 使用的實(shí)例np.random
# - 拆分器 splitter:字符串,可選(默認(rèn)=“最佳”)用于在每個(gè)節(jié)點(diǎn)處選擇拆分的策略。默認(rèn)是 default=”best”,或者是“random”
# 喂入數(shù)據(jù)
tree_model.fit(X_train,y_train)
# 打印模型評(píng)分
print("模型評(píng)分:{}".format(tree_model.score(X_test,y_test)))
# 隨機(jī)生成一組數(shù)據(jù)使用我們的模型預(yù)測(cè)分類
X_iris_test=np.array([[1.0,3.4,1.5,0.2]])
# 用訓(xùn)練好的模型預(yù)測(cè)隨機(jī)生成的樣本數(shù)據(jù)的出的分類結(jié)果
predict_result=tree_model.predict(X_iris_test)
# 打印預(yù)測(cè)分類結(jié)果
print(predict_result)
print("分類結(jié)果:{}".format(iris_dataset['target_names'][predict_result]))
# 模型可視化
iris_feature_names=iris_dataset.feature_names#鳶尾花特征名列表 ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
iris_class_names=iris_dataset.target_names#鳶尾花分類類名列表 ['setosa' 'versicolor' 'virginica']
fig = plt.figure(figsize=(20, 12))#圖片畫布大小比例
matplotlib.rcParams['font.sans-serif'] = [u'SimHei'] # 用來(lái)設(shè)置字體樣式以正常顯示中文標(biāo)簽
matplotlib.rcParams['axes.unicode_minus'] = False # 設(shè)置為 Fasle 來(lái)解決負(fù)號(hào)的亂碼問(wèn)題
sklearn.tree.plot_tree(tree_model,feature_names=iris_feature_names, class_names=iris_class_names, rounded=True, filled= True, fontsize=14)
# 模型對(duì)象名
# feature_names 特征名稱的列表
# class_names 分類名稱的列表
plt.title("決策樹最大深度={}的可視化圖".format(my_max_depth))
plt.savefig("1/決策樹最大深度={}的可視化圖.png".format(my_max_depth))
plt.show()
Mytest_max_depth(3)
Mytest_max_depth(4)
Mytest_max_depth(5)
繪圖結(jié)果
-
決策樹最大深度=3的可視化圖
-
決策樹最大深度=4的可視化圖
-
決策樹最大深度=5的可視化圖
分析
最大深度限制樹的最大深度,超過(guò)設(shè)定深度的樹枝全部剪掉。
高維度低樣本量時(shí)效果比較好,但是決策樹生長(zhǎng)層數(shù)的增加會(huì)導(dǎo)致對(duì)樣本量的需求會(huì)增加一倍,樹深度較低是能夠有效地限制過(guò)擬合。實(shí)際使用時(shí),要逐步嘗試,比如從3開始看看擬合的效果再?zèng)Q定是否增加設(shè)定深度。
2. 對(duì)特征選擇標(biāo)準(zhǔn)的研究與可視化
將“特征選擇標(biāo)準(zhǔn)”分別設(shè)置為‘gini’(基尼系數(shù))和‘entropy’(信息熵)建立決策樹模型,并進(jìn)行結(jié)果可視化,對(duì)比建模結(jié)果;
import matplotlib
import sklearn.tree
from sklearn.datasets import load_iris
# 導(dǎo)入決策樹分類器
from sklearn.tree import DecisionTreeClassifier, plot_tree
# 導(dǎo)入分割數(shù)據(jù)集的方法
from sklearn.model_selection import train_test_split
# 導(dǎo)入科學(xué)計(jì)算包
import numpy as np
# 導(dǎo)入繪圖庫(kù)
import matplotlib.pyplot as plt
# 加載鳶尾花數(shù)據(jù)集
iris_dataset = load_iris()
# 分割訓(xùn)練集與測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],test_size=0.2,random_state=0)
def Mytest_criterion(my_criterion):
# 創(chuàng)建決策時(shí)分類器-
tree_model=DecisionTreeClassifier(criterion=my_criterion,max_depth=4,random_state=0,splitter="best")
# - 特征選擇標(biāo)準(zhǔn) criterion: string, 默認(rèn)是 “gini”) 設(shè)置為‘gini’(基尼系數(shù))或是‘entropy’(信息熵)
# - 決策樹最大深度 max_depth:int或None,可選(默認(rèn)=None)樹的最大深度。如果為 None,則擴(kuò)展節(jié)點(diǎn)直到所有葉子都是純的或直到所有葉子包含少于 min_samples_split 樣本。
# - 隨機(jī)數(shù)生成器使用的種子 random_state:int,建議設(shè)置一個(gè)常數(shù)保證在研究參數(shù)時(shí)不會(huì)被隨機(jī)數(shù)干擾。如果為 None,則隨機(jī)數(shù)生成器是 RandomState 使用的實(shí)例np.random
# - 拆分器 splitter:字符串,可選(默認(rèn)=“最佳”)用于在每個(gè)節(jié)點(diǎn)處選擇拆分的策略。默認(rèn)是 default=”best”,或者是“random”
# 喂入數(shù)據(jù)
tree_model.fit(X_train,y_train)
# 打印模型評(píng)分
print("模型評(píng)分:{}".format(tree_model.score(X_test,y_test)))
# 隨機(jī)生成一組數(shù)據(jù)使用我們的模型預(yù)測(cè)分類
X_iris_test=np.array([[1.0,3.4,1.5,0.2]])
# 用訓(xùn)練好的模型預(yù)測(cè)隨機(jī)生成的樣本數(shù)據(jù)的出的分類結(jié)果
predict_result=tree_model.predict(X_iris_test)
# 打印預(yù)測(cè)分類結(jié)果
print(predict_result)
print("分類結(jié)果:{}".format(iris_dataset['target_names'][predict_result]))
# 模型可視化
iris_feature_names=iris_dataset.feature_names#鳶尾花特征名列表 ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
iris_class_names=iris_dataset.target_names#鳶尾花分類類名列表 ['setosa' 'versicolor' 'virginica']
fig = plt.figure(figsize=(20, 12))#圖片畫布大小比例
matplotlib.rcParams['font.sans-serif'] = [u'SimHei'] # 用來(lái)設(shè)置字體樣式以正常顯示中文標(biāo)簽
matplotlib.rcParams['axes.unicode_minus'] = False # 設(shè)置為 Fasle 來(lái)解決負(fù)號(hào)的亂碼問(wèn)題
sklearn.tree.plot_tree(tree_model,feature_names=iris_feature_names, class_names=iris_class_names, rounded=True, filled= True, fontsize=14)
# 模型對(duì)象名
# feature_names 特征名稱的列表
# class_names 分類名稱的列表
plt.title("決策樹特征選擇標(biāo)準(zhǔn)={}的可視化圖".format(my_criterion))
plt.savefig("2/特征選擇標(biāo)準(zhǔn)={}的可視化圖.png".format(my_criterion))
plt.show()
Mytest_criterion("gini")#基尼系數(shù)
Mytest_criterion("entropy")#信息熵
繪圖結(jié)果
- 特征選擇標(biāo)準(zhǔn)=entropy的可視化圖
- 特征選擇標(biāo)準(zhǔn)=gini的可視化圖
分析
-
從圖上看到我們的兩種特征選擇標(biāo)準(zhǔn)實(shí)際上在這個(gè)鳶尾花數(shù)據(jù)集里對(duì)于分類的結(jié)果趨向一致。實(shí)際上因?yàn)樵跀?shù)學(xué)建模中經(jīng)常使用熵權(quán)法,我一般比較喜歡信息熵ID3算法,所以著重講講信息熵。
-
信息熵:ID3算法—信息增益
信息增益是針對(duì)一個(gè)具體的特征而言的,某個(gè)特征的有無(wú)對(duì)于整個(gè)系統(tǒng)、集合的影響程度就可以用“信息增益”來(lái)描述。我們知道,經(jīng)過(guò)一次 if-else 判別后,原來(lái)的類別集合就被被分裂成兩個(gè)集合,而我們的目的是讓其中一個(gè)集合的某一類別的“純度”盡可能高,如果分裂后子集的純度比原來(lái)集合的純度要高,那就說(shuō)明這是一次 if-else 劃分是有效過(guò)的。通過(guò)比較使的“純度”最高的那個(gè)劃分條件,也就是我們要找的“最合適”的特征維度判別條件。
3. 對(duì)決策樹其他參數(shù)的研究與可視化
嘗試修改決策樹模型中的其他參數(shù)進(jìn)行建模,并對(duì)比建模結(jié)果。
import matplotlib
import sklearn.tree
from sklearn.datasets import load_iris
# 導(dǎo)入決策樹分類器
from sklearn.tree import DecisionTreeClassifier, plot_tree
# 導(dǎo)入分割數(shù)據(jù)集的方法
from sklearn.model_selection import train_test_split
# 導(dǎo)入科學(xué)計(jì)算包
import numpy as np
# 導(dǎo)入繪圖庫(kù)
import matplotlib.pyplot as plt
# 加載鳶尾花數(shù)據(jù)集
iris_dataset = load_iris()
# 分割訓(xùn)練集與測(cè)試集
X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],test_size=0.2,random_state=0)
def Mytest_splitter(my_splitter):
# 創(chuàng)建決策時(shí)分類器-
tree_model=DecisionTreeClassifier(criterion="entropy",max_depth=4,random_state=0,splitter=my_splitter)
# - 特征選擇標(biāo)準(zhǔn) criterion: string, 默認(rèn)是 “gini”) 設(shè)置為‘gini’(基尼系數(shù))或是‘entropy’(信息熵)
# - 決策樹最大深度 max_depth:int或None,可選(默認(rèn)=None)樹的最大深度。如果為 None,則擴(kuò)展節(jié)點(diǎn)直到所有葉子都是純的或直到所有葉子包含少于 min_samples_split 樣本。
# - 隨機(jī)數(shù)生成器使用的種子 random_state:int,建議設(shè)置一個(gè)常數(shù)保證在研究參數(shù)時(shí)不會(huì)被隨機(jī)數(shù)干擾。如果為 None,則隨機(jī)數(shù)生成器是 RandomState 使用的實(shí)例np.random
# - 拆分器 splitter:字符串,可選(默認(rèn)=“最佳”)用于在每個(gè)節(jié)點(diǎn)處選擇拆分的策略。默認(rèn)是 default=”best”,或者是“random”
# 喂入數(shù)據(jù)
tree_model.fit(X_train,y_train)
# 打印模型評(píng)分
print("模型評(píng)分:{}".format(tree_model.score(X_test,y_test)))
# 隨機(jī)生成一組數(shù)據(jù)使用我們的模型預(yù)測(cè)分類
X_iris_test=np.array([[1.0,3.4,1.5,0.2]])
# 用訓(xùn)練好的模型預(yù)測(cè)隨機(jī)生成的樣本數(shù)據(jù)的出的分類結(jié)果
predict_result=tree_model.predict(X_iris_test)
# 打印預(yù)測(cè)分類結(jié)果
print(predict_result)
print("分類結(jié)果:{}".format(iris_dataset['target_names'][predict_result]))
# 模型可視化
iris_feature_names=iris_dataset.feature_names#鳶尾花特征名列表 ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
iris_class_names=iris_dataset.target_names#鳶尾花分類類名列表 ['setosa' 'versicolor' 'virginica']
fig = plt.figure(figsize=(20, 12))#圖片畫布大小比例
matplotlib.rcParams['font.sans-serif'] = [u'SimHei'] # 用來(lái)設(shè)置字體樣式以正常顯示中文標(biāo)簽
matplotlib.rcParams['axes.unicode_minus'] = False # 設(shè)置為 Fasle 來(lái)解決負(fù)號(hào)的亂碼問(wèn)題
sklearn.tree.plot_tree(tree_model,feature_names=iris_feature_names, class_names=iris_class_names, rounded=True, filled= True, fontsize=14)
# 模型對(duì)象名
# feature_names 特征名稱的列表
# class_names 分類名稱的列表
plt.title("決策樹拆分器={}的可視化圖".format(my_splitter))
plt.savefig("3/決策樹拆分器={}的可視化圖.png".format(my_splitter))
plt.show()
Mytest_splitter("best")#
Mytest_splitter("random")#
繪圖結(jié)果
- 決策樹拆分器=best的可視化圖
- 決策樹拆分器=random的可視化圖
分析
在每個(gè)節(jié)點(diǎn)處選擇拆分的策略,“best”與“random”這兩種模式使得決策樹有了很大的區(qū)別,實(shí)際上來(lái)拿個(gè)個(gè)決策樹的最終分類效果相同,只是位置有些變動(dòng)。
總結(jié)
決策樹是一個(gè)預(yù)測(cè)模型;他代表的是對(duì)象屬性與對(duì)象值之間的一種映射關(guān)系。樹中每個(gè)節(jié)點(diǎn)表示某個(gè)對(duì)象,而每個(gè)分叉路徑則代表的某個(gè)可能的屬性值,而每個(gè)葉結(jié)點(diǎn)則對(duì)應(yīng)從根節(jié)點(diǎn)到該葉節(jié)點(diǎn)所經(jīng)歷的路徑所表示的對(duì)象的值。決策樹僅有單一輸出,若欲有復(fù)數(shù)輸出,可以建立獨(dú)立的決策樹以處理不同輸出。
我在高等數(shù)學(xué)建模大賽中經(jīng)常使用熵權(quán)法(被指導(dǎo)老師dis為比較初級(jí)的方法,爛大街的方法)實(shí)際上這個(gè)就是決策樹的基本原理,通過(guò)對(duì)屬性進(jìn)行分割,從而降低整體的混亂程度。即對(duì)一個(gè)屬性的不同取值進(jìn)行分組以后,每一組的混亂程度做個(gè)加權(quán)和,根據(jù)權(quán)重大小衡量屬性的重要性。
大家喜歡的話,給個(gè)??,點(diǎn)個(gè)關(guān)注!給大家分享更多有趣好玩的python機(jī)器學(xué)習(xí)知識(shí)!
版權(quán)聲明:
發(fā)現(xiàn)你走遠(yuǎn)了@mzh原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接
Copyright 2022 mzh
Crated:2022-9-23文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-452396.html
歡迎關(guān)注 『機(jī)器學(xué)習(xí)』 系列,持續(xù)更新中
歡迎關(guān)注 『機(jī)器學(xué)習(xí)』 系列,持續(xù)更新中
【機(jī)器學(xué)習(xí)】01. 波士頓房?jī)r(jià)為例子學(xué)習(xí)線性回歸
【機(jī)器學(xué)習(xí)】02. 使用sklearn庫(kù)牛頓化、正則化的邏輯回歸
【機(jī)器學(xué)習(xí)】03. 支持向量機(jī)SVM庫(kù)進(jìn)行可視化分類
【機(jī)器學(xué)習(xí)】04. 神經(jīng)網(wǎng)絡(luò)模型 MLPClassifier分類算法與MLPRegressor回歸算法
【機(jī)器學(xué)習(xí)】05. 聚類分析
【機(jī)器學(xué)習(xí)】07. 決策樹模型DecisionTreeClassifier
【機(jī)器學(xué)習(xí)】08. 深度學(xué)習(xí)CNN卷積神經(jīng)網(wǎng)絡(luò)keras庫(kù)
【更多內(nèi)容敬請(qǐng)期待】文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-452396.html
到了這里,關(guān)于【機(jī)器學(xué)習(xí)】07. 決策樹模型DecisionTreeClassifier(代碼注釋,思路推導(dǎo))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!