作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的用例是一个常见用例:带有不平衡标签的二元分类,因此我们决定使用 f1-score 通过交叉验证进行超参数选择,我们使用 pyspark 2.3 和 pyspark.ml,我们创建了一个 CrossValidator 对象,但对于评估者,问题如下:
最佳答案
您可以为此创建一个类。我公司的 spark 2.4 也有同样的问题,所以我尝试为二元分类制作一个 F1 分数评估器。我必须指定 .evaluate
和 .isLargerBetter
新类的方法。这是我尝试时的示例代码 this数据集:
class F1BinaryEvaluator():
def __init__(self, predCol="prediction", labelCol="label", metricLabel=1.0):
self.labelCol = labelCol
self.predCol = predCol
self.metricLabel = metricLabel
def isLargerBetter(self):
return True
def evaluate(self, dataframe):
tp = dataframe.filter(self.labelCol + ' = ' + str(self.metricLabel) + ' and ' + self.predCol + ' = ' + str(self.metricLabel)).count()
fp = dataframe.filter(self.labelCol + ' != ' + str(self.metricLabel) + ' and ' + self.predCol + ' = ' + str(self.metricLabel)).count()
fn = dataframe.filter(self.labelCol + ' = ' + str(self.metricLabel) + ' and ' + self.predCol + ' != ' + str(self.metricLabel)).count()
return tp / (tp + (.5 * (fn +fp)))
f1_evaluator = F1BinaryEvaluator()
from pyspark.ml.tuning import ParamGridBuilder, CrossValidator
from pyspark.ml.classification import GBTClassifier
gbt = GBTClassifier()
paramGrid = (ParamGridBuilder()
.addGrid(gbt.maxDepth, [3, 5, 7])
.addGrid(gbt.maxBins, [10, 30])
.addGrid(gbt.maxIter, [10, 15])
.build())
cv = CrossValidator(estimator=gbt, estimatorParamMaps=paramGrid, evaluator=f1_evaluator, numFolds=5)
cvModel = cv.fit(train)
cv_pred = cvModel.bestModel.transform(test)
CV 过程运行没有问题,但我不知道性能。我还尝试将评估器与
sklearn.metrics.f1_score
进行比较并且值很接近。
from sklearn.metrics import f1_score
print("made-up F1 Score evaluator : ", f1_evaluator.evaluate(cv_pred))
print("sklearn F1 Score evaluator : ", f1_score(cv_pred.select('label').toPandas(), cv_pred.select('prediction').toPandas()))
made-up F1 Score evaluator : 0.9363636363636364
sklearn F1 Score evaluator : 0.9363636363636363
关于python - 如何在 pyspark 2.3 中的二元问题(BinaryClassificationEvaluator)中为 CrossValidator 评估器使用 f1-score,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68213862/
我是一名优秀的程序员,十分优秀!