Как быстро стать аналитиком данных?

Python анализ данных pandas IPython
Как быстро стать аналитиком данных?

Эта статья была впервые опубликована вколонна Джижи

Эта статья длинная и полна галантереи, рекомендуется собрать ее как долгосрочное учебное пособие.


Некоторое время назад мы поделились тем, как шаг за шагом стать экспертом по анализу данных с помощью Python:кликните сюда

Тем не менее, это руководство только направляет вас с точки зрения макроэкономики на этапах обучения и на каких ресурсах учиться.Сегодня мы подробно обсудим, как полагаться на Python, чтобы стать аналитиком данных с нуля.В течение этого периода мы возьмем набор данных по кредитам в качестве примера для обмена Базовые знания и инструменты, необходимые для анализа данных с помощью Python, помогут вам быстро стать аналитиком данных с помощью Python.

Каталог содержимого

1. Базовые знания Python для анализа данных

  • Зачем изучать Python для анализа данных?
  • Как установить Питон?
  • Сделайте несколько простых проектов с Python

2. Библиотеки Python и структуры данных

  • Структуры данных Python
  • Итерация Python и условные конструкции
  • Библиотека Python для анализа данных

3. Исследовательский анализ данных с помощью Python и Pandas

  • Введение в начало работы с сериями и фреймами данных в Pandas
  • Завершите проект анализа данных на примере кредитного набора данных.

4. Повторная обработка данных с помощью Python Pandas

  • Как вменить пропущенные значения
  • Как бороться с экстремальными значениями

5. Используйте Python для создания модели прогнозирования и прогнозирования на основе данных.

  • модель логистической регрессии
  • модель дерева решений
  • Модель случайного леса

Примечание Джижи: первоначальным автором этой статьи является Кунал Джейн, специалист по данным, окончивший Индийский технологический институт, ведущую ИТ-школу Индии, и работающий в области науки о данных более 10 лет. старший аналитик данных во многих крупных многонациональных компаниях, таких как Великобритания и Индия.

Несколько лет назад, проработав в SAS 5 лет, я (автор Кунал Джейн) решил выйти из своей зоны комфорта и вдохновиться стать специалистом по данным. После долгих поисков инструментов обучения, которые помогли бы мне стать специалистом по данным, я наконец остановился на Python.

Мне всегда нравилось программировать, это моя внутренняя страсть.

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

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

1. Базовые знания Python для анализа данных

Зачем изучать Python для анализа данных?

В последние годы многие люди выбрали Python для анализа данных, я сравнил его с языками SAS и R. Я думаю, что изучение Python для анализа данных дает следующие преимущества:

  • Открытый исходный код - бесплатная установка и использование
  • Очень сильная поддержка онлайн-сообщества
  • Очень прост в освоении (вы можете быстро начать работу без какой-либо основы программирования)
  • Может стать языком общения для науки о данных и развертывания продуктов аналитики на основе данных.

Конечно, есть и некоторые недостатки:

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

Как установить Питон?

Есть 2 способа установить Python:

