Търсене в решетка с MLflow

T Rsene V Resetka S Mlflow



Хиперпараметрите в моделите за машинно обучение се оптимизират с помощта на подхода за търсене в мрежата. Потребителят може бързо да сравни множество настройки на хиперпараметри и да намери кои от тях се представят най-добре, защото MLflow следи резултатите от експериментите за търсене в мрежата. В MLflow експериментът за търсене в мрежа може бързо да бъде споделен с други членове на екипа. С помощта на MLflow може да се внедри най-ефективният модел от експеримент за търсене в мрежа.

Предимства на търсенето в мрежата

  • Автоматизирана настройка на хиперпараметъра: Търсенето в мрежа автоматизира настройката на хиперпараметри, което позволява систематично изследване без ръчни проби и грешки.
  • Възпроизводимост: Търсенето в мрежа гарантира валидност на теста чрез възпроизводимо получаване на възпроизводими резултати, което подобрява комуникацията и надеждността.
  • Изчерпателно търсене: GS ефективно намира оптимални хиперпараметри за модел чрез изчерпателно търсене на комбинации.
  • Здравина: Търсенето в мрежата е стабилна техника, която е устойчива на шум от данни, което намалява пренастройването.
  • Лесен за използване: Търсенето в мрежата е лесно за използване и разбиране, което го прави жизнеспособен метод за настройка на хиперпараметри.
  • Сравнения на модели: Търсенето в мрежата опростява сравнението на модела и избора на показатели за оценка.

Недостатъци на търсенето в мрежата

  • Изчислителни разходи: Търсенето в мрежа е скъпо от изчислителна гледна точка за настройка на голям брой хиперпараметри.
  • Времеемко: Отнема много време за сложни корекции на хиперпараметри.
  • Не винаги е необходимо: Сега винаги се изисква; произволното търсене е най-добрата му алтернатива.

Пример: Намиране на най-добрите настройки на модела за система за прием в университет

Нека да разгледаме пример за търсене в мрежа за настройка на хиперпараметър в рамките на онлайн система за прием в университет. В този пример ние използваме scikit-learn и директен класификатор Gradient Boosting Classifier (GBC), за да прогнозираме вероятността студентът да бъде приет в университет въз основа на фактори като GPA точки, SAT резултати, ACT резултати и извънкласни дейности. Налични са множество опции за търсене в мрежа вместо GBC, включително логистична регресия (LR), SVM (Support Vector Machine) и др.

Генерирайте произволни данни за онлайн система за прием с помощта на MLflow за търсене в мрежа

Pandas на Python и произволни пакети могат да се използват за създаване на фиктивен набор от данни за системата за прием. С произволни стойности за колоните APP_NO, GPA, SAT Score, ACT Score, Extracricular Activities и Admission Status, този код генерира синтетичен набор от данни за прием. Променливата num_students контролира колко реда има в набора от данни.







Състоянието на допускане се задава на случаен принцип въз основа на 70% степен на приемане, а произволният модул се използва за създаване на произволни стойности за няколко колони. За демонстрационни цели следната част от кода създава фалшив набор от данни за допускане с произволни стойности и се записва във файла std_admission_dataset.csv:



Кодов фрагмент:



# Импортирайте библиотеките Panda и Random
импортирайте панди като panda_obj
импортиране произволно като random_obj

# Задайте броя на записите, които наборът от данни за учениците да генерира
студентски_записи = 1000

# Създавайте списъци за съхраняване на данни
std_application_numbers = [ „APP-“ + str(random_obj.randint( 1000 , 9999 )) за _ в диапазон (students_records)]
std_gpa = [кръг(random_obj.uniform( 2.5 , 4.0 ), 2 ) за _ в диапазон (students_records)]
std_sat_scores = [random_obj.randint( 900 , 1600 ) за _ в диапазон (students_records)]
std_act_scores = [random_obj.randint( двадесет , 36 ) за _ в диапазон (students_records)]
std_extra_curriculars = [random_obj.choice([ 'да' , 'Не' ]) за _ в диапазона (students_records)]

# Изчислете състоянието на допускане въз основа на случаен процент на приемане
std_admission_status = [ 1 ако random_obj.random() < 0,7 друго 0 за _ в диапазон (students_records)]

