2018年1月15日 星期一

機器學習_ML_樹的特徵重要性如何來的?

機器學習_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上即是以此方式來處理。
以上,這樣子對樹最後產生的資訊就會有更進一步的了解了。

3 則留言:

  1. 請問此Excel怎麼跑出來的? 我依照此程式碼只有跑出iris.data的資料而已

    回覆刪除
    回覆
    1. 這部份是我自己以數學式驗算的,並非從模型產出資料。

      刪除
    2. 了解 那在請教一下 這個算法 在sklearn的RandomForestClassifier 隨機森林的類別也適用嗎?

      刪除