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.
Ş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:
Ş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 olarakstreet_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 bilgileristreet_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.
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.