chore(i18n): sync translations with latest source changes (chunk 8/10, 100 files)

pull/915/head
localizeflow[bot] 3 months ago
parent f07ce14f6b
commit 8feadec552

@ -0,0 +1,315 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "aaf391d922bd6de5efba871d514c6d47",
"translation_date": "2025-12-19T15:18:17+00:00",
"source_file": "4-Classification/1-Introduction/README.md",
"language_code": "ml"
}
-->
# വർഗ്ഗീകരണത്തിന് പരിചയം
ഈ നാല് പാഠങ്ങളിൽ, നിങ്ങൾ ക്ലാസിക് മെഷീൻ ലേണിങ്ങിന്റെ ഒരു അടിസ്ഥാന ശ്രദ്ധാകേന്ദ്രമായ _വർഗ്ഗീകരണ_ അന്വേഷിക്കും. ഏഷ്യയും ഇന്ത്യയും ഉൾപ്പെടുന്ന എല്ലാ പ്രശസ്തമായ പാചകശാലകളെക്കുറിച്ചുള്ള ഒരു ഡാറ്റാസെറ്റുമായി വിവിധ വർഗ്ഗീകരണ ആൽഗോരിതങ്ങൾ ഉപയോഗിച്ച് നാം നടക്കും. നിങ്ങൾക്ക് വിശക്കുമെന്നാണ് പ്രതീക്ഷ!
![just a pinch!](../../../../translated_images/pinch.1b035ec9ba7e0d408313b551b60c721c9c290b2dd2094115bc87e6ddacd114c9.ml.png)
> ഈ പാഠങ്ങളിൽ പാൻ-ഏഷ്യൻ പാചകശാലകളെ ആഘോഷിക്കൂ! ചിത്രം [ജെൻ ലൂപ്പർ](https://twitter.com/jenlooper) നൽകിയത്
വർഗ്ഗീകരണം [സൂപ്പർവൈസ്ഡ് ലേണിങ്ങിന്റെ](https://wikipedia.org/wiki/Supervised_learning) ഒരു രൂപമാണ്, ഇത് റെഗ്രഷൻ സാങ്കേതികവിദ്യകളുമായി വളരെ സാമ്യമുണ്ട്. മെഷീൻ ലേണിങ്ങ് ഡാറ്റാസെറ്റുകൾ ഉപയോഗിച്ച് വസ്തുക്കളുടെ മൂല്യങ്ങൾ അല്ലെങ്കിൽ പേരുകൾ പ്രവചിക്കുന്നതിനെക്കുറിച്ചാണെങ്കിൽ, വർഗ്ഗീകരണം സാധാരണയായി രണ്ട് വിഭാഗങ്ങളിലായി വിഭജിക്കപ്പെടുന്നു: _ബൈനറി വർഗ്ഗീകരണ_യും _മൾട്ടിക്ലാസ് വർഗ്ഗീകരണ_യും.
[![Introduction to classification](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Introduction to classification")
> 🎥 മുകളിൽ കാണുന്ന ചിത്രത്തിൽ ക്ലിക്ക് ചെയ്യുക: MIT-യുടെ ജോൺ ഗുട്ടാഗ് വർഗ്ഗീകരണം പരിചയപ്പെടുത്തുന്നു
ഓർമ്മിക്കുക:
- **ലീനിയർ റെഗ്രഷൻ** നിങ്ങൾക്ക് വ്യത്യസ്ത വേരിയബിളുകൾ തമ്മിലുള്ള ബന്ധം പ്രവചിക്കാൻ സഹായിച്ചു, ഒരു പുതിയ ഡാറ്റാപോയിന്റ് ആ വരിയോട് എവിടെ പൊരുത്തപ്പെടും എന്ന് കൃത്യമായി പ്രവചിക്കാൻ. ഉദാഹരണത്തിന്, _സെപ്റ്റബർ മാസത്തിലെ പംപ്കിന്റെ വില ഡിസംബർ മാസത്തേക്കാൾ എത്രയാകു_ എന്ന് പ്രവചിക്കാം.
- **ലോജിസ്റ്റിക് റെഗ്രഷൻ** നിങ്ങൾക്ക് "ബൈനറി വിഭാഗങ്ങൾ" കണ്ടെത്താൻ സഹായിച്ചു: ഈ വിലയിൽ, _ഈ പംപ്കിൻ ഓറഞ്ച് ആണോ അല്ലയോ_?
വർഗ്ഗീകരണം ഡാറ്റാപോയിന്റിന്റെ ലേബൽ അല്ലെങ്കിൽ ക്ലാസ് നിർണയിക്കാൻ വിവിധ ആൽഗോരിതങ്ങൾ ഉപയോഗിക്കുന്നു. ഒരു കൂട്ടം ഘടകങ്ങൾ നിരീക്ഷിച്ച്, അതിന്റെ പാചകശാലയുടെ ഉത്ഭവം നമുക്ക് നിർണയിക്കാമോ എന്ന് നോക്കാം.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
> ### [ഈ പാഠം R-ൽ ലഭ്യമാണ്!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
### പരിചയം
വർഗ്ഗീകരണം മെഷീൻ ലേണിംഗ് ഗവേഷകനും ഡാറ്റാ സയന്റിസ്റ്റും നടത്തുന്ന അടിസ്ഥാന പ്രവർത്തനങ്ങളിൽ ഒന്നാണ്. ഒരു ബൈനറി മൂല്യത്തിന്റെ അടിസ്ഥാന വർഗ്ഗീകരണത്തിൽ നിന്ന് ("ഈ ഇമെയിൽ സ്പാം ആണോ അല്ലയോ?") മുതൽ കമ്പ്യൂട്ടർ വിഷൻ ഉപയോഗിച്ച് സങ്കീർണ്ണമായ ഇമേജ് വർഗ്ഗീകരണവും സെഗ്മെന്റേഷനും വരെ, ഡാറ്റയെ ക്ലാസുകളായി തിരിച്ച് അതിൽ നിന്ന് ചോദ്യങ്ങൾ ചോദിക്കാൻ ഇത് എപ്പോഴും ഉപകാരപ്രദമാണ്.
പ്രക്രിയയെ കൂടുതൽ ശാസ്ത്രീയമായി പറയുമ്പോൾ, നിങ്ങളുടെ വർഗ്ഗീകരണ രീതി ഇൻപുട്ട് വേരിയബിളുകളും ഔട്ട്പുട്ട് വേരിയബിളുകളും തമ്മിലുള്ള ബന്ധം മാപ്പ് ചെയ്യാൻ സഹായിക്കുന്ന പ്രവചന മോഡൽ സൃഷ്ടിക്കുന്നു.
![binary vs. multiclass classification](../../../../translated_images/binary-multiclass.b56d0c86c81105a697dddd82242c1d11e4d78b7afefea07a44627a0f1111c1a9.ml.png)
> ബൈനറി vs. മൾട്ടിക്ലാസ് പ്രശ്നങ്ങൾ വർഗ്ഗീകരണ ആൽഗോരിതങ്ങൾ കൈകാര്യം ചെയ്യേണ്ടത്. ഇൻഫോഗ്രാഫിക് [ജെൻ ലൂപ്പർ](https://twitter.com/jenlooper) നൽകിയത്
ഡാറ്റ ശുദ്ധീകരണം, ദൃശ്യവൽക്കരണം, ML ടാസ്കുകൾക്കായി തയ്യാറാക്കൽ തുടങ്ങിയ പ്രക്രിയ ആരംഭിക്കുന്നതിന് മുമ്പ്, മെഷീൻ ലേണിംഗ് ഡാറ്റ വർഗ്ഗീകരിക്കാൻ ഉപയോഗിക്കാവുന്ന വിവിധ മാർഗങ്ങൾ കുറച്ച് പഠിക്കാം.
[സ്റ്റാറ്റിസ്റ്റിക്സിൽ നിന്നാണ്](https://wikipedia.org/wiki/Statistical_classification) ഉത്ഭവം, ക്ലാസിക് മെഷീൻ ലേണിംഗ് ഉപയോഗിച്ചുള്ള വർഗ്ഗീകരണം `smoker`, `weight`, `age` പോലുള്ള ഫീച്ചറുകൾ ഉപയോഗിച്ച് _X രോഗം ഉണ്ടാകാനുള്ള സാധ്യത_ നിർണയിക്കുന്നു. നിങ്ങൾ മുമ്പ് ചെയ്ത റെഗ്രഷൻ അഭ്യാസങ്ങളോട് സമാനമായ ഒരു സൂപ്പർവൈസ്ഡ് ലേണിംഗ് സാങ്കേതികവിദ്യയായി, നിങ്ങളുടെ ഡാറ്റ ലേബൽ ചെയ്തിരിക്കുന്നു, ML ആൽഗോരിതങ്ങൾ ആ ലേബലുകൾ ഉപയോഗിച്ച് ഡാറ്റാസെറ്റിന്റെ ക്ലാസുകൾ (അഥവാ 'ഫീച്ചറുകൾ') വർഗ്ഗീകരിക്കുകയും പ്രവചിക്കുകയും ചെയ്യുന്നു, അവ ഒരു ഗ്രൂപ്പിലോ ഫലത്തിലോ നിയോഗിക്കുന്നു.
✅ ഒരു പാചകശാലകളെക്കുറിച്ചുള്ള ഡാറ്റാസെറ്റ് കണക്കിലെടുക്കൂ. മൾട്ടിക്ലാസ് മോഡൽ എന്ത് ചോദിക്കാനാകും? ബൈനറി മോഡൽ എന്ത് ചോദിക്കാനാകും? ഒരു പാചകശാല ഫെനുഗ്രീക് ഉപയോഗിക്കുമോ എന്ന് നിർണയിക്കാൻ നിങ്ങൾ ആഗ്രഹിച്ചാൽ? സ്റ്റാർ അനീസ്, ആർട്ടിച്ചോക്ക്, കോളിഫ്ലവർ, ഹോർസ്റഡിഷ് നിറഞ്ഞ ഒരു ഗ്രോസറി ബാഗ് നൽകിയാൽ, ഒരു സാധാരണ ഇന്ത്യൻ വിഭവം സൃഷ്ടിക്കാമോ എന്ന് നിങ്ങൾ കാണാൻ ആഗ്രഹിച്ചാൽ?
[![Crazy mystery baskets](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Crazy mystery baskets")
> 🎥 മുകളിൽ കാണുന്ന ചിത്രത്തിൽ ക്ലിക്ക് ചെയ്യുക. 'ചോപ്പ്ഡ്' എന്ന ഷോയുടെ മുഴുവൻ ആശയം 'മിസ്റ്ററി ബാസ്കറ്റ്' ആണ്, ഇവിടെ ഷെഫുകൾക്ക് ഒരു യാദൃച്ഛിക ഘടകങ്ങൾ തിരഞ്ഞെടുക്കലിൽ നിന്ന് ഒരു വിഭവം ഉണ്ടാക്കണം. തീർച്ചയായും ഒരു ML മോഡൽ സഹായിച്ചേനെ!
## ഹലോ 'ക്ലാസിഫയർ'
ഈ പാചകശാല ഡാറ്റാസെറ്റിൽ നമുക്ക് ചോദിക്കാനാഗ്രഹിക്കുന്ന ചോദ്യം **മൾട്ടിക്ലാസ് ചോദ്യം** ആണ്, കാരണം നമുക്ക് നിരവധി ദേശീയ പാചകശാലകൾ ഉണ്ട്. ഒരു ഘടകങ്ങളുടെ ബാച്ച് നൽകിയാൽ, ഈ പല ക്ലാസുകളിൽ ഏതാണ് ഡാറ്റ പൊരുത്തപ്പെടുന്നത്?
Scikit-learn വിവിധ പ്രശ്നങ്ങൾ പരിഹരിക്കാൻ ഉപയോഗിക്കാവുന്ന വിവിധ ആൽഗോരിതങ്ങൾ നൽകുന്നു. അടുത്ത രണ്ട് പാഠങ്ങളിൽ, നിങ്ങൾ ഈ ആൽഗോരിതങ്ങളിൽ ചിലതിനെക്കുറിച്ച് പഠിക്കും.
## അഭ്യാസം - നിങ്ങളുടെ ഡാറ്റ ശുദ്ധീകരിക്കുകയും ബാലൻസ് ചെയ്യുകയും ചെയ്യുക
ഈ പ്രോജക്ട് ആരംഭിക്കുന്നതിന് മുമ്പ്, ആദ്യത്തെ ജോലി നിങ്ങളുടെ ഡാറ്റ ശുദ്ധീകരിക്കുകയും **ബാലൻസ്** ചെയ്യുകയും ചെയ്യുക, മികച്ച ഫലങ്ങൾ നേടാൻ. ഈ ഫോൾഡറിന്റെ റൂട്ടിൽ ഉള്ള ശൂന്യമായ _notebook.ipynb_ ഫയൽ ഉപയോഗിച്ച് തുടങ്ങുക.
ആദ്യമായി ഇൻസ്റ്റാൾ ചെയ്യേണ്ടത് [imblearn](https://imbalanced-learn.org/stable/) ആണ്. ഇത് Scikit-learn പാക്കേജ് ആണ്, ഡാറ്റയെ മികച്ച രീതിയിൽ ബാലൻസ് ചെയ്യാൻ സഹായിക്കും (ഈ ടാസ്ക് കുറച്ച് നേരം കൊണ്ട് നിങ്ങൾക്ക് പഠിക്കാം).
1. `imblearn` ഇൻസ്റ്റാൾ ചെയ്യാൻ, `pip install` ഓടിക്കുക, ഇങ്ങനെ:
```python
pip install imblearn
```
1. നിങ്ങളുടെ ഡാറ്റ ഇറക്കുമതി ചെയ്യാനും ദൃശ്യവൽക്കരിക്കാനും ആവശ്യമായ പാക്കേജുകൾ ഇറക്കുമതി ചെയ്യുക, കൂടാതെ `imblearn`-ൽ നിന്നുള്ള `SMOTE`-യും ഇറക്കുമതി ചെയ്യുക.
```python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from imblearn.over_sampling import SMOTE
```
ഇനി നിങ്ങൾക്ക് ഡാറ്റ ഇറക്കുമതി ചെയ്യാൻ സജ്ജമാണ്.
1. അടുത്ത ടാസ്ക് ഡാറ്റ ഇറക്കുമതി ചെയ്യുക:
```python
df = pd.read_csv('../data/cuisines.csv')
```
`read_csv()` ഉപയോഗിച്ച് _cusines.csv_ ഫയലിന്റെ ഉള്ളടക്കം വായിച്ച് `df` എന്ന വേരിയബിളിൽ സൂക്ഷിക്കും.
1. ഡാറ്റയുടെ ആകൃതി പരിശോധിക്കുക:
```python
df.head()
```
ആദ്യത്തെ അഞ്ച് വരികൾ ഇങ്ങനെ കാണപ്പെടും:
```output
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
| 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
```
1. ഈ ഡാറ്റയെക്കുറിച്ച് `info()` വിളിച്ച് വിവരങ്ങൾ നേടുക:
```python
df.info()
```
നിങ്ങളുടെ ഔട്ട്പുട്ട് ഇങ്ങനെ കാണപ്പെടും:
```output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2448 entries, 0 to 2447
Columns: 385 entries, Unnamed: 0 to zucchini
dtypes: int64(384), object(1)
memory usage: 7.2+ MB
```
## അഭ്യാസം - പാചകശാലകളെക്കുറിച്ച് പഠിക്കുക
ഇപ്പോൾ ജോലി കൂടുതൽ രസകരമാകുന്നു. ഓരോ പാചകശാലയ്ക്കും ഡാറ്റയുടെ വിതരണം കണ്ടെത്താം
1. `barh()` വിളിച്ച് ഡാറ്റ ബാറുകളായി പ്ലോട്ട് ചെയ്യുക:
```python
df.cuisine.value_counts().plot.barh()
```
![cuisine data distribution](../../../../translated_images/cuisine-dist.d0cc2d551abe5c25f83d73a5f560927e4a061e9a4560bac1e97d35682ef3ca6d.ml.png)
പാചകശാലകളുടെ എണ്ണം പരിമിതമാണ്, പക്ഷേ ഡാറ്റയുടെ വിതരണം അസമമാണ്. നിങ്ങൾ അത് ശരിയാക്കാം! അതിന് മുമ്പ്, കുറച്ച് കൂടുതൽ അന്വേഷിക്കൂ.
1. ഓരോ പാചകശാലയ്ക്കും ലഭ്യമായ ഡാറ്റയുടെ അളവ് കണ്ടെത്തി പ്രിന്റ് ചെയ്യുക:
```python
thai_df = df[(df.cuisine == "thai")]
japanese_df = df[(df.cuisine == "japanese")]
chinese_df = df[(df.cuisine == "chinese")]
indian_df = df[(df.cuisine == "indian")]
korean_df = df[(df.cuisine == "korean")]
print(f'thai df: {thai_df.shape}')
print(f'japanese df: {japanese_df.shape}')
print(f'chinese df: {chinese_df.shape}')
print(f'indian df: {indian_df.shape}')
print(f'korean df: {korean_df.shape}')
```
ഔട്ട്പുട്ട് ഇങ്ങനെ കാണപ്പെടും:
```output
thai df: (289, 385)
japanese df: (320, 385)
chinese df: (442, 385)
indian df: (598, 385)
korean df: (799, 385)
```
## ഘടകങ്ങൾ കണ്ടെത്തൽ
ഇപ്പോൾ നിങ്ങൾക്ക് ഡാറ്റയിൽ കൂടുതൽ ആഴത്തിൽ കയറി ഓരോ പാചകശാലയ്ക്കും സാധാരണ ഘടകങ്ങൾ എന്തൊക്കെയാണെന്ന് പഠിക്കാം. പാചകശാലകളിൽ ആശയക്കുഴപ്പം സൃഷ്ടിക്കുന്ന ആവർത്തിക്കുന്ന ഡാറ്റ നീക്കം ചെയ്യണം, അതിനാൽ ഈ പ്രശ്നത്തെക്കുറിച്ച് പഠിക്കാം.
1. Python-ൽ `create_ingredient()` എന്ന ഫംഗ്ഷൻ സൃഷ്ടിക്കുക, ഇത് ഒരു ഘടക ഡാറ്റാഫ്രെയിം സൃഷ്ടിക്കും. ഈ ഫംഗ്ഷൻ ഒരു ഉപകാരമില്ലാത്ത കോളം ഒഴിവാക്കി, ഘടകങ്ങളെ അവരുടെ എണ്ണത്തിന്റെ അടിസ്ഥാനത്തിൽ ക്രമീകരിക്കും:
```python
def create_ingredient_df(df):
ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')
ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]
ingredient_df = ingredient_df.sort_values(by='value', ascending=False,
inplace=False)
return ingredient_df
```
ഇപ്പോൾ ഈ ഫംഗ്ഷൻ ഉപയോഗിച്ച് ഓരോ പാചകശാലയിലും ഏറ്റവും ജനപ്രിയമായ പത്ത് ഘടകങ്ങൾ കണ്ടെത്താം.
1. `create_ingredient()` വിളിച്ച് `barh()` ഉപയോഗിച്ച് പ്ലോട്ട് ചെയ്യുക:
```python
thai_ingredient_df = create_ingredient_df(thai_df)
thai_ingredient_df.head(10).plot.barh()
```
![thai](../../../../translated_images/thai.0269dbab2e78bd38a132067759fe980008bdb80b6d778e5313448dbe12bed846.ml.png)
1. ജാപ്പനീസ് ഡാറ്റയ്ക്കും അതേപോലെ ചെയ്യുക:
```python
japanese_ingredient_df = create_ingredient_df(japanese_df)
japanese_ingredient_df.head(10).plot.barh()
```
![japanese](../../../../translated_images/japanese.30260486f2a05c463c8faa62ebe7b38f0961ed293bd9a6db8eef5d3f0cf17155.ml.png)
1. ചൈനീസ് ഘടകങ്ങൾക്കായി:
```python
chinese_ingredient_df = create_ingredient_df(chinese_df)
chinese_ingredient_df.head(10).plot.barh()
```
![chinese](../../../../translated_images/chinese.e62cafa5309f111afd1b54490336daf4e927ce32bed837069a0b7ce481dfae8d.ml.png)
1. ഇന്ത്യൻ ഘടകങ്ങൾ പ്ലോട്ട് ചെയ്യുക:
```python
indian_ingredient_df = create_ingredient_df(indian_df)
indian_ingredient_df.head(10).plot.barh()
```
![indian](../../../../translated_images/indian.2c4292002af1a1f97a4a24fec6b1459ee8ff616c3822ae56bb62b9903e192af6.ml.png)
1. അവസാനം കൊറിയൻ ഘടകങ്ങൾ:
```python
korean_ingredient_df = create_ingredient_df(korean_df)
korean_ingredient_df.head(10).plot.barh()
```
![korean](../../../../translated_images/korean.4a4f0274f3d9805a65e61f05597eeaad8620b03be23a2c0a705c023f65fad2c0.ml.png)
1. ഇപ്പോൾ, വ്യത്യസ്ത പാചകശാലകളിൽ ആശയക്കുഴപ്പം സൃഷ്ടിക്കുന്ന ഏറ്റവും സാധാരണ ഘടകങ്ങൾ `drop()` വിളിച്ച് ഒഴിവാക്കുക:
എല്ലാവർക്കും അരി, വെളുത്തുള്ളി, ഇഞ്ചി ഇഷ്ടമാണ്!
```python
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)
labels_df = df.cuisine #.unique()
feature_df.head()
```
## ഡാറ്റാസെറ്റ് ബാലൻസ് ചെയ്യുക
ഇപ്പോൾ നിങ്ങൾ ഡാറ്റ ശുദ്ധീകരിച്ചിരിക്കുന്നു, [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "സിന്തറ്റിക് മൈനോറിറ്റി ഓവർ-സാമ്പ്ലിംഗ് ടെക്നിക്" - ഉപയോഗിച്ച് അത് ബാലൻസ് ചെയ്യുക.
1. `fit_resample()` വിളിക്കുക, ഈ തന്ത്രം ഇന്റർപൊളേഷൻ വഴി പുതിയ സാമ്പിളുകൾ സൃഷ്ടിക്കുന്നു.
```python
oversample = SMOTE()
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
```
നിങ്ങളുടെ ഡാറ്റ ബാലൻസ് ചെയ്താൽ, വർഗ്ഗീകരണത്തിൽ മികച്ച ഫലങ്ങൾ ലഭിക്കും. ഒരു ബൈനറി വർഗ്ഗീകരണം പരിഗണിക്കൂ. നിങ്ങളുടെ ഡാറ്റയുടെ ഭൂരിഭാഗം ഒരു ക്ലാസ്സിൽ ആണെങ്കിൽ, ML മോഡൽ ആ ക്ലാസ് കൂടുതൽ പ്രവചിക്കും, കാരണം അതിനുള്ള ഡാറ്റ കൂടുതലാണ്. ഡാറ്റ ബാലൻസ് ചെയ്യുന്നത് ഈ അസമത്വം നീക്കം ചെയ്യാൻ സഹായിക്കുന്നു.
1. ഇപ്പോൾ ഓരോ ഘടകത്തിനും ലേബലുകളുടെ എണ്ണം പരിശോധിക്കാം:
```python
print(f'new label count: {transformed_label_df.value_counts()}')
print(f'old label count: {df.cuisine.value_counts()}')
```
നിങ്ങളുടെ ഔട്ട്പുട്ട് ഇങ്ങനെ കാണപ്പെടും:
```output
new label count: korean 799
chinese 799
indian 799
japanese 799
thai 799
Name: cuisine, dtype: int64
old label count: korean 799
indian 598
chinese 442
japanese 320
thai 289
Name: cuisine, dtype: int64
```
ഡാറ്റ നല്ലതും ശുദ്ധവും ബാലൻസും കൂടിയതും, വളരെ രുചികരവുമാണ്!
1. അവസാന ഘട്ടം, ലേബലുകളും ഫീച്ചറുകളും ഉൾപ്പെടുന്ന ബാലൻസ്ഡ് ഡാറ്റ ഒരു പുതിയ ഡാറ്റാഫ്രെയിമിൽ സേവ് ചെയ്യുക, ഇത് ഫയലായി എക്സ്പോർട്ട് ചെയ്യാവുന്നതാണ്:
```python
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
```
1. `transformed_df.head()`യും `transformed_df.info()`യും ഉപയോഗിച്ച് ഡാറ്റ വീണ്ടും പരിശോധിക്കാം. ഈ ഡാറ്റയുടെ ഒരു പകർപ്പ് ഭാവിയിലെ പാഠങ്ങൾക്കായി സേവ് ചെയ്യുക:
```python
transformed_df.head()
transformed_df.info()
transformed_df.to_csv("../data/cleaned_cuisines.csv")
```
ഈ പുതിയ CSV ഫയൽ ഇപ്പോൾ റൂട്ടിലെ ഡാറ്റ ഫോൾഡറിൽ ലഭ്യമാണ്.
---
## 🚀ചലഞ്ച്
ഈ പാഠ്യപദ്ധതിയിൽ പല രസകരമായ ഡാറ്റാസെറ്റുകളും ഉൾപ്പെടുത്തിയിട്ടുണ്ട്. `data` ഫോൾഡറുകൾ പരിശോധിച്ച്, ബൈനറി അല്ലെങ്കിൽ മൾട്ടി-ക്ലാസ് വർഗ്ഗീകരണത്തിന് അനുയോജ്യമായ ഡാറ്റാസെറ്റുകൾ ഉണ്ടോ എന്ന് നോക്കൂ. ഈ ഡാറ്റാസെറ്റിൽ നിങ്ങൾ എന്ത് ചോദ്യങ്ങൾ ചോദിക്കുമെന്നു ചിന്തിക്കൂ.
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
SMOTE-യുടെ API പരിശോധിക്കുക. ഏത് ഉപയോഗകേസുകൾക്കാണ് ഇത് ഏറ്റവും അനുയോജ്യം? ഇത് എവിടെ പ്രശ്നങ്ങൾ പരിഹരിക്കുന്നു?
## അസൈൻമെന്റ്
[വർഗ്ഗീകരണ രീതികൾ അന്വേഷിക്കുക](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ പ്രാമാണികമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b2a01912beb24cfb0007f83594dba801",
"translation_date": "2025-12-19T15:20:58+00:00",
"source_file": "4-Classification/1-Introduction/assignment.md",
"language_code": "ml"
}
-->
# വർഗ്ഗീകരണ രീതികൾ അന്വേഷിക്കുക
## നിർദ്ദേശങ്ങൾ
[Scikit-learn ഡോക്യുമെന്റേഷനിൽ](https://scikit-learn.org/stable/supervised_learning.html) നിങ്ങൾക്ക് ഡാറ്റ വർഗ്ഗീകരിക്കുന്ന നിരവധി മാർഗങ്ങൾ കണ്ടെത്താം. ഈ ഡോക്യുമെന്റുകളിൽ ചെറിയൊരു തിരച്ചിൽ നടത്തുക: നിങ്ങളുടെ ലക്ഷ്യം വർഗ്ഗീകരണ രീതികൾ അന്വേഷിച്ച് ഈ പാഠ്യപദ്ധതിയിലെ ഒരു ഡാറ്റാസെറ്റിനും, അതിൽ ചോദിക്കാവുന്ന ഒരു ചോദ്യത്തിനും, ഒരു വർഗ്ഗീകരണ സാങ്കേതിക വിദ്യയ്ക്കും പൊരുത്തപ്പെടുന്ന രീതികൾ കണ്ടെത്തുക. ഒരു സ്പ്രെഡ്‌ഷീറ്റ് അല്ലെങ്കിൽ .doc ഫയലിൽ ഒരു പട്ടിക സൃഷ്ടിച്ച് ഡാറ്റാസെറ്റ് ആ വർഗ്ഗീകരണ ആൽഗോരിതവുമായി എങ്ങനെ പ്രവർത്തിക്കുമെന്ന് വിശദീകരിക്കുക.
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണാർത്ഥം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| | 5 ആൽഗോരിതങ്ങൾ ഒരു വർഗ്ഗീകരണ സാങ്കേതിക വിദ്യയോടൊപ്പം അവലോകനം ചെയ്യുന്ന ഒരു ഡോക്യുമെന്റ് സമർപ്പിച്ചിരിക്കുന്നു. അവലോകനം നന്നായി വിശദീകരിച്ചും വിശദവുമാണ്. | 3 ആൽഗോരിതങ്ങൾ ഒരു വർഗ്ഗീകരണ സാങ്കേതിക വിദ്യയോടൊപ്പം അവലോകനം ചെയ്യുന്ന ഒരു ഡോക്യുമെന്റ് സമർപ്പിച്ചിരിക്കുന്നു. അവലോകനം നന്നായി വിശദീകരിച്ചും വിശദവുമാണ്. | 3-ൽ കുറവായ ആൽഗോരിതങ്ങൾ ഒരു വർഗ്ഗീകരണ സാങ്കേതിക വിദ്യയോടൊപ്പം അവലോകനം ചെയ്യുന്ന ഒരു ഡോക്യുമെന്റ് സമർപ്പിച്ചിരിക്കുന്നു, അവലോകനം നന്നായി വിശദീകരിച്ചോ വിശദവുമായിരുന്നില്ല. |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ പ്രാമാണികമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,41 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "d544ef384b7ba73757d830a72372a7f2",
"translation_date": "2025-12-19T17:02:31+00:00",
"source_file": "4-Classification/1-Introduction/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"# രുചികരമായ ഏഷ്യൻ மற்றும் ഇന്ത്യൻ വിഭവങ്ങൾ\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാ**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T15:37:00+00:00",
"source_file": "4-Classification/1-Introduction/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡർ ആണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,731 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_10-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "2621e24705e8100893c9bf84e0fc8aef",
"translation_date": "2025-12-19T17:07:27+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "ml"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# ഒരു വർഗ്ഗീകരണ മോഡൽ നിർമ്മിക്കുക: രുചികരമായ ഏഷ്യൻ மற்றும் ഇന്ത്യൻ ഭക്ഷണങ്ങൾ\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## ക്ലാസിഫിക്കേഷനിലേക്ക് പരിചയം: നിങ്ങളുടെ ഡാറ്റ ശുദ്ധീകരിക്കുക, തയ്യാറാക്കുക, ദൃശ്യവത്കരിക്കുക\n",
"\n",
"ഈ നാല് പാഠങ്ങളിൽ, നിങ്ങൾ ക്ലാസിക് മെഷീൻ ലേണിങ്ങിന്റെ ഒരു അടിസ്ഥാന ശ്രദ്ധാകേന്ദ്രമായ *ക്ലാസിഫിക്കേഷൻ* അന്വേഷിക്കും. ഏഷ്യയും ഇന്ത്യയും ഉൾപ്പെടുന്ന എല്ലാ പ്രശസ്തമായ പാചകശാലകളെക്കുറിച്ചുള്ള ഒരു ഡാറ്റാസെറ്റുമായി വിവിധ ക്ലാസിഫിക്കേഷൻ ആൽഗോരിതങ്ങൾ ഉപയോഗിച്ച് നാം നടക്കും. നിങ്ങൾക്ക് വിശക്കുമെന്ന് പ്രതീക്ഷിക്കുന്നു!\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/pinch.1b035ec9ba7e0d408313b551b60c721c9c290b2dd2094115bc87e6ddacd114c9.ml.png\"\n",
" width=\"600\"/>\n",
" <figcaption>ഈ പാഠങ്ങളിൽ പാൻ-ഏഷ്യൻ പാചകശാലകൾ ആഘോഷിക്കൂ! ചിത്രം: ജെൻ ലൂപ്പർ</figcaption>\n",
"\n",
"\n",
"<!--![Celebrate pan-Asian cuisines in these lessons! Image by Jen Looper](../../../../../../translated_images/pinch.b33c0ba76f284aad94a3c4e3ed83e13ed1e17fbcf4db8ca8583c3a0c135e2e99.ml.png)-->\n",
"\n",
"ക്ലാസിഫിക്കേഷൻ [സൂപ്പർവൈസ്ഡ് ലേണിങ്ങിന്റെ](https://wikipedia.org/wiki/Supervised_learning) ഒരു രൂപമാണ്, ഇത് റെഗ്രഷൻ സാങ്കേതികവിദ്യകളുമായി വളരെ സാമ്യമുണ്ട്. ക്ലാസിഫിക്കേഷനിൽ, ഒരു മോഡൽ ഒരു ഇനത്തിന് ഏത് `വിഭാഗം` ആണെന്ന് പ്രവചിക്കാൻ പരിശീലിപ്പിക്കുന്നു. മെഷീൻ ലേണിങ്ങ് ഡാറ്റാസെറ്റുകൾ ഉപയോഗിച്ച് വസ്തുക്കളുടെ മൂല്യങ്ങൾ അല്ലെങ്കിൽ പേരുകൾ പ്രവചിക്കുന്നതിനെക്കുറിച്ചാണെങ്കിൽ, ക്ലാസിഫിക്കേഷൻ സാധാരണയായി രണ്ട് വിഭാഗങ്ങളിലായി വിഭജിക്കപ്പെടുന്നു: *ബൈനറി ക്ലാസിഫിക്കേഷൻ*യും *മൾട്ടിക്ലാസ് ക്ലാസിഫിക്കേഷൻ*യും.\n",
"\n",
"ഓർമ്മിക്കുക:\n",
"\n",
"- **ലീനിയർ റെഗ്രഷൻ** വ്യത്യസ്ത വേരിയബിളുകൾ തമ്മിലുള്ള ബന്ധം പ്രവചിക്കാൻ സഹായിച്ചു, ഒരു പുതിയ ഡാറ്റാപോയിന്റ് ആ വരിയോട് എവിടെ പൊരുത്തപ്പെടും എന്ന് കൃത്യമായി പ്രവചിക്കാൻ. ഉദാഹരണത്തിന്, *സെപ്റ്റംബർ മാസത്തിൽ ഒരു പംപ്കിൻ വില എത്രയായിരിക്കും, ഡിസംബർ മാസത്തേക്കാൾ* എന്നിങ്ങനെ സംഖ്യാത്മക മൂല്യങ്ങൾ പ്രവചിക്കാമായിരുന്നു.\n",
"\n",
"- **ലോജിസ്റ്റിക് റെഗ്രഷൻ** \"ബൈനറി വിഭാഗങ്ങൾ\" കണ്ടെത്താൻ സഹായിച്ചു: ഈ വിലയിൽ, *ഈ പംപ്കിൻ ഓറഞ്ച് ആണോ അല്ലയോ*?\n",
"\n",
"ക്ലാസിഫിക്കേഷൻ ഡാറ്റാപോയിന്റിന്റെ ലേബൽ അല്ലെങ്കിൽ ക്ലാസ് നിർണയിക്കാൻ വിവിധ ആൽഗോരിതങ്ങൾ ഉപയോഗിക്കുന്നു. ഒരു പാചകശാല ഡാറ്റ ഉപയോഗിച്ച്, ഒരു ഘടകങ്ങളുടെ കൂട്ടം നിരീക്ഷിച്ച് അതിന്റെ പാചകശാലയുടെ ഉത്ഭവം നമുക്ക് നിർണയിക്കാമോ എന്ന് നോക്കാം.\n",
"\n",
"### [**പാഠം മുൻകൂർ ക്വിസ്**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **പരിചയം**\n",
"\n",
"ക്ലാസിഫിക്കേഷൻ മെഷീൻ ലേണിങ്ങ് ഗവേഷകനും ഡാറ്റാ സയന്റിസ്റ്റും നടത്തുന്ന അടിസ്ഥാന പ്രവർത്തനങ്ങളിൽ ഒന്നാണ്. ഒരു ബൈനറി മൂല്യത്തിന്റെ അടിസ്ഥാന ക്ലാസിഫിക്കേഷനിൽ നിന്ന് (\"ഈ ഇമെയിൽ സ്പാം ആണോ അല്ലയോ?\"), കമ്പ്യൂട്ടർ വിഷൻ ഉപയോഗിച്ച് സങ്കീർണ്ണമായ ഇമേജ് ക്ലാസിഫിക്കേഷൻ, സെഗ്മെന്റേഷൻ വരെ, ഡാറ്റ ക്ലാസുകളായി തിരിച്ച് അതിൽ ചോദ്യങ്ങൾ ചോദിക്കാൻ എപ്പോഴും ഉപകാരപ്രദമാണ്.\n",
"\n",
"പ്രക്രിയ ശാസ്ത്രീയമായി പറയുമ്പോൾ, നിങ്ങളുടെ ക്ലാസിഫിക്കേഷൻ രീതി ഇൻപുട്ട് വേരിയബിളുകളും ഔട്ട്പുട്ട് വേരിയബിളുകളും തമ്മിലുള്ള ബന്ധം മാപ്പ് ചെയ്യാൻ സഹായിക്കുന്ന പ്രവചന മോഡൽ സൃഷ്ടിക്കുന്നു.\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/binary-multiclass.b56d0c86c81105a697dddd82242c1d11e4d78b7afefea07a44627a0f1111c1a9.ml.png\"\n",
" width=\"600\"/>\n",
" <figcaption>ക്ലാസിഫിക്കേഷൻ ആൽഗോരിതങ്ങൾ കൈകാര്യം ചെയ്യേണ്ട ബൈനറി vs. മൾട്ടിക്ലാസ് പ്രശ്നങ്ങൾ. ഇൻഫോഗ്രാഫിക്: ജെൻ ലൂപ്പർ</figcaption>\n",
"\n",
"\n",
"\n",
"ഡാറ്റ ശുദ്ധീകരണം, ദൃശ്യവത്കരണം, ML പ്രവർത്തനങ്ങൾക്ക് തയ്യാറാക്കൽ തുടങ്ങിയ പ്രക്രിയ ആരംഭിക്കുന്നതിന് മുമ്പ്, മെഷീൻ ലേണിങ്ങ് ഡാറ്റ ക്ലാസിഫൈ ചെയ്യാൻ ഉപയോഗിക്കാവുന്ന വിവിധ മാർഗങ്ങൾ കുറച്ച് പഠിക്കാം.\n",
"\n",
"[സ്റ്റാറ്റിസ്റ്റിക്സിൽ നിന്നുള്ള](https://wikipedia.org/wiki/Statistical_classification) പ്രചോദനം ലഭിച്ച ക്ലാസിഫിക്കേഷൻ, ക്ലാസിക് മെഷീൻ ലേണിങ്ങ് ഉപയോഗിച്ച് `smoker`, `weight`, `age` പോലുള്ള ഫീച്ചറുകൾ ഉപയോഗിച്ച് *X രോഗം ഉണ്ടാകാനുള്ള സാധ്യത* നിർണയിക്കുന്നു. നിങ്ങൾ മുമ്പ് ചെയ്ത റെഗ്രഷൻ അഭ്യാസങ്ങളോട് സമാനമായ ഒരു സൂപ്പർവൈസ്ഡ് ലേണിങ്ങ് സാങ്കേതികവിദ്യയായി, നിങ്ങളുടെ ഡാറ്റ ലേബൽ ചെയ്തിരിക്കുന്നു, ML ആൽഗോരിതങ്ങൾ ആ ലേബലുകൾ ഉപയോഗിച്ച് ഡാറ്റാസെറ്റിന്റെ ക്ലാസുകൾ (അഥവാ 'ഫീച്ചറുകൾ') ക്ലാസിഫൈ ചെയ്ത് ഒരു ഗ്രൂപ്പിലോ ഫലത്തിലോ നിയോഗിക്കുന്നു.\n",
"\n",
"✅ ഒരു പാചകശാല ഡാറ്റാസെറ്റ് കണക്കിലെടുക്കുക. ഒരു മൾട്ടിക്ലാസ് മോഡൽ എന്ത് ചോദിക്കാനാകും? ഒരു ബൈനറി മോഡൽ എന്ത് ചോദിക്കാനാകും? ഒരു നൽകിയ പാചകശാല ഫേനുഗ്രീക് ഉപയോഗിക്കുമോ എന്ന് നിർണയിക്കാൻ നിങ്ങൾ ആഗ്രഹിച്ചാൽ? ഒരു ഗ്രോസറി ബാഗിൽ സ്റ്റാർ അനീസ്, ആർട്ടിച്ചോക്ക്, കോളിഫ്ലവർ, ഹോർസ്റഡിഷ് എന്നിവ ഉണ്ടെങ്കിൽ, ഒരു സാധാരണ ഇന്ത്യൻ വിഭവം സൃഷ്ടിക്കാമോ എന്ന് നിങ്ങൾ കാണാൻ ആഗ്രഹിച്ചാൽ?\n",
"\n",
"### **ഹലോ 'ക്ലാസിഫയർ'**\n",
"\n",
"ഈ പാചകശാല ഡാറ്റാസെറ്റിൽ നിന്ന് നമുക്ക് ചോദിക്കാനാഗ്രഹിക്കുന്ന ചോദ്യം യഥാർത്ഥത്തിൽ **മൾട്ടിക്ലാസ് ചോദ്യം** ആണ്, കാരണം നമുക്ക് പ്രവർത്തിക്കാനുള്ള നിരവധി ദേശീയ പാചകശാലകൾ ഉണ്ട്. ഒരു ഘടകങ്ങളുടെ ബാച്ച് നൽകിയാൽ, ഈ പല ക്ലാസുകളിൽ ഏതാണ് ഡാറ്റ പൊരുത്തപ്പെടുന്നത്?\n",
"\n",
"ടിഡിമോഡൽസ് ഡാറ്റ ക്ലാസിഫൈ ചെയ്യാൻ വിവിധ ആൽഗോരിതങ്ങൾ നൽകുന്നു, നിങ്ങൾ പരിഹരിക്കാൻ ആഗ്രഹിക്കുന്ന പ്രശ്നത്തിന്റെ തരം അനുസരിച്ച്. അടുത്ത രണ്ട് പാഠങ്ങളിൽ, നിങ്ങൾ ഈ ആൽഗോരിതങ്ങളിൽ ചിലതിനെക്കുറിച്ച് പഠിക്കും.\n",
"\n",
"#### **ആവശ്യമായ പാക്കേജുകൾ**\n",
"\n",
"ഈ പാഠത്തിനായി, നമുക്ക് ഡാറ്റ ശുദ്ധീകരിക്കാൻ, തയ്യാറാക്കാൻ, ദൃശ്യവത്കരിക്കാൻ താഴെപ്പറയുന്ന പാക്കേജുകൾ ആവശ്യമാണ്:\n",
"\n",
"- `tidyverse`: [ടിഡിവേഴ്സ്](https://www.tidyverse.org/) ഡാറ്റാ സയൻസ് വേഗത്തിൽ, എളുപ്പത്തിൽ, രസകരമായി നടത്താൻ രൂപകൽപ്പന ചെയ്ത [R പാക്കേജുകളുടെ സമാഹാരം](https://www.tidyverse.org/packages)!\n",
"\n",
"- `tidymodels`: [ടിഡിമോഡൽസ്](https://www.tidymodels.org/) ഫ്രെയിംവർക്ക് മോഡലിംഗ്, മെഷീൻ ലേണിങ്ങിനുള്ള [പാക്കേജുകളുടെ സമാഹാരമാണ്](https://www.tidymodels.org/packages/) .\n",
"\n",
"- `DataExplorer`: [DataExplorer പാക്കേജ്](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) EDA പ്രക്രിയയും റിപ്പോർട്ട് സൃഷ്ടിയും ലളിതമാക്കാനും ഓട്ടോമേറ്റുചെയ്യാനുമുള്ളതാണ്.\n",
"\n",
"- `themis`: [themis പാക്കേജ്](https://themis.tidymodels.org/) അസമതുലിത ഡാറ്റ കൈകാര്യം ചെയ്യുന്നതിനുള്ള അധിക റെസിപ്പി ഘട്ടങ്ങൾ നൽകുന്നു.\n",
"\n",
"ഇവ ഇൻസ്റ്റാൾ ചെയ്യാൻ:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"അല്ലെങ്കിൽ, താഴെ കൊടുത്തിരിക്കുന്ന സ്ക്രിപ്റ്റ് ഈ മോഡ്യൂൾ പൂർത്തിയാക്കാൻ ആവശ്യമായ പാക്കേജുകൾ നിങ്ങൾക്കുണ്ടോ എന്ന് പരിശോധിച്ച്, ഇല്ലെങ്കിൽ ഇൻസ്റ്റാൾ ചെയ്യും.\n"
],
"metadata": {
"id": "ri5bQxZ-Fz_0"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)"
],
"outputs": [],
"metadata": {
"id": "KIPxa4elGAPI"
}
},
{
"cell_type": "markdown",
"source": [
"നാം പിന്നീട് ഈ അത്ഭുതകരമായ പാക്കേജുകൾ ലോഡ് ചെയ്ത് നമ്മുടെ നിലവിലെ R സെഷനിൽ ലഭ്യമാക്കും. (ഇത് വെറും ഉദാഹരണത്തിന് ആണ്, `pacman::p_load()` ഇതിനകം തന്നെ അത് ചെയ്തിട്ടുണ്ട്)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Exercise - നിങ്ങളുടെ ഡാറ്റ ശുദ്ധീകരിക്കുകയും സമതുല്യപ്പെടുത്തുകയും ചെയ്യുക\n",
"\n",
"ഈ പ്രോജക്ട് ആരംഭിക്കുന്നതിന് മുമ്പ് ചെയ്യേണ്ട ആദ്യത്തെ ജോലി, മികച്ച ഫലങ്ങൾ നേടാൻ നിങ്ങളുടെ ഡാറ്റ ശുദ്ധീകരിക്കുകയും **സമതുല്യപ്പെടുത്തുകയും** ചെയ്യുക എന്നതാണ്\n",
"\n",
"ഡാറ്റയെ പരിചയപ്പെടാം!🕵️\n"
],
"metadata": {
"id": "PFkQDlk0GN5O"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import data\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n",
"\r\n",
"# View the first 5 rows\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {
"id": "Qccw7okxGT0S"
}
},
{
"cell_type": "markdown",
"source": [
"രസകരം! കാണുന്നത് പോലെ, ആദ്യ കോളം ഒരു തരത്തിലുള്ള `id` കോളമാണ്. ഡാറ്റയെക്കുറിച്ച് കുറച്ച് കൂടുതൽ വിവരങ്ങൾ നേടാം.\n"
],
"metadata": {
"id": "XrWnlgSrGVmR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Basic information about the data\r\n",
"df %>%\r\n",
" introduce()\r\n",
"\r\n",
"# Visualize basic information above\r\n",
"df %>% \r\n",
" plot_intro(ggtheme = theme_light())"
],
"outputs": [],
"metadata": {
"id": "4UcGmxRxGieA"
}
},
{
"cell_type": "markdown",
"source": [
"From the output, we can immediately see that we have `2448` rows and `385` columns and `0` missing values. We also have 1 discrete column, *cuisine*.\n",
"\n",
"## Exercise - learning about cuisines\n",
"\n",
"ഇപ്പോൾ ജോലി കൂടുതൽ രസകരമാകാൻ തുടങ്ങുന്നു. ഓരോ ക്യൂസിനിയുടെയും ഡാറ്റയുടെ വിതരണത്തെ നാം കണ്ടെത്താം.\n"
],
"metadata": {
"id": "AaPubl__GmH5"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Count observations per cuisine\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(n)\r\n",
"\r\n",
"# Plot the distribution\r\n",
"theme_set(theme_light())\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"cuisine\")"
],
"outputs": [],
"metadata": {
"id": "FRsBVy5eGrrv"
}
},
{
"cell_type": "markdown",
"source": [
"സമാപ്തമായ ഒരു സംഖ്യയിലുള്ള വിഭവശൈലികൾ ഉണ്ട്, പക്ഷേ ഡാറ്റയുടെ വിതരണം അസമതുല്യമാണ്. നിങ്ങൾ അത് ശരിയാക്കാം! അതിന് മുമ്പ്, കുറച്ച് കൂടുതൽ അന്വേഷിക്കാം.\n",
"\n",
"അടുത്തതായി, ഓരോ വിഭവശൈലിയും അതിന്റെ വ്യക്തിഗത ടിബിളിലേക്ക് നിയോഗിച്ച്, ഓരോ വിഭവശൈലിക്കും ലഭ്യമായ ഡാറ്റ എത്രയാണെന്ന് (പങ്കുകൾ, കോളങ്ങൾ) കണ്ടെത്താം.\n",
"\n",
"> ഒരു [ടിബിള്](https://tibble.tidyverse.org/) ഒരു ആധുനിക ഡാറ്റാ ഫ്രെയിം ആണ്.\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/dplyr_filter.b480b264b03439ff7051232a8de1df9a8fd4df723db316feb4f9f5e990db4318.ml.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Artwork by @allison_horst</figcaption>\n"
],
"metadata": {
"id": "vVvyDb1kG2in"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create individual tibble for the cuisines\r\n",
"thai_df <- df %>% \r\n",
" filter(cuisine == \"thai\")\r\n",
"japanese_df <- df %>% \r\n",
" filter(cuisine == \"japanese\")\r\n",
"chinese_df <- df %>% \r\n",
" filter(cuisine == \"chinese\")\r\n",
"indian_df <- df %>% \r\n",
" filter(cuisine == \"indian\")\r\n",
"korean_df <- df %>% \r\n",
" filter(cuisine == \"korean\")\r\n",
"\r\n",
"\r\n",
"# Find out how much data is available per cuisine\r\n",
"cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n",
" \"japanese df:\", dim(japanese_df), \"\\n\",\r\n",
" \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n",
" \"indian_df:\", dim(indian_df), \"\\n\",\r\n",
" \"korean_df:\", dim(korean_df))"
],
"outputs": [],
"metadata": {
"id": "0TvXUxD3G8Bk"
}
},
{
"cell_type": "markdown",
"source": [
"Perfect!😋\n",
"\n",
"## **അഭ്യാസം - dplyr ഉപയോഗിച്ച് വിഭവശൈലികൾ അനുസരിച്ച് പ്രധാന ഘടകങ്ങൾ കണ്ടെത്തൽ**\n",
"\n",
"ഇപ്പോൾ നിങ്ങൾക്ക് ഡാറ്റയിൽ കൂടുതൽ ആഴത്തിൽ കയറി ഓരോ വിഭവശൈലിക്കും സാധാരണമായ ഘടകങ്ങൾ എന്തൊക്കെയാണെന്ന് പഠിക്കാം. വിഭവശൈലികൾ തമ്മിൽ ആശയക്കുഴപ്പം സൃഷ്ടിക്കുന്ന ആവർത്തിക്കുന്ന ഡാറ്റ നീക്കം ചെയ്യേണ്ടതുണ്ട്, അതിനാൽ ഈ പ്രശ്നത്തെക്കുറിച്ച് പഠിക്കാം.\n",
"\n",
"R-ൽ ഒരു ഘടക ഡാറ്റാഫ്രെയിം തിരികെ നൽകുന്ന `create_ingredient()` എന്ന ഫംഗ്ഷൻ സൃഷ്ടിക്കുക. ഈ ഫംഗ്ഷൻ സഹായമില്ലാത്ത ഒരു കോളം ഒഴിവാക്കി ഘടകങ്ങളെ അവയുടെ എണ്ണത്തിന്റെ അടിസ്ഥാനത്തിൽ ക്രമീകരിച്ച് തുടങ്ങും.\n",
"\n",
"R-ൽ ഒരു ഫംഗ്ഷന്റെ അടിസ്ഥാന ഘടന:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"R ഫംഗ്ഷനുകളുടെ ഒരു ക്രമീകരിച്ച പരിചയം [ഇവിടെ](https://skirmer.github.io/presentations/functions_with_r.html#1) കാണാം.\n",
"\n",
"നേരെ തുടങ്ങാം! നാം മുമ്പത്തെ പാഠങ്ങളിൽ പഠിച്ച [dplyr ക്രിയാപദങ്ങൾ](https://dplyr.tidyverse.org/) ഉപയോഗിക്കും. ഒരു സംക്ഷേപമായി:\n",
"\n",
"- `dplyr::select()`: നിങ്ങൾക്ക് ഏത് **കോളങ്ങൾ** സൂക്ഷിക്കാനോ ഒഴിവാക്കാനോ സഹായിക്കുന്നു.\n",
"\n",
"- `dplyr::pivot_longer()`: ഡാറ്റ \"നീളമാക്കാൻ\" സഹായിക്കുന്നു, വരികളുടെ എണ്ണം വർദ്ധിപ്പിച്ച് കോളങ്ങളുടെ എണ്ണം കുറയ്ക്കുന്നു.\n",
"\n",
"- `dplyr::group_by()` and `dplyr::summarise()`: വ്യത്യസ്ത ഗ്രൂപ്പുകൾക്കായി സംഗ്രഹ സ്ഥിതിവിവരങ്ങൾ കണ്ടെത്താനും അവ ഒരു നല്ല പട്ടികയിലാക്കാനും സഹായിക്കുന്നു.\n",
"\n",
"- `dplyr::filter()`: നിങ്ങളുടെ നിബന്ധനകൾ പാലിക്കുന്ന വരികൾ മാത്രം ഉൾക്കൊള്ളുന്ന ഡാറ്റയുടെ ഉപസമൂഹം സൃഷ്ടിക്കുന്നു.\n",
"\n",
"- `dplyr::mutate()`: കോളങ്ങൾ സൃഷ്ടിക്കാനും മാറ്റാനും സഹായിക്കുന്നു.\n",
"\n",
"Allison Horst ഒരുക്കിയ ഈ [*കലാപരമായ* learnr ട്യൂട്ടോറിയൽ](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) നോക്കൂ, dplyr-ൽ ചില ഉപകാരപ്രദമായ ഡാറ്റ കൈകാര്യം ചെയ്യൽ ഫംഗ്ഷനുകൾ പരിചയപ്പെടുത്തുന്നു *(Tidyverse-ന്റെ ഭാഗം)*\n"
],
"metadata": {
"id": "K3RF5bSCHC76"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Creates a functions that returns the top ingredients by class\r\n",
"\r\n",
"create_ingredient <- function(df){\r\n",
" \r\n",
" # Drop the id column which is the first colum\r\n",
" ingredient_df = df %>% select(-1) %>% \r\n",
" # Transpose data to a long format\r\n",
" pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n",
" # Find the top most ingredients for a particular cuisine\r\n",
" group_by(ingredients) %>% \r\n",
" summarise(n_instances = sum(count)) %>% \r\n",
" filter(n_instances != 0) %>% \r\n",
" # Arrange by descending order\r\n",
" arrange(desc(n_instances)) %>% \r\n",
" mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n",
" \r\n",
" \r\n",
" return(ingredient_df)\r\n",
"} # End of function"
],
"outputs": [],
"metadata": {
"id": "uB_0JR82HTPa"
}
},
{
"cell_type": "markdown",
"source": [
"ഇപ്പോൾ നാം ഈ ഫംഗ്ഷൻ ഉപയോഗിച്ച് ഓരോ ക്യൂസിനിയുടെയും ഏറ്റവും ജനപ്രിയമായ പത്ത് ഘടകങ്ങളുടെ ഒരു ആശയം നേടാം. `thai_df` ഉപയോഗിച്ച് ഇത് പരീക്ഷിക്കാം.\n"
],
"metadata": {
"id": "h9794WF8HWmc"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Call create_ingredient and display popular ingredients\r\n",
"thai_ingredient_df <- create_ingredient(df = thai_df)\r\n",
"\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "agQ-1HrcHaEA"
}
},
{
"cell_type": "markdown",
"source": [
"മുൻവകുപ്പിൽ, നാം `geom_col()` ഉപയോഗിച്ചു, ഇനി `geom_bar` ഉപയോഗിച്ച് ബാർ ചാർട്ടുകൾ എങ്ങനെ സൃഷ്ടിക്കാമെന്ന് നോക്കാം. കൂടുതൽ വായനയ്ക്കായി `?geom_bar` ഉപയോഗിക്കുക.\n"
],
"metadata": {
"id": "kHu9ffGjHdcX"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a bar chart for popular thai cuisines\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10) %>% \r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "fb3Bx_3DHj6e"
}
},
{
"cell_type": "markdown",
"source": [
"ജാപ്പനീസ് ഡാറ്റയ്ക്കും അതേപോലെ ചെയ്യാം\n"
],
"metadata": {
"id": "RHP_xgdkHnvM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Japanese cuisines and make bar chart\r\n",
"create_ingredient(df = japanese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")\r\n"
],
"outputs": [],
"metadata": {
"id": "019v8F0XHrRU"
}
},
{
"cell_type": "markdown",
"source": [
"ചൈനീസ് ഭക്ഷണശൈലികൾ എന്താണ്?\n"
],
"metadata": {
"id": "iIGM7vO8Hu3v"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Chinese cuisines and make bar chart\r\n",
"create_ingredient(df = chinese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lHd9_gd2HyzU"
}
},
{
"cell_type": "markdown",
"source": [
"ഇന്ത്യൻ ഭക്ഷണശൈലികൾക്ക് ഒരു നോക്കാം 🌶️.\n"
],
"metadata": {
"id": "ir8qyQbNH1c7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Indian cuisines and make bar chart\r\n",
"create_ingredient(df = indian_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "ApukQtKjH5FO"
}
},
{
"cell_type": "markdown",
"source": [
"അവസാനമായി, കൊറിയൻ ഘടകങ്ങൾ പ്ലോട്ട് ചെയ്യുക.\n"
],
"metadata": {
"id": "qv30cwY1H-FM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Korean cuisines and make bar chart\r\n",
"create_ingredient(df = korean_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lumgk9cHIBie"
}
},
{
"cell_type": "markdown",
"source": [
"ഡാറ്റാ ദൃശ്യീകരണങ്ങളിൽ നിന്ന്, വ്യത്യസ്ത പാചകശൈലികൾ തമ്മിൽ ആശയക്കുഴപ്പം സൃഷ്ടിക്കുന്ന ഏറ്റവും സാധാരണമായ ഘടകങ്ങൾ `dplyr::select()` ഉപയോഗിച്ച് ഇനി ഒഴിവാക്കാം.\n",
"\n",
"എല്ലാവർക്കും അരി, വെളുത്തുള്ളി, ഇഞ്ചി ഇഷ്ടമാണ്!\n"
],
"metadata": {
"id": "iO4veMXuIEta"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Drop id column, rice, garlic and ginger from our original data set\r\n",
"df_select <- df %>% \r\n",
" select(-c(1, rice, garlic, ginger))\r\n",
"\r\n",
"# Display new data set\r\n",
"df_select %>% \r\n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "iHJPiG6rIUcK"
}
},
{
"cell_type": "markdown",
"source": [
"## Preprocessing data using recipes 👩‍🍳👨‍🍳 - Dealing with imbalanced data ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/recipes.186acfa8ed2e8f0059ce17ef22c9452d7b25e7e1e4b044573bacec9a18e040d2.ml.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Artwork by @allison_horst</figcaption>\n",
"\n",
"ഈ പാഠം വിഭവശൈലികളെക്കുറിച്ചാണ് എന്നതിനാൽ, `recipes` നെ സാന്ദർഭ്യത്തിൽ വെക്കേണ്ടതുണ്ട്.\n",
"\n",
"Tidymodels മറ്റൊരു മനോഹരമായ പാക്കേജ് നൽകുന്നു: `recipes` - ഡാറ്റ പ്രീപ്രോസസ്സിംഗിനുള്ള ഒരു പാക്കേജ്.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"നമ്മുടെ ഭക്ഷണശൈലികളുടെ വിതരണം വീണ്ടും നോക്കാം.\n"
],
"metadata": {
"id": "6l2ubtTPJAhY"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"old_label_count <- df_select %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"old_label_count"
],
"outputs": [],
"metadata": {
"id": "1e-E9cb7JDVi"
}
},
{
"cell_type": "markdown",
"source": [
"നിങ്ങൾക്ക് കാണാമല്ലോ, വിഭവങ്ങളുടെ എണ്ണം വളരെ അസമമായ വിതരണമാണ് ഉള്ളത്. കൊറിയൻ വിഭവങ്ങൾ തായ് വിഭവങ്ങളേക്കാൾ ഏകദേശം 3 മടങ്ങ് കൂടുതലാണ്. അസമത്വമുള്ള ഡാറ്റ മോഡൽ പ്രകടനത്തിൽ നെഗറ്റീവ് ഫലങ്ങൾ ഉണ്ടാക്കാറുണ്ട്. ഒരു ബൈനറി ക്ലാസിഫിക്കേഷൻ പരിഗണിക്കൂ. നിങ്ങളുടെ ഡാറ്റയുടെ ഭൂരിഭാഗവും ഒരു ക്ലാസ്സിൽ ആണെങ്കിൽ, ഒരു ML മോഡൽ ആ ക്ലാസ്സ് കൂടുതൽ പ്രവചിക്കും, കാരണം അതിനുള്ള ഡാറ്റ കൂടുതലാണ്. ഡാറ്റ ബാലൻസ് ചെയ്യുന്നത് ഏതെങ്കിലും വക്രമായ ഡാറ്റ എടുത്ത് ഈ അസമത്വം നീക്കം ചെയ്യാൻ സഹായിക്കുന്നു. നിരീക്ഷണങ്ങളുടെ എണ്ണം സമമാണ് എങ്കിൽ പല മോഡലുകളും മികച്ച പ്രകടനം കാണിക്കുന്നു, അതിനാൽ അസമത്വമുള്ള ഡാറ്റയുമായി അവർ ബുദ്ധിമുട്ടുന്നു.\n",
"\n",
"അസമത്വമുള്ള ഡാറ്റ സെറ്റുകളെ കൈകാര്യം ചെയ്യാനുള്ള പ്രധാനമായ രണ്ട് മാർഗ്ഗങ്ങൾ ഉണ്ട്:\n",
"\n",
"- ന്യൂനപക്ഷ ക്ലാസ്സിൽ നിരീക്ഷണങ്ങൾ ചേർക്കൽ: `Over-sampling` ഉദാഹരണത്തിന് SMOTE ആൽഗോരിതം ഉപയോഗിച്ച്\n",
"\n",
"- ഭൂരിപക്ഷ ക്ലാസ്സിൽ നിന്നുള്ള നിരീക്ഷണങ്ങൾ നീക്കം ചെയ്യൽ: `Under-sampling`\n",
"\n",
"ഇപ്പോൾ `recipe` ഉപയോഗിച്ച് അസമത്വമുള്ള ഡാറ്റ സെറ്റുകളെ എങ്ങനെ കൈകാര്യം ചെയ്യാമെന്ന് കാണിക്കാം. ഒരു recipe ഒരു ബ്ലൂപ്രിന്റ് പോലെ കരുതാം, അത് ഒരു ഡാറ്റ സെറ്റിൽ ഏത് ഘട്ടങ്ങൾ പ്രയോഗിക്കണം എന്ന് വിവരിക്കുന്നു, ഡാറ്റ വിശകലനത്തിന് തയ്യാറാക്കാൻ.\n"
],
"metadata": {
"id": "soAw6826JKx9"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load themis package for dealing with imbalanced data\r\n",
"library(themis)\r\n",
"\r\n",
"# Create a recipe for preprocessing data\r\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n",
" step_smote(cuisine)\r\n",
"\r\n",
"cuisines_recipe"
],
"outputs": [],
"metadata": {
"id": "HS41brUIJVJy"
}
},
{
"cell_type": "markdown",
"source": [
"നമ്മുടെ പ്രീപ്രോസസ്സിംഗ് ഘട്ടങ്ങൾ വിഭജിക്കാം.\n",
"\n",
"- ഒരു ഫോർമുലയോടുകൂടിയ `recipe()` കോളിന് `df_select` ഡാറ്റയെ റഫറൻസായി ഉപയോഗിച്ച് വേരിയബിളുകളുടെ *പങ്കുകൾ* റെസിപ്പിക്ക് അറിയിക്കുന്നു. ഉദാഹരണത്തിന്, `cuisine` കോളത്തിന് `outcome` പങ്ക് നൽകപ്പെട്ടിട്ടുള്ളപ്പോൾ ബാക്കി കോളങ്ങൾക്ക് `predictor` പങ്ക് നൽകപ്പെട്ടിരിക്കുന്നു.\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) ഒരു റെസിപ്പി ഘട്ടത്തിന്റെ *സ്പെസിഫിക്കേഷൻ* സൃഷ്ടിക്കുന്നു, ഇത് ന്യൂനപക്ഷ ക്ലാസ്സിന്റെ പുതിയ ഉദാഹരണങ്ങൾ സിന്തറ്റിക്കായി ഈ കേസുകളുടെ അടുത്തുള്ള അയൽക്കാരെ ഉപയോഗിച്ച് സൃഷ്ടിക്കുന്നു.\n",
"\n",
"ഇപ്പോൾ, നമുക്ക് പ്രീപ്രോസസ്സുചെയ്ത ഡാറ്റ കാണണമെങ്കിൽ, നമുക്ക് [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html)യും [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html)യും നമ്മുടെ റെസിപ്പിയിൽ ചെയ്യേണ്ടതുണ്ട്.\n",
"\n",
"`prep()`: പരിശീലന സെറ്റിൽ നിന്നുള്ള ആവശ്യമായ പാരാമീറ്ററുകൾ കണക്കാക്കുന്നു, പിന്നീട് മറ്റ് ഡാറ്റാ സെറ്റുകളിൽ പ്രയോഗിക്കാവുന്നതാണ്.\n",
"\n",
"`bake()`: പ്രീപ് ചെയ്ത റെസിപ്പി എടുത്ത് പ്രവർത്തനങ്ങൾ ഏതെങ്കിലും ഡാറ്റാ സെറ്റിൽ പ്രയോഗിക്കുന്നു.\n"
],
"metadata": {
"id": "Yb-7t7XcJaC8"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Prep and bake the recipe\r\n",
"preprocessed_df <- cuisines_recipe %>% \r\n",
" prep() %>% \r\n",
" bake(new_data = NULL) %>% \r\n",
" relocate(cuisine)\r\n",
"\r\n",
"# Display data\r\n",
"preprocessed_df %>% \r\n",
" slice_head(n = 5)\r\n",
"\r\n",
"# Quick summary stats\r\n",
"preprocessed_df %>% \r\n",
" introduce()"
],
"outputs": [],
"metadata": {
"id": "9QhSgdpxJl44"
}
},
{
"cell_type": "markdown",
"source": [
"ഇപ്പോൾ നമുക്ക് നമ്മുടെ ഭക്ഷണശൈലികളുടെ വിതരണവും അവയെ അസമതുല്യ ഡാറ്റയുമായി താരതമ്യം ചെയ്യലും പരിശോധിക്കാം.\n"
],
"metadata": {
"id": "dmidELh_LdV7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"new_label_count <- preprocessed_df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"list(new_label_count = new_label_count,\r\n",
" old_label_count = old_label_count)"
],
"outputs": [],
"metadata": {
"id": "aSh23klBLwDz"
}
},
{
"cell_type": "markdown",
"source": [
"യം! ഡാറ്റ സുഖകരവും ശുദ്ധവുമാണ്, സമതുലിതവും വളരെ രുചികരവുമാണ് 😋!\n",
"\n",
"> സാധാരണയായി, ഒരു റെസിപ്പി മോഡലിംഗിനായി പ്രീപ്രോസസറായാണ് ഉപയോഗിക്കുന്നത്, അതായത് മോഡലിംഗിനായി ഡാറ്റ സെറ്റിൽ ഏത് ഘട്ടങ്ങൾ പ്രയോഗിക്കണമെന്ന് നിർവചിക്കുന്നു. അത്തരത്തിൽ, ഒരു `workflow()` സാധാരണയായി ഉപയോഗിക്കുന്നു (മുൻപത്തെ പാഠങ്ങളിൽ നാം ഇതിനകം കണ്ടതുപോലെ) റെസിപ്പി മാനുവലായി കണക്കാക്കുന്നതിന് പകരം\n",
">\n",
"> അതിനാൽ, tidymodels ഉപയോഗിക്കുമ്പോൾ സാധാരണയായി **`prep()`** ഉം **`bake()`** ഉം റെസിപ്പികൾക്ക് ആവശ്യമില്ല, പക്ഷേ നമ്മുടെ കേസിൽ പോലെ റെസിപ്പികൾ നിങ്ങൾ പ്രതീക്ഷിക്കുന്നതുപോലെ പ്രവർത്തിക്കുന്നുണ്ടെന്ന് സ്ഥിരീകരിക്കാൻ ഇവ ഉപകാരപ്രദമായ ഫംഗ്ഷനുകളാണ്.\n",
">\n",
"> നിങ്ങൾ **`bake()`** ചെയ്തപ്പോൾ പ്രീപ്രോപ്പുചെയ്ത റെസിപ്പി **`new_data = NULL`** ഉപയോഗിച്ച്, നിങ്ങൾ റെസിപ്പി നിർവചിക്കുമ്പോൾ നൽകിയ ഡാറ്റ തന്നെ തിരികെ ലഭിക്കും, എന്നാൽ പ്രീപ്രോസസിംഗ് ഘട്ടങ്ങൾ കടന്നുപോയിരിക്കും.\n",
"\n",
"ഇപ്പോൾ ഈ ഡാറ്റയുടെ ഒരു പകർപ്പ് ഭാവിയിലെ പാഠങ്ങളിൽ ഉപയോഗിക്കാൻ സംരക്ഷിക്കാം:\n"
],
"metadata": {
"id": "HEu80HZ8L7ae"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Save preprocessed data\r\n",
"write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")"
],
"outputs": [],
"metadata": {
"id": "cBmCbIgrMOI6"
}
},
{
"cell_type": "markdown",
"source": [
"ഈ പുതിയ CSV ഇപ്പോൾ റൂട്ട് ഡാറ്റ ഫോൾഡറിൽ കണ്ടെത്താം.\n",
"\n",
"**🚀ചലഞ്ച്**\n",
"\n",
"ഈ പാഠ്യപദ്ധതിയിൽ പല രസകരമായ ഡാറ്റാസെറ്റുകളും ഉൾക്കൊള്ളുന്നു. `data` ഫോൾഡറുകൾ പരിശോധിച്ച് ബൈനറി അല്ലെങ്കിൽ മൾട്ടി-ക്ലാസ് ക്ലാസിഫിക്കേഷനായി അനുയോജ്യമായ ഡാറ്റാസെറ്റുകൾ ഉണ്ടോ എന്ന് നോക്കൂ? ഈ ഡാറ്റാസെറ്റിൽ നിന്നു നിങ്ങൾ ഏത് ചോദ്യങ്ങൾ ചോദിക്കുമായിരുന്നു?\n",
"\n",
"## [**പോസ്റ്റ്-ലെക്ചർ ക്വിസ്**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **പരിശോധന & സ്വയം പഠനം**\n",
"\n",
"- [package themis](https://github.com/tidymodels/themis) പരിശോധിക്കുക. അസമതുല്യമായ ഡാറ്റ കൈകാര്യം ചെയ്യാൻ മറ്റേതെന്തെല്ലാം സാങ്കേതിക വിദ്യകൾ ഉപയോഗിക്കാമെന്ന് നോക്കൂ?\n",
"\n",
"- ടിഡി മോഡലുകൾ [റഫറൻസ് വെബ്സൈറ്റ്](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham and G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n",
"\n",
"#### നന്ദി അറിയിക്കുന്നു:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) R-നെ കൂടുതൽ സ്വാഗതം ചെയ്യുന്നതും ആകർഷകവുമാക്കുന്ന അത്ഭുതകരമായ ചിത്രങ്ങൾ സൃഷ്ടിച്ചതിന്. അവളുടെ കൂടുതൽ ചിത്രങ്ങൾ അവളുടെ [ഗാലറി](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM)യിൽ കാണാം.\n",
"\n",
"[Cassie Breviu](https://www.twitter.com/cassieview) and [Jen Looper](https://www.twitter.com/jenlooper) ഈ മോഡ്യൂളിന്റെ ഒറിജിനൽ പൈതൺ പതിപ്പ് സൃഷ്ടിച്ചതിന് ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/r_learners_sm.cd14eb3581a9f28d32086cc042ee8c46f621a5b4e0d59c75f7c642d891327043.ml.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Artwork by @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാപത്രം**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, യന്ത്രം ചെയ്ത വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,257 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1a6e9e46b34a2e559fbbfc1f95397c7b",
"translation_date": "2025-12-19T15:32:50+00:00",
"source_file": "4-Classification/2-Classifiers-1/README.md",
"language_code": "ml"
}
-->
# ഭക്ഷണശൈലി ക്ലാസിഫയർമാർ 1
ഈ പാഠത്തിൽ, നിങ്ങൾ കഴിഞ്ഞ പാഠത്തിൽ നിന്ന് സംരക്ഷിച്ച, ഭക്ഷണശൈലികളെക്കുറിച്ചുള്ള സമതുലിതവും ശുദ്ധവുമായ ഡാറ്റയുള്ള ഡാറ്റാസെറ്റ് ഉപയോഗിക്കും.
നിങ്ങൾ ഈ ഡാറ്റാസെറ്റ് വിവിധ ക്ലാസിഫയർമാരുമായി ഉപയോഗിച്ച് _ഒരു ഗ്രൂപ്പ് ഘടകങ്ങളുടെ അടിസ്ഥാനത്തിൽ ഒരു നാഷണൽ ഭക്ഷണശൈലി പ്രവചിക്കു_. ഇതു ചെയ്യുമ്പോൾ, ക്ലാസിഫിക്കേഷൻ ടാസ്കുകൾക്കായി ആൽഗോരിതങ്ങൾ എങ്ങനെ ഉപയോഗിക്കാമെന്ന് കുറച്ച് കൂടുതൽ പഠിക്കും.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
# തയ്യാറെടുപ്പ്
[പാഠം 1](../1-Introduction/README.md) പൂർത്തിയാക്കിയതായി കരുതുമ്പോൾ, ഈ നാല് പാഠങ്ങൾക്കായി റൂട്ട് `/data` ഫോൾഡറിൽ _cleaned_cuisines.csv_ ഫയൽ ഉണ്ടെന്ന് ഉറപ്പാക്കുക.
## അഭ്യാസം - ഒരു നാഷണൽ ഭക്ഷണശൈലി പ്രവചിക്കുക
1. ഈ പാഠത്തിലെ _notebook.ipynb_ ഫോൾഡറിൽ പ്രവർത്തിച്ച്, ആ ഫയലും Pandas ലൈബ്രറിയും ഇറക്കുമതി ചെയ്യുക:
```python
import pandas as pd
cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
cuisines_df.head()
```
ഡാറ്റ ഇങ്ങനെ കാണപ്പെടും:
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
1. ഇപ്പോൾ, കൂടുതൽ ലൈബ്രറികൾ ഇറക്കുമതി ചെയ്യുക:
```python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
from sklearn.svm import SVC
import numpy as np
```
1. പരിശീലനത്തിനായി X, y കോർഡിനേറ്റുകൾ രണ്ട് ഡാറ്റാഫ്രെയിമുകളായി വിഭജിക്കുക. `cuisine` ലേബലുകളുടെ ഡാറ്റാഫ്രെയിം ആകാം:
```python
cuisines_label_df = cuisines_df['cuisine']
cuisines_label_df.head()
```
ഇത് ഇങ്ങനെ കാണപ്പെടും:
```output
0 indian
1 indian
2 indian
3 indian
4 indian
Name: cuisine, dtype: object
```
1. ആ `Unnamed: 0` കോളവും `cuisine` കോളവും `drop()` ഉപയോഗിച്ച് ഒഴിവാക്കുക. ബാക്കി ഡാറ്റ പരിശീലന ഫീച്ചറുകളായി സേവ് ചെയ്യുക:
```python
cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
cuisines_feature_df.head()
```
നിങ്ങളുടെ ഫീച്ചറുകൾ ഇങ്ങനെ കാണപ്പെടും:
| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
ഇപ്പോൾ നിങ്ങൾ മോഡൽ പരിശീലിപ്പിക്കാൻ തയ്യാറാണ്!
## നിങ്ങളുടെ ക്ലാസിഫയർ തിരഞ്ഞെടുക്കൽ
ഇപ്പോൾ നിങ്ങളുടെ ഡാറ്റ ശുദ്ധവും പരിശീലനത്തിനും തയ്യാറുമാകുമ്പോൾ, ജോലിക്ക് ഏത് ആൽഗോരിതം ഉപയോഗിക്കണമെന്ന് തീരുമാനിക്കണം.
Scikit-learn ക്ലാസിഫിക്കേഷൻ സൂപ്പർവൈസ്ഡ് ലേണിങ്ങിന്റെ കീഴിൽ ഗ്രൂപ്പ് ചെയ്യുന്നു, ആ വിഭാഗത്തിൽ നിങ്ങൾക്ക് ക്ലാസിഫൈ ചെയ്യാനുള്ള നിരവധി മാർഗങ്ങൾ കാണാം. [വിവിധത്വം](https://scikit-learn.org/stable/supervised_learning.html) ആദ്യ കാഴ്ചയിൽ തന്നെ ആശ്ചര്യപ്പെടുത്തുന്നതാണ്. താഴെപ്പറയുന്ന രീതികൾ എല്ലാം ക്ലാസിഫിക്കേഷൻ സാങ്കേതികതകൾ ഉൾക്കൊള്ളുന്നു:
- ലീനിയർ മോഡലുകൾ
- സപ്പോർട്ട് വെക്ടർ മെഷീനുകൾ
- സ്റ്റോക്കാസ്റ്റിക് ഗ്രേഡിയന്റ് ഡിസെന്റ്
- അടുത്തുള്ള അയൽക്കാർ
- ഗൗസിയൻ പ്രോസസുകൾ
- ഡിസിഷൻ ട്രീകൾ
- എൻസംബിൾ രീതികൾ (വോട്ടിംഗ് ക്ലാസിഫയർ)
- മൾട്ടിക്ലാസ്, മൾട്ടി ഔട്ട്പുട്ട് ആൽഗോരിതങ്ങൾ (മൾട്ടിക്ലാസ്, മൾട്ടിലേബൽ ക്ലാസിഫിക്കേഷൻ, മൾട്ടിക്ലാസ്-മൾട്ടി ഔട്ട്പുട്ട് ക്ലാസിഫിക്കേഷൻ)
> [ന്യൂറൽ നെറ്റ്വർക്കുകൾ](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification) ഡാറ്റ ക്ലാസിഫൈ ചെയ്യാൻ ഉപയോഗിക്കാം, പക്ഷേ അത് ഈ പാഠത്തിന്റെ പരിധിക്ക് പുറത്താണ്.
### ഏത് ക്ലാസിഫയർ തിരഞ്ഞെടുക്കണം?
അപ്പോൾ, ഏത് ക്ലാസിഫയർ തിരഞ്ഞെടുക്കണം? പലതും പരീക്ഷിച്ച് നല്ല ഫലം കാണുന്നത് പരീക്ഷിക്കാൻ ഒരു മാർഗമാണ്. Scikit-learn ഒരു [സൈഡ്-ബൈ-സൈഡ് താരതമ്യം](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) ഒരുക്കിയിട്ടുണ്ട്, KNeighbors, SVC രണ്ട് രീതികൾ, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB, QuadraticDiscrinationAnalysis എന്നിവയുടെ ഫലങ്ങൾ ദൃശ്യമായി കാണിക്കുന്നു:
![ക്ലാസിഫയറുകളുടെ താരതമ്യം](../../../../translated_images/comparison.edfab56193a85e7fdecbeaa1b1f8c99e94adbf7178bed0de902090cf93d6734f.ml.png)
> Scikit-learn ഡോക്യുമെന്റേഷനിൽ നിന്നുള്ള പ്ലോട്ടുകൾ
> AutoML ഈ പ്രശ്നം ക്ലൗഡിൽ ഈ താരതമ്യങ്ങൾ നടത്തിക്കൊണ്ട് സുതാര്യമായി പരിഹരിക്കുന്നു, നിങ്ങളുടെ ഡാറ്റയ്ക്ക് ഏറ്റവും അനുയോജ്യമായ ആൽഗോരിതം തിരഞ്ഞെടുക്കാൻ സഹായിക്കുന്നു. [ഇവിടെ](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott) പരീക്ഷിക്കുക
### ഒരു മെച്ചപ്പെട്ട സമീപനം
വളരെ അനുമാനിച്ച് തിരഞ്ഞെടുക്കുന്നതിന് പകരം, ഡൗൺലോഡ് ചെയ്യാവുന്ന [ML ചീറ്റ് ഷീറ്റ്](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott) ൽ ഉള്ള ആശയങ്ങൾ പിന്തുടരുക. ഇവിടെ, നമ്മുടെ മൾട്ടിക്ലാസ് പ്രശ്നത്തിന് ചില തിരഞ്ഞെടുപ്പുകൾ കാണാം:
![മൾട്ടിക്ലാസ് പ്രശ്നങ്ങൾക്ക് ചീറ്റ് ഷീറ്റ്](../../../../translated_images/cheatsheet.07a475ea444d22234cb8907a3826df5bdd1953efec94bd18e4496f36ff60624a.ml.png)
> മൈക്രോസോഫ്റ്റിന്റെ ആൽഗോരിതം ചീറ്റ് ഷീറ്റിന്റെ ഒരു ഭാഗം, മൾട്ടിക്ലാസ് ക്ലാസിഫിക്കേഷൻ ഓപ്ഷനുകൾ വിശദീകരിക്കുന്നു
✅ ഈ ചീറ്റ് ഷീറ്റ് ഡൗൺലോഡ് ചെയ്ത് പ്രിന്റ് ചെയ്ത് നിങ്ങളുടെ ഭിത്തിയിൽ തൂക്കുക!
### കാരണവിവരണം
നമുക്ക് നമുക്ക് ഉള്ള നിയന്ത്രണങ്ങൾ പരിഗണിച്ച് വ്യത്യസ്ത സമീപനങ്ങൾക്കായി കാരണവിവരണം നോക്കാം:
- **ന്യൂറൽ നെറ്റ്വർക്കുകൾ വളരെ ഭാരമുള്ളവയാണ്**. നമ്മുടെ ശുദ്ധവും കുറഞ്ഞ ഡാറ്റാസെറ്റും, നോട്ട്ബുക്കുകൾ വഴി ലോക്കലായി പരിശീലനം നടത്തുന്നതും കണക്കിലെടുത്താൽ, ന്യൂറൽ നെറ്റ്വർക്കുകൾ ഈ ജോലിക്ക് ഭാരമുള്ളവയാണ്.
- **രണ്ട്-ക്ലാസ് ക്ലാസിഫയർ ഇല്ല**. രണ്ട്-ക്ലാസ് ക്ലാസിഫയർ ഉപയോഗിക്കാത്തതിനാൽ, ഒന്ന്-വേഴ്സ്-ആൾ (one-vs-all) ഒഴിവാക്കാം.
- **ഡിസിഷൻ ട്രീ അല്ലെങ്കിൽ ലോജിസ്റ്റിക് റെഗ്രഷൻ പ്രവർത്തിക്കാം**. ഒരു ഡിസിഷൻ ട്രീ പ്രവർത്തിക്കാം, അല്ലെങ്കിൽ മൾട്ടിക്ലാസ് ഡാറ്റയ്ക്ക് ലോജിസ്റ്റിക് റെഗ്രഷൻ.
- **മൾട്ടിക്ലാസ് ബൂസ്റ്റഡ് ഡിസിഷൻ ട്രീകൾ വ്യത്യസ്ത പ്രശ്നം പരിഹരിക്കുന്നു**. മൾട്ടിക്ലാസ് ബൂസ്റ്റഡ് ഡിസിഷൻ ട്രീ സാധാരണ റാങ്കിംഗ് നിർമ്മാണം പോലുള്ള നോൺപാരാമെട്രിക് ടാസ്കുകൾക്കാണ് അനുയോജ്യം, അതിനാൽ നമ്മുടെ ജോലിക്ക് ഉപയോഗപ്രദമല്ല.
### Scikit-learn ഉപയോഗിച്ച്
നാം Scikit-learn ഉപയോഗിച്ച് ഡാറ്റ വിശകലനം ചെയ്യും. എന്നാൽ, Scikit-learn-ൽ ലോജിസ്റ്റിക് റെഗ്രഷൻ ഉപയോഗിക്കുന്ന നിരവധി മാർഗങ്ങൾ ഉണ്ട്. [പാരാമീറ്ററുകൾ](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression) നോക്കുക.
പ്രധാനമായും രണ്ട് പാരാമീറ്ററുകൾ - `multi_class` ഉം `solver` ഉം - നമുക്ക് നിർദ്ദേശിക്കേണ്ടതാണ്, Scikit-learn-ൽ ലോജിസ്റ്റിക് റെഗ്രഷൻ നടത്തുമ്പോൾ. `multi_class` ഒരു പ്രത്യേക പെരുമാറ്റം പ്രയോഗിക്കുന്നു. `solver` ആൽഗോരിതം തിരഞ്ഞെടുക്കുന്നു. എല്ലാ സോൾവറുകളും എല്ലാ `multi_class` മൂല്യങ്ങളോടും പൊരുത്തപ്പെടുന്നില്ല.
ഡോക്യുമെന്റേഷനുസരിച്ച്, മൾട്ടിക്ലാസ് കേസിൽ, പരിശീലന ആൽഗോരിതം:
- **`multi_class` ഓപ്ഷൻ `ovr` ആണെങ്കിൽ ഒന്ന്-വേഴ്സ്-റെസ്റ്റ് (OvR) സ്കീം ഉപയോഗിക്കുന്നു**
- **`multi_class` ഓപ്ഷൻ `multinomial` ആണെങ്കിൽ ക്രോസ്-എൻട്രോപി ലോസ് ഉപയോഗിക്കുന്നു**. (ഇപ്പോൾ `multinomial` ഓപ്ഷൻ lbfgs, sag, saga, newton-cg സോൾവറുകൾക്ക് മാത്രമേ പിന്തുണയുള്ളൂ.)"
> 🎓 ഇവിടെ 'സ്കീം' എന്നത് 'ovr' (ഒന്ന്-വേഴ്സ്-റെസ്റ്റ്) അല്ലെങ്കിൽ 'multinomial' ആകാം. ലോജിസ്റ്റിക് റെഗ്രഷൻ ബൈനറി ക്ലാസിഫിക്കേഷൻക്ക് രൂപകൽപ്പന ചെയ്തതിനാൽ, ഈ സ്കീമുകൾ മൾട്ടിക്ലാസ് ക്ലാസിഫിക്കേഷൻ ടാസ്കുകൾക്ക് മികച്ച പിന്തുണ നൽകുന്നു. [മൂലം](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/)
> 🎓 'സോൾവർ' എന്നത് "ഓപ്റ്റിമൈസേഷൻ പ്രശ്നത്തിൽ ഉപയോഗിക്കുന്ന ആൽഗോരിതം" എന്നാണ് നിർവചിക്കുന്നത്. [മൂലം](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
Scikit-learn ഈ പട്ടിക നൽകുന്നു, സോൾവറുകൾ വിവിധ ഡാറ്റാ ഘടനകളിൽ എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്ന് വിശദീകരിക്കാൻ:
![സോൾവറുകൾ](../../../../translated_images/solvers.5fc648618529e627dfac29b917b3ccabda4b45ee8ed41b0acb1ce1441e8d1ef1.ml.png)
## അഭ്യാസം - ഡാറ്റ വിഭജിക്കുക
നിങ്ങൾ അടുത്ത പാഠത്തിൽ പഠിച്ച ലോജിസ്റ്റിക് റെഗ്രഷൻ ആദ്യ പരിശീലന ശ്രമമായി ഉപയോഗിക്കാം.
`train_test_split()` വിളിച്ച് നിങ്ങളുടെ ഡാറ്റ പരിശീലനവും പരിശോധനയും ഗ്രൂപ്പുകളായി വിഭജിക്കുക:
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
```
## അഭ്യാസം - ലോജിസ്റ്റിക് റെഗ്രഷൻ പ്രയോഗിക്കുക
നിങ്ങൾ മൾട്ടിക്ലാസ് കേസ് ഉപയോഗിക്കുന്നതിനാൽ, ഏത് _സ്കീ_ ഉപയോഗിക്കണമെന്ന്, ഏത് _സോൾവർ_ സെറ്റ് ചെയ്യണമെന്ന് തിരഞ്ഞെടുക്കണം. മൾട്ടിക്ലാസ് സെറ്റിങ്ങിൽ `multi_class` `ovr` ആയും സോൾവർ **liblinear** ആയും സെറ്റ് ചെയ്ത് LogisticRegression ഉപയോഗിച്ച് പരിശീലിപ്പിക്കുക.
1. `multi_class` `ovr` ആയും സോൾവർ `liblinear` ആയും സെറ്റ് ചെയ്ത് ലോജിസ്റ്റിക് റെഗ്രഷൻ സൃഷ്ടിക്കുക:
```python
lr = LogisticRegression(multi_class='ovr',solver='liblinear')
model = lr.fit(X_train, np.ravel(y_train))
accuracy = model.score(X_test, y_test)
print ("Accuracy is {}".format(accuracy))
```
✅ സാധാരണയായി ഡിഫോൾട്ട് ആയി സെറ്റ് ചെയ്യുന്ന `lbfgs` പോലുള്ള മറ്റൊരു സോൾവർ പരീക്ഷിക്കുക
> ശ്രദ്ധിക്കുക, ആവശ്യമായപ്പോൾ Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) ഫംഗ്ഷൻ ഉപയോഗിച്ച് ഡാറ്റ ഫ്ലാറ്റൻ ചെയ്യുക.
കൃത്യത **80%** ക്കും മുകളിൽ നല്ലതാണ്!
1. ഡാറ്റയുടെ ഒരു വരി (#50) പരീക്ഷിച്ച് ഈ മോഡൽ പ്രവർത്തനം കാണാം:
```python
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
print(f'cuisine: {y_test.iloc[50]}')
```
ഫലം പ്രിന്റ് ചെയ്യും:
```output
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object')
cuisine: indian
```
✅ വ്യത്യസ്തമായ ഒരു വരി നമ്പർ പരീക്ഷിച്ച് ഫലങ്ങൾ പരിശോധിക്കുക
1. കൂടുതൽ ആഴത്തിൽ പരിശോധിക്കുമ്പോൾ, ഈ പ്രവചനത്തിന്റെ കൃത്യത പരിശോധിക്കാം:
```python
test= X_test.iloc[50].values.reshape(-1, 1).T
proba = model.predict_proba(test)
classes = model.classes_
resultdf = pd.DataFrame(data=proba, columns=classes)
topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])
topPrediction.head()
```
ഫലം പ്രിന്റ് ചെയ്യുന്നു - ഇന്ത്യൻ ഭക്ഷണമാണ് ഏറ്റവും സാധ്യതയുള്ള പ്രവചനമായി:
| | 0 |
| -------: | -------: |
| indian | 0.715851 |
| chinese | 0.229475 |
| japanese | 0.029763 |
| korean | 0.017277 |
| thai | 0.007634 |
✅ മോഡൽ ഈ ഭക്ഷണം ഇന്ത്യൻ ഭക്ഷണമാണെന്ന് എങ്ങനെ ഉറപ്പുള്ളതായി കാണിക്കുന്നു എന്ന് വിശദീകരിക്കാമോ?
1. റെഗ്രഷൻ പാഠങ്ങളിൽ ചെയ്തതുപോലെ ക്ലാസിഫിക്കേഷൻ റിപ്പോർട്ട് പ്രിന്റ് ചെയ്ത് കൂടുതൽ വിശദാംശങ്ങൾ നേടുക:
```python
y_pred = model.predict(X_test)
print(classification_report(y_test,y_pred))
```
| | precision | recall | f1-score | support |
| ------------ | --------- | ------ | -------- | ------- |
| chinese | 0.73 | 0.71 | 0.72 | 229 |
| indian | 0.91 | 0.93 | 0.92 | 254 |
| japanese | 0.70 | 0.75 | 0.72 | 220 |
| korean | 0.86 | 0.76 | 0.81 | 242 |
| thai | 0.79 | 0.85 | 0.82 | 254 |
| accuracy | 0.80 | 1199 | | |
| macro avg | 0.80 | 0.80 | 0.80 | 1199 |
| weighted avg | 0.80 | 0.80 | 0.80 | 1199 |
## 🚀ചലഞ്ച്
ഈ പാഠത്തിൽ, നിങ്ങൾ ശുദ്ധീകരിച്ച ഡാറ്റ ഉപയോഗിച്ച് ഒരു യന്ത്രം പഠന മോഡൽ നിർമ്മിച്ചു, ഇത് ഒരു സീരീസ് ഘടകങ്ങളുടെ അടിസ്ഥാനത്തിൽ ഒരു ദേശീയ ഭക്ഷണം പ്രവചിക്കാനാകും. ഡാറ്റ ക്ലാസിഫൈ ചെയ്യാൻ Scikit-learn നൽകുന്ന നിരവധി ഓപ്ഷനുകൾ വായിക്കാൻ ചില സമയം ചെലവഴിക്കുക. 'solver' എന്ന ആശയം കൂടുതൽ ആഴത്തിൽ പഠിച്ച് പിന്നിലെ പ്രവർത്തനം മനസ്സിലാക്കുക.
## [പാഠാനന്തര ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
ലോജിസ്റ്റിക് റെഗ്രഷന്റെ പിന്നിലെ ഗണിതം കുറച്ച് കൂടുതൽ പഠിക്കുക [ഈ പാഠത്തിൽ](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf)
## അസൈൻമെന്റ്
[സോൾവറുകൾ പഠിക്കുക](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "de6025f96841498b0577e9d1aee18d1f",
"translation_date": "2025-12-19T15:36:15+00:00",
"source_file": "4-Classification/2-Classifiers-1/assignment.md",
"language_code": "ml"
}
-->
# സോൾവറുകൾ പഠിക്കുക
## നിർദ്ദേശങ്ങൾ
ഈ പാഠത്തിൽ നിങ്ങൾക്ക് ആൽഗോരിതങ്ങൾ മെഷീൻ ലേണിംഗ് പ്രക്രിയയുമായി ചേർത്ത് കൃത്യമായ മോഡൽ സൃഷ്ടിക്കുന്ന വിവിധ സോൾവറുകളെക്കുറിച്ച് പഠിക്കാനായി. പാഠത്തിൽ നൽകിയ സോൾവറുകൾ വഴി കടന്നുപോകുകയും രണ്ട് സോൾവറുകൾ തിരഞ്ഞെടുക്കുകയും ചെയ്യുക. നിങ്ങളുടെ സ്വന്തം വാക്കുകളിൽ, ഈ രണ്ട് സോൾവറുകളെ താരതമ്യം ചെയ്ത് വ്യത്യാസങ്ങൾ വിശദീകരിക്കുക. അവ ഏത് തരത്തിലുള്ള പ്രശ്നങ്ങൾ പരിഹരിക്കുന്നു? വിവിധ ഡാറ്റാ ഘടനകളുമായി അവ എങ്ങനെ പ്രവർത്തിക്കുന്നു? ഒരാളെ മറ്റൊരാളിനേക്കാൾ തിരഞ്ഞെടുക്കേണ്ടത് എന്തുകൊണ്ടാണ്?
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണാർത്ഥം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------- |
| | രണ്ട് പാരഗ്രാഫുകളുള്ള ഒരു .doc ഫയൽ സമർപ്പിച്ചിരിക്കുന്നു, ഓരോ സോൾവറിനും ഒന്ന്, അവയെ ആലോചനാപൂർവ്വം താരതമ്യം ചെയ്യുന്നു. | ഒരു പാരഗ്രാഫ് മാത്രം ഉള്ള .doc ഫയൽ സമർപ്പിച്ചിരിക്കുന്നു | അസൈൻമെന്റ് അപൂർണ്ണമാണ് |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,41 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "68829b06b4dcd512d3327849191f4d7f",
"translation_date": "2025-12-19T17:03:23+00:00",
"source_file": "4-Classification/2-Classifiers-1/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"# വർഗ്ഗീകരണ മോഡലുകൾ നിർമ്മിക്കുക\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാപത്രം**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T15:38:05+00:00",
"source_file": "4-Classification/2-Classifiers-1/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡർ ആണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

File diff suppressed because one or more lines are too long

@ -0,0 +1,281 @@
{
"cells": [
{
"source": [
"# വർഗ്ഗീകരണ മോഡലുകൾ നിർമ്മിക്കുക\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 1
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import train_test_split, cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\n",
"from sklearn.svm import SVC\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 3
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 4
}
],
"source": [
"cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_feature_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Accuracy is 0.8181818181818182\n"
]
}
],
"source": [
"lr = LogisticRegression(multi_class='ovr',solver='liblinear')\n",
"model = lr.fit(X_train, np.ravel(y_train))\n",
"\n",
"accuracy = model.score(X_test, y_test)\n",
"print (\"Accuracy is {}\".format(accuracy))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"ingredients: Index(['artemisia', 'black_pepper', 'mushroom', 'shiitake', 'soy_sauce',\n 'vegetable_oil'],\n dtype='object')\ncuisine: korean\n"
]
}
],
"source": [
"# test an item\n",
"print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')\n",
"print(f'cuisine: {y_test.iloc[50]}')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" 0\n",
"korean 0.392231\n",
"chinese 0.372872\n",
"japanese 0.218825\n",
"thai 0.013427\n",
"indian 0.002645"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>0</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>korean</th>\n <td>0.392231</td>\n </tr>\n <tr>\n <th>chinese</th>\n <td>0.372872</td>\n </tr>\n <tr>\n <th>japanese</th>\n <td>0.218825</td>\n </tr>\n <tr>\n <th>thai</th>\n <td>0.013427</td>\n </tr>\n <tr>\n <th>indian</th>\n <td>0.002645</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 8
}
],
"source": [
"#rehsape to 2d array and transpose\n",
"test= X_test.iloc[50].values.reshape(-1, 1).T\n",
"# predict with score\n",
"proba = model.predict_proba(test)\n",
"classes = model.classes_\n",
"# create df with classes and scores\n",
"resultdf = pd.DataFrame(data=proba, columns=classes)\n",
"\n",
"# create df to show results\n",
"topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])\n",
"topPrediction.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n\n chinese 0.75 0.73 0.74 223\n indian 0.93 0.88 0.90 255\n japanese 0.78 0.78 0.78 253\n korean 0.87 0.86 0.86 236\n thai 0.76 0.84 0.80 232\n\n accuracy 0.82 1199\n macro avg 0.82 0.82 0.82 1199\nweighted avg 0.82 0.82 0.82 1199\n\n"
]
}
],
"source": [
"y_pred = model.predict(X_test)\r\n",
"print(classification_report(y_test,y_pred))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാപത്രം**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "9408506dd864f2b6e334c62f80c0cfcc",
"translation_date": "2025-12-19T17:18:19+00:00",
"source_file": "4-Classification/2-Classifiers-1/solution/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,251 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "49047911108adc49d605cddfb455749c",
"translation_date": "2025-12-19T15:23:04+00:00",
"source_file": "4-Classification/3-Classifiers-2/README.md",
"language_code": "ml"
}
-->
# ഭക്ഷണശൈലി വർഗ്ഗീകരണങ്ങൾ 2
ഈ രണ്ടാം വർഗ്ഗീകരണ പാഠത്തിൽ, നിങ്ങൾ സംഖ്യാത്മക ഡാറ്റ വർഗ്ഗീകരിക്കുന്ന കൂടുതൽ മാർഗങ്ങൾ അന്വേഷിക്കും. മറ്റൊരു വർഗ്ഗീകരണ ഉപാധി തിരഞ്ഞെടുക്കുന്നതിന്റെ ഫലങ്ങൾക്കുറിച്ചും നിങ്ങൾ പഠിക്കും.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
### മുൻകൂർ ആവശ്യകത
നിങ്ങൾ മുമ്പത്തെ പാഠങ്ങൾ പൂർത്തിയാക്കിയിട്ടുണ്ട് എന്ന് ഞങ്ങൾ കരുതുന്നു, കൂടാതെ ഈ 4-പാഠ ഫോളഡറിന്റെ റൂട്ടിൽ ഉള്ള `data` ഫോൾഡറിൽ _cleaned_cuisines.csv_ എന്ന ശുദ്ധീകരിച്ച ഡാറ്റാസെറ്റ് ഉണ്ട്.
### തയ്യാറെടുപ്പ്
നിങ്ങളുടെ _notebook.ipynb_ ഫയലിൽ ശുദ്ധീകരിച്ച ഡാറ്റാസെറ്റ് ലോഡ് ചെയ്തിട്ടുണ്ട്, കൂടാതെ മോഡൽ നിർമ്മാണ പ്രക്രിയയ്ക്ക് തയ്യാറായി X, y ഡാറ്റാഫ്രെയിമുകളായി വിഭജിച്ചിട്ടുണ്ട്.
## ഒരു വർഗ്ഗീകരണ മാപ്പ്
മുൻപ്, മൈക്രോസോഫ്റ്റിന്റെ ചീറ്റ്ഷീറ്റിന്റെ സഹായത്തോടെ ഡാറ്റ വർഗ്ഗീകരിക്കുന്നതിനുള്ള വിവിധ ഓപ്ഷനുകൾ നിങ്ങൾ പഠിച്ചിരുന്നു. Scikit-learn സമാനമായ, എന്നാൽ കൂടുതൽ സൂക്ഷ്മമായ ഒരു ചീറ്റ്ഷീറ്റ് നൽകുന്നു, ഇത് നിങ്ങളുടെ എസ്റ്റിമേറ്റർമാരെ (വർഗ്ഗീകരണ ഉപാധികൾക്ക് മറ്റൊരു പദം) കൂടുതൽ കുറയ്ക്കാൻ സഹായിക്കും:
![ML Map from Scikit-learn](../../../../translated_images/map.e963a6a51349425ab107b38f6c7307eb4c0d0c7ccdd2e81a5e1919292bab9ac7.ml.png)
> ടിപ്പ്: [ഈ മാപ്പ് ഓൺലൈനിൽ സന്ദർശിക്കുക](https://scikit-learn.org/stable/tutorial/machine_learning_map/) കൂടാതെ പാതയിലൂടെ ക്ലിക്ക് ചെയ്ത് ഡോക്യുമെന്റേഷൻ വായിക്കുക.
### പദ്ധതി
നിങ്ങളുടെ ഡാറ്റയെക്കുറിച്ച് വ്യക്തമായ ധാരണയുണ്ടായാൽ ഈ മാപ്പ് വളരെ സഹായകരമാണ്, കാരണം നിങ്ങൾ അതിന്റെ പാതകളിലൂടെ 'നടക്കാം' ഒരു തീരുമാനം എടുക്കാൻ:
- ഞങ്ങൾക്ക് >50 സാമ്പിളുകൾ ഉണ്ട്
- ഒരു വിഭാഗം പ്രവചിക്കണം
- ലേബൽ ചെയ്ത ഡാറ്റ ഉണ്ട്
- 100K സാമ്പിളുകൾക്കു താഴെയാണ്
- ✨ നാം ഒരു ലീനിയർ SVC തിരഞ്ഞെടുക്കാം
- അത് പ്രവർത്തിക്കാത്ത പക്ഷം, സംഖ്യാത്മക ഡാറ്റ ഉള്ളതിനാൽ
- നാം ✨ KNeighbors Classifier പരീക്ഷിക്കാം
- അത് പ്രവർത്തിക്കാത്ത പക്ഷം, ✨ SVC, ✨ Ensemble Classifiers പരീക്ഷിക്കുക
ഇത് പിന്തുടരാൻ വളരെ സഹായകരമായ ഒരു പാതയാണ്.
## അഭ്യാസം - ഡാറ്റ വിഭജിക്കുക
ഈ പാത പിന്തുടർന്ന്, നാം ഉപയോഗിക്കാൻ ചില ലൈബ്രറികൾ ഇറക്കുമതി ചെയ്യുന്നതിൽ നിന്ന് തുടങ്ങാം.
1. ആവശ്യമായ ലൈബ്രറികൾ ഇറക്കുമതി ചെയ്യുക:
```python
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
import numpy as np
```
1. നിങ്ങളുടെ പരിശീലനവും ടെസ്റ്റ് ഡാറ്റയും വിഭജിക്കുക:
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
```
## ലീനിയർ SVC വർഗ്ഗീകരകൻ
സപ്പോർട്ട്-വെക്ടർ ക്ലസ്റ്ററിംഗ് (SVC) ML സാങ്കേതികവിദ്യകളായ Support-Vector machines കുടുംബത്തിലെ ഒരു ശാഖയാണ് (താഴെ ഇതിനെക്കുറിച്ച് കൂടുതൽ പഠിക്കുക). ഈ രീതിയിൽ, ലേബലുകൾ എങ്ങനെ ക്ലസ്റ്റർ ചെയ്യാമെന്ന് തീരുമാനിക്കാൻ 'kernel' തിരഞ്ഞെടുക്കാം. 'C' പാരാമീറ്റർ 'regularization' നെ സൂചിപ്പിക്കുന്നു, ഇത് പാരാമീറ്ററുകളുടെ സ്വാധീനം നിയന്ത്രിക്കുന്നു. kernel [വിവിധങ്ങളിലൊന്നായിരിക്കാം](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); ഇവിടെ നാം 'linear' ആയി സജ്ജമാക്കി ലീനിയർ SVC പ്രയോജനപ്പെടുത്തുന്നു. Probability ഡിഫോൾട്ട് 'false' ആണ്; ഇവിടെ 'true' ആയി സജ്ജമാക്കി സാധ്യതാ അളവുകൾ ശേഖരിക്കുന്നു. ഡാറ്റ ഷഫിൾ ചെയ്യാൻ random state '0' ആയി സജ്ജമാക്കിയിട്ടുണ്ട്.
### അഭ്യാസം - ലീനിയർ SVC പ്രയോഗിക്കുക
വർഗ്ഗീകരകങ്ങളുടെ ഒരു അറേ സൃഷ്ടിച്ച് തുടങ്ങുക. പരീക്ഷണങ്ങൾ നടത്തുമ്പോൾ ഈ അറേയിൽ ക്രമാനുസൃതമായി ചേർക്കും.
1. ലീനിയർ SVC ഉപയോഗിച്ച് തുടങ്ങുക:
```python
C = 10
# വ്യത്യസ്ത ക്ലാസിഫയർസുകൾ സൃഷ്ടിക്കുക.
classifiers = {
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
}
```
2. ലീനിയർ SVC ഉപയോഗിച്ച് മോഡൽ പരിശീലിപ്പിച്ച് റിപ്പോർട്ട് പ്രിന്റ് ചെയ്യുക:
```python
n_classifiers = len(classifiers)
for index, (name, classifier) in enumerate(classifiers.items()):
classifier.fit(X_train, np.ravel(y_train))
y_pred = classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100))
print(classification_report(y_test,y_pred))
```
ഫലം വളരെ നല്ലതാണ്:
```output
Accuracy (train) for Linear SVC: 78.6%
precision recall f1-score support
chinese 0.71 0.67 0.69 242
indian 0.88 0.86 0.87 234
japanese 0.79 0.74 0.76 254
korean 0.85 0.81 0.83 242
thai 0.71 0.86 0.78 227
accuracy 0.79 1199
macro avg 0.79 0.79 0.79 1199
weighted avg 0.79 0.79 0.79 1199
```
## K-Neighbors വർഗ്ഗീകരകൻ
K-Neighbors ML രീതികളായ "neighbors" കുടുംബത്തിലെ ഒരു ഭാഗമാണ്, ഇത് സൂപ്പർവൈസ്ഡ്, അൺസൂപ്പർവൈസ്ഡ് പഠനത്തിനും ഉപയോഗിക്കാം. ഈ രീതിയിൽ, മുൻകൂട്ടി നിർവ്വചിച്ച പോയിന്റുകളുടെ എണ്ണം സൃഷ്ടിച്ച്, ഡാറ്റ ഈ പോയിന്റുകളുടെ ചുറ്റും ശേഖരിച്ച് പൊതുവായ ലേബലുകൾ പ്രവചിക്കാനാകും.
### അഭ്യാസം - K-Neighbors വർഗ്ഗീകരകൻ പ്രയോഗിക്കുക
മുൻ വർഗ്ഗീകരകൻ നല്ലതായിരുന്നു, ഡാറ്റയുമായി നന്നായി പ്രവർത്തിച്ചു, പക്ഷേ നാം കൂടുതൽ കൃത്യത നേടാമോ എന്ന് നോക്കാം. K-Neighbors വർഗ്ഗീകരകൻ പരീക്ഷിക്കുക.
1. നിങ്ങളുടെ വർഗ്ഗീകരക അറേയിൽ ഒരു വരി ചേർക്കുക (ലീനിയർ SVC ഇനത്തിന് ശേഷം കോമ ചേർക്കുക):
```python
'KNN classifier': KNeighborsClassifier(C),
```
ഫലം കുറച്ച് മോശമാണ്:
```output
Accuracy (train) for KNN classifier: 73.8%
precision recall f1-score support
chinese 0.64 0.67 0.66 242
indian 0.86 0.78 0.82 234
japanese 0.66 0.83 0.74 254
korean 0.94 0.58 0.72 242
thai 0.71 0.82 0.76 227
accuracy 0.74 1199
macro avg 0.76 0.74 0.74 1199
weighted avg 0.76 0.74 0.74 1199
```
✅ [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) കുറിച്ച് പഠിക്കുക
## Support Vector Classifier
Support-Vector വർഗ്ഗീകരകർ [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) ML രീതികളുടെ കുടുംബത്തിലെ ഭാഗമാണ്, വർഗ്ഗീകരണവും റെഗ്രഷനും വേണ്ടി ഉപയോഗിക്കുന്നു. SVMകൾ "പരിശീലന ഉദാഹരണങ്ങളെ ബിന്ദുക്കളായി മാപ്പ് ചെയ്യുന്നു" രണ്ട് വിഭാഗങ്ങൾക്കിടയിലെ ദൂരം പരമാവധി ആക്കാൻ. പിന്നീട് വരുന്ന ഡാറ്റ ഈ സ്ഥലത്ത് മാപ്പ് ചെയ്ത് അവരുടെ വിഭാഗം പ്രവചിക്കാം.
### അഭ്യാസം - Support Vector Classifier പ്രയോഗിക്കുക
കുറച്ച് കൂടുതൽ കൃത്യതക്കായി Support Vector Classifier പരീക്ഷിക്കാം.
1. K-Neighbors ഇനത്തിന് ശേഷം കോമ ചേർക്കുക, പിന്നെ ഈ വരി ചേർക്കുക:
```python
'SVC': SVC(),
```
ഫലം വളരെ നല്ലതാണ്!
```output
Accuracy (train) for SVC: 83.2%
precision recall f1-score support
chinese 0.79 0.74 0.76 242
indian 0.88 0.90 0.89 234
japanese 0.87 0.81 0.84 254
korean 0.91 0.82 0.86 242
thai 0.74 0.90 0.81 227
accuracy 0.83 1199
macro avg 0.84 0.83 0.83 1199
weighted avg 0.84 0.83 0.83 1199
```
✅ [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm) കുറിച്ച് പഠിക്കുക
## Ensemble Classifiers
മുൻ പരീക്ഷണം വളരെ നല്ലതായിരുന്നു എങ്കിലും, പാതയുടെ അവസാനത്തേക്ക് പോകാം. 'Ensemble Classifiers', പ്രത്യേകിച്ച് Random Forest, AdaBoost പരീക്ഷിക്കാം:
```python
'RFST': RandomForestClassifier(n_estimators=100),
'ADA': AdaBoostClassifier(n_estimators=100)
```
ഫലം വളരെ നല്ലതാണ്, പ്രത്യേകിച്ച് Random Forest:
```output
Accuracy (train) for RFST: 84.5%
precision recall f1-score support
chinese 0.80 0.77 0.78 242
indian 0.89 0.92 0.90 234
japanese 0.86 0.84 0.85 254
korean 0.88 0.83 0.85 242
thai 0.80 0.87 0.83 227
accuracy 0.84 1199
macro avg 0.85 0.85 0.84 1199
weighted avg 0.85 0.84 0.84 1199
Accuracy (train) for ADA: 72.4%
precision recall f1-score support
chinese 0.64 0.49 0.56 242
indian 0.91 0.83 0.87 234
japanese 0.68 0.69 0.69 254
korean 0.73 0.79 0.76 242
thai 0.67 0.83 0.74 227
accuracy 0.72 1199
macro avg 0.73 0.73 0.72 1199
weighted avg 0.73 0.72 0.72 1199
```
✅ [Ensemble Classifiers](https://scikit-learn.org/stable/modules/ensemble.html) കുറിച്ച് പഠിക്കുക
ഈ മെഷീൻ ലേണിംഗ് രീതി "അനേകം അടിസ്ഥാന എസ്റ്റിമേറ്റർമാരുടെ പ്രവചനങ്ങൾ സംയോജിപ്പിക്കുന്നു" മോഡലിന്റെ ഗുണമേന്മ മെച്ചപ്പെടുത്താൻ. നമ്മുടെ ഉദാഹരണത്തിൽ, Random Trees, AdaBoost ഉപയോഗിച്ചു.
- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), ഒരു ശരാശരി രീതി, 'decision trees' ന്റെ 'കാടുകൾ' നിർമ്മിക്കുന്നു, ഓവർഫിറ്റിംഗ് ഒഴിവാക്കാൻ റാൻഡംനസ് ചേർക്കുന്നു. n_estimators പാരാമീറ്റർ മരങ്ങളുടെ എണ്ണം സജ്ജമാക്കുന്നു.
- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) ഒരു ക്ലാസിഫയർ ഡാറ്റാസെറ്റിൽ ഫിറ്റ് ചെയ്ത്, അതേ ക്ലാസിഫയറിന്റെ പകർപ്പുകൾ അതേ ഡാറ്റാസെറ്റിൽ ഫിറ്റ് ചെയ്യുന്നു. തെറ്റായി വർഗ്ഗീകരിച്ച വസ്തുക്കളുടെ ഭാരം ശ്രദ്ധിച്ച് അടുത്ത ക്ലാസിഫയറിന്റെ ഫിറ്റ് ശരിയാക്കുന്നു.
---
## 🚀ചലഞ്ച്
ഈ സാങ്കേതികവിദ്യകളിൽ ഓരോതിലും നിങ്ങൾ ക്രമീകരിക്കാവുന്ന നിരവധി പാരാമീറ്ററുകൾ ഉണ്ട്. ഓരോതിന്റെ ഡിഫോൾട്ട് പാരാമീറ്ററുകൾ ഗവേഷണം ചെയ്ത്, ഈ പാരാമീറ്ററുകൾ ക്രമീകരിക്കുന്നത് മോഡലിന്റെ ഗുണമേന്മയ്ക്ക് എന്ത് അർത്ഥമാക്കുമെന്ന് ചിന്തിക്കുക.
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
ഈ പാഠങ്ങളിൽ ധാരാളം സാങ്കേതിക പദങ്ങൾ ഉണ്ട്, അതിനാൽ [ഈ പട്ടിക](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) ഉപയോഗിച്ച് ഒരു നിമിഷം അവലോകനം ചെയ്യുക!
## അസൈൻമെന്റ്
[പാരാമീറ്റർ കളി](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, യന്ത്രം ചെയ്ത വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "58dfdaf79fb73f7d34b22bdbacf57329",
"translation_date": "2025-12-19T15:25:05+00:00",
"source_file": "4-Classification/3-Classifiers-2/assignment.md",
"language_code": "ml"
}
-->
# പാരാമീറ്റർ പ്ലേ
## നിർദ്ദേശങ്ങൾ
ഈ ക്ലാസിഫയർസുമായി പ്രവർത്തിക്കുമ്പോൾ ഡിഫോൾട്ട് ആയി സജ്ജീകരിച്ചിരിക്കുന്ന നിരവധി പാരാമീറ്ററുകൾ ഉണ്ട്. VS കോഡിലെ ഇന്റലിസെൻസ് അവയെക്കുറിച്ച് കൂടുതൽ അറിയാൻ സഹായിക്കും. ഈ പാഠത്തിലെ ഒരു ML ക്ലാസിഫിക്കേഷൻ സാങ്കേതിക വിദ്യ സ്വീകരിച്ച് വിവിധ പാരാമീറ്റർ മൂല്യങ്ങൾ മാറ്റി മോഡലുകൾ പുനരുപയോഗിക്കുക. ചില മാറ്റങ്ങൾ മോഡൽ ഗുണനിലവാരം മെച്ചപ്പെടുത്തുന്നതെങ്ങനെ, മറ്റുള്ളവ അത് കുറയ്ക്കുന്നതെങ്ങനെ എന്ന കാരണങ്ങൾ വിശദീകരിക്കുന്ന ഒരു നോട്ട്‌ബുക്ക് നിർമ്മിക്കുക. നിങ്ങളുടെ ഉത്തരം വിശദമായിരിക്കണം.
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണാർത്ഥം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ----------------------------- |
| | ഒരു ക്ലാസിഫയർ പൂർണ്ണമായി നിർമ്മിച്ചും അതിന്റെ പാരാമീറ്ററുകൾ മാറ്റി മാറ്റങ്ങൾ ടെക്സ്റ്റ് ബോക്സുകളിൽ വിശദീകരിച്ചും ഒരു നോട്ട്‌ബുക്ക് അവതരിപ്പിക്കുന്നു | ഒരു നോട്ട്‌ബുക്ക് ഭാഗികമായി അവതരിപ്പിച്ചോ അല്ലെങ്കിൽ മോശമായി വിശദീകരിച്ചോ ചെയ്തിരിക്കുന്നു | ഒരു നോട്ട്‌ബുക്ക് ബഗ്ഗിയുള്ളതോ പിഴവുള്ളതോ ആണ് |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,165 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# ക്ലാസിഫിക്കേഷൻ മോഡൽ നിർമ്മിക്കുക\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 9
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 10
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 11
}
],
"source": [
"cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_feature_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാ**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "15a83277036572e0773229b5f21c1e12",
"translation_date": "2025-12-19T17:02:50+00:00",
"source_file": "4-Classification/3-Classifiers-2/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T15:37:32+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡർ ആണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,655 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "lesson_12-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "fab50046ca413a38939d579f8432274f",
"translation_date": "2025-12-19T17:12:00+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
"language_code": "ml"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": [
"# ഒരു വർഗ്ഗീകരണ മോഡൽ നിർമ്മിക്കുക: രുചികരമായ ഏഷ്യൻ மற்றும் ഇന്ത്യൻ ഭക്ഷണങ്ങൾ\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HD54bEefgtNO"
},
"source": [
"## ഭക്ഷണശൈലി വർഗ്ഗീകരണങ്ങൾ 2\n",
"\n",
"ഈ രണ്ടാം വർഗ്ഗീകരണ പാഠത്തിൽ, നാം വർഗ്ഗീയ ഡാറ്റ വർഗ്ഗീകരിക്കാൻ `കൂടുതൽ മാർഗങ്ങൾ` അന്വേഷിക്കും. മറ്റൊരുവിധം ക്ലാസിഫയർ തിരഞ്ഞെടുക്കുന്നതിന്റെ ഫലങ്ങൾ കുറിച്ച് നാം പഠിക്കും.\n",
"\n",
"### [**പാഠം മുൻകൂർ ക്വിസ്**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
"\n",
"### **ആവശ്യമായ മുൻപരിചയം**\n",
"\n",
"നാം മുമ്പത്തെ പാഠങ്ങൾ പൂർത്തിയാക്കിയതായി കരുതുന്നു, കാരണം നാം മുമ്പ് പഠിച്ച ചില ആശയങ്ങൾ തുടരും.\n",
"\n",
"ഈ പാഠത്തിനായി, താഴെപ്പറയുന്ന പാക്കേജുകൾ ആവശ്യമാണ്:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) ഒരു [R പാക്കേജുകളുടെ ശേഖരം](https://www.tidyverse.org/packages) ആണ്, ഡാറ്റാ സയൻസ് വേഗത്തിൽ, എളുപ്പത്തിൽ, കൂടുതൽ രസകരമായി നടത്താൻ രൂപകൽപ്പന ചെയ്തിരിക്കുന്നു!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) ഫ്രെയിംവർക്ക് മോഡലിംഗ്, മെഷീൻ ലേണിംഗിനുള്ള [പാക്കേജുകളുടെ ശേഖരം](https://www.tidymodels.org/packages/) ആണ്.\n",
"\n",
"- `themis`: [themis പാക്കേജ്](https://themis.tidymodels.org/) അസമതുല്യമായ ഡാറ്റ കൈകാര്യം ചെയ്യുന്നതിനുള്ള അധിക റെസിപ്പി ഘട്ടങ്ങൾ നൽകുന്നു.\n",
"\n",
"നിങ്ങൾക്ക് ഇവ ഇൻസ്റ്റാൾ ചെയ്യാം:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
"\n",
"അല്ലെങ്കിൽ, താഴെ കൊടുത്തിരിക്കുന്ന സ്ക്രിപ്റ്റ് ഈ മോഡ്യൂൾ പൂർത്തിയാക്കാൻ ആവശ്യമായ പാക്കേജുകൾ നിങ്ങൾക്കുണ്ടോ എന്ന് പരിശോധിച്ച്, ഇല്ലെങ്കിൽ അവ ഇൻസ്റ്റാൾ ചെയ്യും.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vZ57IuUxgyQt"
},
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load(tidyverse, tidymodels, themis, kernlab, ranger, xgboost, kknn)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "z22M-pj4g07x"
},
"source": [
"ഇപ്പോൾ, നമുക്ക് പ്രവർത്തനം ആരംഭിക്കാം!\n",
"\n",
"## **1. ഒരു വർഗ്ഗീകരണ മാപ്പ്**\n",
"\n",
"നമ്മുടെ [മുൻപത്തെ പാഠത്തിൽ](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1), നാം ചോദ്യം പരിഹരിക്കാൻ ശ്രമിച്ചു: പല മോഡലുകൾക്കിടയിൽ എങ്ങനെ തിരഞ്ഞെടുക്കാം? വലിയ തോതിൽ, ഇത് ഡാറ്റയുടെ സവിശേഷതകളിലും നാം പരിഹരിക്കാൻ ആഗ്രഹിക്കുന്ന പ്രശ്നത്തിന്റെ തരം (ഉദാഹരണത്തിന്, വർഗ്ഗീകരണമോ റിഗ്രഷനോ?) ആശ്രയിച്ചിരിക്കുന്നു.\n",
"\n",
"മുൻപ്, മൈക്രോസോഫ്റ്റിന്റെ ചീറ്റ് ഷീറ്റ് ഉപയോഗിച്ച് ഡാറ്റ വർഗ്ഗീകരിക്കുമ്പോൾ നിങ്ങൾക്കുള്ള വിവിധ ഓപ്ഷനുകൾക്കുറിച്ച് നാം പഠിച്ചു. പൈത്തൺ മെഷീൻ ലേണിംഗ് ഫ്രെയിംവർക്ക്, സ്കൈകിറ്റ്-ലേൺ, സമാനമായെങ്കിലും കൂടുതൽ സൂക്ഷ്മമായ ഒരു ചീറ്റ് ഷീറ്റ് നൽകുന്നു, ഇത് നിങ്ങളുടെ എസ്റ്റിമേറ്ററുകൾ (വർഗ്ഗീകരണങ്ങളുടെ മറ്റൊരു പദം) കൂടുതൽ നിശ്ചയിക്കാൻ സഹായിക്കും:\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/map.e963a6a51349425ab107b38f6c7307eb4c0d0c7ccdd2e81a5e1919292bab9ac7.ml.png\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1i3xRIVg7vG"
},
"source": [
"> ടിപ്പ്: [ഈ മാപ്പ് ഓൺലൈനിൽ സന്ദർശിക്കുക](https://scikit-learn.org/stable/tutorial/machine_learning_map/) കൂടാതെ പാതയിലൂടെ ക്ലിക്ക് ചെയ്ത് ഡോക്യുമെന്റേഷൻ വായിക്കാം.\n",
">\n",
"> [Tidymodels റഫറൻസ് സൈറ്റ്](https://www.tidymodels.org/find/parsnip/#models) വിവിധ തരം മോഡലുകളെക്കുറിച്ചുള്ള മികച്ച ഡോക്യുമെന്റേഷൻ നൽകുന്നു.\n",
"\n",
"### **പ്ലാൻ** 🗺️\n",
"\n",
"നിങ്ങളുടെ ഡാറ്റയെക്കുറിച്ച് വ്യക്തമായ ധാരണ ഉണ്ടാകുമ്പോൾ ഈ മാപ്പ് വളരെ സഹായകരമാണ്, കാരണം നിങ്ങൾ അതിന്റെ പാതകളിലൂടെ 'നടക്കാൻ' കഴിയും ഒരു തീരുമാനത്തിലേക്ക്:\n",
"\n",
"- ഞങ്ങൾക്ക് \\>50 സാമ്പിളുകൾ ഉണ്ട്\n",
"\n",
"- ഞങ്ങൾ ഒരു വിഭാഗം പ്രവചിക്കണം\n",
"\n",
"- ഞങ്ങൾക്ക് ലേബൽ ചെയ്ത ഡാറ്റ ഉണ്ട്\n",
"\n",
"- ഞങ്ങൾക്ക് 100K സാമ്പിളുകളിൽ കുറവുണ്ട്\n",
"\n",
"- ✨ ഞങ്ങൾ ഒരു ലീനിയർ SVC തിരഞ്ഞെടുക്കാം\n",
"\n",
"- അത് പ്രവർത്തിക്കാത്ത പക്ഷം, ഞങ്ങൾക്ക് സംഖ്യാത്മക ഡാറ്റ ഉണ്ടാകുന്നതിനാൽ\n",
"\n",
" - ✨ KNeighbors ക്ലാസിഫയർ പരീക്ഷിക്കാം\n",
"\n",
" - അത് പ്രവർത്തിക്കാത്ത പക്ഷം, ✨ SVCയു ✨ എൻസംബിൾ ക്ലാസിഫയറുകളും പരീക്ഷിക്കുക\n",
"\n",
"ഇത് പിന്തുടരാൻ വളരെ സഹായകരമായ ഒരു പാതയാണ്. ഇപ്പോൾ, [tidymodels](https://www.tidymodels.org/) മോഡലിംഗ് ഫ്രെയിംവർക്ക് ഉപയോഗിച്ച് നേരിട്ട് തുടങ്ങാം: നല്ല സാങ്കേതിക ശാസ്ത്ര പ്രാക്ടീസ് പ്രോത്സാഹിപ്പിക്കാൻ വികസിപ്പിച്ചിട്ടുള്ള സ്ഥിരതയുള്ള, ലവച്ഛിതമായ R പാക്കേജുകളുടെ സമാഹാരം 😊.\n",
"\n",
"## 2. ഡാറ്റ വിഭജിച്ച് അസമതുല്യമായ ഡാറ്റ സെറ്റിനെ കൈകാര്യം ചെയ്യുക.\n",
"\n",
"മുൻപത്തെ പാഠങ്ങളിൽ നിന്ന്, നമ്മുടെ ക്യൂസിനികളിൽ പൊതുവായ ചില ഘടകങ്ങൾ ഉണ്ടെന്ന് പഠിച്ചു. കൂടാതെ, ക്യൂസിനികളുടെ എണ്ണം അസമതുല്യമായി വിതരണം ചെയ്തിരുന്നു.\n",
"\n",
"ഇവയെ കൈകാര്യം ചെയ്യുന്നതിന്\n",
"\n",
"- വ്യത്യസ്ത ക്യൂസിനികൾ തമ്മിൽ ആശയക്കുഴപ്പം സൃഷ്ടിക്കുന്ന ഏറ്റവും പൊതുവായ ഘടകങ്ങൾ `dplyr::select()` ഉപയോഗിച്ച് ഒഴിവാക്കുക.\n",
"\n",
"- മോഡലിംഗിന് തയ്യാറാക്കാൻ ഡാറ്റ പ്രീപ്രോസസ് ചെയ്യുന്ന ഒരു `recipe` ഉപയോഗിക്കുക, അതിൽ `over-sampling` ആൽഗോരിതം പ്രയോഗിക്കുക.\n",
"\n",
"മുൻപത്തെ പാഠത്തിൽ ഇതു നോക്കിയതിനാൽ ഇത് എളുപ്പം ആയിരിക്കണം 🥳!\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6tj_rN00hClA"
},
"source": [
"# Load the core Tidyverse and Tidymodels packages\n",
"library(tidyverse)\n",
"library(tidymodels)\n",
"\n",
"# Load the original cuisines data\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\n",
"\n",
"# Drop id column, rice, garlic and ginger from our original data set\n",
"df_select <- df %>% \n",
" select(-c(1, rice, garlic, ginger)) %>%\n",
" # Encode cuisine column as categorical\n",
" mutate(cuisine = factor(cuisine))\n",
"\n",
"\n",
"# Create data split specification\n",
"set.seed(2056)\n",
"cuisines_split <- initial_split(data = df_select,\n",
" strata = cuisine,\n",
" prop = 0.7)\n",
"\n",
"# Extract the data in each split\n",
"cuisines_train <- training(cuisines_split)\n",
"cuisines_test <- testing(cuisines_split)\n",
"\n",
"# Display distribution of cuisines in the training set\n",
"cuisines_train %>% \n",
" count(cuisine) %>% \n",
" arrange(desc(n))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zFin5yw3hHb1"
},
"source": [
"### അസമതുല്യമായ ഡാറ്റ കൈകാര്യം ചെയ്യുക\n",
"\n",
"അസമതുല്യമായ ഡാറ്റ മോഡൽ പ്രകടനത്തിൽ നെഗറ്റീവ് ഫലങ്ങൾ ഉണ്ടാക്കാറുണ്ട്. നിരീക്ഷണങ്ങളുടെ എണ്ണം സമമാണ് എങ്കിൽ പല മോഡലുകളും മികച്ച പ്രകടനം കാണിക്കുന്നു, അതിനാൽ അസമതുല്യമായ ഡാറ്റയുമായി അവർ ബുദ്ധിമുട്ടുന്നു.\n",
"\n",
"അസമതുല്യമായ ഡാറ്റ സെറ്റുകളെ കൈകാര്യം ചെയ്യാനുള്ള പ്രധാനമായ രണ്ട് മാർഗ്ഗങ്ങൾ ഉണ്ട്:\n",
"\n",
"- ന്യൂനപക്ഷ ക്ലാസിലേക്ക് നിരീക്ഷണങ്ങൾ ചേർക്കൽ: `ഓവർ-സാമ്പ്ലിംഗ്` ഉദാഹരണത്തിന് SMOTE ആൽഗോരിതം ഉപയോഗിച്ച്, ഇത് ഈ കേസുകളുടെ അടുത്തുള്ള അയൽക്കാരെ ഉപയോഗിച്ച് ന്യൂനപക്ഷ ക്ലാസിന്റെ പുതിയ ഉദാഹരണങ്ങൾ സിന്തറ്റിക്കായി സൃഷ്ടിക്കുന്നു.\n",
"\n",
"- ഭൂരിപക്ഷ ക്ലാസിൽ നിന്നുള്ള നിരീക്ഷണങ്ങൾ നീക്കംചെയ്യൽ: `അണ്ടർ-സാമ്പ്ലിംഗ്`\n",
"\n",
"മുൻപത്തെ പാഠത്തിൽ, `recipe` ഉപയോഗിച്ച് അസമതുല്യമായ ഡാറ്റ സെറ്റുകളെ എങ്ങനെ കൈകാര്യം ചെയ്യാമെന്ന് ഞങ്ങൾ കാണിച്ചു. ഒരു recipe ഒരു ബ്ലൂപ്രിന്റ് പോലെ കരുതാം, അത് ഒരു ഡാറ്റ സെറ്റിന് ഡാറ്റ വിശകലനത്തിന് തയ്യാറാക്കാൻ ഏത് ഘട്ടങ്ങൾ പ്രയോഗിക്കണമെന്ന് വിവരിക്കുന്നു. നമ്മുടെ കേസിൽ, `training set`-ലുള്ള നമ്മുടെ ക്യൂസിനികളുടെ എണ്ണം സമമായി വേണം. നമുക്ക് ഇതിലേക്ക് നേരിട്ട് പ്രവേശിക്കാം.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "cRzTnHolhLWd"
},
"source": [
"# Load themis package for dealing with imbalanced data\n",
"library(themis)\n",
"\n",
"# Create a recipe for preprocessing training data\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>%\n",
" step_smote(cuisine) \n",
"\n",
"# Print recipe\n",
"cuisines_recipe"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KxOQ2ORhhO81"
},
"source": [
"ഇപ്പോൾ നാം മോഡലുകൾ പരിശീലിപ്പിക്കാൻ തയ്യാറാണ് 👩‍💻👨‍💻!\n",
"\n",
"## 3. മൾട്ടിനോമിയൽ റെഗ്രഷൻ മോഡലുകൾക്കപ്പുറം\n",
"\n",
"മുൻപത്തെ പാഠത്തിൽ, നാം മൾട്ടിനോമിയൽ റെഗ്രഷൻ മോഡലുകൾ പരിശോധിച്ചു. ക്ലാസിഫിക്കേഷനിനായി കൂടുതൽ ലവചികമായ ചില മോഡലുകൾ പരിശോധിക്കാം.\n",
"\n",
"### സപ്പോർട്ട് വെക്ടർ മെഷീനുകൾ.\n",
"\n",
"ക്ലാസിഫിക്കേഷൻ സന്ധർഭത്തിൽ, `സപ്പോർട്ട് വെക്ടർ മെഷീനുകൾ` എന്നത് ഒരു മെഷീൻ ലേണിംഗ് സാങ്കേതിക വിദ്യയാണ്, ഇത് ക്ലാസുകൾ \"മികച്ച\" വിധത്തിൽ വേർതിരിക്കുന്ന ഒരു *ഹൈപ്പർപ്ലെയിൻ* കണ്ടെത്താൻ ശ്രമിക്കുന്നു. ഒരു ലളിതമായ ഉദാഹരണം നോക്കാം:\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/svm.621ae7b516d678e08ed23af77ff1750b5fe392976917f0606861567b779e8862.ml.png\"\n",
" width=\"300\"/>\n",
" <figcaption>https://commons.wikimedia.org/w/index.php?curid=22877598</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "C4Wsd0vZhXYu"
},
"source": [
"H1~ ക്ലാസുകൾ വേർതിരിക്കുന്നില്ല. H2~ വേർതിരിക്കുന്നു, പക്ഷേ ചെറിയ മാർജിനോടെയാണ്. H3~ പരമാവധി മാർജിനോടെ അവ വേർതിരിക്കുന്നു.\n",
"\n",
"#### ലീനിയർ സപ്പോർട്ട് വെക്ടർ ക്ലാസിഫയർ\n",
"\n",
"സപ്പോർട്ട്-വെക്ടർ ക്ലസ്റ്ററിംഗ് (SVC) ML സാങ്കേതികവിദ്യകളായ സപ്പോർട്ട്-വെക്ടർ മെഷീനുകളുടെ കുടുംബത്തിലെ ഒരു ശാഖയാണ്. SVC-യിൽ, ഹൈപ്പർപ്ലെയിൻ പരിശീലന നിരീക്ഷണങ്ങളുടെ `മിക്കവാറും` ശരിയായി വേർതിരിക്കാൻ തിരഞ്ഞെടുക്കപ്പെടുന്നു, പക്ഷേ ചില നിരീക്ഷണങ്ങൾ `തെറ്റായി വർഗ്ഗീകരിക്കപ്പെടാം`. ചില പോയിന്റുകൾ തെറ്റായ വശത്ത് ഉണ്ടാകാൻ അനുവദിക്കുന്നതിലൂടെ, SVM ഔട്ട്ലയറുകളോട് കൂടുതൽ ദൃഢമാകുന്നു, അതിനാൽ പുതിയ ഡാറ്റയിലേക്ക് മികച്ച പൊതുവായ പ്രയോഗം സാധ്യമാകുന്നു. ഈ ലംഘനം നിയന്ത്രിക്കുന്ന പാരാമീറ്റർ `cost` എന്നറിയപ്പെടുന്നു, ഇതിന് ഡിഫോൾട്ട് മൂല്യം 1 ആണ് (`help(\"svm_poly\")` കാണുക).\n",
"\n",
"പോളിനോമിയൽ SVM മോഡലിൽ `degree = 1` സജ്ജമാക്കി ഒരു ലീനിയർ SVC സൃഷ്ടിക്കാം.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vJpp6nuChlBz"
},
"source": [
"# Make a linear SVC specification\n",
"svc_linear_spec <- svm_poly(degree = 1) %>% \n",
" set_engine(\"kernlab\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle specification and recipe into a worklow\n",
"svc_linear_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(svc_linear_spec)\n",
"\n",
"# Print out workflow\n",
"svc_linear_wf"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "rDs8cWNkhoqu"
},
"source": [
"ഇപ്പോൾ നാം പ്രീപ്രോസസ്സിംഗ് ഘട്ടങ്ങളും മോഡൽ സ്പെസിഫിക്കേഷനും ഒരു *workflow* ആയി പകർത്തിയതിനുശേഷം, നാം linear SVC ട്രെയിൻ ചെയ്ത് ഫലങ്ങൾ വിലയിരുത്താൻ മുന്നോട്ട് പോകാം. പ്രകടന മെട്രിക്‌സുകൾക്കായി, നാം വിലയിരുത്തുന്ന ഒരു മെട്രിക് സെറ്റ് സൃഷ്ടിക്കാം: `accuracy`, `sensitivity`, `Positive Predicted Value` എന്നിവയും `F Measure` ഉം.\n",
"\n",
"> `augment()` നൽകിയ ഡാറ്റയിൽ പ്രവചനങ്ങൾക്കായി കോളം(കൾ) ചേർക്കും.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "81wiqcwuhrnq"
},
"source": [
"# Train a linear SVC model\n",
"svc_linear_fit <- svc_linear_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"# Create a metric set\n",
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"svc_linear_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "0UFQvHf-huo3"
},
"source": [
"#### Support Vector Machine\n",
"\n",
"സപ്പോർട്ട് വെക്ടർ മെഷീൻ (SVM) ക്ലാസുകൾക്കിടയിലെ നോൺ-ലീനിയർ ബൗണ്ടറി സ്വീകരിക്കാൻ സപ്പോർട്ട് വെക്ടർ ക്ലാസിഫയറിന്റെ വിപുലീകരണമാണ്. സാരാംശത്തിൽ, SVMകൾ ക്ലാസുകൾക്കിടയിലെ നോൺലീനിയർ ബന്ധങ്ങൾക്കായി ഫീച്ചർ സ്പേസ് വലുതാക്കാൻ *kernel trick* ഉപയോഗിക്കുന്നു. SVMകൾ ഉപയോഗിക്കുന്ന ഒരു പ്രശസ്തവും അത്യന്തം ലവചികവുമായ kernel ഫംഗ്ഷൻ ആണ് *Radial basis function.* നമ്മുടെ ഡാറ്റയിൽ ഇത് എങ്ങനെ പ്രവർത്തിക്കും എന്ന് നോക്കാം.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-KX4S8mzhzmp"
},
"source": [
"set.seed(2056)\n",
"\n",
"# Make an RBF SVM specification\n",
"svm_rbf_spec <- svm_rbf() %>% \n",
" set_engine(\"kernlab\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle specification and recipe into a worklow\n",
"svm_rbf_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(svm_rbf_spec)\n",
"\n",
"\n",
"# Train an RBF model\n",
"svm_rbf_fit <- svm_rbf_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"svm_rbf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QBFSa7WSh4HQ"
},
"source": [
"മികച്ചത് 🤩!\n",
"\n",
"> ✅ ദയവായി കാണുക:\n",
">\n",
"> - [*Support Vector Machines*](https://bradleyboehmke.github.io/HOML/svm.html), R ഉപയോഗിച്ച് ഹാൻഡ്‌സ്-ഓൺ മെഷീൻ ലേണിംഗ്\n",
">\n",
"> - [*Support Vector Machines*](https://www.statlearning.com/), R-ൽ ആപ്ലിക്കേഷനുകളോടുകൂടിയ സ്റ്റാറ്റിസ്റ്റിക്കൽ ലേണിംഗിലേക്ക് ഒരു പരിചയം\n",
">\n",
"> കൂടുതൽ വായനയ്ക്കായി.\n",
"\n",
"### ഏറ്റവും അടുത്തുള്ള നെബർ ക്ലാസിഫയർസ്\n",
"\n",
"*K*-ഏറ്റവും അടുത്തുള്ള നെബർ (KNN) ഒരു ആൽഗോരിതമാണ്, ഇതിൽ ഓരോ നിരീക്ഷണവും മറ്റ് നിരീക്ഷണങ്ങളോടുള്ള അതിന്റെ *സാദൃശ്യത്തിന്റെ* അടിസ്ഥാനത്തിൽ പ്രവചിക്കപ്പെടുന്നു.\n",
"\n",
"നമ്മുടെ ഡാറ്റയിൽ ഒന്ന് ഫിറ്റ് ചെയ്യാം.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "k4BxxBcdh9Ka"
},
"source": [
"# Make a KNN specification\n",
"knn_spec <- nearest_neighbor() %>% \n",
" set_engine(\"kknn\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"knn_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(knn_spec)\n",
"\n",
"# Train a boosted tree model\n",
"knn_wf_fit <- knn_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"knn_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "HaegQseriAcj"
},
"source": [
"ഈ മോഡൽ അത്ര നല്ല പ്രകടനം കാഴ്ചവയ്ക്കുന്നില്ലെന്ന് തോന്നുന്നു. മോഡലിന്റെ arguments മാറ്റുന്നത് (കാണുക `help(\"nearest_neighbor\")`) മോഡലിന്റെ പ്രകടനം മെച്ചപ്പെടുത്താൻ സഹായിക്കാം. അതു പരീക്ഷിക്കാൻ മറക്കരുത്.\n",
"\n",
"> ✅ ദയവായി കാണുക:\n",
">\n",
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
">\n",
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
">\n",
"> *K*-Nearest Neighbors ക്ലാസിഫയർസിനെക്കുറിച്ച് കൂടുതൽ അറിയാൻ.\n",
"\n",
"### എൻസംബിൾ ക്ലാസിഫയർസ്\n",
"\n",
"എൻസംബിൾ ആൽഗോരിതങ്ങൾ പല ബേസ് എസ്റ്റിമേറ്ററുകളെ സംയോജിപ്പിച്ച് ഒരു മികച്ച മോഡൽ സൃഷ്ടിക്കുന്നതിലൂടെ പ്രവർത്തിക്കുന്നു, അതായത്:\n",
"\n",
"`bagging`: ബേസ് മോഡലുകളുടെ ഒരു ശേഖരത്തിൽ *ഔസത ഫംഗ്ഷൻ* പ്രയോഗിക്കുന്നത്\n",
"\n",
"`boosting`: പരസ്പരം ആശ്രയിച്ച് പ്രവർത്തിക്കുന്ന മോഡലുകളുടെ ഒരു ശ്രേണി നിർമ്മിച്ച് പ്രവചന പ്രകടനം മെച്ചപ്പെടുത്തുന്നത്.\n",
"\n",
"നമുക്ക് ആദ്യം ഒരു റാൻഡം ഫോറസ്റ്റ് മോഡൽ പരീക്ഷിക്കാം, ഇത് വലിയൊരു ഡിസിഷൻ ട്രീകളുടെ ശേഖരം നിർമ്മിച്ച് അവയ്ക്ക് ഒരു ഔസത ഫംഗ്ഷൻ പ്രയോഗിച്ച് മികച്ച മൊത്തം മോഡൽ സൃഷ്ടിക്കുന്നു.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "49DPoVs6iK1M"
},
"source": [
"# Make a random forest specification\n",
"rf_spec <- rand_forest() %>% \n",
" set_engine(\"ranger\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"rf_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(rf_spec)\n",
"\n",
"# Train a random forest model\n",
"rf_wf_fit <- rf_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"rf_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "RGVYwC_aiUWc"
},
"source": [
"നല്ല ജോലി 👏!\n",
"\n",
"നാം ഒരു Boosted Tree മോഡലുമായി പരീക്ഷണം നടത്താം.\n",
"\n",
"Boosted Tree ഒരു എൻസംബിൾ രീതിയാണ്, ഇത് പരമ്പരാഗതമായ തീരുമാനമരങ്ങൾ സൃഷ്ടിക്കുന്നു, ഓരോ മരവും മുമ്പത്തെ മരങ്ങളുടെ ഫലങ്ങളിൽ ആശ്രയിച്ചിരിക്കുന്നു, പിഴവ് ക്രമാതീതമായി കുറയ്ക്കാൻ ശ്രമിക്കുന്നു. തെറ്റായി വർഗ്ഗീകരിച്ച വസ്തുക്കളുടെ ഭാരം ശ്രദ്ധിച്ച് അടുത്ത ക്ലാസിഫയറിന്റെ ഫിറ്റ് ശരിയാക്കുന്നു.\n",
"\n",
"ഈ മോഡൽ ഫിറ്റ് ചെയ്യാനുള്ള വിവിധ മാർഗ്ഗങ്ങൾ ഉണ്ട് (`help(\"boost_tree\")` കാണുക). ഈ ഉദാഹരണത്തിൽ, നാം `xgboost` എഞ്ചിൻ വഴി Boosted trees ഫിറ്റ് ചെയ്യും.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Py1YWo-micWs"
},
"source": [
"# Make a boosted tree specification\n",
"boost_spec <- boost_tree(trees = 200) %>% \n",
" set_engine(\"xgboost\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"boost_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(boost_spec)\n",
"\n",
"# Train a boosted tree model\n",
"boost_wf_fit <- boost_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"boost_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zNQnbuejigZM"
},
"source": [
"> ✅ ദയവായി കാണുക:\n",
">\n",
"> - [സാമൂഹ്യ ശാസ്ത്രജ്ഞർക്കുള്ള മെഷീൻ ലേണിംഗ്](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n",
">\n",
"> - [R ഉപയോഗിച്ച് ഹാൻഡ്‌സ്-ഓൺ മെഷീൻ ലേണിംഗ്](https://bradleyboehmke.github.io/HOML/)\n",
">\n",
"> - [R-ൽ അപ്ലിക്കേഷനുകളോടുകൂടിയ സ്റ്റാറ്റിസ്റ്റിക്കൽ ലേണിംഗിലേക്ക് ഒരു പരിചയം](https://www.statlearning.com/)\n",
">\n",
"> - <https://algotech.netlify.app/blog/xgboost/> - xgboost-ന് നല്ല ഒരു പകരം ആയ AdaBoost മോഡൽ പരിശോധിക്കുന്നു.\n",
">\n",
"> എൺസംബിൾ ക്ലാസിഫയർസിനെക്കുറിച്ച് കൂടുതൽ അറിയാൻ.\n",
"\n",
"## 4. അധികം - പല മോഡലുകളും താരതമ്യം ചെയ്യൽ\n",
"\n",
"ഈ ലാബിൽ നാം വളരെ മോഡലുകൾ ഫിറ്റ് ചെയ്തിട്ടുണ്ട് 🙌. വ്യത്യസ്ത സെറ്റുകളുടെ പ്രീപ്രോസസറുകളും/അഥവാ മോഡൽ സ്പെസിഫിക്കേഷനുകളും ഉപയോഗിച്ച് നിരവധി വർക്ക്‌ഫ്ലോകൾ സൃഷ്ടിച്ച് ഓരോന്നിന്റെയും പ്രകടന മെട്രിക്കുകൾ ഒറ്റത്തവണ കണക്കാക്കുന്നത് ക്ഷീണകരമോ ബുദ്ധിമുട്ടുള്ളതോ ആകാം.\n",
"\n",
"ട്രെയിനിംഗ് സെറ്റിൽ വർക്ക്‌ഫ്ലോകളുടെ ഒരു ലിസ്റ്റ് ഫിറ്റ് ചെയ്ത് ടെസ്റ്റ് സെറ്റിന്റെ അടിസ്ഥാനത്തിൽ പ്രകടന മെട്രിക്കുകൾ തിരികെ നൽകുന്ന ഒരു ഫംഗ്ഷൻ സൃഷ്ടിച്ച് ഇത് പരിഹരിക്കാമോ എന്ന് നോക്കാം. ലിസ്റ്റിലെ ഓരോ ഘടകത്തിലും ഫംഗ്ഷനുകൾ പ്രയോഗിക്കാൻ [purrr](https://purrr.tidyverse.org/) പാക്കേജിൽ നിന്നുള്ള `map()` ഉം `map_dfr()` ഉം ഉപയോഗിക്കാം.\n",
"\n",
"> [`map()`](https://purrr.tidyverse.org/reference/map.html) ഫംഗ്ഷനുകൾ കോഡ് കൂടുതൽ സംക്ഷിപ്തവും വായിക്കാൻ എളുപ്പവുമാക്കുന്ന നിരവധി for ലൂപ്പുകൾ മാറ്റാൻ അനുവദിക്കുന്നു. [`map()`](https://purrr.tidyverse.org/reference/map.html) ഫംഗ്ഷനുകൾക്കുറിച്ച് പഠിക്കാൻ ഏറ്റവും നല്ല സ്ഥലം R for data science-ലെ [iteration chapter](http://r4ds.had.co.nz/iteration.html) ആണ്.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Qzb7LyZnimd2"
},
"source": [
"set.seed(2056)\n",
"\n",
"# Create a metric set\n",
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
"\n",
"# Define a function that returns performance metrics\n",
"compare_models <- function(workflow_list, train_set, test_set){\n",
" \n",
" suppressWarnings(\n",
" # Fit each model to the train_set\n",
" map(workflow_list, fit, data = train_set) %>% \n",
" # Make predictions on the test set\n",
" map_dfr(augment, new_data = test_set, .id = \"model\") %>%\n",
" # Select desired columns\n",
" select(model, cuisine, .pred_class) %>% \n",
" # Evaluate model performance\n",
" group_by(model) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class) %>% \n",
" ungroup()\n",
" )\n",
" \n",
"} # End of function"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Fwa712sNisDA"
},
"source": [
"നമുക്ക് നമ്മുടെ ഫംഗ്ഷൻ വിളിച്ച് മോഡലുകൾക്കിടയിലെ കൃത്യത താരതമ്യം ചെയ്യാം.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "3i4VJOi2iu-a"
},
"source": [
"# Make a list of workflows\n",
"workflow_list <- list(\n",
" \"svc\" = svc_linear_wf,\n",
" \"svm\" = svm_rbf_wf,\n",
" \"knn\" = knn_wf,\n",
" \"random_forest\" = rf_wf,\n",
" \"xgboost\" = boost_wf)\n",
"\n",
"# Call the function\n",
"set.seed(2056)\n",
"perf_metrics <- compare_models(workflow_list = workflow_list, train_set = cuisines_train, test_set = cuisines_test)\n",
"\n",
"# Print out performance metrics\n",
"perf_metrics %>% \n",
" group_by(.metric) %>% \n",
" arrange(desc(.estimate)) %>% \n",
" slice_head(n=7)\n",
"\n",
"# Compare accuracy\n",
"perf_metrics %>% \n",
" filter(.metric == \"accuracy\") %>% \n",
" arrange(desc(.estimate))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KuWK_lEli4nW"
},
"source": [
"\n",
"[**workflowset**](https://workflowsets.tidymodels.org/) പാക്കേജ് ഉപയോക്താക്കൾക്ക് വലിയ തോതിൽ മോഡലുകൾ സൃഷ്ടിക്കുകയും എളുപ്പത്തിൽ ഫിറ്റ് ചെയ്യുകയും ചെയ്യാൻ അനുവദിക്കുന്നു, പക്ഷേ ഇത് പ്രധാനമായും `cross-validation` പോലുള്ള റിസാമ്പ്ലിംഗ് സാങ്കേതികവിദ്യകളുമായി പ്രവർത്തിക്കാൻ രൂപകൽപ്പന ചെയ്തതാണ്, ഇത് നാം ഇതുവരെ പഠിച്ചിട്ടില്ല.\n",
"\n",
"## **🚀ചലഞ്ച്**\n",
"\n",
"ഈ സാങ്കേതികവിദ്യകളിൽ ഓരോതിലും നിങ്ങൾ ക്രമീകരിക്കാവുന്ന നിരവധി പാരാമീറ്ററുകൾ ഉണ്ട്, ഉദാഹരണത്തിന് SVM-കളിലെ `cost`, KNN-യിലെ `neighbors`, Random Forest-യിലെ `mtry` (Randomly Selected Predictors).\n",
"\n",
"ഓരോ മോഡലിന്റെയും ഡിഫോൾട്ട് പാരാമീറ്ററുകൾ അന്വേഷിച്ച് ഈ പാരാമീറ്ററുകൾ ക്രമീകരിക്കുന്നത് മോഡലിന്റെ ഗുണമേന്മയ്ക്ക് എന്ത് അർത്ഥമാക്കുമെന്ന് ചിന്തിക്കുക.\n",
"\n",
"ഒരു പ്രത്യേക മോഡലിന്റെയും അതിന്റെ പാരാമീറ്ററുകളുടെയും കൂടുതൽ വിവരങ്ങൾ അറിയാൻ, ഉപയോഗിക്കുക: `help(\"model\")` ഉദാ: `help(\"rand_forest\")`\n",
"\n",
"> പ്രായോഗികമായി, നാം സാധാരണയായി ഈ മൂല്യങ്ങൾ *മികച്ച മൂല്യങ്ങൾ* എന്ന് *അനുമാനിക്കുന്നു* പല മോഡലുകളും ഒരു `സിമുലേറ്റഡ് ഡാറ്റാ സെറ്റ്`-ൽ പരിശീലിപ്പിച്ച് ഈ മോഡലുകൾ എത്രത്തോളം നല്ല പ്രകടനം കാണിക്കുന്നു എന്ന് അളക്കുന്നു. ഈ പ്രക്രിയയെ **ട്യൂണിംഗ്** എന്ന് വിളിക്കുന്നു.\n",
"\n",
"### [**പോസ്റ്റ്-ലെക്ചർ ക്വിസ്**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
"\n",
"### **പരിശോധന & സ്വയം പഠനം**\n",
"\n",
"ഈ പാഠങ്ങളിൽ ധാരാളം സാങ്കേതിക പദങ്ങൾ ഉണ്ട്, അതിനാൽ [ഈ പട്ടിക](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) ഒരു നിമിഷം പരിശോധിക്കുക!\n",
"\n",
"#### നന്ദി:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) R-നെ കൂടുതൽ സ്വാഗതം ചെയ്യുന്നതും ആകർഷകവുമാക്കുന്ന അത്ഭുതകരമായ ചിത്രങ്ങൾ സൃഷ്ടിച്ചതിന്. അവളുടെ കൂടുതൽ ചിത്രങ്ങൾ അവളുടെ [ഗാലറി](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM)യിൽ കാണാം.\n",
"\n",
"[Cassie Breviu](https://www.twitter.com/cassieview)യും [Jen Looper](https://www.twitter.com/jenlooper)യും ഈ മോഡ്യൂളിന്റെ ഒറിജിനൽ പൈതൺ പതിപ്പ് സൃഷ്ടിച്ചതിന് ♥️\n",
"\n",
"സന്തോഷകരമായ പഠനം,\n",
"\n",
"[Eric](https://twitter.com/ericntay), ഗോൾഡ് മൈക്രോസോഫ്റ്റ് ലേൺ സ്റ്റുഡന്റ് അംബാസഡർ.\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/r_learners_sm.f9199f76f1e2e49304b19155ebcfb8bad375aface4625be7e95404486a48d332.ml.jpeg\"\n",
" width=\"569\"/>\n",
" <figcaption>@allison_horst എന്നവരുടെ കലാസൃഷ്ടി</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാപത്രം**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ പ്രാമാണികമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,304 @@
{
"cells": [
{
"source": [
"# കൂടുതൽ വർഗ്ഗീകരണ മോഡലുകൾ നിർമ്മിക്കുക\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 1
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 2
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 3
}
],
"source": [
"cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_feature_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# വ്യത്യസ്ത ക്ലാസിഫയറുകൾ പരീക്ഷിക്കുക\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.svm import SVC\n",
"from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier\n",
"from sklearn.model_selection import train_test_split, cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"\n",
"C = 10\n",
"# Create different classifiers.\n",
"classifiers = {\n",
" 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0),\n",
" 'KNN classifier': KNeighborsClassifier(C),\n",
" 'SVC': SVC(),\n",
" 'RFST': RandomForestClassifier(n_estimators=100),\n",
" 'ADA': AdaBoostClassifier(n_estimators=100)\n",
" \n",
"}\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Accuracy (train) for Linear SVC: 76.4% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.64 0.66 0.65 242\n",
" indian 0.91 0.86 0.89 236\n",
" japanese 0.72 0.73 0.73 245\n",
" korean 0.83 0.75 0.79 234\n",
" thai 0.75 0.82 0.78 242\n",
"\n",
" accuracy 0.76 1199\n",
" macro avg 0.77 0.76 0.77 1199\n",
"weighted avg 0.77 0.76 0.77 1199\n",
"\n",
"Accuracy (train) for KNN classifier: 70.7% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.65 0.63 0.64 242\n",
" indian 0.84 0.81 0.82 236\n",
" japanese 0.60 0.81 0.69 245\n",
" korean 0.89 0.53 0.67 234\n",
" thai 0.69 0.75 0.72 242\n",
"\n",
" accuracy 0.71 1199\n",
" macro avg 0.73 0.71 0.71 1199\n",
"weighted avg 0.73 0.71 0.71 1199\n",
"\n",
"Accuracy (train) for SVC: 80.1% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.71 0.69 0.70 242\n",
" indian 0.92 0.92 0.92 236\n",
" japanese 0.77 0.78 0.77 245\n",
" korean 0.87 0.77 0.82 234\n",
" thai 0.75 0.86 0.80 242\n",
"\n",
" accuracy 0.80 1199\n",
" macro avg 0.80 0.80 0.80 1199\n",
"weighted avg 0.80 0.80 0.80 1199\n",
"\n",
"Accuracy (train) for RFST: 82.8% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.80 0.75 0.77 242\n",
" indian 0.90 0.91 0.90 236\n",
" japanese 0.82 0.78 0.80 245\n",
" korean 0.85 0.82 0.83 234\n",
" thai 0.78 0.89 0.83 242\n",
"\n",
" accuracy 0.83 1199\n",
" macro avg 0.83 0.83 0.83 1199\n",
"weighted avg 0.83 0.83 0.83 1199\n",
"\n",
"Accuracy (train) for ADA: 71.1% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.60 0.57 0.58 242\n",
" indian 0.87 0.84 0.86 236\n",
" japanese 0.71 0.60 0.65 245\n",
" korean 0.68 0.78 0.72 234\n",
" thai 0.70 0.78 0.74 242\n",
"\n",
" accuracy 0.71 1199\n",
" macro avg 0.71 0.71 0.71 1199\n",
"weighted avg 0.71 0.71 0.71 1199\n",
"\n"
]
}
],
"source": [
"n_classifiers = len(classifiers)\n",
"\n",
"for index, (name, classifier) in enumerate(classifiers.items()):\n",
" classifier.fit(X_train, np.ravel(y_train))\n",
"\n",
" y_pred = classifier.predict(X_test)\n",
" accuracy = accuracy_score(y_test, y_pred)\n",
" print(\"Accuracy (train) for %s: %0.1f%% \" % (name, accuracy * 100))\n",
" print(classification_report(y_test,y_pred))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാ**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "7ea2b714669c823a596d986ba2d5739f",
"translation_date": "2025-12-19T17:09:10+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,331 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "61bdec27ed2da8b098cd9065405d9bb0",
"translation_date": "2025-12-19T15:27:17+00:00",
"source_file": "4-Classification/4-Applied/README.md",
"language_code": "ml"
}
-->
# ഒരു ക്യൂസീൻ ശുപാർശ വെബ് ആപ്പ് നിർമ്മിക്കുക
ഈ പാഠത്തിൽ, നിങ്ങൾ മുമ്പത്തെ പാഠങ്ങളിൽ പഠിച്ച ചില സാങ്കേതിക വിദ്യകൾ ഉപയോഗിച്ച് ക്ലാസിഫിക്കേഷൻ മോഡൽ നിർമ്മിക്കുകയും ഈ പരമ്പരയിൽ മുഴുവൻ ഉപയോഗിച്ച രുചികരമായ ക്യൂസീൻ ഡാറ്റാസെറ്റ് ഉപയോഗിച്ച് അത് നിർമിക്കുകയും ചെയ്യും. കൂടാതെ, Onnx-ന്റെ വെബ് റൺടൈം ഉപയോഗിച്ച് സേവ് ചെയ്ത മോഡൽ ഉപയോഗിക്കുന്ന ഒരു ചെറിയ വെബ് ആപ്പ് നിർമ്മിക്കും.
മെഷീൻ ലേണിങ്ങിന്റെ ഏറ്റവും പ്രയോജനകരമായ പ്രായോഗിക ഉപയോഗങ്ങളിൽ ഒന്നാണ് ശുപാർശാ സംവിധാനങ്ങൾ നിർമ്മിക്കുന്നത്, ഇന്ന് നിങ്ങൾ ആ ദിശയിൽ ആദ്യപടി എടുക്കാം!
[![ഈ വെബ് ആപ്പ് അവതരിപ്പിക്കുന്നു](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Applied ML")
> 🎥 വീഡിയോക്കായി മുകളിൽ ചിത്രത്തിൽ ക്ലിക്ക് ചെയ്യുക: ജെൻ ലൂപ്പർ ക്ലാസിഫൈ ചെയ്ത ക്യൂസീൻ ഡാറ്റ ഉപയോഗിച്ച് വെബ് ആപ്പ് നിർമ്മിക്കുന്നു
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
ഈ പാഠത്തിൽ നിങ്ങൾ പഠിക്കാനിരിക്കുന്നത്:
- മോഡൽ നിർമ്മിച്ച് Onnx മോഡലായി സേവ് ചെയ്യുന്നത് എങ്ങനെ
- മോഡൽ പരിശോധിക്കാൻ Netron എങ്ങനെ ഉപയോഗിക്കാം
- നിങ്ങളുടെ മോഡൽ വെബ് ആപ്പിൽ ഇൻഫറൻസിനായി എങ്ങനെ ഉപയോഗിക്കാം
## നിങ്ങളുടെ മോഡൽ നിർമ്മിക്കുക
പ്രായോഗിക ML സിസ്റ്റങ്ങൾ നിർമ്മിക്കുന്നത് ഈ സാങ്കേതിക വിദ്യകൾ നിങ്ങളുടെ ബിസിനസ് സിസ്റ്റങ്ങളിൽ പ്രയോജനപ്പെടുത്തുന്നതിന്റെ ഒരു പ്രധാന ഭാഗമാണ്. Onnx ഉപയോഗിച്ച് നിങ്ങൾക്ക് നിങ്ങളുടെ വെബ് ആപ്പുകളിൽ മോഡലുകൾ ഉപയോഗിക്കാം (ആവശ്യമായാൽ ഓഫ്‌ലൈൻ സാഹചര്യത്തിലും ഉപയോഗിക്കാം).
[മുമ്പത്തെ പാഠത്തിൽ](../../3-Web-App/1-Web-App/README.md), നിങ്ങൾ UFO സൈറ്റിംഗുകളെക്കുറിച്ചുള്ള Regression മോഡൽ നിർമ്മിച്ച്, അത് "പിക്കിൾ" ചെയ്ത് Flask ആപ്പിൽ ഉപയോഗിച്ചിരുന്നു. ഈ ആർക്കിടെക്ചർ അറിയുന്നത് വളരെ പ്രയോജനകരമാണ്, പക്ഷേ അത് ഒരു ഫുൾ-സ്റ്റാക്ക് പൈത്തൺ ആപ്പാണ്, നിങ്ങളുടെ ആവശ്യങ്ങൾ ജാവാസ്ക്രിപ്റ്റ് ആപ്ലിക്കേഷൻ ഉപയോഗിക്കലും ഉൾക്കൊള്ളാം.
ഈ പാഠത്തിൽ, നിങ്ങൾ അടിസ്ഥാന ജാവാസ്ക്രിപ്റ്റ് അടിസ്ഥാനമാക്കിയുള്ള ഇൻഫറൻസ് സിസ്റ്റം നിർമ്മിക്കാം. ആദ്യം, മോഡൽ പരിശീലിപ്പിച്ച് Onnx ഉപയോഗിക്കാൻ മാറ്റണം.
## അഭ്യാസം - ക്ലാസിഫിക്കേഷൻ മോഡൽ പരിശീലിപ്പിക്കുക
ആദ്യം, നാം ഉപയോഗിച്ച ക്ലീനായ ക്യൂസീൻ ഡാറ്റാസെറ്റ് ഉപയോഗിച്ച് ക്ലാസിഫിക്കേഷൻ മോഡൽ പരിശീലിപ്പിക്കുക.
1. പ്രയോജനകരമായ ലൈബ്രറികൾ ഇറക്കുമതി ചെയ്യുക:
```python
!pip install skl2onnx
import pandas as pd
```
നിങ്ങളുടെ Scikit-learn മോഡൽ Onnx ഫോർമാറ്റിലേക്ക് മാറ്റാൻ '[skl2onnx](https://onnx.ai/sklearn-onnx/)' ആവശ്യമാണ്.
1. തുടർന്ന്, മുമ്പത്തെ പാഠങ്ങളിൽ ചെയ്തതുപോലെ `read_csv()` ഉപയോഗിച്ച് CSV ഫയൽ വായിച്ച് ഡാറ്റ കൈകാര്യം ചെയ്യുക:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. ആദ്യ രണ്ട് അനാവശ്യ കോളങ്ങൾ നീക്കം ചെയ്ത് ശേഷിക്കുന്ന ഡാറ്റ 'X' ആയി സേവ് ചെയ്യുക:
```python
X = data.iloc[:,2:]
X.head()
```
1. ലേബലുകൾ 'y' ആയി സേവ് ചെയ്യുക:
```python
y = data[['cuisine']]
y.head()
```
### പരിശീലന രീതി ആരംഭിക്കുക
നല്ല കൃത്യതയുള്ള 'SVC' ലൈബ്രറി ഉപയോഗിക്കും.
1. Scikit-learn-ൽ നിന്നുള്ള അനുയോജ്യമായ ലൈബ്രറികൾ ഇറക്കുമതി ചെയ്യുക:
```python
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report
```
1. പരിശീലനവും ടെസ്റ്റ് സെറ്റുകളും വേർതിരിക്കുക:
```python
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
```
1. മുമ്പത്തെ പാഠത്തിൽ ചെയ്തതുപോലെ SVC ക്ലാസിഫിക്കേഷൻ മോഡൽ നിർമ്മിക്കുക:
```python
model = SVC(kernel='linear', C=10, probability=True,random_state=0)
model.fit(X_train,y_train.values.ravel())
```
1. ഇപ്പോൾ, predict() വിളിച്ച് മോഡൽ പരീക്ഷിക്കുക:
```python
y_pred = model.predict(X_test)
```
1. മോഡലിന്റെ ഗുണനിലവാരം പരിശോധിക്കാൻ ക്ലാസിഫിക്കേഷൻ റിപ്പോർട്ട് പ്രിന്റ് ചെയ്യുക:
```python
print(classification_report(y_test,y_pred))
```
മുമ്പ് കണ്ടതുപോലെ, കൃത്യത നല്ലതാണ്:
```output
precision recall f1-score support
chinese 0.72 0.69 0.70 257
indian 0.91 0.87 0.89 243
japanese 0.79 0.77 0.78 239
korean 0.83 0.79 0.81 236
thai 0.72 0.84 0.78 224
accuracy 0.79 1199
macro avg 0.79 0.79 0.79 1199
weighted avg 0.79 0.79 0.79 1199
```
### നിങ്ങളുടെ മോഡൽ Onnx-ലേക്ക് മാറ്റുക
ശരിയായ ടെൻസർ നമ്പർ ഉപയോഗിച്ച് മാറ്റം നടത്തുക. ഈ ഡാറ്റാസെറ്റിൽ 380 ഘടകങ്ങൾ ഉണ്ട്, അതിനാൽ `FloatTensorType`-ൽ ആ നമ്പർ രേഖപ്പെടുത്തണം:
1. 380 എന്ന ടെൻസർ നമ്പർ ഉപയോഗിച്ച് മാറ്റുക.
```python
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
initial_type = [('float_input', FloatTensorType([None, 380]))]
options = {id(model): {'nocl': True, 'zipmap': False}}
```
1. onx സൃഷ്ടിച്ച് **model.onnx** എന്ന ഫയലായി സേവ് ചെയ്യുക:
```python
onx = convert_sklearn(model, initial_types=initial_type, options=options)
with open("./model.onnx", "wb") as f:
f.write(onx.SerializeToString())
```
> ശ്രദ്ധിക്കുക, നിങ്ങളുടെ മാറ്റം സ്ക്രിപ്റ്റിൽ [ഓപ്ഷനുകൾ](https://onnx.ai/sklearn-onnx/parameterized.html) നൽകാം. ഈ കേസിൽ, 'nocl' സത്യം ആക്കുകയും 'zipmap' തെറ്റായി സജ്ജമാക്കുകയും ചെയ്തു. ഇത് ക്ലാസിഫിക്കേഷൻ മോഡലായതിനാൽ ZipMap നീക്കം ചെയ്യാനുള്ള ഓപ്ഷൻ ഉണ്ട് (അവശ്യമായില്ല). `nocl` മോഡലിൽ ക്ലാസ് വിവരങ്ങൾ ഉൾപ്പെടുന്നതിനെ സൂചിപ്പിക്കുന്നു. `nocl` 'True' ആക്കി മോഡലിന്റെ വലിപ്പം കുറയ്ക്കാം.
പൂർണ്ണ നോട്ട്ബുക്ക് റൺ ചെയ്താൽ Onnx മോഡൽ നിർമ്മിച്ച് ഈ ഫോൾഡറിൽ സേവ് ചെയ്യും.
## നിങ്ങളുടെ മോഡൽ കാണുക
Onnx മോഡലുകൾ Visual Studio കോഡിൽ വളരെ ദൃശ്യമായില്ല, പക്ഷേ മോഡൽ ശരിയായി നിർമ്മിച്ചതെന്ന് ഉറപ്പാക്കാൻ പല ഗവേഷകരും ഉപയോഗിക്കുന്ന നല്ല സൗജന്യ സോഫ്റ്റ്‌വെയർ ഉണ്ട്. [Netron](https://github.com/lutzroeder/Netron) ഡൗൺലോഡ് ചെയ്ത് model.onnx ഫയൽ തുറക്കുക. 380 ഇൻപുട്ടുകളും ക്ലാസിഫയർ ലിസ്റ്റും ഉള്ള ലളിതമായ മോഡൽ ദൃശ്യമായി കാണാം:
![Netron visual](../../../../translated_images/netron.a05f39410211915e0f95e2c0e8b88f41e7d13d725faf660188f3802ba5c9e831.ml.png)
Netron നിങ്ങളുടെ മോഡലുകൾ കാണാൻ സഹായിക്കുന്ന ഉപകരണം ആണ്.
ഇപ്പോൾ ഈ മനോഹരമായ മോഡൽ വെബ് ആപ്പിൽ ഉപയോഗിക്കാൻ തയ്യാറാണ്. നിങ്ങളുടെ ഫ്രിഡ്ജിൽ നോക്കി ബാക്കി ഉള്ള ഘടകങ്ങൾ ഉപയോഗിച്ച് ഏത് ക്യൂസീൻ പാചകം ചെയ്യാമെന്ന് കണ്ടെത്താൻ സഹായിക്കുന്ന ഒരു ആപ്പ് നിർമ്മിക്കാം, നിങ്ങളുടെ മോഡൽ നിർദ്ദേശിക്കുന്നതുപോലെ.
## ശുപാർശാ വെബ് ആപ്പ് നിർമ്മിക്കുക
നിങ്ങളുടെ മോഡൽ നേരിട്ട് വെബ് ആപ്പിൽ ഉപയോഗിക്കാം. ഈ ആർക്കിടെക്ചർ ലോക്കലായി പോലും ഓൺലൈൻ അല്ലാതെ പ്രവർത്തിക്കാൻ അനുവദിക്കുന്നു. `model.onnx` ഫയൽ സേവ് ചെയ്ത ഫോൾഡറിൽ `index.html` ഫയൽ സൃഷ്ടിച്ച് തുടങ്ങുക.
1. ഈ _index.html_ ഫയലിൽ താഴെ കാണുന്ന മാർക്കപ്പ് ചേർക്കുക:
```html
<!DOCTYPE html>
<html>
<header>
<title>Cuisine Matcher</title>
</header>
<body>
...
</body>
</html>
```
1. ഇപ്പോൾ, `body` ടാഗുകൾക്കുള്ളിൽ, ചില ഘടകങ്ങൾ പ്രതിഫലിപ്പിക്കുന്ന ചെക്ക്ബോക്സുകളുടെ ലിസ്റ്റ് കാണിക്കാൻ ചെറിയ മാർക്കപ്പ് ചേർക്കുക:
```html
<h1>Check your refrigerator. What can you create?</h1>
<div id="wrapper">
<div class="boxCont">
<input type="checkbox" value="4" class="checkbox">
<label>apple</label>
</div>
<div class="boxCont">
<input type="checkbox" value="247" class="checkbox">
<label>pear</label>
</div>
<div class="boxCont">
<input type="checkbox" value="77" class="checkbox">
<label>cherry</label>
</div>
<div class="boxCont">
<input type="checkbox" value="126" class="checkbox">
<label>fenugreek</label>
</div>
<div class="boxCont">
<input type="checkbox" value="302" class="checkbox">
<label>sake</label>
</div>
<div class="boxCont">
<input type="checkbox" value="327" class="checkbox">
<label>soy sauce</label>
</div>
<div class="boxCont">
<input type="checkbox" value="112" class="checkbox">
<label>cumin</label>
</div>
</div>
<div style="padding-top:10px">
<button onClick="startInference()">What kind of cuisine can you make?</button>
</div>
```
ഓരോ ചെക്ക്ബോക്സിനും ഒരു മൂല്യം നൽകിയിട്ടുണ്ട്. ഇത് ഡാറ്റാസെറ്റിൽ ഘടകം കണ്ടെത്തുന്ന ഇൻഡക്സ് പ്രതിഫലിപ്പിക്കുന്നു. ഉദാഹരണത്തിന്, ആപ്പിൾ ആൽഫബറ്റിക് ലിസ്റ്റിൽ അഞ്ചാം കോളത്തിൽ ആണ്, അതിനാൽ മൂല്യം '4' ആണ് (0 മുതൽ എണ്ണുന്നത്). ഒരു ഘടകത്തിന്റെ ഇൻഡക്സ് കണ്ടെത്താൻ [ingredients spreadsheet](../../../../4-Classification/data/ingredient_indexes.csv) കാണാം.
index.html ഫയലിൽ തുടർന്നു, അവസാന `</div>`-നു ശേഷം മോഡൽ വിളിക്കുന്ന ഒരു സ്ക്രിപ്റ്റ് ബ്ലോക്ക് ചേർക്കുക.
1. ആദ്യം, [Onnx Runtime](https://www.onnxruntime.ai/) ഇറക്കുമതി ചെയ്യുക:
```html
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.9.0/dist/ort.min.js"></script>
```
> Onnx Runtime നിങ്ങളുടെ Onnx മോഡലുകൾ വിവിധ ഹാർഡ്‌വെയർ പ്ലാറ്റ്‌ഫോമുകളിൽ ഓടിക്കാൻ സഹായിക്കുന്നു, ഒപ്റ്റിമൈസേഷനുകളും API-യും ഉൾപ്പെടെ.
1. റൺടൈം സജ്ജമാക്കിയ ശേഷം, അതിനെ വിളിക്കാം:
```html
<script>
const ingredients = Array(380).fill(0);
const checks = [...document.querySelectorAll('.checkbox')];
checks.forEach(check => {
check.addEventListener('change', function() {
// toggle the state of the ingredient
// based on the checkbox's value (1 or 0)
ingredients[check.value] = check.checked ? 1 : 0;
});
});
function testCheckboxes() {
// validate if at least one checkbox is checked
return checks.some(check => check.checked);
}
async function startInference() {
let atLeastOneChecked = testCheckboxes()
if (!atLeastOneChecked) {
alert('Please select at least one ingredient.');
return;
}
try {
// create a new session and load the model.
const session = await ort.InferenceSession.create('./model.onnx');
const input = new ort.Tensor(new Float32Array(ingredients), [1, 380]);
const feeds = { float_input: input };
// feed inputs and run
const results = await session.run(feeds);
// read from results
alert('You can enjoy ' + results.label.data[0] + ' cuisine today!')
} catch (e) {
console.log(`failed to inference ONNX model`);
console.error(e);
}
}
</script>
```
ഈ കോഡിൽ പല കാര്യങ്ങളും നടക്കുന്നു:
1. 380 സാധ്യതയുള്ള മൂല്യങ്ങളുടെ (1 അല്ലെങ്കിൽ 0) ഒരു അറേ സൃഷ്ടിച്ചു, ഘടകം ചെക്ക്ബോക്സ് പരിശോധിച്ചിട്ടുണ്ടോ എന്നതിനെ ആശ്രയിച്ച് മോഡലിന് ഇൻഫറൻസിനായി അയയ്ക്കാൻ.
2. ചെക്ക്ബോക്സുകളുടെ അറേയും, ആപ്പ്ലിക്കേഷൻ ആരംഭിക്കുമ്പോൾ വിളിക്കുന്ന `init` ഫംഗ്ഷനിൽ അവ പരിശോധിക്കുന്ന മാർഗവും സൃഷ്ടിച്ചു. ചെക്ക്ബോക്സ് പരിശോധിച്ചാൽ, `ingredients` അറേ തിരഞ്ഞെടുക്കപ്പെട്ട ഘടകം പ്രതിഫലിപ്പിക്കാൻ മാറ്റം വരുത്തും.
3. ഏതെങ്കിലും ചെക്ക്ബോക്സ് പരിശോധിച്ചിട്ടുണ്ടോ എന്ന് പരിശോധിക്കുന്ന `testCheckboxes` ഫംഗ്ഷൻ സൃഷ്ടിച്ചു.
4. ബട്ടൺ അമർത്തുമ്പോൾ `startInference` ഫംഗ്ഷൻ ഉപയോഗിച്ച്, ഏതെങ്കിലും ചെക്ക്ബോക്സ് പരിശോധിച്ചിട്ടുണ്ടെങ്കിൽ ഇൻഫറൻസ് ആരംഭിക്കുന്നു.
5. ഇൻഫറൻസ് രീതി ഉൾപ്പെടുന്നു:
1. മോഡൽ അസിങ്ക്രോണസ് ആയി ലോഡ് ചെയ്യൽ
2. മോഡലിന് അയയ്ക്കാനുള്ള Tensor ഘടന സൃഷ്ടിക്കൽ
3. പരിശീലന സമയത്ത് സൃഷ്ടിച്ച `float_input` ഇൻപുട്ട് പ്രതിഫലിപ്പിക്കുന്ന 'feeds' സൃഷ്ടിക്കൽ (Netron ഉപയോഗിച്ച് ആ പേര് പരിശോധിക്കാം)
4. ഈ 'feeds' മോഡലിലേക്ക് അയച്ച് പ്രതികരണം കാത്തിരിക്കുക
## നിങ്ങളുടെ ആപ്പ് പരീക്ഷിക്കുക
Visual Studio Code-ൽ index.html ഫയൽ ഉള്ള ഫോൾഡറിൽ ടെർമിനൽ സെഷൻ തുറക്കുക. [http-server](https://www.npmjs.com/package/http-server) ഗ്ലോബലായി ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക, പ്രോംപ്റ്റിൽ `http-server` ടൈപ്പ് ചെയ്യുക. ഒരു ലോക്കൽഹോസ്റ്റ് തുറക്കും, നിങ്ങളുടെ വെബ് ആപ്പ് കാണാം. വിവിധ ഘടകങ്ങൾ അടിസ്ഥാനമാക്കി ശുപാർശ ചെയ്യുന്ന ക്യൂസീൻ പരിശോധിക്കുക:
![ingredient web app](../../../../translated_images/web-app.4c76450cabe20036f8ec6d5e05ccc0c1c064f0d8f2fe3304d3bcc0198f7dc139.ml.png)
അഭിനന്ദനങ്ങൾ, നിങ്ങൾ കുറച്ച് ഫീൽഡുകളുള്ള 'ശുപാർശ' വെബ് ആപ്പ് സൃഷ്ടിച്ചു. ഈ സിസ്റ്റം വികസിപ്പിക്കാൻ കുറച്ച് സമയം ചെലവഴിക്കൂ!
## 🚀ചലഞ്ച്
നിങ്ങളുടെ വെബ് ആപ്പ് വളരെ ലഘുവാണ്, അതിനാൽ [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv) ഡാറ്റയിൽ നിന്നുള്ള ഘടകങ്ങളും അവയുടെ ഇൻഡക്സ് ഉപയോഗിച്ച് ഇത് വികസിപ്പിക്കുക. ഒരു ദേശീയ വിഭവം സൃഷ്ടിക്കാൻ ഏത് രുചി സംയോജനങ്ങൾ പ്രവർത്തിക്കുന്നു?
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
ഈ പാഠം ഭക്ഷ്യ ഘടകങ്ങൾക്കുള്ള ശുപാർശാ സംവിധാനം സൃഷ്ടിക്കുന്നതിന്റെ പ്രയോജനത്തെ കുറിച്ച് ചെറിയൊരു പരിചയം മാത്രമാണ് നൽകിയിരിക്കുന്നത്, ML അപ്ലിക്കേഷനുകളിൽ ഈ മേഖല ഉദാഹരണങ്ങളിൽ സമൃദ്ധമാണ്. ഈ സംവിധാനങ്ങൾ എങ്ങനെ നിർമ്മിക്കപ്പെടുന്നു എന്ന് കുറച്ച് കൂടുതൽ വായിക്കുക:
- https://www.sciencedirect.com/topics/computer-science/recommendation-engine
- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/
- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/
## അസൈൻമെന്റ്
[പുതിയ ശുപാർശാ സംവിധാനം നിർമ്മിക്കുക](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "799ed651e2af0a7cad17c6268db11578",
"translation_date": "2025-12-19T15:29:25+00:00",
"source_file": "4-Classification/4-Applied/assignment.md",
"language_code": "ml"
}
-->
# ഒരു ശുപാർശയിടുന്ന സംവിധാനം നിർമ്മിക്കുക
## നിർദ്ദേശങ്ങൾ
ഈ പാഠത്തിലെ നിങ്ങളുടെ വ്യായാമങ്ങൾ പരിഗണിച്ചാൽ, നിങ്ങൾക്ക് ഇപ്പോൾ Onnx Runtime ഉപയോഗിച്ച് ജാവാസ്ക്രിപ്റ്റ് അടിസ്ഥാനമാക്കിയ വെബ് ആപ്പ് നിർമ്മിക്കുന്നതും ഒരു മാറ്റിയെടുത്ത Onnx മോഡൽ ഉപയോഗിക്കുന്നതും അറിയാം. ഈ പാഠങ്ങളിൽ നിന്നോ മറ്റെവിടെയോ ലഭിക്കുന്ന ഡാറ്റ ഉപയോഗിച്ച് പുതിയ ശുപാർശയിടുന്ന സംവിധാനം നിർമ്മിക്കാൻ പരീക്ഷിക്കുക (ദയവായി ക്രെഡിറ്റ് നൽകുക). വ്യത്യസ്ത വ്യക്തിത്വ ഗുണങ്ങൾ അടിസ്ഥാനമാക്കി ഒരു മൃഗ ശുപാർശയിടുന്ന സംവിധാനം അല്ലെങ്കിൽ ഒരു വ്യക്തിയുടെ മനോഭാവം അടിസ്ഥാനമാക്കി സംഗീത ശൈലി ശുപാർശയിടുന്ന സംവിധാനം നിങ്ങൾ സൃഷ്ടിക്കാം. സൃഷ്ടിപരമായിരിക്കൂ!
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണാർത്ഥം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | ---------------------------------------------------------------------- | ------------------------------------- | --------------------------------- |
| | ഒരു വെബ് ആപ്പ് കൂടാതെ നോട്ട്ബുക്ക് സമർപ്പിച്ചിരിക്കുന്നു, രണ്ടും നന്നായി രേഖപ്പെടുത്തിയതും പ്രവർത്തിക്കുന്നതും | അവയിൽ ഒന്നോ അതിലധികമോ കാണാനില്ല അല്ലെങ്കിൽ പിഴവുള്ളതാണ് | രണ്ടും കാണാനില്ല അല്ലെങ്കിൽ പിഴവുള്ളതാണ് |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,41 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 4,
"coopTranslator": {
"original_hash": "2f3e0d9e9ac5c301558fb8bf733ac0cb",
"translation_date": "2025-12-19T17:03:06+00:00",
"source_file": "4-Classification/4-Applied/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"# ഒരു ഭക്ഷണ ശൈലി ശുപാർശക്കാർ നിർമ്മിക്കുക\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാ**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,292 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "49325d6dd12a3628fc64fa7ccb1a80ff",
"translation_date": "2025-12-19T17:17:59+00:00",
"source_file": "4-Classification/4-Applied/solution/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"# ഒരു ഭക്ഷണ ശൈലി ശുപാർശകനെ നിർമ്മിക്കുക\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Requirement already satisfied: skl2onnx in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (1.8.0)\n",
"Requirement already satisfied: protobuf in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (3.8.0)\n",
"Requirement already satisfied: numpy>=1.15 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.19.2)\n",
"Requirement already satisfied: onnx>=1.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.9.0)\n",
"Requirement already satisfied: six in /Users/jenlooper/Library/Python/3.7/lib/python/site-packages (from skl2onnx) (1.12.0)\n",
"Requirement already satisfied: onnxconverter-common<1.9,>=1.6.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.8.1)\n",
"Requirement already satisfied: scikit-learn>=0.19 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (0.24.2)\n",
"Requirement already satisfied: scipy>=1.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.4.1)\n",
"Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from protobuf->skl2onnx) (45.1.0)\n",
"Requirement already satisfied: typing-extensions>=3.6.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnx>=1.2.1->skl2onnx) (3.10.0.0)\n",
"Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (2.1.0)\n",
"Requirement already satisfied: joblib>=0.11 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (0.16.0)\n",
"\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n",
"You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"!pip install skl2onnx"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd \n"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 60
}
],
"source": [
"data = pd.read_csv('../../data/cleaned_cuisines.csv')\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 61
}
],
"source": [
"X = data.iloc[:,2:]\n",
"X.head()"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" cuisine\n",
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>cuisine</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>1</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>2</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>3</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>4</th>\n <td>indian</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 62
}
],
"source": [
"y = data[['cuisine']]\n",
"y.head()"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"from sklearn.svm import SVC\n",
"from sklearn.model_selection import cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"SVC(C=10, kernel='linear', probability=True, random_state=0)"
]
},
"metadata": {},
"execution_count": 65
}
],
"source": [
"model = SVC(kernel='linear', C=10, probability=True,random_state=0)\n",
"model.fit(X_train,y_train.values.ravel())\n"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [],
"source": [
"y_pred = model.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n\n chinese 0.72 0.70 0.71 236\n indian 0.91 0.88 0.89 243\n japanese 0.80 0.75 0.77 240\n korean 0.80 0.81 0.81 230\n thai 0.76 0.85 0.80 250\n\n accuracy 0.80 1199\n macro avg 0.80 0.80 0.80 1199\nweighted avg 0.80 0.80 0.80 1199\n\n"
]
}
],
"source": [
"print(classification_report(y_test,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [],
"source": [
"from skl2onnx import convert_sklearn\n",
"from skl2onnx.common.data_types import FloatTensorType\n",
"\n",
"initial_type = [('float_input', FloatTensorType([None, 380]))]\n",
"options = {id(model): {'nocl': True, 'zipmap': False}}\n",
"onx = convert_sklearn(model, initial_types=initial_type, options=options)\n",
"with open(\"./model.onnx\", \"wb\") as f:\n",
" f.write(onx.SerializeToString())\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാ**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,43 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "74e809ffd1e613a1058bbc3e9600859e",
"translation_date": "2025-12-19T13:06:55+00:00",
"source_file": "4-Classification/README.md",
"language_code": "ml"
}
-->
# വർഗ്ഗീകരണവുമായി ആരംഭിക്കുന്നത്
## പ്രാദേശിക വിഷയം: രുചികരമായ ഏഷ്യൻ, ഇന്ത്യൻ ഭക്ഷണങ്ങൾ 🍜
ഏഷ്യയിലും ഇന്ത്യയിലും ഭക്ഷണപരമ്പരകൾ വളരെ വൈവിധ്യമാർന്നതും, വളരെ രുചികരവുമാണ്! അവയുടെ ഘടകങ്ങൾ മനസ്സിലാക്കാൻ പ്രാദേശിക ഭക്ഷണങ്ങളെക്കുറിച്ചുള്ള ഡാറ്റ നോക്കാം.
![Thai food seller](../../../translated_images/thai-food.c47a7a7f9f05c21892a1f9dc7bf30669e6d18dfda420c5c7ebb4153f6a304edd.ml.jpg)
> ഫോട്ടോ <a href="https://unsplash.com/@changlisheng?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">ലിഷെങ് ചാങ്</a> <a href="https://unsplash.com/s/photos/asian-food?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">അൺസ്പ്ലാഷിൽ</a>
## നിങ്ങൾ പഠിക്കാനിരിക്കുന്നതെന്ത്
ഈ വിഭാഗത്തിൽ, നിങ്ങൾ മുമ്പ് പഠിച്ചിരുന്ന റെഗ്രഷൻ അടിസ്ഥാനമാക്കി, ഡാറ്റയെ കൂടുതൽ മനസ്സിലാക്കാൻ ഉപയോഗിക്കാവുന്ന മറ്റ് വർഗ്ഗീകരണ മോഡലുകൾക്കുറിച്ച് പഠിക്കും.
> വർഗ്ഗീകരണ മോഡലുകളുമായി പ്രവർത്തിക്കാൻ സഹായിക്കുന്ന ലൊക്കോഡ് ഉപകരണങ്ങൾ ഉണ്ട്. ഈ ടാസ്കിനായി [Azure ML പരീക്ഷിക്കുക](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
## പാഠങ്ങൾ
1. [വർഗ്ഗീകരണത്തിന് പരിചയം](1-Introduction/README.md)
2. [കൂടുതൽ വർഗ്ഗീകരണ മോഡലുകൾ](2-Classifiers-1/README.md)
3. [മറ്റു വർഗ്ഗീകരണ മോഡലുകൾ](3-Classifiers-2/README.md)
4. [പ്രയോഗം: വെബ് ആപ്പ് നിർമ്മാണം](4-Applied/README.md)
## ക്രെഡിറ്റുകൾ
"Getting started with classification" സ്നേഹത്തോടെ എഴുതിയത് [കാസ്സി ബ്രെവിയു](https://www.twitter.com/cassiebreviu)യും [ജെൻ ലൂപ്പർ](https://www.twitter.com/jenlooper)യും ആണ്
രുചികരമായ ഭക്ഷണങ്ങളുടെ ഡാറ്റാസെറ്റ് [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines) നിന്നാണ് ലഭിച്ചത്.
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,349 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "730225ea274c9174fe688b21d421539d",
"translation_date": "2025-12-19T14:59:24+00:00",
"source_file": "5-Clustering/1-Visualize/README.md",
"language_code": "ml"
}
-->
# ക്ലസ്റ്ററിംഗിലേക്ക് പരിചയം
ക്ലസ്റ്ററിംഗ് ഒരു തരത്തിലുള്ള [Unsupervised Learning](https://wikipedia.org/wiki/Unsupervised_learning) ആണ്, ഇത് ഒരു ഡാറ്റാസെറ്റ് ലേബൽ ചെയ്യപ്പെടാത്തതാണെന്ന് അല്ലെങ്കിൽ അതിന്റെ ഇൻപുട്ടുകൾ മുൻകൂട്ടി നിർവചിച്ച ഔട്ട്പുട്ടുകളുമായി പൊരുത്തപ്പെടാത്തതാണെന്ന് കരുതുന്നു. ഇത് ലേബൽ ചെയ്യപ്പെടാത്ത ഡാറ്റയിൽ നിന്നു വിവിധ ആൽഗോരിതങ്ങൾ ഉപയോഗിച്ച് ഡാറ്റയിൽ കാണുന്ന പാറ്റേണുകൾ അനുസരിച്ച് ഗ്രൂപ്പുകൾ നൽകുന്നു.
[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare")
> 🎥 മുകളിൽ കാണുന്ന ചിത്രത്തിൽ ക്ലിക്ക് ചെയ്ത് ഒരു വീഡിയോ കാണുക. നിങ്ങൾ ക്ലസ്റ്ററിംഗ് ഉപയോഗിച്ച് മെഷീൻ ലേണിംഗ് പഠിക്കുമ്പോൾ, നൈജീരിയൻ ഡാൻസ് ഹാൾ ട്രാക്കുകൾ ആസ്വദിക്കുക - ഇത് 2014-ലെ PSquare യുടെ വളരെ പ്രശംസിക്കപ്പെട്ട പാട്ടാണ്.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
### പരിചയം
[ക്ലസ്റ്ററിംഗ്](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) ഡാറ്റാ എക്സ്പ്ലോറേഷനിൽ വളരെ ഉപകാരപ്രദമാണ്. നൈജീരിയൻ പ്രേക്ഷകർ സംഗീതം എങ്ങനെ ഉപഭോഗിക്കുന്നു എന്നതിൽ ട്രെൻഡുകളും പാറ്റേണുകളും കണ്ടെത്താൻ ഇത് സഹായിക്കുമോ എന്ന് നോക്കാം.
✅ ക്ലസ്റ്ററിംഗിന്റെ ഉപയോഗങ്ങളെ കുറിച്ച് ഒരു മിനിറ്റ് ചിന്തിക്കുക. യാഥാർത്ഥ്യത്തിൽ, നിങ്ങൾക്ക് വസ്ത്രങ്ങൾ തൊട്ടു തരംതിരിക്കേണ്ടി വന്നപ്പോൾ ക്ലസ്റ്ററിംഗ് സംഭവിക്കുന്നു 🧦👕👖🩲. ഡാറ്റാ സയൻസിൽ, ഉപയോക്താവിന്റെ ഇഷ്ടങ്ങൾ വിശകലനം ചെയ്യുമ്പോഴും, ലേബൽ ചെയ്യപ്പെടാത്ത ഡാറ്റാസെറ്റിന്റെ സവിശേഷതകൾ നിർണയിക്കുമ്പോഴും ക്ലസ്റ്ററിംഗ് സംഭവിക്കുന്നു. ക്ലസ്റ്ററിംഗ് ഒരു വിധത്തിൽ അഴുക്കും കലക്കവും മനസ്സിലാക്കാൻ സഹായിക്കുന്നു, ഒരു സോക്ക് ഡ്രോയർ പോലെ.
[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering")
> 🎥 മുകളിൽ കാണുന്ന ചിത്രത്തിൽ ക്ലിക്ക് ചെയ്ത് ഒരു വീഡിയോ കാണുക: MIT-യുടെ ജോൺ ഗുട്ടാഗ് ക്ലസ്റ്ററിംഗ് പരിചയപ്പെടുത്തുന്നു
പ്രൊഫഷണൽ സാഹചര്യത്തിൽ, ക്ലസ്റ്ററിംഗ് മാർക്കറ്റ് സെഗ്മെന്റേഷൻ, ഉദാഹരണത്തിന് ഏത് പ്രായസംഘം ഏത് വസ്തുക്കൾ വാങ്ങുന്നു എന്നത് നിർണയിക്കാൻ ഉപയോഗിക്കാം. മറ്റൊരു ഉപയോഗം അനോമലി ഡിറ്റക്ഷൻ ആയിരിക്കും, ഉദാഹരണത്തിന് ക്രെഡിറ്റ് കാർഡ് ഇടപാടുകളുടെ ഡാറ്റാസെറ്റിൽ നിന്ന് തട്ടിപ്പ് കണ്ടെത്താൻ. അല്ലെങ്കിൽ മെഡിക്കൽ സ്കാനുകളുടെ ബാച്ചിൽ ട്യൂമറുകൾ കണ്ടെത്താൻ ക്ലസ്റ്ററിംഗ് ഉപയോഗിക്കാം.
✅ ബാങ്കിംഗ്, ഇ-കൊമേഴ്സ്, ബിസിനസ് മേഖലകളിൽ നിങ്ങൾ എങ്ങനെ ക്ലസ്റ്ററിംഗ് നേരിട്ടു കാണാമെന്ന് ഒരു മിനിറ്റ് ചിന്തിക്കുക.
> 🎓 രസകരമായി, ക്ലസ്റ്റർ വിശകലനം 1930-കളിൽ ആൻത്രോപോളജി, സൈക്കോളജി മേഖലകളിൽ ആരംഭിച്ചു. ഇത് എങ്ങനെ ഉപയോഗിച്ചിരിക്കാമെന്ന് നിങ്ങൾക്ക് കണക്കാക്കാമോ?
അല്ലെങ്കിൽ, തിരയൽ ഫലങ്ങൾ ഗ്രൂപ്പുചെയ്യാൻ ഉപയോഗിക്കാം - ഷോപ്പിംഗ് ലിങ്കുകൾ, ചിത്രങ്ങൾ, റിവ്യൂകൾ എന്നിവയുടെ അടിസ്ഥാനത്തിൽ. വലിയ ഡാറ്റാസെറ്റുകൾ കുറയ്ക്കാനും കൂടുതൽ സൂക്ഷ്മമായ വിശകലനം നടത്താനും ക്ലസ്റ്ററിംഗ് സഹായിക്കുന്നു, അതിനാൽ മറ്റ് മോഡലുകൾ നിർമ്മിക്കുന്നതിന് മുമ്പ് ഡാറ്റയെ കുറിച്ച് പഠിക്കാൻ ഈ സാങ്കേതിക വിദ്യ ഉപയോഗിക്കാം.
✅ നിങ്ങളുടെ ഡാറ്റ ക്ലസ്റ്ററുകളായി ക്രമീകരിച്ച ശേഷം, അതിന് ക്ലസ്റ്റർ ഐഡി നൽകുന്നു, ഇത് ഡാറ്റാസെറ്റിന്റെ സ്വകാര്യത സംരക്ഷിക്കാൻ സഹായകമാണ്; ഒരു ഡാറ്റാ പോയിന്റിനെ കൂടുതൽ വെളിപ്പെടുത്തുന്ന തിരിച്ചറിയൽ ഡാറ്റയിലൂടെ അല്ല, ക്ലസ്റ്റർ ഐഡി ഉപയോഗിച്ച് സൂചിപ്പിക്കാം. ക്ലസ്റ്റർ ഐഡി ഉപയോഗിക്കുന്നതിന് മറ്റെന്തെങ്കിലും കാരണങ്ങൾ നിങ്ങൾക്ക് തോന്നുന്നുണ്ടോ?
ക്ലസ്റ്ററിംഗ് സാങ്കേതിക വിദ്യകളെ കുറിച്ച് കൂടുതൽ അറിയാൻ ഈ [Learn module](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) കാണുക
## ക്ലസ്റ്ററിംഗ് ആരംഭിക്കുന്നത്
[Scikit-learn വലിയൊരു ശ്രേണി](https://scikit-learn.org/stable/modules/clustering.html) ക്ലസ്റ്ററിംഗ് നടത്താനുള്ള രീതികൾ നൽകുന്നു. നിങ്ങൾ തിരഞ്ഞെടുക്കുന്ന തരം നിങ്ങളുടെ ഉപയോഗ കേസിനനുസരിച്ചിരിക്കും. ഡോക്യുമെന്റേഷനുസരിച്ച്, ഓരോ രീതിക്കും വിവിധ ഗുണങ്ങൾ ഉണ്ട്. Scikit-learn പിന്തുണക്കുന്ന രീതികളും അവയുടെ അനുയോജ്യമായ ഉപയോഗ കേസുകളും താഴെ ലളിതമായി കൊടുത്തിരിക്കുന്നു:
| രീതി നാമം | ഉപയോഗ കേസ് |
| :--------------------------- | :----------------------------------------------------------------- |
| K-Means | പൊതുവായ ഉപയോഗം, ഇൻഡക്ടീവ് |
| Affinity propagation | നിരവധി, അസമതുല്യ ക്ലസ്റ്ററുകൾ, ഇൻഡക്ടീവ് |
| Mean-shift | നിരവധി, അസമതുല്യ ക്ലസ്റ്ററുകൾ, ഇൻഡക്ടീവ് |
| Spectral clustering | കുറച്ച്, സമതുല്യ ക്ലസ്റ്ററുകൾ, ട്രാൻസ്ഡക്ടീവ് |
| Ward hierarchical clustering | നിരവധി, നിയന്ത്രിത ക്ലസ്റ്ററുകൾ, ട്രാൻസ്ഡക്ടീവ് |
| Agglomerative clustering | നിരവധി, നിയന്ത്രിത, നോൺ യൂക്ലിഡിയൻ ദൂരം, ട്രാൻസ്ഡക്ടീവ് |
| DBSCAN | നോൺ-ഫ്ലാറ്റ് ജ്യാമിതീയ, അസമതുല്യ ക്ലസ്റ്ററുകൾ, ട്രാൻസ്ഡക്ടീവ് |
| OPTICS | നോൺ-ഫ്ലാറ്റ് ജ്യാമിതീയ, വ്യത്യസ്ത സാന്ദ്രതയുള്ള അസമതുല്യ ക്ലസ്റ്ററുകൾ, ട്രാൻസ്ഡക്ടീവ് |
| Gaussian mixtures | ഫ്ലാറ്റ് ജ്യാമിതീയ, ഇൻഡക്ടീവ് |
| BIRCH | വലിയ ഡാറ്റാസെറ്റ് ഔട്ട്‌ലൈയർമാരോടുകൂടി, ഇൻഡക്ടീവ് |
> 🎓 ക്ലസ്റ്ററുകൾ സൃഷ്ടിക്കുന്ന വിധം, ഡാറ്റാ പോയിന്റുകൾ ഗ്രൂപ്പുകളായി എങ്ങനെ കൂട്ടിച്ചേർക്കുന്നു എന്നതുമായി ബന്ധപ്പെട്ടതാണ്. ചില പദങ്ങൾ വിശദീകരിക്കാം:
>
> 🎓 ['Transductive' vs. 'inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning))
>
> ട്രാൻസ്ഡക്ടീവ് ഇൻഫറൻസ് നിരീക്ഷിച്ച പരിശീലന കേസുകളിൽ നിന്നാണ് ഉത്ഭവിക്കുന്നത്, അവ പ്രത്യേക ടെസ്റ്റ് കേസുകളുമായി പൊരുത്തപ്പെടുന്നു. ഇൻഡക്ടീവ് ഇൻഫറൻസ് പരിശീലന കേസുകളിൽ നിന്നാണ് ഉത്ഭവിക്കുന്നത്, അവ പൊതുവായ നിയമങ്ങളിലേക്ക് മാപ്പ് ചെയ്യപ്പെടുന്നു, പിന്നീട് ആ നിയമങ്ങൾ ടെസ്റ്റ് കേസുകളിൽ പ്രയോഗിക്കുന്നു.
>
> ഉദാഹരണം: നിങ്ങൾക്ക് ഭാഗികമായി മാത്രം ലേബൽ ചെയ്ത ഡാറ്റാസെറ്റ് ഉണ്ടെന്ന് കരുതുക. ചിലത് 'റെക്കോർഡുകൾ', ചിലത് 'സിഡികൾ', ചിലത് ശൂന്യമാണ്. ശൂന്യമായവയ്ക്ക് ലേബലുകൾ നൽകുക എന്നതാണ് നിങ്ങളുടെ ജോലി. ഇൻഡക്ടീവ് സമീപനം തിരഞ്ഞെടുക്കുകയാണെങ്കിൽ, 'റെക്കോർഡുകൾ'യും 'സിഡികളും' കണ്ടെത്താൻ മോഡൽ പരിശീലിപ്പിച്ച് ആ ലേബലുകൾ ലേബൽ ചെയ്യപ്പെടാത്ത ഡാറ്റയിൽ പ്രയോഗിക്കും. ഈ സമീപനം 'കാസറ്റുകൾ' എന്നതിനെ ശരിയായി തിരിച്ചറിയാൻ ബുദ്ധിമുട്ടും. മറുവശത്ത്, ട്രാൻസ്ഡക്ടീവ് സമീപനം ഈ അജ്ഞാത ഡാറ്റയെ കൂടുതൽ ഫലപ്രദമായി കൈകാര്യം ചെയ്യുന്നു, സമാനമായ വസ്തുക്കൾ ഗ്രൂപ്പുചെയ്യുകയും ഗ്രൂപ്പിന് ലേബൽ നൽകുകയും ചെയ്യുന്നു. ഈ സാഹചര്യത്തിൽ, ക്ലസ്റ്ററുകൾ 'വൃത്താകൃതിയിലുള്ള സംഗീത വസ്തുക്കൾ'യും 'ചതുരാകൃതിയിലുള്ള സംഗീത വസ്തുക്കൾ'യും പ്രതിഫലിപ്പിക്കാം.
>
> 🎓 ['Non-flat' vs. 'flat' geometry](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)
>
> ഗണിതശാസ്ത്ര പദങ്ങൾ നിന്നാണ് നോൺ-ഫ്ലാറ്റ് vs. ഫ്ലാറ്റ് ജ്യാമിതീയ എന്നത് ഉത്ഭവിച്ചത്, ഇത് പോയിന്റുകൾ തമ്മിലുള്ള ദൂരം 'ഫ്ലാറ്റ്' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) അല്ലെങ്കിൽ 'നോൺ-ഫ്ലാറ്റ്' (നോൺ-യൂക്ലിഡിയൻ) ജ്യാമിതീയ രീതികളിൽ അളക്കുന്നതിനെ സൂചിപ്പിക്കുന്നു.
>
> ഈ സന്ദർഭത്തിൽ 'ഫ്ലാറ്റ്' യൂക്ലിഡിയൻ ജ്യാമിതീയത്തെയാണ് സൂചിപ്പിക്കുന്നത് (ഇതിന്റെ ഭാഗങ്ങൾ 'പ്ലെയിൻ' ജ്യാമിതീയമായി പഠിപ്പിക്കുന്നു), നോൺ-ഫ്ലാറ്റ് നോൺ-യൂക്ലിഡിയൻ ജ്യാമിതീയമാണ്. മെഷീൻ ലേണിംഗുമായി ജ്യാമിതീയത്തിന് എന്ത് ബന്ധമുണ്ട്? ഗണിതശാസ്ത്രത്തിൽ ആധാരമാക്കിയ രണ്ട് മേഖലകളായതിനാൽ, ക്ലസ്റ്ററുകളിലെ പോയിന്റുകൾ തമ്മിലുള്ള ദൂരം അളക്കാനുള്ള ഒരു പൊതുവായ മാർഗ്ഗം വേണം, അത് 'ഫ്ലാറ്റ്' അല്ലെങ്കിൽ 'നോൺ-ഫ്ലാറ്റ്' രീതിയിലായിരിക്കും, ഡാറ്റയുടെ സ്വഭാവം അനുസരിച്ച്. [Euclidean distances](https://wikipedia.org/wiki/Euclidean_distance) രണ്ട് പോയിന്റുകൾ തമ്മിലുള്ള രേഖാഖണ്ഡത്തിന്റെ നീളമായി അളക്കപ്പെടുന്നു. [Non-Euclidean distances](https://wikipedia.org/wiki/Non-Euclidean_geometry) ഒരു വളവിലൂടെ അളക്കപ്പെടുന്നു. നിങ്ങളുടെ ഡാറ്റ, ദൃശ്യവൽക്കരിച്ചപ്പോൾ, ഒരു സമതലത്തിൽ ഇല്ലാത്തതുപോലെ തോന്നുകയാണെങ്കിൽ, അതിനെ കൈകാര്യം ചെയ്യാൻ പ്രത്യേക ആൽഗോരിതം ഉപയോഗിക്കേണ്ടി വരും.
>
![Flat vs Nonflat Geometry Infographic](../../../../translated_images/flat-nonflat.d1c8c6e2a96110c1d57fa0b72913f6aab3c245478524d25baf7f4a18efcde224.ml.png)
> ഇൻഫോഗ്രാഫിക്: [ദാസാനി മടിപള്ളി](https://twitter.com/dasani_decoded)
>
> 🎓 ['Distances'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)
>
> ക്ലസ്റ്ററുകൾ അവരുടെ ദൂരം മാട്രിക്സ് (distance matrix) പ്രകാരം നിർവചിക്കപ്പെടുന്നു, ഉദാ: പോയിന്റുകൾ തമ്മിലുള്ള ദൂരം. ഈ ദൂരം ചില രീതികളിൽ അളക്കാം. യൂക്ലിഡിയൻ ക്ലസ്റ്ററുകൾ പോയിന്റ് മൂല്യങ്ങളുടെ ശരാശരിയാൽ നിർവചിക്കപ്പെടുന്നു, അവയ്ക്ക് 'സെൻട്രോയിഡ്' അല്ലെങ്കിൽ കേന്ദ്ര പോയിന്റ് ഉണ്ട്. ദൂരം ആ സെൻട്രോയിഡിലേക്കുള്ള ദൂരം അളക്കിയാണ്. നോൺ-യൂക്ലിഡിയൻ ദൂരം 'ക്ലസ്റ്റ്രോയിഡുകൾ' എന്നതിനെ സൂചിപ്പിക്കുന്നു, അത് മറ്റുള്ള പോയിന്റുകൾക്ക് ഏറ്റവും അടുത്തുള്ള പോയിന്റ് ആണ്. ക്ലസ്റ്റ്രോയിഡുകൾ പലവിധം നിർവചിക്കാം.
>
> 🎓 ['Constrained'](https://wikipedia.org/wiki/Constrained_clustering)
>
> [Constrained Clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) ഈ അൺസൂപ്പർവൈസ്ഡ് രീതിയിൽ 'സെമി-സൂപ്പർവൈസ്ഡ്' പഠനം പരിചയപ്പെടുത്തുന്നു. പോയിന്റുകൾ തമ്മിലുള്ള ബന്ധങ്ങൾ 'cannot link' അല്ലെങ്കിൽ 'must-link' ആയി അടയാളപ്പെടുത്തുന്നു, അതിനാൽ ഡാറ്റാസെറ്റിൽ ചില നിയമങ്ങൾ ബാധകമാക്കുന്നു.
>
> ഉദാഹരണം: ഒരു ആൽഗോരിതം ലേബൽ ചെയ്യപ്പെടാത്ത അല്ലെങ്കിൽ ഭാഗികമായി ലേബൽ ചെയ്ത ഡാറ്റാസെറ്റിൽ സ്വതന്ത്രമായി പ്രവർത്തിക്കുമ്പോൾ, അത് സൃഷ്ടിക്കുന്ന ക്ലസ്റ്ററുകൾ ഗുണമേന്മയില്ലായ്മ കാണിക്കാം. മുകളിൽ നൽകിയ ഉദാഹരണത്തിൽ, ക്ലസ്റ്ററുകൾ 'വൃത്താകൃതിയിലുള്ള സംഗീത വസ്തുക്കൾ', 'ചതുരാകൃതിയിലുള്ള സംഗീത വസ്തുക്കൾ', 'ത്രികോണാകൃതിയിലുള്ള വസ്തുക്കൾ', 'കുക്കീസ്' എന്നിങ്ങനെ ഗ്രൂപ്പാക്കാം. ചില നിയന്ത്രണങ്ങൾ ("വസ്തു പ്ലാസ്റ്റിക്കിൽ നിന്നായിരിക്കണം", "വസ്തു സംഗീതം ഉത്പാദിപ്പിക്കാൻ കഴിയണം") നൽകിയാൽ ആൽഗോരിതം മികച്ച തിരഞ്ഞെടുപ്പുകൾ നടത്താൻ സഹായിക്കും.
>
> 🎓 'Density'
>
> 'നോയിസി' ആയ ഡാറ്റ 'ഡെൻസായി' കണക്കാക്കപ്പെടുന്നു. ഓരോ ക്ലസ്റ്ററിലെയും പോയിന്റുകൾ തമ്മിലുള്ള ദൂരം പരിശോധിച്ചാൽ, അത് കൂടുതൽ അല്ലെങ്കിൽ കുറവ് ഡെൻസായിരിക്കാം, അതായത് 'കൂട്ടം' ആയിരിക്കാം, അതിനാൽ ഈ ഡാറ്റ അനുയോജ്യമായ ക്ലസ്റ്ററിംഗ് രീതിയോടെ വിശകലനം ചെയ്യേണ്ടതാണ്. [ഈ ലേഖനം](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) K-Means ക്ലസ്റ്ററിംഗ് എതിരായി HDBSCAN ആൽഗോരിതങ്ങൾ ഉപയോഗിച്ച് അസമതുല്യ ക്ലസ്റ്റർ സാന്ദ്രതയുള്ള നോയിസി ഡാറ്റാസെറ്റ് എങ്ങനെ പരിശോധിക്കാമെന്ന് കാണിക്കുന്നു.
## ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങൾ
100-ലധികം ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങൾ ഉണ്ട്, അവയുടെ ഉപയോഗം ഡാറ്റയുടെ സ്വഭാവത്തെ ആശ്രയിച്ചിരിക്കുന്നു. പ്രധാന ചിലതിനെ കുറിച്ച് ചർച്ച ചെയ്യാം:
- **ഹയർആർക്കിക്കൽ ക്ലസ്റ്ററിംഗ്**. ഒരു വസ്തു അടുത്തുള്ള മറ്റൊരു വസ്തുവിന്റെ സമീപത പ്രകാരം വർഗ്ഗീകരിക്കപ്പെടുമ്പോൾ, ക്ലസ്റ്ററുകൾ അവരുടെ അംഗങ്ങളുടെ മറ്റുള്ള വസ്തുക്കളോടുള്ള ദൂരത്തിന്റെ അടിസ്ഥാനത്തിൽ രൂപപ്പെടുന്നു. Scikit-learn-ന്റെ അഗ്ലോമറേറ്റീവ് ക്ലസ്റ്ററിംഗ് ഹയർആർക്കിക്കൽ ആണ്.
![Hierarchical clustering Infographic](../../../../translated_images/hierarchical.bf59403aa43c8c47493bfdf1cc25230f26e45f4e38a3d62e8769cd324129ac15.ml.png)
> ഇൻഫോഗ്രാഫിക്: [ദാസാനി മടിപള്ളി](https://twitter.com/dasani_decoded)
- **സെൻട്രോയിഡ് ക്ലസ്റ്ററിംഗ്**. ഈ ജനപ്രിയ ആൽഗോരിതം 'k' എന്ന ക്ലസ്റ്ററുകളുടെ എണ്ണം തിരഞ്ഞെടുക്കേണ്ടതുണ്ട്, തുടർന്ന് ആൽഗോരിതം ഒരു ക്ലസ്റ്ററിന്റെ കേന്ദ്ര പോയിന്റ് നിർണയിച്ച് ആ പോയിന്റിന്റെ ചുറ്റും ഡാറ്റാ ശേഖരിക്കുന്നു. [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) സെൻട്രോയിഡ് ക്ലസ്റ്ററിംഗിന്റെ ജനപ്രിയ പതിപ്പാണ്. കേന്ദ്രം അടുത്ത ശരാശരിയാൽ നിർണയിക്കുന്നു, അതുകൊണ്ടാണ് പേര്. ക്ലസ്റ്ററിൽ നിന്നുള്ള ചതുരശ്ര ദൂരം കുറഞ്ഞു പോകുന്നു.
![Centroid clustering Infographic](../../../../translated_images/centroid.097fde836cf6c9187d0b2033e9f94441829f9d86f4f0b1604dd4b3d1931aee34.ml.png)
> ഇൻഫോഗ്രാഫിക്: [ദാസാനി മടിപള്ളി](https://twitter.com/dasani_decoded)
- **വിതരണ അടിസ്ഥാനത്തിലുള്ള ക്ലസ്റ്ററിംഗ്**. സാംഖ്യിക മോഡലിംഗിൽ ആധാരമാക്കിയ, ഒരു ഡാറ്റാ പോയിന്റ് ഒരു ക്ലസ്റ്ററിന് പറ്റിയതായിരിക്കാനുള്ള സാധ്യത നിർണയിച്ച് അതനുസരിച്ച് അത് നിയോഗിക്കുന്നു. Gaussian മിശ്രിത രീതികൾ ഇതിൽപ്പെടുന്നു.
- **സാന്ദ്രത അടിസ്ഥാനത്തിലുള്ള ക്ലസ്റ്ററിംഗ്**. ഡാറ്റാ പോയിന്റുകൾ അവരുടെ സാന്ദ്രതയുടെ അടിസ്ഥാനത്തിൽ ക്ലസ്റ്ററുകളിലേക്ക് നിയോഗിക്കപ്പെടുന്നു, അഥവാ പരസ്പരം ചുറ്റിപ്പറ്റിയിരിക്കുന്നതിന്റെ അടിസ്ഥാനത്തിൽ. ഗ്രൂപ്പിൽ നിന്ന് ദൂരെ ഉള്ള പോയിന്റുകൾ ഔട്ട്‌ലൈയർസ് അല്ലെങ്കിൽ നോയിസ് ആയി കണക്കാക്കപ്പെടുന്നു. DBSCAN, Mean-shift, OPTICS ഈ തരത്തിലുള്ള ക്ലസ്റ്ററിംഗിൽപ്പെടുന്നു.
- **ഗ്രിഡ് അടിസ്ഥാനത്തിലുള്ള ക്ലസ്റ്ററിംഗ്**. ബഹുമാനദണ്ഡ ഡാറ്റാസെറ്റുകൾക്കായി ഒരു ഗ്രിഡ് സൃഷ്ടിച്ച് ഡാറ്റ ഗ്രിഡിന്റെ സെല്ലുകളിൽ വിഭജിച്ച് ക്ലസ്റ്ററുകൾ സൃഷ്ടിക്കുന്നു.
## അഭ്യാസം - നിങ്ങളുടെ ഡാറ്റ ക്ലസ്റ്റർ ചെയ്യുക
ക്ലസ്റ്ററിംഗ് സാങ്കേതിക വിദ്യയ്ക്ക് ശരിയായ ദൃശ്യവൽക്കരണം വളരെ സഹായകരമാണ്, അതിനാൽ നമ്മുടെ സംഗീത ഡാറ്റ ദൃശ്യവൽക്കരിച്ച് തുടങ്ങാം. ഈ അഭ്യാസം ഈ ഡാറ്റയുടെ സ്വഭാവത്തിന് ഏറ്റവും ഫലപ്രദമായി ഉപയോഗിക്കാവുന്ന ക്ലസ്റ്ററിംഗ് രീതികൾ തിരഞ്ഞെടുക്കാൻ സഹായിക്കും.
1. ഈ ഫോൾഡറിൽ ഉള്ള [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) ഫയൽ തുറക്കുക.
1. നല്ല ഡാറ്റാ ദൃശ്യവൽക്കരണത്തിനായി `Seaborn` പാക്കേജ് ഇറക്കുമതി ചെയ്യുക.
```python
!pip install seaborn
```
1. [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv) ഫയലിൽ നിന്നുള്ള പാട്ടുകളുടെ ഡാറ്റ ചേർക്കുക. പാട്ടുകളെക്കുറിച്ചുള്ള ചില ഡാറ്റയുള്ള ഒരു ഡാറ്റാഫ്രെയിം ലോഡ് ചെയ്യുക. ലൈബ്രറികൾ ഇറക്കുമതി ചെയ്ത് ഡാറ്റ പുറത്തെടുക്കാൻ തയ്യാറാകുക:
```python
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("../data/nigerian-songs.csv")
df.head()
```
ഡാറ്റയുടെ ആദ്യ കുറച്ച് വരികൾ പരിശോധിക്കുക:
| | name | album | artist | artist_top_genre | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
| --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ------------ | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- |
| 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 |
| 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 |
| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 |
| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 |
| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 |
1. ഡാറ്റാഫ്രെയിമിനെക്കുറിച്ച് ചില വിവരങ്ങൾ നേടുക, `info()` വിളിച്ച്:
```python
df.info()
```
ഔട്ട്പുട്ട് ഇങ്ങനെ കാണപ്പെടും:
```output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 530 entries, 0 to 529
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 530 non-null object
1 album 530 non-null object
2 artist 530 non-null object
3 artist_top_genre 530 non-null object
4 release_date 530 non-null int64
5 length 530 non-null int64
6 popularity 530 non-null int64
7 danceability 530 non-null float64
8 acousticness 530 non-null float64
9 energy 530 non-null float64
10 instrumentalness 530 non-null float64
11 liveness 530 non-null float64
12 loudness 530 non-null float64
13 speechiness 530 non-null float64
14 tempo 530 non-null float64
15 time_signature 530 non-null int64
dtypes: float64(8), int64(4), object(4)
memory usage: 66.4+ KB
```
1. നൾ മൂല്യങ്ങൾക്കായി ഇരട്ട പരിശോധന നടത്തുക, `isnull()` വിളിച്ച് സംഖ്യ 0 ആണെന്ന് ഉറപ്പാക്കുക:
```python
df.isnull().sum()
```
എല്ലാം ശരിയാണെന്ന് കാണുന്നു:
```output
name 0
album 0
artist 0
artist_top_genre 0
release_date 0
length 0
popularity 0
danceability 0
acousticness 0
energy 0
instrumentalness 0
liveness 0
loudness 0
speechiness 0
tempo 0
time_signature 0
dtype: int64
```
1. ഡാറ്റ വിവരണം ചെയ്യുക:
```python
df.describe()
```
| | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
| ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- |
| count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 |
| mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 |
| std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 |
| min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 |
| 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 |
| 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 |
| 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 |
| max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 |
> 🤔 നാം ലേബൽ ചെയ്ത ഡാറ്റ ആവശ്യമില്ലാത്ത ഒരു അൺസൂപ്പർവൈസ്ഡ് ക്ലസ്റ്ററിംഗ് രീതിയുമായി പ്രവർത്തിക്കുമ്പോൾ, ഈ ലേബലുകളുള്ള ഡാറ്റ കാണിക്കുന്നത് എന്തുകൊണ്ടാണ്? ഡാറ്റ എക്സ്പ്ലോറേഷൻ ഘട്ടത്തിൽ ഇവ സഹായകരമാണ്, പക്ഷേ ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങൾ പ്രവർത്തിക്കാൻ അവ ആവശ്യമായില്ല. നിങ്ങൾക്ക് കോളം തലക്കെട്ടുകൾ നീക്കം ചെയ്ത് ഡാറ്റ കോളം നമ്പറുകൾ ഉപയോഗിച്ച് കാണിക്കാം.
ഡാറ്റയുടെ പൊതുവായ മൂല്യങ്ങൾ നോക്കുക. ജനപ്രിയത 0 ആകാമെന്ന് ശ്രദ്ധിക്കുക, അതായത് റാങ്ക് ഇല്ലാത്ത പാട്ടുകൾ. അവ ഉടൻ നീക്കം ചെയ്യാം.
1. ഏറ്റവും ജനപ്രിയമായ ജാനറുകൾ കണ്ടെത്താൻ ബാർപ്ലോട്ട് ഉപയോഗിക്കുക:
```python
import seaborn as sns
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top[:5].index,y=top[:5].values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
![most popular](../../../../translated_images/popular.9c48d84b3386705f98bf44e26e9655bee9eb7c849d73be65195e37895bfedb5d.ml.png)
✅ കൂടുതൽ ടോപ്പ് മൂല്യങ്ങൾ കാണാൻ ആഗ്രഹിക്കുന്നുവെങ്കിൽ, ടോപ്പ് `[:5]` വലുതാക്കുക അല്ലെങ്കിൽ നീക്കം ചെയ്ത് എല്ലാം കാണുക.
ശ്രദ്ധിക്കുക, ടോപ്പ് ജാനർ 'Missing' എന്ന് കാണിച്ചാൽ, അത് Spotify ക്ലാസിഫൈ ചെയ്തിട്ടില്ല എന്നർത്ഥം, അതിനാൽ അത് നീക്കം ചെയ്യാം.
1. മിസ്സിംഗ് ഡാറ്റ ഫിൽട്ടർ ചെയ്ത് നീക്കം ചെയ്യുക
```python
df = df[df['artist_top_genre'] != 'Missing']
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top.index,y=top.values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
ഇപ്പോൾ ജാനറുകൾ വീണ്ടും പരിശോധിക്കുക:
![most popular](../../../../translated_images/all-genres.1d56ef06cefbfcd61183023834ed3cb891a5ee638a3ba5c924b3151bf80208d7.ml.png)
1. ഇതുവരെ, ടോപ്പ് മൂന്ന് ജാനറുകൾ ഈ ഡാറ്റാസെറ്റിൽ ഭൂരിപക്ഷം കൈവശം വയ്ക്കുന്നു. `afro dancehall`, `afropop`, `nigerian pop` എന്നിവയിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കുക, കൂടാതെ ജനപ്രിയത 0 ഉള്ളവ നീക്കം ചെയ്യുക (അർത്ഥം, ഡാറ്റാസെറ്റിൽ ജനപ്രിയതയില്ലാത്തവ, നമ്മുടെ ആവശ്യങ്ങൾക്ക് ശബ്ദം ആയി കണക്കാക്കാം):
```python
df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')]
df = df[(df['popularity'] > 0)]
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top.index,y=top.values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
1. ഡാറ്റയിൽ ശക്തമായ ബന്ധം ഉണ്ടോ എന്ന് ഒരു വേഗത്തിലുള്ള പരിശോധന നടത്തുക:
```python
corrmat = df.corr(numeric_only=True)
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True)
```
![correlations](../../../../translated_images/correlation.a9356bb798f5eea51f47185968e1ebac5c078c92fce9931e28ccf0d7fab71c2b.ml.png)
ഏകദേശം ശക്തമായ ബന്ധം `energy` ഉം `loudness` ഉം തമ്മിലാണുള്ളത്, അതും അത്ഭുതകരമല്ല, കാരണം ശബ്ദം ഉയർന്ന സംഗീതം സാധാരണയായി ഊർജ്ജസ്വലമാണ്. മറ്റുള്ള ബന്ധങ്ങൾ വളരെ ദുർബലമാണ്. ഈ ഡാറ്റയിൽ ക്ലസ്റ്ററിംഗ് ആൽഗോരിതം എന്ത് കണ്ടെത്തും എന്ന് കാണുന്നത് രസകരമായിരിക്കും.
> 🎓 ബന്ധം കാരണസംബന്ധം സൂചിപ്പിക്കുന്നില്ല! ബന്ധം തെളിവുണ്ട്, കാരണസംബന്ധം തെളിവില്ല. [ഒരു രസകരമായ വെബ്‌സൈറ്റ്](https://tylervigen.com/spurious-correlations) ഈ കാര്യത്തെ ഊന്നിപ്പറയുന്ന ദൃശ്യങ്ങൾ നൽകുന്നു.
ഈ ഡാറ്റാസെറ്റിൽ പാട്ടിന്റെ ജനപ്രിയതയും ഡാൻസബിലിറ്റിയും തമ്മിൽ ഏതെങ്കിലും ഏകീകൃതതയുണ്ടോ? ഒരു FacetGrid കാണിക്കുന്നു, ജാനറിനെ ആശ്രയിക്കാതെ ഏകീകൃതമായ വൃത്തങ്ങൾ വരുന്നു. നൈജീരിയൻ രുചികൾ ഈ ജാനറിനായി ഒരു നിശ്ചിത ഡാൻസബിലിറ്റി നിലയിൽ ഏകീകൃതമാകാമോ?
✅ വ്യത്യസ്ത ഡാറ്റാപോയിന്റുകൾ (energy, loudness, speechiness) പരീക്ഷിക്കുക, കൂടാതെ കൂടുതൽ അല്ലെങ്കിൽ വ്യത്യസ്ത സംഗീത ജാനറുകൾ പരീക്ഷിക്കുക. എന്ത് കണ്ടെത്താം? പൊതുവായ ഡാറ്റാ പോയിന്റുകളുടെ വ്യാപ്തി കാണാൻ `df.describe()` പട്ടിക നോക്കുക.
### അഭ്യാസം - ഡാറ്റ വിതരണവും
ജനപ്രിയതയുടെ അടിസ്ഥാനത്തിൽ ഈ മൂന്ന് ജാനറുകൾ ഡാൻസബിലിറ്റിയിൽ ഗണ്യമായ വ്യത്യാസമുണ്ടോ?
1. ജനപ്രിയതയും ഡാൻസബിലിറ്റിയും നൽകിയ x, y അക്ഷങ്ങളിൽ ടോപ്പ് മൂന്ന് ജാനറുകളുടെ ഡാറ്റ വിതരണവും പരിശോധിക്കുക.
```python
sns.set_theme(style="ticks")
g = sns.jointplot(
data=df,
x="popularity", y="danceability", hue="artist_top_genre",
kind="kde",
)
```
പൊതുവായ ഏകീകൃത ബിന്ദുവിന്റെ ചുറ്റും ഏകീകൃത വൃത്തങ്ങൾ കണ്ടെത്താം, പോയിന്റുകളുടെ വിതരണത്തെ കാണിക്കുന്നു.
> 🎓 ഈ ഉദാഹരണം KDE (Kernel Density Estimate) ഗ്രാഫ് ഉപയോഗിക്കുന്നു, ഇത് ഡാറ്റ തുടർച്ചയായ പ്രൊബബിലിറ്റി ഡെൻസിറ്റി വളർച്ച ഉപയോഗിച്ച് പ്രതിനിധാനം ചെയ്യുന്നു. ഇത് പല വിതരണങ്ങളുമായി പ്രവർത്തിക്കുമ്പോൾ ഡാറ്റ വ്യാഖ്യാനിക്കാൻ സഹായിക്കുന്നു.
പൊതുവായി, ഈ മൂന്ന് ജാനറുകൾ ജനപ്രിയതയിലും ഡാൻസബിലിറ്റിയിലും അല്പം സാരമായ ഏകീകരണം കാണിക്കുന്നു. ഈ അല്പം ഏകീകരിച്ച ഡാറ്റയിൽ ക്ലസ്റ്ററുകൾ കണ്ടെത്തുന്നത് ഒരു വെല്ലുവിളിയാകും:
![distribution](../../../../translated_images/distribution.9be11df42356ca958dc8e06e87865e09d77cab78f94fe4fea8a1e6796c64dc4b.ml.png)
1. ഒരു സ്കാറ്റർ പ്ലോട്ട് സൃഷ്ടിക്കുക:
```python
sns.FacetGrid(df, hue="artist_top_genre", height=5) \
.map(plt.scatter, "popularity", "danceability") \
.add_legend()
```
സമാന അക്ഷങ്ങളുള്ള സ്കാറ്റർപ്ലോട്ട് ഏകീകൃത മാതൃക കാണിക്കുന്നു
![Facetgrid](../../../../translated_images/facetgrid.9b2e65ce707eba1f983b7cdfed5d952e60f385947afa3011df6e3cc7d200eb5b.ml.png)
പൊതുവായി, ക്ലസ്റ്ററിംഗിനായി, ഡാറ്റ ക്ലസ്റ്ററുകൾ കാണിക്കാൻ സ്കാറ്റർപ്ലോട്ടുകൾ ഉപയോഗിക്കാം, അതിനാൽ ഈ തരത്തിലുള്ള ദൃശ്യീകരണം നന്നായി പഠിക്കുക വളരെ പ്രയോജനകരമാണ്. അടുത്ത പാഠത്തിൽ, ഈ ഫിൽട്ടർ ചെയ്ത ഡാറ്റ ഉപയോഗിച്ച് k-means ക്ലസ്റ്ററിംഗ് ഉപയോഗിച്ച് ഈ ഡാറ്റയിൽ താൽപ്പര്യമുള്ള രീതിയിൽ ഒത്തുചേരുന്ന ഗ്രൂപ്പുകൾ കണ്ടെത്തും.
---
## 🚀ചലഞ്ച്
അടുത്ത പാഠത്തിനായി, നിങ്ങൾ കണ്ടെത്താനും പ്രൊഡക്ഷൻ പരിസരത്തിൽ ഉപയോഗിക്കാനും കഴിയുന്ന വിവിധ ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങൾക്കുറിച്ച് ഒരു ചാർട്ട് തയ്യാറാക്കുക. ക്ലസ്റ്ററിംഗ് ഏത് തരത്തിലുള്ള പ്രശ്നങ്ങൾ പരിഹരിക്കാൻ ശ്രമിക്കുന്നു?
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങൾ പ്രയോഗിക്കുന്നതിന് മുമ്പ്, നിങ്ങളുടെ ഡാറ്റാസെറ്റിന്റെ സ്വഭാവം മനസ്സിലാക്കുന്നത് നല്ലതാണ്. ഈ വിഷയത്തിൽ കൂടുതൽ വായിക്കുക [ഇവിടെ](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)
[ഈ സഹായകമായ ലേഖനം](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) വിവിധ ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങൾ വ്യത്യസ്ത ഡാറ്റ രൂപങ്ങളിൽ എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്ന് വിശദീകരിക്കുന്നു.
## അസൈൻമെന്റ്
[ക്ലസ്റ്ററിംഗിനുള്ള മറ്റ് ദൃശ്യീകരണങ്ങൾ ഗവേഷണം ചെയ്യുക](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "589fa015a5e7d9e67bd629f7d47b53de",
"translation_date": "2025-12-19T15:04:52+00:00",
"source_file": "5-Clustering/1-Visualize/assignment.md",
"language_code": "ml"
}
-->
# ക്ലസ്റ്ററിംഗിനായി മറ്റ് ദൃശ്യവത്കരണങ്ങൾ ഗവേഷണം ചെയ്യുക
## നിർദ്ദേശങ്ങൾ
ഈ പാഠത്തിൽ, ക്ലസ്റ്ററിംഗിന് തയ്യാറെടുക്കുന്നതിനായി നിങ്ങളുടെ ഡാറ്റ പ്ലോട്ട് ചെയ്യുന്നതിന് ചില ദൃശ്യവത്കരണ സാങ്കേതികവിദ്യകളുമായി നിങ്ങൾ പ്രവർത്തിച്ചിട്ടുണ്ട്. പ്രത്യേകിച്ച് സ്കാറ്റർപ്ലോട്ടുകൾ, വസ്തുക്കളുടെ ഗ്രൂപ്പുകൾ കണ്ടെത്താൻ ഉപകാരപ്രദമാണ്. സ്കാറ്റർപ്ലോട്ടുകൾ സൃഷ്ടിക്കാൻ വ്യത്യസ്ത മാർഗങ്ങളും വ്യത്യസ്ത ലൈബ്രറികളും ഗവേഷണം ചെയ്ത് നിങ്ങളുടെ പ്രവർത്തനം ഒരു നോട്ട്‌ബുക്കിൽ രേഖപ്പെടുത്തുക. ഈ പാഠത്തിലെ ഡാറ്റ, മറ്റ് പാഠങ്ങളിലെ ഡാറ്റ, അല്ലെങ്കിൽ നിങ്ങൾ സ്വയം കണ്ടെത്തിയ ഡാറ്റ ഉപയോഗിക്കാം (എങ്കിലും, അതിന്റെ ഉറവിടം നിങ്ങളുടെ നോട്ട്‌ബുക്കിൽ ക്രെഡിറ്റ് ചെയ്യുക). സ്കാറ്റർപ്ലോട്ടുകൾ ഉപയോഗിച്ച് ചില ഡാറ്റ പ്ലോട്ട് ചെയ്ത് നിങ്ങൾ കണ്ടെത്തിയതെന്താണെന്ന് വിശദീകരിക്കുക.
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണാർത്ഥം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | -------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------- |
| | അഞ്ച് നന്നായി രേഖപ്പെടുത്തിയ സ്കാറ്റർപ്ലോട്ടുകളുള്ള ഒരു നോട്ട്‌ബുക്ക് സമർപ്പിച്ചിരിക്കുന്നു | അഞ്ച് സ്കാറ്റർപ്ലോട്ടുകളിൽ കുറവുള്ള, കുറച്ച് കുറവായി രേഖപ്പെടുത്തിയ ഒരു നോട്ട്‌ബുക്ക് സമർപ്പിച്ചിരിക്കുന്നു | അപൂർണ്ണമായ ഒരു നോട്ട്‌ബുക്ക് സമർപ്പിച്ചിരിക്കുന്നു |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, യന്ത്രം ചെയ്ത വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ വ്യാഖ്യാനക്കേടുകൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,52 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python383jvsc74a57bd0e134e05457d34029b6460cd73bbf1ed73f339b5b6d98c95be70b69eba114fe95",
"display_name": "Python 3.8.3 64-bit (conda)"
},
"coopTranslator": {
"original_hash": "40e0707e96b3e1899a912776006264f9",
"translation_date": "2025-12-19T16:50:44+00:00",
"source_file": "5-Clustering/1-Visualize/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"# സ്പോട്ടിഫൈയിൽ നിന്ന് സ്ക്രാപ്പ് ചെയ്ത നൈജീരിയൻ സംഗീതം - ഒരു വിശകലനം\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാപത്രം**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, യന്ത്രം ചെയ്ത വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T15:06:12+00:00",
"source_file": "5-Clustering/1-Visualize/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡറാണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,500 @@
{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **സ്പോട്ടിഫൈയിൽ നിന്നുള്ള നൈജീരിയൻ സംഗീതം - ഒരു വിശകലനം**\r\n",
"\r\n",
"ക്ലസ്റ്ററിംഗ് ഒരു തരത്തിലുള്ള [Unsupervised Learning](https://wikipedia.org/wiki/Unsupervised_learning) ആണ്, ഇത് ഒരു ഡാറ്റാസെറ്റ് ലേബൽ ചെയ്യപ്പെടാത്തതാണെന്ന് അല്ലെങ്കിൽ അതിന്റെ ഇൻപുട്ടുകൾ മുൻകൂട്ടി നിർവചിച്ച ഔട്ട്പുട്ടുകളുമായി പൊരുത്തപ്പെടാത്തതാണെന്ന് കരുതുന്നു. ഡാറ്റയിൽ കാണുന്ന പാറ്റേണുകൾ അനുസരിച്ച് ഗ്രൂപ്പുകൾ നൽകാൻ വിവിധ ആൽഗോരിതങ്ങൾ ഉപയോഗിച്ച് ലേബൽ ചെയ്യാത്ത ഡാറ്റ പരിശോധിക്കുന്നു.\r\n",
"\r\n",
"[**പ്രീ-ലെക്ചർ ക്വിസ്**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\r\n",
"\r\n",
"### **പരിചയം**\r\n",
"\r\n",
"[ക്ലസ്റ്ററിംഗ്](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) ഡാറ്റാ എക്സ്പ്ലോറേഷനിൽ വളരെ ഉപകാരപ്രദമാണ്. നൈജീരിയൻ പ്രേക്ഷകർ സംഗീതം എങ്ങനെ ഉപഭോഗിക്കുന്നു എന്നതിൽ ട്രെൻഡുകളും പാറ്റേണുകളും കണ്ടെത്താൻ ഇത് സഹായിക്കുമോ എന്ന് നോക്കാം.\r\n",
"\r\n",
"> ✅ ക്ലസ്റ്ററിംഗിന്റെ ഉപയോഗങ്ങളെ കുറിച്ച് ഒരു മിനിറ്റ് ചിന്തിക്കുക. യഥാർത്ഥ ജീവിതത്തിൽ, ക്ലസ്റ്ററിംഗ് നിങ്ങളുടെ കുടുംബാംഗങ്ങളുടെ വസ്ത്രങ്ങൾ വേർതിരിക്കേണ്ടി വരുന്നപ്പോൾ ഉണ്ടാകുന്നു 🧦👕👖🩲. ഡാറ്റാ സയൻസിൽ, ഉപയോക്താവിന്റെ ഇഷ്ടങ്ങൾ വിശകലനം ചെയ്യുമ്പോഴും, ലേബൽ ചെയ്യാത്ത ഡാറ്റാസെറ്റിന്റെ സവിശേഷതകൾ നിർണയിക്കുമ്പോഴും ക്ലസ്റ്ററിംഗ് നടക്കുന്നു. ക്ലസ്റ്ററിംഗ് ഒരു വിധത്തിൽ അഴുക്കും കലക്കവും മനസ്സിലാക്കാൻ സഹായിക്കുന്നു, ഒരു സോക്ക് ഡ്രോയർ പോലെയാണ്.\r\n",
"\r\n",
"പ്രൊഫഷണൽ സാഹചര്യത്തിൽ, മാർക്കറ്റ് സെഗ്മെന്റേഷൻ, ഉദാഹരണത്തിന് ഏത് പ്രായസംഘം ഏത് വസ്തുക്കൾ വാങ്ങുന്നു എന്നത് നിർണയിക്കാൻ ക്ലസ്റ്ററിംഗ് ഉപയോഗിക്കാം. മറ്റൊരു ഉപയോഗം അനോമലി ഡിറ്റക്ഷൻ ആണ്, ഉദാഹരണത്തിന് ക്രെഡിറ്റ് കാർഡ് ഇടപാടുകളുടെ ഡാറ്റാസെറ്റിൽ നിന്ന് തട്ടിപ്പ് കണ്ടെത്താൻ. അല്ലെങ്കിൽ മെഡിക്കൽ സ്കാനുകളുടെ ബാച്ചിൽ ട്യൂമറുകൾ കണ്ടെത്താൻ ക്ലസ്റ്ററിംഗ് ഉപയോഗിക്കാം.\r\n",
"\r\n",
"✅ ബാങ്കിംഗ്, ഇ-കൊമേഴ്സ്, ബിസിനസ് തുടങ്ങിയ മേഖലകളിൽ ക്ലസ്റ്ററിംഗ് 'വൈൽഡിൽ' നിങ്ങൾ എങ്ങനെ കണ്ടിട്ടുണ്ടെന്ന് ഒരു മിനിറ്റ് ചിന്തിക്കുക.\r\n",
"\r\n",
"> 🎓 രസകരമായി, ക്ലസ്റ്റർ വിശകലനം 1930-കളിൽ ആൻത്രോപോളജി, സൈക്കോളജി മേഖലകളിൽ ആരംഭിച്ചു. അത് എങ്ങനെ ഉപയോഗിച്ചിരിക്കാമെന്ന് നിങ്ങൾക്ക് കണക്കാക്കാമോ?\r\n",
"\r\n",
"അല്ലെങ്കിൽ, ഷോപ്പിംഗ് ലിങ്കുകൾ, ചിത്രങ്ങൾ, റിവ്യൂകൾ എന്നിവയുടെ അടിസ്ഥാനത്തിൽ തിരയൽ ഫലങ്ങൾ ഗ്രൂപ്പുചെയ്യാൻ ഇത് ഉപയോഗിക്കാം. വലിയ ഡാറ്റാസെറ്റുകൾ കുറയ്ക്കാനും കൂടുതൽ സൂക്ഷ്മമായ വിശകലനം നടത്താനും ക്ലസ്റ്ററിംഗ് സഹായിക്കുന്നു, അതിനാൽ മറ്റ് മോഡലുകൾ നിർമ്മിക്കുന്നതിന് മുമ്പ് ഡാറ്റയെ കുറിച്ച് പഠിക്കാൻ ഈ സാങ്കേതിക വിദ്യ ഉപയോഗിക്കാം.\r\n",
"\r\n",
"✅ ഡാറ്റ ക്ലസ്റ്ററുകളായി ക്രമീകരിച്ച ശേഷം, അതിന് ക്ലസ്റ്റർ ഐഡി നൽകുന്നു, ഇത് ഡാറ്റാസെറ്റിന്റെ സ്വകാര്യത സംരക്ഷിക്കാൻ സഹായകമാണ്; ഒരു ഡാറ്റ പോയിന്റിനെ അതിന്റെ ക്ലസ്റ്റർ ഐഡി ഉപയോഗിച്ച് സൂചിപ്പിക്കാം, കൂടുതൽ വെളിപ്പെടുത്തുന്ന തിരിച്ചറിയാവുന്ന ഡാറ്റയിലൂടെ അല്ല. ക്ലസ്റ്റർ ഐഡി ഉപയോഗിച്ച് തിരിച്ചറിയാൻ മറ്റെന്തെങ്കിലും കാരണങ്ങൾ നിങ്ങൾക്ക് തോന്നുന്നുണ്ടോ?\r\n",
"\r\n",
"### ക്ലസ്റ്ററിംഗ് ആരംഭിക്കുന്നത്\r\n",
"\r\n",
"> 🎓 ക്ലസ്റ്ററുകൾ സൃഷ്ടിക്കുന്നത് ഡാറ്റ പോയിന്റുകൾ ഗ്രൂപ്പുകളായി എങ്ങനെ കൂട്ടിച്ചേർക്കുന്നു എന്നതിൽ ആശ്രയിച്ചിരിക്കുന്നു. ചില പദങ്ങൾ വിശദീകരിക്കാം:\r\n",
">\r\n",
"> 🎓 ['Transductive' vs. 'inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning))\r\n",
">\r\n",
"> ട്രാൻസ്ഡക്ടീവ് ഇൻഫറൻസ് നിരീക്ഷിച്ച ട്രെയിനിംഗ് കേസുകളിൽ നിന്നാണ് ലഭിക്കുന്നത്, അവ പ്രത്യേക ടെസ്റ്റ് കേസുകളുമായി പൊരുത്തപ്പെടുന്നു. ഇൻഡക്ടീവ് ഇൻഫറൻസ് ട്രെയിനിംഗ് കേസുകളിൽ നിന്നാണ് ലഭിക്കുന്നത്, അവ പൊതുവായ നിയമങ്ങളായി മാറി പിന്നീട് ടെസ്റ്റ് കേസുകളിൽ പ്രയോഗിക്കപ്പെടുന്നു.\r\n",
">\r\n",
"> ഉദാഹരണം: നിങ്ങൾക്ക് ഭാഗികമായി ലേബൽ ചെയ്ത ഡാറ്റാസെറ്റ് ഉണ്ടെന്ന് കരുതുക. ചിലത് 'റെക്കോർഡുകൾ', ചിലത് 'സിഡികൾ', ചിലത് ശൂന്യമാണ്. ശൂന്യമായവയ്ക്ക് ലേബലുകൾ നൽകുക എന്നതാണ് നിങ്ങളുടെ ജോലി. ഇൻഡക്ടീവ് സമീപനം തിരഞ്ഞെടുക്കുകയാണെങ്കിൽ, 'റെക്കോർഡുകൾ'യും 'സിഡികളും' കണ്ടെത്താൻ മോഡൽ പരിശീലിപ്പിച്ച് ആ ലേബലുകൾ ലേബൽ ചെയ്യാത്ത ഡാറ്റയിൽ പ്രയോഗിക്കും. ഈ സമീപനം 'കാസറ്റുകൾ' എന്ന വസ്തുക്കൾ ശരിയായി തിരിച്ചറിയാൻ ബുദ്ധിമുട്ടും. മറുവശത്ത്, ട്രാൻസ്ഡക്ടീവ് സമീപനം ഈ അജ്ഞാത ഡാറ്റയെ കൂടുതൽ ഫലപ്രദമായി കൈകാര്യം ചെയ്യുന്നു, സമാന വസ്തുക്കളെ ഗ്രൂപ്പാക്കി അവയ്ക്ക് ലേബൽ നൽകുന്നു. ഈ സാഹചര്യത്തിൽ, ക്ലസ്റ്ററുകൾ 'വൃത്താകൃതിയിലുള്ള സംഗീത വസ്തുക്കൾ'യും 'ചതുരാകൃതിയിലുള്ള സംഗീത വസ്തുക്കൾ'യും പ്രതിഫലിപ്പിക്കാം.\r\n",
">\r\n",
"> 🎓 ['Non-flat' vs. 'flat' geometry](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\r\n",
">\r\n",
"> ഗണിതശാസ്ത്ര പദങ്ങൾ അടിസ്ഥാനമാക്കി, non-flat vs. flat ജ്യാമിതീയത പോയിന്റുകൾ തമ്മിലുള്ള ദൂരം 'ഫ്ലാറ്റ്' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) അല്ലെങ്കിൽ 'non-flat' (non-Euclidean) ജ്യാമിതീയ രീതികളിലൂടെ അളക്കുന്നതാണ്.\r\n",
">\r\n",
"> ഈ സന്ദർഭത്തിൽ 'ഫ്ലാറ്റ്' Euclidean ജ്യാമിതീയതയെ സൂചിപ്പിക്കുന്നു (ഇതിന്റെ ഭാഗങ്ങൾ 'പ്ലെയിൻ' ജ്യാമിതീയതയായി പഠിപ്പിക്കുന്നു), non-flat non-Euclidean ജ്യാമിതീയതയാണ്. ജ്യാമിതീയതയ്ക്ക് മെഷീൻ ലേണിങ്ങുമായി എന്ത് ബന്ധമുണ്ട്? ഗണിതശാസ്ത്രത്തിൽ ആധാരമാക്കിയ രണ്ട് മേഖലകളായതിനാൽ, ക്ലസ്റ്ററുകളിലെ പോയിന്റുകൾ തമ്മിലുള്ള ദൂരം അളക്കാനുള്ള പൊതുവായ മാർഗ്ഗം വേണം, അത് 'ഫ്ലാറ്റ്' അല്ലെങ്കിൽ 'non-flat' രീതിയിലായിരിക്കും, ഡാറ്റയുടെ സ്വഭാവം അനുസരിച്ച്. [Euclidean ദൂരം](https://wikipedia.org/wiki/Euclidean_distance) രണ്ട് പോയിന്റുകൾ തമ്മിലുള്ള രേഖാഖണ്ഡത്തിന്റെ നീളമായി അളക്കുന്നു. [Non-Euclidean ദൂരം](https://wikipedia.org/wiki/Non-Euclidean_geometry) വളവിലൂടെയാണ് അളക്കുന്നത്. നിങ്ങളുടെ ഡാറ്റ ദൃശ്യമായി ഒരു സമതലത്തിൽ ഇല്ലാത്തതുപോലെയാണ് തോന്നുന്നത് എങ്കിൽ, അതിനെ കൈകാര്യം ചെയ്യാൻ പ്രത്യേക ആൽഗോരിതം ഉപയോഗിക്കേണ്ടി വരും.\r\n",
"\r\n",
"<p >\r\n",
" <img src=\"../../../../../../translated_images/flat-nonflat.d1c8c6e2a96110c1d57fa0b72913f6aab3c245478524d25baf7f4a18efcde224.ml.png\"\r\n",
" width=\"600\"/>\r\n",
" <figcaption>ഇൻഫോഗ്രാഫിക്: ദാസാനി മടിപള്ളി</figcaption>\r\n",
"\r\n",
"\r\n",
"\r\n",
"> 🎓 ['Distances'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\r\n",
">\r\n",
"> ക്ലസ്റ്ററുകൾ അവരുടെ ദൂരം മാട്രിക്സ് (distance matrix) പ്രകാരം നിർവചിക്കപ്പെടുന്നു, ഉദാ: പോയിന്റുകൾ തമ്മിലുള്ള ദൂരം. ഈ ദൂരം ചില മാർഗ്ഗങ്ങളിൽ അളക്കാം. Euclidean ക്ലസ്റ്ററുകൾ പോയിന്റ് മൂല്യങ്ങളുടെ ശരാശരിയാൽ നിർവചിക്കപ്പെടുന്നു, അവയ്ക്ക് 'സെൻട്രോയിഡ്' അല്ലെങ്കിൽ കേന്ദ്ര പോയിന്റ് ഉണ്ട്. അതിനാൽ ദൂരം ആ സെൻട്രോയിഡിലേക്കുള്ള ദൂരം അളക്കിയാണ്. Non-Euclidean ദൂരം 'ക്ലസ്റ്റ്രോയിഡുകൾ' (clustroids) എന്നതിന് സൂചിപ്പിക്കുന്നു, അത് മറ്റുള്ള പോയിന്റുകൾക്ക് ഏറ്റവും അടുത്ത പോയിന്റാണ്. ക്ലസ്റ്റ്രോയിഡുകൾ വിവിധ രീതികളിൽ നിർവചിക്കാം.\r\n",
">\r\n",
"> 🎓 ['Constrained'](https://wikipedia.org/wiki/Constrained_clustering)\r\n",
">\r\n",
"> [Constrained Clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) ഈ Unsupervised രീതിയിൽ 'semi-supervised' ലേണിംഗ് പരിചയപ്പെടുത്തുന്നു. പോയിന്റുകൾ തമ്മിലുള്ള ബന്ധങ്ങൾ 'cannot link' അല്ലെങ്കിൽ 'must-link' ആയി അടയാളപ്പെടുത്തുന്നു, അതിനാൽ ഡാറ്റാസെറ്റിൽ ചില നിയമങ്ങൾ ബാധകമാക്കുന്നു.\r\n",
">\r\n",
"> ഉദാഹരണം: ഒരു ആൽഗോരിതം ലേബൽ ചെയ്യാത്ത അല്ലെങ്കിൽ ഭാഗികമായി ലേബൽ ചെയ്ത ഡാറ്റാസെറ്റിൽ സ്വതന്ത്രമായി പ്രവർത്തിക്കുമ്പോൾ, അത് ഉൽപ്പാദിപ്പിക്കുന്ന ക്ലസ്റ്ററുകൾ ഗുണമേന്മയില്ലാത്തതായിരിക്കാം. മുകളിൽ പറഞ്ഞ ഉദാഹരണത്തിൽ, ക്ലസ്റ്ററുകൾ 'വൃത്താകൃതിയിലുള്ള സംഗീത വസ്തുക്കൾ', 'ചതുരാകൃതിയിലുള്ള സംഗീത വസ്തുക്കൾ', 'ത്രികോണാകൃതിയിലുള്ള വസ്തുക്കൾ', 'കുക്കീസ്' എന്നിവയായി ഗ്രൂപ്പാക്കാം. ചില നിയന്ത്രണങ്ങൾ (\"വസ്തു പ്ലാസ്റ്റിക്കിൽ നിന്നായിരിക്കണം\", \"വസ്തു സംഗീതം ഉത്പാദിപ്പിക്കാൻ കഴിയണം\") നൽകിയാൽ ആൽഗോരിതം മികച്ച തിരഞ്ഞെടുപ്പുകൾ നടത്താൻ സഹായിക്കും.\r\n",
">\r\n",
"> 🎓 'Density'\r\n",
">\r\n",
"> 'നോയിസി' ആയ ഡാറ്റ 'ഡെൻസായി' (dense) കണക്കാക്കപ്പെടുന്നു. ഓരോ ക്ലസ്റ്ററിലെയും പോയിന്റുകൾ തമ്മിലുള്ള ദൂരം പരിശോധിച്ചാൽ അത് കൂടുതൽ അല്ലെങ്കിൽ കുറവായി ഡെൻസായിരിക്കാം, അതായത് 'കൂട്ടം' ആയിരിക്കാം, അതിനാൽ ഈ ഡാറ്റ അനുയോജ്യമായ ക്ലസ്റ്ററിംഗ് രീതിയോടെ വിശകലനം ചെയ്യേണ്ടതാണ്. [ഈ ലേഖനം](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) K-Means ക്ലസ്റ്ററിംഗ് എതിരായി HDBSCAN ആൽഗോരിതങ്ങൾ ഉപയോഗിച്ച് നോയിസി ഡാറ്റാസെറ്റിന്റെ വ്യത്യാസം വിശദീകരിക്കുന്നു.\r\n",
"\r\n",
"ഈ [Learn module](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) വഴി ക്ലസ്റ്ററിംഗ് സാങ്കേതിക വിദ്യകളെ കുറിച്ച് കൂടുതൽ പഠിക്കാം\r\n",
"\r\n",
"### **ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങൾ**\r\n",
"\r\n",
"100-ലധികം ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങൾ ഉണ്ട്, അവയുടെ ഉപയോഗം ഡാറ്റയുടെ സ്വഭാവം അനുസരിച്ചാണ്. പ്രധാന ചിലത് ചർച്ച ചെയ്യാം:\r\n",
"\r\n",
"- **ഹയർആർക്കിക്കൽ ക്ലസ്റ്ററിംഗ്**. ഒരു വസ്തു അടുത്തുള്ള മറ്റൊരു വസ്തുവിന്റെ സമീപത പ്രകാരം വർഗ്ഗീകരിക്കപ്പെടുമ്പോൾ, ക്ലസ്റ്ററുകൾ അവയുടെ അംഗങ്ങളുടെ മറ്റുള്ള വസ്തുക്കളോടുള്ള ദൂരത്തിന്റെ അടിസ്ഥാനത്തിൽ രൂപപ്പെടുന്നു. ഹയർആർക്കിക്കൽ ക്ലസ്റ്ററിംഗ് രണ്ട് ക്ലസ്റ്ററുകൾ ആവർത്തിച്ച് സംയോജിപ്പിക്കുന്നതിലൂടെ സവിശേഷതയുള്ളതാണ്.\r\n",
"\r\n",
"\r\n",
"<p >\r\n",
" <img src=\"../../../../../../translated_images/hierarchical.bf59403aa43c8c47493bfdf1cc25230f26e45f4e38a3d62e8769cd324129ac15.ml.png\"\r\n",
" width=\"600\"/>\r\n",
" <figcaption>ഇൻഫോഗ്രാഫിക്: ദാസാനി മടിപള്ളി</figcaption>\r\n",
"\r\n",
"\r\n",
"\r\n",
"- **സെൻട്രോയിഡ് ക്ലസ്റ്ററിംഗ്**. ഈ ജനപ്രിയ ആൽഗോരിതം 'k' എന്ന ക്ലസ്റ്ററുകളുടെ എണ്ണം തിരഞ്ഞെടുക്കേണ്ടതുണ്ട്, തുടർന്ന് ആൽഗോരിതം ഒരു ക്ലസ്റ്ററിന്റെ കേന്ദ്ര പോയിന്റ് നിർണയിച്ച് ആ പോയിന്റിന്റെ ചുറ്റും ഡാറ്റ ശേഖരിക്കുന്നു. [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) സെൻട്രോയിഡ് ക്ലസ്റ്ററിംഗിന്റെ ഒരു ജനപ്രിയ രൂപമാണ്, ഇത് ഡാറ്റാസെറ്റ് മുൻകൂട്ടി നിർവചിച്ച K ഗ്രൂപ്പുകളായി വിഭജിക്കുന്നു. കേന്ദ്രം അടുത്ത ശരാശരിയാൽ നിർണയിക്കുന്നു, അതിനാൽ പേര്. ക്ലസ്റ്ററിൽ നിന്നുള്ള ചതുരശ്ര ദൂരം കുറഞ്ഞിരിക്കുന്നു.\r\n",
"\r\n",
"<p >\r\n",
" <img src=\"../../../../../../translated_images/centroid.097fde836cf6c9187d0b2033e9f94441829f9d86f4f0b1604dd4b3d1931aee34.ml.png\"\r\n",
" width=\"600\"/>\r\n",
" <figcaption>ഇൻഫോഗ്രാഫിക്: ദാസാനി മടിപള്ളി</figcaption>\r\n",
"\r\n",
"\r\n",
"\r\n",
"- **ഡിസ്ട്രിബ്യൂഷൻ അടിസ്ഥാനമാക്കിയുള്ള ക്ലസ്റ്ററിംഗ്**. സാങ്കേതിക മോഡലിംഗിൽ ആധാരമാക്കിയ, ഒരു ഡാറ്റ പോയിന്റ് ഒരു ക്ലസ്റ്ററിന് പറ്റിയതാണെന്ന് സാധ്യത നിർണയിച്ച് അതനുസരിച്ച് നിയോഗിക്കുന്നു. Gaussian മിശ്രിത രീതികൾ ഇതിൽപ്പെടുന്നു.\r\n",
"\r\n",
"- **ഡെൻസിറ്റി അടിസ്ഥാനമാക്കിയുള്ള ക്ലസ്റ്ററിംഗ്**. ഡാറ്റ പോയിന്റുകൾ അവരുടെ സാന്ദ്രതയുടെ അടിസ്ഥാനത്തിൽ ക്ലസ്റ്ററുകളിലേക്ക് നിയോഗിക്കപ്പെടുന്നു, അഥവാ പരസ്പരം ചുറ്റിപ്പറ്റിയ ഗ്രൂപ്പുകൾ. ഗ്രൂപ്പിൽ നിന്ന് ദൂരെയുള്ള പോയിന്റുകൾ ഔട്ട്‌ലയർസ് അല്ലെങ്കിൽ നോയിസായി കണക്കാക്കപ്പെടുന്നു. DBSCAN, Mean-shift, OPTICS ഇതിൽപ്പെടുന്നു.\r\n",
"\r\n",
"- **ഗ്രിഡ് അടിസ്ഥാനമാക്കിയുള്ള ക്ലസ്റ്ററിംഗ്**. ബഹുമാനദണ്ഡ ഡാറ്റാസെറ്റുകൾക്കായി ഒരു ഗ്രിഡ് സൃഷ്ടിച്ച് ഡാറ്റ ഗ്രിഡിന്റെ സെല്ലുകളിൽ വിഭജിച്ച് ക്ലസ്റ്ററുകൾ സൃഷ്ടിക്കുന്നു.\r\n",
"\r\n",
"ക്ലസ്റ്ററിംഗ് പഠിക്കാൻ ഏറ്റവും നല്ല മാർഗ്ഗം അത് സ്വയം പരീക്ഷിക്കുകയാണ്, അതിനാൽ ഈ അഭ്യാസത്തിൽ നിങ്ങൾ അത് ചെയ്യും.\r\n",
"\r\n",
"ഈ മോഡ്യൂൾ പൂർത്തിയാക്കാൻ ചില പാക്കേജുകൾ ആവശ്യമാണ്. നിങ്ങൾക്ക് അവ ഇൻസ്റ്റാൾ ചെയ്യാം: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\r\n",
"\r\n",
"മറ്റൊരു മാർഗ്ഗം, താഴെ കൊടുത്തിരിക്കുന്ന സ്ക്രിപ്റ്റ് ഈ മോഡ്യൂൾ പൂർത്തിയാക്കാൻ ആവശ്യമായ പാക്കേജുകൾ നിങ്ങൾക്കുണ്ടോ എന്ന് പരിശോധിച്ച് കുറവുണ്ടെങ്കിൽ ഇൻസ്റ്റാൾ ചെയ്യും.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork')\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## Exercise - cluster your data\n",
"\n",
"ക്ലസ്റ്ററിംഗ് എന്ന സാങ്കേതിക വിദ്യ ശരിയായ ദൃശ്യവത്കരണത്തിലൂടെ വളരെ സഹായകരമാണ്, അതിനാൽ നമുക്ക് നമ്മുടെ സംഗീത ഡാറ്റ ദൃശ്യവത്കരിച്ച് തുടങ്ങാം. ഈ അഭ്യാസം ഈ ഡാറ്റയുടെ സ്വഭാവത്തിന് ഏറ്റവും ഫലപ്രദമായി ഉപയോഗിക്കേണ്ട ക്ലസ്റ്ററിംഗ് രീതികൾ നമുക്ക് തീരുമാനിക്കാൻ സഹായിക്കും.\n",
"\n",
"ഡാറ്റ ഇറക്കുമതി ചെയ്ത് നമുക്ക് തുടക്കം കുറിക്കാം.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core tidyverse and make it available in your current R session\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# Import the data into a tibble\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\")\r\n",
"\r\n",
"# View the first 5 rows of the data set\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"കഴിഞ്ഞപ്പോൾ, നമ്മുടെ ഡാറ്റയിൽ കുറച്ച് കൂടുതൽ വിവരങ്ങൾ അറിയാൻ ആഗ്രഹിക്കാം. [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) ഫംഗ്ഷൻ ഉപയോഗിച്ച് `data`യും `അതിന്റേതായ ഘടന`യും നോക്കാം:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Glimpse into the data set\r\n",
"df %>% \r\n",
" glimpse()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"നല്ല ജോലി!💪\n",
"\n",
"`glimpse()` നിങ്ങൾക്ക് മൊത്തം വരികളുടെ എണ്ണം (പരീക്ഷണങ്ങൾ)യും കോളങ്ങളുടെയും (ചരങ്ങൾ) എണ്ണം നൽകും, തുടർന്ന് ഓരോ ചരത്തിന്റെ പേരിന് ശേഷം ഒരു വരിയിൽ ഓരോ ചരത്തിന്റെ ആദ്യ കുറച്ച് എൻട്രികളും കാണിക്കും. കൂടാതെ, ഓരോ ചരത്തിന്റെ പേരിന് ഉടനെ `< >` ഉള്ളിൽ *ഡാറ്റാ തരം* നൽകും.\n",
"\n",
"`DataExplorer::introduce()` ഈ വിവരങ്ങൾ സുതാര്യമായി സംഗ്രഹിക്കാം:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe basic information for our data\r\n",
"df %>% \r\n",
" introduce()\r\n",
"\r\n",
"# A visual display of the same\r\n",
"df %>% \r\n",
" plot_intro()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"അദ്ഭുതം! നമ്മുടെ ഡാറ്റയിൽ മിസ്സിംഗ് മൂല്യങ്ങൾ ഒന്നും ഇല്ലെന്ന് നാം ഇപ്പോൾ പഠിച്ചു.\n",
"\n",
"നാം ഇതിൽ തുടരുമ്പോൾ, സാധാരണ കേന്ദ്ര പ്രവണതാ സ്ഥിതിവിവരക്കണക്കുകൾ (ഉദാ: [mean](https://en.wikipedia.org/wiki/Arithmetic_mean) and [median](https://en.wikipedia.org/wiki/Median)) കൂടാതെ വ്യതിയാനത്തിന്റെ അളവുകൾ (ഉദാ: [standard deviation](https://en.wikipedia.org/wiki/Standard_deviation)) `summarytools::descr()` ഉപയോഗിച്ച് പരിശോധിക്കാം.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe common statistics\r\n",
"df %>% \r\n",
" descr(stats = \"common\")\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"ഡാറ്റയുടെ പൊതുവായ മൂല്യങ്ങൾ നോക്കാം. പ്രശസ്തി `0` ആകാമെന്ന് ശ്രദ്ധിക്കുക, ഇത് റാങ്കിംഗ് ഇല്ലാത്ത പാട്ടുകൾ കാണിക്കുന്നു. അവ നമുക്ക് ഉടൻ നീക്കം ചെയ്യും.\n",
"\n",
"> 🤔 നാം ലേബൽ ചെയ്ത ഡാറ്റ ആവശ്യമില്ലാത്ത ഒരു അൺസൂപ്പർവൈസ്ഡ് ക്ലസ്റ്ററിംഗ് രീതിയുമായി ജോലി ചെയ്യുകയാണെങ്കിൽ, ഈ ഡാറ്റ ലേബലുകളോടുകൂടി കാണിക്കുന്നത് എന്തിന്? ഡാറ്റ എക്സ്പ്ലോറേഷൻ ഘട്ടത്തിൽ അവ സഹായകരമാണ്, പക്ഷേ ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങൾ പ്രവർത്തിക്കാൻ അവ ആവശ്യമായില്ല.\n",
"\n",
"### 1. പ്രശസ്തമായ ജാനറുകൾ അന്വേഷിക്കുക\n",
"\n",
"അവ അത് പ്രത്യക്ഷപ്പെടുന്ന സംഭവങ്ങളുടെ എണ്ണം എണ്ണിക്കൊണ്ട് ഏറ്റവും പ്രശസ്തമായ ജാനറുകൾ 🎶 കണ്ടെത്താം.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Popular genres\r\n",
"top_genres <- df %>% \r\n",
" count(artist_top_genre, sort = TRUE) %>% \r\n",
"# Encode to categorical and reorder the according to count\r\n",
" mutate(artist_top_genre = factor(artist_top_genre) %>% fct_inorder())\r\n",
"\r\n",
"# Print the top genres\r\n",
"top_genres\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"അത് നന്നായി പോയി! ഒരു ചിത്രം ഒരു ഡാറ്റാ ഫ്രെയിമിലെ ആയിരം വരികളേക്കാൾ വിലമതിക്കപ്പെടുമെന്ന് അവർ പറയുന്നു (വാസ്തവത്തിൽ ആരും അങ്ങനെ പറയാറില്ല 😅). പക്ഷേ നിങ്ങൾക്ക് അതിന്റെ ആശയം മനസിലായിട്ടുണ്ട്, അല്ലേ?\n",
"\n",
"വർഗ്ഗീയ ഡാറ്റ (ക്യാരക്ടർ അല്ലെങ്കിൽ ഫാക്ടർ വേരിയബിളുകൾ) ദൃശ്യവൽക്കരിക്കുന്ന ഒരു മാർഗം ബാർപ്ലോട്ടുകൾ ഉപയോഗിക്കുകയാണ്. മുകളിൽ 10 ജാനറുകളുടെ ബാർപ്ലോട്ട് ഉണ്ടാക്കാം:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Change the default gray theme\r\n",
"theme_set(theme_light())\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"ഇപ്പോൾ ഞങ്ങൾക്ക് `missing` ജാനറുകൾ ഉണ്ടെന്ന് തിരിച്ചറിയുന്നത് വളരെ എളുപ്പമാണ് 🧐!\n",
"\n",
"> ഒരു നല്ല ദൃശ്യവത്കരണം നിങ്ങൾ പ്രതീക്ഷിക്കാത്ത കാര്യങ്ങൾ കാണിക്കും, അല്ലെങ്കിൽ ഡാറ്റയെക്കുറിച്ച് പുതിയ ചോദ്യങ്ങൾ ഉയർത്തും - ഹാഡ്ലി വിക്ഹാം, ഗാരറ്റ് ഗ്രോളെമണ്ട്, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"ശ്രദ്ധിക്കുക, മുകളിൽ കാണുന്ന ജാനർ `Missing` എന്ന് വിവരണം നൽകിയാൽ, അതായത് Spotify അത് വർഗ്ഗീകരിച്ചിട്ടില്ല, അതിനാൽ അത് ഒഴിവാക്കാം.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" filter(artist_top_genre != \"Missing\") %>% \r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"ചെറിയ ഡാറ്റാ എക്സ്പ്ലോറേഷനിൽ നിന്ന്, ഈ ഡാറ്റാസെറ്റിൽ മുകളിൽ മൂന്ന് ജാനറുകൾ പ്രധാനം ആണെന്ന് നമുക്ക് മനസിലാകുന്നു. `afro dancehall`, `afropop`, `nigerian pop` എന്നിവയിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കാം, കൂടാതെ 0 പ്രചാരണം മൂല്യമുള്ള ഏതെങ്കിലും ഡാറ്റാ നീക്കം ചെയ്യാൻ ഫിൽട്ടർ ചെയ്യുക (അർത്ഥം, ഡാറ്റാസെറ്റിൽ പ്രചാരണം ആയി വർഗ്ഗീകരിക്കപ്പെട്ടിട്ടില്ലാത്തതും നമ്മുടെ ആവശ്യങ്ങൾക്ക് ശബ്ദമെന്നായി പരിഗണിക്കാവുന്നതും):\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"nigerian_songs <- df %>% \r\n",
" # Concentrate on top 3 genres\r\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n",
" # Remove unclassified observations\r\n",
" filter(popularity != 0)\r\n",
"\r\n",
"\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"nigerian_songs %>%\r\n",
" count(artist_top_genre) %>%\r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"നമ്മുടെ ഡാറ്റാ സെറ്റിലുള്ള സംഖ്യാത്മക ചാരങ്ങളിലൊന്നിനും വ്യക്തമായ ഒരു രേഖീയ ബന്ധമുണ്ടോ എന്ന് നോക്കാം. ഈ ബന്ധം ഗണിതപരമായി [correlation statistic](https://en.wikipedia.org/wiki/Correlation) എന്നതിലൂടെ അളക്കപ്പെടുന്നു.\n",
"\n",
"correlation statistic -1നു 1നു ഇടയിലുള്ള ഒരു മൂല്യമാണ്, ഇത് ഒരു ബന്ധത്തിന്റെ ശക്തി സൂചിപ്പിക്കുന്നു. 0-ന് മുകളിൽ ഉള്ള മൂല്യങ്ങൾ *സാന്ദ്ര* ബന്ധം സൂചിപ്പിക്കുന്നു (ഒരു ചാരത്തിന്റെ ഉയർന്ന മൂല്യങ്ങൾ മറ്റൊന്നിന്റെ ഉയർന്ന മൂല്യങ്ങളുമായി പൊരുത്തപ്പെടാൻ സാധ്യതയുണ്ട്), 0-ന് താഴെയുള്ള മൂല്യങ്ങൾ *പ്രതികൂല* ബന്ധം സൂചിപ്പിക്കുന്നു (ഒരു ചാരത്തിന്റെ ഉയർന്ന മൂല്യങ്ങൾ മറ്റൊന്നിന്റെ താഴ്ന്ന മൂല്യങ്ങളുമായി പൊരുത്തപ്പെടാൻ സാധ്യതയുണ്ട്).\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Narrow down to numeric variables and fid correlation\r\n",
"corr_mat <- nigerian_songs %>% \r\n",
" select(where(is.numeric)) %>% \r\n",
" cor()\r\n",
"\r\n",
"# Visualize correlation matrix\r\n",
"corrplot(corr_mat, order = 'AOE', col = c('white', 'black'), bg = 'gold2') \r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"ഡാറ്റ ശക്തമായി ബന്ധിപ്പിച്ചിട്ടില്ല, energy ഉം loudness ഉം തമ്മിൽ മാത്രമാണ് ശക്തമായ ബന്ധം കാണപ്പെടുന്നത്, കാരണം ശബ്ദം ഉയർന്ന സംഗീതം സാധാരണയായി വളരെ ഊർജസ്വലമാണ്. Popularity ന് release date നോടുള്ള ബന്ധം ഉണ്ട്, ഇത് കൂടി യുക്തിയുള്ളതാണ്, കാരണം പുതിയ ഗാനങ്ങൾ സാധാരണയായി കൂടുതൽ ജനപ്രിയമാണ്. Length ഉം energy ഉം തമ്മിലും ഒരു ബന്ധം കാണപ്പെടുന്നു.\n",
"\n",
"ഈ ഡാറ്റയിൽ ക്ലസ്റ്ററിംഗ് ആൽഗോരിതം എന്ത് കണ്ടെത്തും എന്ന് കാണുന്നത് രസകരമായിരിക്കും!\n",
"\n",
"> 🎓 correlation causation ന്റെ സൂചനയല്ലെന്ന് ശ്രദ്ധിക്കുക! correlation ന്റെ തെളിവ് ഉണ്ട്, causation ന്റെ തെളിവ് ഇല്ല. [amusing web site](https://tylervigen.com/spurious-correlations) ഈ കാര്യത്തെ ഊന്നിപ്പറയുന്ന ചില ദൃശ്യങ്ങൾ ഉണ്ട്.\n",
"\n",
"### 2. ഡാറ്റ വിതരണത്തെ അന്വേഷിക്കുക\n",
"\n",
"കുറച്ച് കൂടുതൽ സൂക്ഷ്മമായ ചോദ്യങ്ങൾ ചോദിക്കാം. ജനപ്രിയതയുടെ അടിസ്ഥാനത്തിൽ അവരുടെ danceability യിൽ ജാനറുകൾ ഗണ്യമായ വ്യത്യാസമുണ്ടോ? നമുക്ക് മുൻനിര മൂന്ന് ജാനറുകളുടെ ജനപ്രിയതയും danceability യും ഒരു നിശ്ചിത x, y അക്ഷങ്ങളിൽ [density plots](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves) ഉപയോഗിച്ച് പരിശോധിക്കാം.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Perform 2D kernel density estimation\r\n",
"density_estimate_2d <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre)) +\r\n",
" geom_density_2d(bins = 5, size = 1) +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" xlim(-20, 80) +\r\n",
" ylim(0, 1.2)\r\n",
"\r\n",
"# Density plot based on the popularity\r\n",
"density_estimate_pop <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" theme(legend.position = \"none\")\r\n",
"\r\n",
"# Density plot based on the danceability\r\n",
"density_estimate_dance <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = danceability, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\")\r\n",
"\r\n",
"\r\n",
"# Patch everything together\r\n",
"library(patchwork)\r\n",
"density_estimate_2d / (density_estimate_pop + density_estimate_dance)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"നാം കാണുന്നത് ജാനറിനെ ആശ്രയിക്കാതെ നിരത്തിയിരിക്കുന്ന ഏകകേന്ദ്ര വൃത്തങ്ങളാണ്. ഈ ജാനറിനായി നൈജീരിയൻ രുചികൾ നൃത്തയോഗ്യതയുടെ ഒരു നിശ്ചിത നിലയിൽ ഏകീകൃതമാകുമോ?\n",
"\n",
"സാധാരണയായി, ഈ മൂന്ന് ജാനറുകൾ അവരുടെ ജനപ്രിയതയും നൃത്തയോഗ്യതയും സംബന്ധിച്ച് ഏകീകരിച്ചിരിക്കുന്നു. ഈ അല്പം ഏകീകരിച്ച ഡാറ്റയിൽ ക്ലസ്റ്ററുകൾ കണ്ടെത്തുന്നത് ഒരു വെല്ലുവിളിയാകും. ഒരു സ്കാറ്റർ പ്ലോട്ട് ഇതിനെ പിന്തുണയ്ക്കുമോ എന്ന് നോക്കാം.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# A scatter plot of popularity and danceability\r\n",
"scatter_plot <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre, shape = artist_top_genre)) +\r\n",
" geom_point(size = 2, alpha = 0.8) +\r\n",
" paletteer::scale_color_paletteer_d(\"futurevisions::mars\")\r\n",
"\r\n",
"# Add a touch of interactivity\r\n",
"ggplotly(scatter_plot)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"അടിസ്ഥാന അക്ഷങ്ങളിലുള്ള ഒരു സ്കാറ്റർപ്ലോട്ട് സമാനമായ ഏകീകരണ മാതൃക കാണിക്കുന്നു.\n",
"\n",
"സാധാരണയായി, ക്ലസ്റ്ററിംഗിനായി, ഡാറ്റയുടെ ക്ലസ്റ്ററുകൾ കാണിക്കാൻ സ്കാറ്റർപ്ലോട്ടുകൾ ഉപയോഗിക്കാം, അതിനാൽ ഈ തരത്തിലുള്ള ദൃശ്യീകരണം നന്നായി പഠിക്കുന്നത് വളരെ പ്രയോജനകരമാണ്. അടുത്ത പാഠത്തിൽ, ഈ ഫിൽട്ടർ ചെയ്ത ഡാറ്റ ഉപയോഗിച്ച് k-മീൻസ് ക്ലസ്റ്ററിംഗ് ഉപയോഗിച്ച് ഈ ഡാറ്റയിൽ രസകരമായ രീതിയിൽ ഒതുക്കപ്പെടുന്ന ഗ്രൂപ്പുകൾ കണ്ടെത്തും.\n",
"\n",
"## **🚀 ചലഞ്ച്**\n",
"\n",
"അടുത്ത പാഠത്തിനായി തയ്യാറെടുക്കുന്നതിന്, പ്രൊഡക്ഷൻ പരിസ്ഥിതിയിൽ നിങ്ങൾ കണ്ടെത്തുകയും ഉപയോഗിക്കുകയും ചെയ്യാവുന്ന വിവിധ ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങൾക്കുറിച്ച് ഒരു ചാർട്ട് തയ്യാറാക്കുക. ക്ലസ്റ്ററിംഗ് പരിഹരിക്കാൻ ശ്രമിക്കുന്ന പ്രശ്നങ്ങൾ എന്തെല്ലാം ആണ്?\n",
"\n",
"## [**പാഠാനന്തര ക്വിസ്**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **പരിശോധന & സ്വയം പഠനം**\n",
"\n",
"ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങൾ പ്രയോഗിക്കുന്നതിന് മുമ്പ്, നാം പഠിച്ചതുപോലെ, നിങ്ങളുടെ ഡാറ്റാസെറ്റിന്റെ സ്വഭാവം മനസ്സിലാക്കുന്നത് നല്ല ആശയമാണ്. ഈ വിഷയത്തിൽ കൂടുതൽ വായിക്കുക [ഇവിടെ](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
"\n",
"ക്ലസ്റ്ററിംഗ് സാങ്കേതികവിദ്യകളുടെ അറിവ് കൂടുതൽ ആഴത്തിൽ നേടുക:\n",
"\n",
"- [Tidymodels and friends ഉപയോഗിച്ച് ക്ലസ്റ്ററിംഗ് മോഡലുകൾ പരിശീലിപ്പിക്കുകയും മൂല്യനിർണയം നടത്തുകയും ചെയ്യുക](https://rpubs.com/eR_ic/clustering)\n",
"\n",
"- ബ്രാഡ്ലി ബോഹ്മ്കെ & ബ്രാൻഡൻ ഗ്രീൻവെൽ, [*Hands-On Machine Learning with R*](https://bradleyboehmke.github.io/HOML/)*.*\n",
"\n",
"## **അസൈൻമെന്റ്**\n",
"\n",
"[ക്ലസ്റ്ററിംഗിനുള്ള മറ്റ് ദൃശ്യീകരണങ്ങൾ ഗവേഷണം ചെയ്യുക](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## നന്ദി:\n",
"\n",
"[ജെൻ ലൂപ്പർ](https://www.twitter.com/jenlooper) ഈ മോഡ്യൂളിന്റെ ഒറിജിനൽ പൈതൺ പതിപ്പ് സൃഷ്ടിച്ചതിന് ♥️\n",
"\n",
"[`ദാസാനി മടിപള്ളി`](https://twitter.com/dasani_decoded) മെഷീൻ ലേണിംഗ് ആശയങ്ങൾ കൂടുതൽ വ്യാഖ്യാനയോഗ്യവും മനസ്സിലാക്കാൻ എളുപ്പവുമാക്കുന്ന അത്ഭുതകരമായ ചിത്രീകരണങ്ങൾ സൃഷ്ടിച്ചതിന്.\n",
"\n",
"സന്തോഷകരമായ പഠനം,\n",
"\n",
"[എറിക്](https://twitter.com/ericntay), ഗോൾഡ് മൈക്രോസോഫ്റ്റ് ലേൺ സ്റ്റുഡന്റ് അംബാസഡർ.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാപത്രം**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"coopTranslator": {
"original_hash": "99c36449cad3708a435f6798cfa39972",
"translation_date": "2025-12-19T17:00:55+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 1
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,263 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "7cdd17338d9bbd7e2171c2cd462eb081",
"translation_date": "2025-12-19T14:51:43+00:00",
"source_file": "5-Clustering/2-K-Means/README.md",
"language_code": "ml"
}
-->
# K-മീൻസ് ക്ലസ്റ്ററിംഗ്
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
ഈ പാഠത്തിൽ, നിങ്ങൾ മുമ്പ് ഇറക്കുമതി ചെയ്ത നൈജീരിയൻ സംഗീത ഡാറ്റാസെറ്റ് ഉപയോഗിച്ച് Scikit-learn ഉപയോഗിച്ച് ക്ലസ്റ്ററുകൾ സൃഷ്ടിക്കുന്നത് എങ്ങനെ എന്നത് പഠിക്കും. ക്ലസ്റ്ററിംഗിനുള്ള K-മീൻസ് അടിസ്ഥാനങ്ങൾ ഞങ്ങൾ ഉൾക്കൊള്ളും. മുമ്പത്തെ പാഠത്തിൽ നിങ്ങൾ പഠിച്ചതുപോലെ, ക്ലസ്റ്ററുകളുമായി പ്രവർത്തിക്കാൻ നിരവധി മാർഗ്ഗങ്ങളുണ്ട്, നിങ്ങൾ ഉപയോഗിക്കുന്ന രീതി നിങ്ങളുടെ ഡാറ്റയെ ആശ്രയിച്ചിരിക്കും. ഏറ്റവും സാധാരണമായ ക്ലസ്റ്ററിംഗ് സാങ്കേതിക വിദ്യയായ K-മീൻസ് ഞങ്ങൾ പരീക്ഷിക്കും. തുടങ്ങാം!
നിങ്ങൾ പഠിക്കേണ്ട പദങ്ങൾ:
- സിലഹ്വെറ്റ് സ്കോറിംഗ്
- എൽബോ മെത്തഡ്
- ഇൻർഷ്യ
- വ്യത്യാസം
## പരിചയം
[K-മീൻസ് ക്ലസ്റ്ററിംഗ്](https://wikipedia.org/wiki/K-means_clustering) സിഗ്നൽ പ്രോസസ്സിംഗ് മേഖലയിലെ ഒരു രീതി ആണ്. നിരീക്ഷണങ്ങളുടെ ഒരു പരമ്പര ഉപയോഗിച്ച് ഡാറ്റാ ഗ്രൂപ്പുകൾ 'k' ക്ലസ്റ്ററുകളായി വിഭജിക്കാൻ ഇത് ഉപയോഗിക്കുന്നു. ഓരോ നിരീക്ഷണവും ഒരു ഡാറ്റാപോയിന്റിനെ അതിന്റെ അടുത്ത 'മീൻ' അല്ലെങ്കിൽ ക്ലസ്റ്ററിന്റെ കേന്ദ്രബിന്ദുവിലേക്ക് കൂട്ടിച്ചേർക്കാൻ പ്രവർത്തിക്കുന്നു.
ക്ലസ്റ്ററുകൾ [വോറോണോയി ഡയഗ്രാമുകൾ](https://wikipedia.org/wiki/Voronoi_diagram) ആയി ദൃശ്യവത്കരിക്കാം, അവയിൽ ഒരു പോയിന്റ് (അഥവാ 'സീഡ്') അതിന്റെ അനുബന്ധ പ്രദേശം ഉൾക്കൊള്ളുന്നു.
![voronoi diagram](../../../../translated_images/voronoi.1dc1613fb0439b9564615eca8df47a4bcd1ce06217e7e72325d2406ef2180795.ml.png)
> ഇൻഫോഗ്രാഫിക് [ജെൻ ലൂപ്പർ](https://twitter.com/jenlooper) tarafından
K-മീൻസ് ക്ലസ്റ്ററിംഗ് പ്രക്രിയ [മൂന്ന് ഘട്ടങ്ങളിൽ പ്രവർത്തിക്കുന്നു](https://scikit-learn.org/stable/modules/clustering.html#k-means):
1. ആൽഗോരിതം ഡാറ്റാസെറ്റിൽ നിന്ന് സാമ്പിൾ ചെയ്ത് k-എണ്ണം കേന്ദ്രബിന്ദുക്കൾ തിരഞ്ഞെടുക്കുന്നു. ഇതിന് ശേഷം ഇത് ലൂപ്പ് ചെയ്യുന്നു:
1. ഓരോ സാമ്പിളും അടുത്ത സെൻട്രോയിഡിലേക്ക് നിയോഗിക്കുന്നു.
2. മുൻ സെൻട്രോയിഡുകൾക്ക് നിയോഗിച്ച എല്ലാ സാമ്പിളുകളുടെ ശരാശരി മൂല്യം എടുത്ത് പുതിയ സെൻട്രോയിഡുകൾ സൃഷ്ടിക്കുന്നു.
3. പുതിയ സെൻട്രോയിഡുകളും പഴയ സെൻട്രോയിഡുകളും തമ്മിലുള്ള വ്യത്യാസം കണക്കാക്കി സെൻട്രോയിഡുകൾ സ്ഥിരതയുള്ളതാകുന്നത് വരെ ആവർത്തിക്കുന്നു.
K-മീൻസ് ഉപയോഗിക്കുന്നതിന്റെ ഒരു ദോഷം 'k' എന്ന സെൻട്രോയിഡുകളുടെ എണ്ണം നിശ്ചയിക്കേണ്ടതായിരിക്കുന്നു എന്നതാണ്. ഭാഗ്യവശാൽ 'എൽബോ മെത്തഡ്' 'k' നുള്ള നല്ല ആരംഭ മൂല്യം കണക്കാക്കാൻ സഹായിക്കുന്നു. നിങ്ങൾക്ക് ഇത് ഒരു നിമിഷം പരീക്ഷിക്കാം.
## മുൻകൂർ ആവശ്യകത
ഈ പാഠത്തിലെ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) ഫയലിൽ നിങ്ങൾ പ്രവർത്തിക്കും, ഇതിൽ നിങ്ങൾ കഴിഞ്ഞ പാഠത്തിൽ ചെയ്ത ഡാറ്റ ഇറക്കുമതി ചെയ്യലും പ്രാഥമിക ശുചീകരണവും ഉൾക്കൊള്ളുന്നു.
## അഭ്യാസം - തയ്യാറെടുപ്പ്
പാട്ടുകളുടെ ഡാറ്റ വീണ്ടും പരിശോധിച്ച് തുടങ്ങുക.
1. ഓരോ കോളത്തിനും `boxplot()` വിളിച്ച് ഒരു ബോക്സ്‌പ്ലോട്ട് സൃഷ്ടിക്കുക:
```python
plt.figure(figsize=(20,20), dpi=200)
plt.subplot(4,3,1)
sns.boxplot(x = 'popularity', data = df)
plt.subplot(4,3,2)
sns.boxplot(x = 'acousticness', data = df)
plt.subplot(4,3,3)
sns.boxplot(x = 'energy', data = df)
plt.subplot(4,3,4)
sns.boxplot(x = 'instrumentalness', data = df)
plt.subplot(4,3,5)
sns.boxplot(x = 'liveness', data = df)
plt.subplot(4,3,6)
sns.boxplot(x = 'loudness', data = df)
plt.subplot(4,3,7)
sns.boxplot(x = 'speechiness', data = df)
plt.subplot(4,3,8)
sns.boxplot(x = 'tempo', data = df)
plt.subplot(4,3,9)
sns.boxplot(x = 'time_signature', data = df)
plt.subplot(4,3,10)
sns.boxplot(x = 'danceability', data = df)
plt.subplot(4,3,11)
sns.boxplot(x = 'length', data = df)
plt.subplot(4,3,12)
sns.boxplot(x = 'release_date', data = df)
```
ഈ ഡാറ്റ കുറച്ച് ശബ്ദമുള്ളതാണ്: ഓരോ കോളവും ബോക്സ്‌പ്ലോട്ട് ആയി നിരീക്ഷിച്ചാൽ, ഔട്ട്‌ലൈയർമാർ കാണാം.
![outliers](../../../../translated_images/boxplots.8228c29dabd0f29227dd38624231a175f411f1d8d4d7c012cb770e00e4fdf8b6.ml.png)
ഡാറ്റാസെറ്റ് പരിശോധിച്ച് ഈ ഔട്ട്‌ലൈയർമാർ നീക്കം ചെയ്യാം, പക്ഷേ അത് ഡാറ്റ വളരെ കുറവാക്കും.
1. ഇപ്പോൾ, ക്ലസ്റ്ററിംഗ് അഭ്യാസത്തിനായി നിങ്ങൾ ഉപയോഗിക്കാനിരിക്കുന്ന കോളങ്ങൾ തിരഞ്ഞെടുക്കുക. സമാനമായ പരിധികളുള്ളവ തിരഞ്ഞെടുക്കുക, കൂടാതെ `artist_top_genre` കോളം സംഖ്യാത്മക ഡാറ്റയായി എൻകോഡ് ചെയ്യുക:
```python
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')]
y = df['artist_top_genre']
X['artist_top_genre'] = le.fit_transform(X['artist_top_genre'])
y = le.transform(y)
```
1. ഇപ്പോൾ നിങ്ങൾ എത്ര ക്ലസ്റ്ററുകൾ ലക്ഷ്യമിടണമെന്ന് തിരഞ്ഞെടുക്കണം. ഡാറ്റാസെറ്റിൽ നിന്നുള്ള 3 പാട്ട് ജാനറുകൾ ഉണ്ട് എന്ന് നിങ്ങൾ അറിയാം, അതിനാൽ 3 പരീക്ഷിക്കാം:
```python
from sklearn.cluster import KMeans
nclusters = 3
seed = 0
km = KMeans(n_clusters=nclusters, random_state=seed)
km.fit(X)
# ഓരോ ഡാറ്റാ പോയിന്റിനും ക്ലസ്റ്റർ പ്രവചിക്കുക
y_cluster_kmeans = km.predict(X)
y_cluster_kmeans
```
ഡാറ്റാഫ്രെയിമിലെ ഓരോ വരിയ്ക്കും പ്രവചിച്ച ക്ലസ്റ്ററുകൾ (0, 1, അല്ലെങ്കിൽ 2) ഉള്ള ഒരു അറേ പ്രിന്റ് ചെയ്യപ്പെടുന്നു.
1. ഈ അറേ ഉപയോഗിച്ച് 'സിലഹ്വെറ്റ് സ്കോർ' കണക്കാക്കുക:
```python
from sklearn import metrics
score = metrics.silhouette_score(X, y_cluster_kmeans)
score
```
## സിലഹ്വെറ്റ് സ്കോർ
1-നോട് അടുത്ത സിലഹ്വെറ്റ് സ്കോർ നോക്കുക. ഈ സ്കോർ -1 മുതൽ 1 വരെ വ്യത്യാസപ്പെടുന്നു, സ്കോർ 1 ആണെങ്കിൽ, ക്ലസ്റ്റർ സാന്ദ്രവും മറ്റുള്ള ക്ലസ്റ്ററുകളിൽ നിന്ന് നന്നായി വേർതിരിച്ചിട്ടുള്ളതും ആണ്. 0-നോട് അടുത്ത മൂല്യം സമീപമുള്ള ക്ലസ്റ്ററുകളുടെ തീരുമാന അതിരിനോട് വളരെ അടുത്ത സാമ്പിളുകളുള്ള ഒവർലാപ്പിംഗ് ക്ലസ്റ്ററുകളെ പ്രതിനിധീകരിക്കുന്നു. [(മൂലം)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)
നമ്മുടെ സ്കോർ **.53** ആണ്, അതായത് മധ്യത്തിൽ. ഇത് നമ്മുടെ ഡാറ്റ ഈ തരത്തിലുള്ള ക്ലസ്റ്ററിംഗിനായി പ്രത്യേകിച്ച് അനുയോജ്യമല്ലെന്ന് സൂചിപ്പിക്കുന്നു, പക്ഷേ നാം തുടരാം.
### അഭ്യാസം - മോഡൽ നിർമ്മിക്കുക
1. `KMeans` ഇറക്കുമതി ചെയ്ത് ക്ലസ്റ്ററിംഗ് പ്രക്രിയ ആരംഭിക്കുക.
```python
from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
```
ഇവിടെ ചില ഭാഗങ്ങൾ വിശദീകരിക്കേണ്ടതാണ്.
> 🎓 range: ക്ലസ്റ്ററിംഗ് പ്രക്രിയയുടെ ആവർത്തനങ്ങൾ
> 🎓 random_state: "സെൻട്രോയിഡ് ആരംഭത്തിനുള്ള റാൻഡം നമ്പർ ജനറേഷൻ നിർണ്ണയിക്കുന്നു." [മൂലം](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans)
> 🎓 WCSS: "within-cluster sums of squares" ക്ലസ്റ്ററിലെ എല്ലാ പോയിന്റുകളുടെയും സെൻട്രോയിഡിനോട് ഉള്ള ചതുരശ്ര ശരാശരി ദൂരം അളക്കുന്നു. [മൂലം](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce).
> 🎓 Inertia: K-മീൻസ് ആൽഗോരിതങ്ങൾ 'inertia' കുറയ്ക്കാൻ സെൻട്രോയിഡുകൾ തിരഞ്ഞെടുക്കാൻ ശ്രമിക്കുന്നു, "ക്ലസ്റ്ററുകൾ 얼마나 ആന്തരികമായി ഏകോപിതമാണെന്ന് അളക്കുന്ന ഒരു മാനദണ്ഡം." [മൂലം](https://scikit-learn.org/stable/modules/clustering.html). ഓരോ ആവർത്തനത്തിലും ഈ മൂല്യം wcss വേരിയബിളിൽ ചേർക്കുന്നു.
> 🎓 k-means++: [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) ൽ 'k-means++' ഓപ്റ്റിമൈസേഷൻ ഉപയോഗിക്കാം, ഇത് "സെൻട്രോയിഡുകൾ സാധാരണയായി പരസ്പരം ദൂരമുള്ളവയായി ആരംഭിക്കുന്നു, ഇത് റാൻഡം ആരംഭത്തേക്കാൾ നല്ല ഫലങ്ങൾ നൽകാൻ സാധ്യതയുണ്ട്."
### എൽബോ മെത്തഡ്
മുൻപ്, 3 പാട്ട് ജാനറുകൾ ലക്ഷ്യമിട്ടതിനാൽ 3 ക്ലസ്റ്ററുകൾ തിരഞ്ഞെടുക്കണമെന്ന് നിങ്ങൾ കരുതിയിരുന്നു. പക്ഷേ അതെല്ലാം ശരിയാണോ?
1. 'എൽബോ മെത്തഡ്' ഉപയോഗിച്ച് ഉറപ്പാക്കുക.
```python
plt.figure(figsize=(10,5))
sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red')
plt.title('Elbow')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
```
മുൻപത്തെ ഘട്ടത്തിൽ നിർമ്മിച്ച `wcss` വേരിയബിൾ ഉപയോഗിച്ച് എൽബോയിൽ 'വളവ്' എവിടെയാണ് എന്ന് കാണിക്കുന്ന ചാർട്ട് സൃഷ്ടിക്കുക, ഇത് ഏറ്റവും അനുയോജ്യമായ ക്ലസ്റ്റർ എണ്ണം സൂചിപ്പിക്കുന്നു. അത് **3** ആകാം!
![elbow method](../../../../translated_images/elbow.72676169eed744ff03677e71334a16c6b8f751e9e716e3d7f40dd7cdef674cca.ml.png)
## അഭ്യാസം - ക്ലസ്റ്ററുകൾ പ്രദർശിപ്പിക്കുക
1. വീണ്ടും പ്രക്രിയ പരീക്ഷിക്കുക, ഈ തവണ മൂന്ന് ക്ലസ്റ്ററുകൾ സജ്ജമാക്കി, ക്ലസ്റ്ററുകൾ സ്കാറ്റർപ്ലോട്ട് ആയി പ്രദർശിപ്പിക്കുക:
```python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3)
kmeans.fit(X)
labels = kmeans.predict(X)
plt.scatter(df['popularity'],df['danceability'],c = labels)
plt.xlabel('popularity')
plt.ylabel('danceability')
plt.show()
```
1. മോഡലിന്റെ കൃത്യത പരിശോധിക്കുക:
```python
labels = kmeans.labels_
correct_labels = sum(y == labels)
print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size))
print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size)))
```
ഈ മോഡലിന്റെ കൃത്യത വളരെ നല്ലതല്ല, ക്ലസ്റ്ററുകളുടെ ആകൃതി ഇതിന് കാരണം നൽകുന്നു.
![clusters](../../../../translated_images/clusters.b635354640d8e4fd4a49ef545495518e7be76172c97c13bd748f5b79f171f69a.ml.png)
ഈ ഡാറ്റ വളരെ അസമതുലിതമാണ്, correlation കുറവാണ്, കോളം മൂല്യങ്ങൾക്കിടയിൽ വ്യത്യാസം കൂടുതലാണ്, അതിനാൽ നല്ല ക്ലസ്റ്ററിംഗ് സാധ്യമല്ല. യഥാർത്ഥത്തിൽ, രൂപപ്പെടുന്ന ക്ലസ്റ്ററുകൾ മുകളിൽ നിർവചിച്ച മൂന്ന് ജാനർ വിഭാഗങ്ങൾ മൂലം ശക്തമായി സ്വാധീനിക്കപ്പെട്ടതായിരിക്കാം. അത് ഒരു പഠന പ്രക്രിയ ആയിരുന്നു!
Scikit-learn ഡോക്യുമെന്റേഷനിൽ, ഈ പോലുള്ള മോഡലുകൾക്ക്, ക്ലസ്റ്ററുകൾ നന്നായി വേർതിരിച്ചിട്ടില്ലാത്തതിനാൽ, 'വ്യത്യാസം' പ്രശ്നമുണ്ട്:
![problem models](../../../../translated_images/problems.f7fb539ccd80608e1f35c319cf5e3ad1809faa3c08537aead8018c6b5ba2e33a.ml.png)
> Scikit-learn ഇൻഫോഗ്രാഫിക്
## വ്യത്യാസം
വ്യത്യാസം "ശരാശരിയിൽ നിന്നുള്ള ചതുരശ്ര വ്യത്യാസങ്ങളുടെ ശരാശരി" ആയി നിർവചിക്കുന്നു [(മൂലം)](https://www.mathsisfun.com/data/standard-deviation.html). ഈ ക്ലസ്റ്ററിംഗ് പ്രശ്നത്തിന്റെ സാന്ദർഭ്യത്തിൽ, ഡാറ്റാസെറ്റിലെ സംഖ്യകൾ ശരാശരിയിൽ നിന്ന് വളരെ വ്യത്യാസപ്പെടുന്നു എന്നർത്ഥമാണ്.
✅ ഈ പ്രശ്നം പരിഹരിക്കാൻ നിങ്ങൾക്ക് ഉള്ള എല്ലാ മാർഗ്ഗങ്ങളെ കുറിച്ച് ചിന്തിക്കാൻ ഇത് നല്ല അവസരമാണ്. ഡാറ്റ കുറച്ച് കൂടുതൽ ക്രമീകരിക്കാമോ? വ്യത്യസ്ത കോളങ്ങൾ ഉപയോഗിക്കാമോ? വ്യത്യസ്ത ആൽഗോരിതം പരീക്ഷിക്കാമോ? സൂചന: ഡാറ്റ നോർമലൈസ് ചെയ്യാൻ [സ്കെയിലിംഗ്](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) പരീക്ഷിച്ച് മറ്റ് കോളങ്ങൾ പരീക്ഷിക്കുക.
> ഈ '[വ്യത്യാസം കാൽക്കുലേറ്റർ](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' പരീക്ഷിച്ച് ആശയം കൂടുതൽ മനസ്സിലാക്കുക.
---
## 🚀ചലഞ്ച്
ഈ നോട്ട്‌ബുക്കിൽ ചില സമയം ചെലവഴിക്കുക, പാരാമീറ്ററുകൾ ക്രമീകരിക്കുക. ഡാറ്റ കൂടുതൽ ശുചീകരിച്ച് (ഉദാഹരണത്തിന്, ഔട്ട്‌ലൈയർമാർ നീക്കംചെയ്ത്) മോഡലിന്റെ കൃത്യത മെച്ചപ്പെടുത്താൻ കഴിയുമോ? നിങ്ങൾക്ക് ചില ഡാറ്റ സാമ്പിളുകൾക്ക് കൂടുതൽ ഭാരമിടാൻ weights ഉപയോഗിക്കാം. മികച്ച ക്ലസ്റ്ററുകൾ സൃഷ്ടിക്കാൻ മറ്റെന്തെല്ലാം ചെയ്യാം?
സൂചന: നിങ്ങളുടെ ഡാറ്റ സ്കെയിൽ ചെയ്യാൻ ശ്രമിക്കുക. ഡാറ്റ കോളങ്ങൾ പരസ്പരം പരിധിയിൽ കൂടുതൽ സമാനമാക്കാൻ സ്റ്റാൻഡേർഡ് സ്കെയിലിംഗ് ചേർക്കുന്ന കോഡ് നോട്ട്‌ബുക്കിൽ കമന്റ് ചെയ്തിട്ടുണ്ട്. സിലഹ്വെറ്റ് സ്കോർ കുറയുമ്പോഴും, എൽബോ ഗ്രാഫിലെ 'കിങ്ക്' മൃദുവാകുന്നതായി കാണും. കാരണം, ഡാറ്റ സ്കെയിൽ ചെയ്യാതെ വെച്ചാൽ കുറവ് വ്യത്യാസമുള്ള ഡാറ്റ കൂടുതൽ ഭാരമിടാൻ കഴിയും. ഈ പ്രശ്നത്തെ കുറിച്ച് കൂടുതൽ വായിക്കുക [ഇവിടെ](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
[K-മീൻസ് സിമുലേറ്റർ](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/) പോലുള്ള ഒരു ടൂൾ പരിശോധിക്കുക. ഈ ടൂൾ ഉപയോഗിച്ച് സാമ്പിൾ ഡാറ്റ പോയിന്റുകൾ ദൃശ്യവത്കരിച്ച് സെൻട്രോയിഡുകൾ നിർണ്ണയിക്കാം. ഡാറ്റയുടെ റാൻഡംനസ്, ക്ലസ്റ്ററുകളുടെ എണ്ണം, സെൻട്രോയിഡുകളുടെ എണ്ണം എഡിറ്റ് ചെയ്യാം. ഇത് ഡാറ്റ എങ്ങനെ ഗ്രൂപ്പുചെയ്യാമെന്ന് മനസ്സിലാക്കാൻ സഹായിക്കുന്നുണ്ടോ?
കൂടാതെ, സ്റ്റാൻഫോർഡിന്റെ [K-മീൻസ് ഹാൻഡ്‌ഔട്ട്](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) നോക്കുക.
## അസൈൻമെന്റ്
[വ്യത്യസ്ത ക്ലസ്റ്ററിംഗ് രീതികൾ പരീക്ഷിക്കുക](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b8e17eff34ad1680eba2a5d3cf9ffc41",
"translation_date": "2025-12-19T14:54:30+00:00",
"source_file": "5-Clustering/2-K-Means/assignment.md",
"language_code": "ml"
}
-->
# വ്യത്യസ്ത ക്ലസ്റ്ററിംഗ് രീതികൾ പരീക്ഷിക്കുക
## നിർദ്ദേശങ്ങൾ
ഈ പാഠത്തിൽ നിങ്ങൾ K-Means ക്ലസ്റ്ററിംഗ് പഠിച്ചു. ചിലപ്പോൾ K-Means നിങ്ങളുടെ ഡാറ്റയ്ക്ക് അനുയോജ്യമല്ല. ഈ പാഠങ്ങളിൽ നിന്നോ മറ്റെവിടെയോ നിന്നോ (നിങ്ങളുടെ ഉറവിടം ക്രെഡിറ്റ് ചെയ്യുക) ഡാറ്റ ഉപയോഗിച്ച് ഒരു നോട്ട്‌ബുക്ക് സൃഷ്ടിച്ച് K-Means ഉപയോഗിക്കാതെ വ്യത്യസ്തമായ ഒരു ക്ലസ്റ്ററിംഗ് രീതി കാണിക്കുക. നിങ്ങൾ എന്ത് പഠിച്ചു?
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണാർത്ഥം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | --------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------- |
| | നന്നായി രേഖപ്പെടുത്തിയ ക്ലസ്റ്ററിംഗ് മോഡലോടുകൂടിയ ഒരു നോട്ട്‌ബുക്ക് സമർപ്പിച്ചിരിക്കുന്നു | നല്ല രേഖപ്പെടുത്തലില്ലാതെ അല്ലെങ്കിൽ അപൂർണ്ണമായ ഒരു നോട്ട്‌ബുക്ക് സമർപ്പിച്ചിരിക്കുന്നു | അപൂർണ്ണമായ ജോലി സമർപ്പിച്ചിരിക്കുന്നു |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

File diff suppressed because one or more lines are too long

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T15:05:37+00:00",
"source_file": "5-Clustering/2-K-Means/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡർ ആണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,642 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"colab": {
"name": "lesson_14.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"coopTranslator": {
"original_hash": "ad65fb4aad0a156b42216e4929f490fc",
"translation_date": "2025-12-19T16:55:31+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "ml"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## R ഉം Tidy ഡാറ്റ സിദ്ധാന്തങ്ങളും ഉപയോഗിച്ച് K-Means ക്ലസ്റ്ററിംഗ് അന്വേഷിക്കുക.\n",
"\n",
"### [**പ്രീ-ലെക്ചർ ക്വിസ്**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"ഈ പാഠത്തിൽ, Tidymodels പാക്കേജ് ഉൾപ്പെടെ R ഇക്കോസിസ്റ്റത്തിലെ മറ്റ് പാക്കേജുകളും (നാം അവരെ സുഹൃത്തുക്കൾ 🧑‍🤝‍🧑 എന്ന് വിളിക്കും) ഉപയോഗിച്ച് ക്ലസ്റ്ററുകൾ സൃഷ്ടിക്കുന്നതെങ്ങനെ എന്ന് നിങ്ങൾ പഠിക്കും, കൂടാതെ നിങ്ങൾ മുമ്പ് ഇറക്കുമതി ചെയ്ത നൈജീരിയൻ സംഗീത ഡാറ്റാസെറ്റും. ക്ലസ്റ്ററിംഗിനുള്ള K-Means ന്റെ അടിസ്ഥാനങ്ങൾ ഞങ്ങൾ ഉൾക്കൊള്ളും. മുമ്പത്തെ പാഠത്തിൽ നിങ്ങൾ പഠിച്ചതുപോലെ, ക്ലസ്റ്ററുകളുമായി പ്രവർത്തിക്കാൻ നിരവധി മാർഗ്ഗങ്ങളുണ്ട്, നിങ്ങൾ ഉപയോഗിക്കുന്ന രീതി നിങ്ങളുടെ ഡാറ്റയെ ആശ്രയിച്ചിരിക്കും. ഏറ്റവും സാധാരണമായ ക്ലസ്റ്ററിംഗ് സാങ്കേതികവിദ്യയായ K-Means ഞങ്ങൾ പരീക്ഷിക്കും. തുടങ്ങാം!\n",
"\n",
"നിങ്ങൾ പഠിക്കാനിരിക്കുന്ന പദങ്ങൾ:\n",
"\n",
"- സിലഹ്വറ്റ് സ്കോറിംഗ്\n",
"\n",
"- എൽബോ മെത്തഡ്\n",
"\n",
"- ഇൻർഷ്യ\n",
"\n",
"- വ്യത്യാസം\n",
"\n",
"### **പരിചയം**\n",
"\n",
"[K-Means ക്ലസ്റ്ററിംഗ്](https://wikipedia.org/wiki/K-means_clustering) സിഗ്നൽ പ്രോസസ്സിംഗ് മേഖലയിലെ ഒരു രീതി ആണ്. ഇത് ഡാറ്റയുടെ സവിശേഷതകളിലെ സമാനതകളെ അടിസ്ഥാനമാക്കി `k ക്ലസ്റ്ററുകൾ` ആയി ഡാറ്റ ഗ്രൂപ്പുകൾ വിഭജിക്കാൻ ഉപയോഗിക്കുന്നു.\n",
"\n",
"ക്ലസ്റ്ററുകൾ [Voronoi ഡയഗ്രാമുകൾ](https://wikipedia.org/wiki/Voronoi_diagram) ആയി ദൃശ്യവത്കരിക്കാം, അവയിൽ ഒരു പോയിന്റ് (അഥവാ 'സീഡ്') അതിന്റെ അനുബന്ധ പ്രദേശവും ഉൾപ്പെടുന്നു.\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/voronoi.1dc1613fb0439b9564615eca8df47a4bcd1ce06217e7e72325d2406ef2180795.ml.png\"\n",
" width=\"500\"/>\n",
" <figcaption>ജെൻ ലൂപ്പർ ഒരുക്കിയ ഇൻഫോഗ്രാഫിക്</figcaption>\n",
"\n",
"\n",
"K-Means ക്ലസ്റ്ററിംഗിന് താഴെപ്പറയുന്ന ഘട്ടങ്ങൾ ഉണ്ട്:\n",
"\n",
"1. ഡാറ്റ സയന്റിസ്റ്റ് സൃഷ്ടിക്കേണ്ട ക്ലസ്റ്ററുകളുടെ ആഗ്രഹിച്ച എണ്ണം നിർദ്ദേശിക്കുന്നു.\n",
"\n",
"2. തുടർന്ന്, ആൽഗോരിതം ഡാറ്റാസെറ്റിൽ നിന്ന് യാദൃച്ഛികമായി K നിരീക്ഷണങ്ങൾ തിരഞ്ഞെടുക്കുന്നു, അവ ക്ലസ്റ്ററുകളുടെ പ്രാരംഭ കേന്ദ്രങ്ങളായി (അഥവാ സെൻട്രോയിഡുകൾ) സേവനം ചെയ്യുന്നു.\n",
"\n",
"3. ശേഷിക്കുന്ന ഓരോ നിരീക്ഷണവും അതിന്റെ ഏറ്റവും അടുത്ത സെൻട്രോയിഡിലേക്ക് നിയോഗിക്കുന്നു.\n",
"\n",
"4. തുടർന്ന്, ഓരോ ക്ലസ്റ്ററിന്റെയും പുതിയ ശരാശരി കണക്കാക്കി സെൻട്രോയിഡ് ശരാശരിയിലേക്ക് മാറ്റുന്നു.\n",
"\n",
"5. ഇപ്പോൾ കേന്ദ്രങ്ങൾ പുനർഗണന ചെയ്തതിനുശേഷം, ഓരോ നിരീക്ഷണവും വീണ്ടും പരിശോധിച്ച് അത് മറ്റൊരു ക്ലസ്റ്ററിനോട് കൂടുതൽ അടുത്തതാണോ എന്ന് നോക്കുന്നു. അപ്ഡേറ്റുചെയ്ത ക്ലസ്റ്റർ ശരാശരികൾ ഉപയോഗിച്ച് എല്ലാ വസ്തുക്കളും വീണ്ടും നിയോഗിക്കുന്നു. ക്ലസ്റ്റർ നിയോഗവും സെൻട്രോയിഡ് അപ്ഡേറ്റും ആവർത്തിച്ച് നടത്തുന്നു, ക്ലസ്റ്റർ നിയോഗങ്ങൾ മാറാതിരിക്കാൻ (അഥവാ സമവായം നേടുമ്പോൾ) വരെ. സാധാരണയായി, ഓരോ പുതിയ ആവർത്തനവും സെൻട്രോയിഡുകളുടെ ചലനം വളരെ കുറവായപ്പോൾ ആൽഗോരിതം അവസാനിക്കുന്നു, ക്ലസ്റ്ററുകൾ സ്ഥിരമാകുന്നു.\n",
"\n",
"<div>\n",
"\n",
"> പ്രാരംഭ സെൻട്രോയിഡുകളായി ഉപയോഗിക്കുന്ന യാദൃച്ഛിക k നിരീക്ഷണങ്ങളുടെ കാരണം, ഓരോ പ്രക്രിയയും പ്രയോഗിക്കുമ്പോഴും നാം ചെറിയ വ്യത്യാസമുള്ള ഫലങ്ങൾ ലഭിക്കാം. ഈ കാരണത്താൽ, പല ആൽഗോരിതങ്ങളും പല *random starts* ഉപയോഗിച്ച് ഏറ്റവും കുറഞ്ഞ WCSS ഉള്ള ആവർത്തനം തിരഞ്ഞെടുക്കുന്നു. അതിനാൽ, *undesirable local optimum* ഒഴിവാക്കാൻ K-Means പല *nstart* മൂല്യങ്ങളോടും പ്രവർത്തിപ്പിക്കാൻ ശക്തമായി ശിപാർശ ചെയ്യുന്നു.\n",
"\n",
"</div>\n",
"\n",
"Allison Horst ന്റെ [കലാസൃഷ്ടി](https://github.com/allisonhorst/stats-illustrations) ഉപയോഗിച്ചുള്ള ഈ ചെറിയ അനിമേഷൻ ക്ലസ്റ്ററിംഗ് പ്രക്രിയ വിശദീകരിക്കുന്നു:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>@allison_horst ഒരുക്കിയ കലാസൃഷ്ടി</figcaption>\n",
"\n",
"\n",
"\n",
"ക്ലസ്റ്ററിംഗിൽ ഉയരുന്ന ഒരു അടിസ്ഥാന ചോദ്യമാണ്: നിങ്ങളുടെ ഡാറ്റ എത്ര ക്ലസ്റ്ററുകളായി വിഭജിക്കണമെന്ന് എങ്ങനെ അറിയാം? K-Means ഉപയോഗിക്കുന്നതിന്റെ ഒരു ദോഷം `k` എന്നത്, അഥവാ `സെൻട്രോയിഡുകളുടെ` എണ്ണം നിശ്ചയിക്കേണ്ടതായിരിക്കുന്നു എന്നതാണ്. ഭാഗ്യവശാൽ, `എൽബോ മെത്തഡ്` നല്ല ഒരു ആരംഭ മൂല്യം `k` കണക്കാക്കാൻ സഹായിക്കുന്നു. നിങ്ങൾക്ക് ഇത് ഉടൻ പരീക്ഷിക്കാം.\n",
"\n",
"### \n",
"\n",
"**ആവശ്യമായ മുൻപരിചയം**\n",
"\n",
"നാം [മുൻപത്തെ പാഠത്തിൽ](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) നിന്നു തുടരും, അവിടെ നാം ഡാറ്റാസെറ്റ് വിശകലനം ചെയ്തു, നിരവധി ദൃശ്യവത്കരണങ്ങൾ നടത്തി, ശ്രദ്ധേയമായ നിരീക്ഷണങ്ങൾ ഫിൽട്ടർ ചെയ്തു. അത് പരിശോധിക്കാൻ മറക്കരുത്!\n",
"\n",
"ഈ മോഡ്യൂൾ പൂർത്തിയാക്കാൻ ചില പാക്കേജുകൾ ആവശ്യമാണ്. അവ ഇങ്ങനെ ഇൻസ്റ്റാൾ ചെയ്യാം: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n",
"\n",
"അല്ലെങ്കിൽ, താഴെ കൊടുത്തിരിക്കുന്ന സ്ക്രിപ്റ്റ് ഈ മോഡ്യൂൾ പൂർത്തിയാക്കാൻ ആവശ്യമായ പാക്കേജുകൾ നിങ്ങൾക്കുണ്ടോ എന്ന് പരിശോധിച്ച്, കുറവുണ്ടെങ്കിൽ ഇൻസ്റ്റാൾ ചെയ്യും.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ah_tBi58LXyi"
},
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork')\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "7e--UCUTLXym"
},
"source": [
"നമുക്ക് ഉടൻ തന്നെ ആരംഭിക്കാം!\n",
"\n",
"## 1. ഡാറ്റയുമായി ഒരു നൃത്തം: ഏറ്റവും ജനപ്രിയമായ 3 സംഗീത ശൈലികൾക്ക് കുറയ്ക്കുക\n",
"\n",
"ഇത് മുമ്പത്തെ പാഠത്തിൽ ഞങ്ങൾ ചെയ്തതിന്റെ ഒരു സംഗ്രഹമാണ്. നമുക്ക് ചില ഡാറ്റ കഷണങ്ങളാക്കി വിശകലനം ചെയ്യാം!\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Ycamx7GGLXyn"
},
"source": [
"# Load the core tidyverse and make it available in your current R session\n",
"library(tidyverse)\n",
"\n",
"# Import the data into a tibble\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\", show_col_types = FALSE)\n",
"\n",
"# Narrow down to top 3 popular genres\n",
"nigerian_songs <- df %>% \n",
" # Concentrate on top 3 genres\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \n",
" # Remove unclassified observations\n",
" filter(popularity != 0)\n",
"\n",
"\n",
"\n",
"# Visualize popular genres using bar plots\n",
"theme_set(theme_light())\n",
"nigerian_songs %>%\n",
" count(artist_top_genre) %>%\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\n",
" fill = artist_top_genre)) +\n",
" geom_col(alpha = 0.8) +\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\n",
" ggtitle(\"Top genres\") +\n",
" theme(plot.title = element_text(hjust = 0.5))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "b5h5zmkPLXyp"
},
"source": [
"🤩 അത് നല്ലതായി പോയി!\n",
"\n",
"## 2. കൂടുതൽ ഡാറ്റ എക്സ്പ്ലോറേഷൻ.\n",
"\n",
"ഈ ഡാറ്റ എത്ര ശുദ്ധമാണ്? ബോക്സ് പ്ലോട്ടുകൾ ഉപയോഗിച്ച് ഔട്ട്‌ലൈയർമാരെ പരിശോധിക്കാം. കുറവ് ഔട്ട്‌ലൈയർമാർ ഉള്ള സംഖ്യാത്മക കോളങ്ങളിലാണ് നാം ശ്രദ്ധ കേന്ദ്രീകരിക്കുന്നത് (നിങ്ങൾക്ക് ഔട്ട്‌ലൈയർമാരെ ശുദ്ധമാക്കാനാകുമെങ്കിലും). ബോക്സ് പ്ലോട്ടുകൾ ഡാറ്റയുടെ പരിധി കാണിക്കുകയും ഏത് കോളങ്ങൾ ഉപയോഗിക്കാമെന്ന് തിരഞ്ഞെടുക്കാൻ സഹായിക്കുകയും ചെയ്യും. ശ്രദ്ധിക്കുക, ബോക്സ് പ്ലോട്ടുകൾ വ്യത്യാസം കാണിക്കുന്നില്ല, നല്ല ക്ലസ്റ്ററബിൾ ഡാറ്റയുടെ ഒരു പ്രധാന ഘടകം. കൂടുതൽ വായനയ്ക്കായി [ഈ ചർച്ച](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot) കാണുക.\n",
"\n",
"[ബോക്സ് പ്ലോട്ടുകൾ](https://en.wikipedia.org/wiki/Box_plot) സംഖ്യാത്മക ഡാറ്റയുടെ വിതരണത്തെ ഗ്രാഫിക്കൽ ആയി പ്രതിപാദിക്കാൻ ഉപയോഗിക്കുന്നു, അതിനാൽ ജനപ്രിയ സംഗീത ശൈലികളോടൊപ്പം എല്ലാ സംഖ്യാത്മക കോളങ്ങളും *തിരഞ്ഞെടുക്കുന്നതിൽ* നിന്ന് തുടങ്ങാം.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HhNreJKLLXyq"
},
"source": [
"# Select top genre column and all other numeric columns\n",
"df_numeric <- nigerian_songs %>% \n",
" select(artist_top_genre, where(is.numeric)) \n",
"\n",
"# Display the data\n",
"df_numeric %>% \n",
" slice_head(n = 5)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "uYXrwJRaLXyq"
},
"source": [
"തിരഞ്ഞെടുപ്പ് സഹായിയായ `where` ഇതിനെ എളുപ്പമാക്കുന്നത് എങ്ങനെ കാണൂ 💁? ഇത്തരത്തിലുള്ള മറ്റ് ഫംഗ്ഷനുകൾ [ഇവിടെ](https://tidyselect.r-lib.org/) പരിശോധിക്കുക.\n",
"\n",
"നാം ഓരോ സംഖ്യാത്മക സവിശേഷതയ്ക്കും ഒരു ബോക്സ്‌പ്ലോട്ട് ഉണ്ടാക്കാനിരിക്കെ ലൂപ്പുകൾ ഉപയോഗിക്കുന്നത് ഒഴിവാക്കാൻ, ഡാറ്റയെ *നീളമുള്ള* ഫോർമാറ്റിലേക്ക് പുനഃസംഘടിപ്പിക്കാം, ഇത് `facets` - ഓരോ ഉപസമൂഹവും പ്രദർശിപ്പിക്കുന്ന ഉപഗ്രാഫുകൾ - ഉപയോഗിക്കാൻ സഹായിക്കും.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "gd5bR3f8LXys"
},
"source": [
"# Pivot data from wide to long\n",
"df_numeric_long <- df_numeric %>% \n",
" pivot_longer(!artist_top_genre, names_to = \"feature_names\", values_to = \"values\") \n",
"\n",
"# Print out data\n",
"df_numeric_long %>% \n",
" slice_head(n = 15)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "-7tE1swnLXyv"
},
"source": [
"കൂടുതലായി! ഇപ്പോൾ കുറച്ച് `ggplots` സമയമാണ്! എങ്കിൽ ഏത് `geom` നാം ഉപയോഗിക്കും?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "r88bIsyuLXyy"
},
"source": [
"# Make a box plot\n",
"df_numeric_long %>% \n",
" ggplot(mapping = aes(x = feature_names, y = values, fill = feature_names)) +\n",
" geom_boxplot() +\n",
" facet_wrap(~ feature_names, ncol = 4, scales = \"free\") +\n",
" theme(legend.position = \"none\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "EYVyKIUELXyz"
},
"source": [
"Easy-gg!\n",
"\n",
"ഇപ്പോൾ നാം ഈ ഡാറ്റ കുറച്ച് ശബ്ദമുള്ളതാണെന്ന് കാണാം: ഓരോ കോളവും ബോക്സ്പ്ലോട്ടായി നിരീക്ഷിച്ചാൽ, ഔട്ട്‌ലൈയർമാർ കാണാം. നിങ്ങൾ ഡാറ്റാസെറ്റ് വഴി പോയി ഈ ഔട്ട്‌ലൈയർമാരെ നീക്കം ചെയ്യാമായിരുന്നു, പക്ഷേ അത് ഡാറ്റയെ വളരെ കുറവാക്കും.\n",
"\n",
"ഇപ്പോൾ, നമുക്ക് ക്ലസ്റ്ററിംഗ് അഭ്യാസത്തിനായി ഉപയോഗിക്കാനുള്ള കോളങ്ങൾ തിരഞ്ഞെടുക്കാം. സമാനമായ പരിധികളുള്ള സംഖ്യാത്മക കോളങ്ങൾ തിരഞ്ഞെടുക്കാം. `artist_top_genre` സംഖ്യാത്മകമായി എൻകോഡ് ചെയ്യാമായിരുന്നു, പക്ഷേ ഇപ്പോൾ അത് ഒഴിവാക്കാം.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-wkpINyZLXy0"
},
"source": [
"# Select variables with similar ranges\n",
"df_numeric_select <- df_numeric %>% \n",
" select(popularity, danceability, acousticness, loudness, energy) \n",
"\n",
"# Normalize data\n",
"# df_numeric_select <- scale(df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "D7dLzgpqLXy1"
},
"source": [
"## 3. R-ൽ k-means ക്ലസ്റ്ററിംഗ് കണക്കാക്കൽ\n",
"\n",
"നാം R-ൽ ഉൾപ്പെടുത്തിയിരിക്കുന്ന `kmeans` ഫംഗ്ഷൻ ഉപയോഗിച്ച് k-means കണക്കാക്കാം, `help(\"kmeans()\")` കാണുക. `kmeans()` ഫംഗ്ഷൻ പ്രധാനമായും എല്ലാ സംഖ്യാത്മക കോളങ്ങളുള്ള ഒരു ഡാറ്റാ ഫ്രെയിം സ്വീകരിക്കുന്നു.\n",
"\n",
"k-means ക്ലസ്റ്ററിംഗ് ഉപയോഗിക്കുമ്പോൾ ആദ്യത്തെ ഘട്ടം അവസാന പരിഹാരത്തിൽ സൃഷ്ടിക്കപ്പെടുന്ന ക്ലസ്റ്ററുകളുടെ എണ്ണം (k) നിർദ്ദേശിക്കുകയാണ്. ഡാറ്റാസെറ്റിൽ നിന്ന് നാം 3 ഗാന ശൈലികൾ വേർതിരിച്ചെടുത്തതായി അറിയാം, അതിനാൽ 3 പരീക്ഷിക്കാം:\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "uC4EQ5w7LXy5"
},
"source": [
"set.seed(2056)\n",
"# Kmeans clustering for 3 clusters\n",
"kclust <- kmeans(\n",
" df_numeric_select,\n",
" # Specify the number of clusters\n",
" centers = 3,\n",
" # How many random initial configurations\n",
" nstart = 25\n",
")\n",
"\n",
"# Display clustering object\n",
"kclust\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "hzfhscWrLXy-"
},
"source": [
"kmeans ഒബ്ജക്റ്റിൽ `help(\"kmeans()\")` ൽ നന്നായി വിശദീകരിച്ചിരിക്കുന്ന നിരവധി വിവരങ്ങൾ അടങ്ങിയിരിക്കുന്നു. ഇപ്പോൾ, ചിലതിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കാം. ഡാറ്റ 65, 110, 111 എന്ന വലുപ്പമുള്ള 3 ക്ലസ്റ്ററുകളായി ഗ്രൂപ്പുചെയ്തിട്ടുണ്ടെന്ന് കാണാം. ഔട്ട്പുട്ടിൽ 5 വ്യത്യസ്ത വേരിയബിളുകളിലായി 3 ഗ്രൂപ്പുകളുടെ ക്ലസ്റ്റർ സെന്ററുകളും (മീനുകളും) ഉൾപ്പെടുന്നു.\n",
"\n",
"ക്ലസ്റ്ററിംഗ് വെക്ടർ ഓരോ നിരീക്ഷണത്തിന്റെയും ക്ലസ്റ്റർ നിയോഗമാണ്. ക്ലസ്റ്റർ നിയോഗം മൗലിക ഡാറ്റാ സെറ്റിൽ ചേർക്കാൻ `augment` ഫംഗ്ഷൻ ഉപയോഗിക്കാം.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "0XwwpFGQLXy_"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"augment(kclust, df_numeric_select) %>% \n",
" relocate(.cluster) %>% \n",
" slice_head(n = 10)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "NXIVXXACLXzA"
},
"source": [
"Perfect, നാം ഇപ്പോൾ നമ്മുടെ ഡാറ്റാ സെറ്റ് 3 ഗ്രൂപ്പുകളായി വിഭജിച്ചു. അതിനാൽ, നമ്മുടെ ക്ലസ്റ്ററിംഗ് എത്രത്തോളം നല്ലതാണ് 🤷? നമുക്ക് `Silhouette score` നോക്കാം\n",
"\n",
"### **Silhouette score**\n",
"\n",
"[Silhouette analysis](https://en.wikipedia.org/wiki/Silhouette_(clustering)) ഉപയോഗിച്ച് ഫലമായ ക്ലസ്റ്ററുകൾ തമ്മിലുള്ള വേർതിരിവ് അളക്കാൻ കഴിയും. ഈ സ്കോർ -1 മുതൽ 1 വരെ മാറുന്നു, സ്കോർ 1-ന് അടുത്ത് ആണെങ്കിൽ, ക്ലസ്റ്റർ സാന്ദ്രവും മറ്റ് ക്ലസ്റ്ററുകളിൽ നിന്ന് നന്നായി വേർതിരിച്ചുമാണ്. 0-ന് അടുത്തുള്ള മൂല്യം ക്ലസ്റ്ററുകൾ ഒതുക്കിയിരിക്കുന്നതും, സാമ്പിളുകൾ അടുത്തുള്ള ക്ലസ്റ്ററുകളുടെ തീരുമാന അതിരിനോട് വളരെ അടുത്തുള്ളതുമാണ് സൂചിപ്പിക്കുന്നത്.[source](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n",
"\n",
"സാധാരണ silhouette രീതി വ്യത്യസ്ത *k* മൂല്യങ്ങൾക്ക് നിരീക്ഷണങ്ങളുടെ ശരാശരി silhouette കണക്കാക്കുന്നു. ഉയർന്ന ശരാശരി silhouette സ്കോർ നല്ല ക്ലസ്റ്ററിംഗ് സൂചിപ്പിക്കുന്നു.\n",
"\n",
"`silhouette` ഫംഗ്ഷൻ ക്ലസ്റ്റർ പാക്കേജിൽ ശരാശരി silhouette വീതി കണക്കാക്കാൻ ഉപയോഗിക്കുന്നു.\n",
"\n",
"> silhouette ഏതെങ്കിലും [distance](https://en.wikipedia.org/wiki/Distance \"Distance\") മെട്രിക് ഉപയോഗിച്ച് കണക്കാക്കാം, ഉദാഹരണത്തിന് [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") അല്ലെങ്കിൽ [Manhattan distance](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\") എന്നവ, ഞങ്ങൾ [മുൻപത്തെ പാഠത്തിൽ](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) ചർച്ച ചെയ്തതുപോലെ.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Jn0McL28LXzB"
},
"source": [
"# Load cluster package\n",
"library(cluster)\n",
"\n",
"# Compute average silhouette score\n",
"ss <- silhouette(kclust$cluster,\n",
" # Compute euclidean distance\n",
" dist = dist(df_numeric_select))\n",
"mean(ss[, 3])\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QyQRn97nLXzC"
},
"source": [
"നമ്മുടെ സ്കോർ **.549** ആണ്, അതായത് മധ്യത്തിൽ തന്നെ. ഇത് സൂചിപ്പിക്കുന്നത് നമ്മുടെ ഡാറ്റ ഈ തരത്തിലുള്ള ക്ലസ്റ്ററിംഗിന് പ്രത്യേകിച്ച് അനുയോജ്യമായതല്ല എന്നതാണ്. നമുക്ക് ഈ സംശയം ദൃശ്യമായി സ്ഥിരീകരിക്കാമോ എന്ന് നോക്കാം. [factoextra പാക്കേജ്](https://rpkgs.datanovia.com/factoextra/index.html) ക്ലസ്റ്ററിംഗ് ദൃശ്യവത്കരിക്കാൻ (`fviz_cluster()`) ഫംഗ്ഷനുകൾ നൽകുന്നു.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "7a6Km1_FLXzD"
},
"source": [
"library(factoextra)\n",
"\n",
"# Visualize clustering results\n",
"fviz_cluster(kclust, df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "IBwCWt-0LXzD"
},
"source": [
"ക്ലസ്റ്ററുകളിൽ ഉള്ള ഓവർലാപ്പ് നമ്മുടെ ഡാറ്റ ഈ തരത്തിലുള്ള ക്ലസ്റ്ററിംഗിന് പ്രത്യേകിച്ച് അനുയോജ്യമല്ലെന്ന് സൂചിപ്പിക്കുന്നു, പക്ഷേ നമുക്ക് തുടരണം.\n",
"\n",
"## 4. ഏറ്റവും അനുയോജ്യമായ ക്ലസ്റ്ററുകൾ നിർണ്ണയിക്കൽ\n",
"\n",
"K-മീൻസ് ക്ലസ്റ്ററിംഗിൽ സാധാരണയായി ഉയരുന്ന ഒരു അടിസ്ഥാന ചോദ്യമാണ് - അറിയപ്പെടാത്ത ക്ലാസ് ലേബലുകൾ ഇല്ലാതെ, നിങ്ങളുടെ ഡാറ്റ എത്ര ക്ലസ്റ്ററുകളായി വേർതിരിക്കണമെന്ന് നിങ്ങൾ എങ്ങനെ അറിയും?\n",
"\n",
"നാം കണ്ടെത്താൻ ശ്രമിക്കാവുന്ന ഒരു മാർഗം ഡാറ്റ സാമ്പിൾ ഉപയോഗിച്ച് ക്ലസ്റ്ററുകളുടെ എണ്ണം ക്രമമായി വർദ്ധിപ്പിച്ച് (ഉദാ: 1-10 വരെ) `ക്ലസ്റ്ററിംഗ് മോഡലുകളുടെ ഒരു പരമ്പര സൃഷ്ടിക്കുക` എന്നതാണ്, കൂടാതെ **സിലഹ്വെറ്റ് സ്കോർ** പോലുള്ള ക്ലസ്റ്ററിംഗ് മെട്രിക്കുകൾ വിലയിരുത്തുക.\n",
"\n",
"വിവിധ *k* മൂല്യങ്ങൾക്ക് ക്ലസ്റ്ററിംഗ് ആൽഗോരിതം കണക്കാക്കി **Within Cluster Sum of Squares** (WCSS) വിലയിരുത്തി ഏറ്റവും അനുയോജ്യമായ ക്ലസ്റ്ററുകളുടെ എണ്ണം നമുക്ക് നിർണ്ണയിക്കാം. മൊത്തം ക്ലസ്റ്റർ ഉള്ളിലെ സ്ക്വയർ സമാഹാരം (WCSS) ക്ലസ്റ്ററിംഗിന്റെ സാന്ദ്രത അളക്കുന്നു, ഇത് όσο ചെറുതായിരിക്കും, ഡാറ്റ പോയിന്റുകൾ തമ്മിലുള്ള ദൂരം കുറവായിരിക്കും എന്ന് അർത്ഥം.\n",
"\n",
"1 മുതൽ 10 വരെ വ്യത്യസ്ത `k` തിരഞ്ഞെടുപ്പുകളുടെ ഈ ക്ലസ്റ്ററിംഗിൽ ഉള്ള ഫലങ്ങൾ നമുക്ക് പരിശോധിക്കാം.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "hSeIiylDLXzE"
},
"source": [
"# Create a series of clustering models\n",
"kclusts <- tibble(k = 1:10) %>% \n",
" # Perform kmeans clustering for 1,2,3 ... ,10 clusters\n",
" mutate(model = map(k, ~ kmeans(df_numeric_select, centers = .x, nstart = 25)),\n",
" # Farm out clustering metrics eg WCSS\n",
" glanced = map(model, ~ glance(.x))) %>% \n",
" unnest(cols = glanced)\n",
" \n",
"\n",
"# View clustering rsulsts\n",
"kclusts\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "m7rS2U1eLXzE"
},
"source": [
"ഇപ്പോൾ ഓരോ ക്ലസ്റ്ററിംഗ് ആൽഗോറിതത്തിനും സെന്റർ *k* ഉള്ള മൊത്തം ക്ലസ്റ്റർ-അകത്ത് സ്ക്വയർസിന്റെ സംഖ്യ (tot.withinss) ലഭിച്ചതിനുശേഷം, ഏറ്റവും അനുയോജ്യമായ ക്ലസ്റ്ററുകളുടെ എണ്ണം കണ്ടെത്താൻ [എൽബോ മെത്തഡ്](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) ഉപയോഗിക്കുന്നു. ക്ലസ്റ്ററുകളുടെ എണ്ണത്തിന്റെ ഫംഗ്ഷനായി WCSS പ്ലോട്ട് ചെയ്യുകയും, ഉപയോഗിക്കേണ്ട ക്ലസ്റ്ററുകളുടെ എണ്ണമായി [വക്രത്തിന്റെ എൽബോ](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Elbow of the curve\") തിരഞ്ഞെടുക്കുകയും ചെയ്യുന്നതാണ് ഈ രീതി.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "o_DjHGItLXzF"
},
"source": [
"set.seed(2056)\n",
"# Use elbow method to determine optimum number of clusters\n",
"kclusts %>% \n",
" ggplot(mapping = aes(x = k, y = tot.withinss)) +\n",
" geom_line(size = 1.2, alpha = 0.8, color = \"#FF7F0EFF\") +\n",
" geom_point(size = 2, color = \"#FF7F0EFF\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "pLYyt5XSLXzG"
},
"source": [
"The plot shows a large reduction in WCSS (so greater *tightness*) as the number of clusters increases from one to two, and a further noticeable reduction from two to three clusters. After that, the reduction is less pronounced, resulting in an `elbow` 💪in the chart at around three clusters. This is a good indication that there are two to three reasonably well separated clusters of data points.\n",
"\n",
"We can now go ahead and extract the clustering model where `k = 3`:\n",
"\n",
"> `pull()`: used to extract a single column\n",
">\n",
"> `pluck()`: used to index data structures such as lists\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "JP_JPKBILXzG"
},
"source": [
"# Extract k = 3 clustering\n",
"final_kmeans <- kclusts %>% \n",
" filter(k == 3) %>% \n",
" pull(model) %>% \n",
" pluck(1)\n",
"\n",
"\n",
"final_kmeans\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "l_PDTu8tLXzI"
},
"source": [
"ശ്രേഷ്ഠം! നമുക്ക് ലഭിച്ച ക്ലസ്റ്ററുകൾ ദൃശ്യവത്കരിക്കാം. `plotly` ഉപയോഗിച്ച് ചില ഇന്ററാക്ടിവിറ്റി വേണോ?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "dNcleFe-LXzJ"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"results <- augment(final_kmeans, df_numeric_select) %>% \n",
" bind_cols(df_numeric %>% select(artist_top_genre)) \n",
"\n",
"# Plot cluster assignments\n",
"clust_plt <- results %>% \n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = .cluster, shape = artist_top_genre)) +\n",
" geom_point(size = 2, alpha = 0.8) +\n",
" paletteer::scale_color_paletteer_d(\"ggthemes::Tableau_10\")\n",
"\n",
"ggplotly(clust_plt)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "6JUM_51VLXzK"
},
"source": [
"പ്രത്യേക നിറങ്ങളിൽ പ്രതിനിധീകരിച്ചിരിക്കുന്ന ഓരോ ക്ലസ്റ്ററും വ്യത്യസ്ത ആകൃതികളിൽ പ്രതിനിധീകരിച്ചിരിക്കുന്ന വ്യത്യസ്ത ജാനറുകൾ ഉണ്ടാകുമെന്ന് നമ്മൾ പ്രതീക്ഷിച്ചിരുന്നോ.\n",
"\n",
"മോഡലിന്റെ കൃത്യത നോക്കാം.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HdIMUGq7LXzL"
},
"source": [
"# Assign genres to predefined integers\n",
"label_count <- results %>% \n",
" group_by(artist_top_genre) %>% \n",
" mutate(id = cur_group_id()) %>% \n",
" ungroup() %>% \n",
" summarise(correct_labels = sum(.cluster == id))\n",
"\n",
"\n",
"# Print results \n",
"cat(\"Result:\", label_count$correct_labels, \"out of\", nrow(results), \"samples were correctly labeled.\")\n",
"\n",
"cat(\"\\nAccuracy score:\", label_count$correct_labels/nrow(results))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "C50wvaAOLXzM"
},
"source": [
"ഈ മോഡലിന്റെ കൃത്യത മോശമല്ല, പക്ഷേ മികച്ചതുമല്ല. ഡാറ്റ K-Means ക്ലസ്റ്ററിംഗിന് അനുയോജ്യമല്ലായിരിക്കാം. ഈ ഡാറ്റ വളരെ അസമതുലിതമാണ്, correlations വളരെ കുറവാണ്, കൂടാതെ കോളം മൂല്യങ്ങൾക്കിടയിൽ വ്യത്യാസം വളരെ കൂടുതലാണ്, അതിനാൽ നല്ല ക്ലസ്റ്ററിംഗ് സാധ്യമല്ല. വാസ്തവത്തിൽ, രൂപപ്പെടുന്ന ക്ലസ്റ്ററുകൾ മുകളിൽ നാം നിർവചിച്ച മൂന്ന് ജാനർ വിഭാഗങ്ങൾ മൂലം ശക്തമായി സ്വാധീനിക്കപ്പെട്ടതോ വക്രമായതോ ആയിരിക്കാം.\n",
"\n",
"എങ്കിലും, അത് വളരെ പഠനപ്രക്രിയ ആയിരുന്നു!\n",
"\n",
"Scikit-learn ന്റെ ഡോക്യുമെന്റേഷനിൽ, ഈ പോലുള്ള മോഡലുകൾക്ക്, ക്ലസ്റ്ററുകൾ വളരെ വ്യക്തമായി വേർതിരിക്കപ്പെട്ടിട്ടില്ലാത്തതിനാൽ, 'വ്യത്യാസം' പ്രശ്നമുണ്ടെന്ന് കാണാം:\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/problems.f7fb539ccd80608e1f35c319cf5e3ad1809faa3c08537aead8018c6b5ba2e33a.ml.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Scikit-learn ന്റെ ഇൻഫോഗ്രാഫിക്</figcaption>\n",
"\n",
"\n",
"\n",
"## **വ്യത്യാസം**\n",
"\n",
"വ്യത്യാസം എന്നത് \"Mean ൽ നിന്നുള്ള ചതുരശ്ര വ്യത്യാസങ്ങളുടെ ശരാശരി\" ആയി നിർവചിക്കപ്പെടുന്നു [source](https://www.mathsisfun.com/data/standard-deviation.html). ഈ ക്ലസ്റ്ററിംഗ് പ്രശ്നത്തിന്റെ സാന്ദർഭ്യത്തിൽ, ഇത് നമ്മുടെ ഡാറ്റാസെറ്റിലെ സംഖ്യകൾ ശരാശരിയിൽ നിന്ന് വളരെ വ്യത്യാസപ്പെടുന്ന ഡാറ്റയെ സൂചിപ്പിക്കുന്നു.\n",
"\n",
"✅ ഈ പ്രശ്നം പരിഹരിക്കാൻ നിങ്ങൾക്ക് ഉള്ള എല്ലാ മാർഗങ്ങളും ചിന്തിക്കാൻ ഇത് ഒരു മികച്ച അവസരമാണ്. ഡാറ്റ കുറച്ച് മാറ്റി നോക്കാമോ? വ്യത്യസ്ത കോളങ്ങൾ ഉപയോഗിക്കാമോ? വ്യത്യസ്ത ആൽഗോരിതം പരീക്ഷിക്കാമോ? സൂചന: [ഡാറ്റ സ്കെയിലിംഗ്](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) ഉപയോഗിച്ച് ഡാറ്റ നോർമലൈസ് ചെയ്ത് മറ്റ് കോളങ്ങൾ പരീക്ഷിക്കുക.\n",
"\n",
"> ഈ '[വ്യത്യാസം കാൽക്കുലേറ്റർ](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' പരീക്ഷിച്ച് ആശയം കൂടുതൽ മനസ്സിലാക്കുക.\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀ചലഞ്ച്**\n",
"\n",
"ഈ നോട്ട്‌ബുക്കിൽ ചില സമയം ചെലവഴിക്കൂ, പാരാമീറ്ററുകൾ ക്രമീകരിച്ച് നോക്കൂ. ഡാറ്റ കൂടുതൽ ശുദ്ധമാക്കുന്നതിലൂടെ (ഉദാഹരണത്തിന്, ഔട്ട്‌ലൈയർമാർ നീക്കംചെയ്യൽ) മോഡലിന്റെ കൃത്യത മെച്ചപ്പെടുത്താൻ കഴിയുമോ? നിങ്ങൾക്ക് ഡാറ്റ സാമ്പിളുകൾക്ക് കൂടുതൽ ഭാരമിടാൻ വെയ്റ്റുകൾ ഉപയോഗിക്കാം. മികച്ച ക്ലസ്റ്ററുകൾ സൃഷ്ടിക്കാൻ മറ്റെന്തെന്ത് ചെയ്യാനാകും?\n",
"\n",
"സൂചന: നിങ്ങളുടെ ഡാറ്റ സ്കെയിൽ ചെയ്യാൻ ശ്രമിക്കുക. നോട്ട്‌ബുക്കിൽ സ്റ്റാൻഡേർഡ് സ്കെയിലിംഗ് ചേർക്കുന്ന കോഡ് കമന്റ് ചെയ്തിട്ടുണ്ട്, ഇത് ഡാറ്റ കോളങ്ങൾ പരസ്പരം പരിധിയിൽ കൂടുതൽ സമാനമാക്കുന്നു. സിലഹ്വെറ്റ് സ്കോർ കുറയുമ്പോഴും, എൽബോ ഗ്രാഫിലെ 'കിങ്ക്' മൃദുവാകുന്നത് കാണും. കാരണം, ഡാറ്റ സ്കെയിൽ ചെയ്യാതെ വെച്ചാൽ കുറവ് വ്യത്യാസമുള്ള ഡാറ്റയ്ക്ക് കൂടുതൽ ഭാരമിടാൻ അവസരം ലഭിക്കുന്നു. ഈ പ്രശ്നത്തെ കുറിച്ച് കൂടുതൽ വായിക്കുക [ഇവിടെ](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n",
"\n",
"## [**പോസ്റ്റ്-ലെക്ചർ ക്വിസ്**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
"\n",
"## **പരിശോധന & സ്വയം പഠനം**\n",
"\n",
"- K-Means സിമുലേറ്റർ [ഇതുപോലുള്ളത്](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/) പരിശോധിക്കുക. ഈ ഉപകരണം ഉപയോഗിച്ച് സാമ്പിൾ ഡാറ്റ പോയിന്റുകൾ ദൃശ്യവൽക്കരിച്ച് സെൻട്രോയിഡുകൾ കണ്ടെത്താം. ഡാറ്റയുടെ റാൻഡംനസ്, ക്ലസ്റ്ററുകളുടെ എണ്ണം, സെൻട്രോയിഡുകളുടെ എണ്ണം എഡിറ്റ് ചെയ്യാം. ഇത് ഡാറ്റ എങ്ങനെ ഗ്രൂപ്പുചെയ്യാമെന്ന് മനസ്സിലാക്കാൻ സഹായിക്കുന്നുണ്ടോ?\n",
"\n",
"- സ്റ്റാൻഫോർഡിൽ നിന്നുള്ള [K-Means ഹാൻഡ്‌ഔട്ട്](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) കൂടി നോക്കുക.\n",
"\n",
"നിങ്ങളുടെ പുതിയ ക്ലസ്റ്ററിംഗ് കഴിവുകൾ K-Means ക്ലസ്റ്ററിംഗിന് അനുയോജ്യമായ ഡാറ്റാസെറ്റുകളിൽ പരീക്ഷിക്കാൻ ആഗ്രഹിക്കുന്നുവോ? ദയവായി കാണുക:\n",
"\n",
"- [Train and Evaluate Clustering Models](https://rpubs.com/eR_ic/clustering) Tidymodels ഉപയോഗിച്ച്\n",
"\n",
"- [K-means Cluster Analysis](https://uc-r.github.io/kmeans_clustering), UC ബിസിനസ് അനലിറ്റിക്സ് R പ്രോഗ്രാമിംഗ് ഗൈഡ്\n",
"\n",
"- [K-means ക്ലസ്റ്ററിംഗ് tidy data സിദ്ധാന്തങ്ങളോടെ](https://www.tidymodels.org/learn/statistics/k-means/)\n",
"\n",
"## **അസൈൻമെന്റ്**\n",
"\n",
"[വ്യത്യസ്ത ക്ലസ്റ്ററിംഗ് രീതികൾ പരീക്ഷിക്കുക](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
"\n",
"## നന്ദി:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) ഈ മോഡ്യൂളിന്റെ ഒറിജിനൽ പൈതൺ പതിപ്പ് സൃഷ്ടിച്ചതിന് ♥️\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) R-നെ കൂടുതൽ സ്വാഗതം ചെയ്യുന്നതും ആകർഷകവുമാക്കുന്ന അത്ഭുതകരമായ ചിത്രങ്ങൾ സൃഷ്ടിച്ചതിന്. അവളുടെ [ഗാലറി](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM) സന്ദർശിക്കുക.\n",
"\n",
"സന്തോഷകരമായ പഠനം,\n",
"\n",
"[Eric](https://twitter.com/ericntay), ഗോൾഡ് മൈക്രോസോഫ്റ്റ് ലേൺ സ്റ്റുഡന്റ് അംബാസഡർ.\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/r_learners_sm.e4a71b113ffbedfe727048ec69741a9295954195d8761c35c46f20277de5f684.ml.jpeg\"\n",
" width=\"500\"/>\n",
" <figcaption>@allison_horst രചിച്ച ആർട്ട്‌വർക്കുകൾ</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാപത്രം**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,44 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b28a3a4911584062772c537b653ebbc7",
"translation_date": "2025-12-19T13:04:31+00:00",
"source_file": "5-Clustering/README.md",
"language_code": "ml"
}
-->
# മെഷീൻ ലേണിംഗിനുള്ള ക്ലസ്റ്ററിംഗ് മോഡലുകൾ
ക്ലസ്റ്ററിംഗ് എന്നത് മെഷീൻ ലേണിംഗ് ടാസ്കാണ്, ഇതിൽ പരസ്പരം സമാനമായ വസ്തുക്കളെ കണ്ടെത്തി അവയെ ക്ലസ്റ്ററുകൾ എന്നറിയപ്പെടുന്ന ഗ്രൂപ്പുകളായി കൂട്ടിച്ചേർക്കാൻ ശ്രമിക്കുന്നു. മെഷീൻ ലേണിംഗിലെ മറ്റ് സമീപനങ്ങളിൽ നിന്ന് ക്ലസ്റ്ററിംഗ് വ്യത്യസ്തമാകുന്നത്, കാര്യങ്ങൾ സ്വയം സംഭവിക്കുന്നതാണ്, വാസ്തവത്തിൽ, ഇത് സൂപ്പർവൈസ്ഡ് ലേണിംഗിന്റെ എതിര്‍ഭാഗമാണെന്ന് പറയാം.
## പ്രാദേശിക വിഷയം: നൈജീരിയൻ പ്രേക്ഷകരുടെ സംഗീത രുചിക്കായി ക്ലസ്റ്ററിംഗ് മോഡലുകൾ 🎧
നൈജീരിയയുടെ വൈവിധ്യമാർന്ന പ്രേക്ഷകർക്ക് വൈവിധ്യമാർന്ന സംഗീത രുചികൾ ഉണ്ട്. Spotify-യിൽ നിന്നുള്ള ഡാറ്റ ഉപയോഗിച്ച് (ഈ ലേഖനം പ്രചോദനമായി [this article](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)), നൈജീരിയയിൽ പ്രചാരത്തിലുള്ള ചില സംഗീതങ്ങൾ നോക്കാം. ഈ ഡാറ്റാസെറ്റിൽ വിവിധ പാട്ടുകളുടെ 'danceability' സ്കോർ, 'acousticness', ലൗഡ്നസ്, 'speechiness', ജനപ്രിയത, എനർജി എന്നിവയെക്കുറിച്ചുള്ള ഡാറ്റ ഉൾപ്പെടുന്നു. ഈ ഡാറ്റയിൽ പാറ്റേണുകൾ കണ്ടെത്തുന്നത് രസകരമായിരിക്കും!
![A turntable](../../../translated_images/turntable.f2b86b13c53302dc106aa741de9dc96ac372864cf458dd6f879119857aab01da.ml.jpg)
> ഫോട്ടോ <a href="https://unsplash.com/@marcelalaskoski?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Marcela Laskoski</a> യുടെ <a href="https://unsplash.com/s/photos/nigerian-music?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a> ൽ നിന്നാണ്
ഈ പാഠമാലയിൽ, ക്ലസ്റ്ററിംഗ് സാങ്കേതികവിദ്യകൾ ഉപയോഗിച്ച് ഡാറ്റ വിശകലനം ചെയ്യാനുള്ള പുതിയ മാർഗങ്ങൾ നിങ്ങൾ കണ്ടെത്തും. നിങ്ങളുടെ ഡാറ്റാസെറ്റിന് ലേബലുകൾ ഇല്ലാത്തപ്പോൾ ക്ലസ്റ്ററിംഗ് പ്രത്യേകിച്ച് പ്രയോജനകരമാണ്. ലേബലുകൾ ഉണ്ടെങ്കിൽ, മുമ്പത്തെ പാഠങ്ങളിൽ പഠിച്ച ക്ലാസിഫിക്കേഷൻ സാങ്കേതികവിദ്യകൾ കൂടുതൽ പ്രയോജനകരമായിരിക്കാം. എന്നാൽ ലേബൽ ഇല്ലാത്ത ഡാറ്റയെ ഗ്രൂപ്പുചെയ്യാൻ ശ്രമിക്കുന്ന സാഹചര്യങ്ങളിൽ, ക്ലസ്റ്ററിംഗ് പാറ്റേണുകൾ കണ്ടെത്താനുള്ള മികച്ച മാർഗമാണ്.
> ക്ലസ്റ്ററിംഗ് മോഡലുകളുമായി പ്രവർത്തിക്കാൻ സഹായിക്കുന്ന കുറവ്-കോഡ് ഉപകരണങ്ങൾ ഉണ്ട്. ഈ ടാസ്കിനായി [Azure ML](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) പരീക്ഷിക്കുക
## പാഠങ്ങൾ
1. [ക്ലസ്റ്ററിംഗിലേക്ക് പരിചയം](1-Visualize/README.md)
2. [കെ-മീൻസ് ക്ലസ്റ്ററിംഗ്](2-K-Means/README.md)
## ക്രെഡിറ്റുകൾ
ഈ പാഠങ്ങൾ 🎶 [Jen Looper](https://www.twitter.com/jenlooper) എഴുതിയതാണ്, [Rishit Dagli](https://rishit_dagli) ഉം [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) ഉം നൽകിയ സഹായകരമായ അവലോകനങ്ങളോടെ.
[Nigerian Songs](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) ഡാറ്റാസെറ്റ് Spotify-യിൽ നിന്നു സ്ക്രാപ്പ് ചെയ്ത് Kaggle-ൽ നിന്നാണ് ലഭിച്ചത്.
ഈ പാഠം സൃഷ്ടിക്കാൻ സഹായിച്ച പ്രയോജനകരമായ കെ-മീൻസ് ഉദാഹരണങ്ങളിൽ ഈ [iris exploration](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), ഈ [introductory notebook](https://www.kaggle.com/prashant111/k-means-clustering-with-python), ഈ [hypothetical NGO example](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering) എന്നിവ ഉൾപ്പെടുന്നു.
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, യന്ത്രം ചെയ്ത വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ വ്യാഖ്യാനക്കേടുകൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,181 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1c2ec40cf55c98a028a359c27ef7e45a",
"translation_date": "2025-12-19T14:28:04+00:00",
"source_file": "6-NLP/1-Introduction-to-NLP/README.md",
"language_code": "ml"
}
-->
# സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗിലേക്ക് പരിചയം
ഈ പാഠം *സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ്* എന്ന *കമ്പ്യൂട്ടേഷണൽ ലിംഗ്വിസ്റ്റിക്സ്* എന്ന ഉപവിഭാഗത്തിന്റെ ഒരു സംക്ഷിപ്ത ചരിത്രവും പ്രധാന ആശയങ്ങളും ഉൾക്കൊള്ളുന്നു.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## പരിചയം
NLP, സാധാരണയായി അറിയപ്പെടുന്നത് പോലെ, മെഷീൻ ലേണിംഗ് പ്രയോഗിച്ചും പ്രൊഡക്ഷൻ സോഫ്റ്റ്‌വെയറിൽ ഉപയോഗിച്ചും ഏറ്റവും പ്രശസ്തമായ മേഖലകളിലൊന്നാണ്.
✅ നിങ്ങൾ ദിവസേന ഉപയോഗിക്കുന്ന സോഫ്റ്റ്‌വെയറുകളിൽ ഏതെങ്കിലും NLP ഉൾപ്പെടുത്തിയിട്ടുണ്ടെന്ന് നിങ്ങൾക്ക് തോന്നുന്നുണ്ടോ? നിങ്ങൾ സ്ഥിരമായി ഉപയോഗിക്കുന്ന വേഡ് പ്രോസസ്സിംഗ് പ്രോഗ്രാമുകളോ മൊബൈൽ ആപ്പുകളോ എന്തെങ്കിലും?
നിങ്ങൾ പഠിക്കാനിരിക്കുന്നവ:
- **ഭാഷകളുടെ ആശയം**. ഭാഷകൾ എങ്ങനെ വികസിച്ചു, പ്രധാന പഠന മേഖലകൾ എന്തെല്ലാമായിരുന്നു.
- **നിർവചനവും ആശയങ്ങളും**. കമ്പ്യൂട്ടറുകൾ ടെക്സ്റ്റ് എങ്ങനെ പ്രോസസ് ചെയ്യുന്നു എന്നതിനെക്കുറിച്ചുള്ള നിർവചനങ്ങളും ആശയങ്ങളും, പാഴ്സിംഗ്, വ്യാകരണം, നാമപദങ്ങളും ക്രിയാപദങ്ങളും തിരിച്ചറിയൽ ഉൾപ്പെടെ. ഈ പാഠത്തിൽ ചില കോഡിംഗ് പ്രവർത്തനങ്ങളുണ്ട്, കൂടാതെ ചില പ്രധാന ആശയങ്ങൾ പരിചയപ്പെടുത്തുന്നു, അവ അടുത്ത പാഠങ്ങളിൽ നിങ്ങൾക്ക് കോഡ് ചെയ്യാൻ പഠിക്കാം.
## കമ്പ്യൂട്ടേഷണൽ ലിംഗ്വിസ്റ്റിക്സ്
കമ്പ്യൂട്ടേഷണൽ ലിംഗ്വിസ്റ്റിക്സ് ദശകങ്ങളായി ഗവേഷണവും വികസനവും നടത്തുന്ന ഒരു മേഖലയാണ്, കമ്പ്യൂട്ടറുകൾ ഭാഷകളുമായി എങ്ങനെ പ്രവർത്തിക്കാമെന്നും, അവ മനസ്സിലാക്കാനും, വിവർത്തനം ചെയ്യാനും, ആശയവിനിമയം നടത്താനും കഴിയുമെന്നുമാണ് പഠിക്കുന്നത്. സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ് (NLP) കമ്പ്യൂട്ടറുകൾ 'സ്വാഭാവിക' അല്ലെങ്കിൽ മനുഷ്യ ഭാഷകൾ എങ്ങനെ പ്രോസസ് ചെയ്യാമെന്നതിൽ കേന്ദ്രീകരിച്ച ഒരു ബന്ധപ്പെട്ട മേഖലയാണ്.
### ഉദാഹരണം - ഫോൺ ഡിക്ടേഷൻ
നിങ്ങൾ ടൈപ്പുചെയ്യാതെ നിങ്ങളുടെ ഫോൺക്ക് വാക്കുകൾ പറഞ്ഞിട്ടുണ്ടെങ്കിൽ അല്ലെങ്കിൽ ഒരു വെർച്വൽ അസിസ്റ്റന്റിനോട് ചോദിച്ചിട്ടുണ്ടെങ്കിൽ, നിങ്ങളുടെ സംസാരത്തെ ടെക്സ്റ്റ് രൂപത്തിലേക്ക് മാറ്റി പിന്നീട് നിങ്ങൾ സംസാരിച്ച ഭാഷയിൽ നിന്നു *പാഴ്സ്* ചെയ്തു. കണ്ടെത്തിയ കീവേഡുകൾ പിന്നീട് ഫോൺ അല്ലെങ്കിൽ അസിസ്റ്റന്റ് മനസ്സിലാക്കി പ്രവർത്തിക്കാൻ കഴിയുന്ന ഫോർമാറ്റിലേക്ക് പ്രോസസ് ചെയ്തു.
![comprehension](../../../../translated_images/comprehension.619708fc5959b0f6a24ebffba2ad7b0625391a476141df65b43b59de24e45c6f.ml.png)
> യഥാർത്ഥ ഭാഷാശാസ്ത്രപരമായ ബോധം ബുദ്ധിമുട്ടാണ്! ചിത്രം [Jen Looper](https://twitter.com/jenlooper) യുടെ
### ഈ സാങ്കേതികവിദ്യ എങ്ങനെ സാധ്യമായി?
ഇത് സാധ്യമായത് ആരോ ഒരു കമ്പ്യൂട്ടർ പ്രോഗ്രാം എഴുതിയതിനാൽ ആണ്. കുറച്ച് ദശകങ്ങൾ മുൻപ്, ചില സയൻസ് ഫിക്ഷൻ എഴുത്തുകാർ ആളുകൾ പ്രധാനമായും അവരുടെ കമ്പ്യൂട്ടറുകളോട് സംസാരിക്കും, കമ്പ്യൂട്ടറുകൾ എപ്പോഴും അവർ പറയുന്നത് ശരിയായി മനസ്സിലാക്കും എന്ന് പ്രവചിച്ചിരുന്നു. ദുർഭാഗ്യവശാൽ, ഇത് പലർക്കും കരുതിയതേക്കാൾ ബുദ്ധിമുട്ടുള്ള പ്രശ്നമായിരുന്നു, ഇന്ന് ഇത് വളരെ മെച്ചപ്പെട്ട രീതിയിൽ മനസ്സിലാക്കപ്പെടുന്ന പ്രശ്നമാണ്, എന്നാൽ ഒരു വാചകത്തിന്റെ അർത്ഥം മനസ്സിലാക്കുന്നതിൽ 'പരിപൂർണ്ണ' സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ് നേടുന്നതിൽ വലിയ വെല്ലുവിളികൾ ഉണ്ട്. പ്രത്യേകിച്ച് ഹാസ്യവും വാചകത്തിലെ സാർക്കാസം പോലുള്ള വികാരങ്ങൾ തിരിച്ചറിയുന്നതിൽ ഇത് ബുദ്ധിമുട്ടാണ്.
ഇപ്പോൾ, നിങ്ങൾക്ക് സ്കൂളിലെ ക്ലാസ്സുകൾ ഓർമ്മ വരാം, അപ്പോൾ അധ്യാപകൻ ഒരു വാചകത്തിലെ വ്യാകരണ ഭാഗങ്ങൾ പഠിപ്പിച്ചിരുന്നു. ചില രാജ്യങ്ങളിൽ വിദ്യാർത്ഥികൾ വ്യാകരണം, ഭാഷാശാസ്ത്രം പ്രത്യേക വിഷയമായി പഠിക്കുന്നു, എന്നാൽ പല സ്ഥലങ്ങളിലും ഈ വിഷയങ്ങൾ ഒരു ഭാഷ പഠനത്തിന്റെ ഭാഗമായാണ് ഉൾപ്പെടുത്തുന്നത്: പ്രാഥമിക വിദ്യാലയത്തിൽ നിങ്ങളുടെ ആദ്യഭാഷ (വായനയും എഴുത്തും പഠിക്കൽ) അല്ലെങ്കിൽ രണ്ടാം ഭാഷ പോസ്റ്റ്-പ്രൈമറി അല്ലെങ്കിൽ ഹൈസ്കൂളിൽ. നാമപദങ്ങളും ക്രിയാപദങ്ങളും അല്ലെങ്കിൽ ക്രിയാവിശേഷണങ്ങളും വിശേഷണങ്ങളും വേർതിരിക്കാൻ നിങ്ങൾ വിദഗ്ധനല്ലെങ്കിൽ ആശങ്കപ്പെടേണ്ടതില്ല!
*സിംപിൾ പ്രെസന്റ്* ഉം *പ്രെസന്റ് പ്രോഗ്രസീവ്* ഉം തമ്മിലുള്ള വ്യത്യാസം നിങ്ങൾക്ക് ബുദ്ധിമുട്ടുണ്ടെങ്കിൽ, നിങ്ങൾ ഒറ്റക്കല്ല. ഇത് പലർക്കും, ഭാഷയുടെ സ്വദേശികളായവർക്കും പോലും ബുദ്ധിമുട്ടുള്ളതാണ്. നല്ല വാർത്ത എന്തെന്നാൽ കമ്പ്യൂട്ടറുകൾ ഔപചാരിക നിയമങ്ങൾ പ്രയോഗിക്കുന്നതിൽ വളരെ നല്ലവരാണ്, നിങ്ങൾ ഒരു മനുഷ്യനെപ്പോലെ ഒരു വാചകം *പാഴ്സ്* ചെയ്യാൻ കഴിയുന്ന കോഡ് എഴുതാൻ പഠിക്കും. പിന്നീട് നിങ്ങൾ പരിശോധിക്കേണ്ട വലിയ വെല്ലുവിളി ഒരു വാചകത്തിന്റെ *അർത്ഥം*യും, *ഭാവന*യും മനസ്സിലാക്കലാണ്.
## മുൻകൂട്ടി അറിയേണ്ടതുകൾ
ഈ പാഠത്തിന് പ്രധാന മുൻകൂട്ടി അറിയേണ്ടത് ഈ പാഠത്തിന്റെ ഭാഷ വായിച്ച് മനസ്സിലാക്കാൻ കഴിയുന്നതാണ്. പരിഹരിക്കേണ്ട ഗണിത പ്രശ്നങ്ങളോ സമവാക്യങ്ങളോ ഇല്ല. ആദ്യ എഴുത്തുകാരൻ ഈ പാഠം ഇംഗ്ലീഷിൽ എഴുതിയിട്ടുണ്ടെങ്കിലും, ഇത് മറ്റ് ഭാഷകളിലേക്കും വിവർത്തനം ചെയ്തിട്ടുണ്ട്, അതിനാൽ നിങ്ങൾ ഒരു വിവർത്തനം വായിക്കാം. വ്യത്യസ്ത ഭാഷകളുടെ വ്യാകരണ നിയമങ്ങൾ താരതമ്യം ചെയ്യുന്നതിനായി പല ഭാഷകളും ഉപയോഗിച്ച ഉദാഹരണങ്ങൾ ഉണ്ട്. അവ വിവർത്തനം ചെയ്തിട്ടില്ല, പക്ഷേ വിശദീകരണ വാചകങ്ങൾ വിവർത്തനം ചെയ്തിട്ടുള്ളതിനാൽ അർത്ഥം വ്യക്തമായിരിക്കണം.
കോഡിംഗ് പ്രവർത്തനങ്ങൾക്ക്, നിങ്ങൾ Python ഉപയോഗിക്കും, ഉദാഹരണങ്ങൾ Python 3.8 ഉപയോഗിച്ചാണ്.
ഈ വിഭാഗത്തിൽ നിങ്ങൾക്ക് ആവശ്യമായതും ഉപയോഗിക്കുന്നതും:
- **Python 3 ബോധം**. Python 3 പ്രോഗ്രാമിംഗ് ഭാഷയുടെ ബോധം, ഈ പാഠം ഇൻപുട്ട്, ലൂപ്പുകൾ, ഫയൽ വായിക്കൽ, അറേകൾ എന്നിവ ഉപയോഗിക്കുന്നു.
- **Visual Studio Code + എക്സ്റ്റൻഷൻ**. Visual Studio Codeയു അതിന്റെ Python എക്സ്റ്റൻഷനും ഉപയോഗിക്കും. നിങ്ങൾക്ക് ഇഷ്ടമുള്ള Python IDE ഉപയോഗിക്കാം.
- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) Python-ന് വേണ്ടി ലളിതമായ ടെക്സ്റ്റ് പ്രോസസ്സിംഗ് ലൈബ്രറിയാണ്. TextBlob സൈറ്റിലെ നിർദ്ദേശങ്ങൾ പിന്തുടർന്ന് നിങ്ങളുടെ സിസ്റ്റത്തിൽ ഇൻസ്റ്റാൾ ചെയ്യുക (കോർപറയും ഇൻസ്റ്റാൾ ചെയ്യുക, താഴെ കാണിച്ചിരിക്കുന്നതുപോലെ):
```bash
pip install -U textblob
python -m textblob.download_corpora
```
> 💡 ടിപ്പ്: Python നേരിട്ട് VS Code പരിസ്ഥിതികളിൽ ഓടിക്കാം. കൂടുതൽ വിവരങ്ങൾക്ക് [ഡോക്സ്](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) പരിശോധിക്കുക.
## യന്ത്രങ്ങളോട് സംസാരിക്കൽ
കമ്പ്യൂട്ടറുകൾ മനുഷ്യഭാഷ മനസ്സിലാക്കാൻ ശ്രമിച്ച ചരിത്രം ദശകങ്ങളായി തുടരുന്നു, സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ് പരിഗണിച്ച ആദ്യ ശാസ്ത്രജ്ഞരിൽ ഒരാളായിരുന്നു *ആലൻ ട്യൂറിംഗ്*.
### 'ട്യൂറിംഗ് ടെസ്റ്റ്'
1950-കളിൽ *കൃത്രിമ ബുദ്ധിമുട്ട്* ഗവേഷണം നടത്തുമ്പോൾ, ട്യൂറിംഗ് ഒരു സംഭാഷണപരീക്ഷണം മനുഷ്യനും കമ്പ്യൂട്ടറിനും (ടൈപ്പുചെയ്ത കത്തുകളിലൂടെ) നൽകാമോ എന്ന് പരിഗണിച്ചു, അതിൽ സംഭാഷണത്തിലെ മനുഷ്യൻ മറ്റൊരു മനുഷ്യനോ കമ്പ്യൂട്ടറോ ആണെന്ന് ഉറപ്പില്ലാതിരിക്കണം.
ഒരു നിശ്ചിത സംഭാഷണ ദൈർഘ്യത്തിന് ശേഷം, മനുഷ്യൻ ഉത്തരങ്ങൾ കമ്പ്യൂട്ടറിൽ നിന്നാണോ എന്ന് തിരിച്ചറിയാൻ കഴിയാതെപോയാൽ, ആ കമ്പ്യൂട്ടർ *ചിന്തിക്കുന്ന*തായി പറയാമോ?
### പ്രചോദനം - 'ഇമിറ്റേഷൻ ഗെയിം'
ഈ ആശയം ഒരു പാർട്ടി ഗെയിം ആയ *The Imitation Game* എന്നതിൽ നിന്നാണ്, അതിൽ ഒരു ചോദ്യംചെയ്യുന്നവൻ ഒരു മുറിയിൽ ഒറ്റക്കാണ്, മറ്റൊരു മുറിയിൽ രണ്ട് ആളുകളുണ്ട്, അവരിൽ ആരാണ് പുരുഷനും ആരാണ് സ്ത്രീയെന്നു കണ്ടെത്തേണ്ടതാണ്. ചോദ്യംചെയ്യുന്നവൻ കുറിപ്പുകൾ അയയ്ക്കാം, മറുപടികൾ mystery വ്യക്തിയുടെ ലിംഗം വെളിപ്പെടുത്തുന്ന വിധം ചോദ്യങ്ങൾ ചിന്തിക്കണം. മറുപടികൾ നൽകുന്നവർ ചോദ്യംചെയ്യുന്നവനെ തെറ്റിദ്ധരിപ്പിക്കാൻ ശ്രമിക്കും, എന്നാൽ സത്യസന്ധമായി മറുപടി നൽകുന്ന പോലെ തോന്നിക്കണം.
### എലൈസ വികസിപ്പിക്കൽ
1960-കളിൽ MIT ശാസ്ത്രജ്ഞനായ *ജോസഫ് വൈസൻബാം* [*എലൈസ*](https://wikipedia.org/wiki/ELIZA) എന്ന കമ്പ്യൂട്ടർ 'തെറാപ്പിസ്റ്റ്' വികസിപ്പിച്ചു, അത് മനുഷ്യനോട് ചോദ്യങ്ങൾ ചോദിച്ച് അവരുടെ മറുപടികൾ മനസ്സിലാക്കുന്ന പോലെ തോന്നിക്കുകയായിരുന്നു. എങ്കിലും, എലൈസ ഒരു വാചകം പാഴ്സ് ചെയ്ത് ചില വ്യാകരണ ഘടകങ്ങളും കീവേഡുകളും തിരിച്ചറിയാമെങ്കിലും, വാചകം *മനസ്സിലാക്കിയതായി* പറയാനാകില്ല. എലൈസക്ക് "**I am** <u>sad</u>" എന്ന വാചകം നൽകിയാൽ, അത് വാചകത്തിലെ വാക്കുകൾ പുനഃക്രമീകരിച്ച് "How long have **you been** <u>sad</u>" എന്ന മറുപടി രൂപപ്പെടുത്താമായിരുന്നു.
ഇത് എലൈസ വാചകം മനസ്സിലാക്കി തുടർന്നുള്ള ചോദ്യം ചോദിക്കുന്നതായി തോന്നിക്കുകയായിരുന്നു, എന്നാൽ യാഥാർത്ഥത്തിൽ അത് കാലം മാറ്റുകയും ചില വാക്കുകൾ ചേർക്കുകയും ചെയ്തിരുന്നത് മാത്രമാണ്. എലൈസക്ക് മറുപടി നൽകാൻ കഴിയുന്ന കീവേഡ് തിരിച്ചറിയാനാകാതെപോയാൽ, പല വാചകങ്ങൾക്കും അനുയോജ്യമായ ഒരു യാദൃച്ഛിക മറുപടി നൽകും. എലൈസ എളുപ്പത്തിൽ തട്ടിപ്പിലാകാമായിരുന്നു, ഉദാഹരണത്തിന്, ഉപയോക്താവ് "**You are** a <u>bicycle</u>" എന്ന് എഴുതിയാൽ, "How long have **I been** a <u>bicycle</u>?" എന്ന മറുപടി നൽകും, കൂടുതൽ യുക്തിപൂർണമായ മറുപടി നൽകാതെ.
[![എലൈസുമായി സംഭാഷണം](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "എലൈസുമായി സംഭാഷണം")
> 🎥 മുകളിൽ കാണുന്ന ചിത്രത്തിൽ ക്ലിക്ക് ചെയ്ത് യഥാർത്ഥ ELIZA പ്രോഗ്രാമിനെക്കുറിച്ചുള്ള വീഡിയോ കാണുക
> കുറിപ്പ്: നിങ്ങൾക്ക് ACM അക്കൗണ്ട് ഉണ്ടെങ്കിൽ 1966-ൽ പ്രസിദ്ധീകരിച്ച [Eliza](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) യുടെ യഥാർത്ഥ വിവരണം വായിക്കാം. അല്ലെങ്കിൽ [വിക്കിപീഡിയ](https://wikipedia.org/wiki/ELIZA)യിൽ Elizaയെക്കുറിച്ച് വായിക്കാം.
## അഭ്യാസം - അടിസ്ഥാന സംഭാഷണ ബോട്ട് കോഡിംഗ്
എലൈസ പോലുള്ള ഒരു സംഭാഷണ ബോട്ട്, ഉപയോക്തൃ ഇൻപുട്ട് എടുക്കുകയും ബുദ്ധിമുട്ടോടെ മനസ്സിലാക്കി പ്രതികരിക്കുന്നതുപോലെ തോന്നുകയും ചെയ്യുന്ന പ്രോഗ്രാമാണ്. എലൈസ പോലുള്ള ബോട്ടിന് നിരവധി നിയമങ്ങൾ ഉണ്ടായിരുന്നു ബുദ്ധിമുട്ടുള്ള സംഭാഷണം നടത്തുന്നതായി തോന്നിക്കാൻ. എന്നാൽ നമ്മുടെ ബോട്ടിന് ഒരു കഴിവ് മാത്രമേ ഉണ്ടാകൂ, അത് ഏതൊരു ലളിതമായ സംഭാഷണത്തിലും പ്രവർത്തിക്കാവുന്ന യാദൃച്ഛിക മറുപടികൾ ഉപയോഗിച്ച് സംഭാഷണം തുടരുക.
### പദ്ധതി
സംഭാഷണ ബോട്ട് നിർമ്മിക്കുമ്പോൾ നിങ്ങളുടെ ചുവടുകൾ:
1. ഉപയോക്താവിന് ബോട്ടുമായി എങ്ങനെ ഇടപഴകണമെന്ന് നിർദ്ദേശങ്ങൾ പ്രിന്റ് ചെയ്യുക
2. ഒരു ലൂപ്പ് ആരംഭിക്കുക
1. ഉപയോക്തൃ ഇൻപുട്ട് സ്വീകരിക്കുക
2. ഉപയോക്താവ് പുറത്തുകടക്കാൻ ആവശ്യപ്പെട്ടാൽ, പുറത്തുകടക്കുക
3. ഉപയോക്തൃ ഇൻപുട്ട് പ്രോസസ് ചെയ്ത് മറുപടി നിർണയിക്കുക (ഈ കേസിൽ, മറുപടി സാധാരണ മറുപടികളുടെ യാദൃച്ഛിക തിരഞ്ഞെടുപ്പാണ്)
4. മറുപടി പ്രിന്റ് ചെയ്യുക
3. പടിയിലേക്ക് 2 ലേക്ക് മടങ്ങുക
### ബോട്ട് നിർമ്മിക്കൽ
ഇപ്പോൾ ബോട്ട് സൃഷ്ടിക്കാം. ചില വാചകങ്ങൾ നിർവചിക്കുന്നതിൽ നിന്ന് തുടങ്ങാം.
1. Python-ൽ ഈ ബോട്ട് താഴെ കാണുന്ന യാദൃച്ഛിക മറുപടികളോടെ സ്വയം സൃഷ്ടിക്കുക:
```python
random_responses = ["That is quite interesting, please tell me more.",
"I see. Do go on.",
"Why do you say that?",
"Funny weather we've been having, isn't it?",
"Let's change the subject.",
"Did you catch the game last night?"]
```
നിങ്ങൾക്ക് സഹായം നൽകാൻ ചില സാമ്പിൾ ഔട്ട്പുട്ട് (ഉപയോക്തൃ ഇൻപുട്ട് `>` അടിയന്തിര വരികളിലാണ്):
```output
Hello, I am Marvin, the simple robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?
> I am good thanks
That is quite interesting, please tell me more.
> today I went for a walk
Did you catch the game last night?
> I did, but my team lost
Funny weather we've been having, isn't it?
> yes but I hope next week is better
Let's change the subject.
> ok, lets talk about music
Why do you say that?
> because I like music!
Why do you say that?
> bye
It was nice talking to you, goodbye!
```
ഈ ടാസ്കിന് ഒരു സാധ്യതയുള്ള പരിഹാരം [ഇവിടെ](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py) കാണാം
✅ നിർത്തി ചിന്തിക്കുക
1. യാദൃച്ഛിക മറുപടികൾ ബോട്ട് അവരെ മനസ്സിലാക്കിയതായി തോന്നിക്കാൻ 'തട്ടിപ്പു' ചെയ്യുമോ എന്ന് നിങ്ങൾ കരുതുന്നുണ്ടോ?
2. ബോട്ട് കൂടുതൽ ഫലപ്രദമാകാൻ എന്ത് സവിശേഷതകൾ വേണം?
3. ഒരു ബോട്ട് വാചകത്തിന്റെ അർത്ഥം യഥാർത്ഥത്തിൽ 'മനസ്സിലാക്കുകയാണെങ്കിൽ', സംഭാഷണത്തിലെ മുൻവാചകങ്ങളുടെ അർത്ഥം 'ഓർമ്മിക്കാൻ' അതിന് ആവശ്യമുണ്ടോ?
---
## 🚀ചലഞ്ച്
മുകളിൽ "നിർത്തി ചിന്തിക്കുക" എന്ന ഘടകങ്ങളിൽ ഒന്നിനെ തിരഞ്ഞെടുക്കുക, അതിനെ കോഡിൽ നടപ്പിലാക്കാൻ ശ്രമിക്കുക അല്ലെങ്കിൽ പുസ്‌തകത്തിൽ പ്യൂഡോകോഡ് ഉപയോഗിച്ച് പരിഹാരം എഴുതുക.
അടുത്ത പാഠത്തിൽ, സ്വാഭാവിക ഭാഷ പാഴ്സിംഗിനും മെഷീൻ ലേണിംഗിനും മറ്റ് പല സമീപനങ്ങളും നിങ്ങൾ പഠിക്കും.
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
താഴെ കൊടുത്തിരിക്കുന്ന റഫറൻസുകൾ കൂടുതൽ വായനാ അവസരങ്ങളായി കാണുക.
### റഫറൻസുകൾ
1. ഷുബർട്ട്, ലെൻഹാർട്ട്, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), എഡ്വാർഡ് എൻ. സാൽറ്റ (എഡിറ്റർ), URL = <https://plato.stanford.edu/archives/spr2020/entries/computational-linguistics/>.
2. പ്രിൻസ്ടൺ യൂണിവേഴ്സിറ്റി "About WordNet." [WordNet](https://wordnet.princeton.edu/). പ്രിൻസ്ടൺ യൂണിവേഴ്സിറ്റി. 2010.
## അസൈൻമെന്റ്
[ഒരു ബോട്ട് തിരയുക](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ പ്രാമാണികമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1d7583e8046dacbb0c056d5ba0a71b16",
"translation_date": "2025-12-19T14:30:51+00:00",
"source_file": "6-NLP/1-Introduction-to-NLP/assignment.md",
"language_code": "ml"
}
-->
# ഒരു ബോട്ട് കണ്ടെത്തുക
## നിർദ്ദേശങ്ങൾ
ബോട്ടുകൾ എല്ലായിടത്തും ഉണ്ട്. നിങ്ങളുടെ ജോലി: ഒരു ബോട്ട് കണ്ടെത്തി അതിനെ സ്വീകരിക്കുക! നിങ്ങൾക്ക് അവയെ വെബ്‌സൈറ്റുകളിൽ, ബാങ്കിംഗ് ആപ്ലിക്കേഷനുകളിൽ, ഫോണിൽ, ഉദാഹരണത്തിന് സാമ്പത്തിക സേവന കമ്പനികളുമായി ബന്ധപ്പെടുമ്പോൾ ഉപദേശം അല്ലെങ്കിൽ അക്കൗണ്ട് വിവരങ്ങൾ ചോദിക്കുമ്പോൾ കണ്ടെത്താൻ കഴിയും. ബോട്ട് വിശകലനം ചെയ്ത് നിങ്ങൾ അതിനെ ആശയക്കുഴപ്പത്തിലാക്കാൻ കഴിയുമോ എന്ന് നോക്കുക. നിങ്ങൾക്ക് ബോട്ട് ആശയക്കുഴപ്പത്തിലായെങ്കിൽ, അത് എന്തുകൊണ്ടാണ് സംഭവിച്ചത് എന്ന് നിങ്ങൾ കരുതുന്നത്? നിങ്ങളുടെ അനുഭവത്തെക്കുറിച്ച് ഒരു ചെറിയ പ്രബന്ധം എഴുതുക.
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണാർത്ഥം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------- |
| | ഒരു പൂർണ്ണ പേജ് പ്രബന്ധം എഴുതിയിട്ടുണ്ട്, ബോട്ട് ആർക്കിടെക്ചർ അനുമാനിച്ച് വിശദീകരിക്കുകയും അതുമായി നിങ്ങളുടെ അനുഭവം രേഖപ്പെടുത്തുകയും ചെയ്യുന്നു | പ്രബന്ധം അപൂർണ്ണമാണ് അല്ലെങ്കിൽ നന്നായി ഗവേഷണം ചെയ്തിട്ടില്ല | പ്രബന്ധം സമർപ്പിച്ചിട്ടില്ല |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,230 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "5f3cb462e3122e1afe7ab0050ccf2bd3",
"translation_date": "2025-12-19T14:33:44+00:00",
"source_file": "6-NLP/2-Tasks/README.md",
"language_code": "ml"
}
-->
# സാധാരണ സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ് ടാസ്കുകളും സാങ്കേതിക വിദ്യകളും
മിക്കവാറും *സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ്* ടാസ്കുകൾക്കായി, പ്രോസസ്സ് ചെയ്യേണ്ട ടെക്സ്റ്റ് വിഭജിച്ച്, പരിശോധിച്ച്, ഫലങ്ങൾ നിയമങ്ങളുമായി ഡാറ്റാ സെറ്റുകളുമായി ക്രോസ് റഫറൻസ് ചെയ്യണം. ഈ ടാസ്കുകൾ പ്രോഗ്രാമറിന് ടെക്സ്റ്റിലെ _അർത്ഥ_ അല്ലെങ്കിൽ _ഉദ്ദേശ്യ_ അല്ലെങ്കിൽ വെറും _പരിഭാഷയുടെ ആവൃത്തി_ കണ്ടെത്താൻ സഹായിക്കുന്നു.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
ടെക്സ്റ്റ് പ്രോസസ്സിംഗിൽ ഉപയോഗിക്കുന്ന സാധാരണ സാങ്കേതിക വിദ്യകൾ കണ്ടെത്താം. മെഷീൻ ലേണിങ്ങുമായി ചേർന്ന്, ഈ സാങ്കേതിക വിദ്യകൾ വലിയ തോതിലുള്ള ടെക്സ്റ്റ് കാര്യക്ഷമമായി വിശകലനം ചെയ്യാൻ സഹായിക്കുന്നു. എന്നാൽ ML ഈ ടാസ്കുകളിൽ പ്രയോഗിക്കുന്നതിന് മുമ്പ്, NLP വിദഗ്ധൻ നേരിടുന്ന പ്രശ്നങ്ങൾ മനസ്സിലാക്കാം.
## NLP-യ്ക്ക് സാധാരണമായ ടാസ്കുകൾ
നിങ്ങൾ പ്രവർത്തിക്കുന്ന ടെക്സ്റ്റ് വിശകലനം ചെയ്യാനുള്ള വ്യത്യസ്ത മാർഗ്ഗങ്ങൾ ഉണ്ട്. നിങ്ങൾ ചെയ്യാവുന്ന ടാസ്കുകൾ ഉണ്ട്, ഈ ടാസ്കുകൾ വഴി ടെക്സ്റ്റിന്റെ മനസ്സിലാക്കലും നിഗമനങ്ങളും വരുത്താൻ കഴിയും. സാധാരണയായി ഈ ടാസ്കുകൾ ഒരു ക്രമത്തിൽ നടത്തപ്പെടുന്നു.
### ടോക്കനൈസേഷൻ
ഏതാണ്ട് എല്ലാ NLP ആൽഗോരിതങ്ങൾക്കും ആദ്യം ചെയ്യേണ്ടത് ടെക്സ്റ്റ് ടോക്കണുകളായി, അല്ലെങ്കിൽ വാക്കുകളായി വിഭജിക്കുക എന്നതാണ്. ഇത് ലളിതമായതായി തോന്നിയാലും, പദവിരാമം, വ്യത്യസ്ത ഭാഷകളിലെ വാക്കുകളും വാക്യവിരാമങ്ങളും പരിഗണിക്കേണ്ടത് സങ്കീർണ്ണമാക്കാം. വ്യത്യസ്ത മാർഗ്ഗങ്ങൾ ഉപയോഗിച്ച് വിഭജനം നിർണയിക്കേണ്ടിവരും.
![tokenization](../../../../translated_images/tokenization.1641a160c66cd2d93d4524e8114e93158a9ce0eba3ecf117bae318e8a6ad3487.ml.png)
> **Pride and Prejudice** എന്ന പുസ്തകത്തിലെ ഒരു വാക്യം ടോക്കൺ ചെയ്യുന്നു. ഇൻഫോഗ്രാഫിക് [Jen Looper](https://twitter.com/jenlooper)
### എംബെഡ്ഡിംഗ്സ്
[വേർഡ് എംബെഡ്ഡിംഗ്സ്](https://wikipedia.org/wiki/Word_embedding) നിങ്ങളുടെ ടെക്സ്റ്റ് ഡാറ്റ സംഖ്യാത്മകമായി മാറ്റാനുള്ള ഒരു മാർഗ്ഗമാണ്. സമാന അർത്ഥമുള്ള വാക്കുകൾ അല്ലെങ്കിൽ ഒരുമിച്ച് ഉപയോഗിക്കുന്ന വാക്കുകൾ കൂട്ടമായി ക്ലസ്റ്റർ ചെയ്യപ്പെടുന്ന രീതിയിൽ എംബെഡ്ഡിംഗ്സ് ചെയ്യപ്പെടുന്നു.
![word embeddings](../../../../translated_images/embedding.2cf8953c4b3101d188c2f61a5de5b6f53caaa5ad4ed99236d42bc3b6bd6a1fe2.ml.png)
> "I have the highest respect for your nerves, they are my old friends." - **Pride and Prejudice** എന്ന വാക്യത്തിനുള്ള വാക്കുകളുടെ എംബെഡ്ഡിംഗ്സ്. ഇൻഫോഗ്രാഫിക് [Jen Looper](https://twitter.com/jenlooper)
✅ വാക്കുകളുടെ എംബെഡ്ഡിംഗ്സ് പരീക്ഷിക്കാൻ [ഈ രസകരമായ ടൂൾ](https://projector.tensorflow.org/) പരീക്ഷിക്കൂ. ഒരു വാക്കിൽ ക്ലിക്ക് ചെയ്യുമ്പോൾ സമാന വാക്കുകളുടെ ക്ലസ്റ്ററുകൾ കാണാം: 'toy' 'disney', 'lego', 'playstation', 'console' എന്നിവയുമായി ക്ലസ്റ്റർ ചെയ്യുന്നു.
### പാർസിംഗ് & പാർട്ട്-ഓഫ്-സ്പീച്ച് ടാഗിംഗ്
ടോക്കൺ ചെയ്ത ഓരോ വാക്കും വാക്കിന്റെ ഭാഗമായി ടാഗ് ചെയ്യാം - നാമം, ക്രിയ, വിശേഷണം എന്നിവ. `the quick red fox jumped over the lazy brown dog` എന്ന വാക്യം fox = നാമം, jumped = ക്രിയ എന്നിങ്ങനെ POS ടാഗ് ചെയ്യാം.
![parsing](../../../../translated_images/parse.d0c5bbe1106eae8fe7d60a183cd1736c8b6cec907f38000366535f84f3036101.ml.png)
> **Pride and Prejudice** എന്ന വാക്യം പാർസ് ചെയ്യുന്നു. ഇൻഫോഗ്രാഫിക് [Jen Looper](https://twitter.com/jenlooper)
പാർസിംഗ് വാക്യത്തിലെ വാക്കുകൾ തമ്മിൽ എങ്ങനെ ബന്ധപ്പെട്ടിരിക്കുന്നു എന്ന് തിരിച്ചറിയലാണ് - ഉദാഹരണത്തിന് `the quick red fox jumped` എന്നത് വിശേഷണം-നാമം-ക്രിയ ക്രമമാണ്, ഇത് `lazy brown dog` എന്ന ക്രമത്തിൽ നിന്ന് വേർതിരിച്ചിരിക്കുന്നു.
### വാക്കുകളും വാചകങ്ങളും ആവൃത്തി
വലിയ ടെക്സ്റ്റ് വിശകലനം ചെയ്യുമ്പോൾ, ഓരോ വാക്കിന്റെയും വാചകത്തിന്റെയും ആവൃത്തി എത്രയാണെന്ന് ഒരു നിഘണ്ടു നിർമ്മിക്കുന്നത് ഉപകാരപ്രദമാണ്. `the quick red fox jumped over the lazy brown dog` എന്ന വാചകത്തിൽ the എന്ന വാക്കിന്റെ ആവൃത്തി 2 ആണ്.
വാക്കുകളുടെ ആവൃത്തി എണ്ണുന്ന ഒരു ഉദാഹരണം നോക്കാം. റുഡ്യാർഡ് കിപ്ലിങ്ങിന്റെ കവിത The Winners-ൽ താഴെ പറയുന്ന വരികൾ ഉണ്ട്:
```output
What the moral? Who rides may read.
When the night is thick and the tracks are blind
A friend at a pinch is a friend, indeed,
But a fool to wait for the laggard behind.
Down to Gehenna or up to the Throne,
He travels the fastest who travels alone.
```
വാചകങ്ങളുടെ ആവൃത്തി ആവശ്യാനുസരണം കേസ് ഇൻസെൻസിറ്റീവ് അല്ലെങ്കിൽ കേസ് സെൻസിറ്റീവ് ആകാം, `a friend` എന്ന വാചകത്തിന്റെ ആവൃത്തി 2 ആണ്, `the` 6 ആണ്, `travels` 2 ആണ്.
### എൻ-ഗ്രാമുകൾ
ഒരു ടെക്സ്റ്റ് നിശ്ചിത നീളമുള്ള വാക്കുകളുടെ ക്രമങ്ങളായി വിഭജിക്കാം, ഒറ്റ വാക്ക് (യൂണിഗ്രാം), രണ്ട് വാക്കുകൾ (ബൈഗ്രാമുകൾ), മൂന്ന് വാക്കുകൾ (ട്രൈഗ്രാമുകൾ) അല്ലെങ്കിൽ ഏതെങ്കിലും എണ്ണം വാക്കുകൾ (എൻ-ഗ്രാമുകൾ).
ഉദാഹരണത്തിന് `the quick red fox jumped over the lazy brown dog` എന്ന വാചകത്തിൽ എൻ-ഗ്രാം സ്കോർ 2 ഉപയോഗിച്ചാൽ താഴെ പറയുന്ന എൻ-ഗ്രാമുകൾ ഉണ്ടാകും:
1. the quick
2. quick red
3. red fox
4. fox jumped
5. jumped over
6. over the
7. the lazy
8. lazy brown
9. brown dog
ഇത് ഒരു സ്ലൈഡിംഗ് ബോക്സ് പോലെ വാക്യത്തിൽ സ്ലൈഡ് ചെയ്യുന്നതായി കാണിക്കാം. 3 വാക്കുകളുടെ എൻ-ഗ്രാമുകൾക്ക് ഉദാഹരണം, ഓരോ വാക്യത്തിലും എൻ-ഗ്രാം ബോൾഡ് ചെയ്തിരിക്കുന്നു:
1. <u>**the quick red**</u> fox jumped over the lazy brown dog
2. the **<u>quick red fox</u>** jumped over the lazy brown dog
3. the quick **<u>red fox jumped</u>** over the lazy brown dog
4. the quick red **<u>fox jumped over</u>** the lazy brown dog
5. the quick red fox **<u>jumped over the</u>** lazy brown dog
6. the quick red fox jumped **<u>over the lazy</u>** brown dog
7. the quick red fox jumped over <u>**the lazy brown**</u> dog
8. the quick red fox jumped over the **<u>lazy brown dog</u>**
![n-grams sliding window](../../../../6-NLP/2-Tasks/images/n-grams.gif)
> എൻ-ഗ്രാം മൂല്യം 3: ഇൻഫോഗ്രാഫിക് [Jen Looper](https://twitter.com/jenlooper)
### നാമവാചക വാചകങ്ങൾ എക്സ്ട്രാക്ഷൻ
മിക്കവാറും വാക്യങ്ങളിൽ ഒരു നാമം ഉണ്ട്, അത് വാക്യത്തിന്റെ വിഷയം അല്ലെങ്കിൽ വസ്തുവാണ്. ഇംഗ്ലീഷിൽ, സാധാരണയായി 'a' അല്ലെങ്കിൽ 'an' അല്ലെങ്കിൽ 'the' മുൻപിൽ വരുന്നതായി തിരിച്ചറിയാം. വാക്യത്തിന്റെ അർത്ഥം മനസ്സിലാക്കാൻ ശ്രമിക്കുമ്പോൾ 'നാമവാചക വാചകം എക്സ്ട്രാക്റ്റ് ചെയ്യൽ' എന്നത് സാധാരണ ടാസ്കാണ്.
✅ "I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun." എന്ന വാക്യത്തിൽ നാമവാചക വാചകങ്ങൾ തിരിച്ചറിയാമോ?
`the quick red fox jumped over the lazy brown dog` എന്ന വാക്യത്തിൽ 2 നാമവാചക വാചകങ്ങൾ ഉണ്ട്: **quick red fox** and **lazy brown dog**.
### സന്റിമെന്റ് അനാലിസിസ്
ഒരു വാക്യം അല്ലെങ്കിൽ ടെക്സ്റ്റ് സന്റിമെന്റ് അനാലിസിസ് ചെയ്യാം, അതായത് അത് എത്രത്തോളം *സ pozitive* അല്ലെങ്കിൽ *negative* ആണെന്ന്. സന്റിമെന്റ് *പോളാരിറ്റി*യും *ഓബ്ജക്റ്റിവിറ്റി/സബ്ജക്റ്റിവിറ്റി*യും ഉപയോഗിച്ച് അളക്കുന്നു. പോളാരിറ്റി -1.0 മുതൽ 1.0 വരെ (നെഗറ്റീവ് മുതൽ പോസിറ്റീവ് വരെ) അളക്കുന്നു, 0.0 മുതൽ 1.0 വരെ (മികച്ച ഓബ്ജക്റ്റീവ് മുതൽ ഏറ്റവും സബ്ജക്റ്റീവ് വരെ) അളക്കുന്നു.
✅ പിന്നീട് നിങ്ങൾക്ക് മെഷീൻ ലേണിങ്ങ് ഉപയോഗിച്ച് സന്റിമെന്റ് നിർണയിക്കുന്ന വ്യത്യസ്ത മാർഗ്ഗങ്ങൾ പഠിക്കാം, എന്നാൽ ഒരു മാർഗ്ഗം മനുഷ്യ വിദഗ്ധൻ പോസിറ്റീവ് അല്ലെങ്കിൽ നെഗറ്റീവ് ആയി വർഗ്ഗീകരിച്ച വാക്കുകളും വാചകങ്ങളും ഉള്ള ലിസ്റ്റ് ഉപയോഗിച്ച് ആ മോഡൽ ടെക്സ്റ്റിൽ പ്രയോഗിച്ച് പോളാരിറ്റി സ്കോർ കണക്കാക്കുകയാണ്. ചില സാഹചര്യങ്ങളിൽ ഇത് എങ്ങനെ പ്രവർത്തിക്കുമെന്ന് നിങ്ങൾക്ക് കാണാമോ? ചിലപ്പോൾ കുറവായി?
### ഇൻഫ്ലെക്ഷൻ
ഇൻഫ്ലെക്ഷൻ ഒരു വാക്കിന്റെ ഏകവചനം അല്ലെങ്കിൽ ബഹുവചനം കണ്ടെത്താൻ സഹായിക്കുന്നു.
### ലെമ്മറ്റൈസേഷൻ
*ലെമ്മ* എന്നത് വാക്കുകളുടെ ഒരു കൂട്ടത്തിനുള്ള മൂല വാക്ക് അല്ലെങ്കിൽ ഹെഡ്‌വേഡ് ആണ്, ഉദാഹരണത്തിന് *flew*, *flies*, *flying* എന്നവയ്ക്ക് *fly* എന്ന ക്രിയയുടെ ലെമ്മ ഉണ്ട്.
NLP ഗവേഷകർക്കായി ചില ഉപകാരപ്രദമായ ഡാറ്റാബേസുകളും ലഭ്യമാണ്, പ്രത്യേകിച്ച്:
### വേഡ്‌നെറ്റ്
[WordNet](https://wordnet.princeton.edu/) പല ഭാഷകളിലെ ഓരോ വാക്കിനും പദസമാനാർത്ഥങ്ങൾ, വിരുദ്ധാർത്ഥങ്ങൾ, മറ്റ് വിവരങ്ങൾ ഉൾക്കൊള്ളുന്ന ഒരു ഡാറ്റാബേസ് ആണ്. വിവർത്തനങ്ങൾ, സ്പെൽ ചെക്കറുകൾ, ഭാഷാ ഉപകരണങ്ങൾ നിർമ്മിക്കുമ്പോൾ ഇത് വളരെ ഉപകാരപ്രദമാണ്.
## NLP ലൈബ്രറികൾ
സൗഭാഗ്യവശാൽ, ഈ സാങ്കേതിക വിദ്യകൾ എല്ലാം നിങ്ങൾ തന്നെ നിർമ്മിക്കേണ്ടതില്ല, കാരണം സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ് അല്ലെങ്കിൽ മെഷീൻ ലേണിങ്ങിൽ വിദഗ്ധരല്ലാത്ത ഡെവലപ്പർമാർക്കും ഇത് എളുപ്പത്തിൽ ഉപയോഗിക്കാവുന്ന മികച്ച Python ലൈബ്രറികൾ ലഭ്യമാണ്. അടുത്ത പാഠങ്ങളിൽ ഇതിന്റെ കൂടുതൽ ഉദാഹരണങ്ങൾ ഉൾപ്പെടും, എന്നാൽ ഇവിടെ അടുത്ത ടാസ്കിന് സഹായകമായ ചില ഉദാഹരണങ്ങൾ പഠിക്കാം.
### വ്യായാമം - `TextBlob` ലൈബ്രറി ഉപയോഗിച്ച്
TextBlob എന്ന ലൈബ്രറി ഉപയോഗിക്കാം, കാരണം ഇത് ഈ തരം ടാസ്കുകൾ കൈകാര്യം ചെയ്യാൻ സഹായിക്കുന്ന APIകൾ ഉൾക്കൊള്ളുന്നു. TextBlob "വലിയ [NLTK](https://nltk.org)യും [pattern](https://github.com/clips/pattern) ഉം ഉപയോഗിച്ച് പ്രവർത്തിക്കുന്നു." അതിന്റെ APIയിൽ വലിയ തോതിൽ ML ഉൾപ്പെടുത്തിയിട്ടുണ്ട്.
> കുറിപ്പ്: TextBlob-ന് അനുയോജ്യമായ [ക്വിക്ക് സ്റ്റാർട്ട്](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) ഗൈഡ് പരിചയസമ്പന്നരായ Python ഡെവലപ്പർമാർക്ക് ശുപാർശ ചെയ്യുന്നു
*നാമവാചക വാചകങ്ങൾ* തിരിച്ചറിയാൻ ശ്രമിക്കുമ്പോൾ, TextBlob നാമവാചക വാചകങ്ങൾ കണ്ടെത്താൻ വിവിധ എക്സ്ട്രാക്ടറുകൾ നൽകുന്നു.
1. `ConllExtractor` നോക്കൂ.
```python
from textblob import TextBlob
from textblob.np_extractors import ConllExtractor
# പിന്നീട് ഉപയോഗിക്കാൻ Conll എക്സ്ട്രാക്ടർ ഇറക്കുമതി ചെയ്ത് സൃഷ്ടിക്കുക
extractor = ConllExtractor()
# പിന്നീട് നിങ്ങൾക്ക് ഒരു നൗൺ ഫ്രേസ് എക്സ്ട്രാക്ടർ ആവശ്യമുള്ളപ്പോൾ:
user_input = input("> ")
user_input_blob = TextBlob(user_input, np_extractor=extractor) # ഡിഫോൾട്ട് അല്ലാത്ത എക്സ്ട്രാക്ടർ വ്യക്തമാക്കിയിരിക്കുന്നു
np = user_input_blob.noun_phrases
```
> ഇവിടെ എന്താണ് നടക്കുന്നത്? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) "ConLL-2000 പരിശീലന കോർപ്പസ് ഉപയോഗിച്ച് ട്രെയിൻ ചെയ്ത ചങ്ക് പാർസിംഗ് ഉപയോഗിക്കുന്ന നാമവാചക വാചക എക്സ്ട്രാക്ടറാണ്." ConLL-2000 2000-ലെ Computational Natural Language Learning സമ്മേളനത്തെ സൂചിപ്പിക്കുന്നു. ഓരോ വർഷവും NLP പ്രശ്നം പരിഹരിക്കാൻ ഒരു വർക്ക്‌ഷോപ്പ് സംഘടിപ്പിച്ചിരുന്നു, 2000-ൽ അത് നാമ ചങ്കിംഗ് ആയിരുന്നു. വാൾ സ്ട്രീറ്റ് ജേർണലിൽ പരിശീലനം നടത്തി, "വിഭാഗങ്ങൾ 15-18 പരിശീലന ഡാറ്റയായി (211727 ടോക്കണുകൾ) 20-ാം വിഭാഗം ടെസ്റ്റ് ഡാറ്റയായി (47377 ടോക്കണുകൾ)" ഉപയോഗിച്ചു. ഉപയോഗിച്ച പ്രക്രിയകൾ [ഇവിടെ](https://www.clips.uantwerpen.be/conll2000/chunking/) കാണാം, ഫലങ്ങൾ [ഇവിടെ](https://ifarm.nl/erikt/research/np-chunking.html).
### ചലഞ്ച് - NLP ഉപയോഗിച്ച് നിങ്ങളുടെ ബോട്ട് മെച്ചപ്പെടുത്തൽ
മുൻപത്തെ പാഠത്തിൽ നിങ്ങൾ വളരെ ലളിതമായ ഒരു Q&A ബോട്ട് നിർമ്മിച്ചു. ഇപ്പോൾ, നിങ്ങളുടെ ഇൻപുട്ട് സന്റിമെന്റ് അനാലിസിസ് ചെയ്ത് അതിനനുസരിച്ച് പ്രതികരണം പ്രിന്റ് ചെയ്ത് മാർവിൻ കൂടുതൽ സഹാനുഭൂതിയുള്ളവനാക്കാം. കൂടാതെ, ഒരു `noun_phrase` തിരിച്ചറിയുകയും അതിനെക്കുറിച്ച് കൂടുതൽ ചോദിക്കുകയും ചെയ്യണം.
മികച്ച സംഭാഷണ ബോട്ട് നിർമ്മിക്കുമ്പോൾ നിങ്ങളുടെ ഘട്ടങ്ങൾ:
1. ഉപയോക്താവിന് ബോട്ടുമായി എങ്ങനെ ഇടപഴകണമെന്ന് നിർദ്ദേശങ്ങൾ പ്രിന്റ് ചെയ്യുക
2. ലൂപ്പ് ആരംഭിക്കുക
1. ഉപയോക്തൃ ഇൻപുട്ട് സ്വീകരിക്കുക
2. ഉപയോക്താവ് പുറത്തുപോകാൻ ആവശ്യപ്പെട്ടാൽ, പുറത്തുകടക്കുക
3. ഉപയോക്തൃ ഇൻപുട്ട് പ്രോസസ്സ് ചെയ്ത് അനുയോജ്യമായ സന്റിമെന്റ് പ്രതികരണം നിർണയിക്കുക
4. സന്റിമെന്റിൽ നാമവാചക വാചകം കണ്ടെത്തിയാൽ അത് ബഹുവചനം ആക്കുകയും ആ വിഷയം കുറിച്ച് കൂടുതൽ ചോദിക്കുകയും ചെയ്യുക
5. പ്രതികരണം പ്രിന്റ് ചെയ്യുക
3. ഘട്ടം 2-ലേക്ക് മടങ്ങുക
TextBlob ഉപയോഗിച്ച് സന്റിമെന്റ് നിർണയിക്കുന്ന കോഡ് സ്നിപ്പെറ്റ് ഇവിടെ. സന്റിമെന്റ് പ്രതികരണത്തിന് നാല് *ഗ്രേഡിയന്റുകൾ* മാത്രമേ ഉള്ളൂ (നിങ്ങൾക്ക് കൂടുതൽ വേണമെങ്കിൽ ഉണ്ടാക്കാം):
```python
if user_input_blob.polarity <= -0.5:
response = "Oh dear, that sounds bad. "
elif user_input_blob.polarity <= 0:
response = "Hmm, that's not great. "
elif user_input_blob.polarity <= 0.5:
response = "Well, that sounds positive. "
elif user_input_blob.polarity <= 1:
response = "Wow, that sounds great. "
```
നിങ്ങൾക്ക് സഹായകമായ ചില സാമ്പിൾ ഔട്ട്പുട്ട് (ഉപയോക്തൃ ഇൻപുട്ട് > അടിയന്തിര വരികളിലാണ്):
```output
Hello, I am Marvin, the friendly robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?
> I am ok
Well, that sounds positive. Can you tell me more?
> I went for a walk and saw a lovely cat
Well, that sounds positive. Can you tell me more about lovely cats?
> cats are the best. But I also have a cool dog
Wow, that sounds great. Can you tell me more about cool dogs?
> I have an old hounddog but he is sick
Hmm, that's not great. Can you tell me more about old hounddogs?
> bye
It was nice talking to you, goodbye!
```
ടാസ്കിന് ഒരു സാധ്യതയുള്ള പരിഹാരം [ഇവിടെ](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py) കാണാം
✅ അറിവ് പരിശോധിക്കൽ
1. സഹാനുഭൂതിയുള്ള പ്രതികരണങ്ങൾ ബോട്ട് അവരെ യഥാർത്ഥത്തിൽ മനസ്സിലാക്കിയതായി 'മോഷ്ടിക്കുമോ' എന്ന് നിങ്ങൾ കരുതുന്നുണ്ടോ?
2. നാമവാചക വാചകം തിരിച്ചറിയുന്നത് ബോട്ടിനെ കൂടുതൽ 'വിശ്വസനീയമാക്കുമോ'?
3. ഒരു വാക്യത്തിൽ നിന്ന് 'നാമവാചക വാചകം' എടുക്കുന്നത് എന്തുകൊണ്ട് ഉപകാരപ്രദമാണ്?
---
മുൻ അറിവ് പരിശോധിക്കൽയിൽ ബോട്ട് നടപ്പിലാക്കി ഒരു സുഹൃത്തിന്മേൽ പരീക്ഷിക്കൂ. അത് അവരെ മോഷ്ടിക്കുമോ? നിങ്ങൾക്ക് നിങ്ങളുടെ ബോട്ട് കൂടുതൽ 'വിശ്വസനീയമാക്കാനാകുമോ'?
## 🚀ചലഞ്ച്
മുൻ അറിവ് പരിശോധിക്കൽയിലെ ഒരു ടാസ്ക് എടുത്ത് നടപ്പിലാക്കാൻ ശ്രമിക്കൂ. ബോട്ട് ഒരു സുഹൃത്തിന്മേൽ പരീക്ഷിക്കൂ. അത് അവരെ മോഷ്ടിക്കുമോ? നിങ്ങൾക്ക് നിങ്ങളുടെ ബോട്ട് കൂടുതൽ 'വിശ്വസനീയമാക്കാനാകുമോ'?
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
അടുത്ത കുറച്ച് പാഠങ്ങളിൽ നിങ്ങൾ സന്റിമെന്റ് അനാലിസിസിനെക്കുറിച്ച് കൂടുതൽ പഠിക്കും. [KDNuggets](https://www.kdnuggets.com/tag/nlp) പോലുള്ള ലേഖനങ്ങളിൽ ഈ രസകരമായ സാങ്കേതിക വിദ്യയെക്കുറിച്ച് ഗവേഷണം നടത്തുക.
## അസൈൻമെന്റ്
[ഒരു ബോട്ട് സംസാരിപ്പിക്കുക](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "2efc4c2aba5ed06c780c05539c492ae3",
"translation_date": "2025-12-19T14:36:36+00:00",
"source_file": "6-NLP/2-Tasks/assignment.md",
"language_code": "ml"
}
-->
# ഒരു ബോട്ട് മറുപടി പറയിക്കുക
## നിർദ്ദേശങ്ങൾ
കഴിഞ്ഞ കുറച്ച് പാഠങ്ങളിൽ, നിങ്ങൾ ഒരു അടിസ്ഥാന ബോട്ട് പ്രോഗ്രാം ചെയ്തു, അതുമായി ചാറ്റ് ചെയ്യാൻ. ഈ ബോട്ട് 'bye' എന്ന് പറയുന്നത് വരെ യാദൃച്ഛികമായ ഉത്തരങ്ങൾ നൽകുന്നു. നിങ്ങൾ പറയുന്ന പ്രത്യേക വാക്കുകൾക്ക്, ഉദാഹരണത്തിന് 'why' അല്ലെങ്കിൽ 'how', മറുപടികൾ സജീവമാക്കാൻ നിങ്ങൾക്ക് കഴിയുമോ? നിങ്ങളുടെ ബോട്ട് വികസിപ്പിക്കുമ്പോൾ ഈ തരം ജോലി കുറച്ച് മാനുവൽ ആക്കാൻ മെഷീൻ ലേണിംഗ് എങ്ങനെ സഹായിക്കാമെന്ന് കുറച്ച് ചിന്തിക്കുക. നിങ്ങളുടെ ജോലികൾ എളുപ്പമാക്കാൻ NLTK അല്ലെങ്കിൽ TextBlob ലൈബ്രറികൾ ഉപയോഗിക്കാം.
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണപരമായത് | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | --------------------------------------------- | ------------------------------------------------ | ----------------------- |
| | പുതിയ bot.py ഫയൽ അവതരിപ്പിക്കുകയും രേഖപ്പെടുത്തുകയും ചെയ്യുന്നു | പുതിയ ബോട്ട് ഫയൽ അവതരിപ്പിച്ചെങ്കിലും ബഗുകൾ അടങ്ങിയിരിക്കുന്നു | ഫയൽ അവതരിപ്പിച്ചിട്ടില്ല |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,202 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "be03c8182982b87ced155e4e9d1438e8",
"translation_date": "2025-12-19T14:16:31+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/README.md",
"language_code": "ml"
}
-->
# ML ഉപയോഗിച്ച് വിവർത്തനവും മനോഭാവ വിശകലനവും
മുൻപത്തെ പാഠങ്ങളിൽ നിങ്ങൾ `TextBlob` ഉപയോഗിച്ച് ഒരു അടിസ്ഥാന ബോട്ട് എങ്ങനെ നിർമ്മിക്കാമെന്ന് പഠിച്ചു, ഇത് നൗൺ ഫ്രേസ് എക്സ്ട്രാക്ഷൻ പോലുള്ള അടിസ്ഥാന NLP പ്രവർത്തനങ്ങൾ നടത്താൻ ML പിന്നിൽ ഉൾപ്പെടുത്തിയ ഒരു ലൈബ്രറിയാണ്. കംപ്യൂട്ടേഷണൽ ലിംഗ്വിസ്റ്റിക്സിലെ മറ്റൊരു പ്രധാന വെല്ലുവിളി ഒരു സംസാരിച്ചോ എഴുതിയോ ഭാഷയിൽ നിന്നു മറ്റൊരു ഭാഷയിലേക്ക് വാചകത്തിന്റെ കൃത്യമായ _വിവർത്തന_ ആണ്.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
വിവർത്തനം വളരെ കഠിനമായ പ്രശ്നമാണ്, കാരണം ആയിരക്കണക്കിന് ഭാഷകൾ ഉണ്ട്, ഓരോന്നിന്റെയും വ്യത്യസ്ത വ്യാകരണ നിയമങ്ങൾ ഉണ്ടാകാം. ഒരു സമീപനം ഒരു ഭാഷയുടെ ഔപചാരിക വ്യാകരണ നിയമങ്ങൾ, ഉദാഹരണത്തിന് ഇംഗ്ലീഷ്, ഒരു ഭാഷ-സ്വതന്ത്ര ഘടനയിലേക്ക് മാറ്റി, പിന്നീട് മറ്റൊരു ഭാഷയിലേക്ക് തിരിച്ചുവിവർത്തനം ചെയ്യുക എന്നതാണ്. ഈ സമീപനം നിങ്ങൾക്ക് താഴെപ്പറയുന്ന ഘട്ടങ്ങൾ സ്വീകരിക്കേണ്ടതുണ്ടെന്ന് സൂചിപ്പിക്കുന്നു:
1. **അറിയുക**. ഇൻപുട്ട് ഭാഷയിലെ വാക്കുകൾ നൗൺ, ക്രിയ തുടങ്ങിയവയായി തിരിച്ചറിയുക അല്ലെങ്കിൽ ടാഗ് ചെയ്യുക.
2. **വിവർത്തനം സൃഷ്ടിക്കുക**. ലക്ഷ്യഭാഷയുടെ ഫോർമാറ്റിൽ ഓരോ വാക്കിന്റെയും നേരിട്ടുള്ള വിവർത്തനം ഉത്പാദിപ്പിക്കുക.
### ഉദാഹരണ വാചകം, ഇംഗ്ലീഷിൽ നിന്ന് അയറിഷിലേക്ക്
'ഇംഗ്ലീഷ്' ഭാഷയിൽ, വാചകം _I feel happy_ മൂന്ന് വാക്കുകളാണ് ക്രമത്തിൽ:
- **വിഷയം** (I)
- **ക്രിയ** (feel)
- **വിശേഷണം** (happy)
എങ്കിലും, 'അയറിഷ്' ഭാഷയിൽ, അതേ വാചകത്തിന് വ്യത്യസ്തമായ വ്യാകരണ ഘടനയുണ്ട് - "*happy*" അല്ലെങ്കിൽ "*sad*" പോലുള്ള വികാരങ്ങൾ നിങ്ങൾക്ക് *ഉപരി* ആയി പ്രകടിപ്പിക്കപ്പെടുന്നു.
ഇംഗ്ലീഷ് വാചകം `I feel happy` അയറിഷിൽ `Tá athas orm` ആകും. ഒരു *ശബ്ദാർത്ഥ* വിവർത്തനം `Happy is upon me` ആകും.
അയറിഷ് സംസാരിക്കുന്നവർ ഇംഗ്ലീഷിലേക്ക് വിവർത്തനം ചെയ്യുമ്പോൾ വാക്കുകളും വാചക ഘടനയും വ്യത്യസ്തമായാലും വാചകത്തിന്റെ അർത്ഥം മനസ്സിലാക്കുന്നതിനാൽ `I feel happy` എന്ന് പറയും, `Happy is upon me` അല്ല.
അയറിഷ് വാചകത്തിന്റെ ഔപചാരിക ക്രമം:
- **ക്രിയ** (Tá അല്ലെങ്കിൽ is)
- **വിശേഷണം** (athas, അല്ലെങ്കിൽ happy)
- **വിഷയം** (orm, അല്ലെങ്കിൽ upon me)
## വിവർത്തനം
ഒരു നൈവ് വിവർത്തന പ്രോഗ്രാം വാക്കുകൾ മാത്രം വിവർത്തനം ചെയ്യാം, വാചക ഘടന അവഗണിച്ച്.
✅ നിങ്ങൾ ഒരു മുതിർന്നവനായി രണ്ടാമത്തെ (അല്ലെങ്കിൽ മൂന്നാമത്തെ അല്ലെങ്കിൽ കൂടുതൽ) ഭാഷ പഠിച്ചിട്ടുണ്ടെങ്കിൽ, ആദ്യം നിങ്ങളുടെ മാതൃഭാഷയിൽ ചിന്തിച്ച്, ഒരു ആശയം വാക്ക് വാക്കായി രണ്ടാമത്തെ ഭാഷയിലേക്ക് വിവർത്തനം ചെയ്ത്, പിന്നീട് അത് സംസാരിക്കാൻ തുടങ്ങിയിട്ടുണ്ടാകും. ഇത് നൈവ് വിവർത്തന കമ്പ്യൂട്ടർ പ്രോഗ്രാമുകൾ ചെയ്യുന്നതിന് സമാനമാണ്. ഈ ഘട്ടം കടന്നുപോകുന്നത് പ്രാവീണ്യം നേടാൻ പ്രധാനമാണ്!
നൈവ് വിവർത്തനം തെറ്റായ (കഴിഞ്ഞാൽ രസകരമായ) വിവർത്തനങ്ങൾക്ക് കാരണമാകും: `I feel happy` അയറിഷിൽ ശബ്ദാർത്ഥം പോലെ `Mise bhraitheann athas` ആയി വിവർത്തനം ചെയ്യപ്പെടുന്നു. അതിന്റെ അർത്ഥം (ശബ്ദാർത്ഥം) `me feel happy` ആണ്, ഇത് സാധുവായ അയറിഷ് വാചകം അല്ല. ഇംഗ്ലീഷും അയറിഷും അടുത്തടുത്ത ദ്വീപുകളിൽ സംസാരിക്കുന്ന ഭാഷകളായിട്ടും വ്യത്യസ്ത വ്യാകരണ ഘടനകളുള്ള വ്യത്യസ്ത ഭാഷകളാണ്.
> അയറിഷ് ഭാഷാശാസ്ത്രപരമ്പരകളെക്കുറിച്ച് [ഇവിടെ](https://www.youtube.com/watch?v=mRIaLSdRMMs) ചില വീഡിയോകൾ കാണാം
### മെഷീൻ ലേണിംഗ് സമീപനങ്ങൾ
ഇതുവരെ, നിങ്ങൾ സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗിന് ഔപചാരിക നിയമങ്ങൾ അടിസ്ഥാനമാക്കിയ സമീപനം പഠിച്ചു. മറ്റൊരു സമീപനം വാക്കുകളുടെ അർത്ഥം അവഗണിച്ച്, പാറ്റേണുകൾ കണ്ടെത്താൻ മെഷീൻ ലേണിംഗ് ഉപയോഗിക്കുക എന്നതാണ്. ഇത് വിവർത്തനത്തിൽ പ്രവർത്തിക്കാം, നിങ്ങൾക്ക് ഉത്ഭവവും ലക്ഷ്യഭാഷയിലും ഉള്ള വലിയ വാചകശേഖരം (*corpus*) ഉണ്ടെങ്കിൽ.
ഉദാഹരണത്തിന്, 1813-ൽ ജെയിൻ ഓസ്റ്റിൻ എഴുതിയ പ്രശസ്തമായ ഇംഗ്ലീഷ് നോവൽ *Pride and Prejudice* എടുത്തു നോക്കാം. നിങ്ങൾ ഇംഗ്ലീഷിലും മനുഷ്യൻ വിവർത്തനം ചെയ്ത ഫ്രഞ്ച് പതിപ്പിലും പുസ്തകം പരിശോധിച്ചാൽ, ഒരു ഭാഷയിലെ വാചകങ്ങൾ മറ്റൊരഭാഷയിലേക്ക് _പ്രയോഗപരമായി_ വിവർത്തനം ചെയ്തിട്ടുണ്ടെന്ന് കണ്ടെത്താം. നിങ്ങൾ അത് ഉടൻ ചെയ്യാൻ പോകുന്നു.
ഉദാഹരണത്തിന്, `I have no money` എന്ന ഇംഗ്ലീഷ് വാചകം ഫ്രഞ്ചിലേക്ക് ശബ്ദാർത്ഥമായി വിവർത്തനം ചെയ്താൽ, അത് `Je n'ai pas de monnaie` ആകാം. "Monnaie" ഒരു പ്രയാസമുള്ള ഫ്രഞ്ച് 'false cognate' ആണ്, 'money' ഉം 'monnaie' ഉം സമാനാർത്ഥകങ്ങൾ അല്ല. മനുഷ്യൻ നൽകുന്ന നല്ല വിവർത്തനം `Je n'ai pas d'argent` ആകും, കാരണം ഇത് നിങ്ങൾക്ക് പണം ഇല്ല എന്ന അർത്ഥം കൂടുതൽ വ്യക്തമാക്കുന്നു ('monnaie' യുടെ അർത്ഥം 'loose change' ആണ്).
![monnaie](../../../../translated_images/monnaie.606c5fa8369d5c3b3031ef0713e2069485c87985dd475cd9056bdf4c76c1f4b8.ml.png)
> ചിത്രം [Jen Looper](https://twitter.com/jenlooper) യുടെതാണ്
ഒരു ML മോഡലിന് മനുഷ്യൻ നൽകിയ വിവർത്തനങ്ങൾ മതിയായ തോതിൽ ഉണ്ടെങ്കിൽ, അത് മുൻപ് പരിഭാഷപ്പെടുത്തിയ വാചകങ്ങളിൽ സാധാരണ പാറ്റേണുകൾ കണ്ടെത്തി വിവർത്തനങ്ങളുടെ കൃത്യത മെച്ചപ്പെടുത്താൻ കഴിയും.
### അഭ്യാസം - വിവർത്തനം
നിങ്ങൾക്ക് `TextBlob` ഉപയോഗിച്ച് വാചകങ്ങൾ വിവർത്തനം ചെയ്യാം. പ്രശസ്തമായ **Pride and Prejudice** ന്റെ ആദ്യ വരി പരീക്ഷിക്കൂ:
```python
from textblob import TextBlob
blob = TextBlob(
"It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!"
)
print(blob.translate(to="fr"))
```
`TextBlob` വിവർത്തനത്തിൽ നല്ല പ്രകടനം കാണിക്കുന്നു: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!".
വാസ്തവത്തിൽ, TextBlob ന്റെ വിവർത്തനം 1932-ലെ V. Leconte, Ch. Pressoir എന്നിവരുടെ ഫ്രഞ്ച് വിവർത്തനത്തേക്കാൾ കൂടുതൽ കൃത്യമാണ് എന്ന് വാദിക്കാം:
"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles."
ഈ സാഹചര്യത്തിൽ, ML-നിർദ്ദേശിച്ച വിവർത്തനം മനുഷ്യ വിവർത്തനക്കാരനേക്കാൾ മികച്ചതാണ്, കാരണം മനുഷ്യൻ 'വിവക്ഷത'ക്കായി എഴുത്തുകാരന്റെ വാക്കുകളിൽ അനാവശ്യമായി വാക്കുകൾ ചേർക്കുന്നു.
> എന്താണ് ഇവിടെ നടക്കുന്നത്? TextBlob വിവർത്തനത്തിൽ എങ്ങനെ ഇത്ര നല്ലതാകുന്നു? പിന്നിൽ Google translate ഉപയോഗിക്കുന്നു, ഇത് ലക്ഷക്കണക്കിന് വാചകങ്ങൾ വിശകലനം ചെയ്ത് ഏറ്റവും നല്ല വിവർത്തനങ്ങൾ പ്രവചിക്കുന്ന ഒരു സങ്കീർണ്ണ AI ആണ്. ഇതിൽ യാതൊരു മാനുവൽ പ്രവർത്തനവും ഇല്ല, `blob.translate` ഉപയോഗിക്കാൻ ഇന്റർനെറ്റ് കണക്ഷൻ വേണം.
✅ കൂടുതൽ വാചകങ്ങൾ പരീക്ഷിക്കൂ. ML-വുമോ മനുഷ്യ വിവർത്തനവുമോ മികച്ചത്? ഏത് സാഹചര്യങ്ങളിൽ?
## മനോഭാവ വിശകലനം
മെഷീൻ ലേണിംഗ് വളരെ നല്ല രീതിയിൽ പ്രവർത്തിക്കുന്ന മറ്റൊരു മേഖല മനോഭാവ വിശകലനമാണ്. ഒരു non-ML സമീപനം 'സ pozitive'യും 'negative' ഉം ആയ വാക്കുകളും വാചകങ്ങളും തിരിച്ചറിയുക എന്നതാണ്. പുതിയ ഒരു വാചകം ലഭിച്ചാൽ, പോസിറ്റീവ്, നെഗറ്റീവ്, ന്യൂട്രൽ വാക്കുകളുടെ മൊത്തം മൂല്യം കണക്കാക്കി ആകെ മനോഭാവം കണ്ടെത്തുക.
ഈ സമീപനം എളുപ്പത്തിൽ തട്ടിപ്പിലാകാം, Marvin ടാസ്കിൽ നിങ്ങൾ കണ്ടതുപോലെ - `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` എന്ന വാചകം സാർകാസം നിറഞ്ഞ നെഗറ്റീവ് മനോഭാവമുള്ളതാണ്, പക്ഷേ ലളിതമായ ആൽഗോരിതം 'great', 'wonderful', 'glad' പോസിറ്റീവ് ആയി, 'waste', 'lost', 'dark' നെഗറ്റീവ് ആയി കണ്ടെത്തുന്നു. ഈ വിരുദ്ധ വാക്കുകൾ ആകെ മനോഭാവത്തെ സ്വാധീനിക്കുന്നു.
✅ ഒരു നിമിഷം നിർത്തി മനുഷ്യർ സാർകാസം എങ്ങനെ പ്രകടിപ്പിക്കുന്നുവെന്ന് ചിന്തിക്കൂ. ടോൺ ഇൻഫ്ലെക്ഷൻ വലിയ പങ്ക് വഹിക്കുന്നു. "Well, that film was awesome" എന്ന വാചകം വ്യത്യസ്ത രീതിയിൽ പറയാൻ ശ്രമിച്ച് നിങ്ങളുടെ ശബ്ദം അർത്ഥം എങ്ങനെ കൈമാറുന്നു എന്ന് കണ്ടെത്തൂ.
### ML സമീപനങ്ങൾ
ML സമീപനം നെഗറ്റീവ്, പോസിറ്റീവ് ഉള്ള വാചകങ്ങൾ - ട്വീറ്റുകൾ, സിനിമാ അവലോകനങ്ങൾ, അല്ലെങ്കിൽ മനുഷ്യൻ സ്കോർ നൽകിയ എഴുത്ത് ഉള്ളവ - കൈമാറി ശേഖരിക്കുക എന്നതാണ്. പിന്നീട് NLP സാങ്കേതിക വിദ്യകൾ ഉപയോഗിച്ച് അഭിപ്രായങ്ങളും സ്കോറുകളും വിശകലനം ചെയ്ത് പാറ്റേണുകൾ കണ്ടെത്തും (ഉദാ: പോസിറ്റീവ് സിനിമാ അവലോകനങ്ങളിൽ 'Oscar worthy' എന്ന വാചകം നെഗറ്റീവ് അവലോകനങ്ങളിൽക്കാൾ കൂടുതലായി കാണപ്പെടും, അല്ലെങ്കിൽ പോസിറ്റീവ് റെസ്റ്റോറന്റ് അവലോകനങ്ങളിൽ 'gourmet' നെഗറ്റീവ് അവലോകനങ്ങളിൽക്കാൾ കൂടുതലായി പറയപ്പെടും).
> ⚖️ **ഉദാഹരണം**: ഒരു രാഷ്ട്രീയക്കാരന്റെ ഓഫിസിൽ നിങ്ങൾ ജോലി ചെയ്യുന്നു, പുതിയ ഒരു നിയമം ചർച്ചയിലുണ്ട്. ജനങ്ങൾ അതിനെ പിന്തുണയ്ക്കുന്ന അല്ലെങ്കിൽ എതിർക്കുന്ന ഇമെയിലുകൾ അയയ്ക്കുന്നു. നിങ്ങൾക്ക് ഇമെയിലുകൾ വായിച്ച് രണ്ട് തരം പൈലുകളായി (*for* and *against*) വേർതിരിക്കാനുള്ള ചുമതല ഉണ്ടെന്ന് കരുതുക. ഇമെയിലുകൾ 많으면 എല്ലാം വായിക്കാൻ ബുദ്ധിമുട്ടാകും. ഒരു ബോട്ട് എല്ലാം വായിച്ച് മനസ്സിലാക്കി ഏത് ഇമെയിൽ ഏത് പൈലിൽ പോകുമെന്ന് പറയുമെങ്കിൽ എത്ര നല്ലതായിരിക്കും?
>
> അതിന് മെഷീൻ ലേണിംഗ് ഉപയോഗിക്കാം. *against* ഇമെയിലുകളുടെ ഒരു ഭാഗവും *for* ഇമെയിലുകളുടെ ഒരു ഭാഗവും ഉപയോഗിച്ച് മോഡൽ പരിശീലിപ്പിക്കും. മോഡൽ വാക്കുകളും പാറ്റേണുകളും *against* അല്ലെങ്കിൽ *for* ഇമെയിലുകളിൽ കൂടുതലായി കാണപ്പെടുന്നവയായി തിരിച്ചറിയും, പക്ഷേ ഉള്ളടക്കം മനസ്സിലാക്കില്ല. പരിശീലനത്തിന് ഉപയോഗിക്കാത്ത ചില ഇമെയിലുകൾ ഉപയോഗിച്ച് മോഡൽ പരീക്ഷിച്ച് നിങ്ങൾ നൽകിയ നിഗമനത്തോട് ഒത്തുപോകുന്നുണ്ടോ എന്ന് നോക്കാം. മോഡലിന്റെ കൃത്യതയിൽ സന്തോഷം ഉണ്ടെങ്കിൽ, ഭാവിയിലെ ഇമെയിലുകൾ വായിക്കാതെ തന്നെ പ്രോസസ്സ് ചെയ്യാം.
✅ ഈ പ്രക്രിയ മുമ്പത്തെ പാഠങ്ങളിൽ നിങ്ങൾ ഉപയോഗിച്ച പ്രക്രിയകളെപ്പോലെ തോന്നുന്നുണ്ടോ?
## അഭ്യാസം - മനോഭാവ വാചകങ്ങൾ
മനോഭാവം -1 മുതൽ 1 വരെ ഉള്ള *polarity* ഉപയോഗിച്ച് അളക്കുന്നു, -1 ഏറ്റവും നെഗറ്റീവ്, 1 ഏറ്റവും പോസിറ്റീവ്. മനോഭാവം 0 - 1 സ്കോറിൽ ഒബ്ജക്റ്റിവിറ്റി (0)യും സബ്ജക്റ്റിവിറ്റി (1)യും അളക്കുന്നു.
ജെയിൻ ഓസ്റ്റിന്റെ *Pride and Prejudice* വീണ്ടും നോക്കൂ. [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) ൽ പുസ്തകം ലഭ്യമാണ്. താഴെ ഒരു ചെറിയ പ്രോഗ്രാം പുസ്തകത്തിലെ ആദ്യവും അവസാനവുമായ വാചകങ്ങളുടെ മനോഭാവം വിശകലനം ചെയ്ത് polarity, സബ്ജക്റ്റിവിറ്റി/ഒബ്ജക്റ്റിവിറ്റി സ്കോർ പ്രദർശിപ്പിക്കുന്നു.
`TextBlob` ലൈബ്രറി (മുകളിൽ വിവരിച്ചതു പോലെ) ഉപയോഗിച്ച് `sentiment` കണ്ടെത്തുക (സ്വന്തം sentiment കാൽക്കുലേറ്റർ എഴുതേണ്ടതില്ല) ഈ ടാസ്കിൽ.
```python
from textblob import TextBlob
quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife."""
quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them."""
sentiment1 = TextBlob(quote1).sentiment
sentiment2 = TextBlob(quote2).sentiment
print(quote1 + " has a sentiment of " + str(sentiment1))
print(quote2 + " has a sentiment of " + str(sentiment2))
```
താഴെപ്പറയുന്ന ഔട്ട്പുട്ട് കാണും:
```output
It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146)
Darcy, as well as Elizabeth, really loved them; and they were
both ever sensible of the warmest gratitude towards the persons
who, by bringing her into Derbyshire, had been the means of
uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8)
```
## വെല്ലുവിളി - sentiment polarity പരിശോധിക്കുക
നിങ്ങളുടെ ടാസ്ക്, sentiment polarity ഉപയോഗിച്ച് *Pride and Prejudice* യിൽ പൂർണ്ണമായും പോസിറ്റീവ് വാചകങ്ങൾ പൂർണ്ണമായും നെഗറ്റീവ് വാചകങ്ങളെക്കാൾ കൂടുതലാണോ എന്ന് കണ്ടെത്തുക. polarity സ്കോർ 1 അല്ലെങ്കിൽ -1 ആണെങ്കിൽ അതിനെ പൂർണ്ണമായും പോസിറ്റീവ് അല്ലെങ്കിൽ നെഗറ്റീവ് എന്ന് കരുതാം.
**പടികൾ:**
1. Project Gutenberg-ൽ നിന്ന് [Pride and Prejudice](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) .txt ഫയൽ ഡൗൺലോഡ് ചെയ്യുക. ഫയലിന്റെ തുടക്കത്തിലും അവസാനം ഉള്ള മെറ്റാഡേറ്റ നീക്കം ചെയ്ത് യഥാർത്ഥ എഴുത്ത് മാത്രം വയ്ക്കുക
2. Python-ൽ ഫയൽ തുറന്ന് ഉള്ളടക്കം സ്ട്രിംഗ് ആയി എടുക്കുക
3. പുസ്തക സ്ട്രിംഗ് ഉപയോഗിച്ച് TextBlob സൃഷ്ടിക്കുക
4. പുസ്തകത്തിലെ ഓരോ വാചകവും ലൂപ്പിൽ വിശകലനം ചെയ്യുക
1. polarity 1 അല്ലെങ്കിൽ -1 ആണെങ്കിൽ വാചകം പോസിറ്റീവ് അല്ലെങ്കിൽ നെഗറ്റീവ് സന്ദേശങ്ങളുടെ ലിസ്റ്റിൽ സൂക്ഷിക്കുക
5. അവസാനം, എല്ലാ പോസിറ്റീവ് വാചകങ്ങളും നെഗറ്റീവ് വാചകങ്ങളും (വ്യത്യസ്തമായി) പ്രിന്റ് ചെയ്യുക, കൂടാതെ ഓരോതിന്റെ എണ്ണം കാണിക്കുക.
ഇവിടെ ഒരു സാമ്പിൾ [പരിഹാരം](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb) ഉണ്ട്.
✅ അറിവ് പരിശോധിക്കൽ
1. sentiment വാക്കുകളുടെ അടിസ്ഥാനത്തിലാണ്, പക്ഷേ കോഡ് വാക്കുകൾ *അർത്ഥമാക്കുന്നുണ്ടോ*?
2. sentiment polarity കൃത്യമാണെന്ന് നിങ്ങൾ കരുതുന്നുണ്ടോ, അല്ലെങ്കിൽ സ്കോറുകളുമായി നിങ്ങൾ *ഒത്തുപോകുന്നുണ്ടോ*?
1. പ്രത്യേകിച്ച്, താഴെപ്പറയുന്ന വാചകങ്ങളുടെ പൂർണ്ണമായും **പോസിറ്റീവ്** polarity-യുമായി നിങ്ങൾ ഒത്തുപോകുന്നുണ്ടോ?
* “What an excellent father you have, girls!” said she, when the door was shut.
* “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect.
* How wonderfully these sort of things occur!
* I have the greatest dislike in the world to that sort of thing.
* Charlotte is an excellent manager, I dare say.
* “This is delightful indeed!
* I am so happy!
* Your idea of the ponies is delightful.
2. അടുത്ത 3 വാചകങ്ങൾ പൂർണ്ണമായും പോസിറ്റീവ് polarity ലഭിച്ചു, പക്ഷേ വായിച്ചാൽ അവ പോസിറ്റീവ് അല്ല. sentiment analysis അവ പോസിറ്റീവ് എന്ന് കരുതിയത് എന്തുകൊണ്ടാണ്?
* Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power.
* If I could but see you as happy!
* Our distress, my dear Lizzy, is very great.
3. താഴെപ്പറയുന്ന വാചകങ്ങളുടെ പൂർണ്ണമായും **നെഗറ്റീവ്** polarity-യുമായി നിങ്ങൾ ഒത്തുപോകുന്നുണ്ടോ?
- Everybody is disgusted with his pride.
- “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful.
- The pause was to Elizabeths feelings dreadful.
- It would be dreadful!
✅ ജെയിൻ ഓസ്റ്റിന്റെ ആരാധകർക്ക് അറിയാം, അവർ അവരുടെ പുസ്തകങ്ങൾ ഇംഗ്ലീഷ് റെജൻസി സമൂഹത്തിലെ കൂടുതൽ വാസ്തവവിരുദ്ധമായ വശങ്ങൾ വിമർശിക്കാൻ ഉപയോഗിക്കുന്നു. *Pride and Prejudice* ന്റെ പ്രധാന കഥാപാത്രം എലിസബത്ത് ബെനെറ്റ് (എഴുത്തുകാരനുപോലെ) ഒരു സൂക്ഷ്മ സാമൂഹിക നിരീക്ഷകയാണ്, അവളുടെ ഭാഷ പലപ്പോഴും വളരെ സൂക്ഷ്മമാണ്. കഥയിലെ പ്രണയവ്യക്തി മിസ്റ്റർ ഡാർസി പോലും എലിസബത്തിന്റെ കളിയാട്ടവും ചിരിപ്പിക്കുന്ന ഭാഷ ഉപയോഗവും ശ്രദ്ധിച്ചിട്ടുണ്ട്: "I have had the pleasure of your acquaintance long enough to know that you find great enjoyment in occasionally professing opinions which in fact are not your own."
---
## 🚀 വെല്ലുവിളി
ഉപയോക്തൃ ഇൻപുട്ടിൽ നിന്ന് മറ്റ് സവിശേഷതകൾ എടുക്കുന്നതിലൂടെ Marvin-നെ കൂടുതൽ മെച്ചപ്പെടുത്താമോ?
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
വാചകത്തിൽ നിന്നുള്ള മനോഭാവം എടുക്കാനുള്ള നിരവധി മാർഗ്ഗങ്ങളുണ്ട്. ഈ സാങ്കേതികവിദ്യ ഉപയോഗിക്കുന്ന ബിസിനസ് പ്രയോഗങ്ങളെക്കുറിച്ച് ചിന്തിക്കുക. ഇത് എങ്ങനെ തെറ്റിക്കാമെന്ന് ചിന്തിക്കുക. [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott) പോലുള്ള മനോഭാവം വിശകലനം ചെയ്യുന്ന സങ്കീർണ്ണമായ എന്റർപ്രൈസ്-സജ്ജമായ സിസ്റ്റങ്ങളേക്കുറിച്ച് കൂടുതൽ വായിക്കുക. മുകളിൽ നൽകിയ പ്രൈഡ് ആൻഡ് പ്രെജുഡിസ് വാചകങ്ങളിൽ ചിലത് പരീക്ഷിച്ച് സൂക്ഷ്മത കണ്ടെത്താൻ കഴിയുന്നുണ്ടോ എന്ന് നോക്കുക.
## അസൈൻമെന്റ്
[Poetic license](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9d2a734deb904caff310d1a999c6bd7a",
"translation_date": "2025-12-19T14:18:34+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/assignment.md",
"language_code": "ml"
}
-->
# കവിതാ ലൈസൻസ്
## നിർദ്ദേശങ്ങൾ
[ഈ നോട്ട്‌ബുക്കിൽ](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) നിങ്ങൾക്ക് മുൻപ് ആഴുറ്റ ടെക്സ്റ്റ് അനലിറ്റിക്സ് ഉപയോഗിച്ച് സാന്ദ്രത വിശകലനം ചെയ്ത 500-ലധികം എമിലി ഡിക്കിൻസൺ കവിതകൾ കണ്ടെത്താം. ഈ ഡാറ്റാസെറ്റ് ഉപയോഗിച്ച്, പാഠത്തിൽ വിവരിച്ച സാങ്കേതിക വിദ്യകൾ ഉപയോഗിച്ച് വിശകലനം ചെയ്യുക. ഒരു കവിതയുടെ നിർദ്ദേശിച്ച സാന്ദ്രത ആഴുറ്റ സേവനത്തിന്റെ തീരുമാനത്തോട് പൊരുത്തപ്പെടുന്നുണ്ടോ? നിങ്ങളുടെ അഭിപ്രായത്തിൽ എന്തുകൊണ്ടാണ് അങ്ങനെ? എന്തെങ്കിലും നിങ്ങൾക്ക് അത്ഭുതം തോന്നുന്നുണ്ടോ?
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണാർത്ഥം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | -------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------ |
| | ഒരു എഴുത്തുകാരന്റെ സാമ്പിൾ ഔട്ട്പുട്ടിന്റെ ഉറച്ച വിശകലനത്തോടെ ഒരു നോട്ട്‌ബുക്ക് അവതരിപ്പിച്ചിരിക്കുന്നു | നോട്ട്‌ബുക്ക് അപൂർണ്ണമാണ് അല്ലെങ്കിൽ വിശകലനം നടത്തുന്നില്ല | നോട്ട്‌ബുക്ക് അവതരിപ്പിച്ചിട്ടില്ല |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ പ്രാമാണികമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T14:46:34+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡറാണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-12-19T14:47:06+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/solution/R/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡർ ആണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,100 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 4,
"coopTranslator": {
"original_hash": "27de2abc0235ebd22080fc8f1107454d",
"translation_date": "2025-12-19T16:49:16+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/solution/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from textblob import TextBlob\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# You should download the book text, clean it, and import it here\n",
"with open(\"pride.txt\", encoding=\"utf8\") as f:\n",
" file_contents = f.read()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"book_pride = TextBlob(file_contents)\n",
"positive_sentiment_sentences = []\n",
"negative_sentiment_sentences = []"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for sentence in book_pride.sentences:\n",
" if sentence.sentiment.polarity == 1:\n",
" positive_sentiment_sentences.append(sentence)\n",
" if sentence.sentiment.polarity == -1:\n",
" negative_sentiment_sentences.append(sentence)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"The \" + str(len(positive_sentiment_sentences)) + \" most positive sentences:\")\n",
"for sentence in positive_sentiment_sentences:\n",
" print(\"+ \" + str(sentence.replace(\"\\n\", \"\").replace(\" \", \" \")))\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"The \" + str(len(negative_sentiment_sentences)) + \" most negative sentences:\")\n",
"for sentence in negative_sentiment_sentences:\n",
" print(\"- \" + str(sentence.replace(\"\\n\", \"\").replace(\" \", \" \")))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാ**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,419 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "8d32dadeda93c6fb5c43619854882ab1",
"translation_date": "2025-12-19T14:20:46+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/README.md",
"language_code": "ml"
}
-->
# ഹോട്ടൽ റിവ്യൂവുകളുമായി സെന്റിമെന്റ് വിശകലനം - ഡാറ്റ പ്രോസസ്സ് ചെയ്യൽ
ഈ വിഭാഗത്തിൽ നിങ്ങൾ മുമ്പത്തെ പാഠങ്ങളിൽ ഉപയോഗിച്ച സാങ്കേതിക വിദ്യകൾ ഉപയോഗിച്ച് ഒരു വലിയ ഡാറ്റാസെറ്റിന്റെ എക്സ്പ്ലോറട്ടറി ഡാറ്റ അനാലിസിസ് നടത്തും. വിവിധ കോളങ്ങളുടെയും പ്രയോജനത്തെക്കുറിച്ച് നല്ലൊരു ബോധം ലഭിച്ച ശേഷം, നിങ്ങൾ പഠിക്കും:
- അനാവശ്യ കോളങ്ങൾ എങ്ങനെ നീക്കം ചെയ്യാം
- നിലവിലുള്ള കോളങ്ങൾ അടിസ്ഥാനമാക്കി പുതിയ ഡാറ്റ എങ്ങനെ കണക്കാക്കാം
- ഫൈനൽ ചലഞ്ചിൽ ഉപയോഗിക്കാൻ ഫലമായ ഡാറ്റാസെറ്റ് എങ്ങനെ സേവ് ചെയ്യാം
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
### പരിചയം
ഇതുവരെ നിങ്ങൾ പഠിച്ചത് ടെക്സ്റ്റ് ഡാറ്റ സംഖ്യാത്മക ഡാറ്റയുമായി വളരെ വ്യത്യസ്തമാണെന്ന് ആണ്. മനുഷ്യൻ എഴുതിയതോ സംസാരിച്ചതോ ആയ ടെക്സ്റ്റ് പാറ്റേണുകളും ആവൃത്തി, സെന്റിമെന്റ്, അർത്ഥം കണ്ടെത്താൻ വിശകലനം ചെയ്യാവുന്നതാണ്. ഈ പാഠം നിങ്ങൾക്ക് യഥാർത്ഥ ഡാറ്റാസെറ്റും യഥാർത്ഥ വെല്ലുവിളിയും നൽകുന്നു: **[515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)**, കൂടാതെ [CC0: Public Domain ലൈസൻസ്](https://creativecommons.org/publicdomain/zero/1.0/) ഉൾക്കൊള്ളുന്നു. ഇത് Booking.com-ൽ നിന്നുള്ള പൊതു ഉറവിടങ്ങളിൽ നിന്നാണ് സ്ക്രാപ്പ് ചെയ്തിരിക്കുന്നത്. ഡാറ്റാസെറ്റ് സൃഷ്ടിച്ചത് ജിയാഷൻ ലിയു ആണ്.
### തയ്യാറെടുപ്പ്
നിങ്ങൾക്ക് ആവശ്യമായത്:
* Python 3 ഉപയോഗിച്ച് .ipynb നോട്ട്‌ബുക്കുകൾ ഓടിക്കാൻ കഴിവ്
* pandas
* NLTK, [ഇത് നിങ്ങൾക്ക് ലോക്കലായി ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതാണ്](https://www.nltk.org/install.html)
* Kaggle-ൽ ലഭ്യമായ ഡാറ്റാസെറ്റ് [515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe). ഇത് അന്ജിപ്പിച്ചപ്പോൾ ഏകദേശം 230 MB ആണ്. ഈ NLP പാഠങ്ങളുമായി ബന്ധപ്പെട്ട `/data` റൂട്ട് ഫോൾഡറിൽ ഡൗൺലോഡ് ചെയ്യുക.
## എക്സ്പ്ലോറട്ടറി ഡാറ്റ അനാലിസിസ്
ഈ വെല്ലുവിളി നിങ്ങൾ സെന്റിമെന്റ് അനാലിസിസും ഗസ്റ്റ് റിവ്യൂ സ്കോറുകളും ഉപയോഗിച്ച് ഹോട്ടൽ ശുപാർശ ബോട്ട് നിർമ്മിക്കുന്നതായി കരുതുന്നു. നിങ്ങൾ ഉപയോഗിക്കുന്ന ഡാറ്റാസെറ്റിൽ 6 നഗരങ്ങളിലെ 1493 വ്യത്യസ്ത ഹോട്ടലുകളുടെ റിവ്യൂവുകൾ ഉൾക്കൊള്ളുന്നു.
Python, ഹോട്ടൽ റിവ്യൂ ഡാറ്റാസെറ്റ്, NLTK സെന്റിമെന്റ് അനാലിസിസ് ഉപയോഗിച്ച് നിങ്ങൾ കണ്ടെത്താൻ കഴിയും:
* റിവ്യൂവുകളിൽ ഏറ്റവും അധികം ഉപയോഗിക്കുന്ന വാക്കുകളും വാചകങ്ങളും എന്തൊക്കെയാണ്?
* ഹോട്ടലിനെ വിവരണാത്മകമായി അടയാളപ്പെടുത്തുന്ന ഔദ്യോഗിക *ടാഗുകൾ* റിവ്യൂ സ്കോറുകളുമായി (ഉദാ: *കുട്ടികളോടുള്ള കുടുംബം* എന്ന ടാഗ് ഉള്ള ഹോട്ടലിൽ *സോളോ ട്രാവലർ* എന്ന ടാഗുള്ളവരെക്കാൾ കൂടുതൽ നെഗറ്റീവ് റിവ്യൂവുണ്ടോ?) ബന്ധമുണ്ടോ?
* NLTK സെന്റിമെന്റ് സ്കോറുകൾ ഹോട്ടൽ റിവ്യൂവറുടെ സംഖ്യാത്മക സ്കോറുമായി 'ഒത്തുപോകുന്നുണ്ടോ'?
#### ഡാറ്റാസെറ്റ്
നിങ്ങൾ ഡൗൺലോഡ് ചെയ്ത് ലോക്കലായി സേവ് ചെയ്ത ഡാറ്റാസെറ്റ് പരിശോധിക്കാം. VS Code പോലുള്ള എഡിറ്റർ അല്ലെങ്കിൽ Excel-ൽ ഫയൽ തുറക്കുക.
ഡാറ്റാസെറ്റിലെ ഹെഡറുകൾ ഇപ്രകാരമാണ്:
*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng*
ഇവയെ ഒരു എളുപ്പത്തിൽ പരിശോധിക്കാൻ കഴിയുന്ന വിധത്തിൽ ഗ്രൂപ്പുചെയ്തിരിക്കുന്നു:
##### ഹോട്ടൽ കോളങ്ങൾ
* `Hotel_Name`, `Hotel_Address`, `lat` (അക്ഷാംശം), `lng` (രേഖാംശം)
* *lat* ഉം *lng* ഉം ഉപയോഗിച്ച് Python-ൽ ഹോട്ടലുകളുടെ സ്ഥാനം കാണിക്കുന്ന ഒരു മാപ്പ് പ്ലോട്ട് ചെയ്യാം (നെഗറ്റീവ്, പോസിറ്റീവ് റിവ്യൂവുകൾ നിറംകൊണ്ട് വ്യത്യാസപ്പെടുത്താം)
* Hotel_Address നമുക്ക് വ്യക്തമായി പ്രയോജനകരമല്ല, അതിനാൽ അത് രാജ്യമായി മാറ്റി എളുപ്പത്തിൽ സോർട്ട് ചെയ്യാനും തിരയാനും കഴിയും
**ഹോട്ടൽ മെറ്റാ-റിവ്യൂ കോളങ്ങൾ**
* `Average_Score`
* ഡാറ്റാസെറ്റ് സൃഷ്ടിച്ചവന്റെ പ്രകാരം, ഈ കോളം *കഴിഞ്ഞ വർഷം ഏറ്റവും പുതിയ കമന്റിന്റെ അടിസ്ഥാനത്തിൽ കണക്കാക്കിയ ഹോട്ടലിന്റെ ശരാശരി സ്കോർ* ആണ്. ഇത് സ്കോർ കണക്കാക്കാനുള്ള അസാധാരണമായ രീതിയാണെന്ന് തോന്നുന്നു, പക്ഷേ ഡാറ്റ സ്ക്രാപ്പ് ചെയ്തതാണെന്നതിനാൽ ഇപ്പോൾ ഇതിനെ വിശ്വസിക്കാം.
✅ ഈ ഡാറ്റയിലെ മറ്റ് കോളങ്ങൾ അടിസ്ഥാനമാക്കി ശരാശരി സ്കോർ കണക്കാക്കാനുള്ള മറ്റൊരു മാർഗം നിങ്ങൾക്ക് തോന്നുന്നുണ്ടോ?
* `Total_Number_of_Reviews`
* ഈ ഹോട്ടലിന് ലഭിച്ച മൊത്തം റിവ്യൂവുകളുടെ എണ്ണം - ഇത് ഡാറ്റാസെറ്റിലെ റിവ്യൂവുകളെ സൂചിപ്പിക്കുന്നതാണോ എന്ന് (കൂടുതൽ കോഡ് എഴുതാതെ) വ്യക്തമല്ല.
* `Additional_Number_of_Scoring`
* റിവ്യൂവറുടെ റിവ്യൂ എഴുതാതെ റിവ്യൂ സ്കോർ നൽകിയിട്ടുള്ളത്
**റിവ്യൂ കോളങ്ങൾ**
- `Reviewer_Score`
- ഏറ്റവും കൂടുതൽ 1 ദശാംശം വരെ ഉള്ള സംഖ്യാത്മക മൂല്യം, കുറഞ്ഞത് 2.5, ഉയരം 10 വരെ
- 2.5 ഏറ്റവും കുറഞ്ഞ സ്കോർ ആണെന്ന് എന്തുകൊണ്ട് എന്ന് വിശദീകരിച്ചിട്ടില്ല
- `Negative_Review`
- റിവ്യൂവർ ഒന്നും എഴുതിയില്ലെങ്കിൽ ഈ ഫീൽഡിൽ "**No Negative**" ഉണ്ടാകും
- റിവ്യൂവർ നെഗറ്റീവ് റിവ്യൂ കോളത്തിൽ പോസിറ്റീവ് റിവ്യൂ എഴുതിയിരിക്കാം (ഉദാ: "ഈ ഹോട്ടലിൽ ഒന്നും തെറ്റില്ല")
- `Review_Total_Negative_Word_Counts`
- ഉയർന്ന നെഗറ്റീവ് വാക്കുകളുടെ എണ്ണം കുറഞ്ഞ സ്കോർ സൂചിപ്പിക്കുന്നു (സെന്റിമെന്റ് പരിശോധിക്കാതെ)
- `Positive_Review`
- റിവ്യൂവർ ഒന്നും എഴുതിയില്ലെങ്കിൽ "**No Positive**" കാണിക്കും
- റിവ്യൂവർ പോസിറ്റീവ് റിവ്യൂ കോളത്തിൽ നെഗറ്റീവ് റിവ്യൂ എഴുതിയിരിക്കാം (ഉദാ: "ഈ ഹോട്ടലിൽ ഒന്നും നല്ലതല്ല")
- `Review_Total_Positive_Word_Counts`
- ഉയർന്ന പോസിറ്റീവ് വാക്കുകളുടെ എണ്ണം ഉയർന്ന സ്കോർ സൂചിപ്പിക്കുന്നു (സെന്റിമെന്റ് പരിശോധിക്കാതെ)
- `Review_Date` and `days_since_review`
- ഒരു റിവ്യൂവിന്റെ പുതുമ അല്ലെങ്കിൽ പഴക്കം അളക്കാൻ ഉപയോഗിക്കാം (പഴയ റിവ്യൂകൾ പുതിയവയെക്കാൾ കൃത്യമല്ലാതിരിക്കാം, കാരണം ഹോട്ടൽ മാനേജ്മെന്റ് മാറിയിരിക്കാം, നവീകരണങ്ങൾ നടന്നിരിക്കാം, പൂൾ ചേർത്തിരിക്കാം തുടങ്ങിയവ)
- `Tags`
- റിവ്യൂവർ തങ്ങൾ എങ്ങനെ ഗസ്റ്റ് ആയിരുന്നുവെന്ന് (ഉദാ: സോളോ അല്ലെങ്കിൽ കുടുംബം), റൂം തരം, താമസ കാലാവധി, റിവ്യൂ സമർപ്പിച്ച ഉപകരണം എന്നിവ വിവരിക്കാൻ തിരഞ്ഞെടുക്കുന്ന ചെറിയ വിവരണങ്ങൾ
- ദുർഭാഗ്യവശാൽ, ഈ ടാഗുകൾ ഉപയോഗിക്കുന്നത് പ്രശ്നകരമാണ്, താഴെ അവയുടെ പ്രയോജനത്തെക്കുറിച്ച് ചർച്ച ചെയ്തിട്ടുണ്ട്
**റിവ്യൂവർ കോളങ്ങൾ**
- `Total_Number_of_Reviews_Reviewer_Has_Given`
- ശുപാർശ മോഡലിൽ ഇത് ഒരു ഘടകമായിരിക്കാം, ഉദാ: നൂറുകണക്കിന് റിവ്യൂവുകൾ എഴുതുന്നവർക്കു നെഗറ്റീവ് റിവ്യൂവുകൾ കൂടുതലായിരിക്കാം. എന്നാൽ ഓരോ റിവ്യൂവറെയും ഒരു പ്രത്യേക കോഡിൽ തിരിച്ചറിയുന്നില്ല, അതിനാൽ റിവ്യൂസെറ്റുമായി ബന്ധിപ്പിക്കാൻ കഴിയില്ല. 100-ൽ കൂടുതൽ റിവ്യൂവുകൾ ഉള്ള 30 റിവ്യൂവർമാർ ഉണ്ട്, പക്ഷേ ഇത് ശുപാർശ മോഡലിന് എങ്ങനെ സഹായകരമാകുമെന്ന് വ്യക്തമല്ല.
- `Reviewer_Nationality`
- ചിലർ കരുതാം ചില ദേശീയതകൾ പോസിറ്റീവ് അല്ലെങ്കിൽ നെഗറ്റീവ് റിവ്യൂ നൽകാൻ കൂടുതൽ സാധ്യതയുള്ളവരാണ്. ഇത്തരം അനുകരണങ്ങൾ നിങ്ങളുടെ മോഡലുകളിൽ ഉൾപ്പെടുത്തുമ്പോൾ ജാഗ്രത പാലിക്കുക. ഇവ ദേശീയ (കൂടാതെ ചിലപ്പോൾ ജാതി) സ്റ്റെറിയോട്ടൈപ്പുകളാണ്, ഓരോ റിവ്യൂവറും അവരുടെ അനുഭവത്തെ അടിസ്ഥാനമാക്കി റിവ്യൂ എഴുതിയ വ്യക്തിയാണ്. അവരുടെ മുൻ ഹോട്ടൽ stays, യാത്ര ദൂരം, വ്യക്തിഗത സ്വഭാവം തുടങ്ങിയവ വഴി ഫിൽട്ടർ ചെയ്തിരിക്കാം. അവരുടെ ദേശീയത റിവ്യൂ സ്കോറിന്റെ കാരണം ആണെന്ന് കരുതുന്നത് ന്യായീകരിക്കാൻ ബുദ്ധിമുട്ടാണ്.
##### ഉദാഹരണങ്ങൾ
| ശരാശരി സ്കോർ | മൊത്തം റിവ്യൂവുകളുടെ എണ്ണം | റിവ്യൂവർ സ്കോർ | നെഗറ്റീവ് <br />റിവ്യൂ | പോസിറ്റീവ് റിവ്യൂ | ടാഗുകൾ |
| -------------- | ---------------------- | ---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- |
| 7.8 | 1945 | 2.5 | ഇത് ഇപ്പോൾ ഹോട്ടൽ അല്ല, ഒരു കൺസ്ട്രക്ഷൻ സൈറ്റ് ആണ്. ഞാൻ രാവിലെ മുതൽ വൈകിട്ട് വരെ അസഹ്യമായ കെട്ടിട ശബ്ദത്തിൽ പീഡിപ്പിക്കപ്പെട്ടു, ഒരു ദീർഘയാത്ര കഴിഞ്ഞ് മുറിയിൽ വിശ്രമിക്കുമ്പോൾ. ആളുകൾ മുഴുവൻ ദിവസം ജാക്ക്‌ഹാമറുകൾ ഉപയോഗിച്ച് സമീപ മുറികളിൽ ജോലി ചെയ്തു. ഞാൻ മുറി മാറ്റം ആവശ്യപ്പെട്ടു, പക്ഷേ ശാന്തമായ മുറി ലഭ്യമല്ലായിരുന്നു. കാര്യങ്ങൾ കൂടുതൽ മോശമാക്കി, ഞാൻ അധിക ചാർജ് ചെയ്തു. വൈകിട്ട് ഞാൻ ചെക്ക് ഔട്ട് ചെയ്തു, കാരണം എനിക്ക് വളരെ പെട്ടെന്ന് പുറപ്പെടേണ്ടി വന്നു, അനുയോജ്യമായ ബിൽ ലഭിച്ചു. ഒരു ദിവസം കഴിഞ്ഞ് ഹോട്ടൽ എന്റെ സമ്മതം കൂടാതെ ബുക്ക് ചെയ്ത വിലക്ക് മുകളിൽ മറ്റൊരു ചാർജ് ചെയ്തു. ഇത് ഭയങ്കരമായ സ്ഥലം ആണ്. ഇവിടെ ബുക്ക് ചെയ്ത് സ്വയം ശിക്ഷിക്കരുത് | ഒന്നും ഭയങ്കരമായ സ്ഥലം, അകലം പാലിക്കുക | ബിസിനസ് യാത്ര, ദമ്പതികൾ, സ്റ്റാൻഡേർഡ് ഡബിൾ റൂം, 2 രാത്രി താമസിച്ചു |
ഇവിടെ കാണുന്നതുപോലെ, ഈ ഗസ്റ്റ് ഹോട്ടലിൽ സന്തോഷകരമായ താമസം ഉണ്ടായില്ല. ഹോട്ടലിന് 7.8 എന്ന നല്ല ശരാശരി സ്കോർ ഉണ്ട്, 1945 റിവ്യൂവുകൾ ഉണ്ട്, പക്ഷേ ഈ റിവ്യൂവർ 2.5 സ്കോർ നൽകി, അവരുടെ നെഗറ്റീവ് താമസത്തെക്കുറിച്ച് 115 വാക്കുകൾ എഴുതിയിട്ടുണ്ട്. അവർ പോസിറ്റീവ്_റിവ്യൂ കോളത്തിൽ ഒന്നും എഴുതിയില്ലെങ്കിൽ, പോസിറ്റീവ് ഒന്നും ഇല്ലെന്ന് നമുക്ക് തോന്നാമായിരുന്നു, പക്ഷേ അവർ മുന്നറിയിപ്പായി 7 വാക്കുകൾ എഴുതിയിട്ടുണ്ട്. വാക്കുകളുടെ അർത്ഥം അല്ലെങ്കിൽ സെന്റിമെന്റ് പരിശോധിക്കാതെ വാക്കുകൾ മാത്രം എണ്ണിയാൽ റിവ്യൂവറുടെ ഉദ്ദേശം തെറ്റായി മനസ്സിലാക്കാം. അതിശയകരമായി, 2.5 എന്ന സ്കോർ ആശയക്കുഴപ്പമാണ്, കാരണം ഹോട്ടൽ താമസം അത്ര മോശമായിരുന്നെങ്കിൽ എന്തുകൊണ്ട് ഏതെങ്കിലും പോയിന്റ് നൽകുന്നു? ഡാറ്റാസെറ്റ് നന്നായി പരിശോധിച്ചാൽ, ഏറ്റവും കുറഞ്ഞ സ്കോർ 2.5 ആണ്, 0 അല്ല. ഏറ്റവും ഉയർന്ന സ്കോർ 10 ആണ്.
##### ടാഗുകൾ
മുകളിൽ പറഞ്ഞതുപോലെ, ആദ്യം നോക്കുമ്പോൾ `Tags` ഉപയോഗിച്ച് ഡാറ്റ വർഗ്ഗീകരിക്കാനുള്ള ആശയം ശരിയാണെന്ന് തോന്നും. ദുർഭാഗ്യവശാൽ, ഈ ടാഗുകൾ സ്റ്റാൻഡേർഡൈസ് ചെയ്തിട്ടില്ല, അതായത് ഒരു ഹോട്ടലിൽ *Single room*, *Twin room*, *Double room* എന്നിങ്ങനെ ഓപ്ഷനുകൾ ഉണ്ടാകാം, അടുത്ത ഹോട്ടലിൽ *Deluxe Single Room*, *Classic Queen Room*, *Executive King Room* എന്നിങ്ങനെ. ഇവ ഒരേ കാര്യങ്ങളായിരിക്കാം, പക്ഷേ വ്യത്യാസങ്ങൾ വളരെ കൂടുതലാണ്, അതിനാൽ തിരഞ്ഞെടുപ്പ്:
1. എല്ലാ പദങ്ങളും ഒരു സ്റ്റാൻഡേർഡ് രൂപത്തിലേക്ക് മാറ്റാൻ ശ്രമിക്കുക, ഇത് വളരെ പ്രയാസമാണ്, കാരണം ഓരോ കേസിലും മാറ്റം എങ്ങനെ വരുമെന്ന് വ്യക്തമല്ല (ഉദാ: *Classic single room* *Single room* ആയി മാപ്പ് ചെയ്യാം, പക്ഷേ *Superior Queen Room with Courtyard Garden or City View* മാപ്പ് ചെയ്യുന്നത് വളരെ പ്രയാസമാണ്)
1. NLP സമീപനം സ്വീകരിച്ച് *Solo*, *Business Traveller*, *Family with young kids* പോലുള്ള പദങ്ങളുടെ ആവൃത്തി ഓരോ ഹോട്ടലിലും എങ്ങനെ ഉണ്ടെന്ന് അളക്കുക, അത് ശുപാർശയിൽ ഉൾപ്പെടുത്തുക
ടാഗുകൾ സാധാരണയായി (എല്ലാവരും അല്ല) ഒരു ഫീൽഡിൽ 5-6 കോമ കൊണ്ട് വേർതിരിച്ച മൂല്യങ്ങളുടെ പട്ടികയാണുള്ളത്, അവ *യാത്രയുടെ തരം*, *ഗസ്റ്റ് തരം*, *റൂം തരം*, *താമസ നൈറ്റ് എണ്ണം*, *റിവ്യൂ സമർപ്പിച്ച ഉപകരണം* എന്നിവയുമായി ബന്ധപ്പെട്ടിരിക്കുന്നു. എന്നാൽ ചില റിവ്യൂവർമാർ ഓരോ ഫീൽഡും പൂരിപ്പിക്കാത്തതിനാൽ (ഒന്ന് ഒഴിവാക്കാം), മൂല്യങ്ങൾ എല്ലായ്പ്പോഴും ഒരേ ക്രമത്തിൽ ഇല്ല.
ഉദാഹരണമായി, *Type of group* എടുത്തു നോക്കാം. `Tags` കോളത്തിൽ ഈ ഫീൽഡിൽ 1025 വ്യത്യസ്ത സാധ്യതകൾ ഉണ്ട്, ദുർഭാഗ്യവശാൽ അവയിൽ ചിലത് ഗ്രൂപ്പിനെ സൂചിപ്പിക്കുന്നവ മാത്രമാണ് (ചിലത് റൂം തരം മുതലായവ). കുടുംബം എന്ന പദം ഉൾപ്പെടുന്നവ മാത്രം ഫിൽട്ടർ ചെയ്താൽ, ഫലങ്ങളിൽ *Family room* തരം ഫലങ്ങൾ കൂടുതലാണ്. *with* എന്ന പദം ഉൾപ്പെടുത്തുമ്പോൾ, ഉദാ: *Family with* മൂല്യങ്ങൾ എണ്ണുമ്പോൾ, ഫലങ്ങൾ മെച്ചമാണ്, 515,000 ഫലങ്ങളിൽ 80,000-ത്തിലധികം "Family with young children" അല്ലെങ്കിൽ "Family with older children" എന്ന വാചകങ്ങൾ ഉൾക്കൊള്ളുന്നു.
ഇത് ടാഗ് കോളം നമുക്ക് പൂർണ്ണമായും ഉപകാരമില്ലാത്തതല്ല, പക്ഷേ ഉപയോഗപ്രദമാക്കാൻ കുറച്ച് ജോലി വേണം.
##### ശരാശരി ഹോട്ടൽ സ്കോർ
ഡാറ്റാസെറ്റിൽ ചില അസാധാരണതകളും വ്യത്യാസങ്ങളും ഉണ്ട്, ഞാൻ കണ്ടെത്താനായില്ല, പക്ഷേ നിങ്ങൾക്ക് അവ അറിയാമാകാൻ ഇവിടെ കാണിക്കുന്നു. നിങ്ങൾ കണ്ടെത്തിയാൽ, ദയവായി ചർച്ചാ വിഭാഗത്തിൽ അറിയിക്കുക!
ഡാറ്റാസെറ്റിൽ ശരാശരി സ്കോർ, റിവ്യൂവുകളുടെ എണ്ണം സംബന്ധിച്ച കോളങ്ങൾ:
1. Hotel_Name
2. Additional_Number_of_Scoring
3. Average_Score
4. Total_Number_of_Reviews
5. Reviewer_Score
ഈ ഡാറ്റാസെറ്റിലെ ഏറ്റവും കൂടുതൽ റിവ്യൂവുകൾ ഉള്ള ഹോട്ടൽ *Britannia International Hotel Canary Wharf* ആണ്, 515,000-ൽ 4789 റിവ്യൂവുകൾ. എന്നാൽ ഈ ഹോട്ടലിന്റെ `Total_Number_of_Reviews` മൂല്യം 9086 ആണ്. റിവ്യൂ ഇല്ലാതെ സ്കോർ നൽകിയവ കൂടുതലാണെന്ന് കരുതാം, അതിനാൽ `Additional_Number_of_Scoring` മൂല്യം ചേർക്കാം. അത് 2682 ആണ്, 4789-ൽ ചേർത്താൽ 7,471 ആകുന്നു, ഇത് `Total_Number_of_Reviews`-നേക്കാൾ 1615 കുറവാണ്.
`Average_Score` കോളം നോക്കുമ്പോൾ, ഇത് ഡാറ്റാസെറ്റിലെ റിവ്യൂവുകളുടെ ശരാശരി ആണെന്ന് കരുതാം, പക്ഷേ Kaggle-ൽ വിവരണം "*കഴിഞ്ഞ വർഷം ഏറ്റവും പുതിയ കമന്റിന്റെ അടിസ്ഥാനത്തിൽ കണക്കാക്കിയ ഹോട്ടലിന്റെ ശരാശരി സ്കോർ*" എന്നാണ്. ഇത് പ്രയോജനകരമല്ലെന്ന് തോന്നുന്നു, പക്ഷേ നമുക്ക് ഡാറ്റാസെറ്റിലെ റിവ്യൂ സ്കോറുകൾ അടിസ്ഥാനമാക്കി നമ്മുടെ സ്വന്തം ശരാശരി കണക്കാക്കാം. അതേ ഹോട്ടൽ ഉദാഹരണമായി എടുത്താൽ, ശരാശരി ഹോട്ടൽ സ്കോർ 7.1 ആണ്, പക്ഷേ കണക്കാക്കിയ സ്കോർ (ഡാറ്റാസെറ്റിലെ ശരാശരി റിവ്യൂവർ സ്കോർ) 6.8 ആണ്. ഇത് അടുത്തതാണ്, പക്ഷേ സമാനമല്ല, `Additional_Number_of_Scoring` റിവ്യൂവുകൾ ശരാശരിയിൽ 7.1 വരെ വർദ്ധിപ്പിച്ചിരിക്കാമെന്ന് നമുക്ക് കരുതാം. എന്നാൽ അത് പരിശോധിക്കാനോ തെളിയിക്കാനോ കഴിയാത്തതിനാൽ, `Average_Score`, `Additional_Number_of_Scoring`, `Total_Number_of_Reviews` എന്നിവ ഉപയോഗിക്കാനും വിശ്വസിക്കാനും ബുദ്ധിമുട്ടാണ്, കാരണം അവ ഡാറ്റ നമുക്ക് ഇല്ലാത്തതിൽ അടിസ്ഥാനമാക്കിയുള്ളതാണ്.
കൂടുതൽ സങ്കീർണ്ണമാക്കാൻ, രണ്ടാമത്തെ ഏറ്റവും കൂടുതൽ റിവ്യൂവുകൾ ഉള്ള ഹോട്ടലിന്റെ കണക്കാക്കിയ ശരാശരി സ്കോർ 8.12 ആണ്, ഡാറ്റാസെറ്റിലെ `Average_Score` 8.1 ആണ്. ഇത് യാദൃച്ഛികമാണോ, ആദ്യ ഹോട്ടലിലെ വ്യത്യാസമാണോ?
ഈ ഹോട്ടൽ ഒരു ഔട്ട്‌ലൈയർ ആകാമെന്ന സാധ്യതയും, മിക്ക മൂല്യങ്ങളും പൊരുത്തപ്പെടുന്നുണ്ടാകാം (പക്ഷേ ചിലത് എന്തോ കാരണത്താൽ പൊരുത്തപ്പെടുന്നില്ല) എന്നതിനാൽ, ഡാറ്റാസെറ്റിലെ മൂല്യങ്ങൾ പരിശോധിച്ച് ശരിയായ ഉപയോഗം (അഥവാ ഉപയോഗം ഇല്ലാതാക്കൽ) നിർണയിക്കാൻ അടുത്തതായി ഒരു ചെറിയ പ്രോഗ്രാം എഴുതും.
> 🚨 ഒരു ജാഗ്രതാ കുറിപ്പ്
>
> ഈ ഡാറ്റാസെറ്റുമായി ജോലി ചെയ്യുമ്പോൾ, നിങ്ങൾക്ക് ടെക്സ്റ്റിൽ നിന്ന് എന്തെങ്കിലും കണക്കാക്കുന്ന കോഡ് എഴുതേണ്ടി വരും, എന്നാൽ നിങ്ങൾക്ക് ടെക്സ്റ്റ് വായിക്കുകയോ വിശകലനം ചെയ്യുകയോ ചെയ്യേണ്ടതില്ല. ഇത് NLP യുടെ സാരാംശമാണ്, മനുഷ്യൻ ചെയ്യാതെ അർത്ഥം അല്ലെങ്കിൽ മനോഭാവം വ്യാഖ്യാനിക്കുന്നത്. എങ്കിലും, നിങ്ങൾ ചില നെഗറ്റീവ് റിവ്യൂകൾ വായിക്കേണ്ടി വരാം. ഞാൻ നിങ്ങളോട് അത് ചെയ്യാതിരിക്കാൻ അഭ്യർത്ഥിക്കുന്നു, കാരണം അതിന് ആവശ്യമില്ല. ചിലത് മണ്ടത്തരം അല്ലെങ്കിൽ പ്രസക്തമല്ലാത്ത നെഗറ്റീവ് ഹോട്ടൽ റിവ്യൂകൾ ആണ്, ഉദാഹരണത്തിന് "കാലാവസ്ഥ നല്ലതായിരുന്നില്ല", ഹോട്ടലിന്റെ നിയന്ത്രണത്തിന് പുറത്തുള്ള കാര്യം, അല്ലെങ്കിൽ യാതൊരു വ്യക്തിയുടെയും. എന്നാൽ ചില റിവ്യൂകളിൽ ഇരുണ്ട വശവും ഉണ്ട്. ചിലപ്പോൾ നെഗറ്റീവ് റിവ്യൂകൾ ജാതിവാദപരമായോ, ലിംഗവാദപരമായോ, പ്രായഭേദപരമായോ ആയിരിക്കും. ഇത് ദുർഭാഗ്യകരമാണ്, പക്ഷേ പൊതുജന വെബ്സൈറ്റിൽ നിന്നുള്ള ഡാറ്റാസെറ്റിൽ പ്രതീക്ഷിക്കാവുന്നതാണ്. ചില റിവ്യൂവഴി നിങ്ങൾക്ക് അസ്വസ്ഥതയോ, അസ്വസ്ഥതയോ, വിഷമതയോ ഉണ്ടാകാം. കോഡ് മനോഭാവം അളക്കട്ടെ, നിങ്ങൾ തന്നെ വായിച്ച് വിഷമിക്കേണ്ടതില്ല. എന്നാൽ ഇത്തരത്തിലുള്ളവ കുറവാണ്, പക്ഷേ അവ ഉണ്ടെന്നതാണ്.
## അഭ്യാസം - ഡാറ്റാ എക്സ്പ്ലോറേഷൻ
### ഡാറ്റ ലോഡ് ചെയ്യുക
ഡാറ്റ ദൃശ്യമായി പരിശോധിക്കാൻ ഇത്രയും മതി, ഇനി നിങ്ങൾക്ക് കോഡ് എഴുതിയും ചില ഉത്തരങ്ങൾ കണ്ടെത്തിയും നോക്കാം! ഈ ഭാഗം pandas ലൈബ്രറി ഉപയോഗിക്കുന്നു. നിങ്ങളുടെ ആദ്യത്തെ ജോലി CSV ഡാറ്റ ലോഡ് ചെയ്ത് വായിക്കാൻ കഴിയുന്നുണ്ടെന്ന് ഉറപ്പാക്കുക. pandas ലൈബ്രറിയിൽ വേഗത്തിലുള്ള CSV ലോഡർ ഉണ്ട്, ഫലം ഒരു ഡാറ്റാഫ്രെയിമിൽ സൂക്ഷിക്കുന്നു, മുമ്പത്തെ പാഠങ്ങളിലുപോലെ. ലോഡ് ചെയ്യുന്ന CSV-യിൽ അർധമില്യൺ ലൈനുകൾക്കു മുകളിൽ ഉണ്ട്, പക്ഷേ 17 കോളങ്ങൾ മാത്രം. pandas ഡാറ്റാഫ്രെയിമുമായി ഇടപഴകാൻ ശക്തമായ മാർഗങ്ങൾ നൽകുന്നു, ഓരോ വരിയിലും പ്രവർത്തനങ്ങൾ നടത്താനുള്ള കഴിവ് ഉൾപ്പെടെ.
ഇവിടെ നിന്നു തുടർന്നുള്ള പാഠത്തിൽ, കോഡ് സ്നിപ്പറ്റുകളും ചില വിശദീകരണങ്ങളും ഫലങ്ങളുടെ അർത്ഥം സംബന്ധിച്ച ചർച്ചകളും ഉണ്ടാകും. നിങ്ങളുടെ കോഡിനായി ഉൾപ്പെടുത്തിയ _notebook.ipynb_ ഉപയോഗിക്കുക.
നിങ്ങൾ ഉപയോഗിക്കുന്ന ഡാറ്റ ഫയൽ ലോഡ് ചെയ്യുന്നതിൽ നിന്ന് തുടങ്ങാം:
```python
# CSV-ൽ നിന്ന് ഹോട്ടൽ റിവ്യൂകൾ ലോഡ് ചെയ്യുക
import pandas as pd
import time
# ഫയൽ ലോഡിംഗ് സമയം കണക്കാക്കാൻ ആരംഭവും അവസാനവും സമയങ്ങൾ ഉപയോഗിക്കാൻ time ഇംപോർട്ട് ചെയ്യുന്നു
print("Loading data file now, this could take a while depending on file size")
start = time.time()
# df 'DataFrame' ആണ് - ഫയൽ data ഫോൾഡറിൽ ഡൗൺലോഡ് ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക
df = pd.read_csv('../../data/Hotel_Reviews.csv')
end = time.time()
print("Loading took " + str(round(end - start, 2)) + " seconds")
```
ഇപ്പോൾ ഡാറ്റ ലോഡ് ചെയ്തതിനുശേഷം, അതിൽ ചില പ്രവർത്തനങ്ങൾ നടത്താം. അടുത്ത ഭാഗത്തിനായി ഈ കോഡ് നിങ്ങളുടെ പ്രോഗ്രാമിന്റെ മുകളിൽ സൂക്ഷിക്കുക.
## ഡാറ്റ എക്സ്പ്ലോർ ചെയ്യുക
ഈ കേസിൽ, ഡാറ്റ ഇതിനകം *ശുദ്ധമാണ്*, അതായത് ഇത് ഉപയോഗിക്കാൻ തയ്യാറാണ്, ഇംഗ്ലീഷ് അക്ഷരങ്ങൾ മാത്രമേ പ്രതീക്ഷിക്കുന്നുള്ള ആൽഗോരിതങ്ങൾ തടസ്സപ്പെടാതിരിക്കാൻ മറ്റ് ഭാഷകളിലെ അക്ഷരങ്ങൾ ഇല്ല.
✅ ചിലപ്പോൾ നിങ്ങൾക്ക് NLP സാങ്കേതികവിദ്യകൾ പ്രയോഗിക്കുന്നതിന് മുമ്പ് ഡാറ്റ പ്രോസസ്സ് ചെയ്യേണ്ടി വരാം, പക്ഷേ ഈ തവണ അതില്ല. നിങ്ങൾ ചെയ്യേണ്ടി വന്നിരുന്നെങ്കിൽ, നിങ്ങൾ എങ്ങനെ ഇംഗ്ലീഷ് അല്ലാത്ത അക്ഷരങ്ങൾ കൈകാര്യം ചെയ്യുമായിരുന്നു?
ഡാറ്റ ലോഡ് ചെയ്ത ശേഷം, കോഡിലൂടെ അത് എങ്ങനെ എക്സ്പ്ലോർ ചെയ്യാമെന്ന് ഉറപ്പാക്കാൻ ഒരു നിമിഷം ചെലവഴിക്കുക. `Negative_Review` ഉം `Positive_Review` ഉം കോളങ്ങൾക്കു മാത്രം ശ്രദ്ധ കേന്ദ്രീകരിക്കാൻ എളുപ്പമാണ്. അവ നിങ്ങളുടെ NLP ആൽഗോരിതങ്ങൾ പ്രോസസ്സ് ചെയ്യാൻ സ്വാഭാവിക ടെക്സ്റ്റ് നിറച്ചിരിക്കുന്നു. പക്ഷേ കാത്തിരിക്കുക! NLP-യിലും മനോഭാവത്തിലും ചാടുന്നതിന് മുമ്പ്, ഡാറ്റാസെറ്റിൽ നൽകിയ മൂല്യങ്ങൾ pandas ഉപയോഗിച്ച് നിങ്ങൾ കണക്കാക്കിയ മൂല്യങ്ങളുമായി പൊരുത്തപ്പെടുന്നുണ്ടോ എന്ന് താഴെ കൊടുത്തിരിക്കുന്ന കോഡ് പിന്തുടർന്ന് പരിശോധിക്കുക.
## ഡാറ്റാഫ്രെയിം പ്രവർത്തനങ്ങൾ
ഈ പാഠത്തിലെ ആദ്യത്തെ ജോലി, ഡാറ്റാഫ്രെയിം പരിശോധിക്കുന്ന (മാറ്റം വരുത്താതെ) ചില കോഡ് എഴുതിയാണ് താഴെ കൊടുത്തിരിക്കുന്ന അവകാശവാദങ്ങൾ ശരിയാണോ എന്ന് പരിശോധിക്കുക.
> പല പ്രോഗ്രാമിംഗ് ജോലികളിലും, ഇത് പൂർത്തിയാക്കാനുള്ള പല മാർഗ്ഗങ്ങളുണ്ട്, പക്ഷേ നല്ല ഉപദേശം, ഇത് എളുപ്പവും മനസ്സിലാക്കാൻ എളുപ്പവുമായ രീതിയിൽ ചെയ്യുക, പ്രത്യേകിച്ച് ഈ കോഡിലേക്ക് വീണ്ടും വരുമ്പോൾ. ഡാറ്റാഫ്രെയിമുകളിൽ, നിങ്ങൾക്ക് സാധാരണയായി ആവശ്യമായ കാര്യങ്ങൾ കാര്യക്ഷമമായി ചെയ്യാനുള്ള സമഗ്ര API ഉണ്ട്.
താഴെ കൊടുത്തിരിക്കുന്ന ചോദ്യങ്ങളെ കോഡിംഗ് ടാസ്കുകളായി പരിഗണിച്ച് പരിഹാരമില്ലാതെ അവയ്ക്ക് ശ്രമിക്കുക.
1. നിങ്ങൾ ഇപ്പോൾ ലോഡ് ചെയ്ത ഡാറ്റാഫ്രെയിമിന്റെ *ആകൃതി* പ്രിന്റ് ചെയ്യുക (ആകൃതി എന്നത് വരികളും കോളങ്ങളുമാണ്)
2. റിവ്യൂവറുടെ ദേശീയതയുടെ ഫ്രീക്വൻസി കണക്കാക്കുക:
1. `Reviewer_Nationality` കോളത്തിനുള്ള വ്യത്യസ്ത മൂല്യങ്ങൾ എത്രയും എന്തെല്ലാം?
2. ഡാറ്റാസെറ്റിൽ ഏറ്റവും സാധാരണമായ റിവ്യൂവർ ദേശീയത ഏതാണ് (രാജ്യവും റിവ്യൂവുകളുടെ എണ്ണവും പ്രിന്റ് ചെയ്യുക)?
3. അടുത്ത 10 ഏറ്റവും സാധാരണമായ ദേശീയതകളും അവയുടെ ഫ്രീക്വൻസി കണക്കുകളും എന്തെല്ലാം?
3. ടോപ്പ് 10 റിവ്യൂവർ ദേശീയതകളിൽ ഓരോന്നിനും ഏറ്റവും കൂടുതൽ റിവ്യൂ ലഭിച്ച ഹോട്ടൽ ഏതാണ്?
4. ഡാറ്റാസെറ്റിൽ ഓരോ ഹോട്ടലിനും എത്ര റിവ്യൂവുകൾ ഉണ്ട് (ഹോട്ടലിന്റെ ഫ്രീക്വൻസി കണക്കുകൾ)?
5. ഡാറ്റാസെറ്റിൽ ഓരോ ഹോട്ടലിനും `Average_Score` കോളം ഉണ്ടെങ്കിലും, നിങ്ങൾക്ക് ഓരോ ഹോട്ടലിനും ഡാറ്റാസെറ്റിലെ എല്ലാ റിവ്യൂവറുടെ സ്കോറുകളുടെ ശരാശരി കണക്കാക്കാം. കണക്കാക്കിയ ശരാശരി അടങ്ങിയ `Calc_Average_Score` എന്ന പുതിയ കോളം നിങ്ങളുടെ ഡാറ്റാഫ്രെയിമിൽ ചേർക്കുക.
6. ഏതെങ്കിലും ഹോട്ടലുകൾക്ക് (1 ദശാംശ സ്ഥാനം വരെ വട്ടംചുറ്റിയപ്പോൾ) `Average_Score` ഉം `Calc_Average_Score` ഉം ഒരുപോലെയുണ്ടോ?
1. ഒരു Python ഫംഗ്ഷൻ എഴുതാൻ ശ്രമിക്കുക, അത് ഒരു Series (വരി) аргументായി സ്വീകരിച്ച് മൂല്യങ്ങൾ താരതമ്യം ചെയ്ത്, മൂല്യങ്ങൾ തുല്യമായില്ലെങ്കിൽ സന്ദേശം പ്രിന്റ് ചെയ്യുന്നു. പിന്നീട് `.apply()` മെത്തഡ് ഉപയോഗിച്ച് എല്ലാ വരികളും പ്രോസസ്സ് ചെയ്യുക.
7. `Negative_Review` കോളത്തിൽ "No Negative" ഉള്ള വരികളുടെ എണ്ണം കണക്കാക്കി പ്രിന്റ് ചെയ്യുക
8. `Positive_Review` കോളത്തിൽ "No Positive" ഉള്ള വരികളുടെ എണ്ണം കണക്കാക്കി പ്രിന്റ് ചെയ്യുക
9. `Positive_Review` കോളത്തിൽ "No Positive" **ഉം** `Negative_Review` കോളത്തിൽ "No Negative" ഉള്ള വരികളുടെ എണ്ണം കണക്കാക്കി പ്രിന്റ് ചെയ്യുക
### കോഡ് ഉത്തരങ്ങൾ
1. നിങ്ങൾ ഇപ്പോൾ ലോഡ് ചെയ്ത ഡാറ്റാഫ്രെയിമിന്റെ *ആകൃതി* പ്രിന്റ് ചെയ്യുക (ആകൃതി എന്നത് വരികളും കോളങ്ങളുമാണ്)
```python
print("The shape of the data (rows, cols) is " + str(df.shape))
> The shape of the data (rows, cols) is (515738, 17)
```
2. റിവ്യൂവർ ദേശീയതയുടെ ഫ്രീക്വൻസി കണക്കാക്കുക:
1. `Reviewer_Nationality` കോളത്തിനുള്ള വ്യത്യസ്ത മൂല്യങ്ങൾ എത്രയും എന്തെല്ലാം?
2. ഡാറ്റാസെറ്റിൽ ഏറ്റവും സാധാരണമായ റിവ്യൂവർ ദേശീയത ഏതാണ് (രാജ്യവും റിവ്യൂവുകളുടെ എണ്ണവും പ്രിന്റ് ചെയ്യുക)?
```python
# value_counts() ഒരു സീരീസ് ഒബ്ജക്റ്റ് സൃഷ്ടിക്കുന്നു, ഇതിൽ ഇൻഡക്സ് കൂടാതെ മൂല്യങ്ങളും ഉണ്ടാകുന്നു, ഈ കേസിൽ, രാജ്യവും അവ അവലോകനകാരന്റെ ദേശീയതയിൽ ഉണ്ടാകുന്ന ആവർത്തനവും ആണ്
nationality_freq = df["Reviewer_Nationality"].value_counts()
print("There are " + str(nationality_freq.size) + " different nationalities")
# സീരീസിന്റെ ആദ്യവും അവസാനവും വരികൾ പ്രിന്റ് ചെയ്യുക. എല്ലാ ഡാറ്റയും പ്രിന്റ് ചെയ്യാൻ nationality_freq.to_string() ആയി മാറ്റുക
print(nationality_freq)
There are 227 different nationalities
United Kingdom 245246
United States of America 35437
Australia 21686
Ireland 14827
United Arab Emirates 10235
...
Comoros 1
Palau 1
Northern Mariana Islands 1
Cape Verde 1
Guinea 1
Name: Reviewer_Nationality, Length: 227, dtype: int64
```
3. അടുത്ത 10 ഏറ്റവും സാധാരണമായ ദേശീയതകളും അവയുടെ ഫ്രീക്വൻസി കണക്കുകളും എന്തെല്ലാം?
```python
print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.")
# മൂല്യങ്ങളിൽ ഒരു മുൻനിര സ്ഥലം കാണുക, പ്രിന്റ് ചെയ്യുന്നതിനായി strip() അത് നീക്കം ചെയ്യുന്നു
# ഏറ്റവും സാധാരണമായ 10 ദേശീയതകളും അവയുടെ ആവർത്തനങ്ങളും എന്തൊക്കെയാണ്?
print("The next 10 highest frequency reviewer nationalities are:")
print(nationality_freq[1:11].to_string())
The highest frequency reviewer nationality is United Kingdom with 245246 reviews.
The next 10 highest frequency reviewer nationalities are:
United States of America 35437
Australia 21686
Ireland 14827
United Arab Emirates 10235
Saudi Arabia 8951
Netherlands 8772
Switzerland 8678
Germany 7941
Canada 7894
France 7296
```
3. ടോപ്പ് 10 റിവ്യൂവർ ദേശീയതകളിൽ ഓരോന്നിനും ഏറ്റവും കൂടുതൽ റിവ്യൂ ലഭിച്ച ഹോട്ടൽ ഏതാണ്?
```python
# മുകളിൽ 10 ദേശീയതകളിൽ ഏറ്റവും അധികം അവലോകനം ചെയ്ത ഹോട്ടൽ ഏതാണ്
# സാധാരണയായി pandas ഉപയോഗിക്കുമ്പോൾ നിങ്ങൾ വ്യക്തമായ ലൂപ്പ് ഒഴിവാക്കും, പക്ഷേ മാനദണ്ഡങ്ങൾ ഉപയോഗിച്ച് പുതിയ ഡാറ്റാഫ്രെയിം സൃഷ്ടിക്കുന്നത് കാണിക്കാൻ ആഗ്രഹിച്ചു (വലിയ ഡാറ്റയുമായി ഇത് ചെയ്യരുത് കാരണം ഇത് വളരെ മന്ദഗതിയാകാം)
for nat in nationality_freq[:10].index:
# ആദ്യം, മാനദണ്ഡങ്ങൾ പാലിക്കുന്ന എല്ലാ വരികളും പുതിയ ഡാറ്റാഫ്രെയിമിലേക്ക് എടുക്കുക
nat_df = df[df["Reviewer_Nationality"] == nat]
# ഇപ്പോൾ ഹോട്ടലിന്റെ ആവർത്തനസംഖ്യ നേടുക
freq = nat_df["Hotel_Name"].value_counts()
print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.")
The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews.
The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews.
The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews.
The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews.
The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews.
The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews.
The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews.
The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews.
The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews.
The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews.
```
4. ഡാറ്റാസെറ്റിൽ ഓരോ ഹോട്ടലിനും എത്ര റിവ്യൂവുകൾ ഉണ്ട് (ഹോട്ടലിന്റെ ഫ്രീക്വൻസി കണക്കുകൾ)?
```python
# പഴയ ഡാറ്റാഫ്രെയിമിനെ അടിസ്ഥാനമാക്കി പുതിയ ഒരു ഡാറ്റാഫ്രെയിം സൃഷ്ടിക്കുക, ആവശ്യമില്ലാത്ത കോളങ്ങൾ നീക്കംചെയ്യുക
hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1)
# Hotel_Name പ്രകാരം വരികൾ ഗ്രൂപ്പുചെയ്യുക, അവയുടെ എണ്ണം കണക്കാക്കുക, ഫലം Total_Reviews_Found എന്ന പുതിയ കോളത്തിൽ ഇടുക
hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count')
# എല്ലാ പുനരാവൃത വരികളും നീക്കംചെയ്യുക
hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"])
display(hotel_freq_df)
```
| Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found |
| :----------------------------------------: | :---------------------: | :-----------------: |
| Britannia International Hotel Canary Wharf | 9086 | 4789 |
| Park Plaza Westminster Bridge London | 12158 | 4169 |
| Copthorne Tara Hotel London Kensington | 7105 | 3578 |
| ... | ... | ... |
| Mercure Paris Porte d Orleans | 110 | 10 |
| Hotel Wagner | 135 | 10 |
| Hotel Gallitzinberg | 173 | 8 |
നിങ്ങൾ ശ്രദ്ധിക്കാം, ഡാറ്റാസെറ്റിൽ കണക്കാക്കിയ ഫലങ്ങൾ `Total_Number_of_Reviews`-നുള്ള മൂല്യവുമായി പൊരുത്തപ്പെടുന്നില്ല. ഈ മൂല്യം ഹോട്ടലിന് ഉണ്ടായ മൊത്തം റിവ്യൂവുകളുടെ എണ്ണം പ്രതിനിധീകരിക്കുന്നുണ്ടോ, അല്ലെങ്കിൽ എല്ലാം സ്ക്രാപ്പ് ചെയ്തിട്ടില്ല, അല്ലെങ്കിൽ മറ്റേതെങ്കിലും കണക്കുകൂട്ടലാണോ എന്ന് വ്യക്തമല്ല. ഈ അനിശ്ചിതത്വം കാരണം `Total_Number_of_Reviews` മോഡലിൽ ഉപയോഗിക്കുന്നില്ല.
5. ഡാറ്റാസെറ്റിൽ ഓരോ ഹോട്ടലിനും `Average_Score` കോളം ഉണ്ടെങ്കിലും, നിങ്ങൾക്ക് ഓരോ ഹോട്ടലിനും ഡാറ്റാസെറ്റിലെ എല്ലാ റിവ്യൂവറുടെ സ്കോറുകളുടെ ശരാശരി കണക്കാക്കാം. കണക്കാക്കിയ ശരാശരി അടങ്ങിയ `Calc_Average_Score` എന്ന പുതിയ കോളം നിങ്ങളുടെ ഡാറ്റാഫ്രെയിമിൽ ചേർക്കുക. `Hotel_Name`, `Average_Score`, `Calc_Average_Score` കോളങ്ങൾ പ്രിന്റ് ചെയ്യുക.
```python
# ഒരു വരി സ്വീകരിച്ച് അതുമായി ചില കണക്കുകൂട്ടലുകൾ നടത്തുന്ന ഒരു ഫംഗ്ഷൻ നിർവചിക്കുക
def get_difference_review_avg(row):
return row["Average_Score"] - row["Calc_Average_Score"]
# 'mean' എന്നത് 'ശരാശരി' എന്ന ഗണിതപരമായ പദമാണ്
df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
# രണ്ട് ശരാശരി സ്കോറുകൾ തമ്മിലുള്ള വ്യത്യാസം ഉൾപ്പെടുന്ന ഒരു പുതിയ കോളം ചേർക്കുക
df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1)
# Hotel_Name ന്റെ എല്ലാ പകർപ്പുകളും ഇല്ലാത്ത ഒരു df സൃഷ്ടിക്കുക (അതായത് ഓരോ ഹോട്ടലിനും 1 വരി മാത്രം)
review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"])
# ഏറ്റവും കുറഞ്ഞതും ഏറ്റവും ഉയർന്നതുമായ ശരാശരി സ്കോർ വ്യത്യാസം കണ്ടെത്താൻ ഡാറ്റാഫ്രെയിം സോർട്ട് ചെയ്യുക
review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"])
display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]])
```
നിങ്ങൾക്ക് `Average_Score` മൂല്യത്തെക്കുറിച്ച് സംശയമുണ്ടാകാം, ചിലപ്പോൾ കണക്കാക്കിയ ശരാശരിയുമായി വ്യത്യാസമുണ്ടാകുന്നത് എന്തുകൊണ്ടാണെന്ന്. ചില മൂല്യങ്ങൾ പൊരുത്തപ്പെടുന്നില്ലെങ്കിൽ എന്തുകൊണ്ടാണെന്ന് അറിയാനാകാത്തതിനാൽ, ഈ സാഹചര്യത്തിൽ ഞങ്ങൾക്കുള്ള റിവ്യൂ സ്കോറുകൾ ഉപയോഗിച്ച് ശരാശരി സ്വയം കണക്കാക്കുന്നത് സുരക്ഷിതമാണ്. എന്നാൽ വ്യത്യാസങ്ങൾ സാധാരണയായി വളരെ ചെറിയതാണ്, താഴെ ഡാറ്റാസെറ്റിലെ ശരാശരിയിലും കണക്കാക്കിയ ശരാശരിയിലും ഏറ്റവും വലിയ വ്യത്യാസമുള്ള ഹോട്ടലുകൾ കാണിക്കുന്നു:
| Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Name |
| :----------------------: | :-----------: | :----------------: | ------------------------------------------: |
| -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria |
| -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery |
| -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans |
| -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel |
| -0.5 | 7.0 | 7.5 | Hotel Royal Elys es |
| ... | ... | ... | ... |
| 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre |
| 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur |
| 0.9 | 6.8 | 5.9 | Villa Eugenie |
| 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux |
| 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar |
ഒരു ഹോട്ടലിനും 1-ലധികം വ്യത്യാസമുണ്ടായിട്ടില്ലാത്തതിനാൽ, വ്യത്യാസം അവഗണിച്ച് കണക്കാക്കിയ ശരാശരി സ്കോർ ഉപയോഗിക്കാം.
6. `Negative_Review` കോളത്തിൽ "No Negative" ഉള്ള വരികളുടെ എണ്ണം കണക്കാക്കി പ്രിന്റ് ചെയ്യുക
7. `Positive_Review` കോളത്തിൽ "No Positive" ഉള്ള വരികളുടെ എണ്ണം കണക്കാക്കി പ്രിന്റ് ചെയ്യുക
8. `Positive_Review` കോളത്തിൽ "No Positive" **ഉം** `Negative_Review` കോളത്തിൽ "No Negative" ഉള്ള വരികളുടെ എണ്ണം കണക്കാക്കി പ്രിന്റ് ചെയ്യുക
```python
# ലാംബ്ഡാസിനൊപ്പം:
start = time.time()
no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1)
print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index)))
no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1)
print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index)))
both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1)
print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index)))
end = time.time()
print("Lambdas took " + str(round(end - start, 2)) + " seconds")
Number of No Negative reviews: 127890
Number of No Positive reviews: 35946
Number of both No Negative and No Positive reviews: 127
Lambdas took 9.64 seconds
```
## മറ്റൊരു മാർഗ്ഗം
ലാംബ്ഡകൾ ഇല്ലാതെ ഇനങ്ങൾ എണ്ണാനുള്ള മറ്റൊരു മാർഗ്ഗം, വരികൾ എണ്ണാൻ sum ഉപയോഗിക്കുക:
```python
# ലാംബ്ഡകൾ ഇല്ലാതെ (രണ്ടും ഉപയോഗിക്കാമെന്ന് കാണിക്കാൻ വിവിധ നോട്ടേഷനുകളുടെ മിശ്രിതം ഉപയോഗിച്ച്)
start = time.time()
no_negative_reviews = sum(df.Negative_Review == "No Negative")
print("Number of No Negative reviews: " + str(no_negative_reviews))
no_positive_reviews = sum(df["Positive_Review"] == "No Positive")
print("Number of No Positive reviews: " + str(no_positive_reviews))
both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive"))
print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews))
end = time.time()
print("Sum took " + str(round(end - start, 2)) + " seconds")
Number of No Negative reviews: 127890
Number of No Positive reviews: 35946
Number of both No Negative and No Positive reviews: 127
Sum took 0.19 seconds
```
നിങ്ങൾ ശ്രദ്ധിച്ചിരിക്കാം, `Negative_Review`-ലും `Positive_Review`-ലും "No Negative" ഉം "No Positive" ഉം ഉള്ള 127 വരികൾ ഉണ്ട്. അതായത് റിവ്യൂവർ ഹോട്ടലിന് സംഖ്യാത്മക സ്കോർ നൽകിയിട്ടുണ്ട്, പക്ഷേ പോസിറ്റീവ് അല്ലെങ്കിൽ നെഗറ്റീവ് റിവ്യൂ എഴുതാൻ തയാറായില്ല. ഭാഗ്യവശാൽ ഇത് ചെറിയ എണ്ണം മാത്രമാണ് (127/515738, 0.02%), അതിനാൽ ഇത് നമ്മുടെ മോഡലിനോ ഫലങ്ങളിലോ പ്രത്യേകമായി ബാധിക്കില്ല. എന്നാൽ റിവ്യൂ ഇല്ലാത്ത വരികൾ ഉള്ള ഡാറ്റാസെറ്റ് ഉണ്ടാകുമെന്ന് നിങ്ങൾ പ്രതീക്ഷിക്കാത്തതായിരിക്കും, അതിനാൽ ഇത്തരത്തിലുള്ള വരികൾ കണ്ടെത്താൻ ഡാറ്റ എക്സ്പ്ലോർ ചെയ്യുന്നത് മൂല്യവത്താണ്.
ഇപ്പോൾ നിങ്ങൾ ഡാറ്റാസെറ്റ് എക്സ്പ്ലോർ ചെയ്തു കഴിഞ്ഞു, അടുത്ത പാഠത്തിൽ നിങ്ങൾ ഡാറ്റ ഫിൽട്ടർ ചെയ്ത് ചില മനോഭാവ വിശകലനം ചേർക്കും.
---
## 🚀ചലഞ്ച്
ഈ പാഠം, മുമ്പത്തെ പാഠങ്ങളിൽ കണ്ടതുപോലെ, നിങ്ങളുടെ ഡാറ്റയും അതിന്റെ പ്രത്യേകതകളും മനസ്സിലാക്കുന്നത് എത്രത്തോളം പ്രധാനമാണെന്ന് കാണിക്കുന്നു. പ്രത്യേകിച്ച് ടെക്സ്റ്റ് അടിസ്ഥാനമാക്കിയ ഡാറ്റ വളരെ സൂക്ഷ്മ പരിശോധന ആവശ്യമാണ്. വിവിധ ടെക്സ്റ്റ്-ഭാരിത ഡാറ്റാസെറ്റുകൾ പരിശോധിച്ച്, മോഡലിൽ പകുതി വയ്ക്കുന്ന ബയാസുകൾ അല്ലെങ്കിൽ വക്രമായ മനോഭാവം ഉണ്ടാക്കാവുന്ന മേഖലകൾ കണ്ടെത്താൻ ശ്രമിക്കുക.
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
[ഈ NLP ലേണിംഗ് പാത്ത്](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) സ്വീകരിച്ച്, സ്പീച്ച്, ടെക്സ്റ്റ്-ഭാരിത മോഡലുകൾ നിർമ്മിക്കുമ്പോൾ പരീക്ഷിക്കാവുന്ന ഉപകരണങ്ങൾ കണ്ടെത്തുക.
## അസൈൻമെന്റ്
[NLTK](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,21 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "bf39bceb833cd628f224941dca8041df",
"translation_date": "2025-12-19T14:24:42+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/assignment.md",
"language_code": "ml"
}
-->
# NLTK
## നിർദ്ദേശങ്ങൾ
NLTK കംപ്യൂട്ടേഷണൽ ഭാഷാശാസ്ത്രത്തിലും NLP യിലും ഉപയോഗിക്കുന്ന ഒരു പ്രശസ്ത ലൈബ്രറിയാണ്. '[NLTK പുസ്തകം](https://www.nltk.org/book/)' വായിച്ച് അതിലെ അഭ്യാസങ്ങൾ പരീക്ഷിക്കാൻ ഈ അവസരം ഉപയോഗിക്കുക. ഈ ഗ്രേഡ് ഇല്ലാത്ത അസൈൻമെന്റിൽ, നിങ്ങൾക്ക് ഈ ലൈബ്രറി കൂടുതൽ ആഴത്തിൽ അറിയാൻ സാധിക്കും.
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T14:47:39+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്‌ഹോൾഡറാണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ പ്രാമാണികമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-12-19T14:48:11+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/R/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡറാണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,174 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 4,
"coopTranslator": {
"original_hash": "2d05e7db439376aa824f4b387f8324ca",
"translation_date": "2025-12-19T16:49:28+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# EDA\n",
"import pandas as pd\n",
"import time"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def get_difference_review_avg(row):\n",
" return row[\"Average_Score\"] - row[\"Calc_Average_Score\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV\n",
"print(\"Loading data file now, this could take a while depending on file size\")\n",
"start = time.time()\n",
"df = pd.read_csv('../../data/Hotel_Reviews.csv')\n",
"end = time.time()\n",
"print(\"Loading took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What shape is the data (rows, columns)?\n",
"print(\"The shape of the data (rows, cols) is \" + str(df.shape))\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# value_counts() creates a Series object that has index and values\n",
"# in this case, the country and the frequency they occur in reviewer nationality\n",
"nationality_freq = df[\"Reviewer_Nationality\"].value_counts()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What reviewer nationality is the most common in the dataset?\n",
"print(\"The highest frequency reviewer nationality is \" + str(nationality_freq.index[0]).strip() + \" with \" + str(nationality_freq[0]) + \" reviews.\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What is the top 10 most common nationalities and their frequencies?\n",
"print(\"The top 10 highest frequency reviewer nationalities are:\")\n",
"print(nationality_freq[0:10].to_string())\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# How many unique nationalities are there?\n",
"print(\"There are \" + str(nationality_freq.index.size) + \" unique nationalities in the dataset\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# What was the most frequently reviewed hotel for the top 10 nationalities - print the hotel and number of reviews\n",
"for nat in nationality_freq[:10].index:\n",
" # First, extract all the rows that match the criteria into a new dataframe\n",
" nat_df = df[df[\"Reviewer_Nationality\"] == nat] \n",
" # Now get the hotel freq\n",
" freq = nat_df[\"Hotel_Name\"].value_counts()\n",
" print(\"The most reviewed hotel for \" + str(nat).strip() + \" was \" + str(freq.index[0]) + \" with \" + str(freq[0]) + \" reviews.\") \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# How many reviews are there per hotel (frequency count of hotel) and do the results match the value in `Total_Number_of_Reviews`?\n",
"# First create a new dataframe based on the old one, removing the uneeded columns\n",
"hotel_freq_df = df.drop([\"Hotel_Address\", \"Additional_Number_of_Scoring\", \"Review_Date\", \"Average_Score\", \"Reviewer_Nationality\", \"Negative_Review\", \"Review_Total_Negative_Word_Counts\", \"Positive_Review\", \"Review_Total_Positive_Word_Counts\", \"Total_Number_of_Reviews_Reviewer_Has_Given\", \"Reviewer_Score\", \"Tags\", \"days_since_review\", \"lat\", \"lng\"], axis = 1)\n",
"# Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found\n",
"hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count')\n",
"# Get rid of all the duplicated rows\n",
"hotel_freq_df = hotel_freq_df.drop_duplicates(subset = [\"Hotel_Name\"])\n",
"print()\n",
"print(hotel_freq_df.to_string())\n",
"print(str(hotel_freq_df.shape))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# While there is an `Average_Score` for each hotel according to the dataset, \n",
"# you can also calculate an average score (getting the average of all reviewer scores in the dataset for each hotel)\n",
"# Add a new column to your dataframe with the column header `Calc_Average_Score` that contains that calculated average. \n",
"df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)\n",
"# Add a new column with the difference between the two average scores\n",
"df[\"Average_Score_Difference\"] = df.apply(get_difference_review_avg, axis = 1)\n",
"# Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel)\n",
"review_scores_df = df.drop_duplicates(subset = [\"Hotel_Name\"])\n",
"# Sort the dataframe to find the lowest and highest average score difference\n",
"review_scores_df = review_scores_df.sort_values(by=[\"Average_Score_Difference\"])\n",
"print(review_scores_df[[\"Average_Score_Difference\", \"Average_Score\", \"Calc_Average_Score\", \"Hotel_Name\"]])\n",
"# Do any hotels have the same (rounded to 1 decimal place) `Average_Score` and `Calc_Average_Score`?\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാപത്രം**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,391 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "2c742993fe95d5bcbb2846eda3d442a1",
"translation_date": "2025-12-19T14:41:03+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/README.md",
"language_code": "ml"
}
-->
# ഹോട്ടൽ റിവ്യൂകളുമായി അനുഭവം വിശകലനം
ഇപ്പോൾ നിങ്ങൾ ഡാറ്റാസെറ്റ് വിശദമായി പരിശോധിച്ചിരിക്കുന്നു, കോളങ്ങൾ ഫിൽട്ടർ ചെയ്ത് പിന്നീട് ഡാറ്റാസെറ്റിൽ NLP സാങ്കേതിക വിദ്യകൾ ഉപയോഗിച്ച് ഹോട്ടലുകളെക്കുറിച്ചുള്ള പുതിയ洞察ങ്ങൾ നേടാനുള്ള സമയം.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
### ഫിൽട്ടറിംഗ് & അനുഭവം വിശകലന പ്രവർത്തനങ്ങൾ
നിങ്ങൾ ശ്രദ്ധിച്ചിരിക്കാം, ഡാറ്റാസെറ്റിൽ ചില പ്രശ്നങ്ങളുണ്ട്. ചില കോളങ്ങൾ ഉപകാരമില്ലാത്ത വിവരങ്ങൾ നിറഞ്ഞിരിക്കുന്നു, മറ്റുള്ളവ തെറ്റായതായി തോന്നുന്നു. ശരിയാണെങ്കിൽ, അവ എങ്ങനെ കണക്കാക്കിയതെന്ന് വ്യക്തമല്ല, നിങ്ങളുടെ സ്വന്തം കണക്കുകൾ ഉപയോഗിച്ച് സ്വതന്ത്രമായി സ്ഥിരീകരിക്കാൻ കഴിയില്ല.
## അഭ്യാസം: കുറച്ച് കൂടുതൽ ഡാറ്റ പ്രോസസ്സിംഗ്
ഡാറ്റ കുറച്ച് കൂടുതൽ ശുദ്ധമാക്കുക. പിന്നീട് ഉപകാരപ്രദമായ കോളങ്ങൾ ചേർക്കുക, മറ്റു കോളങ്ങളിലെ മൂല്യങ്ങൾ മാറ്റുക, ചില കോളങ്ങൾ പൂർണ്ണമായും ഒഴിവാക്കുക.
1. പ്രാഥമിക കോളം പ്രോസസ്സിംഗ്
1. `lat` and `lng` ഒഴിവാക്കുക
2. `Hotel_Address` മൂല്യങ്ങൾ താഴെപ്പറയുന്ന മൂല്യങ്ങളാൽ മാറ്റുക (അഡ്രസിൽ നഗരം, രാജ്യം ഒരുപോലെ ഉണ്ടെങ്കിൽ, അത് നഗരവും രാജ്യവും മാത്രം മാറ്റുക).
ഡാറ്റാസെറ്റിലെ ഏകദേശം ഈ നഗരങ്ങളും രാജ്യങ്ങളും മാത്രമാണ്:
ആംസ്റ്റർഡാം, നെതർലാൻഡ്‌സ്
ബാഴ്‌സലോണ, സ്പെയിൻ
ലണ്ടൻ, യുണൈറ്റഡ് കിംഗ്‌ഡം
മിലാൻ, ഇറ്റലി
പാരിസ്, ഫ്രാൻസ്
വിയന്ന, ഓസ്ട്രിയ
```python
def replace_address(row):
if "Netherlands" in row["Hotel_Address"]:
return "Amsterdam, Netherlands"
elif "Barcelona" in row["Hotel_Address"]:
return "Barcelona, Spain"
elif "United Kingdom" in row["Hotel_Address"]:
return "London, United Kingdom"
elif "Milan" in row["Hotel_Address"]:
return "Milan, Italy"
elif "France" in row["Hotel_Address"]:
return "Paris, France"
elif "Vienna" in row["Hotel_Address"]:
return "Vienna, Austria"
# എല്ലാ വിലാസങ്ങളും ചുരുക്കിയ, കൂടുതൽ ഉപയോഗപ്രദമായ രൂപത്തിലേക്ക് മാറ്റുക
df["Hotel_Address"] = df.apply(replace_address, axis = 1)
# value_counts() ന്റെ മൊത്തം സംഖ്യ റിവ്യൂകളുടെ മൊത്തം എണ്ണത്തോടൊപ്പം ചേർന്നിരിക്കണം
print(df["Hotel_Address"].value_counts())
```
ഇപ്പോൾ നിങ്ങൾക്ക് രാജ്യ തലത്തിലുള്ള ഡാറ്റ ചോദിക്കാം:
```python
display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"}))
```
| Hotel_Address | Hotel_Name |
| :--------------------- | :--------: |
| Amsterdam, Netherlands | 105 |
| Barcelona, Spain | 211 |
| London, United Kingdom | 400 |
| Milan, Italy | 162 |
| Paris, France | 458 |
| Vienna, Austria | 158 |
2. ഹോട്ടൽ മെറ്റാ-റിവ്യൂ കോളങ്ങൾ പ്രോസസ്സ് ചെയ്യുക
1. `Additional_Number_of_Scoring` ഒഴിവാക്കുക
2. `Total_Number_of_Reviews` ആ ഹോട്ടലിനുള്ള ഡാറ്റാസെറ്റിൽ ഉള്ള റിവ്യൂകളുടെ മൊത്തം എണ്ണം കൊണ്ട് മാറ്റുക
3. `Average_Score` നമ്മുടെ സ്വന്തം കണക്കാക്കിയ സ്കോറിൽ മാറ്റുക
```python
# `Additional_Number_of_Scoring` ഒഴിവാക്കുക
df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True)
# `Total_Number_of_Reviews` ഉം `Average_Score` ഉം നമ്മുടെ സ്വന്തം കണക്കാക്കിയ മൂല്യങ്ങളാൽ മാറ്റി വയ്ക്കുക
df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count')
df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
```
3. റിവ്യൂ കോളങ്ങൾ പ്രോസസ്സ് ചെയ്യുക
1. `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` and `days_since_review` ഒഴിവാക്കുക
2. `Reviewer_Score`, `Negative_Review`, and `Positive_Review` അതുപോലെ തന്നെ സൂക്ഷിക്കുക,
3. ഇപ്പോൾ `Tags` സൂക്ഷിക്കുക
- അടുത്ത സെക്ഷനിൽ ടാഗുകളിൽ കൂടുതൽ ഫിൽട്ടറിംഗ് പ്രവർത്തനങ്ങൾ നടത്തും, പിന്നീട് ടാഗുകൾ ഒഴിവാക്കും
4. റിവ്യൂവറിന്റെ കോളങ്ങൾ പ്രോസസ്സ് ചെയ്യുക
1. `Total_Number_of_Reviews_Reviewer_Has_Given` ഒഴിവാക്കുക
2. `Reviewer_Nationality` സൂക്ഷിക്കുക
### ടാഗ് കോളങ്ങൾ
`Tag` കോളം പ്രശ്നകരമാണ്, കാരണം അത് ഒരു ലിസ്റ്റ് (ടെക്സ്റ്റ് രൂപത്തിൽ) കോളത്തിൽ സൂക്ഷിച്ചിരിക്കുന്നു. ദുർഭാഗ്യവശാൽ ഈ കോളത്തിലെ ഉപവിഭാഗങ്ങളുടെ ക്രമവും എണ്ണം എല്ലായ്പ്പോഴും ഒരുപോലെ അല്ല. മനുഷ്യന് ശരിയായ വാചകങ്ങൾ കണ്ടെത്താൻ ബുദ്ധിമുട്ടാണ്, കാരണം 515,000 വരികളുണ്ട്, 1427 ഹോട്ടലുകൾ ഉണ്ട്, ഓരോ ഹോട്ടലിനും റിവ്യൂവറിന് തിരഞ്ഞെടുക്കാനുള്ള വ്യത്യസ്ത ഓപ്ഷനുകൾ ഉണ്ട്. ഇവിടെ NLP പ്രഭാവം കാണിക്കുന്നു. നിങ്ങൾ ടെക്സ്റ്റ് സ്കാൻ ചെയ്ത് ഏറ്റവും സാധാരണമായ വാചകങ്ങൾ കണ്ടെത്തി എണ്ണാം.
ദുർഭാഗ്യവശാൽ, ഞങ്ങൾ ഏകവാക്കുകൾക്ക് അല്ല, ബഹുവാക്ക് വാചകങ്ങൾക്കാണ് (ഉദാ: *ബിസിനസ് ട്രിപ്പ്*) താൽപര്യം. അത്തരം വാചകങ്ങളുടെ ഫ്രീക്വൻസി ഡിസ്‌ട്രിബ്യൂഷൻ ആൽഗോരിതം 6762646 വാക്കുകളിൽ നടത്തുന്നത് വളരെ സമയം എടുക്കും, പക്ഷേ ഡാറ്റ നോക്കാതെ അത് അനിവാര്യമായ ചെലവാണെന്ന് തോന്നും. ഇവിടെ എക്സ്പ്ലോറേറ്ററി ഡാറ്റ അനാലിസിസ് സഹായിക്കുന്നു, കാരണം നിങ്ങൾ ടാഗുകളുടെ സാമ്പിൾ കണ്ടിട്ടുണ്ട്, ഉദാ: `[' Business trip ', ' Solo traveler ', ' Single Room ', ' Stayed 5 nights ', ' Submitted from a mobile device ']`, നിങ്ങൾ ടാഗുകൾ കുറയ്ക്കാൻ കഴിയുമോ എന്ന് ചോദിക്കാൻ തുടങ്ങാം. ഭാഗ്യവശാൽ, കഴിയും - പക്ഷേ ആദ്യം ടാഗുകൾ കണ്ടെത്താൻ ചില ഘട്ടങ്ങൾ പാലിക്കണം.
### ടാഗുകൾ ഫിൽട്ടർ ചെയ്യൽ
ഡാറ്റാസെറ്റിന്റെ ലക്ഷ്യം അനുഭവം കൂട്ടിച്ചേർക്കലും മികച്ച ഹോട്ടൽ തിരഞ്ഞെടുക്കാൻ സഹായിക്കുന്ന കോളങ്ങൾ ചേർക്കലുമാണ് (സ്വന്തം ആവശ്യത്തിനോ ക്ലയന്റിനോ ഹോട്ടൽ ശുപാർശ ബോട്ട് നിർമ്മിക്കാൻ). ടാഗുകൾ ഫൈനൽ ഡാറ്റാസെറ്റിൽ ഉപകാരപ്രദമാണോ എന്ന് ചോദിക്കണം. ഇതാ ഒരു വ്യാഖ്യാനം (മറ്റു ആവശ്യങ്ങൾക്കായി വേറെ ടാഗുകൾ വേണമെങ്കിൽ അവ തിരഞ്ഞെടുക്കാം):
1. യാത്രയുടെ തരം പ്രസക്തമാണ്, അത് സൂക്ഷിക്കണം
2. അതിഥി ഗ്രൂപ്പിന്റെ തരം പ്രധാനമാണ്, അത് സൂക്ഷിക്കണം
3. അതിഥി താമസിച്ച മുറി, സ്യൂട്ട്, സ്റ്റുഡിയോ എന്നിവ പ്രസക്തമല്ല (എല്ലാ ഹോട്ടലുകളും അടിസ്ഥാനപരമായി ഒരുപോലെ മുറികൾ ഉണ്ട്)
4. റിവ്യൂ സമർപ്പിച്ച ഉപകരണം പ്രസക്തമല്ല
5. റിവ്യൂവറുടെ താമസിച്ച രാത്രികളുടെ എണ്ണം *പ്രസക്തമായിരിക്കാം* (നീണ്ട താമസങ്ങൾ ഹോട്ടൽ ഇഷ്ടപ്പെടുന്നതായി കാണിച്ചാൽ), പക്ഷേ അത് സംശയാസ്പദവും പ്രസക്തമല്ലാത്തതും ആണ്
സംഗ്രഹത്തിൽ, **2 തരത്തിലുള്ള ടാഗുകൾ സൂക്ഷിച്ച് മറ്റെല്ലാം ഒഴിവാക്കുക**.
ആദ്യം, ടാഗുകൾ നല്ല ഫോർമാറ്റിൽ വരുന്നതുവരെ എണ്ണാൻ ആഗ്രഹിക്കില്ല, അതിനാൽ സ്ക്വയർ ബ്രാക്കറ്റുകളും ഉദ്ധരണികളും നീക്കം ചെയ്യണം. ഇത് പല രീതികളിൽ ചെയ്യാം, പക്ഷേ വേഗതയുള്ളതായിരിക്കും തിരഞ്ഞെടുക്കുക, കാരണം വലിയ ഡാറ്റ പ്രോസസ്സ് ചെയ്യാൻ സമയം എടുക്കും. ഭാഗ്യവശാൽ, pandas ഇതിന് എളുപ്പം മാർഗ്ഗം നൽകുന്നു.
```Python
# തുറക്കുന്നും അടയ്ക്കുന്നും ബ്രാക്കറ്റുകൾ നീക്കം ചെയ്യുക
df.Tags = df.Tags.str.strip("[']")
# എല്ലാ ഉദ്ധരണികളും നീക്കം ചെയ്യുക
df.Tags = df.Tags.str.replace(" ', '", ",", regex = False)
```
ഓരോ ടാഗും ഇങ്ങനെ മാറും: `Business trip, Solo traveler, Single Room, Stayed 5 nights, Submitted from a mobile device`.
അടുത്തതായി ഒരു പ്രശ്നം കണ്ടെത്തുന്നു. ചില റിവ്യൂകൾക്ക് 5 കോളങ്ങൾ ഉണ്ട്, ചിലക്ക് 3, ചിലക്ക് 6. ഇത് ഡാറ്റാസെറ്റ് സൃഷ്ടിച്ച രീതിയുടെ ഫലമാണ്, പരിഹരിക്കാൻ ബുദ്ധിമുട്ടാണ്. ഓരോ വാചകത്തിന്റെയും ഫ്രീക്വൻസി എണ്ണണം, പക്ഷേ അവ വ്യത്യസ്ത ക്രമത്തിലാണ്, അതിനാൽ എണ്ണൽ തെറ്റായിരിക്കാം, ഹോട്ടലിന് അവകാശപ്പെട്ട ടാഗ് ലഭിക്കാതിരിക്കാം.
പകരം, വ്യത്യസ്ത ക്രമം നമ്മുടെ ഗുണം ചെയ്യും, കാരണം ഓരോ ടാഗും ബഹുവാക്ക് ആണ്, കൂടാതെ കോമയാൽ വേർതിരിച്ചിരിക്കുന്നു! ഏറ്റവും ലളിതമായ മാർഗ്ഗം 6 താൽക്കാലിക കോളങ്ങൾ സൃഷ്ടിച്ച് ഓരോ ടാഗും അതിന്റെ ക്രമാനുസൃത കോളത്തിൽ ഇടുക എന്നതാണ്. പിന്നീട് ആ 6 കോളങ്ങൾ ഒന്നായി ചേർത്ത് `value_counts()` മെത്തഡ് ഓടിക്കാം. അച്ചടിച്ച് നോക്കുമ്പോൾ 2428 വ്യത്യസ്ത ടാഗുകൾ ഉണ്ടെന്ന് കാണാം. ചെറിയ സാമ്പിൾ:
| Tag | Count |
| ------------------------------ | ------ |
| Leisure trip | 417778 |
| Submitted from a mobile device | 307640 |
| Couple | 252294 |
| Stayed 1 night | 193645 |
| Stayed 2 nights | 133937 |
| Solo traveler | 108545 |
| Stayed 3 nights | 95821 |
| Business trip | 82939 |
| Group | 65392 |
| Family with young children | 61015 |
| Stayed 4 nights | 47817 |
| Double Room | 35207 |
| Standard Double Room | 32248 |
| Superior Double Room | 31393 |
| Family with older children | 26349 |
| Deluxe Double Room | 24823 |
| Double or Twin Room | 22393 |
| Stayed 5 nights | 20845 |
| Standard Double or Twin Room | 17483 |
| Classic Double Room | 16989 |
| Superior Double or Twin Room | 13570 |
| 2 rooms | 12393 |
`Submitted from a mobile device` പോലുള്ള ചില സാധാരണ ടാഗുകൾ ഞങ്ങൾക്ക് ഉപകാരമില്ല, അതിനാൽ അവ എണ്ണുന്നതിന് മുമ്പ് നീക്കം ചെയ്യുന്നത് ബുദ്ധിമാനായിരിക്കും, പക്ഷേ അത്ര വേഗത്തിൽ പ്രവർത്തിക്കുന്നതിനാൽ അവ അവിടെ വെച്ച് അവഗണിക്കാം.
### താമസ കാലാവധി ടാഗുകൾ നീക്കം ചെയ്യൽ
ഈ ടാഗുകൾ നീക്കം ചെയ്യുന്നത് ആദ്യ ഘട്ടമാണ്, ഇത് പരിഗണിക്കേണ്ട ടാഗുകളുടെ മൊത്തം എണ്ണം കുറയ്ക്കും. ഡാറ്റാസെറ്റിൽ നിന്ന് നീക്കം ചെയ്യുന്നത് അല്ല, റിവ്യൂ ഡാറ്റയിൽ എണ്ണലിൽ/സൂക്ഷിക്കലിൽ നിന്ന് മാത്രം നീക്കം ചെയ്യുക.
| Length of stay | Count |
| ---------------- | ------ |
| Stayed 1 night | 193645 |
| Stayed 2 nights | 133937 |
| Stayed 3 nights | 95821 |
| Stayed 4 nights | 47817 |
| Stayed 5 nights | 20845 |
| Stayed 6 nights | 9776 |
| Stayed 7 nights | 7399 |
| Stayed 8 nights | 2502 |
| Stayed 9 nights | 1293 |
| ... | ... |
വിവിധ മുറികൾ, സ്യൂട്ടുകൾ, സ്റ്റുഡിയോകൾ, അപാർട്ട്മെന്റുകൾ എന്നിവ വളരെ വ്യത്യസ്തമാണ്. അവ എല്ലാം ഏകദേശം ഒരുപോലെ അർത്ഥം വഹിക്കുന്നു, അതിനാൽ അവ പരിഗണനയിൽ നിന്ന് നീക്കം ചെയ്യുക.
| Type of room | Count |
| ----------------------------- | ----- |
| Double Room | 35207 |
| Standard Double Room | 32248 |
| Superior Double Room | 31393 |
| Deluxe Double Room | 24823 |
| Double or Twin Room | 22393 |
| Standard Double or Twin Room | 17483 |
| Classic Double Room | 16989 |
| Superior Double or Twin Room | 13570 |
അവസാനമായി, ഇത് സന്തോഷകരമാണ് (കുറച്ച് പ്രോസസ്സിംഗ് മാത്രം ആവശ്യമായതിനാൽ), നിങ്ങൾക്ക് താഴെപ്പറയുന്ന *ഉപകാരപ്രദമായ* ടാഗുകൾ മാത്രം ബാക്കി ഉണ്ടാകും:
| Tag | Count |
| --------------------------------------------- | ------ |
| Leisure trip | 417778 |
| Couple | 252294 |
| Solo traveler | 108545 |
| Business trip | 82939 |
| Group (combined with Travellers with friends) | 67535 |
| Family with young children | 61015 |
| Family with older children | 26349 |
| With a pet | 1405 |
`Travellers with friends` `Group` എന്നതിന്റെ സമാനമാണ് എന്ന് വാദിക്കാം, അതിനാൽ മുകളിൽ കാണുന്ന പോലെ രണ്ടും ചേർക്കുന്നത് ന്യായമാണ്. ശരിയായ ടാഗുകൾ കണ്ടെത്താനുള്ള കോഡ് [Tags നോട്ട്‌ബുക്ക്](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) ൽ കാണാം.
അവസാന ഘട്ടം ഈ ടാഗുകൾക്ക് ഓരോന്നിനും പുതിയ കോളങ്ങൾ സൃഷ്ടിക്കുക. പിന്നീട്, ഓരോ റിവ്യൂ വരിയിലും, `Tag` കോളം പുതിയ കോളങ്ങളിൽ ഒന്നുമായി പൊരുത്തപ്പെടുന്നെങ്കിൽ 1 ചേർക്കുക, അല്ലെങ്കിൽ 0 ചേർക്കുക. ഇതിന്റെ ഫലം, എത്ര റിവ്യൂവറുകൾ ആ ഹോട്ടൽ തിരഞ്ഞെടുക്കുകയാണെന്ന് (ഉദാ: ബിസിനസ് vs ലെisure, അല്ലെങ്കിൽ ഒരു മൃഗം കൊണ്ടുപോകാൻ) എണ്ണമായിരിക്കും, ഇത് ഹോട്ടൽ ശുപാർശ ചെയ്യുമ്പോൾ ഉപകാരപ്രദമാണ്.
```python
# ടാഗുകൾ പുതിയ കോളങ്ങളായി പ്രോസസ് ചെയ്യുക
# Hotel_Reviews_Tags.py ഫയൽ, ഏറ്റവും പ്രധാനപ്പെട്ട ടാഗുകൾ തിരിച്ചറിയുന്നു
# വിനോദയാത്ര, ദമ്പതികൾ, ഒറ്റയാത്രക്കാരൻ, ബിസിനസ് യാത്ര, കൂട്ടം യാത്രക്കാർക്ക് കൂട്ടിച്ചേർത്തത്,
# ചെറുപ്പക്കാരുള്ള കുടുംബം, മുതിർന്ന കുട്ടികളുള്ള കുടുംബം, ഒരു മൃഗത്തോടൊപ്പം
df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0)
df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0)
df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0)
df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0)
df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0)
df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0)
df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0)
df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0)
```
### ഫയൽ സേവ് ചെയ്യുക
അവസാനമായി, ഇപ്പോഴത്തെ ഡാറ്റാസെറ്റ് പുതിയ പേരിൽ സേവ് ചെയ്യുക.
```python
df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True)
# കണക്കാക്കിയ കോളങ്ങളോടുകൂടിയ പുതിയ ഡാറ്റ ഫയൽ സേവ് ചെയ്യുന്നു
print("Saving results to Hotel_Reviews_Filtered.csv")
df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False)
```
## അനുഭവം വിശകലന പ്രവർത്തനങ്ങൾ
ഈ അവസാന സെക്ഷനിൽ, റിവ്യൂ കോളങ്ങളിൽ അനുഭവം വിശകലനം പ്രയോഗിച്ച് ഫലങ്ങൾ ഡാറ്റാസെറ്റിൽ സേവ് ചെയ്യും.
## അഭ്യാസം: ഫിൽട്ടർ ചെയ്ത ഡാറ്റ ലോഡ് ചെയ്ത് സേവ് ചെയ്യുക
ഇപ്പോൾ നിങ്ങൾ മുമ്പത്തെ സെക്ഷനിൽ സേവ് ചെയ്ത ഫിൽട്ടർ ചെയ്ത ഡാറ്റാസെറ്റ് ലോഡ് ചെയ്യുകയാണ്, **അസൽ ഡാറ്റാസെറ്റ് അല്ല**.
```python
import time
import pandas as pd
import nltk as nltk
from nltk.corpus import stopwords
from nltk.sentiment.vader import SentimentIntensityAnalyzer
nltk.download('vader_lexicon')
# ഫിൽട്ടർ ചെയ്ത ഹോട്ടൽ റിവ്യൂകൾ CSV-യിൽ നിന്ന് ലോഡ് ചെയ്യുക
df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv')
# നിങ്ങളുടെ കോഡ് ഇവിടെ ചേർക്കും
# അവസാനം പുതിയ NLP ഡാറ്റ ചേർത്ത ഹോട്ടൽ റിവ്യൂകൾ സേവ് ചെയ്യാൻ മറക്കരുത്
print("Saving results to Hotel_Reviews_NLP.csv")
df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False)
```
### സ്റ്റോപ്പ് വാക്കുകൾ നീക്കം ചെയ്യൽ
നീഗറ്റീവ്, പോസിറ്റീവ് റിവ്യൂ കോളങ്ങളിൽ അനുഭവം വിശകലനം നടത്താൻ പോകുമ്പോൾ, അത് വളരെ സമയം എടുക്കാം. ശക്തമായ ലാപ്‌ടോപ്പിൽ പരീക്ഷിച്ചപ്പോൾ 12 - 14 മിനിറ്റ് എടുത്തു, ഉപയോഗിച്ച അനുഭവം ലൈബ്രറിയുടെ അടിസ്ഥാനത്തിൽ വ്യത്യാസമുണ്ട്. ഇത് (സംബന്ധിച്ച) ദീർഘകാലമാണ്, അതിനാൽ വേഗത വർദ്ധിപ്പിക്കാൻ ശ്രമിക്കേണ്ടതാണ്.
സ്റ്റോപ്പ് വാക്കുകൾ, അഥവാ സാധാരണ ഇംഗ്ലീഷ് വാക്കുകൾ, ഒരു വാചകത്തിന്റെ അനുഭവം മാറ്റുന്നില്ല, അവ നീക്കം ചെയ്യുന്നത് ആദ്യ ഘട്ടമാണ്. അവ നീക്കം ചെയ്താൽ അനുഭവം വിശകലനം വേഗത്തിൽ നടക്കും, കൃത്യത കുറയില്ല (സ്റ്റോപ്പ് വാക്കുകൾ അനുഭവത്തെ ബാധിക്കാറില്ല, പക്ഷേ വിശകലനം മന്ദഗതിയാക്കുന്നു).
ഏറ്റവും നീണ്ട നെഗറ്റീവ് റിവ്യൂ 395 വാക്കുകൾ ആയിരുന്നു, സ്റ്റോപ്പ് വാക്കുകൾ നീക്കം ചെയ്ത ശേഷം 195 വാക്കുകൾ മാത്രമാണ്.
സ്റ്റോപ്പ് വാക്കുകൾ നീക്കം ചെയ്യൽ വേഗത്തിലുള്ള പ്രവർത്തനമാണ്, 2 റിവ്യൂ കോളങ്ങളിൽ 515,000 വരികളിൽ 3.3 സെക്കൻഡ് എടുത്തു. നിങ്ങളുടെ ഉപകരണത്തിന്റെ CPU വേഗം, RAM, SSD ഉണ്ട്/ഇല്ല, മറ്റ് ഘടകങ്ങൾ എന്നിവ അനുസരിച്ച് സമയം വ്യത്യാസപ്പെടാം. പ്രവർത്തനത്തിന്റെ സാന്ദ്രത കുറവായതിനാൽ, ഇത് അനുഭവം വിശകലന സമയം മെച്ചപ്പെടുത്തുകയാണെങ്കിൽ ചെയ്യുന്നത് ഉചിതമാണ്.
```python
from nltk.corpus import stopwords
# ഹോട്ടൽ റിവ്യൂകൾ CSV-യിൽ നിന്ന് ലോഡ് ചെയ്യുക
df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv")
# സ്റ്റോപ്പ് വാക്കുകൾ നീക്കം ചെയ്യുക - വളരെ വലുതായ ടെക്സ്റ്റിനായി ഇത് മന്ദഗതിയാകാം!
# റയാൻ ഹാൻ (Kaggle-ൽ ryanxjhan) വിവിധ സ്റ്റോപ്പ് വാക്ക് നീക്കം ചെയ്യൽ സമീപനങ്ങളുടെ പ്രകടനം അളക്കുന്ന മികച്ച ഒരു പോസ്റ്റ് ഉണ്ട്
# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # റയാൻ ശുപാർശ ചെയ്യുന്ന സമീപനം ഉപയോഗിച്ച്
start = time.time()
cache = set(stopwords.words("english"))
def remove_stopwords(review):
text = " ".join([word for word in review.split() if word not in cache])
return text
# രണ്ട് കോളങ്ങളിലെയും സ്റ്റോപ്പ് വാക്കുകൾ നീക്കം ചെയ്യുക
df.Negative_Review = df.Negative_Review.apply(remove_stopwords)
df.Positive_Review = df.Positive_Review.apply(remove_stopwords)
```
### അനുഭവം വിശകലനം നടത്തൽ
ഇപ്പോൾ നിങ്ങൾ നെഗറ്റീവ്, പോസിറ്റീവ് റിവ്യൂ കോളങ്ങളിൽ അനുഭവം വിശകലനം കണക്കാക്കി 2 പുതിയ കോളങ്ങളിൽ ഫലം സൂക്ഷിക്കണം. അനുഭവം പരിശോധന റിവ്യൂവറുടെ സ്കോറുമായി താരതമ്യം ചെയ്യുന്നതായിരിക്കും. ഉദാഹരണത്തിന്, നെഗറ്റീവ് റിവ്യൂ sentiment 1 (അത്യന്തം പോസിറ്റീവ്) ആണെന്ന് അനുഭവം വിശകലന യന്ത്രം കരുതിയാൽ, പോസിറ്റീവ് റിവ്യൂ sentiment 1 ആണെങ്കിൽ, എന്നാൽ റിവ്യൂവർ ഹോട്ടലിന് ഏറ്റവും താഴ്ന്ന സ്കോർ നൽകിയാൽ, റിവ്യൂ ടെക്സ്റ്റും സ്കോറും പൊരുത്തപ്പെടുന്നില്ല, അല്ലെങ്കിൽ sentiment analyser ശരിയായി തിരിച്ചറിയാൻ കഴിഞ്ഞില്ല. ചില sentiment സ്കോറുകൾ പൂർണ്ണമായും തെറ്റായിരിക്കാം, പലപ്പോഴും അത് വിശദീകരിക്കാവുന്നതാണ്, ഉദാ: റിവ്യൂ വളരെ സാര്കാസ്റ്റിക് ആയിരിക്കാം "Of course I LOVED sleeping in a room with no heating" എന്നുപറഞ്ഞാൽ sentiment analyser അത് പോസിറ്റീവ് sentiment ആണെന്ന് കരുതും, എന്നാൽ മനുഷ്യൻ വായിച്ചാൽ അത് സാര്കാസം ആണെന്ന് അറിയും.
NLTK വ്യത്യസ്തമായ സെന്റിമെന്റ് അനലൈസറുകൾ പഠിക്കാൻ നൽകുന്നു, നിങ്ങൾ അവ മാറ്റി സെന്റിമെന്റ് കൂടുതൽ കൃത്യമാണോ കുറവാണോ എന്ന് പരിശോധിക്കാം. ഇവിടെ VADER സെന്റിമെന്റ് അനാലിസിസ് ഉപയോഗിക്കുന്നു.
> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014.
```python
from nltk.sentiment.vader import SentimentIntensityAnalyzer
# വാഡർ സെന്റിമെന്റ് അനലൈസർ സൃഷ്ടിക്കുക (നിങ്ങൾക്ക് പരീക്ഷിക്കാൻ കഴിയുന്ന മറ്റ് NLTK ഉം ഉണ്ട്)
vader_sentiment = SentimentIntensityAnalyzer()
# ഹുട്ടോ, സി.ജെ. & ഗിൽബർട്ട്, ഇ.ഇ. (2014). VADER: സോഷ്യൽ മീഡിയ ടെക്സ്റ്റിന്റെ സെന്റിമെന്റ് വിശകലനത്തിനുള്ള ഒരു ലഘുവായ നിയമാധിഷ്ഠിത മോഡൽ. എട്ടാം അന്താരാഷ്ട്ര വെബ്ലോഗ്‌സ് ആൻഡ് സോഷ്യൽ മീഡിയ സമ്മേളനം (ICWSM-14). ആൻ ആർബർ, MI, ജൂൺ 2014.
# ഒരു റിവ്യൂവിന് 3 ഇൻപുട്ട് സാധ്യതകൾ ഉണ്ട്:
# അത് "നോ നെഗറ്റീവ്" ആകാം, അപ്പോൾ 0 മടക്കുക
# അത് "നോ പോസിറ്റീവ്" ആകാം, അപ്പോൾ 0 മടക്കുക
# അത് ഒരു റിവ്യൂ ആകാം, അപ്പോൾ സെന്റിമെന്റ് കണക്കാക്കുക
def calc_sentiment(review):
if review == "No Negative" or review == "No Positive":
return 0
return vader_sentiment.polarity_scores(review)["compound"]
```
നിങ്ങളുടെ പ്രോഗ്രാമിൽ പിന്നീട് സെന്റിമെന്റ് കണക്കാക്കാൻ തയ്യാറായപ്പോൾ, ഓരോ റിവ്യൂവിനും ഇത് ഇങ്ങനെ പ്രയോഗിക്കാം:
```python
# ഒരു നെഗറ്റീവ് സെന്റിമെന്റ് കോളവും പോസിറ്റീവ് സെന്റിമെന്റ് കോളവും ചേർക്കുക
print("Calculating sentiment columns for both positive and negative reviews")
start = time.time()
df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment)
df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment)
end = time.time()
print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds")
```
എന്റെ കമ്പ്യൂട്ടറിൽ ഇത് ഏകദേശം 120 സെക്കൻഡ് എടുക്കുന്നു, പക്ഷേ ഓരോ കമ്പ്യൂട്ടറിലും വ്യത്യാസമുണ്ടാകും. ഫലങ്ങൾ പ്രിന്റ് ചെയ്ത് സെന്റിമെന്റ് റിവ്യൂവിനോട് പൊരുത്തപ്പെടുന്നുണ്ടോ എന്ന് കാണാൻ:
```python
df = df.sort_values(by=["Negative_Sentiment"], ascending=True)
print(df[["Negative_Review", "Negative_Sentiment"]])
df = df.sort_values(by=["Positive_Sentiment"], ascending=True)
print(df[["Positive_Review", "Positive_Sentiment"]])
```
ചലഞ്ചിൽ ഉപയോഗിക്കുന്നതിന് മുമ്പ് ഫയൽ സംരക്ഷിക്കുക! പുതിയ എല്ലാ കോളങ്ങളെയും പുനഃക്രമീകരിക്കാൻ പരിഗണിക്കുക, ഇത് മനുഷ്യനായി പ്രവർത്തിക്കാൻ എളുപ്പമാക്കും (ഇത് ഒരു കോസ്മെറ്റിക് മാറ്റമാണ്).
```python
# കോളങ്ങൾ പുനഃക്രമീകരിക്കുക (ഇത് ദൃശ്യപരമാണ്, പക്ഷേ പിന്നീട് ഡാറ്റ എളുപ്പത്തിൽ പരിശോധിക്കാൻ)
df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1)
print("Saving results to Hotel_Reviews_NLP.csv")
df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False)
```
[ആനാലിസിസ് നോട്ട്‌ബുക്ക്](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) മുഴുവൻ കോഡ് പ്രവർത്തിപ്പിക്കണം (നിങ്ങൾ [ഫിൽട്ടറിംഗ് നോട്ട്‌ബുക്ക്](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) പ്രവർത്തിപ്പിച്ച് Hotel_Reviews_Filtered.csv ഫയൽ സൃഷ്ടിച്ച ശേഷം).
പരിശോധിക്കാൻ, ചുവടെയുള്ള ഘട്ടങ്ങളാണ്:
1. ഒറിജിനൽ ഡാറ്റാസെറ്റ് ഫയൽ **Hotel_Reviews.csv** മുമ്പത്തെ പാഠത്തിൽ [എക്സ്പ്ലോറർ നോട്ട്‌ബുക്ക്](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb) ഉപയോഗിച്ച് പരിശോധിച്ചു
2. Hotel_Reviews.csv [ഫിൽട്ടറിംഗ് നോട്ട്‌ബുക്ക്](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) ഉപയോഗിച്ച് ഫിൽട്ടർ ചെയ്ത് **Hotel_Reviews_Filtered.csv** സൃഷ്ടിച്ചു
3. Hotel_Reviews_Filtered.csv [സെന്റിമെന്റ് അനാലിസിസ് നോട്ട്‌ബുക്ക്](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) ഉപയോഗിച്ച് പ്രോസസ് ചെയ്ത് **Hotel_Reviews_NLP.csv** സൃഷ്ടിച്ചു
4. താഴെ കൊടുത്ത NLP ചലഞ്ചിൽ Hotel_Reviews_NLP.csv ഉപയോഗിക്കുക
### നിഗമനം
നിങ്ങൾ ആരംഭിച്ചപ്പോൾ, കോളങ്ങളും ഡാറ്റയും ഉള്ള ഒരു ഡാറ്റാസെറ്റ് ഉണ്ടായിരുന്നു, പക്ഷേ എല്ലാം പരിശോധിക്കാനോ ഉപയോഗിക്കാനോ കഴിയുന്നില്ലായിരുന്നു. നിങ്ങൾ ഡാറ്റ പരിശോധിച്ചു, ആവശ്യമില്ലാത്തത് ഫിൽട്ടർ ചെയ്തു, ടാഗുകൾ ഉപയോഗപ്രദമായ ഒന്നായി മാറ്റി, നിങ്ങളുടെ സ്വന്തം ശരാശരികൾ കണക്കാക്കി, ചില സെന്റിമെന്റ് കോളങ്ങൾ ചേർത്ത്, സ്വാഭാവിക വാചക പ്രോസസ്സിംഗിനെക്കുറിച്ച് ചില രസകരമായ കാര്യങ്ങൾ പഠിച്ചു.
## [പാഠാനന്തര ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## ചലഞ്ച്
ഇപ്പോൾ നിങ്ങളുടെ ഡാറ്റാസെറ്റ് സെന്റിമെന്റിനായി വിശകലനം ചെയ്തതിനുശേഷം, ഈ പാഠ്യപദ്ധതിയിൽ നിങ്ങൾ പഠിച്ച തന്ത്രങ്ങൾ (ക്ലസ്റ്ററിംഗ്, ആകാം?) ഉപയോഗിച്ച് സെന്റിമെന്റിനുള്ള പാറ്റേണുകൾ കണ്ടെത്താൻ ശ്രമിക്കുക.
## അവലോകനവും സ്വയം പഠനവും
[ഈ ലേൺ മോഡ്യൂൾ](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) എടുത്ത് കൂടുതൽ പഠിക്കുകയും ടെക്സ്റ്റിലെ സെന്റിമെന്റ് പരിശോധിക്കാൻ വ്യത്യസ്ത ഉപകരണങ്ങൾ ഉപയോഗിക്കുകയും ചെയ്യുക.
## അസൈൻമെന്റ്
[മറ്റൊരു ഡാറ്റാസെറ്റ് പരീക്ഷിക്കുക](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "daf144daa552da6a7d442aff6f3e77d8",
"translation_date": "2025-12-19T14:45:54+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/assignment.md",
"language_code": "ml"
}
-->
# വ്യത്യസ്തമായ ഒരു ഡാറ്റാസെറ്റ് പരീക്ഷിക്കുക
## നിർദ്ദേശങ്ങൾ
ഇപ്പോൾ നിങ്ങൾക്ക് ടെക്സ്റ്റിന് സെന്റിമെന്റ് നൽകാൻ NLTK ഉപയോഗിക്കുന്നതിനെക്കുറിച്ച് പഠിച്ചിരിക്കുന്നു, വ്യത്യസ്തമായ ഒരു ഡാറ്റാസെറ്റ് പരീക്ഷിക്കുക. അതിനുശേഷം നിങ്ങൾക്ക് ചില ഡാറ്റ പ്രോസസ്സിംഗ് ചെയ്യേണ്ടതുണ്ടാകാം, അതിനാൽ ഒരു നോട്ട്‌ബുക്ക് സൃഷ്ടിച്ച് നിങ്ങളുടെ ചിന്താ പ്രക്രിയ രേഖപ്പെടുത്തുക. നിങ്ങൾ എന്ത് കണ്ടെത്തുന്നു?
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണാർത്ഥം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ---------------------- |
| | സെന്റിമെന്റ് എങ്ങനെ നൽകുന്നുവെന്ന് വിശദീകരിക്കുന്ന നന്നായി രേഖപ്പെടുത്തിയ സെല്ലുകളോടുകൂടിയ ഒരു പൂർണ്ണ നോട്ട്‌ബുക്ക്, ഡാറ്റാസെറ്റ് എന്നിവ അവതരിപ്പിച്ചിരിക്കുന്നു | നോട്ട്‌ബുക്കിൽ നല്ല വിശദീകരണങ്ങൾ ഇല്ല | നോട്ട്‌ബുക്ക് പിഴവുകളുള്ളതാണ് |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, യന്ത്രം ചെയ്ത വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റായ വിവരങ്ങൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,172 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 4,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "033cb89c85500224b3c63fd04f49b4aa",
"translation_date": "2025-12-19T16:49:39+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import time\n",
"import ast"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def replace_address(row):\n",
" if \"Netherlands\" in row[\"Hotel_Address\"]:\n",
" return \"Amsterdam, Netherlands\"\n",
" elif \"Barcelona\" in row[\"Hotel_Address\"]:\n",
" return \"Barcelona, Spain\"\n",
" elif \"United Kingdom\" in row[\"Hotel_Address\"]:\n",
" return \"London, United Kingdom\"\n",
" elif \"Milan\" in row[\"Hotel_Address\"]: \n",
" return \"Milan, Italy\"\n",
" elif \"France\" in row[\"Hotel_Address\"]:\n",
" return \"Paris, France\"\n",
" elif \"Vienna\" in row[\"Hotel_Address\"]:\n",
" return \"Vienna, Austria\" \n",
" else:\n",
" return row.Hotel_Address\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV\n",
"start = time.time()\n",
"df = pd.read_csv('../../data/Hotel_Reviews.csv')\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# dropping columns we will not use:\n",
"df.drop([\"lat\", \"lng\"], axis = 1, inplace=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Replace all the addresses with a shortened, more useful form\n",
"df[\"Hotel_Address\"] = df.apply(replace_address, axis = 1)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# Drop `Additional_Number_of_Scoring`\n",
"df.drop([\"Additional_Number_of_Scoring\"], axis = 1, inplace=True)\n",
"# Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values\n",
"df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count')\n",
"df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Process the Tags into new columns\n",
"# The file Hotel_Reviews_Tags.py, identifies the most important tags\n",
"# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends, \n",
"# Family with young children, Family with older children, With a pet\n",
"df[\"Leisure_trip\"] = df.Tags.apply(lambda tag: 1 if \"Leisure trip\" in tag else 0)\n",
"df[\"Couple\"] = df.Tags.apply(lambda tag: 1 if \"Couple\" in tag else 0)\n",
"df[\"Solo_traveler\"] = df.Tags.apply(lambda tag: 1 if \"Solo traveler\" in tag else 0)\n",
"df[\"Business_trip\"] = df.Tags.apply(lambda tag: 1 if \"Business trip\" in tag else 0)\n",
"df[\"Group\"] = df.Tags.apply(lambda tag: 1 if \"Group\" in tag or \"Travelers with friends\" in tag else 0)\n",
"df[\"Family_with_young_children\"] = df.Tags.apply(lambda tag: 1 if \"Family with young children\" in tag else 0)\n",
"df[\"Family_with_older_children\"] = df.Tags.apply(lambda tag: 1 if \"Family with older children\" in tag else 0)\n",
"df[\"With_a_pet\"] = df.Tags.apply(lambda tag: 1 if \"With a pet\" in tag else 0)\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# No longer need any of these columns\n",
"df.drop([\"Review_Date\", \"Review_Total_Negative_Word_Counts\", \"Review_Total_Positive_Word_Counts\", \"days_since_review\", \"Total_Number_of_Reviews_Reviewer_Has_Given\"], axis = 1, inplace=True)\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Saving results to Hotel_Reviews_Filtered.csv\n",
"Filtering took 23.74 seconds\n"
]
}
],
"source": [
"# Saving new data file with calculated columns\n",
"print(\"Saving results to Hotel_Reviews_Filtered.csv\")\n",
"df.to_csv(r'../../data/Hotel_Reviews_Filtered.csv', index = False)\n",
"end = time.time()\n",
"print(\"Filtering took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാപത്രം**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,137 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 4,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "341efc86325ec2a214f682f57a189dfd",
"translation_date": "2025-12-19T16:49:50+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/2-notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV (you can )\n",
"import pandas as pd \n",
"\n",
"df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv')\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# We want to find the most useful tags to keep\n",
"# Remove opening and closing brackets\n",
"df.Tags = df.Tags.str.strip(\"[']\")\n",
"# remove all quotes too\n",
"df.Tags = df.Tags.str.replace(\" ', '\", \",\", regex = False)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# removing this to take advantage of the 'already a phrase' fact of the dataset \n",
"# Now split the strings into a list\n",
"tag_list_df = df.Tags.str.split(',', expand = True)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Remove leading and trailing spaces\n",
"df[\"Tag_1\"] = tag_list_df[0].str.strip()\n",
"df[\"Tag_2\"] = tag_list_df[1].str.strip()\n",
"df[\"Tag_3\"] = tag_list_df[2].str.strip()\n",
"df[\"Tag_4\"] = tag_list_df[3].str.strip()\n",
"df[\"Tag_5\"] = tag_list_df[4].str.strip()\n",
"df[\"Tag_6\"] = tag_list_df[5].str.strip()\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# Merge the 6 columns into one with melt\n",
"df_tags = df.melt(value_vars=[\"Tag_1\", \"Tag_2\", \"Tag_3\", \"Tag_4\", \"Tag_5\", \"Tag_6\"])\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"The shape of the tags with no filtering: (2514684, 2)\n",
" index count\n",
"0 Leisure trip 338423\n",
"1 Couple 205305\n",
"2 Solo traveler 89779\n",
"3 Business trip 68176\n",
"4 Group 51593\n",
"5 Family with young children 49318\n",
"6 Family with older children 21509\n",
"7 Travelers with friends 1610\n",
"8 With a pet 1078\n"
]
}
],
"source": [
"# Get the value counts\n",
"tag_vc = df_tags.value.value_counts()\n",
"# print(tag_vc)\n",
"print(\"The shape of the tags with no filtering:\", str(df_tags.shape))\n",
"# Drop rooms, suites, and length of stay, mobile device and anything with less count than a 1000\n",
"df_tags = df_tags[~df_tags.value.str.contains(\"Standard|room|Stayed|device|Beds|Suite|Studio|King|Superior|Double\", na=False, case=False)]\n",
"tag_vc = df_tags.value.value_counts().reset_index(name=\"count\").query(\"count > 1000\")\n",
"# Print the top 10 (there should only be 9 and we'll use these in the filtering section)\n",
"print(tag_vc[:10])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാ**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ വ്യാഖ്യാനക്കേടുകൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,260 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 4,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"coopTranslator": {
"original_hash": "705bf02633759f689abc37b19749a16d",
"translation_date": "2025-12-19T16:50:02+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"[nltk_data] Downloading package vader_lexicon to\n[nltk_data] /Users/jenlooper/nltk_data...\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"True"
]
},
"metadata": {},
"execution_count": 9
}
],
"source": [
"import time\n",
"import pandas as pd\n",
"import nltk as nltk\n",
"from nltk.corpus import stopwords\n",
"from nltk.sentiment.vader import SentimentIntensityAnalyzer\n",
"nltk.download('vader_lexicon')\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"vader_sentiment = SentimentIntensityAnalyzer()\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# There are 3 possibilities of input for a review:\n",
"# It could be \"No Negative\", in which case, return 0\n",
"# It could be \"No Positive\", in which case, return 0\n",
"# It could be a review, in which case calculate the sentiment\n",
"def calc_sentiment(review): \n",
" if review == \"No Negative\" or review == \"No Positive\":\n",
" return 0\n",
" return vader_sentiment.polarity_scores(review)[\"compound\"] \n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"# Load the hotel reviews from CSV\n",
"df = pd.read_csv(\"../../data/Hotel_Reviews_Filtered.csv\")\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# Remove stop words - can be slow for a lot of text!\n",
"# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches\n",
"# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends\n",
"start = time.time()\n",
"cache = set(stopwords.words(\"english\"))\n",
"def remove_stopwords(review):\n",
" text = \" \".join([word for word in review.split() if word not in cache])\n",
" return text\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"# Remove the stop words from both columns\n",
"df.Negative_Review = df.Negative_Review.apply(remove_stopwords) \n",
"df.Positive_Review = df.Positive_Review.apply(remove_stopwords)\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Removing stop words took 5.77 seconds\n"
]
}
],
"source": [
"end = time.time()\n",
"print(\"Removing stop words took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Calculating sentiment columns for both positive and negative reviews\n",
"Calculating sentiment took 201.07 seconds\n"
]
}
],
"source": [
"# Add a negative sentiment and positive sentiment column\n",
"print(\"Calculating sentiment columns for both positive and negative reviews\")\n",
"start = time.time()\n",
"df[\"Negative_Sentiment\"] = df.Negative_Review.apply(calc_sentiment)\n",
"df[\"Positive_Sentiment\"] = df.Positive_Review.apply(calc_sentiment)\n",
"end = time.time()\n",
"print(\"Calculating sentiment took \" + str(round(end - start, 2)) + \" seconds\")\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" Negative_Review Negative_Sentiment\n",
"186584 So bad experience memories I hotel The first n... -0.9920\n",
"129503 First charged twice room booked booking second... -0.9896\n",
"307286 The staff Had bad experience even booking Janu... -0.9889\n",
"452092 No WLAN room Incredibly rude restaurant staff ... -0.9884\n",
"201293 We usually traveling Paris 2 3 times year busi... -0.9873\n",
"... ... ...\n",
"26899 I would say however one night expensive even d... 0.9933\n",
"138365 Wifi terribly slow I speed test network upload... 0.9938\n",
"79215 I find anything hotel first I walked past hote... 0.9938\n",
"278506 The property great location There bakery next ... 0.9945\n",
"339189 Guys I like hotel I wish return next year Howe... 0.9948\n",
"\n",
"[515738 rows x 2 columns]\n",
" Positive_Review Positive_Sentiment\n",
"137893 Bathroom Shower We going stay twice hotel 2 ni... -0.9820\n",
"5839 I completely disappointed mad since reception ... -0.9780\n",
"64158 get everything extra internet parking breakfas... -0.9751\n",
"124178 I didnt like anythig Room small Asked upgrade ... -0.9721\n",
"489137 Very rude manager abusive staff reception Dirt... -0.9703\n",
"... ... ...\n",
"331570 Everything This recently renovated hotel class... 0.9984\n",
"322920 From moment stepped doors Guesthouse Hotel sta... 0.9985\n",
"293710 This place surprise expected good actually gre... 0.9985\n",
"417442 We celebrated wedding night Langham I commend ... 0.9985\n",
"132492 We arrived super cute boutique hotel area expl... 0.9987\n",
"\n",
"[515738 rows x 2 columns]\n"
]
}
],
"source": [
"df = df.sort_values(by=[\"Negative_Sentiment\"], ascending=True)\n",
"print(df[[\"Negative_Review\", \"Negative_Sentiment\"]])\n",
"df = df.sort_values(by=[\"Positive_Sentiment\"], ascending=True)\n",
"print(df[[\"Positive_Review\", \"Positive_Sentiment\"]])\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"# Reorder the columns (This is cosmetic, but to make it easier to explore the data later)\n",
"df = df.reindex([\"Hotel_Name\", \"Hotel_Address\", \"Total_Number_of_Reviews\", \"Average_Score\", \"Reviewer_Score\", \"Negative_Sentiment\", \"Positive_Sentiment\", \"Reviewer_Nationality\", \"Leisure_trip\", \"Couple\", \"Solo_traveler\", \"Business_trip\", \"Group\", \"Family_with_young_children\", \"Family_with_older_children\", \"With_a_pet\", \"Negative_Review\", \"Positive_Review\"], axis=1)\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Saving results to Hotel_Reviews_NLP.csv\n"
]
}
],
"source": [
"print(\"Saving results to Hotel_Reviews_NLP.csv\")\n",
"df.to_csv(r\"../../data/Hotel_Reviews_NLP.csv\", index = False)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാ**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ പ്രാമാണികമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ വ്യാഖ്യാനക്കേടുകൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T14:48:43+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡറാണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-12-19T14:49:15+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/R/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡറാണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,40 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1eb379dc2d0c9940b320732d16083778",
"translation_date": "2025-12-19T13:02:50+00:00",
"source_file": "6-NLP/README.md",
"language_code": "ml"
}
-->
# സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിങ്ങുമായി ആരംഭിക്കുക
സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ് (NLP) എന്നത് മനുഷ്യഭാഷ സംസാരിക്കപ്പെടുകയും എഴുതപ്പെടുകയും ചെയ്യുന്ന പ്രകൃതിദത്ത ഭാഷയെ ഒരു കമ്പ്യൂട്ടർ പ്രോഗ്രാം മനസ്സിലാക്കാനുള്ള കഴിവാണ്. ഇത് കൃത്രിമ ബുദ്ധിമുട്ടിന്റെ (AI) ഒരു ഘടകമാണ്. NLP 50 വർഷത്തിലധികം നിലനിൽക്കുന്നു, ഭാഷാശാസ്ത്ര മേഖലയിലെ വേരുകളുള്ളതാണ്. മുഴുവൻ മേഖലയും യന്ത്രങ്ങൾക്ക് മനുഷ്യഭാഷ മനസ്സിലാക്കാനും പ്രോസസ്സ് ചെയ്യാനും സഹായിക്കുന്നതിനാണ് ലക്ഷ്യമിടുന്നത്. ഇതുപയോഗിച്ച് സ്പെൽ ചെക്ക് ചെയ്യൽ അല്ലെങ്കിൽ യന്ത്രം വിവർത്തനം പോലുള്ള പ്രവർത്തനങ്ങൾ നടത്താം. മെഡിക്കൽ ഗവേഷണം, സെർച്ച് എഞ്ചിനുകൾ, ബിസിനസ് ഇന്റലിജൻസ് തുടങ്ങിയ നിരവധി മേഖലകളിൽ ഇതിന് വിവിധ യാഥാർത്ഥ്യ പ്രയോഗങ്ങൾ ഉണ്ട്.
## പ്രാദേശിക വിഷയം: യൂറോപ്യൻ ഭാഷകളും സാഹിത്യവും യൂറോപ്പിലെ റൊമാന്റിക് ഹോട്ടലുകളും ❤️
പാഠ്യപദ്ധതിയുടെ ഈ ഭാഗത്തിൽ, യന്ത്രം പഠനത്തിന്റെ ഏറ്റവും വ്യാപകമായ ഉപയോഗങ്ങളിൽ ഒന്നായ സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ് (NLP) പരിചയപ്പെടും. കംപ്യൂട്ടേഷണൽ ഭാഷാശാസ്ത്രത്തിൽ നിന്നുള്ള ഈ കൃത്രിമ ബുദ്ധിമുട്ടിന്റെ വിഭാഗം മനുഷ്യരും യന്ത്രങ്ങളും വോയ്‌സ് അല്ലെങ്കിൽ എഴുത്ത് ആശയവിനിമയത്തിലൂടെ ബന്ധിപ്പിക്കുന്ന പാലമാണ്.
ഈ പാഠങ്ങളിൽ നാം ചെറിയ സംഭാഷണ ബോട്ടുകൾ നിർമ്മിച്ച് NLPയുടെ അടിസ്ഥാനങ്ങൾ പഠിക്കും, യന്ത്രം പഠനം ഈ സംഭാഷണങ്ങളെ കൂടുതൽ 'സ്മാർട്ട്' ആക്കുന്നതിൽ എങ്ങനെ സഹായിക്കുന്നുവെന്ന് മനസ്സിലാക്കും. 1813-ൽ പ്രസിദ്ധീകരിച്ച ജെയിൻ ഓസ്റ്റന്റെ ക്ലാസിക് നോവൽ **പ്രൈഡ് ആൻഡ് പ്രെജുഡിസ്**-ലെ എലിസബത്ത് ബെനെറ്റ്, മിസ്റ്റർ ഡാർസി എന്നിവരുമായി സംഭാഷണം നടത്താൻ നിങ്ങൾ കാലയാത്ര നടത്തും. തുടർന്ന്, യൂറോപ്പിലെ ഹോട്ടൽ അവലോകനങ്ങളിലൂടെ സന്റിമെന്റ് അനാലിസിസ് പഠിച്ച് നിങ്ങളുടെ അറിവ് വർദ്ധിപ്പിക്കും.
![Pride and Prejudice book and tea](../../../translated_images/p&p.279f1c49ecd889419e4ce6206525e9aa30d32a976955cd24daa636c361c6391f.ml.jpg)
> ഫോട്ടോ <a href="https://unsplash.com/@elaineh?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Elaine Howlin</a> <a href="https://unsplash.com/s/photos/pride-and-prejudice?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a> ൽ നിന്നാണ്
## പാഠങ്ങൾ
1. [സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗിലേക്ക് പരിചയം](1-Introduction-to-NLP/README.md)
2. [സാധാരണ NLP പ്രവർത്തനങ്ങളും സാങ്കേതിക വിദ്യകളും](2-Tasks/README.md)
3. [യന്ത്രം പഠനത്തോടെ വിവർത്തനവും സന്റിമെന്റ് അനാലിസിസും](3-Translation-Sentiment/README.md)
4. [നിങ്ങളുടെ ഡാറ്റ തയ്യാറാക്കൽ](4-Hotel-Reviews-1/README.md)
5. [സന്റിമെന്റ് അനാലിസിസിനായി NLTK](5-Hotel-Reviews-2/README.md)
## ക്രെഡിറ്റുകൾ
ഈ സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ് പാഠങ്ങൾ ☕ ഉപയോഗിച്ച് എഴുതിയത് [Stephen Howell](https://twitter.com/Howell_MSFT) ആണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "ee0670655c89e4719319764afb113624",
"translation_date": "2025-12-19T14:25:17+00:00",
"source_file": "6-NLP/data/README.md",
"language_code": "ml"
}
-->
ഈ ഫോൾഡറിലേക്ക് ഹോട്ടൽ റിവ്യൂ ഡാറ്റ ഡൗൺലോഡ് ചെയ്യുക.
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,201 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "662b509c39eee205687726636d0a8455",
"translation_date": "2025-12-19T16:04:38+00:00",
"source_file": "7-TimeSeries/1-Introduction/README.md",
"language_code": "ml"
}
-->
# ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗിലേക്ക് പരിചയം
![ടൈം സീരീസിന്റെ സംഗ്രഹം ഒരു സ്കെച്ച്നോട്ടിൽ](../../../../translated_images/ml-timeseries.fb98d25f1013fc0c59090030080b5d1911ff336427bec31dbaf1ad08193812e9.ml.png)
> സ്കെച്ച്നോട്ട് [Tomomi Imura](https://www.twitter.com/girlie_mac) tarafından
ഈ പാഠത്തിലും അടുത്ത പാഠത്തിലും, നിങ്ങൾ ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗിനെ കുറിച്ച് കുറച്ച് പഠിക്കും, ഇത് ഒരു ML ശാസ്ത്രജ്ഞന്റെ repertoire-യിലെ ഒരു രസകരവും മൂല്യവത്തുമായ ഭാഗമാണ്, മറ്റ് വിഷയങ്ങളേക്കാൾ കുറച്ച് അറിയപ്പെടാത്തത്. ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗ് ഒരു തരത്തിലുള്ള 'ക്രിസ്റ്റൽ ബോൾ' ആണ്: വില പോലുള്ള ഒരു ചാരത്തിന്റെ കഴിഞ്ഞ പ്രകടനത്തെ അടിസ്ഥാനമാക്കി, അതിന്റെ ഭാവിയിലെ സാധ്യത മൂല്യം പ്രവചിക്കാം.
[![ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗിലേക്ക് പരിചയം](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗിലേക്ക് പരിചയം")
> 🎥 ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗിനെക്കുറിച്ചുള്ള വീഡിയോയ്ക്ക് മുകളിൽ ചിത്രത്തിൽ ക്ലിക്ക് ചെയ്യുക
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
വില നിർണ്ണയം, ഇൻവെന്ററി, സപ്ലൈ ചെയിൻ പ്രശ്നങ്ങൾ എന്നിവയുടെ നേരിട്ടുള്ള പ്രയോഗം കണക്കിലെടുത്താൽ, ഇത് ബിസിനസിന് യഥാർത്ഥ മൂല്യമുള്ള ഒരു ഉപകാരപ്രദവും രസകരവുമായ മേഖലയാണ്. ഭാവിയിലെ പ്രകടനം മെച്ചപ്പെടുത്താൻ കൂടുതൽ洞察ങ്ങൾ നേടാൻ ഡീപ് ലേണിംഗ് സാങ്കേതികവിദ്യകൾ ഉപയോഗിക്കാൻ തുടങ്ങിയിട്ടുണ്ടെങ്കിലും, ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗ് ക്ലാസിക് ML സാങ്കേതികവിദ്യകളാൽ വളരെ അറിയപ്പെടുന്ന ഒരു മേഖലയായി തുടരുന്നു.
> പെൻ സ്റ്റേറ്റിന്റെ ഉപകാരപ്രദമായ ടൈം സീരീസ് പാഠ്യപദ്ധതി [ഇവിടെ](https://online.stat.psu.edu/stat510/lesson/1) ലഭ്യമാണ്
## പരിചയം
നിങ്ങൾക്ക് ഒരു സ്മാർട്ട് പാർക്കിംഗ് മീറ്ററുകളുടെ ഒരു അറേ കൈകാര്യം ചെയ്യുന്നു എന്ന് കരുതുക, അവ എത്രത്തോളം ഉപയോഗിക്കപ്പെടുന്നു, എത്ര സമയം ഉപയോഗിക്കപ്പെടുന്നു എന്നതിനെക്കുറിച്ച് ഡാറ്റ നൽകുന്നു.
> മീറ്ററിന്റെ കഴിഞ്ഞ പ്രകടനത്തെ അടിസ്ഥാനമാക്കി, വിതരണവും ആവശ്യവും നിയമങ്ങൾ അനുസരിച്ച് അതിന്റെ ഭാവിയിലെ മൂല്യം പ്രവചിക്കാമെങ്കിൽ?
നിങ്ങളുടെ ലക്ഷ്യം നേടാൻ എപ്പോൾ പ്രവർത്തിക്കണമെന്ന് കൃത്യമായി പ്രവചിക്കുന്നത് ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗിലൂടെ കൈകാര്യം ചെയ്യാവുന്ന ഒരു വെല്ലുവിളിയാണ്. പാർക്കിംഗ് സ്ഥലം അന്വേഷിക്കുമ്പോൾ തിരക്കുള്ള സമയങ്ങളിൽ കൂടുതൽ ചാർജ് ചെയ്യുന്നത് ആളുകളെ സന്തോഷിപ്പിക്കില്ല, പക്ഷേ ഇത് തെരുവുകൾ ശുചിയാക്കാൻ വരുമാനം സൃഷ്ടിക്കാൻ ഉറപ്പുള്ള മാർഗ്ഗമായിരിക്കും!
ടൈം സീരീസ് ആൽഗോരിതങ്ങളുടെ ചില തരം പരിശോധിച്ച്, ചില ഡാറ്റ ശുചിയാക്കി തയ്യാറാക്കാൻ ഒരു നോട്ട്‌ബുക്ക് ആരംഭിക്കാം. നിങ്ങൾ വിശകലനം ചെയ്യാൻ പോകുന്ന ഡാറ്റ GEFCom2014 ഫോറ്കാസ്റ്റിംഗ് മത്സരം നിന്നെടുത്തതാണ്. ഇത് 2012 മുതൽ 2014 വരെ 3 വർഷത്തെ മണിക്കൂർ അടിസ്ഥാനത്തിലുള്ള വൈദ്യുതി ലോഡ്, താപനില മൂല്യങ്ങൾ ഉൾക്കൊള്ളുന്നു. വൈദ്യുതി ലോഡിന്റെയും താപനിലയുടെയും ചരിത്ര മാതൃകകൾ പരിഗണിച്ച്, വൈദ്യുതി ലോഡിന്റെ ഭാവിയിലെ മൂല്യങ്ങൾ പ്രവചിക്കാം.
ഈ ഉദാഹരണത്തിൽ, നിങ്ങൾ ചരിത്ര ലോഡ് ഡാറ്റ മാത്രം ഉപയോഗിച്ച് ഒരു ടൈം സ്റ്റെപ്പ് മുന്നോട്ട് ഫോറ്കാസ്റ്റ് ചെയ്യുന്നത് പഠിക്കും. എന്നാൽ തുടങ്ങുന്നതിന് മുമ്പ്, പിന്നിൽ എന്താണ് നടക്കുന്നത് എന്ന് മനസ്സിലാക്കുന്നത് ഉപകാരപ്രദമാണ്.
## ചില നിർവചനങ്ങൾ
'ടൈം സീരീസ്' എന്ന പദം കാണുമ്പോൾ, അതിന്റെ ഉപയോഗം വിവിധ സാഹചര്യങ്ങളിൽ മനസ്സിലാക്കേണ്ടതാണ്.
🎓 **ടൈം സീരീസ്**
ഗണിതശാസ്ത്രത്തിൽ, "ടൈം സീരീസ് എന്നത് സമയക്രമത്തിൽ സൂചിപ്പിച്ച (അഥവാ പട്ടികപ്പെടുത്തിയ അല്ലെങ്കിൽ ഗ്രാഫ് ചെയ്ത) ഡാറ്റ പോയിന്റുകളുടെ ഒരു ശ്രേണി ആണ്. സാധാരണയായി, ടൈം സീരീസ് ഒരു തുടർച്ചയായ സമാന ഇടവേളകളിൽ എടുത്ത ഒരു ശ്രേണിയാണ്." ഒരു ടൈം സീരീസിന്റെ ഉദാഹരണം [ഡോ ജോൺസ് ഇൻഡസ്ട്രിയൽ അവറേജ്](https://wikipedia.org/wiki/Time_series) യുടെ ദിവസേന അവസാന മൂല്യമാണ്. ടൈം സീരീസ് പ്ലോട്ടുകളും സാങ്കേതിക മോഡലിംഗും സിഗ്നൽ പ്രോസസ്സിംഗ്, കാലാവസ്ഥ പ്രവചനം, ഭൂകമ്പ പ്രവചനം തുടങ്ങിയ മേഖലകളിൽ സാധാരണയായി കാണപ്പെടുന്നു, ഇവിടങ്ങളിൽ സംഭവങ്ങൾ സംഭവിക്കുകയും ഡാറ്റ പോയിന്റുകൾ സമയക്രമത്തിൽ പ്ലോട്ട് ചെയ്യപ്പെടുകയും ചെയ്യുന്നു.
🎓 **ടൈം സീരീസ് വിശകലനം**
ടൈം സീരീസ് വിശകലനം, മുകളിൽ പറഞ്ഞ ടൈം സീരീസ് ഡാറ്റയുടെ വിശകലനമാണ്. ടൈം സീരീസ് ഡാറ്റ വ്യത്യസ്ത രൂപങ്ങൾ സ്വീകരിക്കാം, ഉദാഹരണത്തിന് 'ഇന്ററപ്റ്റഡ് ടൈം സീരീസ്' എന്നത് ഒരു ഇടപെടൽ സംഭവത്തിന് മുമ്പും ശേഷവും ടൈം സീരീസിന്റെ വളർച്ചയിൽ മാതൃകകൾ കണ്ടെത്തുന്നു. ടൈം സീരീസിനായി ആവശ്യമായ വിശകലന തരം ഡാറ്റയുടെ സ്വഭാവത്തെ ആശ്രയിച്ചിരിക്കുന്നു. ടൈം സീരീസ് ഡാറ്റ സ്വയം സംഖ്യകളോ അക്ഷരങ്ങളോ ആയ ശ്രേണിയായിരിക്കും.
വിശകലനം നടത്താൻ വിവിധ രീതികൾ ഉപയോഗിക്കുന്നു, ഫ്രീക്വൻസി-ഡൊമെയ്ൻ, ടൈം-ഡൊമെയ്ൻ, ലീനിയർ, നോൺലീനിയർ തുടങ്ങിയവ ഉൾപ്പെടെ. ഈ തരത്തിലുള്ള ഡാറ്റ വിശകലനം ചെയ്യാനുള്ള നിരവധി മാർഗ്ഗങ്ങളെക്കുറിച്ച് [കൂടുതൽ പഠിക്കുക](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm).
🎓 **ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗ്**
ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗ്, മുമ്പ് ശേഖരിച്ച ഡാറ്റയിൽ കാണിച്ച മാതൃകകളുടെ അടിസ്ഥാനത്തിൽ ഭാവിയിലെ മൂല്യങ്ങൾ പ്രവചിക്കാൻ ഒരു മോഡൽ ഉപയോഗിക്കുന്നതാണ്. ടൈം സീരീസ് ഡാറ്റയെ x വേരിയബിളുകളായി ഉപയോഗിച്ച് റെഗ്രഷൻ മോഡലുകൾ ഉപയോഗിച്ച് പരിശോധിക്കാമെങ്കിലും, ഇത്തരം ഡാറ്റ പ്രത്യേക മോഡലുകൾ ഉപയോഗിച്ച് വിശകലനം ചെയ്യുന്നത് മികച്ചതാണ്.
ടൈം സീരീസ് ഡാറ്റ ഒരു ക്രമീകരിച്ച നിരീക്ഷണങ്ങളുടെ പട്ടികയാണ്, ലീനിയർ റെഗ്രഷൻ ഉപയോഗിച്ച് വിശകലനം ചെയ്യാവുന്ന ഡാറ്റയല്ല. ഏറ്റവും സാധാരണമായത് ARIMA ആണ്, ഇത് "Autoregressive Integrated Moving Average" എന്ന വാക്കുകളുടെ ചുരുക്കമാണ്.
[ARIMA മോഡലുകൾ](https://online.stat.psu.edu/stat510/lesson/1/1.1) "ഒരു ശ്രേണിയുടെ നിലവിലെ മൂല്യം കഴിഞ്ഞ മൂല്യങ്ങളോടും കഴിഞ്ഞ പ്രവചന പിശകുകളോടും ബന്ധിപ്പിക്കുന്നു." ഇവ ടൈം-ഡൊമെയ്ൻ ഡാറ്റ വിശകലനത്തിന് ഏറ്റവും അനുയോജ്യമാണ്, ഇവിടെ ഡാറ്റ സമയക്രമത്തിൽ ക്രമീകരിച്ചിരിക്കുന്നു.
> ARIMA മോഡലുകളുടെ പല തരങ്ങളും ഉണ്ട്, അവയെക്കുറിച്ച് [ഇവിടെ](https://people.duke.edu/~rnau/411arim.htm) പഠിക്കാം, അടുത്ത പാഠത്തിൽ നിങ്ങൾ അവയെ കുറിച്ച് പരിചയപ്പെടും.
അടുത്ത പാഠത്തിൽ, നിങ്ങൾ [Univariate Time Series](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm) ഉപയോഗിച്ച് ARIMA മോഡൽ നിർമ്മിക്കും, ഇത് സമയം കടന്നുപോകുമ്പോൾ മൂല്യം മാറുന്ന ഒരു വേരിയബിളിൽ കേന്ദ്രീകരിക്കുന്നു. ഈ തരത്തിലുള്ള ഡാറ്റയുടെ ഒരു ഉദാഹരണം [ഈ ഡാറ്റാസെറ്റ്](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) ആണ്, ഇത് മൗന ലോ ഒബ്സർവേറ്ററിയിലെ മാസാന്ത CO2 സാന്ദ്രത രേഖപ്പെടുത്തുന്നു:
| CO2 | YearMonth | Year | Month |
| :----: | :-------: | :---: | :---: |
| 330.62 | 1975.04 | 1975 | 1 |
| 331.40 | 1975.13 | 1975 | 2 |
| 331.87 | 1975.21 | 1975 | 3 |
| 333.18 | 1975.29 | 1975 | 4 |
| 333.92 | 1975.38 | 1975 | 5 |
| 333.43 | 1975.46 | 1975 | 6 |
| 331.85 | 1975.54 | 1975 | 7 |
| 330.01 | 1975.63 | 1975 | 8 |
| 328.51 | 1975.71 | 1975 | 9 |
| 328.41 | 1975.79 | 1975 | 10 |
| 329.25 | 1975.88 | 1975 | 11 |
| 330.97 | 1975.96 | 1975 | 12 |
✅ ഈ ഡാറ്റാസെറ്റിൽ സമയം കടന്നുപോകുമ്പോൾ മാറുന്ന വേരിയബിള്‍ തിരിച്ചറിയുക
## ടൈം സീരീസ് ഡാറ്റയുടെ പരിഗണിക്കേണ്ട സവിശേഷതകൾ
ടൈം സീരീസ് ഡാറ്റ നോക്കുമ്പോൾ, അതിന് [ചില സവിശേഷതകൾ](https://online.stat.psu.edu/stat510/lesson/1/1.1) ഉണ്ടെന്ന് കാണാം, അവയെ പരിഗണിച്ച് അതിന്റെ മാതൃകകൾ മെച്ചമായി മനസ്സിലാക്കാൻ നിങ്ങൾ ശ്രമിക്കണം. ടൈം സീരീസ് ഡാറ്റ ഒരു 'സിഗ്നൽ' നൽകുന്നുവെന്ന് കരുതുമ്പോൾ, ഈ സവിശേഷതകൾ 'ശബ്ദം' എന്ന നിലയിൽ കാണാം. ഈ 'ശബ്ദം' കുറയ്ക്കാൻ ചില സാങ്കേതിക രീതികൾ ഉപയോഗിച്ച് ഈ സവിശേഷതകളെ കുറച്ചുകുറയ്ക്കേണ്ടി വരും.
ടൈം സീരീസുമായി പ്രവർത്തിക്കാൻ നിങ്ങൾ അറിയേണ്ട ചില ആശയങ്ങൾ:
🎓 **ട്രെൻഡുകൾ**
ട്രെൻഡുകൾ സമയക്രമത്തിൽ അളക്കാവുന്ന വർദ്ധനവുകളും കുറവുകളും ആണ്. [കൂടുതൽ വായിക്കുക](https://machinelearningmastery.com/time-series-trends-in-python). ടൈം സീരീസിന്റെ സാന്ദർഭ്യത്തിൽ, ട്രെൻഡുകൾ എങ്ങനെ ഉപയോഗിക്കാമെന്നും, ആവശ്യമെങ്കിൽ എങ്ങനെ നീക്കം ചെയ്യാമെന്നും ആണ്.
🎓 **[സീസണാലിറ്റി](https://machinelearningmastery.com/time-series-seasonality-with-python/)**
സീസണാലിറ്റി എന്നത് കാലക്രമികമായ ചലനങ്ങളാണ്, ഉദാഹരണത്തിന് അവധിക്കാല തിരക്കുകൾ വിൽപ്പനയെ ബാധിക്കാം. [ഇവിടെ നോക്കൂ](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) വിവിധ തരത്തിലുള്ള പ്ലോട്ടുകൾ ഡാറ്റയിൽ സീസണാലിറ്റി എങ്ങനെ കാണിക്കുന്നു എന്ന്.
🎓 **ഔട്ട്‌ലൈയേഴ്സ്**
ഔട്ട്‌ലൈയേഴ്സ് സാധാരണ ഡാറ്റ വ്യത്യാസത്തിൽ നിന്ന് വളരെ അകലെയാണ്.
🎓 **ദീർഘകാല ചക്രം**
സീസണാലിറ്റിയിൽ സ്വതന്ത്രമായി, ഡാറ്റ ഒരു ദീർഘകാല ചക്രം കാണിക്കാം, ഉദാഹരണത്തിന് ഒരു സാമ്പത്തിക മന്ദഗതിയെന്നത് ഒരു വർഷത്തിലധികം നീണ്ടുനിൽക്കാം.
🎓 **സ്ഥിരമായ വ്യത്യാസം**
സമയം കടന്നുപോകുമ്പോൾ, ചില ഡാറ്റ സ്ഥിരമായ ചലനങ്ങൾ കാണിക്കുന്നു, ഉദാഹരണത്തിന് ദിവസവും രാത്രിയും ഊർജ്ജ ഉപയോഗം.
🎓 **അപ്രതീക്ഷിത മാറ്റങ്ങൾ**
ഡാറ്റയിൽ അപ്രതീക്ഷിതമായ മാറ്റങ്ങൾ കാണാം, കൂടുതൽ വിശകലനം ആവശ്യമുള്ളതായിരിക്കും. ഉദാഹരണത്തിന് COVID മൂലം ബിസിനസുകൾ അടച്ചുപൂട്ടിയത് ഡാറ്റയിൽ മാറ്റങ്ങൾ ഉണ്ടാക്കി.
✅ [ഈ സാമ്പിൾ ടൈം സീരീസ് പ്ലോട്ട്](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) നോക്കൂ, ഇത് ചില വർഷങ്ങളിലായി ദിവസേന കളിയിൽ ചെലവഴിച്ച കറൻസി കാണിക്കുന്നു. മുകളിൽ പറഞ്ഞ സവിശേഷതകളിൽ ഏതെങ്കിലും ഈ ഡാറ്റയിൽ തിരിച്ചറിയാമോ?
![ഇൻ-ഗെയിം കറൻസി ചെലവ്](../../../../translated_images/currency.e7429812bfc8c6087b2d4c410faaa4aaa11b2fcaabf6f09549b8249c9fbdb641.ml.png)
## അഭ്യാസം - വൈദ്യുതി ഉപയോഗ ഡാറ്റയുമായി ആരംഭിക്കുക
കഴിഞ്ഞ ഉപയോഗം അടിസ്ഥാനമാക്കി ഭാവിയിലെ വൈദ്യുതി ഉപയോഗം പ്രവചിക്കാൻ ഒരു ടൈം സീരീസ് മോഡൽ സൃഷ്ടിക്കാൻ തുടങ്ങാം.
> ഈ ഉദാഹരണത്തിലെ ഡാറ്റ GEFCom2014 ഫോറ്കാസ്റ്റിംഗ് മത്സരം നിന്നെടുത്തതാണ്. ഇത് 2012 മുതൽ 2014 വരെ 3 വർഷത്തെ മണിക്കൂർ അടിസ്ഥാനത്തിലുള്ള വൈദ്യുതി ലോഡ്, താപനില മൂല്യങ്ങൾ ഉൾക്കൊള്ളുന്നു.
>
> ടാവോ ഹോങ്, പിയർ പിൻസൺ, ഷു ഫാൻ, ഹമിദ്‌റേസാ സാരിപൂർ, അൽബർട്ടോ ട്രൊക്കോളി, റോബ് ജെ. ഹൈൻഡ്മാൻ, "പ്രൊബബിലിസ്റ്റിക് എനർജി ഫോറ്കാസ്റ്റിംഗ്: ഗ്ലോബൽ എനർജി ഫോറ്കാസ്റ്റിംഗ് കോംപറ്റിഷൻ 2014 ആൻഡ് ബിയോണ്ട്", ഇന്റർനാഷണൽ ജേണൽ ഓഫ് ഫോറ്കാസ്റ്റിംഗ്, വോൾ.32, നമ്പർ 3, പേജ് 896-913, ജൂലൈ-സെപ്റ്റംബർ, 2016.
1. ഈ പാഠത്തിന്റെ `working` ഫോൾഡറിൽ, _notebook.ipynb_ ഫയൽ തുറക്കുക. ഡാറ്റ ലോഡ് ചെയ്യാനും ദൃശ്യവൽക്കരിക്കാനും സഹായിക്കുന്ന ലൈബ്രറികൾ ചേർക്കുക
```python
import os
import matplotlib.pyplot as plt
from common.utils import load_data
%matplotlib inline
```
ശ്രദ്ധിക്കുക, നിങ്ങൾ ഉൾപ്പെടുത്തിയ `common` ഫോൾഡറിൽ നിന്നുള്ള ഫയലുകൾ ഉപയോഗിക്കുന്നു, ഇത് നിങ്ങളുടെ പരിസ്ഥിതി സജ്ജമാക്കുകയും ഡാറ്റ ഡൗൺലോഡ് ചെയ്യുന്നതും കൈകാര്യം ചെയ്യുന്നു.
2. തുടർന്ന്, `load_data()` വിളിച്ച് ഡാറ്റ ഒരു ഡാറ്റാഫ്രെയിമായി പരിശോധിച്ച് `head()` ഉപയോഗിക്കുക:
```python
data_dir = './data'
energy = load_data(data_dir)[['load']]
energy.head()
```
തീയതിയും ലോഡും പ്രതിനിധീകരിക്കുന്ന രണ്ട് കോളങ്ങൾ ഉണ്ടെന്ന് കാണാം:
| | load |
| :-----------------: | :----: |
| 2012-01-01 00:00:00 | 2698.0 |
| 2012-01-01 01:00:00 | 2558.0 |
| 2012-01-01 02:00:00 | 2444.0 |
| 2012-01-01 03:00:00 | 2402.0 |
| 2012-01-01 04:00:00 | 2403.0 |
3. ഇപ്പോൾ, `plot()` വിളിച്ച് ഡാറ്റ പ്ലോട്ട് ചെയ്യുക:
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![energy plot](../../../../translated_images/energy-plot.5fdac3f397a910bc6070602e9e45bea8860d4c239354813fa8fc3c9d556f5bad.ml.png)
4. ഇപ്പോൾ, 2014 ജൂലൈയുടെ ആദ്യ ആഴ്ച `[from date]: [to date]` മാതൃകയിൽ `energy`-ക്ക് ഇൻപുട്ടായി നൽകി പ്ലോട്ട് ചെയ്യുക:
```python
energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![july](../../../../translated_images/july-2014.9e1f7c318ec6d5b30b0d7e1e20be3643501f64a53f3d426d7c7d7b62addb335e.ml.png)
മനോഹരമായ പ്ലോട്ട്! ഈ പ്ലോട്ടുകൾ നോക്കി മുകളിൽ പറഞ്ഞ സവിശേഷതകളിൽ ഏതെങ്കിലും തിരിച്ചറിയാമോ? ഡാറ്റ ദൃശ്യവൽക്കരിച്ച് നാം എന്ത് നിഗമനം വരുത്താം?
അടുത്ത പാഠത്തിൽ, നിങ്ങൾ ARIMA മോഡൽ നിർമ്മിച്ച് ചില ഫോറ്കാസ്റ്റുകൾ സൃഷ്ടിക്കും.
---
## 🚀ചലഞ്ച്
ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗിൽ നിന്ന് പ്രയോജനം ലഭിക്കാവുന്ന എല്ലാ വ്യവസായങ്ങളും അന്വേഷണ മേഖലകളും ഒരു പട്ടിക തയ്യാറാക്കുക. ഈ സാങ്കേതികവിദ്യകളുടെ പ്രയോഗം കലകളിൽ, ഇക്കണോമെട്രിക്സിൽ, പരിസ്ഥിതിശാസ്ത്രത്തിൽ, റീട്ടെയിലിൽ, വ്യവസായത്തിൽ, ഫിനാൻസിൽ എന്നിവിടങ്ങളിൽ ഉണ്ടാകാമോ? മറ്റെവിടെയെങ്കിലും?
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
ഇവിടെ ഉൾപ്പെടുത്താത്തതായിരുന്നാലും, ന്യുറൽ നെറ്റ്വർക്കുകൾ ചിലപ്പോൾ ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗിന്റെ ക്ലാസിക് രീതികൾ മെച്ചപ്പെടുത്താൻ ഉപയോഗിക്കുന്നു. അവയെക്കുറിച്ച് കൂടുതൽ വായിക്കുക [ഈ ലേഖനത്തിൽ](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412)
## അസൈൻമെന്റ്
[കൂടുതൽ ടൈം സീരീസുകൾ ദൃശ്യവൽക്കരിക്കുക](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "d1781b0b92568ea1d119d0a198b576b4",
"translation_date": "2025-12-19T16:08:10+00:00",
"source_file": "7-TimeSeries/1-Introduction/assignment.md",
"language_code": "ml"
}
-->
# കൂടുതൽ ടൈം സീരീസ് ദൃശ്യവത്കരിക്കുക
## നിർദ്ദേശങ്ങൾ
നിങ്ങൾ ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗിനെക്കുറിച്ച് പഠനം ആരംഭിച്ചിട്ടുണ്ട്, പ്രത്യേക മോഡലിംഗിന് ആവശ്യമായ ഡാറ്റയുടെ തരം നോക്കി. നിങ്ങൾ എനർജി സംബന്ധിച്ച ചില ഡാറ്റ ദൃശ്യവത്കരിച്ചിട്ടുണ്ട്. ഇപ്പോൾ, ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗിൽ പ്രയോജനപ്പെടുന്ന മറ്റ് ചില ഡാറ്റകൾ അന്വേഷിക്കുക. മൂന്ന് ഉദാഹരണങ്ങൾ കണ്ടെത്തുക ([Kaggle](https://kaggle.com)യും [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)ഉം പരീക്ഷിക്കുക) അവ ദൃശ്യവത്കരിക്കുന്ന ഒരു നോട്ട്‌ബുക്ക് സൃഷ്ടിക്കുക. അവയ്ക്ക് ഉള്ള പ്രത്യേക സവിശേഷതകൾ (കാലഘട്ടപരമായ സ്വഭാവം, അപ്രതീക്ഷിത മാറ്റങ്ങൾ, അല്ലെങ്കിൽ മറ്റ് പ്രവണതകൾ) നോട്ട്‌ബുക്കിൽ രേഖപ്പെടുത്തുക.
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണപരമായത് | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | ------------------------------------------------------------ | ---------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| | മൂന്ന് ഡാറ്റാസെറ്റുകൾ നോട്ട്‌ബുക്കിൽ പ്ലോട്ട് ചെയ്ത് വിശദീകരിച്ചിരിക്കുന്നു | രണ്ട് ഡാറ്റാസെറ്റുകൾ നോട്ട്‌ബുക്കിൽ പ്ലോട്ട് ചെയ്ത് വിശദീകരിച്ചിരിക്കുന്നു | കുറച്ച് ഡാറ്റാസെറ്റുകൾ നോട്ട്‌ബുക്കിൽ പ്ലോട്ട് ചെയ്തോ വിശദീകരിച്ചോ അല്ലെങ്കിൽ ഡാറ്റ അപര്യാപ്തമാണ് |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, യന്ത്രം ചെയ്ത വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T16:14:27+00:00",
"source_file": "7-TimeSeries/1-Introduction/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡറാണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-12-19T16:15:01+00:00",
"source_file": "7-TimeSeries/1-Introduction/solution/R/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്‌ഹോൾഡറാണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ പ്രാമാണികമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

File diff suppressed because one or more lines are too long

@ -0,0 +1,63 @@
{
"cells": [
{
"source": [
"# ഡാറ്റ സജ്ജീകരണം\n",
"\n",
"ഈ നോട്ട്‌ബുക്കിൽ, ഞങ്ങൾ കാണിക്കുന്നു എങ്ങനെ:\n",
"\n",
"ഈ മോഡ്യൂളിനായി ടൈം സീരീസ് ഡാറ്റ സജ്ജീകരിക്കാം\n",
"ഡാറ്റ ദൃശ്യവൽക്കരിക്കാം\n",
"ഈ ഉദാഹരണത്തിലെ ഡാറ്റ GEFCom2014 ഫോറ്കാസ്റ്റിംഗ് മത്സര1-ൽ നിന്നാണ് എടുത്തത്. ഇത് 2012 മുതൽ 2014 വരെ 3 വർഷത്തെ മണിക്കൂറു അടിസ്ഥാനത്തിലുള്ള വൈദ്യുതി ലോഡ് மற்றும் താപനില മൂല്യങ്ങൾ ഉൾക്കൊള്ളുന്നു.\n",
"\n",
"1Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli and Rob J. Hyndman, \"Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond\", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016.\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാ**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"kernel_info": {
"name": "python3"
},
"kernelspec": {
"name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"nteract": {
"version": "nteract-front-end@1.0.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"coopTranslator": {
"original_hash": "5e2bbe594906dce3aaaa736d6dac6683",
"translation_date": "2025-12-19T17:36:29+00:00",
"source_file": "7-TimeSeries/1-Introduction/working/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

@ -0,0 +1,409 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "917dbf890db71a322f306050cb284749",
"translation_date": "2025-12-19T16:10:59+00:00",
"source_file": "7-TimeSeries/2-ARIMA/README.md",
"language_code": "ml"
}
-->
# ARIMA ഉപയോഗിച്ച് ടൈം സീരീസ് പ്രവചനം
മുൻപത്തെ പാഠത്തിൽ, നിങ്ങൾ ടൈം സീരീസ് പ്രവചനത്തെ കുറിച്ച് കുറച്ച് പഠിച്ചു, കൂടാതെ ഒരു സമയപരിധിയിൽ വൈദ്യുതി ലോഡിന്റെ ചലനങ്ങൾ കാണിക്കുന്ന ഒരു ഡാറ്റാസെറ്റ് ലോഡ് ചെയ്തു.
[![Introduction to ARIMA](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Introduction to ARIMA")
> 🎥 മുകളിൽ കാണുന്ന ചിത്രത്തിൽ ക്ലിക്ക് ചെയ്യുക ഒരു വീഡിയോക്കായി: ARIMA മോഡലുകളുടെ ഒരു സംക്ഷിപ്ത പരിചയം. ഉദാഹരണം R-ൽ ചെയ്തതാണ്, പക്ഷേ ആശയങ്ങൾ സർവത്രമാണ്.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## പരിചയം
ഈ പാഠത്തിൽ, നിങ്ങൾ [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) ഉപയോഗിച്ച് മോഡലുകൾ നിർമ്മിക്കുന്ന ഒരു പ്രത്യേക മാർഗം കണ്ടെത്തും. ARIMA മോഡലുകൾ പ്രത്യേകിച്ച് [non-stationarity](https://wikipedia.org/wiki/Stationary_process) കാണിക്കുന്ന ഡാറ്റയ്ക്ക് അനുയോജ്യമാണ്.
## പൊതുവായ ആശയങ്ങൾ
ARIMA ഉപയോഗിക്കാൻ കഴിയാൻ, നിങ്ങൾ അറിയേണ്ട ചില ആശയങ്ങൾ ഉണ്ട്:
- 🎓 **സ്റ്റേഷനറിറ്റി**. സാംഖ്യിക പശ്ചാത്തലത്തിൽ, സ്റ്റേഷനറിറ്റി എന്നത് സമയത്തിൽ മാറ്റം വരുത്തുമ്പോഴും വിതരണത്തിൽ മാറ്റമില്ലാത്ത ഡാറ്റയെ സൂചിപ്പിക്കുന്നു. നൺ-സ്റ്റേഷനറി ഡാറ്റ, അതായത് ട്രെൻഡുകൾ മൂലം ചലനങ്ങൾ കാണിക്കുന്ന ഡാറ്റ, വിശകലനം ചെയ്യാൻ മാറ്റം വരുത്തേണ്ടതാണ്. ഉദാഹരണത്തിന്, സീസണാലിറ്റി ഡാറ്റയിൽ ചലനങ്ങൾ കൊണ്ടുവരാം, ഇത് 'സീസണൽ-ഡിഫറൻസിംഗ്' പ്രക്രിയയിലൂടെ നീക്കം ചെയ്യാം.
- 🎓 **[ഡിഫറൻസിംഗ്](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. ഡാറ്റ ഡിഫറൻസിംഗ്, വീണ്ടും സാംഖ്യിക പശ്ചാത്തലത്തിൽ, നൺ-സ്റ്റേഷനറി ഡാറ്റയെ സ്റ്റേഷനറി ആക്കാൻ അതിന്റെ സ്ഥിരമല്ലാത്ത ട്രെൻഡ് നീക്കംചെയ്യുന്ന പ്രക്രിയയാണ്. "ഡിഫറൻസിംഗ് ഒരു ടൈം സീരീസിന്റെ തലത്തിലെ മാറ്റങ്ങൾ നീക്കംചെയ്യുന്നു, ട്രെൻഡ്, സീസണാലിറ്റി ഇല്ലാതാക്കുന്നു, അതിനാൽ ടൈം സീരീസിന്റെ ശരാശരി സ്ഥിരമാക്കുന്നു." [ഷിക്ഷിയോങ് et al ലേഖനം](https://arxiv.org/abs/1904.07632)
## ടൈം സീരീസ് പശ്ചാത്തലത്തിൽ ARIMA
ARIMAയുടെ ഭാഗങ്ങൾ വിശദീകരിച്ച്, ഇത് ടൈം സീരീസ് മോഡലിംഗിൽ എങ്ങനെ സഹായിക്കുന്നുവെന്ന് മനസ്സിലാക്കാം.
- **AR - ഓട്ടോറെഗ്രസീവ്**. ഓട്ടോറെഗ്രസീവ് മോഡലുകൾ, പേരുപോലെ, നിങ്ങളുടെ ഡാറ്റയിലെ മുൻകാല മൂല്യങ്ങളെ (ലാഗുകൾ) പരിശോധിച്ച് അവയെക്കുറിച്ച് അനുമാനങ്ങൾ നടത്തുന്നു. ഉദാഹരണത്തിന്, പेंसിൽ മാസവിൽപ്പനയുടെ ഡാറ്റ. ഓരോ മാസത്തെയും വിൽപ്പന 'വികസിക്കുന്ന വ്യത്യാസം' ആയി കണക്കാക്കുന്നു. ഈ മോഡൽ "വികസിക്കുന്ന വ്യത്യാസം അതിന്റെ സ്വന്തം മുൻകാല മൂല്യങ്ങളിൽ റഗ്രസ്സ് ചെയ്യപ്പെടുന്നു." [വിക്കിപീഡിയ](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average)
- **I - ഇന്റഗ്രേറ്റഡ്**. സമാനമായ 'ARMA' മോഡലുകളുമായി താരതമ്യപ്പെടുത്തുമ്പോൾ, ARIMAയിലെ 'I' അതിന്റെ *[ഇന്റഗ്രേറ്റഡ്](https://wikipedia.org/wiki/Order_of_integration)* ഭാഗത്തെ സൂചിപ്പിക്കുന്നു. ഡാറ്റ 'ഇന്റഗ്രേറ്റ്' ചെയ്യപ്പെടുന്നു, ഡിഫറൻസിംഗ് ഘട്ടങ്ങൾ പ്രയോഗിച്ച് നൺ-സ്റ്റേഷനറി നീക്കംചെയ്യാൻ.
- **MA - മൂവിംഗ് അവറേജ്**. ഈ മോഡലിന്റെ [മൂവിംഗ്-അവറേജ്](https://wikipedia.org/wiki/Moving-average_model) ഭാഗം നിലവിലെ ലാഗുകളും മുൻകാല മൂല്യങ്ങളും നിരീക്ഷിച്ച് ഔട്ട്പുട്ട് വ്യത്യാസം നിർണ്ണയിക്കുന്നു.
അവസാനമായി: ARIMA ടൈം സീരീസ് ഡാറ്റയുടെ പ്രത്യേക രൂപം ഏറ്റവും അടുത്ത് ഫിറ്റ് ചെയ്യാൻ ഉപയോഗിക്കുന്നു.
## അഭ്യാസം - ARIMA മോഡൽ നിർമ്മിക്കുക
ഈ പാഠത്തിലെ [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) ഫോൾഡർ തുറന്ന് [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb) ഫയൽ കണ്ടെത്തുക.
1. `statsmodels` പൈതൺ ലൈബ്രറി ലോഡ് ചെയ്യാൻ നോട്ട്‌ബുക്ക് റൺ ചെയ്യുക; ARIMA മോഡലുകൾക്കായി ഇത് ആവശ്യമാണ്.
1. ആവശ്യമായ ലൈബ്രറികൾ ലോഡ് ചെയ്യുക
1. ഇപ്പോൾ, ഡാറ്റ പ്ലോട്ടിംഗിന് ഉപകാരപ്രദമായ കൂടുതൽ ലൈബ്രറികൾ ലോഡ് ചെയ്യുക:
```python
import os
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime as dt
import math
from pandas.plotting import autocorrelation_plot
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.preprocessing import MinMaxScaler
from common.utils import load_data, mape
from IPython.display import Image
%matplotlib inline
pd.options.display.float_format = '{:,.2f}'.format
np.set_printoptions(precision=2)
warnings.filterwarnings("ignore") # മുന്നറിയിപ്പ് സന്ദേശങ്ങൾ അവഗണിക്കാൻ വ്യക്തമാക്കുക
```
1. `/data/energy.csv` ഫയലിൽ നിന്നുള്ള ഡാറ്റ പാൻഡാസ് ഡാറ്റാഫ്രെയിമിലേക്ക് ലോഡ് ചെയ്ത് നോക്കുക:
```python
energy = load_data('./data')[['load']]
energy.head(10)
```
1. 2012 ജനുവരി മുതൽ 2014 ഡിസംബർ വരെ ലഭ്യമായ എല്ലാ എനർജി ഡാറ്റയും പ്ലോട്ട് ചെയ്യുക. കഴിഞ്ഞ പാഠത്തിൽ കണ്ട ഡാറ്റയാണിത്, അതിനാൽ അത്ഭുതങ്ങൾ ഉണ്ടാകില്ല:
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
ഇപ്പോൾ, മോഡൽ നിർമ്മിക്കാം!
### പരിശീലനവും പരിശോധനയും ഡാറ്റാസെറ്റുകൾ സൃഷ്ടിക്കുക
ഇപ്പോൾ നിങ്ങളുടെ ഡാറ്റ ലോഡ് ചെയ്തിരിക്കുന്നു, അതിനാൽ അത് ട്രെയിൻ, ടെസ്റ്റ് സെറ്റുകളായി വേർതിരിക്കാം. മോഡൽ ട്രെയിൻ സെറ്റിൽ പരിശീലിപ്പിക്കും. സാധാരണ പോലെ, മോഡൽ പരിശീലനം പൂർത്തിയായ ശേഷം, ടെസ്റ്റ് സെറ്റ് ഉപയോഗിച്ച് അതിന്റെ കൃത്യത വിലയിരുത്തും. ടെസ്റ്റ് സെറ്റ് ട്രെയിൻ സെറ്റിനേക്കാൾ പിന്നീട് വരുന്ന സമയപരിധി ഉൾക്കൊള്ളണം, അതിനാൽ മോഡൽ ഭാവിയിലെ സമയങ്ങളിൽ നിന്നുള്ള വിവരങ്ങൾ നേടാതിരിക്കണം.
1. 2014 സെപ്റ്റംബർ 1 മുതൽ ഒക്ടോബർ 31 വരെ രണ്ട് മാസത്തെ കാലയളവ് ട്രെയിൻ സെറ്റിന് അനുവദിക്കുക. ടെസ്റ്റ് സെറ്റ് 2014 നവംബർ 1 മുതൽ ഡിസംബർ 31 വരെ രണ്ട് മാസത്തെ കാലയളവാണ്:
```python
train_start_dt = '2014-11-01 00:00:00'
test_start_dt = '2014-12-30 00:00:00'
```
ഈ ഡാറ്റ ദിനംപ്രതി എനർജി ഉപഭോഗം പ്രതിഫലിപ്പിക്കുന്നതിനാൽ ശക്തമായ സീസണൽ പാറ്റേൺ ഉണ്ട്, എന്നാൽ ഉപഭോഗം ഏറ്റവും അടുത്ത ദിവസങ്ങളിലെ ഉപഭോഗത്തോട് ഏറ്റവും സമാനമാണ്.
1. വ്യത്യാസങ്ങൾ ദൃശ്യവൽക്കരിക്കുക:
```python
energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \
.join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \
.plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![training and testing data](../../../../translated_images/train-test.8928d14e5b91fc942f0ca9201b2d36c890ea7e98f7619fd94f75de3a4c2bacb9.ml.png)
അതിനാൽ, ഡാറ്റ പരിശീലനത്തിന് ചെറിയ ഒരു സമയവിൻഡോ ഉപയോഗിക്കുന്നത് മതിയാകും.
> കുറിപ്പ്: ARIMA മോഡൽ ഫിറ്റിംഗിനായി ഉപയോഗിക്കുന്ന ഫംഗ്ഷൻ ഇൻ-സാമ്പിൾ വാലിഡേഷൻ ഉപയോഗിക്കുന്നതിനാൽ, വാലിഡേഷൻ ഡാറ്റ ഒഴിവാക്കും.
### പരിശീലനത്തിനായി ഡാറ്റ തയ്യാറാക്കുക
ഇപ്പോൾ, ഡാറ്റ ഫിൽട്ടറിംഗ്, സ്കെയിലിംഗ് എന്നിവ നടത്തി പരിശീലനത്തിനായി തയ്യാറാക്കണം. ആവശ്യമായ സമയപരിധികളും കോളങ്ങളുമുള്ള ഡാറ്റ ഫിൽട്ടർ ചെയ്ത്, ഡാറ്റ 0,1 ഇടവേളയിൽ പ്രൊജക്ട് ചെയ്യാൻ സ്കെയിൽ ചെയ്യുക.
1. മുൻപിൽ പറഞ്ഞ സമയപരിധികളിൽ മാത്രമുള്ള ഡാറ്റ ഫിൽട്ടർ ചെയ്ത് 'load' കോളവും തീയതിയും ഉൾപ്പെടുത്തുക:
```python
train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
test = energy.copy()[energy.index >= test_start_dt][['load']]
print('Training data shape: ', train.shape)
print('Test data shape: ', test.shape)
```
ഡാറ്റയുടെ ആകൃതി കാണാം:
```output
Training data shape: (1416, 1)
Test data shape: (48, 1)
```
1. ഡാറ്റ (0, 1) പരിധിയിൽ സ്കെയിൽ ചെയ്യുക.
```python
scaler = MinMaxScaler()
train['load'] = scaler.fit_transform(train)
train.head(10)
```
1. ഒറിജിനൽ ഡാറ്റയും സ്കെയിൽ ചെയ്ത ഡാറ്റയും ദൃശ്യവൽക്കരിക്കുക:
```python
energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12)
train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12)
plt.show()
```
![original](../../../../translated_images/original.b2b15efe0ce92b8745918f071dceec2231661bf49c8db6918e3ff4b3b0b183c2.ml.png)
> ഒറിജിനൽ ഡാറ്റ
![scaled](../../../../translated_images/scaled.e35258ca5cd3d43f86d5175e584ba96b38d51501f234abf52e11f4fe2631e45f.ml.png)
> സ്കെയിൽ ചെയ്ത ഡാറ്റ
1. സ്കെയിൽ ചെയ്ത ഡാറ്റ കാൽബ്രേറ്റ് ചെയ്തതിനുശേഷം, ടെസ്റ്റ് ഡാറ്റയും സ്കെയിൽ ചെയ്യാം:
```python
test['load'] = scaler.transform(test)
test.head()
```
### ARIMA നടപ്പിലാക്കുക
ഇപ്പോൾ ARIMA നടപ്പിലാക്കാനുള്ള സമയം! നിങ്ങൾ മുമ്പ് ഇൻസ്റ്റാൾ ചെയ്ത `statsmodels` ലൈബ്രറി ഉപയോഗിക്കും.
ഇപ്പോൾ നിങ്ങൾക്ക് ചില ഘട്ടങ്ങൾ പിന്തുടരേണ്ടതാണ്
1. `SARIMAX()` വിളിച്ച് മോഡൽ നിർവചിക്കുക, മോഡൽ പാരാമീറ്ററുകൾ p, d, q, P, D, Q നൽകുക.
2. fit() ഫംഗ്ഷൻ വിളിച്ച് മോഡൽ പരിശീലനത്തിനായി തയ്യാറാക്കുക.
3. `forecast()` ഫംഗ്ഷൻ വിളിച്ച് പ്രവചനങ്ങൾ നടത്തുക, പ്രവചിക്കേണ്ട ഘട്ടങ്ങളുടെ എണ്ണം (horizon) വ്യക്തമാക്കുക.
> 🎓 ഈ പാരാമീറ്ററുകൾ എന്തിനാണ്? ARIMA മോഡലിൽ ടൈം സീരീസിന്റെ പ്രധാന ഘടകങ്ങൾ മോഡലാക്കാൻ 3 പാരാമീറ്ററുകൾ ഉണ്ട്: സീസണാലിറ്റി, ട്രെൻഡ്, ശബ്ദം. ഇവയാണ്:
`p`: മോഡലിന്റെ ഓട്ടോ-റെഗ്രസീവ് ഭാഗവുമായി ബന്ധപ്പെട്ട പാരാമീറ്റർ, *മുൻകാല* മൂല്യങ്ങൾ ഉൾക്കൊള്ളുന്നു.
`d`: മോഡലിന്റെ ഇന്റഗ്രേറ്റഡ് ഭാഗവുമായി ബന്ധപ്പെട്ട പാരാമീറ്റർ, ടൈം സീരീസിൽ *ഡിഫറൻസിംഗ്* (🎓 മുകളിൽ ഡിഫറൻസിംഗ് ഓർമ്മിക്കുക) പ്രയോഗിക്കുന്നതിനെ ബാധിക്കുന്നു.
`q`: മോഡലിന്റെ മൂവിംഗ്-അവറേജ് ഭാഗവുമായി ബന്ധപ്പെട്ട പാരാമീറ്റർ.
> കുറിപ്പ്: നിങ്ങളുടെ ഡാറ്റയിൽ സീസണൽ ഘടകം ഉണ്ടെങ്കിൽ - ഈ ഡാറ്റയിൽ ഉണ്ട് - സീസണൽ ARIMA മോഡൽ (SARIMA) ഉപയോഗിക്കും. അപ്പോൾ മറ്റൊരു പാരാമീറ്റർ സെറ്റ് ഉപയോഗിക്കണം: `P`, `D`, `Q` - ഇവ `p`, `d`, `q` പോലെയാണ്, പക്ഷേ മോഡലിന്റെ സീസണൽ ഘടകങ്ങളെ സൂചിപ്പിക്കുന്നു.
1. നിങ്ങളുടെ ഇഷ്ടമുള്ള horizon മൂല്യം സെറ്റ് ചെയ്യുക. 3 മണിക്കൂർ ശ്രമിക്കാം:
```python
# മുന്നോട്ടു പ്രവചിക്കാൻ ഘട്ടങ്ങളുടെ എണ്ണം വ്യക്തമാക്കുക
HORIZON = 3
print('Forecasting horizon:', HORIZON, 'hours')
```
ARIMA മോഡലിന്റെ പാരാമീറ്ററുകൾക്ക് മികച്ച മൂല്യങ്ങൾ തിരഞ്ഞെടുക്കുന്നത് സങ്കീർണ്ണവും സമയമെടുക്കുന്നതുമായ പ്രക്രിയയാണ്. നിങ്ങൾക്ക് [`pyramid` ലൈബ്രറിയിലെ `auto_arima()` ഫംഗ്ഷൻ](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html) ഉപയോഗിക്കാം.
1. ഇപ്പോൾ ചില മാനുവൽ തിരഞ്ഞെടുപ്പുകൾ പരീക്ഷിച്ച് നല്ല മോഡൽ കണ്ടെത്തുക.
```python
order = (4, 1, 0)
seasonal_order = (1, 1, 0, 24)
model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order)
results = model.fit()
print(results.summary())
```
ഫലങ്ങളുടെ പട്ടിക പ്രിന്റ് ചെയ്യും.
നിങ്ങൾ ആദ്യ മോഡൽ നിർമ്മിച്ചു! ഇപ്പോൾ അത് വിലയിരുത്താനുള്ള മാർഗം കണ്ടെത്തണം.
### നിങ്ങളുടെ മോഡൽ വിലയിരുത്തുക
നിങ്ങളുടെ മോഡൽ വിലയിരുത്താൻ,所谓 `walk forward` വാലിഡേഷൻ നടത്താം. പ്രായോഗികമായി, ടൈം സീരീസ് മോഡലുകൾ പുതിയ ഡാറ്റ ലഭിക്കുമ്പോൾ വീണ്ടും പരിശീലിപ്പിക്കുന്നു. ഇതിലൂടെ ഓരോ സമയ ഘട്ടത്തിലും മികച്ച പ്രവചനങ്ങൾ നടത്താൻ കഴിയും.
ടൈം സീരീസ് ആരംഭത്തിൽ നിന്ന് ഈ സാങ്കേതിക വിദ്യ ഉപയോഗിച്ച്, ട്രെയിൻ ഡാറ്റ സെറ്റിൽ മോഡൽ പരിശീലിപ്പിക്കുക. തുടർന്ന് അടുത്ത സമയ ഘട്ടത്തിൽ പ്രവചനമാക്കുക. പ്രവചനത്തെ അറിയപ്പെടുന്ന മൂല്യവുമായി താരതമ്യം ചെയ്യുക. ട്രെയിൻ സെറ്റ് അറിയപ്പെടുന്ന മൂല്യം ഉൾക്കൊള്ളിച്ച് വിപുലീകരിക്കുക, പ്രക്രിയ ആവർത്തിക്കുക.
> കുറിപ്പ്: കൂടുതൽ കാര്യക്ഷമമായ പരിശീലനത്തിനായി ട്രെയിൻ സെറ്റ് വിൻഡോ സ്ഥിരമായി സൂക്ഷിക്കുക, പുതിയ നിരീക്ഷണം ചേർക്കുമ്പോൾ തുടക്കത്തിലെ നിരീക്ഷണം നീക്കംചെയ്യുക.
ഈ പ്രക്രിയ മോഡൽ പ്രായോഗികമായി എങ്ങനെ പ്രവർത്തിക്കും എന്നതിന്റെ കൂടുതൽ ശക്തമായ അളവുകോൽ നൽകുന്നു. എന്നാൽ ഇതിന് നിരവധി മോഡലുകൾ സൃഷ്ടിക്കേണ്ടതായതിനാൽ കംപ്യൂട്ടേഷൻ ചെലവ് കൂടുതലാണ്. ഡാറ്റ ചെറിയതായോ മോഡൽ ലളിതമായോ ആയാൽ ഇത് അംഗീകരിക്കാവുന്നതാണ്, പക്ഷേ വലിയ തോതിൽ പ്രശ്നമാകാം.
വാക്ക്-ഫോർവേഡ് വാലിഡേഷൻ ടൈം സീരീസ് മോഡൽ വിലയിരുത്തലിന്റെ സ്വർണ്ണ മാനദണ്ഡമാണ്, നിങ്ങളുടെ സ്വന്തം പ്രോജക്റ്റുകൾക്കായി ഇത് ശുപാർശ ചെയ്യുന്നു.
1. ആദ്യം, ഓരോ HORIZON ഘട്ടത്തിനും ഒരു ടെസ്റ്റ് ഡാറ്റ പോയിന്റ് സൃഷ്ടിക്കുക.
```python
test_shifted = test.copy()
for t in range(1, HORIZON+1):
test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H')
test_shifted = test_shifted.dropna(how='any')
test_shifted.head(5)
```
| | | load | load+1 | load+2 |
| ---------- | -------- | ---- | ------ | ------ |
| 2014-12-30 | 00:00:00 | 0.33 | 0.29 | 0.27 |
| 2014-12-30 | 01:00:00 | 0.29 | 0.27 | 0.27 |
| 2014-12-30 | 02:00:00 | 0.27 | 0.27 | 0.30 |
| 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 |
| 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 |
ഡാറ്റ അതിന്റെ horizon പോയിന്റ് അനുസരിച്ച് ഹോരിസോണ്ടലായി മാറ്റിയിരിക്കുന്നു.
1. ടെസ്റ്റ് ഡാറ്റയിൽ ഈ സ്ലൈഡിംഗ് വിൻഡോ സമീപനം ഉപയോഗിച്ച് പ്രവചനങ്ങൾ നടത്തുക, ടെസ്റ്റ് ഡാറ്റയുടെ നീളത്തോളം ലൂപ്പ് നടത്തുക:
```python
%%time
training_window = 720 # പരിശീലനത്തിന് 30 ദിവസം (720 മണിക്കൂർ) സമർപ്പിക്കുക
train_ts = train['load']
test_ts = test_shifted
history = [x for x in train_ts]
history = history[(-training_window):]
predictions = list()
order = (2, 1, 0)
seasonal_order = (1, 1, 0, 24)
for t in range(test_ts.shape[0]):
model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order)
model_fit = model.fit()
yhat = model_fit.forecast(steps = HORIZON)
predictions.append(yhat)
obs = list(test_ts.iloc[t])
# പരിശീലന വിൻഡോ നീക്കുക
history.append(obs[0])
history.pop(0)
print(test_ts.index[t])
print(t+1, ': predicted =', yhat, 'expected =', obs)
```
പരിശീലനം നടക്കുന്നത് കാണാം:
```output
2014-12-30 00:00:00
1 : predicted = [0.32 0.29 0.28] expected = [0.32945389435989236, 0.2900626678603402, 0.2739480752014323]
2014-12-30 01:00:00
2 : predicted = [0.3 0.29 0.3 ] expected = [0.2900626678603402, 0.2739480752014323, 0.26812891674127126]
2014-12-30 02:00:00
3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795]
```
1. പ്രവചനങ്ങളെ യഥാർത്ഥ ലോഡുമായി താരതമ്യം ചെയ്യുക:
```python
eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)])
eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1]
eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h')
eval_df['actual'] = np.array(np.transpose(test_ts)).ravel()
eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']])
eval_df.head()
```
ഔട്ട്പുട്ട്
| | | timestamp | h | prediction | actual |
| --- | ---------- | --------- | --- | ---------- | -------- |
| 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 |
| 1 | 2014-12-30 | 01:00:00 | t+1 | 2,955.53 | 2,935.00 |
| 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 |
| 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 |
| 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 |
മണിക്കൂറിൽ ഓരോ ഡാറ്റയുടെ പ്രവചനവും യഥാർത്ഥ ലോഡുമായി താരതമ്യം ചെയ്യുക. ഇത് എത്രത്തോളം കൃത്യമാണെന്ന് കാണുക.
### മോഡൽ കൃത്യത പരിശോധിക്കുക
എല്ലാ പ്രവചനങ്ങളിലും മോഡലിന്റെ ശരാശരി ആബ്സല്യൂട്ട് ശതമാന പിശക് (MAPE) പരിശോധിച്ച് കൃത്യത വിലയിരുത്തുക.
> **🧮 ഗണിതം കാണിക്കുക**
>
> ![MAPE](../../../../translated_images/mape.fd87bbaf4d346846df6af88b26bf6f0926bf9a5027816d5e23e1200866e3e8a4.ml.png)
>
> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) മുൻകൂട്ടി കണക്കാക്കലിന്റെ കൃത്യത മുകളിൽ നൽകിയ ഫോർമുല ഉപയോഗിച്ച് നിർവചിച്ച അനുപാതമായി കാണിക്കാൻ ഉപയോഗിക്കുന്നു. actual<sub>t</sub>നും predicted<sub>t</sub>നും ഇടയിലെ വ്യത്യാസം actual<sub>t</sub>ൽ വിഭജിക്കുന്നു. "ഈ കണക്കിൽ ആബ്സല്യൂട്ട് മൂല്യം ഓരോ മുൻകൂട്ടി കണക്കാക്കിയ സമയബിന്ദുവിനും കൂട്ടിച്ചേർത്ത് ഫിറ്റുചെയ്ത ബിന്ദുക്കളുടെ എണ്ണം n-ൽ വിഭജിക്കുന്നു." [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error)
1. സമവാക്യം കോഡിൽ പ്രകടിപ്പിക്കുക:
```python
if(HORIZON > 1):
eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual']
print(eval_df.groupby('h')['APE'].mean())
```
1. ഒരു ഘട്ടത്തിന്റെ MAPE കണക്കാക്കുക:
```python
print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%')
```
ഒരു ഘട്ടം മുൻകൂട്ടി MAPE: 0.5570581332313952 %
1. ബഹുഘട്ട മുൻകൂട്ടി MAPE പ്രിന്റ് ചെയ്യുക:
```python
print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%')
```
```output
Multi-step forecast MAPE: 1.1460048657704118 %
```
കുറഞ്ഞ സംഖ്യ നല്ലതാണ്: MAPE 10 ഉള്ള ഒരു മുൻകൂട്ടി 10% വ്യത്യാസമുള്ളതാണ് എന്ന് പരിഗണിക്കുക.
1. എന്നാൽ എപ്പോഴും, ഈ തരത്തിലുള്ള കൃത്യതാ അളവ് ദൃശ്യമായി കാണുന്നത് എളുപ്പമാണ്, അതിനാൽ ഇത് പ്ലോട്ട് ചെയ്യാം:
```python
if(HORIZON == 1):
## ഒറ്റ ഘട്ട പ്രവചനത്തിന്റെ ഗ്രാഫ് വരയ്ക്കുന്നു
eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8))
else:
## ബഹുഘട്ട പ്രവചനത്തിന്റെ ഗ്രാഫ് വരയ്ക്കുന്നു
plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']]
for t in range(1, HORIZON+1):
plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values
fig = plt.figure(figsize=(15, 8))
ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0)
ax = fig.add_subplot(111)
for t in range(1, HORIZON+1):
x = plot_df['timestamp'][(t-1):]
y = plot_df['t+'+str(t)][0:len(x)]
ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t))
ax.legend(loc='best')
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![a time series model](../../../../translated_images/accuracy.2c47fe1bf15f44b3656651c84d5e2ba9b37cd929cd2aa8ab6cc3073f50570f4e.ml.png)
🏆 വളരെ നല്ല ഒരു പ്ലോട്ട്, നല്ല കൃത്യതയുള്ള ഒരു മോഡൽ കാണിക്കുന്നു. നല്ല ജോലി!
---
## 🚀ചലഞ്ച്
ടൈം സീരീസ് മോഡലിന്റെ കൃത്യത പരിശോധിക്കുന്ന മാർഗങ്ങൾ അന്വേഷിക്കുക. ഈ പാഠത്തിൽ MAPE-യെ കുറിച്ച് touched ചെയ്തിട്ടുണ്ട്, പക്ഷേ നിങ്ങൾ ഉപയോഗിക്കാവുന്ന മറ്റ് രീതികൾ ഉണ്ടോ? അവയെ ഗവേഷിച്ച് കുറിപ്പിടുക. സഹായകമായ ഒരു ഡോക്യുമെന്റ് [ഇവിടെ](https://otexts.com/fpp2/accuracy.html) ലഭ്യമാണ്.
## [പാഠം കഴിഞ്ഞുള്ള ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
ഈ പാഠം ARIMA ഉപയോഗിച്ച ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗിന്റെ അടിസ്ഥാനങ്ങൾ മാത്രമാണ് സ്പർശിക്കുന്നത്. ടൈം സീരീസ് മോഡലുകൾ നിർമ്മിക്കുന്ന മറ്റ് മാർഗങ്ങൾ പഠിക്കാൻ [ഈ റിപോസിറ്ററി](https://microsoft.github.io/forecasting/)യും അതിന്റെ വിവിധ മോഡൽ തരംകളും പരിശോധിച്ച് നിങ്ങളുടെ അറിവ് ആഴപ്പെടുത്തുക.
## അസൈൻമെന്റ്
[ഒരു പുതിയ ARIMA മോഡൽ](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1c814013e10866dfd92cdb32caaae3ac",
"translation_date": "2025-12-19T16:13:44+00:00",
"source_file": "7-TimeSeries/2-ARIMA/assignment.md",
"language_code": "ml"
}
-->
# ഒരു പുതിയ ARIMA മോഡൽ
## നിർദ്ദേശങ്ങൾ
നിങ്ങൾ ഒരു ARIMA മോഡൽ നിർമ്മിച്ചിട്ടുണ്ടെങ്കിൽ, പുതിയ ഡാറ്റ ഉപയോഗിച്ച് മറ്റൊരു മോഡൽ നിർമ്മിക്കുക (Duke-യിലെ [ഈ ഡാറ്റാസെറ്റുകളിൽ ഒന്നിനെ പരീക്ഷിക്കുക](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). നിങ്ങളുടെ പ്രവർത്തനം ഒരു നോട്ട്‌ബുക്കിൽ രേഖപ്പെടുത്തുക, ഡാറ്റയും നിങ്ങളുടെ മോഡലും ദൃശ്യവൽക്കരിക്കുക, MAPE ഉപയോഗിച്ച് അതിന്റെ കൃത്യത പരിശോധിക്കുക.
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണാർത്ഥം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------- |
| | പുതിയ ARIMA മോഡൽ നിർമ്മിച്ച്, പരീക്ഷിച്ച്, ദൃശ്യവൽക്കരണങ്ങളോടും കൃത്യതയും വ്യക്തമാക്കിയ ഒരു നോട്ട്‌ബുക്ക് സമർപ്പിച്ചിരിക്കുന്നു. | സമർപ്പിച്ച നോട്ട്‌ബുക്ക് രേഖപ്പെടുത്താത്തതോ പിശകുകൾ ഉള്ളതോ ആണ് | അപൂർണ്ണമായ ഒരു നോട്ട്‌ബുക്ക് സമർപ്പിച്ചിരിക്കുന്നു |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T16:15:34+00:00",
"source_file": "7-TimeSeries/2-ARIMA/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡർ ആണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-12-19T16:16:06+00:00",
"source_file": "7-TimeSeries/2-ARIMA/solution/R/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡർ ആണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

File diff suppressed because one or more lines are too long

@ -0,0 +1,59 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": 3
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "523ec472196307b3c4235337353c9ceb",
"translation_date": "2025-12-19T17:37:36+00:00",
"source_file": "7-TimeSeries/2-ARIMA/working/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"# ARIMA ഉപയോഗിച്ച് ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗ്\n",
"\n",
"ഈ നോട്ട്‌ബുക്കിൽ, ഞങ്ങൾ കാണിക്കുന്നു:\n",
"- ARIMA ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗ് മോഡൽ പരിശീലനത്തിനായി ടൈം സീരീസ് ഡാറ്റ തയ്യാറാക്കുന്നത് എങ്ങനെ\n",
"- ടൈം സീരീസിൽ അടുത്ത HORIZON ഘട്ടങ്ങൾ (സമയം *t+1* മുതൽ *t+HORIZON* വരെ) ഫോറ്കാസ്റ്റ് ചെയ്യാൻ ഒരു ലളിതമായ ARIMA മോഡൽ എങ്ങനെ നടപ്പിലാക്കാം\n",
"- മോഡൽ എങ്ങനെ വിലയിരുത്താം\n",
"\n",
"ഈ ഉദാഹരണത്തിലെ ഡാറ്റ GEFCom2014 ഫോറ്കാസ്റ്റിംഗ് മത്സരം<sup>1</sup> നിന്നാണ് എടുത്തത്. ഇത് 2012 മുതൽ 2014 വരെ 3 വർഷത്തെ മണിക്കൂറു അടിസ്ഥാനത്തിലുള്ള വൈദ്യുതി ലോഡ് மற்றும் താപനില മൂല്യങ്ങൾ ഉൾക്കൊള്ളുന്നു. ടാസ്ക് വൈദ്യുതി ലോഡിന്റെ ഭാവി മൂല്യങ്ങൾ ഫോറ്കാസ്റ്റ് ചെയ്യുകയാണ്. ഈ ഉദാഹരണത്തിൽ, ചരിത്ര ലോഡ് ഡാറ്റ മാത്രം ഉപയോഗിച്ച് ഒരു ടൈം ഘട്ടം മുന്നോട്ട് ഫോറ്കാസ്റ്റ് ചെയ്യുന്നത് കാണിക്കുന്നു.\n",
"\n",
"<sup>1</sup>ടാവോ ഹോങ്, പിയർ പിൻസൺ, ഷു ഫാൻ, ഹമിദ്‌റേസാ സാരെയിപൂർ, അൽബർട്ടോ ട്രൊക്കോളി, റോബ് ജെ. ഹൈൻഡ്മാൻ, \"പ്രൊബബിലിസ്റ്റിക് എനർജി ഫോറ്കാസ്റ്റിംഗ്: ഗ്ലോബൽ എനർജി ഫോറ്കാസ്റ്റിംഗ് കോംപറ്റിഷൻ 2014 ആൻഡ് ബിയോണ്ട്\", ഇന്റർനാഷണൽ ജേർണൽ ഓഫ് ഫോറ്കാസ്റ്റിംഗ്, വോൾ.32, നമ്പർ 3, പേജ് 896-913, ജൂലൈ-സെപ്റ്റംബർ, 2016.\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pip install statsmodels"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാപത്രം**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,402 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "482bccabe1df958496ea71a3667995cd",
"translation_date": "2025-12-19T15:58:16+00:00",
"source_file": "7-TimeSeries/3-SVR/README.md",
"language_code": "ml"
}
-->
# Support Vector Regressor ഉപയോഗിച്ച് ടൈം സീരീസ് പ്രവചനം
മുൻപത്തെ പാഠത്തിൽ, ടൈം സീരീസ് പ്രവചനങ്ങൾ നടത്താൻ ARIMA മോഡൽ എങ്ങനെ ഉപയോഗിക്കാമെന്ന് നിങ്ങൾ പഠിച്ചു. ഇപ്പോൾ നിങ്ങൾ തുടർച്ചയായ ഡാറ്റ പ്രവചിക്കാൻ ഉപയോഗിക്കുന്ന ഒരു റെഗ്രസർ മോഡലായ Support Vector Regressor മോഡലിനെക്കുറിച്ച് നോക്കാൻ പോകുന്നു.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## പരിചയം
ഈ പാഠത്തിൽ, നിങ്ങൾ റെഗ്രഷനിനായി [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) ഉപയോഗിച്ച് മോഡലുകൾ നിർമ്മിക്കുന്ന ഒരു പ്രത്യേക മാർഗം കണ്ടെത്തും, അല്ലെങ്കിൽ **SVR: Support Vector Regressor**.
### ടൈം സീരീസ് സാന്ദർഭ്യത്തിൽ SVR [^1]
ടൈം സീരീസ് പ്രവചനത്തിൽ SVR-ന്റെ പ്രാധാന്യം മനസ്സിലാക്കുന്നതിന് മുമ്പ്, നിങ്ങൾ അറിയേണ്ട ചില പ്രധാന ആശയങ്ങൾ ഇവയാണ്:
- **Regression:** നൽകിയ ഇൻപുട്ടുകളുടെ ഒരു സെറ്റിൽ നിന്ന് തുടർച്ചയായ മൂല്യങ്ങൾ പ്രവചിക്കാൻ ഉപയോഗിക്കുന്ന സൂപ്പർവൈസ്ഡ് ലേണിംഗ് സാങ്കേതിക വിദ്യ. ഫീച്ചർ സ്പേസിൽ ഏറ്റവും കൂടുതൽ ഡാറ്റ പോയിന്റുകൾ ഉള്ള ഒരു വളവ് (അഥവാ രേഖ) ഫിറ്റ് ചെയ്യുക എന്നതാണ് ആശയം. കൂടുതൽ വിവരങ്ങൾക്ക് [ഇവിടെ ക്ലിക്ക് ചെയ്യുക](https://en.wikipedia.org/wiki/Regression_analysis).
- **Support Vector Machine (SVM):** ക്ലാസിഫിക്കേഷൻ, റെഗ്രഷൻ, ഔട്ട്‌ലൈയർ കണ്ടെത്തൽ എന്നിവയ്ക്ക് ഉപയോഗിക്കുന്ന ഒരു തരം സൂപ്പർവൈസ്ഡ് മെഷീൻ ലേണിംഗ് മോഡൽ. മോഡൽ ഫീച്ചർ സ്പേസിലെ ഒരു ഹൈപ്പർപ്ലെയിൻ ആണ്, ക്ലാസിഫിക്കേഷനിൽ അതു ഒരു അതിരായി പ്രവർത്തിക്കുകയും, റെഗ്രഷനിൽ ഏറ്റവും മികച്ച ഫിറ്റ് രേഖയായി പ്രവർത്തിക്കുകയും ചെയ്യുന്നു. SVM-ൽ, ഡാറ്റാസെറ്റ് ഉയർന്ന ഡൈമെൻഷനുകളുള്ള സ്പേസിലേക്ക് മാറ്റാൻ സാധിക്കുന്ന Kernel ഫംഗ്ഷൻ സാധാരണയായി ഉപയോഗിക്കുന്നു, അതിലൂടെ ഡാറ്റകൾ എളുപ്പത്തിൽ വേർതിരിക്കാവുന്നതാകും. SVM-കളെക്കുറിച്ച് കൂടുതൽ വിവരങ്ങൾക്ക് [ഇവിടെ ക്ലിക്ക് ചെയ്യുക](https://en.wikipedia.org/wiki/Support-vector_machine).
- **Support Vector Regressor (SVR):** SVM-ന്റെ ഒരു തരം, ഏറ്റവും കൂടുതൽ ഡാറ്റ പോയിന്റുകൾ ഉള്ള മികച്ച ഫിറ്റ് രേഖ (SVM-ൽ ഹൈപ്പർപ്ലെയിൻ) കണ്ടെത്താൻ.
### എന്തുകൊണ്ട് SVR? [^1]
കഴിഞ്ഞ പാഠത്തിൽ നിങ്ങൾ ARIMA-യെക്കുറിച്ച് പഠിച്ചു, ഇത് ടൈം സീരീസ് ഡാറ്റ പ്രവചിക്കാൻ വളരെ വിജയകരമായ ഒരു സാങ്കേതിക രേഖാമൂലക രീതി ആണ്. എന്നാൽ, പലപ്പോഴും ടൈം സീരീസ് ഡാറ്റയിൽ *നോൺ-ലിനിയാരിറ്റി* ഉണ്ടാകാറുണ്ട്, ഇത് ലിനിയാർ മോഡലുകൾ ഉപയോഗിച്ച് മാപ്പ് ചെയ്യാനാകില്ല. ഇത്തരം സാഹചര്യങ്ങളിൽ, റെഗ്രഷൻ ടാസ്കുകൾക്കായി ഡാറ്റയിലെ നോൺ-ലിനിയാരിറ്റി പരിഗണിക്കുന്ന SVM-ന്റെ കഴിവ് SVR-നെ ടൈം സീരീസ് പ്രവചനത്തിൽ വിജയകരമാക്കുന്നു.
## അഭ്യാസം - SVR മോഡൽ നിർമ്മിക്കുക
ഡാറ്റാ തയ്യാറാക്കലിന്റെ ആദ്യ കുറച്ച് ഘട്ടങ്ങൾ മുൻപത്തെ [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) പാഠത്തിലെ പോലെ തന്നെയാണ്.
ഈ പാഠത്തിലെ [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) ഫോൾഡർ തുറന്ന് [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb) ഫയൽ കണ്ടെത്തുക.[^2]
1. നോട്ട്‌ബുക്ക് റൺ ചെയ്ത് ആവശ്യമായ ലൈബ്രറികൾ ഇറക്കുമതി ചെയ്യുക: [^2]
```python
import sys
sys.path.append('../../')
```
```python
import os
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime as dt
import math
from sklearn.svm import SVR
from sklearn.preprocessing import MinMaxScaler
from common.utils import load_data, mape
```
2. `/data/energy.csv` ഫയലിൽ നിന്നുള്ള ഡാറ്റ പാൻഡാസ് ഡാറ്റാഫ്രെയിമിലേക്ക് ലോഡ് ചെയ്ത് നോക്കുക: [^2]
```python
energy = load_data('../../data')[['load']]
```
3. 2012 ജനുവരി മുതൽ 2014 ഡിസംബർ വരെ ലഭ്യമായ എല്ലാ എനർജി ഡാറ്റയും പ്ലോട്ട് ചെയ്യുക: [^2]
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![full data](../../../../translated_images/full-data.a82ec9957e580e976f651a4fc38f280b9229c6efdbe3cfe7c60abaa9486d2cbe.ml.png)
ഇപ്പോൾ, നമുക്ക് SVR മോഡൽ നിർമ്മിക്കാം.
### ട്രെയിനിംഗ്, ടെസ്റ്റിംഗ് ഡാറ്റാസെറ്റുകൾ സൃഷ്ടിക്കുക
ഇപ്പോൾ നിങ്ങളുടെ ഡാറ്റ ലോഡ് ചെയ്തിരിക്കുന്നു, അതിനാൽ അത് ട്രെയിൻ, ടെസ്റ്റ് സെറ്റുകളായി വേർതിരിക്കാം. പിന്നീട് SVR-ക്ക് ആവശ്യമായ ടൈം-സ്റ്റെപ്പ് അടിസ്ഥാനമാക്കിയുള്ള ഡാറ്റാസെറ്റ് സൃഷ്ടിക്കാൻ ഡാറ്റ പുനരാകൃതമാക്കും. മോഡൽ ട്രെയിൻ സെറ്റിൽ പരിശീലിപ്പിക്കും. മോഡൽ പരിശീലനം പൂർത്തിയായ ശേഷം, ട്രെയിനിംഗ് സെറ്റ്, ടെസ്റ്റിംഗ് സെറ്റ്, പിന്നെ മുഴുവൻ ഡാറ്റാസെറ്റിൽ അതിന്റെ കൃത്യത വിലയിരുത്തും. ടെസ്റ്റ് സെറ്റ് ട്രെയിനിംഗ് സെറ്റിൽ നിന്നുള്ള പിന്നീട് കാലയളവിൽ നിന്നുള്ളതായിരിക്കണം, അതിലൂടെ മോഡൽ ഭാവിയിലെ സമയങ്ങളിൽ നിന്നുള്ള വിവരങ്ങൾ നേടാതിരിക്കണം [^2] (*ഓവർഫിറ്റിംഗ്* എന്നറിയപ്പെടുന്ന സ്ഥിതി).
1. 2014 സെപ്റ്റംബർ 1 മുതൽ ഒക്ടോബർ 31 വരെ രണ്ട് മാസത്തെ കാലയളവ് ട്രെയിനിംഗ് സെറ്റിന് അനുവദിക്കുക. ടെസ്റ്റ് സെറ്റ് 2014 നവംബർ 1 മുതൽ ഡിസംബർ 31 വരെ രണ്ട് മാസത്തെ കാലയളവ് ഉൾക്കൊള്ളും: [^2]
```python
train_start_dt = '2014-11-01 00:00:00'
test_start_dt = '2014-12-30 00:00:00'
```
2. വ്യത്യാസങ്ങൾ ദൃശ്യവൽക്കരിക്കുക: [^2]
```python
energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \
.join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \
.plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![training and testing data](../../../../translated_images/train-test.ead0cecbfc341921d4875eccf25fed5eefbb860cdbb69cabcc2276c49e4b33e5.ml.png)
### ട്രെയിനിംഗിനായി ഡാറ്റ തയ്യാറാക്കുക
ഇപ്പോൾ, നിങ്ങളുടെ ഡാറ്റ ഫിൽട്ടർ ചെയ്ത് സ്കെയിൽ ചെയ്ത് ട്രെയിനിംഗിനായി തയ്യാറാക്കണം. ആവശ്യമായ സമയപരിധികളും കോളങ്ങളുമായി മാത്രം നിങ്ങളുടെ ഡാറ്റാസെറ്റ് ഫിൽട്ടർ ചെയ്യുക, ഡാറ്റ 0,1 ഇടവേളയിൽ പ്രൊജക്ട് ചെയ്യാൻ സ്കെയ്ലിംഗ് നടത്തുക.
1. മുൻകൂട്ടി പറഞ്ഞ സമയപരിധികളിൽ മാത്രവും 'load' എന്ന ആവശ്യമായ കോളവും തീയതിയും ഉൾപ്പെടെ ഒറിജിനൽ ഡാറ്റാസെറ്റ് ഫിൽട്ടർ ചെയ്യുക: [^2]
```python
train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
test = energy.copy()[energy.index >= test_start_dt][['load']]
print('Training data shape: ', train.shape)
print('Test data shape: ', test.shape)
```
```output
Training data shape: (1416, 1)
Test data shape: (48, 1)
```
2. ട്രെയിനിംഗ് ഡാറ്റ 0 മുതൽ 1 വരെയുള്ള പരിധിയിലാക്കുക: [^2]
```python
scaler = MinMaxScaler()
train['load'] = scaler.fit_transform(train)
```
4. ഇപ്പോൾ, ടെസ്റ്റിംഗ് ഡാറ്റ സ്കെയിൽ ചെയ്യുക: [^2]
```python
test['load'] = scaler.transform(test)
```
### ടൈം-സ്റ്റെപ്പുകളുള്ള ഡാറ്റ സൃഷ്ടിക്കുക [^1]
SVR-ക്കായി, ഇൻപുട്ട് ഡാറ്റ `[batch, timesteps]` എന്ന രൂപത്തിലാക്കണം. അതിനാൽ നിലവിലുള്ള `train_data`യും `test_data`യും പുനരാകൃതമാക്കുന്നു, പുതിയ ഒരു ഡൈമെൻഷൻ ടൈംസ്റ്റെപ്പുകളെ സൂചിപ്പിക്കുന്നു.
```python
# നംപൈ അറേകളിലേക്ക് മാറ്റുന്നു
train_data = train.values
test_data = test.values
```
ഈ ഉദാഹരണത്തിൽ, `timesteps = 5` എടുത്തിരിക്കുന്നു. അതായത്, മോഡലിന് നൽകുന്ന ഇൻപുട്ടുകൾ ആദ്യ 4 ടൈംസ്റ്റെപ്പുകളിലെ ഡാറ്റയാണ്, ഔട്ട്പുട്ട് 5-ആം ടൈംസ്റ്റെപ്പിലെ ഡാറ്റ ആയിരിക്കും.
```python
timesteps=5
```
നസ്റ്റ് ചെയ്ത ലിസ്റ്റ് കോംപ്രഹെൻഷൻ ഉപയോഗിച്ച് ട്രെയിനിംഗ് ഡാറ്റ 2D ടെൻസറിലേക്ക് മാറ്റുന്നു:
```python
train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0]
train_data_timesteps.shape
```
```output
(1412, 5)
```
ടെസ്റ്റിംഗ് ഡാറ്റ 2D ടെൻസറിലേക്ക് മാറ്റുന്നു:
```python
test_data_timesteps=np.array([[j for j in test_data[i:i+timesteps]] for i in range(0,len(test_data)-timesteps+1)])[:,:,0]
test_data_timesteps.shape
```
```output
(44, 5)
```
ട്രെയിനിംഗ്, ടെസ്റ്റിംഗ് ഡാറ്റയിൽ നിന്ന് ഇൻപുട്ടുകളും ഔട്ട്പുട്ടുകളും തിരഞ്ഞെടുക്കുന്നു:
```python
x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]]
x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]]
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
```
```output
(1412, 4) (1412, 1)
(44, 4) (44, 1)
```
### SVR നടപ്പിലാക്കുക [^1]
ഇപ്പോൾ, SVR നടപ്പിലാക്കാനുള്ള സമയം. ഈ നടപ്പിലാക്കലിനെക്കുറിച്ച് കൂടുതൽ വായിക്കാൻ, [ഈ ഡോക്യുമെന്റേഷൻ](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html) കാണാം. നമ്മുടെ നടപ്പിലാക്കലിനായി, താഴെ പറയുന്ന ഘട്ടങ്ങൾ പിന്തുടരുന്നു:
1. `SVR()` വിളിച്ച് മോഡൽ നിർവചിക്കുക, മോഡൽ ഹൈപ്പർപാരാമീറ്ററുകൾ kernel, gamma, c, epsilon നൽകുക
2. `fit()` ഫംഗ്ഷൻ വിളിച്ച് മോഡൽ ട്രെയിനിംഗ് ഡാറ്റയ്ക്ക് തയ്യാറാക്കുക
3. `predict()` ഫംഗ്ഷൻ വിളിച്ച് പ്രവചനങ്ങൾ നടത്തുക
ഇപ്പോൾ SVR മോഡൽ സൃഷ്ടിക്കുന്നു. ഇവിടെ [RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) ഉപയോഗിക്കുന്നു, ഹൈപ്പർപാരാമീറ്ററുകൾ gamma, C, epsilon യഥാക്രമം 0.5, 10, 0.05 ആയി സജ്ജീകരിക്കുന്നു.
```python
model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05)
```
#### ട്രെയിനിംഗ് ഡാറ്റയിൽ മോഡൽ ഫിറ്റ് ചെയ്യുക [^1]
```python
model.fit(x_train, y_train[:,0])
```
```output
SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5,
kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
```
#### മോഡൽ പ്രവചനങ്ങൾ നടത്തുക [^1]
```python
y_train_pred = model.predict(x_train).reshape(-1,1)
y_test_pred = model.predict(x_test).reshape(-1,1)
print(y_train_pred.shape, y_test_pred.shape)
```
```output
(1412, 1) (44, 1)
```
നിങ്ങൾ SVR നിർമ്മിച്ചു! ഇപ്പോൾ അതിന്റെ മൂല്യനിർണയം നടത്താം.
### നിങ്ങളുടെ മോഡൽ വിലയിരുത്തുക [^1]
വിലയിരുത്തലിനായി, ആദ്യം ഡാറ്റയെ അതിന്റെ ഒറിജിനൽ സ്കെയിലിലേക്ക് തിരികെ സ്കെയിൽ ചെയ്യാം. തുടർന്ന് പ്രകടനം പരിശോധിക്കാൻ, ഒറിജിനൽ, പ്രവചിച്ച ടൈം സീരീസ് പ്ലോട്ട് ചെയ്യുകയും MAPE ഫലം പ്രിന്റ് ചെയ്യുകയും ചെയ്യും.
പ്രവചിച്ചും ഒറിജിനൽ ഔട്ട്പുട്ടും സ്കെയിൽ ചെയ്യുക:
```python
# പ്രവചനങ്ങൾ സ്കെയിൽ ചെയ്യുന്നു
y_train_pred = scaler.inverse_transform(y_train_pred)
y_test_pred = scaler.inverse_transform(y_test_pred)
print(len(y_train_pred), len(y_test_pred))
```
```python
# യഥാർത്ഥ മൂല്യങ്ങളെ സ്കെയിൽ ചെയ്യുന്നു
y_train = scaler.inverse_transform(y_train)
y_test = scaler.inverse_transform(y_test)
print(len(y_train), len(y_test))
```
#### ട്രെയിനിംഗ്, ടെസ്റ്റിംഗ് ഡാറ്റയിൽ മോഡൽ പ്രകടനം പരിശോധിക്കുക [^1]
ഡാറ്റാസെറ്റിൽ നിന്നുള്ള ടൈംസ്റ്റാമ്പുകൾ എടുക്കുന്നു, പ്ലോട്ടിന്റെ x-അക്സിസിൽ കാണിക്കാൻ. ആദ്യ ```timesteps-1``` മൂല്യങ്ങൾ ആദ്യ ഔട്ട്പുട്ടിന് ഇൻപുട്ടായി ഉപയോഗിക്കുന്നതിനാൽ, ഔട്ട്പുട്ടിന്റെ ടൈംസ്റ്റാമ്പുകൾ അതിന് ശേഷം തുടങ്ങും.
```python
train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:]
test_timestamps = energy[test_start_dt:].index[timesteps-1:]
print(len(train_timestamps), len(test_timestamps))
```
```output
1412 44
```
ട്രെയിനിംഗ് ഡാറ്റയുടെ പ്രവചനങ്ങൾ പ്ലോട്ട് ചെയ്യുക:
```python
plt.figure(figsize=(25,6))
plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.title("Training data prediction")
plt.show()
```
![training data prediction](../../../../translated_images/train-data-predict.3c4ef4e78553104ffdd53d47a4c06414007947ea328e9261ddf48d3eafdefbbf.ml.png)
ട്രെയിനിംഗ് ഡാറ്റയ്ക്ക് MAPE പ്രിന്റ് ചെയ്യുക
```python
print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')
```
```output
MAPE for training data: 1.7195710200875551 %
```
ടെസ്റ്റിംഗ് ഡാറ്റയുടെ പ്രവചനങ്ങൾ പ്ലോട്ട് ചെയ്യുക
```python
plt.figure(figsize=(10,3))
plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.show()
```
![testing data prediction](../../../../translated_images/test-data-predict.8afc47ee7e52874f514ebdda4a798647e9ecf44a97cc927c535246fcf7a28aa9.ml.png)
ടെസ്റ്റിംഗ് ഡാറ്റയ്ക്ക് MAPE പ്രിന്റ് ചെയ്യുക
```python
print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')
```
```output
MAPE for testing data: 1.2623790187854018 %
```
🏆 ടെസ്റ്റിംഗ് ഡാറ്റാസെറ്റിൽ നിങ്ങൾക്ക് വളരെ നല്ല ഫലം ലഭിച്ചു!
### മുഴുവൻ ഡാറ്റാസെറ്റിൽ മോഡൽ പ്രകടനം പരിശോധിക്കുക [^1]
```python
# ലോഡ് മൂല്യങ്ങൾ numpy അറേ ആയി എടുക്കുന്നു
data = energy.copy().values
# സ്കെയിലിംഗ്
data = scaler.transform(data)
# മോഡൽ ഇൻപുട്ട് ആവശ്യകത അനുസരിച്ച് 2D ടെൻസറായി മാറ്റുന്നു
data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0]
print("Tensor shape: ", data_timesteps.shape)
# ഡാറ്റയിൽ നിന്ന് ഇൻപുട്ടുകളും ഔട്ട്പുട്ടുകളും തിരഞ്ഞെടുക്കുന്നു
X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]]
print("X shape: ", X.shape,"\nY shape: ", Y.shape)
```
```output
Tensor shape: (26300, 5)
X shape: (26300, 4)
Y shape: (26300, 1)
```
```python
# മോഡൽ പ്രവചനങ്ങൾ നടത്തുക
Y_pred = model.predict(X).reshape(-1,1)
# വിപരീത സ്കെയിൽ ചെയ്ത് പുനരാകൃതി നൽകുക
Y_pred = scaler.inverse_transform(Y_pred)
Y = scaler.inverse_transform(Y)
```
```python
plt.figure(figsize=(30,8))
plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(Y_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.show()
```
![full data prediction](../../../../translated_images/full-data-predict.4f0fed16a131c8f3bcc57a3060039dc7f2f714a05b07b68c513e0fe7fb3d8964.ml.png)
```python
print('MAPE: ', mape(Y_pred, Y)*100, '%')
```
```output
MAPE: 2.0572089029888656 %
```
🏆 വളരെ നല്ല പ്ലോട്ടുകൾ, നല്ല കൃത്യതയുള്ള മോഡൽ കാണിക്കുന്നു. അഭിനന്ദനങ്ങൾ!
---
## 🚀ചലഞ്ച്
- മോഡൽ സൃഷ്ടിക്കുമ്പോൾ ഹൈപ്പർപാരാമീറ്ററുകൾ (gamma, C, epsilon) മാറ്റി പരീക്ഷിച്ച് ടെസ്റ്റിംഗ് ഡാറ്റയിൽ ഏറ്റവും നല്ല ഫലം നൽകുന്ന ഹൈപ്പർപാരാമീറ്ററുകളുടെ സെറ്റ് കണ്ടെത്തുക. ഈ ഹൈപ്പർപാരാമീറ്ററുകളെക്കുറിച്ച് കൂടുതൽ അറിയാൻ [ഈ ഡോക്യുമെന്റ്](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) കാണുക.
- മോഡലിനായി വ്യത്യസ്ത kernel ഫംഗ്ഷനുകൾ ഉപയോഗിച്ച് പരീക്ഷിച്ച് ഡാറ്റാസെറ്റിൽ അവയുടെ പ്രകടനം വിശകലനം ചെയ്യുക. സഹായകമായ ഒരു ഡോക്യുമെന്റ് [ഇവിടെ](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) ലഭ്യമാണ്.
- പ്രവചനത്തിനായി തിരിഞ്ഞ് നോക്കാൻ മോഡലിന് `timesteps`-ന്റെ വ്യത്യസ്ത മൂല്യങ്ങൾ ഉപയോഗിച്ച് പരീക്ഷിക്കുക.
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
ഈ പാഠം ടൈം സീരീസ് പ്രവചനത്തിനായി SVR-ന്റെ പ്രയോഗം പരിചയപ്പെടുത്തുകയാണ്. SVR-നെക്കുറിച്ച് കൂടുതൽ വായിക്കാൻ, [ഈ ബ്ലോഗ്](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/) കാണാം. ഈ [scikit-learn ഡോക്യുമെന്റേഷൻ](https://scikit-learn.org/stable/modules/svm.html) സാധാരണയായി SVM-കളെക്കുറിച്ച്, [SVR-കളെക്കുറിച്ച്](https://scikit-learn.org/stable/modules/svm.html#regression) കൂടാതെ ഉപയോഗിക്കാവുന്ന വ്യത്യസ്ത [kernel ഫംഗ്ഷനുകൾ](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) എന്നിവയും വിശദമായി വിശദീകരിക്കുന്നു.
## അസൈൻമെന്റ്
[ഒരു പുതിയ SVR മോഡൽ](assignment.md)
## ക്രെഡിറ്റുകൾ
[^1]: ഈ വിഭാഗത്തിലെ എഴുത്ത്, കോഡ്, ഔട്ട്പുട്ട് [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD) നൽകിയതാണ്
[^2]: ഈ വിഭാഗത്തിലെ എഴുത്ത്, കോഡ്, ഔട്ട്പുട്ട് [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) നിന്നെടുത്തതാണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ പ്രാമാണികമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,31 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "94aa2fc6154252ae30a3f3740299707a",
"translation_date": "2025-12-19T16:01:23+00:00",
"source_file": "7-TimeSeries/3-SVR/assignment.md",
"language_code": "ml"
}
-->
# ഒരു പുതിയ SVR മോഡൽ
## നിർദ്ദേശങ്ങൾ [^1]
നിങ്ങൾക്ക് SVR മോഡൽ നിർമ്മിച്ചിട്ടുണ്ടെങ്കിൽ, പുതിയ ഡാറ്റ ഉപയോഗിച്ച് ഒരു പുതിയ മോഡൽ നിർമ്മിക്കുക (Duke-യിലെ [ഈ ഡാറ്റാസെറ്റുകളിൽ ഒന്നിനെ പരീക്ഷിക്കുക](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). നിങ്ങളുടെ പ്രവർത്തനം ഒരു നോട്ട്‌ബുക്കിൽ രേഖപ്പെടുത്തുക, ഡാറ്റയും നിങ്ങളുടെ മോഡലും ദൃശ്യവൽക്കരിക്കുക, അനുയോജ്യമായ പ്ലോട്ടുകളും MAPE ഉപയോഗിച്ച് അതിന്റെ കൃത്യത പരിശോധിക്കുക. വ്യത്യസ്ത ഹൈപ്പർപാരാമീറ്ററുകളും ടൈംസ്റ്റെപ്പുകളുടെ വ്യത്യസ്ത മൂല്യങ്ങളും പരീക്ഷിക്കുക.
## റൂബ്രിക് [^1]
| മാനദണ്ഡം | ഉദാഹരണാർത്ഥം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | ------------------------------------------------------------ | --------------------------------------------------------- | ----------------------------------- |
| | SVR മോഡൽ നിർമ്മിച്ച്, പരീക്ഷിച്ച്, ദൃശ്യവൽക്കരണങ്ങളോടുകൂടി വിശദീകരിച്ച ഒരു നോട്ട്‌ബുക്ക് സമർപ്പിച്ചിരിക്കുന്നു, കൃത്യത വ്യക്തമാക്കിയിരിക്കുന്നു. | സമർപ്പിച്ച നോട്ട്‌ബുക്ക് രേഖപ്പെടുത്തപ്പെട്ടിട്ടില്ല അല്ലെങ്കിൽ ബഗുകൾ അടങ്ങിയിരിക്കുന്നു. | അപൂർണ്ണമായ ഒരു നോട്ട്‌ബുക്ക് സമർപ്പിച്ചിരിക്കുന്നു |
[^1]: ഈ വിഭാഗത്തിലെ വാചകം [ARIMA-യിൽ നിന്നുള്ള അസൈൻമെന്റിൽ നിന്നാണ്](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md) അടിസ്ഥാനമാക്കിയിരിക്കുന്നത്.
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ വ്യാഖ്യാനക്കേടുകൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

File diff suppressed because one or more lines are too long

@ -0,0 +1,711 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "fv9OoQsMFk5A"
},
"source": [
"# സപ്പോർട്ട് വെക്ടർ റിഗ്രസർ ഉപയോഗിച്ച് ടൈം സീരീസ് പ്രവചനം\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ഈ നോട്ട്‌ബുക്കിൽ, ഞങ്ങൾ താഴെ പറയുന്നവ കാണിക്കുന്നു:\n",
"\n",
"- SVM റെഗ്രസർ മോഡലിനായി 2D ടൈം സീരീസ് ഡാറ്റ പരിശീലനത്തിന് തയ്യാറാക്കുക\n",
"- RBF കർണൽ ഉപയോഗിച്ച് SVR നടപ്പിലാക്കുക\n",
"- പ്ലോട്ടുകളും MAPE ഉപയോഗിച്ച് മോഡൽ വിലയിരുത്തുക\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## മോഡ്യൂളുകൾ ഇറക്കുമതി ചെയ്യൽ\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"sys.path.append('../../')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "M687KNlQFp0-"
},
"outputs": [],
"source": [
"import os\n",
"import warnings\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import datetime as dt\n",
"import math\n",
"\n",
"from sklearn.svm import SVR\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"from common.utils import load_data, mape"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Cj-kfVdMGjWP"
},
"source": [
"## ഡാറ്റ തയ്യാറാക്കൽ\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8fywSjC6GsRz"
},
"source": [
"### ഡാറ്റ ലോഡ് ചെയ്യുക\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 363
},
"id": "aBDkEB11Fumg",
"outputId": "99cf7987-0509-4b73-8cc2-75d7da0d2740"
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>load</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2012-01-01 00:00:00</th>\n",
" <td>2698.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 01:00:00</th>\n",
" <td>2558.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 02:00:00</th>\n",
" <td>2444.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 03:00:00</th>\n",
" <td>2402.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-01 04:00:00</th>\n",
" <td>2403.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" load\n",
"2012-01-01 00:00:00 2698.0\n",
"2012-01-01 01:00:00 2558.0\n",
"2012-01-01 02:00:00 2444.0\n",
"2012-01-01 03:00:00 2402.0\n",
"2012-01-01 04:00:00 2403.0"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"energy = load_data('../../data')[['load']]\n",
"energy.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "O0BWP13rGnh4"
},
"source": [
"### ഡാറ്റ പ്ലോട്ട് ചെയ്യുക\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 486
},
"id": "hGaNPKu_Gidk",
"outputId": "7f89b326-9057-4f49-efbe-cb100ebdf76d"
},
"outputs": [],
"source": [
"energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)\n",
"plt.xlabel('timestamp', fontsize=12)\n",
"plt.ylabel('load', fontsize=12)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IPuNor4eGwYY"
},
"source": [
"### പരിശീലനവും പരിശോധനാ ഡാറ്റയും സൃഷ്ടിക്കുക\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ysvsNyONGt0Q"
},
"outputs": [],
"source": [
"train_start_dt = '2014-11-01 00:00:00'\n",
"test_start_dt = '2014-12-30 00:00:00'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 548
},
"id": "SsfdLoPyGy9w",
"outputId": "d6d6c25b-b1f4-47e5-91d1-707e043237d7"
},
"outputs": [],
"source": [
"energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \\\n",
" .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \\\n",
" .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)\n",
"plt.xlabel('timestamp', fontsize=12)\n",
"plt.ylabel('load', fontsize=12)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XbFTqBw6G1Ch"
},
"source": [
"### പരിശീലനത്തിനായി ഡാറ്റ തയ്യാറാക്കൽ\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ഇപ്പോൾ, നിങ്ങളുടെ ഡാറ്റ ഫിൽട്ടറിംഗ് ചെയ്യുകയും സ്കെയിലിംഗ് ചെയ്യുകയും ചെയ്ത് പരിശീലനത്തിനായി തയ്യാറാക്കേണ്ടതാണ്.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "cYivRdQpHDj3",
"outputId": "a138f746-461c-4fd6-bfa6-0cee094c4aa1"
},
"outputs": [],
"source": [
"train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]\n",
"test = energy.copy()[energy.index >= test_start_dt][['load']]\n",
"\n",
"print('Training data shape: ', train.shape)\n",
"print('Test data shape: ', test.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ഡാറ്റയെ (0, 1) പരിധിയിലാക്കുക.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 363
},
"id": "3DNntGQnZX8G",
"outputId": "210046bc-7a66-4ccd-d70d-aa4a7309949c"
},
"outputs": [],
"source": [
"scaler = MinMaxScaler()\n",
"train['load'] = scaler.fit_transform(train)\n",
"train.head(5)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "26Yht-rzZexe",
"outputId": "20326077-a38a-4e78-cc5b-6fd7af95d301"
},
"outputs": [],
"source": [
"test['load'] = scaler.transform(test)\n",
"test.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "x0n6jqxOQ41Z"
},
"source": [
"### സമയ ഘട്ടങ്ങളോടെ ഡാറ്റ സൃഷ്ടിക്കൽ\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fdmxTZtOQ8xs"
},
"source": [
"നമ്മുടെ SVR-ക്കായി, ഇൻപുട്ട് ഡാറ്റയെ `[batch, timesteps]` എന്ന രൂപത്തിലാക്കുന്നു. അതിനാൽ, നിലവിലുള്ള `train_data`യും `test_data`യും പുനരൂപപ്പെടുത്തുന്നു, അതിലൂടെ ഒരു പുതിയ ഡൈമെൻഷൻ timesteps-നെ സൂചിപ്പിക്കും. നമ്മുടെ ഉദാഹരണത്തിന്, `timesteps = 5` എടുക്കുന്നു. അതിനാൽ, മോഡലിന് നൽകുന്ന ഇൻപുട്ടുകൾ ആദ്യ 4 timesteps-ലെ ഡാറ്റയാണ്, ഔട്ട്പുട്ട് 5<sup>ആം</sup> timestep-ലെ ഡാറ്റ ആയിരിക്കും.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Rpju-Sc2HFm0"
},
"outputs": [],
"source": [
"# Converting to numpy arrays\n",
"\n",
"train_data = train.values\n",
"test_data = test.values"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Selecting the timesteps\n",
"\n",
"timesteps=None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "O-JrsrsVJhUQ",
"outputId": "c90dbe71-bacc-4ec4-b452-f82fe5aefaef"
},
"outputs": [],
"source": [
"# Converting data to 2D tensor\n",
"\n",
"train_data_timesteps=None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "exJD8AI7KE4g",
"outputId": "ce90260c-f327-427d-80f2-77307b5a6318"
},
"outputs": [],
"source": [
"# Converting test data to 2D tensor\n",
"\n",
"test_data_timesteps=None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "2u0R2sIsLuq5"
},
"outputs": [],
"source": [
"x_train, y_train = None\n",
"x_test, y_test = None\n",
"\n",
"print(x_train.shape, y_train.shape)\n",
"print(x_test.shape, y_test.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8wIPOtAGLZlh"
},
"source": [
"## SVR മോഡൽ സൃഷ്ടിക്കൽ\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "EhA403BEPEiD"
},
"outputs": [],
"source": [
"# Create model using RBF kernel\n",
"\n",
"model = None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GS0UA3csMbqp",
"outputId": "d86b6f05-5742-4c1d-c2db-c40510bd4f0d"
},
"outputs": [],
"source": [
"# Fit model on training data"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Rz_x8S3UrlcF"
},
"source": [
"### മോഡൽ പ്രവചനം നടത്തുക\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "XR0gnt3MnuYS",
"outputId": "157e40ab-9a23-4b66-a885-0d52a24b2364"
},
"outputs": [],
"source": [
"# Making predictions\n",
"\n",
"y_train_pred = None\n",
"y_test_pred = None"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_2epncg-SGzr"
},
"source": [
"## മോഡൽ പ്രകടനം വിശകലനം ചെയ്യൽ\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Scaling the predictions\n",
"\n",
"y_train_pred = scaler.inverse_transform(y_train_pred)\n",
"y_test_pred = scaler.inverse_transform(y_test_pred)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "xmm_YLXhq7gV",
"outputId": "18392f64-4029-49ac-c71a-a4e2411152a1"
},
"outputs": [],
"source": [
"# Scaling the original values\n",
"\n",
"y_train = scaler.inverse_transform(y_train)\n",
"y_test = scaler.inverse_transform(y_test)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "u3LBj93coHEi",
"outputId": "d4fd49e8-8c6e-4bb0-8ef9-ca0b26d725b4"
},
"outputs": [],
"source": [
"# Extract the timesteps for x-axis\n",
"\n",
"train_timestamps = None\n",
"test_timestamps = None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(25,6))\n",
"# plot original output\n",
"# plot predicted output\n",
"plt.legend(['Actual','Predicted'])\n",
"plt.xlabel('Timestamp')\n",
"plt.title(\"Training data prediction\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "LnhzcnYtXHCm",
"outputId": "f5f0d711-f18b-4788-ad21-d4470ea2c02b"
},
"outputs": [],
"source": [
"print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 225
},
"id": "53Q02FoqQH4V",
"outputId": "53e2d59b-5075-4765-ad9e-aed56c966583"
},
"outputs": [],
"source": [
"plt.figure(figsize=(10,3))\n",
"# plot original output\n",
"# plot predicted output\n",
"plt.legend(['Actual','Predicted'])\n",
"plt.xlabel('Timestamp')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "clOAUH-SXCJG",
"outputId": "a3aa85ff-126a-4a4a-cd9e-90b9cc465ef5"
},
"outputs": [],
"source": [
"print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DHlKvVCId5ue"
},
"source": [
"## പൂർണ്ണ ഡാറ്റാസെറ്റ് പ്രവചനം\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "cOFJ45vreO0N",
"outputId": "35628e33-ecf9-4966-8036-f7ea86db6f16"
},
"outputs": [],
"source": [
"# Extracting load values as numpy array\n",
"data = None\n",
"\n",
"# Scaling\n",
"data = None\n",
"\n",
"# Transforming to 2D tensor as per model input requirement\n",
"data_timesteps=None\n",
"\n",
"# Selecting inputs and outputs from data\n",
"X, Y = None, None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ESSAdQgwexIi"
},
"outputs": [],
"source": [
"# Make model predictions\n",
"\n",
"# Inverse scale and reshape\n",
"Y_pred = None\n",
"Y = None"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 328
},
"id": "M_qhihN0RVVX",
"outputId": "a89cb23e-1d35-437f-9d63-8b8907e12f80"
},
"outputs": [],
"source": [
"plt.figure(figsize=(30,8))\n",
"# plot original output\n",
"# plot predicted output\n",
"plt.legend(['Actual','Predicted'])\n",
"plt.xlabel('Timestamp')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "AcN7pMYXVGTK",
"outputId": "7e1c2161-47ce-496c-9d86-7ad9ae0df770"
},
"outputs": [],
"source": [
"print('MAPE: ', mape(Y_pred, Y)*100, '%')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാ**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"collapsed_sections": [],
"name": "Recurrent_Neural_Networks.ipynb",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.1"
},
"coopTranslator": {
"original_hash": "e86ce102239a14c44585623b9b924a74",
"translation_date": "2025-12-19T17:34:05+00:00",
"source_file": "7-TimeSeries/3-SVR/working/notebook.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 1
}

@ -0,0 +1,39 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "61342603bad8acadbc6b2e4e3aab3f66",
"translation_date": "2025-12-19T13:11:29+00:00",
"source_file": "7-TimeSeries/README.md",
"language_code": "ml"
}
-->
# ടൈം സീരീസ് ഫോറ്കാസ്റ്റിങ്ങിലേക്ക് പരിചയം
ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗ് എന്താണ്? ഇത് കഴിഞ്ഞ കാലത്തെ പ്രവണതകൾ വിശകലനം ചെയ്ത് ഭാവിയിലെ സംഭവങ്ങൾ പ്രവചിക്കുന്നതിനെക്കുറിച്ചാണ്.
## പ്രാദേശിക വിഷയം: ലോകമാകെയുള്ള വൈദ്യുതി ഉപയോഗം ✨
ഈ രണ്ട് പാഠങ്ങളിൽ, നിങ്ങൾ ടൈം സീരീസ് ഫോറ്കാസ്റ്റിങ്ങുമായി പരിചയപ്പെടും, മെഷീൻ ലേണിങ്ങിന്റെ കുറച്ച് കുറവായി അറിയപ്പെടുന്ന ഒരു മേഖല, എന്നാൽ വ്യവസായത്തിനും ബിസിനസ്സ് പ്രയോഗങ്ങൾക്കും മറ്റ് മേഖലകൾക്കും അത്യന്തം മൂല്യമുള്ളതാണ്. ന്യൂറൽ നെറ്റ്വർക്കുകൾ ഈ മോഡലുകളുടെ പ്രയോജനം വർദ്ധിപ്പിക്കാൻ ഉപയോഗിക്കാവുന്നതായിരുന്നാലും, നാം ക്ലാസിക്കൽ മെഷീൻ ലേണിങ്ങിന്റെ പശ്ചാത്തലത്തിൽ അവയെ പഠിക്കും, കാരണം മോഡലുകൾ കഴിഞ്ഞ കാലത്തെ അടിസ്ഥാനമാക്കി ഭാവിയിലെ പ്രകടനം പ്രവചിക്കാൻ സഹായിക്കുന്നു.
നമ്മുടെ പ്രാദേശിക ശ്രദ്ധ ലോകത്തിലെ വൈദ്യുതി ഉപയോഗത്തിലാണ്, കഴിഞ്ഞ ലോഡിന്റെ മാതൃകകളുടെ അടിസ്ഥാനത്തിൽ ഭാവിയിലെ വൈദ്യുതി ഉപയോഗം ഫോറ്കാസ്റ്റ് ചെയ്യുന്നതിനെക്കുറിച്ച് പഠിക്കാൻ ഒരു രസകരമായ ഡാറ്റാസെറ്റ്. ഈ തരത്തിലുള്ള ഫോറ്കാസ്റ്റിംഗ് ബിസിനസ്സ് പരിസരത്തിൽ എത്രത്തോളം സഹായകരമാകാമെന്ന് നിങ്ങൾ കാണാം.
![electric grid](../../../translated_images/electric-grid.0c21d5214db09ffae93c06a87ca2abbb9ba7475ef815129c5b423d7f9a7cf136.ml.jpg)
രാജസ്ഥാനിലെ ഒരു റോഡിൽ വൈദ്യുതി ടവറുകളുടെ ചിത്രം [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) എന്നവന്റെ ഫോട്ടോ, [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) ൽ നിന്നാണ്.
## പാഠങ്ങൾ
1. [ടൈം സീരീസ് ഫോറ്കാസ്റ്റിങ്ങിലേക്ക് പരിചയം](1-Introduction/README.md)
2. [ARIMA ടൈം സീരീസ് മോഡലുകൾ നിർമ്മിക്കൽ](2-ARIMA/README.md)
3. [ടൈം സീരീസ് ഫോറ്കാസ്റ്റിങ്ങിനായി Support Vector Regressor നിർമ്മിക്കൽ](3-SVR/README.md)
## ക്രെഡിറ്റുകൾ
"ടൈം സീരീസ് ഫോറ്കാസ്റ്റിങ്ങിലേക്ക് പരിചയം" ⚡️ ഉപയോഗിച്ച് എഴുതിയത് [Francesca Lazzeri](https://twitter.com/frlazzeri) ഉം [Jen Looper](https://twitter.com/jenlooper) ഉം ആണ്. നോട്ട്‌ബുക്കുകൾ ആദ്യം ഓൺലൈനിൽ പ്രത്യക്ഷപ്പെട്ടത് [Azure "Deep Learning For Time Series" repo](https://github.com/Azure/DeepLearningForTimeSeriesForecasting) യിൽ ആണ്, ഇത് ആദ്യം എഴുതിയത് Francesca Lazzeri ആണ്. SVR പാഠം എഴുതിയത് [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD) ആണ്.
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,336 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "911efd5e595089000cb3c16fce1beab8",
"translation_date": "2025-12-19T15:47:44+00:00",
"source_file": "8-Reinforcement/1-QLearning/README.md",
"language_code": "ml"
}
-->
# റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗിനും ക്യൂ-ലേണിംഗിനും പരിചയം
![മെഷീൻ ലേണിംഗിലെ റീഇൻഫോഴ്‌സ്‌മെന്റിന്റെ സംഗ്രഹം ഒരു സ്കെച്ച്നോട്ടിൽ](../../../../translated_images/ml-reinforcement.94024374d63348dbb3571c343ca7ddabef72adac0b8086d47164b769ba3a8a1d.ml.png)
> സ്കെച്ച്നോട്ട് [Tomomi Imura](https://www.twitter.com/girlie_mac) tarafından
റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ് മൂന്ന് പ്രധാന ആശയങ്ങൾ ഉൾക്കൊള്ളുന്നു: ഏജന്റ്, ചില സ്റ്റേറ്റുകൾ, ഓരോ സ്റ്റേറ്റിനും ഒരു ക്രമീകരിച്ച പ്രവർത്തനസമൂഹം. ഒരു നിശ്ചിത സ്റ്റേറ്റിൽ ഒരു പ്രവർത്തനം നടപ്പിലാക്കുമ്പോൾ, ഏജന്റിന് ഒരു റിവാർഡ് ലഭിക്കും. വീണ്ടും കമ്പ്യൂട്ടർ ഗെയിം സൂപ്പർ മാരിയോയെ കണക്കിലെടുക്കുക. നിങ്ങൾ മാരിയോയാണ്, നിങ്ങൾ ഒരു ഗെയിം ലെവലിൽ, ഒരു കുന്നിന്റെ അരികിൽ നിൽക്കുന്നു. നിങ്ങളുടെ മുകളിൽ ഒരു നാണയം ഉണ്ട്. നിങ്ങൾ മാരിയോ ആയതിനാൽ, ഒരു ഗെയിം ലെവലിൽ, ഒരു പ്രത്യേക സ്ഥാനത്ത് ... അത് നിങ്ങളുടെ സ്റ്റേറ്റ് ആണ്. വലത്തേക്ക് ഒരു പടി നീങ്ങുന്നത് (ഒരു പ്രവർത്തനം) നിങ്ങളെ അരികിൽ കൊണ്ടുപോകും, അത് കുറഞ്ഞ സംഖ്യാത്മക സ്കോർ നൽകും. എന്നാൽ, ജമ്പ് ബട്ടൺ അമർത്തുന്നത് നിങ്ങൾക്ക് ഒരു പോയിന്റ് നേടാൻ അനുവദിക്കും, നിങ്ങൾ ജീവിച്ചിരിക്കും. അത് ഒരു പോസിറ്റീവ് ഫലം ആണ്, അതിനാൽ നിങ്ങൾക്ക് പോസിറ്റീവ് സംഖ്യാത്മക സ്കോർ ലഭിക്കണം.
റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ് ഉപയോഗിച്ച് ഒരു സിമുലേറ്റർ (ഗെയിം) ഉപയോഗിച്ച്, നിങ്ങൾ ഗെയിം കളിക്കാൻ പഠിച്ച് റിവാർഡ് പരമാവധി നേടാൻ കഴിയും, അതായത് ജീവിച്ചിരിക്കുക, കൂടുതൽ പോയിന്റുകൾ നേടുക.
[![റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗിലേക്ക് പരിചയം](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo)
> 🎥 മുകളിൽ ചിത്രത്തിൽ ക്ലിക്ക് ചെയ്ത് ഡ്മിത്രി റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ് ചർച്ച ചെയ്യുന്നത് കേൾക്കുക
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## മുൻ‌പരിചയങ്ങളും സജ്ജീകരണവും
ഈ പാഠത്തിൽ, നാം പൈത്തൺ കോഡിൽ ചില പരീക്ഷണങ്ങൾ നടത്തും. നിങ്ങൾക്ക് ഈ പാഠത്തിലെ Jupyter Notebook കോഡ് നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അല്ലെങ്കിൽ ക്ലൗഡിൽ എവിടെയെങ്കിലും ഓടിക്കാൻ കഴിയണം.
നിങ്ങൾക്ക് [പാഠ നോട്ട്‌ബുക്ക്](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) തുറന്ന് ഈ പാഠം പിന്തുടർന്ന് നിർമ്മിക്കാം.
> **കുറിപ്പ്:** നിങ്ങൾ ഈ കോഡ് ക്ലൗഡിൽ നിന്ന് തുറക്കുകയാണെങ്കിൽ, നോട്ട്‌ബുക്ക് കോഡിൽ ഉപയോഗിക്കുന്ന [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py) ഫയൽ കൂടി ഡൗൺലോഡ് ചെയ്ത് നോട്ട്‌ബുക്കിന്റെ സമാന ഡയറക്ടറിയിൽ ചേർക്കണം.
## പരിചയം
ഈ പാഠത്തിൽ, നാം **[പീറ്ററും വുൾഫും](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)** എന്ന ലോകം അന്വേഷിക്കും, റഷ്യൻ സംഗീതസംവിധായകൻ [സെർഗെയ് പ്രൊകോഫിയേവ്](https://en.wikipedia.org/wiki/Sergei_Prokofiev) രചിച്ച സംഗീതപരമായ ഒരു ഫെയറി ടെയിൽ പ്രചോദനമായി. നാം **റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ്** ഉപയോഗിച്ച് പീറ്റർ തന്റെ പരിസരം അന്വേഷിക്കുകയും, രുചികരമായ ആപ്പിളുകൾ ശേഖരിക്കുകയും, വുൾഫിനെ കാണാതിരിക്കുകയും ചെയ്യും.
**റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ്** (RL) ഒരു പഠന സാങ്കേതിക വിദ്യയാണ്, ഇത് ഏജന്റിന്റെ ഒരു **പരിസരത്തിൽ** ഏറ്റവും ഉത്തമമായ പെരുമാറ്റം പഠിക്കാൻ അനുമതിയുള്ളതാണ്, പല പരീക്ഷണങ്ങൾ നടത്തിക്കൊണ്ട്. ഈ പരിസരത്തിലെ ഏജന്റിന് ഒരു **ലക്ഷ്യം** ഉണ്ടാകണം, അത് ഒരു **റിവാർഡ് ഫംഗ്ഷൻ** വഴി നിർവചിക്കപ്പെടുന്നു.
## പരിസരം
സൗകര്യത്തിന്, പീറ്ററിന്റെ ലോകം `width` x `height` വലിപ്പമുള്ള ഒരു ചതുര്‍ ബോർഡ് ആണെന്ന് കരുതാം, ഇങ്ങനെ:
![പീറ്ററിന്റെ പരിസരം](../../../../translated_images/environment.40ba3cb66256c93fa7e92f6f7214e1d1f588aafa97d266c11d108c5c5d101b6c.ml.png)
ഈ ബോർഡിലെ ഓരോ സെല്ലും താഴെ പറയുന്നവയിൽ ഒന്നായിരിക്കും:
* **നിലം**, പീറ്ററും മറ്റ് ജീവികളും നടക്കാൻ കഴിയുന്ന സ്ഥലം.
* **വെള്ളം**, ഇവിടെ നിങ്ങൾ നടക്കാൻ കഴിയില്ല.
* **മരം** അല്ലെങ്കിൽ **പുല്ല്**, വിശ്രമിക്കാൻ കഴിയുന്ന സ്ഥലം.
* **ആപ്പിൾ**, പീറ്റർ കണ്ടെത്താൻ ആഗ്രഹിക്കുന്ന ഭക്ഷണം.
* **വുൾഫ്**, അപകടകരമായത്, ഒഴിവാക്കേണ്ടത്.
[`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py) എന്ന പ്രത്യേക പൈത്തൺ മോഡ്യൂൾ ഈ പരിസരവുമായി പ്രവർത്തിക്കാൻ ഉള്ള കോഡ് ഉൾക്കൊള്ളുന്നു. ഈ കോഡ് നമ്മുടെ ആശയങ്ങൾ മനസ്സിലാക്കാൻ അത്ര പ്രധാനമല്ല, അതിനാൽ നാം മോഡ്യൂൾ ഇറക്കുമതി ചെയ്ത് സാമ്പിൾ ബോർഡ് സൃഷ്ടിക്കാൻ ഉപയോഗിക്കും (കോഡ് ബ്ലോക്ക് 1):
```python
from rlboard import *
width, height = 8,8
m = Board(width,height)
m.randomize(seed=13)
m.plot()
```
ഈ കോഡ് മുകളിൽ കാണിച്ച പരിസരത്തിന്റെ ചിത്രം പ്രിന്റ് ചെയ്യണം.
## പ്രവർത്തനങ്ങളും നയവും
നമ്മുടെ ഉദാഹരണത്തിൽ, പീറ്ററിന്റെ ലക്ഷ്യം ആപ്പിൾ കണ്ടെത്തുക ആയിരിക്കും, വുൾഫ് ഉൾപ്പെടെയുള്ള തടസ്സങ്ങൾ ഒഴിവാക്കി. അതിനായി, അവൻ ആപ്പിൾ കണ്ടെത്തുന്നത് വരെ നടക്കാം.
അതിനാൽ, ഏതെങ്കിലും സ്ഥാനത്ത്, അവൻ താഴെ പറയുന്ന പ്രവർത്തനങ്ങളിൽ ഒന്നിനെ തിരഞ്ഞെടുക്കാം: മുകളിൽ, താഴെ, ഇടത്, വലത്.
നാം ആ പ്രവർത്തനങ്ങൾ ഒരു ഡിക്ഷണറിയായി നിർവചിച്ച്, അവയെ അനുയോജ്യമായ കോഓർഡിനേറ്റ് മാറ്റങ്ങളുമായി മാപ്പ് ചെയ്യാം. ഉദാഹരണത്തിന്, വലത്തേക്ക് നീങ്ങൽ (`R`) `(1,0)` എന്ന ജോഡിയുമായി പൊരുത്തപ്പെടും. (കോഡ് ബ്ലോക്ക് 2):
```python
actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) }
action_idx = { a : i for i,a in enumerate(actions.keys()) }
```
സംക്ഷേപിച്ച്, ഈ സീനാരിയോയുടെ തന്ത്രവും ലക്ഷ്യവും ഇപ്രകാരം ആണ്:
- **തന്ത്രം**, നമ്മുടെ ഏജന്റ് (പീറ്റർ) നിർവചിക്കുന്നത് ഒരു **നയം** (policy) എന്ന ഫംഗ്ഷൻ വഴി ആണ്. ഒരു നയം ഏതെങ്കിലും സ്റ്റേറ്റിൽ പ്രവർത്തനം തിരികെ നൽകുന്ന ഫംഗ്ഷനാണ്. നമ്മുടെ പ്രശ്നത്തിലെ സ്റ്റേറ്റ് ബോർഡും കളിക്കാരന്റെ നിലവിലെ സ്ഥാനവും ഉൾക്കൊള്ളുന്നു.
- **ലക്ഷ്യം**, റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗിന്റെ ലക്ഷ്യം നല്ല ഒരു നയം പഠിച്ച് പ്രശ്നം ഫലപ്രദമായി പരിഹരിക്കുക ആണ്. എന്നാൽ അടിസ്ഥാനമായി, ഏറ്റവും ലളിതമായ നയം **റാൻഡം വാക്ക്** എന്നതാണ്.
## റാൻഡം വാക്ക്
ആദ്യം നാം റാൻഡം വാക്ക് തന്ത്രം നടപ്പിലാക്കി പ്രശ്നം പരിഹരിക്കാം. റാൻഡം വാക്കിൽ, അനുവദിച്ച പ്രവർത്തനങ്ങളിൽ നിന്ന് അടുത്ത പ്രവർത്തനം യാദൃച്ഛികമായി തിരഞ്ഞെടുക്കും, ആപ്പിൾ കണ്ടെത്തുന്നത് വരെ (കോഡ് ബ്ലോക്ക് 3).
1. താഴെ കൊടുത്ത കോഡ് ഉപയോഗിച്ച് റാൻഡം വാക്ക് നടപ്പിലാക്കുക:
```python
def random_policy(m):
return random.choice(list(actions))
def walk(m,policy,start_position=None):
n = 0 # ചുവടുകളുടെ എണ്ണം
# പ്രാരംഭ സ്ഥാനം സജ്ജമാക്കുക
if start_position:
m.human = start_position
else:
m.random_start()
while True:
if m.at() == Board.Cell.apple:
return n # വിജയം!
if m.at() in [Board.Cell.wolf, Board.Cell.water]:
return -1 # വൃക്കയാൽ കഴിക്കപ്പെട്ടു അല്ലെങ്കിൽ മുങ്ങി
while True:
a = actions[policy(m)]
new_pos = m.move_pos(m.human,a)
if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water:
m.move(a) # യഥാർത്ഥ നീക്കം ചെയ്യുക
break
n+=1
walk(m,random_policy)
```
`walk` വിളിപ്പ് അനുയോജ്യമായ പാതയുടെ നീളം തിരികെ നൽകണം, അത് ഓരോ റൺ-ലും വ്യത്യാസപ്പെടാം.
1. വാക്ക് പരീക്ഷണം പല തവണ (ഉദാ: 100) ഓടിച്ച് ഫലമായ സ്ഥിതിവിവരക്കണക്കുകൾ പ്രിന്റ് ചെയ്യുക (കോഡ് ബ്ലോക്ക് 4):
```python
def print_statistics(policy):
s,w,n = 0,0,0
for _ in range(100):
z = walk(m,policy)
if z<0:
w+=1
else:
s += z
n += 1
print(f"Average path length = {s/n}, eaten by wolf: {w} times")
print_statistics(random_policy)
```
ഒരു പാതയുടെ ശരാശരി നീളം ഏകദേശം 30-40 പടികളാണ്, ഇത് വളരെ കൂടുതലാണ്, കാരണം അടുത്ത ആപ്പിള്‍ വരെ ശരാശരി ദൂരം ഏകദേശം 5-6 പടികളാണ്.
പീറ്ററിന്റെ ചലനം റാൻഡം വാക്ക് സമയത്ത് ഇങ്ങനെ കാണാം:
![പീറ്ററിന്റെ റാൻഡം വാക്ക്](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif)
## റിവാർഡ് ഫംഗ്ഷൻ
നമ്മുടെ നയം കൂടുതൽ ബുദ്ധിമുട്ടുള്ളതാക്കാൻ, ഏതെല്ലാ ചലനങ്ങൾ "മികച്ചതാണ്" എന്ന് മനസ്സിലാക്കണം. അതിനായി, നാം നമ്മുടെ ലക്ഷ്യം നിർവചിക്കണം.
ലക്ഷ്യം ഒരു **റിവാർഡ് ഫംഗ്ഷൻ** ആയി നിർവചിക്കാം, അത് ഓരോ സ്റ്റേറ്റിനും ഒരു സ്കോർ മൂല്യം നൽകും. സംഖ്യ കൂടുതലായാൽ റിവാർഡ് ഫംഗ്ഷൻ മികച്ചതാണ്. (കോഡ് ബ്ലോക്ക് 5)
```python
move_reward = -0.1
goal_reward = 10
end_reward = -10
def reward(m,pos=None):
pos = pos or m.human
if not m.is_valid(pos):
return end_reward
x = m.at(pos)
if x==Board.Cell.water or x == Board.Cell.wolf:
return end_reward
if x==Board.Cell.apple:
return goal_reward
return move_reward
```
റിവാർഡ് ഫംഗ്ഷനുകളുടെ ഒരു രസകരമായ കാര്യം, പലപ്പോഴും *നമുക്ക് ഗെയിം അവസാനത്തിൽ മാത്രമേ വലിയ റിവാർഡ് ലഭിക്കൂ* എന്നതാണ്. അതായത്, നമ്മുടെ ആൽഗോരിതം "നല്ല" പടികൾ ഓർമ്മിച്ച് അവയുടെ പ്രാധാന്യം വർദ്ധിപ്പിക്കണം. അതുപോലെ, മോശം ഫലങ്ങളിലേക്കുള്ള എല്ലാ ചലനങ്ങളും നിരുത്സാഹപ്പെടുത്തണം.
## ക്യൂ-ലേണിംഗ്
നാം ഇവിടെ ചർച്ച ചെയ്യാൻ പോകുന്ന ആൽഗോരിതം **ക്യൂ-ലേണിംഗ്** എന്നാണ്. ഈ ആൽഗോരിതത്തിൽ, നയം ഒരു ഫംഗ്ഷൻ (അഥവാ ഡാറ്റാ സ്ട്രക്ചർ) ആയ **ക്യൂ-ടേബിൾ** എന്നതിലൂടെ നിർവചിക്കപ്പെടുന്നു. ഇത് ഓരോ സ്റ്റേറ്റിലെയും പ്രവർത്തനങ്ങളുടെ "നല്ലത്വം" രേഖപ്പെടുത്തുന്നു.
ഇത് ക്യൂ-ടേബിൾ എന്ന് വിളിക്കുന്നത്, സാധാരണയായി ഒരു ടേബിൾ അല്ലെങ്കിൽ ബഹുമാനസമമായ അറേ ആയി പ്രതിനിധാനം ചെയ്യുന്നത് സൗകര്യമുള്ളതിനാൽ ആണ്. നമ്മുടെ ബോർഡിന് `width` x `height` അളവുകൾ ഉള്ളതിനാൽ, നാം ക്യൂ-ടേബിൾ numpy അറേ ആയി പ്രതിനിധാനം ചെയ്യാം, ആകൃതി `width` x `height` x `len(actions)`: (കോഡ് ബ്ലോക്ക് 6)
```python
Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)
```
നാം ക്യൂ-ടേബിളിലെ എല്ലാ മൂല്യങ്ങളും സമാനമായ മൂല്യത്തോടെ, നമ്മുടെ കേസിൽ 0.25, ആരംഭിക്കുന്നു. ഇത് "റാൻഡം വാക്ക്" നയത്തിന് പൊരുത്തപ്പെടുന്നു, കാരണം ഓരോ സ്റ്റേറ്റിലും എല്ലാ ചലനങ്ങളും സമാനമായി നല്ലതാണ്. നാം `plot` ഫംഗ്ഷനിലേക്ക് ക്യൂ-ടേബിൾ പാസ്സ് ചെയ്ത് ബോർഡിൽ ടേബിൾ ദൃശ്യവൽക്കരിക്കാം: `m.plot(Q)`.
![പീറ്ററിന്റെ പരിസരം](../../../../translated_images/env_init.04e8f26d2d60089e128f21d22e5fef57d580e559f0d5937b06c689e5e7cdd438.ml.png)
ഓരോ സെല്ലിന്റെ മദ്ധ്യത്തിൽ ഒരു "അറ" കാണിക്കുന്നു, അത് പ്രിയപ്പെട്ട ചലന ദിശ സൂചിപ്പിക്കുന്നു. എല്ലാ ദിശകളും സമാനമായതിനാൽ, ഒരു ഡോട്ട് പ്രദർശിപ്പിക്കുന്നു.
ഇപ്പോൾ നാം സിമുലേഷൻ നടത്തണം, പരിസരം അന്വേഷിച്ച്, ക്യൂ-ടേബിൾ മൂല്യങ്ങളുടെ മികച്ച വിതരണവും പഠിക്കണം, ഇത് ആപ്പിള്‍ കണ്ടെത്താനുള്ള പാത വേഗത്തിൽ കണ്ടെത്താൻ സഹായിക്കും.
## ക്യൂ-ലേണിംഗിന്റെ സാരാംശം: ബെൽമാൻ സമവാക്യം
നാം ചലനം ആരംഭിക്കുമ്പോൾ, ഓരോ പ്രവർത്തനത്തിനും അനുയോജ്യമായ റിവാർഡ് ഉണ്ടാകും, അതായത് നാം തിയറിയിൽ ഏറ്റവും ഉയർന്ന തൽസമയ റിവാർഡിന്റെ അടിസ്ഥാനത്തിൽ അടുത്ത പ്രവർത്തനം തിരഞ്ഞെടുക്കാം. എന്നാൽ, പല സ്റ്റേറ്റുകളിലും, ആ ചലനം ആപ്പിള്‍ കണ്ടെത്താനുള്ള ലക്ഷ്യം നേടില്ല, അതിനാൽ ഏത് ദിശ മികച്ചതാണെന്ന് ഉടൻ തീരുമാനിക്കാൻ കഴിയില്ല.
> ഉടൻ ഫലം പ്രധാനമല്ല, സിമുലേഷൻ അവസാനം ലഭിക്കുന്ന അന്തിമ ഫലമാണ് പ്രധാനമെന്ന് ഓർക്കുക.
ഈ വൈകിയ റിവാർഡ് പരിഗണിക്കാൻ, നാം **[ഡൈനാമിക് പ്രോഗ്രാമിംഗ്](https://en.wikipedia.org/wiki/Dynamic_programming)** ന്റെ സിദ്ധാന്തങ്ങൾ ഉപയോഗിക്കണം, ഇത് പ്രശ്നത്തെ പുനരാവർത്തനമായി ചിന്തിക്കാൻ സഹായിക്കുന്നു.
നമുക്ക് ഇപ്പോൾ സ്റ്റേറ്റ് *s* ൽ ഉണ്ടെന്ന് കരുതുക, അടുത്ത സ്റ്റേറ്റ് *s'* ലേക്ക് പോകാൻ ആഗ്രഹിക്കുന്നു. അങ്ങനെ ചെയ്താൽ, നാം റിവാർഡ് ഫംഗ്ഷൻ നിർവചിക്കുന്ന തൽസമയ റിവാർഡ് *r(s,a)* ലഭിക്കും, കൂടാതെ ഭാവി റിവാർഡ് കൂടി. നമ്മുടെ ക്യൂ-ടേബിൾ ഓരോ പ്രവർത്തനത്തിന്റെ "ആകർഷകത" ശരിയായി പ്രതിഫലിപ്പിക്കുന്നുവെന്ന് കരുതിയാൽ, സ്റ്റേറ്റ് *s'* ൽ ഏറ്റവും ഉയർന്ന മൂല്യമുള്ള *Q(s',a')* പ്രവർത്തനം *a* തിരഞ്ഞെടുക്കും. അതിനാൽ, സ്റ്റേറ്റ് *s* ൽ ലഭിക്കാവുന്ന മികച്ച ഭാവി റിവാർഡ് `max`<sub>a'</sub>*Q(s',a')* ആയി നിർവചിക്കാം (max എല്ലാ പ്രവർത്തനങ്ങൾക്കുമുള്ളതാണ്).
ഇത് സ്റ്റേറ്റ് *s* ൽ പ്രവർത്തനം *a* നുള്ള ക്യൂ-ടേബിൾ മൂല്യം കണക്കാക്കാനുള്ള **ബെൽമാൻ ഫോർമുല** നൽകുന്നു:
<img src="../../../../translated_images/bellman-equation.7c0c4c722e5a6b7c208071a0bae51664965050848e4f8a84bb377cd18bdd838b.ml.png"/>
ഇവിടെ γ എന്നത് **ഡിസ്‌കൗണ്ട് ഫാക്ടർ** ആണ്, ഇത് നിലവിലെ റിവാർഡ് ഭാവി റിവാർഡിനേക്കാൾ എത്രമാത്രം മുൻഗണന നൽകണമെന്ന് നിർണ്ണയിക്കുന്നു.
## പഠന ആൽഗോരിതം
മുകളിൽ നൽകിയ സമവാക്യം അടിസ്ഥാനമാക്കി, നാം പഠന ആൽഗോരിതത്തിനുള്ള പseudo-കോഡ് എഴുതാം:
* എല്ലാ സ്റ്റേറ്റുകളിലും പ്രവർത്തനങ്ങളിലും സമാന സംഖ്യകൾ ഉപയോഗിച്ച് ക്യൂ-ടേബിൾ Q ആരംഭിക്കുക
* പഠന നിരക്ക് α ← 1 ആയി സജ്ജമാക്കുക
* സിമുലേഷൻ പല തവണ ആവർത്തിക്കുക
1. യാദൃച്ഛിക സ്ഥാനത്ത് ആരംഭിക്കുക
1. ആവർത്തിക്കുക
1. സ്റ്റേറ്റ് *s* ൽ പ്രവർത്തനം *a* തിരഞ്ഞെടുക്കുക
2. പ്രവർത്തനം നടപ്പിലാക്കി പുതിയ സ്റ്റേറ്റ് *s'* ലേക്ക് പോകുക
3. ഗെയിം അവസാന സ്ഥിതി കണ്ടാൽ അല്ലെങ്കിൽ മൊത്തം റിവാർഡ് വളരെ കുറവായാൽ സിമുലേഷൻ അവസാനിപ്പിക്കുക
4. പുതിയ സ്റ്റേറ്റിൽ റിവാർഡ് *r* കണക്കാക്കുക
5. ബെൽമാൻ സമവാക്യം അനുസരിച്ച് Q-ഫംഗ്ഷൻ അപ്ഡേറ്റ് ചെയ്യുക: *Q(s,a)* ← *(1-α)Q(s,a)+α(r+γ max<sub>a'</sub>Q(s',a'))*
6. *s* ← *s'*
7. മൊത്തം റിവാർഡ് അപ്ഡേറ്റ് ചെയ്ത് α കുറയ്ക്കുക.
## എക്സ്പ്ലോയിറ്റ് vs. എക്സ്പ്ലോർ
മുകളിൽ നൽകിയ ആൽഗോരിതത്തിൽ, 2.1 ഘട്ടത്തിൽ പ്രവർത്തനം എങ്ങനെ തിരഞ്ഞെടുക്കണമെന്ന് വ്യക്തമാക്കിയിട്ടില്ല. പ്രവർത്തനം യാദൃച്ഛികമായി തിരഞ്ഞെടുക്കുകയാണെങ്കിൽ, നാം പരിസരം യാദൃച്ഛികമായി **അന്വേഷിക്കും**; പലപ്പോഴും മരിക്കുകയും സാധാരണ പോകാത്ത പ്രദേശങ്ങൾ പരിശോധിക്കുകയും ചെയ്യും. മറ്റൊരു മാർഗം, നാം ഇതിനകം അറിയുന്ന ക്യൂ-ടേബിൾ മൂല്യങ്ങൾ **ഉപയോഗിച്ച്** (എക്സ്പ്ലോയിറ്റ് ചെയ്ത്) ഏറ്റവും നല്ല പ്രവർത്തനം (കൂടുതൽ Q-മൂല്യമുള്ളത്) തിരഞ്ഞെടുക്കുക ആണ്. എന്നാൽ ഇത് മറ്റ് സ്റ്റേറ്റുകൾ പരിശോധിക്കുന്നത് തടയും, അതിനാൽ ഏറ്റവും ഉത്തമ പരിഹാരം കണ്ടെത്താൻ കഴിയാതെ പോകാം.
അതിനാൽ, ഏറ്റവും നല്ല മാർഗം എക്സ്പ്ലോറേഷനും എക്സ്പ്ലോയിറ്റേഷനും ഇടയിൽ സമതുലനം പുലർത്തുകയാണ്. ഇത് സ്റ്റേറ്റ് *s* ൽ പ്രവർത്തനം തിരഞ്ഞെടുക്കുമ്പോൾ ക്യൂ-ടേബിളിലെ മൂല്യങ്ങളുടെ അനുപാതത്തിൽ സാധ്യതകൾ ഉപയോഗിച്ച് ചെയ്യാം. തുടക്കത്തിൽ, ക്യൂ-ടേബിൾ മൂല്യങ്ങൾ എല്ലാം സമാനമായതിനാൽ ഇത് യാദൃച്ഛിക തിരഞ്ഞെടുപ്പായി കാണപ്പെടും, എന്നാൽ പരിസരം കൂടുതൽ പഠിക്കുമ്പോൾ, ഏജന്റ് ചിലപ്പോൾ പരീക്ഷിക്കാത്ത പാത തിരഞ്ഞെടുക്കാൻ അനുവദിച്ച്, ഏറ്റവും ഉത്തമ മാർഗം പിന്തുടരാൻ സാധ്യത കൂടുതലാകും.
## പൈത്തൺ നടപ്പാക്കൽ
ഇപ്പോൾ നാം പഠന ആൽഗോരിതം നടപ്പിലാക്കാൻ തയ്യാറാണ്. അതിന് മുമ്പ്, ക്യൂ-ടേബിളിലെ യാദൃച്ഛിക സംഖ്യകൾ പ്രവർത്തനങ്ങൾക്ക് അനുയോജ്യമായ സാധ്യതാ വെക്ടറായി മാറ്റുന്ന ഒരു ഫംഗ്ഷൻ വേണം.
1. `probs()` എന്ന ഫംഗ്ഷൻ സൃഷ്ടിക്കുക:
```python
def probs(v,eps=1e-4):
v = v-v.min()+eps
v = v/v.sum()
return v
```
തുടക്കത്തിൽ വെക്ടറിലെ എല്ലാ ഘടകങ്ങളും സമാനമായതിനാൽ 0-ൽ വിഭജിക്കൽ ഒഴിവാക്കാൻ കുറച്ച് `eps` ചേർക്കുന്നു.
5000 പരീക്ഷണങ്ങൾ (എപ്പോക്കുകൾ) വഴി പഠന ആൽഗോരിതം ഓടിക്കുക: (കോഡ് ബ്ലോക്ക് 8)
```python
for epoch in range(5000):
# പ്രാരംഭ ബിന്ദു തിരഞ്ഞെടുക്കുക
m.random_start()
# യാത്ര ആരംഭിക്കുക
n=0
cum_reward = 0
while True:
x,y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions),weights=v)[0]
dpos = actions[a]
m.move(dpos,check_correctness=False) # കളിക്കാരന് ബോർഡിന് പുറത്തേക്ക് നീങ്ങാൻ അനുവദിക്കുന്നു, ഇത് എപ്പിസോഡ് അവസാനിപ്പിക്കുന്നു
r = reward(m)
cum_reward += r
if r==end_reward or cum_reward < -1000:
lpath.append(n)
break
alpha = np.exp(-n / 10e5)
gamma = 0.5
ai = action_idx[a]
Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max())
n+=1
```
ഈ ആൽഗോരിതം നടപ്പിലാക്കിയ ശേഷം, ക്യൂ-ടേബിൾ ഓരോ ഘട്ടത്തിലും വിവിധ പ്രവർത്തനങ്ങളുടെ ആകർഷകത നിർവചിക്കുന്ന മൂല്യങ്ങളാൽ അപ്ഡേറ്റ് ചെയ്യപ്പെടും. നാം ക്യൂ-ടേബിൾ ദൃശ്യവൽക്കരിക്കാൻ ഓരോ സെല്ലിലും ഒരു വെക്ടർ വരയ്ക്കാം, അത് ആഗ്രഹിക്കുന്ന ചലന ദിശ കാണിക്കും. ലളിതത്വത്തിന്, അറിന്റെ തലക്കെട്ട് പകരം ചെറിയ വൃത്തം വരയ്ക്കുന്നു.
<img src="../../../../translated_images/learned.ed28bcd8484b5287a31925c96c43b43e2c2bb876b8ca41a0e1e754f77bb3db20.ml.png"/>
## നയം പരിശോധിക്കൽ
ക്യൂ-ടേബിൾ ഓരോ സ്റ്റേറ്റിലും ഓരോ പ്രവർത്തനത്തിന്റെ "ആകർഷകത" പട്ടികയാക്കുന്നതിനാൽ, ഇത് ഉപയോഗിച്ച് നമ്മുടെ ലോകത്ത് ഫലപ്രദമായ നാവിഗേഷൻ നിർവചിക്കുക എളുപ്പമാണ്. ലളിതമായ സാഹചര്യത്തിൽ, ഏറ്റവും ഉയർന്ന ക്യൂ-ടേബിൾ മൂല്യമുള്ള പ്രവർത്തനം തിരഞ്ഞെടുക്കാം: (കോഡ് ബ്ലോക്ക് 9)
```python
def qpolicy_strict(m):
x,y = m.human
v = probs(Q[x,y])
a = list(actions)[np.argmax(v)]
return a
walk(m,qpolicy_strict)
```
> മുകളിൽ കൊടുത്ത കോഡ് പലതവണ ശ്രമിച്ചാൽ, ചിലപ്പോൾ അത് "ഹാംഗ്" ചെയ്യുന്നതായി നിങ്ങൾ ശ്രദ്ധിക്കാം, അപ്പോൾ നോട്ട്ബുക്കിൽ STOP ബട്ടൺ അമർത്തി ഇടപെടേണ്ടിവരും. ഇത് സംഭവിക്കുന്നത്, ചില സാഹചര്യങ്ങളിൽ രണ്ട് സ്റ്റേറ്റുകൾ പരസ്പരം പരമോന്നത Q-Value അടിസ്ഥാനത്തിൽ "പോയിന്റ്" ചെയ്യുന്നതായി ഉണ്ടായേക്കാം, അപ്പോൾ ഏജന്റ് ആ സ്റ്റേറ്റുകൾക്കിടയിൽ അനന്തമായി സഞ്ചരിക്കാറുണ്ട്.
## 🚀ചലഞ്ച്
> **ടാസ്‌ക് 1:** `walk` ഫംഗ്ഷൻ മാറ്റി പാതയുടെ പരമാവധി നീളം ഒരു നിശ്ചിത ഘട്ടങ്ങളുടെ എണ്ണം (ഉദാഹരണത്തിന്, 100) ആയി പരിധിയിടുക, മുകളിൽ കൊടുത്ത കോഡ് ചിലപ്പോൾ ഈ മൂല്യം തിരികെ നൽകുന്നത് കാണുക.
> **ടാസ്‌ക് 2:** `walk` ഫംഗ്ഷൻ മാറ്റി അത് മുമ്പ് പോയ സ്ഥലങ്ങളിലേക്ക് തിരികെ പോകരുത്. ഇത് `walk` ലൂപ്പിംഗ് തടയും, എങ്കിലും ഏജന്റ് രക്ഷപ്പെടാൻ കഴിയാത്ത ഒരു സ്ഥലത്ത് "പിടിച്ചുപോകാൻ" സാധ്യതയുണ്ട്.
## നാവിഗേഷൻ
പരിശീലന സമയത്ത് ഉപയോഗിച്ച നാവിഗേഷൻ നയം മെച്ചപ്പെട്ടതാണ്, ഇത് എക്സ്പ്ലോയിറ്റേഷൻ (exploitation) ഉം എക്സ്പ്ലോറേഷൻ (exploration) ഉം സംയോജിപ്പിക്കുന്നു. ഈ നയത്തിൽ, Q-ടേബിളിലെ മൂല്യങ്ങൾക്ക് അനുപാതമായി ഓരോ ആക്ഷനും ഒരു നിശ്ചിത സാധ്യതയോടെ തിരഞ്ഞെടുക്കപ്പെടും. ഈ തന്ത്രം ഏജന്റ് മുമ്പ് പരിശോധിച്ച സ്ഥാനത്തേക്ക് തിരികെ പോകാൻ ഇടയുണ്ടാക്കാം, പക്ഷേ താഴെ കൊടുത്ത കോഡിൽ കാണുന്നതുപോലെ, ഇത് ആഗ്രഹിച്ച സ്ഥലത്തേക്ക് വളരെ ചെറുതായ ശരാശരി പാത നൽകുന്നു (`print_statistics` 100 തവണ സിമുലേഷൻ നടത്തുന്നു): (കോഡ് ബ്ലോക്ക് 10)
```python
def qpolicy(m):
x,y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions),weights=v)[0]
return a
print_statistics(qpolicy)
```
ഈ കോഡ് പ്രവർത്തിപ്പിച്ചതിന് ശേഷം, മുമ്പത്തെ അപേക്ഷിച്ച് വളരെ ചെറുതായ ശരാശരി പാത നീളം 3-6 പരിധിയിൽ ലഭിക്കണം.
## പഠന പ്രക്രിയ പരിശോധിക്കൽ
പഠന പ്രക്രിയ പ്രശ്നത്തിന്റെ ഘടനയെക്കുറിച്ചുള്ള അറിവ് കണ്ടെത്തലും പരീക്ഷണവും തമ്മിലുള്ള സമതുല്യമാണ്. പഠന ഫലങ്ങൾ (ഏജന്റിന് ലക്ഷ്യത്തിലേക്ക് ചെറുതായ പാത കണ്ടെത്താൻ സഹായിക്കുന്ന കഴിവ്) മെച്ചപ്പെട്ടതായി കാണാം, എന്നാൽ പഠന പ്രക്രിയയിൽ ശരാശരി പാത നീളം എങ്ങനെ പെരുമാറുന്നു എന്ന് നിരീക്ഷിക്കാനും താൽപര്യമുണ്ട്:
<img src="../../../../translated_images/lpathlen1.0534784add58d4ebf25c21d4a1da9bceab4f96743a35817f1b49ab963c64c572.ml.png"/>
പഠനങ്ങൾ ചുരുക്കി പറയാം:
- **ശരാശരി പാത നീളം വർദ്ധിക്കുന്നു**. ആദ്യം ശരാശരി പാത നീളം വർദ്ധിക്കുന്നതായി കാണുന്നു. ഇത് പരിസ്ഥിതി കുറിച്ച് ഒന്നും അറിയാത്തപ്പോൾ, മോശം സ്റ്റേറ്റുകളിൽ, വെള്ളത്തിൽ അല്ലെങ്കിൽ വംശഹത്യയിൽ കുടുങ്ങാനുള്ള സാധ്യത കൂടുതലായതിനാലാണ്. കൂടുതൽ പഠിച്ച് അറിവ് ഉപയോഗിക്കാൻ തുടങ്ങുമ്പോൾ, പരിസ്ഥിതിയെ കൂടുതൽ കാലം പരിശോധിക്കാം, പക്ഷേ ആപ്പിളുകൾ എവിടെ എന്നറിയില്ല.
- **പാത നീളം കുറയുന്നു, കൂടുതൽ പഠിക്കുമ്പോൾ**. മതിയായ പഠനം കഴിഞ്ഞാൽ, ഏജന്റിന് ലക്ഷ്യം നേടാൻ എളുപ്പമാകും, പാത നീളം കുറയാൻ തുടങ്ങും. എങ്കിലും പരീക്ഷണത്തിന് തുറന്നിരിക്കുകയാണെങ്കിൽ, ഏറ്റവും നല്ല പാതയിൽ നിന്ന് പലപ്പോഴും വ്യത്യസ്തമായി പുതിയ ഓപ്ഷനുകൾ പരിശോധിച്ച് പാത നീളം പരമാവധി ആയേക്കാം.
- **നീളം അപ്രതീക്ഷിതമായി വർദ്ധിക്കുന്നു**. ഈ ഗ്രാഫിൽ മറ്റൊരു ശ്രദ്ധേയമായ കാര്യം, ചിലപ്പോൾ പാത നീളം അപ്രതീക്ഷിതമായി വർദ്ധിക്കുന്നതാണ്. ഇത് പ്രക്രിയയുടെ സ്ടോക്കാസ്റ്റിക് സ്വഭാവം സൂചിപ്പിക്കുന്നു, പുതിയ മൂല്യങ്ങൾ കൊണ്ട് Q-ടേബിള്‍ കോഫിഷ്യന്റുകൾ മറച്ചുവെക്കപ്പെടാൻ സാധ്യതയുണ്ട്. ഇത് കുറയ്ക്കാൻ പഠന നിരക്ക് കുറയ്ക്കണം (ഉദാഹരണത്തിന്, പരിശീലനത്തിന്റെ അവസാനം Q-ടേബിള്‍ മൂല്യങ്ങൾ ചെറിയ മൂല്യത്തോടെ മാത്രം ക്രമീകരിക്കുക).
മൊത്തത്തിൽ, പഠന പ്രക്രിയയുടെ വിജയം, ഗുണമേന്മ എന്നിവ പഠന നിരക്ക്, പഠന നിരക്ക് കുറവ്, ഡിസ്കൗണ്ട് ഫാക്ടർ പോലുള്ള പാരാമീറ്ററുകളിൽ ആശ്രയിച്ചിരിക്കുന്നു. ഇവയെ സാധാരണയായി **ഹൈപ്പർപാരാമീറ്ററുകൾ** എന്ന് വിളിക്കുന്നു, പരിശീലന സമയത്ത് ഞങ്ങൾ മെച്ചപ്പെടുത്തുന്ന **പാരാമീറ്ററുകൾ** (ഉദാഹരണത്തിന്, Q-ടേബിള്‍ കോഫിഷ്യന്റുകൾ) എന്നിവയിൽ നിന്ന് വ്യത്യസ്തമാണ്. മികച്ച ഹൈപ്പർപാരാമീറ്റർ മൂല്യങ്ങൾ കണ്ടെത്തുന്ന പ്രക്രിയ **ഹൈപ്പർപാരാമീറ്റർ ഓപ്റ്റിമൈസേഷൻ** എന്ന് വിളിക്കുന്നു, ഇത് ഒരു പ്രത്യേക വിഷയം ആണ്.
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അസൈൻമെന്റ്
[ഒരു കൂടുതൽ യാഥാർത്ഥ്യപരമായ ലോകം](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,43 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "68394b2102d3503882e5e914bd0ff5c1",
"translation_date": "2025-12-19T15:52:42+00:00",
"source_file": "8-Reinforcement/1-QLearning/assignment.md",
"language_code": "ml"
}
-->
# കൂടുതൽ യാഥാർത്ഥ്യമുള്ള ലോകം
നമ്മുടെ സാഹചര്യത്തിൽ, പീറ്റർ തളരാതെ അല്ലെങ്കിൽ വിശക്കാതെ ഏകദേശം ചുറ്റിപ്പറക്കാൻ കഴിഞ്ഞു. കൂടുതൽ യാഥാർത്ഥ്യമുള്ള ലോകത്തിൽ, നമ്മൾ ഇടയ്ക്കിടെ ഇരുന്ന് വിശ്രമിക്കേണ്ടതും, കൂടാതെ ഭക്ഷണം കഴിക്കേണ്ടതും ഉണ്ടാകും. താഴെ കൊടുത്തിരിക്കുന്ന നിയമങ്ങൾ നടപ്പിലാക്കി നമ്മുടെ ലോകം കൂടുതൽ യാഥാർത്ഥ്യമാക്കാം:
1. ഒരു സ്ഥലത്ത് നിന്ന് മറ്റൊരിടത്തേക്ക് നീങ്ങുമ്പോൾ, പീറ്റർ **ഊർജം** നഷ്ടപ്പെടുകയും കുറച്ച് **ക്ഷീണം** നേടുകയും ചെയ്യും.
2. ആപ്പിളുകൾ കഴിച്ച് പീറ്റർ കൂടുതൽ ഊർജം നേടാൻ കഴിയും.
3. പീറ്റർ വൃക്ഷത്തിനടിയിൽ അല്ലെങ്കിൽ പുൽമേടിൽ (അഥവാ - പച്ചത്തോട്ടം ഉള്ള ബോർഡ് ലൊക്കേഷനിലേക്ക് നടക്കുമ്പോൾ) വിശ്രമിച്ച് ക്ഷീണം ഒഴിവാക്കാം.
4. പീറ്റർ നരഭക്ഷകനെ കണ്ടെത്തി കൊല്ലണം.
5. നരഭക്ഷകനെ കൊല്ലാൻ, പീറ്ററിന് നിർദ്ദിഷ്ടമായ ഊർജവും ക്ഷീണവും വേണം, അല്ലെങ്കിൽ അവൻ യുദ്ധം തോറ്റുപോകും.
## നിർദ്ദേശങ്ങൾ
നിങ്ങളുടെ പരിഹാരത്തിന് തുടക്കമായി ഒറിജിനൽ [notebook.ipynb](notebook.ipynb) നോട്ട്‌ബുക്ക് ഉപയോഗിക്കുക.
ഗെയിമിന്റെ നിയമങ്ങൾ അനുസരിച്ച് മുകളിൽ കൊടുത്ത റിവാർഡ് ഫംഗ്ഷൻ മാറ്റി, reinforcement learning ആൽഗോരിതം പ്രവർത്തിപ്പിച്ച് ഗെയിം ജയിക്കാനുള്ള മികച്ച തന്ത്രം പഠിപ്പിക്കുക, പിന്നെ റാൻഡം വാക്കുമായി നിങ്ങളുടെ ആൽഗോരിതത്തിന്റെ ഫലങ്ങൾ (ജയിച്ചും തോറ്റും ഗെയിമുകളുടെ എണ്ണം) താരതമ്യം ചെയ്യുക.
> **കുറിപ്പ്**: നിങ്ങളുടെ പുതിയ ലോകത്തിൽ, സ്റ്റേറ്റ് കൂടുതൽ സങ്കീർണ്ണമാണ്, മനുഷ്യന്റെ സ്ഥാനം കൂടാതെ ക്ഷീണം, ഊർജം നിലകളും ഉൾപ്പെടുന്നു. സ്റ്റേറ്റ് (Board,energy,fatigue) എന്ന ട്യൂപ്പിളായി പ്രതിനിധാനം ചെയ്യാമോ, അല്ലെങ്കിൽ സ്റ്റേറ്റിനായി ഒരു ക്ലാസ് നിർവചിക്കാമോ (Board-ൽ നിന്നു derive ചെയ്യാനും കഴിയും), അല്ലെങ്കിൽ ഒറിജിനൽ `Board` ക്ലാസ് [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py) ഫയലിൽ തന്നെ മാറ്റം വരുത്താം.
നിങ്ങളുടെ പരിഹാരത്തിൽ, ദയവായി റാൻഡം വാക്ക് തന്ത്രത്തിന് ഉത്തരവാദിയായ കോഡ് സൂക്ഷിക്കുക, അവസാനം നിങ്ങളുടെ ആൽഗോരിതവും റാൻഡം വാക്കും തമ്മിലുള്ള ഫലങ്ങൾ താരതമ്യം ചെയ്യുക.
> **കുറിപ്പ്**: ഇത് പ്രവർത്തിക്കാൻ hyperparameters ക്രമീകരിക്കേണ്ടി വരാം, പ്രത്യേകിച്ച് epochs-ന്റെ എണ്ണം. ഗെയിം വിജയിക്കുക (നരഭക്ഷകനെ യുദ്ധം ചെയ്യുക) അപൂർവമായ സംഭവമാണെന്ന് കണക്കിലെടുത്ത്, പരിശീലന സമയം വളരെ നീണ്ടേക്കാം.
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണപരമായത് | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| | പുതിയ ലോക നിയമങ്ങളുടെ നിർവചനവും Q-Learning ആൽഗോരിതവും ചില വാചക വിശദീകരണങ്ങളും ഉള്ള ഒരു നോട്ട്‌ബുക്ക് അവതരിപ്പിച്ചിരിക്കുന്നു. Q-Learning റാൻഡം വാക്കുമായി താരതമ്യപ്പെടുത്തുമ്പോൾ ഫലങ്ങൾ ഗണ്യമായി മെച്ചപ്പെടുത്തുന്നു. | നോട്ട്‌ബുക്ക് അവതരിപ്പിച്ചിരിക്കുന്നു, Q-Learning നടപ്പിലാക്കി റാൻഡം വാക്കുമായി താരതമ്യപ്പെടുത്തുമ്പോൾ ഫലങ്ങൾ മെച്ചപ്പെട്ടിട്ടുണ്ട്, പക്ഷേ ഗണ്യമായില്ല; അല്ലെങ്കിൽ നോട്ട്‌ബുക്ക് ദുർബലമായി രേഖപ്പെടുത്തിയിട്ടുണ്ട്, കോഡ് നല്ല രീതിയിൽ ഘടിപ്പിച്ചിട്ടില്ല | ലോകത്തിന്റെ നിയമങ്ങൾ പുനർനിർവചിക്കാൻ ചില ശ്രമങ്ങൾ നടത്തിയിട്ടുണ്ട്, പക്ഷേ Q-Learning ആൽഗോരിതം പ്രവർത്തിക്കുന്നില്ല, അല്ലെങ്കിൽ റിവാർഡ് ഫംഗ്ഷൻ പൂർണ്ണമായി നിർവചിച്ചിട്ടില്ല |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

File diff suppressed because one or more lines are too long

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T15:54:47+00:00",
"source_file": "8-Reinforcement/1-QLearning/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡർ ആണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-12-19T15:55:21+00:00",
"source_file": "8-Reinforcement/1-QLearning/solution/R/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡർ ആണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,356 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "107d5bb29da8a562e7ae72262d251a75",
"translation_date": "2025-12-19T15:39:36+00:00",
"source_file": "8-Reinforcement/2-Gym/README.md",
"language_code": "ml"
}
-->
# കാർട്ട്‌പോൾ സ്‌കേറ്റിംഗ്
മുൻപത്തെ പാഠത്തിൽ നാം പരിഹരിച്ച പ്രശ്നം ഒരു കളിപ്പാട്ട പ്രശ്നം പോലെ തോന്നാം, യഥാർത്ഥ ജീവിത സാഹചര്യങ്ങൾക്ക് യോജിച്ചില്ലാത്തതായിരിക്കാം. എന്നാൽ ഇത് സത്യമായിട്ടില്ല, കാരണം പല യഥാർത്ഥ ലോക പ്രശ്നങ്ങളും ഈ സാഹചര്യത്തെ പങ്കുവെക്കുന്നു - ചെസ് അല്ലെങ്കിൽ ഗോ കളിക്കുന്നത് ഉൾപ്പെടെ. അവ സമാനമാണ്, കാരണം നമുക്ക് ഒരു ബോർഡ് ഉണ്ട്, നിശ്ചിത നിയമങ്ങളോടുകൂടി, കൂടാതെ ഒരു **വ്യത്യസ്തമായ അവസ്ഥ** ഉണ്ട്.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## പരിചയം
ഈ പാഠത്തിൽ നാം Q-ലേണിങ്ങിന്റെ സമാന സിദ്ധാന്തങ്ങൾ **നിരന്തര അവസ്ഥ** ഉള്ള ഒരു പ്രശ്നത്തിൽ പ്രയോഗിക്കും, അതായത്, ഒരു അല്ലെങ്കിൽ കൂടുതൽ യഥാർത്ഥ സംഖ്യകളാൽ നൽകിയ ഒരു അവസ്ഥ. നാം താഴെ പറയുന്ന പ്രശ്നം കൈകാര്യം ചെയ്യും:
> **പ്രശ്നം**: പീറ്റർ വംശജനെ നിന്ന് രക്ഷപ്പെടാൻ, അവൻ വേഗത്തിൽ ചലിക്കാൻ കഴിയണം. പീറ്റർ എങ്ങനെ സ്‌കേറ്റ് ചെയ്യാൻ പഠിക്കാമെന്ന് നാം കാണും, പ്രത്യേകിച്ച്, ബാലൻസ് നിലനിർത്താൻ, Q-ലേണിംഗ് ഉപയോഗിച്ച്.
![The great escape!](../../../../translated_images/escape.18862db9930337e3fce23a9b6a76a06445f229dadea2268e12a6f0a1fde12115.ml.png)
> പീറ്ററും അവന്റെ സുഹൃത്തുക്കളും വംശജനെ നിന്ന് രക്ഷപ്പെടാൻ സൃഷ്ടിപരമായ മാർഗങ്ങൾ കണ്ടെത്തുന്നു! ചിത്രം [ജെൻ ലൂപ്പർ](https://twitter.com/jenlooper) എന്നവരുടെ.
നാം ബാലൻസിംഗ് എന്നത് ലളിതമാക്കിയ ഒരു പതിപ്പ് ഉപയോഗിക്കും, ഇത് **കാർട്ട്‌പോൾ** പ്രശ്നമായി അറിയപ്പെടുന്നു. കാർട്ട്‌പോൾ ലോകത്ത്, ഒരു ഹോരിസോണ്ടൽ സ്ലൈഡർ ഇടത്തോ വലത്തോ ചലിക്കാൻ കഴിയും, ലക്ഷ്യം സ്ലൈഡറിന്റെ മുകളിൽ ഒരു വെർട്ടിക്കൽ പോൾ ബാലൻസ് ചെയ്യുകയാണ്.
<img alt="a cartpole" src="../../../../translated_images/cartpole.b5609cc0494a14f75d121299495ae24fd8f1c30465e7b40961af94ecda2e1cd0.ml.png" width="200"/>
## മുൻപരിചയം
ഈ പാഠത്തിൽ, നാം **OpenAI Gym** എന്ന ലൈബ്രറി ഉപയോഗിച്ച് വ്യത്യസ്ത **പരിസ്ഥിതികൾ** സിമുലേറ്റ് ചെയ്യും. നിങ്ങൾക്ക് ഈ പാഠത്തിന്റെ കോഡ് ലോക്കലായി (ഉദാ. Visual Studio Code-ൽ) ഓടിക്കാം, അപ്പോൾ സിമുലേഷൻ പുതിയ വിൻഡോയിൽ തുറക്കും. ഓൺലൈനിൽ കോഡ് ഓടിക്കുമ്പോൾ, ചില മാറ്റങ്ങൾ ആവശ്യമായേക്കാം, [ഇവിടെ](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7) വിവരിച്ചിരിക്കുന്നതുപോലെ.
## OpenAI Gym
മുൻപത്തെ പാഠത്തിൽ, ഗെയിമിന്റെ നിയമങ്ങളും അവസ്ഥയും നാം നിർവചിച്ച `Board` ക്ലാസ്സിലൂടെ നൽകിയിരുന്നു. ഇവിടെ നാം ഒരു പ്രത്യേക **സിമുലേഷൻ പരിസ്ഥിതി** ഉപയോഗിക്കും, ഇത് ബാലൻസിംഗ് പോളിന്റെ ഫിസിക്സ് സിമുലേറ്റ് ചെയ്യും. റീൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ് ആൽഗോരിതങ്ങൾ പരിശീലിപ്പിക്കാൻ ഏറ്റവും പ്രശസ്തമായ സിമുലേഷൻ പരിസ്ഥിതികളിൽ ഒന്നാണ് [Gym](https://gym.openai.com/), ഇത് [OpenAI](https://openai.com/) സംരക്ഷിക്കുന്നു. ഈ ജിം ഉപയോഗിച്ച് നാം കാർട്ട്‌പോൾ സിമുലേഷനിൽ നിന്ന് അറ്റാരി ഗെയിമുകൾ വരെ വ്യത്യസ്ത **പരിസ്ഥിതികൾ** സൃഷ്ടിക്കാം.
> **കുറിപ്പ്**: OpenAI Gym-ൽ ലഭ്യമായ മറ്റ് പരിസ്ഥിതികൾ [ഇവിടെ](https://gym.openai.com/envs/#classic_control) കാണാം.
ആദ്യം, ജിം ഇൻസ്റ്റാൾ ചെയ്ത് ആവശ്യമായ ലൈബ്രറികൾ ഇറക്കുമതി ചെയ്യാം (കോഡ് ബ്ലോക്ക് 1):
```python
import sys
!{sys.executable} -m pip install gym
import gym
import matplotlib.pyplot as plt
import numpy as np
import random
```
## അഭ്യാസം - കാർട്ട്‌പോൾ പരിസ്ഥിതി ആരംഭിക്കുക
കാർട്ട്‌പോൾ ബാലൻസിംഗ് പ്രശ്നം കൈകാര്യം ചെയ്യാൻ, അനുയോജ്യമായ പരിസ്ഥിതി ആരംഭിക്കണം. ഓരോ പരിസ്ഥിതിക്കും ഒരു:
- **അവലോകന സ്ഥലം** ഉണ്ട്, ഇത് പരിസ്ഥിതിയിൽ നിന്ന് ലഭിക്കുന്ന വിവരങ്ങളുടെ ഘടന നിർവചിക്കുന്നു. കാർട്ട്‌പോൾ പ്രശ്നത്തിൽ, നാം പോളിന്റെ സ്ഥാനം, വേഗത, മറ്റ് ചില മൂല്യങ്ങൾ സ്വീകരിക്കുന്നു.
- **പ്രവർത്തന സ്ഥലം** ഉണ്ട്, ഇത് സാധ്യമായ പ്രവർത്തനങ്ങൾ നിർവചിക്കുന്നു. നമ്മുടെ കേസിൽ പ്രവർത്തന സ്ഥലം വ്യത്യസ്തമാണ്, രണ്ട് പ്രവർത്തനങ്ങളടങ്ങിയതാണ് - **ഇടത്തേക്ക്**യും **വലത്തേക്ക്**യും. (കോഡ് ബ്ലോക്ക് 2)
1. ആരംഭിക്കാൻ, താഴെ കൊടുത്ത കോഡ് ടൈപ്പ് ചെയ്യുക:
```python
env = gym.make("CartPole-v1")
print(env.action_space)
print(env.observation_space)
print(env.action_space.sample())
```
പരിസ്ഥിതി എങ്ങനെ പ്രവർത്തിക്കുന്നുവെന്ന് കാണാൻ, 100 ഘട്ടങ്ങൾക്കുള്ള ഒരു ചെറിയ സിമുലേഷൻ ഓടിക്കാം. ഓരോ ഘട്ടത്തിലും, എടുക്കേണ്ട പ്രവർത്തനങ്ങളിൽ ഒന്നിനെ നാം നൽകും - ഈ സിമുലേഷനിൽ നാം `action_space`-ൽ നിന്നു യാദൃച്ഛികമായി ഒരു പ്രവർത്തനം തിരഞ്ഞെടുക്കുന്നു.
1. താഴെ കൊടുത്ത കോഡ് ഓടിച്ച് ഫലം കാണുക.
✅ ഈ കോഡ് ലോക്കൽ പൈത്തൺ ഇൻസ്റ്റലേഷനിൽ ഓടിക്കുന്നത് മുൻഗണന നൽകുക! (കോഡ് ബ്ലോക്ക് 3)
```python
env.reset()
for i in range(100):
env.render()
env.step(env.action_space.sample())
env.close()
```
നിങ്ങൾക്ക് ഈ ചിത്രത്തോട് സാമ്യമുള്ള ഒന്നും കാണാം:
![non-balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif)
1. സിമുലേഷനിൽ, പ്രവർത്തിക്കാൻ തീരുമാനിക്കാൻ അവലോകനങ്ങൾ ലഭിക്കണം. സ്റ്റെപ്പ് ഫംഗ്ഷൻ നിലവിലെ അവലോകനങ്ങൾ, ഒരു റിവാർഡ് ഫംഗ്ഷൻ, സിമുലേഷൻ തുടരേണ്ടതുണ്ടോ എന്ന സൂചിപ്പിക്കുന്ന ഡൺ ഫ്ലാഗ് എന്നിവ തിരികെ നൽകുന്നു: (കോഡ് ബ്ലോക്ക് 4)
```python
env.reset()
done = False
while not done:
env.render()
obs, rew, done, info = env.step(env.action_space.sample())
print(f"{obs} -> {rew}")
env.close()
```
നിങ്ങൾക്ക് നോട്ട്‌ബുക്കിന്റെ ഔട്ട്പുട്ടിൽ ഇങ്ങനെ ഒന്നും കാണാം:
```text
[ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0
[ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0
[ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0
[ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0
[ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0
...
[ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0
[ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0
```
സിമുലേഷന്റെ ഓരോ ഘട്ടത്തിലും തിരികെ ലഭിക്കുന്ന അവലോകന വെക്ടറിൽ താഴെ പറയുന്ന മൂല്യങ്ങൾ അടങ്ങിയിരിക്കുന്നു:
- കാർട്ടിന്റെ സ്ഥാനം
- കാർട്ടിന്റെ വേഗത
- പോളിന്റെ കോണം
- പോളിന്റെ റൊട്ടേഷൻ നിരക്ക്
1. ആ സംഖ്യകളുടെ കുറഞ്ഞതും പരമാവധി മൂല്യവും കണ്ടെത്തുക: (കോഡ് ബ്ലോക്ക് 5)
```python
print(env.observation_space.low)
print(env.observation_space.high)
```
ഓരോ സിമുലേഷൻ ഘട്ടത്തിലും റിവാർഡ് മൂല്യം എല്ലായ്പ്പോഴും 1 ആണെന്ന് നിങ്ങൾ ശ്രദ്ധിക്കാം. കാരണം നമ്മുടെ ലക്ഷ്യം όσο സാധ്യമായും ദൈർഘ്യമേറിയ കാലം പോളിനെ ശരിയായ നിലയിൽ നിലനിർത്തിയാണ്.
✅ യഥാർത്ഥത്തിൽ, കാർട്ട്‌പോൾ സിമുലേഷൻ 100 തുടർച്ചയായ പരീക്ഷണങ്ങളിൽ ശരാശരി 195 റിവാർഡ് നേടുമ്പോൾ പരിഹരിച്ചതായി കണക്കാക്കുന്നു.
## അവസ്ഥ വ്യത്യസ്തീകരണം
Q-ലേണിങ്ങിൽ, ഓരോ അവസ്ഥയിലും എന്ത് ചെയ്യണമെന്ന് നിർവചിക്കുന്ന Q-ടേബിൾ നിർമ്മിക്കണം. ഇത് സാധ്യമാക്കാൻ, അവസ്ഥ **വ്യത്യസ്തമായ** (discrete) ആയിരിക്കണം, അതായത് പരിമിതമായ വ്യത്യസ്ത മൂല്യങ്ങൾ അടങ്ങിയിരിക്കണം. അതിനാൽ, നാം നമ്മുടെ അവലോകനങ്ങളെ **വ്യത്യസ്തമാക്കണം**, അവയെ പരിമിതമായ അവസ്ഥകളുടെ സെറ്റിലേക്ക് മാപ്പ് ചെയ്യണം.
ഇതിന് ചില മാർഗ്ഗങ്ങൾ ഉണ്ട്:
- **ബിൻസായി വിഭജിക്കുക**. ഒരു മൂല്യത്തിന്റെ ഇടവേള അറിയാമെങ്കിൽ, ആ ഇടവേളയെ പല **ബിൻസായി** വിഭജിച്ച്, മൂല്യം അതിന്റെ ബിൻ നമ്പറിലൂടെ മാറ്റാം. ഇത് numpy-യുടെ [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) മെത്തഡ് ഉപയോഗിച്ച് ചെയ്യാം. ഈ രീതിയിൽ, നാം തിരഞ്ഞെടുക്കുന്ന ബിൻസിന്റെ എണ്ണം അനുസരിച്ച് അവസ്ഥയുടെ വലുപ്പം കൃത്യമായി അറിയാം.
✅ നാം ലീനിയർ ഇന്റർപൊളേഷൻ ഉപയോഗിച്ച് മൂല്യങ്ങളെ ഒരു പരിമിത ഇടവേളയിലേക്ക് (ഉദാ. -20 മുതൽ 20 വരെ) കൊണ്ടുവരാം, പിന്നെ സംഖ്യകളെ റൗണ്ടുചെയ്ത് പൂർണ്ണസംഖ്യകളാക്കി മാറ്റാം. ഇത് അവസ്ഥയുടെ വലുപ്പത്തെ കുറച്ച് കുറച്ച് നിയന്ത്രണം നൽകുന്നു, പ്രത്യേകിച്ച് ഇൻപുട്ട് മൂല്യങ്ങളുടെ കൃത്യമായ പരിധികൾ അറിയാത്തപ്പോൾ. ഉദാഹരണത്തിന്, നമ്മുടെ കേസിൽ 4 മൂല്യങ്ങളിൽ 2-ന് മുകളിൽ/താഴെ പരിധി ഇല്ല, അതിനാൽ അവസ്ഥകളുടെ അനന്തമായ എണ്ണം ഉണ്ടാകാം.
നമ്മുടെ ഉദാഹരണത്തിൽ, നാം രണ്ടാം സമീപനം സ്വീകരിക്കും. പിന്നീട് നിങ്ങൾ ശ്രദ്ധിക്കാം, നിർവചിക്കപ്പെട്ട മുകളിൽ/താഴെ പരിധികൾ ഇല്ലെങ്കിലും, ആ മൂല്യങ്ങൾ സാധാരണയായി ചില പരിമിത ഇടവേളകൾക്കുള്ളിൽ മാത്രമേ വരൂ, അതിനാൽ അത്യന്തം മൂല്യങ്ങളുള്ള അവസ്ഥകൾ വളരെ അപൂർവമാണ്.
1. ഇവിടെ ഒരു ഫംഗ്ഷൻ ഉണ്ട്, ഇത് നമ്മുടെ മോഡലിൽ നിന്നുള്ള അവലോകനം സ്വീകരിച്ച് 4 പൂർണ്ണസംഖ്യകളുടെ ട്യൂപ്പിൾ നൽകും: (കോഡ് ബ്ലോക്ക് 6)
```python
def discretize(x):
return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int))
```
1. ബിൻസുകൾ ഉപയോഗിച്ച് മറ്റൊരു വ്യത്യസ്തീകരണ രീതി പരിശോധിക്കാം: (കോഡ് ബ്ലോക്ക് 7)
```python
def create_bins(i,num):
return np.arange(num+1)*(i[1]-i[0])/num+i[0]
print("Sample bins for interval (-5,5) with 10 bins\n",create_bins((-5,5),10))
ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # ഓരോ പാരാമീറ്ററിനും മൂല്യങ്ങളുടെ ഇടവേളകൾ
nbins = [20,20,10,10] # ഓരോ പാരാമീറ്ററിനും ബിൻസുകളുടെ എണ്ണം
bins = [create_bins(ints[i],nbins[i]) for i in range(4)]
def discretize_bins(x):
return tuple(np.digitize(x[i],bins[i]) for i in range(4))
```
1. ഇപ്പോൾ ഒരു ചെറിയ സിമുലേഷൻ ഓടിച്ച് ആ വ്യത്യസ്ത പരിസ്ഥിതി മൂല്യങ്ങൾ കാണാം. `discretize` ഉം `discretize_bins` ഉം രണ്ടും പരീക്ഷിച്ച് വ്യത്യാസമുണ്ടോ എന്ന് നോക്കാം.
✅ discretize_bins ബിൻ നമ്പർ (0-ആധാരിതം) തിരികെ നൽകുന്നു. അതിനാൽ ഇൻപുട്ട് മൂല്യങ്ങൾ 0-നു സമീപം ഉള്ളപ്പോൾ ഇടവേളയുടെ മധ്യത്തിലെ നമ്പർ (10) നൽകും. discretize-ൽ, ഔട്ട്പുട്ട് മൂല്യങ്ങളുടെ പരിധി പരിഗണിച്ചില്ല, അവ നെഗറ്റീവ് ആകാമെന്ന് അനുവദിച്ചു, അതിനാൽ അവസ്ഥ മൂല്യങ്ങൾ മാറ്റം വരുത്തിയിട്ടില്ല, 0 0-നു തുല്യമാണ്. (കോഡ് ബ്ലോക്ക് 8)
```python
env.reset()
done = False
while not done:
#env.render()
obs, rew, done, info = env.step(env.action_space.sample())
#print(discretize_bins(obs))
print(discretize(obs))
env.close()
```
✅ പരിസ്ഥിതി എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്ന് കാണാൻ env.render ആരംഭിക്കുന്ന വരി അൺകമ്മന്റ് ചെയ്യാം. അല്ലെങ്കിൽ ഇത് പശ്ചാത്തലത്തിൽ ഓടിക്കാം, അത് വേഗമാണ്. നാം Q-ലേണിംഗ് പ്രക്രിയയിൽ ഈ "അദൃശ്യ" പ്രവർത്തനം ഉപയോഗിക്കും.
## Q-ടേബിൾ ഘടന
മുൻപത്തെ പാഠത്തിൽ, അവസ്ഥ 0 മുതൽ 8 വരെ ഉള്ള ലളിതമായ സംഖ്യകളുടെ ജോഡിയായിരുന്നു, അതിനാൽ 8x8x2 ആകൃതിയിലുള്ള numpy ടെൻസർ ഉപയോഗിച്ച് Q-ടേബിൾ പ്രതിനിധാനം ചെയ്യുന്നത് സൗകര്യപ്രദമായിരുന്നു. ബിൻസുകൾ ഉപയോഗിച്ച വ്യത്യസ്തീകരണം ഉപയോഗിച്ചാൽ, അവസ്ഥ വെക്ടറിന്റെ വലുപ്പവും അറിയാം, അതിനാൽ 20x20x10x10x2 ആകൃതിയിലുള്ള അറേ ഉപയോഗിച്ച് അവസ്ഥ പ്രതിനിധാനം ചെയ്യാം (ഇവിടെ 2 പ്രവർത്തന സ്ഥലം ഡൈമെൻഷനാണ്, ആദ്യ ഡൈമെൻഷനുകൾ അവലോകന സ്ഥലത്തിലെ ഓരോ പാരാമീറ്ററിനും തിരഞ്ഞെടുക്കപ്പെട്ട ബിൻസുകളുടെ എണ്ണം).
എങ്കിലും, ചിലപ്പോൾ അവലോകന സ്ഥലത്തിന്റെ കൃത്യമായ അളവുകൾ അറിയാത്തതായിരിക്കും. `discretize` ഫംഗ്ഷന്റെ കേസിൽ, ചില മൂല്യങ്ങൾക്ക് പരിധി ഇല്ലാത്തതിനാൽ, നമ്മുടെ അവസ്ഥ നിശ്ചിത പരിധികളിൽ തന്നെ ഉണ്ടാകുമെന്ന് ഉറപ്പില്ല. അതിനാൽ, നാം Q-ടേബിൾ ഒരു ഡിക്ഷണറിയായി പ്രതിനിധാനം ചെയ്യാം.
1. *(state,action)* എന്ന ജോഡി ഡിക്ഷണറി കീ ആയി ഉപയോഗിക്കുക, മൂല്യം Q-ടേബിൾ എൻട്രി മൂല്യമായി. (കോഡ് ബ്ലോക്ക് 9)
```python
Q = {}
actions = (0,1)
def qvalues(state):
return [Q.get((state,a),0) for a in actions]
```
ഇവിടെ `qvalues()` എന്ന ഫംഗ്ഷനും നിർവചിച്ചിരിക്കുന്നു, ഇത് ഒരു നൽകിയ അവസ്ഥയ്ക്കുള്ള എല്ലാ സാധ്യമായ പ്രവർത്തനങ്ങൾക്കുള്ള Q-ടേബിൾ മൂല്യങ്ങളുടെ പട്ടിക തിരികെ നൽകുന്നു. എൻട്രി Q-ടേബിളിൽ ഇല്ലെങ്കിൽ, നാം 0 ഡിഫോൾട്ട് ആയി നൽകും.
## Q-ലേണിംഗ് ആരംഭിക്കാം
ഇപ്പോൾ പീറ്ററിനെ ബാലൻസ് ചെയ്യാൻ പഠിപ്പിക്കാൻ തയ്യാറാണ്!
1. ആദ്യം, ചില ഹൈപ്പർപാരാമീറ്ററുകൾ സജ്ജമാക്കാം: (കോഡ് ബ്ലോക്ക് 10)
```python
# ഹൈപ്പർപാരാമീറ്ററുകൾ
alpha = 0.3
gamma = 0.9
epsilon = 0.90
```
ഇവിടെ, `alpha` എന്നത് **ലേണിംഗ് റേറ്റ്** ആണ്, ഓരോ ഘട്ടത്തിലും Q-ടേബിളിലെ നിലവിലെ മൂല്യങ്ങൾ എത്രമാത്രം ക്രമീകരിക്കണമെന്ന് നിർവചിക്കുന്നു. മുൻപത്തെ പാഠത്തിൽ നാം 1-ൽ ആരംഭിച്ച് പരിശീലനത്തിനിടെ `alpha` കുറച്ചു. ഈ ഉദാഹരണത്തിൽ, ലളിതത്വത്തിനായി ഇത് സ്ഥിരമായി വയ്ക്കും, പിന്നീട് `alpha` ക്രമീകരിച്ച് പരീക്ഷിക്കാം.
`gamma` എന്നത് **ഡിസ്‌കൗണ്ട് ഫാക്ടർ** ആണ്, ഭാവിയിലെ റിവാർഡിനെ നിലവിലെ റിവാർഡിനേക്കാൾ എത്രമാത്രം മുൻഗണന നൽകണമെന്ന് കാണിക്കുന്നു.
`epsilon` എന്നത് **എക്സ്പ്ലോറേഷൻ/എക്സ്പ്ലോയിറ്റേഷൻ ഫാക്ടർ** ആണ്, എക്സ്പ്ലോറേഷൻ (പുതിയ കാര്യങ്ങൾ പരീക്ഷിക്കൽ) മുൻഗണന നൽകണോ എക്സ്പ്ലോയിറ്റേഷൻ (ഇപ്പോൾ അറിയുന്ന മികച്ച പ്രവർത്തനം തിരഞ്ഞെടുക്കൽ) മുൻഗണന നൽകണോ എന്ന് നിർവചിക്കുന്നു. നമ്മുടെ ആൽഗോരിതത്തിൽ, `epsilon` ശതമാനത്തിൽ നാം Q-ടേബിൾ മൂല്യങ്ങൾ അനുസരിച്ച് പ്രവർത്തനം തിരഞ്ഞെടുക്കും, ബാക്കി സമയങ്ങളിൽ യാദൃച്ഛിക പ്രവർത്തനം നടത്തും. ഇതിലൂടെ നാം മുമ്പ് കാണാത്ത തിരയൽ പ്രദേശങ്ങൾ പരിശോധിക്കാം.
✅ ബാലൻസിംഗിന്റെ കാര്യത്തിൽ - യാദൃച്ഛിക പ്രവർത്തനം (എക്സ്പ്ലോറേഷൻ) തെറ്റായ ദിശയിൽ ഒരു പഞ്ച് പോലെയാണ്, പോൾ അവിടെ നിന്നു ബാലൻസ് വീണ്ടെടുക്കാൻ പഠിക്കണം.
### ആൽഗോരിതം മെച്ചപ്പെടുത്തുക
മുൻപത്തെ പാഠത്തിലെ ആൽഗോരിതത്തിൽ നാം രണ്ട് മെച്ചപ്പെടുത്തലുകൾ ചെയ്യാം:
- **ശരാശരി സമാഹാര റിവാർഡ് കണക്കാക്കുക**, പല സിമുലേഷനുകളിലായി. ഓരോ 5000 ഇറ്ററേഷനിലും പുരോഗതി പ്രിന്റ് ചെയ്യും, ആ കാലയളവിൽ സമാഹാര റിവാർഡ് ശരാശരി കണക്കാക്കും. 195-ൽ കൂടുതൽ പോയിന്റ് കിട്ടിയാൽ പ്രശ്നം പരിഹരിച്ചതായി കണക്കാക്കാം, ആവശ്യത്തിനേക്കാൾ ഉയർന്ന ഗുണമേന്മയോടെ.
- **പരമാവധി ശരാശരി സമാഹാര ഫലം** `Qmax` കണക്കാക്കുക, ആ ഫലത്തിന് അനുയോജ്യമായ Q-ടേബിൾ സൂക്ഷിക്കുക. പരിശീലനത്തിൽ ചിലപ്പോൾ ശരാശരി ഫലം കുറയാൻ തുടങ്ങും, അതിനാൽ മികച്ച മോഡലിന്റെ Q-ടേബിൾ മൂല്യങ്ങൾ സൂക്ഷിക്കണം.
1. ഓരോ സിമുലേഷനിലും സമാഹാര റിവാർഡുകൾ `rewards` വെക്ടറിൽ ശേഖരിക്കുക, പിന്നീട് പ്ലോട്ടിംഗിനായി. (കോഡ് ബ്ലോക്ക് 11)
```python
def probs(v,eps=1e-4):
v = v-v.min()+eps
v = v/v.sum()
return v
Qmax = 0
cum_rewards = []
rewards = []
for epoch in range(100000):
obs = env.reset()
done = False
cum_reward=0
# == സിമുലേഷൻ നടത്തുക ==
while not done:
s = discretize(obs)
if random.random()<epsilon:
# ഉപയോഗം - Q-ടേബിൾ സാധ്യതകൾ അനുസരിച്ച് പ്രവർത്തനം തിരഞ്ഞെടുക്കുക
v = probs(np.array(qvalues(s)))
a = random.choices(actions,weights=v)[0]
else:
# അന്വേഷണശീലനം - യാദൃച്ഛികമായി പ്രവർത്തനം തിരഞ്ഞെടുക്കുക
a = np.random.randint(env.action_space.n)
obs, rew, done, info = env.step(a)
cum_reward+=rew
ns = discretize(obs)
Q[(s,a)] = (1 - alpha) * Q.get((s,a),0) + alpha * (rew + gamma * max(qvalues(ns)))
cum_rewards.append(cum_reward)
rewards.append(cum_reward)
# == കാലക്രമേണ ഫലങ്ങൾ പ്രിന്റ് ചെയ്ത് ശരാശരി പ്രതിഫലം കണക്കാക്കുക ==
if epoch%5000==0:
print(f"{epoch}: {np.average(cum_rewards)}, alpha={alpha}, epsilon={epsilon}")
if np.average(cum_rewards) > Qmax:
Qmax = np.average(cum_rewards)
Qbest = Q
cum_rewards=[]
```
ഈ ഫലങ്ങളിൽ നിന്നു നിങ്ങൾ ശ്രദ്ധിക്കാവുന്ന കാര്യങ്ങൾ:
- **ലക്ഷ്യത്തിന് അടുത്ത്**. 100+ തുടർച്ചയായ സിമുലേഷനുകളിൽ 195 സമാഹാര റിവാർഡ് നേടാനുള്ള ലക്ഷ്യത്തിന് വളരെ അടുത്ത് നാം എത്തി, അല്ലെങ്കിൽ അത് നേടിയിട്ടുണ്ടാകാം! ചെറിയ സംഖ്യകൾ കിട്ടിയാലും, നാം 5000 റൺസിന്റെ ശരാശരി കണക്കാക്കുന്നു, ഔദ്യോഗിക മാനദണ്ഡം 100 റൺസ് മാത്രം ആവശ്യമാണ്.
- **റിവാർഡ് കുറയാൻ തുടങ്ങുന്നു**. ചിലപ്പോൾ റിവാർഡ് കുറയാൻ തുടങ്ങും, അതായത് നാം Q-ടേബിളിലെ പഠിച്ച മൂല്യങ്ങളെ "നശിപ്പിച്ച്" അവസ്ഥ മോശമാക്കുന്ന മൂല്യങ്ങൾ ചേർക്കുന്നു.
ഈ നിരീക്ഷണം പരിശീലന പുരോഗതി പ്ലോട്ട് ചെയ്താൽ കൂടുതൽ വ്യക്തമായി കാണാം.
## പരിശീലന പുരോഗതി പ്ലോട്ടിംഗ്
പരിശീലനത്തിനിടെ, ഓരോ ഇറ്ററേഷനിലും സമാഹാര റിവാർഡ് മൂല്യം `rewards` വെക്ടറിൽ ശേഖരിച്ചിട്ടുണ്ട്. ഇറ്ററേഷൻ നമ്പറിനോട് താരതമ്യം ചെയ്ത് പ്ലോട്ട് ചെയ്താൽ ഇങ്ങനെ കാണാം:
```python
plt.plot(rewards)
```
![raw progress](../../../../translated_images/train_progress_raw.2adfdf2daea09c596fc786fa347a23e9aceffe1b463e2257d20a9505794823ec.ml.png)
ഈ ഗ്രാഫിൽ ഒന്നും വ്യക്തമാക്കാൻ കഴിയില്ല, കാരണം സ്റ്റോക്കാസ്റ്റിക് പരിശീലന പ്രക്രിയയുടെ സ്വഭാവം മൂലം പരിശീലന സെഷനുകളുടെ ദൈർഘ്യം വളരെ വ്യത്യാസപ്പെടുന്നു. ഈ ഗ്രാഫിന്റെ അർത്ഥം മനസ്സിലാക്കാൻ, നാം 100 പരീക്ഷണങ്ങളുടെ **റണ്ണിംഗ് ശരാശരി** കണക്കാക്കാം. ഇത് `np.convolve` ഉപയോഗിച്ച് എളുപ്പത്തിൽ ചെയ്യാം: (കോഡ് ബ്ലോക്ക് 12)
```python
def running_average(x,window):
return np.convolve(x,np.ones(window)/window,mode='valid')
plt.plot(running_average(rewards,100))
```
![training progress](../../../../translated_images/train_progress_runav.c71694a8fa9ab35935aff6f109e5ecdfdbdf1b0ae265da49479a81b5fae8f0aa.ml.png)
## ഹൈപ്പർപാരാമീറ്ററുകൾ മാറ്റി പരീക്ഷിക്കൽ
പഠനം കൂടുതൽ സ്ഥിരതയുള്ളതാക്കാൻ, പരിശീലനത്തിനിടെ ചില ഹൈപ്പർപാരാമീറ്ററുകൾ ക്രമീകരിക്കുന്നത് ഉചിതമാണ്. പ്രത്യേകിച്ച്:
- **ലേണിംഗ് റേറ്റ്** `alpha`-യെ 1-നു സമീപം ആരംഭിച്ച് പിന്നീട് കുറയ്ക്കാം. സമയം കഴിഞ്ഞ് Q-ടേബിളിൽ നല്ല സാധ്യത മൂല്യങ്ങൾ ലഭിക്കും, അതിനാൽ അവയെ ചെറിയ തോതിൽ ക്രമീകരിക്കണം, പൂർണ്ണമായും മാറ്റരുത്.
- **epsilon വർദ്ധിപ്പിക്കുക**. കുറച്ച് എക്സ്പ്ലോറേഷൻ കുറച്ച് എക്സ്പ്ലോയിറ്റേഷൻ കൂടുതൽ ആക്കാൻ `epsilon` മന്ദഗതിയിൽ വർദ്ധിപ്പിക്കാം. കുറഞ്ഞ മൂല്യത്തിൽ ആരംഭിച്ച് ഏകദേശം 1 വരെ എത്തിക്കുക ഉചിതമാണ്.
> **ടാസ്‌ക് 1**: ഹൈപ്പർപാരാമീറ്റർ മൂല്യങ്ങളുമായി പരീക്ഷിച്ച് ഉയർന്ന സമാഹാര റിവാർഡ് നേടാമോ എന്ന് നോക്കുക. 195-ൽ മുകളിൽ എത്തുന്നുണ്ടോ?
> **ടാസ്‌ക് 2**: പ്രശ്നം ഔപചാരികമായി പരിഹരിക്കാൻ, 100 തുടർച്ചയായ റൺസിൽ ശരാശരി 195 റിവാർഡ് നേടണം. പരിശീലനത്തിനിടെ അത് അളക്കുകയും പ്രശ്നം ഔപചാരികമായി പരിഹരിച്ചതായി ഉറപ്പാക്കുകയും ചെയ്യുക!
## ഫലങ്ങൾ പ്രവർത്തനത്തിൽ കാണുക
പരിശീലിച്ച മോഡൽ എങ്ങനെ പെരുമാറുന്നു എന്ന് യഥാർത്ഥത്തിൽ കാണുന്നത് രസകരമായിരിക്കും. സിമുലേഷൻ നടത്തുകയും പരിശീലനത്തിനിടെ ഉപയോഗിച്ച പ്രവർത്തന തിരഞ്ഞെടുപ്പ് തന്ത്രം പിന്തുടരുകയും ചെയ്യാം, Q-ടേബിളിലെ പ്രൊബബിലിറ്റി വിതരണത്തിന് അനുസരിച്ച് സാമ്പിൾ ചെയ്യുക: (കോഡ് ബ്ലോക്ക് 13)
```python
obs = env.reset()
done = False
while not done:
s = discretize(obs)
env.render()
v = probs(np.array(qvalues(s)))
a = random.choices(actions,weights=v)[0]
obs,_,done,_ = env.step(a)
env.close()
```
നിങ്ങൾക്ക് ഇങ്ങനെ ഒന്നൊന്നായി കാണാം:
![a balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif)
---
## 🚀ചലഞ്ച്
> **ടാസ്‌ക് 3**: ഇവിടെ, നാം Q-ടേബിളിന്റെ അന്തിമ പകർപ്പ് ഉപയോഗിച്ചിരുന്നു, അത് ഏറ്റവും മികച്ചതായിരിക്കണമെന്നില്ല. നാം മികച്ച പ്രകടനം കാഴ്ചവച്ച Q-ടേബിൾ `Qbest` വേരിയബിളിൽ സൂക്ഷിച്ചിട്ടുണ്ടെന്ന് ഓർക്കുക! `Qbest`-നെ `Q`-ലേക്ക് പകർത്തി ഏറ്റവും മികച്ച Q-ടേബിൾ ഉപയോഗിച്ച് അതേ ഉദാഹരണം പരീക്ഷിച്ച് വ്യത്യാസം ശ്രദ്ധിക്കുക.
> **ടാസ്‌ക് 4**: ഇവിടെ നാം ഓരോ ഘട്ടത്തിലും ഏറ്റവും മികച്ച പ്രവർത്തനം തിരഞ്ഞെടുക്കുന്നില്ല, മറിച്ച് അനുയോജ്യമായ പ്രൊബബിലിറ്റി വിതരണത്തിന് അനുസരിച്ച് സാമ്പിൾ ചെയ്യുന്നു. ഏറ്റവും ഉയർന്ന Q-ടേബിൾ മൂല്യമുള്ള ഏറ്റവും മികച്ച പ്രവർത്തനം എപ്പോഴും തിരഞ്ഞെടുക്കുന്നത് കൂടുതൽ ബുദ്ധിമുട്ടുള്ളതായിരിക്കും? ഇത് `np.argmax` ഫംഗ്ഷൻ ഉപയോഗിച്ച് ഏറ്റവും ഉയർന്ന Q-ടേബിൾ മൂല്യത്തിന് അനുയോജ്യമായ പ്രവർത്തന നമ്പർ കണ്ടെത്തി ചെയ്യാം. ഈ തന്ത്രം നടപ്പിലാക്കി ബാലൻസിംഗ് മെച്ചപ്പെടുന്നുണ്ടോ എന്ന് നോക്കുക.
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അസൈൻമെന്റ്
[Train a Mountain Car](assignment.md)
## നിഗമനം
നാം ഇപ്പോൾ ഏജന്റുകളെ മികച്ച ഫലങ്ങൾ നേടാൻ പരിശീലിപ്പിക്കുന്നത് എങ്ങനെ എന്നത് പഠിച്ചു, അത് ഗെയിമിന്റെ ആഗ്രഹിക്കുന്ന അവസ്ഥ നിർവചിക്കുന്ന റിവാർഡ് ഫംഗ്ഷൻ നൽകിയും, തിരയൽ സ്ഥലം ബുദ്ധിമുട്ടോടെ അന്വേഷിക്കാൻ അവസരം നൽകിയും ആണ്. നാം Q-ലേണിംഗ് ആൽഗോരിതം ഡിസ്ക്രീറ്റ്, തുടർച്ചയായ പരിസ്ഥിതികളിൽ വിജയകരമായി പ്രയോഗിച്ചു, പക്ഷേ ഡിസ്ക്രീറ്റ് പ്രവർത്തനങ്ങളോടെയാണ്.
പ്രവർത്തനാവസ്ഥയും തുടർച്ചയായതായ സാഹചര്യങ്ങളും, അതുപോലെ ആറ്റാരി ഗെയിം സ്ക്രീനിലെ ചിത്രം പോലുള്ള കൂടുതൽ സങ്കീർണ്ണമായ നിരീക്ഷണ സ്ഥലം ഉള്ള സാഹചര്യങ്ങളും പഠിക്കുന്നത് പ്രധാനമാണ്. അത്തരത്തിലുള്ള പ്രശ്നങ്ങളിൽ നല്ല ഫലങ്ങൾ നേടാൻ നാം സാധാരണയായി ന്യുറൽ നെറ്റ്‌വർക്കുകൾ പോലുള്ള ശക്തമായ മെഷീൻ ലേണിംഗ് സാങ്കേതികവിദ്യകൾ ഉപയോഗിക്കേണ്ടിവരും. ആധികാരികമായ ഈ വിഷയങ്ങൾ നമ്മുടെ വരാനിരിക്കുന്ന കൂടുതൽ ആധുനിക AI കോഴ്സിന്റെ വിഷയം ആണ്.
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, യന്ത്രം ചെയ്ത വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ വ്യാഖ്യാനക്കേടുകൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,59 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1f2b7441745eb52e25745423b247016b",
"translation_date": "2025-12-19T15:42:43+00:00",
"source_file": "8-Reinforcement/2-Gym/assignment.md",
"language_code": "ml"
}
-->
# ട്രെയിൻ മൗണ്ടൻ കാർ
[OpenAI Gym](http://gym.openai.com) എല്ലാ പരിസ്ഥിതികളും ഒരേ API നൽകുന്ന വിധത്തിൽ രൂപകൽപ്പന ചെയ്തിരിക്കുന്നു - അഥവാ ഒരേ രീതിയിലുള്ള `reset`, `step` , `render` മെത്തഡുകളും **action space** , **observation space** എന്നിവയുടെ ഒരേ ആബ്സ്ട്രാക്ഷനുകളും. അതിനാൽ, കുറഞ്ഞ കോഡ് മാറ്റങ്ങളോടെ വ്യത്യസ്ത പരിസ്ഥിതികളിൽ ഒരേ reinforcement learning ആൽഗോരിതങ്ങൾ ഉപയോഗിക്കാൻ സാധിക്കണം.
## ഒരു മൗണ്ടൻ കാർ പരിസ്ഥിതി
[Mountain Car environment](https://gym.openai.com/envs/MountainCar-v0/) ഒരു താഴ്വരയിൽ കുടുങ്ങിയ ഒരു കാർ ഉൾക്കൊള്ളുന്നു:
<img src="../../../../translated_images/mountaincar.43d56e588ce581c2d035f28cf038a9af112bec043b2ef8da40ac86119b1e3a93.ml.png" width="300"/>
ലക്ഷ്യം താഴ്വരയിൽ നിന്ന് പുറത്തുകടക്കുകയും പതാക പിടിക്കുകയും ചെയ്യുക ആണ്, ഓരോ ഘട്ടത്തിലും താഴെപ്പറയുന്ന പ്രവർത്തനങ്ങളിൽ ഒന്നും ചെയ്യുക:
| Value | അർത്ഥം |
|---|---|
| 0 | ഇടത്തേക്ക് വേഗം കൂട്ടുക |
| 1 | വേഗം കൂട്ടരുത് |
| 2 | വലത്തേക്ക് വേഗം കൂട്ടുക |
എന്നാൽ ഈ പ്രശ്നത്തിന്റെ പ്രധാന തന്ത്രം, കാർ എഞ്ചിൻ മൗണ്ടൻ ഒരു തവണയിൽ കയറിയെത്താൻ മതിയായ ശക്തിയുള്ളതല്ല എന്നതാണ്. അതിനാൽ വിജയിക്കാൻ ഏക മാർഗം മുന്നോട്ടും പിന്നോട്ടും ഓടിച്ച് മോമെന്റം സൃഷ്ടിക്കുകയാണ്.
Observation space രണ്ട് മൂല്യങ്ങളടങ്ങിയതാണ്:
| നമ്പർ | നിരീക്ഷണം | കുറഞ്ഞത് | പരമാവധി |
|-----|--------------|-----|-----|
| 0 | കാർ സ്ഥാനം | -1.2| 0.6 |
| 1 | കാർ വേഗത | -0.07 | 0.07 |
മൗണ്ടൻ കാർക്ക് റിവാർഡ് സിസ്റ്റം വളരെ സങ്കീർണ്ണമാണ്:
* ഏജന്റ് പതാക (സ്ഥാനം = 0.5) മൗണ്ടന്റെ മുകളിൽ എത്തിച്ചേർന്നാൽ 0 റിവാർഡ് ലഭിക്കും.
* ഏജന്റിന്റെ സ്ഥാനം 0.5-ൽ കുറവായാൽ -1 റിവാർഡ് ലഭിക്കും.
കാർ സ്ഥാനം 0.5-ൽ കൂടുതലായാൽ അല്ലെങ്കിൽ എപ്പിസോഡ് ദൈർഘ്യം 200-ൽ കൂടുതലായാൽ എപ്പിസോഡ് അവസാനിക്കും.
## നിർദ്ദേശങ്ങൾ
മൗണ്ടൻ കാർ പ്രശ്നം പരിഹരിക്കാൻ നമ്മുടെ reinforcement learning ആൽഗോരിതം അനുയോജ്യമായി മാറ്റുക. നിലവിലുള്ള [notebook.ipynb](notebook.ipynb) കോഡിൽ നിന്നാരംഭിച്ച് പുതിയ പരിസ്ഥിതി ഉപയോഗിക്കുക, സ്റ്റേറ്റ് ഡിസ്ക്രീറ്റൈസേഷൻ ഫംഗ്ഷനുകൾ മാറ്റുക, കുറഞ്ഞ കോഡ് മാറ്റങ്ങളോടെ നിലവിലുള്ള ആൽഗോരിതം ട്രെയിൻ ചെയ്യാൻ ശ്രമിക്കുക. ഹൈപ്പർപാരാമീറ്ററുകൾ ക്രമീകരിച്ച് ഫലം മെച്ചപ്പെടുത്തുക.
> **കുറിപ്പ്**: ആൽഗോരിതം കൺവെർജ് ചെയ്യാൻ ഹൈപ്പർപാരാമീറ്ററുകൾ ക്രമീകരിക്കേണ്ടതുണ്ടാകാം.
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണമായത് | യോജിച്ചത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | --------- | -------- | ----------------- |
| | Q-Learning ആൽഗോരിതം CartPole ഉദാഹരണത്തിൽ നിന്നു കുറഞ്ഞ കോഡ് മാറ്റങ്ങളോടെ വിജയകരമായി അനുയോജ്യമായി മാറ്റിയിട്ടുണ്ട്, 200 ഘട്ടത്തിനുള്ളിൽ പതാക പിടിക്കുന്ന പ്രശ്നം പരിഹരിക്കാൻ കഴിയും. | ഇന്റർനെറ്റിൽ നിന്നുള്ള പുതിയ Q-Learning ആൽഗോരിതം സ്വീകരിച്ചിട്ടുണ്ടെങ്കിലും നന്നായി രേഖപ്പെടുത്തിയിട്ടുണ്ട്; അല്ലെങ്കിൽ നിലവിലുള്ള ആൽഗോരിതം സ്വീകരിച്ചിട്ടുണ്ടെങ്കിലും ആഗ്രഹിച്ച ഫലം ലഭിച്ചിട്ടില്ല | വിദ്യാർത്ഥി യാതൊരു ആൽഗോരിതവും വിജയകരമായി സ്വീകരിക്കാൻ കഴിഞ്ഞില്ല, പക്ഷേ പരിഹാരത്തിലേക്ക് ഗണ്യമായ മുന്നേറ്റങ്ങൾ (സ്റ്റേറ്റ് ഡിസ്ക്രീറ്റൈസേഷൻ, Q-ടേബിൾ ഡാറ്റാ ഘടന എന്നിവ നടപ്പിലാക്കൽ) നടത്തിയിട്ടുണ്ട് |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ വ്യാഖ്യാനക്കേടുകൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

File diff suppressed because one or more lines are too long

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-12-19T15:53:46+00:00",
"source_file": "8-Reinforcement/2-Gym/solution/Julia/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡറാണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-12-19T15:54:18+00:00",
"source_file": "8-Reinforcement/2-Gym/solution/R/README.md",
"language_code": "ml"
}
-->
ഇത് ഒരു താൽക്കാലിക പ്ലേസ്ഹോൾഡറാണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

File diff suppressed because one or more lines are too long

@ -0,0 +1,69 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "20ca019012b1725de956681d036d8b18",
"translation_date": "2025-12-19T13:08:30+00:00",
"source_file": "8-Reinforcement/README.md",
"language_code": "ml"
}
-->
# റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിങ്ങിലേക്ക് പരിചയം
റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ്, RL, സൂപ്പർവൈസ്ഡ് ലേണിംഗിനും അൺസൂപ്പർവൈസ്ഡ് ലേണിംഗിനും അടുത്തുള്ള അടിസ്ഥാന മെഷീൻ ലേണിംഗ് പാരഡൈംസ് ഒന്നായി കാണപ്പെടുന്നു. RL തീരുമാനങ്ങളുമായി ബന്ധപ്പെട്ടതാണ്: ശരിയായ തീരുമാനങ്ങൾ നൽകുക അല്ലെങ്കിൽ കുറഞ്ഞത് അവയിൽ നിന്ന് പഠിക്കുക.
നിങ്ങൾക്ക് സ്റ്റോക്ക് മാർക്കറ്റ് പോലൊരു സിമുലേറ്റഡ് പരിസ്ഥിതി ഉണ്ടെന്ന് കരുതുക. ഒരു നിശ്ചിത നിയന്ത്രണം ഏർപ്പെടുത്തുകയാണെങ്കിൽ എന്ത് സംഭവിക്കും? അത് പോസിറ്റീവ് ഫലമോ നെഗറ്റീവ് ഫലമോ ഉണ്ടാക്കുമോ? എന്തെങ്കിലും നെഗറ്റീവ് സംഭവിച്ചാൽ, നിങ്ങൾക്ക് ഈ _നെഗറ്റീവ് റീഇൻഫോഴ്സ്മെന്റ്_ സ്വീകരിച്ച് അതിൽ നിന്ന് പഠിച്ച് ദിശ മാറ്റണം. അത് പോസിറ്റീവ് ഫലമായാൽ, നിങ്ങൾക്ക് ആ _പോസിറ്റീവ് റീഇൻഫോഴ്സ്മെന്റ്_ അടിസ്ഥാനമാക്കി മുന്നോട്ട് പോകണം.
![peter and the wolf](../../../translated_images/peter.779730f9ba3a8a8d9290600dcf55f2e491c0640c785af7ac0d64f583c49b8864.ml.png)
> പീറ്ററും അവന്റെ സുഹൃത്തുക്കളും വിശപ്പുള്ള വുൾഫിൽ നിന്ന് രക്ഷപ്പെടണം! ചിത്രം [Jen Looper](https://twitter.com/jenlooper) എന്നവന്റെതാണ്
## പ്രാദേശിക വിഷയം: പീറ്ററും വുൾഫും (റഷ്യ)
[Peter and the Wolf](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) റഷ്യൻ സംഗീതസംവിധായകൻ [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev) എഴുതിയ ഒരു സംഗീതപരമായ പഞ്ചതന്ത്രകഥയാണ്. ഇത് യുവ പയനിയർ പീറ്ററിനെക്കുറിച്ചുള്ള കഥയാണ്, അവൻ ധൈര്യത്തോടെ വീട്ടിൽ നിന്ന് കാട്ടിലെ തുറസ്സിലേക്ക് വുൾഫിനെ പിന്തുടരാൻ പോകുന്നു. ഈ വിഭാഗത്തിൽ, പീറ്ററിന് സഹായകമായ മെഷീൻ ലേണിംഗ് ആൽഗോരിതങ്ങൾ പരിശീലിപ്പിക്കും:
- **പരിസര പ്രദേശം** അന്വേഷിച്ച് മികച്ച നാവിഗേഷൻ മാപ്പ് നിർമ്മിക്കുക
- **സ്കേറ്റ്ബോർഡ് ഉപയോഗിച്ച്** അതിൽ ബാലൻസ് പിടിച്ച് വേഗത്തിൽ ചലിക്കാൻ പഠിക്കുക.
[![Peter and the Wolf](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM)
> 🎥 മുകളിൽ കാണുന്ന ചിത്രത്തിൽ ക്ലിക്ക് ചെയ്ത് പ്രൊകോഫിയേവിന്റെ പീറ്ററും വുൾഫും കേൾക്കൂ
## റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ്
മുൻവകുപ്പുകളിൽ, നിങ്ങൾക്ക് മെഷീൻ ലേണിംഗ് പ്രശ്നങ്ങളുടെ രണ്ട് ഉദാഹരണങ്ങൾ കാണിച്ചിട്ടുണ്ട്:
- **സൂപ്പർവൈസ്ഡ്**, ഇവിടെ നമുക്ക് പ്രശ്നം പരിഹരിക്കാൻ സാമ്പിൾ പരിഹാരങ്ങൾ സൂചിപ്പിക്കുന്ന ഡാറ്റാസെറ്റുകൾ ഉണ്ട്. [ക്ലാസിഫിക്കേഷൻ](../4-Classification/README.md)യും [റെഗ്രഷൻ](../2-Regression/README.md)യും സൂപ്പർവൈസ്ഡ് ലേണിംഗ് ടാസ്കുകളാണ്.
- **അൺസൂപ്പർവൈസ്ഡ്**, ഇവിടെ ലേബൽ ചെയ്ത പരിശീലന ഡാറ്റ ഇല്ല. അൺസൂപ്പർവൈസ്ഡ് ലേണിംഗിന്റെ പ്രധാന ഉദാഹരണം [ക്ലസ്റ്ററിംഗ്](../5-Clustering/README.md) ആണ്.
ഈ വിഭാഗത്തിൽ, ലേബൽ ചെയ്ത പരിശീലന ഡാറ്റ ആവശ്യമില്ലാത്ത പുതിയ തരത്തിലുള്ള ലേണിംഗ് പ്രശ്നം പരിചയപ്പെടുത്തും. ഇത്തരം പ്രശ്നങ്ങളുടെ പല തരങ്ങളുണ്ട്:
- **[സെമി-സൂപ്പർവൈസ്ഡ് ലേണിംഗ്](https://wikipedia.org/wiki/Semi-supervised_learning)**, ഇവിടെ നമുക്ക് പ്രീ-ട്രെയിനിംഗിന് ഉപയോഗിക്കാവുന്ന അനേകം ലേബൽ ചെയ്യാത്ത ഡാറ്റ ഉണ്ട്.
- **[റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ്](https://wikipedia.org/wiki/Reinforcement_learning)**, ഇവിടെ ഒരു ഏജന്റ് സിമുലേറ്റഡ് പരിസ്ഥിതിയിൽ പരീക്ഷണങ്ങൾ നടത്തിക്കൊണ്ട് പെരുമാറുന്നത് പഠിക്കുന്നു.
### ഉദാഹരണം - കമ്പ്യൂട്ടർ ഗെയിം
നിങ്ങൾക്ക് ഒരു കമ്പ്യൂട്ടറിനെ ചെസ് പോലുള്ള ഗെയിം കളിക്കാൻ പഠിപ്പിക്കണമെന്ന് കരുതുക, അല്ലെങ്കിൽ [സൂപ്പർ മാരിയോ](https://wikipedia.org/wiki/Super_Mario) പോലുള്ളത്. കമ്പ്യൂട്ടർ ഗെയിം കളിക്കാൻ, ഓരോ ഗെയിം സ്റ്റേറ്റിലും ഏത് നീക്കം ചെയ്യണമെന്ന് പ്രവചിക്കണം. ഇത് ക്ലാസിഫിക്കേഷൻ പ്രശ്നം പോലെ തോന്നിയേക്കാം, പക്ഷേ അത് അല്ല - കാരണം നമുക്ക് സ്റ്റേറ്റുകളും അനുബന്ധ പ്രവർത്തനങ്ങളും ഉള്ള ഡാറ്റാസെറ്റ് ഇല്ല. നിലവിലുള്ള ചെസ് മത്സരങ്ങൾ അല്ലെങ്കിൽ സൂപ്പർ മാരിയോ കളിക്കുന്ന കളിക്കാരുടെ റെക്കോർഡുകൾ പോലുള്ള ചില ഡാറ്റ ഉണ്ടാകാം, പക്ഷേ ആ ഡാറ്റ സാധ്യതയുള്ള സ്റ്റേറ്റുകളുടെ വലിയ എണ്ണം മതിയായ രീതിയിൽ ഉൾക്കൊള്ളില്ല.
നിലവിലുള്ള ഗെയിം ഡാറ്റ അന്വേഷിക്കുന്നതിന് പകരം, **റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ്** (RL) *കമ്പ്യൂട്ടർ പല തവണ കളിക്കട്ടെ* എന്ന ആശയത്തെ അടിസ്ഥാനമാക്കുന്നു, ഫലങ്ങൾ നിരീക്ഷിച്ച്. അതിനാൽ, റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ് പ്രയോഗിക്കാൻ, നമുക്ക് രണ്ട് കാര്യങ്ങൾ വേണം:
- **ഒരു പരിസ്ഥിതി**യും **ഒരു സിമുലേറ്ററും**, ഗെയിം പല തവണ കളിക്കാൻ അനുവദിക്കുന്നവ. ഈ സിമുലേറ്റർ എല്ലാ ഗെയിം നിയമങ്ങളും സാധ്യതയുള്ള സ്റ്റേറ്റുകളും പ്രവർത്തനങ്ങളും നിർവചിക്കും.
- **ഒരു റിവാർഡ് ഫംഗ്ഷൻ**, ഓരോ നീക്കത്തിലും അല്ലെങ്കിൽ ഗെയിം മുഴുവൻ എത്രത്തോളം നന്നായി ചെയ്തുവെന്ന് പറയുന്നവ.
മറ്റു മെഷീൻ ലേണിംഗ് തരംകളിൽ നിന്നും RL-ന്റെ പ്രധാന വ്യത്യാസം, RL-ൽ സാധാരണയായി ഗെയിം അവസാനിക്കാതെ നമുക്ക് ജയിച്ചോ തോറ്റോ എന്ന് അറിയില്ല എന്നതാണ്. അതിനാൽ, ഒരു പ്രത്യേക നീക്കം മാത്രം നല്ലതാണോ അല്ലയോ എന്ന് പറയാൻ കഴിയില്ല - ഗെയിം അവസാനം മാത്രമേ നമുക്ക് റിവാർഡ് ലഭിക്കൂ. നമ്മുടെ ലക്ഷ്യം അനിശ്ചിത സാഹചര്യങ്ങളിൽ മോഡൽ പരിശീലിപ്പിക്കാൻ സഹായിക്കുന്ന ആൽഗോരിതങ്ങൾ രൂപകൽപ്പന ചെയ്യുകയാണ്. നാം **Q-ലേണിംഗ്** എന്ന RL ആൽഗോരിതം പഠിക്കും.
## പാഠങ്ങൾ
1. [റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗും Q-ലേണിംഗും പരിചയം](1-QLearning/README.md)
2. [ജിം സിമുലേഷൻ പരിസ്ഥിതി ഉപയോഗിക്കൽ](2-Gym/README.md)
## ക്രെഡിറ്റുകൾ
"Introduction to Reinforcement Learning" ♥️ ഉപയോഗിച്ച് എഴുതിയത് [Dmitry Soshnikov](http://soshnikov.com) ആണ്
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,162 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "83320d6b6994909e35d830cebf214039",
"translation_date": "2025-12-19T15:07:29+00:00",
"source_file": "9-Real-World/1-Applications/README.md",
"language_code": "ml"
}
-->
# പോസ്റ്റ്‌സ്‌ക്രിപ്റ്റ്: യാഥാർത്ഥ്യ ലോകത്തിലെ മെഷീൻ ലേണിംഗ്
![യാഥാർത്ഥ്യ ലോകത്തിലെ മെഷീൻ ലേണിംഗിന്റെ സംഗ്രഹം ഒരു സ്കെച്ച്നോട്ടിൽ](../../../../translated_images/ml-realworld.26ee2746716155771f8076598b6145e6533fe4a9e2e465ea745f46648cbf1b84.ml.png)
> സ്കെച്ച്നോട്ട് [Tomomi Imura](https://www.twitter.com/girlie_mac) tarafından
ഈ പാഠ്യപദ്ധതിയിൽ, നിങ്ങൾ പരിശീലനത്തിനായി ഡാറ്റ തയ്യാറാക്കാനും മെഷീൻ ലേണിംഗ് മോഡലുകൾ സൃഷ്ടിക്കാനും നിരവധി മാർഗങ്ങൾ പഠിച്ചു. നിങ്ങൾ ക്ലാസിക് റെഗ്രഷൻ, ക്ലസ്റ്ററിംഗ്, ക്ലാസിഫിക്കേഷൻ, നാച്ചുറൽ ലാംഗ്വേജ് പ്രോസസ്സിംഗ്, ടൈം സീരീസ് മോഡലുകളുടെ ഒരു പരമ്പര നിർമ്മിച്ചു. അഭിനന്ദനങ്ങൾ! ഇപ്പോൾ, നിങ്ങൾക്ക് ഇതെല്ലാം എന്തിനാണെന്ന് അറിയാൻ ആഗ്രഹമുണ്ടാകാം... ഈ മോഡലുകൾക്ക് യാഥാർത്ഥ്യ ലോകത്തിൽ എന്തെല്ലാം പ്രയോഗങ്ങൾ ഉണ്ട്?
ഇൻഡസ്ട്രിയിൽ ആഴത്തിലുള്ള ലേണിംഗ് ഉപയോഗിക്കുന്ന AI-യുടെ വലിയ താൽപ്പര്യം ഉണ്ടാകുമ്പോഴും, ക്ലാസിക്കൽ മെഷീൻ ലേണിംഗ് മോഡലുകൾക്ക് ഇപ്പോഴും മൂല്യവത്തായ പ്രയോഗങ്ങൾ ഉണ്ട്. നിങ്ങൾക്ക് ഇന്നും ഈ ചില പ്രയോഗങ്ങൾ ഉപയോഗിക്കാം! ഈ പാഠത്തിൽ, എട്ട് വ്യത്യസ്ത വ്യവസായങ്ങളും വിഷയ-വിഭാഗങ്ങളും ഈ തരം മോഡലുകൾ അവരുടെ പ്രയോഗങ്ങൾ കൂടുതൽ പ്രകടനക്ഷമവും വിശ്വസനീയവുമാക്കി, ബുദ്ധിമുട്ടുള്ളവയും ഉപയോക്താക്കൾക്ക് മൂല്യമുള്ളവയുമാക്കാൻ എങ്ങനെ ഉപയോഗിക്കുന്നു എന്ന് പരിശോധിക്കും.
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## 💰 ഫിനാൻസ്
ഫിനാൻസ് മേഖലയ്ക്ക് മെഷീൻ ലേണിംഗിനായി നിരവധി അവസരങ്ങൾ നൽകുന്നു. ഈ മേഖലയിലെ പല പ്രശ്നങ്ങളും ML ഉപയോഗിച്ച് മോഡലാക്കി പരിഹരിക്കാനാകും.
### ക്രെഡിറ്റ് കാർഡ് തട്ടിപ്പ് കണ്ടെത്തൽ
കോഴ്സിൽ മുമ്പ് [k-means ക്ലസ്റ്ററിംഗ്](../../5-Clustering/2-K-Means/README.md) പഠിച്ചു, എന്നാൽ ഇത് ക്രെഡിറ്റ് കാർഡ് തട്ടിപ്പുമായി ബന്ധപ്പെട്ട പ്രശ്നങ്ങൾ പരിഹരിക്കാൻ എങ്ങനെ ഉപയോഗിക്കാം?
k-means ക്ലസ്റ്ററിംഗ് **ഔട്ട്‌ലൈയർ കണ്ടെത്തൽ** എന്ന ക്രെഡിറ്റ് കാർഡ് തട്ടിപ്പ് കണ്ടെത്തൽ സാങ്കേതികതയിൽ സഹായിക്കുന്നു. ഒരു ഡാറ്റാ സെറ്റിലെ നിരീക്ഷണങ്ങളിൽ ഉള്ള വ്യത്യാസങ്ങൾ അല്ലെങ്കിൽ ഔട്ട്‌ലൈറുകൾ, ക്രെഡിറ്റ് കാർഡ് സാധാരണ രീതിയിൽ ഉപയോഗിക്കപ്പെടുന്നുണ്ടോ അല്ലെങ്കിൽ എന്തെങ്കിലും അസാധാരണമുണ്ടോ എന്ന് പറയാൻ സഹായിക്കുന്നു. താഴെ നൽകിയ ലേഖനത്തിൽ കാണിച്ചിരിക്കുന്നതുപോലെ, k-means ക്ലസ്റ്ററിംഗ് ആൽഗോരിതം ഉപയോഗിച്ച് ക്രെഡിറ്റ് കാർഡ് ഡാറ്റ ക്രമീകരിച്ച് ഓരോ ഇടപാടും എത്രത്തോളം ഔട്ട്‌ലൈർ ആണെന്ന് അടിസ്ഥാനമാക്കി ഒരു ക്ലസ്റ്ററിലേക്ക് നിയോഗിക്കാം. പിന്നീട്, തട്ടിപ്പുള്ളതും നിയമപരവുമായ ഇടപാടുകൾക്കായി ഏറ്റവും അപകടകാരിയായ ക്ലസ്റ്ററുകൾ വിലയിരുത്താം.
[Reference](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf)
### സമ്പത്ത് മാനേജ്മെന്റ്
സമ്പത്ത് മാനേജ്മെന്റിൽ, വ്യക്തി അല്ലെങ്കിൽ സ്ഥാപനങ്ങൾ അവരുടെ ക്ലയന്റുകളുടെ പേരിൽ നിക്ഷേപങ്ങൾ കൈകാര്യം ചെയ്യുന്നു. ദീർഘകാലം സമ്പത്ത് നിലനിർത്താനും വളർത്താനും അവരുടെ ജോലി അത്യന്താപേക്ഷിതമാണ്, അതിനാൽ മികച്ച പ്രകടനം കാഴ്ചവെക്കുന്ന നിക്ഷേപങ്ങൾ തിരഞ്ഞെടുക്കുന്നത് അനിവാര്യമാണ്.
ഒരു നിക്ഷേപം എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്ന് വിലയിരുത്താനുള്ള ഒരു മാർഗം സ്റ്റാറ്റിസ്റ്റിക്കൽ റെഗ്രഷൻ ആണ്. [ലിനിയർ റെഗ്രഷൻ](../../2-Regression/1-Tools/README.md) ഒരു ഫണ്ട് ചില ബെഞ്ച്മാർക്കുകളോട് താരതമ്യം ചെയ്യുമ്പോൾ എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്ന് മനസ്സിലാക്കാൻ ഒരു മൂല്യവത്തായ ഉപകരണം ആണ്. റെഗ്രഷന്റെ ഫലങ്ങൾ സ്റ്റാറ്റിസ്റ്റിക്കൽ ദൃഢതയുള്ളതാണോ അല്ലയോ, അല്ലെങ്കിൽ അത് ക്ലയന്റിന്റെ നിക്ഷേപങ്ങളെ എത്രത്തോളം ബാധിക്കും എന്നതും നാം മനസ്സിലാക്കാം. കൂടുതൽ റിസ്ക് ഘടകങ്ങൾ പരിഗണിക്കുന്ന മൾട്ടി-റെഗ്രഷൻ ഉപയോഗിച്ച് നിങ്ങളുടെ വിശകലനം കൂടുതൽ വിപുലീകരിക്കാം. ഒരു പ്രത്യേക ഫണ്ടിനായി ഇത് എങ്ങനെ പ്രവർത്തിക്കുമെന്ന് കാണാൻ താഴെ നൽകിയ ലേഖനം പരിശോധിക്കുക.
[Reference](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/)
## 🎓 വിദ്യാഭ്യാസം
വിദ്യാഭ്യാസ മേഖലയിലും ML പ്രയോഗിക്കാൻ വളരെ രസകരമായ മേഖലയാണ്. പരീക്ഷകളിൽ ചതിയുണ്ടോ എന്ന് കണ്ടെത്തൽ, എസ്സേകളിൽ ചതിയുണ്ടോ എന്ന് കണ്ടെത്തൽ, അല്ലെങ്കിൽ തിരുത്തൽ പ്രക്രിയയിൽ ഉദ്ദേശ്യവുമില്ലാത്ത പക്ഷപാതം നിയന്ത്രിക്കൽ പോലുള്ള പ്രശ്നങ്ങൾ പരിഹരിക്കേണ്ടതുണ്ട്.
### വിദ്യാർത്ഥികളുടെ പെരുമാറ്റം പ്രവചിക്കൽ
ഓൺലൈൻ ഓപ്പൺ കോഴ്സ് പ്രൊവൈഡറായ [Coursera](https://coursera.com) അവരുടെ ടെക് ബ്ലോഗിൽ നിരവധി എഞ്ചിനീയറിംഗ് തീരുമാനങ്ങൾ ചർച്ച ചെയ്യുന്നു. ഈ കേസ് സ്റ്റഡിയിൽ, അവർ ഒരു റെഗ്രഷൻ ലൈൻ പ്ലോട്ട് ചെയ്ത് കുറഞ്ഞ NPS (നെറ്റ് പ്രൊമോട്ടർ സ്കോർ) റേറ്റിംഗും കോഴ്സ് നിലനിർത്തലും അല്ലെങ്കിൽ ഉപേക്ഷണവും തമ്മിലുള്ള ബന്ധം പരിശോധിക്കാൻ ശ്രമിച്ചു.
[Reference](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a)
### പക്ഷപാതം കുറയ്ക്കൽ
[Grammarly](https://grammarly.com), വാക്ക് പരിശോധിക്കുന്ന ഒരു എഴുത്ത് സഹായിയാണ്, അവരുടെ ഉൽപ്പന്നങ്ങളിൽ സങ്കീർണ്ണമായ [നാച്ചുറൽ ലാംഗ്വേജ് പ്രോസസ്സിംഗ് സിസ്റ്റങ്ങൾ](../../6-NLP/README.md) ഉപയോഗിക്കുന്നു. അവർ അവരുടെ ടെക് ബ്ലോഗിൽ മെഷീൻ ലേണിംഗിൽ ലിംഗപക്ഷപാതം എങ്ങനെ കൈകാര്യം ചെയ്തുവെന്ന് ഒരു രസകരമായ കേസ് സ്റ്റഡി പ്രസിദ്ധീകരിച്ചു, ഇത് നിങ്ങൾ ഞങ്ങളുടെ [ആമുഖ നീതിമുറി പാഠത്തിൽ](../../1-Introduction/3-fairness/README.md) പഠിച്ചിട്ടുണ്ട്.
[Reference](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/)
## 👜 റീട്ടെയിൽ
റീട്ടെയിൽ മേഖലയ്ക്ക് ML ഉപയോഗിച്ച് ഉപഭോക്തൃ യാത്ര മെച്ചപ്പെടുത്തുന്നതിൽ നിന്നും ഇൻവെന്ററി സ്റ്റോക്കിംഗ് വരെ പലവിധം പ്രയോജനങ്ങൾ ഉണ്ട്.
### ഉപഭോക്തൃ യാത്ര വ്യക്തിഗതമാക്കൽ
വെയ്ഫെയർ, ഫർണിച്ചർ പോലുള്ള ഹോം ഗുഡ്സ് വിൽക്കുന്ന ഒരു കമ്പനി, ഉപഭോക്താക്കൾക്ക് അവരുടെ രുചിക്കും ആവശ്യങ്ങൾക്കും അനുയോജ്യമായ ഉൽപ്പന്നങ്ങൾ കണ്ടെത്താൻ സഹായിക്കുന്നത് അത്യന്താപേക്ഷിതമാണ്. ഈ ലേഖനത്തിൽ, കമ്പനിയിലെ എഞ്ചിനീയർമാർ ML, NLP ഉപയോഗിച്ച് "ഉപഭോക്താക്കൾക്ക് ശരിയായ ഫലങ്ങൾ കാണിക്കുന്നതെങ്ങനെ" എന്ന് വിവരിക്കുന്നു. പ്രത്യേകിച്ച്, അവരുടെ Query Intent Engine എന്റിറ്റി എക്സ്ട്രാക്ഷൻ, ക്ലാസിഫയർ പരിശീലനം, ആസറ്റ്, അഭിപ്രായം എക്സ്ട്രാക്ഷൻ, സെന്റിമെന്റ് ടാഗിംഗ് എന്നിവ ഉപഭോക്തൃ അവലോകനങ്ങളിൽ ഉപയോഗിക്കുന്നു. ഓൺലൈൻ റീട്ടെയിലിൽ NLP എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്നതിന് ഇത് ഒരു ക്ലാസിക് ഉദാഹരണമാണ്.
[Reference](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search)
### ഇൻവെന്ററി മാനേജ്മെന്റ്
[StitchFix](https://stitchfix.com) പോലുള്ള നവീനവും ചടുലവുമായ കമ്പനികൾ, ഉപഭോക്താക്കൾക്ക് വസ്ത്രങ്ങൾ അയക്കുന്ന ബോക്സ് സേവനം, ശുപാർശകൾക്കും ഇൻവെന്ററി മാനേജ്മെന്റിനും ML-നെ ആശ്രയിക്കുന്നു. അവരുടെ സ്റ്റൈലിംഗ് ടീമുകളും മാർച്ചൻഡൈസിംഗ് ടീമുകളും ചേർന്ന് പ്രവർത്തിക്കുന്നു: "ഞങ്ങളുടെ ഒരു ഡാറ്റാ സയന്റിസ്റ്റ് ഒരു ജെനറ്റിക് ആൽഗോരിതം ഉപയോഗിച്ച് വസ്ത്രങ്ങൾ പ്രവചിക്കാൻ ശ്രമിച്ചു, ഇന്ന് നിലവിലില്ലാത്ത വിജയകരമായ വസ്ത്രം എന്തായിരിക്കും എന്ന്. അത് മാർച്ചൻഡൈസ് ടീമിന് നൽകി, ഇപ്പോൾ അവർ അത് ഒരു ഉപകരണമായി ഉപയോഗിക്കാം."
[Reference](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/)
## 🏥 ആരോഗ്യ പരിചരണം
ആരോഗ്യ പരിചരണ മേഖല ഗവേഷണ പ്രവർത്തനങ്ങൾ മെച്ചപ്പെടുത്താനും രോഗികൾ വീണ്ടും പ്രവേശിപ്പിക്കുന്നതും രോഗങ്ങൾ പടരുന്നത് തടയുന്നതും പോലുള്ള ലജിസ്റ്റിക് പ്രശ്നങ്ങൾ പരിഹരിക്കാനും ML ഉപയോഗിക്കാം.
### ക്ലിനിക്കൽ ട്രയൽ മാനേജ്മെന്റ്
ക്ലിനിക്കൽ ട്രയലുകളിൽ വിഷാംശം ഒരു പ്രധാന ആശങ്കയാണ്. എത്രത്തോളം വിഷാംശം സഹിക്കാവുന്നതാണ്? ഈ പഠനത്തിൽ, വിവിധ ക്ലിനിക്കൽ ട്രയൽ രീതികൾ വിശകലനം ചെയ്ത് ക്ലിനിക്കൽ ട്രയൽ ഫലങ്ങളുടെ സാധ്യത പ്രവചിക്കുന്ന പുതിയ സമീപനം വികസിപ്പിച്ചു. പ്രത്യേകിച്ച്, അവർ റാൻഡം ഫോറസ്റ്റ് ഉപയോഗിച്ച് [ക്ലാസിഫയർ](../../4-Classification/README.md) നിർമ്മിക്കാൻ കഴിഞ്ഞു, ഇത് മരുന്നുകളുടെ ഗ്രൂപ്പുകൾ വേർതിരിക്കാൻ കഴിയും.
[Reference](https://www.sciencedirect.com/science/article/pii/S2451945616302914)
### ആശുപത്രി വീണ്ടും പ്രവേശനം മാനേജ്മെന്റ്
ആശുപത്രി പരിചരണം ചെലവേറിയതാണ്, പ്രത്യേകിച്ച് രോഗികളെ വീണ്ടും പ്രവേശിപ്പിക്കേണ്ടിവരുമ്പോൾ. ഈ ലേഖനം ML ഉപയോഗിച്ച് വീണ്ടും പ്രവേശന സാധ്യത പ്രവചിക്കുന്ന ഒരു കമ്പനി ചർച്ച ചെയ്യുന്നു, [ക്ലസ്റ്ററിംഗ്](../../5-Clustering/README.md) ആൽഗോരിതങ്ങൾ ഉപയോഗിച്ച്. ഈ ക്ലസ്റ്ററുകൾ വിശകലനക്കാർക്ക് "പുനഃപ്രവേശനങ്ങളുടെ സാധാരണ കാരണങ്ങൾ പങ്കിടുന്ന ഗ്രൂപ്പുകൾ കണ്ടെത്താൻ" സഹായിക്കുന്നു.
[Reference](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning)
### രോഗം മാനേജ്മെന്റ്
സമീപകാല പാൻഡെമിക് മെഷീൻ ലേണിംഗ് രോഗം പടരുന്നത് തടയുന്നതിൽ എങ്ങനെ സഹായിക്കാമെന്ന് തെളിയിച്ചു. ഈ ലേഖനത്തിൽ ARIMA, ലോജിസ്റ്റിക് കർവുകൾ, ലിനിയർ റെഗ്രഷൻ, SARIMA എന്നിവയുടെ ഉപയോഗം കാണാം. "ഈ ജോലി വൈറസിന്റെ പടരൽ നിരക്ക് കണക്കാക്കാനും മരണങ്ങൾ, സുഖം പ്രാപിച്ച കേസുകൾ, സ്ഥിരീകരിച്ച കേസുകൾ പ്രവചിക്കാനും ശ്രമമാണ്, അതിലൂടെ നാം മെച്ചമായി തയ്യാറെടുക്കാനും ജീവിക്കാൻ സഹായിക്കും."
[Reference](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/)
## 🌲 പരിസ്ഥിതി ശാസ്ത്രവും ഗ്രീൻ ടെക്കും
പ്രകൃതി, പരിസ്ഥിതി നിരവധി സങ്കീർണ്ണമായ സംവിധാനങ്ങളടങ്ങിയതാണ്, മൃഗങ്ങളും പ്രകൃതിയും തമ്മിലുള്ള ബന്ധം ശ്രദ്ധയിൽ പെടുത്തുന്നു. ഈ സംവിധാനങ്ങൾ കൃത്യമായി അളക്കാനും, വന അഗ്നി പോലുള്ള സംഭവങ്ങൾ സംഭവിച്ചാൽ ശരിയായ നടപടി സ്വീകരിക്കാനും ഇത് അനിവാര്യമാണ്.
### വന മാനേജ്മെന്റ്
മുൻ പാഠങ്ങളിൽ നിങ്ങൾ [റീ ഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ്](../../8-Reinforcement/README.md) പഠിച്ചു. പ്രകൃതിയിലെ പാറ്റേണുകൾ പ്രവചിക്കാൻ ഇത് വളരെ ഉപകാരപ്രദമാണ്. പ്രത്യേകിച്ച്, വന അഗ്നി, അനധികൃത സ്പീഷീസുകളുടെ വ്യാപനം പോലുള്ള പരിസ്ഥിതി പ്രശ്നങ്ങൾ ട്രാക്ക് ചെയ്യാൻ ഇത് ഉപയോഗിക്കാം. കാനഡയിൽ, ഒരു ഗവേഷക സംഘം റീ ഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ് ഉപയോഗിച്ച് സാറ്റലൈറ്റ് ചിത്രങ്ങളിൽ നിന്ന് വന അഗ്നി ഡൈനാമിക്സ് മോഡലുകൾ നിർമ്മിച്ചു. "സ്പേഷ്യലി സ്പ്രെഡിംഗ് പ്രോസസ് (SSP)" എന്ന നവീന രീതിയിൽ, വന അഗ്നിയെ "ഭൂദൃശ്യത്തിലെ ഏതെങ്കിലും സെല്ലിലെ ഏജന്റ്" ആയി കണക്കാക്കി. "അഗ്നി ഏതെങ്കിലും സമയത്ത് ഒരു സ്ഥലം മുതൽ വടക്ക്, തെക്ക്, കിഴക്ക്, പടിഞ്ഞാറ് വ്യാപിക്കുകയോ അല്ലെങ്കിൽ വ്യാപിക്കാതിരിക്കാൻ കഴിയും."
ഈ സമീപനം സാധാരണ RL ക്രമീകരണത്തെ മറിക്കുന്നു, കാരണം ബന്ധപ്പെട്ട മാർക്കോവ് ഡിസിഷൻ പ്രോസസിന്റെ (MDP) ഡൈനാമിക്സ് ഉടൻ അഗ്നി വ്യാപനത്തിന് അറിയപ്പെടുന്ന ഫംഗ്ഷനാണ്." ഈ സംഘത്തിന്റെ ക്ലാസിക് ആൽഗോരിതങ്ങൾക്കുറിച്ച് കൂടുതൽ വായിക്കുക.
[Reference](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full)
### മൃഗങ്ങളുടെ ചലന സെൻസിംഗ്
ദൃശ്യപരമായി മൃഗങ്ങളുടെ ചലനങ്ങൾ ട്രാക്ക് ചെയ്യുന്നതിൽ ഡീപ് ലേണിംഗ് വിപ്ലവം സൃഷ്ടിച്ചിട്ടുണ്ടെങ്കിലും (നിങ്ങൾക്ക് നിങ്ങളുടെ സ്വന്തം [പോളാർ ബിയർ ട്രാക്കർ](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) ഇവിടെ നിർമ്മിക്കാം), ക്ലാസിക് ML ഈ പ്രവർത്തനത്തിൽ ഇപ്പോഴും സ്ഥാനം ഉണ്ട്.
കൃഷി മൃഗങ്ങളുടെ ചലനങ്ങൾ ട്രാക്ക് ചെയ്യാനും IoT-ഉം ഈ തരം ദൃശ്യ പ്രോസസ്സിംഗ് ഉപയോഗിക്കുന്നു, എന്നാൽ കൂടുതൽ അടിസ്ഥാന ML സാങ്കേതികതകൾ ഡാറ്റ പ്രീപ്രോസസ്സിംഗിന് ഉപകാരപ്രദമാണ്. ഉദാഹരണത്തിന്, ഈ ലേഖനത്തിൽ, മടിയൻ നിലപാടുകൾ വിവിധ ക്ലാസിഫയർ ആൽഗോരിതങ്ങൾ ഉപയോഗിച്ച് നിരീക്ഷിക്കുകയും വിശകലനം ചെയ്യുകയും ചെയ്തു. പേജ് 335-ൽ ROC കർവ് നിങ്ങൾക്ക് പരിചിതമായിരിക്കാം.
[Reference](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf)
### ⚡️ ഊർജ്ജ മാനേജ്മെന്റ്
[ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗ്](../../7-TimeSeries/README.md) പാഠങ്ങളിൽ, ഒരു പട്ടണത്തിന് സപ്ലൈ-ഡിമാൻഡ് മനസ്സിലാക്കി വരുമാനം സൃഷ്ടിക്കാൻ സ്മാർട്ട് പാർക്കിംഗ് മീറ്ററുകളുടെ ആശയം അവതരിപ്പിച്ചു. ഈ ലേഖനം ക്ലസ്റ്ററിംഗ്, റെഗ്രഷൻ, ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗ് എന്നിവ ചേർന്ന് അയർലൻഡിലെ ഭാവി ഊർജ്ജ ഉപയോഗം പ്രവചിക്കാൻ എങ്ങനെ സഹായിച്ചുവെന്ന് വിശദീകരിക്കുന്നു, സ്മാർട്ട് മീറ്ററിംഗ് അടിസ്ഥാനമാക്കി.
[Reference](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf)
## 💼 ഇൻഷുറൻസ്
ഇൻഷുറൻസ് മേഖലയിലും ML ഉപയോഗിച്ച് സാമ്പത്തികവും ആക്ച്വറിയൽ മോഡലുകളും നിർമ്മിച്ച് മെച്ചപ്പെടുത്തുന്നു.
### വോലറ്റിലിറ്റി മാനേജ്മെന്റ്
MetLife, ഒരു ലൈഫ് ഇൻഷുറൻസ് പ്രൊവൈഡർ, അവരുടെ സാമ്പത്തിക മോഡലുകളിൽ വോലറ്റിലിറ്റി വിശകലനം ചെയ്ത് കുറയ്ക്കുന്നതിൽ തുറന്നുപറയുന്നു. ഈ ലേഖനത്തിൽ ബൈനറി, ഓർഡിനൽ ക്ലാസിഫിക്കേഷൻ ദൃശ്യവത്കരണങ്ങളും ഫോറ്കാസ്റ്റിംഗ് ദൃശ്യവത്കരണങ്ങളും കാണാം.
[Reference](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf)
## 🎨 കല, സംസ്കാരം, സാഹിത്യം
കലാരംഗത്ത്, ഉദാഹരണത്തിന് പത്രപ്രവർത്തനത്തിൽ, നിരവധി രസകരമായ പ്രശ്നങ്ങൾ ഉണ്ട്. വ്യാജ വാർത്തകൾ കണ്ടെത്തൽ വലിയ പ്രശ്നമാണ്, കാരണം ഇത് ജനങ്ങളുടെ അഭിപ്രായത്തെ സ്വാധീനിക്കുകയും ജനാധിപത്യങ്ങളെ തകർക്കുകയും ചെയ്തിട്ടുണ്ട്. മ്യൂസിയങ്ങൾക്കും കലാസാഹിത്യ വസ്തുക്കൾ തമ്മിലുള്ള ബന്ധം കണ്ടെത്തുന്നതിൽ നിന്നും വിഭവങ്ങൾ പദ്ധതിയിടുന്നതിൽ വരെ ML ഉപകാരപ്രദമാണ്.
### വ്യാജ വാർത്ത കണ്ടെത്തൽ
ഇന്നത്തെ മാധ്യമങ്ങളിൽ വ്യാജ വാർത്ത കണ്ടെത്തൽ ഒരു പൂച്ചയും എലിയും കളിയാകുന്നു. ഈ ലേഖനത്തിൽ, പഠനക്കാർ നാം പഠിച്ച ML സാങ്കേതികതകൾ ഒന്നിച്ച് ചേർത്ത് ഒരു സിസ്റ്റം പരീക്ഷിച്ച് മികച്ച മോഡൽ വിനിയോഗിക്കാമെന്ന് നിർദ്ദേശിക്കുന്നു: "ഈ സിസ്റ്റം നാച്ചുറൽ ലാംഗ്വേജ് പ്രോസസ്സിംഗ് ഉപയോഗിച്ച് ഡാറ്റയിൽ നിന്ന് ഫീച്ചറുകൾ എടുക്കുന്നു, പിന്നീട് ഈ ഫീച്ചറുകൾ Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD), Logistic Regression (LR) പോലുള്ള മെഷീൻ ലേണിംഗ് ക്ലാസിഫയർ പരിശീലനത്തിന് ഉപയോഗിക്കുന്നു."
[Reference](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf)
ഈ ലേഖനം വ്യത്യസ്ത ML മേഖലകൾ ചേർത്ത് വ്യാജ വാർത്ത പടരുന്നത് തടയാനും യഥാർത്ഥ നാശം ഉണ്ടാകുന്നത് തടയാനും സഹായിക്കുന്ന രസകരമായ ഫലങ്ങൾ ഉണ്ടാകാമെന്ന് കാണിക്കുന്നു; ഈ കേസിൽ COVID ചികിത്സകളെക്കുറിച്ചുള്ള ചർച്ചകൾ ജനകീയ അക്രമം പ്രേരിപ്പിച്ചതാണ്.
### മ്യൂസിയം ML
മ്യൂസിയങ്ങൾ AI വിപ്ലവത്തിന്റെ കിഴക്കൻ വശത്ത് നിൽക്കുന്നു, ശേഖരങ്ങൾ കാറ്റലോഗ് ചെയ്യാനും ഡിജിറ്റൈസ് ചെയ്യാനും കലാസാഹിത്യ വസ്തുക്കൾ തമ്മിലുള്ള ബന്ധം കണ്ടെത്താനും സാങ്കേതികവിദ്യ മുന്നേറുന്നു. [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) പോലുള്ള പ്രോജക്ടുകൾ വാറ്റിക്കൻ ആർക്കൈവ്സ് പോലുള്ള പ്രാപ്യമല്ലാത്ത ശേഖരങ്ങളുടെ രഹസ്യങ്ങൾ തുറക്കാൻ സഹായിക്കുന്നു. എന്നാൽ, മ്യൂസിയങ്ങളുടെ ബിസിനസ് ഭാഗവും ML മോഡലുകളിൽ നിന്നു പ്രയോജനം നേടുന്നു.
ഉദാഹരണത്തിന്, ചിക്കാഗോ ആർട്ട് ഇൻസ്റ്റിറ്റ്യൂട്ട് പ്രേക്ഷകർക്ക് എന്തിൽ താൽപ്പര്യമുണ്ടെന്നും അവർ എപ്പോൾ പ്രദർശനങ്ങളിൽ പങ്കെടുക്കുമെന്നും പ്രവചിക്കുന്ന മോഡലുകൾ നിർമ്മിച്ചു. ലക്ഷ്യം ഓരോ സന്ദർശനത്തിലും വ്യക്തിഗതവും മെച്ചപ്പെട്ടതുമായ സന്ദർശക അനുഭവങ്ങൾ സൃഷ്ടിക്കുകയാണ്. "2017 സാമ്പത്തിക വർഷത്തിൽ, മോഡൽ 1 ശതമാനത്തിന്റെ കൃത്യതയിൽ ഹാജരാകലും പ്രവേശനവും പ്രവചിച്ചു," എന്ന് ആൻഡ്രൂ സിമ്നിക്ക്, ചിക്കാഗോ ആർട്ട് ഇൻസ്റ്റിറ്റ്യൂട്ടിലെ സീനിയർ വൈസ് പ്രസിഡന്റ് പറയുന്നു.
[Reference](https://www.chicagobusiness.com/article/20180518/ISSUE01/180519840/art-institute-of-chicago-uses-data-to-make-exhibit-choices)
## 🏷 മാർക്കറ്റിംഗ്
### ഉപഭോക്തൃ വിഭാഗീകരണം
മികച്ച മാർക്കറ്റിംഗ് തന്ത്രങ്ങൾ വിവിധ ഗ്രൂപ്പുകളെ അടിസ്ഥാനമാക്കി ഉപഭോക്താക്കളെ വ്യത്യസ്തമായി ലക്ഷ്യമിടുന്നു. ഈ ലേഖനത്തിൽ ക്ലസ്റ്ററിംഗ് ആൽഗോരിതങ്ങളുടെ ഉപയോഗം വ്യത്യസ്തമായ മാർക്കറ്റിംഗ് പിന്തുണയ്ക്കാൻ ചർച്ച ചെയ്യുന്നു. വ്യത്യസ്തമായ മാർക്കറ്റിംഗ് കമ്പനികൾക്ക് ബ്രാൻഡ് തിരിച്ചറിയൽ മെച്ചപ്പെടുത്താനും കൂടുതൽ ഉപഭോക്താക്കളെ എത്താനും കൂടുതൽ വരുമാനം നേടാനും സഹായിക്കുന്നു.
[Reference](https://ai.inqline.com/machine-learning-for-marketing-customer-segmentation/)
## 🚀 ചലഞ്ച്
ഈ പാഠ്യപദ്ധതിയിൽ നിങ്ങൾ പഠിച്ച ചില സാങ്കേതികതകൾ പ്രയോജനപ്പെടുത്തുന്ന മറ്റൊരു മേഖലയെ കണ്ടെത്തി, അതിൽ ML എങ്ങനെ ഉപയോഗിക്കുന്നു എന്ന് കണ്ടെത്തുക.
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
വേഫെയർ ഡാറ്റ സയൻസ് ടീം അവരുടെ കമ്പനിയിൽ എങ്ങനെ ML ഉപയോഗിക്കുന്നു എന്നതിനെക്കുറിച്ച് പല രസകരമായ വീഡിയോകളും ഉണ്ട്. [ഒരു നോക്കുക](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos) ചെയ്യുന്നത് മൂല്യവത്താണ്!
## അസൈൻമെന്റ്
[ഒരു ML സ്കാവഞ്ചർ ഹണ്ട്](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "fdebfcd0a3f12c9e2b436ded1aa79885",
"translation_date": "2025-12-19T15:10:24+00:00",
"source_file": "9-Real-World/1-Applications/assignment.md",
"language_code": "ml"
}
-->
# ഒരു ML സ്കാവഞ്ചർ ഹണ്ട്
## നിർദ്ദേശങ്ങൾ
ഈ പാഠത്തിൽ, നിങ്ങൾ ക്ലാസിക്കൽ ML ഉപയോഗിച്ച് പരിഹരിച്ച നിരവധി യാഥാർത്ഥ്യ ജീവിത ഉപയോഗ കേസുകൾക്കുറിച്ച് പഠിച്ചു. ഡീപ് ലേണിംഗ്, AI-യിലെ പുതിയ സാങ്കേതിക വിദ്യകളും ഉപകരണങ്ങളും ഉപയോഗിച്ച്, ഈ മേഖലകളിൽ സഹായിക്കുന്ന ഉപകരണങ്ങളുടെ നിർമ്മാണം വേഗത്തിലാക്കാൻ സഹായിച്ചിട്ടുണ്ടെങ്കിലും, ഈ പാഠ്യപദ്ധതിയിലെ സാങ്കേതിക വിദ്യകൾ ഉപയോഗിക്കുന്ന ക്ലാസിക്കൽ ML ഇപ്പോഴും വലിയ മൂല്യം വഹിക്കുന്നു.
ഈ അസൈൻമെന്റിൽ, നിങ്ങൾ ഒരു ഹാക്കത്തോണിൽ പങ്കെടുക്കുന്നുണ്ടെന്ന് കണക്കാക്കുക. ഈ പാഠ്യപദ്ധതിയിൽ നിങ്ങൾ പഠിച്ചവ ഉപയോഗിച്ച് ക്ലാസിക്കൽ ML ഉപയോഗിച്ച് ഈ പാഠത്തിൽ ചർച്ച ചെയ്ത ഒരു മേഖലയിലെ പ്രശ്നം പരിഹരിക്കാൻ ഒരു പരിഹാരമുണ്ടാക്കാൻ നിർദ്ദേശിക്കുക. നിങ്ങളുടെ ആശയം എങ്ങനെ നടപ്പിലാക്കുമെന്ന് ചർച്ച ചെയ്യുന്ന ഒരു പ്രეზന്റേഷൻ സൃഷ്ടിക്കുക. സാമ്പിൾ ഡാറ്റ ശേഖരിച്ച് നിങ്ങളുടെ ആശയം പിന്തുണയ്ക്കാൻ ഒരു ML മോഡൽ നിർമ്മിച്ചാൽ ബോണസ് പോയിന്റുകൾ ലഭിക്കും!
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണാത്മകം | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | ------------------------------------------------------------------- | ------------------------------------------------- | ---------------------- |
| | ഒരു പവർപോയിന്റ് പ്രეზന്റേഷൻ അവതരിപ്പിക്കുന്നു - മോഡൽ നിർമ്മിച്ചതിന് ബോണസ് | ഒരു നവീനമല്ലാത്ത, അടിസ്ഥാന പ്രეზന്റേഷൻ അവതരിപ്പിക്കുന്നു | ജോലി അപൂർണ്ണമാണ് |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,185 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "df2b538e8fbb3e91cf0419ae2f858675",
"translation_date": "2025-12-19T15:12:16+00:00",
"source_file": "9-Real-World/2-Debugging-ML-Models/README.md",
"language_code": "ml"
}
-->
# പോസ്റ്റ്‌സ്‌ക്രിപ്റ്റ്: ഉത്തരവാദിത്വമുള്ള AI ഡാഷ്ബോർഡ് ഘടകങ്ങൾ ഉപയോഗിച്ച് മെഷീൻ ലേണിങ്ങിൽ മോഡൽ ഡീബഗ്ഗിംഗ്
## [പ്രീ-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## പരിചയം
മെഷീൻ ലേണിംഗ് നമ്മുടെ ദൈനംദിന ജീവിതത്തെ ബാധിക്കുന്നു. AI നമ്മുടെ വ്യക്തിഗത ജീവിതത്തെയും സമൂഹത്തെയും ബാധിക്കുന്ന ആരോഗ്യസംരക്ഷണം, ധനകാര്യ, വിദ്യാഭ്യാസം, തൊഴിൽ തുടങ്ങിയ ഏറ്റവും പ്രധാനപ്പെട്ട ചില സംവിധാനങ്ങളിൽ ഇടംപിടിക്കുന്നു. ഉദാഹരണത്തിന്, ആരോഗ്യപരിശോധനകൾ നടത്തുന്നതോ തട്ടിപ്പുകൾ കണ്ടെത്തുന്നതോ പോലുള്ള ദൈനംദിന തീരുമാനമെടുക്കൽ പ്രവർത്തനങ്ങളിൽ സിസ്റ്റങ്ങളും മോഡലുകളും പങ്കാളികളാണ്. അതിനാൽ, AI യിലെ പുരോഗതികളും അതിന്റെ വേഗത്തിലുള്ള സ്വീകരണവും സാമൂഹിക പ്രതീക്ഷകളുടെയും വളരുന്ന നിയന്ത്രണങ്ങളുടെയും പ്രതികരണമായി വരുന്നു. AI സിസ്റ്റങ്ങൾ പ്രതീക്ഷകൾ പാലിക്കാത്ത മേഖലകൾ നാം നിരന്തരം കാണുന്നു; അവ പുതിയ വെല്ലുവിളികൾ തുറന്നുകാട്ടുന്നു; സർക്കാറുകൾ AI പരിഹാരങ്ങളെ നിയന്ത്രിക്കാൻ തുടങ്ങുന്നു. അതിനാൽ, ഈ മോഡലുകൾ എല്ലാവർക്കും നീതിപൂർണവും വിശ്വസനീയവുമായ, ഉൾക്കൊള്ളുന്ന, പാരദർശകവും ഉത്തരവാദിത്വമുള്ള ഫലങ്ങൾ നൽകുന്നുവെന്ന് വിശകലനം ചെയ്യുന്നത് പ്രധാനമാണ്.
ഈ പാഠ്യപദ്ധതിയിൽ, മോഡലിന് ഉത്തരവാദിത്വമുള്ള AI പ്രശ്നങ്ങളുണ്ടോ എന്ന് വിലയിരുത്താൻ ഉപയോഗിക്കാവുന്ന പ്രായോഗിക ഉപകരണങ്ങൾ നോക്കാം. പരമ്പരാഗത മെഷീൻ ലേണിംഗ് ഡീബഗ്ഗിംഗ് സാങ്കേതികവിദ്യകൾ സാധാരണയായി സംഖ്യാത്മക കണക്കുകളായ ഏകീകരിച്ച കൃത്യത അല്ലെങ്കിൽ ശരാശരി പിശക് നഷ്ടം എന്നിവയുടെ അടിസ്ഥാനത്തിലാണ്. നിങ്ങൾ ഈ മോഡലുകൾ നിർമ്മിക്കാൻ ഉപയോഗിക്കുന്ന ഡാറ്റയിൽ ജാതി, ലിംഗം, രാഷ്ട്രീയ കാഴ്ചപ്പാട്, മതം പോലുള്ള ചില ജനസംഖ്യാ വിഭാഗങ്ങൾ ഇല്ലെങ്കിൽ എന്ത് സംഭവിക്കും എന്ന് ചിന്തിക്കുക. മോഡലിന്റെ ഔട്ട്പുട്ട് ചില ജനസംഖ്യാ വിഭാഗങ്ങളെ അനുകൂലിക്കുന്നതായി വ്യാഖ്യാനിക്കപ്പെടുമ്പോൾ എന്ത് സംഭവിക്കും? ഇത് ഈ സങ്കീർണ്ണമായ സവിശേഷതാ ഗ്രൂപ്പുകളുടെ അധികം അല്ലെങ്കിൽ കുറവ് പ്രതിനിധാനത്തെ പരിചയപ്പെടുത്താം, ഫെയർ‌നസ്, ഉൾക്കൊള്ളൽ, വിശ്വസനീയത സംബന്ധിച്ച പ്രശ്നങ്ങൾ മോഡലിൽ ഉണ്ടാകാം. മറ്റൊരു കാര്യം, മെഷീൻ ലേണിംഗ് മോഡലുകൾ ബ്ലാക്ക് ബോക്സുകളായി കണക്കാക്കപ്പെടുന്നു, അതിനാൽ മോഡലിന്റെ പ്രവചനത്തെ എന്താണ് പ്രേരിപ്പിക്കുന്നത് എന്ന് മനസ്സിലാക്കാനും വിശദീകരിക്കാനും ബുദ്ധിമുട്ടാണ്. ഈ എല്ലാ വെല്ലുവിളികളും ഡാറ്റാ ശാസ്ത്രജ്ഞരും AI വികസനക്കാരും അനുഭവിക്കുന്നതാണ്, കാരണം മോഡലിന്റെ ഫെയർ‌നസും വിശ്വസനീയതയും ഡീബഗ് ചെയ്യാനും വിലയിരുത്താനും ആവശ്യമായ ഉപകരണങ്ങൾ അവർക്കില്ല.
ഈ പാഠത്തിൽ, നിങ്ങൾ നിങ്ങളുടെ മോഡലുകൾ ഡീബഗ് ചെയ്യുന്നത് പഠിക്കും:
- **പിശക് വിശകലനം**: നിങ്ങളുടെ ഡാറ്റാ വിതരണത്തിൽ മോഡലിന് ഉയർന്ന പിശക് നിരക്കുകൾ എവിടെയാണ് എന്ന് കണ്ടെത്തുക.
- **മോഡൽ അവലോകനം**: വ്യത്യസ്ത ഡാറ്റാ കോഹോർട്ടുകൾക്കിടയിൽ താരതമ്യ വിശകലനം നടത്തുക, മോഡലിന്റെ പ്രകടന മെട്രിക്‌സുകളിൽ വ്യത്യാസങ്ങൾ കണ്ടെത്താൻ.
- **ഡാറ്റാ വിശകലനം**: നിങ്ങളുടെ ഡാറ്റയിൽ ഒരു ജനസംഖ്യാ വിഭാഗം മറ്റൊന്നിനെ അപേക്ഷിച്ച് അധികം അല്ലെങ്കിൽ കുറവായി പ്രതിനിധാനം ചെയ്യപ്പെടുന്നിടങ്ങൾ പരിശോധിക്കുക, ഇത് മോഡലിനെ ഒരു വിഭാഗത്തെ അനുകൂലിക്കാൻ ഇടയാക്കാം.
- **സവിശേഷതാ പ്രാധാന്യം**: ആഗോള തലത്തിൽ അല്ലെങ്കിൽ പ്രാദേശിക തലത്തിൽ മോഡലിന്റെ പ്രവചനങ്ങളെ പ്രേരിപ്പിക്കുന്ന സവിശേഷതകൾ മനസ്സിലാക്കുക.
## മുൻകൂർ ആവശ്യകത
മുൻകൂർ ആവശ്യകതയായി, ദയവായി [ഉത്തരവാദിത്വമുള്ള AI ഉപകരണങ്ങൾ ഡെവലപ്പർമാർക്കായി](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) എന്ന അവലോകനം ചെയ്യുക.
> ![ഉത്തരവാദിത്വമുള്ള AI ഉപകരണങ്ങളുടെ ഗിഫ്](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif)
## പിശക് വിശകലനം
കൃത്യത അളക്കാൻ ഉപയോഗിക്കുന്ന പരമ്പരാഗത മോഡൽ പ്രകടന മെട്രിക്‌സുകൾ സാധാരണയായി ശരിയായ പ്രവചനങ്ങൾക്കും തെറ്റായ പ്രവചനങ്ങൾക്കും അടിസ്ഥാനമായ കണക്കുകളാണ്. ഉദാഹരണത്തിന്, ഒരു മോഡൽ 89% കൃത്യതയുള്ളതാണെന്ന് 0.001 പിശക് നഷ്ടത്തോടെ നിശ്ചയിക്കുന്നത് നല്ല പ്രകടനമായി കണക്കാക്കാം. പിശകുകൾ സാധാരണയായി നിങ്ങളുടെ അടിസ്ഥാന ഡാറ്റാസെറ്റിൽ സമാനമായി വിതരണം ചെയ്തിട്ടില്ല. നിങ്ങൾക്ക് 89% കൃത്യതയുള്ള മോഡൽ സ്കോർ ലഭിച്ചാലും, മോഡൽ 42% തവണ പരാജയപ്പെടുന്ന ഡാറ്റാ മേഖലകൾ വ്യത്യസ്തമായി ഉണ്ടാകാം. ഈ പരാജയ മാതൃകകൾ ചില ഡാറ്റാ ഗ്രൂപ്പുകളിൽ ഫെയർ‌നസോ വിശ്വസനീയതയോ സംബന്ധിച്ച പ്രശ്നങ്ങൾ ഉണ്ടാക്കാം. മോഡൽ എവിടെ നല്ല പ്രകടനം കാഴ്ചവെക്കുന്നു അല്ലെങ്കിൽ പരാജയപ്പെടുന്നു എന്ന് മനസ്സിലാക്കുന്നത് അനിവാര്യമാണ്. മോഡലിൽ പിശകുകൾ കൂടുതലുള്ള ഡാറ്റാ മേഖലകൾ ഒരു പ്രധാന ഡാറ്റാ ജനസംഖ്യയായി മാറാം.
![മോഡൽ പിശകുകൾ വിശകലനം ചെയ്യുക](../../../../translated_images/ea-error-distribution.117452e1177c1dd84fab2369967a68bcde787c76c6ea7fdb92fcf15d1fce8206.ml.png)
RAI ഡാഷ്ബോർഡിലെ പിശക് വിശകലന ഘടകം വിവിധ കോഹോർട്ടുകളിൽ മോഡൽ പരാജയം എങ്ങനെ വിതരണം ചെയ്തിട്ടുള്ളതെന്ന് ഒരു ട്രീ വിസ്വലൈസേഷനിലൂടെ കാണിക്കുന്നു. ഇത് നിങ്ങളുടെ ഡാറ്റാസെറ്റിൽ ഉയർന്ന പിശക് നിരക്കുള്ള സവിശേഷതകൾ അല്ലെങ്കിൽ മേഖലകൾ കണ്ടെത്താൻ സഹായിക്കുന്നു. മോഡലിന്റെ പിശകുകൾ എവിടെ നിന്നാണ് വരുന്നത് എന്ന് കാണുമ്പോൾ, നിങ്ങൾ മൂലകാരണം അന്വേഷിക്കാൻ തുടങ്ങാം. ഡാറ്റാ കോഹോർട്ടുകൾ സൃഷ്ടിച്ച് അവയിൽ വിശകലനം നടത്താനും കഴിയും. ഈ ഡാറ്റാ കോഹോർട്ടുകൾ ഡീബഗ്ഗിംഗ് പ്രക്രിയയിൽ സഹായിക്കുന്നു, ഒരു കോഹോർട്ടിൽ മോഡൽ പ്രകടനം നല്ലതായിരിക്കുമ്പോൾ മറ്റൊന്നിൽ പിശകുള്ളതെന്തുകൊണ്ടെന്ന് കണ്ടെത്താൻ.
![പിശക് വിശകലനം](../../../../translated_images/ea-error-cohort.6886209ea5d438c4daa8bfbf5ce3a7042586364dd3eccda4a4e3d05623ac702a.ml.png)
ട്രീ മാപ്പിലെ ദൃശ്യ സൂചകങ്ങൾ പ്രശ്നമേഖലകൾ വേഗത്തിൽ കണ്ടെത്താൻ സഹായിക്കുന്നു. ഉദാഹരണത്തിന്, ട്രീ നോഡിന് ഇരുണ്ട ചുവപ്പ് നിറം കൂടുതലായിരിക്കുമ്പോൾ പിശക് നിരക്ക് ഉയർന്നതാണ്.
ഹീറ്റ് മാപ്പ് മറ്റൊരു വിസ്വലൈസേഷൻ ഫംഗ്ഷണാലിറ്റിയാണ്, ഇത് ഒരു അല്ലെങ്കിൽ രണ്ട് സവിശേഷതകൾ ഉപയോഗിച്ച് പിശക് നിരക്ക് പരിശോധിക്കാൻ സഹായിക്കുന്നു, മുഴുവൻ ഡാറ്റാസെറ്റിലോ കോഹോർട്ടുകളിലോ മോഡൽ പിശകുകൾക്ക് കാരണമായ ഘടകങ്ങൾ കണ്ടെത്താൻ.
![പിശക് വിശകലന ഹീറ്റ് മാപ്പ്](../../../../translated_images/ea-heatmap.8d27185e28cee3830c85e1b2e9df9d2d5e5c8c940f41678efdb68753f2f7e56c.ml.png)
പിശക് വിശകലനം ഉപയോഗിക്കേണ്ടത്:
* മോഡൽ പരാജയങ്ങൾ ഡാറ്റാസെറ്റിലും വിവിധ ഇൻപുട്ട്, സവിശേഷതാ അളവുകളിലും എങ്ങനെ വിതരണം ചെയ്തിട്ടുള്ളതെന്ന് ആഴത്തിൽ മനസ്സിലാക്കാൻ.
* ഏകീകരിച്ച പ്രകടന മെട്രിക്‌സുകൾ വിഭജിച്ച് പിശകുള്ള കോഹോർട്ടുകൾ സ്വയം കണ്ടെത്തി ലക്ഷ്യമിട്ട പരിഹാര നടപടികൾക്ക് സഹായിക്കാൻ.
## മോഡൽ അവലോകനം
മെഷീൻ ലേണിംഗ് മോഡലിന്റെ പ്രകടനം വിലയിരുത്താൻ അതിന്റെ പെരുമാറ്റത്തെ സമഗ്രമായി മനസ്സിലാക്കേണ്ടതുണ്ട്. പിശക് നിരക്ക്, കൃത്യത, റിക്കാൾ, പ്രിസിഷൻ, MAE (Mean Absolute Error) പോലുള്ള metrics ഒന്നിലധികം പരിശോധിച്ച് പ്രകടന വ്യത്യാസങ്ങൾ കണ്ടെത്താം. ഒരു മെട്രിക് മികച്ചതായിരിക്കാം, പക്ഷേ മറ്റൊന്നിൽ പിശകുകൾ കാണാം. കൂടാതെ, മുഴുവൻ ഡാറ്റാസെറ്റിലോ കോഹോർട്ടുകളിലോ metrics താരതമ്യം ചെയ്യുന്നത് മോഡൽ എവിടെ നല്ലതും എവിടെ മോശമെന്നും വ്യക്തമാക്കുന്നു. പ്രത്യേകിച്ച്, സെൻസിറ്റീവ് സവിശേഷതകളുള്ള (ഉദാ: രോഗിയുടെ ജാതി, ലിംഗം, പ്രായം) കോഹോർട്ടുകളിൽ മോഡൽ പ്രകടനം പരിശോധിക്കുന്നത് മോഡലിൽ ഉണ്ടാകാവുന്ന അനീതിയെ കണ്ടെത്താൻ സഹായിക്കുന്നു. ഉദാഹരണത്തിന്, സെൻസിറ്റീവ് സവിശേഷതകളുള്ള ഒരു കോഹോർട്ടിൽ മോഡൽ കൂടുതൽ പിശകുള്ളതായി കണ്ടെത്തുന്നത് മോഡലിൽ അനീതിയുണ്ടെന്ന് സൂചിപ്പിക്കാം.
RAI ഡാഷ്ബോർഡിലെ മോഡൽ അവലോകന ഘടകം ഡാറ്റാ പ്രതിനിധാനമുള്ള കോഹോർട്ടുകളുടെ പ്രകടന മെട്രിക്‌സുകൾ വിശകലനം ചെയ്യുന്നതിൽ മാത്രമല്ല, വ്യത്യസ്ത കോഹോർട്ടുകളിലുടനീളം മോഡലിന്റെ പെരുമാറ്റം താരതമ്യം ചെയ്യാനുള്ള കഴിവും നൽകുന്നു.
![ഡാറ്റാസെറ്റ് കോഹോർട്ടുകൾ - RAI ഡാഷ്ബോർഡിലെ മോഡൽ അവലോകനം](../../../../translated_images/model-overview-dataset-cohorts.dfa463fb527a35a0afc01b7b012fc87bf2cad756763f3652bbd810cac5d6cf33.ml.png)
ഘടകത്തിന്റെ സവിശേഷതാ അടിസ്ഥാനത്തിലുള്ള വിശകലന ഫംഗ്ഷണാലിറ്റി ഉപയോക്താക്കളെ ഒരു പ്രത്യേക സവിശേഷതയിലുള്ള ഡാറ്റാ ഉപഗ്രൂപ്പുകൾ കുറയ്ക്കാൻ സഹായിക്കുന്നു, സൂക്ഷ്മതയിൽ അനോമലികൾ കണ്ടെത്താൻ. ഉദാഹരണത്തിന്, ഡാഷ്ബോർഡിൽ ഒരു ഉപയോക്താവ് തിരഞ്ഞെടുക്കുന്ന സവിശേഷതയ്ക്ക് (ഉദാ: *"time_in_hospital < 3"* അല്ലെങ്കിൽ *"time_in_hospital >= 7"*) സ്വയം കോഹോർട്ടുകൾ സൃഷ്ടിക്കുന്ന ബുദ്ധിമുട്ട് ഉണ്ട്. ഇത് വലിയ ഡാറ്റാ ഗ്രൂപ്പിൽ നിന്നൊരു പ്രത്യേക സവിശേഷത വേർതിരിച്ച് മോഡലിന്റെ പിശകുള്ള ഫലങ്ങൾക്ക് പ്രധാന കാരണമാണോ എന്ന് പരിശോധിക്കാൻ സഹായിക്കുന്നു.
![സവിശേഷതാ കോഹോർട്ടുകൾ - RAI ഡാഷ്ബോർഡിലെ മോഡൽ അവലോകനം](../../../../translated_images/model-overview-feature-cohorts.c5104d575ffd0c80b7ad8ede7703fab6166bfc6f9125dd395dcc4ace2f522f70.ml.png)
മോഡൽ അവലോകന ഘടകം രണ്ട് തരത്തിലുള്ള വ്യത്യാസ മെട്രിക്‌സുകൾ പിന്തുണയ്ക്കുന്നു:
**മോഡൽ പ്രകടനത്തിലെ വ്യത്യാസം**: തിരഞ്ഞെടുക്കപ്പെട്ട പ്രകടന മെട്രിക്‌സിന്റെ മൂല്യങ്ങളിൽ ഡാറ്റാ ഉപഗ്രൂപ്പുകൾക്കിടയിലെ വ്യത്യാസം (വ്യത്യാസം) കണക്കാക്കുന്നു. ഉദാഹരണങ്ങൾ:
* കൃത്യത നിരക്കിലെ വ്യത്യാസം
* പിശക് നിരക്കിലെ വ്യത്യാസം
* പ്രിസിഷനിലെ വ്യത്യാസം
* റിക്കാളിലെ വ്യത്യാസം
* ശരാശരി ആബ്സല്യൂട്ട് പിശക് (MAE) ൽ വ്യത്യാസം
**തിരഞ്ഞെടുപ്പ് നിരക്കിലെ വ്യത്യാസം**: ഉപഗ്രൂപ്പുകൾക്കിടയിലെ തിരഞ്ഞെടുപ്പ് നിരക്കിലെ (നന്മയുള്ള പ്രവചന) വ്യത്യാസം. ഉദാഹരണത്തിന് വായ്പ അംഗീകാരം നിരക്കിലെ വ്യത്യാസം. തിരഞ്ഞെടുപ്പ് നിരക്ക് എന്നത് ഓരോ ക്ലാസിലെയും ഡാറ്റാ പോയിന്റുകളുടെ 1 ആയി (ബൈനറി ക്ലാസിഫിക്കേഷനിൽ) വർഗ്ഗീകരിച്ച അളവോ, പ്രവചന മൂല്യങ്ങളുടെ വിതരണമോ (റെഗ്രഷനിൽ) ആണ്.
## ഡാറ്റാ വിശകലനം
> "നിങ്ങൾ ഡാറ്റയെ മതിയായ സമയം പീഡിപ്പിച്ചാൽ, അത് എന്തും സമ്മതിക്കും" - റൊണാൾഡ് കോസ്
ഈ പ്രസ്താവന അതീവമായിരിക്കും തോന്നുക, പക്ഷേ ഡാറ്റയെ ഏതൊരു നിഗമനത്തെയും പിന്തുണയ്ക്കാൻ മാനിപ്പുലേറ്റ് ചെയ്യാമെന്നത് സത്യമാണെന്ന് പറയാം. ഇത്തരം മാനിപ്പുലേഷൻ ചിലപ്പോൾ അനായാസം സംഭവിക്കാം. മനുഷ്യരായി, നമ്മളെല്ലാവർക്കും പക്ഷപാതം ഉണ്ട്, ഡാറ്റയിൽ നിങ്ങൾ ബോധപൂർവ്വം പക്ഷപാതം ചേർക്കുമ്പോൾ അത് അറിയുക പ്രയാസമാണ്. AI യിലും മെഷീൻ ലേണിംഗിലും നീതിപൂർണത ഉറപ്പാക്കുന്നത് സങ്കീർണ്ണമായ വെല്ലുവിളിയാണ്.
ഡാറ്റ പരമ്പരാഗത മോഡൽ പ്രകടന മെട്രിക്‌സുകൾക്ക് വലിയ അന്ധസ്ഥലമാണ്. നിങ്ങൾക്ക് ഉയർന്ന കൃത്യത സ്കോറുകൾ ഉണ്ടാകാം, പക്ഷേ ഇത് നിങ്ങളുടെ ഡാറ്റാസെറ്റിൽ ഉള്ള അടിസ്ഥാനം പക്ഷപാതം പ്രതിഫലിപ്പിക്കണമെന്നില്ല. ഉദാഹരണത്തിന്, ഒരു കമ്പനിയിലെ ജീവനക്കാരുടെ ഡാറ്റാസെറ്റിൽ 27% സ്ത്രീകൾ എക്സിക്യൂട്ടീവ് സ്ഥാനങ്ങളിൽ ഉണ്ടെങ്കിൽ, 73% പുരുഷന്മാർ അതേ നിലയിൽ ഉണ്ടെങ്കിൽ, ഈ ഡാറ്റയിൽ പരിശീലിപ്പിച്ച ജോബ് പരസ്യ AI മോഡൽ മുതിർന്ന ജോബ് സ്ഥാനങ്ങൾക്ക് പ്രധാനമായും പുരുഷ പ്രേക്ഷകരെ ലക്ഷ്യമിടാം. ഈ ഡാറ്റ അസമത്വം മോഡലിന്റെ പ്രവചനത്തെ ഒരു ലിംഗത്തെ അനുകൂലിക്കാൻ ഇടയാക്കുന്നു. ഇത് AI മോഡലിൽ ലിംഗഭേദം എന്ന നീതിപൂർണത പ്രശ്നം തുറന്നുകാട്ടുന്നു.
RAI ഡാഷ്ബോർഡിലെ ഡാറ്റാ വിശകലന ഘടകം ഡാറ്റാസെറ്റിൽ അധികം അല്ലെങ്കിൽ കുറവായി പ്രതിനിധാനം ചെയ്യുന്ന മേഖലകൾ കണ്ടെത്താൻ സഹായിക്കുന്നു. ഡാറ്റ അസമത്വങ്ങൾ അല്ലെങ്കിൽ ഒരു പ്രത്യേക ഡാറ്റാ ഗ്രൂപ്പിന്റെ പ്രതിനിധാനക്കുറവ് മൂലം ഉണ്ടാകുന്ന പിശകുകളും നീതിപൂർണത പ്രശ്നങ്ങളും കണ്ടെത്താൻ ഉപയോക്താക്കളെ സഹായിക്കുന്നു. പ്രവചിച്ച ഫലങ്ങളും യഥാർത്ഥ ഫലങ്ങളും, പിശക് ഗ്രൂപ്പുകളും, പ്രത്യേക സവിശേഷതകളും അടിസ്ഥാനമാക്കി ഡാറ്റാസെറ്റുകൾ ദൃശ്യവൽക്കരിക്കാൻ കഴിയും. ചിലപ്പോൾ കുറവായി പ്രതിനിധാനം ചെയ്യുന്ന ഡാറ്റാ ഗ്രൂപ്പ് കണ്ടെത്തുന്നത് മോഡൽ നന്നായി പഠിക്കുന്നില്ലെന്ന് വെളിപ്പെടുത്താം, അതിനാൽ പിശകുകൾ കൂടുതലാണ്. ഡാറ്റാ പക്ഷപാതമുള്ള മോഡൽ ഫെയർ‌നസിന്റെ പ്രശ്നമല്ല, അത് ഉൾക്കൊള്ളലില്ലായ്മയും വിശ്വസനീയതയില്ലായ്മയും കാണിക്കുന്നു.
![RAI ഡാഷ്ബോർഡിലെ ഡാറ്റാ വിശകലന ഘടകം](../../../../translated_images/dataanalysis-cover.8d6d0683a70a5c1e274e5a94b27a71137e3d0a3b707761d7170eb340dd07f11d.ml.png)
ഡാറ്റാ വിശകലനം ഉപയോഗിക്കേണ്ടത്:
* വ്യത്യസ്ത ഫിൽട്ടറുകൾ തിരഞ്ഞെടുക്കി നിങ്ങളുടെ ഡാറ്റ വിവിധ അളവുകളായി (കോഹോർട്ടുകൾ എന്നും അറിയപ്പെടുന്നു) വിഭജിച്ച് ഡാറ്റാസെറ്റ് സ്ഥിതിവിവരക്കണക്കുകൾ പരിശോധിക്കാൻ.
* വ്യത്യസ്ത കോഹോർട്ടുകളിലെയും സവിശേഷതാ ഗ്രൂപ്പുകളിലെയും ഡാറ്റാ വിതരണത്തെ മനസ്സിലാക്കാൻ.
* നീതിപൂർണത, പിശക് വിശകലനം, കാരണപരമായ കണ്ടെത്തലുകൾ (മറ്റു ഡാഷ്ബോർഡ് ഘടകങ്ങളിൽ നിന്നുള്ള) നിങ്ങളുടെ ഡാറ്റാസെറ്റിന്റെ വിതരണത്തിന്റെ ഫലമാണോ എന്ന് നിർണയിക്കാൻ.
* പ്രതിനിധാന പ്രശ്നങ്ങൾ, ലേബൽ ശബ്ദം, സവിശേഷത ശബ്ദം, ലേബൽ പക്ഷപാതം തുടങ്ങിയവയിൽ നിന്നുള്ള പിശകുകൾ കുറയ്ക്കാൻ കൂടുതൽ ഡാറ്റ എവിടെ ശേഖരിക്കണമെന്ന് തീരുമാനിക്കാൻ.
## മോഡൽ വ്യാഖ്യാനം
മെഷീൻ ലേണിംഗ് മോഡലുകൾ സാധാരണയായി ബ്ലാക്ക് ബോക്സുകളാണ്. ഒരു മോഡലിന്റെ പ്രവചനത്തെ പ്രേരിപ്പിക്കുന്ന പ്രധാന ഡാറ്റാ സവിശേഷതകൾ മനസ്സിലാക്കുന്നത് വെല്ലുവിളിയാണ്. ഒരു മോഡൽ എന്തുകൊണ്ട് ഒരു പ്രവചനമുണ്ടാക്കുന്നു എന്ന് പാരദർശകത നൽകുന്നത് പ്രധാനമാണ്. ഉദാഹരണത്തിന്, ഒരു AI സിസ്റ്റം ഒരു ഡയബറ്റിക് രോഗി 30 ദിവസത്തിനുള്ളിൽ ആശുപത്രിയിൽ വീണ്ടും പ്രവേശിക്കാനുള്ള അപകടത്തിൽ ആണെന്ന് പ്രവചിച്ചാൽ, അതിന്റെ പ്രവചനത്തിന് കാരണമായ പിന്തുണയുള്ള ഡാറ്റ നൽകാൻ കഴിയണം. പിന്തുണയുള്ള ഡാറ്റ സൂചകങ്ങൾ ക്ലിനീഷ്യന്മാരെ അല്ലെങ്കിൽ ആശുപത്രികളെ നന്നായി അറിയപ്പെട്ട തീരുമാനങ്ങൾ എടുക്കാൻ സഹായിക്കുന്നു. കൂടാതെ, വ്യക്തിഗത രോഗിക്ക് മോഡൽ എന്തുകൊണ്ട് ഒരു പ്രവചനമുണ്ടാക്കി എന്ന് വിശദീകരിക്കാൻ കഴിയുന്നത് ആരോഗ്യനിയമങ്ങളോടുള്ള ഉത്തരവാദിത്വം ഉറപ്പാക്കുന്നു. മനുഷ്യരുടെ ജീവിതത്തെ ബാധിക്കുന്ന രീതിയിൽ മെഷീൻ ലേണിംഗ് മോഡലുകൾ ഉപയോഗിക്കുമ്പോൾ, മോഡലിന്റെ പെരുമാറ്റത്തെ എന്താണ് സ്വാധീനിക്കുന്നത് എന്ന് മനസ്സിലാക്കുകയും വിശദീകരിക്കുകയും ചെയ്യുന്നത് അത്യന്താപേക്ഷിതമാണ്. മോഡൽ വിശദീകരണവും വ്യാഖ്യാനവും താഴെപ്പറയുന്ന സാഹചര്യങ്ങളിൽ ചോദ്യങ്ങൾക്ക് ഉത്തരം നൽകുന്നു:
* മോഡൽ ഡീബഗ്ഗിംഗ്: എന്റെ മോഡൽ ഈ പിശക് എന്തുകൊണ്ട് ചെയ്തു? എങ്ങനെ മെച്ചപ്പെടുത്താം?
* മനുഷ്യ- AI സഹകരണം: മോഡലിന്റെ തീരുമാനങ്ങൾ എങ്ങനെ മനസ്സിലാക്കാം, വിശ്വസിക്കാം?
* നിയമാനുസൃത പാലനം: എന്റെ മോഡൽ നിയമ ആവശ്യകതകൾ പാലിക്കുന്നുണ്ടോ?
RAI ഡാഷ്ബോർഡിലെ സവിശേഷതാ പ്രാധാന്യം ഘടകം മോഡൽ ഡീബഗ് ചെയ്യാനും മോഡൽ പ്രവചനങ്ങൾ എങ്ങനെ ഉണ്ടാകുന്നു എന്ന് സമഗ്രമായി മനസ്സിലാക്കാനും സഹായിക്കുന്നു. ഇത് മെഷീൻ ലേണിംഗ് പ്രൊഫഷണലുകൾക്കും തീരുമാനമെടുക്കുന്നവർക്കും മോഡലിന്റെ പെരുമാറ്റത്തെ സ്വാധീനിക്കുന്ന സവിശേഷതകൾ വിശദീകരിക്കാനും തെളിവുകൾ കാണിക്കാനും സഹായിക്കുന്ന ഉപകരണമാണ്, നിയമാനുസൃത പാലനത്തിനായി. ഉപയോക്താക്കൾ ആഗോളവും പ്രാദേശികവുമായ വിശദീകരണങ്ങൾ പരിശോധിച്ച് മോഡലിന്റെ പ്രവചനത്തെ സ്വാധീനിക്കുന്ന സവിശേഷതകൾ സ്ഥിരീകരിക്കാം. ആഗോള വിശദീകരണങ്ങൾ മോഡലിന്റെ മൊത്തം പ്രവചനത്തെ സ്വാധീനിച്ച പ്രധാന സവിശേഷതകൾ പട്ടികപ്പെടുത്തുന്നു. പ്രാദേശിക വിശദീകരണങ്ങൾ വ്യക്തിഗത കേസിനുള്ള മോഡൽ പ്രവചനത്തിന് കാരണമായ സവിശേഷതകൾ കാണിക്കുന്നു. പ്രാദേശിക വിശദീകരണങ്ങൾ വിലയിരുത്തുന്നത് ഒരു പ്രത്യേക കേസ് ഡീബഗ് ചെയ്യാനും ഓഡിറ്റ് ചെയ്യാനും സഹായിക്കുന്നു, മോഡൽ ശരിയായോ തെറ്റായോ പ്രവചനമുണ്ടാക്കിയത് എന്തുകൊണ്ടെന്ന് മനസ്സിലാക്കാൻ.
![RAI ഡാഷ്ബോർഡിലെ സവിശേഷതാ പ്രാധാന്യം ഘടകം](../../../../translated_images/9-feature-importance.cd3193b4bba3fd4bccd415f566c2437fb3298c4824a3dabbcab15270d783606e.ml.png)
* ആഗോള വിശദീകരണങ്ങൾ: ഉദാഹരണത്തിന്, ഒരു ഡയബറ്റിക് ആശുപത്രി വീണ്ടും പ്രവേശന മോഡലിന്റെ മൊത്തം പെരുമാറ്റത്തെ സ്വാധീനിക്കുന്ന സവിശേഷതകൾ എന്തൊക്കെയാണ്?
* പ്രാദേശിക വിശദീകരണങ്ങൾ: ഉദാഹരണത്തിന്, 60 വയസ്സിന് മുകളിൽ മുൻപ് ആശുപത്രിയിൽ പ്രവേശനമുണ്ടായ ഒരു ഡയബറ്റിക് രോഗിയെ 30 ദിവസത്തിനുള്ളിൽ വീണ്ടും പ്രവേശിപ്പിക്കുമോ ഇല്ലയോ എന്ന് മോഡൽ പ്രവചിച്ചത് എന്തുകൊണ്ടാണ്?
വിവിധ കോഹോർട്ടുകളിലുടനീളം മോഡലിന്റെ പ്രകടനം പരിശോധിക്കുന്ന ഡീബഗ്ഗിംഗ് പ്രക്രിയയിൽ, സവിശേഷതാ പ്രാധാന്യം ഘടകം ഒരു സവിശേഷതയ്ക്ക് കോഹോർട്ടുകളിൽ എത്ര സ്വാധീനം ഉണ്ടെന്ന് കാണിക്കുന്നു. മോഡലിന്റെ പിശകുള്ള പ്രവചനങ്ങളെ പ്രേരിപ്പിക്കുന്ന സവിശേഷതയുടെ സ്വാധീനം താരതമ്യം ചെയ്യുമ്പോൾ അനോമലികൾ കണ്ടെത്താൻ ഇത് സഹായിക്കുന്നു. ഒരു മോഡൽ തെറ്റായ പ്രവചനമുണ്ടാക്കിയാൽ, ഈ ഘടകം നിങ്ങൾക്ക് ആ പ്രവചനത്തെ പ്രേരിപ്പിച്ച സവിശേഷതകൾ അല്ലെങ്കിൽ സവിശേഷതാ മൂല്യങ്ങൾ കണ്ടെത്താൻ സഹായിക്കുന്നു. ഈ വിശദാംശം ഡീബഗ്ഗിംഗിനും പാരദർശകതക്കും ഉത്തരവാദിത്വത്തിനും സഹായിക്കുന്നു. അവസാനം, ഈ ഘടകം നീതിപൂർണത പ്രശ്നങ്ങൾ കണ്ടെത്താനും സഹായിക്കുന്നു. ഉദാഹരണത്തിന്, ജാതി അല്ലെങ്കിൽ ലിംഗം പോലുള്ള സെൻസിറ്റീവ് സവിശേഷത മോഡലിന്റെ പ്രവചനത്തെ വളരെ സ്വാധീനിക്കുന്നുവെങ്കിൽ, ഇത് മോഡലിൽ ജാതി അല്ലെങ്കിൽ ലിംഗഭേദം ഉണ്ടാകാമെന്ന സൂചനയാണ്.
![സവിശേഷതാ പ്രാധാന്യം](../../../../translated_images/9-features-influence.3ead3d3f68a84029f1e40d3eba82107445d3d3b6975d4682b23d8acc905da6d0.ml.png)
വ്യാഖ്യാനം ഉപയോഗിക്കേണ്ടത്:
* നിങ്ങളുടെ AI സിസ്റ്റത്തിന്റെ പ്രവചനങ്ങൾ എത്രത്തോളം വിശ്വസനീയമാണെന്ന് നിർണയിക്കാൻ, പ്രവചനങ്ങൾക്ക് ഏറ്റവും പ്രധാനപ്പെട്ട സവിശേഷതകൾ മനസ്സിലാക്കുക.
* മോഡൽ ആദ്യം മനസ്സിലാക്കി, അത് ആരോഗ്യകരമായ സവിശേഷതകൾ ഉപയോഗിക്കുന്നുണ്ടോ അല്ലെങ്കിൽ തെറ്റായ ബന്ധങ്ങളാണോ എന്ന് തിരിച്ചറിയുക, അതിലൂടെ ഡീബഗ് ചെയ്യുക.
* മോഡൽ സെൻസിറ്റീവ് സവിശേഷതകളിൽ അല്ലെങ്കിൽ അവയുമായി ശക്തമായി ബന്ധപ്പെട്ട സവിശേഷതകളിൽ അടിസ്ഥാനമാക്കി പ്രവചനങ്ങൾ നടത്തുകയാണോ എന്ന് മനസ്സിലാക്കി അനീതിയുടെ സാധ്യത കണ്ടെത്തുക.
* പ്രാദേശിക വിശദീകരണങ്ങൾ സൃഷ്ടിച്ച് ഉപയോക്തൃ വിശ്വാസം വളർത്തുക.
* AI സിസ്റ്റത്തിന്റെ നിയമാനുസൃത ഓഡിറ്റ് പൂർത്തിയാക്കുക, മോഡലുകൾ സ്ഥിരീകരിക്കുകയും മനുഷ്യരിൽ മോഡൽ തീരുമാനങ്ങളുടെ സ്വാധീനം നിരീക്ഷിക്കുകയും ചെയ്യുക.
## സമാപനം
എല്ലാ RAI ഡാഷ്ബോർഡ് ഘടകങ്ങളും സമൂഹത്തിന് കുറവു ഹാനികരവും കൂടുതൽ വിശ്വസനീയവുമായ മെഷീൻ ലേണിംഗ് മോഡലുകൾ നിർമ്മിക്കാൻ സഹായിക്കുന്ന പ്രായോഗിക ഉപകരണങ്ങളാണ്. ഇത് മനുഷ്യാവകാശങ്ങൾക്ക് ഭീഷണി സൃഷ്ടിക്കുന്നത് തടയുന്നു; ചില ഗ്രൂപ്പുകളെ ജീവിത അവസരങ്ങളിൽ നിന്ന് വിവേചനം ചെയ്യുകയോ ഒഴിവാക്കുകയോ ചെയ്യുന്നത് തടയുന്നു; ശാരീരികമോ മാനസികമോ പരിക്കിന്റെ അപകടം കുറയ്ക്കുന്നു. കൂടാതെ, പ്രാദേശിക വിശദീകരണങ്ങൾ സൃഷ്ടിച്ച് മോഡലിന്റെ തീരുമാനങ്ങളിൽ വിശ്വാസം വളർത്താൻ സഹായിക്കുന്നു. ചില സാധ്യതയുള്ള ഹാനികൾ:
- **വിതരണം**: ഉദാഹരണത്തിന്, ഒരു ലിംഗം അല്ലെങ്കിൽ ജാതി മറ്റൊന്നിനെ അപേക്ഷിച്ച് മുൻഗണന ലഭിക്കുന്നത്.
- **സേവന ഗുണമേന്മ**: ഒരു പ്രത്യേക സാഹചര്യത്തിനായി ഡാറ്റ പരിശീലിപ്പിച്ചാൽ, എന്നാൽ യാഥാർത്ഥ്യം അതിനേക്കാൾ സങ്കീർണ്ണമായിരിക്കുമ്പോൾ, സേവനം മോശമായി പ്രവർത്തിക്കും.
- **സ്റ്റീരിയോടൈപ്പിംഗ്**: ഒരു ഗ്രൂപ്പിനെ മുൻകൂട്ടി നിശ്ചയിച്ച ഗുണങ്ങളുമായി ബന്ധിപ്പിക്കൽ.
- **നിന്ദനം**. അന്യായമായി എന്തെങ്കിലും അല്ലെങ്കിൽ ആരെയെങ്കിലും വിമർശിക്കുകയും ലേബൽ ചെയ്യുകയും ചെയ്യുക.
- **അധികം അല്ലെങ്കിൽ കുറവ് പ്രതിനിധാനം**. ഒരു പ്രത്യേക ഗ്രൂപ്പ് ഒരു പ്രത്യേക തൊഴിൽ മേഖലയിൽ കാണപ്പെടുന്നില്ലെന്ന ആശയമാണ്, ആ സേവനം അല്ലെങ്കിൽ ഫംഗ്ഷൻ അത് പ്രോത്സാഹിപ്പിക്കുന്നത് ഹാനികരമാണെന്ന് കരുതുന്നു.
### Azure RAI ഡാഷ്ബോർഡ്
[Azure RAI ഡാഷ്ബോർഡ്](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) മൈക്രോസോഫ്റ്റ് ഉൾപ്പെടെയുള്ള പ്രമുഖ അക്കാദമിക് സ്ഥാപനങ്ങളും സംഘടനകളും വികസിപ്പിച്ചെടുത്ത ഓപ്പൺ-സോഴ്‌സ് ടൂളുകളിൽ നിർമ്മിച്ചിരിക്കുന്നു, ഇത് ഡാറ്റാ സയന്റിസ്റ്റുകൾക്കും AI ഡെവലപ്പർമാർക്കും മോഡൽ പെരുമാറ്റം മെച്ചമായി മനസിലാക്കാനും AI മോഡലുകളിൽ നിന്നുള്ള അനിഷ്ടമായ പ്രശ്നങ്ങൾ കണ്ടെത്താനും പരിഹരിക്കാനും സഹായിക്കുന്നു.
- RAI ഡാഷ്ബോർഡിന്റെ വിവിധ ഘടകങ്ങൾ എങ്ങനെ ഉപയോഗിക്കാമെന്ന് അറിയാൻ RAI ഡാഷ്ബോർഡ് [ഡോക്യുമെന്റേഷൻ](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) പരിശോധിക്കുക.
- Azure Machine Learning-ൽ കൂടുതൽ ഉത്തരവാദിത്വമുള്ള AI സീനാരിയോകൾ ഡീബഗ് ചെയ്യാൻ ചില RAI ഡാഷ്ബോർഡ് [സാമ്പിൾ നോട്ട്‌ബുക്കുകൾ](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) പരിശോധിക്കുക.
---
## 🚀 വെല്ലുവിളി
സांഖ്യിക അല്ലെങ്കിൽ ഡാറ്റാ പാകം ആദ്യഘട്ടത്തിൽ തന്നെ വരാതിരിക്കാൻ, നമുക്ക് ചെയ്യേണ്ടത്:
- സിസ്റ്റങ്ങളിൽ ജോലി ചെയ്യുന്ന ആളുകൾക്ക് വ്യത്യസ്ത പശ്ചാത്തലങ്ങളും കാഴ്ചപ്പാടുകളും ഉണ്ടായിരിക്കണം
- നമ്മുടെ സമൂഹത്തിന്റെ വൈവിധ്യം പ്രതിഫലിപ്പിക്കുന്ന ഡാറ്റാസെറ്റുകളിൽ നിക്ഷേപം നടത്തണം
- പാകം സംഭവിക്കുമ്പോൾ അത് കണ്ടെത്താനും ശരിയാക്കാനും മികച്ച രീതികൾ വികസിപ്പിക്കണം
മോഡൽ നിർമ്മാണത്തിലും ഉപയോഗത്തിലും അന്യായത വ്യക്തമായ യഥാർത്ഥ ജീവിത സാഹചര്യങ്ങളെക്കുറിച്ച് ചിന്തിക്കുക. മറ്റെന്തെല്ലാം പരിഗണിക്കണം?
## [പോസ്റ്റ്-ലെക്ചർ ക്വിസ്](https://ff-quizzes.netlify.app/en/ml/)
## അവലോകനം & സ്വയം പഠനം
ഈ പാഠത്തിൽ, നിങ്ങൾ ഉത്തരവാദിത്വമുള്ള AI യെ മെഷീൻ ലേണിങ്ങിൽ ഉൾപ്പെടുത്താനുള്ള ചില പ്രായോഗിക ഉപകരണങ്ങൾ പഠിച്ചു.
ഈ വർക്ക്‌ഷോപ്പ് കാണുക വിഷയങ്ങളിൽ കൂടുതൽ ആഴത്തിൽ പ്രവേശിക്കാൻ:
- Responsible AI Dashboard: One-stop shop for operationalizing RAI in practice by Besmira Nushi and Mehrnoosh Sameki
[![Responsible AI Dashboard: One-stop shop for operationalizing RAI in practice](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Responsible AI Dashboard: One-stop shop for operationalizing RAI in practice")
> 🎥 വീഡിയോക്കായി മുകളിൽ കാണുന്ന ചിത്രം ക്ലിക്ക് ചെയ്യുക: Responsible AI Dashboard: One-stop shop for operationalizing RAI in practice by Besmira Nushi and Mehrnoosh Sameki
ഉത്തരവാദിത്വമുള്ള AI യെക്കുറിച്ച് കൂടുതൽ അറിയാനും കൂടുതൽ വിശ്വസനീയമായ മോഡലുകൾ നിർമ്മിക്കാനും താഴെപ്പറയുന്ന വസ്തുക്കൾ കാണുക:
- ML മോഡലുകൾ ഡീബഗ് ചെയ്യുന്നതിനുള്ള മൈക്രോസോഫ്റ്റിന്റെ RAI ഡാഷ്ബോർഡ് ടൂളുകൾ: [Responsible AI tools resources](https://aka.ms/rai-dashboard)
- Responsible AI ടൂൾകിറ്റ് പരിശോധിക്കുക: [Github](https://github.com/microsoft/responsible-ai-toolbox)
- മൈക്രോസോഫ്റ്റിന്റെ RAI റിസോഴ്‌സ് സെന്റർ: [Responsible AI Resources Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- മൈക്രോസോഫ്റ്റിന്റെ FATE ഗവേഷണ സംഘം: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
## അസൈൻമെന്റ്
[RAI ഡാഷ്ബോർഡ് പരിശോധിക്കുക](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, യന്ത്രം ചെയ്ത വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "91c6a180ef08e20cc15acfd2d6d6e164",
"translation_date": "2025-12-19T15:15:39+00:00",
"source_file": "9-Real-World/2-Debugging-ML-Models/assignment.md",
"language_code": "ml"
}
-->
# ഉത്തരവാദിത്വമുള്ള AI (RAI) ഡാഷ്ബോർഡ് അന്വേഷിക്കുക
## നിർദ്ദേശങ്ങൾ
ഈ പാഠത്തിൽ നിങ്ങൾ RAI ഡാഷ്ബോർഡിനെക്കുറിച്ച് പഠിച്ചു, ഇത് "ഓപ്പൺ-സോഴ്‌സ്" ടൂളുകളിൽ നിർമ്മിച്ച ഘടകങ്ങളുടെ ഒരു സ്യൂട്ട് ആണ്, ഡാറ്റാ സയന്റിസ്റ്റുകൾക്ക് AI സിസ്റ്റങ്ങളിൽ പിശക് വിശകലനം, ഡാറ്റാ അന്വേഷണ, നീതിമാനായ വിലയിരുത്തൽ, മോഡൽ വ്യാഖ്യാനം, കൗണ്ടർഫാക്റ്റ്/എന്തായിരിക്കും വിലയിരുത്തലുകൾ, കാരണപരമായ വിശകലനം എന്നിവ നടത്താൻ സഹായിക്കുന്നു." ഈ അസൈൻമെന്റിനായി, RAI ഡാഷ്ബോർഡിന്റെ ചില സാമ്പിൾ [നോട്ട്ബുക്കുകൾ](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) പരിശോധിച്ച് നിങ്ങളുടെ കണ്ടെത്തലുകൾ ഒരു പേപ്പർ അല്ലെങ്കിൽ പ്രეზന്റേഷനിൽ റിപ്പോർട്ട് ചെയ്യുക.
## റൂബ്രിക്
| മാനദണ്ഡം | ഉദാഹരണമായത് | മതിയായത് | മെച്ചപ്പെടുത്തേണ്ടത് |
| -------- | --------- | -------- | ----------------- |
| | RAI ഡാഷ്ബോർഡിന്റെ ഘടകങ്ങൾ, പ്രവർത്തിപ്പിച്ച നോട്ട്ബുക്ക്, അതിൽ നിന്നുള്ള നിഗമനങ്ങൾ ചർച്ച ചെയ്യുന്ന ഒരു പേപ്പർ അല്ലെങ്കിൽ പവർപോയിന്റ് പ്രეზന്റേഷൻ അവതരിപ്പിക്കുന്നു | നിഗമനങ്ങൾ ഇല്ലാതെ ഒരു പേപ്പർ അവതരിപ്പിക്കുന്നു | ഒരു പേപ്പർ അവതരിപ്പിക്കുന്നില്ല |
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാപത്രം**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, യന്ത്രം ചെയ്ത വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കപ്പെടണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,34 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "5e069a0ac02a9606a69946c2b3c574a9",
"translation_date": "2025-12-19T13:05:50+00:00",
"source_file": "9-Real-World/README.md",
"language_code": "ml"
}
-->
# പോസ്റ്റ്‌സ്‌ക്രിപ്റ്റ്: ക്ലാസിക് മെഷീൻ ലേണിങ്ങിന്റെ യഥാർത്ഥ ലോക പ്രയോഗങ്ങൾ
പാഠ്യപദ്ധതിയുടെ ഈ വിഭാഗത്തിൽ, നിങ്ങൾക്ക് ക്ലാസിക്കൽ എംഎൽ ഉപയോഗിച്ച യഥാർത്ഥ ലോക പ്രയോഗങ്ങളെ പരിചയപ്പെടുത്തും. നാം ന്യുറൽ നെറ്റ്വർക്കുകൾ, ഡീപ്പ് ലേണിംഗ്, എഐ എന്നിവ ഒഴിവാക്കി ഈ തന്ത്രങ്ങൾ ഉപയോഗിച്ച പ്രയോഗങ്ങളെക്കുറിച്ചുള്ള വൈറ്റ്‌പേപ്പറുകളും ലേഖനങ്ങളും കണ്ടെത്താൻ ഇന്റർനെറ്റ് തിരഞ്ഞെടുത്തു. ബിസിനസ് സിസ്റ്റങ്ങൾ, പരിസ്ഥിതി പ്രയോഗങ്ങൾ, ഫിനാൻസ്, കലയും സംസ്കാരവും ഉൾപ്പെടെ എങ്ങനെ എംഎൽ ഉപയോഗിക്കപ്പെടുന്നു എന്ന് പഠിക്കൂ.
![chess](../../../translated_images/chess.e704a268781bdad85d1876b6c2295742fa0d856e7dcf3659147052df9d3db205.ml.jpg)
> ഫോട്ടോ <a href="https://unsplash.com/@childeye?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Alexis Fauvet</a> <a href="https://unsplash.com/s/photos/artificial-intelligence?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a> ൽ നിന്നാണ്
## പാഠം
1. [എംഎൽ-ന് യഥാർത്ഥ ലോക പ്രയോഗങ്ങൾ](1-Applications/README.md)
2. [റസ്പോൺസിബിൾ എഐ ഡാഷ്ബോർഡ് ഘടകങ്ങൾ ഉപയോഗിച്ച് മെഷീൻ ലേണിങ്ങിൽ മോഡൽ ഡീബഗ്ഗിംഗ്](2-Debugging-ML-Models/README.md)
## ക്രെഡിറ്റുകൾ
"യഥാർത്ഥ ലോക പ്രയോഗങ്ങൾ" എന്നത് [ജെൻ ലൂപ്പർ](https://twitter.com/jenlooper)യും [ഓർനെല്ല അൽതുന്യൻ](https://twitter.com/ornelladotcom) ഉൾപ്പെടെയുള്ള ഒരു സംഘത്താൽ എഴുതപ്പെട്ടതാണ്.
"റസ്പോൺസിബിൾ എഐ ഡാഷ്ബോർഡ് ഘടകങ്ങൾ ഉപയോഗിച്ച് മെഷീൻ ലേണിങ്ങിൽ മോഡൽ ഡീബഗ്ഗിംഗ്" [റുത് യകുബു](https://twitter.com/ruthieyakubu) എഴുതിയതാണ്.
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,347 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "93fdaa0fd38836e50c4793e2f2f25e8b",
"translation_date": "2025-12-19T12:40:49+00:00",
"source_file": "AGENTS.md",
"language_code": "ml"
}
-->
# AGENTS.md
## Project Overview
ഇത് **Machine Learning for Beginners** ആണ്, പൈതൺ (പ്രധാനമായും Scikit-learn ഉപയോഗിച്ച്)യും R ഉം ഉപയോഗിച്ച് ക്ലാസിക് മെഷീൻ ലേണിംഗ് ആശയങ്ങൾ ഉൾക്കൊള്ളുന്ന സമഗ്രമായ 12 ആഴ്ച, 26 പാഠപുസ്തക കോഴ്സ്. ഈ റിപോസിറ്ററി സ്വയം പഠനത്തിനുള്ള ഒരു വിഭവമായി രൂപകൽപ്പന ചെയ്തതാണ്, പ്രായോഗിക പ്രോജക്റ്റുകൾ, ക്വിസുകൾ, അസൈൻമെന്റുകൾ എന്നിവയോടുകൂടി. ഓരോ പാഠവും ലോകമാകെയുള്ള വിവിധ സംസ്കാരങ്ങളുടെയും പ്രദേശങ്ങളുടെയും യഥാർത്ഥ ഡാറ്റ ഉപയോഗിച്ച് ML ആശയങ്ങൾ പരിശോധിക്കുന്നു.
പ്രധാന ഘടകങ്ങൾ:
- **വിദ്യാഭ്യാസ ഉള്ളടക്കം**: ML പരിചയം, റെഗ്രഷൻ, ക്ലാസിഫിക്കേഷൻ, ക്ലസ്റ്ററിംഗ്, NLP, ടൈം സീരീസ്, റീഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ് എന്നിവ ഉൾപ്പെടുന്ന 26 പാഠങ്ങൾ
- **ക്വിസ് ആപ്പ്**: Vue.js അടിസ്ഥാനമാക്കിയുള്ള ക്വിസ് ആപ്പ്, പാഠത്തിന് മുൻപും ശേഷവും മൂല്യനിർണയം
- **ബഹുഭാഷാ പിന്തുണ**: GitHub Actions വഴി 40+ ഭാഷകളിലേക്ക് സ്വയം വിവർത്തനം
- **രണ്ടു ഭാഷാ പിന്തുണ**: പാഠങ്ങൾ Python (Jupyter നോട്ട്‌ബുക്കുകൾ) ഉം R (R Markdown ഫയലുകൾ) ഉം ആയി ലഭ്യമാണ്
- **പ്രോജക്റ്റ് അടിസ്ഥാന പഠനം**: ഓരോ വിഷയത്തിനും പ്രായോഗിക പ്രോജക്റ്റുകളും അസൈൻമെന്റുകളും ഉൾപ്പെടുന്നു
## Repository Structure
```
ML-For-Beginners/
├── 1-Introduction/ # ML basics, history, fairness, techniques
├── 2-Regression/ # Regression models with Python/R
├── 3-Web-App/ # Flask web app for ML model deployment
├── 4-Classification/ # Classification algorithms
├── 5-Clustering/ # Clustering techniques
├── 6-NLP/ # Natural Language Processing
├── 7-TimeSeries/ # Time series forecasting
├── 8-Reinforcement/ # Reinforcement learning
├── 9-Real-World/ # Real-world ML applications
├── quiz-app/ # Vue.js quiz application
├── translations/ # Auto-generated translations
└── sketchnotes/ # Visual learning aids
```
ഓരോ പാഠ ഫോൾഡറിലും സാധാരണയായി ഉണ്ടാകുന്നത്:
- `README.md` - പ്രധാന പാഠ ഉള്ളടക്കം
- `notebook.ipynb` - Python Jupyter നോട്ട്‌ബുക്ക്
- `solution/` - പരിഹാര കോഡ് (Python, R പതിപ്പുകൾ)
- `assignment.md` - അഭ്യാസങ്ങൾ
- `images/` - ദൃശ്യ വിഭവങ്ങൾ
## Setup Commands
### Python പാഠങ്ങൾക്കായി
മിക്ക പാഠങ്ങളും Jupyter നോട്ട്‌ബുക്കുകൾ ഉപയോഗിക്കുന്നു. ആവശ്യമായ ഡിപ്പെൻഡൻസികൾ ഇൻസ്റ്റാൾ ചെയ്യുക:
```bash
# Python 3.8+ ഇതിനകം ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ലെങ്കിൽ ഇൻസ്റ്റാൾ ചെയ്യുക
python --version
# Jupyter ഇൻസ്റ്റാൾ ചെയ്യുക
pip install jupyter
# സാധാരണ ML ലൈബ്രറികൾ ഇൻസ്റ്റാൾ ചെയ്യുക
pip install scikit-learn pandas numpy matplotlib seaborn
# പ്രത്യേക പാഠങ്ങൾക്കായി, പാഠം-നിർദ്ദിഷ്ട ആവശ്യകതകൾ പരിശോധിക്കുക
# ഉദാഹരണം: വെബ് ആപ്പ് പാഠം
pip install flask
```
### R പാഠങ്ങൾക്കായി
R പാഠങ്ങൾ `solution/R/` ഫോൾഡറുകളിൽ `.rmd` അല്ലെങ്കിൽ `.ipynb` ഫയലുകളായി ഉണ്ട്:
```bash
# Rയു ആവശ്യമായ പാക്കേജുകളും ഇൻസ്റ്റാൾ ചെയ്യുക
# R കൺസോളിൽ:
install.packages(c("tidyverse", "tidymodels", "caret"))
```
### ക്വിസ് ആപ്പിനായി
ക്വിസ് ആപ്പ് `quiz-app/` ഡയറക്ടറിയിൽ ഉള്ള Vue.js ആപ്പാണ്:
```bash
cd quiz-app
npm install
```
### ഡോക്യുമെന്റേഷൻ സൈറ്റിനായി
ഡോക്യുമെന്റേഷൻ ലോക്കലായി പ്രവർത്തിപ്പിക്കാൻ:
```bash
# ഡോക്സിഫൈ ഇൻസ്റ്റാൾ ചെയ്യുക
npm install -g docsify-cli
# റിപോസിറ്ററി റൂട്ടിൽ നിന്ന് സർവ് ചെയ്യുക
docsify serve
# http://localhost:3000 ൽ ആക്‌സസ് ചെയ്യുക
```
## Development Workflow
### പാഠ നോട്ട്‌ബുക്കുകളുമായി ജോലി ചെയ്യൽ
1. പാഠ ഡയറക്ടറിയിലേക്ക് പോകുക (ഉദാ: `2-Regression/1-Tools/`)
2. Jupyter നോട്ട്‌ബുക്ക് തുറക്കുക:
```bash
jupyter notebook notebook.ipynb
```
3. പാഠ ഉള്ളടക്കം, അഭ്യാസങ്ങൾ ചെയ്യുക
4. ആവശ്യമായാൽ `solution/` ഫോൾഡറിൽ പരിഹാരങ്ങൾ പരിശോധിക്കുക
### Python ഡെവലപ്പ്മെന്റ്
- പാഠങ്ങൾ സാധാരണ Python ഡാറ്റ സയൻസ് ലൈബ്രറികൾ ഉപയോഗിക്കുന്നു
- ഇന്ററാക്ടീവ് പഠനത്തിന് Jupyter നോട്ട്‌ബുക്കുകൾ
- ഓരോ പാഠത്തിന്റെയും `solution/` ഫോൾഡറിൽ പരിഹാര കോഡ് ലഭ്യമാണ്
### R ഡെവലപ്പ്മെന്റ്
- R പാഠങ്ങൾ `.rmd` ഫോർമാറ്റിൽ (R Markdown)
- പരിഹാരങ്ങൾ `solution/R/` സബ്‌ഡയറക്ടറികളിൽ
- RStudio അല്ലെങ്കിൽ R കർണൽ ഉപയോഗിച്ച് Jupyter വഴി R നോട്ട്‌ബുക്കുകൾ പ്രവർത്തിപ്പിക്കുക
### ക്വിസ് ആപ്പ് ഡെവലപ്പ്മെന്റ്
```bash
cd quiz-app
# വികസന സെർവർ ആരംഭിക്കുക
npm run serve
# http://localhost:8080 ൽ പ്രവേശിക്കുക
# ഉത്പാദനത്തിനായി നിർമ്മിക്കുക
npm run build
# ഫയലുകൾ ലിന്റ് ചെയ്ത് ശരിയാക്കുക
npm run lint
```
## Testing Instructions
### ക്വിസ് ആപ്പ് ടെസ്റ്റിംഗ്
```bash
cd quiz-app
# കോഡ് ലിന്റ് ചെയ്യുക
npm run lint
# പിശകുകൾ ഇല്ലെന്ന് സ്ഥിരീകരിക്കാൻ നിർമ്മിക്കുക
npm run build
```
**കുറിപ്പ്**: ഇത് പ്രധാനമായും ഒരു വിദ്യാഭ്യാസ കോഴ്സ് റിപോസിറ്ററിയാണ്. പാഠ ഉള്ളടക്കത്തിന് യാന്ത്രിക പരിശോധനകൾ ഇല്ല. സാധൂകരണം നടത്തുന്നത്:
- പാഠ അഭ്യാസങ്ങൾ പൂർത്തിയാക്കൽ
- നോട്ട്‌ബുക്ക് സെല്ലുകൾ വിജയകരമായി പ്രവർത്തിപ്പിക്കൽ
- പരിഹാരങ്ങളിലെ പ്രതീക്ഷിച്ച ഫലങ്ങൾ പരിശോധിക്കൽ
## Code Style Guidelines
### Python കോഡ്
- PEP 8 സ്റ്റൈൽ മാർഗ്ഗനിർദ്ദേശങ്ങൾ പാലിക്കുക
- വ്യക്തമായ, വിവരണാത്മകമായ വേരിയബിൾ നാമങ്ങൾ ഉപയോഗിക്കുക
- സങ്കീർണ്ണ പ്രവർത്തനങ്ങൾക്ക് കമന്റുകൾ ഉൾപ്പെടുത്തുക
- Jupyter നോട്ട്‌ബുക്കുകളിൽ ആശയങ്ങൾ വിശദീകരിക്കുന്ന മാർക്ക്ഡൗൺ സെല്ലുകൾ വേണം
### JavaScript/Vue.js (ക്വിസ് ആപ്പ്)
- Vue.js സ്റ്റൈൽ ഗൈഡ് പാലിക്കുക
- `quiz-app/package.json` ൽ ESLint കോൺഫിഗറേഷൻ
- പ്രശ്നങ്ങൾ പരിശോധിക്കാൻ, സ്വയം പരിഹരിക്കാൻ `npm run lint` ഓടിക്കുക
### ഡോക്യുമെന്റേഷൻ
- മാർക്ക്ഡൗൺ ഫയലുകൾ വ്യക്തവും നന്നായി ഘടിപ്പിച്ചവയും ആയിരിക്കണം
- കോഡ് ഉദാഹരണങ്ങൾ ഫെൻസ്ഡ് കോഡ് ബ്ലോക്കുകളിൽ ഉൾപ്പെടുത്തുക
- ആന്തരിക റഫറൻസുകൾക്ക് സാപേക്ഷ ലിങ്കുകൾ ഉപയോഗിക്കുക
- നിലവിലുള്ള ഫോർമാറ്റിംഗ് പരമ്പരാഗതങ്ങൾ പാലിക്കുക
## Build and Deployment
### ക്വിസ് ആപ്പ് ഡിപ്ലോയ്മെന്റ്
ക്വിസ് ആപ്പ് Azure Static Web Apps-ലേക്ക് ഡിപ്ലോയ് ചെയ്യാം:
1. **ആവശ്യങ്ങൾ**:
- Azure അക്കൗണ്ട്
- GitHub റിപോസിറ്ററി (മുൻകൂട്ടി ഫോർക്ക് ചെയ്തത്)
2. **Azure-ലേക്ക് ഡിപ്ലോയ് ചെയ്യുക**:
- Azure Static Web App റിസോഴ്‌സ് സൃഷ്ടിക്കുക
- GitHub റിപോസിറ്ററിയുമായി കണക്ട് ചെയ്യുക
- ആപ്പ് ലൊക്കേഷൻ: `/quiz-app`
- ഔട്ട്പുട്ട് ലൊക്കേഷൻ: `dist`
- Azure സ്വയം GitHub Actions workflow സൃഷ്ടിക്കും
3. **GitHub Actions Workflow**:
- `.github/workflows/azure-static-web-apps-*.yml` ൽ workflow ഫയൽ സൃഷ്ടിക്കും
- മെയിൻ ബ്രാഞ്ചിലേക്ക് പുഷ് ചെയ്താൽ സ്വയം ബിൽഡ് ചെയ്ത് ഡിപ്ലോയ് ചെയ്യും
### ഡോക്യുമെന്റേഷൻ PDF
ഡോക്യുമെന്റേഷൻ നിന്ന് PDF സൃഷ്ടിക്കുക:
```bash
npm install
npm run convert
```
## Translation Workflow
**പ്രധാനമാണ്**: വിവർത്തനങ്ങൾ GitHub Actions ഉപയോഗിച്ച് Co-op Translator വഴി സ്വയം നടക്കുന്നു.
- `main` ബ്രാഞ്ചിൽ മാറ്റങ്ങൾ പുഷ് ചെയ്താൽ സ്വയം വിവർത്തനം സൃഷ്ടിക്കും
- **കൈയാൽ വിവർത്തനം ചെയ്യരുത്** - സിസ്റ്റം തന്നെ കൈകാര്യം ചെയ്യും
- `.github/workflows/co-op-translator.yml` ൽ workflow നിർവചിച്ചിരിക്കുന്നു
- Azure AI/OpenAI സേവനങ്ങൾ ഉപയോഗിച്ച് വിവർത്തനം
- 40+ ഭാഷകൾക്ക് പിന്തുണ
## Contributing Guidelines
### ഉള്ളടക്കം സംഭാവനക്കാർക്കായി
1. **റിപോസിറ്ററി ഫോർക്ക് ചെയ്ത്** ഫീച്ചർ ബ്രാഞ്ച് സൃഷ്ടിക്കുക
2. **പാഠ ഉള്ളടക്കം മാറ്റങ്ങൾ വരുത്തുക** (പാഠങ്ങൾ ചേർക്കുകയോ അപ്ഡേറ്റ് ചെയ്യുകയോ ചെയ്യുമ്പോൾ)
3. **വിവർത്തന ഫയലുകൾ മാറ്റരുത്** - അവ സ്വയം സൃഷ്ടിക്കപ്പെട്ടവയാണ്
4. **കോഡ് ടെസ്റ്റ് ചെയ്യുക** - എല്ലാ നോട്ട്‌ബുക്ക് സെല്ലുകളും വിജയകരമായി ഓടണം
5. **ലിങ്കുകളും ചിത്രങ്ങളും ശരിയാണെന്ന് ഉറപ്പാക്കുക**
6. **സ്പഷ്ടമായ വിവരണത്തോടെ പുൾ റിക്വസ്റ്റ് സമർപ്പിക്കുക**
### പുൾ റിക്വസ്റ്റ് മാർഗ്ഗനിർദ്ദേശങ്ങൾ
- **ശീർഷകം ഫോർമാറ്റ്**: `[Section] മാറ്റങ്ങളുടെ സംക്ഷിപ്ത വിവരണം`
- ഉദാ: `[Regression] പാഠം 5-ൽ ടൈപ്പോ ശരിയാക്കൽ`
- ഉദാ: `[Quiz-App] ഡിപ്പെൻഡൻസികൾ അപ്ഡേറ്റ് ചെയ്യൽ`
- **സമർപ്പിക്കുന്നതിന് മുമ്പ്**:
- എല്ലാ നോട്ട്‌ബുക്ക് സെല്ലുകളും പിശകില്ലാതെ ഓടുന്നത് ഉറപ്പാക്കുക
- ക്വിസ് ആപ്പ് മാറ്റുമ്പോൾ `npm run lint` ഓടിക്കുക
- മാർക്ക്ഡൗൺ ഫോർമാറ്റിംഗ് പരിശോധിക്കുക
- പുതിയ കോഡ് ഉദാഹരണങ്ങൾ ടെസ്റ്റ് ചെയ്യുക
- **PR-ൽ ഉൾപ്പെടുത്തേണ്ടത്**:
- മാറ്റങ്ങളുടെ വിവരണം
- മാറ്റങ്ങളുടെ കാരണം
- UI മാറ്റങ്ങൾ ഉണ്ടെങ്കിൽ സ്ക്രീൻഷോട്ടുകൾ
- **കോഡ് ഓഫ് കണ്ടക്റ്റ്**: [Microsoft Open Source Code of Conduct](CODE_OF_CONDUCT.md) പാലിക്കുക
- **CLA**: Contributor License Agreement ഒപ്പിടേണ്ടതാണ്
## Lesson Structure
ഓരോ പാഠവും ഒരു സ്ഥിരമായ മാതൃക പിന്തുടരുന്നു:
1. **പ്രീ-ലെക്ചർ ക്വിസ്** - അടിസ്ഥാന അറിവ് പരിശോധിക്കുക
2. **പാഠ ഉള്ളടക്കം** - എഴുത്ത് നിർദ്ദേശങ്ങളും വിശദീകരണങ്ങളും
3. **കോഡ് ഡെമോ** - നോട്ട്‌ബുക്കുകളിൽ പ്രായോഗിക ഉദാഹരണങ്ങൾ
4. **അറിവ് പരിശോധനകൾ** - പഠനമനസ്സിലാക്കൽ ഉറപ്പാക്കുക
5. **ചലഞ്ച്** - ആശയങ്ങൾ സ്വതന്ത്രമായി പ്രയോഗിക്കുക
6. **അസൈൻമെന്റ്** - വിപുലമായ അഭ്യാസം
7. **പോസ്റ്റ്-ലെക്ചർ ക്വിസ്** - പഠനഫലം വിലയിരുത്തുക
## Common Commands Reference
```bash
# Python/Jupyter
jupyter notebook # Jupyter സെർവർ ആരംഭിക്കുക
jupyter notebook notebook.ipynb # പ്രത്യേക നോട്ട്‌ബുക്ക് തുറക്കുക
pip install -r requirements.txt # ആശ്രിതങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യുക (ലഭ്യമായിടത്ത്)
# ക്വിസ് ആപ്പ്
cd quiz-app
npm install # ആശ്രിതങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യുക
npm run serve # വികസന സെർവർ
npm run build # പ്രൊഡക്ഷൻ ബിൽഡ്
npm run lint # ലിന്റ് ചെയ്ത് ശരിയാക്കുക
# ഡോക്യുമെന്റേഷൻ
docsify serve # ഡോക്യുമെന്റേഷൻ പ്രാദേശികമായി സർവ് ചെയ്യുക
npm run convert # PDF സൃഷ്ടിക്കുക
# Git പ്രവൃത്തി പ്രവാഹം
git checkout -b feature/my-change # ഫീച്ചർ ബ്രാഞ്ച് സൃഷ്ടിക്കുക
git add . # മാറ്റങ്ങൾ സ്റ്റേജ് ചെയ്യുക
git commit -m "Description" # മാറ്റങ്ങൾ കമ്മിറ്റ് ചെയ്യുക
git push origin feature/my-change # റിമോട്ട്‌ിലേക്ക് പുഷ് ചെയ്യുക
```
## Additional Resources
- **Microsoft Learn Collection**: [ML for Beginners modules](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
- **Quiz App**: [Online quizzes](https://ff-quizzes.netlify.app/en/ml/)
- **Discussion Board**: [GitHub Discussions](https://github.com/microsoft/ML-For-Beginners/discussions)
- **Video Walkthroughs**: [YouTube Playlist](https://aka.ms/ml-beginners-videos)
## Key Technologies
- **Python**: ML പാഠങ്ങൾക്ക് പ്രധാന ഭാഷ (Scikit-learn, Pandas, NumPy, Matplotlib)
- **R**: tidyverse, tidymodels, caret ഉപയോഗിച്ച് ബദൽ നടപ്പാക്കൽ
- **Jupyter**: Python പാഠങ്ങൾക്ക് ഇന്ററാക്ടീവ് നോട്ട്‌ബുക്കുകൾ
- **R Markdown**: R പാഠങ്ങൾക്ക് ഡോക്യുമെന്റുകൾ
- **Vue.js 3**: ക്വിസ് ആപ്പ് ഫ്രെയിംവർക്ക്
- **Flask**: ML മോഡൽ ഡിപ്ലോയ്മെന്റിനുള്ള വെബ് ആപ്പ് ഫ്രെയിംവർക്ക്
- **Docsify**: ഡോക്യുമെന്റേഷൻ സൈറ്റ് ജനറേറ്റർ
- **GitHub Actions**: CI/CD, സ്വയം വിവർത്തനങ്ങൾ
## Security Considerations
- **കോഡിൽ രഹസ്യങ്ങൾ ഇല്ല**: API കീകൾ അല്ലെങ്കിൽ ക്രെഡൻഷ്യലുകൾ ഒരിക്കലും കമ്മിറ്റ് ചെയ്യരുത്
- **ഡിപ്പെൻഡൻസികൾ**: npm, pip പാക്കേജുകൾ അപ്ഡേറ്റ് ചെയ്തിരിക്കണം
- **ഉപയോക്തൃ ഇൻപുട്ട്**: Flask വെബ് ആപ്പ് ഉദാഹരണങ്ങളിൽ അടിസ്ഥാന ഇൻപുട്ട് പരിശോധന
- **സെൻസിറ്റീവ് ഡാറ്റ**: ഉദാഹരണ ഡാറ്റാസെറ്റുകൾ പൊതു, സെൻസിറ്റീവ് അല്ല
## Troubleshooting
### Jupyter നോട്ട്‌ബുക്കുകൾ
- **കർണൽ പ്രശ്നങ്ങൾ**: സെല്ലുകൾ ഹാംഗായാൽ Kernel → Restart ചെയ്യുക
- **ഇംപോർട്ട് പിശകുകൾ**: ആവശ്യമായ പാക്കേജുകൾ pip ഉപയോഗിച്ച് ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക
- **പാത പ്രശ്നങ്ങൾ**: നോട്ട്‌ബുക്കുകൾ അവരുടെ ഉള്ള ഡയറക്ടറിയിൽ നിന്ന് ഓടിക്കുക
### ക്വിസ് ആപ്പ്
- **npm install പരാജയം**: npm കാഷെ ക്ലിയർ ചെയ്യുക: `npm cache clean --force`
- **പോർട്ട് കോൺഫ്ലിക്റ്റുകൾ**: പോർട്ട് മാറ്റാൻ: `npm run serve -- --port 8081`
- **ബിൽഡ് പിശകുകൾ**: `node_modules` ഡിലീറ്റ് ചെയ്ത് വീണ്ടും ഇൻസ്റ്റാൾ ചെയ്യുക: `rm -rf node_modules && npm install`
### R പാഠങ്ങൾ
- **പാക്കേജ് കണ്ടെത്താനില്ല**: ഇൻസ്റ്റാൾ ചെയ്യുക: `install.packages("package-name")`
- **RMarkdown റെൻഡറിംഗ്**: rmarkdown പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക
- **കർണൽ പ്രശ്നങ്ങൾ**: Jupyter-ക്ക് IRkernel ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതുണ്ടാകാം
## Project-Specific Notes
- ഇത് പ്രധാനമായും **പഠന കോഴ്സ്** ആണ്, പ്രൊഡക്ഷൻ കോഡ് അല്ല
- **ML ആശയങ്ങൾ മനസ്സിലാക്കലിൽ** പ്രാധാന്യം, പ്രായോഗിക അഭ്യാസം മുഖേന
- കോഡ് ഉദാഹരണങ്ങൾ **വ്യക്തതയ്ക്ക് മുൻഗണന**
- മിക്ക പാഠങ്ങളും **സ്വയം പൂർത്തിയാക്കാവുന്നതും സ്വതന്ത്രവുമാണ്**
- **പരിഹാരങ്ങൾ നൽകിയിട്ടുണ്ട്**, പക്ഷേ പഠിതാക്കൾ ആദ്യം അഭ്യാസങ്ങൾ ശ്രമിക്കണം
- റിപോസിറ്ററി **Docsify** ഉപയോഗിച്ച് വെബ് ഡോക്യുമെന്റേഷൻ സൃഷ്ടിക്കുന്നു, ബിൽഡ് ഘട്ടമില്ലാതെ
- **സ്കെച്ച്നോട്ടുകൾ** ആശയങ്ങളുടെ ദൃശ്യ സംഗ്രഹങ്ങൾ നൽകുന്നു
- **ബഹുഭാഷാ പിന്തുണ** ഉള്ളടക്കം ആഗോളമായി ലഭ്യമാക്കുന്നു
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "c06b12caf3c901eb3156e3dd5b0aea56",
"translation_date": "2025-12-19T12:44:05+00:00",
"source_file": "CODE_OF_CONDUCT.md",
"language_code": "ml"
}
-->
# Microsoft ഓപ്പൺ സോഴ്‌സ് കോഡ് ഓഫ് കണ്ടക്റ്റ്
ഈ പ്രോജക്ട് [Microsoft ഓപ്പൺ സോഴ്‌സ് കോഡ് ഓഫ് കണ്ടക്റ്റ്](https://opensource.microsoft.com/codeofconduct/) സ്വീകരിച്ചിട്ടുണ്ട്.
സ്രോതസുകൾ:
- [Microsoft ഓപ്പൺ സോഴ്‌സ് കോഡ് ഓഫ് കണ്ടക്റ്റ്](https://opensource.microsoft.com/codeofconduct/)
- [Microsoft കോഡ് ഓഫ് കണ്ടക്റ്റ് FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
- ചോദ്യങ്ങൾക്കോ ആശങ്കകൾക്കോ [opencode@microsoft.com](mailto:opencode@microsoft.com) എന്ന വിലാസത്തിൽ ബന്ധപ്പെടുക
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**അസൂയാ**:
ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
Loading…
Cancel
Save