למידת מכונה עם Spark MLlib

1. סקירה כללית

במדריך זה נבין כיצד למנף את Apache Spark MLlib לפיתוח מוצרים ללימוד מכונה. אנו נפתח מוצר למידת מכונה פשוט עם Spark MLlib כדי להדגים את מושגי הליבה.

2. תחילה קצרה ללמידת מכונה

למידת מכונה היא חלק ממטריה רחבה יותר המכונה בינה מלאכותית. למידת מכונה מתייחסת ל מחקר של מודלים סטטיסטיים לפתרון בעיות ספציפיות עם דפוסים והסקות. מודלים אלה "מאומנים" לבעיה הספציפית באמצעות נתוני אימונים השואבים ממרחב הבעיה.

נראה מה כוללת בדיוק הגדרה זו כאשר אנו לוקחים את הדוגמה שלנו.

2.1. קטגוריות למידת מכונה

אנחנו יכולים באופן רחב לקטלג למידת מכונה לפיקוח וללא פיקוח קטגוריות המבוססות על הגישה. ישנן גם קטגוריות אחרות, אך נשמור על שני הדברים הבאים:

  • למידה מפוקחת עובד עם סט נתונים המכיל גם את הקלטים וגם את הפלט הרצוי - למשל, מערך נתונים המכיל מאפיינים שונים של נכס והכנסות השכירות הצפויות. למידה מפוקחת מחולקת עוד לשתי קטגוריות משנה רחבות הנקראות סיווג ורגרסיה:
    • אלגוריתמי סיווג קשורים לפלט קטגורי, כמו אם נכס תפוס או לא
    • אלגוריתמי רגרסיה קשורים לטווח פלט רציף, כמו הערך של מאפיין
  • לעומת זאת, למידה ללא פיקוח, עובד עם סט נתונים שיש בו רק ערכי קלט. זה עובד על ידי ניסיון לזהות את המבנה הטמון בנתוני הקלט. למשל, מציאת סוגים שונים של צרכנים באמצעות מערך נתונים של התנהגות הצריכה שלהם.

2.2. זרימת עבודה של למידת מכונה

לימוד מכונה הוא באמת תחום לימוד בין-תחומי. זה דורש ידע בתחום העסקי, סטטיסטיקה, הסתברות, אלגברה לינארית ותכנות. מכיוון שזה בהחלט יכול להיות מכריע, עדיף לגשת לזה בצורה מסודרת, מה שאנחנו מכנים בדרך כלל זרימת עבודה של למידת מכונה:

כפי שאנו רואים, כל פרויקט למידת מכונה צריך להתחיל בהצהרת בעיה מוגדרת בבירור. זה צריך להיות מלווה בסדרה של צעדים הקשורים לנתונים שיכולים לענות על הבעיה.

אז בדרך כלל אנו בוחרים מודל המתבונן באופי הבעיה. לאחר מכן סדרת אימונים ואימות מודלים, המכונה כיוונון עדין של המודל. לבסוף, אנו בודקים את המודל על נתונים שטרם נראו ונפרוס אותם לייצור אם הם מספקים.

3. מה זה ניצוץ MLlib?

Spark MLlib הוא מודול על גבי ליבת הניצוץ המספק פרימיטיבים של למידת מכונה כ- API. למידת מכונה בדרך כלל עוסקת בכמות גדולה של נתונים להכשרת מודלים.

מסגרת המחשוב הבסיסית של Spark היא יתרון עצום. נוסף על כך, MLlib מספקת את רוב האלגוריתמים הפופולריים של למידת מכונה ואלגוריתמים סטטיסטיים. זה מפשט מאוד את משימת העבודה על פרויקט למידת מכונה בקנה מידה גדול.

4. למידת מכונה עם MLlib

כעת יש לנו מספיק הקשר בנושא למידת מכונה וכיצד MLlib יכולה לעזור במאמץ זה. בוא נתחיל בדוגמה הבסיסית שלנו ליישום פרויקט למידת מכונה עם Spark MLlib.

