Wyszukiwanie siatki za pomocą MLflow

Wyszukiwanie Siatki Za Pomoca Mlflow



Hiperparametry w modelach uczenia maszynowego są optymalizowane przy użyciu metody wyszukiwania siatki. Użytkownik może szybko porównać wiele ustawień hiperparametrów i znaleźć te, które działają najlepiej, ponieważ MLflow śledzi wyniki eksperymentów wyszukiwania siatki. W MLflow eksperyment wyszukiwania siatki można szybko udostępnić innym członkom zespołu. Za pomocą MLflow można wdrożyć najbardziej efektywny model z eksperymentu wyszukiwania siatki.

Korzyści z wyszukiwania siatki

  • Automatyczne dostrajanie hiperparametrów: Wyszukiwanie siatki automatyzuje dostrajanie hiperparametrów, co pozwala na systematyczną eksplorację bez ręcznych prób i błędów.
  • Powtarzalność: przeszukiwanie siatki zapewnia ważność testu poprzez powtarzalne uzyskiwanie powtarzalnych wyników, co poprawia komunikację i niezawodność.
  • Wyczerpujące wyszukiwanie: GS skutecznie znajduje optymalne hiperparametry dla modelu poprzez wyczerpujące wyszukiwanie kombinacji.
  • Krzepkość: Przeszukiwanie siatki to solidna technika odporna na szum danych, co ogranicza nadmierne dopasowanie.
  • Prosty w użyciu: Wyszukiwanie siatki jest proste w użyciu i zrozumiałe, co czyni go realną metodą dostrajania hiperparametrów.
  • Porównania modeli: Wyszukiwanie siatki upraszcza porównywanie modeli i wybór metryk oceny.

Wady wyszukiwania siatki

  • Koszt obliczeniowy: Wyszukiwanie siatki jest kosztowne obliczeniowo w przypadku dostrajania dużej liczby hiperparametrów.
  • Czasochłonne: Złożone korekty hiperparametrów są czasochłonne.
  • Nie zawsze konieczne: Teraz jest to zawsze wymagane; wyszukiwanie losowe jest najlepszą alternatywą.

Przykład: Znalezienie najlepszych ustawień modelu dla systemu rekrutacji na uniwersytet

Przyjrzyjmy się przykładowi wyszukiwania siatki w celu dostrajania hiperparametrów w ramach internetowego systemu rekrutacji na uniwersytety. W tym przykładzie używamy narzędzia scikit-learn i prostego klasyfikatora Gradient Boosting Classifier (GBC), aby prognozować prawdopodobieństwo przyjęcia studenta na uniwersytet w oparciu o takie czynniki, jak punkty GPA, wyniki SAT, wyniki ACT i zajęcia pozalekcyjne. Dostępnych jest wiele opcji wyszukiwania siatki zamiast GBC, w tym regresja logistyczna (LR), SVM (maszyna wektorów nośnych) itp.

Wygeneruj losowe dane dla systemu rekrutacji online za pomocą MLflow do wyszukiwania w siatce

Pandy i pakiety losowe Pythona można wykorzystać do stworzenia fikcyjnego zbioru danych dla systemu przyjęć. Przy losowych wartościach kolumn APP_NO, GPA, SAT, ACT, Zajęcia pozalekcyjne i Stan przyjęcia, kod ten generuje syntetyczny zestaw danych dotyczących przyjęć. Zmienna num_students kontroluje liczbę wierszy w zbiorze danych.







Status przyjęcia jest ustalany losowo w oparciu o współczynnik akceptacji wynoszący 70%, a moduł losowy służy do generowania losowych wartości dla kilku kolumn. W celach demonstracyjnych następujący fragment kodu tworzy fałszywy zbiór danych dotyczących przyjęcia z losowymi wartościami i jest zapisywany w pliku std_admission_dataset.csv:



Fragment kodu:



# Zaimportuj biblioteki Panda i Random
zaimportuj pandy jako panda_obj
importuj losowo jako random_obj

# Ustaw liczbę rekordów, które ma wygenerować zbiór danych ucznia
studenci_rekordy = 1000

# Twórz listy do przechowywania danych
std_application_numbers = [ „APLIKACJA-” + str(random_obj.randint( 1000 , 9999 )) dla _ w zakresie (students_records)]
std_gpa = [okrągły(random_obj.uniform( 2.5 , 4,0 ), 2 ) dla _ w zakresie (students_records)]
std_sat_scores = [random_obj.randint( 900 , 1600 ) dla _ w zakresie (students_records)]
std_act_scores = [random_obj.randint( 20 , 36 ) dla _ w zakresie (students_records)]
std_extra_currculars = [random_obj.choice([ 'Tak' , 'NIE' ]) dla _ w zakresie (students_records)]

# Oblicz status przyjęcia na podstawie losowego wskaźnika akceptacji
std_admission_status = [ 1 if random_obj.random() < 0,7 w przeciwnym razie 0 dla _ w zakresie (students_records)]

