如何在pyspark.ml.regression.LinearRegressionModel中使用L1惩罚来进行特征选择?

时间:2016-12-20 05:53:46

标签: apache-spark pyspark apache-spark-ml

首先,我使用spark 1.6.0。我想在pyspark.ml.regression.LinearRegressionModel中使用L1惩罚来进行特征选择。

但是在调用函数时我无法得到详细的系数

lr = LogisticRegression(elasticNetParam=1.0, regParam=0.01,maxIter=100,fitIntercept=False,standardization=False)
model = lr.fit(df_one_hot_train)
print model.coefficients.toArray().astype(float).tolist() 

我只得到稀疏列表:

[0,0,0,0,0,..,-0.0871650387514,..,]

当我使用 sklearn.linear_model.LogisticRegression 模型时,我可以在coef_ list中得到没有零值的详细列表,如:

[0.03098372361467529,-0.13709075166114365,-0.15069548597557908,-0.017968044053830862]

凭借更好的火花表现,我可以更快地完成工作。我只想使用L1惩罚来进行特征选择。

我认为我应该为我的功能选择工作使用更详细的系数值,就像sklearn一样,我该如何解决我的问题?

1 个答案:

答案 0 :(得分:0)

以下是Spark 2.1中的工作代码片段。

提取值的关键是:

stages(4).asInstanceOf[LinearRegressionModel]

Spark 1.6可能有类似的东西。

val holIndIndexer = new StringIndexer().setInputCol("holInd").setOutputCol("holIndIndexer")

val holIndEncoder = new OneHotEncoder().setInputCol("holIndIndexer").setOutputCol("holIndVec")

val time_intervaLEncoder = new OneHotEncoder().setInputCol("time_interval").setOutputCol("time_intervaLVec")

val assemblerL1 = (new VectorAssembler()
           .setInputCols(Array("time_intervaLVec", "holIndVec", "length")).setOutputCol("features") )

val lrL1 = new LinearRegression().setFeaturesCol("features").setLabelCol("travel_time")

val pipelineL1 = new Pipeline().setStages(Array(holIndIndexer,holIndEncoder,time_intervaLEncoder,assemblerL1, lrL1))

val modelL1 = pipelineL1.fit(dfTimeMlFull)

val l1Coeff =modelL1.stages(4).asInstanceOf[LinearRegressionModel].coefficients

println(l1Coeff)