18 KiB
Budowanie modelu regresji za pomocą Scikit-learn: przygotowanie i wizualizacja danych
Infografika autorstwa Dasani Madipalli
Quiz przed wykładem
Ta lekcja jest dostępna w R!
Wprowadzenie
Gdy masz już skonfigurowane narzędzia potrzebne do rozpoczęcia budowy modeli uczenia maszynowego za pomocą Scikit-learn, możesz zacząć zadawać pytania swoim danym. Pracując z danymi i stosując rozwiązania ML, bardzo ważne jest, aby wiedzieć, jak zadać właściwe pytanie, by odpowiednio wykorzystać potencjał swojego zbioru danych.
W tej lekcji nauczysz się:
- Jak przygotować dane do budowy modelu.
- Jak używać Matplotlib do wizualizacji danych.
- Jak korzystać z Seaborn do bardziej wyrazistej wizualizacji danych.
Zadawanie właściwego pytania swoim danym
Pytanie, na które potrzebujesz odpowiedzi, określi, jakiego typu algorytmy ML wykorzystasz. A jakość uzyskanej odpowiedzi będzie w dużej mierze zależała od natury twoich danych.
Spójrz na dane udostępnione do tej lekcji. Możesz otworzyć ten plik .csv w VS Code. Szybkie przejrzenie pokazuje natychmiast, że są tam puste miejsca oraz mieszanka danych tekstowych i numerycznych. Jest też dziwna kolumna o nazwie 'Package', gdzie dane to mieszanka 'sacks', 'bins' oraz innych wartości. Dane są w rzeczywistości dość nieuporządkowane.
🎥 Kliknij powyższy obraz, aby obejrzeć krótki film pokazujący przygotowanie danych do tej lekcji.
W rzeczywistości nie jest często tak, że otrzymujesz dane całkowicie gotowe do użycia od razu do stworzenia modelu ML. W tej lekcji nauczysz się, jak przygotować surowy zbiór danych przy użyciu standardowych bibliotek Pythona. Nauczysz się także różnych technik wizualizacji danych.
Studium przypadku: 'rynek dyni'
W tym folderze znajdziesz plik .csv w głównym folderze data o nazwie US-pumpkins.csv, który zawiera 1757 linii danych dotyczących rynku dyni, posegregowanych według miast. Są to surowe dane wyodrębnione z Standardowych raportów z terminali rynków specjalistycznych upraw dystrybuowanych przez Departament Rolnictwa Stanów Zjednoczonych.
Przygotowanie danych
Dane te są domeną publiczną. Można je pobrać w wielu osobnych plikach, po jednym na miasto, ze strony USDA. Aby uniknąć zbyt wielu osobnych plików, połączyliśmy wszystkie dane miast w jeden arkusz kalkulacyjny, więc dane są już częściowo przygotowane. Teraz przyjrzyjmy się danym bliżej.
Dane o dyniach - wstępne wnioski
Co zauważasz w tych danych? Już widziałeś, że jest tam mieszanka tekstów, liczb, pustych miejsc i dziwnych wartości, które trzeba zrozumieć.
Jakie pytanie możesz zadać tym danym, wykorzystując technikę regresji? Na przykład: "Przewidzieć cenę dyni na sprzedaż w danym miesiącu". Patrząc na dane ponownie, istnieją pewne zmiany, które trzeba wprowadzić, aby stworzyć strukturę danych niezbędną do zadania.
Ćwiczenie - analiza danych o dyniach
Użyjmy Pandas, (nazwa pochodzi od Python Data Analysis) narzędzia bardzo przydatnego do przekształcania danych, aby przeanalizować i przygotować te dane o dyniach.
Najpierw sprawdź, czy nie brakuje dat
Najpierw musisz podjąć kroki, aby sprawdzić brakujące daty:
- Przekonwertuj daty do formatu miesiąca (są to daty w formacie amerykańskim, więc format to
MM/DD/YYYY). - Wyodrębnij miesiąc do nowej kolumny.
Otwórz plik notebook.ipynb w Visual Studio Code i zaimportuj arkusz kalkulacyjny do nowego dataframe Pandas.
-
Użyj funkcji
head(), aby wyświetlić pierwsze pięć wierszy.import pandas as pd pumpkins = pd.read_csv('../data/US-pumpkins.csv') pumpkins.head()✅ Jaką funkcję użyłbyś, by wyświetlić ostatnie pięć wierszy?
-
Sprawdź, czy w aktualnym dataframe brakuje danych:
pumpkins.isnull().sum()Są braki danych, ale może nie wpłyną one na zadanie.
-
Aby ułatwić sobie pracę z dataframe, wybierz tylko te kolumny, których potrzebujesz, używając funkcji
loc, która wyciąga z oryginalnego dataframe grupę wierszy (pierwszy argument) oraz kolumn (drugi argument). Wyrażenie:w poniższym przypadku oznacza "wszystkie wiersze".columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.loc[:, columns_to_select]
Po drugie, wyznacz średnią cenę dyni
Pomyśl, jak obliczyć średnią cenę dyni w danym miesiącu. Jakie kolumny wybierzesz do tego zadania? Podpowiedź: potrzebujesz 3 kolumn.
Rozwiązanie: weź średnią z kolumn Low Price i High Price, aby wypełnić nową kolumnę Price, a kolumnę Date przekształć tak, aby pokazywała tylko miesiąc. Na szczęście, zgodnie z wcześniejszą kontrolą, nie brakuje danych dotyczących dat i cen.
-
Aby obliczyć średnią, dodaj następujący kod:
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 month = pd.DatetimeIndex(pumpkins['Date']).month✅ Śmiało możesz wyświetlić dowolne dane za pomocą
print(month), by je sprawdzić. -
Teraz skopiuj przekształcone dane do nowego dataframe Pandas:
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})Wyświetlenie dataframe pokaże ci czysty, uporządkowany zbiór danych, na którym możesz zbudować swój nowy model regresji.
Ale chwileczkę! Jest coś niepokojącego
Jeśli spojrzysz na kolumnę Package, dynie są sprzedawane w wielu różnych konfiguracjach. Niektóre są sprzedawane w miarach '1 1/9 bushel', inne w '1/2 bushel', jeszcze inne na sztuki, na funty, a niektóre w dużych skrzyniach o różnych szerokościach.
Dynie wydają się bardzo trudne do jednolitego ważenia
Zagłębiając się w oryginalne dane, interesujące jest, że wszystko z Unit of Sale równym 'EACH' lub 'PER BIN' ma również typ Package na jednostkę calową, na bin lub 'sztukę'. Dynie są więc bardzo trudne do jednolitego ważenia, więc przefiltrujmy je, wybierając tylko dynie z ciągiem 'bushel' w kolumnie Package.
-
Dodaj filtr na początku pliku, pod importem pliku .csv:
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]Jeśli teraz wyświetlisz dane, zobaczysz, że otrzymujesz tylko około 415 wierszy z dyniami sprzedawanymi na bushels.
Ale chwileczkę! Jest jeszcze jedna rzecz do zrobienia
Zauważyłeś, że ilość busheli różni się w poszczególnych wierszach? Musisz znormalizować ceny tak, aby pokazać ceny za bushel, więc wykonaj trochę obliczeń, aby to ustandaryzować.
-
Dodaj poniższe linijki po bloku tworzącym dataframe new_pumpkins:
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)
✅ Według The Spruce Eats, waga bushela zależy od rodzaju produktu, ponieważ jest to jednostka objętości. "Buszel pomidorów, na przykład, waży około 56 funtów... Liście i zielone warzywa zajmują więcej miejsca przy mniejszej wadze, więc buszel szpinaku waży tylko 20 funtów." To wszystko dość skomplikowane! Nie będziemy przeprowadzać konwersji z buszeli na funty, a zamiast tego będziemy wyceniać za buszel. Całe to badanie buszeli dyni pokazuje jednak, jak ważne jest zrozumienie charakteru swoich danych!
Teraz możesz analizować ceny jednostkowe bazując na ich pomiarze na bushel. Jeśli jeszcze raz wyświetlisz dane, zobaczysz, jak są ustandaryzowane.
✅ Zauważyłeś, że dynie sprzedawane na pół buszela są bardzo drogie? Potrafisz zgadnąć dlaczego? Podpowiedź: małe dynie są znacznie droższe niż duże, prawdopodobnie dlatego, że w buszlu jest ich znacznie więcej, ze względu na niewykorzystaną przestrzeń zajmowaną przez dużą, pustą dynię na ciasto.
Strategie wizualizacji
Częścią pracy data scientist jest demonstrowanie jakości i charakteru danych, z którymi pracuje. W tym celu często tworzą interesujące wizualizacje, takie jak wykresy, diagramy i grafiki, pokazujące różne aspekty danych. Dzięki temu są w stanie wizualnie ujawnić związki i luki, które inaczej trudno zauważyć.
🎥 Kliknij powyższy obraz, aby obejrzeć krótki film pokazujący wizualizację danych w tej lekcji.
Wizualizacje mogą również pomóc ustalić, która technika uczenia maszynowego najlepiej nadaje się do danych. Na przykład wykres punktowy, który wydaje się podążać linią, wskazuje, że dane są dobrym kandydatem do zadania regresji liniowej.
Jedną z bibliotek do wizualizacji danych, która dobrze działa w notatnikach Jupyter, jest Matplotlib (którą też widziałeś w poprzedniej lekcji).
Zdobądź więcej praktyki z wizualizacją danych w tych samouczkach.
Ćwiczenie - eksperymentuj z Matplotlib
Spróbuj stworzyć kilka podstawowych wykresów, aby wyświetlić nowy dataframe, który właśnie utworzyłeś. Co pokazałby podstawowy wykres liniowy?
-
Zaimportuj Matplotlib na górze pliku, pod importem Pandas:
import matplotlib.pyplot as plt -
Uruchom ponownie cały notatnik, aby odświeżyć dane.
-
Na dole notatnika dodaj komórkę, by wyświetlić wykres w formie pudełka:
price = new_pumpkins.Price month = new_pumpkins.Month plt.scatter(price, month) plt.show()Czy to jest użyteczny wykres? Czy coś Cię zaskakuje?
Nie jest on szczególnie użyteczny, bo pokazuje tylko rozrzut punktów w danych dla danych miesięcy.
Uczyń go użytecznym
Aby wykresy pokazywały użyteczne dane, zwykle trzeba grupować dane w jakiś sposób. Spróbujmy stworzyć wykres, gdzie oś Y pokazuje miesiące, a dane pokazują rozkład danych.
-
Dodaj komórkę, aby stworzyć wykres słupkowy z grupowaniem:
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') plt.ylabel("Pumpkin Price")To jest bardziej użyteczna wizualizacja! Wskazuje, że najwyższa cena za dynie występuje we wrześniu i październiku. Czy to jest zgodne z Twoimi oczekiwaniami? Dlaczego tak lub dlaczego nie?
Ćwiczenie - eksperymentuj z Seaborn
Matplotlib jest potężny, ale do stworzenia atrakcyjnego wykresu potrzeba dużo kodu. Seaborn to biblioteka zbudowana na podstawie Matplotlib, zaprojektowana do statystycznej wizualizacji danych. Działa bezpośrednio z dataframe Pandas, stosuje atrakcyjne domyślne style i pozwala tworzyć informatywne wykresy z znacznie mniejszą ilością kodu. Ponieważ Seaborn zwraca obiekty Matplotlib, nadal możesz używać wszystkiego, co już wiesz o Matplotlib, aby dopracować wynik.
Jeśli jeszcze nie masz zainstalowanego Seaborn, zainstaluj go za pomocą
pip install seaborn.
-
Zaimportuj Seaborn na górze notatnika, pod pozostałymi importami. Konwencjonalnie importuje się je jako
sns:import seaborn as sns
Wykresy punktowe pokazujące zależności
Duża część eksploracji danych przed budową modelu polega na poszukiwaniu zależności między zmiennymi. Wykres punktowy jest jednym z najlepszych narzędzi do tego celu: jeśli punkty wydają się podążać linią, dwie zmienne mogą być skorelowane, co jest dobrym znakiem, że model regresji liniowej może działać.
-
Odwzoruj ponownie wykres ceny w funkcji miesiąca z wcześniejszego przykładu, tym razem używając funkcji Seaborn
relplot()(wykres relacyjny), która działa bezpośrednio z kolumnami dataframe:sns.relplot(x="Price", y="Month", data=new_pumpkins)Zwróć uwagę, jak podajesz nazwy kolumn oraz dataframe, a Seaborn sam zadba o etykiety osi.
-
Możesz przełączyć się na wykres liniowy, podając
kind="line". Seaborn rysuje nawet zacieniony pas pokazujący przedział ufności wokół linii:sns.relplot(x="Price", y="Month", kind="line", data=new_pumpkins)Te dane są dość hałaśliwe, więc wykres liniowy nie jest tutaj najczytelniejszym wyborem — ale pokazuje, jak łatwo zmienić typ wykresu w Seaborn.
Wykresy słupkowe pokazujące rozkłady
Wcześniej grupowałeś dane ręcznie, aby stworzyć wykres słupkowy za pomocą Matplotlib. Funkcja Seaborn catplot() (wykres kategoryczny) może wykonać grupowanie i agregację za Ciebie. Domyślnie kind="bar" pokazuje średnią dla każdej kategorii wraz z czarną linią wskazującą przedział ufności.
-
Stwórz wykres słupkowy średniej ceny na miesiąc:
sns.catplot(x="Month", y="Price", data=new_pumpkins, kind="bar")Potwierdza to, co widziałeś z Matplotlib — ceny osiągają szczyt wokół września i października — ale Seaborn pokazuje również, jak bardzo cena zróżnicowana jest w każdym miesiącu.
Mapy cieplne do pokazywania korelacji
Wykresy punktowe porównują dwie zmienne naraz. Gdy masz kilka kolumn numerycznych, mapa cieplna pozwala zobaczyć siłę relacji pomiędzy każdą parą kolumn jednocześnie. To popularny sposób, by zauważyć, które cechy są najbardziej skorelowane przed wyborem, co wprowadzić do modelu (a ten sam rodzaj wykresu jest później używany do wyświetlania macierzy konfuzji w klasyfikacji).
-
Zbuduj macierz korelacji za pomocą Pandas, a następnie narysuj ją za pomocą Seaborn
heatmap(). Opcjaannot=Truedrukuje wartości korelacji w każdej komórce:correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr() sns.heatmap(correlations, annot=True, cmap="coolwarm")Wartości bliskie
1(lub-1) oznaczają, że kolumny są silnie liniowo skorelowane. Zauważ, jakLow PriceiHigh Pricesą prawie doskonale skorelowane.Month, z drugiej strony, pokazuje tylko słabą korelację liniową z ceną — mimo że wykres słupkowy powyżej ujawnił wyraźny sezonowy szczyt we wrześniu i październiku. To ważna lekcja: współczynnik korelacji mierzy tylko prostoliniowe zależności, więc może nie dostrzec sezonowych lub innych nieliniowych wzorców. ✅ Dlaczego warto spojrzeć zarówno na mapę cieplną, jak i wykresy takie jak wykres słupkowy przed podjęciem decyzji, które kolumny wykorzystać?
Matplotlib czy Seaborn?
Obie biblioteki warto znać:
- Matplotlib daje Ci szczegółową kontrolę nad każdym elementem wykresu i jest fundamentem, na którym opiera się niemal każda inna biblioteka do wykresów w Pythonie.
- Seaborn zapewnia funkcje wyższego poziomu i atrakcyjne domyślne ustawienia dla wykresów statystycznych, działa bezpośrednio na data framach i często jest szybszy w eksploracyjnej analizie danych.
Powszechnym sposobem pracy jest sięgnięcie po Seaborn, by szybko zbadać dane, a następnie zejść do Matplotlib, gdy potrzebujesz dostosować szczegóły.
🚀Wyzwanie
Zbadaj różne typy wizualizacji oferowane przez Matplotlib i Seaborn. Które typy są najbardziej odpowiednie dla problemów regresji?
Quiz po wykładzie
Przegląd i samodzielna nauka
Przyjrzyj się wielu sposobom wizualizacji danych. Sporządź listę dostępnych bibliotek i zaznacz, które są najlepsze do określonych zadań, na przykład wizualizacje 2D vs. 3D. Co odkryjesz?
Zadanie
Zastrzeżenie: Niniejszy dokument został przetłumaczony za pomocą usługi tłumaczenia AI Co-op Translator. Choć dążymy do dokładności, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub niedokładności. Oryginalny dokument w jego języku źródłowym należy uznawać za autorytatywne źródło. W przypadku informacji krytycznych zalecane jest skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.








