前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 Optuna 优化你的优化器

使用 Optuna 优化你的优化器

作者头像
磐创AI
发布于 2021-10-27 08:08:59
发布于 2021-10-27 08:08:59
2.7K00
代码可运行
举报
运行总次数:0
代码可运行

磐创AI分享

作者 | Sion

编译 | Flin

来源 | analyticsvidhya

介绍

Optuna 是一个最先进的自动超参数调整框架,完全用 Python 编写。在过去的 2 年里,Kaggle社区一直在广泛使用它,具有巨大的竞争力。在本文中,我们将有一个实际操作的方法,并了解它的工作原理。

什么是Optuna?

Optuna 是一个自动超参数调优软件框架,专为机器学习而设计,可以与 PyTorch、TensorFlow、Keras、SKlearn 等其他框架一起使用。

Optuna 使用一种称为运行定义 API 的东西,它帮助用户编写高度模块化的代码并动态构建超参数的搜索空间,我们将在本文后面学习。

使用网格搜索、随机、贝叶斯和进化算法等不同的采样器来自动找到最佳参数。让我们简要讨论一下 Optuna 中可用的不同采样器。

  • 网格搜索:搜索目标算法整个超参数空间的预定子集。
  • 贝叶斯:此方法使用概率分布为每个超参数选择一个值。
  • 随机搜索:顾名思义,对搜索空间进行随机采样,直到满足停止条件。
  • 进化算法:适应度函数用于找到超参数的值。

但是是什么让它在 Kaggler 中如此受欢迎呢?

以下是他们在网站上提到的主要功能:

1) 轻量级和多功能:需要一个简单的安装,然后你就可以开始了。可以处理广泛的任务并找到最佳的替代方案。

2) 渴望搜索空间:使用熟悉的 Pythonic 语法(如条件和循环)来自动搜索最佳超参数。

3)最先进的算法:快速搜索大空间,并更快地剪枝没有希望的试验,以获得更好、更快的结果。

4) 轻松并行化:可以轻松地并行化超参数搜索,而对原始代码几乎没有更改。

5)快速可视化:各种可视化功能也可用于可视化分析优化结果。

在开始本教程之前,我们必须了解一些 Optuna 术语和约定。

Optuna 术语

在 Optuna 中,有两个主要术语,即:

1) Study:整个优化过程基于一个目标函数,即研究需要一个可以优化的函数。

2) Trial:优化函数的单次执行称为trial。因此,这项研究(Study)是一系列试验(trial)。

将使用 Optuna 的数据集

在本文中,我们将使用来自ASHRAE – Great Energy Predictor III的数据集,这是一项 Kaggle 竞赛,用于预测建筑物消耗的能源量。数据集的大小为 2.5 Gb,因此非常大。

为了便于使用,数据被分成几个文件。为了训练我们的模型,我们提供了train.csvweather_train.csvbuilding_metadata.csv

除此之外,我们还有一些 trs.csv 文件。以下是文件的简要说明以及显示的列。

加载库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import gc
import os
from pathlib import Path
import random
import sys

from tqdm import tqdm_notebook as tqdm
import numpy as np # linear algebra
import pandas as pd # data processing

import matplotlib.pyplot as plt
import seaborn as sns

from IPython.core.display import display, HTML

# --- plotly ---
from plotly import tools, subplots
import plotly.offline as py
py.init_notebook_mode(connected=True)
import plotly.graph_objs as go
import plotly.express as px
import plotly.figure_factory as ff

# --- models ---
from sklearn import preprocessing
from sklearn.model_selection import KFold
import lightgbm as lgb
import xgboost as xgb
import catboost as cb

读取数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%time

# Read data...
root = '../input/ashrae-energy-prediction'

train_df = pd.read_csv(os.path.join(root, 'train.csv'))
weather_train_df = pd.read_csv(os.path.join(root, 'weather_train.csv'))
test_df = pd.read_csv(os.path.join(root, 'test.csv'))
weather_test_df = pd.read_csv(os.path.join(root, 'weather_test.csv'))
building_meta_df = pd.read_csv(os.path.join(root, 'building_metadata.csv'))
sample_submission = pd.read_csv(os.path.join(root, 'sample_submission.csv'))

数据预处理

