はじめに #
Pythonの機械学習用ライブラリScikit-learnには、特徴量のべき乗を計算するためのPolynomialFeaturesクラスが実装されている。
本記事では、PolynomialFeaturesクラスの引数とメソッドについて解説する。また、特徴量の数を1~3まで変化させ、オプションによって出力がどのように変化するか確認する。
環境 #
記事執筆時点で使用したライブラリのバージョンは以下の通り。
ソフトウェア | バージョン |
---|---|
Python | 3.7.4 |
Scikit-learn | 0.21.3 |
本記事では、Pythonで以下の通りライブラリをインポートする。
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
PolynomialFeaturesクラスの基本 #
PolynomialFeaturesクラスは特徴量(または単に変数)のべき乗を求めるものである。特徴量が複数ある場合には、異なる特徴量間の積も計算する。
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_only
とinclude_bias
の効果を確認する。
特徴量が1個の場合 #
2次の項まで求める #
まず、特徴量が1個のみの場合に、degree=2
として2次までのべき乗を求める。入力値は3とする。
特徴量をx
とすると、
1, x, x**2
が得られる。
X1 = [[3]]
poly2d = PolynomialFeatures(2)
print(poly2d.fit_transform(X1))
# [[1. 3. 9.]]
バイアス項を除く #
次に、include_bias=False
としてバイアス項(1)を除く。
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次までのべき乗を求める。
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
として実行する。
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**2
とy**2
の項が出力されなくなる。
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
として実行する。
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
として実行する。
X3 = [[2, 3, 5]]
poly2d_io = PolynomialFeatures(2, interaction_only=True)
print(poly2d_io.fit_transform(X3))
# [[ 1. 2. 3. 5. 6. 10. 15.]]
参考 #
- sklearn.preprocessing.PolynomialFeatures — scikit-learn 0.24.0 documentation
- scikit-learnのPolynomialFeaturesで多項式と交互作用項の特徴量を作る - 静かなる名辞