SKlearn Elastic net все 0 весов, но разумные прогнозы - PullRequest
0 голосов
/ 07 июня 2019

Я использую эластичную сеть для набора данных с 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 и 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

И когда я пропускаю одну перекрестную проверку, я получаю среднеквадратическое среднеквадратичное значение около 3, поэтому модель работает не плохо. Почему все веса 0? Спасибо!

РЕДАКТИРОВАТЬ: Когда я объявляю модель как:

EN = ElasticNet(alpha=0.1)

Вес снова. Почему это ???

...