Python statsmodels,glm公式和分类变量

时间:2018-01-24 21:51:30

标签: python statsmodels glm

因此,假设我有一个数据框df,并且在此数据框中我有列O, A, B, D, X, Y, ZExo是预测变量名称的列表,A, B, D, X, Y, Z。现在前四列是实变量,后三列是分类变量,如

  • 对于X中的任何x,x等于列表中的以下元素之一[" RED"," ORANGE"," YELLOW&# 34;," GREEN"," BLUE"," INDIGO"," VIOLET"]。

  • 对于Y中的任何y,y恰好等于列表中的以下元素之一[" DO"," RE"," MI&# 34;," FA"," SO"," LA"," TI"]。

  • 对于Z中的任何z,z恰好等于列表中的以下元素之一[" LUST"," GLUTTONY"," GREED&# 34;," SLOTH"," WRATH"," ENVY"," PRIDE"]

因此,我对df的一百个元素进行采样,并将采样集拆分为训练集和测试集。然后我决定写

mod = smf.glm(formula="O ~ A + B + D + C(X) + C(Y) + C(Z)",
              data=train,
              family=sm.families.Tweedie(var_power=1.5))
mod = mod.fit()
result = mod.predict(exog=test[exo])

但是等等!事实证明,可能的价值"黄色"不会出现在训练集中但确实发生在测试集中,因此smf.glm不能使用归纳法。如何防止发生此类错误?

1 个答案:

答案 0 :(得分:2)

一种常见的方法是抛弃那些不具备每组变量的测试火车分裂。更精细的方法是使用一个分离器来保证每个变量都在每个集合中。

主要问题是没有识别训练数据集中没有任何观察结果的解释变量的参数,因此我们无法估计它们。如果我们将它们遗漏,那么它们将被假定为零,并且也不会包含在测试数据集的预测中。

要获得包含完整变量列表的拆分,即使没有对子集中的变量进行观察,也可以直接使用patsy.dmatrices为完整数据集创建设计矩阵,并且拆分设计矩阵而不是原始数据。这将为数据集的任何子集或分区提供一致的参数化和一致列。

patsy还允许在为分类变量创建设计矩阵时指定级别,但我从未试图包含"缺少"水平。