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的区间?
ValueError:维度 (-1) 必须在 [0, 2) 范围内
ValueError: `sequences` 在 Keras 中必须是可迭代的