|
After Width: | Height: | Size: 550 KiB |
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 4.6 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 9.1 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 454 KiB |
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 38 KiB |
@ -0,0 +1,878 @@
|
||||
{
|
||||
"1-Introduction/1-intro-to-ML/README.md": {
|
||||
"original_hash": "69389392fa6346e0dfa30f664b7b6fec",
|
||||
"translation_date": "2026-04-06T18:13:33+00:00",
|
||||
"source_file": "1-Introduction/1-intro-to-ML/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"1-Introduction/1-intro-to-ML/assignment.md": {
|
||||
"original_hash": "4c4698044bb8af52cfb6388a4ee0e53b",
|
||||
"translation_date": "2026-04-06T18:13:44+00:00",
|
||||
"source_file": "1-Introduction/1-intro-to-ML/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"1-Introduction/2-history-of-ML/README.md": {
|
||||
"original_hash": "6a05fec147e734c3e6bfa54505648e2b",
|
||||
"translation_date": "2026-04-06T18:15:10+00:00",
|
||||
"source_file": "1-Introduction/2-history-of-ML/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"1-Introduction/2-history-of-ML/assignment.md": {
|
||||
"original_hash": "eb6e4d5afd1b21a57d2b9e6d0aac3969",
|
||||
"translation_date": "2026-04-06T18:15:19+00:00",
|
||||
"source_file": "1-Introduction/2-history-of-ML/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"1-Introduction/3-fairness/README.md": {
|
||||
"original_hash": "9a6b702d1437c0467e3c5c28d763dac2",
|
||||
"translation_date": "2026-04-06T18:18:39+00:00",
|
||||
"source_file": "1-Introduction/3-fairness/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"1-Introduction/3-fairness/assignment.md": {
|
||||
"original_hash": "c81d9affadb89d017d610eadeb6c84f9",
|
||||
"translation_date": "2026-04-06T18:18:50+00:00",
|
||||
"source_file": "1-Introduction/3-fairness/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"1-Introduction/4-techniques-of-ML/README.md": {
|
||||
"original_hash": "9d91f3af3758fdd4569fb410575995ef",
|
||||
"translation_date": "2026-04-06T18:16:52+00:00",
|
||||
"source_file": "1-Introduction/4-techniques-of-ML/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"1-Introduction/4-techniques-of-ML/assignment.md": {
|
||||
"original_hash": "70d65aeddc06170bc1aed5b27805f930",
|
||||
"translation_date": "2026-04-06T18:17:05+00:00",
|
||||
"source_file": "1-Introduction/4-techniques-of-ML/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"1-Introduction/README.md": {
|
||||
"original_hash": "cf8ecc83f28e5b98051d2179eca08e08",
|
||||
"translation_date": "2026-04-06T18:03:58+00:00",
|
||||
"source_file": "1-Introduction/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/1-Tools/README.md": {
|
||||
"original_hash": "fa81d226c71d5af7a2cade31c1c92b88",
|
||||
"translation_date": "2026-04-06T18:23:23+00:00",
|
||||
"source_file": "2-Regression/1-Tools/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/1-Tools/assignment.md": {
|
||||
"original_hash": "74a5cf83e4ebc302afbcbc4f418afd0a",
|
||||
"translation_date": "2026-04-06T18:23:40+00:00",
|
||||
"source_file": "2-Regression/1-Tools/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/1-Tools/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:27:06+00:00",
|
||||
"source_file": "2-Regression/1-Tools/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/1-Tools/solution/R/lesson_1-R.ipynb": {
|
||||
"original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1",
|
||||
"translation_date": "2026-04-06T19:12:00+00:00",
|
||||
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/1-Tools/solution/notebook.ipynb": {
|
||||
"original_hash": "16ff1a974f6e4348e869e4a7d366b86a",
|
||||
"translation_date": "2026-04-06T19:10:27+00:00",
|
||||
"source_file": "2-Regression/1-Tools/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/2-Data/README.md": {
|
||||
"original_hash": "7c077988328ebfe33b24d07945f16eca",
|
||||
"translation_date": "2026-04-06T18:24:53+00:00",
|
||||
"source_file": "2-Regression/2-Data/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/2-Data/assignment.md": {
|
||||
"original_hash": "4485a1ed4dd1b5647365e3d87456515d",
|
||||
"translation_date": "2026-04-06T18:25:03+00:00",
|
||||
"source_file": "2-Regression/2-Data/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/2-Data/notebook.ipynb": {
|
||||
"original_hash": "1b2ab303ac6c604a34c6ca7a49077fc7",
|
||||
"translation_date": "2026-04-06T19:05:51+00:00",
|
||||
"source_file": "2-Regression/2-Data/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/2-Data/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:27:14+00:00",
|
||||
"source_file": "2-Regression/2-Data/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/2-Data/solution/R/lesson_2-R.ipynb": {
|
||||
"original_hash": "f3c335f9940cfd76528b3ef918b9b342",
|
||||
"translation_date": "2026-04-06T19:14:24+00:00",
|
||||
"source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/2-Data/solution/notebook.ipynb": {
|
||||
"original_hash": "95726f0b8283628d5356a4f8eb8b4b76",
|
||||
"translation_date": "2026-04-06T19:12:07+00:00",
|
||||
"source_file": "2-Regression/2-Data/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/3-Linear/README.md": {
|
||||
"original_hash": "9a8359f1945bd3beccccb2b46592580e",
|
||||
"translation_date": "2026-04-06T18:21:17+00:00",
|
||||
"source_file": "2-Regression/3-Linear/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/3-Linear/assignment.md": {
|
||||
"original_hash": "cc471fa89c293bc735dd3a9a0fb79b1b",
|
||||
"translation_date": "2026-04-06T18:21:30+00:00",
|
||||
"source_file": "2-Regression/3-Linear/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/3-Linear/notebook.ipynb": {
|
||||
"original_hash": "b032d371c75279373507f003439a577e",
|
||||
"translation_date": "2026-04-06T19:05:46+00:00",
|
||||
"source_file": "2-Regression/3-Linear/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/3-Linear/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:27:00+00:00",
|
||||
"source_file": "2-Regression/3-Linear/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/3-Linear/solution/R/lesson_3-R.ipynb": {
|
||||
"original_hash": "5015d65d61ba75a223bfc56c273aa174",
|
||||
"translation_date": "2026-04-06T19:10:06+00:00",
|
||||
"source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/3-Linear/solution/notebook.ipynb": {
|
||||
"original_hash": "d77bd89ae7e79780c68c58bab91f13f8",
|
||||
"translation_date": "2026-04-06T19:06:48+00:00",
|
||||
"source_file": "2-Regression/3-Linear/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/4-Logistic/README.md": {
|
||||
"original_hash": "abf86d845c84330bce205a46b382ec88",
|
||||
"translation_date": "2026-04-06T18:26:41+00:00",
|
||||
"source_file": "2-Regression/4-Logistic/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/4-Logistic/assignment.md": {
|
||||
"original_hash": "8af40209a41494068c1f42b14c0b450d",
|
||||
"translation_date": "2026-04-06T18:26:53+00:00",
|
||||
"source_file": "2-Regression/4-Logistic/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/4-Logistic/notebook.ipynb": {
|
||||
"original_hash": "dee08c2b49057b0de8b6752c4dbca368",
|
||||
"translation_date": "2026-04-06T19:05:59+00:00",
|
||||
"source_file": "2-Regression/4-Logistic/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/4-Logistic/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:27:21+00:00",
|
||||
"source_file": "2-Regression/4-Logistic/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb": {
|
||||
"original_hash": "feaf125f481a89c468fa115bf2aed580",
|
||||
"translation_date": "2026-04-06T19:17:18+00:00",
|
||||
"source_file": "2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/4-Logistic/solution/notebook.ipynb": {
|
||||
"original_hash": "ef50cc584e0b79412610cc7da15e1f86",
|
||||
"translation_date": "2026-04-06T19:14:49+00:00",
|
||||
"source_file": "2-Regression/4-Logistic/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"2-Regression/README.md": {
|
||||
"original_hash": "508582278dbb8edd2a8a80ac96ef416c",
|
||||
"translation_date": "2026-04-06T18:04:20+00:00",
|
||||
"source_file": "2-Regression/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"3-Web-App/1-Web-App/README.md": {
|
||||
"original_hash": "e0b75f73e4a90d45181dc5581fe2ef5c",
|
||||
"translation_date": "2026-04-06T18:28:42+00:00",
|
||||
"source_file": "3-Web-App/1-Web-App/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"3-Web-App/1-Web-App/assignment.md": {
|
||||
"original_hash": "a8e8ae10be335cbc745b75ee552317ff",
|
||||
"translation_date": "2026-04-06T18:28:57+00:00",
|
||||
"source_file": "3-Web-App/1-Web-App/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"3-Web-App/1-Web-App/solution/notebook.ipynb": {
|
||||
"original_hash": "5fa2e8f4584c78250ca9729b46562ceb",
|
||||
"translation_date": "2026-04-06T19:17:25+00:00",
|
||||
"source_file": "3-Web-App/1-Web-App/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"3-Web-App/README.md": {
|
||||
"original_hash": "9836ff53cfef716ddfd70e06c5f43436",
|
||||
"translation_date": "2026-04-06T18:04:35+00:00",
|
||||
"source_file": "3-Web-App/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/1-Introduction/README.md": {
|
||||
"original_hash": "aaf391d922bd6de5efba871d514c6d47",
|
||||
"translation_date": "2026-04-06T18:50:02+00:00",
|
||||
"source_file": "4-Classification/1-Introduction/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/1-Introduction/assignment.md": {
|
||||
"original_hash": "b2a01912beb24cfb0007f83594dba801",
|
||||
"translation_date": "2026-04-06T18:50:16+00:00",
|
||||
"source_file": "4-Classification/1-Introduction/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/1-Introduction/notebook.ipynb": {
|
||||
"original_hash": "d544ef384b7ba73757d830a72372a7f2",
|
||||
"translation_date": "2026-04-06T19:23:40+00:00",
|
||||
"source_file": "4-Classification/1-Introduction/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/1-Introduction/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:54:18+00:00",
|
||||
"source_file": "4-Classification/1-Introduction/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb": {
|
||||
"original_hash": "2621e24705e8100893c9bf84e0fc8aef",
|
||||
"translation_date": "2026-04-06T19:26:38+00:00",
|
||||
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/1-Introduction/solution/notebook.ipynb": {
|
||||
"original_hash": "1da12ed6d238756959b8de9cac2a35a2",
|
||||
"translation_date": "2026-04-06T19:24:26+00:00",
|
||||
"source_file": "4-Classification/1-Introduction/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/2-Classifiers-1/README.md": {
|
||||
"original_hash": "1a6e9e46b34a2e559fbbfc1f95397c7b",
|
||||
"translation_date": "2026-04-06T18:53:58+00:00",
|
||||
"source_file": "4-Classification/2-Classifiers-1/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/2-Classifiers-1/assignment.md": {
|
||||
"original_hash": "de6025f96841498b0577e9d1aee18d1f",
|
||||
"translation_date": "2026-04-06T18:54:11+00:00",
|
||||
"source_file": "4-Classification/2-Classifiers-1/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/2-Classifiers-1/notebook.ipynb": {
|
||||
"original_hash": "68829b06b4dcd512d3327849191f4d7f",
|
||||
"translation_date": "2026-04-06T19:24:01+00:00",
|
||||
"source_file": "4-Classification/2-Classifiers-1/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/2-Classifiers-1/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:54:32+00:00",
|
||||
"source_file": "4-Classification/2-Classifiers-1/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/2-Classifiers-1/solution/R/lesson_11-R.ipynb": {
|
||||
"original_hash": "6ea6a5171b1b99b7b5a55f7469c048d2",
|
||||
"translation_date": "2026-04-06T19:30:34+00:00",
|
||||
"source_file": "4-Classification/2-Classifiers-1/solution/R/lesson_11-R.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/2-Classifiers-1/solution/notebook.ipynb": {
|
||||
"original_hash": "9408506dd864f2b6e334c62f80c0cfcc",
|
||||
"translation_date": "2026-04-06T19:28:41+00:00",
|
||||
"source_file": "4-Classification/2-Classifiers-1/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/3-Classifiers-2/README.md": {
|
||||
"original_hash": "d94438d71164b0ff68002812aed1a8b4",
|
||||
"translation_date": "2026-04-06T18:51:06+00:00",
|
||||
"source_file": "4-Classification/3-Classifiers-2/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/3-Classifiers-2/assignment.md": {
|
||||
"original_hash": "58dfdaf79fb73f7d34b22bdbacf57329",
|
||||
"translation_date": "2026-04-06T18:51:17+00:00",
|
||||
"source_file": "4-Classification/3-Classifiers-2/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/3-Classifiers-2/notebook.ipynb": {
|
||||
"original_hash": "624ca6cf73d3548ff1b3059e413fa4cd",
|
||||
"translation_date": "2026-04-06T19:23:47+00:00",
|
||||
"source_file": "4-Classification/3-Classifiers-2/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/3-Classifiers-2/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:54:26+00:00",
|
||||
"source_file": "4-Classification/3-Classifiers-2/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb": {
|
||||
"original_hash": "fab50046ca413a38939d579f8432274f",
|
||||
"translation_date": "2026-04-06T19:28:27+00:00",
|
||||
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/3-Classifiers-2/solution/notebook.ipynb": {
|
||||
"original_hash": "70f41fe4fd4253adb44cd9d291406e4f",
|
||||
"translation_date": "2026-04-06T19:26:46+00:00",
|
||||
"source_file": "4-Classification/3-Classifiers-2/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/4-Applied/README.md": {
|
||||
"original_hash": "61bdec27ed2da8b098cd9065405d9bb0",
|
||||
"translation_date": "2026-04-06T18:52:07+00:00",
|
||||
"source_file": "4-Classification/4-Applied/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/4-Applied/assignment.md": {
|
||||
"original_hash": "799ed651e2af0a7cad17c6268db11578",
|
||||
"translation_date": "2026-04-06T18:52:20+00:00",
|
||||
"source_file": "4-Classification/4-Applied/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/4-Applied/notebook.ipynb": {
|
||||
"original_hash": "2f3e0d9e9ac5c301558fb8bf733ac0cb",
|
||||
"translation_date": "2026-04-06T19:23:55+00:00",
|
||||
"source_file": "4-Classification/4-Applied/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/4-Applied/solution/notebook.ipynb": {
|
||||
"original_hash": "49325d6dd12a3628fc64fa7ccb1a80ff",
|
||||
"translation_date": "2026-04-06T19:28:35+00:00",
|
||||
"source_file": "4-Classification/4-Applied/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"4-Classification/README.md": {
|
||||
"original_hash": "74e809ffd1e613a1058bbc3e9600859e",
|
||||
"translation_date": "2026-04-06T18:06:16+00:00",
|
||||
"source_file": "4-Classification/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/1-Visualize/README.md": {
|
||||
"original_hash": "730225ea274c9174fe688b21d421539d",
|
||||
"translation_date": "2026-04-06T18:43:38+00:00",
|
||||
"source_file": "5-Clustering/1-Visualize/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/1-Visualize/assignment.md": {
|
||||
"original_hash": "589fa015a5e7d9e67bd629f7d47b53de",
|
||||
"translation_date": "2026-04-06T18:43:50+00:00",
|
||||
"source_file": "5-Clustering/1-Visualize/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/1-Visualize/notebook.ipynb": {
|
||||
"original_hash": "40e0707e96b3e1899a912776006264f9",
|
||||
"translation_date": "2026-04-06T19:18:08+00:00",
|
||||
"source_file": "5-Clustering/1-Visualize/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/1-Visualize/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:44:06+00:00",
|
||||
"source_file": "5-Clustering/1-Visualize/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb": {
|
||||
"original_hash": "99c36449cad3708a435f6798cfa39972",
|
||||
"translation_date": "2026-04-06T19:23:33+00:00",
|
||||
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/1-Visualize/solution/notebook.ipynb": {
|
||||
"original_hash": "c61deff2839902ac8cb4ed411eb10fee",
|
||||
"translation_date": "2026-04-06T19:21:34+00:00",
|
||||
"source_file": "5-Clustering/1-Visualize/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/2-K-Means/README.md": {
|
||||
"original_hash": "7cdd17338d9bbd7e2171c2cd462eb081",
|
||||
"translation_date": "2026-04-06T18:41:05+00:00",
|
||||
"source_file": "5-Clustering/2-K-Means/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/2-K-Means/assignment.md": {
|
||||
"original_hash": "b8e17eff34ad1680eba2a5d3cf9ffc41",
|
||||
"translation_date": "2026-04-06T18:41:19+00:00",
|
||||
"source_file": "5-Clustering/2-K-Means/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/2-K-Means/notebook.ipynb": {
|
||||
"original_hash": "3e5c8ab363e8d88f566d4365efc7e0bd",
|
||||
"translation_date": "2026-04-06T19:18:01+00:00",
|
||||
"source_file": "5-Clustering/2-K-Means/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/2-K-Means/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:43:57+00:00",
|
||||
"source_file": "5-Clustering/2-K-Means/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb": {
|
||||
"original_hash": "ad65fb4aad0a156b42216e4929f490fc",
|
||||
"translation_date": "2026-04-06T19:21:02+00:00",
|
||||
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/2-K-Means/solution/notebook.ipynb": {
|
||||
"original_hash": "e867e87e3129c8875423a82945f4ad5e",
|
||||
"translation_date": "2026-04-06T19:18:41+00:00",
|
||||
"source_file": "5-Clustering/2-K-Means/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/2-K-Means/solution/tester.ipynb": {
|
||||
"original_hash": "6f92868513e59d321245137c1c4c5311",
|
||||
"translation_date": "2026-04-06T19:18:52+00:00",
|
||||
"source_file": "5-Clustering/2-K-Means/solution/tester.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"5-Clustering/README.md": {
|
||||
"original_hash": "b28a3a4911584062772c537b653ebbc7",
|
||||
"translation_date": "2026-04-06T18:05:44+00:00",
|
||||
"source_file": "5-Clustering/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/1-Introduction-to-NLP/README.md": {
|
||||
"original_hash": "1c2ec40cf55c98a028a359c27ef7e45a",
|
||||
"translation_date": "2026-04-06T18:35:16+00:00",
|
||||
"source_file": "6-NLP/1-Introduction-to-NLP/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/1-Introduction-to-NLP/assignment.md": {
|
||||
"original_hash": "1d7583e8046dacbb0c056d5ba0a71b16",
|
||||
"translation_date": "2026-04-06T18:35:27+00:00",
|
||||
"source_file": "6-NLP/1-Introduction-to-NLP/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/2-Tasks/README.md": {
|
||||
"original_hash": "5f3cb462e3122e1afe7ab0050ccf2bd3",
|
||||
"translation_date": "2026-04-06T18:36:49+00:00",
|
||||
"source_file": "6-NLP/2-Tasks/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/2-Tasks/assignment.md": {
|
||||
"original_hash": "2efc4c2aba5ed06c780c05539c492ae3",
|
||||
"translation_date": "2026-04-06T18:37:02+00:00",
|
||||
"source_file": "6-NLP/2-Tasks/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/3-Translation-Sentiment/README.md": {
|
||||
"original_hash": "be03c8182982b87ced155e4e9d1438e8",
|
||||
"translation_date": "2026-04-06T18:30:36+00:00",
|
||||
"source_file": "6-NLP/3-Translation-Sentiment/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/3-Translation-Sentiment/assignment.md": {
|
||||
"original_hash": "9d2a734deb904caff310d1a999c6bd7a",
|
||||
"translation_date": "2026-04-06T18:30:48+00:00",
|
||||
"source_file": "6-NLP/3-Translation-Sentiment/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/3-Translation-Sentiment/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:39:30+00:00",
|
||||
"source_file": "6-NLP/3-Translation-Sentiment/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/3-Translation-Sentiment/solution/R/README.md": {
|
||||
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||
"translation_date": "2026-04-06T18:39:36+00:00",
|
||||
"source_file": "6-NLP/3-Translation-Sentiment/solution/R/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/3-Translation-Sentiment/solution/notebook.ipynb": {
|
||||
"original_hash": "27de2abc0235ebd22080fc8f1107454d",
|
||||
"translation_date": "2026-04-06T19:17:29+00:00",
|
||||
"source_file": "6-NLP/3-Translation-Sentiment/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/4-Hotel-Reviews-1/README.md": {
|
||||
"original_hash": "8d32dadeda93c6fb5c43619854882ab1",
|
||||
"translation_date": "2026-04-06T18:34:00+00:00",
|
||||
"source_file": "6-NLP/4-Hotel-Reviews-1/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/4-Hotel-Reviews-1/assignment.md": {
|
||||
"original_hash": "bf39bceb833cd628f224941dca8041df",
|
||||
"translation_date": "2026-04-06T18:34:09+00:00",
|
||||
"source_file": "6-NLP/4-Hotel-Reviews-1/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:39:43+00:00",
|
||||
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/4-Hotel-Reviews-1/solution/R/README.md": {
|
||||
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||
"translation_date": "2026-04-06T18:39:52+00:00",
|
||||
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/R/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb": {
|
||||
"original_hash": "2d05e7db439376aa824f4b387f8324ca",
|
||||
"translation_date": "2026-04-06T19:17:34+00:00",
|
||||
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/5-Hotel-Reviews-2/README.md": {
|
||||
"original_hash": "2c742993fe95d5bcbb2846eda3d442a1",
|
||||
"translation_date": "2026-04-06T18:39:12+00:00",
|
||||
"source_file": "6-NLP/5-Hotel-Reviews-2/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/5-Hotel-Reviews-2/assignment.md": {
|
||||
"original_hash": "daf144daa552da6a7d442aff6f3e77d8",
|
||||
"translation_date": "2026-04-06T18:39:23+00:00",
|
||||
"source_file": "6-NLP/5-Hotel-Reviews-2/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb": {
|
||||
"original_hash": "033cb89c85500224b3c63fd04f49b4aa",
|
||||
"translation_date": "2026-04-06T19:17:40+00:00",
|
||||
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/5-Hotel-Reviews-2/solution/2-notebook.ipynb": {
|
||||
"original_hash": "341efc86325ec2a214f682f57a189dfd",
|
||||
"translation_date": "2026-04-06T19:17:45+00:00",
|
||||
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/2-notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb": {
|
||||
"original_hash": "705bf02633759f689abc37b19749a16d",
|
||||
"translation_date": "2026-04-06T19:17:51+00:00",
|
||||
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:39:58+00:00",
|
||||
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/5-Hotel-Reviews-2/solution/R/README.md": {
|
||||
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||
"translation_date": "2026-04-06T18:40:04+00:00",
|
||||
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/R/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/README.md": {
|
||||
"original_hash": "1eb379dc2d0c9940b320732d16083778",
|
||||
"translation_date": "2026-04-06T18:05:23+00:00",
|
||||
"source_file": "6-NLP/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"6-NLP/data/README.md": {
|
||||
"original_hash": "ee0670655c89e4719319764afb113624",
|
||||
"translation_date": "2026-04-06T18:34:16+00:00",
|
||||
"source_file": "6-NLP/data/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/1-Introduction/README.md": {
|
||||
"original_hash": "662b509c39eee205687726636d0a8455",
|
||||
"translation_date": "2026-04-06T19:02:35+00:00",
|
||||
"source_file": "7-TimeSeries/1-Introduction/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/1-Introduction/assignment.md": {
|
||||
"original_hash": "d1781b0b92568ea1d119d0a198b576b4",
|
||||
"translation_date": "2026-04-06T19:02:50+00:00",
|
||||
"source_file": "7-TimeSeries/1-Introduction/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/1-Introduction/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T19:04:50+00:00",
|
||||
"source_file": "7-TimeSeries/1-Introduction/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/1-Introduction/solution/R/README.md": {
|
||||
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||
"translation_date": "2026-04-06T19:04:56+00:00",
|
||||
"source_file": "7-TimeSeries/1-Introduction/solution/R/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/1-Introduction/solution/notebook.ipynb": {
|
||||
"original_hash": "dddca9ad9e34435494e0933c218e1579",
|
||||
"translation_date": "2026-04-06T19:36:51+00:00",
|
||||
"source_file": "7-TimeSeries/1-Introduction/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/1-Introduction/working/notebook.ipynb": {
|
||||
"original_hash": "5e2bbe594906dce3aaaa736d6dac6683",
|
||||
"translation_date": "2026-04-06T19:36:34+00:00",
|
||||
"source_file": "7-TimeSeries/1-Introduction/working/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/2-ARIMA/README.md": {
|
||||
"original_hash": "917dbf890db71a322f306050cb284749",
|
||||
"translation_date": "2026-04-06T19:04:30+00:00",
|
||||
"source_file": "7-TimeSeries/2-ARIMA/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/2-ARIMA/assignment.md": {
|
||||
"original_hash": "1c814013e10866dfd92cdb32caaae3ac",
|
||||
"translation_date": "2026-04-06T19:04:43+00:00",
|
||||
"source_file": "7-TimeSeries/2-ARIMA/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/2-ARIMA/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T19:05:02+00:00",
|
||||
"source_file": "7-TimeSeries/2-ARIMA/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/2-ARIMA/solution/R/README.md": {
|
||||
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||
"translation_date": "2026-04-06T19:05:09+00:00",
|
||||
"source_file": "7-TimeSeries/2-ARIMA/solution/R/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/2-ARIMA/solution/notebook.ipynb": {
|
||||
"original_hash": "c193140200b9684da27e3890211391b6",
|
||||
"translation_date": "2026-04-06T19:37:42+00:00",
|
||||
"source_file": "7-TimeSeries/2-ARIMA/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/2-ARIMA/working/notebook.ipynb": {
|
||||
"original_hash": "523ec472196307b3c4235337353c9ceb",
|
||||
"translation_date": "2026-04-06T19:37:04+00:00",
|
||||
"source_file": "7-TimeSeries/2-ARIMA/working/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/3-SVR/README.md": {
|
||||
"original_hash": "482bccabe1df958496ea71a3667995cd",
|
||||
"translation_date": "2026-04-06T19:00:48+00:00",
|
||||
"source_file": "7-TimeSeries/3-SVR/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/3-SVR/assignment.md": {
|
||||
"original_hash": "94aa2fc6154252ae30a3f3740299707a",
|
||||
"translation_date": "2026-04-06T19:01:02+00:00",
|
||||
"source_file": "7-TimeSeries/3-SVR/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/3-SVR/solution/notebook.ipynb": {
|
||||
"original_hash": "f8f3967282314d3995245835bdaa8418",
|
||||
"translation_date": "2026-04-06T19:36:24+00:00",
|
||||
"source_file": "7-TimeSeries/3-SVR/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/3-SVR/working/notebook.ipynb": {
|
||||
"original_hash": "e86ce102239a14c44585623b9b924a74",
|
||||
"translation_date": "2026-04-06T19:35:47+00:00",
|
||||
"source_file": "7-TimeSeries/3-SVR/working/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"7-TimeSeries/README.md": {
|
||||
"original_hash": "61342603bad8acadbc6b2e4e3aab3f66",
|
||||
"translation_date": "2026-04-06T18:07:29+00:00",
|
||||
"source_file": "7-TimeSeries/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/1-QLearning/README.md": {
|
||||
"original_hash": "911efd5e595089000cb3c16fce1beab8",
|
||||
"translation_date": "2026-04-06T18:58:38+00:00",
|
||||
"source_file": "8-Reinforcement/1-QLearning/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/1-QLearning/assignment.md": {
|
||||
"original_hash": "68394b2102d3503882e5e914bd0ff5c1",
|
||||
"translation_date": "2026-04-06T18:59:03+00:00",
|
||||
"source_file": "8-Reinforcement/1-QLearning/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/1-QLearning/notebook.ipynb": {
|
||||
"original_hash": "17e5a668646eabf5aabd0e9bfcf17876",
|
||||
"translation_date": "2026-04-06T19:32:19+00:00",
|
||||
"source_file": "8-Reinforcement/1-QLearning/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/1-QLearning/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:59:25+00:00",
|
||||
"source_file": "8-Reinforcement/1-QLearning/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/1-QLearning/solution/R/README.md": {
|
||||
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||
"translation_date": "2026-04-06T18:59:34+00:00",
|
||||
"source_file": "8-Reinforcement/1-QLearning/solution/R/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/1-QLearning/solution/assignment-solution.ipynb": {
|
||||
"original_hash": "eadbd20d2a075efb602615ad90b1e97a",
|
||||
"translation_date": "2026-04-06T19:33:34+00:00",
|
||||
"source_file": "8-Reinforcement/1-QLearning/solution/assignment-solution.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/1-QLearning/solution/notebook.ipynb": {
|
||||
"original_hash": "488431336543f71f14d4aaf0399e3381",
|
||||
"translation_date": "2026-04-06T19:35:09+00:00",
|
||||
"source_file": "8-Reinforcement/1-QLearning/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/2-Gym/README.md": {
|
||||
"original_hash": "107d5bb29da8a562e7ae72262d251a75",
|
||||
"translation_date": "2026-04-06T18:56:16+00:00",
|
||||
"source_file": "8-Reinforcement/2-Gym/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/2-Gym/assignment.md": {
|
||||
"original_hash": "1f2b7441745eb52e25745423b247016b",
|
||||
"translation_date": "2026-04-06T18:56:41+00:00",
|
||||
"source_file": "8-Reinforcement/2-Gym/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/2-Gym/notebook.ipynb": {
|
||||
"original_hash": "f22f8f3daed4b6d34648d1254763105b",
|
||||
"translation_date": "2026-04-06T19:31:15+00:00",
|
||||
"source_file": "8-Reinforcement/2-Gym/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/2-Gym/solution/Julia/README.md": {
|
||||
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||
"translation_date": "2026-04-06T18:59:10+00:00",
|
||||
"source_file": "8-Reinforcement/2-Gym/solution/Julia/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/2-Gym/solution/R/README.md": {
|
||||
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||
"translation_date": "2026-04-06T18:59:17+00:00",
|
||||
"source_file": "8-Reinforcement/2-Gym/solution/R/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/2-Gym/solution/notebook.ipynb": {
|
||||
"original_hash": "5c0e485e58d63c506f1791c4dbf990ce",
|
||||
"translation_date": "2026-04-06T19:33:05+00:00",
|
||||
"source_file": "8-Reinforcement/2-Gym/solution/notebook.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"8-Reinforcement/README.md": {
|
||||
"original_hash": "20ca019012b1725de956681d036d8b18",
|
||||
"translation_date": "2026-04-06T18:06:49+00:00",
|
||||
"source_file": "8-Reinforcement/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"9-Real-World/1-Applications/README.md": {
|
||||
"original_hash": "83320d6b6994909e35d830cebf214039",
|
||||
"translation_date": "2026-04-06T18:45:48+00:00",
|
||||
"source_file": "9-Real-World/1-Applications/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"9-Real-World/1-Applications/assignment.md": {
|
||||
"original_hash": "fdebfcd0a3f12c9e2b436ded1aa79885",
|
||||
"translation_date": "2026-04-06T18:46:03+00:00",
|
||||
"source_file": "9-Real-World/1-Applications/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"9-Real-World/2-Debugging-ML-Models/README.md": {
|
||||
"original_hash": "df2b538e8fbb3e91cf0419ae2f858675",
|
||||
"translation_date": "2026-04-06T18:48:38+00:00",
|
||||
"source_file": "9-Real-World/2-Debugging-ML-Models/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"9-Real-World/2-Debugging-ML-Models/assignment.md": {
|
||||
"original_hash": "91c6a180ef08e20cc15acfd2d6d6e164",
|
||||
"translation_date": "2026-04-06T18:48:50+00:00",
|
||||
"source_file": "9-Real-World/2-Debugging-ML-Models/assignment.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"9-Real-World/README.md": {
|
||||
"original_hash": "5e069a0ac02a9606a69946c2b3c574a9",
|
||||
"translation_date": "2026-04-06T18:06:01+00:00",
|
||||
"source_file": "9-Real-World/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"AGENTS.md": {
|
||||
"original_hash": "93fdaa0fd38836e50c4793e2f2f25e8b",
|
||||
"translation_date": "2026-04-06T17:58:39+00:00",
|
||||
"source_file": "AGENTS.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"CODE_OF_CONDUCT.md": {
|
||||
"original_hash": "c06b12caf3c901eb3156e3dd5b0aea56",
|
||||
"translation_date": "2026-04-06T17:58:48+00:00",
|
||||
"source_file": "CODE_OF_CONDUCT.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "977ec5266dfd78ad1ce2bd8d46fccbda",
|
||||
"translation_date": "2026-04-06T17:54:58+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"PyTorch_Fundamentals.ipynb": {
|
||||
"original_hash": "0ca21b6ee62904d616f2e36dc1cf0da7",
|
||||
"translation_date": "2026-04-06T19:05:33+00:00",
|
||||
"source_file": "PyTorch_Fundamentals.ipynb",
|
||||
"language_code": "km"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "7fb48097f57e680b380cd9aae988d317",
|
||||
"translation_date": "2026-04-06T18:03:45+00:00",
|
||||
"source_file": "README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"SECURITY.md": {
|
||||
"original_hash": "5e1b8da31aae9cca3d53ad243fa3365a",
|
||||
"translation_date": "2026-04-06T17:59:12+00:00",
|
||||
"source_file": "SECURITY.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"SUPPORT.md": {
|
||||
"original_hash": "09623d7343ff1c26ff4f198c1b2d3176",
|
||||
"translation_date": "2026-04-06T17:54:41+00:00",
|
||||
"source_file": "SUPPORT.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"TROUBLESHOOTING.md": {
|
||||
"original_hash": "134d8759f0e2ab886e9aa4f62362c201",
|
||||
"translation_date": "2026-04-06T17:57:24+00:00",
|
||||
"source_file": "TROUBLESHOOTING.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"docs/_sidebar.md": {
|
||||
"original_hash": "68dd06c685f6ce840e0acfa313352e7c",
|
||||
"translation_date": "2026-04-06T18:07:09+00:00",
|
||||
"source_file": "docs/_sidebar.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"for-teachers.md": {
|
||||
"original_hash": "b37de02054fa6c0438ede6fabe1fdfb8",
|
||||
"translation_date": "2026-04-06T17:54:28+00:00",
|
||||
"source_file": "for-teachers.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"quiz-app/README.md": {
|
||||
"original_hash": "6d130dffca5db70d7e615f926cb1ad4c",
|
||||
"translation_date": "2026-04-06T18:05:00+00:00",
|
||||
"source_file": "quiz-app/README.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"sketchnotes/LICENSE.md": {
|
||||
"original_hash": "fba3b94d88bfb9b81369b869a1e9a20f",
|
||||
"translation_date": "2026-04-06T18:12:33+00:00",
|
||||
"source_file": "sketchnotes/LICENSE.md",
|
||||
"language_code": "km"
|
||||
},
|
||||
"sketchnotes/README.md": {
|
||||
"original_hash": "a88d5918c1b9da69a40d917a0840c497",
|
||||
"translation_date": "2026-04-06T18:07:39+00:00",
|
||||
"source_file": "sketchnotes/README.md",
|
||||
"language_code": "km"
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,152 @@
|
||||
# ការណែនាំអំពីការរៀនម៉ាស៊ីន
|
||||
|
||||
## [សំណួរតេស្តមុនថ្នាក់](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
---
|
||||
|
||||
[](https://youtu.be/6mSx_KJxcHI "ML សម្រាប់អ្នកសរសេរใหม่ - ការណែនាំអំពីការរៀនម៉ាស៊ីនសម្រាប់អ្នកសរសេរ")
|
||||
|
||||
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូខ្លីបង្ហាញពីមេរៀននេះ។
|
||||
|
||||
សូមស្វាគមន៍មកកាន់វគ្គសិក្សានេះអំពីការរៀនម៉ាស៊ីនបែបសាមញ្ញសម្រាប់អ្នកចាប់ផ្ដើម! មិនថាអ្នកជាអ្នកថ្មីតែម្តងនឹងប្រធានបទនេះ ឬជាអ្នកអនុវត្ត ML ដែលមានបទពិសោធន៍ជាមួយកន្លែងមួយណាមួយដែលចង់បង្កើតវិជ្ជាជីវៈឡើងវិញ យើងមានសេចក្ដីសប្បាយរីករាយដែលអ្នកបានចូលរួមជាមួយយើង! យើងចង់បង្កើតទីតាំងមួយដែលរាប់មិត្តភាព សម្រាប់ការសិក្សា ML របស់អ្នក ហើយយើងនឹងមានមោទនភាពក្នុងការវាយតម្លៃ ឆ្លើយតប និងរួមបញ្ចូលមតិយោបល់របស់អ្នក [feedback](https://github.com/microsoft/ML-For-Beginners/discussions)។
|
||||
|
||||
[](https://youtu.be/h0e2HAPTGF4 "ការណែនាំអំពី ML")
|
||||
|
||||
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូ៖ John Guttag របស់ MIT ដឹកនាំបង្ហាញអំពីការរៀនម៉ាស៊ីន
|
||||
|
||||
---
|
||||
## ផ្ដើមសិក្សាអំពីការរៀនម៉ាស៊ីន
|
||||
|
||||
មុននឹងចាប់ផ្ដើមវគ្គសិក្សានេះ អ្នកត្រូវតែមានកុំព្យូទ័ររបស់អ្នកត្រៀមរួចរាល់សម្រាប់បើកចូលប្រើមូលដ្ឋានសៀវភៅកំណត់ត្រាផ្ទាល់ខ្លួន។
|
||||
|
||||
- **កំណត់រចនាសម្ព័ន្ធម៉ាស៊ីនរបស់អ្នកជាមួយវីដេអូទាំងនេះ**។ ប្រើតំណភ្ជាប់ខាងក្រោមសម្រាប់រៀនពីរបៀប [ដំឡើង Python](https://youtu.be/CXZYvNRIAKM) នៅលើប្រព័ន្ធរបស់អ្នក និង [កំណត់ការ text editor](https://youtu.be/EU8eayHWoZg) សម្រាប់ការអភិវឌ្ឍន៍។
|
||||
- **រៀន Python**។ បើកមានការផ្តល់អនុសាសន៍ឲ្យមានការយល់ដឹងមូលដ្ឋានអំពី [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott) ដែលជាភាសាកូដដែលមានប្រយោជន៍សម្រាប់អ្នកវិទ្យាសាស្ត្រទិន្នន័យដែលយើងប្រើក្នុងវគ្គសិក្សានេះ។
|
||||
- **រៀន Node.js និង JavaScript**។ យើងក៏ប្រើ JavaScript ពេលខ្លះនៅក្នុងវគ្គនេះពេលកសាងកម្មវិធីបណ្តាញ ដូច្នេះអ្នកត្រូវតែមាន [node](https://nodejs.org) និង [npm](https://www.npmjs.com/) តម្លើងក្នុងប្រព័ន្ធរបស់អ្នក បូកជាមួយការចូលប្រើ [Visual Studio Code](https://code.visualstudio.com/) សម្រាប់ការអភិវឌ្ឍ Python និង JavaScript ។
|
||||
- **បង្កើតគណនី GitHub**។ ពីព្រោះអ្នកបានរកឃើញយើងនៅទីនេះលើ [GitHub](https://github.com) សូមអាចមានគណនីរួចហើយ តែបើមិនមានសូមបង្កើត និង Fork វគ្គសិក្សានេះដើម្បីប្រើប្រាស់ដោយផ្ទាល់ខ្លួន។ (សូមឥតគិតថ្លៃផ្តល់ផ្កាយមួយជាការគាំទ្រ 😊)
|
||||
- **ស្វែងយល់អំពី Scikit-learn**។ សូមស្គាល់គាត់ [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) ដែលជាសំណុំនៃបណ្ណាល័យ ML ដែលយើងយោងទៅលើក្នុងមេរៀនទាំងនេះ។
|
||||
|
||||
---
|
||||
## តើការរៀនម៉ាស៊ីនគឺជាអ្វី?
|
||||
|
||||
ពាក្យ 'machine learning' គឺជាក្ដីពេញនិយម និងប្រើប្រាស់ញឹកញាប់បំផុតសម្រាប់សព្វថ្ងៃ។ មានភាពអាចម៍កើតឡើងថាអ្នកបានឮពាក្យនេះយ៉ាងហោចណាស់មួយដង ប្រសិនបើអ្នកមានស្គាល់ខ្លះៗអំពីបច្ចេកវិទ្យា មិនថាអ្នកធ្វើការនៅក្នុងវិស័យណា។ បច្ចេកទេសនៃការរៀនម៉ាស៊ីន យ៉ាងណាមិញ ក៏នៅតែជារឿងលេងល្បងសម្រាប់មនុស្សភាគច្រើន។ សម្រាប់អ្នកចាប់ផ្ដើមការរៀនម៉ាស៊ីន ប្រធានបទនេះអាចមានអារម្មណ៍ថាស្មួតស្មើ។ ដូច្នេះ វាសំខាន់ណាស់ក្នុងការយល់ពីអ្វីទៅជា machine learning ពិតប្រាកដ ហើយរៀនវាជាគ្រប់ជំហាន តាមរយៈឧទាហរណ៍អនុវត្តន៍។
|
||||
|
||||
---
|
||||
## របងប្រភេទតំណពន្លឺ
|
||||
|
||||

|
||||
|
||||
> Google Trends បង្ហាញរបងប្រភេទ 'hype curve' នៃពាក្យ 'machine learning' នៅពេលថ្មីៗនេះ
|
||||
|
||||
---
|
||||
## ពិភពគម្រប
|
||||
|
||||
យើងរស់នៅក្នុងពិភពមួយដែលពេញលេញដោយសម្ងាត់គួរឱ្យចាប់អារម្មណ៍។ អ្នកវិទ្យាសាស្ត្រល្បីៗដូចជា Stephen Hawking, Albert Einstein និងមនុស្សជាច្រើនទៀត បានសំលាប់ពេលវេលាផ្នែកធ្វើស្រាវជ្រាវដើម្បីស្វែងរកព័ត៌មានមានន័យ ដែលបំភ្លឺសម្ងាត់នៃពិភពជុំវិញយើង។ នេះគឺជាសភាពមនុស្សក្នុងការរៀន៖ កុមារមនុស្សរៀនអ្វីថ្មីៗ និងរកឃើញរចនាសម្ព័ន្ធនៃពិភពរបស់ពួកគេឆ្នាំក្រោមឆ្នាំនៅពេលពួកគេចាស់ដល់វ័យពេញវ័យ។
|
||||
|
||||
---
|
||||
## សម្ថភាពខួរក្បាលកុមារ
|
||||
|
||||
ខួរក្បាល និងអារម្មណ៍របស់កុមារយល់ឃើញពីការពិតជុំវិញពួកគេ ហើយរៀនយ៉ាងតិចតួចពីរចនាសម្ព័ន្ធលាក់សំខាន់នៃជីវិត ដែលជួយឲ្យកុមារបង្កើតច្បាប់មានទិដ្ឋភាពយុត្តិធម៌ ដើម្បីសំគាល់លំនាំដែលបានរៀន។ ដំណើរការរៀននៃខួរក្បាលមនុស្សធ្វើឱ្យមនុស្សមានជីវិតកាន់តែស្មុគស្មាញបំផុតលើពិភពលោកនេះ។ ការរៀនទៅជានិរន្តរភាពដោយបង្កើតរកលំនាំលាក់ ហើយបន្ទាប់មកបង្កើតថ្មីលើលំនាំទាំងនោះ អនុញ្ញាតឱ្យយើងធ្វើឱ្យខ្លួនឯងកាន់តែប្រសើរឡើងក្នុងអាយុកាលកំណត់របស់យើង។ សមត្ថភាពរៀន និងសមត្ថភាពអភិវឌ្ឍឆាប់រហ័សនេះ មានទំនាក់ទំនងជាមួយយោគយល់មួយហៅថា [brain plasticity](https://www.simplypsychology.org/brain-plasticity.html)។ ជាមិនធម្មតាទេ យើងអាចគូររូបភាពស្រដៀងគ្នាជាមួយរបស់ការរៀននៃខួរក្បាលមនុស្ស និងយោគយល់នៃការរៀនម៉ាស៊ីន។
|
||||
|
||||
---
|
||||
## ខួរក្បាលមនុស្ស
|
||||
|
||||
[ខួរក្បាលមនុស្ស](https://www.livescience.com/29365-human-brain.html) យល់ឃើញអំពីរឿងនៅពិតក្នុងពិភពលោក ធ្វើដំណើរការព័ត៌មានដែលបានយល់ឃើញ ធ្វើសេចក្តីសម្រេចយុត្តិធម៌ និងអនុវត្តសកម្មភាពមួយចំនួនដោយផ្អែកលើអត្តសញ្ញាណនៃស្ថានភាព។ នេះគឺជារឿងដែលយើងហៅថា ការប្រព្រឹត្តសមត្ថភាពយុត្តិាសាស្រ្ត។ នៅពេលដែលយើងកូដការប្រព្រឹត្តបែបនេះទៅឲ្យម៉ាស៊ីនវាយហៅថា បញ្ញាសិប្បនិម្មិត (AI)។
|
||||
|
||||
---
|
||||
## ពាក្យបច្ចេកទេសខ្លះៗ
|
||||
|
||||
ទោះពាក្យទាំងនោះអាចបង្កភាពច្របូកច្របល់ តែការរៀនម៉ាស៊ីន (ML) គឺជាផ្នែកសំខាន់មួយរបស់បញ្ញាសិប្បនិម្មិត។ **ML គឺផ្តោតលើការប្រើប្រាស់អាល់ហ្គោរីធម៍ឯកទេស ដើម្បីរកព័ត៌មានមានន័យ និងរកលំនាំលាក់ពីទិន្នន័យដែលបានយល់ឃើញ ដើម្បីពន្លឿនដំណើរការសម្រេចចិត្តយុត្តិធម៌**។
|
||||
|
||||
---
|
||||
## AI, ML, ការរៀនជ្រៅ
|
||||
|
||||

|
||||
|
||||
> ក្រាហ្វិកបង្ហាញទំនាក់ទំនងរវាង AI, ML, ការរៀនជ្រៅ និងវិទ្យាសាស្រ្តទិន្នន័យ។ ប្លង់បាប់ដោយ [Jen Looper](https://twitter.com/jenlooper) នាំមកពី [រូបនេះ](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining)
|
||||
|
||||
---
|
||||
## គន្លឹះដែលត្រូវរៀន
|
||||
|
||||
នៅក្នុងវគ្គនេះ យើងនឹងគ្របដណ្តប់ត្រឹមតែគន្លឹះស្នូលនៃការរៀនម៉ាស៊ីនដែលអ្នកចាប់ផ្ដើមត្រូវបានគេរៀន។ យើងលើកឡើងអ្វីដែលហៅថា 'classical machine learning' ជាចម្បងប្រើ Scikit-learn ដែលជាបណ្ណាល័យល្អសម្រាប់សិស្សជាច្រើនក្នុងការរៀនមូលដ្ឋាន។ ដើម្បីយល់ពីគំនិតធំទូលាយនៃបញ្ញាសិប្បនិម្មិត ឬការរៀនជ្រៅ បានត្រូវកំលាំងចំណេះដឹងមូលដ្ឋានរឹងមាំមួយនៃការរៀនម៉ាស៊ីន ហើយយើងចង់ផ្តល់វា នៅទីនេះ។
|
||||
|
||||
---
|
||||
## ក្នុងវគ្គនេះ អ្នកនឹងរៀនពី៖
|
||||
|
||||
- គន្លឹះស្នូលនៃការរៀនម៉ាស៊ីន
|
||||
- ប្រវត្តិការរៀនម៉ាស៊ីន
|
||||
- ការរៀនម៉ាស៊ីន និងភាពយុត្តិធម៌
|
||||
- ជំនាញ ML សម្រាប់បញ្ហាអនុគមន៍វិនិយោគ (regression)
|
||||
- ជំនាញ ML សម្រាប់ចាត់ថ្នាក់ (classification)
|
||||
- ជំនាញ ML សម្រាប់ក្រុមគ្នា (clustering)
|
||||
- ជំនាញ ML សម្រាប់ដំណើរការភាសាត្រឹមត្រូវ (natural language processing)
|
||||
- ជំនាញ ML សម្រាប់ការព្យាករណ៍ស៊េរីពេលវេលា (time series forecasting)
|
||||
- ការរៀនតាមមូលដ្ឋានការបង្រៀន (reinforcement learning)
|
||||
- ករណីប្រើប្រាស់ដែលមាននៅក្នុងពិភពជាក់ស្តែងសម្រាប់ ML
|
||||
|
||||
---
|
||||
## អ្វីដែលយើងមិនគ្របដណ្តប់
|
||||
|
||||
- ការរៀនជ្រៅ (deep learning)
|
||||
- បណ្តាញប្រព័ន្ធប្រតិបត្តិកម្មប្រសព្វ (neural networks)
|
||||
- បញ្ញាសិប្បនិម្មិត (AI)
|
||||
|
||||
ដើម្បីធ្វើឱ្យមានបទពិសោធន៍សិក្សាជាងនេះ យើងនឹងបម្លែងការលំបាករបស់បណ្តាញប្រព័ន្ធប្រតិបត្តិកម្ម ប្រភេទ 'deep learning' ដែលជាការសាងសង់គំរូជាច្រើនជាន់ ដោយប្រើបណ្តាញប្រព័ន្ធប្រតិបត្តិកម្ម និង AI ដែលយើងនឹងពិភាក្សាវា នៅក្នុងវគ្គផ្សេងទៀត។ យើងនឹងផ្តល់ថ្នាក់សិក្សាវិទ្យាសាស្ត្រទិន្នន័យមួយមកក្រោយដើម្បីផ្តោតលើផ្នែកនោះ។
|
||||
|
||||
---
|
||||
## ហេតុអ្វីបានជាអាចរៀនការរៀនម៉ាស៊ីន?
|
||||
|
||||
ការរៀនម៉ាស៊ីន តាមទស្សនវិជ្ជាស៊ីស្តុំ កំណត់ថាជាការបង្កើតប្រព័ន្ធស្វ័យប្រវត្តិ ដែលអាចរៀនពីលំនាំលាក់ក្នុងទិន្នន័យ ដើម្បីជួយក្នុងការបង្កើតសេចក្តីសម្រេចយុត្តិធម៌យ៉ាងមានមហិច្ឆតា។
|
||||
|
||||
ជំនោគនេះគឺបានទទួលការប្រៀបធៀបយ៉ាងមិនតឹងរឹងទេពីរបៀបដែលខួរក្បាលមនុស្សរៀនអ្វីមួយវាលើទិន្នន័យដែលខួរក្បាលទទួលបានពីបរិយាកាសខាងក្រៅ។
|
||||
|
||||
✅ សូមគិតរយៈពេលជាមួយអ្នកមួយនាទីថា ហេតុអ្វីបានជាអាជីវកម្មចង់ប្រើវិធីសាស្រ្តការរៀនម៉ាស៊ីន ផ្ទុយពីការបង្កើតម៉ោងកូដលក្ខខណ្ឌរឹងមាំ។
|
||||
|
||||
---
|
||||
## ការប្រើប្រាស់ការរៀនម៉ាស៊ីន
|
||||
|
||||
កម្មវិធីនៃការរៀនម៉ាស៊ីនឥឡូវនេះមានគ្រប់ទីកន្លែង ហើយពេញលេញដូចទិន្នន័យដែលហូរៀងជុំវិញសង្គមយើង ដែលបង្កើតដោយទូរស័ព្ទដៃឆ្លាតរបស់យើង ឧបករណ៍ភ្ជាប់ និងប្រព័ន្ធផ្សេងទៀត។ ក្នុងការប្រកួតប្រជែងនៃអាល់ហ្គោរីធម៍ការរៀនម៉ាស៊ីនដ៏ទំនើប បណ្ឌិតស្រាវជ្រាវបានស្វែងយល់ពីសមត្ថភាពរបស់ពួកគេនៅក្នុងដោះស្រាយបញ្ហាជាច្រើនdimensional និង multidisciplinary នៃជីវិតពិតជាមួយលទ្ធផលវិជ្ជមានជាច្រើន។
|
||||
|
||||
---
|
||||
## ឧទាហរណ៍នៃ ML ដែលបានអនុវត្ត
|
||||
|
||||
**អ្នកអាចប្រើប្រាស់ការរៀនម៉ាស៊ីននៅក្នុងវិធីជាច្រើន**៖
|
||||
|
||||
- ដើម្បីព្យាករណ៍អត្រាឆាប់ជម្ងឺពីប្រវត្តិវេជ្ជសាស្ត្រឬរបាយការណ៍របស់អ្នកជំងឺម្នាក់។
|
||||
- ដើម្បីប្រើទិន្នន័យអាកាសធាតុក្នុងការព្យាករណ៍លទ្ធផលអាកាសធាតុ។
|
||||
- ដើម្បីយល់ពីអារម្មណ៍នៃអត្ថបទមួយ។
|
||||
- ដើម្បីរកឃើញព័ត៌មានមិនពិត ដើម្បីបិទបាំងការផ្សាយពាណិជ្ជកម្មមិនពិត។
|
||||
|
||||
វិស័យហិរញ្ញវត្ថុ សេដ្ឋកិច្ច វិទ្យាសាស្ត្រផែនដី ការស្វែងរកអាកាស ការវិទ្យាសាស្ត្រពេទ្យ វិទ្យាសាស្ត្រស្មារតី និងសតិវិទ្យា និងជំនាញមួយចំនួននៅវិស័យមនុស្សវិទ្យា ក៏បានអភិវឌ្ឍការរៀនម៉ាស៊ីនដើម្បីដោះស្រាយបញ្ហាដ៏ញឹកញាប់ នៃការប្រមូលទិន្នន័យធុញទ្រាន់នូវដែនជួញដូរ។
|
||||
|
||||
---
|
||||
## សេចក្តីសន្និដ្ឋាន
|
||||
|
||||
ការរៀនម៉ាស៊ីនបន្ទាន់សកម្មភាពស្វែងរកលំនាំដោយរកដំណោះស្រាយមានន័យពីទិន្នន័យពិតប្រាកដ ឬទិន្នន័យដែលបង្កើតឡើង។ វាបានបញ្ជាក់ថាមានតម្លៃខ្ពស់បំផុតក្នុងវិស័យអាជីវកម្ម សុខភាព និងហិរញ្ញវត្ថុ ជាដើម។
|
||||
|
||||
នៅពេលអនាគតជិតមក ការយល់ដឹងពីមូលដ្ឋាននៃការរៀនម៉ាស៊ីន នឹងក្លាយជាការដែលមនុស្សគ្រប់វិស័យតម្រូវការចង់យល់ ខ្លួនដោយសារតែកំណាត់ទោលបណ្ដាញរបស់វាត្រូវបានទទួលយកយ៉ាងទូលំទូលាយ។
|
||||
|
||||
---
|
||||
# 🚀 ប défi
|
||||
|
||||
គូររូបរាង លើក្រដាស ឬប្រើកម្មវិធីផ្សេងទៀតដូចជា [Excalidraw](https://excalidraw.com/), ពិចារណាអំពីភាពខុសគ្នារវាង AI, ML, ការរៀនជ្រៅ និងវិទ្យាសាស្ត្រទិន្នន័យ។ បន្ថែមគំនិតអំពីបញ្ហាណាមួយដែលបច្ចេកទេសទាំងនេះល្អក្នុងការដោះស្រាយ។
|
||||
|
||||
# [សំណួរតេស្តបន្ទាប់ថ្នាក់](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
---
|
||||
# ការពិនិត្យឡើងវិញ និងសិក្សាឯករាជ្យ
|
||||
|
||||
ដើម្បីរៀនបន្ថែមអំពីរបៀបដែលអ្នកអាចធ្វើការជាមួយអាល់ហ្គោរីធម៍ ML នៅក្នុងពពក សូមអនុវត្តតាម [Learning Path](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott) នេះ។
|
||||
|
||||
ចូលរួម [Learning Path](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) អំពីមូលដ្ឋាននៃ ML។
|
||||
|
||||
---
|
||||
# ផ្ដល់ការងារ
|
||||
|
||||
[ចាប់ផ្ដើមដំណើរការ](assignment.md)
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបញ្ជាក់**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងព្យាយាមធ្វើឲ្យមានភាពត្រឹមត្រូវ នោះទេ សូមយល់ដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវខ្លះ។ ឯកសារដើមជាភាសាជាតិនៃឯកសារនោះគួរត្រូវបានទទួលស្គាល់ថាជាភស្តុតាងផ្លូវការជាចម្បង។ សម្រាប់ព័ត៌មានសំខាន់ៗ អនុញ្ញាតឲ្យមានការបកប្រែដោយអ្នកជំនាញមនុស្សជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែច្រឡំណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះទេ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,16 @@
|
||||
# ចាប់ផ្តើម និងដំណើរការ
|
||||
|
||||
## សេចក្តីណែនាំ
|
||||
|
||||
ក្នុងកិច្ចការនេះដែលមិនប្រគល់ពិន្ទុ អ្នកគួរតែបង្រៀនឡើងវិញអំពីភាសា Python និងធ្វើឲ្យបរិយាកាសរបស់អ្នកដំណើរការបាន និងអាចដំណើរការបំណែកកំណត់កំណត់ត្រាបាន។
|
||||
|
||||
យក [ផ្លូវការសិក្សា Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott) នេះ ហើយបន្ទាប់មកតំឡើងប្រព័ន្ធរបស់អ្នកដោយមើលវីដេអូបណ្ដាញមូលដ្ឋានទាំងនេះ៖
|
||||
|
||||
https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំសំរាប់ភាពត្រឹមត្រូវ សូមប្រយ័ត្នថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមដែលមានភាសាដើមគួរត្រូវបានចាត់ទុកថាជាប្រភពផ្លូវការជាក់លាក់។ សម្រាប់ព័ត៌មានសំខាន់ៗ គួរតែប្រើការបកប្រែដោយមនុស្សជំនាញវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសមួយណាដែលបង្កឡើងពីការប្រើប្រាស់ការបកប្រែនេះទេ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,18 @@
|
||||
# បង្កើតបន្ទាត់ពេលវេលា
|
||||
|
||||
## សេចក្ដីណែនាំ
|
||||
|
||||
ប្រើ [repo នេះ](https://github.com/Digital-Humanities-Toolkit/timeline-builder) បង្កើតបន្ទាត់ពេលវេលា ស្ដីពីជំរៅណាមួយនៃប្រវត្តិសាស្ត្ររបស់អាល់ហ្គោរិធម៍ សាស្ត្រគណិតវិទ្យា ស្ថិតិសាស្ត្រ បញ្ញាសិប្បនិម្មិត ឬរបៀបរៀនម៉ាស៊ីន ឬការតម្រង់គ្នានៃវា។ អ្នកអាចផ្ដោតលើមនុស្សម្នាក់ មតិមួយ ឬរយៈពេលយូរនៃការគិត។ ត្រូវប្រាកដថាបញ្ចូលធាតុ multimedia។
|
||||
|
||||
## ការ៉ាបៀង
|
||||
|
||||
| កម្រិត | ល្អឥតខ្ចោះ | ពេញលេញ | តម្រូវការកែលម្អ |
|
||||
| -------- | ----------------------------------------------- | ------------------------------------- | ---------------------------------------------------------------- |
|
||||
| | បន្ទាត់ពេលវេលាបានដាក់បង្ហាញជាទំព័រ GitHub | កូដមិនពេញលេញ ហើយមិនបានដាក់បង្ហាញ | បន្ទាត់ពេលវេលាមិនពេញលេញ មិនបានស្រាវជ្រាវល្អ និង មិនបានដាក់បង្ហាញ |
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator) ។ ខណៈដែលយើងខិតខំប្រឹងប្រែងក្នុងការបញ្ជាក់ភាពត្រឹមត្រូវ សូមជម្រាបថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាមូលដ្ឋានគួรถูกគេយកចិត្តទុកដាក់ថាជាប្រភពដ្ឋានមួយដែលមានតម្លៃ។ សម្រាប់ព័ត៌មានសំខាន់ៗ ការបកប្រែដោយមនុស្សដែលជាអ្នកជំនាញត្រូវបានផ្ដល់អនុសាសន៍។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,18 @@
|
||||
# ស្វែងយល់អំពីប្រអប់ឧបករណ៍ AI ដែលមានការទទួលខុសត្រូវ
|
||||
|
||||
## សេចក្តីណែនាំ
|
||||
|
||||
នៅក្នុងមេរៀននេះ អ្នកបានរៀនអំពីប្រអប់ឧបករណ៍ AI ដែលមានការទទួលខុសត្រូវ ដែលជាគម្រោង "ប្រភពបើកចំហ ដែលដឹកនាំដោយសហគមន៍ ដើម្បីជួយអ្នកវិទ្យាសាស្ត្រទិន្នន័យវិភាគ និងបង្កើនប្រសិទ្ធភាពប្រព័ន្ធ AI"។ សម្រាប់ភារកិច្ចនេះ សូមស្វែងយល់ពី [សៀវភៅកំណត់ត្រា](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/tabular/getting-started.ipynb) មួយនៃប្រអប់ឧបករណ៍ RAI ហើយរាយការណ៍លទ្ធផលរបស់អ្នកក្នុងអត្ថបទឬការនាំเสนอ។
|
||||
|
||||
## លក្ខខណ្ឌវាយតំលៃ
|
||||
|
||||
| លក្ខណៈ | ល្អឯក | គ្រប់គ្រាន់ | ត្រូវការកែលម្អ |
|
||||
| -------- | --------- | -------- | ----------------- |
|
||||
| | មានការនាំเสนอអត្ថបទឬបង្ហាញ PowerPoint ដែលពិភាក្សាអំពីប្រព័ន្ធ Fairlearn សៀវភៅកំណត់ត្រាដែលបានបើកប្រតិបត្តិ និងមតិយោបល់ដែលបានទាញយកពីការបើកប្រតិបត្តិ | មានការនាំเสนอអត្ថបទដោយគ្មានមតិយោបល់ | មិនមានការនាំเสนอអត្ថបទ |
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**:
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ក្នុងខណៈពេលដែលយើងខិតខំសម្រាប់ភាពត្រឹមត្រូវ សូមយល់ដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមដែលមានភាសាដោយដើមគួរត្រូវបានគេរកស៊ីជាខ្សែអធិបតេយ្យ។ សម្រាប់ព័ត៌មានសំខាន់ៗ ការបកប្រែដោយអ្នកជំនាញមនុស្សគឺបានណែនាំ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុស ណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,18 @@
|
||||
# សម្ភាសន៍អ្នកវិទ្យាសាស្ត្រទិន្នន័យ
|
||||
|
||||
## សេចក្តីណែនាំ
|
||||
|
||||
នៅក្នុងក្រុមហ៊ុនរបស់អ្នក ក្នុងក្រុមអ្នកប្រើ ឬរវាងមិត្តភក្តិ ឬសិស្សានុសិស្សរបស់អ្នក សូមនិយាយជាមួយនរណាម្នាក់ដែលបំពេញការងារជាអ្នកវិទ្យាសាស្ត្រទិន្នន័យជាមុខរបរ។ សរសេរឯកសារសេចក្តីយោងខ្លីមួយ (៥០០ ពាក្យ) ស្តីអំពីការងារប្រចាំថ្ងៃរបស់ពួកគេ។ តើពួកគេជាអ្នកជំនាញ ឬធ្វើការជា 'full stack'?
|
||||
|
||||
## វិចារណាការណ៍
|
||||
|
||||
| លក្ខខណ្ឌ | ល្អឧត្តម | គ្រប់គ្រាន់ | ត្រូវធ្វើការកែលម្អ |
|
||||
| -------- | ------------------------------------------------------------------------------ | -------------------------------------------------------------------- | -------------------- |
|
||||
| | សេចក្តីអត្ថបទមានប្រវែងត្រឹមត្រូវ មានប្រភពយោងត្រឹមត្រូវ និងបង្ហាញជាឯកសារ.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,29 @@
|
||||
# ការណែនាំអំពីការរៀនម៉ាស៊ីន
|
||||
|
||||
នៅក្នុងផ្នែកនេះនៃកម្មវិធីសិក្សា អ្នកនឹងត្រូវបានណែនាំអំពីគំនិតមូលដ្ឋានដែលនៅក្រោមវិស័យការរៀនម៉ាស៊ីន វាជាអ្វី ហើយសិក្សាអំពីប្រវត្តិសាស្ត្រ និងបច្ចេកទេសដែលអ្នកស្រាវជ្រាវប្រើដើម្បីធ្វើការជាមួយវា។ យើងមកស្វែងយល់ពីពិភពថ្មីនៃ ML ជាមួយគ្នា!
|
||||
|
||||

|
||||
> រូបថតដោយ <a href="https://unsplash.com/@bill_oxford?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Bill Oxford</a> នៅលើ <a href="https://unsplash.com/s/photos/globe?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
|
||||
|
||||
### មេរៀន
|
||||
|
||||
1. [ការណែនាំអំពីការរៀនម៉ាស៊ីន](1-intro-to-ML/README.md)
|
||||
1. [ប្រវត្តិការរៀនម៉ាស៊ីន និង AI](2-history-of-ML/README.md)
|
||||
1. [ភាពត្រឹមត្រូវ និងការរៀនម៉ាស៊ីន](3-fairness/README.md)
|
||||
1. [បច្ចេកទេសនៃការរៀនម៉ាស៊ីន](4-techniques-of-ML/README.md)
|
||||
### យោង
|
||||
|
||||
"ការណែនាំអំពីការរៀនម៉ាស៊ីន" ត្រូវបានសរសេរដោយ ♥️ ដោយក្រុមមនុស្សរួមមាន [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) និង [Jen Looper](https://twitter.com/jenlooper)
|
||||
|
||||
"ប្រវត្តិការរៀនម៉ាស៊ីន" ត្រូវបានសរសេរដោយ ♥️ ជាមួយ [Jen Looper](https://twitter.com/jenlooper) និង [Amy Boyd](https://twitter.com/AmyKateNicho)
|
||||
|
||||
"ភាពត្រឹមត្រូវ និងការរៀនម៉ាស៊ីន" ត្រូវបានសរសេរដោយ ♥️ ដោយ [Tomomi Imura](https://twitter.com/girliemac)
|
||||
|
||||
"បច្ចេកទេសនៃការរៀនម៉ាស៊ីន" ត្រូវបានសរសេរដោយ ♥️ ដោយ [Jen Looper](https://twitter.com/jenlooper) និង [Chris Noring](https://twitter.com/softchris)
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងខិតខំខាងភាពត្រឹមត្រូវ ក៏សូមជ្រាបថាការបកប្រែដោយអូតូម៉ាទិចអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវខ្លះ។ ឯកសារដើមនៅក្នុងភាសាដើមគួរត្រូវបានគេចាត់ទុកជាមូលដ្ឋានដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមផ្តល់អត្ថប្រយោជន៍នៃការបកប្រែមនុស្សវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំន ឬការបកស្រាយខុសចេញពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,231 @@
|
||||
# ចាប់ផ្ដើមជាមួយ Python និង Scikit-learn សម្រាប់គំរូប្រូក្រេសស្យុង
|
||||
|
||||

|
||||
|
||||
> ស្គេតណូតដោយ [Tomomi Imura](https://www.twitter.com/girlie_mac)
|
||||
|
||||
## [សំណួរប្រលងមុនមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
> ### [មេរៀននេះអាចប្រើបានក្នុង R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
|
||||
|
||||
## ការណែនាំ
|
||||
|
||||
នៅក្នុងមេរៀនបួននេះ អ្នកនឹងស្វែងរកវិធីសម្រាប់បង្កើតគំរូប្រូក្រេសស្យុង។ យើងនឹងពិភាក្សាថាវាជាកម្មវិធីសម្រាប់អ្វីក្នុងពេលឆាប់ៗនេះ។ ប៉ុន្តែក្រោយពេលអ្នកមិនបានធ្វើអ្វីនោះទេ សូមប្រាកដថាអ្នកមានឧបករណ៍ត្រឹមត្រូវដើម្បីចាប់ផ្ដើមដំណើរការនេះ!
|
||||
|
||||
នៅក្នុងមេរៀននេះ អ្នកនឹងរៀនពី៖
|
||||
|
||||
- ការកំណត់កុំព្យូទ័ររបស់អ្នកសម្រាប់បេសកកម្មម៉ាស៊ីនរៀនក្នុងផ្ទាំងក្នុង។
|
||||
- ការធ្វើការជាមួយសៀវភៅកំណត់សរសេរ Jupyter។
|
||||
- ការប្រើប្រាស់ Scikit-learn រួមទាំងការដំឡើង។
|
||||
- ស្វែងរកប្រូក្រេសស្យុងខ្សែបន្ទាត់ជាមួយហាត់ប្រាណអនុវត្តន៍ដោយដៃ។
|
||||
|
||||
## ការដំឡើង និង ការកំណត់រចនា
|
||||
|
||||
[](https://youtu.be/-DfeD2k2Kj0 "ម៉ាស៊ីនរៀនសម្រាប់អ្នកចាប់ផ្ដើម - រៀបចំឧបករណ៍របស់អ្នករួចរាល់សម្រាប់បង្កើតគំរូម៉ាស៊ីនរៀន")
|
||||
|
||||
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូខ្លីដែលបង្កើតការកំណត់កុំព្យូទ័ររបស់អ្នកសម្រាប់ ML។
|
||||
|
||||
1. **ដំឡើង Python**។ ប្រាកដថា [Python](https://www.python.org/downloads/) ត្រូវបានដំឡើងលើកុំព្យូទ័ររបស់អ្នក។ អ្នកនឹងប្រើ Python សម្រាប់កិច្ចការវិទ្យាសាស្ត្រទិន្នន័យ និងម៉ាស៊ីនរៀនច្រើន។ ប្រព័ន្ធកុំព្យូទ័រច្រើនរួមបញ្ចូលការដំឡើង Python រួចហើយ។ មាន [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) ដែលមានប្រយោជន៍សម្រាប់កែលម្អការតំឡើងសម្រាប់អ្នកប្រើប្រាស់មួយចំនួន។
|
||||
|
||||
ករណីខ្លះនៃការប្រើប្រាស់ Python ត្រូវការតែមួយកំណែរបស់កម្មវិធី ខណៈពេលដែលមួយចំនួនផ្សេងទៀតត្រូវការកំណែផ្សេងទៀត។ ដូច្នេះ វាមានប្រយោជន៍ក្នុងការដំណើរការនៅក្នុង [បរិយាកាស virtual](https://docs.python.org/3/library/venv.html)។
|
||||
|
||||
2. **ដំឡើង Visual Studio Code**។ សូមប្រាកដថាអ្នកមាន Visual Studio Code បានដំឡើងលើកុំព្យូទ័ររបស់អ្នក។ តាមដានការណែនាំនេះដើម្បី [ដំឡើង Visual Studio Code](https://code.visualstudio.com/) សម្រាប់ការដំឡើងមូលដ្ឋាន។ អ្នកនឹងប្រើ Python ក្នុង Visual Studio Code ក្នុងមុខវិជ្ជានេះ ដូច្នេះ អ្នកអាចចង់រៀនបន្ថែមពីរបៀប [កំណត់ Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) សម្រាប់ការអភិវឌ្ឍ Python។
|
||||
|
||||
> ទទួលបានភាពស្រាលចិត្តជាមួយ Python ដោយធ្វើតាមបណ្ដុំ [Learn modules](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott)
|
||||
>
|
||||
> [](https://youtu.be/yyQM70vi7V8 "រៀបចំ Python ជាមួយ Visual Studio Code")
|
||||
>
|
||||
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូ៖ ការប្រើ Python នៅក្នុង VS Code។
|
||||
|
||||
3. **ដំឡើង Scikit-learn** ដោយអនុវត្តតាម [ការណែនាំនេះ](https://scikit-learn.org/stable/install.html)។ ពីព្រោះអ្នកចាំបាច់ត្រូវប្រើ Python 3 អ្នកត្រូវបានផ្តល់អនុស្សាវរីយ៍ឲ្យប្រើបរិយាកាស virtual។ សូមចំណាំ ប្រសិនបើអ្នកកំពុងដំឡើងបណ្ណាល័យនេះលើម៉ាស៊ីន M1 Mac មានការណែនាំពិសេសនៅលើទំព័រដែលភ្ជាប់ខាងលើ។
|
||||
|
||||
1. **ដំឡើង Jupyter Notebook**។ អ្នកត្រូវការដំឡើង [កញ្ចប់ Jupyter](https://pypi.org/project/jupyter/)។
|
||||
|
||||
## បរិយាកាសការសរសេរ ML របស់អ្នក
|
||||
|
||||
អ្នកនឹងប្រើ **សៀវភៅកំណត់** ដើម្បីអភិវឌ្ឍកូដ Python របស់អ្នក និងបង្កើតគំរូម៉ាស៊ីនរៀន។ ប្រភេទឯកសារនេះគឺជាឧបករណ៍ធម្មតាសម្រាប់អ្នកវិទ្យាសាស្ត្រទិន្នន័យ ហើយវាត្រូវបានកំណត់ដោយបញ្ចំលើ ឬផ្នែកបន្ថែម `.ipynb` ។
|
||||
|
||||
សៀវភៅកំណត់គឺជាបរិយាកាសអន្តរកម្មដែលអនុញ្ញាតឲ្យអ្នកអភិវឌ្ឍទាំងការសរសេរកូដ និងបន្ថែមកំណត់ចំណាំនិងសរសេរឯកសារជារង្វង់ខាងកូដ ដែលអាចមានប្រយោជន៍ចំពោះគម្រោងអត្រាឬស្រាវជ្រាវ។
|
||||
|
||||
[](https://youtu.be/7E-jC8FLA2E "ម៉ាស៊ីនរៀនសម្រាប់អ្នកចាប់ផ្ដើម - រៀបចំ Jupyter Notebooks ដើម្បីចាប់ផ្ដើមបង្កើតគំរូប្រូក្រេសស្យុង")
|
||||
|
||||
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូខ្លីដែលបង្កើតហាត់ប្រាណនេះ។
|
||||
|
||||
### ហាត់ប្រាណ - ធ្វើការជាមួយសៀវភៅកំណត់មួយ
|
||||
|
||||
នៅក្នុងថតនេះ អ្នកនឹងរកឃើញឯកសារ _notebook.ipynb_។
|
||||
|
||||
1. បើក _notebook.ipynb_ នៅក្នុង Visual Studio Code។
|
||||
|
||||
ម៉ាស៊ីនបម្រើ Jupyter នឹងចាប់ផ្តើមជាមួយ Python 3+ បានចាប់ផ្តើម។ អ្នកនឹងរកឃើញតំបន់ឯកសារដែលអាច `run` បាន ដែលជាផ្នែកកូដ។ អ្នកអាចរត់កូដនេះដោយជ្រើសរើសរូបតំណាងបង្ហាញដូចប៊ូតុងចាក់ផ្ដើម។
|
||||
|
||||
1. ជ្រើសរើសរូបតំណាង `md` ហើយបន្ថែម markdown តិចមួយ និងអត្ថបទខាងក្រោម **# Welcome to your notebook**។
|
||||
|
||||
បន្ទាប់មក បន្ថែមកូដ Python មួយចំនួន។
|
||||
|
||||
1. វាយ **print('hello notebook')** នៅក្នុងខ្លែងកូដ។
|
||||
1. ជ្រើសរើសអរម្មណ៍ដើម្បីរត់កូដ។
|
||||
|
||||
អ្នកគួរតែឃើញប្រលោមបោះពុម្ព៖
|
||||
|
||||
```output
|
||||
hello notebook
|
||||
```
|
||||
|
||||

|
||||
|
||||
អ្នកអាចបញ្ចូលកូដរបស់អ្នកជាមួយមតិយោបល់ ដើម្បីចុះផ្សាយឯកសារសៀវភៅកំណត់។
|
||||
|
||||
✅ គិតមួយភ្លែតពីបរិយាកាសការងាររបស់អ្នកអភិវឌ្ឍគេហទំព័រនិងអ្នកវិទ្យាសាស្ត្រទិន្នន័យមានភាពខុសគ្នា ឬដូចគ្នានៅខាងណា។
|
||||
|
||||
## ចាប់ផ្ដើម និង រត់ជាមួយ Scikit-learn
|
||||
|
||||
ឥឡូវនេះ Python ត្រូវបានកំណត់នៅក្នុងបរិយាកាសក្នុងផ្ទាល់របស់អ្នកហើយ អ្នកក៏ស្រួលជាមួយ Jupyter notebooks សូមយើងស្រួលបង្រៀនអ្នកពី Scikit-learn ដដែល (សូមអានប្រាក់សំដៅការនិយាយ `sci` ដូចជា `science`)។ Scikit-learn ផ្តល់នូវ [API ឆ្លាតវៃ](https://scikit-learn.org/stable/modules/classes.html#api-ref) ដើម្បីជួយអ្នកធ្វើកិច្ចការ ML។
|
||||
|
||||
យោងទៅតាម [បណ្តាញរបស់ពួកគេ](https://scikit-learn.org/stable/getting_started.html) "Scikit-learn គឺជាបណ្ណាល័យម៉ាស៊ីនរៀនប្រភពបើកដែលគាំទ្រការរៀនតាមមគ្គុទេសក៍ និងមិនមានមគ្គុទេសក៍។ វាក៏ផ្តល់ឧបករណ៍ជាច្រើនសម្រាប់ការចងក្រងគំរូ ការរៀបចំទិន្នន័យ ជ្រើសរើសគំរូ និងការវាយតម្លៃ និងបណ្ណាល័យជំនួយផ្សេងទៀត។"
|
||||
|
||||
នៅក្នុងមុខវិជ្ជានេះ អ្នកនឹងប្រើ Scikit-learn និងឧបករណ៍ផ្សេងទៀតដើម្បីបង្កើតគំរូម៉ាស៊ីនរៀនក្នុងការអនុវត្តកិច្ចការម៉ាស៊ីនរៀនបែបប្រពៃណី។ យើងបានជៀសវាងបណ្តាញសរសៃប្រសាទ និងការរៀនជ្រៅដោយសារវាទទួលបានជម្រៅនៅក្នុងមេរៀនដ៏ខាងមុខនៅកម្មវិធីសិក្សា 'AI សម្រាប់អ្នកចាប់ផ្ដើម'។
|
||||
|
||||
Scikit-learn ធ្វើឲ្យការបង្កើតគំរូ និងវាយតម្លៃសម្រាប់ការប្រើប្រាស់កាន់តែរងាយស្រួល។ វាត្រូវបានផ្តោតសំខាន់លើការប្រើប្រាស់ទិន្នន័យលេខ និងមានសំណុំទិន្នន័យរួចជាស្រេចជាច្រើនសម្រាប់ការរៀន។ វាក៏មានគំរូស្រេចសម្រាប់សិស្សសាកល្បងផងដែរ។ យើងស្វែងរកដំណើរការចម្លងទិន្នន័យរួចហើយនិងប្រើប្រាស់កំណត់តម្លៃដែលស្ថិតក្នុងវាលដំបូងរបស់ក្រុមហ៊ុន Scikit-learn ជាគំរូ ML ដំបូងសម្រាប់ទិន្នន័យមូលដ្ឋាន។
|
||||
|
||||
## ហាត់ប្រាណ - សៀវភៅកំណត់ Scikit-learn ដំបូងរបស់អ្នក
|
||||
|
||||
> មេរៀននេះមានប្រភពពី [ឧទាហរណ៍ប្រូក្រេសស្យុងខ្សែបន្ទាត់](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) នៅលើគេហទំព័រ Scikit-learn។
|
||||
|
||||
[](https://youtu.be/2xkXL5EUpS0 "ម៉ាស៊ីនរៀនសម្រាប់អ្នកចាប់ផ្ដើម - គំរោងប្រូក្រេសស្យុងខ្សែបន្ទាត់ដំបូងរបស់អ្នកនៅក្នុង Python")
|
||||
|
||||
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូខ្លីដែលបង្កើតហាត់ប្រាណនេះ។
|
||||
|
||||
នៅក្នុងឯកសារ _notebook.ipynb_ ដែលភ្ជាប់ជាមួយមេរៀននេះ សូមសម្អាតគ្រប់កោសិកាដោយចុចរូបតំណាង 'ប្រអប់សម្អាត'។
|
||||
|
||||
នៅក្នុងផ្នែកនេះ អ្នកនឹងធ្វើការជាមួយសំណុំទិន្នន័យតូចមួយអំពីជំងឺទឹកនោមផ្អាស់ ដែលបានបង្កើតចូលក្នុង Scikit-learn សម្រាប់គោលបំណងរៀន។ សូមចូរព្រមានថាអ្នកចង់សាកល្បងការព្យាបាលសម្រាប់អ្នកជំងឺទឹកនោមផ្អាស់។ គំរូម៉ាស៊ីនរៀនអាចជួយអ្នកកំណត់ថា តើអ្នកជំងឺណាម្នាក់អាចឆ្លើយតបកាន់តែល្អទៅនឹងការព្យាបាល ដែលមានមូលដ្ឋានលើការរួមបញ្ចូលអថេរជាច្រើន។ គំរូប្រូក្រេសស្យុងមូលដ្ឋានមួយ ទោះបីជាបរិយាកាសប្រើបានវិស្វកម្ម ក៏វានឹងបង្ហាញព័ត៌មានអំពីអថេរដែលអាចជួយអ្នករៀបចំការសាកល្បងគ្លីនិកទ្រឹស្តី។
|
||||
|
||||
✅ មានវិធីសាស្ត្រប្រូក្រេសស្យុងជាច្រើនប្រភេទ ហើយវាលែងឲ្យអ្នកជ្រើសរើសផ្អែកលើចម្លើយដែលអ្នកកំពុងស្វែងរក។ ប្រសិនបើអ្នកចង់ព្យាករណ៍កម្ពស់អាចមានសម្រាប់មនុស្សម្នាក់នៅវ័យណាមួយ អ្នកនឹងប្រើប្រូក្រេសស្យុងខ្សែបន្ទាត់ ដោយសារអ្នកកំពុងស្វែងរកតម្លៃ **លេខ**។ ប្រសិនបើអ្នកចង់រកឃើញថាប្រភេទម្ហូបមួយគួរត្រូវបានចាត់ទុកថាជារូបមន្តសត្វឬទេ អ្នកកំពុងស្វែងរក **ការចាត់ថ្នាក់** ដូច្នេះអ្នកនឹងប្រើប្រូក្រេសស្យុងលូស្តិច។ អ្នកនឹងរៀនបន្ថែមអំពីប្រូក្រេសស្យុងលូស្តិចនៅពេលក្រោយ។ សូមគិតបន្តិចអំពីសំណួរខ្លះៗដែលអ្នកអាចសួរចំពោះទិន្នន័យ ហើយវិធីសាស្ត្រណាមួយដែលសមសម្រាប់សំណួរទាំងនោះ។
|
||||
|
||||
ចាប់ផ្ដើមធ្វើការនៅលើបេសកកម្មនេះ។
|
||||
|
||||
### នាំចូលបណ្ណាល័យ
|
||||
|
||||
សម្រាប់បេសកកម្មនេះ យើងនឹងនាំចូលបណ្ណាល័យខ្លះៗ៖
|
||||
|
||||
- **matplotlib** ។ វាជា [ឧបករណ៍គូរប្លង់](https://matplotlib.org/) មានប្រយោជន៍ ហើយយើងនឹងប្រើវាដើម្បីបង្កើតប្លង់បន្ទាត់មួយ។
|
||||
- **numpy** ។ [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) គឺជាបណ្ណាល័យមានប្រយោជន៍សម្រាប់ដំណើរការទិន្នន័យលេខក្នុង Python។
|
||||
- **sklearn** ។ នេះគឺជាបណ្ណាល័យ [Scikit-learn](https://scikit-learn.org/stable/user_guide.html)។
|
||||
|
||||
នាំចូលបណ្ណាល័យខ្លះៗ ដើម្បីជួយសម្រាប់បេសកកម្មរបស់អ្នក។
|
||||
|
||||
1. បន្ថែមការនាំចូល ដោយវាយកូដដូចខាងក្រោម៖
|
||||
|
||||
```python
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
from sklearn import datasets, linear_model, model_selection
|
||||
```
|
||||
|
||||
ខាងលើ អ្នកកំពុងនាំចូល `matplotlib`, `numpy` ហើយអ្នកកំពុងនាំចូល `datasets`, `linear_model` និង `model_selection` ពី `sklearn`។ `model_selection` ត្រូវបានប្រើសម្រាប់បំបែកទិន្នន័យជា សំណុំសាកល្បង និងសំណុំបណ្តុះបណ្តាល។
|
||||
|
||||
### សំណុំទិន្នន័យជំងឺទឹកនោមផ្អាស់
|
||||
|
||||
សំណុំទិន្នន័យ built-in [ជំងឺទឹកនោមផ្អាស់](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) មាននូវគំរូទិន្នន័យ 442 ដែលជុំវិញជំងឺទឹកនោមផ្អាស់ មានអថេរមុខងារ 10 ប្រភេទខ្លះៗរួមមាន៖
|
||||
|
||||
- អាយុកាល៖ អាយុជាឆ្នាំ
|
||||
- bmi៖ ម៉ាស៊ីនម៉ាស្សារបស់ខ្លួន
|
||||
- bp៖ សំពាធឈាមមធ្យម
|
||||
- s1 tc៖ T-Cells (ប្រភេទស៊ែលសព្វពណ៌ស)
|
||||
|
||||
✅ សំណុំទិន្នន័យនេះមាន មុំនឹកនឹង "ភេទ" ជាអថេរមុខងារដែលមានសារៈសំខាន់សម្រាប់ការស្រាវជ្រាវជុំវិញជំងឺទឹកនោមផ្អាស់។ សំណុំទិន្នន័យវេជ្ជសាស្ត្រច្រើនមានការវាយតម្លៃកំណត់ប្រភេទពីរបែបនេះ។ សូមគិតបន្តិចអំពីតើការចាត់ថ្នាក់បែបនេះអាចដកចេញអ្នកជំនួសនៃមនុស្សជាតិពីការព្យាបាល។
|
||||
|
||||
ឥឡូវនេះ សូមបញ្ចូលទិន្នន័យ X និង y។
|
||||
|
||||
> 🎓 ចងចាំថា នេះគឺជាការរៀនដោយអនុក្រឹត្យ ហើយយើងត្រូវការទោកដាក់ឈ្មោះ 'y' ជាគោលដៅ។
|
||||
|
||||
នៅក្នុងកោសិកាកូដថ្មី សូមបញ្ចូលសំណុំទិន្នន័យជំងឺទឹកនោមផ្អាស់ ដោយហៅ `load_diabetes()`។ បារាជ័យ `return_X_y=True` សំដៅថា `X` នឹងជាតារាងទិន្នន័យ ហើយ `y` នឹងជាគោលដៅប្រូក្រេសស្យុង។
|
||||
|
||||
1. បន្ថែមពាក្យបោះពុម្ព ដើម្បីបង្ហាញទម្រង់ទិន្នន័យ និងធាតុដំបូង៖
|
||||
|
||||
```python
|
||||
X, y = datasets.load_diabetes(return_X_y=True)
|
||||
print(X.shape)
|
||||
print(X[0])
|
||||
```
|
||||
|
||||
អ្វីដែលអ្នកទទួលបានជាចម្លើយ គឺជា tuple។ អ្វីដែលអ្នកបានធ្វើគឺផ្ដល់តម្លៃពីរដំបូងនៅក្នុង tuple ទៅ `X` និង `y` តាមលំដាប់។ ហ្វឹកហាត់បន្ថែមអំពី [tuples](https://wikipedia.org/wiki/Tuple)។
|
||||
|
||||
អ្នកអាចមើលឃើញទិន្នន័យនេះមានធាតុ 442 ដែលរៀបជារាង arrays 10 ធាតុ៖
|
||||
|
||||
```text
|
||||
(442, 10)
|
||||
[ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
|
||||
-0.04340085 -0.00259226 0.01990842 -0.01764613]
|
||||
```
|
||||
|
||||
✅ សូមគិតបន្តិចអំពីទំនាក់ទំនងរវាងទិន្នន័យ និងគោលដៅប្រូក្រេសស្យុង។ ប្រូក្រេសស្យុងខ្សែបន្ទាត់នាំមុខទស្សនៈទំនាក់ទំនងរវាងមុខងារ X និងអថេរកោល y។ តើអ្នកអាចរកឃើញ [គោលដៅ](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) សម្រាប់សំណុំទិន្នន័យជំងឺទឹកនោមផ្អាស់នៅក្នុងឯកសារណែនាំ? តើសំណុំទិន្នន័យនេះបង្ហាញអ្វី ជាមួយគោលដៅនោះ?
|
||||
|
||||
2. បន្ទាប់មក ជ្រើសរើសផ្នែកមួយនៃសំណុំទិន្នន័យនេះសម្រាប់គូរប្លង់ ដោយជ្រើសជួរឈរ 3 នៃសំណុំទិន្នន័យ។ អ្នកអាចធ្វើបានដោយប្រើ `:` ដើម្បីជ្រើសរាល់ជួរ ហើយបន្ទាប់មកជ្រើសជួរឈរ 3 ដោយប្រើ index (2)។ អ្នកអាចប្តូរទម្រង់ទិន្នន័យឱ្យថ្លៃជារាង 2D ដូចដែលត្រូវការសម្រាប់គូរប្លង់ ដោយប្រើ `reshape(n_rows, n_columns)`។ ប្រសិនបើ parameters មួយគឺ -1 ភាគតំណាងនោះនឹងត្រូវគណនា secara automatique។
|
||||
|
||||
```python
|
||||
X = X[:, 2]
|
||||
X = X.reshape((-1,1))
|
||||
```
|
||||
|
||||
✅ នៅពេលណាមួយ សូមបោះពុម្ពទិន្នន័យ ដើម្បីពិនិត្យទម្រង់វា។
|
||||
|
||||
3. ឥឡូវនេះដែលអ្នកមានទិន្នន័យសម្រាប់គូរប្លង់ អ្នកអាចមើលថាតើម៉ាស៊ីនអាចជួយកំណត់ចំណែកល្អលើចំនួននៅក្នុងសំណុំទិន្នន័យនេះបានទេ។ ដើម្បីធ្វើបានចាំបាច់ត្រូវបំបែកទាំងទិន្នន័យ (X) និងគោលដៅ (y) ទៅជាសំណុំសាកល្បង និងសំណុំបណ្តុះបណ្តាល។ Scikit-learn មានវិធីងាយស្រួលសម្រាប់ធ្វើនោះ អ្នកអាចបំបែកទិន្នន័យសាកល្បងនៅចំណុចណាមួយ។
|
||||
|
||||
```python
|
||||
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
|
||||
```
|
||||
|
||||
4. ឥឡូវនេះ អ្នកត្រៀមខ្លួនបណ្តុះគំរូរបស់អ្នក! បញ្ចូលម៉ូឌែលប្រូក្រេសស្យុងខ្សែបន្ទាត់ ហើយបណ្តុះវាជាមួយសំណុំបណ្តុះបណ្តាល X និង y ដោយប្រើ `model.fit()`:
|
||||
|
||||
```python
|
||||
model = linear_model.LinearRegression()
|
||||
model.fit(X_train, y_train)
|
||||
```
|
||||
|
||||
✅ `model.fit()` គឺជា function ដែលអ្នកនឹងឃើញនៅក្នុងបណ្ណាល័យ ML ជាច្រើនដូចជា TensorFlow។
|
||||
|
||||
5. បន្ទាប់មក បង្កើតការព្យាករណ៍ដោយប្រើទិន្នន័យសាកល្បង ដោយប្រើ function `predict()`។ នេះនឹងត្រូវប្រើសម្រាប់គូរបន្ទាត់ចល័តនៅចន្លោះក្រុមទិន្នន័យ។
|
||||
|
||||
```python
|
||||
y_pred = model.predict(X_test)
|
||||
```
|
||||
|
||||
6. ឥឡូវនេះពេលដើម្បីបង្ហាញទិន្នន័យជាប្លង់។ Matplotlib គឺជាឧបករណ៍មានប្រយោជន៍ខ្លាំងសម្រាប់បេសកកម្មនេះ។ បង្កើត scatterplot សម្រាប់ទិន្នន័យ X និង y សំណុំសាកល្បងទាំងអស់ ហើយប្រើការព្យាករណ៍ក្នុងការគូរបន្ទាត់ជាកន្លែងសមរម្យបំផុត រវាងក្រុមទិន្នន័យរបស់ម៉ូឌែល។
|
||||
|
||||
```python
|
||||
plt.scatter(X_test, y_test, color='black')
|
||||
plt.plot(X_test, y_pred, color='blue', linewidth=3)
|
||||
plt.xlabel('Scaled BMIs')
|
||||
plt.ylabel('Disease Progression')
|
||||
plt.title('A Graph Plot Showing Diabetes Progression Against BMI')
|
||||
plt.show()
|
||||
```
|
||||
|
||||

|
||||
✅ សូមគិតកន្លែងអ្វីកំពុងកើតឡើងនៅទីនេះ។ ខ្សែត្រង់មួយកំពុងរត់កាត់តាមចំណុចតូចៗជាច្រើននៃទិន្នន័យ ប៉ុន្តែវាកំពុងធ្វើអ្វីពិតប្រាកដមែនទេ? តើអ្នកអាចឃើញយ៉ាងដូចម្តេចថា តើអ្នកគួរតែប្រើខ្សែនេះដើម្បីទាយថាតើចំណុចទិន្នន័យថ្មីមួយដែលមិនធ្លាប់ឃើញអាចផ្គូផ្គងនៅឯណាទៅទាក់ទងនឹងអ័ក្ស y នៃផ្លូតបានយ៉ាងដូចម្តេច? សូមព្យាយាមដាក់ជាពាក្យអំពីការប្រើប្រាស់ជាក់ស្តែងនៃម៉ូដែលនេះ។
|
||||
|
||||
អបអរសាទរ អ្នកបានបង្កើតម៉ូដែលការស្ងាត់ត្រង់លីនុយ (linear regression) ជាលើកដំបូងរបស់អ្នក សរសេរផ្នែកទាយទុកជាមួយវា ហើយបង្ហាញវានៅក្នុងផ្លូតមួយហើយ!
|
||||
|
||||
---
|
||||
## 🚀បញ្ហា
|
||||
|
||||
បង្ហាញអថេរផ្សេងទៀតពីឃุ่มទិន្នន័យនេះ។ គំនិតបញ្ជាក់៖ កែសម្រួលបន្ទាត់នេះ `X = X[:,2]`។ ប្រសិនបើឃุ่มទិន្នន័យនេះមានគោលដៅ អ្នកអាចរកឃើញអ្វីខ្លះអំពីការរីកចំរូងនៃជំងឺទាំងនេះដូចជាជំងឺទឹកនោមផ្អែម?
|
||||
## [ស៊ែវសំណួរ បន្ទាប់ពីមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
## ការពិនិត្យឡើងវិញ និងសិក្សាផ្ទាល់ខ្លួន
|
||||
|
||||
នៅក្នុងមេរៀននេះ អ្នកបានចាប់ផ្តើមជាមួយការស្ងាត់ត្រង់លីនុយធម្មតា មិនមែនការស្ងាត់ត្រង់លីនុយមួយអថេរ ឬច្រើនអថេរទេ។ សូមអានអំពីភាពខុសគ្នារវាងវិធីសាស្រ្តទាំងនេះ ឬមើលវីដេអូនេះ [វីដេអូ](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef)។
|
||||
|
||||
អានបន្ថែមអំពីគំនិតស្ងាត់ត្រង់ ហើយសូមគិតពីប្រភេទសំណួរណាអាចត្រូវបានឆ្លើយតបដោយបច្ចេកទេសនេះ។ អ្នកអាចយកមេរៀននេះ [មេរៀន](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?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,20 @@
|
||||
# ការធ្វើជា Regression ជាមួយ Scikit-learn
|
||||
|
||||
## សេចក្ដីណែនាំ
|
||||
|
||||
សូមមើលទៅលើ [Linnerud dataset](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) នៅក្នុង Scikit-learn។ មូលដ្ឋានទិន្នន័យនេះមាន [គោលដៅ](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset) ជាច្រើន៖ 'វាប្រមូលផ្តុំផ្នែកអហ្វិចស្រ្តេស (data) ចំនួនបី និងអថេរ វិស្សមកាលសសៃ (target) ចំនួនបី ដែលបានប្រមូលពីបុរសអាយុកណ្តាលម្ភៃនាក់ នៅក្លឹបហាត់ប្រាណមួយ'។
|
||||
|
||||
ដោយប្រើភាសារបស់អ្នក អ្នកត្រូវពិពណ៌នាថា របៀបទាំងមូលក្នុងការបង្កើតModel Regression មួយ ដែលអាចបង្ហាញការតភ្ជាប់រវាងច្រមុះជើងហើយចំនួន situps ដែលបានបញ្ចប់។ សូមធ្វើដូចគ្នាសម្រាប់ចំណុចទិន្នន័យផ្សេងទៀតនៅក្នុងមូលដ្ឋានទិន្នន័យនេះ។
|
||||
|
||||
## ការវាយតម្លៃ
|
||||
|
||||
| លក្ខខណ្ឌ | ល្អឧត្តម | គ្រប់គ្រាន់ | ត្រូវការកែលម្អ |
|
||||
| ------------------------------ | ----------------------------------- | ----------------------------- | -------------------------- |
|
||||
| សូមដាក់អត្ថបទពិពណ៌នា | បានដាក់អត្ថបទពិពណ៌នាប្រកបដោយលក្ខណៈល្អ | បានដាក់ប្រយោគប៉ុន្មាននោះ | មិនបានផ្តល់ការពិពណ៌នា |
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការព្រមាន**:
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំរកភាពត្រឹមត្រូវ សូមយកចិត្តទុកដាក់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាមើលឃើញគួរត្រូវបានគេចាត់ទុកជាមូលដ្ឋានផ្លូវការនៃព័ត៌មាន។ សម្រាប់ព័ត៌មានសំខាន់ យើងផ្តល់អនុសាសន៍ឱ្យមានការបញ្ចូលការបកប្រែដោយអ្នកជំនាញមនុស្សមួយ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំឬការបកប្រែខុសដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះនោះទេ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,8 @@
|
||||
នេះគឺជាកន្លែងដាក់បណ្តោះអាសន្ន
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកបរសំរាប់ដោយសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ក្នុងនាមជាការខិតខំស្ថិតស្ថេរ សូមយល់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬក៏ភាពមិនត្រឹមត្រូវខ្លះៗ។ ឯកសារដើមនៅក្នុងភាសាដើមគួរត្រូវបានយកចិត្តទុកដាក់ជាទីលំហូរពិតប្រាកដ។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឲ្យប្រើការបកប្រែដោយអ្នកជំនាញមនុស្ស។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ម៉ាញ៉ង់ ឬការបកប្រែខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,219 @@
|
||||
# បង្កើតម៉ូដែលរេហ្គ្រេសស្យុងដោយប្រើ Scikit-learn៖ រៀបចំ និងវិចិត្រស័ក្តិទិន្នន័យ
|
||||
|
||||

|
||||
|
||||
តារាងវិចិត្រស័ក្តិដោយ [Dasani Madipalli](https://twitter.com/dasani_decoded)
|
||||
|
||||
## [តេស្តមុនម៉េរៀន](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
> ### [មេរៀននេះមានក្នុងភាសា R ផងដែរ!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
|
||||
|
||||
## ទីផ្សារណ៍
|
||||
|
||||
ឥឡូវនេះអ្នកបានរៀបចំឧបករណ៍ដែលត្រូវការសម្រាប់ការចាប់ផ្តើមបង្កើតម៉ូដែលម៉ាស៊ីនរៀនជាមួយ Scikit-learn ហើយ អ្នករួចរាល់ក្នុងការចាប់ផ្តើមសួរចម្លើយពីទិន្នន័យរបស់អ្នក។ ពេលអ្នកធ្វើការជាមួយទិន្នន័យ និងអនុវត្តន៍ដោះស្រាយ ML វាសំខាន់ណាស់ក្នុងការយល់ដឹងពីរបៀបសួរចម្លើយត្រឹមត្រូវ ដើម្បីអាចបើកសមត្ថភាពនៃទិន្នន័យរបស់អ្នកបានត្រឹមត្រូវ។
|
||||
|
||||
ក្នុងមេរៀននេះ អ្នកនឹងរៀនពី៖
|
||||
|
||||
- របៀបរៀបចំព័ត៌មានរបស់អ្នកសម្រាប់ការបង្កើតម៉ូដែល។
|
||||
- របៀបប្រើ Matplotlib សម្រាប់វិចិត្រស័ក្តិនិន្នន័យ។
|
||||
|
||||
## សួរចម្លើយត្រឹមត្រូវពីទិន្នន័យរបស់អ្នក
|
||||
|
||||
ចម្លើយដែលអ្នកត្រូវការបាននឹងកំណត់ប្រភេទអាល់ហ្គូរីធម៍ ML ដែលអ្នកនឹងប្រើ។ ហើយគុណភាពនៃចម្លើយដែលបានត្រឡប់មកវិញ គឺពឹងផ្អែកយ៉ាងខ្លាំងលើធម្មជាតិនៃទិន្នន័យរបស់អ្នក។
|
||||
|
||||
ចូរមើល [ទិន្នន័យ](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) ដែលបានផ្តល់សម្រាប់មេរៀននេះ។ អ្នកអាចបើកឯកសារ .csv នេះនៅក្នុង VS Code។ ការមើលលឿនភ្លាមៗបង្ហាញថាមានចន្លោះទទេ និងការលាយបញ្ចូលរវាងខ្សែអក្សរ និងទិន្នន័យចំនួន។ ក៏មានជួរឈរមួយហៅថា 'Package' ដែលទិន្នន័យក្នុងនោះលាយគ្នារវាង 'sacks', 'bins' និងតម្លៃផ្សេងទៀត។ ទិន្នន័យនេះ ពិតជា មិនស្អាតត្រឹមត្រូវទេ។
|
||||
|
||||
[](https://youtu.be/5qGjczWTrDQ "ML សម្រាប់អ្នកថ្មី - របៀបវិភាគ និងសម្អាតទិន្នន័យ")
|
||||
|
||||
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូខ្លីបង្ហាញពីការរៀបចំទិន្នន័យសម្រាប់មេរៀននេះ។
|
||||
|
||||
ពិតប្រាកដថា មិនប្រាកដល្អទេដែលទទួលបាន dataset ដែលរួចរាល់សម្រាប់ប្រើបង្កើតម៉ូដែល ML បានភ្លាមៗ។ ក្នុងមេរៀននេះ អ្នកនឹងរៀនរបៀបរៀបចំនូវ dataset ដើមដោយប្រើបណ្ណាល័យ Python ស្តង់ដា។ ក៏ដូចជារៀនបច្ចេកទេសខុសៗគ្នាសម្រាប់វិចិត្រស័ក្តិនៃទិន្នន័យផងដែរ។
|
||||
|
||||
## ករណីសិក្សា៖ 'ទីផ្សារមុខបឺ'
|
||||
|
||||
ក្នុងថតនេះ អ្នកនឹងរកឃើញឯកសារ .csv មួយនៅក្នុងថតឫស `data` ហៅថា [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) ដែលមានជួរដេក ១៧៥៧ នៃទិន្នន័យអំពីទីផ្សារវាយផ្លែគោល ដែលត្រូវបានចែកជាក្រុមតាមក្រុង។ ទិន្នន័យដើមនេះបញ្ចេញពី [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) ដែលចែកចាយដោយក្រសួងកសិកម្មសហរដ្ឋអាមេរិក។
|
||||
|
||||
### រៀបចំទិន្នន័យ
|
||||
|
||||
ទិន្នន័យនេះមានលើសាធារណៈ។ អ្នកអាចទាញយកវាចេញជា ឯកសារច្រើនឯកសារផ្ទាល់ខ្លួនរៀងរាល់ក្រុង ពីគេហទំព័រ USDA។ ដើម្បីជៀសវាងឯកសារច្រើនពេក យើងបានបញ្ចូលទិន្នន័យក្រុងទាំងអស់ចូលក្នុងសៀវភៅ បច្ចុប្បន្ន យើងបាន _រៀបចំ_ ទិន្នន័យរួចមួយចំនួន។ បន្ទាប់មក មកមើលលម្អិតទិន្នន័យ។
|
||||
|
||||
### ទិន្នន័យវាយផ្លែគោល - សេចក្ដីសន្និដ្ឋានដំបូង
|
||||
|
||||
តើអ្នកមើលឃើញអ្វីពីទិន្នន័យនេះ? អ្នកបានឃើញថាមានការលាយបញ្ចូលរវាងខ្សែអក្សរ លេខ ចន្លោះទទេ និងតម្លៃចម្លែក ដែលអ្នកត្រូវយល់។
|
||||
|
||||
តើអ្នកអាចសួរចម្លើយអំពីទិន្នន័យនេះជាមួយបច្ចេកទេស Regression យ៉ាងដូចម្ដេច? តើអ្វីមួយដូចជា "ទស្សនាថ្លៃបាយផ្លែគោលលក់នៅខែណាមួយ"? មើលទិន្នន័យម្ដងទៀត មានកែប្រែខ្លះដែលត្រូវធ្វើដើម្បីបង្កើតរចនាសម្ព័ន្ធទិន្នន័យដែលត្រូវការសម្រាប់ភារកិច្ចនេះ។
|
||||
|
||||
## លំហាត់ - វិភាគទិន្នន័យវាយផ្លែគោល
|
||||
|
||||
ចាប់ផ្តើមប្រើ [Pandas](https://pandas.pydata.org/) (ឈ្មោះមានន័យថា `Python Data Analysis`) ដែលជាឧបករណ៍មានប្រយោជន៍សម្រាប់រៀបចំទិន្នន័យ ដើម្បីវិភាគ និងរៀបចំទិន្នន័យវាយផ្លែគោលនេះ។
|
||||
|
||||
### ជំហានទីមួយ - ត្រួតពិនិត្យថ្ងៃខែខ្វះ
|
||||
|
||||
អ្នកត្រូវខំធ្វើជំហានដើម្បីត្រួតពិនិត្យមើល ថ្ងៃខែខ្វះ៖
|
||||
|
||||
1. បំលែងថ្ងៃខែទៅទ្រង់ទ្រាយខែ (វាជាថ្ងៃខែឆ្នាំរបស់ ស.រ.អ., ដូច្នេះទ្រង់ទ្រាយគឺ `MM/DD/YYYY`)។
|
||||
2. ដកខែចេញជាជួរឈរថ្មី។
|
||||
|
||||
បើកឯកសារ _notebook.ipynb_ ក្នុង Visual Studio Code ហើយនាំចូលសៀវភៅផ្ទាំងទៅក្នុង dataframe ថ្មីរបស់ Pandas។
|
||||
|
||||
1. ប្រើមុខងារ `head()` ដើម្បីមើលជួរដេកប្រាំដំបូង។
|
||||
|
||||
```python
|
||||
import pandas as pd
|
||||
pumpkins = pd.read_csv('../data/US-pumpkins.csv')
|
||||
pumpkins.head()
|
||||
```
|
||||
|
||||
✅ តើមុខងារមួយដែលអ្នកនឹងប្រើសម្រាប់មើលជួរដេកចុងបំផុតប្រាំចុងក្រោយ?
|
||||
|
||||
1. ត្រួតពិនិត្យមើលថាតើមានទិន្នន័យខ្វះក្នុង dataframe បច្ចុប្បន្នទេ៖
|
||||
|
||||
```python
|
||||
pumpkins.isnull().sum()
|
||||
```
|
||||
|
||||
មានទិន្នន័យខ្វះ ប៉ុន្តែប្រហែលជាមិនមានផលប៉ះពាល់ចំពោះភារកិច្ចនេះទេ។
|
||||
|
||||
1. ដើម្បីឲ្យ dataframe របស់អ្នកងាយស្រួលក្នុងការងារ ជ្រើសយកតែជួរឈរដែលអ្នកត្រូវការ ជាមួយមុខងារ `loc` ដែលដកចេញពី dataframe ដើមជាក្រុមជួរដេក (ផ្ដល់ជាម៉ាស៊ីនជុំឡើង) និងជួរឈរ (ផ្ដល់ជាម៉ាស៊ីនទីពីរ)។ ប្រើ `:` ក្នុងករណីខាងក្រោមមានន័យថា "ទាំងអស់ជួរដេក"។
|
||||
|
||||
```python
|
||||
columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']
|
||||
pumpkins = pumpkins.loc[:, columns_to_select]
|
||||
```
|
||||
|
||||
### ជំហានទីពីរ - កំណត់ថ្លៃមធ្យមនៃបាយផ្លែគោល
|
||||
|
||||
គិតពីរបៀបកំណត់ថ្លៃមធ្យមនៃបាយផ្លែគោលក្នុងខែណាមួយ។ តើជួរឈរណាដែលអ្នកនឹងជ្រើសសម្រាប់ភារកិច្ចនេះ? គំនិត៖ អ្នកត្រូវការជួរឈរបី។
|
||||
|
||||
ដំណោះស្រាយ៖ គណនាមធ្យមនៃជួរឈរ `Low Price` និង `High Price` ដើម្បីបង្កើតជួរឈរថ្លៃថ្មី ហើយបំលែងជួរឈរ Date ឲ្យបង្ហាញតែខែប៉ុណ្ណោះ។សំណាងល្អ គិតតាមការត្រួតពិនិត្យខាងលើ គ្មានទិន្នន័យខ្វះសម្រាប់ថ្ងៃខែឬថ្លៃទេ។
|
||||
|
||||
1. ដើម្បីគណនាមធ្យម បន្ថែមកូដដូចខាងក្រោម៖
|
||||
|
||||
```python
|
||||
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
|
||||
|
||||
month = pd.DatetimeIndex(pumpkins['Date']).month
|
||||
|
||||
```
|
||||
|
||||
✅ អ្នកអាចបោះពុម្ព `print(month)` ដើម្បីត្រួតពិនិត្យទិន្នន័យណាមួយបាន។
|
||||
|
||||
2. ឥឡូវនេះ ចម្លងទិន្នន័យដែលបានបំលែងទៅក្នុង dataframe ថ្មីរបស់ Pandas៖
|
||||
|
||||
```python
|
||||
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
|
||||
```
|
||||
|
||||
ការបោះពុម្ព dataframe នឹងបង្ហាញ dataset ស្អាតនិងមានរបៀប ដែលអ្នកអាចប្រើបង្កើតម៉ូដែល regression ថ្មីរបស់អ្នក។
|
||||
|
||||
### តែរង់ចាំ! មានអ្វីមួយចម្លែកនៅទីនេះ
|
||||
|
||||
បើអ្នកមើលជួរឈរ `Package` សូមមើលថា វាយផ្លែគោលត្រូវបានលក់ក្នុងការរៀបចំផ្សេងៗគ្នាច្រើន។ មានករណីលក់ជា '1 1/9 bushel', '1/2 bushel', លក់ជា ខ្នាយ ផ្ទាល់, លក់ជា ផោន និងលក់ក្នុងប្រអប់ធំៗដែលមានទទឹងខុសៗគ្នា។
|
||||
|
||||
> បាយផ្លែគោលហាក់ដូចជាពិបាកវាស់ទំងន់ដោយសរុបផ្នែកមួយទេ។
|
||||
|
||||
ស្វែងរកជាងទិន្នន័យដើម គួរឱ្យចាប់អារម្មណ៍ថា ទាំងអស់មាន `Unit of Sale` ស្មើជា 'EACH' ឬ 'PER BIN' ត្រូវបានប្រើ `Package` ប្រភេទ តាមអាំងឆ្វេង មិនដូចគ្នា ឬ 'each'។ បាយផ្លែគោលហាក់ដូចជាពិបាកវាស់ទំងន់ច្បាស់លាស់ ដូចនេះយើងត្រូវតែចម្រោះសម្រាប់បាយផ្លែគោលដែលមានខ្សែអក្សរ 'bushel' ក្នុងជួរឈរ `Package` របស់ពួកវា។
|
||||
|
||||
1. បន្ថែមហ្វីលទ័រមួយនៅផ្នែកលើឯកសារ ខាងក្រោមការនាំចូល .csv ដើម៖
|
||||
|
||||
```python
|
||||
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
|
||||
```
|
||||
|
||||
បើអ្នកបោះពុម្ពទិន្នន័យឥឡូវនេះ អ្នកនឹងឃើញថា តែជួរដេកប្រហែល ៤១៥ ដែលមានបាយផ្លែគោលតាម bushel ត្រូវបានយកតែប៉ុណ្ណោះ។
|
||||
|
||||
### តែរង់ចាំ! មានទៀតអ្វីមួយត្រូវធ្វើបន្ថែម
|
||||
|
||||
តើអ្នកមើលឃើញថា បរិមាណ bushel ផ្លាស់ប្ដូរតាមជួរដេកមែនទេ? អ្នកត្រូវធ្វើការទម្រង់តម្លៃតាម bushel សម្រាប់បង្ហាញតម្លៃតាម bushel ដូច្នេះត្រូវធ្វើគណិតវិទ្យាដើម្បីធ្វើឲ្យវាមានភាពស្តង់ដារ។
|
||||
|
||||
1. បន្ថែមជួរដេកខាងក្រោមប្លុកបង្កើត dataframe new_pumpkins៖
|
||||
|
||||
```python
|
||||
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
|
||||
|
||||
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
|
||||
```
|
||||
|
||||
✅ ដោយយោងទៅតាម [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), ទំងន់នៃ bushel អាស្រ័យលើប្រភេទផលិតផល ដូចជា វាជាបរិមាណមួយ។ "Bushel ត្រសក់ គឺត្រូវមានទំងន់ ៥៦ ផោន... ដល់ស្លឹកបៃតង មានទំហំធំជាង និងទំងន់តិចជាង bushel ត្រសក់ spinach គឺមានតែ ២០ ផោន"។ វាមិនងាយស្រួលទេ! យើងមិនបានបំលែង bushel ទៅផោនឡើយ តែប្រើតម្លៃតាម bushel។ ការសិក្សានេះពោរពេញដោយសារៈសំខាន់ក្នុងការយល់ដឹងធម្មជាតិនៃទិន្នន័យរបស់អ្នក!
|
||||
|
||||
ឥឡូវនេះ អ្នកអាចវិភាគតម្លៃរាប់តាមឯកតាជាផ្អែកលើការវាស់ bushel របស់ពួកវា។ ប្រសិនបើអ្នកបោះពុម្ពទិន្នន័យនេះម្តងទៀត អ្នកនឹងឃើញភាពស្តង់ដារ។
|
||||
|
||||
✅ តើអ្នកមើលឃើញទេថា ផ្លែគោលដែលលក់ដោយ bushel ផ្នែកកន្លះមានតម្លៃថ្លៃជាង? តើអ្នកអាចសន្និដ្ឋានពីមូលហេតុបានទេ? គំនិត៖ បាយផ្លែគោលតូចៗ មានតំលៃថ្លៃជាងបាយធំៗ ព្រោះមានច្រើនជាងនៅក្នុង bushel មួយ ដោយផ្អែកលើកន្លែងទំនេរដែលមានរវាងវាយដ៏ធំនិងផ្លែគោល។
|
||||
|
||||
## វិធីសាស្រ្តវិចិត្រស័ក្តិ
|
||||
|
||||
ផ្នែកមួយនៃភារកិច្ចរបស់វិទ្យាសាស្ដ្រ ទិន្នន័យគឺការបង្ហាញពីគុណភាព និងធម្មជាតិនៃទិន្នន័យដែលពួកគេទទួលបាន។ ដើម្បីធ្វើបែបនេះ មិនហ៊ានតែបង្កើតវិចិត្រស័ក្តិស្អាតៗជានិច្ច ឬ អត្រា គន្លង និងក្រាផបាន សម្រាប់បង្ហាញប្រភេទផ្សេងៗនៃទិន្នន័យ។ តាមរយៈនេះ ពួកគេអាចបង្ហាញទំនាក់ទំនង និងកន្លែងខ្វះខាតដែលពិបាកសំរេចដោយការមើលតាមផ្ទាល់។
|
||||
|
||||
[](https://youtu.be/SbUkxH6IJo0 "ML សម្រាប់អ្នកថ្មី - របៀបវិចិត្រស័ក្តិនិន្នន័យជាមួយ Matplotlib")
|
||||
|
||||
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូខ្លីបង្ហាញពីការវិចិត្រស័ក្តិនិន្នន័យសម្រាប់មេរៀននេះ។
|
||||
|
||||
វិចិត្រស័ក្តិអាចជួយកំណត់បច្ចេកទេសម៉ាស៊ីនរៀនដែលសមស្របបំផុតសម្រាប់ទិន្នន័យបាន។ គំនូស scatterplot ដែលហាក់ដូចតាមបន្ទាត់ បានបង្ហាញថាទិន្នន័យល្អសម្រាប់ការប្រើ regression របៀបលីនេអ៊ែរ។
|
||||
|
||||
បណ្ណាល័យវិចិត្រស័ក្តិទិន្នន័យមួយដែលដំណើរការល្អក្នុង Jupyter notebooks គឺ [Matplotlib](https://matplotlib.org/) (ដែលអ្នកបានឃើញមុននេះក្នុងមេរៀនមុន)។
|
||||
|
||||
> ទទួលបានបទពិសោធន៍បន្ថែមជាមួយវិចិត្រស័ក្តិនិន្នន័យក្នុង [មេរៀនទាំងនេះ](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott)។
|
||||
|
||||
## លំហាត់ - សាកល្បងជាមួយ Matplotlib
|
||||
|
||||
សាកល្បងបង្កើតគំនូសបន្ទាត់មូលដ្ឋានដើម្បីបង្ហាញ dataframe ថ្មីដែលអ្នកបានបង្កើត។ តើគំនូសបន្ទាត់មូលដ្ឋាននឹងបង្ហាញអ្វី?
|
||||
|
||||
1. នាំចូល Matplotlib នៅផ្នែកលើឯកសារ ក្រោមការនាំចូល Pandas៖
|
||||
|
||||
```python
|
||||
import matplotlib.pyplot as plt
|
||||
```
|
||||
|
||||
1. ដំណើរការសៀវភៅគ្រាន់ចប់ម្តងទៀតសម្រាប់បន្ទាន់សម័យ។
|
||||
1. នៅខាងក្រោមនៃសៀវភៅបន្ថែមកោសិកាដើម្បីគូសទិន្នន័យជាប្រអប់៖
|
||||
|
||||
```python
|
||||
price = new_pumpkins.Price
|
||||
month = new_pumpkins.Month
|
||||
plt.scatter(price, month)
|
||||
plt.show()
|
||||
```
|
||||
|
||||

|
||||
|
||||
តើនេះជាគំនូសមានប្រយោជន៍ទេ? តើមានអ្វីណាមួយដែលធ្វើឲ្យអ្នកភ្ញាក់ផ្អើលទេ?
|
||||
|
||||
វាមិនមានប្រយោជន៍ពិសេសណាស់ទេ ពីព្រោះវាគ្រាន់តែបង្ហាញទិន្នន័យរបស់អ្នកជាចំនុចច散នៅក្នុងខែណាមួយ។
|
||||
|
||||
### ធ្វើឲ្យវាមានប្រយោជន៍
|
||||
|
||||
ដើម្បីទទួលបានតារាងបង្ហាញទិន្នន័យដែលមានប្រយោជន៍ អ្នកត្រូវតែផ្ដុំទិន្នន័យមួយរបៀបណាមួយ។ យើងសាកល្បងបង្កើតគំនូសដែលភាគល្អិត y បង្ហាញខែ និងទិន្នន័យបង្ហាញការបែងចែកទិន្នន័យ។
|
||||
|
||||
1. បន្ថែមកោសិកាមួយសម្រាប់បង្កើតតារាងជាតារាងប៊ា៖
|
||||
|
||||
```python
|
||||
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
|
||||
plt.ylabel("Pumpkin Price")
|
||||
```
|
||||
|
||||

|
||||
|
||||
នេះជាវិចិត្រស័ក្តិទិន្នន័យមានប្រយោជន៍ជាងមុនទេ! វាហាក់ដូចបង្ហាញថាតម្លៃខ្ពស់បំផុតសម្រាប់បាយផ្លែគោលមាននៅខែកញ្ញា និងតុលា។ តើវาตรงតាមការរំពឹងទុករបស់អ្នកទេ? ហេតុអ្វី?
|
||||
|
||||
---
|
||||
|
||||
## 🚀 ការប្រកួតប្រជែង
|
||||
|
||||
ស្វែងយល់អំពីប្រភេទវិចិត្រស័ក្តិផ្សេងៗដែល Matplotlib ផ្តល់ជូន។ ប្រភេទណាដែលសមរម្យបំផុតសម្រាប់បញ្ហារេហ្គ្រេសស្យុង?
|
||||
|
||||
## [តេស្តបន្ទាប់ម៉េរៀន](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
## សង្ខេប និងការសិក្សាឯកឯង
|
||||
|
||||
សូមមើលវិធីជាច្រើនក្នុងការវិចិត្រស័ក្តិនិន្នន័យ។ បង្កើតបញ្ជីបណ្ណាល័យផ្សេងៗ និងសម្គាល់ថាបណ្ណាល័យណាដែលល្អបំផុតសម្រាប់ភារកិច្ចបច្ចេកទេសផ្សេងៗ ដូចជាវិចិត្រស័ក្តិ 2D និង 3D។ តើអ្នកបានរកឃើញអ្វីខ្លះ?
|
||||
|
||||
## កាតព្វកិច្ច
|
||||
|
||||
[ការស្វែងរកវិចិត្រស័ក្តិ](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,16 @@
|
||||
# ការត្រៀមតាមរយៈការមើលឃើញ
|
||||
|
||||
មានបណ្ណាល័យផ្សេងៗជាច្រើនដែលអាចប្រើសម្រាប់ការមើលឃើញទិន្នន័យ។ បង្កើតការមើលឃើញខ្លះៗដោយប្រើទិន្នន័យ Pumpkin ក្នុងមេរៀននេះជាមួយ matplotlib និង seaborn ក្នុងសៀវភៅសម្រង់មួយ។ តើបណ្ណាល័យណាមានភាពងាយស្រួលក្នុងការធ្វើការជាង?
|
||||
|
||||
## ក្រមសណ្ឋាន
|
||||
|
||||
| ការវាយតម្លៃ | ល្អបំផុត | មធ្យម | ត្រូវការការកែលម្អ |
|
||||
| -------- | --------- | -------- | ----------------- |
|
||||
| | សៀវភៅសម្រង់ត្រូវបានដាក់ស្នើជាមួយនូវការត្រៀម/ការមើលឃើញពីរមុខ | សៀវភៅសម្រង់ត្រូវបានដាក់ស្នើជាមួយនូវការត្រៀម/ការមើលឃើញមួយមុខ | សៀវភៅសម្រង់មិនត្រូវបានដាក់ស្នើ |
|
||||
|
||||
---
|
||||
|
||||
<!-- 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 @@
|
||||
{
|
||||
"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-final"
|
||||
},
|
||||
"orig_nbformat": 2,
|
||||
"kernelspec": {
|
||||
"name": "python3",
|
||||
"display_name": "Python 3",
|
||||
"language": "python"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2,
|
||||
"cells": [
|
||||
{
|
||||
"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,8 @@
|
||||
នេះគឺជាទីតាំងបង្ហើបបណ្តោះអាសន្ន
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ក្នុងខណៈពេលយើងព្យាយាមធានាការត្រឹមត្រូវ សូមយល់ឲ្យបានថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាមូលដ្ឋានគួរត្រូវបានពិចារណាជាទ្រព្យសម្បត្ដិផ្លូវការជាលេខកូដ។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមផ្តល់អាហារូបករណ៍ជាមនុស្សវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,666 @@
|
||||
{
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2,
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"name": "lesson_2-R.ipynb",
|
||||
"provenance": [],
|
||||
"collapsed_sections": [],
|
||||
"toc_visible": true
|
||||
},
|
||||
"kernelspec": {
|
||||
"name": "ir",
|
||||
"display_name": "R"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "R"
|
||||
}
|
||||
},
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"# បង្កើតម៉ូដែលវិញ្ញាសារជាក់លាក់: រៀបចំនិងមើលទិន្នន័យ\n",
|
||||
"\n",
|
||||
"## **វិញ្ញាសារជាក់លាក់សម្រាប់ផំពកិន - មេរៀនទី 2**\n",
|
||||
"#### គ្រប introductio\n",
|
||||
"\n",
|
||||
"ឥឡូវនេះដែលអ្នកបានត្រៀមខ្លួនជាមួយឧបករណ៍ដែលអ្នកត្រូវការដើម្បីចាប់ផ្តើមដោះស្រាយការបង្កើតម៉ូដែលសិក្សាមាស៊ីនជាមួយ Tidymodels និង Tidyverse អ្នកបានរៀបចំរួចហើយដើម្បីចាប់ផ្តើមសួរបានចំលើយពីទិន្នន័យរបស់អ្នក។ នៅពេលដែលអ្នកធ្វើការជាមួយទិន្នន័យ និងអនុវត្តដំណោះស្រាយ ML វិធីសាស្ត្រនេះ វាមានសារៈសំខាន់យ៉ាងខ្លាំងក្នុងការយល់ដឹងពីរបៀបសួរប្រាប់សំណួរដែលត្រឹមត្រូវដើម្បីបើកសមត្ថភាពរបស់សំណុំទិន្នន័យរបស់អ្នកយ៉ាងត្រឹមត្រូវ។\n",
|
||||
"\n",
|
||||
"នៅក្នុងមេរៀននេះ អ្នកនឹងរៀន:\n",
|
||||
"\n",
|
||||
"- របៀបរៀបចំទិន្នន័យរបស់អ្នកសម្រាប់ការបង្កើតម៉ូដែល។\n",
|
||||
"\n",
|
||||
"- របៀបប្រើ `ggplot2` សម្រាប់ការមើលទិន្នន័យ។\n",
|
||||
"\n",
|
||||
"សំណួរដែលអ្នកត្រូវបានបំផុតនឹងកំណត់ប្រភេទនៃអាល់ហ្គរីធម៌ ML ដែលអ្នកនឹងប្រើប្រាស់។ ហើយគុណភាពនៃចម្លើយដែលអ្នកទទួលបាននឹងពឹងផ្អែកយ៉ាងខ្លាំងលើធម្មសម្បត្តិនៃទិន្នន័យរបស់អ្នក។\n",
|
||||
"\n",
|
||||
"ចង់មើលរឿងនេះដោយធ្វើការប្រឡងផ្ទាល់។\n",
|
||||
"\n",
|
||||
"<p >\n",
|
||||
" <img src=\"../../../../../../translated_images/km/unruly_data.0eedc7ced92d2d91.webp\"\n",
|
||||
" width=\"700\"/>\n",
|
||||
" <figcaption>ស្នាដៃដោយ @allison_horst</figcaption>\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Pg5aexcOPqAZ"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## 1. នាំចូលទិន្នន័យផលល្ហុង និងហៅមក Tidyverse\n",
|
||||
"\n",
|
||||
"យើងត្រូវការបណ្ណាល័យខាងក្រោមដើម្បីកំណត់ និងរាយចេញមេរៀននេះ៖\n",
|
||||
"\n",
|
||||
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) គឺជា [កំណត់បណ្ណាល័យ R](https://www.tidyverse.org/packages) ដែលរចនាឡើងដើម្បីធ្វើឱ្យវិទ្យាសាស្ត្រទិន្នន័យរហ័ស រងាយស្រួល និងក្ដៅក្នុងការធ្វើការលេងជាងមុន!\n",
|
||||
"\n",
|
||||
"អ្នកអាចដំឡើងវាតាមរយៈ៖\n",
|
||||
"\n",
|
||||
"`install.packages(c(\"tidyverse\"))`\n",
|
||||
"\n",
|
||||
"ស្គ្រីបខាងក្រោមពិនិត្យមើលថាតើអ្នកមានបណ្ណាល័យដែលត្រូវការសម្រាប់បញ្ចប់មូឌុលនេះហើយដំឡើងវាដើម្បីជំនួសបើមានខកខាន។\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "dc5WhyVdXAjR"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
|
||||
"pacman::p_load(tidyverse)"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "GqPYUZgfXOBt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"ឥឡូវនេះ យើងចាប់ផ្តើមដំណើរការបញ្ចប់មួយចំនួន និងផ្ទុក [ទិន្នន័យ](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) ដែលបានផ្តល់សម្រាប់មេរៀននេះ!\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "kvjDTPDSXRr2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Load the core Tidyverse packages\n",
|
||||
"library(tidyverse)\n",
|
||||
"\n",
|
||||
"# Import the pumpkins data\n",
|
||||
"pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Get a glimpse and dimensions of the data\n",
|
||||
"glimpse(pumpkins)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Print the first 50 rows of the data set\n",
|
||||
"pumpkins %>% \n",
|
||||
" slice_head(n =50)"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "VMri-t2zXqgD"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"មើល `glimpse()` ពេលវេលាមួយភ្លាម ជាបន្ទាន់បង្ហាញថាមានចន្លោះទទេ និងមានការលាយបញ្ចូលគ្នារវាងខ្សែអក្សរ (`chr`) និងទិន្នន័យលេខ (`dbl`)។ `Date` គឺជាប្រភេទខ្សែអក្សរ ហើយមានកូឡុំណ៍មួយដ៏អស្ចារ្យហៅថា `Package` ដែលទិន្នន័យ នៅក្នុងនោះមានការលាយបញ្ចូលគ្នារវាង `sacks`, `bins` និងតម្លៃផ្សេងៗទៀត។ ទិន្នន័យនេះ ជាការអភិវឌ្ឍន៍មួយព្រាជាក់ស្តែង 😤។\n",
|
||||
"\n",
|
||||
"ពិតប្រាកដ វានៅមិនធម្មតាទេដែលនឹងទទួលបានឯកសារទិន្នន័យ ដែលបានរៀបចំរួចរាល់សម្រាប់ប្រើបង្កើតម៉ូឌែល ML ពីប្រអប់ទេ។ ប៉ុន្តែកុំបារម្ភ នៅក្នុងមេរៀននេះ អ្នកនឹងរៀនពីរបៀបរៀបចំឯកសារទិន្នន័យដើមឲ្យបានត្រឹមត្រូវដោយប្រើបណ្ណាល័យ R ដែលមានស្តង់ដារ 🧑🔧។ អ្នកនឹងរៀនពីបច្ចេកទេសផ្សេងៗដើម្បីសម្របសម្រួលទិន្នន័យផងដែរ 📈📊\n",
|
||||
"<br>\n",
|
||||
"\n",
|
||||
"> ការរំលឹកម្ដងទៀត៖ អូបერატឺ pipe (`%>%`) ប្រត្តិបត្ដិការជាមួយកំណត់ត្រានៅលំដាប់តាមហេតុផល ដោយផ្ទេរប្រធានវត្ថុមួយទៅមុខទៅមុខក្នុងសមីការឬហៅមុខងារ។ អ្នកអាចគិតពីអូបერატឺ pipe ដូចជាការនិយាយថា \"បន្ទាប់មក\" នៅក្នុងកូដរបស់អ្នក។\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "REWcIv9yX29v"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## 2. ពិនិត្យឃើញទិន្នន័យខ្វះ\n",
|
||||
"\n",
|
||||
"មួយក្នុងចំណោមបញ្ហាធម្មតាបំផុតដែលអ្នកវិទ្យាសាស្រ្តទិន្នន័យត្រូវដោះស្រាយគឺទិន្នន័យមិនពេញលេញឬខ្វះ។ R តំណាងឲ្យតម្លៃខ្វះ ឬមិនដឹងជាមួយតម្លៃសញ្ញាពិសេស៖ `NA` (មិនអាចប្រើបាន)។\n",
|
||||
"\n",
|
||||
"ដូចនេះ តើយើងធ្វើដូចម្តេចដើម្បីដឹងថា data frame មានតម្លៃខ្វះ?\n",
|
||||
"<br>\n",
|
||||
"- វិធីមួយផ្ទាល់សាមញ្ញគឺប្រើមុខងារ base R `anyNA` ដែលត្រឡប់តម្លៃតុល្យភាព `TRUE` ឬ `FALSE`\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Zxfb3AM5YbUe"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"pumpkins %>% \n",
|
||||
" anyNA()"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "G--DQutAYltj"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"អស្ចារ្យណាស់ មានទិន្នន័យខ្វះខាតខ្លះ! នេះជាទីកន្លែងល្អសម្រាប់ចាប់ផ្ដើម។\n",
|
||||
"\n",
|
||||
"- វិធីមួយផ្សេងទៀតគឺការប្រើមុខងារ `is.na()` ដែលបង្ហាញពីធាតុទាំងមូលក្នុងជួរឈរដែលខ្វះជាមួយតម្លៃត្រឹមត្រូវ `TRUE`។\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "mU-7-SB6YokF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"pumpkins %>% \n",
|
||||
" is.na() %>% \n",
|
||||
" head(n = 7)"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "W-DxDOR4YxSW"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"បានហើយ បានបំពេញការងាររួច តែបើជាមួយ data frame ធំដូចមួយនេះ វានឹងអស្ថិរភាព ហើយជាក់ស្តែងមិនអាចពិនិត្យមើលជួរឈរនៅក្នុងប្រអប់ទាំងអស់បាននោះទេ😴។\n",
|
||||
"\n",
|
||||
"- វិធីងាយស្រួលជាងគេទៀតគឺគណនាដល់ចំនួនតម្លៃដែលកំពុងស្ទះសម្រាប់ជួរឈរនីមួយៗ៖\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "xUWxipKYY0o7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"pumpkins %>% \n",
|
||||
" is.na() %>% \n",
|
||||
" colSums()"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "ZRBWV6P9ZArL"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"ល្អជាងមុន! មានទិន្នន័យខ្វះ ខ្លះប៉ុន្តែអាចនឹងមិនមានបញ្ហាសម្រាប់ការងារដែលកំពុងធ្វើឡើយ។ យើងមកមើលថាវិភាគបន្ថែមនឹងផ្ដល់អ្វីខ្លះ។\n",
|
||||
"\n",
|
||||
"> ជាមួយនឹងឯកស្សិទសម្រាប់កញ្ចប់ និងមុខងារដ៏អស្ចារ្យ R មានឯកសារដ៏ល្អណាស់។ ជាឧទាហរណ៍ សូមប្រើ `help(colSums)` ឬ `?colSums` ដើម្បីស្វែងយល់បន្ថែមអំពីមុខងារ។\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "9gv-crB6ZD1Y"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## 3. Dplyr: វេយ្យាករណ៍នៃការបំលែងទិន្នន័យ\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"<p >\n",
|
||||
" <img src=\"../../../../../../translated_images/km/dplyr_wrangling.f5f99c64fd4580f1.webp\"\n",
|
||||
" width=\"569\"/>\n",
|
||||
" <figcaption>សិល្បៈដោយ @allison_horst</figcaption>\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"<!--<br/>Artwork by \\@allison_horst-->\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "o4jLY5-VZO2C"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"[`dplyr`](https://dplyr.tidyverse.org/), គឺជាផ្នែកបន្ថែមមួយក្នុង Tidyverse ដែលជាវិធីសាស្រ្តនៃការបម្រើទិន្នន័យ ដែលផ្តល់នូវកិរិយាស័ព្ទមួយដែលមានសទិ្ធភាព ដែលជួយអ្នកដោះស្រាយបញ្ហារបស់ការបម្រើទិន្នន័យដែលជាប្រភេទទូទៅ។ នៅក្នុងផ្នែកនេះ យើងនឹងស្វែងយល់អំពីកិរិយាស័ព្ទមួយចំនួនរបស់ dplyr! \n",
|
||||
"<br>\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "i5o33MQBZWWw"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"#### dplyr::select()\n",
|
||||
"\n",
|
||||
"`select()` គឺជាឧបករណ៍មួយក្នុងកញ្ចប់ `dplyr` ដែលជួយអ្នកជ្រើសរើសជួរឈរដែលចង់រក្សាទុកឬដកចេញ។\n",
|
||||
"\n",
|
||||
"ដើម្បីធ្វើឲ្យទ្រង់ទ្រាយទិន្នន័យរបស់អ្នកងាយស្រួលប្រើប្រាស់ លប់ជួរឈរជាច្រើនរបស់វាចេញ ដោយប្រើ `select()` រក្សាទុកតែជួរឈរដែលអ្នកត្រូវការ។\n",
|
||||
"\n",
|
||||
"ឧទាហរណ៍ ក្នុងលំហាត់នេះ ការវិភាគរបស់យើងនឹងពាក់ព័ន្ធនឹងជួរឈរ `Package`, `Low Price`, `High Price` និង `Date` ។ អង្គុយជ្រើសរើសជួរឈរទាំងនេះ។\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "x3VGMAGBZiUr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Select desired columns\n",
|
||||
"pumpkins <- pumpkins %>% \n",
|
||||
" select(Package, `Low Price`, `High Price`, Date)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Print data set\n",
|
||||
"pumpkins %>% \n",
|
||||
" slice_head(n = 5)"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "F_FgxQnVZnM0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"#### dplyr::mutate()\n",
|
||||
"\n",
|
||||
"`mutate()` គឺជាអនុគមន៍មួយក្នុងកញ្ចប់ `dplyr` ដែលជួយអ្នកបង្កើតឬកែប្រែជួរឈរ ខណៈដែលរក្សាជួរឈរដើមទៅ។\n",
|
||||
"\n",
|
||||
"រចនាសម្ព័ន្ធទូទៅនៃ mutate គឺ៖\n",
|
||||
"\n",
|
||||
"`data %>% mutate(new_column_name = what_it_contains)`\n",
|
||||
"\n",
|
||||
"យើងមានល្បែង mutate ដោយប្រើជួរឈរ `Date` ដោយធ្វើប្រតិបត្តិការខាងក្រោម៖\n",
|
||||
"\n",
|
||||
"1. ផ្លាស់ប្តូរពេលវេលា (ដែលកំពុងជា តួអក្សរទទេ) ទៅជា ទ្រង់ទ្រាយខែ (ទាំងនេះគឺជាកាលបរិច្ឆេទអាមេរិក ដូច្នេះទ្រង់ទ្រាយគឺ `MM/DD/YYYY`)។\n",
|
||||
"\n",
|
||||
"2. ដកខែចេញពីកាលបរិច្ឆេទទៅជាជួរឈរថ្មីមួយ។\n",
|
||||
"\n",
|
||||
"ក្នុង R កញ្ចប់ [lubridate](https://lubridate.tidyverse.org/) ធ្វើឲ្យងាយស្រួលក្នុងការប្រើទិន្នន័យពេលវេលា។ ដូច្នេះ មកប្រើ `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` ហើយមើលវិធីសាស្ត្រដើម្បីសម្រេចគោលបំណងខាងលើ។ យើងអាចដកជួរឈរ Date ចេញ ពីព្រោះយើងមិនចាំបាច់ប្រើវាទៀតនៅក្នុងប្រតិបត្តិការបន្តទេ។\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "2KKo0Ed9Z1VB"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Load lubridate\n",
|
||||
"library(lubridate)\n",
|
||||
"\n",
|
||||
"pumpkins <- pumpkins %>% \n",
|
||||
" # Convert the Date column to a date object\n",
|
||||
" mutate(Date = mdy(Date)) %>% \n",
|
||||
" # Extract month from Date\n",
|
||||
" mutate(Month = month(Date)) %>% \n",
|
||||
" # Drop Date column\n",
|
||||
" select(-Date)\n",
|
||||
"\n",
|
||||
"# View the first few rows\n",
|
||||
"pumpkins %>% \n",
|
||||
" slice_head(n = 7)"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "5joszIVSZ6xe"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Woohoo! 🤩\n",
|
||||
"\n",
|
||||
"បន្ទាប់មក យើងបង្កើតជួរដេកថ្មីមួយឈ្មោះ `Price` ដែលតំណាងឱ្យតម្លៃជាមធ្យមនៃស្ពានពូពេញ។ ឥឡូវនេះ យើងនឹងគណនាមធ្យមតម្លៃពីជួរដេក `Low Price` និង `High Price` ដើម្បីបំពេញជួរដេកថ្មី Price។ \n",
|
||||
"<br>\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "nIgLjNMCZ-6Y"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Create a new column Price\n",
|
||||
"pumpkins <- pumpkins %>% \n",
|
||||
" mutate(Price = (`Low Price` + `High Price`)/2)\n",
|
||||
"\n",
|
||||
"# View the first few rows of the data\n",
|
||||
"pumpkins %>% \n",
|
||||
" slice_head(n = 5)"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "Zo0BsqqtaJw2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"យ៉េស!💪\n",
|
||||
"\n",
|
||||
"\"ប៉ុន្តែរងចាំ!\", អ្នកនឹងនិយាយបន្ទាប់ពីបានរំលងតាមផ្ទៃទិន្នន័យទាំងមូលជាមួយ `View(pumpkins)`, \"មានអ្វីមួយចម្លែកនៅទីនេះ!\"🤔\n",
|
||||
"\n",
|
||||
"បើអ្នកមើលទៅកាន់ជួរឈរដែលមានឈ្មោះ `Package`, មើលវិញថាទំនិញនំឃ្មុំត្រូវបានលក់ក្នុងលក្ខណៈផ្សេងៗគ្នាច្រើន។ មានខ្លះលក់ក្នុងមាឌ `1 1/9 bushel` ហើយខ្លះលក់ក្នុងមាឌ `1/2 bushel`, ខ្លះលក់គិតជាផ្អែមម្តងៗ, ខ្លះលក់គិតជាគីឡូក្រាម, និងខ្លះក្នុងប្រអប់ធំៗដែលមានទទឹងខុសៗគ្នា។\n",
|
||||
"\n",
|
||||
"ឲ្យយើងត្រួតពិនិត្យឲ្យបានច្បាស់៖\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "p77WZr-9aQAR"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Verify the distinct observations in Package column\n",
|
||||
"pumpkins %>% \n",
|
||||
" distinct(Package)"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "XISGfh0IaUy6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"អស្ចារ្យ! 👏\n",
|
||||
"\n",
|
||||
"ការ៉ូតទំពាំងបង្ហាញថាការវាស់ទំងន់ឲ្យត្រឹមត្រូវជាប្រចាំគឺពិបាកណាស់ ដូច្នេះសូមតម្រាម្តងតែការ៉ូតទំពាំងដែលមានខ្សែអក្សរពាក្យ *bushel* នៅក្នុងជួរឈរ `Package` ហើយដាក់វាទៅក្នុង data frame ថ្មីឈ្មោះ `new_pumpkins`។\n",
|
||||
"<br>\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "7sMjiVujaZxY"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"#### dplyr::filter() និង stringr::str_detect()\n",
|
||||
"\n",
|
||||
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): បង្កើត subset នៃទិន្នន័យដែលមានតែ **ជួរ** ដែលបំពេញលក្ខខណ្ឌរបស់អ្នក នៅក្នុងករណីនេះ គឺក្រូចមួយដែលមានខ្សែអក្សរ *bushel* នៅក្នុងស្រឡាយ `Package` ។\n",
|
||||
"\n",
|
||||
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): ស្វែងរកការត្រូវគ្នា ឬអវត្តមាននៃលំនាំនៅក្នុងខ្សែអក្សរ។\n",
|
||||
"\n",
|
||||
"កញ្ចប់ [`stringr`](https://github.com/tidyverse/stringr) ផ្តល់ជូននូវមុខងារដែលសាមញ្ញសម្រាប់ប្រតិបត្តិការខ្សែអក្សរពេញនិយម។\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "L8Qfcs92ageF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Retain only pumpkins with \"bushel\"\n",
|
||||
"new_pumpkins <- pumpkins %>% \n",
|
||||
" filter(str_detect(Package, \"bushel\"))\n",
|
||||
"\n",
|
||||
"# Get the dimensions of the new data\n",
|
||||
"dim(new_pumpkins)\n",
|
||||
"\n",
|
||||
"# View a few rows of the new data\n",
|
||||
"new_pumpkins %>% \n",
|
||||
" slice_head(n = 5)"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "hy_SGYREampd"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"អ្នកអាចមើលឃើញថាយើងបានកាត់បន្ថយដល់ប្រហែល ៤១៥ ជួរដេតាដែលមានទន្សោមជាច្រើនតាមប្រអប់។🤩\n",
|
||||
"<br>\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "VrDwF031avlR"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"#### dplyr::case_when()\n",
|
||||
"\n",
|
||||
"**ប៉ុន្តែរងចាំ! មានរឿងមួយទៀតត្រូវធ្វើ**\n",
|
||||
"\n",
|
||||
"តើអ្នកបានមើលឃើញទេថា ចំនួន bushel ផ្លាស់ប្តូរតាមជួរដេកមួយៗ? អ្នកត្រូវតែធ្វើការប្រកាសតម្លៃឱ្យសមរម្យ ដើម្បីបង្ហាញតម្លៃក្នុងមួយ bushel មិនមែនក្នុង 1 1/9 ឬ 1/2 bushel ទេ។ ពេលវេលាទៅធ្វើគណិតវិទ្យាដើម្បីធ្វើឱ្យវាធម្មតា។\n",
|
||||
"\n",
|
||||
"យើងនឹងប្រើមុខងារ [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) ដើម្បី *បម្លែង* ជួរឈរតម្លៃ Price ដោយផ្អែកលើលក្ខខណ្ឌជាក់លាក់ខ្លះៗ។ `case_when` អនុញ្ញាតឱ្យអ្នកធ្វើវ៉ិចទ័រជាច្រើននៃ `if_else()`។\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "mLpw2jH4a0tx"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Convert the price if the Package contains fractional bushel values\n",
|
||||
"new_pumpkins <- new_pumpkins %>% \n",
|
||||
" mutate(Price = case_when(\n",
|
||||
" str_detect(Package, \"1 1/9\") ~ Price/(1 + 1/9),\n",
|
||||
" str_detect(Package, \"1/2\") ~ Price/(1/2),\n",
|
||||
" TRUE ~ Price))\n",
|
||||
"\n",
|
||||
"# View the first few rows of the data\n",
|
||||
"new_pumpkins %>% \n",
|
||||
" slice_head(n = 30)"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "P68kLVQmbM6I"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"ឥឡូវនេះ យើងអាចវិភាគតម្លៃក្នុងមួយឯកតាតាមការវាស់តម្លៃម៉ែត្រប៊ូសែលរបស់ពួកវា។ ការសិក្សារអំពីប៊ូសែលនៃក្រូចប៊ឺតទាំងនេះ ប៉ុន្តែ បង្ហាញថា វា `សំខាន់`យ៉ាងខ្លាំងក្នុងការទទួលយក `ការយល់ដឹងពីធម្មជាតិឯកសាររបស់អ្នក`!\n",
|
||||
"\n",
|
||||
"> ✅ យោងតាម [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) ទំងន់នៃប៊ូសែលមួយអាស្រ័យលើប្រភេទផលិតផល ព្រោះវាជាការវាស់តម្លៃបរិមាណ។ \"ប៊ូសែលមួយនៃប៉េងប៉ោះ ឧទាហរណ៍ គួរតែមានទំងន់៥៦ផោន... ស្លឹក និងស្រស់កាន់កន្លែងច្រើនជាមួយទំងន់តិចជាង ដូច្នេះប៊ូសែលមួយនៃស្ពៃត្រូវមានទំងន់ត្រឹម២០ផោនប៉ុណ្ណោះ។\" វាពិបាកណាស់! មិនចាំបាច់ធ្វើការបម្លែងពីប៊ូសែលទៅផោនទេ ខណៈដែលយើងតំលៃតាមប៊ូសែលផងដែរ។ ការសិក្សារអំពីប៊ូសែលនៃក្រូចប៊ឺតទាំងនេះ បង្ហាញយ៉ាងខ្លាំងថា វាសំខាន់ណាស់ក្នុងការយល់ដឹងពីធម្មជាតិឯកសាររបស់អ្នក!\n",
|
||||
">\n",
|
||||
"> ✅ តើអ្នកបានសម្គាល់ទេថា ក្រូចប៊ឺតដែលលក់តាមកំរិតពាក់កណ្តាលប៊ូសែល គឺមានតម្លៃថ្លៃណាស់? តើអ្នកអាចស្រង់យកមូលហេតុបានទេ? ជំនួយ៖ ក្រូចប៊ឺតតូចៗមានតម្លៃថ្លៃជាងក្រូចធំ ដោយសារតែមានចំនួនរាប់មិនបានច្រើនក្នុងមួយប៊ូសែល បើប្រៀបធៀបទៅនឹងកន្លែងដែលមិនបានប្រើប្រាស់ដោយក្រូចបាយធំមួយដែលទទឹងទូលាយ។\n",
|
||||
"<br>\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "pS2GNPagbSdb"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"ចុងក្រោយនេះ សម្រាប់ការផ្សងព្រេង 💁♀️ តោះយើងប្ដូរតំណែងកូឡុំខែទៅជាទីតាំងដំបូង គឺ `មុន` កូឡុំ `Package`។\n",
|
||||
"\n",
|
||||
"`dplyr::relocate()` ត្រូវបានប្រើដើម្បីផ្លាស់ប្តូរទីតាំងកូឡុំ។\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "qql1SowfbdnP"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Create a new data frame new_pumpkins\n",
|
||||
"new_pumpkins <- new_pumpkins %>% \n",
|
||||
" relocate(Month, .before = Package)\n",
|
||||
"\n",
|
||||
"new_pumpkins %>% \n",
|
||||
" slice_head(n = 7)"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "JJ1x6kw8bixF"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"ការងារល្អ!👌 ឥឡូវនេះអ្នកមានឯកសារទិន្នន័យស្អាត និងស្អិត ដែលអ្នកអាចបង្កើតម៉ូឌែលរេហ្គ្រេស្យុងថ្មីរបស់អ្នកបាន! \n",
|
||||
"<br>\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "y8TJ0Za_bn5Y"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## 4. ការបង្ហាញទិន្នន័យជាមួយ ggplot2\n",
|
||||
"\n",
|
||||
"<p >\n",
|
||||
" <img src=\"../../../../../../translated_images/km/data-visualization.54e56dded7c1a804.webp\"\n",
|
||||
" width=\"600\"/>\n",
|
||||
" <figcaption>រូបភាពពត៌មានដោយ Dasani Madipalli</figcaption>\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"<!--{width=\"600\"}-->\n",
|
||||
"\n",
|
||||
"មានពាក្យប្រាប់បញ្ញាតិប្រាប់ដូចខាងក្រោម៖\n",
|
||||
"\n",
|
||||
"> \"ក្រាផិកសាមញ្ញបាននាំគំនិតព័ត៌មានច្រើនទៅឱ្យអ្នកវិភាគទិន្នន័យជាងឧបករណ៍ផ្សេងទៀត។\" --- John Tukey\n",
|
||||
"\n",
|
||||
"ផ្នែកមួយនៃតួនាទីអ្នកវិទ្យាសាស្ត្រទិន្នន័យគឺបង្ហាញគុណភាពនិងធម្មជាតិនៃទិន្នន័យដែលពួកគេស正在ប៉ះពាល់។ ដើម្បីធ្វើការនេះ ពួកគេជាញឹកញាប់បង្កើតការបង្ហាញទិន្នន័យដែលគួរឱ្យចាប់អារម្មណ៍ ឬផលត និងក្រាផិក ផ្ទាំងចត់ ដំណើរការផ្សេងៗនៃទិន្នន័យ។ តាមរបៀបនេះ ពួកគេចែកបង្ហាញទំនាក់ទំនង និងចន្លោះដែលលំបាកក្នុងការរកឃើញ។\n",
|
||||
"\n",
|
||||
"ការបង្ហាញទិន្នន័យក៏អាចជួយកំណត់បច្ចេកទេសរៀនម៉៉ាស៊ីនដែលសមស្របបំផុតសម្រាប់ទិន្នន័យ។ ផ្ទាំងចត់ដែលហើមត្រាំតាមបន្ទាត់ឧទាហរណ៍ បង្ហាញថាទិន្នន័យជាអ្នកប្រលោមល្អសម្រាប់ហាត់ការរៀនបន្ទាត់ត្រង់។\n",
|
||||
"\n",
|
||||
"R ផ្តល់ជូនប្រព័ន្ធជាច្រើនសម្រាប់បង្កើតក្រាផិក ប៉ុន្តែ [`ggplot2`](https://ggplot2.tidyverse.org/index.html) គឺជាមួយក្នុងចំណោមប្រព័ន្ធដែលសុស្រស់បំផុត និងអាចប្រើប្រាស់បានទូលំទូលាយ។ `ggplot2` អនុញ្ញាតឱ្យអ្នកបង្កើតក្រាផិកដោយ **ការរួមបញ្ចូលសមាសធាតុឯករាជ្យ**។\n",
|
||||
"\n",
|
||||
"ចាប់ផ្តើមដោយផ្ទាំងចត់សាមញ្ញសម្រាប់ជួរឈរ Price និង Month។\n",
|
||||
"\n",
|
||||
"ដូច្នេះ នៅក្នុងករណីនេះ យើងនឹងចាប់ផ្តើមជាមួយ [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html) ផ្ដល់ទិន្នន័យជាគេហទំព័រ និងការផ្គូរផ្គងសម្រង់អេសធីទីក (ជាមួយ [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)) បន្ទាប់មកបញ្ចូលស្រទាប់មួយ (ដូចជា [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) សម្រាប់ផ្ទាំងចត់។\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "mYSH6-EtbvNa"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Set a theme for the plots\n",
|
||||
"theme_set(theme_light())\n",
|
||||
"\n",
|
||||
"# Create a scatter plot\n",
|
||||
"p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n",
|
||||
"p + geom_point()"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "g2YjnGeOcLo4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"តើនេះជាចំណត់ត្រាមួយដ៏មានប្រយោជន៍មែនទេ 🤷? តើមានអ្វីណាមួយអំពីវាដែលធ្វើឲ្យអ្នកភ្ញាក់ផ្អើលទេ?\n",
|
||||
"\n",
|
||||
"វាមិនមានប្រយោជន៍ជាពិសេសទេ ពីព្រោះវាតែបង្ហាញទិន្នន័យរបស់អ្នកជាជួរផ្សព្វផ្សាយនៃចុចនៅក្នុងខែដែលបានកំណត់។ \n",
|
||||
"<br>\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Ml7SDCLQcPvE"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### **តើយើងធ្វើដូចម្តេចដើម្បីឲ្យវាមានប្រយោជន៍?**\n",
|
||||
"\n",
|
||||
"ដើម្បីឲ្យតារាងបង្ហាញទិន្នន័យដែលមានប្រយោជន៍ ជាទូទៅអ្នកត្រូវតែចម្រៀងទិន្នន័យមួយៗជាក្រុម។ ឧទាហរណ៍ក្នុងករណីរបស់យើង ការស្វែងរកតម្លៃមធ្យមនៃផ្លែចេកសម្រាប់ខែជូនអាចផ្តល់ការយល់ដឹងបន្ថែមលើលំនាំមូលដ្ឋានក្នុងទិន្នន័យរបស់យើង។ នេះនាំឲ្យយើងទៅរកការបកស្រាយ **dplyr** មួយទៀត៖\n",
|
||||
"\n",
|
||||
"#### `dplyr::group_by() %>% summarize()`\n",
|
||||
"\n",
|
||||
"ការបូកសរុបតាមក្រុមក្នុង R អាចគណនាបានយ៉ាងងាយស្រួលដោយប្រើ\n",
|
||||
"\n",
|
||||
"`dplyr::group_by() %>% summarize()`\n",
|
||||
"\n",
|
||||
"- `dplyr::group_by()` ប្ដូរឯកត្តានៃការវិភាគពីឯកត្តានៃទិន្នន័យទាំងមូលទៅជាក្រុមលក្ខណៈដូចជាតាមខែ។\n",
|
||||
"\n",
|
||||
"- `dplyr::summarize()` បង្កើតស៊ុមទិន្នន័យថ្មីដែលមានមួយជួរឈរសម្រាប់ប៉ារ៉ាម៉ែត្រក្រុមនីមួយ និងមួយជួរឈរសម្រាប់ស្ថិតិរួមដែលអ្នកបានបញ្ជាក់។\n",
|
||||
"\n",
|
||||
"ឧទាហរណ៍ យើងអាចប្រើ `dplyr::group_by() %>% summarize()` ដើម្បីចម្រៀងផ្លែចេកទៅជាក្រុមជាតាមជួរឈរ **Month** ហើយបន្ទាប់មកស្វែងរក **តម្លៃមធ្យម** សម្រាប់រាប់ខែរបស់មួយៗ។\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "jMakvJZIcVkh"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Find the average price of pumpkins per month\r\n",
|
||||
"new_pumpkins %>%\r\n",
|
||||
" group_by(Month) %>% \r\n",
|
||||
" summarise(mean_price = mean(Price))"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "6kVSUa2Bcilf"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"សង្ខេប!✨\n",
|
||||
"\n",
|
||||
"លក្ខណៈជាក្រុមដូចជាខែកាន់តែល្អក្នុងការទ្រទ្រង់ដោយប្រើក្រាបប៉ារ៉ែ📊។ ស្រទាប់ដែលទទួលខុសត្រូវសម្រាប់ក្រាបប៉ារ៉ែគឺ `geom_bar()` និង `geom_col()`។ សូមពិនិត្យ `?geom_bar` ដើម្បីស្វែងយល់បន្ថែម។\n",
|
||||
"\n",
|
||||
"មកធ្វើមួយ!\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Kds48GUBcj3W"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Find the average price of pumpkins per month then plot a bar chart\r\n",
|
||||
"new_pumpkins %>%\r\n",
|
||||
" group_by(Month) %>% \r\n",
|
||||
" summarise(mean_price = mean(Price)) %>% \r\n",
|
||||
" ggplot(aes(x = Month, y = mean_price)) +\r\n",
|
||||
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
|
||||
" ylab(\"Pumpkin Price\")"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {
|
||||
"id": "VNbU1S3BcrxO"
|
||||
}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"🤩🤩នេះជាការបង្ហាញទិន្នន័យដែលមានប្រយោជន៍ជាងមុន! វាហាក់ដូចជាបង្ហាញថាតម្លៃខ្ពស់បំផុតសម្រាប់ដំឡូងពោតកើតឡើងនៅខែកញ្ញា និងតុលា។ តើវាត្រូវនឹងការរំពឹងទុករបស់អ្នកទេ? ហេតុអ្វីបានជាពីអ្វី?\n",
|
||||
"\n",
|
||||
"អបអរសាទរនៅក្នុងការសម្រេចចិត្តថ្នាក់ទីពីរ 👏! អ្នកបានរៀបចំទិន្នន័យរបស់អ្នកសម្រាប់ការបង្កើតម៉ូដែល បន្ទាប់មកបានរកឃើញការយល់ដឹងបន្ថែមតាមរយៈការបង្ហាញទម្រង់!\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "zDm0VOzzcuzR"
|
||||
}
|
||||
},
|
||||
{
|
||||
"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,18 @@
|
||||
# បង្កើតម៉ូដែល Regression
|
||||
|
||||
## សេចក្តីណែនាំ
|
||||
|
||||
នៅក្នុងមេរៀននេះ អ្នកត្រូវបានបង្ហាញពីរបៀបបង្កើតម៉ូដែលដោយប្រើទាំង Linear និង Polynomial Regression។ ប្រើចំណេះដឹងនេះ ស្វែងរកហត្ថកម្មទិន្នន័យ ឬប្រើឈុតទិន្នន័យដែលមានក្នុង Scikit-learn ដើម្បីបង្កើតម៉ូដែលថ្មីមួយ។ ពន្យល់នៅក្នុងសៀវភៅកំណត់ត្រារបស់អ្នកថាហេតុអ្វីបានជាអ្នកជ្រើសរើសបច្ចេកទេសដែលបានប្រើ ហើយបង្ហាញពីភាពត្រឹមត្រូវនៃម៉ូដែល។ ប្រសិនបើវាមិនត្រឹមត្រូវ សូមពន្យល់ពីហេតុផល។
|
||||
|
||||
## ក្រមផ្សេងៗ
|
||||
|
||||
| ការវាយតម្លៃ | ការបង្ហាញល្អឆ្នើម | គ្រប់គ្រាន់ | ត្រូវការប្រសើរឡើង |
|
||||
| -------- | ------------------------------------------------------------ | -------------------------- | -------------------------------- |
|
||||
| | បង្ហាញសៀវភៅកំណត់ត្រាពេញលេញជាមួយដំណោះស្រាយដែលឯកសារយ៉ាងល្អ | ដំណោះស្រាយមិនពេញលេញ | ដំណោះស្រាយខូចឬមានកំហុស |
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**:
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈដែលយើងខំប្រឹងប្រែងក្នុងការសំអាតភាពត្រឹមត្រូវ សូមអោយដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវខ្លះៗ។ ឯកសារដើមក្នុងភាសាតិជាគ្រឿងផ្តល់ពត៌មានផ្លូវការដែលគួរត្រូវបានយកមកពិចារណា។ សម្រាប់ពត៌មានសំខាន់ៗ ការបកប្រែដោយមនុស្សជំនាញផ្នែកវិជ្ជាជីវៈគឺត្រូវបានផ្តល់អនុសាសន៍។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសៗចេញពីការប្រើប្រាស់ការបកប្រែកម្មវិធីនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,122 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## តម្លៃផំពុំគីន\n",
|
||||
"\n",
|
||||
"ផ្ទុកបណ្ណាល័យត្រូវការនិងសំណុំទិន្នន័យ។ បម្លែងទិន្នន័យទៅជា dataframe ដែលមានអនុបំណែកនៃទិន្នន័យ៖\n",
|
||||
"\n",
|
||||
"- សូមទទួលបានផំពុំគីនដែលកំណត់តម្លៃជាម៉ាយលើមួយ bushel តែប៉ុណ្ណោះ\n",
|
||||
"- បម្លែងកាលបរិច្ឆេទទៅជាខែ\n",
|
||||
"- គណនាតម្លៃឱ្យក្លាយទៅជាមធ្យមនៃតម្លៃខ្ពស់និងទាប\n",
|
||||
"- បម្លែងតម្លៃ ដើម្បីបង្រ្កាបកំណត់តម្លៃតាមបរិមាណមួយ bushel\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import pandas as pd\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import numpy as np\n",
|
||||
"from datetime import datetime\n",
|
||||
"\n",
|
||||
"pumpkins = pd.read_csv('../data/US-pumpkins.csv')\n",
|
||||
"\n",
|
||||
"pumpkins.head()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n",
|
||||
"\n",
|
||||
"columns_to_select = ['Package', 'Variety', 'City Name', 'Low Price', 'High Price', 'Date']\n",
|
||||
"pumpkins = pumpkins.loc[:, columns_to_select]\n",
|
||||
"\n",
|
||||
"price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2\n",
|
||||
"\n",
|
||||
"month = pd.DatetimeIndex(pumpkins['Date']).month\n",
|
||||
"day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)\n",
|
||||
"\n",
|
||||
"new_pumpkins = pd.DataFrame(\n",
|
||||
" {'Month': month, \n",
|
||||
" 'DayOfYear' : day_of_year, \n",
|
||||
" 'Variety': pumpkins['Variety'], \n",
|
||||
" 'City': pumpkins['City Name'], \n",
|
||||
" 'Package': pumpkins['Package'], \n",
|
||||
" 'Low Price': pumpkins['Low Price'],\n",
|
||||
" 'High Price': pumpkins['High Price'], \n",
|
||||
" 'Price': price})\n",
|
||||
"\n",
|
||||
"new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/1.1\n",
|
||||
"new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price*2\n",
|
||||
"\n",
|
||||
"new_pumpkins.head()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"គំនូសចំណុចមូលដ្ឋានប្រាប់យើងថាយើងមានទិន្នន័យតែពីខែសីហាររហូតដល់ខែធ្នូប៉ុណ្ណោះ។ យើងប្រហែលជាត្រូវការទិន្នន័យច្រើនជាងនេះដើម្បីអាចទាញយកសេចក្តីសន្និដ្ឋានជារបៀបបន្ទាត់បាន។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"plt.scatter('Month','Price',data=new_pumpkins)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"\n",
|
||||
"plt.scatter('DayOfYear','Price',data=new_pumpkins)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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)។ ទោះបីជាយើងខិតខំព្យាយាមឲ្យមានការពិតប្រាក់ក៏ដោយ សូមជ្រាបថាបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុស ឬការខកខាន។ ឯកសារដើមនៅក្នុងភាស maternative នឹងត្រូវបានកត់សម្គាល់ជាភស្តុតាងដើម។ សម្រាប់ព័ត៌មានសំខាន់ គោលការណ៍បកប្រែដោយមនុស្សវិជ្ជាជីវៈគឺត្រូវបានផ្តល់អាទិភាព។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំពីឬការបកប្រែខុសបន្ទាប់ពីបានប្រើប្រាស់ការបកប្រែនេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"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.8.3-final"
|
||||
},
|
||||
"orig_nbformat": 2
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
នេះជាកន្លែងសម្រាប់ទីតាំងបណ្តោះអាសន្ន
|
||||
|
||||
---
|
||||
|
||||
<!-- 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 @@
|
||||
# ព្យាយាមម្តងទៀតក្នុងការធ្វើ Regression
|
||||
|
||||
## សេចក្ដីណែនាំ
|
||||
|
||||
ក្នុងមេរៀននេះ អ្នកបានប្រើទិន្នន័យផ្នែកខាងក្រោមរបស់ទិន្នន័យកំបោរមួយ។ ឥឡូវ សូមត្រឡប់ទៅកាន់ទិន្នន័យដើម ហើយព្យាយាមប្រើទាំងអស់ រួចធ្វើការសម្អាត និងធ្វើឲ្យស្តង់ដាទៅ មួយដើម្បីបង្កើតម៉ូដែល Logistic Regression ។
|
||||
## មាតិកាប្រវត្តិ
|
||||
|
||||
| កត្តា | ល្អឥតខ្ចោះ | គ្រប់គ្រាន់ | ត្រូវការកែប្រែកាន់តែប្រសើរ |
|
||||
| -------- | ----------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- |
|
||||
| | មានសៀវភៅកែរាប់រៀបរាប់ម៉ូដែលដែលមានការពន្យល់ល្អ និងសមត្ថភាពល្អ | មានសៀវភៅមួយដែលបង្ហាញម៉ូដែលដែលមានសមត្ថភាពតិចតួច | មានសៀវភៅមួយដែលបង្ហាញម៉ូដែលដែលមានសមត្ថភាពតិចឬមិនមានសមត្ថភាព |
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបញ្ជាក់**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំធ្វើយុត្តិធម៌ភាព សូមយកចិត្តទុកដាក់ថា ការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការខុសប្លែកខ្លះៗ។ ឯកសារដើមដែលមានភាសាមាតុភូមិគួរត្រូវបានគិតថាជា מקורគ្រប់គ្រង។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឲ្យប្រើការបកប្រែដោយមនុស្សជំនាញវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសបញ្ចេញពីការប្រើប្រាស់ការបកប្រែនេះនោះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,8 @@
|
||||
នេះគឺជាទីតាំងបញ្ចូលបណ្ដោះអាសន្ន
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខំប្រឹងប្រែងឲ្យមានភាពត្រឹមត្រូវ សូមយកចិត្តទុកដាក់ថា ការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមដោយភាសាដើមគួរត្រូវបានគេចាត់ទុកជាអ្នកផ្តល់ព័ត៌មានដែលមានសុពលភាព។ សម្រាប់ព័ត៌មានពិសេស សូមណែនាំឲ្យប្រើការបកប្រែដោយមនុស្សវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសប្លែកណាមួយ ដោយសារការប្រើប្រាស់ការបកប្រែនេះទេ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,681 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## សង់ម៉ូឌែល logistic regression - មេរៀនទី 4\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"#### **[សំណួរពិភាក្សា មុនមេរៀន](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)**\n",
|
||||
"\n",
|
||||
"#### បម្រែបម្រួល\n",
|
||||
"\n",
|
||||
"នៅក្នុងមេរៀនចុងក្រោយនេះ ពាក់ព័ន្ធនឹង Regression វិធីសាស្រ្ត ML មូលដ្ឋាន *ជា classic* មួយ យើងនឹងពិចារណាត្រឹម Logistic Regression។ អ្នកនឹងប្រើវិធីនេះ ដើម្បីរកឃើញលំនាំក្នុងការព្យាករណ៍ប្រភេទពីរជារូបធាតុ។ តើភីតកន្ត្រៃនេះជាឆកូឡាទរឬទេ? តើជំងឺនេះអាចឆ្លងទៅបានរឺទេ? តើអតិថិជននេះនឹងជ្រើសរើសផលិតផលនេះ រឺទេ?\n",
|
||||
"\n",
|
||||
"ក្នុងមេរៀននេះ អ្នកនឹងរៀនពី៖\n",
|
||||
"\n",
|
||||
"- វិធីសាស្រ្តសម្រាប់ logistic regression\n",
|
||||
"\n",
|
||||
"✅ ពង្រឹងការយល់ដឹងអំពីការដំណើរការជាមួយ regression ប្រភេទនេះក្នុង [មូឌុលសិក្សានេះ](https://learn.microsoft.com/training/modules/introduction-classification-models/?WT.mc_id=academic-77952-leestott)\n",
|
||||
"\n",
|
||||
"## ប្រភេទខ្លឹមសារ\n",
|
||||
"\n",
|
||||
"បន្ទាប់ពីបានធ្វើការងារជាមួយទិន្នន័យដំបង pumpkin ហើយ ឥឡូវនេះយើងសម្រេចចិត្តបានថា មានប្រភេទពីរមួយដែលយើងអាចប្រើបានគឺ៖ `Color`។\n",
|
||||
"\n",
|
||||
"តោះបង្កើតម៉ូឌែល logistic regression ដើម្បីព្យាករណ៍ថា នៅពេលមានអថេរមួយចំនួន *ប pumpkin មួយនឹងមានពណ៌អ្វី* (ទឹកដោះគោ orange 🎃 រឺសဖြူ 👻)។\n",
|
||||
"\n",
|
||||
"> ហេតុអ្វីយើងពិភាក្សាអំពីចំណាត់ថ្នាក់ពីរនៅក្នុងមេរៀនដែលជាការប្រមូលផ្តុំ regression? ដោយសារតែភាពងាយស្រួលផ្នែកភាសា ប្រភេទ logistic regression គឺ [ជាវិធីសាស្រ្តចំណាត់ថ្នាក់](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression) មួយ ដែលអាស្រ័យលើរៀបរាប់តាមខ្សែ។ រៀនពីវិធីផ្សេងទៀតក្នុងការចាត់ថ្នាក់ទិន្នន័យនៅក្នុងក្រុមមេរៀនបន្ទាប់។\n",
|
||||
"\n",
|
||||
"សម្រាប់មេរៀននេះ យើងត្រូវការពាក្យបណ្ណៈដូចខាងក្រោម៖\n",
|
||||
"\n",
|
||||
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) គឺ [បណ្ណាល័យ R មួយ](https://www.tidyverse.org/packages) ដែលបានរចនាឡើងដើម្បីអោយផ្នែកវិទ្យាសាស្រ្តទិន្នន័យមានល្បឿនលឿនឡើង សាមញ្ញ និងមានភាពរីករាយ!\n",
|
||||
"\n",
|
||||
"- `tidymodels`: ជា [ស៊ុមបណ្ណាល័យ](https://www.tidymodels.org/packages/) សម្រាប់ម៉ូឌែល និងការសិក្សាម៉ាស៊ីន។\n",
|
||||
"\n",
|
||||
"- `janitor`: [janitor package](https://github.com/sfirke/janitor) ផ្តល់ឧបករណ៍តូចៗសម្រាប់ពិនិត្យ និងសំអាតទិន្នន័យដែលខូច។\n",
|
||||
"\n",
|
||||
"- `ggbeeswarm`: [ggbeeswarm package](https://github.com/eclarke/ggbeeswarm) ផ្តល់វិធីសាស្រ្តបង្កើតកំណត់ត្រាបែប beeswarm ដោយប្រើ ggplot2។\n",
|
||||
"\n",
|
||||
"អ្នកអាចដំឡើងវាទាំងនេះដោយ៖\n",
|
||||
"\n",
|
||||
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"ggbeeswarm\"))`\n",
|
||||
"\n",
|
||||
"ជម្រើសមួយទៀត ស្គ្រីបខាងក្រោមនេះពិនិត្យថា តើអ្នកមានបណ្ណាល័យដែលចាំបាច់ដើម្បីបញ្ចប់មូឌុលនេះហើយទេ ហើយវានឹងដំឡើងបណ្ណាល័យក្នុងករណីវាពិបាកឃើញ។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
|
||||
"\n",
|
||||
"pacman::p_load(tidyverse, tidymodels, janitor, ggbeeswarm)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## **កំណត់សំណួរ**\n",
|
||||
"\n",
|
||||
"សម្រាប់គោលបំណងរបស់យើង យើងនឹងបញ្ចេញវាឲ្យជាជម្រើសពីរមាន: 'ពណ៌ស' ឬ 'មិនពណ៌ស'។ ក៏មានប្រភេទ 'ដែលមានរបារ' នៅក្នុងទិន្នន័យរបស់យើង ប៉ុន្តែមានករណីតិចប៉ុណ្ណោះ ដូច្នេះយើងមិនប្រើវាទេ។ វារលាយបាត់បង់បើយើងលុបតម្លៃទទេចេញពីទិន្នន័យ។\n",
|
||||
"\n",
|
||||
"> 🎃 ព័ត៌មានរីករាយ ម្តងពីម្តង យើងហៅពិដានពណ៌សថា 'ពិដានព្រាហ្ម', ព្រាហ្មមិនងាយស្រូបរមាំង ដូច្នេះវាមិនពេញនិយមដូចពិដានពណ៌ទឹកក្រូចទេ ប៉ុន្តែវាមើលទៅត្រជាក់! ដូច្នេះយើងអាចកែសម្រួលសំណួររបស់យើងថា៖ 'ព្រាហ្ម' ឬ 'មិនព្រាហ្ម' ក៏បាន។ 👻\n",
|
||||
"\n",
|
||||
"## **អំពីការវិលត្រឡប់លូជីស្ទិច**\n",
|
||||
"\n",
|
||||
"ការវិលត្រឡប់លូជីស្ទិចខុសពីការវិលត្រឡប់បន្ទាត់ ដែលអ្នកបានរៀនពីមុន លើកលែងមានប្រែប្រួលសំខាន់ខ្លះ។\n",
|
||||
"\n",
|
||||
"#### **ចាត់ថ្នាក់ពីរជម្រើស**\n",
|
||||
"\n",
|
||||
"ការវិលត្រឡប់លូជីស្ទិចមិនមានលក្ខណៈដូចការវិលត្រឡប់បន្ទាត់ទេ។ វាជាការព្យាករណ៍អំពី `ចំណាត់ការទ្វេចមحدد` (\"ពណ៌ទឹកក្រូចឬមិនមែនពណ៌ទឹកក្រូច\") ខណៈដែលអាចព្យាករណ៍បានជាមួយ `តម្លៃបន្តបន្ទាប់` នៅក្នុងការវិលត្រឡប់បន្ទាត់ ដូចជាករណីផ្អែកលើប្រភពដើមនៃពិដាន និងពេលវេលាកាប់ដាំ *តម្លៃរបស់វានឹងកើនឡើងប៉េកលើកមុន*។\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"### ចំណាត់ថ្នាក់ផ្សេងៗ\n",
|
||||
"\n",
|
||||
"មានប្រភេទការវិលត្រឡប់លូជីស្ទិចផ្សេងទៀត រួមមានលក្ខណៈពហុបុព្វ និងអ័រដីនាល:\n",
|
||||
"\n",
|
||||
"- **ពហុបុព្វ** ដែលមានចំណាត់ថ្នាក់ច្រើនជាងមួយ - \"ពណ៌ទឹកក្រូច ពណ៌ស និងដែលមានរបារ\"។\n",
|
||||
"\n",
|
||||
"- **អ័រដីនាល** ដែលមានចំណាត់ថ្នាក់តាមលំដាប់ ដែលមានប្រយោជន៍បើចង់តម្រៀបលទ្ធផលយ៉ាងមានទ្រឹស្តី ដូចជាពិដានរបស់យើងដែលតម្រៀបតាមទំហំដាច់ដោយឡែក (តូចខ្នាតតូចមធ្យមធំធំដល់ធំបំផុត)។\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"#### **អថេរមិនចាំបាច់ត្រូវត្រូវគ្នា**\n",
|
||||
"\n",
|
||||
"ចងចាំថាការវិលត្រឡប់បន្ទាត់ដំណើរការល្អជាមួយអថេរដែលមានទំនាក់ទំនងល្អបន្ថែមទៀត? ការវិលត្រឡប់លូជីស្ទិចវិញគឺផ្ទុយគ្នា - អថេរកុំពុំចាំបាច់ត្រូវគ្នាទេ។ នេះសមនឹងទិន្នន័យនេះដែលមានទំនាក់ទំនងខ្សោយបន្តិច។\n",
|
||||
"\n",
|
||||
"#### **អ្នកត្រូវការទិន្នន័យស្អាតច្រើន**\n",
|
||||
"\n",
|
||||
"ការវិលត្រឡប់លូជីស្ទិចនឹងផ្តល់លទ្ធផលមានភាពត្រឹមត្រូវប្រសើរជាងនេះបើអ្នកប្រើទិន្នន័យច្រើន។ ទិន្នន័យតូចរបស់យើងមិនល្អសម្រាប់បំណងនេះទេ ដូច្នេះសូមចងចាំរឿងនេះ។\n",
|
||||
"\n",
|
||||
"✅ សូមគិតថាទិន្នន័យប្រភេទណាដែលសមស្របសម្រាប់ការវិលត្រឡប់លូជីស្ទិច\n",
|
||||
"\n",
|
||||
"## កម្រិតហាត់ - រៀបចំទិន្នន័យ\n",
|
||||
"\n",
|
||||
"ចាប់ផ្តើម ជម្រះទិន្នន័យអោយបានស្អាតបន្តិច ដោយលុបតម្លៃទទេ និងជ្រើសរើសកូឡុំនៅខ្លះប៉ុណ្ណា៖\n",
|
||||
"\n",
|
||||
"1. បញ្ចូលកូដដូចខាងក្រោម៖\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Load the core tidyverse packages\n",
|
||||
"library(tidyverse)\n",
|
||||
"\n",
|
||||
"# Import the data and clean column names\n",
|
||||
"pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\") %>% \n",
|
||||
" clean_names()\n",
|
||||
"\n",
|
||||
"# Select desired columns\n",
|
||||
"pumpkins_select <- pumpkins %>% \n",
|
||||
" select(c(city_name, package, variety, origin, item_size, color)) \n",
|
||||
"\n",
|
||||
"# Drop rows containing missing values and encode color as factor (category)\n",
|
||||
"pumpkins_select <- pumpkins_select %>% \n",
|
||||
" drop_na() %>% \n",
|
||||
" mutate(color = factor(color))\n",
|
||||
"\n",
|
||||
"# View the first few rows\n",
|
||||
"pumpkins_select %>% \n",
|
||||
" slice_head(n = 5)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"អ្នកអាចតែងតែស្ទាក់មើល dataframe ថ្មីរបស់អ្នកបានជានិច្ច ដោយប្រើកម្មវិធី [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) ដូចខាងក្រោម៖\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"pumpkins_select %>% \n",
|
||||
" glimpse()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ចង់បញ្ជាក់ថាយើងនឹងធ្វើបញ្ហាកំណត់ចំណាត់ថ្នាក់ដោយប្រើទិន្នន័យបីណារីពិតប្រាកដៈ\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Subset distinct observations in outcome column\n",
|
||||
"pumpkins_select %>% \n",
|
||||
" distinct(color)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### ការមើលឃើញ - ផ្ទាំងប្រភេទ\n",
|
||||
"ឥឡូវនេះអ្នកបានបញ្ចូលទិន្នន័យម្ទេសម្តងទៀតហើយបានសម្អាតវាដើម្បីរក្សាទុកឈុតទិន្នន័យដែលមានអថេរច្រើនមួយចំនួន រួមមានពណ៌។ យើងចង់បង្ហាញទិន្នន័យនេះក្នុងសៀវភៅកំណត់ត្រាដោយប្រើបណ្ណាលិខិត ggplot។\n",
|
||||
"\n",
|
||||
"បណ្ណាលិខិត ggplot ផ្តល់ជម្រើសដ៏ល្អសម្រាប់ការមើលឃើញទិន្នន័យរបស់អ្នក។ ឧទាហរណ៍ អ្នកអាចប្រៀបធៀបទឹកប្រាក់ចែកចាយនៃទិន្នន័យសម្រាប់ Variety និង Color នីមួយៗក្នុងផ្ទាំងប្រភេទ។\n",
|
||||
"\n",
|
||||
"1. បង្កើតផ្ទាំងដូចនេះដោយប្រើមុខងារ geombar ដោយប្រើទិន្នន័យម្ទេសរបស់យើង ហើយកំណត់ការកំណត់ពណ៌សម្រាប់ប្រភេទម្ទេសនីមួយៗ (ទឹកក្រូច ឬ ស):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "python"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Specify colors for each value of the hue variable\n",
|
||||
"palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n",
|
||||
"\n",
|
||||
"# Create the bar plot\n",
|
||||
"ggplot(pumpkins_select, aes(y = variety, fill = color)) +\n",
|
||||
" geom_bar(position = \"dodge\") +\n",
|
||||
" scale_fill_manual(values = palette) +\n",
|
||||
" labs(y = \"Variety\", fill = \"Color\") +\n",
|
||||
" theme_minimal()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ដោយសង្កេតទិន្នន័យ អ្នកអាចឃើញថាតើទិន្នន័យពណ៌ទាក់ទងដូចម្តេចទៅនឹងប្រភេទ។ \n",
|
||||
"\n",
|
||||
"✅ នៅពេលមានគំនូសតាងប្រភេទនេះ តើអ្នកអាចរំពឹងទុកការស្វែងរកដែលមានអត្ថន័យអ្វីខ្លះ?\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### ការប្រមូលទិន្នន័យមុនកម្រិត៖ ការកូដលក្ខណៈពិសេស\n",
|
||||
"\n",
|
||||
"ឃ្លាំងទិន្នន័យទុក្ខប៉ូលប៊ីរបស់យើងមានតម្លៃខ្សែអក្សរសម្រាប់ជួរឈរទាំងអស់របស់វា។ ការធ្វើការជាមួយទិន្នន័យប្រភេទបញ្ជីគឺងាយស្រួលសម្រាប់មនុស្ស ប៉ុន្តែមិនសម្រាប់ម៉ាស៊ីនទេ។ អាល់ហ្គរីធម៍ការសិក្សាម៉ាស៊ីនដំណើរការល្អជាមួយលេខ។ ដូច្នេះហើយការកូដខ្លឹមសារជាជំហានសំខាន់ខ្លាំងក្នុងដំណាក់កាលការប្រមូលទិន្នន័យមុនកម្រិត ពីព្រោះវាអាចផ្លាស់ប្ដូរទិន្នន័យប្រភេទបញ្ជីទៅជាទិន្នន័យលេខបាន ដោយគ្មានការបាត់បង់ព័ត៌មានណាមួយឡើយ។ ការកូដល្អនាំឲ្យបង្កើតម៉ូដែលល្អបាន។\n",
|
||||
"\n",
|
||||
"សម្រាប់ការកូដលក្ខណៈពិសេស មានអ្នកកូដពីរប្រភេទសំខាន់ៗ៖\n",
|
||||
"\n",
|
||||
"1. អ្នកកូដលំដាប់៖ វាសមស្របសម្រាប់អថេរលំដាប់ ដែលជាអថេរបញ្ជីដែលទិន្នន័យរបស់ពួកវាមានលំដាប់ត្រឹមត្រូវ ដូចជា ជួរឈរ `item_size` ក្នុងឃ្លាំងទិន្នន័យរបស់យើង។ វាបង្កើតការផ្គូផ្គង ដែលប្រភេទនីមួយៗត្រូវបានតំណាងដោយលេខ ដែលជាលំដាប់នៃប្រភេទនៅក្នុងជួរឈរ។\n",
|
||||
"\n",
|
||||
"2. អ្នកកូដប្រភេទបញ្ជី៖ វាសមស្របសម្រាប់អថេរការដែលគ្មានលំដាប់ត្រឹមត្រូវ ដែលជាអថេរបញ្ជីដែលទិន្នន័យរបស់ពួកវាមិនមានលំដាប់ត្រឹមត្រូវ ដូចជាលក្ខណៈទាំងអស់ដែលខុសពី `item_size` នៅក្នុងឃ្លាំងទិន្នន័យរបស់យើង។ វាជាការកូដមួយ-កំឡុង (one-hot encoding) មានន័យថាប្រភេទនីមួយៗត្រូវបានតំណាងដោយជួរឈរកូដពីរ (binary column): អថេរកូដមានតម្លៃស្មើ 1 ប្រសិនបើទុក្ខប៉ូលប៊ីផ принадлежности ដល់ Variety នោះ និង 0 បើមិនទេ។\n",
|
||||
"\n",
|
||||
"Tidymodels ផ្តល់ជូនកញ្ចប់មួយទៀតដែលល្អ៖ [recipes](https://recipes.tidymodels.org/) - ជាកញ្ចប់សម្រាប់ការប្រមូលទិន្នន័យមុនកម្រិត។ យើងនឹងកំណត់ `recipe` ដែលបញ្ជាក់ថាជួរឈរព្យាករ (predictor columns) ទាំងអស់គួរត្រូវបានកូដទៅជាសំណុំលេខគត់, `prep` វាដើម្បីពិនិត្យគណនាភាគរយនិងស្ថិតិដែលត្រូវការដោយប្រតិទានណាមួយ ហើយចុងក្រោយ `bake` ដើម្បីអនុវត្តគណនាដល់ទិន្នន័យថ្មី។\n",
|
||||
"\n",
|
||||
"> ជាធម្មតា recipes ត្រូវបានប្រើជាឧបករណ៍ពិនិត្យមុនសម្រាប់ម៉ូដែល ដែលវាដាក់បញ្ជីថាតើជំហានអ្វីគួរត្រូវអនុវត្តទៅលើឃ្លាំងទិន្នន័យដើម្បីទទួលបានវាសម្រាប់ម៉ូដែល។ ក្នុងករណីនេះ វា **សូមផ្ដល់អនុសាសន៍យ៉ាងខ្លាំង** អោយអ្នកប្រើជា `workflow()` មួយជំនួសការប៉ាន់ស្មាន recipe ដោយដៃប្រើ prep និង bake។ យើងនឹងឃើញរឿងទាំងនេះឲ្យបានច្បាស់ក្នុងរយៈពេលឆាប់ៗនេះ។\n",
|
||||
">\n",
|
||||
"> ទោះយ៉ាងណាក៏ដោយ សព្វថ្ងៃយើងកំពុងប្រើ recipes + prep + bake ដើម្បីបញ្ជាក់ថាជំហានអ្វីគួរត្រូវអនុវត្តទៅលើឃ្លាំងទិន្នន័យ ដើម្បីទទួលបានវាសម្រាប់វិភាគទិន្នន័យ ហើយបន្ទាប់មកយកទិន្នន័យដែលបានប្រមូលទិន្នន័យមុនជាមួយជំហានអនុវត្តទាំងនោះ។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Preprocess and extract data to allow some data analysis\n",
|
||||
"baked_pumpkins <- recipe(color ~ ., data = pumpkins_select) %>%\n",
|
||||
" # Define ordering for item_size column\n",
|
||||
" step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n",
|
||||
" # Convert factors to numbers using the order defined above (Ordinal encoding)\n",
|
||||
" step_integer(item_size, zero_based = F) %>%\n",
|
||||
" # Encode all other predictors using one hot encoding\n",
|
||||
" step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE) %>%\n",
|
||||
" prep(data = pumpkin_select) %>%\n",
|
||||
" bake(new_data = NULL)\n",
|
||||
"\n",
|
||||
"# Display the first few rows of preprocessed data\n",
|
||||
"baked_pumpkins %>% \n",
|
||||
" slice_head(n = 5)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"✅ តើអត្ថប្រយោជន៍នៃការប្រើប្រាស់អ្នកបំលែងលេខរៀងសម្រាប់ជួរឈរជំនាន់ទំហំទំនិញមានអ្វីខ្លះ?\n",
|
||||
"\n",
|
||||
"### វិភាគទំនាក់ទំនងរវាងអថេរ\n",
|
||||
"\n",
|
||||
"ឥឡូវនេះដែលយើងបានដោះស្រាយទិន្នន័យរបស់យើងហើយ អាចវិភាគទំនាក់ទំនងរវាងលក្ខណៈពិសេស និងស្លាក ដើម្បីយល់ពីរបៀបដែលម៉ូដែលនឹងអាចទាយស្លាកបានល្អប៉ុណ្ណា ទៅតាមលក្ខណៈពិសេស។ វិធីធំៗសម្រាប់ធ្វើវិភាគប្រភេទនេះគឺការគូរបង្ហាញទិន្នន័យ។ \n",
|
||||
"យើងនឹងប្រើមុខងារ ggplot geom_boxplot_ ម្តងទៀត ដើម្បីបង្ហាញទំនាក់ទំនងរវាងទំហំទំនិញ ជម្លោះ និងពណ៌ក្នុងតារាងប្រភេទ។ ដើម្បីគូរទិន្នន័យបានល្អជាងមុន យើងនឹងប្រើជួរឈរទំហំទំនិញដែលបានបំលែងលេខរៀង ហើយជួរឈរជម្លោះដែលមិនបានបំលែង។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Define the color palette\n",
|
||||
"palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n",
|
||||
"\n",
|
||||
"# We need the encoded Item Size column to use it as the x-axis values in the plot\n",
|
||||
"pumpkins_select_plot<-pumpkins_select\n",
|
||||
"pumpkins_select_plot$item_size <- baked_pumpkins$item_size\n",
|
||||
"\n",
|
||||
"# Create the grouped box plot\n",
|
||||
"ggplot(pumpkins_select_plot, aes(x = `item_size`, y = color, fill = color)) +\n",
|
||||
" geom_boxplot() +\n",
|
||||
" facet_grid(variety ~ ., scales = \"free_x\") +\n",
|
||||
" scale_fill_manual(values = palette) +\n",
|
||||
" labs(x = \"Item Size\", y = \"\") +\n",
|
||||
" theme_minimal() +\n",
|
||||
" theme(strip.text = element_text(size = 12)) +\n",
|
||||
" theme(axis.text.x = element_text(size = 10)) +\n",
|
||||
" theme(axis.title.x = element_text(size = 12)) +\n",
|
||||
" theme(axis.title.y = element_blank()) +\n",
|
||||
" theme(legend.position = \"bottom\") +\n",
|
||||
" guides(fill = guide_legend(title = \"Color\")) +\n",
|
||||
" theme(panel.spacing = unit(0.5, \"lines\"))+\n",
|
||||
" theme(strip.text.y = element_text(size = 4, hjust = 0)) \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### ប្រើ plots រួមមួយ\n",
|
||||
"\n",
|
||||
"ព្រោះពណ៌ជាប្រភេទពីររបៀប (ស និង មិនស) វាត្រូវការពី '[វិធីជាច្រើនពិសេស](https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf)' ដើម្បីបង្ហាញភាព។\n",
|
||||
"\n",
|
||||
"សាកល្បង `swarm plot` ដើម្បីបង្ហាញចំណាត់ថ្នាក់នៃពណ៌ដោយទាក់ទងទៅនឹង item_size។\n",
|
||||
"\n",
|
||||
"យើងនឹងប្រើ [កញ្ចប់ ggbeeswarm](https://github.com/eclarke/ggbeeswarm) ដែលផ្តល់វិធីសាស្រ្តបង្កើត plots រចនាប័ទ្ម beeswarm ដោយប្រើ ggplot2។ Plots beeswarm ជាវិធីមួយនៃការបញ្ចាំងចំណុចដែលធម្មតានឹងគ្នាហើយធ្វើឲ្យវាធ្លាក់នៅជាមួយគ្នានៅជិតៗគ្នាមិនឲ្យគ្នាហែលឆ្ងាយ។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Create beeswarm plots of color and item_size\n",
|
||||
"baked_pumpkins %>% \n",
|
||||
" mutate(color = factor(color)) %>% \n",
|
||||
" ggplot(mapping = aes(x = color, y = item_size, color = color)) +\n",
|
||||
" geom_quasirandom() +\n",
|
||||
" scale_color_brewer(palette = \"Dark2\", direction = -1) +\n",
|
||||
" theme(legend.position = \"none\")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ឥឡូវនេះឥឡូវនេះយើងមានគំនិតអំពីទំនាក់ទំនងរវាងប្រភេទទំនាស់ពីរក្រុមនៃពណ៌ និងក្រុមធំទូលាយនៃទំហំ មកសូមស្វែងយល់អំពី logistic regression ដើម្បីកំណត់ពណ៌ស្មេចដែលអាចមានបាន។\n",
|
||||
"\n",
|
||||
"## សង់ម៉ូដែលរបស់អ្នក\n",
|
||||
"\n",
|
||||
"ជ្រើសរើសអថេរដែលអ្នកចង់ប្រើនៅក្នុងម៉ូដែលចាត់ថ្នាក់របស់អ្នក ហើយបំបែកទិន្នន័យទៅជាសំណុំបណ្ដុះបណ្ដាល និងសំណុំសាកល្បង។ [rsample](https://rsample.tidymodels.org/), គឺជាកញ្ចប់ក្នុង Tidymodels, ផ្តល់ឱ្យនូវមូលដ្ឋានគ្រឹះសម្រាប់ការបំបែកទិន្នន័យ និងការបង្កើតសំណុំឡើងវិញបានយ៉ាងមានប្រសិទ្ធភាព។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Split data into 80% for training and 20% for testing\n",
|
||||
"set.seed(2056)\n",
|
||||
"pumpkins_split <- pumpkins_select %>% \n",
|
||||
" initial_split(prop = 0.8)\n",
|
||||
"\n",
|
||||
"# Extract the data in each split\n",
|
||||
"pumpkins_train <- training(pumpkins_split)\n",
|
||||
"pumpkins_test <- testing(pumpkins_split)\n",
|
||||
"\n",
|
||||
"# Print out the first 5 rows of the training set\n",
|
||||
"pumpkins_train %>% \n",
|
||||
" slice_head(n = 5)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"🙌 ឥឡូវនេះ យើងបានត្រៀមខ្លួនរួចរាល់ក្នុងការបណ្តុះម៉ូឌែលដោយតម្រឹមលក្ខណៈបណ្តុះបណ្តាលទៅកាន់ស្លាកបណ្តុះបណ្តាល (ពណ៌) ។\n",
|
||||
"\n",
|
||||
"យើងនឹងចាប់ផ្តើមដោយបង្កើតវត្ថុវិធីដែលបញ្ជាក់ពីជំហានកំណត់មុនដែលគួរត្រូវបានអនុវត្តលើទិន្នន័យរបស់យើងដើម្បីធ្វើឲ្យវាប្រៀបប្រដាប់សម្រាប់ការដំណើរការ ម៉ូឌែល គឺ៖ ការរុំបញ្ចូលអថេរក្រុមជាគុណភាពទៅជាសំណុំចំនួនគត់។ ដូចជា `baked_pumpkins` យើងបង្កើតវត្ថុវិធី `pumpkins_recipe` ប៉ុន្តែមិនធ្វើការ `prep` និង `bake` មែនទែន ព្រោះវានឹងត្រូវបានបញ្ចូលក្នុងលំហូរ ការចុះបញ្ជី អ្នកនឹងមើលឃើញវាក្នុងជំហានមួយចំនួនបន្ទាប់ពីនេះ។\n",
|
||||
"\n",
|
||||
"មានវិធីជាច្រើនក្នុងការបញ្ជាក់ម៉ូឌែល logistic regression ក្នុង Tidymodels។ សូមមើល `?logistic_reg()` សម្រាប់ពេលនេះ យើងនឹងបញ្ជាក់ម៉ូឌែល logistic regression តាមរយៈម៉ូទ័រ `stats::glm()` ដែលជាគំរូលំនាំដើម។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Create a recipe that specifies preprocessing steps for modelling\n",
|
||||
"pumpkins_recipe <- recipe(color ~ ., data = pumpkins_train) %>% \n",
|
||||
" step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n",
|
||||
" step_integer(item_size, zero_based = F) %>% \n",
|
||||
" step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE)\n",
|
||||
"\n",
|
||||
"# Create a logistic model specification\n",
|
||||
"log_reg <- logistic_reg() %>% \n",
|
||||
" set_engine(\"glm\") %>% \n",
|
||||
" set_mode(\"classification\")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ឥឡូវនេះ យើងមានរូបមន្តមួយ និងការបញ្ជាក់ម៉ូដែលមួយហើយ យើងត្រូវការស្វែងរកវិធីមួយដើម្បីបញ្ចូលពួកវាទាំងពីរចូលក្នុងវត្ថុមួយដែលនឹងរៀបចំទិន្នន័យជាមុន (prep+bake នៅពីក្រោយឆាក), ដាក់ម៉ូដែលលើទិន្នន័យដែលបានរៀបចំ និងក៏អនុញ្ញាតឱ្យមានសកម្មភាពបន្ទាប់ម៉ាផង។\n",
|
||||
"\n",
|
||||
"នៅក្នុង Tidymodels វត្ថុងាយស្រួលនេះហៅថា [`workflow`](https://workflows.tidymodels.org/) ហើយវាធ្វើការរក្សាទុកធាតុម៉ូដែលរបស់អ្នកយ៉ាងងាយស្រួល។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Bundle modelling components in a workflow\n",
|
||||
"log_reg_wf <- workflow() %>% \n",
|
||||
" add_recipe(pumpkins_recipe) %>% \n",
|
||||
" add_model(log_reg)\n",
|
||||
"\n",
|
||||
"# Print out the workflow\n",
|
||||
"log_reg_wf\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"បន្ទាប់ពីបាន *បញ្ជាក់* workflow មួយ model អាចត្រូវបាន `បណ្តុះបណ្តាល` ដោយប្រើមុខងារ [`fit()`](https://tidymodels.github.io/parsnip/reference/fit.html)។ workflow នឹងវាយតម្លៃមុខងារ recipe និង preprocess ទិន្នន័យមុនការបណ្តុះបណ្តាល ដូច្នេះយើងមិនចាំបាច់ត្រូវធ្វើដៃដោយប្រើ prep និង bake ទេ។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Train the model\n",
|
||||
"wf_fit <- log_reg_wf %>% \n",
|
||||
" fit(data = pumpkins_train)\n",
|
||||
"\n",
|
||||
"# Print the trained workflow\n",
|
||||
"wf_fit\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ការបង្ហាញម៉ូដែលបោះផ្សាយអំពីសមាមាត្រដែលបានរៀនក្នុងអំឡុងពេលបណ្តុះបណ្តាល។\n",
|
||||
"\n",
|
||||
"ឥឡូវនេះយើងបានបណ្តុះបណ្តាលម៉ូដែលដោយប្រើទិន្នន័យបណ្តុះបណ្តាលហើយ យើងអាចធ្វើការទស្សន៍ទាយលើទិន្នន័យសាកល្បងដោយប្រើ [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html)។ បង្វៀងចាប់ផ្តើមដោយប្រើម៉ូដែលនេះដើម្បីទស្សន៍ទាយស្លាកសញ្ញាសម្រាប់សំណុំសាកល្បងរបស់យើង និងប្រភាពសម្រាប់រាល់ស្លាក។ នៅពេលដែលប្រភាពច្រើនជាង 0.5 ការទស្សន៍ទាយថ្នាក់គឺជា `WHITE` ប្រសិនបើមិនដូច្នោះទេ គឺ `ORANGE`។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Make predictions for color and corresponding probabilities\n",
|
||||
"results <- pumpkins_test %>% select(color) %>% \n",
|
||||
" bind_cols(wf_fit %>% \n",
|
||||
" predict(new_data = pumpkins_test)) %>%\n",
|
||||
" bind_cols(wf_fit %>%\n",
|
||||
" predict(new_data = pumpkins_test, type = \"prob\"))\n",
|
||||
"\n",
|
||||
"# Compare predictions\n",
|
||||
"results %>% \n",
|
||||
" slice_head(n = 10)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ឆ្លើយបានល្អណាស់! នេះផ្តល់ការយល់ដឹងបន្ថែមពីរបៀបដែល logistic regression ធ្វើការ។\n",
|
||||
"\n",
|
||||
"### ការយល់ដឹងកាន់តែប្រសើរ តាមរយៈមាទ្រីកខុសគ្នា\n",
|
||||
"\n",
|
||||
"ការប្រៀបធៀបទាំងអស់នៃការព្យាករណ៍ជាមួយតម្លៃ \"ពិត\" ក្នុងការពិតមិនមែនជាវិធីមានប្រសិទ្ធភាពសម្រាប់កំណត់ថាតើម៉ូដែលព្យាករណ៍បានល្អប៉ុណ្ណា។ គ្រប់គ្រាន់ហើយ Tidymodels មានជំនាញបន្ថែមមួយចំនួន៖ [`yardstick`](https://yardstick.tidymodels.org/) - ជាប៉ាកេជ្យដែលប្រើសម្រាប់វាស់ប្រសិទ្ធភាពនៃម៉ូដែលប្រើគ្រឿងសម្រួលសមត្ថភាព។\n",
|
||||
"\n",
|
||||
"គ្រឿងសម្រួលសមត្ថភាពមួយដែលទាក់ទងនឹងបញ្ហាការបែងចែកគឺ [`confusion matrix`](https://wikipedia.org/wiki/Confusion_matrix)។ មាទ្រីកខុសគ្នានេះពិពណ៌នាថាតើម៉ូដែលបែងចែកមានសមត្ថភាពល្អយ៉ាងដូចម្តេច។ មាទ្រីកខុសគ្នាដាក់បញ្ជីចំនួនឧទាហរណ៍នីមួយៗក្នុងថ្នាក់មួយត្រូវបានបែងចែកបានត្រឹមត្រូវដោយម៉ូដែលប៉ុន្មាន។ ក្នុងករណីរបស់យើង វានឹងបង្ហាញអ្នកថា តើមានប៊ឺរមាសពណ៌ទឹកដោះគោប៉ុន្មានដែលបានបែងចែកថាជាប៊ឺរមាសពណ៌ទឹកដោះគោ និងប៊ឺរស មួយពណ៌សប៉ុន្មានដែលបានបាំងចែកថាជាប៊ឺរស ពណ៌ស; មាទ្រីកខុសគ្នាក៏បង្ហាញអ្នកថា ប៊ឺរដែលបានបែងចែកទៅក្នុងប្រភេទដែលមិនត្រឹមត្រូវប៉ុណ្ណា។\n",
|
||||
"\n",
|
||||
"មុខងារ [**`conf_mat()`**](https://tidymodels.github.io/yardstick/reference/conf_mat.html) ពី yardstick គណនាការប្រមូលផ្ដុំគ្នានៃថ្នាក់ដែលបានសង្កេត និងថ្នាក់ដែលបានព្យាករណ៍។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Confusion matrix for prediction results\n",
|
||||
"conf_mat(data = results, truth = color, estimate = .pred_class)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"អនុវត្តន៍សន្ទស្សន៍ច្របូកច្របល់។ គំរូរបស់យើងត្រូវបានស្នើឲ្យចាត់ថ្នាក់កន្ទុយកំណាត់មួយចំនួនចេញជាប្រភេទពីរប៊ីណារី គឺ ប្រភេទ `ស` និងប្រភេទ `មិនស`\n",
|
||||
"\n",
|
||||
"- ប្រសិនបើគំរូរបស់អ្នកទាយថាកន្ទុយកំណាត់គឺស ហើយវាគឺជាប្រភេទ 'ស' ក្នុងការពិត ខ្លួនយើងហៅវាថា `ពិតវិជ្ជមាន` ដែលបង្ហាញដោយលេខខាងឆ្វេងលើ។\n",
|
||||
"\n",
|
||||
"- ប្រសិនបើគំរូរបស់អ្នកទាយថាកន្ទុយកំណាត់គឺមិនស ហើយវាគឺជាប្រភេទ 'ស' ក្នុងការពិត ខ្លួនយើងហៅវាថា `មិនពិតអវិជ្ជមាន` ដែលបង្ហាញដោយលេខខាងឆ្វេងខាងក្រោម។\n",
|
||||
"\n",
|
||||
"- ប្រសិនបើគំរូរបស់អ្នកទាយថាកន្ទុយកំណាត់គឺស ហើយវាគឺជាប្រភេទ 'មិនស' ក្នុងការពិត ខ្លួនយើងហៅវាថា `មិនពិតវិជ្ជមាន` ដែលបង្ហាញដោយលេខខាងស្ដាំលើ។\n",
|
||||
"\n",
|
||||
"- ប្រសិនបើគំរូរបស់អ្នកទាយថាកន្ទុយកំណាត់គឺមិនស ហើយវាគឺជាប្រភេទ 'មិនស' ក្នុងការពិត ខ្លួនយើងហៅវាថា `ពិតអវិជ្ជមាន` ដែលបង្ហាញដោយលេខខាងស្ដាំខាងក្រោម។\n",
|
||||
"\n",
|
||||
"| Truth |\n",
|
||||
"|:-----:|\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"| | | |\n",
|
||||
"|---------------|--------|-------|\n",
|
||||
"| **Predicted** | ស | ទឹកក្រូច |\n",
|
||||
"| ស | TP | FP |\n",
|
||||
"| ទឹកក្រូច | FN | TN |\n",
|
||||
"\n",
|
||||
"ដូចដែលអ្នកអាចគិតថាវាគឺល្អប្រសើរជាងក្នុងការមានចំនួននៅក្នុង true positives និង true negatives ធំបំផុត និងមាន false positives និង false negatives តិចបំផុត ដែលបង្ហាញថាគំរូមានការអនុវត្តល្អជាង។\n",
|
||||
"\n",
|
||||
"សន្ទស្សន៍ច្របូកច្របល់មានប្រយោជន៍ព្រោះវាបង្កើតទៅរកមាត្រដ្ឋានផ្សេងទៀតដែលអាចជួយយើងប៉ាន់ប្រាក់បានល្អប្រសើរជាងអំពីការអនុវត្តន៍នៃគំរូចាត់ថ្នាក់។ មកមើលខ្លះៗពីវា៖\n",
|
||||
"\n",
|
||||
"🎓 Precision: `TP/(TP + FP)` កំណត់ថាជាភាគរយនៃការទាយថាជាវិជ្ជមានដែលពិតជាវិជ្ជមាន។ ក៏ត្រូវបានហៅថា [positive predictive value](https://en.wikipedia.org/wiki/Positive_predictive_value \"Positive predictive value\")\n",
|
||||
"\n",
|
||||
"🎓 Recall: `TP/(TP + FN)` កំណត់ថាជាភាគរយនៃលទ្ធផលវិជ្ជមានក្នុងចំណោមចំនួននៃគំរូដែលពិតជាវិជ្ជមាន។ ក៏ត្រូវបានគេស្គាល់ថា `sensitivity`។\n",
|
||||
"\n",
|
||||
"🎓 Specificity: `TN/(TN + FP)` កំណត់ថាជាភាគរយនៃលទ្ធផលអវិជ្ជមានក្នុងចំណោមចំនួននៃគំរូដែលពិតជាអវិជ្ជមាន។\n",
|
||||
"\n",
|
||||
"🎓 Accuracy: `TP + TN/(TP + TN + FP + FN)` ភាគរយនៃស្លាកដែលបានទាយបានត្រឹមត្រូវសម្រាប់គំរូមួយ។\n",
|
||||
"\n",
|
||||
"🎓 F Measure: ជាមធ្យមគតិដូនទម្ងន់រវាង precision និង recall ដែលល្អបំផុតគឺ 1 ហើយអាក្រក់បំផុតគឺ 0។\n",
|
||||
"\n",
|
||||
"មកគណនាមាត្រដ្ឋានទាំងនេះគ្នាដូរ!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Combine metric functions and calculate them all at once\n",
|
||||
"eval_metrics <- metric_set(ppv, recall, spec, f_meas, accuracy)\n",
|
||||
"eval_metrics(data = results, truth = color, estimate = .pred_class)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## ការមើលឃើញឆ្លងបន្ទាត់ ROC នៃម៉ូដែលនេះ\n",
|
||||
"\n",
|
||||
"មកធ្វើការមើលឃើញមួយទៀតដើម្បីឃើញអ្វីដែលហៅថា [`ROC curve`](https://en.wikipedia.org/wiki/Receiver_operating_characteristic):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Make a roc_curve\n",
|
||||
"results %>% \n",
|
||||
" roc_curve(color, .pred_ORANGE) %>% \n",
|
||||
" autoplot()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ROC curves តែងត្រូវបានប្រើសម្រាប់ទទួលបានទិដ្ឋភាពនៃលទ្ធផលនៃម៉ាស៊ីនចាត់ថ្នាក់មួយដោយពិចារណាពីចំណុចពិតវិជ្ជមានប្រៀបធៀបនឹងចំណុចមិនពិតវិជ្ជមាន។ ROC curves ជាទូទៅមានអត្រាចំណុចវិជ្ជមានពិត / ការពិសោធន៍លើ Y axis និងអត្រាចំណុចវិជ្ជមានមិនពិត / 1-ភាពជាក់លាក់លើ X axis។ ដូចនេះ, ពហុភាពរបស់ខ្សែនិងកន្លែងរវាងបន្ទាត់កណ្តាលនិងខ្សែកោងមានសារៈសំខាន់: អ្នកចង់បានខ្សែកោងដែលឡើងខ្ពស់លឿនហើយឆ្លងកាត់បន្ទាត់។ ក្នុងករណីរបស់យើងមានចំណុចវិជ្ជមានមិនពិតមុនសិន រួចបន្ទាត់ឡើងខ្ពស់ហើយឆ្លងកាត់យ៉ាងត្រឹមត្រូវ។\n",
|
||||
"\n",
|
||||
"ចុងក្រោយនេះ មកប្រើ `yardstick::roc_auc()` ដើម្បីគណនាតំបន់ក្រោមខ្សែកោងពិត។ មួយវិធីក្នុងការពន្យល់ AUC គឺជាភាពមាននៅក្នុងម៉ូដែលថាលំដាប់នៃឧទាហរណ៍វិជ្ជមានចៃដន្យខ្ពស់ជាងឧទាហរណ៍អវិជ្ជមានចៃដន្យ។\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"vscode": {
|
||||
"languageId": "r"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Calculate area under curve\n",
|
||||
"results %>% \n",
|
||||
" roc_auc(color, .pred_ORANGE)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"លទ្ធផលស្ថិតនៅជុំវិញ `0.975`។ ដោយសារតែ AUC មានជួរពី 0 ដល់ 1 អ្នកចង់បានពិន្ទុធំ មកព្រោះម៉ូដែលដែលត្រឹមត្រូវ ១០០% ក្នុងការទុក្ខលំបាករបស់វានឹងមាន AUC ស្មើ 1; ក្នុងករណីនេះ ម៉ូដែលគឺ *ល្អណាស់*។\n",
|
||||
"\n",
|
||||
"នៅមេរៀនក្នុងអនាគតអំពីការបែងចែក ប្រភេទ អ្នកនឹងរៀនពីរបៀបធ្វើឲ្យពិន្ទុរបស់ម៉ូដែលរបស់អ្នកប្រសើរឡើង (ដូចជាការដោះស្រាយទិន្នន័យមិនស្មើគ្នានៅក្នុងករណីនេះ)។\n",
|
||||
"\n",
|
||||
"## 🚀 បញ្ញាកchallenge\n",
|
||||
"\n",
|
||||
"មានច្រើនអ្វីដែលត្រូវរំលេចទៀតទាក់ទងនឹង logistic regression! ប៉ុន្តែ វិធីល្អបំផុតក្នុងការរៀនគឺការសាកល្បង។ រកឃើញឧបករណ៍ទិន្នន័យមួយដែលសមស្របសម្រាប់ការវិភាគប្រភេទនេះ ហើយសង់ម៉ូដែលជាមួយវា។ តើអ្នកបានរៀនអ្វីខ្លះ? គំនិត៖ ព្យាយាមប្រើ [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) សម្រាប់ឧបករណ៍ទិន្នន័យដែលគួរឱ្យចាប់អារម្មណ៍។\n",
|
||||
"\n",
|
||||
"## ការត្រួតពិនិត្យ & ការសិក្សាឯករាជ្យ\n",
|
||||
"\n",
|
||||
"អានទំព័រដើមពីរបីនៃ [ឯកសារនេះពី Stanford](https://web.stanford.edu/~jurafsky/slp3/5.pdf) អំពីការប្រើប្រាស់ជាក់ស្តែងរបស់ logistic regression។ គិតអំពីភារកិច្ចដែលសមស្របសម្រាប់ប្រភេទ regression តែមួយ ឬមួយផ្សេងទៀតដែលយើងបានសិក្សាពីមុនដល់ពេលនេះ។ តើអ្វីជា វិធីល្អបំផុត?\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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"anaconda-cloud": "",
|
||||
"kernelspec": {
|
||||
"display_name": "R",
|
||||
"langauge": "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"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 1
|
||||
}
|
||||
@ -0,0 +1,47 @@
|
||||
# ម៉ូដែលថយចុះសម្រាប់ការរៀនម៉ាស៊ីន
|
||||
## ប្រធានស្រុក: ម៉ូដែលថយចុះសម្រាប់តម្លៃដង្កូវនៅអាមេរិកខាងជើង 🎃
|
||||
|
||||
នៅអាមេរិកខាងជើង ដង្កូវគេជាញឹកញាប់ដាក់ញញឹមគួរឱ្យភ័យសម្រាប់បុណ្យហាឡូវីន។ យើងមកស្វែងយល់បន្ថែមអំពីបន្លែអស្ចារ្យទាំងនេះ!
|
||||
|
||||

|
||||
> រូបថតដោយ <a href="https://unsplash.com/@teutschmann?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Beth Teutschmann</a> នៅលើ <a href="https://unsplash.com/s/photos/jack-o-lanterns?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
|
||||
|
||||
## អ្វីដែលអ្នកនឹងរៀន
|
||||
|
||||
[](https://youtu.be/5QnJtDad4iQ "Regression Introduction video - Click to Watch!")
|
||||
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូណែនាំខ្លីអំពីមេរៀននេះ
|
||||
|
||||
មេរៀននៅផ្នែកនេះគ្របដណ្តប់ពីប្រភេទនៃការថយចុះក្នុងបរិបទនៃការរៀនម៉ាស៊ីន។ ម៉ូដែលថយចុះអាចជួយកំណត់ _ទំនាក់ទំនង_ រវាងអថេរ។ ម៉ូដែលប្រភេទនេះអាចទាយទានតម្លៃដូចជា ប្រវែង សីតុណ្ហភាព ឬអាយុ ដូច្នេះបង្ហាញទំនាក់ទំនងរវាងអថេរនាពេលវេលានេះដែលវាធ្វើវិភាគទិន្នន័យ។
|
||||
|
||||
ក្នុងស៊េរីមេរៀននេះ អ្នកនឹងស្វែងយល់ពីភាពខុសគ្នារវាងការថយចុះបន្ទាត់និងការថយចុះលូជីស្ទិក ហើយពេលណាដែលអ្នកគួរជ្រើសរើសមួយពីរ។
|
||||
|
||||
[](https://youtu.be/XA3OaoW86R8 "ML for beginners - Introduction to Regression models for Machine Learning")
|
||||
|
||||
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូខ្លីណែនាំម៉ូដែលថយចុះ។
|
||||
|
||||
ក្នុងក្រុមមេរៀននេះ អ្នកនឹងត្រូវរៀបចំដើម្បីចាប់ផ្តើមបំពេញភារកិច្ចការរៀនម៉ាស៊ីន រួមមានការកំណត់ Visual Studio Code ដើម្បីគ្រប់គ្រងសៀវភៅកំណត់ត្រា ដែលជាបរិស្ថានទូទៅសម្រាប់អ្នកវិទ្យាសាស្ត្រទិន្នន័យ។ អ្នកនឹងស្វែងយល់អំពី Scikit-learn ដែលជាបណ្ណាល័យសម្រាប់ការរៀនម៉ាស៊ីន ហើយអ្នកនឹងបង្កើតម៉ូដែលដំបូងរបស់អ្នក អាប់ផោគខណៈម៉ូដែលថយចុះនៅក្នុងជំពូកនេះ។
|
||||
|
||||
> មានឧបករណ៍លឿនទាបកូដដែលមានប្រយោជន៍អាចជួយអ្នករៀនអំពីការប្រើប្រាស់ម៉ូដែលថយចុះ។ សូមសាកល្បង [Azure ML សម្រាប់ភារកិច្ចនេះ](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
|
||||
|
||||
### មេរៀន
|
||||
|
||||
1. [ឧបករណ៍នៃការការជួញដូរ](1-Tools/README.md)
|
||||
2. [ការគ្រប់គ្រងទិន្នន័យ](2-Data/README.md)
|
||||
3. [ការថយចុះបន្ទាត់និងពហុបន្ទាត់](3-Linear/README.md)
|
||||
4. [ការថយចុះលូជីស្ទិក](4-Logistic/README.md)
|
||||
|
||||
---
|
||||
### អនុញ្ញាតឲ្យរំពឹងទុក
|
||||
|
||||
"ML with regression" ត្រូវបានសរសេរជាមួយនូវ ♥️ ដោយ [Jen Looper](https://twitter.com/jenlooper)
|
||||
|
||||
♥️ អ្នកចូលរួមសំណួរមានរួមទាំង: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) និង [Ornella Altunyan](https://twitter.com/ornelladotcom)
|
||||
|
||||
ទិន្នន័យដង្កូវត្រូវបានណែនាំដោយ [គម្រោងនេះនៅ Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices) ហើយទិន្នន័យរបស់វាត្រូវបានដកស្រង់ពី [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) ដែលចែកចាយដោយក្រសួងកសិកម្មសហរដ្ឋអាមេរិក។ យើងបានបន្ថែមចំណុចខ្លះៗជុំវិញពណ៌ដោយផ្អែកលើប្រភេទដូច្នេះដើម្បីធ្វើអោយការចែកចាយស្មើគ្នា។ ទិន្នន័យនេះគឺនៅក្នុងដែនសាធារណៈ។
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការសំរាក**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយវិញ្ញាណបច្ចេកវិទ្យាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំប្រឹងប្រែងដើម្បីភាពជាក់ស្តែង សូមយល់ថា ការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬអកុសលភាព ។ ឯកសារដើមនៅភាសាជាតិសុទ្ធគួរត្រូវបានគិតជាឯកសារដើមដែលមានសុពលភាពខ្ពស់ជាងគេ ។ សម្រាប់ព័ត៌មានសំខាន់ៗ ការបកប្រែដោយមនុស្សវិជ្ជាជីវៈត្រូវបានណែនាំ ។ យើងមិនទទួលខុសត្រូវចំពោះការកើតមានការយល់ច្រឡំ ឬការបកស្រាយខុសៗ ដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះដោយឡែកទេ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,352 @@
|
||||
# បង្កើតកម្មវិធីវេបសាយដើម្បីប្រើម៉ូដែល ML
|
||||
|
||||
នៅក្នុងមេរៀននេះ អ្នកនឹងបណ្តុះបណ្តាលម៉ូដែល MLលើទិន្នន័យមួយដែលមកពីពិភពលោកខាងក្រៅ៖ _ការមើលឃើញ UFO លើរយៈពេលមួយសតវត្សที่ผ่านมา_ ដែលបានយកពីមូលដ្ឋានទិន្នន័យ NUFORC។
|
||||
|
||||
អ្នកនឹងរៀន៖
|
||||
|
||||
- របៀប 'pickle' ម៉ូដែលបានបណ្តុះបណ្តាល
|
||||
- របៀបប្រើម៉ូដែលនោះក្នុងកម្មវិធី Flask
|
||||
|
||||
យើងនឹងបន្ដប្រើកំណត់ត្រាដើម្បីសម្អាតទិន្នន័យ និងបណ្តុះបណ្តាលម៉ូដែលរបស់យើង ប៉ុន្តែអ្នកអាចយកដំណើរការនេះទៅជំហានបន្ថែម ដោយស្វែងយល់ពីរបៀបប្រើម៉ូដែល 'នៅតាមធម្មជាតិ' និយាយម្នាដូចជា នៅក្នុងកម្មវិធីវេបសាយ។
|
||||
|
||||
ដើម្បីធ្វើនេះ អ្នកត្រូវបង្កើតកម្មវិធីវេបសាយដោយប្រើ Flask។
|
||||
|
||||
## [សំណួរមុនមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
## ការបង្កើតកម្មវិធី
|
||||
|
||||
មានវិធីជាច្រើនក្នុងការបង្កើតកម្មវិធីវេបសាយសម្រាប់ប្រើម៉ូដែលម៉ាស៊ីនរៀន។ វិធានាស្ថាបត្យកម្មវេបសាយរបស់អ្នកអាចមានឥទ្ធិពលលើរបៀបដែលម៉ូដែលរបស់អ្នកត្រូវបានបណ្តុះបណ្តាល។ សូមនិយាយថាអ្នកកំពុងធ្វើការនៅក្នុងអាជីវកម្មមួយ ដែលក្រុមវិទ្យាសាស្រ្តទិន្នន័យបានបណ្តុះបណ្តាលម៉ូដែលដែលពួកគេចង់ឱ្យអ្នកប្រើនៅក្នុងកម្មវិធីមួយ។
|
||||
|
||||
### ពិចារណា
|
||||
|
||||
មានសំណួរច្រើនដែលអ្នកត្រូវសួរ៖
|
||||
|
||||
- **វាជាកម្មវិធីវេបសាយឬកម្មវិធីចល័ត?** ប្រសិនបើអ្នកកំពុងបង្កើតកម្មវិធីចល័ត ឬត្រូវប្រើម៉ូដែលក្នុងបរិបទ IoT អ្នកអាចប្រើ [TensorFlow Lite](https://www.tensorflow.org/lite/) ហើយប្រើម៉ូដែលក្នុងកម្មវិធី Android ឬ iOS ។
|
||||
- **ម៉ូដែលនឹងផ្ទុកនៅកន្លែងណា?** នៅក្នុងពពកឬក្នុងមូលដ្ឋានក្នុងតំបន់ ?
|
||||
- **គាំទ្របច្ចេកវិទ្យាឯកតា។** តើកម្មវិធីត្រូវដំណើរការបន្តរពេលអត់ចូលបណ្ដាញរឺទេ?
|
||||
- **បច្ចេកវិទ្យាអ្វីដែលបានប្រើបណ្តុះបណ្តាលម៉ូដែល?** បច្ចេកវិទ្យាត្រូវបានជ្រើសអាចមានឥទ្ធិពលលើឧបករណ៍ដែលអ្នកត្រូវប្រើ។
|
||||
- **ប្រើ TensorFlow។** ប្រសិនបើអ្នកកំពុងបណ្តុះបណ្តាលម៉ូដែលដោយប្រើ TensorFlow ជាឧទាហរណ៍ អេកូសុីស្តែមនោះផ្តល់ជូនសមត្ថភាពបម្លែងម៉ូដែល TensorFlow សម្រាប់ប្រើនៅក្នុងកម្មវិធីវេបដោយប្រើ [TensorFlow.js](https://www.tensorflow.org/js/)។
|
||||
- **ប្រើ PyTorch។** ប្រសិនបើអ្នកកំពុងបង្កើតម៉ូដែលដោយប្រើបណ្ណាល័យដូចជា [PyTorch](https://pytorch.org/), អ្នកអាចនាំចេញវាទៅទ្រង់ទ្រាយ [ONNX](https://onnx.ai/) (Open Neural Network Exchange) សម្រាប់ប្រើនៅក្នុងកម្មវិធីវេប JavaScript ដែលអាចប្រើ [Onnx Runtime](https://www.onnxruntime.ai/)បាន។ ជម្រើសនេះនឹងត្រូវស្វែងរកនៅមេរៀនខាងមុខសម្រាប់ម៉ូដែលបណ្តុះបណ្តាលដោយ Scikit-learn។
|
||||
- **ប្រើ Lobe.ai ឬ Azure Custom Vision។** ប្រសិនបើអ្នកកំពុងប្រើប្រព័ន្ធ ML SaaS (Software as a Service) ដូចជា [Lobe.ai](https://lobe.ai/) ឬ [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) ដើម្បីបណ្តុះបណ្តាលម៉ូដែល ប្រព័ន្ធនេះផ្តល់វិធីសាស្រ្តនាំចេញម៉ូដែលសម្រាប់វេទិកាច្រើន រួមមានការបង្កើត API ផ្ទាល់ខ្លួនសម្រាប់ស្វែងរកក្នុងពពកដោយកម្មវិធីអនឡាញរបស់អ្នក។
|
||||
|
||||
អ្នកក៏មានឱកាសបង្កើតកម្មវិធីវេប Flask ពេញលេញមួយដែលអាចបណ្តុះបណ្តាលម៉ូដែលដោយផ្ទាល់ក្នុងកម្មវិធីរុករកវេបផងដែរ។ នេះក៏អាចធ្វើបានដោយប្រើ TensorFlow.js នៅក្នុងបរិបទ JavaScript។
|
||||
|
||||
សម្រាប់គោលបំណងរបស់យើង ដោយសារយើងបានធ្វើការងារជាមួយកំណត់ត្រាគោលបំណង Python, យើងនឹងស្វែងយល់ពីជំហានដែលត្រូវធ្វើ ដើម្បីនាំចេញម៉ូដែលដែលបានបណ្តុះបណ្តាលពីកំណត់ត្រា ចេញទៅទ្រង់ទ្រាយដែលអាចអានបានដោយកម្មវិធីវេបដែលបានស្តាប់ដោយ Python។
|
||||
|
||||
## ឧបករណ៍
|
||||
|
||||
សម្រាប់ភារកិច្ចនេះ អ្នកត្រូវការឧបករណ៍ពីរគឺ Flask និង Pickle ដែលទាំងពីររត់លើ Python។
|
||||
|
||||
✅ Flask គឺជាអ្វី? និយាយថា 'micro-framework' ដោយអ្នកបង្កើតវា, Flask ផ្តល់លក្ខណៈមូលដ្ឋាននៃ framework សម្រាប់វេបដោយប្រើ Python និងម៉ាស៊ីនផ្សំទំព័រដើម្បីបង្កើតទំព័រវេប។ សូមមើល [មូឌុលរៀននេះ](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) ដើម្បីហ្វឹកហាត់ការបង្កើតជាមួយ Flask។
|
||||
|
||||
✅ Pickle គឺជាអ្វី? Pickle 🥒 គឺជាម៉ូឌុល Python មួយសម្រាប់សេរៀលកម្ម និងបង្វិលសេរៀលកម្មរចនាសម្ព័ន្ធ objects Python។ ពេលដែលអ្នក 'pickle' ម៉ូដែល អ្នកកំពុងសេរៀលកម្ម ឬប្លាតម៉ូដែលនេះសម្រាប់ប្រើនៅលើវេប។ សូមប្រយ័ត្ន៖ pickle មិនមានសុវត្ថិភាពផ្ទាល់ខ្លួនទេ ដូច្នេះសូមប្រយ័ត្ន ពេលដែលត្រូវ unzip ឬ 'un-pickle' ឯកសារ។ ឯកសារ pickle មានគោលបំណង .pkl។
|
||||
|
||||
## លំហាត់ - សម្អាតទិន្នន័យរបស់អ្នក
|
||||
|
||||
នៅក្នុងមេរៀននេះ អ្នកនឹងប្រើទិន្នន័យពីការមើលឃើញ UFO ជាង 80,000 ដង ដែលបានប្រមូលឡើងដោយ [NUFORC](https://nuforc.org) (មជ្ឈមណ្ឌលរាយការណ៍ UFO ជាតិ)។ ទិន្នន័យនេះមានការពិពណ៌នាផ្សេងៗអំពីការមើល UFO ដូចជា៖
|
||||
|
||||
- **ការពិពណ៌នាឧទាហរណ៍វែង។** "បុរសម្នាក់ឡើងពីកាំរស្មីភ្លឺមួយដែលភ្លឺលើដីឡង់ម៉ាស ស្រែព្រៃនៅយប់ ហើយគាត់រត់ទៅកាន់សួនចត់យានយន្ត Texas Instruments"។
|
||||
- **ការពិពណ៌នាឧទាហរណ៍ខ្លី។** "ពន្លឺបានវិលតាមយើង"។
|
||||
|
||||
តារាង [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) មានជួរឈរអំពី `city`, `state` និង `country` ដែលបានឃើញ, រូបរាងនៃវត្ថុ `shape` និង `latitude` និង `longitude` របស់វា។
|
||||
|
||||
នៅកំណត់ត្រាតែមួយ [notebook](notebook.ipynb) ដែលរួមបញ្ចូលក្នុងមេរៀននេះ៖
|
||||
|
||||
1. នាំចូល `pandas`, `matplotlib`, និង `numpy` ដូចជាបានធ្វើនៅមេរៀនកន្លងមក ហើយនាំចូលតារាង ufos។ អ្នកអាចមើលគំរូទិន្នន័យមួយ៖
|
||||
|
||||
```python
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
|
||||
ufos = pd.read_csv('./data/ufos.csv')
|
||||
ufos.head()
|
||||
```
|
||||
|
||||
1. បម្លែងទិន្នន័យ ufos ទៅកាន់ dataframe តូចមួយដោយមានចំណងជើងថ្មី។ ពិនិត្យតម្លៃដាច់ខាតនៅក្នុងវាល `Country` ។
|
||||
|
||||
```python
|
||||
ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})
|
||||
|
||||
ufos.Country.unique()
|
||||
```
|
||||
|
||||
1. ឥឡូវនេះ អ្នកអាចកាត់បន្ថយទិន្នន័យដែលត្រូវដោះស្រាយ ដោយបោះបង់តម្លៃ null និងនាំចូលតែចំនួនវេលាដែលមានរវាង 1-60 វិនាទីតែប៉ុណ្ណោះ៖
|
||||
|
||||
```python
|
||||
ufos.dropna(inplace=True)
|
||||
|
||||
ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]
|
||||
|
||||
ufos.info()
|
||||
```
|
||||
|
||||
1. នាំចូលបណ្ណាល័យ `LabelEncoder` របស់ Scikit-learn ដើម្បីបម្លែងតម្លៃអក្សររបស់ប្រទេសទៅជាលេខ៖
|
||||
|
||||
✅ LabelEncoder គឺ encode ទិន្នន័យតាមលំដាប់អក្ខរាវិរុទ្ធ។
|
||||
|
||||
```python
|
||||
from sklearn.preprocessing import LabelEncoder
|
||||
|
||||
ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])
|
||||
|
||||
ufos.head()
|
||||
```
|
||||
|
||||
ទិន្នន័យរបស់អ្នកគួរតែបង្ហាញដូចខាងក្រោម៖
|
||||
|
||||
```output
|
||||
Seconds Country Latitude Longitude
|
||||
2 20.0 3 53.200000 -2.916667
|
||||
3 20.0 4 28.978333 -96.645833
|
||||
14 30.0 4 35.823889 -80.253611
|
||||
23 60.0 4 45.582778 -122.352222
|
||||
24 3.0 3 51.783333 -0.783333
|
||||
```
|
||||
|
||||
## លំហាត់ - បង្កើតម៉ូដែលរបស់អ្នក
|
||||
|
||||
ឥឡូវនេះ អ្នកអាចត្រៀមខ្លួនបណ្តុះបណ្តាលម៉ូដែល ដោយបំបែកទិន្នន័យជាក្រុមបណ្តុះបណ្តាល និងក្រុមសាកល្បង។
|
||||
|
||||
1. ជ្រើសរើសលក្ខណៈបីដែលអ្នកចង់បណ្តុះជាតម្លៃ X ហើយតម្លៃ y ដូចជា `Country`។ អ្នកចង់អាចបញ្ចូល `Seconds`, `Latitude` និង `Longitude` ហើយទទួលបានលេខសម្គាល់ប្រទេសវិញ។
|
||||
|
||||
```python
|
||||
from sklearn.model_selection import train_test_split
|
||||
|
||||
Selected_features = ['Seconds','Latitude','Longitude']
|
||||
|
||||
X = ufos[Selected_features]
|
||||
y = ufos['Country']
|
||||
|
||||
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
|
||||
```
|
||||
|
||||
1. បណ្តុះបណ្តាលម៉ូដែលរបស់អ្នកដោយប្រើ logistic regression៖
|
||||
|
||||
```python
|
||||
from sklearn.metrics import accuracy_score, classification_report
|
||||
from sklearn.linear_model import LogisticRegression
|
||||
model = LogisticRegression()
|
||||
model.fit(X_train, y_train)
|
||||
predictions = model.predict(X_test)
|
||||
|
||||
print(classification_report(y_test, predictions))
|
||||
print('Predicted labels: ', predictions)
|
||||
print('Accuracy: ', accuracy_score(y_test, predictions))
|
||||
```
|
||||
|
||||
ភាពត្រឹមត្រូវមិនអាក្រក់ទេ **(ប្រហែល 95%)** អ្វីដែលគ្មានភាពភ្ញាក់ផ្អើល សម្រាប់ `Country` និង `Latitude/Longitude` មានសមាមាត្រចំរូង។
|
||||
|
||||
ម៉ូដែលដែលអ្នកបានបង្កើតមិនមែនជាថ្មីគ្រប់ແលកទេ ព្រោះអ្នកអាចអង្កេតឃើញប្រទេសពី `Latitude` និង `Longitude` ប៉ុណ្ណោះ តែវាជាលំហាត់ល្អក្នុងការបណ្តុះបណ្តាលពីទិន្នន័យដើមដែលអ្នកបានសម្អាតនិងនាំចេញ ហើយបន្ទាប់មកប្រើម៉ូដែលនេះជាកម្មវិធីវេបសាយ។
|
||||
|
||||
## លំហាត់ - 'pickle' ម៉ូដែលរបស់អ្នក
|
||||
|
||||
ឥឡូវនេះ គឺពេលវេលា _pickle_ ម៉ូដែលរបស់អ្នក! អ្នកអាចធ្វើវា នៅក្នុងបន្ទាត់កូដប៉ុន្មានខ្សែ។ បន្ទាប់ពីវា _pickle_ រួច អ្នកអាចផ្ទុកម៉ូដែល pickle និងសាកល្បងវាជាមួយអារេ ឧទាហរណ៍មានតម្លៃ seconds, latitude និង longitude។
|
||||
|
||||
```python
|
||||
import pickle
|
||||
model_filename = 'ufo-model.pkl'
|
||||
pickle.dump(model, open(model_filename,'wb'))
|
||||
|
||||
model = pickle.load(open('ufo-model.pkl','rb'))
|
||||
print(model.predict([[50,44,-12]]))
|
||||
```
|
||||
|
||||
ម៉ូដែលត្រឡប់តម្លៃ **'3'** ដែលជាកូដប្រទេសសហរាជអង់គ្លេស។ ពិភពក្រៅ! 👽
|
||||
|
||||
## លំហាត់ - បង្កើតកម្មវិធី Flask
|
||||
|
||||
ឥឡូវនេះ អ្នកអាចបង្កើតកម្មវិធី Flask ដើម្បីហៅម៉ូដែលរបស់អ្នក ហើយត្រឡប់នូវលទ្ធផលដូចគ្នា តែមានរូបរាងសម្រស់ជាងមុន។
|
||||
|
||||
1. ចាប់ផ្តើមដោយបង្កើតថតណាមួយមានឈ្មោះ **web-app** នៅជាប់ឯកសារ _notebook.ipynb_ ដែលឯកសារ _ufo-model.pkl_ របស់អ្នករក្សាទុក។
|
||||
|
||||
1. នៅក្នុងថតនោះបង្កើតថតបីទៀត៖ **static** ដែលមានថត **css** ខាងក្នុង និង **templates**។ ឥឡូវនេះ អ្នកគួរតែមានឯកសារ និងថតដូចខាងក្រោម៖
|
||||
|
||||
```output
|
||||
web-app/
|
||||
static/
|
||||
css/
|
||||
templates/
|
||||
notebook.ipynb
|
||||
ufo-model.pkl
|
||||
```
|
||||
|
||||
✅ សូមយោងទៅថតដំណោះស្រាយសម្រាប់មើលកម្មវិធីដែលបានបញ្ចប់រួច
|
||||
|
||||
1. ឯកសារដ៏ដំបូងក្នុងថត _web-app_ ដែលត្រូវបង្កើតគឺ **requirements.txt**។ ដូចជា _package.json_ ក្នុងកម្មវិធី JavaScript, ឯកសារនេះរាយបញ្ជីការពឹងផ្អែកដែលកម្មវិធីត្រូវការជា dependency។ ក្នុង **requirements.txt** បញ្ចូលបន្ទាត់៖
|
||||
|
||||
```text
|
||||
scikit-learn
|
||||
pandas
|
||||
numpy
|
||||
flask
|
||||
```
|
||||
|
||||
1. ឥឡូវនេះ បើកបញ្ជីរដ្ឋនៃផ្លូវ _web-app_ ហើយរត់ឯកសារនេះ៖
|
||||
|
||||
```bash
|
||||
cd web-app
|
||||
```
|
||||
|
||||
1. នៅក្នុង terminal របស់អ្នកវាយ `pip install` ដើម្បីដំឡើងបណ្ណាល័យដែលមាននៅក្នុងឯកសារ _requirements.txt_៖
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
1. ឥឡូវនេះ អ្នកត្រៀមបង្កើតឯកសារបីបន្ថែម ដើម្បីបញ្ចប់កម្មវិធី៖
|
||||
|
||||
1. បង្កើត **app.py** នៅឫសថត។
|
||||
2. បង្កើត **index.html** នៅក្នុងថត _templates_។
|
||||
3. បង្កើត **styles.css** នៅក្នុងថត _static/css_។
|
||||
|
||||
1. កសាងឯកសារ _styles.css_ ជាមួយរចនាប័ទ្មមួយចំនួន៖
|
||||
|
||||
```css
|
||||
body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-family: 'Helvetica';
|
||||
background: black;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
letter-spacing: 1.4px;
|
||||
font-size: 30px;
|
||||
}
|
||||
|
||||
input {
|
||||
min-width: 150px;
|
||||
}
|
||||
|
||||
.grid {
|
||||
width: 300px;
|
||||
border: 1px solid #2d2d2d;
|
||||
display: grid;
|
||||
justify-content: center;
|
||||
margin: 20px auto;
|
||||
}
|
||||
|
||||
.box {
|
||||
color: #fff;
|
||||
background: #2d2d2d;
|
||||
padding: 12px;
|
||||
display: inline-block;
|
||||
}
|
||||
```
|
||||
|
||||
1. បន្ទាប់មក សរសេរឯកសារ _index.html_៖
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>🛸 UFO Appearance Prediction! 👽</title>
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="grid">
|
||||
|
||||
<div class="box">
|
||||
|
||||
<p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p>
|
||||
|
||||
<form action="{{ url_for('predict')}}" method="post">
|
||||
<input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" />
|
||||
<input type="text" name="latitude" placeholder="Latitude" required="required" />
|
||||
<input type="text" name="longitude" placeholder="Longitude" required="required" />
|
||||
<button type="submit" class="btn">Predict country where the UFO is seen</button>
|
||||
</form>
|
||||
|
||||
<p>{{ prediction_text }}</p>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
សូមមើលការផ្សំរូបតំបន់ (templating) នៅក្នុងឯកសារនេះ។ សម្គាល់ថាសំណុំបែបបទ 'mustache' ជាគន្ធដៅជុំវិញអថេរ លទ្ធផលនៅពេលកម្មវិធីផ្តល់ឱ្យ ដូចជា អត្ថបទព្យាករណ៍៖ `{{}}`។ មានបែបបទមួយដែលផ្ញើព្យាករណ៍ទៅផ្លូវ `/predict` ទៀតផង។
|
||||
|
||||
ចុងក្រោយ អ្នកត្រៀមប្រើឯកសារ python ដែលដឹកនាំការប្រើម៉ូដែល និងបង្ហាញលទ្ធផលព្យាករណ៍៖
|
||||
|
||||
1. នៅក្នុង `app.py` បន្ថែម៖
|
||||
|
||||
```python
|
||||
import numpy as np
|
||||
from flask import Flask, request, render_template
|
||||
import pickle
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
model = pickle.load(open("./ufo-model.pkl", "rb"))
|
||||
|
||||
|
||||
@app.route("/")
|
||||
def home():
|
||||
return render_template("index.html")
|
||||
|
||||
|
||||
@app.route("/predict", methods=["POST"])
|
||||
def predict():
|
||||
|
||||
int_features = [int(x) for x in request.form.values()]
|
||||
final_features = [np.array(int_features)]
|
||||
prediction = model.predict(final_features)
|
||||
|
||||
output = prediction[0]
|
||||
|
||||
countries = ["Australia", "Canada", "Germany", "UK", "US"]
|
||||
|
||||
return render_template(
|
||||
"index.html", prediction_text="Likely country: {}".format(countries[output])
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(debug=True)
|
||||
```
|
||||
|
||||
> 💡 គន្លឹះ៖ ពេលអ្នកបន្ថែម [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) ពេលរត់កម្មវិធីវេបដោយប្រើ Flask, ការផ្លាស់ប្តូរណាមួយប្រតិបត្ដិបន្ទាន់នឹងត្រូវបង្ហាញភ្លាមៗ ដោយមិនចាំបាច់ចាប់ផ្ដើមម៉ាស៊ីនមួយទៀត។ តែបញ្ហាជាលក្ខណៈ៖ កុំបើកមុខងារនេះនៅក្នុងកម្មវិធីផលិតកម្ម។
|
||||
|
||||
បើអ្នករត់ `python app.py` ឬ `python3 app.py` ម៉ាស៊ីនបម្រើវេបរបស់អ្នកនឹងចាប់ផ្ដើមក្នុងបរិបទក្នុងស្រុក ហើយអ្នកអាចបំពេញសំណុំបែបបទខ្លីមួយ ដើម្បីទទួលបានចម្លើយចំពោះសំណួររបស់អ្នកអំពីទីតាំងដែលបានមើលឃើញ UFO!
|
||||
|
||||
មុនធ្វើហ្នឹង សូមមើលផ្នែកនៃ `app.py`៖
|
||||
|
||||
1. ជាដំបូង dependencies ត្រូវបានទាញយក ហើយកម្មវិធីចាប់ផ្ដើម។
|
||||
1. បន្ទាប់ម៉ូដែលត្រូវបាននាំចូល។
|
||||
1. បន្ទាប់មក index.html ត្រូវបានបង្ហាញនៅផ្លូវមុខ។
|
||||
|
||||
នៅផ្លូវ `/predict`, មានរឿងជាច្រើនកើតឡើងនៅពេលសំណុំបែបបទត្រូវបានបញ្ចូន៖
|
||||
|
||||
1. អថេរនៃសំណុំបែបបទ ត្រូវបានប្រមួល និងបម្លែងទៅជា numpy array។ បន្ទាប់មកវាត្រូវបានផ្ញើទៅម៉ូដែល ហើយលទ្ធផលព្យាករណ៍ត្រូវបានទទួល។
|
||||
2. ប្រទេសដែលយើងចង់បង្ហាញ ត្រូវបានបម្លែងឡើងវិញជាអត្ថបទដែលអាចអានបាន ពីកូដប្រទេសដែលបានព្យាករណ៍ ហើយតម្លៃនោះត្រូវបានផ្ញើត្រឡប់ទៅ index.html សម្រាប់បង្ហាញក្នុងគំរូ។
|
||||
|
||||
ការប្រើម៉ូដែលបែបនេះ ដោយប្រើ Flask និងម៉ូដែលដែលបាន pickle គឺសាមញ្ញ។ រឿងលំបាកបំផុតគឺយល់ថាទិន្នន័យមាននៅក្នុងរបៀបណា ដែលត្រូវផ្ញើទៅម៉ូដែលដើម្បីទទួលបានព្យាករណ៍។ រឿងនេះទាំងអស់ תלויនឹងរបៀបដែលម៉ូដែលត្រូវបានបណ្តុះបណ្តាល។ ម៉ូដែលនេះមានចំណុចទិន្នន័យបី ដែលត្រូវបញ្ចូលដើម្បីទទួលបានព្យាករណ៍។
|
||||
|
||||
នៅក្នុងបរិបទមុខរបរ អ្នកអាចមើលឃើញថាការទំនាក់ទំនងល្អគឺទាមទារជាចាំបាច់រវាងមនុស្សដែលបណ្តុះបណ្តាលម៉ូដែល និងអ្នកប្រើវាសម្រាប់កម្មវិធីវេប ឬចល័ត។ ក្នុងករណីយើង គឺមនុស្សម្នាក់គត់ គឺអ្នក!
|
||||
|
||||
---
|
||||
|
||||
## 🚀 ការប្រកួតប្រជែង
|
||||
|
||||
ជំនួសការងារនៅក្នុងកំណត់ត្រា និងនាំចូលម៉ូដែលទៅកម្មវិធី Flask អ្នកអាចបណ្តុះបណ្តាលម៉ូដែលនៅក្នុងកម្មវិធី Flask យ៉ាងត្រង់! ព្យាយាមបម្លែងកូដ Python របស់អ្នកក្នុងកំណត់ត្រា ប្រហែលបន្ទាប់ពីទិន្នន័យរបស់អ្នកបានសម្អាត ហើយបណ្តុះម៉ូដែលពីក្នុងកម្មវិធីលើផ្លូវដែលហៅថា `train` ។ មានគុណសម្បត្តិ និងគុណវិបត្តិអ្វីខ្លះក្នុងការធ្វើវិធាននេះ?
|
||||
|
||||
## [សំណួរបន្ទាប់មកមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
## ការត្រួតពិនិត្យ និងសិក្សាដោយខ្លួនឯង
|
||||
|
||||
មានវិធីជាច្រើនក្នុងការបង្កើតកម្មវិធីវេបសម្រាប់ប្រើម៉ូដែល ML។ សូមរាយបញ្ជីវិធីដែលអ្នកអាចប្រើ JavaScript ឬ Python ដើម្បីបង្កើតកម្មវិធីវេបសម្រាប់យកអត្ថប្រយោជន៍ពីម៉ាស៊ីនរៀន។ ពិចារណាស្ថាបត្យកម្ម៖ តើម៉ូដែលគួរចាំនៅក្នុងកម្មវិធី ឬនៅក្នុងពពក? ប្រសិនបើគឺនៅក្នុងពពក អ្នកត្រូវចូលដំណើរការយ៉ាងដូចម្តេច? គូររូបមន្តស្ថាបត្យកម្មសម្រាប់ដំណោះស្រាយ ML វេបសម្រាប់អនុវត្តន៍។
|
||||
|
||||
## មេរៀនបន្ថែម
|
||||
|
||||
[សាកល្បងម៉ូដែលផ្សេង](assignment.md)
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator) ។ ទោះយើងខ្ញុំខិតខំផ្តល់ភាពត្រឹមត្រូវក៏ដោយ សូមយកចិត្តទុកដាក់ថា ការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពខុសត្រូវ។ ឯកសារដើមនៅក្នុងភាសាជាតិ ជាការត្រូវបានគេពិចារណាថាជាផ្លាកលក្ខណៈសម្បត្តិ។ សម្រាប់ព័ត៌មានសំខាន់ៗ គួរប្រើការបកប្រែមនុស្សជំនាញវិជ្ជាជីវៈ។ យើងខ្ញុំមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសៗផ្សេងៗដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,18 @@
|
||||
# សាកល្លងម៉ូឌែលផ្សេងទៀត
|
||||
|
||||
## សេចក្ដីណែនាំ
|
||||
|
||||
ឥឡូវនេះអ្នកបានបង្កើតកម្មវិធីវែបមួយដោយប្រើម៉ូឌែល Regression ដែលបានហ្វឹកហ្វឺនរួចហើយ សូមប្រើម៉ូឌែលមួយពីមេរៀន Regression មុននេះ ដើម្បីធ្វើកម្មវិធីវែបនេះឡើងម្តងទៀត។ អ្នកអាចរក្សារចម្រុះរចនាប័ទ្មដដែលឬរចនាឡើងវិញឲ្យសមរម្យនឹងទិន្នន័យផ្សិតខ្ទឹមខ្មៅ។ ត្រូវប្រុងប្រយ័ត្នប្តូរបញ្ចូលឲ្យសមរម្យនឹងវិធីសាស្ត្រហ្វឹកហ្វឺនម៉ូឌែលរបស់អ្នក។
|
||||
|
||||
## ការវាយតម្លៃ
|
||||
|
||||
| កត្តា | ល្អឧត្តម | សមរម្យ | ត្រូវការកែលម្អ |
|
||||
| ----------------------------- | ------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------ |
|
||||
| | កម្មវិធីវែបដំណើរការតាមការរំពឹងទុក ហើយបានដាក់បង្ហោះនៅលើពពក | កម្មវិធីវែបមានកំហុស ឬបង្ហាញលទ្ធផលដែលមិនបានរំពឹងទុក | កម្មវិធីវែបមិនដំណើរការបានត្រឹមត្រូវ |
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator) ។ ខណៈពេលដែលយើងខិតខំធ្វើឱ្យបានត្រឹមត្រូវ សូមចំពោះការបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាមាឌផ្ទាល់គួរត្រូវបានគេចាត់ទុកជាទិន្នន័យប្រភពផ្លូវការជាចម្បង។ សម្រាប់ព័ត៌មានសំខាន់ៗ គួរតែប្រើការបកប្រែដោយមនុស្សវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការច្រឡំនូវហេតុផល ឬការបំភាន់ដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,263 @@
|
||||
{
|
||||
"metadata": {
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.7.0"
|
||||
},
|
||||
"orig_nbformat": 2,
|
||||
"kernelspec": {
|
||||
"name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
|
||||
"display_name": "Python 3.7.0 64-bit ('3.7')"
|
||||
},
|
||||
"metadata": {
|
||||
"interpreter": {
|
||||
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
|
||||
}
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2,
|
||||
"cells": [
|
||||
{
|
||||
"source": [
|
||||
"## បង្កើតកម្មវិធីវេបដោយប្រើម៉ូដែលធ្វើវិភាគ Regression ដើម្បីរៀនអំពីការមើលឃើញ UFO\n"
|
||||
],
|
||||
"cell_type": "markdown",
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 23,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
" datetime city state country shape \\\n",
|
||||
"0 10/10/1949 20:30 san marcos tx us cylinder \n",
|
||||
"1 10/10/1949 21:00 lackland afb tx NaN light \n",
|
||||
"2 10/10/1955 17:00 chester (uk/england) NaN gb circle \n",
|
||||
"3 10/10/1956 21:00 edna tx us circle \n",
|
||||
"4 10/10/1960 20:00 kaneohe hi us light \n",
|
||||
"\n",
|
||||
" duration (seconds) duration (hours/min) \\\n",
|
||||
"0 2700.0 45 minutes \n",
|
||||
"1 7200.0 1-2 hrs \n",
|
||||
"2 20.0 20 seconds \n",
|
||||
"3 20.0 1/2 hour \n",
|
||||
"4 900.0 15 minutes \n",
|
||||
"\n",
|
||||
" comments date posted latitude \\\n",
|
||||
"0 This event took place in early fall around 194... 4/27/2004 29.883056 \n",
|
||||
"1 1949 Lackland AFB, TX. Lights racing acros... 12/16/2005 29.384210 \n",
|
||||
"2 Green/Orange circular disc over Chester, En... 1/21/2008 53.200000 \n",
|
||||
"3 My older brother and twin sister were leaving ... 1/17/2004 28.978333 \n",
|
||||
"4 AS a Marine 1st Lt. flying an FJ4B fighter/att... 1/22/2004 21.418056 \n",
|
||||
"\n",
|
||||
" longitude \n",
|
||||
"0 -97.941111 \n",
|
||||
"1 -98.581082 \n",
|
||||
"2 -2.916667 \n",
|
||||
"3 -96.645833 \n",
|
||||
"4 -157.803611 "
|
||||
],
|
||||
"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>datetime</th>\n <th>city</th>\n <th>state</th>\n <th>country</th>\n <th>shape</th>\n <th>duration (seconds)</th>\n <th>duration (hours/min)</th>\n <th>comments</th>\n <th>date posted</th>\n <th>latitude</th>\n <th>longitude</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>10/10/1949 20:30</td>\n <td>san marcos</td>\n <td>tx</td>\n <td>us</td>\n <td>cylinder</td>\n <td>2700.0</td>\n <td>45 minutes</td>\n <td>This event took place in early fall around 194...</td>\n <td>4/27/2004</td>\n <td>29.883056</td>\n <td>-97.941111</td>\n </tr>\n <tr>\n <th>1</th>\n <td>10/10/1949 21:00</td>\n <td>lackland afb</td>\n <td>tx</td>\n <td>NaN</td>\n <td>light</td>\n <td>7200.0</td>\n <td>1-2 hrs</td>\n <td>1949 Lackland AFB&#44 TX. Lights racing acros...</td>\n <td>12/16/2005</td>\n <td>29.384210</td>\n <td>-98.581082</td>\n </tr>\n <tr>\n <th>2</th>\n <td>10/10/1955 17:00</td>\n <td>chester (uk/england)</td>\n <td>NaN</td>\n <td>gb</td>\n <td>circle</td>\n <td>20.0</td>\n <td>20 seconds</td>\n <td>Green/Orange circular disc over Chester&#44 En...</td>\n <td>1/21/2008</td>\n <td>53.200000</td>\n <td>-2.916667</td>\n </tr>\n <tr>\n <th>3</th>\n <td>10/10/1956 21:00</td>\n <td>edna</td>\n <td>tx</td>\n <td>us</td>\n <td>circle</td>\n <td>20.0</td>\n <td>1/2 hour</td>\n <td>My older brother and twin sister were leaving ...</td>\n <td>1/17/2004</td>\n <td>28.978333</td>\n <td>-96.645833</td>\n </tr>\n <tr>\n <th>4</th>\n <td>10/10/1960 20:00</td>\n <td>kaneohe</td>\n <td>hi</td>\n <td>us</td>\n <td>light</td>\n <td>900.0</td>\n <td>15 minutes</td>\n <td>AS a Marine 1st Lt. flying an FJ4B fighter/att...</td>\n <td>1/22/2004</td>\n <td>21.418056</td>\n <td>-157.803611</td>\n </tr>\n </tbody>\n</table>\n</div>"
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 23
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import pandas as pd\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"ufos = pd.read_csv('../data/ufos.csv')\n",
|
||||
"ufos.head()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 24,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array(['us', nan, 'gb', 'ca', 'au', 'de'], dtype=object)"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 24
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})\n",
|
||||
"\n",
|
||||
"ufos.Country.unique()\n",
|
||||
"\n",
|
||||
"# 0 au, 1 ca, 2 de, 3 gb, 4 us"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 25,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"<class 'pandas.core.frame.DataFrame'>\nInt64Index: 25863 entries, 2 to 80330\nData columns (total 4 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 Seconds 25863 non-null float64\n 1 Country 25863 non-null object \n 2 Latitude 25863 non-null float64\n 3 Longitude 25863 non-null float64\ndtypes: float64(3), object(1)\nmemory usage: 1010.3+ KB\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"ufos.dropna(inplace=True)\n",
|
||||
"\n",
|
||||
"ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]\n",
|
||||
"\n",
|
||||
"ufos.info()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 26,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "execute_result",
|
||||
"data": {
|
||||
"text/plain": [
|
||||
" Seconds Country Latitude Longitude\n",
|
||||
"2 20.0 3 53.200000 -2.916667\n",
|
||||
"3 20.0 4 28.978333 -96.645833\n",
|
||||
"14 30.0 4 35.823889 -80.253611\n",
|
||||
"23 60.0 4 45.582778 -122.352222\n",
|
||||
"24 3.0 3 51.783333 -0.783333"
|
||||
],
|
||||
"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>Seconds</th>\n <th>Country</th>\n <th>Latitude</th>\n <th>Longitude</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2</th>\n <td>20.0</td>\n <td>3</td>\n <td>53.200000</td>\n <td>-2.916667</td>\n </tr>\n <tr>\n <th>3</th>\n <td>20.0</td>\n <td>4</td>\n <td>28.978333</td>\n <td>-96.645833</td>\n </tr>\n <tr>\n <th>14</th>\n <td>30.0</td>\n <td>4</td>\n <td>35.823889</td>\n <td>-80.253611</td>\n </tr>\n <tr>\n <th>23</th>\n <td>60.0</td>\n <td>4</td>\n <td>45.582778</td>\n <td>-122.352222</td>\n </tr>\n <tr>\n <th>24</th>\n <td>3.0</td>\n <td>3</td>\n <td>51.783333</td>\n <td>-0.783333</td>\n </tr>\n </tbody>\n</table>\n</div>"
|
||||
},
|
||||
"metadata": {},
|
||||
"execution_count": 26
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.preprocessing import LabelEncoder\n",
|
||||
"\n",
|
||||
"ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])\n",
|
||||
"\n",
|
||||
"ufos.head()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 27,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from sklearn.model_selection import train_test_split\n",
|
||||
"\n",
|
||||
"Selected_features = ['Seconds','Latitude','Longitude']\n",
|
||||
"\n",
|
||||
"X = ufos[Selected_features]\n",
|
||||
"y = ufos['Country']\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 28,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stderr",
|
||||
"text": [
|
||||
"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
|
||||
" FutureWarning)\n",
|
||||
"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
|
||||
" \"this warning.\", FutureWarning)\n",
|
||||
" precision recall f1-score support\n",
|
||||
"\n",
|
||||
" 0 1.00 1.00 1.00 41\n",
|
||||
" 1 1.00 0.02 0.05 250\n",
|
||||
" 2 0.00 0.00 0.00 8\n",
|
||||
" 3 0.94 1.00 0.97 131\n",
|
||||
" 4 0.95 1.00 0.97 4743\n",
|
||||
"\n",
|
||||
" accuracy 0.95 5173\n",
|
||||
" macro avg 0.78 0.60 0.60 5173\n",
|
||||
"weighted avg 0.95 0.95 0.93 5173\n",
|
||||
"\n",
|
||||
"Predicted labels: [4 4 4 ... 3 4 4]\n",
|
||||
"Accuracy: 0.9512855209742895\n",
|
||||
"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/metrics/classification.py:1437: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.\n",
|
||||
" 'precision', 'predicted', average, warn_for)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from sklearn.model_selection import train_test_split\n",
|
||||
"from sklearn.metrics import accuracy_score, classification_report \n",
|
||||
"from sklearn.linear_model import LogisticRegression\n",
|
||||
"model = LogisticRegression()\n",
|
||||
"model.fit(X_train, y_train)\n",
|
||||
"predictions = model.predict(X_test)\n",
|
||||
"\n",
|
||||
"print(classification_report(y_test, predictions))\n",
|
||||
"print('Predicted labels: ', predictions)\n",
|
||||
"print('Accuracy: ', accuracy_score(y_test, predictions))\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 29,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"[3]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import pickle\n",
|
||||
"model_filename = 'ufo-model.pkl'\n",
|
||||
"pickle.dump(model, open(model_filename,'wb'))\n",
|
||||
"\n",
|
||||
"model = pickle.load(open('ufo-model.pkl','rb'))\n",
|
||||
"print(model.predict([[50,44,-12]]))\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,28 @@
|
||||
# បង្កើតកម្មវិធីវែបដើម្បីប្រើម៉ូដែល ML របស់អ្នក
|
||||
|
||||
នៅក្នុងផ្នែកនេះនៃមេរៀន អ្នកនឹងបានណែនាំអំពីប្រធានបទ ML ប្រើប្រាស់បាន៖ របៀបរក្សាទុកម៉ូដែល Scikit-learn របស់អ្នកជាឯកសារដែលអាចប្រើសម្រាប់ធ្វើការទស្សន៍ទាយនៅក្នុងកម្មវិធីវែប។ បន្ទាប់ពីម៉ូដែលត្រូវបានរក្សាទុក អ្នកនឹងរៀនរបៀបទៅប្រើវាក្នុងកម្មវិធីវែបដែលបានបង្កើតក្នុង Flask។ អ្នកនឹងបានបង្កើតម៉ូដែលដោយប្រើទិន្នន័យដែលទាក់ទងគ្នានឹងការមើលឃើញ UFO! បន្ទាប់មក អ្នកនឹងបង្កើតកម្មវិធីវែបមួយដែលនឹងអនុញ្ញាតឱ្យអ្នកបញ្ចូលចំនួនវិនាទីជាមួយតម្លៃបណ្តោយ និងអទិសដៅដើម្បីទស្សន៍ទាយប្រទេសណាដែលបានរាយការណ៍ថាវិញឃើញ UFO។
|
||||
|
||||

|
||||
|
||||
រូបថតដោយ <a href="https://unsplash.com/@mdherren?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Michael Herren</a> នៅ <a href="https://unsplash.com/s/photos/ufo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
|
||||
|
||||
## មេរៀន
|
||||
|
||||
1. [បង្កើតកម្មវិធីវែប](1-Web-App/README.md)
|
||||
|
||||
## ការទទួលស្គាល់
|
||||
|
||||
"បង្កើតកម្មវិធីវែប" ត្រូវបានសរសេរដោយ ♥️ [Jen Looper](https://twitter.com/jenlooper)។
|
||||
|
||||
♥️ ការប្រឡងត្រូវបានសរសេរដោយ Rohan Raj។
|
||||
|
||||
ទិន្នន័យត្រូវបានយកមកពី [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings)។
|
||||
|
||||
បែបផែនកម្មវិធីវែបត្រូវបានផ្តល់អនុសាសន៍ផ្នែកមួយដោយ [អត្ថបទនេះ](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) និង [repo នេះ](https://github.com/abhinavsagar/machine-learning-deployment) ដោយ Abhinav Sagar។
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំសំរាប់ភាពត្រឹមត្រូវ សូមយកចិត្តទុកដាក់ទៅលើការប្រែប្រើម៉ាស៊ីនដែលអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសានិរន្តរបស់វាគួរត្រូវបានពិចារណាថាជាមូលដ្ឋានដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ ការបកប្រែដោយមនុស្សជំនាញត្រូវបានផ្តល់អនុសាសន៍។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ខុស ឬការបកប្រែខុសដោយបានប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,306 @@
|
||||
# ការណែនាំអំពីការបែងចែកចំណាត់ថ្នាក់
|
||||
|
||||
ក្នុងមេរៀនបួននេះ អ្នកនឹងបានសិក្សាពីចំណុចសំខាន់មួយនៃការសិក្សាម៉ាស៊ីនបែបចាស់ៗមួយ - _ការបែងចែកចំណាត់ថ្នាក់_។ យើងនឹងដំណើរការប្រើប្រាស់អាល់គូរីធึមបែងចំណាត់ថ្នាក់នានាជាមួយនឹងទិន្នន័យអំពីម្ហូបឆុងសាធារណៈទាំងអាស៊ីនិងឥណ្ឌា។ សូមសង្ឃឹមថាអ្នកនៅពេលនេះមានអាហារស្តុក!
|
||||
|
||||

|
||||
|
||||
> ប្រារព្ធរំលឹកមុខម្ហូបប៉ាន-អាស៊ីក្នុងមេរៀនទាំងនេះ! រូបភាពដោយ [Jen Looper](https://twitter.com/jenlooper)
|
||||
|
||||
ការបែងចំណាត់ថ្នាក់គឺជារបៀបមួយនៃ [ការសិក្សាដោយមានតំណាង](https://wikipedia.org/wiki/Supervised_learning) ដែលមានអារម្មណ៍ស្រដៀងនឹងបច្ចេកទេសរេហ្គ្រេស្យុង។ ប្រសិនបើការសិក្សាម៉ាស៊ីនគឺស្តីពីការព្យាករណ៍តម្លៃឬឈ្មោះរបស់វត្ថុតាមរយៈទិន្នន័យ។ ការបែងចំណាត់ថ្នាក់មានពីរប្រភេទទូទៅគឺ: _ការបែងចំណាត់ថ្នាក់ពីរប្រាំពីរណ៍_ និង _ការបែងចំណាត់ថ្នាក់ច្រើនថ្នាក់_។
|
||||
|
||||
[](https://youtu.be/eg8DJYwdMyg "Introduction to classification")
|
||||
|
||||
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូ៖ John Guttag ពី MIT បង្ហាញអំពីការបែងចំណាត់ថ្នាក់
|
||||
|
||||
ចងចាំ៖
|
||||
|
||||
- **រេហ្គ្រេស្យុងបន្ទាត់** បានជួយអ្នកព្យាករណ៍ទំនាក់ទំនងរវាងអថេរនានា និងធ្វើព្យាករណ៍ត្រឹមត្រូវថាតម្លៃទិន្នន័យថ្មីនឹងស្ថិតនៅកន្លែងណាអំពីបន្ទាត់នោះ។ ដូច្នេះ អ្នកអាចព្យាករណ៍ថា _តម្លៃផ្លែហ្គែលនៅខែកញ្ញាឬខែធ្នូ_ ដូចជា។
|
||||
- **រេហ្គ្រេស្យុងឡូហ្ស៊ីស្ទិក** បានជួយអ្នករកឃើញ "ប្រភេទពីរប្រាំពីរណ៍": នៅតម្លៃតំលៃនេះ _ផ្លែហ្គែលនេះពណ៌ទ្រុងឬមិនទ្រុង_?
|
||||
|
||||
ការបែងចំណាត់ថ្នាក់ប្រើអាល់គូរីធឹមជាច្រើនដើម្បីកំណត់វិធីផ្សេងៗក្នុងការបញ្ជាក់ស្លាក ឬថ្នាក់របស់ចំណុចទិន្នន័យ។ យើងនឹងប្រើទិន្នន័យម្ហូបនេះដើម្បីមើលថាតើដោយសង្កេតមើលក្រុមគ្រឿងផ្សំមួយ អាចកំណត់បានថាម្ហូបនេះមានប្រភពពីខេត្តណាបានឬជាអាច។
|
||||
|
||||
## [ការប្រលងមុនមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
> ### [មេរៀននេះអាចប្រើបានក្នុង R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
|
||||
|
||||
### ការណែនាំ
|
||||
|
||||
ការបែងចំណាត់ថ្នាក់គឺជាកម្មវិធីមួយសំខាន់សម្រាប់អ្នកស្រាវជ្រាវម៉ាស៊ីនសិក្សា និងអ្នកវិទ្យាស្ថានទិន្នន័យមួយ។ ចាប់ពីការបែងចំណាត់ថ្នាក់ពីរប្រាំពីរណ៍មូលដ្ឋាន ("អ៊ីមែលនេះជាស្គាមឬមិនមែន?"), រហូតដល់ការបែងចំណាត់ថ្នាក់រូបភាពស្មុគស្មាញ និងការបែងចំណាត់ថ្នាក់ផ្នែកដោយការមើលឃើញកុំព្យូទ័រ វាអាចមានប្រយោជន៍ជានិច្ចក្នុងការរៀបចំនូវទិន្នន័យទៅក្នុងថ្នាក់ និងសាកសួរទិន្នន័យនោះ។
|
||||
|
||||
ដើម្បីពន្យល់ដោយវិទ្យាសាស្ត្រនិងច្បាស់លាស់បន្ថែមវិញ វិធីសាស្ត្របែងចំណាត់ថ្នាក់របស់អ្នកបង្កើតម៉ូដែលព្យាករណ៍ដែលអនុញ្ញាតឲ្យអ្នកបំរែបំរួលទំនាក់ទំនងរវាងអថេរដំណាក់កាល ទៅកាន់អថេរបញ្ចេញ។
|
||||
|
||||

|
||||
|
||||
> បញ្ហាប្រភេទពីរប្រាំពីរណ៍ និងច្រើនថ្នាក់សម្រាប់អាល់គូរីធឹមបែងចំណាត់ថ្នាក់ត្រូវដោះស្រាយ។ រូបភាពដោយ [Jen Looper](https://twitter.com/jenlooper)
|
||||
|
||||
មុនចាប់ផ្តើមដំណើរការសំអាតទិន្នន័យរបស់យើង មើលគំរូវាទិន្នន័យ និងរៀបចំវាសម្រាប់ភារកិច្ច ML របស់យើង សូមយើងសិក្សាអំពីវិធីផ្សេងៗដែលម៉ាស៊ីនសិក្សាអាចប្រើដើម្បីបែងចែកទិន្នន័យ។
|
||||
|
||||
បានដកស្រង់ពី [ស្ថិតិវិទ្យា](https://wikipedia.org/wiki/Statistical_classification) ការបែងចំណាត់ថ្នាក់ដោយប្រើម៉ាស៊ីនសិក្សាចាស់ៗប្រើលក្ខណៈពិសេស ជាទម្រង់ `smoker`, `weight`, និង `age` ដើម្បីកំណត់ _ពលភាពនៃការកើតជំងឺ X_។ ជាចំណុចសិក្សាដោយមានតំណាង ដែលស្រដៀងនឹងហាត់រេហ្គ្រេស្យុងដែលអ្នកបានធ្វើមុននេះ ទិន្នន័យរបស់អ្នកត្រូវបានដាក់ស្លាក ហើយអាល់គូរីធឹម ML ប្រើស្លាកទាំងនោះដើម្បីបែងចំណាត់ និងព្យាករណ៍ថ្នាក់ (ឬ 'លក្ខណៈពិសេស') របស់ទិន្នន័យ និងផ្ដល់វាទៅក្រុម ឬលទ្ធផលមួយ។
|
||||
|
||||
✅ ចំណាយពេលស្រមៃពីទិន្នន័យអំពីម្ហូបមួយ។ ម៉ូដែលច្រើនថ្នាក់អាចឆ្លើយបានអ្វី? ម៉ូដែលពីរប្រាំពីរណ៍អាចឆ្លើយបានអ្វី? បើអ្នកចង់កំណត់ថាអ្វីមួយថាតើម្ហូបណាមួយប្រើ "fenugreek" ឬទេ? បើអ្នកចង់មើលថា ប្រសិនបើមានកាបូបទំនិញពោរពេញដោយ "star anise", "artichokes", "cauliflower", និង "horseradish" អ្នកអាចបង្កើតម្ហូបឥណ្ឌាប្រភេទមួយបានឬទេ?
|
||||
|
||||
[](https://youtu.be/GuTeDbaNoEU "Crazy mystery baskets")
|
||||
|
||||
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូ៖ គោលបំណងទាំងមូលនៃកម្មវិធី 'Chopped' គឺក្នុង 'កាបូបសម្ងាត់' ដែលអ្នកចម្អិនម្ហូបត្រូវបង្កើតម្ហូបពីជម្រើសគ្រឿងផ្សំនានា។ ពិតជាម៉ូដែល ML នឹងជួយបានយ៉ាងច្រើន។
|
||||
|
||||
## សួរវាគឺ 'classifier'
|
||||
|
||||
សំណួរដែលយើងចង់សួរពីទិន្នន័យម្ហូបនេះគឺជា **សំណួរច្រើនថ្នាក់**, ព្រោះយើងមានម្ហូបជាតិជាច្រើនដែលអាចប្រើបាន។ ដោយផ្អែកលើក្រុមគ្រឿងផ្សំមួយ, តើទិន្នន័យនេះនឹងស្ថិតក្នុងថ្នាក់ណា?
|
||||
|
||||
Scikit-learn ផ្តល់ជូននូវអាល់គូរីធឹមជាច្រើនដើម្បីប្រើបែងចំណាត់របស់ទិន្នន័យ តាមបំណង ប្រភេទបញ្ហាដែលអ្នកចង់ដោះស្រាយ។ ក្នុងមេរៀនពីរបន្ទាប់ អ្នកនឹងសិក្សាអំពីអាល់គូរីធឹមទាំងនេះ។
|
||||
|
||||
## អនុវត្តិ - សំអាត និងសមតុល្យទិន្នន័យរបស់អ្នក
|
||||
|
||||
កិច្ចការដំបូងជាចាំបាច់ មុនចាប់ផ្តើមគម្រោងនេះ គឺសំអាត និង **សមតុល្យ** ទិន្នន័យរបស់អ្នក ដើម្បីទទួលបានលទ្ធផលល្អ។ ចាប់ផ្តើមជាមួយឯកសារ _notebook.ipynb_ ទទេនៅមូលដ្ឋានថតនេះ។
|
||||
|
||||
របស់ដំបូងដែលត្រូវដំឡើងគឺ [imblearn](https://imbalanced-learn.org/stable/)។ នេះជាបណ្ណាល័យ Scikit-learn មួយដែលអនុញ្ញាតឲ្យអ្នកសមតុល្យទិន្នន័យបានល្អប្រសើរជាងមុន (អ្នកនឹងរៀនអំពីភារកិច្ចនេះបន្ថែមបន្ទាប់ពីនេះ)។
|
||||
|
||||
1. ដើម្បីដំឡើង `imblearn`, ប្រើពាក្យបញ្ជា `pip install` ដូចខាងក្រោម៖
|
||||
|
||||
```python
|
||||
pip install imblearn
|
||||
```
|
||||
|
||||
1. នាំចូលបណ្ណាល័យដែលអ្នកត្រូវការដើម្បីនាំចូលទិន្នន័យ និងបង្ហាញវីសិរម្យ បានបញ្ចូល `SMOTE` ពី `imblearn` ផងដែរ។
|
||||
|
||||
```python
|
||||
import pandas as pd
|
||||
import matplotlib.pyplot as plt
|
||||
import matplotlib as mpl
|
||||
import numpy as np
|
||||
from imblearn.over_sampling import SMOTE
|
||||
```
|
||||
|
||||
ឥឡូវនេះអ្នកបានត្រៀមខ្លួនសម្រាប់នាំចូលទិន្នន័យបន្ទាប់។
|
||||
|
||||
1. ភារកិច្ចបន្ទាប់គឺនាំចូលទិន្នន័យ៖
|
||||
|
||||
```python
|
||||
df = pd.read_csv('../data/cuisines.csv')
|
||||
```
|
||||
|
||||
ការប្រើ `read_csv()` នឹងអានមាតិកានៃឯកសារ csv _cusines.csv_ ហើយដាក់វាទៅក្នុងអថេរ `df`។
|
||||
|
||||
1. ពិនិត្យទម្រង់ទិន្នន័យ៖
|
||||
|
||||
```python
|
||||
df.head()
|
||||
```
|
||||
|
||||
បន្ទាត់ប្រាំដំបូងមានរូបរាងដូចខាងក្រោម៖
|
||||
|
||||
```output
|
||||
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
|
||||
| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
|
||||
| 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||
| 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||
| 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||
| 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||
| 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
|
||||
```
|
||||
|
||||
1. ទទួលបានព័ត៌មានអំពីទិន្នន័យនេះដោយហៅមុខងារ `info()`៖
|
||||
|
||||
```python
|
||||
df.info()
|
||||
```
|
||||
|
||||
លទ្ធផលដែលអ្នកទទួលបានមានរូបរាងដូចខាងក្រោម៖
|
||||
|
||||
```output
|
||||
<class 'pandas.core.frame.DataFrame'>
|
||||
RangeIndex: 2448 entries, 0 to 2447
|
||||
Columns: 385 entries, Unnamed: 0 to zucchini
|
||||
dtypes: int64(384), object(1)
|
||||
memory usage: 7.2+ MB
|
||||
```
|
||||
|
||||
## អនុវត្តិ - រៀនអំពីម្ហូប
|
||||
|
||||
ឥឡូវនេះការងារចាប់ផ្តើមទៅកាន់ជំហានចាប់អារម្មណ៍បន្ថែម។ ចូរផ្សព្វផ្សាយការបែងចែកទិន្នន័យ តាមម្ហូប
|
||||
|
||||
1. គូសទិន្នន័យជាកំណត់ប្លង់ដកថ្នេរជាតារាងដោយហៅ `barh()`៖
|
||||
|
||||
```python
|
||||
df.cuisine.value_counts().plot.barh()
|
||||
```
|
||||
|
||||

|
||||
|
||||
មានម្ហូបច្រើនណាស់ ប៉ុន្តែការបែងចែកទិន្នន័យមិនស្មើល្អទេ។ អ្នកអាចដោះស្រាយបាន! មុននោះ សូមស្វែងយល់បន្ថែម។
|
||||
|
||||
1. រកមើលថាតើមានទិន្នន័យប៉ុន្មានក្នុងមួយម្ហូប ហើយបោះពុម្ពវាចេញ៖
|
||||
|
||||
```python
|
||||
thai_df = df[(df.cuisine == "thai")]
|
||||
japanese_df = df[(df.cuisine == "japanese")]
|
||||
chinese_df = df[(df.cuisine == "chinese")]
|
||||
indian_df = df[(df.cuisine == "indian")]
|
||||
korean_df = df[(df.cuisine == "korean")]
|
||||
|
||||
print(f'thai df: {thai_df.shape}')
|
||||
print(f'japanese df: {japanese_df.shape}')
|
||||
print(f'chinese df: {chinese_df.shape}')
|
||||
print(f'indian df: {indian_df.shape}')
|
||||
print(f'korean df: {korean_df.shape}')
|
||||
```
|
||||
|
||||
លទ្ធផលដូចនេះ៖
|
||||
|
||||
```output
|
||||
thai df: (289, 385)
|
||||
japanese df: (320, 385)
|
||||
chinese df: (442, 385)
|
||||
indian df: (598, 385)
|
||||
korean df: (799, 385)
|
||||
```
|
||||
|
||||
## ស្វែងរកគ្រឿងផ្សំ
|
||||
|
||||
ឥឡូវនេះ អ្នកអាចស្ទង់ជ្រៅទៅក្នុងទិន្នន័យ និងស្វែងរកគ្រឿងផ្សំទូទៅក្នុងមួយម្ហូប។ អ្នកគួរតែសំអាតទិន្នន័យដែលមានកំហុសច្រើនបណ្ដាលឲ្យមានការភាន់ច្រឡំរវាងម្ហូប ដូចនេះ ចូររៀនអំពីបញ្ហានេះ។
|
||||
|
||||
1. បង្កើតមុខងារ `create_ingredient()` ក្នុង Python ដើម្បីបង្កើត dataframe គ្រឿងផ្សំ។ មុខងារនេះនឹងចាប់ផ្តើមដោយបោះបង់ស្ថំពត៌មានមិនមានប្រយោជន៍ ហើយតម្រៀបគ្រឿងផ្សំតាមចំនួន៖
|
||||
|
||||
```python
|
||||
def create_ingredient_df(df):
|
||||
ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')
|
||||
ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]
|
||||
ingredient_df = ingredient_df.sort_values(by='value', ascending=False,
|
||||
inplace=False)
|
||||
return ingredient_df
|
||||
```
|
||||
|
||||
ឥឡូវនេះ អ្នកអាចប្រើមុខងារនោះ ដើម្បីដឹងពីចំនួនគ្រឿងផ្សំដែលពេញនិយមចំនួនដប់ខាងលើតាមមុខម្ហូប។
|
||||
|
||||
1. ហៅ `create_ingredient()` ហើយគូសវាបញ្ចូល `barh()`៖
|
||||
|
||||
```python
|
||||
thai_ingredient_df = create_ingredient_df(thai_df)
|
||||
thai_ingredient_df.head(10).plot.barh()
|
||||
```
|
||||
|
||||

|
||||
|
||||
1. ធ្វើដូចគ្នាសម្រាប់ទិន្នន័យជប៉ុន៖
|
||||
|
||||
```python
|
||||
japanese_ingredient_df = create_ingredient_df(japanese_df)
|
||||
japanese_ingredient_df.head(10).plot.barh()
|
||||
```
|
||||
|
||||

|
||||
|
||||
1. ឥឡូវសម្រាប់គ្រឿងផ្សំចិន៖
|
||||
|
||||
```python
|
||||
chinese_ingredient_df = create_ingredient_df(chinese_df)
|
||||
chinese_ingredient_df.head(10).plot.barh()
|
||||
```
|
||||
|
||||

|
||||
|
||||
1. គូសគ្រឿងផ្សំឥណ្ឌា៖
|
||||
|
||||
```python
|
||||
indian_ingredient_df = create_ingredient_df(indian_df)
|
||||
indian_ingredient_df.head(10).plot.barh()
|
||||
```
|
||||
|
||||

|
||||
|
||||
1. ចុងក្រោយ គូសគ្រឿងផ្សំកូរ៉េ៖
|
||||
|
||||
```python
|
||||
korean_ingredient_df = create_ingredient_df(korean_df)
|
||||
korean_ingredient_df.head(10).plot.barh()
|
||||
```
|
||||
|
||||

|
||||
|
||||
1. ឥឡូវនេះ បោះបង់គ្រឿងផ្សំពេញនិយមបំផុតដែលបង្កការភាន់ច្រឡំរវាងម្ហូបតាមរយៈការហៅ `drop()`៖
|
||||
|
||||
មនុស្សគ្រប់គ្នាស្រឡាញ់បាយ, ខ្ទឹម និង ខ្ទិះខ្ទិះ!
|
||||
|
||||
```python
|
||||
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)
|
||||
labels_df = df.cuisine #.មិនម្តង()
|
||||
feature_df.head()
|
||||
```
|
||||
|
||||
## សមតុល្យទិន្នន័យ
|
||||
|
||||
ឥឡូវនេះ អ្នកបានសំអាតទិន្នន័យហើយ ប្រើ [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "វិធីសាស្ត្របង្កើតគំរូបន្ថែមធម្មតា" - ដើម្បីសមតុល្យវា។
|
||||
|
||||
1. ហៅ `fit_resample()`, វិធីសាស្ត្រនេះបង្កើតគំរូថ្មីសម្រាប់នាំចេញតាមរយៈការបញ្ចូល។
|
||||
|
||||
```python
|
||||
oversample = SMOTE()
|
||||
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
|
||||
```
|
||||
|
||||
ដោយសមតុល្យទិន្នន័យ អ្នកនឹងទទួលបានលទ្ធផលល្អជាងពេលបែងចំណាត់វា។ សូមគិតអំពីបែងចំណាត់ពីរប្រាំពីរណ៍។ ប្រសិនបើភាគច្រើននៃទិន្នន័យមានថ្នាក់មួយថ្នាក់ណាមួយ ម៉ូដែល ML ចូលចិត្តទាយថា ថ្នាក់នោះកើតឡើងច្រើនជាងគេ ដោយសារតែវាមានទិន្នន័យច្រើន។ ការសមតុល្យទិន្នន័យ ជួយដកជម្រុញនៃទិន្នន័យហួសហេតុនั้น។
|
||||
|
||||
1. ឥឡូវអ្នកអាចពិនិត្យចំនួនស្លាកក្នុងគ្រឿងផ្សំ៖
|
||||
|
||||
```python
|
||||
print(f'new label count: {transformed_label_df.value_counts()}')
|
||||
print(f'old label count: {df.cuisine.value_counts()}')
|
||||
```
|
||||
|
||||
លទ្ធផលរបស់អ្នកដូចនេះ៖
|
||||
|
||||
```output
|
||||
new label count: korean 799
|
||||
chinese 799
|
||||
indian 799
|
||||
japanese 799
|
||||
thai 799
|
||||
Name: cuisine, dtype: int64
|
||||
old label count: korean 799
|
||||
indian 598
|
||||
chinese 442
|
||||
japanese 320
|
||||
thai 289
|
||||
Name: cuisine, dtype: int64
|
||||
```
|
||||
|
||||
ទិន្នន័យបានស្អាតស្អំ សមតុល្យហើយឆ្ងាញ់ណាស់!
|
||||
|
||||
1. ជំហានចុងក្រោយ គឺរក្សាទុកទិន្នន័យមានសមតុល្យរបស់អ្នក ដែលរួមមានស្លាក និងលក្ខណៈពិសេស ទៅក្នុង dataframe ថ្មីដែលអាចនាំចេញទៅឯកសារមួយបាន៖
|
||||
|
||||
```python
|
||||
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
|
||||
```
|
||||
|
||||
1. អ្នកអាចមើលទិន្នន័យម្ដងទៀតដោយប្រើ `transformed_df.head()` និង `transformed_df.info()`។ រក្សាទុកច្បាប់មួយនៃទិន្នន័យសម្រាប់ប្រើនៅមេរៀនក្រោយ៖
|
||||
|
||||
```python
|
||||
transformed_df.head()
|
||||
transformed_df.info()
|
||||
transformed_df.to_csv("../data/cleaned_cuisines.csv")
|
||||
```
|
||||
|
||||
CSV ថ្មីនេះឥឡូវនេះអាចរកបាននៅក្នុងថតទិន្នន័យមូលដ្ឋាន។
|
||||
|
||||
---
|
||||
|
||||
## 🚀បញ្ហាកម្រិតខ្ពស់
|
||||
|
||||
មាតិកានេះមានទិន្នន័យច្រើនដែលគួរឱ្យចាប់អារម្មណ៍។ សូមស្ទង់មើលថាតើថត `data` មានទិន្នន័យណាមួយដែលសមស្របសម្រាប់ការបែងចំណាត់ពីរប្រាំពីរណ៍ ឬច្រើនថ្នាក់? តើសំណួរអ្វីដែលអ្នកចង់សួរពីទិន្នន័យនោះ?
|
||||
|
||||
## [ការប្រលងក្រោយមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
## ការពិនិត្យ និងសិក្សាឯករាជ្យ
|
||||
|
||||
ស្វែងយល់អំពី API នៃ SMOTE។ តើវាភ្ជាប់នឹងការប្រើប្រាស់ពីរបៀបណា? តើវាដោះស្រាយបញ្ហាអ្វីខ្លះ?
|
||||
|
||||
## កិច្ចការត្រូវបំពេញ
|
||||
|
||||
[ស៊ើបអង្កេតវិធីសាស្ត្របែងចំណាត់ថ្នាក់](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,18 @@
|
||||
# អ្វីៗដែលត្រូវស្វែងរកវិធីចាត់ថ្នាក់
|
||||
|
||||
## សេចក្តីណែនាំ
|
||||
|
||||
នៅក្នុង [ឯកសាររបស់ Scikit-learn](https://scikit-learn.org/stable/supervised_learning.html) អ្នកនឹងបានជួបបញ្ជីធំបែបនៃវិធីសាស្រ្តក្នុងការចាត់ថ្នាក់ទិន្នន័យ។ សូមធ្វើការស្វែងរកតិចតួចនៅក្នុងឯកសារទាំងនេះ៖ គោលបំណងរបស់អ្នកគឺស្វែងរកវិធីចាត់ថ្នាក់ និងរកឃើញឯកសារទិន្នន័យមួយក្នុងកម្មវិធីសិក្សានេះ សំណួរមួយដែលអ្នកអាចសួរពីវា និងបច្ចេកទេសចាត់ថ្នាក់មួយ។ សូមបង្កើតសៀវភៅគណនាគ្រាប់ ឬតារាងក្នុងឯកសារ .doc ហើយពណ៌នាថាតើឯកសារទិន្នន័យនឹងដំណើរការជាមួយអាល់គរីធម៍ចាត់ថ្នាក់យ៉ាងដូចម្តេច។
|
||||
|
||||
## គោលវិធាន
|
||||
|
||||
| គោលវិធាន | ឧទាហរណ៍ល្អ | ត្រឹមត្រូវ | ត្រូវការកែលម្អ |
|
||||
| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| | មានឯកសារត្រូវបានបង្ហាញដោយផ្តោតលើអាល់គរីធម៍ចំនួន 5 ជាមួយនឹងបច្ចេកទេសចាត់ថ្នាក់មួយ។ សង្ខេបត្រូវបានពន្យល់យ៉ាងល្អ និងលម្អិត។ | មានឯកសារត្រូវបានបង្ហាញដោយផ្តោតលើអាល់គរីធម៍ចំនួន 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,35 @@
|
||||
{
|
||||
"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
|
||||
},
|
||||
"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,8 @@
|
||||
នេះគឺជាកន្លែងទំនេរបណ្ដោះអាសន្ន
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**:
|
||||
ឯកសារនេះត្រូវបានបម្លែងជាភាសាដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងខ្ញុំខិតខំរក្សាតម្លៃភាពត្រឹមត្រូវ ក៏សូមយល់ដឹងថា ការប្រែប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវខ្លះៗ។ ឯកសារដើមក្នុងភាសាម្រោងនឹងត្រូវបានគេសារពើភាគថាជាដើមដ៏មានសុពលភាព។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យបកប្រែដោយអ្នកជំនាញជាមនុស្ស។ យើងខ្ញុំមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការពន្យល់ខុសឆ្គងណាមួយដែលកើតមានដោយមានការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,16 @@
|
||||
# សិក្សាអ្នកដោះស្រាយ
|
||||
## សេចក្តីណែនាំ
|
||||
|
||||
ក្នុងមេរៀននេះ អ្នកបានរៀនអំពីអ្នកដោះស្រាយជាច្រើន ដែលភ្ជាប់អាល់ហ្គារីធម និងដំណើរការសិក្សាម៉ាស៊ីន ដើម្បីបង្កើតម៉ូដែលដែលមានភាពត្រឹមត្រូវ។ ដើរឆ្ពោះតាមអ្នកដោះស្រាយដែលបានរាប់បញ្ចូលក្នុងមេរៀន ហើយជ្រើសរើសពីរនាក់។ នៅក្នុងពាក្យរបស់អ្នកផ្ទាល់ ប្រៀបធៀប និងប្រៀបធៀបអ្នកដោះស្រាយទាំងពីរនេះ។ តើពួកគេដោះស្រាយបញ្ហាប្រភេទណា? ពួកគេចុះបញ្ជូលជាមួយជាដំនាក់ទំនងទិន្នន័យផ្សេងៗដូចម្តេច? ហេតុអ្វីបានជា អ្នកនឹងជ្រើសរើសមួយជំនួសមួយផ្សេងទៀត?
|
||||
## ប្រភេទវាយតម្លៃ
|
||||
|
||||
| ក្រមសីលធម៌ | ល្អឯក | គ្រប់គ្រាន់ | ត្រូវការកែលម្អ |
|
||||
| -------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------- |
|
||||
| | មានឯកសារ .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,35 @@
|
||||
{
|
||||
"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
|
||||
},
|
||||
"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,8 @@
|
||||
នេះគឺជាអ្នកប្ដូរទីតាំងបណ្តោះអាសន្ន
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបរិយាយ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខំប្រឹងធ្វើឱ្យបានត្រឹមត្រូវ សូមយល់ថាការបកប្រែដោយស្វ័យប្រវត្តិក៏អាចមានកំហុស ឬការមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាមាតុភាសាគួរត្រូវបានពិចារណាថាជាឧទាហរណ៍ដ៏មានអនុភាព។ សម្រាប់ព័ត៌មានសំខាន់ គួរតែប្រើការបកប្រែដោយមនុស្សដែលជាស្តង់ដារ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកកំហុសណាមួយដែលកើតឡើង ពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,242 @@
|
||||
# ការបែងចែកចំណាត់ថ្នាក់ម្ហូប 2
|
||||
|
||||
នៅក្នុងមេរៀនបែងចែកចំណាត់ថ្នាក់ទីពីរនេះ អ្នកនឹងស្វែងយល់ពីវិធីបន្ថែមទៀតដើម្បីចាត់ថ្នាក់ទិន្នន័យលេខ។ អ្នកនឹងរៀនពីផលប៉ះពាល់នៃការជ្រើសរើសឧបករណ៍ចាត់ថ្នាក់មួយបើដាក់ប្រៀបធៀបនឹងមួយផ្សេងទៀតផងដែរ។
|
||||
|
||||
## [សំណួរពីមុនមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
### លក្ខខណ្ឌមុន
|
||||
|
||||
យើងសន្និដ្ឋានថាអ្នកបានបញ្ចប់មេរៀនមុនៗ ហើយមានឯកសារទិន្នន័យបានធ្វើការសំអាតស្អាត រក្សាទុកនៅក្នុងថត `data` មានឈ្មោះ _cleaned_cuisines.csv_ នៅក្នុងឫស្សីដៃថតនេះដែលមាន៤មេរៀន។
|
||||
|
||||
### ការរៀបចំ
|
||||
|
||||
យើងបានបញ្ចូលឯកសារ _notebook.ipynb_ របស់អ្នកដែលមានទិន្នន័យបានស្អាត ហើយបានបំបែកវាជា dataframe X និង y រួចរាល់សម្រាប់ដំណើរការសាងសង់ម៉ូដែល។
|
||||
|
||||
## ផែនទីចាត់ថ្នាក់
|
||||
|
||||
មុននេះ អ្នកបានរៀនអំពីជម្រើសនានាជាមួយ Microsoft cheat sheet សម្រាប់ចាត់ថ្នាក់ទិន្នន័យ។ Scikit-learn ផ្ដល់ cheat sheet ប្រភេទដូចគ្នា ប៉ុន្តែមានការបែងចែកលម្អិតជាង ដែលអាចជួយបន្ថែមក្នុងការជ្រើសរើស estimators (ពាក្យផ្សេងសម្រាប់ឧបករណ៍ចាត់ថ្នាក់)៖
|
||||
|
||||

|
||||
> ទិដ្ឋភាព៖ [ចូលទៅកាន់ផែនទីនេះតាមអនឡាញ](https://scikit-learn.org/stable/tutorial/machine_learning_map/) ហើយចុចតាមផ្លូវដើម្បីអានឯកសារពាក់ព័ន្ធ។
|
||||
|
||||
### ផែនការ
|
||||
|
||||
ផែនទីនេះមានប្រយោជន៍ខ្លាំងនៅពេលអ្នកមានជំនាញច្បាស់លាស់ចំពោះទិន្នន័យរបស់អ្នក ដូច្នេះ អ្នកអាច 'ដើរដោយ' តាមផ្លូវក្នុងការជ្រើសរើសចំណាត់ថ្នាក់៖
|
||||
|
||||
- យើងមាន >50 ឧទាហរណ៍
|
||||
- យើងចង់ទាយថាជាក្រុមប្រភេទណា
|
||||
- យើងមានទិន្នន័យបានតម្រៀបស្លាកហើយ
|
||||
- យើងមានឧទាហរណ៍តិចជាង 100K
|
||||
- ✨ យើងអាចជ្រើស Linear 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_features_df, cuisines_label_df, test_size=0.3)
|
||||
```
|
||||
|
||||
## ឧបករណ៍ចាត់ថ្នាក់ Linear SVC
|
||||
|
||||
Support-Vector clustering (SVC) គឺជាកូនខ្លួនមួយនៃគ្រួសារឧបករណ៍ម៉ាសីនស្វ័យប្រវត្តិ Support-Vector (រៀនបន្ថែមអំពីវាខាងក្រោម)។ វិធីសាស្រ្តនេះ អ្នកអាចជ្រើស `'kernel'` ដើម្បីសម្រេចថាតើចែតូចLabelsយ៉ាងដូចម្តេច។ ប៉ារ៉ាម៉ែត្រ `'C'` មានន័យថា `'regularization'` ជាតុល្យភាពដែលគ្រប់គ្រងឥទ្ធិពលនៃប៉ារ៉ាម៉ែត្រ។ Kernel អាចជាតួអ្នកជាច្រើន [មួយចំនួន](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); នៅទីនេះ យើងកំណត់វាថា `'linear'` ដើម្បីធានាថាយើងប្រើ linear SVC។ Probability ត្រូវបានកំណត់ត្រឹម `'false'`; នៅទីនេះ យើងកំណត់វាថា `'true'` ដើម្បីប្រមូលការប៉ាន់ស្មានប្រូបាប៊ីលីទី។ យើងកំណត់ random state ទៅជា `'0'` ដើម្បីរំលោភទិន្នន័យ ដើម្បីទទួលបានប្រូបាប៊ីលីទី។
|
||||
|
||||
### ហាត់ប្រាណ - អនុវត្ត Linear SVC
|
||||
|
||||
ចាប់ផ្តើមដោយបង្កើតអារ៉េ (array) នៃឧបករណ៍ចាត់ថ្នាក់។ អ្នកនឹងបញ្ចូលបន្ថែមទៅក្នុងអារ៉េនេះ ដោយជាការបន្តជាដំណាក់កាលពាក់ព័ន្ធពេលដែលយើងសាកល្បង។
|
||||
|
||||
1. ចាប់ផ្តើមដោយ Linear SVC៖
|
||||
|
||||
```python
|
||||
C = 10
|
||||
# បង្កើតអ្នកចាត់ថ្នាក់ខុសៗគ្នា។
|
||||
classifiers = {
|
||||
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
|
||||
}
|
||||
```
|
||||
|
||||
2. បណ្តុះម៉ូដែលរបស់អ្នកជាមួយ Linear 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 គឺជាផ្នែកមួយនៃគ្រួសារពីរ “neighbors” នៃគម្រោងម៉ាស៊ីនស្វ័យប្រវត្តិ ដែលអាចប្រើសម្រាប់ការសិក្សាដោយមានមគ្គុទេសក៍ និងគ្មានមគ្គុទេសក៍។ វិធីសាស្រ្តនេះ បង្កើតចំនួនចាំបាច់នៃចំណុចមួយហើយទិន្នន័យត្រូវបានប្រមូលជុំវិញចំណុចទាំងនេះ ដើម្បីអាចទាយបានស្លាកទូទៅសម្រាប់ទិន្នន័យ។
|
||||
|
||||
### ហាត់ប្រាណ - អនុវត្តឧបករណ៍ចាត់ថ្នាក់ K-Neighbors
|
||||
|
||||
ឧបករណ៍ចាត់ថ្នាក់មុនគឺល្អ ហើយដំណើរការល្អជាមួយទិន្នន័យ ប៉ុន្តែប្រហែលជាយើងអាចទទួលបានភាពត្រឹមត្រូវល្អជាងនេះទៀត។ សាកល្បងឧបករណ៍ចាត់ថ្នាក់ K-Neighbors។
|
||||
|
||||
1. បន្ថែមមួយជួរដដែលទៅក្នុងអារ៉េឧបករណ៍ចាត់ថ្នាក់របស់អ្នក (បន្ថែមខ្ទង់ក្រោយមុខរបស់ Linear 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 classifiers គឺជាផ្នែកមួយនៃគ្រួសាររបស់ [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) នៃវិធីសាស្រ្តម៉ាស៊ីនស្វ័យប្រវត្តិដែលប្រើសម្រាប់ភារកិច្ចចាត់ថ្នាក់ និងរ៉េហ្គ្រេស្យុង។ SVMs "ផែនទីឧទាហរណ៍បណ្តុះបណ្តាលទៅកាន់ចំណុចក្នុងលំហ" ដើម្បីបង្កើនចម្ងាយរវាងក្រុមប្រភេទពីរ។ ទិន្នន័យបន្ទាប់ត្រូវបានផែនទីទៅក្នុងលំហនេះដើម្បីអាចទាយជាក្រុមប្រភេទ។
|
||||
|
||||
### ហាត់ប្រាណ - អនុវត្ត Support Vector Classifier
|
||||
|
||||
សូមសាកល្បងដើម្បីទទួលបានភាពត្រឹមត្រូវល្អជាងនេះជាមួយ Support Vector Classifier។
|
||||
|
||||
1. បន្ថែមខ្ទង់ក្រោយ K-Neighbors item ហើយបន្ថែមជួរបន្ទាប់៖
|
||||
|
||||
```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), វិធីសាស្រ្តជាមធ្យមមួយ បង្កើត 'ព្រៃ' នៃ 'ដើមឈើសម្រេចចិត្ត' ដែលបញ្ចូលករណីចៃដន្យដើម្បីជៀសវាងការបង្រួមខ្លួន។ ប៉ារ៉ាម៉ែត្រ 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,18 @@
|
||||
# លេងជាមួយប៉ារ៉ាម៉ែត្រ
|
||||
|
||||
## សេចក្ដីណែនាំ
|
||||
|
||||
មានប៉ារ៉ាម៉ែត្រច្រើនដែលត្រូវបានកំណត់ជាមុននៅពេលធ្វើការជាមួយអ្នកចាត់ថ្នាក់ទាំងនេះ។ Intellisense ក្នុង VS 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,8 @@
|
||||
នេះគឺជាកន្លែងកំណត់បណ្តោះអាសន្ន។
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈដែលយើងប្រឹងប្រែងឲ្យបានភាពត្រឹមត្រូវ សូមយល់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬព័ត៌មានមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាដើមគួរត្រូវបានពិចារណាថាជាឧទាហរណ៍ត្រឹមត្រូវ។ សម្រាប់ព័ត៌មានសំខាន់ណាស់ សូមផ្តល់អាទិភាពការបកប្រែដោយមនុស្សជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ខុស ឬការបកស្រាយខុសផ្សេងៗដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,322 @@
|
||||
# កសាងកម្មវិធីេបសាយផ្តល់អត្ថសម្គាល់អំពីម្ហូប
|
||||
|
||||
នៅមេរៀននេះ អ្នកនឹងកសាងម៉ូដែលចាត់ថ្នាក់ដោយប្រើបច្ចេកទេសខ្លះៗដែលអ្នកបានរៀនពីមេរៀនមុនៗ និងដោយប្រើឃ្លើងទិន្នន័យម្ហូបឆ្ងាញ់ដែលបានប្រើជារឿយៗក្នុងស៊េរីនេះ។ លើសពីនេះ អ្នកនឹងកសាងកម្មវិធីេបសាយតូចមួយ ដើម្បីប្រើម៉ូដែលដែលបានរក្សាទុក ដោយប្រើ Onnx រចនាសម្ព័ន្ធក្នុងបណ្តាញ។
|
||||
|
||||
មួយក្នុងចំណោមការប្រើប្រាស់ប្រព័ន្ធស្វ័យប្រវត្តិមានប្រយោជន៍បំផុត គឺការកសាងប្រព័ន្ធផ្ដល់សំណើណែនាំ ហើយអ្នកអាចចាប់ផ្តើមជំហានដំបូងនោះថ្ងៃនេះ!
|
||||
|
||||
[](https://youtu.be/17wdM9AHMfg "Applied ML")
|
||||
|
||||
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូៈ Jen Looper សាងសង់កម្មវិធីេបសាយដោយប្រើទិន្នន័យអាហារចាត់ថ្នាក់
|
||||
|
||||
## [វាយតម្លៃមុនការបង្រៀន](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
នៅមេរៀននេះ អ្នកនឹងរៀនពី៖
|
||||
|
||||
- របៀបកសាងម៉ូដែល ហើយរក្សាទុកវាជា Onnx ម៉ូដែល
|
||||
- របៀបប្រើ Netron ដើម្បីពិនិត្យម៉ូដែល
|
||||
- របៀបប្រើម៉ូដែលរបស់អ្នកនៅក្នុងកម្មវិធីេបសាយសម្រាប់ការប៉ាន់ស្មាន
|
||||
|
||||
## កសាងម៉ូដែលរបស់អ្នក
|
||||
|
||||
ការកសាងប្រព័ន្ធ ML អនុវត្តមានសារៈសំខាន់ក្នុងការប្រើប្រាស់បច្ចេកវិទ្យាទាំងនេះសម្រាប់ប្រព័ន្ធអាជីវកម្មរបស់អ្នក។ អ្នកអាចប្រើម៉ូដែលនៅក្នុងកម្មវិធីេបសាយរបស់អ្នក (ហើយដូច្នេះអាចប្រើវាក្នុងបរិបទក្រៅបណ្ដាញ ប្រសិនបើចាំបាច់) ដោយប្រើ Onnx។
|
||||
|
||||
ក្នុងមេរៀនមុន ([មេរៀនមុន](../../3-Web-App/1-Web-App/README.md)) អ្នកបានកសាងម៉ូដែល Regression នៃការកាន់កាប់ UFO ហើយរក្សាទុកវា "pickled" ហើយបានប្រើវានៅក្នុងកម្មវិធី Flask។ ទោះបីជាស្ថាបត្យកម្មនេះមានប្រយោជន៍ដល់ការយល់ដឹង ក៏វាជាកម្មវិធី Python ពេញលេញ ហើយតម្រូវការរបស់អ្នកអាចមានការប្រើប្រាស់កម្មវិធី JavaScript។
|
||||
|
||||
នៅក្នុងមេរៀននេះ អ្នកអាចកសាងប្រព័ន្ធមូលដ្ឋានដែលបង្កើតជាកកម្មវិធី JavaScript សម្រាប់ការប៉ាន់ស្មាន។ ប៉ុន្តែមុននឹងនោះ អ្នកត្រូវហ្វឹកហាត់ម៉ូដែល និងបម្លែងវាសម្រាប់ប្រើជាមួយ Onnx ។
|
||||
|
||||
## វាយតម្លៃ - ហ្វឹកហាត់ម៉ូដែលចាត់ថ្នាក់
|
||||
|
||||
ដំបូង សូមហ្វឹកហាត់ម៉ូដែលចាត់ថ្នាក់ ដោយប្រើឃ្លើងទិន្នន័យម្ហូបដដែលដែលបានសំអាត។
|
||||
|
||||
1. ចាប់ផ្តើមដោយនាំចូលបណ្ណាល័យមានប្រយោជន៍៖
|
||||
|
||||
```python
|
||||
!pip install skl2onnx
|
||||
import pandas as pd
|
||||
```
|
||||
|
||||
អ្នកត្រូវការពាក្យ '[skl2onnx](https://onnx.ai/sklearn-onnx/)' ដើម្បីជួយបម្លែងម៉ូដែល Scikit-learn របស់អ្នកទៅទ្រង់ទ្រាយ Onnx ។
|
||||
|
||||
1. បន្ទាប់មក ប្រើព័ត៌មានរបស់អ្នកដូចជាដែលបានធ្វើក្នុងមេរៀនមុន ដោយអានឯកសារ CSV ដោយប្រើ `read_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 Classification ដូចដែលបានធ្វើក្នុងមេរៀនមុន៖
|
||||
|
||||
```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
|
||||
|
||||
សូមប្រាកដថាបម្លែងដោយប្រើលេខ Tensor ត្រឹមត្រូវ។ ឃ្លើងទិន្នន័យនេះមាន ៣៨០ សមាសធាតុ ដែលត្រូវសរសេរលេខនោះនៅក្នុង `FloatTensorType`:
|
||||
|
||||
1. បម្លែងដោយប្រើលេខ tensor ៣៨០ ។
|
||||
|
||||
```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' ជា True និង 'zipmap' ជា False។ ដោយសារតែនេះជាម៉ូដែលចាត់ថ្នាក់ អ្នកមានជម្រើសដើម្បីដកចេញ ZipMap ដែលបង្កើតបញ្ជីវចនានុក្រម (មិនចាំបាច់)។ `nocl` មានន័យពីព័ត៌មានថ្នាក់បានរួមបញ្ចូលក្នុងម៉ូដែល។ បន្ថយទំហំម៉ូដែលរបស់អ្នកដោយកំណត់ `nocl` ជា 'True' ។
|
||||
|
||||
ការប្រើបញ្ចូលទាំងស្រុងនៃកំណត់ត្រានេះ នឹងកសាង Onnx ម៉ូដែល ហើយរក្សាទុកវាទៅក្នុងថតនេះ។
|
||||
|
||||
## មើលម៉ូដែលរបស់អ្នក
|
||||
|
||||
ម៉ូដែល Onnx មិនងាយស្រួលមើលក្នុង Visual Studio code ជាមូលដ្ឋានទេ ប៉ុន្តែមានកម្មវិធីសំណើមដោយឥតគិតថ្លៃមួយដែលអ្នកស្រាវជ្រាវជាច្រើនប្រើសម្រាប់មើលម៉ូដែល ដើម្បីធានាថាម៉ូដែលត្រូវបានសាងសង់យ៉ាងត្រឹមត្រូវ។ សូមទាញយក [Netron](https://github.com/lutzroeder/Netron) ហើយបើកឯកសារ model.onnx របស់អ្នក។ អ្នកអាចមើលម៉ូដែលសាមញ្ញរបស់អ្នកដូចរូបភាព ផ្តល់ជាមួយ ៣៨០ inputs និងម៉ាស៊ីនចាត់ថ្នាក់៖
|
||||
|
||||

|
||||
|
||||
Netron គឺជាឧបករណ៍មានប្រយោជន៍សម្រាប់មើលម៉ូដែលរបស់អ្នក។
|
||||
|
||||
ឥឡូវអ្នកបានរួចរាល់ក្នុងការប្រើម៉ូដែលនេះនៅក្នុងកម្មវិធីេបសាយ។ មកកសាងកម្មវិធីមួយដែលមានប្រយោជន៍ពេលអ្នកមើលក្នុងទូរទឹកកក ហើយព្យាយាមស្វែងរកភាពចម្រុះនៃសមាសធាតុដែលនៅសល់ អ្នកអាចប្រើវាសម្រាប់ធ្វើម្ហូបជាមួយម្ហូបជាតិដែលម៉ូដែលសម្គាល់បាន។
|
||||
|
||||
## កសាងកម្មវិធីេបសាយផ្ដល់អត្ថសម្គាល់
|
||||
|
||||
អ្នកអាចប្រើម៉ូដែលរបស់អ្នកដោយផ្ទាល់នៅក្នុងកម្មវិធីេបសាយ។ រចនាសម្ព័ន្ធនេះអនុញ្ញាតឲ្យអ្នកដំណើរការវាផ្ទាល់និងក្រៅបណ្ដាញ ប្រសិនបើចាំបាច់។ ចាប់ផ្តើមដោយបង្កើតឯកសារ `index.html` ក្នុងថតដដែលដែលអ្នកបានរក្សាទុកឯកសារ `model.onnx` របស់អ្នក។
|
||||
|
||||
1. ក្នុងឯកសារ _index.html_ នេះ បន្ថែម markup ខាងក្រោម៖
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<header>
|
||||
<title>Cuisine Matcher</title>
|
||||
</header>
|
||||
<body>
|
||||
...
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
1. ឥឡូវនេះ ដំណើរការក្នុងស្លាក `body` បន្ថែម markup តូចមួយសម្រាប់បង្ហាញបញ្ជីប្រអប់ជ្រើសរើសដែលបង្ហាញសមាសធាតុខ្លះៗ៖
|
||||
|
||||
```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។ អ្នកអាចពិនិត្យ [សៀវភៅបញ្ជីសំគ្រិត](../../../../4-Classification/data/ingredient_indexes.csv) ដើម្បីស្វែងរកលេខរៀងសមាសធាតុ។
|
||||
|
||||
បន្តការងាររបស់អ្នកនៅក្នុងឯកសារ index.html បន្ថែមបរិច្ឆេទ script ដែលហៅម៉ូដែលក្រោយពី `</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. ពេលមាន Runtime ស្រេច អ្នកអាចហៅវា៖
|
||||
|
||||
```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. អ្នកបានបង្កើតអារេ ៣៨០ តម្លៃដែលអាចជា 1 ឬ 0 ដើម្បីកំណត់ និងផ្ញើទៅម៉ូដែលសម្រាប់ការប៉ាន់ស្មាន ពីព្រោះប្រសិនបើប្រអប់ជ្រើសរើសត្រូវបានតំណល់។
|
||||
2. អ្នកបានបង្កើតអារេប្រអប់ជ្រើសរើស និងវិធីសាស្រ្តក្នុងការកំណត់ថាតើពួកវាត្រូវបានជ្រើសឬទេ នៅក្នុងមុខងារ `init` ដែលត្រូវបានហៅនៅពេលកម្មវិធីចាប់ផ្តើម។ ពេលប្រអប់ជ្រើសរើសត្រូវបានកំណត់ `ingredients` អារេនឹងផ្លាស់ប្តូរដើម្បីបង្ហាញសមាសធាតុដែលត្រូវបានជ្រើស។
|
||||
3. អ្នកបានបង្កើតមុខងារ `testCheckboxes` ដែលពិនិត្យថាតើមានប្រអប់ជ្រើសរើសណាហើយត្រូវបានជ្រើស។
|
||||
4. អ្នកប្រើមុខងារ `startInference` នៅពេលពិន្ទុត្រូវបានចុច ហើយ ប្រសិនបើមានប្រអប់ជ្រើសរើស ត្រូវចាប់ផ្តើមការប៉ាន់ស្មាន។
|
||||
5. វិធីសាស្រ្តប៉ាន់ស្មាន រួមមាន៖
|
||||
1. កំណត់ការផ្ទុកម៉ូដែលប្រភេទអាស៊ីនក
|
||||
2. បង្កើតរចនាសម្ព័ន្ធ Tensor ដើម្បីផ្ញើទៅម៉ូដែល
|
||||
3. បង្កើត 'feeds' ដែលបង្ហាញ `float_input` ជាញឹកញាប់ដែលបានបង្កើតនៅពេលហ្វឹកហាត់ម៉ូដែល (អ្នកអាចប្រើ Netron ដើម្បីផ្ទៀងផ្ទាត់ឈ្មោះនោះ)
|
||||
4. ផ្ញើ 'feeds' ទៅម៉ូដែល ហើយរង់ចាំការឆ្លើយតបទៅវិញ
|
||||
|
||||
## សាកល្បងកម្មវិធីរបស់អ្នក
|
||||
|
||||
បើកការសម្មរណ៍បញ្ជា (terminal) នៅក្នុង Visual Studio Code ក្នុងថតដែលមានឯកសារ index.html របស់អ្នក។ ប្រាកដថាអ្នកបានដំឡើង [http-server](https://www.npmjs.com/package/http-server) ជាទូទៅរួចហើយ ហើយវាយ `http-server` នៅក្នុងបញ្ជាលេខា។ វ៉ិបសឺវ័របើកឡើងក្នុង localhost ហើយអ្នកអាចមើលកម្មវិធីេបសាយរបស់អ្នកបាន។ ពិនិត្យមើលម្ហូបណាដែលផ្ដល់ជាមួយមុខម្ហូបណាមួយដោយផ្អែកលើសមាសធាតុផ្សេងៗ៖
|
||||
|
||||

|
||||
|
||||
សូមអបអរ যাচាហ៎ អ្នកបានបង្កើតកម្មវិធីេបសាយ 'ផ្ដល់អត្ថសម្គាល់' ជាមួយវាលតិចៗមួយចំនួន។ ចំណាយពេលបន្តកសាងប្រព័ន្ធនេះ!
|
||||
|
||||
## 🚀កញ្ញាប្រលង
|
||||
|
||||
កម្មវិធីេបសាយរបស់អ្នកមានលក្ខណៈគ្រួសារគតិយុត្តិ ផ្ទាល់បន្តកសាងវាជាមួយសមាសធាតុ និងលេខរៀងរបស់ពួកវាពីទិន្នន័យ [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv)។ តើការចម្រុះរសជាតិនានាដែលអាចធ្វើឱ្យផលិតម្ហូបជាតិណាដែលបានកំណត់?
|
||||
|
||||
## [វាយតម្លៃបន្ទាប់ពីការបង្រៀន](https://ff-quizzes.netlify.app/en/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,18 @@
|
||||
# សាងសង់កម្មវិធីផ្តល់អនុសាសន៍
|
||||
|
||||
## មេរៀនណែនាំ
|
||||
|
||||
ដោយផ្អែកលើលំហាត់នានារបស់អ្នកក្នុងមេរៀននេះ អ្នកឥឡូវនេះបានដឹងពីវិធីសាស្រ្តសាងសង់កម្មវិធីវែបផ្អែកលើ JavaScript ដោយប្រើ 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,35 @@
|
||||
{
|
||||
"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
|
||||
},
|
||||
"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,34 @@
|
||||
# ការចាប់ផ្តើមជាមួយការបែងចែកប្រភេទ
|
||||
|
||||
## ប្រធានបទតំបន់៖ ម្ហូបអាស៊ីនិងឥណ្ឌាដ៏ឆ្ងាញ់ 🍜
|
||||
|
||||
នៅក្នុងអាស៊ី និងឥណ្ឌា ប្រពៃណីម្ហូបរបស់ពួកគេមានភាពផ្សេងប្លែកខ្លាំង ហើយឆ្ងាញ់បំផុត! យើងមកមើលទិន្នន័យអំពី ម្ហូបតំបន់ ដើម្បីព្យាយាមយល់ពីគ្រឿងផ្សំរបស់ពួកវា។
|
||||
|
||||

|
||||
> រូបថតដោយ <a href="https://unsplash.com/@changlisheng?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Lisheng Chang</a> នៅលើ <a href="https://unsplash.com/s/photos/asian-food?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
|
||||
|
||||
## អ្វីដែលអ្នកនឹងរៀន
|
||||
|
||||
នៅក្នុងផ្នែកនេះ អ្នកនឹងបន្ដគ្រាន់តែការសិក្សាបឋមរបស់អ្នកអំពី Regression ហើយរៀនអំពីអ្នកបែងចែកប្រភេទផ្សេងទៀតដែល អ្នកអាចប្រើដើម្បីយល់ចំពោះទិន្នន័យបានល្អប្រសើរជាងមុន។
|
||||
|
||||
> មានឧបករណ៍ទាបកូដដែលមានប្រយោជន៍សម្រាប់ជួយអ្នករៀនអំពីការធ្វើការជាមួយម៉ូដែលបែងចែកប្រភេទ។ សាកល្បង [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. [ការអនុវត្ត ML៖ បង្កើតកម្មវិធីបណ្ដាញ](4-Applied/README.md)
|
||||
|
||||
## ឥណទាន
|
||||
|
||||
"ការចាប់ផ្តើមជាមួយការបែងចែកប្រភេទ" ត្រូវបានសរសេរដោយ♥️ [Cassie Breviu](https://www.twitter.com/cassiebreviu) និង [Jen Looper](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,339 @@
|
||||
# សេចក្ដីផ្តើមអំពីការចែកទំព័រ
|
||||
|
||||
ការចែកទំព័រជាប្រភេទ [ការសិក្សាឥតគ្រប់គ្រង](https://wikipedia.org/wiki/Unsupervised_learning) ដែលគិតថា អាសយដ្ឋានទិន្នន័យមួយគ្មានស្លាក ឬថា បញ្ចូលរបស់វាមិនបានផ្គូរផ្គងជាមួយលទ្ធផលដែលកំណត់រួចជាស្រេច។ វាប្រើប្រាស់អាល់ហ្គរីធម៍ផ្សេងៗ ដើម្បីខ្វះខាតតាមទិន្នន័យគ្មានស្លាក និងផ្តល់ការបែងចែកតាមលំនាំដែលវាស្គាល់បានក្នុងទិន្នន័យ។
|
||||
|
||||
[](https://youtu.be/ty2advRiWJM "No One Like You by PSquare")
|
||||
|
||||
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូ។ ខណៈពេលដែលអ្នកកំពុងសិក្សាអំពីការសិក្សាម៉ាស៊ីនជាមួយការចែកទំព័រ សូមរីករាយជាមួយបទចម្រៀង Dance Hall នៃប្រទេសណាយហ្សេរី - នេះជាបទដែលមានការវាយតម្លៃខ្ពស់បំផុតពីឆ្នាំ ២០១៤ ដោយ 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")
|
||||
|
||||
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូ: John Guttag នៃ MIT ផ្តល់បង្ហាញអំពីការចែកទំព័រ
|
||||
|
||||
នៅក្នុងបរិបទវិជ្ជាជីវៈ ការចែកទំព័រអាចប្រើសម្រាប់កំណត់របស់ដូចជា បំបែកទីផ្សារ កំណត់អាយុក្រុមដែលទិញទំនិញណាមួយ ជាដើម។ ការប្រើប្រាស់មួយផ្សេងទៀតគឺកំណត់ការរកឃើញករណីបញ្ហា ដូចជាការរកឃើញការលួចសារ ប្រសិនបើមានទិន្នន័យប្រតិបត្តិការកាតឥណទាន។ ឬអ្នកអាចប្រើការចែកទំព័រដើម្បីកំណត់ឆៅនៅក្នុងស្កេនវេជ្ជសាស្ត្រជាច្រើន។
|
||||
|
||||
✅ ចំណាយពេលមួយនាទីគិតពីរបៀបដែលអ្នកប្រហែលជាបានប្រទះមកការចែកទំព័រ 'ក្នុងធម្មជាតិ' នៅក្នុងបរិបទធនាគារ អ៊ី-ម៉ាស៊ីនបំពង់ ឬអាជីវកម្ម។
|
||||
|
||||
> 🎓 វិជ្ជាជីវៈដែលគួរឲ្យចាប់អារម្មណ៍ ការវិភាគក្រុមត្រូវបានចាប់ផ្តើមនៅក្នុងដែនវិទ្យាសាស្ត្រអង់ត្រូប្យូឡូជី និង ហ្សីកូឡូជី ក្នុងឆ្នាំ ១៩៣០។ តើអ្នកអាចស្រមៃថាវាបានប្រើប្រាស់ដូចម្តេច?
|
||||
|
||||
ផ្សេងទៀត អ្នកអាចប្រើសម្រាប់ក្រុមលទ្ធផលស្វែងរក - តាមតំណភ្ជាប់ទំនិញ រូបភាព ឬ ការវាយតម្លៃ ជាដើម។ ការចែកទំព័រមានប្រយោជន៍ពេលអ្នកមានទិន្នន័យធំដែលអ្នកចង់បន្ថយ ហើយចង់អនុវត្តវិភាគលម្អិតជាងនេះ ដូច្នេះបច្ចេកវិទ្យានេះអាចប្រើសម្រាប់រៀនអំពីទិន្នន័យមុនពេលម៉ូដែលផ្សេងទៀតត្រូវបានបង្កើត។
|
||||
|
||||
✅ ពេលទិន្នន័យរបស់អ្នកត្រូវរៀបចំជាក្រុម អ្នកផ្ដល់លេខសម្គាល់ក្រុម ហើយបច្ចេកទេសនេះអាចមានប្រយោជន៍ពេលរក្សាទុកឯកជនភាពនៃទិន្នន័យ; អ្នកអាចយោងទៅតាមចំណុចទិន្នន័យដោយលេខសម្គាល់ក្រុមជំនួស លេខសម្គាល់ដែលបង្ហាញអត្តសញ្ញាណខ្លះៗជាងនេះ។ តើអ្នកអាចគិតមូលហេតុផ្សេងទៀតដែលអ្នកនឹងយោងលេខសម្គាល់ក្រុមជំនួសធាតុផ្សេងៗក្នុងក្រុមដើម្បីកំណត់វា?
|
||||
|
||||
ពង្រីកការយល់ដឹងរបស់អ្នកអំពីបច្ចេកទេសចែកទំព័រនៅក្នុង [មូឌុលរៀននេះ](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 | ក្រុមច្រើន មានកំណត់ ចម្ងាយមិនមែន Euclidean ជាវិធីប្រើផ្ទាល់ |
|
||||
| DBSCAN | ជីមេត្រីមិនស្មើរ មិនស្មើរ ជាវិធីប្រើផ្ទាល់ |
|
||||
| OPTICS | ជីមេត្រីមិនស្មើរ មិនស្មើរជាមួយដង់ស៊ីតេចម្រុះ ជាវិធីប្រើផ្ទាល់ |
|
||||
| Gaussian mixtures | ជីមេត្រីស្មើរ ជាវិធីចូលពីមុខ |
|
||||
| BIRCH | ទិន្នន័យធំពីរដុំជាមួយ outliers ជាវិធីចូលពីមុខ |
|
||||
|
||||
> 🎓 របៀបយើងបង្កើតក្រុមមានទំនាក់ទំនងយ៉ាងខ្លាំងជាមួយរបៀបយើងបម្លែងចំណុចទិន្នន័យទៅជាក្រុម។ មកពន្យល់ពាក្យមួយចំនួន៖
|
||||
>
|
||||
> 🎓 ['ប្រភេទប្រើផ្ទាល់' ទល់នឹង 'ចូលពីមុខ'](https://wikipedia.org/wiki/Transduction_(machine_learning))
|
||||
>
|
||||
> ការអនុវត្តប្រភេទប្រើផ្ទាល់ចេញមកពីករណីបណ្តុះបណ្តាលដែលត្រូវម៉េចទៅករណីតេស្តជាក់លាក់។ ការអនុវត្តចូលពីមុខចេញពីករណីបណ្តុះបណ្តាលដែលប្រើទៅលក្ខណៈទូទៅ ហើយបន្ទាប់មកអនុវត្ដទៅករណីតេស្ត។
|
||||
>
|
||||
> ឧទាហរណ៍៖ សូមស្រមៃថាអ្នកមានទិន្នន័យដែលមានស្លាកតិចតួច។ អ្វីខ្លះជារេកតិត (records), អ្វីខ្លះជាលីបស៊ីឌី (cds), ហើយអ្វីខ្លះទៀតទទេ។ ការងាររបស់អ្នកគឺផ្ដល់ស្លាកមកសម្រាប់អ្វីទទេ។ ប្រសិនបើអ្នកជ្រើសរើសវិធីចូលពីមុខ អ្នកនឹងបង្ហាត់ម៉ូដែលស្វែងរករេកតិត និងលីបស៊ីឌី ហើយអនុវត្តស្លាកទាំងនោះទៅលើទិន្នន័យគ្មានស្លាក។ វិធីនេះនឹងមានបញ្ហាក្នុងការបែងចែកវត្ថុដែលពិតជាជាស៊ីស៊ីត (cassettes)។ តាមផ្ទុយ, វិធីប្រើផ្ទាល់មានសមត្ថភាពច្រើនក្នុងការដោះស្រាយទិន្នន័យមិនស្គាល់ ដោយវាធ្វើការបែងចែកវត្ថុដូចគ្នាជាក្រុម ហើយបន្ទាប់មកផ្ដល់ស្លាកទៅក្រុម។ ក្នុងករណីនេះ ក្រុមអាចបង្ហាញថាអ្វីដែលជាវត្ថុនឹងទំនាក់ទំនងទៅនឹងតន្ត្រីធ្វើដូចជា 'រង្វង់តន្ត្រី' និង 'ការ៉េតន្ត្រី'។
|
||||
>
|
||||
> 🎓 ['ជីមេត្រីមិនស្មើ' ទល់នឹង 'ជីមេត្រីស្មើ'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)
|
||||
>
|
||||
> ប្រភពលើកទឹកចិត្តពីពាក្យគណិតវិទ្យា ជីមេត្រមិនស្មើ និងជីមេត្រីស្មើ បង្ហាញពីវិធីវាស់ចម្ងាយរវាងចំណុច ដោយប្រើវិធីជីមេត្រស្មើ ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) ឬ មិនស្មើ (non-Euclidean)។
|
||||
>
|
||||
>'ជីមេត្រីស្មើ' មានន័យជាជីមេត្រយូក្លីដ (ដែលផ្នែកមួយត្រូវបានបង្រៀនជាជីមេត្រប្លែន), ខណៈដែលជីមេត្រមិនស្មើមានន័យជាជីមេត្រមិនយូឃ្លីដ។ តើជីមេត្រមានទំនាក់ទំនងយ៉ាងដូចម្តេចជាមួយការសិក្សាម៉ាស៊ីន? ជាផ្នែកមួយនៃវិស័យវិទ្យាសាស្ត្រគណិតវិទ្យា ត្រូវមានវិធីសម្រាប់វាស់ចម្ងាយរវាងចំណុចនៅក្នុងក្រុម និងវា អាចធ្វើបានក្នុងរបៀប 'ស្មើ' ឬ 'មិនស្មើ' ដោយហេតុផលពីធម្មជាតិនៃទិន្នន័យ។ [ចម្ងាយយូឃ្លីដ](https://wikipedia.org/wiki/Euclidean_distance) គឺវាស់ថាវែងបន្ទាត់រវាងចំណុចពីរដុល។ [ចម្ងាយមិនយូឃ្លីដ](https://wikipedia.org/wiki/Non-Euclidean_geometry) គឺវាស់ជាប្រវែងតាមខ្សែវង់។ ប្រសិនបើទិន្នន័យរបស់អ្នក, ដែលបានបង្ហាញរូបមន្ត, មិនមានលំនាំស្មើផ្លែនទេ អ្នកប្រហែលជាត្រូវប្រើអាល់ហ្គរីធម៍ពិសេសមួយដើម្បីដោះស្រាយវា។
|
||||
>
|
||||

|
||||
> រូបភាពបង្ហាញដោយ [Dasani Madipalli](https://twitter.com/dasani_decoded)
|
||||
>
|
||||
> 🎓 ['ចម្ងាយ'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)
|
||||
>
|
||||
> ក្រុមត្រូវបានកំណត់ដោយ ម៉ាទ្រីចចម្ងាយរបស់ពួកវា ពិរុទ្ធជា ចម្ងាយរវាងចំណុច។ ចម្ងាយនេះអាចវាស់បានជាច្រើនវិធី។ ក្រុមយូឃ្លីដត្រូវបានកំណត់ដោយមធ្យមនៃតម្លៃចំណុច ហើយមាន 'ចំណុចកណ្តាល' ឬចំណុចមជ្ឈមណ្ឌល។ ចម្ងាយត្រូវវាស់ដោយចម្ងាយទៅរកចំណុចមជ្ឈមណ្ឌលនោះ។ ចម្ងាយមិនយូឃ្លីដត្រូវបានទាក់ទងទៅនឹង 'clustroids' ដែលជាចំណុចនៅជិតចំណុចផ្សេងទៀតបំផុត។ Clustroids អាចត្រូវបានកំណត់ដោយវិធីផ្សេងៗ។
|
||||
>
|
||||
> 🎓 ['មានកំណត់'](https://wikipedia.org/wiki/Constrained_clustering)
|
||||
>
|
||||
> [Constrained Clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) ណែនាំការសិក្សាជាដំណែក<em>ធ្វើយូរអចលន៍</em>ទៅវិធីសាស្ត្រឥតគ្រប់គ្រងនេះ។ អត្ថិភាពរវាងចំណុចត្រូវបានពិនិត្យថា 'មិនអាចភ្ជាប់' ឬ 'ត្រូវភ្ជាប់' ដូច្នេះ ឬជាការបង្ខំច្បាប់លើទិន្នន័យ។
|
||||
>
|
||||
>ឧទាហរណ៍៖ ប្រសិនបើអាល់ហ្គរីធម៍ត្រូវបានដាក់ឲ្យប្រើលើឈុតទិន្នន័យដែលគ្មានស្លាក ឬស្លាកប៉ុន្មានភាគ ក្រុមដែលវាបង្កើតឡើងអាចមានគុណភាពទាប។ ក្នុងឧទាហរណ៍ខាងលើ ក្រុមអាចបែងចែកជា 'រង្វង់តន្ត្រី', 'ការ៉េចតន្ត្រី', 'បីកោណ' និង 'ខូចខាត'។ ប្រសិនបើមានកំណត់ ឬច្បាប់ ("វត្ថុត្រូវបានផលិតពីប្លាស្ទិច", "វត្ថុត្រូវមានសមត្ថភាពបង្កើតតន្ត្រី") នេះជួយច្រោះអាល់ហ្គរីធម៍ឲ្យជ្រើសរើសល្អជាង។
|
||||
>
|
||||
> 🎓 'ដង់ស៊ីតេ'
|
||||
>
|
||||
> ទិន្នន័យដែលមាន 'សំឡេងរំខាន' ត្រូវបានកំណត់ថា 'ដង់ស៊ីតេ'។ ចម្ងាយរវាងចំណុចក្នុងក្រុមមួយៗអាចបង្ហាញថា ដង់ស៊ីតេ ឬ 'ម៉ាស៊ីនជ្រៅ' ហើយទិន្នន័យនេះត្រូវបានវាយតម្លៃជាមួយវិធីចែកទំព័រដែលសមរម្យ។ [អត្ថបទនេះ](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) បង្ហាញខុសគ្នារវាងការប្រើប្រាស់ K-Means និងអាល់ហ្គរីធម៍ HDBSCAN ដើម្បីស្វែងរកទិន្នន័យដែលមានសំលេងរំខានជាមួយដង់ស៊ីតេចម្រុះ។
|
||||
|
||||
## អាល់ហ្គរីធម៍ចែកទំព័រ
|
||||
|
||||
មានអាល់ហ្គរីធម៍ចែកទំព័រលើស ១០០ គឺ ដោយប្រើប្រាស់គឺអាស្រ័យលើធម្មជាតិនៃទិន្នន័យ។ នេះជាការពិភាក្សាអំពីខ្លះៗនៃអាល់ហ្គរីធម៍សំខាន់ៗ៖
|
||||
|
||||
- **ការចែកទំព័រប្រភេទលំដាប់លំដោយ**។ ប្រសិនបើវត្ថុត្រូវបានចាត់ថ្នាក់ដោយភាពជិតស្និទ្ធទៅអ្វីដែលនៅជិតវា ជំនួសការជិតទៅវត្ថុចម្ងាយជាង ពួកក្រុមត្រូវបានបង្កើតឡើង ដោយផ្អែកលើចម្ងាយរវាងសមាជិកទៅនឹងវត្ថុផ្សេងៗ។ ការចែកទំព័រអាហ្គ្លូម៉ើត៊ីវរបស់ Scikit-learn គឺប្រភេទលំដាប់លំដោយ។
|
||||
|
||||

|
||||
> រូបភាពបង្ហាញដោយ [Dasani Madipalli](https://twitter.com/dasani_decoded)
|
||||
|
||||
- **ការចែកទំព័រចំណុចកណ្តាល**។ អាល់ហ្គរីធម៍ល្បីឈ្មោះនេះត្រូវការជ្រើសរើស 'k' រឺ ចំនួនក្រុមដែលត្រូវបង្កើត បន្ទាប់មកអាល់ហ្គរីធម៍កំណត់ចំណុចមជ្ឈមណ្ឌលរបស់ក្រុម និងប្រមូលទិន្នន័យនៅជុំវិញចំណុចនោះ។ [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) គឺជាប្រភេទពេញនិយមនៃការចែកទំព័រចំណុចកណ្តាល។ ចំណុចមជ្ឈមណ្ឌលត្រូវបានកំណត់ដោយមធ្យមជិតបំផុត ដូច្នេះឈ្មោះ។ ចម្ងាយកោណត្រូវបានបន្តិចបន្តួច។
|
||||
|
||||

|
||||
> រូបភាពបង្ហាញដោយ [Dasani Madipalli](https://twitter.com/dasani_decoded)
|
||||
|
||||
- **ការចែកទំព័រដែលផ្អែកលើចែកចាយ**។ មានមូលដ្ឋានលើគំរូស្ថិតិ ការចែកទំព័រដែលផ្អែកលើចែកចាយផ្តោតលើការកំណត់ពិតភាពថាចំណុចទិន្នន័យទាក់ទងទៅក្រុមណាមួយ ហើយផ្ដាច់ផ្តាច់ទៅតាមរបៀប។ វិធី Gaussian mixture ស្ថិតនៅក្នុងប្រភេទនេះ។
|
||||
|
||||
- **ការចែកទំព័រលើមូលដ្ឋានដង់ស៊ីតេ**។ ចំណុចទិន្នន័យត្រូវបានតែងតាំងទៅក្រុម ដោយផ្អែកលើដង់ស៊ីតេរបស់ពួកវា ឬការប្រមូលផ្តុំគ្នា។ ចំណុចទិន្នន័យដែលឆ្ងាយពីក្រុម ត្រូវបានគេចាត់ទុកថាជាផលប៉ះពាល់ខាងក្រៅ ឬសំឡេងរំខាន។ 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)។ បង្ហាញ data frame មានទិន្នន័យពីបទចម្រៀង។ រៀបចំខ្លួនដើម្បីស្វែងរកទិន្នន័យនេះដោយនាំចូលបណ្ណាល័យ និងបង្ហាញទិន្នន័យ៖
|
||||
|
||||
```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. សូមទទួលបានព័ត៌មានមួយចំនួនអំពី DataFrame ដោយអំពាវនាវ `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. ពិនិត្យម្តងទៀតសម្រាប់តម្លៃ null ដោយហៅ `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 |
|
||||
|
||||
> 🤔 ប្រសិនបើយើងកំពុងធ្វើការជាមួយ clustering ដែលជា វិធីសាស្ត្រ unsupervised មួយដែលមិនត្រូវការទិន្នន័យមានស្លាក ហេតុអ្វីបានយើងចង្អុលបង្ហាញទិន្នន័យនេះជាមួយស្លាក? ក្នុងដំណាក់កាលចាប់ផ្តើមស្វែងរកទិន្នន័យ ស្លាកទាំងនេះមានប្រយោជន៍ ប៉ុន្តែវាមិនចាំបាច់សម្រាប់អាល់គ័រីធម clustering ដើម្បីដំណើរការ។ អ្នកអាចយកចេញក្បាលជួរឈរនៅតែមិនប៉ះពាល់ ដើម្បីយោងទិន្នន័យតាមលេខជួរឈរ។
|
||||
|
||||
មើលតម្លៃទូទៅនៃទិន្នន័យ។ សូមចំណាំថា popularity អាចមានតម្លៃជា '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')
|
||||
```
|
||||
|
||||

|
||||
|
||||
✅ ប្រសិនបើអ្នកចង់មើលតម្លៃកំពូលច្រើនជាងនេះ សូមប្តូរ top `[: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` ហើយត្រងទិន្នន័យដើម្បីដកចេញវត្ថុដែលមានតម្លៃ popularity ដែលស្មើ 0 (មានន័យថាវាមិនត្រូវបានចាត់ថ្នាក់ដោយ popularity ក្នុងទិន្នន័យ ហើយអាចត្រូវបានចាត់ទុកជាសំលេងរំខានសម្រាប់គោលបំណងរបស់យើង)៖
|
||||
|
||||
```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` ដែលមិនមែនជារឿងភ្ញាក់ផ្អើលទេ ព្រោះតែលំនៅសំឡេងខ្ពស់ជារឿយៗដូចជាអ្នកមានថាមពលខ្លាំង។ អ្នកលំដាប់ប្រសើរពីរវាងផ្សេងទៀតគួរជារបាយការណ៍ខ្សោយ។ វានឹងគួរអោយចាប់អារម្មណ៍មើលពីអាល់គ័រីធម clustering អាចយល់ដឹងអ្វីខ្លះពីទិន្នន័យនេះបាន។
|
||||
|
||||
> 🎓 សូមចំណាំថាការពាក់ព័ន្ធមិនមានន័យថាការកើតមាន! យើងមានភស្តុតាងនៃការពាក់ព័ន្ធ ប៉ុន្តែមិនមានភស្តុតាងនៃការកើតមាន។ គេហទំព័រមួយដែលគួរឱ្យចាប់អារម្មណ៍ [amusing web site](https://tylervigen.com/spurious-correlations) ផ្តល់នូវរូបភាពសម្រាប់ពិចារណារឿងនេះ។
|
||||
|
||||
តើមានការប្រមូលផ្តុំគ្នានៅក្នុងទិន្នន័យនេះអំពីការមើលឃើញនូវពន្លឺនិង danceability របស់ចម្រៀងមួយទេ? FacetGrid បង្ហាញថាមានរង្វង់ច្រវ៉ាក់អាចផ្គូរផ្គងគ្នា បើទោះបីជាមានបែបបទផ្សេងៗគ្នាក៏ដោយ។ តើអាចមានការចូលចិត្តនៃនាយាជននៅជាមួយមួយកម្រិតបំណងចិត្តលើលំនាំនេះ?
|
||||
|
||||
✅ សាកល្បងបច្ចេកទិន្នន័យផ្សេងទៀត (energy, loudness, speechiness) និងប្រភេទតន្ត្រីផ្សេងៗ ឬច្រើនជាងនេះ។ តើអ្នកអាចរកឃើញអ្វីខ្លះ? សូមមើលតារាង `df.describe()` ដើម្បីមើលការវេចខ្ចប់ទូទៅនៃចំណុចទិន្នន័យ។
|
||||
|
||||
### វាយតម្លៃ - ការបែងចែកទិន្នន័យ
|
||||
|
||||
តើប្រភេទចម្រៀងបីនេះមានភាពខុសគ្នាយ៉ាងច្បាស់ក្នុងការមើលឃើញ danceability របស់ពួកគេ ដោយផ្អែកលើកម្រិត popularity?
|
||||
|
||||
1. ពិនិត្យមើលការបែងចែកទិន្នន័យរបស់បីប្រភេទកំពូលសម្រាប់ popularity និង danceability នៅលើអ័ក្ស 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) ដែលតំណាងឱ្យទិន្នន័យដោយ curve មានប្រហែលភាពគុណភាពជាបន្ត។ នេះអាចអោយយើងផ្ដល់អត្ថន័យទិន្នន័យនៅពេលធ្វើការជាមួយការបែងចែកច្រើន។
|
||||
|
||||
ជាទូទៅ ប្រភេទចម្រៀងបីភាគបន្តិចឆ្លុះបញ្ចាំងគ្នានៅក្នុងចំណោម popularity និង danceability។ ការទាញយកក្រុមនៅក្នុងទិន្នន័យដែលមានការបង្ហាញខាងលើនេះគឺជាភាពលំបាកជាមួយ៖
|
||||
|
||||

|
||||
|
||||
1. បង្កើតប្លង់ scatter៖
|
||||
|
||||
```python
|
||||
sns.FacetGrid(df, hue="artist_top_genre", height=5) \
|
||||
.map(plt.scatter, "popularity", "danceability") \
|
||||
.add_legend()
|
||||
```
|
||||
|
||||
ប្លង់ scatter នៃអ័ក្សដូចគ្នាបង្ហាញលំនាំស្រដៀងគ្នារបស់ការប្រមូលផ្តុំ
|
||||
|
||||

|
||||
|
||||
ជាទូទៅ សម្រាប់ clustering អ្នកអាចប្រើប្លង់ scatter ដើម្បីបង្ហាញក្រុមទិន្នន័យ ដូច្នេះការបង្កប់ចំណេះដឹងនៅលើការបង្ហាញទូរគមនាគមន៍នេះគឺមានប្រយោជន៍ខ្លាំង។ នៅមេរៀនបន្ទាប់ យើងនឹងយកទិន្នន័យដែលបានត្រងនេះ ដើម្បីប្រើ k-means clustering ដើម្បីស្វែងរកក្រុមក្នុងទិន្នន័យដែលពាក់ព័ន្ធគ្នាជាបែបគួរឱ្យចាប់អារម្មណ៍។
|
||||
|
||||
---
|
||||
|
||||
## 🚀បញ្ចាំង
|
||||
|
||||
ក្នុងការរៀបចំសម្រាប់មេរៀនបន្ទាប់ សូមបង្កើតតារាងអំពីអាល់គ័រីធម clustering ផ្សេងៗដែលអ្នកអាចស្វែងរក និងប្រើក្នុងបរិដ្ឋានផលិតកម្ម។ តើបញ្ហាប្រភេទអ្វីដែល clustering ព្យាយាមដោះស្រាយ?
|
||||
|
||||
## [ប្រលងក្រោយមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
|
||||
|
||||
## សេចក្តីពិនិត្យ និងសិក្សាផ្ទាល់ខ្លួន
|
||||
|
||||
មុនពេលអ្នកអនុវត្តអាល់គ័រីធម clustering ដូចដែលយើងបានរៀន វាគួរឱ្យចាប់អារម្មណ៍ក្នុងការយល់ដឹងពីធម្មជាតិទិន្នន័យរបស់អ្នក។ ចំណាយពេលអានបន្ថែមស្តីពីប្រធានបទនេះ [ទីនេះ](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/) នឹងដឹកនាំអ្នក តាមរយៈវិធីផ្សេងៗដែលអាល់គ័រីធម clustering ប្រតិបត្តិការពិតដោយផ្អែកលើរូបរាងទិន្នន័យផ្សេងៗ។
|
||||
|
||||
## ការងារ
|
||||
|
||||
[ស្វែងយល់អំពីការបង្ហាញទិន្នន័យផ្សេងទៀតសម្រាប់ clustering](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,18 @@
|
||||
# ស្រាវជ្រាវអំពីការបង្ហាញទិដ្ឋភាពផ្សេងទៀតសម្រាប់ការក្រុម
|
||||
|
||||
## សេចក្ដីណែនាំ
|
||||
|
||||
នៅមេរៀននេះ អ្នកបានធ្វើការជាមួយបច្ចេកទេសបង្ហាញទិដ្ឋភាពខ្លះៗ ដើម្បីយល់ដឹងអំពីការគូសរូបភាពទិន្នន័យរបស់អ្នកក្នុងការត្រៀមសម្រាប់ការក្រុមវា។ ការគូរប្រសព្វ (scatterplots) ជាពិសេសមានប្រយោជន៍សម្រាប់រកក្រុមអ្នកច្រើនវត្ថុ។ ស្រាវជ្រាវរបៀបផ្សេងៗ និងបណ្ណាល័យផ្សេងៗដើម្បីបង្កើត scatterplots ហើយសរសេរកំណត់ចំណាំការធ្វើការរបស់អ្នកក្នុង សៀវភៅកំណត់។ អ្នកអាចប្រើទិន្នន័យពីមេរៀននេះ មេរៀនផ្សេងៗ ឬ ទិន្នន័យដែលអ្នកបានរកឃើញដោយខ្លួនឯង (សូមញត្តិថាដើមទិន្នន័យនៅក្នុងសៀវភៅកំណត់របស់អ្នក)។ គូសភាពទិន្នន័យមួយចំនួនដោយប្រើ scatterplots និងពន្យល់អំពីអ្វីដែលអ្នកបានរកឃើញ។
|
||||
|
||||
## ការវាយតម្លៃ
|
||||
|
||||
| ការវាយតម្លៃ | ល្អឥតខ្ចោះ | គ្រប់គ្រាន់ | ត្រូវការកែលំអ |
|
||||
| -------- | -------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------- |
|
||||
| | មានសៀវភៅកំណត់មួយដែលបង្ហាញ scatterplots ចំនួនប្រាំខណៈពិពណ៌នាជាល្អ | មានសៀវភៅកំណត់មួយដែលបង្ហាញ scatterplots តិចជាងប្រាំ ហើយពិពណ៌នាតិចជាង | មានសៀវភៅកំណត់មួយមិនពេញលេញ |
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ប្រកាសលើកលែង**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងខំប្រឹងប្រែងរកភាពត្រឹមត្រូវ ក៏សូមចំណាំថាការបកប្រែដោយស្វ័យប្រវត្តិស័ព្ទអាចមានអក្សរខុសឬការមិនត្រឹមត្រូវ។ ឯកសារដើមនៅភាសាប្រភពគួរត្រូវបានគិតថាជាធនាគារដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមផ្ដល់អាទិភាពនូវការបកប្រែដោយមនុស្សជំនាញវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសណាមួយដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,46 @@
|
||||
{
|
||||
"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)"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2,
|
||||
"cells": [
|
||||
{
|
||||
"source": [
|
||||
"# ផ្សេងបទតន្ត្រីនៃប្រទេសនីហ្សេរីយ៉ា ប្រមូលពី Spotify - ការវិភាគមួយ\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,8 @@
|
||||
នេះគឺជាកន្លែងកាន់តំណែងបណ្តោះអាសន្ន។
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**ការបដិសេធ**៖
|
||||
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះបីយើងខិតខំបំពេញភាពត្រឹមត្រូវ ក៏សូមយោងដើម្បីប្រាកដថា ការបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុស ឬការខុសគ្នាបាន។ ឯកសារដើមជាភាសាទ្រព្យសម្បត្តិគួរត្រូវបានគេចាត់ទុកជាមូលដ្ឋានដែលផ្តល់សមត្ថភាព។ សម្រាប់ព័ត៌មានសំខាន់ ការបកប្រែដោយអ្នកជំនាញមនុស្សគឺបានណែនាំ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬចោលអត្ថន័យដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
@ -0,0 +1,492 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## **តន្ត្រីនីជេរីយ៉ាន់ដែលបានច្រកចេញពី Spotify - ការវិភាគ**\r\n",
|
||||
"\r\n",
|
||||
"ការជំរុញជាគ្រឿងម៉ាស៊ីនមួយប្រភេទ [កំណត់អត្រាគ្មានអ្នកគ្រប់គ្រង](https://wikipedia.org/wiki/Unsupervised_learning) ដែលសន្មត់ថាតំណើរការទិន្នន័យមិនមានស្លាកឬថា ការបញ្ចូលទិន្នន័យរបស់វាមិនត្រូវបានផ្គូផ្គងជាមួយលទ្ធផលដែលបានកំណត់ជាមុនទេ។ វាប្រើប្រាស់អាល់ហ្គរីធម៍ជាច្រើនដើម្បីតម្រៀបតាមទិន្នន័យគ្មានស្លាក ហើយផ្តល់ជាក្រុមតាមលំនាំដែលវាបង្កប់ក្នុងទិន្នន័យ។\r\n",
|
||||
"\r\n",
|
||||
"[**សំណួរត្រួតពិនិត្យមុនថ្នាក់**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\r\n",
|
||||
"\r\n",
|
||||
"### **ការបើកបង្ហាញ**\r\n",
|
||||
"\r\n",
|
||||
"[ការជំរុញ](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) មានប្រយោជន៍ខ្លាំងសម្រាប់ការស្វែងយល់ទិន្នន័យ។ យើងមកមើលថាតើវាអាចជួយរកឃើញនិន្នាការ និងលំនាំក្នុងវិធីដែលអ្នកស្តាប់តន្ត្រីនីជេរីយ៉ាន់ប្រើប្រាស់តន្ត្រីបានទេ។\r\n",
|
||||
"\r\n",
|
||||
"> ✅ ចំណាយពេលមួយនាទីគិតអំពីការប្រើប្រាស់នៃការជំរុញ។ នៅក្នុងជីវិតពិត ការជំរុញកើតឡើងនៅពេលដែលអ្នកមានវេចខ្ទប់សម្លៀកបំពាក់ហើយត្រូវតម្រៀបសម្លៀកបំពាក់របស់សមាជិកគ្រួសាររបស់អ្នក 🧦👕👖🩲។ ក្នុងវិទ្យាសាស្ត្រទិន្នន័យ ការជំរុញកើតឡើងនៅពេលព្យាយាមវិភាគចំណង់ចំណូលចិត្តរបស់អ្នកប្រើប្រាស់ ឬកំណត់លក្ខណៈនៃ datasets គ្មានស្លាកណាមួយ។ ការជំរុញ ជាជំនួយចំពោះការស្វែងយល់ពីរំខាន ដូចជាឃូបនៃស្រោមជើងជើង។\r\n",
|
||||
"\r\n",
|
||||
"នៅក្នុងបរិបទវិជ្ជាជីវៈ ការជំរុញអាចប្រើប្រាស់ដើម្បីកំណត់អ្វីៗដូចជា ការបែងចែកទីផ្សារ កំណត់អាយុដែលទិញផលិតផលជាក់លាក់ៗ ។ ការប្រើប្រាស់មួយផ្សេងទៀតគឺការរកឃើញអសកម្មភាព ប្រហែលជាសម្រាប់រកឃើញការបោកប្រាស់ពីរៃយកាតឥណទាន។ ឬអ្នកអាចប្រើការជំរុញដើម្បីកំណត់មហារីកក្នុងប្រមាណផ្នែកវេជ្ជសាស្ត្រ។\r\n",
|
||||
"\r\n",
|
||||
"✅ គិតមួយនាទីអំពីរបៀបដែលអ្នកប្រហែលជាបានជួបប្រទៈការជំរុញ 'ក្នុងធម្មជាតិ' នៅក្នុងបរិបទធនាគារ, អ៊ី-ចម្រុះ ឬជំនួញ។\r\n",
|
||||
"\r\n",
|
||||
"> 🎓 គួរឱ្យចាប់អារម្មណ៍ ជំរុញត្រូវបានបង្កើតឡើងក្នុងវិស័យមនុស្សបច្ចេកទេស និងចិត្តវិទ្យា នៅឆ្នាំ 1930។ អ្នកអាចលើកទឹកចិត្តថាវាត្រូវបានប្រើប្រាស់យ៉ាងដូចម្តេចទេ?\r\n",
|
||||
"\r\n",
|
||||
"ដោយជម្រើសផ្សេង អ្នកអាចប្រើវាសម្រាប់បំបែកលទ្ធផលស្វែងរក - ដោយតំណភ្ជាប់ទិញ, រូបភាព ឬការពិនិត្យលើ។ ការជំរុញមានប្រយោជន៍នៅពេលដែលអ្នកមានdatasetធំដែលអ្នកចង់បង្រួម និងអនុវត្តវិភាគលំអិតជាងនេះ ដូច្នេះវិធីសាស្ត្រនេះអាចប្រើសម្រាប់រៀនពីទិន្នន័យ មុនពេលមានការបង្កើតម៉ូដែលផ្សេងទៀត។\r\n",
|
||||
"\r\n",
|
||||
"✅ ពេលទិន្នន័យរបស់អ្នកតម្រៀបក្នុងក្រុមអ្នកផ្ដល់លេខសម្គាល់ក្រុមមួយ ហើយវិធីសាស្ត្រនេះអាចមានប្រយោជន៍នៅពេលរក្សាព័ត៌មានឯកជនរបស់datasets អ្នកអាចយោងទៅលើចំណុចទិន្នន័យដោយលេខសម្គាល់ក្រុម ជំនួសឲ្យលេខសម្គាល់បង្ហាញពីព័ត៌មានឯកជន។ អ្នកអាចគិតឃើញហេតុផលផ្សេងទៀតដែលអ្នកយោងទៅលេខសម្គាល់ក្រុមប៉ុន្មានជំនួសធាតុផ្សេងទៀតក្នុងក្រុមដើម្បីសម្គាល់វា?\r\n",
|
||||
"\r\n",
|
||||
"### ចាប់ផ្តើមជាមួយការជំរុញ\r\n",
|
||||
"\r\n",
|
||||
"> 🎓 របៀបយើងបង្កើតក្រុមនៅទំនាក់ទំនងទៅនឹងរបៀបយើងប្រមូលចំណុចទិន្នន័យជាក្រុម។ បង្ហាញវាក្នុងពាក្យសំខាន់៖\r\n",
|
||||
">\r\n",
|
||||
"> 🎓 ['Transductive' ប្រឆាំងនឹង 'inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning))\r\n",
|
||||
">\r\n",
|
||||
"> ការជានិស្ស័យ transductive មានប្រភពចេញពីករណីបណ្តុះបណ្តាលដែលបានមើលឃើញដែលផ្គូផ្គងទៅនឹងករណីសាកល្បងជាក់លាក់។ ការជានិស្ស័យ inductive មានប្រភពចេញពីករណីបណ្តុះបណ្តាលដែលផ្គូផ្គងទៅនឹងច្បាប់ទូទៅ ដែលត្រូវបានអនុវត្តត្រឹមតែទៅក្ដៅករណីសាកល្បងប៉ុណ្ណោះ។\r\n",
|
||||
">\r\n",
|
||||
"> ឧទាហរណ៍៖ ស្រមៃថាអ្នកមានdatasetមួយ ដែលមានប៉ុន្មានស្លាកតិចតួច។ មានអ្វីខ្លះនៅជារបៀប 'កំណត់ត្រា' (records) ខ្លះ 'ស៊ីឌី' (cds) ហើយខ្លះទៀតគ្មានស្លាក។ ការងាររបស់អ្នកគឺផ្ដល់ស្លាកសម្រាប់ការខ្វះ។ បើអ្នកជ្រើសរើសវិធី inductive អ្នកនឹងបណ្តុះបណ្តាលម៉ូដែលស្វែងរក 'កំណត់ត្រា' និង 'ស៊ីឌី' ហើយផ្ដល់ស្លាកទ្រង់ទ្រាយទៅលើទិន្នន័យគ្មានស្លាករបស់អ្នក។ វិធីនេះនឹងមានបញ្ហាក្នុងការបែងចែកវាលើអ្វីដែលពិតជា 'កាសែត'។ ផ្ទុយទៅវិញ អ្នកប្រើវិធី transductive អាចដោះស្រាយទិន្នន័យមិនស្គាល់នេះបានប្រសើរជាង ដោយវាកម្មវិធីដើម្បីបំបែកវត្ថុស្រដៀងគ្នាជាក្រុម ហើយបន្ទាប់មកផ្ដល់ស្លាកក្នុងក្រុម។ ក្នុងករណីនេះ ក្រុមអាចបង្ហាញ 'រឿងតន្ត្រីរង្វង់' និង 'រឿងតន្ត្រីការ៉េ'។\r\n",
|
||||
">\r\n",
|
||||
"> 🎓 ['Geometry មិនស្មើ' ប្រឆាំងនឹង 'geometry ស្មើ'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\r\n",
|
||||
">\r\n",
|
||||
"> ទាមទារពីវេយ្យាករណ៍គណិតវិទ្យា geometry មិនស្មើ ប្រឆាំងនឹង geometry ស្មើ មានន័យពីការវាស់ចម្ងាយរវាងចំណុច ដោយប្រើវិធីគណិតវិទ្យា 'ស្មើ' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) ឬ 'មិនស្មើ' (non-Euclidean)។\r\n",
|
||||
">\r\n",
|
||||
"> 'ស្មើ' នៅក្នុងបរិបទនេះយោងឲ្យ geometry Euclidean (ផ្នែកមួយដែលបានបង្រៀនក្នុងនាមជា 'geometry លើផ្ទៃ'), ហើយមិនស្មើយោងទៅ geometry មិន Euclidean។ អ្វីទៅជាgeometry ទាក់ទងទៅ machine learning? ដូចជាវិស័យទាំងពីរដែលដាំដុះពីគណិតវិទ្យា ត្រូវមានវិធីសាមញ្ញមួយសម្រាប់វាស់ចម្ងាយរវាងចំណុចក្នុងក្រុម ហើយវាអាចធ្វើបានជា 'ស្មើ' ឬ 'មិនស្មើ'ព្រមទាំងតម្រូវទៅលើធម្មជាតិទិន្នន័យ។ [ចម្ងាយ Euclidean](https://wikipedia.org/wiki/Euclidean_distance) ត្រូវបានវាស់យើម្បីជាបញ្ចេញប្រវែងបន្ទាត់រវាងចំណុចពីរផ្ទាល់។ [ចម្ងាយមិន-Euclidean](https://wikipedia.org/wiki/Non-Euclidean_geometry) ត្រូវបានវាស់តាមបន្ទាត់ឈរ។ ប្រសិនបើទិន្នន័យរបស់អ្នក មានការបង្ហាញមិនស្ថិតលើផ្ទៃ អ្នកប្រហែលជាត្រូវប្រើអាល់ហ្គរីធម៍ពិសេសមួយដើម្បីដោះស្រាយវា។\r\n",
|
||||
"\r\n",
|
||||
"<p >\r\n",
|
||||
" <img src=\"../../../../../../translated_images/km/flat-nonflat.d1c8c6e2a96110c1.webp\"\r\n",
|
||||
" width=\"600\"/>\r\n",
|
||||
" <figcaption>តារាងព័ត៌មានដោយ Dasani Madipalli</figcaption>\r\n",
|
||||
"\r\n",
|
||||
"\r\n",
|
||||
"\r\n",
|
||||
"> 🎓 ['ចម្ងាយ'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\r\n",
|
||||
">\r\n",
|
||||
"> ក្រុមត្រូវបានកំណត់ដោយម៉ាទ្រីសចម្ងាយ រួមមានចម្ងាយរវាងចំណុច។ ចម្ងាយនេះអាចវាស់បានច្រើនវិធី។ ក្រុម Euclidean ត្រូវបានកំណត់ដោយមធ្យមភាគរយនៃតម្លៃចំណុច ហើយមាន 'centroid' ឬចំណុចកណ្តាល។ ចម្ងាយដូច្នេះត្រូវបានវាស់ដោយចម្ងាយទៅកាន់ centroid នោះ។ ចម្ងាយមិន-Euclidean ធ្វើចំណងទៅ 'clustroids', ចំណុចដែលជិតចំណុចផ្សេងៗជាងគេ។ Clustroids ត្រូវបានកំណត់បានជាវិធីផ្សេងគ្នា។\r\n",
|
||||
">\r\n",
|
||||
"> 🎓 ['មានភាពកំណត់'](https://wikipedia.org/wiki/Constrained_clustering)\r\n",
|
||||
">\r\n",
|
||||
"> [Constrained Clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) បញ្ចូលការរៀន 'ពាក់កណ្តាលគ្រប់គ្រង' ទៅវិធីមិនគ្រប់គ្រងនេះ។ សម្រួលភាពទំនាក់ទំនងរវាងចំណុចត្រូវបានគេដាក់សញ្ញា 'មិនអាចភ្ជាប់' ឬ 'ត្រូវភ្ជាប់' ដូច្នេះមានច្បាប់ខ្លះត្រូវអនុវត្តទៅលើ dataset។\r\n",
|
||||
">\r\n",
|
||||
"> ឧទាហរណ៍៖ ប្រសិនបើអាល់ហ្គរីធម៍ត្រូវបានដោះស្រាយលើទិន្នន័យគ្មានស្លាកឬពាក់កណ្តាល មានន័យថាក្រុមដែលវាបង្កើតអាចមានគុណភាពទាប។ ក្នុងឧទាហរណ៍ខាងលើ ក្រុមអាចចែក 'រឿងតន្ត្រីរង្វង់' នឹង 'រឿងតន្ត្រីការ៉េ' និង 'រឿងត្រីកោណ' និង 'គូគី'។ ប្រសិនបើមានកំណត់ ឬច្បាប់មួយ (\"វត្ថុត្រូវផលិតពីប្លាស្ទិច\", \"វត្ថុត្រូវអាចផលិតតន្ត្រី\") នេះអាចជួយ 'ដាក់កំណត់' អាល់ហ្គរីធម៍ក្នុងការជ្រើសរើសល្អប្រសើរ។\r\n",
|
||||
">\r\n",
|
||||
"> 🎓 'Density'\r\n",
|
||||
">\r\n",
|
||||
"> ទិន្នន័យដែល 'មានសំឡេងរំខាន' ត្រូវបានគេចាត់ទុកថា 'សម្បូរបែប'។ ចម្ងាយរវាងចំណុចក្នុងក្រុមអាចបង្ហាញថា មានភាពសម្បូរឬអត់ ស្ថិតក្នុងស្ថានភាព 'រុំគ្នា' ដូច្នេះទិន្នន័យនេះត្រូវបានវិភាគដោយវិធីត្រឹមត្រូវនៃការជំរុញ។ [អត្ថបទនេះ](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) បង្ហាញពីភាពខុសគ្នារវាងការប្រើប្រាស់ K-Means clustering ប្រឆាំងនឹង HDBSCAN algorithms ដើម្បីស្វែងយល់ dataset រញ្ជួយមានភាពនៅចម្ងាយបែកឡែកគ្នា។\r\n",
|
||||
"\r\n",
|
||||
"បង្កើនការយល់ដឹងរបស់អ្នកអំពីវិធីសាស្ត្រជំរុញនៅក្នុង [ផ្នែករៀន](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\r\n",
|
||||
"\r\n",
|
||||
"### **អាល់ហ្គរីធម៍ជំរុញ**\r\n",
|
||||
"\r\n",
|
||||
"មានអាល់ហ្គរីធម៍ជំរុញលើស ១០០ ប្រភេទ ហើយការប្រើប្រាស់របស់ពួកវាអាស្រ័យលើធម្មជាតិទិន្នន័យនៅដើម។ យើងមកពិភាក្សាអំពីចំនុចសំខាន់ៗខ្លះ៖\r\n",
|
||||
"\r\n",
|
||||
"- **ការជំរុញលំដាប់ដាច់ខាត (Hierarchical clustering)**។ ប្រសិនបើវត្ថុណាមួយត្រូវបានចាត់ថ្នាក់ដោយភាពជិតស្និទ្ធទៅវត្ថុជិតខាងមួយ មិនមែនទៅវត្ថុឆ្ងាយជាងទេ ក្រុមនឹងត្រូវបានបង្កើតឡើងដោយអាស្រ័យលើចម្ងាយរវាងសមាជិក។ ការជំរុញលំដាប់ដាច់ខាតត្រូវបានលក្ខណៈដោយការបន្សំក្រុមពីរក្រុមជាបន្តបន្ទាប់។\r\n",
|
||||
"\r\n",
|
||||
"\r\n",
|
||||
"<p >\r\n",
|
||||
" <img src=\"../../../../../../translated_images/km/hierarchical.bf59403aa43c8c47.webp\"\r\n",
|
||||
" width=\"600\"/>\r\n",
|
||||
" <figcaption>តារាងព័ត៌មានដោយ Dasani Madipalli</figcaption>\r\n",
|
||||
"\r\n",
|
||||
"\r\n",
|
||||
"\r\n",
|
||||
"- **ការជំរុញតាមភាគរយ (Centroid clustering)**។ អាល់ហ្គរីធម៍ពេញនិយមនេះតម្រូវឲ្យជ្រើសរើស 'k' ឬចំនួនក្រុមដែលត្រូវបង្កើត បន្ទាប់មកអាល់ហ្គរីធម៍កំណត់ចំណុចកណ្តាលរបស់ក្រុម ហើយប្រមូលទិន្នន័យជុំវិញចំណុចនោះ។ [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) គឺជាប្រភេទដែលពេញនិយមនៃការជំរុញតាមភាគរយ ដែលបំបែក dataset ទៅជា K ក្រុមដែលបានកំណត់ជាមុន។ ចំណុចកណ្តាលត្រូវបានកំណត់ដោយមធ្យមភាគនៅជិតបំផុត ដូច្នេះមានឈ្មោះ។ ចម្ងាយការេពីក្រុមត្រូវបានកាត់បន្ថយ។\r\n",
|
||||
"\r\n",
|
||||
"<p >\r\n",
|
||||
" <img src=\"../../../../../../translated_images/km/centroid.097fde836cf6c918.webp\"\r\n",
|
||||
" width=\"600\"/>\r\n",
|
||||
" <figcaption>តារាងព័ត៌មានដោយ Dasani Madipalli</figcaption>\r\n",
|
||||
"\r\n",
|
||||
"\r\n",
|
||||
"\r\n",
|
||||
"- **ការជំរុញដោយផ្អែកលើចែកចាយ (Distribution-based clustering)**។ មានមូលដ្ឋាននៅលើម៉ូដែលស្ថិតិ ការជំរុញដោយផ្អែកលើចែកចាយផ្ដោតលើការកំណត់ប្រតិបត្តិអាចធ្វើបានថាចំណុចទិន្នន័យជាប់នឹងក្រុមណាមួយ ហើយផ្ដល់ចំណាត់ថ្នាក់តាមបែបនេះ។ វិធីផ្សំ Gaussian ជាផ្នែកមួយនៃប្រភេទនេះ។\r\n",
|
||||
"\r\n",
|
||||
"- **ការជំរុញដោយផ្អែកលើដង់សុីតេ (Density-based clustering)**។ ចំណុចទិន្នន័យត្រូវបានផ្ដល់សេចក្តីថ្លែងអំពីក្រុមដោយផ្អែកលើដង់សុីតេ រឺការជុំវិញគ្នា។ ចំណុចដែលឆ្ងាយពីក្រុមគេចាត់ទុកថាជាអ្វីៗមិនរួមបញ្ចូល ឬសម្លេងរំខាន។ DBSCAN, Mean-shift និង OPTICS ជាផ្នែកនៃប្រភេទនេះ។\r\n",
|
||||
"\r\n",
|
||||
"- **ការជំរុញដោយផ្អែកលើក្រឡា (Grid-based clustering)**។ សម្រាប់ dataset ច្រើនវិមាត្រ ក្រឡាត្រូវបានបង្កើត ហើយទិន្នន័យត្រូវបានបែងចែកទៅចូលក្នុងក្រឡាពណ៍។ ដោយហេតុនេះ បង្កើតក្រុមឡើង។\r\n",
|
||||
"\r\n",
|
||||
"វិធីល្អបំផុតសម្រាប់រៀនអំពីការជំរុញគឺសាកល្បងវាផ្ទាល់ ដូច្នេះនេះជាការធ្វើក្នុងលំហាត់នេះ។\r\n",
|
||||
"\r\n",
|
||||
"យើងត្រូវការ package ខ្លះសម្រាប់បញ្ចប់មេរៀននេះ។ អ្នកអាចដំឡើងបានដោយ: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\r\n",
|
||||
"\r\n",
|
||||
"ជាជម្រើសផ្សេងទៀត ស្គ្រីបខាងក្រោមពិនិត្យមើលថាអ្នកមាន package ដែលត្រូវការសម្រាប់បញ្ចប់មេរៀននេះ ហើយដំឡើងវាសម្រាប់អ្នក ប្រសិនបើមាន package ខ្វះចាំបាច់។\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\r\n",
|
||||
"\r\n",
|
||||
"pacman::p_load('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork')\r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## ដំណើរការ - ប្រមូលក្រុមទិន្នន័យរបស់អ្នក\n",
|
||||
"\n",
|
||||
"ការប្រមូលក្រុមជាយុទ្ធសាស្ត្រមួយត្រូវបានជួយយ៉ាងខ្លាំងដោយការបង្ហាញតម្លៃដ៏ត្រឹមត្រូវ ដូច្នេះយើងចាប់ផ្តើមដោយបង្ហាញតម្លៃទិន្នន័យតន្រ្តីរបស់យើង។ ដំណើរការនេះនឹងជួយយើងសម្រេចចិត្តថាវិធីណាដែលយើងគួរតែប្រើច្រើនបំផុតសម្រាប់ធម្មជាតិនៃទិន្នន័យនេះ។\n",
|
||||
"\n",
|
||||
"យើងចាប់ផ្តើមយកទិន្នន័យជាវិធីដំបូង។\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Load the core tidyverse and make it available in your current R session\r\n",
|
||||
"library(tidyverse)\r\n",
|
||||
"\r\n",
|
||||
"# Import the data into a tibble\r\n",
|
||||
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\")\r\n",
|
||||
"\r\n",
|
||||
"# View the first 5 rows of the data set\r\n",
|
||||
"df %>% \r\n",
|
||||
" slice_head(n = 5)\r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"នៅខ្លះពេលណា យើងប្រហែលចង់បានព័ត៌មានបន្តិចបន្ថែមអំពីទិន្នន័យរបស់យើង។ យើងអាចពិនិត្យមើល `data` និង `its structure` ដោយប្រើមុខងារ [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html):\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Glimpse into the data set\r\n",
|
||||
"df %>% \r\n",
|
||||
" glimpse()\r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"ការងារល្អ!💪\n",
|
||||
"\n",
|
||||
"យើងអាចមើលឃើញថា `glimpse()` នឹងផ្តល់ឲ្យអ្នកនូវចំនួនជួរដេកសរុប (ការសង្កេត) និងជួរឈរ (អថេរ) បន្ទាប់មកជួរដេកដំបូងៗនៃអថេរនីមួយៗបន្ទាប់ពីឈ្មោះអថេរ។ លើសពីនេះទៀត *ប្រភេទទិន្នន័យ* នៃអថេរនោះត្រូវបានផ្តល់ភ្លាមៗបន្ទាប់ពីឈ្មោះអថេរនីមួយៗនៅក្នុង `< >`។\n",
|
||||
"\n",
|
||||
"`DataExplorer::introduce()` អាចសង្ខេបព័ត៌មាននេះបានយ៉ាងល្អឥតខ្ចោះ៖\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Describe basic information for our data\r\n",
|
||||
"df %>% \r\n",
|
||||
" introduce()\r\n",
|
||||
"\r\n",
|
||||
"# A visual display of the same\r\n",
|
||||
"df %>% \r\n",
|
||||
" plot_intro()\r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"អស្ចារ្យ! យើងទើបតែបានរៀនថាទិន្នន័យរបស់យើងមិនមានតម្លៃខ្វះទេ។\n",
|
||||
"\n",
|
||||
"ខណៈពេលដែលយើងកំពុងធ្វើការនេះ យើងអាចស្វែងយល់អំពីស្ថិតិចំណុចកណ្តាលទូទៅ (ឧ. [មធ្យម](https://en.wikipedia.org/wiki/Arithmetic_mean) និង [មេឌាន](https://en.wikipedia.org/wiki/Median)) ហើយវាស់វែងការពន្លឿន (ឧ. [ស្តង់ដាដេវិយ៉ាស្យិន](https://en.wikipedia.org/wiki/Standard_deviation)) ដោយប្រើ `summarytools::descr()`\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Describe common statistics\r\n",
|
||||
"df %>% \r\n",
|
||||
" descr(stats = \"common\")\r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"មកសូមមើលតម្លៃទូទៅនៃទិន្នន័យ។ ចង់បញ្ជាក់ថាបាតុភូតពេញនិយមអាចមានតម្លៃជា `0` ដែលបង្ហាញពីចម្រៀងដែលមិនមានចំណាត់ថ្នាក់ទេ។ យើងនឹងដកចេញវាឆាប់ៗនេះ។\n",
|
||||
"\n",
|
||||
"> 🤔 បើយើងកំពុងធ្វើការជាមួយ clustering វិធីសាស្រ្តមិនត្រូវការយោងលើទិន្នន័យមានស្លាកហើយ គួរឲ្យផ្ញើយកទិន្នន័យនេះជាមួយស្លាកហើយមានហេតុអ្វី? ក្នុងដំណាក់កាលស្វែងរកទិន្នន័យ វាពាក់ព័ន្ធផងដែរ ប៉ុន្តែមិនចាំបាច់សម្រាប់អាល់គុណម clustering ឲ្យដំណើរការទេ។\n",
|
||||
"\n",
|
||||
"### 1. ស្វែងរកប្រភេទតន្ត្រីពេញនិយម\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Popular genres\r\n",
|
||||
"top_genres <- df %>% \r\n",
|
||||
" count(artist_top_genre, sort = TRUE) %>% \r\n",
|
||||
"# Encode to categorical and reorder the according to count\r\n",
|
||||
" mutate(artist_top_genre = factor(artist_top_genre) %>% fct_inorder())\r\n",
|
||||
"\r\n",
|
||||
"# Print the top genres\r\n",
|
||||
"top_genres\r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"វាទៅរបស់ល្អ! ពួកគេនិយាយរូបភាពមួយមានតម្លៃស្មើនឹងជួរច្រើននៃតារាងទិន្នន័យ (ពិតណាស់ មិនមាននរណាធ្វើអោយនិយាយបែបនេះឡើយ 😅)។ ប៉ុន្តែអ្នកយល់ន័យរបស់វា ដូច្នោះទេ?\n",
|
||||
"\n",
|
||||
"វិធីមួយដើម្បីមើលទិន្នន័យដែលើប្រភេទតួអក្សរ (អក្សរ ឬអថេរ factor) គឺការប្រើប្រាស់ប្លុតបារ។ អ្នកមកធ្វើប្លុតបារនៃប្រភេទ ១០លើសពីគេដូចតទៅ៖\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Change the default gray theme\r\n",
|
||||
"theme_set(theme_light())\r\n",
|
||||
"\r\n",
|
||||
"# Visualize popular genres\r\n",
|
||||
"top_genres %>%\r\n",
|
||||
" slice(1:10) %>% \r\n",
|
||||
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
|
||||
" fill = artist_top_genre)) +\r\n",
|
||||
" geom_col(alpha = 0.8) +\r\n",
|
||||
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
|
||||
" ggtitle(\"Top genres\") +\r\n",
|
||||
" theme(plot.title = element_text(hjust = 0.5),\r\n",
|
||||
" # Rotates the X markers (so we can read them)\r\n",
|
||||
" axis.text.x = element_text(angle = 90))\r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"ឥឡូវនេះវាកាន់តែងាយស្រួលក្នុងការទទួលស្គាល់ថាយើងខ្វះចំនួនភេទ `missing` 🧐!\n",
|
||||
"\n",
|
||||
"> ការបង្ហាញទិន្នន័យល្អមួយនឹងបង្ហាញឱ្យអ្នកឃើញរឿងដែលអ្នកមិនបានចាំបាច់រំពឹងទុកទេ ឬហេតុគួរឱ្យសួរថ្មីៗអំពីទិន្នន័យ - Hadley Wickham និង Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
|
||||
"\n",
|
||||
"សម្គាល់ថា ពេលដែលភេទកំពូលត្រូវបានពណ៌នាថា `Missing` មានន័យថា Spotify មិនបានចាត់ថ្នាក់វាទេ ដូចនេះយើងត្រូវបំបាត់វា។\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Visualize popular genres\r\n",
|
||||
"top_genres %>%\r\n",
|
||||
" filter(artist_top_genre != \"Missing\") %>% \r\n",
|
||||
" slice(1:10) %>% \r\n",
|
||||
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
|
||||
" fill = artist_top_genre)) +\r\n",
|
||||
" geom_col(alpha = 0.8) +\r\n",
|
||||
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
|
||||
" ggtitle(\"Top genres\") +\r\n",
|
||||
" theme(plot.title = element_text(hjust = 0.5),\r\n",
|
||||
" # Rotates the X markers (so we can read them)\r\n",
|
||||
" axis.text.x = element_text(angle = 90))\r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"ពីការស្រាវជ្រាវទិន្នន័យតូចៗ យើងបានរៀនថាប្រភេទត្រីមាសបីខ្ពស់ជាងគេគ្របដណ្តប់លើឃ្លោងទិន្នន័យនេះ។ យើងត្រូវផ្ដោតលើ `afro dancehall` , `afropop` និង `nigerian pop` បន្ថែមទៀតធ្វើការត្រងឃ្លោងទិន្នន័យដើម្បីខ្វក់អ្វីដែលមានតម្លៃពេញនិយម 0 (មានន័យថា វាមិនត្រូវបានចាត់ថ្នាក់ជាមួយពេញនិយមក្នុងឃ្លោងទិន្នន័យ ហើយអាចត្រូវបានពិចារណាជាសំលេងរំខានសម្រាប់គោលបំណងរបស់យើង):\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"nigerian_songs <- df %>% \r\n",
|
||||
" # Concentrate on top 3 genres\r\n",
|
||||
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n",
|
||||
" # Remove unclassified observations\r\n",
|
||||
" filter(popularity != 0)\r\n",
|
||||
"\r\n",
|
||||
"\r\n",
|
||||
"\r\n",
|
||||
"# Visualize popular genres\r\n",
|
||||
"nigerian_songs %>%\r\n",
|
||||
" count(artist_top_genre) %>%\r\n",
|
||||
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
|
||||
" fill = artist_top_genre)) +\r\n",
|
||||
" geom_col(alpha = 0.8) +\r\n",
|
||||
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n",
|
||||
" ggtitle(\"Top genres\") +\r\n",
|
||||
" theme(plot.title = element_text(hjust = 0.5))\r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"មកមើលថាតើមានទំនាក់ទំនងបន្ទាត់ច្បាស់ណាមួយរវាងអថេរជាចំនួនក្នុងសំណុំទិន្នន័យរបស់យើងទេ។ ទំនាក់ទំនងនេះត្រូវបានបញ្ចាក់ទ្រឹស្តីវិទ្យាដោយ [ស្ថិតិសមាហរណភាព](https://en.wikipedia.org/wiki/Correlation)។\n",
|
||||
"\n",
|
||||
"ស្ថិតិសមាហរណភាពគឺជាតម្លៃរវាង -1 និង 1 ដែលបង្ហាញពីកម្លាំងនៃទំនាក់ទំនង។ តម្លៃដែលលើស 0 បង្ហាញពីសមាហរណភាពបញ្ញក (តម្លៃខ្ពស់នៃអថេរមួយមានទំនោរទៅនឹងតម្លៃខ្ពស់នៃអថេរមួយផ្សេងទៀត) ខណៈដែលតម្លៃក្រោម 0 បង្ហាញពីសមាហរណភាពអវិជ្ជមាន (តម្លៃខ្ពស់នៃអថេរមួយមានទំនោរទៅនឹងតម្លៃទាបនៃអថេរមួយផ្សេងទៀត)។\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Narrow down to numeric variables and fid correlation\r\n",
|
||||
"corr_mat <- nigerian_songs %>% \r\n",
|
||||
" select(where(is.numeric)) %>% \r\n",
|
||||
" cor()\r\n",
|
||||
"\r\n",
|
||||
"# Visualize correlation matrix\r\n",
|
||||
"corrplot(corr_mat, order = 'AOE', col = c('white', 'black'), bg = 'gold2') \r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"ទិន្នន័យមិនមានទំនាក់ទំនងយ៉ាងខ្លាំងក្រៅតែចំពោះ `energy` និង `loudness` ដែលមានហេតុផលសមរម្យ ពេលតន្ត្រីសំឡេងខ្លាំងទូទៅមានថាមពលខ្លាំងផងដែរ។ `Popularity` មានទំនាក់ទំនងទៅនឹង `release date` ដែលក៏មានហេតុផលសមរម្យ ព្រោះចម្រៀងថ្មីៗភាគច្រើនមានប្រជាប្រិយភាពខ្លាំងជាង។ ប្រវែង និងថាមពលក៏មានទំនាក់ទំនងផងដែរ។\n",
|
||||
"\n",
|
||||
"វានឹងគួរឲ្យចាប់អារម្មណ៍មើលថា អាល់ហ្គរីធម៍ក្រុមចម្រៀងអាចធ្វើអ្វីបានជាមួយទិន្នន័យនេះ!\n",
|
||||
"\n",
|
||||
"> 🎓 សូមចំណាំថា ទំនាក់ទំនងមិនមានន័យថា មានមូលហេតុ! យើងមានភស្តុតាងពីទំនាក់ទំនងប៉ុន្តែមិនមានភស្តុតាងពីមូលហេតុឡើយ។ គេហទំព័រមួយ [amusing web site](https://tylervigen.com/spurious-correlations) មានរូបភាពមួយចំនួនដែលលើកឡើងចំណុចនេះ។\n",
|
||||
"\n",
|
||||
"### 2. ស្វែងយល់ការចែកចាយទិន្នន័យ\n",
|
||||
"\n",
|
||||
"អោយយើងសួរបញ្ហាបន្តិចទៀត។ តើរចនាប័ទ្មតន្ត្រីមានភាពខុសគ្នាដោយសារ ចំពោះការយល់ឃើញនៃការរាំរបស់ពួកវាដោយផ្អែកលើប្រជាប្រិយភាពរបស់ពួកវាទេ? អោយយើងពិនិត្យការចែកចាយទិន្នន័យរចនាប័ទ្មច្រីនបួនលើប្រជាប្រិយភាព និងការរាំ ដោយប្រើ [density plots](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves) ជាមួយអ័ក្ស x និង y មួយដែលបានផ្តល់។\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# Perform 2D kernel density estimation\r\n",
|
||||
"density_estimate_2d <- nigerian_songs %>% \r\n",
|
||||
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre)) +\r\n",
|
||||
" geom_density_2d(bins = 5, size = 1) +\r\n",
|
||||
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
|
||||
" xlim(-20, 80) +\r\n",
|
||||
" ylim(0, 1.2)\r\n",
|
||||
"\r\n",
|
||||
"# Density plot based on the popularity\r\n",
|
||||
"density_estimate_pop <- nigerian_songs %>% \r\n",
|
||||
" ggplot(mapping = aes(x = popularity, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
|
||||
" geom_density(size = 1, alpha = 0.5) +\r\n",
|
||||
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
|
||||
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
|
||||
" theme(legend.position = \"none\")\r\n",
|
||||
"\r\n",
|
||||
"# Density plot based on the danceability\r\n",
|
||||
"density_estimate_dance <- nigerian_songs %>% \r\n",
|
||||
" ggplot(mapping = aes(x = danceability, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
|
||||
" geom_density(size = 1, alpha = 0.5) +\r\n",
|
||||
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
|
||||
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\")\r\n",
|
||||
"\r\n",
|
||||
"\r\n",
|
||||
"# Patch everything together\r\n",
|
||||
"library(patchwork)\r\n",
|
||||
"density_estimate_2d / (density_estimate_pop + density_estimate_dance)\r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"យើងមើលឃើញថាមានរង្វង់រំលឹកគ្នាមួយចំនួនដែលស្របគ្នា មិនគិតពីប្រភេទតន្ត្រីឡើយ។ តើអាចជាការស្របគ្នារវាងរសជាតិអ្នកនិយមតន្ត្រី Nigerien នៅកម្រិតចាក់រាំដូចគ្នាមួយសម្រាប់ប្រភេទតន្ត្រីនេះ?\n",
|
||||
"\n",
|
||||
"ជាទូទៅ ប្រភេទតន្ត្រីទាំងបីត្រូវគ្នាតាមកម្រិតនៃការពេញនិយម និងចាក់រាំ។ ការកំណត់រ៉ូមក្រុមក្នុងទិន្នន័យដែលមិនបានស្របគ្នារបស់ក្រុមនេះនឹងជាឧបសគ្គមួយ។ យើងមកមើលថាតើតារាងបញ្ចាំងចំណុចអាចគាំទ្រ និយមន័យនេះឬអត់។\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"source": [
|
||||
"# A scatter plot of popularity and danceability\r\n",
|
||||
"scatter_plot <- nigerian_songs %>% \r\n",
|
||||
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre, shape = artist_top_genre)) +\r\n",
|
||||
" geom_point(size = 2, alpha = 0.8) +\r\n",
|
||||
" paletteer::scale_color_paletteer_d(\"futurevisions::mars\")\r\n",
|
||||
"\r\n",
|
||||
"# Add a touch of interactivity\r\n",
|
||||
"ggplotly(scatter_plot)\r\n"
|
||||
],
|
||||
"outputs": [],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"ប្លង់ចែកបញ្ចាំងពីអ័ក្សដាច់ខាតដូចគ្នាបង្ហាញលំនាំស្រដៀងគ្នានៃការប្រមូលផ្តុំនៃទិន្នន័យ។\n",
|
||||
"\n",
|
||||
"ទូទៅ សម្រាប់ការបែងចែកក្រុម អ្នកអាចប្រើប្លង់ចែកបញ្ចាំងដើម្បីបង្ហាញក្រុមទិន្នន័យ ដូចនេះ ការគ្រប់គ្រងវិចិត្រសិល្ប៍ប្រភេទនេះគឺមានប្រយោជន៍ខ្លាំង។ នៅមេរៀនក្រោយយើងនឹងយកទិន្នន័យដែលបានចម្រោះនេះ និងប្រើការបែងចែកក្រុម k-means ដើម្បីរកក្រុមក្នុងទិន្នន័យដែលមានការឆ្លងកាត់គ្នានៅលក្ខណៈគួរឱ្យចាប់អារម្មណ៍។\n",
|
||||
"\n",
|
||||
"## **🚀 ប្រយោគ**\n",
|
||||
"\n",
|
||||
"ជាការប្រកាសមុខសម្រាប់មេរៀនក្រោយ សូមបង្កើតតារាងអំពីអាល់កឡារីធម៍បែងចែកក្រុមនានាដែលអ្នកអាចស្វែងរកនិងប្រើប្រាស់ក្នុងបរិបទផលិតកម្ម។ តើបញ្ហាប្រភេទអ្វីដែលការបែងចែកក្រុមកំពុងព្យាយាមដោះស្រាយ?\n",
|
||||
"\n",
|
||||
"## [**សំណួរថែត្រាសិក្សាបន្ទាប់មកមេរៀន**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
|
||||
"\n",
|
||||
"## **ការត្រួតពិនិត្យ & សិក្សាឯករាជ្យ**\n",
|
||||
"\n",
|
||||
"មុនពេលអ្នកអនុវត្តអាល់កឡារីធម៍បែងចែកក្រុម ដូចដែលយើងបានស្គាល់ វាជាគំនិតល្អក្នុងការយល់ដឹងអំពីប្រភេទនៃទិន្នន័យរបស់អ្នក។ អានបន្ថែមអំពីប្រធាននេះ [នៅទីនេះ](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
|
||||
"\n",
|
||||
"ជ្រាបច្បាស់កាន់តែដល់បច្ចេកទេសបែងចែកក្រុម៖\n",
|
||||
"\n",
|
||||
"- [បណ្តុះបណ្តាល និងវាយតម្លៃ ម៉ូដែលបែងចែកក្រុមដោយប្រើ Tidymodels និងមិត្តភក្តិ](https://rpubs.com/eR_ic/clustering)\n",
|
||||
"\n",
|
||||
"- Bradley Boehmke & Brandon Greenwell, [*Hands-On Machine Learning with R*](https://bradleyboehmke.github.io/HOML/)*.*\n",
|
||||
"\n",
|
||||
"## **ការបញ្ជូនការងារ**\n",
|
||||
"\n",
|
||||
"[ស្រាវជ្រាវវិចិត្រសិល្ប៍ផ្សេងៗសម្រាប់ការបែងចែកក្រុម](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
|
||||
"\n",
|
||||
"## សូមអរគុណចំពោះ៖\n",
|
||||
"\n",
|
||||
"[Jen Looper](https://www.twitter.com/jenlooper) ដែលបានបង្កើតកំណែ Python ដើមនៃម៉ូឌុលនេះ ♥️\n",
|
||||
"\n",
|
||||
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded) ដែលបានបង្កើតរូបភាពអស្ចារ្យដែលធ្វើឱ្យមាតិកាសម្រាប់ចងក្រងម៉ាស៊ីនរៀនកាន់តែងាយស្រួលយល់ដឹង និងបកស្រាយបានច្បាស់។\n",
|
||||
"\n",
|
||||
"សូមសំណាងល្អក្នុងការរៀន។\n",
|
||||
"\n",
|
||||
"[Eric](https://twitter.com/ericntay), តំណាងសិស្ស Microsoft Learn ជាពេជ្រមាស។\n"
|
||||
],
|
||||
"metadata": {}
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការព្រមាន**៖ \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំប្រឹងប្រែងដើម្បីឲ្យបានភាពត្រឹមត្រូវ សូមយល់ជ្រាបថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវខ្លះ។ ឯកសារដើមជាភាសាមូលដ្ឋានគួរត្រូវបានយកទៅជាលទ្ធផលផ្លូវការនិងត្រឹមត្រូវបំផុត។ សម្រាប់ព័ត៌មានសំខាន់ៗ យើងណែនាំឲ្យប្រើការបកប្រែដោយមនុស្សជាជំនាញវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកអត្ថន័យខុសដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"anaconda-cloud": "",
|
||||
"kernelspec": {
|
||||
"display_name": "R",
|
||||
"language": "R",
|
||||
"name": "ir"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": "r",
|
||||
"file_extension": ".r",
|
||||
"mimetype": "text/x-r-source",
|
||||
"name": "R",
|
||||
"pygments_lexer": "r",
|
||||
"version": "3.4.1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 1
|
||||
}
|
||||