前回の記事で書いたのがNumPyで多項式回帰する方法だったので、今回はscikit-learnで行う方法を紹介します。
参考: NumPyで多項式回帰
NumPyの方法は、1変数の多項式に特化していたので、変数が1個しかない場合は非常に手軽に使えました。
ただ、実際は $x_0$ の多項式に加えて $x_1$, $x_2$ の変数も使って回帰したいとか、
$x_0, x_1$ を組み合わせた $x_0 * x_1$ みたいな項も入れたいとかいろんなケースがあると思います。
そのような場合は、scikit-learnの利用が検討できます。
と言っても、scikit-learnに多項式関数のモデルが実装されているわけではなく、
実際は前処理だけやってくれるモデルと、通常の線形回帰のモデルを組み合わせて使うことになります。
(このめんどくささが、1変数ならNumPyを推す所以です。)
多項式の特徴量生成には、 sklearn.preprocessing.PolynomialFeatures を使います。
試しに、3変数のデータ4セットに対して、2次までの項を生成してみたコードが次です。
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
X = np.arange(12).reshape(4, 3)
print(X)
"""
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
"""
poly = PolynomialFeatures(2) # 次数2を指定
X_poly = poly.fit_transform(X)
print(X_poly)
"""
[[ 1. 0. 1. 2. 0. 0. 0. 1. 2. 4.]
[ 1. 3. 4. 5. 9. 12. 15. 16. 20. 25.]
[ 1. 6. 7. 8. 36. 42. 48. 49. 56. 64.]
[ 1. 9. 10. 11. 81. 90. 99. 100. 110. 121.]]
"""
元のデータを$x_0, x_1, x_2$ とすると、
定数$1$,$x_0, x_1, x_2, x_0^2, x_0x_1, x_0x_2, x_1^2, x_1x_2, x_2^2$ のデータが生成されているのがわかります。
何番目のデータがどういう演算で生成された項なのか、という情報は、powers_ という属性に保有されています。
print(poly.powers_)
"""
[[0 0 0]
[1 0 0]
[0 1 0]
[0 0 1]
[2 0 0]
[1 1 0]
[1 0 1]
[0 2 0]
[0 1 1]
[0 0 2]]
"""
定数1の項はいらないな、という時は、 include_biasにFalseを指定して、
PolynomialFeatures(2, include_bias=False)とすれば出てきません。
あとは、この生成されたデータを使って回帰分析を行えば、 scikit-learn を用いた多項式回帰の完成です。