#!/usr/bin/env python # coding: utf-8 # In[1]: #Gerekli kütüphaneler import numpy as np import pandas as pd import matplotlib.pyplot as plt get_ipython().run_line_magic('matplotlib', 'inline') # In[2]: dataset = pd.read_csv("sirket_giderleri.csv") # In[3]: dataset.head() # In[4]: dataset.isnull().sum() # In[5]: X = dataset.iloc[:, :-1].values y = dataset.iloc[:, 4].values # # Kategorik veriler # # Kategorik verimiz 4. değişken olduğundan dolayı, bu sütun üzerinde işlem yapmak istiyoruz. Python'da indekleme 0'dan başladığı için bunu 3. sütun olarak işleme sokacağız. Değişkenimize baktığımızda 3 farklı şehir ismi yer alıyor. Bu her bir şehir için yeni bir sütun demek oluyor.Yani artık 4. sütun yerine, her şehir için yeni bir sütun oluşturuyoruz.Eğer veri setinde şehir Ankara ise 1 yaz, diğer şehirlere ait hücrelere 0 yaz. Bunu yapmamızdaki asıl sebep şehirlerin birbirleri arasında üstünlüğünün olmamasını sağlamak. Çünkü 4. sütunda Ankara yerine 1, Bursa yerine 2, İstanbul yerine 3 yazmış olsaydık, İstanbulun diğer iki şehirden daha üstün olduğu anlamına gelecekti. # In[6]: from sklearn.preprocessing import LabelEncoder, OneHotEncoder labelencoder = LabelEncoder() X[:, 3] = labelencoder.fit_transform(X[:, 3]) onehotencoder = OneHotEncoder(categorical_features = [3]) X = onehotencoder.fit_transform(X).toarray() # In[7]: print(pd.DataFrame(X).head()) # Yukarıdaki tabloda görüldüğü üzere 0,1 ve 2 numaralı değişkenlerimiz şehir değişkeni için oluşturduğumuz dummy features'u temsil ediyor.
# Ankara -> 1. Sütun
# Bursa-> 2. Sütun
# İstanbul->3. Sütun
# In[8]: #Farklı olan şehirlerin sayısı dataset['Sehir'].value_counts() # # Dummy Variable Tuzağından Kaçınma # Aşağıda örneğe baktığmızda merkezi A,B,C den oluşan ve kayıp değeri olan bir tablo görüyoruz. # # Center Loss
# A ------- 12.4
# A ------- 10.7
# B ------- 9.1
# B ------- 11.5
# C ------- 8.5
# C ------- 11.8
# # Bu tablodaki kategorik değerlerin numerik ifadelere çevirdiğimizde şöyle bir taablo elde ederiz. # # dummy_a dummy_b dummy_c Loss
# 1--------------------0-----------0---------12.4
# 1------------------- 0---------- 1--------- 10.7
# 0------------------- 1---------- 0--------- 9.1
# 0------------------- 1---------- 0--------- 11.5
# 0------------------- 0---------- 1--------- 8.5
# 0------------------- 0---------- 1--------- 11.8
# # # and the matrix regression equation y = X β + ε would look like this:
# [ 12.4 ]     [ 1 1 0 0 ] # [ 20.7 ]     [ 1 1 0 0 ]   [ beta0 ]
# [ 9.1 ]   =  [ 1 0 1 0 ]   [ alpha1 ] +  epsilon
# [ 11.5 ]     [ 1 0 1 0 ]  [ alpha2 ]
# [ 8.5 ]       [ 1 0 0 1 ]  [ alpha3 ]
# [ 11.8 ]     [ 1 0 0 1 ]
# # # - X matrisinin ilk sütununun ,kalan kalan üç sütunun toplamına eşit olduğuna dikkat edin, böylece 1. sütunun, 2., 3. ve 4. sütunlarıyla korelasyonu 1'dir.Böylece mükemmel korelasyon yakalarız ve X matrisini tersine çeviremeyiz. Bu nedenle de β ^ için denklemi çözemeyiz. # # Bu yüzden oluşturduğumuz dummy değerlerinden herhangi birisini bırakmamız gerekiyor. Yani m tane değerimiz varsa m - 1 değer için çözmemiz gerekiyor. Bu yüzden ben sayısı en az olan Bursa sütununu düşüreceğim. Herhangi bir satırda İstanbul ve Ankara değeri 0 olduğunda Bursa için bu değer 1 olarak iişlem yapılıyor. Böylece tuzağa düşmemiş oluyoruz. # In[9]: # Dummy Variable Tuzağından Kaçınma X = X[:, 1:] # In[10]: # Training ve Test split olarak verimizi iki parçaya ayıralım 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) # In[11]: # Çoklu Modelimizi Eğitelim '''Multiple Linear Regression Linear REgression sınıfından olduğu için LinearRegression class'ını yüklüyoruz ''' from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor.fit(X_train, y_train) # In[12]: # Test Sonuçlarını Tahmin Edelim y_pred = regressor.predict(X_test) # In[13]: y_pred # # Features (Değişken) Seçimi # Algoritmaları öğrenmeye başlarken en çok araştırdığım konu buydu sanırım. Bütun değişkenleri dahil ediyor muyuz? Ya da hangilerini seçmemiz gerekiyor. Bunun için birkaç yöntem mevcut bunlardan birisi de backward elemination.(Geriye doğru eleme) # ### Backward elemination # #### 1- P Değeri Anlamlılık # - P değeri bir karşılaştırmada istatiksel anlamlılık düzeyine işaret eder. Olası hata miktarını gösterir. Bu değer 0,05 olarak önerilmiş ve kabul görmüştür. Bir test sonucunda bulunan P değeri 0,05'in altında ise karşılaştırma sonucunda anlamlı farklılık vardır. # # #### 2 - Tüm değişkenler modele dahil edilir. # # #### 3 -Her bir bağımsız değişkenin P dğerine bakılır. Bu değer 0.05'ten büyük ise değişken listeden çıkarılır. İlk olarak 0.05'ten büyük olan en büyük değer modelden çıkarılarak işleme başanır. Bütün değişkenlerin P değeri 0.05' in altında olana kadar işlem devam eder. # # #### 4- Çıkarılan her bir değişkenden sonra model tekrar kurulur ve 3. adım tekrar yapılır. # #### 5 - Eğer P değeri 0.05' in üstünde olan herhangi bir değişken yoksa, işlem sonlandırılır. # # # In[14]: #Backward elemination işlemini gerçekleştirmek için gerekli kütüphanemizi dahil edelim import statsmodels.formula.api as sm # ### Multiple Linear Regression Formulu # y = β0 + X1β1 + X2β2 + X3β3 + ε # Yukarıda formulde gördüğünüz gibi beta0 değeri sabit olup 1' e eşitir. Fakat bu değer bizim bağımsız değişkenlerimizin bulunduğu lisete (X) yok. Sabit 1 değerini bu listeye eklememiz gerekiyor.Bunun için Numpy' ın' append() ve ones() methodunu kullanacağız. Normalde append fonksiyonuna 1.değer olarak listemizi 2. değer olarak ise eklemek istediğimiz değeri veririz.Fakat böyle yaptığımız beta0' ı listemizin en sonuna ekleriz.Fakat bu değişkeni ilk eleman olarak eklemek istiyoruz.Bunun için np.ones()'ı append() methoduna ilk eleman olarak, X' i ise 2. eleman olarak yazıyoruz. Böylece beta0 değerlerini başa almış oluyoruz. # In[15]: # X' bakarsanız 50 satırdan oluşuyor. Bu yüzden 50 satırlık 1 değerini np.ones(50,1) ile oluşturuyoruz. X = np.append(arr = np.ones((50, 1)).astype(int), values = X, axis = 1) X_opt = X[:, [0, 1, 2, 3,4,5]] regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit() # summary() fonksiyonu ile istatiksek bir çok değere ulaşabiliriz. regressor_OLS.summary() # ### 1.Adım P değeri en büyük ve 0.05'ten büyük olan listemizin 2. elemanı. Bu değeri listeden çıkaralım # In[16]: X_opt = X[:, [0, 1,3,4,5]] regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit() regressor_OLS.summary() # ### 2.Adım P değeri en büyük ve 0.05'ten büyük olan listemizin 1. elemanı. Bu değeri de listeden çıkaralım # In[17]: X_opt = X[:, [0,3,4,5]] regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit() regressor_OLS.summary() # ### 3.Adım P değeri en büyük ve 0.05'ten büyük olan listemizin 2. elemanı. Bu değeride listeden çıkaralım # In[18]: X_opt = X[:, [0,3,5]] regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit() regressor_OLS.summary() # ### 4.Adım # In[19]: X_opt = X[:, [0,5]] regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit() regressor_OLS.summary()