Этот коммит содержится в:
Mokhov Andrey
2023-03-05 21:51:24 +03:00
родитель b59ad62c3c
Коммит 494dd80838
4 изменённых файлов: 931 добавлений и 0 удалений

77
labs/OATD_LR3.md Обычный файл
Просмотреть файл

@@ -0,0 +1,77 @@
# Лабораторная работа №3. Классификация текстовых данных
## Цель работы
Получить практические навыки решения задачи классификации текстовых данных в среде Jupiter Notebook.
Научиться проводить предварительную обработку текстовых данных, настраивать параметры методов классификации и обучать модели, оценивать точность полученных моделей
## Задание
1. Загрузить выборки по варианту из лабораторной работы №2. Стемминг проводить не нужно.
2. Используя GridSearchCV произвести предварительную обработку данных и настройку методов классификации в соответствие с заданием,
вывести оптимальные значения параметров и результаты классификации модели (полнота, точность, f1-мера и аккуратности) с данными параметрами.
3. Перевести выборку к векторному представлению word embedding согласно варианту.
4. Провести обучение и настройку тех же алгоритмов классификации и с теми же параметрами, что и в п.2, но на векторизованной выборке
5. По каждому пункту работы занести в отчет программный код и результат вывода.
6. Оформить сравнительную таблицу с результатами классификации различными методами с разными настройками.
Сделать выводы о наиболее подходящем методе классификации ваших данных с указанием параметров метода и описанием предварительной обработки данных.
## Варианты заданий
| Вариант | Метод | Word embedding |
| :--- | :---: | :--- |
| 1 | KNN, SVM | glove-wiki-gigaword-100 |
| 2 | RF, MNB | glove-wiki-gigaword-50
| 3 | KNN, DT | glove-wiki-gigaword-200 |
| 4 | RF, KNN | glove-wiki-gigaword-25 |
| 5 | LR, MNB | word2vec-google-news-300 |
| 6 | DT, LR | glove-wiki-gigaword-200 |
| 7 | RF, SVM | glove-wiki-gigaword-100 |
| 8 | SVM, DT | glove-wiki-gigaword-50 |
| 9 | RF, SVM | glove-wiki-gigaword-200 |
| 10 | MNB, SVM | glove-wiki-gigaword-25 |
| 11 | MNB, DT | word2vec-google-news-300 |
| 12 | RF, LR | glove-wiki-gigaword-200 |
## Параметры, которые необходимо настроить
Помимо параметров предварительной обработки, таких как: взвешивание, отсечение стоп-слов,
количество информативных терминов, для каждого метода классификации необходимо настроить следующие параметры:
*К-ближайших соседей (KNN): *
• количество ближайших соседей,
• метрика (евклидова, косинусная)
*Дерево решений (DT): *
• критерий (параметр criterion: gini, entropy),
• глубина дерева (параметр max_depth: {5, 15, 50, 100}).
*Случайный лес (RF): *
• количество деревьев решений,
• критерий (параметр criterion: gini, entropy),
• глубина дерева (5, 15, 50, 100).
*Логистическая регрессия (LR): *
• метод нахождения экстремума (параметр solver: newton-cg, lbfgs, sag, liblinear),
• регуляризация (параметр penalty: L1, L2)
Обратить внимание, что разные виды регуляризации работают с разными методами нахождения экстремума.
*Метод опорных векторов (SVM): *
• функция потерь (параметр loss: hinge, squared_hinge),
• регуляризация (параметр penalty: L1, L2)
Обратить внимание, что разные виды регуляризации работают с разными функциями потерь
*Мультиномиальный Наивный Байесовский метод (MNB) *
• параметр сглаживания α (параметр alpha {0.1, 1, 2}
## Контрольные вопросы
1. Алгоритм и особенности метода опорных векторов.
2. Алгоритм и особенности метода логистической регрессии.
3. Алгоритм и особенности метода деревьев решений.
4. Что такое регуляризация?
5. Что такое метрика расстояния? Какие метрики вам известны?

218
labs/OATD_LR3_metod.ipynb Обычный файл
Просмотреть файл

@@ -0,0 +1,218 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# \tМетодические указания к лабораторной работе №3\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"В данной работе мы продолжаем работать с библиотекой scikit-learn \n",
"(http://scikit-learn.org), и хотим выяснить ее возможности при работе с текстовыми документами.\n",
"\n",
"Ниже приведены новые модули, которые будут использованы в данной работе:\n",
"\n",
"GridSearchCV - http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html - полный перебор по сетке заданных значений параметров для классификации \n",
"\n",
"Decision Tree - http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier – Метод деревьев решений\n",
"\n",
"MultinominalNB - http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html - Полиномиальный (Мультиномиальный) Наивный Байесовский метод – разновидность Наивного Байесовского метода, которая хорошо работает с текстами, длины которых сильно варьируются.\n",
"\n",
"LogisticRegression - http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html - Логистическая регрессия\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Импорт библиотек"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.datasets import fetch_20newsgroups\n",
"from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer \n",
"import numpy as np\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.model_selection import GridSearchCV"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Настройка параметров с использованием grid search"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"С помощью конвейерной обработки (`pipelines`), рассмотренной в лабораторной работе №2, стало гораздо проще указывать параметры обучения модели, однако перебирать все возможные варианты вручную даже в нашем простом случае выйдет затратно. В случае, рассмотренном в лабораторной работе №2, имеется четыре настраиваемых параметра: `max_features`, `stop_words`, `use_idf` и `n_neighbors`:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"text_clf = Pipeline([('vect', CountVectorizer(max_features= 1000, stop_words = 'english')),\n",
" ('tfidf', TfidfTransformer(use_idf = True)),\n",
" ('clf', KNeighborsClassifier (n_neighbors=1)),]) \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Вместо поиска лучших параметров в конвейере вручную, можно запустить поиск (методом полного перебора) лучших параметров в сетке возможных значений. Сделать это можно с помощью объекта класса GridSearchCV.\n",
" \n",
"Для того чтобы задать сетку параметров необходимо создать переменную-словарь, ключами которого являются конструкции вида: «НазваниеШагаКонвейера__НазваниеПараметра», а значениями – кортеж из значений параметра\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"parameters = {'vect__max_features': (100,500,1000,5000,10000),\n",
" 'vect__stop_words': ('english', None),\n",
" 'tfidf__use_idf': (True, False), \n",
" 'clf__n_neighbors': (1,3,5,7)} "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Далее необходимо создать объект класса `GridSearchCV`, передав в него объект `pipeline` или классификатор, список параметров сетки, а также при необходимости, задав прочие параметры, такие так количество задействованых ядер процессора `n_jobs`, количество фолдов кросс-валидации `cv` и другие"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"gs_clf = GridSearchCV(text_clf, parameters, n_jobs=-1, cv=3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Теперь объект `gs_clf` можно обучить по всем параметрам, как обычный классификатор, методом `fit()`.\n",
"После того как прошло обучение, узнать лучшую совокупность параметров можно, обратившись к атрибуту `best_params_`. Для необученной модели атрибуты будут отсутствовать.\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'GridSearchCV' object has no attribute 'best_params_'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[11], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mgs_clf\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbest_params_\u001b[49m()\n",
"\u001b[1;31mAttributeError\u001b[0m: 'GridSearchCV' object has no attribute 'best_params_'"
]
}
],
"source": [
"gs_clf.best_params_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Аккуратность классификации – обратившись к параметру `best_score_`:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'GridSearchCV' object has no attribute 'best_score_'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[12], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mgs_clf\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbest_score_\u001b[49m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'GridSearchCV' object has no attribute 'best_score_'"
]
}
],
"source": [
"gs_clf.best_score_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"А результаты по всей сетке параметров - `cv_results_`"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gs_clf.cv_results_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Для векторного представления выборки с помощью готовых моделей "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 4
}