Добро пожаловать в третье руководство по науке о данных в нашей серии. В этом проекте мы будем работать с данными переписи населения.

Введение

Данные экономической переписи чрезвычайно важны, поскольку торговые ассоциации, торговые палаты и предприятия полагаются на эту информацию для экономического развития, принятия деловых решений и стратегического планирования. Источник: https://www.census.gov/programs-surveys/economic-census/guidance/data-uses.html

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

О данных

Этот набор данных взят из депозитария машинного обучения UCI. Источник: https://archive.ics.uci.edu/ml/datasets/Census+Income. Он также доступен на GitHub. Есть 14 столбцов и 48842 экземпляра с различными факторами, влияющими на столбец income . Из 14 независимых переменных 8 являются категориальными/порядковыми.

Исследовательский анализ данных (EDA)

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

  1. Очистка данных:

Первым шагом любого проекта по науке о данных является проверка и очистка данных, чтобы их можно было передать в модели машинного обучения (ML). Было замечено, что в кадре данных есть несколько записей ?. Чтобы идентифицировать или обработать их, мы можем заменить все записи ? на numpy nan, как показано ниже:

income_data=income_data.replace(to_replace="?",value=np.nan)

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

income_data.info()

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

Распределение частоты столбца workclass дает вам режим столбца с самой высокой частотой, которая в данном случае равна Private. Вы можете получить количество пропущенных значений в любом столбце, используя метод isna().sum() в pandas:

В столбце workclass есть 2799 пропущенных значений, которые можно вычислить с помощью метода fillna в pandas, как показано ниже:

income_data['workclass'].fillna('Private', inplace = True)

Шаги по очистке других столбцов здесь не показаны, но доступны на GitHub.

2. Визуализация данных:

Визуализация данных дает нам представление о данных, которые можно использовать для создания выводов, а также для построения модели. Мы напишем пользовательскую функцию, используя библиотеки matplotlib и seaborn, чтобы построить гистограмму столбцов по целевой переменной income, которая была преобразована в 0 для дохода ≤ 50 000 и 1 для дохода >50 000.

import matplotlib.pyplot as plt
import seaborn as sns
def plotting(column):
  if income_data[column].dtype != 'int64':
    f, axes = plt.subplots(1,1,figsize=(15,5))
    sns.countplot(x=column, hue='income_above_50K', data =     income_data)
    plt.xticks(rotation=90)
    plt.suptitle(column,fontsize=20)
    plt.show()
  else:
    g = sns.FacetGrid(income_data, row="income_above_50K", margin_titles=True, aspect=4, height=3)
    g.map(plt.hist,column,bins=100)
    plt.show()
    plt.show()

Пользовательскую функцию, определенную выше plotting, можно использовать с любым столбцом данных (непрерывным или категориальным) для построения гистограммы. Мы показываем пару из них здесь, а остальные можно найти на GitHub.

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

На приведенном выше графике видно, что профессия Exec-менеджер и специалист (prof-специальность) имеет более высокое соотношение людей с доходом выше 50 тыс. к людям с доходом ниже 50 тыс. Таким образом, другие роли имеют более низкую заработную плату по сравнению с этими двумя рабочими местами белых воротничков.

Разработка функций

Разработка признаков — еще один важный шаг перед переходом к этапу построения модели. Процесс преобразования необработанных столбцов в значимые функции, которые можно использовать в модели машинного обучения (ML), называется проектированием функций. Например, вы не можете напрямую заполнить категориальный столбец, поскольку ни компьютер, ни модель не предназначены для работы с символами. Машины понимают язык чисел, и все модели машинного обучения основаны на умножении и оптимизации матриц, поэтому нам нужно преобразовать категориальные столбцы в числовые признаки. Мы можем преобразовать категориальные столбцы, используя два метода, показанные ниже:

  1. Сопоставление категорийных данных:

Категориальные значения в столбцах можно легко сопоставить с помощью функции map в столбце pandas, как показано ниже:

income_data['is_female']=income_data['sex'].map({'Male':0, 'Female':1})

Категория Male столбца пола сопоставляется с 0, а категория Female сопоставляется с 1.

2. Одно горячее кодирование

Мы можем использовать одну горячую кодировку для преобразования категориальных столбцов в числовые функции, используя метод pandas get_dummies(). Если в столбце несколько категорий (например, 16 категорий в столбце education , как вы видели в разделе визуализации), лучше уменьшить количество категорий с помощью метода карты, прежде чем применять одно горячее кодирование.

income_data['education'] = income_data['education'].map(
{'Preschool':'level_1','1st-4th':'level_1','5th-6th':'level_1','7th-8th':'level_1','9th':'level_1','10th':'level_1','11th':'level_1','12th':'level_1','HS-grad':'level_1',
'Prof-school':'level_2','Assoc-acdm':'level_2','Assoc-voc':'level_2','Some-college':'level_2',
'Bachelors':'level_3','Masters':'level_3','Doctorate':'level_3'})

