機器學習_ML_樹的特徵重要性如何來的?
tags: python
scikit-learn
feature_importances
DecisionTreeClassifier
官方程式碼在執行決策樹或隨機森林、極限樹…等演算法之後,總是會透過feature_importances來取得特徵重要性,但是這個特徵重要性是如何來的?
程式碼是cython,從這邊可以看到,計算方式是取根的樣本權重乘上熵(或gini)減掉左右枝葉一樣計算的值,以此確認資料的不確定性消除了多少。
資訊熵是資料不確定性的度量標準,愈大代表混亂程度愈大
利用花的資料集來做驗證,如果不出樹狀圖再註解掉出圖的語法就好。
# Import lib
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
from sklearn.datasets import load_iris
import pydotplus
import pandas as pd
import numpy as np
import random
# 載入資料
iris = load_iris()
X = iris.data
y = iris.target
# 資料轉入pandas
df = pd.DataFrame(data=X, columns=iris.feature_names)
# 確認資料狀況
df.head()
# 檢查dataframe資訊
df.info()
# 訓練模型
tree = DecisionTreeClassifier(criterion='entropy',
splitter='best',
random_state=150)
tree.fit(X, y)
# 產生樹狀圖
dot_data = export_graphviz(tree, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
# 產生png檔
graph.write_png('sample_tree.png')
# 將特徵權重排序之後寫入dict
feature_importances_ = {}
_feat_labels = iris.feature_names
_importances = tree.feature_importances_
# 取得特徵權重排序的索引值
indices = np.argsort(_importances)[::-1]
for f in range(X.shape[1]):
feature_importances_.update({_feat_labels[indices[f]]: _importances[indices[f]]})
# 確認特徵權重
feature_importances_
# 寫入excel,手動試算一次
writer = pd.ExcelWriter('output.xlsx')
df.to_excel(writer,'Sheet1')
writer.save()
先看一下特徵權重的數值利用excel我們手動試算
依序計算之後,再總計特徵權重值
當然這種方式不是唯一,文獻上還是有很多不同方法來計算特徵的重要性(平均精度降低),只是在scikit-learn上即是以此方式來處理。
以上,這樣子對樹最後產生的資訊就會有更進一步的了解了。