{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# День первый, обзорный\n",
"И сегодня нас ждут следующие темы:\n",
"1. Определения и примеры,\n",
"2. Элементы теории вероятностей и математической статистики,\n",
"3. Немного о том, почему машинное обучение вообще работает,\n",
"4. Об инструментарии: `jupyter lab` и `python`,\n",
"5. Как делаются исследования в сфере анализа данных, процесс,\n",
"6. Обзор дальнейших разделов курса на примерах результатов."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.1 Определения алгоритма, модели, метрик и задач машинного обучения"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Формальные определения требуют владения серьезным математическим аппаратом. Мы попробуем обойтись без этого.\n",
"\n",
"Самое первое, из того что нам понадобится, это понятие **датасета** (или *набора данных*). Это прямоугольная таблица значений, каждая строка которой называется **пример**, или же **sample**, а каждая колонка - **признак** или, что то же самое, **feature**."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Индекс примера | Признак_1 | Признак_2 | Признак_3 | Признак_4 | Признак_5 \n",
"-----------------|-----------|-----------|-----------|-----------|-----------\n",
" 1 | 10 | 20 | \"строка 1\"| True | 3.1415926 \n",
" 2 | 15 | 10 | \"строка 2\"| False | 2.71 \n",
" 3 | 12 | 40 | \"строка 3\"| False | -1.12345 "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Для **задач обучения с учителем**, один выбранный признак - вся колонка - объявляется как **целевая величина**, или **target** (часто обозначают как `y`), оставшиеся признаки мы так и будем называть признаками (features), их часто обозначают как `X`. \n",
"\n",
"> В задаче обучения с учителем, необходимо предсказывать целевую величину с помощью входных признаков. Она называется \"с учителем\", потому что для ряда примеров у нас есть правильные ответы, и на них можно \"научиться\" предсказывать.\n",
"> \n",
"> Для **задач обучения без учителя** - правильных ответов нет, и задача исследователя - найти некоторые полезные структуры в данных. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Что позволяет научиться машине предсказывать ответы или исследовать данные? \n",
"Снова обойдемся без очень формальных определений, так как приведенные ниже определения сконструированы именно под этот курс.\n",
"\n",
"1. **Модель** - это функция, которая принимает одно или более значений на входе, выдаёт значения на выходе (чаще всего одно - предсказание целевой величины),\n",
"2. **Метрика** - это число, получаемое в результате сравнения известных правильных ответов, и тех, которыми отвечает модель. Иногда это можно называть ошибкой модели,\n",
"3. **Алгоритм** - это инструкции, которые принимают на вход данные, а выдают на выходе *модель*.\n",
"\n",
"> В машинном обучении существует множество заготовленных *алгоритмов*, которые позволяют *по данным* строить *модели* так, чтобы *ошибка модели* была насколько это возможно меньше.\n",
"\n",
"![Model Diagram](media/diagram_model.svg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"По типу значений *целевого признака* при обучении с учителем, задачи делят на как минимум следующие:\n",
"1. Регрессия - когда целевой признак, это любое вещественное число (с запятой), например рост, вес, количество денег,\n",
"2. Классификация - когда целевой признак принимает значения из заранее заданного множества (да/нет, собака/кошка/лошадь/...)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Пример\n",
"\n",
"Давайте рассмотрим пример алгоритма, модели и метрики. В этом разделе уже пойдет код, вдаваться в детали которого мы пока не будем, но в этом же лекционном дне далее станет ясно, что в нём происходит.\n",
"\n",
"> Представим себе ситуацию, когда мы случайно попадаем на необитаемый остров, и видим незнакомый нам фрукт. С легкой руки назовём *мангустин*. Мы попробовали 10 таких фруктов, и составили таблицу.\n",
"> \n",
"> Для каждого мангустина, мы некоторым образом знаем его размер в сантиметрах и вес в граммах, а также вкусный он или нет (да/нет)."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
weight
\n",
"
radius
\n",
"
tasty
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
50.000000
\n",
"
0.500000
\n",
"
False
\n",
"
\n",
"
\n",
"
1
\n",
"
58.333333
\n",
"
0.833333
\n",
"
False
\n",
"
\n",
"
\n",
"
2
\n",
"
66.666667
\n",
"
1.166667
\n",
"
False
\n",
"
\n",
"
\n",
"
3
\n",
"
75.000000
\n",
"
1.500000
\n",
"
False
\n",
"
\n",
"
\n",
"
4
\n",
"
83.333333
\n",
"
1.833333
\n",
"
True
\n",
"
\n",
"
\n",
"
5
\n",
"
91.666667
\n",
"
2.166667
\n",
"
False
\n",
"
\n",
"
\n",
"
6
\n",
"
100.000000
\n",
"
2.500000
\n",
"
True
\n",
"
\n",
"
\n",
"
7
\n",
"
108.333333
\n",
"
2.833333
\n",
"
True
\n",
"
\n",
"
\n",
"
8
\n",
"
116.666667
\n",
"
3.166667
\n",
"
True
\n",
"
\n",
"
\n",
"
9
\n",
"
125.000000
\n",
"
3.500000
\n",
"
True
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" weight radius tasty\n",
"0 50.000000 0.500000 False\n",
"1 58.333333 0.833333 False\n",
"2 66.666667 1.166667 False\n",
"3 75.000000 1.500000 False\n",
"4 83.333333 1.833333 True\n",
"5 91.666667 2.166667 False\n",
"6 100.000000 2.500000 True\n",
"7 108.333333 2.833333 True\n",
"8 116.666667 3.166667 True\n",
"9 125.000000 3.500000 True"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%matplotlib inline\n",
"# магическая команда для отображения диаграмм в jupyter-тетрадках\n",
"\n",
"# импорт библиотек\n",
"import numpy as np # библиотека для удобной работы с массивами\n",
"import pandas as pd # библиотека для удобной работы с датасетами\n",
"\n",
"import matplotlib.pyplot as plt # библиотека для графики\n",
"import seaborn as sns # библиотека для отображения диаграмм\n",
"\n",
"# создадим наш датасет и наполним его синтетическими данными\n",
"dataset = pd.DataFrame({\n",
" 'weight': np.linspace(50, 125, 10), # 10 записей\n",
" 'radius': np.linspace(0.5, 3.5, 10), # еще десять записей,\n",
" 'tasty': [False] * 4 + [True, False] + [True] * 4 # наш целевой признак\n",
"})\n",
"\n",
"dataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Все наши знания о мангустинах приведены в этой таблице. Нам надо использовать некоторый алгоритм, который создаст модель для предсказания по размеру и весу - будет ли мангустин вкусным.\n",
"Сначала отобразим наши данные на плоскости, возможно это позволит сделать некоторые предположения."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.scatterplot(x=\"weight\", y=\"radius\", hue=\"tasty\", data=dataset); # зададим что по осям и что брать за цвет"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Уже из данной диаграммы видно, что чем больше размер и вес, тем мангустин ***обычно*** вкуснее, но есть и исключения. Мы не будем особо мудрствовать, и используем следующий метод для построения модели\n",
"\n",
"1. Модель - пусть это функция $tasty = f(weight, radius) > threshold = weight * a + radius * b > threshold$, где `a`, `b`, и `threshold` - называются параметрами модели,\n",
"\n",
"2. Метрика (ошибка модели) - количество *неправильно* классифицированных примеров,\n",
"\n",
"Пусть `N` - количество примеров (известных нам мангустинов), и пусть наш алгоритм будет следующим: \n",
"$$a = \\frac {max(weight) - min(weight)} {N},$$\n",
"$$b = \\frac {max(radius) - min(radius)} {N},$$\n",
"\n",
"`threshold` же находится перебором с шагом 1 по всем записям, лучшим считается тот, который дает минимум нашей метрике."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Порог 0.0 дал улучшение, неправильных ответов 5\n",
"Порог 376.0 дал улучшение, неправильных ответов 4\n",
"Порог 438.0 дал улучшение, неправильных ответов 3\n",
"Порог 501.0 дал улучшение, неправильных ответов 2\n",
"Порог 563.0 дал улучшение, неправильных ответов 1\n"
]
},
{
"data": {
"text/plain": [
"[7.5, 0.3, 563.0]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# наша арифметическая модель\n",
"def model(weight, radius, a, b, threshold):\n",
" return weight * a + radius * b > threshold\n",
"\n",
"# подсчет метрики как суммы несовпадающих ответов\n",
"# True соответствует 1, False соответствует 0\n",
"def metric(y_true, y_predicted):\n",
" return sum(y_true != y_predicted)\n",
"\n",
"def algorithm_create_model(data):\n",
" # здесь .max и .min - это всей колонке нашей таблицы\n",
" a = (data.weight.max() - data.weight.min()) / len(data)\n",
" b = (data.radius.max() - data.radius.min()) / len(data)\n",
" \n",
" best_metric = np.inf # инициализируем бесконечностью\n",
" best_threshold = None\n",
" \n",
" # перебор будем вести до максимума значений до сравнения\n",
" model_maximum = data.weight.max() * a + data.radius.max() * b\n",
" \n",
" # для каждого порога\n",
" for threshold in np.arange(0, model_maximum, 1.):\n",
" y_predicted = []\n",
" for index in range(len(data)): # пройдем по всем примерам\n",
" predicted = model(\n",
" data.weight.values[index],\n",
" data.radius.values[index],\n",
" a, b, threshold\n",
" )\n",
" # подсчитаем прогноз модели\n",
" y_predicted.append(predicted)\n",
" \n",
" # подсчитаем метрику по всем примерам\n",
" current_metric = metric(\n",
" y_true=data.tasty, \n",
" y_predicted=y_predicted\n",
" )\n",
" \n",
" # сверим, дает ли текущий порог лучше качество\n",
" # и сохранием его, если так\n",
" if current_metric < best_metric:\n",
" best_metric = current_metric\n",
" best_threshold = threshold\n",
" \n",
" print(\"Порог %.1f дал улучшение, неправильных ответов %d\" % (\n",
" threshold, current_metric\n",
" ))\n",
" \n",
" return [a, b, best_threshold]\n",
" \n",
"algorithm_create_model(dataset)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ВАЖНО!\n",
"\n",
"> Мы \"обучили\" модель на всех доступных данных, и мы НЕ можем быть уверенными, что она их просто не запомнила.\n",
"> Чтобы быть до некоторой степени уверенным, мы должны проверять качество модели на отложенном тестовом множестве.\n",
"\n",
"Перемешаем данные и проверим предсказания на трех отложенных мангустинах."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Порог 0.0 дал улучшение, неправильных ответов 4\n",
"Порог 536.0 дал улучшение, неправильных ответов 3\n",
"Порог 626.0 дал улучшение, неправильных ответов 2\n",
"Порог 715.0 дал улучшение, неправильных ответов 1\n",
"Порог 805.0 дал улучшение, неправильных ответов 0\n"
]
},
{
"data": {
"text/plain": [
"'Количество неправильных предсказаний из 3 тестовых: 1'"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = dataset.copy().sample(\n",
" frac=1., # выберем все записи в случайном порядке\n",
" random_state=1 # зафиксируем генератор случайных чисел для воспроизводимости\n",
")\n",
"\n",
"# отложим наши множества, в тестовом будет только три случая с конца\n",
"train = data[:-3]\n",
"test = data[-3:]\n",
"\n",
"a, b, threshold = algorithm_create_model(train)\n",
"\"Количество неправильных предсказаний из 3 тестовых: %d\" % metric(\n",
" test.tasty,\n",
" model(test.weight, test.radius, a, b, threshold)\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Как видим, наша модель ошибается в 1 случае из 3. Можно догадаться, что она ошибается в том случае, когда метки нарушают возрастающий порядок в размерах и весе мангустина."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1gAAAFgCAYAAACmKdhBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdeZyVdd3/8deHYWCGRUAWN0woNxRwxFEx/Hlr5EKRmdliaW5ppe23a3fb7a13mt1W5lJ2a1RSt6Vl5pZZmEsuDTgaCu6QgCCLIMsAw/D9/XEOOAwDDHCdOefMvJ6Pxzw41/fa3nPE8+Fzru+5TqSUkCRJkiRtvy7FDiBJkiRJHYUNliRJkiRlxAZLkiRJkjJigyVJkiRJGbHBkiRJkqSM2GBJkiRJUkZssCRJkiQpIzZYKhsRMSMi3ttsefeIWBkRDxYxliRJmcvXvIaIWNbsZ2VEPFLsbJI2zwZL5eybwPJih5AkqUA+kFLqte4H+GyxA0naMhsslaWI2BP4OHBNi/H9I+LPEbEoIuZFxNci4rBm7/41RsTqZsvviIjTm78jGBEXRkRad7UsIr4dEbc0W981v35IfnlCRFzWPFtEpGbLD0bEp1v5HS6LiAnNlkdHxN8jYnFEPB0RR27m938ov93iiLg9Inrnxzf4XfJjs9YdKyIOiYjH8vu9HhHXRkS3/LojI2JWs/1aLu+aP9f8iHg1Ir7YbN3WPkf35Nd3zS8Pi4hHI+Kt/H+Xpog4fVO/vyR1dvkrXJdExHMR8WZE/CwiqpqtHx8R9fnX+79HxMgW+9/SrB42tHi9r46I/4mImRGxJCIeyY8NafHafW5EPBsR/fPLZ0TEtIhYGhGvRMRnmh1zTL52LIuI1yLivGbrNrffBrUoP/bIuhrRhhreIyJ+E7l/FyzL/84Ttvf5lzbHBkvl6j+BG4HZ6wbyTcYDwH3ArsCewF9SSo81e/dvIvDdZu8I/qv5QSOiH/BFYHE7/R7rzrsbcDdwGbAjcD5we0QM3MQunwcGALsDOwCnt/FUTcBX8vseBowFzs2vW8smXhMiogvwR+BpYLf8fl+OiGPbeN7mxzoSGNli+FvANGDH/H+nx7b2uJLUCX0SOBZ4F7A38HWAiBgF3Ax8BugP/AS4MyK6N9s3gMvzr7njWhz3e8BBwLvJ1aQLydWIt3eO+Di5WnVsSmlhfvgNYDy5unQG8P18FoAXgP+XP9/xwFUR0acN+7XZJmr4p4B9gKH5c393a48rbS0bLJWdiNif3AvxFS1WjQfmppT+J6W0MqW0NKX0xFYe/j/IFaUlGUTdGqcA96SU7kkprU0p/RmoA97X2sYppWdSSmvIFcg1wD/bcpKU0uSU0uMppTUppRnkiu6/5Ve/BgyKiANa2fVgYGBK6dKU0uqU0ivAT8ldRWyziAhyxe2bLVcBFfiaJElb49qU0msppUXA5cDJ+fGzgZ+klJ5IKTWllH4OrAJGN9u3Gljd8oD5N9TOBL6UUpqd3//vKaVVzTY7DrgJGJdSWn91KaV0d0rp5ZTzN+B+4P/l181vtm0Az5Of5r+5/bZSazU8eLvGSO3Cf8yoHP0X8KOU0vwW47sDL2/rQSPiHcBHgataWf3RdVPygAWtrD+/2fopray/ptm0vJubT+PI2wP4SLNpf4uBw4FdNpP3GeBNckXyhWarRrc4zq7N9tk7Iu6KiLkR8Rbw3+SuZpFSehW4FPhzfr+7WuTbtcVxvwbstBXPEeSe34XAX1uMfw14J7Aiv//oljtKkjbyWrPHM3n79X4P4N9bvGbv3mw9wM5AyzoKuZpQxebr6f8CM3j7DToAImJcRDyen463mNybhAOarT88IpYCTwB35N8o3OJ+bFx/NqoRm6nhPwf+AcyPiCXkrrpJBWWDpXJTCxxJbvpCS6+RmyaxrS4jN31waSvrfpNS6ptS6suGL/rrfK/Z+tamNXwxv244uWkXp7dY/xrwy3XHyP/0TCm1vEq3XkppJNA7v+/3m616vPlxgDnN1t0ATAf2SintQK6xiWbHvDSlNCi/3/gW+V5tka93Sqn5FbYtPUeV5Jrji1r5XV4mN/3wJ/n9H9/U7y1JWm/3Zo/fwduv96+Rm/7X/DW7R0rp1wARUUmuHj3dyjEXACvZfD09GfgYcHlE7J4/ZnfgdnL1eaf8a/k9bFhjHkkp9Qb2Az6Xb6y2uB8wp0Vda61GtFrDU0oryL1hOJXcdMnW/v0gZcoGS+XmAnLNTGufkboL2DkivhwR3SOid0Qc2sbj7gkcSm7KXCEtJzdNo+X/e7cAH4iIYyOiIiKq8h/sHdzyABHRKyKG5he7kmtcGtp4/t7AW8CyiNgX+Fwb93sSeCsiLsp/0LkiIoZHxMFt3B/gVODvKaVnWq6IiNHACcAlW3E8SerszouIwRGxI7k3zG7Nj/8U+GxEHBo5PSPi/fnPKkPuc05zyU1F30BKaS25aXZXR+7mRhWRu1lU889vPZxSmkruRlPr6mY3oDu5q2JrImIccMy6HSLinRHRK7/YnVwdbNjSfm20yRqe/5zXNcDZ666YSYVmg6Vy00SLOweuk3/X6mjgA+QKx4vAUW087k7A11NKjVmEbMV383dBegV4CfhZ85UppdeAD5IrkPPJvft4Aa3/P9qH3IeVlwKvkitMF7cxx/nAJ4Cl5ArwrZvffH2+JnLPa03+nAvITRHps7n9WugHfKPlYP6d1J+Sm+//1lYcT5I6u1+R+7zSK/mfywBSSnXkPod1Lbmp5C+RnzkREZ8k14gMBZZGxDLgXnLT8H6cP+755D7b+w9gEXAlrdej7wC7RMRp+Rr8ReA3+XN+Ariz2bZHAi/kz3cX8P2U0oNt2K8tNlfDrwJ+l1J6ciuPKW2zSClteStJkiSVjIiYAXw6pfTAVu53OjAkpfTtFuODgctSSqdnFFHqtLyCJUmS1HksJzdVvKU15K5WSdpOXsGSJEkqM9t6BUtS4dlgSZIkSVJGnCIoSZIkSRnpWuwAW2vAgAFpyJAhxY4hSSqgyZMnL0gpDSx2jm1lrZKkjm9TtarsGqwhQ4ZQV7fR1zZIkjqQiJhZ7Azbw1olSR3fpmqVUwQlSZIkKSM2WJIkSZKUERssSZIkScpI2X0GqzWNjY3MmjWLlStXFjtK0VVVVTF48GAqKyuLHUWS1Iy1KnvWPEmlqEM0WLNmzaJ3794MGTKEiCh2nKJJKbFw4UJmzZrF0KFDix1HktSMtSpb1jxJpapDTBFcuXIl/fv37/QFKyLo37+/745KUgmyVmXLmiepVHWIBguwYOX5PEhS6fI1Ols+n5JKUYdpsCRJkiSp2ArWYEVEVUQ8GRFPR8SzEfGfrWxzZEQsiYj6/M83C5WnkBYvXsz111+/Tfv+4Ac/YMWKFRknkqQiWL0Cls6FZW9ASsVO0yadqVZl7cEHH2T8+PEA3HnnnVxxxRWb3LZlnZwzZw4nnXRSwTNK0kaWL8zVqpVvFewUhbyCtQp4T0rpAKAGOC4iRrey3cMppZr8z6UFzFMwNliSOr3lC+CBb8G1B8OE98HMR2F1Q7FTtUWnqVVt1dTUtNX7HH/88Vx88cWbXN+yTu66667cdttt25RPkrbJ2iZ4Yzr86iNwzYHwh/NyjVYBFKzBSjnL8ouV+Z/yeEtzK1188cW8/PLL1NTU8JWvfIWxY8cyatQoRowYwR/+8AcAli9fzvvf/34OOOAAhg8fzq233so111zDnDlzOOqoozjqqKO46aab+MpXvrL+uD/96U/56le/WqxfS5LapqkR/nETPHkjrHoLFrwIv/ggNCwqdrIt6ky1CmDGjBnsu+++nHbaaYwcOZKTTjqJFStWMGTIEC699FIOP/xwfvvb33L//fdz2GGHMWrUKD7ykY+wbFnuKbrvvvvYd999Ofzww/nd7363/rgTJkzg85//PADz5s3jQx/6EAcccAAHHHAAf//73zeokxdccAEzZsxg+PDhQO7mH2eccQYjRozgwAMPZNKkSeuPeeKJJ3Lcccex1157ceGFF7bzsyWpQ1m+AH4+HmZPhsYVMO1OuOsrsHJJ5qcq6G3aI6ICmAzsCVyXUnqilc0Oi4ingTnA+SmlZwuZqRCuuOIKpk6dSn19PWvWrGHFihXssMMOLFiwgNGjR3P88cdz3333seuuu3L33XcDsGTJEvr06cPVV1/NpEmTGDBgAMuXL2fkyJF897vfpbKykp/97Gf85Cc/KfJvJ0lbsHIxTPvDhmNr18C8qdBnt+Jk2gqdpVat8/zzz3PTTTcxZswYzjzzzPVXlqqqqnjkkUdYsGABJ554Ig888AA9e/bkyiuv5Oqrr+bCCy/k7LPP5q9//St77rknH/vYx1o9/he/+EX+7d/+jd///vc0NTWxbNmyDeok5Bq9da677joA/vnPfzJ9+nSOOeYYXnjhBQDq6+t56qmn6N69O/vssw9f+MIX2H333Qv47EjqsFYvheXzNxx78X5oXAlVfTI9VUFvcpFSakop1QCDgUMiYniLTaYAe+SnZvwIuKO140TEORFRFxF18+fPb22TkpFS4mtf+xojR47kve99L7Nnz2bevHmMGDGCBx54gIsuuoiHH36YPn02/g/Zs2dP3vOe93DXXXcxffp0GhsbGTFiRBF+C0naCpU9YOB+G4/3K4/vJupstWr33XdnzJgxAJxyyik88sgjAOsbpscff5znnnuOMWPGUFNTw89//nNmzpzJ9OnTGTp0KHvttRcRwSmnnNLq8f/617/yuc99DoCKiopW611zjzzyCKeeeioA++67L3vsscf6Bmvs2LH06dOHqqoq9ttvP2bOnLn9T4CkzqmyJ1R023Bs4D7QJft2qF3uIphSWgw8CBzXYvytdVMzUkr3AJURMaCV/W9MKdWmlGoHDhzYHpG32cSJE5k/fz6TJ0+mvr6enXbaiZUrV7L33nszefJkRowYwSWXXMKll7Y+hf/Tn/40EyZM4Gc/+xlnnHFGO6eXpG3QrSe891vQd4/ccgQc9nnoVdqv1y11llrV8tbm65Z79uwJ5N4oPProo6mvr6e+vp7nnnuOm266qdV9s5A2c0OU7t27r39cUVHBmjVrMj+/pE6iagcY/32oqMwv94UTboCe2b9eF/IuggMjom/+cTXwXmB6i212jvyrdUQcks+zsFCZCqV3794sXboUyE39GzRoEJWVlUyaNGn9u21z5syhR48enHLKKZx//vlMmTJlo30BDj30UF577TV+9atfcfLJJ7f/LyNJ26Lv7vDpB+Dzk+HLU+GIC6G6X7FTbVFnqlXr/Otf/+Kxxx4D4Ne//jWHH374ButHjx7No48+yksvvQTAihUreOGFF9h333159dVXefnll9fv25qxY8dyww03ALkbZrz11lsb1brmjjjiCCZOnAjACy+8wL/+9S/22Wef7f9FJam5bj1h/w/Bl56B8/4B5z0Jg/YvyKkKeQVrF2BSRDwD/AP4c0rproj4bER8Nr/NScDU/Lz2a4CPp829lVWi+vfvz5gxYxg+fDj19fXU1dVRW1vLxIkT2XfffYHc3PJDDjmEmpoaLr/8cr7+9a8DcM455zBu3DiOOuqo9cf76Ec/ypgxY+jXr/T/cSJJ6/UaBAP2hD6DoTrb+ewF1Glq1TrDhg3j5z//OSNHjmTRokXrp/OtM3DgQCZMmMDJJ5/MyJEjGT16NNOnT6eqqoobb7yR97///Rx++OHssccerR7/hz/8IZMmTWLEiBEcdNBBPPvssxvUyQsuuGCD7c8991yampoYMWIEH/vYx5gwYcIGV64kKTPdesIOu8LAvaH3TlBRmNtRRLnViNra2lRXV7fB2LRp0xg2bFiREmVv/Pjx6+9GuC062vMhqfOJiMkppdpi59hWpVqrZsyYwfjx45k6dWpRc2SpFJ5XSZ3TpmpVu3wGS22zePFi9t57b6qrq7e5uZIkSZJUPAW9Tbu2Tt++fdffOUmSpKwNGTKkQ129kqRS5BUsSZIkScqIDZYkSZIkZcQGS5IkSZIyYoMlSZIkSRnxJhcZqaioYMSIEeuX77jjDoYMGdLqtr169WLZsmXtlEySpBxrlSQVng1WRqqrq6mvry92DEmSNslaJUmF1ymnCN7x1GzGXPFXhl58N2Ou+Ct3PDU783MsW7aMsWPHMmrUKEaMGMEf/vCHjbZ5/fXXOeKII6ipqWH48OE8/PDDANx///0cdthhjBo1io985CO+gyhJnZC1SpLKU6drsO54ajaX/O6fzF7cQAJmL27gkt/9c7sLV0NDAzU1NdTU1PChD32Iqqoqfv/73zNlyhQmTZrEv//7v5NS2mCfX/3qVxx77LHU19fz9NNPU1NTw4IFC7jssst44IEHmDJlCrW1tVx99dXblU2SVF6sVZJUvjrdFMGr/vQ8DY1NG4w1NDZx1Z+e54QDd9vm47acdtHY2MjXvvY1HnroIbp06cLs2bOZN28eO++88/ptDj74YM4880waGxs54YQTqKmp4W9/+xvPPfccY8aMAWD16tUcdthh25xLklR+rFWSVL46XYM1Z3HDVo1vq4kTJzJ//nwmT55MZWUlQ4YMYeXKlRtsc8QRR/DQQw9x9913c+qpp3LBBRfQr18/jj76aH79619nmkeSVD6sVZJUvjrdFMFd+1Zv1fi2WrJkCYMGDaKyspJJkyYxc+bMjbaZOXMmgwYN4uyzz+ass85iypQpjB49mkcffZSXXnoJgBUrVvDCCy9kmk2SVNqsVZJUvjpdg3XBsftQXVmxwVh1ZQUXHLtPpuf55Cc/SV1dHbW1tUycOJF99913o20efPBBampqOPDAA7n99tv50pe+xMCBA5kwYQInn3wyI0eOZPTo0UyfPj3TbJKk0matkqTyFS0/zFrqamtrU11d3QZj06ZNY9iwYW0+xh1PzeaqPz3PnMUN7Nq3mguO3We75rSXmq19PiSp1ETE5JRSbbFzbCtrVfux5kkqlk3Vqk73GSyAEw7czSIlSSpp1ipJKk+dboqgJEmSJBWKDZYkSZIkZcQGS5IkSZIyYoMlSZIkSRmxwZIkSZKkjHTKuwhmbeHChYwdOxaAuXPnUlFRwcCBAwF48skn6datWzHjSepIls4DEvTeecPH0hZYqyS1izUrYflC6NYTKqveflzdt9jJ2o0NVgb69+9PfX09AN/+9rfp1asX559//vr1a9asoWtXn2pJ26lhMdz1FXjzVfjErXDrqVDdDz4yoVMVLm0ba5WkdrFqKfzoQDjya7DbQXDLifDxX8O73gNdOsfkuc75SvrMb+Avl8KSWdBnMIz9Joz8aKanOP3009lxxx156qmnGDVqFL17996gmA0fPpy77rqLIUOGcMstt3DNNdewevVqDj30UK6//noqKioyzSOpA6juC+OugJuOhh+MgJ4Dcs1VVZ9iJ1MhWKsklaOKKnj/9+EP5+aWR34cdjuw0zRX0Bk/g/XMb+CPX4QlrwEp9+cfv5gbz9gLL7zAAw88wP/8z/9scptp06Zx66238uijj1JfX09FRQUTJ07MPIukDqJr1dsNVfcdoLIaIoqbSdmzVkkqV10rYcehby/v+E6IznVNp3P9tpB7N7CxYcOxxobceMbvDH7kIx/Z4rt7f/nLX5g8eTIHH3wwAA0NDQwaNCjTHJI6iIbF8McvQ8ObcMrtcOcX4fefdYpgR2StklSuVi2FX54AI0+GwQfBPefnpgo6RbADWzJr68a3Q8+ePdc/7tq1K2vXrl2/vHLlSgBSSpx22ml85zvfyfz8kjqYdVME1zZBvyFw5n25x04R7HisVZLKVUUVfOpOGLAXVHSDnUfkHneS5go64xTBPoO3bjwjQ4YMYcqUKQBMmTKFV199FYCxY8dy22238cYbbwCwaNEiZs6cWdAskspY33fkmquIDR+rY7FWSSpXVb1h90OhR3/o3uxxJ9L5Gqyx38x9ZqG5yurceAF9+MMfZtGiRdTU1HDDDTew9957A7Dffvtx2WWXccwxxzBy5EiOPvpoXn/99YJmkVTmmjdUNlcdk7VKUjnr5HUqUkrFzrBVamtrU11d3QZj06ZNY9iwYW0/SDvcmamYtvr5kKQSExGTU0q1xc6xraxV7ceaJ6lYNlWrOt9nsCBXoCxSkqRSZq2SpLLU+aYISpIkSVKB2GBJkiRJUkZssCRJkiQpIzZYkiRJkpQRGyxJkiRJykjBGqyIqIqIJyPi6Yh4NiL+s5VtIiKuiYiXIuKZiBhVqDySJLVkrZIkZa2QV7BWAe9JKR0A1ADHRcToFtuMA/bK/5wD3FDAPAX17ne/e6v3+e///u9tPt+ECROYM2fONu8vSQKsVVtkrZKkrVOwBivlLMsvVuZ/Wn6r8QeBX+S3fRzoGxG7FCpTIf3973/f6n0sWpJUXNaqLbNWSdLWKehnsCKiIiLqgTeAP6eUnmixyW7Aa82WZ+XHWh7nnIioi4i6+fPnFy7wdujVqxcAr7/+OkcccQQ1NTUMHz6chx9+uNXtL774YhoaGqipqeGTn/wkALfccguHHHIINTU1fOYzn6GpqYmmpiZOP/10hg8fzogRI/j+97/PbbfdRl1dHZ/85CepqamhoaGh3X5PSeporFXWKknKUtdCHjyl1ATURERf4PcRMTylNLXZJtHabq0c50bgRoDa2tqN1peSX/3qVxx77LH8x3/8B01NTaxYsaLV7a644gquvfZa6uvrAZg2bRq33norjz76KJWVlZx77rlMnDiR/fffn9mzZzN1au5pW7x4MX379uXaa6/le9/7HrW1te32u0lSR2StslZJUpYK2mCtk1JaHBEPAscBzYvWLGD3ZsuDgbKeS3DwwQdz5pln0tjYyAknnEBNTU2b9vvLX/7C5MmTOfjggwFoaGhg0KBBfOADH+CVV17hC1/4Au9///s55phjChlfkjota9WWWaskacsKeRfBgfl3A4mIauC9wPQWm90JfCp/h6bRwJKU0uuFytQejjjiCB566CF22203Tj31VH7xi1+0ab+UEqeddhr19fXU19fz/PPP8+1vf5t+/frx9NNPc+SRR3Ldddfx6U9/usC/gSR1HtYqa5UkZa2Qn8HaBZgUEc8A/yA3r/2uiPhsRHw2v809wCvAS8BPgXMLmKddzJw5k0GDBnH22Wdz1llnMWXKlE1uW1lZSWNjIwBjx47ltttu44033gBg0aJFzJw5kwULFrB27Vo+/OEP81//9V/rj9e7d2+WLl1a+F9Ikjo2a5W1SpIyVbApgimlZ4ADWxn/cbPHCTivUBmK4cEHH+Sqq66isrKSXr16bfZdwXPOOYeRI0cyatQoJk6cyGWXXcYxxxzD2rVrqays5LrrrqO6upozzjiDtWvXAvCd73wHgNNPP53PfvazVFdX89hjj1FdXd0uv58kdSTWKmuVJGUtcnWjfNTW1qa6uroNxqZNm8awYcOKlKj0+HxIKncRMTmlVLZ3RrBWtR+fV0nFsqlaVdDbtEuSJElSZ9IudxHs7A499FBWrVq1wdgvf/lLRowYUaREkiRtyFolSdmwwWoHTzzR8jsrJUkqLdYqScqGUwQlSZIkKSM2WJLUmhVvQlPjxo8lSSoFa9dCw+KNH6vobLAkqaUVC+HP34B5z0LDm28/blpd7GSSJOUaqkWvwJ1fgOUL3n68bH6xkwkbrEwsXryY66+/fqv3e9/73sfixb7bIJWclHKN1c/GwS0fhn/+FtY25salMmWtkjqSBGktzHgYfvFBuPloWDo3N66is8HKwKaKVlNT02b3u+eee+jbt2+hYknaVj0HwIk/yT2ePRn+3/mw0wjo2r24uaTtYK2SOpAuFdD/XfC+q2DeVFixCE7+P+g1qNjJRCdtsO69917Gjx/PwQcfzPjx47n33nu363gXX3wxL7/8MjU1NRx88MEcddRRfOITn1h/a9sTTjiBgw46iP33358bb7xx/X5DhgxhwYIFzJgxg2HDhnH22Wez//77c8wxx9DQ0LBdmSRthxUL4c4v5d4d3HkkPHI1zJ/uFEG1K2uVpE1auxbenAH3XgQD9oaqvvCbTzlFsER0ugbr3nvv5fLLL2fu3LmklJg7dy6XX375dhWuK664gne9613U19dz1VVX8eSTT3L55Zfz3HPPAXDzzTczefJk6urquOaaa1i4cOFGx3jxxRc577zzePbZZ+nbty+33377NueRtJ1Sggg4/S447U7Y9/1OEVS7slZJ2rwEa5tgt1o44x4468/QrSdOESwNna7Buu6661i5cuUGYytXruS6667L7ByHHHIIQ4cOXb98zTXXcMABBzB69Ghee+01XnzxxY32GTp0KDU1NQAcdNBBzJgxI7M8krZSzwEw7qrc1avqfm8/doqg2om1StJmrZsieOJPoOfA/OMbnSJYIjrdFw3Pmzdvq8a3Rc+ePdc/fvDBB3nggQd47LHH6NGjB0ceeeRGRROge/e3/+FWUVHhtAup2Hr0a/2x1A6sVZK2qEtF7k3A9Y/9rGSp6HRXsHbaaaetGm+L3r17s3Tp0lbXLVmyhH79+tGjRw+mT5/O448/vs3nkSR1DtYqSSpfna7BOu+886iqqtpgrKqqivPOO2+bj9m/f3/GjBnD8OHDueCCCzZYd9xxx7FmzRpGjhzJN77xDUaPHr3N55EkdQ7WKkkqX5HK7EPbtbW1qa6uboOxadOmMWzYsDYf49577+W6665j3rx57LTTTpx33nmMGzcu66hFs7XPhySVmoiYnFKqLXaObWWtaj/WPEnFsqla1ek+gwUwbtw4i5QkqaRZqySpPHW6KYKSJEmSVCg2WJIkSZKUERssSZIkScqIDZYkSZIkZcQGS5IkSZIyYoOVgcWLF3P99ddv074/+MEPWLFiRcaJJEnakLVKktqHDVYGLFqSpFJnrZKk9tHpvgersbGRr371qwBceeWVXHTRRQBcffXVVFZWbtMxL774Yl5++WVqamo4+uijGTRoEL/5zW9YtWoVH/rQh/jP//xPli9fzkc/+lFmzZpFU1MT3/jGN5g3bx5z5szhqKOOYsCAAUyaNCmz31OSVL6sVZJUvjpdg/XVr36VKVOmAPC+972PxsbG9eM/+tGPtumYV1xxBVOnToS64/UAAB+DSURBVKW+vp7777+f2267jSeffJKUEscffzwPPfQQ8+fPZ9ddd+Xuu+8GYMmSJfTp04err76aSZMmMWDAgGx+QUlS2bNWSVL56rRTBFetWsWyZctYtWpVpse9//77uf/++znwwAMZNWoU06dP58UXX2TEiBE88MADXHTRRTz88MP06dMn0/NKkjoea5UklZ9O12BdeeWVG02vqKys5Lvf/W4mx08pcckll1BfX099fT0vvfQSZ511FnvvvTeTJ09mxIgRXHLJJVx66aWZnE+S1PFYqySpfHW6Buuiiy5aP9VincbGRi688MJtPmbv3r1ZunQpAMceeyw333wzy5YtA2D27Nm88cYbzJkzhx49enDKKadw/vnnr5/60XxfSZLAWiVJ5azTfQZrne7du1NZWblRAdsW/fv3Z8yYMQwfPpxx48bxiU98gsMOOwyAXr16ccstt/DSSy9xwQUX0KVLFyorK7nhhhsAOOeccxg3bhy77LKLHxyWJG3AWiVJ5SdSSsXOsFVqa2tTXV3dBmPTpk1j2LBhbdq/EHdmKjVb83xIUimKiMkppdpi59hW1qr2Y82TVCybqlWd7gpWZWXlBndg2ta7MUmSVCjWKkkqX53uM1iSJEmSVCgdpsEqt6mOheLzIEmly9fobPl8SipFHaLBqqqqYuHChZ3+hTalxMKFC6mqqip2FGnrrG3K/UgdmLUqW9Y8tbum7b/ZjDqHgn0GKyJ2B34B7AysBW5MKf2wxTZHAn8AXs0P/S6ltNVfujF48GBmzZrF/Pnzty90B1BVVcXgwYOLHUNqm8ZV8NYseDx3pzIOOxd67waV3YubS52Gtaq8WfPULlYshJl/h2d/D3u8G/b7IPQcWOxUKmGFvMnFGuDfU0pTIqI3MDki/pxSeq7Fdg+nlMZvz4kqKysZOnTo9hxCUjEsnQM3HAZrVuWWn/olnPcE9BtS1FjqVKxVkjatsQEevx4e+l5ueertMO2PcNLN0KN/cbOpZBVsimBK6fWU0pT846XANGC3Qp1PUhmqu/nt5gpgzUqY8svi5VGnY62StFkr34LHrt9w7JUHYfXyosRReWiXz2BFxBDgQOCJVlYfFhFPR8S9EbH/JvY/JyLqIqLOqRVSB1JZvfFYVz9PoeKwVklqVUW3jceiQ9zGQAVS8L8dEdELuB34ckrprRarpwB7pJQOAH4E3NHaMVJKN6aUalNKtQMHOudV6jBGfQqq+ry9XNUXaj5RvDzqtKxVklpV3Q+OvHjDseEnQbdexcmjslDQLxqOiEpyBWtiSul3Ldc3L2IppXsi4vqIGJBSWlDIXJJKRK9d4NzH4dk7ICL/weFBxU6lTsZaJWmTunaDkR+H3Q+B5++F3Q+FXQ+E6r7FTqYSVsi7CAZwEzAtpXT1JrbZGZiXUkoRcQi5K2oLC5VJUompqIAdds3dPVAqAmuVpC3q0Q96HAS7HVTsJCoThbyCNQY4FfhnRNTnx74GvAMgpfRj4CTgcxGxBmgAPp78ghBJUvuxVkmSMlWwBiul9AgQW9jmWuDaQmWQJGlzrFWSpKx5CxRJkiRJyogNliRJkiRlxAZLkiRJkjJigyVJkiRJGbHBkiRJkqSM2GBJkiRJUkZssCRJkiQpIzZYkiRJkpQRGyxJkiRJyogNliRJkiRlxAZLkiRJkjJigyVJkiRJGbHBkiRJkqSM2GBJkiRJUkZssCRJkiQpIzZYkiRJkpQRGyxJkiRJyogNliRJkiRlxAZLkiRJkjJigyVJkiRJGbHBkjqBFavWsHjF6o0eS5JUMlYsglVLN34slRkbLKmDa2hcwxOvLuKzt0xm8YrVPPbKQj57y2QWLbfJkiSViBWL4I7PwfP3wsoluccv/AlWLSt2MmmrdS12AEmF1b2ignfs2IPpc5fy/mse4fUlDZxzxDvpEsVOJklSXnSBdxwGvzsb+u4BKxbCe74OXauKnUzaal7Bkjq4Ll2CXftWceroPZi9uIHqygrOO2pP+vboVuxokiTlVPeFg8+CXoNg8UwY+THYcShUeC1A5ccGS+rgGhrX8Pgri7hu0kscu/9OVHbtwlkT/uEUQUlS6VixCG47C1avgP1PhLqb4Pn7nCKostSmtwUiYgxQn1JaHhGnAKOAH6aUZhY0naTttm6K4FfeuzenvXsI85eu4p5/vu4UQXU41iqpjEUXeOeRMPYb0HcIDD4YBu7jFEGVpbZewboBWBERBwAXAjOBXxQslaTMdOkSDB3Qk9PePYQdqivXP3aKoDoga5VUrqr7woGfhIHDoKr324+dIqgy1NYGa01KKQEfJPdu4A+B3oWLJSlLXboEO1RXbvRY6mCsVVI5q+rzdkPV/LFUZtr6N3dpRFwCnAIcEREVgP9CkySVEmuVJKno2noF62PAKuCslNJcYDfgqoKlkiRp61mrJElF16YrWPlCdXWz5X/hvHZJUgmxVkmSSkFb7yK4FEj5xW7kplwsSyn1KVQwSZK2hrVKklQK2noFa4MPCUfECcAhBUkkSdI2sFZJkkrBNn3RcErpDuA9GWeRJCkz1ipJUjG0dYrgic0WuwC1vD0NQ5KkorNWSZJKQVtv0/6BZo/XADPIfc/IJkXE7uQ+XLwzsBa4Mf+dJM23CeCHwPuAFcDpKaUpbcwkSVJz1ipJUtG19TNYZ2zDsdcA/55SmhIRvYHJEfHnlNJzzbYZB+yV/zkUuCH/pyRJW8VaJUkqBZttsCLiwpTSdyPiR7QyzSKl9MVN7ZtSeh14Pf94aURMI/edJM2L1geBX6SUEvB4RPSNiF3y+0qStEXWKklSKdnSFaxp+T/rtuckETEEOBB4osWq3YDXmi3Pyo9tULQi4hzgHIB3vOMd2xNFktTxWKskSSVjsw1WSumP+T9/vq0niIhewO3Al1NKb7Vc3dppW8lxI3AjQG1trR9YliStZ62SJJWSLU0R/CObuQNTSun4LexfSa5gTUwp/a6VTWYBuzdbHgzM2dwxJUlqzlolSSolW/oerO8B/wO8CjQAP83/LAOmbm7H/F2XbgKmpZSu3sRmdwKfipzRwBLntEuStpK1SpJUMrY0RfBvABHxXymlI5qt+mNEPLSFY48BTgX+GRH1+bGvAe/IH/vHwD3kbnv7Erlb327LHaAkSZ2YtUqSVEra+j1YAyPinSmlVwAiYigwcHM7pJQeofV56823ScB5bcwgSdLmWKskSUXX1gbrK8CDEfFKfnkI8JmCJJIkadtYqyRJRdfWLxq+LyL2AvbND01PKa0qXCxJkraOtUqSVAraegULct9gvw9QBRwQEaSUflGYWJIkbRNrlSSpqNrUYEXEt4Ajgf3Ifdh3HPAIYNGSJJUEa5UkqRRs6Tbt65wEjAXmppTOAA4AuhcslSRJW89aJUkqurY2WCtTSmuBNRGxA/AG8M7CxZLK2JpVsHwhrFld7CRSZ2Otktpq5VvQsLjYKaQOaYtTBPNfwvhMRPQl98WNk8l9eeOTBc4mlZ9l8+DRH8G/HoV3vQcO+Qz0GlTsVFKHZ62S2mh1Ayx4Hv76X7k3BI84H3Y9EKr6FDuZ1GFsscFKKaWIqEkpLQZ+HBH3ATuklJ4pfDypjKxYCL89HWb+Pbc8ewrMmwYnXA/VfYsaTerorFVSGy2bC/87FtauyS3PeBg+/QAMPri4uaQOpK1TBB+PiIMBUkozLFhSKxpXvN1crfPCPdDYUJw8UudjrZK25Lk/vN1crfPET5zWLmWorbdpPwr4TETMBJaT+9b7lFIaWbBkUrmJrtC1e27KxTrdd4CI4mWSOhdrlbQlO+zaythu0KWi/bNIHVRbG6xxBU0hdQRVO8BR/wF//ubbY8dcDtX9ipdJ6lysVdKWvPNIGLA3LHght9xzIBxyjg2WlKE2NVgppZmFDiKVvW49YdRpsM84mDsVdjkgV7i6epdoqT1Yq6Q26DUITr8b5k+HxpW5WuXNmKRMtfUKlqS2qO6b+xmwd7GTSJLUul6DbKqkAmrrTS4kSZIkSVtggyVJkiRJGbHBkiRJkqSM2GBJkiRJUkZssCRJkiQpIzZYkiRJkpQRGyxJkiRJyogNliRJkiRlxAZLkiRJkjJigyVJkiRJGbHBkiRJkqSM2GBJkiRJUkZssCRJkiQpIzZYkiRJkpQRGyxJkiRJyogNliRJkiRlxAZLkiRJkjJigyVJkiRJGbHBkiRJkqSM2GBJkiRJUkZssCRJkiQpIzZYkiRJkpSRgjVYEXFzRLwREVM3sf7IiFgSEfX5n28WKos6nkXLV/PCvKU88epC3nhrJU1rU7EjSSpD1ioVStPaxBtvreTJVxfxwtylLFq+utiRJLWTrgU89gTgWuAXm9nm4ZTS+AJmUAe0aPkqLvndVP707FwA+lRX8ofzxjBkQM8iJ5NUhiZgrVIBzHpzBR+87lEWr2gE4Oj9BnHlh0eyY8/uRU4mqdAKdgUrpfQQsKhQx1fn9fqSleubK4AlDY1c+afpLFvVWMRUksqRtUqFsHzVGq760/PrmyuAPz/3BrPfXFnEVJLaS7E/g3VYRDwdEfdGxP6b2igizomIuoiomz9/fnvmUwmau2TjAjVrUQOr16wtQhpJnYC1Sltl1Zq1zHqzYaPxuW9tPCap4ylmgzUF2COldADwI+COTW2YUroxpVSbUqodOHBguwVUadp/1x2oqtzwr+5Ha3enT3W3IiWS1IFZq7TV+lZX8tHawRuMde/aheG79SlSIkntqWgNVkrprZTSsvzje4DKiBhQrDwqHzv27Mbvzx3DYe/qz56DevHN8cMYP3IXKrpEsaNJ6mCsVdoWXboE44bvwjc/sB97DurFYe/sz+/PHUP/nr4RKHUGhbzJxWZFxM7AvJRSiohDyDV7C4uVR+WjW9cKhu2yAz8+ZRSNTYl+1ZVUVBR7tqukjshapW3Vr2c3Thu9B8cfsCuVXYI+PWyupM6iYA1WRPwaOBIYEBGzgG8BlQAppR8DJwGfi4g1QAPw8ZSS99pWmzklUNL2slapkCoqujCgl3cNlDqbgjVYKaWTt7D+WnK3xpUkqSisVZKkrDmvSpIkSZIyYoMlSZIkSRmxwZIkSZKkjNhgSZIkSVJGbLAkSZIkKSM2WJIkSZKUERssSZIkScqIDZYkSZIkZcQGS5IkSZIyYoMlSZIkSRmxwZIkSZKkjNhgSZIkSVJGbLAkSZIkKSM2WJIkSZKUERssSZIkScqIDZYkSZIkZcQGS5IkSZIyYoMlSZIkSRmxwZIkSZKkjNhgSZIkSVJGuhY7gErbmqa1vLliNUGwY89udOkSxY4kSdIGlq1sZEVjE1VdK9ihurLYcSR1cjZY2qTFK1Zz19Nz+PFDr9CtogsXHLcPh+85gN5VFi9JUmmYu2Qll971LI+/sogRg/tw+QnDGdyvR7FjSerEnCKoTXpm1hK+/odnmfVmA68sWM7nbpnC7MUNxY4lSRIAby5fzZf+7ynu+edcFi1fzd+en8/pP/sHC5atKnY0SZ2YDZZa1di0lt/WvbbR+H1T5xYhjSRJG1u1Zi1PvLpog7GX3ljGysamIiWSJBssbULXLsF+u/bZaHzYLjsUIY0kSRvr0gUG9e6+wVjPbhVUVvjPG0nF4yuQWhURnHTQbuyzU+/1Y6PfuSMH7dGviKkkSXpb/x7duPqjB9C9a+6fM127BN85cSR9vNGFpCLyJhfapIG9q5h49qEsXr6aLl2CPtWV9O/Vfcs7SpLUDioqulA7ZEceuvAoFixdRf9e3ehdVUlVZUWxo0nqxGywtFkDenVngE2VJKlEVVVWUFVZwU47VBU7iiQBThGUJEmSpMzYYEmSJElSRmywJEmSJCkjNliSJEmSlBEbLEmSJEnKiA2WJEmSJGXEBkuSJEmSMlKwBisibo6INyJi6ibWR0RcExEvRcQzETGqUFkkSWqNtUqSlLVCXsGaABy3mfXjgL3yP+cANxQwiyRJrZmAtUqSlKGCNVgppYeARZvZ5IPAL1LO40DfiNilUHkkSWrJWiVJyloxP4O1G/Bas+VZ+bGNRMQ5EVEXEXXz589vl3CSJGGtkiRtpWI2WNHKWGptw5TSjSml2pRS7cCBAwscS5Kk9axVkqStUswGaxawe7PlwcCcImWRJKk11ipJ0lYpZoN1J/Cp/B2aRgNLUkqvFzGPJEktWaskSVula6EOHBG/Bo4EBkTELOBbQCVASunHwD3A+4CXgBXAGYXKIklSa6xVkqSsFazBSimdvIX1CTivUOeXJGlLrFWSpKwVc4qgJEmSJHUoNliSJEmSlBEbLEmSJEnKiA2WJEmSJGXEBkuSJEmSMmKDJUmSJEkZKdht2tV2y1etYf7SVTzy0gL2GtSLPQf1on+v7sWOJUnSeguXreL5uUt5dcFy/t9eAxjQuzs9uvnPCElqyVfGIksp8Y8Zizhjwj9IKTd2zH47ceWHR9KvZ7fihpMkCVi0fBVfvrWeh19cAEBFl+BXnz6UQ9/Zv8jJJKn0OEWwyBYuW81ld09b31wB3P/cPN5a2Vi8UJIkNbNo+er1zRVA09rE5fdMY9HyVUVMJUmlyQaryNaSWLZyzUbjq9esLUIaSZI21rB645q0dOUamixVkrQRG6wi61vdjdPHDNlgbOiAnvTr4fRASVJp2LlPFbv1rd5g7MwxQ9ixR2WREklS6fIzWEXWrWsXPla7O7v2qeL2KbPZd5fenDlmKAN6e5MLSVJpGNi7O7d97jD+96FXeHn+cj568O4c9q7+VFT4Pq0ktWSDVQL69ezG8TW78Z59B9GtawXdulqwJEmlZZc+1Vw8bhir1jTRq8orV5K0KTZYJcSCJUkqZZVdu1Dpm4CStFm+SkqSJElSRmywJEmSJCkjNliSJEmSlBEbLEmSJEnKiA2WJEmSJGXEBkuSJEmSMmKDJUmSJEkZscGSJEmSpIzYYEmSJElSRmywJEmSJCkjNliSJEmSlBEbLEmSJEnKiA2WJEmSJGXEBkuSJEmSMmKDJUmSJEkZscGSJEmSpIzYYEmSJElSRmywJEmSJCkjNliSJEmSlBEbLEmSJEnKiA2WJEmSJGWkoA1WRBwXEc9HxEsRcXEr64+MiCURUZ//+WYh86SUmL90FXOXrGTR8lWFPJUkqQyUWp0CaFjdxLy3VjLvrZU0rF5T6NNJkjLWtVAHjogK4DrgaGAW8I+IuDOl9FyLTR9OKY0vVI511jStZfrcpZz3qynMXLiCkYP7cN0nRrH7jj0KfWpJUgkqtToF8Oby1fzs7zO48aGXSQlOf/cQPvNv72LHnt3a4/SSpAwU8grWIcBLKaVXUkqrgf8DPljA823WohWrOe3mJ5m5cAUAz8xawpf+7ykWLV9drEiSpOIqqToF8Nzrb3HNX15kZeNaVq1Zy08eeoWn/vVmMSNJkrZSIRus3YDXmi3Pyo+1dFhEPB0R90bE/oUKs2J1EwtbNFNT/rWYxqa1hTqlJKm0lVSdAnhg2ryNxu6bOpeUUiFPK0nKUCEbrGhlrGWFmALskVI6APgRcEerB4o4JyLqIqJu/vz52xSmR2UFvbtvOCNy351707VLazElSZ1AZnUKsqlV735X/43GDt9rABHWKkkqF4VssGYBuzdbHgzMab5BSumtlNKy/ON7gMqIGNDyQCmlG1NKtSml2oEDB25TmL49Krn+lFHsUJ1rsnbpU8U1Hz+Q/r26b9PxJEllL7M6lV+/3bVq1Dv6ceKo3VjXT40fsQuH79nq6SRJJapgN7kA/gHsFRFDgdnAx4FPNN8gInYG5qWUUkQcQq7hW1iIMN26VnDo0B154Cv/xso1TVRXVtC/p82VJHViJVWnAPr36s63P7A/FxyzDwno2b0rfaorC3U6SVIBFKzBSimtiYjPA38CKoCbU0rPRsRn8+t/DJwEfC4i1gANwMdTASead+tawaAdKgp1eElSGSnFOgWwQ3UlO9hUSVLZinL74GxtbW2qq6srdgxJUgFFxOSUUm2xc2wra5UkdXybqlUF/aJhSZIkSepMbLAkSZIkKSM2WJIkSZKUERssSZIkScqIDZYkSZIkZcQGS5IkSZIyYoMlSZIkSRmxwZIkSZKkjJTdFw1HxHxg5nYeZgCwIIM47c3c7cvc7cvc7avUc++RUhpY7BDbylpl7nZk7vZl7vZTDplbrVVl12BlISLqWvvW5VJn7vZl7vZl7vZVrrk7k3L9b2Tu9mXu9mXu9lOOmddxiqAkSZIkZcQGS5IkSZIy0lkbrBuLHWAbmbt9mbt9mbt9lWvuzqRc/xuZu32Zu32Zu/2UY2agk34GS5IkSZIKobNewZIkSZKkzNlgSZIkSVJGOkWDFREzIuKfEVEfEXX5sR0j4s8R8WL+z37FztlSRPSNiNsiYnpETIuIw0o9d0Tsk3+e1/28FRFfLoPcX4mIZyNiakT8OiKqSj0zQER8KZ/52Yj4cn6sJHNHxM0R8UZETG02tsmsEXFJRLwUEc9HxLEllPkj+ed7bUTUtti+6JnzOVrLfVX+teSZiPh9RPRttq4kcndm1qn2U651CqxV7ZCz7OpUPoe1qsR0igYr76iUUk2z++lfDPwlpbQX8Jf8cqn5IXBfSmlf4ABgGiWeO6X0fP55rgEOAlYAv6eEc0fEbsAXgdqU0nCgAvg4JZwZICKGA2cDh5D7+zE+IvaidHNPAI5rMdZq1ojYj9x/g/3z+1wfERXtF3W9CWyceSpwIvBQ88ESygyt5/4zMDylNBJ4AbgESi53Z2edagflWKfAWtVOJlB+dQqsVSWnMzVYLX0Q+Hn+8c+BE4qYZSMRsQNwBHATQEppdUppMSWeu4WxwMsppZmUfu6uQHVEdAV6AHMo/czDgMdTSitSSmuAvwEfokRzp5QeAha1GN5U1g8C/5dSWpVSehV4iVxxbletZU4pTUspPd/K5iWRGTaZ+/783xOAx4HB+cclk1sbKcn/l9exThWFtaqAyrFOgbWqFHWWBisB90fE5Ig4Jz+2U0rpdYD8n4OKlq517wTmAz+LiKci4n8joieln7u5jwO/zj8u2dwppdnA94B/Aa8DS1JK91PCmfOmAkdERP+I6AG8D9id0s/d3Kay7ga81my7WfmxUlZOmc8E7s0/LqfcHZl1qjjKok6BtaqIOlKdgvLKXba1qrM0WGNSSqOAccB5EXFEsQO1QVdgFHBDSulAYDmlcfm8TSKiG3A88NtiZ9mS/HzqDwJDgV2BnhFxSnFTbVlKaRpwJbnL6fcBTwNrNrtT+YhWxkr9OyXKInNE/Ae5vycT1w21slnJ5e4ErFPtrJzqFFirSlC5vnaWRe5yr1WdosFKKc3J//kGuXnWhwDzImIXgPyfbxQvYatmAbNSSk/kl28jV8hKPfc644ApKaV5+eVSzv1e4NWU0vyUUiPwO+DdlHZmAFJKN6WURqWUjiB3mf1FyiB3M5vKOovcO5zrDCY3FaaUlXzmiDiN/9/e3YTGUcdhHP8+UC3EFKmCogepqFV6KlqkoFWkWhSKIHqweqhSD54Ei6hQBb2It148CIoICj300JibKKINNlpqSaPG9xcU0SIKooih4t/DTOmaxqTV2czs5vuBYYfZnd1n9/Lsb/e/CWwF7i4n/gli53MvB/ZUKwapp8Cuassw9RQMQO5h6KqhH7CSnJVk1fF9YAvV19XjwPb6ZtuBV9pJOL9Syg/At0kurw9tBmboeO4e2zix7AK6nfsbYGOSkSSheq0/otuZAUhyXn15EdWPWfcwALl7/FvWceDOJCuTXAxcBhxsId/p6HTmJDcDjwC3llJ+77mq07mXA3uqNYPUU2BXtWWYego6nntouqqUMtQb1RrxI/X2IbCrPn4u1V+D+ay+PKftrPNkXw8cAqaBMWD1gOQeAX4Czu451uncwJPAx1Rval4CVnY9c517guoNzRFgc5dfa6pC/R44RvVJ1I6FsgK7gC+AT4BbOpT5tnp/FjgKvNqlzAvk/pxq/fpUvT3btdzLdbOnWsk9cD1VZ7Sr+ptz4Hpqgdx2VYtb6sCSJEmSpP9p6JcISpIkSdJSccCSJEmSpIY4YEmSJElSQxywJEmSJKkhDliSJEmS1BAHLKmjkjyfZN0it3kxyR3zHF+T5K7+pZMkya6S5uOAJXVUKeW+UsrMfzx9DWBpSZL6yq6STuaAJfVZkoeTPFDv707yRr2/OcnLSbYkmUxyOMneJKP19W8m2VDv70jyaX3suSTP9DzEdUkOJPmy5xPCp4FNSaaSPLiET1eSNIDsKqk5DlhS/+0HNtX7G4DRJGcA1wLvA48BN5ZSrgQOATt7T05yIfA4sBG4Cbhizv1fUN/XVqqyAngUmCilrC+l7G78GUmSho1dJTVkRdsBpGXgPeCqJKuAWeAwVXltAsaBdcDbSQDOBCbnnH818FYp5WeAJHuBtT3Xj5VS/gJmkpzfzyciSRpadpXUEAcsqc9KKceSfA3cCxwApoEbgEuAr4DXSinbFriLLPIQs6dxW0mSTmJXSc1xiaC0NPYDD9WXE8D9wBTwDnBNkksBkowkWTvn3IPA9UlWJ1kB3H4Kj/crsKqp8JKkZcGukhrggCUtjQmq9eeTpZSjwB9U685/BO4B9iSZpiqxf6xbL6V8BzwFvAu8DswAvyzyeNPAn0mO+MNhSdIpsqukBqSU0nYGSYtIMlpK+a3+VHAf8EIpZV/buSRJOs6ukip+gyUNhieSTAEfUK2FH2s5jyRJc9lVEn6DJUmSJEmN8RssSZIkSWqIA5YkSZIkNcQBS5IkSZIa4oAlSZIkSQ1xwJIkSZKkhvwNG7ekcMYMVWgAAAAASUVORK5CYII=\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# посмотрим как предсказывает наша модель все данные и отобразим наши множества разными маркерами\n",
"\n",
"plt.figure(figsize=(12, 5))\n",
"plt.subplot(1, 2, 1);\n",
"plt.title(\"Истинные значения\");\n",
"sns.scatterplot(x=\"weight\", y=\"radius\", hue=\"tasty\", style=\"is_test\", data=pd.DataFrame({\n",
" \"weight\": data.weight,\n",
" \"radius\": data.radius,\n",
" \"tasty\": data.tasty,\n",
" \"is_test\": [\n",
" \"test\" if sample_index in test.index else \"train\" for sample_index in data.index\n",
" ]\n",
"}));\n",
"\n",
"plt.subplot(1, 2, 2);\n",
"plt.title(\"Предсказания\");\n",
"sns.scatterplot(x=\"weight\", y=\"radius\", hue=\"prediction\", style=\"is_test\", data=pd.DataFrame({\n",
" \"weight\": data.weight,\n",
" \"radius\": data.radius,\n",
" \"prediction\": model(data.weight, data.radius, a, b, threshold),\n",
" \"is_test\": [\n",
" \"test\" if sample_index in test.index else \"train\" for sample_index in data.index\n",
" ]\n",
"}));\n",
"\n",
"plt.tight_layout();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Заключение\n",
"\n",
"В данном курсе мы в основном не будем составлять собственные алгоритмы, а будем пользоваться уже готовыми. Их много, и работают они хорошо в разных случаях. За каждым из них стоит некоторая своя *интуиция*, как в случае алгоритма выше стояла следующая: чем выше размер и вес мангустина - тем он, начиная с некоторого порога, вкусный. \n",
"\n",
"Другие данные могут давать (совсем) другие подсказки, и поэтому мы уделим внимание и разведочному анализу данных, цель которого - найти эти подсказки в данных и выбрать алгоритм получше. \n",
"\n",
"Также из основного, следует понимать, что **мы обязаны** проверять качество на тех данных, которые модель не видела, что избежать самообмана. Модели, как и люди, могут запоминать правильные ответы (и далее мы даже увидим построенный на это алгоритм), и ничего ***не обобщать*** *(no generalization)*. Отсутствие обобщения - это то, чего мы будем избегать, стараясь при этом минимизировать ошибку."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.2 Элементы теории вероятностей и математической статистики"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Начнем с того, что всё что случайно, как ни странно, случайно по-разному. Например, и монетка, и игральный кубик - с равной вероятностью выдают свои исходы. Но, например, попадание выпущенной из лука стрелой \"в десяточку\" - тяготеет все же к этой самой десяточке, хотя и случайным образом в неё иногда не попадает.\n",
"\n",
"Как и в случае с алгоритмами и моделями, мы в рамках этого курса не будем вдаваться во все математические детали определений (хотя они очень важны). Ограничимся лишь тем, что нам потребуется.\n",
"\n",
"**Случайная величина** - это величина, принимающая какой-либо исход из множества для неё возможных. Например, случайная величина на `(0, 1)` принимает значения только из этого интервала (*непрерывная* случайная величина, её исходы всегда между нулем и единицей). Или, случайная величина может принимать два исхода `{-1; 1}` - *дискретная* случайная величина.\n",
"\n",
"**Вероятность** - это число от 0 до 1 (включительно), характеризующее, условно, как часто мы в конкретный исход попадём, или же насколько *мы верим* в то, что он произойдет (это так, если мы еще ни разу не проводили испытаний).\n",
"\n",
"> Например, для дискретной величины `{-1, 1}`, если вероятность для `-1` равна `0.3`, мы будем считать что это означает, что в 100 испытаниях нам выпадет `-1` как раз 30 раз.\n",
"> Для непрерывной, вероятность определяется не в точке, а в луче: вероятность что `величина < 0.5` равна `0.3`, означает что в точках менее 0.5 величина будет в 3 случаях из 10.\n",
"\n",
"Формально, определения немного (если не сказать совершенно) другие. Но для наших нужд такого подхода будет достаточно.\n",
"\n",
"**Функция распределения случайной величины** - описывает как раз все вероятности для всех исходов. То есть `0 < F(x) < 1`, для любого `x` из множества исходов величины. *Плотность распределения* - это производная функции распределения (её определенный интеграл даёт вероятность).\n",
"\n",
"Давайте на примерах."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Посмотрим на *равномерно* распределенную на (0, 1) случайную величину. Равномерно, это означает что чем длинее отрезок, тем пропорционально выше вероятность попасть в него."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"X = [] # массив, где будут наши случайные величины\n",
"\n",
"for index in range(1000): # цикл от 0 до 999\n",
" X.append(np.random.uniform())\n",
" \n",
"# и отобразим количество попаданий точки это величины\n",
"sns.distplot(\n",
" X,\n",
" kde=False # не делать оценку плотности распределения\n",
");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Рассмотрим распределенную на (-Infinity, +Infinity) случайную величину, со средним значением в числе 10, и такую чтобы её значения с чуть более чем 95%-вероятностью попадали в диапазон от +5 до +15. \n",
"\n",
"Для того, чтобы значения *нормально распределенной случайной величины* (это значит функция распределения имеет определенный заданный вид, пока не суть какой) в более чем 95% случаев лежали в заданном диапазоне `(среднее - L, среднее + L)`, нужно задать её *стандартное отклонение* как `L / 2`."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"X = [] # массив, где будут наши случайные величины\n",
"\n",
"for index in range(10000): # цикл от 0 до 9999\n",
" X.append(np.random.normal(\n",
" 10, # среднее\n",
" 2.5 # это половина ширины диапазона \n",
" ))\n",
"\n",
"# и отобразим количество попаданий точки это величины\n",
"sns.distplot(\n",
" X,\n",
" kde=False # не делать оценку плотности распределения\n",
");\n",
"\n",
"plt.axvline(10, 0, 1, ls='-', c='black');\n",
"plt.axvline(5, 0, 1, ls='--', c='black');\n",
"plt.axvline(15, 0, 1, ls='--', c='black');\n",
"\n",
"plt.annotate(\"Среднее\", (10, 500), (11, 600), arrowprops={\"arrowstyle\": '->'});\n",
"plt.annotate(\"Здесь лежат около 95% исходов\", (4.5, 100));"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9531"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Подсчитаем процент попавших в диапазон от +5 до +15 точек\n",
"sum([1 if x >= 5 and x <= 15 else 0 for x in X]) / len(X)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Случай дискретных величин выглядит слегка вырожденно."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"X = []\n",
"\n",
"for index in range(100):\n",
" x = 1 if np.random.uniform() > 0.3 else 0\n",
" X.append(x)\n",
" \n",
"sns.distplot(X, kde=False);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Задача теории вероятностей** - это уметь описывать случайные величины.\n",
"\n",
"**Задача математической статистики** - обратная. По выборке из случайных значений, определить что это за величина (её свойства).\n",
"Любая функция от выборки - например среднее значение, или самое часто встречающееся (в статистике - *мода*), - называется *статистикой*.\n",
"\n",
"Анализ данных и машинное обучение - это в некотором смысле продолжение статистики, так как мы по случайной выборке (датасету) должны установить зависимость между признаками и целевой величиной."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Пример"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Представим, что у нас есть замеры роста 300 человек. Мы не знаем что это за случайная величина, но мы можем рассмотреть её различные описательные статистики, и что-то сказать о её поведении."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
],
"text/plain": [
" count mean std min 25% 50% \\\n",
"height 300.0 170.126641 4.991106 154.011499 166.627987 170.166339 \n",
"\n",
" 75% max \n",
"height 173.777401 182.543782 "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame({'height' : height}).describe().T"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Здесь мы видим:\n",
"- количество (count) записей,\n",
"- среднее (mean) для всех замеров роста,\n",
"- стандартное отклонение (std) - для нормального распределения, 95% данных лежат в интервале (`среднее - 2 * стандартное отклонение`, `среднее + 2 * стандартное отклонение`),\n",
"- 25% данных ниже значения, указанного в столбце 25%\n",
"- аналогично с другими процентными значениями (эти статитистики называются процентилями),\n",
"- минимум и максимум по всем данным."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Три важных теоремы"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Закон больших чисел**: если все случайные величины у нас независимы и одинаково распределены, то ***выборочное среднее*** стремится при увеличении числа испытаний к ***математическому ожиданию***.\n",
"\n",
"Математическое ожидание - это взвешенные по вероятностям исходы, то есть в дискретном случае,\n",
"\n",
"$$E[x] = \\sum p_i x_i,$$\n",
"где $x_i$ - исходы (значения) случайной величины, а $p_i$ - их вероятность.\n",
"\n",
"По сути, это означает, что в условиях незнания среднего по всем возможным ситуациям (по \"всем данным в мире\"), мы можем при большом количестве данных заменить его выборочным средним. В нашем при мере с ростом, это означает, что средний рост по всё более увеличивающейся выборке будет ближе к некоторому истинному значению (по \"всем данным в мире\")."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Центральная предельная теорема**: для независимых случайных величин из одного распределения со средним $M$ и стандартным отклонением $S$, их выборочное среднее стремится (при увеличении количества испытаний $n$) к нормальному распределению с тем же средним и разбросом $\\frac {S} {\\sqrt n}$.\n",
"\n",
"Возвращаясь к нашему примеру с ростом, это означает, что по мере роста выборки, средний рост будет распределен как нормальная случайная величина, и чем точнее нам нужно его измерять - тем больше данных нам нужно."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Условная вероятность и теорема Байеса**\n",
"\n",
"Тут мы подходим к одному из краеугольных камней машинного обучения. Начнем с двух вопросов:\n",
"1. Насколько вероятно, что через час будет дождь? Пусть это $A$\n",
"2. Насколько вероятно, что через час будет дождь, если он уже идёт? Пусть вероятность дождя сейчас $B$.\n",
"\n",
"Без математики понятно, что речь идёт о разных ситуациях, что в математике формализуют как *условную вероятность* (определение):\n",
"\n",
"$$P(A|B) = \\frac {P(A \\cap B)} {P(B) }$$\n",
"\n",
"где $\\cap$ обозначает `И` (пересечение множеств), то есть совместную вероятность обоих случаев сразу.\n",
"\n",
"Практически из определения, вытекает **теорема Байеса**:\n",
"\n",
"$$P(A|B) = \\frac {P(B|A) * P(A)} {P(B)}$$\n",
"\n",
"В терминах дождей, это означает, что \n",
"`вероятность что дождь будет через час, если он идёт сейчас = вероятность дождя сейчас, если он будет через час * вероятность дождя через час / вероятность дождя сейчас`.\n",
"\n",
"В данном примере мы ничего напрямую не выигрываем от теоремы (если только мы не метеорологи), но давайте рассмотрим другую, более практическую задачу."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Есть две корзины с печеньем:\n",
"1. В первой 30 ванильных и 10 шоколадных,\n",
"2. Во второй - 20 ванильных и 20 шоколадных.\n",
"\n",
"Мы в темноте вытаскиваем наугад из какой-то корзины ванильное печение. Какова вероятность, что мы вытащили её из первой?\n",
"\n",
"> Жизненный опыт подсказывает, что скорее всего из первой, так как в ней больше ванильных. Теорема Байеса же скажет, что вероятность вытащить из первой равна произведению вероятностей выбрать первую корзину $P(A)$, выбрать из неё ванильную $P(B | A)$, и всё это поделить на вероятность вытащить ванильную из всех корзин $P(B)$."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.6"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"prior = 1 / 2 # вытаскиваем из случайной корзины. это наше A\n",
"\n",
"likelihood = 3 / 4 # вероятность ванильной печеньки в первой корзине. это наше P(B|A)\n",
"\n",
"evidence = (30 + 20) / (20 + 20 + 30 + 10) # вероятность вытащить ванильную печеньку вообще из всех корзин. P(B)\n",
"\n",
"posterior = prior * likelihood / evidence\n",
"\n",
"assert posterior == 3 / 5 # выбросим ошибку, если равенство не выполняется\n",
"posterior"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Это конечно замечательно, что мы можем сказать *вероятность*, конечно, но какая польза от всего этого? А польза в рамках анализа данных и машинного обучения, следующая. Задачу машинного обучения часто ставят как поиск параметров, таких что:\n",
"\n",
"`максимум вероятности получить (параметры | датасета)`, и поскольку такую вероятность мы саму по себе не знаём, то \"проворачивают ручку Байеса\":\n",
"\n",
"`вероятность (параметров | данные) = вероятность данных при параметрах * вероятность параметров / вероятность данных`. \n",
"\n",
"При максимизации вероятности слева, знаменатель справа не меняется (он не зависит от параметров модели), поэтому его даже не всегда считают. Если говорить простыми словами - при машинном обучении часто ищутся те параметры модели, которые имеют максимальную вероятность для имеющегося датасета."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Заключение\n",
"\n",
"Мы не будем напрямую пользоваться указанными теоремами. Нам важно следующее следствие: \n",
"\n",
"> Чем больше в выборке наблюдений, тем лучше можно оценивать характеристики процесса генерации \"всех данных в мире\" (*data generation process*). Но поскольку у нас есть только выборка, то инструменты математической статистики очень пригождаются в анализе данных и машинном обучении."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.3 А теперь... почему всё это работает"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> Если вы до этого чего-то не поняли, или вообще ничего не поняли, не расстраивайтесь. \n",
">\n",
"> Сейчас будет еще сложнее. \n",
"> \n",
"> Обрадую - после этого будет всё только практика, и сравнительно легко по сравнению с тем, о чем будет сейчас."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Probability-almost-correct (PAC-) обучаемость\n",
"\n",
"Всё это конечно замечательно, запустить алгоритм на данных, который нам выдаст модель, которая уловила в данных какие-то закономерности с некоторой ошибкой... А что если данных много, они большие, и их вообще человеку не понять? Не будем же мы проверять каждый ответ руками, смысл?\n",
"\n",
"**Вопрос**: можем ли мы верить моделям даже в пределах их ошибки?\n",
"\n",
"**Ответ**: да, но не всегда."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Что вообще означает, что алгоритм может выдать обучившуюся модель? Пусть у нас есть некоторый алгоритм, который выдал на данных нам модель, которая работает с некоторой ошибкой.\n",
"\n",
"Рассмотрим следующие понятия:\n",
"- Ошибка генерализации - среднее значение ошибки на всех данных в мире. Мы её не знаем на самом деле.\n",
"- Ошибка модели на тренировочном/тестовом множестве - среднее значение ошибки на выбранном известном множестве.\n",
"- Желательно бы построить такую модель, которая будучи обученной на известном множестве, имела бы **минимальную ошибку генерализации**. \n",
"\n",
"Алгоритм называется PAC-обучаемым, если \n",
"1. Выбрав порог ошибки `E`, например не более 1% в среднем от любых входных данных,\n",
"2. Фиксируя нашу уверенность `P` (это некоторая вероятность),\n",
"3. Будет иметь место факт: существует количество данных `n`, выше которого вероятность ошибки выше `E` ниже `1 - P`.\n",
"\n",
"> То есть, алгоритм выдаёт такую модель, которая даёт ошибку в `1 - P` случаев выше чем `E`, начиная с некоторого числа примеров `n`. \n",
"\n",
"Существует даже формула на такой размер данных. Но она нам не нужна, все равно мы тут данные не генерируем :)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Для миллиарда моделей и трехста примеров, с вероятностью 99% - оценка ошибки классификатора будет менее: 0.0844 (доля неправильных ответов)'"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# один из примеров такой формулы - для задачи классификации\n",
"# конкретно эта работает только в случае, если алгоритм выдает конечное число моделей\n",
"\n",
"def estimate_error(models_number, data_size, error_probability):\n",
" return np.log(models_number / error_probability) / data_size\n",
"\n",
"\"Для миллиарда моделей и трехста примеров, с вероятностью 99%% - оценка ошибки классификатора будет менее: %.4f (доля неправильных ответов)\" % estimate_error(10 ** 9, 300, 0.01)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Миллиард моделей - это не так уж и много. Тем не менее, компьютерные алгоритмы выдают конечное число моделей - так как точность компьютерных чисел не бесконечная (но очень большая).\n",
"**Вывод**: формулы сами по себе не очень полезны: количество моделей подсчитать трудно. Да и не нужно. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Мы попробуем на синтетических данных убедиться, что с ростом количества данных алгоритмы работают лучше.\n",
"\n",
"Рассмотрим пример с ростом человека. Есть все люди мира, какие только могут быть, у нас же только ограниченная выборка, по которой мы можем делать выводы. Так вот, представим что мы хотим предсказывать вес человека по росту, тогда для PAC-обучаемого алгоритма с ростом обучающей выборки должно расти качество. "
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.scatterplot(x=\"points\", y=\"error\", size=\"percent\", hue=\"type\", data=pd.DataFrame(results, columns=[\n",
" 'points', 'percent', 'error', 'type'\n",
"]));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Из этого изображения вовсе не следует, что линейный алгоритм вот лучше всех (но на этих данных, да, лучше). Это иллюстрация связи \"всех данных в мире\" и уменьшения ошибки с ростом количества данных (как видим с разной скоростью). Почему здесь линейный случай лучше всего работает - да потому что изначально в наши синтетических данных линейная связь с небольшим шумом.\n",
"\n",
"**И тут возникает вопрос... когда алгоритм является PAC-обучаемым?** - то есть будет ли с ростом данных падать ошибка?\n",
"\n",
"PAC-обучаемость для алгоритмов устанавливается путем проверки его `VC-размерности` (*размерности Вапника-Червоненкинса*) на конечность.\n",
"\n",
"**VC-размерность** — это число - максимальное количество примеров, которые алгоритм сможет разделить всеми возможными способами на две части (в случае классификации). Основной результат теории статистического обучения: если `VC-размерность` алгоритма конечна, то он является `PAC-обучаемым`. Интуитивно, можно построить хороший классификатор, если алгоритм может разделять данные на два класса всеми способами.\n",
"\n",
"Деревья без обрезки не являются `PAC-обучаемыми`, потому что количество способов растёт неограниченно вместе с размером датасета. Классификатор ближайших соседей - является `PAC-обучаемым` когда точки \"кучкуются\" - так или иначе кластеризуются на группы классов (вероятность попасть в один класс падает вместе с ростом расстояния между точками).\n",
"\n",
"Пример установления *VC-размерности* для линейного алгоритма (на плоскости): он может разделить датасет из трёх точек на две части. Чтобы разделить датасет из четырех точек на две части (всеми возможными способами), одной линии нашего алгоритма уже недостаточно. Следовательно, размерность такого алгоритма для плоскости равна 3 (конечна)."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.subplot(1, 2, 1);\n",
"plt.title('Достаточно одной линии');\n",
"plt.scatter([1, 2, 3], [1, 3, 2]);\n",
"plt.plot([1, 3], [2, 1], c='red', ls='--');\n",
"plt.plot([1, 3], [2, 3], c='red', ls='--');\n",
"plt.plot([3, 2], [3, 1], c='red', ls='--');\n",
"plt.subplot(1, 2, 2);\n",
"plt.title('Нужно две линии');\n",
"plt.scatter([1, 2, 3, 4], [1, 3, 2, 4]);\n",
"plt.plot([2, 1], [1, 2], c='red', ls='--');\n",
"plt.plot([4, 3], [1, 4], c='red', ls='--');\n",
"plt.annotate(\"Две неразделимые\\nодной линией части\", (1, 2.5));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Как ни странно, все эти знания нам в ближайшей пятидневной практике не понадобятся. Однако из всей этой теории (статистического обучения) вытекает следующее.\n",
"\n",
"1. Алгоритмы - работают! Правда, с некоторого количества примеров.\n",
"2. Работают не все алгоритмы. Существует теорема \"Нет бесплатных обедов\" (`no free lunch`-теорема), которая говорит, что универсальный алгоритм всегда потерпит неудачу (найдутся для него примеры). То есть мы должны \"подтолкнуть\" алгоритм некоторым знанием о задаче к решению. Именно поэтому линейный алгоритм на данных с ростом и весом проявил себя лучше.\n",
"3. Ошибку следует рассматривать из трех компонент: **неустранимая ошибка** (ошибка идеального классификатора, или `Bayes error rate`), **ошибку аппроксимации** (*смещение*) и **ошибку оценивания** (*разброс*). На этом остановимся подробнее в виде примера."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> Вспомним, что мы можем выбирать алгоритмы. Пока неважно какие. Они могут давать разные множества моделей (как по количеству, так и по их сложности).\n",
"\n",
"**Неустранимая ошибка** - это ошибка идеального классификатора на всех данных. Она даже ниже ошибки разметки человеком, и заложена самой природой данных - представьте что у нас есть описание \"всех данных в мире\" - и тогда *если существует хотя бы какая-нибудь вероятность* принадлежности примера более чем одному классу - неустранимая ошибка имеет место. Для детерминированных данных (не вероятностных) такая ошибка равна нулю.\n",
"\n",
"**Ошибка смещения** - это ошибка выбора класса алгоритма, возникает когда модели не способны приблизить данные достаточно. \n",
"\n",
"**Ошибка разброса** - это ошибка, возникающая вследствие того, что созданная алгоритмом модель - является только приближением к некоторой \"идеальной\" модели, но не является ей. Она появляется, когда предсказания отличаются от среднего не так же, как предсказываемая величина."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"yhat = LinearRegression().fit(\n",
" np.array(X[train_indices]).reshape(-1, 1), # здесь мы подстраиваем данные под формат\n",
" np.array(Y[train_indices]).reshape(-1, 1) # библиотеки scikit-learn, о которой конечно же поговорим\n",
").predict(np.array(X).reshape(len(X), 1))\n",
"\n",
"plt.title('Пусть наш алгоритм отдаёт нам линию');\n",
"plt.plot(X, Y);\n",
"plt.plot(X, yhat);\n",
"plt.scatter(X[train_indices], Y[train_indices], s=30, c='red');\n",
"plt.annotate(\"Здесь очевидна ошибка смещения\", (-70, 0.75));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\"Подтолкнём\" наш алгоритм ближе к задаче, дав возможность использовать различные степени X."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"max_power = 5\n",
"\n",
"X_powered = np.array([\n",
" [(x ** power) for power in range(1, max_power + 1)] for x in X\n",
"])\n",
"\n",
"yhat = LinearRegression().fit(\n",
" X_powered[train_indices].reshape(-1, max_power),\n",
" Y[train_indices].reshape(-1, 1)\n",
").predict(np.array(X_powered).reshape(len(X_powered), max_power))\n",
"\n",
"plt.plot(X, Y);\n",
"plt.plot(X, yhat);\n",
"plt.scatter(X[train_indices], Y[train_indices], s=30, c='red');\n",
"plt.annotate(\"Уже лучше, но мы знаем, что\\nэто всего лишь приближение\", (-70, 0.75));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Обогатим наш алгоритм и дадим возможность использовать (очень) большие степени."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"min_power = 10\n",
"max_power = 20\n",
"\n",
"X_new = np.array([\n",
" [(x ** power) for power in range(min_power, max_power + 1)] for x in X\n",
"]).reshape(len(X), -1)\n",
"\n",
"yhat = LinearRegression().fit(\n",
" X_new[train_indices], np.array(Y[train_indices]).reshape(-1, 1)\n",
").predict(X_new)\n",
"\n",
"plt.title('Мы выбрали слишком \"богатый\" на варианты способ!');\n",
"plt.plot(X, Y);\n",
"plt.plot(X, yhat);\n",
"plt.scatter(X[train_indices], Y[train_indices], s=30, c='red');\n",
"plt.annotate(\"Совсем не то\", (-70, 0.75));\n",
"plt.ylim(-1, 1);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Получается несколько случаев, как модель может подходить под данные:\n",
"1. Недообучение: низкие метрики на тренировочном и тестовом множестве (которые частный случай \"всех данных в мире\") - первый случай,\n",
"2. Переобучение: высокие метрики на тренировочном и низкие на тестовом - последний случай,\n",
"3. Генерализация: хорошие метрики на обоих множествах - будем считать второй случай,\n",
"4. Хорошие метрики на тестовом и слабые на тренировочном - редкий случай, иногда встречается когда тестовые данные слишком малы или сильно отличаются от тренировочных.\n",
"\n",
"### Заключение\n",
"\n",
"Резюмируя этот наш раздел, важно знать вот что.\n",
"1. Алгоритмы, которые мы будем в дальнейшем использовать, разные.\n",
"2. Соответственно, ошибаются они тоже по-разному.\n",
"\n",
"Иногда им они слишком простые, чтобы подойти под данные, иногда перебор сложные. Когда мы будем рассматривать конкретные практические алгоритмы, мы узнаем, что можно с этим делать. \n",
"\n",
"> На этом поздравляю! Самое сложное в курсе уже пройдено. Дальше будет только практика, практика, и еще раз практика (которая критерий истины)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.4 Инструментарий аналитика данных: python и jupyter lab\n",
"\n",
"Для анализа данных можно использовать различные языки и инструменты, например языки `R`, `Julia`, визуальные инструменты `Dataiku` или `Orange3`. В сфере программного обеспечения часто можно найти множество альтернативных решений под каждую задачу.\n",
"\n",
"Мы выбираем `python` и среду разработки `Jupyter Lab` не просто потому что они популярные. Популярность - это следствие наличия серьезной *экосистемы*, то есть набора инструментов и пакетов. `python` для анализа данных стал особо популярен в результате усилий Google и Facebook, которые выпустили большие полезные библиотеки для работы с данными. `Jupyter Lab` - это один самых частых инструментов ввиду своей простоты и при этом - удобства работы.\n",
"\n",
"Все вот эти тетрадки были созданы с помощью `Jupyter Lab`, и его использует в практике очень много аналитиков. Так же как и `python`: порог вхождения у него не запредельный, а возможности, как у универсального языка с \"кучей батареек\" - практически неограничены (по-крайней мере для типичных задач)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### python crash course"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('Это строка', 42, 3.14)"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# переменные - ссылки на значения\n",
"\n",
"string_variable = \"Это строка\"\n",
"integer_variable = 42 # целое число\n",
"float_variable = 3.14 # вещественное число\n",
"\n",
"string_variable, integer_variable, float_variable"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1, 23, 'Хопа')"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Кортеж - упорядоченный неизменяемый список значений\n",
"\n",
"tuple_example = (1, 23, \"Хопа\")\n",
"tuple_example"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(3, [1, 2], [4, 5], [1, 3, 5])"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Список - изменяемый набор значений\n",
"\n",
"list_example = [1, 2, 3, 4, 5]\n",
"\n",
"# список можно \"срезать\" по индексам\n",
"# индексы всегда начинаются с нуля!\n",
"\n",
"list_example[2], list_example[:2], list_example[-2:], list_example[::2]"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(100.1, 'значение по умолчанию')"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# словарь - множество пар \"ключ -> значение\"\n",
"\n",
"dict_example = {\n",
" 'серебряный': 100.100,\n",
" 'золотой': 200.200\n",
"}\n",
"\n",
"dict_example['серебряный'], dict_example.get('платиновый', 'значение по умолчанию')"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"([1, 2, 159, 4, 5], {'серебряный': 100.1, 'золотой': 200.2, 'платиновый': 159})"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# элементам списков и словарей можно присваивать значения\n",
"\n",
"dict_example['платиновый'] = list_example[2] = 159\n",
"\n",
"list_example, dict_example"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"A 2 12 B \n",
"42\n"
]
}
],
"source": [
"# циклы - по последовательности и по условию\n",
"\n",
"result = \"\"\n",
"for value in [\"A\", 2, 24 // 2, \"B\"]:\n",
" result += str(value) + \" \"\n",
"print(result)\n",
" \n",
"value = 0\n",
"while value < 42:\n",
" value += 1 # не забудьте, а то цикл будет бесконечным без выхода\n",
"print(value)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"([2, 6, 10, 14, 18], {1: 3, 3: 5, 5: 7, 7: 9, 9: 11})"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# списки и словари можно инициализировать циклами\n",
"\n",
"range_list = [x * 2 for x in range(1, 11, 2)]\n",
"range_dict = {x: x + 2 for x in range(1, 11, 2)}\n",
"\n",
"range_list, range_dict"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"40"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# функции... это почти то же, что и в математике - выход для входа\n",
"# а точнее - обособленный блок кода с параметрами\n",
"\n",
"def function(x, a, b):\n",
" y = x * a + b\n",
" return y\n",
"\n",
"function(2, 10, 20)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"70"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# класс - это описание объекта\n",
"# любой объект может иметь свойства и методы\n",
"\n",
"# тут проще на примере\n",
"\n",
"class ExampleClass:\n",
" def __init__(self, a, b):\n",
" \"\"\"\n",
" Такой метод называется конструктор\n",
" \"\"\"\n",
" \n",
" # self - внутрення ссылка на текущий объект\n",
" self.a, self.b = a, b\n",
"\n",
" def function(self, x):\n",
" return self.a * x + self.b\n",
" \n",
"# создадим объект - экземпляр класса\n",
"example_object = ExampleClass(20, 30)\n",
"\n",
"# и вызовем его метод\n",
"example_object.function(2)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"110"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# классы могут наследоваться, и обычно ожидается что объекты\n",
"# унаследованного класса \"ведут\" себя подобно объектам базового,\n",
"# но в деталях могут делать что-то другое\n",
"\n",
"class Inherited(ExampleClass):\n",
" def function(self, x):\n",
" return self.a * x * x + self.b\n",
"\n",
"example_object = Inherited(20, 30)\n",
"example_object.function(2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Как ни странно - это практически всё, что нам понадобится. Помимо этого, нам еще понадобится импорт библиотек, а вот в них уже \"кладези всяких полезностей\". Выше мы видели, в какие чудеса они умеют, всё делают за нас, надо их только попросить :)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"# вариант импорта из недр библиотеки\n",
"import sklearn.datasets as datasets\n",
"\n",
"# другой вариант импорта \n",
"from sklearn.cluster import KMeans"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# ну и продолжим, раз начали :)\n",
"\n",
"# загрузим датасет из библиотеки\n",
"X, y = datasets.load_iris(return_X_y=True)\n",
"\n",
"# KMeans - это класс с методами\n",
"clusterer = KMeans(n_clusters=3).fit(X)\n",
"\n",
"# запись X[:, 1] - означает взять ВТОРУЮ колонку массива\n",
"sns.scatterplot(x=X[:,1], y=X[:,2], hue=clusterer.labels_);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Заключение\n",
"\n",
"`python` активно развивается. Из основных новшеств - это добавление спецификаций типов в объявления переменных (везде, где они объявляются). Мы пока это не используем, чтобы не усложнять код. Но выглядит это вот так (хотите - пользуйтесь, но потом не жалуйтесь:)). Учтите, эти подсказки по типам, в `python 3.6` на самом деле ни на что не влияют."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(None, 0, 1)"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def example(a: float = None, b: float = 0) -> float:\n",
" if a is not None:\n",
" return a + b\n",
" return None\n",
"\n",
"example(), example(0), example(0, 1)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Hello, world'"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"example(\"Hello, \", \"world\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.5 Цикл моделирования и кросс-валидация"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Теперь переходим к самой что ни на есть практике анализа данных. **Цикл моделирования** - это процесс из нескольких шагов, позволяющих из данных получить применяемую в практике модель. **CRISP-DM** - это сокращение слов *CRoss-Indrustry Standard Process for Data Mining* - кросс-индустриальный процесс анализа данных.\n",
"\n",
"Процесс состоит из следующих шагов:\n",
"1. **Понимание бизнес-цели.** Зачем нам вообще анализ данных в текущей бизнес- или исследовательской задачи. На этом этапе должно быть ясно, зачем нужна модель, и какие у неё должны быть метрики качества.\n",
"2. **Разведочный анализ**. Это ознакомление с данными, визуальный поиск зависимостей, формулировка гипотез о взаимосвязи. \n",
"3. **Подготовка данных**. Это важный этап, на котором данные чистятся от битых значений и выбросов (они могут испортить модель), подготавливаются к удобному для моделирования виду.\n",
"4. **Моделирование**. Построение моделей. Это всего-лишь приблизительно 20% времени от всего процесса, но как раз на этом этапе запускаются алгоритмы, которые выдают модели.\n",
"5. **Оценка**. Оценка качества модели или ряда моделей. Оценка - это не только метрики, которые минимизировала модель, но еще и бизнес-метрики. Например, средняя ошибка в килограммах это одно, а в рублях - совсем другое. Только на этом этапе можно понять, пригодна ли модель к применению (эксплуатации).\n",
"6. **Внедрение**. Это развертывание модели для применения. Например, чтобы или сайт, или пользователи, или организации - как-то смогли пользоваться предсказанием модели.\n",
"7. **Мониторинг**. Это слежение за качеством уже применяемой модели. Обычно, по косвенным и производным признакам качества (растёт прибыль - хорошо!).\n",
"\n",
"В нашем курсе мы модели внедрять не будем (хотя и поговорим как можно). Важно заметить следующее:\n",
"> В этом процессе можно возвращаться с любого шага на любой шаг назад, но проскакивать вперед шаги нельзя! Иначе просто бессмысленно потратите время."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Пример"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 1.5.1 Понимание задачи и целей\n",
"\n",
"Давайте представим, что у нас есть цветочный магазин, который специализируется на цветках ириса, и предлагает их в трёх сортах: `Virginica`, `Versicolor` и `Setosa`. Мы хотели бы автоматически определять что за сорт, без участия каких-либо ботаников. К счастью, ботаники уже создали датасет из 150 цветков, в котором разметили их сорта.\n",
"\n",
"Наша цель - создать модель, которая по признакам цветка определяла бы их сорт. **Отбор моделей необходимо производить с учетом того, что сорта стоят по-разному!**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 1.5.2 Разведочный анализ\n",
"\n",
"Ознакомление с данными. Первые попытки понять то, с чем мы имеем дело. "
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['sepal length (cm)',\n",
" 'sepal width (cm)',\n",
" 'petal length (cm)',\n",
" 'petal width (cm)']"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.datasets import load_iris\n",
"\n",
"# распечатаем какие есть признаки у данных\n",
"iris = load_iris()\n",
"iris.feature_names"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> Где-то в интернетах нашлась хорошая картинка\n",
"![Iris](media/iris.png)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"