使用scikit-learn決策樹實現簡單預測


1、scikit-learn決策樹算法庫介紹

scikit-learn決策樹算法類庫內部實現是使用了調優過的CART樹算法,既可以做分類,又可以做回歸。分類決策樹的類對應的是DecisionTreeClassifier,而回歸決策樹的類對應的是DecisionTreeRegressor。

本實例采用分類庫來做。

2、各環境安裝

我使用的是python3環境

安裝scikit-learn:pip3 install scikit-learn

安裝numpy:pip3 install numpy

安裝scipy:pip3 install scipy

安裝matplotlib:pip3 install matplotlib

3、切入正題

首先:我的原始數據是Excel文件,將它保存為csv格式,如data.csv

下面建一個python文件

首先讀取數據

import csv # 這個庫是python自帶的用來處理csv數據的庫
#
讀取csv數據文件 allElectronicsData = open('data.csv', 'r',encoding='utf8') reader = csv.reader(allElectronicsData) # 按行讀取內容 headers=next(reader) #讀取第一行的標題

因為scikit-learn處理數據時對數據的格式有要求,要求是矩陣格式的,所以對讀取的數據進行預處理,處理成要求的格式。

# 對數據進行預處理,轉換為字典形式
featureList = []
labelList = []

# 將每一行的數據編程字典的形式存入列表
for row in [rows for rows in reader]:
    # print(row)
    labelList.append(row[len(row) - 1]) # 存入目標結果的數據最后一列的
    rowDict = {}
    for i in range(1, len(row) - 1):
        # print(row[i])
        rowDict[headers[i]] = row[i]
        # print('rowDict:', rowDict)
    featureList.append(rowDict)
print(featureList)

使用scikit-learn自帶的DictVectorizer()類將字典轉換為要求的矩陣數據

 
         
from sklearn.feature_extraction import DictVectorizer
from sklearn import preprocessing

#
將原始數據轉換成矩陣數據 vec=DictVectorizer() dummyX=vec.fit_transform(featureList).toarray() # 將參考的列轉化維數組 print('dummyX:'+str(dummyX)) print(vec.get_feature_names()) print('labellist:'+str(labelList)) # 將要預測的列轉化為數組 lb=preprocessing.LabelBinarizer() dummyY=lb.fit_transform(labelList) print('dummyY:'+str(dummyY))

創建決策樹:

from sklearn import tree
# 創建決策樹
clf=tree.DecisionTreeClassifier(criterion='entropy')#指明為那個算法
clf=clf.fit(dummyX,dummyY)
print('clf:'+str(clf))

將決策樹可視化輸出:使用graphviz(下載地址)進行可視化

安裝:將下載的zip文件解壓到合適的位置,然后將bin目錄添加到系統path中。

使用pydotplus模塊輸出pdf決策樹。pydotplus安裝:pip3 install pydotplus

# 直接導出為pdf樹形結構
#import pydot
from sklearn.externals.six import StringIO
import pydotplus
dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data)
# graph = pydot.graph_from_dot_data(dot_data.getvalue())
# graph[0].write_pdf("iris.pdf")
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("mytree.pdf")

最后對新的數據進行預測:

# 預測數據
one=dummyX[2, :]
print('one'+str(one))
# one輸出為one[1. 0. 0. 0. 1. 1. 0. 0. 1. 0.]
# 上面的數據對應下面列表:
#['age=middle_aged', 'age=senior', 'age=youth', 'credit_rating=excellent', 'credit_rating=fair', 'income=high', 'income=low', 'income=medium', 'student=no', 'student=yes']

# 設置新數據
new=one
new[4]=1
new[3]=0
predictedY=clf.predict(new.reshape(-1,10))# 對新數據進行預測
print('predictedY:'+str(predictedY)) # 輸出為predictedY:[1],表示願意購買,1表示yes

下面附上全部代碼:

# -*- coding: utf-8 -*-
# @Author  : FELIX
# @Date    : 2018/3/20 20:37
import csv
from sklearn.feature_extraction import DictVectorizer
from sklearn import preprocessing
from sklearn import tree
from sklearn.externals.six import StringIO

# 讀取csv數據文件
allElectronicsData = open('data.csv', 'r',encoding='utf8')
reader = csv.reader(allElectronicsData)# 按行讀取內容
headers=next(reader)


# print(list(reader))
#
# 對數據進行預處理,轉換為矩陣形式
featureList = []
labelList = []

# 將每一行的數據編程字典的形式存入列表
for row in [rows for rows in reader]:
    # print(row)
    labelList.append(row[len(row) - 1])
    rowDict = {}
    for i in range(1, len(row) - 1):
        # print(row[i])
        rowDict[headers[i]] = row[i]
        # print('rowDict:', rowDict)
    featureList.append(rowDict)
print(featureList)

# 將原始數據轉換成矩陣數據
vec=DictVectorizer()
dummyX=vec.fit_transform(featureList).toarray() # 將參考的列轉化維數組

print('dummyX:'+str(dummyX))
print(vec.get_feature_names())

print('labellist:'+str(labelList))

# 將要預測的列轉化為數組
lb=preprocessing.LabelBinarizer()
dummyY=lb.fit_transform(labelList)
print('dummyY:'+str(dummyY))


# 創建決策樹
clf=tree.DecisionTreeClassifier(criterion='entropy')#指明為那個算法
clf=clf.fit(dummyX,dummyY)
print('clf:'+str(clf))

# 直接導出為pdf樹形結構
import pydot,pydotplus
dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data)
# graph = pydot.graph_from_dot_data(dot_data.getvalue())
# graph[0].write_pdf("iris.pdf")
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("iris2.pdf")


with open('allElectronicInformationGainOri.dot','w') as f:
    f=tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file=f)
    # 通過命令行dot -Tpdf allElectronicInformationGainOri.dot -o output.pdf 輸出樹形結構

# 預測數據
one=dummyX[2, :]
print('one'+str(one))
# one輸出為one[1. 0. 0. 0. 1. 1. 0. 0. 1. 0.]
# 上面的數據對應下面列表:
#['age=middle_aged', 'age=senior', 'age=youth', 'credit_rating=excellent', 'credit_rating=fair', 'income=high', 'income=low', 'income=medium', 'student=no', 'student=yes']

# 設置新數據
new=one
new[4]=1
new[3]=0
predictedY=clf.predict(new.reshape(-1,10))# 對新數據進行預測
print('predictedY:'+str(predictedY)) # 輸出為predictedY:[1],表示願意購買,1表示yes
全部代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM