Введение:

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

2. Здесь каждой ложноположительной точке будет присвоена стоимость = 10, а каждой ложноотрицательной точке будет присвоена стоимость = 500. Стоимость = (10 * FP) + (500 * FN).

3. Мы должны снизить стоимость, помня о производительности.

Цель:

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

Обзор набора данных:

Набор данных был взят из Репозитория машинного обучения UCI. Здесь нам предоставлены данные обучения и тестирования.

Данные поезда состоят из 60 000 точек данных, из которых 59 000 точек данных являются отрицательными, а 1000 — положительными. В тестовом наборе данных 16 000 точек данных.

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

Имена атрибутов данных были анонимизированы по соображениям собственности. Он состоит как из одиночных числовых счетчиков, так и из гистограмм, состоящих из бинов с разными условиями. Обычно гистограммы имеют открытые условия на каждом конце. Например, если мы измеряем температуру окружающей среды «T», то гистограмма может быть определена с 4 бинами, где:

ячейка 1 собирает значения температуры T ‹ -20
ячейка 2 собирает значения температуры T ›= -20 и T ‹ 0
ячейка 3 собирает значения температуры T ›= 0 и T ‹ 20
> ячейка 4 собирает значения температуры T › 20

Атрибуты следующие: класс, затем анонимизированные оперативные данные. Операционные данные имеют идентификатор и идентификатор корзины, например «Identifier_Bin». Всего имеется 171 атрибут, из которых 7 являются переменными гистограммы. Отсутствующие значения обозначаются «na».

EDA:

Очистка данных:

Первый шаг — проверить наличие повторяющихся строк. Мы должны удалить повторяющиеся строки.

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

Замечено, что из 170 столбцов только один столбец не содержит пустых значений. Таким образом, почти во всех столбцах отсутствуют значения. Также наблюдается наличие 160 столбцов с процентом пропущенных значений менее 30 и 2 столбцов с более чем 80% пропущенных значений.

Удалены строки со всеми элементами как NA и столбцы с более чем 80% отсутствующими значениями, потому что они не помогают в классификации.

Из данных также видно, что в 129 столбцах пропущено менее 5% значений. Отброшены строки отрицательных точек данных, в которых есть столбцы с менее чем 5% отсутствующих значений.

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

Обучение и тестирование разделения:

Разделение данных поезда на 70% данных поезда и 30% тестовых данных. Использовали стратифицированную выборку для разделения данных.

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

Выбор функции:

В столбце, если среднее значение, стандартное значение, 25% и 75% одинаково для положительных и отрицательных точек данных, то это бесполезно для классификации. Таким образом, удалены столбцы, среднее значение которых, стандартное значение, 25,75%, почти одинаково для положительных и отрицательных точек.

По рекурсивной функции Исключение с использованием модели случайного леса рекурсивно отбрасывало наименее важную функцию 5 раз.

Далее мы должны искать коррелированные функции. Взял все функции, имеющие корреляцию > 0,999, и исключил функции, которых нет в списке 100 наиболее важных функций.

  1. Количество функций уменьшено со 170 до 158 при выборе функций.
  2. Создана новая функция под названием MissingIndicator. Она дает True/False для отсутствующих значений.

Методы вменения на основе моделей

  1. Чтобы решить проблему пропущенных значений, мы должны заменить значения NaN методами вменения.
  2. Поэтому для вменения пропущенных значений я использовал такие модели, как линейная регрессия, KNN, случайный лес и XGboost.
  3. Чтобы выбрать лучшую модель для импутации, я вменил пропущенные значения для первых 10 столбцов и вычислил тестовую ошибку R-квадрат после импутации каждого столбца.

4. Замечено, что вменение RF дает лучшую ошибку R-квадрата, чем другие модели для большинства столбцов.

5. Это указывает на то, что RF лучше прогнозирует пропущенные значения.

6. Следовательно, выбран RF для имитации пропущенных значений.

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

МЛ Модели:

Сначала мы обучаем такие модели, как Linear SVM, Kernel SVM, Random Forest и XGboost, путем повышения выборки данных.

Поскольку набор данных сильно несбалансирован, мы должны увеличить выборку данных. Здесь мы использовали метод передискретизации синтетического меньшинства (SMOTE). Новые примеры могут быть синтезированы из существующих примеров с помощью SMOTE. Это тип увеличения данных для класса меньшинства.

1. Линейный SVM:

Здесь мы использовали GridSearch CV с 10-кратной перекрестной проверкой и построили график параметра регуляризации альфа по сравнению со средним значением test_f1_score, чтобы выбрать лучшие гиперпараметры.

  1. На приведенном выше графике видно, что f1_score модели уменьшается со значением alph как для петли, так и для логарифмической потери.
  2. Модель работает почти одинаково как для логарифмической, так и для шарнирной потери.
  3. из best_params видно, что модель с альфа=0,0001 и loss=шарниром дает высокий показатель f1_score. Теперь обучаем модель с помощью best_params
*************************************
Train Accuracy is 0.7275762382316824
Test Accuracy is 0.9900603478878239
*************************************
Train F1_score is 0.6301255666128275
Test F1_score is 0.6129032258064517
*************************************
Train AUC_score is 0.7299939144987069
Test AUC_score is 0.7216365498132755
*************************************

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

Матрица стоимости и путаницы после изменения порога.

***************************
Train Accuracy :  0.9658335038886615
Test Accuracy:  0.8191338303159389
***************************
Train f1_score:  0.9671911658129737
Test f1_score:  0.15622412365443003
***************************
Train AUC:  0.965540386155151
Test AUC:  0.8801114323575473
***************************

  1. За счет изменения порога стоимость теста снижена с 83510 до 38900.
  2. Здесь отзыв для class=1 равен 0,943, точность равна 0,085. Отзыв все еще можно улучшить, но точность будет очень-очень низкой.
  3. Количество ложноотрицательных результатов здесь 17, но есть 3040 ложноположительных результатов, что очень много. Мы хотим, чтобы точность также была достаточно хорошей.

2. Ядро SVM:

Мы использовали GridSearch CV с 10-кратной перекрестной проверкой и построили график зависимости параметра регуляризации от среднего значения test_f1_score, чтобы выбрать лучшие гиперпараметры. Пожалуйста, найдите код здесь.

  1. Из приведенного выше графика видно, что f1_score модели увеличивается со значением C.
  2. Замечено, что модель с C=1000 дает высокий показатель f1_score.

После обучения модели с помощью best_params я получил следующие результаты.

*************************************
Train Accuracy is 0.9998209169054442
Test Accuracy is 0.9883445746065554
*************************************
Train F1_score is 0.9998225197129891
Test F1_score is 0.66553480475382
*************************************
Train AUC_score is 0.9998202152604043
Test AUC_score is 0.823865799301289
*************************************

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

***************************
Train Accuracy :  0.9997697503069995
Test Accuracy:  0.9855638385989823
***************************
Train f1_score:  0.9997718399837753
Test f1_score:  0.6443148688046648
***************************
Train AUC:  0.9997678990833131
Test AUC:  0.8633640525237923
***************************

  1. При использовании оптимального порога стоимость теста снижена с 52930 до 41150.
  2. Здесь отзыв = 0,73 и точность = 0,57, оба низкие для класса = 1.
  3. Модель имеет низкую стоимость обучения и высокую стоимость тестирования, что указывает на то, что модель переоснащается и не может правильно классифицировать тестовые данные.
  4. Модель предсказала 79 ложноотрицательных точек на основании тестовых данных. i,e 26% положительных баллов не классифицируются как отрицательные, что является высоким показателем.

3. XGBoost

Мы использовали GridSearch CV с 3-кратной перекрестной проверкой и построили график зависимости оценщика от среднего test_f1_score для каждой глубины, чтобы выбрать лучшие гиперпараметры. Пожалуйста, найдите код здесь.

  1. Здесь замечено, что по мере увеличения глубины оценщики увеличивают модель f1_score.
  2. При глубине = 10 и оценках = 500 модель дает хороший показатель f1_score.

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

*************************************
Train Accuracy is 1.0
Test Accuracy is 0.9944385279848539
*************************************
Train F1_score is 1.0
Test F1_score is 0.8483870967741935
*************************************
Train AUC_score is 1.0
Test AUC_score is 0.9366166726900372
*************************************

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

***************************
Train Accuracy :  1.0
Test Accuracy:  0.9959176428824991
***************************
Train f1_score:  1.0
Test f1_score:  0.8783068783068783
***************************
Train AUC:  1.0
Test AUC:  0.9144578966389592
***************************

  1. При использовании лучшего порога стоимость теста была увеличена с 19070 до 25680.
  2. Здесь стоимость поезда = 0, т. е. точность = 100%.
  3. Здесь модель имеет высокую полноту и хорошую точность для класса = 1.
  4. Модель предсказала 51 тестовую точку данных как отрицательную, а не положительную.
  5. Настройка порога не способствует снижению стоимости этой модели.

