۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

یادگیری ماشین برای توسعه دهندگان جاوا: خطوط لوله داده های یادگیری ماشین

نحوه ساخت و استقرار یک مدل داده یادگیری ماشینی در محیط تولید مبتنی بر جاوا با استفاده از Weka، Docker و REST را بیاموزید.

نحوه ساخت و استقرار یک مدل داده یادگیری ماشینی در محیط تولید مبتنی بر جاوا با استفاده از Weka، Docker و REST را بیاموزید.

مقاله، یادگیری ماشین برای توسعه دهندگان جاوا: الگوریتم هایی برای یادگیری ماشین، راه اندازی یک الگوریتم یادگیری ماشین و توسعه یک تابع پیش بینی در جاوا را معرفی کرد. خوانندگان عملکرد درونی یک الگوریتم یادگیری ماشینی را یاد گرفتند و روند توسعه و آموزش یک مدل را طی کردند. این مقاله از جایی که آن مقاله متوقف شد ادامه می‌یابد. شما یک معرفی سریع با Weka، یک چارچوب یادگیری ماشین برای جاوا خواهید داشت. سپس، نحوه راه‌اندازی خط لوله داده‌های یادگیری ماشین را با فرآیندی گام به گام برای تبدیل مدل یادگیری ماشینی خود از توسعه به تولید خواهید دید. همچنین به طور مختصر درباره نحوه استفاده از کانتینرهای Docker و REST برای استقرار یک مدل ML آموزش‌دیده در یک محیط تولید مبتنی بر جاوا بحث خواهیم کرد.

یادداشتی درباره نویسندگان

این مقاله در اصل توسط گرگور راث نوشته شده و در JavaWorld منتشر شده است. متیو تایسون کد و چارچوب های مورد استفاده در نمونه ها را در ژانویه ۲۰۲۴ به روز کرد.

از این مقاله چه انتظاری باید داشت

استقرار یک مدل یادگیری ماشینی با توسعه یک مدل یکسان نیست. اینها بخش های مختلفی از چرخه عمر توسعه نرم افزار هستند و اغلب توسط تیم های مختلف پیاده سازی می شوند. توسعه یک مدل یادگیری ماشینی مستلزم درک داده های اساسی و داشتن درک خوبی از ریاضیات و آمار است. استقرار یک مدل یادگیری ماشین در تولید معمولاً کاری برای افرادی است که هم در زمینه مهندسی نرم افزار و هم تجربه عملیاتی دارند.

این مقاله در مورد چگونگی در دسترس قرار دادن یک مدل یادگیری ماشینی در یک محیط تولید بسیار مقیاس پذیر است. فرض بر این است که شما تجربه توسعه و درک پایه ای از مدل ها و الگوریتم های یادگیری ماشین دارید. در غیر این صورت، ممکن است بخواهید با خواندن یادگیری ماشین برای توسعه دهندگان جاوا: الگوریتم هایی برای یادگیری ماشین شروع کنید.

اجازه دهید با یک تازه‌سازی سریع در مورد یادگیری تحت نظارت، از جمله برنامه کاربردی مثالی که برای آموزش، استقرار و پردازش یک مدل یادگیری ماشین برای استفاده در تولید استفاده می‌کنیم، شروع کنیم.

یادگیری ماشینی تحت نظارت: یک تجدید کننده

یک مدل یادگیری ماشینی ساده و تحت نظارت، فرآیند استقرار ML را نشان می‌دهد. مدل نشان داده شده در شکل ۱ می تواند برای پیش بینی قیمت فروش مورد انتظار یک خانه استفاده شود.

مدل یادگیری ماشینی آموزش دیده برای پیش بینی قیمت فروش.

شکل ۱. مدل یادگیری ماشینی تحت نظارت آموزش دیده برای پیش بینی قیمت فروش.

به یاد بیاورید که مدل یادگیری ماشین تابعی با پارامترهای داخلی و قابل یادگیری است که ورودی ها را به خروجی ها ترسیم می کند. در نمودار بالا، یک تابع رگرسیون خطی، hθ(x)، برای پیش‌بینی قیمت فروش یک خانه بر اساس ویژگی‌های مختلف استفاده می‌شود. متغیرهای x تابع، داده‌های ورودی را نشان می‌دهند. متغیرهای θ (تتا) پارامترهای مدل داخلی و قابل یادگیری را نشان می‌دهند.

برای پیش بینی قیمت فروش یک خانه، ابتدا باید یک آرایه داده ورودی از متغیرهای x ایجاد کنید. این آرایه دارای ویژگی هایی مانند اندازه زمین یا تعداد اتاق های یک خانه است. این آرایه بردار ویژگی نامیده می شود.

از آنجایی که اکثر توابع یادگیری ماشین نیاز به نمایش عددی ویژگی‌ها دارند، احتمالاً مجبور خواهید بود برای ایجاد یک بردار ویژگی، برخی از تبدیل‌های داده را انجام دهید. به عنوان مثال، یک ویژگی که مکان گاراژ را مشخص می‌کند می‌تواند شامل برچسب‌هایی مانند “ضمیمه شده به خانه” یا “ساخت‌شده” باشد که باید با مقادیر عددی نگاشت شوند. وقتی پیش‌بینی قیمت خانه را اجرا می‌کنید، تابع یادگیری ماشین با این بردار ویژگی ورودی و همچنین پارامترهای مدل داخلی و آموزش‌دیده اعمال می‌شود. خروجی تابع قیمت تخمینی خانه است. این خروجی برچسب نامیده می شود.

آموزش مدل

پارامترهای مدل داخلی و قابل یادگیری (θ) بخشی از مدل هستند که از داده های آموزشی آموخته می شوند. پارامترهای قابل یادگیری در طول فرآیند آموزش تنظیم خواهند شد. یک مدل یادگیری ماشین تحت نظارت مانند آنچه در زیر نشان داده شده است باید آموزش داده شود تا بتوان پیش‌بینی‌های مفیدی انجام داد.

یک مدل یادگیری ماشینی تحت نظارت آموزش ندیده

شکل ۲. یک مدل یادگیری ماشینی تحت نظارت آموزش ندیده

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

یک مدل یادگیری ماشینی تحت نظارت آموزش دیده.

شکل ۳. یک مدل یادگیری ماشینی تحت نظارت آموزش دیده

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

الگوریتم های یادگیری ماشین در کد جاوا

HousePriceModel دو روش ارائه می دهد. یکی از آنها الگوریتم یادگیری را برای آموزش (یا براساس) مدل پیاده سازی می کند. روش دیگر برای پیش بینی استفاده می شود.

روش‌های fit() and predict() در مدل یادگیری ماشینی

شکل ۴. دو روش در یک مدل یادگیری ماشینی

روش fit()

روش fit() برای آموزش مدل استفاده می شود. ویژگی‌های خانه و همچنین قیمت‌های فروش خانه را به عنوان پارامترهای ورودی مصرف می‌کند، اما چیزی برمی‌گرداند. این روش به «پاسخ» صحیح نیاز دارد تا بتوان پارامترهای مدل داخلی خود را تنظیم کرد. الگوریتم یادگیری با استفاده از فهرست‌های مسکن همراه با قیمت‌های فروش، الگوهایی را در داده‌های آموزشی جستجو می‌کند. از اینها، پارامترهای مدل را تولید می کند که از آن الگوها تعمیم می یابد. همانطور که داده های ورودی دقیق تر می شوند، پارامترهای داخلی مدل تنظیم می شوند.


// load training data
// ...

// e.g. [{MSSubClass=60.0, LotFrontage=65.0, ...}, {MSSubClass=20.0, ...}]
List<Map<String, Double>> houses = ...;

// e.g. [208500.0, 181500.0, 223500.0, 140000.0, 250000.0, ...]
List<Double> prices = ...;

// create and train the model
var model = new HousePriceModel();
model.fit(houses, prices);

توجه داشته باشید که ویژگی های خانه در کد دوبار تایپ شده است. این به این دلیل است که الگوریتم یادگیری ماشینی که برای پیاده سازی متد fit() استفاده می شود به اعداد به عنوان ورودی نیاز دارد. همه ویژگی های خانه باید به صورت عددی نشان داده شوند تا بتوان از آنها به عنوان پارامترهای x در فرمول رگرسیون خطی استفاده کرد، همانطور که در اینجا نشان داده شده است:


hθ(x) = θ۰ * x۰ + ... + θn * xn

مدل پیش‌بینی قیمت خانه آموزش دیده می‌تواند شبیه آنچه در زیر می‌بینید باشد:


price = -490130.8527 * 1 + -241.0244 * MSSubClass + -143.716  * LotFrontage +  … * …

در اینجا، ویژگی‌های خانه ورودی مانند MSSubClass یا LotFrontage به‌عنوان متغیرهای x نشان داده می‌شوند. پارامترهای مدل قابل یادگیری (θ) با مقادیری مانند -۴۹۰۱۳۰.۸۵۲۷ یا -۲۴۱.۰۲۴۴ تنظیم می شوند که در طول فرآیند آموزش به دست آمده اند.

این مثال از یک الگوریتم یادگیری ماشینی ساده استفاده می‌کند که فقط به چند پارامتر مدل نیاز دارد. یک الگوریتم پیچیده تر، مانند یک شبکه عصبی عمیق، می تواند به میلیون ها پارامتر مدل نیاز داشته باشد. این یکی از دلایل اصلی است که چرا فرآیند آموزش چنین الگوریتم هایی به قدرت محاسباتی بالایی نیاز دارد.

