Почему цикл 'for' не повторяется по списку? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь написать процедуру перекрестной проверки для модели Лассо на Python. Я имею дело с временными рядами, поэтому я использую метод TimeSeriesSplit из sklearn.

Зависимая переменная и регрессоры обозначены соответственно Y (numpy 1-мерный массив) и F (numpy nd-массив) в моем коде. Я применяю LASSO для

$ Y = F \ beta + U $

в очень стандартном приложении. Я использую перекрестную проверку для выбора гиперпараметра штрафа для LASSO. Для этого я определяю следующую функцию в Python 3.6:

def optimal_penalty(Y, F, penalty_list, splits):
  data = np.hstack((Y[:, None], F))
  splitter = TimeSeriesSplit(n_splits = splits).split(data)

  penalty_errors = np.zeros(len(penalty_list))

  for p, penalty in enumerate(penalty_list):
    estimator = Lasso(alpha = penalty, normalize = False)
    cv_error = np.zeros(splits)
    i = 0

    for train, test in splitter:
      F_train, F_test = F[train], F[test]
      Y_train, Y_test = Y[train], Y[test]
      Y_hat = estimator.fit(F_train, Y_train).predict(F_test)
      cv_error[i] = r2_score(Y_test, Y_hat)
      i = i +1
      print('in loop')

    penalty_errors[p] = np.mean(cv_error)
    print('Penalty', penalty, penalty_errors[p])

  best = penalty_list[np.argmin(penalty_errors)]

  return(best, penalty_errors)

, в котором np обозначает numpy. Операторы печати предназначены только для проверки того, что делает код. Меня интересует только лучшее наказание из указанного пользователем списка штрафов (список с плавающей запятой) и окончательная средняя ошибка для каждого значения штрафа, хранящегося в массиве penalty_errors. Однако, когда я запускаю эту функцию, я получаю следующее поведение:

In [64]: optimal_penalty(Y, F, [0.5, 1, 2], 5)
in loop
in loop
in loop
in loop
in loop
Penalty 0.5 0.02312207752945177
Penalty 1 0.0
Penalty 2 0.0
Out[64]: (1, array([0.02312208, 0.        , 0.        ]))

Как видно, код работает, как и ожидалось, для первого значения в penalty_list. Однако, похоже, что для других значений параметра штрафов ничего не вычисляется вообще, так как я не вижу операторов "in loop". Ребята, вы можете заметить какую-нибудь глупую ошибку? Я только начал с Python, и я, вероятно, что-то здесь упускаю. Заранее большое спасибо !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...