python_機器學習_監督學習模型_決策樹


 

決策樹模型練習:https://www.kaggle.com/c/GiveMeSomeCredit/overview

1. 監督學習--分類

 

機器學習腫分類和預測算法的評估:

  a. 准確率

  b.速度

  c. 強壯行

  d.可規模性

  e. 可解釋性

 

2. 什么是決策樹/判定樹(decision tree)?

https://scikit-learn.org/stable/modules/tree.html

 

 

 

 

 3. 熵(entropy)概念:

 

 

 變量的不確定越大,熵也就越大。

 

4. 決策樹歸納算法(ID3)

5. 其他算法及優缺點 

 

6. 決策樹的應用

 

 

 

生成后的決策樹

 

 

邏輯代碼:

整理好的代碼 --》

python3.6.3

Successfully installed joblib-0.13.2 numpy-1.16.4 scikit-learn-0.21.2 scipy-1.3.0

# -*- coding:utf-8 -*-
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import preprocessing
from sklearn import tree  # 要求是數值型的值
from sklearn.externals.six import StringIO
import pandas as pd

"""
注意: 決策樹要求要數值型的值,不能是字符串類型的值
例如: no, yes這樣的值是不允許的
需要轉換成矩陣
====================================
age            income    student
youth        high    no
youth        high    no
middle_aged    high    no
senior        medium    no
senior        low    yes
====================================

比如上面這種數據:
youth    middle_aged        senior         high    medium    low    ......
1        0                0            1        0        0
1        0                0            1        0        0
.....

"""

fileName = r"C:\Users\Administrator\Desktop\data.xlsx"
data = pd.read_excel(fileName)
# 刪除id序列
del data["RID"]
# headers
headers = data.columns.values
# print(headers)
# ["RID", 'age'.....]

# 樣本量
# print(len(data))

# dict格式化單個樣本
# print(dict(data.ix[1]))
# 單個樣本最后一個數據
# print(data.ix[1][-1])


featureList = []
labelList = []
for row in range(len(data)):
    rowData = data.ix[row]
    labelList.append(rowData[-1])
    featureList.append(dict(rowData))

# print(featureList)

# [
#    {"credit_rating": "fair", "age": "youth"},
#    .... #作用,方便轉換成矩陣。將數據轉換成對象
# ]
# print(labelList)
# ['no', 'no', 'yes', 'yes', 'yes', 'no', 'yes', 'no', 'yes', 'yes', 'yes', 'yes', 'yes', 'no']


# =========<格式化數據,轉換成decision tree需要的格式模型>============

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))

# # 存儲決策樹信息

# # Graphviz 將dot轉換成pdf的命令: dot -T pdf iris.dot -o output.pdf
# # 可以查看decision tree 的形狀了(看pdf的值)
# with open(r"C:\Users\Administrator\Desktop\code\mechine_learning\allElectronicInformationGainOri.dot", "w") as f:
#     f = tree.export_graphviz(clf, feature_names = vec.get_feature_names(), out_file = f)


# # 下面的代碼屬於預測的代碼
# # 屬於轉化后的矩陣數值,其實就是進行復制修改
oneRowX = dummyX[2, :]
print("oneRowX: " + str(oneRowX))

newRowX = oneRowX

# newRowX[0] = 1
# newRowX[2] = 1
print("newRowX: ", str(newRowX))

predictedY = clf.predict([newRowX])
# 預測 class_buys_labels的值
print("predictedY: " + str(predictedY))
View Code

 

但這段代碼不是特別通用,而且有bug, 需要修改,但基本邏輯是正確的

# -*- coding:utf-8 -*-
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import preprocessing
from sklearn import tree  # 要求是數值型的值
from sklearn.externals.six import StringIO


"""
注意: 決策樹要求要數值型的值,不能是字符串類型的值
例如: no, yes這樣的值是不允許的
需要轉換成矩陣
====================================
age            income    student
youth        high    no
youth        high    no
middle_aged    high    no
senior        medium    no
senior        low    yes
====================================

比如上面這種數據:
youth    middle_aged        senior         high    medium    low    ......
1        0                0            1        0        0
1        0                0            1        0        0
.....

"""


allElectronicsData = open(r"C:\Users\Administrator\Desktop\data.xlsx", 'r')
reader = csv.reader(allElectronicsData)
print(reader)
headers = next(reader)

print(headers)
# ["RID", 'age'.....]

featureList = []
labelList = []
for row in reader:
    labelList.append(row[len(row) - 1])
    rowDict = {}
    for i in range(1, len(row) - 1):
        rowDict[headers[i]] = row[i]

    featureList.append(rowDict)

print(featureList)
# [
#    {"credit_rating": "fair", "age": "youth"},
#    .... #作用,方便轉換成矩陣。將數據轉換成對象
# ]

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))

# 存儲決策樹信息

# Graphviz 將dot轉換成pdf的命令: dot -T pdf iris.dot -o output.pdf
# 可以查看decision tree 的形狀了(看pdf的值)
with open(r"C:\Users\Administrator\Desktop\code\mechine_learning\allElectronicInformationGainOri.dot", "w") as f:
    f = tree.export_graphviz(clf, feature_names = vec.get_feature_names(), out_file = f)


# 下面的代碼屬於預測的代碼
# 屬於轉化后的矩陣數值,其實就是進行復制修改
oneRowX = dummyX[0, :]
print("oneRowX: " + str(oneRowX))

newRowX = oneRowX

newRowX[0] = 1
newRowX[2] = 0
print("newRowX: ", str(newRowX))

predictedY = clf.predicted(newRowX)
# 預測 class_buys_labels的值
predicted("predictedY: " + str(predictedY))




if __name__ == '__main__':
    main()

 


免責聲明!

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



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