1. Постановка задачи для машинного обучения
  2. Деловые ограничения
  3. Описание набора данных и получение данных
  4. Показатели эффективности
  5. Начиная
  6. Исследовательский анализ данных
  7. Вменение отсутствующего значения
  8. Нормализация данных

Постановка проблемы для машинного обучения

Эту проблему можно рассматривать как простую модель двоичной классификации, где положительный класс означает, что проблема в грузовике возникла из-за неисправности в APS, а отрицательный класс означает иное. Таким образом, учитывая новую точку данных, относящуюся к конкретной поломке, нам нужно классифицировать, является ли поломка результатом неисправности в APS.

Деловые ограничения

  • Задержка. Время, необходимое для прогнозирования после получения данных, должно быть достаточно небольшим, чтобы избежать ненужного увеличения времени и затрат на обслуживание.
  • Стоимость неправильной классификации: Стоимость неправильной классификации очень высока, особенно неправильная классификация положительной точки данных класса, поскольку это может привести к полной поломке грузовика и повлечь за собой серьезные расходы. Ошибочная классификация здесь просто напрасная трата времени ремонтников, поскольку они будут искать проблемы в неправильных местах, сохраняя свое доверие к классификации модели.

Описание набора данных

Набор данных был предоставлен в рамках IDA-2016 Industrial Challenge и содержит показания, полученные от Scania Trucks при их повседневном использовании, которые собираются и предоставляются самой Scania. Названия всех функций анонимны по причинам, связанным с собственностью.

Набор данных для этого тематического исследования можно найти здесь:

Https://archive.ics.uci.edu/ml/datasets/APS+Failure+at+Scania+Trucks

Набор данных разделен на две части: набор поездов и набор тестов. Набор поездов содержит 60 000 строк, а набор тестов - 16 000 строк. В наборе данных 171 столбец, один из которых является меткой класса точки данных, что дает 170 функций для каждой точки данных. Функции представляют собой комбинацию числовых функций и функций, построенных на основе интервалов гистограммы. Все характеристики имеют числовой характер. Просто взглянув на набор данных, можно сказать, что это очень несбалансированный набор данных , где 59 000 относятся к отрицательному классу в то время как только 1000 относятся к положительному классу. Следует также отметить, что точки данных содержат много пропущенных значений. В некоторых функциях даже отсутствует более половины значений. Многие точки данных как в обучающем, так и в тестовом наборах данных содержат по крайней мере одно пропущенное значение.

Показатели эффективности

Используются следующие показатели производительности:

  • Стоимость ошибочной классификации. Этот показатель был предоставлен в рамках конкурса. Это дает:

Стоимость ошибочной классификации: (стоимость_2 x FN) + (стоимость_1 x FP)

Где cost_1 = 10 и cost_2 = 500

Этот показатель представляет собой стоимость, которую владельцы автопарка понесут в результате неправильной классификации, сделанной моделью. В этом случае стоимость_1 относится к стоимости ненужной проверки, которую должен выполнить механик в мастерской, а стоимость_2 относится к стоимости пропуска неисправного грузовика, что может привести к поломке в будущем.

  • Матрицы путаницы, точности и напоминания. Метрики путаницы, точности и отзыва расскажут нам о производительности моделей, основанных на каждом классе, что очень важно, учитывая, что набор данных настолько смещен в сторону отрицательного класса. .
  • Оценка F-1. Оценка F-1 в одном показателе может рассказать нам об общей производительности модели на основе точности и запоминания моделей с использованием одного числа, что немного упрощает интерпретировать, чем матрицы. Мы будем использовать Макро-усредненный балл F-1, потому что он учитывает баллы f1 обоих классов и, следовательно, может сказать нам общую производительность модели в обоих классах.

Начиная

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

Исследовательский анализ данных

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

Во-первых, давайте посмотрим на распределение данных по классам:

Как мы видим, из 60 000 точек данных в наборе данных 59 000 (~ 98,3%) относятся к отрицательному классу, в то время как только 1 000 (~ 1,7%) относятся к положительному классу. Таким образом, набор данных очень сильно несбалансирован, и, следовательно, нам нужно будет использовать методы, которые могут противодействовать этому дисбалансу, иначе мы получим очень плохую производительность на положительном классе.

Теперь давайте посмотрим, сколько функций является числовым и сколько из них основано на гистограммах:

Мы можем видеть, что существует 7 гистограмм, на основе которых были построены различные функции гистограммы, и для каждой функции гистограммы у нас есть 10 интервалов, таким образом, всего 70 функций из 170 функций являются функциями гистограммы, а остальные 100 функций являются числовыми.

Теперь давайте проанализируем отсутствующие значения в наборе данных:

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

2. Анализ отсутствующих значений для каждой функции.

Во-первых, давайте посмотрим, сколько функций не имеют пропущенных значений и их имен.

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

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

