Почему `` `print``` не работает внутри цикла и переменные не меняются в Python? - PullRequest
0 голосов
/ 09 мая 2018

Я новичок в Python и работаю над тем, что, на мой взгляд, довольно просто. Я просто пытаюсь выполнить какой-либо поиск по сетке относительно параметра регуляризации модели LASSO, используя Python's Skicit Learn.

Скажем, у меня есть следующий ddataframe (показывает только пару строк и несколько столбцов):

notnull_df = 

   AsianPerCap  FemalePctDiv  HispPerCap  HousVacant  LandArea  \
0         0.27          0.75        0.41        0.21      0.12   
1         0.30          0.91        0.35        0.02      0.02   
2         0.29          0.71        0.39        0.01      0.01   
3         0.25          0.49        0.44        0.01      0.02   
4         0.74          0.20        0.48        0.01      0.04   

   LemasPctOfficDrugUn  
0                 0.32  
1                 0.00  
2                 0.00  
3                 0.00  
4                 0.00  


Learning_Y =

0    0.20
1    0.67
2    0.43
3    0.12
4    0.03

У меня есть следующее:

# Defining a way to evaluate models
from sklearn.metrics import r2_score, mean_squared_error

def evaluate(y_true, y_pred, verbose = False):
    R2 = r2_score(y_true, y_pred)
    MSE = mean_squared_error(y_true, y_pred)
    if verbose == True:
        print('R2: {}'.format(r2_score(y_true, y_pred)))
        print('MSE: {}'.format(mean_squared_error(y_true, y_pred)))
        print('---')
    return R2, MSE

# Defining a Kfold cross-validation scheme
n_splits = 10
kf = KFold(n_splits, shuffle = True)

# We will fool around with Lasso first
splits = kf.split(notnull_df)
clf = Lasso(alpha = 0.0001, random_state = 0)
R2_Lasso = np.zeros((n_splits, 1))
MSE_Lasso = np.zeros((n_splits, 1))
idx = 0
for train_idx, cv_idx in splits:
    X_train = notnull_df.iloc[train_idx]
    X_cv = notnull_df.iloc[cv_idx]
    Y_train = Learning_Y.iloc[train_idx]
    Y_cv = Learning_Y.iloc[cv_idx]
    clf.fit(X_train, Y_train)
    Y_pred = clf.predict(X_cv)
    R2, MSE = evaluate(Y_cv, Y_pred, verbose = True)
    R2_Lasso[idx] = R2;
    MSE_Lasso[idx] = MSE;
    idx = idx + 1

Это отлично работает, даже многословная часть. Он будет генерировать массивы R2_Lasso и MSE_Lasso по мере необходимости. Теперь приходит проблема. Рассмотрим следующую реализацию поиска по сетке для параметра регуляризации:

l1_alpha = [0.00001, 0.00003, 0.0001, 0.0003, 0.001, 0.003, 0.01, 0.3, 1, 3, 10]
avg_R2 = np.zeros((len(l1_alpha), 1))
avg_MSE = np.zeros((len(l1_alpha), 1))
R2_Lasso = np.zeros((n_splits, 1))
MSE_Lasso = np.zeros((n_splits, 1))
for i, alpha in enumerate(l1_alpha):
    clf = Lasso(alpha)
    idx = 0
    for train_idx, cv_idx in splits:
        X_train = notnull_df.iloc[train_idx]
        X_cv = notnull_df.iloc[cv_idx]
        Y_train = Learning_Y.iloc[train_idx]
        Y_cv = Learning_Y.iloc[cv_idx]
        clf.fit(X_train, Y_train)
        Y_pred = clf.predict(X_cv)
        R2, MSE = evaluate(Y_cv, Y_pred, verbose = False)
        print(R2)    # I added this line after my problem started
        R2_Lasso[idx] = R2
        MSE_Lasso[idx] = MSE
        idx = idx + 1

    avg_R2[i] = np.mean(R2_Lasso)
    avg_MSE[i] = np.mean(MSE_Lasso)

Это в основном тот же код, что и раньше. Я хотел бы, чтобы при каждом запуске вычислялись два массива, как и раньше, а теперь - среднее значение.

ПРОБЛЕМА: когда я прошу Jupyter Notebook запустить его, вектор R2_Lasso ВСЕГДА равен нулю для каждой записи, а также MSE_Lasso. Я попробовал Spyder и Atom, и у меня была та же проблема Очевидно, что когда я прошу средства, это все ноль.

Я проверил, итерация на i и alpha работает нормально, это действительно итерация. Однако он ничего не печатает, даже если я укажу verbose = True. Например, он также не напечатает R2. Я добавил эту строку, чтобы убедиться, что она (или нет!) Напечатает ее. Действительно странно Это глупый вопрос? Я что-то упустил?

Заранее большое спасибо !!!!


РЕДАКТИРОВАТЬ : я предоставляю скриншот результатов ячейки на ноутбуке Jupyter:

enter image description here

Как я уже сказал, он будет печатать i правильно, но не будет печатать, скажем, R2 на любой итерации, хотя я просил об этом (для целей отладки).

...