sklearn accuracy_score计算报错:Singleton数组无法作为有效集合求助
问题分析与解决方案
核心错误原因
标签处理逻辑混乱:
- 你用
pd.get_dummies对5类标签做了独热编码,但随后又通过y_train = y_train.iloc[:,0]只保留了第一列,把多分类任务硬生生改成了二分类,完全偏离原需求。 LogisticRegression默认是二分类模型,若要处理多分类,需要显式设置multi_class参数(比如multi_class='multinomial'),同时搭配合适的求解器(如solver='lbfgs')。
- 你用
预测结果处理错误:
model.predict()返回的是每个样本的直接类别预测值(整数形式),不是概率分布矩阵,此时用np.argmax(y_train_pred, axis=0)会把整个预测数组的最大值索引提取出来,得到一个单一数值(也就是报错里的Singleton array),无法和原标签序列做准确率计算。
修正后的完整代码
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, LabelEncoder from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 加载数据 dataset = pd.read_csv('tabular_data/clean_tabular_data.csv') features, label = load_airbnb(dataset, 'Category') label_series = dataset['Category'] # 用LabelEncoder把字符串标签转成整数(更适合多分类模型训练) le = LabelEncoder() label_encoded = le.fit_transform(label_series) # 划分数据集:先分训练+测试,再从测试里拆分验证集 X_train, X_test, y_train, y_test = train_test_split(features, label_encoded, test_size=0.3, random_state=42) X_test, X_validation, y_test, y_validation = train_test_split(X_test, y_test, test_size=0.5, random_state=42) # 归一化特征(仅用训练集拟合scaler) scaler = StandardScaler() scaler.fit(X_train) X_train_scaled = scaler.transform(X_train) X_validation_scaled = scaler.transform(X_validation) X_test_scaled = scaler.transform(X_test) # 初始化多分类逻辑回归模型 model = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=1000) model.fit(X_train_scaled, y_train) # 直接获取预测类别,无需argmax y_train_pred = model.predict(X_train_scaled) y_validation_pred = model.predict(X_validation_scaled) y_test_pred = model.predict(X_test_scaled) # 计算准确率 train_acc = accuracy_score(y_train, y_train_pred) test_acc = accuracy_score(y_test, y_test_pred) validation_acc = accuracy_score(y_validation, y_validation_pred) print(f"训练集准确率: {train_acc:.4f}") print(f"验证集准确率: {validation_acc:.4f}") print(f"测试集准确率: {test_acc:.4f}")
关键修正点说明
- 标签编码方式:用
LabelEncoder替代pd.get_dummies,把字符串标签转为0-4的整数,更符合多分类模型的输入要求。 - 模型参数设置:添加
multi_class='multinomial'和solver='lbfgs',让逻辑回归支持多分类任务,同时增大max_iter确保模型收敛。 - 预测结果处理:去掉多余的
np.argmax调用,直接使用predict()返回的类别标签计算准确率。 - 添加random_state:让数据集划分结果可复现,方便调试。
内容的提问来源于stack exchange,提问作者Lewis-010
相关产品推荐
相关产品推荐

