h***s 发帖数: 2499 | 1 【 以下文字转载自 DataSciences 讨论区 】
发信人: hjxds (Kiss My Shiny Metal Ass), 信区: DataSciences
标 题: 有尝请教关于spark api java coding
发信站: BBS 未名空间站 (Thu Dec 14 00:00:11 2017, 美东)
现有一个Java 写的gbm 的scoring code, 剧长因为是很多tree。
现在我想把这个code搬到spark上去run,所以需要改写.
我的理解是把所有x 建立一个rdd,每一个row是一个(key,vector),然后rdd.map((k,v
)=>
(k,tree(vector))), 这个思路对不对?
如果对的话,我就要确保 我的tree function take a vector as input and return
the
score.对吧?
vector里面的x1,x2,x3,...的位置要确保一致对吧?
哪里能找到一些类似的code?谢谢。 | h***s 发帖数: 2499 | 2 score是要产生预测的y,所以data里没有y,只有快上千的x1..x999,所以不用split y
吧?由于x
太多了,我只能用vector或者list?
其实我的问题还有一点麻烦的地方,我的score function是另一个软件产生的java
code。 很长
所以手动改很烦,所以我试图保持原样看能不能wrap起来放到spark api里。 以下是
score
function的例子,
private double XB_TOTAL_ACTIV_MNTH_P1Q; /*XB_TOTAL_ACTIV_MNTH_P1Q 是我的x1
,其
他省略了 ×/
/*这里是用vector values[]赋值给x1
public void setDoubleVariables(double [] values) {
if (values.length != doubleVariables.length) {
System.out.println("Error! expecting " + doubleVariables.length + "
values for double predictors.");
} else {
XB_TOTAL_ACTIV_MNTH_P1Q = values[1];
}
}
这是一个tree function(x1)= score1;
private class tree_1 {
/* Tree 1 of 993 */
public double score() {
double target;
int node;
boolean done;
/* N terminal nodes = 6, Depth = 5 */
target = 0.0;
node = 1; /* start at root node */
done = false; /* set at terminal node */
while (!done) switch (node) {
case 1:
if (XB_POS_ACTIV_MNTH_L12M < 3.5) node = 2;
else node = 3;
break;
case 2:
............ /* skipped all cases here */
default: /* error */
target = 0.0;
done = true;
node = 0;
break;
}
return target;
}
}
tree_1 tree_1_obj=new tree_1();
把所有tree(x)都加起来是我的score
public double TreeNet_1_1() {
double response = 0.0;
response += init;
response+=tree_1_obj.score();
return response;
}
这样的写法有先赋值的一步把values[]里的x1等先搬到XB_TOTAL_ACTIV_MNTH_P1Q 里,
然后后
面的tree()是用XB_TOTAL_ACTIV_MNTH_P1Q做的计算,而不是直接用values[0]. 如果这
样的写
法我直接放到.map()里能work吗? |
|