使用ucimlrepo获取UCI Adult数据集时遇TypeError错误求助
解决UCIMLRepo获取Adult数据集的TypeError问题
问题重现
尝试使用UCIMLRepo库获取Adult数据集,执行官方提供的代码:
pip install ucimlrepo from ucimlrepo import fetch_ucirepo # fetch dataset adult = fetch_ucirepo(id=2) # data (as pandas dataframes) X = adult.data.features y = adult.data.targets # metadata print(adult.metadata) # variable information print(adult.variables)
触发以下TypeError:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) /Users/.../playground.ipynb Cell 3 line 4 1 from ucimlrepo import fetch_ucirepo 3 # fetch the adult dataset ----> 4 adult = fetch_ucirepo(id=2) 6 # convert the dataset to a Pandas DataFrame 7 df = pd.DataFrame(adult.data.features, columns=adult.variables.names, missing_values=["?"]) File ~/anaconda3/envs/myEnv/lib/python3.11/site-packages/ucimlrepo/fetch.py:148, in fetch_ucirepo(name, id) 142 # alternative usage?: 143 # variables.age.role or variables.slope.description 144 # print(variables) -> json-like dict with keys [name] -> details 145 146 # make nested metadata fields accessible via dot notation 147 metadata['additional_info'] = dotdict(metadata['additional_info']) --> 148 metadata['intro_paper'] = dotdict(metadata['intro_paper']) 150 # construct result object 151 result = { 152 'data': dotdict(data), 153 'metadata': dotdict(metadata), 154 'variables': variables 155 } TypeError: 'NoneType' object is not iterable
不想手动下载解析数据集,希望找到简洁解决办法。
解决方案
方案1:升级UCIMLRepo库
这个错误是旧版本库的bug(处理intro_paper字段为None时未做判断),升级到最新版本即可修复:
pip install --upgrade ucimlrepo
升级后重新运行原代码,应该能正常获取数据集。
方案2:直接用Pandas加载原始数据(无需额外解析)
如果升级后仍有问题,可以直接通过Pandas从UCI的原始数据链接加载,提前整理好列名,自动处理缺失值:
import pandas as pd # 定义Adult数据集的完整列名 columns = [ 'age', 'workclass', 'fnlwgt', 'education', 'education-num', 'marital-status', 'occupation', 'relationship', 'race', 'sex', 'capital-gain', 'capital-loss', 'hours-per-week', 'native-country', 'income' ] # 加载训练集和测试集,合并为完整数据集 train_data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data', names=columns, na_values='?') test_data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test', names=columns, na_values='?', skiprows=1) # 跳过测试集第一行的说明 full_dataset = pd.concat([train_data, test_data], ignore_index=True) # 分离特征与目标变量 X = full_dataset.drop('income', axis=1) y = full_dataset['income'] # 查看数据样例 print(full_dataset.head())
这种方式无需手动下载文件或解析adult.names,一步完成数据加载和预处理。
内容的提问来源于stack exchange,提问作者ArieAI
相关产品推荐
相关产品推荐

