Metrics

Kategori: Machine Learning , 04 Aralık 2019 , JanFranco


Önceki yazılarımızda regression algoritmalarının mantığını ve Python üzerinden nasıl kullanıldığını gördük. Herhangi bir performans ölçümü vs. yapmadık. Bu yazımızda R^2 formülünü kullanarak performans değerlendirmesi yapacağız. İlk olarak R^2 formülünü verelim:


R^2 = 1 - (sum((yReal - yPredict)^2) / sum((yRealAvg - yPredict)^2))
Herhangi birşey anlamak zor tabi. Bu nedenle bir örnek verelim. Daha önce kullandığımız maaşlar veri setini düşünelim. Varsayalım ki eğitim seviyesi 3 olan bir meslek grubunun maaşı 5000 tl. Bizim kurduğumuz model ise eğitim seviyesi 3 olan bir meslek grubunun maaşını 5500 tl olarak tahmin etsin. Burada yReal 5000 tl, yPredict 5500 tldir. Bu iki değerin farkının karesi alınır. Bunu tüm değerler için yapıldığını düşünelim. Elde edilen sonuçlar toplandığında pay değerini elde ettik. Paydayı da açıklayalım. Aynı mantık ancak bu sefer gerçek değerlerin ortalamasını kullanıyoruz. Python üzerinden görelim. Kütüphaneleri import edelim ve veriyi okuyalım:


import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

from sklearn.svm import SVR
from sklearn.metrics import r2_score
from sklearn.tree import DecisionTreeRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import PolynomialFeatures

df = pd.read_csv('salaries_new.csv')
print(df)
print(df.corr())

>>

    Calisan ID             unvan  UnvanSeviyesi  Kidem  Puan   maas
0            1             Cayci              1      5    70   2250
1            2          Sekreter              2      5    70   2500
2            3  Uzman Yardimcisi              3      5    70   3000
3            4             Uzman              4      5    70   4000
4            5  Proje Yoneticisi              5      5    70   5500
5            6               Sef              6      5    70   7500
6            7             Mudur              7      5    70  10000
7            8          Direktor              8      5    70  15000
8            9           C-level              9      5    70  25000
9           10               CEO             10      5    70  50000
10          11             Cayci              1      7    99   2000
11          12          Sekreter              2      7     9   2500
12          13  Uzman Yardimcisi              3      7    62   4000
13          14             Uzman              4      4    38   3000
14          15  Proje Yoneticisi              5      1    80   5000
15          16               Sef              6      2    35   5000
16          17             Mudur              7      8    99  12000
17          18          Direktor              8      4    58  11000
18          19           C-level              9      2    20  15000
19          20               CEO             10      4    42  22000
20          21             Cayci              1      8    11   2200
21          22          Sekreter              2      2    53   2200
22          23  Uzman Yardimcisi              3      8    50   2800
23          24             Uzman              4      9    91   6000
24          25  Proje Yoneticisi              5      9    71   5400
25          26               Sef              6      1     2   4000
26          27             Mudur              7     10    81  12000
27          28          Direktor              8     10    38  10000
28          29           C-level              9      1    50  15000
29          30               CEO             10      9    83  60000
               Calisan ID  UnvanSeviyesi     Kidem      Puan      maas
Calisan ID       1.000000       0.331847  0.206278 -0.251278  0.226287
UnvanSeviyesi    0.331847       1.000000 -0.125200  0.034948  0.727036
Kidem            0.206278      -0.125200  1.000000  0.322796  0.117964
Puan            -0.251278       0.034948  0.322796  1.000000  0.201474
maas             0.226287       0.727036  0.117964  0.201474  1.000000
Pandas kütüphanesinin corr methodu ile sütunlar arası ilişkiyi görebiliriz. Burada ID zaten alınmaması gerekli. Unvan ise dummy variabledır. Alınmaması gerekir. UnvanSeviyesi, Kidem, Puan değerlerini alacağız ve maas değerini bulmaya çalışacağız. Kidem ve Puan correlation değeri çok düşük evet fakat burada birden fazla değeri kullanmak için alıyoruz:


x = degSenScore = df.iloc[:, [2, 3, 4]].values
y = salary = df.iloc[:, [5]].values
Multiple linear regression modeli kuralım, fit edelim. Modelin başarısını ölçmek için r2_score methodunu kullanacağız:


linReg = LinearRegression()
linReg.fit(x, y)
linRegRes = linReg.predict(x)
model = sm.OLS(linReg.predict(x), x)
print(model.fit().summary())
print("***** RESULTS | R2 Scores *****")
print("Multiple Linear Regression - ", r2_score(y, linRegRes))
plt.title('Multiple Linear Regression')
plt.scatter(y, linRegRes, color='red')
plt.plot(y, y)
plt.show()

>>

                                 OLS Regression Results                                
=======================================================================================
Dep. Variable:                      y   R-squared (uncentered):                   0.922
Model:                            OLS   Adj. R-squared (uncentered):              0.917
Method:                 Least Squares   F-statistic:                              166.0
Date:                Mon, 15 Jul 2019   Prob (F-statistic):                    2.95e-16
Time:                        14:59:15   Log-Likelihood:                         -292.12
No. Observations:                  30   AIC:                                      588.2
Df Residuals:                      28   BIC:                                      591.1
Df Model:                           2                                                  
Covariance Type:            nonrobust                                                  
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
x1          2494.9930    219.825     11.350      0.000    2044.702    2945.284
x2           -26.4705     21.278     -1.244      0.224     -70.057      17.116
==============================================================================
Omnibus:                        3.045   Durbin-Watson:                   1.495
Prob(Omnibus):                  0.218   Jarque-Bera (JB):                2.092
Skew:                          -0.643   Prob(JB):                        0.351
Kurtosis:                       3.134   Cond. No.                         18.3
==============================================================================
metrics

OLS istatistik verilerinde de görüyoruz ki x2 değişkenini almak gereksiz. Siz kidem ve puan değerlerini drop edip tekrar deneyebilirsiniz. Modellerin başarısı artacaktır. 0.55... şeklinde bir R^2 değeri elde ettik. Şimdi de Polynomial Regression modelini kullanalım:


polyF = PolynomialFeatures(degree=4)
polyDeg = polyF.fit_transform(df.iloc[:, [2]].values)
polySen = polyF.fit_transform(df.iloc[:, [3]].values)
polyScore = polyF.fit_transform(df.iloc[:, [4]].values)
polyDeg = pd.DataFrame(data=polyDeg)
polySen = pd.DataFrame(data=polySen)
polyScore = pd.DataFrame(data=polyScore)
x_poly = pd.concat([polyDeg, polySen, polyScore], axis=1)
polyReg = LinearRegression()
polyReg.fit(x_poly, y)
PolyRegRes = polyReg.predict(x_poly)
print("Polynomial Regression - ", r2_score(y, PolyRegRes))
plt.title('Polynomial Regression')
plt.scatter(y, PolyRegRes, color='red')
plt.plot(y, y)
plt.show()

>>

Polynomial Regression -  0.9069089894124953
metrics

Support Vector Regression algoritmasını kullanalım. Bu algoritmayı kullanırken verilerin ölçekli olması gerektiğini unutmayalım:


stdScale = StandardScaler()
xScaled = stdScale.fit_transform(x)
yScaled = stdScale.fit_transform(y)
svReg = SVR(kernel='rbf', gamma='auto')
svReg.fit(xScaled, yScaled.ravel())
svRegRes = svReg.predict(xScaled)
print("Support Vector Regression - ", r2_score(yScaled, svRegRes))
plt.title('Support Vector Regression')
plt.scatter(yScaled, svRegRes, color='red')
plt.plot(yScaled, yScaled)
plt.show()

>>

Support Vector Regression -  0.6287203839391852
metrics

Decision Tree algoritmasını kullanalım:


treeReg = DecisionTreeRegressor()
treeReg.fit(x, y.ravel())
treeRegRes = treeReg.predict(x)
print("Decision Tree Regression - ", r2_score(y, treeRegRes))
plt.title('Decision Tree Regression')
plt.scatter(y, treeRegRes, color='red')
plt.plot(y, y)
plt.show()

>>

Decision Tree Regression -  1.0
metrics

Burada, algoritmayı anlatırken de bahsetmiştik ancak tekrar üstünde duralım, 1 değerinin çıkması normaldir. Ancak 1 değerinin çıkması en iyi algoritma olduğunu göstermemekte. Örneğin veri setindeki en yüksek maaş level 10 - 60000 tl ise, 100000000 level girsek bile tahmin yine 60000 tl olacaktır. Öğrenmede gayet iyi bir algoritma ancak farklı verileri tahmin etmekte kötü bir algoritmadır. Decision tree algoritmasını arkaplanda çalıştıran Random Forest algortimasını deneyelim:


forestReg = RandomForestRegressor(n_estimators=10)
forestReg.fit(x, y.ravel())
forestRegRes = forestReg.predict(x)
print("Random Forest Regression - ", r2_score(y, forestRegRes))
plt.title('Random Forest Regression')
plt.scatter(y, forestRegRes, color='red')
plt.plot(y, y)
plt.show()

>>

Random Forest Regression -  0.9520599678536232
metrics


Sonraki Yazı: Logistic Regression
Yorumlar

Henüz bir yorum bulunmuyor.