PySpark Lojistik Regresyon

Pyspark Lojistik Regresyon



Bu PySpark kılavuzunda, bir kişinin felçten etkilenip etkilenmediğini tahmin etmek için lojistik regresyonun nasıl gerçekleştirileceğini tartışacağız. Genel olarak felç, kişi sigara/içki bağımlısı olduğunda ortaya çıkar. Kalp hastalığı ve kandaki yüksek glikoz seviyeleri (Diyabet) gibi diğer nedenler de felce neden olur. Lojistik Regresyon Makine Öğrenimi modeli yardımıyla modelimizin doğruluğunu örnek veriler üzerinde tahmin edip göstereceğiz.

Bu kılavuzda, önce yaklaşımı göreceğiz ve ardından verileri adım adım analiz ederek her bir kişinin vuruşunu tahmin edeceğiz.

Lojistik regresyon

“Logit Modeli” olarak da adlandırılan lojistik regresyon, tahmine dayalı analitikte sınıflandırma problemlerinde kullanılır. Bu, sınıfları (kategorileri) sınıflandırmak için yalnızca sınıflandırma üzerinde çalışan bir Makine Öğrenimi modelidir. Örneğin, senaryomuzda iki kategori vardır (inmeden etkilenen kişi ve felçten etkilenmeyen kişi). Modelin en iyi uygulamaları kalp hastalığı tahmini, cinsiyet tahmini, mahsul ömrü tahmini vb.







Adımlar:

1. Veri Toplama: Veriler, herhangi bir tahmin/analiz gerçekleştirmek için gereklidir. Diğerleri arasında CSV/XLSX biçiminde olabilir. Spark.read.csv() yöntemini kullanarak bunu Spark ortamına (DataFrame) yükleyebiliriz.



2. Veri Analizi : Niteliklerin/sütunların analiz edilmesi “veri analizi” olarak bilinir. Sınıfı tahmin etmeye yardımcı olan sütunlar “bağımsız nitelikler” olarak bilinir. Tahminle sonuçlanan sütun, 'bağımlı veya hedef özellik' olarak bilinir. Bu senaryoda, tüm sütunları görüntülemek için column özelliğini kullanabiliriz. Unique() metodu benzersiz değerleri görmek için kullanılır.



3. Veri Ön İşleme: Null/eksik değerlerin filtrelenmesi 'ön işleme' olarak bilinir. Bu aşamada tüm eksik değerleri kaldırıyoruz. Makine yalnızca ikili dili bilir. Bu nedenle, tüm dizi kategorileri sayısal kategorik değerlere dönüştürülmelidir. PySpark'ta string kategorilerini sayısala dönüştürmek için pyspark.ml.feature modülünde bulunan sınıf olan “StringIndexer” kullanabiliriz. Bunları otomatik olarak dahili olarak dönüştürür. Değerleri vermemize gerek yok. Aşağıdaki sözdizimini kullanabilirsiniz:





indexer_data=StringIndexer(inputCol= 'Dize_Kategorisi_SütunAdı' ,outputCol= 'Yeni_Sütun_adı' )

4. Vektör Montajı: Artık makinenin anlayabileceği verilere sahipsiniz. Bu aşamada, tüm bağımsız nitelikler tek bir sütunda vektörleştirilmelidir. Bu, VectorAssembler sınıfı kullanılarak yapılabilir. İki parametre alır: İlk parametre, bağımsız özniteliklerin bir listesini alan inputCols'tur. İkinci parametre, tüm inputCol'ları bu değişkene vektörleştiren outputCol'dur.

birleştirici=VectorAssembler(inputCols=[sütunlar…],outputCol=vectorized_data)

5. Dönüşüm: Şimdi, transform() işlevini kullanarak güncellenmiş sütunları dönüştürerek (Adım 3) verilerinizi hazırlayın.



birleştirici.transform(inxed_data)

6. Verileri Eğitim ve Test İçin Hazırlama: Bu aşamada, verileri “eğitim” ve “test” olarak ayırıyoruz. Modeli eğitmek için %70'lik veriyi ve modeli test etmek için %30'luk veriyi bölersek daha iyi olur. Bu, randomSplit() yöntemi kullanılarak elde edilebilir. İki kayan değer içeren bir liste alır: biri test bölümü için, diğeri tren bölümü için.

train_data,test_data=final_data.select([ 'özellikler' ,target_column]).randomSplit([0.70.0.30])

7. Model Uydurma ve Değerlendirme : Lojistik Regresyon modeline uyma zamanı. Lojistik Regresyon modeli, pyspark.ml.classification modülünde mevcuttur. Sınıf etiketi/hedef sütununu alır. Bu, rawPrediction, olasılık ve tahmin sütunlarıyla sonuçlanır. Sonuçlarımız tahmin sütununda saklanır.

# Model uydurma

logistic_regression_model=LogisticRegression(labelCol=target_column).fit(train_data)

