ValueError: endog 必须在单位区间内

Posted

技术标签:

【中文标题】ValueError: endog 必须在单位区间内【英文标题】:ValueError: endog must be in the unit interval 【发布时间】:2015-09-28 02:48:15 【问题描述】:

在使用 statsmodels 时,我收到了这个奇怪的错误:ValueError: endog must be in the unit interval. 谁能给我更多关于这个错误的信息?谷歌没有帮助。

产生错误的代码:

"""
Multiple regression with dummy variables. 
"""

import pandas as pd
import statsmodels.api as sm
import pylab as pl
import numpy as np

df = pd.read_csv('cost_data.csv')
df.columns = ['Cost', 'R(t)', 'Day of Week']
dummy_ranks = pd.get_dummies(df['Day of Week'], prefix='days')
cols_to_keep = ['Cost', 'R(t)']
data = df[cols_to_keep].join(dummy_ranks.ix[:,'days_2':])
data['intercept'] = 1.0

print(data)

train_cols = data.columns[1:]
logit = sm.Logit(data['Cost'], data[train_cols])

result = logit.fit()

print(result.summary())

还有回溯:

Traceback (most recent call last):
  File "multiple_regression_dummy.py", line 20, in <module>
    logit = sm.Logit(data['Cost'], data[train_cols])
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/statsmodels/discrete/discrete_model.py", line 404, in __init__
    raise ValueError("endog must be in the unit interval.")
ValueError: endog must be in the unit interval.

【问题讨论】:

也许检查产生此错误的条件: if (self.__class__.__name__ != 'MNLogit' 而不是 np.all((self.endog >= 0) & (self.endog 您的Cost 数据是什么? Logit 要求因变量(endog)在单位区间内。如果您想要使用另一个区间中的值进行逻辑回归,那么您需要转换您的值以使它们处于单位区间中。但是Logit并不要求endog是0、1的整数,所以我们可以用它来做比例。 Cost不在单位区间内。知道为什么 Logit 需要这个吗? Logit 的基本分布是伯努利分布,取值 0 和 1。这可以扩展到 0 和 1 之间的任何值,但函数未在单位区间之外定义。如果您有一个正因变量和一个指数平均函数,那么即使数据是连续的,也可以使用泊松分布。对于未绑定的连续数据,通常的模型是 OLS。 【参考方案1】:

当我的目标列的值大于 1 时出现此错误。 确保您的目标列介于 0 和 1 之间(这是 Logistic 回归的要求),然后重试。 例如,如果目标列的值为 1-5,则将 4 和 5 设为正类,将 1、2、3 设为负类。希望这会有所帮助。

【讨论】:

图例 - 我的目标列中有一个 NaN【参考方案2】:

您似乎遵循了与我相同的逻辑回归教程: http://blog.yhat.com/posts/logistic-regression-and-python.html

当我拟合逻辑回归时,我最终得到了相同的值错误,我需要让它运行的技巧是确保删除所有缺少值的数据行(N/A 或 np.nan)。

这可以通过 pandas 函数 pandas.notnull() 来完成,如下所示:

data = data[pd.notnull(data['Cost'])],

data = data[pd.notnull(data['R(t)'])],

...

以此类推,直到所有变量都有相同数量的值可供使用。

希望这对其他人有帮助!

【讨论】:

【参考方案3】:

我遇到了同样的问题:我将模型从分类更改为回归模型(我在回归问题中使用分类模型 .logit)

您仍然可以使用 StatsModel,但使用 OLS,例如,而不是 logit。 Logit(逻辑回归)用于分类问题,但这里似乎是回归问题。使用OLS,可以解决问题

【讨论】:

以上是关于ValueError: endog 必须在单位区间内的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python找出样本均值在+/-一个总体均值单位内的概率为0.95的区间?

[模拟赛]Boss

ValueError:维度 (-1) 必须在 [0, 2) 范围内

ValueError: `sequences` 在 Keras 中必须是可迭代的

ValueError:logits 和标签必须具有相同的形状

ValueError:索引必须单调递增或递减