モデル式 演習

from patsy import dmatrix
data = {'a':0, 'b':0}  # 変数
fr0 = 'a' 式はこの’’の中に入れる
df0 = dmatrix(fr0, data)
print(' + '.join(df0.design_info.column_names))
Intercept + a
fr1 = 'a - 1'
fr2 = 'a + b - 1'
fr3 = 'a:b -1'
fr4 = 'a*b'
fr5 = 'b/a'

for fr in [fr1, fr2, fr3, fr4, fr5]:
    dm = dmatrix(fr, data)
    print(' + '.join(dm.design_info.column_names))
a
a + b
a:b
Intercept + a + b + a:b
Intercept + b + b:a

外挿について

学習に使った説明変数の範囲外で、予測をすることを外挿といいます。外挿すると、学習していないところで推測するので、予測結果の信頼性が低くなるので、注意が必要です。

世界の人口を使って、試してみましょう。

%matplotlib inline
import numpy as np, pandas as pd, matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from patsy import dmatrix
df = pd.DataFrame({
    'year': [1650, 1800, 1900, 1960, 1974, 1987, 1999, 2011],
    'population': [5, 10, 20, 30, 40, 50, 60, 70]
})
X = dmatrix('np.exp(year / 60) - 1', df)
lr = LinearRegression().fit(X, df.population)
y_pred = lr.predict(X)
plt.title('World population')
plt.plot(df.year, df.population)
plt.plot(df.year, y_pred)
lr.predict([[np.exp(2050 / 60)]])  # array([128.02053404])
https://images.pyq.jp/repo/prod/ml_reg_07/ml_reg_02.jpg

2011年までに指数関数的に増えています。このまま、2050年の世界の人口を予測すると128億人になります。
しかし、人口が永遠に指数関数的に増えることは考えられません。
国連の2050年の世界の人口予測では、91億人で、確かに違います。

コメント

タイトルとURLをコピーしました