二元分类 predict() 方法:sklearn vs keras
Posted
技术标签:
【中文标题】二元分类 predict() 方法:sklearn vs keras【英文标题】:Binary classification predict() method : sklearn vs keras 【发布时间】:2018-07-15 02:33:01 【问题描述】:我尝试在一个基本的二元分类示例中将我的 sklearn 代码迁移到 keras。 我对返回不同于 sklearn 的 keras 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 中的 OneVsRestClassifier 将自定义的二元分类调整为多类分类