Makine Öğrenmesi - Sınıflandırma Algoritmaları
Sınıflandırma Algoritmalarını Birlikte Kullanma
Sınıflandırma algoritmaları olarak;
- GaussianNB
- MultinomialNB
- ComplementNB
- BernoulliNB
- CategoricalNB
- KNeighborsClassifier
- LogisticRegression
- DecisionTreeClassifier
- ExtraTreeClassifier
- RandomForestClassifier
- SVC
- MLPClassifier
- GradientBoostingClassifier
- XGBClassifier
- LGBMClassifier
olmak üzere 15 farklı sınıflandırma algortiması incelenmiş oldu.
Yukarda sayılan sınıflandırma algoritmalarına aynı veri seti üzerinde tahmin işlemi yapıldığında Accuracy score, Precision score, Recall score, F-1 score değerlerinde farklılıklar olacaktır. İlgili değerlerinin hangi sınıflandırma modelinde daha iyi sonuç verdiğini tek bir tabloda görebilmek için aşağıdaki fonksiyonu kullanabilir
def classification(dataset,columnName):
#İlgili kütüphaneler eklendi
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings #uyarı çıktılarını gösterme
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.naive_bayes import GaussianNB,MultinomialNB,ComplementNB,BernoulliNB,CategoricalNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier,ExtraTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import GradientBoostingClassifier
from xgboost import XGBClassifier #yüklemek için: pip install xgboost
from lightgbm import LGBMClassifier #yüklemek için: pip install lightgbm
#Sınıflandırma modelleri değişkenlere eşitlendi
GNB=GaussianNB()
MNB=MultinomialNB()
CNB=ComplementNB()
BNB=BernoulliNB()
#DNB=CategoricalNB() #bilinmeyen test verilerinde hata verdiği için kaldırıldı.
KNN=KNeighborsClassifier()
LR=LogisticRegression()
DTC=DecisionTreeClassifier()
ETC=ExtraTreeClassifier()
RFC=RandomForestClassifier()
svc=SVC()
MLP=MLPClassifier()
GBC=GradientBoostingClassifier()
XGB=XGBClassifier(eval_metric='mlogloss')
LGBM=LGBMClassifier()
#modelleri ve isimlerini bir liste halinde tutalım
modelList=[GNB,MNB,CNB,BNB,KNN,LR,DTC,ETC,RFC,svc,MLP,GBC,XGB,LGBM]
modelNames=["GaussianNB", "MultinomialNB", "ComplementNB", "BernoulliNB", "KNeighborsClassifier",
"LogisticRegression", "DecisionTreeClassifier", "ExtraTreeClassifier", "RandomForestClassifier",
"SVC","MLPClassifier", "GradientBoostingClassifier", "XGBClassifier", "LGBMClassifier"]
#x ve y değerlerine atama yapıldı
dataset=dataset.dropna(axis=0) #veri setinde boş değişken değeri varsa o satırı kaldıralım.
x,y=dataset.drop(columnName,axis=1),dataset[[columnName]]
#x değerlerine get_dummies modülü uygulandı
x=pd.get_dummies(x,drop_first=True)
#x ve y değerlerine train_test_split modülü uygulandı
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.2,random_state=13)
#Model eğitme ve tahminleme işlemleri
# Accuracy score, Precision score, Recall score, F-1 score için boş bir liste oluşturalım
AScore=[]
PScore=[]
RScore=[]
F1Score=[]
for model in modelList:
#modeli eğitildi
model.fit(x_train,y_train)
#x_test tahmin edildi
predictModel=model.predict(x_test)
# Accuracy score, Precision score, Recall score, F-1 score listelerine çıkan bu sonuçları eklendi
try: #Precision score, Recall score, F-1 score average değerleri varsayılan olarak binary(ikili) sistem
AScore.append(accuracy_score(y_test,predictModel))
PScore.append(precision_score(y_test,predictModel))
RScore.append(recall_score(y_test,predictModel))
F1Score.append(f1_score(y_test,predictModel))
except:#Eğer hedef sütunu binary değilse Precision score, Recall score, F-1 score average değerlerini micro seç.
PScore.append(precision_score(y_test,predictModel,average="micro"))
RScore.append(recall_score(y_test,predictModel,average="micro"))
F1Score.append(f1_score(y_test,predictModel,average="micro"))
#Şuan elimizde 14'er tane elemanı bulunan Accuracy score, Precision score, Recall score, F-1 score listesi bulunmakta.
#Bu listeleri bir tablo halinde dışarıya aktaralım.
datas={"Accuracy score":AScore,"Precision score":PScore,"Recall score":RScore,"F-1 score":F1Score}
result=pd.DataFrame(data=datas,index=modelNames)
#Sonuçlar "Accuracy score" değerine göre sıralansın
return result.sort_values("F-1 score",ascending=False)
Yukarıda bulunan "classification" isimli yazmış olduğumuz fonksiyona veri setini ve sınıflandırma yapmak istediğimiz değişken ismini verdiğimizde bize 14 tane regresyon modelinde tahminleme yaprak sonucu döndürecektir. Bunu test etmek için bir kaç tane veri setini kullanalım. Ama dikkat edilmesi gereken konu veri seti fonksiyona verilmeden önce EDA işlemleri yapılarak temizlenmelidir, deneme amaçlı temiz veri setleri verelim.
import pandas as pd
import numpy as np
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
Örnek-1:
#iris veri seti
#"species" sütununda sınıflandırma işlemleri yapalım
dfIris=sns.load_dataset("iris")
dfIris.head()
Çıktı:
classification(dfIris,"species")
Çıktı:
Örnek-2:
#titanic veri seti
#"survived" sütununda sınıflandırma işlemleri yapalım
dfTitanic=sns.load_dataset("titanic")
dfTitanic.sample(2)
Çıktı:
# Veri seti temizleme
#age sütununda 177 tane boş alan olduğundan, ortalama değer ile boş alanları dolduralım.
dfTitanic.age.fillna(dfTitanic.groupby("sex")["age"].transform("mean"),inplace=True)
#embarked gemiye binilen yerin kısaltması 2 tane eksik alan olduğundan onlar en çok olan değerle doldurulabilir.
dfTitanic.embarked.fillna(dfTitanic.embarked.mode()[0],inplace=True)
#class ve pclass değerleri birbirleri ile aynı olduğundan class sütununu silelim
del dfTitanic["class"]
#deck(güverte) alanında da 688 boş alan var,203 alan doludur.
#Önem derecesine bağlı olarak silinebilir veya en çok değerle doldurulabilir.
#Değerinin fazla olmadığını düşünerek ilgili sütunu silelim.
del dfTitanic["deck"]
#alive değerleri surivived tahmin sütununun tekrarı olduğundan silinebilir.
del dfTitanic["alive"]
#alone değerleri 0 ve 1 olarak değiştirilebilir.
dfTitanic.alone=dfTitanic.alone.map(lambda x:1 if x==True else 0)
#embarked sütunu ile embark_town sütun değerlerinin kısaltması olduğundan embark_town kaldırılabilir
del dfTitanic["embark_town"]
classification(dfTitanic,"survived")
Çıktı:
Örnek-3:
#heart veri seti
#"target" sütununda sınıflandırma işlemleri yapalım
dfHeart=pd.read_csv("heart.csv")
dfHeart.sample(2)
Çıktı:
classification(dfHeart,"target")
Çıktı: