Machine Learning – 23 – Logistic regression

Logistic regression

நமது கணிப்பு ஒரு முழு மதிப்பினை வெளிப்படுத்தாமல், ஏதேனும் ஒரு வகையின் கீழ் அமைந்தால், அதுவே logistic regression எனப்படும். இந்த வகைப்படுத்தல், binary மற்றும் multiclass எனும் இரு விதங்களில் நடைபெறும். logistic regression என்பது இதற்கு உதவுகின்ற ஒரு algorithm ஆகும். இதன் பெயரில் மட்டும்தான் regression எனும் வார்த்தை உள்ளது. ஆனால் இது ஒரு classification-க்கான algorithm ஆகும்.

Sigmoid function:

ஒரு விஷயம் நடைபெறுமா? நடைபெறாதா? அல்லது இருக்கா? இல்லையா? என்பதையே இது கணிக்கிறது. ஆம் என்பது 1 எனவும் இல்லை என்பது 0 எனவும் கணிக்கப்படும். ஆகவே இதன் கணிப்பானது 0-லிருந்து 1-வரை அமையும். இதற்கான வரைபடம் பின்வருமாறு. அந்த வரைபடத்தில் z-ன் மதிப்பைப் பொறுத்து கணிக்கப்படும் g(z), 0-முதல் 1-வரை அமைய வேண்டுமெனில் அதற்கான சூத்திரமானது 1/(1+e**-z) என்று அமையும். இதுவே sigmoid function என்று அழைக்கப்படுகிறது.

எனவே z-க்கான இடத்தில் h(x) –ஐப் பொருத்தினால், அது 0-1 வரை அமைவதற்கான சமன்பாடாக பின்வரும் சூத்திரம் அமையும். இதுவே logictic regression-க்கான சமன்பாடு ஆகும்.

ஒரு மின்னஞ்சல் spam-ஆ இல்லையா எனக் கணிப்பதற்கான நிரல் பின்வருமாறு.


import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model.logistic import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
df = pd.read_csv('./spam.csv', delimiter=',',header=None)
X_train_raw, X_test_raw, y_train, y_test = train_test_split(df[1],df[0])
vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(X_train_raw)
X_test = vectorizer.transform(X_test_raw)
classifier = LogisticRegression()
classifier.fit(X_train, y_train)
predictions = classifier.predict(X_test)
print(predictions)

[‘ham’ ‘ham’ ‘ham’]

Decision Boundary:

h(x) = 1 என்பது எப்போதும் ஆம் என்பதையே குறிக்கும். எனவே 1-h(x) என்பது இல்லை என்பதைக் குறிக்கும். உதாரணத்துக்கு h(x) என்பது நாளை மழை பெய்ய 70% வாய்ப்பு உள்ளது என கணிக்கிறதெனில், மீதமுள்ள 30% இல்லை என்பதைக் கணித்துள்ளது என்றே அர்த்தம்.

தரவுகள் கீழ்க்கண்ட வரைபடத்தில் காணப்படுவதுபோல் பரவலாக அமைந்திருக்கிறது எனில், எதற்கு மேல் சென்றால் ஆம் எனக் கணிக்கலாம், எதற்குக் கீழ் அமைந்தால் இல்லை எனக் கணிக்கலாம் என்பதை முடிவு செய்வதே decision boundary ஆகும். இது எப்போதும் தீட்டா மதிப்புகளைப் பொறுத்தே அமையும். -3, 1, 1 எனும் மதிப்புகளை தீட்டா0, தீட்டா1, தீட்டா2 எனுமிடத்தில் பொருத்தினால், h(x)=1 என கணிப்பதற்கு x1 மற்றும் x2-ஆனது 3-க்கு மேல் அமைய வேண்டும் என்பதை decision boundary-ஆக அமைத்துள்ளது.

தரவுகள் கீழ்க்கண்டவாறு non-linear முறையில் பரவியிருப்பதால், இதன் தீட்டா மதிப்புகளான -1,0,0,1,1 என்பது 2-ம் order polynomial-ல் இருக்கும் சமன்பாட்டில் பொருத்தப்படுகிறது. 1-என்பது boundary-ஆக கண்டு பிடிக்கப்பட்டுள்ளது. இதுவே threshold classifier என்றும் அழைக்கப்படும்.

 

Cost function:

உண்மையில் நாளை மழை பெய்ய வாய்ப்பு இருக்கிறது என கணிக்கப்பட வேண்டியது இல்லை என கணிக்கப்பட்டால், அது ஒரு error. அவ்வாறே பெய்யாது என்பதை பெய்யும் எனக் கணித்தாலும் அது ஒரு error. அதாவது 1 என்பது 0 என கணிக்கப்பட்டாலோ அல்லது 0 என்பது 1 என கணிக்கப்பட்டாலோ அதனுடைய தவறு எத்தனை சதவீதம் நிகழ்ந்துள்ளது என்பதைக் கணக்கிட்டுக் கூற இயலாது. Infinity (எண்ணற்ற) என்பதே அதன் மதிப்பாக இருக்கும். இதற்கான வரைபடங்கள் பின்வருமாறு. அதில் x என்பது h(x) எனில், y –ஆனது infinity-ஐ நோக்கிச் செல்லும் வளைவுக்கான சூத்திரம் -log( h(x) )

அதாவது,

1 என்பது 0 என கணிக்கப்பட்டால் அதற்கான cost = -log( h(x) ), அவ்வாறே

0 என்பது 1 என கணிக்கப்பட்டால் அதற்கான cost = -log(1-h(x) )

எனவே cost-க்கான சூத்திரம் பின்வருமாறு அமைகிறது. இதில் y=1 எனவும் y=0 எனவும் வைத்து சரிபார்த்துக் கொள்ளவும்.

When y = 1,
= y . log(h(x)) + (1-y).log(1-h(x))
= 1.log(h(x)) + (1-1).log(1-h(x))
= log(h(x)) + 0
= log(h(x))

When y = 0,
= y . log(h(x)) + (1-y).log(1-h(x))
= 0.log(h(x)) + (1-0).log(1-h(x))
= 0 + 1.log(1-h(x))
= log(1-h(x))

இதற்கான contour plots ஒரே ஒரு கிண்ண வடிவ அமைப்பில் அமையாமல், சிறு சிறு வளைவுகளைப் பெற்று பல்வேறு ஏற்ற இறக்கங்களைக் கொண்டிருக்கும். இதுவே non-convex function எனப்படும். அதாவது regression-க்கான வரைபடத்தில் ஒரே ஒரு global optimum மட்டும் காணப்படும். ஆனால் classification-க்கான வரைபடத்தில் பல்வேறு local optimum காணப்படும். ஏனெனில் இங்கு இருக்கு‘, ‘இல்லைஎனும் இரண்டு மதிப்புகள் மட்டும் மாறி மாறி கணிக்கப்படுவதால், பல்வேறு local optimums இருக்கின்றன. இது போன்ற non-convex function-லும் நாம் gradient descent-ஐப் பயன்படுத்தலாம்.

இதற்கான gradient descent-ன் சமன்பாடும் multiple linear-ஐ ஒத்தே இருக்கும். ஒரே ஒரு வித்தியாசம் என்னவெனில், h(x) –க்கான தீட்டா-transpose.x என்பது இங்கு sigmoid function-ஐக் கொண்டிருக்கும்.

Classification accuracy:

நாளை உண்மையிலேயே மழை பெய்ய வாய்ப்பு இருக்கும்போது இல்லைஎனக் கணிப்பதும், இல்லாதபோது இருக்குஎனக் கணிப்பதும் classification-ல் நடைபெறும் தவறு ஆகும். எனவே எவ்வளவு தரவுகளுக்கு சரியான கணிப்புகள் நிகழ்ந்துள்ளது எனக் கண்டறிவதே accuracy ஆகும்.

ஒரு பத்து நாளைக்கான வானிலை கணிப்புகள் கீழ்க்கண்ட உதாரணத்தில் காணப்படுவதுபோல் இருக்கிறது என வைத்துக் கொள்வோம். அதாவது y_true –ல் உண்மையிலேயே மழை பெய்ததா, இல்லையா எனும் விவரம் 1 மற்றும் 0 ஆக உள்ளது. அதற்கான கணிப்புகள் y_pred –ல் உள்ளது. இவற்றை ஒப்பிட்டுப் பார்க்கும்போது இரண்டாவது, ஆறாவது மற்றும் ஏழாவது கணிப்புகள் மட்டும் மாறி நடைபெற்றிருப்பதை கவனிக்கவும். எனவே மொத்த 10 தரவுகளில், 3 மட்டும் தவறாக அமைந்திருப்பதால், இதன் accuracy 70% என வந்துள்ளது.


