В настоящее время я участвую в конкурсе 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. Как я могу это исправить?
Я был бы очень признателен за ваши советы по этому поводу. Заранее благодарю за помощь!
В настоящее время я участвую в конкурсе Kaggle «Титаник — машинное обучение на случай катастроф». Я применил целевое кодирование к 5 категориальным столбцам, как показано в программе ниже. [code]target_train = df_all[:890] target_test = df_all[891:]
# 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)
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) [/code] Точность данных обучения и проверки составляет около 0,8, но фактическая оценка при подаче на конкурс составляет около 0,6. Как я могу это исправить? Я был бы очень признателен за ваши советы по этому поводу. Заранее благодарю за помощь!