Все программные функции, независимо от языка, со временем развиваются, и в результате используемые функции устаревают и перестают работать. В моем случае то, что когда-то всего несколько недель или месяцев назад было полностью функционирующим алгоритмом машинного обучения / глубокого обучения, теперь содержит сломанный скрипт Python, который не запускался. В мире программирования это известно как устаревание, и библиотеки машинного обучения Python не являются исключением. Итак, как нам быть с этим?

Здесь я покажу проблему устаревания, относящуюся к учебнику по машинному обучению, и то, как я ее исправил. Цель этой статьи — научить вас, если вы не разбираетесь в документации API библиотек, поэтому, если вас постигнет та же участь, вы тоже сможете легко исправить свои программы.

Если вы читали мою первую статью на Medium под названием Начало работы с ИИ (https://miteshparmar1.medium.com/getting-started-with-ai-ml-nn-a-beginners-guide-b1659d6bffd7), я расскажите о ютубере по имени senddex, у которого есть дополнительные руководства по обучению машинному обучению и глубокому обучению. Одно из его учебных пособий под названием Часть 35. Обработка нечисловых данных для машинного обучения (https://pythonprogramming.net/working-with-non-numerical-data-machine-learning-tutorial/?completed=/machine-learning -clustering-introduction-machine-learning-tutorial/) был написан в июне 2016 года и, к сожалению, теперь (март 2021 года) имеет две устаревшие функции, поэтому, следуя этому руководству буквально, копирование и выполнение этого кода дословно не сработает.

Давайте изучим этот учебник и пройдемся по шагам, как это исправить…

Я вставил примечания в самом верху скрипта Python в «текстовую ячейку» со ссылками на веб-сайт и видео на YouTube. Затем мои операторы импорта вставляются в первую «ячейку кода», показанную внизу:

Я смонтировал свой Google Диск (как показано в левой колонке) и соответствующим образом сослался на набор данных. Вторая строка присваивает набору данных переменную «df» (которая является объектом Pandas Dataframe. ПРИМЕЧАНИЕ. Вы можете использовать функцию печати (тип (df)) для определения типа объекта df). Последняя строка в коде ячейки предназначена для проверки данных, загруженных с помощью pd.read_excel(path). Выполнение этой ячейки кода показывает данные, представленные в красивой, аккуратной таблице, как показано ниже:

Сразу под этим я вставил «текстовую ячейку», чтобы указать, что нужно делать дальше (как указано в senddex в этом руководстве). Затем я вставил еще одну «ячейку кода» и ввел код, который пропускает два столбца из загруженной таблицы (df.drop(columns=['body', 'name']). Ошибки строки при выполнении этой ячейки кода: df. convert_objects, как показано:

Наша ошибка сразу сообщает нам, что объект «DataFrame» не имеет атрибута «convert_objects» и выделяет ошибочный код волнистой красной линией (строка 5 ячейки кода).

Когда разработчик читает это, это сразу означает, что функция convert_objects библиотеки Pandas DataFrame не существует.

В. Так что же нам делать дальше?

A. Используйте Google, чтобы провести расследование…

Перейдите в Google и введите название нашей библиотеки; Панды, имя объекта; кадр данных и имя функции; convert_objects и нажмите Enter:

Самым первым результатом в Google является официальная документация pandas, также известная как API (интерфейс прикладного программирования. Это документация с подробными описаниями, определенными разработчиками библиотеки, о том, как использовать функции и структурировать код), поэтому давайте возьмем посмотри на это. Нажмите на ссылку…

О чудо, в документации указано «Устарело, начиная с версии 0.21.0»:

В этом суть нашей проблемы! По сути, мы используем версию выше 0.21.0, которая не поддерживает эту функцию convert_objects. Обратите внимание, что над выделенным красным полем «Устарело» указано «Попытка определить лучший тип данных для столбцов объектов». Это описание того, что делает функция convert_objects (dtype означает типы данных).

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

Итак, вернемся к Google, найдем «pandas dataframe convert datatype» и нажмем Enter:

Наш первый результат — последняя официальная документация pandas:

Примечание:

Версия 1.2.3 — это последняя версия Pandas, если вы погуглите «какая последняя версия pandas», она скажет вам:

В Colab чуть ниже «импортировать numpy как np» вставьте «print (pd.__version__)» и выполните этот код ячейки:

Итак, Colab не использует последнюю версию Pandas, но использует версию 1.1.5, которая является более новой, чем учебник senddex с устаревшей функцией. Не волнуйтесь, вам не нужно обновлять Pandas в Colab. Эта версия по-прежнему будет работать.

Вернуться к основной статье:

https://pandas.pydata.org/ — официальный сайт самой последней документации по API Pandas. Так что нажмите на эту первую ссылку, показанную в Google.

Теперь нам нужна функция, начинающаяся с «конвертировать», поэтому давайте введем ее в строку поиска и нажмем Enter. Первая функция, показанная в списке результатов, — это pandas.DataFrame.convert_dtypes. Похоже, это может быть интересно, поэтому нажмите на ссылку…

В последней документации Pandas API выделено желтым цветом слово, которое мы ищем, в нашем случае «конвертировать». Описание, выделенное красным, гласит: «Преобразуйте столбцы в наилучшие возможные типы данных, используя типы данных, поддерживающие pd.NA»:

Похоже, мы вышли на победителя с этой функцией! Прокрутите вниз до раздела «Примечания» для более подробного описания:

Первый абзац говорит нам, что именно будет делать эта функция; попытаться преобразовать серию или серию в DataFrame в dtypes, которые поддерживают pd.NA. Второй выделенный раздел говорит нам, что эта функция попытается преобразовать любые целочисленные типы данных в соответствующий целочисленный тип расширения (я не хочу учить вас «сосать яйца», но я подумал, что упомяну об этом, чтобы вы прочитали это, а не пролистнуть его).

Прокрутка вниз показывает отличный пример, начиная с создания объекта фрейма данных Pandas различных типов данных, отображения типов данных, создания переменной; dfn функции convert_dtypes(), а затем отображение типов данных после запуска этой функции:

Как показано, значения NaN заменяются на ‹NA›, и сравнение типов данных показывает, что то, что раньше было «объектным» типом данных, теперь преобразуется в «строку» или «логическое значение». int32 стал Int32, а в столбце e тип данных float64 стал Int64.

Прокрутка до последней части страницы показывает нам еще один пример:

По сути, это показывает нам, что если присутствует NaN, функция convert_dtypes() изменит его на ‹NA›, что можно обработать в нашем скрипте Python.

Эта функция convert_dtypes() — «колени пчел»! Это именно то, что нам нужно для замены устаревшей неподдерживаемой функции convert_object().

Давайте поместим это в наш скрипт Python, закомментируем устаревшую функцию и напишем комментарий прямо над ней. Выполнение всего до этой «ячейки кода» теперь показывает другую ошибку, на этот раз указывающую на следующую строку; df.fillna(inplace=True), как показано ниже:

В сообщении об ошибке указано: ValueError: необходимо указать «значение» или «метод» заполнения.

Итак, вернемся к последней документации API Pandas и найдите fillna:

Из возвращенного списка интерес представляет тот, который указывает DataFrame.fillna, поскольку это функция, которую мы используем. Итак, нажмите на эту ссылку:

К сожалению, эта документация не сообщает нам, какие аргументы являются обязательными или необязательными (это плохая документация API от имени разработчиков Pandas). Красным выделено то, что нас интересует; «значение» и «метод», которые являются первыми двумя параметрами.

Теперь, из-за нашей ошибки, о которой сообщается в Colab, аргументы fillna не могут быть пустыми (когда senddex сделал этот учебник Pandas, он разрешил это, но последующие версии — нет). Это означает, что мы ДОЛЖНЫ указать параметр. Прокрутите вниз, чтобы увидеть пример:

Опять же, мы видим создание объекта DataFrame различных типов данных и содержащего NaN. Поскольку мы не хотим заменять NaN на 0, df.fillna(0) не подходит. Но второе выделенное поле показывает, когда мы используем df.fillna(method=’ffill’), ненулевые значения обрабатываются путем распространения значений NaN вперед или назад.

Не знаю, как вы, но «Распространение ненулевых значений вперед или назад» — слишком расплывчатое описание. Он не дает мне точного описания того, что на самом деле делает этот параметр (мне бы очень хотелось, чтобы разработчики дали более подробное описание, но эй, мы можем только хотеть). Изучение первого и последнего красного поля, выделенного выше, показывает, что столбцы A, B и C немного смещены влево. Но так как мы можем использовать это, и мы ДОЛЖНЫ указать параметр, давайте попробуем…

… Скопируйте/вставьте его в нижнюю часть ячейки кода в Colab, дайте ему комментарий, а затем вставьте функцию df.head() в последнюю строку ячейки кода, чтобы проверить данные после выполнения:

С курсором в текущей ячейке кода нажмите Runtime, Run before:

Это загружает весь предыдущий код перед этой ячейкой кода в память.

Затем вручную выполните эту ячейку кода, используя выделенный значок воспроизведения:

Наши данные отображаются на нижней панели, и об ошибках не сообщается, поэтому эти две строки были исправлены путем применения новых функций, поддерживаемых Pandas.

Я могу сообщить вам, что в этом руководстве по senddex только эти две строки были единственными устаревшими функциями. Я надеюсь, что вы сможете легко следовать этой статье и применить эти принципы к своим устаревшим функциям, чтобы оживить свой код Python.

Любой вопрос или комментарий просто оставьте в разделе ответов. Удачного кодирования машинного обучения в Colab…