Makine öğrenmesi için veri hazırlama

Tamamlandı

Makine öğrenmesi modeli oluşturabilmeniz için önce eğitmek ve değerlendirmek için kullanacağınız verileri hazırlamanız gerekir. Veriler, genellikle veri dosyaları biçiminde, kaynağından Azure Databricks ortamına aktarılır. İsteğe bağlı olarak, veri araştırma ve analizini basitleştirmek için veri dosyalarını temel alan delta tabloları oluşturabilirsiniz. Veriler alındıktan sonra, bir veri bilimcisi bunu makine öğrenmesi için hazırlar.

Genellikle, verilerin hazırlanması iki temel görevi içerir:

  • Veri temizleme: Verilerdeki makine öğrenmesi için yararlılığını etkileyecek sorunları belirleme ve azaltma.
  • Özellik mühendisliği ve ön işleme: Model eğitimi için uygun özellikleri seçme ve dönüştürme.

Veri temizleme

Verileri temizlemek için gereken belirli adımlar projeden projeye değişir, ancak çözmeniz gereken tipik sorunlar şunlardır:

  • Eksik veriler: Veriler genellikle tek tek alanların eksik olduğu kayıtları içerir (genellikle NULL değerlerin varlığıyla gösterilir). Eksik değerleri tanımlamanız ve şu şekilde azaltmanız gerekir:
    • Bunları uygun bir değiştirmeyle değiştirme - serideki bir değeri ilişkilendirmek, ortalama (veya ortanca) değer kullanmak veya başka bir uygun değer oluşturmak.
    • Tamamlanmamış satırları tamamen kaldırma (bunun modelleme için yeterli temsili veri bıraktığı varsayılarak)
  • Hatalar: Verilerin, veri girişi hataları veya yukarı akış veri işlemede başarısız olması nedeniyle oluşan hataları içermesi sık karşılaşılan bir durum değildir. Hataları bulmak zor olabilir ve genellikle verileri özetlemek ve belirli bir alanda diğer değerlerle uyum sağlamayan değerleri bulmak için sorgular ve görselleştirmeler kullanılarak verilerin dikkatle incelenmesini gerektirir.
  • Aykırı Değerler: Aykırı değerler, verilerin istatistiksel dağılımının önemli ölçüde dışında (yukarıda veya aşağıda) olan değerlerdir. Aykırı değerler bazen bir hatanın göstergesidir (örneğin, bir kişi fazladan sıfır içeren bir değere sahip olabilir veya ondalık noktası atlanabilir) ve bazen çoğu gözleme kıyasla olağan dışı yüksek veya düşük gerçek değerlerdir. Her iki durumda da aşırı aykırı değerler makine öğrenmesi modelinin eğitimini olumsuz etkileyebilir; bu nedenle genellikle bunları bir üst veya daha düşük eşik değerine sıfırlayarak veya veri kümesinden aykırı değerler içeren kayıtları kaldırarak işlemek en iyisidir.
  • Yanlış veri türleri: Makine öğrenmesi algoritmaları özellik değerlerine atanan veri türlerine duyarlı olabilir. Hata veya null değerler içeren metin dosyalarına dayalı veri kümelerinde sayısal alanlar genellikle yanlışlıkla dize veri türüne dönüştürülür ve çoğu zaman ayrık tamsayı değerlerini temsil eden değerler yanlışlıkla ondalık sayılara (veya bunun tersi) dönüştürülebilir. Verilerinizin şemasını incelemeniz ve veri değerlerini en etkili şekilde yansıtan uygun veri türlerini atamanız gerekir.
  • Dengesiz veriler: Makine öğrenmesi eğitimi, eğitim verilerinin karşılaşılabilecek tüm farklı özellik ve etiket birleşimlerini yeterince temsil etmesi durumunda en iyi şekilde çalışır. Dengesiz bir veri kümesinde, belirli bir kategorik değeri veya alan birleşimini içeren kayıtlar fazla temsil edilir; bu, eğitim algoritmasını etkileyebilir ve modele yanlılık getirir. Bu sorunu azaltmaya yönelik yaygın bir teknik, eklenen yinelenen satırlarla az temsil edilen değerlerin fazla örneklemesini yapmak veya fazla temsil edilen satırları (veri kümesinden kaldırarak) alt örnekleme yapmaktır.

Azure Databricks'te bu tür sorunları algılamanın ve işlemenin en yaygın yolu, verileri inceleyen ve işleyen bir not defterine kod yazmaktır. Bu tür veri işleme için kullanılan birincil sınıf Spark veri çerçevesidir.

Örneğin, aşağıdaki kod bir metin dosyasındaki verileri bir veri çerçevesine yükler:

df = spark.read.format("csv").option("header", "true").load("/myfolder/mydata.csv")

Alternatif olarak, veriler Azure Databricks çalışma alanında bir delta tablosuna yüklendiyse, verilerini bir veri çerçevesine yüklemek için bir SQL sorgusu kullanabilirsiniz:

df = spark.sql("SELECT * FROM mytable")

Veriler bir veri çerçevesine yüklendikten sonra spark SQL kitaplığındaki yöntemlerini ve diğer işlevlerini kullanarak verileri inceleyebilir ve dönüştürebilirsiniz. Örneğin aşağıdaki kod, null değerler içeren satırları kaldırmak için dropna yöntemini kullanır ve veri çerçevesindeki sütunlara belirli veri türleri atar.

clean_data = df.dropna().select(col("column1").astype("string"),
                                col("column2").astype("float"))

Tavsiye

Spark veri çerçevesi işlevselliği hakkında daha fazla bilgi için Spark Dataframe belgelerine bakın.

Özellik mühendisliği ve ön işleme

Veri kümesinin eksiksiz ve temiz olduğundan emin olduktan sonra, özellikleri makine öğrenmesi için hazırlamaya başlayabilirsiniz. Özellik mühendisliği, hangi özellik sütunlarının tahmine dayalı değere sahip olduğunu ve özellikleri en iyi şekilde nasıl temsil edileceğini belirlemek için genellikle biraz deneme ve hata içeren yinelemeli bir yaklaşımdır. Yaygın özellik mühendisliği ve önişlem görevleri şunlardır:

  • Yeni özellikler türetme: Genellikle mevcut özelliklerden yeni, daha tahmine dayalı özellikler türetebilirsiniz. Örneğin, bir veri kümesinin bir tarih sütunu içerdiğini ve tam tarihin etiketi tanımlamada önemli bir tahmin faktörü olmayabileceğini, ancak haftanın gününün olabileceğini varsayın. Tarihten türetilmiş yeni bir day_of_week özelliği oluşturabilir ve teorinizi test edebilirsiniz.

  • Sayısal özellikleri ayırma: Bazı durumlarda, sayısal bir değer belirli değer aralıklarını temsil eden kategorilere ayrılırken daha tahmine dayalı olabilir. Örneğin, bir fiyat özelliğindeki sayısal değerleri alabilir ve uygun eşiklere göre düşük, orta ve yüksek kategorilere atayabilirsiniz.

  • Kategorik özellikleri kodlama: Birçok veri kümesi, dize değerleriyle temsil edilen kategorik verileri içerir. Ancak makine öğrenmesi algoritmalarının çoğu sayısal verilerle en iyi şekilde çalışır. Bu nedenle, dizeler yerine kategorileri temsil eden sayısal kodlar atamak yaygındır. Örneğin, ürün ayrıntıları veri kümesinde "Yeşil", "Kırmızı" veya "Mavi" değerine sahip olabilecek bir renk özelliği bulunabilir. "Yeşil" için 0 , "Kırmızı" için 1 ve "Mavi" için 2 gibi basit tamsayı kodları kullanarak bu değerleri kodlayabilirsiniz. Alternatif olarak, her olası kategori için yeni bir sütun oluşturduğunuz ve her sütuna her satır için uygun 1 veya 0 değerini atadığınız tekil kodlama tekniğini kullanabilirsiniz:

    Özgün Renk Sütunu Yeşil Kırmızı Mavi
    Yeşil 1 0 0
    Mavi 0 0 1
    Kırmızı 0 1 0
  • Sayısal değerleri ölçeklendirme (normalleştirme): Sayısal veri değerleri genellikle birbirinden farklı ölçeklerde veya ölçü birimlerindedir. Makine öğrenmesi algoritmaları bunların tümünü mutlak sayısal değerler olarak işler ve daha büyük değerlere sahip özellikler genellikle modelin eğitimine hakim olabilir. Bu sorunu çözmek için, tek bir sütunun tek tek değerlerinin birbiriyle aynı orantılı ilişkiyi sürdürmesi, ancak tüm sayısal sütunların benzer ölçekte olması için tüm sayısal sütunları ölçeklendirmek yaygın bir durumdur. Örneğin, bir veri kümesinin metre ve kilogram cinsinden ölçülen uzunluk ve ağırlık değerlerini içerdiğini varsayalım. Bu özelliklerin her ikisini de aşağıdaki gibi 0 ile 1 arasında ölçeklendirilmiş bir değere dönüştürebilirsiniz:

    uzunluk ağırlık ölçeklenmiş uzunluk ölçeklenmiş ağırlık
    250.0 2.1 0.250 0,210
    176.0 0,9 0.176 0.09

