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

jbi*_*.fr 1 classification python-3.x scikit-learn deep-learning keras

我尝试将我的sklearn代码迁移到基本二进制分类示例上的keras。我对返回与sklearn不同的keras predict()方法有疑问

学习

print("X_test:")
print(X_test)
y_pred = model.predict(X_test)
print("y_pred:")
print(y_pred)
Run Code Online (Sandbox Code Playgroud)

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,missing=None,n_estimators=100,nthread=-1,objective='二元:逻辑',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)。

凯拉斯

score = aTSSeqModel.evaluate(X_test, Y_test2, batch_size=32)
Run Code Online (Sandbox Code Playgroud)

得分:[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)
Run Code Online (Sandbox Code Playgroud)

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.234e-20] [ 1.234e-20] [ 1.234e-20] [ 1.2347e-25]

这是将predict()keras模型一起使用的正确方法吗?

我希望有一个二进制向量,就像sklean一样,这是应用于X_test数据集的预测结果。什么代表那个二维向量及其值?

感谢您的回答。

Dan*_*ola 5

这是一个严重不恰当的问题,但我会尽力解决您的问题。下次请检查指南

这两个值代表什么?

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

model.compile(optimizer='...', loss='...', metrics=['acc'])
Run Code Online (Sandbox Code Playgroud)

然后调用model.evaluate(X, Y)将返回一个阵列,其中所述第一值是间的损耗model.predict(X)Y,而第二值是在相同的数据的准确性。
显然,它也扩展到其他指标。

这是将 predict() 与 keras 模型一起使用的正确方法吗?

这是。
Scikit-learnpredict()返回一个 shape 数组(n_samples, ),而Keras返回一个 shape数组(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.
Run Code Online (Sandbox Code Playgroud)

干杯