Cross Validation(Çapraz Doğrulama) Nedir?

Cross Validation(Çapraz Doğrulama) Nedir?

Makine Öğrenmesi Serimizin Veri Ön İşleme Bölümün son konularından biri olan  Cross Validation işleyeceğiz. Neler yaptık ve neler yapacağımızdan bahsettip devam edelim. Bizler bundan önce şu konularını işledik :

 

  • Verilerin Okunması
  • Eksik Veriler ve Yapılacak İşlemler
  • Verileri Birleştirme ( DataFrame)

 

 

İşlemlerini yaptık.Bu yazıda eğitim ve test kümelerini ve işlemlerinden bahsettip bu yazıyı bitireceğim. Diğer yazıda ise Öznitelik kavramı ve Ölçümlemesi yapacağız. Bu iki yazıdan sonra veri ön işleme konusu bitecektir. Veri Ön İşleme konusunu bitirdikten sonra , öğrendiklerimizi tekrar etmek için, yabancı kaynaktan bir veri kümesi alacağız. Bu veri üzerinden çalişacağız. Daha sonra Doğrusal Regresyon Bölümüne giriş yapacağız. İlerleyen zamanlar da bazı projeler katılacağız...

 

 

İlgili resim

 

Veri Ön İşleme çalışmalarında, uygulanan yöntemin başarı oranının tespit etmek için, veri kümesi eğitim ve test kümesi olarak 2'ye ayırılmaktadır. Bu ayırma işlemi çeşitli şekillerde yapılabilir. Örneğin veri kümesinin %66’lık bir kısımını eğitim %33’lük bir kısmını ise test için ayırıyoruz. Ve eğitim kümesi ile sistem eğitildikten sonra test kümesi ile başarısının tespit edilmesi kullanılabilecek yöntemlerden birsidir. Bu eğitim ve test kümelerinin rastgele olarak atanması da farklı bir yöntemdir...

 

Bilgilendirme : Neden %33 kısmı alıyoruz hakkında bilgilendirmek isityorum. Literatür de verinin 2/3 'lük kısmı eğitim, 1/3'lük kısmı ise test verisi şeklinde ayrılabilir. Tabiki sizler farklı yapabilirsiniz. Ama şuanlık en iyisi bu diyebilriz..

 

Cross Validation :  Bir Makine Öğrenmesi modelinde yapılan testin hatasını daha iyi tahmin edebilmek için model seçiminde kullanılan bir tekniktir. Aslında bunun için pek çok farklı yöntemler olduğunu unutmayın. İlerleyen zamanlar da bunun hakkında bir yazı yazabilrim.Şimdilik bunları merak edenler için alt tarafa bir link koyacağım. Merak edenler oradan okuyabilir.

 

 

Şimdi bu işlemleri python da nasıl kodlayacağımızı öğrenelim. 

 

from sklearn.cross_validation import train_test_split 

x_train, x_test,y_train,y_test = train_test_split(s,cinsiyet,test_size=0.33,random=0)

 

Tüm işlemimiz bu aslında diğer yazıyla daha rahat anlayacaksınız. Ne yaptığımızdan bahsedelim. Biz ilk önce hangi yöntemi kullanacağımızı modelimize bildiriyoruz. Kod yazarken bu ikisini yazıp enter demiyoruz. Bu yazı bir seri  şeklindedir. O yüzden önceki yazıların devamı gibi. O kodların altına bunları yazmanız lazım. Ben tüm kodları tekrar atacağım. Ve kullandığımız veriler de aynı olmalıdır.

 

Kodlar :

 

import numpy as np
import pandas as pd

#-----------------------------------------------------------------------------

veriler = pd.read_csv('eksik_veriler.csv')
boy = veriler[['boy']]
kilo = veriler[["kilo"]]
yas = veriler[["yas"]]
boy_kilo = veriler[["boy","kilo"]]
boy_kilo_yas = veriler[["boy","kilo","yas"]]

#-----------------------------------------------------------------------------

from sklearn.preprocessing import Imputer

imputer= Imputer(missing_values='NaN', strategy = 'mean', axis=0 )    
yas = veriler.iloc[:,1:4].values
imputer = imputer.fit(yas[:,1:4])
yas[:,1:4] = imputer.transform(yas[:,1:4])
ulke = veriler.iloc[:,0:1].values

#-----------------------------------------------------------------------------

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
ulke[:,0] = le.fit_transform(ulke[:,0])

#-----------------------------------------------------------------------------

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(categorical_features='all')
ulke=ohe.fit_transform(ulke).toarray()

#-----------------------------------------------------------------------------

sonuc = pd.DataFrame(data = ulke, index = range(9), columns= ["Fransa","Türkiye","Amerika"])
print(sonuc)

sonuc2 = pd.DataFrame(data = yas, index = range(9), columns= ["Boy","Kilo","Yaş"])
print(sonuc2)
cinsiyet = veriler.iloc[:,-1:].values
print(cinsiyet)
# ilerki bölümler için cinsiyet verisini birleştirme yapmayacağız.
s = pd.concat([sonuc,sonuc2], axis = 1)
print(s)


#-----------------------------------------------------------------------------

Veri Kümesi :

 

ulke,boy,kilo,yas,cinsiyet
tr,130,30,10,e
tr,190,80,25,e
tr,175,90,35,e
us,160,54,39,k
us,162,52,41,k
us,167,62,55,k
fr,159,65,29,k
fr,164,66,32,k
fr,166,56,42,k

 

Biz modelimize hangi yöntemi seçtiğimiz söyledik. Literatür de bazı değişkenler vardır. Herkes o şekilde kullanır. Mesela verinin %33 kısmını almak gibi. K-Fold Cross Validation yöntemide k değerini 10 almamız gibi... Test ve Eğitim için de x_train,x_test,y_train,y_test... şeklinde tanımlanırız.Ve bizim amacımız elimizdeki verilerie bakarak cinsiyet tahmini yapmaktır. Modelimiz için yetersiz veri olabilir. Bunu daha fazla veriyle yaparsınız daha verimli sonuçlar alabilrisiniz... 

 

Şimdi eğitim ve test verilerini cinsiyet verilerden ayırmamız lazım. Zaten biz önceki yazımızda buna göre verileri düzenledik. Cinsiyet verileri DataFrame işlemleri yapmadık.Şimdi kodumuzu anlatmaya devam edelim. Değişken isimlerii anladık. " Değişken_ismi = " ifadesinden sonra ne yaptığımıza bakalım. Split ifadesini kullandık yani eğitim ve test için veriler bölmemizi istiyoruz. Hangi verileri bölmek istediğmizi parantez içinde belirtmemiz lazım.Kodlara bakarsanız , "s" değişkeni ile "cinsiyet" değişkeni bölmek için yazacağız. "s" değişkeninde sadace cinsiyet verisi yok onu özellikle almadık. Randon_state için de birçok yöntem var... Bu yöntemleri daha sonra anlatacağım. (random_state = 0 yaptığımızda her seferinde farklı veriler alacağız için farklı başarı oranları çıkarabilir :) Bu sefer kod çıktısı atmayacağım. Sadace bölme işlemi yaptık diğer yazıda tahmin yapacağız ve başarı oranımız kontrol edeceğiz..

 

Yazıyı okuduğunuz için Teşekkür ederim...