1. Вы можете загрузить непосредственно с веб-сайта проекта Python (https://www.python.org/download/releases/2.7/) и установить различные необходимые вам компоненты и библиотеки.

2. Вы также можете скачать и установить пакеты со встроенными в них предустановленными библиотеками. Я рекомендую скачать Анаконду. Другой вариант — Enthought Canopy Express. Второй метод обеспечивает беспроблемную установку, поэтому я рекомендую этот метод для начинающих. Недостатком этого подхода является то, что вам придется ждать обновления всего пакета, даже если вас интересует только последняя версия библиотеки.

Выбрать среду разработки

После установки Python также доступны различные варианты выбора среды разработки. Вот 3 самых распространенных варианта:

  • Терминал и Shell на основе
  • IDLE (среда по умолчанию)
  • Блокнот iPython — эквивалент Markdown на языке R

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

В этой статье мы будем использовать среду iPython.

Разминка: запуск вашего первого проекта Python

Вы можете начать с написания простого калькулятора на Python:

Некоторые вещи, которые следует отметить:

  • В зависимости от вашей операционной системы вы можете запустить блокнот ipython, написав «блокнот ipython» в своем терминале / cmd.
  • Вы можете назвать блокнот iPython, просто щелкнув имя — например, UntitledO на снимке экрана выше.

  • Если вы хотите вставить дополнительную строку после, вы можете выполнить код, нажав «shift+Enter» или «ALT+Enter».

Прежде чем мы углубимся в проблему, давайте сделаем шаг назад и разберемся с основами Python. Мы знаем, что структуры данных, итерации и условные структуры являются ключами к любому языку программирования. В Python эта информация включает в себя списки, строки, кортежи, словари, циклы for, циклы while, if-else и многое другое. Давайте посмотрим на некоторые из них.

2. Библиотеки Python и структуры данных

Структуры данных Python

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

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

Вот пример определения списка в Python и получения списка:

Строки. Используйте одинарные ('), двойные (") или тройные кавычки ("') кавычки для определения строк. Строки, заканчивающиеся тройными кавычками, могут охватывать несколько строк кода и очень часто используются в строках документации (способ аннотирования функций в Python). \ используется как escape-символ. Обратите внимание, что строки Python неизменяемы, поэтому вы не можете изменить содержимое строки.

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

Словарь. Словарь представляет собой изменяемую модель контейнера и может хранить объекты любого типа. Каждая пара ключ-значение => значение словаря отделяется двоеточием :, каждая пара ключ-значение отделяется запятой, а весь словарь заключен в фигурные скобки {}. Пара фигурных скобок создает пустой словарь: {}.

Итерация Python и условные структуры

Как и в большинстве языков, в Python есть циклы for — один из наиболее широко используемых методов итерации в Python. Его синтаксис относительно прост:

for i in [Python Iterable]:
  expression(i)

«Итерабельность Python» здесь может быть списком, кортежем или другой высокоуровневой структурой данных, которую мы рассмотрим в следующем разделе. Начнем с простого примера определения факториала числа.

fact=1
for i in range(1,N+1):
  fact *= i

Что касается условных операторов, они используются для выполнения фрагментов кода на основе определенных условий. Наиболее часто используется конструкция if-else со следующим синтаксисом:

if [condition]:
  __execution if true__
else:
  __execution if false__

Например, если мы хотим напечатать, является ли число N четным или нечетным, код можно написать так:

if N%2 == 0:
  print 'Even'
else:
  print 'Odd'

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

  • умножить 2 матрицы
  • Решить корни квадратного уравнения с одной переменной
  • Стройте гистограммы и гистограммы
  • Создание статистических моделей
  • получить веб-страницу

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

math.factorial(N)

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

Библиотека Python

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

import math as m
from math import *

В первом подходе мы определили псевдоним m для библиотеки math, и теперь мы можем использовать внутри нее различные функции (например, factorial), ссылаясь на математическую библиотеку с псевдонимом m.factorial().

Во втором методе мы импортируем все пространство имен в math, что означает, что мы можем использовать factorial() напрямую, не ссылаясь на math.

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

Вот список библиотек, которые вы будете использовать для любой работы по анализу данных, которую вы выполняете, поэтому убедитесь, что вы умеете:

  • Numpy: библиотека расширений для языка Python. Поддерживает расширенные и крупномасштабные операции с массивами и матрицами, а также предоставляет большое количество библиотек математических функций для операций с массивами.
  • SciPy: построенный на NumPy, он предоставляет набор инструментов для научных вычислений на Python, таких как алгоритмы численных вычислений и некоторые функциональные функции, которые могут легко обрабатывать данные.
  • Matplotlib: библиотека 2D-графики для Python, которая создает графику публикационного качества в различных форматах печатных копий и кросс-платформенной интерактивной среде. С помощью Matplotlib разработчики могут создавать графики, гистограммы, спектры мощности, гистограммы, графики ошибок, диаграммы рассеивания и многое другое с помощью всего нескольких строк кода.
  • Pandas: Инструмент на основе NumPy, созданный для решения задач анализа данных. Pandas включает в себя большое количество библиотек и некоторые стандартные модели данных, предоставляя инструменты, необходимые для эффективной работы с большими наборами данных. pandas предоставляет большое количество функций и методов, которые позволяют нам быстро и легко обрабатывать данные.
  • Scikit Learn: библиотека машинного обучения, разработанная на Python, которая содержит большое количество алгоритмов машинного обучения и наборов данных и является удобным инструментом для интеллектуального анализа данных.
  • Statsmodels: модуль Python, содержащий статистические модели, статистические тесты и сбор статистических данных. Для каждой модели генерируется соответствующий статистический результат. Статистические результаты сравниваются с существующими статистическими пакетами, чтобы убедиться в их правильности.
  • Seaborn: инструмент визуализации Python для визуализации статистических данных. С его помощью вы сможете рисовать на Python очень красивую, интуитивно понятную и привлекательную графику. Это мощный инструмент для анализа и добычи данных.
  • Bokeh: интерактивный пакет Python для визуализации, способный создавать интерактивные графики, панели данных и приложения данных в браузере.
  • Blaze: возможность расширения возможностей Numpy и Pandas для обработки распределенных и потоковых наборов данных. Может использоваться для извлечения данных из многомерных источников данных, включая Bcolz, MongoDB, SQLAIchemy, Apache Spark PyTables и т. д. При использовании с боке Blaze можно использовать в качестве очень мощных данных, помогающих нам рисовать большие визуализации данных.
  • Scrapy: быстрый, высокоуровневый фреймворк для очистки экрана и веб-страниц для разработки на Python для очистки веб-сайтов и извлечения структурированных данных со страниц. Scrapy универсален и может использоваться для интеллектуального анализа данных, мониторинга и автоматизированного тестирования.
  • SymPy: библиотека Python для символьных вычислений, включая интегрирование, дифференциальные уравнения и другие математические операции, обеспечивающая мощную поддержку математических операций для Python.
  • Запросы: это библиотека HTTP, написанная на Python, основанная на urllib и использующая протокол с открытым исходным кодом под лицензией Apache2. Это удобнее, чем urllib, может сэкономить нам много работы и полностью соответствует требованиям HTTP-тестирования.

Есть и другие библиотеки, которые можно использовать:

  • os для операционной системы и файловых операций
  • Networkx и igraph для графиков, основанных на манипулировании данными
  • Регулярные выражения используются для обнаружения закономерностей в текстовых данных.
  • BeautifulSoup используется для сканирования веб-данных.

Все вышеперечисленные библиотеки не нужно осваивать на начальном этапе обучения.Вы можете изучать их в соответствии с вашими потребностями.Однако инструменты интеллектуального анализа и анализа данных, такие как Numpy и Pandas, должны быть знакомы с использованием.

Теперь, когда мы изучили основы Python и некоторых библиотек, давайте более подробно рассмотрим, как решать проблемы с помощью Python. Правильно, создавайте прогностические модели в Python! Попутно мы будем использовать несколько мощных библиотек, а также коснемся высокоуровневых структур данных Python. В основном выделяют 3 стадии:

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

3. Исследовательский анализ данных с использованием Python и Pandas

Чтобы углубиться в наши данные, мы собираемся использовать Pandas.

Pandas — одна из самых практичных библиотек для анализа данных в Python. Ниже мы будем использовать Pandas для чтения набора данных из данных конкурса Analytic Vidhya, выполнения исследовательского анализа полученных данных и создания простого алгоритма классификации для решения этой проблемы.

Прежде чем мы загрузим данные, давайте разберемся с двумя ключевыми структурами данных в Pandas — сериями и фреймами данных.

Введение в серии и кадры данных

Серию можно понимать как одномерный массив меток или индексов, получить их можно по меткам отдельных элементов в серии.

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

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

Если вы не очень хорошо знакомы с Pandas, вы можете ознакомиться с этим 10-минутным вводным руководством по Pandas: https://jizhi.im/blog/post/10min2pandas01

Набор данных для упражнений — задача прогнозирования ссуды

мы начинаем сздесьЗагрузите данные, ниже приведено описание переменной:

Приступим к изучению данных.

Сначала запустите интерфейс iPython в режиме Pylab, введя в терминал или командную строку Windows следующее:

ipython notebook --pylab=inline

Это откроет блокнот ipython в среде Pylab со встроенными полезными библиотеками. Кроме того, вы можете отображать данные в режиме реального времени, что делает его идеальным для интерактивного анализа данных. Вы можете ввести следующий код, чтобы проверить правильность загрузки среды:

plot(arange(5))

В настоящее время я работаю над Linux и сохранил данные в следующих местах: /home/kunal/Загрузки/Loan_Prediction/train.csv

Импорт библиотек и наборов данных:

Для этого урока мы будем использовать следующие библиотеки:

  • Numpy
  • Matplotlib
  • Pandas

Обратите внимание, что вам не нужно импортировать matplotlib и Numpy из-за среды Pylab. Я сохранил их в коде на случай, если вы будете использовать этот код в других средах.

После импорта библиотеки мы используем функцию read_csv() для чтения набора данных. Пока код на этом этапе выглядит так:

import pandas as pd
import numpy as np
import matplotlib as plt

df = pd.read_csv("/home/kunal/Downloads/Loan_Prediction/train.csv") #Reading the dataset in a dataframe using Pandas

Быстрое исследование данных

После прочтения набора данных мы можем использовать функцию head() для просмотра нескольких верхних строк.

df.head(10)

должен напечатать 10 строк. Вы также можете увидеть больше строк, распечатав набор данных. Затем вы просматриваете сводку числовых полей с помощью функции описать().

df.describe()

Функция description() может отображать на выходе подсчеты, среднее значение, стандартное отклонение, минимум, максимум и т. д.

Глядя на вывод функции description(), мы можем найти следующую информацию:

LoanAmount имеет 22 пропущенных значения

Loan_Amount_Term содержит 14 пропущенных значений.

Credit_History имеет 50 пропущенных значений

Мы также видим, что 84% клиентов имеют кредитную историю.

как оно сюда попало?

Среднее значение поля Credit_History равно 0,84. Распределение доходов заявителей выглядит ожидаемым, как и доходы созаявителей.

Обратите внимание, что мы также можем увидеть возможное смещение данных, сравнив среднее значение с медианой.

Для нечисловых значений (таких как Property_Area, Credit_History и т. д.) мы можем посмотреть на частотное распределение, чтобы понять, разумны ли они. Таблицу частот можно распечатать с помощью следующей команды:

df['Property_Area'].value_counts()

Точно так же мы также можем просмотреть специальное значение Credit_History.

Обратите внимание, что dfname['column_name'] — это базовый прием индексации для получения определенного столбца фрейма данных. Это также может быть список столбцов.

Анализ распределения:

Теперь, когда мы понимаем основные характеристики данных, давайте изучим распределение различных переменных. Давайте начнем с числовых переменных, ApplicantIncome и LoanAmount.

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

df['ApplicantIncome'].hist(bins=50)

Здесь мы наблюдаем несколько экстремальных значений, поэтому нам нужно 50 бинов, чтобы четко описать распределение.

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

df.boxplot(column='ApplicantIncome')

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

df.boxplot(column='ApplicantIncome', by = 'Education')

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

Теперь давайте просмотрим гистограмму и диаграмму LoanAmount с помощью следующей команды:

df['LoanAmount'].hist(bins=50)

df.boxplot(column='LoanAmount')

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

Категориальный анализ переменных

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

Примечание. Здесь мы записываем статус кредита как 1 для «да» и 0 для «нет». Таким образом, среднее представляет собой вероятность получения кредита.

temp1 = df['Credit_History'].value_counts(ascending=True)
temp2 = df.pivot_table(values='Loan_Status',index=['Credit_History'],aggfunc=lambda x: x.map({'Y':1,'N':0}).mean())
print 'Frequency Table for Credit History:' 
print temp1

print '\nProbility of getting loan for each Credit History class:' 
print temp2

Теперь, когда мы рассмотрим шаги, необходимые для получения того же представления в Python, мы можем наблюдать полученную сводную_таблицу в виде таблицы Excel. Мы можем использовать библиотеку matplotlib для рисования гистограммы со следующим кодом:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,4))
ax1 = fig.add_subplot(121)
ax1.set_xlabel('Credit_History')
ax1.set_ylabel('Count of Applicants')
ax1.set_title("Applicants by Credit_History")
temp1.plot(kind='bar')