Мы преобразовали 16 категорий education column в 3 категории, и теперь мы применим метод get_dummies для одного горячего кодирования в этих столбцах.

cols_education = pd.get_dummies(income_data['education'], prefix= 'education')
income_data[cols_education.columns] = cols_education
income_data.drop('education', axis = 1, inplace = True)

Это создаст 3 новых столбца для 3-го уровня образования, созданного выше, а затем мы удалим исходный education column .

Преобразование остальных категориальных переменных аналогично и показано на GitHub.

3. Разделение объектов и целевая переменная

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

from sklearn.model_selection import train_test_split
X = income_data.drop('income_above_50K',axis = 1)
y = income_data['income_above_50K']
X_train_org, X_test_org, Y_train, Y_test = train_test_split(X, y, random_state = 0)

Целевая переменная income_above_50K (преобразованный столбец для income) сохраняется как y, а все остальные переменные, кроме income, сохраняются как X из кадра данных income_data. Затем набор функций X далее делится на Xtrain_orig для обучения и X_test_orig для тестирования. Точно так же y далее делится на y_train для обучения модели машинного обучения и y_test для оценки модели.

4. Масштабирование/нормализация функций

Масштабирование или нормализация используются для нормализации диапазона независимых переменных или характеристик данных. Масштабируя/нормируя независимые переменные, мы гарантируем, что каждый признак вносит приблизительно пропорциональный вклад в конечное расстояние. Среди других причин, таких как то, что он является обязательным шагом для PCA (анализ основных компонентов), он также заставляет градиентный спуск сходиться намного быстрее по сравнению с немасштабированными функциями. Мы можем использовать MinMaxScaler() из библиотеки sklearn для масштабирования функций, как показано ниже:

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train_org)
X_test = scaler.transform(X_test_org)

Построение модели

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

  1. Подгонка модели:

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

from sklearn.svm import SVC
svm_lin = SVC(kernel='linear',probability=True)
svm_lin.fit(X_train,Y_train)
Y_pred_svm_lin = svm_lin.predict(X_test)
Y_predProb_svm_lin = svm_lin.predict_proba(X_test)

Модель SVC (классификатор опорных векторов) импортируется из библиотеки sklearn.svm. Затем он помещается в обучающий набор данных с использованием метода fit(). Наконец, метод predict() используется для получения прогнозов модели, а метод predict_proba() — для получения вероятностей прогнозируемых значений.

2. Выбор функций:

Количество признаков можно уменьшить либо с помощью методов уменьшения размерности, таких как PCA, Ridge и т. д., либо путем выбора важных признаков. Мы будем использовать метод feature_importances_ классификатора, чтобы получить наиболее важные функции, как показано ниже:

importances = ada_rf.feature_importances_
std = np.std([tree.feature_importances_ for tree in ada_rf.estimators_], axis=0)
feature_names = [f"feature {i}" for i in X.columns]
ada_rf_importances = pd.Series(importances, index=feature_names)

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

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

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

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

from sklearn.metrics import confusion_matrix,accuracy_score,precision_score,recall_score,f1_score,roc_curve,precision_recall_curve
def plot_ConfusionMatrix(Y_true,Y_pred):
  plt.title('Confusion Matirx')
  conf_matrix = confusion_matrix(Y_true,Y_pred)
  sns.heatmap(conf_matrix,annot=True,xticklabels=    ['N','Y'],yticklabels=['N', 'Y'],fmt='.5g')
def scores(Y_true,Y_pred):
  accuracy = accuracy_score(Y_true,Y_pred)
  print("Accuracy  :: {}".format("%.2f" %accuracy))
  precision = precision_score(Y_true,Y_pred)
  print("Precision :: {}".format("%.2f" %precision))
  recall = recall_score(Y_true,Y_pred)
  print("Recall    :: {}".format("%.2f" %recall))
  tn, fp, fn, tp = confusion_matrix(Y_true, Y_pred).ravel()
  specificity = tn / (tn+fp)
  print("Specificity :: {}".format("%.2f" %specificity))
  fscore = f1_score(Y_true,Y_pred)
  print("F1score   :: {}".format("%.2f" %fscore))

В приведенном выше блоке кода первая функция plot_ConfusionMatrix использует функцию confusion_matrix из библиотеки sklearn.metrics вместе с matplotlib и seaborn для построения матрицы путаницы, дающей истинные и прогнозируемые значения. Вторая функция scores принимает истинные и предсказанные значения в качестве входных данных и возвращает точность, прецизионность, полноту, специфичность и показатель f1, используя эти функции из библиотеки sklearn.metrics.

Мы также можем определить вспомогательную функцию для построения кривых, как показано ниже:

