رگرسیون خطی با آپاچی MLlib — راهنمای کاربردی

در این مطلب، پیاده‌سازی رگرسیون خطی با آپاچی MLlib آموزش داده شده است.

رگرسیون خطی با آپاچی MLlib

ابتدا، مسئله‌ای که قرار است با استفاده از رگرسیون خطی و پیاده سازی آن با آپاچی MLlib یا در واقع Apache MLlib حل شود مورد بررسی قرار می‌گیرد. مسئله، ساختن یک مدل پیش‌بین برای یک شرکت حمل و نقل دریایی است تا تعداد اعضای خدمه یک کشتی برای یک سفر خاص، تخمین زده شود. این مجموعه داده شامل ۱۵۹ نمونه با ۹ ویژگی است. توضیحات بیشتر پیرامون مجموعه داده مورد استفاده در ادامه ارائه شده است. برای دانلود مجموعه داده اینجا [+] کلیک کنید.

  • نام کشتی (Ship Name)
  • کشتیرانی گردشی (خط کروز | Cruise Line)
  • سن (Age | از سال ۲۰۱۳)
  • گنجایش کشتی برحسب تن ( Tonnage | هزار تن)
  • مسافران (Passengers | صد نفر)
  • طول (Length | صد فوت یا ۳۰٫۴۸ سانتی‌متر)
  • کابین‌ها (Cabin | صد تا)
  • تراکم مسافران (Passenger Density)
  • خدمه (Crew | خدمه)

در ادامه یک مدل رگرسیون خطی که تعداد اعضای خدمه را محاسبه می‌کند ارائه شده است.

import pyspark 
from pyspark.sql import SparkSession 
#SparkSession is now the entry point of Spark 
#SparkSession can also be construed as gateway to spark libraries 
  
#create instance of spark class 
spark=SparkSession.builder.appName('housing_price_model').getOrCreate() 
  
#create spark dataframe of input csv file 
df=spark.read.csv('D:\python coding\pyspark_tutorial\Linear regression\cruise_ship_info.csv'
                  ,inferSchema=True,header=True) 
df.show(10)

خروجی قطعه کد بالا به صورت زیر است.

+———–+———–+—+——————+———-+——+——+—————–+—-+
| Ship_name|Cruise_line|Age| Tonnage|passengers|length|cabins|passenger_density|crew|
+———–+———–+—+——————+———-+——+——+—————–+—-+
| Journey| Azamara| 6|30.276999999999997| 6.94| 5.94| 3.55| 42.64|3.55|
| Quest| Azamara| 6|30.276999999999997| 6.94| 5.94| 3.55| 42.64|3.55|
|Celebration| Carnival| 26| 47.262| 14.86| 7.22| 7.43| 31.8| 6.7|
| Conquest| Carnival| 11| 110.0| 29.74| 9.53| 14.88| 36.99|19.1|
| Destiny| Carnival| 17| 101.353| 26.42| 8.92| 13.21| 38.36|10.0|
| Ecstasy| Carnival| 22| 70.367| 20.52| 8.55| 10.2| 34.29| 9.2|
| Elation| Carnival| 15| 70.367| 20.52| 8.55| 10.2| 34.29| 9.2|
| Fantasy| Carnival| 23| 70.367| 20.56| 8.55| 10.22| 34.23| 9.2|
|Fascination| Carnival| 19| 70.367| 20.52| 8.55| 10.2| 34.29| 9.2|
| Freedom| Carnival| 6|110.23899999999999| 37.0| 9.51| 14.87| 29.79|11.5|
+———–+———–+—+——————+———-+——+——+—————–+—-+

 

برای چاپ شدن «ساختار چارچوب داده» (Structure of Dataframe) همراه با «نوع داده» (Data Type) از دستور زیر استفاده می‌شود.

#prints structure of dataframe along with datatype 
df.printSchema()

خروجی دستور بالا به صورت زیر است.

رگرسیون خطی با آپاچی MLlib -- راهنمای کاربردی

ستون‌های موجود در مجموعه داده را با استفاده از دستور زیر می‌توان چاپ کرد.

#In our predictive model, below are the columns 
df.columns

خروجی قطعه کد بالا به صورت زیر است.

رگرسیون خطی با آپاچی MLlib -- راهنمای کاربردی

ستون‌های ویژگی‌ها به صورت [‘Cruise_line’,’Age’,’Tonnage’,’passengers’,’length’,’cabins’,’passenger_density’] تعیین شده‌اند. برای کار روی ویژگی‌ها، Spark MLlib انتظار دارد که مقادیر به صورت عددی باشند. این در حالی است که نوع داده ویژگی Cruise_line به صورت رشته است. با استفاده از StringIndexer، نوع داده رشته به نوع داده عددی تغییر (Typecast) می‌کند. در این راستا، از قطعه کد زیر استفاده می‌شود.

#columns identified as features are as below: 
#['Cruise_line','Age','Tonnage','passengers','length','cabins','passenger_density'] 
#to work on the features, spark MLlib expects every value to be in numeric form 
#feature 'Cruise_line is string datatype 
#using StringIndexer, string type will be typecast to numeric datatype 
#import library strinindexer for typecasting 
  