ax2 = fig.add_subplot(122)
temp2.plot(kind = 'bar')
ax2.set_xlabel('Credit_History')
ax2.set_ylabel('Probability of getting loan')
ax2.set_title("Probability of getting loan by credit history")

На диаграмме видно, что заявители с действующей кредитной историей имеют в 8 раз больше шансов получить кредит. Мы также можем нарисовать аналогичные диаграммы по Married (замужем), Self-Employed (наняты другими), Property_Area (статус собственности) и т. д. В качестве альтернативы мы можем наложить эти два графика вместе:

temp3 = pd.crosstab(df['Credit_History'], df['Loan_Status'])
temp3.plot(kind='bar', stacked=True, color=['red','blue'], grid=False)

Также можно добавить пол:

Если вы не видите это очень ясно, мы на самом деле создаем здесь два основных алгоритма классификации. Один основан на кредитной истории, а другой основан на двух категориальных переменных (включая пол).

Мы только что показали, как проводить исследовательский анализ данных с помощью Python и Pandas. Затем мы дополнительно изучаем переменные Applicantlncome и LoanStatus, выполняем повторную обработку данных и создаем набор данных для применения различных методов моделирования. Настоятельно рекомендуется применить другой набор данных и аналогичные задачи, чтобы попрактиковаться в нашем предыдущем руководстве.

