基本上,我正在尝试查看是否对随机森林进行惩罚回归是否可以比随机森林本身获得更好的预测。
我做了什么:
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)
矩阵。问题是,当我尝试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棵树(变量)。
我错过了什么吗?是因为我所有的变量(树)与他使用的每个变量(树)都明智地相同吗?
答案 0 :(得分:0)
您错过了什么
是的,这很正常。实际上,您正在对非常非常相关的变量进行惩罚回归。基本上,每棵树都以相同的方式学习,但这只是它们在其上训练的数据集略有不同(称为装袋)。但是由于它们之间只有一点点差异,因此将导致高度相关的变量。
一点点哲学
我不明白您为什么要这么做。当您只想保留一些足以预测的变量时(即,有很多无用的变量),可以使用惩罚回归。如果您有很多没用的树木,最好先少保留。
最后,在随机森林中,树的数量并不是网格搜索的更好选择,因为通常更多的树会提供更好的性能。您想要的是拥有更少的东西,以便拥有更少的耗时算法...通过网格搜索模型的深度会更有趣。
装袋:https://en.wikipedia.org/wiki/Bootstrap_aggregating,https://becominghuman.ai/ensemble-learning-bagging-and-boosting-d20f38be9b1e