Cara menggunakan SCALING. pada Python

Kadang kala, dataset yang kita miliki terdiri dari banyak data dan skala yang luas. Misalnya pada contoh dibawah ini.

Pada kolom usia, dan masa kerja memiliki range yang sama yaitu puluhan, sedangkan pada gaji memiliki range yang berbeda yaitu ratusan ribu atau jutaan. Hal ini sangat berpengaruh ketika kita ingin melakukan klasterfikasi atau klasifikasi.

Oleh sebab itu, normalisasi data ini sangat penting dilakukan untuk merubah data agar dapat dimanipulasi sistem.

Dengan demikian, sistem dapat melakukan dengan benar.

Metode Normalisasi

Banyak metode normalisasi yang dapat digunakan, mulai dari MinMax, Zscore, Decimal Scaling, Sigmoid, dan Softmax. Penggunaanya tergantung kebutuhan pengguna.

Dalam tulisan ini, kita hanya membahas salah satu metode normalisasi yaitu Metode MinMax.

Metode Normalisasi MinMax

MinMax merupakan metode normalisasi yang bersifat liner dengan data aslinya. Metode ini sangat dianjurkan pada kasus-kasus berbasis time frame analisis dan forecasting. Formula MinMax dapat dilihat di bawah ini:

Menggunakan Scikit Learn untuk Normalisasi Data

Scikit Learn merupakan salah satu library powerfull pada python yang sangat lengkap. Scikit learn menyediakan berbagai algortima yang sangat banyak mulai dari klasifikasi, regresi, klastering dan banyak lainnya. Secikit Learn merupakan open source software yang banyak digunakan untuk keperluan prediksi dan analisis data.

Selain itu, Scikit Learn sudah terintrgrasi dengan library lainnya seperti Pandas, Numpy, dan Matplotlib. Untuk informasi selengkapnya kamu bisa cek website resminya //scikit-learn.org/

Salah satu fitur dari Scikit Learn adalah Normalisasi data. Sekaranga silahkan coba sintaks di bawah ini:

Preprocessing data adalah tahap penting dalam pembelajaran mesin, karena data masukan yang baik dan tepat [harusnya] akan membuat estimator mampu menghasilkan keluaran yang baik pula.

Tulisan ini menjelaskan secara singkat beberapa langkah yang sering dijumpai dalam tahap data preprocessing:

  1. Impor dataset dari file,
  2. Menangani nilai data yang kosong/hilang menggunakan imputer,
  3. Mengkodekan data kategori menggunakan one hot encoding,
  4. Membagi dataset menjadi training set, validation set, dan test set,
  5. Feature scaling berdasarkan mean dan deviasi standar, range nilai [min-max], atau range inter kuartil.

Semua contoh di bawah menggunakan paket Anaconda 3 [2019.3], IDE Spyder 3.3.3, Python 3.7.

Impor library

Ada dua library populer yang digunakan dalam tulisan ini selain Scikit, yaitu Numpy dan Pandas.

# impor library
import numpy as np
import pandas as pd

Dataset contoh yang digunakan dapat diunduh di sini atau dihasilkan langsung dari kode di bawah. Sebaiknya, letakkan file csv di direktori yang sama dengan file python sumber.

data = {
    'Province': ['Banten', 'DKI Jakarta','Jawa Barat','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','DKI Jakarta'],
    'Age': [24,np.nan,60,34,58,np.nan,21,44,40,51,32,30,30,19,25],
    'Wage': [5000000,3400000,7350000,3500000,np.nan,8000000,5500000,10000000,9000000,10500000,np.nan,6400000,np.nan,2200000,4500000],
    'Life insured': ['Yes','No','No','No','Yes','No','No','Yes','Yes','Yes','No','No','No','Yes','Yes'],
}

dataset = pd.DataFrame[data]

Dataset dalam wujud tabel:

Terdapat 15 observasi. Anggaplah setiap observasi merupakan data seorang karyawan, yang terdiri atas provinsi asal, usia [tahun], gaji [rupiah], dan apakah mereka memiliki asuransi jiwa.

Impor dataset dari file csv

Jalankan kode di bawah hanya jika Anda memutuskan mengunduh file csv dataset.

# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]

Ada beberapa parameter metode

