Makine Öğrenmesi - Sınıflandırma Algoritmaları

Gradient Boosting Classifier

Yayın tarihi :16-Oca-22
Bölüm kodlarını ve/veya veri setlerini indir.

Gradient Boosting, zayıf tahmin modellerini birleştirerek bir topluluk modeli oluşturmak için kullanılır. Hem regresyon hem de sınıflandırma modellerini eğitmek için kullanılabilir. 

Sınıflandırma algoritması olarak kullanabilmek için "GradientBoostingClassifier" kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.ensemble import GradientBoostingClassifier

Söz dizimi: GradientBoostingClassifier(*, loss='deviance', learning_rate=0.1, n_estimators=100, subsample=1.0, criterion='friedman_mse', min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0, init=None, random_state=None, max_features=None, verbose=0, max_leaf_nodes=None, warm_start=False, validation_fraction=0.1, n_iter_no_change=None, tol=0.0001, ccp_alpha=0.0)

  • loss, optimize edilecek kayıp fonksiyonu temsil eder. 2 farklı değer alabilir; "deviance", "exponential". Varsayılan olarak deviance değerini alır.
  • learning_rate, öğrenme oranını temsil eder.
  • n_estimators, güçlendirilecek aşama sayısını temsil eder.
  • criterion, bir bölünmenin kalitesini ölçme işlemini temsil eder. 4 farklı değer alabilir:'friedman_mse', 'squared_error', 'mse', 'mae'. Varsayılan olarak friedman_mse'dir. 
  • max_depth, regresyon tahminleyicilerinin maksiumum derinliğini temsil eder.
  • max_features, en iyi bölünmeyi ararken göz önünde bulundurulması gereken özelliklerin sayısını temsil eder. 3 farklı değer alabilir, “auto”, “sqrt”, “log2”. Varsayılan olarak auto'dur.
    • auto, max_features=n_features
    • sqrt, max_features=sqrt(n_features)
    • log2, max_features=log2(n_features)

Örnek-1: Bir adayın yeni bir iş arama veya şirket için çalışma olasılığını tahmin etmenin yanı sıra çalışan kararı üzerindeki etkileyen faktörleri yorumlamak için Gradient Boosting algoritmasını kullanalım. Veri seti olarak, "aug_train.csv" veri seti kullanılacaktır.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score
from sklearn.metrics import confusion_matrix,classification_report

from sklearn.ensemble import GradientBoostingClassifier

Keşifsel Veri Analizi EDA

#Veri seti okunur
df=pd.read_csv("aug_train.csv")
df.head()

Çıktı:

#Veri seti düzenlemesi yapıldı

#"enrollee_id" sütunu sınıflandırma için önemli olmadığından kaldırıldı.
df.drop("enrollee_id",axis=1,inplace=True)

#Veri setindeki boş değerler kaldırıldı
df=df.dropna()

#experience sütunu düzenlendi
df["experience"].replace({">20":22,"<1":0},inplace=True)
df["experience"]=df["experience"].astype(float)

#relevent_experience sütunu düzenlendi
df["relevent_experience"].replace({"Has relevent experience":"Yes","No relevent experience":"No"},inplace=True)

#company_size sütunu düzenlemesi
def company_size_normal(x):
    if x == "<10":
        return "LOCAL"
    elif x == "50-99" or x == "10/49":
        return "SMALL"
    elif x == "100-500":
        return "MEDIUM_SCALE"
    elif x == "500-999":
        return "UPPER_SCALE"
    elif x == "1000-4999" or x == "5000-9999":
        return "EXTENDED"
    elif x == "10000+":
        return "LARGE_SCALE"
df["company_size"] = df["company_size"].apply(lambda x: company_size_normal(x))

#last_new_job sütunu düzenlemesi
def last_new_job_normal(x):
    if x == 0:
        return "NEVER"
    elif 0 < x <= 2:
        return "LITTLE_TIME"
    elif x > 2:
        return "WAITING_TOO_MUCH"
    else:
        pass