4. Случайный лес:

Мы использовали GridSearch CV с 3-кратной перекрестной проверкой и построили график зависимости оценщика от среднего test_f1_score для каждой глубины, чтобы выбрать лучшие гиперпараметры. Пожалуйста, найдите код здесь.

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

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

*************************************
Train Accuracy is 1.0
Test Accuracy is 0.9944385279848539
*************************************
Train F1_score is 1.0
Test F1_score is 0.8483870967741935
*************************************
Train AUC_score is 1.0
Test AUC_score is 0.9366166726900372
*************************************

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

***************************
Train Accuracy :  1.0
Test Accuracy:  0.9934327298544551
***************************
Train f1_score:  1.0
Test f1_score:  0.8310502283105021
***************************
Train AUC:  1.0
Test AUC:  0.9524701843151427
***************************

  1. За счет использования лучшего порогового теста стоимость снижена с 12300 до 10830.
  2. Здесь стоимость поезда низкая по сравнению с другими моделями.
  3. Отмечено, что модель имеет высокую полноту и среднюю точность.
  4. Модель предсказала 9 тестовых точек данных как отрицательные, а не положительные. Это число меньше по сравнению с LR,SVM,Kernel SVM,XGboost.

5. XGBoost с использованием пользовательского кода для проверки kfold

В предыдущем подходе gridsearch cv перекрестная проверка kfold выполнялась для данных с повышенной выборкой, поэтому высока вероятность того, что аналогичные точки могут присутствовать в данных поезда и перекрестной проверки. Это приводит к переоснащению данных.

Теперь мы использовали пользовательский код вместо cv поиска по сетке. Здесь сначала мы разделяем данные на обучение и резюме, а затем повышаем дискретизацию данных обучения с помощью SMOTE. Мы использовали XGBoost в качестве модели и num_folds=3.

Построил график зависимости количества оценщиков от стоимости для каждой глубины.

  1. Из приведенного выше графика видно, что при оценках = 100 и глубине = 5 стоимость резюме меньше.
  2. Итак, обучение модели с оценщиками = 100 и глубиной = 5.
*************************************
Train Accuracy is 1.0
Test Accuracy is 0.9944976925807597
*************************************
Train F1_score is 1.0
Test F1_score is 0.8477905073649755
*************************************
Train AUC_score is 1.0
Test AUC_score is 0.9301005902903264
*************************************

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

Train Accuracy :  0.9984010437986083
Test Accuracy:  0.984439711276772
***************************
Train f1_score:  0.9984177415475755
Test f1_score:  0.6796589524969548
***************************
Train AUC:  0.9983865971397594
Test AUC:  0.9577117214793399
***************************

  1. При использовании оптимального порога стоимость теста была снижена с 21020 до 12920.
  2. Здесь стоимость поезда=1250.
  3. Отмечено, что модель имеет высокую полноту и среднюю точность.
  4. Модель предсказала 21 ложноотрицательный результат.
  5. kfold cv с пользовательским кодом помог уменьшить переоснащение модели.

6. Случайный лес с пользовательской проверкой kfold:

Здесь мы использовали пользовательский код вместо cv поиска по сетке. Здесь сначала мы разделяем данные на обучение и резюме, а затем отбираем данные поезда с помощью SMOTE. Мы использовали Random Forest в качестве модели и num_folds=3.
Построили график зависимости количества оценщиков от стоимости для каждой глубины. Пожалуйста, нажмите здесь для получения кода.

Замечено, что при глубине = 15 и num_estimators = 150 мы получили меньшую стоимость. поэтому тренируйте модель с этими параметрами. Нажмите здесь для получения кода.

*************************************
Train Accuracy is 0.9985801268931641
Test Accuracy is 0.9906519938468821
*************************************
Train F1_score is 0.9985946698740267
Test F1_score is 0.7716763005780347
*************************************
Train AUC_score is 0.9985675273552941
Test AUC_score is 0.9412353933261054
*************************************

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

***************************
Train Accuracy :  0.9917621776504298
Test Accuracy:  0.9719559815406461
***************************
Train f1_score:  0.9919014084507043
Test f1_score:  0.5511363636363636
***************************
Train AUC:  0.9916877484640404
Test AUC:  0.9709956631731117
***************************

  1. При использовании оптимального порога стоимость теста снижена с 17750 до 9150.
  2. Здесь стоимость поезда почти близка к стоимости теста, что указывает на то, что модель не переоснащена.
  3. Отмечено, что модель имеет высокую полноту и среднюю точность.
  4. Модель предсказала 9 точек тестовых данных как отрицательные, а не положительные. Это число меньше по сравнению с LR, SVM, Kernel SVM, XGboost.