4. Повторная обработка данных с использованием Pandas и Python

На этом этапе вы должны усердно учиться и быть готовым к практике.

Повторная обработка данных — «Восстановление требования»

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

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

Глядя на распределение данных, мы видим, что ApplicantIncome и LoanAmount содержат экстремальные значения с обеих сторон. Хотя эти крайние случаи имеют смысл, мы должны соответствующим образом обращаться с этими аномальными данными.

В дополнение к этим проблемам с числовыми полями, мы также должны обратить внимание на нечисловые поля, а именно Пол, Район собственности, Женат, Образование и Иждивенцы и т. д., чтобы увидеть, содержат ли они полезную информацию. Если вы не очень хорошо знакомы с Pandas, вы можете прочитать эту статью, чтобы узнать о некоторых методах в Pandas:кликните сюда

Проверить наличие пропущенных значений в наборе данных

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

 df.apply(lambda x: sum(x.isnull()),axis=0) 

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

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

Примечание. Помните, что пропущенные значения не всегда являются нулевыми. Например, если Loan_Amount_Term равен 0, имеет ли это для вас смысл? Или вы относитесь к этому как к отсутствующему значению? Если предположить, что это то, что вы думаете, и ответ правильный, тогда мы должны проверить нереалистичные значения.

Как заполнить недостающие значения для LoanAmount?

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

 df['LoanAmount'].fillna(df['LoanAmount'].mean(), inplace=True)

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

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

