Machine Learning Uygulaması: Modelin Oluşturulması

Bir önceki yazıda Machine Learning probleminden ve kullanacağımız araçlardan bahsettik. Şimdi ise bu araçları ve veri setimizi kullanarak modelimizi oluşturacağız.

Hazırlık

Apache Spark için cluster kurmayacağımızdan ve sadece bellekte ayağa kaldıracağımızdan yapmamız gereken çok fazla bir şey olmayacak. Sadece Java ile basit bir konsol uygulaması yazacağız. Bu konsol uygulaması aşağıdaki adımları takip edecek:machine-learning-event-copyright-kirillm

  • Bellekte Spark uygulamasını ayaÄŸa kaldır
  • Veri setini Spark’a yükle
  • Veri setini normalizasyon fonksiyonunu kullanarak veriyi istenilen duruma getir
  • Machine Learning algoritmasını kullanarak modeli oluÅŸtur
  • Modeli test seti ile test et ve tutarlılığına bak
  • EÄŸer tutarlılığı istenilen düzeydeyse modeli kaydet

Burada detayına inmediğimiz iki konu var. Birincisi hangi Machine Learning algoritmasının kullanılacağı. İkincisi ise normalizasyon fonksiyonumuzun ne olacağı. Kodumuzu geliştirmeye başlamadan önce bu iki konuya açıklık getirelim.

ML Algoritmasının Seçimi

Çok fazla Machine Learning Algoritmalarının detayına girmeyeceÄŸim. Ama en temelde Machine Learning algoritmaları iki temel gruba ayrılıyor Supervised Learning ve Unsupervised Learning. Unsupervised Learning’te elinizdeki veri seti etiketlenmemiÅŸ oluyor. Algoritmalar bu veri setini sadece gruplara ayırıyor. Sonrasında siz hangi grubun ne olduÄŸuna karar veriyorsunuz. Supervised Learning‘te ise elinizde bir veri seti var ve veri setinde tüm veriler etiketlenmiÅŸ. Siz bu etiketler üzerinden modelinizi oluÅŸturuyorsunuz. Bizim kullanacağımız veri setine bakacak olursanız her bir kalemin hangi sınıfa ait olduÄŸu bilgisi var. Bizde bu sebepten Supervised algoritmalara bakacağız.

Çözmeye çalıştığımız problemimizle ilgili diğer bildiğimiz şey ise sınıflandırmaya çalıştığımız. Bu sebepten Classification algoritmalarına göz atmalıyız. Problemimiz basit bir problem olduğu için, hemen hemen tüm Classification algoritmaları doğru sonuç üretecektir. Ben Apache Spark da desteklediği için Logistic Regression algoritmasını kullanacağım.

Machine Learning algoritmaları hakkında daha detaylı bilgiyi buradan alabilirsiniz. Logistic Regression ile ilgili daha detaylı bilgiye ise buradan ulaşabilirsiniz.

DeÄŸerleri Normalize Etmek

Önceki yazımda 6 farklı etkeni kullanacağımızdan ve bu etkenlerin “ortalamanın üzerinde” (Positive), “ortalamanın altında” (Negative) ve “ortalama” (Average) ÅŸeklinde deÄŸerler aldıklarından bahsetmiÅŸtim. Her ne kadar bazı Regression algoritmaları, normalizasyonu zorunlu kılsa da aslında Logistic Regression için normalizasyon zorunlu deÄŸil. Fakat bizim verimiz matematiksel iÅŸlemlere tabi tutulacak cinsten olmadığı için normalizasyon yapmaya mecbur kalıyoruz.

Verimizin ham hali aşağıdaki gibi

P (Positive), N (Negative)  ve A (Average)  değerlerini normalize etmek için aşağıdaki gibi bir method kullanmayı düşünüyorum.

Neden 1, 0 ve -1 seçtiğimi soracak olursanız, çok teknik ya da detaylı bir cevap vermem güç. Mesela bazı Regression uygulamaları verilerinizin -1 ve 1 (Feature Scaling) aralığında daha iyi sonuç verir. Fakat Logistic Regression için bu geçerli değil. Ama yine de hem aynı notasyonu takip etmek hem de değerlere (Positive, Negative) tam denk geldiğinden 1, 0 ve -1 değerlerini kullandım. Farklı bir değerlerle de benzer sonuçlara alabilirsiniz.

