Projekt okładki i stron tytułowych Joanna Andryjowicz

Wydawca Edyta Kawala

Redaktor prowadzący Jolanta Kowalczuk

Redaktor Irena Puchalska

Koordynator produkcji Anna Bączkowska

Recenzent dr hab. Tadeusz Wieczorek, Politechnika Śląska

Skład wersji elektronicznej na zlecenie Wydawnictwa Naukowego PWN
Karol Ossowski/Woblink

Zastrzeżonych nazw firm i produktów użyto w książce wyłącznie w celu identyfikacji.

Książka, którą nabyłeś, jest dziełem twórcy i wydawcy. Prosimy, abyś przestrzegał praw, jakie im przysługują. Jej zawartość możesz udostępnić nieodpłatnie osobom bliskim lub osobiście znanym. Ale nie publikuj jej w internecie. Jeśli cytujesz jej fragmenty, nie zmieniaj ich treści i koniecznie zaznacz, czyje to dzieło. A kopiując jej część, rób to jedynie na użytek osobisty.

Szanujmy cudzą własność i prawo.
Więcej na www.legalnakultura.pl
Polska Izba Książki

Copyright © by Wydawnictwo Naukowe PWN SA
Warszawa 2019

ISBN 978-83-01-20784-7

eBook został przygotowany na podstawie wydania papierowego z 2019 r., (wyd. I)
Warszawa 2019

Wydawnictwo Naukowe PWN SA
02-460 Warszawa, ul. Gottlieba Daimlera 2
tel. 22 69 54 321, faks 22 69 54 288
infolinia 801 33 33 88
e-mail: pwn@pwn.com.pl; reklama@pwn.pl
www.pwn.pl

Patroni medialni:

Dziękuję dr Tomaszowi Cieplakowi i Andrzejowi Kukule za cenne uwagi i poprawki. Szczególne podziękowania należą się profesorowi Tadeuszowi Wieczorkowi za recenzję książki.

Wszystkie błędy w książce są moje.

Marcin Szeliga

Celem autora było napisanie praktycznego przewodnika łączącego teorię z praktyką. Na rynku jest niewiele tytułów polskojęzycznych, które reprezentują takie podejście do problemu, ilustrując opisywane zagadnienia praktycznymi przykładami. Jest to na pewno najpełniejsze ujęcie problematyki uczenia maszynowego z praktycznego punktu widzenia, z jakim spotkał się recenzent. Opisano najważniejsze problemy uczenia maszynowego na kilkunastu przykładach. Dobór przykładów i ich układ jest dobrze uzasadniony, gdyż omawianie każdego przykładu jest okazją do wyjaśnienia określonych zagadnień związanych z uczeniem maszynowym.
Na podkreślenie również zasługuje, i jest to naprawdę rzadkie, że książka została poszerzona o wiele przykładów możliwych do analizy wraz z danymi wejściowymi. W tekście książki zostały opisane tylko wybrane fragmenty kodu użytego do ilustracji omawianych zagadnień. Kompletną wersję przykładów razem z użytymi danymi można pobrać ze strony Wydawnictwa, a ostatnią wersję przykładów z serwisu Github.

***

Książka napisana jest dobrze, poprawnym językiem i w sposób przejrzysty. Zaproponowany zestaw problemów obejmuje całość tematyki, którą można scharakteryzować jako przewodnik po stosowanych obecnie na świecie systemach uczenia maszynowego, z wykorzystaniem określonego środowiska obliczeniowego i prezentacyjnego (MS SQL Server i język R, język Phyton).

Dlatego w konkluzji stwierdzam, że proponowana książka autorstwa Marcina Szeligi, Praktyczne uczenie maszynowe, jest ważnym i wartościowym podręcznikiem informatyki stosowanej. Będzie on przydatny zarówno dla studentów kierunków informatycznych, zarządzania i marketingu, ekonomii i wielu kierunków ścisłych, jak i dla osób zawodowo pracujących w tych dziedzinach.

prof. zw. dr hab. Tadeusz Wieczorek

Kierownik Katedry Informatyki Przemysłowej Politechniki Śląskiej

Dane to nowa ropa.

Clive Humby, Data Scientist w Starcount, 2006

Sztuczna inteligencja to nowa energia elektryczna.

Andrew Ng, Data Scientist w Baidu, założyciel Coursera, profesor na uniwersytecie Stanforda, 2016

Od autora

W ciągu ostatnich 50 lat wydano setki prac poświęconych uczeniu maszynowemu. W większości z nich skoncentrowano się na zagadnieniach teoretycznych, takich jak statystyka, rachunek prawdopodobieństwa oraz budowa i zasada działania algorytmów uczenia maszynowego. Zawarte w tych książkach przykłady albo są opisowe, albo zawierają bardzo proste, w praktyce nieużywane fragmenty kodu. Pozostałe to pozycje czysto praktyczne, przedstawiające sposób budowania konkretnych modeli uczenia maszynowego, w których nie znajdziemy wyjaśnienia działania zastosowanych algorytmów i wynikających z tych zasad ogólniejszych wskazówek.

Książek łączących teorię z praktyką jest niewiele, szczególnie polskojęzycznych. Mam swój pewien wkład w ich liczbę – najpierw napisałem prace o eksploracji danych z użyciem usług analitycznych serwera SQL [1], [2], a następnie o uczeniu maszynowym w chmurze [3]. Zdobywane w krajowych i międzynarodowych projektach doświadczenie, a także rosnąca dostępność coraz łatwiejszych w użyciu i jednocześnie coraz bardziej funkcjonalnych narzędzi uczenia maszynowego pozwoliły mi napisać tę książkę.

Opisałem w niej rozwiązania kilkunastu typowych problemów, takich jak prognozowanie zysków, optymalizacja kampanii marketingowej, proaktywna konserwacja sprzętu czy oceny ryzyka kredytowego. Ich układ jest celowy – każdy przykład jest okazją do wyjaśnienia określonych zagadnień, zaczynając od narzędzi, przez podstawy uczenia maszynowego, sposoby oceny jakości danych i ich przygotowania do dalszej analizy, zasady tworzenia modeli uczenia maszynowego i ich optymalizacji, po wskazówki dotyczące wdrożenia gotowych modeli do produkcji. Wszystkie przykłady są prowadzone według powszechnie stosowanej metodyki CRISP-DM (CRoss Industry Standard Process for Data Mining) [4].

Chociaż termin sztuczna inteligencja nie występuje w tytule, na wstępie wyjaśniam, czym jest sztuczna inteligencja, jak doszło do sytuacji, w której sztuczna inteligencja zmienia nasz świat, i jaki jest jej związek z uczeniem maszynowym.

Marcin Szeliga

Microsoft Most Valuable Professional
w kategorii Artificial Intelligence,
pracownik naukowy Wyższej Szkoły Bankowej
w Poznaniu, Wydział Zamiejscowy w Chorzowie

Sztuczna inteligencja

Ilość cyfrowych danych generowanych każdego dnia jest niewyobrażalna – szacuje się ją na 3 tryliony bajtów i liczba ta z dnia na dzień rośnie. Dla porównania, mózg człowieka składa się z około 90 miliardów neuronów. Oznacza to, że codziennie zapisujemy cyfrowo dane równe mózgom 330 mln ludzi reprezentowanych sumą ich neuronów.

Szybkość, z jaką przeszliśmy od mierzenia wielkości danych w kilobajtach (10³) do megabajtów (10⁶), gigabajtów (10⁹), terabajtów (10¹²) i jottabajtów(10²⁴), jest niewiarygodna. Każdego roku generujemy więcej danych niż we wszystkich poprzednich latach od początku historii naszego gatunku. Ten wzrost zawdzięczamy przede wszystkim urządzeniom mobilnym i wszechobecnym, podłączonym do sieci czujnikom.

Jednak dane jako takie są bezwartościowe. To zawarte w nich informacje są cenne. Algorytmy uczenia maszynowego automatycznie wykrywają wzorce ukryte w danych i zapisują je w postaci modeli. Tak nauczone modele są mózgami inteligentnych maszyn.

Dostępne w ogromnych ilościach dane uzupełnione o techniczne możliwości ich przetwarzania doprowadziły do bezprecedensowego rozwoju sztucznej inteligencji (ang. artificial intelligence, AI) – nie tylko do przełomowych badań nad algorytmami uczenia maszynowego, lecz także do coraz powszechniejszych zastosowań inteligentnych maszyn w najróżniejszych dziedzinach naszego życia. Od 2012 r. rynek AI – mierzony wartością globalnych inwestycji oraz wartością kontraktów – podwaja się co dwa lata: wartość ujawnionych inwestycji w 2012 r. wyniosła 590 mln USD przy sumarycznej wartości kontraktów wynoszącej 160 mln USD; w 2017 r. inwestycje przekroczyły 9 miliardów USD, a wartość kontraktów – 900 mln USD.

Historia zna kilka przykładów tak głębokich zmian cywilizacyjnych i nazywa je rewolucjami przemysłowymi. Wszystkie dotychczasowe rewolucje przemysłowe były wywołane odkryciem nowej technologii¹:

pierwszą zawdzięczamy zastosowaniu pary wodnej w przemyśle, przede wszystkim w transporcie kolejowym (XVIII w.);

drugą – użyciu na szeroką skalę elektryczności (początek XX w.);

trzecią (nazwaną naukowo-techniczną) – integracji przemysłu z informatyką, co przyniosło cyfryzację procesów produkcyjnych (lata 70. XX w.).

Dzisiaj jesteśmy świadkami czwartej rewolucji przemysłowej, którą zawdzięczamy stosowaniu na coraz szerszą skalę sztucznej inteligencji i która, tak jak wszystkie wcześniejsze rewolucje przemysłowe, całkowicie zmienia świat, w którym żyjemy.

Czym jest sztuczna inteligencja? Inteligencję przypisuje się ludziom oraz zwierzętom, jednak nawet użyty wyłącznie w odniesieniu do ludzi termin ten jest niejednoznaczny. Psychologowie definiują inteligencję m.in. jako zdolność rozwiązywania problemów (Jean Piaget), umiejętność dostrzegania zależności (Charles Spearman) lub jako zdolność uczenia się (George Ferguson). Różne są też poglądy na temat charakteru inteligencji. Gdyby za jej cechę zasadniczą uznać zdolność do twórczego, a nie tylko mechanicznego przetwarzania informacji, za inteligentnych należałoby uznać tylko niektórych ludzi [39]. Jednocześnie, jeżeli przyjmiemy, że inteligencja polega na zdolności do przetwarzania informacji na poziomie abstrakcyjnych idei, za obdarzonych inteligencją można uznać nie tylko ludzi, lecz także zwierzęta i maszyny.

Przyjęcie takiej definicji inteligencji pozwala określić sztuczną inteligencję jako dziedzinę zajmującą się tworzeniem sztucznych, obdarzonych inteligencją maszyn. Prekursor AI, Alan M. Turing, w swojej pionierskiej, wydanej w 1950 r. pracy Computing Machinery and Intelligence sformułował test, który miał odpowiedzieć na pytanie: Kiedy maszyna zachowuje się w sposób inteligentny? [5]. Według Turinga maszynę można uznać za inteligentną, gdy człowiek tester nie jest w stanie odróżnić odpowiedzi maszyny od odpowiedzi człowieka. Pomysł Turinga zmienił podejście do badań nad sztuczną inteligencją – filozoficzne pytanie o istotę inteligencji zostało zastąpione pragmatyczną oceną skutków bycia inteligentnym.

Aby zdać pełny test Turinga, maszyna powinna mieć zdolność do przetwarzania języka naturalnego, uczenia się i stosowania zdobytej wiedzy, wnioskowania oraz do rozpoznawania obrazów i poruszania się, w tym do przemieszczania obiektów – jak do tej pory żadnej maszynie się to nie udało. Sam test jest zresztą niesformalizowany i od dawna nie jest stosowany w praktyce.

Narodziny sztucznej inteligencji jako dyscypliny naukowej datuje się na 1956 r. Uczestnicy warsztatu, w którym uczestniczył też twórca terminu sztuczna inteligencja – John McCarthy, sformułowali wtedy hipotezę, według której każdy aspekt uczenia się, a także każda inna własność inteligencji, mogą być opisane tak precyzyjnie, że możliwe będzie zbudowanie maszyny zdolnej do ich symulacji [6]. Efektem przyjęcia tej hipotezy są nadal prowadzone badania nad opracowanymi wtedy pierwszymi wersjami algorytmów uczenia maszynowego, takich jak perceptron czy drzewa decyzyjne.

Rozczarowanie wynikające m.in. z niespełnienia nadmiernie optymistycznych zapowiedzi przyszło w 1974 r. Nie tylko systemy sztucznej inteligencji nie znalazły praktycznych zastosowań (czego powodem była niewystarczająca moc obliczeniowa ówczesnych komputerów), lecz pojawiły się także poważne teoretyczne wątpliwości co do możliwości rozwiązywania przez nie różnych zadań, bez konieczności dostosowywania danych treningowych do konkretnych problemów.

Drugą falę rozwoju badań nad sztuczną inteligencją, przypadającą na lata 1980–1987, zawdzięczamy nadziejom pokładanym w systemach eksperckich. System ekspercki jest systemem, który automatycznie uczy się rozwiązywać problemy na podstawie podanych mu reguł. Początkowo do działania wymagały one specjalistycznych i drogich komputerów, co przyczyniło się do kolejnego kryzysu. Udało się go przezwyciężyć w 1993 r., demonstrując praktyczne zastosowania systemów eksperckich działających już na standardowych komputerach, choć wielokrotnie szybszych od typowych serwerów z tego czasu. Największym sukcesem systemów eksperckich było pokonanie w 1997 r. przez system Deep Blue (superkomputer ze specjalnie zaprojektowanymi układami scalonymi VLSI do realizacji algorytmu przeszukiwania alfa-beta) ówczesnego szachowego mistrza świata Garriego Kasparova. W rewanżowym meczu szachowym komputer wygrał z nim 3½ do 2½ (pierwszy, rozegrany rok wcześniej mecz Kasparov wygrał z poprzednią wersją komputera Deep Blue 4 do 2).

Uczenie komputerów szczegółowych reguł postępowania okazało się jednak niesłychanie skomplikowane. Gra w szachy rządzi się niewielką liczbą dobrze ustalonych i niezmiennych reguł, więc Deep Blue, analizując 200 mln pozycji na sekundę, był w stanie sprawdzić wszystkie możliwe kombinacje kilkunastu kolejnych ruchów. Ale takie podejście nie pozwalało rozwiązywać problemów rządzących się bardziej skomplikowanymi, a tym bardziej nieznanymi regułami.

W tym samym roku, gdy Deep Blue wygrał z Kasparovem, Tom Mitchell wydał książkę zatytułowaną Machine Learning, w której podał definicję uczenia maszynowego: Program komputerowy uczy się z doświadczenia E w odniesieniu do pewnej klasy zadań T i miary wydajności P, jeśli jego skuteczność w zadaniach w T, mierzona wydajnością P, poprawia się wraz z doświadczeniem E [7]. Szybko okazało się, że podejście polegające na tym, że to komputer sam ma znaleźć sposób rozwiązywania problemów na podstawie danych historycznych, pozwala tworzyć systemy sztucznej inteligencji mające praktyczne zastosowanie w wielu dziedzinach życia. Rozpoczęła się trzecia fala rozwoju AI – etap uczenia maszynowego. Wiele używanych dzisiaj systemów sztucznej inteligencji należy do tej właśnie, opisanej w książce, kategorii.

Algorytmy uczenia maszynowego trenuje się na danych historycznych, czyli na przykładach. Podczas uczenia algorytm wykrywa ukryte w tych przykładach wzorce i na ich podstawie tworzy model uczenia maszynowego. Taki model może być następnie używany do predykcji, czyli uzupełniania brakujących danych o nowych, nieznajdujących się w treningowym zbiorze danych obserwacji. Na przykład model nauczony na danych sprzedażowych może przewidzieć przyszłą wartość sprzedaży, model nauczony na historiach chorób pacjentów może oceniać postępy leczenia nowych pacjentów, a model nauczony na danych opisujących działanie sieci wodociągowej – przewidywać zużycie wody, wykrywać próby kradzieży albo znajdować bieżące i przyszłe awarie wodociągów.

Skoro uczenie maszynowe polega na wykrywaniu ukrytych w przykładach treningowych wzorców, to im większą ilością danych dysponujemy, tym lepsze osiągniemy rezultaty. Jednak wraz ze wzrostem ilości danych treningowych rosną również wymagania obliczeniowe. Podam prosty przykład – zdjęcie zrobione w rozdzielczości 800 × 600 zawiera prawie 1,5 mln liczb reprezentujących wartości RGB określających kolory poszczególnych pikseli, a jest to rozdzielczość mniejsza niż typowa dla współczesnych zdjęć. Problem wydajności obliczeń rozwiązały akceleratory graficzne ogólnego zastosowania (ang. general-purpose computing on graphics processing units, GPGPU) [40]. Przewagą GPU nad CPU jest ich równoległa architektura pozwalająca na wykonywanie w ciągu sekundy tysięcy razy większej liczby prostych operacji matematycznych, takich jak mnożenie macierzy. Trzecim, równie ważnym czynnikiem, który przyczynił się do kolejnego rozkwitu badań nad sztuczną inteligencją, było opracowanie nowych algorytmów pozwalających maszynom efektywnie uczyć się nie tylko na podstawie danych treningowych, lecz przede wszystkim na podstawie samodzielnie wyodrębnionych z tych danych abstrakcyjnych właściwości. Rozpoczęła się trwająca do dziś era głębokiego uczenia maszynowego (ang. deep learning, DL), w której sztuczna inteligencja uczy się na podstawie automatycznie wykrywanych abstrakcyjnych cech, z wykorzystaniem takich algorytmów uczenia maszynowego jak konwolucyjne sieci neuronowe i rekurencyjne sieci neuronowe [41].

Na tym etapie sztuczna inteligencja szybko dogoniła, a następnie przegoniła ludzi w wybranych dziedzinach. Na przykład boty potrafią rozmawiać na zadane tematy, takie jak rezerwacja samolotu czy hotelu, a systemy rozpoznawania obrazów klasyfikować przedmioty widoczne na zdjęciach czy nagraniach wideo. Cechą charakterystyczną systemów głębokiego uczenia maszynowego jest zdolność do rozwiązywania problemów, których pokonanie ludziom przychodzi stosunkowo łatwo, natomiast maszyny wcześniej nie potrafiły sobie z nimi poradzić.