Минимальное количество пропущенных значений, которое мы можем найти для функции, составляет 167 для функции bt_000, а наибольшее количество пропущенных значений - 49264 для функции br_000, которая составляет большую часть набора данных. Из-за такого большого значения среднее значение сдвигается примерно до 5000 пропущенных значений для каждого признака, что почти в 9 раз больше медианного значения 688. Это может указывать на то, что есть некоторые признаки с абсурдно большим количеством пропущенных значений.
Дальнейший анализ подтверждает это предположение, когда мы обнаруживаем, что есть только 28 функций, у которых пропущенные значения больше среднего, и у большинства из них пропущено не менее 9550 значений из 60000 точек данных поезда, что очень много в процентном отношении.

Теперь давайте посмотрим на фактическое количество пропущенных значений для каждой функции, построив график.

Большинство функций имеют менее 5% пропущенных значений, а некоторые другие имеют пропущенные значения от 5 до 25%, а некоторые - от 25 до 50%. Однако для некоторых функций отсутствуют более чем 70% значений. Основываясь на этом проценте пропущенных значений, мы собираемся разработать нашу стратегию вменения.

3. EDA по функциям

Теперь давайте сделаем EDA по фактическим функциям. Поскольку есть два типа функций, то есть числовые функции и функции гистограммы, мы собираемся выполнить EDA отдельно для обеих этих функций. Однако у нас есть 100 числовых функций и 70 функций гистограммы. Таким образом, EDA для всех этих категорий невозможна. Поэтому мы собираемся выбрать 15 лучших функций из обоих типов, а затем выполнить для них EDA. Мы будем использовать важность функций, заданную RandomForestClassifier, для получения важных функций.

Функция для выбора функции :

def top_important_features(data, labels, top_x=15, verbose=10):
    '''
        This function uses random forests to get feature importances of the features and returns top_x important features
        and their feature importances.
        Returns:
            tuple of (features, importances).
    '''
    # training a random forest
    rf = RandomForestClassifier(n_estimators=200, n_jobs=-1, verbose=verbose, random_state=42)
    rf.fit(data, labels)
    
    # get the feature importances
    feat_imp = rf.feature_importances_
    imp_ind = np.argsort(feat_imp)[::-1] # getting the indices in decreasing order of importance
    top15_ft = data.columns[imp_ind][:15]
    top15_imp = feat_imp[imp_ind][:15]
    
    return(top15_ft, top15_imp)

Функция для выполнения одномерного анализа заданных функций:

def univariate_analysis(features):
    """
        This function takes a list of features and performs univariate analysis on them by plotting CDF, PDF, Boxplots and 
        printing mean, standard deviation and median for that feature.
    """
    for ft in features:
        print('---UNIVARIATE ANALYSIS OF', ft, '---')
        values = train_eda[ft]
        values0 = train_eda[train['class']=='neg'][ft]
        values1 = train_eda[train['class']=='pos'][ft]
        desc_neg = values0.describe() # for printing the mean and standard deviation values of the feature for individual classes
        desc_pos = values1.describe()
print("FOR NEGATIVE CLASS:- 1. Mean:", round(desc_neg['mean'], 3), '2. Standard Deviation:', round(desc_neg['std'], 3), '3. Median:', round(desc_neg['50%'], 3))
        print("FOR POSITIVE CLASS:- 1. Mean:", round(desc_pos['mean'], 3), '2. Standard Deviation:', round(desc_pos['std'], 3), '3. Median:', round(desc_pos['50%'], 3))
# plots
        fig, ax = plt.subplots(ncols=3, figsize=(18,6))
        sns.kdeplot(values0, ax=ax[0], shade=True, label='Neg')
        sns.kdeplot(values1, ax=ax[0], shade=True, label='Pos')
        sns.kdeplot(values0, ax=ax[1], cumulative=True, label='Neg')
        sns.kdeplot(values1, ax=ax[1], cumulative=True, label='Pos')
        sns.boxplot(data=train, x=Y, y=ft, ax=ax[2])
ax[0].set_title('PDF of '+ft+' for Class 0')
        ax[1].set_title('CDF of '+ft)
        ax[2].set_title('Boxplot of '+ft)
        ax[0].legend()
        ax[1].legend()
        plt.show()
        print('-'*100)
  • EDA по числовым характеристикам:

Во-первых, давайте выберем 15 основных числовых характеристик.

Теперь, когда у нас есть 15 основных функций, давайте проведем их одномерный анализ.

Среди 15 функций есть общая тенденция. Положительные значения класса имеют гораздо больший разброс по сравнению с отрицательным классом. Отрицательный класс имеет сравнительно меньший разброс, о чем свидетельствует его плотная PDF и очень крутая CDF для большинства функций.

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

