使用scikit-learn MultinomialNB构建分类器:训练参数疑问
MultinomialNB.fit() 的第二个参数详解
嘿,我来帮你理清这个问题,顺便修正下代码里的小错误~
首先直接给你答案:你已经生成的 train['sentiment'] 就是对应教程里 twenty_train.target 的参数——它是每个训练样本对应的类别标签集合,必须和特征矩阵的样本数量一一对应。
具体解释
MultinomialNB.fit(X, y) 方法的两个核心参数:
X:特征矩阵,也就是你用CountVectorizer生成的文档-词频矩阵(你的代码里是X_train_counts);y:每个样本对应的分类标签,这里就是你通过评分转换得到的正负类标记(+1或-1)。
你通过这段代码生成的标签列完全符合要求:
df2['sentiment'] = df2['rating'].apply(lambda rating : +1 if rating > 3 else -1)
它把评分>3的评论标记为正类,其余为负类,刚好是朴素贝叶斯分类器需要的离散类别标签。
你的代码里需要修正的几个问题
我注意到代码里有几个拼写和变量定义的小错误,会导致运行报错,帮你修正后如下:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import time import csv import string # 新版本sklearn中cross_validation已移到model_selection from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB # 导入数据集 data = pd.read_csv("test.csv", quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL, skipinitialspace=True, error_bad_lines=False) df2 = data.set_index("name", drop=False) df2['sentiment'] = df2['rating'].apply(lambda rating: +1 if rating > 3 else -1) # 划分训练集和测试集 train, test = train_test_split(df2, test_size=0.2) count_vect = CountVectorizer() # 修正拼写错误:traintrain → train X_train_counts = count_vect.fit_transform(train['review']) # 修正拼写错误:testrain → test test_matrix = count_vect.transform(test['review']) # 修正未定义变量:X_train_tfidf → X_train_counts,传入正确的标签列 clf = MultinomialNB().fit(X_train_counts, train['sentiment'])
额外小提示
训练完模型后,你可以用以下代码验证效果:
# 得到测试集预测标签 predicted = clf.predict(test_matrix) # 计算准确率 accuracy = np.mean(predicted == test['sentiment']) print(f"模型准确率:{accuracy:.2f}")
内容的提问来源于stack exchange,提问作者Chedi Bechikh
相关产品推荐
相关产品推荐

