Хочу сделать небольшую серию статей в первую очередь для начинающих специалистов в Data Science, к которому они смогли бы обращаться, когда необходимо что-то вспомнить при решении задач или подготовиться к собеседованию.

Начнем с того, какой минимум необходимо знать стажеру. Список может быть более широким, но все в первую очередь зависит от задач, которых вам будет ставить руководитель.

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

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

Импорт и экспорт данных

Pandas — одна из самых популярных библиотек Python для аналитики и работы с Data Science. Первое с чего следует начать это импортировать данную библиотеку:

import pandas as pd

Считывать данные предстоит различных форматов и то, как это можно сделать существует множество способов, но часто хватает функции read_csv с ее параметрами (sep - разделитель (по умолчанию ','), names - список имен столбцов):

df = pd.read_csv("titanic.csv")
df

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

Вывод первых 5 строк - df.head()

Вывод последних 5 строк - df.tail()

Вывод 5 случайных строк - df.sample(5)

Немного забегая вперед, посмотрим на то, как экспортировать обработанные данные в Excel:

df.to_excel('df_data.xlsx', sheet_name = 'sheet1', index = False)

Настроим вывод таблицы

С помощью pd.set_option настроим вывод DataFrame:

  • количество строк в таблице было не больше 10;

  • текст в ячейке отражался полностью вне зависимости от длины;

  • все числа отражались с двумя знаками после запятой;

pd.set_option('max_rows', 10)
pd.set_option('display.max_colwidth', None)
pd.set_option('display.float_format', '{:.2f}'.format)

Если нужно вернуть настройки к изначальным, используем: pd.reset_option('all').

Предпросмотр данных

Полезные методы, которые вы можете использовать, для того, чтобы посмотреть на размер данных, названия признаков и их типы:

df.shape

df.columns

df.dtypes

df.info()

df.describe()

Метод info( ) - показывает информацию о наборе данных, индекс, столбцы и тип данных, ненулевые значения и использование памяти.

Метод describe() показывает количество строк в столбце, среднее значение столбца, столбец стандартное отклонение , минимальные (min) и максимальные (max) значения, а также границу каждого квартиля - 25%, 50% и 75%. Любые значения NaN автоматически пропускаются. По умолчанию, метод describe( ) пропускает строки и столбцы не содержащие чисел - категориальные признаки. Чтобы посмотреть статистику по нечисловым признакам, нужно явно указать интересующие нас типы в параметре include. Можно также задать include = 'all', чтоб вывести статистику по всем имеющимся признакам.

Работа с пропущенными значениями

Есть два метода обнаружения недостающих данных: isnull() и notnull().

Результатом является логическое значение, указывающее, действительно ли значение, переданное в аргумент, отсутствует. «Истина» означает, что значение является отсутствующим значением, а «Ложь» означает, что значение не является отсутствующим.

df.isnull().sum()

Пропущенные значения можно также заполнить средними значениями, медианами, нулями и т. д. в зависимости от вашей задачи:

df['Age'].fillna(df['Age'].mean(), inplace = True)

Если один из признаков при исследовании вам оказался незначим, его можно удалить следующим образом:

df.drop(['Cabin'], axis = 1, inplace = True)

Важно с какими видами данных работаете (категориальные, порядковые, числовые)

  1. Категориальные данные представляют собой характеристики (пол человека, язык   и т.д.).

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

  3. Числовые данные, которые делятся на:

    3.1. Дискретные данные представляют собой различные и разделенные значения.  Этот тип данных не может быть измерен, но он может быть подсчитан.

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

    3.3. Интервальные данные представляют упорядоченные единицы, которые  имеют одинаковую разницу.

Работа с категориальными данными

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

Label Encoder

Данный тип представляет собой однозначное соответствие число и уникальное значение.

Первое значение кодируется нулем, второе единицей, и так далее.

from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()

Для того, чтобы посмотреть  на закодированные значения необходимо использовать метод classes_.

One-Hot Encoder

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

from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder()

Нормализация, стандартизация, масштабирование

MinMaxScaler, RobustScaler, StandardScaler, и Normalizer это методы, которые помогут нам подготовить данные для машинного обучения.

MinMaxScaler

Из каждого значения признака, MinMaxScaler вычитает минимальное значение признака и делит на диапазон. MinMaxScaler сохраняет форму исходного распределения. Он не меняет содержательно информацию содержащуюся в исходных данных. Диапазон значений после признака находится между 0 и 1. Если хотите легкого преобразования, используйте его.

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()

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

Используйте RobustScaler если вы хотите уменьшить эффект от выбросов по сравнению с MinMaxScaler.

