├── .dvc ├── .gitignore └── config ├── .dvcignore ├── .github └── workflows │ └── site.yaml ├── .gitignore ├── LICENSE ├── README.rst ├── docs ├── configuration.js ├── favicon.ico ├── index.html ├── requirements.txt └── static │ ├── js │ └── main.372afe1e.chunk.js │ └── media │ └── binder_logo.fb62fd0a.png ├── hometask ├── task1-1 │ └── generator.ipynb ├── task2-1 │ └── README.rst └── task2-2 │ └── README.rst ├── sem1 ├── data │ └── iris.csv ├── main.ipynb └── requirements.txt ├── sem10 ├── data │ └── data.csv └── main.ipynb ├── sem11 └── main.ipynb ├── sem12 └── main.ipynb ├── sem13 └── main.ipynb ├── sem14 └── main.ipynb ├── sem15 ├── experiment │ └── events.out.tfevents.1612508546.rfc1918.private.ip.localhost.88780.0 └── main.ipynb ├── sem16 ├── autoencoder-cnn │ ├── 2 │ │ └── events.out.tfevents.1613070642.531d2ae5abf6.59.0 │ ├── 4 │ │ └── events.out.tfevents.1613070777.531d2ae5abf6.59.1 │ ├── 8 │ │ └── events.out.tfevents.1613070911.531d2ae5abf6.59.2 │ ├── 16 │ │ └── events.out.tfevents.1613071042.531d2ae5abf6.59.3 │ ├── 32 │ │ └── events.out.tfevents.1613071174.531d2ae5abf6.59.4 │ └── 64 │ │ └── events.out.tfevents.1613071305.531d2ae5abf6.59.5 ├── autoencoder-linear │ ├── 2 │ │ └── events.out.tfevents.1613067462.9990b4fd11f6.60.0 │ ├── 4 │ │ └── events.out.tfevents.1613066902.972fcc07375d.63.1 │ ├── 8 │ │ └── events.out.tfevents.1613066986.972fcc07375d.63.2 │ ├── 16 │ │ └── events.out.tfevents.1613067067.972fcc07375d.63.3 │ ├── 32 │ │ └── events.out.tfevents.1613067151.972fcc07375d.63.4 │ └── 64 │ │ └── events.out.tfevents.1613067233.972fcc07375d.63.5 ├── autoencoder-vae │ ├── 2 │ │ └── events.out.tfevents.1613074317.785e14f6615a.59.0 │ ├── 4 │ │ └── events.out.tfevents.1613074524.785e14f6615a.59.1 │ ├── 8 │ │ └── events.out.tfevents.1613074729.785e14f6615a.59.2 │ ├── 16 │ │ └── events.out.tfevents.1613074931.785e14f6615a.59.3 │ ├── 32 │ │ └── events.out.tfevents.1613075134.785e14f6615a.59.4 │ └── 64 │ │ └── events.out.tfevents.1613075339.785e14f6615a.59.5 ├── main.ipynb └── transfer-resnet18 │ └── events.out.tfevents.1613078453.4679eb65a580.61.0 ├── sem17 ├── data │ ├── cc.en.10.bin.dvc │ └── dataset.csv.dvc ├── images │ ├── img1.png │ └── img2.png └── main.ipynb ├── sem18 ├── data │ ├── README │ ├── Wikipedia.en-ru.en.dvc │ └── Wikipedia.en-ru.ru.dvc └── main.ipynb ├── sem19 ├── README.rst └── main.ipynb ├── sem2 ├── main.ipynb └── requirements.txt ├── sem20 └── main.ipynb ├── sem21 ├── README.rst ├── images │ ├── learningrank.png │ └── search.png └── main.ipynb ├── sem22 └── main.ipynb ├── sem23 └── main.ipynb ├── sem24 └── main.ipynb ├── sem25 └── main.ipynb ├── sem26 └── main.ipynb ├── sem27 ├── main.PNG └── main.ipynb ├── sem28 └── main.ipynb ├── sem29 └── main.ipynb ├── sem3 ├── fig1.png ├── fig2.png ├── fig3.png ├── fig4.png ├── main.ipynb └── requirements.txt ├── sem30 └── main.ipynb ├── sem4 ├── main.ipynb └── requirements.txt ├── sem5 ├── main.ipynb └── requirements.txt ├── sem6 ├── lecture.png ├── main.ipynb └── picture.jpg ├── sem7 └── main.ipynb ├── sem8 └── main.ipynb ├── sem9 └── main.ipynb └── teormin.md /.dvc/.gitignore: -------------------------------------------------------------------------------- 1 | /config.local 2 | /tmp 3 | /cache 4 | /config.local 5 | /tmp 6 | /cache 7 | /config.local 8 | /tmp 9 | /cache 10 | /config.local 11 | /tmp 12 | /cache 13 | /config.local 14 | /tmp 15 | /cache 16 | /config.local 17 | /tmp 18 | /cache 19 | /config.local 20 | /tmp 21 | /cache 22 | /config.local 23 | /tmp 24 | /cache 25 | /config.local 26 | /tmp 27 | /cache 28 | /config.local 29 | /tmp 30 | /cache 31 | /config.local 32 | /tmp 33 | /cache 34 | /config.local 35 | /tmp 36 | /cache 37 | /config.local 38 | /tmp 39 | /cache 40 | /config.local 41 | /tmp 42 | /cache 43 | /config.local 44 | /tmp 45 | /cache 46 | /config.local 47 | /tmp 48 | /cache 49 | /config.local 50 | /tmp 51 | /cache 52 | /config.local 53 | /tmp 54 | /cache 55 | /config.local 56 | /tmp 57 | /cache 58 | /config.local 59 | /tmp 60 | /cache 61 | /config.local 62 | /tmp 63 | /cache 64 | /config.local 65 | /tmp 66 | /cache 67 | /config.local 68 | /tmp 69 | /cache 70 | /config.local 71 | /tmp 72 | /cache 73 | /config.local 74 | /tmp 75 | /cache 76 | /config.local 77 | /tmp 78 | /cache 79 | /config.local 80 | /tmp 81 | /cache 82 | -------------------------------------------------------------------------------- /.dvc/config: -------------------------------------------------------------------------------- 1 | [core] 2 | remote = seminars 3 | ['remote "seminars"'] 4 | url = gdrive://1Lzeboye-cFzzpsznLDsl8yh15PVtaxGC 5 | -------------------------------------------------------------------------------- /.dvcignore: -------------------------------------------------------------------------------- 1 | # Add patterns of files dvc should ignore, which could improve 2 | # the performance. Learn more at 3 | # https://dvc.org/doc/user-guide/dvcignore 4 | -------------------------------------------------------------------------------- /.github/workflows/site.yaml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to compile and deploy notebook-classroom 2 | 3 | name: Notebook-Classrom 4 | 5 | # Only run on push to the master branch 6 | on: 7 | push: 8 | branches: [ master ] 9 | 10 | # Jobs to compile notebook classroom 11 | jobs: 12 | # Publish the application on github pages 13 | publish: 14 | # use ubuntu 15 | runs-on: ubuntu-22.04 16 | 17 | steps: 18 | # Checks-out $GITHUB_WORKSPACE 19 | - name: Checkout 20 | uses: actions/checkout@v2 21 | 22 | - name: Setup Python 23 | uses: actions/setup-python@v1 24 | with: 25 | python-version: 3.11 26 | 27 | # install requirements 28 | - name: Install requirements 29 | run: | 30 | python -m pip install --upgrade pip 31 | pip install -r docs/requirements.txt 32 | 33 | # Compile notebooks 34 | - name: Compile Notebooks 35 | run: | 36 | mkdir nb 37 | for i in sem*; do jupyter nbconvert --to html --output=$i --output-dir=nb $i/main.ipynb; done 38 | for i in sem*; do jupyter nbconvert --to slides --output=$i --output-dir=nb $i/main.ipynb; done 39 | 40 | # install latest notebook classroom app 41 | - name: Install Notebook-classroom 42 | run: | 43 | wget https://github.com/hydrocode-de/notebook-classroom/releases/latest/download/notebook-classroom.zip 44 | unzip notebook-classroom.zip -d dist 45 | 46 | # install latest notebook classroom app 47 | - name: Replace Files 48 | run: | 49 | cp -r docs/* dist/ 50 | cp -r nb dist/ 51 | 52 | # install latest notebook classroom app 53 | - name: Add Index file 54 | uses: docker://pandoc/core:2.9 55 | with: 56 | args: >- # allows you to break string into multiple lines 57 | --standalone 58 | --output=dist/static/readme.htlm 59 | README.rst 60 | 61 | - name: Deploy 62 | uses: crazy-max/ghaction-github-pages@v1 63 | with: 64 | target_branch: gh-pages 65 | build_dir: dist 66 | env: 67 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 68 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | public/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | *.bin 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | .hypothesis/ 50 | .pytest_cache/ 51 | 52 | # Translations 53 | *.mo 54 | *.pot 55 | 56 | # Django stuff: 57 | *.log 58 | local_settings.py 59 | db.sqlite3 60 | 61 | # Flask stuff: 62 | instance/ 63 | .webassets-cache 64 | 65 | # Scrapy stuff: 66 | .scrapy 67 | 68 | # Sphinx documentation 69 | docs/_build/ 70 | 71 | # PyBuilder 72 | target/ 73 | 74 | # Jupyter Notebook 75 | .ipynb_checkpoints 76 | 77 | # pyenv 78 | .python-version 79 | 80 | # celery beat schedule file 81 | celerybeat-schedule 82 | 83 | # SageMath parsed files 84 | *.sage.py 85 | 86 | # Environments 87 | .env 88 | .venv 89 | env/ 90 | venv/ 91 | ENV/ 92 | env.bak/ 93 | venv.bak/ 94 | 95 | # Spyder project settings 96 | .spyderproject 97 | .spyproject 98 | 99 | # Rope project settings 100 | .ropeproject 101 | 102 | # mkdocs documentation 103 | /site 104 | 105 | # mypy 106 | .mypy_cache/ 107 | 108 | # Exclude __pycache__ : 109 | __pycache__/ 110 | # Exclude .gitignore: 111 | .gitignore 112 | # Exclude folders with name logs: 113 | logs/ 114 | 115 | # Exclude all .dat files: 116 | *.dat 117 | # Exclude all files which begin on . 118 | */.* 119 | .* 120 | */mnist 121 | *.csv 122 | !.dvc 123 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Andrii Hraboviy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ######################### 2 | Machine Learning Seminars 3 | ######################### 4 | 5 | Полезные ссылки 6 | =============== 7 | - Плейлист лекций и семинаров: `2020-2021 `_; `2021-2022 `_ 8 | - `Курс лекций К.В. Воронцова. `_ 9 | - `Курс Мурата Апишева по python. `_ 10 | - `Почта для связи. `_ 11 | 12 | Осенний семестр 13 | =============== 14 | 15 | Курсовое домашнее задание: 16 | -------------------------- 17 | 18 | Первое задание: 19 | ************************************************ 20 | - Начало: 20:00 23.09.2024. 21 | - Сдавать лично в течении семестра, в конце семинара. 22 | - `Генератор задания `_: 23 | - В качестве почты нужно ввести почту в домене @phystech.edu. 24 | - После ввода почты, вам будет предложена выборка с ссылкой для скачивания, а также методы, которые нужно проанализировать для данной выборки. 25 | - Требуется: 26 | - Провести анализ выборки: 27 | - Определить тип признаков. 28 | - Выполнить визуальный анализ данных. 29 | - Выполнить препроцесинг данных: 30 | - Преобразовать категориальные признаки в вещественные. 31 | - Отнормировать признаки. 32 | - Провести эксперимент для предложенных методов: 33 | - Выполнить подбор гиперпараметров. 34 | - Подобрать регуляризаторы. 35 | - Получить итоговые модели. 36 | - Описать полученные результаты: 37 | - Какая модель лучше и почему. 38 | - С какими проблемами столкнулись во время выполнения, возможно недочеты стандартных библиотек. 39 | - Совпадают ли полученные результаты с ожидаемыми результатами. 40 | - Оценивание: 41 | - Качество кода (1б): 42 | - Код должен работать у проверяющего. 43 | - Код должен был понятен без автора. 44 | - Качество анализа (3б): 45 | - Анализ выборки. 46 | - Анализ гиперпараметров. 47 | - Анализ результатов для разных моделей. 48 | - Качество отчета (1б): 49 | - Учитывается полнота отчета. 50 | 51 | Второе задание: 52 | ************************************************ 53 | - Начало: 18:30 11.11.2024. 54 | - Дедлайн: 23:59 15.12.2024. 55 | - `Ссылка на задание `_. 56 | - Писать на почту Андрею. Тема письма [MIPT-2024-ML-fall-2] ФИО. В письме прислать .ipynb файл и ник на kaggle. 57 | - Требуется: 58 | - Отправить свое решение в csv формате на kaggle.com. 59 | - Отправить ноутбук с решением на почту. 60 | 61 | План занятий 62 | ------------ 63 | 64 | Вводный семинар 65 | ************************************************ 66 | - `Семинар `_: 67 | - Теоретическая часть: 68 | - Общие идеи оптимизации, функции ошибки и тд. 69 | - Практическая часть: 70 | - При помощи sklearn показать пример Ирисов Фишера. 71 | - Понятие модели алгоритмов, алгоритм обучения, процесс оптимизации для конкретной задачи. 72 | - Переход от бинарной к многоклассовой. 73 | - Переобучение. Борьба с переобучением (начало). 74 | - Немного о типах задач машинного обучения: прикладные и исследовательские 75 | - Домашнее задание: 76 | - В задаче по переходу от бинарной классификации к многоклассовой добавить константу и скорректировать соответствующие разделяющие гиперплоскости. 77 | - Подсказка: в LogisticRegresion нужно добавить специальный параметр fit_intercept=False, чтобы внутри черного ящика своя константа не добавлялась(влияет на результат). 78 | 79 | 80 | Линейные методы классификации и регрессии: метод стохастического градиента 81 | ******************************************************************************* 82 | - `Семинар `_: 83 | - Теоретическая часть: 84 | - Анализ стохастического градиента на сходимость. 85 | - Задача линейной регрессии, МНК в общем случае. 86 | - Постановка задачи линейной регрессии через правдоподобие, вероятностные предположения о данных + регуляризаций. 87 | - Практическая часть: 88 | - Разбор домашнего задания. 89 | - Метод стохастического градиента на практике. 90 | - Использования torch framework для нахождения градиента сложной функции. 91 | - Вероятностная постановка задачи машинного обучения. Регуляризация l1, l2. 92 | - Анализ решения задачи оптимизации от параметра регуляризации. 93 | - Выбор параметра регуляризации при помощи LOO. 94 | - Домашнее задание: 95 | - Используя вероятностную постановку задачи для линейной регрессии с априорным предположением p(w) = N(0, I) получить аналитическое решение на оптимальный вектор параметров w. 96 | - Использовать метод Cross-Validation вместо метода LOO для выбора оптимального параметра регуляризации gamma. 97 | 98 | Нейронные сети: Autograd 99 | ******************************************************************************* 100 | - `Семинар `_: 101 | - Теоретическая часть: 102 | - Автоматическое дифференцирование. 103 | - Практическая часть: 104 | - Разбор домашнего задания. 105 | - Построение простой нейросетевой модели: многослойный персептрон. 106 | - Обучение персептрона на выборке MNIST. 107 | - Подбор гиперпараметров модели. 108 | - Прореживание сетей (без кода, только графики). 109 | - Домашнее задание: 110 | - Проделать то, что было на семинаре для выборки FashionMnist: подбор гиперпараметров модели (выполнить более подробно чем на семинаре), также провести анализ полученных результатов. 111 | - Указать какие минусы вы увидели в подборе гиперпараметров на семинаре (их как минимум 3). 112 | 113 | Метрические методы классификации и регрессии 114 | ******************************************************************************* 115 | - `Семинар `_: 116 | - Практическая часть: 117 | - Разбор домашнего задания. 118 | - Пример как можно отказаться от признаков в линейном классификаторе. 119 | - Метод ближайших соседей, анализ разного количества соседей. 120 | - Ядра в методе ближайших соседей. 121 | - Метод Парзеновского окна. 122 | - Метод потенциальных функций (реализация). 123 | - Отбор эталонных элементов, алгоритм STOLP. 124 | - Формула Надарая Ватсона. 125 | - Домашнее задание: 126 | - Выбрать один из метрических классификаторов (классификации или регрессии) и выполнить поиск оптимальных гиперпараметра при помощи кросс валидации. 127 | 128 | Линейные методы классификации и регрессии: метод опорных векторов 129 | ******************************************************************************* 130 | - `Семинар `_: 131 | - Практическая часть: 132 | - SVM для классификации. 133 | - Примеры использования ядер для SVM. 134 | - SVM для регрессии. 135 | - Генерация признаков на основе опорных элементов. 136 | - Домашнее задание: 137 | - Провести эксперимент с полиномиальным ядром: сгенерировать синтетическую выборку, на которой полиномиальное ядро имеет лучшее качество аппроксимации чем rbf и линейное ядро. 138 | 139 | Многомерная линейная регрессия. Метод главных компонент 140 | ******************************************************************************* 141 | - `Семинар `_: 142 | - Практическая часть: 143 | - Многомерная линейная регрессия. 144 | - Сингулярное разложение. 145 | - Регуляризация для многомерной регрессии: используя SVD. 146 | - Зависимость качества аппроксимации от числа обусловленности. 147 | - Метод главных компонент: визуализация MNIST. 148 | - Метод главных компонент: для изображений. 149 | - Домашнее задание: 150 | - Доказать лемму из семинара. 151 | - Для синтетически сгенерированной выборки (beta=2, mu=0.01) построить график зависимости качества аппроксимации контрольной выборки от коэффициента регуляризации. Сравнить скорость работы в случае использования SVD разложения и без него. 152 | 153 | Нелинейная регрессия. Обобщенные линейные модели. Нестандартные функции потерь. 154 | ******************************************************************************* 155 | - `Семинар `_: 156 | - Практическая часть: 157 | - Нелинейная регрессия: пример задачи. 158 | - Сравнение градиентного спуска, метода Ньютона-Рафсона, метода Ньютона-Гауса. 159 | - Обобщенно линейные модели: оптимальный размер выборки. 160 | - Функция потерь для задачи поиска близких предложений. 161 | - Визуализация сходимости метода Ньютона Рафсона и стохастического градиента. 162 | - `Домашнее задание `_: 163 | - Использовать модель для векторизации предложений из семинара. На основе полученных векторов решить задачу сентимент анализа для выборки Twitter (задача бинарной классификации). В качестве модели рассмотреть логистическую регрессию. Рекомендуется использовать модель Perceptron с третьего семинара, а также функцию ошибки torch.nn.BCELoss. Ссылка на данные: https://drive.google.com/file/d/1k4JrnVcoePEENCYt5iy17dyV_h133j2X/view?usp=sharing (предложения для классификации это последний столбец, а целевая переменная это второй столбец). 164 | 165 | Критерии выбора моделей и методы отбора признаков. 166 | ******************************************************************************* 167 | - `Семинар `_: 168 | - Практическая часть: 169 | - Оценка качества моделей: внешний и внутренний критерии. 170 | - Отбор признаков: полный перебор, алгоритм Add, алгоритм Add-Del. 171 | - Качество классификации: Precision, Recall. 172 | - Пример задачи information retrieval. 173 | - О составлении выборки для постановки задачи ML. 174 | - Домашнее задание: 175 | - реализовать метода отбора признаков Add-Del. 176 | - предложения внешний критерий качества для задачи поиска ошибок в текстах. 177 | 178 | Логические методы классификации. 179 | ******************************************************************************* 180 | - `Семинар `_: 181 | - Практическая часть: 182 | - Логический классификатор реализация. 183 | - Примеры задач для решения логическим классификатором. 184 | - Критерии информативности. 185 | - Решающий список, простая реализация. 186 | - Решающее дерево. 187 | - Случайный лес. 188 | - Домашнее задание: 189 | - в реализованный метод построение логистического классификатора добавить возможность оптимизации по критерию Джини. 190 | 191 | Поиск ассоциативных правил. 192 | ******************************************************************************* 193 | - `Семинар `_: 194 | - Практическая часть: 195 | - Постановка задачи ассоциативных правил. 196 | - Синтетический пример. 197 | - Пример реальных данных из kaggle. 198 | - Алгоритм APriory. 199 | - Алгоритм FP-growth. 200 | - Обобщение для вещественных данных. 201 | - Обобщенные ассоциативные правила. 202 | - Домашнее задание: 203 | - выполнить анализ ассоциативных правил, которые получены алгоритмом FP-growth. Рассмотреть только те правила, которые содержат более 3 элементов 204 | 205 | Композиции классификаторов. 206 | ******************************************************************************* 207 | - `Семинар `_: 208 | - Практическая часть: 209 | - DummyEnsemble. 210 | - AdaBoost. 211 | - Градиентный бустинг, XGBoost. 212 | - Пример реальных данных из kaggle. 213 | - RandomForest. 214 | - Mixture Of Expert. 215 | - Домашнее задание: 216 | - Рассматривается две выборки: `выборка `_ и `выборка `_. Для обоих выборок построить AdaBoost, GradientBoosting, RandomForest, Bagging. Сравнить качество на обоих выборках. Отличается ли результат? Почему? 217 | 218 | Композиции классификаторов (градиентный бустинг). 219 | ******************************************************************************* 220 | - `Семинар `_: 221 | - Практическая часть: 222 | - ComBoost. 223 | - Gradient Boosting. 224 | - XGBoost. 225 | - CatBoost. 226 | - Домашнее задание: 227 | - Реализовать комитетный бустинг для задачи регрессии. 228 | 229 | Байесовская теория классификации. 230 | ******************************************************************************* 231 | - `Семинар `_: 232 | - Практическая часть: 233 | - Принцип максимума правдоподобия: визуализация. 234 | - Восстановление плотности по эмпирическим данным. 235 | - LOO для выбора ширины окна. 236 | - Наивный байесовский классификатор. 237 | - Домашнее задание: 238 | - Получить оценку параметров нормального распределения из принципа максимума правдоподобия. 239 | 240 | Методы кластеризации и обучение на неразмеченных данных. 241 | ******************************************************************************* 242 | - `Семинар `_: 243 | - Практическая часть: 244 | - Задача кластеризации. 245 | - Примеры кластеров. 246 | - K-means. 247 | - DBSCAN. 248 | - Иерархическая кластеризация. 249 | - Частичное обучение. 250 | - Self-training, 1970. 251 | - Неразмеченные данные в глубоком обучении. 252 | - Домашнее задание: 253 | - Самому сравнить разные методы кластеризации для трех концентрических окружностей. 254 | 255 | Весенний семестр 256 | ================ 257 | 258 | Курсовое домашнее задание: 259 | -------------------------- 260 | 261 | Первое задание: 262 | ************************************************ 263 | - Задание доступно по `ссылке `_. 264 | - Сдавать лично в течении семестра, в конце семинара. 265 | 266 | Второе задание: 267 | ************************************************ 268 | - Задание доступно по `ссылке `_. 269 | - Сдавать лично в течении семестра, в конце семинара. 270 | 271 | План занятий 272 | ------------ 273 | 274 | Глубокие Нейронные Сети. Сверточные нейросети и Рекурентные сети. 275 | ******************************************************************************* 276 | - `Семинар `_: 277 | - Практическая часть: 278 | - Сверточные нейронные сети. 279 | - Отслеживание обучения при помощи tensorboard. 280 | - Рекурентные нейронные сети. 281 | - Использование предобученных моделей. 282 | - Интерпретируемость ответов нейросети. 283 | 284 | Нейронные сети. Автокодировщик. Transfer Learning. Генеративно-Состязательные сети. 285 | ******************************************************************************* 286 | - `Семинар `_: 287 | - Практическая часть: 288 | - Автокодировщик. 289 | - Линейный автокодировщик. 290 | - Автокодировщик на основе CNN. 291 | - Вариационный автокодировщик. 292 | - Перенос обучения с предварительно обученой модели. 293 | - Генеративно состязательные сети. 294 | 295 | Векторное представления текстов. 296 | ******************************************************************************* 297 | - `Семинар `_: 298 | - Практическая часть: 299 | - Пример классификации твитов. 300 | - Зачем нужна векторизация?. 301 | - Токенизация текстов. 302 | - Word2Vec (на основе модели FastText). 303 | - FastText модель (сжатая до emb-dim=10 для легковестности). 304 | - Задачи для unsupervise training моделей векторизации. 305 | 306 | Attention is all you need. Трансформеры. 307 | ******************************************************************************* 308 | - `Семинар `_: 309 | - Практическая часть: 310 | - Модель внимания в рекурентных нейронных сетях. 311 | - Трансформеры. 312 | - T2T переводчик. 313 | - BPE токенизация. 314 | - BERT. 315 | - LaBSE. 316 | 317 | Тематическое моделирование. 318 | ******************************************************************************* 319 | - `Семинар `_: 320 | - Практическая часть: 321 | - Модель LDA. 322 | - Модель PLSA (bigartm). 323 | 324 | Пояснение к домашнему заданию. 325 | ******************************************************************************* 326 | - `Семинар `_: 327 | - Практическая часть: 328 | - Задачи из ДЗ. 329 | 330 | Задача ранжирования. 331 | ******************************************************************************* 332 | - `Семинар `_: 333 | - Практическая часть: 334 | - Базовые понятия. 335 | - Пример задачи ранжирования. 336 | - Пример рекомендательной системы. 337 | - Обучение поисковика на базе pyserini. 338 | 339 | Рекомендательные системы. 340 | ******************************************************************************* 341 | - `Семинар `_: 342 | - Практическая часть: 343 | - Константная модель. 344 | - Кореляционная система. 345 | - SLIM. 346 | - SVD. 347 | 348 | Временные ряды. 349 | ******************************************************************************* 350 | - `Семинар `_: 351 | - Практическая часть: 352 | - Авторегрессионная модель. 353 | - Экспоненциальное сглаживание. 354 | - Кластерный анализ временных рядов. 355 | 356 | Онлайновое обучение. 357 | ******************************************************************************* 358 | - `Семинар `_: 359 | - Практическая часть: 360 | 361 | Обучение с подкреплением. 362 | ******************************************************************************* 363 | - `Семинар `_: 364 | - Практическая часть: 365 | - Стационарный многорукий бандин. 366 | - Нестационарный многорукий бандин. 367 | - Задача о заплыве. 368 | 369 | Активное обучение. 370 | ******************************************************************************* 371 | - `Семинар `_: 372 | - Практическая часть: 373 | - Активное обучение со случайным добавляющим элементом. 374 | - Активное обучение с добавлением элемента с максимальной дисперсией. 375 | 376 | Заключительное занятие. 377 | ******************************************************************************* 378 | - `Семинар `_: 379 | - Теоретическая часть: 380 | - Разбор Posterior Sampling 381 | 382 | 383 | Дополнительные лекции 384 | ===================== 385 | 386 | Список занятий 387 | --------------- 388 | 389 | Введения в LLM 390 | *************** 391 | - `Семинар `_: 392 | - Практическая часть: 393 | - Исправление опечаток при помощи mT5. 394 | 395 | Статистический машинный перевод (прочитан осенью 2024 года на кафедре ММП ВМК МГУ) 396 | ******************************************************************************* 397 | - `Семинар `_: 398 | - Практическая часть: 399 | - Статистический машинный перевод при помощи MOSES. 400 | -------------------------------------------------------------------------------- /docs/configuration.js: -------------------------------------------------------------------------------- 1 | var Config = { 2 | title: "Machine Learning Seminars", 3 | url: "https://andriygav.github.io/MachineLearningSeminars/", 4 | navigation: [ 5 | { 6 | label: "Home", 7 | link: "readme.htlm", 8 | type: "static" 9 | }, 10 | { 11 | label: "Notebooks", 12 | navigation: [ 13 | { 14 | label: "Introduction", 15 | link: "sem1.html", 16 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem1/main.ipynb", 17 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem1/main.ipynb" 18 | }, 19 | { 20 | label: "Linear methods", 21 | link: "sem2.html", 22 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem2/main.ipynb", 23 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem2/main.ipynb" 24 | }, 25 | { 26 | label: "Neural networks", 27 | link: "sem3.html", 28 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem3/main.ipynb", 29 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem3/main.ipynb" 30 | }, 31 | { 32 | label: "Metric methods", 33 | link: "sem4.html", 34 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem4/main.ipynb", 35 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem4/main.ipynb" 36 | }, 37 | { 38 | label: "SVM", 39 | link: "sem5.html", 40 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem5/main.ipynb", 41 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem5/main.ipynb" 42 | }, 43 | { 44 | label: "PCA", 45 | link: "sem6.html", 46 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem6/main.ipynb", 47 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem6/main.ipynb" 48 | }, 49 | { 50 | label: "Nonlinear regression", 51 | link: "sem7.html", 52 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem7/main.ipynb", 53 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem7/main.ipynb" 54 | }, 55 | { 56 | label: "Feature selection", 57 | link: "sem8.html", 58 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem8/main.ipynb", 59 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem8/main.ipynb" 60 | }, 61 | { 62 | label: "Logical methods", 63 | link: "sem9.html", 64 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem9/main.ipynb", 65 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem9/main.ipynb" 66 | }, 67 | { 68 | label: "Association Rules", 69 | link: "sem10.html", 70 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem10/main.ipynb", 71 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem10/main.ipynb" 72 | }, 73 | { 74 | label: "Boosting and Bagging", 75 | link: "sem11.html", 76 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem11/main.ipynb", 77 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem11/main.ipynb" 78 | }, 79 | { 80 | label: "Gradient boosting", 81 | link: "sem12.html", 82 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem12/main.ipynb", 83 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem12/main.ipynb" 84 | }, 85 | { 86 | label: "Density recovery", 87 | link: "sem13.html", 88 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem13/main.ipynb", 89 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem13/main.ipynb" 90 | }, 91 | { 92 | label: "Clustering methods", 93 | link: "sem14.html", 94 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem14/main.ipynb", 95 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem14/main.ipynb" 96 | }, 97 | { 98 | label: "Deep Neural Networks", 99 | link: "sem15.html", 100 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem15/main.ipynb", 101 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem15/main.ipynb" 102 | }, 103 | { 104 | label: "Autoencoder", 105 | link: "sem16.html", 106 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem16/main.ipynb", 107 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem16/main.ipynb" 108 | }, 109 | { 110 | label: "Vector representations", 111 | link: "sem17.html", 112 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem17/main.ipynb", 113 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem17/main.ipynb" 114 | }, 115 | { 116 | label: "Attention is all you need", 117 | link: "sem18.html", 118 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem18/main.ipynb", 119 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem18/main.ipynb" 120 | }, 121 | { 122 | label: "Thematic modeling", 123 | link: "sem19.html", 124 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem19/main.ipynb", 125 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem19/main.ipynb" 126 | }, 127 | { 128 | label: "Ranking task", 129 | link: "sem21.html", 130 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem21/main.ipynb", 131 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem21/main.ipynb" 132 | }, 133 | { 134 | label: "Recommender systems", 135 | link: "sem22.html", 136 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem22/main.ipynb", 137 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem22/main.ipynb" 138 | }, 139 | { 140 | label: "Time series", 141 | link: "sem23.html", 142 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem23/main.ipynb", 143 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem23/main.ipynb" 144 | }, 145 | { 146 | label: "Online learning", 147 | link: "sem24.html", 148 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem24/main.ipynb", 149 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem24/main.ipynb" 150 | }, 151 | { 152 | label: "Reinforcement learning", 153 | link: "sem25.html", 154 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem25/main.ipynb", 155 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem25/main.ipynb" 156 | }, 157 | { 158 | label: "Active learning", 159 | link: "sem26.html", 160 | github: "https://github.com/andriygav/MachineLearningSeminars/blob/master/sem26/main.ipynb", 161 | binder: "https://colab.research.google.com/github/andriygav/MachineLearningSeminars/blob/master/sem26/main.ipynb" 162 | } 163 | ] 164 | }, 165 | { 166 | label: "Presentations", 167 | navigation: [ 168 | { 169 | label: "Introduction", 170 | link: "sem1.slides.html", 171 | }, 172 | { 173 | label: "Linear methods", 174 | link: "sem2.slides.html", 175 | }, 176 | { 177 | label: "Neural networks", 178 | link: "sem3.slides.html", 179 | }, 180 | { 181 | label: "Metric methods", 182 | link: "sem4.slides.html", 183 | }, 184 | { 185 | label: "SVM", 186 | link: "sem5.slides.html", 187 | }, 188 | { 189 | label: "PCA", 190 | link: "sem6.slides.html", 191 | }, 192 | { 193 | label: "Nonlinear regression", 194 | link: "sem7.slides.html", 195 | }, 196 | { 197 | label: "Feature selection", 198 | link: "sem8.slides.html", 199 | }, 200 | { 201 | label: "Logical methods", 202 | link: "sem9.slides.html", 203 | }, 204 | { 205 | label: "Association Rules", 206 | link: "sem10.slides.html", 207 | }, 208 | { 209 | label: "Boosting and Bagging", 210 | link: "sem11.slides.html", 211 | }, 212 | { 213 | label: "Gradient boosting", 214 | link: "sem12.slides.html", 215 | }, 216 | { 217 | label: "Density recovery", 218 | link: "sem13.slides.html", 219 | }, 220 | { 221 | label: "Clustering methods", 222 | link: "sem14.slides.html", 223 | }, 224 | { 225 | label: "Deep Neural Networks", 226 | link: "sem15.slides.html", 227 | }, 228 | { 229 | label: "Autoencoder", 230 | link: "sem16.slides.html", 231 | }, 232 | { 233 | label: "Vector representations", 234 | link: "sem17.slides.html", 235 | }, 236 | { 237 | label: "Attention is all you need", 238 | link: "sem18.slides.html", 239 | }, 240 | { 241 | label: "Thematic modeling", 242 | link: "sem19.slides.html", 243 | }, 244 | { 245 | label: "Ranking task", 246 | link: "sem21.slides.html", 247 | }, 248 | { 249 | label: "Recommender systems", 250 | link: "sem22.slides.html", 251 | }, 252 | { 253 | label: "Time series", 254 | link: "sem23.slides.html", 255 | }, 256 | { 257 | label: "Online learning", 258 | link: "sem24.slides.html", 259 | }, 260 | { 261 | label: "Reinforcement learning", 262 | link: "sem25.slides.html", 263 | }, 264 | { 265 | label: "Active learning", 266 | link: "sem26.slides.html", 267 | } 268 | ] 269 | }, 270 | ] 271 | }; 272 | -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/docs/favicon.ico -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Machine Learning 12 | 13 | 14 | 15 |
16 | 17 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | jupyter==1.0.0 2 | nbconvert==6.0.0 3 | jinja2==3.0.3 4 | lxml[html_clean] 5 | octave_kernel 6 | -------------------------------------------------------------------------------- /docs/static/js/main.372afe1e.chunk.js: -------------------------------------------------------------------------------- 1 | (this["webpackJsonpnotebook-classroom"]=this["webpackJsonpnotebook-classroom"]||[]).push( 2 | [[0],{ 3 | 103:function(e,t,n){ 4 | e.exports={title:"Navigation_title__3fPDe"} 5 | }, 6 | 111:function(e,t,n){ 7 | e.exports={Spinner:"Spinner_Spinner__24ERy"} 8 | }, 9 | 113:function(e,t,n){ 10 | e.exports=n.p+"static/media/binder_logo.fb62fd0a.png" 11 | }, 12 | 116:function(e,t,n){ 13 | e.exports=n(296) 14 | }, 15 | 121:function(e,t,n){}, 16 | 21:function(e,t,n){ 17 | e.exports={ 18 | ButtonOverlay:"ButtonOverlay_ButtonOverlay__VmmOm", 19 | ButtonGroup:"ButtonOverlay_ButtonGroup__dxl69", 20 | OneButton:"ButtonOverlay_OneButton__3m0R-", 21 | TwoButtons:"ButtonOverlay_TwoButtons__1Etnu", 22 | ThreeButtons:"ButtonOverlay_ThreeButtons__1VYUc", 23 | Button:"ButtonOverlay_Button__3AYZN", 24 | Chevron:"ButtonOverlay_Chevron__2KbQL", 25 | Binder:"ButtonOverlay_Binder__1w2XD" 26 | } 27 | }, 28 | 296:function(e,t,n){ 29 | "use strict"; 30 | n.r(t); 31 | var a=n(0), o = n.n(a), r = n(16), i = n.n(r), l=(n(121),n(42)),s=n(43),c=n(49),u=n(44),g=n(51),d=(n(122),n(67)),m=n.n(d),f=n(301),v=n(300),h=n(299),p=n(103),b=n.n(p); 32 | var k=function(e){ 33 | var t=null; 34 | return t=e.dummy || !e.config.navigation?o.a.createElement(h.a.Text,null,"Corrupted configuration.js found."):function e(t){ 35 | var n=arguments.length>1 && void 0!==arguments[1]?arguments[1]:0; 36 | return 0===t.length?o.a.createElement(f.a.Item,{className:"px-3"},"no sites found"):t.map((function(t){ 37 | return t.navigation?o.a.createElement(v.a,{id:t.label,title:t.label,key:t.label},e(t.navigation,1)):n>0?o.a.createElement(v.a.Item,{key:t.label,eventKey:t.link},t.label):o.a.createElement(f.a.Item,{key:t.label},o.a.createElement(f.a.Link,{eventKey:t.link},t.label))}))}(e.config.navigation),o.a.createElement(h.a,{bg:"light",expand:"lg"},o.a.createElement(h.a.Brand,{href:e.config.homeUrl?e.config.homeUrl:"/"},o.a.createElement("span",{className:b.a.title},e.config.title?e.config.title:"Notebook Classroom")),o.a.createElement(h.a.Toggle,{"aria-controls":"menu"}),o.a.createElement(h.a.Collapse,{id:"menu"},o.a.createElement(f.a,{className:"mx-auto",onSelect:function(t){return e.navigator(t)}},t)),o.a.createElement(f.a.Item,null,o.a.createElement(f.a.Link,{className:"navbar-text",href:"https://hydrocode.de",target:"_blank"},o.a.createElement("img",{src:"logo.png",width:"25",height:"25",alt:"logo"}),"")))},_=n(302),E=n(115),y=n(52),B=n.n(y),C=n(109),N=n.n(C),O=window.Config;if(!O)throw new Error("[axios.js] configuration.js not found.");var w=!!O.development,x=N.a.create({baseURL:O.url?O.url:"http://localhost:3000"});w&&(x.interceptors.request.use((function(e){return console.log(e),e}),(function(e){console.log(e)})),x.interceptors.response.use((function(e){return console.log(e),e}),(function(e){console.log(e)})));var S=n(110),j=n.n(S),L=n(114),T=n.n(L),H=n(111),P=n.n(H),M=n(34),z=n(48),I=function(e){return o.a.createElement("div",{className:P.a.Spinner},o.a.createElement(M.a,{icon:z.b,spin:!0,size:e.size?e.size:"5x",color:e.color?e.color:"silver"}),e.message?o.a.createElement("p",{style:{color:e.color?e.color:"silver"}},e.message):null)},U=n(21),D=n.n(U),F=n(298),K=n(108),A=n(112),G=n(113),R=n.n(G),q=function(e){var t=0,n=[D.a.ButtonGroup];return e.github&&(t+=1),e.binder&&(t+=1),0===t?null:(1===t?n.push(D.a.OneButton):2===t&&n.push(D.a.TwoButtons),o.a.createElement("div",{className:D.a.ButtonOverlay},o.a.createElement(F.a,{className:n,"aria-label":"button-overlay"},e.github?o.a.createElement(K.a,{className:D.a.Button,variant:"default",href:e.github},o.a.createElement(M.a,{icon:A.a,size:"3x"})):null,e.binder?o.a.createElement(K.a,{className:[D.a.Button,D.a.Binder].join(" "),variant:"default",href:e.binder},o.a.createElement("img",{src:R.a,alt:"binder",width:"57px"})):null,o.a.createElement(K.a,{variant:"default",className:D.a.Chevron,disabled:!0},o.a.createElement(M.a,{icon:z.a,color:"silver",size:"3x"})))))},J=function(e){function t(e){var n;return Object(l.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).loadingFinishedHandler=function(){n.setState({loading:!1})},n.updateMessageHandler=function(e){n.setState({message:e})},n.loadPage=function(){var e=n.state.config&&n.state.config.type?"/".concat(n.state.config.type,"/"):"/nb/";x.get(e+n.state.link).then((function(e){n.setState({notebook:e.data},n.buildPage)})).catch((function(e){n.setState({errored:!0,errMessage:"The page ".concat(n.state.link," could not be found.")})}))},n.buildPage=function(){if(n.updateMessageHandler("loading data..."),!n.state.notebook)return n.setState({errored:!0,loading:!1,errMessage:"Cannot build a notebook page from ".concat(n.state.link)}),!1;n.updateMessageHandler("building the page...");var e=n.parseTypePageType(),t=Object(E.a)(e,2),a=t[0],o=t[1];n.setState({page:a,useContainer:o},n.loadingFinishedHandler)},n.parseTypePageType=function(){var e=null,t=!0;return"md"===n.state.link.split(".").pop()?e=o.a.createElement(j.a,{source:n.state.notebook,escapeHtml:!1}):(e=o.a.createElement("iframe",{className:B.a.NbContainer,srcDoc:n.state.notebook,title:n.state.link}),t=!1),[e,t]},n.state={loading:!0,errored:!e.link,errMessage:e.link?null:"Error. The requested site is not available or not of type .html.",link:e.link,config:e.site,message:"searching "+e.link+"...",notebook:null,page:null,useContainer:!0},n}return Object(g.a)(t,e),Object(s.a)(t,[{key:"componentDidMount",value:function(){this.loadPage()}},{key:"componentDidUpdate",value:function(e,t){e.link!==this.props.link&&this.setState({loading:!0,errored:!1,errMessage:null,message:"searching "+this.props.link+"...",link:this.props.link,config:this.props.site,useContainer:!0},this.loadPage)}},{key:"render",value:function(){var e=null,t=null;this.state.loading&&(e=o.a.createElement(I,{size:"10x",message:this.state.message})),this.state.loading||this.state.errored||!this.state.notebook||(e=this.state.page,!this.state.useContainer&&this.state.config&&(t=o.a.createElement(q,{github:this.state.config.github,binder:this.state.config.binder}))),this.state.errored&&(e=o.a.createElement(T.a,{variant:"danger"},this.state.errMessage?this.state.errMessage:"Unkown error occured."));var n=[B.a.Notebook];return this.state.useContainer&&(n.push("container"),n.push(B.a.HasContainer)),o.a.createElement("div",{className:n.join(" ")},t,e)}}]),t}(a.Component);function Q(e){var t=window.Config;return!!(t&&t.navigation&&Array.isArray(t.navigation))&&(!!t.navigation.every((function(e){return!(!e.label||!e.link&&!e.navigation)}))&&t)}var V=function(e){function t(e){var n;return Object(l.a)(this,t),(n=Object(c.a)(this,Object(u.a)(t).call(this,e))).navigateHandler=function(e){if(e!==n.state.currentLink){var t=n.findSiteFromLink(e);n.setState({currentLink:e,currentSite:t})}},n.findSiteFromLink=function(e){var t=null;return n.state.validConfig.navigation.forEach((function(n){if(n.navigation){var a=n.navigation.find((function(t){return t.link===e}));a&&(t=a)}n.link===e&&(t=n)})),t},n.state={validConfig:Q(),currentLink:"readme.htlm",currentSite:{type:"static"}},n}return Object(g.a)(t,e),Object(s.a)(t,[{key:"render",value:function(){var e=null;return this.state.validConfig||(e=o.a.createElement(_.a,{variant:"danger"},"The ",o.a.createElement("i",null,"configuration.js")," was not found or is corrupted. Cannot build a proper Navigation.")),o.a.createElement("div",{className:m.a.Layout},e?o.a.createElement(k,{dummy:!0}):o.a.createElement(k,{config:this.state.validConfig,navigator:this.navigateHandler}),o.a.createElement("div",{className:m.a.Page},e,o.a.createElement(J,{link:this.state.currentLink,site:this.state.currentSite})))}}]),t}(a.Component);var W=function(){return o.a.createElement(V,null)};Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));i.a.render(o.a.createElement(W,null),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()}))},52:function(e,t,n){e.exports={Notebook:"Notebook_Notebook__25Qs-",NbContainer:"Notebook_NbContainer__3ITS-",HasContainer:"Notebook_HasContainer__1vv8K"}},67:function(e,t,n){e.exports={Layout:"Layout_Layout__37MHr",Page:"Layout_Page__18rSs",Error:"Layout_Error__pnPai"}}},[[116,1,2]]]); 38 | //# sourceMappingURL=main.372afe1e.chunk.js.map -------------------------------------------------------------------------------- /docs/static/media/binder_logo.fb62fd0a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/docs/static/media/binder_logo.fb62fd0a.png -------------------------------------------------------------------------------- /hometask/task1-1/generator.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "kernelspec": { 6 | "display_name": "Python 3", 7 | "language": "python", 8 | "name": "python3" 9 | }, 10 | "language_info": { 11 | "codemirror_mode": { 12 | "name": "ipython", 13 | "version": 3 14 | }, 15 | "file_extension": ".py", 16 | "mimetype": "text/x-python", 17 | "name": "python", 18 | "nbconvert_exporter": "python", 19 | "pygments_lexer": "ipython3", 20 | "version": "3.6.2" 21 | }, 22 | "colab": { 23 | "name": "generator.ipynb", 24 | "provenance": [] 25 | } 26 | }, 27 | "cells": [ 28 | { 29 | "cell_type": "code", 30 | "metadata": { 31 | "id": "9CSy43_9KwdH", 32 | "outputId": "bce3be87-10e7-4cda-8b19-217e0b3c988a", 33 | "colab": { 34 | "base_uri": "https://localhost:8080/" 35 | } 36 | }, 37 | "source": [ 38 | "from zlib import crc32\n", 39 | "import numpy as np\n", 40 | "\n", 41 | "types = ['regression', 'classification']\n", 42 | "datasets = {'regression': [{'name': 'Servo Data Set',\n", 43 | " 'url': 'https://archive.ics.uci.edu/ml/datasets/Servo'}, \n", 44 | " {'name': 'Forest Fires Data Set',\n", 45 | " 'url': 'https://archive.ics.uci.edu/ml/datasets/Forest+Fires'},\n", 46 | " {'name': 'Boston Housing Data Set',\n", 47 | " 'url': 'https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_boston.html#sklearn.datasets.load_boston'}, \n", 48 | " {'name': 'Diabetes Data Set',\n", 49 | " 'url': 'https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_diabetes.html#sklearn.datasets.load_diabetes'}],\n", 50 | " 'classification': [{'name': 'Spambase Data Set',\n", 51 | " 'url': 'https://archive.ics.uci.edu/ml/datasets/Spambase'}, \n", 52 | " {'name': 'Wine Data Set',\n", 53 | " 'url': 'https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_wine.html#sklearn.datasets.load_wine'}, \n", 54 | " {'name': 'Breast Cancer Data Set',\n", 55 | " 'url': 'https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_breast_cancer.html#sklearn.datasets.load_breast_cancer'}, \n", 56 | " {'name': 'MNIST',\n", 57 | " 'url': 'http://yann.lecun.com/exdb/mnist/'}]}\n", 58 | "methods = {'regression': ['Линейная регрессия', \n", 59 | " 'Перцептрон', \n", 60 | " 'Надарая-Ватсона',\n", 61 | " 'SVR'],\n", 62 | " 'classification': ['Логистическая регрессия', \n", 63 | " 'Перцептрон', \n", 64 | " 'k-ближайших соседей',\n", 65 | " 'Метод потенциальных функций',\n", 66 | " 'Метод Парзеновского окна', \n", 67 | " 'SVM']}\n", 68 | "task = dict()\n", 69 | "task['mail'] = input(prompt='Enter your mail: ')\n", 70 | "task['id'] = crc32(task['mail'].encode('utf-8'))\n", 71 | "np.random.seed(task['id'])\n", 72 | "task['type'] = np.random.choice(types)\n", 73 | "task['dataset'] = np.random.choice(datasets[task['type']])\n", 74 | "task['method'] = np.random.choice(\n", 75 | " methods[task['type']], size=3, replace=False).tolist()\n", 76 | "\n", 77 | "\n", 78 | "task" 79 | ], 80 | "execution_count": 1, 81 | "outputs": [ 82 | { 83 | "name": "stdout", 84 | "output_type": "stream", 85 | "text": [ 86 | "Enter your mail: grabovoy.av@phystech.edu\n" 87 | ] 88 | }, 89 | { 90 | "output_type": "execute_result", 91 | "data": { 92 | "text/plain": [ 93 | "{'dataset': {'name': 'Diabetes Data Set',\n", 94 | " 'url': 'https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_diabetes.html#sklearn.datasets.load_diabetes'},\n", 95 | " 'id': 1191023426,\n", 96 | " 'mail': 'grabovoy.av@phystech.edu',\n", 97 | " 'method': ['Линейная регрессия', 'SVR', 'Перцептрон'],\n", 98 | " 'type': 'regression'}" 99 | ] 100 | }, 101 | "metadata": {}, 102 | "execution_count": 1 103 | } 104 | ] 105 | } 106 | ] 107 | } -------------------------------------------------------------------------------- /hometask/task2-1/README.rst: -------------------------------------------------------------------------------- 1 | #################### 2 | Домашнее задание 2-1 3 | #################### 4 | 5 | Описание 6 | ======== 7 | 8 | В рамках данного задания требуется выполнить 5 задач. Каждая задача должна быть оформлена в виде отдельного task{1,2,3,4,5}.ipynb файла и tensorboard{1,2,3,4,5}.zip файла. 9 | В каждом файле *.ipynb должно быть: 10 | 11 | - построение архитектуры; 12 | - выполнен процесс обучения; 13 | - показан пример работы модели до обучения и после; 14 | 15 | Файл .zip должен содержать результаты эксперимента в формате tensorboard для каждой из задач: 16 | 17 | - для каждого набора параметров свой график зависимости качества от обучения (если требуется в задаче); 18 | - примеры работы модели в процессе обучения модели. 19 | 20 | Для каждой задачи должны быть представлены выводы: 21 | 22 | - какой результат ожидали; 23 | - какой не ожидали; 24 | - что было не ясно. 25 | 26 | Код и эксперимент должен быть понятным внешнему читателю: 27 | 28 | - В коде должны быть коментарии; 29 | - Названия переменных должно быть интерпретируемые. 30 | 31 | P.S. Рекомендуется все вычисления проводить на google colab в режиме cuda. 32 | 33 | P.S.S. Рекомендуется использовать backup моделей при обучении на google drive. 34 | 35 | Задачи 36 | ====== 37 | 38 | Задача 1. Анализ модели CNN 39 | --------------------------- 40 | Провести анализ качества аппроксимации выборки EMNIST-letters моделью сверточной нейронной сети в зависимости от: 41 | 42 | - размера ядра (можно ввести ограничение, что на каждом слое размер ядра одинаковый); 43 | - числа слоев; 44 | - от пулинга; 45 | - добавления BatchNorm; 46 | - параметра dropout. 47 | 48 | Все выводы должны быть представленны в формате tensorboard (каждый набор параметров, свой график, пример `16-й семинар `_). 49 | 50 | P.S. Выборку можно взять из `torchvision `_. 51 | 52 | P.S.S Если не работает скачиваение EMNIST использовать `FahionMnist `_. 53 | 54 | Пояснение: В данном задании важно продемонстрировать умение строить различные структуры модели CNN. Не обязательно выполнять перебор всех вариантов нейросети (проходить по сетке гиперпараметров), но описание экспериментов должны присутвовать. 55 | 56 | Задача 2. Анализ модели LSTM 57 | ---------------------------- 58 | Провести анализ качества аппроксимации выборки NERUS (предсказание POS tag для токенов) моделью LSTM в зависимости от: 59 | 60 | - размера слоя; 61 | - числа слоев; 62 | - параметра dropout; 63 | - добавления BatchNorm; 64 | - размера словаря; 65 | - *токенизатора* - дополнительное задание (со звездочкой). 66 | 67 | Все выводы должны быть представленны в формате tensorboard (каждый набор параметров, свой график, пример --- второй семинар). 68 | 69 | P.S. Выборку можно взять из `github `_. 70 | 71 | P.S.S. Предлагается использовать разные варианты токенизатора: 72 | 73 | - взять все слова из обучающего датасета; 74 | - использовать предобученые BPE токены из LaBSE модели (пока не сильно важно что это, об этом 4й семинар): 75 | 76 | .. code-block:: python 77 | 78 | from transformers import AutoTokenizer, AutoModel 79 | 80 | tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/LaBSE") 81 | 82 | model = YourLSTMmodel() 83 | tokens = tokenizer(['Hello Mr. Bernz.', 'I am Homer Simpsone'], padding=True, 84 | truncation=True, 85 | max_length=510, 86 | return_tensors='pt')['tokens_ids'] 87 | answer = model(tokens) 88 | 89 | P.S.S.S. Сначала выборку нужно привести формат согласно Вашему токенизатору, то есть выполнить отображение исходной выборки с токенами в исходном формате в выборку с токенами, которые согласованы с Вашим токенизатором. 90 | 91 | Пояснение: В данном задании важно продемонстрировать умение работать с моделью LSTM, а также умение преобразовать данные под разные модели и данные. В качестве базового решения продемостировать аппроксимации "чистой" выборки NERUS без преобразования данных (взять исходные токены из выборки). Более сложным является задание, когда Вам дают другой токенизатор предложения и доступные данные нужно переформатировать в нужный Вам формат данных. 92 | 93 | Задача 3. Модель автокодировщика 94 | -------------------------------- 95 | Провести анализ модели автокодировщика (не вариационного) для выборки Twitter (эмбединги предложений). Требуется сравнить качество востановления предложения в зависимости от: 96 | 97 | - размера слоя; 98 | - числа слоев; 99 | - параметра dropout; 100 | - добавления BatchNorm; 101 | - размера словаря; 102 | - *токенизатора* - дополнительное задание (со звездочкой. 103 | 104 | Все выводы должны быть представленны в формате tensorboard (каждый набор параметров, свой график, пример --- второй семинар). 105 | 106 | P.S. Выборку можно взять из `семинара 17 `_. Пример как использовать DVC для выгрузки данных представлен в `ноутбуке `_. DVC временно не работает, можете взять документы напрямую из `яндекс диска `_. 107 | 108 | P.S.S. Рекомендуется использовать предобученый BPE токенизатор для снижения размерности словаря (см. задачу 2). 109 | 110 | Задача 4. Вариационный автокодировщик 111 | ------------------------------------- 112 | Провести синтетический эксперимент с моделью вариационного автокодировщика в случае, если данные не из бернуливского распределения, а из нормального. В качестве данных использовать синтетическую выборку, которая состоит из нескольких кластеров в виде гаусиан (каждый кластер является множеством векторов из нормального распределения с парметрами mu, Sigma). В рамках эксперимента требуется исследовать: 113 | 114 | - зависимость качества востановления от размера скрытого представления; 115 | - зависимость качества востановления от размера исходного пространства; 116 | - зависимость качества востановления от отношения размера скрытого представления к исходном; 117 | - зависимость качества востановления от сложности модели нейросети. 118 | 119 | Все выводы должны быть представленны в формате tensorboard (каждый набор параметров, свой график, пример --- второй семинар). 120 | 121 | 122 | P.S. в рамках семинара мы востанавливали параметры бернуливского распределения, так как изображение это числа от 0 до 1 --- вероятности бернуливской случайной величины. Теперь требуется, чтобы модель decoder востанаввливала параметры нормального случайного вектора. 123 | 124 | P.S.S. в качестве модели encoder и decoder можно выбирать любую архитектуру нейросети. 125 | 126 | Задача 5. Генерация аннотации к изображению 127 | ------------------------------------------- 128 | Требуется построить модель генерации описания изображения по изображению. В качестве выборки рассматривается подвыборка вывборки `COCO `_. Требуется в качестве модели encoder использовать предобученую модель resnet152 без последнего слоя (по аналогии с `16-м семинаром `_), в качестве модели decoder обучить LSTM модель. 129 | 130 | Все выводы должны быть представленны в формате tensorboard (показать, как менялись описания одного и того же изображения при обучении модели, а также график качества в зависимости от итерации). 131 | 132 | 133 | P.S. Может быть полезным `код `_. 134 | 135 | P.S.S Рекомендуется взять подвыборку общей выборки из сайта COCO. 136 | -------------------------------------------------------------------------------- /hometask/task2-2/README.rst: -------------------------------------------------------------------------------- 1 | #################### 2 | Домашнее задание 2-2 3 | #################### 4 | 5 | Описание 6 | ======== 7 | 8 | В рамках данного задания требуется выполнить 4 задачи. Каждая задача должна быть оформлена в виде отдельного task{1,2,3,4,5}.ipynb файла и tensorboard{1,2,3,4,5}.zip файла. 9 | В каждом файле *.ipynb должно быть: 10 | 11 | - построение архитектуры; 12 | - выполнен процесс обучения; 13 | - показан пример работы модели до обучения и после; 14 | 15 | Файл .zip должен содержать результаты эксперимента в формате tensorboard для каждой из задач: 16 | 17 | - для каждого набора параметров свой график зависимости качества от обучения (если требуется в задаче); 18 | - примеры работы модели в процессе обучения модели. 19 | 20 | Для каждой задачи должны быть представлены выводы: 21 | 22 | - какой результат ожидали; 23 | - какой не ожидали; 24 | - что было не ясно. 25 | 26 | Код и эксперимент должен быть понятным внешнему читателю: 27 | 28 | - В коде должны быть коментарии; 29 | - Названия переменных должно быть интерпретируемые. 30 | 31 | P.S. Рекомендуется все вычисления проводить на google colab в режиме cuda. 32 | 33 | P.S.S. Рекомендуется использовать backup моделей при обучении на google drive. 34 | 35 | Задачи 36 | ====== 37 | 38 | Задача 1. Распознавания именованных сущностей на основе fasttext 39 | ---------------------------------------------------------------- 40 | 41 | Построить модель расспознавания именованных сущностей на русском языке. В качестве данных использовать выборку NERUS (NER). 42 | 43 | - В качестве векторного представления токенов использовать fasttext модель; 44 | - В качестве модели использовать модель LSTM; 45 | - Архитектуру LSTM можно выбрать произвольным образом; 46 | - Весь процесс обучения должен быть визуализирован в tensorboard (метрики качества и пример предсказания) 47 | 48 | P.S. Выборку можно взять из `github `_. 49 | 50 | P.S.S. Для экономинии памяти компютера предлагается воспользоваться сжатием модели fasttext с 300-мерного к 100-мерному (на колаб не хватит оперативки на сжатие до 100-мерного вектора, поэтому работайте сразу с 300-мерными в VEC формате). А также использовать выполнить переопределения модели fasttext в VEC модель (см. sem-17). 51 | 52 | Задача 2. Классификация даты документа 53 | -------------------------------------- 54 | 55 | Построить модель для классификации даты (года) публикации новостной заметки из выборки lenta.ru. 56 | 57 | - В качестве векторного представления текста рассмотреть тематический вектор. 58 | - В качестве классификатора использовать любой классификатор на ваш выбор. 59 | - Проанализировать качество классификации в зависимости от добавленных модальностей. 60 | - Провести эксперимент по добавлению регуляризаторов. 61 | - Провести анализ классификации модальности(год рассмотреть как модальность) при помощи встроенных методов bigartm. 62 | 63 | P.S. Выборку можно взять из sem-19. Времено не работает ссылка из семинара, используйте ссылку в `яндексе `_. 64 | 65 | Задача 3. Posterior Sampling в задаче RL 66 | ---------------------------------------- 67 | 68 | Большая задача на разбор `статьи `_. Требуется решить проблемы "Задачи о заплыве" связанные с тем, что алгоритм не доходит до левого края и начинает всегда скатываться по течению. 69 | 70 | P.S. Реализируйте метод Posterior Sampling из статьи. 71 | 72 | P.S.S. Рекомендую посмотреть часть семинара sem-25 связаной с данной проблемой. 73 | 74 | Задача 4. Детекция машинной генерации 75 | ---------------------------------------- 76 | 77 | Требуется построить базовый классификатор машинносгенерированных текстов. Современные методы генерации текстов позволяют генерировать тест, которые трудно отличимы от человеских текстов. В рамках данного задания предлагается реализовать простой метод детекции на базе моделей кодировщика трансформера. В качестве базовых статей предлагается использовать работы (реализовать любую из моделей классификации, указанных в данных работах): 78 | 79 | - G.M. Gritsay, A. V. Grabovoy, A. S. Kildyakov, and Yu V. Chekhovich. Artificially generated text fragments search in academic documents. Doklady Mathematics, 2024. 80 | - German Gritsay, Andrey Grabovoy, Alexander Kildyakov, and Yury Chekhovich. Automated text identification: Multilingual transformer-based models approach. In Proceedings of the Iberian Languages Evaluation Forum (IberLEF 2023) co-located with the Conference of the Spanish Society for Natural Language Processing (SEPLN 2023), volume 3496 of CEUR Workshop Proceedings, CEUR-WS.org, 2023. 81 | - German Gritsay, Andrey Grabovoy, and Yury Chekhovich. Automatic detection of machine generated texts: Need more tokens. In Ivannikov Memorial Workshop Proceedings 2022, 2022. 82 | 83 | Выборки для обучения и тестирования предлагается использовать с соревнования SemEval 2024 (https://github.com/mbzuai-nlp/SemEval2024-task8). В рамках конкурса рассматривались 3 типа задачи: бинарной классификации (machine vs human), мультиклассовой классификации (generative model classification), детекция машинносгенерированного фрагмента в тексте. Данные задачи идут в порядке увеличения сложности, предлагается решать именно как задачу бинарной классификации, но в целом можно решать любую из представленных 3х подзадач. 84 | 85 | P.S. при проблемах с доступами к статьям, можно написать на почту за исходниками. 86 | -------------------------------------------------------------------------------- /sem1/data/iris.csv: -------------------------------------------------------------------------------- 1 | 5.1,3.5,1.4,0.2,Iris-setosa 2 | 4.9,3.0,1.4,0.2,Iris-setosa 3 | 4.7,3.2,1.3,0.2,Iris-setosa 4 | 4.6,3.1,1.5,0.2,Iris-setosa 5 | 5.0,3.6,1.4,0.2,Iris-setosa 6 | 5.4,3.9,1.7,0.4,Iris-setosa 7 | 4.6,3.4,1.4,0.3,Iris-setosa 8 | 5.0,3.4,1.5,0.2,Iris-setosa 9 | 4.4,2.9,1.4,0.2,Iris-setosa 10 | 4.9,3.1,1.5,0.1,Iris-setosa 11 | 5.4,3.7,1.5,0.2,Iris-setosa 12 | 4.8,3.4,1.6,0.2,Iris-setosa 13 | 4.8,3.0,1.4,0.1,Iris-setosa 14 | 4.3,3.0,1.1,0.1,Iris-setosa 15 | 5.8,4.0,1.2,0.2,Iris-setosa 16 | 5.7,4.4,1.5,0.4,Iris-setosa 17 | 5.4,3.9,1.3,0.4,Iris-setosa 18 | 5.1,3.5,1.4,0.3,Iris-setosa 19 | 5.7,3.8,1.7,0.3,Iris-setosa 20 | 5.1,3.8,1.5,0.3,Iris-setosa 21 | 5.4,3.4,1.7,0.2,Iris-setosa 22 | 5.1,3.7,1.5,0.4,Iris-setosa 23 | 4.6,3.6,1.0,0.2,Iris-setosa 24 | 5.1,3.3,1.7,0.5,Iris-setosa 25 | 4.8,3.4,1.9,0.2,Iris-setosa 26 | 5.0,3.0,1.6,0.2,Iris-setosa 27 | 5.0,3.4,1.6,0.4,Iris-setosa 28 | 5.2,3.5,1.5,0.2,Iris-setosa 29 | 5.2,3.4,1.4,0.2,Iris-setosa 30 | 4.7,3.2,1.6,0.2,Iris-setosa 31 | 4.8,3.1,1.6,0.2,Iris-setosa 32 | 5.4,3.4,1.5,0.4,Iris-setosa 33 | 5.2,4.1,1.5,0.1,Iris-setosa 34 | 5.5,4.2,1.4,0.2,Iris-setosa 35 | 4.9,3.1,1.5,0.1,Iris-setosa 36 | 5.0,3.2,1.2,0.2,Iris-setosa 37 | 5.5,3.5,1.3,0.2,Iris-setosa 38 | 4.9,3.1,1.5,0.1,Iris-setosa 39 | 4.4,3.0,1.3,0.2,Iris-setosa 40 | 5.1,3.4,1.5,0.2,Iris-setosa 41 | 5.0,3.5,1.3,0.3,Iris-setosa 42 | 4.5,2.3,1.3,0.3,Iris-setosa 43 | 4.4,3.2,1.3,0.2,Iris-setosa 44 | 5.0,3.5,1.6,0.6,Iris-setosa 45 | 5.1,3.8,1.9,0.4,Iris-setosa 46 | 4.8,3.0,1.4,0.3,Iris-setosa 47 | 5.1,3.8,1.6,0.2,Iris-setosa 48 | 4.6,3.2,1.4,0.2,Iris-setosa 49 | 5.3,3.7,1.5,0.2,Iris-setosa 50 | 5.0,3.3,1.4,0.2,Iris-setosa 51 | 7.0,3.2,4.7,1.4,Iris-versicolor 52 | 6.4,3.2,4.5,1.5,Iris-versicolor 53 | 6.9,3.1,4.9,1.5,Iris-versicolor 54 | 5.5,2.3,4.0,1.3,Iris-versicolor 55 | 6.5,2.8,4.6,1.5,Iris-versicolor 56 | 5.7,2.8,4.5,1.3,Iris-versicolor 57 | 6.3,3.3,4.7,1.6,Iris-versicolor 58 | 4.9,2.4,3.3,1.0,Iris-versicolor 59 | 6.6,2.9,4.6,1.3,Iris-versicolor 60 | 5.2,2.7,3.9,1.4,Iris-versicolor 61 | 5.0,2.0,3.5,1.0,Iris-versicolor 62 | 5.9,3.0,4.2,1.5,Iris-versicolor 63 | 6.0,2.2,4.0,1.0,Iris-versicolor 64 | 6.1,2.9,4.7,1.4,Iris-versicolor 65 | 5.6,2.9,3.6,1.3,Iris-versicolor 66 | 6.7,3.1,4.4,1.4,Iris-versicolor 67 | 5.6,3.0,4.5,1.5,Iris-versicolor 68 | 5.8,2.7,4.1,1.0,Iris-versicolor 69 | 6.2,2.2,4.5,1.5,Iris-versicolor 70 | 5.6,2.5,3.9,1.1,Iris-versicolor 71 | 5.9,3.2,4.8,1.8,Iris-versicolor 72 | 6.1,2.8,4.0,1.3,Iris-versicolor 73 | 6.3,2.5,4.9,1.5,Iris-versicolor 74 | 6.1,2.8,4.7,1.2,Iris-versicolor 75 | 6.4,2.9,4.3,1.3,Iris-versicolor 76 | 6.6,3.0,4.4,1.4,Iris-versicolor 77 | 6.8,2.8,4.8,1.4,Iris-versicolor 78 | 6.7,3.0,5.0,1.7,Iris-versicolor 79 | 6.0,2.9,4.5,1.5,Iris-versicolor 80 | 5.7,2.6,3.5,1.0,Iris-versicolor 81 | 5.5,2.4,3.8,1.1,Iris-versicolor 82 | 5.5,2.4,3.7,1.0,Iris-versicolor 83 | 5.8,2.7,3.9,1.2,Iris-versicolor 84 | 6.0,2.7,5.1,1.6,Iris-versicolor 85 | 5.4,3.0,4.5,1.5,Iris-versicolor 86 | 6.0,3.4,4.5,1.6,Iris-versicolor 87 | 6.7,3.1,4.7,1.5,Iris-versicolor 88 | 6.3,2.3,4.4,1.3,Iris-versicolor 89 | 5.6,3.0,4.1,1.3,Iris-versicolor 90 | 5.5,2.5,4.0,1.3,Iris-versicolor 91 | 5.5,2.6,4.4,1.2,Iris-versicolor 92 | 6.1,3.0,4.6,1.4,Iris-versicolor 93 | 5.8,2.6,4.0,1.2,Iris-versicolor 94 | 5.0,2.3,3.3,1.0,Iris-versicolor 95 | 5.6,2.7,4.2,1.3,Iris-versicolor 96 | 5.7,3.0,4.2,1.2,Iris-versicolor 97 | 5.7,2.9,4.2,1.3,Iris-versicolor 98 | 6.2,2.9,4.3,1.3,Iris-versicolor 99 | 5.1,2.5,3.0,1.1,Iris-versicolor 100 | 5.7,2.8,4.1,1.3,Iris-versicolor 101 | 6.3,3.3,6.0,2.5,Iris-virginica 102 | 5.8,2.7,5.1,1.9,Iris-virginica 103 | 7.1,3.0,5.9,2.1,Iris-virginica 104 | 6.3,2.9,5.6,1.8,Iris-virginica 105 | 6.5,3.0,5.8,2.2,Iris-virginica 106 | 7.6,3.0,6.6,2.1,Iris-virginica 107 | 4.9,2.5,4.5,1.7,Iris-virginica 108 | 7.3,2.9,6.3,1.8,Iris-virginica 109 | 6.7,2.5,5.8,1.8,Iris-virginica 110 | 7.2,3.6,6.1,2.5,Iris-virginica 111 | 6.5,3.2,5.1,2.0,Iris-virginica 112 | 6.4,2.7,5.3,1.9,Iris-virginica 113 | 6.8,3.0,5.5,2.1,Iris-virginica 114 | 5.7,2.5,5.0,2.0,Iris-virginica 115 | 5.8,2.8,5.1,2.4,Iris-virginica 116 | 6.4,3.2,5.3,2.3,Iris-virginica 117 | 6.5,3.0,5.5,1.8,Iris-virginica 118 | 7.7,3.8,6.7,2.2,Iris-virginica 119 | 7.7,2.6,6.9,2.3,Iris-virginica 120 | 6.0,2.2,5.0,1.5,Iris-virginica 121 | 6.9,3.2,5.7,2.3,Iris-virginica 122 | 5.6,2.8,4.9,2.0,Iris-virginica 123 | 7.7,2.8,6.7,2.0,Iris-virginica 124 | 6.3,2.7,4.9,1.8,Iris-virginica 125 | 6.7,3.3,5.7,2.1,Iris-virginica 126 | 7.2,3.2,6.0,1.8,Iris-virginica 127 | 6.2,2.8,4.8,1.8,Iris-virginica 128 | 6.1,3.0,4.9,1.8,Iris-virginica 129 | 6.4,2.8,5.6,2.1,Iris-virginica 130 | 7.2,3.0,5.8,1.6,Iris-virginica 131 | 7.4,2.8,6.1,1.9,Iris-virginica 132 | 7.9,3.8,6.4,2.0,Iris-virginica 133 | 6.4,2.8,5.6,2.2,Iris-virginica 134 | 6.3,2.8,5.1,1.5,Iris-virginica 135 | 6.1,2.6,5.6,1.4,Iris-virginica 136 | 7.7,3.0,6.1,2.3,Iris-virginica 137 | 6.3,3.4,5.6,2.4,Iris-virginica 138 | 6.4,3.1,5.5,1.8,Iris-virginica 139 | 6.0,3.0,4.8,1.8,Iris-virginica 140 | 6.9,3.1,5.4,2.1,Iris-virginica 141 | 6.7,3.1,5.6,2.4,Iris-virginica 142 | 6.9,3.1,5.1,2.3,Iris-virginica 143 | 5.8,2.7,5.1,1.9,Iris-virginica 144 | 6.8,3.2,5.9,2.3,Iris-virginica 145 | 6.7,3.3,5.7,2.5,Iris-virginica 146 | 6.7,3.0,5.2,2.3,Iris-virginica 147 | 6.3,2.5,5.0,1.9,Iris-virginica 148 | 6.5,3.0,5.2,2.0,Iris-virginica 149 | 6.2,3.4,5.4,2.3,Iris-virginica 150 | 5.9,3.0,5.1,1.8,Iris-virginica 151 | 152 | -------------------------------------------------------------------------------- /sem1/requirements.txt: -------------------------------------------------------------------------------- 1 | numpy>=1.18.5 2 | pandas>=1.0.5 3 | seaborn>=0.9.0 4 | matplotlib>=2.1.0 5 | scikit-learn>=0.23.2 6 | -------------------------------------------------------------------------------- /sem12/main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "id": "vzOavFVJteMB", 7 | "slideshow": { 8 | "slide_type": "slide" 9 | } 10 | }, 11 | "source": [ 12 | "# Композиции классификаторов (градиентный бустинг)" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": null, 18 | "metadata": { 19 | "id": "UCn8xDPhteMB", 20 | "slideshow": { 21 | "slide_type": "skip" 22 | } 23 | }, 24 | "outputs": [], 25 | "source": [ 26 | "import warnings\n", 27 | "warnings.filterwarnings(\"ignore\")\n", 28 | "\n", 29 | "!pip install catboost\n", 30 | "!pip install lightgbm" 31 | ] 32 | }, 33 | { 34 | "cell_type": "markdown", 35 | "metadata": { 36 | "id": "s3qWY0M5LA6r", 37 | "slideshow": { 38 | "slide_type": "slide" 39 | } 40 | }, 41 | "source": [ 42 | "## Библиотеки" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 2, 48 | "metadata": { 49 | "id": "K2_VhyWeteMB", 50 | "slideshow": { 51 | "slide_type": "subslide" 52 | } 53 | }, 54 | "outputs": [], 55 | "source": [ 56 | "import matplotlib.pyplot as plt\n", 57 | "from matplotlib.image import imread\n", 58 | "from mpl_toolkits import mplot3d\n", 59 | "from copy import deepcopy\n", 60 | "from mlxtend.plotting import plot_decision_regions\n", 61 | "import seaborn as sns\n", 62 | "import pandas as pd\n", 63 | "from tqdm.notebook import tqdm\n", 64 | "from scipy.spatial.distance import cdist\n", 65 | "import numpy as np\n", 66 | "from sklearn import tree, base\n", 67 | "import itertools\n", 68 | "from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor\n", 69 | "from sklearn.ensemble import (RandomForestClassifier, AdaBoostClassifier, \n", 70 | " GradientBoostingClassifier, BaggingClassifier)\n", 71 | "from sklearn.svm import SVC, SVR\n", 72 | "from sklearn.linear_model import LogisticRegression, LinearRegression\n", 73 | "from sklearn.metrics import classification_report, roc_auc_score, roc_curve\n", 74 | "from sklearn.model_selection import KFold, ParameterGrid\n", 75 | "from sklearn.model_selection import cross_val_score, RepeatedStratifiedKFold, RepeatedKFold\n", 76 | "from sklearn.datasets import make_classification, make_regression, load_wine, load_boston\n", 77 | "from sklearn.model_selection import train_test_split\n", 78 | "from sklearn.decomposition import PCA\n", 79 | "from torchvision import datasets, transforms\n", 80 | "import torch\n", 81 | "\n", 82 | "import xgboost as xgb\n", 83 | "from catboost import CatBoostClassifier\n", 84 | "import lightgbm as lgb" 85 | ] 86 | }, 87 | { 88 | "cell_type": "markdown", 89 | "metadata": { 90 | "id": "vqhbF2bhteMB", 91 | "slideshow": { 92 | "slide_type": "slide" 93 | } 94 | }, 95 | "source": [ 96 | "## ComBoost" 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": { 102 | "id": "gd9uoXmriG-D", 103 | "slideshow": { 104 | "slide_type": "subslide" 105 | } 106 | }, 107 | "source": [ 108 | "Рассмотрим следующее ансамблирование ответов:\n", 109 | "$$\n", 110 | "b(x) = \\frac{1}{T}\\sum_{t=1}^{T} b_t(x)\n", 111 | "$$\n", 112 | "\n", 113 | "Рассмотрим отступ объектов:\n", 114 | "$$\n", 115 | "M(x) = \\Gamma_y\\bigr(x\\bigr) - \\max_{y} \\Gamma_y\\bigr(x\\bigr)\n", 116 | "$$\n", 117 | "\n", 118 | "Идея в том, что каждый $b_t$ компенсирует ошибки ансамбля, состоящего из всех предыдущих моделей:\n", 119 | "$$\n", 120 | "Q\\bigr(b_t, U_t\\bigr) = \\sum_{x \\in U_t}\\left[M(x) < 0\\right] \\to \\min_{b_t},\n", 121 | "$$\n", 122 | "$$\n", 123 | "U_t = \\left\\{x| M_l < M_{t-1}(x) < M_g\\right\\}.\n", 124 | "$$\n" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 3, 130 | "metadata": { 131 | "id": "beirFGPXteMB", 132 | "slideshow": { 133 | "slide_type": "skip" 134 | } 135 | }, 136 | "outputs": [], 137 | "source": [ 138 | "class ComBoost(object):\n", 139 | " def __init__(self, base_estimator=None, n_estimators=10):\n", 140 | " self.n_estimators = n_estimators\n", 141 | " self.base_estimator = DecisionTreeClassifier(max_depth=1)\n", 142 | " if base_estimator:\n", 143 | " self.base_estimator = base_estimator\n", 144 | " self.b = [base.clone(self.base_estimator) for _ in range(self.n_estimators)]\n", 145 | " \n", 146 | " def get_params(self, deep=True):\n", 147 | " return {'n_estimators': self.n_estimators, \n", 148 | " 'base_estimator': self.base_estimator}\n", 149 | "\n", 150 | " @staticmethod\n", 151 | " def fix_predict_proba(pred, b, b0):\n", 152 | " new_pred = np.zeros((len(pred), len(b0.classes_)))\n", 153 | " for i, cl in enumerate(b.classes_):\n", 154 | " new_pred[:, cl] = pred[:, i]\n", 155 | " return new_pred\n", 156 | " \n", 157 | " def fit(self, X, Y, l0=0, l1=100, l2=None, dl=100):\n", 158 | " def margin(pr, y):\n", 159 | " cop = pr.copy()\n", 160 | " cop[y] = -1\n", 161 | " return pr[y] - cop.max()\n", 162 | " \n", 163 | " if l2 is None:\n", 164 | " l2 = len(X)\n", 165 | " \n", 166 | " for t, b in enumerate(self.b):\n", 167 | " if t == 0:\n", 168 | " b.fit(X, Y)\n", 169 | " pred = b.predict_proba(X)\n", 170 | " M = np.array([margin(pred[i], Y[i]) for i in range(len(Y))])\n", 171 | " else:\n", 172 | " indexes = sorted(np.arange(0, len(X)), key = lambda i: M[i])\n", 173 | " X_new = X[indexes]\n", 174 | " Y_new = Y[indexes]\n", 175 | " dict_of_param = []\n", 176 | " for k in range(l1, l2, dl):\n", 177 | " new_item = {'l0': l0, \n", 178 | " 'k': k}\n", 179 | " \n", 180 | " local_b = base.clone(self.base_estimator)\n", 181 | " local_b.fit(X_new[l0:k], Y_new[l0:k])\n", 182 | " \n", 183 | " pred = self.fix_predict_proba(local_b.predict_proba(X), local_b, self.b[0])\n", 184 | " M_new = np.array([margin(pred[i], Y[i]) for i in range(len(Y))])\n", 185 | " \n", 186 | " new_item['Q'] = (M+M_new < 0).sum()\n", 187 | " dict_of_param.append(new_item)\n", 188 | " \n", 189 | " element = sorted(dict_of_param, key=lambda x: x['Q'])[0]\n", 190 | " b.fit(X_new[element['l0']:element['k']], \n", 191 | " Y_new[element['l0']:element['k']])\n", 192 | " \n", 193 | " pred = self.fix_predict_proba(b.predict_proba(X), local_b, self.b[0])\n", 194 | " M = M + np.array([margin(pred[i], Y[i]) for i in range(len(Y))])\n", 195 | " \n", 196 | " \n", 197 | " def predict(self, X):\n", 198 | " probas = self.predict_proba(X)\n", 199 | " return np.argmax(probas, axis=1)\n", 200 | " \n", 201 | " def predict_proba(self, X):\n", 202 | " return np.mean([self.fix_predict_proba(elem.predict_proba(X), elem, self.b[0]) for elem in self.b], axis=0)" 203 | ] 204 | }, 205 | { 206 | "cell_type": "markdown", 207 | "metadata": { 208 | "id": "zTd5BOnViG-D", 209 | "slideshow": { 210 | "slide_type": "subslide" 211 | } 212 | }, 213 | "source": [ 214 | "### Пример использования\n", 215 | "\n", 216 | "Данный метод позволяет строить ансамли для произвольных базовых функций. Далее приводится пример:\n", 217 | "- Решающего дерева\n", 218 | "- SVM\n", 219 | "- Логистической регресии" 220 | ] 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": 4, 225 | "metadata": { 226 | "colab": { 227 | "base_uri": "https://localhost:8080/" 228 | }, 229 | "id": "NmrGEYhliG-D", 230 | "outputId": "b5423bef-0498-4109-e12b-6ef52f44219a", 231 | "slideshow": { 232 | "slide_type": "subslide" 233 | } 234 | }, 235 | "outputs": [ 236 | { 237 | "name": "stdout", 238 | "output_type": "stream", 239 | "text": [ 240 | "SCORE: 0.704 (0.049)\n" 241 | ] 242 | } 243 | ], 244 | "source": [ 245 | "X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)\n", 246 | "model = DecisionTreeClassifier(max_depth=2)\n", 247 | "\n", 248 | "cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 249 | "n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')\n", 250 | "print('SCORE: %.3f (%.3f)' % (np.mean(n_scores), np.std(n_scores)))" 251 | ] 252 | }, 253 | { 254 | "cell_type": "code", 255 | "execution_count": 5, 256 | "metadata": { 257 | "colab": { 258 | "base_uri": "https://localhost:8080/" 259 | }, 260 | "id": "cT-L6N5OteMC", 261 | "outputId": "982a1f16-bf59-495a-b24b-d42020bcba18", 262 | "slideshow": { 263 | "slide_type": "subslide" 264 | } 265 | }, 266 | "outputs": [ 267 | { 268 | "name": "stdout", 269 | "output_type": "stream", 270 | "text": [ 271 | "SCORE: 0.81 (0.03)\n" 272 | ] 273 | } 274 | ], 275 | "source": [ 276 | "X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)\n", 277 | "model = ComBoost(DecisionTreeClassifier(max_depth=2))\n", 278 | "\n", 279 | "cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 280 | "n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')\n", 281 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": 6, 287 | "metadata": { 288 | "colab": { 289 | "base_uri": "https://localhost:8080/" 290 | }, 291 | "id": "FwA_NVz5iG-D", 292 | "outputId": "f084ccb3-f6c2-494b-e287-223291c02482", 293 | "slideshow": { 294 | "slide_type": "subslide" 295 | } 296 | }, 297 | "outputs": [ 298 | { 299 | "name": "stdout", 300 | "output_type": "stream", 301 | "text": [ 302 | "SCORE: 0.94 (0.02)\n" 303 | ] 304 | } 305 | ], 306 | "source": [ 307 | "X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)\n", 308 | "model = SVC(probability=True)\n", 309 | "\n", 310 | "cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 311 | "n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')\n", 312 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 313 | ] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "execution_count": 7, 318 | "metadata": { 319 | "colab": { 320 | "base_uri": "https://localhost:8080/" 321 | }, 322 | "id": "lLmBqjS9teMC", 323 | "outputId": "6e9cdc48-5de0-4cf6-b061-79401a1cc402", 324 | "slideshow": { 325 | "slide_type": "subslide" 326 | } 327 | }, 328 | "outputs": [ 329 | { 330 | "name": "stdout", 331 | "output_type": "stream", 332 | "text": [ 333 | "SCORE: 0.95 (0.02)\n" 334 | ] 335 | } 336 | ], 337 | "source": [ 338 | "X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)\n", 339 | "model = ComBoost(SVC(probability=True))\n", 340 | "\n", 341 | "cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 342 | "n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')\n", 343 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 344 | ] 345 | }, 346 | { 347 | "cell_type": "code", 348 | "execution_count": 8, 349 | "metadata": { 350 | "colab": { 351 | "base_uri": "https://localhost:8080/" 352 | }, 353 | "id": "7HV18A4kiG-E", 354 | "outputId": "77dcb2e0-9eea-4471-a608-d732acc9a39a", 355 | "slideshow": { 356 | "slide_type": "subslide" 357 | } 358 | }, 359 | "outputs": [ 360 | { 361 | "name": "stdout", 362 | "output_type": "stream", 363 | "text": [ 364 | "SCORE: 0.80 (0.03)\n" 365 | ] 366 | } 367 | ], 368 | "source": [ 369 | "X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)\n", 370 | "model = LogisticRegression()\n", 371 | "\n", 372 | "cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 373 | "n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')\n", 374 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 375 | ] 376 | }, 377 | { 378 | "cell_type": "code", 379 | "execution_count": 9, 380 | "metadata": { 381 | "colab": { 382 | "base_uri": "https://localhost:8080/" 383 | }, 384 | "id": "cjZQNVGIteMC", 385 | "outputId": "c4f754e1-5704-464f-f58f-dd1fcbcc56e3", 386 | "slideshow": { 387 | "slide_type": "subslide" 388 | } 389 | }, 390 | "outputs": [ 391 | { 392 | "name": "stdout", 393 | "output_type": "stream", 394 | "text": [ 395 | "SCORE: 0.80 (0.03)\n" 396 | ] 397 | } 398 | ], 399 | "source": [ 400 | "X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)\n", 401 | "model = ComBoost(LogisticRegression())\n", 402 | "\n", 403 | "cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 404 | "n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')\n", 405 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 406 | ] 407 | }, 408 | { 409 | "cell_type": "markdown", 410 | "metadata": { 411 | "id": "Q9U6IpKqiG-E", 412 | "slideshow": { 413 | "slide_type": "subslide" 414 | } 415 | }, 416 | "source": [ 417 | "### Выводы\n", 418 | "Получаем, что ансамблирование не ухудшает качества на кроссвалидации. В случае простых моделей (дерево с ограниченной глубиной), качество улучшается значительно, а в случае сложны моделей (SVM) качество улучшается не значительно." 419 | ] 420 | }, 421 | { 422 | "cell_type": "markdown", 423 | "metadata": { 424 | "id": "MmhySFdjteMC", 425 | "slideshow": { 426 | "slide_type": "slide" 427 | } 428 | }, 429 | "source": [ 430 | "## Gradient Boosting" 431 | ] 432 | }, 433 | { 434 | "cell_type": "markdown", 435 | "metadata": { 436 | "id": "tunQC0X_iG-E", 437 | "slideshow": { 438 | "slide_type": "subslide" 439 | } 440 | }, 441 | "source": [ 442 | "Рассмотрим следующее ансамблирование ответов:\n", 443 | "$$\n", 444 | "b(x) = \\sum_{t=1}^{T} b_t(x)\n", 445 | "$$\n", 446 | "\n", 447 | "Рассмотрим среднеквадратичекое отклонение:\n", 448 | "$$\n", 449 | "L = \\sum_{i=1}^{l}\\left(b(x_i) - y_i\\right)^2\n", 450 | "$$\n", 451 | "\n", 452 | "Идея состоит в том, что каждая новая модель пытается аппроксимировать остатки которые оставили прошлые модели:\n", 453 | "$$\n", 454 | "L_t = \\sum_{i=1}^{l}\\left(b_t(x_i) - (y_i - \\sum_{j=1}^{t}b_j(x_i))\\right)^2 \\min_{b_t}\n", 455 | "$$" 456 | ] 457 | }, 458 | { 459 | "cell_type": "code", 460 | "execution_count": 10, 461 | "metadata": { 462 | "id": "hLC8MVOuteMC", 463 | "slideshow": { 464 | "slide_type": "subslide" 465 | } 466 | }, 467 | "outputs": [], 468 | "source": [ 469 | "class GradientBoostingRegression(object):\n", 470 | " def __init__(self, base_estimator=None, n_estimators=10):\n", 471 | " self.n_estimators = n_estimators\n", 472 | " self.base_estimator = DecisionTreeRegressor(max_depth=1)\n", 473 | " if base_estimator:\n", 474 | " self.base_estimator = base_estimator\n", 475 | " \n", 476 | " self.b = [base.clone(self.base_estimator) for _ in range(self.n_estimators)]\n", 477 | " \n", 478 | " def get_params(self, deep=True):\n", 479 | " return {'n_estimators': self.n_estimators, \n", 480 | " 'base_estimator': self.base_estimator}\n", 481 | " \n", 482 | " def score(self, X, Y):\n", 483 | " return ((self.predict(X) - Y)**2).mean()\n", 484 | " \n", 485 | " def fit(self, X, Y):\n", 486 | " residual = Y.copy()\n", 487 | " for t, b in enumerate(self.b):\n", 488 | " b.fit(X, residual)\n", 489 | " residual = residual - b.predict(X)\n", 490 | " \n", 491 | " def predict(self, X):\n", 492 | " return np.sum([elem.predict(X) for elem in self.b], axis=0)\n", 493 | " " 494 | ] 495 | }, 496 | { 497 | "cell_type": "markdown", 498 | "metadata": { 499 | "id": "Ov9tj-V0iG-E", 500 | "slideshow": { 501 | "slide_type": "subslide" 502 | } 503 | }, 504 | "source": [ 505 | "### Пример использования\n", 506 | "\n", 507 | "Данный метод позволяет строить ансамли для произвольных базовых функций. Далее приводится пример:\n", 508 | "- Решающего дерева\n", 509 | "- SVM\n", 510 | "- Линейная регресии" 511 | ] 512 | }, 513 | { 514 | "cell_type": "code", 515 | "execution_count": 11, 516 | "metadata": { 517 | "colab": { 518 | "base_uri": "https://localhost:8080/" 519 | }, 520 | "id": "dbmQUjEQiG-E", 521 | "outputId": "d20bd54e-dbdc-43a2-fd47-552f3ac0fedf", 522 | "slideshow": { 523 | "slide_type": "subslide" 524 | } 525 | }, 526 | "outputs": [ 527 | { 528 | "name": "stdout", 529 | "output_type": "stream", 530 | "text": [ 531 | "SCORE: 0.37 (0.08)\n" 532 | ] 533 | } 534 | ], 535 | "source": [ 536 | "X, y = make_regression(n_samples=1000, n_features=20, random_state=6)\n", 537 | "model = DecisionTreeRegressor(max_depth=2)\n", 538 | "\n", 539 | "cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 540 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 541 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 542 | ] 543 | }, 544 | { 545 | "cell_type": "code", 546 | "execution_count": 12, 547 | "metadata": { 548 | "colab": { 549 | "base_uri": "https://localhost:8080/" 550 | }, 551 | "id": "GqEYhEkNteMC", 552 | "outputId": "6d47739a-99db-4829-cdb2-81404065899a", 553 | "slideshow": { 554 | "slide_type": "subslide" 555 | } 556 | }, 557 | "outputs": [ 558 | { 559 | "name": "stdout", 560 | "output_type": "stream", 561 | "text": [ 562 | "SCORE: 5392.99 (837.37)\n" 563 | ] 564 | } 565 | ], 566 | "source": [ 567 | "X, y = make_regression(n_samples=1000, n_features=20, random_state=6)\n", 568 | "model = GradientBoostingRegression(DecisionTreeRegressor(max_depth=2))\n", 569 | "\n", 570 | "cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 571 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 572 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 573 | ] 574 | }, 575 | { 576 | "cell_type": "code", 577 | "execution_count": 13, 578 | "metadata": { 579 | "colab": { 580 | "base_uri": "https://localhost:8080/" 581 | }, 582 | "id": "79A8FivWiG-E", 583 | "outputId": "575615a2-e4be-4774-b182-96db930e47ce", 584 | "slideshow": { 585 | "slide_type": "subslide" 586 | } 587 | }, 588 | "outputs": [ 589 | { 590 | "name": "stdout", 591 | "output_type": "stream", 592 | "text": [ 593 | "SCORE: 0.11 (0.01)\n" 594 | ] 595 | } 596 | ], 597 | "source": [ 598 | "X, y = make_regression(n_samples=1000, n_features=20, random_state=6)\n", 599 | "model = SVR()\n", 600 | "\n", 601 | "cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 602 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 603 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 604 | ] 605 | }, 606 | { 607 | "cell_type": "code", 608 | "execution_count": 14, 609 | "metadata": { 610 | "colab": { 611 | "base_uri": "https://localhost:8080/" 612 | }, 613 | "id": "93SBWXASteMD", 614 | "outputId": "2230f693-24a3-4f1c-9813-2b98168f9a22", 615 | "slideshow": { 616 | "slide_type": "subslide" 617 | } 618 | }, 619 | "outputs": [ 620 | { 621 | "name": "stdout", 622 | "output_type": "stream", 623 | "text": [ 624 | "SCORE: 5340.38 (1169.58)\n" 625 | ] 626 | } 627 | ], 628 | "source": [ 629 | "X, y = make_regression(n_samples=1000, n_features=20, random_state=6)\n", 630 | "model = GradientBoostingRegression(SVR())\n", 631 | "\n", 632 | "cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 633 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 634 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 635 | ] 636 | }, 637 | { 638 | "cell_type": "code", 639 | "execution_count": 15, 640 | "metadata": { 641 | "colab": { 642 | "base_uri": "https://localhost:8080/" 643 | }, 644 | "id": "lEV6CIwfiG-E", 645 | "outputId": "348934ed-9e2c-4d39-a861-2f25b629d980", 646 | "slideshow": { 647 | "slide_type": "subslide" 648 | } 649 | }, 650 | "outputs": [ 651 | { 652 | "name": "stdout", 653 | "output_type": "stream", 654 | "text": [ 655 | "SCORE: 1.00 (0.00)\n" 656 | ] 657 | } 658 | ], 659 | "source": [ 660 | "X, y = make_regression(n_samples=1000, n_features=20, random_state=6)\n", 661 | "model = SVR(kernel='linear')\n", 662 | "\n", 663 | "cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 664 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 665 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 666 | ] 667 | }, 668 | { 669 | "cell_type": "code", 670 | "execution_count": 16, 671 | "metadata": { 672 | "colab": { 673 | "base_uri": "https://localhost:8080/" 674 | }, 675 | "id": "0PnBbGcxteMD", 676 | "outputId": "3e10a70d-ecd9-4388-d9ed-f0d603c13895", 677 | "slideshow": { 678 | "slide_type": "subslide" 679 | } 680 | }, 681 | "outputs": [ 682 | { 683 | "name": "stdout", 684 | "output_type": "stream", 685 | "text": [ 686 | "SCORE: 0.00 (0.00)\n" 687 | ] 688 | } 689 | ], 690 | "source": [ 691 | "X, y = make_regression(n_samples=1000, n_features=20, random_state=6)\n", 692 | "model = GradientBoostingRegression(SVR(kernel='linear'))\n", 693 | "\n", 694 | "cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 695 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 696 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 697 | ] 698 | }, 699 | { 700 | "cell_type": "code", 701 | "execution_count": 17, 702 | "metadata": { 703 | "colab": { 704 | "base_uri": "https://localhost:8080/" 705 | }, 706 | "id": "6lF4uqhxiG-E", 707 | "outputId": "279ac90f-a622-4787-9dc9-1948e3c79bc8", 708 | "slideshow": { 709 | "slide_type": "subslide" 710 | } 711 | }, 712 | "outputs": [ 713 | { 714 | "name": "stdout", 715 | "output_type": "stream", 716 | "text": [ 717 | "SCORE: 1.00 (0.00)\n" 718 | ] 719 | } 720 | ], 721 | "source": [ 722 | "X, y = make_regression(n_samples=1000, n_features=20, random_state=6)\n", 723 | "model = LinearRegression()\n", 724 | "\n", 725 | "cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 726 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 727 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 728 | ] 729 | }, 730 | { 731 | "cell_type": "code", 732 | "execution_count": 18, 733 | "metadata": { 734 | "colab": { 735 | "base_uri": "https://localhost:8080/" 736 | }, 737 | "id": "UhYy17TTteMD", 738 | "outputId": "04dd6a4e-7dcf-48fa-d1c3-b8751955d03b", 739 | "slideshow": { 740 | "slide_type": "subslide" 741 | } 742 | }, 743 | "outputs": [ 744 | { 745 | "name": "stdout", 746 | "output_type": "stream", 747 | "text": [ 748 | "SCORE: 0.00 (0.00)\n" 749 | ] 750 | } 751 | ], 752 | "source": [ 753 | "X, y = make_regression(n_samples=1000, n_features=20, random_state=6)\n", 754 | "model = GradientBoostingRegression(LinearRegression())\n", 755 | "\n", 756 | "cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 757 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 758 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 759 | ] 760 | }, 761 | { 762 | "cell_type": "markdown", 763 | "metadata": { 764 | "id": "uubgZ13WiG-E", 765 | "slideshow": { 766 | "slide_type": "subslide" 767 | } 768 | }, 769 | "source": [ 770 | "### Вывод\n", 771 | "\n", 772 | "Качество очень сильно зависит от выбранной базовой функции" 773 | ] 774 | }, 775 | { 776 | "cell_type": "markdown", 777 | "metadata": { 778 | "id": "nrFZTB31teMD", 779 | "slideshow": { 780 | "slide_type": "slide" 781 | } 782 | }, 783 | "source": [ 784 | "## XGBoost" 785 | ] 786 | }, 787 | { 788 | "cell_type": "markdown", 789 | "metadata": { 790 | "id": "wCCwpr6xiG-E", 791 | "slideshow": { 792 | "slide_type": "subslide" 793 | } 794 | }, 795 | "source": [ 796 | "Пакет `xgboost` является один из библиотек для построения деревьев на основе градиентного бустинга. В основном все такие библиотеки работают только с решающими деревьями (ансамбли принято строить над деревьями), подробное описания модификации описано в [статье](https://www.kdd.org/kdd2016/papers/files/rfp0697-chenAemb.pdf).\n", 797 | "\n", 798 | "- Ускорение заключается в более оптимальном подборе порогов в каждой вершине дерева.\n", 799 | "- Модифицировали алгоритм для паралельного обучения деревьев (напомним, что классический бустинг не позволяет выполнять паралельную обработку).\n", 800 | "- Специальные инженерные трюки для сбалансированого использования кеша.\n", 801 | "\n", 802 | "Данный framework имеет следующие плюсы:\n", 803 | "- Хорошая документация.\n", 804 | "- Позволяет легко паралелить вычисления.\n", 805 | "- Легко использовать с `sklearn` и `numpy` (но с потерей производительности)\n", 806 | "\n", 807 | "Недостатки:\n", 808 | "- Нету поддержки GPU." 809 | ] 810 | }, 811 | { 812 | "cell_type": "code", 813 | "execution_count": 19, 814 | "metadata": { 815 | "colab": { 816 | "base_uri": "https://localhost:8080/" 817 | }, 818 | "id": "r4PnCcUkteMD", 819 | "outputId": "807a89c0-f477-448f-ac57-a5afe2074ba3", 820 | "slideshow": { 821 | "slide_type": "subslide" 822 | } 823 | }, 824 | "outputs": [ 825 | { 826 | "name": "stdout", 827 | "output_type": "stream", 828 | "text": [ 829 | "SCORE: 0.88 (0.03)\n" 830 | ] 831 | } 832 | ], 833 | "source": [ 834 | "X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)\n", 835 | "model = xgb.XGBClassifier(objective='binary:logistic', random_state=6)\n", 836 | "\n", 837 | "cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 838 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 839 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 840 | ] 841 | }, 842 | { 843 | "cell_type": "code", 844 | "execution_count": 20, 845 | "metadata": { 846 | "colab": { 847 | "base_uri": "https://localhost:8080/" 848 | }, 849 | "id": "vFLWA6VBteMD", 850 | "outputId": "634777ee-000b-44e1-fc88-207c710f00ef", 851 | "slideshow": { 852 | "slide_type": "subslide" 853 | } 854 | }, 855 | "outputs": [ 856 | { 857 | "name": "stdout", 858 | "output_type": "stream", 859 | "text": [ 860 | "SCORE: 0.93 (0.01)\n" 861 | ] 862 | } 863 | ], 864 | "source": [ 865 | "X, y = make_regression(n_samples=1000, n_features=20, random_state=6)\n", 866 | "model = xgb.XGBRegressor(objective='reg:squarederror', random_state=6)\n", 867 | "\n", 868 | "cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 869 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 870 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 871 | ] 872 | }, 873 | { 874 | "cell_type": "markdown", 875 | "metadata": { 876 | "id": "DH9UarKliG-F", 877 | "slideshow": { 878 | "slide_type": "slide" 879 | } 880 | }, 881 | "source": [ 882 | "## LightGBM" 883 | ] 884 | }, 885 | { 886 | "cell_type": "markdown", 887 | "metadata": { 888 | "id": "tjHhQjheiG-F", 889 | "slideshow": { 890 | "slide_type": "subslide" 891 | } 892 | }, 893 | "source": [ 894 | "Пакет `lightgbm` представлен Microsoft как реализация градиентного бустинга над деревьями. Работа с подробным описаниям введений описана [тут](https://papers.nips.cc/paper/2017/file/6449f44a102fde848669bdd9eb6b76fa-Paper.pdf).\n", 895 | "\n", 896 | "Сам метод модифицирует метод XGboost с дополнительной процедурой ресемплинга объектов для ускорения построения деревьев.\n", 897 | "\n", 898 | "\n", 899 | "Данный фраймворк имеет следующие положительные моменты:\n", 900 | "- Хорошая документация.\n", 901 | "- Имеется поддержка GPU.\n", 902 | "- Имеет поддержку категориальных признаков на основе метода Фишера, который описан [тут](https://lightgbm.readthedocs.io/en/latest/Features.html#optimal-split-for-categorical-features).\n", 903 | "\n", 904 | "Недостатки:\n", 905 | "- Сложно использовать с `numpy` и `sklearn` так как требует специфичного формата данных." 906 | ] 907 | }, 908 | { 909 | "cell_type": "code", 910 | "execution_count": 21, 911 | "metadata": { 912 | "colab": { 913 | "base_uri": "https://localhost:8080/" 914 | }, 915 | "id": "xrcLqutziG-F", 916 | "outputId": "47518693-311f-418c-c954-1e0817430fac", 917 | "slideshow": { 918 | "slide_type": "subslide" 919 | } 920 | }, 921 | "outputs": [ 922 | { 923 | "data": { 924 | "text/plain": [ 925 | "0.946" 926 | ] 927 | }, 928 | "execution_count": 21, 929 | "metadata": { 930 | "tags": [] 931 | }, 932 | "output_type": "execute_result" 933 | } 934 | ], 935 | "source": [ 936 | "X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)\n", 937 | "\n", 938 | "train_data = lgb.Dataset(X, label=y)\n", 939 | "param = {'num_leaves': 31, \n", 940 | " 'objective': 'multiclass', \n", 941 | " 'num_class': 2, \n", 942 | " 'metric': ['multi_logloss']}\n", 943 | "\n", 944 | "num_round = 10\n", 945 | "bst = lgb.train(param, train_data, num_boost_round=10)\n", 946 | "\n", 947 | "(bst.predict(X).argmax(axis=-1) == y).mean()" 948 | ] 949 | }, 950 | { 951 | "cell_type": "markdown", 952 | "metadata": { 953 | "id": "2QK6_SiPteMD", 954 | "slideshow": { 955 | "slide_type": "slide" 956 | } 957 | }, 958 | "source": [ 959 | "## CatBoost" 960 | ] 961 | }, 962 | { 963 | "cell_type": "markdown", 964 | "metadata": { 965 | "id": "4bqSCFb-iG-F", 966 | "slideshow": { 967 | "slide_type": "subslide" 968 | } 969 | }, 970 | "source": [ 971 | "Пакет `catboost` представлен Яндексом для построения ансамблей моделей на базе решающих деревьев. Подробное описание доступно в [работе](https://papers.nips.cc/paper/2018/file/14491b756b3a51daac41c24863285549-Paper.pdf).\n", 972 | "\n", 973 | "- Основной идеей и посылом для создания CatBoost была разработка метода работы с категориальными признаками (отсюда и названия).\n", 974 | "- В классическом машинном обучении принято категориальные признаки кодировать One-Hot векторами. В работе предлагался метод, который выделяет кластеры внутри категориального признака на основе предлагаемых в работе статистик.\n", 975 | "\n", 976 | "Данный framework имеет следующие плюсы:\n", 977 | "- Хорошая документация.\n", 978 | "- Позволяет легко паралелить вычисления на GPU.\n", 979 | "- Легко использовать с `sklearn` и `numpy` (но с потерей производительности).\n", 980 | "- Поддержка категориальных признаков (причем продвинутая, в отличии от простых методов Фишера).\n", 981 | "\n", 982 | "Недостатки:\n", 983 | "- Во многих задачах показывает себя хуже чем XGboost и LightGBM.\n", 984 | "- В статье показано, что данный метод работает лучше чем XGboost и LightGBM, но в реальных кейсах это не так..." 985 | ] 986 | }, 987 | { 988 | "cell_type": "code", 989 | "execution_count": 22, 990 | "metadata": { 991 | "colab": { 992 | "base_uri": "https://localhost:8080/" 993 | }, 994 | "id": "8H7GxrtHteMD", 995 | "outputId": "54dc17f9-18dc-425b-f215-dc63f9e92f03", 996 | "slideshow": { 997 | "slide_type": "subslide" 998 | } 999 | }, 1000 | "outputs": [ 1001 | { 1002 | "name": "stdout", 1003 | "output_type": "stream", 1004 | "text": [ 1005 | "SCORE: 0.75 (0.03)\n" 1006 | ] 1007 | } 1008 | ], 1009 | "source": [ 1010 | "X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)\n", 1011 | "\n", 1012 | "model = CatBoostClassifier(iterations=2,\n", 1013 | " depth=2,\n", 1014 | " learning_rate=1,\n", 1015 | " loss_function='Logloss',\n", 1016 | " verbose=True, task_type='CPU')\n", 1017 | "\n", 1018 | "cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 1019 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 1020 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 1021 | ] 1022 | }, 1023 | { 1024 | "cell_type": "code", 1025 | "execution_count": 24, 1026 | "metadata": { 1027 | "colab": { 1028 | "base_uri": "https://localhost:8080/" 1029 | }, 1030 | "id": "HcYKogs2tgxE", 1031 | "outputId": "18a17456-9fa3-4480-de76-28348bbb356f", 1032 | "slideshow": { 1033 | "slide_type": "subslide" 1034 | } 1035 | }, 1036 | "outputs": [ 1037 | { 1038 | "name": "stdout", 1039 | "output_type": "stream", 1040 | "text": [ 1041 | "SCORE: 0.73 (0.04)\n" 1042 | ] 1043 | } 1044 | ], 1045 | "source": [ 1046 | "X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)\n", 1047 | "\n", 1048 | "model = CatBoostClassifier(iterations=2,\n", 1049 | " depth=2,\n", 1050 | " learning_rate=1,\n", 1051 | " loss_function='Logloss',\n", 1052 | " verbose=True, task_type='GPU')\n", 1053 | "\n", 1054 | "cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)\n", 1055 | "n_scores = cross_val_score(model, X, y, cv=cv, n_jobs=-1)\n", 1056 | "print('SCORE: %.2f (%.2f)' % (np.mean(n_scores), np.std(n_scores)))" 1057 | ] 1058 | } 1059 | ], 1060 | "metadata": { 1061 | "accelerator": "GPU", 1062 | "celltoolbar": "Slideshow", 1063 | "colab": { 1064 | "name": "main.ipynb", 1065 | "provenance": [] 1066 | }, 1067 | "kernelspec": { 1068 | "display_name": "Python 3", 1069 | "language": "python", 1070 | "name": "python3" 1071 | }, 1072 | "language_info": { 1073 | "codemirror_mode": { 1074 | "name": "ipython", 1075 | "version": 3 1076 | }, 1077 | "file_extension": ".py", 1078 | "mimetype": "text/x-python", 1079 | "name": "python", 1080 | "nbconvert_exporter": "python", 1081 | "pygments_lexer": "ipython3", 1082 | "version": "3.7.3" 1083 | } 1084 | }, 1085 | "nbformat": 4, 1086 | "nbformat_minor": 1 1087 | } 1088 | -------------------------------------------------------------------------------- /sem15/experiment/events.out.tfevents.1612508546.rfc1918.private.ip.localhost.88780.0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem15/experiment/events.out.tfevents.1612508546.rfc1918.private.ip.localhost.88780.0 -------------------------------------------------------------------------------- /sem16/autoencoder-cnn/16/events.out.tfevents.1613071042.531d2ae5abf6.59.3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-cnn/16/events.out.tfevents.1613071042.531d2ae5abf6.59.3 -------------------------------------------------------------------------------- /sem16/autoencoder-cnn/2/events.out.tfevents.1613070642.531d2ae5abf6.59.0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-cnn/2/events.out.tfevents.1613070642.531d2ae5abf6.59.0 -------------------------------------------------------------------------------- /sem16/autoencoder-cnn/32/events.out.tfevents.1613071174.531d2ae5abf6.59.4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-cnn/32/events.out.tfevents.1613071174.531d2ae5abf6.59.4 -------------------------------------------------------------------------------- /sem16/autoencoder-cnn/4/events.out.tfevents.1613070777.531d2ae5abf6.59.1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-cnn/4/events.out.tfevents.1613070777.531d2ae5abf6.59.1 -------------------------------------------------------------------------------- /sem16/autoencoder-cnn/64/events.out.tfevents.1613071305.531d2ae5abf6.59.5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-cnn/64/events.out.tfevents.1613071305.531d2ae5abf6.59.5 -------------------------------------------------------------------------------- /sem16/autoencoder-cnn/8/events.out.tfevents.1613070911.531d2ae5abf6.59.2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-cnn/8/events.out.tfevents.1613070911.531d2ae5abf6.59.2 -------------------------------------------------------------------------------- /sem16/autoencoder-linear/16/events.out.tfevents.1613067067.972fcc07375d.63.3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-linear/16/events.out.tfevents.1613067067.972fcc07375d.63.3 -------------------------------------------------------------------------------- /sem16/autoencoder-linear/2/events.out.tfevents.1613067462.9990b4fd11f6.60.0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-linear/2/events.out.tfevents.1613067462.9990b4fd11f6.60.0 -------------------------------------------------------------------------------- /sem16/autoencoder-linear/32/events.out.tfevents.1613067151.972fcc07375d.63.4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-linear/32/events.out.tfevents.1613067151.972fcc07375d.63.4 -------------------------------------------------------------------------------- /sem16/autoencoder-linear/4/events.out.tfevents.1613066902.972fcc07375d.63.1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-linear/4/events.out.tfevents.1613066902.972fcc07375d.63.1 -------------------------------------------------------------------------------- /sem16/autoencoder-linear/64/events.out.tfevents.1613067233.972fcc07375d.63.5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-linear/64/events.out.tfevents.1613067233.972fcc07375d.63.5 -------------------------------------------------------------------------------- /sem16/autoencoder-linear/8/events.out.tfevents.1613066986.972fcc07375d.63.2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-linear/8/events.out.tfevents.1613066986.972fcc07375d.63.2 -------------------------------------------------------------------------------- /sem16/autoencoder-vae/16/events.out.tfevents.1613074931.785e14f6615a.59.3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-vae/16/events.out.tfevents.1613074931.785e14f6615a.59.3 -------------------------------------------------------------------------------- /sem16/autoencoder-vae/2/events.out.tfevents.1613074317.785e14f6615a.59.0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-vae/2/events.out.tfevents.1613074317.785e14f6615a.59.0 -------------------------------------------------------------------------------- /sem16/autoencoder-vae/32/events.out.tfevents.1613075134.785e14f6615a.59.4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-vae/32/events.out.tfevents.1613075134.785e14f6615a.59.4 -------------------------------------------------------------------------------- /sem16/autoencoder-vae/4/events.out.tfevents.1613074524.785e14f6615a.59.1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-vae/4/events.out.tfevents.1613074524.785e14f6615a.59.1 -------------------------------------------------------------------------------- /sem16/autoencoder-vae/64/events.out.tfevents.1613075339.785e14f6615a.59.5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-vae/64/events.out.tfevents.1613075339.785e14f6615a.59.5 -------------------------------------------------------------------------------- /sem16/autoencoder-vae/8/events.out.tfevents.1613074729.785e14f6615a.59.2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/autoencoder-vae/8/events.out.tfevents.1613074729.785e14f6615a.59.2 -------------------------------------------------------------------------------- /sem16/transfer-resnet18/events.out.tfevents.1613078453.4679eb65a580.61.0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem16/transfer-resnet18/events.out.tfevents.1613078453.4679eb65a580.61.0 -------------------------------------------------------------------------------- /sem17/data/cc.en.10.bin.dvc: -------------------------------------------------------------------------------- 1 | outs: 2 | - md5: 78380e2b64c16af74ad8b81db506994c 3 | size: 277176312 4 | path: cc.en.10.bin 5 | -------------------------------------------------------------------------------- /sem17/data/dataset.csv.dvc: -------------------------------------------------------------------------------- 1 | outs: 2 | - md5: c54b175546f486f0de5a2ffc131666b8 3 | size: 122205190 4 | path: dataset.csv 5 | -------------------------------------------------------------------------------- /sem17/images/img1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem17/images/img1.png -------------------------------------------------------------------------------- /sem17/images/img2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem17/images/img2.png -------------------------------------------------------------------------------- /sem18/data/README: -------------------------------------------------------------------------------- 1 | Corpus Name: Wikipedia 2 | Package: Wikipedia in Moses format 3 | Website: http://opus.nlpl.eu/Wikipedia-v1.0.php 4 | Release: v1.0 5 | Release date: Sun Mar 4 00:51:52 EET 2018 6 | 7 | This corpus is part of OPUS - the open collection of parallel corpora 8 | OPUS Website: http://opus.nlpl.eu 9 | 10 | Please cite the following article if you use any part of the corpus in your own work: J. Tiedemann, 2012, Parallel Data, Tools and Interfaces in OPUS. In Proceedings of the 8th International Conference on Language Resources and Evaluation (LREC 2012) 11 | 12 | This is a corpus of parallel sentences extracted from Wikipedia by Krzysztof Wołk and Krzysztof Marasek. Please cite the following publication if you use the data: Krzysztof Wołk and Krzysztof Marasek: Building Subject-aligned Comparable Corpora and Mining it for Truly Parallel Sentence Pairs., Procedia Technology, 18, Elsevier, p.126-132, 2014 13 | 14 | -------------------------------------------------------------------------------- /sem18/data/Wikipedia.en-ru.en.dvc: -------------------------------------------------------------------------------- 1 | outs: 2 | - md5: 7b41be81a9ca7ea8fa534c8b071491b5 3 | size: 61952948 4 | path: Wikipedia.en-ru.en 5 | -------------------------------------------------------------------------------- /sem18/data/Wikipedia.en-ru.ru.dvc: -------------------------------------------------------------------------------- 1 | outs: 2 | - md5: c8b8940aa5554f8abedb8622e2ae4740 3 | size: 96643051 4 | path: Wikipedia.en-ru.ru 5 | -------------------------------------------------------------------------------- /sem19/README.rst: -------------------------------------------------------------------------------- 1 | Все данные доступны по `ссылке `_. 2 | -------------------------------------------------------------------------------- /sem2/requirements.txt: -------------------------------------------------------------------------------- 1 | matplotlib==2.1.0 2 | seaborn==0.9.0 3 | pandas==1.0.5 4 | tqdm==4.48.2 5 | scipy==1.3.3 6 | numpy==1.19.1 7 | torch==1.9.0 8 | scikit-learn==0.23.2 9 | -------------------------------------------------------------------------------- /sem20/main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Домашнее задание (пояснение)" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": null, 13 | "metadata": { 14 | "colab": { 15 | "base_uri": "https://localhost:8080/" 16 | }, 17 | "id": "hOQH7Uea0S9D", 18 | "outputId": "09f44b0e-fadd-47ff-c941-89bfa1ec5a28" 19 | }, 20 | "outputs": [ 21 | { 22 | "name": "stdout", 23 | "output_type": "stream", 24 | "text": [ 25 | "--2021-03-12 09:49:03-- https://storage.yandexcloud.net/natasha-nerus/data/nerus_lenta.conllu.gz\n", 26 | "Resolving storage.yandexcloud.net (storage.yandexcloud.net)... 213.180.193.243, 2a02:6b8::1d9\n", 27 | "Connecting to storage.yandexcloud.net (storage.yandexcloud.net)|213.180.193.243|:443... connected.\n", 28 | "HTTP request sent, awaiting response... 200 OK\n", 29 | "Length: 1961465886 (1.8G) [application/octet-stream]\n", 30 | "Saving to: ‘nerus_lenta.conllu.gz’\n", 31 | "\n", 32 | "nerus_lenta.conllu. 100%[===================>] 1.83G 21.0MB/s in 92s \n", 33 | "\n", 34 | "2021-03-12 09:50:36 (20.4 MB/s) - ‘nerus_lenta.conllu.gz’ saved [1961465886/1961465886]\n", 35 | "\n" 36 | ] 37 | } 38 | ], 39 | "source": [ 40 | "!wget https://storage.yandexcloud.net/natasha-nerus/data/nerus_lenta.conllu.gz" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": null, 46 | "metadata": { 47 | "colab": { 48 | "base_uri": "https://localhost:8080/" 49 | }, 50 | "id": "7wpf5fE_1s79", 51 | "outputId": "ee1793be-2a1f-4d3d-f241-5923c60eab22" 52 | }, 53 | "outputs": [ 54 | { 55 | "name": "stdout", 56 | "output_type": "stream", 57 | "text": [ 58 | "Collecting nerus\n", 59 | " Downloading https://files.pythonhosted.org/packages/ef/d7/a9f3efd13d714340fcbf3e35d0167d4d17a522438080558e537793121942/nerus-1.7.0-py3-none-any.whl\n", 60 | "Installing collected packages: nerus\n", 61 | "Successfully installed nerus-1.7.0\n" 62 | ] 63 | } 64 | ], 65 | "source": [ 66 | "!pip install nerus" 67 | ] 68 | }, 69 | { 70 | "cell_type": "code", 71 | "execution_count": null, 72 | "metadata": { 73 | "id": "Bqb5TyV34jk1" 74 | }, 75 | "outputs": [], 76 | "source": [ 77 | "from nerus import load_nerus\n", 78 | "from tqdm.notebook import tqdm" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": null, 84 | "metadata": { 85 | "id": "zdarlxw41wKE" 86 | }, 87 | "outputs": [], 88 | "source": [ 89 | "docs = load_nerus(\"nerus_lenta.conllu.gz\")" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": null, 95 | "metadata": { 96 | "id": "waH27WQ14sNh" 97 | }, 98 | "outputs": [], 99 | "source": [ 100 | "list_of_sent = []\n", 101 | "list_of_tags = []\n", 102 | "for doc in tqdm(docs):\n", 103 | " for sent in doc.sents:\n", 104 | " list_of_sent_toks = []\n", 105 | " list_of_sent_tags = []\n", 106 | " for tok in sent.tokens:\n", 107 | " list_of_sent_toks.append(tok.text)\n", 108 | " list_of_sent_tags.append(tok.pos)\n", 109 | " list_of_sent.append(list_of_sent_toks)\n", 110 | " list_of_tags.append(list_of_sent_tags)" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 15, 116 | "metadata": { 117 | "colab": { 118 | "base_uri": "https://localhost:8080/", 119 | "height": 232 120 | }, 121 | "id": "_44yjrwl5Xb6", 122 | "outputId": "7abb84fb-7ad5-4a9d-9d60-f60c04f7d19f" 123 | }, 124 | "outputs": [ 125 | { 126 | "ename": "NameError", 127 | "evalue": "ignored", 128 | "output_type": "error", 129 | "traceback": [ 130 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 131 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 132 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mword_to_ind\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0msent\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlist_of_sent\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mword\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msent\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mword\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mword_to_ind\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 133 | "\u001b[0;31mNameError\u001b[0m: name 'list_of_sent' is not defined" 134 | ] 135 | } 136 | ], 137 | "source": [ 138 | "word_to_ind = dict()\n", 139 | "pos_to_ind = dict()\n", 140 | "\n", 141 | "word_to_ind[''] = 0\n", 142 | "word_to_ind[''] = 1\n", 143 | "\n", 144 | "for sent in list_of_sent[:-100]:\n", 145 | " for word in sent:\n", 146 | " if word not in word_to_ind:\n", 147 | " word_to_ind[word] = len(word_to_ind)\n", 148 | "\n", 149 | "pos_to_ind[''] = 0\n", 150 | "for sent in list_of_tags[:-100]:\n", 151 | " for tag in sent:\n", 152 | " if tag not in pos_to_ind:\n", 153 | " pos_to_ind[tag] = len(pos_to_ind)" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": null, 159 | "metadata": { 160 | "colab": { 161 | "base_uri": "https://localhost:8080/" 162 | }, 163 | "id": "rAJA4sEp5cq8", 164 | "outputId": "56794d5b-405a-4f9d-f78a-9498cb9bf2fc" 165 | }, 166 | "outputs": [ 167 | { 168 | "data": { 169 | "text/plain": [ 170 | "64842" 171 | ] 172 | }, 173 | "execution_count": 70, 174 | "metadata": { 175 | "tags": [] 176 | }, 177 | "output_type": "execute_result" 178 | } 179 | ], 180 | "source": [ 181 | "len(word_to_ind)" 182 | ] 183 | }, 184 | { 185 | "cell_type": "code", 186 | "execution_count": null, 187 | "metadata": { 188 | "id": "igtmQ08G6L7P" 189 | }, 190 | "outputs": [], 191 | "source": [ 192 | "X_train_data = []\n", 193 | "X_test_data = []\n", 194 | "Y_train_data = []\n", 195 | "Y_test_data = []\n", 196 | "\n", 197 | "for sent in list_of_sent[:-100]:\n", 198 | " x_data = []\n", 199 | " for word in sent:\n", 200 | " x_data.append(word_to_ind.get(word, 0))\n", 201 | " X_train_data.append(x_data)\n", 202 | "\n", 203 | "for sent in list_of_sent[-100:]:\n", 204 | " x_data = []\n", 205 | " for word in sent:\n", 206 | " x_data.append(word_to_ind.get(word, 0))\n", 207 | " X_test_data.append(x_data)\n", 208 | "\n", 209 | "for sent in list_of_tags[:-100]:\n", 210 | " x_data = []\n", 211 | " for word in sent:\n", 212 | " x_data.append(pos_to_ind.get(word, 0))\n", 213 | " Y_train_data.append(x_data)\n", 214 | "\n", 215 | "for sent in list_of_tags[-100:]:\n", 216 | " x_data = []\n", 217 | " for word in sent:\n", 218 | " x_data.append(pos_to_ind.get(word, 0))\n", 219 | " Y_test_data.append(x_data)" 220 | ] 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": null, 225 | "metadata": { 226 | "colab": { 227 | "base_uri": "https://localhost:8080/" 228 | }, 229 | "id": "AjVvgdP-63bv", 230 | "outputId": "e88bc982-bdde-4ca5-94c6-239b9415e04c" 231 | }, 232 | "outputs": [ 233 | { 234 | "data": { 235 | "text/plain": [ 236 | "(27606, 100, 27606, 100)" 237 | ] 238 | }, 239 | "execution_count": 72, 240 | "metadata": { 241 | "tags": [] 242 | }, 243 | "output_type": "execute_result" 244 | } 245 | ], 246 | "source": [ 247 | "len(X_train_data), len(X_test_data), len(Y_train_data), len(Y_test_data)" 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": null, 253 | "metadata": { 254 | "id": "Bbp29P-r7a-h" 255 | }, 256 | "outputs": [], 257 | "source": [ 258 | "import numpy as np" 259 | ] 260 | }, 261 | { 262 | "cell_type": "code", 263 | "execution_count": null, 264 | "metadata": { 265 | "id": "H5maemzx7iP8" 266 | }, 267 | "outputs": [], 268 | "source": [ 269 | "x_cur_batch = X_train_data[:8]\n", 270 | "y_cur_batch = Y_train_data[:8]\n" 271 | ] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "execution_count": null, 276 | "metadata": { 277 | "id": "Sh3n2Mqr7ezq" 278 | }, 279 | "outputs": [], 280 | "source": [ 281 | "x_batch = np.zeros(shape=(len(x_cur_batch), max(list(map(len, x_cur_batch)))), )\n", 282 | "y_batch = np.zeros(shape=(len(y_cur_batch), max(list(map(len, y_cur_batch)))), )" 283 | ] 284 | }, 285 | { 286 | "cell_type": "code", 287 | "execution_count": null, 288 | "metadata": { 289 | "colab": { 290 | "base_uri": "https://localhost:8080/" 291 | }, 292 | "id": "q4j5QupL7I5I", 293 | "outputId": "ece58c3a-6197-43a6-9c1e-616c3c22ed1b" 294 | }, 295 | "outputs": [ 296 | { 297 | "data": { 298 | "text/plain": [ 299 | "((8, 26), (8, 26))" 300 | ] 301 | }, 302 | "execution_count": 76, 303 | "metadata": { 304 | "tags": [] 305 | }, 306 | "output_type": "execute_result" 307 | } 308 | ], 309 | "source": [ 310 | "x_batch.shape, y_batch.shape" 311 | ] 312 | }, 313 | { 314 | "cell_type": "code", 315 | "execution_count": null, 316 | "metadata": { 317 | "id": "m4V7KrhW7Kit" 318 | }, 319 | "outputs": [], 320 | "source": [ 321 | "for i, sent in enumerate(x_cur_batch):\n", 322 | " x_batch[i, :len(sent)] = sent\n", 323 | "\n", 324 | "for i, sent in enumerate(y_cur_batch):\n", 325 | " y_batch[i, :len(sent)] = sent" 326 | ] 327 | }, 328 | { 329 | "cell_type": "code", 330 | "execution_count": 4, 331 | "metadata": { 332 | "id": "xYNelewI8XXw" 333 | }, 334 | "outputs": [], 335 | "source": [ 336 | "import torch" 337 | ] 338 | }, 339 | { 340 | "cell_type": "code", 341 | "execution_count": null, 342 | "metadata": { 343 | "id": "l0FuDkk68Z36" 344 | }, 345 | "outputs": [], 346 | "source": [ 347 | "x_batch_tr = torch.from_numpy(x_batch).long()\n", 348 | "y_batch_tr = torch.from_numpy(y_batch).long()" 349 | ] 350 | }, 351 | { 352 | "cell_type": "code", 353 | "execution_count": null, 354 | "metadata": { 355 | "colab": { 356 | "base_uri": "https://localhost:8080/" 357 | }, 358 | "id": "0xkDsKg58oGf", 359 | "outputId": "23266f39-6ea3-4b45-a7f9-a11778671f81" 360 | }, 361 | "outputs": [ 362 | { 363 | "data": { 364 | "text/plain": [ 365 | "tensor([[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n", 366 | " 16, 17, 18, 19, 9, 20, 21, 22, 23, 0, 0, 0],\n", 367 | " [ 24, 25, 26, 9, 27, 28, 29, 30, 31, 32, 33, 10, 34, 9,\n", 368 | " 35, 9, 36, 37, 38, 39, 9, 40, 41, 10, 42, 23],\n", 369 | " [ 2, 43, 9, 44, 45, 46, 47, 10, 13, 48, 49, 37, 50, 51,\n", 370 | " 52, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", 371 | " [ 53, 54, 55, 56, 57, 9, 44, 17, 18, 58, 59, 60, 61, 62,\n", 372 | " 63, 64, 65, 55, 23, 0, 0, 0, 0, 0, 0, 0],\n", 373 | " [ 24, 66, 67, 9, 10, 68, 69, 18, 19, 70, 71, 72, 73, 23,\n", 374 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", 375 | " [ 74, 75, 76, 77, 78, 9, 79, 80, 81, 23, 0, 0, 0, 0,\n", 376 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", 377 | " [ 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 23, 0, 0,\n", 378 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", 379 | " [ 93, 94, 95, 96, 13, 10, 97, 98, 99, 3, 100, 101, 102, 103,\n", 380 | " 104, 105, 106, 107, 108, 9, 109, 110, 23, 0, 0, 0]])" 381 | ] 382 | }, 383 | "execution_count": 80, 384 | "metadata": { 385 | "tags": [] 386 | }, 387 | "output_type": "execute_result" 388 | } 389 | ], 390 | "source": [ 391 | "x_batch_tr" 392 | ] 393 | }, 394 | { 395 | "cell_type": "code", 396 | "execution_count": null, 397 | "metadata": { 398 | "colab": { 399 | "base_uri": "https://localhost:8080/" 400 | }, 401 | "id": "MiLWvsU_8tef", 402 | "outputId": "a5fbb302-14b7-4150-cf69-8ce7fa041c89" 403 | }, 404 | "outputs": [ 405 | { 406 | "data": { 407 | "text/plain": [ 408 | "tensor([[ 1, 2, 3, 1, 4, 4, 5, 6, 2, 7, 1, 4, 5, 8, 3, 1, 2, 1,\n", 409 | " 6, 5, 4, 4, 6, 0, 0, 0],\n", 410 | " [ 2, 1, 4, 6, 8, 9, 3, 1, 5, 1, 1, 2, 3, 6, 3, 6, 3, 10,\n", 411 | " 3, 1, 6, 10, 8, 2, 4, 6],\n", 412 | " [ 1, 5, 6, 11, 3, 1, 1, 2, 4, 6, 1, 10, 1, 1, 1, 6, 0, 0,\n", 413 | " 0, 0, 0, 0, 0, 0, 0, 0],\n", 414 | " [ 2, 1, 1, 5, 3, 6, 11, 1, 2, 3, 1, 2, 1, 5, 8, 2, 12, 1,\n", 415 | " 6, 0, 0, 0, 0, 0, 0, 0],\n", 416 | " [ 2, 1, 4, 6, 2, 3, 1, 2, 1, 5, 12, 1, 1, 6, 0, 0, 0, 0,\n", 417 | " 0, 0, 0, 0, 0, 0, 0, 0],\n", 418 | " [ 9, 2, 12, 1, 12, 6, 11, 1, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0,\n", 419 | " 0, 0, 0, 0, 0, 0, 0, 0],\n", 420 | " [ 3, 3, 1, 13, 5, 1, 1, 3, 1, 3, 1, 6, 0, 0, 0, 0, 0, 0,\n", 421 | " 0, 0, 0, 0, 0, 0, 0, 0],\n", 422 | " [ 2, 9, 5, 1, 4, 2, 4, 4, 4, 2, 1, 1, 5, 1, 1, 2, 1, 1,\n", 423 | " 1, 6, 5, 4, 6, 0, 0, 0]])" 424 | ] 425 | }, 426 | "execution_count": 81, 427 | "metadata": { 428 | "tags": [] 429 | }, 430 | "output_type": "execute_result" 431 | } 432 | ], 433 | "source": [ 434 | "y_batch_tr" 435 | ] 436 | }, 437 | { 438 | "cell_type": "code", 439 | "execution_count": null, 440 | "metadata": { 441 | "id": "TFLQGzcP8ujp" 442 | }, 443 | "outputs": [], 444 | "source": [ 445 | "class Encoder(torch.nn.Module):\n", 446 | " @property\n", 447 | " def device(self):\n", 448 | " return next(self.parameters()).device\n", 449 | " \n", 450 | " def __init__(self,\n", 451 | " vocab_dim,\n", 452 | " emb_dim = 10, \n", 453 | " hidden_dim = 10,\n", 454 | " num_layers = 3,\n", 455 | " output_dim = len(pos_to_ind),\n", 456 | " bidirectional = False):\n", 457 | " super(Encoder, self).__init__()\n", 458 | " \n", 459 | " self.num_direction = int(bidirectional + 1)\n", 460 | " self.emb_dim = emb_dim\n", 461 | " self.hidden_dim = hidden_dim\n", 462 | "\n", 463 | " self.embedding = torch.nn.Embedding(vocab_dim, emb_dim, padding_idx=0)\n", 464 | "\n", 465 | " self.encoder = torch.nn.LSTM(\n", 466 | " emb_dim, hidden_dim, num_layers, bidirectional = bidirectional, batch_first=True)\n", 467 | " \n", 468 | " self.linear = torch.nn.Linear(10, output_dim)\n", 469 | " def forward(self, input):\n", 470 | " input = self.embedding(input)\n", 471 | " # input = torch.transpose(input, 0, 1)\n", 472 | " d, _ = self.encoder(input)\n", 473 | " # input = torch.transpose(input, 0, 1)\n", 474 | " return self.linear(d)" 475 | ] 476 | }, 477 | { 478 | "cell_type": "code", 479 | "execution_count": null, 480 | "metadata": { 481 | "id": "pUvmSIt49Gt_" 482 | }, 483 | "outputs": [], 484 | "source": [ 485 | "model = Encoder(vocab_dim = len(word_to_ind))" 486 | ] 487 | }, 488 | { 489 | "cell_type": "code", 490 | "execution_count": null, 491 | "metadata": { 492 | "id": "QC6HNS699pXP" 493 | }, 494 | "outputs": [], 495 | "source": [ 496 | "loss_function = torch.nn.CrossEntropyLoss(ignore_index=0)" 497 | ] 498 | }, 499 | { 500 | "cell_type": "code", 501 | "execution_count": null, 502 | "metadata": { 503 | "id": "IkSnWw7e9Wd5" 504 | }, 505 | "outputs": [], 506 | "source": [ 507 | "pred = model(x_batch_tr)" 508 | ] 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": null, 513 | "metadata": { 514 | "colab": { 515 | "base_uri": "https://localhost:8080/" 516 | }, 517 | "id": "qiSX_Zav9zBz", 518 | "outputId": "b561e2cf-3206-4767-b32d-44f1e6ddf237" 519 | }, 520 | "outputs": [ 521 | { 522 | "data": { 523 | "text/plain": [ 524 | "torch.Size([8, 26, 18])" 525 | ] 526 | }, 527 | "execution_count": 98, 528 | "metadata": { 529 | "tags": [] 530 | }, 531 | "output_type": "execute_result" 532 | } 533 | ], 534 | "source": [ 535 | "pred.shape" 536 | ] 537 | }, 538 | { 539 | "cell_type": "code", 540 | "execution_count": null, 541 | "metadata": { 542 | "colab": { 543 | "base_uri": "https://localhost:8080/" 544 | }, 545 | "id": "yGWrnour9X5q", 546 | "outputId": "c5eaf26d-b44f-4ce6-a08d-d03321b75ff6" 547 | }, 548 | "outputs": [ 549 | { 550 | "data": { 551 | "text/plain": [ 552 | "tensor(3.0964, grad_fn=)" 553 | ] 554 | }, 555 | "execution_count": 99, 556 | "metadata": { 557 | "tags": [] 558 | }, 559 | "output_type": "execute_result" 560 | } 561 | ], 562 | "source": [ 563 | "loss_function(pred.transpose(1, 2), y_batch_tr)" 564 | ] 565 | }, 566 | { 567 | "cell_type": "markdown", 568 | "metadata": { 569 | "id": "fRrYO1HtBYMP" 570 | }, 571 | "source": [ 572 | "# Task 3" 573 | ] 574 | }, 575 | { 576 | "cell_type": "code", 577 | "execution_count": null, 578 | "metadata": { 579 | "id": "rAVFNP329w9z" 580 | }, 581 | "outputs": [], 582 | "source": [ 583 | "dataset = torch.utils.data.TensorDataset(x_batch_tr, x_batch_tr)" 584 | ] 585 | }, 586 | { 587 | "cell_type": "code", 588 | "execution_count": null, 589 | "metadata": { 590 | "colab": { 591 | "base_uri": "https://localhost:8080/" 592 | }, 593 | "id": "sp5QTPvoBgAF", 594 | "outputId": "6e8d6857-e5fd-42a0-c0ee-9b20d82e6061" 595 | }, 596 | "outputs": [ 597 | { 598 | "data": { 599 | "text/plain": [ 600 | "(torch.Size([8, 26]), torch.Size([8, 26]))" 601 | ] 602 | }, 603 | "execution_count": 115, 604 | "metadata": { 605 | "tags": [] 606 | }, 607 | "output_type": "execute_result" 608 | } 609 | ], 610 | "source": [ 611 | "x_batch_tr.shape, x_batch_tr.shape" 612 | ] 613 | }, 614 | { 615 | "cell_type": "code", 616 | "execution_count": null, 617 | "metadata": { 618 | "id": "UQpu7AYG-Z8c" 619 | }, 620 | "outputs": [], 621 | "source": [ 622 | "for x_b, y_b in torch.utils.data.DataLoader(dataset, batch_size=2):\n", 623 | " pass" 624 | ] 625 | }, 626 | { 627 | "cell_type": "code", 628 | "execution_count": null, 629 | "metadata": { 630 | "colab": { 631 | "base_uri": "https://localhost:8080/" 632 | }, 633 | "id": "wAfc9kzrBCcx", 634 | "outputId": "fd8b5b41-6799-447f-f87d-e1eaf3f5e0ec" 635 | }, 636 | "outputs": [ 637 | { 638 | "data": { 639 | "text/plain": [ 640 | "torch.Size([2, 26])" 641 | ] 642 | }, 643 | "execution_count": 112, 644 | "metadata": { 645 | "tags": [] 646 | }, 647 | "output_type": "execute_result" 648 | } 649 | ], 650 | "source": [ 651 | "x_b.shape" 652 | ] 653 | }, 654 | { 655 | "cell_type": "code", 656 | "execution_count": null, 657 | "metadata": { 658 | "colab": { 659 | "base_uri": "https://localhost:8080/" 660 | }, 661 | "id": "tsEEfPEfBVeJ", 662 | "outputId": "d8146c64-00fd-48b2-cfbd-b7d30b61e340" 663 | }, 664 | "outputs": [ 665 | { 666 | "data": { 667 | "text/plain": [ 668 | "torch.Size([2, 26])" 669 | ] 670 | }, 671 | "execution_count": 113, 672 | "metadata": { 673 | "tags": [] 674 | }, 675 | "output_type": "execute_result" 676 | } 677 | ], 678 | "source": [ 679 | "y_b.shape" 680 | ] 681 | }, 682 | { 683 | "cell_type": "code", 684 | "execution_count": null, 685 | "metadata": { 686 | "id": "-rFu2tJzBWLy" 687 | }, 688 | "outputs": [], 689 | "source": [ 690 | "class Encoder(torch.nn.Module):\n", 691 | " @property\n", 692 | " def device(self):\n", 693 | " return next(self.parameters()).device\n", 694 | " \n", 695 | " def __init__(self,\n", 696 | " vocab_dim,\n", 697 | " emb_dim = 10, \n", 698 | " hidden_dim = 10,\n", 699 | " num_layers = 3,\n", 700 | " output_dim = len(pos_to_ind),\n", 701 | " bidirectional = False):\n", 702 | " super(Encoder, self).__init__()\n", 703 | " \n", 704 | " self.num_direction = int(bidirectional + 1)\n", 705 | " self.emb_dim = emb_dim\n", 706 | " self.hidden_dim = hidden_dim\n", 707 | "\n", 708 | " self.embedding = torch.nn.Embedding(vocab_dim, emb_dim, padding_idx=0)\n", 709 | "\n", 710 | " self.encoder = torch.nn.LSTM(\n", 711 | " emb_dim, hidden_dim, num_layers, bidirectional = bidirectional, batch_first=True)\n", 712 | " \n", 713 | " self.linear = torch.nn.Linear(hidden_dim+hidden_dim, 1000)\n", 714 | " def forward(self, input):\n", 715 | " input = self.embedding(input)\n", 716 | " _, (h, c) = self.encoder(input)\n", 717 | "\n", 718 | " act = torch.cat([h, c], dim=-1).transpose(0, 1)[:, -1, :]\n", 719 | " return self.linear(act)\n", 720 | " # act = act.reshape(len(input), -1)\n", 721 | " # return self.linear(d)" 722 | ] 723 | }, 724 | { 725 | "cell_type": "markdown", 726 | "metadata": { 727 | "id": "io1aExfcRF3g" 728 | }, 729 | "source": [ 730 | "Немного добавил к семинару" 731 | ] 732 | }, 733 | { 734 | "cell_type": "code", 735 | "execution_count": 44, 736 | "metadata": { 737 | "id": "0mvD5J6sEM_y" 738 | }, 739 | "outputs": [], 740 | "source": [ 741 | "class Decoder(torch.nn.Module):\n", 742 | " @property\n", 743 | " def device(self):\n", 744 | " return next(self.parameters()).device\n", 745 | " def __init__(self, vocab_dim, \n", 746 | " emb_dim=128, \n", 747 | " hidden_dim=256, \n", 748 | " latent_dim=1000):\n", 749 | " super(Decoder, self).__init__()\n", 750 | " \n", 751 | "\n", 752 | " self.latent_to_h0 = torch.nn.Linear(latent_dim, hidden_dim)\n", 753 | " self.latent_to_c0 = torch.nn.Linear(latent_dim, hidden_dim)\n", 754 | " \n", 755 | " self.emb = torch.nn.Embedding(vocab_dim, emb_dim)\n", 756 | "\n", 757 | " self.lstm = torch.nn.LSTM(emb_dim, hidden_dim, batch_first=True)\n", 758 | "\n", 759 | " self.logits = torch.nn.Linear(hidden_dim, vocab_dim)\n", 760 | " \n", 761 | " def forward(self, word_ix, latent_vector=None, h = None, c = None):\n", 762 | "\n", 763 | " if h is None and c is None:\n", 764 | " initial_cell = self.latent_to_h0(latent_vector)[None]\n", 765 | " initial_hid = self.latent_to_c0(latent_vector)[None]\n", 766 | " else:\n", 767 | " initial_cell = c\n", 768 | " initial_hid = h\n", 769 | " \n", 770 | " emb = self.emb(word_ix)\n", 771 | "\n", 772 | " lstm_out, (h, c) = self.lstm(emb, (initial_cell, initial_hid))\n", 773 | "\n", 774 | " return self.logits(lstm_out), (h, c)" 775 | ] 776 | }, 777 | { 778 | "cell_type": "code", 779 | "execution_count": null, 780 | "metadata": { 781 | "id": "qKjOv_4sCoK6" 782 | }, 783 | "outputs": [], 784 | "source": [ 785 | "model = Encoder(vocab_dim = len(word_to_ind))" 786 | ] 787 | }, 788 | { 789 | "cell_type": "code", 790 | "execution_count": null, 791 | "metadata": { 792 | "colab": { 793 | "base_uri": "https://localhost:8080/" 794 | }, 795 | "id": "ueqQ_CR7CrNe", 796 | "outputId": "42664a0f-6d81-444a-a696-2286af34549e" 797 | }, 798 | "outputs": [ 799 | { 800 | "data": { 801 | "text/plain": [ 802 | "torch.Size([2, 1000])" 803 | ] 804 | }, 805 | "execution_count": 146, 806 | "metadata": { 807 | "tags": [] 808 | }, 809 | "output_type": "execute_result" 810 | } 811 | ], 812 | "source": [ 813 | "model(x_b).shape" 814 | ] 815 | }, 816 | { 817 | "cell_type": "code", 818 | "execution_count": 45, 819 | "metadata": { 820 | "id": "PWk3Aw1hCuqv" 821 | }, 822 | "outputs": [], 823 | "source": [ 824 | "decoder = Decoder(vocab_dim = 100)" 825 | ] 826 | }, 827 | { 828 | "cell_type": "code", 829 | "execution_count": 46, 830 | "metadata": { 831 | "id": "GVKgahOoRynT" 832 | }, 833 | "outputs": [], 834 | "source": [ 835 | "latent = torch.randn(2, 1000)" 836 | ] 837 | }, 838 | { 839 | "cell_type": "code", 840 | "execution_count": 47, 841 | "metadata": { 842 | "id": "x_2gukd2SHQt" 843 | }, 844 | "outputs": [], 845 | "source": [ 846 | "x = torch.ones(2, 1).long()*word_to_ind.get('', 1) # Да в словарь еще токен нужно добавить" 847 | ] 848 | }, 849 | { 850 | "cell_type": "code", 851 | "execution_count": 48, 852 | "metadata": { 853 | "id": "qPCAcHGTSDuY" 854 | }, 855 | "outputs": [], 856 | "source": [ 857 | "max_len = 10\n", 858 | "pred = torch.zeros((len(x), max_len))\n", 859 | "h_i = None\n", 860 | "c_i = None\n", 861 | "for i in range(max_len):\n", 862 | " p_i, (h_i, c_i) = decoder(x, latent_vector=x_b, h = h_i, c = c_i)\n", 863 | " pred[:, i] = torch.argmax(p_i[:, 0, :], dim=-1)" 864 | ] 865 | }, 866 | { 867 | "cell_type": "code", 868 | "execution_count": 49, 869 | "metadata": { 870 | "colab": { 871 | "base_uri": "https://localhost:8080/" 872 | }, 873 | "id": "OoofApMuTYPD", 874 | "outputId": "30ff6dcf-6c21-415e-d1a4-da59f2abc99b" 875 | }, 876 | "outputs": [ 877 | { 878 | "data": { 879 | "text/plain": [ 880 | "tensor([[ 9., 90., 57., 57., 94., 94., 94., 94., 94., 94.],\n", 881 | " [74., 94., 94., 94., 94., 94., 94., 94., 94., 94.]])" 882 | ] 883 | }, 884 | "execution_count": 49, 885 | "metadata": { 886 | "tags": [] 887 | }, 888 | "output_type": "execute_result" 889 | } 890 | ], 891 | "source": [ 892 | "pred" 893 | ] 894 | }, 895 | { 896 | "cell_type": "code", 897 | "execution_count": null, 898 | "metadata": { 899 | "id": "Ig2GMJX9T9_a" 900 | }, 901 | "outputs": [], 902 | "source": [] 903 | } 904 | ], 905 | "metadata": { 906 | "colab": { 907 | "collapsed_sections": [], 908 | "name": "Untitled1.ipynb", 909 | "provenance": [] 910 | }, 911 | "kernelspec": { 912 | "display_name": "Python 3", 913 | "language": "python", 914 | "name": "python3" 915 | }, 916 | "language_info": { 917 | "codemirror_mode": { 918 | "name": "ipython", 919 | "version": 3 920 | }, 921 | "file_extension": ".py", 922 | "mimetype": "text/x-python", 923 | "name": "python", 924 | "nbconvert_exporter": "python", 925 | "pygments_lexer": "ipython3", 926 | "version": "3.7.3" 927 | } 928 | }, 929 | "nbformat": 4, 930 | "nbformat_minor": 1 931 | } 932 | -------------------------------------------------------------------------------- /sem21/README.rst: -------------------------------------------------------------------------------- 1 | Все данные доступны по `первой ссылке `_ и `второй ссылке `_. -------------------------------------------------------------------------------- /sem21/images/learningrank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem21/images/learningrank.png -------------------------------------------------------------------------------- /sem21/images/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem21/images/search.png -------------------------------------------------------------------------------- /sem22/main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "kernelspec": { 6 | "display_name": "Python 3", 7 | "language": "python", 8 | "name": "python3" 9 | }, 10 | "language_info": { 11 | "codemirror_mode": { 12 | "name": "ipython", 13 | "version": 3 14 | }, 15 | "file_extension": ".py", 16 | "mimetype": "text/x-python", 17 | "name": "python", 18 | "nbconvert_exporter": "python", 19 | "pygments_lexer": "ipython3", 20 | "version": "3.7.3" 21 | }, 22 | "colab": { 23 | "name": "main.ipynb", 24 | "provenance": [] 25 | } 26 | }, 27 | "cells": [ 28 | { 29 | "cell_type": "markdown", 30 | "metadata": { 31 | "id": "dgFNZGbprC7Y" 32 | }, 33 | "source": [ 34 | "# Рекомендательные системы" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "metadata": { 40 | "id": "o7EB2LAELXjW" 41 | }, 42 | "source": [ 43 | "!pip install --quiet -U jsonlines pyserini jsonlines scikit-surprise fastrank" 44 | ], 45 | "execution_count": null, 46 | "outputs": [] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": { 51 | "id": "75CyfArkrF61" 52 | }, 53 | "source": [ 54 | "# Библиотеки" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "metadata": { 60 | "id": "WIijCu1mrHZB" 61 | }, 62 | "source": [ 63 | "import matplotlib.pyplot as plt\n", 64 | "from mpl_toolkits import mplot3d\n", 65 | "from matplotlib import gridspec\n", 66 | "\n", 67 | "from tqdm.notebook import tqdm\n", 68 | "import numpy as np\n", 69 | "import pandas as pd\n", 70 | "import seaborn as sns\n", 71 | "import torch\n", 72 | "import scipy\n", 73 | "import json\n", 74 | "import sys\n", 75 | "import re\n", 76 | "import os\n", 77 | "\n", 78 | "from functools import partial\n", 79 | "from multiprocess import Pool\n", 80 | "\n", 81 | "from surprise import Dataset, Reader, SVD, KNNBasic" 82 | ], 83 | "execution_count": null, 84 | "outputs": [] 85 | }, 86 | { 87 | "cell_type": "markdown", 88 | "metadata": { 89 | "id": "fk0bRu8RKtkW" 90 | }, 91 | "source": [ 92 | "## Данные" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "metadata": { 98 | "id": "f8Ew7yixrM5D" 99 | }, 100 | "source": [ 101 | "data = Dataset.load_builtin('ml-100k')\n", 102 | "trainset = data.build_full_trainset()\n", 103 | "dataframe = pd.DataFrame(\n", 104 | " trainset.all_ratings(),\n", 105 | " columns=['uid', 'iid', 'rating'])\n", 106 | "dataframe.sample(5, random_state=42)" 107 | ], 108 | "execution_count": null, 109 | "outputs": [] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "metadata": { 114 | "id": "pHalEh5B4Vil" 115 | }, 116 | "source": [ 117 | "uids = np.unique(dataframe['uid'].values)[:300]\n", 118 | "means = {uid: dataframe.loc[dataframe['uid'] == uid]['rating'].values.mean() for uid in uids}" 119 | ], 120 | "execution_count": null, 121 | "outputs": [] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "metadata": { 126 | "id": "zudVqCLX6YpS" 127 | }, 128 | "source": [ 129 | "mapping = dict()\n", 130 | "for index in tqdm(dataframe.index):\n", 131 | " item = dataframe.loc[index]\n", 132 | " if item['uid'] in means:\n", 133 | " if item['uid'] not in mapping:\n", 134 | " mapping[item['uid']] = dict()\n", 135 | " mapping[item['uid']][item['iid']] = item['rating']" 136 | ], 137 | "execution_count": null, 138 | "outputs": [] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "metadata": { 143 | "id": "Ekw-G6oZG5ep" 144 | }, 145 | "source": [ 146 | "mapping_delta = dict()\n", 147 | "for index in tqdm(dataframe.index):\n", 148 | " item = dataframe.loc[index]\n", 149 | " if item['uid'] in means:\n", 150 | " if item['uid'] not in mapping_delta:\n", 151 | " mapping_delta[item['uid']] = dict()\n", 152 | " mapping_delta[item['uid']][item['iid']] = item['rating'] - means[item['uid']]" 153 | ], 154 | "execution_count": null, 155 | "outputs": [] 156 | }, 157 | { 158 | "cell_type": "code", 159 | "metadata": { 160 | "id": "tI1y4Ws_5PYI" 161 | }, 162 | "source": [ 163 | "def r(uid, iid=None, delta=False):\n", 164 | " if uid not in mapping:\n", 165 | " return None\n", 166 | " \n", 167 | " mean = means[uid]\n", 168 | " if iid is None:\n", 169 | " if delta:\n", 170 | " all_iid = mapping_delta.get(uid, None)\n", 171 | " return [(key, all_iid[key]) for key in all_iid]\n", 172 | " else:\n", 173 | " all_iid = mapping.get(uid, None)\n", 174 | " return [(key, all_iid[key]) for key in all_iid]\n", 175 | " else:\n", 176 | " if delta:\n", 177 | " return mapping_delta.get(uid, None).get(iid, None)\n", 178 | " else:\n", 179 | " return mapping.get(uid, None).get(iid, None)" 180 | ], 181 | "execution_count": null, 182 | "outputs": [] 183 | }, 184 | { 185 | "cell_type": "markdown", 186 | "metadata": { 187 | "id": "-EXBfF0JAC5g" 188 | }, 189 | "source": [ 190 | "## Константная модель" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "metadata": { 196 | "id": "exyEfin4AGE6" 197 | }, 198 | "source": [ 199 | "def predict_user_constant(uid, iid):\n", 200 | " return means[uid]" 201 | ], 202 | "execution_count": null, 203 | "outputs": [] 204 | }, 205 | { 206 | "cell_type": "code", 207 | "metadata": { 208 | "id": "h_bn0ZEVAPuc" 209 | }, 210 | "source": [ 211 | "%%time\n", 212 | "predict_user_constant(1, 43)" 213 | ], 214 | "execution_count": null, 215 | "outputs": [] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "metadata": { 220 | "id": "jGS_RtBIKD5q" 221 | }, 222 | "source": [ 223 | "r(1, 43)" 224 | ], 225 | "execution_count": null, 226 | "outputs": [] 227 | }, 228 | { 229 | "cell_type": "markdown", 230 | "metadata": { 231 | "id": "mevjAIsgtecU" 232 | }, 233 | "source": [ 234 | "## Корреляционная система" 235 | ] 236 | }, 237 | { 238 | "cell_type": "markdown", 239 | "metadata": { 240 | "id": "yaCuhreU7M70" 241 | }, 242 | "source": [ 243 | "$$\n", 244 | " \\hat{r}_{ui} = \\bar{r}_{u} + \\frac{\\sum S(u, u')\\cdot \\left(r_{u'i} - \\bar{r}_{u'}\\right)}{\\sum S(u, u')} \n", 245 | "$$" 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "metadata": { 251 | "id": "XXZaVq4Jz_NG" 252 | }, 253 | "source": [ 254 | "def predict_user_score(uid, iid, scores):\n", 255 | " weighted_score = 0\n", 256 | " list_of_ids = []\n", 257 | "\n", 258 | " pair_list = [(id, iid) for id in uids]\n", 259 | " f = lambda x: (x[0], x[1], r(*x, delta=True))\n", 260 | " \n", 261 | " for id, iid, r_id_iid_delta in Pool(processes=2).imap_unordered(f, \n", 262 | " pair_list):\n", 263 | " if id != uid:\n", 264 | " if r_id_iid_delta is not None:\n", 265 | " list_of_ids.append(id)\n", 266 | " weighted_score += scores[uid, id]*(r_id_iid_delta)\n", 267 | "\n", 268 | " if len(list_of_ids):\n", 269 | " return means[uid] + weighted_score/scores[uid, list_of_ids].sum()\n", 270 | " else:\n", 271 | " return None" 272 | ], 273 | "execution_count": null, 274 | "outputs": [] 275 | }, 276 | { 277 | "cell_type": "markdown", 278 | "metadata": { 279 | "id": "UcS018_lubAT" 280 | }, 281 | "source": [ 282 | "### Мера сходства пользователей\n", 283 | "$$\n", 284 | " S_{u}\\bigr(u_1, u_2\\bigr) = ?\n", 285 | "$$" 286 | ] 287 | }, 288 | { 289 | "cell_type": "markdown", 290 | "metadata": { 291 | "id": "yGm7wF-9uxy3" 292 | }, 293 | "source": [ 294 | "#### Определим как ср. кв. отклоение средних оценок\n", 295 | "$$\n", 296 | " S_{u}\\bigr(u_1, u_2\\bigr) = \\exp\\bigr(-\\left(\\bar{r}_{u_1} - \\bar{r}_{u_2}\\right)^2\\bigr)\n", 297 | "$$" 298 | ] 299 | }, 300 | { 301 | "cell_type": "code", 302 | "metadata": { 303 | "id": "YXgdf2yrvN3C" 304 | }, 305 | "source": [ 306 | "def user_metric_one(u1, u2):\n", 307 | " r'''\n", 308 | " Оценка схожести объектов на основе квадрата разности средних оценок.\n", 309 | "\n", 310 | " :param u1: идентификатор первого пользователя\n", 311 | " :type u1: int\n", 312 | " :param u2: иденттификатор второго пользователя\n", 313 | " :type u2: int\n", 314 | "\n", 315 | " :return: оценку схожести объектов\n", 316 | " :rtype: float\n", 317 | " '''\n", 318 | " ru1 = means[u1]\n", 319 | " ru2 = means[u2]\n", 320 | " return np.exp(-1*(ru1 - ru2)**2)" 321 | ], 322 | "execution_count": null, 323 | "outputs": [] 324 | }, 325 | { 326 | "cell_type": "markdown", 327 | "metadata": { 328 | "id": "plNQuTh1wK8K" 329 | }, 330 | "source": [ 331 | "##### Проанализируем расстояния" 332 | ] 333 | }, 334 | { 335 | "cell_type": "code", 336 | "metadata": { 337 | "id": "rr1dR277siTt" 338 | }, 339 | "source": [ 340 | "scores = np.zeros(shape=[len(uids), len(uids)])\n", 341 | "\n", 342 | "def f(pair):\n", 343 | " i, j = pair\n", 344 | " return i, j, user_metric_one(uids[i], uids[j])\n", 345 | "\n", 346 | "pair_list = [(i, j) \\\n", 347 | " for i in range(len(uids)) \\\n", 348 | " for j in range(len(uids)) if i < j]\n", 349 | "\n", 350 | "for i, j, score in tqdm(Pool(processes=2).imap_unordered(f, pair_list), total=len(pair_list)):\n", 351 | " scores[i, j] = score\n", 352 | " scores[j, i] = score" 353 | ], 354 | "execution_count": null, 355 | "outputs": [] 356 | }, 357 | { 358 | "cell_type": "code", 359 | "metadata": { 360 | "id": "_stSFl36zPZ0" 361 | }, 362 | "source": [ 363 | "sns.heatmap(data=scores)\n", 364 | "plt.show()" 365 | ], 366 | "execution_count": null, 367 | "outputs": [] 368 | }, 369 | { 370 | "cell_type": "code", 371 | "metadata": { 372 | "id": "LIlzqdcD2gcP" 373 | }, 374 | "source": [ 375 | "%%time\n", 376 | "predict_user_score(1, 43, scores)" 377 | ], 378 | "execution_count": null, 379 | "outputs": [] 380 | }, 381 | { 382 | "cell_type": "code", 383 | "metadata": { 384 | "id": "uzKsepLpKh6a" 385 | }, 386 | "source": [ 387 | "%%time\n", 388 | "predict_user_constant(1, 43)" 389 | ], 390 | "execution_count": null, 391 | "outputs": [] 392 | }, 393 | { 394 | "cell_type": "code", 395 | "metadata": { 396 | "id": "Dbb3YKjvKGav" 397 | }, 398 | "source": [ 399 | "r(1, 43)" 400 | ], 401 | "execution_count": null, 402 | "outputs": [] 403 | }, 404 | { 405 | "cell_type": "markdown", 406 | "metadata": { 407 | "id": "5WSd4s1_PpZT" 408 | }, 409 | "source": [ 410 | "## SVD" 411 | ] 412 | }, 413 | { 414 | "cell_type": "code", 415 | "metadata": { 416 | "id": "vylxRpdQPYUe" 417 | }, 418 | "source": [ 419 | "algo = SVD()\n", 420 | "algo = algo.fit(trainset)" 421 | ], 422 | "execution_count": null, 423 | "outputs": [] 424 | }, 425 | { 426 | "cell_type": "code", 427 | "metadata": { 428 | "id": "HMsiHhOQSR8w" 429 | }, 430 | "source": [ 431 | "algo.predict('1', '43').est" 432 | ], 433 | "execution_count": null, 434 | "outputs": [] 435 | }, 436 | { 437 | "cell_type": "markdown", 438 | "metadata": { 439 | "id": "TNtdCeZtRZrg" 440 | }, 441 | "source": [ 442 | "### Матричное представление пользователей" 443 | ] 444 | }, 445 | { 446 | "cell_type": "code", 447 | "metadata": { 448 | "id": "LUXyrj6DRMee" 449 | }, 450 | "source": [ 451 | "algo.pu.shape" 452 | ], 453 | "execution_count": null, 454 | "outputs": [] 455 | }, 456 | { 457 | "cell_type": "markdown", 458 | "metadata": { 459 | "id": "tdGpdyZLRc7-" 460 | }, 461 | "source": [ 462 | "### Матричное представление товаров" 463 | ] 464 | }, 465 | { 466 | "cell_type": "code", 467 | "metadata": { 468 | "id": "4S1PatuzRSZP" 469 | }, 470 | "source": [ 471 | "algo.qi.shape" 472 | ], 473 | "execution_count": null, 474 | "outputs": [] 475 | }, 476 | { 477 | "cell_type": "markdown", 478 | "metadata": { 479 | "id": "bATSyvAeUZ9G" 480 | }, 481 | "source": [ 482 | "### Пример как предсказывается при помощи матричного разложения" 483 | ] 484 | }, 485 | { 486 | "cell_type": "code", 487 | "metadata": { 488 | "id": "3-cUCjbsSgR3" 489 | }, 490 | "source": [ 491 | "algo.trainset.to_inner_iid('43'), algo.trainset.to_inner_uid('1')" 492 | ], 493 | "execution_count": null, 494 | "outputs": [] 495 | }, 496 | { 497 | "cell_type": "code", 498 | "metadata": { 499 | "id": "Zgh8TEYJRp8V" 500 | }, 501 | "source": [ 502 | "(algo.pu[118]*algo.qi[615]).sum() + algo.bu[118] + algo.bi[615] + algo.trainset.global_mean" 503 | ], 504 | "execution_count": null, 505 | "outputs": [] 506 | } 507 | ] 508 | } -------------------------------------------------------------------------------- /sem24/main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Онлайновое обучение" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": null, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [] 16 | } 17 | ], 18 | "metadata": { 19 | "kernelspec": { 20 | "display_name": "Python 3", 21 | "language": "python", 22 | "name": "python3" 23 | }, 24 | "language_info": { 25 | "codemirror_mode": { 26 | "name": "ipython", 27 | "version": 3 28 | }, 29 | "file_extension": ".py", 30 | "mimetype": "text/x-python", 31 | "name": "python", 32 | "nbconvert_exporter": "python", 33 | "pygments_lexer": "ipython3", 34 | "version": "3.7.3" 35 | } 36 | }, 37 | "nbformat": 4, 38 | "nbformat_minor": 4 39 | } 40 | -------------------------------------------------------------------------------- /sem25/main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "kernelspec": { 6 | "display_name": "Python 3", 7 | "language": "python", 8 | "name": "python3" 9 | }, 10 | "language_info": { 11 | "codemirror_mode": { 12 | "name": "ipython", 13 | "version": 3 14 | }, 15 | "file_extension": ".py", 16 | "mimetype": "text/x-python", 17 | "name": "python", 18 | "nbconvert_exporter": "python", 19 | "pygments_lexer": "ipython3", 20 | "version": "3.7.3" 21 | }, 22 | "colab": { 23 | "name": "main.ipynb", 24 | "provenance": [], 25 | "collapsed_sections": [ 26 | "5ZRb9MHLET76", 27 | "_OkILcn8Dur5", 28 | "vtzAdAM2QNE4" 29 | ], 30 | "include_colab_link": true 31 | } 32 | }, 33 | "cells": [ 34 | { 35 | "cell_type": "markdown", 36 | "metadata": { 37 | "id": "view-in-github", 38 | "colab_type": "text" 39 | }, 40 | "source": [ 41 | "\"Open" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": { 47 | "id": "Z70JPkogCtCa" 48 | }, 49 | "source": [ 50 | "# Обучение с подкреплением" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "metadata": { 56 | "id": "20Juwpv2DSGN" 57 | }, 58 | "source": [ 59 | "## Библиоттеки" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "metadata": { 65 | "id": "iJZS6NtgCvzw" 66 | }, 67 | "source": [ 68 | "from abc import abstractmethod\n", 69 | "\n", 70 | "import numpy as np\n", 71 | "import pandas as pd\n", 72 | "\n", 73 | "import matplotlib.pyplot as plt" 74 | ], 75 | "execution_count": null, 76 | "outputs": [] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": { 81 | "id": "SV7EjK3LCwNK" 82 | }, 83 | "source": [ 84 | "## Байесовские однорукие бандиты" 85 | ] 86 | }, 87 | { 88 | "cell_type": "markdown", 89 | "metadata": { 90 | "id": "4EqdeDSMDZoY" 91 | }, 92 | "source": [ 93 | "Простейшая задача --- бандиты с распределением Бернулли.\n", 94 | "Бандиты это окружение с $K$ действиями. Действие приводит к вознаграждению $r=1$ с вероятностью $0 \\le \\theta_k \\le 1$, неизвестной агенту, но фиксированной во времени. Цель агента - минимизировать неоптимальность на фиксированном горизонте из $T$ действий:\n", 95 | "$$\\rho = T\\theta^* - \\sum_{t=1}^T r_t, \\qquad \\theta^* = \\max_k\\{\\theta_k\\}.$$" 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "metadata": { 101 | "id": "5ZRb9MHLET76" 102 | }, 103 | "source": [ 104 | "### Определим исследователя среды" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "metadata": { 110 | "id": "YHMg8EifEW4u" 111 | }, 112 | "source": [ 113 | "class AbstractAgent: \n", 114 | " def __init__(self, n_actions, seed=42):\n", 115 | " self.rs = np.random.RandomState(seed)\n", 116 | "\n", 117 | " self._successes = np.ones(n_actions)\n", 118 | " self._failures = np.ones(n_actions)\n", 119 | " self._total_pulls = 0\n", 120 | " \n", 121 | " def update(self, action, reward):\n", 122 | " self._total_pulls += 1\n", 123 | " if reward == 1:\n", 124 | " self._successes[action] += 1\n", 125 | " else:\n", 126 | " self._failures[action] += 1\n", 127 | "\n", 128 | " @abstractmethod\n", 129 | " def get_action(self):\n", 130 | " pass\n", 131 | "\n", 132 | " @property\n", 133 | " def name(self):\n", 134 | " return self.__class__.__name__\n", 135 | "\n", 136 | " @property\n", 137 | " def total(self):\n", 138 | " return self._total_pulls\n", 139 | "\n", 140 | " @property\n", 141 | " def success(self):\n", 142 | " return self._successes\n", 143 | "\n", 144 | " @property\n", 145 | " def failure(self):\n", 146 | " return self._failures" 147 | ], 148 | "execution_count": null, 149 | "outputs": [] 150 | }, 151 | { 152 | "cell_type": "markdown", 153 | "metadata": { 154 | "id": "tuCglYP0CE27" 155 | }, 156 | "source": [ 157 | "#### Default агент" 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "metadata": { 163 | "id": "H_8BYclACEbx" 164 | }, 165 | "source": [ 166 | "class DefaultAgent(AbstractAgent):\n", 167 | " def get_action(self):\n", 168 | " return np.argmax(\n", 169 | " self.success/(self.success + self.failure))" 170 | ], 171 | "execution_count": null, 172 | "outputs": [] 173 | }, 174 | { 175 | "cell_type": "markdown", 176 | "metadata": { 177 | "id": "yxf3gdDDFd8T" 178 | }, 179 | "source": [ 180 | "#### Epsilon-greedy агент" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "metadata": { 186 | "id": "09887PYBFgVC" 187 | }, 188 | "source": [ 189 | "class EpsilonGreedyAgent(AbstractAgent):\n", 190 | " def __init__(self, K, seed=42, epsilon=0.01):\n", 191 | " super().__init__(K, seed)\n", 192 | " self._epsilon = epsilon\n", 193 | "\n", 194 | " def get_action(self):\n", 195 | " if self.rs.rand() < self._epsilon:\n", 196 | " return self.rs.randint(0, self.success.shape[0])\n", 197 | " else:\n", 198 | " return np.argmax(self.success/(self.success + self.failure))" 199 | ], 200 | "execution_count": null, 201 | "outputs": [] 202 | }, 203 | { 204 | "cell_type": "markdown", 205 | "metadata": { 206 | "id": "p4cT3EjFGgnO" 207 | }, 208 | "source": [ 209 | "#### UCB агент" 210 | ] 211 | }, 212 | { 213 | "cell_type": "code", 214 | "metadata": { 215 | "id": "_jnQxxLXGdvs" 216 | }, 217 | "source": [ 218 | "class UCBAgent(AbstractAgent):\n", 219 | " def get_action(self):\n", 220 | " if self.total != 0:\n", 221 | " return np.argmax(\n", 222 | " self.success/(self.success + self.failure) \\\n", 223 | " + np.sqrt(2*np.log(self.total)/(self.success + self.failure)))\n", 224 | " else:\n", 225 | " return np.argmax(\n", 226 | " self.success/(self.success + self.failure))" 227 | ], 228 | "execution_count": null, 229 | "outputs": [] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": { 234 | "id": "7sfKYGguHY7I" 235 | }, 236 | "source": [ 237 | "#### Thompson sampling" 238 | ] 239 | }, 240 | { 241 | "cell_type": "code", 242 | "metadata": { 243 | "id": "zW7fGPxhG-5U" 244 | }, 245 | "source": [ 246 | "class ThompsonSamplingAgent(AbstractAgent):\n", 247 | " def get_action(self):\n", 248 | " return np.argmax(self.rs.beta(self.success, self.failure))" 249 | ], 250 | "execution_count": null, 251 | "outputs": [] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": { 256 | "id": "_OkILcn8Dur5" 257 | }, 258 | "source": [ 259 | "### Стационарный бандит" 260 | ] 261 | }, 262 | { 263 | "cell_type": "code", 264 | "metadata": { 265 | "id": "q1jcKxdsDO4p" 266 | }, 267 | "source": [ 268 | "class BernoulliBandit:\n", 269 | " def __init__(self, K=5, seed=42):\n", 270 | " self.rs = np.random.RandomState(seed)\n", 271 | " self._probas = self.rs.random(K)\n", 272 | "\n", 273 | " @property\n", 274 | " def action_count(self):\n", 275 | " return len(self._probas)\n", 276 | "\n", 277 | " def pull(self, action):\n", 278 | " return self.rs.choice([0, 1], p=[1-self._probas[action], self._probas[action]])\n", 279 | "\n", 280 | " def optimal_reward(self):\n", 281 | " return np.max(self._probas)\n", 282 | "\n", 283 | " def step(self):\n", 284 | " pass" 285 | ], 286 | "execution_count": null, 287 | "outputs": [] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "metadata": { 292 | "id": "iX30-1tGHxH8" 293 | }, 294 | "source": [ 295 | "agents = [\n", 296 | " DefaultAgent,\n", 297 | " EpsilonGreedyAgent,\n", 298 | " UCBAgent,\n", 299 | " ThompsonSamplingAgent\n", 300 | "]\n", 301 | "n_steps = 5000\n", 302 | "n_trials = 10\n", 303 | "K = 5\n", 304 | "\n", 305 | "scores = {\n", 306 | " agent(K).name : [0.0 for step in range(n_steps)] for agent in agents\n", 307 | "}\n", 308 | "\n", 309 | "for trial in range(n_trials):\n", 310 | " for agent in agents:\n", 311 | " bandit = BernoulliBandit(K, seed=trial)\n", 312 | " a = agent(K, seed=trial)\n", 313 | "\n", 314 | " for i in range(n_steps):\n", 315 | " optimal_reward = bandit.optimal_reward()\n", 316 | "\n", 317 | " action = a.get_action()\n", 318 | " reward = bandit.pull(action)\n", 319 | " a.update(action, reward)\n", 320 | "\n", 321 | " scores[a.name][i] += optimal_reward - reward\n", 322 | " \n", 323 | " bandit.step()\n", 324 | "\n", 325 | "plt.figure(figsize=(17, 8))\n", 326 | "for agent in agents:\n", 327 | " plt.plot(np.cumsum(scores[agent(K).name]) / n_trials, label=agent(K).name)\n", 328 | "\n", 329 | "plt.legend(loc='best')\n", 330 | "\n", 331 | "plt.ylabel(\"regret\")\n", 332 | "plt.xlabel(\"steps\")\n", 333 | "\n", 334 | "plt.show()" 335 | ], 336 | "execution_count": null, 337 | "outputs": [] 338 | }, 339 | { 340 | "cell_type": "markdown", 341 | "metadata": { 342 | "id": "vtzAdAM2QNE4" 343 | }, 344 | "source": [ 345 | "### Нестационарный бандит" 346 | ] 347 | }, 348 | { 349 | "cell_type": "code", 350 | "metadata": { 351 | "id": "wRHtXpqoPm5b" 352 | }, 353 | "source": [ 354 | "class DriftingBandit(BernoulliBandit):\n", 355 | " def __init__(self, K=5, seed=42, gamma=0.01):\n", 356 | " super().__init__(K, seed)\n", 357 | " \n", 358 | " self._gamma = gamma\n", 359 | " \n", 360 | " self._successes = np.ones(self.action_count)\n", 361 | " self._failures = np.ones(self.action_count)\n", 362 | " self._steps = 0\n", 363 | " \n", 364 | " def step(self):\n", 365 | " action = self.rs.randint(self.action_count)\n", 366 | " reward = self.pull(action)\n", 367 | "\n", 368 | " self._successes = self._successes * (1 - self._gamma) + self._gamma\n", 369 | " self._failures = self._failures * (1 - self._gamma) + self._gamma\n", 370 | " self._steps += 1\n", 371 | "\n", 372 | " self._successes[action] += reward\n", 373 | " self._failures[action] += 1.0 - reward\n", 374 | "\n", 375 | " self._probas = self.rs.beta(self._successes, self._failures)" 376 | ], 377 | "execution_count": null, 378 | "outputs": [] 379 | }, 380 | { 381 | "cell_type": "code", 382 | "metadata": { 383 | "id": "kySK3BhjQ0zn" 384 | }, 385 | "source": [ 386 | "agents = [\n", 387 | " DefaultAgent,\n", 388 | " EpsilonGreedyAgent,\n", 389 | " UCBAgent,\n", 390 | " ThompsonSamplingAgent\n", 391 | "]\n", 392 | "n_steps = 5000\n", 393 | "n_trials = 10\n", 394 | "K = 5\n", 395 | "\n", 396 | "scores = {\n", 397 | " agent(K).name : [0.0 for step in range(n_steps)] for agent in agents\n", 398 | "}\n", 399 | "\n", 400 | "for trial in range(n_trials):\n", 401 | " for agent in agents:\n", 402 | " bandit = DriftingBandit(K, seed=trial)\n", 403 | " a = agent(K, seed=trial)\n", 404 | "\n", 405 | " for i in range(n_steps):\n", 406 | " optimal_reward = bandit.optimal_reward()\n", 407 | "\n", 408 | " action = a.get_action()\n", 409 | " reward = bandit.pull(action)\n", 410 | " a.update(action, reward)\n", 411 | " scores[a.name][i] += optimal_reward - reward\n", 412 | " \n", 413 | " bandit.step()\n", 414 | "\n", 415 | "plt.figure(figsize=(17, 8))\n", 416 | "for agent in agents:\n", 417 | " plt.plot(np.cumsum(scores[agent(K).name]) / n_trials, label=agent(K).name)\n", 418 | "\n", 419 | "plt.legend(loc='best')\n", 420 | "\n", 421 | "plt.ylabel(\"regret\")\n", 422 | "plt.xlabel(\"steps\")\n", 423 | "\n", 424 | "plt.show()" 425 | ], 426 | "execution_count": null, 427 | "outputs": [] 428 | }, 429 | { 430 | "cell_type": "markdown", 431 | "metadata": { 432 | "id": "yguSf4FpRHEY" 433 | }, 434 | "source": [ 435 | "#### Агент учитывающий нестационарность" 436 | ] 437 | }, 438 | { 439 | "cell_type": "code", 440 | "metadata": { 441 | "id": "vI30H5nXQ5y7" 442 | }, 443 | "source": [ 444 | "class BrakeMemoryAgent(AbstractAgent):\n", 445 | " def get_action(self):\n", 446 | " if self.total % 700 == 0:\n", 447 | " self._successes=self._successes*0+1\n", 448 | " self._failures=self._failures*0+1\n", 449 | " return np.argmax(self.rs.beta(self._successes, self._failures))" 450 | ], 451 | "execution_count": null, 452 | "outputs": [] 453 | }, 454 | { 455 | "cell_type": "code", 456 | "metadata": { 457 | "id": "leV0ZcgkRVUD" 458 | }, 459 | "source": [ 460 | "agents = [\n", 461 | " DefaultAgent,\n", 462 | " EpsilonGreedyAgent,\n", 463 | " UCBAgent,\n", 464 | " ThompsonSamplingAgent,\n", 465 | " BrakeMemoryAgent\n", 466 | "]\n", 467 | "n_steps = 5000\n", 468 | "n_trials = 10\n", 469 | "K = 5\n", 470 | "\n", 471 | "scores = {\n", 472 | " agent(K).name : [0.0 for step in range(n_steps)] for agent in agents\n", 473 | "}\n", 474 | "\n", 475 | "for trial in range(n_trials):\n", 476 | " for agent in agents:\n", 477 | " bandit = DriftingBandit(K, seed=trial)\n", 478 | " a = agent(K, seed=trial)\n", 479 | "\n", 480 | " for i in range(n_steps):\n", 481 | " optimal_reward = bandit.optimal_reward()\n", 482 | "\n", 483 | " action = a.get_action()\n", 484 | " reward = bandit.pull(action)\n", 485 | " a.update(action, reward)\n", 486 | " scores[a.name][i] += optimal_reward - reward\n", 487 | " \n", 488 | " bandit.step()\n", 489 | "\n", 490 | "plt.figure(figsize=(17, 8))\n", 491 | "for agent in agents:\n", 492 | " plt.plot(np.cumsum(scores[agent(K).name]) / n_trials, label=agent(K).name)\n", 493 | "\n", 494 | "plt.legend(loc='best')\n", 495 | "plt.ylabel(\"regret\")\n", 496 | "plt.xlabel(\"steps\")\n", 497 | "\n", 498 | "plt.show()" 499 | ], 500 | "execution_count": null, 501 | "outputs": [] 502 | }, 503 | { 504 | "cell_type": "markdown", 505 | "metadata": { 506 | "id": "Cb6vpn5aS3XS" 507 | }, 508 | "source": [ 509 | "## Задача о заплыве" 510 | ] 511 | }, 512 | { 513 | "cell_type": "markdown", 514 | "metadata": { 515 | "id": "QUBvsySfTDT2" 516 | }, 517 | "source": [ 518 | "Задача на основе марковских процесов.\n", 519 | "\n", 520 | "https://arxiv.org/pdf/1306.0940.pdf" 521 | ] 522 | }, 523 | { 524 | "cell_type": "code", 525 | "metadata": { 526 | "id": "hhn4b5VERZGN" 527 | }, 528 | "source": [ 529 | "class RiverSwim:\n", 530 | " def __init__(self, \n", 531 | " isc = 4, # число состояний (без учета крайних)\n", 532 | " ms = 16, # максимальное число шагов\n", 533 | " lr = 5/1000, \n", 534 | " rr = 1.0, \n", 535 | " seed = 42):\n", 536 | " self.rs = np.random.RandomState(seed)\n", 537 | " self._max_steps = ms\n", 538 | " self._interm_states = isc\n", 539 | "\n", 540 | " self._steps = 0\n", 541 | " self._current_state = 1\n", 542 | "\n", 543 | " self.lr = lr\n", 544 | " self.rr = rr\n", 545 | " \n", 546 | " @property\n", 547 | " def action_count(self):\n", 548 | " return 2\n", 549 | " \n", 550 | " @property\n", 551 | " def states_count(self):\n", 552 | " return 2 + self._interm_states\n", 553 | " \n", 554 | " def _get_probs(self, action):\n", 555 | " if action == 0:\n", 556 | " if self._current_state == 0:\n", 557 | " return [0.00, 1.00, 0.00]\n", 558 | " else:\n", 559 | " return [1.00, 0.00, 0.00]\n", 560 | " \n", 561 | " elif action == 1:\n", 562 | " if self._current_state == 0:\n", 563 | " return [0.00, 0.40, 0.60]\n", 564 | " if self._current_state == self.states_count - 1:\n", 565 | " return [0.40, 0.60, 0.00]\n", 566 | " else:\n", 567 | " return [0.05, 0.60, 0.35]\n", 568 | "\n", 569 | " def step(self, action):\n", 570 | " reward = 0.0\n", 571 | " if self._steps >= self._max_steps:\n", 572 | " return self._current_state, reward, True\n", 573 | " \n", 574 | " transition = self.rs.choice(range(3), p=self._get_probs(action))\n", 575 | " if transition == 0:\n", 576 | " self._current_state -= 1\n", 577 | " elif transition == 1:\n", 578 | " pass\n", 579 | " else:\n", 580 | " self._current_state += 1\n", 581 | "\n", 582 | " if self._current_state == 0:\n", 583 | " reward = self.lr\n", 584 | " elif self._current_state == self.states_count - 1:\n", 585 | " reward = self.rr\n", 586 | " \n", 587 | " self._steps += 1\n", 588 | " return self._current_state, reward, False" 589 | ], 590 | "execution_count": null, 591 | "outputs": [] 592 | }, 593 | { 594 | "cell_type": "code", 595 | "metadata": { 596 | "id": "lp-h9hQ3WAyw" 597 | }, 598 | "source": [ 599 | "class QLearningAgent:\n", 600 | " def __init__(self, n, K, lr=0.2, gamma=0.95, epsilon=0.2, seed=42):\n", 601 | " self.rs = np.random.RandomState(seed)\n", 602 | " self._gamma = gamma\n", 603 | " self._epsilon = epsilon\n", 604 | " self._q_matrix = np.zeros((n, K))\n", 605 | " self._lr = lr\n", 606 | "\n", 607 | " def get_action(self, state):\n", 608 | " if self.rs.random() < self._epsilon:\n", 609 | " return self.rs.randint(0, self._q_matrix.shape[1])\n", 610 | " else:\n", 611 | " return np.argmax(self._q_matrix[state])\n", 612 | " \n", 613 | " def get_q_matrix(self):\n", 614 | " return self._q_matrix\n", 615 | " \n", 616 | " def start_episode(self):\n", 617 | " pass\n", 618 | "\n", 619 | " def update(self, state, action, reward, next_state):\n", 620 | " self._q_matrix[state, action] = self._q_matrix[state, action] + self._lr*(reward + self._gamma*np.max(self._q_matrix[next_state]) - self._q_matrix[state, action])\n", 621 | " return\n" 622 | ], 623 | "execution_count": null, 624 | "outputs": [] 625 | }, 626 | { 627 | "cell_type": "code", 628 | "metadata": { 629 | "id": "C4FuuDBXWeUr" 630 | }, 631 | "source": [ 632 | "n = 2\n", 633 | "ms = 128\n", 634 | "episodes = 500\n", 635 | "actions = 2\n", 636 | "\n", 637 | "agent = QLearningAgent(2+n, actions)\n", 638 | "\n", 639 | "episode_rewards = []\n", 640 | "for ep in range(episodes):\n", 641 | " river_swim = RiverSwim(n, ms)\n", 642 | "\n", 643 | " state, ep_reward, is_done = river_swim._current_state, 0.0, False\n", 644 | " agent.start_episode()\n", 645 | " while not is_done:\n", 646 | " action = agent.get_action(state)\n", 647 | " next_state, reward, is_done = river_swim.step(action)\n", 648 | " agent.update(state, action, reward, next_state)\n", 649 | " \n", 650 | " state = next_state\n", 651 | " ep_reward += reward\n", 652 | " \n", 653 | " episode_rewards.append(ep_reward)\n", 654 | "\n", 655 | "\n", 656 | "plt.figure(figsize=(15, 8))\n", 657 | "\n", 658 | "plt.plot(pd.DataFrame(np.array(episode_rewards)).ewm(alpha=.1).mean())\n", 659 | "plt.xlabel(\"Episode count\")\n", 660 | "plt.ylabel(\"Reward\")\n", 661 | "plt.show()" 662 | ], 663 | "execution_count": null, 664 | "outputs": [] 665 | }, 666 | { 667 | "cell_type": "code", 668 | "metadata": { 669 | "id": "ye0DvZo7Xw_n" 670 | }, 671 | "source": [ 672 | "fig = plt.figure(figsize=(15, 8))\n", 673 | "ax = fig.add_subplot(111)\n", 674 | "ax.matshow(agent.get_q_matrix().T)\n", 675 | "ax.set_yticklabels(['', 'no act', 'swim'])\n", 676 | "plt.xlabel(\"State\")\n", 677 | "plt.ylabel(\"Action\")\n", 678 | "plt.title(\"Values of state-action pairs\")\n", 679 | "plt.show()" 680 | ], 681 | "execution_count": null, 682 | "outputs": [] 683 | } 684 | ] 685 | } -------------------------------------------------------------------------------- /sem26/main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "kernelspec": { 6 | "display_name": "Python 3", 7 | "language": "python", 8 | "name": "python3" 9 | }, 10 | "language_info": { 11 | "codemirror_mode": { 12 | "name": "ipython", 13 | "version": 3 14 | }, 15 | "file_extension": ".py", 16 | "mimetype": "text/x-python", 17 | "name": "python", 18 | "nbconvert_exporter": "python", 19 | "pygments_lexer": "ipython3", 20 | "version": "3.7.3" 21 | }, 22 | "colab": { 23 | "name": "main.ipynb", 24 | "provenance": [] 25 | } 26 | }, 27 | "cells": [ 28 | { 29 | "cell_type": "markdown", 30 | "metadata": { 31 | "id": "jfB6YOi2DZ8s" 32 | }, 33 | "source": [ 34 | "# Активное обучение" 35 | ] 36 | }, 37 | { 38 | "cell_type": "markdown", 39 | "metadata": { 40 | "id": "2b9RnLilDZ80" 41 | }, 42 | "source": [ 43 | "## Библиотеки" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "metadata": { 49 | "id": "lfTN4O55Kysr" 50 | }, 51 | "source": [ 52 | "!pip install modAL" 53 | ], 54 | "execution_count": null, 55 | "outputs": [] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "metadata": { 60 | "id": "dRlX5YbBDZ81" 61 | }, 62 | "source": [ 63 | "from abc import abstractmethod\n", 64 | "\n", 65 | "import numpy as np\n", 66 | "import pandas as pd\n", 67 | "\n", 68 | "import matplotlib.pyplot as plt\n", 69 | "from matplotlib import animation\n", 70 | "\n", 71 | "from IPython.display import HTML\n", 72 | "\n", 73 | "from modAL.models import ActiveLearner\n", 74 | "from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor\n", 75 | "from sklearn.gaussian_process import GaussianProcessRegressor\n", 76 | "\n", 77 | "from sklearn.svm import SVR" 78 | ], 79 | "execution_count": null, 80 | "outputs": [] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "metadata": { 85 | "id": "_Lc4qRs8dSRo" 86 | }, 87 | "source": [ 88 | "import warnings\n", 89 | "warnings.filterwarnings(\"ignore\")" 90 | ], 91 | "execution_count": null, 92 | "outputs": [] 93 | }, 94 | { 95 | "cell_type": "markdown", 96 | "metadata": { 97 | "id": "ag0-ahyWLIzy" 98 | }, 99 | "source": [ 100 | "## Пример активного обучения" 101 | ] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "metadata": { 106 | "id": "SBg1DPVUZbVE" 107 | }, 108 | "source": [ 109 | "### Определим асессора, который будет размечать данные нужные в рамках алгоритма активного обучения" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "metadata": { 115 | "id": "ASTWvAvGLDYW" 116 | }, 117 | "source": [ 118 | "class Assessor:\n", 119 | " def __init__(self, function, epsilon=0.1):\n", 120 | " self.function = function\n", 121 | " self.epsilon = epsilon\n", 122 | "\n", 123 | " def __call__(self, x):\n", 124 | " r'''\n", 125 | " :param x: Array\n", 126 | " '''\n", 127 | " return self.function(x, self.epsilon)" 128 | ], 129 | "execution_count": null, 130 | "outputs": [] 131 | }, 132 | { 133 | "cell_type": "markdown", 134 | "metadata": { 135 | "id": "keHHYBuZZjiU" 136 | }, 137 | "source": [ 138 | "### Данные" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "metadata": { 144 | "id": "fGkr1mSQMSA1" 145 | }, 146 | "source": [ 147 | "np.random.seed(42)\n", 148 | "\n", 149 | "l = 500\n", 150 | "m = 5\n", 151 | "n_queries = 150\n", 152 | "\n", 153 | "X = np.linspace(0, 10, m).reshape(-1, 1)\n", 154 | "\n", 155 | "y = (np.sin(X) + 0.5*np.random.randn(m, 1)).reshape(-1)\n", 156 | "\n", 157 | "_X = np.linspace(0, 10, l).reshape(-1, 1)" 158 | ], 159 | "execution_count": null, 160 | "outputs": [] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "metadata": { 165 | "id": "6y8TuTWzMC87" 166 | }, 167 | "source": [ 168 | "assessor = Assessor(lambda x, epsilon: (np.sin(x) + epsilon*np.random.randn(*(x).shape)).reshape(-1))" 169 | ], 170 | "execution_count": null, 171 | "outputs": [] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "metadata": { 176 | "id": "2XXmlpnKZlEm" 177 | }, 178 | "source": [ 179 | "### Рассмотрим наш любимый синус" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "metadata": { 185 | "id": "jl3tTSmzPnU9" 186 | }, 187 | "source": [ 188 | "plt.figure(figsize=(8, 4))\n", 189 | "\n", 190 | "plt.plot(np.linspace(0, 10, 100), \n", 191 | " np.sin(np.linspace(0, 10, 100).reshape(-1, 1)))\n", 192 | "\n", 193 | "plt.scatter(X, y, color='red')\n", 194 | "plt.title('Initial dataset')\n", 195 | "plt.show()" 196 | ], 197 | "execution_count": null, 198 | "outputs": [] 199 | }, 200 | { 201 | "cell_type": "markdown", 202 | "metadata": { 203 | "id": "FboTuR9CZwYu" 204 | }, 205 | "source": [ 206 | "### Определим активное обучение, которое семплирует случайные объекты" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "metadata": { 212 | "id": "PXfA-CpRNnz-" 213 | }, 214 | "source": [ 215 | "def random_sampling(classifier, X_pool):\n", 216 | " n_samples = len(X_pool)\n", 217 | " query_idx = np.random.choice(range(n_samples))\n", 218 | " return query_idx, X_pool[query_idx]\n", 219 | "\n", 220 | "learner = ActiveLearner(\n", 221 | " estimator=SVR(),\n", 222 | " query_strategy=random_sampling,\n", 223 | " X_training=X, y_training=y\n", 224 | ")" 225 | ], 226 | "execution_count": null, 227 | "outputs": [] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "metadata": { 232 | "id": "yJmWJ7dAZ5H8" 233 | }, 234 | "source": [ 235 | "### Посмотрим на начальную инициализацию" 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "metadata": { 241 | "id": "tVRXBfOGO6Fc" 242 | }, 243 | "source": [ 244 | "plt.figure(figsize=(8, 4))\n", 245 | "\n", 246 | "pred = learner.predict(_X.reshape(-1, 1))\n", 247 | "plt.plot(_X, pred)\n", 248 | "\n", 249 | "plt.scatter(X, y, color='red')\n", 250 | "plt.title('Initial estimation based on %d points' % len(X))\n", 251 | "plt.show()" 252 | ], 253 | "execution_count": null, 254 | "outputs": [] 255 | }, 256 | { 257 | "cell_type": "markdown", 258 | "metadata": { 259 | "id": "0FLIuC-GZ8So" 260 | }, 261 | "source": [ 262 | "### Начнем обучать и собирать историю" 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "metadata": { 268 | "id": "gz3QiA-pVrHZ" 269 | }, 270 | "source": [ 271 | "learning_history = []\n", 272 | "learning_history_point = []\n", 273 | "\n", 274 | "pred = learner.predict(_X.reshape(-1, 1))\n", 275 | "learning_history.append(pred)" 276 | ], 277 | "execution_count": null, 278 | "outputs": [] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "metadata": { 283 | "id": "qxSVVzY9RCiO" 284 | }, 285 | "source": [ 286 | "for idx in range(n_queries):\n", 287 | " query_idx, query_instance = learner.query(_X)\n", 288 | " assessor_pred = assessor(query_instance)\n", 289 | " learner.teach(query_instance.reshape(-1, 1), assessor_pred.reshape(-1))\n", 290 | "\n", 291 | " pred = learner.predict(_X.reshape(-1, 1))\n", 292 | " learning_history.append(pred)\n", 293 | " learning_history_point.append((query_instance, assessor_pred))" 294 | ], 295 | "execution_count": null, 296 | "outputs": [] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "metadata": { 301 | "id": "i6r-7PhyRDhj" 302 | }, 303 | "source": [ 304 | "plt.figure(figsize=(8, 4))\n", 305 | "\n", 306 | "pred = learner.predict(_X.reshape(-1, 1))\n", 307 | "plt.plot(_X, pred)\n", 308 | "\n", 309 | "plt.scatter(X, y, color='red')\n", 310 | "plt.scatter([item[0] for item in learning_history_point], \n", 311 | " [item[1] for item in learning_history_point])\n", 312 | "plt.title('Estimated after %d points' % n_queries)\n", 313 | "plt.show()" 314 | ], 315 | "execution_count": null, 316 | "outputs": [] 317 | }, 318 | { 319 | "cell_type": "markdown", 320 | "metadata": { 321 | "id": "_nmQtc4NaHcS" 322 | }, 323 | "source": [ 324 | "### Посмотрим на визуализацию" 325 | ] 326 | }, 327 | { 328 | "cell_type": "code", 329 | "metadata": { 330 | "id": "V3TTu5oAWIyp" 331 | }, 332 | "source": [ 333 | "fps = 1 # frame per sec\n", 334 | "frn = len(learning_history) # frame number of the animation" 335 | ], 336 | "execution_count": null, 337 | "outputs": [] 338 | }, 339 | { 340 | "cell_type": "code", 341 | "metadata": { 342 | "id": "atzB1pq7ThTf" 343 | }, 344 | "source": [ 345 | "def update_plot(frame_number, learning_history, learning_history_point, plot):\n", 346 | " plot[0] = ax.plot(_X, learning_history[frame_number])\n", 347 | "\n", 348 | " plot[2] = ax.scatter([item[0] for item in learning_history_point[frame_number:frame_number + 1]], \n", 349 | " [item[1] for item in learning_history_point[frame_number:frame_number + 1]])\n", 350 | "\n", 351 | "fig = plt.figure(figsize=(8.0, 4.0), frameon=False)\n", 352 | "\n", 353 | "ax = fig.add_subplot(111)\n", 354 | "\n", 355 | "plot = [None, None, None]\n", 356 | "plot[0] = ax.plot(_X, learning_history[0])\n", 357 | "plot[1] = ax.scatter(X, y, color='red')\n", 358 | "\n", 359 | "plt.autoscale(tight=True)\n", 360 | "\n", 361 | "ani = animation.FuncAnimation(\n", 362 | " fig, update_plot, frn, fargs=(learning_history, learning_history_point, plot), interval=1000/fps, blit=False)" 363 | ], 364 | "execution_count": null, 365 | "outputs": [] 366 | }, 367 | { 368 | "cell_type": "code", 369 | "metadata": { 370 | "id": "pKNXBqiFaSwj" 371 | }, 372 | "source": [ 373 | "HTML(ani.to_jshtml())" 374 | ], 375 | "execution_count": null, 376 | "outputs": [] 377 | }, 378 | { 379 | "cell_type": "markdown", 380 | "metadata": { 381 | "id": "PDtgFSPbas8c" 382 | }, 383 | "source": [ 384 | "### Пример выбора точки, для которой максимальная дисперсия" 385 | ] 386 | }, 387 | { 388 | "cell_type": "code", 389 | "metadata": { 390 | "id": "W9qv1UOjayfZ" 391 | }, 392 | "source": [ 393 | "def max_std_sampling(classifier, X_pool):\n", 394 | " _, std = classifier.predict(X_pool, return_std=True)\n", 395 | " return np.argmax(std)\n", 396 | "\n", 397 | "learner = ActiveLearner(\n", 398 | " estimator=GaussianProcessRegressor(),\n", 399 | " query_strategy=max_std_sampling,\n", 400 | " X_training=X, y_training=y\n", 401 | ")" 402 | ], 403 | "execution_count": null, 404 | "outputs": [] 405 | }, 406 | { 407 | "cell_type": "code", 408 | "metadata": { 409 | "id": "WFObum50bJ7h" 410 | }, 411 | "source": [ 412 | "plt.figure(figsize=(8, 4))\n", 413 | "\n", 414 | "pred = learner.predict(_X.reshape(-1, 1))\n", 415 | "plt.plot(_X, pred)\n", 416 | "\n", 417 | "plt.scatter(X, y, color='red')\n", 418 | "plt.title('Initial estimation based on %d points' % len(X))\n", 419 | "plt.show()" 420 | ], 421 | "execution_count": null, 422 | "outputs": [] 423 | }, 424 | { 425 | "cell_type": "code", 426 | "metadata": { 427 | "id": "3q6Bje2obO7R" 428 | }, 429 | "source": [ 430 | "learning_history = []\n", 431 | "learning_history_point = []\n", 432 | "\n", 433 | "pred = learner.predict(_X.reshape(-1, 1))\n", 434 | "learning_history.append(pred)" 435 | ], 436 | "execution_count": null, 437 | "outputs": [] 438 | }, 439 | { 440 | "cell_type": "code", 441 | "metadata": { 442 | "id": "HyjlZyXJb0yS" 443 | }, 444 | "source": [ 445 | "for idx in range(n_queries):\n", 446 | " query_idx, query_instance = learner.query(_X)\n", 447 | " assessor_pred = assessor(query_instance)\n", 448 | " learner.teach(query_instance.reshape(-1, 1), assessor_pred.reshape(-1))\n", 449 | "\n", 450 | " pred = learner.predict(_X.reshape(-1, 1))\n", 451 | " learning_history.append(pred)\n", 452 | " learning_history_point.append((query_instance, assessor_pred))" 453 | ], 454 | "execution_count": null, 455 | "outputs": [] 456 | }, 457 | { 458 | "cell_type": "code", 459 | "metadata": { 460 | "id": "C9GlsVGIb2_m" 461 | }, 462 | "source": [ 463 | "plt.figure(figsize=(8, 4))\n", 464 | "\n", 465 | "pred = learner.predict(_X.reshape(-1, 1))\n", 466 | "plt.plot(_X, pred)\n", 467 | "\n", 468 | "plt.scatter(X, y, color='red')\n", 469 | "plt.scatter([item[0] for item in learning_history_point], \n", 470 | " [item[1] for item in learning_history_point])\n", 471 | "plt.title('Estimated after %d points' % n_queries)\n", 472 | "plt.show()" 473 | ], 474 | "execution_count": null, 475 | "outputs": [] 476 | }, 477 | { 478 | "cell_type": "markdown", 479 | "metadata": { 480 | "id": "lWwLWmWIdd8u" 481 | }, 482 | "source": [ 483 | "### Посмотрим на визуализацию" 484 | ] 485 | }, 486 | { 487 | "cell_type": "code", 488 | "metadata": { 489 | "id": "zkYhyYgodd8v" 490 | }, 491 | "source": [ 492 | "fps = 1 # frame per sec\n", 493 | "frn = len(learning_history) # frame number of the animation" 494 | ], 495 | "execution_count": null, 496 | "outputs": [] 497 | }, 498 | { 499 | "cell_type": "code", 500 | "metadata": { 501 | "id": "l3SPXevGdd8v" 502 | }, 503 | "source": [ 504 | "def update_plot(frame_number, learning_history, learning_history_point, plot):\n", 505 | " plot[0] = ax.plot(_X, learning_history[frame_number])\n", 506 | "\n", 507 | " plot[2] = ax.scatter([item[0] for item in learning_history_point[frame_number:frame_number + 1]], \n", 508 | " [item[1] for item in learning_history_point[frame_number:frame_number + 1]])\n", 509 | "\n", 510 | "fig = plt.figure(figsize=(8.0, 4.0), frameon=False)\n", 511 | "\n", 512 | "ax = fig.add_subplot(111)\n", 513 | "\n", 514 | "plot = [None, None, None]\n", 515 | "plot[0] = ax.plot(_X, learning_history[0])\n", 516 | "plot[1] = ax.scatter(X, y, color='red')\n", 517 | "\n", 518 | "plt.autoscale(tight=True)\n", 519 | "\n", 520 | "ani = animation.FuncAnimation(\n", 521 | " fig, update_plot, frn, fargs=(learning_history, learning_history_point, plot), interval=1000/fps, blit=False)" 522 | ], 523 | "execution_count": null, 524 | "outputs": [] 525 | }, 526 | { 527 | "cell_type": "code", 528 | "metadata": { 529 | "id": "iqon_2J8dd8w" 530 | }, 531 | "source": [ 532 | "HTML(ani.to_jshtml())" 533 | ], 534 | "execution_count": null, 535 | "outputs": [] 536 | }, 537 | { 538 | "cell_type": "markdown", 539 | "source": [ 540 | "### Пример выбора точки, для которой максимальная дисперсия по наименьшему измениную признакового описания" 541 | ], 542 | "metadata": { 543 | "id": "PQ3OnVV9Rsr8" 544 | } 545 | }, 546 | { 547 | "cell_type": "code", 548 | "source": [ 549 | "def max_unst_sampling(classifier, X_pool):\n", 550 | " probas = []\n", 551 | " for _ in range(100):\n", 552 | " proba = classifier.predict(X_pool + 0.1*np.random.randn(*X_pool.shape))\n", 553 | " probas.append(proba)\n", 554 | " probas_std = np.array(probas).std(0)\n", 555 | " return np.argmax(probas_std)\n", 556 | "\n", 557 | "learner = ActiveLearner(\n", 558 | " estimator=SVR(),\n", 559 | " query_strategy=max_unst_sampling,\n", 560 | " X_training=X, y_training=y\n", 561 | ")" 562 | ], 563 | "metadata": { 564 | "id": "02Xu7yBnRp7Z" 565 | }, 566 | "execution_count": null, 567 | "outputs": [] 568 | }, 569 | { 570 | "cell_type": "code", 571 | "source": [ 572 | "plt.figure(figsize=(8, 4))\n", 573 | "\n", 574 | "pred = learner.predict(_X.reshape(-1, 1))\n", 575 | "plt.plot(_X, pred)\n", 576 | "\n", 577 | "plt.scatter(X, y, color='red')\n", 578 | "plt.title('Initial estimation based on %d points' % len(X))\n", 579 | "plt.show()" 580 | ], 581 | "metadata": { 582 | "id": "qOHh9TRHTE_0" 583 | }, 584 | "execution_count": null, 585 | "outputs": [] 586 | }, 587 | { 588 | "cell_type": "code", 589 | "metadata": { 590 | "id": "tM78FfKpTcLn" 591 | }, 592 | "source": [ 593 | "learning_history = []\n", 594 | "learning_history_point = []\n", 595 | "\n", 596 | "pred = learner.predict(_X.reshape(-1, 1))\n", 597 | "learning_history.append(pred)" 598 | ], 599 | "execution_count": null, 600 | "outputs": [] 601 | }, 602 | { 603 | "cell_type": "code", 604 | "metadata": { 605 | "id": "-GRWl27bTcLp" 606 | }, 607 | "source": [ 608 | "used_idx = []\n", 609 | "for idx in range(n_queries):\n", 610 | " query_idx, query_instance = learner.query(_X)\n", 611 | " assessor_pred = assessor(query_instance)\n", 612 | " learner.teach(query_instance.reshape(-1, 1), assessor_pred.reshape(-1))\n", 613 | "\n", 614 | " pred = learner.predict(_X.reshape(-1, 1))\n", 615 | " learning_history.append(pred)\n", 616 | " learning_history_point.append((query_instance, assessor_pred))" 617 | ], 618 | "execution_count": null, 619 | "outputs": [] 620 | }, 621 | { 622 | "cell_type": "code", 623 | "metadata": { 624 | "id": "nSshI0T4TcLq" 625 | }, 626 | "source": [ 627 | "plt.figure(figsize=(8, 4))\n", 628 | "\n", 629 | "pred = learner.predict(_X.reshape(-1, 1))\n", 630 | "plt.plot(_X, pred)\n", 631 | "\n", 632 | "plt.scatter(X, y, color='red')\n", 633 | "plt.scatter([item[0] for item in learning_history_point], \n", 634 | " [item[1] for item in learning_history_point])\n", 635 | "plt.title('Estimated after %d points' % n_queries)\n", 636 | "plt.show()" 637 | ], 638 | "execution_count": null, 639 | "outputs": [] 640 | } 641 | ] 642 | } -------------------------------------------------------------------------------- /sem27/main.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem27/main.PNG -------------------------------------------------------------------------------- /sem27/main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "slideshow": { 7 | "slide_type": "slide" 8 | } 9 | }, 10 | "source": [ 11 | "# Posterior Sampling" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "slideshow": { 18 | "slide_type": "slide" 19 | } 20 | }, 21 | "source": [ 22 | "![image](main.png)" 23 | ] 24 | } 25 | ], 26 | "metadata": { 27 | "celltoolbar": "Slideshow", 28 | "kernelspec": { 29 | "display_name": "Python 3", 30 | "language": "python", 31 | "name": "python3" 32 | }, 33 | "language_info": { 34 | "codemirror_mode": { 35 | "name": "ipython", 36 | "version": 3 37 | }, 38 | "file_extension": ".py", 39 | "mimetype": "text/x-python", 40 | "name": "python", 41 | "nbconvert_exporter": "python", 42 | "pygments_lexer": "ipython3", 43 | "version": "3.7.3" 44 | } 45 | }, 46 | "nbformat": 4, 47 | "nbformat_minor": 4 48 | } 49 | -------------------------------------------------------------------------------- /sem29/main.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "sem29.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "authorship_tag": "ABX9TyPWvTrNJruH5kKkNCNRutip" 10 | }, 11 | "kernelspec": { 12 | "name": "python3", 13 | "display_name": "Python 3" 14 | }, 15 | "language_info": { 16 | "name": "python" 17 | } 18 | }, 19 | "cells": [ 20 | { 21 | "cell_type": "markdown", 22 | "source": [ 23 | "1. Решающие деревья? Какой у них принцип работы. И какой критерий для выбора \n", 24 | "параметров дерева? Какие есть гиперпараметры? Что делать с регрессией?\n", 25 | "2. Логистическая регрессия. Что это? Какую задачу решает? Какая функция потерь? Как найти оптимальные параметры модели? Каково обобщение на случай многоклассовой классификации?\n", 26 | "3. SVM, что это такое? Как строится? Ядра в SVM? Обобщение для регрессии?\n", 27 | "4. Линейная регрессия? Как работает? Как находится оптимальное значение параметров? В чем проявляется проблема линейно зависимых объектов? Как эта проблема решается? Вероятностная интерпретации регуляризации?\n", 28 | "5. Какие есть виды ансамблирования моделей? В чем отличие бэггина и бустинга? В каких случаях лучше использовать бэггинг, а в какие бустинг? Какие примеры бустинга знаете? Примеры бэггинга?\n", 29 | "6. Какие способы отбора признаков знаете? Используя $L_1$ регуляризацию, пояснить, почему она зануляет параметры. Метод AddDel для отбора признаков (жадный алгоритм, принцип работы). Статистические методы отбора признаков (критерий Фишера). Методы на основе анализа мультиколинеарности параметров (метод Белсли, SVD разложение).\n", 30 | "7. Деление выборки на обучение и контроль случайным образом. В чем могут быть проблемы?\n", 31 | "8. Полносвязная нейронная сеть. Какие есть функции активации. Проблемы полносвязных сетей. Способы регуляризации нейросетевых моделей. Паралич сети, что это такое? Как обучать нейросеть? Метод обратного распространения градиента (метод прямого распространения градиента).\n", 32 | "9. Что такое RNN, принцип работы? Какие проблемы есть с RNN? LSTM/GRU, что это такое, какие проблемы решает? GradientCliping, какие проблемы решает?\n", 33 | "10. Сверточные сети. В чем идея? Что такое свертка, какие есть параметры? Какие другие слои присутсвуют? Модель ResNet, в чем особености? Дообучение нейросетевых моделей под конкретную задачу на основе предобученных моделей.\n", 34 | "11. Автокодировщики. Что это такое и зачем нужно? Линейный автокодировщик (PCA). Вариационный автокодировщик, принцип работы, и основная идея. GANs, в чем отличие от автокодировщика, основная идея использования.\n", 35 | "12. RL, в чем основная идея? Пример на основе байесовских бандитов. Пример на основе задачки из ДЗ, про заплыв.\n", 36 | "13. Активное обучение, какие проблемы решает? Какие методы знаете?\n", 37 | "14. Постановки задачи машинного обучени.\n", 38 | " - Пример 1: Поиск заимствований. Что такое объект, а что такое ответ?\n", 39 | " - Пример 2: Поиск грамматических ошибок. Что такое объект, а что такое ответ?\n", 40 | "15. Модель KNN, что это такое и в чем особености? Какие есть гиперпараметры, какие есть ядра? Какие есть проблемы и как их решать? Есои мало оперативной память на компьютере, что лучше использовать KNN или логистическую регрессию в момент предсказания (не обучения).\n", 41 | "16. Какие методы кластеризации известны? Какие ограничения есть на использования этих методов. Какие методы не используют информации об числе кластеров. EM-алгоритм, принцип работы.\n", 42 | "17. Тематическое моделирование. Что это такое, зачем нужно. Примеры регуляризаторов, зачем нужны. EM-алгоритм, как он тут используется (пример на основе скрытой переменной темы).\n", 43 | "18. Ранжирующие системы, поисковые системы. Зачем нужны, основной принцип работы." 44 | ], 45 | "metadata": { 46 | "id": "-QC-DMysZgYL" 47 | } 48 | } 49 | ] 50 | } 51 | -------------------------------------------------------------------------------- /sem3/fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem3/fig1.png -------------------------------------------------------------------------------- /sem3/fig2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem3/fig2.png -------------------------------------------------------------------------------- /sem3/fig3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem3/fig3.png -------------------------------------------------------------------------------- /sem3/fig4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem3/fig4.png -------------------------------------------------------------------------------- /sem3/requirements.txt: -------------------------------------------------------------------------------- 1 | matplotlib==2.1.0 2 | seaborn==0.9.0 3 | pandas==1.0.5 4 | tqdm==4.48.2 5 | scipy==1.3.3 6 | numpy==1.19.1 7 | torch==1.9.0 8 | scikit-learn==0.23.2 9 | torchvision==0.10.1 10 | -------------------------------------------------------------------------------- /sem4/requirements.txt: -------------------------------------------------------------------------------- 1 | matplotlib==3.1.3 2 | seaborn==0.11.2 3 | pandas==1.0.5 4 | tqdm==4.48.2 5 | scipy==1.3.3 6 | numpy==1.19.1 7 | torch==1.9.0 8 | scikit-learn==0.23.2 9 | mlxtend==0.19.0 -------------------------------------------------------------------------------- /sem5/requirements.txt: -------------------------------------------------------------------------------- 1 | matplotlib==3.1.3 2 | seaborn==0.11.2 3 | pandas==1.0.5 4 | tqdm==4.48.2 5 | scipy==1.3.3 6 | numpy==1.19.1 7 | torch==1.9.0 8 | scikit-learn==0.23.2 9 | mlxtend==0.19.0 -------------------------------------------------------------------------------- /sem6/lecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem6/lecture.png -------------------------------------------------------------------------------- /sem6/picture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andriygav/MachineLearningSeminars/e511e6d57c0086f12d251deb351fd7b126c1bf51/sem6/picture.jpg -------------------------------------------------------------------------------- /teormin.md: -------------------------------------------------------------------------------- 1 | # Теоретический минимум по машинному обучению (Поток Воронцов К.В. и Грабовой А.В.) 2 | 3 | ## Решающие деревья 4 | * Что такое решающее дерево и как оно работает? 5 | * Какие критерии для выбора параметров в узлах дерева, какой из какого следует и почему. 6 | * Какие гиперпараметры регулируют сложность решающего дерева? 7 | * Как решающие деревья обрабатывают задачи регрессии? 8 | * В чем разница между классификационным и регрессионным деревом? 9 | 10 | ## Логистическая регрессия 11 | * Что такое логистическая регрессия и какую задачу она решает? 12 | * Как выглядит функция потерь в логистической регрессии? 13 | * Как оптимизируются параметры в логистической регрессии? 14 | * Как обобщить логистическую регрессию на многоклассовую классификацию? 15 | * Чем логистическая регрессия отличается от линейной? 16 | * Какие метрики используются для оценки классификации? 17 | * Что такое матрица ошибок? 18 | 19 | ## SVM (Support Vector Machines) 20 | * В чем основная идея SVM? 21 | * Как строится разделяющая гиперплоскость в SVM? 22 | * Зачем в SVM используются ядра? 23 | * Назовите основные ядра в SVM. 24 | * Как SVM обобщается для задач регрессии? 25 | * Как работает метод опорных векторов для несбалансированных данных? 26 | 27 | ## Линейная регрессия 28 | * Как работает линейная регрессия? 29 | * Как находится оптимальное значение параметров? 30 | * В чем проблема мультиколлинеарности и как ее решают? 31 | * Объясните вероятностную интерпретацию регуляризации в случае Lasso и Ridge. 32 | * Чем Lasso отличается от Ridge регуляризации? 33 | * Как оценивать качество регрессионных моделей? 34 | 35 | ## Ансамблирование моделей 36 | * Назовите основные виды ансамблирования и их основное отличие. 37 | * Когда лучше использовать бэггинг, а когда — бустинг? 38 | * Приведите примеры алгоритмов бустинга. 39 | * Приведите примеры алгоритмов бэггинга. 40 | * Как работает алгоритм Random Forest? 41 | * Объясните принцип работы XGBoost. 42 | * Что такое "ансамблевое усреднение"? 43 | * Как работает метод Stacking в ансамблировании? 44 | * Как работает метод случайного подпространства (Random Subspace) в бэггинге? 45 | 46 | ## Отбор признаков 47 | * Какие методы отбора признаков вы знаете? 48 | * Почему L1-регуляризация зануляет некоторые параметры? 49 | * Как работает жадный алгоритм Add-Del для отбора признаков? 50 | * Объясните критерий Фишера для отбора признаков. 51 | * Как метод Белсли и SVD помогают бороться с мультиколлинеарностью? 52 | 53 | ## Деление выборки 54 | * В чем проблемы случайного деления выборки на обучение и контроль? 55 | * Как стратификация решает проблему несбалансированных данных? 56 | * Что такое утечка данных при разделении выборки? 57 | 58 | ## Нейронные сети 59 | *. Что такое полносвязная нейронная сеть? 60 | * Назовите популярные функции активации, в чем их отличие. 61 | * Какие проблемы возникают в полносвязных сетях? 62 | * Что такое dropout, чем отличается в обучении и в контроле? 63 | * Что такое BatchNorm, чем отличается в обучении и в контроле? 64 | * Что такое паралич нейронной сети и как его избежать? 65 | * Опишите идею обратного распространения ошибки в нейросетях. 66 | * Опишите идею прямого метода дифференцирования в нейросетях. 67 | * Что такое градиентный спуск и его варианты? 68 | 69 | ## RNN, LSTM, GRU 70 | * Как работают рекуррентные нейронные сети? 71 | * Какие проблемы возникают при обучении RNN? 72 | * Как LSTM и GRU решают эти проблемы и какие проблемы? 73 | * Что такое Gradient Clipping и зачем он нужен? 74 | * Как работает bidirectional RNN? 75 | * Что такое batch_first в nn.LSTM в pytorch. 76 | 77 | ## Сверточные сети (CNN) 78 | * В чем идея сверточных нейронных сетей? 79 | * Что такое операция свертки, какие у нее есть параметры? 80 | * Какие слои кроме сверточных используются в CNN? 81 | * В чем особенность архитектуры ResNet? 82 | * Как дообучать предобученные модели под конкретную задачу? 83 | 84 | ## Автокодировщики и GAN 85 | * Что такое автокодировщик и зачем он нужен? 86 | * Как линейный автокодировщик связан с PCA? 87 | * Опишите принцип работы вариационного автокодировщика. 88 | * Чем GAN отличается от автокодировщика? 89 | 90 | ## Обучение с подкреплением (RL) 91 | * В чем основная идея обучения с подкреплением? 92 | * Приведите пример задачи RL с байесовскими бандитами. 93 | * Как решается задача заплыва? 94 | 95 | ## Активное обучение 96 | * Какие проблемы решает активное обучение? 97 | * Назовите методы активного обучения. 98 | 99 | ## KNN (k-ближайших соседей) 100 | * Как работает алгоритм KNN? 101 | * Какие гиперпараметры есть у KNN (k, метрика расстояния)? 102 | * Какие проблемы возникают при использовании KNN и как их решить? 103 | * Как работает метод ближайших соседей для регрессии? 104 | 105 | ## Кластеризация 106 | * Назовите методы кластеризации, чем они отличаеются. 107 | * Какие методы не требуют задания числа кластеров? 108 | * Как работает EM-алгоритм в кластеризации? 109 | * Как работает метод k-средних? 110 | * Что такое матрица смежности в кластеризации? 111 | * Как работает метод DBSCAN? 112 | 113 | ## Тематическое моделирование 114 | * Что такое тематическое моделирование и зачем оно нужно? 115 | * Как EM-алгоритм используется в тематическом моделировании? 116 | * Примеры регуляризаторов в тематических моделях. 117 | 118 | ## Ранжирование и поиск 119 | * Зачем нужны ранжирующие системы? 120 | * Как оценивают качество поисковых систем? 121 | 122 | ## Трансформеры 123 | * Что такое attention? 124 | * В чем отличие между self-attention и cross-attention? 125 | * В чем отличие между transformer, gpt-like и bert-like моделями? 126 | * На какие задачи обучался BERT в базовом варианте? 127 | 128 | ## Другое 129 | * Что такое метод главных компонент? 130 | * Что такое переобучение и как с ним бороться? 131 | * В чем разница между параметрами и гиперпараметрами модели? 132 | * Что такое кросс-валидация и зачем она нужна? 133 | * Что такое ROC-кривая и AUC? 134 | * Объясните разницу между байесовским и частотным подходами в ML. 135 | * Наивный байесовский классификатор, что это такое? 136 | * Что такое "проклятие размерности"? 137 | * Как работает метод t-SNE для визуализации данных, в чем минусы? 138 | * Что такое обучение без учителя? 139 | * Какие задачи решает обучение с частичным привлечением учителя (semi-supervised)? 140 | * Что такое Transfer Learning? 141 | * Что такое "обучение с учителем" (supervised learning)? 142 | * Что такое "теория обучения" (bias-variance tradeoff)? 143 | * Что такое teacher forcing в RNN? 144 | --------------------------------------------------------------------------------