JavaScriptを有効にしてください

Scikit-learnのPolynomialFeaturesでべき乗を求める

 ·   4 min read

はじめに

Pythonの機械学習用ライブラリScikit-learnには、特徴量のべき乗を計算するためのPolynomialFeaturesクラスが実装されている。

本記事では、PolynomialFeaturesクラスの引数とメソッドについて解説する。また、特徴量の数を1~3まで変化させ、オプションによって出力がどのように変化するか確認する。

環境

記事執筆時点で使用したライブラリのバージョンは以下の通り。

ソフトウェア バージョン
Python 3.7.4
Scikit-learn 0.21.3

本記事では、Pythonで以下の通りライブラリをインポートする。

1
2
import numpy as np
from sklearn.preprocessing import PolynomialFeatures

PolynomialFeaturesクラスの基本

PolynomialFeaturesクラスは特徴量(または単に変数)のべき乗を求めるものである。特徴量が複数ある場合には、異なる特徴量間の積も計算する。

1
2
PolynomialFeatures(degree=2, interaction_only=False, 
                   include_bias=True, order='C')

主な引数の意味を以下に示す。

  • degree: 何次の項まで計算するか指定する。デフォルトは2.
  • interaction_only: Trueにすると、ある特徴量を2乗以上した項が出力されなくなる。デフォルトはFalse.
  • include_bias: Trueにすると、定数項(1)を出力する。デフォルトはTrue.

なお、交互作用 (interaction) は異なる特徴量の積のことである。
同じ特徴量のべき乗 (x0**2, x0**3など)は元の特徴量x0との相関が大きいため、単純に回帰式の説明変数に追加すると多重共線性の問題が発生する。
そこで、interaction_only=Trueとすることにより、同じ特徴量のべき乗を除いて、異なる特徴量の積(x0*x1, x0*x1*x2など)のみを説明変数に追加することが一般的に望ましい。

PolynomialFeaturesクラスでは、主にfit_transform()メソッドを使う。

PolynomialFeatures.fit_transform(X)のように用いる。
ここで、Xは(サンプル数)×(特徴量の数)の2次元配列である。
また、戻り値は(サンプル数)×(新しい特徴量の数)の2次元配列である。
「新しい特徴量の数」はdegreeなどの引数によって変化する。

PolynomialFeaturesクラスの主な使い方としては、多項式回帰が挙げられる。多項式回帰とは、特徴量のn次までのべき乗を用いた回帰モデルである。3次の多項式回帰の場合、特徴量を$x$, 目的変数を$y$とすると、次式で表される。
$y=a+bx+cx^2+dx^3$

PolynomialFeaturesクラスと線形回帰モデルであるLinearRegressionクラスをPipelineで組み合わせると、多項式回帰モデルを構築できる。

以下では、特徴量の数を1~3として、interaction_onlyinclude_biasの効果を確認する。

特徴量が1個の場合

2次の項まで求める

まず、特徴量が1個のみの場合に、degree=2として2次までのべき乗を求める。入力値は3とする。

特徴量をxとすると、
1, x, x**2
が得られる。

1
2
3
4
X1 = [[3]]
poly2d = PolynomialFeatures(2)
print(poly2d.fit_transform(X1))
# [[1. 3. 9.]]

バイアス項を除く

次に、include_bias=Falseとしてバイアス項(1)を除く。

1
2
3
4
X1 = [[3]]
poly2d_nobias = PolynomialFeatures(2, include_bias=False)
print(poly2d_nobias.fit_transform(X1))
# [[3. 9.]]

特徴量が2個の場合

2次の項まで求める

2つの特徴量をx, yとすると、
1, x, y, x**2, x*y, y**2
が得られる。

x=2, y=3として2次までのべき乗を求める。

1
2
3
4
X2 = [[2, 3]]
poly2d = PolynomialFeatures(2)
print(poly2d.fit_transform(X2))
# [[1. 2. 3. 4. 6. 9.]]

3次の項まで求める

次に、3次までの項を求める。2つの特徴量をx, yとすると、
1, x, y, x**2, x*y, y**2, x**3, (x**2)*y, x*(y**2), y**3
が得られる。

x=2, y=3として実行する。

1
2
3
4
X2 = [[2, 3]]
poly3d = PolynomialFeatures(3)
print(poly3d.fit_transform(X2))
# [[ 1.  2.  3.  4.  6.  9.  8. 12. 18. 27.]]

交互作用項のみ出力する

interaction_only=Trueとして、交互作用項のみ出力する。
2つの特徴量をx, yとすると、
1, x, y, x*y
が得られる。すなわち、interaction_only=Falseの場合と比較すると、x**2y**2の項が出力されなくなる。

1
2
3
4
X2 = [[2, 3]]
poly2d_io = PolynomialFeatures(2, interaction_only=True)
print(poly2d_io.fit_transform(X2))
# [[1. 2. 3. 6.]]

特徴量が3個の場合

2次の項まで求める

3つの特徴量をx, y, zとすると、
1, x, y, z, x**2, x*y, x*z, y**2, y*z, z**2
が得られる。
x=2, y=3, z=5として実行する。

1
2
3
4
X3 = [[2, 3, 5]]
poly2d = PolynomialFeatures(2)
print(poly2d.fit_transform(X3))
# [[ 1.  2.  3.  5.  4.  6. 10.  9. 15. 25.]]

交互作用項のみ出力する

interaction_only=Trueとして、交互作用項のみ出力する。
3つの特徴量をx, y, zとすると、
1, x, y, z, x*y, x*z, y*z,
が得られる。
すなわち、interaction_only=Falseの場合と比較すると、x**2, y**2, z**2の項が出力されなくなる。

x=2, y=3, z=5として実行する。

1
2
3
4
X3 = [[2, 3, 5]]
poly2d_io = PolynomialFeatures(2, interaction_only=True)
print(poly2d_io.fit_transform(X3))
# [[ 1.  2.  3.  5.  6. 10. 15.]]

参考

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。Twitterで新着記事を配信中です