matplotlib绘制后出现Sklearn回归拟合错误

时间:2020-09-23 02:11:48

标签: python numpy matplotlib scikit-learn

已解决

问题似乎是Anaconda的已安装软件包与全局安装的pip软件包之间存在冲突(我安装了Python 3.8独立版)。我不是100%究竟是冲突的根源,但是在卸载Python 3.8和Anaconda(然后重新安装Anaconda和所需的所有软件包)之后,ValueError不再出现了。这使我相信,当我使用pip安装软件包时(偶然是全局),sklearn或它的依赖项已随pip全局安装,并且此软件包与导致ValueError的Anaconda版本冲突。


我正在用Python创建一个回归图,使用sklearn拟合数据,然后在JupyterLab中使用matplotlib进行绘制。问题在于,每隔一次运行该单元格我就会得到ValueError: illegal value in 4-th argument of internal None

因此,如果我第一次运行该单元格,那么一切都会按预期进行,那么第二次运行它会给出该错误(最后的完全错误,在代码下方)。请注意,仅当数据长度(x数组和y数组)的长度为9或更长(长度为8或更短)不会导致任何错误时,才会发生这种情况(至少在我这端)单元运行)。

理想情况下,我想通过在代码中添加一些内容或需要更新/降级软件包来解决此问题。在下面,我按照以下顺序列出了我的代码单元,错误消息,程序包版本(与anaconda一起安装)以及我尝试但不起作用的解决方案。

注意:如果我重新运行单元格或运行另一个基本相同但输入(x和y)不同的单元格,则ValueError仅在其他所有运行中发生(因此第一次运行正常运行)此后,将发生ValueError。

1)

import matplotlib.pyplot as plt
import numpy as np

from sklearn.linear_model import LinearRegression

data_length = 9  # ValueErrors occur at 9 or greater (8 or less doesn't produce any errors)

x = np.random.rand(data_length)
x_train = x[:, np.newaxis]

y = np.random.rand(data_length)

model = LinearRegression().fit(x_train, y)

plt.figure(figsize=(8, 6))
plt.title('Example Regression that Produces a ValueError Every Other Run')

plt.yticks(fontsize=14)
plt.xticks(fontsize=14)

plt.xlabel('M03A 28% SVR Activity (%)', fontsize=14)
plt.ylabel('Reference Activity (%)', fontsize=14)

ax = plt.gca()

color=next(ax._get_lines.prop_cycler)['color']

plt.plot(x, model.predict(x[:, np.newaxis]), label='Line of Best Fit', color=color)

plt.text(
    .05,
    .5,
    'y = {}x {} {}\n$R^2$ = {}'.format(
        round(model.coef_[0], 2), '-' if model.intercept_ < 0 else '+', abs(round(model.intercept_, 2)), round(model.score(x_train, y), 2)),
    bbox=dict(facecolor='white', edgecolor=color),
    color=color,
    transform=ax.transAxes,
)

color=next(ax._get_lines.prop_cycler)['color']

plt.plot(x, y, 'o', color=color, label='Data')

plt.xlim(0, np.max(x)*1.1)
plt.ylim(0, np.max(y)*1.1)

plt.legend()
plt.show()  # removing this makes no difference
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-40-c3d4bd1a69a4> in <module>
      6 y = np.random.rand(data_length)
      7 
----> 8 model = LinearRegression().fit(x_train, y)
      9 
     10 plt.figure(figsize=(8, 6))

~\Anaconda3\lib\site-packages\sklearn\linear_model\_base.py in fit(self, X, y, sample_weight)
    545         else:
    546             self.coef_, self._residues, self.rank_, self.singular_ = \
--> 547                 linalg.lstsq(X, y)
    548             self.coef_ = self.coef_.T
    549 

~\AppData\Roaming\Python\Python38\site-packages\scipy\linalg\basic.py in lstsq(a, b, cond, overwrite_a, overwrite_b, check_finite, lapack_driver)
   1223             raise LinAlgError("SVD did not converge in Linear Least Squares")
   1224         if info < 0:
-> 1225             raise ValueError('illegal value in %d-th argument of internal %s'
   1226                              % (-info, lapack_driver))
   1227         resids = np.asarray([], dtype=x.dtype)

ValueError: illegal value in 4-th argument of internal None
​```
matplotlib -> 3.3.1
numpy -> 1.19.1
scikit-learn -> 0.23.2
scipy -> 1.5.0

在另外一个stackoverflow page上,有一条评论提到了scipy安装失败的可能性,我尝试强制使用conda重新安装它,但没有任何效果。

另一个(在同一页面上)提到plt.show()的人,但是将其包括在代码单元中或从代码单元中排除对错误的发生没有影响。

1 个答案:

答案 0 :(得分:0)

我有完全相同的经验(使用PyCharm而没有Anaconda)-再次运行有问题的代码行,就可以了!


LinAlgError追溯(最近一次通话) 在 ----> 1 lm.fit(X_train,y_train)

〜\ pycharmprojects \ jupyternotebooks \ venv \ lib \ site-packages \ sklearn \ linear_model_base.py in fit(self,X,y,sample_weight) 545其他: 546 self.coef_,self。残基,self.rank ,self.singular_ =
-> 547 linalg.lstsq(X,y) 第548章 549

〜\ pycharmprojects \ jupyternotebooks \ venv \ lib \ site-packages \ scipy \ linalg \ basic.py in lstsq(a,b,cond,overwrite_a,overwrite_b,check_finite,lapack_driver) 1219 cond,False,False) 1220如果信息> 0: -> 1221提高LinAlgError(“ SVD未在线性最小二乘法中收敛”) 1222如果info <0: 1223提高ValueError('内部%s的第%d个参数的非法值'

LinAlgError:SVD没有在线性最小二乘中收敛