Scikit-learn 1.2+用户必看:波士顿数据集替代方案与完整数据加载指南
如果你最近升级到scikit-learn 1.2或更高版本,可能会惊讶地发现load_boston()函数突然消失了。这个经典的机器学习数据集曾是无数教程和实验的起点,现在却成了ImportError的源头。别担心,这不是终点,而是一个重新思考数据伦理和探索替代方案的机会。
1. 为什么波士顿数据集被移除?
波士顿房价数据集自1978年发布以来,一直是机器学习入门的标准教材。但在2021年,研究者们重新审视了这个数据集,发现其中包含的"B"属性(黑人比例)存在严重的伦理问题。这个特征的计算方式不仅带有歧视性,而且可能被误用来强化偏见模型。
scikit-learn团队在1.2版本中移除了该数据集,这反映了机器学习社区对数据伦理日益增长的重视。作为负责任的开发者,我们应该理解这一决定背后的考量:
- 数据伦理意识提升:避免使用可能强化社会偏见的数据
- 模型可靠性:有问题的特征可能影响预测结果的公正性
- 行业最佳实践:主流框架都在逐步淘汰有争议的数据集
提示:虽然原始数据集已被移除,但出于教学和研究目的,你仍然可以通过其他渠道获取类似数据,只是需要更加谨慎地使用。
2. 官方推荐的替代数据源
2.1 从原始来源获取数据
最直接的替代方案是从数据原始存储库获取。卡内基梅隆大学统计库仍然托管着这个数据集:
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=r"\s+", skiprows=22, header=None)这个URL提供了原始数据文件,但需要注意几点:
- 数据格式特殊,需要跳过前22行说明文字
- 数据被分成两行一组存储,需要特殊处理
- 没有列名,需要手动添加
2.2 UCI机器学习仓库
加州大学欧文分校的机器学习仓库也托管了这个数据集的副本:
uci_url = "https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data" df = pd.read_csv(uci_url, delim_whitespace=True, header=None)UCI版本的优势在于:
- 长期稳定的数据托管
- 配套的完整数据集描述
- 社区维护的更新记录
2.3 数据加载与预处理完整代码
无论选择哪个来源,都需要进行适当的数据重组:
# 特征数据 features = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]]) # 目标值(房价中位数) target = raw_df.values[1::2, 2] # 添加列名 column_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT' ]3. 数据集特征详解与使用建议
理解每个特征的含义对于正确使用这个数据集至关重要。以下是完整的特征描述:
| 特征名 | 描述 | 使用建议 |
|---|---|---|
| CRIM | 城镇人均犯罪率 | 注意数值范围差异可能影响模型 |
| ZN | 住宅用地比例 | 与房价可能有非线性关系 |
| INDUS | 非零售商业用地比例 | 考虑与其他特征的交互作用 |
| CHAS | 是否临河 | 二元变量,需要特殊编码 |
| NOX | 氮氧化物浓度 | 环境指标,可能有地域偏差 |
| RM | 平均房间数 | 通常与房价正相关 |
| AGE | 1940年前建造的自住单位比例 | 考虑非线性转换 |
| DIS | 与就业中心的距离 | 可能需要地理加权 |
| RAD | 高速公路可达性指数 | 分类变量,考虑one-hot编码 |
| TAX | 财产税率 | 注意与其他经济特征的相关性 |
| PTRATIO | 学生-教师比例 | 教育质量指标 |
| B | 黑人比例相关统计 | 建议移除或谨慎使用 |
| LSTAT | 低收入人群比例 | 社会经济地位指标 |
注意:在实际建模时,强烈建议排除"B"特征,或至少充分理解其计算方式可能带来的伦理问题。
4. 替代数据集推荐
如果你正在寻找更现代、更少伦理问题的替代方案,考虑以下数据集:
4.1 加州房价数据集
scikit-learn内置的fetch_california_housing()是一个优秀的替代选择:
from sklearn.datasets import fetch_california_housing california = fetch_california_housing() print(california.DESCR) # 查看完整描述优势包括:
- 更大样本量(20,640条记录)
- 更现代的住房数据(1990年)
- 明确的数据收集方法和来源
- 无争议的人口统计特征
4.2 其他优质回归数据集
| 数据集 | 加载方式 | 样本数 | 特征数 | 适用场景 |
|---|---|---|---|---|
| 糖尿病进展 | load_diabetes() | 442 | 10 | 医学研究 |
| 物理性能 | fetch_olivetti_faces() | 400 | 4096 | 图像回归 |
| Ames住房 | 需从UCI下载 | 2930 | 80 | 房价预测 |
5. 迁移现有代码的最佳实践
如果你有大量基于波士顿数据集的现有代码,以下是平滑迁移的建议:
- 创建兼容性包装函数:
def load_boston_compat(): """兼容旧代码的波士顿数据集加载函数""" data_url = "http://lib.stat.cmu.edu/datasets/boston" raw_df = pd.read_csv(data_url, sep=r"\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] feature_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT'] return data, target, feature_names- 特征工程调整:
考虑移除或转换有问题的特征:
# 移除B特征 data = np.delete(data, 11, axis=1) # B是第11列 feature_names.pop(11)- 模型评估对比:
在切换到新数据集后,重新评估模型性能:
from sklearn.linear_model import LinearRegression from sklearn.model_selection import cross_val_score model = LinearRegression() scores = cross_val_score(model, data, target, cv=5) print(f"平均R²分数: {scores.mean():.3f}")6. 教学与研究中的伦理考量
当在学术或教学环境中使用这类数据集时,建议:
- 明确讨论数据局限性:在课程或论文中专门说明数据集的伦理问题
- 探索偏见检测方法:教授学生如何识别和缓解数据偏见
- 强调负责任AI:将数据伦理作为机器学习教育的重要组成部分
- 使用替代案例:考虑使用无争议的数据集作为主要教学材料
一些有用的资源:
- 《AI Now Institute》的算法问责报告
- FAT*会议(公平、问责和透明度)的研究成果
- ACM的算法影响评估指南
在实验室环境中,可以这样引导学生思考:
# 检查特征与目标的相关性 correlations = pd.DataFrame(data).corrwith(pd.Series(target)) print(correlations.sort_values())讨论问题可能包括:
- 哪些特征可能反映或强化社会偏见?
- 如何设计避免歧视的预测模型?
- 在模型部署前应该进行哪些公平性测试?
迁移到scikit-learn 1.2+后,虽然需要调整一些习惯,但这也是一个提升数据科学实践质量的契机。在我自己的教学工作中,发现使用加州房价数据集不仅避免了伦理问题,还因为其更大的规模和更丰富的特征带来了更好的教学效果。