Я пытаюсь написать процедуру перекрестной проверки для модели Лассо на 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, и я, вероятно, что-то здесь упускаю. Заранее большое спасибо !!