在 Python 中建模时检测多共线性或具有线性组合的列:LinAlgError

2023-11-23

我正在为具有 34 个因变量的 logit 模型进行数据建模,并且它不断抛出奇异矩阵错误,如下所示 -:

Traceback (most recent call last):
  File "<pyshell#1116>", line 1, in <module>
    test_scores  = smf.Logit(m['event'], train_cols,missing='drop').fit()
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/discrete/discrete_model.py", line 1186, in fit
    disp=disp, callback=callback, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/discrete/discrete_model.py", line 164, in fit
    disp=disp, callback=callback, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/base/model.py", line 357, in fit
    hess=hess)
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/base/model.py", line 405, in _fit_mle_newton
    newparams = oldparams - np.dot(np.linalg.inv(H),
  File "/usr/local/lib/python2.7/site-packages/numpy/linalg/linalg.py", line 445, in inv
    return wrap(solve(a, identity(a.shape[0], dtype=a.dtype)))
  File "/usr/local/lib/python2.7/site-packages/numpy/linalg/linalg.py", line 328, in solve
    raise LinAlgError, 'Singular matrix'
LinAlgError: Singular matrix

就在那时,我偶然发现了这种将矩阵简化为其独立列的方法

def independent_columns(A, tol = 0):#1e-05):
    """
    Return an array composed of independent columns of A.

    Note the answer may not be unique; this function returns one of many
    possible answers.

    https://stackoverflow.com/q/13312498/190597 (user1812712)
    http://math.stackexchange.com/a/199132/1140 (Gerry Myerson)
    http://mail.scipy.org/pipermail/numpy-discussion/2008-November/038705.html
        (Anne Archibald)

    >>> A = np.array([(2,4,1,3),(-1,-2,1,0),(0,0,2,2),(3,6,2,5)])
    2 4 1 3
    -1 -2 1 0
    0 0 2 2
    3 6 2 5
    # try with checking the rank of matrixs 
    >>> independent_columns(A)
    np.array([[1, 4],
              [2, 5],
              [3, 6]])
    """
    Q, R = linalg.qr(A)
    independent = np.where(np.abs(R.diagonal()) > tol)[0]
    #print independent
    return A[:, independent], independent


A,independent_col_indexes=independent_columns(train_cols.as_matrix(columns=None)) 
#train_cols will not be converted back from a df to a  matrix object,so doing this explicitly
A2=pd.DataFrame(A, columns=train_cols.columns[independent_col_indexes])

test_scores = smf.Logit(m['event'],A2,missing='drop').fit()

我仍然得到 LinAlgError ,尽管我希望现在矩阵等级会降低。

另外,我看到np.linalg.matrix_rank(train_cols)返回 33(即,在调用独立列函数之前,“x”列总数为 34(即,len(train_cols.ix[0])=34),这意味着我没有满秩矩阵),而np.linalg.matrix_rank(A2)返回 33 (这意味着我已经删除了一列,但当我运行时我仍然看到 LinAlgError )test_scores = smf.Logit(m['event'],A2,missing='drop').fit(),我缺少什么?

参考上面的代码 -如何找到协方差矩阵中的简并行/列

我尝试开始向前构建模型,通过一次引入每个变量,这不会给我带来奇异矩阵误差,但我宁愿有一种确定性的方法,让我知道我做错了什么&如何消除这些列。

编辑(更新了@@的帖子建议 下面是user333700)

1.你是对的,“A2”并没有降低33的排名。 IE。len(A2.ix[0]) =34-> 意味着可能的共线列不会被删除 - 我应该增加“tol”,以获得 A2 的排名(及其列数)的容差,如 33。如果我将 tol 更改为上面的“1e-05”,然后我确实得到了len(A2.ix[0]) =33,这对我来说意味着 tol >0 (严格来说)是一个指标。 之后我也做了同样的事情,test_scores = smf.Logit(m['event'],A2,missing='drop').fit(),无需 nm 即可收敛。

2.尝试“nm”方法后出错。但奇怪的是,如果我只获取 20,000 行,我确实会得到结果。因为它没有显示内存错误,但是“Inverting hessian failed, no bse or cov_params available" - 我假设有多个几乎相似的记录 - 你会怎么说?

m  = smf.Logit(data['event_custom'].ix[0:1000000] , train_cols.ix[0:1000000],missing='drop')
test_scores=m.fit(start_params=None,method='nm',maxiter=200,full_output=1)
Warning: Maximum number of iterations has been exceeded

Warning (from warnings module):
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/base/model.py", line 374
    warn(warndoc, Warning)
Warning: Inverting hessian failed, no bse or cov_params available


test_scores.summary()

Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    test_scores.summary()
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/discrete/discrete_model.py", line 2396, in summary
    yname_list)
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/discrete/discrete_model.py", line 2253, in summary
    use_t=False)
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/iolib/summary.py", line 826, in add_table_params
    use_t=use_t)
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/iolib/summary.py", line 447, in summary_params
    std_err = results.bse
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/tools/decorators.py", line 95, in __get__
    _cachedval = self.fget(obj)
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/base/model.py", line 1037, in bse
    return np.sqrt(np.diag(self.cov_params()))
  File "/usr/local/lib/python2.7/site-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/base/model.py", line 1102, in cov_params
    raise ValueError('need covariance of parameters for computing '
ValueError: need covariance of parameters for computing (unnormalized) covariances

Edit 2:(下面更新了@user333700 的建议)

重申我正在尝试建模的内容 - 不到总数的约 1% 用户“转化”(成功结果) - 所以我采取了一个平衡的样本 35(+ve) /65(-ve)

我怀疑该模型虽然收敛,但并不稳健。因此,将使用来自不同数据集的“start_params”作为早期迭代的参数。 此编辑是为了确认“start_params”是否可以输入到结果中,如下所示 -:

A,independent_col_indexes=independent_columns(train_cols.as_matrix(columns=None))
A2=pd.DataFrame(A, columns=train_cols.columns[independent_col_indexes])
m  = smf.Logit(data['event_custom'], A2,missing='drop')
#m  = smf.Logit(data['event_custom'], train_cols,missing='drop')#,method='nm').fit()#This doesnt work, so tried 'nm' which work, but used lasso, as nm did not converge.
test_scores=m.fit_regularized(start_params=None, method='l1', maxiter='defined_by_method', full_output=1, disp=1, callback=None, alpha=0, \
trim_mode='auto', auto_trim_tol=0.01, size_trim_tol=0.0001, qc_tol=0.03)

a_good_looking_previous_result.params=test_scores.params #storing the parameters of pass1 to feed into pass2

test_scores.params
bidfloor_Quartile_modified_binned_0               0.305765
connectiontype_binned_0                          -0.436798
day_custom_binned_Fri                            -0.040269
day_custom_binned_Mon                             0.138599
day_custom_binned_Sat                            -0.319997
day_custom_binned_Sun                            -0.236507
day_custom_binned_Thu                            -0.058922
user_agent_device_family_binned_iPad            -10.793270
user_agent_device_family_binned_iPhone           -8.483099
user_agent_masterclass_binned_apple               9.038889
user_agent_masterclass_binned_generic            -0.760297
user_agent_masterclass_binned_samsung            -0.063522
log_height_width                                  0.593199
log_height_width_ScreenResolution                -0.520836
productivity                                     -1.495373
games                                             0.706340
entertainment                                    -1.806886
IAB24                                             2.531467
IAB17                                             0.650327
IAB14                                             0.414031
utilities                                         9.968253
IAB1                                              1.850786
social_networking                                -2.814148
IAB3                                             -9.230780
music                                             0.019584
IAB9                                             -0.415559
C(time_day_modified)[(6, 12]]:C(country)[AUS]    -0.103003
C(time_day_modified)[(0, 6]]:C(country)[HKG]      0.769272
C(time_day_modified)[(6, 12]]:C(country)[HKG]     0.406882
C(time_day_modified)[(0, 6]]:C(country)[IDN]      0.073306
C(time_day_modified)[(6, 12]]:C(country)[IDN]    -0.207568
C(time_day_modified)[(0, 6]]:C(country)[IND]      0.033370
... more params here 

现在在不同的数据集(pass2,用于索引)上,我的模型如下所示 -: IE。我读取了一个新的数据帧,进行所有变量转换,然后像之前一样通过 Logit 进行建模。

m_pass2  = smf.Logit(data['event_custom'], A2_pass2,missing='drop')
test_scores_pass2=m_pass2.fit_regularized(start_params=a_good_looking_previous_result.params, method='l1', maxiter='defined_by_method', full_output=1, disp=1, callback=None, alpha=0, \
trim_mode='auto', auto_trim_tol=0.01, size_trim_tol=0.0001, qc_tol=0.03)

并且,可能通过从早期传递中获取“start_params”来继续迭代。


对此有几点:

您需要 tol > 0 才能检测到近乎完美的共线性,这也可能会在以后的计算中导致数值问题。 检查列数A2查看某列是否真的被删除。

Logit 需要使用 exog 进行一些非线性计算,因此即使设计矩阵不是非常接近完美共线性,对数似然、导数或 Hessian 计算的转换变量最终可能仍会出现数值问题,例如单一的黑森州。

(当我们接近浮点精度 1e-15、1e-16 时,所有这些都是浮点问题。matrix_rank 和类似 linalg 函数的默认阈值有时存在差异,这可能意味着在某些边缘情况下,一个函数将其识别为单一的,而另一个则不是。)

包括 Logit 在内的离散模型的默认优化方法是简单的牛顿方法,该方法在相当好的情况下速度很快,但在条件较差的情况下可能会失败。您可以尝试其他优化器之一,这将是 scipy.optimize 中的优化器之一,method='nm'通常非常稳健但缓慢,method='bfgs'在许多情况下效果很好,但也可能遇到收敛问题。

然而,即使其他优化方法之一成功,仍然有必要检查结果。通常,一种方法的失败意味着模型或估计问题可能没有得到很好的定义。

检查这是否只是起始值问题或规范问题的一个好方法是运行method='nm'首先,然后运行一种更准确的方法,例如newton or bfgs使用nm估计作为起始值,并看看它是否从良好的起始值成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中建模时检测多共线性或具有线性组合的列:LinAlgError 的相关文章

  • 使用 sympy 计算符号特征值

    我正在尝试计算符号复矩阵的特征值Mof size 3x3 在某些情况下 eigenvals 工作完美 例如 以下代码 import sympy as sp kx sp symbols kx x 0 M sp Matrix 0 0 0 0 0
  • 在 python 中高效、快速地迭代元组列表中超过 3600 万个项目

    首先 在任何人将其标记为重复之前 请阅读以下内容 我不确定迭代的延迟是否是由于尺寸巨大或我的逻辑造成的 我有一个必须迭代的用例3600 万件商品在元组列表中 我的主要要求是速度和效率 样本清单 how are you I am fine h
  • r中逻辑回归的分类变量

    我如何在 R 中的二元逻辑回归中实现分类变量 我想测试专业领域 学生 工人 教师 个体户 对购买某种产品的概率的影响 在我的示例中 y 是一个二进制变量 1 表示购买产品 0 表示不购买 x1 是性别 0男 1女 x2 年龄 20 到 80
  • 从第二个 DF 中查找一个 DF 中属于同等大小的矩形(由两个点给出)的点的快速(矢量化)方法

    我的数据框 A 如下所示 type latw lngs late lngn 0 1000 45 457966 9 174864 45 458030 9 174907 1 1000 45 457966 9 174864 45 458030 9
  • 将 Python 脚本导入另一个脚本?

    我正在阅读 Zed Shaw 的 艰难学习 Python 正在学习第 26 课 在本课中 我们必须修复一些代码 这些代码从另一个脚本调用函数 他说我们不必导入它们来通过测试 但我很好奇我们将如何做到这一点 课程链接 http learnpy
  • python中使用argsort进行排序

    我尝试对数组进行排序 import numpy as np arr 5 3 7 2 6 34 46 344 545 32 5 22 print unsorted print arr np argsort arr print sorted p
  • 删除 numpy 中的循环以进行简单的矩阵分配

    如何删除这个简单矩阵分配中的循环以提高性能 nk ncol nrow index shape for kk in range 0 nk for ii in range 0 nrow for jj in range 0 ncol idx in
  • 内存高效的随机数迭代器,无需替换

    我觉得这应该很容易 但经过多次搜索和尝试后我找不到答案 基本上 我有大量的物品 我想以随机顺序进行采样 而不需要更换 在本例中 它们是二维数组中的单元 我用于较小数组的解决方案不会转换 因为它需要对内存数组进行改组 如果我必须采样的数量很小
  • 每个值有多个键

    是否可以在 Python 字典中为每个值分配多个键 一种可能的解决方案是为每个键分配值 dict k1 v1 k2 v1 k3 v1 k4 v2 但这并不高效 因为我的数据文件大于 2 GB 否则你可以制作一个字典键的字典 key dic
  • 使用 python 中的硬件 rng

    是否有任何现成的库 以便 numpy 程序可以使用 intel 硬件 prng rdrand 来填充随机数缓冲区 如果做不到这一点 有人可以为我指明一些我可以改编或使用的 C 代码的正确方向 我将 CPython 和 Cython 与 nu
  • 将 numpy 数组传递给 C++

    我有一些用 Python 编写的代码 其输出是 numpy 数组 现在我想将该输出发送到C 代码 其中将执行大部分计算 我尝试过使用 cython 的public cdef 但我正在处理一些问题 我将感谢您的帮助 这是我的代码 pymodu
  • 如何将样条拟合转换为分段函数?

    假设我有 import numpy as np from scipy interpolate import UnivariateSpline true data I don t know this function x np linspac
  • matlab中的正则逻辑回归代码

    我正在尝试正则化 LR 在 matlab 中使用以下公式很简单 成本函数 J theta 1 m sum y i log h x i 1 y i log 1 h x i lambda 2 m sum theta j 梯度 J theta t
  • python中稀疏矩阵的相关系数?

    有谁知道如何从Python中的一个非常大的稀疏矩阵计算相关矩阵 基本上 我正在寻找类似的东西numpy corrcoef这将适用于 scipy 稀疏矩阵 您可以从协方差矩阵相当直接地计算相关系数 如下所示 import numpy as n
  • Python:numpy/pandas 根据条件更改值

    我想知道是否有更快 更 Pythonic 的方法来执行以下操作 例如使用一些内置方法 给定一个 pandas DataFrame 或 numpy 浮点数组 如果该值等于或小于 0 5 我需要计算倒数并乘以 1 并用新计算的值替换旧值 转变
  • “扩展”numpy ndarray 的好方法?

    有没有 扩展 numpy ndarray 的好方法 假设我有一个像这样的 ndarray 1 2 3 4 我希望每行通过填充零来包含更多元素 1 2 0 0 0 3 4 0 0 0 我知道一定有一些蛮力的方法可以做到这一点 比如构造一个带有
  • 对于多列,将当前行和上一行的差异附加到新列

    对于 df 中的每一列 我想从前一行 row n 1 row n 中减去当前行 但我遇到了困难 我的代码如下 usr bin python3 from pandas datareader import data import pandas
  • 如何生成给定范围内的回文数列表?

    假设范围是 1 X 120 这是我尝试过的 gt gt gt def isPalindrome s check if a number is a Palindrome s str s return s s 1 gt gt gt def ge
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • 在 Python 中使用尾随逗号连接或打印列表元素

    我的清单如下 gt gt gt l 1 2 3 4 如果我使用 join 语句 gt gt gt s join l 会给我输出 1 2 3 4 但是 如果我想要输出为 1 2 3 4 我知道我可以使用字符串连接 但我想知道一些更好的方法 字
  • Pandas groupby + 变换和多列

    为了获得在 groupby data 上执行的结果 其详细程度与原始 DataFrame 相同的观察计数 相同 我使用了转换函数 例子 原始数据框 name year grade Jack 2010 6 Jack 2011 7 Rosie
  • 包可见性[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 为什么要使用包可见性 默认 除非该类在 java 中应该是 public 正如 Rostislav Matl 所说 当您想要制作不属于软件包界面一部分的东西时 它非常有用 举个例
  • AffineTransform:从中心缩放形状

    我正在尝试使用 AffineTransform 从中心缩放矩形 我确信解决方案是显而易见的 但我无法使其发挥作用 这是我迄今为止测试过的 import java awt Color import java awt Dimension imp
  • 如何更改 Lollipop 上最新 Chrome 版本中标题栏和地址栏的颜色?

    我还没有找到关于这个主题的任何内容 我真的很喜欢在概览上更改地址栏颜色和标题颜色的功能 是否有捷径可寻 我想你需要安卓5 0 Lollipop 要让它工作 而 Chrome 的合并选项卡和应用程序 set to On 经过一番搜索后我找到了
  • Javascript 字符串对象只读?

    a new String Hello a 0 H true a 0 J a 0 J false a 0 H true 这是否意味着我只能使用字符串作为字符数组 split 进而 join ANSWER 是的 在Javascript stri
  • 使用依赖注入注入依赖注入器

    对于依赖注入来说相当陌生 我试图弄清楚这是否是一种反模式 假设我有 3 个程序集 Foo Shared this has all the interfaces Foo Users references Foo Shared Foo Paym
  • @RefreshScope 不工作 - Spring Boot

    我正在遵循此处描述的方法 https github com jeroenbellen blog manage and reload spring properties 唯一的区别是 就我而言 这些属性在多个类中使用 因此我将它们全部放在一个
  • Facebook 登录建议需要 HTTPS - 如何在 ASP.NET MVC 中为 Facebook 登录配置 HTTP 重定向 URL?

    Facebook 建议我使用 HTTPS 重定向 URL 而不是 HTTP 我一直在尝试找到一种方法来配置它来生成 HTTPS URL 目前它正在生成 HTTP URL http example com signin facebook sc
  • 数组的大小是在编译时确定的吗?

    当我在阅读有关数组初始化的内容时本教程 我发现了这个注释 type name elements 注意 方括号内的元素字段 表示数组中元素的数量 必须是常量表达式 因为数组是静态内存块 其大小必须在程序运行之前的编译时确定 据我所知 数组在运
  • 检查一个字符是否是Java中的特殊字符[重复]

    这个问题在这里已经有答案了 可能的重复 JAVA 检查字符串中是否有特殊字符 我是一名新手程序员 正在寻求帮助确定某个字符是否是特殊字符 我的程序要求用户输入文件名 程序读取文件中的文本并确定文本中有多少个空格 数字 字母和特殊字符 我已完
  • LARAVEL5 自定义登录

    我正在使用需要自定义登录的应用程序 我必须遵循这个流程 用户将进入登录页面 用户提交登录页面 应用程序将检查用户是否在数据库中 3 1 如果用户不在数据库中 会向第三方发送请求 检查是否登录成功 3 2 如果用户在数据库中 则验证密码 现在
  • statsmodel 中的 MNLogit 返回 nan

    我正在尝试在著名的虹膜数据集上使用 statsmodels 的 MNLogit 函数 当我尝试拟合模型时 我得到 当前函数值 nan 这是我正在使用的代码 import statsmodels api as st iris st datas
  • 有没有任何工具可以比较两个网页的结构?

    我从我们的创意团队收到 HTML 页面 然后使用它们构建 aspx 页面 我经常面临的一项挑战是让我输出的 HTML 与他们的完全匹配 我几乎总是把嵌套搞砸 div 位于我的页面和母版页之间 有谁知道在这种情况下有帮助的工具 可以比较两个页
  • 模拟输入上的点击事件 - JavaScript

    我试图通过点击来模拟输入标签的点击anchor标签 这样我可以隐藏输入并将图像包装在锚标签内 这可以使用 jQuery 触发函数来工作 但我不能让它只使用 普通 Javascript jQuery 版本 let fake fake fake
  • C# 中的柯里化表达式

    我正在尝试构建一个可以输入 Linq2SQL 的表达式树 以便它将生成一个漂亮的干净查询 我的目的是构建一个过滤器 将任意单词集与 AND 和 NOT 或 OR 和 NOT 结合在一起 因为我想改变我搜索的字段 所以我最好想组成一个列表Ex
  • 无法在 Mac High Sierra 上打开 UIAutomatorviewer

    我们有配备 High Sierra 10 13 6 的全新 MacBook 其他系统信息 JAVA Version java version 11 0 1 2018 10 16 LTS Java TM SE 运行时环境 18 9 内部版本
  • 在 Android 中创建带有可点击图像的网格视图

    我想创建一个带有可单击图像的网格视图 每当单击图像时 相应的值就会显示在网格视图下方 我面临的问题是在设计部分 我不知道如何设计这样的网格视图 每次我尝试这样做时 都会得到一些不好的结果 我目前还没有 Android UI 设计经验 我怎样
  • 使用 EmptyWorkingSet 有哪些副作用?

    我使用下面的代码来释放某些正在运行的程序的内存 因为我自己的程序需要大量内存资源才能运行得更快 DllImport psapi dll public static extern bool EmptyWorkingSet IntPtr hPr
  • 在 Python 中建模时检测多共线性或具有线性组合的列:LinAlgError

    我正在为具有 34 个因变量的 logit 模型进行数据建模 并且它不断抛出奇异矩阵错误 如下所示 Traceback most recent call last File