# Създайте речник, за да съхранявате данните на учениците
std_data = {

„APPLICATION_NO“ : std_application_numbers,

'ОБЩ УСПЕХ' : std_gpa,

„SAT_резултат“ : std_sat_scores,

„ACT_Score“ : std_act_scores,

'Извънкласни дейности' : std_extra_curriculars,

'Admission_Status' : std_admission_status

}

# Създайте DataFrame DataFrame_Student от речника
DataFrame_Student = panda_obj.DataFrame(std_data)

# Запазете DataFrame DataFrame_Student в CSV файл с име std_admission_dataset.csv
DataFrame_Student.to_csv( 'std_admission_dataset.csv' , index=False)
печат ( „Успешно експортиране на данни за ученик в CSV файл!“ )

Изпълнение на кода:

Използвайте командата Python, за да компилирате кода, след което използвайте командата pip, за да инсталирате конкретен модул, ако срещнете грешка в модула. Използвайте командата pip3 install, за да инсталирате дадената библиотека, ако Python е версия 3.X или по-нова.





Успешно изпълнение:



Примерна екранна снимка с данни:

Стъпка 1: Импортирайте библиотеките

  • Библиотеката MLflow за проследяване на експерименти с машинно обучение
  • Библиотеката Pandas за обработване и анализ на данни, както и пакета mlflow.sklearn за интегриране на моделите Scikit-Learn
  • Четвъртият ред импортира библиотеката „предупреждения“, за да потисне грешките
  • Класът ParameterGrid за търсене в мрежата в модула sklearn.model_selection
  • GridSearchCV и GradientBoostingClassifier от sklearn.model_selection и ensemble, съответно, за модели на класификатор за търсене в мрежа и градиентно усилване
  • Функциите accuracy_score и classification_report от модула sklearn.metrics за изчисляване на точността на модела и генериране на отчети за класификация
  • Кодът импортира OS модула и настройва променливата на средата GIT_PYTHON_REFRESH на тихо.

Кодов фрагмент:

# Стъпка I Импортирайте необходимите библиотеки
импортиране на mlflow
импортиране на mlflow.sklearn
импортиране на предупреждения като предупреждение
импортирайте панди като panda_obj
от sklearn.model_selection импортирайте train_test_split като tts, ParameterGrid като pg, GridSearchCV като gscv
импортирайте ни
от sklearn.ensemble импортирайте GradientBoostingClassifier като GBC
от sklearn.metrics импортирайте accuracy_score като acs, classification_report като cr
os.environ[ „GIT_PYTHON_REFRESH“ ] = 'тихо'

Стъпка 2: Задайте URI за проследяване

Проследяващият URI на MLflow сървъра се задава с помощта на функцията mlflow.set_tracking_uri(), осигурявайки локална машина на порт 5000 за експерименти и модели.

mlflow.set_tracking_uri( 'http://localhost:5000' )

Стъпка 3: Заредете и подгответе набора от данни за прием

Импортирайте библиотеката Pandas като panda_obj за манипулиране и анализ на данни. Функцията read_csv() се прилага за зареждане на набора от данни за допускане. Пътят до набора от данни е единственият аргумент, който се изисква от функцията read_csv(). Пътят до набора от данни в този случай е std_admission_dataset.csv. Чрез използване на функцията read_csv(), наборът от данни се зарежда в Pandas DataFrame.

Колоната Admission_Status от std_admissions_data DataFrame първо се премахва от кода. Тъй като тази колона съдържа целевата променлива, не е необходима предварителна обработка.

След това кодът създава две нови променливи: „F“ и „t“. Характеристиките се съдържат в променливата „F“, докато целевата променлива се съдържа в променливата „t“.

След това данните се разпределят в комплекти за тестване и обучение. Това се постига с помощта на функцията tts() от пакета sklearn.model_selection. Характеристиките, целевата променлива, размерът на теста и произволното състояние са четирите аргумента, които се изискват от функцията tts(). Параметърът test_size определя частта от данните, която се използва за тестови цели. Тъй като размерът на теста в този случай е зададен на 0,2, 20% от данните ще бъдат използвани за теста.

Опцията random_state указва началото на генератора на произволни числа. Това се прави, за да се гарантира, че данните са разделени на случаен принцип. Наборите за обучение и тестване вече се съхраняват в променливите F_training, F_testing, t_training и t_testing. Тези комплекти могат да се използват за оценка и обучение на моделите за машинно обучение.

Кодов фрагмент:

# Стъпка 3: Заредете набора от данни за прием
std_admissions_data = panda_obj.read_csv( 'std_admission_dataset.csv' )