data = {
    'Province': ['Banten', 'DKI Jakarta','Jawa Barat','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','DKI Jakarta'],
    'Age': [24,np.nan,60,34,58,np.nan,21,44,40,51,32,30,30,19,25],
    'Wage': [5000000,3400000,7350000,3500000,np.nan,8000000,5500000,10000000,9000000,10500000,np.nan,6400000,np.nan,2200000,4500000],
    'Life insured': ['Yes','No','No','No','Yes','No','No','Yes','Yes','Yes','No','No','No','Yes','Yes'],
}

dataset = pd.DataFrame[data]
2:

  • Nama file [dalam hal ini
    data = {
        'Province': ['Banten', 'DKI Jakarta','Jawa Barat','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','DKI Jakarta'],
        'Age': [24,np.nan,60,34,58,np.nan,21,44,40,51,32,30,30,19,25],
        'Wage': [5000000,3400000,7350000,3500000,np.nan,8000000,5500000,10000000,9000000,10500000,np.nan,6400000,np.nan,2200000,4500000],
        'Life insured': ['Yes','No','No','No','Yes','No','No','Yes','Yes','Yes','No','No','No','Yes','Yes'],
    }
    
    dataset = pd.DataFrame[data]
    
    3],
  • data = {
        'Province': ['Banten', 'DKI Jakarta','Jawa Barat','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','DKI Jakarta'],
        'Age': [24,np.nan,60,34,58,np.nan,21,44,40,51,32,30,30,19,25],
        'Wage': [5000000,3400000,7350000,3500000,np.nan,8000000,5500000,10000000,9000000,10500000,np.nan,6400000,np.nan,2200000,4500000],
        'Life insured': ['Yes','No','No','No','Yes','No','No','Yes','Yes','Yes','No','No','No','Yes','Yes'],
    }
    
    dataset = pd.DataFrame[data]
    
    4 : meskipun format file adalah csv [comma separated values], delimiter data belum tentu karakter koma [dalam hal ini
    data = {
        'Province': ['Banten', 'DKI Jakarta','Jawa Barat','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','DKI Jakarta'],
        'Age': [24,np.nan,60,34,58,np.nan,21,44,40,51,32,30,30,19,25],
        'Wage': [5000000,3400000,7350000,3500000,np.nan,8000000,5500000,10000000,9000000,10500000,np.nan,6400000,np.nan,2200000,4500000],
        'Life insured': ['Yes','No','No','No','Yes','No','No','Yes','Yes','Yes','No','No','No','Yes','Yes'],
    }
    
    dataset = pd.DataFrame[data]
    
    5],
  • data = {
        'Province': ['Banten', 'DKI Jakarta','Jawa Barat','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','DKI Jakarta'],
        'Age': [24,np.nan,60,34,58,np.nan,21,44,40,51,32,30,30,19,25],
        'Wage': [5000000,3400000,7350000,3500000,np.nan,8000000,5500000,10000000,9000000,10500000,np.nan,6400000,np.nan,2200000,4500000],
        'Life insured': ['Yes','No','No','No','Yes','No','No','Yes','Yes','Yes','No','No','No','Yes','Yes'],
    }
    
    dataset = pd.DataFrame[data]
    
    6 : indeks baris yang digunakan sebagai nama kolom, dalam hal ini ditentukan secara otomatis oleh library [
    data = {
        'Province': ['Banten', 'DKI Jakarta','Jawa Barat','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','DKI Jakarta'],
        'Age': [24,np.nan,60,34,58,np.nan,21,44,40,51,32,30,30,19,25],
        'Wage': [5000000,3400000,7350000,3500000,np.nan,8000000,5500000,10000000,9000000,10500000,np.nan,6400000,np.nan,2200000,4500000],
        'Life insured': ['Yes','No','No','No','Yes','No','No','Yes','Yes','Yes','No','No','No','Yes','Yes'],
    }
    
    dataset = pd.DataFrame[data]
    
    7],
  • data = {
        'Province': ['Banten', 'DKI Jakarta','Jawa Barat','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','DKI Jakarta'],
        'Age': [24,np.nan,60,34,58,np.nan,21,44,40,51,32,30,30,19,25],
        'Wage': [5000000,3400000,7350000,3500000,np.nan,8000000,5500000,10000000,9000000,10500000,np.nan,6400000,np.nan,2200000,4500000],
        'Life insured': ['Yes','No','No','No','Yes','No','No','Yes','Yes','Yes','No','No','No','Yes','Yes'],
    }
    
    dataset = pd.DataFrame[data]
    
    8 : kolom yang digunakan sebagai label baris dan indexing. Tidak diperlukan untuk kasus ini [
    data = {
        'Province': ['Banten', 'DKI Jakarta','Jawa Barat','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','DKI Jakarta'],
        'Age': [24,np.nan,60,34,58,np.nan,21,44,40,51,32,30,30,19,25],
        'Wage': [5000000,3400000,7350000,3500000,np.nan,8000000,5500000,10000000,9000000,10500000,np.nan,6400000,np.nan,2200000,4500000],
        'Life insured': ['Yes','No','No','No','Yes','No','No','Yes','Yes','Yes','No','No','No','Yes','Yes'],
    }
    
    dataset = pd.DataFrame[data]
    
    9].

