Python 统计模型、glm 公式和分类变量
Python statsmodels, glm formula and categorical variables
所以让我们假设我有一个数据框 df
并且在这个数据框中我有列 O, A, B, D, X, Y, Z
。 Exo
是预测变量名称的列表,它们是 A, B, D, X, Y, Z
。现在前四列是实变量,后三列是分类变量,这样
对于X中的任意x,x恰好等于列表中的下列元素之一["RED"、"ORANGE"、"YELLOW"、"GREEN", "BLUE", "INDIGO", "VIOLET"].
对于 Y 中的任意 y,y 恰好等于列表中的以下元素之一 ["DO"、"RE"、"MI"、"FA", "SO", "LA", "TI"].
对于Z中的任意z,z恰好等于列表中的下列元素之一["LUST"、"GLUTTONY"、"GREED"、"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])
但是等等!原来可能的值"yellow"没有出现在训练集中,但确实出现在测试集中,所以smf.glm
不能使用归纳法。如何防止此类错误发生?
一种常见的方法是丢弃那些没有在每个集合中包含每个变量的测试训练拆分。更复杂的方法是使用一个拆分器来保证所有变量都在每个集合中。
主要问题是训练数据集中没有任何观测值的解释变量的参数未被识别,因此我们无法估计它们。如果我们将它们排除在外,那么它们将被假定为零,并且也不会包含在测试数据集的预测中。
即使没有对子集中的变量进行观察,要使用完整的变量列表进行拆分是直接使用 patsy.dmatrices 为 full[ 创建设计矩阵=19=] 数据集,并拆分设计矩阵而不是原始数据。这将为数据集的任何子集或分区提供一致的参数化和一致的列。
patsy 还允许在为分类变量创建设计矩阵时指定级别,但我从未尝试包含 "missing" 个级别。
所以让我们假设我有一个数据框 df
并且在这个数据框中我有列 O, A, B, D, X, Y, Z
。 Exo
是预测变量名称的列表,它们是 A, B, D, X, Y, Z
。现在前四列是实变量,后三列是分类变量,这样
对于X中的任意x,x恰好等于列表中的下列元素之一["RED"、"ORANGE"、"YELLOW"、"GREEN", "BLUE", "INDIGO", "VIOLET"].
对于 Y 中的任意 y,y 恰好等于列表中的以下元素之一 ["DO"、"RE"、"MI"、"FA", "SO", "LA", "TI"].
对于Z中的任意z,z恰好等于列表中的下列元素之一["LUST"、"GLUTTONY"、"GREED"、"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])
但是等等!原来可能的值"yellow"没有出现在训练集中,但确实出现在测试集中,所以smf.glm
不能使用归纳法。如何防止此类错误发生?
一种常见的方法是丢弃那些没有在每个集合中包含每个变量的测试训练拆分。更复杂的方法是使用一个拆分器来保证所有变量都在每个集合中。
主要问题是训练数据集中没有任何观测值的解释变量的参数未被识别,因此我们无法估计它们。如果我们将它们排除在外,那么它们将被假定为零,并且也不会包含在测试数据集的预测中。
即使没有对子集中的变量进行观察,要使用完整的变量列表进行拆分是直接使用 patsy.dmatrices 为 full[ 创建设计矩阵=19=] 数据集,并拆分设计矩阵而不是原始数据。这将为数据集的任何子集或分区提供一致的参数化和一致的列。
patsy 还允许在为分类变量创建设计矩阵时指定级别,但我从未尝试包含 "missing" 个级别。