1. 为什么load_boston会被移除?
如果你最近升级了scikit-learn到1.2或更高版本,可能会发现一个熟悉的load_boston()函数不见了。这个变化其实早有预兆——波士顿房价数据集因为涉及种族歧视的潜在风险,从2021年开始就被标记为"deprecated"(即将废弃)。作为替代方案,官方推荐使用fetch_openml来获取经过审查的数据集。
我在实际项目中第一次遇到这个问题时也很困惑。当时我正在给团队新人做机器学习入门培训,准备好的代码突然报错"AttributeError: module 'sklearn.datasets' has no attribute 'load_boston'",场面一度很尴尬。后来查文档才发现,这个变动背后有着更深层次的考量。
波士顿房价数据集包含一个名为"B"的特征,它表示"黑人比例"。有研究表明,这个特征在模型训练中可能被滥用,导致带有种族偏见的预测结果。虽然数据集本身是真实的,但在当今强调AI伦理的环境下,维护团队决定彻底移除这个潜在的风险源。
2. 方案一:降级scikit-learn版本
2.1 如何安全降级
最直接的解决方案就是把scikit-learn退回到1.1或更早版本。我测试过这个方法确实可行,但需要特别注意依赖关系。下面是具体操作步骤:
# 先卸载当前版本 pip uninstall scikit-learn -y # 安装指定版本 pip install scikit-learn==1.1.0不过要注意,如果你在用Jupyter Notebook,可能需要重启内核才能使变更生效。我在AWS SageMaker上测试时发现,单纯重启notebook还不够,必须完全重启内核才能加载正确的版本。
2.2 降级可能带来的问题
虽然降级简单,但我不建议长期使用这个方案。主要问题有:
- 安全风险:旧版本可能包含已知漏洞
- 功能缺失:无法使用新版本的特性和优化
- 依赖冲突:其他库可能依赖更高版本的scikit-learn
特别是当你使用PyTorch或TensorFlow时,它们对scikit-learn的版本有特定要求。我遇到过因为降级导致整个conda环境崩溃的情况,最后不得不重建环境。
3. 方案二:使用原始数据集文件
3.1 获取原始数据
波士顿房价数据仍然可以从原始来源获取。我推荐从Kaggle下载经过整理的CSV版本,质量更有保证。下载后可以这样加载:
import pandas as pd # 假设文件放在项目根目录 boston = pd.read_csv('boston_housing.csv') # 查看数据结构 print(boston.head())3.2 数据预处理要点
原始数据需要一些处理才能达到原来load_boston()的输出格式。这是我整理的标准处理流程:
from sklearn.model_selection import train_test_split # 分离特征和目标值 X = boston.drop('MEDV', axis=1) # MEDV是房价中位数 y = boston['MEDV'] # 划分训练测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # 标准化处理(可选) from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test)3.3 注意事项
使用本地文件时要注意路径问题。我建议使用pathlib来处理跨平台路径:
from pathlib import Path data_path = Path(__file__).parent / 'data' / 'boston_housing.csv' boston = pd.read_csv(data_path)这样无论在Windows、Mac还是Linux上都能正确找到文件位置。
4. 方案三:使用替代数据集
4.1 糖尿病数据集示例
scikit-learn自带的load_diabetes()是个不错的替代选择。虽然领域不同,但数据结构相似:
from sklearn.datasets import load_diabetes diabetes = load_diabetes() X, y = diabetes.data, diabetes.target # 特征说明 print(diabetes.DESCR)这个数据集有442个样本,10个特征,适合演示回归算法。我在教学时发现,用它来演示线性回归、决策树等算法的效果不比波士顿数据集差。
4.2 其他推荐数据集
除了糖尿病数据集,这些也是很好的练习选择:
- 加州房价数据集:
fetch_california_housing() - 葡萄酒质量数据集:可以从UCI机器学习库获取
- Ames房价数据集:比波士顿数据集更丰富
特别是加州房价数据集,它专门设计用来替代波士顿数据集:
from sklearn.datasets import fetch_california_housing housing = fetch_california_housing() X, y = housing.data, housing.target4.3 数据集选择建议
根据我的经验,选择替代数据集时要考虑:
- 特征数量:最好与原数据集相近
- 样本规模:足够演示算法又不至于太耗时
- 数据质量:缺失值少,噪声低
- 领域相关性:尽量选择目标领域相近的数据
5. 实际项目中的最佳实践
5.1 环境配置建议
为了避免版本问题,我现在的标准做法是用requirements.txt严格指定版本:
scikit-learn==1.1.0 # 如果需要load_boston pandas>=1.3.0 numpy>=1.21.0对于新项目,我建议直接使用替代数据集,这样就不用担心未来的兼容性问题。
5.2 数据加载封装技巧
为了方便团队使用,我会封装一个统一的数据加载函数:
def load_regression_data(name='diabetes'): """统一加载回归数据集""" if name == 'boston': # 实现从本地文件加载 pass elif name == 'diabetes': return load_diabetes() elif name == 'california': return fetch_california_housing() else: raise ValueError(f"未知数据集: {name}")5.3 教学场景特别处理
在培训新人时,我通常会准备两份材料:一份使用替代数据集的新版本代码,一份包含版本回退说明的旧版代码。这样无论学员用什么环境都能顺利跟进。
6. 迁移到新数据集的完整示例
让我们用一个完整的机器学习流程来演示如何迁移到加州房价数据集:
from sklearn.datasets import fetch_california_housing from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split # 加载数据 housing = fetch_california_housing() X, y = housing.data, housing.target # 划分数据集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # 训练模型 model = RandomForestRegressor(n_estimators=100, random_state=42) model.fit(X_train, y_train) # 评估 preds = model.predict(X_test) mse = mean_squared_error(y_test, preds) print(f"模型MSE: {mse:.4f}")这个示例展示了从数据加载到模型评估的完整流程,使用的新数据集完全兼容scikit-learn最新版本。我在多个实际项目中都采用这种模式,效果很好。
遇到load_boston被移除的情况不必慌张,这三种方案各有适用场景。对于需要严格复现旧实验的情况,降级版本是最直接的选择;如果是新项目,我强烈建议直接使用加州房价等替代数据集,这样既能避免伦理问题,又能保证代码的未来兼容性。