【问题标题】:Labelling points for classification in SparkSpark中分类的标记点
【发布时间】:2016-04-09 20:15:46
【问题描述】:

我正在尝试在this 电信数据集上运行多个分类器来预测客户流失。到目前为止,我已将我的数据集加载到 Spark RDD 中,但我不确定如何选择一列作为标签 - 在本例中为最后一列。不要求代码,而是简要说明 RDD 和 LabeledPoint 如何协同工作。我查看了官方 Spark github 中提供的示例,但它们似乎使用的是 libsvm 格式。

问题:LabeledPoint 是如何工作的,如何指定我的标签是什么?

到目前为止我的代码,如果有帮助的话:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.ml.classification.{RandomForestClassificationModel, RandomForestClassifier}
import org.apache.spark.ml.feature.StandardScaler
import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD, LogisticRegressionWithLBFGS, LogisticRegressionModel, NaiveBayes, NaiveBayesModel}

object{
   def main(args: Array[String]): Unit = {
    //setting spark context
    val conf = new SparkConf().setAppName("Churn")
    val sc = new SparkContext(conf)
    //loading and mapping data into RDD
    val csv = sc.textFile("file://filename.csv")
    val data = csv.map(line => line.split(",").map(elem => elem.trim))
    /* computer learns which points are features and labels here */
}
}

数据集如下所示:

State,Account Length,Area Code,Phone,Int'l Plan,VMail Plan,VMail Message,Day Mins,Day Calls,Day Charge,Eve Mins,Eve Calls,Eve Charge,Night Mins,Night Calls,Night Charge,Intl Mins,Intl Calls,Intl Charge,CustServ Calls,Churn?
KS,128,415,382-4657,no,yes,25,265.100000,110,45.070000,197.400000,99,16.780000,244.700000,91,11.010000,10.000000,3,2.700000,1,False.
OH,107,415,371-7191,no,yes,26,161.600000,123,27.470000,195.500000,103,16.620000,254.400000,103,11.450000,13.700000,3,3.700000,1,False.
NJ,137,415,358-1921,no,no,0,243.400000,114,41.380000,121.200000,110,10.300000,162.600000,104,7.320000,12.200000,5,3.290000,0,False.

【问题讨论】:

  • 我不确定你的问题是什么?
  • 我将对其进行编辑以使其更清晰 - 我的问题是:LabeledPoint 是如何工作的,我如何指定我的标签是什么?
  • LalebedPoint 是一个带有标签的数字向量。为了将您当前的数据转换为 LabeledPoints,您需要进行一些特征工程和一些转换。我建议您先阅读整个 MLlib 和 ML 文档,以便了解它的 DataTypes、Transformers 等,因为您的问题太宽泛,无法在 SO 范围内回答。
  • 你能更新/修复数据集的链接吗?

标签: scala apache-spark


【解决方案1】:

您需要确定您的功能是什么:例如电话号码将不是功能。因此,一些列将被删除。然后,您要将字符串列转换为数字。是的,您可以使用 ML 转换器来做到这一点,但在这种情况下,这是一种矫枉过正的做法。我会这样做(在单行数据上显示逻辑):

import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors

val line = "NJ,137,415,358-1921,no,no,0,243.400000,114,41.380000,121.200000,110,10.300000,162.600000,104,7.320000,12.200000,5,3.290000,0,False"
val arrl = line.split(",").map(_.trim)
val mr = Map("no"-> "0.0", "yes"-> "0.0", "False"->"0.0", "True" ->"1.0")
val stringvec = Array( arrl(2), mr(arrl(4)), mr(arrl(5))   ) ++ arrl.slice(6, 20)

val label = mr(arrl(20)).toDouble
val vec = stringvec.map(_.toDouble)
LabeledPoint( label, Vectors.dense(vec))

所以,回答您的问题:标记点是目标变量(在这种情况下,最后一列(作为 Double),客户是否流失),加上描述客户(在这种情况下为vec)。

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 2021-06-05
    • 2017-01-03
    • 2015-12-09
    • 1970-01-01
    • 2018-04-05
    • 2018-12-08
    • 1970-01-01
    • 2017-11-03
    相关资源
    最近更新 更多