Предимства на търсенето в мрежата
- Автоматизирана настройка на хиперпараметъра: Търсенето в мрежа автоматизира настройката на хиперпараметри, което позволява систематично изследване без ръчни проби и грешки.
- Възпроизводимост: Търсенето в мрежа гарантира валидност на теста чрез възпроизводимо получаване на възпроизводими резултати, което подобрява комуникацията и надеждността.
- Изчерпателно търсене: 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 автоматизира настройването, проследяването на резултатите и модифицирането на хиперпараметрите в моделите за машинно обучение. Той помага да се определят идеалните хиперпараметри и гарантира надеждни резултати, но може да бъде скъпо от изчислителна гледна точка за обширни експерименти с хиперпараметри.