Untuk melihat sekilas dataframe yang telah diimpor, jalankan perintah

# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
0. Terlihat ada beberapa nilai yang kosong [
# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
1].

Data kemudian dibagi menjadi dua jenis: data independen/prediktor [

# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
2] dan data dependen/target [
# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
3]. Pembagian data ini menggunakan
# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
4 seperti di bawah. Karena dataset adalah matriks M*N, kita menggunakan slicing dengan format
# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
5.

Contoh format slicing:

  • # impor dataset
    dataset = pd.read_csv[
            'contoh_dataset.csv',
            delimiter=';', 
            header='infer', 
            index_col=False
            ]
    
    6: pilih semua baris dalam dataset, serta semua kolom kecuali kolom terakhir [ingat negative indexing pada Python].
  • # impor dataset
    dataset = pd.read_csv[
            'contoh_dataset.csv',
            delimiter=';', 
            header='infer', 
            index_col=False
            ]
    
    7: idem, tanpa negative indexing [ada empat kolom pada dataset, kita memilih tiga kolom: indeks 0, 1, dan 2].
  • # impor dataset
    dataset = pd.read_csv[
            'contoh_dataset.csv',
            delimiter=';', 
            header='infer', 
            index_col=False
            ]
    
    8: pilih semua baris, kolom terakhir.

Untuk dataset contoh:

X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

Atribut

# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
9 akan mengembalikan numpy array. Tanpa atribut ini,
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
0 akan mengembalikan obyek DataFrame. Karena province, age, dan wage adalah tipe data yang berbeda, tipe data numpy array yang dikembalikan adalah campuran/object [
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
1].

Menangani nilai kosong [NaN]

Seperti terlihat pada gambar preview dataset sebelumnya, ada beberapa observasi yang nilainya tidak lengkap [missing value]. Ada dua pilihan: hapus observasi itu, atau substitusi nilai dengan mean/rata-rata kolom itu. Tentu saja, harapannya data yang Anda gunakan sebagai data masukan sudah lengkap dan baik sejak awalnya, sehingga cara ini tidak perlu dilakukan.

Pada contoh ini, nilai yang kosong itu akan digantikan dengan mean kolom. Kelas yang digunakan adalah

X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
2.

# menangani nilai kosong
from sklearn.impute import SimpleImputer

# ganti NaN dengan mean kolom itu
imputer = SimpleImputer[
        missing_values=np.nan, 
        strategy='mean'
        ]
imputer = imputer.fit[X[:, 1:3]]
X[:, 1:3] = imputer.transform[X[:, 1:3]]

Ketika membuat obyek dari kelas

X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
3, terdapat beberapa parameter yang harus diatur:

  • X = dataset.iloc[:, :-1].values
    y = dataset.iloc[:, -1].values
    
    4 : nilai data yang digunakan sebagai penanda bahwa nilai aslinya tidak ada [missing]; dalam hal ini NaN [
    X = dataset.iloc[:, :-1].values
    y = dataset.iloc[:, -1].values
    
    5]
  • X = dataset.iloc[:, :-1].values
    y = dataset.iloc[:, -1].values
    
    6 : dalam hal ini rata-rata kolom [
    X = dataset.iloc[:, :-1].values
    y = dataset.iloc[:, -1].values
    
    7], bisa juga menggunakan
    X = dataset.iloc[:, :-1].values
    y = dataset.iloc[:, -1].values
    
    8,
    X = dataset.iloc[:, :-1].values
    y = dataset.iloc[:, -1].values
    
    9 [modus], atau
    # menangani nilai kosong
    from sklearn.impute import SimpleImputer
    
    # ganti NaN dengan mean kolom itu
    imputer = SimpleImputer[
            missing_values=np.nan, 
            strategy='mean'
            ]
    imputer = imputer.fit[X[:, 1:3]]
    X[:, 1:3] = imputer.transform[X[:, 1:3]]
    
    0

