iOS Geliştiriciler için Makine Öğrenmesi 3.Bölüm: MLDataTable Nedir, Nasıl Kullanılır?

Özgür Şahin
NSIstanbul
Published in
4 min readJan 9, 2019
https://developer.apple.com/documentation/createml/mldatatable

iOS geliştiricilere makine öğrenmesi araçlarını tanıttığım yazı dizisinin 3. yazısında Apple’ın sunduğu veri okuma ve işleme aracı MLDataTable’ı inceleyeceğiz. Serinin 1.(CreateML ile Yazı Sınıflandırma) ve 2. (CreateML ile Görüntü Sınıflandırma) yazılarında Create ML aracını incelemiştik.

Create ML frameworkü ile birlikte tablo formatında verileri işlemek için
MLDataTable yapısı da tanıtıldı. Create ML içinde hazır olarak gelen makine öğrenme modellerinin (MLTextClassfier, MLRegressor, MLClassifier vb.) çoğu veriyi MLDataTable olarak alıyor bundan dolayı model eğitmek için elimizdeki ham veriyi bu formata çevirmemiz gerekiyor.

MLDataTable kullanarak JSON ve CSV formatındaki veriyi okuyup üzerinde veri üzerinde işlemler yapabiliyoruz. Bu işlemler veri üzerinde makine öğrenmesi modeli eğitmeden önce yapılan veri düzenleme ve temizleme işlemleri (pre-processing). MLDataTable; kolon düzenleme (ekleme, silme, isimlendirme), satır filtreleme, yeni alt tablolar oluşturma, tekrar eden verileri temizleme gibi işlemler için hazır metotlar sunuyor.

Bir örnek üzerinden anlaşılması daha kolay olacaktır. Bu yazı için Bitmoji uygulamasının AppStore yorumlarını çekerek aşağıdaki gibi bir CSV oluşturdum. Veriler üç kolon olarak (yazar adı, puan, yorum) virgülle ayrılmış şekilde tutuluyor.

Yeni bir Xcode Playground açarak örnek bir kullanıma bakalım.

Aşağıdaki gibi MLDataTable’a dosya yolunu vererek verileri okumasını sağlıyoruz.

Bu şekilde okuttuğumuzda bazı satırları okurken sorun yaşayabiliyor. Aşağıdaki görüntü Playground’u çalıştırdığımda verdiği çıktıyı gösteriyor. 16 satırı okuyamamış, bu satırlara baktığımızda bu yazılarda ekstra tırnak işareti kullanıldığını görüyoruz.

Parsing Options

Burada parse işlemine yardımcı olarak bu yanlış okunan satırları en aza indirgeyebiliriz. MLDataTable.ParsingOptions ile verimizdeki özel formatlamaları belirtebiliyoruz. Bu yapı üzerinden veride başlık olup olmadığını (containsHeader), ayraç olarak hangi karakterin kullanıldığı (delimiter), bir sonraki satıra geçişin hangi karakterle yapıldığı (lineTerminator) gibi bilgileri belirterek daha başarılı bir okuma sağlayabiliyoruz.

Yukarıdaki gibi veri içinde satır geçişlerinin \r (carriage return) ile yapıldığını belirterek verilerin daha düzgün okunmasını sağlıyorum, bu şekilde okuttuğumda okuyamadığımız satır sayısı sadece 2'ye düşüyor.

Bu satırların parse edilememe nedeni ise yazı içerisinde virgül kullanılması. Burada virgül aynı zamanda da ayracımız olduğu için kolonların karışmasına neden oluyor. Yazıların içindeki virgülleri önceden temizlememiz gerekiyor.

Playground içerisinde okuduğumuz verinin özetini aşağıdaki gibi gösteriyor.

Eğitim işlemine dahil etmek istemediğimiz kolonları removeColumn metoduyla silebiliyoruz.

Dictonary ile MLDataTable Oluşturma

MLDataTable’ı JSON ve CSV’den oluşturduğumu gibi dictionary ile de oluşturabiliyoruz.

Kolon Ekleme

Yeni bir kolon eklemek istersek addColumn metodu ile aşağıdaki gibi ekliyoruz.

Eğer diğer kolonlardan veri okuyup buna göre kolon eklemek isteseydik bunu nasıl yapardık?

Bu işlemi göstermek için aşağıdaki dataseti kullanacağım. Bu datasette Türkçe sıfatların duygu analizi değerleri var. İki farklı yorumcu duygusal açıdan puanlandırmış(deg1,deg2). Deg3'de ise bu değerlerin ortalamaları yer alıyor.

Sıfatların duygusal değerlemeleri

Veriler -2,+2 aralığında. 0'dan küçük olanları negatif, büyük olanları pozitif, 0 olanları da nötr olarak etiketleyip yeni bir kolonda bunu belirtmek isteseydik aşağıdaki gibi bir işlem yapacaktık.

Oluşan yeni tabloyu aşağıdaki gibi yandaki kutucuğa basarak inceleyebiliyoruz.

Ekstra Metotlar

Tekrar eden verileri temizlemek için dropDuplicates, bir kaç değeri eksik olan satırları temizlemek için ise dropMissing metotları kullanılmaktadır. Ayrıca değeri olmayan hücreleri doldurmak için ise fillMissing metodu kullanılmaktadır.

Veriyi random bir şekilde bölmek için ise randomSplit metodu kullanılır, bu metot 0 ile 1.0 aralığında bir değer alarak bu oranda veriyi böler. Genellikle train ve test veri kümeleri oluşturmak için kullanılır.

Veri üzerindeki ön işlemlerimiz bittikten sonra kullanacağımız modele parametre olarak MLDataTable’ı vererek direkt makine öğrenmesi eğitimini başlatabiliyoruz. Yazı sınıflandırma için kullanılan MLTextClassifier modelini kullanırsak yazı kolonunu ve etiket kolonunu aşağıdaki gibi belirterek modeli eğitebiliyoruz.

Bu yazıda amaç bu veri düzenleme yapısını tanıtmaktı. Model eğitiminde MLDataTable kullanımının detayları için bir önceki yazıya bakabilirsiniz.

Bir sonraki yazıda ise iOS’da doğal dil işlemenin detaylarına bakacağız.

Buraya kadar okuduğunuz için teşekkürler :) Benzer yazılardan haberdar olmak için beni Medium’da ve Twitter’da takip edebilir mail bültenime abone olabilirsiniz.

Bu alandaki yeni yazılarımdan ilk siz haberdar olmak isterseniz aşağıdan mail bültenime kayıt olabilirsiniz. Bu yazı dizisi sonunda Udemy kursu yayınlamayı planlıyorum. Mail grubum bu eğitimden de ilk önce faydalanma fırsatını yakalayacak.

Esenlikle kalın, bol ML’li yıllar :)

--

--

Özgür Şahin
NSIstanbul

Articles about Deep Learning, iOS App Development, Entrepreneurship and Psychology