Anasayfa / Büyük Veri / Apache Spark 2.3.0 OneHotEncoderEstimator: Scala Örnek Uygulaması

Apache Spark 2.3.0 OneHotEncoderEstimator: Scala Örnek Uygulaması

Apache Spark 2X’e geçtikten sonra dördüncü sürümünü genel kullanıma sundu. Son sürüm 2.3.0. Bu sürümle birlikte gelen bir çok yenilik arasında MLlib kütüphanesindeki OneHotEncoderEstimator da yer alıyor. Bu sınıf, makine öğrenmesinde veri hazırlığı aşamasında kategorik niteliklerin vektör haline getirilmesine katkıda bulunuyor. Eskisinden farkı; sınıf Transformer‘dan Estimator‘a dönmüş. Anlaşılabilecek değişiklik; eski sürümde nitelikleri tek tek girdi olarak vermek zorunluluğu vardı. Şimdi ise array halinde topluca verebiliyoruz. Ben StringIndexer‘a bağımlılıktan kurtulmuştur diye sevinmiştim ancak nitelikler nümerik değil ise bunu StringIndexer ile nümerik hale getirmek gerekiyor.
Bu yazımızda bu sınıfın (OneHotEncoderEstimator) kullanımı ile ilgili çok basit bir örnek yapacağız. Belki başka kullanım yöntemleri de vardır ancak çalışan ve bildiğin yöntem, daha iyi de olsa bilmediğin yöntemlerden iyidir. Daha iyi ve kolay yöntemleri yorum satırlarında sizlerden bekleriz 🙂
Örneğimiz kendi oluşturduğumuz iki sütunlu bir dataframe üzerinde olacak. Örneğimiz; dataframe oluşturmadan, analize girecek niteliklerin vektör haline getirilmesine kadar olan aşamayı kapsıyor.
Kullandığım araçlar: Apache Zeppelin, Scala, Spark 2.3.0 MLlib kütüphaneleri, Spark 2.3.0

1. Önce kütüphaneleri indirelim:

2. Dataframe oluştur:

Yukarıda gördüğümüz gibi iki sütun var, ikisi de kategorik.
Veri setimizin başlangıç dataframe görünümü:

3. Şimdi bu kategorik nitelikleri rakamlara çevirelim. Niye çeviriyoruz? Çünkü OneHotEncoderEstimator girdi olarak nümerik değerler istiyor. Bu dönüştürme (transformation) işlemini StringIndexer sınıfı ile yapacağız. Peki, bu sınıf ne iş yapıyor? Kategorik sütundaki her bir kategorik sınıfın tekrarlanma sayısını hesaplıyor. En çok tekrarlanandan en az tekrarlanana doğru sıralayıp her bir tekil sınıfa 0’dan başlayan bir rakam atıyor.

Yukarıdaki fonksiyon, girdi olarak sütun isimlerimizi alıyor. Çıktı olarak ise bir StringIndexer nesnesine sahip Pipeline nesnesi ve sütun ismine _indexed eklenmiş bir string döndürüyor. Bu çıktılar OneHotEncoderEstimator için kullanılacak.
Bu aşamadan sonra dataframe’in alacağı hal aşağıdaki resimde görülüyor. Ben burada dataframe’in en son aşamada alacağı haline ait ekran görüntüsünü kesip koyuyorum. Pipeline kullandığımız için tüm fit() metodları ardısıra çalışıyor. O yüzden şuan göremezsiniz.


Yukarıdaki fonksiyonu her bir sütun için çalıştıralım ve sonuçları değişkenlerde tutalım:

4. Şimdi yazımıza konu olan sınıftan bir nesne oluşturalım. Nesneyi oluştururken setInputCols ve setOutputCols metodları ile sınıfın niteliklerine sınıf yaratılırken değer atayalım (burası biraz Nesneye Yönelik Programlama bilgisi içeriyor).

Girdinin Array[String] ve elemanlarının da StringIndexer tarafından üretilen sütun isimleri olduğuna dikkat edelim.
Bu aşamadan sonra dataframe:

5. Şimdi analize girecek sütunları vektör haline (tüm sütunları tek sütunda rakamlar haline getirme) getirmeye geldik. Burada da OneHotEncoderEstimator tarafından üretilen sütun isimlerini array içinde veriyoruz. Bunun için OneHotEncoderEstimator sınıfının bir metodunu kullanıyoruz: getOutputCols. Bu metod aslında sınıfın özelliği olan outputCols içinde saklanan sütun isimlerini getirip bize array içinde sunuyor. Çıktımız ise analize girecek olan featureVector

6. Yukarıda ürettiklerimizi bir tren katarı gibi pipeline içinde ardısıra dizelim:

Tren katarı içinde estimator olanların fit() metodunu çalıştırtalım.

Dönen sonucu (PipelineModel) transform edelim ve dataframe’in son halini görelim:

Github’da maven projesi olarak hazırlanmış kodlar buradadır.

Apache Zeppelin için kodlarımızın hepsi toplu halde aşağıdadır:

Başka bir yazıda görüşmek dileğiyle, hoşçakalın…

Hakkında Erkan ŞİRİN

GÖZ ATMAK İSTEYEBİLİRSİNİZ

R ile Tek Yönlü Varyans Analizi

  One Way ANalysis Of VAriance, Türkçe söylemek gerekirse Tek Yönlü Varyans Çözümlemesi ya da …

3 yorumlar

  1. Merhaba,
    Bu kodu Windows için hangi IDE de yazdınız?

    • Merhaba Kadriye Hanım,
      Windows ortamında değil, CentOS7 üzerinde çalışan Hadoop Cluster üzerindeki Apache Zeppelin ve Spark2 interpreter ile yazdım. Ancak Windows üzerine kurulu bir Spark üzerinde spark-shell ile de aynı kodlar çalıştırılabilir.

  2. Teşekkürler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir