# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python [conda root]
#     language: python
#     name: conda-root-py
# ---

# # MNIST Veri Seti ile Rakam Tanıma
#
# https://www.kaggle.com/c/digit-recognizer/
#
# MNIST veri seti $28\times 28$ pikselden oluşan elle yazılmış rakamlar içeren bir veri seti. Veri seti 32000 eğitim ve 10000 test rakamı içeriyor.
#
# Normalde çok sınıflı bir sınıflandırma problemi olan rakam tanıma problemini güdümsüz öğrenme yöntemiyle ele alacağız. 
#
# Şimdi paketleri yükleyerek örnek bir dosya okutalım.

# +
# %matplotlib inline
import pandas as pd
import numpy as np
import time as time
from skimage.io import imread, imshow, show, imsave
import matplotlib.pyplot as plt


train_size = 32000
test_size = 10000
picture_size = 28

image = imread('train/0.png', as_grey = True)
imshow(image)
show()

print(image)
# -

# 'Train' ve 'Test' klasörlerindeki veriyi okuyarak başlayalım.

# +
df_train = np.zeros((train_size, picture_size*picture_size))
   
for i in range(train_size):
    img = imread('train/' + str(i) + '.png', as_grey=True)
    img = np.reshape(img, (1,picture_size*picture_size))
    df_train[i,:]=img/255
    
df_train=pd.DataFrame(df_train)
df_train.columns = ['pixel_' + str(i) for i in range(picture_size*picture_size)]

y_train = pd.read_csv('train/labels_train.csv')


df_test = np.zeros((test_size, picture_size*picture_size))  

for i in range(train_size, train_size+test_size):
    img = imread('test/' + str(i) + '.png', as_grey=True)
    img = np.reshape(img, (1,picture_size*picture_size))
    df_test[i-train_size,:]=img/255
    
df_test=pd.DataFrame(df_test)
df_test.columns = ['pixel_' + str(i) for i in range(picture_size*picture_size)]

y_test = pd.read_csv('test/labels_test.csv')

print(len(df_train))
print(len(y_train))
print(len(df_test))
print(len(y_test))

print(df_train.iloc[1,:])
# -

# Veri setini okuttuktan sonra güdümsüz öğrenme yöntemlerinden Mixture Model yöntemini kullanacağız. MM yöntemi soft-clustering imkanı tanıyan bir yöntem. Bir gözlem bir kümeye ait/ait değil bilgisinin yanında o kümeye ait olma olasılığını da elde etmek mümkün. Bu yöntemde bileşenler (component) profillere denk geliyor. Bu örnekte de bileşenler rakamların silhueti şeklinde olacak. 50 bileşenle modeli eğitelim. 

# +
from sklearn.mixture import GMM

gmm = GMM(n_components = 50)

gmm.fit(df_train)

# +
means = gmm.means_

for i in range(len(means)):
    component = means[i,:]
    component = np.reshape(component,(picture_size,picture_size))
    imshow(component)
    plt.title("Component " + str(i))
    show()
# -

# Gördüğümüz gibi bileşenler rakamlara oldukça benziyor. Şimdi bu olasılıklardan yeni bir veri çerçevesi oluşturalım.

# +
probabilities = pd.DataFrame(gmm.predict_proba(df_train))

print(probabilities.head())
# -

# Bu olasılıkları Gradient Boosting yöntemine girdi olarak vererek güdümlü öğrenmede kullanabiliriz.

# +
from sklearn.ensemble import GradientBoostingClassifier

gbc = GradientBoostingClassifier()

gbc.fit(probabilities,y_train)

y_pred = gbc.predict(gmm.predict_proba(df_test))

from sklearn.metrics import confusion_matrix, accuracy_score

print('Accuracy score of GBC: ' + str(accuracy_score(y_test,y_pred)))


df_results = pd.DataFrame(confusion_matrix(y_test, y_pred))

df_results.index = [['Label_' + str(i) for i in range(10)]]
df_results.columns = [['Pre_' + str(i) for i in range(10)]]

print('Confusion matrix for GBC: ')
print(df_results)

StarcoderdataJupyterScriptsDedupFiltered