lab03
Этот коммит содержится в:
77
labs/OATD_LR3.md
Обычный файл
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
Обычный файл
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
|
||||
}
|
||||
Ссылка в новой задаче
Block a user