from sklearn.preprocessing import RobustScaler
transformer = RobustScaler()

StandardScaler стандартизирует признак вычитая среднее и затем масштабируя к единичной дисперсии. В результате применения StandardScaler мы получаем распределение со стандартным отклонением равным 1.

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

Normalizer работает на строках, не на столбцах и к каждому наблюдению применяет L2 нормализацию, чтобы значения в строке имели единичную норму. Normalizer преобразует все признаки в значения между -1 и 1.

from sklearn.preprocessing import Normalizer
transformer = Normalizer()

Разделение датасета на обучающую, тестовую выборку

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.33, random_state=42)

Параметры:

  1. test_size - представляет долю набора данных для включения в тестовое разделение.

  2. random_state - управляет перетасовкой, применяемой к данным перед применением разделения. Передайте int для воспроизводимого вывода через несколько вызовов функций.

Замечания:

  1. train_test_split по умолчанию автоматически перемешивает данные;

  2. Стратификацию (равномерное распределение) классов мы можем задать при разделении с помощью параметра stratify. Стоит стратифицировать по классам c y;

  3. Если вы хотите использовать датасеты для тестирования и валидации, разделяем весь набор данных один раз для выделения обучающей выборки. Затем еще раз, чтобы разбить оставшиеся данные на датасеты для тестирования и валидации.

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

Комментарии (6)


  1. SamXYZ
    28.08.2022 18:12
    +2

    Привет. Ну очень скромно описал Базовый знания.

    Очень сильно сомневаюсь, что только это достаточно работать на Джуне. Прошу описать, что входит в задачи, что используешь на практике.


    1. Stich22 Автор
      29.08.2022 17:29

      Привет, конечно, данная статья содержит лишь частичку информации, которую необходимо знать джуну)

      Разделила весь текст на несколько частей, скоро выложу еще)


      1. SamXYZ
        29.08.2022 23:01

        Очень жду. я еще на этапе "мечтаю стать стажером", хотя уже пару кейсов в текущей своей компании сделал, но вакансий аналитиков в фирме просто не существует.


  1. AASelivanov
    29.08.2022 23:11

    Спасибо за статью.

    Как истинный зануда, не могу не дополнить своими соображениями.

    Pandas

    Стоит знать, что pandas очень мощный инструмент, который имеет возможности по работе с данными, аналогичные SQL: эта страница документации раскрывает подробнее. (Особенно интересная работа с группировками).

    Ещё интересны могут быть базовые функции по визуализации (pandas включает в себя интерфейсы к matplotlib), что позволяет "лениво" рассматривать данные (порой это очень полезно). А если ещё и seaborn использовать, вообще красота получается. Документация.

    Кстати, pandas имеет отдельный тип данных categorical, в который стоит переводит столбцы с категориальными переменными для использования соответствующей функциональности.

    Categorical Feature Encoding

    Касательно работы с категориальными данными, мне кажется, также не лишним будет знать и другие методы (также это поможет дополнить ответ на великий вопрос о разнице трёх библиотек градиентного бустинга):

    • Binary Encoder и Hash Encoder -- по сути тот же OneHot, но вектор итоговый получается меньше, хотя пишут, что часть информации может потеряться;

    • Target Encoder (по-моему, едва ли не лучший вариант, если есть целевые значения) -- кодирует значения категориального признака с учётом их встречаемости с конкретными метками классов;

    • Frequency Encoder -- кодирует на основе частоты встречаемости значения категориального признака в выборке;

    • CatBoost Encoder (shout out to the mighty Yandex) -- как target encoder, но, кажется, учитывает только значения, которые были встречены перед текущим примером из выборки.

      Кстати, если работать на python, есть целая библиотека с интерфейсами, как у sklearn: category_encoders. При взгляде в ReadMe можно увидеть огромный простор для изучения методов кодирования категориальных данных.

    Разделение датасета

    Мне кажется, немало практиков валидационное множество берут всё же, отрезая от тренировочного. Это, на мой взгляд, более осмысленно, так как тест после отрезания вообще не стоит трогать (а на соревнованиях он, например, вообще недоступен).

    Также новичкам стоит знать про методы кросс-валидации, зачем она вообще нужна и когда её использовать не стоит.

    А ещё отдельно про валидацию последовательностей (time series), мне кажется, это довольно популярный формат данных.

    Надеюсь, это будет полезной информацией.


    1. Aweis
      30.08.2022 16:59

      Спасибо большое, очень полезная информация!


  1. Blackonga
    29.08.2022 23:11

    Ещё ещё ещё!