单调约束

什么是单调性?

单调是一个函数或数量的变化。

59206f86e149954a1781fe70451f9dfb.png

单调递增函数:如果对所有 x和 y,当 x≤y时,都有f(x)≤ f(y),则该函数被称为单调递增函数(见图1)。这个函数不一定要增加,只是不能减少。

单调递减函数:如果对所有 x和 y,当 x≤y时,都有 f(x)≥f(y),则该函数被称为单调递减函数(见图2)。这个函数不一定要减少,只是不能增加。

为什么要在机器学习模型中应用单调性?

现在,你一定想知道为什么我们需要一个约束模型。在现实生活中,许多场景都表现出单调关系,请看下面给出的一些例子。

  1. 信用评分越高,贷款被批准的可能性越大。
  2. 保险费随着驾照年龄的增长而下降。
  3. 保险费随保险金额的增加而增加。

在缺乏单调约束的情况下,银行和保险公司可能会面临一种不合逻辑和不道德的决策的奇怪情况,比如信用评分较高(比如610分)的申请被拒绝,而信用评分较低(比如600分)的申请被批准。类似地,客户A为100万美元的房产支付1000美元的溢价,客户B为110万美元的房产支付990美元的溢价。在上面的例子中,我们假设所有其他因素对于两对客户都是相同的。

机器学习模型示例

我将在python中使用XGBoost向您介绍这个概念,并且本教程的底部也提供了LightGBM实现的代码。

生成样本数据

第一步,我们将根据上述两种情况模拟一些数据。

场景1:以正斜率模拟数据

import numpy as np%matplotlib inlineimport matplotlib.pyplot as pltplt.style.use('seaborn-whitegrid')#Sample data with positive slopesize = 100Xp = np.linspace(0,7, size)yp = Xp**2 + 10 - (10 * np.random.random(size))plt.plot(Xp, yp, '.', color='b');
ec3e0ea3b16760aaea51f9ad5c2c2089.png

在这种情况下,两个变量x和y之间存在正相关关系,当x增加时,y也会增加,而当x减少y时也会减少,例如保险金额和保费金额。

场景2:以负斜率模拟数据

def f(Xn, a, b, c):    """Fit function y=f(x,p) with parameters p=(a,b,c). """    return a * np.exp(- b * Xn) +c#Sample data with negative slopesize = 100Xn = np.linspace(0, 2, size)yi = f(Xn, a=2.5, b=1.3, c=.5)#add some noiseyn = yi + 0.5 * np.random.random(size=len(Xn))
465924aa76917e192ffdd28a15d3adb0.png

这种情况是两个变量之间的负相关关系,当x增加时,y减少,当x减少时,y增加,例如,驾照年龄和保费金额。

拟合无单调约束的机器学习模型

我们将在两个场景中使用缺省参数和不强制任何约束来拟合增强树模型。

#Code for positive scenario, use same code for other scenario Creating DMatriximport xgboost as xgbdtrain_positive = xgb.DMatrix(Xp.reshape(-1,1), label=yp)#Setting default parametersparams_no_constraints = {'booster':'gbtree','eta':0.3,'gamma':0,'max_depth':6,'min_child_weight':1,'colsample_bytree':1}#Model Fittingmodel_no_constraints_positive = xgb.train(params=params_no_constraints, dtrain=dtrain_positive)#Predictionpreds_positive = model_no_constraints_positive.predict(dtrain_positive)#Plotting observed versus predictionplt.plot(Xp,yp,'.',color = "b")plt.plot(Xp, preds_positive.reshape(-1,1), color = "r")plt.xlabel("X")plt.ylabel("Non-monotonic Model Fit")

您可以看到输出的可视化

18f8a271badf811dd73fc9f6c73b97c8.png

我们来分析一下输出,蓝点显示X个数据点,红线显示拟合模型。我们可以看到两个模型都表现良好,能够捕获数据的整体趋势,而且这种曲线也很自然,但是这可能会影响决策。当我们在很短的时间间隔内分析模型时,我们可以观察到与我们期望相反的趋势。例如,在上述模型中,Yb Ym与我们的预期相反。

对模型添加单调约束

现在,我们将添加附加参数(即单调约束)对样本数据进行建模。根据XGBoost文档,它们分别为1和-1。

params_increasing_monotone = {'booster':'gbtree','eta':0.3,'gamma':0,'max_depth':6,'min_child_weight':1,'colsample_bytree':1,'monotone_constraints':1}

让我们在X值上绘制预测线,以可视化我们的拟合模型。

42cda86398a06a153e00144db971a5a4.png

我们可以看到整体的趋势看起来与早期的非单调模型相似。现在,解释这些机器学习模型变得容易多了,不像以前那样有矛盾的情况。

LightGBM中单调约束的实现

您可以使用以下Python代码对数据建模并分析输出,对于其余步骤,您可以使用与上述相同的代码。

#Fitting LightGBM model with monotonic constraintsimport lightgbm as lgbmonotone_model = lgb.LGBMRegressor(min_child_samples=5,monotone_constraints="-1") # 1 for increasing constraintsmonotone_model.fit(X.reshape(-1,1),y)#predicted output from the model from the same inputprediction = monotone_model.predict(X.reshape(-1,1))

最后

我们在这里讨论了单变量模型的单调约束,这些约束也可以应用于多个变量,并且可以使用部分依赖图来分析对单个变量的影响。有时,强制约束有助于避免过度拟合,这取决于数据之间的关系,但是当您有一个过度拟合的模型时,测试这种技术没有害处。

posted @ 2021-12-16 12:14  威威后花园  阅读(753)  评论(0编辑  收藏  举报