Python 统计数据对已转换特征的新数据进行样本外预测

Python 统计数据对已转换特征的新数据进行样本外预测,python,statistics,regression,statsmodels,Python,Statistics,Regression,Statsmodels,我很好奇为什么我不能得出模型预测的相同值 考虑下面的模型。我试图了解特征、保险费、年龄和客户是否吸烟之间的关系 注意年龄变量已经过预处理(以平均值为中心) 现在,当我生成新数据并应用预测方法时,我将在尝试手动计算这些数据时得出不同的值。 以索引0和索引2为例,我希望预测值与下面的输出类似,但它们确实相去甚远 我是否遗漏了在拟合模型时所做的特征转换 new_data = pd.DataFrame({'age': {0: 19, 1: 41, 2: 43},

我很好奇为什么我不能得出模型预测的相同值

考虑下面的模型。我试图了解特征、保险费、年龄和客户是否吸烟之间的关系

注意年龄变量已经过预处理(以平均值为中心)

现在,当我生成新数据并应用预测方法时,我将在尝试手动计算这些数据时得出不同的值。 以索引0和索引2为例,我希望预测值与下面的输出类似,但它们确实相去甚远

我是否遗漏了在拟合模型时所做的特征转换

new_data = pd.DataFrame({'age': {0: 19, 1: 41, 2: 43}, 
                        'smoker': {0: 'yes', 1: 'no', 2: 'no'}})

idx_0 = (b0+b2) + (b1+b3) * 19
# 38061.1
idx_2 = b0 + b1 * 43
# 19878.4

fit1.predict(new_data)
0    27581.276650
1    10168.273779
2    10702.771604



我假设您希望将年龄
变量
,这
I(年龄-np.mean(年龄))
起作用,但当您尝试预测时,它将根据预测数据框中的平均值重新计算年龄

同样,当你乘以系数时,你必须乘以中心值(即年龄-平均值(年龄)),而不是原始值

创建另一个以年龄为中心的列没有什么坏处:

import pandas as pd
import statsmodels.formula.api as smf
import numpy as np
from sklearn.preprocessing import StandardScaler

sc = StandardScaler(with_std=False)

insurance = pd.read_csv("https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/master/insurance.csv")
insurance['age_c'] = sc.fit_transform(insurance[['age']])

model1 = smf.ols('charges~age_c * smoker', data=insurance)
fit1 = model1.fit()
params = fit1.params
# get params
b0, b2, b1, b3 = params['Intercept'], params['smoker[T.yes]'], params['age_c'], params['age_c:smoker[T.yes]']
通过使用“年龄”列上的“之前”缩放器,您可以预测:

new_data = pd.DataFrame({'age': {0: 19, 1: 41, 2: 43}, 
                        'smoker': {0: 'yes', 1: 'no', 2: 'no'}})

new_data['age_c'] = sc.transform(new_data[['age']])

new_data

   age smoker      age_c
0   19    yes -20.207025
1   41     no   1.792975
2   43     no   3.792975
检查:

idx_0 = (b0+b2) + (b1+b3) * -20.207025
# 26093.64269247414
idx_2 = b0 + b1 * 3.792975
9400.282805032146

fit1.predict(new_data)
Out[13]: 
0    26093.642567
1     8865.784870
2     9400.282695
背景资料
idx_0 = (b0+b2) + (b1+b3) * -20.207025
# 26093.64269247414
idx_2 = b0 + b1 * 3.792975
9400.282805032146

fit1.predict(new_data)
Out[13]: 
0    26093.642567
1     8865.784870
2     9400.282695