朴素贝叶斯和多类分类器返回整数。数据团队说他们应该是概率

Posted

技术标签:

【中文标题】朴素贝叶斯和多类分类器返回整数。数据团队说他们应该是概率【英文标题】:Naive-Bayes and Multi-Class classifier are returning integers. Data team says they should be probabilities 【发布时间】:2019-10-19 07:15:06 【问题描述】:

我有一个包含 100 列的数据集,分为训练集和测试集,分别为 40,000 和 10,000 行。我的任务是训练和测试两个分类器,并通过为 CSV 文件提供目标变量(0 或 1)的预测来报告结果。我的问题是我的模型返回整数,校长拒绝了我的回答,说数字应该是概率,而不是整数。

我清理了训练集和测试集,将训练集命名为“goodtrain”,将测试集命名为“goodtest”。然后我在 goodtrain 上运行 SelectKBest 以获取 10 个最佳特征,然后使用 train_test_split 将 goodtrain 进一步划分为训练和测试子集。然后,我使用朴素贝叶斯和多类分类训练了一个模型,并在测试子集上对其进行了测试。分类器训练完成后,我在 goodtest 上使用它们并将结果保存为 CSV 文件。

# Naive Bayes, with and without 5-fold cross-validation

# Create a Naive Bayes object
gnb = GaussianNB()

# Train the classifer and form a predictive model
modelNB = gnb.fit(trainX, trainY.values.ravel())
predNB = modelNB.predict(testX)

# Test the model and report the accuracy score
print("Naive-Bayes accuracy: ", round(accuracy_score(testY, predNB, normalize=True)*100, 2), "\b%")

# With 5-fold cross-validation
scoreNBcv05 = cross_val_score(modelNB, trainX, trainY.values.ravel(), cv=5)
print("Cross-validated Naive Bayes accuracy, 5 folds: ", round(scoreNBcv05.mean()*100,2), "\b%")

朴素贝叶斯准确率:79.92% 交叉验证的朴素贝叶斯准确率,5 折:79.52%

# Multi-classification model with logistic regression

# Create a LR object
lr = linear_model.LogisticRegression()

# Train the algorithm and form a predictive model
modelLR = lr.fit(trainX, trainY.values.ravel()) 
predLR = modelLR.predict(testX)

# Test the model and report accuracy score
print("Multi-classification with Logistic Regression accuracy: ", round(accuracy_score(testY, predLR, normalize=True)*100, 2), "\b%")

# 5 fold cross-validation:
scoreLRcv05 = cross_val_score(modelLR, trainX, trainY.values.ravel(), cv=5)
print("Cross-validated Multi-class with Logistic Regression accuracy, 5 folds: ", round(scoreLRcv05.mean()*100,2), "\b%")

具有逻辑回归准确度的多分类:80.1% 具有逻辑回归准确率的交叉验证多类,5 折:79.59%

# Generate prediction for original test set using Naive Bayes

# Train the classifer and form a predictive model
modelNB = gnb.fit(trainX, trainY)
results1 = modelNB.predict(goodtest)

# Save the results as results1.csv
np.savetxt("results1.csv", results1, delimiter=",")
# Generate prediction for original test set using multi-class logistic regression

# Train the algorithm and form a predictive model
modelLR = lr.fit(trainX, trainY) 
results2 = modelLR.predict(goodtest)

# Save the results as results2.csv
np.savetxt("results2.csv", results2.astype(int), delimiter=",")

我没有收到错误,但模型预测了 0 和 1 的单列,校长说这是不正确的。我意识到这个问题表明对这些分类器的工作方式缺乏了解,但如果能深入了解我所忽略的内容,我将不胜感激。

【问题讨论】:

我想通了。我使用 .predict_proba 而不是 .predict。 【参考方案1】:

使用 .predict_proba 代替 .predict 解决了这个问题。

【讨论】:

请查看Can I answer my own question? 并在两天后返回并检查是否已回答您是否拥有超过 15 个声望。

以上是关于朴素贝叶斯和多类分类器返回整数。数据团队说他们应该是概率的主要内容,如果未能解决你的问题,请参考以下文章

贝叶斯分类器(3)朴素贝叶斯分类器

数据挖掘十大经典算法之朴素贝叶斯

朴素贝叶斯-商品评论情感分析

使用高斯朴素贝叶斯的多类分类

在 sklearn 中补充朴素贝叶斯和加权类

执行朴素贝叶斯和决策树分类时出现 KeyError