Что такое аккуратный способ добавления в словарь списков?

#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 причины:

  1. Я могу легко поместить его в фрейм данных: result_df = pd.DataFrame(data=result_dict)
  2. Я могу сбросить этот словарь в 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