{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_1-R.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" } }, "cells": [ { "cell_type": "markdown", "source": [ "# បង្កើតម៉ូដែលរេក្រេស្សិន៖ ចាប់ផ្តើមជាមួយ R និង Tidymodels សម្រាប់ម៉ូដែលរេក្រេស្សិន\n" ], "metadata": { "id": "YJUHCXqK57yz" } }, { "cell_type": "markdown", "source": [ "## ការណែនាំអំពីការត្រួតពិនិត្យ - មេរៀន ១\n", "\n", "#### យកវាទៅក្នុងទិសដៅ\n", "\n", "✅ មានប្រភេទវិធីសាស្រ្តត្រួតពិនិត្យជាច្រើន ហើយការជ្រើសរើសរបស់អ្នកអាស្រ័យលើចម្លើយដែលអ្នកកំពុងស្វែងរក។ ប្រសិនបើអ្នកចង់ទាយទុកកម្ពស់ប្រហែលសម្រាប់មនុស្សម្នាក់មានអាយុជាក់លាក់ អ្នកនឹងប្រើ `linear regression` ពីព្រោះអ្នកកំពុងស្វែងរក **តម្លៃលេខ**។ ប្រសិនបើអ្នកមានចំណាប់អារម្មណ៍ក្នុងការរកមើលថាតើប្រភេទម្ហូបមួយគួរត្រូវបានគិតថាជា វេហ្គាន់ ឬអត់ អ្នកកំពុងស្វែងរក **ការបែងចែកប្រភេទ** ដូច្នេះអ្នកនឹងប្រើ `logistic regression`។ អ្នកនឹងរៀនបន្ថែមអំពី logistic regression បន្ទាប់។ សូមគិតបន្តិចអំពីសំណួរខ្លះៗដែលអ្នកអាចសួរពីទិន្នន័យ ហើយវិធីសាស្រ្តណាមួយនៃវិធីเหล่านี้ដែលអាចសមរម្យជាងគេ។\n", "\n", "នៅក្នុងផ្នែកនេះ អ្នកនឹងធ្វើការជាមួយ [ឌាតាសេតតូចមួយអំពីជំងឺទឹកនោមផ្អែម](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html)។ សូមនឹកស្រមៃថា អ្នកចង់សាកល្បងការព្យាបាលសម្រាប់អ្នកជំងឺទឹកនោមផ្អែម។ ម៉ាស៊ីនរៀនអាចជួយអ្នកកំណត់ថា អ្នកជំងឺណាដែលនឹងឆ្លើយតបល្អជាងចំពោះការព្យាបាល ដោយផ្អែកលើការបញ្ចូលរួមនៃអថេរពីរបៀបផ្សេងៗ។ តែម៉ូដែលត្រួតពិនិត្យមានតំរូវការសាមញ្ញមួយ កាលណាត្រូវបានបង្ហាញជារូបភាព អាចបង្ហាញព័ត៌មានអំពីអថេរពីរដែលអាចជួយអ្នករៀបចំបទពិសោធន៍គ្លីនិកសាកល្បងទ្រឹស្តី។\n", "\n", "ហេតុនេះហើយបានជាអ្នកចាប់ផ្តើមការងារនេះបាន! \n", "\n", "
\n",
"
\n",
"
\n",
"\n",
"\n",
"\n",
"> glimpse() និង slice() គឺជាអនុគមន៍នៅក្នុង [`dplyr`](https://dplyr.tidyverse.org/)។ Dplyr ជាផ្នែកមួយនៃ Tidyverse គឺជាវិប្បដិសារក្នុងការដំណើរការទិន្នន័យ ដែលផ្តល់នូវសំណុំគំរូពាក្យកិរិយាដែលមានភាពស្របគ្នា ដែលជួយអ្នកដោះស្រាយបញ្ហាដំណើរការទិន្នន័យទូទៅបំផុត\n",
"\n",
"
\n",
"\n",
"ឥឡូវពេលដែលយើងមានទិន្នន័យហើយ មកកាន់ការជ្រើសរើសមួយលក្ខណៈ (`bmi`) សម្រាប់អនុវត្តការហាត់នេះ។ នេះក៏ត្រូវការឲ្យយើងជ្រើសរើសជួរឈរដែលចង់បាន។ តើយើងធ្វើបែបណា?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) អនុញ្ញាតឲ្យយើង *ជ្រើសរើស* (ហើយញឹកញាប់អាចប្តូរឈ្មោះ) ជួរឈរនៅក្នុងសំណុំទិន្នន័យមួយ។\n"
],
"metadata": {
"id": "UwjVT1Hz-c3Z"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select predictor feature `bmi` and outcome `y`\r\n",
"diabetes_select <- diabetes %>% \r\n",
" select(c(bmi, y))\r\n",
"\r\n",
"# Print the first 5 rows\r\n",
"diabetes_select %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "RDY1oAKI-m80"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. ទិន្នន័យសម្រាប់បណ្តុះបណ្តាល និងសាកល្បង\n",
"\n",
"វាជាវិធានការដែលត្រូវអនុវត្តនៅក្នុងការរៀនតាមការត្រួតពិនិត្យ ដើម្បី *បំបែក* ទិន្នន័យចេញជាសំណុំនៃពីរផ្នែក; សំណុំនៃទិន្នន័យ (ដែលជាទូទៅធំជាង) សម្រាប់បង្រៀនម៉ូដែល ហើយសំណុំនៃទិន្នន័យតូច \"hold-back\" សម្រាប់មើលថា ម៉ូដែលបានបំពេញការងារយ៉ាងដូចម្តេច។\n",
"\n",
"ឥឡូវនេះពេលយើងមានទិន្នន័យរួចរាល់ អ្នកអាចមើលថាតើម៉ាស៊ីនអាចជួយកំណត់ការបំបែកត្រឹមត្រូវរវាងលេខក្នុងឧទាហរណ៍ទិន្នន័យនេះបានទេ។ យើងអាចប្រើកញ្ចប់ [rsample](https://tidymodels.github.io/rsample/) ដែលជាមួយនឹងស៊ុមរ៉ែធមូល Tidymodels ដើម្បីបង្កើតអតិបរមាមួយដែលមានព្រឹត្តិបត្រស្តីពី *វិធី* បំបែកទិន្នន័យ ហើយបន្ទាប់មកប្រើមុខងារ rsample ច្រើនទៀតពីរមុខងារដើម្បីទាញយកសំណុំទិន្នន័យបណ្តុះបណ្តាល និងសាកល្បងដែលបានបង្កើត៖\n"
],
"metadata": {
"id": "SDk668xK-tc3"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\r\n",
"# Split 67% of the data for training and the rest for tesing\r\n",
"diabetes_split <- diabetes_select %>% \r\n",
" initial_split(prop = 0.67)\r\n",
"\r\n",
"# Extract the resulting train and test sets\r\n",
"diabetes_train <- training(diabetes_split)\r\n",
"diabetes_test <- testing(diabetes_split)\r\n",
"\r\n",
"# Print the first 3 rows of the training set\r\n",
"diabetes_train %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "EqtHx129-1h-"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. បណ្តុះបណ្តាលគំរូសមីការស្រមោលជាមួយ Tidymodels\n",
"\n",
"ឥឡូវនេះយើងមានស្រេចក្នុងការបណ្តុះបណ្តាលគំរូរបស់យើង!\n",
"\n",
"ក្នុង Tidymodels អ្នកកំណត់គំរូដោយប្រើ `parsnip()` ដោយបញ្ជាក់បីកន្លែង៖\n",
"\n",
"- ប្រភេទគំរូ **type** ផ្តែកគំរូៗ ដូចជាសមីការស្រមោលបន្ទាត់, សមីការស្រមោលឡូជីស្ទិច, គំរូដើមសម្រេចចិត្ត និងផ្សេងៗទៀត។\n",
"\n",
"- របៀបធ្វើដំណើរ **mode** រួមបញ្ចូលជម្រើសទូទៅដូចជា សមីការស្រមោល និង ការបែងចែកចំណាត់ថ្នាក់; ប្រភេទគំរូមួយចំនួនគាំទ្រតែម្ដងឬទាំងពីរ ខណៈដែលមួយចំនួនមានតែរបៀបធ្វើដំណើរតែមួយ។\n",
"\n",
"- មេកានិចគំរូ **engine** គឺជាឧបករណ៍គណនាសម្រាប់តម្រៀបគំរូ។ ជាញឹកញាប់គឺជាកញ្ចប់ R មួយចំនួន ដូចជា **`\"lm\"`** ឬ **`\"ranger\"`**\n",
"\n",
"ព័ត៌មាននេះត្រូវបានកត់ត្រានៅក្នុងការបញ្ជាក់គំរូ ដូច្នេះមកបង្កើតមួយបានហើយ!\n"
],
"metadata": {
"id": "sBOS-XhB-6v7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- \r\n",
" # Type\r\n",
" linear_reg() %>% \r\n",
" # Engine\r\n",
" set_engine(\"lm\") %>% \r\n",
" # Mode\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Print the model specification\r\n",
"lm_spec"
],
"outputs": [],
"metadata": {
"id": "20OwEw20--t3"
}
},
{
"cell_type": "markdown",
"source": [
"បន្ទាប់ពីម៉ូដែលត្រូវបាន *កំណត់* រួចហើយ ម៉ូដែលអាចត្រូវបាន `ពិនិត្យប្រមាណ` ឬ `បណ្តុះបណ្តាល` ដោយប្រើមុខងារ [`fit()`](https://parsnip.tidymodels.org/reference/fit.html) ជាទូទៅប្រើរូបមន្តមួយនិងទិន្នន័យមួយចំនួន។\n",
"\n",
"`y ~ .` មានន័យថាយើងនឹងត្រូវបណ្ដុះ `y` ជាបរិមាណដែលត្រូវព្យាករណ៍/គោលដៅ ដែលពណ៌នាដោយអ្នកដាំនេះរាល់គ្នា ie, `.` (ក្នុងករណីនេះ យើងមានអ្នកដាំតែមួយគត់គឺ `bmi` )\n"
],
"metadata": {
"id": "_oDHs89k_CJj"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>%\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Train a linear regression model\r\n",
"lm_mod <- lm_spec %>% \r\n",
" fit(y ~ ., data = diabetes_train)\r\n",
"\r\n",
"# Print the model\r\n",
"lm_mod"
],
"outputs": [],
"metadata": {
"id": "YlsHqd-q_GJQ"
}
},
{
"cell_type": "markdown",
"source": [
"ពីលទ្ធផលនៃម៉ូឌែល យើងអាចមើលឃើញអនុគមន៍ដែលបានរៀនឃើញនៅពេលបណ្តុះបណ្តាល។ វាតំណឹងអនុគមន៍នៃបន្ទាត់ដែលមានការសម្រួលល្អបំផុតដែលផ្តល់ឱ្យយើងនូវកំហុសសរុបទាបជាងគេទាំងពីរចន្លោះអថេរពិតនិងបានទាយ។\n",
"\n",
"
\n",
"\n",
"## 5. ធ្វើការទាយលទ្ធផលលើសំណុំទិន្នន័យតេស្ត\n",
"\n",
"ឥឡូវនេះដែលយើងបានបណ្តុះបណ្តាលម៉ូឌែលមួយរួចហើយ យើងអាចប្រើវាដើម្បីទាយការវិវឌ្ឍជំងឺ y សម្រាប់សំណុំទិន្នន័យតេស្តដោយប្រើ [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html)។ វានឹងត្រូវបានប្រើដើម្បីគូរបន្ទាត់រវាងក្រុមទិន្នន័យ។\n"
],
"metadata": {
"id": "kGZ22RQj_Olu"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\r\n",
"predictions <- lm_mod %>% \r\n",
" predict(new_data = diabetes_test)\r\n",
"\r\n",
"# Print out some of the predictions\r\n",
"predictions %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "nXHbY7M2_aao"
}
},
{
"cell_type": "markdown",
"source": [
"Woohoo! 💃🕺 យើងទើបតែបណ្តុះម៉ូដែលមួយ ហើយប្រើវាធ្វើការព្យាករណ៍!\n",
"\n",
"នៅពេលធ្វើការព្យាករណ៍ ទម្រង់ប្រើប្រាស់របស់ tidymodels គឺតែងតែបង្កើតតារាង tibble/data frame នៃលទ្ធផលដែលមានឈ្មោះជួរឈរប្រក្រតី។ នេះធ្វើឲ្យងាយស្រួលក្នុងការរួមបញ្ចូលទិន្នន័យដើម និងការព្យាករណ៍នៅក្នុងទម្រង់ដែលប្រើប្រាស់បានសម្រាប់ប្រតិបត្តិការបន្តដូចជាការគូររូប។\n",
"\n",
"`dplyr::bind_cols()` ភ្ជាប់ជួរឈរពហុទិន្នន័យបានយ៉ាងមានប្រសិទ្ធភាព។\n"
],
"metadata": {
"id": "R_JstwUY_bIs"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Combine the predictions and the original test set\r\n",
"results <- diabetes_test %>% \r\n",
" bind_cols(predictions)\r\n",
"\r\n",
"\r\n",
"results %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "RybsMJR7_iI8"
}
},
{
"cell_type": "markdown",
"source": [
"## 6. រូបភាពលទ្ធផលម៉ូដែល\n",
"\n",
"ឥឡូវនេះ ពេលវេលាដើម្បីមើលវា secara visual 📈។ យើងនឹងបង្កើតរូបភាព scatter plot របស់តម្លៃ `y` និង `bmi` ទាំងអស់ក្នុងសំណុំតេស្ត បន្ទាប់មកប្រើការព្យាករណ៍ដើម្បីគូរបន្ទាត់នៅកន្លែងដែលសមស្របបំផុត ចន្លោះក្រុមទិន្នន័យនៃម៉ូដែល។\n",
"\n",
"R មានប្រព័ន្ធជាច្រើនសម្រាប់បង្កើតក្រាហ្វិច ប៉ុន្តែ `ggplot2` គឺជាឯកឯកភាពមួយក្នុងចំណោមស្រស់ស្អាត និងចម្រុះបំផុត។ វាអនុញ្ញាតឲ្យអ្នកបង្កើតក្រាហ្វិចដោយ **ប្រមូលផ្តុំធាតុដោយឯករាជ្យ**។\n"
],
"metadata": {
"id": "XJbYbMZW_n_s"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plot\r\n",
"theme_set(theme_light())\r\n",
"# Create a scatter plot\r\n",
"results %>% \r\n",
" ggplot(aes(x = bmi)) +\r\n",
" # Add a scatter plot\r\n",
" geom_point(aes(y = y), size = 1.6) +\r\n",
" # Add a line plot\r\n",
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
],
"outputs": [],
"metadata": {
"id": "R9tYp3VW_sTn"
}
},
{
"cell_type": "markdown",
"source": [
"> ✅ គិតបន្តិចអំពីអ្វីកំពុងកើតឡើងនៅទីនេះ។ ខ្សែស្របមួយកំពុងដំណើរការតាមចំណុចតូចៗជាច្រើន ផ្ទាល់តែវាកំពុងធ្វើអ្វីយ៉ាងដូចម្តេច? តើអ្នកអាចឃើញថាអ្នកគួរត្រូវបានប្រើខ្សែនេះដើម្បីទាកទាយថាចំណុចទិន្នន័យថ្មីមួយដែលមិនទាន់បានឃើញគួរត្រូវតាំងនៅឯណាក្នុងទំនាក់ទំនងជាមួយអ័ក្ស y នៃតារាងនេះដែរឬទេ? ជួយព្យាយាមពន្យល់ជាភាសាអំពីការប្រើប្រាស់ដែលពាក់ព័ន្ធនឹងគំរូនេះ។\n",
"\n",
"សូមអបអរសាទរ អ្នកបានបង្កើតគំរូទំនាក់ទំនងបន្ទាត់ដំបូងរបស់អ្នក បានបង្កើតការទស្សន៍ទាយជាមួយវា ហើយបានបង្ហាញវាលើតារាងមួយ!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n\n**ការបដិសេធ**៖ \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំសំរាប់ភាពត្រឹមត្រូវ សូមជ្រាបថា ការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬ មិនត្រឹមត្រូវបាន។ ឯកសារដើមជាភាសាមាតុភាគគួរត្រូវបានទទួលស្គាល់ជាដើមប្រភពមានសុពលភាព។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមពិចារណាការបកប្រែដោយអ្នកជំនាញមនុស្ស។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬ ការបំភ្លឺខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n\n"
]
}
]
}