אם נזכור מהדיון שלנו על זרימת עבודה של למידת מכונה, עלינו להתחיל בהצהרת בעיה ואז לעבור לנתונים. למרבה המזל עבורנו, אנו בוחרים את "שלום העולם" של למידת מכונה, איריס נתונים. זהו מערך נתונים שכותרתו מרובה משתנים, המורכב מאורך ורוחב גביעי כותרת ועלי כותרת מסוגים שונים של קשתית העין.

זה נותן את המטרה הבעייתית שלנו: האם אנו יכולים לחזות את המין של קשתית העין מאורכו ורוחבו של הגבעול ועלי כותרתו?

4.1. הגדרת התלות

ראשית, עלינו להגדיר את התלות הבאה ב- Maven כדי למשוך את הספריות הרלוונטיות:

 org.apache.spark spark-mllib_2.11 2.4.3 מסופק 

ועלינו לאתחל את SparkContext כדי לעבוד עם ממשקי API של Spark:

SparkConf conf = חדש SparkConf () .setAppName ("ראשי") .setMaster ("מקומי [2]"); JavaSparkContext sc = JavaSparkContext חדש (conf);

4.2. טוען את הנתונים

דבר ראשון, עלינו להוריד את הנתונים, הזמינים כקובץ טקסט בפורמט CSV. אז עלינו לטעון את הנתונים האלה ב- Spark:

מחרוזת dataFile = "data \ iris.data"; נתוני JavaRDD = sc.textFile (dataFile);

Spark MLlib מציע מספר סוגי נתונים, מקומיים ומופצים, לייצוג נתוני הקלט והתוויות המתאימות. הפשוטים מבין סוגי הנתונים הם וֶקטוֹר:

JavaRDD inputData = data .map (line -> {String [] parts = line.split (","); double [] v = new double [parts.length - 1]; for (int i = 0; i <parts .length - 1; i ++) {v [i] = Double.parseDouble (parts [i]);} return Vectors.dense (v);});

שים לב שכללנו כאן רק את תכונות הקלט, בעיקר לניתוח סטטיסטי.

דוגמא להכשרה מורכבת בדרך כלל ממספר תכונות קלט ותווית המיוצגת על ידי הכיתה תווית פוינט:

מפת מפה = HashMap חדש (); map.put ("Iris-setosa", 0); map.put ("Iris-versicolor", 1); map.put ("Iris-virginica", 2); JavaRDD עם התווית Data = data .map (line -> {String [] parts = line.split (","); double [] v = new double [parts.length - 1]; for (int i = 0; i <parts .length - 1; i ++) {v [i] = Double.parseDouble (parts [i]);} להחזיר LabeledPoint חדש (map.get (parts [parts.length - 1]), Vectors.dense (v)); });

תווית הפלט שלנו במערך הנתונים היא טקסטואלית, המסמלת את סוג הקשתית. כדי להזין את זה למודל למידת מכונה, עלינו להמיר את זה לערכים מספריים.

4.3. ניתוח נתוני חקר

ניתוח נתוני חקר כולל ניתוח הנתונים הזמינים. עַכשָׁיו, אלגוריתמי למידת מכונה רגישים לאיכות הנתוניםמכאן שלנתונים באיכות גבוהה יותר יש סיכויים טובים יותר להשיג את התוצאה הרצויה.

יעדי ניתוח אופייניים כוללים הסרת חריגות וגילוי דפוסים. זה אפילו מזין את השלבים הקריטיים של הנדסת תכונות כדי להגיע לתכונות שימושיות מהנתונים הזמינים.

מערך הנתונים שלנו, בדוגמה זו, הוא קטן ומעוצב היטב. מכאן שאיננו צריכים להתמכר לניתוח נתונים רב. Spark MLlib, לעומת זאת, מצויד בממשקי API כדי להציע די תובנה.

נתחיל בניתוח סטטיסטי פשוט:

סיכום MultivariateStatisticalSummary = Statistics.colStats (inputData.rdd ()); System.out.println ("ממוצע סיכום:"); System.out.println (summary.mean ()); System.out.println ("שונות סיכום:"); System.out.println (summary.variance ()); System.out.println ("סיכום שאינו אפס:"); System.out.println (summary.numNonzeros ());