Функции ci_000, aq_000, bj_000, ck_000, aa_000, dn_000, cq_000, ap_000, by_000, bx_000, bt_000, bb_000 разделили IQR для положительного и отрицательного классов, как показано на диаграмме. CDF и PDF также гораздо более распространены для положительного класса по сравнению с отрицательным классом.

Для функций ai_000, al_000 и am_0 более 95% точек данных имеют значение, равное или очень близкое к 0 для отрицательного класса.

Теперь давайте посмотрим, как соотносятся выбранные объекты с меткой класса.

Функции ci_000, aq_000, bj_000, ck_000, aa_000, dn_000, cq_000, ap_000, by_000, bx_000, bt_000, bb_000 имеют более высокую корреляцию около +0,5, что объясняет, почему точки данных положительного класса имели более высокое положительное значение по сравнению с точками данных отрицательного класса.

Характеристики am_0, al_000 и ai_000, которые имели большинство значений около 0, как видно из их одномерного анализа, имеют меньшее значение корреляции менее 0,4. Характеристика ai_000 имеет наименьшую корреляцию среди всех функций в районе 0,11–0,13.

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

Для большинства точек данных характеристика ai_000 имеет значение, равное 0. Есть некоторые точки данных, которые имеют ненулевое значение для обоих классов.

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

  • EDA для функций гистограммы

Во-первых, давайте выберем 15 основных функций для функций гистограммы.

Теперь, когда у нас есть 15 основных функций, давайте проведем их одномерный анализ.

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

Для функций ag_002, ag_001, cn_000, cn_001, az_000 и ay_005 более 95% функций имеют очень маленькие значения (сравнительно) для отрицательного класса.

Кроме того, функции ag_002, ag_003, ag_001, cn_000, cn_001 и ay_005 имеют медианное значение 0, показывая, что по крайней мере 50% значений равны 0 для отрицательного класса.

Из графика значимости мы видим, что наиболее важные характеристики были меньше или равны 0,03, в то время как только две функции, то есть ag_002 и ee_005, имеют значения больше 0,06 и 0,05 соответственно.

Теперь давайте посмотрим, как соотносятся выбранные объекты с меткой класса.

Характеристики ee_005, ag_003, ba_000, cn_001, ee_000, ba_003, cs_004 и ba_004 имеют корреляцию больше или равную 0,4.

ee_005 имеет наивысшее значение коэффициента корреляции около 0,49.

ag_001 и az_000 имеют самое низкое значение коэффициента корреляции около 0,18 и 0,2 соответственно.

Поскольку ag_001 и az_000 имеют наименьшую корреляцию, давайте проведем двумерный анализ обеих этих функций с помощью диаграмм рассеяния и посмотрим, улучшит ли использование двух функций что-либо. Во-первых, давайте проведем двумерный анализ ag_001.

Большинство значений ag_001 относительно малы для всех точек данных.

Все большие значения этой характеристики относятся к положительному классу.

Пришло время сделать то же самое с функцией az_000.

Объект az_000 имеет много пересечений для обоих классов.

Для этой функции также большинство значений маленькие.

  • Многовариантный анализ всех функций.

Для выполнения многовариантного анализа мы собираемся выполнить t_SNE и построить график результатов.

Из графика t_SNE мы видим, что отрицательные баллы класса разбросаны повсюду. Однако они находятся в четко определенных кластерах.

Однако положительные точки данных класса также находятся в кластерах, но эти кластеры довольно сильно пересекаются с кластерами отрицательного класса, как мы можем видеть на графике.

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

Вменение отсутствующих данных

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

  • или функции с менее чем 5% пропущенных значений, мы будем использовать среднее значение.
  • Для объектов с пропущенными значениями от 5 до 15% мы будем использовать медианное вменение из-за его устойчивости к выбросам.
  • Для объектов с пропущенными значениями между 15–70% мы будем использовать вменение на основе модели. Для этого мы собираемся использовать два разных метода:

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

Вменение на основе KNN

  • Для функций с отсутствующими значениями ›70% мы полностью исключим их из набора данных.

Давайте теперь выполним вменение пропущенных значений. Во-первых, мы собираемся отбросить функции с ›70% пропущенных значений, выполнить вменение среднего и среднего значения.

Примечание. strategy_list - это просто вложенный список, содержащий 4 разных списка, содержащих названия функций на основе стратегии, определенной выше.

Теперь давайте выполним импутация MICE и импутация на основе KNN для объектов, имеющих 15–70% пропущенных значений, импутируем все данные, а затем сохраним сформированный таким образом фрейм данных и объекты.

Затем мы загружаем эти объекты с диска, выполняем вменение в тестовом наборе данных и сохраняем их.

Нормализация данных

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

На этом завершается часть 1 этого блога, состоящего из двух частей. Во втором блоге мы собираемся обсудить часть моделирования и развертывание лучшей модели в экземпляре AWS EC2. И наконец, завершите это решение. Читайте часть 2 здесь.