{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "q0PjiV7v7aXC"
},
"source": [
"# \n",
"\n",
"# Машинное обучение. ВМК МГУ"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uvZhhOzlKCMH"
},
"source": [
"# Практическое задание 4: Анализ данных и обработка категориальных признаков\n",
"\n",
"## Уровень: **Базовый (Base)**"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uqAqpeYFxg5T"
},
"source": [
"# О формате сдачи\n",
"\n",
"🔷 **При решении ноутбука используйте данный шаблон**\n",
"\n",
" ✅ Можно добавлять новые ячейки любых типов\n",
" ❌ Не нужно удалять текстовые ячейки c разметкой частей ноутбука и формулировками заданий\n",
"\n",
"\n",
"🔷 **При оценивании задач учитывается код**\n",
"\n",
" ✅ Задания, в которых необходим код, обычно помечаются фразами \"Your code here\"/\"Ваш код\" и аналогичными\n",
" ❌ Ответы на вопросы без сопутствующего кода оцениваются в 0 баллов\n",
" ❌ Наличе работоспособного кода в ноутбуке, если на сказано иного, обязательно\n",
"\n",
"🔷 **При оценивании задач учитываются выводы**\n",
"\n",
" ✅ Задания, в которых необходимы выводы, обычно помечаются фразами Вывод\"/\"Ответ на вопрос\"/\"Ваш текст\" и аналогичными\n",
" ✅ Обычно выводы подразумевают под собой текстовый ответ (можно писать markdown, latex).\n",
" ✅ Сопутствующие изображения, графики, таблички - приветствуются!\n",
" ❌ При отсутствии выводов задание не засчитается на полный балл\n",
"\n",
"-----------\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ciHgl9KGlJua"
},
"source": [
"# Подготовка рабочей среды\n",
"\n",
"Сначала установим нужные нам версии библиотек. Мы гарантируем, что в данных версиях задание будет корректно отрабатывать.\n",
"\n",
"После установки нужных версий, **возможно,** нужно перезагрузить среду (runtime), но скорее всего вам это не понадобится\n",
"\n",
"\n",
"На скачивание файла и установку понадобится не более 5 минут.\n",
"\n",
"**Важно!**\n",
"\n",
"Устанавливать нужные версии нужно каждый раз, когда создается новый рантайм. Например, если вы 2 часа подряд делаете это задание, то подготовить библиотеки достаточно 1 раз. Но если вы, например, начали в понедельник, затем закрыли/выключили ноутбук, то при продолжении в среду, вам нужно будет запустить рантайм заново и следовательно заново установить библиотеки.\n",
"\n",
"**Важно!**\n",
"Если вы предпочитаете делать практические задания на своем личном ноутбуке, то проверьте, что вы установили рабочее окружение в [соответствии с гайдом](https://github.com/MSU-ML-COURSE/ML-COURSE-24-25/blob/main/tutorials/%D0%A2%D1%83%D1%82%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%20%D0%BF%D0%BE%20%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%87%D0%B5%D0%B3%D0%BE%20%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%20Python%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%20(2).pdf)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "fMgnzKcqlIen"
},
"outputs": [],
"source": [
"! curl https://raw.githubusercontent.com/MSU-ML-COURSE/ML-COURSE-25-26/refs/heads/master/requirements/requirements.txt -o ./requirements_2025_26_for_colab_small.txt\n",
"! pip install -q -r ./requirements_2025_26_for_colab_small.txt"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-0DgvOqZix4h"
},
"source": [
"Проверим версию библиотеки:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "QwWXXElyiRYq"
},
"outputs": [],
"source": [
"import catboost\n",
"assert(catboost.__version__ == '1.2.8')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "53PQKGPVizrv"
},
"source": [
"Теперь можно приступать к выполнению задания! :)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7Z8vzxJLyEDk"
},
"source": [
"-----------\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6MBU1hOZ7aXH"
},
"source": [
"# Часть 1. Анализ и обработка данных"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_ZjnB4VJJuR6"
},
"source": [
"В прошлом ноутбуке мы познакомились, как можно вызывать методы машинного обучения с помощью библиотеки `sklearn`. Казалось бы, бери самые передовые методы машинного обучения (да и нейросетей), применяй на данные, и радуйся жизни. Но на самом деле, на качество решения задачи влияет не столько вид модели, а то, какие данные мы подаем этой модели.\n",
"\n",
"В реальном мире данные редко бывают безупречными. Они могут включать ошибки ввода, неточности, пропуски и выбросы, что часто происходит из-за человеческих ошибок или нехватки информации. Если не провести предварительную обработку данных, это может негативно сказаться на качестве модели машинного обучения. Поэтому важно уделять внимание анализу и обработке данных перед их использованием.\n",
"\n",
" При правильном анализе и обработке датасета есть возможность сильно забустить качество, даже сильнее, чем если бы мы взяли какую-то более \"мощную\" модель машинного обучения.\n",
"\n",
"В данном секции мы разберем основные приемы, которые могут приняться при анализе и обработке данных - этапе, который производится перед подачей данных в саму модель и ее обучении."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "RXY7s3K2dkPX"
},
"source": [
"## Работа с данными\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "70dA2XS_kYlz"
},
"source": [
"Будем работать с датасетом [описания квартир на Airbnb](https://www.kaggle.com/datasets/arianazmoudeh/airbnbopendata/data)\n",
"\n",
"Мы уже скачали его за вас:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "sELlwalGkX10",
"outputId": "5f001229-4e12-49e9-bf04-37b389f1fdbd"
},
"outputs": [],
"source": [
"import gdown\n",
"\n",
"gdown.download(id='1GKaJXuZm74Bs5b9FCxUrbcZAoLTaN5MT')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4zuTlT1wynOq"
},
"source": [
"Работать с данными будем, как и раньше, через `pandas` + `numpy`"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"id": "3zby9wC0lh-M"
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"pd.set_option('display.max_columns', None) # установим настройку, чтобы всегда отображались все столбцы"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Vyhr0mE7lghl"
},
"outputs": [],
"source": [
"data = pd.read_csv(\"/content/Airbnb_Open_Data.csv\", low_memory=False)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xOC_uTKEy0VN"
},
"source": [
"Посмотрим на все данные:"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 503
},
"id": "tuH-EXfnls6e",
"outputId": "6f0a9850-8d0e-4052-ce81-f6e20c829080"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
id
\n",
"
NAME
\n",
"
host id
\n",
"
host_identity_verified
\n",
"
host name
\n",
"
neighbourhood group
\n",
"
neighbourhood
\n",
"
lat
\n",
"
long
\n",
"
country
\n",
"
country code
\n",
"
instant_bookable
\n",
"
cancellation_policy
\n",
"
room type
\n",
"
Construction year
\n",
"
price
\n",
"
service fee
\n",
"
minimum nights
\n",
"
number of reviews
\n",
"
last review
\n",
"
reviews per month
\n",
"
review rate number
\n",
"
calculated host listings count
\n",
"
availability 365
\n",
"
house_rules
\n",
"
license
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1001254
\n",
"
Clean & quiet apt home by the park
\n",
"
80014485718
\n",
"
unconfirmed
\n",
"
Madaline
\n",
"
Brooklyn
\n",
"
Kensington
\n",
"
40.64749
\n",
"
-73.97237
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
strict
\n",
"
Private room
\n",
"
2020.0
\n",
"
$966
\n",
"
$193
\n",
"
10.0
\n",
"
9.0
\n",
"
10/19/2021
\n",
"
0.21
\n",
"
4.0
\n",
"
6.0
\n",
"
286.0
\n",
"
Clean up and treat the home the way you'd like...
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1
\n",
"
1002102
\n",
"
Skylit Midtown Castle
\n",
"
52335172823
\n",
"
verified
\n",
"
Jenna
\n",
"
Manhattan
\n",
"
Midtown
\n",
"
40.75362
\n",
"
-73.98377
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
2007.0
\n",
"
$142
\n",
"
$28
\n",
"
30.0
\n",
"
45.0
\n",
"
5/21/2022
\n",
"
0.38
\n",
"
4.0
\n",
"
2.0
\n",
"
228.0
\n",
"
Pet friendly but please confirm with me if the...
\n",
"
NaN
\n",
"
\n",
"
\n",
"
2
\n",
"
1002403
\n",
"
THE VILLAGE OF HARLEM....NEW YORK !
\n",
"
78829239556
\n",
"
NaN
\n",
"
Elise
\n",
"
Manhattan
\n",
"
Harlem
\n",
"
40.80902
\n",
"
-73.94190
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
flexible
\n",
"
Private room
\n",
"
2005.0
\n",
"
$620
\n",
"
$124
\n",
"
3.0
\n",
"
0.0
\n",
"
NaN
\n",
"
NaN
\n",
"
5.0
\n",
"
1.0
\n",
"
352.0
\n",
"
I encourage you to use my kitchen, cooking and...
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
1002755
\n",
"
NaN
\n",
"
85098326012
\n",
"
unconfirmed
\n",
"
Garry
\n",
"
Brooklyn
\n",
"
Clinton Hill
\n",
"
40.68514
\n",
"
-73.95976
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
2005.0
\n",
"
$368
\n",
"
$74
\n",
"
30.0
\n",
"
270.0
\n",
"
7/5/2019
\n",
"
4.64
\n",
"
4.0
\n",
"
1.0
\n",
"
322.0
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
1003689
\n",
"
Entire Apt: Spacious Studio/Loft by central park
\n",
"
92037596077
\n",
"
verified
\n",
"
Lyndon
\n",
"
Manhattan
\n",
"
East Harlem
\n",
"
40.79851
\n",
"
-73.94399
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
2009.0
\n",
"
$204
\n",
"
$41
\n",
"
10.0
\n",
"
9.0
\n",
"
11/19/2018
\n",
"
0.10
\n",
"
3.0
\n",
"
1.0
\n",
"
289.0
\n",
"
Please no smoking in the house, porch or on th...
\n",
"
NaN
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id NAME host id \\\n",
"0 1001254 Clean & quiet apt home by the park 80014485718 \n",
"1 1002102 Skylit Midtown Castle 52335172823 \n",
"2 1002403 THE VILLAGE OF HARLEM....NEW YORK ! 78829239556 \n",
"3 1002755 NaN 85098326012 \n",
"4 1003689 Entire Apt: Spacious Studio/Loft by central park 92037596077 \n",
"\n",
" host_identity_verified host name neighbourhood group neighbourhood \\\n",
"0 unconfirmed Madaline Brooklyn Kensington \n",
"1 verified Jenna Manhattan Midtown \n",
"2 NaN Elise Manhattan Harlem \n",
"3 unconfirmed Garry Brooklyn Clinton Hill \n",
"4 verified Lyndon Manhattan East Harlem \n",
"\n",
" lat long country country code instant_bookable \\\n",
"0 40.64749 -73.97237 United States US False \n",
"1 40.75362 -73.98377 United States US False \n",
"2 40.80902 -73.94190 United States US True \n",
"3 40.68514 -73.95976 United States US True \n",
"4 40.79851 -73.94399 United States US False \n",
"\n",
" cancellation_policy room type Construction year price service fee \\\n",
"0 strict Private room 2020.0 $966 $193 \n",
"1 moderate Entire home/apt 2007.0 $142 $28 \n",
"2 flexible Private room 2005.0 $620 $124 \n",
"3 moderate Entire home/apt 2005.0 $368 $74 \n",
"4 moderate Entire home/apt 2009.0 $204 $41 \n",
"\n",
" minimum nights number of reviews last review reviews per month \\\n",
"0 10.0 9.0 10/19/2021 0.21 \n",
"1 30.0 45.0 5/21/2022 0.38 \n",
"2 3.0 0.0 NaN NaN \n",
"3 30.0 270.0 7/5/2019 4.64 \n",
"4 10.0 9.0 11/19/2018 0.10 \n",
"\n",
" review rate number calculated host listings count availability 365 \\\n",
"0 4.0 6.0 286.0 \n",
"1 4.0 2.0 228.0 \n",
"2 5.0 1.0 352.0 \n",
"3 4.0 1.0 322.0 \n",
"4 3.0 1.0 289.0 \n",
"\n",
" house_rules license \n",
"0 Clean up and treat the home the way you'd like... NaN \n",
"1 Pet friendly but please confirm with me if the... NaN \n",
"2 I encourage you to use my kitchen, cooking and... NaN \n",
"3 NaN NaN \n",
"4 Please no smoking in the house, porch or on th... NaN "
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YfOasHJPy9i2"
},
"source": [
"Только на вещественные признаки:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 318
},
"id": "1g8X0fX8l4ZV",
"outputId": "ee914cf5-40b3-48fb-f80b-b38b9445eadc"
},
"outputs": [
{
"data": {
"text/html": [
"
\n"
],
"text/plain": [
" NAME host_identity_verified \\\n",
"0 Clean & quiet apt home by the park unconfirmed \n",
"1 Skylit Midtown Castle verified \n",
"2 THE VILLAGE OF HARLEM....NEW YORK ! NaN \n",
"3 NaN unconfirmed \n",
"4 Entire Apt: Spacious Studio/Loft by central park verified \n",
"\n",
" host name neighbourhood group neighbourhood country country code \\\n",
"0 Madaline Brooklyn Kensington United States US \n",
"1 Jenna Manhattan Midtown United States US \n",
"2 Elise Manhattan Harlem United States US \n",
"3 Garry Brooklyn Clinton Hill United States US \n",
"4 Lyndon Manhattan East Harlem United States US \n",
"\n",
" instant_bookable cancellation_policy room type price service fee \\\n",
"0 False strict Private room $966 $193 \n",
"1 False moderate Entire home/apt $142 $28 \n",
"2 True flexible Private room $620 $124 \n",
"3 True moderate Entire home/apt $368 $74 \n",
"4 False moderate Entire home/apt $204 $41 \n",
"\n",
" last review house_rules license \n",
"0 10/19/2021 Clean up and treat the home the way you'd like... NaN \n",
"1 5/21/2022 Pet friendly but please confirm with me if the... NaN \n",
"2 NaN I encourage you to use my kitchen, cooking and... NaN \n",
"3 7/5/2019 NaN NaN \n",
"4 11/19/2018 Please no smoking in the house, porch or on th... NaN "
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_object.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "omDSwCDYBRl6"
},
"source": [
"**Подход 1** Замена на определенную новую категорию\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 469
},
"id": "KcMV5o6C_WIa",
"outputId": "2559f9b9-f45f-4150-f767-b0c4c431f251"
},
"outputs": [
{
"data": {
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "tmp"
},
"text/html": [
"\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
NAME
\n",
"
host_identity_verified
\n",
"
host name
\n",
"
neighbourhood group
\n",
"
neighbourhood
\n",
"
country
\n",
"
country code
\n",
"
instant_bookable
\n",
"
cancellation_policy
\n",
"
room type
\n",
"
price
\n",
"
service fee
\n",
"
last review
\n",
"
house_rules
\n",
"
license
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Clean & quiet apt home by the park
\n",
"
unconfirmed
\n",
"
Madaline
\n",
"
Brooklyn
\n",
"
Kensington
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
strict
\n",
"
Private room
\n",
"
$966
\n",
"
$193
\n",
"
10/19/2021
\n",
"
Clean up and treat the home the way you'd like...
\n",
"
other
\n",
"
\n",
"
\n",
"
1
\n",
"
Skylit Midtown Castle
\n",
"
verified
\n",
"
Jenna
\n",
"
Manhattan
\n",
"
Midtown
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
$142
\n",
"
$28
\n",
"
5/21/2022
\n",
"
Pet friendly but please confirm with me if the...
\n",
"
other
\n",
"
\n",
"
\n",
"
2
\n",
"
THE VILLAGE OF HARLEM....NEW YORK !
\n",
"
other
\n",
"
Elise
\n",
"
Manhattan
\n",
"
Harlem
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
flexible
\n",
"
Private room
\n",
"
$620
\n",
"
$124
\n",
"
other
\n",
"
I encourage you to use my kitchen, cooking and...
\n",
"
other
\n",
"
\n",
"
\n",
"
3
\n",
"
other
\n",
"
unconfirmed
\n",
"
Garry
\n",
"
Brooklyn
\n",
"
Clinton Hill
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
$368
\n",
"
$74
\n",
"
7/5/2019
\n",
"
other
\n",
"
other
\n",
"
\n",
"
\n",
"
4
\n",
"
Entire Apt: Spacious Studio/Loft by central park
\n",
"
verified
\n",
"
Lyndon
\n",
"
Manhattan
\n",
"
East Harlem
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
$204
\n",
"
$41
\n",
"
11/19/2018
\n",
"
Please no smoking in the house, porch or on th...
\n",
"
other
\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
"\n",
" \n",
"\n",
" \n",
"
\n",
"\n",
"\n",
"
\n",
" \n",
"\n",
"\n",
"\n",
" \n",
"
\n",
"
\n",
"
\n"
],
"text/plain": [
" NAME host_identity_verified \\\n",
"0 Clean & quiet apt home by the park unconfirmed \n",
"1 Skylit Midtown Castle verified \n",
"2 THE VILLAGE OF HARLEM....NEW YORK ! other \n",
"3 other unconfirmed \n",
"4 Entire Apt: Spacious Studio/Loft by central park verified \n",
"\n",
" host name neighbourhood group neighbourhood country country code \\\n",
"0 Madaline Brooklyn Kensington United States US \n",
"1 Jenna Manhattan Midtown United States US \n",
"2 Elise Manhattan Harlem United States US \n",
"3 Garry Brooklyn Clinton Hill United States US \n",
"4 Lyndon Manhattan East Harlem United States US \n",
"\n",
" instant_bookable cancellation_policy room type price service fee \\\n",
"0 False strict Private room $966 $193 \n",
"1 False moderate Entire home/apt $142 $28 \n",
"2 True flexible Private room $620 $124 \n",
"3 True moderate Entire home/apt $368 $74 \n",
"4 False moderate Entire home/apt $204 $41 \n",
"\n",
" last review house_rules license \n",
"0 10/19/2021 Clean up and treat the home the way you'd like... other \n",
"1 5/21/2022 Pet friendly but please confirm with me if the... other \n",
"2 other I encourage you to use my kitchen, cooking and... other \n",
"3 7/5/2019 other other \n",
"4 11/19/2018 Please no smoking in the house, porch or on th... other "
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tmp = data_object.fillna(\"other\") # обратите внимание на столбец house_rules в 4й строке\n",
"tmp.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ijDgPrJaBpnz",
"outputId": "fb59ee4f-bcbd-4651-b1a0-5c8b6631d353"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RangeIndex: 102599 entries, 0 to 102598\n",
"Data columns (total 15 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 NAME 102599 non-null object\n",
" 1 host_identity_verified 102599 non-null object\n",
" 2 host name 102599 non-null object\n",
" 3 neighbourhood group 102599 non-null object\n",
" 4 neighbourhood 102599 non-null object\n",
" 5 country 102599 non-null object\n",
" 6 country code 102599 non-null object\n",
" 7 instant_bookable 102599 non-null object\n",
" 8 cancellation_policy 102599 non-null object\n",
" 9 room type 102599 non-null object\n",
" 10 price 102599 non-null object\n",
" 11 service fee 102599 non-null object\n",
" 12 last review 102599 non-null object\n",
" 13 house_rules 102599 non-null object\n",
" 14 license 102599 non-null object\n",
"dtypes: object(15)\n",
"memory usage: 11.7+ MB\n"
]
}
],
"source": [
"tmp.info()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3bsLAtKYBS_E"
},
"source": [
"**Подход 2** Замена на самую частую категорию по столбцам"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 503
},
"id": "_ty_mkMzAzm2",
"outputId": "0dc59481-7878-4a50-d139-4ad61453c627"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
":1: FutureWarning: Downcasting object dtype arrays on .fillna, .ffill, .bfill is deprecated and will change in a future version. Call result.infer_objects(copy=False) instead. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`\n",
" tmp = data_object.fillna(data_object.mode().iloc[0])\n"
]
},
{
"data": {
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "tmp"
},
"text/html": [
"\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
NAME
\n",
"
host_identity_verified
\n",
"
host name
\n",
"
neighbourhood group
\n",
"
neighbourhood
\n",
"
country
\n",
"
country code
\n",
"
instant_bookable
\n",
"
cancellation_policy
\n",
"
room type
\n",
"
price
\n",
"
service fee
\n",
"
last review
\n",
"
house_rules
\n",
"
license
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Clean & quiet apt home by the park
\n",
"
unconfirmed
\n",
"
Madaline
\n",
"
Brooklyn
\n",
"
Kensington
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
strict
\n",
"
Private room
\n",
"
$966
\n",
"
$193
\n",
"
10/19/2021
\n",
"
Clean up and treat the home the way you'd like...
\n",
"
41662/AL
\n",
"
\n",
"
\n",
"
1
\n",
"
Skylit Midtown Castle
\n",
"
verified
\n",
"
Jenna
\n",
"
Manhattan
\n",
"
Midtown
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
$142
\n",
"
$28
\n",
"
5/21/2022
\n",
"
Pet friendly but please confirm with me if the...
\n",
"
41662/AL
\n",
"
\n",
"
\n",
"
2
\n",
"
THE VILLAGE OF HARLEM....NEW YORK !
\n",
"
unconfirmed
\n",
"
Elise
\n",
"
Manhattan
\n",
"
Harlem
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
flexible
\n",
"
Private room
\n",
"
$620
\n",
"
$124
\n",
"
6/23/2019
\n",
"
I encourage you to use my kitchen, cooking and...
\n",
"
41662/AL
\n",
"
\n",
"
\n",
"
3
\n",
"
Home away from home
\n",
"
unconfirmed
\n",
"
Garry
\n",
"
Brooklyn
\n",
"
Clinton Hill
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
$368
\n",
"
$74
\n",
"
7/5/2019
\n",
"
#NAME?
\n",
"
41662/AL
\n",
"
\n",
"
\n",
"
4
\n",
"
Entire Apt: Spacious Studio/Loft by central park
\n",
"
verified
\n",
"
Lyndon
\n",
"
Manhattan
\n",
"
East Harlem
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
$204
\n",
"
$41
\n",
"
11/19/2018
\n",
"
Please no smoking in the house, porch or on th...
\n",
"
41662/AL
\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
"\n",
" \n",
"\n",
" \n",
"
\n",
"\n",
"\n",
"
\n",
" \n",
"\n",
"\n",
"\n",
" \n",
"
\n",
"
\n",
"
\n"
],
"text/plain": [
" NAME host_identity_verified \\\n",
"0 Clean & quiet apt home by the park unconfirmed \n",
"1 Skylit Midtown Castle verified \n",
"2 THE VILLAGE OF HARLEM....NEW YORK ! unconfirmed \n",
"3 Home away from home unconfirmed \n",
"4 Entire Apt: Spacious Studio/Loft by central park verified \n",
"\n",
" host name neighbourhood group neighbourhood country country code \\\n",
"0 Madaline Brooklyn Kensington United States US \n",
"1 Jenna Manhattan Midtown United States US \n",
"2 Elise Manhattan Harlem United States US \n",
"3 Garry Brooklyn Clinton Hill United States US \n",
"4 Lyndon Manhattan East Harlem United States US \n",
"\n",
" instant_bookable cancellation_policy room type price service fee \\\n",
"0 False strict Private room $966 $193 \n",
"1 False moderate Entire home/apt $142 $28 \n",
"2 True flexible Private room $620 $124 \n",
"3 True moderate Entire home/apt $368 $74 \n",
"4 False moderate Entire home/apt $204 $41 \n",
"\n",
" last review house_rules license \n",
"0 10/19/2021 Clean up and treat the home the way you'd like... 41662/AL \n",
"1 5/21/2022 Pet friendly but please confirm with me if the... 41662/AL \n",
"2 6/23/2019 I encourage you to use my kitchen, cooking and... 41662/AL \n",
"3 7/5/2019 #NAME? 41662/AL \n",
"4 11/19/2018 Please no smoking in the house, porch or on th... 41662/AL "
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tmp = data_object.fillna(data_object.mode().iloc[0])\n",
"tmp.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "C_v4d-QjB9IA",
"outputId": "1bb246ec-765a-43ee-9cfa-1aa7ba2519d6"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RangeIndex: 102599 entries, 0 to 102598\n",
"Data columns (total 15 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 NAME 102599 non-null object\n",
" 1 host_identity_verified 102599 non-null object\n",
" 2 host name 102599 non-null object\n",
" 3 neighbourhood group 102599 non-null object\n",
" 4 neighbourhood 102599 non-null object\n",
" 5 country 102599 non-null object\n",
" 6 country code 102599 non-null object\n",
" 7 instant_bookable 102599 non-null bool \n",
" 8 cancellation_policy 102599 non-null object\n",
" 9 room type 102599 non-null object\n",
" 10 price 102599 non-null object\n",
" 11 service fee 102599 non-null object\n",
" 12 last review 102599 non-null object\n",
" 13 house_rules 102599 non-null object\n",
" 14 license 102599 non-null object\n",
"dtypes: bool(1), object(14)\n",
"memory usage: 11.1+ MB\n"
]
}
],
"source": [
"tmp.info()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "n17kJ6mg15yy"
},
"source": [
"-------"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZQBgVAIvGoWG"
},
"source": [
"### Работа с дублями"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CCT_iGNKGqsQ"
},
"source": [
"Иногда необходимо удалять дубли из данных, так как несколько одинаковых объектов не всегда указывают на их большую значимость для алгоритма. Дубли могут возникать также из-за ошибок ввода."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 423
},
"id": "hSOrKmppGurr",
"outputId": "b4e0bb83-a707-45e5-b30e-3d5c8c66d0fd"
},
"outputs": [
{
"data": {
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "data_geo"
},
"text/html": [
"\n",
"
\n"
],
"text/plain": [
" lat long\n",
"0 40.64749 -73.97237\n",
"1 40.75362 -73.98377\n",
"2 40.80902 -73.94190\n",
"3 40.68514 -73.95976\n",
"4 40.79851 -73.94399\n",
"... ... ...\n",
"68289 40.75330 -73.99224\n",
"68290 40.84722 -73.93501\n",
"68291 40.84753 -73.94073\n",
"68292 40.76181 -73.93087\n",
"68293 40.71135 -73.96303\n",
"\n",
"[67163 rows x 2 columns]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_geo.drop_duplicates()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FnCyMQZ71SMf"
},
"source": [
"### Работа с вещественными выбросами (аномалиями)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SYm7ofprCk9N"
},
"source": [
"Каждый признак в данных имеет свое распределение, которое описывает, как значения этого признака распределены по всему набору данных. Одним из способов выявления аномалий является использование интерквартильного размаха (IQR), который показывает диапазон значений между первым (Q1) и третьим квартилями (Q3).\n",
"\n",
"$$IQR = Q_3 - Q_1$$\n",
"\n",
"где $Q_1$ — первая квартиль — такое значение признака, меньше которого ровно 25% всех значений признаков. $Q_3$ — третья квартиль — значение, меньше которого ровно 75% всех значений признака.\n",
"\n",
"\n",
"Аномалии могут быть определены как значения, выходящие за пределы диапазона\n",
"\n",
"$$[Q1 - 1.5 * IQR, Q3 + 1.5 * IQR]$$\n",
"\n",
" Такой подход позволяет эффективно находить выбросы, которые могут искажать анализ данных. Использование IQR помогает улучшить качество модели и повысить ее точность, исключая ненадежные данные."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"id": "xAQP4E4GEiHE"
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"sns.set()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "RMpLXll-YN0J"
},
"source": [
"В отображение графика box_plot (коробка с усами) уже входит отображение точек, выходящие за интерквартильный размах - в данном случает они выглядят как крулгые точки"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 588
},
"id": "Xmw4hS1KEM9W",
"outputId": "e90e4e35-52cb-465a-877f-26c080629743"
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAImCAYAAABXQlBnAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAiHJJREFUeJztnQm8TeX+/x9DZjIPkeak4Roi6V6l4WrScOs2CJUiDSJCShNukkSiOUqjBho0KZoHooFkSkXImHkezv6/3t9/z/6tsx2cjnOctdb+vF+v0z577XV267HWetbn+Y4FEolEwgkhhBBCxJiC+X0AQgghhBB5jQSPEEIIIWKPBI8QQgghYo8EjxBCCCFijwSPEEIIIWKPBI8QQgghYo8EjxBCCCFijwSPEEIIIWKPBI8QQgghYk/h/D6AsEDB6YwMFZ0WQgghokLBggVcgQIFsrWvBM9fIHZWrFif34chhBBCiGxSvnxJV6hQ9gSPXFpCCCGEiD0SPEIIIYSIPRI8QgghhIg9EjxCCCGEiD0SPEIIIYSIPRI8QgghhIg9EjxCCCGEiD0SPEIIIYSIPRI8QgghhIg9qrQsRJqTkZHhZs2a4VatWuXKli3ratWq7QoW1FpICBEvJHiESGMmT57oXnrpObd8+bLktooVK7kWLVq7Bg0a5euxCSFEblIgQddM4bZvz1AvLZF2Ymfo0EGuTp367pxzznc1atR0Cxb87saMecNNmfKd69Chs0SPECICvbSyZ5GW4PkLCR6Rbm6sbt06msjp1KlrJhcWnw0ePMAtXDjf9e8/WO4tIUQsBI9mMiHSEGJ2cGNh2UkVNLxn+7JlS20/IYSIAxI8QqQhBCgDFp6sqF59/0z7CSFE1JHgESINIRsLiNnJCtxZwf2EECLqSPAIkYaQek42FgHKxOwE4T3bK1WqbPsJIUQckOARIg0hTofUc7KxCFCeM2e227hxo73ynu2XXtpKActCiNigLK2/UJaWSEeyqsODZQexo5R0IUTYUVp6DpDgEemKKi0LIaKKBE8OkOARQgghooXq8AghhBBCBJDgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTskeARQgghROyR4BFCCCFE7JHgEUIIIUTsyRPBs2TJElerVq0dfkaPHm2fz5gxw7Vq1crVrVvXnXLKKe7ZZ5/N9PcZGRnuoYceck2aNLF92rVr5+bPn59pn919hxBCCCGEp7DLA2bOnOmKFi3qxo0b5woUKJDcXrp0abdy5UrXpk0bEym9evVyP/zwg72WLFnSXXjhhbbfI4884l588UXXr18/V7VqVXf//fe7tm3bujFjxrgiRYpk6zuEEEIIIfJU8MyePdsdeOCBrnLlyjt8NmLECLfPPvu43r17u8KFC7tDDjnEzZs3zz3xxBMmVrZs2eKGDx/uunbt6po2bWp/M2jQILP2fPDBB6558+bulVde2eV3CCGEEELkuUtr1qxZJkKyYvLkye64444zoeI5/vjj3dy5c93y5cvNOrR+/XrXuHHj5OdlypRxRx55pJs0aVK2vkMIIYQQYq9YeMqVK+datmzpfvvtN3fAAQe46667zp144olu8eLF7vDDD8+0v7cELVq0yD6HatWq7bCP/2x331GxYsUcHXfhworhFkIIIeJIrguebdu2uV9//dUdeuihrkePHq5UqVLunXfecddcc417+umn3aZNmywOJwjxPrB582a3ceNG+z2rfVavXm2/7+47ckLBggVcuXIlc/S3QgghhEgzwYObaeLEia5QoUKuWLFitu3oo492P//8sxs2bJhtI04niBcpJUqUSP4N+/jf/T7Fixe333f3HTkhIyPh1qzZkKO/FUIIIcTep0yZ4q5QoYL559IiWyqVww47zH3xxReWdbV06dJMn/n3VapUMQuR31azZs1M+5DaDrv7jpyybVtGjv9WCCGEEOEl14NWsOTUr1/frDxBpk2bZm6uhg0bum+//dZt3749+dmECRPcQQcd5CpUqOCOOOIIc4MF/37NmjVu+vTp9rewu+8QQgghhMhTwUN21sEHH2wp42RT/fLLL+7ee++1WjkELpM2vm7dOtezZ083Z84cK0b4zDPPuPbt29vfE5tDQcEBAwa48ePHW9ZW586dzarTrFkz22d33yGEEEIIEaRAIpFIuFyG1PAHHnjAff7552adIaWcujoNGjSwz6dOneruueces9pUqlTJXXXVVSZyPFhuBg4caEKGAGUsOnfeeaerUaNGcp/dfcff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EEIIEXtk4RFCiAiSkZHhZs2a4VatWuXKli3ratWqbSX6hRBZI8EjhBARY/Lkie6FF0a4FSv+TG4rX76Ca9nyCtegQaN8PTYhwoqWA0IIETGxM2TIwExiB3jPdj4XQuyILDwhqLAZ1oZxQojwubGefPLRXe7z1FOPuvr1G8q9JURcBA83/tChQ92rr77q1q5d6xo2bOjuvPNOt//++7uolRMPc5dcIUR4+OmnH92mTRt3uc/GjRttv2OOqbPXjktElz9X7vp6itOxRlbwPPLII+7FF190/fr1c1WrVnX333+/a9u2rRszZowrUqSIi1rvFIkeIf4eS5cucRs2rN+j75g799cdtpUoUTJHnaH3Bp9++lG295PgEdlhzLgd74G4EknBs2XLFjd8+HDXtWtX17RpU9s2aNAg16RJE/fBBx+45s2buzCLnZ11ypXoESJ7UHise/dOLpFI7NH33HXXrTtswxX00EOPWwn7sPHDD9/n6n5CnBPBwoNpJXhmzpzp1q9f7xo3bpzcVqZMGXfkkUe6SZMm5argmTdvrlu4cH629qVvyLp163a5z8kn/9s988xTmd5//PGHyffBzzylSpVy++1XPVvHUL36/u6AAw7M1r5ChI2/09unY8euWbp3/k45+/btO+ywrVix4nYc/ORlX5+csHXr5mwtnlL3E2JnpFPhwUgKnsWLF9trtWrVMm2vXLly8rPc4oUXnrFaF7lFUNzk5PPdQS2O22672+UHCsgOnyhYsWLFbmM+dsdXX32epSgoX758tv4+u6KAcXXvfpPbti3vevvkdq+fwoX3cf3756yvz5666w47rJb7/POPXeXKVd3SpYvt/c8/z8oXd93eviazIi+uSREvIil4CMqD1FidokWLutWrV+f4ewsX3jGr4fLL27iFCxdk6+8XLFjgNmzY0cIzbtwHyd9PO63Z3/68RIlSrkaNGtk6hurVa2Q5jrymZcuLdiqCXnjh1b1+PHFl+fJl7pbundzWbdsiIwr2KVzYDXjgIVexYqVd7se9szfFTm7A8XLcVapU3u2+c+f+lq25hPnt6aef3O1+iJugwMmOuw7atGnnihcvnq255MADD8reNXnLTW7r1uicu3322ccNGDB4t9fk3zlvu3oG/B2ee27YHj8DsnPeChUq+LcCgdeu2+K2bN3u8oIi+xRypUvtPvbWHyvHnpPn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yIueefPmmRBH1GF95CdK84gneLzcWwT0/uMf/3CHH364K1q0qMV13nHHHe6///2vu+uuu2w/rlXmmaiM78MPPzQBfs4559g8wjONuf+QQw4xSx3zzkknneRuuummSFjqJHhyiJ9MseRw0nnQoHbhpZdeci+++KJd+O3atYuspYfJlocHE22bNm1sG+ZaVmf4348//ngTP1GYrILHh3n2hx9+cNWrV7cHCwKHVTQPFs4jLgS2edN0FFbNjz32mMUMnHLKKW7BggUmfnh4XnLJJe6AAw4wKx3buCbhyy+/tOu0UqVKkRAF/n7zQpV4K8QO40GMI/AQ5Jxjxs/59O6hsMI1uO+++5rlDbHDOFhQEByKGDjssMNsPwQqCw8sBw0aNHC33nprZESPP29YqLhOeY/FgJgQLI9jxowx4c2DNArzSFZw3l599VW73nD/cF1edtllrly5cu7NN980kXrqqafamE888UQLAI4K69atszANnnNYhZkvWEixGORc9e3b102ePNkEbCSsPAge8ffIyMiw1/fffz9x/PHHJ/75z3/az//+97/kPi+++GLi3HPPTbRr1y5x7bXXJm6//fZE1Ni8eXPirLPOSvTq1WuH8ffp0ydRq1atxE033ZRpexgJHle/fv0S9erVS7Rq1cqO/4Ybbkj8+uuv9tl7772XOP/88xOXXXZZYvny5YkocemllyaOO+64xHXXXZe45pprElu3bk0MGTLEttWpUydx3333JX744Qfb96233rLxb9iwIRElpkyZkmjRokVi27Ztieuvv97O41FHHZW48sorbUzbt29PfPrpp4kLLrggsXr16kTYefbZZxNXXXWVHetPP/1k9xv3E2N6+OGHM+27bt26xIMPPpho3LhxYtiwYYko4O+7cePGJc4777zEv//978SJJ56YuPrqqxPTpk2ze4z78YQTTkg88cQTiagQnE8++eSTRLNmzRKTJ09OrF27NtG3b99EkyZNEkOHDk38+eefyXnlP//5j80r3JdhZtiwYfYc4/qbMWOGbVuxYoU9y5gvX3rpJdvGPQi///67bf/2228TUSD8y9cQwoqFIMPu3bvbD/ED+OBHjBhhyrdHjx4WJMp+n3zyicX0XH/99S7MZLWyYhWJa+C3336zLB9vHWBcWEfq169vgdp33nmn6927d2gtBf64nn32WVtRPvfcc2aW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",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.boxplot(data_with_no_anomalies)\n",
"plt.xticks(rotation=45, ha='right')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3f7bWt5EZVGl"
},
"source": [
"#### **Задание 8 [1 балл]**\n",
"\n",
"Почему на получившемся графике все еще отображаются точки (аномалии)?"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2uj4nQCoZbMI"
},
"source": [
"**Ваши выводы тут:** seaborn ищет выбросы уже на новых данных, таким образом появляются новые аномалии, ведь значения квантилей могут измениться"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "hnMUSMAESrPy"
},
"source": [
"### Работа с категориальными выбросами (аномалиями)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qgoePXv7aFq0"
},
"source": [
"Анализ встречаемости категориальных признаков позволяет выявить категории с низкой частотой. Их можно объединить, что ускорит обучение алгоритмов и может улучшить качество модели. Этот подход также помогает обнаружить битые данные, о чем мы поговорим далее."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 334
},
"id": "6Lf-iSBhW38m",
"outputId": "5f9a3d63-6340-441c-f1cd-32c9eb9e1509"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
count
\n",
"
\n",
"
\n",
"
neighbourhood group
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
Manhattan
\n",
"
43792
\n",
"
\n",
"
\n",
"
Brooklyn
\n",
"
41842
\n",
"
\n",
"
\n",
"
Queens
\n",
"
13267
\n",
"
\n",
"
\n",
"
Bronx
\n",
"
2712
\n",
"
\n",
"
\n",
"
Staten Island
\n",
"
955
\n",
"
\n",
"
\n",
"
brookln
\n",
"
1
\n",
"
\n",
"
\n",
"
manhatan
\n",
"
1
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"neighbourhood group\n",
"Manhattan 43792\n",
"Brooklyn 41842\n",
"Queens 13267\n",
"Bronx 2712\n",
"Staten Island 955\n",
"brookln 1\n",
"manhatan 1\n",
"Name: count, dtype: int64"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_new = data.select_dtypes('object')\n",
"value_counts = data_new[\"neighbourhood group\"].value_counts(ascending=False)\n",
"value_counts"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uBYh1L5feXCX"
},
"source": [
"Например, в признаке `neighbourhood group` всего 2 выделяющихся значений: их можно как и записать в категорию `other`, так и в целом удалить из данных"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 303
},
"id": "az1WB8slcdWK",
"outputId": "c37caa96-3ab5-42ef-802e-765104a34839"
},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" id NAME \\\n",
"0 1001254 Clean & quiet apt home by the park \n",
"1 1002102 Skylit Midtown Castle \n",
"2 1002403 THE VILLAGE OF HARLEM....NEW YORK ! \n",
"3 1002755 NaN \n",
"4 1003689 Entire Apt: Spacious Studio/Loft by central park \n",
"... ... ... \n",
"102594 6092437 Spare room in Williamsburg \n",
"102595 6092990 Best Location near Columbia U \n",
"102596 6093542 Comfy, bright room in Brooklyn \n",
"102597 6094094 Big Studio-One Stop from Midtown \n",
"102598 6094647 585 sf Luxury Studio \n",
"\n",
" host id host_identity_verified host name neighbourhood group \\\n",
"0 80014485718 unconfirmed Madaline Brooklyn \n",
"1 52335172823 verified Jenna Manhattan \n",
"2 78829239556 NaN Elise Manhattan \n",
"3 85098326012 unconfirmed Garry Brooklyn \n",
"4 92037596077 verified Lyndon Manhattan \n",
"... ... ... ... ... \n",
"102594 12312296767 verified Krik Brooklyn \n",
"102595 77864383453 unconfirmed Mifan Manhattan \n",
"102596 69050334417 unconfirmed Megan Brooklyn \n",
"102597 11160591270 unconfirmed Christopher Queens \n",
"102598 68170633372 unconfirmed Rebecca Manhattan \n",
"\n",
" neighbourhood lat long country country code \\\n",
"0 Kensington 40.64749 -73.97237 United States US \n",
"1 Midtown 40.75362 -73.98377 United States US \n",
"2 Harlem 40.80902 -73.94190 United States US \n",
"3 Clinton Hill 40.68514 -73.95976 United States US \n",
"4 East Harlem 40.79851 -73.94399 United States US \n",
"... ... ... ... ... ... \n",
"102594 Williamsburg 40.70862 -73.94651 United States US \n",
"102595 Morningside Heights 40.80460 -73.96545 United States US \n",
"102596 Park Slope 40.67505 -73.98045 United States US \n",
"102597 Long Island City 40.74989 -73.93777 United States US \n",
"102598 Upper West Side 40.76807 -73.98342 United States US \n",
"\n",
" instant_bookable cancellation_policy room type \\\n",
"0 False strict Private room \n",
"1 False moderate Entire home/apt \n",
"2 True flexible Private room \n",
"3 True moderate Entire home/apt \n",
"4 False moderate Entire home/apt \n",
"... ... ... ... \n",
"102594 False flexible Private room \n",
"102595 True moderate Private room \n",
"102596 True moderate Private room \n",
"102597 True strict Entire home/apt \n",
"102598 False flexible Entire home/apt \n",
"\n",
" Construction year price service fee minimum nights \\\n",
"0 2020.0 $966 $193 10.0 \n",
"1 2007.0 $142 $28 30.0 \n",
"2 2005.0 $620 $124 3.0 \n",
"3 2005.0 $368 $74 30.0 \n",
"4 2009.0 $204 $41 10.0 \n",
"... ... ... ... ... \n",
"102594 2003.0 $844 $169 1.0 \n",
"102595 2016.0 $837 $167 1.0 \n",
"102596 2009.0 $988 $198 3.0 \n",
"102597 2015.0 $546 $109 2.0 \n",
"102598 2010.0 $1,032 $206 1.0 \n",
"\n",
" number of reviews last review reviews per month review rate number \\\n",
"0 9.0 10/19/2021 0.21 4.0 \n",
"1 45.0 5/21/2022 0.38 4.0 \n",
"2 0.0 NaN NaN 5.0 \n",
"3 270.0 7/5/2019 4.64 4.0 \n",
"4 9.0 11/19/2018 0.10 3.0 \n",
"... ... ... ... ... \n",
"102594 0.0 NaN NaN 3.0 \n",
"102595 1.0 7/6/2015 0.02 2.0 \n",
"102596 0.0 NaN NaN 5.0 \n",
"102597 5.0 10/11/2015 0.10 3.0 \n",
"102598 0.0 NaN NaN 3.0 \n",
"\n",
" calculated host listings count availability 365 \\\n",
"0 6.0 286.0 \n",
"1 2.0 228.0 \n",
"2 1.0 352.0 \n",
"3 1.0 322.0 \n",
"4 1.0 289.0 \n",
"... ... ... \n",
"102594 1.0 227.0 \n",
"102595 2.0 395.0 \n",
"102596 1.0 342.0 \n",
"102597 1.0 386.0 \n",
"102598 1.0 69.0 \n",
"\n",
" house_rules license \n",
"0 Clean up and treat the home the way you'd like... NaN \n",
"1 Pet friendly but please confirm with me if the... NaN \n",
"2 I encourage you to use my kitchen, cooking and... NaN \n",
"3 NaN NaN \n",
"4 Please no smoking in the house, porch or on th... NaN \n",
"... ... ... \n",
"102594 No Smoking No Parties or Events of any kind Pl... NaN \n",
"102595 House rules: Guests agree to the following ter... NaN \n",
"102596 NaN NaN \n",
"102597 NaN NaN \n",
"102598 NaN NaN \n",
"\n",
"[102599 rows x 26 columns]"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"id": "8Ha0g_Qmfiad"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
NAME
\n",
"
host_identity_verified
\n",
"
host name
\n",
"
neighbourhood group
\n",
"
neighbourhood
\n",
"
lat
\n",
"
long
\n",
"
country
\n",
"
country code
\n",
"
instant_bookable
\n",
"
cancellation_policy
\n",
"
room type
\n",
"
Construction year
\n",
"
minimum nights
\n",
"
number of reviews
\n",
"
last review
\n",
"
reviews per month
\n",
"
review rate number
\n",
"
calculated host listings count
\n",
"
availability 365
\n",
"
house_rules
\n",
"
license
\n",
"
price_value
\n",
"
service_fee_value
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Clean & quiet apt home by the park
\n",
"
unconfirmed
\n",
"
Madaline
\n",
"
Brooklyn
\n",
"
Kensington
\n",
"
40.64749
\n",
"
-73.97237
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
strict
\n",
"
Private room
\n",
"
2020.0
\n",
"
10.0
\n",
"
9.0
\n",
"
10/19/2021
\n",
"
0.21
\n",
"
4.0
\n",
"
6.0
\n",
"
286.0
\n",
"
Clean up and treat the home the way you'd like...
\n",
"
NaN
\n",
"
966.0
\n",
"
193.0
\n",
"
\n",
"
\n",
"
1
\n",
"
Skylit Midtown Castle
\n",
"
verified
\n",
"
Jenna
\n",
"
Manhattan
\n",
"
Midtown
\n",
"
40.75362
\n",
"
-73.98377
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
2007.0
\n",
"
30.0
\n",
"
45.0
\n",
"
5/21/2022
\n",
"
0.38
\n",
"
4.0
\n",
"
2.0
\n",
"
228.0
\n",
"
Pet friendly but please confirm with me if the...
\n",
"
NaN
\n",
"
142.0
\n",
"
28.0
\n",
"
\n",
"
\n",
"
2
\n",
"
THE VILLAGE OF HARLEM....NEW YORK !
\n",
"
NaN
\n",
"
Elise
\n",
"
Manhattan
\n",
"
Harlem
\n",
"
40.80902
\n",
"
-73.94190
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
flexible
\n",
"
Private room
\n",
"
2005.0
\n",
"
3.0
\n",
"
0.0
\n",
"
NaN
\n",
"
NaN
\n",
"
5.0
\n",
"
1.0
\n",
"
352.0
\n",
"
I encourage you to use my kitchen, cooking and...
\n",
"
NaN
\n",
"
620.0
\n",
"
124.0
\n",
"
\n",
"
\n",
"
3
\n",
"
NaN
\n",
"
unconfirmed
\n",
"
Garry
\n",
"
Brooklyn
\n",
"
Clinton Hill
\n",
"
40.68514
\n",
"
-73.95976
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
2005.0
\n",
"
30.0
\n",
"
270.0
\n",
"
7/5/2019
\n",
"
4.64
\n",
"
4.0
\n",
"
1.0
\n",
"
322.0
\n",
"
NaN
\n",
"
NaN
\n",
"
368.0
\n",
"
74.0
\n",
"
\n",
"
\n",
"
4
\n",
"
Entire Apt: Spacious Studio/Loft by central park
\n",
"
verified
\n",
"
Lyndon
\n",
"
Manhattan
\n",
"
East Harlem
\n",
"
40.79851
\n",
"
-73.94399
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
2009.0
\n",
"
10.0
\n",
"
9.0
\n",
"
11/19/2018
\n",
"
0.10
\n",
"
3.0
\n",
"
1.0
\n",
"
289.0
\n",
"
Please no smoking in the house, porch or on th...
\n",
"
NaN
\n",
"
204.0
\n",
"
41.0
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
102592
\n",
"
3BR/1 Ba in TriBeCa w/ outdoor deck
\n",
"
unconfirmed
\n",
"
Nick
\n",
"
Manhattan
\n",
"
Tribeca
\n",
"
40.71845
\n",
"
-74.01183
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
2016.0
\n",
"
1.0
\n",
"
0.0
\n",
"
NaN
\n",
"
NaN
\n",
"
2.0
\n",
"
1.0
\n",
"
177.0
\n",
"
Guests should treat my home as if it were thei...
\n",
"
NaN
\n",
"
787.0
\n",
"
157.0
\n",
"
\n",
"
\n",
"
102594
\n",
"
Spare room in Williamsburg
\n",
"
verified
\n",
"
Krik
\n",
"
Brooklyn
\n",
"
Williamsburg
\n",
"
40.70862
\n",
"
-73.94651
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
flexible
\n",
"
Private room
\n",
"
2003.0
\n",
"
1.0
\n",
"
0.0
\n",
"
NaN
\n",
"
NaN
\n",
"
3.0
\n",
"
1.0
\n",
"
227.0
\n",
"
No Smoking No Parties or Events of any kind Pl...
\n",
"
NaN
\n",
"
844.0
\n",
"
169.0
\n",
"
\n",
"
\n",
"
102595
\n",
"
Best Location near Columbia U
\n",
"
unconfirmed
\n",
"
Mifan
\n",
"
Manhattan
\n",
"
Morningside Heights
\n",
"
40.80460
\n",
"
-73.96545
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
moderate
\n",
"
Private room
\n",
"
2016.0
\n",
"
1.0
\n",
"
1.0
\n",
"
7/6/2015
\n",
"
0.02
\n",
"
2.0
\n",
"
2.0
\n",
"
395.0
\n",
"
House rules: Guests agree to the following ter...
\n",
"
NaN
\n",
"
837.0
\n",
"
167.0
\n",
"
\n",
"
\n",
"
102596
\n",
"
Comfy, bright room in Brooklyn
\n",
"
unconfirmed
\n",
"
Megan
\n",
"
Brooklyn
\n",
"
Park Slope
\n",
"
40.67505
\n",
"
-73.98045
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
moderate
\n",
"
Private room
\n",
"
2009.0
\n",
"
3.0
\n",
"
0.0
\n",
"
NaN
\n",
"
NaN
\n",
"
5.0
\n",
"
1.0
\n",
"
342.0
\n",
"
NaN
\n",
"
NaN
\n",
"
988.0
\n",
"
198.0
\n",
"
\n",
"
\n",
"
102597
\n",
"
Big Studio-One Stop from Midtown
\n",
"
unconfirmed
\n",
"
Christopher
\n",
"
Queens
\n",
"
Long Island City
\n",
"
40.74989
\n",
"
-73.93777
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
strict
\n",
"
Entire home/apt
\n",
"
2015.0
\n",
"
2.0
\n",
"
5.0
\n",
"
10/11/2015
\n",
"
0.10
\n",
"
3.0
\n",
"
1.0
\n",
"
386.0
\n",
"
NaN
\n",
"
NaN
\n",
"
546.0
\n",
"
109.0
\n",
"
\n",
" \n",
"
\n",
"
84263 rows × 24 columns
\n",
"
"
],
"text/plain": [
" NAME \\\n",
"0 Clean & quiet apt home by the park \n",
"1 Skylit Midtown Castle \n",
"2 THE VILLAGE OF HARLEM....NEW YORK ! \n",
"3 NaN \n",
"4 Entire Apt: Spacious Studio/Loft by central park \n",
"... ... \n",
"102592 3BR/1 Ba in TriBeCa w/ outdoor deck \n",
"102594 Spare room in Williamsburg \n",
"102595 Best Location near Columbia U \n",
"102596 Comfy, bright room in Brooklyn \n",
"102597 Big Studio-One Stop from Midtown \n",
"\n",
" host_identity_verified host name neighbourhood group \\\n",
"0 unconfirmed Madaline Brooklyn \n",
"1 verified Jenna Manhattan \n",
"2 NaN Elise Manhattan \n",
"3 unconfirmed Garry Brooklyn \n",
"4 verified Lyndon Manhattan \n",
"... ... ... ... \n",
"102592 unconfirmed Nick Manhattan \n",
"102594 verified Krik Brooklyn \n",
"102595 unconfirmed Mifan Manhattan \n",
"102596 unconfirmed Megan Brooklyn \n",
"102597 unconfirmed Christopher Queens \n",
"\n",
" neighbourhood lat long country country code \\\n",
"0 Kensington 40.64749 -73.97237 United States US \n",
"1 Midtown 40.75362 -73.98377 United States US \n",
"2 Harlem 40.80902 -73.94190 United States US \n",
"3 Clinton Hill 40.68514 -73.95976 United States US \n",
"4 East Harlem 40.79851 -73.94399 United States US \n",
"... ... ... ... ... ... \n",
"102592 Tribeca 40.71845 -74.01183 United States US \n",
"102594 Williamsburg 40.70862 -73.94651 United States US \n",
"102595 Morningside Heights 40.80460 -73.96545 United States US \n",
"102596 Park Slope 40.67505 -73.98045 United States US \n",
"102597 Long Island City 40.74989 -73.93777 United States US \n",
"\n",
" instant_bookable cancellation_policy room type \\\n",
"0 False strict Private room \n",
"1 False moderate Entire home/apt \n",
"2 True flexible Private room \n",
"3 True moderate Entire home/apt \n",
"4 False moderate Entire home/apt \n",
"... ... ... ... \n",
"102592 False moderate Entire home/apt \n",
"102594 False flexible Private room \n",
"102595 True moderate Private room \n",
"102596 True moderate Private room \n",
"102597 True strict Entire home/apt \n",
"\n",
" Construction year minimum nights number of reviews last review \\\n",
"0 2020.0 10.0 9.0 10/19/2021 \n",
"1 2007.0 30.0 45.0 5/21/2022 \n",
"2 2005.0 3.0 0.0 NaN \n",
"3 2005.0 30.0 270.0 7/5/2019 \n",
"4 2009.0 10.0 9.0 11/19/2018 \n",
"... ... ... ... ... \n",
"102592 2016.0 1.0 0.0 NaN \n",
"102594 2003.0 1.0 0.0 NaN \n",
"102595 2016.0 1.0 1.0 7/6/2015 \n",
"102596 2009.0 3.0 0.0 NaN \n",
"102597 2015.0 2.0 5.0 10/11/2015 \n",
"\n",
" reviews per month review rate number calculated host listings count \\\n",
"0 0.21 4.0 6.0 \n",
"1 0.38 4.0 2.0 \n",
"2 NaN 5.0 1.0 \n",
"3 4.64 4.0 1.0 \n",
"4 0.10 3.0 1.0 \n",
"... ... ... ... \n",
"102592 NaN 2.0 1.0 \n",
"102594 NaN 3.0 1.0 \n",
"102595 0.02 2.0 2.0 \n",
"102596 NaN 5.0 1.0 \n",
"102597 0.10 3.0 1.0 \n",
"\n",
" availability 365 house_rules \\\n",
"0 286.0 Clean up and treat the home the way you'd like... \n",
"1 228.0 Pet friendly but please confirm with me if the... \n",
"2 352.0 I encourage you to use my kitchen, cooking and... \n",
"3 322.0 NaN \n",
"4 289.0 Please no smoking in the house, porch or on th... \n",
"... ... ... \n",
"102592 177.0 Guests should treat my home as if it were thei... \n",
"102594 227.0 No Smoking No Parties or Events of any kind Pl... \n",
"102595 395.0 House rules: Guests agree to the following ter... \n",
"102596 342.0 NaN \n",
"102597 386.0 NaN \n",
"\n",
" license price_value service_fee_value \n",
"0 NaN 966.0 193.0 \n",
"1 NaN 142.0 28.0 \n",
"2 NaN 620.0 124.0 \n",
"3 NaN 368.0 74.0 \n",
"4 NaN 204.0 41.0 \n",
"... ... ... ... \n",
"102592 NaN 787.0 157.0 \n",
"102594 NaN 844.0 169.0 \n",
"102595 NaN 837.0 167.0 \n",
"102596 NaN 988.0 198.0 \n",
"102597 NaN 546.0 109.0 \n",
"\n",
"[84263 rows x 24 columns]"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data['price_value'] = data['price'].apply(lambda x: parse_price(x))\n",
"data['service_fee_value'] = data['service fee'].apply(lambda x: parse_price(x))\n",
"data_cleared = data.dropna(subset=['price_value', 'service_fee_value'], axis=0)\n",
"data_cleared = data_cleared.drop(['price', 'id', 'host id', 'service fee'], axis=1)\n",
"data_cleared"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rTz_nMeChu-y"
},
"source": [
"Заменим все пропуски в вещественных признаках на среднее:"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"id": "3IhYAcSFiIo5"
},
"outputs": [],
"source": [
"number_columns = data_cleared.select_dtypes(include=['number']).columns\n",
"\n",
"data_cleared[number_columns] = data_cleared[number_columns].fillna(data_cleared[number_columns].mean())"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "M2zg4iP0g7tg"
},
"source": [
"Пусть целевое значение, которое мы хотим предсказать - это `price`. Все остальное - признаки.\n",
"\n",
"Выделим обучающую и тестовую выборки:"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"id": "EWpB0QSRhEDC"
},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"id": "wOVimLTkhMij"
},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(data_cleared.drop('price_value', axis=1), data_cleared[['price_value']], test_size=0.2)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"id": "t6TQ18kOho1c"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
NAME
\n",
"
host_identity_verified
\n",
"
host name
\n",
"
neighbourhood group
\n",
"
neighbourhood
\n",
"
lat
\n",
"
long
\n",
"
country
\n",
"
country code
\n",
"
instant_bookable
\n",
"
cancellation_policy
\n",
"
room type
\n",
"
Construction year
\n",
"
minimum nights
\n",
"
number of reviews
\n",
"
last review
\n",
"
reviews per month
\n",
"
review rate number
\n",
"
calculated host listings count
\n",
"
availability 365
\n",
"
house_rules
\n",
"
license
\n",
"
service_fee_value
\n",
"
\n",
" \n",
" \n",
"
\n",
"
13783
\n",
"
Private bedroom located in Bushwick
\n",
"
unconfirmed
\n",
"
Robert
\n",
"
Brooklyn
\n",
"
Bushwick
\n",
"
40.68597
\n",
"
-73.91417
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
moderate
\n",
"
Private room
\n",
"
2020.0
\n",
"
1.000000
\n",
"
1.0
\n",
"
1/31/2016
\n",
"
0.020000
\n",
"
5.0
\n",
"
1.0
\n",
"
48.0
\n",
"
NaN
\n",
"
NaN
\n",
"
146.0
\n",
"
\n",
"
\n",
"
10388
\n",
"
East Village Private Room & Bath
\n",
"
verified
\n",
"
Can
\n",
"
Manhattan
\n",
"
East Village
\n",
"
40.72775
\n",
"
-73.98630
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
moderate
\n",
"
Private room
\n",
"
2009.0
\n",
"
2.000000
\n",
"
0.0
\n",
"
NaN
\n",
"
1.369945
\n",
"
4.0
\n",
"
2.0
\n",
"
364.0
\n",
"
1. Please let me know ahead your arrival, che...
\n",
"
NaN
\n",
"
159.0
\n",
"
\n",
"
\n",
"
1254
\n",
"
Beautiful bedroom in Prospect Heights
\n",
"
verified
\n",
"
Maite & Javi
\n",
"
Brooklyn
\n",
"
Prospect Heights
\n",
"
40.67440
\n",
"
-73.96558
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
flexible
\n",
"
Private room
\n",
"
2022.0
\n",
"
7.000000
\n",
"
43.0
\n",
"
6/29/2019
\n",
"
0.520000
\n",
"
3.0
\n",
"
1.0
\n",
"
222.0
\n",
"
NO Smoking. Pets permitted with fee.
\n",
"
NaN
\n",
"
65.0
\n",
"
\n",
"
\n",
"
92537
\n",
"
Madinina
\n",
"
unconfirmed
\n",
"
Bertin
\n",
"
Manhattan
\n",
"
Harlem
\n",
"
40.81294
\n",
"
-73.94609
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
moderate
\n",
"
Private room
\n",
"
2022.0
\n",
"
2.000000
\n",
"
30.0
\n",
"
7/1/2019
\n",
"
1.880000
\n",
"
3.0
\n",
"
2.0
\n",
"
331.0
\n",
"
No Loud Music
\n",
"
NaN
\n",
"
156.0
\n",
"
\n",
"
\n",
"
65750
\n",
"
Light, spacious apartment in trendy neighborhood
\n",
"
unconfirmed
\n",
"
Kathryn
\n",
"
Brooklyn
\n",
"
Crown Heights
\n",
"
40.67521
\n",
"
-73.94838
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
flexible
\n",
"
Entire home/apt
\n",
"
2010.0
\n",
"
7.000000
\n",
"
10.0
\n",
"
4/10/2021
\n",
"
0.280000
\n",
"
5.0
\n",
"
1.0
\n",
"
0.0
\n",
"
NaN
\n",
"
NaN
\n",
"
19.0
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
42632
\n",
"
Times Square
\n",
"
verified
\n",
"
Justin
\n",
"
Manhattan
\n",
"
Midtown
\n",
"
40.75492
\n",
"
-73.98027
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
flexible
\n",
"
Private room
\n",
"
2005.0
\n",
"
8.110104
\n",
"
0.0
\n",
"
NaN
\n",
"
1.369945
\n",
"
3.0
\n",
"
1.0
\n",
"
201.0
\n",
"
1. Only the ORIGINAL OCCUPANTS at the time of ...
\n",
"
NaN
\n",
"
120.0
\n",
"
\n",
"
\n",
"
89920
\n",
"
Walk through room close to everything
\n",
"
verified
\n",
"
Kate
\n",
"
Manhattan
\n",
"
Lower East Side
\n",
"
40.71339
\n",
"
-73.98926
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
flexible
\n",
"
Private room
\n",
"
2018.0
\n",
"
3.000000
\n",
"
47.0
\n",
"
5/22/2019
\n",
"
1.500000
\n",
"
2.0
\n",
"
1.0
\n",
"
217.0
\n",
"
Please remember that this is a residential bui...
\n",
"
NaN
\n",
"
15.0
\n",
"
\n",
"
\n",
"
76426
\n",
"
Cozy Private Bedroom, Access to Terrace
\n",
"
unconfirmed
\n",
"
Eric
\n",
"
Brooklyn
\n",
"
Crown Heights
\n",
"
40.67700
\n",
"
-73.95923
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
strict
\n",
"
Private room
\n",
"
2005.0
\n",
"
30.000000
\n",
"
0.0
\n",
"
NaN
\n",
"
1.369945
\n",
"
2.0
\n",
"
1.0
\n",
"
88.0
\n",
"
Please do not try and fit more than 4 occupant...
\n",
"
NaN
\n",
"
70.0
\n",
"
\n",
"
\n",
"
99652
\n",
"
Sunny studio loft in Brooklyn
\n",
"
unconfirmed
\n",
"
Michelle
\n",
"
Brooklyn
\n",
"
Williamsburg
\n",
"
40.71783
\n",
"
-73.94104
\n",
"
United States
\n",
"
US
\n",
"
True
\n",
"
moderate
\n",
"
Entire home/apt
\n",
"
2005.0
\n",
"
3.000000
\n",
"
12.0
\n",
"
5/27/2019
\n",
"
0.930000
\n",
"
3.0
\n",
"
1.0
\n",
"
0.0
\n",
"
At La Casita we expect our guests to be respec...
\n",
"
NaN
\n",
"
176.0
\n",
"
\n",
"
\n",
"
31904
\n",
"
Beautiful and Spacious UES Gallery Like apartment
\n",
"
unconfirmed
\n",
"
Kenneth
\n",
"
Manhattan
\n",
"
Upper East Side
\n",
"
40.76180
\n",
"
-73.96546
\n",
"
United States
\n",
"
US
\n",
"
False
\n",
"
flexible
\n",
"
Entire home/apt
\n",
"
2022.0
\n",
"
2.000000
\n",
"
0.0
\n",
"
NaN
\n",
"
1.369945
\n",
"
2.0
\n",
"
1.0
\n",
"
83.0
\n",
"
Please be courteous of our neighbors! We love ...
\n",
"
NaN
\n",
"
52.0
\n",
"
\n",
" \n",
"
\n",
"
67410 rows × 23 columns
\n",
"
"
],
"text/plain": [
" NAME \\\n",
"13783 Private bedroom located in Bushwick \n",
"10388 East Village Private Room & Bath \n",
"1254 Beautiful bedroom in Prospect Heights \n",
"92537 Madinina \n",
"65750 Light, spacious apartment in trendy neighborhood \n",
"... ... \n",
"42632 Times Square \n",
"89920 Walk through room close to everything \n",
"76426 Cozy Private Bedroom, Access to Terrace \n",
"99652 Sunny studio loft in Brooklyn \n",
"31904 Beautiful and Spacious UES Gallery Like apartment \n",
"\n",
" host_identity_verified host name neighbourhood group \\\n",
"13783 unconfirmed Robert Brooklyn \n",
"10388 verified Can Manhattan \n",
"1254 verified Maite & Javi Brooklyn \n",
"92537 unconfirmed Bertin Manhattan \n",
"65750 unconfirmed Kathryn Brooklyn \n",
"... ... ... ... \n",
"42632 verified Justin Manhattan \n",
"89920 verified Kate Manhattan \n",
"76426 unconfirmed Eric Brooklyn \n",
"99652 unconfirmed Michelle Brooklyn \n",
"31904 unconfirmed Kenneth Manhattan \n",
"\n",
" neighbourhood lat long country country code \\\n",
"13783 Bushwick 40.68597 -73.91417 United States US \n",
"10388 East Village 40.72775 -73.98630 United States US \n",
"1254 Prospect Heights 40.67440 -73.96558 United States US \n",
"92537 Harlem 40.81294 -73.94609 United States US \n",
"65750 Crown Heights 40.67521 -73.94838 United States US \n",
"... ... ... ... ... ... \n",
"42632 Midtown 40.75492 -73.98027 United States US \n",
"89920 Lower East Side 40.71339 -73.98926 United States US \n",
"76426 Crown Heights 40.67700 -73.95923 United States US \n",
"99652 Williamsburg 40.71783 -73.94104 United States US \n",
"31904 Upper East Side 40.76180 -73.96546 United States US \n",
"\n",
" instant_bookable cancellation_policy room type \\\n",
"13783 False moderate Private room \n",
"10388 True moderate Private room \n",
"1254 False flexible Private room \n",
"92537 True moderate Private room \n",
"65750 True flexible Entire home/apt \n",
"... ... ... ... \n",
"42632 True flexible Private room \n",
"89920 False flexible Private room \n",
"76426 False strict Private room \n",
"99652 True moderate Entire home/apt \n",
"31904 False flexible Entire home/apt \n",
"\n",
" Construction year minimum nights number of reviews last review \\\n",
"13783 2020.0 1.000000 1.0 1/31/2016 \n",
"10388 2009.0 2.000000 0.0 NaN \n",
"1254 2022.0 7.000000 43.0 6/29/2019 \n",
"92537 2022.0 2.000000 30.0 7/1/2019 \n",
"65750 2010.0 7.000000 10.0 4/10/2021 \n",
"... ... ... ... ... \n",
"42632 2005.0 8.110104 0.0 NaN \n",
"89920 2018.0 3.000000 47.0 5/22/2019 \n",
"76426 2005.0 30.000000 0.0 NaN \n",
"99652 2005.0 3.000000 12.0 5/27/2019 \n",
"31904 2022.0 2.000000 0.0 NaN \n",
"\n",
" reviews per month review rate number calculated host listings count \\\n",
"13783 0.020000 5.0 1.0 \n",
"10388 1.369945 4.0 2.0 \n",
"1254 0.520000 3.0 1.0 \n",
"92537 1.880000 3.0 2.0 \n",
"65750 0.280000 5.0 1.0 \n",
"... ... ... ... \n",
"42632 1.369945 3.0 1.0 \n",
"89920 1.500000 2.0 1.0 \n",
"76426 1.369945 2.0 1.0 \n",
"99652 0.930000 3.0 1.0 \n",
"31904 1.369945 2.0 1.0 \n",
"\n",
" availability 365 house_rules \\\n",
"13783 48.0 NaN \n",
"10388 364.0 1. Please let me know ahead your arrival, che... \n",
"1254 222.0 NO Smoking. Pets permitted with fee. \n",
"92537 331.0 No Loud Music \n",
"65750 0.0 NaN \n",
"... ... ... \n",
"42632 201.0 1. Only the ORIGINAL OCCUPANTS at the time of ... \n",
"89920 217.0 Please remember that this is a residential bui... \n",
"76426 88.0 Please do not try and fit more than 4 occupant... \n",
"99652 0.0 At La Casita we expect our guests to be respec... \n",
"31904 83.0 Please be courteous of our neighbors! We love ... \n",
"\n",
" license service_fee_value \n",
"13783 NaN 146.0 \n",
"10388 NaN 159.0 \n",
"1254 NaN 65.0 \n",
"92537 NaN 156.0 \n",
"65750 NaN 19.0 \n",
"... ... ... \n",
"42632 NaN 120.0 \n",
"89920 NaN 15.0 \n",
"76426 NaN 70.0 \n",
"99652 NaN 176.0 \n",
"31904 NaN 52.0 \n",
"\n",
"[67410 rows x 23 columns]"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cR6pxkE6ukve"
},
"source": [
"Чуть позже будем пытаться обучить knn-регрессор."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"id": "_UM4QeCEocA-"
},
"outputs": [],
"source": [
"from sklearn.neighbors import KNeighborsRegressor\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"from sklearn.metrics import mean_squared_error\n",
"\n",
"# не забываем сделать нормировку, так как метод метрический\n",
"\n",
"X_train_number = np.array(X_train.select_dtypes('number'))\n",
"X_test_number = np.array(X_test.select_dtypes('number'))\n",
"\n",
"scaler = MinMaxScaler()\n",
"scaler.fit(X_train_number)\n",
"\n",
"X_train_number_scaled = scaler.transform(X_train_number)\n",
"X_test_number_scaled = scaler.transform(X_test_number)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_hSrQo-9kqOH"
},
"source": [
"Одним из способов переводить категориальные признаки в численное представления является **One-Hot Encoding (OHE).**\n",
"\n",
"Это метод кодирования категориальных признаков, который преобразует каждую категорию в отдельный бинарный вектор. Для каждой уникальной категории создается новая колонка, где значение 1 указывает на присутствие данной категории, а 0 — на ее отсутствие. Например, если у нас есть признак \"Цвет\" с категориями \"Красный\", \"Зеленый\" и \"Синий\", OHE создаст три новых колонки: \"ЦветКрасный\", \"ЦветЗеленый\" и \"ЦветСиний\". Это позволяет алгоритмам машинного обучения лучше воспринимать категориальные данные, так как они не могут обрабатывать текстовые значения напрямую.\n",
"\n",
"**Примечание** Однако стоит помнить, что OHE может привести к увеличению размерности данных, особенно при наличии большого количества категорий."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8-Z0P7eblIrY"
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "j30nOLC5lNkG"
},
"source": [
"Существует два наиболее используемых способа применения данного алгоритма:\n",
"\n",
"1) Через метод `pandas.get_dummies`\n",
"\n",
"2) Через трансформер в `sklearn` `OneHotEncoder`"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "G21L_BYdmN2T"
},
"source": [
"Давайте закодируем несколько признаков с помощью OHE и посмотрим, как обучать модель:"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"id": "IIUuToVGmWQB"
},
"outputs": [],
"source": [
"from sklearn.preprocessing import OneHotEncoder\n",
"\n",
"columns = [\"host_identity_verified\", \"neighbourhood group\", \"room type\", \"cancellation_policy\"]\n",
"\n",
"enc = OneHotEncoder(sparse_output=False, handle_unknown='ignore')\n",
"# sparse_output - ставим такой параметр, чтобы вернулась обычная матрица\n",
"# handle_unknown - не будет падать из-за ошибок\n",
"enc.fit(X_train[columns])\n",
"\n",
"train_neighbourhood_group_ohe = enc.transform(X_train[columns])\n",
"test_neighbourhood_group_ohe = enc.transform(X_test[columns])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4F9A48swmvyQ"
},
"source": [
"Посмотрим, на сколько увеличилось число признаков:"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "dGx2eEgdm4ya",
"outputId": "3b8b18a0-e5ed-4432-b973-64579d122dc6"
},
"outputs": [
{
"data": {
"text/plain": [
"(67410, 17)"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_neighbourhood_group_ohe.shape"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ioGW45L0m7Pl"
},
"source": [
"Составим новый датасет:"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"id": "0AHtbasLjlw1"
},
"outputs": [],
"source": [
"X_train_new = np.hstack((X_train_number_scaled, train_neighbourhood_group_ohe))\n",
"X_test_new = np.hstack((X_test_number_scaled, test_neighbourhood_group_ohe))"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 79
},
"id": "gKbAHxpGnA04",
"outputId": "e3ecb6b1-ce72-498e-a8a9-599fede49fd7"
},
"outputs": [
{
"data": {
"text/html": [
"
KNeighborsRegressor()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
KNeighborsRegressor()
"
],
"text/plain": [
"KNeighborsRegressor()"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"regr = KNeighborsRegressor(n_neighbors=5)\n",
"\n",
"regr.fit(X_train_new, np.array(y_train))"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"id": "hP2WQSFpoFcr"
},
"outputs": [
{
"data": {
"text/plain": [
"2485.710831305999"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_squared_error(regr.predict(X_test_new), np.array(y_test)) # может работать несколько секунд"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FLvDs6ErvW8L"
},
"source": [
"### **Задание 9 [2 баллa]**"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "s1XWmf10vxXo"
},
"source": [
"Изучите, как работает метод [pandas.get_dummies](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html) и проделайте аналогичную операцию кодирования, используя только его\n",
"\n",
"Покажите, что модель с такими же признаки тоже обучается и выдает примерно такое же качество"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"id": "v5kA3duvr1V0"
},
"outputs": [
{
"data": {
"text/html": [
"
KNeighborsRegressor()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.