Python 回帰分析メソッドのパフォーマンス比較
こんにちは、株式会社ナレッジラボでAI・機械学習のエンジニアリングを担当しているダンです。私たちは、社内に散在する経営データの集計・分析・管理を支援する「Manageboard」というサービスを提供しています。Manageboardは、今後ますますAI機能を強化していく予定です。私の記事では、研究開発中に直面した課題について共有いたします。
比較する回帰分析メソッド
Pythonには回帰分析を行うための多くのライブラリがありますが、特にsklearnやSciPy、NumPyが提供する回帰分析メソッドが広く使用されています。本記事では、これらのメソッドを用いて1次元線形回帰分析を行い、データ量に応じたパフォーマンスを比較してみます。
-
scipy.stats.linregress
1次元の線形回帰分析を行うSciPyの関数です。入力された2つの配列に基づいて、最小二乗法を用いて回帰直線を求めます。 -
numpy.polyfit
多項式フィッティングを行うNumPyの関数です。1次元の線形回帰としても利用できます。 -
sklearn.linear_model.LinearRegression
より一般的な線形回帰モデルを提供するscikit-learnのクラスです。1次元のデータでも使用可能で、内部的には最小二乗法を使用してパラメータを求めます。
これら3つのメソッドを使って、異なるデータ量に対するパフォーマンス(処理時間)を比較していきます。
実験方法
実験では、Amazon SageMakerのml.t3.medium
インスタンスを使用し、各メソッドを10回実行した結果の平均処理時間を比較します。実行するコードは以下の通りです:
import numpy
from scipy import stats
from sklearn import linear_model
from random import randint
from datetime import datetime
num = 10 # データ数
result_list = [[], [], []]
regr = linear_model.LinearRegression()
# 10回の実行
for run in range(10):
# データ生成
X = numpy.array(range(num))
Y = []
for idx in range(num):
Y.append(idx + randint(-num/10, num/10))
Y = numpy.array(Y)
# linregress
time = datetime.now()
stats.linregress(X, Y)
result_list[0].append(datetime.now() - time)
# polyfit
time = datetime.now()
numpy.polyfit(X, Y, 1)
result_list[1].append(datetime.now() - time)
# LinearRegression
X = X.reshape((-1,1)) # 1次元データを2Dに変換
time = datetime.now()
regr.fit(X, Y)
result_list[2].append(datetime.now() - time)
# 結果の平均を計算
numpy.mean(result_list, axis=1)
上記コードでは、データ数num
を10から始め、linregress
、polyfit
、LinearRegression
の各メソッドに対して回帰分析を実行し、処理時間を記録します。各メソッドの実行時間を10回繰り返し、その平均値を算出しています。
結果
以下は、データ数に対する各メソッドの平均実行時間(秒数)の結果です:
データ数 |
linregress (秒) |
polyfit (秒) |
LinearRegression (秒) |
---|---|---|---|
10 | 0.001425 | 0.000173 | 0.000877 |
100 | 0.001439 | 0.000325 | 0.001099 |
1000 | 0.002475 | 0.000485 | 0.001729 |
10,000 | 0.002747 | 0.001062 | 0.001500 |
100,000 | 0.004208 | 0.007952 | 0.003567 |
1,000,000 | 0.032403 | 0.085891 | 0.039857 |
10,000,000 | 0.252130 | 0.908959 | 0.334037 |
- 少量データ(10~10,000件)
10,000件以下では、polyfit
が最も効率的です。linregress
とLinearRegression
も良好な速度を持っていますが、polyfit
ほどは高速ではありません。 - 大量データ(100,000件以上)
データ数が100,000を超えると、linregress
が最も高速で、他の2つのメソッドに比べて処理時間が短くなります。一方、polyfit
はデータ量が増えると急激に処理時間が増加し、100,000件を超えたあたりからパフォーマンスが大きく低下します。
結論
回帰分析を行う際には、データの規模に応じて適切なメソッドを選択することが重要です。LinearRegression
は、1次元データだけでなく多次元データにも適した汎用的な方法ですが、1次元データに対してはlinregress
またはpolyfit
の方が高速です。少量のデータ(今回の検証では10,000点まで)では、polyfit
が最も効率的で高速な1次元線形回帰の方法という結果になりました。大量のデータ(今回の検証では100,000点以上)では、linregress
が最も優れたパフォーマンスを発揮したという結果が得られており、大規模なデータに対して最適な選択肢となる可能性があります。
Discussion