Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00847 010720 10703319 na godz. na dobę w sumie
Python. Podstawy nauki o danych. Wydanie II - ebook/pdf
Python. Podstawy nauki o danych. Wydanie II - ebook/pdf
Autor: , Liczba stron: 320
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-3424-3 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> bazy danych >> inne
Porównaj ceny (książka, ebook (-20%), audiobook).
Nauka o danych jest nową, interdyscyplinarną dziedziną, funkcjonującą na pograniczu algebry liniowej, modelowania statystycznego, lingwistyki komputerowej, uczenia maszynowego oraz metod akumulacji danych. Jest przydatna między innymi dla analityków biznesowych, statystyków, architektów oprogramowania i osób zajmujących się sztuczną inteligencją. Szczególnie praktycznym narzędziem dla tych specjalistów jest język Python, który zapewnia doskonałe środowisko do analizy danych, uczenia maszynowego i algorytmicznego rozwiązywania problemów.

Niniejsza książka jest doskonałym wprowadzeniem do nauki o danych. Jej autorzy wskażą Ci prostą i szybką drogę do rozwiązywania różnych problemów z tego obszaru za pomocą Pythona oraz powiązanych z nim pakietów do analizy danych i uczenia maszynowego. Dzięki lekturze przejdziesz przez kolejne etapy modyfikowania i wstępnego przetwarzania danych, poznając przy tym podstawowe operacje związane z wczytywaniem danych, przekształcaniem ich, poprawianiem na potrzeby analiz, eksplorowaniem i przetwarzaniem. Poza podstawami opanujesz też zagadnienia uczenia maszynowego, w tym uczenia głębokiego, techniki analizy grafów oraz wizualizacji danych.

Najważniejsze zagadnienia przedstawione w książce:

Nauka o danych — fascynujące algorytmy i potężne grafy!


Alberto Boschetti specjalizuje się w przetwarzaniu sygnałów i statystyce. Jest doktorem inżynierii telekomunikacyjnej. Zajmuje się przetwarzaniem języków naturalnych, analityką behawioralną, uczeniem maszynowym i przetwarzaniem rozproszonym.

