Quora不真诚问题分类竞赛报错:数组维度不匹配及特征矩阵疑问
解决Quora不真诚问题分类竞赛中的维度不匹配错误及相关疑问
咱们一步步拆解你遇到的问题,逐个解决:
1. 为什么predictions是(1250, 2)而不是一列?
这是LogisticRegression的predict_proba()方法的特性:它会返回每个样本对应所有类别的概率值。你的任务是二分类(目标target取值为0或1),所以模型会输出两列概率——第一列是样本属于类别0(真诚问题)的概率,第二列是属于类别1(不真诚问题)的概率。这就是predictions形状为(1250, 2)的原因。
2. 关于x_val_count.shape的视觉误解
你说x_val_count.shape显示是(1250, 8411),但打印出来像只有两列?这是因为CountVectorizer生成的是稀疏矩阵,直接打印时只会展示非零元素的位置和数值(大部分元素是0,全量打印会非常冗余)。如果你想看到完整的密集矩阵,可以用x_val_count.toarray()转换后再查看,就能看到1250行8411列的完整结构了。
3. 解决ValueError的核心方案
报错的根源是predictions((1250,2))和y_val((1250,))维度不匹配,无法直接做逐元素运算。你需要从predictions中提取对应正类(类别1)的概率值,把它转换成和y_val维度一致的一维数组。
修改后的关键代码片段:
# 提取类别1的概率(第二列),转换成(1250,)的一维数组 predictions = logistic.predict_proba(x_val_count)[:, 1] print("loss: %0.3f " % loss(predictions, y_val))
另外,你的loss函数还有个潜在风险:如果predict + observed出现0值,会触发除以0的错误。可以加一个极小的常数避免这种情况:
def loss(predict, observed): a = predict * observed # 添加1e-8防止除以0 b = predict + observed + 1e-8 return 2 * (a / b)
额外的小修正
你调用count.fit()时错误传入了验证数据,这会导致数据泄露。fit()方法只需要用训练数据拟合即可:
# 只用训练数据拟合CountVectorizer,避免数据泄露 count.fit(list(x_train))
内容的提问来源于stack exchange,提问作者Ronan Venkat
相关产品推荐
相关产品推荐