# Utwórz słownik do przechowywania danych uczniów
standardowe_dane = {

„APLIKACJA_NIE” : numery_std_aplikacji,

„GPA” : std_gpa,

„Wynik_SAT” : std_sat_scores,

„Wynik_ACT” : std_act_scores,

'Zajęcia dodatkowe' : std_extra_currculars,

„Status_przyjęcia” : std_admission_status

}

# Utwórz ramkę DataFrame DataFrame_Student ze słownika
DataFrame_Student = panda_obj.DataFrame(std_data)

# Zapisz ramkę DataFrame DataFrame_Student w pliku CSV o nazwie std_admission_dataset.csv
DataFrame_Student.to_csv( „std_admission_dataset.csv” , indeks=fałsz)
wydrukować( „Dane ucznia pomyślnie wyeksportowano do pliku CSV!” )

Wykonanie kodu:

Użyj polecenia Python, aby skompilować kod, a następnie użyj polecenia pip, aby zainstalować określony moduł, jeśli napotkasz błąd modułu. Użyj polecenia pip3 install, aby zainstalować podaną bibliotekę, jeśli Python jest w wersji 3.X lub wyższej.





Pomyślne wykonanie:



Przykładowy zrzut ekranu z danymi:

Krok 1: Zaimportuj biblioteki

  • Biblioteka MLflow do śledzenia eksperymentów uczenia maszynowego
  • Biblioteka Pandas do obsługi przetwarzania i analizy danych oraz pakiet mlflow.sklearn do integracji modeli Scikit-Learn
  • Czwarta linia importuje bibliotekę „ostrzeżeń”, aby ukryć błędy
  • Klasa ParameterGrid do wyszukiwania siatki w module sklearn.model_selection
  • GridSearchCV i GradientBoostingClassifier z odpowiednio sklearn.model_selection i zespołu dla modeli klasyfikatorów wyszukiwania siatki i wzmacniania gradientu
  • Funkcje dokładności_score i klasyfikacji_report z modułu sklearn.metrics do obliczania dokładności modelu i generowania raportów klasyfikacyjnych
  • Kod importuje moduł systemu operacyjnego i ustawia zmienną środowiskową GIT_PYTHON_REFRESH na cichą.

Fragment kodu:

# Krok I Zaimportuj wymagane biblioteki
importuj mlflow
zaimportuj mlflow.sklearn
importuj ostrzeżenia zgodnie z ostrzeżeniem
zaimportuj pandy jako panda_obj
z sklearn.model_selection import train_test_split jako tts, ParameterGrid jako pg, GridSearchCV jako gscv
importuj nas
z sklearn.ensemble import GradientBoostingClassifier jako GBC
ze sklearn.metrics zaimportuj dokładność_score jako acs, raport klasyfikacji jako cr
os.środowisko[ „GIT_PYTHON_REFRESH” ] = 'cichy'

Krok 2: Ustaw identyfikator URI śledzenia

URI śledzenia serwera MLflow ustawia się za pomocą funkcji mlflow.set_tracking_uri(), która zapewnia lokalną maszynę na porcie 5000 dla eksperymentów i modeli.

