在sklearn中为Complement Naive Bayes设置类权重遇值错误求助
解决Complement Naive Bayes中类权重的使用问题
你遇到的ValueError核心原因是:ComplementNB.fit()的sample_weight参数需要的是与训练样本数量一致的权重数组,而你传入的c_w是compute_class_weight返回的仅包含两个类别权重的数组(长度为2),和训练样本数(29752)不匹配,所以报错了。
下面给你两种正确使用类权重的方法:
方法1:将类权重转换为样本权重数组
先把计算好的类权重映射到每个训练样本上,生成和y_train长度一致的权重数组,再传入fit的sample_weight参数:
# 计算类权重 unique_classes = np.unique(y_train) c_w = class_weight.compute_class_weight('balanced', unique_classes, y_train) # 创建类别到权重的映射字典 class_weight_dict = dict(zip(unique_classes, c_w)) # 为每个训练样本生成对应的权重 sample_weights = y_train.map(class_weight_dict).values # 初始化模型并训练 clf = ComplementNB() clf.fit(x_train, y_train, sample_weight=sample_weights)
方法2:直接在模型初始化时设置class_weight参数
更简单的方式是,ComplementNB本身支持在初始化时直接传入class_weight参数,不用手动计算和转换。设置为'balanced'后,模型会自动根据样本数量计算均衡的类权重:
# 初始化模型时直接指定类权重 clf = ComplementNB(class_weight='balanced') # 正常训练即可,无需额外传sample_weight clf.fit(x_train, y_train)
这两种方法都能解决你的类别不平衡问题,方法2更简洁推荐使用。修改后你就可以正常训练模型并生成混淆矩阵了。
内容的提问来源于stack exchange,提问作者Cauê Evangelista
相关产品推荐
相关产品推荐

