Geonode logo
Geonode Team

Geonode Team

更新于:2026年10月7日

发布于:2026年9月2日

如何安装 scikit-learn(所有方法)

`pip install scikit-learn` 这就是答案。之所以经常有人提出这个问题,是因为导入名与包名不一致,而刻意输入该导入名会导致导入失败。 这种失败并非 bug。PyPI 上有一个占位包,其唯一作用就是引发错误并解释原因,它的存在出于安全考虑,这一点值得理解。 本指南涵盖了所有安装途径、当前版本的依赖项要求,以及安装后可能出现的错误。

我们在此事上的利益几乎为零:我们是 Geonode,主要销售代理服务,这与安装 Python 库毫无关系。 两者唯一的交集值得提一句——如果 pip install 在企业环境中出现卡顿,那通常是网络要求的代理服务器,而 pip 并不知道这一点,解决方法是 pip install --proxy 或设置标准环境变量。这种情况将在文末说明。本文中的其他内容均无需任何基础设施,也无需购买任何东西。

简要答案

python -m venv sklearn-env
source sklearn-env/bin/activate          # Windows: sklearn-env\Scripts\activate
pip install -U scikit-learn

或使用 conda:

conda create -n sklearn-env -c conda-forge scikit-learn
conda activate sklearn-env

官方文档 同时介绍了这两种方法,并特别强调了环境的重要性:“虚拟环境虽非必需,但强烈建议使用,以避免与其他包产生潜在冲突”。

文档中还补充了一条经常让用户措手不及的提醒:“每次启动新的终端会话时,在运行任何 Python 命令之前,你都应记得激活所选的环境。”许多“昨天还能用”的报告,其实都是因为在新终端中未激活环境所致。

为什么“pip install sklearn”会失败

这是该领域最常见的问题,而答案在于其刻意设计。

sklearn 是 导入 名称。scikit-learn 是 包 名称。在 pip 中输入前者会安装一个占位符,其唯一目的就是阻止你继续操作。

该占位符在 PyPI 上的描述非常明确:“已弃用的 sklearn 包,请改用 scikit-learn”,并建议“使用 pip install scikit-learn 而不是 pip install sklearn”,以及“在 pip 需求文件中将 sklearn 替换为 scikit-learn”。

其存在的原因与软件供应链相关,文档中对此有明确说明:

PyPI 上的 sklearn 包旨在防止恶意行为者使用 sklearn 包,因为 sklearn(导入名称)和 scikit-learn(项目名称)有时会被混用。

换句话说,维护者们抢先注册了这个容易混淆的名称,以防止被他人使用。考虑到有这么多人会误输这个名称,此举确实明智。

该包的文档中列出了三种边缘情况,若您遇到这些情况,值得了解:

  • “pip install sklearn==1.1.3会提示 1.1.3 版本不存在,这会让人感到困惑”——该占位包仅包含其自身的版本号。
  • “pip uninstall sklearn实际上并不会卸载 scikit-learn,之后你仍可执行 import sklearn”。
  • 若在 pip list 中同时存在这两个包,虽然会让人感到困惑,但若你误装了这两个包,这也是正常现象。

有一个应急方案——设置 SKLEARN_ALLOW_DEPRECATED_SKLEARN_PACKAGE_INSTALL=True ——它被描述为“最后的手段”。如果你发现自己不得不使用它,真正的解决方法几乎总是你的某个依赖项在其要求中列出了 sklearn。该占位符本身给出的建议值得遵循:“追踪哪些包使用 sklearn 而不是 scikit-learn,并将其报告给它们的 issue tracker”。

在您自己的文件中,请始终使用 scikit-learn。 在您的代码中,请始终使用 import sklearn。这种不一致是永久性的。

要求

根据当前版本的包元数据(2026年9月核查)。

scikit-learn 1.9.0 于2026年6月2日发布,要求使用 Python 3.11 或更高版本。

其运行时依赖项:

依赖项最低版本
NumPy1.24.1
SciPy1.10.0
joblib1.4.0
threadpoolctl3.5.0
narwhals2.0.1

关于该表格有两点说明。

