Наука о данных

Набор в кампус: 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 дней прогресса в области науки о данных











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