为什么“ for”循环不遍历列表?

时间:2019-04-16 20:32:14

标签: python numpy for-loop

我正在尝试为Python中的套索模型编写交叉验证例程。我正在处理时间序列,因此我正在使用TimeSeriesSplit中的sklearn方法。

在我的代码中,因变量和回归变量分别由Y(numpy一维数组)和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,可能在这里缺少了一些东西。提前非常感谢您!

0 个答案:

没有答案