df["last_new_job"].replace({">4":5,"never":0},inplace=True)
df["last_new_job"]=df["last_new_job"].astype(float)
df["last_new_job"] = df["last_new_job"].apply(lambda x: last_new_job_normal(x))

#experience sütunu düzenlemesi
def experience_normal(x):  
    if x == 0:
        return 0
    elif 0 < x <= 3:
        return "JUNIOR"
    elif 3 < x <= 7:
        return "MIDDLE_EXPERIENCE"
    elif 7 < x <= 15:
        return "SENIOR"
    elif x > 15:
        return "DOMINATE_BUSINESS"
df["experience"] = df["experience"].apply(lambda x: experience_normal(x))

#city_development_index sütunu düzenlemesi
def city_index_normal(x):
    if x > 0:
        return "%.2f" % x
df["city_development_index"] = df["city_development_index"].apply(lambda x: city_index_normal(x))
df["city_development_index"] = df["city_development_index"].astype(float)
# Veri seti hakkında bilgi 
df.info()

Çıktı:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 8955 entries, 1 to 19155
Data columns (total 13 columns):
 #   Column                  Non-Null Count  Dtype  
---  ------                  --------------  -----  
 0   city                    8955 non-null   object 
 1   city_development_index  8955 non-null   float64
 2   gender                  8955 non-null   object 
 3   relevent_experience     8955 non-null   object 
 4   enrolled_university     8955 non-null   object 
 5   education_level         8955 non-null   object 
 6   major_discipline        8955 non-null   object 
 7   experience              8955 non-null   object 
 8   company_size            8955 non-null   object 
 9   company_type            8955 non-null   object 
 10  last_new_job            8955 non-null   object 
 11  training_hours          8955 non-null   int64  
 12  target                  8955 non-null   float64
dtypes: float64(2), int64(1), object(10)
memory usage: 979.5+ KB
#target sütunu eleman sayıları grafiği
df.target.value_counts().plot.bar()

Çıktı:

#Veri seti açıklamaları
df.describe()

Çıktı:

#Sütunların birbirleri ile korelasyonu
df.corr()

Çıktı:

#Korelasyon görüntülenmesi
plt.xticks(rotation="45")
sns.heatmap(df.corr(),annot=True)

Çıktı:


Model Oluşturma İşlemleri

#x(bağımsız değişkenler) ve y(hedef/tahmin değişkeni) ataması yapılır.
x,y=df.drop("target",axis=1),df[["target"]]

#object değerler olduğu için get_dummies işlemi yapılır
x=pd.get_dummies(x,drop_first=True)

#train ve test verileri ayrılır
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=13)
x_train.shape,x_test.shape,y_train.shape,y_test.shape

Çıktı:

((7164, 145), (1791, 145), (7164, 1), (1791, 1))
#GradientBoostingClassifier ataması yapılır
Gr=GradientBoostingClassifier()

#Model eğitme işlemi
Gr.fit(x_train,y_train)

#x_test verilerini tahminleme işlemi
predict_Gr=Gr.predict(x_test)
confusion_matrix(y_test,predict_Gr)

Çıktı:

array([[1383,   93],
       [ 167,  148]], dtype=int64)
#confusion_matrix değerlerinin grafikselleştirmesi
sns.heatmap(confusion_matrix(y_test,predict_Gr),annot=True,linewidths=2)

Çıktı:

 
#Sınıflandırma raporu
print(classification_report(y_test,predict_Gr))

Çıktı:

              precision    recall  f1-score   support

         0.0       0.89      0.94      0.91      1476
         1.0       0.61      0.47      0.53       315

    accuracy                           0.85      1791
   macro avg       0.75      0.70      0.72      1791
weighted avg       0.84      0.85      0.85      1791

Sınıflandırma raporunda da görüldüğü gibi GradientBoostingClassifier algoritması ile girilen değerlere göre target sütununda bulunan işe başlayıp başlamama durumunu doğru tahmin etme yüzdesi: accuracy değeri göz önüne alınırsa %85 olarak bulundu.

Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.