高维稀疏特征的时候,lr 的效果会比 gbdt 好

本文探讨了在高维稀疏特征情况下,逻辑回归(LR)相较于梯度提升决策树(GBDT)能更好地避免过拟合的原因。通过分析模型特点及正则化作用,揭示了线性模型如何有效应对稀疏特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高维稀疏特征的时候,lr 的效果会比 gbdt 好,为什么?

  • 这个问题我也是思考了好久,在平时的项目中也遇到了不少 case,确实高维稀疏特征的时候,使用 gbdt 很容易过拟合。
  • 但是还是不知道为啥,后来深入思考了一下模型的特点,发现了一些有趣的地方。
  • 假设有1w 个样本, y类别0和1,100维特征,其中10个样本都是类别1,而特征 f1的值为0,1,且刚好这10个样本的 f1特征值都为1,其余9990样本都为0(在高维稀疏的情况下这种情况很常见),我们都知道这种情况在树模型的时候,很容易优化出含一个使用 f1为分裂节点的树直接将数据划分的很好,但是当测试的时候,却会发现效果很差,因为这个特征只是刚好偶然间跟 y拟合到了这个规律,这也是我们常说的过拟合。但是当时我还是不太懂为什么线性模型就能对这种 case 处理的好?照理说 线性模型在优化之后不也会产生这样一个式子:y = W1*f1 + Wi*fi+….,其中 W1特别大以拟合这十个样本吗,因为反正 f1的值只有0和1,W1过大对其他9990样本不会有任何影响。
  • 后来思考后发现原因是因为现在的模型普遍都会带着正则项,而 lr 等线性模型的正则项是对权重的惩罚,也就是 W1一旦过大,惩罚就会很大,进一步压缩 W1的值,使他不至于过大,而树模型则不一样,树模型的惩罚项通常为叶子节点数和深度等,而我们都知道,对于上面这种 case,树只需要一个节点就可以完美分割9990和10个样本,惩罚项极其之小.
  • 这也就是为什么在高维稀疏特征的时候,线性模型会比非线性模型好的原因了:带正则化的线性模型比较不容易对稀疏特征过拟合。
03-29
### GBDT与Logistic Regression (LR) 的关系 GBDTLR 是两种不同的机器学习算法,分别属于集成学习和线性模型领域。它们各自具有独特的特性,在某些场景下可以结合使用以获得更好的性能。 #### 1. **GBDT的特点** GBDT是一种基于决策树的集成学习方法,通过迭代的方式构建多棵树来逐步减少残差[^1]。它能够很好地捕捉数据中的非线性和复杂特征交互,适用于高维稀疏数据以及处理复杂的非线性模式。然而,由于其本身的结构特点,GBDT 输出的结果可能并不适合直接解释为概率值。 #### 2. **LR的特点** Logistic Regression (LR) 则是一个经典的线性分器,擅长于建模输入变量之间的线性组合并将其映射到概率空间。它的优点在于简单高效、易于理解和优化,并能提供良好的概率估计[^4]。但是,当面对高度非线性的数据分布时,单独依赖 LR 可能无法充分表达这些复杂关系。 #### 3. **两者结合方式** 为了利用这两种技术的优势,实践中常采用以下几种策略: - **Feature Transformation via GBDT + Linear Model**: 使用GBDT提取高层次特征之后再喂给简单的线性模型如LR来进行最后一步预测。具体做法是将每颗弱学习者的叶子节点索引编码成新的离散型特征向量形式表示样本位置信息; 或者计算叶结点路径上的统计汇总指标作为连续数值属性加入原始特征集中形成增广后的表征供后续阶段消费[^5]. 这样做的好处是可以让原本难以被传统回归分析所发现的数据规律变得显而易见起来, 同时保留了逻辑斯谛函数良好校准性质. ```python from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split import lightgbm as lgb from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score # Generate synthetic dataset X, y = make_classification(n_samples=10000, n_features=20, n_informative=15, random_state=7) train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=.2,random_state=42) # Train a LightGBM model to extract features from the data. lgb_train = lgb.Dataset(train_X, label=train_y) params = { 'objective': 'binary', 'metric': 'auc' } bst = lgb.train(params=params, train_set=lgb_train, num_boost_round=100) # Transform training and testing sets using leaf indices of trees built by LGBM. def transform_dataset(dataset): return bst.predict(dataset, pred_leaf=True).astype(str) transformed_train_X = transform_dataset(train_X) transformed_test_X = transform_dataset(test_X) # One-hot encode transformed datasets before feeding them into logistic regression. encoded_train_X = pd.get_dummies(pd.DataFrame(transformed_train_X)) encoded_test_X = pd.get_dummies(pd.DataFrame(transformed_test_X)) lr_clf = LogisticRegression(solver='liblinear') lr_clf.fit(encoded_train_X, train_y) print(f"AUC Score on Test Set: {roc_auc_score(test_y, lr_clf.predict_proba(encoded_test_X)[:,1])}") ``` 上述代码片段展示了如何先用LightGBM(一种实现GBDT框架)训练得到基础模型,接着转换原始特征为空间上更丰富的表现形式——即各个实例落入哪些特定子区域的信息矩阵;随后把这些新产生的维度送入标准二项式最大熵目标求解流程完成端到端的任务解决过程[^2]. --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值