Как я могу предотвратить утечки в целевой кодировке?Python

Программы на Python
Ответить
Anonymous
 Как я могу предотвратить утечки в целевой кодировке?

Сообщение Anonymous »

В настоящее время я участвую в конкурсе Kaggle «Титаник — машинное обучение на случай катастроф».
Я применил целевое кодирование к 5 категориальным столбцам, как показано в программе ниже.

Код: Выделить всё

target_train = df_all[:890]
target_test = df_all[891:]

target_x = target_train.drop(['Survived'], axis=1)
target_y = target_train[['PassengerId', 'Survived']]

cat_cols = ['Deck', 'People', 'Embarked', 'Fare_range', 'Age_group']

# redo target encoding for each cross validation fold
kf = KFold(n_splits=5, shuffle=True, random_state=SEED-1)
for i, (tr_idx, va_idx) in enumerate(kf.split(target_x)):

# Separate validation data from training data
tr_x, va_x = target_x.iloc[tr_idx].copy(), target_x.iloc[va_idx].copy()
tr_y, va_y = target_y.iloc[tr_idx], target_y.iloc[va_idx]

# Loop through variables and target encoding
for c in cat_cols:
# Calculate average of targets in each category across training data
data_tmp = pd.DataFrame({c: tr_x[c], 'target': tr_y['Survived']})
target_mean = data_tmp.groupby(c)['target'].mean()
# Replace validation data categories
cl_name = c + '_target'
va_x.loc[:, cl_name] = va_x[c].map(target_mean)

# Prepare an array to store the transformed values of the training data
tmp = np.repeat(np.nan, tr_x.shape[0])
kf_encoding = KFold(n_splits=5, shuffle=True, random_state=SEED+1)
for idx_1, idx_2 in kf_encoding.split(tr_x):
# out-of-fold to compute the mean of the objective variable in each category
target_mean = data_tmp.iloc[idx_1].groupby(c)['target'].mean()
# Store converted values in a temporary array
tmp[idx_2] = tr_x[c].iloc[idx_2].map(target_mean)

tr_x.loc[:, cl_name] = tmp
target_x[cl_name] = np.nan
target_x.loc[tr_x.index, cl_name] = tr_x[cl_name]
target_x.loc[va_x.index, cl_name] = va_x[cl_name]

for c in cat_cols:
data_tmp = pd.DataFrame({c: target_x[c], 'target': target_y['Survived']})
target_mean = data_tmp.groupby(c)['target'].mean()
cl_name = c + '_target'
target_test.loc[:, cl_name] = target_test[c].map(target_mean)

target_train = pd.merge(target_x, target_y).reset_index(drop=True)
df_all = pd.concat([target_train, target_test]).reset_index(drop=True)
Точность данных обучения и проверки составляет около 0,8, но фактическая оценка при подаче на конкурс составляет около 0,6. Как я могу это исправить?
Я был бы очень признателен за ваши советы по этому поводу. Заранее благодарю за помощь!

Подробнее здесь: https://stackoverflow.com/questions/791 ... t-encoding
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»