#python #arrays #pandas #machine-learning #logistic-regression
Вопрос:
Я построил функционирующую модель классификации, следуя этому руководству. Я привожу csv-файл, а затем передаю текстовое значение каждой строки в функцию, которая вызывает модель классификации для прогнозирования. Функция возвращает массив, который мне нужно поместить в столбцы в фрейме данных.
Функция:
def get_top_k_predictions(model,X_test,k):
# get probabilities instead of predicted labels, since we want to collect top 3
np.set_printoptions(suppress=True)
probs = model.predict_proba(X_test)
# GET TOP K PREDICTIONS BY PROB - note these are just index
best_n = np.argsort(probs, axis=1)[:,-k:]
# GET CATEGORY OF PREDICTIONS
preds = [
[(model.classes_[predicted_cat], distribution[predicted_cat])
for predicted_cat in prediction]
for distribution, prediction in zip(probs, best_n)]
preds=[ item[::-1] for item in preds]
return preds
Вызов функции:
for index, row in df.iterrows():
category_test_features=category_loaded_transformer.transform(df['Text'].values.astype('U'))
df['PREDICTION'] = get_top_k_predictions(category_loaded_model,category_test_features,9)
Это результат работы функции:
[[('Learning Activities', 0.001271131465669718),
('Communication', 0.002696299964802842),
('Learning Objectives', 0.002774964762863968),
('Learning Technology', 0.003557563051027678),
('Instructor/TAs', 0.004512712287403168),
('General', 0.006675929282872587),
('Learning Materials', 0.013051869950436862),
('Course Structure', 0.02781481160602757),
('Community', 0.9376447176288959)]]
Я хочу, чтобы в конце результат выглядел так.
Ответ №1:
Ваша функция возвращает список, содержащий список кортежей? Почему список с двойной вложенностью? Один из способов, который я могу придумать:
tmp = {}
for index, row in df.iterrows():
predictions = get_top_k_predictions(...)
tmp[index] = {
key: value for key, value in predictions[0]
}
tmp = pd.DataFrame(tmp).T
df.join(tmp)
Комментарии:
1. Двойной вложенный список-это именно то, как это сделал учебник, которому я следовал. Если есть лучший способ структурировать функцию, я определенно открыт для этого!
2. Я добавил ваш код в свой проект, и он дал мне правильный формат, но он скопировал тот же вывод для первой строки во все остальные строки. tmp = {} для индекса, строки в df.iterrows(): category_test_features=category_loaded_трансформатор.преобразование(df[‘Текст’].значения.тип(‘U’)) прогнозы = get_top_k_predictions(category_loaded_model,category_test_features,9) tmp[индекс] = { ключ: значение для ключа, значение в прогнозах[0] } tmp = pd.Фрейм данных(tmp). T df = df.соединение(tmp)