SlideShare a Scribd company logo
1 of 177
Download to read offline
Big Data-Science
in Scala
Anastasia Lieva
Data Scientist
@lievAnastazia
1
Anastasia Lieva @lievAnastazia “Big Data Science in Scala” Joker 2017
2
Anastasia Lieva “Big Data Science in Scala” Joker 2017
3
Anastasia Lieva @lievAnastazia “Big Data Science in Scala” Joker 2017
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Functional
Programming
Montpellier
4
Anastasia Lieva @lievAnastazia “Big Data Science in Scala” Joker 2017
План.
1. Почему Scala ?
2. Обзор библиотек Data-Science на Scala
3. Что за проблему решаем сегодня?
4. Замарать руки в коде
5. Подвести итоги и выбрать
подходящую нам библиотеку!
Anastasia Lieva “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
6
Сырые данные: 200 000 запросов в секунду
8 Терабайт в день
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Технологии RTB
7
Сырые данные: 200 000 запросов в секунду
8 Терабайт в день
Anastasia Lieva “Big Data Science in Scala” Joker 2017
BIG DATA ?
8
Технологии RTB
Сырые данные: 200 000 запросов в секунду
8 Терабайт в день
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Технологии RTB
9
Сырые данные: 200 000 запросов в секунду
8 Терабайт в день
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Технологии RTB
10
R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
11
R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
12
Scala от SCALABLE
R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
13
SCALABLE :
GROWABLE & ENABLING GROWTH
План.
1. Почему Scala ?
2. Обзор библиотек Data-Science на Scala
3. Что за проблему решаем сегодня?
4. Замарать руки в коде
5. Подвести итоги и выбрать
подходящую нам библиотеку!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
14
Ограничьте пространство поиска!
Какую библиотеку выбрать?
Spark Smile Breeze Saddle
Обучающий
/оптимизирующий
алгоритм
Математический
статистический
анализ
Конфигурация/
оптимизация
алгоритма
Предобработка
данных
Оценка моделей
и качества
анализа
Визуализация
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Высокоуровневые
методы
Низкоуровневые методы
и/или структуры данных
Примитивы для
элементарных
задач
15
DeepLearning
.scala
(ThoughtWorks) Neuron DeepLearning4j
BigDL
(on top of Spark)
Глубокое
Обучение
Ограничьте пространство поиска!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Высокоуровневые
методы
Низкоуровневые методы
и/или структуры данных
Примитивы для
элементарных задач
16
Какую библиотеку выбрать?
R
Python
SQL
Scala
Spark MLlib/SQL
SMILE
Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
17
Предобработка
данных
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
18
Предобработка
данных
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
19
Предобработка
данных
Разработка
признаков
Выбор
признаков
Извлечение
признаков
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
20
Предобработка
данных
Разработка
признаков
Выбор
признаков
Извлечение
признаков
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Конфигурация
параметров
Оптимизация
алгоритма
Алгоритм
21
Предобработка
данных
Разработка
признаков
Выбор
признаков
Извлечение
признаков
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Конфигурация
параметров
Оптимизация
алгоритма
Алгоритм
Стратегии
оценки
Метрики
оценки
22
Предобработка
данных
Разработка
признаков
Выбор
признаков
Извлечение
признаков
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Конфигурация
параметров
Оптимизация
алгоритма
Алгоритм
Стратегии
оценки
Метрики
оценки
Выбрать
алгоритм
23
Предобработка
данных
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
24
Spark
MLlib/SQL
Spark
MLlib/SQL
SMILE
Saddle
Предобработка
данных
Разработка
признаков
Выбор
признаков
Извлечение
признаков
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Конфигурация
параметров
Оптимизация
алгоритма
Алгоритм
Стратегии
оценки
Метрики
оценки
Выбрать
алгоритм
25
Предобработка данных: Spark MLlib
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Transformation
Extraction
Selection
26
Предобработка данных: Saddle
● Векторы
● Матрицы
● Серии
● Фреймы
● Индексы
Anastasia Lieva “Big Data Science in Scala” Joker 2017
27
Предобработка
данных
Разработка
признаков
Выбор
признаков
Извлечение
признаков
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Конфигурация
параметров
Оптимизация
алгоритма
Алгоритм
Стратегии
оценки
Метрики
оценки
Выбрать
алгоритм
28
API на основе датафреймов
● Классификация
● Кластеризация
● Регрессионный анализ
● Линейные методы
● Алгоритмы на основе деревьев
● Обработка естественного языка
● ………………..и многие другие!
Обучение данных: Spark MLlib
Anastasia Lieva “Big Data Science in Scala” Joker 2017
29
Spark MLlib :
Pipelines
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Transformation
Extraction
Selection
Предобработкаданных
30
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Transformation
Extraction
Selection
Algorithm
configuration
Learning by
algorithm
Evaluation
Обучение
данных
Предобработкаданных
Spark MLlib :
Pipelines
31
Spark MLlib : графический интерфейс
Anastasia Lieva “Big Data Science in Scala” Joker 2017
32
API на основе массивов
Обучение данных: SMILE
● Классификация
● Кластеринг
● Регрессионный анализ
● Линейные методы
● Алгоритмы на основе деревьев
● Обработка естественного языка
● ………………..и многие другие!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
33
Обучение данных: SMILE
Anastasia Lieva “Big Data Science in Scala” Joker 2017
★ Vector Quantization
★ Association Rule Mining
★ Manifold learning
★ Multi-dimensional scaling
БОЛьШЕ
★ алгоритмов кластеризации
★ методов замещения отсутствующих данных
34
План.
1. Почему Scala ?
2. Обзор библиотек Data-Science на Scala
3. Что за проблему решаем сегодня?
4. Замарать руки в коде
5. Подвести итоги и выбрать
подходящую нам библиотеку!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
35
Контекст : Технологии RTB
Anastasia Lieva “Big Data Science in Scala” Joker 2017
36
Нам нужно знать вероятность того,
что вы кликните на рекламу
на основании :
Anastasia Lieva “Big Data Science in Scala” Joker 2017
37
Задача:
Оптимизировать уровень кликов
афишируемых реклам
Нам нужно знать вероятность того,
что вы кликните на рекламу
на основании :
● конфигурации запроса
Anastasia Lieva “Big Data Science in Scala” Joker 2017
38
Задача:
Оптимизировать уровень кликов
показанных реклам
Нам нужно знать вероятность того,
что вы кликните на рекламу
на основании :
● конфигурации запроса
● креативного формата рекламы
Anastasia Lieva “Big Data Science in Scala” Joker 2017
39
Задача:
Оптимизировать уровень кликов
показанных реклам
Нам нужно знать вероятность того,
что вы кликните на рекламу
на основании :
● конфигурации запроса
● креативного формата рекламы
● истории пользователя
Anastasia Lieva “Big Data Science in Scala” Joker 2017
40
Задача:
Оптимизировать уровень кликов
показанных реклам
Нам нужно знать вероятность того,
что вы кликните на рекламу
на основании :
● конфигурации запроса
● креативного формата рекламы
● истории пользователя
● сторонней и мета-информации
Anastasia Lieva “Big Data Science in Scala” Joker 2017
41
Задача:
Оптимизировать уровень кликов
показанных реклам
Анализ временных рядов
Кластеризация
Детектация
аномалии
Регрессионный анализ
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Классификация
собака
клик
кошка
нет клика
42
Определите задачу в контексте науки о данных !
Предобработка
данных
Разработка
признаков
Выбор
признаков
Извлечение
признаков
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Конфигурация
параметров
Оптимизация
алгоритма
Алгоритм
Стратегии
оценки
Метрики
оценки
Выбрать
алгоритм
43
Предобработка
данных
Разработка
признаков
Выбор
признаков
Извлечение
признаков
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Конфигурация
параметров
Оптимизация
алгоритма
Алгоритм
Стратегии
оценки
Метрики
оценки
Выбрать
алгоритм
Случайный лес
(Random Forest)
44
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)
Дерево решений
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)
Алгоритм: случайный лес (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
Алгоритм: случайный лес (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
Алгоритм: случайный лес (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
Алгоритм: случайный лес (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
Anastasia Lieva “Big Data Science in Scala” Joker 2017
51
Сырые данные
{
"id":"951cb9f5-2bab-46ce-b759-8245cffxxxxx",
"time":"2016-06-09T0:25:28Z",
"bidfloor":2.88,
"appOrSite":"app",
"adType":"banner",
"categories":"games,news,football",
"publisherId":"11e281c1123139xxxxx",
"carrier":"208-10",
"os":"iOS",
"connectionType":3,
"coords":[48.929256439208984, 2.4255824089050293],
"adSize":[320, 50],
"exchange":"xxxxx",
[...],
"clicked":true
}
Anastasia Lieva “Big Data Science in Scala” Joker 2017
52
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
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
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
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
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
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
План.
1. Почему Scala ?
2. Обзор библиотек Data-Science на Scala
3. Что за проблему решаем сегодня?
4. Замарать руки в коде
5. Подвести итоги и выбрать
подходящую нам библиотеку!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
59
Предобработка
данных
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
60
Предобработка
данных
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Saddle
61
Создаем датафрейм
Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val dataframe: Frame[Int, String, Any] =
Frame(requestsParsed, columns)
.rdropNA
62
Создаем датафрейм
Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val dataframe: Frame[Int, String, Any] =
Frame(requestsParsed, columns)
.rdropNA
63
Создаем датафрейм
Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val dataframe: Frame[Int, String, Any] =
Frame(requestsParsed, columns)
.rdropNA
64
Создаем датафрейм
Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val dataframe: Frame[Int, String, Any] =
Frame(requestsParsed, columns)
.rdropNA
.rmap .rsqueeze
.rconcat .rmask
.rfilter .rtransform
.rjoin .rwhere
65
Создаем датафрейм
Saddle
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val dataframe: Frame[Int, String, Any] =
Frame(requestsParsed, columns)
.rdropNA
.rmap .rsqueeze
.rconcat .rmask
.rfilter .rtransform
.rjoin .rwhere
66
row-wise
Индексируем
категориальные данные
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
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
Индексируем
категориальные данные
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
Индексируем
категориальные данные
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
Индексируем
категориальные данные
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
Индексируем
категориальные данные
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
Индексируем
категориальные данные
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
Индексируем
категориальные данные
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
Индексируем
категориальные данные
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
Индексируем
категориальные данные
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]
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
Индексируем
категориальные данные
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
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
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
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
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Saddle
Удобные для науки о данных структуры :
фреймы, матрицы, серии, векторы
82
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Saddle
Удобные для науки о данных структуры :
фреймы, матрицы, серии, векторы
Не в активной разработке
Не типизированные датафреймы
83
Предобработка
данных
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
84
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
85
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
86
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
87
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
88
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
Resilient Distributed Dataset (RDD)
89
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
Resilient Distributed Dataset (RDD)
Dataset
Dataframe
SQL
query
90
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
91
Создаем датафрейм
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val rawDF: DataFrame = sparkSession
.read
.json(inputFile)
92
Создаем датафрейм
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val rawDF: DataFrame = sparkSession
.read
.json(inputFile)
93
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
Dataset
Dataframe
SQL
query
94
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
95
SQL
query
dataframe.createOrReplaceTempView("data")
sparkSession.sql("
SELECT * FROM data WHERE click=true
")
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
96
SQL
query
dataframe.createOrReplaceTempView("data")
sparkSession.sql("
SELECT * FROM data WHERE click=true
")
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
97
SQL
query
dataframe.createOrReplaceTempView("data")
sparkSession.sql("
SELECT * FROM data WHERE click=true
")
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
98
SQL
query
dataframe.createOrReplaceTempView("data")
sparkSession.sql("
SELECT * FROM data WHERE click=true
")
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
99
SQL
query
dataframe.createOrReplaceTempView("data")
sparkSession.sql("
SELECT * FROM data WHERE click=true
")
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
")
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Dataframe
101
dataframe.where($"click" === true)
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Dataframe
102
dataframe.where($"click" === true)
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Dataframe
103
dataframe.where($"CRAZY_COLUMN" === true)
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Dataframe
104
dataframe.CRAZY_METHOD($"click" === true)
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
dataframe.count
.join .sort
.filter .where
.groupBy .select
.agg .union
.orderBy .drop
Dataframe
105
Создаём датасетSpark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val dataset: Dataset[Request] = dataframe
.select("timestamp", "city", "clicked", …, "os")
.as[Request]
Dataset
case class Request(
os: String,
carrier: String,
timestamp: Double,
city: String,
...
clicked: Boolean
)
106
Создаём датасетSpark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val dataset: Dataset[Request] = dataframe
.select("timestamp", "city", "clicked", …, "os")
.as[Request]
Dataset
case class Request(
os: String,
carrier: String,
timestamp: Double,
city: String,
...
clicked: Boolean
)
107
Создаём датасетSpark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val dataset: Dataset[Request] = dataframe
.select("timestamp", "city", "clicked", …, "os")
.as[Request]
Dataset
case class Request(
os: String,
carrier: String,
timestamp: Double,
city: String,
...
clicked: Boolean
)
108
Создаём датасетSpark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val dataset: Dataset[Request] = dataframe
.select("timestamp", "city", "clicked", …, "os")
.as[Request]
Dataset
case class Request(
cs: String,
carrier: String,
timestamp: Double,
city: String,
...
Clicked: Boolean
)
Dataset[Row]
109
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
dataset.filter(_.click==true)
Dataset
110
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
dataset.CRAZY_OPERATOR(_.CRAZY_COLUMN==true)
Dataset
111
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
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
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
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
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
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
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
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
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
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
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
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
DataframeРазбиваем данные
случайным образом
на тренировочную и тестовую выборки
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val Array(trainSet, testSet) =
finalDataframe
.randomSplit(Array(0.9, 0.1))
124
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
125
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
● Готовые оптимизированные методы
для feature engineering/selection
126
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
● Готовые оптимизированные методы
для feature engineering/selection
● Типизированные структуры - Datasets
127
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
● Готовые оптимизированные методы
для feature engineering/selection
● Типизированные структуры - Datasets
● Возможность очень типизированных структур с
Frameless Datasets
128
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
● Готовые оптимизированные методы
для feature engineering/selection
● Типизированные структуры - Datasets
● Возможность очень типизированных структур с
Frameless Datasets
● Возможность делать SQL
с минимальным уровнем типизации : синтаксиса
129
Предобработка
данных
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark
130
Конструируем классификатор
и конфигурируем его
Spark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val forest = new RandomForestClassifier()
.setLabelCol("click")
.setFeaturesCol("features")
.setNumTrees(100)
.setMaxDepth(30)
131
Конструируем классификатор
и конфигурируем его
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
Запускаем обучение
на обучающей выборке
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
Запускаем обучение
на обучающей выборке
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
Запускаем обучение
на обучающей выборке
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
Запускаем обучение
на обучающей выборке
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
Собираем все элементы в PipelineSpark
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Bucketizer
Vector
Assembler
Forest
Algorithme
Indexer
Tokenizer
137
Собираем все элементы в 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
Собираем все элементы в 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
Собираем все элементы в 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
Собираем все элементы в 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
Собираем все элементы в 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
Предобработка
данных
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Smile
143
Smile
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val model = new RandomForest(
x = featuresTrainArray,
y = labelTrainArray,
ntrees = numberOfTrees,
maxNodes = 100,
mtry = mtry,
subsample = 1.0,
rule = DecisionTree.SplitRule.GINI,
classWeight = (1, 10)
)
Конструируем классификатор
и конфигурируем его
Запускаем классификатор
на обучающей выборке
144
Smile
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val model = new RandomForest(
x = featuresTrainArray,
y = labelTrainArray,
attributes = nominalAttributes,
ntrees = numberOfTrees,
maxNodes = 100,
mtry = mtry,
subsample = 1.0,
rule = DecisionTree.SplitRule.GINI,
classWeight = (1, 2)
)
Конструируем классификатор
и конфигурируем его
Запускаем классификатор
на обучающей выборке
145
Smile
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val model = new RandomForest(
x = featuresTrainArray,
y = labelTrainArray,
attributes = nominalAttributes,
ntrees = numberOfTrees,
maxNodes = 100,
mtry = mtry,
subsample = 1.0,
rule = DecisionTree.SplitRule.GINI,
classWeight = (1, 2)
)
Конструируем классификатор
и конфигурируем его
Запускаем классификатор
на обучающей выборке
146
Smile
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val prediction = model.predict(features)
Делаем предсказания
на тестовой выборке
.trim .getTrees
.size .error
.test .importance
model.importance
147
Smile
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val prediction = model.predict(features)
Делаем предсказания
на тестовой выборке
.trim .getTrees
.size .error
.test .importance
model.importance
148
Smile
Anastasia Lieva “Big Data Science in Scala” Joker 2017
val prediction = model.predict(features)
Делаем предсказания
на тестовой выборке
.trim .getTrees
.size .error
.test .importance
model.importance
0.17041644829479835,0.0,0.24611540915530505,1.1389295846602683,0.07655364222
388063,0.0,0.0,0.009896625232551026,4.57453119760533,0.36047880690737855,1.2
020833333333334,0.007662298205433167,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
149
Предобработка
данных
Машинное
обучение
Оценка
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark Smile
150
Метрики
оценки
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark Smile
Binary
Classification
Regression
Multiclass
Classification
Classification
Regression
151
Метрики
оценки
моделей
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Spark Smile
Binary
Classification
Regression
Multiclass
Classification
Classification
Regression
152
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Был клик Не было
клика
Предсказание
клика 100 20
Предсказание
нет клика 300 580
153
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Был клик Не было
клика
Предсказание
клика
100 20
Предсказание
нет клика
300 580
FALSE POSITIVES
FALSE NEGATIVES
154
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Был клик Не было
клика
Предсказание
клика
100 20
Предсказание
нет клика
300 580
TRUE POSITIVES
TRUE NEGATIVES
155
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
Сравниваем Случайный лес Spark и Smile
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Метрики классификации
157
Сравниваем Случайный лес Spark и Smile
Больше значение =лучше Меньше значение =
лучше
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Метрики классификации
158
Подбираем оптимальные
параметры алгоритма
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
Подбираем оптимальные
параметры алгоритма
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
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
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
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
План.
1. Почему Scala ?
2. Обзор библиотек Data-Science на Scala
3. Что за проблему решаем сегодня?
4. Замарать руки в коде
5. Подвести итоги и выбрать
подходящую нам библиотеку!
Anastasia Lieva “Big Data Science in Scala” Joker 2017
164
Anastasia Lieva “Big Data Science in Scala” Joker 2017
Предобработка данных Spark и Saddle
64 GB RAM, 16 CPU
165
Обучение : Случайный лес 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
Мой List[tools]
(для сегодняшнего примера!!):
Preprocessing
Spark
Machine Learning
(Random Forest)
Smile
Anastasia Lieva “Big Data Science in Scala” Joker 2017
167
R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
168
SCALABLE :
GROWABLE & ENABLING GROWTH
R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
169
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
170
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
171
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
● и экосистема Big Data !
R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
172
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
● и экосистема Big Data !
● Оптимизированные структуры данных
и методы их обработки
R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
173
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
● и экосистема Big Data !
● Оптимизированные структуры данных
и методы их обработки
● Мощность и богатство функционального программирования
R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
174
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
● и экосистема Big Data !
● Оптимизированные структуры данных
и методы их обработки
● Мощность и богатство функционального программирования
● Но если очень хочется - можно всегда ООП
R
Python
SQL
Scala
Anastasia Lieva “Big Data Science in Scala” Joker 2017
175
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH
● Фокус на решение задач в контексте бизнеса
● Фокус на решение задач в контексте науки о данных
● Уже сейчас : богатый функционал библиотек….
● и экосистема Big Data !
● Оптимизированные структуры данных
и методы их обработки
● Мощность и богатство функционального программирования
● Но если очень хочется - можно всегда ООП
● Типобезопасный код - наш выбор!
Спасибо за внимание!!
@lievAnastazia 176
Вопросы!!
@lievAnastazia 177
R
Python
SQL
Scala
SCALABLE DATA-SCIENCE:
GROWABLE & ENABLING GROWTH

More Related Content

Similar to Big Data Science in Scala ( Joker 2017, slides in Russian)

39 - Базы данных. NoSQL базы данных
39 - Базы данных. NoSQL базы данных39 - Базы данных. NoSQL базы данных
39 - Базы данных. NoSQL базы данныхRoman Brovko
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Ontico
 
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилищеВелосипедостраительство в NoSQL, строим собственное NoSQL хранилище
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилищеAlexandre Kalendarev
 
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...IT-Portfolio
 
Software Analytics in frontend
Software Analytics in frontendSoftware Analytics in frontend
Software Analytics in frontendDenis Kolesnikov
 
зао «эвентос»
зао «эвентос»зао «эвентос»
зао «эвентос»ontosminerapi
 
Разработка системы форензик-анализа сетевого трафика, РусКрипто-2011
Разработка системы форензик-анализа сетевого трафика, РусКрипто-2011Разработка системы форензик-анализа сетевого трафика, РусКрипто-2011
Разработка системы форензик-анализа сетевого трафика, РусКрипто-2011Alexey Kachalin
 
мифы о спарке
мифы о спарке мифы о спарке
мифы о спарке Evgeny Borisov
 
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)Ontico
 
Анализ данных и машинное обучение
Анализ данных и машинное обучениеАнализ данных и машинное обучение
Анализ данных и машинное обучениеMATLAB
 
Электронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark ScalaЭлектронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark ScalaRoman Zykov
 
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10OdessaFrontend
 
Большому аналитику - большие данные
Большому аналитику - большие данныеБольшому аналитику - большие данные
Большому аналитику - большие данныеSQALab
 
Ruben Melkonian "Як невеликим і середнім компаніям заробити на Data Science"
Ruben Melkonian  "Як невеликим і середнім компаніям заробити на Data Science"Ruben Melkonian  "Як невеликим і середнім компаніям заробити на Data Science"
Ruben Melkonian "Як невеликим і середнім компаніям заробити на Data Science"Lviv Startup Club
 
О том, как Computer Science нам жить помогает или современные приложения теор...
О том, как Computer Science нам жить помогает или современные приложения теор...О том, как Computer Science нам жить помогает или современные приложения теор...
О том, как Computer Science нам жить помогает или современные приложения теор...maxkalachev
 
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и..."Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...it-people
 
Основы Python. Работа с библиотекой Pandas
Основы Python. Работа с библиотекой PandasОсновы Python. Работа с библиотекой Pandas
Основы Python. Работа с библиотекой PandasNetpeak
 
Путь дата аналитика
Путь дата аналитикаПуть дата аналитика
Путь дата аналитикаAUTODOC
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитикиИлья Середа
 
BusinessObjects глазами аналитика - Tern4
BusinessObjects глазами аналитика -  Tern4 BusinessObjects глазами аналитика -  Tern4
BusinessObjects глазами аналитика - Tern4 Valeriy Titov
 

Similar to Big Data Science in Scala ( Joker 2017, slides in Russian) (20)

39 - Базы данных. NoSQL базы данных
39 - Базы данных. NoSQL базы данных39 - Базы данных. NoSQL базы данных
39 - Базы данных. NoSQL базы данных
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
 
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилищеВелосипедостраительство в NoSQL, строим собственное NoSQL хранилище
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище
 
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
 
Software Analytics in frontend
Software Analytics in frontendSoftware Analytics in frontend
Software Analytics in frontend
 
зао «эвентос»
зао «эвентос»зао «эвентос»
зао «эвентос»
 
Разработка системы форензик-анализа сетевого трафика, РусКрипто-2011
Разработка системы форензик-анализа сетевого трафика, РусКрипто-2011Разработка системы форензик-анализа сетевого трафика, РусКрипто-2011
Разработка системы форензик-анализа сетевого трафика, РусКрипто-2011
 
мифы о спарке
мифы о спарке мифы о спарке
мифы о спарке
 
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)
 
Анализ данных и машинное обучение
Анализ данных и машинное обучениеАнализ данных и машинное обучение
Анализ данных и машинное обучение
 
Электронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark ScalaЭлектронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark Scala
 
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10
Перепись приложения. Нативного. На JS. Done. | Odessa Frontend Meetup #10
 
Большому аналитику - большие данные
Большому аналитику - большие данныеБольшому аналитику - большие данные
Большому аналитику - большие данные
 
Ruben Melkonian "Як невеликим і середнім компаніям заробити на Data Science"
Ruben Melkonian  "Як невеликим і середнім компаніям заробити на Data Science"Ruben Melkonian  "Як невеликим і середнім компаніям заробити на Data Science"
Ruben Melkonian "Як невеликим і середнім компаніям заробити на Data Science"
 
О том, как Computer Science нам жить помогает или современные приложения теор...
О том, как Computer Science нам жить помогает или современные приложения теор...О том, как Computer Science нам жить помогает или современные приложения теор...
О том, как Computer Science нам жить помогает или современные приложения теор...
 
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и..."Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...
"Облачный сервис персональных рекомендаций для 20 000 магазинов — алгоритмы и...
 
Основы Python. Работа с библиотекой Pandas
Основы Python. Работа с библиотекой PandasОсновы Python. Работа с библиотекой Pandas
Основы Python. Работа с библиотекой Pandas
 
Путь дата аналитика
Путь дата аналитикаПуть дата аналитика
Путь дата аналитика
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитики
 
BusinessObjects глазами аналитика - Tern4
BusinessObjects глазами аналитика -  Tern4 BusinessObjects глазами аналитика -  Tern4
BusinessObjects глазами аналитика - Tern4
 

More from Anastasia Bobyreva

Extreme data Science (English version)
Extreme data Science (English version)Extreme data Science (English version)
Extreme data Science (English version)Anastasia Bobyreva
 
Make Data Science Great Again. Pourquoi et comment crafter la Data Science su...
Make Data Science Great Again. Pourquoi et comment crafter la Data Science su...Make Data Science Great Again. Pourquoi et comment crafter la Data Science su...
Make Data Science Great Again. Pourquoi et comment crafter la Data Science su...Anastasia Bobyreva
 
LearnLink project for Startup Week-End Montpellier
LearnLink project for Startup Week-End MontpellierLearnLink project for Startup Week-End Montpellier
LearnLink project for Startup Week-End MontpellierAnastasia Bobyreva
 
Google voice transcriptions demystified: Introduction to recurrent neural ne...
 Google voice transcriptions demystified: Introduction to recurrent neural ne... Google voice transcriptions demystified: Introduction to recurrent neural ne...
Google voice transcriptions demystified: Introduction to recurrent neural ne...Anastasia Bobyreva
 
Which library should you choose for data-science? That's the question!
Which library should you choose for data-science? That's the question!Which library should you choose for data-science? That's the question!
Which library should you choose for data-science? That's the question!Anastasia Bobyreva
 

More from Anastasia Bobyreva (10)

Extreme data Science (English version)
Extreme data Science (English version)Extreme data Science (English version)
Extreme data Science (English version)
 
Extreme Data Science
Extreme Data ScienceExtreme Data Science
Extreme Data Science
 
Make Data Science Great Again. Pourquoi et comment crafter la Data Science su...
Make Data Science Great Again. Pourquoi et comment crafter la Data Science su...Make Data Science Great Again. Pourquoi et comment crafter la Data Science su...
Make Data Science Great Again. Pourquoi et comment crafter la Data Science su...
 
NUPIC : new concept of AI
NUPIC : new concept of AINUPIC : new concept of AI
NUPIC : new concept of AI
 
LearnLink project for Startup Week-End Montpellier
LearnLink project for Startup Week-End MontpellierLearnLink project for Startup Week-End Montpellier
LearnLink project for Startup Week-End Montpellier
 
Google voice transcriptions demystified: Introduction to recurrent neural ne...
 Google voice transcriptions demystified: Introduction to recurrent neural ne... Google voice transcriptions demystified: Introduction to recurrent neural ne...
Google voice transcriptions demystified: Introduction to recurrent neural ne...
 
Deep Learning with Spark
Deep Learning with SparkDeep Learning with Spark
Deep Learning with Spark
 
Big Data Science in Scala V2
Big Data Science in Scala V2 Big Data Science in Scala V2
Big Data Science in Scala V2
 
Which library should you choose for data-science? That's the question!
Which library should you choose for data-science? That's the question!Which library should you choose for data-science? That's the question!
Which library should you choose for data-science? That's the question!
 
Big Data Science in Scala
Big Data Science in ScalaBig Data Science in Scala
Big Data Science in Scala
 

Big Data Science in Scala ( Joker 2017, slides in Russian)

  • 1. Big Data-Science in Scala Anastasia Lieva Data Scientist @lievAnastazia 1
  • 2. Anastasia Lieva @lievAnastazia “Big Data Science in Scala” Joker 2017 2
  • 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
  • 11. R Python SQL Scala Anastasia Lieva “Big Data Science in Scala” Joker 2017 11
  • 12. R Python SQL Scala Anastasia Lieva “Big Data Science in Scala” Joker 2017 12 Scala от SCALABLE
  • 13. R Python SQL Scala Anastasia Lieva “Big Data Science in Scala” Joker 2017 13 SCALABLE : GROWABLE & ENABLING GROWTH
  • 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 Какую библиотеку выбрать?
  • 17. R Python SQL Scala Spark MLlib/SQL SMILE Saddle Anastasia Lieva “Big Data Science in Scala” Joker 2017 17
  • 22. Предобработка данных Разработка признаков Выбор признаков Извлечение признаков Машинное обучение Оценка моделей Anastasia Lieva “Big Data Science in Scala” Joker 2017 Конфигурация параметров Оптимизация алгоритма Алгоритм Стратегии оценки Метрики оценки 22
  • 23. Предобработка данных Разработка признаков Выбор признаков Извлечение признаков Машинное обучение Оценка моделей Anastasia Lieva “Big Data Science in Scala” Joker 2017 Конфигурация параметров Оптимизация алгоритма Алгоритм Стратегии оценки Метрики оценки Выбрать алгоритм 23
  • 24. Предобработка данных Машинное обучение Оценка моделей Anastasia Lieva “Big Data Science in Scala” Joker 2017 24 Spark MLlib/SQL Spark MLlib/SQL SMILE Saddle
  • 25. Предобработка данных Разработка признаков Выбор признаков Извлечение признаков Машинное обучение Оценка моделей Anastasia Lieva “Big Data Science in Scala” Joker 2017 Конфигурация параметров Оптимизация алгоритма Алгоритм Стратегии оценки Метрики оценки Выбрать алгоритм 25
  • 26. Предобработка данных: Spark MLlib Anastasia Lieva “Big Data Science in Scala” Joker 2017 Transformation Extraction Selection 26
  • 27. Предобработка данных: Saddle ● Векторы ● Матрицы ● Серии ● Фреймы ● Индексы Anastasia Lieva “Big Data Science in Scala” Joker 2017 27
  • 28. Предобработка данных Разработка признаков Выбор признаков Извлечение признаков Машинное обучение Оценка моделей Anastasia Lieva “Big Data Science in Scala” Joker 2017 Конфигурация параметров Оптимизация алгоритма Алгоритм Стратегии оценки Метрики оценки Выбрать алгоритм 28
  • 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
  • 36. Контекст : Технологии RTB Anastasia Lieva “Big Data Science in Scala” Joker 2017 36
  • 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 Задача: Оптимизировать уровень кликов показанных реклам
  • 42. Анализ временных рядов Кластеризация Детектация аномалии Регрессионный анализ Anastasia Lieva “Big Data Science in Scala” Joker 2017 Классификация собака клик кошка нет клика 42 Определите задачу в контексте науки о данных !
  • 43. Предобработка данных Разработка признаков Выбор признаков Извлечение признаков Машинное обучение Оценка моделей Anastasia Lieva “Big Data Science in Scala” Joker 2017 Конфигурация параметров Оптимизация алгоритма Алгоритм Стратегии оценки Метрики оценки Выбрать алгоритм 43
  • 44. Предобработка данных Разработка признаков Выбор признаков Извлечение признаков Машинное обучение Оценка моделей Anastasia Lieva “Big Data Science in Scala” Joker 2017 Конфигурация параметров Оптимизация алгоритма Алгоритм Стратегии оценки Метрики оценки Выбрать алгоритм Случайный лес (Random Forest) 44
  • 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
  • 51. Anastasia Lieva “Big Data Science in Scala” Joker 2017 51
  • 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
  • 62. Создаем датафрейм Saddle Anastasia Lieva “Big Data Science in Scala” Joker 2017 val dataframe: Frame[Int, String, Any] = Frame(requestsParsed, columns) .rdropNA 62
  • 63. Создаем датафрейм Saddle Anastasia Lieva “Big Data Science in Scala” Joker 2017 val dataframe: Frame[Int, String, Any] = Frame(requestsParsed, columns) .rdropNA 63
  • 64. Создаем датафрейм Saddle Anastasia Lieva “Big Data Science in Scala” Joker 2017 val dataframe: Frame[Int, String, Any] = Frame(requestsParsed, columns) .rdropNA 64
  • 65. Создаем датафрейм Saddle Anastasia Lieva “Big Data Science in Scala” Joker 2017 val dataframe: Frame[Int, String, Any] = Frame(requestsParsed, columns) .rdropNA .rmap .rsqueeze .rconcat .rmask .rfilter .rtransform .rjoin .rwhere 65
  • 66. Создаем датафрейм Saddle Anastasia Lieva “Big Data Science in Scala” Joker 2017 val dataframe: Frame[Int, String, Any] = Frame(requestsParsed, columns) .rdropNA .rmap .rsqueeze .rconcat .rmask .rfilter .rtransform .rjoin .rwhere 66 row-wise
  • 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
  • 85. Anastasia Lieva “Big Data Science in Scala” Joker 2017 Spark 85
  • 86. Anastasia Lieva “Big Data Science in Scala” Joker 2017 Spark 86
  • 87. Anastasia Lieva “Big Data Science in Scala” Joker 2017 Spark 87
  • 88. Anastasia Lieva “Big Data Science in Scala” Joker 2017 Spark 88
  • 89. Anastasia Lieva “Big Data Science in Scala” Joker 2017 Spark Resilient Distributed Dataset (RDD) 89
  • 90. Anastasia Lieva “Big Data Science in Scala” Joker 2017 Spark Resilient Distributed Dataset (RDD) Dataset Dataframe SQL query 90
  • 91. Anastasia Lieva “Big Data Science in Scala” Joker 2017 Spark 91
  • 92. Создаем датафрейм Spark Anastasia Lieva “Big Data Science in Scala” Joker 2017 val rawDF: DataFrame = sparkSession .read .json(inputFile) 92
  • 93. Создаем датафрейм Spark Anastasia Lieva “Big Data Science in Scala” Joker 2017 val rawDF: DataFrame = sparkSession .read .json(inputFile) 93
  • 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)
  • 105. Spark Anastasia Lieva “Big Data Science in Scala” Joker 2017 dataframe.count .join .sort .filter .where .groupBy .select .agg .union .orderBy .drop Dataframe 105
  • 106. Создаём датасетSpark Anastasia Lieva “Big Data Science in Scala” Joker 2017 val dataset: Dataset[Request] = dataframe .select("timestamp", "city", "clicked", …, "os") .as[Request] Dataset case class Request( os: String, carrier: String, timestamp: Double, city: String, ... clicked: Boolean ) 106
  • 107. Создаём датасетSpark Anastasia Lieva “Big Data Science in Scala” Joker 2017 val dataset: Dataset[Request] = dataframe .select("timestamp", "city", "clicked", …, "os") .as[Request] Dataset case class Request( os: String, carrier: String, timestamp: Double, city: String, ... clicked: Boolean ) 107
  • 108. Создаём датасетSpark Anastasia Lieva “Big Data Science in Scala” Joker 2017 val dataset: Dataset[Request] = dataframe .select("timestamp", "city", "clicked", …, "os") .as[Request] Dataset case class Request( os: String, carrier: String, timestamp: Double, city: String, ... clicked: Boolean ) 108
  • 109. Создаём датасетSpark Anastasia Lieva “Big Data Science in Scala” Joker 2017 val dataset: Dataset[Request] = dataframe .select("timestamp", "city", "clicked", …, "os") .as[Request] Dataset case class Request( cs: String, carrier: String, timestamp: Double, city: String, ... Clicked: Boolean ) Dataset[Row] 109
  • 110. Spark Anastasia Lieva “Big Data Science in Scala” Joker 2017 dataset.filter(_.click==true) Dataset 110
  • 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
  • 125. Anastasia Lieva “Big Data Science in Scala” Joker 2017 Spark 125
  • 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
  • 144. Smile Anastasia Lieva “Big Data Science in Scala” Joker 2017 val model = new RandomForest( x = featuresTrainArray, y = labelTrainArray, ntrees = numberOfTrees, maxNodes = 100, mtry = mtry, subsample = 1.0, rule = DecisionTree.SplitRule.GINI, classWeight = (1, 10) ) Конструируем классификатор и конфигурируем его Запускаем классификатор на обучающей выборке 144
  • 145. Smile Anastasia Lieva “Big Data Science in Scala” Joker 2017 val model = new RandomForest( x = featuresTrainArray, y = labelTrainArray, attributes = nominalAttributes, ntrees = numberOfTrees, maxNodes = 100, mtry = mtry, subsample = 1.0, rule = DecisionTree.SplitRule.GINI, classWeight = (1, 2) ) Конструируем классификатор и конфигурируем его Запускаем классификатор на обучающей выборке 145
  • 146. Smile Anastasia Lieva “Big Data Science in Scala” Joker 2017 val model = new RandomForest( x = featuresTrainArray, y = labelTrainArray, attributes = nominalAttributes, ntrees = numberOfTrees, maxNodes = 100, mtry = mtry, subsample = 1.0, rule = DecisionTree.SplitRule.GINI, classWeight = (1, 2) ) Конструируем классификатор и конфигурируем его Запускаем классификатор на обучающей выборке 146
  • 147. Smile Anastasia Lieva “Big Data Science in Scala” Joker 2017 val prediction = model.predict(features) Делаем предсказания на тестовой выборке .trim .getTrees .size .error .test .importance model.importance 147
  • 148. Smile Anastasia Lieva “Big Data Science in Scala” Joker 2017 val prediction = model.predict(features) Делаем предсказания на тестовой выборке .trim .getTrees .size .error .test .importance model.importance 148
  • 149. Smile Anastasia Lieva “Big Data Science in Scala” Joker 2017 val prediction = model.predict(features) Делаем предсказания на тестовой выборке .trim .getTrees .size .error .test .importance model.importance 0.17041644829479835,0.0,0.24611540915530505,1.1389295846602683,0.07655364222 388063,0.0,0.0,0.009896625232551026,4.57453119760533,0.36047880690737855,1.2 020833333333334,0.007662298205433167,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 ,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 149
  • 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
  • 168. R Python SQL Scala Anastasia Lieva “Big Data Science in Scala” Joker 2017 168 SCALABLE : GROWABLE & ENABLING GROWTH
  • 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 ! ● Оптимизированные структуры данных и методы их обработки ● Мощность и богатство функционального программирования ● Но если очень хочется - можно всегда ООП ● Типобезопасный код - наш выбор!