Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

221 строка
9.2 KiB
Plaintext

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

{
"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",
"Support Vector Machine - https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC – Метод опорных векторов\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`, метрику, по которой будем судить о качестве модели `scoring`, и другие"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"gs_clf = GridSearchCV(text_clf, parameters, n_jobs=-1, cv=3, scoring = 'f1_weighted')"
]
},
{
"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": [
"## Для векторного представления выборки с помощью готовых моделей - см. ноутбук лекции №5"
]
}
],
"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
}