from pyspark.ml.feature import StringIndexer 
indexer=StringIndexer(inputCol='Cruise_line',outputCol='cruise_cat') 
indexed=indexer.fit(df).transform(df) 
  
#above code will convert string to numeric feature and create a new dataframe 
#new dataframe contains a new feature 'cruise_cat' and can be used further 
#feature cruise_cat is now vectorized and can be used to fed to model 
for item in indexed.head(5): 
    print(item) 
    print('\n')

خروجی قطعه کد بالا به صورت زیر است.

Row(Ship_name=’Journey’, Cruise_line=’Azamara’, Age=6,
Tonnage=30.276999999999997, passengers=6.94, length=5.94,
cabins=3.55, passenger_density=42.64, crew=3.55, cruise_cat=16.0)

Row(Ship_name=’Quest’, Cruise_line=’Azamara’, Age=6,
Tonnage=30.276999999999997, passengers=6.94, length=5.94,
cabins=3.55, passenger_density=42.64, crew=3.55, cruise_cat=16.0)

Row(Ship_name=’Celebration’, Cruise_line=’Carnival’, Age=26,
Tonnage=47.262, passengers=14.86, length=7.22,
cabins=7.43, passenger_density=31.8, crew=6.7, cruise_cat=1.0)

Row(Ship_name=’Conquest’, Cruise_line=’Carnival’, Age=11,
Tonnage=110.0, passengers=29.74, length=9.53,
cabins=14.88, passenger_density=36.99, crew=19.1, cruise_cat=1.0)

Row(Ship_name=’Destiny’, Cruise_line=’Carnival’, Age=17,
Tonnage=101.353, passengers=26.42, length=8.92,
cabins=13.21, passenger_density=38.36, crew=10.0, cruise_cat=1.0

در ادامه، از کتابخانه Apache MLlib ماژول‌های Vectors و VectorAssembler وارد می‌شوند. سپس، بردار ویژگی‌ها ساخته می‌شود. قطعه کد لازم برای انجام این کار در ادامه ارائه شده است.

from pyspark.ml.linalg import Vectors 
from pyspark.ml.feature import VectorAssembler 
#creating vectors from features 
#Apache MLlib takes input if vector form 
assembler=VectorAssembler(inputCols=['Age', 
 'Tonnage', 
 'passengers', 
 'length', 
 'cabins', 
 'passenger_density', 
 'cruise_cat'],outputCol='features') 
output=assembler.transform(indexed) 
output.select('features','crew').show(5) 
#output as below

خروجی قطعه کد بالا به صورت زیر است.

رگرسیون خطی با آپاچی MLlib -- راهنمای کاربردی

داده‌های نهایی جاوی ویژگی‌ها و برچسب آن‌ها است که در واقع خدمه است. 

#final data consist of features and label which is crew. 
final_data=output.select('features','crew') 
#splitting data into train and test 
train_data,test_data=final_data.randomSplit([0.7,0.3]) 
train_data.describe().show()

خروجی قطعه کد بالا به صورت زیر است.

رگرسیون خطی با آپاچی MLlib -- راهنمای کاربردی

test_data.describe().show()

رگرسیون خطی با آپاچی MLlib -- راهنمای کاربردی

در ادامه، کتابخانه رگرسیون خطی، فراخوانی و یک شی از کلاس LinearRegression  ساخته می‌شود. این شی، ویژگی و برچسب را به عنوان آرگومان ورودی دریافت می‌کند. سپس، داده‌های آموزش به مدل پاس داده و در نهایت مدل آموزش دیده ارزیابی می‌شود.

#import LinearRegression library 
from pyspark.ml.regression import LinearRegression 
#creating an object of class LinearRegression 
#object takes features and label as input arguments 
ship_lr=LinearRegression(featuresCol='features',labelCol='crew') 
#pass train_data to train model 
trained_ship_model=ship_lr.fit(train_data) 
#evaluating model trained for Rsquared error 
ship_results=trained_ship_model.evaluate(train_data) 
  
print('Rsquared Error :',ship_results.r2) 
#R2 value shows accuracy of model is 92% 
#model accuracy is very good and can be use for predictive analysis

خروجی قطعه کد بالا به صورت زیر است.

رگرسیون خطی با آپاچی MLlib -- راهنمای کاربردی

#testing Model on unlabeled data 
#create unlabeled data from test_data 
#testing model on unlabeled data 
unlabeled_data=test_data.select('features') 
unlabeled_data.show(5)

خروجی قطعه کد بالا به صورت زیر است.

رگرسیون خطی با آپاچی MLlib -- راهنمای کاربردی

predictions=trained_ship_model.transform(unlabeled_data) 
predictions.show() 
#below are the results of output from test data

خروجی قطعه کد بالا به صورت زیر است.

رگرسیون خطی با آپاچی MLlib -- راهنمای کاربردی

منبع [+]

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *