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

Данные в основном доступны в двух формах: структурированные и неструктурированные.

  1. Структурированные данные - данные, хранящиеся в Excel, CSV или в любой базе данных.
  2. Неструктурированные данные - изображения, аудио, текст и почти все неструктурированные

В этом руководстве мы увидим, как работать со структурированными данными.

В большинстве случаев мы сталкиваемся с 3 основными типами проблем, пытаясь применить алгоритм машинного обучения.

  1. у нас есть пропущенные значения в наших данных, если мы обучили наш алгоритм с этими данными, он выдаст ошибку, поскольку он не может выполнять вычисления со значениями NULL или NaN.
  2. Данные имеют такие категории, как ДА или НЕТ. Для нашего алгоритма машинного обучения данные строкового типа - это плохие новости, поскольку они снова не могут работать со строковыми значениями.
  3. Данные часто имеют несколько атрибутов или столбцы с простыми терминами, возможно, что один столбец содержит большие значения, а другой столбец состоит из очень низких значений, это приведет к тому, что алгоритмы машинного обучения будут придавать большее значение столбцу с высокими значениями, когда в в действительности оба имели одинаковое значение.

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

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

Шаг 1. Импорт панд

In [1]:

import numpy as np
import pandas as pd

Шаг 2. Импорт набора данных

Библиотека Pandas совместима с большинством форматов, в ней есть предварительно написанные функции для импорта файлов Excel, файлов CSV (значения, разделенные запятыми), SQL и многого другого.

In [2]:

data = pd.read_csv("data/data.csv")# here were are importing data.csv which is in data folder

In [3]:

data.head()

Из [3]:

Страна Возраст Заработная плата Приобретено0Дели24.072000.0No1mumbai27.048000.0Да2Нью-Йорк40.054000.0No3Madrid28.061000.0No4berlin40.0NaNДа

Шаг 3. Разделение поясняющих переменных и ответных переменных.

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

In [4]:

x=data.iloc[:,:-1].values
y=data.iloc[:,3].values

In [5]:

x

Из [5]:

array([['Delhi', 24.0, 72000.0],
       ['mubai', 27.0, 48000.0],
       ['new york', 40.0, 54000.0],
       ['Madrid', 28.0, 61000.0],
       ['berlin', 40.0, nan],
       ['hong kong', 55.0, 58000.0],
       ['delhi', nan, 52000.0],
       ['new york', 48.0, 79000.0],
       ['mubai', 50.0, 83000.0],
       ['paris', 37.0, 67000.0]], dtype=object)

In [6]:

y

Из [6]:

array(['No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes'],
      dtype=object)

Шаг 4. Обработка отсутствующих значений

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

In [7]:

from sklearn.preprocessing import Imputer #importing imputer class

In [8]:

imputer = Imputer(missing_values='NaN', strategy ='mean',axis=0) 
imputer = imputer.fit(x[:,1:3])
x[:,1:3] = imputer.transform(x[:,1:3])

In [9]:

x

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

Из [9]:

array([['Delhi', 24.0, 72000.0],
       ['mubai', 27.0, 48000.0],
       ['new york', 40.0, 54000.0],
       ['Madrid', 28.0, 61000.0],
       ['berlin', 40.0, 63777.77777777778],
       ['hong kong', 55.0, 58000.0],
       ['delhi', 38.77777777777778, 52000.0],
       ['new york', 48.0, 79000.0],
       ['mubai', 50.0, 83000.0],
       ['paris', 37.0, 67000.0]], dtype=object)

Шаг 5: Обработка категориальных данных

Ранее мы видели, как категориальные данные могут быть проблемой для алгоритмов. Здесь наши данные также имеют категориальные данные: в столбцах, помеченных как Страна и Куплено, данные представлены в категориальной форме.

Давайте посмотрим, как SKlearn поможет нам с этим справиться.

Библиотека SKlearn предоставляет нам 2 класса: LabelEncoder и OneHotEncoder.

LabelEncoder

Этот класс преобразует категориальные данные в числовые данные путем присвоения числового значения каждому уровню, например, если данные имеют три категории, такие как Дели, Мумбаи и Нью-Йорк, он присвоит 0 Дели, 1 - Мумбаи и 2 - Нью-Йорку. Это действительно помогает в преобразовании строк разных категорий в числовые значения, но создает проблему, когда ему присваиваются значения 0, 1 и 2, алгоритм ML считает, что Нью-Йорк имеет более высокое значение, чем Мумбаи и Дели, тогда как в в действительности они имеют одинаковое значение. чтобы справиться с этим, у нас есть еще один класс под названием OneHotEncoder.

