-
Notifications
You must be signed in to change notification settings - Fork 0
/
markdown.py
197 lines (171 loc) · 16.3 KB
/
markdown.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#-----------------------------------------ПОСТАНОВКА ЗАДАЧИ-------------------------------------------------------------
task_text = '''
#### Прогнозирование заказов такси
Компания **«Чётенькое такси»** собрала исторические данные о заказах такси в аэропортах. Чтобы привлекать больше
водителей в период пиковой нагрузки, нужно спрогнозировать количество заказов такси на следующий час. Постройте модель для такого предсказания.
Значение метрики *RMSE* на тестовой выборке должно быть не больше 48.
Вам нужно:
- Загрузить данные и выполнить их ресемплирование по одному часу.
- Проанализировать данные.
- Обучить разные модели с различными гиперпараметрами. Сделать тестовую выборку размером 10% от исходных данных.
- Проверить данные на тестовой выборке и сделать выводы.
'''
#---------------------------------------------ETL-----------------------------------------------------------------------
adf_test_text = '''
Тест **ADF** используется для определения наличия единичного корня в ряду и, следовательно, помогает понять,
является ли ряд стационарным или нет.
Нулевая и альтернативная гипотезы этого теста:
- Нулевая гипотеза: ряд имеет единичный корень.
- Альтернативная гипотеза: ряд не имеет единичного корня.
'''
kpss_test_text = '''
**KPSS** - это еще один тест для проверки стационарности временных рядов.
Нулевая и альтернативная гипотезы для теста KPSS противоположны гипотезам теста ADF:
- Нулевая гипотеза: процесс является стационарным.
- Альтернативная гипотеза: ряд имеет единичный корень (ряд не является стационарным).
'''
result_test_1 = '''
**Временной ряд нестационарный**
'''
result_test_2 = '''
**Временной ряд строго стационарный**
'''
result_test_3 = '''
**Ряд является разностно стационарным**.
- ADF - стационарный
- КPSS - не стационарный
*Рекомендовано*:
- провести дифференцирование для обеспечения стационарности рядов, затем дифференцированный ряд проверить на стационарность.
- либо признать вопрос о стационарности не решенным
'''
result_test_4 = '''
**Временной ряд стационарный.**
- ADF - не стационарный
- КPSS - стационарный
*Рекомендовано*:
- тренд нужно убрать, чтобы сделать серию строго стационарной, затем детрендированный ряд проверить на стационарность.
- либо признать вопрос о стационарности не решенным.
'''
conclusion_loading = '''
- прочитали файл данных с расширением `taxi.csv`;
- данные представляют собой таблицу с двумя признаками:
- `datetime (type object)` - дата и время заказа такси;
- `num_orders (type int64)` - количество заказов такси;
- данные получены в интервале от 01.03.2018 00:00:00 до 31.08.2018 23:50:00;
- частота временного ряда 10 минут.
'''
conclusion_transform_data = '''
- с помощью аргумента `parse_dates[0]` метода `read_csv` мы преобразовали тип признака `datetime` из `object`➡`datetime64`;
- с помощью аргумента `index_col[0]` метода `read_csv` мы преобразовали наши данные во временной ряд с индексом `DateTimeIndex`;
- с помощью метода `resample` библиотеки `pandas` мы понизили частоту временного ряда 10 минут ➡ 1 час.
'''
conclusion_decomposition = '''
Разложение временных рядов включает в себя представление о серии как о комбинации компонентов ***уровня, тренда, сезонности и шума***.
Разложение обеспечивает полезную абстрактную модель для размышления о временных рядах в целом и для лучшего понимания
проблем во время анализа и прогнозирования временных рядов.
Эти компоненты определены следующим образом:
- ***уровень***: Среднее значение в серии.
- ***тренд***: Увеличение или уменьшение значения в серии.
- ***Сезонность***: Повторяющийся краткосрочный цикл в серии.
- ***Шум***: Случайное изменение в ряду.
С помощью функции `seasonal_decompose()` библиотеки `statsmodels` мы выделили составляющие нашего временного ряда приняв аддитивную модель:
- ***трендовая составляющая*** линейная (*аддитивная компонента*);
- ***сезонная совтаялющая*** линейная, имеет одинаковую частоту (ширина циклов) и амплитуду (высота циклов) (*аддитивная компонента*).
В решении нашей задачи - *прогнозирование общего количества заказов такси* будем использовать трендовую составляющую.
Если бы перед нами стояла задача прогнозирования количества заказов на конкретное время суток, в этом случае целесообразно
использовать данные сезонной составляющей.
'''
conclusion_monotony = '''
***Временным рядом*** (рядом динамики, динамическим рядом) называется последовательность значений показателя или признака,
упорядоченная в хронологическом порядке, ***т.е. в порядке возрастания временного параметра***.
Таким образом проверка на монотонность индекса временного ряда является необходимым требованием к исходным данным.
Свойство `Index.is_monotonic_increasing` возвращает логическое значение, если значения равны или увеличиваются.
***Проверка индекса нашего временного ряда указывает на его монотонность.***
'''
conclusion_stationarity = '''
***Понимание того, стационарные ли у нас данные или нестационарные важно для последующего моделирования.***
- По тесту `Dickey-Fuller` вероятность `p-value=0.03`, что ниже 0.05. Мы можем отвергнуть нулевую гипотезу.
`***Процесс стационарный***`.
- По тесту `KPSS` вероятность `p-value=0.01`, что меньше уровня 0.05. Мы можем отвергнуть нулевую гипотезу.
`***Процесс нестационарный***`.
- В нашем случае мы получили ряд разностно стационарный. Рекомендовано дифференцировать временной ряд для приведения
его к стационарному виду.
***Поскольку тесты не показали строгой стационарности временного ряда мы можем оставить вопрос о стационарности
такого временного ряда нерешённым***.
'''
conclusion_construction = '''
На этапе предобработки данных сконструировали новые признаки:
- `month` - месяц;
- `hour` - час;
- `dayofweek` - день недели;
- `rolling_mean_D` - дневная скользящая средняя;
- `rolling_mean_W` - недельная скользящая средняя.
'''
#---------------------------------------------EDA-----------------------------------------------------------------------
conclusion_analisys_total_trend = '''
Визуальный анализ общей тенденции говорит нам **о наличии восходящего тренда**.
Декомпозиция временного ряда подтверждает визуальные представления.
'''
conclusion_analisys_hour = '''
Анализ заказов такси в суточном разрезе (на 24 часовой группировке) показал нам следующее:
- наиболее активные часы для заказов: **00:00 час, 16:00 час, 02:00 час**.
- наиболее активный период - **с 21:00 до 03:00**.
- наименее активный период - **с 05:00 до 07:00**.
'''
conclusion_analisys_week = '''
Анализ заказов такси в недельном разрезе (на группировке по дням недели) показал нам следующее:
- наиболее активные дни недели для заказов: **пятница, понедельник, четверг**.
- наименее активные дни для заказов: **вторник, воскресение**.
'''
conclusion_analisys_month = '''
Сравнительный анализ по месяцам выявил следующее:
- анализ подтвердил восходящий тренд;
- данные за август в сравнени с начальным месяцем демонстрируют значительный размах:
| Статистика | Март | Апрель | Май | Июнь | Июль | Август|
|------------|------|--------|-----|------|------|--------|
| min | 1 | 0 | 2 | 6 | 11 | 13 |
| 25% | 39 | 43 | 53 | 61 | 76 | 91 |
| 50% | 55 | 61 | 71 | 83 | 98 | 122 |
| 75% | 75 | 80,5 | 92 | 103 | 122 | 160 |
| max | 182 | 253 | 234 | 229 | 251 | 462 |
'''
conclusion_analisys_autocorrelation = '''
Наша функция автокорреляции рассчитана со смещением 36 лаг.
Автокорреляция позволяет выявлять тренд и сезонность, а также используется при подборе параметров моделей.
То, что корреляция постоянно положительная говорит о **наличии тренда**. Все это согласуется с тем, что мы узнали о данных,
когда раскладывали их на компоненты.
Синяя граница позволяет оценить статистическую значимость корреляции. Если столбец выходит за ее пределы,
то автокорреляция достаточно сильна и ее можно использовать при построении модели.
Мы видим, что лаг 24 сильнее коррелирует с исходным рядом, чем соседние лаги 23 и 22.
Такая автокорреляция позволяет предположить **наличие (суточных) циклических колебаний**.
В целом автокорреляция подтверждает результат декомпозиции временного ряда.
Однако по графику автокорреляции можно сделать предположение, что **сезонная составляющая несет больший вклад,
чем трендовая**. Это подтверждают результаты тестирования на стационарность временного ряда.
'''
#------------------------------------------ОБУЧЕНИЕ И ТЕСТИРОВАНИЕ------------------------------------------------------
conclusion_transform_data_train = '''
В нашем пространстве признаков есть три категориальных признака: `month`, `hour`, `dayofweek`.
Теория ML требует привести категориальные признаки к цифровому виду посредством разных методик кодирования.
Мы использовали встроенную в `pandas` функцию `get_dummies()`. В результате дамми-кодирования наше пространство признаков
увеличилось от 6 до 40.
Мы разделили все данные с помощью метода `train_test_split()` на обучающую и тестовую выборки в пропорции **9:1**.
В итоге получили обучающую выборку размером **(3807, 40)**, тестовую выборку размером **(442, 40)**.
Далее выполнили масштабирование данных посредством стандартизации.
'''
conclusion_train_models = '''
Для обучения и тестирования мы выбрали алгоритмы классического машинного обучения для моделирования:
- Регуляризованная линейная модель гребневой регрессии `Ridge` (L2 регуляризация)
- Регуляризованная линейная модель лассо регрессии `Lasso` (L1 регуляризация)
- Регуляризованная линейная модель регрессии эластичная сетка `ElasticNet` (L1,L2 регуляризации)
- Ансамбль `Random Forest` (мажоритарное голосование)
- Ансамбль `Light GBM` (градиентный бустинг)
- Ансамбль `XGB Boost` (градиентный бустинг)
'''
conclusion_model_selection = '''
В обучении мы использовали модели со значениями по умолчанию.
Как видно из сравнительной таблицы, на этапе обучения с параметрами по умолчанию мы достигли удовлетворительной
метрики `rmse < 48`. В связи с чем мы не будеи выполнять оптимизацию гиперпараметров.
Все модели показали на тестовой выборке удовлетворительный результат, однако ансамбли продемонстрировали
сильное переобучение.
**Из стека исследованных моделей рекомендуется регуляризованная модель `LassoCV`**
'''