Machine Learning Uygulaması: Giriş

Geçtiğimiz aylarda, takımdan bir arkadaşın ayrılması sonucunda, bir Machine Learning projesini kucağımda buldum. Sorun şu ki ben üniversitede yazılım dilleri ve DSL geliştirilmesi üzerine çalıştım ve hemen hemen hiç Machine Learning dersi almadım.

Tabi bu durum bana engel olmak yerine beni daha da heveslendirdi ve bir hevesle öğrenmeye başladım. Öğrendikçe de çok zevkli bir alan olduğunu gördüm.Her ne kadar bu tip işler için Amazon’un kendi kütüphaneleri olsa da, bir çok açık kaynak kütüphane ile de kolaylıkla Machine Learning uygulamaları gerçekleyebilirsiniz. Bende bu yazı dizisinde basit bir Machine Learning uygulamasını Apache Spark ve Spring kullanarak nasıl gerçeklenebileceğini anlatmaya çalışacağım.
Öncelikle bu yazı dizisinde neler olacağına bakalım:

  • Giriş: (bu yazı) Bu bölümde, kısaca Machine Learning terimlerinden ve elimizdeki problemden bahsedeceğim. Ama belirteyim amacım Machine Learning’in ne olduğunu anlatmaya çalışmak değil. Bunun için online çok güzel dersler ve kaynaklar mevcut.
  • Modelin Geliştirilmesi: Elimizdeki veri setini ve Apache Spark kullanarak modelimizi nasıl üretebileceğimize bakacağız.
  • REST servisler üzerinden yeni tahminlerin yapılması: Son olarak Spring MVC ile web servisimizi geliştireceğiz. Web servisimiz önceki yazıda hazırladığımız modeli kullanarak, yeni veriler üzerinden kararlar verecek. Zaten Machine Learning ile akademik olarak ilgilenmiyorsanız, yarattığınız modelinizin servis olarak erişilebilir olması lazım. Örneğin spam olarak sınıflandırabilen model mi geliştirdiniz, eğer yeni gelen mailleri bu modeli kullanarak sınıflandıramıyorsanız yarattığınız model çok bir işe yaramayacaktır.

Machine Learning

Machine Learning alıştığımız, klasik programlama mantığından farklı çalışıyor. Klasik programlamada, bir uygulama geliştirirsiniz, daha sonra geliştirdiğiniz uygulamaya değerleri gönderip, çıktılar alırsınız. Machine Learning’te ise bir uygulama geliştirirsiniz, uygulamaya hangi girdiler için hangi çıktıları almayı beklediğinizi söylersiniz, uygulama da size sonuç olarak bir model geliştirir. Daha sonra bu modeli klasik uygulamalarınıza dahil ederek akıllı uygulamalar geliştirebilirsiniz.machine-learning-event-copyright-kirillm

Machine Learning uygulamanızı geliştirken kullandığınız veri kümesinden yazı boyunca veri seti (training set) diye bahsedeceğim. Bu veri setinin bir kısmı modelinizi geliştirmekte kullanılırken bir kısmı da modelinizi test etmede kullanıyorsunuz. Test seti sayesinde oluşturduğunuz modelin ne kadar tutarlı olduğunu ölçebilirsiniz. Yani oluşturduğunuz model test seti ile çalıştırıp sonuçları karşılaştırıyoruz. Böylelikle modelimizin tutarlılığını buluyoruz. Tahmin edeceğiniz üzere veri setinizin büyüklüğü, tutarlılığınızın doğruluğunu, tutarlılığınızı ise veri setinizin kalitesi etkilemektedir.

Şöyle anlatmaya çalışayım, diyelim ki maillerinizi spam ya da spam değil olarak sınıflandırmaya çalışıyorsunuz. Elinizdeki veri setinde dört farklı veri olsun. Gönderen kişinin email adresi, mail başlığı, maildeki kelime sayısı ve sınıfı (spam ya da spam değil). Gönderen kişinin email adresi ve mail başlığı büyük ihtimalle sınıfını etkiliyordur. Peki ya maildeki kelime sayısı? Etkilediğini hiç düşünmüyorum. Eğer kelime sayısını modelinize katarsanız büyük ihtimal tutarlılığınız düşecektir. (Fakat kelime sayısını katsanız bile küçük veri setlerinde yüksek tutarlılıklar alabilirsiniz.) Bu sebepten modelinizin özelliklerini (features) seçerken dikkat etmelisiniz.

