parent
f07ce14f6b
commit
8feadec552
@ -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",
|
||||
"<!---->\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,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,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 സമാനമായ, എന്നാൽ കൂടുതൽ സൂക്ഷ്മമായ ഒരു ചീറ്റ്ഷീറ്റ് നൽകുന്നു, ഇത് നിങ്ങളുടെ എസ്റ്റിമേറ്റർമാരെ (വർഗ്ഗീകരണ ഉപാധികൾക്ക് മറ്റൊരു പദം) കൂടുതൽ കുറയ്ക്കാൻ സഹായിക്കും:
|
||||
|
||||

|
||||
> ടിപ്പ്: [ഈ മാപ്പ് ഓൺലൈനിൽ സന്ദർശിക്കുക](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,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,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://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 നിങ്ങളുടെ മോഡലുകൾ കാണാൻ സഹായിക്കുന്ന ഉപകരണം ആണ്.
|
||||
|
||||
ഇപ്പോൾ ഈ മനോഹരമായ മോഡൽ വെബ് ആപ്പിൽ ഉപയോഗിക്കാൻ തയ്യാറാണ്. നിങ്ങളുടെ ഫ്രിഡ്ജിൽ നോക്കി ബാക്കി ഉള്ള ഘടകങ്ങൾ ഉപയോഗിച്ച് ഏത് ക്യൂസീൻ പാചകം ചെയ്യാമെന്ന് കണ്ടെത്താൻ സഹായിക്കുന്ന ഒരു ആപ്പ് നിർമ്മിക്കാം, നിങ്ങളുടെ മോഡൽ നിർദ്ദേശിക്കുന്നതുപോലെ.
|
||||
|
||||
## ശുപാർശാ വെബ് ആപ്പ് നിർമ്മിക്കുക
|
||||
|
||||
നിങ്ങളുടെ മോഡൽ നേരിട്ട് വെബ് ആപ്പിൽ ഉപയോഗിക്കാം. ഈ ആർക്കിടെക്ചർ ലോക്കലായി പോലും ഓൺലൈൻ അല്ലാതെ പ്രവർത്തിക്കാൻ അനുവദിക്കുന്നു. `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_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,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"
|
||||
}
|
||||
-->
|
||||
# വർഗ്ഗീകരണവുമായി ആരംഭിക്കുന്നത്
|
||||
|
||||
## പ്രാദേശിക വിഷയം: രുചികരമായ ഏഷ്യൻ, ഇന്ത്യൻ ഭക്ഷണങ്ങൾ 🍜
|
||||
|
||||
ഏഷ്യയിലും ഇന്ത്യയിലും ഭക്ഷണപരമ്പരകൾ വളരെ വൈവിധ്യമാർന്നതും, വളരെ രുചികരവുമാണ്! അവയുടെ ഘടകങ്ങൾ മനസ്സിലാക്കാൻ പ്രാദേശിക ഭക്ഷണങ്ങളെക്കുറിച്ചുള്ള ഡാറ്റ നോക്കാം.
|
||||
|
||||

|
||||
> ഫോട്ടോ <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) ആണ്, ഇത് ഒരു ഡാറ്റാസെറ്റ് ലേബൽ ചെയ്യപ്പെടാത്തതാണെന്ന് അല്ലെങ്കിൽ അതിന്റെ ഇൻപുട്ടുകൾ മുൻകൂട്ടി നിർവചിച്ച ഔട്ട്പുട്ടുകളുമായി പൊരുത്തപ്പെടാത്തതാണെന്ന് കരുതുന്നു. ഇത് ലേബൽ ചെയ്യപ്പെടാത്ത ഡാറ്റയിൽ നിന്നു വിവിധ ആൽഗോരിതങ്ങൾ ഉപയോഗിച്ച് ഡാറ്റയിൽ കാണുന്ന പാറ്റേണുകൾ അനുസരിച്ച് ഗ്രൂപ്പുകൾ നൽകുന്നു.
|
||||
|
||||
[](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) ഡാറ്റാ എക്സ്പ്ലോറേഷനിൽ വളരെ ഉപകാരപ്രദമാണ്. നൈജീരിയൻ പ്രേക്ഷകർ സംഗീതം എങ്ങനെ ഉപഭോഗിക്കുന്നു എന്നതിൽ ട്രെൻഡുകളും പാറ്റേണുകളും കണ്ടെത്താൻ ഇത് സഹായിക്കുമോ എന്ന് നോക്കാം.
|
||||
|
||||
✅ ക്ലസ്റ്ററിംഗിന്റെ ഉപയോഗങ്ങളെ കുറിച്ച് ഒരു മിനിറ്റ് ചിന്തിക്കുക. യാഥാർത്ഥ്യത്തിൽ, നിങ്ങൾക്ക് വസ്ത്രങ്ങൾ തൊട്ടു തരംതിരിക്കേണ്ടി വന്നപ്പോൾ ക്ലസ്റ്ററിംഗ് സംഭവിക്കുന്നു 🧦👕👖🩲. ഡാറ്റാ സയൻസിൽ, ഉപയോക്താവിന്റെ ഇഷ്ടങ്ങൾ വിശകലനം ചെയ്യുമ്പോഴും, ലേബൽ ചെയ്യപ്പെടാത്ത ഡാറ്റാസെറ്റിന്റെ സവിശേഷതകൾ നിർണയിക്കുമ്പോഴും ക്ലസ്റ്ററിംഗ് സംഭവിക്കുന്നു. ക്ലസ്റ്ററിംഗ് ഒരു വിധത്തിൽ അഴുക്കും കലക്കവും മനസ്സിലാക്കാൻ സഹായിക്കുന്നു, ഒരു സോക്ക് ഡ്രോയർ പോലെ.
|
||||
|
||||
[](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) ഒരു വളവിലൂടെ അളക്കപ്പെടുന്നു. നിങ്ങളുടെ ഡാറ്റ, ദൃശ്യവൽക്കരിച്ചപ്പോൾ, ഒരു സമതലത്തിൽ ഇല്ലാത്തതുപോലെ തോന്നുകയാണെങ്കിൽ, അതിനെ കൈകാര്യം ചെയ്യാൻ പ്രത്യേക ആൽഗോരിതം ഉപയോഗിക്കേണ്ടി വരും.
|
||||
>
|
||||

|
||||
> ഇൻഫോഗ്രാഫിക്: [ദാസാനി മടിപള്ളി](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-ന്റെ അഗ്ലോമറേറ്റീവ് ക്ലസ്റ്ററിംഗ് ഹയർആർക്കിക്കൽ ആണ്.
|
||||
|
||||

|
||||
> ഇൻഫോഗ്രാഫിക്: [ദാസാനി മടിപള്ളി](https://twitter.com/dasani_decoded)
|
||||
|
||||
- **സെൻട്രോയിഡ് ക്ലസ്റ്ററിംഗ്**. ഈ ജനപ്രിയ ആൽഗോരിതം 'k' എന്ന ക്ലസ്റ്ററുകളുടെ എണ്ണം തിരഞ്ഞെടുക്കേണ്ടതുണ്ട്, തുടർന്ന് ആൽഗോരിതം ഒരു ക്ലസ്റ്ററിന്റെ കേന്ദ്ര പോയിന്റ് നിർണയിച്ച് ആ പോയിന്റിന്റെ ചുറ്റും ഡാറ്റാ ശേഖരിക്കുന്നു. [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) സെൻട്രോയിഡ് ക്ലസ്റ്ററിംഗിന്റെ ജനപ്രിയ പതിപ്പാണ്. കേന്ദ്രം അടുത്ത ശരാശരിയാൽ നിർണയിക്കുന്നു, അതുകൊണ്ടാണ് പേര്. ക്ലസ്റ്ററിൽ നിന്നുള്ള ചതുരശ്ര ദൂരം കുറഞ്ഞു പോകുന്നു.
|
||||
|
||||

|
||||
> ഇൻഫോഗ്രാഫിക്: [ദാസാനി മടിപള്ളി](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')
|
||||
```
|
||||
|
||||

|
||||
|
||||
✅ കൂടുതൽ ടോപ്പ് മൂല്യങ്ങൾ കാണാൻ ആഗ്രഹിക്കുന്നുവെങ്കിൽ, ടോപ്പ് `[: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')
|
||||
```
|
||||
|
||||
ഇപ്പോൾ ജാനറുകൾ വീണ്ടും പരിശോധിക്കുക:
|
||||
|
||||

|
||||
|
||||
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)
|
||||
```
|
||||
|
||||

|
||||
|
||||
ഏകദേശം ശക്തമായ ബന്ധം `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) ഗ്രാഫ് ഉപയോഗിക്കുന്നു, ഇത് ഡാറ്റ തുടർച്ചയായ പ്രൊബബിലിറ്റി ഡെൻസിറ്റി വളർച്ച ഉപയോഗിച്ച് പ്രതിനിധാനം ചെയ്യുന്നു. ഇത് പല വിതരണങ്ങളുമായി പ്രവർത്തിക്കുമ്പോൾ ഡാറ്റ വ്യാഖ്യാനിക്കാൻ സഹായിക്കുന്നു.
|
||||
|
||||
പൊതുവായി, ഈ മൂന്ന് ജാനറുകൾ ജനപ്രിയതയിലും ഡാൻസബിലിറ്റിയിലും അല്പം സാരമായ ഏകീകരണം കാണിക്കുന്നു. ഈ അല്പം ഏകീകരിച്ച ഡാറ്റയിൽ ക്ലസ്റ്ററുകൾ കണ്ടെത്തുന്നത് ഒരു വെല്ലുവിളിയാകും:
|
||||
|
||||

