训练逻辑 Regression 遇样本数不匹配及表头识别问题求助
解决逻辑回归训练中的数据集拆分错误
问题根源
你遇到的两个问题本质上是同一个原因:错误地将多列特征定义成了元组,而非Pandas DataFrame。让我逐一拆解并修复:
1. 为什么TrainData.head()报错无表头?
你定义TrainData的方式是:
TrainData= Dataset["Watermark"],Dataset["Micro-print"],Dataset["Ultraviolet fields"],Dataset["Magnetic fields"],Dataset["Diameter"]
这会创建一个元组(tuple),里面每个元素是单独的Series。而元组并没有head()方法,自然会提示“无表头”(实际是没有这个属性)。正确的做法是用方括号包裹列名列表,得到一个完整的DataFrame:
TrainData = Dataset[["Watermark", "Micro-print", "Ultraviolet fields", "Magnetic fields", "Diameter"]]
2. 为什么train_test_split报样本数不一致?
当你把元组传给train_test_split时,函数会把元组里的每个Series当成独立的输入(比如这里是5个Series,但报错显示[4,25001]可能是代码笔误漏了一个列),而你的TestData是包含25001个样本的Series,两者维度完全不匹配,所以抛出ValueError。
只有当TrainData是一个特征DataFrame(每一行是一个样本,每一列是一个特征),TestData是对应的标签Series时,train_test_split才能正确识别样本数量并拆分。
修正后的完整代码
# 清理重复导入,移除无用的导入 import numpy as np import pandas as pd from sklearn.linear_model import LogisticRegression from sklearn.metrics import confusion_matrix from sklearn.model_selection import train_test_split # 加载数据集并指定列名 colnames = ["Watermark", "Micro-print", "Ultraviolet fields", "Magnetic fields", "Diameter", "Target"] Dataset = pd.read_csv("/Users/David/Documents/Python Assignment2/data-banknote.csv", sep=',', names=colnames) Dataset.index = np.arange(1, len(Dataset)+1) # 正确定义特征集和标签集 # 特征集:选取前5列,用方括号包裹列名列表得到DataFrame TrainData = Dataset[["Watermark", "Micro-print", "Ultraviolet fields", "Magnetic fields", "Diameter"]] # 标签集:选取Target列得到Series TestData = Dataset["Target"] # 现在可以正常调用head()查看数据 print("特征集前5行:") print(TrainData.head()) print("\n标签集前5行:") print(TestData.head()) # 验证样本数一致(可选,但能提前排查问题) print(f"\n特征集样本数:{TrainData.shape[0]},标签集样本数:{TestData.shape[0]}") # 正确拆分数据集 X_train, X_test, y_train, y_test = train_test_split(TrainData, TestData, test_size=0.3, random_state=0) # 后续可以正常训练逻辑回归模型 model = LogisticRegression() model.fit(X_train, y_train) # 评估模型 y_pred = model.predict(X_test) cm = confusion_matrix(y_test, y_pred) print("\n混淆矩阵:") print(cm)
额外小提示
- 导入模块时避免重复(比如你重复导入了
LogisticRegression和confusion_matrix),同时移除无用的导入(比如from sklearn.datasets import data,你并没有用到这个模块)。 - 变量名建议更直观:比如把
TrainData改成X,TestData改成y,这样更符合机器学习的通用命名习惯,避免和拆分后的训练集/测试集混淆。
内容的提问来源于stack exchange,提问作者David9292
相关产品推荐
相关产品推荐