Ek olarak burada tekrar hatırlatmak istiyorum. Bir sonraki yazıda servisimizi yazarken de aynı normalizasyon fonksiyonunu kullanmalıyız.

Son olarak sınıflarımızı inceleyelim. Bildiğiniz üzere iki temel sınıfımız var: İflas eden (Bankruptcy) / iflas etmeyen (Non-Bankruptcy). Bunlar için de sayı atamalıyız. Hangisine neyi atadığınız çok önemli değil. Notasyon genelde sıfırdan başlar ve ardışık devam eder. Bende benzer notasyon kullanıp Bankruptcy için 0 Non-Bankruptcy için 1 atayacağım. Daha sonra uygulamamızı yazıp yeni veriler için modelimizi çalıştırdığımızda, modelimiz bize 0 ya da 1 dönecek. Bu değerleri Bankruptcy ya da Non-Bankruptcy olarak yorumlamak yine bize düşüyor.

Model Üretmek

Öncelikle pom.xml‘inize bağımlılıklarımızı ekleyelim.

pom.xml

Ne yazık ki Spark’ın bağımlılıkları biraz fazla. Bunun temel nedeni, Spark’ın Scala kullanılarak geliÅŸtirilmiÅŸ olması.

Sonrasında önceki yazıda indirdiğiniz arşivden çıkan Qualitative_Bankruptcy.data.txt isimli dosyayı src/main/resources dizinine kopyalıyorsunuz. Ardından QualitativeBankruptcyModelGenerator isimli java sınıfını yaratıp içeriğini aşağıdaki gibi yapıyoruz.

QualitativeBankruptcyModelGenerator.java

Yukarıdaki sınıfı çalıştırdığımızda modelimizin target/model/Qualitative_Bankruptcy_Model altında yaratılmış olduğunu göreceksiniz. Bir sonraki yazıda bu dizine ihtiyacımız olacak.

Kısaca yukarıda yapılan işlemlerden de bahsetmek istiyorum.

  • SparkConf ile Spark ayarlarımızı yapıyoruz. Burada dikkat etmenizi istediÄŸim nokta setMaster kısmı. EÄŸer Cluster’ımız olsaydı ve biz sorgumuzu cluster’a göndermek isteseydik burada Master’ın adresini verecektik. Yok eÄŸer Cluster’ımıza Jar olarak yüklemek isteseydik, setMaster komutuna gerek kalmayacaktı.
  • SparkContext ve JavaSparkContext: Spark Context dilden bağımsız Spark ile ilgil iÅŸlemleri yapmanıza olanak saÄŸlıyor. Ama Java tabanlı iÅŸlemler yapacaksanız JavaSparkContext’e ihtiyacınız var.
  • RDD (Resilient Distributed Dataset), Spark’ın temel nesnesi gibi düşünebilirsiniz. Spark bu nesneler üzerinden veri setinizi cluster’ı üzerinde dağıtıyor.
  • Verimizin %40’nı test seti olarak kullanıyoruz. Hangi kısmın test seti olarak kullanılacağı rastgele seçiliyor.
  • Hangi algoritmayı kullandığımızla veri tamamen ayrıştırılmış durumda. Bu sebepten farklı algoritmaları da rahatlıkla deneyebilirsiniz.
  • Biz Logistic Regression yapacağımız için LogisticRegressionModel modelini kullanıyoruz. Dikkat ettiyseniz modelimizi oluÅŸturacak algoritmayı seçerken, sonuç kümemizde kaç farklı sınıf olacağını da belirtiyoruz.
  • Kodu çalıştırdığınız tutarlılığı (Accuracy) da ekrana basıyor. Tutarlılık bende 0.9574468085106383 çıktı. Kötü bir tutarlılık deÄŸil. Fakat çok iyi olduÄŸu da söylenemez ama kabul edilebilir.

Son

Artık modelimizi nasıl oluşturacağımızı da biliyoruz. Bir sonraki yazıda modelimizi servislerden aldığımız yeni verilerle nasıl kullanacağımıza bakacağız.