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

Когда студента сбивают с толку?

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

Определение типа проблемы

Предполагалось, что модель предскажет, будет ли студент продолжать (удержан) или бросит курс (сбит). Следовательно, это была классическая проблема бинарной классификации.

Установка целевой переменной

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

  1. Удаление повторяющихся записей (год-ученик-школа)
  2. Подмножество фрейма данных на основе Enrolment_Year. Поскольку данные приведены за 2015–2019 годы, я создал 5 подкадров данных.

3. Теперь выполните левое соединение в подкадре данных за 2015 год с подкадром данных за 2016 год на основе Student_No и School. Если в 2016 году записи об учащемся нет, поскольку это левое соединение, будет использоваться NA.

На изображении выше видно, что учащийся 100000727 не продолжил обучение в 2016 году. Для несовпадающих строк вставляются значения NaN.

4. Добавьте столбец «Сохранено», который мы инициализируем значением «Не установлено». Затем, если для столбца Enrolment_Year_y присутствует NaN (нулевое значение), установите Retained = 0, иначе Retained = 1.

Объединение нескольких наблюдений в одно наблюдение

Учащийся изучает несколько предметов, и каждая строка содержит только один предмет. Таким образом, лучший способ агрегировать информацию — сначала определить числовые типы данных и функцию, которая будет использоваться. SFS означает «Опрос студентов», SFT — «Отзывы студентов о преподавании», а NPS — «Оценка Net Promoter Score». Таким образом, взяв среднее значение этих значений для каждого курса, пройденного учащимся, можно получить только одно наблюдение для комбинации год-ученик-школа.

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

Теперь объедините фреймы данных stu_agg_ds и stu_cnt_ds.

Я также подсчитал, сколько лет ученик проучился в школе. После расчета я объединил это с приведенным выше кадром данных.

Я объединил всю эту агрегированную информацию с подготовленным кадром данных, который содержал сохраненную переменную.

А как насчет категориальных переменных?

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

Наконец, объедините все категориальные переменные с вычисленной агрегированной информацией.

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

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

Для запуска моделей машинного обучения нечисловая информация бесполезна. Для кодирования категориальных данных существует несколько методов, таких как кодировщик меток, один горячий кодировщик и т. д. Вот интересная статья, почему и как это сделать — https://medium.com/@contactsunny/label-encoder-vs-one- горячий кодировщик в машинном обучении-3fc273365621

Однако я выбираю get_dummies из pandas, так как это самый простой способ кодировать категориальные данные.

Вы можете ясно видеть, как распределена переменная Age. Это верно для всех других категориальных переменных. В итоге вы получите широкий фрейм данных.

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

Запуск алгоритма случайного леса ML будет включен во вторую часть. Ссылка на проект — https://github.com/vinitp1402/Student_Retention_Model.