«Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!» — data scientist в Стране Чудес.
Наука о данных вынуждена, как минимум, идти в ногу с постоянно увеличивающимися объемами и сложностью данных, а в идеальном случае стараться опережать и предупреждать потенциальные проблемы, возникающие при их обработке.
В этом докладе вы увидите, как Scala-библиотеки Saddle, Smile и Spark помогают науке о данных отвечать постоянно эволюционирующим требованиям инфраструктуры, облегчая анализ и расширяя возможности описательной статистики, обработки данных и машинного обучения. В этом им помогают функциональные аспекты языка Scala, его благоприятная экосистема больших данных и гибридность с объектно-ориентированным программированием.
На примере предсказания кликов на рекламных пространствах интернета мы исследуем с вами возможности, преимущества и пути развития Scala для науки о данных.
3. Anastasia Lieva “Big Data Science in Scala” Joker 2017
3
Anastasia Lieva @lievAnastazia “Big Data Science in Scala” Joker 2017
4. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Functional
Programming
Montpellier
4
Anastasia Lieva @lievAnastazia “Big Data Science in Scala” Joker 2017
5. План.
1. Почему Scala ?
2. Обзор библиотек Data-Science на Scala
3. Что за проблему решаем сегодня?
4. Замарать руки в коде
5. Подвести итоги и выбрать
подходящую нам библиотеку!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
5
6. План.
1. Почему Scala ?
2. Обзор библиотек Data-Science на Scala
3. Что за проблему решаем сегодня?
4. Замарать руки в коде
5. Подвести итоги и выбрать
подходящую нам библиотеку!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
6
7. Сырые данные: 200 000 запросов в секунду
8 Терабайт в день
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Технологии RTB
7
8. Сырые данные: 200 000 запросов в секунду
8 Терабайт в день
Anastasia Lieva “Big Data Science in Scala” Joker 2017
BIG DATA ?
8
Технологии RTB
9. Сырые данные: 200 000 запросов в секунду
8 Терабайт в день
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Технологии RTB
9
10. Сырые данные: 200 000 запросов в секунду
8 Терабайт в день
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Технологии RTB
10
14. План.
1. Почему Scala ?
2. Обзор библиотек Data-Science на Scala
3. Что за проблему решаем сегодня?
4. Замарать руки в коде
5. Подвести итоги и выбрать
подходящую нам библиотеку!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
14
15. Ограничьте пространство поиска!
Какую библиотеку выбрать?
Spark Smile Breeze Saddle
Обучающий
/оптимизирующий
алгоритм
Математический
статистический
анализ
Конфигурация/
оптимизация
алгоритма
Предобработка
данных
Оценка моделей
и качества
анализа
Визуализация
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Высокоуровневые
методы
Низкоуровневые методы
и/или структуры данных
Примитивы для
элементарных
задач
15
16. DeepLearning
.scala
(ThoughtWorks) Neuron DeepLearning4j
BigDL
(on top of Spark)
Глубокое
Обучение
Ограничьте пространство поиска!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Высокоуровневые
методы
Низкоуровневые методы
и/или структуры данных
Примитивы для
элементарных задач
16
Какую библиотеку выбрать?
29. API на основе датафреймов
● Классификация
● Кластеризация
● Регрессионный анализ
● Линейные методы
● Алгоритмы на основе деревьев
● Обработка естественного языка
● ………………..и многие другие!
Обучение данных: Spark MLlib
Anastasia Lieva “Big Data Science in Scala” Joker 2017
29
30. Spark MLlib :
Pipelines
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Transformation
Extraction
Selection
Предобработкаданных
30
31. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Transformation
Extraction
Selection
Algorithm
configuration
Learning by
algorithm
Evaluation
Обучение
данных
Предобработкаданных
Spark MLlib :
Pipelines
31
32. Spark MLlib : графический интерфейс
Anastasia Lieva “Big Data Science in Scala” Joker 2017
32
33. API на основе массивов
Обучение данных: SMILE
● Классификация
● Кластеринг
● Регрессионный анализ
● Линейные методы
● Алгоритмы на основе деревьев
● Обработка естественного языка
● ………………..и многие другие!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
33
34. Обучение данных: SMILE
Anastasia Lieva “Big Data Science in Scala” Joker 2017
★ Vector Quantization
★ Association Rule Mining
★ Manifold learning
★ Multi-dimensional scaling
БОЛьШЕ
★ алгоритмов кластеризации
★ методов замещения отсутствующих данных
34
35. План.
1. Почему Scala ?
2. Обзор библиотек Data-Science на Scala
3. Что за проблему решаем сегодня?
4. Замарать руки в коде
5. Подвести итоги и выбрать
подходящую нам библиотеку!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
35
37. Нам нужно знать вероятность того,
что вы кликните на рекламу
на основании :
Anastasia Lieva “Big Data Science in Scala” Joker 2017
37
Задача:
Оптимизировать уровень кликов
афишируемых реклам
38. Нам нужно знать вероятность того,
что вы кликните на рекламу
на основании :
● конфигурации запроса
Anastasia Lieva “Big Data Science in Scala” Joker 2017
38
Задача:
Оптимизировать уровень кликов
показанных реклам
39. Нам нужно знать вероятность того,
что вы кликните на рекламу
на основании :
● конфигурации запроса
● креативного формата рекламы
Anastasia Lieva “Big Data Science in Scala” Joker 2017
39
Задача:
Оптимизировать уровень кликов
показанных реклам
40. Нам нужно знать вероятность того,
что вы кликните на рекламу
на основании :
● конфигурации запроса
● креативного формата рекламы
● истории пользователя
Anastasia Lieva “Big Data Science in Scala” Joker 2017
40
Задача:
Оптимизировать уровень кликов
показанных реклам
41. Нам нужно знать вероятность того,
что вы кликните на рекламу
на основании :
● конфигурации запроса
● креативного формата рекламы
● истории пользователя
● сторонней и мета-информации
Anastasia Lieva “Big Data Science in Scala” Joker 2017
41
Задача:
Оптимизировать уровень кликов
показанных реклам
45. Anastasia Lieva “Big Data Science in Scala” Joker 2017
OS
Category City
Click Click
Non
Click
Non
Click
Android
iOs
Games
Music
Moscow
Paris
OS
Category City
Click Click
Non
Click
Non
Click
Android
iOs
Games
Music
Moscow
Paris
OS
Category City
Click Click
Non
Click
Non
Click
Android
iOs
Games
Music
Moscow
Paris
Усреднение результатов всех деревьев леса
45
Алгоритм: случайный лес (Random Forest)
46. Дерево решений
Anastasia Lieva “Big Data Science in Scala” Joker 2017
OS
Category City
Click Click
Non
Click
Non
Click
Android
iOs
Games
Music
Moscow
Paris
46
Алгоритм: случайный лес (Random Forest)
47. Алгоритм: случайный лес (Random Forest)
Дерево решений
Anastasia Lieva “Big Data Science in Scala” Joker 2017
OS
Category City
Click Click
Non
Click
Non
Click
Android
iOs
Games
Music
Moscow
Paris
Количество
случайных
признаков для
разбиения
47
48. Алгоритм: случайный лес (Random Forest)
Дерево решений
Anastasia Lieva “Big Data Science in Scala” Joker 2017
OS
Category City
Click Click
Non
Click
Non
Click
Android
iOs
Games
Music
Moscow
Paris
Количество
случайных
признаков для
разбиенияКритерий
разбиения
48
49. Алгоритм: случайный лес (Random Forest)
Дерево решений
Anastasia Lieva “Big Data Science in Scala” Joker 2017
OS
Category City
Click Click
Non
Click
Non
Click
Android
iOs
Games
Music
Moscow
Paris
Количество
случайных
признаков для
разбиенияКритерий
разбиения
г
л
у
б
и
н
а
49
50. Алгоритм: случайный лес (Random Forest)
Anastasia Lieva “Big Data Science in Scala” Joker 2017
OS
Category City
Click Click
Non
Click
Non
Click
Android
iOs
Games
Music
Moscow
Paris
OS
Category City
Click Click
Non
Click
Non
Click
Android
iOs
Games
Music
Moscow
Paris
OS
Category City
Click Click
Non
Click
Non
Click
Android
iOs
Games
Music
Moscow
Paris
Количество
деревьев
50
53. Os MaxPrice Time
Android 7.3 2016-06-09T0:25:28Z
iOS 4.55 2016-05-09T14:23:12Z
WindowsPhone 2.89 2016-06-09T11:35:11Z
Anastasia Lieva “Big Data Science in Scala” Joker 2017
53
54. Os MaxPrice Time
Android 7.3 2016-06-09T0:25:28Z
iOS 4.55 2016-05-09T14:23:12Z
WindowsPhone 2.89 2016-06-09T11:35:11Z
Anastasia Lieva “Big Data Science in Scala” Joker 2017
54
55. Os MaxPrice Time
Android 7.3 2016-06-09T0:25:28Z
iOS 4.55 2016-05-09T14:23:12Z
WindowsPhone 2.89 2016-06-09T11:35:11Z
Anastasia Lieva “Big Data Science in Scala” Joker 2017
55
56. Os MaxPrice Time
Android 7.3 2016-06-09T0:25:28Z
iOS 4.55 2016-05-09T14:23:12Z
WindowsPhone 2.89 2016-06-09T11:35:11Z
Anastasia Lieva “Big Data Science in Scala” Joker 2017
56
57. Os MaxPrice Time
Android 7.3 2016-06-09T0:25:28Z
iOS 4.55 2016-05-09T14:23:12Z
WindowsPhone 2.89 2016-06-09T11:35:11Z
Click
False
True
False
Anastasia Lieva “Big Data Science in Scala” Joker 2017
57
58. Os MaxPrice Time
Android 7.3 2016-06-09T0:25:28Z
iOS 4.55 2016-05-09T14:23:12Z
WindowsPhone 2.89 2016-06-09T11:35:11Z
Click
False
True
False
Os MaxPrice Time
3.0 6.0 1.0
5.0 3.0 5.0
1.0 2.0 3.0
Anastasia Lieva “Big Data Science in Scala” Joker 2017
58
59. План.
1. Почему Scala ?
2. Обзор библиотек Data-Science на Scala
3. Что за проблему решаем сегодня?
4. Замарать руки в коде
5. Подвести итоги и выбрать
подходящую нам библиотеку!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
59
67. Индексируем
категориальные данные
Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val cityIndexed: Map[String, Double] = dataframe
.col("city")
.toSeq
.map(_._3)
.distinct
.zipWithIndex
.toMap
.mapValues(_.toDouble)
val transformedDataframe: Frame[Int, String, Double] = dataframe
.col("city")
.rtransform { series =>
val citySeries = "city" -> cityIndexed(
series.get("city").get.asInstanceOf[String]
)
series.concat(citySeries)
}
67
68. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val cityIndexed: Map[String, Double] = dataframe
.col("city")
.toSeq
.map(_._3)
.distinct
.zipWithIndex
.toMap
.mapValues(_.toDouble)
val transformedDataframe: Frame[Int, String, Double] = dataframe
.col("city")
.rtransform { series =>
val citySeries = "city" -> cityIndexed(
series.get("city").get.asInstanceOf[String]
)
series.concat(citySeries)
}
City Index
Saint Petersburg 0
Montpellier 1
Moscow 2
68
Индексируем
категориальные данные
69. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val cityIndexed: Map[String, Double] = dataframe
.col("city")
.toSeq
.map(_._3)
.distinct
.zipWithIndex
.toMap
.mapValues(_.toDouble)
val transformedDataframe: Frame[Int, String, Double] = dataframe
.col("city")
.rtransform { series =>
val citySeries = "city" -> cityIndexed(
series.get("city").get.asInstanceOf[String]
)
series.concat(citySeries)
}
69
Индексируем
категориальные данные
70. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val cityIndexed: Map[String, Double] = dataframe
.col("city")
.toSeq
.map(_._3)
.distinct
.zipWithIndex
.toMap
.mapValues(_.toDouble)
val transformedDataframe: Frame[Int, String, Double] = dataframe
.col("city")
.rtransform { series =>
val citySeries = "city" -> cityIndexed(
series.get("city").get.asInstanceOf[String]
)
series.concat(citySeries)
}
Frame[Int, String, Any] =>
Seq[Any]
70
Индексируем
категориальные данные
71. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val cityIndexed: Map[String, Double] = dataframe
.col("city")
.toSeq
.map(_._3)
.distinct
.zipWithIndex
.toMap
.mapValues(_.toDouble)
val transformedDataframe: Frame[Int, String, Double] = dataframe
.col("city")
.rtransform { series =>
val citySeries = "city" -> cityIndexed(
series.get("city").get.asInstanceOf[String]
)
series.concat(citySeries)
}
List((Paris,0), (London,1),
(Moscow,2), (Cherkessk,3)
71
Индексируем
категориальные данные
72. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val cityIndexed: Map[String, Double] = dataframe
.col("city")
.toSeq
.map(_._3)
.distinct
.zipWithIndex
.toMap
.mapValues(_.toDouble)
val transformedDataframe: Frame[Int, String, Double] = dataframe
.col("city")
.rtransform { series =>
val citySeries = "city" -> cityIndexed(
series.get("city").get.asInstanceOf[String]
)
series.concat(citySeries)
}
Map(London -> 1.0, Moscow -> 2.0,
Paris -> 0.0, Cherkessk -> 3.0)
72
Индексируем
категориальные данные
73. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val cityIndexed: Map[String, Double] = dataframe
.col("city")
.toSeq
.map(_._3)
.distinct
.zipWithIndex
.toMap
.mapValues(_.toDouble)
val transformedDataframe: Frame[Int, String, Double] = dataframe
.col("city")
.rtransform { series =>
val citySeries = "city" -> cityIndexed(
series.get("city").get.asInstanceOf[String]
)
series.concat(citySeries)
}
Map(London -> 1.0, Moscow -> 2.0,
Paris -> 0.0, Cherkessk -> 3.0)
73
Индексируем
категориальные данные
74. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val cityIndexed: Map[String, Double] = dataframe
.col("city")
.toSeq
.map(_._3)
.distinct
.zipWithIndex
.toMap
.mapValues(_.toDouble)
val transformedDataframe: Frame[Int, String, Double] = dataframe
.col("city")
.rtransform { series =>
val citySeries = "city" -> cityIndexed(
series.get("city").get.asInstanceOf[String]
)
series.concat(citySeries)
}
74
Индексируем
категориальные данные
75. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val cityIndexed: Map[String, Double] = dataframe
.col("city")
.toSeq
.map(_._3)
.distinct
.zipWithIndex
.toMap
.mapValues(_.toDouble)
val transformedDataframe: Frame[Int, String, Double] = dataframe
.col("city")
.rtransform { series =>
val citySeries = "city" -> cityIndexed(
series.get("city").get.asInstanceOf[String]
)
series.concat(citySeries)
}
75
Индексируем
категориальные данные
76. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val cityIndexed: Map[String, Double] = dataframe
.col("city")
.toSeq
.map(_._3)
.distinct
.zipWithIndex
.toMap
.mapValues(_.toDouble)
val transformedDataframe: Frame[Int, String, Double] = dataframe
.col("city")
.rtransform { series =>
val citySeries = "city" -> cityIndexed(
series.get("city").get.asInstanceOf[String]
)
series.concat(citySeries)
}
76
Индексируем
категориальные данные
Series[String, Any]
77. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val cityIndexed: Map[String, Double] = dataframe
.col("city")
.toSeq
.map(_._3)
.distinct
.zipWithIndex
.toMap
.mapValues(_.toDouble)
val transformedDataframe: Frame[Int, String, Double] = dataframe
.col("city")
.rtransform { series =>
val citySeries = "city" -> cityIndexed(
series.get("city").get.asInstanceOf[String]
)
series.concat(citySeries)
}
77
Индексируем
категориальные данные
78. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val shuffledDF: Frame[Int, String, Double] =
transformedDataframe
.sortedRowsBy(_ => Random.nextDouble)
.resetRowIndex
val (testSet, trainSet) = shuffledDF
.rowSplitAt((0.1 * shuffledDF.numRows).toInt)
Разбиваем данные
случайным образом на
тренировочную и тестовую
выборки
78
79. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val shuffledDF: Frame[Int, String, Double] =
transformedDataframe
.sortedRowsBy(_ => Random.nextDouble)
.resetRowIndex
val (testSet, trainSet) = shuffledDF
.rowSplitAt((0.1 * shuffledDF.numRows).toInt)
Разбиваем данные
случайным образом на
тренировочную и тестовую
выборки
79
80. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val shuffledDF: Frame[Int, String, Double] =
transformedDataframe
.sortedRowsBy(_ => Random.nextDouble)
.resetRowIndex
val (testSet, trainSet) = shuffledDF
.rowSplitAt((0.1 * shuffledDF.numRows).toInt)
Разбиваем данные
случайным образом на
тренировочную и тестовую
выборки
80
81. Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val shuffledDF: Frame[Int, String, Double] =
transformedDataframe
.sortedRowsBy(_ => Random.nextDouble)
.resetRowIndex
val (testSet, trainSet) = shuffledDF
.rowSplitAt((0.1 * shuffledDF.numRows).toInt)
Разбиваем данные
случайным образом на
тренировочную и тестовую
выборки
81
82. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Saddle
Удобные для науки о данных структуры :
фреймы, матрицы, серии, векторы
82
83. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Saddle
Удобные для науки о данных структуры :
фреймы, матрицы, серии, векторы
Не в активной разработке
Не типизированные датафреймы
83
94. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
Dataset
Dataframe
SQL
query
94
95. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
95
SQL
query
dataframe.createOrReplaceTempView("data")
sparkSession.sql("
SELECT * FROM data WHERE click=true
")
96. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
96
SQL
query
dataframe.createOrReplaceTempView("data")
sparkSession.sql("
SELECT * FROM data WHERE click=true
")
97. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
97
SQL
query
dataframe.createOrReplaceTempView("data")
sparkSession.sql("
SELECT * FROM data WHERE click=true
")
98. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
98
SQL
query
dataframe.createOrReplaceTempView("data")
sparkSession.sql("
SELECT * FROM data WHERE click=true
")
99. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
99
SQL
query
dataframe.createOrReplaceTempView("data")
sparkSession.sql("
SELECT * FROM data WHERE click=true
")
100. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
100
SQL
query
dataframe.createOrReplaceTempView("data")
sparkSession.sql("
WRITE WHAT U WANT CRAZY_OPERATOR CRAZY_COLUMN=true
")
101. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Dataframe
101
dataframe.where($"click" === true)
102. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Dataframe
102
dataframe.where($"click" === true)
103. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Dataframe
103
dataframe.where($"CRAZY_COLUMN" === true)
104. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Dataframe
104
dataframe.CRAZY_METHOD($"click" === true)
111. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
dataset.CRAZY_OPERATOR(_.CRAZY_COLUMN==true)
Dataset
111
112. Dataframe
Индексируем категориальные данные
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val indexer = new StringIndexer()
.setInputCol("city")
.setOutputCol("cityIdx")
.fit(dataframe)
val indexedDataframe: DataFrame = indexer
.transform(dataframe)
City Index
Saint Petersburg 0
Montpellier 1
Moscow 2
112
113. Dataframe
Индексируем категориальные данные
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val indexer = new StringIndexer()
.setInputCol("city")
.setOutputCol("cityIdx")
.fit(dataframe)
val indexedDataframe: DataFrame = indexer
.transform(dataframe)
City Index
Saint Petersburg 0
Montpellier 1
Moscow 2
113
Estimator
Transformer
114. Dataframe
Индексируем категориальные данные
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val indexer = new StringIndexer()
.setInputCol("city")
.setOutputCol("cityIdx")
.fit(dataframe)
val indexedDataframe: DataFrame = indexer
.transform(dataframe)
City Index
Saint Petersburg 0
Montpellier 1
Moscow 2
114
Estimator
Transformer
115. Dataframe
Индексируем категориальные данные
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val indexer = new StringIndexer()
.setInputCol("city")
.setOutputCol("cityIdx")
.fit(dataframe)
val indexedDataframe: DataFrame = indexer
.transform(dataframe)
City Index
Saint Petersburg 0
Montpellier 1
Moscow 2
115
Estimator
Transformer
116. Dataframe
Индексируем категориальные данные
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val indexer = new StringIndexer()
.setInputCol("city")
.setOutputCol("cityIdx")
.fit(dataframe)
val indexedDataframe: DataFrame = indexer
.transform(dataframe)
City Index
Saint Petersburg 0
Montpellier 1
Moscow 2
116
117. Dataframe
Индексируем категориальные данные
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val indexer = new StringIndexer()
.setInputCol("city")
.setOutputCol("cityIdx")
.fit(dataframe)
val indexedDataframe: DataFrame = indexer
.transform(dataframe)
City Index
Saint Petersburg 0
Montpellier 1
Moscow 2
117
118. Dataframe
Индексируем категориальные данные
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val indexer = new StringIndexer()
.setInputCol("city")
.setOutputCol("cityIdx")
.fit(dataframe)
val indexedDataframe: DataFrame = indexer
.transform(dataframe)
City Index
Saint Petersburg 0
Montpellier 1
Moscow 2
118
119. Dataframe
Индексируем категориальные данные
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val indexer = new StringIndexer()
.setInputCol("city")
.setOutputCol("cityIdx")
.fit(dataframe)
val indexedDataframe: DataFrame = indexer
.transform(dataframe)
City Index
Saint Petersburg 0
Montpellier 1
Moscow 2
119
120. Dataframe
Индексируем категориальные данные
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val indexer = new StringIndexer()
.setInputCol("city")
.setOutputCol("cityIdx")
.fit(dataframe)
val indexedDataframe: DataFrame = indexer
.transform(dataframe)
City Index
Saint Petersburg 0
Montpellier 1
Moscow 2
120
121. Dataframe
Адаптируем данные
к формату
ожидаемому на входе алгоритма
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
features label
[1.0, 11.0, 15.0, 1.0, 16.0] 1.0
[7.0, 789.0, 25.0, 0.0, 271.0, 0.0] 0.0
os city category position publisher click
1.0 11.0 15.0 1.0 16.0 1.0
7.0 789.0 25.0 0.0 271.0 0.0
121
122. Dataframe
Адаптируем данные
к формату
ожидаемому на входе алгоритма
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val assembler: VectorAssembler = new VectorAssembler()
.setInputCols(featuresList)
.setOutputCol("features")
val finalDataframe: DataFrame = assembler
.transform(dataframe)
122
123. Dataframe
Адаптируем данные
к формату
ожидаемому на входе алгоритма
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val assembler: VectorAssembler = new VectorAssembler()
.setInputCols(featuresList)
.setOutputCol("features")
val finalDataframe: DataFrame = assembler
.transform(dataframe)
123
124. DataframeРазбиваем данные
случайным образом
на тренировочную и тестовую выборки
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val Array(trainSet, testSet) =
finalDataframe
.randomSplit(Array(0.9, 0.1))
124
126. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
● Готовые оптимизированные методы
для feature engineering/selection
126
127. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
● Готовые оптимизированные методы
для feature engineering/selection
● Типизированные структуры - Datasets
127
128. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
● Готовые оптимизированные методы
для feature engineering/selection
● Типизированные структуры - Datasets
● Возможность очень типизированных структур с
Frameless Datasets
128
129. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
● Готовые оптимизированные методы
для feature engineering/selection
● Типизированные структуры - Datasets
● Возможность очень типизированных структур с
Frameless Datasets
● Возможность делать SQL
с минимальным уровнем типизации : синтаксиса
129
131. Конструируем классификатор
и конфигурируем его
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val forest = new RandomForestClassifier()
.setLabelCol("click")
.setFeaturesCol("features")
.setNumTrees(100)
.setMaxDepth(30)
131
132. Конструируем классификатор
и конфигурируем его
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val forest = new RandomForestClassifier()
.setLabelCol("click")
.setFeaturesCol("features")
.setNumTrees(100)
.setMaxDepth(30)
.setMaxBins .setMinInfoGain
.setCacheNodeIds .setCheckpointInterval
.setSeed .setMaxMemoryInMB
.setThresholds .setMinInstancesPerNode
.setImpurity .setFeatureSubsetStrategy
132
133. Запускаем обучение
на обучающей выборке
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val model: RandomForestClassificationModel =
forest
.fit(trainSet)
model
.write .impurity
.treeWeights .checkpointInterval
.featureImportances .getMinInfoGain
._trees .getFeatureSubsetStrategy
val prediction: DataFrame =
model
.transform(testSet)
133
134. Запускаем обучение
на обучающей выборке
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val model: RandomForestClassificationModel =
forest
.fit(trainSet)
model
.write .impurity
.treeWeights .checkpointInterval
.featureImportances .getMinInfoGain
._trees .getFeatureSubsetStrategy
val prediction: DataFrame =
model
.transform(testSet)
134
135. Запускаем обучение
на обучающей выборке
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val model: RandomForestClassificationModel =
forest
.fit(trainSet)
model
.write .impurity
.treeWeights .checkpointInterval
.featureImportances .getMinInfoGain
._trees .getFeatureSubsetStrategy
val prediction: DataFrame =
model
.transform(testSet)
135
136. Запускаем обучение
на обучающей выборке
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val model: RandomForestClassificationModel =
forest
.fit(trainSet)
model
.write .impurity
.treeWeights .checkpointInterval
.featureImportances .getMinInfoGain
._trees .getFeatureSubsetStrategy
val prediction: DataFrame =
model
.transform(testSet)
136
137. Собираем все элементы в PipelineSpark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Bucketizer
Vector
Assembler
Forest
Algorithme
Indexer
Tokenizer
137
138. Собираем все элементы в PipelineSpark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val randomForestPipeline = new Pipeline()
.setStages(Array(
indexer,
tokenizer,
bucketizer,
vectorAssembler,
forest)
)
val model = randomForestPipeline.fit(trainSet)
138
139. Собираем все элементы в PipelineSpark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val randomForestPipeline = new Pipeline()
.setStages(Array(
indexer,
tokenizer,
bucketizer,
vectorAssembler,
forest)
)
val model = randomForestPipeline.fit(trainSet)
139
140. Собираем все элементы в PipelineSpark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val randomForestPipeline = new Pipeline()
.setStages(Array(
indexer,
tokenizer,
bucketizer,
vectorAssembler,
forest)
)
val model = randomForestPipeline.fit(trainSet)
140
141. Собираем все элементы в PipelineSpark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val randomForestPipeline = new Pipeline()
.setStages(Array(
indexer,
tokenizer,
bucketizer,
vectorAssembler,
forest)
)
val model = randomForestPipeline.fit(trainSet)
141
142. Собираем все элементы в PipelineSpark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val randomForestPipeline = new Pipeline()
.setStages(Array(
indexer,
tokenizer,
bucketizer,
vectorAssembler,
forest)
)
val model = randomForestPipeline.fit(trainSet)
142
151. Метрики
оценки
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark Smile
Binary
Classification
Regression
Multiclass
Classification
Classification
Regression
151
152. Метрики
оценки
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark Smile
Binary
Classification
Regression
Multiclass
Classification
Classification
Regression
152
153. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Был клик Не было
клика
Предсказание
клика 100 20
Предсказание
нет клика 300 580
153
154. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Был клик Не было
клика
Предсказание
клика
100 20
Предсказание
нет клика
300 580
FALSE POSITIVES
FALSE NEGATIVES
154
155. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Был клик Не было
клика
Предсказание
клика
100 20
Предсказание
нет клика
300 580
TRUE POSITIVES
TRUE NEGATIVES
155
156. F1-SCORE
Anastasia Lieva “Big Data Science in Scala” Joker 2017
FALSE POSITIVES
FALSE NEGATIVES
TRUE POSITIVES
TRUE NEGATIVES
ACCURACY
PRECISION
RECALL
FALL-OUT MISS RATE
TRUE
NEGATIVE
RATE
156
157. Сравниваем Случайный лес Spark и Smile
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Метрики классификации
157
158. Сравниваем Случайный лес Spark и Smile
Больше значение =лучше Меньше значение =
лучше
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Метрики классификации
158
159. Подбираем оптимальные
параметры алгоритма
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val forest = new RandomForestClassifier()
.setLabelCol("click")
.setFeaturesCol("features")
val randomForestGrid = new ParamGridBuilder()
.addGrid(forest.impurity, Array("entropy", "gini"))
.addGrid(forest.cacheNodeIds, Array(true, false))
.addGrid(forest.maxDepth, Array(5, 10, 20, 30))
.addGrid(forest.maxMemoryInMB, Array(256, 512) )
.build()
159
160. Подбираем оптимальные
параметры алгоритма
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val forest = new RandomForestClassifier()
.setLabelCol("click")
.setFeaturesCol("features")
val randomForestGrid = new ParamGridBuilder()
.addGrid(forest.impurity, Array("entropy", "gini"))
.addGrid(forest.cacheNodeIds, Array(true, false))
.addGrid(forest.maxDepth, Array(5, 10, 20, 30))
.addGrid(forest.maxMemoryInMB, Array(256, 512) )
.build()
160
161. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val trainValidationSplit =
new TrainValidationSplit()
.setEstimator(tree)
.setEvaluator(new BinaryClassificationEvaluator)
.setEstimatorParamMaps(randomForestGrid)
.setTrainRatio(0.7)
val bestModel = trainValidationSplit.fit(trainSet)
Подбираем оптимальные
параметры алгоритма
161
162. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val trainValidationSplit =
new TrainValidationSplit()
.setEstimator(tree)
.setEvaluator(new BinaryClassificationEvaluator)
.setEstimatorParamMaps(randomForestGrid)
.setTrainRatio(0.7)
val bestModel = trainValidationSplit.fit(trainSet)
Подбираем оптимальные
параметры алгоритма
162
163. Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val trainValidationSplit =
new TrainValidationSplit()
.setEstimator(tree)
.setEvaluator(new BinaryClassificationEvaluator)
.setEstimatorParamMaps(randomForestGrid)
.setTrainRatio(0.7)
val bestModel = trainValidationSplit.fit(trainSet)
Подбираем оптимальные
параметры алгоритма
163
164. План.
1. Почему Scala ?
2. Обзор библиотек Data-Science на Scala
3. Что за проблему решаем сегодня?
4. Замарать руки в коде
5. Подвести итоги и выбрать
подходящую нам библиотеку!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
164
165. Anastasia Lieva “Big Data Science in Scala” Joker 2017
Предобработка данных Spark и Saddle
64 GB RAM, 16 CPU
165
166. Обучение : Случайный лес Spark и Smile
на 200 GB данных
Smile : 64 GB RAM, 16 CPU
Spark : cluster 7 nodes, each of 30 GB RAM/16 CPU
Anastasia Lieva “Big Data Science in Scala” Joker 2017
166
167. Мой List[tools]
(для сегодняшнего примера!!):
Preprocessing
Spark
Machine Learning
(Random Forest)
Smile
Anastasia Lieva “Big Data Science in Scala” Joker 2017
167
169. R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
169
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
170. R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
170
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
171. R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
171
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
● и экосистема Big Data !
172. R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
172
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
● и экосистема Big Data !
● Оптимизированные структуры данных
и методы их обработки
173. R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
173
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
● и экосистема Big Data !
● Оптимизированные структуры данных
и методы их обработки
● Мощность и богатство функционального программирования
174. R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
174
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
● и экосистема Big Data !
● Оптимизированные структуры данных
и методы их обработки
● Мощность и богатство функционального программирования
● Но если очень хочется - можно всегда ООП
175. R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
175
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
● и экосистема Big Data !
● Оптимизированные структуры данных
и методы их обработки
● Мощность и богатство функционального программирования
● Но если очень хочется - можно всегда ООП
● Типобезопасный код - наш выбор!