摘要:起步在理論篇我們介紹了決策樹的構建和一些關于熵的計算方法,這篇文章將根據一個例子,用代碼上來實現決策樹。轉化文件至可視化決策樹的命令得到一個文件,打開可以看到決策樹附錄本次應用的全部代碼向量化向量化構造決策樹保存模型測試數據
起步
在理論篇我們介紹了決策樹的構建和一些關于熵的計算方法,這篇文章將根據一個例子,用代碼上來實現決策樹。
實驗環境操作系統: win10 64
編程語言: Python3.6
用到的第三方模塊有:
numpy (1.12.1+mkl) scikit-learn (0.19.1)數據源
為了方便理解和架設,我們用理論篇中買電腦的例子:
將這些記錄保存成 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
這些數據就是這次應用的數據源。
數據整理可以利用python標準庫中 csv 來對這個數據源進行讀取,要對原始數據集進行整理,隨機變量放在一個數組,分類結果放在另一個數組,形如:
future_list = [ { "age" : "youth", "income": "hight", ... } ... ] answer_list = ["no", "no", "yes", ...]
按照這個思路我們構造一下:
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()隨機變量向量化
在 sklearn 提供的庫中,對輸入的特征有一定的要求,所有特征和分類都要是數值型的值,不能是例子中的類別的值。
怎么轉化呢?
比方說 age 這個特征,它有三個值: youth , middle_aged , senior 。有一條記錄的 age=youth 針對這個特征我們就變成:
youth | middle_aged | senior |
---|---|---|
1 | 0 | 0 |
那么第一條記錄 youth,hight,no,fair 轉化為:
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())分類結果向量化
from sklearn import preprocessing lb = preprocessing.LabelBinarizer() dummy_y = lb.fit_transform(label_list)構造決策樹
在 sklearn 中提供了多種決策樹構建方法,這邊需要向其表明,是依據 信息增益 的方式來構造決策樹的,因此需要傳入一個參數
criterion="entropy":
from sklearn import tree # 構造決策樹 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)測試數據
接下來就是給它隨機變量,讓決策樹來進行分類。我們修改第一條記錄來進行測試:
# 測試數據 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 軟件,可以到官網:http://www.graphviz.org/ 下載,我下載的是 zip 文件,解壓后將目錄加到環境變量中去。
轉化 dot 文件至 pdf 可視化決策樹的命令:
dot -Tpdf result.dot -o outpu.pdf
得到一個pdf文件,打開可以看到決策樹:
附錄本次應用的全部代碼:
# 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) # 構造決策樹 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) # 測試數據 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)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44524.html
摘要:后剪枝先創建完整的決策樹,然后再嘗試消除多余的節點,也就是采用減枝的方法。 起步 決策樹(decision tree)是一個樹結構,可以是二叉樹或非二叉樹,也可以把他看作是 if-else 規則的集合,也可以認為是在特征空間上的條件概率分布。 決策樹的結構 以一個簡單的用于是否買電腦預測的決策樹為例子: showImg(https://segmentfault.com/img/remo...
摘要:翻譯自昨天收到推送了一篇介紹隨機森林算法的郵件,感覺作為介紹和入門不錯,就順手把它翻譯一下。隨機森林引入的隨機森林算法將自動創建隨機決策樹群。回歸隨機森林也可以用于回歸問題。結語隨機森林相當起來非常容易。 翻譯自:http://blog.yhat.com/posts/python-random-forest.html 昨天收到yhat推送了一篇介紹隨機森林算法的郵件,感覺作為介紹和入門...
閱讀 2572·2021-10-08 10:04
閱讀 2734·2021-09-06 15:02
閱讀 788·2019-08-30 13:50
閱讀 1547·2019-08-30 13:21
閱讀 2586·2019-08-30 11:15
閱讀 2112·2019-08-29 17:19
閱讀 1573·2019-08-26 13:55
閱讀 1260·2019-08-26 10:15