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 uydurmalogistic_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 aktarpyspark.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österstroke_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ğerleristroke_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ınmontajcı= 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ıntrain_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.