1. 程式人生 > >機器學習小實戰(二) 建立決策樹

機器學習小實戰(二) 建立決策樹

目錄

一、決策樹簡介

決策樹既可以分類,也可以迴歸。構造決策樹兩種方式:預剪枝/後剪枝

難點:如何構造決策樹,選什麼特徵作為結點。

特點:根節點是分類效果最好的,其餘次之、再次之。

決策樹停止劃分結點的原因可能是:達到最大葉子節點數了、葉子結點樣本數夠少了、未達到劃分結點的衡量標準(e.g 資訊熵變化不明顯)等等

二、構造決策樹的小栗子

就用sklearn中自帶的一個數據集進行演示

1. 讀取資料、瞭解分佈情況

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets.california_housing import fetch_california_housing #採用內建資料集

housing=fetch_california_housing()
print(housing.DESCR) #關於這個資料集的簡介
print(housing.data.shape) #(20640, 8)
print(type(housing))  #<class 'sklearn.utils.Bunch'>
print(housing.data[0]) #輸出一行資料瞅瞅啥樣

輸出:關於這個資料集的介紹,從簡介中可以看出,這個資料集包含8個屬性:average income,housing average age, average rooms, average bedrooms, population,average occupation, latitude, and longitude 

2. 資料預處理

因為是自帶的資料庫,資料沒啥大問題,這步忽略,進入下一步

3. 建立決策樹模型

為了簡化模型,我們只考慮最後兩項特徵(經緯度)對房屋價格的影響

# 構造決策樹
from sklearn import tree
dtr=tree.DecisionTreeRegressor(max_depth=2) #第一步:例項化樹模型——傳遞引數
dtr.fit(housing.data[:,[6,7]],housing.target) #第二步:構造樹模型——傳入X值與y值

輸出:這個樹的資訊,構造過程用的引數情況,可以看到有非常多的引數,但要去設定的也不多,最重要的是max_depth和max_leaf_nodes。

DecisionTreeRegressor(criterion='mse', max_depth=2, max_features=None,
           max_leaf_nodes=None, min_impurity_decrease=0.0,
           min_impurity_split=None, min_samples_leaf=1,
           min_samples_split=2, min_weight_fraction_leaf=0.0,
           presort=False, random_state=None, splitter='best')

各引數的含義:

4. 決策樹的視覺化顯示

# 先生成.dot檔案
dot_data= \
    tree.export_graphviz(
        dtr, # 決策樹的名字
        out_file=None,
        feature_names=housing.feature_names[6:8],#特徵名字
        filled=True,
        impurity=False,
        rounded=True
    )

# 對.dot檔案進行顯示
import pydotplus  #pip install  pydotplus
graph=pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor('#FFF2DD')
from IPython.display import Image #notebook中不需要安裝,但是pycharm中需要安裝
Image(graph.create_png())

# 儲存到本地
graph.write_png('dtr_white_background.png')

結果:

5. 決策樹的評估 .score

重新建立了一個決策樹,把所有的性質都用上了

from sklearn.model_selection import train_test_split
data_train,data_test,target_train, target_test=\
    train_test_split(housing.data, housing.target, test_size=0.1,random_state=42)
dtr=tree.DecisionTreeRegressor(random_state=42) 
dtr.fit(data_train, target_train)
dtr.score(data_test, target_test)

輸出:0.637318351331017

三、隨機森林進行決策

1. 通過隨機森林進行決策

from sklearn.ensemble import RandomForestRegressor
rfr=RandomForestRegressor(random_state=42)
rfr.fit(data_train,target_train)
rfr.score(data_test,target_test)

輸出:0.7908649228096493

四、通過交叉驗證將各特徵進行排序

1. 交叉驗證

## 交叉驗證選出最好的引數
from sklearn.grid_search import GridSearchCV
tree_param_grid = { 'min_samples_split': list((3,6,9)),'n_estimators':list((10,50,100))}
grid = GridSearchCV(RandomForestRegressor(),param_grid=tree_param_grid, cv=5)
grid.fit(data_train, target_train)
grid.grid_scores_, grid.best_params_, grid.best_score_

結果:

([mean: 0.78590, std: 0.00274, params: {'min_samples_split': 3, 'n_estimators': 10},
  mean: 0.80537, std: 0.00404, params: {'min_samples_split': 3, 'n_estimators': 50},
  mean: 0.80774, std: 0.00387, params: {'min_samples_split': 3, 'n_estimators': 100},
  mean: 0.78896, std: 0.00314, params: {'min_samples_split': 6, 'n_estimators': 10},
  mean: 0.80562, std: 0.00407, params: {'min_samples_split': 6, 'n_estimators': 50},
  mean: 0.80690, std: 0.00366, params: {'min_samples_split': 6, 'n_estimators': 100},
  mean: 0.78679, std: 0.00504, params: {'min_samples_split': 9, 'n_estimators': 10},
  mean: 0.80455, std: 0.00470, params: {'min_samples_split': 9, 'n_estimators': 50},
  mean: 0.80557, std: 0.00411, params: {'min_samples_split': 9, 'n_estimators': 100}],
 {'min_samples_split': 3, 'n_estimators': 100},
 0.8077425553717694)

2. 用最好的一組引數構建決策樹

# 用篩選出來最好的引數來構造決策樹
rfr=RandomForestRegressor(min_samples_split=3,n_estimators=100,random_state=42)
rfr.fit(data_train,target_train)
rfr.score(data_test,target_test) #0.8090829049653158

3. 將特徵進行排序

pd.Series(rfr.feature_importances_,index=housing.feature_names).sort_values(ascending=False) #將屬性的重要性進行排序
MedInc        0.524257
AveOccup      0.137947
Latitude      0.090622
Longitude     0.089414
HouseAge      0.053970
AveRooms      0.044443
Population    0.030263
AveBedrms     0.029084