Selanjutnya obyek imputer harus di fit berdasarkan kolom yang bersangkutan menggunakan metode

# menangani nilai kosong
from sklearn.impute import SimpleImputer

# ganti NaN dengan mean kolom itu
imputer = SimpleImputer[
        missing_values=np.nan, 
        strategy='mean'
        ]
imputer = imputer.fit[X[:, 1:3]]
X[:, 1:3] = imputer.transform[X[:, 1:3]]
1, dalam hal ini
# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
2 kolom indeks 1 [age] dan 2 [wage]. Nilai kosong pada kedua kolom itu akan diubah menggunakan metode
# menangani nilai kosong
from sklearn.impute import SimpleImputer

# ganti NaN dengan mean kolom itu
imputer = SimpleImputer[
        missing_values=np.nan, 
        strategy='mean'
        ]
imputer = imputer.fit[X[:, 1:3]]
X[:, 1:3] = imputer.transform[X[:, 1:3]]
3.

Sekarang

# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
2 memiliki data yang lengkap, terlihat pada gambar di bawah.

Mengkodekan data kategori

Pada matriks

# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
2 yang telah kita buat, terdapat kolom yang nilai datanya bertipe string, yaitu Province. Pada banyak kasus dan algoritma machine learning, data seperti ini harus diubah menjadi numerik [entah itu int atau float] agar dapat digunakan dengan baik.

Kita dapat saja mengkodekan nama-nama provinsi seperti Banten, DKI Jakarta, dan lain-lain menjadi 0, 1, dan seterusnya. Masalahnya, estimator bisa saja menganggap kode provinsi memiliki relasi order [misalnya karena 1 > 0], padahal kita tahu itu hanya sebatas kode angka.

Solusinya kita harus menggunakan variabel dummy menggunakan

# menangani nilai kosong
from sklearn.impute import SimpleImputer

# ganti NaN dengan mean kolom itu
imputer = SimpleImputer[
        missing_values=np.nan, 
        strategy='mean'
        ]
imputer = imputer.fit[X[:, 1:3]]
X[:, 1:3] = imputer.transform[X[:, 1:3]]
6 dan
# menangani nilai kosong
from sklearn.impute import SimpleImputer

# ganti NaN dengan mean kolom itu
imputer = SimpleImputer[
        missing_values=np.nan, 
        strategy='mean'
        ]
imputer = imputer.fit[X[:, 1:3]]
X[:, 1:3] = imputer.transform[X[:, 1:3]]
7.

# kodekan data kategori
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

# kodekan nama provinsi [kolom ke-0]
# kode hanya sebatas penanda
encoder_X = ColumnTransformer[
        [['province_encoder', OneHotEncoder[], [0]]], 
        remainder='passthrough'
        ]
X = encoder_X.fit_transform[X].astype[float] # mengembalikan ke dalam tipe 'float64'

Ketika membuat obyek

# menangani nilai kosong
from sklearn.impute import SimpleImputer

# ganti NaN dengan mean kolom itu
imputer = SimpleImputer[
        missing_values=np.nan, 
        strategy='mean'
        ]
imputer = imputer.fit[X[:, 1:3]]
X[:, 1:3] = imputer.transform[X[:, 1:3]]
8 dari kelas
# menangani nilai kosong
from sklearn.impute import SimpleImputer

# ganti NaN dengan mean kolom itu
imputer = SimpleImputer[
        missing_values=np.nan, 
        strategy='mean'
        ]
