# Построение модели регрессии с использованием Scikit-learn: подготовка и визуализация данных ![Инфографика визуализации данных](../../../../2-Regression/2-Data/images/data-visualization.png) Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded) ## [Тест перед лекцией](https://ff-quizzes.netlify.app/en/ml/) > ### [Этот урок доступен на языке R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) ## Введение Теперь, когда вы настроили инструменты, необходимые для создания моделей машинного обучения с помощью Scikit-learn, вы готовы начать задавать вопросы вашим данным. Работая с данными и применяя решения ML, очень важно уметь задавать правильные вопросы, чтобы максимально раскрыть потенциал вашего набора данных. В этом уроке вы узнаете: - Как подготовить данные для построения модели. - Как использовать Matplotlib для визуализации данных. ## Задаем правильные вопросы к данным Вопрос, на который вы хотите получить ответ, определит, какие алгоритмы машинного обучения вы будете использовать. А качество ответа будет сильно зависеть от характера ваших данных. Посмотрите на [данные](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), предоставленные для этого урока. Вы можете открыть этот .csv файл в VS Code. Быстрый просмотр сразу показывает, что есть пропуски, а также смесь строковых и числовых данных. Также есть странный столбец под названием 'Package', где данные представляют собой смесь значений, таких как 'sacks', 'bins' и других. На самом деле, данные немного беспорядочные. [![ML для начинающих - Как анализировать и очищать набор данных](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML для начинающих - Как анализировать и очищать набор данных") > 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео о подготовке данных для этого урока. На самом деле, редко можно получить набор данных, который полностью готов к использованию для создания модели машинного обучения "из коробки". В этом уроке вы научитесь готовить необработанный набор данных с использованием стандартных библиотек Python. Вы также узнаете различные техники визуализации данных. ## Пример: рынок тыкв В этой папке вы найдете .csv файл в корневой папке `data` под названием [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), который содержит 1757 строк данных о рынке тыкв, сгруппированных по городам. Это необработанные данные, извлеченные из [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), распространяемых Министерством сельского хозяйства США. ### Подготовка данных Эти данные находятся в открытом доступе. Их можно скачать в виде множества отдельных файлов, по городам, с сайта USDA. Чтобы избежать слишком большого количества отдельных файлов, мы объединили все данные по городам в одну таблицу, таким образом, мы уже _немного подготовили_ данные. Теперь давайте посмотрим на них поближе. ### Данные о тыквах - первые выводы Что вы замечаете в этих данных? Вы уже видели, что есть смесь строк, чисел, пропусков и странных значений, которые нужно интерпретировать. Какой вопрос можно задать этим данным, используя технику регрессии? Например, "Предсказать цену тыквы, продаваемой в определенный месяц". Снова взглянув на данные, вы увидите, что нужно внести некоторые изменения, чтобы создать структуру данных, необходимую для выполнения задачи. ## Упражнение - анализ данных о тыквах Давайте используем [Pandas](https://pandas.pydata.org/) (название означает `Python Data Analysis`), инструмент, очень полезный для обработки данных, чтобы проанализировать и подготовить данные о тыквах. ### Сначала проверьте наличие пропущенных дат Сначала вам нужно предпринять шаги для проверки пропущенных дат: 1. Преобразуйте даты в формат месяца (это даты США, формат `MM/DD/YYYY`). 2. Извлеките месяц в новый столбец. Откройте файл _notebook.ipynb_ в Visual Studio Code и импортируйте таблицу в новый датафрейм Pandas. 1. Используйте функцию `head()`, чтобы просмотреть первые пять строк. ```python import pandas as pd pumpkins = pd.read_csv('../data/US-pumpkins.csv') pumpkins.head() ``` ✅ Какую функцию вы бы использовали, чтобы просмотреть последние пять строк? 1. Проверьте, есть ли пропущенные данные в текущем датафрейме: ```python pumpkins.isnull().sum() ``` Пропущенные данные есть, но, возможно, это не будет иметь значения для выполнения задачи. 1. Чтобы сделать ваш датафрейм более удобным для работы, выберите только нужные столбцы, используя функцию `loc`, которая извлекает из исходного датафрейма группу строк (передается как первый параметр) и столбцов (передается как второй параметр). Выражение `:` в данном случае означает "все строки". ```python columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.loc[:, columns_to_select] ``` ### Затем определите среднюю цену тыквы Подумайте, как определить среднюю цену тыквы в заданный месяц. Какие столбцы вы бы выбрали для этой задачи? Подсказка: вам понадобятся 3 столбца. Решение: возьмите среднее значение столбцов `Low Price` и `High Price`, чтобы заполнить новый столбец Price, и преобразуйте столбец Date, чтобы он показывал только месяц. К счастью, согласно проверке выше, нет пропущенных данных для дат или цен. 1. Чтобы вычислить среднее значение, добавьте следующий код: ```python price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 month = pd.DatetimeIndex(pumpkins['Date']).month ``` ✅ Вы можете вывести любые данные для проверки, используя `print(month)`. 2. Теперь скопируйте преобразованные данные в новый датафрейм Pandas: ```python new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) ``` Если вы выведете ваш датафрейм, вы увидите чистый, аккуратный набор данных, на основе которого можно построить новую модель регрессии. ### Но подождите! Здесь есть что-то странное Если вы посмотрите на столбец `Package`, тыквы продаются в разных конфигурациях. Некоторые продаются в мерах '1 1/9 bushel', некоторые в '1/2 bushel', некоторые поштучно, некоторые на вес, а некоторые в больших коробках с разной шириной. > Тыквы, кажется, очень сложно взвесить одинаково Изучая исходные данные, интересно, что все, у чего `Unit of Sale` равно 'EACH' или 'PER BIN', также имеют тип `Package` в дюймах, на ящик или 'each'. Тыквы, кажется, очень сложно взвесить одинаково, поэтому давайте отфильтруем их, выбрав только тыквы со строкой 'bushel' в столбце `Package`. 1. Добавьте фильтр в начале файла, под импортом .csv: ```python pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] ``` Если вы выведете данные сейчас, вы увидите, что получаете только около 415 строк данных, содержащих тыквы по бушелю. ### Но подождите! Нужно сделать еще кое-что Вы заметили, что количество бушелей варьируется по строкам? Вам нужно нормализовать цены, чтобы показать цены за бушель, поэтому выполните некоторые вычисления для стандартизации. 1. Добавьте эти строки после блока, создающего датафрейм new_pumpkins: ```python new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) ``` ✅ Согласно [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), вес бушеля зависит от типа продукта, так как это измерение объема. "Бушель помидоров, например, должен весить 56 фунтов... Листья и зелень занимают больше места с меньшим весом, поэтому бушель шпината весит всего 20 фунтов." Все это довольно сложно! Давайте не будем заниматься преобразованием бушеля в фунты, а вместо этого оценим цену за бушель. Все это изучение бушелей тыкв, однако, показывает, насколько важно понимать природу ваших данных! Теперь вы можете анализировать цены за единицу на основе их измерения в бушелях. Если вы снова выведете данные, вы увидите, как они стандартизированы. ✅ Вы заметили, что тыквы, продаваемые за полбушеля, очень дорогие? Можете ли вы понять, почему? Подсказка: маленькие тыквы намного дороже больших, вероятно, потому что их намного больше на бушель, учитывая неиспользованное пространство, занимаемое одной большой пустой тыквой для пирога. ## Стратегии визуализации Часть работы специалиста по данным заключается в демонстрации качества и характера данных, с которыми он работает. Для этого они часто создают интересные визуализации, такие как графики, диаграммы и таблицы, показывающие различные аспекты данных. Таким образом, они могут визуально показать отношения и пробелы, которые иначе трудно обнаружить. [![ML для начинающих - Как визуализировать данные с помощью Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML для начинающих - Как визуализировать данные с помощью Matplotlib") > 🎥 Нажмите на изображение выше, чтобы посмотреть короткое видео о визуализации данных для этого урока. Визуализации также могут помочь определить технику машинного обучения, наиболее подходящую для данных. Например, диаграмма рассеяния, которая, кажется, следует линии, указывает на то, что данные подходят для упражнения по линейной регрессии. Одна из библиотек визуализации данных, которая хорошо работает в Jupyter notebooks, — это [Matplotlib](https://matplotlib.org/) (которую вы также видели в предыдущем уроке). > Получите больше опыта в визуализации данных в [этих учебных пособиях](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). ## Упражнение - экспериментируем с Matplotlib Попробуйте создать несколько базовых графиков, чтобы отобразить новый датафрейм, который вы только что создали. Что покажет базовый линейный график? 1. Импортируйте Matplotlib в начале файла, под импортом Pandas: ```python import matplotlib.pyplot as plt ``` 1. Перезапустите весь notebook, чтобы обновить данные. 1. Внизу notebook добавьте ячейку для построения данных в виде коробки: ```python price = new_pumpkins.Price month = new_pumpkins.Month plt.scatter(price, month) plt.show() ``` ![Диаграмма рассеяния, показывающая связь между ценой и месяцем](../../../../2-Regression/2-Data/images/scatterplot.png) Является ли это полезным графиком? Удивляет ли вас что-то в нем? Это не особенно полезно, так как он просто отображает ваши данные в виде набора точек в заданный месяц. ### Сделаем его полезным Чтобы графики отображали полезные данные, обычно нужно как-то сгруппировать данные. Давайте попробуем создать график, где ось y показывает месяцы, а данные демонстрируют распределение. 1. Добавьте ячейку для создания сгруппированной столбчатой диаграммы: ```python new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') plt.ylabel("Pumpkin Price") ``` ![Столбчатая диаграмма, показывающая связь между ценой и месяцем](../../../../2-Regression/2-Data/images/barchart.png) Это более полезная визуализация данных! Кажется, она указывает на то, что самая высокая цена на тыквы приходится на сентябрь и октябрь. Соответствует ли это вашим ожиданиям? Почему или почему нет? --- ## 🚀Задача Исследуйте различные типы визуализации, которые предлагает Matplotlib. Какие типы наиболее подходят для задач регрессии? ## [Тест после лекции](https://ff-quizzes.netlify.app/en/ml/) ## Обзор и самостоятельное изучение Изучите множество способов визуализации данных. Составьте список различных доступных библиотек и отметьте, какие из них лучше подходят для определенных типов задач, например, 2D-визуализации против 3D-визуализации. Что вы обнаруживаете? ## Задание [Исследование визуализации](assignment.md) --- **Отказ от ответственности**: Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.