רגרסיה לינארית באמצעות Keras

מחבר:
בתאריך:

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

ספריית keras ללמידת מכונה

 

ייבוא הספריות שישמשו במדריך

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
  • ספריית Numpy של Python מאפשרת לעבוד עם מערכים רב-ממדיים, ומספקת פונקציות לביצוע פעולות של אלגברה לינארית הנדרשות לפתרון הבעיות המתמטיות בתהליך הלמידה.
  • Pandas משמשת לסידור ולסינון מידע בדומה לגיליון אקסל.
  • Matplotlib משמשת להצגת מידע.

 

ייבוא מסד הנתונים

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

df = pd.read_csv('../data/sacramentorealestatetransactions.csv',usecols=['sq__ft', 'price'])

אנחנו זקוקים רק לעמודות שטח הבית (sq__ft) והמחיר.

 

סקירת הנתונים וניקוי דוגמאות חריגות

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

# See the database before doing anything
df.set_index('sq__ft')
df.shape
(985, 2)

התוצאה היא שני טורים ו-985 שורות.

נדפיס את המידע על עמודות מסד הנתונים באמצעות:

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 985 entries, 0 to 984
Data columns (total 2 columns):
sq__ft    985 non-null int64
price     985 non-null int64
dtypes: int64(2)
memory usage: 15.5 KB

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

נוודא שלא חסרים נתונים:

df.isnull().sum().sum()
0

התוצאה היא 0, ולכן לא חסרים נתונים.

נתאר את מדדי מרכז באמצעות:

df.describe()

ספריית keras ללמידת מכונה

ועכשיו נמצא את מידת הקורלציה בין שטח הבית והמחיר:

# Find the correlation
df.corr()['sq__ft'].sort_values()
price     0.333897
sq__ft    1.000000
Name: sq__ft, dtype: float64

קורלציה נמוכה של 33% בלבד בניגוד לציפייה שלנו שיהיה קשר חזק בין גודל הבית ומחירו. למה?

נציג את הנתונים בגרף וננסה להבין מה מקור השיבוש:

plt.plot(df['sq__ft'], df['price'], 'o')
plt.ylabel('Price')
plt.xlabel('Square foot')
plt.title('Price vs square foot')

מחיר לעומת גודל הבית. מה הבעיה?

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

# Remove outliers
filtered_data = df[(df.sq__ft > 10) & (df.sq__ft < 5000)]

נמצא את הקורלציה בסט הנתונים לאחר הסינון:

filtered_data.corr()['sq__ft'].sort_values()
price     0.728642
sq__ft    1.000000
Name: sq__ft, dtype: float64

ואכן המתאם גבוה משמעותית יותר ועומד על 72.8%.

נשרטט את סט הנתונים לאחר הסינון:

מחיר לעומת גודל הבית, נתונים מסוננים

 

למידת מכונה באמצעות Keras

נייבא את הספריות שישמשו אותנו לצורך למידת המכונה:
# Import the libraries for the machine learning
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping

from sklearn import cross_validation

המודל מבצע למידת מכונה באמצעות שכבות של נוירונים. Keras משתמש במודל מסוג Sequential שעורם שכבות של נוירונים זו על גבי זו כשלכל שכבה יש input, output.

השכבות (layer) שבהם נשתמש במודל הם:

  • Dense - כל נוירון בשכבה מחובר לכל הנוירונים בשכבה הבאה בתור
  • Activation - פונקציית אקטיבציה

את האופטימיזציה נעשה בשיטת Adam.

נגדיר את המודל:

model = Sequential()

# Convert the value from the input (square foot) to the output (price)
# The model receives 1 input and outputs a single value
model.add(Dense(1, input_shape=(1,)))

# We expect the model to be linear
model.add(Activation('linear'))
  • השכבה Dense מקבלת input אחד (שטח הדירה) ופולטת output אחד (מחיר).
  • שכבת האקטיבציה היא לינארית כיוון שאנחנו מצפים לקשר ליניארי.

הפונקציה הבאה מסכמת את המודל:

model.summary()
Layer (type)                 Output Shape              Param #   
=================================================================
dense_2 (Dense)              (None, 1)                 2         
_________________________________________________________________
activation_2 (Activation)    (None, 1)                 0         
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0

נקמפל את המודל:

# Adam optimizer with learning rate of 10 (After some triabl and error I find it to be the best learning rate)
model.compile(Adam(lr=10), loss='mean_squared_error')

המדד להתקדמות תהליך הלמידה הוא mean_squared_error וגודל הצעדים שהוא יעשה בכל חזרה הוא 10 (learning rate) כי זה הערך הטוב ביותר שמצאתי אחרי הרצת המודל עם קצבי לימוד שונים.

נגדיר את ערכי ה-X וה-y:

X = filtered_data[['sq__ft']].values
y = filtered_data['price'].values

נפצל את הדוגמאות לקבוצת אימון (train) ומבחן (test):

# Split the data to test and train group
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.25, random_state=42)

פונקציית EarlyStopping תעצור את תהליך הלמידה במידה ואינו מתקדם:

# The EarlyStopping callback stops the learning process if the loss doesn't improve
es = EarlyStopping(monitor='val_loss',
                   min_delta=0,
                   patience=2,
                   verbose=2,
                   mode='auto')

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

אחרי כל ההכנות, הפונקציה הבאה עושה את הלמידה בפועל:

# The training in which tensorflow finds the optimal parameters is done here
model.fit(X_train,
          y_train,
          batch_size=32,
          epochs=200,
          validation_data=(X_test,y_test),
          callbacks=[es])

למידת מכונה עם Keras רצה על המחשב שלי

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

plt.plot(filtered_data['sq__ft'], filtered_data['price'], 'o')
plt.ylabel('Price')
plt.xlabel('Square foot')
plt.title('Price vs square foot')
plt.plot(X,y_pred,color='red')

הערכים החזויים לעומת הערכים בפועל

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

נראה את הפרמטרים של משוואת הקו הישר שהמודל מצא:

# Print the parameters that the process found
W, B = model.get_weights()

W הוא שיפוע הקו

# Weight is the slope of the line
W
array([[ 144.62713623]], dtype=float32)

B היא הנקודה שבה הקו חוצה את ציר ה-y

# The bias is the point at which the line crosses the y-axis
B
array([ 158.30099487], dtype=float32)

 

סיכום

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

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

לכל המדריכים בנושא של למידת מכונה

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

הוסף תגובה חדשה

 

= 4 + 4