روش predict()

پس از پایان آموزش مدل، می توانید از روش predict() برای تعیین قیمت تخمینی فروش یک خانه استفاده کنید. این روش داده های مربوط به ویژگی های خانه را مصرف می کند و قیمت فروش تخمینی را تولید می کند. در عمل، یک نماینده یک شرکت املاک و مستغلات می‌تواند ویژگی‌هایی مانند اندازه مقدار زیادی (lot-area)، تعداد اتاق‌ها یا کیفیت کلی خانه را برای دریافت یک فروش تخمینی وارد کند. قیمت برای یک خانه معین.

تغییر مقادیر غیر عددی

شما اغلب با مجموعه داده هایی مواجه می شوید که حاوی مقادیر غیر عددی هستند. برای مثال، مجموعه داده مسکن Ames استفاده شده برای مسابقه قیمت‌های خانه Kaggle شامل فهرست‌های عددی و متنی ویژگی‌های خانه است: p>

مجموعه داده قیمت خانه Kaggle

شکل ۵. نمونه ای از مجموعه داده Kaggle House Prices

برای پیچیده‌تر کردن کارها، مجموعه داده Kaggle شامل مقادیر خالی نیز می‌شود (با علامت NA) که توسط الگوریتم رگرسیون خطی نشان داده شده در فهرست ۱ قابل پردازش نیستند.

رکوردهای داده های دنیای واقعی اغلب ناقص، ناسازگار، فاقد رفتارها یا روندهای دلخواه هستند و ممکن است حاوی خطا باشند. این معمولاً در مواردی رخ می دهد که داده های ورودی با استفاده از منابع مختلف به یکدیگر متصل شده اند. داده های ورودی باید قبل از وارد شدن به یک مدل به یک مجموعه داده تمیز تبدیل شوند.

برای بهبود داده‌ها، باید مقدار LotFrontage عددی گمشده (NA) را جایگزین کنید. همچنین باید مقادیر متنی مانند MSZoning “RL” یا “RM” را با مقادیر عددی جایگزین کنید. این تبدیل‌ها برای تبدیل داده‌های خام به یک قالب صحیح نحوی که می‌تواند توسط مدل شما پردازش شود، ضروری است.

هنگامی که داده‌های خود را به قالبی قابل خواندن تبدیل کردید، ممکن است همچنان نیاز به ایجاد تغییرات اضافی برای بهبود کیفیت داده‌های ورودی داشته باشید. برای مثال، ممکن است مقادیری را حذف کنید که از روند کلی داده‌ها پیروی نمی‌کنند، یا دسته‌هایی را که به ندرت اتفاق می‌افتند را در یک دسته چتری قرار دهید.

تبدیل داده و یادگیری ماشین

درک این نکته مهم است که تبدیل داده ها گامی حیاتی برای یادگیری ماشینی موثر است. الگوریتم یادگیری ماشینی که انتخاب کرده‌اید ممکن است بسیار قدرتمند باشد، اما بدون داده‌های به‌خوبی آماده‌شده، الگوریتم آموزش‌دیده نمی‌تواند پیش‌بینی‌های دقیقی را ارائه دهد. دانشمندان داده معمولاً زمان زیادی را صرف نوشتن تغییرات برای بهبود کیفیت داده‌های آموزشی می‌کنند.

یادگیری ماشینی مبتنی بر جاوا با Weka

همانطور که مشاهده کردید، توسعه و آزمایش یک تابع هدف نیاز به پارامترهای پیکربندی به خوبی تنظیم شده، مانند نرخ یادگیری مناسب یا تعداد تکرار دارد. کد مثالی که تاکنون مشاهده کرده اید، مجموعه بسیار کوچکی از پارامترهای پیکربندی ممکن را منعکس می کند، و مثال ها برای خوانایی کد ساده شده اند. در عمل، احتمالاً به چارچوب‌ها، کتابخانه‌ها و ابزارهای یادگیری ماشین تکیه خواهید کرد.

اکثر چارچوب‌ها یا کتابخانه‌ها مجموعه گسترده‌ای از الگوریتم‌های یادگیری ماشین را پیاده‌سازی می‌کنند. علاوه بر این، آنها APIهای سطح بالای مناسبی را برای آموزش، اعتبارسنجی و پردازش مدل‌های داده ارائه می‌کنند. Weka یکی از محبوب ترین فریم ورک ها برای JVM است.