imputer = imputer.fit[X[:, 1:3]]
X[:, 1:3] = imputer.transform[X[:, 1:3]]
7, ada beberapa parameter yang harus diatur:

  • list Python berisi tuple berisi: string yang digunakan untuk mengenali transformer [misal
    # kodekan data kategori
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.compose import ColumnTransformer
    
    # kodekan nama provinsi [kolom ke-0]
    # kode hanya sebatas penanda
    encoder_X = ColumnTransformer[
            [['province_encoder', OneHotEncoder[], [0]]], 
            remainder='passthrough'
            ]
    X = encoder_X.fit_transform[X].astype[float] # mengembalikan ke dalam tipe 'float64'
    
    0], nama transformer [
    # kodekan data kategori
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.compose import ColumnTransformer
    
    # kodekan nama provinsi [kolom ke-0]
    # kode hanya sebatas penanda
    encoder_X = ColumnTransformer[
            [['province_encoder', OneHotEncoder[], [0]]], 
            remainder='passthrough'
            ]
    X = encoder_X.fit_transform[X].astype[float] # mengembalikan ke dalam tipe 'float64'
    
    1], dan list kolom [Province memiliki index 0]
  • # kodekan data kategori
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.compose import ColumnTransformer
    
    # kodekan nama provinsi [kolom ke-0]
    # kode hanya sebatas penanda
    encoder_X = ColumnTransformer[
            [['province_encoder', OneHotEncoder[], [0]]], 
            remainder='passthrough'
            ]
    X = encoder_X.fit_transform[X].astype[float] # mengembalikan ke dalam tipe 'float64'
    
    2 : apakah kolom sisanya akan disertakan pada output [
    # kodekan data kategori
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.compose import ColumnTransformer
    
    # kodekan nama provinsi [kolom ke-0]
    # kode hanya sebatas penanda
    encoder_X = ColumnTransformer[
            [['province_encoder', OneHotEncoder[], [0]]], 
            remainder='passthrough'
            ]
    X = encoder_X.fit_transform[X].astype[float] # mengembalikan ke dalam tipe 'float64'
    
    3] atau tidak ikut [
    # kodekan data kategori
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.compose import ColumnTransformer
    
    # kodekan nama provinsi [kolom ke-0]
    # kode hanya sebatas penanda
    encoder_X = ColumnTransformer[
            [['province_encoder', OneHotEncoder[], [0]]], 
            remainder='passthrough'
            ]
    X = encoder_X.fit_transform[X].astype[float] # mengembalikan ke dalam tipe 'float64'
    
    4].

Sekarang, kolom Province telah selesai dikodekan. Terlihat pada gambar di bawah bahwa karyawan pertama berasal dari Banten. Per observasi, nilai 1 adalah unik. Terlihat kolom 3 dan 4 adalah usia dan gaji.

Jalankan perintah di bawah untuk mengetahui urutan variabel dummy pada matriks X.

print[encoder_X.named_transformers_['country_encoder'].categories_]

Bagaimana dengan variabel target [

# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
3] ? Untuk kasus ini, kita hanya akan mengubahnya menjadi numerik [0, 1, dan seterusnya] dengan
# kodekan data kategori
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

# kodekan nama provinsi [kolom ke-0]
# kode hanya sebatas penanda
encoder_X = ColumnTransformer[
        [['province_encoder', OneHotEncoder[], [0]]], 
        remainder='passthrough'
        ]
X = encoder_X.fit_transform[X].astype[float] # mengembalikan ke dalam tipe 'float64'
6:

# y adalah dependent, cukup kodekan ke angka
from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder[]
y = labelencoder_y.fit_transform[y]

Pada contoh di atas, kita menggunakan

# kodekan data kategori
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

# kodekan nama provinsi [kolom ke-0]
# kode hanya sebatas penanda
encoder_X = ColumnTransformer[
        [['province_encoder', OneHotEncoder[], [0]]], 
        remainder='passthrough'
        ]
X = encoder_X.fit_transform[X].astype[float] # mengembalikan ke dalam tipe 'float64'
7, jalan pintas dari
# menangani nilai kosong
from sklearn.impute import SimpleImputer

# ganti NaN dengan mean kolom itu
imputer = SimpleImputer[
        missing_values=np.nan, 
        strategy='mean'
        ]
imputer = imputer.fit[X[:, 1:3]]
X[:, 1:3] = imputer.transform[X[:, 1:3]]
1 dan
# menangani nilai kosong
from sklearn.impute import SimpleImputer

