W tym podrozdziale opisane jest, w jaki sposób testuje się modele. Dostępne są cztery różne zadania testowania, odpowiadające czterem rodzajom zadań eksploracji danych.
Dodatkowo, dostępne jest też zadanie CalculateTestResultsTask, które testuje modele klasyfikacyjne na podstawie danych scoringowych a nie modelu klasyfikacyjnego. To zadanie jest opisane na końcu tego podrozdziału.
Istota testowania modelu jest taka sama niezależnie od rodzaju zadania. Jednak mimo, że główne kroki są takie same dla różnych typów zadań, występują pewne różnice dotyczące ustawień parametrów dla poszczególnych typów zadań testujących. Z tego powodu rozdział ten jest podzielony na części, odpowiadające różnym rodzajom zadań testujących. W każdej części omówione są wszystkie kroki niezbędne do wykonania zadania testowania oraz wyniki testowania.
W przykładzie wykorzystamy zbiór danych cholesterol, który znajduje się w katalogu instalacyjnym programu AdvancedMiner w folderze ..\Client\scripts\scripts\data\approximation. Tworzenie zadania testowania składa się z następujących kroków:
Znaczenie poszczególnych komunikatów o błędach jest następujące:
No model specified - należy podać model wejściowy (który ma być przetestowany).
No testData specified - do zadnia testowania należy przypisać obiekt PhysicalData, który zawiera dane niezbędne do wykonania testu.
No testDataTargetAttributeName specified - po określeniu obiektu PhysicalData należy także podać atrybut o roli target
No testResults specified - należy podać nazwę modelu, w którym zostaną umieszczone wyniki testowania.
Wszystkie parametry z wyjątkiem testDataTargetAttributeName można ustawić w standardowy sposób, wybierając polecenie Properties. W tym oknie mogą się także znajdować inne opcjonalne parametry.
z menu kontekstowego. Parametr testDataTargetAttributeName należy ustawić w oknieTabela 3.3. ApproximationTestTask - ustawienia
Ustawienie | Opis | wartości dopuszczalne | Wartość domyślna |
---|---|---|---|
Cut Prc | o ile kwantyli należy przyciąć każdą stronę przy obliczaniu Histogramu Błędu | liczby całkowite z przedziału [0; 100] | 5 |
Number of Intervals | ile przedziałów należy użyć przy obliczaniu Histogramu Błędu | liczby całkowite dodatnie | 20 |
Number of Intervals XY Plot | ile przedziałów należy użyć przy obliczaniu histogramu y vs yhat | liczby całkowite dodatnie | 20 |
Target | nazwa zmiennej o roli target | nazwa zmiennej | NULL |
Liberal Execution | jeśli TRUE błędy nie będą skutkować zatrzymaniem wykonowania zadania testowania. | TRUE / FALSE | TRUE |
Jeżeli wszystkie wymagane parametry zostały ustawione, zadanie może zostać wykonane.
Cały proces tworzenia i wykonywania zadania testowania można także przeprowadzić za pomocą skrypty w Gythonie:
att = ApproximationTestTask() # utworzenie obiektu zadania testującego att.setModelName('approximation_model') # o ile dany model istnieje att.setTestDataName('cholesterol_pd') # określenie danych testujących att.setTestDataTargetAttributeName('chol') # określenie atrybutu 'target' #att.setNumberOfIntervals(10) # ustawienie innych parametrów att.setTestResultName('approximation_results') # nazwa obiektu z wynikami save('approximation_tt', att) execute('approximation_tt')
Po wykonaniu testu, w repozytorium metadanych pojawi się obiekt zawierający jego wyniki. Za jego pomocą można uzyskać szczegółowe informacje o wynikach testu: statystyki testu, widoczne w oknie Properties i składniki wyników, które są podpięte pod węzeł obiektu z wynikami w repozytorium.
Oznaczenia symboli:
Tabela 3.4. Statystyki zadania testowania modelu aproksymacyjnego
Nazwa | Opis |
---|---|
Mean Absolute Error | średnia wartość bezwzględnego błędu przewidywań dla danych testowych:: |
Mean Actual Value | średnia rzeczywistych wartości zmiennej target dla danych testowych: |
Mean Predicted Value | średnia przewidywanych wartości zmiennej target dla danych testowych: |
RMS Error | pierwiastek kwadratowy z sumy kwadratów błędów dla danych testowych: |
Jako wyniki zadania testowania modelu aproksymacyjnego dostępne jest kilka tabel/histogramów. Parametry number of intervals i cut prc są ustawiane w zadaniu testującym.
W ramach przykładu wykorzystamy zbiór danych german credit, który znajduje się w folderze ..\Client\scripts\scripts\data\classification w katalogu instalacyjnym programu AdvancedMiner. Utworzenie zadania testowania składa się z następujących kroków:
Pierwsze cztery komunikaty mają takie samo znaczenie, jak w przypadku zadania testowania modelu aproksymacyjnego. Ponadto, jest także nowy komunikat:
No positiveTargetValue specified, while ComputeQuantiles option is set to TRUE - albo należy ustawić parametr ComputeQuantiles na FALSE, albo należy podać pozytywną kategorię zmiennej pełniącej rolę target.
Wszystkie parametry z wyjątkiem testDataTargetAttributeName i positiveTargetValue mogą zostać ustawione w standardowy sposób, wybierając polecenie Properties. W tym oknie mogą się także znajdować inne opcjonalne parametry.
z menu kontekstowego. Parametry testDataTargetAttributeName i positiveTargetValue należy ustawić w oknieTabela 3.5. ClassificationTestTask - ustawienia
Jeżeli wszystkie wymagane parametry są ustawione, zadanie może zostać wykonane.
Cały proces tworzenia i wykonywania zadania testowania można także wykonać za pomocą skryptu w Gythonie:
ctt = ClassificationTestTask() # utworzenie obiektu zadania testującego ctt.setModelName('classification_model') # o ile dany model istnieje ctt.setTestDataName('german_credit_pd') # określenie danych testujących ctt.setTestDataTargetAttributeName('Class') # określenie atrybutu 'target' ctt.setPositiveTargetValue('bad') # określenie pozytywnej kategorii zmiennej 'target' #ctt.setNumberOfQuantiles(20) # ustawienie innych parametrów ctt.setTestResultName('classification_results') # nazwa obiektu z wynikami save('classification_tt', ctt) execute('classification_tt')
Po wykonaniu testu, w repozytorium metadanych pojawi się obiekt zawierający jego wyniki. Za jego pomocą można uzyskać szczegółowe informacje o wynikach testu: statystyki testu, widoczne w oknie Properties i składniki wyników, które są podpięte pod obiekt z wynikami.
Tabela 3.6. Statystyki zadania testowania modelu klasyfikacyjnego
Nazwa | Opis |
---|---|
Accuracy | dokładność modelu |
Improperly Assigned | ilość przypadków, gdy przewidywana wartość zmiennej target jest różna od wartości rzeczywistej |
Properly Assigned Cases | ilość przypadków, gdy przewidywana wartość zmiennej target równa wartości rzeczywistej |
Total Cases | całkowita ilość wszystkich przypadków |
Dostępne są także następujące statystyki:
Analiza Kołmogorowa-Smirnowa składa się z dwóch wykresów: współczynnika prawdziwych obserwacji pozytywnych i współczynnika fałszywych obserwacji pozytywnych. Obie te statystyki są opisane poniżej. Im większa odległość między tymi dwiema liniami, tym lepszy model otrzymaliśmy.
Wykresowi K-S towarzyszą dodatkowe statystyki:
ROC (receiver operating characteristic) jest alternatywną miarą jakości klasyfikatora. Ustaliwszy jedną kategorię jako pozytywną, krzywa ROC jest wykresem ilości prawdziwych obserwacji pozytywnych względem fałszywych obserwacji pozytywnych, dla każdej wartości progu dyskryminacji (prawdopodobieństwa przewidzenia kategorii pozytywnej.
Najlepszy możliwy model predykcyjny odpowiada wykresowi, który składa się z punktu w lewym górnym rogu wykresu ROC, czyli gdy wrażliwość jak i specyficzność modelu wynoszą 100%. Całkowicie losowy model daje prostą łączącą lewy dolny róg wykresu z prawym górnym (w miarę wzrostu progu przybywa tyle samo fałszywych i prawdziwych obserwacji pozytywnych). Krzywa poniżej tej prostej sugeruje, że model systematycznie daje błędne przewidywania.
Z wykresem ROC związane są dodatkowe statystyki:
ROC Area (AUC) - pole powierzchni pod krzywą ROC. Pole równe 1 oznacza doskonały model klasyfikacyjny, pole równe 0.5 oznacza, że przewidywania są losowe. Przyjmuje się, że pole większe niż 0.9 oznacza bardzo dobrą jakość modelu, wartości pomiędzy 0.8 i 0.9 oznaczają dobry model, a pomiędzy 0.7 i 0.8 - model przyzwoity. Pole poniżej 0.7 oznacza model kiepskiej jakości.
Gini Coefficient - statystyki ściśle powiązana z polem pod krzywą ROC, jest równa 2*AUC - 1.
Macierz pomyłek zawiera informacji o faktycznej i przewidywanej klasyfikacji uzyskanej za pomocą zadania testowania modelu klasyfikacyjnego. wartości w poszczególnych komórkach reprezentują ilości próbek, dla których faktyczna wartość zmiennej target odpowiada wierszowi macierzy, a wartość przewidziana przez model odpowiada kolumnie. To oznacza, że liczby na diagonali macierzy pomyłek odpowiadają prawidłowej klasyfikacji, a pozostałe liczby mówią o błędach klasyfikatora.
W przykładzie poniżej liczbę 0.6 interpretujemy w następujący sposób: 6 przypadków zostało zaklasyfikowanych przez model jako "van", choć w rzeczywistości powinny zostać zaklasyfikowane jako "bus".
W przypadku klasyfikacji binarnych, określone są wielkości symbole TP, FN, FP, TN. Dzięki temu można zdefiniować dodatkowe statystyki, które są dostępne pod węzłem targetAnalysis.
W przypadku zagadnień, w których w których klasyfikacji obejmuje więcej niż 2 kategorie, jedna kategoria jest uznana za pozytywną, a pozostałe kategorie są kolektywnie uznawane za kategorię negatywną.
Lift jest sposobem pomiaru jakości modelu klasyfikacyjnego. Jest wyznaczany i rysowany dla określonej wartości zmiennej target, traktowanej jako wartość pozytywna. Najpierw obserwacje są porządkowane rosnąco w zależności od wyniku (score) przypisanego przez model. Na osi poziomej oznaczone są za pomocą procentów posortowane obserwacje, np. 10% oznacza 10% obserwacji z największym wynikiem.
Wartość Lift-u dla danego procentu najlepszych obserwacji jest ilorazem gęstości pozytywnych wartości zmiennej target wśród tych obserwacji i gęstości pozytywnych wartości w całej populacji. Dzięki temu można zobaczyć, jak dany model różni się od najprostszego modelu (losowy wybór z całej populacji, wtedy Lift jest zawsze 1) lub od innych modeli.
Zazwyczaj wartość Lift-u jest obliczana dla dyskretnych porcji danych zwanych kwantylami, np. jeżeli lift ma być obliczony dla 10 kwantyli, to pierwszy kwantyl składa się z 10% najlepszych obserwacji, drugi kwantyl to obserwacje gorsze niż najgorsza z pierwszych 10%, ale lepsze od najlepszej spośród najgorszych 80% obserwacji, itd. Ostatni kwantyl to 10% najgorszych obserwacji.
Oprócz KSAnalyzis, ROCAnalysis i liftAnalysis dostępne są także następujące ogólne statystyki:
ROC i Lift są obliczane, jeżeli ustawienie Compute Quantiles jest włączone.
W tym przykładzie wykorzystany jest zbiór danych 'HIV', który można znaleźć w folderze ..\Client\scripts\scripts\examples\datamining w katalogu instalacyjnym programu AdvancedMiner. Utworzenie zadania testowania składa się z następujących kroków:
SurvivalTestTask może być utworzony tylko dla modelu Cox-a.
Komunikaty mają takie samo znaczenie, jak w przypadku zadania testowania modelu aproksymacyjnego. Ponadto, jest także dodatkowy komunikat:
No censoredCategory specified - należy podać nazwę kategorii cenzorowanej.
Wszystkie parametry z wyjątkiem Censored Category można ustawić w standardowy sposób, wybierając polecenie Properties obiektu testującego. W tym oknie mogą się także znajdować inne dodatkowe parametry.
z menu kontekstowego węzła utworzonego obiektu testującego. Parametr Censored Category należy ustawić w oknieTabela 3.7. SurvivalTestTask - ustawienia
Jeżeli wszystkie wymagane parametry są ustawione, zadanie może zostać wykonane.
Cały proces tworzenia i wykonywania zadania testowania można także przeprowadzić za pomocą skryptu w Gythonie:
stt = SurvivalTestTask() # utworzenie obiektu testującego stt.setModelName('survival_model') # o ile model istnieje stt.setTestDataName('HIV_pd') # określenie zbioru danych testujących stt.setTestDataTargetAttributeName('days') # okreslenia zmiennej 'target' stt.setCensorName('censor') # określenie zmiennej cenzorowanej stt.setCensoredCategory('Y') # określenie kategorii cenzorowanej #stt.setFirstTimePoint(25) # ustawienie dodatkowych opcji stt.setTestResultName('survival_results') # określenie nazwy obiektu z wynikami testowania save('survival_tt', stt) execute('survival_tt')
Po wykonaniu testu, w repozytorium metadanych pojawi się obiekt zawierający jego wyniki. Za jego pomocą można uzyskać szczegółowe informacje o wynikach testu: statystyki testu, widoczne w oknie Properties i składniki wyników, które są podpięte pod obiekt z wynikami.
Dostępne są wykresu Lift-u w każdym punkcie czasowym, wraz z powiązanymi statystykami (zob. analiza lift-u).
W tym przykładzie wykorzystany będzie zbiór danych 'stock_market', który można znaleźć w folderze ..\Client\scripts\scripts\data\time w katalogu instalacyjnym programu AdvancedMiner. Utworzenie zadania testowania składa się z następujących kroków:
Komunikaty są takie same jak w przypadku obiektu ApproximationTestTask.
Okno Properties może zawierać dodatkowe ustawienia.
Tabela 3.8. TimeSeriesTestTask - ustawienia
Ustawienie | Opis | wartości dopuszczalne | Wartość domyślna |
---|---|---|---|
Liberal Execution | jeśli TRUE błędy nie będą skutkować zatrzymaniem wykonowania zadania testowania. | TRUE / FALSE | TRUE |
Number of Time Points | liczba punktów czasowych, dla których obliczone zostaną statystyki | liczby całkowite dodatnie | 10 |
Target | - | nazwa zmiennej pełniącej funkcję target | NULL |
timePointAttribute name | - | nazwa zmiennej pełniącej funkcję timePoint | NULL |
Jeżeli wszystkie wymagane parametry są ustawione, zadanie może zostać wykonane.
Cały proces tworzenia i wykonowyania zadania testowania można także przeprowadzić za pomocą skrypty w Gythonie:
tstt = TimeSeriesTestTask() # utworzenie zadania testowania tstt.setModelName('timeseries_model') # o ile model istnieje tstt.setTestDataName('stock_market_pd') # określenie zbioru danych testujących tstt.setTestDataTargetAttributeName('price_change') # określenie zmiennej 'target' tstt.setTimePointAttributeName('time') # określenie zmiennej 'timePoint' #tstt.setNumberOfTimePoints(10) # ustawienie dodatkowych opcji tstt.setTestResultName('timeseries_results') # określenie nazwy obiektu z wynikami save('timeseries_tt', tstt) execute('timeseries_tt')
Po wykonaniu testu, w repozytorium metadanych pojawi się obiekt zawierający jego wyniki. Za jego pomocą można uzyskać szczegółowe informacje o wynikach testu: statystyki testu, widoczne w oknie Properties i składniki wyników, które są podpięte pod węzeł obiektu z wynikami.
Mean Absolute Error (MAE) - wartość średnia wartości bezwzględnych błędów predykcji dla danych testowych
Mean Actual Value (MAV) - zaobserwowana wartość średnia całego szeregu:
Actual Value Variance (AVV) - zaobserwowana wariancja całego szeregu:
Mean Predicted Variance (MPV) - wartość średnia wariancji predykcji:
RMS Error - uśredniony pierwiastek kwadratowy sumy kwadratów błędów predykcji dla danych testowych
R-Squared Error -
Powyżej to bieżąca wartość średnia szeregu, oznacza wariancję modelu dla i-tej obserwacji, oznacza wartość szeregu dla i-tej obserwacji, a N to ilość wszystkich obserwacji w szeregu.
Obiekt ClassificationTestResultTask służy do wykonania specjalnego testu klasyfikacyjnego, z wykorzystaniem tabeli scoringowej zamiast modelu klasyfikacyjnego.
Do utworzenia tego zadania potrzebne są następujące obiekty: tabela z wynikami scoringowymi w bazie danych, obiekt PhysicalData dla tej tabeli, oraz zadanie testujące w repozytorium.
Tabela z wynikami scoringowymi musi zawierać następujące kolumny:
rzeczywisty target
klasy (kategorie) zwracane przez model
prawdopodobieństwo (lub wynik punktowy) zwracane przez model
Wykorzystamy przykładowe dane poniżej. Po wykonaniu tego skryptu w bazie danych pojawi się zbiór danych przykładowych i tabela z wynikami scoringowymi.
Przykład 3.1. Przygotowywania zadania wykonania testu klasyfikacyjnego
table "dane_wejsciowe": temp wysokosc Klasa -50 1 "dobry" -40 1 "dobry" -30 1 "dobry" -20 10 "dobry" -10 10 "dobry" 10 10 "dobry" 20 20 "zly" 30 10 "dobry" 40 10 "dobry" 50 10 "zly" 60 5 "dobry" 70 20 "zly" 80 30 "zly" 90 1 "dobry" 100 10 "zly" # prosty model klasyfikacyjny trans "dane_wynikowe"<-"dane_wejsciowe": wynik = temp/100.0 nowaKlasa = "dobry" if wynik>0.5: nowaKlasa ="zly"
Dalej należy wykonać następujące kroki:
Znaczenie poszczególnych komunikatów jest następujące:
no physicalDataName specified - do zadania należy przypisać obiekt PhysicalData z wynikami scoringowymi.
no target specified - nazwa zmiennej pełniącej funkcję target
no predictedTarget specified - nazwa zmiennej w danych z wynikami scoringowymi zawierającej kategorie przypisane przez model.
no positiveTargetValue specified - należy ustawić pozytywną kategorię zmiennej target.
no testResultName specified - należy podać nazwę modelu, pod który zostaną podpięte wyniki testowania.
no score specified - należy podać nazwę zmiennej zawierającej score (lub prawdopodobieństwo) wyliczone przez model.
W standardowy sposób (za pomocą menu kontekstowego) można ustawić jedynie parametry testResultName i physicalDataName. Pozostałe parametry należy ustawić w oknie Properties. Ponieważ obiekt CalculateTestResultTask jest bardzo podobny do obiektu Classification Test Task, reszta ustawień w oknie Properties jest taka sama. (zob. Testowanie modeli klasyfikacyjnych).
Jeżeli wszystkie wymagane parametry są ustawione, zadanie może zostać wykonane.
Cały proces tworzenia i wykonywania zadania testowania można także przeprowadzić za pomocą skryptu w Gythonie:
dane_wynikowe_pd = PhysicalData('dane_wynikowe') save('dane_wynikowe_pd',dane_wynikowe_pd) # utworzenie PhysicalData dla danych scoringowych ctrt = CalculateTestResultTask() # utworzenie obiektu testującego ctrt.setPhysicalDataName('dane_wynikowe_pd') # okreslenia PhysicalData dla danych scoringowych ctrt.setActualName("Klasa") # określenie zmiennej 'target' ctrt.setPositiveTargetValue('zly') # określenie pozytywnej kategorii zmiennej 'target' ctrt.setPredictedName('nowaKlasa') # określenie zmiennej z klasami przypisanymi przez model ctrt.setScore('wynik') # określenie zmiennej z wynikami scoringowymi #ctrt.setNumberOfQuantiles(25) # ustawienie dodatkowych opcji ctrt.setTestResultName('testresult_results') # określenie nazwy obiektu z wynikami save('testresult_tt',ctrt) execute('testresult_tt')
Wyniki tego zadania testowania są dokładnie takie same jak w przypadku wyników zadania klasyfikacyjnego .