diff --git a/lesson2_numpy_homework.ipynb b/lesson2_numpy_homework.ipynb new file mode 100644 index 0000000..b00f049 --- /dev/null +++ b/lesson2_numpy_homework.ipynb @@ -0,0 +1,490 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "d65b413a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 1 6]\n", + " [ 2 8]\n", + " [ 3 11]\n", + " [ 3 10]\n", + " [ 1 7]]\n", + "Размерность a: 2\n", + "Форма а: (5, 2)\n" + ] + } + ], + "source": [ + "# Задание 1\n", + "# Импортируйте библиотеку Numpy и дайте ей псевдоним np.\n", + "\n", + "import numpy as np\n", + "\n", + "# Создайте массив Numpy под названием a размером 5x2, то есть состоящий из 5 строк и 2 столбцов. \n", + "# Первый столбец должен содержать числа 1, 2, 3, 3, 1, а второй - числа 6, 8, 11, 10, 7.\n", + "\n", + "\n", + "a = np.array([[1, 6],\n", + "[2, 8],\n", + "[3, 11],\n", + "[3,10],\n", + "[1,7]])\n", + "\n", + "print(a)\n", + "print(\"Размерность a: {}\".format(a.ndim))\n", + "print(\"Форма а: {}\".format(a.shape))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "80ad4088", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Средние значения столбцов: [2. 8.4]\n" + ] + } + ], + "source": [ + "print(\"Средние значения столбцов: {}\".format(a.mean(axis=0)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "9c6a92ac", + "metadata": {}, + "outputs": [], + "source": [ + "mean_a = np.array(a.mean(axis=0))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "f3519739", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[2. 8.4]]\n" + ] + } + ], + "source": [ + "print(mean_a)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "aa253d3a", + "metadata": {}, + "outputs": [], + "source": [ + "## Задание 2\n", + "## вычислить массив a_centered отняв от значений массива а средние значения признаков в mean_a \n", + "\n", + "a_centered = a - mean_a" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d719e63f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-1. -2.4]\n", + " [ 0. -0.4]\n", + " [ 1. 2.6]\n", + " [ 1. 1.6]\n", + " [-1. -1.4]]\n" + ] + } + ], + "source": [ + "print(a_centered)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "9d1ce177", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Форма а_centered: (5, 2)\n" + ] + } + ], + "source": [ + "print(\"Форма а_centered: {}\".format(a_centered.shape))" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "d856e961", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-1.0\n", + "-2.4000000000000004\n" + ] + } + ], + "source": [ + "## Задание 3\n", + "## Найти скалярное произведение столбцов массива a_centered\n", + "print( a_centered[0,0])\n", + "print( a_centered[0,1])" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "0c27aab5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-1. 0. 1. 1. -1.]\n", + "[-2.4 -0.4 2.6 1.6 -1.4]\n", + "8.0\n" + ] + } + ], + "source": [ + "a1 = a_centered[:,0]\n", + "a2 = a_centered[:,1]\n", + "a_centered_sp = a1@a2\n", + "print(a1)\n", + "print(a2)\n", + "print(a_centered_sp)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "836f69d3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.0\n" + ] + } + ], + "source": [ + "## Делим a_center_sp на число N-1 где N - число наблюдений ( = 5)\n", + "print(a_centered_sp / 4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "5eae2b3b", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 1 2 3 3 1]\n", + " [ 6 8 11 10 7]]\n", + "[[1. 2. ]\n", + " [2. 4.3]]\n" + ] + } + ], + "source": [ + "## Задание 4.\n", + "## Транспонируем матрицу a и вычисляем ковариацию с помощью функции np.cov()\n", + "a_transpon = np.transpose(a)\n", + "print(a_transpon)\n", + "print(np.cov(a_transpon))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "4706262c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.0\n" + ] + } + ], + "source": [ + "## Таким образом ковариация равна элементу в строке с индексом 0 и столбце с индексом 1 - [0,1]\n", + "print(np.cov(a_transpon)[0,1])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a64fcf41", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " author_id author_name\n", + "0 1 Тургенев\n", + "1 2 Чехов\n", + "2 3 Островский\n" + ] + } + ], + "source": [ + "## Тема \"Работа с данными в Pandas\"\n", + "\n", + "## Задание 1\n", + "## Импортируйте библиотеку Pandas и дайте ей псевдоним pd.\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "## Создайте датафрейм authors со столбцами author_id и author_name, в которых соответственно содержаться данные:\n", + "## [1,2,3] и ['Тургенев', 'Чехов', 'Островский']\n", + "\n", + "dfr = {\"author_id\":np.array([1,2,3]), \"author_name\":np.array(['Тургенев', 'Чехов', 'Островский']) }\n", + "\n", + "authors = pd.DataFrame(dfr)\n", + "\n", + "print(authors)\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e8502421", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " author_id book_title price\n", + "0 1 Отцы и дети 450\n", + "1 1 Рудин 300\n", + "2 1 Дворянское гнездо 350\n", + "3 2 Толстый и тонкий 500\n", + "4 2 Дама с собачкой 450\n", + "5 3 Гроза 370\n", + "6 3 Таланты и поклонники 290\n" + ] + } + ], + "source": [ + "## Затем создайте датафрейм book cо столбцами author_id, book_title и price,\n", + "## в которых соответственно содержатся данные: \n", + "## [1, 1, 1, 2, 2, 3, 3],\n", + "## ['Отцы и дети', 'Рудин', 'Дворянское гнездо', 'Толстый и тонкий', 'Дама с собачкой',\n", + "## 'Гроза', 'Таланты и поклонники'],\n", + "## [450, 300, 350, 500, 450, 370, 290].\n", + "\n", + "d = {\"author_id\":np.array([1, 1, 1, 2, 2, 3, 3]), \"book_title\":np.array(['Отцы и дети', 'Рудин', 'Дворянское гнездо', 'Толстый и тонкий', 'Дама с собачкой','Гроза', 'Таланты и поклонники']), \"price\":np.array([450, 300, 350, 500, 450, 370, 290] ) }\n", + "\n", + "book = pd.DataFrame(d)\n", + "\n", + "print(book)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "57d9d668", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " author_id author_name book_title price\n", + "0 1 Тургенев Отцы и дети 450\n", + "1 1 Тургенев Рудин 300\n", + "2 1 Тургенев Дворянское гнездо 350\n", + "3 2 Чехов Толстый и тонкий 500\n", + "4 2 Чехов Дама с собачкой 450\n", + "5 3 Островский Гроза 370\n", + "6 3 Островский Таланты и поклонники 290\n" + ] + } + ], + "source": [ + "## Задание 2 .\n", + "## Получите датафрейм authors_price, соединив датафреймы authors и books по полю author_id\n", + "authors_price = authors.merge(book, on=[\"author_id\"])\n", + "print(authors_price)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "220fee43", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " author_id author_name book_title price\n", + "6 3 Островский Таланты и поклонники 290\n", + "1 1 Тургенев Рудин 300\n", + "2 1 Тургенев Дворянское гнездо 350\n", + "5 3 Островский Гроза 370\n", + "0 1 Тургенев Отцы и дети 450\n", + "4 2 Чехов Дама с собачкой 450\n", + "3 2 Чехов Толстый и тонкий 500\n" + ] + } + ], + "source": [ + "## Задание 3\n", + "## Создайте датафрейм top5, в котором содержатся строки из authors_price с пятью самыми дорогими книгами.\n", + "\n", + "## print(authors_price.sort_values('price'))\n", + "authors_price_top = authors_price.sort_values('price')\n", + "\n", + "print(authors_price_top)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "6b00737e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " author_id author_name book_title price\n", + "6 3 Островский Таланты и поклонники 290\n", + "1 1 Тургенев Рудин 300\n", + "2 1 Тургенев Дворянское гнездо 350\n", + "5 3 Островский Гроза 370\n", + "0 1 Тургенев Отцы и дети 450\n" + ] + } + ], + "source": [ + "top5 = authors_price_top.head(5)\n", + "print(top5)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "18110025", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " author_id author_name book_title price\n", + "5 3 Островский Гроза 370\n", + "6 3 Островский Таланты и поклонники 290\n", + "0 1 Тургенев Отцы и дети 450\n", + "1 1 Тургенев Рудин 300\n", + "2 1 Тургенев Дворянское гнездо 350\n", + "3 2 Чехов Толстый и тонкий 500\n", + "4 2 Чехов Дама с собачкой 450\n" + ] + } + ], + "source": [ + "## Задание 4\n", + "## Создайте датафрейм authors_stat на основе информации из authors_price. В датафрейме authors_stat\n", + "## должны быть четыре столбца:\n", + "## author_name, min_price, max_price и mean_price,\n", + "## в которых должны содержаться соответственно имя автора, минимальная, максимальная и средняя цена\n", + "## на книги этого автора.\n", + "\n", + "print(authors_price.sort_values('author_name'))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef7d7553", + "metadata": {}, + "outputs": [], + "source": [ + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e26e8a69", + "metadata": {}, + "outputs": [], + "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.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lesson6_work_with_teacher.ipynb b/lesson6_work_with_teacher.ipynb new file mode 100644 index 0000000..b1e5bc8 --- /dev/null +++ b/lesson6_work_with_teacher.ipynb @@ -0,0 +1,104 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "aa129351", + "metadata": {}, + "outputs": [], + "source": [ + "## Урок6 Тема “Обучение с учителем”\n", + "## Задание 1\n", + "## Импортируйте библиотеки pandas и numpy.\n", + "##Загрузите \"Boston House Prices dataset\" из встроенных наборов данных библиотеки sklearn. Создайте датафреймы X и y из этих данных.\n", + "##Разбейте эти датафреймы на тренировочные (X_train, y_train) и тестовые (X_test, y_test) с помощью функции train_test_split так, чтобы размер тестовой выборки\n", + "##составлял 30% от всех данных, при этом аргумент random_state должен быть равен 42.\n", + "##Создайте модель линейной регрессии под названием lr с помощью класса LinearRegression из модуля sklearn.linear_model.\n", + "##Обучите модель на тренировочных данных (используйте все признаки) и сделайте предсказание на тестовых.\n", + "\n", + "\n", + "##Вычислите R2 полученных предказаний с помощью r2_score из модуля sklearn.metrics.\n", + "\n", + "\n", + "##Задание 2\n", + "##Создайте модель под названием model с помощью RandomForestRegressor из модуля sklearn.ensemble.\n", + "##Сделайте агрумент n_estimators равным 1000,\n", + "##max_depth должен быть равен 12 и random_state сделайте равным 42.\n", + "##Обучите модель на тренировочных данных аналогично тому, как вы обучали модель LinearRegression,\n", + "##но при этом в метод fit вместо датафрейма y_train поставьте y_train.values[:, 0],\n", + "##чтобы получить из датафрейма одномерный массив Numpy,\n", + "##так как для класса RandomForestRegressor в данном методе для аргумента y предпочтительно применение массивов вместо датафрейма.\n", + "##Сделайте предсказание на тестовых данных и посчитайте R2. Сравните с результатом из предыдущего задания.\n", + "##Напишите в комментариях к коду, какая модель в данном случае работает лучше.\n", + "\n", + "##*Задание 3\n", + "##Вызовите документацию для класса RandomForestRegressor,\n", + "##найдите информацию об атрибуте feature_importances_.\n", + "##С помощью этого атрибута найдите сумму всех показателей важности,\n", + "##установите, какие два признака показывают наибольшую важность.\n", + "\n", + "##*Задание 4\n", + "##В этом задании мы будем работать с датасетом, с которым мы уже знакомы по домашнему заданию по библиотеке Matplotlib, это датасет Credit Card Fraud Detection.Для этого датасета мы будем решать задачу классификации - будем определять,какие из транзакциции по кредитной карте являются мошенническими.Данный датасет сильно несбалансирован (так как случаи мошенничества относительно редки),так что применение метрики accuracy не принесет пользы и не поможет выбрать лучшую модель.Мы будем вычислять AUC, то есть площадь под кривой ROC.\n", + "##Импортируйте из соответствующих модулей RandomForestClassifier, GridSearchCV и train_test_split.\n", + "##Загрузите датасет creditcard.csv и создайте датафрейм df.\n", + "##С помощью метода value_counts с аргументом normalize=True убедитесь в том, что выборка несбалансирована. Используя метод info, проверьте, все ли столбцы содержат числовые данные и нет ли в них пропусков.Примените следующую настройку, чтобы можно было просматривать все столбцы датафрейма:\n", + "##pd.options.display.max_columns = 100.\n", + "##Просмотрите первые 10 строк датафрейма df.\n", + "##Создайте датафрейм X из датафрейма df, исключив столбец Class.\n", + "##Создайте объект Series под названием y из столбца Class.\n", + "##Разбейте X и y на тренировочный и тестовый наборы данных при помощи функции train_test_split, используя аргументы: test_size=0.3, random_state=100, stratify=y.\n", + "##У вас должны получиться объекты X_train, X_test, y_train и y_test.\n", + "##Просмотрите информацию о их форме.\n", + "##Для поиска по сетке параметров задайте такие параметры:\n", + "##parameters = [{'n_estimators': [10, 15],\n", + "##'max_features': np.arange(3, 5),\n", + "##'max_depth': np.arange(4, 7)}]\n", + "##Создайте модель GridSearchCV со следующими аргументами:\n", + "##estimator=RandomForestClassifier(random_state=100),\n", + "##param_grid=parameters,\n", + "##scoring='roc_auc',\n", + "##cv=3.\n", + "##Обучите модель на тренировочном наборе данных (может занять несколько минут).\n", + "##Просмотрите параметры лучшей модели с помощью атрибута best_params_.\n", + "##Предскажите вероятности классов с помощью полученнной модели и метода predict_proba.\n", + "##Из полученного результата (массив Numpy) выберите столбец с индексом 1 (вероятность класса 1) и запишите в массив y_pred_proba. Из модуля sklearn.metrics импортируйте метрику roc_auc_score.\n", + "##Вычислите AUC на тестовых данных и сравните с результатом,полученным на тренировочных данных, используя в качестве аргументов массивы y_test и y_pred_proba.\n", + "\n", + "##*Дополнительные задания:\n", + "##1). Загрузите датасет Wine из встроенных датасетов sklearn.datasets с помощью функции load_wine в переменную data.\n", + "##2). Полученный датасет не является датафреймом. Это структура данных, имеющая ключи аналогично словарю. Просмотрите тип данных этой структуры данных и создайте список data_keys, содержащий ее ключи.\n", + "##3). Просмотрите данные, описание и названия признаков в датасете. Описание нужно вывести в виде привычного, аккуратно оформленного текста, без обозначений переноса строки, но с самими переносами и т.д.4). Сколько классов содержит целевая переменная датасета? Выве\n", + "##дите названия классов.\n", + "##5). На основе данных датасета (они содержатся в двумерном массиве Numpy) и названий признаков создайте датафрейм под названием X.\n", + "##6). Выясните размер датафрейма X и установите, имеются ли в нем пропущенные значения.\n", + "##7). Добавьте в датафрейм поле с классами вин в виде чисел, имеющих тип данных numpy.int64. Название поля - 'target'.\n", + "##8). Постройте матрицу корреляций для всех полей X. Дайте полученному датафрейму название X_corr.\n", + "##9). Создайте список high_corr из признаков, корреляция которых с полем target по абсолютному значению превышает 0.5 (причем, само поле target не должно входить в этот список).\n", + "##10). Удалите из датафрейма X поле с целевой переменной. Для всех признаков, названия которых содержатся в списке high_corr, вычислите квадрат их значений и добавьте в датафрейм X соответствующие поля с суффиксом '_2', добавленного к первоначальному названию признака. Итоговый датафрейм должен содержать все поля, которые, были в нем изначально, а также поля с признаками из списка high_corr, возведенными в квадрат. Выведите описание полей датафрейма X с помощью метода describe.\n", + "\n", + "\n" + ] + } + ], + "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.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}