# ganti NaN dengan mean kolom itu
imputer = SimpleImputer[
        missing_values=np.nan, 
        strategy='mean'
        ]
imputer = imputer.fit[X[:, 1:3]]
X[:, 1:3] = imputer.transform[X[:, 1:3]]
3. Sekarang
# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
3 akan menjadi seperti terlihat pada gambar di bawah. Terlihat bahwa 1 dan 0 telah menggantikan Yes dan No.

Membagi dataset ke dalam training set dan test set

Model machine learning umumnya membutuhkan dua set data untuk "belajar" dan menghasilkan estimasi: training set dan test set. Biasanya training set ini memiliki proporsi lebih besar dibandingkan test set, misal 80%.

Untuk dataset yang digunakan dalam tulisan ini:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split[X, y, test_size=0.2, random_state=0]

Untuk parameter:

  • print[encoder_X.named_transformers_['country_encoder'].categories_]
    
    1 : proporsi test set, dalam hal ini 0.2.
  • print[encoder_X.named_transformers_['country_encoder'].categories_]
    
    2: proporsi train size. Jika tidak di set, maka akan menyesuaikan dengan test size [dalam kasus ini 0.8]. Berlaku kebalikannya.
  • print[encoder_X.named_transformers_['country_encoder'].categories_]
    
    3 : konstan ini akan membuat hasil splitting tetap sama antar runtime atau antar mesin. Nilai bebas.

Karena kita hanya memiliki 15 observasi, rasionya menjadi 12:3.

Gambar di bawah menunjukkan training set untuk X dan y.

Bagaimana dengan validation set? Untuk mendapatkan tiga set [train, validate, test], cukup jalankan

print[encoder_X.named_transformers_['country_encoder'].categories_]
4 dua kali. Yang pertama untuk mendapatkan test set, yang kedua kali untuk mendapatkan validation set dari training set. Validation set biasanya digunakan untuk mendapatkan hyperparameter yang tidak didapatkan dari mempelajari training set.

X_train, X_test, y_train, y_test = train_test_split[X, y, test_size=0.2, random_state=1]
# kemudian:
X_train, X_val, y_train, y_val = train_test_split[X_train, y_train, test_size=0.2, random_state=1]

Feature Scaling

Kita perlu menskalakan kolom-kolom yang dibutuhkan. Perbedaan skala dapat menyebabkan kendala dengan estimator. Ingat euclidean distance.

[Pada contoh ini, hanya

# impor dataset
dataset = pd.read_csv[
        'contoh_dataset.csv',
        delimiter=';', 
        header='infer', 
        index_col=False
        ]
2 yang diskalakan. Untuk kasus tertentu, variabel independen dan dependen harus diskala.]

Ada tiga scaler di library scikit-learn yang sering digunakan:

print[encoder_X.named_transformers_['country_encoder'].categories_]
6,
print[encoder_X.named_transformers_['country_encoder'].categories_]
7, dan
print[encoder_X.named_transformers_['country_encoder'].categories_]
8.

StandardScaler menghilangkan mean [terpusat pada 0] dan menskalakan ke variansi [deviasi standar = 1], dengan asumsi data terdistribusi normal [gauss] untuk semua fitur. Formulanya

$$z = [x - u]/s$$,

dengan $$u$$ adalah mean sampel dan $$s$$ adalah deviasi standar [DS] sampel.

data = {
    'Province': ['Banten', 'DKI Jakarta','Jawa Barat','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','DKI Jakarta'],
    'Age': [24,np.nan,60,34,58,np.nan,21,44,40,51,32,30,30,19,25],
    'Wage': [5000000,3400000,7350000,3500000,np.nan,8000000,5500000,10000000,9000000,10500000,np.nan,6400000,np.nan,2200000,4500000],
    'Life insured': ['Yes','No','No','No','Yes','No','No','Yes','Yes','Yes','No','No','No','Yes','Yes'],
}

dataset = pd.DataFrame[data]
0

Sebenarnya ada dua parameter boolean yang bisa diatur untuk

print[encoder_X.named_transformers_['country_encoder'].categories_]
9, yaitu
# y adalah dependent, cukup kodekan ke angka
from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder[]
y = labelencoder_y.fit_transform[y]
0 dan
# y adalah dependent, cukup kodekan ke angka
from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder[]
y = labelencoder_y.fit_transform[y]
1. Umumnya biarkan saja ke default, yaitu True.

