2016-12-20 2 views
0

Tout d'abord, j'utilise spark 1.6.0. Je veux utiliser la pénalité L1 dans pyspark.ml.regression.LinearRegressionModel pour la sélection des fonctionnalités.Comment utiliser la pénalité L1 dans pyspark.ml.regression.LinearRegressionModel pour la sélection de fonctionnalités?

Mais je ne peux pas obtenir les coefficients détaillés lorsque vous appelez la fonction:

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() 

Je n'obtenir la liste clairsemés comme:

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

Alors que lorsque j'utilise sklearn.linear_model.LogisticRegression modèle, je peux obtenir la liste détaillée sans valeur zéro dans la liste coef_ comme:

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

Avec la meilleure performance en étincelle, je pourrais finir mon travail plus rapidement. Je veux juste utiliser la pénalité L1 pour la sélection des caractéristiques.

Je pense que je devrais utiliser des valeurs de coefficients plus détaillées pour mon travail de sélection de fonctionnalités, tout comme le fait sklearn, comment puis-je résoudre mon problème?

Répondre

0

Vous trouverez ci-dessous un code de travail dans Spark 2.1.

La clé pour extraire des valeurs est:

stages(4).asInstanceOf[LinearRegressionModel] 

Spark 1.6 peut avoir quelque chose de similaire.

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)