python機器學習-乳腺癌細胞挖掘(博主親自錄制視頻)
https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share
決策樹優點和缺點
決策樹優點
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資源



