将模型分数应用于 Spark DataFrame - Python
Posted
技术标签:
【中文标题】将模型分数应用于 Spark DataFrame - Python【英文标题】:Apply Model Scores to Spark DataFrame - Python 【发布时间】:2016-03-01 18:57:28 【问题描述】:我正在尝试使用 PySpark 将分数应用于 Spark DataFrame。假设我在 Spark 之外构建了一个简单的回归模型,并且希望将模型中创建的系数值映射到 DataFrame 中的各个列,以创建一个新列,该列是每个不同源列的总和乘以个体系数。我知道 Spark mllib 中有许多用于建模的实用程序,但我想了解如何实现这种“蛮力”方法。我也知道 DataFrames/RDD 是不可变的,因此必须创建一个新的 DataFrame。
这里有一些伪代码供参考:
#load example data
df = sqlContext.createDataFrame(data)
df.show(5)
dfmappd.select("age", "parch", "pclass").show(5)
+----+-----+------+
| age|parch|pclass|
+----+-----+------+
|22.0| 0| 3|
|38.0| 0| 1|
|26.0| 0| 3|
|35.0| 0| 1|
|35.0| 0| 3|
+----+-----+------+
only showing top 5 rows
在 Spark 外部创建的模型是基于二元响应的逻辑回归模型。所以本质上我想将 logit 函数映射到这三列以产生第四列。以下是模型中的系数:
拦截:3.435222
年龄:-0.039841
parch:0.176439
pclass:-1.239452
这里是logit函数的说明,供参考: https://en.wikipedia.org/wiki/Logistic_regression
为了比较,这里是我如何在 R 中使用 tidyr 和 dplyr 做同样的事情
library(dplyr)
library(tidyr)
#Example data
Age <- c(22, 38, 26, 35, 35)
Parch <- c(0,0,0,0,0)
Pclass <- c(3, 1, 3, 1, 3)
#Wrapped in a dataframe
mydf <- data.frame(Age, Parch, Pclass)
#Using dplyr to create a new dataframe with mutated column
scoredf = mydf %>%
mutate(score = round(1/(1 + exp(-(3.435 + -0.040 * Age + 0.176 * Parch + -1.239 * Pclass))),2))
scoredf
【问题讨论】:
你问的不清楚!您想将系数乘以每个观察特征吗? @eliasah,感谢您的反馈,我已经更新了问题,并举例说明了如何在 R 中完成此操作以供参考,希望这能提供更清晰的信息。 【参考方案1】:如果我正确解释了您的问题,您希望根据离线计算的系数计算每个样本的类别条件概率,并“手动”进行。
这样的工作是否有效:
def myLogisticFunc(age, parch, pclass):
intercept = 3.435222
betaAge = -0.039841
betaParch = 0.176439
betaPclass = -1.239452
z = intercept + betaAge * age + betaParch * parch + betaPclass * pclass
return 1.0 / (1.0 + math.exp(-z))
myLogisticFuncUDF = udf(myLogisticFunc)
df.withColumn("score", myLogisticFuncUDF(col("age"), col("parch"), col("pclass"))).show()
【讨论】:
就是这样!感谢您的帮助。以上是关于将模型分数应用于 Spark DataFrame - Python的主要内容,如果未能解决你的问题,请参考以下文章
Spark scala Dataframe:如何将自定义类型应用于现有数据框?