Наука о данных
Набор в кампус: EDA и классификация - Часть 2
День 15 из 100 дней науки о данных
Добро пожаловать в мое 100-дневное путешествие по задаче в области науки о данных. На 15-й день я работаю над набором данных Campus Recruitment Dataset, доступным на Kaggle.
Вы можете прочитать мою предыдущую часть здесь:
Во второй части я собираюсь затронуть следующие темы:
СОДЕРЖАНИЕ
- Сопоставление функций и создание дополнительных функций
- Модель прогноза
Резюме
В последней части я определил формулировку проблемы следующим образом: Университет XYZ хочет построить модель машинного обучения, чтобы знать, будет ли студент размещен или нет. Чтобы они могли уделить особое внимание и помочь им получить работу, данный набор данных можно рассматривать как проблему классификации или регрессии. В этом проекте я собираюсь рассмотреть эту проблему классификации, где задача состоит в том, чтобы определить, будет ли кандидат размещен или нет. Это проблема бинарной классификации . - Набор в кампусе: EDA и классификация - Часть 1.
Наборы данных содержат 15 функций, но мы обнаружили, что некоторые из них не являются необходимыми для нашего анализа. Так что я собираюсь их бросить.
Так что давайте начнем с отказа от нежелательных функций.
Отображение и создание функций
Давайте отбросим все ненужные столбцы, как упоминалось в предыдущем разделе.
- Совет Госкомстата
- Совет HSC
- Специализация HSC
- Тип степени
- Зарплата
data.drop(['ssc_b','hsc_b', 'hsc_s', 'degree_t', 'salary'], axis=1, inplace=True)
Как было показано в предыдущей части, наши данные имеют некоторые категориальные значения, и, например, гендерные характеристики имеют значения M и F для мужчин и женщин, соответственно.
Давайте сопоставим категориальный признак с числовым.
К категориальным признакам относятся:
- Пол. У гендерных характеристик есть мужские и женские ценности. Я собираюсь сопоставить 0 для мужчин и 1 для женщин.
- Опыт работы: для параметра "Опыт работы" заданы значения "Да" и "Нет". Я собираюсь сопоставить 0 для Нет и 1 для Да.
- Статус: функция статуса имеет значения "Не размещено" и "Размещено". Опять же для этих функций я отображаю 0 для не размещенных значений и 1 для размещенных значений.
- Специализация. У характеристик специализации есть два значения: Mkt & HR и Mkt & Fin. Я собираюсь сопоставить 0 с Mkt & HR и 1 с Mkt & Fin.
data["gender"] = data.gender.map({"M":0,"F":1}) data["workex"] = data.workex.map({"No":0, "Yes":1}) data["status"] = data.status.map({"Not Placed":0, "Placed":1}) data["specialisation"] = data.specialisation.map({"Mkt&HR":0, "Mkt&Fin":1})
Проверим все столбцы.
data.columns # Output Index(['gender', 'ssc_p', 'hsc_p', 'degree_p', 'workex', 'etest_p', 'specialisation', 'mba_p', 'status'], dtype='object')
Взгляните на наши окончательные данные.
data.head()
А теперь давайте добавим несколько дополнительных функций.
Создание дополнительных функций
Давайте добавим несколько новых функций.
- Процентное соотношение HSC и SSC
- Степень и процентное соотношение HSC
- Степень и процентное соотношение SSC
- Соотношение MBA и степени в процентах
- Процентное соотношение теста MBA и трудоустройства
# Function to create additional features def new_features(df): df['hsc_to_ssc'] = df['hsc_p'] / df['ssc_p'] df['degree_to_hsc'] = df['degree_p'] / df['hsc_p'] df['degree_to_ssc'] = df['degree_p'] / df['ssc_p'] df['mba_to_degree'] = df['mba_p'] / df['degree_p'] df['mba_to_etest'] = df['mba_p'] / df['etest_p'] return df data = new_features(data)
Прогнозирование модели
Теперь наши данные готовы для подготовки модели для прогнозирования решений. Существует множество алгоритмов прогнозирования, которые можно попробовать. В этом проекте я буду использовать алгоритмы классификации - K-ближайший сосед, дерево решений, SVM, случайный лес и гауссовский наивный байесовский алгоритм.
Первым делом нам нужно импортировать все необходимые библиотеки.
# machine learning from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.naive_bayes import GaussianNB from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix, classification_report from sklearn import preprocessing
Теперь давайте разделим набор данных на обучающие и тестовые данные.
# Separating Features and Target X = data.copy().drop('status', axis=1) y = data['status'] # scale each features X_scaled = preprocessing.scale(X) #Train Test Split X_train, X_test, Y_train, Y_test = train_test_split(X_scaled, y, test_size=0.3) X_train.shape, Y_train.shape, X_test.shape # Output ((150, 13), (150,), (65, 13))
Классификация KNN
# k-nearest neighbor knn = KNeighborsClassifier(n_neighbors = 3) knn.fit(X_train, Y_train) knn_Y_pred = knn.predict(X_test) knn_accuracy = knn.score(X_test, Y_test) knn_accuracy # Output 0.8769230769230769
Давайте создадим тепловую карту матрицы путаницы
# creating confusion matrix heatmap conf_mat = confusion_matrix(Y_test, knn_Y_pred) fig = plt.figure(figsize=(10,7)) group_names = ['True Neg','False Pos','False Neg','True Pos'] group_counts = ["{0:0.0f}".format(value) for value in conf_mat.flatten()] labels = [f"{v1}\n{v2}" for v1, v2 in zip(group_names,group_counts)] labels = np.asarray(labels).reshape(2,2) sns.heatmap(conf_mat, annot=labels, annot_kws={"size": 16}, fmt='') plt.title("Confusion Matrix") plt.xlabel("Predicted Label") plt.ylabel("True Label") plt.show()
# getting precision, recall and f1-score via classification report print(classification_report(Y_test, knn_Y_pred)) # Output precision recall f1-score support 0 0.75 0.83 0.79 18 1 0.93 0.89 0.91 47 accuracy 0.88 65 macro avg 0.84 0.86 0.85 65 weighted avg 0.88 0.88 0.88 65
Классификация дерева решений
# Decision Tree decision_tree = DecisionTreeClassifier() decision_tree.fit(X_train, Y_train) decision_tree_Y_pred = decision_tree.predict(X_test) decision_tree_accuracy = decision_tree.score(X_test, Y_test) decision_tree_accuracy # Output 0.8615384615384616
Давайте создадим тепловую карту матрицы путаницы.
# creating confusion matrix heatmap conf_mat = confusion_matrix(Y_test, decision_tree_Y_pred) fig = plt.figure(figsize=(10,7)) group_names = ['True Neg','False Pos','False Neg','True Pos'] group_counts = ["{0:0.0f}".format(value) for value in conf_mat.flatten()] labels = [f"{v1}\n{v2}" for v1, v2 in zip(group_names,group_counts)] labels = np.asarray(labels).reshape(2,2) sns.heatmap(conf_mat, annot=labels, annot_kws={"size": 16}, fmt='') plt.title("Confusion Matrix") plt.xlabel("Predicted Label") plt.ylabel("True Label") plt.show()
# getting precision, recall and f1-score via classification report print(classification_report(Y_test, decision_tree_Y_pred)) precision recall f1-score support 0 0.70 0.89 0.78 18 1 0.95 0.85 0.90 47 accuracy 0.86 65 macro avg 0.82 0.87 0.84 65 weighted avg 0.88 0.86 0.87 65
Машина опорных векторов
# Support Vector Machine svc = SVC() svc.fit(X_train, Y_train) svm_Y_pred = svc.predict(X_test) svc_accuracy = svc.score(X_test, Y_test) svc_accuracy # Output 0.8615384615384616
Давайте создадим тепловую карту матрицы путаницы.
# creating confusion matrix heatmap conf_mat = confusion_matrix(Y_test, svm_Y_pred) fig = plt.figure(figsize=(10,7)) group_names = ['True Neg','False Pos','False Neg','True Pos'] group_counts = ["{0:0.0f}".format(value) for value in conf_mat.flatten()] labels = [f"{v1}\n{v2}" for v1, v2 in zip(group_names,group_counts)] labels = np.asarray(labels).reshape(2,2) sns.heatmap(conf_mat, annot=labels, annot_kws={"size": 16}, fmt='') plt.title("Confusion Matrix") plt.xlabel("Predicted Label") plt.ylabel("True Label") plt.show()
# getting precision, recall and f1-score via classification report print(classification_report(Y_test, svm_Y_pred)) precision recall f1-score support 0 0.70 0.89 0.78 18 1 0.95 0.85 0.90 47 accuracy 0.86 65 macro avg 0.82 0.87 0.84 65 weighted avg 0.88 0.86 0.87 65
Случайный лес
# Random Forest random_forest = RandomForestClassifier(n_estimators=1000) random_forest.fit(X_train, Y_train) random_forest_Y_pred = random_forest.predict(X_test) random_forest.score(X_train, Y_train) random_forest_accuracy = random_forest.score(X_test, Y_test) random_forest_accuracy # Output 0.8461538461538461
Давайте создадим тепловую карту матрицы путаницы.
# getting precision, recall and f1-score via classification report print(classification_report(Y_test, random_forest_Y_pred)) # Output precision recall f1-score support 0 0.68 0.83 0.75 18 1 0.93 0.85 0.89 47 accuracy 0.85 65 macro avg 0.81 0.84 0.82 65 weighted avg 0.86 0.85 0.85 65
Наивный Байес по Гауссу
# Gaussian Naive Bayes gaussian = GaussianNB() gaussian.fit(X_train, Y_train) gaussian_Y_pred = gaussian.predict(X_test) gaussian_accuracy = gaussian.score(X_test, Y_test) gaussian_accuracy # Output 0.8153846153846154
Давайте создадим тепловую карту матрицы путаницы.
# creating confusion matrix heatmap conf_mat = confusion_matrix(Y_test, gaussian_Y_pred) fig = plt.figure(figsize=(10,7)) group_names = ['True Neg','False Pos','False Neg','True Pos'] group_counts = ["{0:0.0f}".format(value) for value in conf_mat.flatten()] labels = [f"{v1}\n{v2}" for v1, v2 in zip(group_names,group_counts)] labels = np.asarray(labels).reshape(2,2) sns.heatmap(conf_mat, annot=labels, annot_kws={"size": 16}, fmt='') plt.title("Confusion Matrix") plt.xlabel("Predicted Label") plt.ylabel("True Label") plt.show()
# getting precision, recall and f1-score via classification report print(classification_report(Y_test, gaussian_Y_pred)) # Output precision recall f1-score support 0 0.62 0.83 0.71 18 1 0.93 0.81 0.86 47 accuracy 0.82 65 macro avg 0.78 0.82 0.79 65 weighted avg 0.84 0.82 0.82 65
Давайте сравним точность каждой модели.
Лучшая модель
models = pd.DataFrame({ 'Model': ['Support Vector Machines', 'KNN', 'Decision Tree','Random Forest', 'Gaussian Naive Bayes'], 'Score': [svc_accuracy, knn_accuracy, decision_tree_accuracy, random_forest_accuracy, gaussian_accuracy]}) models.sort_values(by='Score', ascending=False)
KNN - лучший алгоритм с точностью 87,69%.
Заключительные слова
Надеюсь, эта статья была для вас полезной. Я попытался ответить на несколько вопросов, используя науку о данных. Есть еще много вопросов. Теперь я перейду к другому набору данных завтра. Все коды анализа данных и визуальные эффекты можно найти в этом репозитории GitHub или ядре Kaggle.
Спасибо за чтение.
Я благодарен за любые отзывы.
100 дней прогресса в области науки о данных
Анализ и визуализация кассовых сборов
День 4 и 5 из 100 дней науки о данных в сторонуdatascience.com
Если вам нравится моя работа и вы хотите поддержать меня, я буду очень признателен, если вы подпишетесь на меня в моих каналах в социальных сетях:
- Лучший способ поддержать меня - это подписаться на меня на Medium.
- Подпишитесь на мой новый канал YouTube.
- Зарегистрируйтесь в моем списке рассылки.