Regresi Logistik PySpark

Regresi Logistik Pyspark



Dalam panduan PySpark ini, kita akan membincangkan cara melakukan regresi logistik untuk meramal sama ada seseorang itu terkena strok atau tidak. Secara umumnya, strok berlaku apabila seseorang itu ketagih merokok/minum. Sebab lain seperti penyakit jantung dan paras glukosa yang tinggi dalam darah (Diabetes) juga menyebabkan strok. Dengan bantuan model Pembelajaran Mesin Regresi Logistik, kami akan meramalkan dan menunjukkan ketepatan model kami pada data sampel.

Dalam panduan ini, mula-mula kita akan melihat pendekatan dan kemudian meramalkan pukulan setiap orang dengan menganalisis data langkah demi langkah.

Regresi Logistik

Regresi logistik, juga dipanggil 'Model Logit', digunakan dalam analisis ramalan untuk masalah pengelasan. Ini ialah model Pembelajaran Mesin yang hanya berfungsi pada pengelasan untuk mengklasifikasikan kelas (kategori). Sebagai contoh, terdapat dua kategori dalam senario kami (seorang yang terkena strok dan seorang yang tidak terkena strok). Aplikasi terbaik model ini ialah ramalan penyakit jantung, ramalan jantina, ramalan hayat tanaman, dsb.







Langkah-langkah:

1. Pengumpulan Data: Data adalah perlu untuk melakukan sebarang ramalan/analisis. Ia boleh dalam bentuk CSV/XLSX, antara lain. Kita boleh memuatkan ini ke dalam persekitaran Spark (DataFrame) menggunakan kaedah spark.read.csv().



2. Analisis Data : Menganalisis atribut/lajur dikenali sebagai “analisis data”. Lajur yang membantu untuk meramalkan kelas dikenali sebagai 'atribut bebas'. Lajur yang menghasilkan ramalan dikenali sebagai 'atribut bergantung atau sasaran'. Dalam senario ini, kita boleh menggunakan sifat lajur untuk memaparkan semua lajur. Kaedah distinct() digunakan untuk melihat nilai unik.



3. Prapemprosesan Data: Penapisan nilai nol/hilang dikenali sebagai 'prapemprosesan'. Kami mengalih keluar semua nilai yang hilang dalam peringkat ini. Mesin hanya tahu bahasa binari. Jadi, semua kategori rentetan hendaklah ditukar kepada nilai kategori berangka. Dalam PySpark, kita boleh menggunakan 'StringIndexer' iaitu kelas yang tersedia dalam modul pyspark.ml.feature untuk menukar kategori rentetan kepada angka. Ia secara automatik menukarnya secara dalaman. Kita tidak perlu memberikan nilai. Anda boleh menggunakan sintaks berikut:





indexer_data=StringIndexer(inputCol= 'String_Category_ColumnName' ,outputCol= 'New_Column_name' )

4. Pemasangan Vektor: Kini, anda mempunyai data yang boleh difahami oleh mesin. Dalam peringkat ini, semua atribut bebas hendaklah divektorkan ke dalam satu lajur. Ini boleh dilakukan menggunakan kelas VectorAssembler. Ia memerlukan dua parameter: Parameter pertama ialah inputCols yang mengambil senarai atribut bebas. Parameter kedua ialah outputCol yang menvektorkan semua inputCols ke dalam pembolehubah ini.

assembler=VectorAssembler(inputCols=[columns…],outputCol=vectorized_data)

5. Transformasi: Sekarang, sediakan data anda dengan mengubah lajur yang dikemas kini (Langkah 3) menggunakan fungsi transform().



assembler.transform(inxed_data)

6. Menyediakan Data untuk Latihan & Pengujian: Pada peringkat ini, kami membahagikan data kepada 'latihan' dan 'ujian'. Adalah lebih baik jika kita membahagikan 70% data untuk melatih model dan 30% data untuk menguji model. Ini boleh dicapai menggunakan kaedah randomSplit(). Ia memerlukan senarai yang memegang dua nilai apungan: satu untuk pemisahan ujian dan satu lagi untuk pemisahan kereta api.

train_data,test_data=final_data.select([ 'ciri-ciri' ,target_column]).randomSplit([0.70.0.30])

7. Pemasangan & Penilaian Model : Tiba masanya untuk menyesuaikan model Regresi Logistik. Model Regresi Logistik tersedia dalam modul pyspark.ml.classification. Ia mengambil label kelas/lajur sasaran. Ini menghasilkan lajur Prediksi mentah, kebarangkalian dan ramalan. Keputusan kami disimpan dalam lajur ramalan.

# Kesesuaian model

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

# Penilaian model

train_results=logistic_regression_model.evaluate(train_data).predictions

8. Ketepatan & Keputusan: Ini adalah peringkat akhir di mana kami menguji ketepatan model menggunakan sebarang teknik ujian.

Mari lihat projek berikut di mana kita meramalkan sama ada seseorang itu terjejas oleh strok atau tidak menggunakan model Regresi Logistik.

Ramalan Strok

9. Pasang modul PySpark dalam persekitaran anda. Berikut ialah arahan untuk memasang:

pip pasang pyspark

10. Mari buat PySpark DataFrame dengan 10 rekod yang berkaitan dengan butiran stroke 10 orang. Untuk demonstrasi, kami mencipta DataFrame tanpa CSV. Terdapat 7 lajur dalam DataFrame ini. “Jantina”, “Tahap_Glukosa”, “berkahwin”, “umur”, “penyakit_jantung”, “tegangan_hipertensi” ialah atribut bebas dan “Strok” ialah label kelas atau atribut bergantung. Ini bermakna bahawa pukulan seseorang bergantung pada sifat bebas ini.

import pyspark

daripada pyspark.sql import SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Petunjuk Linux' ).getOrCreate()

stoke_data =[

{ 'Jantina' : 'Perempuan' , 'umur' : lima puluh , 'penyakit jantung' : 'Ya' ,

'hiper_tension' : 'Ya' , 'berkahwin' : 'Ya' , 'Tahap_glukosa' : 130 , 'Strok' : 1 },

{ 'Jantina' : 'Lelaki' , 'umur' : dua puluh , 'penyakit jantung' : 'Tidak' ,

'hiper_tension' : 'Ya' , 'berkahwin' : 'Tidak' , 'Tahap_glukosa' : 97 , 'Strok' : 0 },

{ 'Jantina' : 'Lelaki' , 'umur' : 12 , 'penyakit jantung' : 'Tidak' ,

'hiper_tension' : 'Tidak' , 'berkahwin' : 'Tidak' , 'Tahap_glukosa' : 98 , 'Strok' : 0 },

{ 'Jantina' : 'Perempuan' , 'umur' : 90 , 'penyakit jantung' : 'Tidak' ,

'hiper_tension' : 'Tidak' , 'berkahwin' : 'Ya' , 'Tahap_glukosa' : 170 , 'Strok' : 1 },

{ 'Jantina' : 'Lelaki' , 'umur' : 43 , 'penyakit jantung' : 'Ya' ,

'hiper_tension' : 'Ya' , 'berkahwin' : 'Ya' , 'Tahap_glukosa' : 150 , 'Strok' : 1 },

{ 'Jantina' : 'Perempuan' , 'umur' : dua puluh satu , 'penyakit jantung' : 'Tidak' ,

'hiper_tension' : 'Tidak' , 'berkahwin' : 'Ya' , 'Tahap_glukosa' : 110 , 'Strok' : 0 },

{ 'Jantina' : 'Perempuan' , 'umur' : lima puluh , 'penyakit jantung' : 'Ya' ,

'hiper_tension' : 'Tidak' , 'berkahwin' : 'Ya' , 'Tahap_glukosa' : 100 , 'Strok' : 0 },

{ 'Jantina' : 'Lelaki' , 'umur' : 3. 4 , 'penyakit jantung' : 'Tidak' ,

'hiper_tension' : 'Ya' , 'berkahwin' : 'Ya' , 'Tahap_glukosa' : 190 , 'Strok' : 1 },

{ 'Jantina' : 'Lelaki' , 'umur' : 10 , 'penyakit jantung' : 'Tidak' ,

'hiper_tension' : 'Tidak' , 'berkahwin' : 'Tidak' , 'Tahap_glukosa' : 90 , 'Strok' : 0 },

{ 'Jantina' : 'Perempuan' , 'umur' : 56 , 'penyakit jantung' : 'Ya' ,

'hiper_tension' : 'Ya' , 'berkahwin' : 'Ya' , 'Tahap_glukosa' : 145 , 'Strok' : 1 }

]

# buat kerangka data daripada data di atas

stroke_df = linuxhint_spark_app.createDataFrame(stoke_data)

# Stoke_df sebenar

stroke_df.show()

Pengeluaran:

11. Paparkan lajur bebas menggunakan kaedah pilih().

# Paparkan atribut bebas

stroke_df.select(stroke_df[ 'Jantina' ],stroke_df[ 'Tahap_glukosa' ],stroke_df[ 'berkahwin' ],stroke_df[ 'umur' ],stroke_df[ 'penyakit jantung' ],stroke_df[ 'tegangan_hipertensi' ]).tunjukkan()

Pengeluaran:

12. Paparkan nilai unik yang terdapat dalam atribut sasaran (Stroke).

# nilai unik atribut sasaran

stroke_df.select(stroke_df[ 'Strok' ]).distinct().show()

Pengeluaran:

13. Kembalikan jenis data semua lajur menggunakan fungsi printSchema().

# Kembalikan jenis data semua lajur.

stroke_df.printSchema()

Pengeluaran:

Kita dapat melihat bahawa 4 lajur adalah daripada jenis rentetan. Mari tukarkannya kepada nilai angka kategori.

14. Mari tukar nilai kategori rentetan kepada nilai kategori berangka menggunakan StringIndexer dalam lajur 'Jantina', 'penyakit_hati', 'hiper_tegangan' dan 'berkahwin' dan tulis ini ke dalam kategori Jantina, Kategori_penyakit_hati, Kategori_hiper_tension. Simpan lajur ke dalam DataFrame indexed_data menggunakan kaedah fit().

daripada pyspark.ml.feature import StringIndexer

# Tukar nilai kategori rentetan kepada nilai kategori berangka dalam lajur 'Jantina'.

indexer_data=StringIndexer(inputCol= 'Jantina' ,outputCol= 'Jantina_Kategotik' )

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

# Tukar nilai kategori rentetan kepada nilai kategori berangka dalam lajur 'penyakit_hati'.

indexer_data=StringIndexer(inputCol= 'penyakit jantung' ,outputCol= 'Penyakit_jantung_kategori' )

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

# Tukar nilai kategori rentetan kepada nilai kategori berangka dalam lajur 'hyper_tension'.

indexer_data=StringIndexer(inputCol= 'tegangan_hipertensi' ,outputCol= 'Ketegangan_hiper_kategori' )

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

# Tukar nilai kategori rentetan kepada nilai kategori berangka dalam lajur 'berkahwin'.

indexer_data=StringIndexer(inputCol= 'berkahwin' ,outputCol= 'Kategotik_berkahwin' )

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

# Paparkan kemas kini

indexed_data.show()

Pengeluaran:

15. Tukar lajur bebas kepada vektor menggunakan pemasang vektor. Nama vektor ialah 'ciri'.

daripada pyspark.ml.feature import VectorAssembler

assembler= VectorAssembler(inputCols=[ 'Jantina_Kategotik' , 'Penyakit_jantung_kategori' , 'Ketegangan_hiper_kategori' , 'Kategotik_berkahwin' , 'umur' ,

'Tahap_glukosa' ],outputCol= 'ciri-ciri' )

16. Ubah data sebelumnya kepada DataFrame akhir menggunakan fungsi transform() dan paparkannya menggunakan fungsi show().

Pengeluaran:

17. Sediakan data untuk latihan dan ujian dengan membahagikannya kepada 70-30. 'Ciri' disimpan dalam train_data dan 'Stroke' disimpan dalam test_data.

# Sediakan data untuk latihan dan ujian

train_data,test_data=final.select([ 'ciri-ciri' , 'Strok' ]).randomSplit([ 0.70 , 0.30 ])

18. Pasangkan model Regresi Logistik dan nilaikannya.

daripada pyspark.ml.classification import LogisticRegression

# Kesesuaian model

logistic_regression_model=LogisticRegression(labelCol= 'Strok' ).fit(data_kereta)

# Penilaian model

train_results=logistic_regression_model.evaluate(train_data).predictions

train_results.show()

Pengeluaran:

19. Gunakan BinaryClassificationEvaluator untuk menyemak ketepatan model. Kami dapat melihat bahawa model kami adalah 100% tepat.

daripada pyspark.ml.evaluation import BinaryClassificationEvaluator

# panggil BinaryClassificationEvaluator

keputusan = BinaryClassificationEvaluator(rawPredictionCol= 'ramalan' ,labelCol= 'Strok' )

ROC_AUC = results.evaluate(train_results)

cetak(ROC_AUC * 100 , '% Ketepatan' )

Kesimpulan

Anda boleh meramalkan masalah pengelasan jubin sebenar menggunakan model Regresi Logistik dalam PySpark. Mengalih keluar nilai nol/hilang adalah penting kerana ia mengurangkan penilaian dan ketepatan model. Prapemprosesan ialah langkah yang perlu sebelum memasang mana-mana model pembelajaran mesin. Pastikan anda melakukan langkah ini dengan betul dan tepat.