Luca Massaron specjalizuje się w statystycznych analizach wieloczynnikowych, uczeniu maszynowym, statystyce, eksploracji danych i algorytmice. Pasjonuje się potencjałem, jaki drzemie w nauce o danych.
Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Python Data Science Essentials, Second Edition Tłumaczenie: Tomasz Walczak ISBN: 978-83-283-3423-6 Copyright © Packt Publishing 2016 First published in the English language under the title ‘Python Data Science Essentials – Second Edition – (9781786462138)’ Polish edition copyright © 2017 by Helion SA. All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/pypod2 Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis tre(cid:258)ci O autorach O recenzencie Wprowadzenie Rozdzia(cid:239) 1. Pierwsze kroki Wprowadzenie do nauki o danych i Pythona Instalowanie Pythona Python 2 czy Python 3? Instalacja krok po kroku Instalowanie pakietów Aktualizowanie pakietów Dystrybucje naukowe (cid:165)rodowiska wirtualne Krótki przegl(cid:200)d podstawowych pakietów Wprowadzenie do (cid:258)rodowiska Jupyter Szybka instalacja i pierwsze testowe zastosowanie Magiczne polecenia w Jupyterze W jaki sposób notatniki Jupytera mog(cid:200) by(cid:202) pomocne dla badaczy danych? Zast(cid:218)pniki Jupytera Zbiory danych i kod u(cid:285)ywane w ksi(cid:200)(cid:285)ce Proste przyk(cid:239)adowe zbiory danych z pakietu scikit-learn Podsumowanie 9 10 11 15 16 17 18 19 20 22 22 25 28 37 41 42 44 49 50 50 59 Poleć książkęKup książkę Spis tre(cid:286)ci Rozdzia(cid:239) 2. Przekszta(cid:239)canie danych Proces pracy w nauce o danych Wczytywanie i wst(cid:218)pne przetwarzanie danych za pomoc(cid:200) biblioteki pandas Szybkie i (cid:239)atwe wczytywanie danych Radzenie sobie z problematycznymi danymi Radzenie sobie z du(cid:285)ymi zbiorami danych Dost(cid:218)p do danych w innych formatach Wst(cid:218)pne przetwarzanie danych Wybieranie danych Praca z danymi kategorialnymi i tekstowymi Specjalny rodzaj danych — tekst Scraping stron internetowych za pomoc(cid:200) pakietu Beautiful Soup Przetwarzanie danych za pomoc(cid:200) pakietu NumPy N-wymiarowe tablice z pakietu NumPy Podstawowe informacje o obiektach ndarray z pakietu NumPy Tworzenie tablic z pakietu NumPy Przekszta(cid:239)canie list w jednowymiarowe tablice Kontrolowanie ilo(cid:258)ci zajmowanej pami(cid:218)ci Listy niejednorodne Od list do tablic wielowymiarowych Zmiana wielko(cid:258)ci tablic Tablice generowane przez funkcje z pakietu NumPy Pobieranie tablicy bezpo(cid:258)rednio z pliku Pobieranie danych ze struktur z biblioteki pandas Szybkie operacje i obliczenia z u(cid:285)yciem pakietu NumPy Operacje na macierzach Tworzenie wycinków i indeksowanie tablic z pakietu NumPy Dodawanie „warstw” tablic z pakietu NumPy Podsumowanie Rozdzia(cid:239) 3. Potok danych Wprowadzenie do eksploracji danych Tworzenie nowych cech Redukcja liczby wymiarów Macierz kowariancji Analiza g(cid:239)ównych sk(cid:239)adowych Analiza g(cid:239)ównych sk(cid:239)adowych dla big data — typ RandomizedPCA Analiza czynników ukrytych Liniowa analiza dyskryminacyjna Analiza ukrytych grup semantycznych Analiza sk(cid:239)adowych niezale(cid:285)nych Analiza g(cid:239)ównych sk(cid:239)adowych oparta na funkcji j(cid:200)dra Algorytm t-SNE Ograniczone maszyny Boltzmanna 4 61 62 64 64 67 70 73 75 78 81 83 89 92 92 93 95 95 96 98 99 100 101 102 103 104 106 108 110 112 113 113 117 120 120 121 125 126 127 128 129 129 131 132 Poleć książkęKup książkę Spis tre(cid:286)ci Wykrywanie i traktowanie warto(cid:258)ci odstaj(cid:200)cych Wykrywanie obserwacji odstaj(cid:200)cych za pomoc(cid:200) technik jednoczynnikowych Klasa EllipticEnvelope Klasa OneClassSVM Miary u(cid:285)ywane do walidacji Klasyfikacja wieloklasowa Klasyfikacja binarna Regresja Testy i walidacja Walidacja krzy(cid:285)owa Iteratory walidacji krzy(cid:285)owej Próbkowanie i bootstrapping Optymalizacja hiperparametrów Tworzenie niestandardowych funkcji oceny Skracanie czasu przeszukiwania siatki parametrów Wybór cech Wybór na podstawie wariancji cech Wybór za pomoc(cid:200) modelu jednoczynnikowego Rekurencyjna eliminacja Wybór na podstawie stabilno(cid:258)ci i regularyzacji L1 Opakowywanie wszystkich operacji w potok (cid:146)(cid:200)czenie cech i tworzenie (cid:239)a(cid:241)cuchów transformacji Tworzenie niestandardowych funkcji transformacji Podsumowanie Rozdzia(cid:239) 4. Uczenie maszynowe Przygotowywanie narz(cid:218)dzi i zbiorów danych Regresja liniowa i logistyczna Naiwny klasyfikator bayesowski Algorytm kNN Algorytmy nieliniowe Stosowanie algorytmu SVM do klasyfikowania Stosowanie algorytmów SVM do regresji Dostrajanie algorytmu SVM Strategie oparte na zestawach algorytmów Pasting z u(cid:285)yciem losowych próbek Bagging z u(cid:285)yciem s(cid:239)abych klasyfikatorów Podprzestrzenie losowe i obszary losowe Algorytmy Random Forests i Extra-Trees Szacowanie prawdopodobie(cid:241)stwa na podstawie zestawów Sekwencje modeli — AdaBoost Metoda GTB XGBoost 133 134 136 140 144 144 147 148 148 153 155 157 159 162 164 166 167 168 169 171 173 174 176 177 179 179 181 184 187 188 190 192 193 195 196 196 197 198 200 202 202 203 5 Poleć książkęKup książkę Spis tre(cid:286)ci Przetwarzanie big data Tworzenie przyk(cid:239)adowych du(cid:285)ych zbiorów danych Skalowalno(cid:258)(cid:202) ze wzgl(cid:218)du na ilo(cid:258)(cid:202) danych Radzenie sobie z szybko(cid:258)ci(cid:200) nap(cid:239)ywu danych Radzenie sobie z ró(cid:285)norodno(cid:258)ci(cid:200) Przegl(cid:200)d algorytmów z rodziny SGD Wprowadzenie do uczenia g(cid:239)(cid:218)bokiego Krótkie omówienie przetwarzania j(cid:218)zyka naturalnego Podzia(cid:239) na tokeny Stemming Oznaczanie cz(cid:218)(cid:258)ci mowy Rozpoznawanie nazw w(cid:239)asnych Stop-s(cid:239)owa Kompletny przyk(cid:239)ad z obszaru nauki o danych — klasyfikowanie tekstu Przegl(cid:200)d technik uczenia nienadzorowanego Podsumowanie Rozdzia(cid:239) 5. Analizy sieci spo(cid:239)eczno(cid:258)ciowych Wprowadzenie do teorii grafów Algorytmy dla grafów Wczytywanie grafów, zapisywanie ich w pliku i pobieranie z nich podpróbek Podsumowanie Rozdzia(cid:239) 6. Wizualizacje, wnioski i wyniki Wprowadzenie do pakietu Matplotlib Rysowanie krzywych Stosowanie paneli Wykresy punktowe okre(cid:258)laj(cid:200)ce relacje w danych Histogramy Wykresy s(cid:239)upkowe Wy(cid:258)wietlanie rysunków Wybrane przyk(cid:239)ady graficzne z u(cid:285)yciem pakietu pandas Wykresy punktowe Metoda wspó(cid:239)rz(cid:218)dnych równoleg(cid:239)ych Opakowywanie polece(cid:241) z pakietu Matplotlib Wprowadzenie do biblioteki seaborn Wzbogacanie mo(cid:285)liwo(cid:258)ci z zakresu eksploracji danych Interaktywne wizualizacje z u(cid:285)yciem pakietu Bokeh Zaawansowane reprezentacje dotycz(cid:200)ce uczenia si(cid:218) na podstawie danych Krzywe uczenia Krzywe walidacji Znaczenie cech w algorytmie Random Forests Wykresy cz(cid:218)(cid:258)ciowej zale(cid:285)no(cid:258)ci oparte na drzewach GBT Budowanie serwera predykcji w modelu ML-AAS Podsumowanie 6 206 207 208 210 211 213 214 221 221 222 223 224 225 225 227 237 239 239 244 252 255 257 257 259 260 262 263 264 265 268 271 273 274 274 279 284 288 288 290 292 293 294 299 Poleć książkęKup książkę Spis tre(cid:286)ci Dodatek A. Utrwalanie podstaw Pythona Lista zagadnie(cid:241) do nauki Listy S(cid:239)owniki Definiowanie funkcji Klasy, obiekty i programowanie obiektowe Wyj(cid:200)tki Iteratory i generatory Instrukcje warunkowe Wyra(cid:285)enia listowe i s(cid:239)ownikowe Nauka przez obserwacj(cid:218), lektur(cid:218) i praktyk(cid:218) Masowe otwarte kursy online PyCon i PyData Interaktywne sesje w Jupyterze Nie wstyd(cid:283) si(cid:218) — podejmij wyzwanie Skorowidz 301 302 302 304 305 307 308 309 310 311 311 311 312 312 312 315 7 Poleć książkęKup książkę Zespó(cid:239) wydania oryginalnego Autorzy Alberto Boschetti Luca Massaron Recenzent Zacharias Voulgaris Redaktor zlecaj(cid:200)cy Veena Pagare Redaktor zamawiaj(cid:200)cy Namrata Patil Redaktor ds. tre(cid:258)ci Mayur Pawanikar Redaktor techniczny Vivek Arora Redaktor Vikrant Phadke Koordynator projektu Nidhi Joshi Korektor Safis Editing Indeksowanie Aishwarya Gangawane Grafik Disha Haria Koordynator prac produkcyjnych Arvindkumar Gupta Poleć książkęKup książkę 2 Przekszta(cid:239)canie danych Zabieramy si(cid:218) do pracy z danymi! W tym rozdziale dowiesz si(cid:218), jak przekszta(cid:239)ca(cid:202) (ang. munge) dane. Na czym polega ten proces? Angielskie s(cid:239)owo munge to techniczne poj(cid:218)cie wymy(cid:258)lone mniej wi(cid:218)cej pó(cid:239) wieku temu przez studentów uczelni MIT (ang. Massachusetts Institute of Technology). Przekszta(cid:239)canie polega na modyfikowaniu w serii dobrze okre(cid:258)lonych i odwracalnych kroków fragmentu pierwotnych danych na inne (i, miejmy nadziej(cid:218), przydatniejsze) dane. (cid:189)ród(cid:239)em tego poj(cid:218)cia jest kultura hakerska; w kontek(cid:258)cie nauki o danych cz(cid:218)sto stosowane s(cid:200) inne (prawie synonimiczne) poj(cid:218)- cia, takie jak data wrangling lub przygotowywanie danych. Jest to bardzo wa(cid:285)na cz(cid:218)(cid:258)(cid:202) potoku operacji w in(cid:285)ynierii danych. Od tego rozdzia(cid:239)u b(cid:218)dziemy pos(cid:239)ugiwa(cid:202) si(cid:218) (cid:285)argonowymi i technicznymi okre(cid:258)leniami z ob- szaru rachunku prawdopodobie(cid:241)stwa i statystyki (takimi jak rozk(cid:239)ad prawdopodobie(cid:241)stwa, sta- tystyki opisowe lub testowanie hipotez). Niestety nie mo(cid:285)emy szczegó(cid:239)owo obja(cid:258)ni(cid:202) wszystkich tych poj(cid:218)(cid:202), poniewa(cid:285) naszym g(cid:239)ównym celem jest zaprezentowanie podstawowych aspektów Pythona zwi(cid:200)zanych z projektami z dziedziny nauki o danych. Dlatego zak(cid:239)adamy, (cid:285)e cz(cid:218)(cid:258)(cid:202) tych okre(cid:258)le(cid:241) ju(cid:285) znasz. Je(cid:258)li chcesz przypomnie(cid:202) sobie lub nawet zapozna(cid:202) si(cid:218) z wprowa- dzeniem do omawianych zagadnie(cid:241), zach(cid:218)camy do zaznajomienia si(cid:218) z prowadzonym przez Ramesha Sridharana kursem skierowanym do pocz(cid:200)tkuj(cid:200)cych statystyków i badaczy z obszaru nauk spo(cid:239)ecznych. Materia(cid:239)y do kursu znajdziesz na stronie http://www.mit.edu/~6.s085/. Po wyja(cid:258)nieniu za(cid:239)o(cid:285)e(cid:241) pora przedstawi(cid:202) tematy omawiane w tym rozdziale: (cid:81) proces pracy w nauce o danych (dzi(cid:218)ki niemu b(cid:218)dziesz wiedzia(cid:239), co si(cid:218) dzieje i co czeka Ci(cid:218) w nast(cid:218)pnych krokach), (cid:81) wczytywanie danych z pliku, (cid:81) wybieranie potrzebnych danych, (cid:81) radzenie sobie z brakuj(cid:200)cymi lub b(cid:239)(cid:218)dnymi danymi, Poleć książkęKup książkę Python. Podstawy nauki o danych (cid:81) dodawanie, wstawianie i usuwanie danych, (cid:81) grupowanie i modyfikowanie danych w celu uzyskania nowych i znacz(cid:200)cych informacji, (cid:81) tworzenie macierzy lub tablicy ze zbiorem danych przekazywanej do cz(cid:218)(cid:258)ci potoku odpowiedzialnej za generowanie modelu. Proces pracy w nauce o danych Cho(cid:202) ka(cid:285)dy projekt w obszarze nauki o danych jest inny, na potrzeby tego omówienia mo(cid:285)emy podzieli(cid:202) idealny projekt na seri(cid:218) uproszczonych etapów. Ca(cid:239)y proces rozpoczyna si(cid:218) od uzyskania danych (jest to etap pobierania lub pozyskiwania danych). Dost(cid:218)pne s(cid:200) tu ró(cid:285)ne mo(cid:285)liwo(cid:258)ci: od prostego pobrania danych, przez scalanie ich za pomoc(cid:200) systemów RDBMS lub repozytoriów NoSQL, po generowanie syntetycznych da- nych lub scraping danych z sieciowych interfejsów API lub stron HTML. Zw(cid:239)aszcza gdy zajmujesz si(cid:218) nowymi wyzwaniami, wczytywanie danych mo(cid:285)e okaza(cid:202) si(cid:218) kry- tycznym aspektem pracy badacza danych. Dane mog(cid:200) pochodzi(cid:202) z wielu (cid:283)róde(cid:239): baz danych, plików CSV, plików Excela, kodu w HTML-u, rysunków, nagra(cid:241) d(cid:283)wi(cid:218)kowych, interfejsów API (https://pl.wikipedia.org/wiki/Application_Programming_Interface) zwracaj(cid:200)cych pliki w forma- cie JSON itd. Poniewa(cid:285) mo(cid:285)liwo(cid:258)ci jest tak wiele, tylko pokrótce omawiamy ten aspekt pracy i przedstawiamy podstawowe narz(cid:218)dzia do pobierania danych (nawet je(cid:258)li jest ich za du(cid:285)o) do pami(cid:218)ci komputera za pomoc(cid:200) plików tekstowych dost(cid:218)pnych na twardym dysku, w sieci WWW lub w tabelach systemu RDBMS. Po udanym wczytaniu danych nast(cid:218)puje etap ich przekszta(cid:239)cania. Cho(cid:202) dane s(cid:200) ju(cid:285) dost(cid:218)pne w pami(cid:218)ci, ich posta(cid:202) z pewno(cid:258)ci(cid:200) jest niedostosowana do analiz i eksperymentów. Dane w rzeczywistym (cid:258)wiecie s(cid:200) z(cid:239)o(cid:285)one, nieuporz(cid:200)dkowane, a cz(cid:218)sto nawet b(cid:239)(cid:218)dne. Nieraz w da- nych wyst(cid:218)puj(cid:200) braki. Jednak dzi(cid:218)ki zestawowi podstawowych struktur danych i instrukcji z Pythona poradzisz sobie z wszystkimi problematycznymi danymi i b(cid:218)dziesz móg(cid:239) przekaza(cid:202) je do nast(cid:218)pnych etapów projektu. Przekszta(cid:239)cone dane maj(cid:200) posta(cid:202) typowego zbioru danych z obserwacjami w wierszach i zmiennymi w kolumnach. Uzyskanie zbioru danych to podsta- wowy wymóg we wszelkich analizach statystycznych i z obszaru uczenia maszynowego. Takie zbiory danych s(cid:200) nazywane plikami p(cid:239)askimi (gdy powsta(cid:239)y w wyniku scalenia wielu relacyjnych tabel z bazy danych) lub macierzami danych (gdy kolumny i wiersze nie s(cid:200) opisane, a prze- chowywane warto(cid:258)ci to same liczby). Etap przekszta(cid:239)cania danych daje wprawdzie mniej satysfakcji ni(cid:285) inne, bardziej intelektual- nie stymuluj(cid:200)ce fazy (takie jak stosowanie algorytmów lub uczenie maszynowe), zapewnia jednak podstawy dla wszelkich z(cid:239)o(cid:285)onych i zaawansowanych analiz pozwalaj(cid:200)cych uzyska(cid:202) warto(cid:258)(cid:202) dodan(cid:200). Powodzenie projektu w du(cid:285)ym stopniu zale(cid:285)y od tego w(cid:239)a(cid:258)nie etapu. 62 Poleć książkęKup książkę Rozdzia(cid:225) 2. • Przekszta(cid:225)canie danych Po kompletnym zdefiniowaniu zbioru danych rozpoczyna si(cid:218) nowy etap. Zaczynasz bada(cid:202) dane, a nast(cid:218)pnie w p(cid:218)tli opracowywa(cid:202) i testowa(cid:202) hipotezy. Za(cid:239)ó(cid:285)my, (cid:285)e przyjrza(cid:239)e(cid:258) si(cid:218) graficznej postaci danych. Na podstawie statystyk opisowych tworzysz nowe zmienne, wykorzystuj(cid:200)c wiedz(cid:218) z dziedziny. Ustalasz, co zrobi(cid:202) z nadmiarowymi i nieoczekiwanymi informacjami (przede wszystkim z obserwacjami odstaj(cid:200)cymi), i wybierasz najbardziej znacz(cid:200)ce zmienne oraz skuteczne parametry do przetestowania za pomoc(cid:200) okre(cid:258)lonych algorytmów uczenia ma- szynowego. Warto jednak zauwa(cid:285)y(cid:202), (cid:285)e czasem tradycyjne techniki uczenia maszynowego nie s(cid:200) dostosowane do rozwi(cid:200)zywanego problemu. Trzeba wtedy uciec si(cid:218) do analizy grafów lub innych metod z obszaru nauki o danych. Ten etap ma posta(cid:202) potoku, w którym dane s(cid:200) przetwarzane w ramach serii kroków. Nast(cid:218)p- nie tworzony jest model, przy czym mo(cid:285)esz uzna(cid:202), (cid:285)e trzeba powtórzy(cid:202) ca(cid:239)y proces i zacz(cid:200)(cid:202) od przekszta(cid:239)cania danych lub innego miejsca potoku, wprowadzi(cid:202) poprawki lub spróbowa(cid:202) innych eksperymentów. Te kroki s(cid:200) powtarzane do czasu uzyskania sensownych wyników. Z naszego do(cid:258)wiadczenia wynika, (cid:285)e niezale(cid:285)nie od tego, jak obiecuj(cid:200)ce masz plany w mo- mencie rozpoczynania analizy danych, ostatecznie uzyskasz rozwi(cid:200)zanie znacznie odbiegaj(cid:200)ce od pierwotnych wizji. Uzyskane wyniki eksperymentów wp(cid:239)ywaj(cid:200) na przekszta(cid:239)canie danych, optymalizowanie rozwi(cid:200)zania, modele i (cid:239)(cid:200)czn(cid:200) liczb(cid:218) iteracji potrzebnych do udanego zako(cid:241)- czenia projektu. Dlatego je(cid:258)li chcesz odnosi(cid:202) sukcesy jako badacz danych, nie wystarczy wy- my(cid:258)la(cid:202) teoretycznie dobrych rozwi(cid:200)za(cid:241). Konieczne jest szybkie budowanie prototypów du(cid:285)ej liczby rozwi(cid:200)za(cid:241) w celu upewnienia si(cid:218), która (cid:258)cie(cid:285)ka b(cid:218)dzie najlepsza. Naszym celem jest pomóc Ci maksymalnie przyspieszy(cid:202) wykonywanie zada(cid:241) za pomoc(cid:200) prezentowanych tu fragmentów kodu, które mo(cid:285)esz wykorzysta(cid:202) w procesie pracy w nauce o danych. Wyniki z projektu s(cid:200) przedstawiane za pomoc(cid:200) miary b(cid:239)(cid:218)du lub optymalizacji (któr(cid:200) nale(cid:285)y starannie dobra(cid:202) pod k(cid:200)tem celów biznesowych). Oprócz okre(cid:258)lenia miary b(cid:239)(cid:218)du dokonania mo(cid:285)na te(cid:285) zaprezentowa(cid:202) za pomoc(cid:200) mo(cid:285)liwych do zinterpretowania wniosków. Nale(cid:285)y je s(cid:239)ownie lub wizualnie przedstawi(cid:202) sponsorom projektu lub innym badaczom danych. W tym zakresie bardzo wa(cid:285)na jest umiej(cid:218)tno(cid:258)(cid:202) odpowiedniego wizualizowania wyników i wniosków za pomoc(cid:200) tabel, wykresów i diagramów. Ten proces mo(cid:285)na opisa(cid:202) za pomoc(cid:200) akronimu OSEMN — obtain (czyli pobieranie), scrub (przetwarzanie), explore, model i iNterpret — przedstawionego przez Hilary Mason i Chrisa Wigginsa w s(cid:239)ynnym, opisuj(cid:200)cym taksonomi(cid:218) nauki o danych wpisie z blogu dataists (http:// www.dataists.com/2010/09/a-taxonomy-of-data-science/). Akronim OSEMN mo(cid:285)na (cid:239)atwo za- pami(cid:218)ta(cid:202), poniewa(cid:285) rymuje si(cid:218) z angielskimi s(cid:239)owami possum i awesome. 63 Poleć książkęKup książkę Python. Podstawy nauki o danych Taksonomia OSEMN oczywi(cid:258)cie nie jest szczegó(cid:239)owym opisem wszystkich aspektów procesu pracy w nauce o danych. Jest jednak prostym sposobem wyró(cid:285)nienia najwa(cid:285)niejszych punk- tów zwrotnych w tym procesie. Na przyk(cid:239)ad na etapie eksploracji wyst(cid:218)puje wa(cid:285)ny etap „wy- krywania danych”, na którym pojawiaj(cid:200) si(cid:218) wszystkie nowe lub zmodyfikowane cechy. Bardzo istotny jest te(cid:285) poprzedzaj(cid:200)cy etap „okre(cid:258)lania reprezentacji danych”. Faza uczenia (opisana w roz- dziale 4. „Uczenie maszynowe”) obejmuje nie tylko tworzenie modelu, ale te(cid:285) jego walidacj(cid:218). B(cid:218)dziemy niestrudzenie przypomina(cid:202), (cid:285)e wszystko rozpoczyna si(cid:218) od przekszta(cid:239)cania danych. Zadanie to mo(cid:285)e wymaga(cid:202) a(cid:285) 80 pracy nad ca(cid:239)ym projektem. Poniewa(cid:285) nawet najd(cid:239)u(cid:285)sza podró(cid:285) rozpoczyna si(cid:218) od pierwszego kroku, od razu wkraczamy w ten rozdzia(cid:239) i pokazujemy, jakich cegie(cid:239)ek nale(cid:285)y u(cid:285)y(cid:202) w udanym etapie przekszta(cid:239)cania danych. Wczytywanie i wst(cid:218)pne przetwarzanie danych za pomoc(cid:200) biblioteki pandas W poprzednim rozdziale wyja(cid:258)nili(cid:258)my, gdzie znale(cid:283)(cid:202) przydatne zbiory danych, oraz omówili- (cid:258)my podstawowe instrukcje importu pakietów Pythona. Skoro masz ju(cid:285) gotowy zestaw narz(cid:218)dzi, w tym podrozdziale zobaczysz, jak za pomoc(cid:200) biblioteki pandas i pakietu NumPy wczytywa(cid:202) dane, operowa(cid:202) nimi, przetwarza(cid:202) je i dopracowywa(cid:202). Szybkie i (cid:239)atwe wczytywanie danych Zacznijmy od pliku CSV i biblioteki pandas. Ta biblioteka udost(cid:218)pnia najbardziej kompletn(cid:200) funkcj(cid:218) do wczytywania danych tabelarycznych z pliku (lub na podstawie adresu URL). Do- my(cid:258)lnie funkcja ta zapisuje dane w specjalnej strukturze danych z biblioteki pandas, indek- suje wiersze, rozdziela zmienne za pomoc(cid:200) niestandardowych ograniczników, ustala typ danych odpowiedni dla ka(cid:285)dej kolumny, przeprowadza konwersj(cid:218) danych (je(cid:258)li to konieczne), a tak(cid:285)e parsuje daty i obs(cid:239)uguje brakuj(cid:200)ce lub b(cid:239)(cid:218)dne warto(cid:258)ci. Wej(cid:258)cie: import pandas as pd iris_filename = datasets-uci-iris.csv iris = pd.read_csv(iris_filename, sep= , , decimal= . , header=None, names= [ sepal_length , sepal_width , petal_length , petal_width , target ]) Mo(cid:285)esz poda(cid:202) nazw(cid:218) pliku, znak u(cid:285)ywany jako separator (sep), znak oddzielaj(cid:200)cy cz(cid:218)(cid:258)(cid:202) u(cid:239)amkow(cid:200) liczb (decimal), okre(cid:258)li(cid:202), czy dane obejmuj(cid:200) nag(cid:239)ówek (header), a tak(cid:285)e przekaza(cid:202) nazwy zmien- nych (za pomoc(cid:200) parametru names i listy). W tym przyk(cid:239)adzie parametry sep= , i decimal= . przyjmuj(cid:200) warto(cid:258)ci domy(cid:258)lne, dlatego s(cid:200) opcjonalne. Jednak dla plików CSV z obszaru Europy nale(cid:285)y poda(cid:202) oba te parametry, poniewa(cid:285) w wielu krajach europejskich (a tak(cid:285)e w niektórych pa(cid:241)- stwach azjatyckich) separator i znak oddzielaj(cid:200)cy cz(cid:218)(cid:258)(cid:202) u(cid:239)amkow(cid:200) s(cid:200) inne od ustawie(cid:241) domy(cid:258)lnych. 64 Poleć książkęKup książkę Rozdzia(cid:225) 2. • Przekszta(cid:225)canie danych Je(cid:258)li zbiór danych nie jest zapisany w komputerze, mo(cid:285)esz wykona(cid:202) opisane poni(cid:285)ej kroki, aby pobra(cid:202) go z internetu: import urllib url = http://aima.cs.berkeley.edu/data/iris.csv set1 = urllib.request.Request(url) iris_p = urllib.request.urlopen(set1) iris_other = pd.read_csv(iris_p, sep= , , decimal= . , header=None, names= [ sepal_length , sepal_width , petal_length , petal_width , target ]) iris_other.head() Wynikowy obiekt iris jest typu DataFrame z biblioteki pandas. Ten typ to co(cid:258) wi(cid:218)cej ni(cid:285) prosta lista lub prosty s(cid:239)ownik Pythona. W dalszych punktach omawiamy niektóre w(cid:239)a(cid:258)ciwo(cid:258)ci tego typu danych. Aby pozna(cid:202) zawarto(cid:258)(cid:202) zbioru danych, mo(cid:285)esz wy(cid:258)wietli(cid:202) pierwsze lub ostatnie wiersze za pomoc(cid:200) nast(cid:218)puj(cid:200)cych instrukcji: Wej(cid:258)cie: iris.head() Wyj(cid:258)cie: Wej(cid:258)cie: iris.tail() [...] Te funkcje wywo(cid:239)ane bez argumentów wy(cid:258)wietlaj(cid:200) po pi(cid:218)(cid:202) wierszy. Je(cid:258)li chcesz otrzyma(cid:202) inn(cid:200) liczb(cid:218) wierszy, wywo(cid:239)aj funkcj(cid:218), podaj(cid:200)c t(cid:218) liczb(cid:218) jako argument: Wej(cid:258)cie: iris.head(2) Ta instrukcja wy(cid:258)wietla tylko dwa pierwsze wiersze. Aby pozna(cid:202) nazwy kolumn, mo(cid:285)esz wy- wo(cid:239)a(cid:202) nast(cid:218)puj(cid:200)c(cid:200) metod(cid:218): Wej(cid:258)cie: iris.columns Wyj(cid:258)cie: Index([ sepal_length , sepal_width , petal_length , petal_width , target ], dtype= object ) Wynikowy obiekt jest bardzo interesuj(cid:200)cy. Wygl(cid:200)da jak lista, ale w rzeczywisto(cid:258)ci jest indek- sem biblioteki pandas. Zgodnie z nazw(cid:200) obiektu okre(cid:258)la indeksy nazw kolumn. Na przyk(cid:239)ad aby pobra(cid:202) kolumn(cid:218) target, wykonaj takie oto kroki: 65 Poleć książkęKup książkę Python. Podstawy nauki o danych Wej(cid:258)cie: Y = iris[ target ] Y Wyj(cid:258)cie: 0 Iris-setosa 1 Iris-setosa 2 Iris-setosa 3 Iris-setosa ... 149 Iris-virginica Name: target, dtype: object Obiekt Y jest typu Series z biblioteki pandas. Na razie mo(cid:285)esz traktowa(cid:202) ten typ jak jedno- wymiarow(cid:200) tablic(cid:218) z etykietami osi. Pó(cid:283)niej przyjrzymy si(cid:218) mu bli(cid:285)ej. Zapami(cid:218)taj, (cid:285)e klasa Index z biblioteki pandas dzia(cid:239)a jak s(cid:239)ownik z indeksem kolumn tabeli. Zauwa(cid:285), (cid:285)e list(cid:218) ko- lumn mo(cid:285)na uzyska(cid:202) tak(cid:285)e za pomoc(cid:200) ich nazw: Wej(cid:258)cie: X = iris[[ sepal_length , sepal_width ]] X Wyj(cid:258)cie: [150 rows x 2 columns] Tu wynik jest obiektem typu DataFrame z biblioteki pandas. Dlaczego wywo(cid:239)ania tej samej funkcji zwracaj(cid:200) tak ró(cid:285)ne wyniki? W pierwszej instrukcji za(cid:285)(cid:200)dali(cid:258)my kolumny. Dlatego dane wyj(cid:258)ciowe to wektor jednowymiarowy (typu Series z biblioteki pandas). W drugiej instrukcji za(cid:285)(cid:200)dali(cid:258)my wielu kolumn i otrzymali(cid:258)my wynik podobny do macierzy (a wiemy, (cid:285)e macierze s(cid:200) reprezentowane za pomoc(cid:200) typu DataFrame z biblioteki pandas). Dla pocz(cid:200)tkuj(cid:200)cych (cid:239)a- twym sposobem na dostrze(cid:285)enie ró(cid:285)nicy jest przyjrzenie si(cid:218) nag(cid:239)ówkowi danych wyj(cid:258)cio- wych. Je(cid:258)li kolumnom przypisane s(cid:200) nazwy, u(cid:285)ywany jest typ DataFrame. Gdy wynikiem jest wektor bez nag(cid:239)ówka, u(cid:285)ywany jest typ Series. 66 Poleć książkęKup książkę Rozdzia(cid:225) 2. • Przekszta(cid:225)canie danych Przedstawili(cid:258)my ju(cid:285) standardowe kroki procesu pracy w nauce o danych. Po wczytaniu zbioru danych zwykle nale(cid:285)y oddzieli(cid:202) cechy od docelowych wyników. W problemach wymagaj(cid:200)- cych klasyfikowania docelowe wyniki to zwykle warto(cid:258)ci dyskretne lub (cid:239)a(cid:241)cuchy znaków oznaczaj(cid:200)ce klas(cid:218) powi(cid:200)zan(cid:200) z poszczególnymi zestawami cech. Dalsze kroki wymagaj(cid:200) ustalenia, jak rozbudowany jest problem. Dlatego trzeba pozna(cid:202) wiel- ko(cid:258)(cid:202) zbioru danych. Zwykle w celu ustalenia liczby obserwacji zliczane s(cid:200) wiersze, a w celu okre(cid:258)lenia liczby cech nale(cid:285)y zliczy(cid:202) kolumny. Aby uzyska(cid:202) liczb(cid:218) wymiarów zbioru danych, zastosuj atrybut shape obiektu typu DataFrame lub Series: Wej(cid:258)cie: print (X.shape) Wyj(cid:258)cie: (150, 2) Wej(cid:258)cie: print (Y.shape) Wyj(cid:258)cie: (150,) Wynikowym obiektem jest krotka zawieraj(cid:200)ca wielko(cid:258)(cid:202) macierzy (lub tablicy) w ka(cid:285)dym wy- miarze. Zauwa(cid:285), (cid:285)e dla typu Series u(cid:285)ywany jest ten sam format (jednoelementowa krotka). Radzenie sobie z problematycznymi danymi Na tym etapie zapewne lepiej rozumiesz ju(cid:285) podstawy procesu pracy i jeste(cid:258) gotowy zmierzy(cid:202) si(cid:218) z problematycznymi zbiorami danych. W praktyce k(cid:239)opoty z danymi zdarzaj(cid:200) si(cid:218) bardzo cz(cid:218)sto. Zobacz, co si(cid:218) stanie, je(cid:258)li plik CSV zawiera nag(cid:239)ówek, za to brakuje w nim niektórych warto(cid:258)ci i dat. Aby przyk(cid:239)ad by(cid:239) realistyczny, za(cid:239)ó(cid:285)my, (cid:285)e dane pochodz(cid:200) z biura podró(cid:285)y. Obejmuj(cid:200) one temperatur(cid:218) w trzech popularnych lokalizacjach i miejscowo(cid:258)(cid:202) wybran(cid:200) przez klienta: Date,Temperature_city_1,Temperature_city_2,Temperature_city_3, Which_destination 20140910,80,32,40,1 20140911,100,50,36,2 20140912,102,55,46,1 20140912,60,20,35,3 20140914,60,,32,3 20140914,,57,42,2 U(cid:285)ywane s(cid:200) tu tylko liczby ca(cid:239)kowite, a plik zawiera nag(cid:239)ówek. Pierwsz(cid:200) prób(cid:218) wczytania zbioru danych ilustruje nast(cid:218)puj(cid:200)ce polecenie: Wej(cid:258)cie: import pandas as pd Wej(cid:258)cie: fake_dataset = pd.read_csv( a_loading_example_1.csv , sep= , ) fake_dataset Wyj(cid:258)cie: 67 Poleć książkęKup książkę Python. Podstawy nauki o danych Biblioteka pandas automatycznie przypisuje kolumnom nazwy pobrane z pierwszego wiersza. W danych widoczny jest pierwszy problem: wszystkie dane (nawet daty) zosta(cid:239)y przetworzone jako liczby ca(cid:239)kowite (mog(cid:200) by(cid:202) te(cid:285) przetwarzane jako (cid:239)a(cid:241)cuchy znaków). Je(cid:258)li format dat jest typowy, mo(cid:285)na spróbowa(cid:202) zastosowa(cid:202) procedur(cid:218) automatycznego ich przetwarzania, wskazuj(cid:200)c kolumn(cid:218) z datami. W poni(cid:285)szym przyk(cid:239)adzie technika ta sprawdza si(cid:218) bardzo dobrze z nast(cid:218)- puj(cid:200)cymi argumentami: Wej(cid:258)cie: fake_dataset = pd.read_csv( a_loading_example_1.csv , parse_dates=[0]) fake_dataset Wyj(cid:258)cie: Aby wyeliminowa(cid:202) luki w danych (opisane jako NaN — ang. not a number, czyli „nie liczba”), mo(cid:285)na zast(cid:200)pi(cid:202) je sensownymi warto(cid:258)ciami (tu mo(cid:285)e by(cid:202) to 50 stopni Fahrenheita). W niektó- rych sytuacjach jest to uzasadnione (dalej w rozdziale opisujemy wi(cid:218)cej problemów i strategii radzenia sobie z lukami w danych). Oto potrzebna instrukcja: Wej(cid:258)cie: fake_dataset.fillna(50) Wyj(cid:258)cie: 68 Poleć książkęKup książkę Rozdzia(cid:225) 2. • Przekszta(cid:225)canie danych Po tej operacji luki w danych znikn(cid:218)(cid:239)y zast(cid:200)pione sta(cid:239)(cid:200) warto(cid:258)ci(cid:200) 50.0. Radzenie sobie z lu- kami w danych te(cid:285) wymaga ró(cid:285)nych strategii. Zamiast stosowa(cid:202) pokazan(cid:200) wcze(cid:258)niej instrukcj(cid:218), mo(cid:285)esz zast(cid:200)pi(cid:202) luki ujemn(cid:200) sta(cid:239)(cid:200) warto(cid:258)ci(cid:200), aby podkre(cid:258)li(cid:202) fakt, (cid:285)e ró(cid:285)ni si(cid:218) ona od pozosta- (cid:239)ych danych (a interpretacj(cid:218) zostawiamy wtedy algorytmowi odpowiedzialnemu za uczenie): Wej(cid:258)cie: fake_dataset.fillna(-1) Zauwa(cid:285), (cid:285)e ta technika uzupe(cid:239)nia luki tylko w widoku danych (nie modyfikuje pierwotnego obiektu typu DataFrame). Aby zmieni(cid:202) same dane, zastosuj argument inplace=True. Warto(cid:258)ci NaN mo(cid:285)na zast(cid:200)pi(cid:202) tak(cid:285)e (cid:258)redni(cid:200) lub median(cid:200) dla kolumny. Pozwala to zminimali- zowa(cid:202) b(cid:239)(cid:200)d zwi(cid:200)zany ze zgadywaniem brakuj(cid:200)cych warto(cid:258)ci. Wej(cid:258)cie: fake_dataset.fillna(fake_dataset.mean(axis=0)) Metoda .mean oblicza (cid:258)redni(cid:200) arytmetyczn(cid:200) warto(cid:258)ci z okre(cid:258)lonej osi. Zauwa(cid:285), (cid:285)e ustawienie axis=0 oznacza obliczanie (cid:258)redniej z uwzgl(cid:218)dnieniem wielu wierszy. (cid:165)rednie s(cid:200) wtedy obliczane dla kolumn. Opcja axis=1 powoduje uwzgl(cid:218)dnienie wielu kolumn i uzyskanie wyników dla wierszy. W ten sam sposób dzia(cid:239)aj(cid:200) inne metody przyjmuj(cid:200)ce parametr axis (zarówno z biblioteki pandas, jak i z pakietu NumPy). Metoda .median dzia(cid:239)a analogicznie do metody .mean, ale oblicza median(cid:218). Jest to przydatne, gdy (cid:258)rednia jest ma(cid:239)o reprezentatywna i daje zniekszta(cid:239)cone dane (na przyk(cid:239)ad gdy cecha przyjmuje wiele skrajnych warto(cid:258)ci). Inny problem z obs(cid:239)ug(cid:200) rzeczywistych zbiorów danych zwi(cid:200)zany jest z b(cid:239)(cid:218)dami i niepra- wid(cid:239)owymi wierszami. Po ich napotkaniu metoda load_csv ko(cid:241)czy prac(cid:218) i zg(cid:239)asza wyj(cid:200)tek. Mo(cid:285)liwym rozwi(cid:200)zaniem, akceptowalnym, gdy b(cid:239)(cid:218)dne obserwacje nie stanowi(cid:200) wi(cid:218)kszo(cid:258)ci danych, jest odrzucanie wierszy powoduj(cid:200)cych wyj(cid:200)tki. W wielu sytuacjach prowadzi to do treningu algorytmu uczenia maszynowego bez b(cid:239)(cid:218)dnych informacji. Za(cid:239)ó(cid:285)my, (cid:285)e u(cid:285)ywasz b(cid:239)(cid:218)dnie sformatowanego zbioru danych i chcesz wczyta(cid:202) tylko poprawne wiersze, ignoruj(cid:200)c te nieprawid(cid:239)owo sformatowane. Poni(cid:285)ej pokazujemy, jak zrobi(cid:202) to z u(cid:285)yciem opcji error_bad_lines: Val1,Val2,Val3 0,0,0 1,1,1 2,2,2,2 3,3,3 Wej(cid:258)cie: bad_dataset = pd.read_csv( a_loading_example_2.csv , error_bad_lines=False) bad_dataset Wyj(cid:258)cie: Skipping line 4: expected 3 fields, saw 4 69 Poleć książkęKup książkę Python. Podstawy nauki o danych Radzenie sobie z du(cid:285)ymi zbiorami danych Je(cid:258)li zbiór danych, który chcesz wczyta(cid:202), jest za du(cid:285)y, aby zmie(cid:258)ci(cid:202) go w pami(cid:218)ci, mo(cid:285)esz za- stosowa(cid:202) wsadowy algorytm uczenia maszynowego, dzia(cid:239)aj(cid:200)cy w danym momencie tylko na porcjach danych. Podej(cid:258)cie wsadowe ma sens tak(cid:285)e wtedy, gdy potrzebujesz jedynie próbki danych (na przyk(cid:239)ad chcesz tylko podejrze(cid:202) ich zawarto(cid:258)(cid:202)). W Pythonie mo(cid:285)liwe jest wczyty- wanie danych w porcjach. Ta operacja to strumieniowanie danych, poniewa(cid:285) zbiór danych przep(cid:239)ywa do obiektu typu DataFrame lub innej struktury danych w postaci ci(cid:200)g(cid:239)ego strumienia. Natomiast w sytuacjach opisywanych wcze(cid:258)niej zbiór danych jest w pe(cid:239)ni wczytywany do pa- mi(cid:218)ci w jednym kroku. Za pomoc(cid:200) biblioteki pandas mo(cid:285)na podzieli(cid:202) i wczyta(cid:202) plik na dwa sposoby. Pierwszy polega na wczytywaniu zbioru danych w porcjach o równej wielko(cid:258)ci. Ka(cid:285)da porcja to fragment zbio- ru danych zawieraj(cid:200)cy wszystkie kolumny i ograniczon(cid:200) liczb(cid:218) wierszy (nie wi(cid:218)cej ni(cid:285) okre- (cid:258)lono w parametrze chunksize w wywo(cid:239)aniu funkcji). Zauwa(cid:285), (cid:285)e wtedy dane wyj(cid:258)ciowe funk- cji read_csv nie s(cid:200) obiektem typu DataFrame, ale obiektem przypominaj(cid:200)cym iterator. W celu wczytania wyników do pami(cid:218)ci trzeba zastosowa(cid:202) iteracj(cid:218) do tego obiektu: Wej(cid:258)cie: import pandas as pd iris_chunks = pd.read_csv(iris_filename, header=None, names=[ C1 , C2 , C3 , C4 , C5 ], chunksize=10) for chunk in iris_chunks: print ( Wymiary: , chunk.shape) print (chunk, \n ) Wyj(cid:258)cie: Wymiary: (10, 5) C1 C2 C3 C4 C50 5.1 3.5 1.4 0.2 Iris-setosa1 4.9 3.0 1.4 0.2 Iris-setosa2 4.7 3.2 1.3 0.2 Irissetosa3 4.6 3.1 1.5 0.2 Iris-setosa4 5.0 3.6 1.4 0.2 Iris-setosa5 5.4 3.9 1.7 0.4 Iris-setosa6 4.6 3.4 1.4 0.3 Iris-setosa7 5.0 3.4 1.5 0.2 Iris-setosa8 4.4 2.9 1.4 0.2 Iris-setosa9 4.9 3.1 1.5 0.1 Iris-setosa... Zwracanych jest te(cid:285) 14 innych fragmentów tego rodzaju, ka(cid:285)dy o wymiarach (10×5). Inna me- toda wczytywania du(cid:285)ych zbiorów danych polega na za(cid:285)(cid:200)daniu iteratora. Wtedy mo(cid:285)na dy- namicznie okre(cid:258)la(cid:202) d(cid:239)ugo(cid:258)(cid:202) (liczb(cid:218) wierszy) ka(cid:285)dego fragmentu obiektu typu DataFrame: Wej(cid:258)cie: iris_iterator = pd.read_csv(iris_filename, header=None, names=[ C1 , C2 , C3 , C4 , C5 ], iterator=True) Wej(cid:258)cie: print (iris_iterator.get_chunk(10).shape) Wyj(cid:258)cie: (10, 5) 70 Poleć książkęKup książkę Rozdzia(cid:225) 2. • Przekszta(cid:225)canie danych Wej(cid:258)cie: print (iris_iterator.get_chunk(20).shape) Wyj(cid:258)cie: (20, 5) Wej(cid:258)cie: piece = iris_iterator.get_chunk(2) piece Wyj(cid:258)cie: W tym przyk(cid:239)adzie najpierw definiowany jest iterator. Nast(cid:218)pnie kod pobiera porcj(cid:218) danych obejmuj(cid:200)c(cid:200) 10 wierszy. Pó(cid:283)niej pobieranych jest 20 nast(cid:218)pnych wierszy, a w ostatnim kroku — dwa wiersze, które s(cid:200) wy(cid:258)wietlane. Oprócz biblioteki pandas mo(cid:285)esz zastosowa(cid:202) pakiet CSV. Udost(cid:218)pnia on dwie funkcje pozwala- j(cid:200)ce porusza(cid:202) si(cid:218) po niewielkich porcjach danych z plików. S(cid:200) to funkcje reader i DictReader. Aby przyjrze(cid:202) si(cid:218) tym funkcjom, najpierw nale(cid:285)y zaimportowa(cid:202) pakiet CSV: Wej(cid:258)cie: import csv Funkcja reader przenosi dane z dysków na listy Pythona. Funkcja DictReader przekszta(cid:239)ca dane na s(cid:239)ownik. Obie funkcje iteracyjnie przetwarzaj(cid:200) wiersze wczytywanego pliku. Funkcja reader zwraca dok(cid:239)adnie to, co wczyta, bez znaku powrotu karetki i po rozbiciu danych na list(cid:218) na podstawie separatora (domy(cid:258)lnie u(cid:285)ywany jest przecinek, mo(cid:285)na to jednak zmieni(cid:202)). Funkcja DictReader odwzorowuje dane z listy na s(cid:239)ownik, którego klucze s(cid:200) definiowane na podstawie pierwszego wiersza (je(cid:258)li dost(cid:218)pny jest nag(cid:239)ówek) lub parametru fieldnames (przy u(cid:285)yciu listy (cid:239)a(cid:241)cuchów znaków z nazwami kolumn). Wczytywanie list za pomoc(cid:200) natywnych technik nie jest ograniczeniem. (cid:146)atwiej jest wtedy przyspieszy(cid:202) prac(cid:218) kodu za pomoc(cid:200) szybkich implementacji Pythona (takich jak PyPy). Po- nadto listy zawsze mo(cid:285)na przekszta(cid:239)ci(cid:202) w tablice ndarrays z pakietu NumPy (jest to struktura danych, któr(cid:200) wkrótce przedstawimy). Po wczytaniu danych do s(cid:239)owników o formacie podob- nym do JSON-a mo(cid:285)na stosunkowo (cid:239)atwo uzyska(cid:202) obiekt typu DataFrame. Ta technika wczy- tywania jest bardzo skuteczna, gdy dane s(cid:200) rzadkie (wiersze nie obejmuj(cid:200) wszystkich cech). Wtedy s(cid:239)ownik zawiera tylko niezerowe warto(cid:258)ci (ró(cid:285)ne od null), co pozwala zaoszcz(cid:218)dzi(cid:202) du(cid:285)o miejsca. Pó(cid:283)niejsze przeniesienie danych ze s(cid:239)ownika do obiektu typu DataFrame jest bardzo (cid:239)atwe. Oto prosty przyk(cid:239)ad, w którym u(cid:285)ywane s(cid:200) mo(cid:285)liwo(cid:258)ci pakietu CSV. Przyjmijmy, (cid:285)e plik datasets-uci-iris.csv pobrany ze strony http://mldata.org/ jest bardzo du(cid:285)y i nie mo(cid:285)na go w ca(cid:239)o(cid:258)ci wczyta(cid:202) do pami(cid:218)ci (to tylko fikcyjne za(cid:239)o(cid:285)enie, poniewa(cid:285) na pocz(cid:200)t- ku rozdzia(cid:239)u pokazali(cid:258)my, (cid:285)e plik ten obejmuje tylko 150 przyk(cid:239)adów i nie zawiera wiersza z nag(cid:239)ówkiem). 71 Poleć książkęKup książkę Python. Podstawy nauki o danych W takiej sytuacji jedyn(cid:200) mo(cid:285)liwo(cid:258)ci(cid:200) jest wczytywanie pliku w porcjach. Zacznijmy od eks- perymentu: Wej(cid:258)cie: with open(iris_filename, rt ) as data_stream: # Tryb rt for n, row in enumerate(csv.DictReader(data_stream, fieldnames = [ sepal_length , sepal_width , petal_length , petal_width , target ], dialect= excel )): if n== 0: print (n,row) else: break Wyj(cid:258)cie: 0 { petal_width : 0.2 , target : Iris-setosa , sepal_width : 3.5 , sepal_length : 5.1 , petal_length : 1.4 } Jak dzia(cid:239)a przedstawiony kod? Otwiera po(cid:239)(cid:200)czenie z plikiem w trybie odczytu danych binar- nych i tworzy dla pliku alias data_stream. U(cid:285)ycie polecenia with sprawia, (cid:285)e plik zostanie za- mkni(cid:218)ty po kompletnym wykonaniu instrukcji umieszczonych w nast(cid:218)pnym wci(cid:218)ciu. Dalej kod uruchamia iteracj(cid:218) (for ... in ...) i w wywo(cid:239)aniu enumerate uruchamia funkcj(cid:218) csv.DictReader, wczytuj(cid:200)c(cid:200) dane ze strumienia data_stream. Poniewa(cid:285) plik nie zawiera nag(cid:239)ówka, nazwy pól s(cid:200) podane w parametrze fieldnames. Parametr dialect okre(cid:258)la, (cid:285)e u(cid:285)ywany jest standardowy plik CSV (dalej przedstawiamy wskazówki dotycz(cid:200)ce warto(cid:258)ci tego parametru). W iteracji kod dzia(cid:239)a tak, (cid:285)e je(cid:258)li wczyta(cid:239) pierwszy wiersz, to go wy(cid:258)wietla. W przeciwnym razie zatrzymuje p(cid:218)tl(cid:218) za pomoc(cid:200) instrukcji break. Polecenie print wy(cid:258)wietla tu wiersz o nu- merze 0 i zawarto(cid:258)(cid:202) s(cid:239)ownika. Dlatego mo(cid:285)na ustali(cid:202) warto(cid:258)(cid:202) ka(cid:285)dego elementu z wiersza, podaj(cid:200)c klucze w postaci nazw zmiennych. Mo(cid:285)na napisa(cid:202) podobny kod z instrukcj(cid:200) csv.reader: Wej(cid:258)cie: with open(iris_filename, rt ) as data_stream: for n, row in enumerate(csv.reader(data_stream, dialect= excel )): if n==0: print (row) else: break Wyj(cid:258)cie: [ 5.1 , 3.5 , 1.4 , 0.2 , Iris-setosa ] Ta wersja jest jeszcze prostsza. Wy(cid:258)wietla te(cid:285) prostsze dane wyj(cid:258)ciowe — list(cid:218) z sekwencj(cid:200) warto(cid:258)ci z wiersza. 72 Poleć książkęKup książkę Rozdzia(cid:225) 2. • Przekszta(cid:225)canie danych Teraz na podstawie drugiej wersji mo(cid:285)na napisa(cid:202) generator wywo(cid:239)ywany w p(cid:218)tli for. Pobiera on „w locie” dane z pliku w blokach o wielko(cid:258)ci zdefiniowanej w parametrze batch funkcji: Wej(cid:258)cie: def batch_read(filename, batch=5): # Otwieranie strumienia danych with open(filename, rt ) as data_stream: # Zerowanie porcji danych batch_output = list() # Iteracyjne przetwarzanie pliku for n, row in enumerate(csv.reader(data_stream, dialect= excel )): # Je(cid:286)li porcja jest odpowiedniej wielko(cid:286)ci… if n 0 and n batch == 0: # …zostaje zwrócona jako tablica ndarray. yield(np.array(batch_output)) # Zerowanie porcji i rozpoczynanie od nowa batch_output = list() # W przeciwnym razie do porcji nale(cid:298)y doda(cid:252) wiersz. batch_output.append(row) # Po zako(cid:276)czeniu p(cid:266)tli wy(cid:286)wietlane s(cid:261) pozosta(cid:225)e warto(cid:286)ci. leftyield(np.array(batch_output)) Podobnie jak w poprzednim przyk(cid:239)adzie dane s(cid:200) pobierane za pomoc(cid:200) funkcji csv.reader opakowanej w funkcj(cid:218) enumerate. Ta ostatnia (cid:239)(cid:200)czy pobieran(cid:200) list(cid:218) danych z numerami obser- wacji (numeracja rozpoczyna si(cid:218) od zera). Na podstawie numeru obserwacji kod albo dodaje dane do porcji, albo zwraca sterowanie do g(cid:239)ównego programu za pomoc(cid:200) generatywnej funk- cji yield. Ten proces jest powtarzany do czasu wczytania i zwrócenia ca(cid:239)ego pliku w porcjach. Wej(cid:258)cie: import numpy as np for batch_input in batch_read(iris_filename, batch=3): print (batch_input) break Wyj(cid:258)cie: [[ 5.1 3.5 1.4 0.2 Iris-setosa ] [ 4.9 3.0 1.4 0.2 Iris-setosa ] [ 4.7 3.2 1.3 0.2 Iris-setosa ]] Tak(cid:200) funkcj(cid:218) mo(cid:285)na wykorzysta(cid:202) w procesie uczenia za pomoc(cid:200) metody SGD (ang. stochastic gradient descent), co pokazujemy w rozdziale 4. „Uczenie maszynowe”, gdzie wracamy do tego fragmentu kodu i rozbudowujemy go do bardziej zaawansowanej postaci. Dost(cid:218)p do danych w innych formatach Do tej pory u(cid:285)ywali(cid:258)my tylko plików CSV. Biblioteka pandas udost(cid:218)pnia podobne mechani- zmy i funkcje do wczytywania zbiorów danych w formatach Excel, HDFS, SQL, JSON, HTML i Stata. Poniewa(cid:285) te formaty nie s(cid:200) u(cid:285)ywane we wszystkich projektach z obszaru nauki o danych, opanowanie wczytywania i obs(cid:239)ugi plików w tych formatach pozostawiamy czytelnikom. 73 Poleć książkęKup książkę Python. Podstawy nauki o danych Mo(cid:285)esz zajrze(cid:202) do szczegó(cid:239)owej dokumentacji dost(cid:218)pnej w witrynie biblioteki pandas. W przy- k(cid:239)adowym kodzie zamieszczonym na stronie po(cid:258)wi(cid:218)conej ksi(cid:200)(cid:285)ce pokazany jest prosty przyk(cid:239)ad wczytywania tabel SQL-owych. Obiekty typu DataFrame mo(cid:285)na te(cid:285) tworzy(cid:202) w wyniku scalania sekwencji i innych danych przypominaj(cid:200)cych listy. Zauwa(cid:285), (cid:285)e dane skalarne s(cid:200) przekszta(cid:239)cane w listy. Wej(cid:258)cie: import pandas as pd my_own_dataset = pd.DataFrame({ Col1 : range(5), Col2 : [1.0]*5, Col3 : 1.0, Col4 : Witaj, (cid:258)wiecie! }) my_own_dataset Wyj(cid:258)cie: Dla ka(cid:285)dej tworzonej kolumny nale(cid:285)y poda(cid:202) nazwy (klucze ze s(cid:239)ownika) i warto(cid:258)ci (warto(cid:258)ci w s(cid:239)owniku odpowiadaj(cid:200)ce danym kluczom). W tym przyk(cid:239)adzie kolumny Col2 i Col3 s(cid:200) two- rzone w inny sposób, ale zawieraj(cid:200) te same wynikowe warto(cid:258)ci. Pokazana technika pozwala tworzy(cid:202) za pomoc(cid:200) bardzo prostej funkcji obiekty typu DataFrame obejmuj(cid:200)ce warto(cid:258)ci ró(cid:285)- nych typów danych. W tym procesie nale(cid:285)y zadba(cid:202) o to, by nie u(cid:285)ywa(cid:202) list o ró(cid:285)nej wielko(cid:258)ci. W przeciwnym razie zg(cid:239)oszony zostanie wyj(cid:200)tek: Wej(cid:258)cie: my_wrong_own_dataset = pd.DataFrame({ Col1 : range(5), Col2 : string , Col3 : range(2)}) ... ValueError: arrays must all be same length Aby sprawdzi(cid:202) typy danych poszczególnych kolumn, zastosuj atrybut dtypes: In: my_own_dataset.dtypes Col1 int64 Col2 float64 Col3 float64 Col4 object dtype: object Ta technika jest bardzo przydatna, gdy chcesz zbada(cid:202) typ danych (kategorialny, ca(cid:239)kowitolicz- bowy, zmiennoprzecinkowy) i precyzj(cid:218). Czasem mo(cid:285)na przyspieszy(cid:202) prac(cid:218) kodu, zaokr(cid:200)- glaj(cid:200)c liczby zmiennoprzecinkowe do liczb ca(cid:239)kowitych, rzutuj(cid:200)c liczby zmiennoprzecinkowe 74 Poleć książkęKup książkę Rozdzia(cid:225) 2. • Przekszta(cid:225)canie danych o podwójnej precyzji na ich odpowiedniki o pojedynczej precyzji lub u(cid:285)ywaj(cid:200)c tylko jednego typu danych. W nast(cid:218)pnym fragmencie pokazujemy, jak rzutowa(cid:202) dane. Ten kod mo(cid:285)esz po- traktowa(cid:202) jako ogólny przyk(cid:239)ad ilustruj(cid:200)cy zmienianie typu kolumn z danymi: Wej(cid:258)cie: my_own_dataset[ Col1 ] = my_own_dataset[ Col1 ].astype(float) my_own_dataset.dtypes Wyj(cid:258)cie: Col1 float64 Col2 float64 Col3 float64 Col4 object dtype: object Wst(cid:218)pne przetwarzanie danych Potrafisz ju(cid:285) zaimportowa(cid:202) zbiór danych, nawet je(cid:258)li jest du(cid:285)y i problematyczny. Teraz nale(cid:285)y pozna(cid:202) podstawowe procedury wst(cid:218)pnego przetwarzania danych, pozwalaj(cid:200)ce dostosowa(cid:202) te dane do nast(cid:218)pnego kroku procesu pracy w nauce o danych. Je(cid:258)li chcesz zastosowa(cid:202) funkcj(cid:218) tylko do wybranych wierszy, powiniene(cid:258) najpierw utworzy(cid:202) mask(cid:218). Maska to sekwencja warto(cid:258)ci logicznych (True lub False), informuj(cid:200)cych, czy dany wiersz ma by(cid:202) uwzgl(cid:218)dniany przez dan(cid:200) funkcj(cid:218). Za(cid:239)ó(cid:285)my, (cid:285)e chcesz uwzgl(cid:218)dni(cid:202) wszystkie wiersze ze zbioru Iris, w których warto(cid:258)(cid:202) cechy sepal length jest wi(cid:218)ksza ni(cid:285) 6. Mo(cid:285)na zrobi(cid:202) to tak: Wej(cid:258)cie: mask_feature = iris[ sepal_length ] 6.0 Wej(cid:258)cie: mask_feature 0 False 1 False ... 146 True 147 True 148 True 149 False W tym prostym przyk(cid:239)adzie od razu wida(cid:202), dla których obserwacji warunek jest spe(cid:239)niony (True), a dla których nie jest (False). Okre(cid:258)la to, które wiersze zostan(cid:200) wybrane. Teraz zobacz, jak wykorzysta(cid:202) mask(cid:218) wyboru w innym kodzie. Za(cid:239)ó(cid:285)my, (cid:285)e chcemy zast(cid:200)pi(cid:202) docelow(cid:200) warto(cid:258)(cid:202) Iris-virginica warto(cid:258)ci(cid:200) Nowa warto(cid:258)(cid:202). Mo(cid:285)na to zrobi(cid:202) za pomoc(cid:200) dwóch poni(cid:285)szych wierszy kodu: Wej(cid:258)cie: mask_target = iris[ target ] == Iris-virginica Wej(cid:258)cie: iris.loc[mask_target, target ] = Nowa warto(cid:258)(cid:202) 75 Poleć książkęKup książkę Python. Podstawy nauki o danych Zobaczysz, (cid:285)e wszystkie wyst(cid:200)pienia nazwy Iris-virginica zostan(cid:200) zast(cid:200)pione okre(cid:258)leniem Nowa warto(cid:258)(cid:202). Metod(cid:218) .loc() omawiamy dalej. Na razie zapami(cid:218)taj, (cid:285)e umo(cid:285)liwia ona dost(cid:218)p do danych z macierzy za pomoc(cid:200) indeksów wierszy i kolumn. Aby zobaczy(cid:202) now(cid:200) list(cid:218) danych z kolumny warto(cid:258)ci docelowych, mo(cid:285)esz zastosowa(cid:202) metod(cid:218) unique(). Jest ona bardzo przydatna do wst(cid:218)pnego badania zbioru danych: Wej(cid:258)cie: iris[ target ].unique() Wyj(cid:258)cie: array([ Iris-setosa , Iris-versicolor , Nowa warto(cid:258)(cid:202) ], dtype=object) Je(cid:258)li chcesz zapozna(cid:202) si(cid:218) ze statystykami dotycz(cid:200)cymi poszczególnych cech, mo(cid:285)esz odpo- wiednio pogrupowa(cid:202) kolumny lub zastosowa(cid:202) mask(cid:218). Metoda groupby z biblioteki pandas ge- neruje podobne wyniki co klauzula GROUP BY z instrukcji SQL-owych. Nast(cid:218)pn(cid:200) stosowan(cid:200) metod(cid:200) powinna by(cid:202) metoda agreguj(cid:200)ca wywo(cid:239)ywana dla jednej kolumny lub ich zbioru. Na przyk(cid:239)ad metoda agreguj(cid:200)ca mean() z biblioteki pandas to odpowiednik SQL-owej funkcji AVG() (zwraca (cid:258)redni(cid:200) warto(cid:258)ci z grupy), metoda agreguj(cid:200)ca var() oblicza wariancj(cid:218), metoda sum() sumuje warto(cid:258)ci, metoda count() zlicza wiersze w grupie itd. Zauwa(cid:285), (cid:285)e wynikiem jest obiekt typu DataFrame, dlatego sekwencj(cid:218) operacji mo(cid:285)na po(cid:239)(cid:200)czy(cid:202) w (cid:239)a(cid:241)cuch. Dalej pokazu- jemy kilka przyk(cid:239)adów zastosowania metody groupby. Pogrupowanie obserwacji wed(cid:239)ug war- to(cid:258)ci docelowej (etykiety) pozwala ustali(cid:202) ró(cid:285)nice mi(cid:218)dzy (cid:258)rednimi z grup i wariancje w po- szczególnych grupach. Wej(cid:258)cie: grouped_targets_mean = iris.groupby([ target ]).mean() grouped_targets_mean Wyj(cid:258)cie: Wej(cid:258)cie: grouped_targets_var = iris.groupby([ target ]).var() grouped_targets_var Wyj(cid:258)cie: 76 Poleć książkęKup książkę Rozdzia(cid:225) 2. • Przekszta(cid:225)canie danych Je(cid:258)li pó(cid:283)niej zechcesz posortowa(cid:202) obserwacje za pomoc(cid:200) funkcji, mo(cid:285)esz zastosowa(cid:202) metod(cid:218) .sort_index(): Wej(cid:258)cie: iris.sort_index(by= sepal_length ).head() Wyj(cid:258)cie: Je(cid:285)eli zbiór danych zawiera szeregi czasowe (na przyk(cid:239)ad z liczbowymi warto(cid:258)ciami docelo- wymi) i chcesz zastosowa(cid:202) do nich operacj(cid:218) rolling (poniewa(cid:285) w danych wyst(cid:218)puje szum), mo(cid:285)esz zrobi(cid:202) to tak: Wej(cid:258)cie: smooth_time_series = pd.rolling_mean(time_series, 5) W ten sposób obliczana jest (cid:258)rednia krocz(cid:200)ca warto(cid:258)ci. Mo(cid:285)esz te(cid:285) zastosowa(cid:202) nast(cid:218)puj(cid:200)ce polecenie: Wej(cid:258)cie: median_time_series = pd.rolling_median(time_series, 5) W ten sposób obliczana jest mediana krocz(cid:200)ca. W obu sytuacjach uwzgl(cid:218)dniane okno obej- muje pi(cid:218)(cid:202) obserwacji. Ogólniejsza metoda apply() z biblioteki pandas pozwala wykonywa(cid:202) dowolne operacje na wierszach lub kolumnach. Nale(cid:285)y j(cid:200) wywo(cid:239)ywa(cid:202) bezpo(cid:258)rednio dla obiektów typu DataFrame. Pierwszym argumentem tej metody jest funkcja, która ma by(cid:202) wywo(cid:239)ywana dla wierszy lub kolumn. Drugi argument okre(cid:258)la o(cid:258), do której stosowana jest ta funkcja. Zauwa(cid:285), (cid:285)e mo(cid:285)na tu stosowa(cid:202) funkcje wbudowane, biblioteczne, lambdy i dowolne funkcje zdefiniowane przez u(cid:285)ytkownika. W ramach przyk(cid:239)adu ilustruj(cid:200)cego t(cid:218) daj(cid:200)c(cid:200) du(cid:285)e mo(cid:285)liwo(cid:258)ci technik(cid:218) spróbujmy zliczy(cid:202) nie- zerowe elementy z ka(cid:285)dego wiersza. Za pomoc(cid:200) metody apply jest to proste: Wej(cid:258)cie: iris.apply(np.count_nonzero, axis=1).head() Wyj(cid:258)cie: 0 5 1 5 2 5 3 5 4 5 dtype: int64 77 Poleć książkęKup książkę Python. Podstawy nauki o danych Aby ustali(cid:202) liczb(cid:218) niezerowych elementów dla cech (czyli dla kolumn), wystarczy zmieni(cid:202) warto(cid:258)(cid:202) drugiego argumentu na 0: Wej(cid:258)cie: iris.apply(np.count_nonzero, axis=0) Wyj(cid:258)cie: sepal_length 150 sepal_width 150 petal_length 150 petal_width 150 target 150 dtype: int64 Aby zastosowa(cid:202) funkcj(cid:218) do elementów, nale(cid:285)y wywo(cid:239)a(cid:202) metod(cid:218) applymap() dla obiektu typu DataFrame. Wtedy podawany jest tylko jeden argument — stosowana funkcja. Za(cid:239)ó(cid:285)my, (cid:285)e chcesz ustali(cid:202) d(cid:239)ugo(cid:258)(cid:202) (cid:239)a(cid:241)cuchów znaków z poszczególnych komórek. Aby uzyska(cid:202) t(cid:218) warto(cid:258)(cid:202), najpierw trzeba zrzutowa(cid:202) zawarto(cid:258)(cid:202) ka(cid:285)dej komórki na (cid:239)a(cid:241)cuch znaków, a nast(cid:218)pnie ustali(cid:202) d(cid:239)ugo(cid:258)(cid:202) (cid:239)a(cid:241)cucha. Za pomoc(cid:200) metody applymap mo(cid:285)na to zrobi(cid:202) w bardzo prosty sposób: Wej(cid:258)cie: iris.applymap(lambda el:len(str(el))).head() Wyj(cid:258)cie: Wybieranie danych Ostatnie zagadnienie zwi(cid:200)zane z bibliotek(cid:200) pandas dotyczy wybierania danych. Zacznijmy od przyk(cid:239)adu. Mo(cid:285)e zetkn(cid:200)(cid:239)e(cid:258) si(cid:218) ju(cid:285) ze zbiorem danych obejmuj(cid:200)cym kolumn(cid:218) z indeksem. W jaki sposób poprawnie zaimportowa(cid:202) j(cid:200) za pomoc(cid:200) biblioteki pandas? I jak wykorzysta(cid:202) tak(cid:200) kolumn(cid:218) do uproszczenia sobie pracy? Pos(cid:239)u(cid:285)ymy si(cid:218) tu bardzo prostym zbiorem danych zawieraj(cid:200)cym kolumn(cid:218) z indeksem (z war- to(cid:258)ciami licznika, a nie z warto(cid:258)ciami cechy). Aby przyk(cid:239)ad by(cid:239) uniwersalny, indeks rozpoczyna si(cid:218) od warto(cid:258)ci 100. Tak wi(cid:218)c indeks wiersza 0 to 100: n,val1,val2,val3 100,10,10,C 101,10,20,C 102,10,30,B 103,10,40,B 104,10,50,A 78 Poleć książkęKup książkę Rozdzia(cid:225) 2. • Przekszta(cid:225)canie danych Gdy spróbujesz wczyta(cid:202) ten plik w standardowy sposób, pole n zostanie potraktowane jak cecha (kolumna). Samo w sobie nie jest to b(cid:239)(cid:218)dem, jednak nale(cid:285)y uwa(cid:285)a(cid:202), by nie zastosowa(cid:202) omy(cid:239)kowo indeksu jako cechy. Dlatego lepiej zapisa(cid:202) go oddzielnie. Je(cid:258)li indeks przypadkowo zostanie u(cid:285)yty na etapie uczenia (generowania modelu), mo(cid:285)e spowodowa(cid:202) „wyciek informacji”, co jest istotnym (cid:283)ród(cid:239)em b(cid:239)(cid:218)dów w uczeniu maszynowym. Je(cid:258)li indeks zawiera liczby losowe, nie wp(cid:239)ynie na skuteczno(cid:258)(cid:202) modelu. Je(cid:285)eli jednak obej- muje liczby porz(cid:200)dkowe, czas lub nawet elementy z informacjami (gdy okre(cid:258)lone przedzia(cid:239)y warto(cid:258)ci reprezentuj(cid:200) pozytywne skutki, a inne przedzia(cid:239)y oznaczaj(cid:200) skutki negatywne), mo(cid:285)e powodowa(cid:202) w(cid:239)(cid:200)czenie w model danych uzyskanych w wyniku „wycieku informacji”. Takie informacje nie b(cid:218)d(cid:200) dost(cid:218)pne w trakcie stosowania modelu do nowych danych (poniewa(cid:285) indeks nie b(cid:218)dzie istnia(cid:239)). Wej(cid:258)cie: import pandas as pd Wej(cid:258)cie: dataset = pd.read_csv( a_selection_example_1.csv ) dataset Wyj(cid:258)cie: Dlatego gdy wczytujesz taki zbiór danych, mo(cid:285)esz okre(cid:258)li(cid:202), (cid:285)e n to kolumna z indeksem. Poniewa(cid:285) jest to pierwsza kolumna, mo(cid:285)na zastosowa(cid:202) nast(cid:218)puj(cid:200)ce polecenie: Wej(cid:258)cie: dataset = pd.read_csv( a_selection_example_1.csv , index_col=0) dataset Wyj(cid:258)cie: Tu po wczytaniu zbioru danych indeks jest poprawny. Dost(cid:218)p do warto(cid:258)ci komórek mo(cid:285)na teraz uzyska(cid:202) na kilka sposobów. Omawiamy je jeden po drugim. 79 Poleć książkęKup książkę Python. Podstawy nauki o danych Pierwsza technika polega na wskazaniu kolumny i potrzebnego wiersza (za pomoc(cid:200) jego indeksu). Aby pobra(cid:202) warto(cid:258)(cid:202) kolumny val3 z pi(cid:200)tego wiersza (o indeksie n=104), mo(cid:285)na wywo(cid:239)a(cid:202) na- st(cid:218)puj(cid:200)c(cid:200) instrukcj(cid:218): Wej(cid:258)cie: dataset[ val3 ][104] Wyj(cid:258)cie: A Zachowaj staranno(cid:258)(cid:202), poniewa(cid:285) nie jest to macierz, a nasuwa(cid:202) si(cid:218) mo(cid:285)e podanie najpierw wier- sza, a dopiero potem kolumny. Pami(cid:218)taj, (cid:285)e u(cid:285)ywany jest obiekt typu DataFrame, gdzie operator [] najpierw okre(cid:258)la kolumn(cid:218), a dopiero potem element w uzyskanym obiekcie typu Series. Podobnie wygl(cid:200)da dost(cid:218)p do danych za pomoc(cid:200) metody .loc(): Wej(cid:258)cie: dataset.loc[104, val3 ] Wyj(cid:258)cie: A Tu najpierw nale(cid:285)y poda(cid:202) indeks, a nast(cid:218)pnie potrzebne kolumny. Ta technika dzia(cid:239)a tak jak metoda .ix(), która jednak funkcjonuje dla indeksów dowolnego rodzaju (etykiet i pozycji) oraz zapewnia wi(cid:218)cej mo(cid:285)liwo(cid:258)ci. Zauwa(cid:285), (cid:285)e metoda ix() musi odgadn(cid:200)(cid:202), jakiego rodzaju indeks podajesz. Dlatego je(cid:258)li nie chcesz mie- sza(cid:202) etykiet z indeksami pozycyjnymi, stosuj metody loc i iloc, zapewniaj(cid:200)ce bardziej ustrukturyzowa- ne podej(cid:258)cie. Wej(cid:258)cie: dataset.ix[104, val3 ] Wyj(cid:258)cie: A Wej(cid:258)cie: dataset.ix[104, 2] Wyj(cid:258)cie: A Istnieje te(cid:285) w pe(cid:239)ni zoptymalizowana funkcja iloc(), która pozwala okre(cid:258)li(cid:202) pozycj(cid:218) w sposób typowy dla macierzy. Aby wskaza(cid:202) komórk(cid:218), nale(cid:285)y najpierw poda(cid:202) numer wiersza, a nast(cid:218)p- nie numer kolumny: Wej(cid:258)cie: dataset.iloc[4, 2] Wyj(cid:258)cie: A Pobieranie podmacierzy to bardzo intuicyjna operacja. Wystarczy okre(cid:258)li(cid:202) list(cid:218) indeksów za- miast warto(cid:258)ci skalarnych: Wej(cid:258)cie: dataset[[ val3 , val2 ]][0:2] Jest to odpowiednik poni(cid:285)szej instrukcji: Wej(cid:258)cie: dataset.loc[range(100, 102), [ val3 , val2 ]] Nast(cid:218)pna instrukcja dzia(cid:239)a tak samo: Wej(cid:258)cie: dataset.ix[range(100, 102), [ val3 , val2 ]] 80 Poleć książkęKup książkę Rozdzia(cid:225) 2. • Przekszta(cid:225)canie danych To polecenie te(cid:285) daje ten sam wynik: Wej(cid:258)cie: dataset.ix[range(100, 102), [2, 1]] Podobnie jak to: Wej(cid:258)cie: dataset.iloc[range(2), [2,1]] Wszystkie te instrukcje zwracaj(cid:200) nast(cid:218)puj(cid:200)cy obiekt typu DataFrame: Wyj(cid:258)cie: Praca z danymi kategorialnymi i tekstowymi Zwykle b(cid:218)dziesz pracowa(cid:239) z dwoma podstawowymi rodzajami danych: kategorialnymi i licz- bowymi. Dane liczbowe, okre(cid:258)laj(cid:200)ce na przyk(cid:239)ad temperatur(cid:218), kwot(cid:218) pieni(cid:218)dzy, dni u(cid:285)ytko- wania lub numer domu, mog(cid:200) mie(cid:202) posta(cid:202) liczb zmiennoprzecinkowych (1,0, –2,3, 99,99 itd.) lub ca(cid:239)kowitych (–3, 9, 0, 1 itd.). Ka(cid:285)da warto(cid:258)(cid:202), jak(cid:200) takie dane mog(cid:200) przyj(cid:200)(cid:202), pozostaje w bez- po(cid:258)redniej relacji z innymi warto(cid:258)ciami. Jest tak, poniewa(cid:285) takie dane s(cid:200) porównywalne. Mo(cid:285)esz wi(cid:218)c stwierdzi(cid:202), (cid:285)e cecha o warto(cid:258)ci 2,0 jest wi(cid:218)ksza (dwukrotnie) od cechy o warto(cid:258)ci 1,0. Dane tego rodzaju s(cid:200) bardzo dobrze zdefiniowane i (cid:239)atwe do zrozumienia. Dost(cid:218)pne s(cid:200) dla nich operatory binarne, na przyk(cid:239)ad „równa si(cid:218)”, „wi(cid:218)kszy ni(cid:285)” i „mniejszy ni(cid:285)”. Bardzo wa(cid:285)nym aspektem danych liczbowych jest to, (cid:285)e sensowne s(cid:200) dla nich podstawowe statystyki (na przyk(cid:239)ad (cid:258)rednie). Dla pozosta(cid:239)ych kategorii nie jest to prawda, dlatego stanowi istotn(cid:200) cech(cid:218) da- nych tego rodzaju. Innym rodzajem danych, z jakimi mo(cid:285)esz si(cid:218) zetkn(cid:200)(cid:202) w pracy, s(cid:200) dane kategorialne (nazywa- ne te(cid:285) nominalnymi). Dane kategorialne reprezentuj(cid:200) atrybut, którego nie mo(cid:285)na zmierzy(cid:202), i przyjmuj(cid:200) warto(cid:258)ci (nazywane czasem poziomami) ze sko(cid:241)czonego lub niesko(cid:241)czonego zbioru. Na przyk(cid:239)ad pogoda to cecha kategorialna, poniewa(cid:285) przyjmuje warto(cid:258)ci z nieci(cid:200)g(cid:239)ego zbioru (sunny, cloudy, snowy, rainy, foggy). Innymi przyk(cid:239)adami s(cid:200) cechy reprezentuj(cid:200)ce adresy URL, adresy IP, produkty z koszyka w sklepie internetowym, identyfikatory urz(cid:200)dze(cid:241) itd. Dla tych danych nie da si(cid:218) zdefiniowa(cid:202) operatorów „równa si(cid:218)”, „wi(cid:218)kszy ni(cid:285)” i „mniejszy ni(cid:285)”, dlatego te(cid:285) nie mo(cid:285)na ich uporz(cid:200)dkowa(cid:202). 81 Poleć książkęKup książkę Python. Podstawy nauki o danych Dodatkiem powi(cid:200)zanym zarówno z danymi kategorialnymi, jak i liczbowymi s(cid:200) warto(cid:258)ci lo- giczne. Mo(cid:285)na je traktowa(cid:202) i jako dane kategorialne (obecno(cid:258)(cid:202) lub brak cechy), i jako praw- dopodobie(cid:241)stwo wyst(cid:200)pienia danej cechy (co(cid:258) zosta(cid:239)o wy(cid:258)wietlone lub nie). Poniewa(cid:285) wiele algorytmów uczenia maszynowego nie przyjmuje kategorialnych danych wej(cid:258)ciowych, warto- (cid:258)ci logiczne cz(cid:218)sto s(cid:239)u(cid:285)(cid:200) do kodowania cech kategorialnych jako warto(cid:258)ci liczbowych. Wró(cid:202)my do przyk(cid:239)adu dotycz(cid:200)cego pogody. Je(cid:258)li chcesz odwzorowa(cid:202) okre(cid:258)laj(cid:200)c(cid:200) pogod(cid:218) cech(cid:218) przyjmuj(cid:200)c(cid:200) warto(cid:258)ci ze zbioru [sunny, cloudy, snowy, rainy, foggy] i zakodowa(cid:202) te warto(cid:258)ci jako cechy binarne, utwórz pi(cid:218)(cid:202) cech o warto(cid:258)ciach True i False (po jednej cesze dla ka(cid:285)dego poziomu cechy kategorialnej). Teraz odwzorowanie b(cid:218)dzie proste: Categorical_feature = sunny binary_features = [1, 0, 0, 0, 0] Categorical_feature = cloudy binary_features = [0, 1, 0, 0, 0] Categorical_feature = snowy binary_features = [0, 0, 1, 0, 0] Categorical_feature = rainy binary_features = [0, 0, 0, 1, 0] Categorical_feature = foggy binary_features = [0, 0, 0, 0, 1] Tylko jedna binarna cecha informuje o wyst(cid:218)powaniu okre(cid:258)lonej cechy kategorialnej. Pozosta(cid:239)e warto(cid:258)ci s(cid:200) równe 0. Ten prosty krok pozwala przej(cid:258)(cid:202) od (cid:258)wiata kategorialnego do liczbowego. Odbywa si(cid:218) to kosztem wi(cid:218)kszego zapotrzebowania na pami(cid:218)(cid:202) i dodatkowych oblicze(cid:241). Zamiast jednej cechy jest ich teraz pi(cid:218)(cid:202). Ogólnie zamiast jednej cechy kategorialnej o N poziomach trzeba utworzy(cid:202) N cech przyjmuj(cid:200)cych dwie warto(cid:258)ci liczbowe (1 lub 0). Ta operacja to ko- dowanie zero-jedynkowe lub, bardziej technicznie, binaryzacja cech nominalnych. W wykonywaniu tej operacji pomaga biblioteka pandas, pozwalaj(cid:2
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Python. Podstawy nauki o danych. Wydanie II
Autor:
,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: