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 modellogistic_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 pysparkdaripada 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 bebasstroke_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 sasaranstroke_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 VectorAssemblerassembler= 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 ujiantrain_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.