Beyan: Özellik Mühendisliği

Geleneksel programlamada koda odaklanılır. Makine öğrenimi projelerinde temsilliğe odaklanılır. Yani, geliştiricilerin bir model oluşturma yollarından biri, modelin özelliklerini eklemek ve iyileştirmektir.

Ham Verileri Özelliklerle Eşleme

Şekil 1'in sol tarafında bir giriş veri kaynağından gelen ham veriler gösterilmektedir. Sağ tarafta ise veri kümenizdeki örnekleri içeren kayan nokta değerleri kümesi olan bir özellik vektörü gösterilmektedir. Özellik mühendisliği, ham verilerin bir özellik vektörüne dönüştürülmesi anlamına gelir. Özellik mühendisliği yapmaya epey zaman harcamalısınız.

Özellik değerlerinin model ağırlıklarıyla çarpılması gerektiğinden, birçok makine öğrenimi modeli, özellikleri gerçek numaralı vektörler olarak temsil etmelidir.

Ham veriler, özellik mühendisliği adı verilen bir süreç aracılığıyla bir özellik vektörüyle eşlenir.

Şekil 1. Özellik mühendisliği, ham verileri makine öğrenimi özellikleriyle eşler.

Sayısal değerleri eşleme

Tam sayı ve kayan nokta verileri sayısal bir ağırlıkla çarpılabileceği için özel bir kodlamaya ihtiyaç duymaz. Şekil 2'de önerildiği gibi, işlenmemiş tam sayı değeri 6'nın özellik değeri 6.0'a dönüştürülmesi çok basit bir işlemdir:

Doğrudan ham verilerden kopyalanabilen bir özellik örneği

Şekil 2. Tam sayı değerlerini kayan nokta değerleriyle eşleştirme.

Kategorik değerleri eşleştirme

Kategorik özelliklerde ayrı bir olası değerler grubu bulunur. Örneğin, aşağıdaki seçenekleri içeren street_name adlı bir özellik olabilir:

{'Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue'}

Modeller dizeleri öğrenilen ağırlıklarla çarpamayacağından, dizeleri sayısal değerlere dönüştürmek için özellik mühendisliğini kullanırız.

Bunu, olası değerlerin sözlüğü olarak adlandıracağımız özellik değerlerinden tam sayılara bir eşleme tanımlayarak yapabiliriz. Dünyadaki her sokak veri kümemizde görünmeyeceğinden diğer tüm sokakları OOV (olağanüstü) paketi olarak bilinen, her şeyi kapsayan bir "diğer" kategorisi altında gruplandırabiliriz.

Bu yaklaşımı kullanarak, sokak adlarımızı sayılarla aşağıdaki gibi eşleyebiliriz:

  • Charleston Road'u 0 ile eşleştir
  • North Shoreline Bulvarı'nı 1 ile eşleştirin
  • İstanbul Sabiha Gökçen'in haritalarını göster
  • Rengstorff Bulvarı'nı 3 ile eşleştirin
  • diğer her şeyi (OOV) 4 ile eşle

Bununla birlikte, bu dizin sayılarını doğrudan modelimize dahil edersek sorun yaratabilecek bazı kısıtlamalar getirir:

  • Tüm sokaklar için geçerli olan tek bir ağırlık öğreneceğiz. Örneğin, street_name için 6'lık bir ağırlık öğrenirsek, bu ağırlığı Charleston Road için 0, North Shoreline Boulevard için 1, Shorebird Way için 2 vb. ile çarparız. Özellik olarak street_name kullanarak ev fiyatlarını tahmin eden bir model kullanabilirsiniz. Sokak adına göre fiyat için doğrusal bir düzenleme olması pek olası değildir. Ayrıca bu, sokakları ortalama ev fiyatlarına göre sıraladığınızı varsayar. Modelimiz, diğer özellikler kullanılarak tahmin edilen fiyata eklenecek olan her sokak için farklı ağırlıkları öğrenme esnekliğine ihtiyaç duyar.

  • street_name değerinin birden fazla değer alabileceği durumlar hesaba katılmaz. Örneğin, birçok ev iki sokağın köşesinde bulunur ve tek bir dizin içeriyorsa bu bilgileri street_name değerinde kodlamak mümkün değildir.

Bu kısıtlamaların ikisini de ortadan kaldırmak amacıyla, modelimizdeki her bir kategorik özellik için değerleri aşağıdaki gibi temsil eden bir ikili vektör oluşturabiliriz:

  • Örnekte geçerli olan değerler için karşılık gelen vektör öğelerini 1 değerine ayarlayın.
  • Diğer tüm öğeleri 0 olarak ayarlayın.

Bu vektörün uzunluğu, sözlükteki öğe sayısına eşittir. Bu temsil, tek bir değer 1 olduğunda tek sıcak kodlama ve birden çok değer 1 olduğunda çoklu sıcak kodlama olarak adlandırılır.

Şekil 3'te belirli bir sokağın tek ateşli kodlaması gösterilmektedir: Kıyı Kuşu Yolu. Shorebird Way'in ikili vektöründeki öğe 1 değerine sahipken diğer tüm caddelerin öğeleri 0 değerine sahiptir.

Bir dize değerini eşleme (

3. Şekil. One-hot kodlamasıyla açık adresi eşleştirme.

Bu yaklaşım, her özellik değeri (ör. sokak adı) için etkili bir şekilde bir Boole değişkeni oluşturur. Burada, bir ev Shorebird Way'deyse ikili değer yalnızca Shorebird Way için 1 olur. Bu nedenle, model yalnızca Shorebird Yolu için ağırlığı kullanır.

Benzer şekilde, bir ev iki sokağın köşesindeyse iki ikili değer 1 olarak ayarlanır ve modelde her iki ayrı ağırlık da kullanılır.

Seyrek Beyan

Veri kümenizde street_name değeri olarak dahil etmek istediğiniz 1.000.000 farklı sokak adının olduğunu varsayalım. Açıkça yalnızca 1 veya 2 öğenin doğru olduğu 1.000.000 öğelik bir ikili vektör oluşturmak, bu vektörleri işlerken depolama ve hesaplama süresi açısından çok verimsiz bir gösterimdir. Bu durumda, yalnızca sıfır olmayan değerlerin depolandığı seyrek temsil kullanmak yaygın bir yaklaşımdır. Seyrek temsillerde, yukarıda açıklandığı gibi her özellik değeri için hâlâ bağımsız bir model ağırlığı öğrenilir.