OneHotEncoder

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

In [10]:

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

In [11]:

labelencoderX = LabelEncoder()
x[:,0] = labelencoderX.fit_transform(x[:,0])

In [12]:

x

Из [12]:

array([[0, 24.0, 72000.0],
       [5, 27.0, 48000.0],
       [6, 40.0, 54000.0],
       [1, 28.0, 61000.0],
       [2, 40.0, 63777.77777777778],
       [4, 55.0, 58000.0],
       [3, 38.77777777777778, 52000.0],
       [6, 48.0, 79000.0],
       [5, 50.0, 83000.0],
       [7, 37.0, 67000.0]], dtype=object)

OneHotEncoder

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

In [13]:

onehotencoder = OneHotEncoder(categorical_features=[0])
x=onehotencoder.fit_transform(x).toarray()

In [14]:

x

Из [14]:

array([[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        2.40000000e+01, 7.20000000e+04],
       [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        2.70000000e+01, 4.80000000e+04],
       [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
        4.00000000e+01, 5.40000000e+04],
       [0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        2.80000000e+01, 6.10000000e+04],
       [0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
        0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        4.00000000e+01, 6.37777778e+04],
       [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        5.50000000e+01, 5.80000000e+04],
       [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.00000000e+00,
        0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        3.87777778e+01, 5.20000000e+04],
       [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
        4.80000000e+01, 7.90000000e+04],
       [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        5.00000000e+01, 8.30000000e+04],
       [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
        0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.00000000e+00,
        3.70000000e+01, 6.70000000e+04]])

In [15]:

labelencoderY = LabelEncoder()
y = labelencoderY.fit_transform(y)

In [16]:

y

Из [16]:

array([0, 1, 0, 0, 1, 1, 0, 1, 0, 1], dtype=int64)

Шаг 6. Разделение данных на обучающий и тестовый набор

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

In [17]:

from sklearn.cross_validation import train_test_split
D:\anaconda\lib\site-packages\sklearn\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)

In [18]:

X_train,x_test , Y_train, y_test = train_test_split(x,y, test_size=0.2, random_state=0)

Шаг 7. Масштабирование данных

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

In [19]:

from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
x_test = sc_X.transform(x_test)

In [21]:

X_train

Из [21]:

array([[-0.37796447, -0.37796447,  2.64575131, -0.37796447, -0.37796447,
        -0.37796447, -0.37796447, -0.37796447,  0.27661062,  0.12381479],
       [-0.37796447, -0.37796447, -0.37796447, -0.37796447, -0.37796447,
        -0.37796447, -0.37796447,  2.64575131, -0.02212885,  0.46175632],
       [-0.37796447, -0.37796447, -0.37796447, -0.37796447, -0.37796447,
         2.64575131, -0.37796447, -0.37796447, -1.01792709, -1.53093341],
       [-0.37796447, -0.37796447, -0.37796447,  2.64575131, -0.37796447,
        -0.37796447, -0.37796447, -0.37796447,  0.15490195, -1.11141978],
       [-0.37796447, -0.37796447, -0.37796447, -0.37796447, -0.37796447,
        -0.37796447,  2.64575131, -0.37796447,  1.07324921,  1.7202972 ],
       [-0.37796447,  2.64575131, -0.37796447, -0.37796447, -0.37796447,
        -0.37796447, -0.37796447, -0.37796447, -0.91834726, -0.16751412],
       [ 2.64575131, -0.37796447, -0.37796447, -0.37796447, -0.37796447,
        -0.37796447, -0.37796447, -0.37796447, -1.31666656,  0.98614835],
       [-0.37796447, -0.37796447, -0.37796447, -0.37796447,  2.64575131,
        -0.37796447, -0.37796447, -0.37796447,  1.77030798, -0.48214934]])

In [22]:

x_test

Из [22]:

array([[-0.37796447, -0.37796447, -0.37796447, -0.37796447, -0.37796447,
        -0.37796447,  2.64575131, -0.37796447,  0.27661062, -0.90166297],
       [-0.37796447, -0.37796447, -0.37796447, -0.37796447, -0.37796447,
         2.64575131, -0.37796447, -0.37796447,  1.27240886,  2.13981082]])

Теперь ваши данные готовы к обучению любого алгоритма.