はじめに
ランダムフォレストでモデルを作成した後に、各特徴量がどれぐらいの重要度で扱われているかを可視化する方法がわかったので、備忘録としてまとめておきます。
誰かの参考になれば幸いです。
まずランダムフォレストモデルの構築
タイタニックでランダムフォレストを構築します。
わかっている方は、ここは飛ばしていただいて、各特徴量の重要度を確認 まで飛んでいただいて問題ありません。
データの読み込み
まずkaggleからタイタニックのtrainデータとtestデータをgoogle colaboratoryにuploadします。
その後、下記のコードを記載して、データの読み込みを行います。
import numpy as np
import pandas as pd
train_data = pd.read_csv("train.csv")
test_data = pd.read_csv("test.csv")
特定の列のみを特徴量とする
生存に明らかに関係ない特徴量を省いていきます。
labels = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"]
train_data = train_data[labels + ["Survived"]]
test_data = test_data[labels]
AgeとFare、Embarkedの欠損値を埋める
ランダムフォレストはGBDTと違い、基本的に欠損値を埋めた状態で対応しないといけないので、欠損値の穴埋めをtrainデータの代表値で行う。
age_mean = train_data["Age"].mean()
train_data["Age"] = train_data["Age"].fillna(age_mean)
test_data["Age"] = test_data["Age"].fillna(age_mean)
fare_mean = train_data["Fare"].mean()
train_data["Fare"] = train_data["Fare"].fillna(fare_mean)
test_data["Fare"] = test_data["Fare"].fillna(fare_mean)
embarked_mode = train_data["Embarked"].mode()
train_data["Embarked"] = train_data["Embarked"].fillna(embarked_mode)
test_data["Embarked"] = test_data["Embarked"].fillna(embarked_mode)
カテゴリ変数をget_dummies
機械学習に処理を行わせるためには、基本的に文字などは数字に変換する必要がある。
なので、タイタニックの性別などのカテゴリはget_dummies関数でダミー変数(0と1で構成される数値のデータ)に変換する必要があります。
cat_labels = ["Sex", "Pclass", "Embarked"]
train_data = pd.get_dummies(data = train_data, columns = cat_labels)
test_data = pd.get_dummies(data = test_data, columns = cat_labels)
入力と正解の用意
モデルの学習を行わせるために、目的変数と説明変数で分けます。
t_train = train_data["Survived"]
x_train = train_data.drop(labels = ["Survived"], axis = 1)
x_test = test_data
ランダムフォレストのモデル構築
下記のコードでランダムフォレストとして、学習させます。
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators = 100, max_depth = 5)
model.fit(X = x_train, y = t_train)
各特徴量の重要度を確認
feature_importances_という変数が、modelには付与されています。
feature_importances_は、各特徴量をそれぞれどのくらいの重要度で利用したかがわかるものです。
今回はこれをグラフ化します。
import matplotlib.pyplot as plt
labels = x_train.columns
importances = model.feature_importances_
plt.figure(figsize = (10,6))
plt.barh(y = range(len(importances)), width = importances)
plt.yticks(ticks = range(len(labels)), labels = labels)
plt.show()
出力結果
今回で言えば、他の特徴量より圧倒的に性別の影響が大きそうです。
逆にEmbarkedはあまりランダムフォレストの分類に大きな影響を与えていなそうです。
このようにして、ランダムフォレストで使われている特徴量の重要度をfeature_importances_を利用して可視化することで、何が目的変数に寄与しているかが判断できるようになります。
他のデータでも実践できるので、興味がある方はぜひ実践してみてください。
参照
Udemy_みんなのkaggle講座
→こちらで学んだことを今回の記事でアウトプットさせていただきました。
Kaggle初心者にも大変わかりやすい講座でしたので、ぜひおすすめです!