|
|
<!--
|
|
|
CO_OP_TRANSLATOR_METADATA:
|
|
|
{
|
|
|
"original_hash": "7c077988328ebfe33b24d07945f16eca",
|
|
|
"translation_date": "2025-09-05T11:47:09+00:00",
|
|
|
"source_file": "2-Regression/2-Data/README.md",
|
|
|
"language_code": "uk"
|
|
|
}
|
|
|
-->
|
|
|
# Побудова регресійної моделі за допомогою Scikit-learn: підготовка та візуалізація даних
|
|
|
|
|
|

|
|
|
|
|
|
Інфографіка від [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 для візуалізації даних.
|
|
|
|
|
|
## Як правильно ставити запитання до даних
|
|
|
|
|
|
Запитання, на яке ви хочете отримати відповідь, визначить, який тип алгоритмів ML ви будете використовувати. А якість отриманої відповіді значною мірою залежатиме від характеру ваших даних.
|
|
|
|
|
|
Ознайомтеся з [даними](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), наданими для цього уроку. Ви можете відкрити цей файл .csv у VS Code. Швидкий перегляд одразу показує, що є пропуски, а також суміш рядків і числових даних. Є також дивний стовпець під назвою 'Package', де дані містять значення на кшталт 'sacks', 'bins' та інші. Дані, насправді, трохи безладні.
|
|
|
|
|
|
[](https://youtu.be/5qGjczWTrDQ "ML для початківців - Як аналізувати та очищати набір даних")
|
|
|
|
|
|
> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео про підготовку даних для цього уроку.
|
|
|
|
|
|
Насправді, рідко трапляється, щоб набір даних був повністю готовий для створення моделі ML "з коробки". У цьому уроці ви дізнаєтесь, як підготувати сирий набір даних за допомогою стандартних бібліотек Python. Ви також ознайомитеся з різними техніками візуалізації даних.
|
|
|
|
|
|
## Кейс: "ринок гарбузів"
|
|
|
|
|
|
У цій папці ви знайдете файл .csv у кореневій папці `data` під назвою [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), який містить 1757 рядків даних про ринок гарбузів, згрупованих за містами. Це сирі дані, отримані з [Звітів про стандартні ринки спеціальних культур](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 фунтів." Це все досить складно! Давайте не будемо займатися перетворенням бушеля у фунти, а замість цього ціноутворювати за бушель. Усі ці дослідження бушелів гарбузів, однак, показують, наскільки важливо розуміти природу ваших даних!
|
|
|
|
|
|
Тепер ви можете аналізувати ціни за одиницю на основі їхнього вимірювання в бушелях. Якщо ви ще раз виведете дані, ви побачите, як вони стандартизовані.
|
|
|
|
|
|
✅ Чи помітили ви, що гарбузи, які продаються за півбушеля, дуже дорогі? Чи можете ви зрозуміти, чому? Підказка: маленькі гарбузи набагато дорожчі за великі, ймовірно, тому що їх набагато більше в одному бушелі, враховуючи невикористаний простір, який займає один великий порожнистий гарбуз для пирога.
|
|
|
|
|
|
## Стратегії візуалізації
|
|
|
|
|
|
Частина роботи дата-сайєнтиста полягає в демонстрації якості та характеру даних, з якими він працює. Для цього часто створюють цікаві візуалізації, такі як графіки, діаграми та схеми, які показують різні аспекти даних. Таким чином, вони можуть візуально показати взаємозв'язки та прогалини, які інакше важко виявити.
|
|
|
|
|
|
[](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. Перезапустіть весь ноутбук, щоб оновити.
|
|
|
1. У нижній частині ноутбука додайте комірку для побудови графіка у вигляді коробки:
|
|
|
|
|
|
```python
|
|
|
price = new_pumpkins.Price
|
|
|
month = new_pumpkins.Month
|
|
|
plt.scatter(price, month)
|
|
|
plt.show()
|
|
|
```
|
|
|
|
|
|

|
|
|
|
|
|
Чи є цей графік корисним? Чи щось у ньому вас здивувало?
|
|
|
|
|
|
Він не особливо корисний, оскільки лише відображає ваші дані як розкид точок у певному місяці.
|
|
|
|
|
|
### Зробіть це корисним
|
|
|
|
|
|
Щоб графіки відображали корисні дані, зазвичай потрібно якось згрупувати дані. Спробуймо створити графік, де вісь y показує місяці, а дані демонструють розподіл.
|
|
|
|
|
|
1. Додайте комірку для створення згрупованої стовпчастої діаграми:
|
|
|
|
|
|
```python
|
|
|
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
|
|
|
plt.ylabel("Pumpkin Price")
|
|
|
```
|
|
|
|
|
|

|
|
|
|
|
|
Це більш корисна візуалізація даних! Здається, вона вказує на те, що найвища ціна на гарбузи припадає на вересень і жовтень. Чи відповідає це вашим очікуванням? Чому або чому ні?
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🚀Виклик
|
|
|
|
|
|
Дослідіть різні типи візуалізацій, які пропонує Matplotlib. Які типи найбільше підходять для задач регресії?
|
|
|
|
|
|
## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
|
|
## Огляд і самостійне навчання
|
|
|
|
|
|
Ознайомтеся з багатьма способами візуалізації даних. Складіть список різних бібліотек, доступних для цього, і зазначте, які з них найкраще підходять для певних типів завдань, наприклад, для 2D-візуалізацій проти 3D-візуалізацій. Що ви виявите?
|
|
|
|
|
|
## Завдання
|
|
|
|
|
|
[Дослідження візуалізації](assignment.md)
|
|
|
|
|
|
---
|
|
|
|
|
|
**Відмова від відповідальності**:
|
|
|
Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. |