機器學習之分類決策樹DecisionTreeClassifier
阿新 • • 發佈:2018-11-29
- 機器學習之分類決策樹DecisionTreeClassifier
# -*- coding: utf-8 -*- """ Created on Fri Nov 23 21:06:54 2018 @author: muli """ import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn import datasets from sklearn import cross_validation import matplotlib.pyplot as plt def load_data(): ''' 載入用於分類問題的資料集。資料集採用 scikit-learn 自帶的 iris 資料集 :return: 一個元組,用於分類問題。 元組元素依次為:訓練樣本集、測試樣本集、訓練樣本集對應的標記、測試樣本集對應的標記 ''' # scikit-learn 自帶的 iris 資料集 iris=datasets.load_iris() X_train=iris.data y_train=iris.target # 分層取樣拆分成訓練集和測試集,測試集大小為原始資料集大小的 1/4 return cross_validation.train_test_split(X_train, y_train,test_size=0.25, random_state=0,stratify=y_train) def test_DecisionTreeClassifier(*data): ''' 測試 DecisionTreeClassifier 的用法 :param data: 可變引數。 它是一個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記 :return: None ''' X_train,X_test,y_train,y_test=data clf = DecisionTreeClassifier() clf.fit(X_train, y_train) print("Training score:%f"%(clf.score(X_train,y_train))) print("Testing score:%f"%(clf.score(X_test,y_test))) def test_DecisionTreeClassifier_criterion(*data): ''' 測試 DecisionTreeClassifier 的預測效能隨 criterion 引數的影響 :param data: 可變引數。 它是一個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記 :return: None ''' X_train,X_test,y_train,y_test=data criterions=['gini','entropy'] for criterion in criterions: clf = DecisionTreeClassifier(criterion=criterion) clf.fit(X_train, y_train) print("criterion:%s"%criterion) print("Training score:%f"%(clf.score(X_train,y_train))) print("Testing score:%f"%(clf.score(X_test,y_test))) print("-------") def test_DecisionTreeClassifier_splitter(*data): ''' 隨劃分型別--最優劃分和隨機劃分 :param data: 可變引數。 它是一個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記 :return: None ''' X_train,X_test,y_train,y_test=data splitters=['best','random'] for splitter in splitters: clf = DecisionTreeClassifier(splitter=splitter) clf.fit(X_train, y_train) print("splitter:%s"%splitter) print("Training score:%f"%(clf.score(X_train,y_train))) print("Testing score:%f"%(clf.score(X_test,y_test))) print("------------------") def test_DecisionTreeClassifier_depth(*data,maxdepth): ''' 測試預測效能隨 max_depth 引數的影響 :param data: 可變引數。它是一個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記 :param maxdepth: 一個整數,用於 DecisionTreeClassifier 的 max_depth 引數 :return: None ''' X_train,X_test,y_train,y_test=data depths=np.arange(1,maxdepth) training_scores=[] testing_scores=[] for depth in depths: clf = DecisionTreeClassifier(max_depth=depth) clf.fit(X_train, y_train) training_scores.append(clf.score(X_train,y_train)) testing_scores.append(clf.score(X_test,y_test)) ## 繪圖 fig=plt.figure() ax=fig.add_subplot(1,1,1) ax.plot(depths,training_scores,label="traing score",marker='o') ax.plot(depths,testing_scores,label="testing score",marker='*') ax.set_xlabel("maxdepth") ax.set_ylabel("score") ax.set_title("Decision Tree Classification") ax.legend(framealpha=0.5,loc='best') plt.show() if __name__=='__main__': # 產生用於分類問題的資料集 X_train,X_test,y_train,y_test=load_data() # 呼叫 test_DecisionTreeClassifier # test_DecisionTreeClassifier(X_train,X_test,y_train,y_test) # 呼叫 test_DecisionTreeClassifier_criterion # test_DecisionTreeClassifier_criterion(X_train,X_test,y_train,y_test) # 呼叫 test_DecisionTreeClassifier_splitter # test_DecisionTreeClassifier_splitter(X_train,X_test,y_train,y_test) # 呼叫 test_DecisionTreeClassifier_depth test_DecisionTreeClassifier_depth(X_train,X_test,y_train,y_test,maxdepth=15)