SKlearn Elastic net全部0权重但合理的预测

时间:2019-06-07 18:19:02

标签: python machine-learning scikit-learn dataset

我正在使用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)

重量再次出现。为什么会这样?

0 个答案:

没有答案