Как выполнить регрессионный анализ в Spark MLlib для определения оттока в телекоммуникационной отрасли?

Я работаю над churn прогнозированием (перейдет ли клиент в другую компанию) в телекоммуникационной отрасли, используя _2 _ (_ 3_). У меня есть набор данных со следующей структурой (csv данных):

number vmail messages,total call minutes,total number of calls,total call charge,number of customer service calls,churn

В этом последнем столбце (churn) является столбец значений true или false и служит меткой. Во время тестирования я хочу предсказать значения для этого столбца (либо истина-ложь, либо 0-1). Я сомневаюсь, что как я могу обучить данные с помощью алгоритма Spark MLlibs decision tree? Я просматривал regression example, указанный в документации, и я не могут понять, где они предоставляют labels во время фазы обучения. В примере есть:

val categoricalFeaturesInfo = Map[Int, Int]()
val impurity = "variance"
val maxDepth = 5
val maxBins = 32

val model = DecisionTree.trainRegressor(trainingData, categoricalFeaturesInfo, impurity,
  maxDepth, maxBins) 

Поскольку это обучение с учителем, не должны ли мы также предоставлять метки при обучении модели?

Как я могу обучить мою модель на моих данных, предоставив labels, а затем протестировать, чтобы предсказать labels для тестовых данных?


person user2966197    schedule 06.08.2015    source источник


Ответы (2)


Ну, поскольку то, что вы пытаетесь сделать, - это обучение с учителем, особенно проблема классификации. Ожидаемый DecisionTree ввод - это LabeledPoint. LabeledPoint - это, по сути, структура, указывающая, какая ваша целевая переменная (метка), и вектор ваших функций проверяется здесь:

https://spark.apache.org/docs/1.4.1/api/scala/#org.apache.spark.mllib.regression.LabeledPoint

Таким образом, вы используете это в качестве входных данных, вы также можете разделить LabeledPoint, если хотите, например, обучение и тестирование, или сделать цикл для cv или чего-то еще.

Важно то, что вы сопоставите свои истинные / ложные случаи с 1/0 перед тренировкой, и что это:

val categoricalFeaturesInfo = Map[Int, Int]()

используется для того, чтобы сообщить модели, какие из ваших функций являются категориальными, например, допустим, что только функции 1 и 2 являются категориальными, тогда вы должны записать это как:

val categoricalFeaturesInfo = Map[Int, Int]((1,2),(2,4))

это означает, что функция 1 является категориальной и имеет 2 уровня, а функция 2 - категориальной и имеет 4 уровня. Индекс здесь начинается с 0 !!. И вы должны сопоставить все свои категориальные особенности раньше с чем-то вроде 0,1,2,3 ... numberLevels.

Пример LabeledPoint, в основном вы сопоставляете свои данные, здесь предполагается, что ваши значения Double, и вы выбираете 1 в качестве LAbeledPoint и 2,3 в качестве функций.

val data = dataInput.rdd.map(x => LabeledPoint(x.getDouble(1),Vectors.dense(x.getDouble(2), x.getDouble(3)))

Надеюсь, это поможет.

person Dr VComas    schedule 06.08.2015
comment
Так что в моем случае ни одна из моих функций (все столбцы, кроме столбца оттока) не является категориальной. У оттока значение истина / ложь (или 0/1), но оно предназначено для метки. Итак, что для меня должно быть categoricalFeaturesInfo? Кроме того, в примере, приведенном в документации Spark, где они формируют LabeledPoint с метками и вектором функций? - person user2966197; 06.08.2015
comment
Если у вас нет категориального, то как в первом случае с пустой скобкой Map [Int, Int] (). Вам нужен пример LabeledPoint, я редактирую его там - person Dr VComas; 06.08.2015
comment
Можете ли вы также предоставить мне, как я могу сопоставить истинное / ложное значение определенного столбца, прочитанного из файла csv, с 0/1 в Spark с помощью python? - person user2966197; 07.08.2015
comment
Также код (пример LabledPoint), который вы предоставили, похоже, подходит для Scala. Как вы это делаете на Python? - person user2966197; 07.08.2015

Не уверен в преобразованиях, которые вы делаете с вашими csv данными после их прочтения, но вы должны сделать что-то подобное, чтобы преобразовать их в LabeledPoint, как указывал @DrVComas.

from pyspark.mllib.regression import LabeledPoint

def parseCsvLine(line):
    fl = line.split(',')
    l = len(fl)
    return LabeledPoint(fl[l-1], fl[0:l-1])

И затем обучающие данные, которые вы передаете в дерево решений, должны быть отображены следующим образом:

trainingData = rawData.map(parseCsvLine)

Надеюсь, это поможет.

person lrnzcig    schedule 09.08.2015