In [1]:
# Data Preprocessing

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
In [2]:
# Importing the dataset
url ='https://raw.githubusercontent.com/cagriemreakin/Machine-Learning/master/1-%20Data%20Preprocessing/dataset.csv'
dataset = pd.read_csv(url)
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 3].values
In [3]:
# Dealing with missing data
from sklearn.preprocessing import Imputer #Imputer Class' ının yüklenmesi

# Missing_values : Hangi değerler üzerinde işlem yapmak istediğimizi belirtme
# Strategy: Bu değerleri ne ile değiştirmek istediğimiz.
# axis= satır mı sütun mu
imputer = Imputer(missing_values = 'NaN', strategy = 'mean', axis = 0) 
# Veri setimizde NaN değere sahip sütunlar; Age 1. Salary ise 2. eleman olduğundan

imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])
In [4]:
X
Out[4]:
array([['France', 44.0, 72000.0],
       ['Spain', 27.0, 48000.0],
       ['Germany', 30.0, 54000.0],
       ['Spain', 38.0, 61000.0],
       ['Germany', 40.0, 63777.77777777778],
       ['France', 35.0, 58000.0],
       ['Spain', 38.77777777777778, 52000.0],
       ['France', 48.0, 79000.0],
       ['Germany', 50.0, 83000.0],
       ['France', 37.0, 67000.0]], dtype=object)

Yukarıda X[0] sütunundaki değerlerin kategorik olduğunu görüyoruz.Kategorik değerlerden kurtulmak için LabelEncoder class' ını kullanrak bu labellar için değer atamamız gerekli.

In [5]:
# Encoding categorical data
from sklearn.preprocessing import LabelEncoder
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
X
Out[5]:
array([[0, 44.0, 72000.0],
       [2, 27.0, 48000.0],
       [1, 30.0, 54000.0],
       [2, 38.0, 61000.0],
       [1, 40.0, 63777.77777777778],
       [0, 35.0, 58000.0],
       [2, 38.77777777777778, 52000.0],
       [0, 48.0, 79000.0],
       [1, 50.0, 83000.0],
       [0, 37.0, 67000.0]], dtype=object)

X[0] sütunundaki değerlerin France:0, Spain:1, Germany:2 ile değiştiğini gördük.Fakat bu da başka bir problemi meydana getirdi. Makine öğrenmesi algoritmaları matematiksel formuller ile çalıştığından hesaplamlarda bu değerleri kullanacak ve yanlış sonuçlar çıkarmamıza sebep olacaktır. Aslında yukarıdaki işlemi yaptığımızda şöyle bir varsayım yapmış olduk:

Germany > Spain > France


Bu durumun üstesinden gelmek için OneHotEncoder kullanmamız gerekiyor. Onuda kısaca çöyle açıklayalım.
One-hot Encoding: Ana fikir etiketin olduğu sütun için (X[0]) dummy features yaratmak ve binary olarak göstermek. Aşağıdaki tablodan görsel olarak daha iyi anlaşılabilir.He satırdaki label baktık ve var mı yok mu işaretledi. France 1.satırda var 1 yazdık fakat Spain ve Germany olmadığı için = yazdık.

In [6]:
df = pd.DataFrame([ [1,0,0],
                    [0,1,0],
                    [0,0,1],
                    [0,1,0],
                    [0,0,1],
                    [1,0,0],
                    [0,1,0],
                    [1,0,0],
                    [0,0,1],
                    [1,0,0]])
df.columns = ['France','Spain','Germany']
df
Out[6]:
France Spain Germany
0 1 0 0
1 0 1 0
2 0 0 1
3 0 1 0
4 0 0 1
5 1 0 0
6 0 1 0
7 1 0 0
8 0 0 1
9 1 0 0
In [7]:
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(categorical_features = [0])
X = ohe.fit_transform(X).toarray()

# Diğer kategorik değer ise, dependent variable olan Purchase sütunu 
labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)
In [8]:
X
Out[8]:
array([[  1.00000000e+00,   0.00000000e+00,   0.00000000e+00,
          4.40000000e+01,   7.20000000e+04],
       [  0.00000000e+00,   0.00000000e+00,   1.00000000e+00,
          2.70000000e+01,   4.80000000e+04],
       [  0.00000000e+00,   1.00000000e+00,   0.00000000e+00,
          3.00000000e+01,   5.40000000e+04],
       [  0.00000000e+00,   0.00000000e+00,   1.00000000e+00,
          3.80000000e+01,   6.10000000e+04],
       [  0.00000000e+00,   1.00000000e+00,   0.00000000e+00,
          4.00000000e+01,   6.37777778e+04],
       [  1.00000000e+00,   0.00000000e+00,   0.00000000e+00,
          3.50000000e+01,   5.80000000e+04],
       [  0.00000000e+00,   0.00000000e+00,   1.00000000e+00,
          3.87777778e+01,   5.20000000e+04],
       [  1.00000000e+00,   0.00000000e+00,   0.00000000e+00,
          4.80000000e+01,   7.90000000e+04],
       [  0.00000000e+00,   1.00000000e+00,   0.00000000e+00,
          5.00000000e+01,   8.30000000e+04],
       [  1.00000000e+00,   0.00000000e+00,   0.00000000e+00,
          3.70000000e+01,   6.70000000e+04]])
In [9]:
y
Out[9]:
array([0, 1, 0, 0, 1, 1, 0, 1, 0, 1], dtype=int64)