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 bibliotekiimportuj 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ęciastd_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.