|
||||
|
||||
1. ഒരു സ്കാറ്റർ പ്ലോട്ട് സൃഷ്ടിക്കുക:
|
||||
|
||||
```python
|
||||
sns.FacetGrid(df, hue="artist_top_genre", height=5) \
|
||||
.map(plt.scatter, "popularity", "danceability") \
|
||||
.add_legend()
|
||||
```
|
||||
|
||||
സമാന അക്ഷങ്ങളുള്ള സ്കാറ്റർപ്ലോട്ട് ഏകീകൃത മാതൃക കാണിക്കുന്നു
|
||||
|
||||

|
||||
|
||||
പൊതുവായി, ക്ലസ്റ്ററിംഗിനായി, ഡാറ്റ ക്ലസ്റ്ററുകൾ കാണിക്കാൻ സ്കാറ്റർപ്ലോട്ടുകൾ ഉപയോഗിക്കാം, അതിനാൽ ഈ തരത്തിലുള്ള ദൃശ്യീകരണം നന്നായി പഠിക്കുക വളരെ പ്രയോജനകരമാണ്. അടുത്ത പാഠത്തിൽ, ഈ ഫിൽട്ടർ ചെയ്ത ഡാറ്റ ഉപയോഗിച്ച് 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 -->
|
||||
File diff suppressed because one or more lines are too long
@ -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 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,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,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,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-ൽ പ്രസിദ്ധീകരിച്ച ജെയിൻ ഓസ്റ്റന്റെ ക്ലാസിക് നോവൽ **പ്രൈഡ് ആൻഡ് പ്രെജുഡിസ്**-ലെ എലിസബത്ത് ബെനെറ്റ്, മിസ്റ്റർ ഡാർസി എന്നിവരുമായി സംഭാഷണം നടത്താൻ നിങ്ങൾ കാലയാത്ര നടത്തും. തുടർന്ന്, യൂറോപ്പിലെ ഹോട്ടൽ അവലോകനങ്ങളിലൂടെ സന്റിമെന്റ് അനാലിസിസ് പഠിച്ച് നിങ്ങളുടെ അറിവ് വർദ്ധിപ്പിക്കും.
|
||||
|
||||

