{ "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", "

ស្នាដៃដោយ @allison_horst
\n", "\n", "\n" ], "metadata": { "id": "LWNNzfqd6feZ" } }, { "cell_type": "markdown", "source": [ "## 1. ការផ្ទុកឧបករណ៍របស់យើងឡើង\n", "\n", "សម្រាប់ភារកិច្ចនេះ យើងត្រូវការបណ្ណាល័យដូចខាងក្រោម៖\n", "\n", "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) គឺជា [កញ្ចប់បណ្ណាល័យ R](https://www.tidyverse.org/packages) ដែលរចនាឡើងដើម្បីធ្វើឱ្យការប្រើប្រាស់វិទ្យាសាស្ត្រទិន្នន័យមានភាពរហ័ស ប្រសើរឡើង និងគួរឱ្យសប្បាយចិត្ត!\n", "\n", "- `tidymodels`: ក្របខណ្ឌ [tidymodels](https://www.tidymodels.org/) គឺជា [កញ្ចប់បណ្ណាល័យ](https://www.tidymodels.org/packages/) សម្រាប់ការគំរូ និងការសិក្សាម៉ាស៊ីន។\n", "\n", "អ្នកអាចដំឡើងវាដូចជា៖\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n", "\n", "ស្គ្រីបខាងក្រោមនេះត្រួតពិនិត្យថា តើអ្នកមានបណ្ណាល័យទាំងនេះដើម្បីបញ្ចប់មូឌុលនេះរួចថែមទៀត ហើយតំឡើងសម្រាប់អ្នក ប្រសិនបើមានខាតខាត។\n" ], "metadata": { "id": "FIo2YhO26wI9" } }, { "cell_type": "code", "execution_count": 2, "source": [ "suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n", "pacman::p_load(tidyverse, tidymodels)" ], "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "Loading required package: pacman\n", "\n" ] } ], "metadata": { "id": "cIA9fz9v7Dss", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11" } }, { "cell_type": "markdown", "source": [ "ឥឡូវនេះ យើងសូមផ្ទុកបណ្ណាល័យអស្ចារ្យទាំងនេះ ហើយធ្វើឲ្យវាប្រើបានក្នុងសម័យ R បច្ចុប្បន្នរបស់យើង។ (នេះគ្រាន់តែសម្រាប់ការបង្ហាញតែប៉ុណ្ណោះ `pacman::p_load()` បានធ្វើរួចហើយសម្រាប់អ្នក)\n" ], "metadata": { "id": "gpO_P_6f9WUG" } }, { "cell_type": "code", "execution_count": null, "source": [ "# load the core Tidyverse packages\r\n", "library(tidyverse)\r\n", "\r\n", "# load the core Tidymodels packages\r\n", "library(tidymodels)\r\n" ], "outputs": [], "metadata": { "id": "NLMycgG-9ezO" } }, { "cell_type": "markdown", "source": [ "## 2. សំណុំទិន្នន័យជំងឺឆ្លងឈ сахар\n", "\n", "ក្នុងការអនុវត្តនេះ យើងនឹងបង្ហាញជំនាញការស្រង់ទិន្នន័យរបស់យើងដោយធ្វើការព្យាករណ៍លើសំណុំទិន្នន័យជំងឺឆ្លងឈ сахар។ [សំណុំទិន្នន័យជំងឺឆ្លងឈ сахар](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) មាន `៤៤២ គំរូ` នៃទិន្នន័យជុំវិញជំងឺឆ្លងឈ сахар ដែលមានអថេរព្យាករណ៍លក្ខណៈ ១០ គឺ `អាយុ`, `ភេទ`, `រូបមាត្រមាឌរាងកាយ`, `សម្ពាធឈាមមធ្យម`, និង `ការវាស់ម៉ាស៊ីនសាំមេរ៉ា ៦ នាក់` ជាមួយអថេរវិលតប `y`៖ ជាអនុមាត្រលេខវាស់វែងនៃការរីកចម្រើនជំងឺមួយឆ្នាំបន្ទាប់ពីកំណត់ចំណុចដើម។\n", "\n", "|ចំនួនការសង្កេត|៤៤២|\n", "|-----------------|:---|\n", "|ចំនួនអថេរព្យាករណ៍|ជួរដេកទី ១០ ដំបូងគឺអថេរព្យាករណ៍ជាលេខ|\n", "|លទ្ធផល/គោលដៅ|ជួរដេកទី ១១ ជាអនុមាត្រាលេខវាស់វែងនៃការរីកចម្រើនជំងឺមួយឆ្នាំបន្ទាប់ពីកំណត់ចំណុចដើម|\n", "|ព័ត៌មានអថេរព្យាករណ៍|- អាយុជាឆ្នាំ\n", "||- ភេទ\n", "||- bmi មាត្ររូបធាតុរាងកាយ\n", "||- bp សម្ពាធឈាមមធ្យម\n", "||- s1 tc, គ្លេសតេរាលសេរ៉ូមសរុប\n", "||- s2 ldl, លីពីតភាគតិច\n", "||- s3 hdl, លីពីតភាគខ្ពស់\n", "||- s4 tch, គ្លេសតេរាលសរុប / HDL\n", "||- s5 ltg, ប្រហែលជាលក់នៃកម្រិតថ្រីក្លីសេរូម\n", "||- s6 glu, កម្រិតស្ករក្នុងឈាម|\n", "\n", "\n", "\n", "\n", "> 🎓 ចងចាំថា នេះគឺជាការរៀនដោយមានការត្រួតពិនិត្យ ហើយយើងត្រូវការគោលដៅឈ្មោះ 'y'។\n", "\n", "មុនពេលអ្នកអាចដោះស្រាយទិន្នន័យជាមួយ R បាន អ្នកត្រូវនាំចូលទិន្នន័យទៅក្នុងអង្គច័ន្ទ R ឬ បង្កើតការតភ្ជាប់ទៅកាន់ទិន្នន័យដែល R អាចប្រើដើម្បីចូលប្រើទិន្នន័យពីចម្ងាយ។\n", "\n", "> កញ្ចប់ [readr](https://readr.tidyverse.org/), ដែលជាផ្នែកមួយនៃ Tidyverse, ផ្ដល់នូវវិធីរហ័ស និងផ friendliness បានសម្រាប់អានទិន្នន័យរាងគូទ័រចូលទៅក្នុង R។\n", "\n", "ឥលូវនេះ នាំចូលសំណុំទិន្នន័យជំងឺឆ្លងឈ сахар ដែលផ្ដល់នៅក្នុង URL ផ្ដើមនេះ៖ \n", "\n", "បន្ថែមពីនេះ យើងនឹង​ធ្វើតេស្តសុវត្ថិភាពជាមួយទិន្នន័យរបស់យើងដោយប្រើ `glimpse()` ហើយបង្ហាញជួរដេកដំបូង ៥ ជួរដោយប្រើ `slice()`។\n", "\n", "មុនពេលទៅកាន់ជំហានបន្ទាប់ សូមណែនាំអ្វីដែលអ្នកនឹងជួបញឹកញាប់ក្នុងកូដ R 🥁🥁: អុបរ៉ាត័រពីប `%>%`\n", "\n", "អុបរ៉ាត័រពីប (`%>%`) បំពេញសកម្មភាពជាដំណាក់កាលតាមលំដាប់ ដោយផ្ដល់វត្ថុទៅមុខក្នុងមុខងារឬវេយ្យាករណ៍ហៅ។ អ្នកអាចគិតអុបរ៉ាត័រពីបថា “បន្ទាប់មក” ក្នុងកូដរបស់អ្នក។\n" ], "metadata": { "id": "KM6iXLH996Cl" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Import the data set\r\n", "diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n", "\r\n", "\r\n", "# Get a glimpse and dimensions of the data\r\n", "glimpse(diabetes)\r\n", "\r\n", "\r\n", "# Select the first 5 rows of the data\r\n", "diabetes %>% \r\n", " slice(1:5)" ], "outputs": [], "metadata": { "id": "Z1geAMhM-bSP" } }, { "cell_type": "markdown", "source": [ "`glimpse()` បង្ហាញឲ្យយើងឃើញថា​ទិន្នន័យនេះមានជួរដេក ៤៤២ និងជួរឈរ ១១ ដែលជួរឈរទាំងអស់មានប្រភេទទិន្នន័យជា `double`\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" ] } ] }