機器學習小實戰(二) 建立決策樹
阿新 • • 發佈:2019-02-09
目錄
一、決策樹簡介
決策樹既可以分類,也可以迴歸。構造決策樹兩種方式:預剪枝/後剪枝
難點:如何構造決策樹,選什麼特徵作為結點。
特點:根節點是分類效果最好的,其餘次之、再次之。
決策樹停止劃分結點的原因可能是:達到最大葉子節點數了、葉子結點樣本數夠少了、未達到劃分結點的衡量標準(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