2017-07-07 90 views
0

我是新来斯卡拉,我想实现一个回归model.So最初我加载如下csv文件:如何在scala中设置逻辑回归的数据?

val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
val df = sqlContext.read.format("com.databricks.spark.csv") 
    .option("header", "true") 
    .option("inferSchema", "true") 
    .load("D:/sample.txt") 

的文件是如下:

P,P,A,A,A,P,NB 
N,N,A,A,A,N,NB 
A,A,A,A,A,A,NB 
P,P,P,P,P,P,NB 
N,N,P,P,P,N,NB 
A,A,P,P,P,A,NB 
P,P,A,P,P,P,NB 
P,P,P,A,A,P,NB 
P,P,A,P,A,P,NB 
P,P,A,A,P,P,NB 
P,P,P,P,A,P,NB 
P,P,P,A,P,P,NB 
N,N,A,P,P,N,NB 
N,N,P,A,A,N,NB 
N,N,A,P,A,N,NB 
N,N,A,P,A,N,NB 
N,N,A,A,P,N,NB 
N,N,P,P,A,N,NB 
N,N,P,A,P,N,NB 
A,A,A,P,P,A,NB 
A,A,P,A,A,A,NB 
A,A,A,P,A,A,NB 
A,A,A,A,P,A,NB 
A,A,P,P,A,A,NB 
A,A,P,A,P,A,NB 
P,N,A,A,A,P,NB 
N,P,A,A,A,N,NB 
P,N,A,A,A,N,NB 
P,N,P,P,P,P,NB 
N,P,P,P,P,N,NB 

然后我想

val lr = new LogisticRegression() 
     .setMaxIter(10) 
     .setRegParam(0.3) 
     .setElasticNetParam(0.8) 
     .setFeaturesCol("Feature") 
     .setLabelCol("Label") 

然后,我通过以下拟合模型:

通过下面的代码训练模型3210
val lrModel = lr.fit(df) 

println(lrModel.coefficients +"are the coefficients") 
println(lrModel.interceptVector+"are the intercerpt vactor") 
println(lrModel.summary +"is summary") 

但它没有打印结果。

任何帮助表示赞赏。

回答

1

从代码:

val lr = new LogisticRegression() 
     .setMaxIter(10) 
     .setRegParam(0.3) 
     .setElasticNetParam(0.8) 
     .setFeaturesCol("Feature") <- here 
     .setLabelCol("Label") <- here 

要设置features柱和label列。由于您没有提及列名,因此我假设包含NB值的列是您的标签,并且您希望包含所有其他列是预测列。

您希望包含在模型中的所有预测变量都需要采用单向量列的形式,通常称为features列。你需要它使用VectorAssembler如下创建:

import org.apache.spark.ml.feature.VectorAssembler 
import org.apache.spark.ml.linalg.Vectors 

//creating features column 
val assembler = new VectorAssembler() 
    .setInputCols(Array(" insert your column names here ")) 
    .setOutputCol("Feature") 

参见:https://spark.apache.org/docs/latest/ml-features.html#vectorassembler

现在您可以开始拟合逻辑回归模型。用于在fitting之前组合数据的多个转换pipeline

val pipeline = new Pipeline().setStages(Array(assembler,lr)) 

//fitting the model 
val lrModel = pipeline.fit(df) 
+0

如果我用这个lrModel不能产生任何系数,即决处决或任意其它things.Could请您解释一下为什么会这样 – Ricky

+0

星火ML只能取数值作为输入。由于您的预测变量列包含分类值(P,N,A,...),因此您需要先将它们转换为数值。使用'StringIndexer'或'OneHotEncoder'来完成它并将结果列名传递给'VectorAssembler'输入。请参阅:https://spark.apache.org/docs/latest/ml-features.html#stringindexer和https://spark.apache.org/docs/latest/ml-features.html#onehotencoder。我希望你很清楚。 – vdep