我们本次比赛的目标是预测建筑物的能源消耗。我们必须预测的 4 种能量类型是:

标签

能量类型

0

1

冷冻水

2

蒸汽

3

热水

电和水的消耗量可能会有所不同,并且具有不同的预测因素。所以我分别训练和预测了模型。

删除奇怪的数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_df['date'] = train_df['timestamp'].dt.date
train_df['meter_reading_log1p'] = np.log1p(train_df['meter_reading'])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def plot_date_usage(train_df, meter=0, building_id=0):
    train_temp_df = train_df[train_df['meter'] == meter]
    train_temp_df = train_temp_df[train_temp_df['building_id'] == building_id]    
    train_temp_df_meter = train_temp_df.groupby('date')['meter_reading_log1p'].sum()
    train_temp_df_meter = train_temp_df_meter.to_frame().reset_index()
    fig = px.line(train_temp_df_meter, x='date', y='meter_reading_log1p')
    fig.show()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot_date_usage(train_df, meter=0, building_id=0)

如你所见,2016 年 5 月中旬之前的数据看起来很奇怪,因为它位于图表的底部。这样做的原因是直到 5 月 20 日,对于site_id == 0 的所有电表读数都是0。一位与会者指出了这一点。因此,合乎逻辑的做法是删除该数据段。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
building_meta_df[building_meta_df.site_id == 0]

因此我们可以看到所有带有site_id == 0的条目都有building_id <= 104。现在我们删除它们:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_df = train_df.query('not (building_id <= 104 & meter == 0 & timestamp <= "2016-05-20")')

添加时间功能

我们可以使用时间戳特性来获得更好的特征。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def preprocess(df):
    df["hour"] = df["timestamp"].dt.hour
    df["month"] = df["timestamp"].dt.month
    df["dayofweek"] = df["timestamp"].dt.dayofweek
    df["weekend"] = df["dayofweek"] >= 5
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
preprocess(train_df)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_group = train_df.groupby(['building_id', 'meter'])['meter_reading_log1p']
building_mean = df_group.mean().astype(np.float16)
building_median = df_group.median().astype(np.float16)
building_min = df_group.min().astype(np.float16)
building_max = df_group.max().astype(np.float16)
building_std = df_group.std().astype(np.float16)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
building_stats_df = pd.concat([building_mean, building_median, building_min, building_max, building_std], axis=1,
                              keys=['building_mean', 'building_median', 'building_min', 'building_max', 'building_std']).reset_index()
train_df = pd.merge(train_df, building_stats_df, on=['building_id', 'meter'], how='left', copy=False)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_df.head()

