实现模型的可解释性和与领域知识的一致性至关重要。增强这两点的方法之一是实施单调性约束。本文将探讨什么是单调约束、单调约束的意义以及如何将单调约束纳入机器学习模型。
单调性约束是机器学习中的一个强大工具,它使实践者能够建立不仅具有预测性,而且具有可解释性并与领域知识相一致的模型。通过纳入单调性,模型可以更准确地反映现实世界中的关系,从而做出更好的决策并获得利益相关者的信任。
什么是单调关系?
单调函数总是朝着一个方向前进:向上或向下,方向永远不会逆转。
单调关系是指:
这种增加(或减少)不一定以相同的速度发生。例如,如果你看一下上面右边的图片,就会发现数据是单调的线性关系。
线性关系是单调的,但并不是所有的单调关系都是线性的。
为什么要使用单调约束?
自然界中很少有线性关系,但自然界中很多关系都是单调的。
工资会随着经验的增加而增加吗?是的,但它是单调的,而不是线性的。冰淇淋的销量会随着温度的升高而增加吗?是的,但它是单调的,而不是线性的。
这就是线性回归通常表现不佳的原因:它对模型施加了线性约束,而在大多数实际情况中,这是一个不切实际的强烈假设。
想象一下,我们正在开发一个评估客户信用度的模型,其结果是给客户打分。该模型利用两个特征:12 个月内的最长负债天数和客户的年收入。
现在,我们要对两位客户进行预测:
客户 1:最大负债天数(12 个月): 35 天,年收入:60,000 美元
客户 2:最大负债天数(12 个月): 34 天,年收入:60,000 美元
在对 XGBoost 模型进行训练后,它为这两位客户提供了以下预测:
这一结果提出了一个问题:为什么负债天数较少的客户违约概率要高于另一位客户?
基于树的算法会为连续特征创建分区,这可能会导致某个特定分区的违约率更高,这纯属偶然。但是,这并不意味着在现实世界中,在特定范围内负债天数较多的客户一定比负债天数较少的客户得分更高。
我们的 ML 模型的一个理想特性是,随着逾期天数的增加,预测的违约概率也应增加或保持不变。反之,如果债务天数较少,预测的违约概率就会降低或保持不变。
为此,我们需要对特征 “max_overdue_days_12_months ”应用 “+1 ”单调性约束,确保较好的评分总是与较高或相等的概率相关联。
通过强制单调性,我们可以使模型不易过度拟合。
实现单调性约束
只需简单的改动,添加一行代码,就能将传统的 ML 模型(如随机森林、LightGBM、CatBoost 等)转变为可靠的工具。
有几种机器学习算法原生支持单调性约束。例如,梯度提升框架(如 XGBoost 和 LightGBM)允许用户在模型训练过程中指定单调性约束。
XGBoost 中的示例
下面是一个如何使用 Python 在 XGBoost 中应用单调约束的简单示例:
我们可以为每个特征设想以下三种情况:
import xgboost as xgb
# Define monotonic constraints: 1 for increasing, -1 for decreasing
monotonic_constraints = [1, 0, -1] # Example for three features
dtrain = xgb.DMatrix(X_train, label=y_train)
# Set parameters
params = {
'objective': 'reg:squarederror',
'monotone_constraints': monotonic_constraints
}
# Train model
model = xgb.train(params, dtrain, num_boost_round=100)
结论
单调约束可确保特征与预测之间的关系遵循直观规则,从而提高模型的可解释性。利益相关者可以更容易地理解输入变量变化的影响,这对于金融和医疗保健等受监管行业尤为重要。
单调性约束使从业人员能够将这些知识直接编码到模型中,从而提高模型的可靠性,并与专家的见解保持一致。
通过强制单调性,模型不易过度拟合。模型的行为受限于与先前预期一致的方式,这有助于保持对未见数据的泛化性能。