Machine Learning – 4 – Linear Regression

Simple & Multiple Linear Regressions

Simple Linear என்பது இயந்திர வழிக் கற்றலில் உள்ள ஒரு அடிப்படையான algorithm ஆகும். இதில் இரண்டு விவரங்கள் எவ்வாறு தொடர்பு படுத்தப்படுகின்றன, algorithm எவ்வாறு தனது புரிதலை மேற்கொள்கிறது, அந்தப் புரிதல் எந்த அளவுக்கு சரியாக உள்ளது என்பது போன்ற விஷயங்களையெல்லாம் ஒருசில தரவுகளை வைத்து செயல்முறையில் செய்து பார்க்கப் போகிறோம். உதாரணத்துக்கு ஒரு பிட்சாவின் அளவினைக் கொண்டு அதன் விலையை எவ்வாறு நிர்ணயிப்பது என இப்பகுதியில் காணலாம். இதுவரை நம்மிடமுள்ள அனைத்து பிட்சாவின் அளவும்அதற்கான விலைகளும் X மற்றும் Y variable-ல் எடுத்துக்கொள்ள வேண்டும். இதுவே label set மற்றும் domain set ஆகும்.

x=[6,8,10,14,18,21]
y=[7,9,13,17.5,18,24]

பல்வேறு பிட்சாவின் விட்டத்தைப் (in inch) பெற்றிருக்கும் X என்பது explanatory variable எனவும், அவற்றினுடைய விலைகளைக்(in dollar) கொண்டிருக்கும் Y என்பது response variable எனவும் அழைக்கப்படும். புள்ளி விவரங்களாக இருக்கும் இவற்றை ஒரு வரைபடமாக வரைந்து பார்ப்போம். அப்போதுதான் அவை செல்லும்போக்கு நமக்குத் தெரியும். matplotlib என்பது வரைபடங்களை வரைந்து காட்ட உதவும் ஒரு library ஆகும்இதிலுள்ள pyplot மூலம் நமது புள்ளி விவரங்களுக்கான வரைபடம் வரையப்பட்டுள்ளது.இதற்கான நிரல் பின்வருமாறு.


import matplotlib.pyplot as plt
x=[[6],[8],[10],[14],[18],[21]]
y=[[7],[9],[13],[17.5],[18],[24]]
plt.figure()
plt.title('Pizza price statistics')
plt.xlabel('Diameter (inches)')
plt.ylabel('Price (dollars)')
plt.plot(x,y,'.')
plt.axis([0,25,0,25])
plt.grid(True)
plt.show()

gist.github.com/nithyadurai87/3e8c2f0d991a1383494f492c159ad7e9

இது வெளிப்படுத்துகின்ற வரைபடம் பின்வருமாறு இருக்கும்.

இந்த வரைபடத்தில் பிட்சாவின் விட்டத்துக்கும், அதன் விலைக்குமிடையே நேர்மாறல் தொடர்பு இருப்பதைக் காணலாம். அதாவது ஒன்றின் மதிப்பு அதிகரிக்க அதிகரிக்க மற்றொன்றும் அதிகரிக்கும் என்பதே நேர்மாறல். இங்கும் அப்படித்தான் உள்ளது. அடுத்து இதை வைத்து ஒரு algorithm-க்குக் கற்றுக் கொடுப்பதற்கான நிரல் பின்வருமாறு.


import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
x = [[6], [8], [10], [14], [18]]
y = [[7], [9], [13], [17.5], [18]]
model = LinearRegression()
model.fit(x,y)
plt.figure()
plt.title('Pizza price statistics')
plt.xlabel('Diameter (inches)')
plt.ylabel('Price (dollars)')
plt.plot(x,y,'.')
plt.plot(x,model.predict(x),'–')
plt.axis([0,25,0,25])
plt.grid(True)
plt.show()
print ("Predicted price = ",model.predict([[21]]))

