基于DecisionTreeClassifier的文本情感预测特征数不匹配报错解决咨询
解决文本情感预测中的特征不匹配错误
问题根源
你遇到的错误核心有两个:
- 用错了文本特征编码工具:
LabelEncoder是用来处理分类标签(比如你的label列)的,不能用来处理文本内容。它会把每个不同的文本当成一个独立类别,直接转成数字,导致你的encoded_X是一个一维数组,每个元素对应一个文本的类别编码,而不是模型需要的特征向量。 - 训练数据的形状错误:
model.fit([encoded_X],[encoded_y])这种写法把一维数组包装成了二维数组,导致模型误以为每个样本有416809个特征(也就是你的总样本数),而预测时输入的只有1个特征,自然不匹配。
解决步骤
- 用文本特征提取工具替换LabelEncoder:使用
sklearn的CountVectorizer或TfidfVectorizer,它们能把文本转换成模型可接受的数值特征矩阵(每个样本对应一组词频/权重特征)。 - 修正训练数据的输入形状:直接传入vectorizer处理后的特征矩阵和标签数组,不需要额外包装成列表。
- 统一预测时的文本编码:必须用训练时的同一个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
相关产品推荐
相关产品推荐