Во-первых, мы смотрим на блочную диаграмму, чтобы увидеть, есть ли определенная тенденция:

Мы видим некоторые различия в медианной сумме кредита для каждой группы заявителей, которые можно использовать для вменения пропущенных значений. Но сначала мы должны убедиться, что в функциях Self_Employed и Education нет пропущенных значений.

Ранее мы говорили, что в Self_Employed отсутствуют некоторые значения, давайте посмотрим на таблицу частот:

Поскольку ~86% значений «нет», более надежно сделать вывод, что пропущенные значения также «нет», что можно сделать с помощью следующего кода:

 df['Self_Employed'].fillna('No',inplace=True)

Теперь мы создадим сводную таблицу, чтобы получить медиану всех уникальных значений функций Self_Employed и Education. Далее мы определяем функцию, которая возвращает значения этих ячеек, а затем используем функцию для заполнения недостающих значений LoanAmount:

table = df.pivot_table(values='LoanAmount', index='Self_Employed' ,columns='Education', aggfunc=np.median)
# 定义函数以返回 pivot_table的值
def fage(x):
 return table.loc[x['Self_Employed'],x['Education']]
# 替换缺失值
df['LoanAmount'].fillna(df[df['LoanAmount'].isnull()].apply(fage, axis=1), inplace=True)