7. Модель стекирования:

Здесь мы используем обучающие данные и разбиваем их на 200 мини-наборов данных размером 5–10% от фактического. Затем мы обучаем модель стека (SVM, Kernel SVM, RF, XGBoost) с этими наборами данных и делаем прогнозы на основе фактических данных. Получаем 200 столбцов из прогнозов. Мы используем случайный лес, чтобы классифицировать 200 столбцов и сделать окончательный прогноз метки класса.

Замечено, что большинство моделей дали ложноотрицательные баллы ниже 30.

*************************************
Train Accuracy is 0.9996674171101105
Test Accuracy is 0.9923677671281506
*************************************
Train F1_score is 0.9996704773009556
Test F1_score is 0.8036529680365297
*************************************
Train AUC_score is 0.99966441220507
Test AUC_score is 0.9371991326346223
*************************************

***************************
Train Accuracy :  0.9909435120753173
Test Accuracy:  0.9765708200212992
***************************
Train f1_score:  0.9911037394451145
Test f1_score:  0.5917525773195876
***************************
Train AUC:  0.9908616861995974
Test AUC:  0.9667985784845199
***************************

  1. При использовании оптимального порога стоимость теста была снижена с 18930 до 10330.
  2. Отмечено, что модель имеет высокую полноту и среднюю точность.
  3. Модель предсказала 13 тестовых точек данных как отрицательные, а не положительные.
  4. Используя классификатор стека, мы уменьшили переоснащение. Но для того, чтобы сделать окончательные прогнозы, требуется время.

Результаты:

+ — — — — — — — - — — — — - — — — — — — — — — — — — +— — — —
| Model                                      | FN | FP   | TotalCost 
+ — — — — — — — - — — + — — -+ — — — — — — + — — — — — — + — — — — 
| Linear SVM                                  | 17 | 3040 | 38900 |
+ — — — — — — — - — — + — — -+ — — — — — — + — — — — — — +— — — — 
| Kernel SVM                                  | 79 | 165  | 41150 |
+ — — — — — — — -+ — — + — — -+ — — — — — — + — — — — — — +— — — — 
| XGBoost                                     | 51 | 18   | 25680 |
+ — — — — — — — -+ — — + — — -+ — — — — — — + — — — — — — +— — — — 
| Random Forest                               | 27 | 84   | 14340 |
+ — — — — — — — -+ — — + — — -+ — — — — — — + — — — — — — +— — — — 
|XGBoost using Custom code for kfold for CV   | 21 | 242  | 12920 |
+ — — — — — — — -+ — — + — — -+ — — — — — — + — — — — — — +— — — — 
|Random Forest using Custom code for kfold CV | 9  | 465  | 9150  |
+ — — — — — — — -+ — — + — — -+ — — — — — — + — — — — — — +— — — —
|Stacking Model                               | 13 | 998  | 10330 |
+ — — — — — — — -+ — — + — — -+ — — — — — — + — — — — — — +— — — — 
  1. Перекрестная проверка Kfold с последующей повышающей дискретизацией и суммированием модели помогла уменьшить переоснащение модели.

2. Выбор KFold Random Forest в качестве лучшей модели, поскольку по сравнению с ней стоимость ниже. Он дал всего 9 ложноотрицательных баллов.

Заключительные выводы:

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

2. Здесь цена ложноотрицательного результата высока.

3. Из всех моделей KFold Random Forest правильно предсказал больше отказов компонентов, чем другие модели.

4. Всего 9 ложноотрицательных результатов, что мало по сравнению с другими моделями.

5. Точность и AUC также высоки для Random Forest.

6. Из-за низкой стоимости, ложных отрицательных результатов и высокой точности и AUC. Мы можем рассмотреть модель случайного леса, используя код kfold CV для этой задачи.

Будущая работа:

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

Ссылки

  1. https://pdfs.semanticscholar.org/7776/5b1f114eb1941998f820b907b7c7004bf3f2.pdf
  2. https://medium.com/swlh/aps-failure-at-scania-trucks-203975cdc2dd
  3. https://www.kdnuggets.com/2017/06/7-techniques-handle-imbalanced-data.html
  4. https://www.researchgate.net/publication/313067390_Combining_Boosted_Trees_with_Metafeature_Engineering_for_Predictive_Maintenance
  5. https://mrugankakarte.github.io/files/ORSI2018.pdf

Полный код доступен в моей учетной записи Github.