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