前面有跟大家出過(guò)兩期關(guān)于決策樹(shù)算法的 Python學(xué)習(xí)教程 ,伙伴們學(xué)了學(xué)了,今天來(lái)點(diǎn)實(shí)際的吧,實(shí)踐一把!做個(gè)鞏固!
專注于為中小企業(yè)提供成都網(wǎng)站制作、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)芝罘免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了近千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。Python有一個(gè)著名的機(jī)器學(xué)習(xí)框架,叫sklearn。我們可以用sklearn來(lái)運(yùn)行前面說(shuō)到的賴床的例子。不過(guò)在這之前,我們需要介紹一下sklearn中訓(xùn)練一顆決策樹(shù)的具體參數(shù)。
另外sklearn中訓(xùn)練決策樹(shù)的默認(rèn)算法是CART,使用CART決策樹(shù)的好處是可以用它來(lái)進(jìn)行回歸和分類處理,不過(guò)這里我們只進(jìn)行分類處理。
我們都知道,一個(gè)模型中很重要的一步是調(diào)參。在sklearn中,模型的參數(shù)是通過(guò)方法參數(shù)來(lái)決定的,以下給出sklearn中,決策樹(shù)的參數(shù):
DecisionTreeClassifier(criterion="gini",
splitter="best",
max_depth=None,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.,
max_features=None,
random_state=None,
max_leaf_nodes=None,
min_impurity_decrease=0.,
min_impurity_split=None,
class_weight=None,
presort=False)
參數(shù)含義:
1.criterion:string, optional (default="gini")
(1).criterion='gini',分裂節(jié)點(diǎn)時(shí)評(píng)價(jià)準(zhǔn)則是Gini指數(shù)。
(2).criterion='entropy',分裂節(jié)點(diǎn)時(shí)的評(píng)價(jià)指標(biāo)是信息增益。
2.max_depth:int or None, optional (default=None)。指定樹(shù)的大深度。
如果為None,表示樹(shù)的深度不限。直到所有的葉子節(jié)點(diǎn)都是純凈的,即葉子節(jié)點(diǎn)
中所有的樣本點(diǎn)都屬于同一個(gè)類別?;蛘呙總€(gè)葉子節(jié)點(diǎn)包含的樣本數(shù)小于min_samples_split。
3.splitter:string, optional (default="best")。指定分裂節(jié)點(diǎn)時(shí)的策略。
(1).splitter='best',表示選擇最優(yōu)的分裂策略。
(2).splitter='random',表示選擇最好的隨機(jī)切分策略。
4.min_samples_split:int, float, optional (default=2)。表示分裂一個(gè)內(nèi)部節(jié)點(diǎn)需要的做少樣本數(shù)。
(1).如果為整數(shù),則min_samples_split就是最少樣本數(shù)。
(2).如果為浮點(diǎn)數(shù)(0到1之間),則每次分裂最少樣本數(shù)為ceil(min_samples_split * n_samples)
5.min_samples_leaf: int, float, optional (default=1)。指定每個(gè)葉子節(jié)點(diǎn)需要的最少樣本數(shù)。
(1).如果為整數(shù),則min_samples_split就是最少樣本數(shù)。
(2).如果為浮點(diǎn)數(shù)(0到1之間),則每個(gè)葉子節(jié)點(diǎn)最少樣本數(shù)為ceil(min_samples_leaf * n_samples)
6.min_weight_fraction_leaf:float, optional (default=0.)
指定葉子節(jié)點(diǎn)中樣本的最小權(quán)重。
7.max_features:int, float, string or None, optional (default=None).
搜尋最佳劃分的時(shí)候考慮的特征數(shù)量。
(1).如果為整數(shù),每次分裂只考慮max_features個(gè)特征。
(2).如果為浮點(diǎn)數(shù)(0到1之間),每次切分只考慮int(max_features * n_features)個(gè)特征。
(3).如果為'auto'或者'sqrt',則每次切分只考慮sqrt(n_features)個(gè)特征
(4).如果為'log2',則每次切分只考慮log2(n_features)個(gè)特征。
(5).如果為None,則每次切分考慮n_features個(gè)特征。
(6).如果已經(jīng)考慮了max_features個(gè)特征,但還是沒(méi)有找到一個(gè)有效的切分,那么還會(huì)繼續(xù)尋找
下一個(gè)特征,直到找到一個(gè)有效的切分為止。
8.random_state:int, RandomState instance or None, optional (default=None)
(1).如果為整數(shù),則它指定了隨機(jī)數(shù)生成器的種子。
(2).如果為RandomState實(shí)例,則指定了隨機(jī)數(shù)生成器。
(3).如果為None,則使用默認(rèn)的隨機(jī)數(shù)生成器。
9.max_leaf_nodes: int or None, optional (default=None)。指定了葉子節(jié)點(diǎn)的大數(shù)量。
(1).如果為None,葉子節(jié)點(diǎn)數(shù)量不限。
(2).如果為整數(shù),則max_depth被忽略。
10.min_impurity_decrease:float, optional (default=0.)
如果節(jié)點(diǎn)的分裂導(dǎo)致不純度的減少(分裂后樣本比分裂前更加純凈)大于或等于min_impurity_decrease,則分裂該節(jié)點(diǎn)。
加權(quán)不純度的減少量計(jì)算公式為:
min_impurity_decrease=N_t / N * (impurity - N_t_R / N_t * right_impurity
- N_t_L / N_t * left_impurity)
其中N是樣本的總數(shù),N_t是當(dāng)前節(jié)點(diǎn)的樣本數(shù),N_t_L是分裂后左子節(jié)點(diǎn)的樣本數(shù),
N_t_R是分裂后右子節(jié)點(diǎn)的樣本數(shù)。impurity指當(dāng)前節(jié)點(diǎn)的基尼指數(shù),right_impurity指
分裂后右子節(jié)點(diǎn)的基尼指數(shù)。left_impurity指分裂后左子節(jié)點(diǎn)的基尼指數(shù)。
11.min_impurity_split:float
樹(shù)生長(zhǎng)過(guò)程中早停止的閾值。如果當(dāng)前節(jié)點(diǎn)的不純度高于閾值,節(jié)點(diǎn)將分裂,否則它是葉子節(jié)點(diǎn)。
這個(gè)參數(shù)已經(jīng)被棄用。用min_impurity_decrease代替了min_impurity_split。
12.class_weight:dict, list of dicts, "balanced" or None, default=None
類別權(quán)重的形式為{class_label: weight}
(1).如果沒(méi)有給出每個(gè)類別的權(quán)重,則每個(gè)類別的權(quán)重都為1。
(2).如果class_weight='balanced',則分類的權(quán)重與樣本中每個(gè)類別出現(xiàn)的頻率成反比。
計(jì)算公式為:n_samples / (n_classes * np.bincount(y))
(3).如果sample_weight提供了樣本權(quán)重(由fit方法提供),則這些權(quán)重都會(huì)乘以sample_weight。
13.presort:bool, optional (default=False)
指定是否需要提前排序數(shù)據(jù)從而加速訓(xùn)練中尋找最優(yōu)切分的過(guò)程。設(shè)置為True時(shí),對(duì)于大數(shù)據(jù)集
會(huì)減慢總體的訓(xùn)練過(guò)程;但是對(duì)于一個(gè)小數(shù)據(jù)集或者設(shè)定了大深度的情況下,會(huì)加速訓(xùn)練過(guò)程。
雖然看起來(lái)參數(shù)眾多,但通常參數(shù)都會(huì)有默認(rèn)值,我們只需要調(diào)整其中較為重要的幾個(gè)參數(shù)就行。
通常來(lái)說(shuō),較為重要的參數(shù)有:
2.1 準(zhǔn)備數(shù)據(jù)及讀取
數(shù)據(jù)就是上次說(shuō)到的賴床特征,
季節(jié)時(shí)間已過(guò) 8 點(diǎn)風(fēng)力情況要不要賴床springnobreezeyeswinternono windyesautumnyesbreezeyeswinternono windyessummernobreezeyeswinteryesbreezeyeswinternogaleyeswinternono windyesspringyesno windnosummeryesgalenosummernogalenoautumnyesbreezeno
將它存儲(chǔ)成 csv 文件
spring,no,breeze,yes winter,no,no wind,yes autumn,yes,breeze,yes winter,no,no wind,yes summer,no,breeze,yes winter,yes,breeze,yes winter,no,gale,yes winter,no,no wind,yes spring,yes,no wind,no summer,yes,gale,no summer,no,gale,no autumn,yes,breeze,no
2.2 決策樹(shù)的特征向量化DictVectorizer
sklearn的DictVectorizer能對(duì)字典進(jìn)行向量化。什么叫向量化呢?比如說(shuō)你有季節(jié)這個(gè)屬性有[春,夏,秋,冬]四個(gè)可選值,那么如果是春季,就可以用[1,0,0,0]表示,夏季就可以用[0,1,0,0]表示。不過(guò)在調(diào)用DictVectorizer它會(huì)將這些屬性打亂,不會(huì)按照我們的思路來(lái)運(yùn)行,但我們也可以一個(gè)方法查看,我們看看代碼就明白了。
import pandas as pd from sklearn.feature_extraction import DictVectorizer from sklearn import tree from sklearn.model_selection import train_test_split #pandas 讀取 csv 文件,header = None 表示不將首行作為列 data = pd.read_csv('data/laic.csv',header =None) #指定列 data.columns = ['season','after 8','wind','lay bed'] #sparse=False意思是不產(chǎn)生稀疏矩陣 vec=DictVectorizer(sparse=False) #先用 pandas 對(duì)每行生成字典,然后進(jìn)行向量化 feature = data[['season','after 8','wind']] X_train = vec.fit_transform(feature.to_dict(orient='record')) #打印各個(gè)變量 print('show feature\n',feature) print('show vector\n',X_train) print('show vector name\n',vec.get_feature_names())
我們來(lái)看看打印的結(jié)果:
show feature season after 8 wind 0 spring no breeze 1 winter no no wind 2 autumn yes breeze 3 winter no no wind 4 summer no breeze 5 winter yes breeze 6 winter no gale 7 winter no no wind 8 spring yes no wind 9 summer yes gale 10 summer no gale 11 autumn yes breeze show vector [[1. 0. 0. 1. 0. 0. 1. 0. 0.] [1. 0. 0. 0. 0. 1. 0. 0. 1.] [0. 1. 1. 0. 0. 0. 1. 0. 0.] [1. 0. 0. 0. 0. 1. 0. 0. 1.] [1. 0. 0. 0. 1. 0. 1. 0. 0.] [0. 1. 0. 0. 0. 1. 1. 0. 0.] [1. 0. 0. 0. 0. 1. 0. 1. 0.] [1. 0. 0. 0. 0. 1. 0. 0. 1.] [0. 1. 0. 1. 0. 0. 0. 0. 1.] [0. 1. 0. 0. 1. 0. 0. 1. 0.] [1. 0. 0. 0. 1. 0. 0. 1. 0.] [0. 1. 1. 0. 0. 0. 1. 0. 0.]] show vector name ['after 8=no', 'after 8=yes', 'season=autumn', 'season=spring', 'season=summer', 'season=winter', 'wind=breeze', 'wind=gale', 'wind=no wind']
通過(guò)DictVectorizer,我們就能夠把字符型的數(shù)據(jù),轉(zhuǎn)化成0 1的矩陣,方便后面進(jìn)行運(yùn)算。額外說(shuō)一句,這種轉(zhuǎn)換方式其實(shí)就是one-hot編碼。
2.4 決策樹(shù)訓(xùn)練
可以發(fā)現(xiàn)在向量化的時(shí)候,屬性都被打亂了,但我們也可以通過(guò)get_feature_names()這個(gè)方法查看對(duì)應(yīng)的屬性值。有了數(shù)據(jù)后,就可以來(lái)訓(xùn)練一顆決策樹(shù)了,用sklearn很方便,只需要很少的代碼
#劃分成訓(xùn)練集,交叉集,驗(yàn)證集,不過(guò)這里我們數(shù)據(jù)量不夠大,沒(méi)必要 #train_x, test_x, train_y, test_y = train_test_split(X_train, Y_train, test_size = 0.3) #訓(xùn)練決策樹(shù) clf = tree.DecisionTreeClassifier(criterion='gini') clf.fit(X_train,Y_train) #保存成 dot 文件,后面可以用 dot out.dot -T pdf -o out.pdf 轉(zhuǎn)換成圖片 with open("out.dot", 'w') as f : f = tree.export_graphviz(clf, out_file = f, feature_names = vec.get_feature_names())
2.5 決策樹(shù)可視化
當(dāng)完成一棵樹(shù)的訓(xùn)練的時(shí)候,我們也可以讓它可視化展示出來(lái),不過(guò)sklearn沒(méi)有提供這種功能,它僅僅能夠讓訓(xùn)練的模型保存到dot文件中。但我們可以借助其他工具讓模型可視化,先看保存到dot的代碼:
from sklearn import tree with open("out.dot", 'w') as f : f = tree.export_graphviz(clf, out_file = f, feature_names = vec.get_feature_names())
決策樹(shù)可視化我們用Graphviz這個(gè)東西。當(dāng)然需要先用pip安裝對(duì)應(yīng)的庫(kù)類。然后再去官網(wǎng)下載它的一個(gè)發(fā)行版本,用以將dot文件轉(zhuǎn)化成pdf圖片。
官網(wǎng)下載方式如下:
文章名稱:Python學(xué)習(xí)教程:決策樹(shù)算法(三)sklearn決策樹(shù)實(shí)戰(zhàn)-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://aaarwkj.com/article18/dihegp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、App開(kāi)發(fā)、Google、企業(yè)網(wǎng)站制作、網(wǎng)站改版、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
營(yíng)銷型網(wǎng)站建設(shè)知識(shí)