def curves(Y_true,Y_pred):
  plt.figure(figsize=(11,5))
  plt.subplot(121)
  #ROC CURVE
  false_pr,true_pr,_ = roc_curve(Y_true,Y_pred[:,1])
  plt.title('ROC (Receiver Operating Characteristics) curve')
  plt.plot([0,1],[0,1],'--')
  plt.plot(false_pr,true_pr,'.-',label='Roc_curve')
  plt.xlabel('False Positive Rate')
  plt.ylabel('True Positive Rate')
  plt.legend()
  plt.subplot(122)
  # PR CURVE
  plt.title('Precision-Recall Curve')
  precision, recall, _ = precision_recall_curve(Y_true,Y_pred[:,1])
  plt.plot(recall,precision,'.-',label='PR CURVE')
  plt.xlabel('Recall')
  plt.ylabel('Precision')
  plt.legend()
  plt.tight_layout()
  plt.show()
  #PR v/s ROC CURVE
  plt.title('PR v/s ROC CURVE ')
  plt.plot(false_pr,true_pr,'.-',label='Roc_curve')
  plt.plot(recall,precision,'.-',label='PR CURVE')
  plt.legend()
  plt.show()

Функция curves, определенная выше, принимает фактические метки как Y_true и вероятность классов как Y_pred. Он отображает кривые ROC, PR и PR по отношению к ROC, которые изображают положительный класс.

Пример вывода для классификатора случайного леса показан ниже. Вы можете найти полный код и вывод для всех моделей на GitHub.

В приведенном выше выводе мы можем наблюдать значения метрик, а также график для матрицы путаницы. Вы можете выбрать «Отзыв» или «Точность» в качестве ключевой метрики для оценки модели в случае несбалансированного набора данных, но это зависит от функции стоимости (ложноотрицательный или ложноположительный результат дороже). В тех случаях, когда функция стоимости неизвестна, безопасно использовать показатель F-1 в качестве ключевого показателя для оценки. Оценка F-1 для случайного леса составляет 0,66, что является одной из хороших моделей, которые мы построили на этом наборе данных. Точно так же выходные данные для функции curves для классификатора случайного леса показаны ниже:

3. Методы ансамбля:

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

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

В приведенном выше блоке кода мы используем svm_rbf (радиальная базисная функция (RBF) ядра SVM), svm_lin (линейный SVM) и KNN_model (K ближайших соседей) в качестве наших базовых оценок. Затем, используя функцию VotingClassifier библиотеки sklearn.ensemble, мы определяем классификатор голосования с голосованием soft, который предсказывает метку класса на основе argmax сумм предсказанных вероятностей. Можно заметить, что оценка F1 для модели составляет 0,65, что немного лучше, чем у всех отдельных моделей — svm_rbf (0,60), smv_lin (0,64) и knn_model (0,60).

Мы уже рассмотрели упаковку и вставку в Руководстве по первому проекту по науке о данных, поэтому здесь мы собираемся изучить Adaboosting. Классификатор AdaBoost — это метаоценщик, который начинает с подгонки классификатора к исходному набору данных, а затем подбирает дополнительные копии классификатора к тому же набору данных, но где веса неправильно классифицированных экземпляров корректируются таким образом, чтобы последующие классификаторы больше фокусировались на сложных случаи. Ниже показано приложение AdaboostClassifier поверх DecisionTreeClassifier:

from sklearn.ensemble import AdaBoostClassifier
ada_clf_Dec = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200, algorithm="SAMME.R", learning_rate=0.5, random_state=0)
ada_clf_Dec.fit(X_train, Y_train)
y_pred_Dec = ada_clf_Dec.predict(X_test)

Вывод этого классификатора Adaboost показан ниже:

Оценка F1 Adaboosting на дереве решений составляет 0,68, что является улучшением по сравнению с другими отдельными классификаторами, которые мы видели до сих пор. Вы можете попробовать Adaboosting, мешки, вставку и повышение градиента на этом и остальных классификаторах. Полный код и приложение доступны на GitHub.

Заключение

Мы рассмотрели все шаги, необходимые для запуска проекта по науке о данных. Мы начали со сбора данных переписи доходов, EDA, разработки признаков, построения модели и, наконец, оценили модель на тестовых данных. Модель имеет высокую точность 86% и F1-оценку 0,68. Мы обнаружили, что количество лет обучения, прирост капитала, возраст и количество часов в неделю являются одними из важных факторов при прогнозировании дохода. Таким образом, лица, определяющие политику, могут использовать эту информацию для выделения дополнительных бюджетных средств на образование для повышения дохода на душу населения. Любой бизнес может использовать эту модель для точного прогнозирования доходов и принятия обоснованных решений на основе доходов.

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

Ссылка на Github: https://github.com/Laxmisankritya/House-price-prediction

Благодарим Шивама Соланки за соавторство в этой серии блогов.

Пожалуйста, не стесняйтесь оставлять свои комментарии и предложения ниже и связаться с нами на LinkedIn.

https://www.linkedin.com/in/shivam-solanki-2b288319/