Понимание полного пайплайна науки о данных при создании реального проекта.

Чтобы воспроизвести этот проект, загрузите код из моего репозитория GitHub.

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

Цель проекта: использованиелинейной регрессии, алгоритма машинного обучения для создания модели, которая прогнозирует оценки учащегося на основе заданного атрибута.

Что нужно изучить

я. Представляем алгоритм, набор данных и различные библиотеки, используемые в проекте.
ii. Понимание данных с помощью исследовательского анализа данных.
iii. Предварительная обработка данных и проектирование признаков.
iv. раздел машинного обучения; прогнозное моделирование.
v. Сохранение и загрузка модели в виде файла.

1. Введение

Линейная регрессия уникальна тем, что относится к области математики, но также хорошо адаптируется к машинному обучению.

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

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

Библиотеки

мы начнем с импорта различных библиотек Python, которые помогут нам в наших исследованиях данных.

1.1. Библиотеки обработки данных

я. Pandas – это быстрый, мощный, гибкий и простой в использовании инструмент для анализа и обработки данных с открытым исходным кодом, созданный на основе языка программирования Python. Подробнее о пандах.

II. Numpy — один из самых мощных инструментов для научных вычислений с открытым исходным кодом, используемый учеными, статистиками и другими специалистами в области количественных вычислений. Вы можете прочитать о простоте использования NumPy и его магии здесь

1.2. Библиотеки визуализации данных

III. Matplotlib – это комплексная библиотека для создания статических, анимированных и интерактивных визуализаций на языке Python. Читайте о Matplotlib здесь.

IV. Seaborn — это библиотека визуализации данных Python, основанная на Matplotlib. Он предоставляет высокоуровневый интерфейс для рисования привлекательных и информативных статистических графиков. Подробнее о сиборне.

  1. 3Библиотеки для создания и оценки моделей
    Эти библиотеки и их операции будут подробно объясняться по мере продвижения по проекту.

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

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

Набор данных находится в папке data. Мы будем использовать метод pandas read для чтения обоих наборов данных и передать ; для параметра sep, поскольку каждый столбец разделен точкой с запятой.

Давайте просмотрим первые пять из обоих наборов данных.

  • у нас есть два разных набора данных maths course и portuguese language course, каждый из которых имеет одинаковые атрибуты.
  • Для простоты мы объединим и проанализируем оба набора данных вместе с помощью метода Pandas concatenate.
stu_mat.head()

stu_por.head()

# concatenate both datasets 
comb_df = pd.concat([stu_mat,stu_por],axis=0)

2.1 Набор данных

Набор данных об успеваемости студентов, использованный для этого исследования, был извлечен из хранилища данных UCI.
Данные разделены на две части: одна как «math course», а другая как «Portuguese course».

Мы объединили и проанализировали два отдельных набора данных вместе, потому что все они имеют одинаковые атрибуты.

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

Есть 1044 записей данных только с двумя разными школами.

Соотношение женщин и мужчин составляет 53% и 47% соответственно.

Средний возраст студента составляет 17 лет, минимум 15 лет и максимум 22 года.

В среднем учащийся может дважды отсутствовать в школе.
Общее количество функций составляет 33, из них 16 — целочисленный тип и 17 — строковый тип.

comb_df.describe(include='all').T

Давайте объединим два набора данных и удалим повторяющиеся строки, проверив их с помощью некоторого списка атрибутов.

  • Есть 382 повторяющихся строки.
  • Теперь давайте воспользуемся методом Pandas duplicated для удаления дубликатов из данных.
  • Знак ~ просто означает противоположность любого результата.
  • В этом контексте знак ~используется для отрицания результата логических значений.

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

2.3. Визуализация

I. Давайте проверим, как sex и age влияют на оценку учащегося.

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

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

Поэтому мы можем сказать, что чем старше возраст ученицы, тем выше ее успеваемость, а в противном случае - ученица мужского пола.

II. Может ли статус отношений с учеником повлиять на его/ее оценку?

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

III. Влияет ли уровень образования родителей на успеваемость учащихся?

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