Вот так мы вменяем недостающие значения в LoanAmount.

Как быть с экстремальными значениями в распределении данных LoanAmount и Applicantlncome?

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

 df['LoanAmount_log'] = np.log(df['LoanAmount'])
df['LoanAmount_log'].hist(bins=20)

Посмотрим еще раз на гистограмму:

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

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

df['TotalIncome'] = df['ApplicantIncome'] + df['CoapplicantIncome']
df['TotalIncome_log'] = np.log(df['TotalIncome'])
df['LoanAmount_log'].hist(bins=20) 

Теперь мы видим, что распределение данных намного лучше, чем раньше. Вы можете попробовать самостоятельно вменить недостающие значения для признаков «Пол», «Женаты», «Иждивенцы», «Сумма_кредита_Срок» и «Кредитная_история». Кроме того, я также рекомендую вам рассмотреть некоторую другую информацию, которую можно извлечь из данных. Например, можно создать столбец для Сумма кредита/Общий доход, потому что из него мы можем узнать, сколько заявитель погасит кредит.

Ниже мы рассмотрим, как создать прогнозную модель.

5. Создайте прогностическую модель в Python

После некоторых усилий по предварительной обработке данных мы теперь используем Python для создания прогностической модели из нашего набора данных. В Python Skicit-learn — наиболее часто используемая библиотека для создания прогностических моделей. Если вы не очень хорошо знакомы со Sklearn, Jizhi рекомендует ознакомиться с этим вводным руководством:

Руководство по началу работы

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

 from sklearn.preprocessing import LabelEncoder
var_mod = ['Gender','Married','Dependents','Education','Self_Employed','Property_Area','Loan_Status']
le = LabelEncoder()
for i in var_mod:
    df[i] = le.fit_transform(df[i])
df.dtypes 

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

#Import models from scikit learn module:
from sklearn.linear_model import LogisticRegression
from sklearn.cross_validation import KFold   #For K-fold cross validation
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn import metrics

#创建分类模型和获取重要性的通用函数:
def classification_model(model, data, predictors, outcome):
  # 拟合模型:
  model.fit(data[predictors],data[outcome])
  
  # 用数据集做出预测:
  predictions = model.predict(data[predictors])
  
  # 打印准确度
  accuracy = metrics.accuracy_score(predictions,data[outcome])
  print "Accuracy : %s" % "{0:.3%}".format(accuracy)

  # 以5折执行K折交叉验证
  kf = KFold(data.shape[0], n_folds=5)
  error = []
  for train, test in kf:
    # 过滤训练数据
    train_predictors = (data[predictors].iloc[train,:])
    
    # 我们用于训练算法的目标值
    train_target = data[outcome].iloc[train]
    
    # 用目标值和预测因子训练算法
    model.fit(train_predictors, train_target)
    
    #记录每次运行交叉验证的误差值
    error.append(model.score(data[predictors].iloc[test,:], data[outcome].iloc[test]))
 
  print "Cross-Validation Score : %s" % "{0:.3%}".format(np.mean(error))

  # 再次拟合模型,以便被外部函数引用
  model.fit(data[predictors],data[outcome]) 

