You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:17:33