二元分类 predict() 方法:sklearn vs keras

Posted

技术标签:

【中文标题】二元分类 predict() 方法:sklearn vs keras【英文标题】:Binary classification predict() method : sklearn vs keras 【发布时间】:2018-07-15 02:33:01 【问题描述】:

我尝试在一个基本的二元分类示例中将我的 sklearn 代码迁移到 keras。 我对返回不同于 sklearnkeras predict() 方法有疑问。

sklearn

print("X_test:")
print(X_test)
y_pred = model.predict(X_test)
print("y_pred:")
print(y_pred)

XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, gamma=0,learning_rate=0.1,max_delta_step=0,max_depth=3, min_child_weight=1,缺失=无,n_estimators=100,nthread=-1, 目标='二进制:逻辑',reg_alpha=0,reg_lambda=1, scale_pos_weight=1,seed=0,silent=True,subsample=1)

--- 预测 Sklearn ---

X_test: [[ 1. 90. 62. ..., 27.2 0.58 24. ] [ 7. 181. 84. ..., 35.9 0.586 51. ] [ 13. 152. 90. ..., 26.8 0.731 43. ] ..., [ 4. 118. 70. ..., 44.5 0.904 26. ] [ 7. 152. 88. ..., 50. 0.337 36. ] [ 7. 168. 88. ..., 38.2 0.787 40. ]]

y_pred: [ 0. 1. 1. 0. 1. 1. 0. 0. 1. 0. 1. 0. 1. 1. 0. 0. 0. 1. 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0. ... 0. 0. 1. 0. 1. 0. 0. 1. 0. 1. 0. 0. 1. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 0. 1. 0. 1. 1. 1. 1. 1. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 0. 1. 1. 0. 0. 1. 0. 1. 0. 0. 0. 0. 1. 1. 1.]

predict() 的数据类型返回:X_test 维的二进制向量(OK)。

Keras

score = aTSSeqModel.evaluate(X_test, Y_test2, batch_size=32)

得分:[1.4839521383676004, 0.6338582667778796]

这两个值代表什么?

print("--- Predict Keras ---")
print("X_test:")
print(X_test)
Y_pred2 = aTSSeqModel.predict(X_test, batch_size=32)
print("Y_pred:")
print(Y_pred2)

keras.models.Sequential 对象位于 0x7fae3a60b438

--- 预测 Keras ---

X_test: [[ 1. 90. 62. ..., 27.2 0.58 24. ] [ 7. 181. 84. ..., 35.9 0.586 51. ] [ 13. 152. 90. ..., 26.8 0.731 43. ] ..., [ 4. 118. 70. ..., 44.5 0.904 26. ] [ 7. 152. 88. ..., 50. 0.337 36. ] [ 7. 168. 88. ..., 38.2 0.787 40. ]]

Y_pred: [[ 9.07712865e-21] [ 0.00000000e+00] [ 1.27839347e-25] [ 2.38120656e-22] [ 5.51314650e-20] [ 1.99869346e-22] [ 1.54212393e-19]...

predict()keras 模型一起使用是否正确?

我希望像 sklean 那样有一个二元向量,即应用于 X_test 数据集的预测结果。 2D 向量及其值代表什么?

感谢您的回答。

【问题讨论】:

您需要包含您的 Keras 模型才能获得这两个问题的答案。 【参考方案1】:

这是一个严重不当的问题,但我会尝试解决您的问题。下次请查看guidelines。

这两个值代表什么?

假设您编译模型时将metrics 标志设置为

model.compile(optimizer='...', loss='...', metrics=['acc'])

那么对model.evaluate(X, Y)的调用将返回一个数组,其中第一个值是model.predict(X)Y之间的损失,第二个值是相同数据的准确率。 显然,它也扩展到其他指标。

在 keras 模型中使用 predict() 是否正确?

是的。 Scikit-learn 的 predict() 返回一个形状为 (n_samples, ) 的数组,而 Keras 的返回一个形状为 (n_samples, 1) 的数组。 对于您的目的,这两个数组是等效的,但 Keras 中的数组更通用,因为它更容易扩展到多维输出情况。 要将 Keras 输出转换为 Sklearn 的,只需调用 y_pred.reshape(-1)。 至于为什么 Scikit-learn 的值会自动四舍五入,我不知道,但这可能与 Sklearn 使用的内部数据类型有关。如果你愿意,你可以像这样对 Keras 的值进行四舍五入:

y_pred[y_pred <= 0.5] = 0.
y_pred[y_pred > 0.5] = 1.

干杯

【讨论】:

以上是关于二元分类 predict() 方法:sklearn vs keras的主要内容,如果未能解决你的问题,请参考以下文章

sklearn 如何计算二元分类器的 roc 曲线下面积?

使用 sklearn 中的 OneVsRestClassifier 将自定义的二元分类调整为多类分类

sklearn 分类器 - 最大化 auc 的 predict_proba 阈值

结合二元分类算法

如何在 SVM 情绪分析中使用 predict_proba

二元分类器过于自信,无法用 sklearn 绘制 ROC 曲线?