決策樹decision tree原理介紹_python sklearn建模_乳腺癌細胞分類器(推薦AAA)


機器學習,統計項目可聯系
 QQ:231469242
 
 

決策樹優點和缺點

決策樹優點

1.簡單易懂,很好解讀,可視化

2.可以變量篩選

 

缺點

1.決策樹不穩定,容易過渡擬合

2.決策樹用的貪婪算法,返回局部最優,而非全局最優,最后得到有偏見的樹

(用隨機森林改善)

分類樹VS回歸樹

回歸樹應用場景:變量是連續性的,使用平均數參數

分類樹應用場景:變量是分類型的,使用眾數參數

樹的延伸太多,會造成過渡擬合,返回局部最優,即對測試數據表現良好,但對未知數據表現很差,可以限制樹深度和葉子節點來改善准確性

pruning是可以限制樹深度和葉子節點來改善准確性

 

決策樹應用

1.信用評分

2.泰坦尼克號生存分析

3.根據身高和體重判斷人的性別

................

 

決策樹組成

決策樹由root node根節點,decision node決策點,terminall node終端點組成

 

 

 

泰坦尼克號決策樹的應用分析

第一個最顯著因子是性別,如果是女性存活

如果是男性,有的死了,有的活了

如果是年齡大於9.5歲男性,死了

如果年齡小於9.5歲男性,且有兄弟姐妹年齡大於2.5歲的,死了

如果年齡小於9.5歲男性,且有兄弟姐妹年齡小於2.5歲的,存活

決策樹舉例

把一組數據划分為五個對象,通過x1的兩個節點20和25

x2的兩個節點30和50,來划分這五個對象

 決策樹舉例:降雨是由氣溫,風速,氣壓共同決定

 

決策樹對水果分類應用

 

 

 

 

先選大當家,再選二當家,根據熵值

 

熵值越大,混亂程度和不確定性越大

 

x概率越大,熵值y越小

x概率越小,熵值y越大

因為x取值范圍是從0-1,得到log值是負數,所以公式前面有個負號,讓值最終為正數

求和符號是對一個數據集的每個數字求熵值,然后累加

log底數是2

信息增益

 

 

舉例

 

 

 

 

 

 

ID3算法對於小樣本數據效果差,算出來信息增益很大

C4.5算法考慮自身熵,做了改進

cart和Gini系數算法現在用的多

另外還有卡方算法和減少方差算法

 

 

 

 

基尼系數GINI index

用於區分兩個類別的分離程度如何,基尼系數=0.5,說明兩個類別數量一致,無區分程度,如果基尼系數=0,說明兩個類別區分度最明顯

 

 

 

 

 

 

 

 

預剪枝用的比較多,避免過渡擬合

 

sklearn有很好可視化效果

信息增益小於某個值時,也可以限制

限制葉子節點個數

 

限制葉子節點深度

 

 

 

python代碼構建乳腺癌細胞分類器

決策樹可視化因子結果,worst radius影響因素最大

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 27 22:59:44 2018

@author: Toby,項目合作QQ:231469242
radius半徑
texture結構,灰度值標准差
symmetry對稱

決策樹找出強因子
worst radius
worst symmetry
worst texture
texture error

"""
import csv,pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import pydotplus
from IPython.display import Image
import graphviz
from sklearn.tree import export_graphviz
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

cancer=load_breast_cancer()

featureNames=cancer.feature_names
#random_state 相當於隨機數種子
X_train,x_test,y_train,y_test=train_test_split(cancer.data,cancer.target,stratify=cancer.target,random_state=42)

list_average_accuracy=[]
depth=range(1,30)
for i in depth:
#max_depth=4限制決策樹深度可以降低算法復雜度,獲取更精確值
tree= DecisionTreeClassifier(max_depth=i,random_state=0)
tree.fit(X_train,y_train)
accuracy_training=tree.score(X_train,y_train)
accuracy_test=tree.score(x_test,y_test)
average_accuracy=(accuracy_training+accuracy_test)/2.0
#print("average_accuracy:",average_accuracy)
list_average_accuracy.append(average_accuracy)

max_value=max(list_average_accuracy)
#索引是0開頭,結果要加1
best_depth=list_average_accuracy.index(max_value)+1
print("best_depth:",best_depth)

best_tree= DecisionTreeClassifier(max_depth=best_depth,random_state=0)
best_tree.fit(X_train,y_train)
accuracy_training=best_tree.score(X_train,y_train)
accuracy_test=best_tree.score(x_test,y_test)

print("decision tree:")
print("accuracy on the training subset:{:.3f}".format(best_tree.score(X_train,y_train)))
print("accuracy on the test subset:{:.3f}".format(best_tree.score(x_test,y_test)))
#print('Feature importances:{}'.format(best_tree.feature_importances_))
#繪圖,顯示因子重要性
n_features=cancer.data.shape[1]
plt.barh(range(n_features),best_tree.feature_importances_,align='center')
plt.yticks(np.arange(n_features),cancer.feature_names)
plt.title("Decision Tree:")
plt.xlabel('Feature Importance')
plt.ylabel('Feature')
plt.show()

#生成一個dot文件,以后用cmd形式生成圖片
export_graphviz(tree,out_file="cancertree.dot",class_names=['malignant','benign'],feature_names=cancer.feature_names,impurity=False,filled=True)

  

 決策樹可視化

安裝graphviz官網介紹

https://blog.csdn.net/lanchunhui/article/details/49472949

安裝包graphviz

pip install graphviz

#生成一個dot文件,文件存放於腳本所在位置

以后用cmd形式生成圖片,
export_graphviz(tree,out_file="cancertree.dot",class_names=['malignant','benign'],feature_names=cancer.feature_names,impurity=False,filled=True)

 

cmd切換路徑到腳本所在位置,然后輸入dot -Tpng cancertree.dot -o cancertree.png 

生成一個決策樹的圖片

 

生成圖片打開預覽

 

決策樹交叉驗證代碼

交叉驗證結果0.92左右

 

import csv,pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import pydotplus 
from IPython.display import Image
import graphviz
from sklearn.tree import export_graphviz
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree 
from sklearn.model_selection import train_test_split
#交叉驗證樣本平均測試,評分更加
from sklearn.cross_validation import cross_val_score


#交叉驗證得分,返回數組
#score_decisionTree=cross_val_score(decisionTree,x,y,cv=5,scoring='accuracy')
#print("cross value decisionTree= score:",score_decisionTree.mean())

cancer=load_breast_cancer()
#數據
data=cancer.data
#分類
target=cancer.target
x=data
y=target

featureNames=cancer.feature_names
#5.決策樹
#建立決策樹分類器
decisionTree= tree.DecisionTreeClassifier(max_depth=5) 
#交叉驗證得分,返回數組
score_decisionTree=cross_val_score(decisionTree,x,y,cv=10,scoring='accuracy')
print("cross value decisionTree= score:",score_decisionTree.mean())

  

 微信掃二維碼,免費學習更多python資源

 


免責聲明!

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



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