PySpark การถดถอยโลจิสติก

Pyspark Kar Thd Thxy Lo Ci Sti K



ในคู่มือ PySpark นี้ เราจะหารือถึงวิธีการดำเนินการถดถอยโลจิสติกเพื่อทำนายว่าบุคคลนั้นได้รับผลกระทบจากโรคหลอดเลือดสมองหรือไม่ โดยทั่วไป โรคหลอดเลือดสมองจะเกิดขึ้นเมื่อบุคคลติดบุหรี่/ดื่มสุรา สาเหตุอื่นๆ เช่น โรคหัวใจและระดับน้ำตาลในเลือดสูง (เบาหวาน) ก็ทำให้เกิดโรคหลอดเลือดสมองได้เช่นกัน ด้วยความช่วยเหลือของแบบจำลองการเรียนรู้ของเครื่องการถดถอยโลจิสติก เราจะทำนายและแสดงความแม่นยำของแบบจำลองของเราในข้อมูลตัวอย่าง

ในคำแนะนำนี้ เราจะดูแนวทางก่อนแล้วจึงทำนายจังหวะของแต่ละคนโดยการวิเคราะห์ข้อมูลทีละขั้นตอน

การถดถอยโลจิสติก

การถดถอยโลจิสติกหรือที่เรียกว่า 'แบบจำลองโลจิสติก' ใช้ในการวิเคราะห์เชิงคาดการณ์สำหรับปัญหาการจำแนกประเภท นี่คือรูปแบบการเรียนรู้ของเครื่องที่ทำงานเฉพาะในการจำแนกประเภทเพื่อจำแนกชั้นเรียน (หมวดหมู่) ตัวอย่างเช่น มีสองประเภทในสถานการณ์ของเรา (บุคคลที่ได้รับผลกระทบจากโรคหลอดเลือดสมองและบุคคลที่ไม่ได้รับผลกระทบจากโรคหลอดเลือดสมอง) การประยุกต์ใช้แบบจำลองที่ดีที่สุด ได้แก่ การทำนายโรคหัวใจ การทำนายเพศ การทำนายอายุพืชผล ฯลฯ







ขั้นตอน:

1. การรวบรวมข้อมูล: ข้อมูลนี้จำเป็นสำหรับการคาดการณ์/การวิเคราะห์ใดๆ สามารถอยู่ในรูปแบบ CSV/XLSX และอื่นๆ เราสามารถโหลดสิ่งนี้ลงในสภาพแวดล้อม Spark (DataFrame) โดยใช้เมธอด spark.read.csv()



2. การวิเคราะห์ข้อมูล : การวิเคราะห์แอตทริบิวต์/คอลัมน์เรียกว่า “การวิเคราะห์ข้อมูล” คอลัมน์ที่ช่วยในการทำนายคลาสเรียกว่า 'แอตทริบิวต์อิสระ' คอลัมน์ที่ส่งผลให้เกิดการคาดคะเนเรียกว่า 'แอตทริบิวต์ที่พึ่งพาหรือเป้าหมาย' ในสถานการณ์สมมตินี้ เราสามารถใช้คุณสมบัติคอลัมน์เพื่อแสดงคอลัมน์ทั้งหมด วิธีการที่แตกต่างกัน () ใช้เพื่อดูค่าที่ไม่ซ้ำกัน



3. การประมวลผลข้อมูลล่วงหน้า: การกรองค่าว่าง/ค่าที่ขาดหายไปเรียกว่า “การประมวลผลล่วงหน้า” เราลบค่าที่ขาดหายไปทั้งหมดในขั้นตอนนี้ เครื่องรู้เฉพาะภาษาไบนารี ดังนั้น ควรแปลงหมวดหมู่สตริงทั้งหมดเป็นค่าหมวดหมู่ที่เป็นตัวเลข ใน PySpark เราสามารถใช้ “StringIndexer” ซึ่งเป็นคลาสที่มีอยู่ในโมดูล pyspark.ml.feature เพื่อแปลงหมวดหมู่สตริงเป็นตัวเลข มันจะแปลงภายในโดยอัตโนมัติ เราไม่จำเป็นต้องให้ค่า คุณสามารถใช้ไวยากรณ์ต่อไปนี้:





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

4. การประกอบเวกเตอร์: ตอนนี้คุณมีข้อมูลที่เครื่องสามารถเข้าใจได้ ในขั้นตอนนี้ แอตทริบิวต์อิสระทั้งหมดควรถูกทำให้เป็นเวกเตอร์ในคอลัมน์เดียว สามารถทำได้โดยใช้คลาส VectorAssembler ใช้พารามิเตอร์สองตัว: พารามิเตอร์ตัวแรกคือ inputCols ซึ่งรับรายการของแอตทริบิวต์อิสระ พารามิเตอร์ตัวที่สองคือ outputCol ซึ่งกำหนดเวกเตอร์ inputCols ทั้งหมดให้เป็นตัวแปรนี้