# Предварителна обработка на данните и разделяне на функции (F) и цел (t)
F = std_admissions_data.drop([ 'Admission_Status' ], ос= 1 )
t = std_admissions_data[ 'Admission_Status' ]

# Преобразувайте категориални променливи в числени, като използвате еднократно кодиране
F = panda_obj.get_dummies(F)
F_трениране, F_тестване, t_трениране, t_тестиране = tts(F, t, тест_размер= 0,2 , случайно_състояние= 42 )

Стъпка 4: Задайте име на MLflow експеримент

adm_experiment_name = „Експеримент_за_прием в университет“
mlflow.set_experiment(adm_experiment_name)

Стъпка 5: Дефинирайте класификатора за усилване на градиента

Класификаторът за усилване на градиента вече се съхранява в променливата gbc_obj. Наборът от данни за допускане може да се използва за тестване и обучение на този модел. Стойността на аргумента random_state е 42. Това гарантира, че моделът се обучава, като се използва абсолютно същият източник на генератор на произволни числа, което прави резултатите повторими.

gbc_obj = GBC(произволно_състояние= 42 )

Стъпка 6: Дефинирайте мрежата с хиперпараметри

Първоначално кодът създава речника param_grid. Хиперпараметрите, които се коригират чрез търсене в мрежата, се съдържат в този речник. Три ключа съставляват речника param_grid: n_estimators, learning_rate и max_depth. Това са хиперпараметрите на модела на класификатора с градиентно усилване. Броят на дърветата в модела се определя от хиперпараметъра n_estimators. Скоростта на обучение на модела се определя чрез хиперпараметъра learning_rate. Хиперпараметърът max_depth определя възможно най-високата дълбочина на дърветата на модела.

Кодов фрагмент:

param_grid = {

'n_estimators' :[ 100 , 150 , 200 ],

'learning_rate' :[ 0,01 , 0,1 , 0,2 ],

'max_depth' :[ 4 , 5 , 6 ]

}

Стъпка 7: Извършете търсенето в мрежата с MLflow Tracking

След това кодът преминава през речника param_grid. За всеки набор от хиперпараметри в речника кодът прави следното:

  • Стартира ново изпълнение на MLflow
  • Преобразува хиперпараметрите в списък, ако те вече не са списък
  • Записва хиперпараметрите в MLflow
  • Обучава модел за търсене в мрежа с посочените хиперпараметри
  • Получава най-добрия модел от търсенето в мрежата
  • Прави прогнози за данните от тестването, като работи с най-добрия модел
  • Изчислява точността на модела
  • Отпечатва отчета за хиперпараметрите, точността и класификацията
  • Записва точността и модела в MLflow

Кодов фрагмент:

с warn.catch_warnings():
warn.filterwarnings( 'игнорирай' , категория=Потребителско предупреждение, модул= '.*distutil.*' )
за параметри в pg(param_grid):
с mlflow.start_run(run_name= „Провеждане на състояние на прием“ ):
# Преобразувайте единични стойности в списъци
params = {ключ: [стойност] ако не е instance(стойност, списък) else стойност за ключ, стойност в params.items()}
mlflow.log_params(params)
grid_search = gscv(gbc_obj, param_grid=params, cv= 5 )
grid_search.fit(F_training, t_training)
std_best_model = grid_search.best_estimator_
model_predictions = std_best_model.predict(F_testing)
model_accuracy_score = acs(t_testing, model_predictions)
печат ( 'Хиперпараметри:' , параметри)
печат ( 'Точност:' , model_accuracy_score)
# Изрично игнорирайте UndefinedMetricWarning
с warn.catch_warnings():
warn.filterwarnings( 'игнорирай' , категория=Предупреждение)
печат ( „Доклад за класификация:“ )
print(cr(t_testing, model_predictions, zero_division= 1 ))
mlflow.log_metric( 'точност' , model_accuracy_score)
mlflow.sklearn.log_model(std_best_model, 'gb_classifier_model' )

Стъпка 8: Изпълнете програмата с Python

Ето изхода на сървъра MLflow:

Заключение

Инструментът за търсене в мрежа на MLflow автоматизира настройването, проследяването на резултатите и модифицирането на хиперпараметрите в моделите за машинно обучение. Той помага да се определят идеалните хиперпараметри и гарантира надеждни резултати, но може да бъде скъпо от изчислителна гледна точка за обширни експерименти с хиперпараметри.