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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:12:11