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

基于DecisionTreeClassifier的文本情感预测特征数不匹配报错解决咨询

解决文本情感预测中的特征不匹配错误

问题根源

你遇到的错误核心有两个:

  1. 用错了文本特征编码工具:LabelEncoder是用来处理分类标签(比如你的label列)的,不能用来处理文本内容。它会把每个不同的文本当成一个独立类别,直接转成数字,导致你的encoded_X是一个一维数组,每个元素对应一个文本的类别编码,而不是模型需要的特征向量。
  2. 训练数据的形状错误:model.fit([encoded_X],[encoded_y])这种写法把一维数组包装成了二维数组,导致模型误以为每个样本有416809个特征(也就是你的总样本数),而预测时输入的只有1个特征,自然不匹配。

解决步骤

  1. 用文本特征提取工具替换LabelEncoder:使用sklearn的CountVectorizer或TfidfVectorizer,它们能把文本转换成模型可接受的数值特征矩阵(每个样本对应一组词频/权重特征)。
  2. 修正训练数据的输入形状:直接传入vectorizer处理后的特征矩阵和标签数组,不需要额外包装成列表。
  3. 统一预测时的文本编码:必须用训练时的同一个vectorizer来转换输入的新文本,保证特征维度一致。

修正后的完整代码

print("Loading modules...")
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import LabelEncoder
# 导入文本特征提取工具
from sklearn.feature_extraction.text import TfidfVectorizer

print("Loading data...")
data = pd.read_csv('data/emotions.csv')
X = data["text"]
y = data["label"]

# 处理标签(LabelEncoder这里用对了)
le = LabelEncoder()
encoded_y = le.fit_transform(y)

# 处理文本特征:用TF-IDF转成特征矩阵
vectorizer = TfidfVectorizer()
# fit_transform同时完成拟合和转换,得到(n_samples, n_features)的矩阵
encoded_X = vectorizer.fit_transform(X)

print("Training model...")
model = DecisionTreeClassifier()
# 直接传入特征矩阵和编码后的标签,不需要额外包装
model.fit(encoded_X, encoded_y)

prompt = input("Enter a prompt: ")
# 用同一个vectorizer转换输入文本,注意用transform而不是fit_transform
encoded_prompt = vectorizer.transform([prompt])

# 预测并输出结果
predictions = model.predict(encoded_prompt)
print(f"预测情感标签:{predictions[0]}")

额外说明

  • 如果你想尝试更简单的词频统计,可以把TfidfVectorizer换成CountVectorizer,用法完全一致。
  • 决策树对于文本分类的效果通常不如一些专门的模型(比如朴素贝叶斯、SVM或者深度学习模型),如果后续效果不好,可以考虑更换模型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:23:16