摘要:起步在理論篇我們介紹了決策樹的構(gòu)建和一些關(guān)于熵的計(jì)算方法,這篇文章將根據(jù)一個(gè)例子,用代碼上來實(shí)現(xiàn)決策樹。轉(zhuǎn)化文件至可視化決策樹的命令得到一個(gè)文件,打開可以看到?jīng)Q策樹附錄本次應(yīng)用的全部代碼向量化向量化構(gòu)造決策樹保存模型測試數(shù)據(jù)
起步
在理論篇我們介紹了決策樹的構(gòu)建和一些關(guān)于熵的計(jì)算方法,這篇文章將根據(jù)一個(gè)例子,用代碼上來實(shí)現(xiàn)決策樹。
實(shí)驗(yàn)環(huán)境操作系統(tǒng): win10 64
編程語言: Python3.6
用到的第三方模塊有:
numpy (1.12.1+mkl) scikit-learn (0.19.1)數(shù)據(jù)源
為了方便理解和架設(shè),我們用理論篇中買電腦的例子:
將這些記錄保存成 csv 文件:
RID,age,income,student,credit_rating,class:buys_computer 1,youth,hight,no,fair,no 2,youth,hight,no,excellent,no 3,middle_aged,hight,no,fair,yes 4,senior,medium,no,fair,yes 5,senior,low,yes,fair,yes 6,senior,low,yes,excellent,no 7,middle_aged,low,yes,excellent,yes 8,youth,medium,no,fair,no 9,youth,low,yes,fair,yes 10,senior,medium,yes,fair,yes 11,youth,medium,yes,excellent,yes 12,middle_aged,medium,no,excellent,yes 13,middle_aged,hight,yes,fair,yes 14,senior,medium,no,excellent,no
這些數(shù)據(jù)就是這次應(yīng)用的數(shù)據(jù)源。
數(shù)據(jù)整理可以利用python標(biāo)準(zhǔn)庫中 csv 來對這個(gè)數(shù)據(jù)源進(jìn)行讀取,要對原始數(shù)據(jù)集進(jìn)行整理,隨機(jī)變量放在一個(gè)數(shù)組,分類結(jié)果放在另一個(gè)數(shù)組,形如:
future_list = [ { "age" : "youth", "income": "hight", ... } ... ] answer_list = ["no", "no", "yes", ...]
按照這個(gè)思路我們構(gòu)造一下:
data_file = open("computer_buy.csv", "r") reader = csv.reader(data_file) headers = next(reader) future_list = [] label_list = [] for row in reader: label_list.append(row[-1]) row_dict = {} for i in range(1, len(row) -1): row_dict[ headers[i] ] = row[i] future_list.append(row_dict) data_file.close()隨機(jī)變量向量化
在 sklearn 提供的庫中,對輸入的特征有一定的要求,所有特征和分類都要是數(shù)值型的值,不能是例子中的類別的值。
怎么轉(zhuǎn)化呢?
比方說 age 這個(gè)特征,它有三個(gè)值: youth , middle_aged , senior 。有一條記錄的 age=youth 針對這個(gè)特征我們就變成:
youth | middle_aged | senior |
---|---|---|
1 | 0 | 0 |
那么第一條記錄 youth,hight,no,fair 轉(zhuǎn)化為:
age=middle_aged | age=senior | age=youth | credit_rating=excellent | credit_rating=fair | income=hight | income=low | income=medium | student=no | student=yes |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
from sklearn.feature_extraction import DictVectorizer dummy_x = vec.fit_transform(future_list).toarray() print("dummy_x:", dummy_x) print("vec.get_feature_names()", vec.get_feature_names())分類結(jié)果向量化
from sklearn import preprocessing lb = preprocessing.LabelBinarizer() dummy_y = lb.fit_transform(label_list)構(gòu)造決策樹
在 sklearn 中提供了多種決策樹構(gòu)建方法,這邊需要向其表明,是依據(jù) 信息增益 的方式來構(gòu)造決策樹的,因此需要傳入一個(gè)參數(shù)
criterion="entropy":
from sklearn import tree # 構(gòu)造決策樹 clf = tree.DecisionTreeClassifier(criterion="entropy") clf.fit(dummy_x, dummy_y) print("clf: ", clf)保存模型
將訓(xùn)練好的模型保存到文件里去:
# 保存模型 with open("result.dot", "w") as f: tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f)測試數(shù)據(jù)
接下來就是給它隨機(jī)變量,讓決策樹來進(jìn)行分類。我們修改第一條記錄來進(jìn)行測試:
# 測試數(shù)據(jù) first_row = dummy_x[0, :] new_row = list(first_row) new_row[0] = 1 new_row[2] = 0 predict = clf.predict([new_row]) print("predict:", predict) # output: [1]模型可視化
可視化用到了 Graphviz 軟件,可以到官網(wǎng):http://www.graphviz.org/ 下載,我下載的是 zip 文件,解壓后將目錄加到環(huán)境變量中去。
轉(zhuǎn)化 dot 文件至 pdf 可視化決策樹的命令:
dot -Tpdf result.dot -o outpu.pdf
得到一個(gè)pdf文件,打開可以看到?jīng)Q策樹:
附錄本次應(yīng)用的全部代碼:
# coding: utf-8 import csv from sklearn.feature_extraction import DictVectorizer from sklearn import preprocessing from sklearn import tree data_file = open("computer_buy.csv", "r") reader = csv.reader(data_file) headers = next(reader) future_list = [] label_list = [] for row in reader: label_list.append(row[-1]) row_dict = {} for i in range(1, len(row) -1): row_dict[ headers[i] ] = row[i] future_list.append(row_dict) data_file.close() # 向量化 x vec = DictVectorizer() dummy_x = vec.fit_transform(future_list).toarray() print("dummy_x:", dummy_x) print("vec.get_feature_names()", vec.get_feature_names()) # 向量化 y lb = preprocessing.LabelBinarizer() dummy_y = lb.fit_transform(label_list) # 構(gòu)造決策樹 clf = tree.DecisionTreeClassifier(criterion="entropy") clf.fit(dummy_x, dummy_y) print("clf: ", clf) # 保存模型 with open("result.dot", "w") as f: tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f) # 測試數(shù)據(jù) first_row = dummy_x[0, :] new_row = list(first_row) new_row[0] = 1 new_row[2] = 0 predict = clf.predict([new_row]) print("predict:", predict)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44524.html
摘要:后剪枝先創(chuàng)建完整的決策樹,然后再嘗試消除多余的節(jié)點(diǎn),也就是采用減枝的方法。 起步 決策樹(decision tree)是一個(gè)樹結(jié)構(gòu),可以是二叉樹或非二叉樹,也可以把他看作是 if-else 規(guī)則的集合,也可以認(rèn)為是在特征空間上的條件概率分布。 決策樹的結(jié)構(gòu) 以一個(gè)簡單的用于是否買電腦預(yù)測的決策樹為例子: showImg(https://segmentfault.com/img/remo...
摘要:翻譯自昨天收到推送了一篇介紹隨機(jī)森林算法的郵件,感覺作為介紹和入門不錯,就順手把它翻譯一下。隨機(jī)森林引入的隨機(jī)森林算法將自動創(chuàng)建隨機(jī)決策樹群?;貧w隨機(jī)森林也可以用于回歸問題。結(jié)語隨機(jī)森林相當(dāng)起來非常容易。 翻譯自:http://blog.yhat.com/posts/python-random-forest.html 昨天收到y(tǒng)hat推送了一篇介紹隨機(jī)森林算法的郵件,感覺作為介紹和入門...
閱讀 2657·2021-10-08 10:04
閱讀 2748·2021-09-06 15:02
閱讀 839·2019-08-30 13:50
閱讀 1566·2019-08-30 13:21
閱讀 2598·2019-08-30 11:15
閱讀 2125·2019-08-29 17:19
閱讀 1592·2019-08-26 13:55
閱讀 1270·2019-08-26 10:15