# Model değerlendirmesi

train_results=lojistik_regression_model.evaluate(train_data).predictions

8. Doğruluk ve Sonuçlar: Bu, herhangi bir test tekniğini kullanarak model doğruluğunu test ettiğimiz son aşamadır.

Lojistik Regresyon modelini kullanarak bir kişinin inmeden etkilenip etkilenmediğini tahmin ettiğimiz aşağıdaki projeye bakalım.

İnme Tahmini

9. PySpark modülünü ortamınıza kurun. Kurulum için komut aşağıdadır:

pip kurulumu pyspark

10. 10 kişinin vuruş detaylarına ait 10 kayıt ile PySpark DataFrame oluşturalım. Gösterim için CSV'siz bir DataFrame oluşturuyoruz. Bu DataFrame'de 7 sütun var. 'Cinsiyet', 'Glikoz_seviyesi', 'evli', 'yaş', 'kalp_hastalığı', 'hiper_tansiyon' bağımsız niteliklerdir ve 'İnme', sınıf etiketi veya bağımlı niteliktir. Bu, bir kişinin felç geçirmesinin bu bağımsız niteliklere bağlı olduğu anlamına gelir.

pyspark'ı içe aktar

pyspark.sql'den SparkSession'ı içe aktarın

linuxhint_spark_app = SparkSession.builder.appName( 'Linux İpucu' ).getOrCreate()

stoke_data =[

{ 'Cinsiyet' : 'Dişi' , 'yaş' : elli , 'kalp hastalığı' : 'Evet' ,

'hipertansiyon' : 'Evet' , 'evli' : 'Evet' , 'Glikoz_seviyesi' : 130 , 'Felç' : 1 },

{ 'Cinsiyet' : 'Erkek' , 'yaş' : yirmi , 'kalp hastalığı' : 'HAYIR' ,

'hipertansiyon' : 'Evet' , 'evli' : 'HAYIR' , 'Glikoz_seviyesi' : 97 , 'Felç' : 0 },

{ 'Cinsiyet' : 'Erkek' , 'yaş' : 12 , 'kalp hastalığı' : 'HAYIR' ,

'hipertansiyon' : 'HAYIR' , 'evli' : 'HAYIR' , 'Glikoz_seviyesi' : 98 , 'Felç' : 0 },

{ 'Cinsiyet' : 'Dişi' , 'yaş' : 90 , 'kalp hastalığı' : 'HAYIR' ,

'hipertansiyon' : 'HAYIR' , 'evli' : 'Evet' , 'Glikoz_seviyesi' : 170 , 'Felç' : 1 },

{ 'Cinsiyet' : 'Erkek' , 'yaş' : 43 , 'kalp hastalığı' : 'Evet' ,

'hipertansiyon' : 'Evet' , 'evli' : 'Evet' , 'Glikoz_seviyesi' : 150 , 'Felç' : 1 },

{ 'Cinsiyet' : 'Dişi' , 'yaş' : yirmi bir , 'kalp hastalığı' : 'HAYIR' ,

'hipertansiyon' : 'HAYIR' , 'evli' : 'Evet' , 'Glikoz_seviyesi' : 110 , 'Felç' : 0 },

{ 'Cinsiyet' : 'Dişi' , 'yaş' : elli , 'kalp hastalığı' : 'Evet' ,

'hipertansiyon' : 'HAYIR' , 'evli' : 'Evet' , 'Glikoz_seviyesi' : 100 , 'Felç' : 0 },

{ 'Cinsiyet' : 'Erkek' , 'yaş' : 3. 4 , 'kalp hastalığı' : 'HAYIR' ,

'hipertansiyon' : 'Evet' , 'evli' : 'Evet' , 'Glikoz_seviyesi' : 190 , 'Felç' : 1 },

{ 'Cinsiyet' : 'Erkek' , 'yaş' : 10 , 'kalp hastalığı' : 'HAYIR' ,

'hipertansiyon' : 'HAYIR' , 'evli' : 'HAYIR' , 'Glikoz_seviyesi' : 90 , 'Felç' : 0 },

{ 'Cinsiyet' : 'Dişi' , 'yaş' : 56 , 'kalp hastalığı' : 'Evet' ,

'hipertansiyon' : 'Evet' , 'evli' : 'Evet' , 'Glikoz_seviyesi' : 145 , 'Felç' : 1 }

]

# yukarıdaki verilerden veri çerçevesini oluştur

vuruş_df = linuxhint_spark_app.createDataFrame(stoke_data)

# Gerçek stoke_df

vuruş_df.göster()

Çıktı:

11. Select() yöntemini kullanarak bağımsız sütunları görüntüleyin.

# Bağımsız özellikleri göster