Kısaca temel bilgilere değindiğimize göre şimdi problem tanımına geçebiliriz.

Problem Tanımı

Problemi olabildiğince basit seçmeye çalıştım ki problem detaylarında boğulmayalım. Problemi kısaca “Farklı etkene bakarak bir şirketin batmaya meyilli olup olmadığını  anlamak” olarak belirleyebiliriz. Bunun için yazılımcı olarak oturup kendimiz araştırma yapmak yerine, 2014 te yapılmış araştırmanın sonuçlarını kullanacağız. Sonuçları bu adresten indirebilirsiniz. Böyle problem tanımlarından sonra veri genelde yazılımcıya sağlanacaktır. Hatta Machine Learning üzerinde uzmanlaşmış şirketlerde model bile yazılımcıya hazır olarak gelebiliyor.

Eğer Amazon’da nasıl yapıldığını soracak olursanız, benim çalıştığım projede biraz daha farklı bir durum söz konusu. Perakende ürün verileri bizde olduğundan veritabanından bu verileri biz çekiyoruz. Daha sonra bu verilerin etiketlenmesi / sınıflandırılması için iş birimine gönderiyoruz. Etiketleme bittikten sonra, bu verilere bakarak, hangi özelliklerin (features) etkili olabileceğine karar verip modelimizi geliştiriyoruz. Son olarak servis üzerinden modelimizi yeni veriler için tekrar tekrar kullanıyoruz.

Neyse konumuza dönecek olursak, indirdiğimiz veri seti 6 temel özelliğe göre sınıflandırılmış:

  • Endüstriyel Risk Seviyesi
  • Yönetimsel Risk Seviyesi
  • Finansal Esnekliği
  • Piyasadaki Güvenilirliği
  • Rekabet
  • Operasyonel Risk Seviyesi

Daha sonra bu etkenler için 250 farklı şirket incelenmiş ve her bir şirketi iflas eder (Bankruptcy) / iflas etmez (Non-Bankruptcy) diye etiketlemişler.

Burada diğer değinmek istediğim nokta bu 6 etkenin değerleri. Eğer veriyi indirip incelediyseniz her bir değerin ortalamanın üzerinde (Positive), ortalamanın altında (Negative) ve ortalama (Average) şeklinde değerler aldıklarını göreceksiniz. Ne yazıkki bu değerleri doğrudan kullanmamız mümkün değil. Bu değerleri kullanabilmemiz için bu değerleri normalize etmeniz gerekiyor. Her ne kadar nasıl normalize edeceğimiz, kullanacağımız algoritmaya göre değişse de sadece bir tane nomalizasyon fonksiyonunu kullanmamız gerekiyor. Yani modelimizi eğitirken kullandığımız normalizasyon fonksiyonu ile, bu altı etkeni web servis üzerinden alıp modelimize göndermeden önce kullanacağımız normalizasyon fonksiyonunun aynı olması gerekiyor. Bu konuya modelimizi eğitirken ve servislerimizi geliştirirken tekrar değineceğim.

Kullanacağımız Teknolojiler

Giriş kısmını bitirmeden önce, son olarak kullanacağımız teknolojilere değinmek istiyorum.

Apache Spark  büyük veri işleme amaçlı bir proje. Hadoop’un rakibi olarak düşünebilirsiniz, Hadoop’tan 100 kat daha hızlı olduğunu iddia ediyor. Scala dili ile geliştirilmiş, zaten java kullanarak Spark uygulaması geliştirmeye kalktığınızda bir çok Scala bağımlılığı ile birlikte geldiğini görüyorsunuz. Spark’ın en güzel özelliklerinden biri dağıtık olması ve gönderdiğiniz işleri dağıtık olarak çalıştırması. Yer yer bu programlama da karmaşıklığa yol açsa da güzel bir özellik diye düşünüyorum. Örneğin şirketinizde kuvvetli makinelerle Spark cluster’ı kurabilir ve modellerinizi bu cluster üzerinde çalıştırabilirsiniz ya da AWS servislerinden Elastic Map Reduce servisini kullanarak hızlıca kendi cluster’ınızı kurabilirsiniz. Bir diğer seçenek de, diğer bir AWS servisi olan EC2 yu kullanarak Spark cluster’ı kurabilirsiniz. Zaten Spark kendi sitesinde hızlıca EC2 cluster’ı kurabileceğiniz scriptleri de paylaşıyor. AWS kullandığınız taktirde ucuza veri saklamak için S3’yi kullanabilirsiniz. Spark S3 ve diğer dağıtık dosya sistemlerini doğrudan desteklediğinden, dosyalarınıza ulaşırken tek yapmanız gereken S3 linklerini kullanmak oluyor.

Biz basit olması açısından, cluster kurulumu yapmayacağız. Spark’ı basitçe bellekte ayağa kaldıracağız ama işleyeceğiniz veri büyükse mutlaka cluster kurulumunu düşünmelisiniz.  Yine basit olması açısından biz veri setimizi projenin içerisinde yükleyeceğiz ve modelimizi elle dağıtacağız. (S3  ya da başka dağıtık dosya sistemi kullandığınızda modelinizi dağıtmakla uğraşmıyorsunuz.)

Tabi veri işleme haricinde Spark’ın başka özellikleri de var :

  • Spark Streaming: Gerçek zamanlı veri işleminize olanak sağlayan bir alt proje. (Daha detaylı bilgi için bu blog yazısından faydalanabilirsiniz)
  • Spark SQL: RDB (Relational Database) olmayan bir veri kaynağında (örneğin S3’teki bir dosya) SQL komutu ile sorgu yapabilmenize olanak sağlıyor.
  • Spark GraphX: Spark cluster’ınızı kullanarak grafik oluşturmanıza yarayan bir kütüphane. Grafik çizmek basit bir problem gibi gözükse de büyük verilerle çalıştığınızı düşündüğünüzde zor bir problem halini alıyor. Ayrıca eğer Machine Learning üzerine çalışıyorsanız verinizi görselleştirmek, problemi anlamanıza yardımcı olabiliyor.
  • Spark MLlib: Spark’ın Machine Learning kütüphanesi, yani bizim kullanacağımız kütüphane. Java için farklı bir çok kütüphane olsa da bunların çok azı hem dağıtık veri işleme yapıp hem da çok sayıda Machine Learning algoritması destekliyorlar. Spark MLlib Classification, Regression, Decision Trees, Random Forest, Reccomendation ve daha bir çok farklı algoritmayı destekliyor.

Son

Artık problemin ne olduğunu ve kullanacağımız teknolojileri biliyoruz. Bir sonraki yazıda bu veri setini kullanarak, Apache Spark yardımıyla, modelimizi nasıl geliştireceğimize bakacağız. Daha sonra bu modelimizi kullanarak yeni şirketlerin iflas etmeye meyilli olup olmadığına karar verecek bir uygulama geliştireceğiz.

  • Ugur Uker

    Konu içeriği ve sadelik açısından başarılı bir yazı olmuş, eline sağlık. Ancak, Spark ile alakalı ufak bir ekleme de ben yapayım. Spark, paralel işleme kolaylığı sağlamak açısından geliştirilmiş bir framework olup aslen Hadoop kurulumu ile default olarak gelen MapReduce frameworkünün rakibi olmuş ve hatta neredeyse kullanımını yok denecek seviyelere indirmiştir. Hadoop’un MapReduce’ unun dosya okuma-yazma yaparak verileri işlemesinin aksine Spark’ın bu işlemleri in-memory yapmasından dolayı MapReduce frameworkünden 100 kat daha hızlı mapping ve reducing işlemi yaptığı kanıtlanmıştır.