Olivetti Face Dataset

Olivetti Face Dataset’i veri analizinde yaygın bir şekilde kullanılan, 40 farklı insana ait ve her birinin 10 farklı şekilde çekilmiş toplam 400 fotoğraftan oluşmuş bir veri setidir. 1992 – 1994 yılları arasında Cambridge’de çekilmiştir. Işık, yüz ifadeleri ve gözlüklü/gözlüksüz olarak farklı kombinasyonlar kullanılarak çekimler yapılmıştır. Her kişiye ait fotoğraflar 0 ile 39 arasında bir sayı ile numaralandırılmıştır.

Öncelikle dataset’i indirerek başlıyoruz…

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb

from scipy.stats import t
from re import sub
from glob import glob

from sklearn.datasets import fetch_olivetti_faces
from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC, SVC
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

faces = fetch_olivetti_faces()

Train test fornksiyonunu yazıyoruz. Kişi bazlı 10’ar 10’ar veriyi ayırıyoruz.

def olivetti_train_test_split():
test = [i*10 + np.random.randint(10) for i in range(40)]
train = list(set(range(400)).difference(test))
return (faces.data[train,:],faces.data[test,:],faces.target[train],faces.target[test])

Modeli oluşturan ve test eden ve ardından model doğruluğunu döndüren makeModel yazıyoruz. iki parçası vardır:  SVM ve  Lojistik Regresyon.
def makeModel(which='SVM'):
    X_train, X_test, y_train, y_test = olivetti_train_test_split()
    if which == 'LR':
        scaler = StandardScaler().fit(X_train)
        tmp = scaler.transform(X_train)
        X_train = tmp
        tmp = scaler.transform(X_test)
        X_test = tmp
        model = LogisticRegression(max_iter=15,
                                   multi_class='multinomial',
                                   solver='saga',
                                   warm_start=True,
                                   penalty='elasticnet',
                                   l1_ratio=0.3)
    else:
        model = SVC(max_iter=500)
        
    model.fit(X_train,y_train)
    return model.score(X_test,y_test)
MakeModel'i birkaç kez çalıştırıyoruz ve ardından t-testini kullanarak model doğruluğunu tahmin etmemiz gerekiyor. Bu amaçla aşağıdaki fonksiyonu yazıyoruz:
def getConfInterval(experiments, per=0.95):
    m = np.mean(experiments)
    dev = np.std(experiments)

    return t.interval(per, len(experiments)-1, loc=m, scale=dev)

Şimdi doğruluğunu görelim…

experiments = [makeModel() for i in range(10)]

getConfInterval(experiments)

output : (0.90232608242185, 1.01767391757815)

Multinomial Regression için :

experiments = [makeModel('LR') for i in range(5)]

getConfInterval(experiments)

output : (0.9522355489480221, 1.007764451051978)

İki modeli kıyaslarsak :

SVM, %6 hata ile yaklaşık %94 doğruluk sağladı. LR ise %2.5 hata ile %97 doğruluk sağladı. Bunlardan LR'nin bu veri setinde daha iyi performans gösterdiğini söyleyebiliriz.

Yorum bırakın