Od jakiegoś czasu mówi się o tym, że dane są nowym paliwem, napędzającym gospodarki. Dane to „Nowe Złoto”, w którym firmy zaczynają szukać swojej przewagi nad innymi. Odkrywanie tego, czego nie widać, ukryte wzorce i sygnały, które tylko czekają na odkrycie, by dać tym, którzy je odnajdą przewagę na rynku.

Nowe Złoto

Dane to surowiec, który w znacznej mierze czeka na wydobycie, przetopienie i zainwestowanie, by pomnożyć zyski tych, którzy zajmą się tym procesem.

Poniżej kilka smakowitych ciekawostek na temat potencjału „Nowego Złota”:

  • każda dowolnie wybrana organizacja ma 80 % lub więcej swoich danych w postaci nieustrukturyzowanej co sprawia trudności w ich analizowaniu i wyciąganiu wniosków,
  • wartość „ukrytych danych” tzw. „dark data” nie jest do końca oszacowana, ale wiele firm już teraz traktuje je jak złoto, i walczy o ich wydobycie (wywiad poniżej),
  • badania pokazują, że każdy obywatel Wielkiej Brytanii wytwarza niezależnie w ciągu roku dane o średniej wartości około 136 tys. zł, (pełna treść artykułu tutaj)
  • wszyscy generujemy ogromne ilości danych, a jesteśmy w stanie wykorzystać efektywnie tylko 2% zgromadzonych informacji. 98% pozostaje niewykorzystane.

Dane, które czekają na wydobycie to żyła złota. Te, które już mają już strukturę, możemy potraktować jako gotowe sztabki, surowiec najwyższej próby, ułożony na palecie czekający na konwój. Początek podróży a nie jej cel.

Podział Danych

W kontekście Uczenia Maszynowego mamy sytuację, gdzie musimy rozdzielić nasze dane na zbiory: treningowy, walidacyjny i testowy. Pojawia się w tym miejscu pewien problem.

Sytuacja przypomina trochę tą z finałowej sceny filmu Dobry, Zły, Brzydki.

Każdy z tytułowych bohaterów (jest ich trzech), chce zgarnąć cały skarb (jest jeden) dla siebie. Pojawia się oczywisty konflikt.

Z danymi jest podobnie. Mamy określony zbiór danych z określoną liczbą obserwacji. Część z nich może być przeznaczona na trenowanie modelu a część na testowanie. Nie możemy jednak użyć tych samych danych do obu celów.

Dane dzielimy i zawsze powinniśmy określić zbiór testowy i treningowy. Dane testowe czekają, dopóki nie znajdziemy najbardziej efektywnego modelu. Powiedzmy, że zbiór testowy to nasz Brzydki (zostaje do końca). Proporcje podziału są różne, ale często określane na sztywno powiedzmy 80% to zbiór treningowy i 20% to zbiór testowy (przykład tutaj).

Przed ostatecznym testem modelu, mamy jeszcze proces walidacji. Czyli dane treningowe znowu należy podzielić na te, którymi „karmimy” model i te, którymi walidujemy.

Stoimy przed kolejnym dylematem.

Wyobraźmy sobie skrajny przypadek, że nasz zbiór treningowy składa się z 10 wierszy. Dzielimy go na 9 wierszy, które służą do trenowania modelu i 1 wiersz do walidacji. Jeśli będziemy chcieli przetestować różne modele, to będzie czysty przypadek, jaki model wygra. Bo każdy może inaczej sprawdzić się w kontekście tej jednej obserwacji.

Koszt Alternatywny

Wprowadźmy sobie teraz definicję Kosztu Alternatywnego.

Koszt alternatywny (również koszt utraconych możliwości lub koszt utraconych korzyści) – stanowi on miarę wartości utraconych korzyści w związku z niewykorzystaniem w najlepszy sposób dostępnych zasobów. Inaczej mówiąc, koszt alternatywny jest to wartość najlepszej z możliwych korzyści, utraconej w wyniku dokonanego wyboru.

Wikipedia, źródło: https://pl.wikipedia.org/wiki/Koszt_alternatywny

Im większy zestaw walidacji, tym mniej szumu i lepsza jakość modelu, większa jego wiarygodność. Niestety większy zestaw walidacji odbywa się kosztem mniejszego zbioru danych treningowych. Mniejszy zestaw treningowy to z kolei gorszy model.

Przypomnijmy sobie co jest naszym celem?

Optymalny Model

Celem jest stworzenie optymalnego modelu przy ograniczonych zasobach. Zasobem są dane treningowe które znowu dzielimy na te, które karmią nasz model i te które go walidują (sprawdzają).

Jak to wygląda w praktyce?

Mamy kilka potencjalnych algorytmów w zależności od zadania jakie mamy do wykonania.

Trenujemy modele a one uczą się parametrów z danych. To są parametry modelu.

Są jednak parametry, których model się nie nauczy z danych i to są hiperparametry. Ustawienia, które są niezależne od danych i dotyczą mechanizmów danego algorytmu. Te trzeba ustawić przed pracą.

Wyobraźmy sobie maszynę, która ma swoje ustawienia początkowe i są niezależne od tego co do niej wsadzimy.

Pytanie, skąd mamy wiedzieć jakie parametry są najlepsze?

Iteracja

Iteracja, czyli powtarzanie pewnych zadań aby osiągnąć cel. Z iteracją możemy spotkać się wszędzie.

Iteracja to też centralna koncepcja w uczeniu maszynowym.

Jedny z miejsc gdzie iteracja ukazuje swoją moc, jest metoda o nazwie Walidacja Krzyżowa (Cross-Validation). Tą metodą można uzyskać odpowiedź jakie wartości hiperparametrów są najbardziej optymalne.

Walidacja Krzyżowa

Pomysł jest prosty a wyjaśnienie graficzne tej metody poniżej.

Jest wiele sposobów na Walidację Krzyżową. Gdybyśmy chcieli podzielić zbiór na podzielić 10 równych części (tak jak w filmie powyżej), to scenariusz wygląda tak:

  1. Dzielimy dane na 10 kawałków, dla 200 obserwacji będzie to 10 zbiorów po 20 obserwacji.
  2. Robimy 10 iteracji, gdzie:
    • 9 zbiorów to dane treningowe,
    • 1 to zbiór walidacyjny,
    • na końcu otrzymujemy wynik testu (Holdout Score).
  3. Na końcu mamy przetestowane 10 małych zbiorów z konkretnymi wynikami i ostatecznym zbiorczym wynikiem (Cross-Validated Score)
  4. Zmieniamy hiperparametry, powtarzamy procedurę od kroku 2 do 3. Im wyższy wynik tym lepiej. Ostatecznie mamy wybrane optymalne hiperparametry.

W ten sposób walidujemy model, wybieramy optymalne hiperparametry, używając całego zbioru treningowego. Unikamy losowości, że zbiór walidacyjny jest przypadkowy (patrz przykład z 1 wierszem walidacyjnym). Zjedliśmy ciastko i mamy ciastko.

Kodowanie

Wykorzystując potoki tzw. Pipeline cała operacja to tylko kilka linijek kodu. Przykładowe rozwiązanie poniżej.

from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer

my_pipeline = Pipeline(steps=[('preprocessor', SimpleImputer()),
                              ('model', RandomForestRegressor(n_estimators=50,
                                                              random_state=0))
                             ])

Wyniki Walidacji Krzyżowej otrzymujme dzięki fukcji cross_val_score() z bibioteki scikit-learn. Ustawiamy liczbę zbiorów za pomocą cv.

from sklearn.model_selection import cross_val_score

scores =  cross_val_score(my_pipeline, X, y, cv=10)

print("Scores:\n", scores)

Na koniec zbiorczy wynik.

print("Average Score:")
print(scores.mean())

Kiedy warto stosować Walidację Krzyżową?

  • W przypadku małych zbiorów danych, gdzie obciążenie związane z obliczeniami nie jest dużym problemem.
  • W przypadku większych zbiorów danych często wystarczy jeden zestaw do walidacji, bo unikamy losowości. Twój kod będzie działał szybciej, a Ty możesz mieć wystarczająco dużo danych, aby nie było potrzeby ponownego użycia niektórych z nich.
  • Nie ma prostego progu dla tego, co stanowi duży a co mały zbiór danych. Ale jeśli uruchomienie Twojego modelu zajmuje kilka minut lub mniej, prawdopodobnie warto przejść na walidację krzyżową.

Alternatywnie, możesz przeprowadzić walidację krzyżową i sprawdzić, czy wyniki dla każdego eksperymentu wydają się być zbliżone. Jeśli każdy eksperyment daje te same wyniki, prawdopodobnie wystarczy jeden zestaw do walidacji.

Podsumowanie

Poznałeś, czym jest „Nowe Złoto” współczesnego świata. Dostałeś przedsmak tego, jaki potencjał się w nim kryje i dlaczego być może warto inwestować w umiejętności czerpania z tego źródła.

Wiesz już, że iteracja jest często wykorzystywanym sposobem w Uczeniu Maszynowym do osiągania celów.

Poznałeś sposób, aby dostać optymalny model z optymalnymi parametrami. Wiesz jak w 100% wykorzystać dane, którymi dysponujesz, unikając losowości zbioru walidacyjnego, a także jak niejako ominąć efekty kosztu alternatywnego.

Źródła

  • https://www.kaggle.com/alexisbcook/cross-validation
  • https://elitedatascience.com/machine-learning-iteration#micro
  • https://scikit-learn.org/stable/modules/cross_validation.html
  • https://machinelearningmastery.com/k-fold-cross-validation/