narwhals是相对较新的依赖项,因此不会出现在旧版文档或针对早期版本编写的教程中。如果您是手动锁定依赖项而非让 pip 自动解决,这很可能是您最容易遗漏的一项。

Python 的最低要求在变化。 安装页面的依赖关系表反映了其所记录的版本,而最近几个版本中,对 Python 版本的要求有所提高。如果你使用的是较旧的 Python 版本,pip 会自动解决为较旧的 scikit-learn 版本,而不是报错——这通常没问题,但有时也是你读到某些功能缺失的原因。

还声明了一些可选组件,用于基准测试、文档、示例和测试,这些组件会引入 matplotlib、pandas、polars、pyarrow 等。使用该库时,你并不需要这些组件中的任何一个。

不使用虚拟环境进行安装

有时你确实希望进行全系统范围的安装,但会伴随一条警告。

文档针对 Linux 系统明确指出:“特别是在 Linux 系统下,不建议将 pip 包与发行版包管理器(如 apt、dnf、pacman 等)管理的包并行安装。”

原因在于,pip 和发行版的包管理器都认为自己拥有系统 Python 的 site-packages 目录中的文件,一旦双方产生冲突,就会导致 Python 安装出现难以排查的异常行为。 在较新的发行版中,pip 会直接报错“externally managed environment”(外部管理的环境),这是打包生态系统为防止此类情况而设的机制。

若遇到该错误,建议按以下优先级顺序处理:使用虚拟环境;使用 pipx 获取命令行工具;若发行版提供 python3-sklearn 包则使用该包;或者——在充分了解操作后果的前提下——使用 --break-system-packages 强制覆盖(该参数名称正是为了阻止用户这样做)。

在 macOS 和 Windows 上,压力较小,但建议依然适用。为每个项目创建一个虚拟环境只需十秒钟,却能避免一整类问题。

验证安装

文档中提供了相关命令,花三十秒运行一下是值得的。

python -m pip show scikit-learn    # version and install location
python -m pip freeze              # everything in the environment
python -c "import sklearn; sklearn.show_versions()"

使用 conda 时:

conda list scikit-learn
conda list

遇到问题时,请使用

sklearn.show_versions()

。该命令会输出 scikit-learn 的版本、Python 的版本和构建信息,以及底层数值计算栈的版本——这正是任何维护者首先会询问的信息。

当出现异常行为时,建议查看 pip show

中的 安装位置。如果它指向的并非您认为当前所在的环境,那么问题原因已然明了:import sklearn

会查找路径中出现的第一个安装,而这可能并非您刚刚安装的那个。

conda 与 pip

两者都能正常工作。选择哪一种主要取决于你是否将它们混合使用——但不应随意这样做。

**在以下情况下使用 conda:**当你已经拥有一个 conda 环境时;当你需要特定的编译型数值库时;或者当你所在的平台原本需要从源代码编译时。请按照官方指南的建议,优先选择 conda-forge 作为通道。

**在以下情况下使用 pip:**当你处于普通的 Python 虚拟环境中时,这涵盖了大多数项目。 Wheels 包已针对常见平台发布,因此无需编译,安装仅需几秒钟。

切勿在未深思熟虑的情况下将它们混用在一个环境中。 先用 conda 安装包,再用 pip 升级依赖项,会导致环境中的 conda 元数据不再准确反映实际情况,由此引发的问题将难以排查。 如果必须这样做,请先用 conda 安装所有可安装的软件包,然后仅对 conda 未包含的内容使用 pip。

有一个实用的判断方法:如果 which python 指向 conda 环境目录内部,则应使用 conda 管理该环境。

安装后的常见错误

成功安装后出现 ModuleNotFoundError: No module named 'sklearn' 错误。这几乎总是由于环境设置错误所致——例如使用了不同的终端、不同的解释器,或者笔记本内核指向了其他位置。 请通过以下命令检查:

import sys; print(sys.executable)

并将结果与实际安装的环境进行对比。特别是在 Jupyter 中,内核与终端环境是独立选择的,在其中一个环境中的安装对另一个环境没有任何影响。在笔记本中运行 %pip install scikit-learn 会将环境安装到内核中,这是可靠的解决方法。

ImportError 提示 NumPy 或二进制文件不兼容。 通常是编译版本不匹配,最常见的原因是单独升级了 NumPy。同时重新安装两者即可解决问题:

pip install --force-reinstall --no-cache-dir numpy scipy scikit-learn

尝试从源代码编译的构建。 这意味着没有轮子(wheel)与您的平台和 Python 版本匹配——通常是轮子发布前的最新 Python 版本,或者是不常见的架构。 等待几周或使用稍旧版本的 Python,比安装构建工具链要简单得多。

pip list 目录中同时存在 sklearn 和 scikit-learn。 您曾在某个时候安装过占位包。移除它是安全的:pip uninstall sklearn。正如其文档所述,此操作“实际上并不会卸载 scikit-learn”。

关于线程或threadpoolctl的警告。 scikit-learn 使用它来管理底层 BLAS 库的线程池。显式设置 OMP_NUM_THREADS 可以解决其中大部分问题,而且在容器环境中无论如何都值得这样做——在容器中,如果对库不加限制,它会不顾您的 CPU 限制,每台主机 CPU 都会创建一个线程。

为确保可重现性而锁定版本

安装只需进行一次;而下个月仍保持相同的安装环境才是更难的问题,因此值得在需要之前就做好准备。

将版本锁定在依赖文件中,而不是只记在脑子里。 如今直接运行pip install scikit-learn

,与六个月后运行相同的命令,会得到不同的版本;而且scikit-learn的API在小版本更新之间确实会发生变化——估计器会增加参数,默认值会发生变化,偶尔某些功能在废弃周期后会被移除:

scikit-learn==1.9.0
numpy==2.3.1
scipy==1.16.0

不仅要锁定scikit-learn,还要锁定数值计算栈。 该生态系统中大多数可重现性问题都源于 NumPy 或 SciPy 在已锁定的 scikit-learn 之下发生了变动,因为它们之间的编译接口比版本指定符所暗示的更为紧密。锁定树的顶层而让其余部分保持浮动,是最容易导致问题发生的配置。

从可运行的环境中生成文件,而不是手动编写:

pip freeze > requirements.txt

这样可以捕获包括传递依赖在内的所有内容,这正是应用程序所需要的。对于你要发布的库,请指定版本范围,并让用户自行解决——一个固定精确版本的库将无法与任何其他库组合使用。

将版本信息与结果一同记录下来。 模型输出取决于库的版本,保存的模型无法在任意版本间移植——解序列化由不同版本保存的估计器可能会触发警告、失败,或悄无声息地表现得不同。将 sklearn.show_versions()

的输出与任何持久化模型一同存储,就能将未来的谜团转化为可查阅的信息。

**并且要对将 pickled 模型作为存储格式持怀疑态度。**它们嵌入了创建它们时版本的类结构,这就是为什么它们在升级后会失效;而且它们在加载时会执行代码——因此,来自不可信来源的 pickle 文件相当于任意代码执行,而非单纯的数据文件。 对于任何长期存活的模型,请优先选择专为数据交换设计的格式,或者至少保留训练代码和数据,以便能够重建模型。

在企业代理服务器后安装

这是我们讨论的内容唯一相关的场景,且其表现症状非常明显。

如果 pip install

出现卡顿并最终超时,而不是立即因域名解析错误而失败,那么您的网络很可能需要一个 pip 未识别的代理服务器。

pip install --proxy http://user:password@proxy.example.com:9000 scikit-learn

或者通过环境变量设置,这同样适用于 conda 以及大多数其他工具:

export https_proxy=http://user:password@proxy.example.com:9000
export http_proxy=http://user:password@proxy.example.com:9000

这里通常会出现两个问题。

密码中的特殊字符需要进行百分比编码。 如果代理 URL 中包含 @

或 :

,系统会在错误的位置分割字符串,导致凭据正确却仍出现身份验证失败。

