导入sklearn但无法调用sklearn.linear_model

时间:2017-09-26 09:27:29

标签: python scikit-learn spyder

我安装了sklearn,并且能够使用该命令导入sklearn     import sklearn

但是,我发现sklearn.module_name无法调用sklearn的子模块,例如:

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是Spyder for python 2.7

1 个答案:

答案 0 :(得分:2)

没有。只是当你调用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可供系统使用。