Maszyny nauczyły się przede wszystkim słyszeć i rozumieć zdania wypowiadane w takich językach jak angielski czy chiński. Już w 2012 r. procent popełnianych przez nie błędów (błędnie zrozumianych wypowiedzi) spadł poniżej 4%. W tym czasie maszyny potrafiły oprócz tego mówić, popełniając mniej błędów niż statystyczny człowiek. Pięć lat później maszyny nauczyły się tłumaczyć (na język chiński, a następnie angielski) jak ludzie.

Postęp w dziedzinie rozpoznawania obrazów również był imponujący. W 2012 r. system uczenia maszynowego prawidłowo rozpoznał 74% pokazanych mu przedmiotów. W następnym roku było to już 85% (ten wynik zawdzięczamy rozwojowi konwolucyjnych sieci neuronowych), a trzy lata później głęboka sieć neuronowa osiągnęła wynik 97% – o trzy procent lepszy od wyniku typowego człowieka.

Szybkość, z jaką AI jest w stanie nauczyć się nowych umiejętności, najlepiej pokazuje historia systemu AlphaGo. Ludzie doskonalą umiejętność gry w Go od stuleci. Tymczasem w 2015 r. AlphaGo wygrał 3:0 z trzykrotnym mistrzem Europy w Go Fan Hui. Rozegrany rok później w Seulu mecz (który obejrzało ponad 200 mln widzów) z Lee Sedolem, powszechnie uznawanym za najwybitniejszego gracza w Go ostatniego dziesięciolecia, AlphaGo wygrał 4 do 1. Co więcej, grał tak innowacyjnie, że w znaczący sposób wzbogacił gromadzoną przez stulecia wiedzę na temat tej gry. W lutym 2017 r. AlphaGo Master, udoskonalona wersja AlphaGo, wygrała 60 meczów pod rząd przeciwko światowej czołówce graczy Go, co pozwala uznać ją za najlepszego gracza Go w historii.

Systemy AlphaGo uczyły się gry w Go, analizując tysiące partii rozegranych przez zawodowych i amatorskich graczy. Zupełnie inaczej uczył się system AlphaGo Zero. W tym przypadku zastosowano metodę uczenia ze wzmacnianiem – komputer grał sam ze sobą, ucząc się na własnych błędach. Po trzech dniach takiej nauki przekroczył on poziom systemu AlphaGo z 2015 r., kiedy to AlphaGo wygrał z Fan Hui. 21 dni nauki wystarczyły do osiągnięcia poziomu AlphaGo Master z 2017 r., kiedy to system ten wygrał 60 meczów z najlepszymi graczami Go, w tym mistrzem Ke Jie. Po 40 dniach treningu AlphaGo Zero osiągnął poziom wyższy niż poziom wszystkich innych systemów AlphaGo, co pozwala go uznać za najlepszego gracza Go w tysiącletniej historii tej gry.

O książce

Model uczenia maszynowego z dużą dokładnością przewiduje postępy leczenia pacjentów – to jeden z wielu podobnych nagłówków prasy popularno-naukowej, znaleziony w czasopiśmie Nature podczas pisania tego wstępu [8]. Książka uczy, jak samodzielnie budować takie światowej klasy modele uczenia maszynowego i jak wdrażać gotowe modele do użycia.

Modele uczenia maszynowego mogą być używane do predykcji, opisywania wzorców ukrytych w danych (deskrypcji) oraz do kompresji i generowania danych (np. do generowania obrazów lub opisów sekwencji wideo). Książka koncentruje się na najpopularniejszych modelach predykcyjnych, czyli modelach stosujących wykryte w treningowych danych wzorce do uzupełniania brakujących danych o nowych przypadkach, niewidzianych przez model podczas treningu.

Dla kogo jest ta książka?

Rynek sztucznej inteligencji rośnie na tyle szybko, że specjalistów od przetwarzania danych ciągle brakuje. Inżynieria danych (ang. data science) to interdyscyplinarna wiedza, której opanowanie wymaga znajomości algebry, geometrii, statystyki, rachunku prawdopodobieństwa i algorytmiki, uzupełniona o praktyczną umiejętność programowania w przynajmniej dwóch z trzech najpopularniejszych językach danych: SQL, R lub Python. Co więcej, sztuczna inteligencja jest przedmiotem intensywnych badań naukowych i samo śledzenie postępów w tej dziedzinie wiąże się z regularnym (codziennym) dokształcaniem. Nic dziwnego, że inżynierowie danych są jednymi z najbardziej pożądanych i najlepiej wynagradzanych pracowników.

Zbudowanie modelu uczenia maszynowego wymaga:

specjalistycznej wiedzy z dziedziny, w ramach której projekt jest realizowany (np. medycyny czy logistyki transportu); prawie zawsze wymaga to wsparcia eksperta z danej dziedziny;

praktycznej znajomości statystki i umiejętności wizualizacji danych niezbędnej do oceny jakości danych;

praktycznej znajomości języka SQL, R lub Python niezbędnej do uporządkowania, wstępnego przygotowania i wzbogacenia danych;

zrozumienia zasad działania poszczególnych algorytmów uczenia maszynowego koniecznych do ich wyboru i optymalizacji (do czego przyda się z kolei znajomość algebry i geometrii);

użycia języka R lub Python do stworzenia, oceny, zoptymalizowania i wdrożenia do produkcji modeli eksploracji danych (do oceny jakości modeli ponownie przyda się znajomość statystyki uzupełniona o wiedzę z zakresu rachunku prawdopodobieństwa).

Książka jest adresowana do wszystkich, którzy chcieliby poznać lub udoskonalić swoją wiedzę z powyższych (z wyjątkiem pierwszego) obszarów. Tego typu książki mogą być przystępne, napisane językiem potocznym i ilustrowane praktycznymi przykładami lub dokładne – pełne precyzyjnych równań matematycznych. Z założenia książka ma być przystępna, co oznacza, że opisowe wyjaśnienia pozostawiają Czytelnikowi możliwość ich różnorodnego interpretowania. Problem ten starałem się rozwiązać, ilustrując opisywane zagadnienia praktycznymi przykładami, których samodzielne wykonanie powinno rozwiać ewentualne niejasności. Takie podejście ma tę dodatkową zaletę, że kładzie nacisk na cenniejsze od wiedzy teoretycznej umiejętności praktyczne [9].

Liczę, że dzięki temu trafię do szerokiego grona Czytelników i zarówno studenci kierunków informatycznych, jak również analitycy, programiści, administratorzy baz danych oraz statystycy znajdą w książce informacje, które pozwolą im opanować praktyczne umiejętności potrzebne do samodzielnego tworzenia systemów uczenia maszynowego. Na koniec dodam, że umiejętność czytania ze zrozumieniem kodu SQL, R i Python na pewno ułatwi lekturę książki.

Narzędzia

Zilustrowanie opisanych w książce zagadnień praktycznymi przykładami wymagało wyboru jakichś narzędzi. Wybór padł na serwer SQL Server 2019 i program Power BI Desktop, ponieważ:

oba te narzędzia są dostępne za darmo; edycja SQL Server Developer Edition ma pełne wsparcie dla opisanych w książce usług uczenia maszynowego i może być bezpłatnie używana do nauki oraz testów, jedynie produkcyjne wykorzystanie utworzonych modeli będzie wymagało zakupu odpowiedniej licencji; natomiast program Power BI Desktop jest całkowicie darmowy i może być wykorzystywany do dowolnych celów, również komercyjnych;

SQL Server może być zainstalowany w środowiskach Windows, Linux lub na platformie Docker;

SQL Server pozwala wydajnie przechowywać duże zbiory danych i przetwarzać je za pomocą języka SQL;

usługi uczenia maszynowego serwera SQL Server pozwalają tworzyć modele uczenia maszynowego przy użyciu języków R, Python lub Java;

integracja języków R, Python i Java z serwerem SQL Server wykracza poza prostą możliwość uruchamiania skryptów tych języków po stronie serwera i pozwala nie tylko wydajnie analizować dane, lecz także wdrażać gotowe modele uczenia maszynowego do użycia;

usługa Power BI i program Power BI Desktop są kompletnymi narzędziami do tworzenia samoobsługowych systemów BI; pozwalają one w prosty sposób pobrać dane z różnych źródeł, dowolnie je przekształcać, tworzyć rozbudowane modele biznesowe i interaktywne, rozbudowane wizualizacje;

agencja Gartnera od wielu lat wysoko pozycjonuje oba te produkty w swoich corocznych raportach (rys. 1).

Rysunek 1. Po lewej stronie – raport dotyczący serwerów baz danych w zastosowaniach analitycznych (Gartner’s 2018 Magic Quadrant for Data Management Solutions for Analytics), po prawej – raport przedstawiający platformy BI (Gartner’s 2019 Magic Quadrant for Analytics and Business Intelligence Platforms)

Przykłady

W tekście książki zostały opisane tylko wybrane fragmenty kodu użytego do ilustracji omawianych zagadnień. Kompletną wersję przykładów razem z użytymi danymi można pobrać ze strony Wydawnictwa, a ich ostatnią wersję z serwisu Github. Całość repozytorium możecie Państwo pozyskać wieloma sposobami, jednym z nich jest zastosowanie narzędzia Git, dostępnego w systemach Windows oraz Linux. Przykładowo, korzystając z polecenia:

