Архив рубрики ~Лента новостей~

Прежде чем обратиться к Близнецам, я вернусь к задаче предварительной обработки данных.

Прежде чем обратиться к Близнецам, я вернусь к задаче предварительной обработки данных.
Прежде чем обратиться к Близнецам, я вернусь к задаче предварительной обработки данных.

Как Близнецы решили мою проблему с Пандами за считанные секунды, и почему основы науки о данных по-прежнему важны для принципа неоптимальных решений.

Делиться

Изображение, полученное Национальным институтом борьбы с инфекционными заболеваниями через Unsplash.

Как специалисты при анализе данных, мы тратим немало времени на подготовку данных для решения задач. Будь то очистка данных, обработка пропущенных результатов, разработка признаков, предварительная обработка данных или постобработка, этот этап требует много времени. столбцов.

Я мог бы напрямую подключиться к магистральному праву и написать код (что я обычно и делаю), но на этот раз я хотел сделать это сам. Было раннее утро, и у меня были свежие мысли, поэтому я был настроен на выполнение сложных операций с данными.

Вот что мне пришлось сделать. У меня был DataFrame со столбцами predicted_categories , pred_category_id и text_predicted_probs .

Значения в столбце predicted_categories формируются из пяти категорий в формате «category_id» – «category_description».

 ['80814001 - Заморозить Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas']

В столбце text_predicted_probs какие прогнозируемые вероятности для этих пяти категорий в порядке возрастания.

 [0.943, 0.018, 0.008, 0.006, 0.004]

Таким образом, первое значение в text_predicted_probs — это заявки первой категории в predicted_categories , и так далее.

В столбце pred_category_id отображает прогнозируемый идентификатор категории другой модели. Мне же нужна прогнозируемая категория категорий, указанная в столбце pred_category_id .

Мне нужно получить порядок результатов pred_category_id в столбце predicted_categories , а затем возьмите их значение из столбца test_predicted_probs .

На примере ниже показано, чего я хочу добиться:

dd95b67babc79753c94f25c0416eca4c

В этом показателе мне необходимо получить категорию 13003106, которая является вторым компонентом в списке, и ее значение составляет 0,018.

Если бы мы спросили Gemini или другую модель, мы, вероятно, получили бы ответ за считанные секунды. Но я хотел сначала сделать это сам, а потом спросить Gemini.

Начнём с чтения набора данных в DataFrame Pandas.

 import pandas as pd results = pd.read_csv("prediction_results.csv")

Значения в столбце predicted_categoriesсформированы строки, содержащие идентификаторы категорий и названия категорий:

 results.loc[0, "predicted_categories"] # вывод: "['80814001 - Freze Uçları', '13003106 - Freze', '80805004 - Sanayi Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas']"

Это список, но сохраняется как строка, поэтому сначала мы преобразуем его в объектную строку, с помощью функции literal_eval встроенной модуля ast на Python:

 ast.literal_eval(results.loc[0, "predicted_categories"]) # вывод: ['80814001 - Заморозить данные', '13003106 - Заморозить', '80805004 - Санайи Makineleri', '13003144 - Torna Makinesi', '13003195 - Kumpas']

Чтобы определить идентификаторы категорий, мы можем выбрать каждую категорию в этом списке по символу «-», а затем выберите первую часть после разделения. поскольку у нас есть список из пяти категорий, операцию следует выбирать с помощью спискового выражения следующим образом:

 [category.split("-")[0].strip() для категории в ast.literal_eval(results.loc[0, "predicted_categories"])] # вывод: ['80814001', '13003106', '80805004', '13003144', '13003195']

Мы сделали это для одного значения (т.е. одной строки). Чтобы выполнить ту же операцию для всего столбца predicted_categories, мы можем использовать генератор списков. Это будет генератор списков внутри другого генератора списков (т.е. вложенный генератор списков):

 results.loc[:, "predicted_category_ids"] = [ [category.split("-")[0].strip() для категории в ast.literal_eval(predicted_categories)] для предсказанных_категорий в результатах["predicted_categories"] ]

Теперь у нас есть одинаковые категории, выделенные из столбца предсказанные_категории:

54ae814cc3155ad38f68c170f659a9baрисунок>

Следующий шаг — проверка порядка категорий в списках прогнозируемых идентификаторов категорий. Затем мы используем этот порядок для извлечения прогнозируемой вероятности категории.

Тип объекта List в Python имеет метод `index`, который возвращает индекс (т.е. порядок) элемента в списке.

 results.loc[0, "predicted_category_ids"] # вывод: ['80814001', '13003106', '80805004', '13003144', '13003195'] results.loc[0, "predicted_category_ids"].index("13003106") # вывод: 2

Как только я найду индекс прогнозируемого идентификатора категории, я смогу использовать его для получения возможности этого идентификатора категории из столбца text_predicted_probs :

