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

sklearn accuracy_score计算报错:Singleton数组无法作为有效集合求助

问题分析与解决方案

核心错误原因

  1. 标签处理逻辑混乱:

    • 你用pd.get_dummies对5类标签做了独热编码,但随后又通过y_train = y_train.iloc[:,0]只保留了第一列,把多分类任务硬生生改成了二分类,完全偏离原需求。
    • LogisticRegression默认是二分类模型,若要处理多分类,需要显式设置multi_class参数(比如multi_class='multinomial'),同时搭配合适的求解器(如solver='lbfgs')。
  2. 预测结果处理错误:

    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:00:26