成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

分類算法之決策樹(應(yīng)用篇)

luoyibu / 3272人閱讀

摘要:起步在理論篇我們介紹了決策樹的構(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

相關(guān)文章

  • 分類算法決策(理論

    摘要:后剪枝先創(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...

    jzzlee 評論0 收藏0
  • 隨機(jī)森林算法入門(python)

    摘要:翻譯自昨天收到推送了一篇介紹隨機(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ī)森林算法的郵件,感覺作為介紹和入門...

    張遷 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<