Pod adresem https://it.pwn.pl/Artykuly/Praktyczne-uczenie-maszynowe-materialy-dodatkowe znajdą Państwo archiwum ZIP z kopią bazy danych serwera SQL Server 2019 zawierającą oprócz tabel z danymi, widoki, procedury składowane i funkcje potrzebne do utworzenia opisywanych modeli uczenia maszynowego. Archiwum to zawiera również podzielone między foldery pliki z danymi, pliki Power BI Desktop i skrypty w językach R i Python, które pomogą Państwu wykonać opisywane projekty.

Pod adresem https://github.com/szelor/practical-machine-learning znajdą Państwo podzielone między foldery repozytorium zawierające pliki z danymi, pliki Power BI Desktop i skrypty w językach R i Python, które pomogą Wam wykonać opisywane projekty. W repozytorium nie znajdują jednak Państwo kopii przykładowej bazy danych, zbyt dużej, żeby można było ją tu udostępnić.

Najprościej jest skorzystać z gotowych plików i w ten sposób przekonać się, jak działają poszczególne modele, skorzystać z interaktywnych wizualizacji danych i spojrzeć na kolorowe wykresy w wysokiej rozdzielczości. Zachęcam jednak do wspólnego rozwoju tego projektu – każdy może modyfikować i rozbudowywać te skrypty, a następnie dzielić się wynikami swojej pracy z innymi.

Bibliografia

Do książki została dołączona bibliografia. Starałem się umieścić w niej jak najwięcej odnośników do ogólnodostępnych, elektronicznych wersji wymienionych w niej pozycji. Oczywiście, jeżeli jakaś pozycja nie jest dostępna za darmo, odnośnika do niej nie ma. Namawiam do zapoznania się z tymi artykułami i książkami – zarówno tymi klasycznymi, pochodzącymi z lat 70. XX w., jak i opisującymi wyniki najnowszych badań w obszarze uczenia maszynowego.

Konwencje i oznaczenia

W książce zostały zastosowane następujące konwencje do oznaczania różnych typów tekstu:

czcionką pogrubioną są wyróżnione nowe, istotne zagadnienia, na które czytelnik powinien zwrócić uwagę;

czcionką pochyłą są pisane nazwy własne w miejscach ich pierwszego użycia oraz angielskie odpowiedniki wprowadzanych pojęć;

czcionką stałej szerokości znaków są pisane przykładowe programy, pojawiające się w treści akapitu fragmenty programów (instrukcje, słowa kluczowe, modyfikatory itp.), polecenia wprowadzane z klawiatury, teksty wyświetlane na ekranie oraz adresy internetowe;

uwagi, wskazówki, ciekawostki, dobre rady lub ostrzeżenia są pisane

mniejszym stopniem pisma i wyróżnione znakiem widocznym obok.

Przeniesienie obliczeń jest tańsze niż przenoszenie danych.

Dokumentacja projektu Apache

Rozdział 1
Narzędzia

Tworzenie modeli uczenia maszynowego wymaga użycia odpowiednich narzędzi. Będziemy potrzebować wystarczająco wydajnego komputera z oprogramowaniem do przechowywania i przetwarzania danych, analizy statystycznej i wizualizacji danych, tworzenia i uczenia modeli oraz udostępnienia gotowych modeli użytkownikom.

Wszystkie opisane w książce projekty zostały utworzone na serwerze wyposażonym w osiem procesorów Intel Xeon E5-2673 2.4 GHz, 28 GB pamięci RAM i dysk SSD o wydajności 380 MB/s. Przykłady te jednak można odtworzyć na znacznie wolniejszym komputerze. Minimalne wymagania sprzętowe takiego komputera to 64-bitowy procesor taktowany zegarem o częstotliwości 2 GHz, 4 GB pamięci RAM i 15 GB wolnej przestrzeni na dysku, z czego 10 GB wymaga serwer SQL Server 2019. Chociaż w kilku projektach zostały użyte sztuczne sieci neuronowe, to ich architektura jest na tyle prosta, że nauczenie ich na przykładowych danych nie wymaga użycia akceleratorów graficznych.

Użyte oprogramowanie zostało zainstalowane w środowisku anglojęzycznego systemu operacyjnego Windows Server 2016 Datacenter. Czytelnicy mogą użyć innego, 64-bitowego systemu operacyjnego. Jeżeli jednak serwer baz danych i wszystkie narzędzia programistyczne będą zainstalowane na tym samym komputerze, wymagany jest system Windows 8 lub nowszy, Windows Server 2012 lub nowszy. Największą wydajność i stabilność uzyskamy w przypadku najnowszych wersji systemu Windows.

Do przechowywania i przetwarzania danych oraz do tworzenia modeli uczenia maszynowego i udostępniania ich użytkownikom został użyty serwer SQL Server 2019 Developer Edition. Wymaga on systemu Windows 8 lub nowszego, Windows Server 2012 lub nowszego, Red Hat Enterprise Linux 7.3+, SUSE Linux Enterprise Server v12 SP2 lub Ubuntu Linux 16.4. Serwer SQL Server 2019 można też zainstalować w środowisku Docker.

Przykładowa baza danych ML jest w wersji 2019, co oznacza, że jej odtworzenie we wcześniejszych wersjach serwera SQL nie jest możliwe. Część przykładowych danych jest dostępna w postaci plików tekstowych – w przypadku tych danych istnieje możliwość ich importu do wcześniejszych wersji serwera SQL. Pozostałe dane trzeba będzie samodzielnie wyeksportować z serwera SQL Server 2019.

Projekty utworzone w języku R można, po wprowadzeniu odpowiednich modyfikacji, uruchomić na wersjach 2016 i 2017 serwera SQL. Podobnie w przypadku projektów utworzonych w języku Python, po wprowadzeniu niezbędnych poprawek, jest możliwość ich uruchomienia w wersji 2017 serwera SQL Server. Systemy Windows lub Linux umożliwiają instalację użytych w książce narzędzi programistycznych w postaci R Studio Desktop i PyCharm Community Edition.

Do wizualizacji danych zostały użyte programy Power BI Desktop i SQL Server Data Tools. Do zainstalowania tych programów zalecane są systemy Windows 7 SP1 lub nowsze.

1.1.
Język Python

Guido van Rossum udostępnił kod źródłowy tworzonego przez siebie języka Python w 1991 r. Python od początku był rozwijany jako projekt otwarty i darmowy; jego pierwsza wersja została upubliczniona w styczniu 1994 r., druga – w październiku 2000 r., a trzecia – w grudniu 2008 r.

Python jest językiem programowania ogólnego przeznaczenia, którego mocną stroną jest duża liczba dodatkowych bibliotek, w tym bibliotek wspierających przetwarzanie i analizowanie danych. Rosnące zainteresowanie programistów sztuczną inteligencją spowodowało, że dzisiaj to Python, a nie R jest najczęściej używanym językiem uczenia maszynowego i de facto standardowym językiem głębokiego uczenia maszynowego.

Z usługą SQL Server Machine Learning Services jest instalowana dystrybucja Anaconda, zawierająca trzecią wersję języka Python, dostosowaną do zadań związanych z przetwarzaniem danych.

1.2.
Język R

Stworzony przez Rossa Ihaka i Roberta Gentlemana, profesorów uniwersytetu Auckland w Nowej Zelandii, język R, jest otwartym i darmowym językiem analizy danych. Jego pierwsza wersja została udostępniona publicznie w 1995 r., pięć lat później pojawiła się pierwsza stabilna wersja języka. Język ten szybko zyskał popularność na uczelniach całego świata, a dzisiaj jest najczęściej używanym narzędziem do statystycznej analizy danych i drugim pod względem popularności narzędziem używanym przez inżynierów danych różnych specjalności (rys. 1.1).

Rysunek 1.1. Chociaż najpopularniejszym narzędziem inżynierów danych jest Python, to ponad 90% statystyków używa języka R. Trzy języki opisane w książce, R, Python i SQL, dominują wśród narzędzi zawansowanej analizy danych. Po lewej stronie – wykres pokazujący popularność narzędzi używanych przez wszystkich specjalistów od danych, po prawej – przez statystyków [10]