stroke_df.select(stroke_df[ 'Cinsiyet' ],stroke_df[ 'Glikoz_seviyesi' ],stroke_df[ 'evli' ],stroke_df[ 'yaş' ],stroke_df[ 'kalp hastalığı' ],stroke_df[ 'hipertansiyon' ]).göstermek()

Çıktı:

12. Hedef öznitelikte (Stroke) bulunan benzersiz değerleri görüntüleyin.

# hedef özellik benzersiz değerleri

stroke_df.select(stroke_df[ 'Felç' ]).distinct().show()

Çıktı:

13. printSchema() işlevini kullanarak tüm sütunların veri türünü döndürün.

# Tüm sütunların veri tipini döndürür.

stroke_df.printSchema()

Çıktı:

4 sütunun string tipinde olduğunu görebiliriz. Bunları kategorik sayısal değerlere çevirelim.

14. “Gender”, “heart_disease”, “hyper_tension” ve “married” sütunlarında string kategorik değerleri StringIndexer kullanarak sayısal kategorik değerlere çevirelim ve bunları Categotical_Gender, Categotical_heart_disease, Categotical_hyper_tension ve Categotical_married sütunlarına yazalım. fit() yöntemini kullanarak sütunları indexed_data DataFrame içinde depolayın.

pyspark.ml.feature'dan StringIndexer'ı içe aktarın

# Dize kategorik değerlerini 'Cinsiyet' sütununda sayısal kategorik değerlere dönüştürün.

indexer_data=StringIndexer(inputCol= 'Cinsiyet' ,outputCol= 'Kategotik_Cinsiyet' )

indexed_data=indexer_data.fit(stroke_df).transform(stroke_df)

# Dize kategorik değerlerini 'kalp_hastalığı' sütunundaki sayısal kategorik değerlere dönüştürün.

indexer_data=StringIndexer(inputCol= 'kalp hastalığı' ,outputCol= 'Kategotik_kalp_hastalığı' )

indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)

# 'hyper_tension' sütununda dize kategorik değerlerini sayısal kategorik değerlere dönüştürün.

indexer_data=StringIndexer(inputCol= 'hipertansiyon' ,outputCol= 'Categotical_hyper_tension' )

indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)

# Dize kategorik değerlerini 'evli' sütununda sayısal kategorik değerlere dönüştürün.

indexer_data=StringIndexer(inputCol= 'evli' ,outputCol= 'Kategotik_evli' )

indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)

# Güncellenenleri göster

indexed_data.show()

Çıktı:

15. Vektör birleştiriciyi kullanarak bağımsız sütunları bir vektöre dönüştürün. Vektör adı “özellikler”dir.

pyspark.ml.feature'dan VectorAssembler'ı içe aktarın

montajcı= VectorAssembler(inputCols=[ 'Kategotik_Cinsiyet' , 'Kategotik_kalp_hastalığı' , 'Categotical_hyper_tension' , 'Kategotik_evli' , 'yaş' ,

'Glikoz_seviyesi' ],outputCol= 'özellikler' )

16. transform() işlevini kullanarak önceki verileri nihai bir DataFrame'e dönüştürün ve show() işlevini kullanarak görüntüleyin.

Çıktı:

17. Verileri 70-30'a bölerek eğitim ve test için hazırlayın. 'Özellikler' train_data'da saklanır ve 'Strok', test_data'da saklanır.

# Verileri eğitim ve test için hazırlayın

train_data,test_data=final.select([ 'özellikler' , 'Felç' ]).randomSplit([ 0.70 , 0.30 ])

18. Lojistik Regresyon modelini uydurun ve değerlendirin.

pyspark.ml.classification'dan LogisticRegression'u içe aktarın

# Model uydurma

logistic_regression_model=LogisticRegression(labelCol= 'Felç' ).fit(train_data)

# Model değerlendirmesi

train_results=lojistik_regression_model.evaluate(train_data).predictions

train_results.show()

Çıktı:

19. Model doğruluğunu kontrol etmek için BinaryClassificationEvaluator'ı kullanın. Modelimizin %100 doğru olduğunu görebiliriz.

pyspark.ml.evaluation'dan BinaryClassificationEvaluator'ı içe aktarın

# BinaryClassificationEvaluator'ı çağırın

sonuçlar = BinaryClassificationEvaluator(rawPredictionCol= 'tahmin' ,etiketCol= 'Felç' )

ROC_AUC = sonuçlar.değerlendir(train_results)

yazdır(ROC_AUC * 100 , '% Kesinlik' )

Çözüm

PySpark'ta Lojistik Regresyon modelini kullanarak gerçek döşeme sınıflandırma problemini tahmin edebilirsiniz. Null/eksik değerlerin kaldırılması, model değerlendirmesini ve doğruluğunu azalttığı için önemlidir. Ön işleme, herhangi bir makine öğrenimi modeline uymadan önce gerekli bir adımdır. Bu adımı düzgün ve doğru bir şekilde yaptığınızdan emin olun.