Введение
Задача классификации качества стальных пластин актуальна на металлургическом производстве, в котором происходит большой объем обработки стали. Для продажи качественных стальных пластин необходимо проанализировать показания датчиков, измеряющие различные показания обработанной стальной пластины, чтобы отбраковать те, которые не соответствуют государственным или внутренним стандартам предприятия. Анализ всех данных может занять продолжительное время, прежде чем обнаружится брак партии пластин или неисправность оборудования. Для повышения скорости и качества анализа брака стальных пластин будут применены методы машинного обучения.
Машинное обучение (Machine Learning, ML) – это направление в науке и технологиях, способное обучить компьютер для решения тех или иных задач. Под этим подразумевают передачу аппаратно-программным комплексам некоего набора знаний с возможностью их накопления[4].
Для решения задачи классификации будет использован метод градиентного бустинга.
Метод градиентного бустинга
Градиентный бустинг – это метод композиции алгоритмов машинного обучения, в котором каждый следующий алгоритм старается компенсировать недостатки всех предыдущих алгоритмов. Градиентный бустинг может быть представлен следующей формулой[5]:
(1) |
где – композиция из N алгоритмов;
– базовый алгоритм.
Базовый алгоритм не должен быть очень сложным, чтобы не тратить время на его обучение. Это может быть константный алгоритм или алгоритм, возвращающий среднее значение (задача регрессии) или популярное значение (задача классификации). Следующим шагом, на основе обученного базового алгоритма необходимо найти такой вектор, который лучше всего уменьшит значение ошибки[5]:
(2) |
где – используемая функция потерь;
– вектор сдвигов ( );
– количество обучающих примеров.
Самым оптимальным вектором s, который максимально уменьшит значение ошибки будет значение антиградиента от функции F(s), так как он направлен в сторону скорейшего убывания функции[5]:
(3) |
После обучается новый базовый алгоритм, на основе подгонки значений алгоритма к значениям полученного вектора s, затем данный алгоритм добавляется в композицию. Эти шаги повторяются столько раз, пока не будет достигнута сходимость или условие останова алгоритма обучения.
Одним из самых эффективных методов использование градиентного бустинга в задачах классификации является построение градиентного бустинга над решающими деревьями.
Метод решающего дерева
Решающие деревья - это класс методов, который решает задачи прогнозирования так, как решал бы их человек. В общем случае — это k-ичное дерево с решающими правилами в нелистовых вершинах (узлах) и некотором заключении о целевой функции в листовых вершинах (прогнозом). Решающее правило — некоторая функция от объекта, позволяющее определить, в какую из дочерних вершин нужно поместить рассматриваемый объект [6]. Пример решающего дерева представлен на рис.1.
Рис. 1. Пример решающего дерева
Исходные данные
В качестве исходных данных (датасет) был использован открытый набор данных Faulty Steel Plates[7]. Пример данных представлен на рис.2.
Рис. 2. Пример исходных данных
Исходный датасет представляет собой 1941 размеченных по классам примеров. Каждый пример имеет 27 признаков, представляющие собой измерения показателей стальных пластин с помощью датчиков (измерение сторон пластины, тип используемой стали, коэфициенты отражения света от поверхности пластины и тд.). В датасете качество стальных пластин представлено в виде 7 классов:
хорошее изделие (Pastry);
искривление по вертикали (Z_Scratch);
искривление по горизонтали (K_Scratch);
разводы на поверхности (Stains);
загрязненная поверхность (Dirtiness);
вмятины (Bumps);
остальные дефекты (Other_Faults).
Задача состоит в том, чтобы на основе исходных данных обучить модель, которая позволит определять качество стальных пластин.
Анализ исходных данных и выбор метрики оценок
Перед обучением модели, необходимо проанализировать исходные данные по типам данных и наличие пропущенных значений. В исходном наборе все значения числовые, без пропусков, следовательно не требуют соответствующей предобработки
На рис.3 представлена гистограмма принадлежности примеров датасета к классам.
Рис. 3. Соотношение классов исходных данных
Из рис.2 видно, что классы не сбалансированы, поэтому для оценки качества обученной модели будут использоваться такие оценки как точность (precision), полнота (recall) и F-мера (F-score). Точность можно интерпретировать как долю объектов, названных классификатором положительными и при этом действительно являющимися положительными, а полнота показывает, какую долю объектов положительного класса из всех объектов положительного класса нашел алгоритм. Точность и полнота не зависят от соотношения классов и потому применимы в условиях несбалансированных выборок. Для расчета точности и полноты часто используют понятие матрицы ошибок. Такая матрица представлена в табл.1.
Матрица ошибок классификации Таблица 1.
y = 1 |
y = 0 |
|
Истино-положительное (True Positive - TP) |
Ложно-положительное (False Positive - FP) |
|
Ложно-отрицательное (False Negative - FN) |
Истино–отрицательное (True Negative - TN) |
В таблице (1) – это прогноз обученного алгоритма, а y – истинное значение класса. На основе этой таблицы можно сделать вывод, что ошибки классификации бывают двух видов: ложно-отрицательные (FN) и ложно-положительные (FP). Используя представленные значения, точность и полноту классификатора можно рассчитать, используя следующие формулы[8]:
(4) |
|
(5) |
Критерием, объединяющим точность и полноту, является F-мера. F-мера — это среднее гармоническое точности и полноты, которое вычисляется как[8]:
(6) |
Параметр в данном случае определяет вес точности в метрике, и при β = 1 это среднее гармоническое (с множителем 2, чтобы в случае точности и полноты равными 1 иметь F1 = 1).
Обучение модели и оценка качества
Для реализации метода градиентного бустинга будет использован алгоритм XGBClassifier, входящий в состав библиотеки xgboost.
Для тестовой модели обучим модель со стандартными параметрами, поделив данные на тренировочную и тестовую выборку в соотношении 70/30%. Оценки обученного алгоритма представлены на рис.4.
from xgboost import XGBClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report RANDOM_SEED = 42 test_size = 0.3 x_train, x_test, y_train, y_test = train_test_split(X, y,test_size = test_size, random_state = RANDOM_SEED) test_XGB = XGBClassifier() test_XGB.fit(x_train, y_train) test_XGB_pred = test_XGB.predict(x_test) test_XGB_report = classification_report(y_test, test_XGB_pred, target_names=classes) print(test_XGB_report) |
Рис. 4. Оценка качества тестового алгоритма
Из оценок точности, полноты и F-меры видно, что полученная тестовая модель хорошо предсказывает классы Z_Scratch, K_Scratch, Stains (со средней оценкой 95%), средне классы Dirtiness и Other_Faults (80% и 75% соответственно) и плохо классы Pastry и Bumps (приблизительно 60%). Однако обучение модели происходило со стандартными параметрами. Попробуем обучить новые модели, меняя параметры скорости обучения, глубины деревьев и количества деревьев.
Подбор гиперпараметров метода градиентного бустинга
Для обучения моделей с изменяемыми гиперпараметрами будут использованы библиотеки GridSearchCV [9] и StrarifiedKFold [10], позволяющие обучать модели используя k-блочную кросс-валидацию и словари параметров. Лучшая модель будет отобрана на основе наибольшей средней оценки F-макро (рис.5).
from sklearn.model_selection import GridSearchCV from sklearn.model_selection import StratifiedKFold xgb = XGBClassifier() learning_rate = [0.001, 0.01, 0.1, 0.6, 0.8, 1] n_estimators = [50, 100, 150, 200, 400] max_depth = [2, 4 , 6, 8] param_grid = dict(learning_rate=learning_rate, max_depth=max_depth, n_estimators=n_estimators) kfold = StratifiedKFold(n_splits=4, shuffle=True, random_state=RANDOM_SEED) grid_search = GridSearchCV(xgb, param_grid, scoring="f1_macro", n_jobs=-1, cv=kfold) grid_result = grid_search.fit(x_train, y_train) # Выводлучшегорезультата print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_)) grid_search_best_pred = grid_search.predict(x_test) grid_search_best_report = classification_report(y_test, grid_search_best_pred, target_names=classes) print(grid_search_best_report) |
Рис. 5. Гиперпараметры лучшей модели и ее оценка
Лучшая модель с оценкой F-меры равной 0.805 была получена с использованием параметров скорости обучения равной 0.1, максимальной глубины дерева равной 6 и количество деревьев равному 100. Оценка модели на тестовой выборке с этими гиперпараметрами приведена на рис.6.
Рис. 6. Оценка алгоритма с подобранными гиперпараметрами
Из рисунка (6) видно, что общие показатели F-меры каждого класса поднялись в среднем на 2%, однако этого недостаточно, чтобы хорошо предсказывать классы Pastry и Bumps. Для более тщательного анализа данных воспользуемся методом анализа главных компонент, а именно методом t-SNE.
Стохастическое вложение соседей с t-распределением
Стохастическое вложение соседей с t-распределением (t-distributed Stochastic Neighbor Embedding, t-SNE) - это алгоритм машинного обучения для визуализации, использующий метод нелинейного снижения размерности. Данный алгоритм хорошо подходит для визуализации пространства высокой размерности (большое количество признаков в исходных данных) в пространство более низкой размерности (двух- или трехмерное). В частности, метод моделирует каждый объект высокой размерности двух- или трёхмерной точкой таким образом, что похожие объекты моделируются близко расположенными точками, а непохожие точки моделируются с большой вероятностью точками, далеко друг от друга отстоящими[11]. Для реализации данного метода была использована библиотека sklearn.manifold.TSNE[12], входящая в состав платформы Anaconda. График визуализации полученного снижения размерности исходных данных представлен на рис.7.
fromsklearn.manifoldimport TSNE frommpl_toolkits.mplot3dimport axes3d X_embedded = TSNE(random_state = RANDOM_SEED, n_components = 3).fit_transform(X) tsne_df_X = pd.DataFrame(data = X_embedded, columns = ['tsne_1', 'tsne_2', 'tsne_3']) tsne_data = pd.concat([tsne_df_X, data['label']], axis = 1) fig = plt.figure(figsize=(15,15)) ax = fig.add_subplot(1,1,1, projection='3d') ax.set_xlabel('t-SNE Component 1', fontsize = 15) ax.set_ylabel('t-SNE Component 2', fontsize = 15) ax.set_zlabel('t-SNE Component 3', fontsize = 15) ax.set_title('3 component t-SNE', fontsize = 20) targets = classes colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k'] for target, color inzip(targets,colors): indicesToKeep = tsne_data['label'] == target ax.scatter(tsne_data.loc[indicesToKeep, 'tsne_1'] , tsne_data.loc[indicesToKeep, 'tsne_2'] , tsne_data.loc[indicesToKeep, 'tsne_3'] , c = color , s = 50) ax.grid() ax.legend(targets) |
Рис. 7. Анализ главных компонент методом t-SNE
Из рисунка (7) видно, что в отдельные кластерами выделены классы K_Scratch и Stains, которые по результатам оценок моделей получали высокие результаты. Все остальные классы почти лежат друг в друге и часто пересекаются между собой. Именно поэтому алгоритму сложно выделить тот или иной класс. Так как выделение основных признаков и изменения гиперпараметров модели не дало существенных результатов, то, возможно, для улучшения результатов необходимо увеличить количество примеров датасета.
Выводы
Исходных данных оказалось недостаточно, чтобы можно было хорошо предсказывать все классы, поэтому необходимо обучить модель на более большем примере данных. В статье рассмотрены основные способы и подходы к обучению модели на основе метода градиентного бустинга. На основе исходных данных наилучший результат был получен с использованием нестандартных гиперпараметров со средней F-мерой – 82%.
Список источников и литературы
Python [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://www.python.org/, свободный
Anaconda [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://www.anaconda.com/, свободный
XGBoost Python Package [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://xgboost.readthedocs.io/en/latest/python/python_api.html, свободный
Машинное обучение [Электронный ресурс] /. — Электрон. журн. — 2016. — Режим доступа: http://www.machinelearning.ru/wiki/index.php?title=Машинное_обучение, свободный
Градиентный бустинг [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://ru.coursera.org/lecture/supervised-learning/gradiientnyi-bustingh-CBjVA, свободный
Деревья решений и алгоритмы их построения [Электронный ресурс] /. — Электрон. журн. — 2014. — Режим доступа: http://datareview.info/article/derevya-resheniy-i-algoritmyi-ih-postroeniya/, свободный
Faulty Steel Plates [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://www.kaggle.com/uciml/faulty-steel-plates/home, свободный
Оценка классификатора (точность, полнота, F-мера) [Электронный ресурс] /. — Электрон. журн. — 2012. — Режим доступа: http://bazhenov.me/blog/2012/07/21/classification-performance-evaluation.html, свободный
sklearn.model_selection.GridSearchCV [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html, свободный
sklearn.model_selection.StratifiedKFold [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html, свободный
Стохастическое вложение соседей с t-распределением [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://ru.wikipedia.org/wiki/Стохастическое_вложение_соседей_с_t-распределением, свободный
sklearn.manifold.TSNE [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html, свободный