כאן אנו צופים בממוצע ובשונות של התכונות שיש לנו. זה מועיל לקבוע אם עלינו לבצע נורמליזציה של תכונות. שֶׁלָה שימושי שיש את כל התכונות בקנה מידה דומה. אנו רושמים גם ערכים שאינם אפסים, אשר יכולים להשפיע לרעה על ביצועי המודל.

הנה הפלט של נתוני הקלט שלנו:

ממוצע סיכום: [5.843333333333332,3.0540000000000003,3.7586666666666666,1.198666666666666668] שונות סיכום: [0.6856935123042509,0.18800402684563744,3.113179418344516,0.5824143176733783] סיכום ללא אפס.0,150.050] 150.050

מדד חשוב נוסף לניתוח הוא המתאם בין תכונות בנתוני הקלט:

Matrix correlMatrix = Statistics.corr (inputData.rdd (), "פירסון"); System.out.println ("מטריצת המתאם:"); System.out.println (correlMatrix.toString ());

א מתאם גבוה בין שתי תכונות מרמז כי אינן מוסיפות ערך מצטבר כלשהו ואחת מהן יכולה להיפטר. כך מתואמים התכונות שלנו:

מטריצת מתאם: 1.0 -0.10936924995064387 0.8717541573048727 0.8179536333691672 -0.10936924995064387 1.0 -0.4205160964011671 -0.3565440896138163 0.8717541573048727 -0.4205160964011671 1.096 0706

4.4. פיצול הנתונים

אם נזכור את הדיון שלנו בזרימת העבודה של למידת מכונה, זה כרוך בכמה איטרציות של אימון מודלים ואימות ואחריו בדיקות סופיות.

כדי שזה יקרה, עלינו לפצל את נתוני האימון שלנו לאימונים, אימות וערכות מבחנים. כדי לשמור על דברים פשוטים, נדלג על חלק האימות. אז בואו נחלק את הנתונים שלנו למערכות אימונים ומבחנים:

JavaRDD [] split = parsedData.randomSplit (כפול חדש [] {0.8, 0.2}, 11L); JavaRDD trainingData = פיצולים [0]; JavaRDD testData = פיצולים [1];

4.5. אימון מודלים

אז הגענו לשלב בו ניתחנו והכנו את מערך הנתונים שלנו. כל שנותר הוא להזין את זה למודל ולהתחיל את הקסם! ובכן, קל יותר לומר מאשר לעשות. עלינו לבחור אלגוריתם מתאים לבעיה שלנו - זכרו את הקטגוריות השונות של למידת מכונה עליהן דיברנו קודם.

לא קשה להבין את זה הבעיה שלנו משתלבת בסיווג בקטגוריה המפוקחת. כעת, ישנם לא מעט אלגוריתמים זמינים לשימוש בקטגוריה זו.

הפשוטה שבהן היא רגרסיה לוגיסטית (שהמילה רגרסיה לא תבלבל אותנו; אחרי הכל, היא אלגוריתם סיווג):

מודל LogisticRegressionModel = LogisticRegressionWithLBFGS חדש () .setNumClasses (3) .run (trainingData.rdd ());

כאן אנו משתמשים במסווג מבוסס זיכרון מוגבל מסוג BFGS בעל שלוש כיתות. הפרטים של אלגוריתם זה הם מחוץ להיקף של הדרכה זו, אך זהו אחד הנפוצים ביותר.

4.6. הערכת מודל

זכור כי אימון מודלים כולל איטרציות מרובות, אך לשם פשטות, פשוט השתמשנו כאן במעבר יחיד. כעת, לאחר שהכשרנו את המודל שלנו, הגיע הזמן לבדוק זאת במערך הבדיקה:

JavaPairRDD predictionAndLabels = testData .mapToPair (p -> Tuple2 חדש (model.predict (p.features ()), p.label ())); מדדי MulticlassMetrics = MulticlassMetrics חדשים (predictionAndLabels.rdd ()); דיוק כפול = מדדים. דיוק (); System.out.println ("דיוק המודל בנתוני הבדיקה:" + דיוק);