Weka یک کتابخانه جاوا برای استفاده برنامه‌ریزی‌شده و همچنین یک میز کار گرافیکی برای آموزش و اعتبارسنجی مدل‌های داده ارائه می‌کند. در کد زیر، کتابخانه Weka برای ایجاد یک مجموعه داده آموزشی، که شامل ویژگی ها و یک برچسب است، استفاده می شود. روش setClassIndex() برای علامت گذاری ستون برچسب استفاده می شود. در Weka، برچسب به عنوان یک کلاس تعریف می شود:


// define the feature and label attributes
ArrayList<Attribute> attributes = new ArrayList<>();
Attribute sizeAttribute = new Attribute("sizeFeature");
attributes.add(sizeAttribute);
Attribute squaredSizeAttribute = new Attribute("squaredSizeFeature");
attributes.add(squaredSizeAttribute);
Attribute priceAttribute = new Attribute("priceLabel");
attributes.add(priceAttribute);


// create and fill the features list with 5000 examples
Instances trainingDataset = new Instances("trainData", attributes, 5000);
trainingDataset.setClassIndex(trainingSet.numAttributes() - 1);
Instance instance = new DenseInstance(3);

instance.setValue(sizeAttribute, 90.0);
instance.setValue(squaredSizeAttribute, Math.pow(90.0, 2));
instance.setValue(priceAttribute, 249.0);
trainingDataset.add(instance);
Instance instance = new DenseInstance(3);
instance.setValue(sizeAttribute, 101.0);
...

مجموعه داده یا شیء Instance را نیز می توان به صورت فایل ذخیره و بارگذاری کرد. Weka از ARFF (فرمت فایل رابطه ویژگی) استفاده می کند که توسط میز کار گرافیکی Weka پشتیبانی می شود. این مجموعه داده برای آموزش تابع هدف، که به عنوان طبقه‌بند در Weka شناخته می‌شود، استفاده می‌شود.

به یاد بیاورید که برای آموزش تابع هدف، ابتدا باید الگوریتم یادگیری ماشین را انتخاب کنید. کد زیر نمونه ای از طبقه بندی کننده LinearRegression را ایجاد می کند. این طبقه بندی با فراخوانی متد buildClassifier() آموزش داده می شود. روش buildClassifier() پارامترهای تتا را بر اساس داده های آموزشی تنظیم می کند تا بهترین مدل را پیدا کند. با استفاده از Weka، لازم نیست نگران تنظیم نرخ یادگیری یا تعداد تکرار باشید. Weka همچنین مقیاس داخلی ویژگی را انجام می دهد:


Classifier targetFunction = new LinearRegression();
targetFunction.buildClassifier(trainingDataset);

هنگامی که مشخص شد، تابع هدف می تواند برای پیش بینی قیمت یک خانه استفاده شود، همانطور که در اینجا نشان داده شده است:


Instances unlabeledInstances = new Instances("predictionset", attributes, 1);
unlabeledInstances.setClassIndex(trainingSet.numAttributes() - 1);
Instance unlabeled = new DenseInstance(3);
unlabeled.setValue(sizeAttribute, 1330.0);
unlabeled.setValue(squaredSizeAttribute, Math.pow(1330.0, 2));
unlabeledInstances.add(unlabeled);

double prediction  = targetFunction.classifyInstance(unlabeledInstances.get(0));

Weka یک کلاس Evaluation برای اعتبارسنجی طبقه‌بندی‌کننده یا مدل آموزش دیده ارائه می‌کند. در کد زیر، یک مجموعه داده اعتبار سنجی اختصاصی برای جلوگیری از نتایج مغرضانه استفاده شده است. اقداماتی مانند هزینه یا نرخ خطا در کنسول چاپ می شود. معمولاً، از نتایج ارزیابی برای مقایسه مدل‌هایی استفاده می‌شود که با استفاده از الگوریتم‌های مختلف یادگیری ماشین آموزش داده شده‌اند، یا گونه‌ای از این موارد:


Evaluation evaluation = new Evaluation(trainingDataset);
evaluation.evaluateModel(targetFunction, validationDataset);
System.out.println(evaluation.toSummaryString("Results", false));

مثال‌های بالا از رگرسیون خطی استفاده می‌کنند که یک خروجی با ارزش عددی مانند قیمت خانه را بر اساس مقادیر ورودی پیش‌بینی می‌کند. رگرسیون خطی از پیش‌بینی مقادیر پیوسته و عددی پشتیبانی می‌کند. برای پیش‌بینی مقادیر یا طبقه‌بندی‌کننده‌های بله/خیر، می‌توانید از یک الگوریتم یادگیری ماشینی مانند درخت تصمیم، شبکه عصبی یا رگرسیون لجستیک استفاده کنید:


// using logistic regression
Classifier targetFunction = new Logistic();
targetFunction.buildClassifier(trainingSet);