目次
1. eli5の概要
2. 実験
2.1 回帰モデル
2.2 分類モデル
関連記事:eli5での文書分類モデル
先回の記事はeli5での文書分類モデルについて解説しました。
今回はeli5で回帰モデルと分類モデルの解釈について解説していきます。
1. eli5の概要
Eli5は「Explain Like I’m 5 (私が5歳だと思って説明して)」を略したスラングです。Eli5はscikit-learn、XGBoost、LightGBMなどの機械学習モデルを解釈するPythonライブラリです。
eli5は機械学習モデルを解釈する2つのレベルを提供します。
グローバルレベル:モデルの特徴量の重要さを説明します。
ローカルレベル:個々のサンプル予測を分析して、特定の予測が行われた理由を理解します。
2. 実験
環境:Google Colab
モデル解釈:eli5
ライブラリのインストール
!pip install eli5 |
ライブラリのインポート
import pandas as pd import numpy as np import sklearn import eli5 |
2.1 回帰モデル
ボストン住宅価格データセットを読み込みます。
from sklearn.datasets import load_boston
boston = load_boston() data = pd.DataFrame(np.c_[boston[‘data’], boston[‘target’]], columns= np.append(boston[‘feature_names’], [‘target’]))
print(‘Number of columns’, len(data.columns)) data |
学習とテストのデータを分けます。
from sklearn.model_selection import train_test_split
X = data.drop([‘target’], axis=1) y = data[‘target’]
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.90, test_size=0.1, random_state=123, shuffle=True)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) |
(455, 13) (51, 13) (455,) (51,)
DecisionTreeRegressorのモデルを学習します。
from sklearn.tree import DecisionTreeRegressor
dtree = DecisionTreeRegressor(max_depth=4, max_leaf_nodes=250, max_features=”log2″) dtree.fit(X_train, y_train)
print(“Train r2 : “, lr.score(X_train, y_train)) print(“Test r2 : “, lr.score(X_test, y_test)) |
Train r2 : 0.7511685217987627
Test r2 : 0.6412254020969461
eli5でモデルの特徴量の重要を作成します。PTRATIOは一番重要な特徴量です。
また、決定木のツリー図を表示します。
from eli5 import show_weights
show_weights(dtree, feature_names=boston.feature_names) |
Pandasのデータフレームの結果を作成します。
from eli5.sklearn import explain_weights_sklearn from eli5.formatters import format_as_dataframe, format_as_dataframes
explanation = explain_weights_sklearn(dtree, feature_names=boston.feature_names) format_as_dataframe(explanation) |
テキストの結果を作成することもできます。
from eli5.formatters import format_as_text
print(format_as_text(explanation)) |
Explained as: decision tree
Decision tree feature importances; values are numbers 0 <= x <= 1;
all values sum to 1.
0.6431 PTRATIO
0.1433 LSTAT
0.0729 NOX
0.0542 CRIM
0.0405 AGE
0.0358 B
0.0095 DIS
0.0007 RM
0 TAX
0 RAD
0 CHAS
0 INDUS
0 ZN
PTRATIO <= 19.900 (60.4%)
NOX <= 0.759 (56.9%)
PTRATIO <= 14.750 (6.6%)
CRIM <= 0.634 (3.1%) —> 42.97142857142858
CRIM > 0.634 (3.5%) —> 30.581250000000004
PTRATIO > 14.750 (50.3%)
PTRATIO <= 18.100 (27.5%) —> 26.926399999999987
PTRATIO > 18.100 (22.9%) —> 23.305769230769233
NOX > 0.759 (3.5%)
AGE <= 95.850 (1.3%)
CRIM <= 2.350 (0.4%) —> 16.55
CRIM > 2.350 (0.9%) —> 14.675
AGE > 95.850 (2.2%)
LSTAT <= 16.220 (1.1%) —> 20.160000000000004
LSTAT > 16.220 (1.1%) —> 14.039999999999997
PTRATIO > 19.900 (39.6%)
B <= 350.065 (11.6%)
LSTAT <= 21.420 (6.6%)
DIS <= 1.519 (0.4%) —> 25.3
DIS > 1.519 (6.2%) —> 14.896428571428569
LSTAT > 21.420 (5.1%)
RM <= 4.573 (0.4%) —> 7.9
RM > 4.573 (4.6%) —> 10.719047619047622
B > 350.065 (27.9%)
LSTAT <= 16.320 (15.2%)
AGE <= 99.450 (14.5%) —> 20.974242424242423
AGE > 99.450 (0.7%) —> 38.166666666666664
LSTAT > 16.320 (12.7%)
LSTAT <= 19.645 (5.9%) —> 16.048148148148147
LSTAT > 19.645 (6.8%) —> 10.91935483870968
モデルのローカルの解釈します。y_testの一つのサンプルの予測を説明します。NOXとPTRATIOの特徴量はプラスの影響になっています。
from eli5 import show_prediction
print(“Actual Target Value : “, y_test.iloc[1]) show_prediction(dtree, X_test.iloc[1], feature_names=boston.feature_names, show_feature_values=True) |
データフレームの結果を作成します。
from eli5.sklearn import explain_prediction
explanation = explain_prediction.explain_prediction_tree_regressor(dtree, X_test.iloc[1], feature_names=boston.feature_names) format_as_dataframe(explanation) |
2.2 分類モデル
irisデータセットを読み込みます。
import pandas as pd import numpy as np from sklearn.datasets import load_iris
iris = load_iris() data = pd.DataFrame(np.c_[iris[‘data’], iris[‘target’]], columns= np.append(iris[‘feature_names’], [‘target’]))
print(‘Number of columns’, len(data.columns)) data |
学習とテストのデータを分けます。
from sklearn.model_selection import train_test_split
X = data.drop([‘target’], axis=1) y = data[‘target’]
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.90, test_size=0.1, random_state=123, shuffle=True)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) |
(135, 4) (15, 4) (135,) (15,)
DecisionTreeClassifierのモデルを学習します。
Accuracy, Confusion Matrix, Classification Reportを計算します。
from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import confusion_matrix, classification_report
dtree = DecisionTreeClassifier(max_depth=None, max_features=”log2″)
dtree.fit(X_train, y_train)
print(“Train Accuracy : %.2f”%dtree.score(X_train, y_train)) print(“Test Accuracy : %.2f”%dtree.score(X_test, y_test)) print() print(“Confusion Matrix : “) print(confusion_matrix(y_test, dtree.predict(X_test))) print() print(“Classification Report”) print(classification_report(y_test, dtree.predict(X_test))) |
Train Accuracy : 1.00
Test Accuracy : 0.93
Confusion Matrix :
[[4 0 0]
[0 4 1]
[0 0 6]]
Classification Report
precision recall f1-score support
0.0 1.00 1.00 1.00 4
1.0 1.00 0.80 0.89 5
2.0 0.86 1.00 0.92 6
accuracy 0.93 15
macro avg 0.95 0.93 0.94 15
weighted avg 0.94 0.93 0.93 15
eli5でモデルの特徴量の重要を作成します。決定木のツリー図を表示します。
show_weights(dtree, feature_names=iris.feature_names, show=[“feature_importances”, “decision_tree”, “method”, “description”]) |
一つのサンプルの予測結果を説明します。Virginiceの予測結果はpetal lengthとsepal witdthで判断しました。
print(“Actual Target Value : “, iris.target_names[int(y_test.iloc[1])])
show_prediction(dtree, X_test[:1], feature_names=iris.feature_names, targets=[0,1,2], target_names=iris.target_names, show_feature_values=True, show=[“targets”, “method”, “description”] ) |
データフレームの結果を作成します。
from eli5.sklearn import explain_weights_sklearn
explanation = explain_weights_sklearn(dtree, feature_names=iris.feature_names, target_names=iris.feature_names)
from eli5.formatters import format_as_dataframe, format_as_dataframes
format_as_dataframe(explanation) |
テキストの結果を作成します。
from eli5.formatters import format_as_text
print(format_as_text(explanation)) |
Explained as: decision tree
Decision tree feature importances; values are numbers 0 <= x <= 1;
all values sum to 1.
0.9009 petal length (cm)
0.0666 petal width (cm)
0.0225 sepal width (cm)
0.0100 sepal length (cm)
petal length (cm) <= 2.450 (34.1%) —> [1.000, 0.000, 0.000]
petal length (cm) > 2.450 (65.9%)
petal length (cm) <= 4.850 (32.6%)
petal width (cm) <= 1.650 (30.4%) —> [0.000, 1.000, 0.000]
petal width (cm) > 1.650 (2.2%)
petal width (cm) <= 1.750 (0.7%) —> [0.000, 0.000, 1.000]
petal width (cm) > 1.750 (1.5%)
sepal width (cm) <= 3.000 (0.7%) —> [0.000, 0.000, 1.000]
sepal width (cm) > 3.000 (0.7%) —> [0.000, 1.000, 0.000]
petal length (cm) > 4.850 (33.3%)
petal width (cm) <= 1.750 (5.2%)
sepal width (cm) <= 2.650 (1.5%) —> [0.000, 0.000, 1.000]
sepal width (cm) > 2.650 (3.7%)
sepal length (cm) <= 7.050 (3.0%)
petal length (cm) <= 5.050 (1.5%) —> [0.000, 1.000, 0.000]
petal length (cm) > 5.050 (1.5%)
petal width (cm) <= 1.550 (0.7%) —> [0.000, 0.000, 1.000]
petal width (cm) > 1.550 (0.7%) —> [0.000, 1.000, 0.000]
sepal length (cm) > 7.050 (0.7%) —> [0.000, 0.000, 1.000]
petal width (cm) > 1.750 (28.1%) —> [0.000, 0.000, 1.000]
担当者:KW
バンコクのタイ出身 データサイエンティスト
製造、マーケティング、財務、AI研究などの様々な業界にPSI生産管理、在庫予測・最適化分析、顧客ロイヤルティ分析、センチメント分析、SaaS、PaaS、IaaS、AI at the Edge の環境構築などのスペシャリスト