套索不收敛&ElasticNet使用所有系数

时间:2019-10-17 07:58:10

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

基本上,我正在尝试查看是否对随机森林进行惩罚回归是否可以比随机森林本身获得更好的预测。

我做了什么:

  • 我清理了数据集,删除了异常值,等等。
  • 火车是否设置了-拆分测试(0.75(19693 obs)-0.25(6565 obs))
  • 在训练数据集上执行“随机森林”,然后对测试集进行预测,从而得到包含所有预测的package game; import java.util.ArrayList; import exception.LineException; 数组。
  • 网格搜索最佳随机森林,从而得到(6565,)的最佳树数(n_estimators)。
  • 运行最佳随机森林并使用以下代码1200找到每棵树的每个预测,从而得到一个predictions_all = np.array([tree.predict(test_features) for tree in rf.estimators_])矩阵(即,如果您计算每行的均值,则将获得随机的预测森林)。
  • 将此矩阵与我的目标变量连接起来,得到一个(6565,1200)矩阵。
  • 设置火车组-拆分测试(0.75(4923 obs)-0.25(1642 obs))。
  • 在训练集上执行Ridge / Lasso / adaptiveLasso / ElasticNet,如果后者仅考虑一些系数(即树),则将聚合的均值与我们在步骤3进行的随机森林进行比较,以查看Lasso是否在随机森林上比随机森林本身表现更好。

问题是,当我尝试Ridge,套索和自适应套索时,如果(6565,1201)(OLS)不会收敛

alpha != 0

产生

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=100000,但它也不收敛。

有人知道为什么吗?

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

max_iter=1000000

产生:

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_)

这意味着他每1200棵树(变量)使用一次。 奇怪的是,我需要拥有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] ,以便他只使用1199棵树(变量)。

我错过了什么吗?是因为我所有的变量(树)与他使用的每个变量(树)都明智地相同吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

装袋:https://en.wikipedia.org/wiki/Bootstrap_aggregatinghttps://becominghuman.ai/ensemble-learning-bagging-and-boosting-d20f38be9b1e