2016-03-21 17 views
3

Bir LogisticRegression öğesinin gerçekte eğitilmesi için OneHotEncoder örneğini değiştirdim. Sorum şu: oluşturulan ağırlıkları kategorik değişkenlere nasıl eşleştirmeli?Değişken adları, boru hattından sonra özelliklerle eşleme nasıl yapılır

def oneHotEncoderExample(sqlContext: SQLContext): Unit = { 

val df = sqlContext.createDataFrame(Seq(
    (0, "a", 1.0), 
    (1, "b", 1.0), 
    (2, "c", 0.0), 
    (3, "d", 1.0), 
    (4, "e", 1.0), 
    (5, "f", 0.0) 
)).toDF("id", "category", "label") 
df.show() 

val indexer = new StringIndexer() 
    .setInputCol("category") 
    .setOutputCol("categoryIndex") 
    .fit(df) 
val indexed = indexer.transform(df) 
indexed.select("id", "categoryIndex").show() 

val encoder = new OneHotEncoder() 
    .setInputCol("categoryIndex") 
    .setOutputCol("features") 
val encoded = encoder.transform(indexed) 
encoded.select("id", "features").show() 


val lr = new LogisticRegression() 
    .setMaxIter(10) 
    .setRegParam(0.01) 

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

// Fit the pipeline to training documents. 
val pipelineModel = pipeline.fit(df) 

val lorModel = pipelineModel.stages.last.asInstanceOf[LogisticRegressionModel] 
println(s"LogisticRegression: ${(lorModel :LogisticRegressionModel)}") 
// Print the weights and intercept for logistic regression. 
println(s"Weights: ${lorModel.coefficients} Intercept: ${lorModel.intercept}") 
} 

Çıkışlar

Ağırlıklar: [1,5098946631236487, -5.509833649232324,1.5098946631236487,1.5098946631236487, -5,509833649232324] Geçiş: 2,6679020381781235

+0

Şu anki yinelenen soruya bakın: https://stackoverflow.com/q/42935914/166686 – mjv

cevap

5

varsayıyorum burada ne istediğiniz özellikleri meta bir erişim olduğu .

val meta: org.apache.spark.sql.types.Metadata = transformedDF 
    .schema(transformedDF.schema.fieldIndex("features")) 
    .metadata 

Nihayet özü niteliklerini sağlar:

meta.getMetadata("ml_attr").getMetadata("attrs") 
// org.apache.spark.sql.types.Metadata = {"binary":[ 
// {"idx":0,"name":"e"},{"idx":1,"name":"f"},{"idx":2,"name":"a"}, 
// {"idx":3,"name":"b"},{"idx":4,"name":"c"}]} 

Bunlar geri ağırlıkları ilişkilendirmek için kullanılabilir

val transformedDF = pipelineModel.transform(df) 

Sonraki meta veri nesne elde edebilirsiniz: DataFrame mevcut dönüştürülmesi ile başlayalım orijinal özellikler

+0

Teşekkürler! ve diğerleri için not bu özellik adı erişmek için gerekli olan: val özelliğiMeta = meta.getMetadata ("ml_attr"). getMetadata ("attrs") özelliğiMeta.getMetadataArray ("sayısal") (0) .getString (" ad ") – lapolonio

+0

.getMetadata (" attrs ") işlevinin ardından bölüm, duruma göre farklılık gösterecektir. Orada farklı gruplar olabilir ('ikili ',' sayısal 'vb.) – zero323

İlgili konular