我正在使用51个预测值和500多个特征的数据集运行弹性网。数据集分为3组,每组17个,我想在第一组上运行我的弹性网并分析权重。我正在这样使用弹性网的SKLearn默认实现:
from sklearn.linear_model import ElasticNet
EN = ElasticNet()
使用以下命令查看前16组时:
Ytri1 = Y[:16]
Xtri1 = df.head(16).values
print(Xtri1, "\n")
print(Ytri1, "\n")
我明白了: Xtri1 and Ytri1
[[0.0528572 0.06979359 0.27991728 ... 0.47440828 0.49169051 0.57413314]
[0.11909182 0.06029422 0.27781516 ... 0.37303109 0.32118746 0.41869557]
[0.10815316 0.00631806 0.21146458 ... 0.37130906 0.31182633 0.38739678]
...
[0.05229341 0.01064162 0.21709352 ... 0.52898461 0.45416569 0.54874849]
[0.06235364 0.00716286 0.21920198 ... 0.54628248 0.37000325 0.47461543]
[0.09420443 0.00522829 0.22831954 ... 0.39863555 0.36745167 0.41411779]]
[11. 11. 11. 11. 11. 11. 8. 11. 11. 11. 10. 12. 11. 11. 10. 11.]
看起来很标准。
但是,当我跑步时:
print(EN.coef_)
查看重量,我得到:
[-0. 0. -0. -0. -0. 0. 0. -0. 0. 0. 0. 0. 0. -0. 0. -0. 0. 0.
0. -0. -0. 0. -0. -0. 0. 0. -0. 0. 0. 0. -0. 0. 0. -0. 0. 0.
0. 0. -0. 0. 0. 0. -0. 0. 0. 0. 0. 0. 0. 0. 0. -0. -0. 0.
-0. -0. 0. 0. 0. 0. 0. 0. 0. -0. -0. -0. 0. -0. -0. 0. 0. 0.
0. -0. -0. -0. -0. -0. 0. -0. -0. -0. -0. -0. -0. 0. -0. -0. -0. -0.
-0. 0. -0. -0. -0. 0. -0. -0. -0. -0. -0. 0. 0. -0. -0. -0. 0. -0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. -0. 0. 0. 0. 0. -0. 0. -0.
-0. -0. 0. 0. -0. 0. 0. 0. 0. 0. 0. 0. -0. 0. 0. 0. 0. 0.
-0. 0. -0. -0. 0. 0. 0. -0. -0. 0. 0. -0. -0. 0. 0. -0. 0. 0.
0. -0. 0. 0. 0. 0. 0. -0. 0. -0. -0. 0. -0. -0. -0. -0. -0. -0.
-0. -0. 0. -0. -0. -0. -0. 0. -0. -0. 0. 0. -0. -0. -0. 0. -0. -0.
-0. -0. -0. 0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. 0. 0. 0.
0. 0. -0. 0. 0. 0. 0. 0. -0. -0. -0. -0. -0. 0. 0. 0. 0. -0.
-0. -0. -0. 0. 0. 0. 0. 0. -0. 0. 0. 0. 0. 0. -0. 0. -0. 0.
-0. -0. -0. -0. -0. 0. -0. -0. -0. 0. -0. -0. -0. 0. -0. -0. 0. 0.
0. -0. -0. 0. -0. 0. -0. 0. 0. 0. 0. 0. 0. -0. -0. -0. -0. -0.
-0. -0. -0. -0. -0. -0. -0. -0. 0. -0. -0. 0. 0. 0. -0. -0. 0. -0.
-0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0.
-0. 0. -0. -0. -0. 0. -0. -0. -0. -0. 0. -0. -0. -0. -0. -0. -0. -0.
-0. -0. 0. -0. -0. -0. -0. -0. 0. 0. -0. -0. 0. -0. -0. -0. -0. -0.
-0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. 0. 0. -0.
-0. 0. -0. -0. -0. -0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. -0. -0. -0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. -0. -0. -0.
-0. -0. 0. 0. -0. 0. -0. 0. -0. -0. 0. 0. 0. 0. -0. 0. -0. 0.
0. -0. 0. 0. -0. 0. -0. -0. -0. 0. 0. -0. 0. 0. -0. -0. -0. -0.
-0. -0. 0. -0. 0. -0. 0. 0. -0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. -0. 0. 0. 0. 0. 0. 0. 0. 0. -0. -0.
-0. -0. -0. -0. -0. -0. -0. -0. -0. -0. 0. 0. 0. 0. 0. -0. -0. -0.
-0. -0. -0. -0. -0. 0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0. -0.
-0. 0. -0. -0. -0. -0. -0. 0. -0. -0. -0. -0.]
这很奇怪,因为:
print("Predicted:", EN.predict([df.loc[17].values]), "Real:", Y[17])
返回:
Predicted: [10.75] Real: 18.0
当我不做一次交叉验证时,我得到的RMSE约为3,因此该模型的性能并不差。为什么所有权重都为0?谢谢!
编辑:当我将模型声明为:
EN = ElasticNet(alpha=0.1)
重量再次出现。为什么会这样?