(注意:以上代码段中未包含所有列

填充 NaN 值

天气数据有很多NaN 值,所以我们不能直接去掉条目。我们将尝试通过插入数据来填充这些值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
weather_train_df.head()

(注意:以上代码段中未包含所有列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
weather_train_df.isna().sum()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
weather_test_df = pd.read_feather(root/'weather_test.feather')
weather = pd.concat([weather_train_df, weather_test_df],ignore_index=True)
del weather_test_df
weather_key = ['site_id', 'timestamp']
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
temp_skeleton = weather[weather_key + ['air_temperature']].drop_duplicates(subset=weather_key).sort_values(by=weather_key).copy()

temp_skeleton['temp_rank'] = temp_skeleton.groupby(['site_id', temp_skeleton.timestamp.dt.date])['air_temperature'].rank('average')

df_2d = temp_skeleton.groupby(['site_id', temp_skeleton.timestamp.dt.hour])['temp_rank'].mean().unstack(level=1)

site_ids_offsets = pd.Series(df_2d.values.argmax(axis=1) - 14)
site_ids_offsets.index.name = 'site_id'

def timestamp_align(df):
    df['offset'] = df.site_id.map(site_ids_offsets)
    df['timestamp_aligned'] = (df.timestamp - pd.to_timedelta(df.offset, unit='H'))
    df['timestamp'] = df['timestamp_aligned']
    del df['timestamp_aligned']
    return df

del weather
del temp_skeleton
gc.collect()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
weather_train_df = timestamp_align(weather_train_df)
weather_train_df = weather_train_df.groupby('site_id').apply(lambda group: group.interpolate(limit_direction='both'))

现在,我们数据集中的 NaN 值数量已显着减少。

添加滞后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def add_lag_feature(weather_df, window=3):
    group_df = weather_df.groupby('site_id')
    c = ['dew_temperature', 'cloud_coverage', 'precip_depth_1_hr', 'air_temperature', 'sea_level_pressure', 'wind_direction', 'wind_speed']
    cols = c
    rolled = group_df[cols].rolling(window=window, min_periods=0)
    lag_mean = rolled.mean().reset_index().astype(np.float16)
    lag_max = rolled.max().reset_index().astype(np.float16)
    lag_min = rolled.min().reset_index().astype(np.float16)
    lag_std = rolled.std().reset_index().astype(np.float16)
    for col in cols:
        weather_df[f'{col}_mean_lag{window}'] = lag_mean[col]
        weather_df[f'{col}_max_lag{window}'] = lag_max[col]
        weather_df[f'{col}_min_lag{window}'] = lag_min[col]
        weather_df[f'{col}_std_lag{window}'] = lag_std[col]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_lag_feature(weather_train_df, window=3)
add_lag_feature(weather_train_df, window=72)

现在,加入滞后,我们将对primary_use列进行分类,以减少合并时的内存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
primary_use_list = building_meta_df['primary_use'].unique()
primary_use_dict = {key: value for value, key in enumerate(primary_use_list)} 
print('primary_use_dict: ', primary_use_dict)
building_meta_df['primary_use'] = building_meta_df['primary_use'].map(primary_use_dict)

gc.collect()

使用 Optuna 进行模型训练

在本节中,我们将学习如何使用 Optuna。但首先,让我们将列分为分类值和数字特征。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
category_columns = ['building_id', 'site_id', 'primary_use']
weather_columns = [
    'air_temperature', 'cloud_coverage',
    'dew_temperature', 'precip_depth_1_hr', 'sea_level_pressure',
    'wind_direction', 'wind_speed', 'air_temperature_mean_lag72',
    'air_temperature_max_lag72', 'air_temperature_min_lag72',
    'air_temperature_std_lag72', 'cloud_coverage_mean_lag72',
    'dew_temperature_mean_lag72', 'precip_depth_1_hr_mean_lag72',
    'sea_level_pressure_mean_lag72', 'wind_direction_mean_lag72',
    'wind_speed_mean_lag72', 'air_temperature_mean_lag3',
    'air_temperature_max_lag3',
    'air_temperature_min_lag3', 'cloud_coverage_mean_lag3',
    'dew_temperature_mean_lag3',
    'precip_depth_1_hr_mean_lag3', 'sea_level_pressure_mean_lag3',
    'wind_direction_mean_lag3', 'wind_speed_mean_lag3']
feature_columns = ['square_feet', 'year_built'] + [
    'hour', 'weekend', 'dayofweek', # 'month'
    'building_median'] + weather_cols
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def create_X_y(train_df, target_meter):
    target_train_df = train_df[train_df['meter'] == target_meter]
    target_train_df = target_train_df.merge(building_meta_df, on='building_id', how='left')
    target_train_df = target_train_df.merge(weather_train_df, on=['site_id', 'timestamp'], how='left')
    X_train = target_train_df[feature_cols + category_cols]
    y_train = target_train_df['meter_reading_log1p'].values

    del target_train_df
    return X_train, y_train

定义 “目标”函数

使用 Optuna 完成的每个超参数调整项目都从一个目标函数开始,我们必须在其中决定优化所依据的指标。

一个试验对象是一个目标函数的输入,并返回一个分数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def objective(trial, ...):
    # calculate score...
    return score

现在我们将为电表训练 LightGBM 模型,获得最佳验证分数并将该分数作为最终分数返回。让我们开始!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import optuna
from optuna import Trial
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
debug = False

train_df_original = train_df
# Only using 10000 data,,, for fast computation for debugging.
train_df = train_df.sample(10000)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def objective(trial: Trial, fast_check=True, target_meter=0, return_info=False):
    folds = 5
    seed = 666
    shuffle = False
    kf = KFold(n_splits=folds, shuffle=shuffle, random_state=seed)
    X_train, y_train = create_X_y(train_df, target_meter=target_meter)
    y_valid_pred_total = np.zeros(X_train.shape[0])
    gc.collect()
    print('target_meter', target_meter, X_train.shape)
    L = [X_train.columns.get_loc(cat_col) for cat_col in category_cols]
    categorical_features = L
    print('cat_features', categorical_features)
    models = []
    valid_score = 0
    for train_idx, valid_idx in kf.split(X_train, y_train):
        train_data = X_train.iloc[train_idx,:], y_train[train_idx]
        valid_data = X_train.iloc[valid_idx,:], y_train[valid_idx]
        print('train', len(train_idx), 'valid', len(valid_idx))
        a, b, c = fit_lgbm(trial, train_data, valid_data, cat_features=category_cols,
                                            num_rounds=1000)
        model, y_pred_valid, log = a, b, c
        y_valid_pred_total[valid_idx] = y_pred_valid
        models.append(model)
        gc.collect()
        valid_score += log["valid/l2"]
        if fast_check:
            break
    valid_score /= len(models)
    if return_info:
        return valid_score, models, y_pred_valid, y_train
    else:
        return valid_score

fit_lgbm函数具有核心训练码,并定义了超参数。

接下来,我们将熟悉“trial” 模块的内部工作原理。

使用“trial”模块动态定义超参数

这是使用 Optuna 代码与传统定义并运行代码之间的比较:

这是Define-by-run 的优势。这使得用户更容易编写直观的代码来获取超参数,而不是预先定义整个搜索空间。

你可以使用这些方法来获取超参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Categorical parameter
optimizer = trial.suggest_categorical('optimizer', ['MomentumSGD', 'Adam'])

# Int parameter
num_layers = trial.suggest_int('num_layers', 1, 3)

# Uniform parameter
dropout_rate = trial.suggest_uniform('dropout_rate', 0.0, 1.0)

# Loguniform parameter
learning_rate = trial.suggest_loguniform('learning_rate', 1e-5, 1e-2)

# Discrete-uniform parameter
drop_path_rate = trial.suggest_discrete_uniform('drop_path_rate', 0.0, 1.0, 0.1)

现在让我们创建一个简单的 Lightgbm 模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fit_lgbm(trial, train, val, devices=(-1,), seed=None, cat_features=None, num_rounds=1500):
    """Train Light GBM model"""
    X_train, y_train = train
    X_valid, y_valid = val
    metric = 'l2'
    params = {
        'num_leaves': trial.suggest_int('num_leaves', 2, 256),
        'objective': 'regression',
        'max_depth': -1,
        'learning_rate': 0.1,
        "boosting": "gbdt",
        'lambda_l1': trial.suggest_loguniform('lambda_l1', 1e-8, 10.0),
        'lambda_l2': trial.suggest_loguniform('lambda_l2', 1e-8, 10.0),
        "bagging_freq": 5,
        "bagging_fraction": trial.suggest_uniform('bagging_fraction', 0.1, 1.0),
        "feature_fraction": trial.suggest_uniform('feature_fraction', 0.4, 1.0),
        "metric": metric,
        "verbosity": -1,
    }
    device = devices[0]
    if device == -1:
        # use cpu
        pass
    else:
        # use gpu
        print(f'using gpu device_id {device}...')
        params.update({'device': 'gpu', 'gpu_device_id': device})

    params['seed'] = seed

    early_stop = 20
    verbose_eval = 20

    d_train = lgb.Dataset(X_train, label=y_train, categorical_feature=cat_features)
    d_valid = lgb.Dataset(X_valid, label=y_valid, categorical_feature=cat_features)
    watchlist = [d_train, d_valid]

    print('training LGB:')
    model = lgb.train(params,
                      train_set=d_train,
                      num_boost_round=num_rounds,
                      valid_sets=watchlist,
                      verbose_eval=verbose_eval,
                      early_stopping_rounds=early_stop)

    # predictions
    y_pred_valid = model.predict(X_valid, num_iteration=model.best_iteration)

    print('best_score', model.best_score)
    log = {'train/l2': model.best_score['training']['l2'],
           'valid/l2': model.best_score['valid_1']['l2']}
    return model, y_pred_valid, log

现在是优化的时候了!

做“学习”,优化!

在使用“trial”模块定义目标函数并找到超参数后,我们都准备好进行调整了。

只需 2 行代码,所有的超参数调优就可以完成了!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
study = optuna.create_study()
study.optimize(objective, n_trials=10)

由于 n_trials 的值为 10,因此输出相当大。因此,在下面的屏幕截图中,我将只包括最后一次试验:

就是这样!!你的超参数已调整!!

“trial”与“Study”:总结

Trial通过指定超参数的一次试验来管理模型训练、评估和获得分数的所有单次执行。

Study管理并记录所有已执行的试验。该记录帮助我们了解最佳超参数并建议下一个要搜索的参数空间。

剪枝以加快搜索

optuna 中,有一种先进而有用的技术是对那些没有希望的试验进行剪枝。

对于那些不熟悉什么是剪枝的人来说,它是一种在 ML 搜索算法中压缩数据的技术,它通过消除冗余和不重要的数据来对实例进行分类来减小决策树的大小。

因此剪枝可以提高最终分类器的复杂性并防止过度拟合。Optuna 中提供了对多个流行 ML 框架的集成,用户可以使用它在超参数训练期间尝试剪枝。例子:

  • XGBoost:optuna.integration.XGBoostPruningCallback
  • LightGBM:optuna.integration.LightGBMPruningCallback
  • Chainer:optuna.integration.ChainerPruningExtension
  • keras:optuna.integration.KerasPruningCallback
  • TensorFlow optuna.integration.TensorFlowPruningHook
  • keras optuna.integration.TFKerasPruningCallback
  • MXNet optuna.integration.MXNetPruningCallback

你可以在此处详细了解这些集成:https://optuna.readthedocs.io/en/stable/reference/integration.html

这是一个使用剪枝创建目标函数的简单示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def objective_with_prune(trial: Trial, fast_check=True, target_meter=0):
    folds = 5
    seed = 666
    shuffle = False
    kf = KFold(n_splits=folds, shuffle=shuffle, random_state=seed)

    X_train, y_train = create_X_y(train_df, target_meter=target_meter)
    y_valid_pred_total = np.zeros(X_train.shape[0])
    gc.collect()
    print('target_meter', target_meter, X_train.shape)
    x = [X_train.columns.get_loc(cat_col) for cat_col in category_cols]
    cat_features = x
    print('cat_features', cat_features)

    models0 = []
    valid_score = 0
    for train_idx, valid_idx in kf.split(X_train, y_train):
        train_data = X_train.iloc[train_idx,:], y_train[train_idx]
        valid_data = X_train.iloc[valid_idx,:], y_train[valid_idx]

        print('train', len(train_idx), 'valid', len(valid_idx))
        model, y_pred_valid, log = fit_lgbm_with_pruning(trial, train_data, valid_data, cat_features=category_cols,
                                                         num_rounds=1000)
        y_valid_pred_total[valid_idx] = y_pred_valid
        models0.append(model)
        gc.collect()
        valid_score += log["valid/l2"]
        if fast_check:
            break
    valid_score /= len(models0)
    return valid_score

使用 Optuna 进行可视化

Optuna 为我们提供了可视化训练和研究历史的选项,以确定具有最佳性能的超参数。最棒的是,所有这些可视化只需要 1 行代码!

优化历史
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
optuna.visualization.plot_optimization_history(study)
剪枝历史
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
optuna.visualization.plot_intermediate_values(study)

所有不同的颜色都显示了每次试验的损失曲线。

切片图
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
optuna.visualization.plot_slice(study)
等高线图

以目标值作为轮廓绘制参数对。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
optuna.visualization.plot_contour(study)
平行坐标图
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
optuna.visualization.plot_parallel_coordinate(study)

尾注

本文只是熟悉Optuna的开始,涵盖了有关如何调整 ML 模型的超参数的大部分基础知识。我们学习了 Optuna 库中使用的术语,如trial和Study。我们还学习了如何定义使用 Optuna 调整所必需的目标函数。

接下来,我们讨论并研究了一些高级概念,例如剪枝,这也是 Optuna 的最佳功能之一。然后我们学习了如何使用 Optuna 的可视化并使用它们来评估和选择最佳超参数。

参考

数据集 – https://www.kaggle.com/c/ashrae-energy-prediction/overview

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【机器学习实战】kaggle背包价格预测(堆叠的实战用法)
该竞赛的数据集是学生背包价格预测数据集中训练的深度学习模型生成的。特征分布与原始分布接近但不完全相同。请随意将原始数据集用作本竞赛的一部分,既要探索差异,又要查看将原始内容纳入训练是否可以改善模型性能。
机器学习司猫白
2025/02/15
1480
使用Optuna进行超参数优化
超参数优化是一项艰巨的任务。但是使用 Optuna 等工具可以轻松应对。在这篇文章中,我将展示如何使用 Optuna 调整 CatBoost 模型的超参数。
deephub
2021/11/08
2.7K0
使用Optuna进行超参数优化
超越stacking, 使用optuna对多模型进行加权融合
有些方案是使用线性回归或者逻辑回归模型进行学习,这种方案一般叫做stacking ensemble,但是这种方案一般是对可微的Loss进行优化的,无法直接对auc,acc等不可微的评价指标进行优化。
lyhue1991
2023/02/23
1.2K0
超越stacking, 使用optuna对多模型进行加权融合
LightGBM+Optuna 建模自动调参教程!
在kaggle机器学习竞赛赛中有一个调参神器组合非常热门,在很多个top方案中频频出现LightGBM+Optuna。知道很多小伙伴苦恼于漫长的调参时间里,这次结合一些自己的经验,给大家带来一个LGBM模型+OPTUNA调参的使用教程,这对可谓是非常实用且容易上分的神器组合了,实际工作中也可使用。
Python数据科学
2023/08/29
1.4K0
LightGBM+Optuna 建模自动调参教程!
模型融合与超参数优化
一般来说,通过融合多个不同的模型,可能提升机器学习的性能,这一方法在各种机器学习比赛中广泛应用, 常见的集成学习&模型融合方法包括:简单的Voting/Averaging(分别对于分类和回归问题)、Stacking、Boosting和Bagging。
致Great
2021/11/24
8860
模型融合与超参数优化
AI 音辨世界:艺术小白的我,靠这个AI模型,速识音乐流派选择音乐 ⛵
音乐领域,借助于歌曲相关信息,模型可以根据歌曲的音频和歌词特征,将歌曲精准进行流派分类。本文讲解如何基于机器学习完成对音乐的识别分类。
ShowMeAI
2022/08/26
1K0
AI 音辨世界:艺术小白的我,靠这个AI模型,速识音乐流派选择音乐 ⛵
optuna可视化调参魔法指南
Optuna是一款开源的调参工具,github star数量超过7k, 是目前最受欢迎的调参框架之一。
lyhue1991
2023/02/23
2.1K0
optuna可视化调参魔法指南
超参数调优的几种框架
在拟合数据训练之前需要设置超参数,以获得更健壮和优化的模型。任何模型的目标都是实现最小化误差,超参数调优(Hyperparameter Tuning / Optimization)有助于实现这一目标。
flavorfan
2022/06/30
1.1K0
超参数调优的几种框架
kaggle入门级竞赛Spaceship Titanic LIghtgbm+Optuna调参
欢迎来到 2912 年,需要您的数据科学技能来解开宇宙之谜。我们收到了来自四光年外的信号,情况看起来不太好。 泰坦尼克号宇宙飞船是一个月前下水的一艘星际客轮。船上载有近 13,000 名乘客,这艘船开始了它的处女航,将太阳系的移民运送到绕附近恒星运行的三颗新的宜居系外行星。 在绕行半人马座阿尔法星前往其第一个目的地(炎热的 55 Cancri E)途中,粗心的泰坦尼克号宇宙飞船与隐藏在尘埃云中的时空异常相撞。可悲的是,它遭遇了与 1000 年前同名的相似命运。虽然飞船完好无损,但几乎一半的乘客都被传送到了异次元! 为了帮助救援人员并找回失踪的乘客,您面临的挑战是使用从飞船损坏的计算机系统中恢复的记录来预测哪些乘客被异常现象运送。
机器学习司猫白
2025/01/21
1740
【机器学习实战】kaggle 欺诈检测---如何解决欺诈数据中正负样本极度不平衡问题
使用机器学习模型识别欺诈性信用卡交易,这样可以确保客户不会为未曾购买的商品承担费用。
机器学习司猫白
2025/01/21
1580
【机器学习实战】kaggle 欺诈检测---如何解决欺诈数据中正负样本极度不平衡问题
CFXplorer: 生成反事实解释的Python包
随着机器学习模型在现实场景中的应用越来越广泛,解释模型的可解释性变得越来越重要。了解模型如何做出决策不仅有益于模型的用户,还有助于受模型决策影响的人们理解。为了解决这个问题,人们开发了反事实解释,因为它们允许个体了解通过扰动原始数据如何实现期望的结果。在短期内,反事实解释可能向受机器学习模型决策影响的人提供可行的建议。例如,一个被拒绝贷款申请的人可以了解这次可以采取什么措施来获得接受,并且这对改进下一次申请是有用的。
磐创AI
2024/06/07
2220
CFXplorer: 生成反事实解释的Python包
Kaggle "$70000奖金池" 竞赛经历分享 — Home Credit 房屋信贷违约风险(一)
推荐导读:本文来源于知识星球中一位星友的投稿,主要分享前不久刚结束的一个Kaggle竞赛 “Home Credit Default Risk” 房屋借贷的违约预测分析。
Python数据科学
2019/07/22
2.6K0
Kaggle "$70000奖金池" 竞赛经历分享 — Home Credit 房屋信贷违约风险(一)
【机器学习实战】kaggle playground最新竞赛,预测贴纸数量--python源码+解析
对于此挑战,你将预测来自不同(真实!)国家/地区的不同虚拟商店的各种 Kaggle 品牌贴纸的多年销售额。该数据集是完全合成的,但包含您在现实世界数据中看到的许多影响,例如周末和假期影响、季节性等。
机器学习司猫白
2025/01/21
1130
【机器学习实战】kaggle playground最新竞赛,预测贴纸数量--python源码+解析
【数据挖掘实战】 房价预测
本次竞赛有 79 个解释变量(几乎)描述了爱荷华州艾姆斯住宅的各个方面,需要预测每套住宅的最终价格。
机器学习司猫白
2025/01/21
1110
【数据挖掘实战】 房价预测
【机器学习实战】 kaggle二手车的价格预测
train.csv - 训练数据集;price是持续目标 test.csv - 测试数据集;您的目标是预测price每一行的值 Sample_submission.csv - 格式正确的示例提交文件 本次比赛的目标是根据各种属性预测二手车的价格。
机器学习司猫白
2025/01/21
1770
【机器学习实战】 kaggle二手车的价格预测
Kaggle系列- Russia房产价格预测top1%(22/3270)方案总结
比赛名称:Sberbank Russian Housing Market 比赛链接:https://www.kaggle.com/c/sberbank-russian-housing-market
致Great
2021/01/18
1K0
期末大作业:客户流失数据可视化分析与预测
在二元问题中,你必须猜测一个示例是否应该归类到特定类别(通常是正类 (1) 和负类 (0)。在本例中,churn 是正类。
数据STUDIO
2024/08/01
3910
期末大作业:客户流失数据可视化分析与预测
【机器学习实战】 手把手教学,kaggle贷款批准预测 (使用xgboost解决正负样本不平衡问题)
train.csv - 训练数据集;loan_status是二进制目标 test.csv - 测试数据集;
机器学习司猫白
2025/01/21
2160
【机器学习实战】 手把手教学,kaggle贷款批准预测 (使用xgboost解决正负样本不平衡问题)
NN和树模型通吃的调参神器Optuna!
本文介绍的一种超参寻优策略则同时解决了上面三个问题,与此同时,该方法在目前kaggle的数据竞赛中也都是首选的调参工具包,其优势究竟有多大,我们看一下其与目前最为流行的一些工具包的对比。
炼丹笔记
2021/07/16
1.8K0
NN和树模型通吃的调参神器Optuna!
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
机器学习模型中的参数通常分为两类:模型参数和超参数。模型参数是模型通过训练数据自动学习得来的,而超参数则是在训练过程开始前需要人为设置的参数。理解这两者的区别是进行有效模型调优的基础。
算法金
2024/07/09
2.3K0
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
推荐阅读
相关推荐
【机器学习实战】kaggle背包价格预测(堆叠的实战用法)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档