Исследование корреляции между уровнем образования родителей и успехами детей, опубликованное на веб-сайте университета Ламар, показывает, как значительный уровень образования родителей влияет на успеваемость их подопечных.

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

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

IV. Как финансовые потребности студента влияют на его/ее оценку?

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

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

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

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

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

Мы можем сделать вывод, что нехватка финансов в данном случае не является основным фактором, влияющим на успеваемость учащихся.

карта
i. Определите фигуру Matplotlib
ii. Используйте метод pivot_table для создания сводной таблицы в стиле Excel.
iii. Постройте тепловую карту и примените необходимые аргументы.
iv. Установите различные метки

3. Предварительная обработка данных и проектирование признаков.

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

3.1. Зачем разрабатывать функции

Лучшие функции означают гибкость.

Вы можете выбрать «не те модели» (менее оптимальные) и все равно получить хорошие результаты. Большинство моделей могут улавливать хорошую структуру данных.

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

Лучшие функции означают более простые модели.

С хорошо спроектированными функциями вы можете выбрать «неправильные параметры» (менее оптимальные) и все же получить хорошие результаты по тем же причинам. Вам не нужно много работать, чтобы подобрать правильные модели и максимально оптимизированные параметры.

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

3.2. Лучшие функции означают лучшие результаты.

Алгоритмы, которые мы использовали, очень стандартны для Kagglers. Мы потратили большую часть наших усилий на разработку функций.
Ксавьер Конорт в «Вопросах и ответах с Ксавьером Конортом» о победе в испытании Flight Quest на Kaggle.

Давайте проверим форму фрейма данных.

df.shape
(662, 33)

3.3. Начнем с бинаризации, дискретизации и нормализации некоторых признаков в наборе данных.

I. age feature

  • Затем мы создадим признак age_bin, сгруппировав возраст в teenager, youg_adult и adult.
  • мы создадим vote_age двоичную функцию, показывающую, имеет ли студент право голоса или нет.
  • Затем мы создадим объект is_teenager. Эта бинарная функция показывает, является ли учащийся подростком или нет.
    Метод cut классифицирует непрерывные значения в заданном диапазоне.

II. Medu(Mother education) и Fedu( father education) функция

числовое значение:
0 — без образования
1 — начальное образование и выше.

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

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

Функция III. Fjob и Mjob

  • Создайте Fjob_cat, объединив функции at_home,teacher,health в одну категорию.
  • Мы оставим Mjob (Работа матери) как есть.
# use lambda expression to create category of 
# three;'other','services' and 'employee'
df.loc[:,'Fjob_cat'] = df['Fjob'].apply(lambda x: x if (x == 'other' or x == 'services') else 'employee')

IV.guardian особенность

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

v. absence особенность

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

VI. Кодирование меток Порядковые-категориальные переменные

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

VII. Горячее кодирование непорядковой категории

Закодируйте категориальные признаки как однократный числовой массив.

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

Функции кодируются с использованием схемы одноразового кодирования (также известной как «один из K» или «фиктивный»).

Это создает двоичный столбец для каждой категории и возвращает разреженную матрицу или плотный массив (в зависимости от параметра разреженности).

VIII. Непрерывные переменные

Обработка асимметрии и выбросов в непрерывных переменных

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

Итак, мы, прежде всего, визуализируем continous variables, а затем решим либо закрыть его, либо удалить статистическим методом.

  • Некоторые данные для лиц старше 21 года кажутся выбросами.
  • Распределение числа пропусков имеет положительную асимметрию.
  • Внизу график между G1 и G2 имеет выбросы.

Либо мы используем функцию Z-оценки, определенную в библиотеке Scipy, для обнаружения выбросов, либо масштабируем наши данные с помощью Standardization.

Z-оценка – это число стандартных отклонений со знаком, на которое значение наблюдения или точки данных превышает среднее значение того, что наблюдается или измеряется

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

Z-оценка находит распределение данных, где среднее значение равно 0, а стандартное отклонение равно 1, то есть нормальное распределение.

В большинстве случаев используется пороговое значение 3 или -3, т. е. если значение Z-оценки больше или меньше 3 или -3 соответственно, эта точка данных будет идентифицирована как выбросы.

