You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

statsmodels逻辑回归报错LinAlgError: Singular matrix求解决

解决逻辑回归拟合时的「Singular matrix」错误

嘿,我来帮你搞定这个头疼的错误!这个numpy.linalg.linalg.LinAlgError: Singular matrix本质是说你的特征矩阵不可逆——简单讲就是特征之间存在完全线性相关的情况,statsmodels在拟合逻辑回归时需要计算矩阵的逆,碰到这种不可逆的矩阵就直接报错了。结合你用的乳腺癌数据集和代码,我给你拆解原因和可行的解决方案:

为啥会出现这个问题?

乳腺癌数据集里藏着不少高度相关的特征,比如mean radius(平均半径)和mean perimeter(平均周长),这俩本质就是线性关系(周长=2π×半径),还有类似的面积和半径的关系。这些高度/完全相关的特征会让你的特征矩阵列秩不够,直接导致矩阵奇异。另外虽然你加的常数项本身没问题,但如果特征里已经有冗余的常数型特征(不过这个数据集里没有),也会雪上加霜。

具体怎么解决?

1. 手动移除高度相关的特征

先找出那些相关度过高的特征删掉,这是最直接的办法:

import pandas as pd
import numpy as np

# 把训练集特征转成DataFrame,方便查看和计算相关系数
X_train_df = pd.DataFrame(X_train, columns=np.append(['const'], data.feature_names))
corr_matrix = X_train_df.corr().abs()

# 生成上三角矩阵,避免重复计算两两特征的相关性
upper_triangle = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))

# 筛选出相关系数超过0.95的特征,把它们列出来准备删除
high_corr_features = [col for col in upper_triangle.columns if any(upper_triangle[col] > 0.95)]
X_train_clean = X_train_df.drop(high_corr_features, axis=1)
X_test_clean = pd.DataFrame(X_test, columns=np.append(['const'], data.feature_names)).drop(high_corr_features, axis=1)

# 现在再拟合模型就没问题了
model = sm.Logit(y_train, X_train_clean)
result = model.fit()

2. 用带正则化的逻辑回归

statsmodels的原生Logit没有内置正则化,但你可以换用sklearn的逻辑回归——它默认带L2正则化,能自动处理共线性问题:

from sklearn.linear_model import LogisticRegression

# sklearn不需要手动加常数项,所以把之前加的const列去掉
model = LogisticRegression(max_iter=1000)  # 迭代次数设高一点,确保收敛
model.fit(X_train[:, 1:], y_train)

3. 做特征降维(比如PCA)

用PCA把高维的冗余特征压缩成低维的不相关特征,从根源上消除共线性:

from sklearn.decomposition import PCA

# 保留95%的方差,自动确定降维后的维度
pca = PCA(n_components=0.95)
# 去掉手动加的const列,PCA会自己处理特征
X_train_pca = pca.fit_transform(X_train[:, 1:])
X_test_pca = pca.transform(X_test[:, 1:])

# 再加回常数项给statsmodels用
X_train_pca_const = sm.add_constant(X_train_pca)
X_test_pca_const = sm.add_constant(X_test_pca)

# 拟合模型
model = sm.Logit(y_train, X_train_pca_const)
result = model.fit()

额外小技巧

拟合前可以先检查特征矩阵的秩:print(np.linalg.matrix_rank(X_train)),如果这个数小于特征的总数,就说明肯定存在线性相关的特征,提前排查能少走弯路。

内容的提问来源于stack exchange,提问作者Oliver Angelil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:38:57