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

Выборка данных


Выборка данных содержит порядка 10000 строк и 15 столбцов.Вот некоторые из параметров:

  • Возраст
  • Пол
  • Количество денежных средств на счету

Задача


  1. Найти параметры максимально влияющие на отток клиентов.
  2. Создание гипотезы, предсказывающей отток клиентов банка.

Инструментарий


  • pandas
  • sklearn
  • matplotlib
  • numpy

Импорт библиотек


import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn import svm 
import seaborn as sns 
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
import numpy as np
from sklearn.naive_bayes import GaussianNB

Загрузка и просмотр данных


dataframe = pd.read_csv("../input/Churn_Modelling.csv")
dataframe.head()



Преобразование данных


Для правильной работы классификатора необходимо преобразование категориального признака в числовой.На представленных выше данных в глаза сразу бросается два столбца: «Пол» и «Географическое положение». Проведем преобразования:

dataframe['Geography'].replace("France",1,inplace= True)
dataframe['Geography'].replace("Spain",2,inplace = True)
dataframe['Geography'].replace("Germany",3,inplace=True)
dataframe['Gender'].replace("Female",0,inplace = True)
dataframe['Gender'].replace("Male",1,inplace=True)

Создание корреляционной матрицы


correlation = dataframe.corr()
plt.figure(figsize=(15,15))
sns.heatmap(correlation, vmax=1, square=True,annot=True,cmap='cubehelix')

plt.title('Correlation between different fearures')
plt.show()



Корреляционная показывает, какие параметры будут влиять на результат. Сразу можно выделить 3 положительные корреляции: «Баланс счета», «Возраст», «Географическое положение».

Кросс валидация


Для избежания проблем с переобучением разделим наш набор данных:

X_train, X_test, y_train, y_test = train_test_split(
  X, Y, test_size=0.4, random_state=0)

Прогноз


clf = GaussianNB()
clf = clf.fit(X_train ,y_train)
clf.score(X_test, y_test)


Точность предсказания составила ~78%, что является неплохим результатом.
Поделиться с друзьями
-->

Комментарии (10)


  1. hose314
    24.05.2017 12:28
    +2

    Корреляционная показывает, какие параметры будут влиять на результат

    Не понял


    1. Kwent
      24.05.2017 14:21

      Тоже не совсем понял как интерпретировать результаты, отрицательные значения высокие по модулю тоже сильно влияют или только положительные?


      1. Vodolazskyi
        25.05.2017 22:49

        корреляционные коэффициенты близкие к 1 и -1 показывают высокую линейную зависимость, разница лишь в направленности (прямая/обратная). 0 — отсутствие зависимости.

        однако, для задачи классификации лучше использовать information value (IV) для определения предсказательной силы параметра. Поправьте, если я не прав.


  1. ElvinFox
    24.05.2017 15:59
    +1

    Как-то внезапно оборвалась статья… Ощущение что это только шапка и первый параграф


  1. fowler
    24.05.2017 16:30
    +3

    Это какой-стеб, наверное.
    Если класс клиента (уйдет, не уйдет) кодируется значениями 0 и 1, а, судя по dataframe.corr(), это так, то использование корреляционной матрицы тут вообще недопустимо: мало того что Вы притащили в анализ тестовые данные (корр. матрица по всему датафрейму) так еще и сравнили с искомым классом.

    Корреляционная матрица на ранговых данных (пол, местоположение, наличие кредитной карты) должна использовать корреляцию Кендалла, а не Пирсона по умолчанию. Мало того невозможно найти корреляцию между ранговыми и непрерывными полями данных — это сути корреляции противоречит!

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

    А в целом, статья непонятна начинающему, не имеет объяснений — Вы даже классификатор не описали!!, оперирует неверными понятиями и учит плохому. Дети, не делайте так.


    1. puff1n
      25.05.2017 00:13

      Корреляционная матрица на ранговых данных (пол, местоположение, наличие кредитной карты)...

      Какие же пол и наличие кредитной карты ранговые данные? Это номинальные показатели.


      1. fowler
        25.05.2017 09:39

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


    1. tomzarubin
      26.05.2017 12:35

      мало того что Вы притащили в анализ тестовые данные

      А что тут плохого? Вы же не модель строите, чтобы не строить корреляционную матрицу по всему датасету.


  1. lash05
    24.05.2017 19:18

    dataframe['Geography'].replace(«France»,1,inplace= True)
    dataframe['Geography'].replace(«Spain»,2,inplace = True)
    dataframe['Geography'].replace(«Germany»,3,inplace=True)
    — поменяйте Испанию с Германией и почувствуйте разницу.


  1. Andy_U
    24.05.2017 23:35

    Совершенно неправильно заменять наименование страны на его «номер». Ну, почему у Вас «Германия» оказалась больше, чем «Испания», а «Испания» больше «Франции»? А правильно из одного признака сделать столько логических признаков, сколько есть разных стран. Попробуйте, наверняка результат сразу улучшится.