参数配置 #
参数分类 #
LightGBM 的参数可以分为以下几类:
text
┌─────────────────────────────────────────────────────────────┐
│ LightGBM 参数分类 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 核心参数 (Core Parameters) │
│ ├── objective: 目标函数 │
│ ├── metric: 评估指标 │
│ └── task: 任务类型 │
│ │
│ 学习参数 (Learning Parameters) │
│ ├── num_leaves: 叶子节点数 │
│ ├── learning_rate: 学习率 │
│ ├── n_estimators: 迭代次数 │
│ └── max_depth: 树深度 │
│ │
│ IO 参数 (IO Parameters) │
│ ├── max_bin: 最大分箱数 │
│ ├── feature_fraction: 特征采样比例 │
│ └── bagging_fraction: 数据采样比例 │
│ │
│ 目标参数 (Objective Parameters) │
│ ├── num_class: 类别数 │
│ ├── is_unbalance: 是否不平衡 │
│ └── scale_pos_weight: 正样本权重 │
│ │
└─────────────────────────────────────────────────────────────┘
核心参数 #
objective(目标函数) #
| 值 | 说明 | 适用场景 |
|---|---|---|
| binary | 二分类 | 二分类问题 |
| multiclass | 多分类 | 多分类问题 |
| regression | 回归 | 回归问题 |
| lambdarank | 排序 | 排序问题 |
| cross_entropy | 交叉熵 | 分类问题 |
| xentropy | 交叉熵 | 分类问题 |
python
params = {
'objective': 'binary'
}
params = {
'objective': 'multiclass',
'num_class': 3
}
params = {
'objective': 'regression'
}
metric(评估指标) #
| 值 | 说明 | 适用场景 |
|---|---|---|
| auc | AUC | 二分类 |
| binary_logloss | 二分类对数损失 | 二分类 |
| multi_logloss | 多分类对数损失 | 多分类 |
| rmse | 均方根误差 | 回归 |
| mae | 平均绝对误差 | 回归 |
| mape | 平均绝对百分比误差 | 回归 |
| ndcg | NDCG | 排序 |
| map | MAP | 排序 |
python
params = {
'objective': 'binary',
'metric': ['auc', 'binary_logloss']
}
params = {
'objective': 'multiclass',
'num_class': 3,
'metric': 'multi_logloss'
}
params = {
'objective': 'regression',
'metric': ['rmse', 'mae']
}
学习参数 #
num_leaves(叶子节点数) #
控制模型复杂度的最重要参数:
python
params = {
'num_leaves': 31
}
调优建议:
- 默认值:31
- 较小值(15-31):简单模型,防过拟合
- 较大值(63-255):复杂模型,可能过拟合
- 经验公式:
num_leaves <= 2^(max_depth)
learning_rate(学习率) #
python
params = {
'learning_rate': 0.05
}
调优建议:
- 默认值:0.1
- 较小值(0.01-0.05):需要更多迭代,模型更稳定
- 较大值(0.1-0.3):快速收敛,可能不精确
- 推荐组合:小学习率 + 大迭代次数
n_estimators(迭代次数) #
python
from lightgbm import LGBMClassifier
clf = LGBMClassifier(
n_estimators=1000,
learning_rate=0.05
)
调优建议:
- 配合早停机制使用
- 学习率越小,需要的迭代次数越多
max_depth(树深度) #
python
params = {
'max_depth': 6
}
调优建议:
- 默认值:-1(不限制)
- 通常不需要设置,用 num_leaves 控制
- 设置时建议 3-10
min_data_in_leaf(叶子最少样本数) #
python
params = {
'min_data_in_leaf': 20
}
调优建议:
- 默认值:20
- 较大值防止过拟合
- 值过大可能导致欠拟合
IO 参数 #
max_bin(最大分箱数) #
python
params = {
'_max_bin': 255
}
调优建议:
- 默认值:255
- 较小值(63-127):更快训练,更少内存
- 较大值(255-511):更高精度,更多内存
feature_fraction(特征采样比例) #
python
params = {
'feature_fraction': 0.8
}
调优建议:
- 默认值:1.0
- 范围:(0, 1]
- 较小值防止过拟合,加速训练
bagging_fraction(数据采样比例) #
python
params = {
'bagging_fraction': 0.8,
'bagging_freq': 5
}
调优建议:
- 默认值:1.0
- 范围:(0, 1]
- 需要配合 bagging_freq 使用
- 较小值防止过拟合
bagging_freq(采样频率) #
python
params = {
'bagging_fraction': 0.8,
'bagging_freq': 5
}
说明:每 5 次迭代进行一次采样
正则化参数 #
lambda_l1(L1 正则化) #
python
params = {
'lambda_l1': 0.1
}
调优建议:
- 默认值:0
- 较大值增加稀疏性
- 范围:[0, ∞)
lambda_l2(L2 正则化) #
python
params = {
'lambda_l2': 0.1
}
调优建议:
- 默认值:0
- 较大值防止过拟合
- 范围:[0, ∞)
min_split_gain(最小分裂增益) #
python
params = {
'min_split_gain': 0.01
}
调优建议:
- 默认值:0
- 较大值防止过拟合
- 范围:[0, ∞)
类别不平衡参数 #
is_unbalance #
python
params = {
'objective': 'binary',
'is_unbalance': True
}
scale_pos_weight #
python
n_pos = np.sum(y_train == 1)
n_neg = np.sum(y_train == 0)
params = {
'objective': 'binary',
'scale_pos_weight': n_neg / n_pos
}
完整参数示例 #
二分类任务 #
python
params = {
'objective': 'binary',
'metric': ['auc', 'binary_logloss'],
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'verbose': -1,
'lambda_l1': 0.1,
'lambda_l2': 0.1,
'min_data_in_leaf': 20
}
多分类任务 #
python
params = {
'objective': 'multiclass',
'num_class': 3,
'metric': 'multi_logloss',
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.8,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'verbose': -1
}
回归任务 #
python
params = {
'objective': 'regression',
'metric': ['rmse', 'mae'],
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'verbose': -1
}
排序任务 #
python
params = {
'objective': 'lambdarank',
'metric': 'ndcg',
'num_leaves': 31,
'learning_rate': 0.05,
'verbose': -1
}
参数调优策略 #
调优顺序 #
text
1. 固定学习率和迭代次数
├── learning_rate = 0.1
└── n_estimators = 1000 (配合早停)
2. 调整树参数
├── num_leaves
├── min_data_in_leaf
└── max_depth (可选)
3. 调整采样参数
├── feature_fraction
├── bagging_fraction
└── bagging_freq
4. 调整正则化参数
├── lambda_l1
├── lambda_l2
└── min_split_gain
5. 降低学习率
└── learning_rate = 0.01
网格搜索示例 #
python
from sklearn.model_selection import GridSearchCV
from lightgbm import LGBMClassifier
clf = LGBMClassifier(random_state=42, verbose=-1)
param_grid = {
'num_leaves': [15, 31, 63],
'learning_rate': [0.01, 0.05, 0.1],
'n_estimators': [100, 200, 500]
}
grid_search = GridSearchCV(
clf, param_grid, cv=5, scoring='roc_auc', n_jobs=-1
)
grid_search.fit(X_train, y_train)
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳分数: {grid_search.best_score_:.4f}")
随机搜索示例 #
python
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint, uniform
param_distributions = {
'num_leaves': randint(15, 127),
'learning_rate': uniform(0.01, 0.3),
'n_estimators': randint(100, 1000),
'feature_fraction': uniform(0.5, 0.5),
'bagging_fraction': uniform(0.5, 0.5),
'lambda_l1': uniform(0, 1),
'lambda_l2': uniform(0, 1)
}
random_search = RandomizedSearchCV(
clf, param_distributions, n_iter=50, cv=5,
scoring='roc_auc', n_jobs=-1, random_state=42
)
random_search.fit(X_train, y_train)
print(f"最佳参数: {random_search.best_params_}")
print(f"最佳分数: {random_search.best_score_:.4f}")
参数默认值 #
| 参数 | 默认值 | 说明 |
|---|---|---|
| num_leaves | 31 | 叶子节点数 |
| learning_rate | 0.1 | 学习率 |
| n_estimators | 100 | 迭代次数 |
| max_depth | -1 | 最大深度(不限制) |
| min_data_in_leaf | 20 | 叶子最少样本数 |
| feature_fraction | 1.0 | 特征采样比例 |
| bagging_fraction | 1.0 | 数据采样比例 |
| bagging_freq | 0 | 采样频率 |
| lambda_l1 | 0 | L1 正则化 |
| lambda_l2 | 0 | L2 正则化 |
| min_split_gain | 0 | 最小分裂增益 |
| max_bin | 255 | 最大分箱数 |
下一步 #
现在你已经掌握了 LightGBM 的参数配置,接下来学习 训练与预测,深入了解模型训练和预测的细节!
最后更新:2026-04-04