mlflow.set_tracking_uri( „http://localhost:5000” )

Krok 3: Załaduj i przygotuj zbiór danych dotyczących przyjęcia

Zaimportuj bibliotekę Pandas jako panda_obj w celu manipulacji i analizy danych. Do załadowania zbioru danych przyjęcia stosowana jest funkcja read_csv(). Ścieżka do zbioru danych jest jedynym argumentem wymaganym przez funkcję read_csv(). Ścieżka do zbioru danych w tym przypadku to std_admission_dataset.csv. Dzięki zastosowaniu funkcji read_csv() zbiór danych jest ładowany do ramki danych Pandas.

Kolumna Admission_Status z ramki danych std_admissions_data jest najpierw usuwana przez kod. Ponieważ ta kolumna zawiera zmienną docelową, przetwarzanie wstępne nie jest konieczne.

Następnie kod tworzy dwie nowe zmienne: „F” i „t”. Cechy zawarte są w zmiennej „F”, natomiast zmienna docelowa zawarta jest w zmiennej „t”.

Dane są następnie rozdzielane do zbiorów testowych i szkoleniowych. Osiąga się to za pomocą funkcji tts() z pakietu sklearn.model_selection. Cechy, zmienna docelowa, rozmiar testu i stan losowy to cztery argumenty wymagane przez funkcję tts(). Parametr test_size określa część danych wykorzystywaną do celów testowych. Ponieważ rozmiar testu w tym przypadku jest ustawiony na 0,2, do testu zostanie użyte 20% danych.

Opcja random_state określa źródło generatora liczb losowych. Ma to na celu zapewnienie losowego rozdzielenia danych. Zbiory szkoleniowe i testowe są teraz przechowywane w zmiennych F_training, F_testing, t_training i t_testing. Zestawów tych można używać do oceny i uczenia modeli uczenia maszynowego.

Fragment kodu:

# Krok 3: Załaduj zestaw danych przyjęcia
std_admissions_data = panda_obj.read_csv( „std_admission_dataset.csv” )

# Wstępnie przetwórz dane i podziel je na cechy (F) i cel (t)
F = std_admissions_data.drop([ „Status_przyjęcia” ], oś= 1 )
t = std_admissions_data[ „Status_przyjęcia” ]

# Konwertuj zmienne kategoryczne na numeryczne za pomocą kodowania one-hot
F = panda_obj.get_dummies(F)
F_trening, F_testing, t_trening, t_testing = tts(F, t, test_size= 0,2 , stan_randomowy= 42 )

Krok 4: Ustaw nazwę eksperymentu MLflow

nazwa_eksperymentu adm = „Eksperyment_Przyjęć na Uniwersytet”
mlflow.set_experiment(adm_experiment_name)

Krok 5: Zdefiniuj klasyfikator wzmacniający gradient

Model klasyfikatora wzmacniającego gradient jest teraz przechowywany w zmiennej gbc_obj. Zbiór danych wejściowych można wykorzystać do testowania i uczenia tego modelu. Wartość argumentu random_state wynosi 42. Gwarantuje to, że model jest szkolony przy użyciu dokładnie tego samego źródła generatora liczb losowych, co sprawia, że ​​wyniki są powtarzalne.

gbc_obj = GBC(random_state= 42 )

Krok 6: Zdefiniuj siatkę hiperparametrów

Kod początkowo tworzy słownik param_grid. Hiperparametry, które są dostosowywane poprzez wyszukiwanie siatki, znajdują się w tym słowniku. Na słownik param_grid składają się trzy klucze: n_estimators, learning_rate i max_głębia. Są to hiperparametry modelu klasyfikatora wzmacniającego gradient. Liczbę drzew w modelu określa hiperparametr n_estimators. Szybkość uczenia się modelu jest określana za pomocą hiperparametru learning_rate. Hiperparametr max_głębia określa największą możliwą głębokość drzew modelu.

Fragment kodu:

para_grid = {

„n_estymatorów” :[ 100 , 150 , 200 ],

„szybkość_uczenia się” :[ 0,01 , 0,1 , 0,2 ],

'maksymalna głębokość' :[ 4 , 5 , 6 ]

}

Krok 7: Wykonaj wyszukiwanie siatki za pomocą śledzenia MLflow

Następnie kod wykonuje iterację po słowniku param_grid. Dla każdego zestawu hiperparametrów w słowniku kod wykonuje następujące czynności:

  • Rozpoczyna nowy przebieg MLflow
  • Konwertuje hiperparametry na listę, jeśli jeszcze nie są listą
  • Rejestruje hiperparametry w MLflow
  • Uczy model wyszukiwania siatki z określonymi parametrami
  • Pobiera najlepszy model z wyszukiwania siatki
  • Dokonuje prognoz na podstawie danych testowych, sprawdzając najlepszy model
  • Oblicza dokładność modelu
  • Drukuje raport hiperparametrów, dokładności i klasyfikacji
  • Rejestruje dokładność i model w MLflow

Fragment kodu:

z warn.catch_warnings():
ostrzegaj.filtrostrzeżeń( 'ignorować' , kategoria=Ostrzeżenie użytkownika, moduł= '.*distutil.*' )
dla parametrów w pg(param_grid):
z mlflow.start_run(run_name= „Bieg stanu przyjęć” ):
# Konwertuj pojedyncze wartości na listy
params = {klucz: [wartość] jeśli nie isinstance(wartość, lista) else wartość dla klucza, wartość w params.items()}
mlflow.log_params(parametry)
grid_search = gscv(gbc_obj, param_grid=params, cv= 5 )
grid_search.fit(F_trening, t_trening)
std_best_model = grid_search.best_estimator_
model_predictions = std_best_model.predict(F_testing)
model_accuracy_score = acs(t_testing, model_predictions)
wydrukować( „Hiperparametry:” , parametry)
wydrukować( 'Dokładność:' , wynik_dokładności modelu)
# Jawnie ignoruj ​​ostrzeżenie UnknownMetricWarning
z warn.catch_warnings():
ostrzegaj.filtrostrzeżeń( 'ignorować' , kategoria=Ostrzeżenie)
wydrukować( „Raport klasyfikacyjny:” )
print(cr(t_testing, model_predictions, zero_division= 1 ))
mlflow.log_metric( 'dokładność' , wynik_dokładności modelu)
mlflow.sklearn.log_model(std_best_model, „model_klasyfikatora_gb” )

Krok 8: Uruchom program przy użyciu języka Python

Oto dane wyjściowe na serwerze MLflow:

Wniosek

Narzędzie do wyszukiwania siatki MLflow automatyzuje poprawianie, śledzenie wyników i modyfikowanie hiperparametrów w modelach uczenia maszynowego. Pomaga określić idealne hiperparametry i zapewnia wiarygodne wyniki, ale może być kosztowne obliczeniowo w przypadku rozległych eksperymentów z hiperparametrami.