Стандартизация

Стандартизация (или нормализация z-оценки) масштабирует значения с учетом стандартного отклонения.

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

Примечание. Мы будем использовать стандартное масштабирование во время создания модели.

IX. Проверка мультиколлинеарности

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

Фактор инфляции дисперсии (VIF) – это мера коллинеарности переменных-предикторов в рамках множественной регрессии.

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

V.I.F. = 1 / (1 – R^2)

  • Значение VIF ‹= 4 предполагает отсутствие мультиколлинеарности
  • Значение VIF = 10 подразумевает серьезную мультиколлинеарность, и поэтому эти функции будут исключены.

4. СОЗДАНИЕ МОДЕЛИ

Наконец, мы подошли к разделу создания модели.

  • Мы разделим данные на train и test, используя метод train_test_split из библиотеки Scikit-learn.

Sklearn (или Scikit-learn): библиотека Python, предлагающая различные функции обработки данных, которые можно использовать для классификации, кластеризации и выбора модели.
Train_test_split : – это функция выбора модели Sklearn для разделения массивов данных на два подмножества: для обучающих данных и для тестовых данных.

Объяснение параметров Train_test_split

X, y: первый параметр — это набор данных, который вы выбираете для использования.
train_size: этот параметр задает размер набора данных для обучения.
test_size: этот параметр определяет размер тестового набора данных.
random_state: режим по умолчанию выполняет случайное разбиение с использованием np.random , но в качестве альтернативы вы можете добавить постоянное целое число ценить.

I. Масштабирование данных

При этом учитывается стандартное отклонение, что снижает влияние выбросов.

II. Линейная регрессия

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

y = wx + b

x представляет наши входные данные
y представляет наш прогноз. w — наклон линии
b — точка пересечения, то есть значение y при x = 0

Многомерная регрессия

Линейная регрессия с несколькими переменными может выглядеть так:

f(x,y,z)=w1x + w2y + w3z

где w представляет коэффициенты или веса, которые наша модель попытается изучить.
Переменные x,y,z представляют собой атрибуты или отдельные фрагменты информации, которые у нас есть о каждом наблюдении.

Вывод

y=wx+b
y = (y1y2…yn)
y = (w1xi1+w2xi2+wnxin+b)

Обучение моделей

X_train shape = (496, 58) and y_train shape = (496,)
X_test shape = (166, 58) and y_test shape = (166,)


 Dummy train score  0.0
 Dummy test score  -0.01040076083093755


train score  0.8461778266234085
test score  0.9006398918375393

Важность функции

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

График ниже показывает, что G1 (первый класс), G2 (второй класс) и Absented_1 (количество пропусков) оказывают значительное влияние на прогнозы модели.

5. Оценка модели

mean_squared_error

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

print('test mse ',mean_squared_error(y_test,prediction))
print('\n\n dummy test mse ',mean_squared_error(y_test,y_predict_dummy_mean))
test mse  1.7110916870356683


dummy test mse  17.400226050534084

R-Squared

Метрика R-Squared дает нам способ измерить качество соответствия или то, насколько хорошо наши данные соответствуют модели. Чем выше показатель R-Squared, тем лучше данные соответствуют нашей модели.

print('dummy test r2_score',r2_score(y_test,y_predict_dummy_mean))
print('test r2_score',r2_score(y_test,prediction))

dummy test r2_score -0.01040076083093755
test r2_score 0.9006398918375393

Делать прогнозы

Визуализация прогнозируемых значений по сравнению с целевыми значениями.

График ground_truth против prediction

Сохранение модели для дальнейшего использования

import pickle
# save the model
with open('model/multi_linear_reg.sav','wb') as f:
     pickle.dump(lin_reg, f)

Загрузка модели для прогноза

Пользовательские predictor вспомогательные функции помогут нам использовать только четыре переменные first_grade,second_grade,absences,index для наших прогнозов.

from predictor import Predictor
predict = Predictor('model/multi_linear_reg.sav','data/prep_df.csv',scaler)
first_grade = 5
second_grade = 4
absences = 0
index = 6
predict.get_prediction(first_grade,second_grade,absences,index)
output: 2