
Ход работы
В начале выполнен импорт необходимых библиотек: numpy для числовых операций pandas для работы с набором данных; matplotlib для визуализации данных; sklearn для получения выборок, метрик качества, а также обработки данных.
Исходный набор данных загружен с диска и преобразован в датасет (Рисунок 1).
Рисунок 1 – Исходный набор данных
Как видно, данные предоставлены в не очень удобном формате: набор состоит из 1 столбца, а каждая строка содержит все характеристики в виде списка. Необходимо преобразовать датасет, разделив данные.
Для этого создан новый набор данных, где заголовки (heads) - название первого столбца исходного набора, разделенного на список командой split().
Значения (splited_values) берутся путем перебора строк и аналогичного разделения каждой строки на список значений. Результат разделения показан на Рисунке 2.
Рисунок 2 – Преобразованный датасет
Чтобы убедиться, что в наборе нет пропусков применена команда info() (Рисунок 3). Все значения заполнены, однако столбцы имеют названия в разных стилях и также в наборе есть характеристики, которые не будут использоваться: school и G2, G3.
Рисунок 3 – Информация о наборе данных
Для улучшения читабельности отдельные столбцы переименованы, согласно стилевой записи остальных. Для этого использован метод rename().
Часть данных представлена в качественном виде: например названия профессий родителей или причина выбора школы. Нейросеть не сможет их обрабатывать, поэтому такие значения нужно перевести в количественные. Для этого использован кодировщик OrdinalEncoder.
С разрозненными диапазонами данных сети сложнее работать, поэтому была выполнена стандартизация: при помощи MinMaxScaler входные значения отмасштабированы в диапазоне [0 ; 1].
Данные подготовлены далее выделены набор для целевого признака (target) и для входов сети (data). Данные на вход подразделены на тренировочную и валидационную выборки при помощи метода train_test_split.
Далее была создана последовательная модель нейронной сети, состоящая из 3 плотных слоев: входного, в 29 нейронов и 29 входами по числу входных характеристик, скрытого в 14 нейронов и выходного в 1 нейрон, который в конечном итоге должен содержать значение предсказанной оценки. В первых двух слоях используется функция активации ReLU, так как её рекомендовано использовать в решении задачи регрессии. Так как ReLU представляет собой простую кусочно-линейную функцию её использование позволяет быстро выполнять вычисления.
Для модели заданы следующие параметры: используемый метод нахождения минимального значения функции потерь - оптимизированный алгоритм градиентного спуска 'adam'; метрика ошибки - mse (среднеквадратичная ошибка); метрика качества предсказывания - mae (средняя сумма абсолютной разницы между фактическим и прогнозируемым значением).
На тренировочных данных проведено обучение сети длительностью в 50 эпох. То есть полный проход по НС через все тренировочные данные будет осуществлен 50 раз. Для обучения у модели вызывается метод fit().
Видно, что потери по квадратичной функции в конце обучения составляют около 30, при этом валидационные потери приобретают близкие значения. Средняя разница между реальным и ожидаемым значениями составляет около 5 единиц как для тренировочных так и для валидационных данных, что говорит о том, что предсказанные результаты в среднем отличаются о истинных на 25%. Обучение НС продемонстрировано на Рисунке 4.
Рисунок 4- Обучение нейронной сети
После обучения в соответствии с Рисунком 5 выведена структура НС посредством метода summary(). Выведенные характеристики следующие: модель последовательная, состоит из 3 плотных (Dense) слоёв с количеством нейронов 29, 14 и 1 соответственно. Первому слою соответствуют 869 входных весов и один параметр сдвига, второму - 420 весов (14*29 весов за каждую связь и еще 14 весов сдвига за каждый нейрон во втором слое), и последнему 15 весов (14 за веса от второго слоя и 1 параметр сдвига).
Также выведено общее кол-в параметров (1305) и отмечено, что все из них участвуют в обучении.
Рисунок 5 – Структура НС первой части
На валидационной выборке выполнено предсказание, результаты записаны в массив y_pred, после чего они объединены с истинными значениями в датасет df_match, как приведено на Рисунке 6.
Рисунок 6 – Составление датасета с истинными и предсказанными значениями
При помощи метода scatter() построен график истинных и полученных значений. По оси X взят диапазон по количеству записей в используемом наборе, по оси Y выведены предсказанные (фиолетовый) и реальные (зеленый) значения.
По графику видно, что для высоких оценок существует достаточно большой разброс истинных и предсказанных значений. НС в основном предполагает более низкие оценки. (Рисунок 7).
Рисунок 7 – Визуализация истинных и предсказанных значений
Построен график ошибок на обучающем и валидационном наборе по эпохам обучения. Согласно графику количество потерь постепенно снижается как для тренировочной, так и для вариационной выборок, пока не достигнет значения 30. (Рисунок 8).
Рисунок 7 – Графики потерь на тренировочном и валидационном наборах
Аналогичным образом построен график, отображающий изменение метрики качества на обучающем и на валидационном наборе за каждую эпоху обучения (Рисунок 8).
График показывает, что средняя разница между предсказанными и истинными значениями для валидационных и тренировочных данных примерно одинаково снижается, доходя до 5 единиц.
Рисунок 8 - Графики метрик на тренировочном и валидационном наборах