логистическая регрессия

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

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

  • У соискателя есть кредитная история (эту ситуацию мы объясняли ранее)
  • Заявитель имеет высокий доход, либо в качестве созаявителя
  • Заявитель имеет высшее образование
  • В городской черте есть основные фонды и есть перспектива высокой оценки

Мы создаем нашу первую прогностическую модель на основе «Credit_History».

outcome_var = 'Loan_Status'
model = LogisticRegression()
predictor_var = ['Credit_History']
classification_model(model, df,predictor_var,outcome_var)

Точность: 80,945 % Показатель перекрестной проверки: 80,946 %

#We can try different combination of variables:
predictor_var = ['Credit_History','Education','Married','Self_Employed','Property_Area']
classification_model(model, df,predictor_var,outcome_var)

Точность: 80,945 % Показатель перекрестной проверки: 80,946 %

Обычно мы ожидаем повышения точности за счет добавления переменных, но это сложно. Недостаточно важные переменные мало влияют на точность и показатели перекрестной проверки. Credit_History является доминирующим. Теперь у нас есть два варианта:

  • Разработка функций: добыча новой информации, попытка прогнозирования. Этот шаг остается за вами.
  • Выберите лучший подход к моделированию.

Древо решений

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

model = DecisionTreeClassifier()
predictor_var = ['Credit_History','Gender','Married','Education']
classification_model(model, df,predictor_var,outcome_var)

Точность: 81,930 % Показатель перекрестной проверки: 76,656 %

Эта модель, основанная на категориальных переменных, не может оказать влияния, поскольку преобладает Credit_History. Давайте попробуем некоторые числовые переменные.

# 我们可以尝试不同的变量组合
predictor_var = ['Credit_History','Loan_Amount_Term','LoanAmount_log']
classification_model(model, df,predictor_var,outcome_var)

Точность: 92,345 % Показатель перекрестной проверки: 71,009 %

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

случайный лес

Random Forest — еще один алгоритм решения задач классификации. Узнайте больше о случайных лесах настатья Джижи.

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

model = RandomForestClassifier(n_estimators=100)
predictor_var = ['Gender', 'Married', 'Dependents', 'Education',
       'Self_Employed', 'Loan_Amount_Term', 'Credit_History', 'Property_Area',
        'LoanAmount_log','TotalIncome_log']
classification_model(model, df,predictor_var,outcome_var)

Точность: 100,00 % Оценка перекрестной проверки: 78,179 %

Здесь мы видим, что точность модели на обучающей выборке достигла 100%, этот крайний случай переобучения можно решить следующими двумя способами:

  • Уменьшите количество предикторов
  • Параметры модели отладки

Давайте попробуем оба способа. Сначала мы смотрим на матрицу важности функций и выбираем наиболее важные функции.

用特征重要性创建一个series:
Featimp = pd.Series(model.feature_importances_, index=predictor_var).sort_values(ascending=False)
print featimp

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

model = RandomForestClassifier(n_estimators=25, min_samples_split=25, max_depth=7, max_features=1)
predictor_var = ['TotalIncome_log','LoanAmount_log','Credit_History','Dependents','Property_Area']
classification_model(model, df,predictor_var,outcome_var)

Точность: 82,899 % Показатель перекрестной проверки: 81,461 %

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

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

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

Эпилог

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

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

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

использованная литература


0806 «Искусственный интеллект — от нуля до мастера» со скидкой, ограниченной по времени!

Нажмите здесь, чтобы узнать подробности

Болтать и смеяться Онлайн-программирование Узнать об этом?

(Первые 25 студентов также могут получить купон на 200 иен)