chore(i18n): sync translations with latest source changes (chunk 2/2, 181 changes)

pull/955/head
localizeflow[bot] 3 months ago
parent c3a38b91cd
commit 0653a5fdc8

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

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/)
---
[![ML សម្រាប់អ្នកសរសេរใหม่ - ការណែនាំអំពីការរៀនម៉ាស៊ីនសម្រាប់អ្នកសរសេរ](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "ML សម្រាប់អ្នកសរសេរใหม่ - ការណែនាំអំពីការរៀនម៉ាស៊ីនសម្រាប់អ្នកសរសេរ")
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូខ្លីបង្ហាញពីមេរៀននេះ។
សូមស្វាគមន៍មកកាន់វគ្គសិក្សានេះអំពីការរៀនម៉ាស៊ីនបែបសាមញ្ញសម្រាប់អ្នកចាប់ផ្ដើម! មិនថាអ្នកជាអ្នកថ្មីតែម្តងនឹងប្រធានបទនេះ ឬជាអ្នកអនុវត្ត ML ដែលមានបទពិសោធន៍ជាមួយកន្លែងមួយណាមួយដែលចង់បង្កើតវិជ្ជាជីវៈឡើងវិញ យើងមានសេចក្ដីសប្បាយរីករាយដែលអ្នកបានចូលរួមជាមួយយើង! យើងចង់បង្កើតទីតាំងមួយដែលរាប់មិត្តភាព សម្រាប់ការសិក្សា ML របស់អ្នក ហើយយើងនឹងមានមោទនភាពក្នុងការវាយតម្លៃ ឆ្លើយតប និងរួមបញ្ចូលមតិយោបល់របស់អ្នក [feedback](https://github.com/microsoft/ML-For-Beginners/discussions)។
[![ការណែនាំអំពី ML](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](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 ពិតប្រាកដ ហើយរៀនវាជាគ្រប់ជំហាន តាមរយៈឧទាហរណ៍អនុវត្តន៍។
---
## របងប្រភេទតំណពន្លឺ
![ml hype curve](../../../../translated_images/km/hype.07183d711a17aafe.webp)
> 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, deep learning, data science](../../../../translated_images/km/ai-ml-ds.537ea441b124ebf6.webp)
> ក្រាហ្វិកបង្ហាញទំនាក់ទំនងរវាង 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,157 @@
# ប្រវត្តិសាស្ត្រ​នៃការរៀន​មេកានិច
![សង្ខេបនៃប្រវត្តិការរៀនម៉ាស៊ីនក្នុងសំណុំស្នាជ្រាប](../../../../translated_images/km/ml-history.a1bdfd4ce1f464d9.webp)
> សំណុំស្នាជ្រាបដោយ [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [ប្រឡងមុខមាត់មុនពេលរៀន](https://ff-quizzes.netlify.app/en/ml/)
---
[![ML សម្រាប់អ្នកចាប់ផ្តើម - ប្រវត្តិការរៀនម៉ាស៊ីន](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "ML សម្រាប់អ្នកចាប់ផ្តើម - ប្រវត្តិការរៀនម៉ាស៊ីន")
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូខ្លីដែលពិពណ៌នាអំពីមេរៀននេះ។
នៅក្នុងមេរៀននេះ យើងនឹងដើរឆ្ពោះទៅតាមកំណត់ហេតុសំខាន់ៗក្នុងប្រវត្តិការរៀនម៉ាស៊ីន និងបញ្ញាសិប្បនិម្មិត។
ប្រវត្តិបញ្ញាសិប្បនិម្មិត (AI) ជាវិស័យមួយមានការតភ្ជាប់យ៉ាងជិតស្និទ្ធជាមួយប្រវត្តិការរៀនម៉ាស៊ីន ដោយសារបាល់ហ្គារីតម និងការរីកចម្រើនគណិតវិទ្យា ដែលជាគន្លងមួយដល់ការអភិវឌ្ឍន៍ AI។ វាមានប្រយោជន៍ក្នុងការចងគម្លាតថា ខណៈពេលដែលវិស័យទាំងពីរនេះជាវិស័យដាច់ខាតបានចាប់ផ្តើមបង្ករឡើងនៅទសវត្សរ៍ 1950 ការរកឃើញ [បាល់ហ្គារីត, ស្ថិតិ, គណិតវិទ្យា, ការគណនា និងបច្ចេកទេស](https://wikipedia.org/wiki/Timeline_of_machine_learning) សំខាន់ៗបានមកមុន និងមានភាពជាប់ពាក់ផ្តាច់គ្នានៅខណៈពេលនោះ។ ជាការពិត មនុស្សបានគិតអំពីសំណួរទាំងនេះរយៈពេលពាន់ឆ្នាំមកហើយ ([https://wikipedia.org/wiki/History_of_artificial_intelligence](https://wikipedia.org/wiki/History_of_artificial_intelligence))៖ អត្ថបទនេះពិភាក្សាអំពីមូលដ្ឋានបែបគំនិតបុរាណនៃគំនិតម៉ាស៊ីនដែលអាច "គិតបាន"។
---
## ការរកឃើញសំខាន់ៗ
- 1763, 1812 [ទ្រឹស្តីBayes](https://wikipedia.org/wiki/Bayes%27_theorem) និងមុខងាររបស់វា។ ទ្រឹស្តីនេះ និងការប្រើប្រាស់របស់វាជាផ្នែកមូលដ្ឋាននៃការទាយទ្រង់, ពិពណ៌នាពីប្រភេទភាពនៃព្រឹត្តិការណ៍មួយនៅលើការយល់ដឹងពីមុន។
- 1805 [ទ្រឹស្តីបួនកន្លែងតិចបំផុត](https://wikipedia.org/wiki/Least_squares) ដោយគណិតវិទ្យាករជប៉ុន Adrien-Marie Legendre។ ទ្រឹស្តីនេះ ដែលអ្នកនឹងរៀននៅក្នុងមេរៀន Regression របស់យើង ជួយសម្រួលក្នុងការសម្រួលទិន្នន័យ។
- 1913 [ខ្សែ Markov](https://wikipedia.org/wiki/Markov_chain) ដែលបានដាក់ឈ្មោះដោយគណិតវិទ្យាកររុស្ស៊ី Andrey Markov ជួយពិពណ៌នារបៀបលំដាប់នៃព្រឹត្តិការណ៍ដែលអាចកើតមានដោយផ្អែកលើស្ថានភាពមុន។
- 1957 [Perceptron](https://wikipedia.org/wiki/Perceptron) គឺជាប្រភេទអ្នកចាត់ថ្នាក់បែបស្របបន្ទាត់ ដែលបានបង្កើតដោយបុគ្គលិកចិត្តវិទ្យាអាមេរិក Frank Rosenblatt ដែលជាគន្លងនៃការរីកចម្រើនក្នុង deep learning។
---
- 1967 [អ្នកជិតស្និទ្ធបំផុត](https://wikipedia.org/wiki/Nearest_neighbor) គឺបាល់ហ្គារីតដែលបានរចនាដំបូងសម្រាប់គូសផ្លូវ។ ក្នុងបរិបទ ML វាអាចប្រើសម្រាប់រកឃើញទ្រង់ទ្រាយ។
- 1970 [Backpropagation](https://wikipedia.org/wiki/Backpropagation) ត្រូវបានប្រើសម្រាប់ហ្វឹកហាត់ [ធំណាលសរសៃប្រសាទមុខមាត់.feedforward](https://wikipedia.org/wiki/Feedforward_neural_network)។
- 1982 [Recurrent Neural Networks](https://wikipedia.org/wiki/Recurrent_neural_network) គឺជាធំណាលសរសៃប្រសាទមួយដែលដើមមកពី feedforward neural networks ដែលបង្កើតក្រាបបន្ថែមពេលវេលា។
✅ សូមស្រាវជ្រាវបន្តិចបន្តួច។ តើកាលបរិច្ឆេទផ្សេងទៀតណាដែលនៅសោះជាកត្តាសំខាន់ក្នុងប្រវត្តិអំពី ML និង AI?
---
## 1950៖ ម៉ាស៊ីនដែលគិតបាន
Alan Turing ដែលជាមនុស្សដ៏អស្ចារ្យម្នាក់ ដែលត្រូវបានជ្រើសរើស [ដោយសាធារណជនឆ្នាំ 2019](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) អោយជាសាស្ត្រាចារ្យដ៏អស្ចារ្យបំផុតក្នុងទសវត្សរ៍ 20, គេធ្លាប់បានជួយដាក់មូលដ្ឋានសម្រាប់គំនិតម៉ាស៊ីនដែលអាច "គិតបាន"។ គាត់បានប្រឈមមុខនឹងអ្នកពិជ័យនានា និងតម្រុយខ្លួនឯងក្នុងការរកភស្តុតាងសម្រាប់គំនិតនេះ ដោយការបង្កើត [តេស្ត Turing](https://www.bbc.com/news/technology-18475646) ដែលអ្នកនឹងស្វែងយល់ក្នុងមេរៀន NLP របស់យើង។
---
## 1956៖ គម្រោងស្រាវជ្រាវរដូវក្តៅ Dartmouth
"គម្រោងស្រាវជ្រាវរដូវក្តៅ Dartmouth លើបញ្ញាសិប្បនិម្មិត គឺជាព្រឹត្តិការណ៍ដ៏សំខាន់សម្រាប់សាលាបញ្ញាសិប្បនិម្មិត" ហើយក៏នៅទីនេះផងដែរនេះគេបានប្រើពាក្យ 'artificial intelligence' ជាលើកដំបូង ([ប្រភព](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth))។
> គ្រប់ផ្នែកនៃការរៀន ឬលក្ខណៈណាមួយនៃបញ្ញា អាចពិពណ៌នាបានយ៉ាងម៉ត់ចត់ ដូច្នេះម៉ាស៊ីនអាចបង្កើតឡើងដើម្បីធ្វើហ្គោលម៉ូដែលនោះ។
---
អ្នកស្រាវជ្រាវដឹកនាំគឺ គ្រូបន្លិចគណិតវិទ្យា John McCarthy ដែលមានក្តីសង្ឃឹម "ដើម្បីបន្តទៅលើមូលដ្ឋាននៃការប៉ាន់ប្រមាណថា គ្រប់ផ្នែកនៃការរៀន ឬលក្ខណៈណាមួយនៃរបស់ពិតបញ្ញា អាចពិពណ៌នាបានយ៉ាងម៉ត់ចត់ ដូច្នេះម៉ាស៊ីនអាចធ្វើតួមួយដើម្បីធ្វើម៉ូដែលបាន។" អ្នកចូលរួមរួមមានអ្នកវិចិកគណិត Minsky Marvin ម្នាក់ផ្សេងទៀត។
កម្មវិធីសិក្សានេះគឺត្រូវបានគេចាត់ទុកថាបានចាប់ផ្តើមនិងលូតលាស់ការពិភាក្សាជាច្រើន រួមរួមទាំង "ការរីកចម្រើនវិធីសាស្ត្រសញ្ញា, ប្រព័ន្ធផ្តោតលើដែនកំណត់ (ប្រព័ន្ធឯកទេសដំបូង), និងប្រព័ន្ធអនុវត្តតាមការបញ្ចេញមតិប្រៀបធៀបនឹងប្រព័ន្ធប្រមូលវិទ្យា" ([ប្រភព](https://wikipedia.org/wiki/Dartmouth_workshop))។
---
## 1956 - 1974៖ "ឆ្នាំមាស"
ចាប់ពីទសវត្សរ៍ 1950 មកដល់កណ្ដាលទសវត្សរ៍ '70, ការពេញចិត្តថាទំនុកចិត្តថា AI អាចដោះស្រាយបញ្ហាជាច្រើនបាន។ ក្នុងឆ្នាំ 1967 Marvin Minsky បានបញ្ជាក់ដោយមានទំនុកចិត្តថា "ក្នុងរយៈពេលមួយជំនាន់ ... បញ្ហានៃការបង្កើត 'artificial intelligence' នឹងត្រូវបានដោះស្រាយយ៉ាងសំខាន់។" (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall)
ការស្រាវជ្រាវសំដៅទៅលើដំណើរការ​ភាសា​ធម្មជាតិបានរីកចម្រើន ការស្វែងរកបានកែលម្អ និងក្លាយទៅជាខ្លាំងជាងមុន និង​មានគំនិត micro-worlds ដែលបំពេញភារកិច្ចដោយប្រើការណែនាំភាសារសាមញ្ញ។
---
ការស្រាវជ្រាវត្រូវបានផ្តល់ថវិការយ៉ាងល្អពីអង្គការរដ្ឋបាល ការរីកចម្រើនក្នុងទស្សនវិជ្ជា និងបាល់ហ្គារីត និងបានបង្កើតម៉ាស៊ីនឆ្លាតវៃមួយចំនួន។ មួយចំនួនក្នុងម៉ាស៊ីនទាំងនេះរួមមាន៖
* [Shakey the robot](https://wikipedia.org/wiki/Shakey_the_robot) ដែលអាចផ្លាស់ទី និងសម្រេចការប្រតិបត្ដិការដោយមានវិជ្ជាជីវៈ។
![Shakey, ម៉ាស៊ីនឆ្លាតវៃមួយ](../../../../translated_images/km/shakey.4dc17819c447c05b.webp)
> Shakey ក្នុងឆ្នាំ 1972
---
* Eliza ដែលជាប្រភេទ 'chatterbot' ដំបូង អាចសម្ភាសជាមួយមនុស្ស និងដើរតួជាអ្នកព្យាបាលមួយ 'therapist' ប្រល័យ។ អ្នកនឹងរៀនបន្ថែមពី Eliza នៅក្នុងមេរៀន NLP។
![Eliza, ប័ណ្ណ](../../../../translated_images/km/eliza.84397454cda9559b.webp)
> គំរូមួយនៃ Eliza, chatbot
---
* "Blocks world" ជាគំរូ micro-world មួយដែលប្លុកអាចត្រូវបានដាក់ស្នូរនិងតម្រៀបនៅ តេស្តល្បងក្នុងការបង្រៀនម៉ាស៊ីនឲ្យធ្វើការសម្រេចចិត្តក៏ត្រូវបានអនុវត្ត។ ការរីកចម្រើនដែលបានបង្កើតឡើងជាមួយបណ្ណាល័យដូចជា [SHRDLU](https://wikipedia.org/wiki/SHRDLU) បានជំនួយឲ្យមានការរីកចម្រើនក្នុងការប្រាស្រ័យភាសា។
[![blocks world with SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "blocks world with SHRDLU")
> 🎥 ចុចរូបថតខាងលើសម្រាប់វីដេអូ៖ Blocks world ជាមួយ SHRDLU
---
## 1974 - 1980៖ "រដូវរងារ AI"
ចាប់ពីកណ្ដាលទសវត្សរ៍ 1970 វាបានក្លាយជាការប៉ាន់ប្រមាណថាការធ្វើម៉ាស៊ីនឆ្លាតវៃមានភាពស្មុគស្មាញជាងការប៉ាន់ទុក ហើយការសន្យារបស់វាក្រោមសំណុំបញ្ញត្តិថាមពលគណនា មានការប៉ុនប៉ងលើសលប់។ ថវិកាត្រូវបានកាត់បន្ថយ ហើយទំនុកចិត្តក្នុងវិស័យបានត្រង់ការ។ បញ្ហាដែលមានឥទ្ធិពលដល់ទំនុកចិត្តរួមមាន៖
---
- **កំណត់លក្ខណៈ** លទ្ធភាពគណនាគឺមានកំណត់ខ្លាំង។
- **ការរីកចម្រើនប្រមូលផ្តុំ** ចំនួនប៉ារ៉ាម៉ែត្រដែលត្រូវហ្វឹកហាត់មានការកើនឡើងយ៉ាងច្រើននៅពេលបានសុំសំណុំបន្ថែមពីកុំព្យូទ័រ ដោយគ្មានការរីកចម្រើននៅលើថាមពលនិងសមត្ថភាពគណនា។
- **ទិន្នន័យខ្វះខាត** មានទិន្នន័យមិនគ្រប់គ្រាន់ដែលជារារាំងដល់ដំណើរការប្រលង, អភិវឌ្ឍ និងកែលម្អបាល់ហ្គារីត។
- **តើយើងកំពុងសួរសំណួរត្រឹមត្រូវឬទេ?** សំណួរដែលបានសួរបានចាប់ផ្តើមមានការសង្ស័យ។ អ្នកស្រាវជ្រាវបានទទួលកំណត់ត្រានូវការរិះគន់ចំពោះវិធីសាស្ត្ររបស់ពួកគេ៖
- តេស្ត Turing ត្រូវបានពិចារណា តាមរយៈគំនិតផ្សេងៗ ដូចជា 'ទ្រឹស្តីបន្ទប់ចិន' ដែលបានបង្ហាញថា "កម្មវិធីកុំព្យូទ័រឌីជីថលអាចបង្ហាញថាវា​យល់ភាសា ប៉ុន្តែមិនអាចបង្កើតការយល់ដឹងពិតប្រាកដ។" ([ប្រភព](https://plato.stanford.edu/entries/chinese-room/))
- សីលធម៌នៃការបង្កើតវត្ថុបញ្ញាសិប្បនិម្មិត ដូចជា "អ្នកព្យាបាល" ELIZA ត្រូវបានគេបដិសេធ។
---
នៅក្នុងពេលតែមួយ ក្រុមគំនិត AI ផ្សេងៗបានចាប់ផ្តើមបង្កើតឡើង។ មានការផ្គុំចេញជាគំនិតផ្ទុកពីវិធីដំណើរការ ["scruffy" និង "neat AI"](https://wikipedia.org/wiki/Neats_and_scruffies)។ សេឡាប៊ល _scruffy_ បានកែប្រែកម្មវិធីរយៈពេលជាច្រើនម៉ោងរហូតដល់ទទួលបានលទ្ធផលយ៉ាងចង់បាន។ សេឡាប៊ល _neat_ "ផ្តោតលើហេតុផលនិងការដោះស្រាយបញ្ហាផ្លូវការ"។ ELIZA និង SHRDLU គឺជា​ប្រព័ន្ធ _scruffy_ មានឈ្មោះល្បី។ នៅទសវត្សរ៍ 1980 ខណៈមានតម្រូវការបង្កើតប្រព័ន្ធ ML អាចធ្វើឡើងម្ដងទៀត, វិធីសាស្ត្រ _neat_ បានទទួលការគាំទ្រជាច្រើន ព្រោះលទ្ធផលបង្ហាញបានច្បាស់លាស់ជាង។
---
## ប្រព័ន្ធឯកទេសទសវត្សរ៍ 1980
ខណៈវិស័យកំពុងរីកចម្រើន ប្រយោជន៍របស់វាកាន់តែច្បាស់លាស់សម្រាប់អាជីវកម្ម ហើយនៅទសវត្សរ៍ 1980 ក៏មានការរាលដាលនៃ 'ប្រព័ន្ធឯកទេស'។ "ប្រព័ន្ធឯកទេសគឺជាប្រភេទកម្មវិធី AI (artificial intelligence) ដែលជោគជ័យដំបូងមួយ" ([ប្រភព](https://wikipedia.org/wiki/Expert_system))។
ប្រព័ន្ធនេះជារូបមន្ត _ផ្សំជាមួយគ្នា_ ដែលមានផ្នែកមួយជាគ្រឿងចស្ត្រ​និយមដែលកំណត់តម្រូវការអាជីវកម្ម និងផ្នែកមួយជាគ្រឿងចស្ត្រអនុវត្តប្រើប្រាស់បាល់ហ្គារីតដើម្បីសិក្សាផ្នែកអត្ថន័យថ្មី។
ទសវត្សនេះក៏ទទួលបានការចាប់អារម្មណ៍កាន់តែច្រើនលើបណ្ដាញសរសៃប្រសាទ។
---
## 1987 - 1993៖ AI 'នៅស្ងាត់'
ការរីកចម្រើននៃម៉ាស៊ីនឯកទេសដែលមានពិសេសធ្វើឲ្យវាក្លាយជាពិសេសពេក។ ការលេចធ្លោរបស់កុំព្យូទ័រផ្ទាល់ខ្លួនក៏ប្រកួតប្រជែងជាមួយប្រព័ន្ធធំៗដែលមានតែមួយនេះ។ ការចំណាយនៅលើកុំព្យូទ័របានជោគជ័យ ហើយវាបានបើកផ្លូវទៅរកការប្រសើរឡើងនៃទិន្នន័យធំ។
---
## 1993 - 2011
រយៈពេលនេះបានឃើញជំនាន់ថ្មីសម្រាប់ ML និង AI ដើម្បីដោះស្រាយបញ្ហាកន្លងមកដែលផ្ទុះពីកំណត់ទិន្នន័យនិងថាមពលគណនា។ ចំនួនទិន្នន័យបានកើនឡើងយ៉ាងឆាប់រហ័ស និងអាចប្រើបានយ៉ាងទូលំទូលាយ ពិសេសជាមួយកំណើតនៃស្មាតហ្វូននៅឆ្នាំ 2007។ ថាមពលគណនាក៏កើនឡើងយ៉ាងឆាប់រហ័ស និងបាល់ហ្គារីតបានរីកចម្រើនជាប់គ្នា។ វិស័យបានចាប់ផ្តើមឈានដល់ភាពចាស់ទុំ ពីព្រោះថ្ងៃខ្លះនៃការរំសាយឥតការត្រួតពិនិត្យបានក្លាយទៅជាវិស័យពិតប្រាកដ។
---
## ឥឡូវនេះ
ថ្ងៃនេះ ការរៀនម៉ាស៊ីន និង AI ប៉ះពាល់ទៅលើគ្រប់ផ្នែកនៃជីវិតយើង។ រយៈពេលនេះត្រូវការជំនាញយល់ដឹងយ៉ាងម៉ត់ចត់អំពីហានិភ័យ និងផលប៉ះពាល់ធ្វើអោយមានពីរបាល់ហ្គារីតទាំងនេះលើជីវិតមនុស្ស។ ដូចដែល Brad Smith របស់ Microsoft បាននិយាយថា "បច្ចេកវិទ្យាព័ត៌មាន បង្កឡើងនូវបញ្ហាដែលទៅដល់ស្នូលនៃការការពារសិទ្ធិមនុស្សមេធាវីដូចជារក្សាសម្ងាត់ និងសិទ្ធិថ្លែងការណ៍។ បញ្ហានេះកើនឡើងការទទួលខុសត្រូវចំពោះក្រុមហ៊ុនបច្ចេកវិទ្យាដែលបង្កើតផលិតផលទាំងនេះ។ ក្នុងទស្សនវិជ្ជារបស់យើង វាក៏ហៅឲ្យមានច្បាប់រដ្ឋាភិបាលយ៉ាងម៉ត់ចត់ និងបង្កើតនីតិវិធីជុំវិញការប្រើប្រាស់លើសស្រឡាយទទួលបទបង្រៀន។" ([ប្រភព](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/))។
---
វានៅតែមិនទាន់បានដឹងថា អនាគតនឹងគ្រប់គ្រងអ្វីទេ ប៉ុន្តែវាសំខាន់ក្នុងការយល់ដឹងអំពីប្រព័ន្ធកុំព្យូទ័រ និងកម្មវិធី និងបាល់ហ្គារីតដែលវារត់។ យើងសង្ឃឹមថាផែនការសិក្សានេះនឹងជួយអ្នកយល់ដឹងកាន់តែច្បាស់ ដើម្បីអោយអ្នកអាចសម្រេចចិត្តដោយខ្លួនឯង។
[![ប្រវត្តិ deep learning](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "ប្រវត្តិ deep learning")
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូ៖ Yann LeCun ពិភាក្សាអំពីប្រវត្តិ deep learning ក្នុងមេរៀននេះ
---
## 🚀ការប្រកួតប្រជែង
ស្វែងរកមួយក្នុងចំណោមព្រឹត្តិការណ៍ប្រវត្តិសាស្ត្រទាំងនេះ ហើយស្វែងយល់បន្ថែមអំពីមនុស្សនៅពីក្រោយពួកវា។ មានតួអង្គគួរឲ្យចាប់អារម្មណ៍ ហើយគ្មានការរកឃើញវិទ្យាសាស្ត្រណាមួយដែលបានបង្កើតឡើងនៅក្នុងអវកាសវប្បធម៌ទទេ។ តើអ្នកបានរកឃើញអ្វី?
## [ប្រឡងបន្ទាប់ពីរៀន](https://ff-quizzes.netlify.app/en/ml/)
---
## ការត្រួតពិនិត្យ និងសិក្សាឯករាជ្យ
នេះជារបស់មួយដែលត្រូវមើលនិងស្តាប់៖
[ប៉ុស្តិ៍បាស្កែតនេះដែល Amy Boyd ពិភាក្សាអំពីការវិវត្តន៍នៃ AI](http://runasradio.com/Shows/Show/739)
[![ប្រវត្តិ AI ដោយ Amy Boyd](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "ប្រវត្តិ AI ដោយ Amy Boyd")
---
## អនុវត្តការ
[បង្កើតកាលវេលា](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 @@
# បង្កើតបន្ទាត់ពេលវេលា
## សេចក្ដីណែនាំ
ប្រើ [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,163 @@
# ការបង្កើតដំណោះស្រាយម៉ាស៊ីនរៀនជាមួយ AI ដែលមានការទទួលខុសត្រូវ
![សង្ខេបអំពី AI ដែលមានការទទួលខុសត្រូវក្នុងម៉ាស៊ីនរៀនក្នុងសកេតណូត](../../../../translated_images/km/ml-fairness.ef296ebec6afc98a.webp)
> សកេតណូតដោយ [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [គន្លឹះសំណួរមុនពេលសិក្សា](https://ff-quizzes.netlify.app/en/ml/)
## ជំហានបើក
ក្នុងមេរៀននេះ អ្នកនឹងចាប់ផ្តើមស្វែងរកពីរបៀបដែលម៉ាស៊ីនរៀនអាចវាយបង្វិលនិងមានឥទ្ធិពលលើជីវិតប្រចាំថ្ងៃរបស់យើង។ ទាំងឥឡូវនេះ ប្រព័ន្ធនិងម៉ូដែលជាប់ពាក់ព័ន្ធក្នុងភារកិច្ចសម្រេចចិត្តប្រចាំថ្ងៃដូចជា ការបញ្ជាក់ជំងឺសុខាភិបាល ការអនុម័តឥណទាន ឬការរកឃើញការជ្រុលបំពាន។ ដូច្នេះ វាពិតជាសំខាន់ណាស់ដែលម៉ូដែលទាំងនេះធ្វើការល្អដើម្បីផ្តល់លទ្ធផលដែលអាចទុកចិត្តបាន។ ដូចជាកម្មវិធីទូទៅណាមួយប្រព័ន្ធ AI អាចខកចិត្តនឹងការរំពឹងទុក ឬមានលទ្ធផលដែលមិនចង់បាន។ នេះហើយហ្នឹងជាហេតុផលដែលយើងត្រូវតែបង្រៀនខ្លួនឯងអំពីរបៀបយល់ និងពន្យល់អំពីអាកប្បករណ៍នៃម៉ូដែល AI។
សន្ដិភាពនូវអ្វីដែលអាចកើតមានឡើងពេលដែលទិន្នន័យដែលអ្នកកំពុងប្រើសម្រាប់បង្កើតម៉ូដែលទាំងនេះខ្វះក្រុមហ៊ុនជនជាតិខុសៗគ្នា ដូចជា ជាតិកុលលក្ខណៈ ភេទ ទស្សនវិស័យនយោកយោបាយ សាសនា ឬតំណាងនយោបាយដែលមានការលើសលប់។ តើវាយយកម៉ូដែលបានបង្ហាញលទ្ធផលផ្សេងទេវាសម្រាប់ខ្លឹមសារគណៈជនជាតិកំណត់មួយ? តើផលប៉ះពាល់សម្រាប់កម្មវិធីនេះមានអ្វីខ្លះ? លើសពីនេះ តើពេលម៉ូដែលមានលទ្ធផលអាក្រក់ និងបង្កមិត្តវិបត្តិក្នុងមនុស្ស តើនរណាជាទីតាំងទទួលខុសត្រូវចំពោះអាកប្បករិតនៃប្រព័ន្ធ AI? នេះជាសំណួរមួយចំនួនដែលយើងនឹងស្វែងរកក្នុងមេរៀននេះ។
ក្នុងមេរៀននេះ អ្នកនឹង៖
- បង្កើតការយល់ដឹងអំពីសារៈសំខាន់នៃភាពយុត្តិធម៌ក្នុងម៉ាស៊ីនរៀន និងគ្រោះថ្នាក់ដែលពាក់ព័ន្ធនឹងភាពយុត្តិធម៌។
- មកស្គាល់នឹងការអនុវត្តន៍នៃការស្វែងរកចំពោះភាពខុសគ្នានិងលក្ខណៈពិសេសដើម្បីធានានូវភាពទុកចិត្ត និងសុវត្ថិភាព។
- មានការយល់ដឹងពីតម្រូវការដើម្បីអោយគ្រប់គ្នាមានសិទ្ធិ និងរចនាប្រព័ន្ធរួមមួយ។
- ស្វែងរកពីសារៈសំខាន់នៃការការពារឯកជនភាព និងសុវត្ថិភាពទិន្នន័យ និងមនុស្ស។
- ឃើញសារៈសំខាន់នៃការយកវិធីជាកញ្ចក់ដើម្បីពន្យល់អាកប្បករិតនៃម៉ូដែល AI។
- មានការត្រួតពិនិត្យចំពោះតួនាទីនៃការទទួលខុសត្រូវដើម្បីកសាងក្តីទុកចិត្តនៅក្នុងប្រព័ន្ធ AI។
## លក្ខខណ្ឌមុនពេលចូលរួម
ជាលក្ខខណ្ឌមុនសូមចូលរួមវគ្គ "គោលនយោបាយ AI ដែលមានការទទួលខុសត្រូវ" និងមើលវីដេអូខាងក្រោម៖
ស្វែងរកព័ត៌មានបន្ថែមអំពី AI ដែលមានការទទួលខុសត្រូវតាមរយៈការតាមដាន [Learning Path](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)
[![Microsoft's Approach to Responsible AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoft's Approach to Responsible AI")
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូ៖ របៀប Microsoft ក្នុងការទទួលខុសត្រូវ AI
## ភាពយុត្តិធម៌
ប្រព័ន្ធ AI គួរតែប្រើប្រាស់យ៉ាងយុត្តិធម៌ និងជៀសវាងការប៉ះពាល់ដល់ក្រុមមនុស្សដូចគ្នានៅលើបែបផែនផ្សេងៗ។ ឧទាហរណ៍ នៅពេលប្រព័ន្ធ AI ផ្តល់យោបល់កំពុងការព្យាបាលផ្នែកសុខាភិបាល ការដាក់ពាក្យខ្ចីប្រាក់ ឬការជ្រើសរើសការងារ គួរតែផ្តល់ការផ្តល់យោបល់ដូចគ្នារបស់មនុស្សដែលមានរោគសញ្ញាស្រដៀងគ្នា ស្ថានភាពហិរញ្ញវត្ថុស្របគ្នា ឬគុណវប្បកម្មបុគ្គលរបស់ពួកគេ។ មនុស្សម្នាក់ទាំងអស់កាន់តាមដានលទ្ធផលនៃការប្រគល់វេនដែលមានឥទ្ធិពលលើសេចក្តីសម្រេចចិត្តនិងសកម្មភាពរបស់យើង។ ភាពលំអៀងនេះអាចមើលឃើញបានក្នុងទិន្នន័យដែលយើងប្រើសម្រាប់បណ្តុះបណ្តាលប្រព័ន្ធ AI។ ការតំលើងបែបនេះជាដំណើរទាក់ទងដែលអាចកើតឡើងដោយមិនចង់បាន។ វាពិបាកក្នុងការយល់ច្បាស់នៅពេលអ្នកជំពាក់ភាពលំអៀងក្នុងទិន្នន័យ។
**“ភាពមិនយុត្តិធម៌”** មានន័យថាប្រសិនបើមានផលប៉ះពាល់អវិជ្ជមាន ឬ “គ្រោះថ្នាក់” សម្រាប់ក្រុមអ្នកមួយ ដូចជាការកំណត់ជាតិកុលភេទ អាយុ ឬស្ថានភាពអ្នកពិការភាព។ គ្រោះថ្នាក់ទាក់ទងនឹងភាពយុត្តិធម៌អាចចែងបានជា៖
- **ការចែកចាយ** ជាដើមប្រភេទភេទ ឬជាតិកុលណាមួយត្រូវបានចូលចិត្តលើសពីមួយផ្សេងទៀត។
- **គុណភាពសេវាកម្ម** ប្រសិនបើអ្នកបណ្តុះទិន្នន័យសម្រាប់ស្ថានการณ์មួយដែលមិនស្មុគស្មាញពេញលេញ នេះនាំឲ្យមានសេវាកម្មដែលឆ្លុះបញ្ចាំងមិនល្អ។ ឧទាហរណ៍ ម៉ាស៊ីនចាក់សាប៊ូដៃមួយមិនអាចដឹងបានពីមនុស្សដែលមានស្បែកស្រអាប់។ [យោង](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **ការរិះគន់មិនយុត្តិធម៌** ការរិះគន់មិនយុត្តិធម៌ និងបង្វែរ ឧទាហរណ៍ បច្ចេកវិទ្យាការតំឡើងស្លាករូបភាពមួយបានចាក់ស្លាករូបភាពមនុស្សស្បែក​ស្រអាប់​ជា​ក្រិកកណ្តោល។
- **ការចំណេញឬការខ្វះតំណាង** គំនិតថាក្រុមណាមួយមិនបានមើលឃើញក្នុងវិជ្ជាជីវៈជាក់លាក់ណាមួយ ហើយសេវា ឬមុខងារណាមួយណាដែលបន្តផ្សព្វផ្សាយការខ្វះតំណាងនោះក៏បន្ថែមគ្រោះថ្នាក់។
- **ស្ទេរ឵អាប់** ភ្ជាប់ក្រុមណាមួយជាមួយលក្ខណៈដែលបានកំណត់មិនជារួសរាយ។ ឧទាហរណ៍ ប្រព័ន្ធបកប្រែភាសារវាងភាសាអង់គ្លេសនិងទួរគីជាច្រើនបង្ហាញភាពមិនត្រឹមត្រូវដោយពាក្យដែលភ្ជាប់ទៅនិងភេទជាមួយនឹងស្ទេរព្រីប។
![បកប្រែទៅភាសាទួរគី](../../../../translated_images/km/gender-bias-translate-en-tr.f185fd8822c2d437.webp)
> បកប្រែទៅភាសាទួរគី
![បកប្រែត្រឡប់ទៅភាសាអង់គ្លេស](../../../../translated_images/km/gender-bias-translate-tr-en.4eee7e3cecb8c70e.webp)
> បកប្រែត្រឡប់ទៅភាសាអង់គ្លេស
ពេលរចនានិងសាកល្បងប្រព័ន្ធ AI យើងត្រូវធានាថា AI មានភាពយុត្តិធម៌ និងមិនត្រូវបានកំណត់ដើម្បីធ្វើការសម្រេចចិត្តមានការប្រហាក់ប្រហែល ឬការរើសអើងដែលមនុស្សក៏ត្រូវចាត់ទុកថាមិនត្រឹមត្រូវដែរ។ ការធានាអោយមានភាពយុត្តិធម៌ក្នុង AI និងម៉ាស៊ីនរៀននៅតែជាបញ្ហាសង្គមបច្ចេកទេសដ៏ស្មុគស្មាញ។
### ភាពទុកចិត្តនិងសុវត្ថិភាព
ដើម្បីបង្កើតការទុកចិត្ត ប្រព័ន្ធ AI ត្រូវតែទុកចិត្តបាន, មានសុវត្ថិភាព និងមានស្ថិរភាពក្រោមលក្ខខណ្ឌធម្មតានិងមិនរំពឹងទុក។ វាពិតជាសំខាន់ក្នុងការយល់ពីរបៀបប្រព័ន្ធ AI នឹងមានអាកប្បករណ៍នៅក្នុងស្ថានភាពនានា ជាពិសេសនៅពេលវាជា outliers។ នៅពេលបង្កើតដំណោះស្រាយ AI ត្រូវផ្តោតខ្លាំងលើរបៀបដោះស្រាយស្ថានភាពផ្សេងៗដែលអាចមកជួបទៅនឹងដំណោះស្រាយ AI។ ឧទាហរណ៍ ឡានបើកប្រាណថ្មីគួរតែនាំខ្ពស់ការគ្រប់គ្រងសុវត្ថិភាពមនុស្ស។ ដូច្នេះ AI ដែលបើកឡានត្រូវតែពិចារណាស្ថានភាពជា​ច្រើន​អាច​កើត​មាន​ដូច​ជា ពេលกลางคืน ភ្លៀង បាញ់ស្រអប់ ក្មេងចូលរថយន្ត សត្វចិញ្ចឹម​ ការសាងសង់ផ្លូវ។ ប្រព័ន្ធ AI អាចគ្រប់គ្រងស្ថានភាពទាំងអស់យ៉ាងត្រឹមត្រូវនិងមានសុវត្ថិភាព បង្ហាញពីកម្រិតការព្យាបាលរបស់អ្នកវិទ្យាសាស្រ្តទិន្នន័យ ឬអ្នកអភិវឌ្ឍ AI មុនពេលរចនានិងសាកល្បងប្រព័ន្ធ។
> [🎥 ចុចទីនេះសម្រាប់វីដេអូ: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
### ការរួមបញ្ចូល
ប្រព័ន្ធ AI គួរតែរចនាឡើងដើម្បីពាក់ព័ន្ធ និងផ្តល់អំណាចដល់ទាំងអស់។ នៅពេលរចនា និងអនុវត្តប្រព័ន្ធ AI អ្នកវិទ្យាសាស្រ្តទិន្នន័យ និងអ្នកអភិវឌ្ឍ AI ត្រូវកំណត់និងដោះស្រាយអំពើការកំណត់គោលដៅដែលអាចច្រេីនមនុស្សដោយមិនចង់បាន។ ឧទាហរណ៍ មានមនុស្ស 1 ពាន់លាននាក់ដែលមានជំងឺពិការភាពនៅជុំវិញពិភពលោក។ ជាមួយនឹងការវិវឌ្ឍ AI ពួកគេអាចចូលដំណើរការព័ត៌មាន និងឱកាសជាច្រើនបានងាយស្រួលក្នុងជីវិតប្រចាំថ្ងៃរបស់ពួកគេ។ ដោយដោះស្រាយឧបសគ្គ ទំនិញសម្រាប់ច្នៃប្រឌិតនិងអភិវឌ្ឍផលិតផល AI ដែលមានបទពិសោធន៍ល្អប្រសើរដែលអាចផ្ដល់អត្ថប្រយោជន៍ដល់គ្រប់គ្នា។
> [🎥 ចុចទីនេះសម្រាប់វីដេអូ: ការរួមបញ្ចូលក្នុង AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
### សុវត្ថិភាព និងឯកជនភាព
ប្រព័ន្ធ AI គួរតែមានសុវត្ថិភាព និងគោរពឯកជនភាពរបស់មនុស្ស។ មនុស្សមានកម្រិតការទុកចិត្តតិចទៅលើប្រព័ន្ធដែលបង្កការជ្រុលនូវឯកជនភាព ព័ត៌មាន ឬជីវិតរបស់ពួកគេ។ នៅពេលបណ្តុះម៉ូដែលម៉ាស៊ីនរៀន យើងពឹងផ្អែកលើទិន្នន័យដើម្បីផលិតលទ្ធផលល្អបំផុត។ ក្នុងការធ្វើដូចនេះ ប្រភពទិន្នន័យ និងភាពរឹងប៉ឹងគួរត្រូវបានគិតគូរ។ ឧទាហរណ៍ ទិន្នន័យមានប្រភពពីអ្នកប្រើប្រាស់ ឬទិន្នន័យសាធារណៈ? បន្ទាប់មក នៅពេលធ្វើការជាមួយទិន្នន័យ វានិងមានសារៈសំខាន់ក្នុងការអភិវឌ្ឍប្រព័ន្ធ AI ដែលអាចការពារព័ត៌មានសម្ងាត់ និងទប់ស្កាត់ការប្រហារ។ បើយោងតាមការរីកចម្រើនAI ការគោរពឯកជនភាព និងការការពារព័ត៌មានបុគ្គល និងអាជីវកម្មកាន់តែលំបាកនិងសំខាន់។ បញ្ហាអំពីឯកជនភាពនិងសុវត្ថិភាពទិន្នន័យត្រូវការយកចិត្តទុកដាក់យ៉ាងជិតស្និទ្ធសម្រាប់ AI ព្រោះការចូលដំណើរការទិន្នន័យមានសារៈសំខាន់សម្រាប់ប្រព័ន្ធ AI ក្នុងការធ្វើការទំាងអំពីព្យាករណ៍និងសម្រេចចិត្តបានត្រឹមត្រូវ។
> [🎥 ចុចទីនេះសម្រាប់វីដេអូ: សុវត្ថិភាពក្នុង AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- ក្នុងឧស្សាហកម្មយើងបានធ្វើការវិវឌ្ឍយ៉ាងច្រើននៅផ្នែកឯកជនភាព និងសុវត្ថិភាព ដោយពាក់ព័ន្ទយ៉ាងខ្លាំងជាមួយនឹងបទបញ្ជាដូចជា GDPR ។
- ប៉ុន្តែសម្រាប់ប្រព័ន្ធ AI យើងត្រូវតែទទួលស្គាល់ការពាក់ព័ន្ធរវាងតម្រូវការ ទិន្នន័យផ្ទាល់ខ្លួនបន្ថែម ដើម្បីធ្វើឲ្យប្រព័ន្ធផ្នែកផ្ទាល់ខ្លួន និងប្រសើរឡើង — និងការគោរពឯកជនភាព។
- ដូចជាការបង្កើតកុំព្យូទ័រចងក្រងនឹងអ៊ីនធឺណិត យើងក៏បានឃើញការកើនឡើងយ៉ាងខ្លាំងនៃបញ្ហាសុវត្ថិភាពដែលពាក់ព័ន្ធនឹង AI៕
- ខណៈពេលដដែល ក៏ឃើញពីការប្រើប្រាស់ AI ដើម្បីធ្វើឱ្យសុវត្ថិភាពប្រសើរឡើង។ ឧទាហរណ៍ សាច់ញាតិការពារពីវីរុសភាគច្រើនដែលមាននៅសព្វថ្ងៃគឺដំណើរការដោយ AI heuristics ។
- យើងត្រូវធានាថា បើកម្រិតវិទ្យាសាស្រ្តទិន្នន័យរបស់យើងបញ្ចូលការអនុវត្តៗថ្មីៗទាំងអស់ទាក់ទងនឹងឯកជនភាព និងសុវត្ថិភាព។
### ភាពច្បាស់លាស់
ប្រព័ន្ធ AI គួរតែដឹងច្បាស់។ ផ្នែកសំខាន់ពីភាពច្បាស់លាស់គឺការពន្យល់អាកប្បករណ៍នៃប្រព័ន្ធ AI និងធាតុផ្សំនៃវា។ ការកែលម្អការយល់ដឹងអំពីប្រព័ន្ធ AI ជំរុញឱ្យអ្នកពាក់ព័ន្ធយល់ថាតើវាដំណើរការយ៉ាងដូចម្តេចនិងហេតុផលដែលវាដំណើរការដូច្នោះ ដើម្បីជួយកំណត់បញ្ហាផ្នែកសមត្ថភាព ភាពសុវត្ថិភាព ផ្លូវការផ្សេងៗ ភាពលំអៀង ភាពមិនសុចរិត ឬលទ្ធផលមិនចង់បាន។ យើងក៏ជឿថា អ្នកប្រើប្រាស់ប្រព័ន្ធ AI គួរតែត្រួតពិនិត្យនិងរាយការណ៍ពេលណានិងហេតុផលដែលពួកគេប្រើប្រាស់វា និងកម្រិតកំណត់នៃប្រព័ន្ធដែលពួកគេចេញការប្រើប្រាស់។ ឧទាហរណ៍ ប្រសិនបើធនាគារប្រើប្រព័ន្ធ AI ជួយសម្រេចចិត្តឥណទាន វាពិតជាសំខាន់ក្នុងការត្រួតពិនិត្យលទ្ធផល និងយល់ថាតើទិន្នន័យណាដែលមានឥទ្ធិពលលើការផ្តល់ដំណឹងរបស់ប្រព័ន្ធ។ រដ្ឋាភិបាលកំពុងចាប់ផ្តើមគ្រប់គ្រង AI នៅក្នុងវិស័យផ្សេងៗ ដូច្នេះអ្នកវិទ្យាសាស្រ្តទិន្នន័យ និងអង្គការត្រូវតែពន្យល់ថាប្រព័ន្ធ AI នេះត្រូវគោរពតាមបទបញ្ជា ឬទេ ជាពិសេសនៅពេលមានលទ្ធផលមិនចង់បាន។
> [🎥 ចុចទីនេះសម្រាប់វីដេអូ: ភាពច្បាស់លាស់ក្នុង AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- ពីព្រោះប្រព័ន្ធ AI មានភាពស្មុគស្មាញខ្លាំង បង្កឡើងការលំបាកក្នុងការយល់ពីរបៀបវាដំណើរការ និងបកស្រាយលទ្ធផល។
- ការខ្វះការយល់ដឹងនេះប៉ះពាល់ដល់វិធីដែលប្រព័ន្ធទាំងនេះត្រូវបានគ្រប់គ្រង ប្រតិបត្តិ និងប្រភេទឯកសារ។
- ការខ្វះការយល់ដឹងនេះប៉ះពាល់យ៉ាងចាំបាច់ទៅលើការសម្រេចចិត្ត ដែលធ្វើឡើងដោយប្រើលទ្ធផលដែលប្រព័ន្ធទាំងនេះផលិត។
### ការទទួលខុសត្រូវ
មនុស្សដែលរចនានិងចេញផ្សាយប្រព័ន្ធ AI ត្រូវទទួលខុសត្រូវចំពោះរបៀបដែលប្រព័ន្ធរបស់ពួកគេចាក់សោ។ តម្រូវការនេះមានសារៈសំខាន់បំផុត ជាពិសេសជាមួយបច្ចេកវិទ្យាទាក់ទងនឹងការបញ្ចាក់មុខមាត់។ នៅពេលថ្មីៗនេះ មានការទាមទារកើនឡើងសម្រាប់បច្ចេកវិទ្យាបញ្ចាក់មុខមាត់ ជាពិសេសពីអង្គការជំនួយច្បាប់ ដែលឃើញភាពមានសក្តានុពលនៃបច្ចេកវិទ្យានៅក្នុងការស្វែងរកកុមារកំពុងបាត់បង់។ ទោះជាយ៉ាងណា បច្ចេកវិទ្យាអាចត្រូវបានប្រើដោយរដ្ឋាភិបាលដើម្បីឲ្យមានការតាមដានជាប់លាប់លើមនុស្សជាក់លាក់។ ដូច្នេះ អ្នកវិទ្យាសាស្រ្តទិន្នន័យ និងអង្គការត្រូវតែទទួលខុសត្រូវចំពោះវិបត្តិនៃប្រព័ន្ធ AI កំពុងប៉ះពាល់មនុស្ស ឬសង្គម។
[![អ្នកស្រាវជ្រាវ AI ដឹកនាំផ្សព្វផ្សាយអំពីការតាមដានទូទៅតាមបច្ចេកវិទ្យាបញ្ចាក់មុខមាត់](../../../../translated_images/km/accountability.41d8c0f4b85b6231.webp)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoft's Approach to Responsible AI")
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូ: ការព្រមានអំពីការតាមដានទូទៅតាមបច្ចេកវិទ្យាបញ្ចាក់មុខមាត់
ចុងក្រោយមួយក្នុងចំណោមសំណួរធំបំផុតសម្រាប់ជំនាន់យើង ជា​ជំនាន់ដំបូងដែលនាំ AI សម្រាប់សង្គម គឺរបៀបធានាឲ្យកុំព្យូទ័រនឹងនៅតែទទួលខុសត្រូវទៅមនុស្ស និងរបៀបធានាឲ្យអ្នកដែលរចនាកុំព្យូទ័រនេះនៅតែទទួលខុសត្រូវចំពោះគ្រប់លោកអ្នកផ្សេងទៀត។
## ការវាយតម្លៃផលប៉ះពាល់
មុនពេលបណ្តុះម៉ូដែលម៉ាស៊ីនរៀន វាជាចាំបាច់ក្នុងការធ្វើការវាយតម្លៃផលប៉ះពាល់ ដើម្បីយល់ពីគោលបំណងនៃប្រព័ន្ធ AI; តើការប្រើប្រាស់នឹងយកទៅប្រើធ្វើអ្វី; កន្លែងនឹងធ្វើការចេញផ្សាយ; និងនរណានឹងធ្វើការប៉ះពាល់ប្រព័ន្ធ។ ព័ត៌មាននេះជួយឲ្យអ្នកវាយតម្លៃ ឬអ្នកសាកល្បងធ្វើការវាយតម្លៃប្រព័ន្ធដឹងថាត្រូវគិតចំពោះមូលហេតុណាខ្លះនៅពេលកំណត់ហានិភ័យ និងលទ្ធផលដែលរំពឹងទុក។
ដូចតទៅជាតំបន់ដែលត្រូវផ្តោតខ្លាំងពេលធ្វើការវាយតម្លៃផលប៉ះពាល់៖
* **ផលប៉ះពាល់អវិជ្ជមានលើបុគ្គល**។ យល់ដឹងអំពីកំណត់ ឬតម្រូវការ ការប្រើប្រាស់មិនគាំទ្រ ឬកំណត់ខ្វះខាតណាមួយដែលអាចប៉ះពាល់ដល់សមត្ថភាពនៃប្រព័ន្ធមានសារៈសំខាន់ដើម្បីថែរក្សាឲ្យប្រព័ន្ធមិនត្រូវបានប្រើប្រាស់ដោយដូចជាការបង្កគ្រោះថ្នាក់លើបុគ្គល។
* **តម្រូវការទិន្នន័យ**។ យល់ពីរបៀបនិងកន្លែងប្រព័ន្ធនឹងប្រើទិន្នន័យ អនុញ្ញាតឲ្យអ្នកវាយតម្លៃចែកចាយទិន្នន័យចំពោះតម្រូវការណាមួយដែលអ្នកត្រូវបានទុកចិត្ត (ឧ. បទបញ្ជា GDPR ឬ HIPPA)។ លើសពីនេះ ពិនិត្យមើលប្រភព ឬបរិមាណទិន្នន័យគ្រប់គ្រាន់សម្រាប់ការបណ្តុះបណ្តាល។
* **សង្ខេបផលប៉ះពាល់**។ ប្រមូលបញ្ជីនៃគ្រោះថ្នាក់ដែលអាចកើតមានពីការប្រើប្រាស់ប្រព័ន្ធ។ តាមដានពេញលេញរយៈម៉ាស៊ីនរៀនប្រើប្រាស់ ដើម្បីពិនិត្យថាបញ្ហាដែលកំណត់បានត្រូវបានកាត់បន្ថយ ឬដោះស្រាយ។
* **គោលបំណងដែលអាចប្រើប្រាស់បាន** សម្រាប់គោលការណ៍មូលដ្ឋានទាំងប្រាំមួយ។ វាយតម្លៃថាគោលបំណងនីមួយៗត្រូវបានបំពេញ និងមានចន្លោះខ្វះខាតទេ។
## ការសំរាមជាមួយ AI ដែលមានការទទួលខុសត្រូវ
ដូចជាការសំរាមកម្មវិធីទូទៅ ការសំរាមប្រព័ន្ធ AI គឺជាដំណើរការត្រូវតែធ្វើការកំណត់និងដោះស្រាយបញ្ហា។ មានកត្តាច្រើនដែលប៉ះពាល់ដល់ម៉ូដែលដែលមិនផ្ដល់លទ្ធផលដូចបានរំពឹង ឬជាមួយភាពទទួលខុសត្រូវ។ តុល្យភាពសមត្ថភាពម៉ូដែលបែបបុរីជាច្រើនគឺជាការបូកសរុបគុណភាពចំនួននៃសមត្ថភាពម៉ូដែល មិនគ្រប់គ្រាន់សម្រាប់វិភាគថាតើម៉ូដែលផ្ទុះខុសបំណងគោលការណ៍ AI ទេ។ លើសពីនេះ ម៉ូដែលម៉ាស៊ីនរៀនគឺជាប្រអប់ខ្មៅដែលពិបាកយល់ពីមូលហេតុនៃលទ្ធផលរបស់វា ឬផ្តល់ការពន្យល់នៅពេលវាធ្វើកំហុស។ នៅបន្ទាប់នៃវគ្គនេះ យើងនឹងរៀនការប្រើប្រព័ន្ធ Dashboard AI ដែលមានភាពទទួលខុសត្រូវ ដើម្បីជួយសំរុងសំរួលប្រព័ន្ធ AI ។ Dashboard នេះផ្តល់ឧបករណ៍ទូលំទូលាយសម្រាប់អ្នកវិទ្យាសាស្រ្តទិន្នន័យ និងអ្នកអភិវឌ្ឍ AI ដើម្បីធ្វើ៖
* **វិភាគកំហុស**។ ដើម្បីកំណត់ចំនួនចែកថ្នាក់កំហុសរបស់ម៉ូដែលដែលអាចប៉ះពាល់ដល់ភាពយុត្តិធម៌ឬភាពទុកចិត្ត។
* **ទិដ្ឋភាពម៉ូដែល**។ ដើម្បីរកឃើញកន្លែងមានភាពមិនស្មើគ្នានៃគុណភាពម៉ូដែលលើដុំទិន្នន័យផ្សេងៗ។
* **វិភាគទិន្នន័យ**។ ដើម្បីយល់ពីចំណែកបែកផ្គរទិន្នន័យ និងកំណត់ភាពលំអៀងណាមួយក្នុងទិន្នន័យដែលអាចនាំឲ្យមានបញ្ហាផ្នែកភាពយុត្តិធម៌ ការរួមបញ្ចូល និងភាពទុកចិត្ត។
* **ការសម្រួលម៉ូដែល**។ ដើម្បីយល់ថាគ្រឿងផ្សំណាដែលមានឥទ្ធិពលលើការព្យាករណ៍របស់ម៉ូដែល។ នេះជួយឲ្យពន្យល់អាកប្បករណ៍របស់ម៉ូដែល ដែលមានសារៈសំខាន់សម្រាប់ភាពច្បាស់លាស់ និងការទទួលខុសត្រូវ។
## 🚀 챌린지
ដើម្បីជៀសវាងការបង្កគ្រោះថ្នាក់ចូលឆាប់នៅដំបូង យើងគួរតែ៖
- មានភាពចម្រុះនៃផ្ទៃខាងក្រោយ និងទស្សនៈរបស់មនុស្សដែលកំពុងធ្វើការលើប្រព័ន្ធ
- វិនិយោគក្នុងសំណុំទិន្នន័យដែលបញ្ចាំងពីភាពចម្រុះក្នុងសង្គមយើង
- អភិវឌ្ឍវិធីសាស្រ្តប្រសើរជាមធ្យោបាយខ្លះក្នុងរយៈពេលវែកំណត់ម៉ាស៊ីនរៀន សម្រាប់រកឃើញ និងកែប្រែ AI ដែលទទួលខុសត្រូវនៅពេលវាកើតឡើង
គិតអំពីស្ថានភាពជាក់ស្តែងដោយមានភាពអត់ទុកចិត្តក្នុងការបង្កើតម៉ូដែល និងការប្រើប្រាស់។ តើមានអ្វីផ្សេងទៀតត្រូវគិតខ្លះ?
## [គន្លឹះសំណួរបន្ទាប់សិក្សា](https://ff-quizzes.netlify.app/en/ml/)
## ការត្រួតពិនិត្យ និងការសិក្សាឯករាជ្យ
នៅមេរៀននេះ អ្នកបានរៀនអំពីមូលដ្ឋានខ្លះៗនៃគំនិតភាពយុត្តិធម៌ និងការអត់យុត្តិធម៌នៅក្នុងការរៀនម៉ាស៊ីន។
មើលវគ្គបណ្ដុះបណ្ដាលនេះដើម្បីជ្រាបជ្រាលជ្រៅជាងនេះអំពីប្រធានបទ៖
- ក្នុងការតាមដាន AI មានទំនួលខុសត្រូវ៖ នាំយកគោលការណ៍ទៅអនុវត្តដោយ Besmira Nushi, Mehrnoosh Sameki និង Amit Sharma
[![Responsible AI Toolbox: An open-source framework for building responsible AI](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: An open-source framework for building responsible AI")
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូ៖ RAI Toolbox: ស៊ុមបើកម៉ូដែលសម្រាប់សាងសង់ AI មានទំនួលខុសត្រូវ ដោយ Besmira Nushi, Mehrnoosh Sameki, និង Amit Sharma
ផងដែរ សូមអាន៖
- មជ្ឈមណ្ឌលធនធាន RAI របស់ Microsoft៖ [Responsible AI Resources Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- ក្រុមស្រាវជ្រាវ FATE របស់ Microsoft៖ [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
ស៊ុម RAI Toolbox៖
- [ឃ្លាំង GitHub របស់ Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox)
អានអំពីឧបករណ៍ Azure Machine Learning ដើម្បីធានាការយុត្តិធម៌៖
- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
## បេសកកម្ម
[ស្វែងយល់អំពី RAI Toolbox](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 @@
# ស្វែងយល់អំពីប្រអប់ឧបករណ៍ 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,125 @@
# បច្ចេកទេសនៃការរៀនម៉ាស៊ីន
ដំណើរការនៃការបង្កើត ប្រើប្រាស់ និងថែទាំម៉ូដែលការរៀនម៉ាស៊ីន និងទិន្នន័យដែលពួកវា ប្រើប្រាស់ គឺជាប្រភេទដំណើរការផ្សេងពីច្រើនដំណើរការអភិវឌ្ឍន៍ផ្សេងទៀត។ ក្នុងមេរៀននេះ យើងនឹងបំបែកអាថ៍កំបាំងនៃដំណើរការនេះ ហើយលើកសញ្ញាផ្នែកបច្ចេកទេសសំខាន់ៗដែលអ្នកត្រូវដឹង។ អ្នកនឹង៖
- យល់ដឹងអំពីដំណើរការដែលគាំទ្រ ក្រោមកម្រិតខ្ពស់នៃការរៀនម៉ាស៊ីន។
- សិក្សាពីគំនិតមូលដ្ឋានដូចជា 'ម៉ូដែល' 'ការព្យាករណ៍' និង 'ទិន្នន័យបណ្តុះបណ្តាល'។
## [សំនួរត្រួតពិនិត្យមុនមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
[![ML for beginners - Techniques of Machine Learning](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML for beginners - Techniques of Machine Learning")
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូខ្លីមួយនៃការប្រតិបត្តិមេរៀននេះ។
## ការណែនាំ
នៅកម្រិតខ្ពស់ សិប្បកម្មនៃការបង្កើតដំណើរការរៀនម៉ាស៊ីន (ML) ត្រូវបានបង្កប់ដោយជំហានច្រើន៖
1. **សម្រេចចិត្តលើសំណួរ**។ ដំណើរការរៀនម៉ាស៊ីនភាគច្រើនចាប់ផ្តើមដើមដោយការសួរសំណួរដែលមិនអាចឆ្លើយតបដោយកម្មវិធីមានលក្ខខណ្ឌឬប្រព័ន្ធច្បាប់មួយ។ សំណួរទាំងនេះភាគច្រើនមានទំនាក់ទំនងនឹងការព្យាករណ៍ដែលផ្អែកលើយោគន័យទិន្នន័យមួយ។
2. **រក្សាទិន្នន័យ និងរៀបចំទិន្នន័យ**។ ដើម្បីឆ្លើយសំណួររបស់អ្នក អ្នកត្រូវការទិន្នន័យ។ គុណភាព និងពេលខ្លះ បរិមាណទិន្នន័យរបស់អ្នកនឹងកំណត់ថាតើអ្នកអាចឆ្លើយសំណួរដើមបានល្អប៉ុណ្ណា។ ការមើលឃើញទិន្នន័យជារូបភាពគឺជាផ្នែកសំខាន់នៃជំហាននេះ។ ជំហាននេះរួមមានការបែងចែកទិន្នន័យទៅក្រុមបណ្តុះបណ្តាល និងតេស្ត ដើម្បីបង្កើតម៉ូដែល។
3. **ជ្រើសរើសវិធីសាស្ត្របណ្តុះបណ្តាល**។ អាស្រ័យលើសំណួររបស់អ្នក និងធម្មជាតិទិន្នន័យ អ្នកត្រូវជ្រើសរើសរបៀបដែលអ្នកចង់បណ្តុះបណ្តាលម៉ូដែល ដើម្បីប្រតិបត្តិរូបភាពទិន្នន័យរបស់អ្នកឱ្យបានល្អបំផុត និងធ្វើការព្យាករណ៍បានត្រឹមត្រូវ។ នេះជាផ្នែកនៃដំណើរការរៀនម៉ាស៊ីនដែលទាមទារជំនាញជាក់លាក់ និងជាផ្នែកច្រើននៃការសាកល្បងយ៉ាងច្រើន។
4. **បណ្តុះបណ្តាលម៉ូដែល**។ ប្រើប្រាស់ទិន្នន័យបណ្តុះបណ្តាលរបស់អ្នក អ្នកនឹងប្រើលេខាធិការកម្មវិធីនានាដើម្បីបណ្តុះបណ្តាលម៉ូដែល ដើម្បីស្គាល់លំនាំក្នុងទិន្នន័យ។ ម៉ូដែលអាចប្រើប្រាស់ទំងន់ផ្ទៃក្នុងដែលអាចប្តូរបាន ដើម្បីផ្តល់តម្លៃល្អជាងសម្រាប់ផ្នែកជាក់លាក់នៃទិន្នន័យ ដោយមានគោលបំណងបង្កើតម៉ូដែលល្អប្រសើរជាងមុន។
5. **វាយតម្លៃម៉ូដែល**។ អ្នកប្រើទិន្នន័យដែលមិនដែលបានមើលមុន (ទិន្នន័យតេស្ត) ពីប្រភពទិន្នន័យដែលបានប្រមូល ដើម្បីមើលម៉ូដែលបញ្ចេញសមិទ្ធផលយ៉ាងដូចម្តេច។
6. **កែតម្រូវប៉ារ៉ាម៉ែត្រ**។ យោងទៅលើសមត្ថភាពរបស់ម៉ូដែល អ្នកអាចធ្វើពន្លឿនដំណើរការឡើងវិញដោយប្រើប៉ារ៉ាម៉ែត្រ ឬអថេរដែលគ្រប់គ្រងអវកាសនៃលេខាធិការ ដែលបានប្រើបណ្តុះបណ្តាលម៉ូដែល។
7. **ព្យាករណ៍**។ ប្រើបញ្ចូលថ្មីដើម្បីសាកល្បងភាពត្រឹមត្រូវរបស់ម៉ូដែលអ្នក។
## តើត្រូវសួរសំណួរអ្វី
កុំព្យូទ័រមានជំនាញពិសេសក្នុងការរកឃើញលំនាំលាក់ក្នុងទិន្នន័យ។ អត្ថប្រយោជន៍នេះមានប្រយោជន៍សម្រាប់អ្នកស្រាវជ្រាវដែលមានសំណួរអំពីដែនដីមួយដែលមិនអាចឆ្លើយបានងាយដោយបង្កើតប្រព័ន្ធកំណត់លក្ខខ័ណ្ឌបែបច្បាប់។ ឧទាហរណ៍ ក្នុងភារកិច្ចអាគុយស្ត្រី ព័ត៌មានវិទ្យាទិន្នន័យថែមតម្រូវអាចបង្កើតច្បាប់ដូចគេច្នៃប្រឌិតអំពីភាពស្លាប់របស់អ្នកបារីប្រៀបធៀបនឹងអ្នកមិនបារី។
យ៉ាងไรก็ตามពេលបញ្ចូលអថេរច្រើនផ្សេងទៀតចូលក្នុងសមីការ ម៉ូដែល ML អាចមានប្រសិទ្ធភាពជាងក្នុងការព្យាករណ៍អត្រាស្លាប់អនាគតដោយផ្អែកលើប្រវត្តិសុខភាពចាស់ៗ។ ឧទាហរណ៍មួយដែលរីករាយជាងគេអាចជាការធ្វើការព្យាករណ៍អាកាសធាតុសម្រាប់ខែមេសា ក្នុងទីតាំងណាមួយដោយផ្អែកលើទិន្នន័យដែលរួមមានទិសដៅអាកាសធាតុ អំពីជាន់ទីតាំង, ផ្លាស់ប្តូរអាកាសធាតុ, ភាពជិតសមុទ្រ, លំនាំឯកសារចរណ៍ខ្យល់ និងច្រើនទៀត។
✅ ស្លាយឯកសារនេះ [slide deck](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) ពីម៉ូដែលអាកាសធាតុផ្ដល់ចំណុចមើលប្រវត្តិវិទ្យាសម្រាប់ការប្រើ ML ក្នុងការវិភាគអាកាសធាតុ។
## ភារកិច្ចមុនការបង្កើត
មុននឹងចាប់ផ្តើមបង្កើតម៉ូដែលរបស់អ្នក មានភារកិច្ចជាច្រើនដែលអ្នកត្រូវបញ្ចប់។ ដើម្បីសាកល្បងសំណួររបស់អ្នក និងបង្កើតសំនឹមយោងតាមការព្យាករណ៍របស់ម៉ូដែល អ្នកត្រូវកំណត់ និងកំណត់រចនាសម្ព័ន្ធធាតុជាច្រើន។
### ទិន្នន័យ
ដើម្បីឆ្លើយសំណួររបស់អ្នកដោយប្រាកដ អ្នកត្រូវការទិន្នន័យច្រើនមានប្រភេទត្រឹមត្រូវ។ មានពីររឿងដែលអ្នកត្រូវធ្វើនៅឆ្នាំនេះ៖
- **ប្រមូលទិន្នន័យ**។ ការចងចាំមេរៀនមុនអំពីកិច្ចភាពយុត្តិធម៌ក្នុងការវិភាគទិន្នន័យ ចូរប្រមូលទិន្នន័យដោយប្រុងប្រយត្ន៍។ ត្រូវយល់ដឹងពីប្រភពទិន្នន័យនេះ ការបង្វិលបម្រែបម្រួលរបស់វា និងចុះបញ្ជីប្រភពដើម។
- **រៀបចំទិន្នន័យ**។ មានជំហានជាច្រើនក្នុងដំណើរការរៀបចំទិន្នន័យ។ អ្នកអាចត្រូវដាក់ទិន្នន័យជាបន្ទាត់ និង normalize វាបើវាមកពីប្រភពផ្សេងៗ។ អ្នកអាចបង្កើនគុណភាព និងបរិមាណទិន្នន័យតាមវិធីផ្សេងៗ ដូចជាការបម្លែងខ្សែអក្សរទៅជាចំនួន (ដូចដែលយើងធ្វើក្នុង [Clustering](../../5-Clustering/1-Visualize/README.md))។ អ្នកអាចបង្កើតទិន្នន័យថ្មីពីមួលដើមបាន (ដូចដែលយើងធ្វើក្នុង [Classification](../../4-Classification/1-Introduction/README.md))។ អ្នកអាចសំអាតនិងកែប្រែទិន្នន័យ (ដូចដែលយើងនឹងធ្វើមុនមេរៀន [Web App](../../3-Web-App/README.md))។ បន្ថែមពីនេះ អ្នកអាចត្រូវ randomized និង shuffle វា តាមវិធីសាស្រ្តបណ្តុះបណ្តាលរបស់អ្នក។
✅ បន្ទាប់ពីប្រមូល និងដំណើរការទិន្នន័យរបស់អ្នក សូមចំណាយពេលមើលថាទម្រង់របស់វា អាចឱ្យអ្នកដោះស្រាយសំណួរត្រូវបានមែនទេ។ អាចជាករណីដែលទិន្នន័យមិនអាចធ្វើបានល្អក្នុងភារកិច្ចរបស់អ្នក ដូចដែលយើងបានរកឃើញក្នុងមេរៀន [Clustering](../../5-Clustering/1-Visualize/README.md)។
### លក្ខណៈពិសេស និងគោលដៅ
[លក្ខណៈពិសេស](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) គឺជាសម្បត្តិនៃទិន្នន័យដែលអាចវាស់បាន។ នៅក្នុងតារាងទិន្នន័យជាច្រើនវាត្រូវបានបង្ហាញជាថ្មើរឈ្មោះជួរដេកដូចជា 'កាលបរិច្ឆេទ' 'ទំហំ' ឬ 'ពណ៌'។ អថេរលក្ខណៈពិសេសរបស់អ្នក ដែលភាគច្រើនតំណាងដោយ `X` នៅក្នុងកូដ តំណាងឱ្យអថេរបញ្ចូលដែលនឹងត្រូវប្រើសម្រាប់បណ្តុះបណ្តាលម៉ូដែល។
គោលដៅគឺជារឿងដែលអ្នកកំពុងព្យាករណ៍។ គោលដៅត្រូវបានតំណាងជាធម្មតា `y` នៅក្នុងកូដ ដើម្បីបង្ហាញចំលើយចំពោះសំណួរដែលអ្នកកំពុងសួរអំពីទិន្នន័យ៖ នៅខែធ្នូ ការពណ៌អំពៅណាដែលមានតម្លៃទាបបំផុត? នៅទីក្រុង San Francisco តំបន់ណាដែលមានតម្លៃអចលនទ្រព្យល្អបំផុត? ពេលខ្លះគោលដៅត្រូវបានហៅថា 'label attribute' ផងដែរ។
### ជ្រើសរើសអថេរលក្ខណៈពិសេសរបស់អ្នក
🎓 **ការជ្រើសរើសលក្ខណៈពិសេស និងការបញ្ចេញលក្ខណៈពិសេស** តើធ្លាប់ដឹងរបៀបជ្រើសអថេរណាមួយក្នុងការបង្កើតម៉ូដែលរបស់អ្នក? ប្រហែលជាអ្នកនឹងត្រូវប្រើវិធីសាស្ត្រជ្រើសរើសលក្ខណៈពិសេស ឬបញ្ចេញលក្ខណៈពិសេស ដើម្បីជ្រើសអថេរដែលត្រឹមត្រូវសម្រាប់ម៉ូដែលមានសមត្ថភាពខ្ពស់បំផុត។ ទាំងពីរបានខុសគ្នា៖ "ការបញ្ចេញលក្ខណៈពិសេសបង្កើតលក្ខណៈថ្មីពីមុខងារ​របស់លក្ខណៈដើម ខណៈពេលការជ្រើសរើសលក្ខណៈពិសេសបង្វិលបញ្ចេញជាសំណុំពីលក្ខណៈសញ្ញា" ([ប្រភព](https://wikipedia.org/wiki/Feature_selection))
### មើលឃើញទិន្នន័យរបស់អ្នក
ផ្នែកសំខាន់មួយនៃឧបករណ៍អ្នកវិទ្យាសាស្ត្រទិន្នន័យគឺមានសមត្ថភាពក្នុងការមើលឃើញទិន្នន័យ ដោយប្រើបណ្ណាល័យល្អៗជាច្រើនដូចជា Seaborn ឬ MatPlotLib។ ការតំណាងទិន្នន័យជារូបភាព អាចអនុញ្ញាតឱ្យអ្នករកឃើញទំនាក់ទំនងលាក់ៗដែលអាចប្រើប្រាស់បាន។ ការមើលឃើញរបស់អ្នកអាចជួយរកឃើញការបង្វិលបម្រែបម្រួល ឬទិន្នន័យមិនត្រូវតម្រូវ (ដូចដែលយើងរកឃើញក្នុង [Classification](../../4-Classification/2-Classifiers-1/README.md))។
### បែងចែកឈុតទិន្នន័យរបស់អ្នក
មុនបណ្តុះបណ្តាល អ្នកត្រូវបែងចែកឈុតទិន្នន័យទៅជាផ្នែកពីរឬច្រើនដែលមានទំហំមិនស្មើគ្នា តែក៏តំណាងឱ្យទិន្នន័យបានល្អ។
- **បណ្តុះបណ្តាល**។ ផ្នែកនេះនៃឈុតទិន្នន័យត្រូវបានប្រើសម្រាប់បណ្តុះបណ្តាលម៉ូដែល។ ជាឈុតធំជាងគេនៃឈុតទិន្នន័យដើម។
- **តេស្ត**។ ឈុតទិន្នន័យតេស្តគឺជាក្រុមទិន្នន័យឯករាជ្យ ដែលភាគច្រើនបានប្រមូលពីទិន្នន័យដើម ត្រូវបានប្រើប្រាស់សម្រាប់ផ្ទៀងផ្ទាត់សមត្ថភាពម៉ូដែលដែលបានបង្កើត។
- **ផ្ទៀងផ្ទាត់**។ ឈុតផ្ទៀងផ្ទាត់គឺជាក្រុមតូចជាង នៃគំរូឯករាជ្យ ដែលអ្នកប្រើដើម្បីកែតម្រូវអាជ្ញាប័ណ្ណ hyperparameters ឬរចនាសម្ព័ន្ធម៉ូដែល ដើម្បីធ្វើឱ្យម៉ូដែលកាន់តែប្រសើរ។ អាស្រ័យទៅលើទំហំទិន្នន័យ និងសំណួររបស់អ្នក អ្នកអាចមិនត្រូវការបង្កើតឈុតទីបីនេះទេ (ដូចដែលយើងកត់សម្គាល់ក្នុង [ការព្យាករណ៍លំដាប់ពេលវេលា](../../7-TimeSeries/1-Introduction/README.md))។
## ការបង្កើតម៉ូដែល
ប្រើអថេរគំរប់បណ្តុះបណ្តាលរបស់អ្នក គោលបំណងរបស់អ្នកគឺបង្កើតម៉ូដែល ឬតំណាងស្ថិតិរបស់ទិន្នន័យ ដោយប្រើលេខាធិការកម្មវិធីនានាដើម្បី **បណ្តុះបណ្តាល** វា។ ការបណ្តុះបណ្តាលម៉ូដែលអនុញ្ញាតឱ្យវាត្រូវបានបង្ហាញទៅកាន់ទិន្នន័យ និងធ្វើការទាយពីលំនាំដែលវារកឃើញ បញ្ជាក់ និងទទួលយកឬបដិសេធ។
### សម្រេចចិត្តលើវិធីសាស្ត្របណ្តុះបណ្តាល
អាស្រ័យលើសំណួរ និងធម្មជាតិនៃទិន្នន័យ អ្នកនឹងជ្រើសរើសវិធីសាស្ត្រមួយសម្រាប់បណ្តុះបណ្តាលវា។ ដំណើរឆ្លងកាត់ [ឯកសាររបស់ Scikit-learn](https://scikit-learn.org/stable/user_guide.html) - ដែលយើងប្រើនៅក្នុងវគ្គសិក្សានេះ - អ្នកអាចស្វែងយល់ពីវិធីជាច្រើនក្នុងការបណ្តុះបណ្តាលម៉ូដែល។ អាស្រ័យលើបទពិសោធន៍របស់អ្នក អ្នកអាចត្រូវមានការសាកល្បងវិធីផ្សេងៗជាច្រើន ដោយករណីជាក់លាក់ក្រុមអ្នកវិទ្យាសាស្ត្រទិន្នន័យវាយតម្លៃសមត្ថភាពម៉ូដែល ដោយផ្តល់ទិន្នន័យមិនដែលបានមើល មើលភាពត្រឹមត្រូវ ការបង្វិលបម្រែបម្រួល និងបញ្ហាគុណភាពផ្សេងទៀត ហើយជ្រើសរើសវិធីសាស្ត្របណ្តុះបណ្តាលសមរម្យបំផុតសម្រាប់ភារកិច្ច។
### បណ្តុះបណ្តាលម៉ូដែល
ជាប់ជាមួយទិន្នន័យបណ្តុះបណ្តាលរបស់អ្នក អ្នកបានរួចរាល់សម្រាប់ 'fit' វា ដើម្បីបង្កើតម៉ូដែល។ អ្នកនឹងសង្កេតឃើញថាក្នុងបណ្ណាល័យ ML ជាច្រើន អ្នកនឹងឃើញកូដ 'model.fit' - នៅពេលនេះ អ្នកផ្ញើរអថេរលក្ខណៈពិសេសជាអារេនៃតម្លៃ (ភាគច្រើនគឺ 'X') និងអថេរគោលដៅ (ភាគច្រើន 'y')។
### វាយតម្លៃម៉ូដែល
ពេលដំណើរការបណ្តុះបណ្តាលបានបញ្ចប់ (វាអាចយកពេលជាច្រើន iteration ឬ 'epoch' ដើម្បីបណ្តុះម៉ូដែលធំមួយ) អ្នកអាចវាយតម្លៃគុណភាពម៉ូដែលដោយប្រើទិន្នន័យតេស្ត ដើម្បីវាស់សមត្ថភាពវា។ ទិន្នន័យនេះគឺជាផ្នែកតូចមួយនៃទិន្នន័យដើម ដែលម៉ូដែលមិនដែលវិភាគមុន។ អ្នកអាចបោះពុម្ពតារាងស្ថិតិអំពីគុណភាពម៉ូដែលរបស់អ្នក។
🎓 **ការផ្គុំម៉ូដែល**
នៅបរិបទនៃការរៀនម៉ាស៊ីន ការផ្គុំម៉ូដែលមានន័យថា ភាពត្រឹមត្រូវនៃមុខងាររបស់ម៉ូដែល ពេលវា​ព្យាយាមវិភាជន៍ទិន្នន័យដែលវាមិនស្គាល់។
🎓 **Underfitting** និង **overfitting** ជាបញ្ហាទូទៅដែលធ្វើឲ្យគុណភាពម៉ូដែលធ្លាក់ចុះ នោះហើយម៉ូដែលត្រូវបានផ្គុំបានមិនល្អគ្រប់គ្រាន់ ឬល្អពេក។ វានាំឲ្យម៉ូដែលប៉ាន់ប្រមាណពីទិន្នន័យបណ្តុះបណ្តាលបានយ៉ាងតិតទៅ ឬលំបាកពេកក្នុងការភ្ជាប់ជាមួយទិន្នន័យ។ ម៉ូដែល overfit នឹងព្យាករណ៍ទិន្នន័យបណ្តុះបណ្តាលបានល្អពេក ពីព្រោះវាបានរៀនលម្អិតនិងសំឡេងរំខានក្នុងទិន្នន័យយ៉ាងល្អ។ ម៉ូដែល underfit គឺមិនត្រឹមត្រូវ ពីព្រោះវាមិនអាចវិភាគទិន្នន័យបណ្តុះបណ្តាលឬទិន្នន័យមិនដែលបានមើលបានយ៉ាងត្រឹមត្រូវទេ។
![overfitting model](../../../../translated_images/km/overfitting.1c132d92bfd93cb6.webp)
> រូបតំណាងដោយ [Jen Looper](https://twitter.com/jenlooper)
## ការកែសម្រួលប៉ារ៉ាម៉ែត្រ
នៅពេលដែលការបណ្តុះបណ្តាលដំបូងបានបញ្ចប់ ការសង្កេតគុណភាពម៉ូដែល និងពិចារណាកែលម្អវា ដោយកែសម្រួល 'hyperparameters' របស់វា។ អានបន្ថែមអំពីដំណើរការនេះ [ក្នុងឯកសារ](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott)។
## ការព្យាករណ៍
នេះគឺជាពេលវេលាដែលអ្នកអាចប្រើទិន្នន័យថ្មីទាំងស្រុង ដើម្បីសាកល្បងភាពត្រឹមត្រូវនៃម៉ូដែល។ ក្នុងបរិបទ ML 'បច្ចេកប្រតិបត្តិន៍' ដែលអ្នកកំពុងបង្កើតទ្រព្យសម្បត្តិនៅលើបណ្ដាញ ដើម្បីប្រើម៉ូដែលក្នុងផលិតកម្ម វាអាចមានលទ្ធភាពបង្រួមទិន្នន័យអ្នកប្រើ (ការចុចប៊ូតុង ឧទាហរណ៍) ដើម្បីកំណត់អថេរមួយ ហើយផ្ញើវាទៅម៉ូដែលសម្រាប់ការបកស្រាយ ឬវាយតម្លៃ។
នៅក្នុងមេរៀនទាំងនេះ អ្នកនឹងស្វែងយល់ពីរបៀបប្រើជំហានទាំងនេះ ដើម្បីរៀបចំ បង្កើត សាកល្បង វាយតម្លៃ និងព្យាករណ៍ — ជាការប្រតិបត្តិរបស់អ្នកវិទ្យាសាស្ត្រទិន្នន័យ និងពាណិជ្ជកម្មបន្ថែម ជាពេលដែលអ្នកបន្តផ្លូវទៅរកជំនាញ ML full stack
---
## 🚀ការប្រកួតប្រជែង
គូរជាតារាងបង្ហាញនៃជំហានរបស់អ្នកអនុវត្ត ML។ តើអ្នកឃើញខ្លួននៅកន្លែងណាក្នុងដំណើរការ? តើអ្នកគិតថាអ្នកនឹងមានការលំបាកនៅពេលណា? តើអ្វីដែលមើលទៅងាយស្រួលសម្រាប់អ្នក?
## [សំនួរត្រួតពិនិត្យបន្ទាប់មេរៀន](https://ff-quizzes.netlify.app/en/ml/)
## ទិដ្ឋភាពវិលត្រឡប់ & ការសិក្សាឯករាជ្យ
ស្វែងរកនៅលើអ៊ីនធឺណិតសម្រាប់សម្ភាសន៍ជាមួយអ្នកវិទ្យាសាស្ត្រទិន្នន័យដែលពិភាក្សាអំពីការងារប្រចាំថ្ងៃរបស់ពួកគេ។ នេះគឺជា [មួយឯកសារ](https://www.youtube.com/watch?v=Z3IjgbbCEfs)។
## កិច្ចការផ្ទះ
[សម្ភាសអ្នកវិទ្យាសាស្ត្រទិន្នន័យ](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 @@
# សម្ភាសន៍អ្នកវិទ្យាសាស្ត្រទិន្នន័យ
## សេចក្តីណែនាំ
នៅក្នុងក្រុមហ៊ុនរបស់អ្នក ក្នុងក្រុមអ្នកប្រើ ឬរវាងមិត្តភក្តិ ឬសិស្សានុសិស្សរបស់អ្នក សូមនិយាយជាមួយនរណាម្នាក់ដែលបំពេញការងារជាអ្នកវិទ្យាសាស្ត្រទិន្នន័យជាមុខរបរ។ សរសេរឯកសារសេចក្តីយោងខ្លីមួយ (៥០០ ពាក្យ) ស្តីអំពីការងារប្រចាំថ្ងៃរបស់ពួកគេ។ តើពួកគេជាអ្នកជំនាញ ឬធ្វើការជា '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 ជាមួយគ្នា!
![globe](../../../translated_images/km/globe.59f26379ceb40428.webp)
> រូបថតដោយ <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 សម្រាប់គំរូប្រូក្រេសស្យុង
![សង្ខេបអំពីប្រូក្រេសស្យុងនៅក្នុងស្គេតណូត](../../../../translated_images/km/ml-regression.4e4f70e3b3ed446e.webp)
> ស្គេតណូតដោយ [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://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](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)
>
> [![រៀបចំ Python ជាមួយ Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](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`
សៀវភៅកំណត់គឺជាបរិយាកាសអន្តរកម្មដែលអនុញ្ញាតឲ្យអ្នកអភិវឌ្ឍទាំងការសរសេរកូដ និងបន្ថែមកំណត់ចំណាំនិងសរសេរឯកសារជារង្វង់ខាងកូដ ដែលអាចមានប្រយោជន៍ចំពោះគម្រោងអត្រា​ឬស្រាវជ្រាវ។
[![ម៉ាស៊ីនរៀនសម្រាប់អ្នកចាប់ផ្ដើម - រៀបចំ Jupyter Notebooks ដើម្បីចាប់ផ្ដើមបង្កើតគំរូប្រូក្រេសស្យុង](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](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
```
![VS Code ជាមួយសៀវភៅកំណត់បើក](../../../../translated_images/km/notebook.4a3ee31f396b8832.webp)
អ្នកអាចបញ្ចូលកូដរបស់អ្នកជាមួយមតិយោបល់ ដើម្បីចុះផ្សាយឯកសារសៀវភៅកំណត់។
✅ គិតមួយភ្លែតពីបរិយាកាសការងាររបស់អ្នកអភិវឌ្ឍគេហទំព័រនិងអ្នកវិទ្យាសាស្ត្រទិន្នន័យមានភាពខុសគ្នា ឬដូចគ្នានៅខាងណា។
## ចាប់ផ្ដើម និង រត់ជាមួយ 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។
[![ម៉ាស៊ីនរៀនសម្រាប់អ្នកចាប់ផ្ដើម - គម្រោងប្រូក្រេសស្យុងខ្សែបន្ទាត់ដំបូងរបស់អ្នកនៅក្នុង Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](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()
```
![scatterplot បង្ហាញចំណុចទិន្នន័យជុំវិញជំងឺទឹកនោមផ្អាស់](../../../../translated_images/km/scatterplot.ad8b356bcbb33be6.webp)
✅ សូមគិតកន្លែងអ្វីកំពុងកើតឡើងនៅទីនេះ។ ខ្សែ​ត្រង់មួយកំពុងរត់កាត់តាមចំណុចតូចៗជាច្រើននៃទិន្នន័យ ប៉ុន្តែវាកំពុងធ្វើអ្វីពិតប្រាកដមែនទេ? តើអ្នកអាចឃើញយ៉ាងដូចម្តេចថា តើអ្នកគួរតែប្រើខ្សែនេះដើម្បីទាយថាតើចំណុចទិន្នន័យថ្មីមួយដែលមិនធ្លាប់ឃើញអាចផ្គូផ្គងនៅឯណាទៅទាក់ទងនឹងអ័ក្ស 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,449 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_1-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# បង្កើតម៉ូដែលរេក្រេស្សិន៖ ចាប់ផ្តើមជាមួយ R និង Tidymodels សម្រាប់ម៉ូដែលរេក្រេស្សិន\n"
],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## ការណែនាំអំពីការត្រួតពិនិត្យ - មេរៀន ១\n",
"\n",
"#### យកវាទៅក្នុងទិសដៅ\n",
"\n",
"✅ មានប្រភេទវិធីសាស្រ្តត្រួតពិនិត្យជាច្រើន ហើយការជ្រើសរើសរបស់អ្នកអាស្រ័យលើចម្លើយដែលអ្នកកំពុងស្វែងរក។ ប្រសិនបើអ្នកចង់ទាយទុកកម្ពស់ប្រហែលសម្រាប់មនុស្សម្នាក់មានអាយុជាក់លាក់ អ្នកនឹងប្រើ `linear regression` ពីព្រោះអ្នកកំពុងស្វែងរក **តម្លៃលេខ**។ ប្រសិនបើអ្នកមានចំណាប់អារម្មណ៍ក្នុងការរកមើលថាតើប្រភេទម្ហូបមួយគួរត្រូវបានគិតថាជា វេហ្គាន់ ឬអត់ អ្នកកំពុងស្វែងរក **ការបែងចែកប្រភេទ** ដូច្នេះអ្នកនឹងប្រើ `logistic regression`។ អ្នកនឹងរៀនបន្ថែមអំពី logistic regression បន្ទាប់។ សូមគិតបន្តិចអំពីសំណួរខ្លះៗដែលអ្នកអាចសួរពីទិន្នន័យ ហើយវិធីសាស្រ្តណាមួយនៃវិធីเหล่านี้ដែលអាចសមរម្យជាងគេ។\n",
"\n",
"នៅក្នុងផ្នែកនេះ អ្នកនឹងធ្វើការជាមួយ [ឌាតាសេតតូចមួយអំពីជំងឺទឹកនោមផ្អែម](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html)។ សូមនឹកស្រមៃថា អ្នកចង់សាកល្បងការព្យាបាលសម្រាប់អ្នកជំងឺទឹកនោមផ្អែម។ ម៉ាស៊ីនរៀនអាចជួយអ្នកកំណត់ថា អ្នកជំងឺណាដែលនឹងឆ្លើយតបល្អជាងចំពោះការព្យាបាល ដោយផ្អែកលើការបញ្ចូលរួមនៃអថេរពីរបៀបផ្សេងៗ។ តែម៉ូដែលត្រួតពិនិត្យមានតំរូវការសាមញ្ញមួយ កាលណាត្រូវបានបង្ហាញជារូបភាព អាចបង្ហាញព័ត៌មានអំពីអថេរពីរដែលអាចជួយអ្នករៀបចំបទពិសោធន៍គ្លីនិកសាកល្បងទ្រឹស្តី។\n",
"\n",
"ហេតុនេះហើយបានជាអ្នកចាប់ផ្តើមការងារនេះបាន! \n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/encouRage.e75d5fe0367fb913.webp\"\n",
" width=\"630\"/>\n",
" <figcaption>ស្នាដៃដោយ @allison_horst</figcaption>\n",
"\n",
"<!--![Artwork by \\@allison_horst](../../../../../../translated_images/km/encouRage.e75d5fe0367fb913.webp)<br>Artwork by @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. ការផ្ទុកឧបករណ៍របស់យើងឡើង\n",
"\n",
"សម្រាប់ភារកិច្ចនេះ យើងត្រូវការបណ្ណាល័យដូចខាងក្រោម៖\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) គឺជា [កញ្ចប់បណ្ណាល័យ R](https://www.tidyverse.org/packages) ដែលរចនាឡើងដើម្បីធ្វើឱ្យការប្រើប្រាស់វិទ្យាសាស្ត្រទិន្នន័យមានភាពរហ័ស ប្រសើរឡើង និងគួរឱ្យសប្បាយចិត្ត!\n",
"\n",
"- `tidymodels`: ក្របខណ្ឌ [tidymodels](https://www.tidymodels.org/) គឺជា [កញ្ចប់បណ្ណាល័យ](https://www.tidymodels.org/packages/) សម្រាប់ការគំរូ និងការសិក្សាម៉ាស៊ីន។\n",
"\n",
"អ្នកអាចដំឡើងវាដូចជា៖\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"ស្គ្រីបខាងក្រោមនេះត្រួតពិនិត្យថា តើអ្នកមានបណ្ណាល័យទាំងនេះដើម្បីបញ្ចប់មូឌុលនេះរួចថែមទៀត ហើយតំឡើងសម្រាប់អ្នក ប្រសិនបើមានខាតខាត។\n"
],
"metadata": {
"id": "FIo2YhO26wI9"
}
},
{
"cell_type": "code",
"execution_count": 2,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse, tidymodels)"
],
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Loading required package: pacman\n",
"\n"
]
}
],
"metadata": {
"id": "cIA9fz9v7Dss",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
}
},
{
"cell_type": "markdown",
"source": [
"ឥឡូវនេះ យើងសូមផ្ទុកបណ្ណាល័យអស្ចារ្យទាំងនេះ ហើយធ្វើឲ្យវាប្រើបានក្នុងសម័យ R បច្ចុប្បន្នរបស់យើង។ (នេះគ្រាន់តែសម្រាប់ការបង្ហាញតែប៉ុណ្ណោះ `pacman::p_load()` បានធ្វើរួចហើយសម្រាប់អ្នក)\n"
],
"metadata": {
"id": "gpO_P_6f9WUG"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# load the core Tidyverse packages\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# load the core Tidymodels packages\r\n",
"library(tidymodels)\r\n"
],
"outputs": [],
"metadata": {
"id": "NLMycgG-9ezO"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. សំណុំទិន្នន័យជំងឺឆ្លងឈ сахар\n",
"\n",
"ក្នុងការអនុវត្តនេះ យើងនឹងបង្ហាញជំនាញការស្រង់ទិន្នន័យរបស់យើងដោយធ្វើការព្យាករណ៍លើសំណុំទិន្នន័យជំងឺឆ្លងឈ сахар។ [សំណុំទិន្នន័យជំងឺឆ្លងឈ сахар](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) មាន `៤៤២ គំរូ` នៃទិន្នន័យជុំវិញជំងឺឆ្លងឈ сахар ដែលមានអថេរព្យាករណ៍លក្ខណៈ ១០ គឺ `អាយុ`, `ភេទ`, `រូបមាត្រមាឌរាងកាយ`, `សម្ពាធឈាមមធ្យម`, និង `ការវាស់ម៉ាស៊ីនសាំមេរ៉ា ៦ នាក់` ជាមួយអថេរវិលតប `y`៖ ជាអនុមាត្រលេខវាស់វែងនៃការរីកចម្រើនជំងឺមួយឆ្នាំបន្ទាប់ពីកំណត់ចំណុចដើម។\n",
"\n",
"|ចំនួនការសង្កេត|៤៤២|\n",
"|-----------------|:---|\n",
"|ចំនួនអថេរព្យាករណ៍|ជួរដេកទី ១០ ដំបូងគឺអថេរព្យាករណ៍ជាលេខ|\n",
"|លទ្ធផល/គោលដៅ|ជួរដេកទី ១១ ជាអនុមាត្រាលេខវាស់វែងនៃការរីកចម្រើនជំងឺមួយឆ្នាំបន្ទាប់ពីកំណត់ចំណុចដើម|\n",
"|ព័ត៌មានអថេរព្យាករណ៍|- អាយុជាឆ្នាំ\n",
"||- ភេទ\n",
"||- bmi មាត្ររូបធាតុរាងកាយ\n",
"||- bp សម្ពាធឈាមមធ្យម\n",
"||- s1 tc, គ្លេសតេរាលសេរ៉ូមសរុប\n",
"||- s2 ldl, លីពីតភាគតិច\n",
"||- s3 hdl, លីពីតភាគខ្ពស់\n",
"||- s4 tch, គ្លេសតេរាលសរុប / HDL\n",
"||- s5 ltg, ប្រហែលជាលក់នៃកម្រិតថ្រីក្លីសេរូម\n",
"||- s6 glu, កម្រិតស្ករក្នុងឈាម|\n",
"\n",
"\n",
"\n",
"\n",
"> 🎓 ចងចាំថា នេះគឺជាការរៀនដោយមានការត្រួតពិនិត្យ ហើយយើងត្រូវការគោលដៅឈ្មោះ 'y'។\n",
"\n",
"មុនពេលអ្នកអាចដោះស្រាយទិន្នន័យជាមួយ R បាន អ្នកត្រូវនាំចូលទិន្នន័យទៅក្នុងអង្គច័ន្ទ R ឬ បង្កើតការតភ្ជាប់ទៅកាន់ទិន្នន័យដែល R អាចប្រើដើម្បីចូលប្រើទិន្នន័យពីចម្ងាយ។\n",
"\n",
"> កញ្ចប់ [readr](https://readr.tidyverse.org/), ដែលជាផ្នែកមួយនៃ Tidyverse, ផ្ដល់នូវវិធីរហ័ស និងផ friendliness បានសម្រាប់អានទិន្នន័យរាងគូទ័រចូលទៅក្នុង R។\n",
"\n",
"ឥលូវនេះ នាំចូលសំណុំទិន្នន័យជំងឺឆ្លងឈ сахар ដែលផ្ដល់នៅក្នុង URL ផ្ដើមនេះ៖ <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"បន្ថែមពីនេះ យើងនឹង​ធ្វើតេស្តសុវត្ថិភាពជាមួយទិន្នន័យរបស់យើងដោយប្រើ `glimpse()` ហើយបង្ហាញជួរដេកដំបូង ៥ ជួរដោយប្រើ `slice()`។\n",
"\n",
"មុនពេលទៅកាន់ជំហានបន្ទាប់ សូមណែនាំអ្វីដែលអ្នកនឹងជួបញឹកញាប់ក្នុងកូដ R 🥁🥁: អុបរ៉ាត័រពីប `%>%`\n",
"\n",
"អុបរ៉ាត័រពីប (`%>%`) បំពេញសកម្មភាពជាដំណាក់កាលតាមលំដាប់ ដោយផ្ដល់វត្ថុទៅមុខក្នុងមុខងារឬវេយ្យាករណ៍ហៅ។ អ្នកអាចគិតអុបរ៉ាត័រពីបថា “បន្ទាប់មក” ក្នុងកូដរបស់អ្នក។\n"
],
"metadata": {
"id": "KM6iXLH996Cl"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import the data set\r\n",
"diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
"\r\n",
"\r\n",
"# Get a glimpse and dimensions of the data\r\n",
"glimpse(diabetes)\r\n",
"\r\n",
"\r\n",
"# Select the first 5 rows of the data\r\n",
"diabetes %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "Z1geAMhM-bSP"
}
},
{
"cell_type": "markdown",
"source": [
"`glimpse()` បង្ហាញឲ្យយើងឃើញថា​ទិន្នន័យនេះមានជួរដេក ៤៤២ និងជួរឈរ ១១ ដែលជួរឈរទាំងអស់មានប្រភេទទិន្នន័យជា `double`\n",
"\n",
"<br>\n",
"\n",
"\n",
"\n",
"> glimpse() និង slice() គឺជាអនុគមន៍នៅក្នុង [`dplyr`](https://dplyr.tidyverse.org/)។ Dplyr ជាផ្នែកមួយនៃ Tidyverse គឺជាវិប្បដិសារក្នុងការដំណើរការទិន្នន័យ ដែលផ្តល់នូវសំណុំគំរូពាក្យកិរិយាដែលមានភាពស្របគ្នា ដែលជួយអ្នកដោះស្រាយបញ្ហាដំណើរការទិន្នន័យទូទៅបំផុត\n",
"\n",
"<br>\n",
"\n",
"ឥឡូវពេលដែលយើងមានទិន្នន័យហើយ មកកាន់ការជ្រើសរើសមួយលក្ខណៈ (`bmi`) សម្រាប់អនុវត្តការហាត់នេះ។ នេះក៏ត្រូវការឲ្យយើងជ្រើសរើសជួរឈរដែលចង់បាន។ តើយើងធ្វើបែបណា?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) អនុញ្ញាតឲ្យយើង *ជ្រើសរើស* (ហើយញឹកញាប់អាចប្តូរឈ្មោះ) ជួរឈរនៅក្នុងសំណុំទិន្នន័យមួយ។\n"
],
"metadata": {
"id": "UwjVT1Hz-c3Z"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select predictor feature `bmi` and outcome `y`\r\n",
"diabetes_select <- diabetes %>% \r\n",
" select(c(bmi, y))\r\n",
"\r\n",
"# Print the first 5 rows\r\n",
"diabetes_select %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "RDY1oAKI-m80"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. ទិន្នន័យសម្រាប់បណ្តុះបណ្តាល និងសាកល្បង\n",
"\n",
"វាជាវិធានការដែលត្រូវអនុវត្តនៅក្នុងការរៀនតាមការត្រួតពិនិត្យ ដើម្បី *បំបែក* ទិន្នន័យចេញជាសំណុំនៃពីរផ្នែក; សំណុំនៃទិន្នន័យ (ដែលជាទូទៅធំជាង) សម្រាប់បង្រៀនម៉ូដែល ហើយសំណុំនៃទិន្នន័យតូច \"hold-back\" សម្រាប់មើលថា ម៉ូដែលបានបំពេញការងារយ៉ាងដូចម្តេច។\n",
"\n",
"ឥឡូវនេះពេលយើងមានទិន្នន័យរួចរាល់ អ្នកអាចមើលថាតើម៉ាស៊ីនអាចជួយកំណត់ការបំបែកត្រឹមត្រូវរវាងលេខក្នុងឧទាហរណ៍ទិន្នន័យនេះបានទេ។ យើងអាចប្រើកញ្ចប់ [rsample](https://tidymodels.github.io/rsample/) ដែលជាមួយនឹងស៊ុមរ៉ែធមូល Tidymodels ដើម្បីបង្កើតអតិបរមាមួយដែលមានព្រឹត្តិបត្រស្តីពី *វិធី* បំបែកទិន្នន័យ ហើយបន្ទាប់មកប្រើមុខងារ rsample ច្រើនទៀតពីរមុខងារដើម្បីទាញយកសំណុំទិន្នន័យបណ្តុះបណ្តាល និងសាកល្បងដែលបានបង្កើត៖\n"
],
"metadata": {
"id": "SDk668xK-tc3"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\r\n",
"# Split 67% of the data for training and the rest for tesing\r\n",
"diabetes_split <- diabetes_select %>% \r\n",
" initial_split(prop = 0.67)\r\n",
"\r\n",
"# Extract the resulting train and test sets\r\n",
"diabetes_train <- training(diabetes_split)\r\n",
"diabetes_test <- testing(diabetes_split)\r\n",
"\r\n",
"# Print the first 3 rows of the training set\r\n",
"diabetes_train %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "EqtHx129-1h-"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. បណ្តុះបណ្តាលគំរូសមីការស្រមោលជាមួយ Tidymodels\n",
"\n",
"ឥឡូវនេះយើងមានស្រេចក្នុងការបណ្តុះបណ្តាលគំរូរបស់យើង!\n",
"\n",
"ក្នុង Tidymodels អ្នកកំណត់គំរូដោយប្រើ `parsnip()` ដោយបញ្ជាក់បីកន្លែង៖\n",
"\n",
"- ប្រភេទគំរូ **type** ផ្តែកគំរូៗ ដូចជាសមីការស្រមោលបន្ទាត់, សមីការស្រមោលឡូជីស្ទិច, គំរូដើមសម្រេចចិត្ត និងផ្សេងៗទៀត។\n",
"\n",
"- របៀបធ្វើដំណើរ **mode** រួមបញ្ចូលជម្រើសទូទៅដូចជា សមីការស្រមោល និង ការបែងចែកចំណាត់ថ្នាក់; ប្រភេទគំរូមួយចំនួនគាំទ្រតែម្ដងឬទាំងពីរ ខណៈដែលមួយចំនួនមានតែរបៀបធ្វើដំណើរតែមួយ។\n",
"\n",
"- មេកានិចគំរូ **engine** គឺជាឧបករណ៍គណនាសម្រាប់តម្រៀបគំរូ។ ជាញឹកញាប់គឺជាកញ្ចប់ R មួយចំនួន ដូចជា **`\"lm\"`** ឬ **`\"ranger\"`**\n",
"\n",
"ព័ត៌មាននេះត្រូវបានកត់ត្រា​នៅក្នុងការបញ្ជាក់គំរូ ដូច្នេះមកបង្កើតមួយបានហើយ!\n"
],
"metadata": {
"id": "sBOS-XhB-6v7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- \r\n",
" # Type\r\n",
" linear_reg() %>% \r\n",
" # Engine\r\n",
" set_engine(\"lm\") %>% \r\n",
" # Mode\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Print the model specification\r\n",
"lm_spec"
],
"outputs": [],
"metadata": {
"id": "20OwEw20--t3"
}
},
{
"cell_type": "markdown",
"source": [
"បន្ទាប់ពីម៉ូដែលត្រូវបាន *កំណត់* រួចហើយ ម៉ូដែលអាចត្រូវបាន `ពិនិត្យប្រមាណ` ឬ `បណ្តុះបណ្តាល` ដោយប្រើមុខងារ [`fit()`](https://parsnip.tidymodels.org/reference/fit.html) ជាទូទៅប្រើរូបមន្តមួយនិងទិន្នន័យមួយចំនួន។\n",
"\n",
"`y ~ .` មានន័យថាយើងនឹងត្រូវបណ្ដុះ `y` ជាបរិមាណដែលត្រូវព្យាករណ៍/គោលដៅ ដែលពណ៌នាដោយអ្នកដាំនេះរាល់គ្នា ie, `.` (ក្នុងករណីនេះ យើងមានអ្នកដាំតែមួយគត់គឺ `bmi` )\n"
],
"metadata": {
"id": "_oDHs89k_CJj"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>%\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Train a linear regression model\r\n",
"lm_mod <- lm_spec %>% \r\n",
" fit(y ~ ., data = diabetes_train)\r\n",
"\r\n",
"# Print the model\r\n",
"lm_mod"
],
"outputs": [],
"metadata": {
"id": "YlsHqd-q_GJQ"
}
},
{
"cell_type": "markdown",
"source": [
"ពីលទ្ធផលនៃម៉ូឌែល យើងអាចមើលឃើញអនុគមន៍ដែលបានរៀនឃើញនៅពេលបណ្តុះបណ្តាល។ វាតំណឹងអនុគមន៍នៃបន្ទាត់ដែលមានការសម្រួលល្អបំផុតដែលផ្តល់ឱ្យយើងនូវកំហុសសរុបទាបជាងគេទាំងពីរចន្លោះអថេរពិតនិងបានទាយ។\n",
"\n",
"<br>\n",
"\n",
"## 5. ធ្វើការទាយលទ្ធផលលើសំណុំទិន្នន័យតេស្ត\n",
"\n",
"ឥឡូវនេះដែលយើងបានបណ្តុះបណ្តាលម៉ូឌែលមួយរួចហើយ យើងអាចប្រើវាដើម្បីទាយការវិវឌ្ឍជំងឺ y សម្រាប់សំណុំទិន្នន័យតេស្តដោយប្រើ [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html)។ វានឹងត្រូវបានប្រើដើម្បីគូរបន្ទាត់រវាងក្រុមទិន្នន័យ។\n"
],
"metadata": {
"id": "kGZ22RQj_Olu"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\r\n",
"predictions <- lm_mod %>% \r\n",
" predict(new_data = diabetes_test)\r\n",
"\r\n",
"# Print out some of the predictions\r\n",
"predictions %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "nXHbY7M2_aao"
}
},
{
"cell_type": "markdown",
"source": [
"Woohoo! 💃🕺 យើងទើបតែបណ្តុះម៉ូដែលមួយ ហើយប្រើវាធ្វើការព្យាករណ៍!\n",
"\n",
"នៅពេលធ្វើការព្យាករណ៍ ទម្រង់ប្រើប្រាស់របស់ tidymodels គឺតែងតែបង្កើតតារាង tibble/data frame នៃលទ្ធផលដែលមានឈ្មោះជួរឈរប្រក្រតី។ នេះធ្វើឲ្យងាយស្រួលក្នុងការរួមបញ្ចូលទិន្នន័យដើម និងការព្យាករណ៍នៅក្នុងទម្រង់ដែលប្រើប្រាស់បានសម្រាប់ប្រតិបត្តិការបន្តដូចជាការគូររូប។\n",
"\n",
"`dplyr::bind_cols()` ភ្ជាប់ជួរឈរពហុទិន្នន័យបានយ៉ាងមានប្រសិទ្ធភាព។\n"
],
"metadata": {
"id": "R_JstwUY_bIs"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Combine the predictions and the original test set\r\n",
"results <- diabetes_test %>% \r\n",
" bind_cols(predictions)\r\n",
"\r\n",
"\r\n",
"results %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "RybsMJR7_iI8"
}
},
{
"cell_type": "markdown",
"source": [
"## 6. រូបភាពលទ្ធផលម៉ូដែល\n",
"\n",
"ឥឡូវនេះ ពេលវេលាដើម្បីមើលវា secara visual 📈។ យើងនឹងបង្កើតរូបភាព scatter plot របស់តម្លៃ `y` និង `bmi` ទាំងអស់ក្នុងសំណុំតេស្ត បន្ទាប់មកប្រើការព្យាករណ៍ដើម្បីគូរបន្ទាត់នៅកន្លែងដែលសមស្របបំផុត ចន្លោះក្រុមទិន្នន័យនៃម៉ូដែល។\n",
"\n",
"R មានប្រព័ន្ធជាច្រើនសម្រាប់បង្កើតក្រាហ្វិច ប៉ុន្តែ `ggplot2` គឺជាឯកឯកភាពមួយក្នុងចំណោមស្រស់ស្អាត និងចម្រុះបំផុត។ វាអនុញ្ញាតឲ្យអ្នកបង្កើតក្រាហ្វិចដោយ **ប្រមូលផ្តុំធាតុដោយឯករាជ្យ**។\n"
],
"metadata": {
"id": "XJbYbMZW_n_s"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plot\r\n",
"theme_set(theme_light())\r\n",
"# Create a scatter plot\r\n",
"results %>% \r\n",
" ggplot(aes(x = bmi)) +\r\n",
" # Add a scatter plot\r\n",
" geom_point(aes(y = y), size = 1.6) +\r\n",
" # Add a line plot\r\n",
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
],
"outputs": [],
"metadata": {
"id": "R9tYp3VW_sTn"
}
},
{
"cell_type": "markdown",
"source": [
"> ✅ គិតបន្តិចអំពីអ្វីកំពុងកើតឡើងនៅទីនេះ។ ខ្សែស្របមួយកំពុងដំណើរការតាមចំណុចតូចៗជាច្រើន ផ្ទាល់តែវាកំពុងធ្វើអ្វីយ៉ាងដូចម្តេច? តើអ្នកអាចឃើញថាអ្នកគួរត្រូវបានប្រើខ្សែនេះដើម្បីទាកទាយថាចំណុចទិន្នន័យថ្មីមួយដែលមិនទាន់បានឃើញគួរត្រូវតាំងនៅឯណាក្នុងទំនាក់ទំនងជាមួយអ័ក្ស y នៃតារាងនេះដែរឬទេ? ជួយព្យាយាមពន្យល់ជាភាសាអំពីការប្រើប្រាស់ដែលពាក់ព័ន្ធនឹងគំរូនេះ។\n",
"\n",
"សូមអបអរសាទរ អ្នកបានបង្កើតគំរូទំនាក់ទំនងបន្ទាត់ដំបូងរបស់អ្នក បានបង្កើតការទស្សន៍ទាយជាមួយវា ហើយបានបង្ហាញវាលើតារាងមួយ!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការបដិសេធ**៖ \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំសំរាប់ភាពត្រឹមត្រូវ សូមជ្រាបថា ការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬ មិនត្រឹមត្រូវបាន។ ឯកសារដើមជាភាសាមាតុភាគគួរត្រូវបានទទួលស្គាល់ជាដើមប្រភពមានសុពលភាព។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមពិចារណាការបកប្រែដោយអ្នកជំនាញមនុស្ស។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬ ការបំភ្លឺខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,219 @@
# បង្កើតម៉ូដែលរេហ្គ្រេសស្យុងដោយប្រើ Scikit-learn៖ រៀបចំ និងវិចិត្រស័ក្តិទិន្នន័យ
![តារាងវិចិត្រស័ក្តិទិន្នន័យ](../../../../translated_images/km/data-visualization.54e56dded7c1a804.webp)
តារាងវិចិត្រស័ក្តិដោយ [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' និងតម្លៃផ្សេងទៀត។ ទិន្នន័យនេះ ពិតជា មិនស្អាតត្រឹមត្រូវទេ។
[![ML សម្រាប់អ្នកថ្មី - របៀបវិភាគ និងសម្អាតទិន្នន័យ](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](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 មួយ ដោយផ្អែកលើកន្លែងទំនេរដែលមានរវាងវាយដ៏ធំនិងផ្លែគោល។
## វិធីសាស្រ្តវិចិត្រស័ក្តិ
ផ្នែកមួយនៃភារកិច្ចរបស់វិទ្យាសាស្ដ្រ ទិន្នន័យគឺការបង្ហាញពីគុណភាព និងធម្មជាតិនៃទិន្នន័យដែលពួកគេទទួលបាន។ ដើម្បីធ្វើបែបនេះ មិនហ៊ានតែបង្កើតវិចិត្រស័ក្តិស្អាតៗជានិច្ច ឬ អត្រា គន្លង និងក្រាផបាន សម្រាប់បង្ហាញប្រភេទផ្សេងៗនៃទិន្នន័យ។ តាមរយៈនេះ ពួកគេអាចបង្ហាញទំនាក់ទំនង និងកន្លែងខ្វះខាតដែលពិបាកសំរេចដោយការមើលតាមផ្ទាល់។
[![ML សម្រាប់អ្នកថ្មី - របៀបវិចិត្រស័ក្តិនិន្នន័យជាមួយ Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](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()
```
![គំនូស scatterplot បង្ហាញទំនាក់ទំនងតម្លៃទៅខែ](../../../../translated_images/km/scatterplot.b6868f44cbd2051c.webp)
តើនេះជាគំនូសមានប្រយោជន៍ទេ? តើមានអ្វីណាមួយដែលធ្វើឲ្យអ្នកភ្ញាក់ផ្អើលទេ?
វាមិនមានប្រយោជន៍ពិសេសណាស់ទេ ពីព្រោះវា​គ្រាន់តែបង្ហាញទិន្នន័យរបស់អ្នកជាចំនុចច散នៅក្នុងខែណាមួយ។
### ធ្វើឲ្យវាមានប្រយោជន៍
ដើម្បីទទួលបានតារាងបង្ហាញទិន្នន័យដែលមានប្រយោជន៍ អ្នកត្រូវតែផ្ដុំទិន្នន័យមួយរបៀបណាមួយ។ យើងសាកល្បងបង្កើតគំនូសដែលភាគល្អិត y បង្ហាញខែ និងទិន្នន័យបង្ហាញការបែងចែកទិន្នន័យ។
1. បន្ថែមកោសិកាមួយសម្រាប់បង្កើតតារាងជាតារាងប៊ា៖
```python
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")
```
![តារាងប៊ាបង្ហាញទំនាក់ទំនងតម្លៃទៅខែ](../../../../translated_images/km/barchart.a833ea9194346d76.webp)
នេះជាវិចិត្រស័ក្តិទិន្នន័យមានប្រយោជន៍ជាងមុនទេ! វាហាក់ដូចបង្ហាញថាតម្លៃខ្ពស់បំផុតសម្រាប់បាយផ្លែគោលមាននៅខែកញ្ញា និងតុលា។ តើវาตรงតាមការរំពឹងទុករបស់អ្នកទេ? ហេតុអ្វី?
---
## 🚀 ការប្រកួតប្រជែង
ស្វែងយល់អំពីប្រភេទវិចិត្រស័ក្តិផ្សេងៗដែល 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",
"<!--![Artwork by \\@allison_horst](../../../../../../translated_images/km/dplyr_wrangling.f5f99c64fd4580f1.webp)<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",
"<!--![Infographic by Dasani Madipalli](../../../../../../translated_images/km/data-visualization.54e56dded7c1a804.webp){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"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,386 @@
# បង្កើតម៉ូឌែលផ្សារ​ដោយប្រើ Scikit-learn: ផ្សារ​បួន​របៀប
## សម្គាល់​សម្រាប់អ្នកចាប់ផ្ដើម
ការ​ផ្សារ​រៀប​រ៉េ​ឌី​ស្យុងត្រូវបានប្រើនៅពេលដែលយើងចង់ទាយទោល​តម្លៃ **ចំនួន​ស៊ីផ៍** (ឧទាហរណ៍ តម្លៃផ្ទះ, សីតុណ្ហភាព ឬ លក់ចេញ)។ វាដំណើរការដោយស្វែងរករបារភាព​តម្រាស់​មួយ​ដែល​តំណាងឲ្យទំនាក់ទំនង​រវាង​លក្ខណៈបញ្ចូល និងលទ្ធផល​បាន​ល្អ​បំផុត។
​នៅក្នុងមេរៀន​នេះ​យើងផ្តោតលើការយល់ដឹងពីគំនិតមុនពេលស្រាវជ្រាវបច្ចេកវិទ្យាស្រាវជ្រាវផ្សារ​លំដាប់ខ្ពស់បន្ថែមទៀត។
![Linear vs polynomial regression infographic](../../../../translated_images/km/linear-polynomial.5523c7cb6576ccab.webp)
> រូបភាពព័ត៌មានដោយ [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [សំណួរណែនាំមុនមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
> ### [មេរៀននេះមានជាជម្រើសជាភាសា R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### ការណែនាំ
ចំពោះពេលនេះ អ្នកបានសិក្សាដឹងថាផ្សាររៀបរាប់គឺជាអ្វីជាមួយទិន្នន័យគំរូដែលបានប្រមូលពីឧបករណ៍តម្លៃផ្លែផ្អែខោចដែលយើងនឹងប្រើនៅក្នុងមេរៀននេះ។ អ្នកក៏បានធ្វើការមើលឃើញវាតាមរយៈ Matplotlib ផងដែរ។
ឥឡូវនេះ អ្នករួចរាល់ក្នុងការជ្រៀតចូលជ្រាលជ្រៅចំពោះផ្សាររៀបរាប់សម្រាប់ ML។ ខណៈពេលដែលការមើលឃើញឲ្យអ្នកយល់ដឹងពីទិន្នន័យ ព្រះរាជអំណាចពិតប្រាកដរបស់ការសិក្សាម៉ាស៊ីនក្នុងការមានភាពពី _ការបណ្តុះបណ្តាលម៉ូឌែល_។ ម៉ូឌែលត្រូវបានបណ្តុះបណ្តាលលើទិន្នន័យប្រវត្តិសាស្ត្រដើម្បីឆាប់យល់ពីការទាក់ទងរវាងទិន្នន័យ និងអនុញ្ញាតឲ្យអ្នកទាយទោលលទ្ធផលសម្រាប់ទិន្នន័យថ្មី ដែលម៉ូឌែលមិនបានឃើញពីមុន។
នៅក្នុងមេរៀននេះ អ្នកនឹងរៀនបន្ថែមអំពីប្រភេទផ្សាររៀបរាប់ពីរ: _ផ្សាររៀបរាប់រាងតែមួយមូលដ្ឋាន_ និង _ផ្សាររៀបរាប់ពហុបូឡីណូម្យែល_ រួមជាមួយគណិតវិទ្យាផ្នែកខ្លះដែលគាំទ្របច្ចេកទេសទាំងនេះ។ ម៉ូឌែលទាំងនេះនឹងអនុញ្ញាតឲ្យយើងទាយតម្លៃផ្លែផ្អែខោចដោយផ្អែកលើទិន្នន័យបញ្ចូលផ្សេងៗ។
[![ML for beginners - Understanding Linear Regression](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "ML for beginners - Understanding Linear Regression")
> 🎥 ចុចរូបភាពខាងលើសម្រាប់មើលវីដេអូបែបខ្លីអំពីផ្សាររៀបរាប់រាងតែ្មួយមូលដ្ឋាន។
> លើកទូលាយកម្មវិធីសិក្សានេះ យើងគិតថា មានចំណេះដឹងគណិតវិទ្យា​តិចតួច ប៉ុន្តែទាមទារឱ្យមានភាពងាយស្រួលសម្រាប់សិស្សដែលមកពីវិស័យផ្សេងទៀត ដូច្នេះសូមប្រយ័ត្នមានកំណត់សម្គាល់ 🧮 ការហៅចេញ វិចារណាធិការប្រើស្លាកបាច់បិទ និងឧបករណ៍អប់រំផ្សេងៗសម្រាប់ជួយឲ្យយល់។
### លក្ខណ្ឌមុនបច្ចេកទេស
អ្នកគួរតែស្គាល់រចនាសម្ព័ន្ធទិន្នន័យផ្លែផ្អែខោចដែលយើងកំពុងពិនិត្យឥឡូវនេះ។ អ្នកអាចរកបានវាត្រូវបានផ្ទុករួចហើយ និងបានសម្អាតរួចក្នុងឯកសារ _notebook.ipynb_ នៃមេរៀននេះ។ ក្នុងឯកសារ គឺបង្ហាញតម្លៃផ្លែផ្អែខោចប្រចាំមួយកំប៉ិលក្នុងតារាងទិន្នន័យថ្មី។ ដូច្នេះប្រាកដថាអ្នកអាចរត់កំណត់ត្រាតំណាងទាំងនេះនៅក្នុងកណ្តុររបស់ Visual Studio Code។
### ការរៀបចំ
ដើម្បីរំលឹក អ្នកកំពុងផ្ទុកទិន្នន័យនេះដើម្បីសួរចំឡើយពីវា។
- តើពេលណា​ជា​ពេលល្អបំផុតក្នុងការទិញផ្លែផ្អែខោច?
- តើតម្លៃអ្វីដែលខ្ញុំអាចរំពឹងទុកចំពោះប្រអប់ផ្លែផ្អែខោចតូច?
- តើខ្ញុំគួរទិញវាក្នុងធុងក៍មួយពាក់កណ្តាលកំប៉ិល ឬដោយប្រអប់ 1 1/9 កំប៉ិល?
អើយ! យើងសូមលត់ចូលទៅក្នុងទិន្នន័យនេះបន្ថែម។
ក្នុងមេរៀនមុន អ្នកបានបង្កើតតារាងតំណាង Pandas ហើយផ្ទុកវានៅជុំវិញផ្នែកមួយនៃឯកសារដើម ដោយប្រើការតម្រឹមតម្លៃផ្ទាល់មួយកំប៉ិល។ ប៉ុន្តែបច្ចុប្បន្ននេះ អ្នកអាចប្រមូលបានត្រឹមតែប្រហែល ៤០០ចំណុចទិន្នន័យហើយត្រឹមតែសម្រាប់ខែរដូវស្លឹកឈើជ្រុះតែប៉ុណ្ណោះ។
មើលទិន្នន័យដែលបានផ្ទុករួចជាមុនក្នុងកំណត់ត្រារួមនៅក្នុងមេរៀននេះ។ ទិន្នន័យត្រូវបានផ្ទុករួចហើយ និងបានចុះតំណាងតាមរយៈ scatterplot ដើម្បីបង្ហាញទិន្នន័យតាមខែ។ ប្រហែលជាយើងអាចយកព័ត៌មានជាក់លាក់បន្ថែមអំពីលក្ខណៈទិន្នន័យដោយសម្អាតវាបន្ថែមទៀត។
## សន្ទស្សន៍ផ្សារ​រៀបរាប់រាងតែមួយ
ដូចដែលអ្នកបានរៀនក្នុងមេរៀន១ គោលបំណងនៃសមាហរណកម្ម Linear Regression គឺដើម្បីគូសបន្ទាត់មួយដែល:
- **បង្ហាញទំនាក់ទំនងអថេរ**។ បង្ហាញទំនាក់ទំនងរវាងអថេរ
- **ធ្វើការទាយទោល**។ ធ្វើការទាយទោលយ៉ាងត្រឹមត្រូវថាចំណុចទិន្នន័យថ្មីនឹងស្ថិតនៅកន្លែងណាជិតបន្ទាត់នោះ។
សិក្សារៀបរាប់ប្រើមធ្យោបាយ **Least-Squares Regression** ជាទូទៅក្នុងការគូសបន្ទាត់ប្រភេទនេះ។ ពាក្យ "Least-Squares" មានន័យពីដំណើរការកាត់បន្ថយកំហុសសរុបក្នុងម៉ូឌែលយើង។ សម្រាប់ចំណុចទិន្នន័យរាល់គឺយើងវាស់ចម្ងាយឈរ (ហៅថា residual) រវាងចំណុចពិត និងបន្ទាត់ផ្សារ។
យើងសម្រួលចម្ងាយទាំងនេះដល់កំរិតក្រោមពីហេតុផលពីរចម្បង៖
1. **ទំហំលើទិសដៅ**៖ យើងចង់ដាក់តម្លៃកំហុស -5 និង +5 ដូចគ្នា។ ការបង្រួចគុណ​​បង្កើតអោយតម្លៃទាំងអស់ជាស្រប។
2. **ពិនិត្យសំណុំនៃចំណុចក្រៅ**៖ ការបង្រួចគុណធ្វើឲ្យកំហុសធំៗទទួលបានទំងន់ច្រើនជាង ហើយបណ្តាលឲ្យបន្ទាត់នៅជិតចំណុចចម្ងាយ។
បន្ទាប់មកយើងបូកតម្លៃក្រោមគុណទាំងនេះទាំងឡាយគ្នា។ គោលដៅគឺរកបន្ទាត់ជាក់លាក់មួយដែលបូកចុងក្រោយនេះតិចជាងគេ (តម្លៃតិចបំផុត)—ហេតុនេះហៅថា "Least-Squares"។
> **🧮 បង្ហាញគណិតវិទ្យា**
>
> បន្ទាត់នេះ ដែលហៅថា _បន្ទាត់ត្រូវគ្នា_ អាចបញ្ចេញដោយ[សមីការ](https://en.wikipedia.org/wiki/Simple_linear_regression):
>
> ```
> Y = a + bX
> ```
>
> `X` គឺជា 'អថេរពន្យល់'។ `Y` គឺជា 'អថេរពឹងផ្អែក'។ លំនឹងបន្ទាត់គឺ `b` ហើយ `a` គឺ កន្លែងឆ្លងដែក y-intercept ដែលសំដៅតម្លៃ `Y` នៅពេល `X = 0`
>
>![calculate the slope](../../../../translated_images/km/slope.f3c9d5910ddbfcf9.webp)
>
> ជំហានដំបូង គណនាលំនឹង `b`។ រូបភាពព័ត៌មានដោយ [Jen Looper](https://twitter.com/jenlooper)
>
> ផ្ទុះពីនេះ និងបើសិនវាចង់បង្ហាញពីសំណួរដើមទិន្នន័យ​ផ្លែផ្អែខោច៖ "ទាយតម្លៃផ្លែផ្អែខោចមួយក្នុងមួយកំប៉ិល តាមខែ" គឺ `X` នឹងសំដៅតម្លៃ និង `Y` នឹងសំដៅខែក្នុងការលក់។
>
>![complete the equation](../../../../translated_images/km/calculation.a209813050a1ddb1.webp)
>
> គណនាតម្លៃ `Y`។ ប្រសិនបើអ្នកប្រាក់តម្លៃប្រហែល $4 វាត្រូវតែជាខែ មេសា! រូបភាពព័ត៌មានដោយ [Jen Looper](https://twitter.com/jenlooper)
>
> គណិតវិទ្យាដែលគណនាបន្ទាត់ត្រូវបង្ហាញលំនឹងបន្ទាត់ ដែលត្រូវអាស្រ័យលើការឆ្លងដែក ឬកន្លែងដែល `Y` មានតម្លៃនៅពេល `X = 0`
>
> អ្នកអាចមើលវិធីសាស្រ្តគណនាចំនួនទាំងនេះនៅគេហទំព័រ [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html)។ បន្ថែមទៀត អ្នកអាចចូលមើល [លេខាគណនាតាម Least-squares](https://www.mathsisfun.com/data/least-squares-calculator.html) ដើម្បីងាយយល់ពីរបៀបលេខមានឥទ្ធិពលដល់បន្ទាត់។
## ទំនាក់ទំនងសមាមាត្រ (Correlation)
ពាក្យមួយទៀតដែលត្រូវយល់គឺ **សមាមាត្រជាគូ** រវាងអថេរ X និង Y។ អ្នកអាចមើលសមាមាត្រនេះបានយ៉ាងរហ័សតាមការគូស scatterplot។ ប្លាត់ដែលមានចំណុចរាយព្រមទ្រុងក្នុងបន្ទាត់ត្រូវមានសមាមាត្រខ្ពស់ ប៉ុន្តែប្លាត់ដែលចំណុចរាយឡើងគ្នារវាង X និង Y គឺមានសមាមាត្រតិច។
ម៉ូឌែលផ្សារ Linear Regression ល្អគឺបានសមាមាត្រខ្ពស់ (ជិត 1 ជាង 0) ដោយប្រើវិធីសាស្រ្ត Least-Squares Regression ជាមួយបន្ទាត់ផ្សារ។
✅ រត់កំណត់ត្រាជាមួយមេរៀននេះ រួចមើល scatterplot សមាមាត្រពី Month ទៅ Price។ តើទិន្នន័យដែលភ្ជាប់ Month ទៅ Price សម្រាប់ការលក់ផ្លែផ្អែខោច យល់ថាសមាមាត្រខ្ពស់ឬទាប តាមការពិចារណារបស់អ្នកលើ scatterplot? តើវាប្រែប្រួលប្រសិនបើអ្នកប្រើវិមាត្រ​ចំ​ណាស់ជាងមុន ហៅថា *ថ្ងៃនៃឆ្នាំ* (ចំនួនថ្ងៃចាប់ពីដើមឆ្នាំ)?
ក្នុងកូដខាងក្រោម នឹងគិតថាអ្នកបានសម្អាតទិន្នន័យហើយ ហើយទទួលបាន data frame មានឈ្មោះ `new_pumpkins` ដូចខាងក្រោម៖
ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price
---|-------|-----------|---------|------|---------|-----------|------------|-------
70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545
74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
> កូដសម្រាប់សម្អាតទិន្នន័យអាចរកបាននៅក្នុង [`notebook.ipynb`](notebook.ipynb)។ យើងបានបំពេញជំហានសម្អាតដូចមុន និងគណនាជួរឈរប្រចាំថ្ងៃ `DayOfYear` ដោយប្រើបំណែកការបង្ហាញដូចខាងក្រោម៖
```python
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
```
ឥឡូវនេះដោយអ្នកបានយល់ពីគណិតវិទ្យានៃផ្សាររៀបរាប់រាងតែមួយវិញ សូមបង្កើតម៉ូឌែលផ្សារ​រួម​ដើម្បីមើលថាតើយើងអាចទាយថា ប្រអប់ផ្លែផ្អែខោចណាមួយនឹងមានតម្លៃផ្លែផ្អែខោចល្អបំផុត។ អ្នកដែលទិញផ្លែផ្អែខោចសម្រាប់ស្រុកផ្លែផ្អែខោចនៅថ្ងៃបុណ្យប្រហែលនឹងចង់បានព័ត៍មាននេះដើម្បីអាចលំអៀងការទិញប្រអប់ផ្លែផ្អែខោចរបស់ពួកគេ។
## ការស្វែងរកទំនាក់ទំនងសមាមាត្រ
[![ML for beginners - Looking for Correlation: The Key to Linear Regression](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "ML for beginners - Looking for Correlation: The Key to Linear Regression")
> 🎥 ចុចរូបភាពខាងលើសម្រាប់មើលវីដេអូសង្ខេបអំពីទំនាក់ទំនងសមាមាត្រ។
ពីមេរៀនមុន អ្នកប្រហែលជាបានឃើញថាតម្លៃមធ្យមសម្រាប់ខែផ្សេងៗមើលទៅដូចជា:
<img alt="Average price by month" src="../../../../translated_images/km/barchart.a833ea9194346d76.webp" width="50%"/>
នេះបង្ហាញថាគួរតែមានទំនាក់ទំនងមួយ និងយើងអាចសាកល្បងបណ្តុះម៉ូឌែល Linear Regression ដើម្បីទាយទំនាក់ទំនងរវាង `Month` និង `Price` ឬស្របពេល `DayOfYear` និង `Price`។ នេះជាការបង្ហាញទិន្នន័យ scatterplot មួយបង្ហាញពីទំនាក់ទំនងចុងក្រោយ៖
<img alt="Scatter plot of Price vs. Day of Year" src="../../../../translated_images/km/scatter-dayofyear.bc171c189c9fd553.webp" width="50%" />
យើងមកមើលថាតើមានទំនាក់ទំនងសមាមាត្រដែលប្រើបានតាម `corr` function ដែរឬ?
```python
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
```
មើលទៅសមាមាត្រមានតិច គឺ -0.15 សម្រាប់ `Month` និង -0.17 សម្រាប់ `DayOfMonth` ប៉ុន្តែអាចមានទំនាក់ទំនងសំខាន់ផ្សេងទៀត។ វាមើលទៅដូចជាមានក្រុមតម្លៃផ្សេងៗរបស់ផ្លែផ្អែខោចផ្សេងៗ។ ដើម្បីបញ្ជាក់សំណល់នេះ យើងមកគូសម៉ូដែលផ្លែផ្អែខោចនីតិវិធីដោយពណ៌ផ្សេងៗគ្នា។ ដោយបញ្ជូនប៉ារ៉ាម៉ែត្រ`ax` ទៅកម្មវិធីគូស scatterplot អ្នកអាចគូសចំណុចទាំងអស់នៅលើតារាងតែមួយ។
```python
ax=None
colors = ['red','blue','green','yellow']
for i,var in enumerate(new_pumpkins['Variety'].unique()):
df = new_pumpkins[new_pumpkins['Variety']==var]
ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
```
<img alt="Scatter plot of Price vs. Day of Year" src="../../../../translated_images/km/scatter-dayofyear-color.65790faefbb9d54f.webp" width="50%" />
ការស៊ើបអង្កេតនិងបង្ហាញថាប្រភេទផ្លែប៉ះពាល់ជាងកាលបរិច្ឆេទលក់។ អ្នកអាចមើលមើលវាពីក្រាលបន្ទាត់​ចំនួនជាប់គ្នា៖
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
<img alt="Bar graph of price vs variety" src="../../../../translated_images/km/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
យើងយកចំណុចមានចំណាប់អារម្មណ៍មួយ គឺ pie type និងមើលឥទ្ធិពលរបស់កាលបរិច្ឆេទលើតម្លៃ៖
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
<img alt="Scatter plot of Price vs. Day of Year" src="../../../../translated_images/km/pie-pumpkins-scatter.d14f9804a53f927e.webp" width="50%" />
បើយើងគណនាសមាមាត្ររវាង `Price` និង `DayOfYear` ដោយប្រើ `corr` វានឹងត្រឹមតែប្រហែលជា `-0.27` - មានន័យថាការបណ្តុះម៉ូឌែលទាយទោលមានទំនាក់ទំនងហើយ។
> មុននឹងបណ្តុះម៉ូឌែល Linear Regression វាជារឿងសំខាន់ក្នុងការត្រួតពិនិត្យថាទិន្នន័យរបស់យើងបានស្អាត។ Linear Regression មិនប្រសើរជាមួយអថេរបាត់បង់ ដូច្នេះវាត្រូវបានណែនាំឲ្យកម្ចាត់អថេរទទេទាំងអស់៖
```python
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
```
មុខងារផ្សេងគ្នាគឺដាក់បញ្ចូលតម្លៃទទេនូវតម្លៃមធ្យមពីជួរឈរត្រូវទាក់ទង។
## ផ្សាររៀបរាប់រាងតែមួយសាមញ្ញ
[![ML for beginners - Linear and Polynomial Regression using Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "ML for beginners - Linear and Polynomial Regression using Scikit-learn")
> 🎥 ចុចរូបភាពខាងលើសម្រាប់មើលវីដេអូទាំងមូលអំពីការបណ្តុះម៉ូឌែល Linear និង Polynomial Regression។
ដើម្បីបណ្តុះម៉ូឌែល Linear Regression របស់យើង យើងនឹងប្រើបណ្ណាល័យ **Scikit-learn**
```python
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
```
យើងចាប់ផ្ដើមដោយបំបែកចំនួនបញ្ចូល (features) និងចេញរង់ចាំ (label) ទៅជា array numpy ផ្សេងៗ៖
```python
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
```
> សម្គាល់ថាយើងត្រូវ reshape ទិន្នន័យបញ្ចូល ដើម្បីឲ្យ package Linear Regression យល់បានត្រឹមត្រូវ។ Linear Regression រង់ចាំ input array 2D ដែលជាតួរទំាងរបស់ជួរឈរនីមួយៗជាតួរផ្គុំឡើង ដូច្នេះសម្រាប់ input តែមួយ យើងចង់បាន array ទំហំ N×1 ដែល N គឺទំហំទិន្នន័យ។
បន្ទាប់មក យើងត្រូវបែងចែកទិន្នន័យជា train និង test dataset ដើម្បីធានាការផ្ទៀងផ្ទាត់ម៉ូឌែលបន្ទាប់ពីបណ្តុះ៖
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
ចុងក្រោយ ការបណ្តុះម៉ូឌែល Linear Regression ជាក់ស្តែង ត្រូវការតែពីរបន្ទាត់កូដ។ យើងកំណត់វត្ថុ `LinearRegression` ហើយភ្ជាប់វានៅលើទិន្នន័យដោយវិធីសាស្រ្ត `fit`
```python
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
```
Object `LinearRegression` បន្ទាប់ពីបាន `fit` រួចមានគុក័ភីស្យង់ទាំងអស់នៃរេហ្គ្រេស្យុង ដែលអាចចូលប្រើបានដោយប្រើបច្ចេក `.coef_`។ ក្នុងករណីរបស់យើង មានគុក័ភីស្យង់តែ១ ដែលគួរតែប្រហែល `-0.017`។ វាមានន័យថា តម្លៃថ្លៃទំនិញមានន័យថាកំពុងធ្លាក់បន្តិចបន្តួចជាមួយពេលវេលា ប៉ុន្តែមិនចាញ់ខ្លាំង ត្រឹមប្រហែល ២ សេនក្នុងមួយថ្ងៃទេ។ យើងក៏អាចចូលប្រើចំណុចឆ្លងផ្តួចផ្តើមរបស់រេហ្គ្រេស្យុងជាមួយអ័ក្ស Y ដោយប្រើ `lin_reg.intercept_` ដែលនៅក្នុងករណីរបស់យើងនឹងប្រហែល `21` ដែលបង្ហាញពីតម្លៃថ្លៃលើកដំបូងនៃឆ្នាំ។
ដើម្បីមើលថាម៉ូដែលរបស់យើងមានភាពត្រឹមត្រូវប៉ុណា យើងអាចទាយទម្លៃថ្លៃទំនិញលើប្រភេទទិន្នន័យសាកល្បង ហើយបន្ទាប់មកវាស់ថាតម្លៃទាយរបស់យើងជិតតម្លៃដែលរំពឹងទុកប៉ុណ្ណា។ វាអាចធ្វើបានដោយប្រើតំលៃ MSE (mean square error) ដែលជាមធ្យមនៃខុសគ្នារវាងតម្លៃរំពឹងទុក និងតម្លៃទាយដែលបានក្រោមភាពឡើងវិញ។
```python
pred = lin_reg.predict(X_test)
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
```
កំហុសរបស់យើងឆ្ងាយប្រហែល ២ ពិន្ទុ ដែលជាប្រហែល ~17%។ មិនល្អពេកទេ។ សញ្ញាមួយទៀតនៃគុណភាពម៉ូដែលគឺ **coefficient of determination** ដែលអាចទទួលបានដូចខាងក្រោម៖
```python
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
```
បើតម្លៃនេះស្មើ 0 មានន័យថាម៉ូដែលមិនយកទិន្នន័យបញ្ចូលចូលចិត្តនោះទេ ហើយគាត់ប្រតិបត្តិដូចជា *អ្នកទាយបង្ហាញបញ្ចូល linear អាក្រក់បំផុត* ដែលគ្រាន់តែជាតម្លៃមធ្យមនៃលទ្ធផល។ តម្លៃ 1 មានន័យថាយើងអាចទាយទម្លៃលទ្ធផលបានយ៉ាងពេញលេញ។ ក្នុងករណីរបស់យើង coefficient ប្រហែល 0.06 ដែលទាបបន្តិច។
យើងក៏អាចបង្ហាញទិន្នន័យសាកល្បង រួមជាមួយខ្សែរេហ្គ្រេស្យុង ដើម្បីឲ្យយល់ច្បាស់ថារេហ្គ្រេស្យុងធ្វើការយ៉ាងដូចម្តេច៖
```python
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
```
<img alt="Linear regression" src="../../../../translated_images/km/linear-results.f7c3552c85b0ed1c.webp" width="50%" />
## រេហ្គ្រេស្យុងផូលីណូម្យ얼
ប្រភេទមួយទៀតនៃរេហ្គ្រេស្យុងបែបជួរឈរជាមួយគ្នាគឺ រេហ្គ្រេស្យុងផូលីណូម្យ얼។ នៅពេលខ្លះ មានទំនាក់ទំនងបែបជួរឈរពីរវីរីables - ដូចជាឥដ្ឋមានទំហំនាងធំ នឹងមានតម្លៃថ្លៃខ្ពស់ជាង - ប៉ុន្តេលើកលែងទំនាក់ទំនងទាំងនេះមិនអាចបង្ហាញជាពហុប្លង់ ឬបន្ទាត់ស្របបាន។
✅ នៅទីនេះមាន [ឧទាហរណ៍បន្ថែម](https://online.stat.psu.edu/stat501/lesson/9/9.8) នៃទិន្នន័យដែលអាចប្រើរេហ្គ្រេស្យុងផូលីណូម្យ얼បាន
សូមមើលទំនាក់ទំនងរវាងថ្ងៃ និងតម្លៃវិញ។ តើក្រាហ្វ Scatterplot នេះមើលទៅគឺត្រូវតែវិភាគដោយបន្ទាត់ស្របទេមែន? តើតម្លៃថ្លៃអាចមានការប្រែប្រួលទេ? ក្នុងករណីនេះ អ្នកអាចសាកល្បងរេហ្គ្រេស្យុងផូលីណូម្យ얼បាន។
✅ ផូលីណូម្យ얼គឺជាការសម្ដែងគ្រឹះគណិតវិទ្យាដែលអាចមានអថេរតែមួយ ឬច្រើន និងគុក័ភីស្យង់
រេហ្គ្រេស្យុងផូលីណូម្យ얼បង្កើតខ្សែពោងកោង ដើម្បីឲ្យអាចសាកសមនឹងទិន្នន័យមិនម៉ាស្សា linear បានល្អប្រសើរជាងមុន។ ក្នុងករណីរបស់យើង ប្រសិនបើបញ្ចូលអថេរពណ៌វត្ថុ `DayOfYear`^2 ទៅក្នុងទិន្នន័យបញ្ចូល យើងគួរតែអាចតំឡើងទិន្នន័យជាមួយខ្សែ parabola ដែលមានតម្លៃអប្បបរមានៅពេលកំណត់មួយក្នុងឆ្នាំ។
Scikit-learn មាន [pipeline API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) ដែលមានប្រយោជន៍ ដើម្បីតភ្ជាប់ជំហានដំណើរការទិន្នន័យផ្សេងៗគ្នា។ **pipeline** គឺជាសង្ស័យនៃ **estimators**។ ក្នុងករណីរបស់យើង យើងនឹងបង្កើត pipeline ដែលជាលើកដំបូងបន្ថែមលក្ខណៈផូលីណូម្យ얼ទៅម៉ូដែល ហើយបន្ទាប់បណ្ដុះបណ្ដាលរេហ្គ្រេស្យុង៖
```python
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
```
ការប្រើ `PolynomialFeatures(2)` មានន័យថាយើងនឹងបញ្ចូលផូលីណូម្យ얼ចំណាត់ថ្នាក់ទីពីរទាំងអស់ពីទិន្នន័យបញ្ចូល។ ក្នុងករណីរបស់យើង វានឹងមានតែន័យ `DayOfYear`^2 ប៉ុណ្ណោះ ប៉ុន្តែបើមានអថេរ 2 គឺ X និង Y វានឹងបន្ថែម X^2, XY និង Y^2 ក៏បាន។ យើងអាចប្រើផូលីណូម្យ얼ជំពូកខ្ពស់ ដោយបើត្រូវការបានដែរ។
pipeline អាចប្រើប្រាស់បានដូចជាអង្គភាព `LinearRegression` ដើម ដូច្នេះ​យើងអាច `fit` pipeline ហើយបន្ទាប់មកប្រើ `predict` បានផងដែរ ដើម្បីទទួលលទ្ធផលទាយ។ ខាងក្រោមជាក្រាហ្វដែលបង្ហាញទិន្នន័យសាកល្បង និងខ្សែពោងកោងតំណាង៖
<img alt="Polynomial regression" src="../../../../translated_images/km/poly-results.ee587348f0f1f60b.webp" width="50%" />
ដោយប្រើរេហ្គ្រេស្យុងផូលីណូម្យ얼 យើងអាចទទួលបាន MSE ទាបជាងបន្តិច និង coefficient of determination ខ្ពស់ជាងបន្តិច ប៉ុន្តែមិនខ្លាំងណាស់ទេ។ យើងត្រូវយកចំណុចផ្សេងទៀតចូលក្នុងការពិចារណាផងដែរ!
> អ្នកអាចបើកចំណាំបានថា តម្លៃថ្លៃអង្គរជាមួយខ្នងនោះមានចន្លោះពេលដែលជិតថ្ងៃ Halloween។ តើអ្នកអាចពន្យល់មូលហេតុនេះបានយ៉ាងដូចម្តេច?
🎃 សូមអបអរសាទរ អ្នកទើបបង្កើតម៉ូដែលមួយដែលអាចជួយទាយតម្លៃថ្លៃនំទំពាំងបាយជូបាន។ អ្នកប្រហែលជាអាចធ្វើដំណើរការ​តែមួយនេះសម្រាប់ប្រភេទទំពាំងបាយជូគ្រប់ប្រភេទបានផង ប៉ុន្តែវាត្រូវការការងារលំបាក។ យើងនឹងរៀនរបៀបយកប្រភេទទំពាំងបាយជូទៅក្នុងគំរូរបស់យើងឥលូវនេះ!
## លក្ខណៈពិសេសដូចជាប្រភេទ (Categorical Features)
នៅក្នុងពិភពផ្តល់ក្តីសង្ឃឹម អ្នកចង់អាចទាយតម្លៃថ្លៃសម្រាប់ប្រភេទទំពាំងបាយជូផ្សេងៗដោយប្រើម៉ូដែលតែមួយ។ ប៉ុន្តែកន្លែងជួរឈរ `Variety` មានភាពខុសគ្នាពីជួរឈរ `Month` ប៉ុន្តែបង្កប់តម្លៃមិនមែនជាតួលេខទេ។ ជួរឈរដូចនេះហៅថា **categorical**
[![ML for beginners - Categorical Feature Predictions with Linear Regression](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression")
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូជាសង្ខេបអំពីការប្រើលក្ខណៈពិសេសឈ្មោះដូចជាប្រភេទ។
នៅទីនេះ អ្នកអាចមើលថាតម្លៃថ្លៃមធ្យមអាស្រ័យលើប្រភេទ៖
<img alt="Average price by variety" src="../../../../translated_images/km/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
ដើម្បីយកប្រភេទចូលក្នុងគំរូបាន ត្រូវបម្លែងវាទៅជាទម្រង់លេខឬ **encode**វា។ មានវិធីជាច្រើនក្នុងការធ្វើៈ
* **numeric encoding** សាមញ្ញ នឹងបង្កើតតារាងប្រភេទផងដែរ ហើយបម្លែងឈ្មោះប្រភេទជាលេខតែម្ដងក្នុងតារាង។ នេះមិនមែនជាគំនិតល្អសម្រាប់រេហ្គ្រេស្យុងរេហ្គ្រេស្យុង linear ទេ ព្រោះវាប្រើតម្លៃលេខនោះដើម្បីបន្ថែមលទ្ធផល បូកនឹងគុក័ភីស្យង់ផ្សេងៗ ហើយទំនាក់ទំនងរវាងលេខនិងតម្លៃថ្លៃមិនមែន linear ទេ ទោះបីបញ្ជាក់ថាលេខជាតម្លៃលំដាប់ក្រោមក៏ដោយ។
* **One-hot encoding** នឹងបម្លែងជួរឈរ `Variety` ទៅជាជួរឈរបួនគ្នា សម្រាប់ប្រភេទនីមួយៗគ្នា។ វា​អាចមានតម្លៃ `1` ប្រសិនបើជួរដេកទាំងនោះនៅក្នុងប្រភេទនោះ ហើយ`0` នៅក្នុងករណីផ្សេងទៀត។ នេះមានន័យថានឹងមានគុក័ភីស្យង់បួនសម្រាប់រេហ្គ្រេស្យុង linear សម្រាប់ប្រភេទទំពាំងបាយជូ បំពេញដំបូងនៃតម្លៃថ្លៃឬ "តម្លៃបន្ថែម" សម្រាប់ប្រភេទនោះ។
កូដខាងក្រោមបង្ហាញពីរបៀបដែលយើងអាចកូដ one-hot encoding ចំពោះប្រភេទបាន៖
```python
pd.get_dummies(new_pumpkins['Variety'])
```
ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE
----|-----------|-----------|--------------------------|----------
70 | 0 | 0 | 0 | 1
71 | 0 | 0 | 0 | 1
... | ... | ... | ... | ...
1738 | 0 | 1 | 0 | 0
1739 | 0 | 1 | 0 | 0
1740 | 0 | 1 | 0 | 0
1741 | 0 | 1 | 0 | 0
1742 | 0 | 1 | 0 | 0
ដើម្បីបណ្ដុះបណ្ដាលរេហ្គ្រេស្យុង linear ប្រើប្រភេទ ខណៈដែលត្រូវបានបកប្រែជា one-hot encoded ក្នុងការបញ្ចូល យើងត្រូវ initialize ទិន្នន័យ `X` និង `y` ឲ្យបានត្រឹមត្រូវ៖
```python
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
```
កូដនៅសល់មានដូចដែលយើងបានប្រើទៅមុនសម្រាប់បណ្ដុះបណ្ដាល Linear Regression។ ប្រសិនបើអ្នកសាកល្បង វាអាចឃើញថា mean squared error ប្រហែលដូចគ្នា ប៉ុន្តែយើងទទួលបាន coefficient of determination ខ្ពស់ជាងគេ (~77%)។ ដើម្បីទទួលបានការទាយល្អប្រសើរជាងនេះ អ្នកអាចយកលក្ខណៈពិសេសពហុ (categorical) និង លក្ខណៈពិសេសចំនួន (numeric) ដូចជា `Month``DayOfYear` ចូលរួមជាមួយគ្នាច្រើនទៀត។ ដើម្បីមានអារេចាយធំមួយ សម្រាប់លក្ខណៈទាំងនេះ អ្នកអាចប្រើ `join`
```python
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
```
នៅទីនេះយើងក៏យកចំណុច `City` និងប្រភេទ `Package` ចូលគណនាផង ដោយមាន MSE 2.84 (10%) និងកំណត់ត្រានៃការបញ្ជាក់ 0.94!
## រួមបញ្ចូលគ្នាទាំងអស់
ដើម្បីបង្កើតម៉ូដែលល្អបំផុត យើងអាចប្រើទិន្នន័យផ្សំប្រភេទ (one-hot encoded categorical) និងចំនួន (numeric) ពីឧទាហរណ៍ខាងលើជាមួយរេហ្គ្រេស្យុងផូលីណូម្យ얼។ ខាងក្រោមជាកូដពេញលេញសម្រាប់សម្រួលរបស់អ្នក៖
```python
# រៀបចំទិន្នន័យបណ្ដុះបណ្ដាល
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
# បំបែកទិន្នន័យបណ្ដុះបណ្ដាល និងសាកល្បង
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# រៀបចំពីផ្លូវបំណង និងបណ្ដុះបណ្ដាល
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
# ទស្សន៍ទាយលទ្ធផលសម្រាប់ទិន្នន័យសាកល្បង
pred = pipeline.predict(X_test)
# គណនារ៉ាស៊ី MSE និងកម្រិតកំណត់
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
```
នេះគួរតែផ្តល់ coefficient of determination ល្អបំផុតប្រហែល 97% ហើយ MSE=2.23 (~8% កំហុសទាយ)។
| ម៉ូដែល | MSE | ការកំណត់ត្រា |
|-------|-----|---------------|
| `DayOfYear` Linear | 2.77 (17.2%) | 0.07 |
| `DayOfYear` Polynomial | 2.73 (17.0%) | 0.08 |
| `Variety` Linear | 5.24 (19.7%) | 0.77 |
| លក្ខណៈទាំងអស់ Linear | 2.84 (10.5%) | 0.94 |
| លក្ខណៈទាំងអស់ Polynomial | 2.23 (8.25%) | 0.97 |
🏆 ល្អណាស់! អ្នកបានបង្កើតម៉ូដែលរេហ្គ្រេស្យុងបួនលក្ខណៈក្នុងមួយមេរៀន ហើយបង្កើនគុណភាពម៉ូដែលដល់ 97%។ នៅផ្នែកចុងក្រោយអំពីរេហ្គ្រេស្យុង អ្នកនឹងរៀនអំពី Logistic Regression ដើម្បីកំណត់ប្រភេទ។
---
## 🚀ការប្រកួតប្រជែង
សាកល្បងអថេរផ្សេងៗគ្នាច្រើនក្នុងកំណត់ត្រានេះ ដើម្បីមើលថាតើភាពស៊ីជម្រៅនៃទំនាក់ទំនងឆ្លើយតបដូចម្តេចទៅដោយភាពត្រឹមត្រូវរបស់ម៉ូដែល។
## [ប្រលងបន្ទាប់ម៉ោងបង្រៀន](https://ff-quizzes.netlify.app/en/ml/)
## ការត្រួតពិនិត្យ និង សិក្សាឯករាជ្យ
ក្នុងមេរៀននេះ យើងបានរៀនអំពី Linear Regression។ មានប្រភេទរេហ្គ្រេស្យុងសំខាន់ៗផ្សេងទៀត។ សូមអានអំពី Stepwise, Ridge, Lasso និង Elasticnet។ មេរៀនល្អមួយសម្រាប់សិក្សាបន្ថែមគឺ [មេរៀនស្ថិតិ ស្ទេនហ្វ័រដ៍](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
## បេសកកម្ម
[បង្កើតម៉ូដែល](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
## សេចក្តីណែនាំ
នៅក្នុងមេរៀននេះ អ្នកត្រូវបានបង្ហាញពីរបៀបបង្កើតម៉ូដែលដោយប្រើទាំង 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 -->

File diff suppressed because one or more lines are too long

@ -0,0 +1,401 @@
# Logistic regression ដើម្បីទាយកាតេកូរី
![Logistic vs. linear regression infographic](../../../../translated_images/km/linear-vs-logistic.ba180bf95e7ee667.webp)
## [ការប្រលងមុនម៉ោងផ្សាយ](https://ff-quizzes.netlify.app/en/ml/)
> ### [មេរៀននេះមានស្រាប់នៅក្នុង R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html)
## ការណែនាំ
នៅក្នុងមេរៀនចុងក្រោយនេះលើការឧទ្ទិសសំណុំទិន្នន័យ Regression ដែលជាតិចរបស់បច្ចេកទេស ML _បុរាណ_, យើងនឹងស្គាល់ Logistic Regression។ អ្នកនឹងប្រើបច្ចេកទេសនេះដើម្បីរកមើលលំនាំដើម្បីទាយកាតេកូរីពីរបាន។ តើស្ករគឺជាស្វាម៉េតឫមិនមែន? តើជម្ងឺនេះឆ្លងឬមិន? តើអតិថិជននេះនឹងរើសផលិតផលនេះឫមិន?
នៅក្នុងមេរៀននេះ អ្នកនឹងរៀន៖
- បណ្ណាល័យថ្មីសម្រាប់ការមើលទិន្នន័យ
- បច្ចេកទេសសម្រាប់ logistic regression
✅ ជ្រាបចំហពីការប្រើ regression ប្រភេទនេះក្នុង [មូឌុលរៀន](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott)
## ការត្រៀមខ្លួន
បន្ទាប់ពីបានធ្វើការលេងជាមួយទិន្នន័យកម្រាលផ្លែឈើ pumpkin យើងមានការស្គាល់គ្រប់គ្រាន់ដើម្បីយល់ថាមានកាតេកូរីពីរមួយដែលអាចប្រើបានគឺ `Color`
មកបង្កើតម៉ូដែល logistic regression ដើម្បីទាយថា ពីអថេរខ្លះៗ _ពណ៌របស់ pumpkin មួយដែលបានផ្តល់ចង្អុលបង្ហាញនឹងមានអ្វីនៅលើទៅ_ (ទឹកក្រូច 🎃 ឬ ពណ៌ស 👻)។
> ហេតុអ្វីបានយើងពិភាក្សាពីចំណាត់ថ្នាក់ពីរ ក្នុងមេរៀនដែលពាក់ព័ន្ធនឹង regression? គ្រាន់តែសម្រាប់ភាពងាយស្រួលភាសា បើទោះបី logistic regression ជាវិធីចំណាត់ថ្នាក់មួយ [ពិតប្រាកដ](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression) ក៏ដោយ ដែលមានមូលដ្ឋានលើខ្សែតួ។ រៀនអំពីវិធីផ្សេងទៀតក្នុងការចាត់ថ្នាក់ទិន្នន័យនៅមេរៀនក្រោយ។
## កំណត់សំណួរ
សម្រាប់គោលបំណងរបស់យើង យើងនឹងបង្ហាញនេះជាការចាត់តាមពីរយ៉ាង៖ 'ពណ៌ស' ឬ 'មិនមែនពណ៌ស'។ ក៏មានកាតេកូរី 'ពណ៌ប៊ិច' ផងដែលមាននៅលើdataset, ប៉ុន្តែមានករណីតិច ជាថ្មីយើងមិនប្រើវាទេ។ វានឹងបាត់បង់នៅពេលយើងដកទិន្នន័យដែលមានតម្លៃគ្មានអ្វីពី dataset ផងដែរ។
> 🎃 ព័ត៌មានរីករាយ គេពេលខ្លះហៅ pumpkin ពណ៌សថា pumpkin 'ភ្នំ'. វាមិនងាយក្នុងការចំអិន ដូច្នេះវាមិនពេញនិយមប៉ុន្មានដូច pumpkin ទឹកក្រូច, ប៉ុន្តែវាមើលទាក់ទាញណាស់! ដូច្នេះ យើងអាចកែសំណួររបស់យើងជាថា៖ 'ភ្នំ' ឬ 'មិនភ្នំ' 👻។
## អំពី logistic regression
Logistic regression ផ្សេងពី linear regression ដែលអ្នកបានរៀនមុននេះនៅក្នុងបញ្ហាខ្លះ។
[![ML for beginners - Understanding Logistic Regression for Machine Learning Classification](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "ML for beginners - Understanding Logistic Regression for Machine Learning Classification")
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូមោទនភាពខ្លីអំពី logistic regression។
### ចាត់ថ្នាក់ពីរជាន់
Logistic regression មិនផ្តល់លក្ខណៈដូច linear regression ទេ។ Logistic regression ផ្តល់ទាយន័យអំពីកាតេកូរីពីរដូចជា ("ពណ៌ស ឬ មិនពណ៌ស") ខណៈដែល linear regression អាចទាយតម្លៃជាបន្ត (បិទនេះផ្អែកលើដើម pumpkin និងពេលកាប់ ប្រហែលថា _តម្លៃរបស់វានឹងឡើងប៉ុន្មាន_)។
![Pumpkin classification Model](../../../../translated_images/km/pumpkin-classifier.562771f104ad5436.webp)
> រូបភាពដោយ [Dasani Madipalli](https://twitter.com/dasani_decoded)
### ចាត់ថ្នាក់ផ្សេងៗ
មានប្រភេទ logistic regression ផ្សេងទៀត រួមមាន multinomial និង ordinal៖
- **Multinomial** ដែលមានកាតេកូរីលើសពីមួយៈ "ទឹកក្រូច, ពណ៌ស និង ប៊ិច"។
- **Ordinal** ដែលមានកាតេកូរីតាមលំដាប់ ដែលមានប្រយោជន៍ប្រសិនបើយើងចង់តម្រៀបលទ្ធផលយ៉ាងមានตรรกะដូច pumpkin ដែលមានទំហំកំណត់ (តូច ធំមធ្យម ធំ លំដាប់គ្នា)។
![Multinomial vs ordinal regression](../../../../translated_images/km/multinomial-vs-ordinal.36701b4850e37d86.webp)
### អថេរមិនចាំបាច់ត្រូវពាក់ព័ន្ធគ្នា
ចងចាំថា linear regression ធ្វើបានល្អជាមួយអថេរសមាសភាពល្អជាងទេ? Logistic regression ផ្ទុយទៅវិញ - អថេរមិនបាច់ត្រូវដូចគ្នា។ វាត្រូវនឹងទិន្នន័យនេះដែលមានសមាសភាពអន់។
### អ្នកត្រូវតែមានទិន្នន័យស្អាតច្រើន
Logistic regression នឹងនាំឲ្យបានលទ្ធផលត្រឹមត្រូវឡើង ប្រសិនបើអ្នកប្រើទិន្នន័យច្រើន; dataset តូចរបស់យើងមិនល្អសម្រាប់ការងារនេះទេ ដូច្នេះសូមចងចាំ។
[![ML for beginners - Data Analysis and Preparation for Logistic Regression](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "ML for beginners - Data Analysis and Preparation for Logistic Regression")
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូមោទនភាពខ្លីអំពីការត្រៀមទិន្នន័យសម្រាប់ linear regression
✅ គិតអំពីប្រភេទទិន្នន័យដែលសមរម្យសម្រាប់ logistic regression
## ការហាត់ប្រាណ - រៀបចំទិន្នន័យ
ជំហានដំបូង សម្អាតទិន្នន័យ បោះបង់តម្លៃគ្មានអ្វី និងជ្រើសរើសកូឡុំប៉ុន្មាន៖
1. បន្ថែមកូដដូចខាងក្រោម៖
```python
columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color']
pumpkins = full_pumpkins.loc[:, columns_to_select]
pumpkins.dropna(inplace=True)
```
អ្នកអាចមើល dataframe ថ្មីរបស់អ្នកបាននៅពេលណាដែលចង់បានៈ
```python
pumpkins.info
```
### ការមើលទិន្នន័យ - គំនូរសញ្ញាកាតេកូរី
ឥឡូវនេះ អ្នកបានផ្ទុកចូល [សៀវភៅកំណត់ចំណាំដើម](./notebook.ipynb) ជាមួយទិន្នន័យ pumpkin ម្តងទៀត ហើយបានសម្អាតវាដូច្នេះដើម្បីរក្សាទុក dataset ដែលមានអថេរមួយចំនួន រួមមាន `Color`។ អ្នកចង់គំនូរសម្រាប់ dataframe នៅក្នុងសៀវភៅកំណត់ចំណាំ ដោយប្រើបណ្ណាល័យផ្សេងទៀតគឺ [Seaborn](https://seaborn.pydata.org/index.html) ដែលបង្កើតលើ Matplotlib ដែលយើងបានប្រើមុន។
Seaborn ផ្តល់វិធីល្អក្នុងការមើលទិន្នន័យរបស់អ្នក។ ឧទាហរណ៍ អ្នកអាចប្រៀបធៀបទិន្នន័យសម្រាប់រាល់ `Variety` និង `Color` ក្នុងគំនូរសញ្ញាកាតេកូរី។
1. បង្កើតគំនូរដូចនេះដោយប្រើមុខងារ `catplot` ប្រាប់ពី data pumpkin របស់យើង `pumpkins` និងកំណត់ផែនទីពណ៌សម្រាប់រាល់កាតេកូរី pumpkin (ទឹកក្រូច ឬ ពណ៌ស)៖
```python
import seaborn as sns
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
sns.catplot(
data=pumpkins, y="Variety", hue="Color", kind="count",
palette=palette,
)
```
![ស្រទាប់គំនូរទិន្នន័យ](../../../../translated_images/km/pumpkins_catplot_1.c55c409b71fea2ec.webp)
ដោយមើលទិន្នន័យ អ្នកអាចឃើញពីទំនាក់ទំនងរវាងទិន្នន័យ Color និង Variety។
✅ តាមគំនូរម៉ូតនេះ តើអ្នកអាចយល់ពីការស្រាវជ្រាវណាមួយដល់?
### ការព្យាបាលទិន្នន័យជាមុន: ការអ៊ិនកូដលក្ខណៈ និងស្លាក
Dataset pumpkins របស់យើងមានតម្លៃអក្សរសម្រាប់គ្រប់កូឡុំ។ ការងារជាមួយទិន្នន័យកាតេកូរីគឺងាយស្រួលសម្រាប់មនុស្ស ប៉ុន្តែមិនសម្រាប់ម៉ាស៊ីនទេ។ អាល់គុណិទិ៍ machine learning បំរើល្អជាមួយលេខ។ ដូច្នេះការអ៊ិនកូដគឺជជើងជម្រាបសំខាន់នៅដំណាក់កាលព្យាបាលទិន្នន័យ ដែលជួយបំលែងទិន្នន័យកាតេកូរីទៅកាន់ទិន្នន័យលេខ ដោយមិនបាត់បង់ព័ត៌មាន។ ការអ៊ិនកូដល្អនាំឲ្យបង្កើតម៉ូដែលល្អ។
សម្រាប់ feature encoding មានប្រភេទ encoder ពីរចម្បង៖
1. Ordinal encoder: សមស្របសម្រាប់អថេរអាគុយរបស់ ordinal ដែលជាកាតេកូរីដែលមានលំដាប់ដូចជា `Item Size` នៅក្នុង dataset របស់យើង។ វាបង្កើតផែនទីដែលរាល់កាតេកូរីត្រូវបានតំណាងដោយលេខ ដែលជាលំដាប់របស់កាតេកូរនោះនៅក្នុងកូឡុំ។
```python
from sklearn.preprocessing import OrdinalEncoder
item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']]
ordinal_features = ['Item Size']
ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
```
2. Categorical encoder: សមស្របសម្រាប់អថេរអាគុយរបស់ nominal ដែលជាកាតេកូរីដែលមិនមានលំដាប់ដូចគ្នា ដូចជា លក្ខណៈផ្សេងទៀតក្រៅពី `Item Size` ក្នុង dataset របស់យើង។ វាជា one-hot encoding ដែលមានន័យថារាល់កាតេកូរត្រូវបានតំណាងដោយកូឡុំប៊ីណារី៖ អថេរអ៊ិនកូដស្មើនឹង 1 ប្រសិនបើ pumpkin ស្ថិតក្នុង Variety នោះ និង 0 មិនដល់។
```python
from sklearn.preprocessing import OneHotEncoder
categorical_features = ['City Name', 'Package', 'Variety', 'Origin']
categorical_encoder = OneHotEncoder(sparse_output=False)
```
បន្ទាប់មក `ColumnTransformer` ត្រូវបានប្រើដើម្បីបញ្ចូល encoder ច្រើនទៅជាជំហានតែមួយ និងអនុវត្តលើកូឡុំដែលសមរម្យ។
```python
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer(transformers=[
('ord', ordinal_encoder, ordinal_features),
('cat', categorical_encoder, categorical_features)
])
ct.set_output(transform='pandas')
encoded_features = ct.fit_transform(pumpkins)
```
ផ្ទៃផ្សេងទៀត សម្រាប់ encode ស្លាក label យើងប្រើថ្នាក់ `LabelEncoder` របស់ scikit-learn ដែលជាឧបករណ៍ជួយnormalize ស្លាកបែប ដែលធ្វើឲ្យមានតម្លៃក្នុងរកមួយពី 0 ដល់ n_classes-1 (នៅទីនេះ 0 និង 1)។
```python
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
encoded_label = label_encoder.fit_transform(pumpkins['Color'])
```
បន្ទាប់ពី encode feature និង label រួច យើងអាចបញ្ចូលពួកវាទៅក្នុង dataframe ថ្មី `encoded_pumpkins`
```python
encoded_pumpkins = encoded_features.assign(Color=encoded_label)
```
✅ អត្ថប្រយោជន៍នៃការប្រើ ordinal encoder សម្រាប់កូឡុំ `Item Size` មានអ្វីខ្លះ?
### វិភាគទំនាក់ទំនងរវាងអថេរ
ឥឡូវនេះដែលយើងបានព្យាបាលទិន្នន័យជាមុនហើយ អាចវិភាគទំនាក់ទំនងរវាង feature និង label ដើម្បីយល់ពីថា ម៉ូដែលអាចទាយបានល្អប៉ុណ្ណា នៅពេលផ្តល់ចំណូលអថេរ។
វិធីល្អបំផុតសម្រាប់វាយតម្លៃនេះគឺគំនូរ។ យើងនឹងប្រើមុខងារ catplot របស់ Seaborn វិញ ដើម្បីបង្ហាញទំនាក់ទំនងរវាង `Item Size`, `Variety` និង `Color` ក្នុងគំនូរសញ្ញាកាតេកូរី។ ដើម្បីបង្កើតគំនូរ យើងនឹងប្រើកូឡុំ `Item Size` ដែលបាន encode ហើយ និងកូឡុំ `Variety` មិនបាន encode។
```python
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size']
g = sns.catplot(
data=pumpkins,
x="Item Size", y="Color", row='Variety',
kind="box", orient="h",
sharex=False, margin_titles=True,
height=1.8, aspect=4, palette=palette,
)
g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6))
g.set_titles(row_template="{row_name}")
```
![គំនូរ catplot ផ្ទាំងទិន្នន័យ](../../../../translated_images/km/pumpkins_catplot_2.87a354447880b388.webp)
### ប្រើស្វាមប្រភេទគំនូរពណ៌
ព្រោះ Color ជាកាតេកូរពីរ (ពណ៌ស ឬ មិន) វាត្រូវការ '[វិធីពិសេស](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) សម្រាប់ការមើលទិន្នន័យ'។ មានវិធីផ្សេងទៀតក្នុងការមើលទំនាក់ទំនងរបស់កាតេកូរនេះជាមួយអថេរផ្សេងទៀត។
អ្នកអាចមើលអថេរជាអ៊ុមណាមួយរាប់មុខជាមួយគំនូរ Seaborn។
1. សាកល្បងគំនូរស្វាម ដើម្បីបង្ហាញការចែកចាយតម្លៃ៖
```python
palette = {
0: 'orange',
1: 'wheat'
}
sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
```
![គំនូរស្វាម](../../../../translated_images/km/swarm_2.efeacfca536c2b57.webp)
**សូមប្រយ័ត្ន**: កូដខាងលើអាចបង្កើតសារព្រមាន ព្រោះ seaborn មិនអាចបង្ហាញចំណុចទិន្នន័យច្រើនប៉ុណ្ណោះក្នុងគំនូរស្វាមបានទេ។ ដំណោះស្រាយមួយគឺកាត់បន្ថយទំហំម៉ាកឯកសារ ដោយប្រើប៉ារ៉ាម៉ែត្រ 'size'។ ប៉ុន្តែសូមដឹងថា វានឹងប៉ះពាល់ទៅលើភាពអាចអាននៃគំនូរ។
> **🧮 បង្ហាញគណិតវិទ្យា**
>
> Logistic regression ពឹងផ្អែកលើគំនិត 'maximum likelihood' ដោយប្រើ [function sigmoid](https://wikipedia.org/wiki/Sigmoid_function)។ 'Sigmoid Function' នៅលើគំនូរមើលទៅដូចជារូប 'S'។ វាទទួលតម្លៃមួយហើយផ្គូរផ្គងឲ្យមានតម្លៃនៅចន្លោះ 0 និង 1។ ខ្សែវាក៏ហៅថា 'logistic curve'។ សមីការរូបនេះមានរូបរាងដូចខាងក្រោម៖
>
> ![logistic function](../../../../translated_images/km/sigmoid.8b7ba9d095c789cf.webp)
>
> ដែល midpoint របស់ sigmoid មាននៅចំណុច x = 0, L ជាតម្លៃអតិបរមានៃខ្សែ, និង k ជាកម្រិតកាច់ជ្រាបនៃខ្សែ។ ប្រសិនបើលទ្ធផលនៃ function លើស 0.5 ស្លាកនោះនឹងត្រូវចាត់ថាជាប្រភេទ '1' នៃជម្រើសពីរ។ បើមិនបញ្ជាក់ នឹងចាត់ថាជាប្រភេទ '0'។
## បង្កើតម៉ូដែលរបស់អ្នក
ការបង្កើតម៉ូដែលសម្រាប់រកចំណាត់ថ្នាក់ពីរនេះគឺងាយស្រួលក្នុង Scikit-learn។
[![ML for beginners - Logistic Regression for classification of data](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "ML for beginners - Logistic Regression for classification of data")
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូសង្ខេបស្តីពីការបង្កើតម៉ូដែល logistic regression
1. ជ្រើសរើសអថេរដែលអ្នកចង់ប្រើនៅក្នុងម៉ូដែលចាត់ថ្នាក់ ហើយបំបែក training និង test ដោយហៅ `train_test_split()`
```python
from sklearn.model_selection import train_test_split
X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])]
y = encoded_pumpkins['Color']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
2. ឥឡូវអ្នកអាចបណ្តុះម៉ូដែលដោយហៅ `fit()` ជាមួយទិន្នន័យ training ហើយបោះពុម្ពលទ្ធផលរបស់វា៖
```python
from sklearn.metrics import f1_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('F1-score: ', f1_score(y_test, predictions))
```
មើលទៅក្រឡា scoreboard របស់ម៉ូដែលអ្នក។ វាមិនអាក្រាតទេ បើគិតថាអ្នកមានត្រឹមប្រហែល 1000 ជួរទិន្នន័យប៉ុណ្ណោះ៖
```output
precision recall f1-score support
0 0.94 0.98 0.96 166
1 0.85 0.67 0.75 33
accuracy 0.92 199
macro avg 0.89 0.82 0.85 199
weighted avg 0.92 0.92 0.92 199
Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0 0 0 0 0 1 1]
F1-score: 0.7457627118644068
```
## យល់បានល្អជាងគេតាមរយៈ confusion matrix
លោកអាចទទួលបានរបាយការណ៍ scoreboard ដោយបោះពុម្ពវត្ថុខាងលើ [terms](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) ប៉ុន្តែអ្នកអាចយល់ម៉ូដែលបានលឿនជាងដោយប្រើ [confusion matrix](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) ដើម្បីយល់ពីប្រសិទ្ធិភាពម៉ូដែល។
> 🎓 '[confusion matrix](https://wikipedia.org/wiki/Confusion_matrix)' (ឬ 'error matrix') ជាតារាងបង្ហាញពីការធ្វើត្រឹមត្រូវ និងមិនត្រឹមត្រូវនៃការទាយរបស់ម៉ូដែល ដូច្នេះវាផ្តល់ការវាយតម្លៃភាពត្រឹមត្រូវនៃទាយទំនាក់ទំនង។
1. ដើម្បីប្រើ confusion matrix, ហៅ `confusion_matrix()`
```python
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, predictions)
```
មើលទៅ confusion matrix របស់ម៉ូដែលអ្នក៖
```output
array([[162, 4],
[ 11, 22]])
```
នៅក្នុង Scikit-learn, ជួរដេក (axis 0) ជាស្លាកពិត និងជួរឈរ (axis 1) ជាស្លាកទាយ។
| | 0 | 1 |
| :---: | :---: | :---: |
| 0 | TN | FP |
| 1 | FN | TP |
អ្វីកើតឡើងនៅទីនេះ? យើងនិយាយថាម៉ូដែលត្រូវបានសួរឲ្យចាត់ថ្នាក់ pumpkin រវាងប៉ារងពីរគឺ 'ពណ៌ស' និង 'មិនពណ៌ស'។
- ប្រសិនបើម៉ូដែលអ្នកទាយថា pumpkin មិនមែនពណ៌ស និងនៅពិតកម្មវិធីជាក្រុម 'មិនពណ៌ស', យើងហៅនេះថា true negative ដែលបង្ហាញដោយលេខខាងលើឆ្វេង។
- ប្រសិនបើម៉ូដែលទាយថា pumpkin ជាពណ៌ស ប៉ុន្តែពិតជាក្នុងក្រុម 'មិនពណ៌ស' យើងហៅថា false negative ដែលបង្ហាញដោយលេខខាងក្រោមឆ្វេង។
- ប្រសិនបើម៉ូដែលទាយថា pumpkin មិនមែនពណ៌ស ប៉ុន្តែពិតជា 'ពណ៌ស', យើងហៅថា false positive ដែលបង្ហាញដោយលេខខាងលើស្តាំ។
- ប្រសិនបើម៉ូដែលទាយថា pumpkin ជាពណ៌ស ហើយពិតជា 'ពណ៌ស', យើងហៅថា true positive ដែលបង្ហាញដោយលេខខាងក្រោមស្តាំ។
យ៉ាងដែលអ្នកអាចបានគិត មុននេះវាជាការល្អបំផុតក្នុងការមានចំនួន TP (true positives) និង TN (true negatives) ច្រើន ហើយមានចំនួន FP (false positives) និង FN (false negatives) តិច ដែលបង្ហាញថាម៉ូដែលមានប្រសិទ្ធភាពល្អជាង។
តើ matrix រញ្ជួយទាក់ទងទៅនឹង precision និង recall យ៉ាងដូចម្តេច? ចូរចងចាំថា របាយការណ៍ចាត់ថ្នាក់ដែលបានបោះពុម្ពនៅលើ បានបង្ហាញពី precision (0.85) និង recall (0.67)។
Precision = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461
Recall = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666
✅ សំនួរ៖ យោងតាម matrix រញ្ជួយ ម៉ូដែលបានធ្វើការយ៉ាងដូចម្ដេច? ដាច់ចិត្ត៖ មិនអាក្រក់ទេ; មានចំនួន true negatives ច្រើនល្អ ប៉ុន្តែនៅតែមួយចំនួន false negatives ផងដែរ។
ចូលទៅវិញវិលទស្សនា លក្ខណៈដែលយើងបានឃើញពីមុន ជាមួយនឹងជំនួយកំណត់ទីតាំង TP/TN និង FP/FN នៃ matrix រញ្ជួយ៖
🎓 Precision: TP/(TP + FP) ភាគរយនៃករណីដែលពាក់ទាក់ទងក្នុងចំណោមករណីដែលបានយក (ឧ. ស្លាកណាដែលត្រូវបានស្លាកបានល្អ)
🎓 Recall: TP/(TP + FN) ភាគរយនៃករណីដែលពាក់ទាក់ទង ដែលត្រូវបានយក មិនថាត្រូវបានស្លាកបានល្អឬអត់
🎓 f1-score: (2 * precision * recall)/(precision + recall) មធ្យម តុល្យភាពនៃ precision និង recall ដែលល្អបំផុតគឺ 1 និងអាក្រក់បំផុតគឺ 0
🎓 Support: ចំនួនករណីនៃស្លាកនីមួយៗដែលបានយក
🎓 Accuracy: (TP + TN)/(TP + TN + FP + FN) ភាគរយនៃស្លាកដែលបានទំនាក់ទំនងត្រឹមត្រូវសម្រាប់គំរូ។
🎓 Macro Avg: ការគណនាតម្លៃមធ្យមប្រាក់មិនបង្គបង់សម្រាប់ស្លាកនីមួយៗ ដោយមិនគិតពីភាពមិនសមរម្យនៃស្លាក។
🎓 Weighted Avg: ការគណនាតម្លៃមធ្យមសម្រាប់ស្លាកនីមួយៗ ដោយទុកចិត្តលើភាពមិនសមរម្យនៃស្លាកដោយវាស់តំលៃតាមកម្រិតស្នេះ (ចំនួនករណីសព្វថ្ងៃសម្រាប់ស្លាកនីមួយៗ)។
✅ តើអ្នកគិតថាតម្លៃណាមួយដែលអ្នកគួរតែនៅត្រួតពិនិត្យ ប្រសិនបើអ្នកចង់ឲ្យម៉ូដែលរបស់អ្នកបន្ថយចំនួន false negatives?
## បង្ហាញរាងកោង ROC របស់ម៉ូដែលនេះ
[![ML for beginners - Analyzing Logistic Regression Performance with ROC Curves](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML for beginners - Analyzing Logistic Regression Performance with ROC Curves")
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូចំលងខ្លីអំពីរាងកោង ROC
យើងចាំបាច់ត្រូវធ្វើបង្ហាញមួយទៀត ដើម្បីមើលរាងកោងដែលហៅថា ROC
```python
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
y_scores = model.predict_proba(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
fig = plt.figure(figsize=(6, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
```
ប្រើ Matplotlib ដើម្បីគូររាងកោង [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) ឬ ROC របស់ម៉ូដែល។ រាងកោង ROC ត្រូវបានប្រើជាញឹកញាប់ដើម្បីមើលលទ្ធផលរបស់ម៉ាស៊ីនចាត់ថ្នាក់ក្នុងការប្រៀបធៀបចំណុច positive ត្រឹមត្រូវ និង false positives។ "រាងកោង ROC ជាធម្មតាបង្ហាញអត្រា true positive នៅលើអ័ក្ស Y ហើយ false positive នៅលើអ័ក្ស X"។ ដូច្នេះ, ភាពខ្ពស់របស់រាងកោង និងចន្លោះរវាងខ្សែ​បន្ទាត់កណ្តាល និងរាងកោងសំខាន់នឹង៖ អ្នកចង់បានរាងកោងមួយរំកិលឡើងលឿន ហើយឆ្លងកាត់ខ្សែបន្ទាត់។ ក្នុងករណីរបស់យើង there are false positives to start with, and then the line heads up and over properly:
![ROC](../../../../translated_images/km/ROC_2.777f20cdfc4988ca.webp)
ចុងក្រោយ ប្រើ Scikit-learns [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) ដើម្បីគណនាតម្លៃពិតប្រាកដ 'ផ្ទៃក្រោមរាងកោង' (AUC)៖
```python
auc = roc_auc_score(y_test,y_scores[:,1])
print(auc)
```
លទ្ធផលគឺ `0.9749908725812341`។ ពីព្រោះ AUC មានតម្លៃចន្លោះពី 0 ដល់ 1, អ្នកចង់បានពិន្ទុធំ ព្រោះម៉ូដែលដែលត្រឹមត្រូវ 100% នឹងមាន AUC ដល់ 1; ក្នុងករណីនេះ ម៉ូដែលនេះគឺ _ល្អជាងមធ្យម_
នៅមុខ បង្រៀននាពេលក្រោយអំពីចំណាត់ថ្នាក់ អ្នកនឹងរៀនពីរបៀបធ្វើ iteration ដើម្បីបង្កើនពិន្ទុម៉ូដែល។ ប៉ុន្តាសម្រាប់ពេលនេះ សូមអបអរសាទរ! អ្នកបានបញ្ចប់មេរៀន regression ទាំងនេះហើយ!
---
## 🚀 ការប្រកួតប្រជែង
មានអ្វីដែលត្រូវស្វែងយល់បន្ថែមទៀតអំពី logistic regression! ប៉ុន្តារបៀបល្អបំផុតក្នុងការរៀន គឺធ្វើតេស្ត។ ស្វែងរក dataset មួយដែលសមនឹងការវិភាគប្រភេទនេះ ហើយបង្កើតម៉ូដែលជាមួយវា។ តើអ្នកបានរៀនអ្វីខ្លះ? ជំនួយ៖ ព្យាយាម [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) សម្រាប់ dataset ដែលគួរឱ្យចាប់អារម្មណ៍។
## [តេស្តក្រោយមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
## សារសង្ខេប និង អប់រំបន្ថែម
អានទំព័រដើមខ្លះៗ នៃ [ឯកសារនេះពីស្ថានីយ៍ Stanford](https://web.stanford.edu/~jurafsky/slp3/5.pdf) អំពីការប្រើប្រាស់ប្រក្រតីមួយចំនួនសម្រាប់ logistic regression។ ស្វែករកភារកិច្ចណាដែលសមស្របសម្រាប់ប្រភេទ regression មួយឬមួយផ្សេងទៀត ដែលយើងបានរៀនរហូតដល់ពេលនេះ។ តើអ្វីដែលនឹងដំណើរការល្អបំផុត?
## បេសកកម្ម
[Retrying this regression](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,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,263 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ប្រភេទកន្ទុយសាំង និងពណ៌\n",
"\n",
"ផ្ទុកបណ្ណាល័យដែលត្រូវការ និងទិន្នន័យ។ បម្លែងទិន្នន័យទៅជា dataframe ដែលមានផ្នែកខ្លះនៃទិន្នន័យ៖\n",
"\n",
"ពិចារណាខ្សែទំនាក់ទំនងរវាងពណ៌និងប្រភេទ\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>City Name</th>\n",
" <th>Type</th>\n",
" <th>Package</th>\n",
" <th>Variety</th>\n",
" <th>Sub Variety</th>\n",
" <th>Grade</th>\n",
" <th>Date</th>\n",
" <th>Low Price</th>\n",
" <th>High Price</th>\n",
" <th>Mostly Low</th>\n",
" <th>...</th>\n",
" <th>Unit of Sale</th>\n",
" <th>Quality</th>\n",
" <th>Condition</th>\n",
" <th>Appearance</th>\n",
" <th>Storage</th>\n",
" <th>Crop</th>\n",
" <th>Repack</th>\n",
" <th>Trans Mode</th>\n",
" <th>Unnamed: 24</th>\n",
" <th>Unnamed: 25</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>4/29/17</td>\n",
" <td>270.0</td>\n",
" <td>280.0</td>\n",
" <td>270.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>E</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>5/6/17</td>\n",
" <td>270.0</td>\n",
" <td>280.0</td>\n",
" <td>270.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>E</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>HOWDEN TYPE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>9/24/16</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>N</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>HOWDEN TYPE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>9/24/16</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>160.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>N</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>BALTIMORE</td>\n",
" <td>NaN</td>\n",
" <td>24 inch bins</td>\n",
" <td>HOWDEN TYPE</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>11/5/16</td>\n",
" <td>90.0</td>\n",
" <td>100.0</td>\n",
" <td>90.0</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>N</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 26 columns</p>\n",
"</div>"
],
"text/plain": [
" City Name Type Package Variety Sub Variety Grade Date \\\n",
"0 BALTIMORE NaN 24 inch bins NaN NaN NaN 4/29/17 \n",
"1 BALTIMORE NaN 24 inch bins NaN NaN NaN 5/6/17 \n",
"2 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
"3 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
"4 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 11/5/16 \n",
"\n",
" Low Price High Price Mostly Low ... Unit of Sale Quality Condition \\\n",
"0 270.0 280.0 270.0 ... NaN NaN NaN \n",
"1 270.0 280.0 270.0 ... NaN NaN NaN \n",
"2 160.0 160.0 160.0 ... NaN NaN NaN \n",
"3 160.0 160.0 160.0 ... NaN NaN NaN \n",
"4 90.0 100.0 90.0 ... NaN NaN NaN \n",
"\n",
" Appearance Storage Crop Repack Trans Mode Unnamed: 24 Unnamed: 25 \n",
"0 NaN NaN NaN E NaN NaN NaN \n",
"1 NaN NaN NaN E NaN NaN NaN \n",
"2 NaN NaN NaN N NaN NaN NaN \n",
"3 NaN NaN NaN N NaN NaN NaN \n",
"4 NaN NaN NaN N NaN NaN NaN \n",
"\n",
"[5 rows x 26 columns]"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"full_pumpkins = pd.read_csv('../data/US-pumpkins.csv')\n",
"\n",
"full_pumpkins.head()\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": {
"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.11.1"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"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,681 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## សង់ម៉ូឌែល logistic regression - មេរៀនទី 4\n",
"\n",
"![Logistic vs. linear regression infographic](../../../../../../translated_images/km/linear-vs-logistic.ba180bf95e7ee667.webp)\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",
"![Infographic by Dasani Madipalli](../../../../../../translated_images/km/pumpkin-classifier.562771f104ad5436.webp)\n",
"\n",
"### ចំណាត់ថ្នាក់ផ្សេងៗ\n",
"\n",
"មានប្រភេទការវិលត្រឡប់លូជីស្ទិចផ្សេងទៀត រួមមានលក្ខណៈពហុបុព្វ និងអ័រដីនាល:\n",
"\n",
"- **ពហុបុព្វ** ដែលមានចំណាត់ថ្នាក់ច្រើនជាងមួយ - \"ពណ៌ទឹកក្រូច ពណ៌ស និងដែលមានរបារ\"។\n",
"\n",
"- **អ័រដីនាល** ដែលមានចំណាត់ថ្នាក់តាមលំដាប់ ដែលមានប្រយោជន៍បើចង់តម្រៀបលទ្ធផលយ៉ាង​មាន​ទ្រឹស្តី ដូចជាពិដានរបស់យើងដែលតម្រៀបតាមទំហំដាច់ដោយឡែក (តូចខ្នាតតូចមធ្យមធំធំដល់ធំបំផុត)។\n",
"\n",
"![Multinomial vs ordinal regression](../../../../../../translated_images/km/multinomial-vs-ordinal.36701b4850e37d86.webp)\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
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,47 @@
# ម៉ូដែលថយចុះសម្រាប់ការរៀនម៉ាស៊ីន
## ប្រធានស្រុក: ម៉ូដែលថយចុះសម្រាប់តម្លៃដង្កូវនៅអាមេរិកខាងជើង 🎃
នៅអាមេរិកខាងជើង ដង្កូវគេជាញឹកញាប់ដាក់ញញឹមគួរឱ្យភ័យសម្រាប់បុណ្យហាឡូវីន។ យើងមកស្វែងយល់បន្ថែមអំពីបន្លែអស្ចារ្យទាំងនេះ!
![jack-o-lanterns](../../../translated_images/km/jack-o-lanterns.181c661a9212457d.webp)
> រូបថតដោយ <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>
## អ្វីដែលអ្នកនឹងរៀន
[![Introduction to Regression](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "Regression Introduction video - Click to Watch!")
> 🎥 ចុចរូបភាពខាងលើសម្រាប់វីដេអូណែនាំខ្លីអំពីមេរៀននេះ
មេរៀននៅផ្នែកនេះគ្របដណ្តប់ពីប្រភេទនៃការថយចុះក្នុងបរិបទនៃការរៀនម៉ាស៊ីន។ ម៉ូដែលថយចុះអាចជួយកំណត់ _ទំនាក់ទំនង_ រវាងអថេរ។ ម៉ូដែលប្រភេទនេះអាចទាយទានតម្លៃដូចជា ប្រវែង សីតុណ្ហភាព ឬអាយុ ដូច្នេះបង្ហាញទំនាក់ទំនងរវាងអថេរនាពេលវេលានេះដែលវាធ្វើវិភាគទិន្នន័យ។
ក្នុងស៊េរីមេរៀននេះ អ្នកនឹងស្វែងយល់ពីភាពខុសគ្នារវាងការថយចុះបន្ទាត់និងការថយចុះលូជីស្ទិក ហើយពេលណាដែលអ្នកគួរជ្រើសរើសមួយពីរ។
[![ML for beginners - Introduction to Regression models for Machine Learning](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](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&#44 TX. Lights racing acros... 12/16/2005 29.384210 \n",
"2 Green/Orange circular disc over Chester&#44 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&amp;#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&amp;#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។
![ឧទ្ទិស UFO](../../../translated_images/km/ufo.9e787f5161da9d4d.webp)
រូបថតដោយ <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 @@
# ការណែនាំអំពីការបែងចែកចំណាត់ថ្នាក់
ក្នុងមេរៀនបួននេះ អ្នកនឹងបានសិក្សាពីចំណុចសំខាន់មួយនៃការសិក្សាម៉ាស៊ីនបែបចាស់ៗមួយ - _ការបែងចែកចំណាត់ថ្នាក់_។ យើងនឹងដំណើរការប្រើប្រាស់អាល់គូរីធึមបែងចំណាត់ថ្នាក់នានាជាមួយនឹងទិន្នន័យអំពីម្ហូបឆុងសាធារណៈទាំងអាស៊ីនិងឥណ្ឌា។ សូមសង្ឃឹមថាអ្នកនៅពេលនេះមានអាហារស្តុក!
![just a pinch!](../../../../translated_images/km/pinch.1b035ec9ba7e0d40.webp)
> ប្រារព្ធរំលឹកមុខម្ហូបប៉ាន-អាស៊ីក្នុងមេរៀនទាំងនេះ! រូបភាពដោយ [Jen Looper](https://twitter.com/jenlooper)
ការបែងចំណាត់ថ្នាក់គឺជារបៀបមួយនៃ [ការសិក្សាដោយមានតំណាង](https://wikipedia.org/wiki/Supervised_learning) ដែលមានអារម្មណ៍ស្រដៀងនឹងបច្ចេកទេសរេហ្គ្រេស្យុង។ ប្រសិនបើការសិក្សាម៉ាស៊ីនគឺស្តីពីការព្យាករណ៍តម្លៃឬឈ្មោះរបស់វត្ថុតាមរយៈទិន្នន័យ។ ការបែងចំណាត់ថ្នាក់មានពីរប្រភេទទូទៅគឺ: _ការបែងចំណាត់ថ្នាក់ពីរប្រាំពីរណ៍_ និង _ការបែងចំណាត់ថ្នាក់ច្រើនថ្នាក់_
[![Introduction to classification](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Introduction to classification")
> 🎥 ចុចលើរូបភាពខាងលើសម្រាប់វីដេអូ៖ John Guttag ពី MIT បង្ហាញអំពីការបែងចំណាត់ថ្នាក់
ចងចាំ៖
- **រេហ្គ្រេស្យុងបន្ទាត់** បានជួយអ្នកព្យាករណ៍ទំនាក់ទំនងរវាងអថេរនានា និងធ្វើព្យាករណ៍ត្រឹមត្រូវថាតម្លៃទិន្នន័យថ្មីនឹងស្ថិតនៅកន្លែងណាអំពីបន្ទាត់នោះ។ ដូច្នេះ អ្នកអាចព្យាករណ៍ថា _តម្លៃផ្លែហ្គែលនៅខែកញ្ញាឬខែធ្នូ_ ដូចជា។
- **រេហ្គ្រេស្យុងឡូហ្ស៊ីស្ទិក** បានជួយអ្នករកឃើញ "ប្រភេទពីរប្រាំពីរណ៍": នៅតម្លៃតំលៃនេះ _ផ្លែហ្គែលនេះពណ៌ទ្រុងឬមិនទ្រុង_?
ការបែងចំណាត់ថ្នាក់ប្រើអាល់គូរីធឹមជាច្រើនដើម្បីកំណត់វិធីផ្សេងៗក្នុងការបញ្ជាក់ស្លាក ឬថ្នាក់របស់ចំណុចទិន្នន័យ។ យើងនឹងប្រើទិន្នន័យម្ហូបនេះដើម្បីមើលថាតើដោយសង្កេតមើលក្រុមគ្រឿងផ្សំមួយ អាចកំណត់បានថាម្ហូបនេះមានប្រភពពីខេត្តណាបានឬជាអាច។
## [ការប្រលងមុនមេរៀន](https://ff-quizzes.netlify.app/en/ml/)
> ### [មេរៀននេះអាចប្រើបានក្នុង R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
### ការណែនាំ
ការបែងចំណាត់ថ្នាក់គឺជាកម្មវិធីមួយសំខាន់សម្រាប់អ្នកស្រាវជ្រាវម៉ាស៊ីនសិក្សា និងអ្នកវិទ្យាស្ថានទិន្នន័យមួយ។ ចាប់ពីការបែងចំណាត់ថ្នាក់ពីរប្រាំពីរណ៍មូលដ្ឋាន ("អ៊ីមែលនេះជាស្គាមឬមិនមែន?"), រហូតដល់ការបែងចំណាត់ថ្នាក់រូបភាពស្មុគស្មាញ និងការបែងចំណាត់ថ្នាក់ផ្នែកដោយការមើលឃើញកុំព្យូទ័រ វាអាចមានប្រយោជន៍ជានិច្ចក្នុងការរៀបចំនូវទិន្នន័យទៅក្នុងថ្នាក់ និងសាកសួរទិន្នន័យនោះ។
ដើម្បីពន្យល់ដោយវិទ្យាសាស្ត្រនិងច្បាស់លាស់បន្ថែមវិញ វិធីសាស្ត្របែងចំណាត់ថ្នាក់របស់អ្នកបង្កើតម៉ូដែលព្យាករណ៍ដែលអនុញ្ញាតឲ្យអ្នកបំរែបំរួលទំនាក់ទំនងរវាងអថេរដំណាក់កាល ទៅកាន់អថេរបញ្ចេញ។
![binary vs. multiclass classification](../../../../translated_images/km/binary-multiclass.b56d0c86c81105a6.webp)
> បញ្ហាប្រភេទពីរប្រាំពីរណ៍ និងច្រើនថ្នាក់សម្រាប់អាល់គូរីធឹមបែងចំណាត់ថ្នាក់ត្រូវដោះស្រាយ។ រូបភាពដោយ [Jen Looper](https://twitter.com/jenlooper)
មុនចាប់ផ្តើមដំណើរការសំអាតទិន្នន័យរបស់យើង មើលគំរូវាទិន្នន័យ និងរៀបចំវាសម្រាប់ភារកិច្ច ML របស់យើង សូមយើងសិក្សាអំពីវិធីផ្សេងៗដែលម៉ាស៊ីនសិក្សាអាចប្រើដើម្បីបែងចែកទិន្នន័យ។
បានដកស្រង់ពី [ស្ថិតិវិទ្យា](https://wikipedia.org/wiki/Statistical_classification) ការបែងចំណាត់ថ្នាក់ដោយប្រើម៉ាស៊ីនសិក្សាចាស់ៗប្រើលក្ខណៈពិសេស ជាទម្រង់ `smoker`, `weight`, និង `age` ដើម្បីកំណត់ _ពលភាពនៃការកើតជំងឺ X_។ ជាចំណុចសិក្សាដោយមានតំណាង ដែលស្រដៀងនឹងហាត់រេហ្គ្រេស្យុងដែលអ្នកបានធ្វើមុននេះ ទិន្នន័យរបស់អ្នកត្រូវបានដាក់ស្លាក ហើយអាល់គូរីធឹម ML ប្រើស្លាកទាំងនោះដើម្បីបែងចំណាត់ និងព្យាករណ៍ថ្នាក់ (ឬ 'លក្ខណៈពិសេស') របស់ទិន្នន័យ និងផ្ដល់វាទៅក្រុម ឬលទ្ធផលមួយ។
✅ ចំណាយពេលស្រមៃពីទិន្នន័យអំពីម្ហូបមួយ។ ម៉ូដែលច្រើនថ្នាក់អាចឆ្លើយបានអ្វី? ម៉ូដែលពីរប្រាំពីរណ៍អាចឆ្លើយបានអ្វី? បើអ្នកចង់កំណត់ថាអ្វីមួយថាតើម្ហូបណាមួយប្រើ "fenugreek" ឬទេ? បើអ្នកចង់មើលថា ប្រសិនបើមានកាបូបទំនិញពោរពេញដោយ "star anise", "artichokes", "cauliflower", និង "horseradish" អ្នកអាចបង្កើតម្ហូបឥណ្ឌាប្រភេទមួយបានឬទេ?
[![Crazy mystery baskets](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](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()
```
![cuisine data distribution](../../../../translated_images/km/cuisine-dist.d0cc2d551abe5c25.webp)
មានម្ហូបច្រើនណាស់ ប៉ុន្តែការបែងចែកទិន្នន័យមិនស្មើល្អទេ។ អ្នកអាចដោះស្រាយបាន! មុននោះ សូមស្វែងយល់បន្ថែម។
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()
```
![thai](../../../../translated_images/km/thai.0269dbab2e78bd38.webp)
1. ធ្វើដូចគ្នាសម្រាប់ទិន្នន័យជប៉ុន៖
```python
japanese_ingredient_df = create_ingredient_df(japanese_df)
japanese_ingredient_df.head(10).plot.barh()
```
![japanese](../../../../translated_images/km/japanese.30260486f2a05c46.webp)
1. ឥឡូវសម្រាប់គ្រឿងផ្សំចិន៖
```python
chinese_ingredient_df = create_ingredient_df(chinese_df)
chinese_ingredient_df.head(10).plot.barh()
```
![chinese](../../../../translated_images/km/chinese.e62cafa5309f111a.webp)
1. គូសគ្រឿងផ្សំឥណ្ឌា៖
```python
indian_ingredient_df = create_ingredient_df(indian_df)
indian_ingredient_df.head(10).plot.barh()
```
![indian](../../../../translated_images/km/indian.2c4292002af1a1f9.webp)
1. ចុងក្រោយ គូសគ្រឿងផ្សំកូរ៉េ៖
```python
korean_ingredient_df = create_ingredient_df(korean_df)
korean_ingredient_df.head(10).plot.barh()
```
![korean](../../../../translated_images/km/korean.4a4f0274f3d9805a.webp)
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,725 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_10-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# សាងសង់ម៉ូដែលចាត់ថ្នាក់ៈ ម្ហូបអាស៊ីនិងឥណ្ឌាសாளីឆ្ងាញ់\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## អំនើ្លបាចំព័ទ្ធទៅកាន់ការបែងចែក: សម្អាត ផ្តិតផ្គុំ និងមើលទិន្នន័យរបស់អ្នក\n",
"\n",
"នៅក្នុងមេរៀន​បួន​នេះ អ្នកនឹងស្វែងយល់ពីកម្រិតមូលដ្ឋានមួយនៃការរៀនម៉ាស៊ីនគ្លាស៊ីច - *ការបែងចែក*។ យើងនឹងដើរតាមវិធីប្រើប្រាស់អាល់ហ្គូរីធម៍បែងចែកនានាមួយជាមួយនឹងសំណុំទិន្នន័យអំពីម្ហូបឆែបឆៃដ៏អស្ចារ្យទាំងអាស៊ី និងឥណ្ឌា។ សង្ឃឹមថាអ្នកឃ្លីប!\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/pinch.1b035ec9ba7e0d40.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>អបអរសាទរម្ហូបអាហារប្រចាំប៉ានអាស៊ីក្នុងមេរៀនទាំងនេះ! រូបភាពដោយ Jen Looper</figcaption>\n",
"\n",
"\n",
"<!--![Celebrate pan-Asian cuisines in these lessons! Image by Jen Looper](../../../../../../translated_images/km/pinch.b33c0ba76f284aad.webp)-->\n",
"\n",
"ការបែងចែកជារបៀបមួយនៃ [ការរៀនភាគីត្រួតត្រា](https://wikipedia.org/wiki/Supervised_learning) ដែលមានចំណុចស្រដៀងជាច្រើនជាមួយវិធីសាស្រ្តព្យាករណ៍កំណត់តម្លៃ។ ក្នុងការបែងចែក អ្នកហ្វឹកហ្វឺនម៉ូដែលមួយដើម្បីព្យាករណ៍ថា `ប្រភេទ` អ្វីមួយដែលធាតុមួយស្ថិតលើវា។ ប្រសិនបើការរៀនម៉ាស៊ីនគឺស្តីពីការព្យាករណ៍តម្លៃ ឬឈ្មោះទៅកាន់វត្ថុដោយប្រើសំណុំទិន្នន័យ ការបែងចែកទូទៅចែកចេញជាពីរគូរៈ *ការបែងចែកពីរប្រភេទ* និង *ការបែងចែកពហុប្រភេទ*។\n",
"\n",
"ចងចាំ៖\n",
"\n",
"- **ព្យាករណ៍បញ្ចាត់បន្ទាត់** ជួយអ្នកព្យាករណ៍ទំនាក់ទំនងរវាងអថេរនានា ហើយបញ្ចេញការព្យាករណ៍មិនខុសពីទីតាំងចំណុចទិន្នន័យថ្មីក្នុងទំនាក់ទំនងជាមួយបន្ទាត់នោះ។ ដូច្នេះ អ្នកអាចព្យាករណ៍តម្លៃជាទំនាក់ទំនងជាក់លាក់ ដូចជា *តម្លៃនៃផ្លែមូសនៅខែ កញ្ញា ប្រៀបធៀបទៅខែធ្នូ* ជាឧទាហរណ៍។\n",
"\n",
"- **ព្យាករណ៍លូជីស្ទិច** ជួយអ្នករកឃើញ \"ប្រភេទពីរប្រភេទ\": នៅតម្លៃនេះ, *ផ្លែមូសនេះមានពណ៌លឿងឬពណ៌ផ្សេងទេ*?\n",
"\n",
"ការបែងចែកប្រើអាល់ហ្គូរីធម៍ជាច្រើនដើម្បីកំណត់វិធីផ្សេងៗសម្រាប់កំណត់ស្លាកឬថ្នាក់របស់ចំណុចទិន្នន័យមួយ។ យើងនឹងធ្វើការជាមួយទិន្នន័យអាហារនេះដើម្បីមើលថា តើដោយពីប៉ុន្មានគ្រឿងផ្សំ អ្នកអាចកំណត់ប្រភពអាហារនោះឬអត់។\n",
"\n",
"### [**សំណួរត្រៀមមុនមេរៀន**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **មុខម្ហូប**\n",
"\n",
"ការបែងចែកគឺជាព្រឹត្តិការណ៍មូលដ្ឋានមួយនៃអ្នកស្រាវជ្រាវការរៀនម៉ាស៊ីន និងវិទ្យាសាស្រ្តទិន្នន័យ។ ចាប់ពីការបែងចែកតម្លៃពីរភេទមូលដ្ឋានមួយ (\"អ៊ីមែលនេះជាស្ពាមឬអត់?\") ទៅដល់ការបែងចែក និងបំបែករូបភាពស្មុគស្មាញដោយប្រើកុំព្យូទ័រមើល, វានានាសមរម្យក្នុងការបំបែកទិន្នន័យទៅកាន់ថ្នាក់ទំនាក់ទំនងនិងសួរបញ្ហាពីវា។\n",
"\n",
"ដើម្បីបញ្ជាក់ពីដំណើរការនេះក្នុងវិជ្ជាជីវៈវិទ្យាសាស្រ្ត, វិធីសាស្រ្តការបែងចែករបស់អ្នកបង្កើតម៉ូដែលព្យាករណ៍ ដែលអនុញ្ញាតឲ្យអ្នកប៉ះពាល់ទំនាក់ទំនងរវាងអថេរបញ្ចូលទៅអថេរចេញ។\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/binary-multiclass.b56d0c86c81105a6.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>បញ្ហាប្រភេទពីរ និងពហុប្រភេទសម្រាប់អាល់ហ្គូរីធម៍បែងចែកដោះសោ។ ក្រាហ្វិកដោយ Jen Looper</figcaption>\n",
"\n",
"\n",
"\n",
"មុនចាប់ផ្តើមដំណើរការសម្អាតទិន្នន័យ, មើលវា និងត្រៀមវាសម្រាប់ភារកិច្ច ML របស់យើង, យើងត្រូវរៀនពីវិធីផ្សេងៗដែលការរៀនម៉ាស៊ីនអាចប្រើដើម្បីបែងចែកទិន្នន័យ។\n",
"\n",
"យកមកពី [ស្ថិតិវិទ្យា](https://wikipedia.org/wiki/Statistical_classification), ការបែងចែកដោយប្រើការរៀនម៉ាស៊ីនគ្លាស៊ីចប្រើលក្ខណៈជាចម្បង ដូចជា `ស្រវឹងបារី`, `ទម្ងន់`, និង `អាយុ` ដើម្បីកំណត់ *សព្វះប្រហែលនៃការរីកចម្រើនជម្ងឺ X*។ ជាវិធីសាស្ត្រ supervised learning ដូចកម្រិតព្យាករណ៍ដែលអ្នកបានអនុវត្តមុននេះ, ទិន្នន័យរបស់អ្នកត្រូវបានតម្លាភាព ហើយដែលអាល់ហ្គូរីធម៍ ML ប្រើស្លាកទាំងនោះដើម្បីចាត់ថ្នាក់ទិន្នន័យ និងព្យាករណ៍ថ្នាក់ (ឬ 'លក្ខណៈ') នៃសំណុំទិន្នន័យ ហើយចាត់វាទៅក្រុមឬលទ្ធផលមួយ។\n",
"\n",
"✅ ចំណាយពេលមួយដើម្បីស្រមៃពីសំណុំទិន្នន័យអំពីអាហារ។ ម៉ូដែលពហុប្រភេទអាចឆ្លើយសំណួរអ្វីបានខ្លះ? ម៉ូដែលពីរប្រភេទអាចឆ្លើយសំណួរអ្វីបានខ្លះ? តើប្រសិនបើអ្នកចង់កំណត់ថាអាហារដ៏គ្នានោះប្រហែលជានឹងប្រើ fenugreek ទេឬអត់? តើប្រសិនបើអ្នកចង់មើលថា ក្នុងករណីមានកាបូបដេញមួយពេញដោយ star anise, artichokes, cauliflower និង horseradish អ្នកអាចបង្កើតម្ហូបទេជាអាហារឥណ្ឌាទេ?\n",
"\n",
"### **ជំរាបសួរ 'អ្នកបែងចែក'**\n",
"\n",
"សំណួរដែលយើងចង់សួរពីសំណុំទិន្នន័យអាហារនេះចាំបាច់ជាគំរូសំណួរពហុប្រភេទ**, ព្រោះយើងមានអាហារជាតិមួយចំនួនដែលអាចប្រើបាន។ ផ្អែកលើក្រុមគ្រឿងផ្សំមួយណាមួយ, តើថ្នាក់ណាមួយក្នុងចំណោមថ្នាក់ណាច្រើនទាំងនេះ តើទិន្នន័យនឹងប៉ះពាល់ពីអ្វី?\n",
"\n",
"Tidymodels ផ្តល់ជូនសំណុំអាល់ហ្គូរីធម៍ផ្សេងៗដើម្បីប្រើបែងចែកទិន្នន័យ, អាស្រ័យលើប្រភេទបញ្ហាដែលអ្នកចង់ដោះស្រាយ។ ក្នុងមេរៀនបន្ទាប់ អ្នកនឹងរៀនអំពីអាល់ហ្គូរីធម៍ជាច្រើនទាំងនេះ។\n",
"\n",
"#### **មុខងារជាមុនតម្រូវ**\n",
"\n",
"សម្រាប់មេរៀននេះ យើងនឹងត្រូវការកញ្ចប់ទីតាំងដូច​ខាងក្រោម ដើម្បីសម្អាត ផ្តិតផ្គុំ និងមើលទិន្នន័យរបស់យើង៖\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) គឺជាសំណុំ [កញ្ចប់ R](https://www.tidyverse.org/packages) ដែលគេរចនាឡើងដើម្បីឲ្យវិទ្យាសាស្រ្តទិន្នន័យមានល្បឿនលឿន ស្រួលបំផុត និងរីករាយ!\n",
"\n",
"- `tidymodels`: សំណុំរចនាសម្ព័ន្ធ [tidymodels](https://www.tidymodels.org/) ជាសំណុំ [កញ្ចប់](https://www.tidymodels.org/packages/) សម្រាប់ម៉ូដែល និងការរៀនម៉ាស៊ីន។\n",
"\n",
"- `DataExplorer`: កញ្ចប់ [DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) មានគោលបំណង លៃតម្រូវ និងស្វ័យប្រវត្តិដំណើរការវិភាគទិន្នន័យមូលដ្ឋាន និងរាយការណ៍។\n",
"\n",
"- `themis`: កញ្ចប់ [themis](https://themis.tidymodels.org/) ផ្តល់ជូនជំហានបន្ថែមសម្រាប់ដោះស្រាយបញ្ហាទិន្នន័យមិនសមស្រប។\n",
"\n",
"អ្នកអាចដំឡើងវាទាំងនេះបានដោយបញ្ជា៖\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"ជាជម្រើសផ្សេងទៀត ស្គ្រីបខាងក្រោមពិនិត្យថាតើអ្នកមានកញ្ចប់ដែលត្រូវការដើម្បីបញ្ចប់មូឌុលនេះ ឬនៅ និងដំឡើងវាឲ្យក្នុងករណីខ្វះកញ្ចប់។\n"
],
"metadata": {
"id": "ri5bQxZ-Fz_0"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)"
],
"outputs": [],
"metadata": {
"id": "KIPxa4elGAPI"
}
},
{
"cell_type": "markdown",
"source": [
"យើងនឹងផ្ទុកកញ្ចប់ដ៏អស្ចារ្យទាំងនេះក្នុងពេលក្រោយ ហើយធ្វើអោយវាអាចប្រើបាននៅក្នុងវគ្គសម័យ R បច្ចុប្បន្នរបស់យើង។ (នេះគឺសម្រាប់ការបង្ហាញតែមួយ, `pacman::p_load()` បានធ្វើរួចហើយសម្រាប់អ្នក)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## លំហាត់ - សម្អាត និងតុល្យភាពទិន្នន័យរបស់អ្នក\n",
"\n",
"ភារកិច្ចដំបូងនៅដៃមុនចាប់ផ្តើមគម្រោងនេះ គឺសម្អាត និង **តុល្យភាព** ទិន្នន័យរបស់អ្នកដើម្បីទទួលបានលទ្ធផលល្អប្រសើរជាងមុន\n",
"\n",
"មកស្គាល់ទិន្នន័យគ្នាដែរ!🕵️\n"
],
"metadata": {
"id": "PFkQDlk0GN5O"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import data\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n",
"\r\n",
"# View the first 5 rows\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {
"id": "Qccw7okxGT0S"
}
},
{
"cell_type": "markdown",
"source": [
"គួរឱ្យចាប់អារម្មណ៍! ពីរូបរាងវា តួបែបទីមួយគឺជាបន្ទាត់ `id` មួយប្រភេទ។ យើងចង់ទទួលបានព័ត៌មានបន្ថែមអំពីទិន្នន័យនេះ។\n"
],
"metadata": {
"id": "XrWnlgSrGVmR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Basic information about the data\r\n",
"df %>%\r\n",
" introduce()\r\n",
"\r\n",
"# Visualize basic information above\r\n",
"df %>% \r\n",
" plot_intro(ggtheme = theme_light())"
],
"outputs": [],
"metadata": {
"id": "4UcGmxRxGieA"
}
},
{
"cell_type": "markdown",
"source": [
"From the output, we can immediately see that we have `2448` rows and `385` columns and `0` missing values. We also have 1 discrete column, *cuisine*.\n",
"\n",
"## វាយឆ្លើយ - រៀនអំពីម្ហូបជាតិ\n",
"\n",
"ឥឡូវនេះការងារចាប់ផ្តើមមានភាពរំភើបច្រើន។ អ្នកមកស្វែងយល់អំពីការចែកចាយទិន្នន័យ តាមប្រភេទម្ហូបជាតិ។\n"
],
"metadata": {
"id": "AaPubl__GmH5"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Count observations per cuisine\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(n)\r\n",
"\r\n",
"# Plot the distribution\r\n",
"theme_set(theme_light())\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"cuisine\")"
],
"outputs": [],
"metadata": {
"id": "FRsBVy5eGrrv"
}
},
{
"cell_type": "markdown",
"source": [
"មានប្រភេទម្ហូបចំនួនកំណត់មួយ ប៉ុន្តែការចែកចាយទិន្នន័យមិនស្មើគ្នាទេ។ អ្នកអាចជួសជុលវាបាន! មុនពេលធ្វើដូច្នោះ សូមស្រាវជ្រាវបន្ថែមតិចជាងនេះ។ \n",
"\n",
"បន្ទាប់មក យើងនឹងចែកចាយម្ហូបនីមួយៗទៅក្នុង tibble ផ្ទាល់ខ្លួនរបស់វា ហើយស្វែងរកមើលថាតើមានទិន្នន័យប៉ុន្មាន (ជួរឈរ, បន្ទាត់) រៀងរាល់ប្រភេទម្ហូបមួយៗ។ \n",
"\n",
"> A [tibble](https://tibble.tidyverse.org/) គឺជារាងទិន្នន័យទំនើបមួយ។ \n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/dplyr_filter.b480b264b03439ff.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>ស្នាដៃដោយ @allison_horst</figcaption>\n"
],
"metadata": {
"id": "vVvyDb1kG2in"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create individual tibble for the cuisines\r\n",
"thai_df <- df %>% \r\n",
" filter(cuisine == \"thai\")\r\n",
"japanese_df <- df %>% \r\n",
" filter(cuisine == \"japanese\")\r\n",
"chinese_df <- df %>% \r\n",
" filter(cuisine == \"chinese\")\r\n",
"indian_df <- df %>% \r\n",
" filter(cuisine == \"indian\")\r\n",
"korean_df <- df %>% \r\n",
" filter(cuisine == \"korean\")\r\n",
"\r\n",
"\r\n",
"# Find out how much data is available per cuisine\r\n",
"cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n",
" \"japanese df:\", dim(japanese_df), \"\\n\",\r\n",
" \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n",
" \"indian_df:\", dim(indian_df), \"\\n\",\r\n",
" \"korean_df:\", dim(korean_df))"
],
"outputs": [],
"metadata": {
"id": "0TvXUxD3G8Bk"
}
},
{
"cell_type": "markdown",
"source": [
"អស្ចារ្យ!😋\n",
"\n",
"## **ហាត់ប្រាណ - រកឃើញសារធាតុសំខាន់ៗតាមម្ហូបប្រភេទជាមួយ dplyr**\n",
"\n",
"ឥឡូវនេះ អ្នកអាចធ្វើការជ្រៀតចូលជ្រៅក្នុងទិន្នន័យ ហើយស្វែងយល់ថាតើសារធាតុណាដែលជាមធ្យមសម្រាប់ម្ហូបប្រភេទនីមួយៗ។ អ្នកគួរតែសម្អាតទិន្នន័យដែលបញ្ជេញមកជាច្រើនដែលបង្កើតការភាន់ច្រឡំរវាងម្ហូបប្រភេទ ដូច្នេះចូរយើងស្វែងយល់អំពីបញ្ហានេះ។\n",
"\n",
"បង្កើតមុខងារ `create_ingredient()` នៅក្នុង R ដែលធ្វើការចេញផ្តល់មកជាតារាងដាតាដាហ្វ្រេមអំពីសារធាតុផ្សំមួយ។ មុខងារនេះនឹងចាប់ផ្តើមដោយការដកបញ្ជៅមួយដែលគ្មានប្រយោជន៍ចេញ ហើយរៀបចំតាមសារធាតុផ្សំជាតាមចំនួនរបស់ពួកវា។\n",
"\n",
"រចនាសម្ព័ន្ធមូលដ្ឋាននៃមុខងារមួយនៅក្នុង R គឺ៖\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"ការណែនាំស្អាតសំរាប់មុខងារ R អាចរកឃើញបាន [នៅទីនេះ](https://skirmer.github.io/presentations/functions_with_r.html#1)។\n",
"\n",
"ចាប់ផ្តើមតម្រឹមមក! យើងនឹងប្រើប្រាស់ [កិរិយាសព្ទ dplyr](https://dplyr.tidyverse.org/) ដែលយើងបានរៀននៅមេរៀនមុនៗ។ ដូចជាការត្រលប់មកមើលឡើងវិញ៖\n",
"\n",
"- `dplyr::select()`: ជួយអ្នកជ្រើសរើសថាតើក колонមានណាមួយដើម្បីរក្សា ឬដកចេញ។\n",
"\n",
"- `dplyr::pivot_longer()`: ជួយអ្នក \"ពង្រីក\" ទិន្នន័យ បន្ថែមចំនួនជួរដេក ហើយកាត់បន្ថយចំនួនជួរឈរ។\n",
"\n",
"- `dplyr::group_by()` និង `dplyr::summarise()`: ជួយអ្នករកស្ថិតិសង្ខេបសម្រាប់ក្រុមខុសៗគ្នា ហើយដាក់វាទៅក្នុងតារាងដ៏ស្អាតមួយ។\n",
"\n",
"- `dplyr::filter()`: បង្កើតជាផ្នែករងនៃទិន្នន័យ ដែលមានតែជួរដេកដែលបំពេញលក្ខខណ្ឌរបស់អ្នកប៉ុណ្ណោះ។\n",
"\n",
"- `dplyr::mutate()`: ជួយអ្នកបង្កើត ឬកែប្រែក колонមួយ។\n",
"\n",
"សូមពិនិត្យមើល [មេរៀនFilled with *art*](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) នៃ learnr ដែលបង្កើតដោយ Allison Horst ដែលណែនាំមុខងារព្យួរការទិន្នន័យមានប្រយោជន៍នៅក្នុង dplyr *(ជាផ្នែកនៃ Tidyverse)*។\n"
],
"metadata": {
"id": "K3RF5bSCHC76"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Creates a functions that returns the top ingredients by class\r\n",
"\r\n",
"create_ingredient <- function(df){\r\n",
" \r\n",
" # Drop the id column which is the first colum\r\n",
" ingredient_df = df %>% select(-1) %>% \r\n",
" # Transpose data to a long format\r\n",
" pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n",
" # Find the top most ingredients for a particular cuisine\r\n",
" group_by(ingredients) %>% \r\n",
" summarise(n_instances = sum(count)) %>% \r\n",
" filter(n_instances != 0) %>% \r\n",
" # Arrange by descending order\r\n",
" arrange(desc(n_instances)) %>% \r\n",
" mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n",
" \r\n",
" \r\n",
" return(ingredient_df)\r\n",
"} # End of function"
],
"outputs": [],
"metadata": {
"id": "uB_0JR82HTPa"
}
},
{
"cell_type": "markdown",
"source": [
"ឥឡូវនេះ​យើងអាច​ប្រើ​មុខងារ​ដើម្បី​ទទួលបាន​គំនិត​អំពី​គ្រឿងផ្សំ​ចំនួនដប់ដ៏ពេញនិយម​បំផុត​តាម​ប្រភេទម្ហូប។ ចូរយក​ចេញ​មើល​ជាមួយ `thai_df`។\n"
],
"metadata": {
"id": "h9794WF8HWmc"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Call create_ingredient and display popular ingredients\r\n",
"thai_ingredient_df <- create_ingredient(df = thai_df)\r\n",
"\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "agQ-1HrcHaEA"
}
},
{
"cell_type": "markdown",
"source": [
"នៅក្នុងផ្នែកមុន យើងបានប្រើ `geom_col()` យើងចង់មើលថាតើអ្នកអាចប្រើ `geom_bar` ដែរ ដើម្បីបង្កើតសៀរមាត្តរបារផងដែរ។ ប្រើ `?geom_bar` សម្រាប់អានបន្ថែម។\n"
],
"metadata": {
"id": "kHu9ffGjHdcX"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a bar chart for popular thai cuisines\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10) %>% \r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "fb3Bx_3DHj6e"
}
},
{
"cell_type": "markdown",
"source": [
"ចូរធ្វើអោយដូចគ្នាសម្រាប់ទិន្នន័យជប៉ុននេះផង\n"
],
"metadata": {
"id": "RHP_xgdkHnvM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Japanese cuisines and make bar chart\r\n",
"create_ingredient(df = japanese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")\r\n"
],
"outputs": [],
"metadata": {
"id": "019v8F0XHrRU"
}
},
{
"cell_type": "markdown",
"source": [
"តើអាហារចិនយ៉ាងដូចម្តេច?\n"
],
"metadata": {
"id": "iIGM7vO8Hu3v"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Chinese cuisines and make bar chart\r\n",
"create_ingredient(df = chinese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lHd9_gd2HyzU"
}
},
{
"cell_type": "markdown",
"source": [
"មកមើលម្ហូបឥណ្ឌាក្នុងចំណោមវាជាអំណោយជាតិ 🌶️។\n"
],
"metadata": {
"id": "ir8qyQbNH1c7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Indian cuisines and make bar chart\r\n",
"create_ingredient(df = indian_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "ApukQtKjH5FO"
}
},
{
"cell_type": "markdown",
"source": [
"ចុងក្រោយ បង្ហាញគ្រឿងផ្សំកូរ៉េ។\n"
],
"metadata": {
"id": "qv30cwY1H-FM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Korean cuisines and make bar chart\r\n",
"create_ingredient(df = korean_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lumgk9cHIBie"
}
},
{
"cell_type": "markdown",
"source": [
"ពីរូបភាពតំណាងទិន្នន័យ ឥឡូវនេះយើងអាចដកចេញគ្រឿងផ្សំដែលមានប្រើប្រាស់ទូទៅបំផុតដែលបង្កើតការយ៉ាងច្របូកច្របល់ចំពោះម្ហូបប្រភេទផ្សេងៗ ដោយប្រើ `dplyr::select()`។\n",
"\n",
"មនុស្សគ្រប់គ្នាស្រឡាញ់អង្ករ ខ្ទឹម និងខ្ញី!\n"
],
"metadata": {
"id": "iO4veMXuIEta"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Drop id column, rice, garlic and ginger from our original data set\r\n",
"df_select <- df %>% \r\n",
" select(-c(1, rice, garlic, ginger))\r\n",
"\r\n",
"# Display new data set\r\n",
"df_select %>% \r\n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "iHJPiG6rIUcK"
}
},
{
"cell_type": "markdown",
"source": [
"## ការប្រមូលផ្តុំទិន្នន័យជាមុនដោយប្រើរូបមន្ត 👩‍🍳👨‍🍳 - គ្រប់គ្រងទិន្នន័យមិនស្មើគ្នា ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/recipes.186acfa8ed2e8f00.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>សិល្បៈដោយ @allison_horst</figcaption>\n",
"\n",
"ដោយសារមេរៀននេះជារឿងអំពីម្ហូបសេប, យើងត្រូវតែដាក់ `recipes` ទៅក្នុងបរិបទ។\n",
"\n",
"Tidymodels ផ្ដល់នូវកញ្ចប់មួយទៀតដែលគួរអោយចាប់អារម្មណ៍: `recipes`- កញ្ចប់សម្រាប់ការប្រមូលផ្តុំទិន្នន័យជាមុន។\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"ចង់មើលការចែកចាយនៃម្ហូបរបស់យើងម្តងទៀត។\n"
],
"metadata": {
"id": "6l2ubtTPJAhY"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"old_label_count <- df_select %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"old_label_count"
],
"outputs": [],
"metadata": {
"id": "1e-E9cb7JDVi"
}
},
{
"cell_type": "markdown",
"source": [
"ដូចដែលអ្នកអាចមើលឃើញ មានការចែកចាយមិនស្មើគ្នាក្នុងចំនួនម្ហូបអាហារ។ ម្ហូបអាហារកូរ៉េប្រហែលជា ៣ ដងនៃម្ហូបអាហារថៃ។ ទិន្នន័យមិនស្មើគ្នានេះជារឿយៗធ្វើឲ្យមានផលប៉ះពាល់អវិជ្ជមានទៅលើការបង្ហាត់ម៉ូដែល។ ពិចារណាពីការបែងចែកពីរប្រភេទ។ ប្រសិនបើទិន្នន័យភាគច្រើនរបស់អ្នកជាប្រភេទមួយម៉ូដែល ML នឹងទាយយ៉ាងច្រើននូវប្រភេទនោះ ដោយសារតែមានទិន្នន័យច្រើនសម្រាប់វា។ ការតុល្យភាពទិន្នន័យជួយយកទិន្នន័យដែលត្រូវបានព្យួរជ្រុង និងជួយដកចេញពីភាពមិនស្មើគ្នានេះ។ ម៉ូដែលជាច្រើនមានសមត្ថភាពល្អបំផុតនៅពេលចំនួនការសង្កេតឃើញស្មើគ្នា ហើយដូច្នេះ លំបាកចំពោះទិន្នន័យមិនស្មើគ្នា។\n",
"\n",
"មានវិធីធំៗពីរដើម្បីដោះស្រាយបញ្ហាទិន្នន័យមិនស្មើគ្នា៖\n",
"\n",
"- បន្ថែមការសង្កេតទៅក្នុងប្រភេទតិច: `ការបន្ថែមទិន្នន័យ` ឧ. ប្រើអាល់ហ្គរីធึម SMOTE\n",
"\n",
"- ដកការសង្កេតចេញពីប្រភេទភាគច្រើន: `ការកាត់បន្ថយទិន្នន័យ`\n",
"\n",
"ឥឡូវនេះយើងនឹងបង្ហាញទ្រង់ទ្រាយធ្វើដូចម្ដេចដើម្បីដោះស្រាយបញ្ហាទិន្នន័យមិនស្មើគ្នាប្រើ `recipe`។ ឯកសារ recipe អាចគិតថាជារូបរាងសម្រាប់ពិពណ៌នាពីជំហានជាក់លាក់ដែលគួរត្រូវបានអនុវត្តលើទិន្នន័យ ដើម្បីធ្វើឲ្យវាត្រៀមសម្រាប់វិភាគទិន្នន័យ។\n"
],
"metadata": {
"id": "soAw6826JKx9"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load themis package for dealing with imbalanced data\r\n",
"library(themis)\r\n",
"\r\n",
"# Create a recipe for preprocessing data\r\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n",
" step_smote(cuisine)\r\n",
"\r\n",
"cuisines_recipe"
],
"outputs": [],
"metadata": {
"id": "HS41brUIJVJy"
}
},
{
"cell_type": "markdown",
"source": [
"ចង់បំបែកជំហានដំបូងនៃការកំណត់ទិន្នន័យរបស់យើង។\n",
"\n",
"- ការហៅ `recipe()` ជាមួយនឹងរូបមន្តបានប្រាប់ឱ្យ recipe ស្គាល់ *តួនាទី* នៃអថេរជាមួយ `df_select` ទិន្នន័យជាគន្លងយោង។ ឧទាហរណ៍ជួរដេក `cuisine` ត្រូវបានផ្ដល់តួនាទីជា `outcome` ខណៈជួរដេកផ្សេងទៀតត្រូវបានផ្ដល់តួនាទីជា `predictor`។\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) បង្កើត *កំណត់បែបបទ* នៃជំហាន recipe មួយដែលបង្កើតឧទាហរណ៍ថ្មីៗនៃថ្នាក់តិចចំនួនដោយប្រើអ្នកជិតខាងបំផុតនៃករណីទាំងនេះ។\n",
"\n",
"ឥឡូវនេះ ប្រសិនបើយើងចង់មើលទិន្នន័យដែលបានកំណត់រួចជាមុន ត្រូវតែ [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) និង [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) recipe របស់យើង។\n",
"\n",
"`prep()`: ประมาณค่าพารามิเตอร์ที่จำเป็นจากชุดฝึกซ้อมที่สามารถนำไปใช้กับชุดข้อมูลอื่นได้ในภายหลัง។\n",
"\n",
"`bake()`: យក recipe ដែលបានកំណត់រួចហើយដាក់អនុវត្តលើគ្រប់សំណុំទិន្នន័យមួយណា។\n"
],
"metadata": {
"id": "Yb-7t7XcJaC8"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Prep and bake the recipe\r\n",
"preprocessed_df <- cuisines_recipe %>% \r\n",
" prep() %>% \r\n",
" bake(new_data = NULL) %>% \r\n",
" relocate(cuisine)\r\n",
"\r\n",
"# Display data\r\n",
"preprocessed_df %>% \r\n",
" slice_head(n = 5)\r\n",
"\r\n",
"# Quick summary stats\r\n",
"preprocessed_df %>% \r\n",
" introduce()"
],
"outputs": [],
"metadata": {
"id": "9QhSgdpxJl44"
}
},
{
"cell_type": "markdown",
"source": [
"ឥឡូវនេះយើងចាំពិនិត្យចែកចាយម្ហូបអាហាររបស់យើង ហើយប្រៀបធៀបវាជាមួយទិន្នន័យដែលមានការមិនសមតុល្យ។\n"
],
"metadata": {
"id": "dmidELh_LdV7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"new_label_count <- preprocessed_df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"list(new_label_count = new_label_count,\r\n",
" old_label_count = old_label_count)"
],
"outputs": [],
"metadata": {
"id": "aSh23klBLwDz"
}
},
{
"cell_type": "markdown",
"source": [
"យឹម! ទិន្នន័យនេះឆ្ងាយ និងស្អាត, មានតុល្យភាព ហើយឆ្ងាញ់ណាស់ 😋!\n",
"\n",
"> ជាច្បាប់, រេស៊ីពីជាមធ្យោបាយមួយសម្រាប់ការរៀបចំទិន្នន័យដែលវាកំណត់ថា តើជំហានណាខ្លះដែលគួរត្រូវអនុវត្តទៅលើសំណុំទិន្នន័យ ដើម្បីធ្វើឱ្យវាម្រាមម៉ូនសម្រាប់ការគំរូ។ ក្នុងករណីនោះ, `workflow()` ជាទូទៅត្រូវបានប្រើ (ដូចដែលយើងបានឃើញក្នុងមេរៀនមុនៗរបស់ពួកយើង) ជំនួសការប៉ាន់ប្រមាណរេស៊ីពីដោយដៃ។\n",
">\n",
"> ដូច្នេះ អ្នកមិនអាចត្រូវការប្រើ **`prep()`** និង **`bake()`** ជារេស៊ីពីនៅពេលប្រើ tidymodels ប៉ុន្តែវាជាភាសារបស់ឧបករណ៍មួយ ដើម្បីផ្ទៀងផ្ទាត់ថារេស៊ីពីកំពុងធ្វើអ្វីដែលអ្នករំពឹងទុក ដូចក្នុងករណីរបស់យើង។\n",
">\n",
"> នៅពេលដែលអ្នក **`bake()`** រេស៊ីពីដែលបានរៀបចំជាមួយ **`new_data = NULL`**, អ្នកនឹងទទួលបានទិន្នន័យដែលអ្នកបានផ្ដល់ពេលកំណត់រេស៊ីពីត្រឡប់មកវិញ ប៉ុន្តែបានរត់តាមជំហាននៃការរៀបចំជាមុន។\n",
"\n",
"ឥឡូវនេះ ចូរកត់ត្រា ចម្លងទិន្នន័យនេះសម្រាប់ប្រើនៅមេរៀននាពេលអនាគត៖\n"
],
"metadata": {
"id": "HEu80HZ8L7ae"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Save preprocessed data\r\n",
"write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")"
],
"outputs": [],
"metadata": {
"id": "cBmCbIgrMOI6"
}
},
{
"cell_type": "markdown",
"source": [
"CSV ថ្មីនេះឥឡូវនេះអាចរកឃើញនៅក្នុងថតទិន្នន័យដើម។\n",
"\n",
"**🚀ការ​ប្រកួតប្រជែង**\n",
"\n",
"មេរៀននេះមានសំណុំនៃទិន្នន័យច្រើននាក់ដែលគួរឱ្យចាប់អារម្មណ៍។ សូមស្វែងរកក្នុងថត `data` ហើយមើលថាតើមានទិន្នន័យណាដែលសមស្របសម្រាប់ការធ្វើចំណាត់ថ្នាក់ពីរភាគ ឬចំណាត់ថ្នាក់ច្រើនជំពូកទេ? តើអ្នកនឹងសួរបញ្ហាអ្វីពីទិន្នន័យនេះ?\n",
"\n",
"## [**ភាសាការប្រលងក្រោយមេរៀន**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **ការត្រួតពិនិត្យ & ការសិក្សាឯកត្ត**\n",
"\n",
"- សូមពិនិត្យមើល [package themis](https://github.com/tidymodels/themis)។ តើយុទ្ធសាស្ត្រផ្សេងទៀតណាអាចប្រើដើម្បីដោះស្រាយបញ្ហាទិន្នន័យមិនសមមាត្របាន?\n",
"\n",
"- គេហទំព័រយោងរបស់ម៉ូដែល Tidy [reference website](https://www.tidymodels.org/start/)។\n",
"\n",
"- H. Wickham និង G. Grolemund, [*R សម្រាប់វិទ្យាសាស្ត្រទិន្នន័យ៖ ការមើលឃើញ, ម៉ូដែល, ការបំលែង, ការរៀបចំ, និងការនាំចូលទិន្នន័យ*](https://r4ds.had.co.nz/)។\n",
"\n",
"#### អរគុណចំពោះ៖\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) សម្រាប់ការបង្កើតរូបភាពដ៏អស្ចារ្យដែលធ្វើឲ្យ R កាន់តែស្វាគមន៍ និងមានភាពទាក់ទាញ។ សូមរករូបភាពបន្ថែមតាម [កម្រងរូបភាពរបស់នាង](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM)។\n",
"\n",
"[Cassie Breviu](https://www.twitter.com/cassieview) និង [Jen Looper](https://www.twitter.com/jenlooper) សម្រាប់ការបង្កើតជំនាន់ Python ដើមនៃមូឌុលនេះ ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/r_learners_sm.cd14eb3581a9f28d.webp\"\n",
" width=\"600\"/>\n",
" <figcaption>សិល្បៈដោយ @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការព្រមាន**៖ \nឯកសារនេះត្រូវបានប្រែសម្រួលដោយប្រើប្រាស់សេវាកម្មប្រែសម្រួល AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈ​ពេល​យើង​ព្យាយាម​ក្នុង​ការ​ធានា​នៃភាពត្រឹមត្រូវ សូម​ជ្រាប​ថា​ការ​ប្រែសម្រួល​ស្វ័យប្រវត្តិ​អាច​មាន​កំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើម​នៅ​ភាសា​ដើម​គួរត្រូវ​បាន​គេ​កត់សម្គាល់​ថា​ជា​ប្រភព​ត្រឹមត្រូវ​និង​អ្នកមានអំណាច។ សម្រាប់​ព័ត៌មាន​សំខាន់ៗ ការប្រែសម្រួល​ដោយមនុស្ស​វិជ្ជាជីវៈ​ត្រូវបាន​សូម​ផ្តល់អាទិភាព។ យើងមិនទទួលខុសត្រូវចំពោះ​ការ​យល់ខុស ឬ​ការ​បំភាន់​ដែលបណ្តាលមកពី​ការ​ប្រើប្រាស់​ការ​ប្រែសម្រួល​នេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,250 @@
# កម្មវិធីចាត់ថ្នាក់ម្ហូបចំណី 1
នៅក្នុងមេរៀននេះ អ្នកនឹងប្រើទិន្នន័យដែលអ្នកបានរក្សាទុកពីមេរៀនមុន ដែលពេញជាមួយទិន្នន័យត្រឹមត្រូវ ស្អាត និងទាក់ទងនឹងម្ហូបចំណីទាំងអស់។
អ្នកនឹងប្រើទិន្នន័យនេះជាមួយកម្មវិធីចាត់ថ្នាក់មុខជាច្រើន ដើម្បី _ធ្វើការប៉ាន់ស្មានម្ហូបជាតិនាក់ជាក់លាក់ដោយផ្អែកលើក្រុមគ្រឿងផ្សំមួយ_. ខណៈពេលធ្វើម្តងនេះ អ្នកនឹងរៀនបន្ថែមអំពីវិធីដែលអាល់ហ្គូរីធម៌អាចប្រើបានសម្រាប់ភារកិច្ចចាត់ថ្នាក់។
## [មេរៀនជំនួញមុន](https://ff-quizzes.netlify.app/en/ml/)
# ការរៀបចំ
សន្មតបើអ្នកបានបញ្ចប់ [មេរៀនទី 1](../1-Introduction/README.md) សូមប្រាកដថាឯកសារ _cleaned_cuisines.csv_ មាននៅក្នុងថតឫស `/data` សម្រាប់មេរៀនបួននេះ។
## លំហាត់ - ប៉ាន់ស្មានម្ហូបជាតិនាក់
1. ធ្វើការងារនៅក្នុងថត _notebook.ipynb_ របស់មេរៀននេះ ដើម្បីនាំចូលឯកសារនោះជាមួយបណ្ណាល័យ Pandas៖
```python
import pandas as pd
cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
cuisines_df.head()
```
ទិន្នន័យមានរូបរាងដូចខាងក្រោម៖
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
1. ឥឡូវនេះ នាំចូលបណ្ណាល័យបន្ថែមមួយចំនួនទៀត៖
```python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
from sklearn.svm import SVC
import numpy as np
```
1. បំបែកកូអរដោនាតេ X និង y ទៅជាdfពីរប្រភេទសម្រាប់ហ្វឹកហាត់។ `cuisine` អាចជាដាតាហ្វ្រេសសម្រាប់ស្លាក៖
```python
cuisines_label_df = cuisines_df['cuisine']
cuisines_label_df.head()
```
វានឹងមានរូបរាងដូចខាងក្រោម៖
```output
0 indian
1 indian
2 indian
3 indian
4 indian
Name: cuisine, dtype: object
```
1. លុបជួរឈរដែលមានឈ្មោះ `Unnamed: 0` និងជួរឈរ `cuisine` ដោយហៅ `drop()`។ រក្សាទុកទិន្នន័យសល់ជាលក្ខណៈសម្បត្តិសម្រាប់ហ្វឹកហាត់៖
```python
cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
cuisines_feature_df.head()
```
លក្ខណៈសម្បត្តិរបស់អ្នកមានរូបរាងដូចខាងក្រោម៖
| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
ឥឡូវអ្នករួចរាល់សម្រាប់ហ្វឹកហាត់ម៉ូដែលរបស់អ្នកហើយ!
## ការជ្រើសរើសកម្មវិធីចាត់ថ្នាក់
ឥឡូវនេះទិន្នន័យរបស់អ្នកបានស្អាត និងរួចរាល់សម្រាប់ហ្វឹកហាត់ អ្នកត្រូវតែសម្រេចថា អាល់ហ្គូរីធម៌ណាដែលត្រូវប្រើសម្រាប់ភារកិច្ចនេះ។
Scikit-learn ដាក់ក្រុមការចាត់ថ្នាក់នៅក្រោមការសិក្សាប្រភេទៈអនុគ្រោះ (Supervised Learning) ហើយក្នុងប្រភេទនោះ អ្នកនឹងរកឃើញវិធីជាច្រើនសម្រាប់ចាត់ថ្នាក់។ [ភាពខុសគ្នា](https://scikit-learn.org/stable/supervised_learning.html) គឺអាចធ្វើអោយច្របូកច្របល់នៅដំណើរមុន។ វិធីសាស្រ្តខាងក្រោមទាំងអស់រួមបញ្ចូលបច្ចេកទេសចាត់ថ្នាក់៖
- ម៉ូដែលបន្ទាត់
- ម៉ាស៊ីនគាំទ្រតំបន់
- ការវិលត្រឡប់ក្រាដីអង់តឹកប្លូ
- មិត្តជិតខាង
- ដំណើរការហ្គោស៊ីយ៉ង់
- រុក្ខជាតិនិរន្តរភាព
- វិធីសាស្រ្តក្រុម (voting Classifier)
- អាល់ហ្គូរីធម៌ច្រើនថ្នាក់ និងច្រើនប្រភេទលទ្ធផល (multiclass and multilabel classification, multiclass-multioutput classification)
> អ្នកក៏អាចប្រើ [បណ្ដាញណឺរ៉ាល់សម្រាប់ចាត់ថ្នាក់ទិន្នន័យ](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification) ដែរ ប៉ុន្តែវាអ្នកខុសពីស៊ក្តមេរៀននេះ។
### តើត្រូវជ្រើសរើសកម្មវិធីចាត់ថ្នាក់ណា?
ដូច្នេះ អ្នកគួរជ្រើសរើសកម្មវិធីចាត់ថ្នាក់ណា? ជាញឹកញាប់ ការរត់តាមកម្មវិធីជាច្រើន ហើយសំរាប់ស្វែងរកលទ្ធផលល្អគឺជាវិធីសាកល្បងមួយ។ Scikit-learn នាំមកនូវ [ការប្រៀបធៀបប្រភេទជាក្បាលតាបផ្ទាំង](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) លើទិន្នន័យដែលបានបង្កើត ជាមួយទម្រង់ KNeighbors, SVC ជាផ្លូវពីរប្រភេទ, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB និង QuadraticDiscrinationAnalysis បង្ហាញលទ្ធផលជាមួយនឹងរូបភាព៖
![ការប្រៀបធៀបកម្មវិធីចាត់ថ្នាក់](../../../../translated_images/km/comparison.edfab56193a85e7f.webp)
> គំនូសបង្ហាញត្រូវបានបង្កើតនៅលើឯកសារណែនាំរបស់ Scikit-learn
> AutoML ដំណោះស្រាយបញ្ហានេះយ៉ាងត្រឹមត្រូវដោយរត់ការប្រៀបធៀបទាំងនេះនៅលើពពក អនុញ្ញាតឱ្យអ្នកជ្រើសរើសអាល់ហ្គូរីធម៌ល្អបំផុតសម្រាប់ទិន្នន័យរបស់អ្នក។ សូមសាកល្បង [នៅទីនេះ](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott)
### វិធីល្អជាងនេះ
វិធីល្អជាងការប៉ាន់ស្មានបែបចល័ត គឺតាមដានគំនិតនៅលើ [ប័ណ្ណ Cheat សម្រាប់ ML](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott) ដែលអាចទាញយកបាន។ នៅទីនេះ យើងស្វែងឃើញថា សម្រាប់បញ្ហាច្រើនថ្នាក់ អ្នកមានជម្រើសខ្លះ៖
![សៀវភៅបង្រៀនសម្រាប់បញ្ហាច្រើនថ្នាក់](../../../../translated_images/km/cheatsheet.07a475ea444d2223.webp)
> ផ្នែកមួយនៃសៀវភៅ Cheat Algorithm របស់ Microsoft សង្ខេបជម្រើសចាត់ថ្នាក់ច្រើនថ្នាក់
✅ ទាញយកសៀវភៅ Cheat នេះ ព្រីនភ្លាម ហើយដាក់វាឲ្យនៅលើជញ្ជាំងផ្ទះរបស់អ្នក!
### ការពន្យល់
មកមើលថាតើយើងអាចពន្យល់វិធីនានាក្រោមកំណត់តម្រូវបានណា៖
- **បណ្ដាញណឺរ៉ែលធ្ងន់ពេក**។ ប្រភេទទិន្នន័យស្អាត ប៉ុន្តិល្អិត បូកនឹងការដំណើរការហ្វឹកហាត់នៅក្នុងកុំព្យូទ័រសៀមទារគន៍ បណ្ដាញណឺរ៉េលធ្ងន់ពេកសម្រាប់ភារកិច្ចនេះ។
- **គ្មានកម្មវិធីចាត់ពីរថ្នាក់**។ យើងមិនប្រើកម្មវិធីចាត់ពីរថ្នាក់ទេ ដូច្នេះមិនអាចប្រើ one-vs-all បាន។
- **រុក្ខជាតិចំណេក ឬបម្រែបម្រួលលូជាក់លាក់អាចបានប្រើ**។ រុក្ខជាតិនិរន្តរភាពអាចធ្វើការ ឬបម្រែបម្រួលលូជាក់លាក់សម្រាប់ទិន្នន័យច្រើនថ្នាក់។
- **រុក្ខជាតិចំណេកបង្រៀបពហុថ្នាក់ដោះស្រាយបញ្ហាផ្សេង**។ រុក្ខជាតិចំណេកបង្រៀបពហុថ្នាក់សមស្របសម្រាប់ភារកិច្ចមិនប៉ារ៉ាម៉ែត្រ ឧ. សម្រាប់សមាសធាតុបង្កើតលំដាប់ ដូច្នេះវាមិនមានអត្ថប្រយោជន៍សម្រាប់យើងទេ។
### ប្រើប្រាស់ Scikit-learn
យើងនឹងប្រើ Scikit-learn សម្រាប់វិភាគទិន្នន័យរបស់យើង។ ទោះជាយ៉ាងណាក៏ដោយ មានវិធីជាច្រើនសម្រាប់ប្រើប្រាស់បម្រែបម្រួលលូជាក់លាក់នៅក្នុង Scikit-learn។ សូមពិនិត្យមើល [ប៉ារ៉ាម៉ែត្រ](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression) ដែលត្រូវបញ្ជូន។
ចម្បងមានប៉ារ៉ាម៉ែត្រ ពីរដ៏សំខាន់ - `multi_class` និង `solver` - ដែលយើងត្រូវកំណត់ ពេលឲ្យ Scikit-learn ធ្វើបម្រែបម្រួលលូជាក់លាក់។ តម្លៃ `multi_class` កំណត់អាកប្បកិរិយាមួយ។ តម្លៃ `solver` ជាអាល់ហ្គូរីធម៌ដែលប្រើប្រាស់។ មិនទាំងអស់លក្ខណៈអាល់ហ្គូរីធម៌អាចប្រើជាមួយ `multi_class` ទាំងអស់បានទេ។
តាមការពិពណ៌នា ក្នុងករណីច្រើនថ្នាក់ អាល់ហ្គូរីធម៌ហ្វឹកហាត់៖
- **ប្រើផែនការមួយ-vs-សល់ (OvR)** ប្រសិនបើជម្រើស `multi_class` ដាក់តម្លៃជា `ovr`
- **ប្រើការបាត់បង់ក្រូសអេនត្រូពី (cross-entropy loss)** ប្រសិនបើជម្រើស `multi_class` ដាក់តម្លៃជា `multinomial`។ (ពេលនេះជម្រើស `multinomial` គឺគ្រប់គ្រងតែដោយ lbfgs, sag, saga និង newton-cg solvers ទេ)"
> 🎓 "ផែនការ" នៅទីនេះអាចជាមួយ ovr (មួយ-vs-សល់) ឬ multinomial។ ព្រោះបម្រែបម្រួលលូជាក់លាក់គឺពិតជាត្រូវបង្កើតសម្រាប់ចំណាត់ថ្នាក់ពីរថ្នាក់ schemes ទាំងនេះអនុញ្ញាតឲ្យវាទ្រទ្រង់ល្អប្រសើរក្នុងរៀបចំច្រើនថ្នាក់បាន។ [ប្រភព](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/)
> 🎓 "Solver" កំណត់ថា "អាល់ហ្គូរីធម៌ដែលត្រូវប្រើក្នុងបញ្ហាគណនា​ងារអុបទីម៉ិច"។ [ប្រភព](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
Scikit-learn ផ្តល់តារាងនេះដើម្បីពន្យល់ពីរបៀបដែល solvers ដោះស្រាយករណីប្រឈមផ្សេងៗរបស់រចនាសម្ព័ន្ធទិន្នន័យផ្ទាំងផ្សេងៗ៖
![solvers](../../../../translated_images/km/solvers.5fc648618529e627.webp)
## លំហាត់ - បំបែកទិន្នន័យ
យើងអាចផ្តោតលើបម្រែបម្រួលលូជាក់លាក់សម្រាប់លំហាត់ហ្វឹកហាត់ដំបូង គឺបានរៀនកន្លងមក។
បំបែកទិន្នន័យរបស់អ្នកជាក្រុមហ្វឺងហ្វឺន និងក្រុមតេស្ត ដោយហៅ `train_test_split()`
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
```
## លំហាត់ - ប្រើបម្រែបម្រួលលូជាក់លាក់
ដោយសារតែអ្នកកំពុងប្រើករណីច្រើនថ្នាក់ អ្នកត្រូវជ្រើសរើស _ផែនការ_ មួយ និង _solver_ មួយ។
ប្រើ LogisticRegression ជាមួយកំណត់ multiclass ហើយជ្រើស `liblinear` solver សម្រាប់ហ្វឹកហាត់។
1. បង្កើតបម្រែបម្រួលលូជាក់លាក់ ដែល `multi_class` ដាក់ `ovr` និង solver ដាក់ `liblinear`
```python
lr = LogisticRegression(multi_class='ovr',solver='liblinear')
model = lr.fit(X_train, np.ravel(y_train))
accuracy = model.score(X_test, y_test)
print ("Accuracy is {}".format(accuracy))
```
✅ សាកល្បង solver ផ្សេងៗដូចជា `lbfgs` ដែលភាគច្រើនត្រូវបានកំណត់ជាធរមាន
> ចំណាំ សូមប្រើ Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) ដើម្បីបង្រួមទិន្នន័យ ប្រសិនបើចាំបាច់។
ភាពត្រឹមត្រូវល្អ ច្រើនជាង **80%**!
1. អ្នកអាចមើលម៉ូដែលនេះដំណើរការដោយសាកល្បងជួរដេក មួយ (#50):
```python
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
print(f'cuisine: {y_test.iloc[50]}')
```
លទ្ធផលត្រូវបានបោះពុម្ព:
```output
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object')
cuisine: indian
```
✅ សាកល្បងជួរឈរផ្សេងៗ ហើយពិនិត្យលទ្ធផល
1. ជ្រាបចូលជាងនេះ អ្នកអាចពិនិត្យមើលភាពត្រឹមត្រូវនៃការទាយនេះ៖
```python
test= X_test.iloc[50].values.reshape(-1, 1).T
proba = model.predict_proba(test)
classes = model.classes_
resultdf = pd.DataFrame(data=proba, columns=classes)
topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])
topPrediction.head()
```
លទ្ធផលត្រូវបានបោះពុម្ព - ម្ហូបឥណ្ឌា គឺជាការសន្និដ្ឋានល្អបំផុត រួមមានប្រហែលមានភាពជាក់លាក់ល្អ៖
| | 0 |
| -------: | -------: |
| indian | 0.715851 |
| chinese | 0.229475 |
| japanese | 0.029763 |
| korean | 0.017277 |
| thai | 0.007634 |
✅ តើអ្នកអាចពន្យល់បានទេថាហេតុអ្វីបានជាគំរូនេះជឿជាក់ថា នេះគឺជាម្ហូបឥណ្ឌា?
1. ទទួលបានព័ត៌មានលម្អិតបន្ថែម ដោយបោះពុម្ពរបាយការណ៍ចាត់ថ្នាក់ ដូចអ្នកបានធ្វើនៅមេរៀនរេហ្គ្រេស្យុង:
```python
y_pred = model.predict(X_test)
print(classification_report(y_test,y_pred))
```
| | precision | recall | f1-score | support |
| ------------ | --------- | ------ | -------- | ------- |
| chinese | 0.73 | 0.71 | 0.72 | 229 |
| indian | 0.91 | 0.93 | 0.92 | 254 |
| japanese | 0.70 | 0.75 | 0.72 | 220 |
| korean | 0.86 | 0.76 | 0.81 | 242 |
| thai | 0.79 | 0.85 | 0.82 | 254 |
| accuracy | 0.80 | 1199 | | |
| macro avg | 0.80 | 0.80 | 0.80 | 1199 |
| weighted avg | 0.80 | 0.80 | 0.80 | 1199 |
## 🚀Challenge
នៅក្នុងមេរៀននេះ អ្នកបានប្រើទិន្នន័យសំអាតរបស់អ្នក ដើម្បីបង្កើតគំរូរៀនម៉ាស៊ីនដែលអាចទាយម្ហូបជាតិសញ្ជាតិមួយដោយផ្អែកលើរបៀបជ្រើសរើសគ្រឿងផ្សំមួយចំនួន។ ចំណាយពេលមួយតិច ដើម្បីអានក្រមជាច្រើនដែល Scikit-learn ផ្តល់ជូនសម្រាប់ចាត់ថ្នាក់ទិន្នន័យ។ ជ្រាបចូលលម្អិតពីមូលដ្ឋាននៃ 'solver' ដើម្បីយល់ពីអ្វីដែលកើតមាននៅខាងក្រោយមុខងារ។
## [តេស្តបន្ទាប់មេរៀន](https://ff-quizzes.netlify.app/en/ml/)
## ពិនិត្យឡើងវិញ និង រៀនដោយខ្លួនឯង
ជ្រាបចូលជ្រៅបន្ថែមពីគណិតវិទ្យាខាងក្រោយលូជាឡូជីស្ទិច regression នៅ [មេរៀននេះ](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf)
## កិច្ចការផ្ទះ
[សិក្សាអំពី solvers](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 @@
# សិក្សាអ្នកដោះស្រាយ
## សេចក្តីណែនាំ
ក្នុងមេរៀននេះ អ្នកបានរៀនអំពីអ្នកដោះស្រាយជាច្រើន ដែលភ្ជាប់អាល់ហ្គារីធម និងដំណើរការសិក្សា​ម៉ាស៊ីន ដើម្បីបង្កើតម៉ូដែលដែលមានភាពត្រឹមត្រូវ។ ដើរឆ្ពោះតាមអ្នកដោះស្រាយដែលបានរាប់បញ្ចូលក្នុងមេរៀន ហើយជ្រើសរើសពីរនាក់។ នៅក្នុងពាក្យរបស់អ្នកផ្ទាល់ ប្រៀបធៀប និងប្រៀបធៀបអ្នកដោះស្រាយទាំងពីរនេះ។ តើពួកគេដោះស្រាយបញ្ហាប្រភេទណា? ពួកគេចុះបញ្ជូលជាមួយជា​ដំនាក់ទំនង​ទិន្នន័យផ្សេងៗដូចម្តេច? ហេតុអ្វីបានជា អ្នកនឹងជ្រើសរើសមួយជំនួសមួយផ្សេងទៀត?
## ប្រភេទវាយតម្លៃ
| ក្រមសីលធម៌ | ល្អឯក | គ្រប់គ្រាន់ | ត្រូវការកែលម្អ |
| -------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------- |
| | មានឯកសារ .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 -->

File diff suppressed because one or more lines are too long

@ -0,0 +1,275 @@
{
"cells": [
{
"source": [
"# សាងសង់ម៉ូដែលចាត់ថ្នាក់\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 1
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.model_selection import train_test_split, cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\n",
"from sklearn.svm import SVC\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 3
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 4
}
],
"source": [
"cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_feature_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Accuracy is 0.8181818181818182\n"
]
}
],
"source": [
"lr = LogisticRegression(multi_class='ovr',solver='liblinear')\n",
"model = lr.fit(X_train, np.ravel(y_train))\n",
"\n",
"accuracy = model.score(X_test, y_test)\n",
"print (\"Accuracy is {}\".format(accuracy))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"ingredients: Index(['artemisia', 'black_pepper', 'mushroom', 'shiitake', 'soy_sauce',\n 'vegetable_oil'],\n dtype='object')\ncuisine: korean\n"
]
}
],
"source": [
"# test an item\n",
"print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')\n",
"print(f'cuisine: {y_test.iloc[50]}')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" 0\n",
"korean 0.392231\n",
"chinese 0.372872\n",
"japanese 0.218825\n",
"thai 0.013427\n",
"indian 0.002645"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>0</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>korean</th>\n <td>0.392231</td>\n </tr>\n <tr>\n <th>chinese</th>\n <td>0.372872</td>\n </tr>\n <tr>\n <th>japanese</th>\n <td>0.218825</td>\n </tr>\n <tr>\n <th>thai</th>\n <td>0.013427</td>\n </tr>\n <tr>\n <th>indian</th>\n <td>0.002645</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 8
}
],
"source": [
"#rehsape to 2d array and transpose\n",
"test= X_test.iloc[50].values.reshape(-1, 1).T\n",
"# predict with score\n",
"proba = model.predict_proba(test)\n",
"classes = model.classes_\n",
"# create df with classes and scores\n",
"resultdf = pd.DataFrame(data=proba, columns=classes)\n",
"\n",
"# create df to show results\n",
"topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])\n",
"topPrediction.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n\n chinese 0.75 0.73 0.74 223\n indian 0.93 0.88 0.90 255\n japanese 0.78 0.78 0.78 253\n korean 0.87 0.86 0.86 236\n thai 0.76 0.84 0.80 232\n\n accuracy 0.82 1199\n macro avg 0.82 0.82 0.82 1199\nweighted avg 0.82 0.82 0.82 1199\n\n"
]
}
],
"source": [
"y_pred = model.predict(X_test)\r\n",
"print(classification_report(y_test,y_pred))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការតាំងបញ្ញត្តិ**៖ \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំប្រឹងប្រែងដើម្បីភាពត្រឹមត្រូវ សូមយល់ដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុស ឬមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាមាត្រប្រភេទរបស់វាគួរត្រូវបានចាត់ទុកជាឯកសារដែលមានអำนិកផ្លូវការជាព្រំដែន។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមអនុវត្តការបកប្រែដោយអ្នកជំនាញមនុស្សផ្ទាល់។ យើងមិនទទួលបន្ទុកចំពោះការយល់ច្រឡំ ឬការបកស្រាយមិនត្រឹមត្រូវណាមួយដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -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 (ពាក្យផ្សេងសម្រាប់ឧបករណ៍ចាត់ថ្នាក់)៖
![ML Map from Scikit-learn](../../../../translated_images/km/map.e963a6a51349425a.webp)
> ទិដ្ឋភាព៖ [ចូលទៅកាន់ផែនទីនេះតាមអនឡាញ](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,159 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# ពង្រីកម៉ូដែលចំណាត់ថ្នាក់\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 9
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 10
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 11
}
],
"source": [
"cuisines_features_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_features_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការបដិសេធ**៖\nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះបីយើងខិតខំប្រឹងប្រែងក្នុងការបំពេញភាពត្រឹមត្រូវក៏ដោយ សូមយល់ព្រមថាការបកប្រែអូតូម៉ាទិចអាចមានកំហុស ឬការមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាដើមគឺជាផ្នែកដែលមានអំណាចខ្ពស់បំផុត សម្រាប់ព័ត៌មានសំខាន់ សូមយកការបកប្រែដោយអ្នកជំនាញមនុស្សជាដំណោះស្រាយ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -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,648 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "lesson_12-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": [
"# បង្កើតម៉ូដែលច្នៃប្រឌិតចំណាត់ថ្នាក់៖ ម្ហូបអាស៊ី និងឥណ្ឌាដែលឆ្ងាញ់\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HD54bEefgtNO"
},
"source": [
"## ម៉ាស៊ីនចំនួនចំណាត់ថ្នាក់ចំណីអាហារ 2\n",
"\n",
"នៅមេរៀនចំណាត់ថ្នាក់ទីពីរនេះ យើងនឹងស្វែងយល់អំពី `វិធីផ្សេងទៀត` ដើម្បីចាត់ថ្នាក់ទិន្នន័យប្រភេទកាតេហ្គូរិ។ យើងនឹងរៀនអំពីផលប៉ះពាល់នៃការជ្រើសរើសម៉ាស៊ីនចំណាត់ថ្នាក់មួយប្រសិនបើប្រៀបធៀបនឹងម៉ាស៊ីនដទៃទៀតផងដែរ។\n",
"\n",
"### [**ប្រលងមុនបង្រៀន**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
"\n",
"### **លក្ខខណ្ឌមុន**\n",
"\n",
"យើងសន្មត់ថាអ្នកបានបញ្ចប់មេរៀនមុននេះហើយ ព្រោះយើងនឹងបន្តយកមកប្រើប្រាស់កន្លែងខ្លះៗដែលយើងបានរៀនមុន។\n",
"\n",
"សម្រាប់មេរៀននេះ យើងត្រូវការបណ្ណាល័យដូចខាងក្រោម៖\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) គឺជាក្រោមស្ទូមបណ្ណាល័យ R ដែលបង្កើតឡើងដើម្បីធ្វើឱ្យវិទ្យាសាស្រ្តទិន្នន័យរហ័សលឿន ស្រួល និងរីករាយជាងមុន!\n",
"\n",
"- `tidymodels`: សំណុំបណ្ណាល័យ [tidymodels](https://www.tidymodels.org/) គឺជាគោលការណ៍ នៃការប្រមូលផ្តុំបណ្ណាល័យសម្រាប់ម៉ូឌែល និងសិក្សាវីលម៉ាស៊ីន។\n",
"\n",
"- `themis`: បណ្ណាល័យ [themis](https://themis.tidymodels.org/) ផ្តល់ជំនួយក្នុងការបន្ថែមជំហានលើការដោះស្រាយទិន្នន័យមិនស្មើជាមួយ។\n",
"\n",
"អ្នកអាចដំឡើងវាបាន ដូច្នេះ៖\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
"\n",
"ជាជម្រើសមួយទៀត កូដខាងក្រោមនេះពិនិត្យថាតើអ្នកមានបណ្ណាល័យដែលចាំបាច់សម្រាប់បញ្ចប់មេរៀននេះរួចមែនទេ បើយ៉ាងហោចណាស់វានឹងដំឡើងអោយអ្នកប្រសិនបើវាបាត់បង់។\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vZ57IuUxgyQt"
},
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load(tidyverse, tidymodels, themis, kernlab, ranger, xgboost, kknn)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "z22M-pj4g07x"
},
"source": [
"ឥឡូវនេះ យើងចាប់ផ្តើមភ្លាមៗ!\n",
"\n",
"## **1. ផែនទីចំណាត់ថ្នាក់**\n",
"\n",
"នៅក្នុង [មេរៀនមុនរបស់យើង](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1) យើងបានព្យាយាមឆ្លើយសំណួរ៖ តើយើងត្រូវជ្រើសរើសរវាងម៉ូដែលជាច្រើនយ៉ាងដូចម្តេច? ក្នុងការធ្វើដូចនេះ សម្រាប់ភាគច្រើន វាអាស្រ័យលើលក្ខណៈរបស់ទិន្នន័យ និងប្រភេទបញ្ហាដែលយើងចង់ដោះស្រាយ (ឧទាហរណ៍ ចំណាត់ថ្នាក់ឬវិភាគជំហាន?)\n",
"\n",
"មុននេះ យើងបានរៀនអំពីជម្រើសនានាដែលអ្នកមានពេលចាត់ថ្នាក់ទិន្នន័យដោយប្រើសន្លឹកបន្លឺរបស់ Microsoft។ ស៊ុមម៉ាស៊ីនរៀនរបស់ Python ដែលមានឈ្មោះ Scikit-learn ផ្តល់ជូនសន្លឹកបន្លឺដដែល តែមានលំដាប់លម្អិតបន្ថែម ដែលអាចជួយបង្ហាញដល់អ្នកកាន់តែត្រឹមត្រូវចំពោះអ្នកប៉ាន់ស្មាន (ពាក្យផ្សេងមួយសម្រាប់អ្នកចាត់ថ្នាក់)។\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/map.e963a6a51349425a.webp\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1i3xRIVg7vG"
},
"source": [
"> យោបល់៖ [ចូលទៅកាន់ផែនទីនេះតាមអ៊ិនធឺរណិត](https://scikit-learn.org/stable/tutorial/machine_learning_map/) ហើយចុចតាមផ្លូវដើម្បីអានឯកសារ។\n",
">\n",
"> គេហទំព័រ [អ្នកយោង Tidymodels](https://www.tidymodels.org/find/parsnip/#models) ក៏ផ្តល់ឯកសារល្អឥតខ្ចោះអំពីប្រភេទគំរូផ្សេងៗ។\n",
"\n",
"### **ផែនការ** 🗺️\n",
"\n",
"ផែនទីនេះមានប្រយោជន៍ខ្លាំងពេលអ្នកមានការយល់ដឹងច្បាស់លាស់ពីទិន្នន័យរបស់អ្នក ដើម្បីអ្នកអាច 'ដើរ' តាមផ្លូវរបស់វាទៅកាន់ការសម្រេចចិត្ត៖\n",
"\n",
"- យើងមាន \\>50 នៃគំរូ\n",
"\n",
"- យើងចង់ទាយថាភាពជាប្រភេទណាមួយ\n",
"\n",
"- យើងមានទិន្នន័យដែលបានតម្រៀបស្លាក\n",
"\n",
"- យើងមានគំរូតិចជាង 100K\n",
"\n",
"- ✨ យើងអាចជ្រើសយក Linear SVC\n",
"\n",
"- ប្រសិនបើវាមិនដំណើរការ តែព្រោះយើងមានទិន្នន័យលេខ\n",
"\n",
" - យើងអាចសាកល្បង ✨ KNeighbors Classifier\n",
"\n",
" - ប្រសិនបើវាមិនដំណើរការ សាកល្បង ✨ SVC និង ✨ Ensemble Classifiers\n",
"\n",
"នេះជារបៀបតាមដានដែលមានប្រយោជន៍ខ្លាំង។ ឥឡូវនេះ យើងចាប់ផ្តើមដោយប្រើ [tidymodels](https://www.tidymodels.org/) ស៊េរីម៉ូឌែល ដែលជាសំណុំប្រព័ន្ធ R ដែលមានរបៀបច្បាស់លាស់ និងមានភាពបត់បែនដែលបានបង្កើតឡើងដើម្បីលើកទឹកចិត្តអនុវត្តន៍ស្ថិតិសាស្ត្រល្អ 😊។\n",
"\n",
"## 2. បំបែកទិន្នន័យ និងដោះស្រាយបញ្ហាទិន្នន័យមិនសមម តម្រូវ។\n",
"\n",
"ពីមេរៀនមុនៗ យើងបានរៀនថានៅក្នុងម្ហូបមានសមាសធាតុទូទៅមួយចំនួន។ ផងដែរ ទេពកោសល្យនៃចំនួនម្ហូបមានការបែងចែកមិនសមស្រប។\n",
"\n",
"យើងនឹងដោះស្រាយរឿងនេះដោយ\n",
"\n",
"- លុបចោលសមាសធាតុំសហច្រើនបំផុតដែលបង្កើតភាពច្របូកច្របល់ក្នុងចន្លោះម្ហូបផ្សេងៗ ដោយប្រើ `dplyr::select()`។\n",
"\n",
"- ប្រើ `recipe` ដែលដំណើរការព្រមព្រៀងទិន្នន័យត្រៀមសម្រាប់ម៉ូឌែល ដោយអនុវត្តវិធីសាស្រ្ត `over-sampling`។\n",
"\n",
"យើងបានមើលរឿងខាងលើនៅក្នុងមេរៀនមុនទេ ដូច្នេះវាគួរតែស្រួលណាស់ 🥳!\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6tj_rN00hClA"
},
"source": [
"# Load the core Tidyverse and Tidymodels packages\n",
"library(tidyverse)\n",
"library(tidymodels)\n",
"\n",
"# Load the original cuisines data\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\n",
"\n",
"# Drop id column, rice, garlic and ginger from our original data set\n",
"df_select <- df %>% \n",
" select(-c(1, rice, garlic, ginger)) %>%\n",
" # Encode cuisine column as categorical\n",
" mutate(cuisine = factor(cuisine))\n",
"\n",
"\n",
"# Create data split specification\n",
"set.seed(2056)\n",
"cuisines_split <- initial_split(data = df_select,\n",
" strata = cuisine,\n",
" prop = 0.7)\n",
"\n",
"# Extract the data in each split\n",
"cuisines_train <- training(cuisines_split)\n",
"cuisines_test <- testing(cuisines_split)\n",
"\n",
"# Display distribution of cuisines in the training set\n",
"cuisines_train %>% \n",
" count(cuisine) %>% \n",
" arrange(desc(n))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zFin5yw3hHb1"
},
"source": [
"### ដោះស្រាយជាមួយទិន្នន័យដែលមិនសមភាព\n",
"\n",
"ទិន្នន័យដែលមិនសមភាពជាញឹកញាប់មានផលប៉ះពាល់អវិជ្ជមានលើការប្រតილពកម្មរបស់ម៉ូឌែល។ ម៉ូឌែលជាច្រើនអនុវត្តបានល្អបំផុតពេលដែលចំនួនការសង្កេតស្មើគ្នា ហើយ ដូច្នេះ មិនងាយស្រួលជាមួយទិន្នន័យមិនសមភាពឡើយ។\n",
"\n",
"មានវិធីធំៗពីរចម្បងសម្រាប់ដោះស្រាយទិន្នន័យមិនសមភាព៖\n",
"\n",
"- បន្ថែមការសង្កេតទៅក្នុងថ្នាក់តិច: `Over-sampling` ឧ. ប្រើអាល់ហ្គរីថម SMOTE ដែលបង្កើតគំរូថ្មីៗក្នុងថ្នាក់តិចដោយប្រើអ្នកជិតខាងដ៏នៅជិតបំផុតនៃករណីទាំងនេះ។\n",
"\n",
"- លុបការសង្កេតចេញពីថ្នាក់ធំ: `Under-sampling`\n",
"\n",
"នៅមេរៀនមុន យើងបានបង្ហាញពីវិធីដោះស្រាយទិន្នន័យមិនសមភាពដោយប្រើ `recipe`។ recipe អាចគិតថាជាផែនការដែលពិពណ៌នាថាតើជំហានអ្វីខ្លះគួរត្រូវអនុវត្តទៅលើសំណុំទិន្នន័យមួយ ដើម្បីធ្វើឱ្យវាត្រូវបានរៀបចំសម្រាប់វិភាគទិន្នន័យ។ ក្នុងករណីរបស់យើង យើងចង់មានការចែកចាយស្មើគ្នានៅចំនួនសំណុំម្ហូបសម្រាប់ `training set` របស់យើង។ យលង់ចូលទៅក្នុងវា។\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "cRzTnHolhLWd"
},
"source": [
"# Load themis package for dealing with imbalanced data\n",
"library(themis)\n",
"\n",
"# Create a recipe for preprocessing training data\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>%\n",
" step_smote(cuisine) \n",
"\n",
"# Print recipe\n",
"cuisines_recipe"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KxOQ2ORhhO81"
},
"source": [
"ឥឡូវនេះយើងបានរួចរាល់ក្នុងការបណ្តុះម៉ូឌែលហើយ 👩‍💻👨‍💻!\n",
"\n",
"## 3. លើសពីម៉ូឌែលមូលដ្ឋានពហុនិម្មិត\n",
"\n",
"ក្នុងบทเรียนមុនរបស់យើង យើងបានសិក្សាអំពីម៉ូឌែលមូលដ្ឋានពហុនិម្មិត។ យើងនឹងស្រាវជ្រាវម៉ូឌែលបត់បែនផ្សេងទៀតសម្រាប់ការបែងចែកចំណាត់ថ្នាក់។\n",
"\n",
"### សំណុំគ្រឿងចក្រ Vector Support\n",
"\n",
"នៅក្នុងបរិបទនៃការបែងចែកចំណាត់ថ្នាក់, `Support Vector Machines` ជាបច្ចេកទេសរៀនម៉ាស៊ីនមួយដែលព្យាយាមរក *hyperplane* ដែល \"ល្អបំផុត\" ក្នុងការបំបែកចំណាត់ថ្នាក់ទៅជា​ថ្នាក់ផ្សេងៗ។ យើងមកមើលឧទាហរណ៍សាមញ្ញមួយ៖\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/svm.621ae7b516d678e0.webp\"\n",
" width=\"300\"/>\n",
" <figcaption>https://commons.wikimedia.org/w/index.php?curid=22877598</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "C4Wsd0vZhXYu"
},
"source": [
"H1~ មិនបំបែកថ្នាក់ដទៃ។ H2~ បំបែក ដោយទម្លាក់តិចតួចប៉ុណ្ណោះ។ H3~ បំបែកពួកវា ជាមួយទម្លាក់អតិបរមា។\n",
"\n",
"#### កម្មវិធីចម្លើយអនុគមន៍គូសអថេរបន្សំសេរី\n",
"\n",
"ការចម្រាញ់គំរូបញ្ជាក់-គូសអថេរ (SVC) គឺជាកូនក្រុមនៃគ្រួសារម៉ាស៊ីនបញ្ជាក់-គូសអថេរនៃបច្ចេកទេសML។ ក្នុង SVC អាក្សរ​ទំព័រត្រូវបានជ្រើសរើសដើម្បីបំបែកបានត្រឹមត្រូវទៅលើការសង្កេតមើលកំណត់ភាគច្រើនក្នុងការបណ្តុះបណ្តាល ប៉ុន្តែអាចកំហុសចំពោះការសង្កេតមើលខ្លះ។ ដោយអនុញ្ញាតឲ្យចំណុចខ្លះស្ថិតនៅផ្នែកខុស អេសវីអំ (SVM) ក្លាយជារឹងមាំបន្ថែមចំពោះចំណុចក្រៅដែន ដែលនាំឲ្យមានការជាក់លើទៅលើទិន្នន័យថ្មីបានកាន់តែប្រសើរ។ ប៉ារ៉ាម៉ែត្រដែលគ្រប់គ្រងការរំលោភនេះ ត្រូវបានហៅថា `cost` ដែលមានតម្លៃលំនាំដើម 1 (សូមមើល `help(\"svm_poly\")`)។\n",
"\n",
"យើងមកបង្កើត SVC បម្រែបម្រួលបន្ទាត់ដោយកំណត់ `degree = 1` ក្នុងម៉ូដែល SVM បក្សមេណូមិ។\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vJpp6nuChlBz"
},
"source": [
"# Make a linear SVC specification\n",
"svc_linear_spec <- svm_poly(degree = 1) %>% \n",
" set_engine(\"kernlab\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle specification and recipe into a worklow\n",
"svc_linear_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(svc_linear_spec)\n",
"\n",
"# Print out workflow\n",
"svc_linear_wf"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "rDs8cWNkhoqu"
},
"source": [
"ឥឡូវនេះដែលយើងបានចាប់យកជំហានមុនការកាន់ត្រា និងការបញ្ជាក់ម៉ូដែលជាទម្រង់ *workflow* រួចហើយ យើងអាចបន្តហ្វឹកហាត់ SVC រាងបន្ទាត់ ហើយវាយតម្លៃលទ្ធផលពេលជាមួយគ្នា។ សម្រាប់មេត្រីកសមត្ថភាព សូមបង្កើតសំណុំមេត្រីកមួយ ដែលនឹងវាយតម្លៃៈ `accuracy`, `sensitivity`, `Positive Predicted Value` និង `F Measure`\n",
"\n",
"> `augment()` នឹងបន្ថែមជួរឈរមួយ(ច្រើន)សម្រាប់ការព្យាករណ៍ទៅកាន់ទិន្នន័យដែលបានផ្ដល់។\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "81wiqcwuhrnq"
},
"source": [
"# Train a linear SVC model\n",
"svc_linear_fit <- svc_linear_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"# Create a metric set\n",
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"svc_linear_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "0UFQvHf-huo3"
},
"source": [
"#### ម៉ាស៊ីនវ៉ិចទ័រគាំទ្រ\n",
"\n",
"ម៉ាស៊ីនវ៉ិចទ័រគាំទ្រ (SVM) គឺជាការពង្រីកនៃអ្នកចាត់ថ្នាក់វ៉ិចទ័រគាំទ្រ ដើម្បីអនុញ្ញាតឱ្យមានព្រំដែនមិនជាស maʻ្លើងរវាងថ្នាក់។ ជាធម្មតា SVMs ប្រើ *trick kernel* ដើម្បីពង្រីកលំហលក្ខណៈ ដើម្បីធ្វើឱ្យសមស្របនឹងសំណាញ់មិនជាស linear រវាងថ្នាក់។ មុខងារ kernel មួយដែលពេញនិយម និងបត់បែនខ្លាំង ដែល SVMs ប្រើគឺ *មុខងារថាមពលគោលកណ្តាល (Radial basis function)*។ មកមើលថាវានឹងដំណើរការយ៉ាងដូចម្តេចលើទិន្នន័យរបស់យើង។\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-KX4S8mzhzmp"
},
"source": [
"set.seed(2056)\n",
"\n",
"# Make an RBF SVM specification\n",
"svm_rbf_spec <- svm_rbf() %>% \n",
" set_engine(\"kernlab\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle specification and recipe into a worklow\n",
"svm_rbf_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(svm_rbf_spec)\n",
"\n",
"\n",
"# Train an RBF model\n",
"svm_rbf_fit <- svm_rbf_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"svm_rbf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QBFSa7WSh4HQ"
},
"source": [
"ល្អ​ច្រើន 🤩!\n",
"\n",
"> ✅ សូមមើលៈ\n",
">\n",
"> - [*Support Vector Machines*](https://bradleyboehmke.github.io/HOML/svm.html), ការស្វែងយល់បែបហត្ថកម្មជាមួយ R\n",
">\n",
"> - [*Support Vector Machines*](https://www.statlearning.com/), ការណែនាំអំពីការស្វែងយល់ស្ថិតិជាមួយកម្មវិធីក្នុង R\n",
">\n",
"> សម្រាប់ការអានបន្ថែម។\n",
"\n",
"### កម្មវិធីមិត្តភាពជិត\n",
"\n",
"*K*-nearest neighbor (KNN) គឺជាអាល់ហ្គរីធម៍មួយដែលសំរាប់ការព្យាករណ៍គ្រប់ការត្រួតពិនិត្យដោយផ្អែកលើ *ការស្រដៀង* របស់វាទៅនឹងការត្រួតពិនិត្យផ្សេងទៀត។\n",
"\n",
"ចាំអោយយើងបញ្ជាក់មួយនៅលើទិន្នន័យរបស់យើង។\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "k4BxxBcdh9Ka"
},
"source": [
"# Make a KNN specification\n",
"knn_spec <- nearest_neighbor() %>% \n",
" set_engine(\"kknn\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"knn_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(knn_spec)\n",
"\n",
"# Train a boosted tree model\n",
"knn_wf_fit <- knn_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"knn_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "HaegQseriAcj"
},
"source": [
"វាហាក់ដូចជាម៉ូឌែលនេះមិនមែនដំណើរការល្អនោះទេ។ ប្រហែលជាការផ្លាស់ប្តូរព្រិទ្ធិ HR អះអាងនៃម៉ូឌែល (មើល `help(\"nearest_neighbor\")`) នឹងធ្វើឱ្យការសម្រួលម៉ូឌែលមានប្រសិទ្ធភាពល្អប្រសើរឡើង។ ចូរប្រាកដថាបានសាកល្បងវា។\n",
"\n",
"> ✅ សូមមើល:\n",
">\n",
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
">\n",
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
">\n",
"> ដើម្បីរៀនបន្ថែមអំពី *K*-Nearest Neighbors classifiers។\n",
"\n",
"### ម៉ូឌែលប្រភេទ Ensemble\n",
"\n",
"អាល់ហ្គរីធម์ Ensemble ធ្វើការដោយបញ្ចូលកំណត់ត្រាទាំងមួលមូលបួសទៅក្នុងម៉ូឌែលមួយដែលល្អបំផុត តាមរយៈ:\n",
"\n",
"`bagging`: ប្រើគោលការណ៍មធ្យមនៃមុខងារច្រើនចំពោះកំណត់ត្រាមូលដ្ឋាន\n",
"\n",
"`boosting`: ការសង់បណ្ដុំម៉ូឌែលដែលបន្តបណ្តូលគ្នាដើម្បីធ្វើឱ្យមានកំរិតទាយទំនោរល្អប្រសើរ។\n",
"\n",
"ចាប់ផ្តើមដោយសាកល្បងម៉ូឌែល Random Forest ដែលកសាងបណ្ដុំដើមច្រើននៃដើមឈើសំឡេង ពីនោះប្រើមុខងារមធ្យមមួយសម្រាប់ជាម៉ូឌែលសរុបល្អប្រសើរឡើង។\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "49DPoVs6iK1M"
},
"source": [
"# Make a random forest specification\n",
"rf_spec <- rand_forest() %>% \n",
" set_engine(\"ranger\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"rf_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(rf_spec)\n",
"\n",
"# Train a random forest model\n",
"rf_wf_fit <- rf_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"rf_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "RGVYwC_aiUWc"
},
"source": [
"ការងារល្អ 👏!\n",
"\n",
"ក្រឡាប់ត្រូវតែសាកល្បងជាមួយម៉ូដែល Boosted Tree ផងដែរ។\n",
"\n",
"Boosted Tree កំណត់វិធីសាស្រ្ត ensemble មួយដែលបង្កើតខ្នាតដើមជាប់លំដាប់ច្រើន ដោយមានរាល់ឈើរុក្ខជាតិមួយ ពឹងផ្អែកលើលទ្ធផលនៃឈើរុក្ខមុនៗ ក្នុងគោលបំណងកាត់បន្ថយកំហុសឲ្យតិចចុះជារបៀបមានលំដាប់។ វាមើលទៅលើទម្ងន់នៃធាតុដែលបានចាត់ទោសមិនត្រឹមត្រូវ ហើយកែសម្រួលការសម្របសម្រួលសម្រាប់អ្នកចាត់ទោសបន្ទាប់ ដើម្បីកែតម្រូវខុស។\n",
"\n",
"មានវិធីផ្សេងៗក្នុងការសម្របសម្រួលម៉ូដែលនេះ (ចូរមើល `help(\"boost_tree\")`)។ ក្នុងឧទាហរណ៍នេះ យើងនឹងសម្របសម្រួលរៀងរាល់ Boosted trees តាមរយៈម៉ូទ័រ `xgboost`។\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Py1YWo-micWs"
},
"source": [
"# Make a boosted tree specification\n",
"boost_spec <- boost_tree(trees = 200) %>% \n",
" set_engine(\"xgboost\") %>% \n",
" set_mode(\"classification\")\n",
"\n",
"# Bundle recipe and model specification into a workflow\n",
"boost_wf <- workflow() %>% \n",
" add_recipe(cuisines_recipe) %>% \n",
" add_model(boost_spec)\n",
"\n",
"# Train a boosted tree model\n",
"boost_wf_fit <- boost_wf %>% \n",
" fit(data = cuisines_train)\n",
"\n",
"\n",
"# Make predictions and Evaluate model performance\n",
"boost_wf_fit %>% \n",
" augment(new_data = cuisines_test) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zNQnbuejigZM"
},
"source": [
"> ✅ សូមមើល៖\n",
">\n",
"> - [ការសិក្សាសម្រាប់អ្នកសង្គមវិទ្យា](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n",
">\n",
"> - [ការសិក្សាដោយដៃលើម៉ាស៊ីនរៀនជាមួយ R](https://bradleyboehmke.github.io/HOML/)\n",
">\n",
"> - [ការណែនាំអំពីការសិក្សាស្ថិតិជាមួយកម្មវិធីនៅក្នុង R](https://www.statlearning.com/)\n",
">\n",
"> - <https://algotech.netlify.app/blog/xgboost/> - រៀបរាប់ពីម៉ូដែល AdaBoost ដែលជាជម្រើសល្អជាង xgboost។\n",
">\n",
"> ដើម្បីស្វែងយល់បន្ថែមអំពី Ensemble classifiers។\n",
"\n",
"## 4. បន្ថែម - ការប្រៀបធៀបទំលាប់ម៉ូដែលច្រើន\n",
"\n",
"យើងបានស្ទង់ស្ទាយម៉ូឌែលច្រើនក្នុងមន្ទីរពិសោធន៍នេះ 🙌។ វាអាចក្លាយជាเหนื่อยឬមានការលំបាកក្នុងការបង្កើតច្រើននៃដំណើរការពីជំរើស preprocessors និង/ឬការបញ្ជាក់ម៉ូដែលផ្សេងៗហើយបន្ទាប់មកគណនាម៉ែត្ររបស់ការសម្តែងមួយៗពីរដង។\n",
"\n",
"ចង់មើលថាតើយើងអាចដោះស្រាយនេះដោយបង្កើតមុខងារមួយដែលធ្វើការតម្រឹមសាច់ដុំដំណើរការជាបញ្ជីនៅលើសំណុំបណ្តុះបណ្តាល បន្ទាប់មកត្រឡប់មកវិញតម្លៃពីគោលការណ៍សម្តែងផ្អែកលើសំណុំតេស្ត។ យើងនឹងប្រើ `map()` និង `map_dfr()` ពីកញ្ចប់ [purrr](https://purrr.tidyverse.org/) ដើម្បីអនុវត្តមុខងារទៅលើមេគ្រួសរបស់បញ្ជីនិមួយៗ។\n",
"\n",
"> មុខងារ [`map()`](https://purrr.tidyverse.org/reference/map.html) អនុញ្ញាតឱ្យអ្នកជំនួសសម្រាប់វដ្ត for ច្រើនជាមួយកូដដែលខ្លី និងងាយស្រួលក្នុងការអាន។ ទីតាំងល្អបំផុតក្នុងការសិក្សាអំពីមុខងារ [`map()`](https://purrr.tidyverse.org/reference/map.html) គឺជាតិខួរក្បាលដំណើរការ [iteration chapter](http://r4ds.had.co.nz/iteration.html) ក្នុង R សម្រាប់វិទ្យាសាស្ត្រ​ទិន្នន័យ។\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Qzb7LyZnimd2"
},
"source": [
"set.seed(2056)\n",
"\n",
"# Create a metric set\n",
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
"\n",
"# Define a function that returns performance metrics\n",
"compare_models <- function(workflow_list, train_set, test_set){\n",
" \n",
" suppressWarnings(\n",
" # Fit each model to the train_set\n",
" map(workflow_list, fit, data = train_set) %>% \n",
" # Make predictions on the test set\n",
" map_dfr(augment, new_data = test_set, .id = \"model\") %>%\n",
" # Select desired columns\n",
" select(model, cuisine, .pred_class) %>% \n",
" # Evaluate model performance\n",
" group_by(model) %>% \n",
" eval_metrics(truth = cuisine, estimate = .pred_class) %>% \n",
" ungroup()\n",
" )\n",
" \n",
"} # End of function"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Fwa712sNisDA"
},
"source": [
"មកហៅមុខងាររបស់យើងហើយប្រៀបធៀបភាពត្រឹមត្រូវរវាងម៉ូដែលទាំងឡាយ។\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "3i4VJOi2iu-a"
},
"source": [
"# Make a list of workflows\n",
"workflow_list <- list(\n",
" \"svc\" = svc_linear_wf,\n",
" \"svm\" = svm_rbf_wf,\n",
" \"knn\" = knn_wf,\n",
" \"random_forest\" = rf_wf,\n",
" \"xgboost\" = boost_wf)\n",
"\n",
"# Call the function\n",
"set.seed(2056)\n",
"perf_metrics <- compare_models(workflow_list = workflow_list, train_set = cuisines_train, test_set = cuisines_test)\n",
"\n",
"# Print out performance metrics\n",
"perf_metrics %>% \n",
" group_by(.metric) %>% \n",
" arrange(desc(.estimate)) %>% \n",
" slice_head(n=7)\n",
"\n",
"# Compare accuracy\n",
"perf_metrics %>% \n",
" filter(.metric == \"accuracy\") %>% \n",
" arrange(desc(.estimate))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KuWK_lEli4nW"
},
"source": [
"កញ្ចប់ [**workflowset**](https://workflowsets.tidymodels.org/) អនុញ្ញាតឲ្យអ្នកប្រើបង្កើត និងបំពាក់គំរូជាច្រើនបានយ៉ាងងាយស្រួល ប៉ុន្តែភាគច្រើនត្រូវបានរចនាឡើងសម្រាប់ធ្វើការជាមួយបច្ចេកទេស resampling ដូចជា `cross-validation` ដែលជាវិធីសាស្រ្តមួយដែលយើងមិនទាន់បានសិក្សាទេ។\n",
"\n",
"## **🚀ការប្រឈម**\n",
"\n",
"បច្ចេកទេសនីមួយៗមានប៉ារ៉ាម៉ែត្រ​ច្រើនដែលអ្នកអាចកែប្រែបាន ដូចជា `cost` នៅក្នុង SVMs, `neighbors` នៅក្នុង KNN, `mtry` (ជាតិអ្នកទស្សនាដែលបានជ្រើសរើសដោយចៃដន្យ) នៅក្នុង Random Forest។\n",
"\n",
"ស្រាវជ្រាវពីប៉ារ៉ាម៉ែត្រ​លំនៃមួយៗ ហើយគិតពីលទ្ធផលដែលការកែប្រែប៉ារ៉ាម៉ែត្រ​នេះអាចមានសម្រាប់គុណភាពគំរូ។\n",
"\n",
"ដើម្បីស្វែងយល់បន្ថែមអំពីគំរូជាក់លាក់ និងប៉ារ៉ាម៉ែត្រ​របស់វា សូមប្រើៈ `help(\"model\")` ឧទាហរណ៍ `help(\"rand_forest\")`\n",
"\n",
"> នៅក្នុងប្រតិបត្តិការណ៍ យើងភាគច្រើន *ប៉ាន់ប្រមាណ* *តម្លៃល្អបំផុត* សម្រាប់វា ដោយបណ្ដេញគំរូជាច្រើនលើ `data set បានស្ទាញ` ហើយវាស់ថាគំរូទាំងនេះអាចប្រតិបត្តិការល្អប៉ុណ្ណាដែរ។ ដំណើរការនេះហៅថា **tuning** ។\n",
"\n",
"### [**សំនួរប្រលងក្រោយមេរៀន**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
"\n",
"### **ពិនិត្យឡើងវិញ & សិក្សាឯកោ**\n",
"\n",
"មានពាក្យបច្ចេកទេសជាច្រើនក្នុងមេរៀនទាំងនេះ អូសពេលមួយដើម្បីពិនិត្យមើល [បញ្ជីនេះ](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) នូវពាក្យសម្គាល់មានប្រយោជន៍!\n",
"\n",
"#### សូមអរគុណចំពោះៈ\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) ដែលបានបង្កើតរូបភាពដ៏អស្ចារ្យ ដែលធ្វើឲ្យ R កាន់តែស្វាគមន៍ និងទាក់ទាញ។ រកឃើញរូបភាពបន្ថែមនៅក្នុង [វិចិត្រសាល](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM) របស់នាង។\n",
"\n",
"[Cassie Breviu](https://www.twitter.com/cassieview) និង [Jen Looper](https://www.twitter.com/jenlooper) ដែលបានបង្កើតកំណែ Python ដើមនៃម៉ូឌុលនេះ ♥️\n",
"\n",
"សូមរំលឹករីករាយក្នុងការសិក្សា,\n",
"\n",
"[Eric](https://twitter.com/ericntay), ឯកទេសសិស្ស Microsoft Learn លំដាប់មាស។\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/km/r_learners_sm.f9199f76f1e2e493.webp\"\n",
" width=\"569\"/>\n",
" <figcaption>ស្នាដៃដោយ @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការបដិសេធ**: \nឯកសារនេះត្រូវបានបកប្រែក្នុងការប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំសម្រាប់ភាពត្រឹមត្រូវ សូមប្រយ័ត្នថាការបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុសឬមិនត្រឹមត្រូវ។ ឯកសារដើមដែលមានភាសាម្តាយគួរត្រូវបានគេរំពឹងថាជាមូលដ្ឋានដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ គួរប្រើការបកប្រែដោយអ្នកជំនាញមនុស្ស។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសឆ្គងណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,298 @@
{
"cells": [
{
"source": [
"# ស្ថាបនា ម៉ូដែលចម្លែកច្រើនទៀត\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 1
}
],
"source": [
"import pandas as pd\n",
"cuisines_df = pd.read_csv(\"../../data/cleaned_cuisines.csv\")\n",
"cuisines_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian\n",
"Name: cuisine, dtype: object"
]
},
"metadata": {},
"execution_count": 2
}
],
"source": [
"cuisines_label_df = cuisines_df['cuisine']\n",
"cuisines_label_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 3
}
],
"source": [
"cuisines_features_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
"cuisines_features_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# ព្យាយាមម៉ាស៊ីនចាត់ថ្នាក់ខុសៗគ្នា\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.svm import SVC\n",
"from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier\n",
"from sklearn.model_selection import train_test_split, cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(cuisines_features_df, cuisines_label_df, test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"\n",
"C = 10\n",
"# Create different classifiers.\n",
"classifiers = {\n",
" 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0),\n",
" 'KNN classifier': KNeighborsClassifier(C),\n",
" 'SVC': SVC(),\n",
" 'RFST': RandomForestClassifier(n_estimators=100),\n",
" 'ADA': AdaBoostClassifier(n_estimators=100)\n",
" \n",
"}\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Accuracy (train) for Linear SVC: 76.4% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.64 0.66 0.65 242\n",
" indian 0.91 0.86 0.89 236\n",
" japanese 0.72 0.73 0.73 245\n",
" korean 0.83 0.75 0.79 234\n",
" thai 0.75 0.82 0.78 242\n",
"\n",
" accuracy 0.76 1199\n",
" macro avg 0.77 0.76 0.77 1199\n",
"weighted avg 0.77 0.76 0.77 1199\n",
"\n",
"Accuracy (train) for KNN classifier: 70.7% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.65 0.63 0.64 242\n",
" indian 0.84 0.81 0.82 236\n",
" japanese 0.60 0.81 0.69 245\n",
" korean 0.89 0.53 0.67 234\n",
" thai 0.69 0.75 0.72 242\n",
"\n",
" accuracy 0.71 1199\n",
" macro avg 0.73 0.71 0.71 1199\n",
"weighted avg 0.73 0.71 0.71 1199\n",
"\n",
"Accuracy (train) for SVC: 80.1% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.71 0.69 0.70 242\n",
" indian 0.92 0.92 0.92 236\n",
" japanese 0.77 0.78 0.77 245\n",
" korean 0.87 0.77 0.82 234\n",
" thai 0.75 0.86 0.80 242\n",
"\n",
" accuracy 0.80 1199\n",
" macro avg 0.80 0.80 0.80 1199\n",
"weighted avg 0.80 0.80 0.80 1199\n",
"\n",
"Accuracy (train) for RFST: 82.8% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.80 0.75 0.77 242\n",
" indian 0.90 0.91 0.90 236\n",
" japanese 0.82 0.78 0.80 245\n",
" korean 0.85 0.82 0.83 234\n",
" thai 0.78 0.89 0.83 242\n",
"\n",
" accuracy 0.83 1199\n",
" macro avg 0.83 0.83 0.83 1199\n",
"weighted avg 0.83 0.83 0.83 1199\n",
"\n",
"Accuracy (train) for ADA: 71.1% \n",
" precision recall f1-score support\n",
"\n",
" chinese 0.60 0.57 0.58 242\n",
" indian 0.87 0.84 0.86 236\n",
" japanese 0.71 0.60 0.65 245\n",
" korean 0.68 0.78 0.72 234\n",
" thai 0.70 0.78 0.74 242\n",
"\n",
" accuracy 0.71 1199\n",
" macro avg 0.71 0.71 0.71 1199\n",
"weighted avg 0.71 0.71 0.71 1199\n",
"\n"
]
}
],
"source": [
"n_classifiers = len(classifiers)\n",
"\n",
"for index, (name, classifier) in enumerate(classifiers.items()):\n",
" classifier.fit(X_train, np.ravel(y_train))\n",
"\n",
" y_pred = classifier.predict(X_test)\n",
" accuracy = accuracy_score(y_test, y_pred)\n",
" print(\"Accuracy (train) for %s: %0.1f%% \" % (name, accuracy * 100))\n",
" print(classification_report(y_test,y_pred))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការបដិសេធ**៖ \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំសម្រាប់ភាពត្រឹមត្រូវ សូមយល់ថាការបកប្រែស្វ័យប្រវត្តិក៏អាចមានកំហុសឬភាពមិនត្រឹមត្រូវបានបញ្ចូល។ ឯកសារដើមក្នុងភាសានៅដើមគួរត្រូវបានគេពិចារណាជាផ្ទាំងមូលដ្ឋាន។ សម្រាប់ព័ត៌មានសំខាន់ ប្រែឯកទេសដោយមនុស្សវិជ្ជាជីវៈគឺជាសំណើនៅលើ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំនិងការពន្យល់ខុសផ្សេងៗដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះទេ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,322 @@
# កសាងកម្មវិធីេបសាយផ្តល់អត្ថសម្គាល់អំពីម្ហូប
នៅមេរៀននេះ អ្នកនឹងកសាងម៉ូដែលចាត់ថ្នាក់ដោយប្រើបច្ចេកទេសខ្លះៗដែលអ្នកបានរៀនពីមេរៀនមុនៗ និងដោយប្រើឃ្លើងទិន្នន័យម្ហូបឆ្ងាញ់ដែលបានប្រើជារឿយៗក្នុងស៊េរីនេះ។ លើសពីនេះ អ្នកនឹងកសាងកម្មវិធីេបសាយតូចមួយ ដើម្បីប្រើម៉ូដែលដែលបានរក្សាទុក ដោយប្រើ Onnx រចនាសម្ព័ន្ធក្នុងបណ្តាញ។
មួយក្នុងចំណោមការប្រើប្រាស់ប្រព័ន្ធស្វ័យប្រវត្តិមានប្រយោជន៍បំផុត គឺការកសាងប្រព័ន្ធផ្ដល់សំណើណែនាំ ហើយអ្នកអាចចាប់ផ្តើមជំហានដំបូងនោះថ្ងៃនេះ!
[![បង្ហាញកម្មវិធីេបសាយនេះ](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](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 visual](../../../../translated_images/km/netron.a05f39410211915e.webp)
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 web app](../../../../translated_images/km/web-app.4c76450cabe20036.webp)
សូមអបអរ যাচាហ៎ អ្នកបានបង្កើតកម្មវិធីេបសាយ 'ផ្ដល់អត្ថសម្គាល់' ជាមួយវាលតិចៗមួយចំនួន។ ចំណាយពេលបន្តកសាងប្រព័ន្ធនេះ!
## 🚀កញ្ញាប្រលង
កម្មវិធីេបសាយរបស់អ្នកមានលក្ខណៈគ្រួសារគតិយុត្តិ ផ្ទាល់បន្តកសាងវាជាមួយសមាសធាតុ និងលេខរៀងរបស់ពួកវាពីទិន្នន័យ [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,286 @@
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 64-bit ('3.7')"
},
"metadata": {
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"interpreter": {
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"source": [
"# រៀបចំកម្មវិធីផ្តល់អនុសាសន៍ម្ហូបអាហារ\n"
],
"cell_type": "markdown",
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Requirement already satisfied: skl2onnx in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (1.8.0)\n",
"Requirement already satisfied: protobuf in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (3.8.0)\n",
"Requirement already satisfied: numpy>=1.15 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.19.2)\n",
"Requirement already satisfied: onnx>=1.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.9.0)\n",
"Requirement already satisfied: six in /Users/jenlooper/Library/Python/3.7/lib/python/site-packages (from skl2onnx) (1.12.0)\n",
"Requirement already satisfied: onnxconverter-common<1.9,>=1.6.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.8.1)\n",
"Requirement already satisfied: scikit-learn>=0.19 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (0.24.2)\n",
"Requirement already satisfied: scipy>=1.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.4.1)\n",
"Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from protobuf->skl2onnx) (45.1.0)\n",
"Requirement already satisfied: typing-extensions>=3.6.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnx>=1.2.1->skl2onnx) (3.10.0.0)\n",
"Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (2.1.0)\n",
"Requirement already satisfied: joblib>=0.11 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (0.16.0)\n",
"\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n",
"You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"!pip install skl2onnx"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd \n"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
"0 0 indian 0 0 0 0 0 \n",
"1 1 indian 1 0 0 0 0 \n",
"2 2 indian 0 0 0 0 0 \n",
"3 3 indian 0 0 0 0 0 \n",
"4 4 indian 0 0 0 0 0 \n",
"\n",
" apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 382 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>cuisine</th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>indian</td>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>indian</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 382 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 60
}
],
"source": [
"data = pd.read_csv('../../data/cleaned_cuisines.csv')\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" almond angelica anise anise_seed apple apple_brandy apricot \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" armagnac artemisia artichoke ... whiskey white_bread white_wine \\\n",
"0 0 0 0 ... 0 0 0 \n",
"1 0 0 0 ... 0 0 0 \n",
"2 0 0 0 ... 0 0 0 \n",
"3 0 0 0 ... 0 0 0 \n",
"4 0 0 0 ... 0 0 0 \n",
"\n",
" whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 1 0 \n",
"\n",
"[5 rows x 380 columns]"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>almond</th>\n <th>angelica</th>\n <th>anise</th>\n <th>anise_seed</th>\n <th>apple</th>\n <th>apple_brandy</th>\n <th>apricot</th>\n <th>armagnac</th>\n <th>artemisia</th>\n <th>artichoke</th>\n <th>...</th>\n <th>whiskey</th>\n <th>white_bread</th>\n <th>white_wine</th>\n <th>whole_grain_wheat_flour</th>\n <th>wine</th>\n <th>wood</th>\n <th>yam</th>\n <th>yeast</th>\n <th>yogurt</th>\n <th>zucchini</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 380 columns</p>\n</div>"
},
"metadata": {},
"execution_count": 61
}
],
"source": [
"X = data.iloc[:,2:]\n",
"X.head()"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" cuisine\n",
"0 indian\n",
"1 indian\n",
"2 indian\n",
"3 indian\n",
"4 indian"
],
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>cuisine</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>1</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>2</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>3</th>\n <td>indian</td>\n </tr>\n <tr>\n <th>4</th>\n <td>indian</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {},
"execution_count": 62
}
],
"source": [
"y = data[['cuisine']]\n",
"y.head()"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"from sklearn.svm import SVC\n",
"from sklearn.model_selection import cross_val_score\n",
"from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"SVC(C=10, kernel='linear', probability=True, random_state=0)"
]
},
"metadata": {},
"execution_count": 65
}
],
"source": [
"model = SVC(kernel='linear', C=10, probability=True,random_state=0)\n",
"model.fit(X_train,y_train.values.ravel())\n"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [],
"source": [
"y_pred = model.predict(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" precision recall f1-score support\n\n chinese 0.72 0.70 0.71 236\n indian 0.91 0.88 0.89 243\n japanese 0.80 0.75 0.77 240\n korean 0.80 0.81 0.81 230\n thai 0.76 0.85 0.80 250\n\n accuracy 0.80 1199\n macro avg 0.80 0.80 0.80 1199\nweighted avg 0.80 0.80 0.80 1199\n\n"
]
}
],
"source": [
"print(classification_report(y_test,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [],
"source": [
"from skl2onnx import convert_sklearn\n",
"from skl2onnx.common.data_types import FloatTensorType\n",
"\n",
"initial_type = [('float_input', FloatTensorType([None, 380]))]\n",
"options = {id(model): {'nocl': True, 'zipmap': False}}\n",
"onx = convert_sklearn(model, initial_types=initial_type, options=options)\n",
"with open(\"./model.onnx\", \"wb\") as f:\n",
" f.write(onx.SerializeToString())\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការបដិសេធ**៖ \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះបី​យើងខិតខំសំរាប់ភាពត្រឹមត្រូវ ខ្ញុំសូមអោយដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវខ្លះ។ ឯកសារដើមជាភាសាដើមគួរត្រូវបានចាត់ទុកជាធនធានដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ យើងផ្ដល់អនុសាសន៍ឲ្យប្រើការបកប្រែដោយមនុស្សជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំនូវអ្វីៗ ឬការបកប្រែខុសៗណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
]
}

@ -0,0 +1,34 @@
# ការចាប់ផ្តើមជាមួយការបែងចែកប្រភេទ
## ប្រធានបទតំបន់៖ ម្ហូបអាស៊ីនិងឥណ្ឌាដ៏ឆ្ងាញ់ 🍜
នៅក្នុងអាស៊ី និងឥណ្ឌា ប្រពៃណីម្ហូបរបស់ពួកគេមានភាពផ្សេងប្លែកខ្លាំង ហើយឆ្ងាញ់បំផុត! យើងមកមើលទិន្នន័យអំពី ម្ហូបតំបន់ ដើម្បីព្យាយាមយល់ពីគ្រឿងផ្សំរបស់ពួកវា។
![Thai food seller](../../../translated_images/km/thai-food.c47a7a7f9f05c218.webp)
> រូបថតដោយ <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) ដែលគិតថា អាសយដ្ឋានទិន្នន័យមួយគ្មានស្លាក ឬថា បញ្ចូលរបស់វាមិនបានផ្គូរផ្គងជាមួយលទ្ធផលដែលកំណត់រួចជាស្រេច។ វា​ប្រើប្រាស់​អាល់ហ្គរីធម៍ផ្សេងៗ ដើម្បីខ្វះខាតតាមទិន្នន័យគ្មានស្លាក និងផ្តល់ការបែងចែកតាមលំនាំដែលវាស្គាល់បានក្នុងទិន្នន័យ។
[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](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) មានប្រយោជន៍ខ្លាំងសម្រាប់ការស្វែងរកទិន្នន័យ។ មកមើលថាវាអាចជួយរកឃើញនិន្នាការនិងលំនាំក្នុងរបៀបដែលអ្នកទស្សនាណាយហ្សេរីប្រើប្រាស់តន្ត្រី។
✅ ចំណាយពេលមួយនាទី ដើម្បីគិតពីការប្រើប្រាស់ចែកទំព័រ។ ក្នុងជីវិតពិត ការចែកទំព័រកើតឡើងពេលដែលអ្នកមានសំលៀកបំពាក់មិនកខ្វះ និងត្រូវរុំសំលៀកបំពាក់របស់សមាជិកគ្រួសារ 🧦👕👖🩲។ ក្នុងវិទ្យាសាស្ត្រទិន្នន័យ ការចែកទំព័រកើតឡើងពេលកំពុងព្យាយាមវិភាគចំណូលចិត្តរបស់អ្នកប្រើ ឬកំណត់លក្ខណៈពិសេសនៃឯកសារទិន្នន័យគ្មានស្លាកមួយ។ ការចែកទំព័រជាទម្រង់មួយជួយធ្វើអោយមានការយល់ដឹងអំពីអ្វីដែលមិនប្រក្រតី ដូចជាប្រអប់ស្បែកជើង។
[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](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) គឺវាស់ជាប្រវែងតាមខ្សែវង់។ ប្រសិនបើទិន្នន័យរបស់អ្នក, ដែលបានបង្ហាញរូបមន្ត, មិនមានលំនាំស្មើផ្លែនទេ អ្នកប្រហែលជាត្រូវប្រើអាល់ហ្គរីធម៍ពិសេសមួយដើម្បីដោះស្រាយវា។
>
![Flat vs Nonflat Geometry Infographic](../../../../translated_images/km/flat-nonflat.d1c8c6e2a96110c1.webp)
> រូបភាពបង្ហាញដោយ [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 គឺប្រភេទលំដាប់លំដោយ។
![Hierarchical clustering Infographic](../../../../translated_images/km/hierarchical.bf59403aa43c8c47.webp)
> រូបភាពបង្ហាញដោយ [Dasani Madipalli](https://twitter.com/dasani_decoded)
- **ការចែកទំព័រចំណុចកណ្តាល**។ អាល់ហ្គរីធម៍ល្បីឈ្មោះនេះត្រូវការជ្រើសរើស 'k' រឺ ចំនួនក្រុមដែលត្រូវបង្កើត បន្ទាប់មកអាល់ហ្គរីធម៍កំណត់ចំណុចមជ្ឈមណ្ឌលរបស់ក្រុម និងប្រមូលទិន្នន័យនៅជុំវិញចំណុចនោះ។ [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) គឺជាប្រភេទពេញនិយមនៃការចែកទំព័រចំណុចកណ្តាល។ ចំណុចមជ្ឈមណ្ឌលត្រូវបានកំណត់ដោយមធ្យមជិតបំផុត ដូច្នេះឈ្មោះ។ ចម្ងាយកោណត្រូវបានបន្តិចបន្តួច។
![Centroid clustering Infographic](../../../../translated_images/km/centroid.097fde836cf6c918.webp)
> រូបភាពបង្ហាញដោយ [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')
```
![most popular](../../../../translated_images/km/popular.9c48d84b3386705f.webp)
✅ ប្រសិនបើអ្នកចង់មើលតម្លៃកំពូលច្រើនជាងនេះ សូមប្តូរ 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')
```
ឥឡូវនេះសូមពិនិត្យមើលប្រភេទចម្រៀងម្ដងទៀត៖
![most popular](../../../../translated_images/km/all-genres.1d56ef06cefbfcd6.webp)
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)
```
![correlations](../../../../translated_images/km/correlation.a9356bb798f5eea5.webp)
ការពាក់ព័ន្ធតែមួយដែលខ្លាំងគឺរវាង `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។ ការទាញយកក្រុមនៅក្នុងទិន្នន័យដែលមានការបង្ហាញខាងលើនេះគឺជាភាពលំបាកជា​មួយ៖
![distribution](../../../../translated_images/km/distribution.9be11df42356ca95.webp)
1. បង្កើតប្លង់ scatter៖
```python
sns.FacetGrid(df, hue="artist_top_genre", height=5) \
.map(plt.scatter, "popularity", "danceability") \
.add_legend()
```
ប្លង់ scatter នៃអ័ក្សដូចគ្នាបង្ហាញលំនាំស្រដៀងគ្នារបស់ការប្រមូលផ្តុំ
![Facetgrid](../../../../translated_images/km/facetgrid.9b2e65ce707eba1f.webp)
ជាទូទៅ សម្រាប់ 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
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,254 @@
# ការបែងចែកក្រុម K-Means
## [វិញ្ញាសាមុនវគ្គ](https://ff-quizzes.netlify.app/en/ml/)
ក្នុងមេរៀននេះ អ្នក​នឹងរៀនពីរបៀបបង្កើត​ក្រុមឲ្យបានដោយប្រើ Scikit-learn និងឯកសារគម្រប់តន្ត្រីនីហ្សេរីយ៉ាដើម្បីនាំចូលមុននេះ។ យើង​នឹងរៀបរាប់ពីមូលដ្ឋាននៃ K-Means សម្រាប់​ការ​បែងចែក​ក្រុម។ សូមចងចាំថា ដូចដែលអ្នកបានរៀន​ក្នុងមេរៀនមុន មានរបៀបច្រើន​ក្នុងការប្រើក្រុម ហើយវិធីដែលអ្នកប្រើនឹងអាស្រ័យលើទិន្នន័យរបស់អ្នក។ យើង​នឹងសាកល្បង K-Means ព្រោះវាជា​បច្ចេកទេសបែងចែកក្រុមធម្មតា​បំផុត។ ចាប់ផ្តើមទៅ!
ពាក្យសំខាន់ដែលអ្នក​នឹងរៀនពី៖
- ពិន្ទុ Silhouette
- វិធី Elbow
- Inertia
- ភាពខុសគ្នា (Variance)
## ការណែនាំ
[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering) គឺ​ជា​វិធីមួយ​ចេញពី​វិស័យ​ការបញ្ចេញសញ្ញា។ វាត្រូវបានប្រើសម្រាប់បែងចែកក្រុមទិន្នន័យជា 'k' ក្រុមដោយប្រើសន្ទស្សន៍ជាច្រើន។ សន្ទស្សន៍នីមួយៗ​នឹងធ្វើការជួញដូរ​ដាក់​ជាក្រុម​និងទិន្នន័យ​ដែលជិតកន្លែង 'mean' ឬ​កាចំណុចមជ្ឈមណ្ឌលរបស់ក្រុម។
ក្រុមអាចត្រូវបាននាំមុខជារូបភាពជា [វ៉រ៉ូណូយ](https://wikipedia.org/wiki/Voronoi_diagram) ដែលរួមមានចំណុច (ឬ 'គ្រាប់') និងតំបន់​ដែលសមស្របមួយចំនួន។
![voronoi diagram](../../../../translated_images/km/voronoi.1dc1613fb0439b95.webp)
> រូបតំណាងដោយ [Jen Looper](https://twitter.com/jenlooper)
ដំណើរការបែងចែកក្រុម K-Means [អនុវត្តក្នុងដំណើរការបីជំហាន](https://scikit-learn.org/stable/modules/clustering.html#k-means):
1. អាល់ហ្គូរីធម์ជ្រើសចំណុចមជ្ឈមណ្ឌលចំនួន k ដោយការជ្រើសតំណាងពីឯកសារទិន្នន័យ។ បន្ទាប់មកវាលូប:
1. វាកំណត់កំណត់តំណាងនីមួយៗទៅកាន់បណ្តោយជិតបំផុត។
2. វាបង្កើតចំណុចមជ្ឈមណ្ឌលថ្មីដោយយកតម្លៃមធ្យមនៃទិន្នន័យទាំងអស់ដែលបានចាត់ទៅកាន់ចំណុចមជ្ឈមណ្ឌលមុន។
3. បន្ទាប់មក វាគណនាចំនួនខុសគ្នារវាងចំណុចមជ្ឈមណ្ឌលថ្មីនិងចំណុចចាស់ ហើយធ្វើឡើងវិញរហូតដល់ចំណុចមជ្ឈមណ្ឌលមានស្ថិរភាព។
ចំណុចខ្សោយមួយនៃការប្រើ K-Means គឺអ្នកត្រូវបង្កើត 'k' ដែលជាចំនួនចំណុចមជ្ឈមណ្ឌល។ ជាសំណាងវិធី 'elbow method' ជួយប៉ាន់ប្រមាណតម្លៃដើមល្អសម្រាប់ 'k'។ អ្នកនឹងសាកល្បងវិធីនេះមួយភ្លឺ។
## លក្ខខណ្ឌមុន
អ្នក​នឹង​ធ្វើការងារ​នៅក្នុង​ឯកសារ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) ក្នុងមេរៀននេះ ដែលរួមមានការនាំចូល និងសម្អាតដំណើរការដំបូងដែលអ្នកបានធ្វើនៅមេរៀនមុន។
## អនុវត្ត - រៀបចំ
ចាប់ផ្តើមដោយមើលទិន្នន័យចម្រៀងម្តងទៀត។
1. បង្កើត boxplot ដោយហៅ `boxplot()` សម្រាប់ជួរឈរនីមួយៗ៖
```python
plt.figure(figsize=(20,20), dpi=200)
plt.subplot(4,3,1)
sns.boxplot(x = 'popularity', data = df)
plt.subplot(4,3,2)
sns.boxplot(x = 'acousticness', data = df)
plt.subplot(4,3,3)
sns.boxplot(x = 'energy', data = df)
plt.subplot(4,3,4)
sns.boxplot(x = 'instrumentalness', data = df)
plt.subplot(4,3,5)
sns.boxplot(x = 'liveness', data = df)
plt.subplot(4,3,6)
sns.boxplot(x = 'loudness', data = df)
plt.subplot(4,3,7)
sns.boxplot(x = 'speechiness', data = df)
plt.subplot(4,3,8)
sns.boxplot(x = 'tempo', data = df)
plt.subplot(4,3,9)
sns.boxplot(x = 'time_signature', data = df)
plt.subplot(4,3,10)
sns.boxplot(x = 'danceability', data = df)
plt.subplot(4,3,11)
sns.boxplot(x = 'length', data = df)
plt.subplot(4,3,12)
sns.boxplot(x = 'release_date', data = df)
```
ទិន្នន័យនេះមានសំឡេងរំខានតិចតួច៖ ដោយមើលជាបទបង្ហាញ boxplot នីមួយៗ អ្នកអាចមើលឃើញព្រំដែនដែលឆ្លងកាត់។
![outliers](../../../../translated_images/km/boxplots.8228c29dabd0f292.webp)
អ្នកអាចធ្វើការលុបចោលព្រំដែនទាំងនេះពីឯកសារទិន្នន័យ ប៉ុន្តែវានឹងធ្វើឱ្យទិន្នន័យតិចតួចបន្ថែម។
1. សម្រាប់បច្ចុប្បន្ន ជ្រើសជួរឈរដែលអ្នកចង់ប្រើសម្រាប់លំហាត់បែងចែកក្រុមរបស់អ្នក។ ជ្រើសជួរឈរដែលមានចន្លោះស្រដៀងគ្នា និងផ្ទេរព័ត៌មានប្រែប្រួល `artist_top_genre` ទៅជាទិន្នន័យជាចំនួន៖
```python
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')]
y = df['artist_top_genre']
X['artist_top_genre'] = le.fit_transform(X['artist_top_genre'])
y = le.transform(y)
```
1. ឥឡូវហើយ អ្នកត្រូវជ្រើសរើសចំនួនក្រុមដែលអ្នកចង់បែងចែក។ អ្នកដឹងថាមានចម្រៀង 3 មុខចម្រៀងដែលយើងបានដកចេញពីឯកសារទិន្នន័យ ដូច្នេះសាកល្បង 3៖
```python
from sklearn.cluster import KMeans
nclusters = 3
seed = 0
km = KMeans(n_clusters=nclusters, random_state=seed)
km.fit(X)
# ខាតថានអំពីក្រុមសម្រាប់ចំណុចទិន្នន័យនីមួយៗ
y_cluster_kmeans = km.predict(X)
y_cluster_kmeans
```
អ្នកនឹងឃើញអារេមួយបោះពុម្ពជាមួយក្រុមដែលបានទាយទោល (0, 1, ឬ 2) សម្រាប់ជួរដេតាប្រេមមួយៗ។
1. ប្រើអារេនេះដើម្បីគណនាពិន្ទុ 'silhouette':
```python
from sklearn import metrics
score = metrics.silhouette_score(X, y_cluster_kmeans)
score
```
## ពិន្ទុ Silhouette
ស្វែងរកពិន្ទុ silhouette ដែលឆៀងទៅកាន់ 1។ ពិន្ទុនេះប្រែប្រួលពី -1 ទៅ 1 ហើយ បើពិន្ទុជាប្រាំមួយ គឺក្រុមមានភាពរឹងមាំ និងបំបែកច្បាស់ពីក្រុមផ្សេងទៀត។ តម្លៃជិត 0 បង្ហាញពីក្រុមដែលមានការច្របូកច្របល់ ជួរដេតានៅជិតព្រំដែនសម្រាច់របស់ក្រុមជិតខាង។ [(ប្រភព)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)
ពិន្ទុរបស់យើងគឺ **.53**, ដូច្នេះវាជាកណ្តាល។ នេះបង្ហាញថា ទិន្នន័យរបស់យើងគ្មានសមត្ថភាពល្អយ៉ាងខ្លាំងសម្រាប់បែបនេះនៃការបែងចែកក្រុម ប៉ុន្តែយើងនឹងបន្ត។
### អនុវត្ត - សង់ម៉ូដែល
1. នាំចូល `KMeans` ហើយចាប់ផ្តើមដំណើរការបែងចែកក្រុម។
```python
from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
```
មានផ្នែកខ្លះនៅទីនេះដែលត្រូវការពន្យល់។
> 🎓 range: វាជាចំនួន iteration នៃដំណើរការបែងចែកក្រុម
> 🎓 random_state: "កំណត់ការបង្កើតលេខចៃដន្យសម្រាប់ការចាប់ផ្តើមចំណុចមជ្ឈមណ្ឌល។" [ប្រភព](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans)
> 🎓 WCSS: "ផលបូកចំនួនក្រឡាចត្រង្គនៅក្នុងក្រុម" វាស់ខុសបរិមាណក្រឡាចត្រង្គមធ្យមនៃចំណុចទាំងអស់នៅក្នុងក្រុមធៀបជាមួយចំណុចមជ្ឈមណ្ឌលក្រុម។ [ប្រភព](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce).
> 🎓 Inertia: អាល់ហ្គូរីធម៍ K-Means ព្យាយាមជ្រើសចំណុចមជ្ឈមណ្ឌលដើម្បីកាត់បន្ថយ 'inertia' ដែលជាការវាស់ថា ក្រុមមានភាពរឹងមាំក្នុងខ្លួនយ៉ាងណា។ [ប្រភព](https://scikit-learn.org/stable/modules/clustering.html) តម្លៃនេះត្រូវបានបន្ថែមទៅអថេរ wcss នៅរាល់ចំនួន iteration។
> 🎓 k-means++: នៅ [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) អ្នកអាចប្រើការបង្កើតចំណុចមជ្ឈមណ្ឌល 'k-means++' ដែល "ចាប់ផ្តើមចំណុចមជ្ឈមណ្ឌលឲ្យនៅឆ្ងាយពីគ្នាដោយទូទៅ បណ្ដាលអោយលទ្ធផលប្រសើរជាងការចាប់ផ្តើមចៃដន្យ។
### វិធី Elbow
មុននេះ អ្នកបានសន្និដ្ឋានថា ដូចជាអ្នកបានគោលបំណងចម្រៀង 3 ប្រភេទ អ្នកគួរជ្រើសក្រុម 3 តែតើពិតទេ?
1. ប្រើវិធី 'elbow method' ដើម្បីធានា។
```python
plt.figure(figsize=(10,5))
sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red')
plt.title('Elbow')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
```
ប្រើអថេរ `wcss` ដែលអ្នកបានបង្កើតនៅជំហានមុន ដើម្បីបង្កើតក្រាផិកបង្ហាញទីដែលមាន 'bend' ក្នុង elbow ដោយបង្ហាញពីចំនួនក្រុម​អប្បបរមា។ ប្រហែលជា វា **ជាអច់** 3!
![elbow method](../../../../translated_images/km/elbow.72676169eed744ff.webp)
## អនុវត្ត - បង្ហាញក្រុម
1. សាកល្បងដំណើរការតម្កល់ម្តងទៀត កំណត់ក្រុម 3 ដង ហើយបង្ហាញក្រុមជារ៉ែតូច៖
```python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3)
kmeans.fit(X)
labels = kmeans.predict(X)
plt.scatter(df['popularity'],df['danceability'],c = labels)
plt.xlabel('popularity')
plt.ylabel('danceability')
plt.show()
```
1. ពិនិត្យភាពត្រឹមត្រូវនៃម៉ូដែល៖
```python
labels = kmeans.labels_
correct_labels = sum(y == labels)
print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size))
print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size)))
```
ភាពត្រឹមត្រូវរបស់ម៉ូដែលនេះមិនល្អទេ ហើយរូបរាងក្រុមផ្តល់សញ្ញាឲ្យអ្នកដឹងមូលហេតុ។
![clusters](../../../../translated_images/km/clusters.b635354640d8e4fd.webp)
ទិន្នន័យនេះមិន​តុល្យភាពគ្រប់គ្រាន់ ទំនាក់ទំនងតិចហើយ​មានភាពខុសគ្នាច្រើនរវាងតម្លៃជួរឈរដើម្បីបែងចែកក្រុមឲ្យបានល្អ។ ជាក់ស្តែង ក្រុមដែលបង្កើតឡើងស័ក្ដិ influenced ឬ មានភាពច្រាសច្រោមយ៉ាងខ្លាំងដោយក្រុមចម្រៀង 3 មុខដែលយើងបានកំណត់ពីមុន។ នេះជាដំណើរការសិក្សា!
ឯកសារនៃ Scikit-learn អ្នកអាចមើលឃើញថា ម៉ូដែលដូចនេះ ដែលក្រុមមិនបានបំបែកច្បាស់ មានបញ្ហា 'variance'៖
![problem models](../../../../translated_images/km/problems.f7fb539ccd80608e.webp)
> រូបតំណាងពី Scikit-learn
## ភាពខុសគ្នា (Variance)
ភាពខុសគ្នាបានកំណត់ថា "ជាមធ្យមនៃភាពខុសគ្នាចត្រង្គពីមធ្យម" [(ប្រភព)](https://www.mathsisfun.com/data/standard-deviation.html)។ នៅក្នុងបរិបទនៃបញ្ហាបែងចែកក្រុមនេះ វាសម្រាប់បញ្ជាក់ពីទិន្នន័យដែលចំនួនក្នុងឯកសារទិន្នន័យច្រាំងចេញពីមធ្យមច្រើនពេក។
✅ នេះជាពេលវេលាល្អក្នុងការគិតពីវិធីទាំងអស់ដែលអ្នកអាចកែតម្រូវបញ្ហានេះ។ ចំពោះទិន្នន័យមួយ? ប្រើជួរឈរផ្សេង? ប្រើអាល់ហ្គូរីធម៍ផ្សេង? សេចក្តីផ្តល់អនុសាសន៍: សាកល្បង [ការប្រភេទទិន្នន័យរបស់អ្នក](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) ដើម្បីធ្វើឲ្យវាមានស្តង់ដារនិងសាកល្បងជួរឈរផ្សេងៗ។
> សាកល្បង '[កម្មវិធីគណនា variance](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' ដើម្បីយល់ពីគំនិតនេះបន្ថែម។
---
## 🚀챌린지
ចំណាយពេលជាមួយ notebook នេះ ប៉ិនប្រមាណប៉ារ៉ាម៉ែត្រ។ អ្នកអាចធ្វើឲ្យភាពត្រឹមត្រូវនៃម៉ូដែលកាន់តែប្រសើរដោយសម្អាតទិន្នន័យច្រើនជាងមុន (ដូចជាលុបចោលព្រំដែន)? អ្នកអាចប្រើទំងន់ដើម្បីផ្ដល់ទំងន់ចំពោះទិន្នន័យខ្លះៗ។ តើមានអ្វីទៀតដែលអ្នកអាចធ្វើដើម្បីបង្កើតក្រុមល្អជាងនេះ?
សេចក្តីផ្តល់អនុសាសន៍៖ សាកល្បងបញ្ចូលការប្រភេទទិន្នន័យ។ មានកូដដែលបានព្រីនុចក្នុង notebook ដែលបន្ថែមការប្រភេទស្តង់ដារដើម្បីឲ្យជួរឈរទិន្នន័យមានម៉ាស្សារូបរាងដូចគ្នាច្រើនជាង។ អ្នកនឹងរកឃើញថា ខណៈពិន្ទុ silhouette បន្ថយ កំណត់ 'kink' នៅក្រាផិក elbow ចេញរាបស្មើឡើង។ នេះដោយសារពេលទិន្នន័យមិនត្រូវបានប្រភេទ ក្រុមដែលមានភាពខុសខាតតិចនឹងមានទំងន់ធ្ងន់ជាង។ អានបន្ថែមអំពីបញ្ហានេះ [នៅទីនេះ](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226)។
## [វិញ្ញាសាក្រោយវគ្គ](https://ff-quizzes.netlify.app/en/ml/)
## ពិនិត្យឡើងវិញ & សិក្សាឯកតាឯករាជ្យ
មើលឧបករណ៍រៀបចំ K-Means [ដូចទម្រង់នេះ](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/)។ អ្នកអាចប្រើឧបករណ៍នេះដើម្បីបង្ហាញចំណុចទិន្នន័យគំរូ និងកំណត់ចំណុចមជ្ឈមណ្ឌលរបស់វា។ អ្នកអាចកែប្រែ randomness ទិន្នន័យ ចំនួនក្រុម និងចំនួនចំណុចមជ្ឈមណ្ឌល។ តើវាជួយអ្នកបានគំនិតពីរបៀបបែងចែកទិន្នន័យជាក្រុម?
ក្រៅពីនេះ មើលឯកសារនេះ [K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) ពីស្ថានទិន្នន័យ Stanford ។
## កិច្ចការផ្ទះ
[សាកល្បងកិច្ចការបែងចែកក្រុមផ្សេងៗ](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**ការបដិបត្តិ**៖
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំធ្វើឱ្យបានច្បាស់លាស់ សូមយល់ថា ការបកប្រែដោយស្វ័យប្រវត្តិក្នុងសំណុំនេះអាចមានកំហុស ឬការមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាទីផ្សារដើមគួរត្រូវបានពិចារណាថាជា ប្រភពដែលមានសក្តានុពល។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឲ្យប្រើសេវាកម្មបកប្រែដែលធ្វើដោយមនុស្សជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែរបស់មិនត្រឹមត្រូវណាមួយដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះ។
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save