from sklearn.metrics import precision_recall_fscore_support
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 1, 0, 0, 0, 0, 0, 1, 1, 1]
print ('Accuracy:', accuracy_score(y_true, y_pred))
print (confusion_matrix(y_true, y_pred))
print (precision_recall_fscore_support(y_true, y_pred))
plt.matshow(confusion_matrix(y_true, y_pred))
plt.title('Confusion matrix')
plt.colorbar()
plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.show()

வெளியீடு:

Accuracy: 0.7
[[4 1]
[2 3]]
(array([0.66666667, 0.75]), array([0.8,0.6]), array([0.72727273, 0.666666
67]), array([5,5], dtype=int64))

Confusion Matrix:

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

0 எனும் மதிப்பு 1 என கணிக்கப்பட்டால் = False Positive
1 எனும் மதிப்பு 0 என கணிக்கப்பட்டால் = False Negative
1 எனும் மதிப்பின் கணிப்பும் 1 என அமைந்தால் = True Positive
0 எனும் மதிப்பின் கணிப்பும் 0 என அமைந்தால் = True Negative

Precision (P) என்பது எத்தனை சதவீதம் தவறாக ஆம்எனக் கணித்துள்ளது என்பதையும்,
Recall (R) என்பது எத்தனை சதவீதம் தவறாக இல்லைஎனக் கணித்துள்ளது என்பதையும் கணக்கிடுகிறது. தவறாக கணிக்கப்பட்ட இவ்விரண்டு மதிப்புகளையும் சேர்த்து ஒரே மதிப்பாக மாற்றுவதே F score ஆகும். இதற்கான சூத்திரம் பின்வருமாறு.

P = True Positive / (True Positive+ False Positive)
R = True Positive / (True Positive+ False Negative)
F score = 2 (PR / P+R)

இவைகளைக் கண்டு பிடிப்பதற்கான முக்கியத்துவம் என்ன என்று இப்போது பார்க்கலாம். உதாரணத்துக்கு ஒருவருக்கு உடம்பில் ஏற்பட்டுள்ள கட்டியின் அளவைப் பொருத்து, அது புற்று நோய்க்கான கட்டியா இல்லையா என முடிவு செய்யும் சோதனையை எடுத்துக் கொள்வோம். இதற்கான மாதிரித் தரவுகளில் நூற்றில் ஒருவருக்கு மட்டுமே ஆம்எனும் முடிவு காணப்படும். பெரும்பான்மையான தரவுகளில் இல்லைஎனும் முடிவே நிறைந்திருக்கும். இது போன்று ஒரே முடிவினைச் சார்ந்த அதிக அளவு மாதிரித் தரவுகளைக் கொண்டவையே “skewed classes” என்றழைக்கப்படுகின்றன. இவற்றை வைத்து பிற்காலத்தில் உண்மையான கட்டியின் அளவைக் கணிக்கும்போது, ‘ஆம்என்பதற்கு பதிலாக இல்லைஎன்பதையே பெரும்பான்மையாக வெளிப்படுத்தும். இவற்றைக் கண்டறிவதற்கு உதவுவதே precision மற்றும் recall ஆகும்.

Trading-off between Precision & Recall:

ஒருவருடைய கட்டியின் அளவு 5mm –க்கு மேல் இருந்தால் அது புற்று நோய்க்கான கட்டி என threshold அமைக்கப்பட்டுள்ளதாக வைத்துக் கொள்வோம். இப்போது இந்த அளவுக்கு மேல் ஆனால் சாதாரண கட்டி இருக்கும் ஒருவரிடம் சென்று இது புற்று நோய்க்கான கட்டிஎனத் தவறாகக் கூறி விட்டால், அவர் தேவையில்லாமல் பல வலிமிகு சிகிச்சைகளை மேற்கொள்ள வேண்டியிருக்கும் (false positive – high precision).

எனவே நமக்கு உறுதியாகத் தெரிந்தால் மட்டுமே ஆம்எனக் கூற வேண்டும் என்பதற்காக threshold-7mm –க்கு மேல் அதிகப்படுத்துவோம். இப்போது 6mm அளவில் புற்று நோய் கட்டி இருக்கும் ஒருவரிடம் சென்று உங்களுக்கு ஒன்றும் இல்லைஎனக் கூறும் அபாயம் நேரும் (false negative – high recall). இதனால் அவரும் அலட்சியமாக இருந்து விடுவார்.

ஆகவே precision –ஐக் குறைக்க விரும்பினால், recall அதிகரிக்கும். Recall-ஐக் குறைக்க விரும்பினால் precision அதிகரிக்கும். இதுவே trading-off between precision & recall எனப்படுகிறது.

%d bloggers like this: