Python 3.11 机器学习环境配置:规避 sklearn 1.2+ 数据集移除的 2 种策略

Python 3.11 机器学习环境配置:规避 sklearn 1.2+ 数据集移除的 2 种策略

当你在 Python 3.11 环境中使用最新版 scikit-learn 进行机器学习项目开发时,可能会遇到一个令人困惑的问题:原本熟悉的load_boston()函数突然无法使用了。这个变化并非偶然,而是 scikit-learn 维护团队基于伦理考量做出的决定。本文将为你提供两种根本性解决方案,帮助你在保持 Python 3.11 环境的同时,继续开展机器学习项目。

1. 问题背景与现状分析

波士顿房价数据集自 1978 年发布以来,一直是机器学习入门和教学的热门选择。这个包含 506 个样本、13 个特征的数据集,因其适中的规模和清晰的回归问题特性,成为许多数据科学家的"Hello World"项目。

然而,在 scikit-learn 1.2 版本中,这个数据集被正式移除。主要原因在于数据集包含了一个名为"B"的变量,该变量被设计用来反映社区的种族构成。研究表明,这个变量的设计存在伦理问题,可能强化有害的刻板印象。

关键时间节点:

  • 1.0 版本:标记为 deprecated(不推荐使用)
  • 1.2 版本:完全移除该数据集

如果你正在使用 Python 3.11 并安装了最新版 scikit-learn,尝试导入该数据集时会看到如下错误:

ImportError: `load_boston` has been removed from scikit-learn since version 1.2.

2. 解决方案一:降级安装 scikit-learn 1.1.x

最直接的解决方案是将 scikit-learn 降级到 1.1.x 版本,这是最后一个包含波士顿数据集的稳定版本系列。

2.1 使用 pip 进行版本降级

pip uninstall scikit-learn -y pip install scikit-learn==1.1.3

验证安装:

import sklearn print(sklearn.__version__) # 应输出 1.1.3

2.2 使用 conda 创建独立环境

对于更复杂的项目,建议使用 conda 创建独立环境:

conda create -n sklearn_legacy python=3.11 scikit-learn=1.1.3 conda activate sklearn_legacy

环境配置检查清单:

  • Python 版本:3.11.x
  • scikit-learn 版本:1.1.3
  • 其他依赖库版本兼容性

2.3 版本锁定策略

为防止意外升级,建议在项目中添加版本约束文件:

requirements.txt 示例:

scikit-learn==1.1.3 numpy>=1.21.0 pandas>=1.3.0

3. 解决方案二:使用替代数据集

scikit-learn 官方推荐使用加州房价数据集作为替代,这是一个更现代、更全面的数据集,且不存在伦理问题。

3.1 加载加州房价数据集

from sklearn.datasets import fetch_california_housing california = fetch_california_housing() print(california.DESCR) # 查看数据集描述

数据集对比:

特性波士顿房价数据集加州房价数据集
样本数50620,640
特征数138
目标变量房屋中位价(千美元)房屋中位价(十万美元)
数据收集时间1978年1990年
地理范围波士顿地区整个加州

3.2 手动获取原始波士顿数据

如果必须使用波士顿数据集,可以从原始来源获取:

import pandas as pd import numpy as np data_url = "http://lib.stat.cmu.edu/datasets/boston" raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None) data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]]) target = raw_df.values[1::2, 2]

4. 两种策略的对比与选择建议

策略对比表:

考量因素降级方案替代数据集方案
代码改动量最小中等
长期维护性
伦理合规性有风险完全合规
数据新鲜度旧数据相对更新
教学适用性传统案例现代案例

选择建议:

  • 教学演示:优先考虑替代数据集
  • 历史项目维护:可短期使用降级方案
  • 新项目开发:强烈建议使用替代数据集

5. 高级技巧:构建可复用的数据加载模块

无论选择哪种方案,都可以将数据加载逻辑封装成独立模块,提高代码的可维护性:

# data_loader.py import numpy as np import pandas as pd from sklearn.datasets import fetch_california_housing def load_housing_data(dataset='california'): """统一的数据加载接口""" if dataset == 'california': return fetch_california_housing() elif dataset == 'boston': data_url = "http://lib.stat.cmu.edu/datasets/boston" raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None) data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]]) target = raw_df.values[1::2, 2] return {'data': data, 'target': target} else: raise ValueError("不支持的dataset参数")

6. 常见问题排查指南

问题1:版本冲突

ERROR: Cannot uninstall 'scikit-learn'. It is a distutils installed project...

解决方案:

pip install --ignore-installed scikit-learn==1.1.3

问题2:Python 3.11 兼容性scikit-learn 1.1.x 完全支持 Python 3.11,如遇问题可尝试:

python -m pip install --upgrade pip setuptools wheel

问题3:其他依赖冲突使用 conda 可以更好地解决依赖关系:

conda install scikit-learn=1.1.3

在实际项目中,我倾向于使用加州房价数据集作为替代。它不仅避免了伦理问题,还提供了更大的样本量和更丰富的地理多样性,这对模型训练和评估都更为有利。