පෙර මොඩියුල වලදී, අපි අපගේ ව්යාපෘතියට අවශ්ය අත්තිවාරම සකස් කළෙමු. අපි දත්ත නිර්මාණය කළා, Pandas භාවිතයෙන් ඒවා DataFrame එකකට ගෙනාවා, ඒවා X (Features) සහ y (Target) ලෙස වෙන් කළා, අවසානයේදී, එම දත්ත වලින් ඉගෙන ගැනීමට Linear Regression නම් ඇල්ගොරිතමය තෝරා ගත්තා. අපගේ "ශිෂ්යයා" (model) සහ ඔහුගේ "පාඩම් පොත්" (X සහ y) දැන් සූදානම්. දැන් කාලයයි, ඉගෙනීමේ ක්රියාවලිය ආරම්භ කිරීමට.
Machine Learning වලදී, මෙම ඉගෙනීමේ ක්රියාවලියට කියන නම තමයි Model Training හෙවත් "ආකෘතිය පුහුණු කිරීම". සමහර විට මෙය "Fitting the model" ලෙසද හඳුන්වයි. මන්ද, අපි කරන්නේ අපගේ දත්ත ලක්ෂ්යයන්ට වඩාත්ම ගැළපෙන (best fit) රේඛාව සොයා ගැනීමට model එකට පැවසීමයි. මෙම මොඩියුලයේදී, අපි Scikit-learn හි එක් සරල විධානයකින් මෙම සම්පූර්ණ ක්රියාවලියම සිදු කරන ආකාරය ඉගෙන ගනිමු.
Train / Fit a Model using X and y
Scikit-learn library එක නිර්මාණය කර ඇත්තේ ඉතාමත් සරල සහ ස්ථාවර අතුරු මුහුණතක් (consistent API) සහිතවයි. බොහෝ ඇල්ගොරිතම පුහුණු කිරීම සඳහා එකම function එක භාවිතා කරයි. ඒ තමයි `.fit()` method එක.
සරල උපමාවක්: අපේ `model` object එක, කිසිවක් නොදන්නා, නමුත් ඉගෙන ගැනීමට සූදානම් බුද්ධිමත් ශිෂ්යයෙක් කියා සිතන්න. `.fit()` method එක call කිරීම, හරියටම ඒ ශිෂ්යයාට, "මෙන්න ඔයාගේ ප්රශ්න පත්රය (X) සහ මෙන්න ඒවට අදාළ පිළිතුරු පත්රය (y), දැන් මේ දෙකම හොඳට අධ්යයනය කරලා, මේවා අතර තියෙන සම්බන්ධය පාඩම් කරගන්න" කියා පවසනවා වැනිය.
`.fit()` method එක, තර්ක දෙකක් (two arguments) බලාපොරොත්තු වේ:
- Features (X): ප්රශ්න පත්රය. අපගේ දත්ත වල `Math`, `Science`, සහ `English` ලකුණු අඩංගු DataFrame එක.
- Target (y): පිළිතුරු පත්රය. අපගේ දත්ත වල `FinalScore` අඩංගු Pandas Series එක.
අපගේ code එකේදී, එය ක්රියාත්මක වන්නේ මෙසේය:
# and from Module 4 where we created X and y
# The training step! This is where the learning happens.
model.fit(X, y)
එපමණයි! මෙම තනි code පේළිය ක්රියාත්මක වූ විට, Scikit-learn විසින් තිරය පිටුපස (behind the scenes) බොහෝ දේ සිදු කරයි. Linear Regression ඇල්ගොරිතමය, අප ලබා දුන් X සහ y දත්ත විශ්ලේෂණය කර, සියලුම දත්ත ලක්ෂ්යයන්ට ඇති සාමාන්ය දෝෂය (average error) අවම වන, හොඳම `m` (coefficients) සහ `c` (intercept) අගයන් ගණනය කරයි. මෙම ක්රියාවලිය අවසන් වූ පසු, අපගේ `model` object එක තවදුරටත් "හිස්" එකක් නොවේ. එය දැන් පුහුණු වූ (trained), "දැනුමැති" model එකකි. එය X සහ y අතර ඇති ගණිතමය සම්බන්ධතාවය දැන් "දනී".
Coefficients සහ Intercept කියන්නේ මොනවද?
පුහුණුව අවසන්. අපේ "ශිෂ්යයා" පාඩම් කර අවසන්. දැන් ඔහු ඉගෙන ගත් දේ කුමක්දැයි අපට පරීක්ෂා කළ හැකිය. Module 5 හිදී අප සාකච්ඡා කළ `y = mX + c` සමීකරණය මතකද? Model training යනු එම සමීකරණයේ `m` සහ `c` අගයන් සොයා ගැනීමයි. පුහුණු වූ model එකකින්, අපට එම අගයන් පහසුවෙන් ලබාගත හැක.
Intercept (අන්තඃඛණ්ඩය - c)
Intercept යනු අපගේ මූලික අගයයි (baseline). එනම්, සියලුම features (`Math`, `Science`, `English`) වල අගයන් බිංදුව (0) වන විට, `FinalScore` එක සඳහා අපේක්ෂා කරන අගයයි. මෙය model එකේ `.intercept_` attribute එකෙන් ලබාගත හැක.
c = model.intercept_
print(f"Intercept (c): {c}")
Coefficients (සංගුණක - m)
Coefficients යනු අපගේ එක් එක් feature එක, target එක කෙරෙහි කොතරම් බලපෑමක් ඇති කරයිද යන්න පෙන්වන බර (weights) වේ. අපට features තුනක් ඇති නිසා, model එක coefficients තුනක් ඉගෙන ගනු ඇත. මේවා model එකේ `.coef_` attribute එකෙන් ලබාගත හැක.
m = model.coef_
print(f"Coefficients (m): {m}")
මෙම ප්රතිදානයෙන් අපට ලැබෙන්නේ සංඛ්යා තුනක් සහිත ලැයිස්තුවකි. පළමු සංඛ්යාව `Math` (`X` හි පළමු තීරුව) සඳහා වන `m` අගයයි. දෙවැන්න `Science` සඳහා වන `m` අගයයි, යනාදී වශයෙනි.
උදාහරණයක් ලෙස, ප්රතිදානය මෙසේ දිස්විය හැකියැයි සිතමු:
- Intercept (c): `1.5`
- Coefficients (m): `[0.35, 0.40, 0.25]`
මෙම අගයන් වල තේරුම කුමක්ද?
- Intercept: ගණිතය, විද්යාව, සහ ඉංග්රීසි යන සියලුම විෂයයන් සඳහා ලකුණු 0 ක් ලබා ගත් ශිෂ්යයෙකුට පවා, අපේ model එකට අනුව, 1.5 ක මූලික `FinalScore` එකක් ලැබේ.
- Coefficients:
- Math (0.35): අනෙක් විෂයයන්ගේ ලකුණු නියතව තිබියදී, ගණිතය ලකුණු එකකින් (1) වැඩි වන විට, `FinalScore` එක 0.35 කින් වැඩි වනු ඇතැයි model එක විශ්වාස කරයි.
- Science (0.40): විද්යාව ලකුණු එකකින් වැඩි වන විට, `FinalScore` එක 0.40 කින් වැඩි වේ.
- English (0.25): ඉංග්රීසි ලකුණු එකකින් වැඩි වන විට, `FinalScore` එක 0.25 කින් වැඩි වේ.
මෙම සංගුණක දෙස බැලීමෙන්, අපගේ model එකට අනුව, `FinalScore` එක කෙරෙහි වැඩිම බලපෑමක් ඇත්තේ Science විෂයට බව අපට පෙනේ (එහි සංගුණකය ඉහළම අගයයි: 0.40). මෙය අපගේ කුඩා dataset එක මත පදනම් වූ, model එක විසින්ම ඉගෙනගත් "insight" එකකි!
Training vs Testing Datasets
මෙය Machine Learning හි ඇති ඉතාමත් වැදගත් සහ මූලික සංකල්පයකි. සැබෑ ලෝකයේ ව්යාපෘතියකදී, අප කිසිවිටෙකත් අප සතු සම්පූර්ණ dataset එකම model එක පුහුණු කිරීමට භාවිතා කරන්නේ නැත. ඒ වෙනුවට, අපි එය කොටස් දෙකකට වෙන් කරමු:
- Training Set (පුහුණු කට්ටලය): මෙය විශාල කොටසයි (සාමාන්යයෙන් 70%-80%). Model එකට රටා ඉගෙන ගැනීමට ලබා දෙන්නේ මෙම දත්ත කොටසයි. අප මෙතෙක් කතා කළ `.fit(X, y)` ක්රියාවලිය සිදු කරන්නේ මෙම Training Set එක මතයි.
- Testing Set (පරීක්ෂණ කට්ටලය): මෙය කුඩා කොටසයි (සාමාන්යයෙන් 20%-30%). මෙම දත්ත කොටස, model එක පුහුණු කිරීමේදී එයට කිසිසේත්ම පෙන්වන්නේ නැත. එය අගුලු දමා, වෙනම තබයි.
පුහුණුව අවසන් වූ පසු, අපි මෙම Testing Set එක භාවිතා කර, model එකේ ක්රියාකාරීත්වය ඇගයීමට ලක් කරමු. අපි model එකට Testing Set එකේ features (X_test) ලබා දී, ඊට අදාළ targets (y_test) predict කරන ලෙස ඉල්ලා සිටිමු. ඉන්පසු, model එකේ predictions, සැබෑ පිළිතුරු (actual y_test) සමඟ සසඳා බලමු.
මෙසේ කරන්නේ ඇයි? අපගේ ශිෂ්යයාගේ උදාහරණයට නැවත යමු. ශිෂ්යයෙක් Past Papers පොතේ ඇති සියලුම ප්රශ්න සහ පිළිතුරු කටපාඩම් කළහොත්, ඔහුට එම Past Papers පොතෙන් දෙන ඕනෑම ප්රශ්නයකට 100% නිවැරදි පිළිතුරු දිය හැක. නමුත්, සැබෑ විභාගයේදී, මින් පෙර නොදුටු, තරමක් වෙනස් ප්රශ්නයක් පැමිණි විට, ඔහුට පිළිතුරු දීමට නොහැකි වනු ඇත. මන්ද, ඔහු විෂය "ඉගෙනගෙන" නැත, ඔහු කර ඇත්තේ පිළිතුරු "කටපාඩම්" කිරීම පමණි.
Testing Set එකක් භාවිතා කිරීම, සැබෑ විභාගයක් පැවැත්වීම වැනිය. Model එක, පුහුණු දත්ත වලට පමණක් හොඳින් ක්රියා කර, මින් පෙර නොදුටු (unseen) දත්ත වලට දුර්වල ලෙස ක්රියා කරයි නම්, එය Overfitting නම් තත්ත්වයකි. Testing Set එකක් මගින්, අපගේ model එක සැබෑ ලෝකයේදී කෙතරම් හොඳින් ක්රියා කරයිද යන්න පිළිබඳව අපක්ෂපාතී (unbiased) ඇගයීමක් ලබා ගැනීමට අපට හැකි වේ.