20 KiB
Създаване на регресионен модел с помощта на Scikit-learn: подготовка и визуализация на данни
Инфографика от Dasani Madipalli
Тест преди лекцията
Тази лекция е налична и на R!
Въведение
След като сте настроили инструментите, необходими за изграждане на модели за машинно обучение със Scikit-learn, сте готови да започнете да задавате въпроси към вашите данни. Докато работите с данни и прилагате ML решения, е изключително важно да знаете как да задавате правилните въпроси, за да отключите потенциала на вашия набор от данни.
В тази лекция ще научите:
- Как да подготвите данните си за изграждане на модели.
- Как да използвате Matplotlib за визуализация на данни.
Задаване на правилния въпрос към вашите данни
Въпросът, който искате да получите отговор, ще определи какъв тип ML алгоритми ще използвате. А качеството на отговора, който ще получите, ще зависи силно от естеството на вашите данни.
Разгледайте данните, предоставени за тази лекция. Можете да отворите този .csv файл в VS Code. Бърз преглед веднага показва, че има празни полета и смесица от текстови и числови данни. Има и странна колона, наречена 'Package', където данните са смесица от 'sacks', 'bins' и други стойности. Данните, всъщност, са малко хаотични.
🎥 Кликнете върху изображението по-горе за кратко видео, което показва как да подготвите данните за тази лекция.
Всъщност, не е много често да получите набор от данни, който е напълно готов за създаване на ML модел директно. В тази лекция ще научите как да подготвите суров набор от данни, използвайки стандартни Python библиотеки. Ще научите и различни техники за визуализация на данни.
Казус: 'пазарът на тикви'
В тази папка ще намерите .csv файл в основната папка data
, наречен US-pumpkins.csv, който включва 1757 реда данни за пазара на тикви, сортирани по градове. Това са сурови данни, извлечени от Specialty Crops Terminal Markets Standard Reports, разпространявани от Министерството на земеделието на САЩ.
Подготовка на данни
Тези данни са в публичното пространство. Те могат да бъдат изтеглени в много отделни файлове, за всеки град, от уебсайта на USDA. За да избегнем твърде много отделни файлове, сме обединили всички данни за градовете в една електронна таблица, така че вече сме подготвили данните малко. Сега нека разгледаме данните по-отблизо.
Данните за тиквите - първоначални заключения
Какво забелязвате за тези данни? Вече видяхте, че има смесица от текстове, числа, празни полета и странни стойности, които трябва да разберете.
Какъв въпрос можете да зададете към тези данни, използвайки регресионна техника? Например: "Предскажете цената на тиква за продажба през даден месец". Поглеждайки отново към данните, има някои промени, които трябва да направите, за да създадете необходимата структура на данните за задачата.
Упражнение - анализирайте данните за тиквите
Нека използваме Pandas (името означава Python Data Analysis
), инструмент, много полезен за оформяне на данни, за да анализираме и подготвим тези данни за тиквите.
Първо, проверете за липсващи дати
Първо трябва да предприемете стъпки, за да проверите за липсващи дати:
- Конвертирайте датите във формат на месец (това са американски дати, така че форматът е
MM/DD/YYYY
). - Извлечете месеца в нова колона.
Отворете файла notebook.ipynb във Visual Studio Code и импортирайте електронната таблица в нов Pandas dataframe.
-
Използвайте функцията
head()
, за да видите първите пет реда.import pandas as pd pumpkins = pd.read_csv('../data/US-pumpkins.csv') pumpkins.head()
✅ Каква функция бихте използвали, за да видите последните пет реда?
-
Проверете дали има липсващи данни в текущия dataframe:
pumpkins.isnull().sum()
Има липсващи данни, но може би това няма да е от значение за задачата.
-
За да направите вашия dataframe по-лесен за работа, изберете само колоните, които ви трябват, използвайки функцията
loc
, която извлича от оригиналния dataframe група от редове (предадени като първи параметър) и колони (предадени като втори параметър). Изразът:
в случая означава "всички редове".columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.loc[:, columns_to_select]
Второ, определете средната цена на тиква
Помислете как да определите средната цена на тиква през даден месец. Кои колони бихте избрали за тази задача? Подсказка: ще ви трябват 3 колони.
Решение: вземете средната стойност на колоните Low Price
и High Price
, за да попълните новата колона Price, и конвертирайте колоната Date, за да показва само месеца. За щастие, според проверката по-горе, няма липсващи данни за дати или цени.
-
За да изчислите средната стойност, добавете следния код:
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 month = pd.DatetimeIndex(pumpkins['Date']).month
✅ Чувствайте се свободни да отпечатате всякакви данни, които искате да проверите, използвайки
print(month)
. -
Сега копирайте конвертираните данни в нов Pandas dataframe:
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
Отпечатването на вашия dataframe ще ви покаже чист, подреден набор от данни, върху който можете да изградите новия си регресионен модел.
Но чакайте! Има нещо странно тук
Ако погледнете колоната Package
, тиквите се продават в много различни конфигурации. Някои се продават в мерки '1 1/9 bushel', други в '1/2 bushel', някои на тиква, някои на паунд, а някои в големи кутии с различни ширини.
Тиквите изглежда са много трудни за консистентно претегляне
Разглеждайки оригиналните данни, е интересно, че всичко с Unit of Sale
, равно на 'EACH' или 'PER BIN', също има тип Package
на инч, на бин или 'each'. Тиквите изглежда са много трудни за консистентно претегляне, така че нека ги филтрираме, като изберем само тикви със стринга 'bushel' в колоната Package
.
-
Добавете филтър в началото на файла, под първоначалния импорт на .csv:
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
Ако отпечатате данните сега, можете да видите, че получавате само около 415 реда данни, съдържащи тикви по bushel.
Но чакайте! Има още нещо за правене
Забелязахте ли, че количеството bushel варира за всеки ред? Трябва да нормализирате цените, така че да показват цените на bushel, затова направете малко математика, за да ги стандартизирате.
-
Добавете тези редове след блока, който създава new_pumpkins dataframe:
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, теглото на bushel зависи от типа на продукта, тъй като това е измерване на обем. "Bushel домати, например, трябва да тежи 56 паунда... Листата и зелените заемат повече пространство с по-малко тегло, така че bushel спанак е само 20 паунда." Всичко това е доста сложно! Нека не се занимаваме с конвертиране на bushel в паундове и вместо това да определим цените на bushel. Цялото това изучаване на bushel тикви, обаче, показва колко важно е да разберете естеството на вашите данни!
Сега можете да анализирате цените на единица, базирани на тяхната bushel мярка. Ако отпечатате данните още веднъж, можете да видите как са стандартизирани.
✅ Забелязахте ли, че тиквите, продавани на половин bushel, са много скъпи? Можете ли да разберете защо? Подсказка: малките тикви са много по-скъпи от големите, вероятно защото има много повече от тях на bushel, като се вземе предвид неизползваното пространство, заето от една голяма куха тиква за пай.
Стратегии за визуализация
Част от ролята на специалиста по данни е да демонстрира качеството и естеството на данните, с които работи. За да направят това, те често създават интересни визуализации, като графики, диаграми и таблици, показващи различни аспекти на данните. По този начин те могат визуално да покажат връзки и пропуски, които иначе са трудни за откриване.
🎥 Кликнете върху изображението по-горе за кратко видео, което показва как да визуализирате данните за тази лекция.
Визуализациите могат също да помогнат за определяне на най-подходящата техника за машинно обучение за данните. Например, scatterplot, който изглежда следва линия, показва, че данните са добър кандидат за упражнение с линейна регресия.
Една библиотека за визуализация на данни, която работи добре в Jupyter notebooks, е Matplotlib (която видяхте и в предишната лекция).
Получете повече опит с визуализацията на данни в тези уроци.
Упражнение - експериментирайте с Matplotlib
Опитайте да създадете някои основни графики, за да покажете новия dataframe, който току-що създадохте. Какво би показала една основна линейна графика?
-
Импортирайте Matplotlib в началото на файла, под импорта на Pandas:
import matplotlib.pyplot as plt
-
Презаредете целия notebook, за да го обновите.
-
В края на notebook-а добавете клетка, за да начертаете данните като кутия:
price = new_pumpkins.Price month = new_pumpkins.Month plt.scatter(price, month) plt.show()
Полезна ли е тази графика? Има ли нещо, което ви изненадва?
Тя не е особено полезна, тъй като просто показва разпределението на точките в даден месец.
Направете я полезна
За да направите графиките полезни, обикновено трябва да групирате данните по някакъв начин. Нека опитаме да създадем графика, където y оста показва месеците, а данните демонстрират разпределението.
-
Добавете клетка, за да създадете групирана бар графика:
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') plt.ylabel("Pumpkin Price")
Това е по-полезна визуализация на данни! Изглежда, че най-високата цена за тикви е през септември и октомври. Това отговаря ли на вашите очаквания? Защо или защо не?
🚀Предизвикателство
Разгледайте различните типове визуализации, които Matplotlib предлага. Кои типове са най-подходящи за регресионни задачи?
Тест след лекцията
Преглед и самостоятелно обучение
Разгледайте многото начини за визуализация на данни. Направете списък с различните налични библиотеки и отбележете кои са най-добри за дадени типове задачи, например 2D визуализации срещу 3D визуализации. Какво откривате?
Задание
Отказ от отговорност:
Този документ е преведен с помощта на AI услуга за превод Co-op Translator. Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.