使用Word2Vec向量化后传入MultinomialNB出现负值错误求助
解决MultinomialNB输入含负值的报错问题
错误原因
MultinomialNB的核心假设是输入特征为非负的计数/频率类数据,但Word2Vec生成的词向量本身包含正负数值,通过取均值得到的句子向量自然也会存在负值,直接传入模型就触发了输入校验错误。
可行解决方案
1. 替换为适配连续特征的朴素贝叶斯模型
如果想保留Word2Vec的向量特征,直接改用GaussianNB即可,它专门用于处理连续型数值特征,支持负值输入:
# 替换导入和模型初始化 from sklearn.naive_bayes import GaussianNB clf = GaussianNB() clf.fit(X_train, y_train)
2. 将Word2Vec向量转换为非负特征
若必须使用MultinomialNB,可通过以下方式将向量转为非负:
- 取绝对值:快速将所有负值转为正值,保留向量的相对分布
修改vectorize函数:def vectorize(sentence): words = sentence.split() words_vecs = [w2v_model.wv[word] for word in words if word in w2v_model.wv] if len(words_vecs) == 0: return np.zeros(100) words_vecs = np.array(words_vecs) return np.abs(words_vecs.mean(axis=0)) # 新增绝对值转换 - Min-Max归一化:将向量映射到[0,1]区间,消除负值同时保留特征差异
from sklearn.preprocessing import MinMaxScaler # 仅用训练集拟合缩放器,避免数据泄露 scaler = MinMaxScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) clf = MultinomialNB() clf.fit(X_train, y_train)
3. 改用MultinomialNB原生适配的文本特征
MultinomialNB原本就是为词频、TF-IDF这类计数型特征设计的,搭配传统文本特征提取效果更贴合模型特性:
from sklearn.feature_extraction.text import TfidfVectorizer # 用TF-IDF提取非负文本特征 vectorizer = TfidfVectorizer(min_df=5) X_train = vectorizer.fit_transform(X_train) X_test = vectorizer.transform(X_test) clf = MultinomialNB() clf.fit(X_train, y_train)
额外注意点
原代码中precision_score的pos_label='positive'参数错误,因为数据集的类别是新闻分类(如体育、科技等),并非二元分类的"positive",需改为加权平均或指定具体类别:
print('Precision:', precision_score(y_test, y_pred, average='weighted'))
内容的提问来源于stack exchange,提问作者celsowm
相关产品推荐
相关产品推荐