|
||||
> ഫോട്ടോ <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,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,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 ഉപയോഗിച്ച് ടൈം സീരീസ് പ്രവചനം
|
||||
|
||||
മുൻപത്തെ പാഠത്തിൽ, നിങ്ങൾ ടൈം സീരീസ് പ്രവചനത്തെ കുറിച്ച് കുറച്ച് പഠിച്ചു, കൂടാതെ ഒരു സമയപരിധിയിൽ വൈദ്യുതി ലോഡിന്റെ ചലനങ്ങൾ കാണിക്കുന്ന ഒരു ഡാറ്റാസെറ്റ് ലോഡ് ചെയ്തു.
|
||||
|
||||
[](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()
|
||||
```
|
||||
|
||||

|
||||
|
||||
അതിനാൽ, ഡാറ്റ പരിശീലനത്തിന് ചെറിയ ഒരു സമയവിൻഡോ ഉപയോഗിക്കുന്നത് മതിയാകും.
|
||||
|
||||
> കുറിപ്പ്: 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()
|
||||
```
|
||||
|
||||

|
||||
|
||||
> ഒറിജിനൽ ഡാറ്റ
|
||||
|
||||

|
||||
|
||||
> സ്കെയിൽ ചെയ്ത ഡാറ്റ
|
||||
|
||||
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](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()
|
||||
```
|
||||
|
||||

|
||||
|
||||
🏆 വളരെ നല്ല ഒരു പ്ലോട്ട്, നല്ല കൃത്യതയുള്ള ഒരു മോഡൽ കാണിക്കുന്നു. നല്ല ജോലി!
|
||||
|
||||
---
|
||||
|
||||
## 🚀ചലഞ്ച്
|
||||
|
||||
ടൈം സീരീസ് മോഡലിന്റെ കൃത്യത പരിശോധിക്കുന്ന മാർഗങ്ങൾ അന്വേഷിക്കുക. ഈ പാഠത്തിൽ 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()
|
||||
```
|
||||
|
||||

|
||||
|
||||
ഇപ്പോൾ, നമുക്ക് 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()
|
||||
```
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
### ട്രെയിനിംഗിനായി ഡാറ്റ തയ്യാറാക്കുക
|
||||
|
||||
ഇപ്പോൾ, നിങ്ങളുടെ ഡാറ്റ ഫിൽട്ടർ ചെയ്ത് സ്കെയിൽ ചെയ്ത് ട്രെയിനിംഗിനായി തയ്യാറാക്കണം. ആവശ്യമായ സമയപരിധികളും കോളങ്ങളുമായി മാത്രം നിങ്ങളുടെ ഡാറ്റാസെറ്റ് ഫിൽട്ടർ ചെയ്യുക, ഡാറ്റ 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()
|
||||
```
|
||||
|
||||

|
||||
|
||||
ട്രെയിനിംഗ് ഡാറ്റയ്ക്ക് 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()
|
||||
```
|
||||
|
||||

|
||||
|
||||
ടെസ്റ്റിംഗ് ഡാറ്റയ്ക്ക് 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()
|
||||
```
|
||||
|
||||

|
||||
|
||||
```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"
|
||||
}
|
||||
-->
|
||||
# ടൈം സീരീസ് ഫോറ്കാസ്റ്റിങ്ങിലേക്ക് പരിചയം
|
||||
|
||||
ടൈം സീരീസ് ഫോറ്കാസ്റ്റിംഗ് എന്താണ്? ഇത് കഴിഞ്ഞ കാലത്തെ പ്രവണതകൾ വിശകലനം ചെയ്ത് ഭാവിയിലെ സംഭവങ്ങൾ പ്രവചിക്കുന്നതിനെക്കുറിച്ചാണ്.
|
||||
|
||||
## പ്രാദേശിക വിഷയം: ലോകമാകെയുള്ള വൈദ്യുതി ഉപയോഗം ✨
|
||||
|
||||
ഈ രണ്ട് പാഠങ്ങളിൽ, നിങ്ങൾ ടൈം സീരീസ് ഫോറ്കാസ്റ്റിങ്ങുമായി പരിചയപ്പെടും, മെഷീൻ ലേണിങ്ങിന്റെ കുറച്ച് കുറവായി അറിയപ്പെടുന്ന ഒരു മേഖല, എന്നാൽ വ്യവസായത്തിനും ബിസിനസ്സ് പ്രയോഗങ്ങൾക്കും മറ്റ് മേഖലകൾക്കും അത്യന്തം മൂല്യമുള്ളതാണ്. ന്യൂറൽ നെറ്റ്വർക്കുകൾ ഈ മോഡലുകളുടെ പ്രയോജനം വർദ്ധിപ്പിക്കാൻ ഉപയോഗിക്കാവുന്നതായിരുന്നാലും, നാം ക്ലാസിക്കൽ മെഷീൻ ലേണിങ്ങിന്റെ പശ്ചാത്തലത്തിൽ അവയെ പഠിക്കും, കാരണം മോഡലുകൾ കഴിഞ്ഞ കാലത്തെ അടിസ്ഥാനമാക്കി ഭാവിയിലെ പ്രകടനം പ്രവചിക്കാൻ സഹായിക്കുന്നു.
|
||||
|
||||
നമ്മുടെ പ്രാദേശിക ശ്രദ്ധ ലോകത്തിലെ വൈദ്യുതി ഉപയോഗത്തിലാണ്, കഴിഞ്ഞ ലോഡിന്റെ മാതൃകകളുടെ അടിസ്ഥാനത്തിൽ ഭാവിയിലെ വൈദ്യുതി ഉപയോഗം ഫോറ്കാസ്റ്റ് ചെയ്യുന്നതിനെക്കുറിച്ച് പഠിക്കാൻ ഒരു രസകരമായ ഡാറ്റാസെറ്റ്. ഈ തരത്തിലുള്ള ഫോറ്കാസ്റ്റിംഗ് ബിസിനസ്സ് പരിസരത്തിൽ എത്രത്തോളം സഹായകരമാകാമെന്ന് നിങ്ങൾ കാണാം.
|
||||
|
||||

|
||||
|
||||
രാജസ്ഥാനിലെ ഒരു റോഡിൽ വൈദ്യുതി ടവറുകളുടെ ചിത്രം [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,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-ലേണിംഗ് ഉപയോഗിച്ച്.
|
||||
|
||||

|
||||
|
||||
> പീറ്ററും അവന്റെ സുഹൃത്തുക്കളും വംശജനെ നിന്ന് രക്ഷപ്പെടാൻ സൃഷ്ടിപരമായ മാർഗങ്ങൾ കണ്ടെത്തുന്നു! ചിത്രം [ജെൻ ലൂപ്പർ](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()
|
||||
```
|
||||
|
||||
നിങ്ങൾക്ക് ഈ ചിത്രത്തോട് സാമ്യമുള്ള ഒന്നും കാണാം:
|
||||
|
||||

|
||||
|
||||
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)
|
||||
```
|
||||
|
||||

|
||||
|
||||
ഈ ഗ്രാഫിൽ ഒന്നും വ്യക്തമാക്കാൻ കഴിയില്ല, കാരണം സ്റ്റോക്കാസ്റ്റിക് പരിശീലന പ്രക്രിയയുടെ സ്വഭാവം മൂലം പരിശീലന സെഷനുകളുടെ ദൈർഘ്യം വളരെ വ്യത്യാസപ്പെടുന്നു. ഈ ഗ്രാഫിന്റെ അർത്ഥം മനസ്സിലാക്കാൻ, നാം 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))
|
||||
```
|
||||
|
||||

|
||||
|
||||
## ഹൈപ്പർപാരാമീറ്ററുകൾ മാറ്റി പരീക്ഷിക്കൽ
|
||||
|
||||
പഠനം കൂടുതൽ സ്ഥിരതയുള്ളതാക്കാൻ, പരിശീലനത്തിനിടെ ചില ഹൈപ്പർപാരാമീറ്ററുകൾ ക്രമീകരിക്കുന്നത് ഉചിതമാണ്. പ്രത്യേകിച്ച്:
|
||||
|
||||
- **ലേണിംഗ് റേറ്റ്** `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()
|
||||
```
|
||||
|
||||
നിങ്ങൾക്ക് ഇങ്ങനെ ഒന്നൊന്നായി കാണാം:
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## 🚀ചലഞ്ച്
|
||||
|
||||
> **ടാസ്ക് 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,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,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"
|
||||
}
|
||||
-->
|
||||
# പോസ്റ്റ്സ്ക്രിപ്റ്റ്: ക്ലാസിക് മെഷീൻ ലേണിങ്ങിന്റെ യഥാർത്ഥ ലോക പ്രയോഗങ്ങൾ
|
||||
|
||||
പാഠ്യപദ്ധതിയുടെ ഈ വിഭാഗത്തിൽ, നിങ്ങൾക്ക് ക്ലാസിക്കൽ എംഎൽ ഉപയോഗിച്ച യഥാർത്ഥ ലോക പ്രയോഗങ്ങളെ പരിചയപ്പെടുത്തും. നാം ന്യുറൽ നെറ്റ്വർക്കുകൾ, ഡീപ്പ് ലേണിംഗ്, എഐ എന്നിവ ഒഴിവാക്കി ഈ തന്ത്രങ്ങൾ ഉപയോഗിച്ച പ്രയോഗങ്ങളെക്കുറിച്ചുള്ള വൈറ്റ്പേപ്പറുകളും ലേഖനങ്ങളും കണ്ടെത്താൻ ഇന്റർനെറ്റ് തിരഞ്ഞെടുത്തു. ബിസിനസ് സിസ്റ്റങ്ങൾ, പരിസ്ഥിതി പ്രയോഗങ്ങൾ, ഫിനാൻസ്, കലയും സംസ്കാരവും ഉൾപ്പെടെ എങ്ങനെ എംഎൽ ഉപയോഗിക്കപ്പെടുന്നു എന്ന് പഠിക്കൂ.
|
||||
|
||||

|
||||
|
||||
> ഫോട്ടോ <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,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…
Reference in new issue