对wine.data数据集执行训练测试拆分时出现KeyError错误的技术求助
解决Wine数据集特征与标签提取的KeyError问题
嘿,我刚碰到过类似的问题!你这个KeyError的根源其实很简单——wine.data这个数据集本身没有自带列名,当你直接用pd.read_csv读取时,pandas会默认把数据的第一行当成列名,而不是真正的样本数据。这时候你用数字1到13去索引列,当然找不到对应的列名啦!
给你两种快速解决的方法:
方法一:指定列名读取(更清晰)
UCI Wine数据集的列名是有官方定义的,我们可以在读取时直接指定,这样后续操作更直观:
import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.neural_network import MLPClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.preprocessing import StandardScaler from sklearn.model_selection import cross_val_score # 定义Wine数据集的列名 column_names = [ 'Class', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium', 'Total phenols', 'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue', 'OD280/OD315 of diluted wines', 'Proline' ] # 读取数据时指定列名 wine = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data", names=column_names) # 提取特征和标签 X = wine.drop('Class', axis=1) # 移除标签列,剩余全部为特征 y = wine['Class']
方法二:告诉pandas没有表头(更简便)
如果你不想手动写列名,可以直接告诉pandas这个数据集没有表头,它会自动用0、1、2...作为列名:
# 读取时设置header=None,表示没有表头 wine = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data", header=None) # 现在你的原代码修改后就能正常运行了 X = wine[np.arange(1,14)] y = wine[0] # 或者更推荐用iloc的写法,可读性更强 X = wine.iloc[:, 1:] # 取所有行,第2列到最后一列(索引从0开始) y = wine.iloc[:, 0] # 取所有行的第1列
小建议
以后读取陌生数据集时,记得先跑一下wine.info()或者wine.head(),确认列名和数据结构是否符合预期,这样能快速定位这类表头相关的问题~
内容的提问来源于stack exchange,提问作者i_literally_hate_programming
相关产品推荐
相关产品推荐

