比赛地址在此:点击打开链接
需要的工具库:
1.pyspark
2.pandas
def init_data(row_data):
drop_name = list(row_data.columns[2:-10])
drop_data = row_data.drop(columns=drop_name)
data = spark.createDataFrame(drop_data)
vecAssembler=VectorAssembler(inputCols=['mfd_daily_yield','mfd_7daily_yield','Interest_O_N','Interest_1_W','Interest_2_W','Interest_1_M','Interest_3_M','Interest_6_M','Interest_9_M','Interest_1_Y'],outputCol='features')
return vecAssembler.transform(data)
解释一下,row_data是含有全部属性的数据集,为pandas的DataFrame对象,因此需要删除掉一些没用到的属性,只留下利率属性和总申购赎回量。因此函数init_data的第一行就取出要删除的字段名称,然后用drop删除。然后就用VectorAssembler来将某些列合并成一个列,新的列名称就为features,即为特征向量。
在这里我们直接用ramdomSplit函数即可实现。
train_data,test_data=pre_data.randomSplit([0.8,0.2])
在这里我用决策树回归试试水先,在spark的机器学习库中有提供决策树的算法实现。因此可以直接使用。
def train(train_data):
dt=DecisionTreeRegressor(labelCol='yBalance')
model=dt.fit(train_data)
return model
DecisionTreeRegressor即为决策树算法,它有featuresCol,labelCol,impurity,maxBins,maxDepth,numTree等等的参数可以设置。我们使用默认属性先。我们先预测申购量,因此指定了label列名为tBalance。然后进行拟合,返回模型。
def evaluateModel(model,data):
predict_data=model.transform(data)
evaluator = RegressionEvaluator(labelCol='yBalance')
return evaluator.evaluate(predict_data)
代码解释,这里重要的是RegressionEvaluator这个类,它是用来对回归模型进行评估的,它将prediction列和label列。用指定metricName来计算评估参量。可选的metricName有r2,mae(绝对平方差),rmse(均方根差)。这里我选择了r2,即确定系数。
结果为0.97.这里补充一下r2的知识。在讲确定系数之前,我们先介绍另外两个参数SSR和SST,因为确定系数是根据他们两个确定的.
SSR即为预测数据与原始数据均值之差的平方和。SST即为原始数据均值之差的平方和。而R2就是等于SSR和SST的比值。确定系数正常范围在[0,1]之间,越接近1,表明方程
的变量对y的解释能力越强。
额,我这里的结果是0.97,可以说是离1非常接近了,但是有点不相信,感觉是我哪里出了问题,不然不可能那么高的确定系数的。
然后我就了rmse作为metricName,结果显示,631200481 。不用说了....我这次预测是失败了。
1.特征向量没有选对
2.算法参数没有设置好
总而言之,再接再砺吧。