Birçok makine öğrenmesi kitaplığı, ortak özellik mühendisliği görevlerini gerçekleştirmek için kullanabileceğiniz sınıflar içerir. Örneğin, Spark MLlib kitaplığı dize değerleri için basit tamsayı tabanlı kodlama gerçekleştirmek için kullanabileceğiniz StringIndexer sınıfını içerir.

from pyspark.ml.feature import StringIndexer

encoder = StringIndexer(inputCol="catCol", outputCol="catColCode")
encoded_data = encoder.fit(data).transform(data)

Uyarı

StringIndexer kod örneğini biraz daha ayrıntılı olarak açıklamaya değer. Spark MLlib sınıfları, bazı örnek verilere belirli bir dönüştürme işlemi için bir algoritmaya uyan değerlendiriciler içerebilir. Bu durumda StringIndexer, kodlanmış değerleri içeren yeni bir catColCode sütunu oluşturmak için gereken belirli hesaplamaları belirlemek için veri veri çerçevesindeki catCol sütunundaki ayrık dize değerlerine bir kodlama algoritması sığdırıyor. Değerlendiricinin çıkışı, değerlendirici tarafından tanımlanan işlevi kapsülleyen ve bu işlevi verilere uygulayıp yeni bir veri çerçevesi oluşturabilen bir transformatördür . Bu örnekte kodlama işlevini belirlemek için kullanılan verileri, kodlamayı gerçekten uygulamak için sonuçta elde edilen transformatöre geçiriyoruz.

Spark MLLib'de, verilerinizi hazırlamak için ihtiyacınız olan tüm özellik mühendisliği ve ön işleme adımlarını gerçekleştiren bir işlem hattında bir dizi değerlendiriciyi ve transformatörü birbirine zincirleyebilirsiniz. İşlem hattı, hazırlanan özelliklerden bir etiketi tahmin etmek için gereken işlemleri belirlemek için değerlendirici işlevi gören bir makine öğrenmesi algoritmasıyla sona erebilir. İşlem hattının çıktısı, bir makine öğrenimi modelidir. Bu model, bir transformatör olarak, model işlevini bir veri çerçevesindeki özelliklere uygulamak ve ilgili etiket değerlerini tahmin etmek için kullanılabilir.