H2O 和 Scikit-Learn 指标评分之间有啥区别?
Posted
技术标签:
【中文标题】H2O 和 Scikit-Learn 指标评分之间有啥区别?【英文标题】:Any difference between H2O and Scikit-Learn metrics scoring?H2O 和 Scikit-Learn 指标评分之间有什么区别? 【发布时间】:2018-07-19 18:49:31 【问题描述】:我尝试使用 H2O 创建一些机器学习模型来解决二元分类问题,测试结果还不错。但后来我检查并发现了一些奇怪的东西。出于好奇,我尝试为测试集打印模型的预测。而且我发现我的模型实际上一直预测为 0(负),但 AUC 在 0.65 左右,精度不是 0.0。然后我尝试使用 Scikit-learn 来比较指标分数,并且(正如预期的那样)它们是不同的。 Scikit 学习产生了 0.0 的精度和 0.5 的 AUC 分数,我认为这是正确的。这是我使用的代码:
model = h2o.load_model(model_path)
predictions = model.predict(Test_data).as_data_frame()
# H2O version to print the AUC score
auc = model.model_performance(Test_data).auc()
# Python version to print the AUC score
auc_sklearn = sklearn.metrics.roc_auc_score(y_true, predictions['predict'].tolist())
有什么想法吗?提前致谢!
【问题讨论】:
只是推测而不是给出完整的答案,Scikit Learn 可能会针对有偏见的班级规模进行规范化。 【参考方案1】:H2O 和 scikit-learn 评分之间没有区别,您只需要了解如何理解输出,以便准确比较它们。
如果您查看predictions['predict']
中的数据,您会发现它是预测类别,而不是原始预测值。 AUC 使用后者,因此您需要使用正确的列。见下文:
import h2o
from h2o.estimators.gbm import H2OGradientBoostingEstimator
h2o.init()
# Import a sample binary outcome train/test set into H2O
train = h2o.import_file("https://s3.amazonaws.com/erin-data/higgs/higgs_train_10k.csv")
test = h2o.import_file("https://s3.amazonaws.com/erin-data/higgs/higgs_test_5k.csv")
# Identify predictors and response
x = train.columns
y = "response"
x.remove(y)
# For binary classification, response should be a factor
train[y] = train[y].asfactor()
test[y] = test[y].asfactor()
# Train and cross-validate a GBM
model = H2OGradientBoostingEstimator(distribution="bernoulli", seed=1)
model.train(x=x, y=y, training_frame=train)
# Test AUC
model.model_performance(test).auc()
# 0.7817203808052897
# Generate predictions on a test set
pred = model.predict(test)
检查输出:
In [4]: pred.head()
Out[4]:
predict p0 p1
--------- -------- --------
0 0.715077 0.284923
0 0.778536 0.221464
0 0.580118 0.419882
1 0.316875 0.683125
0 0.71118 0.28882
1 0.342766 0.657234
1 0.297636 0.702364
0 0.594192 0.405808
1 0.513834 0.486166
0 0.70859 0.29141
[10 rows x 3 columns]
现在与 sklearn 进行比较:
from sklearn.metrics import roc_auc_score
pred_df = pred.as_data_frame()
y_true = test[y].as_data_frame()
roc_auc_score(y_true, pred_df['p1'].tolist())
# 0.78170751032654806
在这里您可以看到它们大致相同。 AUC 是一种近似方法,因此当您比较不同的实现时,您会看到小数点后几位的差异。
【讨论】:
嗨,Erin,您能看看我在比较两个混淆矩阵的结果时目前面临的the issue 吗?提前致谢。以上是关于H2O 和 Scikit-Learn 指标评分之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Keras scikit-learn 包装器在使用 one-hot 编码标签的交叉验证中的评分指标
如何将模型 (GLM) 从 h2o 移植到 scikit-learn?
如何在 scikit learn 中为 cross_validate 制作自定义评分指标?