Python 回帰分析メソッドのパフォーマンス比較

2024/12/25に公開

こんにちは、株式会社ナレッジラボでAI・機械学習のエンジニアリングを担当しているダンです。私たちは、社内に散在する経営データの集計・分析・管理を支援する「Manageboard」というサービスを提供しています。Manageboardは、今後ますますAI機能を強化していく予定です。私の記事では、研究開発中に直面した課題について共有いたします。

比較する回帰分析メソッド

Pythonには回帰分析を行うための多くのライブラリがありますが、特にsklearnやSciPy、NumPyが提供する回帰分析メソッドが広く使用されています。本記事では、これらのメソッドを用いて1次元線形回帰分析を行い、データ量に応じたパフォーマンスを比較してみます。

  1. scipy.stats.linregress
    1次元の線形回帰分析を行うSciPyの関数です。入力された2つの配列に基づいて、最小二乗法を用いて回帰直線を求めます。
  2. numpy.polyfit
    多項式フィッティングを行うNumPyの関数です。1次元の線形回帰としても利用できます。
  3. 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から始め、linregresspolyfitLinearRegressionの各メソッドに対して回帰分析を実行し、処理時間を記録します。各メソッドの実行時間を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
  1. 少量データ(10~10,000件)
    10,000件以下では、polyfitが最も効率的です。linregressLinearRegressionも良好な速度を持っていますが、polyfitほどは高速ではありません。
  2. 大量データ(100,000件以上)
    データ数が100,000を超えると、linregressが最も高速で、他の2つのメソッドに比べて処理時間が短くなります。一方、polyfitはデータ量が増えると急激に処理時間が増加し、100,000件を超えたあたりからパフォーマンスが大きく低下します。

結論

回帰分析を行う際には、データの規模に応じて適切なメソッドを選択することが重要です。LinearRegressionは、1次元データだけでなく多次元データにも適した汎用的な方法ですが、1次元データに対してはlinregressまたはpolyfitの方が高速です。少量のデータ(今回の検証では10,000点まで)では、polyfitが最も効率的で高速な1次元線形回帰の方法という結果になりました。大量のデータ(今回の検証では100,000点以上)では、linregressが最も優れたパフォーマンスを発揮したという結果が得られており、大規模なデータに対して最適な選択肢となる可能性があります。

Discussion