כעת, כיצד נמדוד את האפקטיביות של מודל? יש כמה מדדים שנוכל להשתמש בהם, אך אחד הפשוטים ביותר הוא דיוק. במילים פשוטות, הדיוק הוא היחס בין מספר התחזיות הנכון למספר התחזיות הכולל. הנה מה שאנחנו יכולים להשיג בריצה אחת של המודל שלנו:

דיוק המודל בנתוני הבדיקה: 0.9310344827586207

שים לב שהדבר ישתנה מעט מריצה לריצה בשל אופיו הסטוכסטי של האלגוריתם.

עם זאת, דיוק אינו מדד יעיל במיוחד בכמה תחומים בעייתיים. אַחֵר מדדים מתוחכמים יותר הם Precision and Recall (F1 Score), ROC Curve ו- Confusion Matrix.

4.7. שמירה וטעינה של הדגם

לבסוף, לעתים קרובות עלינו לשמור את המודל המאומן במערכת הקבצים ולהעמיס אותו לצורך חיזוי בנתוני הייצור. זה טריוויאלי בספארק:

model.save (sc, "model \ logistic-regression"); LogisticRegressionModel sameModel = LogisticRegressionModel .load (sc, "מודל \ לוגיסטי-רגרסיה"); וקטור newData = Vectors.dense (כפול חדש [] {1,1,1,1}); חיזוי כפול = sameModel.predict (newData); System.out.println ("חיזוי מודל על נתונים חדשים =" + חיזוי);

לכן, אנו שומרים את הדגם במערכת הקבצים וטוענים אותו בחזרה. לאחר הטעינה, ניתן להשתמש במודל באופן מיידי לחיזוי תפוקה על נתונים חדשים. להלן חיזוי לדוגמה על נתונים חדשים אקראיים:

חיזוי מודל על נתונים חדשים = 2.0

5. מעבר לדוגמא הפרימיטיבית

בעוד שהדוגמה שעברנו מכסה את זרימת העבודה של פרויקט למידת מכונה באופן רחב, היא משאירה הרבה נקודות עדינות וחשובות. אמנם לא ניתן לדון בהן בפירוט כאן, אך בהחלט נוכל לעבור על כמה מהחשובים.

ל- Spark MLlib באמצעות ממשקי ה- API שלה תמיכה רחבה בכל התחומים הללו.

5.1. בחירת מודל

בחירת מודל היא לרוב אחת המשימות המורכבות והקריטיות. הכשרת מודל היא תהליך מעורב ועדיף לעשות זאת במודל שאנו בטוחים יותר שיניב את התוצאות הרצויות.

אמנם אופי הבעיה יכול לעזור לנו לזהות את הקטגוריה של אלגוריתם למידת מכונה לבחירה, אך לא מדובר במלאכה. בתוך קטגוריה כמו סיווג, כפי שראינו קודם, לעתים קרובות ישנם אלגוריתמים שונים רבים וניתנים לבחירה.

לעתים קרובות דרך הפעולה הטובה ביותר היא אבות טיפוס מהירים על סט נתונים קטן בהרבה. ספרייה כמו Spark MLlib הופכת את עבודת האב-טיפוס המהירה לקלה בהרבה.

5.2. כוונון דגם היפר-פרמטר

מודל טיפוסי מורכב מתכונות, פרמטרים והיפר-פרמטרים. התכונות הן מה שאנו מזינים למודל כנתוני קלט. פרמטרים של המודל הם משתנים שהמודל לומד במהלך תהליך האימון. תלוי בדגם, ישנם פרמטרים נוספים שעלינו להגדיר על סמך ניסיון ולהתאים אותו באופן איטרטיבי. אלה נקראים היפר-פרמטרים מודליים.

למשל, קצב הלמידה הוא פרמטר היפ טיפוסי באלגוריתמים מבוססי-ירידה. קצב הלמידה שולט על התאמת הפרמטרים המהירים במהלך מחזורי האימון. זה צריך להיות מוגדר בכדי שהמודל ילמד בצורה יעילה בקצב סביר.