TLS 拦截会导致证书验证失败。 企业代理服务器经常会终止 TLS 连接,而 pip 会因此拒绝该证书,因为它是贵组织内部的证书颁发机构(CA)签发的,而非公共证书颁发机构。正确的解决方法是让 pip 指向贵组织的 CA 证书包:

pip config set global.cert /path/to/corporate-ca.pem

一个看似诱人的解决方法是使用 ``--trusted-host pypi.org`

`,这会禁用该主机的证书验证。在使用前请务必了解其风险:这意味着您将无条件接受从该服务器下载可执行代码时所呈现的任何证书。

对于 conda,相应的配置位于 ``.condarc`

下的 ``proxy_servers

和 ``ssl_verify

` 中。

大家还常问

如何安装 scikit-learn?在虚拟环境中运行 `

`pip install -U scikit-learn,或者使用 conda 运行 conda create -n sklearn-env -c conda-forge scikit-learn``。文档强烈建议使用虚拟环境,以避免与其他包发生冲突。

为什么 pip install sklearn 会失败?

因为 sklearn 是导入名称,而非包名。PyPI 上存在一个占位包,其唯一目的是引发错误并引导您进行正确安装——该包的维护者特意选用这个容易混淆的名称,以防止恶意用户利用该名称发布包。请改用 scikit-learn 进行安装。

sklearn 和 scikit-learn 有什么区别?

scikit-learn 是 pip 和 conda 中使用的项目及包名称;sklearn 则是你在 import 语句中使用的名称。这种名称不一致的情况是永久性的,这也是占位包存在的原因。

scikit-learn 需要哪个 Python 版本?

2026 年 6 月发布的 1.9.0 版本要求 Python 3.11 或更高版本。较早的 scikit-learn 版本支持较旧的 Python 版本,且 pip 会自动选择兼容的版本而非报错——这有时就是你读到的某些功能缺失的原因。

为什么安装后会出现 ModuleNotFoundError 错误?

几乎总是因为环境不匹配。请检查 import sys; print(sys.executable),并与您的安装路径进行对比。在 Jupyter 中,内核的环境与终端的环境是分离的——请在笔记本中使用 %pip install scikit-learn 命令,将包安装到内核中。

应该使用 pip 还是 conda?

在普通虚拟环境中使用 pip,这适用于大多数项目,且能在几秒内安装预编译的 wheel 包。若您已处于 conda 环境中,或需要特定的编译型数值库,则应使用 conda。请避免在同一个环境中混合使用这两种包管理器,因为它们对该环境的视图会产生分歧。

如何查看当前使用的 scikit-learn 版本?

运行 python -m pip show scikit-learn 可查看版本及安装路径;运行 python -c "import sklearn; sklearn.show_versions()" 可获取包含 Python 及数值计算库栈的完整报告——在报告问题时应提供该报告。

如何在代理环境下安装 scikit-learn?

请使用 pip install --proxy http://user:pass@host:port scikit-learn,或在环境中设置 http_proxy 和 https_proxy,以便 conda 及其他工具也能识别这些路径。密码中的特殊字符请使用百分比编码,并配置您所在组织的 CA 证书,而非禁用验证。

总结

安装过程本身只需一条命令。本主题中的几乎所有难点都源于两件事,而这两件事与 scikit-learn 本身的代码毫无关系。

第一点是名称。安装时需使用 scikit-learn,导入时需使用 sklearn,同时有一个占位包占据了这个容易混淆的名称,以此阻止你继续操作并解释原因。 这个占位包是供应链管理中良好规范的一个小体现,而它产生的错误正是发挥了应有的作用。

第二点是运行环境。许多安装失败的情况——例如在新的终端中模块消失、笔记本无法找到刚安装的模块、在无关的升级后出现导入错误——其实都是同一个环境问题以不同形式表现出来。 为每个项目创建一个虚拟环境并刻意激活它,几乎可以防止所有此类问题,而 print(sys.executable) 只需一行命令就能诊断出剩余的问题。

如果 pip 出现卡死而非报错,请先检查网络连接,再检查 Python 环境。如果 pip 不知道某个必需的代理,它会返回超时而非错误,这会让你在排查自身基础设施问题时感到困惑。