LoginSignup
11
4

More than 1 year has passed since last update.

ランダムフォレストの各特徴量の重要度をfeature_importanceから可視化してみた

Last updated at Posted at 2022-07-16

はじめに

ランダムフォレストでモデルを作成した後に、各特徴量がどれぐらいの重要度で扱われているかを可視化する方法がわかったので、備忘録としてまとめておきます。
誰かの参考になれば幸いです。

まずランダムフォレストモデルの構築

タイタニックでランダムフォレストを構築します。
わかっている方は、ここは飛ばしていただいて、各特徴量の重要度を確認 まで飛んでいただいて問題ありません。

データの読み込み

まず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()

出力結果

image.png

今回で言えば、他の特徴量より圧倒的に性別の影響が大きそうです。
逆にEmbarkedはあまりランダムフォレストの分類に大きな影響を与えていなそうです。

このようにして、ランダムフォレストで使われている特徴量の重要度をfeature_importances_を利用して可視化することで、何が目的変数に寄与しているかが判断できるようになります。

他のデータでも実践できるので、興味がある方はぜひ実践してみてください。

参照

Udemy_みんなのkaggle講座
→こちらで学んだことを今回の記事でアウトプットさせていただきました。
Kaggle初心者にも大変わかりやすい講座でしたので、ぜひおすすめです!

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4