Podstawową siłą języka R jest ponad 5-milionowa rzesza jego użytkowników. Wielu z nich udostępnia wyniki swoich prac w postaci pakietów publikowanych na stronie projektów The Comprehensive R Archive Network (https://cran.r-project.org/), Bioconductor (https://bioconductor.org/) oraz GitHub (https://github.com/). Efektem jest zbiór ponad 15 000 ogólnodostępnych bibliotek zawierających rozwiązania wszystkich typowych problemów, na jakie można trafić, pracując z danymi. Barry Rowlingson opublikował pod adresem https://www.maths.lancs.ac.uk/~rowlings/R/TaskViews/ tematyczną listę popularnych pakietów projektu CRAN.

Język R ma też swoje słabe strony: niską wydajność, brak skalowalności i brak zintegrowanych narzędzi do udostępniania wyników użytkownikom. Niska wydajność wynika z tego, że większość funkcji jest napisanych w języku R, a nie w języku niższego poziomu, i jest wykonywanych jednowątkowo. Brak skalowalności jest efektem tego, że przetwarzane dane oraz tymczasowe wyniki muszą znajdować się w pamięci operacyjnej, czyli ilość pamięci RAM komputera ogranicza wielkość analizowanych zbiorów danych. Natomiast brak integracji języka R z popularnymi programami do analizy danych powoduje problemy z udostępnieniem wyników analiz użytkownikom.

Problemy te zostały rozwiązane przez firmy interesujące się zastosowaniem języka R do analizy dużych zbiorów danych, w tym firmę Microsoft. Microsoft potraktował integrację swoich produktów z językiem R bardzo poważnie. Nie ograniczył się do możliwości uruchamiania instrukcji języka R po stronie serwera SQL Server i w programie Power BI Desktop, ale w 2015 r. rozpoczął zakrojony na szeroką skalę projekt integracji języka R ze swoimi produktami. W ramach tego projektu Microsoft dołączył do fundacji rozwijającej język R i przejął firmę Revolution Analytics – w 2015 r. wiodącego dostawcę oprogramowania i usług dla języka R. Produkty tej firmy, w tym biblioteka RevoScaleR i serwer Revolution R Enterprise, nadal są rozwijane w ramach projektów Microsoft R Open i Microsoft Machine Learning Server.

1.2.1.
Microsoft R Open (MRO)

Microsoft R Open jest otwartą i darmową dystrybucją języka R. MRO jest w 100% kompatybilny z oryginalnym językiem R, czyli wszystkie skrypty działające w Open R można uruchomić, bez jakichkolwiek zmian w kodzie, w dystrybucji MRO.

Microsoft R Open zawiera kilka udoskonaleń:

używa do obliczeń biblioteki Intel MKL Library; sprzętowa akceleracja operacji matematycznych pozwoliła wielokrotnie skrócić czas ich wykonywania – na przykład mnożenie macierzy wykonywane jest pięćdziesiąt razy szybciej, a analiza głównych składowych (PCA) – dwadzieścia razy szybciej; dodatkowe informacje na temat biblioteki Intel MKL Library są dostępne pod adresem https://www.sciencedirect.com/topics/computer-science/intel-mathkernel-library;

jako domyślnego repozytorium pakietów używa strony Microsoft R Application Network (https://mran.microsoft.com/); MRAN zawiera dzienne kopie strony projektu CRAN, czyli znajdziemy na niej wcześniejsze wersje wszystkich, dostępnych na stronie projektu CRAN, pakietów; dana wersja MRO (w czasie powstawania książki najnowszą wersją była wersja 3.5.1) domyślnie pobiera kopie pakietów z jednego, zawsze tego samego dnia;

zawiera kilka dodatkowych bibliotek do współpracy z systemami Big Data i produktami firmy Microsoft.

1.2.2.
Microsoft R Client (MRC)

Microsoft R Client zawiera wszystkie funkcjonalności Microsoft R Server, ale ich wydajność i skalowalność zostały ograniczone. Dane oraz tymczasowe wyniki ich przetwarzania muszą zmieścić się w pamięci RAM komputera, a stopień zrównoleglenia funkcji bibliotek RevoscaleR i MicrosoftML został ograniczony do dwóch wątków. MRC pozwala też zmienić kontekst wykonywania instrukcji języka R, co oznacza, że skrypty mogą zostać wykonane na serwerze SQL Server, Machine Learning Server lub Hadoop.

Ta wersja języka również jest darmowa. Jeżeli zainstalujemy edycję Standard serwera SQL, będziemy korzystać właśnie z wersji MRC. Microsoft R Client jest w pełni zgodny z dystrybucją Microsoft R Open.

1.2.3.
Microsoft Machine Learning Server (MLS)

Microsoft Machine Learning Server to wysokowydajny i skalowalny serwer języków R i Python. Jest on dostępny w kilku wersjach. Funkcjonalność wszystkich wersji serwera jest taka sama, ale każda z nich działa w innym środowisku: Windows, Linux albo Hadoop. Dostępna jest też wersja zintegrowana z edycją Enterprise serwerów SQL Server 2017 i 2019. Microsoft SQL Server Machine Learning Services, bo tak nazywa się ta wersja, została opisana w dalszej części rozdziału.

Microsoft Machine Learning Server (poprzednio nazywał się Microsoft R Server):

jest oparty na Microsoft R Open, co oznacza, że jest w 100% kompatybilny z oryginalną wersją języka R;

umożliwia wydajne przetwarzanie dużych zbiorów danych; dane są przetwarzane w blokach dowolnej wielkości, czyli wystarczy, żeby jednorazowo w pamięci RAM zmieścił się pojedynczy blok, a nie cały zbiór danych;

udostępnia specjalistyczne biblioteki do przetwarzania i analizowania danych oraz tworzenia modeli uczenia maszynowego (biblioteki RevoscaleR, revoscalepy i MicrosoftML); funkcje tych bibliotek są wykonywane wielowątkowo;

pozwala w prosty sposób wdrożyć modele do użycia – gotowe modele można opublikować jako zbiór bezstanowych interfejsów programistycznych (RESTful APIs) pozwalających w bezpieczny sposób zintegrować MLS z platformami Java, JavaScript i .NET.

1.3.
SQL Server 2019

Historia serwera SQL Server zaczyna się w 1989 r. Wtedy Microsoft zaprezentował pierwszą, opracowaną wspólnie z Sybase i przeznaczoną dla systemu operacyjnego OS/2 wersję tego serwera baz danych. Kolejne wersje serwera SQL dla systemu OS/2 miały swoje premiery w 1992 r. (SQL Server 4.2A) i 1993 r. (SQL Server 4.2B). Równolegle Microsoft rozpoczął tworzenie wersji SQL Server działającej w środowisku systemu Windows. Ich efektem był wydany w 1993 r. SQL Server 4.21. Dwa lata później pojawiła się wersja serwera SQL działająca w środowisku systemu Windows 95 (SQL Server 6.0), a rok później świat ujrzała ostatnia wersja serwera, będąca wynikiem współpracy obu firm, czyli SQL Server 6.5.

Opublikowana w 1998 r. wersja SQL Server 7.0 była efektem przepisania w całości kodu wcześniejszych wersji (do kodu C++) i jednocześnie wprowadzenia zasadniczych zmian w architekturze. Ta wersja zawierała też dodatkową usługę analityczną o nazwie SQL OLAP Services. Wersja SQL Server 2000, która ujrzała światło dzienne dwa lata później, zawierała już usługi SQL Server Integration Services, SQL Server Reporting Services, Notification Services, a usługa analityczna – uzupełniona o możliwości tworzenia modeli uczenia maszynowego – zmieniła nazwę na SQL Server Analysis Services. Następna wersja SQL Server 2005 wprowadziła m.in. integrację z platformą .NET, możliwość przełączenia baz do optymistycznego (bazującego na wersjonowaniu, a nie blokowaniu) modelu współbieżności, oraz możliwość podwajania bazy danych.

Kolejna wersja SQL Server 2008 rozpoczyna, wciąż trwający proces rozwijania tego serwera jako kompletnej platformy do przechowywania dowolnych (nie tylko tabelarycznych) danych i szeroko rozumianego ich przetwarzania. Wśród wielu nowości zawiera ona usługę zarządzania danymi wzorcowymi (Master Data Services), funkcje szyfrowania baz danych, możliwość kompresji danych, obsługę danych przestrzennych i hierarchicznych oraz możliwość przechowywania dużych obiektów binarnych bezpośrednio na dyskach. Wersja SQL Server 2012 to przede wszystkim funkcje zapewnienia ciągłej dostępności Always On SQL Server Failover Cluster Instances oraz Always On Availability Groups. W tej wersji zadebiutowały też (opisane w dalszej części rozdziału) indeks kolumnowy i związany z nim blokowy model przetwarzania danych oraz usługa poprawy jakości danych Data Quality Services. Udostępniona dwa lata później wersja SQL Server 2014 zawierała m.in. pamięciowe bazy danych i funkcje integracji z chmurą Azure. Długa lista nowości jest związana z wersją SQL Server 2016. Znajdują się na niej: integracja z językiem R, funkcja szyfrowania danych po stronie klienta AlwaysEncrypted, funkcja dynamicznego maskowania danych, możliwość nadawania użytkownikom uprawnień do wybranych wierszy, funkcja analizy czasu rzeczywistego będąca połączeniem indeksu kolumnowego i tabeli pamięciowej, funkcja PolyBase pozwalająca na integrację z systemami Big Data, tabele czasowe pozwalające na wersjonowanie danych, magazyn zapytań ułatwiający optymalizację wydajności czy usługa Stretch DB umożliwiająca niewidoczne dla aplikacji klienckich przeniesienie wybranych do SQL Azure. Zaledwie rok po premierze wersji 2016 Microsoft wydał wersję SQL Server 2017 – pierwszą wersję kompatybilną z systemem Linux i środowiskiem Docker. Zadebiutowały w niej funkcje adaptacyjnego wykonywania zapytań, obsługa danych grafowych i integracja z językiem Python.

Najnowsza wersja serwera SQL Server jest przedstawiana jako platforma sztucznej inteligencji. Oprócz nowego sposobu wykonywania funkcji skalarnych umożliwia ona tworzenie klastrów Big Data i uruchamianie na nich skryptów w językach R, Python, Java i Scala.

1.3.1.
Instalacja

W tym punkcie została opisana instalacja serwera SQL Server i jego konsoli administracyjnej w systemie Windows. Szczegółowy opis instalacji serwera w środowiskach Linux i Docker oraz instalacji działającej w systemach Linux i MacOS konsoli Azure Data Studio znajdują się na stronach Microsoftu.

Serwer SQL Server 2019

Na stronie https://www.microsoft.com/en-us/sql-server/sql-server-downloads można znaleźć demonstracyjną edycję serwera SQL oraz, również darmowe, edycje Developer i Express. My będziemy potrzebować 180-dniowej edycji demonstracyjnej albo edycji Developer. Przykładowe projekty można też wykonać w komercyjnych edycjach Enterprise lub Standard serwera SQL Server.

Po pobraniu należy uruchomić graficzny instalator serwera. Z listy możliwych operacji należy wybrać Installation, a następnie wybrać zadanie New SQL Server stand-alone installation or add features to an existing installation. Kolejne pytanie będzie dotyczyło wyboru edycji instalowanego serwera. Po jej wybraniu zostaniemy poproszeni o zaakceptowanie licencji końcowego użytkownika. W kolejnym kroku instalator sprawdzi gotowość systemu do instalacji serwera SQL Server. Jeżeli na tym etapie zostanie wykryty jakiś problem, musi on zostać rozwiązany, aby możliwe było kontynuowanie instalacji.

Jeżeli instalator nie zawierał wszystkich potrzebnych plików, zostaną one pobrane. Kolejny test sprawdzi zgodność systemu z wymaganiami instalatora – ostrzeżenie dotyczące zapory systemowej możemy zignorować, jeżeli planujemy pracować z serwerem SQL Server lokalnie.

Następnie zostaniemy poproszeni o wybór instalowanych komponentów. Należy zaznaczyć opcję Machine Learning Services (In-Database) i dodać oba dostępne języki (rys. 1.2).

Rysunek 1.2. Instalacja obu wersji serwera Machine Learning Server (zintegrowanej z bazą danych i samodzielnej) na tym samym komputerze, choć możliwa, jest niezalecana

Jeżeli na komputerze nie ma zainstalowanych innych serwerów SQL Server, to powinniśmy wybrać domyślną instancję (Default instance). W ten sposób będziemy odwoływać się do serwera SQL za pomocą samej nazwy komputera – taka konwencja została użyta w przykładowych skryptach. Kolejne pytanie będzie dotyczyło konfiguracji kont użytkowników użytych do uruchomienia poszczególnych usług serwera i wyboru wersji językowej. O ile domyślna konfiguracja kont użytkowników nie powinna być zmieniana, to jeżeli instalujemy serwer na potrzeby tej książki, należy się upewnić, że wybraną wersją językową jest Latin1_General_CI_AS (rys. 1.3).

Rysunek 1.3. Wersja językowa serwera SQL Server jest ustalana na podstawie ustawień regionalnych systemu, w którym jest on instalowany. Zmiana tego ustawienia jest niemożliwa bez ponownej instalacji serwera

Odpowiadając na kolejne pytanie instalatora, należy dodać swoje konto do grupy administratorów serwera SQL Server. Jeżeli komputer ma dostęp do internetu, pozostałych opcji instalacyjnych nie będziemy musieli zmieniać, wystarczy, że zgodzimy się na instalację języków R i Python. Ich instalacja na komputerze bez dostępu do sieci wymaga wcześniejszego pobrania odpowiednich plików, co zostało opisane w dostępnym na stronie Microsoft artykule Offline installation for Machine Learning Server for Windows. Po zakończeniu instalacji należy się upewnić, czy została ona zakończona sukcesem.

Konsola SQL Server Management Studio (SSMS) 18

Konsola SQL Server Management Studio jest darmowa i dostępna na witrynie firmy Microsoft. Należy pobrać i zainstalować wersję 18 lub nowszą tej konsoli.

Po zakończeniu instalacji będziemy mogli uruchomić konsolę SSMS i połączyć się z wcześniej zainstalowanym serwerem SQL Server (rys. 1.4).

Rysunek 1.4. Jeżeli wyświetlona automatycznie nazwa serwera SQL Server jest nieprawidłowa, listę nazw wszystkich lokalnych instancji wyświetlimy poleceniem Browse for more…

SQL Server Data Tools

SQL Server Data Tools (SSDT) to zestaw narzędzi do tworzenia projektów bazodanowych, pakietów SSIS, modeli Analysis Services i raportów Reporting Services. W niniejszej książce SSDT zostało użyte do przedstawienia wyników analiz na raportach. Instalator wersji 15.8 SSDT jest dostępny pod adresem https://go.microsoft.com/fwlink/?linkid=2038031; po jego pobraniu i uruchomieniu należy zainstalować przynajmniej narzędzia SQL Server Reporting Services.

Przykładowa baza danych

Najprostszym sposobem odtworzenia przykładowej bazy z kopii zapasowej jest skorzystanie z menu kontekstowego eksploratora obiektów (Object Explorer). Po pobraniu dostępnej pod adresem https://it.pwn.pl/Artykuly/Praktyczne-uczenie-maszynowe-materialy-dodatkowe kopii bazy należy kliknąć prawym przyciskiem folder Databases, z menu kontekstowego wybrać polecenie Restore Database, wskazać lokalizację pobranego pliku kopii zapasowej i kliknąć OK (rys. 1.5).

Po zakończeniu odtwarzania baza danych ML powinna być widoczna na liście baz danych serwera – jeżeli się tam nie pojawiła, należy odświeżyć tę listę, wybierając z menu kontekstowego folderu Databases polecenie Refresh.

Rysunek 1.5. Kreator odtwarzania baz danych automatycznie umieści pliki bazy danych w odpowiednim folderze

1.3.2.
Microsoft SQL Server Machine Learning Services

Nie ma firmy, która nie chciałaby skorzystać z zaawansowanej analizy danych do zdobycia przewagi nad konkurencją. Jednak analiza posiadanych danych wymaga przezwyciężenia kilku poważnych problemów. Firmy muszą się zmierzyć z brakiem wiedzy (nie wszyscy pracownicy wiedzą, jak pracować z danymi), utrudnionym dostępem do danych (dane są rozproszone między wiele specjalistycznych systemów) i niską wydajnością systemów analitycznych (pobranie setek megabajtów danych na lokalny komputer – tylko po to, żeby następnie w Excelu wybrać z milionów rekordów kilka tysięcy potrzebnych nam w danym momencie – jest tak wolne, że niepraktyczne). Wszystkie te problemy można rozwiązać za pomocą usługi SQL Server Machine Learning Services. Ta, zintegrowana z bazą danych, wersja serwera MLS pozwala wydajnie przetwarzać duże zbiory danych i pobierać na lokalne komputery jedynie wyniki ich analiz, a nie dane źródłowe.

SQL Server zarządza zasobami komputera, takimi jak czas procesora czy pamięć RAM, przydzielając je na potrzeby wykonania żądań użytkowników. Odpowiada za to moduł SQL Server Platform Abstraction Layer (SQLPAL). Ten sam moduł jest używany do zarządzania zasobami potrzebnymi do wykonywania przez serwer SQL Server instrukcji języków R i Python. Oznacza to, że analizując dane po stronie serwera, a nie na lokalnych komputerach, nie tylko unikniemy czasochłonnego przesyłania danych przez sieć, lecz także efektywnie wykorzystamy zasoby obliczeniowe naszego serwera.

Przeniesienie analiz na serwery, na których znajdują się dane, pozwala wielokrotnie skrócić czas analiz. Na przykład trening modeli uczenia maszynowego, który wcześniej trwał kilka godzin, skróci się do kilkudziesięciu sekund.

Znajomość budowy i działania usługi SQL Server Machine Learning Services pomoże nam efektywnie wykonywać instrukcje języków R i Python, w tym trenować modele uczenia maszynowego, po stronie serwera SQL Server.

Architektura

Usługa SQL Server Machine Learning Services została zaprojektowana z myślą o wydajnym i bezpiecznym wykonywaniu instrukcji języków R i Python. Wymaga to ścisłej integracji z serwerem baz danych – tylko w ten sposób potrzebne dane mogą być efektywnie pobierane z tabel. Jednocześnie, wykonanie instrukcji tych języków nie może wpływać na wydajność serwera SQL Server i zagrozić bezpieczeństwu przechowywanych w nim danych. Pogodzenie tego wymagało zaprojektowania architektury pozwalającej na szybką wymianę danych między serwerem SQL Server a zewnętrznym procesem – interpretatorem instrukcji języków R i Python. Została ona pokazana na rysunku 1.6.

Rysunek 1.6. Architektura usługi SQL Server Machine Learning Services

Podczas instalacji usługi SQL Server Machine Learning Services na dysku, na którym jest instalowany serwer SQL Server, są tworzone trzy linki symboliczne: SQL-MSSQLSERVERExtensibilityData wskazujący na folder C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData, SQL-MSSQLSERVER-ExtensibilityData-PY wskazujący na folder C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData i SQL-MSSQLSERVER-R_SERVICES wskazujący na folder C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\R_SERVICES.

Dwa pierwsze linki wskazują na folder zawierający 20 podfolderów dla 20 kontenerów aplikacji. Te podfoldery są używane do wymiany danych binarnych (np. grafiki) między serwerem SQL Server a środowiskami uruchomieniowymi języków R i Python. Po zakończeniu danej sesji, na przykład wykonaniu procedury składowanej, dane z tych podfolderów są automatycznie kasowane.

Za każdym razem, gdy SQL Server uruchamia zewnętrzny skrypt, wywołuje usługę Launchpad, przekazując jej ID któregoś z kontenerów aplikacyjnych. Usługa Launchpad musi działać, żeby możliwe było wykonanie instrukcji języków R lub Python. Usługa ta zależy od usługi MSSQLSERVER, czyli zatrzymanie serwera SQL Server spowoduje zatrzymanie usługi Launchpad.

Domyślnie zakładanych jest 20 kontenerów aplikacji, co oznacza, że jednocześnie zewnętrzne skrypty mogą być wykonywane przez maksymalnie 20 wątków. Zmienić tę liczbę możemy, uruchamiając konsolę SQL Server Configuration Manager i w zakładce zaawansowanych właściwości usługi Launchpad ustawiając nową wartość Security Context Count (rys. 1.7).

Rysunek 1.7. Jeżeli jednocześnie będzie używanych więcej niż 20 sesji R lub Python, zwiększenie wartości Security Context Count zapobiegnie oczekiwaniu na zakończenie się którejś z już działających sesji zanim możliwe będzie uruchomienie nowej

Usługa Launchpad uruchamia (jeżeli były zatrzymane) procesy Rlauncher.exe lub Python.exe. Który, z tych procesów zostanie uruchomiony, zależy od tego, którego języka instrukcje mają zostać wykonane. Do działającego procesu Rlauncher lub Python zostaje przekazane zadanie wykonania instrukcji użytkownika.

Przekazane instrukcje są wykonywane przez procesy rterm.exe lub Python.exe. Biblioteka rxlink.dll przesyła do serwera BxlServer funkcje języka R, wysyła informacje diagnostyczne do modułu SQLPAL i rejestruje zdarzenia monitorowane przez mechanizm Extended Events. W przypadku języka Python, jeżeli używane są funkcje biblioteki revoscalepy, również wysyłają one informacje diagnostyczne do modułu SQLPAL i rejestrują zdarzenia monitorowane przez mechanizm Extended Events. Biblioteka sqlsatellite.dll przesyła dane między serwerem SQL a procesami rterm.exe lub Python.exe. W efekcie skrypty są uruchamiane jako zewnętrzne procesy, a serwer SQL Server nadzoruje ich wykonanie i dba o bezpieczeństwo danych przetwarzanych przez te procesy.

Uruchamianie instrukcji języków R i Python

Uruchomienie instrukcji języków R i Python wymaga wcześniejszego ustawienia opcji serwera SQL external scripts enabled. Wykonanie tej zmiany implikuje posiadanie uprawnień administratora serwera SQL Server:

Zarówno w przypadku języka R, jak i Python, instrukcje są wykonywane przez wywołanie systemowej procedury sp_execute_external_script, której ogólną składnię można zapisać następująco:

Pierwszym obowiązkowym parametrem jest @language. Może on przyjąć jedną z wartości: R, Python (od wersji 2017) lub Java (od wersji 2019). Drugi obowiązkowy parametr @script pozwala przekazać do procedury wykonywane instrukcje wybranego języka. Instrukcje te są przekazywane jako dane tekstowe, a ich poprawność składniowa i semantyczna nie są sprawdzane przed wykonaniem procedury sp_execute_external_script.

Pozostałe parametry procedury sp_execute_external_script są opcjonalne:

@input_data_1 pozwala podać zapytanie języka T-SQL, którego wynik zostanie przekazany do skryptu;

@input_data_1_name pozwala zmienić domyślną nazwę zmiennej InputDataSet przechowującej wynik zapytania;

@input_data_1_order_by_columns pozwala wskazać kolumnę użytą do posortowania wyniku zapytania; parametr ten został dodany w wersji 2019 serwera SQL Server;

@input_data_1_partition_by_columns pozwala wskazać kolumnę użytą do podzielenia wyniku zapytania na partycje; parametr ten został dodany w wersji 2019 serwera SQL Server;

@parallel pozwala wymusić wielowątkowe wykonanie instrukcji języka R lub Python;

@params pozwala przekazać do skryptu języka R lub Python listę parametrów o określonych nazwach i typach;

kolejne parametry procedury pozwalają przypisać wartości parametrom skryptu zdefiniowanym w poprzednim kroku.

Nazwy kolumn wyniku wywołania procedury, przekazywanego przez zmienną OutputDataSet, można ustalić klauzulą WITH RESULT SETS polecenia EXECUTE.

Wykorzystajmy wiedzę na temat procedury systemowej sp_execute_external_script do sprawdzenia działania usługi SQL Server Machine Learning Services. Proszę zwrócić uwagę, że parametry tekstowe są przekazywane jako ciągi UNICODE (tekst musi być poprzedzony dużą literą N):

W wyniku powinniśmy otrzymać dwa wiersze, każdy zawierający jedną kolumną typu int z wartością 1. Nazwy i typy tych kolumn zostały określone w klauzuli WITH RESULT SETS polecenia EXEC:

Konfiguracja

Wykonanie każdej instrukcji języka SQL wymaga pewnych zasobów: czasu procesora, pamięci RAM oraz operacji odczytu i zapisu. SQL Server kontroluje przyznawanie tych zasobów za pomocą mechanizmu Resource Governor. Tylko edycje Enterprise i Developer pozwalają tworzyć dowolne grupy zasobów i przypisywać im żądania użytkowników. Natomiast wszystkie edycje serwera SQL Server zawierają domyślną pulę zasobów, do której trafiają wszystkie żądania użytkowników. Nie zawiera ona żadnych ograniczeń zasobów, czyli zaklasyfikowane do niej żądania mogą korzystać ze wszystkich dostępnych zasobów komputera:

Wykonywanie zewnętrznych skryptów jest kontrolowane przez moduł SQL Server Extensibility Framework. Zasoby potrzebne do wykonania instrukcji języka R i Python, czyli dostępne procesory i ich czas oraz pamięć RAM, można ograniczać, konfigurując domyślną pulę zewnętrznych zasobów. Początkowa konfiguracja tej puli ogranicza ilość pamięci RAM dostępnej dla usługi Machine Learning Services do 20% pamięci nieprzydzielonej serwerowi SQL Server. Innymi słowy, jeżeli serwer jest wyposażony w 28 GB pamięci RAM, z czego 24 GB używa serwer SQL Server, to z pozostałych 4 GB tylko 20% (800 MB) będzie dostępne dla skryptów języków R i Python.

Domyślną konfigurację możemy zmienić, ograniczając maksymalną ilość pamięci RAM dostępną dla serwera SQL Server i zwiększając procent pozostałej pamięci dostępnej dla usługi SQL Server Machine Learning Services:

Powyższa zmiana domyślnej konfiguracji jest zalecana dla każdej edycji serwera SQL Server. Jak wspomniałem, edycje Enterprise i Developer dodatkowo pozwalają na bardziej szczegółową kontrolę użycia zasobów komputera. Tworząc niestandardowe grupy zewnętrznych zasobów oraz przypisując do nich poszczególne aplikacje lub użytkowników, możemy na przykad zagwarantować ważnej aplikacji wymaganą do jej działania ilość pamięci RAM i czasu procesorów.

Microsoft opublikował kilka raportów pozwalających sprawdzić konfigurację i działanie usługi SQL Server Machine Learning Services. Raporty te znajdują się w repozytorium materiałów dodatkowych dla książki, w folderze Chapter01. Raport ML Services – Configuration.rdl zawiera podstawowe informacje o usłudze SQL Server Machine Learning Services. Aby go wyświetlić:

uruchom konsolę SSMS i połącz się z serwerem SQL Server;

prawym przyciskiem myszy kliknij widoczną w okienku eksploratora obiektów ikonę serwera i z menu kontekstowego wybierz opcję Reports/Custom Report;

wskaż plik raportu ML Services – Configuration.rdl i kliknij Open;

po zaakceptowaniu ostrzeżenia przed uruchamianiem nieznanych programów raport zostanie wyświetlony (rys. 1.8).

Warto zwrócić uwagę na wyłączoną funkcję niejawnego uwierzytelniania (Implied Authentication). Wrócimy do niej w następnym punkcie poświęconym bezpieczeństwu, w tym miejscu wspomnę tylko, że można ją włączyć, klikając przycisk Configure instance.

Rysunek 1.8. Raport dodany do konsoli SSMS możemy wyświetlać, wybierając go z menu Reports

Pozostałe raporty znajdujące się w folderze to:

ML Services – Active Sessions.rdl – zwraca informacje o aktywnych sesjach użytkowników wykonujących zewnętrzne skrypty;

ML Services – Execution Statistics.rdl – zwraca statystyki wywołania procedury sp_execute_external_script;

ML Services – Extended Events.rdl – zwraca listę rozszerzonych, zgłaszanych przez zewnętrzne skrypty, zdarzeń;

ML Services – Packages.rdl – zwraca informacje o zainstalowanych bibliotekach języka R;

ML Services – Resource Usage.rdl – przedstawia zużycie zasobów komputera przez serwer SQL i usługę SQL Server Machine Learning Services (rys. 1.9).

Rysunek 1.9. Właściwe zarządzanie zasobami komputera ma zasadniczy wpływ na wydajność działających na nim usług, w tym przypadku na czas analizowania danych i trenowania modeli uczenia maszynowego

1.3.3.
Bezpieczeństwo

Bezpieczeństwo powinno być priorytetem każdego projektu uczenia maszynowego. Jeżeli dane są przesyłane do komputerów użytkowników i tam analizowane, ich skuteczne zabezpieczenie przed dostępem niepowołanych osób będzie trudne. Przeniesienie analiz na serwer baz danych rozwiązuje również kwestie ochrony danych i wyników ich analiz. W takim przypadku będziemy mogli skorzystać z rozbudowanego i sprawdzonego modelu bezpieczeństwa serwera SQL Server.

Model bezpieczeństwa serwera SQL Server pozwala na wdrożenie stosunkowo niewielkim nakładem pracy strategii dogłębnej obrony, czyli strategii polegającej na wykorzystaniu wielu niezależnych zabezpieczeń. W tym punkcie ograniczymy się do zabezpieczenia kont użytkowników i kontrolowania wykonywanych przez nich operacji.

Każdy użytkownik, zanim nawiąże sesję z serwerem, musi zostać uwierzytelniony. Tożsamość użytkowników może być potwierdzana przez:

System operacyjny (tryb Windows Authentication). Ten tryb jest zdecydowanie bezpieczniejszy. Jeśli użytkownicy serwera SQL mają konta w domenie Active Directory, tryb uwierzytelniania Windows pozwala w prosty sposób uzyskać funkcjonalny model zarządzania użytkownikami – wystarczy, że zostaną oni przypisani do grup systemowych, dla których zostały utworzone loginy serwera SQL Server. W tym trybie serwer baz danych w ogóle nie sprawdza tożsamości użytkowników, w pełni polegając na systemie operacyjnym.

Serwer SQL (tryb SQL Server and Windows Authentication) – w tym trybie możliwe jest uwierzytelnianie na podstawie konta systemu operacyjnego lub przez podanie loginu SQL i hasła. Podane przez użytkownika login i hasło są przed wysłaniem do serwera SQL szyfrowane jego certyfikatem, a następnie porównywane z zapisanymi w systemowej bazie master loginami i skrótami haseł. Loginy SQL mogą być (i domyślnie są) chronione zasadami kont obowiązującymi na lokalnym systemie Windows. Oznacza to, że jeżeli z jakiegoś powodu serwer SQL działa w trybie mieszanym, należy skonfigurować – za pomocą konsoli MMC – zasady zabezpieczeń lokalnych, zasady haseł oraz zasady blokady konta użytkowników.

Użytkownicy serwera SQL Server są reprezentowani przez loginy, konta użytkowników oraz role. Na poziomie instancji serwera mamy do dyspozycji loginy, role serwera (stałe i definiowane przez administratora) oraz dodatkowe poświadczenia. Dodatkowe poświadczenia pozwalają uwierzytelniać użytkowników (również niemających kont w systemie operacyjnym), łączyć ich w role i nadawać uprawnienia do zewnętrznych zasobów, na przykład plików. Na poziomie bazy danych dysponujemy kontami użytkowników i rolami baz danych. Służą one do nadawania uprawnień w wybranej bazie danych, a jeden login serwera może być połączony z kontami użytkowników w wielu bazach. Użytkownik, który uwierzytelnił się na podstawie loginu niepowiązanego w danej bazie z żadnym kontem użytkownika, uzyska do niej dostęp, tylko jeżeli włączone jest w niej konto gościa. Od wersji 2012 możliwe jest również tworzenie kont użytkowników bazy danych niepowiązanych z loginem, za to chronionych hasłem.

Użytkownik uwierzytelniony podczas połączenia z serwerem SQL może wykonać tylko te operacje, do których posiada uprawnienia. Uprawnienia dzielą się na nadawane do konkretnych obiektów oraz do wykonywania wskazanych instrukcji (np. prawo do wykonywania zewnętrznych skryptów). Biorąc pod uwagę liczbę obiektów bazodanowych i kont użytkowników, zarządzanie uprawnieniami na poziomie poszczególnych kont użytkowników jest nieefektywne i niebezpieczne – administrator nie będzie mógł na bieżąco nadawać i odbierać uprawnień i w końcu wszystkim użytkownikom przyzna pełne uprawnienia. Rozwiązanie tego problemu polega na wykorzystaniu hierarchii obiektów oraz ról serwera i baz danych.

Obiekty serwera SQL Server tworzą hierarchię, a dostęp do każdego z nich jest kontrolowany przez listy ACL (ang. access control list). W większości przypadków obiekty podrzędne dziedziczą uprawnienia po obiektach nadrzędnych:

na poziomie instancji serwera SQL znajdują się m.in. loginy, role serwera, urządzenia kopii zapasowych, wyzwalacze DDL i logowania, główny klucz usługi SMK oraz powiązane serwery; ponieważ loginy są zarówno principiami, jak i obiektami, możemy nadawać uprawnienia do loginów, na przykład pozwolić wskazanym osobom na ich blokowanie czy zmienianie haseł;

na poziomie bazy danych znajdują się schematy, typy danych, konta użytkowników, role bazy danych (do których domyślnie należą niektóre loginy i role serwera), certyfikaty, klucze kryptograficzne, wyzwalacze DDL, biblioteki kodu zarządzanego i schematy XML;

na poziomie schematów znajdują się pozostałe obiekty bazodanowe, w tym tabele, widoki, procedury, funkcje użytkownika, wyzwalacze DML, synonimy i kolejki usługi Service Broker.

Uprawnienie może zostać użytkownikowi nadane, nadane z możliwością przekazania, odebrane lub nieustalone. Brak uprawnienia, tak samo jak jego jawne odebranie, oznacza, że użytkownik nie będzie mógł wykonać danej operacji. Różnica między odebraniem uprawnienia a jego brakiem polega na tym, że brakujące uprawnienie może być odziedziczone (np. jeżeli zostało nadane roli, do której należy użytkownik), natomiast uprawnienie odebrane użytkownikowi oznacza, że nie wykona on danej operacji, niezależnie od ról, do których należy.

Do tej pory łączyliśmy się z serwerem SQL Server jako jego administrator – nasze konto zostało dodane do roli administratorów serwera podczas jego instalacji. Teraz zobaczymy, jak wymagane uprawnienia nadać analitykowi.

Na potrzeby tego przykładu założyłem, że analityk nie ma konta w systemie operacyjnym i będzie się łączył z serwerem SQL za pomocą loginu i hasła. Proszę pamiętać, że rozwiązanie takie jest niezgodne z zaleceniami firmy Microsoft i obniża poziom bezpieczeństwa. Tym niemniej, żeby nie komplikować niepotrzebnie przykładu, posłużymy się właśnie taką metodą logowania.

Najpierw włączymy mieszany tryb uwierzytelniania serwera SQL Server. Po kliknięciu prawym przyciskiem myszy widocznej w okienku eksploratora obiektów nazwy serwera należy wybrać opcję Properties, przejść do zakładki Security i wybrać opcję SQL Server and Windows Authentication mode. Ta zmiana wymaga ponownego uruchomienia serwera SQL Server (w menu kontekstowym serwera znajdziemy polecenie Restart).

Następnie włączymy funkcję niejawnego uwierzytelniania. W tym celu należy utworzyć login dla grupy SQLRUserGroup. Grupa ta została automatycznie założona podczas instalacji usługi SQL Server Machine Learning Services i domyślnie zawiera konto usługi Launchpad (w wersji 2019) albo lokalne konta użytkowników usługi SQL Server Machine Learning Services (w wersjach 2016 i 2017). W ten sposób umożliwimy użytkownikom, którzy nie mają konta w systemie operacyjnym i którzy łączą się z serwerem SQL Server na podstawie loginu i hasła, uruchamianie zewnętrznych skryptów. Najprościej jest wykonać tę operację, wyświetlając raport ML Services – Configuration.rdl i klikając przycisk Configure Instance.

Po skonfigurowaniu serwera i usługi SQL Server Machine Learning Services utworzymy dla naszego analityka login i powiązane z tym loginem konto użytkownika przykładowej bazy danych ML:

Sprawdźmy, czy ten użytkownik może wykonywać zewnętrzne skrypty:

Tak jak się spodziewaliśmy, domyślnie żaden użytkownik nie może uruchamiać zewnętrznych skryptów. Nadajmy naszemu analitykowi uprawnienie do wykonywania zewnętrznych skryptów

Jeżeli jeszcze raz przedstawimy się jak użytkownik Analyst i ponowie sprawdzimy, czy może on wykonywać zewnętrzne skrypty, uzyskamy liczbę 1 zwróconą przez skrypt języka R.

Pozostało nam nadać analitykowi dostęp do danych potrzebnych mu do pracy. Bez tego próba odczytania danych z dowolnej tabeli skończy się błędem:

W przykładowej bazie danych tabele, widoki, procedury i funkcje zostały podzielone między schematy reprezentujące obszary biznesowe. Nie tylko poprawia to czytelność bazy, lecz także upraszcza zarządzanie uprawnieniami. Skoro nasz analityk pracuje nad problemem wykrywania oszustw, nadajmy mu uprawnienia do wszystkich danych ze schematu:

Powtórzenie powyższego testu pozwoli nam się przekonać, że od teraz użytkownik może odczytywać dane z tabeli [BenfordFraud].[Invoices].

Przypisy

1 Pod adresem https://www.thefourthrevolution.org/FourthRevolutionBookSchem.html znajdą Państwo kilka grafik z książki The Fourth Revolution ilustrujących to zjawisko.