Как да извърша регресионен анализ в Spark MLlib за определяне на отлив в телеком индустрията?

Работя върху churn предвиждане (дали клиент се премести в друга компания) в телеком индустрията, използвайки decision tree(supervised learning). Имам набор от данни със следната структура (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
Така че в случай на моя случай нито една от моите функции (всички колони с изключение на колоната за отлив) не е категорична. Отливът има стойност true/false (или 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