メインコンテンツへスキップ

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

·1917 文字·4 分
目次

はじめに
#

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_onlyinclude_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**2y**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.]]

参考
#

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

scikit-learnのBaggingClassifierでバギングする
·2756 文字·6 分
BaggingClassifierを用いた学習(バギング、ペースティング、ランダムサブスペース、ランダムパッチ)について解説する。
Scikit-learnの主成分分析 (PCA)
·1432 文字·3 分
Scikit-learnのPCAクラスのパラメータ、属性とメソッドについて解説する。
Scikit-learnの正則化付き重回帰モデル
·2498 文字·5 分
Scikit-learnに実装されている重回帰、Ridge回帰、Lasso回帰、Elastic Netのロジックと使用方法をまとめた。
Scikit-learnでデータをスケール変換する
··4596 文字·10 分
Pythonの機械学習用ライブラリScikit-learnに実装されている、スケール変換について調べた。
BaggingClassifierの使用例
·1426 文字·3 分
BaggingClassifierクラスの使用例を示す。
Scikit-learn ランダムフォレスト回帰のfeature_importances_の定義
·1236 文字·3 分
Scikit-learnの回帰木やランダムフォレスト回帰のクラスには、Feature Importances (FI) という説明変数の重要度を示す指標がある。これは、各説明変数による予測誤差の二乗平均の減少量に対して、データ点数の重みを掛けて求めた値である。