【发布时间】: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=100000 和max_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