Apache Spark ile Naive Bayes Sınıflandırma
Apache Spark büyük verileri işleme yeteneği ve çeşitli avantajlarla karşımıza çıkan bir Apache projesidir. Apache Spark içerisinde MLlib adında bir de makine öğrenmesi modülü bulunmaktadır. MLlib modülü kendi dahilinde Naive Bayes sınıflandırma algoritmasını da desteklemektedir.
Eğer Naive Bayes nedir diyorsak, “Naïve Bayes Sınıflandırma Algoritması” yazımızı okumanızı öneririm.
Bir önceki yazıda Ç ve J adında 2 kategori barındıran bir tablo üzerinde Naive Bayes sınıflandırması yapmış idik. Şimdi o tabloyu tekrardan hatırlayalım.
Döküman numarası | Öğretilen içerik/cümle | Kategori |
1 | Chinese Beijing Chinese | Ç |
2 | Chinese Chinese Shanghai | Ç |
3 | Chinese Macao | Ç |
4 | Tokyo Japan Chinese | J |
Döküman tablosun yer alan 4 satır cümleyi Naive Bayes algoritmasıyla Apache Spark’ a öğretmek istiyorsak, öncelikle bu tablonun Döküman-Terim matrisini çıkartmak durumundayız. Döküman-Terim matrisinde öncelikli olarak Kategoriler ve Eşsiz kelimeler 0’dan başlayarak artalan biçimde numaralandırılmalıdır.
Örneğin Ç (0) ve J (1) biçiminde Kategoriler numaralandırılırken. eşsiz kelime sayısı ise (6 adet) aşağıdaki gibi numaralandırılmalıdır.
Chinese(0) Japan(1) Tokyo(2) Beijing(3) Shanghai(4) Macao(5)
Sonraki adımda ise artık Döküman-Terim matrisi oluşturulabilir haldedir. Bunun için satır bazında her bir kelimenin tekrar sayısı bir vektör biçiminde yazılmakta ve bu vektörler alt alta eklendiğinde matris ortaya çıkmaktadır. Örneğin 1. satır için oluşturulacak vektör aşağıdaki gibidir.
2 0 0 1 0 0 (Chinese 2 tane, Beijing 1 tane, diğerleri ise 0 tane).
Bu biçimde her bir satır için bir vektör yazılırsa aşağıdaki Döküman-Terim matrisi elde edilmiş olur.
Chinese(0) | Japan(1) | Tokyo(2) | Beijing(3) | Shanghai(4) | Macao(5) | |
Ç(0) | 2 | 0 | 0 | 1 | 0 | 0 |
Ç(0) | 2 | 0 | 0 | 0 | 1 | 0 |
Ç(0) | 1 | 0 | 0 | 0 | 0 | 1 |
J(1) | 1 | 1 | 1 | 0 | 0 | 0 |
Hazırlanan döküman terim matrisinin Apache Spark’a belirli bir formatta sunulması gerekmektedir. Bu formatta kategoriler virgül ile, tekrar sayıları ise boşluklu olarak birbirinden ayrılmaktadır. Format örneği aşağıdaki gibidir.
0,2 0 0 1 0 0 0,2 0 0 0 1 0 0,1 0 0 0 0 1 1,1 1 1 0 0 0
Hazırlanan bu döküman terim matrisini artık MLlib ile öğretim işlemine tabi tutabiliriz. Öncelikli olarak matrisi training.data isimli dosyaya kaydettiğimizi düşünürsek, bu matrisin Spark ile öğretilmesi aşağıdaki gibi olmaktadır.
SparkConf conf = new SparkConf()
.setMaster("local")
.setAppName("Naive Bayes Classifier")
.set("spark.executor.memory", "1g");
JavaSparkContext context = new JavaSparkContext(conf); // (1)
RDD trainData = MLUtils.loadLabeledData(context.sc(), "training.data"); // (2)
NaiveBayesModel trained = NaiveBayes.train(trainData); // (3)
(1) numaralı kısımda bir JavaSparkContext nesnesi üretilmektedir. Bu nesne, konfigürasyon bilgileriyle birlikte bir Spark uygulamasını temsil etmektedir.
(2) numaralı kısımda training.data içerisindeki Döküman-Terim matris verileri LabeledPoint nesneleri olarak Spark ortamına dahil edilmektedir.
(3) numarada ise NaiveBayes#train metodu ile matris verisi Spark uygulamasına öğretilmektedir. Öğretim işlemi sonucunda geriye NaiveBayesModel isimli nesne sunulmaktadır. Bu nesne üzerinden tahminleme yapılabilmektedir. Şimdi ise, NaiveBayesModel nesnesi üzerinden bir cümlenin kategorisini tahmin etme aşamasına gelmiş bulunuyoruz. Örneğin aşağıdaki tabloda yer lan cümlenin kategorisini tahmin etmeye çalışalım.
Test verisi | Chinese Chinese İstanbul Chinese Tokyo Japan | Kategori = ??? |
Öğretilecek verilerde olduğu gibi, test verileri de birer vektör olarak Spark ortamına sunulmalıdır. Bu istikamette, yukarıdaki test verisinin vektör çıktısı aşağıdaki gibi olacaktır.
3 1 1 0 0 0
(3 adet Chinese, 1 adet Japan, 1 adet Tokyo) Bu vektörü Spark ortamında;
Vector testData = Vectors.dense(new double[]{3, 1, 1, 0, 0, 0});
biçiminde yazabiliriz. Sonrasında ise NaiveBayesModel#predict metodu ile test verisinin kategorisini tahminleyebiliriz. Uygulamanın tam kod hali aşağıdaki gibi olmaktadır.
SparkConf conf = new SparkConf()
.setMaster("local")
.setAppName("Naive Bayes Classifier")
.set("spark.executor.memory", "1g");
JavaSparkContext context = new JavaSparkContext(conf); // (1)
RDD trainData = MLUtils.loadLabeledData(context.sc(), "training.data"); // (2)
NaiveBayesModel trained = NaiveBayes.train(trainData); // (3)
Vector testData = Vectors.dense(new double[]{3, 1, 1, 0, 0, 0});
double result = trained.predict(testData);
System.out.println("Result = " + result);
NaiveBayesModel#predict metodu, double türünde bir değer döndürmektedir. Bu değer, tahmin edilen kategorinin numarası olmaktadır. Hatırlarsanız Ç için 0, J için 1 sayısını vermiş idik. Burada result değişkeninde ise Ç için 0.0, J için ise 1.0 double değerleri elde edilecektir.
Şimdi sizler de test ve öğretim verileri üzerinde değişiklikler yaparak, Spark ile içerik sınıflandırması yapabilirsiniz.
Örnek uygulamaya https://github.com/rahmanusta/Spark-Bayes adresinden erişebilirsiniz.
Tekrar görüşmek dileğiyle..
Tag:backend
4 Comments
Merhaba Hocam. Elimde örnek bir log dosyası içeriğinde gelen ip, statu kodu, zaman, istek sayfa gibi kolonlar var. Ben bunu Apache Spark ve Python kullanarak bayes ile hangi özelliğine göre sınıflandırma yapmam gerekir. Yol gösterebilir misiniz ?