Makine Öğrenmesi - Sınıflandırma Algoritmaları
Gradient Boosting Classifier
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.