LightGBM - 特征交互约束

当 lightgbm 完成对数据集上的集成树的训练后,每个节点都表示由特征值确定的条件。在使用单个树进行预测时,我们从根节点开始,并将节点中给出的特征条件与样本特征值进行比较。我们根据样本中的特征值和树的条件做出决策。这使我们能够通过采取特定路径到达树的叶子来生成最终预测。默认情况下,对哪些节点可以具有哪些功能没有任何限制。

这种通过迭代树的节点并分析特征条件来生成最终决策的方法称为特征交互,因为预测器在评估前一个节点的状态后到达特定节点。LightGBM 使我们能够决定哪些特征可以相互作用。我们可以定义一组索引,只有这些特性才会相互作用。这些特征将无法与其他特征交互,并且在训练阶段生成树时将强制执行此限制。

我们已经展示了如何在 LightGBM 中对估计器强制特征交互约束。LightGBM 估计器有一个名为 interaction_constraints 的参数,它接受一个列表列表,每个列表包含可以相互交互的参数索引。

示例 1

以下是如何在 lightgbm 中对估计器强制特征交互约束的示例。

sklearn.datasets 中的 load_boston 函数可能在某些版本的 scikit-learn 中被弃用。如果发生任何错误,您可以从外部源加载数据集或使用备用数据集。

# 导入必要的库
import lightgbm as lgb
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

# 加载波士顿住房数据集
boston = load_boston()

# 将数据分成训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(boston.data, boston.target, train_size=0.90, random_state=42)

# 打印训练集和测试集的大小
print("Sizes of Train or Test Datasets : ", X_train.shape, X_test.shape, Y_train.shape, Y_test.shape, "
")

# 创建LightGBM 数据集
train_dataset = lgb.Dataset(X_train, Y_train, feature_name=boston.feature_names.tolist())
test_dataset = lgb.Dataset(X_test, Y_test, feature_name=boston.feature_names.tolist())

# 训练 LightGBM 模型
booster = lgb.train({
    "objective": "regression",
    "verbosity": -1,
    "metric": "rmse",
    'interaction_constraints': [[0,1,2,11,12], [3,4], [6,10], [5,9], [7,8]]
    },
    train_set=train_dataset,
    valid_sets=(test_dataset,),
    num_boost_round=10
)

# 进行预测
test_preds = booster.predict(X_test)
train_preds = booster.predict(X_train)

# 计算并打印 R2 分数
print("
R2 测试分数:%.2f" % r2_score(Y_test, test_preds))
print("R2 训练分数:%.2f" % r2_score(Y_train, train_preds))

输出

这将生成以下结果:

训练或测试数据集的大小: (455, 13) (51, 13) (455,) (51,)

[1]	valid_0's rmse: 7.50225
[2]	valid_0's rmse: 7.01989
[3]	valid_0's rmse: 6.58246
[4]	valid_0's rmse: 6.18581
[5]	valid_0's rmse: 5.83873
[6]	valid_0's rmse: 5.47166
[7]	valid_0's rmse: 5.19667
[8]	valid_0's rmse: 4.96259
[9]	valid_0's rmse: 4.69168
[10]	valid_0's rmse: 4.51653

R2 测试分数:0.67
R2 训练分数:0.69

示例 2

现在下面的代码使用波士顿数据集训练 LightGBM 模型来预测房价。训练后,它将使用 R2 分数计算模型在训练和测试数据上的表现。

# 导入必要的库
import lightgbm as lgb
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

# 加载波士顿住房数据集
boston = load_boston()

# 将数据集拆分为训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=42)

# 打印训练集和测试集的大小
print("训练集和测试集的大小:", X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)

# 创建一个具有交互约束和 10 个估计器的 LightGBM 模型
booster = lgb.LGBMModel(objective="regression", n_estimators=10,
interaction_constraints=[[0,1,2,11,12], [3, 4], [6,10], [5,9], [7,8]])

# 在训练集上训练模型并在测试集上验证它
booster.fit(X_train, Y_train,
            eval_set=[(X_test, Y_test)],
            eval_metric="rmse")

# 对测试集和训练集进行预测
test_preds = booster.predict(X_test)
train_preds = booster.predict(X_train)

# 计算并打印测试集和训练集的 R2 分数
print("
R2 测试分数:%.2f" % r2_score(Y_test, test_preds))
print("R2 训练分数:%.2f" % r2_score(Y_train, train_preds))

输出

这将创建以下结果:

训练和测试数据集的大小:  (379, 13) (127, 13) (379,) (127,)
[1]	valid_0's rmse: 8.97871	valid_0's l2: 80.6173
[2]	valid_0's rmse: 8.35545	valid_0's l2: 69.8135
[3]	valid_0's rmse: 7.93432	valid_0's l2: 62.9535
[4]	valid_0's rmse: 7.61104	valid_0's l2: 57.9279
[5]	valid_0's rmse: 7.16832	valid_0's l2: 51.3849
[6]	valid_0's rmse: 6.93182	valid_0's l2: 48.0501
[7]	valid_0's rmse: 6.57728	valid_0's l2: 43.2606
[8]	valid_0's rmse: 6.41497	valid_0's l2: 41.1518
[9]	valid_0's rmse: 6.13983	valid_0's l2: 37.6976
[10]	valid_0's rmse: 5.9864	valid_0's l2: 35.837

R2 测试分数:0.60
R2 训练分数:0.69