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

使用Yellowbrick可视化分类报告时遇y值解码错误求助

问题:Yellowbrick分类报告可视化报错ModelError

我在跟着tsfresh的多分类示例做特征提取和分类,核心代码如下:

import matplotlib.pylab as plt
from tsfresh import extract_features, extract_relevant_features, select_features
from tsfresh.utilities.dataframe_functions import impute
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import pandas as pd
import numpy as np

from tsfresh.examples.har_dataset import download_har_dataset, load_har_dataset, load_har_classes
download_har_dataset()
df = load_har_dataset()
y = load_har_classes()
df["id"] = df.index
df = df.melt(id_vars="id", var_name="time").sort_values(["id", "time"]).reset_index(drop=True)
X = extract_features(df[df["id"] < 500], column_id="id", column_sort="time", impute_function=impute)
X_train, X_test, y_train, y_test = train_test_split(X, y[:500], test_size=.2)
classifier_full = DecisionTreeClassifier()
classifier_full.fit(X_train, y_train)

尝试用Yellowbrick可视化分类报告时,运行以下代码报错:

from sklearn.model_selection import TimeSeriesSplit
from sklearn.naive_bayes import GaussianNB
from yellowbrick.datasets import load_occupancy
from yellowbrick.classifier import classification_report
classes=np.unique(y)
classes=classes.tolist()
classes=list(map(str,classes))
visualizer = classification_report(GaussianNB(), X_train, y_train, X_test, y_test, classes=classes, support=True)

错误信息:

ModelError: could not decode [1 2 3 4 5 6] y values to [1 2 3 4 5 6] labels

错误原因

问题出在标签类型不匹配:你将classes强制转换为字符串类型,但y_train和y_test中的标签是整数类型。Yellowbrick在映射标签时,会尝试把真实的整数标签和传入的字符串类别做匹配,导致无法解码匹配。


解决方法

方法1:保持标签类型一致(不转字符串)

直接保留整数类型的类别标签,无需转换为字符串:

from sklearn.naive_bayes import GaussianNB
from yellowbrick.classifier import classification_report

classes = np.unique(y).tolist()  # 保留原始整数类型
visualizer = classification_report(
    GaussianNB(), 
    X_train, y_train, X_test, y_test, 
    classes=classes, 
    support=True
)
visualizer.show()

方法2:统一将标签转为字符串

如果需要显示字符串形式的类别名,需同时把y_train和y_test的标签也转为字符串,和classes类型对齐:

from sklearn.naive_bayes import GaussianNB
from yellowbrick.classifier import classification_report

classes = np.unique(y).tolist()
classes = list(map(str, classes))
# 同步转换训练/测试集标签为字符串
y_train_str = y_train.astype(str)
y_test_str = y_test.astype(str)

visualizer = classification_report(
    GaussianNB(), 
    X_train, y_train_str, X_test, y_test_str, 
    classes=classes, 
    support=True
)
visualizer.show()

扩展:自定义类别名称

如果需要更友好的类别名称(而非单纯转字符串),可直接定义字符串列表,只要和标签的映射关系正确即可:

classes = ["步行", "上楼", "下楼", "坐着", "站着", "躺着"]
y_train_str = y_train.astype(str)
y_test_str = y_test.astype(str)

visualizer = classification_report(
    GaussianNB(), 
    X_train, y_train_str, X_test, y_test_str, 
    classes=classes, 
    support=True
)
visualizer.show()

内容的提问来源于stack exchange,提问作者kolrocket

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:30:59