559a97a4849bdc1e0ccd32e7af9bd8d2

Что нам нужно сделать:

  1. Получить индекс pred_category_id в predicted_category_ids
  2. Используйте этот индекс для извлечения значимых значений из text_predicted_probs

Эти шаги можно выполнить для одной операции, в этих трех столбцах. Давайте проверим это в первой строке:

for i, j, k в zip(results["pred_category_id"][:1], results["predicted_category_ids"][:1], results["text_predicted_probs"][:1]): print(j.index(str(i))) # получаем индекс pred_category_id в предсказанных_категории_ids print(ast.literal_eval(k)[j.index(str(i))]) # получаем значение по этому индексу в text_predicted_probs # вывод: 0 0.943

Мы можем получить результат на скриншоте выше. Значение pred_category_id равно 80814001, что является первым элементом (т.е. индекс = 0) в predicted_category_ids , первое значение вероятности равно 0,943.

Списки в столбце text_predicted_probs также используются в качестве строк, поэтому мы применяем функцию literal_evalдля преобразования их в список объектов.

Эту операцию можно выбрать над всем DataFrame, используя списковое выражение следующим образом:

 results.loc[:, "pred_category_prob"] = [ float(ast.literal_eval(k)[j.index(str(i))]) if str(i) в j else 0 for i, j, k в zip(results["pred_category_id"], results["predicted_category_ids"], results["text_predicted_probs"]) ]

По сути, мы преобразовали цикл для преобразования кода блока в списковое выражение. Я добавил проверку « if str(i) in j else 0 », потому что есть строки, в которых pred_category_id отсутствует в predicted_category_ids . В таких случаях устанавливается значение условия равным 0.

.

Задача выполнена, как показано на приведенных ниже изображениях:

bef3bb15390b4d4c702c92970c4786f5

Как Близнецам это удалось?

Примерно через час работы (включая перерывы) я выполнил задание. Затем я вызвал шоу Gemini, как он справился с той же самой частью.

Я написал задание, в котором объясняла свой результат, и включил небольшой пример данных.

Вот что Gemini выдал с первым попытка:

 импортируйте pandas как pd # 1. Создайте образец данных DataFrame = { 'predicted_categories': [ ['80814001 - Заморозить параметры', '13003106 - Заморозить', '80805004 - Санайи Макинелери', '13003144 - Торна Макинеси', '13003195 - Кумпас'] ], 'pred_category_id': [80814001], 'text_predicted_probs': [ [0.943, 0.018, 0.008, 0.006, 0.004] ] } df = pd.DataFrame(data) # 2. Определите функцию для извлечения вероятности соответствия идентификатору категории def get_matching_prob(row): # Преобразование ID в строку для сопоставления target_id_str = str(row['pred_category_id']) # Перебираем категории, чтобы найти соответствующий индекс для индекса, категории в enumerate(row['predicted_categories']): if Category.startswith(target_id_str): # Возвращаем соответствующую вероятность из того же индекса return row['text_predicted_probs'][index] # Возвращаем None (или 0), если соответствие не найдено, чтобы предотвратить сбой кода return None # 3. Создайте новый столбец df['pred_category_prob'] = df.apply(get_matching_prob, axis=1) # Отображение результата print(df[['pred_category_id', 'pred_category_prob']])

Первоначальная программа создала выбранный DataFrame, на основе данных, предоставленных мной в запросе. Затем она написала функцию, которая делает именно то, что я объяснил.

В написании кода у меня ушло около часа. Близнецы выполнили эту самую минимальную задачу за считанные секунды с помощью подсказки, написание которой у меня ушло всего несколько минут.

Однако в коде Близнецов есть небольшая проблема. Он использует функцию apply , которая не векторизована. При работе с указанными наборами данных использование функции apply (по сути, цикл for) может увеличить время выполнения.

Но решение простое. Я попросил Gemini написать векторизованную версию, и вот что у меня получилось:

 import pandas as pd # Пример данных DataFrame = { 'predicted_categories': [ ['80814001 - Заморозить список', '13003106 - Заморозить', '80805004 - Sanayi Makineleri'], ['13003144 - Torna Makinesi', '13003195 - Kumpas'] ], 'pred_category_id': [80814001, 13003195], 'text_predicted_probs': [[0.943, 0.018, 0.008], [0.6, 0.4] ] } df = pd.DataFrame(data) # 1. Расчленить оба столбца списка одновременно, чтобы сохранить соответствие между категорией и вероятностью df_exploded = df.explode(['predicted_categories', 'text_predicted_probs']) # 2. Извлеките числовой идентификатор из строки категории с помощью векторизованного регулярного выражения df_exploded['extracted_id'] = df_exploded['predicted_categories'].str.extract(r'^(d+)').astype(float) # 3. Фильтровать строки, в которых извлеченный идентификатор соответствует целевому 'pred_category_id' matched = df_exploded[df_exploded['extracted_id'] == df_exploded['pred_category_id']] # 4. Дедупликация индекса (подстраховка на случай, если идентификатор появится дважды в одном списке) matched = matched[~matched.index.duulated(keep='first')] # 5. Сопоставьте извлеченный столбец вероятности обратно с исходным DataFrame, используя индекс df['pred_category_prob'] = matched['text_predicted_probs'] df