แอสเซมเบลอร์ = VectorAssembler (inputCols = [คอลัมน์…], เอาต์พุต Col = vectorized_data)

5. การแปลงร่าง: ตอนนี้ เตรียมข้อมูลของคุณโดยการแปลงคอลัมน์ที่อัปเดต (ขั้นตอนที่ 3) โดยใช้ฟังก์ชันการแปลง ()



แอสเซมเบลอร์. แปลง (inxed_data)

6. การเตรียมข้อมูลสำหรับการฝึกอบรมและการทดสอบ: ในขั้นตอนนี้ เราแบ่งข้อมูลออกเป็น 'การฝึกอบรม' และ 'การทดสอบ' จะดีกว่าถ้าเราแบ่งข้อมูล 70% เพื่อฝึกโมเดลและข้อมูล 30% เพื่อทดสอบโมเดล สามารถทำได้โดยใช้เมธอด RandomSplit() ใช้รายการที่มีค่าทศนิยมสองค่า: ค่าหนึ่งสำหรับการแยกทดสอบและอีกค่าหนึ่งสำหรับการแยกรถไฟ

train_data,test_data=final_data.select([ 'คุณสมบัติ' ,target_column]).randomSplit([0.70.0.30])

7. การติดตั้งแบบจำลองและการประเมิน : ถึงเวลาปรับโมเดล Logistic Regression โมเดล Logistic Regression มีอยู่ในโมดูล pyspark.ml.classification ใช้ป้ายกำกับคลาส/คอลัมน์เป้าหมาย ซึ่งส่งผลให้คอลัมน์ rawPrediction ความน่าจะเป็น และการคาดคะเน ผลลัพธ์ของเราถูกเก็บไว้ในคอลัมน์การทำนาย

#ฟิตหุ่น

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

#แบบประเมิน

train_results=logistic_regression_model.evaluate(train_data).predictions

8. ความแม่นยำ & ผลลัพธ์: นี่คือขั้นตอนสุดท้ายที่เราทดสอบความแม่นยำของโมเดลโดยใช้เทคนิคการทดสอบใดๆ

ลองดูโครงการต่อไปนี้ที่เราคาดการณ์ว่าบุคคลหนึ่งจะได้รับผลกระทบจากโรคหลอดเลือดสมองหรือไม่โดยใช้แบบจำลองการถดถอยโลจิสติก

การทำนายจังหวะ

9. ติดตั้งโมดูล PySpark ในสภาพแวดล้อมของคุณ ต่อไปนี้เป็นคำสั่งในการติดตั้ง:

pip ติดตั้ง pyspark

10. มาสร้าง PySpark DataFrame ที่มี 10 เรกคอร์ดซึ่งเกี่ยวข้องกับรายละเอียดโรคหลอดเลือดสมองของคน 10 คน สำหรับการสาธิต เราสร้าง DataFrame โดยไม่มี CSV มี 7 คอลัมน์ใน DataFrame นี้ “เพศ”, “ระดับกลูโคส”, “สมรส”, “อายุ”, “โรคหัวใจ”, “ความดันโลหิตสูง” เป็นแอตทริบิวต์อิสระ และ “โรคหลอดเลือดสมอง” เป็นป้ายกำกับระดับหรือแอตทริบิวต์ที่ขึ้นอยู่กับ นั่นหมายความว่าจังหวะของบุคคลนั้นขึ้นอยู่กับคุณลักษณะที่เป็นอิสระเหล่านี้

นำเข้า pyspark

จาก pyspark.sql นำเข้า SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'คำแนะนำลินุกซ์' ).getOrCreate()

