моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Фоновое дрожание:(Не читайте, если хотите сэкономить)
Недавно я нашел стажировку в качестве комментатора ИИ, но на протяжении всего процесса я выполнял работу, связанную с текстом. По сути, я все еще закручивал гайки. Я просто хотел освоить некоторые навыки настройки и развертывания параметров, чтобы повысить свою конкурентоспособность. резюме будет легче упаковать в будущем.
Конечно, первым выбором для обучения является Bilibili University. Как и ожидалось, я нашел бесплатный инструмент для настройки параметров, получивший множество положительных отзывов.Оптуна。
Кстати, стажировка у меня былаТекстовая аннотация для направления безопасности контента(Человеческая поговорка: убедитесь, что содержимое обучающего набораполиткорректность), но когда я посмотрел другие видео, чтобы узнать, как использовать Yolo5 для распознавания масок и лиц, я узнал, что есть бесплатныйАннотация к изображениюИнструмент очень прост в использовании. Я сам его протестировал. Он очень прост в установке и использовании. Он не содержит рекламы и обременений. Он ориентирован на простоту и эффективность.
Название инструмента:МеткаImg
Статья в общедоступном аккаунте, опубликованная преподавателем ранее, содержала очень подробное введение:
https://mp.weixin.qq.com/s/AE_rJwd9cKQkUGFGD6EfAg
Портал паблик аккаунтов
————————————————————————————————————————————
Текст: Об Оптуне и процессе обучения
**Ссылка на видеоурок: **https://www.bilibili.com/list/watchlater?oid=832000670&bvid=BV1c34y1G7E8&spm_id_from=333.1007.top_right_bar_window_view_later.content.click
Видео мастеров станции Б
Способ установки:
Anaconda также следует устанавливать через conda, я просто установил ее через pip, как показано на видео, чтобы избежать проблем.
————————————————————————————————————————————
Ссылка на кейс Kaggle, используемая мастерами:
https://www.kaggle.com/code/yunsuxiaozi/learn-to-use-the-optuna/notebook
портал
Хотя копирование и вставка — это весело, чтобы сохранить ощущение + прочувствовать детали, рекомендуется, если у вас есть время, писать медленно от руки. Даже если вы печатаете в соответствии с ним, это лучше, чем копировать и вставлять. вставка напрямую. Когда вы впервые изучаете навык, медленно значит быстро.
Аналогично, если на вашем компьютере установлена Anaconda, рекомендуется создать специальную виртуальную среду для тестирования Optuna во избежание конфликтов.
————————————————————————————————————————————
Учебные пособия по созданию виртуальной среды conda мастера CSDN и руководства по настройке виртуальной среды Jupyter:
https://blog.csdn.net/fanstering/article/details/123459665
Вы можете пропустить этот шаг, если у вас нет Anaconda.
Я уже знаком с этим этапом создания виртуальной среды. Пакеты Environment и Optuna установлены. Однако Jupyter по-прежнему сообщает, что библиотека Optuna отсутствует, когда я ее установил в соответствии с руководством этого эксперта.nb_condaПроблема будет решена позже.
————————————————————————————————————————————
Затем приступайте к знакомому процессу написания кода. Сначала импортируйте необходимые библиотеки Python и установите все недостающее. Anaconda рекомендует использовать как установку pip, так и установку conda.
Если он сообщает о призрачной ошибке: TqdmWarning: IProgress не найден. Пожалуйста, обновите jupyter и ipywidgets. См. https://ipywidgets.read
жебу
Не бойтесь, вам просто нужно обновить Jupyter.
После того, как я выполнил первые три шага, я обновил и запустил этот шаг программы, и все было в порядке.
————————————————————————————————
Ссылка для скачивания набора данных: https://www.kaggle.com/competitions/titanic/data?select=train.csv
портал
total_df['Embarked_is_nan']=(total_df['Embarked']!=total_df['Embarked'])
Эта строка кода создает новый столбец Embarked_is_nan, который используется для отметки нулевых значений (NaN) в столбце Embarked. Если элемент в столбце «Начало» не является самим собой (т. е. элементом является NaN), соответствующей позиции в новом столбце будет присвоено значение «Истина».
Впервые вижу такое письмо.
keys=['Pclass','Sex','SibSp','Parch']
for key in keys:
values=np.unique(train_df[key].values)
if len(values)<10 and key!="Survived":
print(f"key:{key},values:{values}")
key_target=train_df['Survived'].groupby([train_df[key]]).mean()
keys=key_target.keys().values
target=key_target.values
key_target=pd.DataFrame({key:keys,key+"_target":target})
total_df=pd.merge(total_df,key_target,on=key,how="left")
total_df.head()
Этот фрагмент кода немного сложен. Сначала он отфильтровывает четыре важные функции ['Pclass', 'Sex', 'SibSp', 'Parch'] и сохраняет их в списке ключей. Эти столбцы считаются потенциально связанными. ситуация выживания пассажиров.
Затем пройдитесь по списку один за другим, чтобы увидеть, сколько уникальных значений имеет каждый признак в обучающем наборе.
Если количество уникальных значений len (значений) ключевого столбца меньше 10, код будет дополнительно анализировать связь между этим столбцом и ситуацией выживания.
(Я немного смущен тем, почему ключ!= «Выживший» выделен. В этом списке ключей нет значения «Выживший»??)
Распечатайте его и убедитесь, что все четыре атрибута соответствуют условиям:
key_target=train_df['Survived'].groupby([train_df[key]]).mean()
На этом этапе в обучающем наборе train_df код вычисляет среднюю выживаемость столбца «Выживший», соответствующего каждому уникальному значению в списке ключей.
Как видно из рисунка, значение кадра данных key_target меняется в зависимости от значения атрибута key в каждом цикле. Например, при обработке key = Pclass ключи key_target равны 1, 2 и 3, а значение — соответствующий средний уровень выживаемости; обработка. Когда ключ = пол, ключами key_target являются «Женский» и «Мужской», а значения также являются соответствующими средними показателями выживаемости.
Последующие шаги немного сложны. Нарисуйте таблицу слов, чтобы понять ее:
Всего в ключах четыре атрибута. Один из них будет использоваться для каждого случая. Наконец, данные четырех атрибутов будут сохранены в total_df, суммированы и возвращены.
Это случай PClass. PClass имеет три значения: 1/2/3. Средняя выживаемость рассчитывается для каждого значения и сохраняется в key_target.
Затем ключ key_target извлекается и сохраняется в списке ключей (да, этот список еще называется ключами..., но на этот раз значения в нем должны быть тремя значениями 1/ 2/3 PClass), а значение сохраняется в целевом списке (то есть три числа 0,629630, 0,472826, 0,242363), а затем искусственно называют два столбца ключа и значения. Ключевой столбец также называется PClass. , а столбец значений более персонализирован и должен называться «PClass_target».
По аналогии, все следующие три атрибута key_target находятся в этой подпрограмме, но таблица total_df постоянно расширяется.
(мужское слово за пределами поля, картинка вырезана, позже добавлен отдельный кусок)
Пока, наконец, total_df не станет большой таблицей:
Честно говоря, в случае с Optuna, основная цель которого — научить людей пользоваться инструментом настройки параметров, логика, написанная оригинальным автором на этом этапе, действительно увеличила для меня бремя понимания...
Я попросил Кими переписать этот код в более понятную и простую версию, чтобы было нелегко перепутать столько клавиш и целей, заполняющих экран:
Эта часть не является основной задачей этапа настройки параметров. Если вы действительно этого не понимаете, вы можете пропустить ее. ——————————————————————————————————————————
Используйте среднее значение для заполнения пропущенных значений. Отметьте общие этапы обработки данных, которые вы узнали.
Дополнение: Когда я раньше проходил курс анализа данных и визуализации таблиц, учитель поделился публикацией, в которой конкретно были представлены многие типы недостающих данных и методы обработки: https://towardsdatascience.com/all-about-missing-data-handling-b94b8b5d2184
Добавить описание ссылки
Пост на английском языке, для его просмотра вам необходимо зарегистрироваться и войти.
————————————————————————————————————————————
После получения набора данных total_df со все более полными атрибутами он снова делится на обучающий набор и тестовый набор в соответствии с предыдущей длиной.
————————————————————————————————————————————
Здесь упоминается, что соотношение обучающего набора и тестового набора составляет 8:2, то есть 4:1, что является очень распространенным соотношением деления.
Первоначальный автор, вероятно, считал проверку и валидность одним и тем же, поэтому особого различия в названиях не было.
Но на самом деле эти два понятия не совсем одинаковы (но я вижу, что иногда различие не строгое. Здесь я использую единый метод написания test_X и test_y).
————————————————————————————————————————————
ИмпортироватьЛГБМ-регрессор , хотя набор данных «Титаника» в основном используется для задач классификации (предсказания, выживет ли пассажир), первоначальный автор рассматривает его здесь как задачу регрессии. Я посчитал, что новичкам будет проще начать, выбрав учебник с простым и знакомым набором данных и видеообъяснением, поэтому не беспокоился о деталях задач регрессии или классификации. Как только вы овладеете этим процессом, вы сможете найти в Интернете более сложные и стандартизированные данные для практики.
Дополнительная ссылка для обучения: «Настройка параметра LGMBRegressor параметр lgbmclassifier»
https://blog.51cto.com/u_12219/10333606
Добавить описание ссылки
(Кстати, разве в этом посте нет классификатора ЛГБМ? Почему автор в видео специально упомянул о решении проблем регрессии?)
————————————————————————————————————————————
RMSE как функция потерь, то есть индекс оценки, представляет собой функцию Python, которая вычисляет среднеквадратическую ошибку (Root Mean Square Error).Чем меньше, тем лучше。
————————————————————————————————————————————
Установите параметры цели задачи согласно оригинальному авторскому видеообъяснению:
Конкретные имена, значения и рекомендуемые значения параметров можно найти в дополнительном учебном посте «Настройка параметра LGBMRegressor Параметр lgbmclassifier» выше.
def objective(trial):
param = {
'metric':'rmse',
'random_state':trial.suggest_int('random_state', 2023, 2023), #随机种子固定,所以设置为2023-2023
'n_estimators':trial.suggest_int('n_estimators', 50, 300), #迭代器数量 50-300 的整数
'reg_alpha':trial.suggest_loguniform('reg_alpha', 1e-3, 10.0),
'reg_lambda':trial.suggest_loguniform('reg_lambda', 1e-3, 10.0), #对数正态分布的建议值
'colsample_bytree':trial.suggest_float('colsample_bytree', 0.5, 1), #浮点数
'subsample':trial.suggest_float('subsample', 0.5, 1),
'learning_rate':trial.suggest_float('learning_rate', 1e-4, 0.1, log = True),
'num_leaves':trial.suggest_int('num_leaves', 8, 64), #整数
'min_child_samples':trial.suggest_int('min_child_smaples', 1, 100),
}
model = LGBMRegressor(**param) #调用模型
model.fit(train_X, train_y, eval_set = [(test_X, test_y)], early_stopping_rounds = 100, verbose = False) #拟合
preds = model.predict(test_X) #计算测试集的损失
rmse = RMSE(test_y, preds)
return rmse
————————————————————————————————————————————
Код ключа: Позвоните в Оптуну, создайте задачу обучения, укажите минимальные потери и задайте имя задачи:
#创建的研究命名,找最小值
study = optuna.create_study(direction = 'minimize', study_name = 'Optimize boosting hpyerparameters') #创建了一个Optuna研究对象,用于优化超参数。
#关键代码:调用Optuna,创建一个学习任务,指定让损失最小,设置任务名称。
#目标函数,尝试的次数
study.optimize(objective, n_trials = 100) #将设定好参数的object任务传进来,尝试一百次
#输出最佳的参数
print('Best Trial: ',study.best_trial.params) #找到最佳参数 tudy.best_trial 表示在所有尝试中损失最小的那次试验,params 是一个字典,包含了那次试验中使用的超参数。
lgbm_params = study.best_trial.params #这行代码将最佳参数赋值给 lgbm_params 变量。这样可以将这些参数用于LightGBM模型或其他需要这些超参数的模型。
————————————————————————————————————————————
Идея хороша, но мы столкнулись со странной ошибкой: функция fit() получила неожиданный аргумент ключевого слова «early_stopping_rounds»:
Метод Кими по-прежнему выдавал ошибку после его применения, так что, вероятно, не мы должны брать на себя вину.
Мастера StackFlow предлагают два решения:
https://stackoverflow.com/questions/76895269/lgbmclassifier-fit-got-an-unexpected-keyword-argument-early-stopping-rounds
портал
Обратите внимание, что лучше всего использовать установку pip, установка conda, похоже, не может быть установлена.
Но я обнаружил, что это бесполезно... У меня все та же ошибка, я не распознал Early_stopping_rounds, и даже после его удаления я не распознал следующий подробный параметр...
Изменить параметры согласно предыдущему дополнительному посту не представляется возможным. Похоже, обновление информации отстает...
————————————————————————————————————————————
В процессе поиска я также обнаружил точку, подверженную ошибкам: у Early_stopping_rounds, кажется, есть максимальный предел только 100.
https://blog.csdn.net/YangTinTin/article/details/120708391
портал
————————————————————————————————————————————
Я поискал вручную в Интернете и спросил Кими, но пока не нашел очень эффективной альтернативы. Поскольку в основном мы хотим опробовать использование Optuna, сначала удалим эти два неприятных параметра.
model.fit(train_X, train_y, eval_set=[(test_X, test_y)]) #拟合
Полный код цели:
def objective(trial):
param = {
'metric':'rmse',
'random_state':trial.suggest_int('random_state', 2023, 2023), #随机种子固定,所以设置为2023-2023
'n_estimators':trial.suggest_int('n_estimators', 50, 300), #迭代器数量 50-300 的整数
'reg_alpha':trial.suggest_loguniform('reg_alpha', 1e-3, 10.0),
'reg_lambda':trial.suggest_loguniform('reg_lambda', 1e-3, 10.0), #对数正态分布的建议值
'colsample_bytree':trial.suggest_float('colsample_bytree', 0.5, 1), #浮点数
'subsample':trial.suggest_float('subsample', 0.5, 1),
'learning_rate':trial.suggest_float('learning_rate', 1e-4, 0.1, log = True),
'num_leaves':trial.suggest_int('num_leaves', 8, 64), #整数
'min_child_samples':trial.suggest_int('min_child_smaples', 1, 100),
}
model = LGBMRegressor(**param) #调用模型
model.fit(train_X, train_y, eval_set=[(test_X, test_y)]) #拟合
preds = model.predict(test_X) #计算测试集的损失
rmse = RMSE(test_y, preds)
return rmse
Тогда ты можешьGetBest_TrialПолучил:
————————————————————————————————————————————
Аналогично, оригинальный UP также использовалxgboost и catboostПодобные методы используются для поиска оптимальных параметров.
Нетрудно заметить, что основное различие между тремя различными методами заключается в выбранном параметре и методе функции, указанном моделью.
XGBoost:
Результаты XGBoost:
————————————————————————————————————————————
CatBoost:
Результаты CatBoost:
————————————————————————————————————————————
последний используемыйK-кратная перекрестная проверкаПолучите наилучшие результаты:
Перекрестная проверка также является широко используемым термином в машинном обучении.
def accuracy(y_true, y_pred):
return np.sum(y_true == y_pred)/len(y_true)
kf — это объект KFold, который представляет собой инструмент в библиотеке scikit-learn для реализации перекрестной проверки K-fold. KFold делит набор данных наn_splits подмножеств, каждое подмножествоПо очереди в качестве набора проверки, а остальные служат обучающим набором.
для train_index — valid_index в kf.split(x): эта строка кода будет перебирать объект KFold, возвращая два массива для каждой итерации: train_index и valid_index.train_index содержит индекс точки данных, используемой для обучения, а valid_index содержит индекс точки данных, используемой для проверки. . В соответствии с индексом полного набора X, y вы можете получить данные обучающего набора и проверочного набора для каждого раза. Этот процесс подобен разрушению всего класса, каждый раз случайным образом выбирая несколько студентов и вызывая группу студентов.
————————————————————————————————————————————
Теперь я столкнулся с еще одной распространенной ошибкой. Хотя я не знаю, как это произошло, я не знаю, стоит ли Python снова брать на себя вину. (Поскольку формы наборов данных X и Y были точно такими же, как у автора раньше, логически с ними больше не будет никаких других операций...)
Не бойтесь, если у вас возникнут проблемы, исправьте их! В этом ты должен доверять Кими! (Кстати, сотрудники компании по искусственному интеллекту, где я стажируюсь, тоже используют Кими, так что Кими относительно надежен, и это бесплатно!!)
Не забудьте одновременно отключить параметры Early_stopping_rounds и verbose, чтобы избежать возникновения еще одной ошибки.
Этот фрагмент кода относительно длинный и в нем много повторений. Будьте осторожны, не допустите ошибок.
from sklearn.model_selection import KFold #在机器学习库中导入k折交叉验证的函数
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor
def accuracy(y_true,y_pred):
return np.sum(y_true==y_pred)/len(y_true)
print("start fit.")
folds = 10 #将数据分成10份
y=train_df['Survived']
X=train_df.drop(['Survived'],axis=1)
train_accuracy=[]
valid_accuracy=[]
# 存储已学习模型的列表
models = []
#将数据集随机打乱,并分成folds份
kf = KFold(n_splits=folds, shuffle=True, random_state=2023)
#从x_train中按照9:1的比例分成训练集和验证集,并取出下标
for train_index, valid_index in kf.split(X):
#根据下标取出训练集和验证集的数据
x_train_cv = X.iloc[train_index]
y_train_cv = y.iloc[train_index]
x_valid_cv =X.iloc[valid_index]
y_valid_cv = y.iloc[valid_index]
model = LGBMRegressor(**lgbm_params)
#模型用x_train_cv去训练,用x_train_cv和x_valid_cv一起去评估
model.fit(
x_train_cv,
y_train_cv,
eval_set = [(x_train_cv, y_train_cv), (x_valid_cv, y_valid_cv)],
#early_stopping_rounds=100,
#verbose = 100, #迭代100次输出一个结果
)
#对训练集进行预测
y_pred_train = model.predict(x_train_cv)
#对验证集进行预测
y_pred_valid = model.predict(x_valid_cv)
y_pred_train=(y_pred_train>=0.5)
y_pred_valid=(y_pred_valid>=0.5)
train_acc=accuracy(y_pred_train,y_train_cv)
valid_acc=accuracy(y_pred_valid,y_valid_cv)
train_accuracy.append(train_acc)
valid_accuracy.append(valid_acc)
#将model保存进列表中
models.append(model)
model = XGBRegressor(**xgb_params)
#模型用x_train_cv去训练,用x_train_cv和x_valid_cv一起去评估
model.fit(
x_train_cv,
y_train_cv,
eval_set = [(x_train_cv, y_train_cv), (x_valid_cv, y_valid_cv)],
#early_stopping_rounds=100,
#verbose = 100, #迭代100次输出一个结果
)
#对训练集进行预测
y_pred_train = model.predict(x_train_cv)
#对验证集进行预测
y_pred_valid = model.predict(x_valid_cv)
y_pred_train=(y_pred_train>=0.5)
y_pred_valid=(y_pred_valid>=0.5)
train_acc=accuracy(y_pred_train,y_train_cv)
valid_acc=accuracy(y_pred_valid,y_valid_cv)
train_accuracy.append(train_acc)
valid_accuracy.append(valid_acc)
#将model保存进列表中
models.append(model)
model = CatBoostRegressor(**cat_params)
#模型用x_train_cv去训练,用x_train_cv和x_valid_cv一起去评估
model.fit(
x_train_cv,
y_train_cv,
eval_set = [(x_train_cv, y_train_cv), (x_valid_cv, y_valid_cv)],
#early_stopping_rounds=100,
#verbose = 100, #迭代100次输出一个结果
)
#对训练集进行预测
y_pred_train = model.predict(x_train_cv)
#对验证集进行预测
y_pred_valid = model.predict(x_valid_cv)
y_pred_train=(y_pred_train>=0.5)
y_pred_valid=(y_pred_valid>=0.5)
train_acc=accuracy(y_pred_train,y_train_cv)
valid_acc=accuracy(y_pred_valid,y_valid_cv)
train_accuracy.append(train_acc)
valid_accuracy.append(valid_acc)
#将model保存进列表中
models.append(model)
print(f"train_accuracy:{train_accuracy}, valid_accuracy:{valid_accuracy}")
train_accuracy=np.array(train_accuracy)
valid_accuracy=np.array(valid_accuracy)
print(f"mean_train_accuracy: {np.mean(train_accuracy)}")
print(f"mean_valid_accuracy: {np.mean(valid_accuracy)}")
Промежуточный вывод между мной и первоначальным автором несколько отличается, не знаю, в чем причина разрыва:
Но, к счастью, похоже, что результаты пока не так уж и плохи:
————————————————————————————————————————————
Проверьте производительность каждой модели на тестовом наборе:
test_X = test_df.drop(['Survived'], axis = 1).values
preds_test = []
#用每个保存的模型都对x_test预测一次,然后取平均值
for model in models:
pred = model.predict(test_X)
preds_test.append(pred)
#将预测结果转换为np.array
preds_test_np = np.array(preds_test)
#按行对每个模型的预测结果取平均值
test_pred= preds_test_np.mean(axis = 0 )
test_pred=(test_pred >= 0.5).astype(np.int64)
#平均预测值与 0.5 进行比较,根据比较结果(大于等于 0.5 为 True,否则为 False)将每个值转换为二进制形式(即 1 或 0),然后使用 astype(np.int64) 将布尔值转换为 64 位整数类型。
test_pred
Посмотрите на выходные данные test_pred.shape. Не смотрите на квадратную форму массива. Посмотрите на форму как на одномерный массив с 418 элементами.
В Python форма одномерного массива обычно представляется как (N), где N — общее количество элементов массива.
————————————————————————————————————————————
В предложении test_pred=(test_pred >= 0.5).astype(np.int64) существует множество примеров создания нового столбца и сравнения размера для присвоения логического значения True или False. В этом отношении есть много примеров. проект:
————————————————————————————————————————————
Наконец сохраните и запишите в файл CSV:
submission=pd.read_csv("D:/StudyFiles/Optuna_Titanic/data/gender_submission.csv") #读取CSV文件,并将其存储在变量submission中
submission['Survived']=test_pred #更新了submission DataFrame中的'Survived'列,使其包含模型预测的生存概率或分类结果。
submission.to_csv("submission.csv",index=None) #将更新后的submission DataFrame保存为一个新的CSV文件"submission.csv"。参数index=None表示在保存CSV文件时不包括行索引。
submission.head()
————————————————————————————————————————————
Я отправлю свой пакет кода на домашнюю страницу CSDN. Друзья, нуждающиеся в этом, могут загрузить его самостоятельно. Увидимся в следующем уроке.
————————————————————————————————————————————
Другой связанный учебный контент:
(1) **9.1 Регулировка параметров модели [Стэнфорд, 21 осень: Практическое машинное обучение, китайское издание]: **Видео учителя Ли Му представляет некоторые теории о настройке параметров. Если вы не понимаете настройку параметров, вы можете посмотреть его, чтобы изучить. базовые знания. .
https://www.bilibili.com/video/BV1vQ4y1e7LF/?spm_id_from=333.788.recommend_more_video.1&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
портал
(два) Этот автоматический инструмент регулировки женьшеня просто слишком мощный! Он может полностью удовлетворить ежедневное использование машинного обучения и настройку параметров глубокого обучения! Незаменимый инструмент для новичков!: Содержание видео не так хорошо, как демонстрационное видео, за которым я следил. В нем в основном кратко рассказывается об Оптуне без каких-либо практических примеров.
https://www.bilibili.com/video/BV1Zs421K7Qj/?spm_id_from=333.788.recommend_more_video.6&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
портал
Однако меня очень заинтересовала книга, представленная этим УП, потому что для такого новичка, как я, которому не хватает опыта и который любит находить правила, я очень надеюсь получить путеводитель, который сможет познакомить меня с некоторыми универсальными формулами и направлениями.