நிரலுக்கான விளக்கம்: sklearn என்பது பல்வேறு வகையான algorithms-ஐக் கொண்ட ஒரு package ஆகும். இதிலிருந்து linear_model library-ல் உள்ள LinearRegression() class-ஆனது import செய்யப்படுகிறது. இதுவே கணிப்பான்/predictor ஆகும். இதற்கு நமது தரவுகளைப் பற்றிக் கற்றுக் கொடுப்பதற்காக fit() எனும் method பயன்படுத்தப்பட்டுள்ளது. பிறகு நமது Model எவ்வாறு கற்றுக் கொண்டுள்ளது என்பதை அறிய pyplot மூலம் வரைபடம் வரைந்து காட்டப்பட்டுள்ளது. கடைசியாக predict() எனும் function, நமது model-ன் மீது செயல்பட்டு 21 inch அளவு கொண்ட பிட்சாவின் விலை எவ்வளவு இருக்கும் என கணிக்கிறது. 

நிரலுக்கான வெளியீடு: மேற்கண்ட பைத்தான் நிரலை இயக்கும்போது, பின்வருமாறு ஒரு வரைபடம் வெளிப்படுகிறது. பின்னர் 21 inch அளவு கொண்ட பிட்சாவின் விலையாக [[22.46767241]] எனும் மதிப்பினை வெளிப்படுத்துகிறது.

இந்த வரைபடத்தில் அனைத்துப் புள்ளி விவரங்களுக்கும் மத்தியில் ஒரு நேர்கோடு உள்ளத்தைக் காணலாம். இதுவே hyperplane என்று அழைக்கப்படும்.. அதாவது இந்தக் கோடுதான் algorithm-ன் புரிதல். இனிவரும் பிட்சாவின் விட்டத்துக்கு இந்தக் கோட்டினை வைத்துத்தான் விலையைக் கணிக்கும். இந்தப் புரிதலுக்கான கோட்டிற்கும் உண்மையான புள்ளி விவரங்கள் அமைந்துள்ள இடத்திற்குமிடையே ஒரு சிறு இடைவெளி இருப்பதைக் காணலாம். இந்த இடைவெளியே residuals அல்லது training error என்று அழைக்கப்படும். இங்கு நாம் கண்ட உதாரணத்தில், 21 inch விட்டம் கொண்ட பிட்சாவின் விலை 24 டாலர் என நமக்கு ஏற்கனவே தெரியும். ஆனால் இதையே நமது Model கொண்டு கணிக்கும்போது அதன் விலை 22 டாலர் எனக் காட்டுவதைக் காணலாம்.  இதையே generalization error / risk என்றும் கூறுவர். அதாவது பொதுப்படையாக ஒரு புரிதலை அமைத்துக்கொண்டு, அதை வைத்து கணிப்பதால் ஏற்படும் error என்று பொருள். Residual sum of squares என்பது இந்த risk-ஐக் கணக்கிட உதவும் ஒரு function ஆகும். இதையே loss function / cost function என்று கூறுவர். Residuals sum of squares என்பது இத்தகைய இழப்பின் சராசரியை கண்டறிந்து கூறும். இந்த risk-க்கு என்ன காரணம், இதை எப்படிக் கணக்கிடுவது, கண்டுபிடிப்பது என்பது பற்றிப் பின்வருமாறு காணலாம். 

Algorithm – Simple linear:

நமது கணிப்பான் fit() மூலம் கற்றுக் கொள்ளும் சமன்பாடு பின்வருமாறு இருக்கும். இதுவே Simple linear regression-க்கான algorithmn ஆகும். 

y = α + βx

இதில் நமது explanatory, response variables தவிர்த்து, α (intercept term), β (coefficient) எனும் இரண்டு parameters காணப்படுகின்றன.. அதாவது இவற்றையும் சேர்த்தே நமது algorithm கற்றுக் கொள்கிறது. இதுவே நமது model-ன் risk-க்குக் காரணம். இதைக் கண்டுபிடித்து விட்டால் risk-ஐ எப்படிக் குறைப்பது என்பது தெரிந்துவிடும். முதலில் β-ன் மதிப்பினைக் கண்டுபிடிக்க வேண்டும். பின்னர் இதை வைத்து α-ன் மதிப்பினைக் கண்டுபிடித்து விடலாம். Variance என்பது நம்முடைய explanatory variable-ல் உள்ள தரவுகளானது எவ்வளவு இடைவெளி வித்தியாசத்தில் அமைந்துள்ளது என்பதைக் குறிக்கும்.. [1,3,5,7,9,11……] என்று இருக்கும் பட்சத்தில் அதன் varince 0 ஆகும். ஏனெனில் இவை சீரான இடைவெளியுடன் அமைந்துள்ளது.. அதுவே [1,5,7,10,11…..] என்று அடுத்தடுத்த எண்களுக்கான இடைவெளி சீரற்று இருக்கும் பட்சத்தில், அந்த சீரற்ற தன்மை எவ்வளவு இருக்கிறது எனக் கணக்கிடுவதே variance ஆகும். Co-variance என்பது நமது explanatory & response variables இரண்டும் சேர்ந்து எவ்வளவு இடைவெளி வித்தியாசத்தில் அமைந்துள்ளது என்பதைக் குறிக்கும்.. இவ்விரண்டுக்கும் இடையே linear தொடர்பு இல்லையென்றால், இதன் மதிப்பு 0 ஆகும். இவைகளுக்கான சூத்திரங்கள் பின்வருமாறு.

Numpy library-ல் உள்ள ஒருசில கணித functions மேற்கண்ட சூத்திரங்களின் படி நமது தரவுகளைப் பொருத்தி விடையை அளிக்கும் வேலையைச் செய்கின்றன. 


from sklearn.linear_model import LinearRegression
import numpy as np
x = [[6], [8], [10], [14], [18]]
y = [[7], [9], [13], [17.5], [18]]
model = LinearRegression()
model.fit(x,y)
print ("Residual sum of squares = ",np.mean((model.predict(x)- y) ** 2))
print ("Variance = ",np.var([6, 8, 10, 14, 18], ddof=1))
print ("Co-variance = ",np.cov([6, 8, 10, 14, 18], [7, 9, 13, 17.5, 18])[0][1])
print ("X_Mean = ",np.mean(x))
print ("Y_Mean = ",np.mean(y))

இதன் வெளியீடாக பின்வரும் மதிப்புகள் வெளிப்படும்.

Residual sum of squares = 1.7495689655172406
Variance = 23.2
Co-variance = 22.650000000000002
X_Mean = 11.2
Y_Mean = 12.9

இவ்வாறு நாம் கண்டுபிடித்த மதிப்புகளை சமன்பாட்டில் பொருத்தினால், 21 inch விட்டம் கொண்ட பிட்சாவின் விலை எவ்வாறு 22.46 டாலர் எனக் காட்டுகிறது என்பதை அறியலாம். 

y = α+ βx

= α+ β (21)

= 1.92 + (0.98*21) = 1.92 + 20.58 = 22.5

where as,

β = 22.65 / 23.2 = 0.98

α= 12.9 – (0.98*11.2) = 12.9 – 10.976 = 1.92

R-squared Score: கடைசியாக நாம் உருவாக்கியுள்ள model எவ்வளவு தூரம் உண்மையான மதிப்பினை அளிக்கும் அளவுக்குப் பொருந்தியுள்ளது என்பதைக் கணக்கிடுவதே R-Squared score ஆகும்.


from sklearn.linear_model import LinearRegression
import numpy as np
from numpy.linalg import inv,lstsq
from numpy import dot, transpose
x = [[6], [8], [10], [14], [18]]
y = [[7], [9], [13], [17.5], [18]]
model = LinearRegression()
model.fit(x,y)
x_test = [[8], [9], [11], [16], [12]]
y_test = [[11], [8.5], [15], [18], [11]]
print ("Score = ",model.score(x_test, y_test))

view raw

04_scoring.py

hosted with ❤ by GitHub

R-squared score = 0.6620052929422553

