สร้างแบบจําลองการเรียนรู้ของเครื่องด้วย Apache Spark MLlib
ในบทความนี้ คุณจะได้เรียนรู้วิธีการใช้ Apache Spark MLlib เพื่อสร้างแอปพลิเคชันการเรียนรู้ของเครื่องที่จัดการการวิเคราะห์เชิงทํานายอย่างง่ายบนชุดข้อมูลแบบเปิดของ Azure Spark มีไลบรารีการเรียนรู้ของเครื่องอยู่แล้วภายใน ตัวอย่างนี้ใช้ การจัดประเภท ผ่านการถดถอยโลจิสติกส์
ไลบรารี SparkML และ MLlib Spark หลักมีโปรแกรมอรรถประโยชน์มากมายที่มีประโยชน์สําหรับงานการเรียนรู้ของเครื่อง ยูทิลิตี้เหล่านี้เหมาะสําหรับ:
- การจัดประเภท
- การจัดกลุ่มคลัสเตอร์
- การทดสอบสมมติฐานและการคํานวณสถิติตัวอย่าง
- การถดถอย
- การวิเคราะห์การแยกย่อยค่าเอกพจน์ (SVD) และการวิเคราะห์คอมโพเนนต์หลัก (PCA)
- การสร้างแบบจําลองหัวข้อ
ทําความเข้าใจเกี่ยวกับการจัดประเภทและการถดถอยโลจิสติกส์
การจัดประเภท งานการเรียนรู้ของเครื่องที่ได้รับความนิยม เกี่ยวข้องกับการเรียงลําดับข้อมูลป้อนเข้าเป็นประเภท อัลกอริทึมการจัดประเภทควรหาวิธีกําหนด ป้ายชื่อ ให้กับข้อมูลป้อนเข้าที่ให้มา ตัวอย่างเช่น อัลกอริทึมการเรียนรู้ของเครื่องสามารถรับข้อมูลสต็อกเป็นข้อมูลป้อนเข้า และแบ่งหุ้นออกเป็นสองประเภท: หุ้นที่คุณควรขายและหุ้นที่คุณควรเก็บไว้
อัลกอริทึมการถดถอยโลจิสติกมีประโยชน์สําหรับการจัดประเภท API การถดถอยโลจิสติกของ Spark มีประโยชน์สําหรับ การจัดประเภท ข้อมูลอินพุตแบบไบนารีลงในหนึ่งในสองกลุ่ม สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการกระจายโลจิสติกส์ โปรดดูที่วิกิพีเดีย
การถดถอยโลจิสติกส์สร้าง ฟังก์ชัน โลจิสติกส์ที่สามารถคาดการณ์ความน่าจะเป็นที่เวกเตอร์อินพุตเป็นของกลุ่มหนึ่งหรืออีกกลุ่มหนึ่ง
ตัวอย่างการวิเคราะห์เชิงทํานายของข้อมูลแท็กซี่ของ NYC
ก่อนอื่น ติดตั้งazureml-opendatasets
ข้อมูลจะพร้อมใช้งานผ่านทรัพยากร Azure Open Datasets ชุดข้อมูลนี้โฮสต์ข้อมูลเกี่ยวกับการเดินทางด้วยรถแท็กซี่สีเหลือง รวมถึงเวลาเริ่มต้น เวลาสิ้นสุด ตําแหน่งเริ่มต้น ตําแหน่งสิ้นสุด ค่าใช้จ่ายการเดินทาง และแอตทริบิวต์อื่น ๆ
%pip install azureml-opendatasets
ส่วนที่เหลือของบทความนี้ขึ้นอยู่กับ Apache Spark เพื่อทําการวิเคราะห์บางอย่างเกี่ยวกับข้อมูลคําแนะนําการเดินทางโดยแท็กซี่ของ NYC จากนั้นจึงพัฒนาแบบจําลองเพื่อคาดการณ์ว่าการเดินทางเฉพาะนั้นมีเคล็ดลับหรือไม่
สร้างแบบจําลองการเรียนรู้ของเครื่อง Apache Spark
สร้างสมุดบันทึก PySpark สําหรับข้อมูลเพิ่มเติม โปรดเยี่ยมชม สร้างสมุดบันทึก
นําเข้าชนิดที่จําเป็นสําหรับสมุดบันทึกนี้
import matplotlib.pyplot as plt from datetime import datetime from dateutil import parser from pyspark.sql.functions import unix_timestamp, date_format, col, when from pyspark.ml import Pipeline from pyspark.ml import PipelineModel from pyspark.ml.feature import RFormula from pyspark.ml.feature import OneHotEncoder, StringIndexer, VectorIndexer from pyspark.ml.classification import LogisticRegression from pyspark.mllib.evaluation import BinaryClassificationMetrics from pyspark.ml.evaluation import BinaryClassificationEvaluator
เราจะใช้ MLflow เพื่อติดตามการทดลองการเรียนรู้ของเครื่องและการเรียกใช้ที่สอดคล้องกัน ถ้าเปิดใช้งานการล็อกอัตโนมัติของ Microsoft Fabric เมตริกและพารามิเตอร์ที่สอดคล้องกันจะถูกบันทึกโดยอัตโนมัติ
import mlflow
สร้าง DataFrame อินพุต
ตัวอย่างนี้โหลดข้อมูลลงในกรอบข้อมูล Pandas แล้วแปลงเป็นกรอบข้อมูล Apache Spark ในรูปแบบนั้น เราสามารถใช้การดําเนินการ Apache Spark อื่น ๆ เพื่อทําความสะอาดและกรองชุดข้อมูลได้
วางบรรทัดเหล่านี้ลงในเซลล์ใหม่ และเรียกใช้เพื่อสร้าง Spark DataFrame ขั้นตอนนี้ดึงข้อมูลผ่าน API ชุดข้อมูลที่เปิด เราสามารถกรองข้อมูลนี้ลงเพื่อตรวจสอบหน้าต่างเฉพาะของข้อมูลได้ ตัวอย่างโค้ดใช้
start_date
และend_date
เพื่อใช้ตัวกรองที่ส่งกลับข้อมูลเดือนเดียวfrom azureml.opendatasets import NycTlcYellow end_date = parser.parse('2018-06-06') start_date = parser.parse('2018-05-01') nyc_tlc = NycTlcYellow(start_date=start_date, end_date=end_date) nyc_tlc_pd = nyc_tlc.to_pandas_dataframe() nyc_tlc_df = spark.createDataFrame(nyc_tlc_pd).repartition(20)
รหัสนี้จะลดชุดข้อมูลประมาณ 10,000 แถว เพื่อให้การพัฒนาและการฝึกอบรมเร็วขึ้น ตัวอย่างโค้ดจะลดชุดข้อมูลของเราในตอนนี้
# To make development easier, faster, and less expensive, sample down for now sampled_taxi_df = nyc_tlc_df.sample(True, 0.001, seed=1234)
เราต้องการดูข้อมูลของเราโดยใช้คําสั่งที่มีอยู่
display()
ภายใน ด้วยคําสั่งนี้ เราสามารถดูตัวอย่างข้อมูลได้อย่างง่ายดาย หรือสํารวจแนวโน้มในข้อมูลด้วยกราฟิก#sampled_taxi_df.show(10) display(sampled_taxi_df.limit(10))
เตรียมข้อมูล
การเตรียมข้อมูลเป็นขั้นตอนสําคัญในกระบวนการเรียนรู้ของเครื่อง ซึ่งเกี่ยวข้องกับการทําความสะอาด การแปลง และการจัดระเบียบข้อมูลดิบ เพื่อให้เหมาะสําหรับการวิเคราะห์และการวางรูปแบบ ในตัวอย่างรหัสนี้ คุณดําเนินการขั้นตอนการเตรียมข้อมูลหลายขั้นตอน:
- กรองชุดข้อมูลเพื่อลบค่าผิดปกติและค่าที่ไม่ถูกต้อง
- ลบคอลัมน์ที่ไม่จําเป็นสําหรับการฝึกแบบจําลอง
- สร้างคอลัมน์ใหม่จากข้อมูลดิบ
- สร้างป้ายกํากับเพื่อกําหนดว่าการเดินทางโดยแท็กซี่เกี่ยวข้องกับเคล็ดลับหรือไม่
taxi_df = sampled_taxi_df.select('totalAmount', 'fareAmount', 'tipAmount', 'paymentType', 'rateCodeId', 'passengerCount'\
, 'tripDistance', 'tpepPickupDateTime', 'tpepDropoffDateTime'\
, date_format('tpepPickupDateTime', 'hh').alias('pickupHour')\
, date_format('tpepPickupDateTime', 'EEEE').alias('weekdayString')\
, (unix_timestamp(col('tpepDropoffDateTime')) - unix_timestamp(col('tpepPickupDateTime'))).alias('tripTimeSecs')\
, (when(col('tipAmount') > 0, 1).otherwise(0)).alias('tipped')
)\
.filter((sampled_taxi_df.passengerCount > 0) & (sampled_taxi_df.passengerCount < 8)\
& (sampled_taxi_df.tipAmount >= 0) & (sampled_taxi_df.tipAmount <= 25)\
& (sampled_taxi_df.fareAmount >= 1) & (sampled_taxi_df.fareAmount <= 250)\
& (sampled_taxi_df.tipAmount < sampled_taxi_df.fareAmount)\
& (sampled_taxi_df.tripDistance > 0) & (sampled_taxi_df.tripDistance <= 100)\
& (sampled_taxi_df.rateCodeId <= 5)
& (sampled_taxi_df.paymentType.isin({"1", "2"}))
)
ถัดไป ให้ส่งผ่านข้อมูลเป็นครั้งที่สองเพื่อเพิ่มคุณลักษณะสุดท้าย
taxi_featurised_df = taxi_df.select('totalAmount', 'fareAmount', 'tipAmount', 'paymentType', 'passengerCount'\
, 'tripDistance', 'weekdayString', 'pickupHour','tripTimeSecs','tipped'\
, when((taxi_df.pickupHour <= 6) | (taxi_df.pickupHour >= 20),"Night")\
.when((taxi_df.pickupHour >= 7) & (taxi_df.pickupHour <= 10), "AMRush")\
.when((taxi_df.pickupHour >= 11) & (taxi_df.pickupHour <= 15), "Afternoon")\
.when((taxi_df.pickupHour >= 16) & (taxi_df.pickupHour <= 19), "PMRush")\
.otherwise(0).alias('trafficTimeBins')
)\
.filter((taxi_df.tripTimeSecs >= 30) & (taxi_df.tripTimeSecs <= 7200))
สร้างแบบจําลองการถดถอยโลจิสติกส์
งานสุดท้ายจะแปลงข้อมูลที่ติดป้ายชื่อเป็นรูปแบบที่การถดถอยโลจิสติกส์สามารถจัดการได้ ข้อมูลป้อนเข้าไปยังอัลกอริทึมการถดถอยโลจิสติกจะต้องมี โครงสร้างป้ายชื่อ /เวกเตอร์คุณลักษณะ ซึ่ง เวกเตอร์ คุณลักษณะคือเวกเตอร์ของตัวเลขที่แสดงจุดอินพุต
เราต้องแปลงคอลัมน์ประเภทเป็นตัวเลข โดยยึดตามข้อกําหนดของงานขั้นสุดท้าย โดยเฉพาะอย่างยิ่ง เราต้องแปลง trafficTimeBins
คอลัมน์ และ weekdayString
เป็นการแสดงจํานวนเต็ม เรามีทางเลือกมากมายในการจัดการความต้องการนี้ ตัวอย่างนี้เกี่ยวข้องกับ OneHotEncoder
วิธีการ:
# Because the sample uses an algorithm that works only with numeric features, convert them so they can be consumed
sI1 = StringIndexer(inputCol="trafficTimeBins", outputCol="trafficTimeBinsIndex")
en1 = OneHotEncoder(dropLast=False, inputCol="trafficTimeBinsIndex", outputCol="trafficTimeBinsVec")
sI2 = StringIndexer(inputCol="weekdayString", outputCol="weekdayIndex")
en2 = OneHotEncoder(dropLast=False, inputCol="weekdayIndex", outputCol="weekdayVec")
# Create a new DataFrame that has had the encodings applied
encoded_final_df = Pipeline(stages=[sI1, en1, sI2, en2]).fit(taxi_featurised_df).transform(taxi_featurised_df)
การดําเนินการนี้ส่งผลให้ DataFrame ใหม่มีคอลัมน์ทั้งหมดในรูปแบบที่เหมาะสมในการฝึกแบบจําลอง
ฝึกแบบจําลองการถดถอยโลจิสติกส์
งานแรกจะแยกชุดข้อมูลออกเป็นชุดการฝึกและการทดสอบหรือชุดการตรวจสอบ
# Decide on the split between training and test data from the DataFrame
trainingFraction = 0.7
testingFraction = (1-trainingFraction)
seed = 1234
# Split the DataFrame into test and training DataFrames
train_data_df, test_data_df = encoded_final_df.randomSplit([trainingFraction, testingFraction], seed=seed)
เมื่อเรามี DataFrames สองรายการ เราต้องสร้างสูตรแบบจําลองและเรียกใช้เทียบกับ DataFrame สําหรับการฝึก จากนั้นเราสามารถตรวจสอบกับ DataFrame ทดสอบได้ ทดลองสูตรแบบจําลองในเวอร์ชันต่างๆ เพื่อดูผลกระทบของชุดค่าผสมที่แตกต่างกัน
## Create a new logistic regression object for the model
logReg = LogisticRegression(maxIter=10, regParam=0.3, labelCol = 'tipped')
## The formula for the model
classFormula = RFormula(formula="tipped ~ pickupHour + weekdayVec + passengerCount + tripTimeSecs + tripDistance + fareAmount + paymentType+ trafficTimeBinsVec")
## Undertake training and create a logistic regression model
lrModel = Pipeline(stages=[classFormula, logReg]).fit(train_data_df)
## Predict tip 1/0 (yes/no) on the test dataset; evaluation using area under ROC
predictions = lrModel.transform(test_data_df)
predictionAndLabels = predictions.select("label","prediction").rdd
metrics = BinaryClassificationMetrics(predictionAndLabels)
print("Area under ROC = %s" % metrics.areaUnderROC)
ผลลัพธ์ของเซลล์:
Area under ROC = 0.9749430523917996
สร้างการแสดงภาพของการคาดการณ์
ตอนนี้เราสามารถสร้างการแสดงภาพขั้นสุดท้ายเพื่อแปลผลลัพธ์แบบจําลองได้แล้ว เส้น โค้ง ROC สามารถแสดงผลลัพธ์ได้อย่างแน่นอน
## Plot the ROC curve; no need for pandas, because this uses the modelSummary object
modelSummary = lrModel.stages[-1].summary
plt.plot([0, 1], [0, 1], 'r--')
plt.plot(modelSummary.roc.select('FPR').collect(),
modelSummary.roc.select('TPR').collect())
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.show()
เนื้อหาที่เกี่ยวข้อง
- ใช้ตัวอย่าง AI เพื่อสร้างแบบจําลองการเรียนรู้ของเครื่อง: ใช้ตัวอย่าง AI
- ติดตามการทํางานของการเรียนรู้ของเครื่องโดยใช้การทดลอง: การทดลองการเรียนรู้ของเครื่อง