בעוד שאנו יכולים להתחיל מערך התחלתי של היפר-פרמטרים כאלה על סמך ניסיון, עלינו לבצע אימות מודלים ולכוון אותם באופן ידני איטרטיבי.

5.3. ביצועי מודל

מודל סטטיסטי, בעודו מאומן, הוא מועדים להתאמת יתר והתחתית, שניהם גורמים לביצועי דגם גרועים. Underfitting מתייחס למקרה בו המודל אינו בוחר מספיק את הפרטים הכלליים מהנתונים. מצד שני, התאמת יתר מתרחשת כאשר המודל מתחיל להרים רעש גם מהנתונים.

ישנן מספר שיטות להימנעות מבעיות של התאמת יתר והתאמת יתר, אשר משמשות לעתים קרובות בשילוב. לדוגמה, כדי להתמודד עם התאמת יתר, הטכניקות הנפוצות ביותר כוללות אימות צולב והסדרה. באופן דומה, כדי לשפר את ההלבשה, אנו יכולים להגביר את מורכבות המודל ולהגדיל את זמן האימון.

ל- Spark MLlib תמיכה נהדרת ברוב הטכניקות הללו כמו רגולציה ואימות צולב. למעשה, לרוב האלגוריתמים יש תמיכה ברירת מחדל עבורם.

6. Spark MLlib בהשוואה

בעוד ש- Spark MLlib היא ספרייה חזקה למדי עבור פרויקטים של למידת מכונה, היא בהחלט לא היחידה לתפקיד. ישנן מספר לא מבוטל של ספריות בשפות תכנות שונות עם תמיכה משתנה. נעבור כאן על כמה מהפופולריות.

6.1. Tensorflow / Keras

Tensorflow הוא קוד פתוח ספרייה לזרימת נתונים ותכנות מובחנות, המועסקת באופן נרחב ליישומי למידת מכונה. יחד עם ההפשטה הגבוהה שלה, Keras, הוא כלי נבחר ללימוד מכונה. הם כתובים בעיקר ב- Python ו- C ++ ומשמשים בעיקר ב- Python. שלא כמו Spark MLlib, אין לו נוכחות פוליגלוט.

6.2. תיאנו

Theano הוא קוד פתוח אחר מבוסס פיתון ספרייה למניפולציה והערכה של ביטויים מתמטיים - למשל, ביטויים מבוססי מטריצה, המשמשים בדרך כלל באלגוריתמים של למידת מכונה. שלא כמו Spark MLlib, Theano שוב משמש בעיקר בפייתון. Keras, לעומת זאת, ניתן להשתמש יחד עם קצה האחורי של Theano.

6.3. CNTK

ערכת הכלים הקוגניטיבית של מיקרוסופט (CNTK) היא א מסגרת למידה עמוקה שנכתבה ב- C ++ המתארת ​​שלבי חישוב באמצעות גרף מכוון. ניתן להשתמש בו בתוכניות Python ו- C ++ ומשמש בעיקר בפיתוח רשתות עצביות. יש קצה אחורי של Keras המבוסס על CNTK זמין לשימוש המספק את ההפשטה האינטואיטיבית המוכרת.

7. מסקנה

לסיכום, במדריך זה עברנו את היסודות של למידת מכונה, כולל קטגוריות שונות וזרימת עבודה. עברנו את היסודות של Spark MLlib כספריית למידת מכונה העומדת לרשותנו.

יתר על כן, פיתחנו יישום למידת מכונה פשוט המבוסס על מערך הנתונים הזמין. יישמנו כמה מהשלבים הנפוצים ביותר בתהליך העבודה של למידת מכונה בדוגמה שלנו.

עברנו גם כמה מהשלבים המתקדמים בפרויקט למידת מכונה טיפוסית וכיצד Spark MLlib יכול לעזור בכך. לבסוף ראינו כמה מספריות הלמידה המחשבית האלטרנטיביות שזמינות לשימוש.

כמו תמיד, ניתן למצוא את הקוד ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found