【问题标题】:imported sklearn but can't call sklearn.linear_model导入 sklearn 但无法调用 sklearn.linear_model
【发布时间】:2018-03-07 10:51:42
【问题描述】:

我已经安装了 sklearn 并且能够使用命令导入 sklearn 导入sklearn

但是我发现sklearn的子模块不能被sklearn.module_name调用,例如:

In [1]: import sklearn

In [2]: sklearn.linear_model
Traceback (most recent call last):

  File "<ipython-input-2-e64c575ed22e>", line 1, in <module>
    sklearn.linear_model

AttributeError: 'module' object has no attribute 'linear_model'

同时,我可以直接导入 sklearn.linear_model

In [3]: import sklearn.linear_model

In [4]: sklearn.linear_model
Out[4]: <module 'sklearn.linear_model' from 
'C:\Users\sng\AppData\Local\conda\conda\envs\python2\lib\site-
packages\sklearn\linear_model\__init__.pyc'>

上述不正确,例如在matplotlib中:

In [5]: import matplotlib

In [6]: matplotlib.pyplot
Out[6]: <module 'matplotlib.pyplot' from 
'C:\Users\sng\AppData\Local\conda\conda\envs\python2\lib\site-
packages\matplotlib\pyplot.pyc'>

我很好奇这里发生了什么?包 sklearn 与其他包不同吗?我的 IDE 是用于 python 2.7 的 Spyder

【问题讨论】:

  • 尝试from sklearn import * 然后sklearn.linear_model.LinearRegression()

标签: python scikit-learn spyder


【解决方案1】:

没有。只是当您调用 import matplotlib 时,它会在内部导入 pyplot,因此您可以按原样使用它,而无需专门导入 pyplot

看看你执行import matplotlib时导入的the source of the file。它有一些类似的行:

...
...
from matplotlib.cbook import (
    _backports, mplDeprecation, dedent, get_label, sanitize_sequence)
from matplotlib.compat import subprocess
from matplotlib.rcsetup import defaultParams, validate_backend, cycler
...
...

其中一些来自cbookcompatrcsetup 的导入我肯定又会从某个地方的 pyplot 导入pyplot 或类。

这不是 sklearn 的情况。看sklearn的__init__.py的出处](https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/init.py#L15)

它只有以下导入:

import sys
import re
import warnings
import os
from contextlib import contextmanager as _contextmanager
import logging

这绝不会使用linear_model,因此会出现错误。

您可以通过像这样导入相关包来验证此行为:

import sklearn
import sklearn.svm

现在当你执行sklearn.linear_model,你会得到正确的输出:

<module 'sklearn.linear_model' from '/usr/local/lib/python2.7/dist-packages/sklearn/linear_model/__init__.pyc'>

因为,这一次,至少定义 in svm init 的导入在某处使用(导入)某些类 linear_model。因此系统可以使用linear_model。

【讨论】:

  • 这有助于我理解问题,但可以进行一些编辑以提高答案的可读性。
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 2018-09-10
  • 1970-01-01
  • 2020-04-19
  • 2020-04-11
  • 2019-09-30
  • 1970-01-01
  • 2022-10-15
相关资源
最近更新 更多