如何用Matplotlib绘制不同n-gram下Logistic Regression模型的准确率曲线
解决Matplotlib绘制n-gram准确率曲线的问题
你的空白图表问题根源在于:当前代码只计算了单个准确率值,而plt.plot()需要至少两个数据点才能生成曲线。要实现按n-gram分组展示准确率的需求,你需要先收集1到5每个n-gram对应的准确率数据,再进行绘图。
步骤1:收集各n-gram的准确率数据
首先,循环遍历n=1到5,为每个n生成对应的TF-IDF特征,训练模型并通过K折交叉验证得到该n-gram下的平均准确率,将这些值存入列表:
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score import matplotlib.pyplot as plt # 假设你的文本数据和标签已准备好,存放在X和y中 n_grams = [1, 2, 3, 4, 5] accuracy_scores = [] for n in n_grams: # 生成对应n-gram的TF-IDF特征 tfidf = TfidfVectorizer(ngram_range=(n, n)) X_tfidf = tfidf.fit_transform(X) # 训练模型并做K折交叉验证(以5折为例) model = LogisticRegression() scores = cross_val_score(model, X_tfidf, y, cv=5, scoring='accuracy') mean_acc = scores.mean() accuracy_scores.append(mean_acc) print(f"{n}-gram 平均准确率: {mean_acc:.4f}")
步骤2:绘制准确率曲线
现在你有了n_grams(x轴数据)和accuracy_scores(y轴数据),可以用Matplotlib绘制带清晰标签的曲线:
plt.figure(figsize=(8, 5)) # 绘制曲线并添加标记点,方便查看每个n-gram的准确率 plt.plot(n_grams, accuracy_scores, marker='o', linewidth=2, color='b') # 设置x轴显示对应的n-gram名称 plt.xticks(n_grams, ['1-gram', '2-gram', '3-gram', '4-gram', '5-gram']) # 添加图表标题和轴标签 plt.title('不同n-gram特征下的模型准确率') plt.xlabel('n-gram分组') plt.ylabel('准确率') # 可选:添加网格线提升可读性 plt.grid(alpha=0.3) plt.show()
关键补充
- 如果你之前用的是单次训练测试(而非交叉验证),只需把循环内的
cross_val_score替换为你的训练测试逻辑,确保每个n-gram对应一个准确率值存入accuracy_scores即可。 - 若你猜测的“n越大准确率越高”成立,曲线会呈现上升趋势;但实际中,当n过大时可能出现过拟合,曲线可能趋于平缓甚至下降。
内容的提问来源于stack exchange,提问作者peplem
相关产品推荐
相关产品推荐