score() எனும் function, அதற்கான சூத்திரத்தில் , நமது validation data-வைப் பொருத்தி விடையினை நமக்கு அளிக்கிறது.. பொதுவாக score வெளிப்படுத்தும் மதிப்பு 0-லிருந்து 1-வரை அமையும். 1 என்பது overfit-ஆதலால், சற்று 1-க்கு நெருங்கிய மதிப்பாக இருந்தால், இதனை நாம் ஏற்றுக்கொள்ளலாம். இங்கு நம்முடைய model-ன் மதிப்பு 0.66 என வெளிப்பட்டுள்ளது. Simple linear -ஐ விட multiple linear-ல் accuracy இன்னும் அதிகமாக இருக்கும். இதைப்பற்றி அடுத்து காண்போம்.

Multiple Linear Regression: Simple linear-ல் ஒரு பிட்சாவின் விலையானது அதன் விட்டதைப் பொறுத்து அதிகரிப்பதைக் கண்டோம். ஆனால் உண்மையில் விலை அதிகரிப்புக்கு அதன் மீது தூவப்படும் toppings-ம் ஒரு காரணியாக இருக்கும். எனவே ஒரு பிட்சாவின் விலை அதன் விட்டம் மற்றும் அதிலுள்ள toppings-ன் எண்ணிக்கை ஆகிய இரண்டையும் பொறுத்து  அமைகிறது. இதுபோன்று ஒன்றுக்கும் மேற்பட்ட explanatory variables-ஐப் பொறுத்து, அதன் response variable அமைந்தால், அதுவே multiple linear regression எனப்படும். இதற்கான சமன்பாடு பின்வருமாறு இருக்கும்.

மேற்கண்ட அதே உதாரணத்தில் explanatory variable-வுடன் toppings-ன் எண்ணிக்கையும் சேர்த்து multiple linear-ஐ உருவாக்கியுள்ளோம். இது பின்வருமாறு. 


from sklearn.linear_model import LinearRegression
from numpy.linalg import lstsq
import numpy as np
x = [[6, 2], [8, 1], [10, 0], [14, 2], [18, 0]]
y = [[7], [9], [13], [17.5], [18]]
model = LinearRegression()
model.fit(x,y)
x1 = [[8, 2], [9, 0], [11, 2], [16, 2], [12, 0]]
y1 = [[11], [8.5], [15], [18], [11]]
predictions = model.predict([[8, 2], [9, 0], [12, 0]])
print ("values of Predictions: ",predictions)
print ("values of β1, β2: ",lstsq(x, y, rcond=None)[0])
print ("Score = ",model.score(x1, y1))

நிரலுக்கான வெளியீடு:

மேற்கண்ட நிரலுக்கான வெளியீடு பின்வருமாறு அமையும். இதில் accuracy அதிகரித்திருப்பதைக் காணலாம். simple linear-ல் 0.66 என்றால் multiple linear-ல் 0.77 என இருப்பதை கவனிக்கவும். எப்போதும் simple linear-ஐ விட multiple linear-ஐப் பயன்படுத்தும்போது accuracy இன்னும் அதிகமாக இருக்கும்

values of Predictions: [[10.0625 ]
[10.28125]
[13.3125 ]]
values of ß1, ß2: [[1.08548851]
[0.65517241]]
Score = 0.7701677731318468

நாம் கண்டுபிடித்த இந்த மதிப்புகள் மேற்கண்ட சமன்பாடில் பின்வருமாறு பொருந்துகின்றன. இதில் intercept term -ஆன α-ன் மதிப்பு x1 மற்றும் x2 எனும் இரண்டு variables-ஐயும் பொறுத்து அமைவதால், இது பொதுவாக ஒரு constant-ஆக இருக்கும்.

10.06 = α + (1.09 * 8) + (0.66 * 2)
= α + 8.72 + 1.32
= α + 10.04

10.28 = α + (1.09 * 9) + (0.66 * 0)
= α + 9.81 + 0
= α + 9.81

13.31 = α + (1.09 * 12) + (0.66 * 0)
= α + 13.08 + 0
= α + 13.08

அடுத்ததாக polynomial regression, Gradient Boosting, Ridge Regression  போன்றவற்றைப் பற்றியெல்லாம் காணலாம்.

%d bloggers like this: