【问题标题】:Lasso not converging & ElasticNet uses all coefficientsLasso 不收敛 & ElasticNet 使用所有系数
【发布时间】:2020-02-14 01:57:49
【问题描述】:

基本上,我想看看在随机森林上进行惩罚回归是否有助于获得比随机森林本身更好的预测。

我做了什么:

  • 我清理了数据集,删除了异常值,等等......
  • Did a Train set - Split Test (0.75 (19693 obs) - 0.25 (6565 obs))
  • 对训练数据集执行随机森林,然后对测试集进行预测,生成包含所有预测的(6565,) 数组。
  • 网格搜索最佳随机森林,得到最佳数量的树 (n_estimators) 1200
  • 运行最优随机森林并使用以下代码predictions_all = np.array([tree.predict(test_features) for tree in rf.estimators_]) 为每棵树找到每个预测,从而得到一个(6565,1200) 矩阵(即,如果你对每一行进行平均,你就会得到随机森林的预测)。
  • 将此矩阵与我的目标变量连接起来,生成一个(6565,1201) 矩阵。
  • 设置训练集 - 拆分测试 (0.75 (4923 obs) - 0.25 (1642 obs))。
  • 在训练集上执行 Ridge/Lasso/adaptiveLasso/ElasticNet,如果后者只考虑一些系数(即树),将聚合平均值与我们在步骤 3 中所做的随机森林进行比较,看看 Lasso 是否适用于随机森林比随机森林本身表现更好。

问题是,当我尝试 Ridge、Lasso 和 Adaptive Lasso 时,如果 alpha != 0 (OLS) 不会收敛

from sklearn.linear_model import Lasso
lasso00001 = Lasso(alpha=0.0001, max_iter=10000,normalize=True)
lasso00001.fit(train_features,train_labels)
train_score00001=lasso00001.score(train_features,train_labels)
test_score00001=lasso00001.score(test_features,test_labels)
coeff_used00001 = np.sum(lasso00001.coef_!=0)

print("training score for alpha=0.0001:", train_score00001 )
print("test score for alpha =0.0001: ", test_score00001)
print("number of features used: for alpha =0.0001:", coeff_used00001)

导致

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/coordinate_descent.py:475: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations. Duality gap: 104843192290351.6, tolerance: 137819106237.78107
  positive)

我尝试使用max_iter=100000max_iter=1000000,但它也没有收敛。

有人知道为什么吗?

但是,ElasticNet 收敛,我尝试了 GridSearchCV 并找到了最优的 ElasticNet

from sklearn.linear_model import ElasticNet


EN = ElasticNet(alpha=0.02, max_iter=1000000, normalize=True, l1_ratio = 0.8)
EN.fit(train_features,train_labels)
train_EN=EN.score(train_features,train_labels)
test_EN=EN.score(test_features,test_labels)
coeff_used = np.sum(EN.coef_!=0)

print("training score:", train_EN)
print("test score: ", test_EN)
print("number of features used:", coeff_used)
print("coefs:", EN.coef_)

导致:

training score: 0.6679234101432687
test score:  0.6414639586584302
number of features used: 1200
coefs: [0.00070865 0.00107221 0.00048273 ... 0.00062971 0.00057734 0.00033563]

这意味着他每 1200 棵树(变量)使用一次。 奇怪的是我需要alpha = 6500,这样他就只使用了1199棵树(变量)。

我是否遗漏了什么?是因为我所有的变量(树)都与他使用的每一个变量(树)明显相同吗?

【问题讨论】:

    标签: python machine-learning scikit-learn random-forest lasso-regression


    【解决方案1】:

    你错过了什么
    是的,这很正常。实际上,您正在对非常(非常非常)相关的变量进行惩罚回归。基本上,每棵树都以相同的方式学习,但这只是它们训练的数据集略有不同(这称为 bagging)。但由于它们只有一点点不同,这将导致高度相关的变量。

    一点哲学
    我不明白你为什么要这样做。当您只想保留几个足以预测的变量(即有很多无用的变量)时,使用惩罚回归。如果你有很多没用的树,最好以前少养。

    最后,在随机森林中,树的数量并不是比网格搜索更好的东西,因为更多的树通常会提供更好的性能。你想要的是更少,以便有更少的耗时算法......这对网格搜索模型的深度更有趣。

    打包:https://en.wikipedia.org/wiki/Bootstrap_aggregating, https://becominghuman.ai/ensemble-learning-bagging-and-boosting-d20f38be9b1e

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 2023-03-16
      • 2020-04-06
      • 2022-01-23
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      相关资源
      最近更新 更多