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.