0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで学ぶ機械学習 入門編 #3: 多項式回帰

Posted at

1. はじめに

これまで単回帰分析や重回帰分析を通して、線形モデルを用いた予測方法を学んできました。 今回はそれを一歩進めて、多項式回帰について理解を深めていきます。

2. 多項式回帰とは

多項式回帰は、単回帰や重回帰と同じ線形回帰の枠組みを使いますが、独立変数を次数ごとに展開することで
従属変数 $y$ と独立変数 $x$の関係を非線形に表現できます。このため、単回帰や重回帰より柔軟なモデルと考えられます。

回帰式は次の通りです。

$$
y = w_0 + w_1x + w_2x^2 + \dots + w_n x^n
$$

ここで、1つの独立変数 $x$ を次数ごとに新しい特徴量$(x, x^2, \dots, x^n)$として扱うことで、線形回帰の仕組みを使いながら非線形の関係を学習できます。

また、これらの特徴量を$ (x_1, x_2, \dots, x_n) $と置くと、重回帰を行っているのと同じ形に見ることもできます。

多項式回帰のデメリットとして、生成される特徴量の数が急激に増えることがあります。
例えば次数が2の場合、

  • 独立変数が1つの場合:$(x) = [1, x, x^2]$
  • 独立変数が2つの場合:$(x_1,x_2) = [1, x_1, x_2, x_1^2, x_1 x_2, x_2^2]$

このように、次数や元の独立変数の数が増えると計算量が増え、過学習が起こりやすくなる点に注意が必要です。

3. 実装

3.1. データセットの準備

これまでの記事では既存のデータセットを使っていましたが複雑な実データではモデルの挙動が見えづらいため、今回は、まず自作のシンプルなデータセットを使って、アルゴリズムの基本的な動作を確認します。
自作したデータセットの確認をしていきます。

import numpy as np

np.random.seed(0)
X = np.linspace(-3, 3, 100).reshape(-1, 1)
y = 0.5 * X[:, 0]**3 - X[:, 0]**2 + 2 * X[:, 0] + np.random.randn(100) * 3

まず独立変数である$x$から説明します。このコードはnumpyのメソッドであるlinspaceを使って-3から3までの100等分するということを表しています。このままではただのベクトルになってしまうので行列に変換するためにreshapeを使って2次元にしています。

次に目標値である$y$は3次関数を表しています。また実データに近づけるため、np.random.randn(100) * 3で意図的にノイズを発生させています。

また$y$からノイズを取り除いた式$0.5x^3 - x^2 + 2x$が、今回 x のデータを使ってモデルに学習させたい真の関数(理想的な関数)です。

実際の観測値 y にはノイズを加えているため、モデルはこの真の関数に近い関数を予測することを目指します。

また今回直感的にわかりやすくするために独立変数は一つで実装を行います。

3.2. 多項式回帰の実装

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=3)
X_poly = poly.fit_transform(X)

多項式回帰の実装は特徴量を作成するためにPolynomialFeaturesを使います。
これは独立変数を基に次数を増やした特徴量を生成してくれます。今回は次数が3なのでdegree=3を指定しています。

次にモデルの作成です。これは今までと変わりません。

from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_poly, y)

これでモデルの作成が完了しました。
結果を見ていきましょう。

4.結果の可視化

まず今回生成したデータの分布をみていきましょう。

非線形の形になっていて単回帰や重回帰では表現できない形になっているのが分かります。

次に今回作成したモデルがどれほどデータに対して当てはまりが良いのかを確認します。

見たところ非常に当てはまりが良いように思えます。
次に具体的な数値からこのモデルの当てはまりの良さを見ていきましょう。

print("決定係数 R^2:", model.score(X_poly, y))

実行結果
決定係数 R^2: 0.9035358312158104

決定係数からも非常に当てはまりが良いことが分かりますね。

5.感想とまとめ

今回は多項式回帰を使い、非線形な関係をモデル化する方法を学びました。自作データを用いたことで、曲線がデータにフィットする様子を直感的に確認でき、線形回帰では表現できないパターンを理解することができました。

また、線形モデルの枠組みで非線形な関係を表現することで、線形回帰の仕組みや限界をより深く理解できました。今回の学習を通して、回帰分析の幅広い表現力や統計的な解釈への理解がさらに深まりました。

最後までご覧いただきありがとうございました。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?