Aby rozpocząć pracę z modelem głębokiego uczenia w MATLAB, należy odpowiednio przygotować dane wejściowe i wyjściowe. W tym rozdziale przedstawiamy krok po kroku sposób, w jaki można skonwertować dane do formatu datastore, a następnie wykorzystać je do treningu modelu w aplikacji Deep Network Designer (DND).

Pierwszym krokiem jest pozyskanie danych. Za pomocą funkcji readtable() ładujemy dane z pliku CSV, który zawiera informacje o trzęsieniach ziemi, takie jak szerokość geograficzna, długość geograficzna, głębokość, godzina oraz magnituda. Ważne jest, aby znać lokalizację pliku, ponieważ może się on różnić w zależności od miejsca przechowywania.

Dalej, w celu przygotowania danych do treningu i testowania, musimy zdefiniować zmienną N, która określa liczbę rekordów, które będą używane do treningu (3000) i testowania (3000 kolejnych rekordów). Pierwsze 3000 rekordów stanowi dane wejściowe do treningu, a drugie 3000 zostanie wykorzystane jako dane testowe.

Dla danych wejściowych, takich jak szerokość (LATI), długość (LONG), głębokość (DEPTH) oraz godzina (HOUR), tworzymy macierz, która będzie zawierała te cztery kolumny. Dane wyjściowe, czyli magnituda (MAG), są przypisane do odpowiedniej kolumny wyjściowej. Następnie, łącząc dane wejściowe z danymi wyjściowymi, otrzymujemy kompletny zestaw danych treningowych, który zostaje zapisany w zmiennej trainData.

Aby stworzyć datastore dla danych treningowych, używamy funkcji arrayDatastore(), która konwertuje nasz zestaw danych do formatu przyjaznego dla MATLAB. Funkcja ta umożliwia ustawienie rozmiaru odczytu i typu danych wyjściowych. W tym przypadku rozmiar odczytu wynosi 3000, co odpowiada liczbie rekordów używanych do treningu.

Podobnie przygotowujemy dane testowe. Należy jedynie zadbać, by dane do testowania pochodziły z odpowiedniego zakresu, tj. od rekordu 3001 do 6000. Po utworzeniu danych testowych, stosujemy tę samą funkcję arrayDatastore() do stworzenia datastore dla danych testowych.

Kiedy nasze dane są już w odpowiednim formacie, możemy przejść do etapu budowania modelu. W tym przypadku użyjemy aplikacji Deep Network Designer (DND) w MATLAB, aby stworzyć nową sieć neuronową. Zaczynamy od otwarcia pustej sieci i dodania odpowiednich warstw. Ważne jest, aby sieć była dostosowana do regresji, ponieważ próbujemy przewidzieć ciągłą wartość (magnitudę) na podstawie danych wejściowych. Do tego celu najlepiej wykorzystać warstwę featureInputLayer dla wejścia oraz regressionLayer dla wyjścia. Ponadto, aby model lepiej radził sobie z danymi sekwencyjnymi, warto dodać warstwę Long Short-Term Memory (LSTM), która umożliwia modelowi analizowanie zależności czasowych.

Po zaprojektowaniu sieci neuronowej, konfigurujemy parametry, takie jak rozmiar wyjścia w warstwach Fully Connected (FC). Ponieważ nasz model przewiduje tylko jedną wartość (magnitudę), zmieniamy rozmiar wyjścia w obu warstwach FC na 1. Następnie przechodzimy do zakładki "Data", gdzie importujemy nasze dane treningowe i testowe z wcześniej utworzonych datastore.

Kiedy dane są już zaimportowane, rozpoczynamy trening modelu, klikając przycisk "Train". Proces treningu będzie widoczny w aplikacji, a wyniki zostaną zapisane w Workspace. Po zakończeniu treningu, model jest gotowy do użycia i może być zapisany na dysku, aby można go było później załadować i zastosować w innych zadaniach.

Po wytrenowaniu modelu, przystępujemy do jego walidacji, korzystając z danych testowych. Dzięki temu możemy ocenić, jak dobrze nasz model przewiduje magnitudę na podstawie nowych, nieznanych danych. Otwieramy nowy plik skryptu, w którym definiujemy dane testowe i wykonujemy ewaluację modelu, porównując przewidywane wartości z rzeczywistymi danymi.

Po zakończeniu ewaluacji, otrzymujemy pełny obraz skuteczności naszego modelu. Możemy teraz zaimportować gotowy model do innych aplikacji lub używać go do dalszych analiz i prognoz.

Ważne jest, aby podczas całego procesu nie tylko zwracać uwagę na techniczne aspekty budowy modelu, ale także na zrozumienie danych, które są wykorzystywane do treningu. Dane muszą być odpowiednio przetworzone i przygotowane, aby model mógł osiągnąć jak najlepsze wyniki. Warto pamiętać, że przygotowanie danych to jeden z najistotniejszych etapów w całym procesie uczenia maszynowego, ponieważ jakość danych w dużym stopniu determinuje sukces modelu.

Jak obliczyć prawdopodobieństwo wystąpienia cukrzycy na podstawie parametrów fizjologicznych?

Rozpoznanie choroby przy użyciu prostych statystycznych modeli klasyfikacyjnych, takich jak naiwny klasyfikator Bayesa, może być zaskakująco skuteczne, jeśli dane wejściowe zostały odpowiednio przygotowane. W przypadku klasyfikacji wystąpienia cukrzycy, wykorzystujemy cztery kluczowe zmienne: wiek pacjenta, poziom glukozy, ciśnienie krwi oraz wskaźnik masy ciała (BMI). Dla każdej z tych zmiennych osobno liczymy średnią arytmetyczną i wariancję, w dwóch oddzielnych grupach: pacjentów z cukrzycą oraz bez niej. Te wartości służą jako parametry funkcji gęstości rozkładu normalnego, którą stosujemy w dalszej analizie.

Aby zbudować taki model klasyfikacyjny, rozpoczynamy od obliczenia średnich (mean) oraz wariancji (variance) dla każdej cechy w każdej klasie. Średnia dla cechy w danej klasie to po prostu suma wartości tej cechy podzielona przez liczbę próbek. Wariancja to miara rozproszenia wartości wokół średniej — jest to suma kwadratów odchyleń każdej wartości od średniej, podzielona przez liczbę obserwacji.

Po wykonaniu tych obliczeń uzyskujemy cztery średnie i cztery wariancje dla każdej z dwóch klas: z cukrzycą i bez. Na przykład, średni wiek pacjentów z cukrzycą wynosi 39,6 lat, a bez cukrzycy – 34,8 lat. Podobne wartości uzyskujemy dla glukozy, ciśnienia krwi i BMI. Wariancje, które przyjmują dość wysokie wartości, wskazują na zróżnicowanie w populacjach.

Następnie, dla nowego pacjenta, którego dane są nam znane (np. wiek = 41, glukoza = 187, BP = 68, BMI = 37,7), obliczamy prawdopodobieństwo przynależności do każdej z klas, przy założeniu, że cechy są niezależne (naiwne założenie Bayesa). Prawdopodobieństwo to liczymy przy pomocy wzoru na funkcję gęstości rozkładu normalnego:

p(xμ,σ2)=12πσ2exp((xμ)22σ2)p(x|\mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} \cdot \exp\left( -\frac{(x - \mu)^2}{2\sigma^2} \right)