Я новичок в 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:
Как я уже сказал, он будет печатать i
правильно, но не будет печатать, скажем, R2
на любой итерации, хотя я просил об этом (для целей отладки).