Второе решение было вполне приемлемым и выглядело проще, чем написанный мной код.

Таким образом, я вернулся около задачи, которую магистр права мог бы выбрать менее чем за пять минут. Однако, если бы я не знал, как работает Pandas, я бы принял первое решение, которое не было принято. Это прекрасный пример того, как магистры права могут повысить производительность, но только если вы действительно знаете, что это делает.

Сонер Йылдырым Посмотреть все магазины Сонер Йылдырым

Источник: towardsdatascience.com

Оцените материал:

Поделиться
Понравилась статья? Расскажите другим
ВКонтакте
Читайте также
Новости робототехники Neros Technologies вложит 250 миллионов долларов на развертывание своих оборонных дронов к концу 2026 года. Архив рубрики ~Коротко из Telegram~ Google собрал всё своё обучение по ИИ, коду и данным… Архив рубрики ~Коротко из Telegram~ Математик опроверг гипотезу Якоби с помощью ИИ-модели Гипотеза 1939 года… Архив рубрики ~Коротко из Telegram~ xAI запустила Grok Bot — ИИ-агента с собственным компьютером Агент… Архив рубрики ~Коротко из Telegram~ Google выпустила Gemini 3.7 Flash — через три недели после… Архив рубрики ~Обо всем~ Марсианский метеорит из Алжира оказался шерготтитом редкого типа. NWA 13441 нашли в 2019 году Новости робототехники Роботы на Уолл-стрит: нетрадиционные пути выхода на публичные рынки для робототехнических компаний Новости робототехники Универсальный железнодорожный робот заменит людей на опасных участках Архив рубрики ~Коротко из Telegram~ ☀️ Видео KodeCloud разбирает квантизацию — почему модель на 70… Архив рубрики ~Коротко из Telegram~ Батарейки из водорослей Учёные из Кембриджского университета вместе с биодизайнером… Архив рубрики ~Коротко из Telegram~ «Пятёрочка» научилась напоминать, что у вас скоро скиснет В приложении… Архив рубрики ~Коротко из Telegram~ Nebius: $582 млн выручки и $5,7 млрд капекса Голландская компания… Архив рубрики ~Коротко из Telegram~ CXMT обошла Tencent и стала самой дорогой компанией Китая Китайский… Архив рубрики ~Коротко из Telegram~ ↗️ Билайн отчитался за I полугодие 2026 г.: выручка выросла… Новости робототехники Neros Technologies вложит 250 миллионов долларов на развертывание своих оборонных дронов к концу 2026 года. Архив рубрики ~Коротко из Telegram~ Google собрал всё своё обучение по ИИ, коду и данным… Архив рубрики ~Коротко из Telegram~ Математик опроверг гипотезу Якоби с помощью ИИ-модели Гипотеза 1939 года… Архив рубрики ~Коротко из Telegram~ xAI запустила Grok Bot — ИИ-агента с собственным компьютером Агент… Архив рубрики ~Коротко из Telegram~ Google выпустила Gemini 3.7 Flash — через три недели после… Архив рубрики ~Обо всем~ Марсианский метеорит из Алжира оказался шерготтитом редкого типа. NWA 13441 нашли в 2019 году Новости робототехники Роботы на Уолл-стрит: нетрадиционные пути выхода на публичные рынки для робототехнических компаний Новости робототехники Универсальный железнодорожный робот заменит людей на опасных участках Архив рубрики ~Коротко из Telegram~ ☀️ Видео KodeCloud разбирает квантизацию — почему модель на 70… Архив рубрики ~Коротко из Telegram~ Батарейки из водорослей Учёные из Кембриджского университета вместе с биодизайнером… Архив рубрики ~Коротко из Telegram~ «Пятёрочка» научилась напоминать, что у вас скоро скиснет В приложении… Архив рубрики ~Коротко из Telegram~ Nebius: $582 млн выручки и $5,7 млрд капекса Голландская компания… Архив рубрики ~Коротко из Telegram~ CXMT обошла Tencent и стала самой дорогой компанией Китая Китайский… Архив рубрики ~Коротко из Telegram~ ↗️ Билайн отчитался за I полугодие 2026 г.: выручка выросла…

Оставить комментарий