Terlihat pada potongan kode di atas, fitting untuk menghitung mean dan DS hanya dilakukan pada training set [lalu dilakukan transformasi [

# y adalah dependent, cukup kodekan ke angka
from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder[]
y = labelencoder_y.fit_transform[y]
2]]. Gunakan mean dan DS yang didapat tadi untuk test set [sehingga cukup
# menangani nilai kosong
from sklearn.impute import SimpleImputer

# ganti NaN dengan mean kolom itu
imputer = SimpleImputer[
        missing_values=np.nan, 
        strategy='mean'
        ]
imputer = imputer.fit[X[:, 1:3]]
X[:, 1:3] = imputer.transform[X[:, 1:3]]
3 saja].

MinMaxScaler menskalakan nilai data ke dalam suatu range. Tidak masalah pada data non-gaussian. Formulanya

$$[x_i - min[x]] / [max[x] - min[x]]$$.

data = {
    'Province': ['Banten', 'DKI Jakarta','Jawa Barat','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','Banten','Banten','Jawa Barat','DKI Jakarta','DKI Jakarta'],
    'Age': [24,np.nan,60,34,58,np.nan,21,44,40,51,32,30,30,19,25],
    'Wage': [5000000,3400000,7350000,3500000,np.nan,8000000,5500000,10000000,9000000,10500000,np.nan,6400000,np.nan,2200000,4500000],
    'Life insured': ['Yes','No','No','No','Yes','No','No','Yes','Yes','Yes','No','No','No','Yes','Yes'],
}

dataset = pd.DataFrame[data]
1

Ketika membuat obyek dari kelas ini, ada parameter yang bisa diatur:

# y adalah dependent, cukup kodekan ke angka
from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder[]
y = labelencoder_y.fit_transform[y]
4 dengan nilai tuple dengan format
# y adalah dependent, cukup kodekan ke angka
from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder[]
y = labelencoder_y.fit_transform[y]
5, misalnya
# y adalah dependent, cukup kodekan ke angka
from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder[]
y = labelencoder_y.fit_transform[y]
6. Jika ada data bernilai negatif, bisa menggunakan
# y adalah dependent, cukup kodekan ke angka
from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder[]
y = labelencoder_y.fit_transform[y]
7.

Dua scaler ini lemah terhadap outlier [data dengan nilai ekstrem].

Sedangkan RobustScaler [

# y adalah dependent, cukup kodekan ke angka
from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder[]
y = labelencoder_y.fit_transform[y]
8] mirip dengan Min-Max, hanya saja menggunakan range interkuartil. Scaler ini tahan terhadap outlier. Formulanya

$$[x_i - Q_1[x]] / [Q_3[x] - Q_1[x]]$$,

dengan $$Q_3$$ adalah kuartil atas, $$Q_1$$ kuartil bawah.

Selain tiga di atas, masih ada normalisasi baris sehingga masing-masing obervasi memiliki panjang = 1, binerisasi nilai [misal berat badan [kg] >= 70 menjadi 1, < 70 menjadi 0], dan beberapa lagi.

Scaling data untuk apa?

Sementara scaling merupakan cara untuk menyamakan skala dari beberapa variabel yang berbeda sehingga antara variabel yang satu dengan yang lain memiliki skala data yang seimbang.

MinMaxScaler untuk apa?

Orang-orang juga biasa menggunakan MinMaxScaler yang berfungsi untuk mengubah data berada di rentang 0 sampai 1. Agar lebih mudah mengilustrasikan kesalahan ini, saya akan menggunakan MinMaxScaler.

Apa itu normalisasi pada machine learning?

Normalisasi adalah salah satu teknik persiapan data yang paling sering digunakan. Pada machine learning dan data mining, proses ini membantu kita mengubah nilai kolom numerik dalam dataset untuk menggunakan skala umum.

Apa itu normalisasi data python?

Apa itu normalisasi data? Normalisasi data adalah proses membuat beberapa variabel memiliki rentang nilai yang sama, tidak ada yang terlalu besar maupun terlalu kecil sehingga dapat membuat analisis statistik menjadi lebih mudah.

Bài mới nhất

Chủ Đề