#python #list #dictionary
Вопрос:
Это скорее выбор дизайна/структуры данных.
Я часто обнаруживаю, что у меня есть словарь из нескольких ключей со списками их значений, как таковых
result_dict: Dict = {"model_name": [], "seed": [], "fold": [], "val_mse": []}
result_dict["model_name"].append(model_name)
result_dict["seed"].append(seed)
result_dict["fold"].append(fold)
result_dict["val_mse"].append(val_score)
......
Это часто становится громоздким, так как я могу даже хранить 10 ключей в словаре. Каков более оптимальный способ хранения, не выполняя описанный выше способ?
Моя цель этого словаря имеет 2 причины:
- Я могу легко поместить его в фрейм данных:
result_df = pd.DataFrame(data=result_dict)
- Я могу сбросить этот словарь в
json
файл для хранения — в конце концов, полученные мной результаты должны быть где-то сохранены для дальнейших целей, таких как построение графиков, сохранение, для будущих сравнений.
Мой код выглядит следующим образом:
result_dict: Dict = {"model_name": [], "seed": [], "identifier": [], "val_mse": []}
model_name = model.__class__.__name__
for fold in range(1, num_folds 1):
train_df = df_folds[df_folds["fold"] != fold].reset_index(drop=True)
val_df = df_folds[df_folds["fold"] == fold].reset_index(drop=True)
X_train, y_train = train_df[predictor_col].values, train_df[target_col].values
X_val, y_val = val_df[predictor_col].values, val_df[target_col].values
model.fit(X_train, y_train)
y_val_pred = model.predict(X_val)
val_score = metrics.mean_squared_error(y_true=y_val, y_pred=y_val_pred)
result_dict["model_name"].append(model_name)
result_dict["seed"].append(seed)
result_dict["identifier"].append(f"fold {fold}")
result_dict["val_mse"].append(val_score)
avg_val_score = np.mean(result_dict["val_mse"], axis=None)
standard_error = np.std(result_dict["val_mse"], axis=None) / np.sqrt(num_folds)
result_dict["identifier"].append("average_score")
result_dict["val_mse"].append(avg_val_score)
Комментарии:
1. Какова цель структуры данных? Для каких операций, помимо создания (с добавлением), вы используете этот словарь?
2. @DaniMesejo Я отредактирую вопрос.
3. откуда вы берете
model_name
,seed
и т. Д.? (данные, которые вы добавляете в список)4. Вы можете иметь список кортежей (например,
data=[(v1, v2, v3), ...]
а затем создать фрейм данных сpd.DataFrame(data, columns=["model_name", "seed", "fold"])
5. Как насчет
result_dict: Dict = {"model_name": ['model_name1'], "seed": ['seed1','seed3'], "fold": ['fold9'], "val_mse": ['val56']}
этого ?
Ответ №1:
То, что вы можете сделать, похоже на приведенное ниже (обратите внимание на val_score
пример)
val_scores = []
for fold in range(1, num_folds 1):
train_df = df_folds[df_folds["fold"] != fold].reset_index(drop=True)
val_df = df_folds[df_folds["fold"] == fold].reset_index(drop=True)
X_train, y_train = train_df[predictor_col].values, train_df[target_col].values
X_val, y_val = val_df[predictor_col].values, val_df[target_col].values
model.fit(X_train, y_train)
y_val_pred = model.predict(X_val)
val_scores.append(metrics.mean_squared_error(y_true=y_val, y_pred=y_val_pred))
result_dict["val_mse"] = val_scores