ナード戦隊データマン

データサイエンスを用いて悪と戦うぞ

RandomForestの訓練時間・特徴量の数・データの行数の関係を調べる

大きなデータを訓練すると、とても時間がかかります。しかし、データ量と訓練時間がどのような関係になっているのかについては確かめたことがありませんでした。線形なのか、指数関数的なのか、といったことを調べるために、ここでは実験を行っていきます。

0. データの準備

from sklearn.datasets import load_breast_cancer
import pandas as pd
cancer = load_breast_cancer()
df = pd.DataFrame(cancer.data, columns=cancer.feature_names)

1. 特徴量の数と訓練時間の関係

%matplotlib inline
from sklearn.ensemble import RandomForestClassifier
import time

out = []
y = cancer.target
first = None
for i, column in enumerate(df.columns):
    if first is None:
        first = column
        X = df[[first]]
    else:
        X = df.loc[:, first:column]
    start = time.time()
    RandomForestClassifier().fit(X, y)
    end = time.time()
    out.append((i+1, end-start))

result = pd.DataFrame(out, columns=["x", "y"])
result.plot("x", "y", kind="line")

f:id:mathgeekjp:20180224162159p:plain

2. データの行数と訓練時間の関係

out2 = []
for k in range(1, df.shape[0], 1):
    X = df.loc[:k, :]
    y = cancer.target[:k+1]
    start = time.time()
    RandomForestClassifier().fit(X, y)
    end = time.time()
    out2.append((k, end - start))

result = pd.DataFrame(out2, columns=["x", "y"])
result.plot("x", "y", kind="line")

f:id:mathgeekjp:20180224162338p:plain

まとめ

特徴量数30、データ行数600の範囲で実行してみると、概ね訓練時間は線形的に増加しているように見えます。データ数をもっと増やせば、この関係が指数関数的増加となっている可能性もあります。

「データが増えるほど訓練時間が増える」といった直感を視覚化したことでよりはっきりとわかりましたが、RandomForestの場合、訓練時間が逓減することはなさそうに見えます。