使用Scala进行生存AFT分析

时间:2019-03-21 03:05:57

标签: scala apache-spark survival-analysis survival

我正在尝试实施此处记录的生存分析模型:Scala-Docs#Survival-Regression,但我无法对应该如何进行实际实施做任何准备。

我正在尝试为企业建立客户的“生存能力”模型。客户的生存能力是根据上个月是否进行购买而给客户的标签。如果客户未进行购买,则认为他们已死亡/受到责骂。我要考虑的两个因素是“刊登广告的次数”和“在商务网站上花费的时间”。每月收集有关客户的数据。

这是两个月(三个月)中两个客户(CustA和CustB)的数据:

val seqCust = Seq(
//Customer,Period,Censor,# of Ads,Amount of Time on Site
("CustA",1,0,4,2400),
("CustA",2,0,6,1800),
("CustA",3,1,2,600),
("CustB",1,0,2,2800),
("CustB",2,0,4,2100),
("CustB",3,0,3,1200)
)

然后我想将其转换为文档指定的格式:

val dfCust = seqCust.map(cr=>(cr._2,cr._3,Vectors.dense(cr._4,cr._5)).toDF("label", "censor", "features")

现在我的数据如下所示:

[1,0,[4,2400]],
[2,0,[6,1800]],
[3,1,[2,600]],
[1,0,[2,2800]],
[2,0,[4,2100]],
[3,0,[3,1200]]

然后执行以下操作:

val quantileProbabilities = Array(0.3, 0.6)
val aft = new AFTSurvivalRegression()
  .setQuantileProbabilities(quantileProbabilities)
  .setQuantilesCol("quantiles")

val model = aft.fit(dfCust)

// Print the coefficients, intercept and scale parameter for AFT survival regression
println(s"Coefficients: ${model.coefficients}")
println(s"Intercept: ${model.intercept}")
println(s"Scale: ${model.scale}")
model.transform(dfCust).show(false)

但是我不明白:

  1. 按照Scala的文档,这是对数据建模的正确方法吗?
  2. 为什么我没有在任何地方考虑客户ID?

0 个答案:

没有答案