stoke_data = [

{ 'เพศ' : 'หญิง' , 'อายุ' : ห้าสิบ , 'โรคหัวใจ' : 'ใช่' ,

'ความดันโลหิตสูง' : 'ใช่' , 'แต่งงานแล้ว' : 'ใช่' , 'ระดับน้ำตาลกลูโคส' : 130 , 'จังหวะ' : 1 },

{ 'เพศ' : 'ชาย' , 'อายุ' : ยี่สิบ , 'โรคหัวใจ' : 'เลขที่' ,

'ความดันโลหิตสูง' : 'ใช่' , 'แต่งงานแล้ว' : 'เลขที่' , 'ระดับน้ำตาลกลูโคส' : 97 , 'จังหวะ' : 0 },

{ 'เพศ' : 'ชาย' , 'อายุ' : 12 , 'โรคหัวใจ' : 'เลขที่' ,

'ความดันโลหิตสูง' : 'เลขที่' , 'แต่งงานแล้ว' : 'เลขที่' , 'ระดับน้ำตาลกลูโคส' : 98 , 'จังหวะ' : 0 },

{ 'เพศ' : 'หญิง' , 'อายุ' : 90 , 'โรคหัวใจ' : 'เลขที่' ,

'ความดันโลหิตสูง' : 'เลขที่' , 'แต่งงานแล้ว' : 'ใช่' , 'ระดับน้ำตาลกลูโคส' : 170 , 'จังหวะ' : 1 },

{ 'เพศ' : 'ชาย' , 'อายุ' : 43 , 'โรคหัวใจ' : 'ใช่' ,

'ความดันโลหิตสูง' : 'ใช่' , 'แต่งงานแล้ว' : 'ใช่' , 'ระดับน้ำตาลกลูโคส' : 150 , 'จังหวะ' : 1 },

{ 'เพศ' : 'หญิง' , 'อายุ' : ยี่สิบเอ็ด , 'โรคหัวใจ' : 'เลขที่' ,

'ความดันโลหิตสูง' : 'เลขที่' , 'แต่งงานแล้ว' : 'ใช่' , 'ระดับน้ำตาลกลูโคส' : 110 , 'จังหวะ' : 0 },

{ 'เพศ' : 'หญิง' , 'อายุ' : ห้าสิบ , 'โรคหัวใจ' : 'ใช่' ,

'ความดันโลหิตสูง' : 'เลขที่' , 'แต่งงานแล้ว' : 'ใช่' , 'ระดับน้ำตาลกลูโคส' : 100 , 'จังหวะ' : 0 },

{ 'เพศ' : 'ชาย' , 'อายุ' : 3. 4 , 'โรคหัวใจ' : 'เลขที่' ,

'ความดันโลหิตสูง' : 'ใช่' , 'แต่งงานแล้ว' : 'ใช่' , 'ระดับน้ำตาลกลูโคส' : 190 , 'จังหวะ' : 1 },

{ 'เพศ' : 'ชาย' , 'อายุ' : 10 , 'โรคหัวใจ' : 'เลขที่' ,

'ความดันโลหิตสูง' : 'เลขที่' , 'แต่งงานแล้ว' : 'เลขที่' , 'ระดับน้ำตาลกลูโคส' : 90 , 'จังหวะ' : 0 },

{ 'เพศ' : 'หญิง' , 'อายุ' : 56 , 'โรคหัวใจ' : 'ใช่' ,

'ความดันโลหิตสูง' : 'ใช่' , 'แต่งงานแล้ว' : 'ใช่' , 'ระดับน้ำตาลกลูโคส' : 145 , 'จังหวะ' : 1 }

]

# สร้าง dataframe จากข้อมูลด้านบน

stroke_df = linuxhint_spark_app.createDataFrame (สโต๊ค_ดาต้า)

# stoke_df จริง

stroke_df.show()

เอาท์พุต:

11. แสดงคอลัมน์อิสระโดยใช้วิธีการเลือก ()

# แสดงแอตทริบิวต์อิสระ

stroke_df.select(จังหวะ_df[ 'เพศ' ], stroke_df [ 'ระดับน้ำตาลกลูโคส' ], stroke_df [ 'แต่งงานแล้ว' ], stroke_df [ 'อายุ' ], stroke_df [ 'โรคหัวใจ' ], stroke_df [ 'hyper_tension' ]).แสดง()

เอาท์พุต:

12. แสดงค่าเฉพาะที่มีอยู่ในแอตทริบิวต์เป้าหมาย (Stroke)

# ค่าเฉพาะแอตทริบิวต์เป้าหมาย

stroke_df.select(จังหวะ_df[ 'จังหวะ' ]).แตกต่าง().แสดง()

เอาท์พุต:

13. ส่งคืนชนิดข้อมูลของคอลัมน์ทั้งหมดโดยใช้ฟังก์ชัน printSchema()

# กลับประเภทข้อมูลของคอลัมน์ทั้งหมด

stroke_df.printSchema()

เอาท์พุต:

เราจะเห็นว่า 4 คอลัมน์เป็นประเภทสตริง ลองแปลงเป็นค่าตัวเลขเชิงหมวดหมู่

14. ลองแปลงค่าหมวดหมู่ของสตริงเป็นค่าหมวดหมู่ที่เป็นตัวเลขโดยใช้ StringIndexer ในคอลัมน์ “Gender”, “heart_disease”, “hyper_tension” และ “married” และเขียนค่าเหล่านี้ลงในคอลัมน์ Categotical_Gender, Categotical_heart_disease, Categotical_hyper_tension และ Categotical_married เก็บคอลัมน์ไว้ใน dataFrame indexed_data โดยใช้เมธอด fit()

จาก pyspark.ml.feature นำเข้า StringIndexer

# แปลงค่าหมวดหมู่สตริงเป็นค่าหมวดหมู่ตัวเลขในคอลัมน์ 'เพศ'

indexer_data=StringIndexer(inputCol= 'เพศ' ,outputCol= 'หมวดหมู่_เพศ' )

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

# แปลงค่าหมวดหมู่สตริงเป็นค่าหมวดหมู่ตัวเลขในคอลัมน์ 'heart_disease'

indexer_data=StringIndexer(inputCol= 'โรคหัวใจ' ,outputCol= 'โรคประจำตัว_หัวใจ_โรค' )

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

# แปลงค่าหมวดหมู่สตริงเป็นค่าหมวดหมู่ตัวเลขในคอลัมน์ 'hyper_tension'

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

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

# แปลงค่าหมวดหมู่สตริงเป็นค่าหมวดหมู่ตัวเลขในคอลัมน์ 'แต่งงาน'

indexer_data=StringIndexer(inputCol= 'แต่งงานแล้ว' ,outputCol= 'Categotical_married' )

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

#แสดงการปรับปรุง

indexed_data.show()

เอาท์พุต:

15. แปลงคอลัมน์อิสระเป็นเวกเตอร์โดยใช้แอสเซมเบลอร์เวกเตอร์ ชื่อเวกเตอร์คือ 'คุณสมบัติ'

จาก pyspark.ml.feature นำเข้า VectorAssembler

แอสเซมเบลอร์ = VectorAssembler (อินพุต Cols = [ 'หมวดหมู่_เพศ' , 'โรคประจำตัว_หัวใจ_โรค' , 'Categotical_hyper_tension' , 'Categotical_married' , 'อายุ' ,

'ระดับน้ำตาลกลูโคส' ],outputCol= 'คุณสมบัติ' )

16. แปลงข้อมูลก่อนหน้าเป็น DataFrame สุดท้ายโดยใช้ฟังก์ชัน transform() และแสดงผลโดยใช้ฟังก์ชัน show()

เอาท์พุต:

17. เตรียมข้อมูลสำหรับการฝึกและการทดสอบโดยแบ่งเป็น 70-30 'คุณสมบัติ' ถูกเก็บไว้ใน train_data และ 'จังหวะ' ถูกเก็บไว้ใน test_data

#เตรียมข้อมูลสำหรับการฝึกอบรมและการทดสอบ

train_data,test_data=final.select([ 'คุณสมบัติ' , 'จังหวะ' ]).สุ่มแยก([ 0.70 , 0.30 น ])

18. พอดีกับแบบจำลองการถดถอยโลจิสติกและประเมินผล

จาก pyspark.ml.classification นำเข้า LogisticRegression

#ฟิตหุ่น

logistic_regression_model=LogisticRegression(labelCol= 'จังหวะ' ).พอดี(train_data)

#แบบประเมิน

train_results=logistic_regression_model.evaluate(train_data).predictions

รถไฟ_results.show()

เอาท์พุต:

19. ใช้ BinaryClassificationEvaluator เพื่อตรวจสอบความถูกต้องของโมเดล เราจะเห็นว่าแบบจำลองของเรามีความแม่นยำ 100%

จาก pyspark.ml.evaluation นำเข้า BinaryClassificationEvaluator

# เรียก BinaryClassificationEvaluator

ผลลัพธ์ = BinaryClassificationEvaluator(rawPredictionCol= 'การทำนาย' ,labelCol= 'จังหวะ' )

ROC_AUC = ผลลัพธ์การประเมิน (train_results)

พิมพ์ (ROC_AUC * 100 , '% ความแม่นยำ' )

บทสรุป

คุณสามารถทำนายปัญหาการจำแนกไทล์จริงได้โดยใช้โมเดล Logistic Regression ใน PySpark การลบค่าว่าง/ค่าที่ขาดหายไปมีความสำคัญเนื่องจากลดการประเมินโมเดลและความแม่นยำ การประมวลผลล่วงหน้าเป็นขั้นตอนที่จำเป็นก่อนที่จะปรับโมเดลแมชชีนเลิร์นนิงให้เหมาะสม ตรวจสอบให้แน่ใจว่าคุณทำตามขั้นตอนนี้อย่างถูกต้องและแม่นยำ