From b67cd9cd69be1a95a998b8e55b1d70ad9a5ab593 Mon Sep 17 00:00:00 2001 From: "localizeflow[bot]" Date: Tue, 14 Jul 2026 06:27:04 +0000 Subject: [PATCH] [sk,ro,bg] chore(i18n): sync translations Sync translations with latest source changes. Languages: Slovak [sk], Romanian [ro], Bulgarian [bg] --- translated_images/bg/.co-op-translator.json | 24 ++ .../bg/catplot.e73fc35fdf96242b.webp | Bin 0 -> 3682 bytes .../bg/heatmap.bd98dce43b404c57.webp | Bin 0 -> 7652 bytes .../bg/lineplot.f9034ba47b1e30ee.webp | Bin 0 -> 11970 bytes .../bg/relplot.a03837d8f0329cec.webp | Bin 0 -> 6532 bytes translated_images/ro/.co-op-translator.json | 24 ++ .../ro/catplot.e73fc35fdf96242b.webp | Bin 0 -> 3600 bytes .../ro/heatmap.bd98dce43b404c57.webp | Bin 0 -> 7576 bytes .../ro/lineplot.f9034ba47b1e30ee.webp | Bin 0 -> 11914 bytes .../ro/relplot.a03837d8f0329cec.webp | Bin 0 -> 6524 bytes translated_images/sk/.co-op-translator.json | 24 ++ .../sk/catplot.e73fc35fdf96242b.webp | Bin 0 -> 3652 bytes .../sk/heatmap.bd98dce43b404c57.webp | Bin 0 -> 7494 bytes .../sk/lineplot.f9034ba47b1e30ee.webp | Bin 0 -> 11970 bytes .../sk/relplot.a03837d8f0329cec.webp | Bin 0 -> 6580 bytes translations/bg/.co-op-translator.json | 35 ++- .../bg/1-Introduction/3-fairness/README.md | 173 ++++++++------ .../bg/2-Regression/1-Tools/README.md | 145 ++++++------ translations/bg/2-Regression/2-Data/README.md | 207 ++++++++++------ .../2-Data/solution/notebook.ipynb | 75 +++++- .../bg/8-Reinforcement/1-QLearning/README.md | 221 ++++++++++++------ .../2-Debugging-ML-Models/README.md | 190 ++++++++------- translations/ro/.co-op-translator.json | 35 ++- .../ro/1-Introduction/3-fairness/README.md | 169 ++++++++------ .../ro/2-Regression/1-Tools/README.md | 145 ++++++------ translations/ro/2-Regression/2-Data/README.md | 205 +++++++++++----- .../2-Data/solution/notebook.ipynb | 77 +++++- .../ro/8-Reinforcement/1-QLearning/README.md | 215 +++++++++++------ .../ro/8-Reinforcement/2-Gym/README.md | 177 ++++++++------ translations/sk/.co-op-translator.json | 37 ++- .../sk/1-Introduction/3-fairness/README.md | 167 +++++++------ .../sk/2-Regression/1-Tools/README.md | 156 +++++++------ translations/sk/2-Regression/2-Data/README.md | 217 +++++++++++------ .../2-Data/solution/notebook.ipynb | 77 +++++- .../sk/8-Reinforcement/1-QLearning/README.md | 211 +++++++++++------ .../sk/8-Reinforcement/2-Gym/README.md | 183 ++++++++------- .../2-Debugging-ML-Models/README.md | 186 ++++++++------- 37 files changed, 2168 insertions(+), 1207 deletions(-) create mode 100644 translated_images/bg/catplot.e73fc35fdf96242b.webp create mode 100644 translated_images/bg/heatmap.bd98dce43b404c57.webp create mode 100644 translated_images/bg/lineplot.f9034ba47b1e30ee.webp create mode 100644 translated_images/bg/relplot.a03837d8f0329cec.webp create mode 100644 translated_images/ro/catplot.e73fc35fdf96242b.webp create mode 100644 translated_images/ro/heatmap.bd98dce43b404c57.webp create mode 100644 translated_images/ro/lineplot.f9034ba47b1e30ee.webp create mode 100644 translated_images/ro/relplot.a03837d8f0329cec.webp create mode 100644 translated_images/sk/catplot.e73fc35fdf96242b.webp create mode 100644 translated_images/sk/heatmap.bd98dce43b404c57.webp create mode 100644 translated_images/sk/lineplot.f9034ba47b1e30ee.webp create mode 100644 translated_images/sk/relplot.a03837d8f0329cec.webp diff --git a/translated_images/bg/.co-op-translator.json b/translated_images/bg/.co-op-translator.json index 83a0ab769..bd40fcb27 100644 --- a/translated_images/bg/.co-op-translator.json +++ b/translated_images/bg/.co-op-translator.json @@ -101,6 +101,12 @@ "source_file": "8-Reinforcement/2-Gym/images/cartpole.png", "language_code": "bg" }, + "catplot.e73fc35fdf96242b.webp": { + "original_hash": "90cd4782a2f9b40dec8218b224b29c1c", + "translation_date": "2026-07-14T06:26:38+00:00", + "source_file": "2-Regression/2-Data/images/catplot.png", + "language_code": "bg" + }, "centroid.097fde836cf6c918.webp": { "original_hash": "c8f866ed446563d8e59087f1bca1f97d", "translation_date": "2026-01-16T15:45:38+00:00", @@ -383,6 +389,12 @@ "source_file": "2-Regression/3-Linear/images/heatmap.png", "language_code": "bg" }, + "heatmap.bd98dce43b404c57.webp": { + "original_hash": "7f2f2fbd993018bc01346e1eb8ae692e", + "translation_date": "2026-07-14T06:26:55+00:00", + "source_file": "2-Regression/2-Data/images/heatmap.png", + "language_code": "bg" + }, "hierarchical.bf59403aa43c8c47.webp": { "original_hash": "50b9bc3298659c463ae76564ca645b12", "translation_date": "2026-01-16T15:45:20+00:00", @@ -473,6 +485,12 @@ "source_file": "2-Regression/3-Linear/images/linear.png", "language_code": "bg" }, + "lineplot.f9034ba47b1e30ee.webp": { + "original_hash": "b3959c0ed0f02f668009c76b95c4ebbb", + "translation_date": "2026-07-14T06:27:01+00:00", + "source_file": "2-Regression/2-Data/images/lineplot.png", + "language_code": "bg" + }, "lobe.2fa0806408ef9923.webp": { "original_hash": "e6ec71dbe350aef39135dbf88bc89163", "translation_date": "2026-01-16T15:42:40+00:00", @@ -743,6 +761,12 @@ "source_file": "2-Regression/3-Linear/images/recipes.png", "language_code": "bg" }, + "relplot.a03837d8f0329cec.webp": { + "original_hash": "4733544cb1c2e58e987087283e66b4a5", + "translation_date": "2026-07-14T06:26:46+00:00", + "source_file": "2-Regression/2-Data/images/relplot.png", + "language_code": "bg" + }, "scaled.91897dfbaa26ca4a.webp": { "original_hash": "789c70fafe6f6dd6e377a90b66e7d740", "translation_date": "2026-01-16T15:56:37+00:00", diff --git a/translated_images/bg/catplot.e73fc35fdf96242b.webp b/translated_images/bg/catplot.e73fc35fdf96242b.webp new file mode 100644 index 0000000000000000000000000000000000000000..c790fc770ef3a8fa7d355030c2f8ae386979ca6f GIT binary patch literal 3682 zcmV-o4xRB*Nk&Fm4gdgGMM6+kP&gn?4gdg{&U$S>;dRO{Ac_>|NmUC*MEi|D}7VH7yn!QK=8NwPvrMSf3#j;8%RE{ z{U7o#^Aq8(w4c^*Soj2bYx?)&59F_?2W!N@dVza+@?YxzkDro$(m%ES3G=G{Fa8Je zhxh;IU+tgW{Fx{R{3rP5`7iLFvme{P|NOB2*ZpVr1N>+I|A=3ie{ug|_SN~GvO?YV7{FE3+m#H7LVg7!%lOD@Gq;1G+IGq zTLtvzxps3{qeY|^MX+B^eg*NHU1u9xr)H5^2EkS`+z`H;{0r*hjTVqu7P#*stL`B` z0{Xb4MWhx*uwP6(mBmLmqeY|^MX+B^ea#a3dv!L+87=FXBZ5}LM~kHG79NQ@FFq|G zvMqx7T1w)Rs01DZR0G8hbR^;}lHWURv;-n*J^l?$z`mUP3zoed0^*a0Cm~p<)4>|B zOMpDEmPN2HqnZF=JmB5pX=3ZEOV(L?_6szRYa})H>dV~u3o#jZyLlvN#RmIuTy(1)%X=4<0n0iBBZmhlLmw!n0ScrNsEJJ+KzEfFy7YZH4L@pKd)?W1p z?e8Lo6eXZ;Cuye#3ZtaM(i;19W$!e*`bVr0;elcs=9TiA%hM-*R_j$bGIigA zQ($p_c$eI4R%46j&6*R2@;~$%^c?03Aj^b2GG`wa!c5_f5j99fra$5NjvJ9|-rO10 z4Oa~$WuJ7s?988vBB=CMqg}MWBRcSq$G@VHxrii}=X{yiL?=E$@DY+uMX+B^eg*No z)$*@04(27DmVmQgCRSj2&x=Sbi(tN-{0r*jl8ZLUh`ZQxCU{)B+I79>39GORsaA14VTircxEtZ zA*;>KTA=^0c%P!h2zXOXQe<9!k(EHb+Xpf9uuXENOe)D|TcdEpnx}}p>(uRv`ugp=yPOhGq=ri_D($dyf;#r#Ytr!8om@{K5O!dPga|BE2oiFyaPPMzacRqE?4@l z38SNG;w1m#gc6z$3maYkJig4+8UO^p>Ct|QhL7t4qF!cRIdDORKW~cE3auwJ0dRfQ ze{I@Ls0f+^Uviz^do{Om?{k}Gmzh-~AL2|1{s|7i8dgkY2|1lE$}H6)OfS#8To=(9 zxGv>ZgG2}FqI{THJ$dT6`i5YA&`dzp9TfI7XIFtTj&LaG~Du*^G#%xhZQSnE-<>!_9)!CWj&;OlZp<@>0Z1vvscN&*lIH%0D4x)qd_D; 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 literal 0 HcmV?d00001 diff --git a/translated_images/bg/lineplot.f9034ba47b1e30ee.webp b/translated_images/bg/lineplot.f9034ba47b1e30ee.webp new file mode 100644 index 0000000000000000000000000000000000000000..ea50129c391f46afad3dd2b8e44451ed34f18d98 GIT binary patch literal 11970 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 U{PU(@;f7?iEvtELYsdfq0Kvq8M*si- literal 0 HcmV?d00001 diff --git a/translated_images/bg/relplot.a03837d8f0329cec.webp b/translated_images/bg/relplot.a03837d8f0329cec.webp new file mode 100644 index 0000000000000000000000000000000000000000..7e68b1c4cae77fc86b0fdaa418eafa300410a54e GIT binary patch literal 6532 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 WqSJAt3Udt|8@JLLXaE2J000116dyzY literal 0 HcmV?d00001 diff --git a/translated_images/ro/heatmap.bd98dce43b404c57.webp b/translated_images/ro/heatmap.bd98dce43b404c57.webp new file mode 100644 index 0000000000000000000000000000000000000000..baca5d10c85be4c7aa856deb17a39643bca0a71e GIT binary patch literal 7576 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 H;j?O2q_|dZK>2}kw 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 literal 0 HcmV?d00001 diff --git a/translated_images/ro/relplot.a03837d8f0329cec.webp b/translated_images/ro/relplot.a03837d8f0329cec.webp new file mode 100644 index 0000000000000000000000000000000000000000..447ed0b78d6a1dfbb1d4d466e56c0d450fca11b6 GIT binary patch literal 6524 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 T>4~P7lL#AFnK)Sk008(OrIyrJ literal 0 HcmV?d00001 diff --git a/translated_images/sk/.co-op-translator.json b/translated_images/sk/.co-op-translator.json index 04fdcc50a..956d0053d 100644 --- a/translated_images/sk/.co-op-translator.json +++ b/translated_images/sk/.co-op-translator.json @@ -101,6 +101,12 @@ "source_file": "8-Reinforcement/2-Gym/images/cartpole.png", "language_code": "sk" }, + "catplot.e73fc35fdf96242b.webp": { + "original_hash": "90cd4782a2f9b40dec8218b224b29c1c", + "translation_date": "2026-07-14T06:26:35+00:00", + "source_file": "2-Regression/2-Data/images/catplot.png", + "language_code": "sk" + }, "centroid.097fde836cf6c918.webp": { "original_hash": "c8f866ed446563d8e59087f1bca1f97d", "translation_date": "2026-01-16T15:45:31+00:00", @@ -383,6 +389,12 @@ "source_file": "2-Regression/3-Linear/images/heatmap.png", "language_code": "sk" }, + "heatmap.bd98dce43b404c57.webp": { + "original_hash": "7f2f2fbd993018bc01346e1eb8ae692e", + "translation_date": "2026-07-14T06:26:49+00:00", + "source_file": "2-Regression/2-Data/images/heatmap.png", + "language_code": "sk" + }, "hierarchical.bf59403aa43c8c47.webp": { "original_hash": "50b9bc3298659c463ae76564ca645b12", "translation_date": "2026-01-16T15:45:10+00:00", @@ -473,6 +485,12 @@ "source_file": "2-Regression/3-Linear/images/linear.png", "language_code": "sk" }, + "lineplot.f9034ba47b1e30ee.webp": { + "original_hash": "b3959c0ed0f02f668009c76b95c4ebbb", + "translation_date": "2026-07-14T06:26:57+00:00", + "source_file": "2-Regression/2-Data/images/lineplot.png", + "language_code": "sk" + }, "lobe.2fa0806408ef9923.webp": { "original_hash": "e6ec71dbe350aef39135dbf88bc89163", "translation_date": "2026-01-16T15:42:25+00:00", @@ -743,6 +761,12 @@ "source_file": "2-Regression/3-Linear/images/recipes.png", "language_code": "sk" }, + "relplot.a03837d8f0329cec.webp": { + "original_hash": "4733544cb1c2e58e987087283e66b4a5", + "translation_date": "2026-07-14T06:26:40+00:00", + "source_file": "2-Regression/2-Data/images/relplot.png", + "language_code": "sk" + }, "scaled.91897dfbaa26ca4a.webp": { "original_hash": "789c70fafe6f6dd6e377a90b66e7d740", "translation_date": "2026-01-16T15:56:35+00:00", diff --git a/translated_images/sk/catplot.e73fc35fdf96242b.webp b/translated_images/sk/catplot.e73fc35fdf96242b.webp new file mode 100644 index 0000000000000000000000000000000000000000..71671da646e119b9b09de89e7adab58ae0a275f1 GIT binary patch literal 3652 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 QkN^M}^hwE)0000002(H{=l}o! literal 0 HcmV?d00001 diff --git a/translated_images/sk/lineplot.f9034ba47b1e30ee.webp b/translated_images/sk/lineplot.f9034ba47b1e30ee.webp new file mode 100644 index 0000000000000000000000000000000000000000..d2ca08f262b49c4daf29197a787e762938e1ba4f GIT binary patch literal 11970 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

Zmt4=`kfbDZ2sYhKi}Cl6 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 UYgXkSJqVaauC~1%0000000qsHk^lez literal 0 HcmV?d00001 diff --git a/translated_images/sk/relplot.a03837d8f0329cec.webp b/translated_images/sk/relplot.a03837d8f0329cec.webp new file mode 100644 index 0000000000000000000000000000000000000000..5f0606a291a7bda3905d24220264a3713e79c693 GIT binary patch literal 6580 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 literal 0 HcmV?d00001 diff --git a/translations/bg/.co-op-translator.json b/translations/bg/.co-op-translator.json index 9fbaabc6f..51f198cae 100644 --- a/translations/bg/.co-op-translator.json +++ b/translations/bg/.co-op-translator.json @@ -24,8 +24,8 @@ "language_code": "bg" }, "1-Introduction/3-fairness/README.md": { - "original_hash": "9a6b702d1437c0467e3c5c28d763dac2", - "translation_date": "2025-09-05T00:20:49+00:00", + "original_hash": "0f00d72169a0d37eecfd16d71e01700a", + "translation_date": "2026-07-14T06:25:07+00:00", "source_file": "1-Introduction/3-fairness/README.md", "language_code": "bg" }, @@ -54,8 +54,8 @@ "language_code": "bg" }, "2-Regression/1-Tools/README.md": { - "original_hash": "fa81d226c71d5af7a2cade31c1c92b88", - "translation_date": "2025-09-04T23:34:53+00:00", + "original_hash": "0b8635427b582d03ea4ab7089b93e505", + "translation_date": "2026-07-14T06:21:26+00:00", "source_file": "2-Regression/1-Tools/README.md", "language_code": "bg" }, @@ -72,8 +72,8 @@ "language_code": "bg" }, "2-Regression/2-Data/README.md": { - "original_hash": "7c077988328ebfe33b24d07945f16eca", - "translation_date": "2025-09-04T23:40:27+00:00", + "original_hash": "a58b2c4d16c6b122643391745ac15af6", + "translation_date": "2026-07-14T06:22:39+00:00", "source_file": "2-Regression/2-Data/README.md", "language_code": "bg" }, @@ -89,6 +89,12 @@ "source_file": "2-Regression/2-Data/solution/Julia/README.md", "language_code": "bg" }, + "2-Regression/2-Data/solution/notebook.ipynb": { + "original_hash": "96b95f8cf473481f2f371de8156f1571", + "translation_date": "2026-07-14T05:54:15+00:00", + "source_file": "2-Regression/2-Data/solution/notebook.ipynb", + "language_code": "bg" + }, "2-Regression/3-Linear/README.md": { "original_hash": "8b776e731c35b171d316d01d0e7b1369", "translation_date": "2026-04-26T19:11:25+00:00", @@ -457,7 +463,7 @@ }, "8-Reinforcement/1-QLearning/README.md": { "original_hash": "911efd5e595089000cb3c16fce1beab8", - "translation_date": "2025-09-05T01:05:29+00:00", + "translation_date": "2026-07-14T06:23:57+00:00", "source_file": "8-Reinforcement/1-QLearning/README.md", "language_code": "bg" }, @@ -523,7 +529,7 @@ }, "9-Real-World/2-Debugging-ML-Models/README.md": { "original_hash": "df2b538e8fbb3e91cf0419ae2f858675", - "translation_date": "2025-09-05T00:14:20+00:00", + "translation_date": "2026-07-14T06:26:25+00:00", "source_file": "9-Real-World/2-Debugging-ML-Models/README.md", "language_code": "bg" }, @@ -581,6 +587,19 @@ "source_file": "TROUBLESHOOTING.md", "language_code": "bg" }, + "__translation_failures__": { + "sketchnotes/LICENSE.md": { + "original_hash": "fba3b94d88bfb9b81369b869a1e9a20f", + "source_file": "sketchnotes/LICENSE.md", + "language_code": "bg", + "failure_date": "2026-07-14T06:20:21+00:00", + "status": "failed", + "error_type": "TranslationIncompleteError", + "error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.", + "translator_version": "0.20.0", + "failure_policy_version": 1 + } + }, "docs/_sidebar.md": { "original_hash": "68dd06c685f6ce840e0acfa313352e7c", "translation_date": "2025-09-05T00:07:57+00:00", diff --git a/translations/bg/1-Introduction/3-fairness/README.md b/translations/bg/1-Introduction/3-fairness/README.md index be927a095..94e339ce2 100644 --- a/translations/bg/1-Introduction/3-fairness/README.md +++ b/translations/bg/1-Introduction/3-fairness/README.md @@ -1,140 +1,167 @@ -# Създаване на решения за машинно обучение с отговорен AI - -![Обобщение на отговорния AI в машинното обучение в скица](../../../../sketchnotes/ml-fairness.png) -> Скица от [Tomomi Imura](https://www.twitter.com/girlie_mac) - -## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/) +# Създаване на решения за машинно обучение с отговорен ИИ + +![Обобщение на отговорния ИИ в машинното обучение в скичнот](../../../../translated_images/bg/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, като следвате този [учебен път](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) +Научете повече за отговорния ИИ, като следвате този [Обучителен път](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) -[![Подходът на Microsoft към отговорния AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Подходът на Microsoft към отговорния AI") +[![Подходът на Microsoft към отговорния ИИ](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Подходът на Microsoft към отговорния ИИ") -> 🎥 Кликнете върху изображението по-горе за видео: Подходът на Microsoft към отговорния AI +> 🎥 Кликнете върху изображението по-горе за видео: Подходът на Microsoft към отговорния ИИ ## Справедливост -AI системите трябва да третират всички справедливо и да избягват различно въздействие върху сходни групи хора. Например, когато AI системите предоставят насоки за медицинско лечение, заявления за заеми или заетост, те трябва да правят същите препоръки на всички със сходни симптоми, финансови обстоятелства или професионални квалификации. Всеки от нас като хора носи наследени предразсъдъци, които влияят на нашите решения и действия. Тези предразсъдъци могат да бъдат очевидни в данните, които използваме за обучение на AI системи. Такава манипулация понякога може да се случи неволно. Често е трудно съзнателно да се осъзнае кога въвеждате предразсъдъци в данните. +ИИ системите трябва да третират всички справедливо и да избягват да засягат подобни групи хора по различен начин. Например, когато ИИ системи предоставят насока за медицинско лечение, заявления за заеми или заетост, те трябва да дават същите препоръки на всички с подобни симптоми, финансова ситуация или професионални квалификации. Всеки от нас като човек носи в себе си унаследени предразсъдъци, които влияят на нашите решения и действия. Тези предразсъдъци могат да са видими в данните, с които обучаваме ИИ системи. Такова манипулиране понякога се случва несъзнателно. Често е трудно да осъзнаете кога въвеждате пристрастие в данните. -**„Несправедливост“** обхваща негативни въздействия или „вреди“ за група хора, като тези, дефинирани по отношение на раса, пол, възраст или статус на инвалидност. Основните вреди, свързани със справедливостта, могат да бъдат класифицирани като: +**„Несправедливостта“** обхваща отрицателни въздействия, или „вреди“, за група хора, например определени чрез раса, пол, възраст или статус на увреждане. Основните вреди, свързани със справедливостта, могат да се класифицират като: -- **Разпределение**, ако например даден пол или етнос е предпочитан пред друг. -- **Качество на услугата**. Ако обучите данните за един специфичен сценарий, но реалността е много по-сложна, това води до лошо представяне на услугата. Например, дозатор за сапун, който не може да разпознае хора с тъмна кожа. [Референция](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) -- **Омаловажаване**. Несправедливо критикуване и етикетиране на нещо или някого. Например, технология за етикетиране на изображения, която скандално етикетира изображения на хора с тъмна кожа като горили. -- **Прекомерно или недостатъчно представяне**. Идеята е, че определена група не се вижда в определена професия, и всяка услуга или функция, която продължава да насърчава това, допринася за вреда. -- **Стереотипизиране**. Свързване на дадена група с предварително зададени атрибути. Например, система за превод между английски и турски може да има неточности поради думи със стереотипни асоциации към пола. +- **Разпределение**, ако например се фаворизира пол или етнос пред друг. +- **Качество на услугата**. Ако обучите данните за един конкретен сценарий, но реалността е много по-сложна, това води до лошо представяне. Например, дозатор за течен сапун, който изглежда не може да разпознава хора с тъмна кожа. [Референция](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) +- **Дениграция**. Несправедливо критикуване и етикетиране на нещо или някого. Например, технология за етикетиране на изображения с лоша слава, че е етикетирала изображения на хора с тъмна кожа като горили. +- **Прекомерно или недостатъчно представителство**. Идеята е, че дадена група не се вижда в определена професия, и всяка услуга или функция, която продължава да насърчава това, допринася за вредата. +- **Стереотипизиране**. Свързване на дадена група с предварително определени характеристики. Например, система за езиков превод между английски и турски може да има неточности поради думи с типични асоциации с пол. -![превод на турски](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png) +![превод на турски](../../../../translated_images/bg/gender-bias-translate-en-tr.f185fd8822c2d437.webp) > превод на турски -![превод обратно на английски](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) +![превод обратно на английски](../../../../translated_images/bg/gender-bias-translate-tr-en.4eee7e3cecb8c70e.webp) > превод обратно на английски -Когато проектираме и тестваме AI системи, трябва да гарантираме, че AI е справедлив и не е програмиран да взема предубедени или дискриминационни решения, които също са забранени за хората. Гарантирането на справедливост в AI и машинното обучение остава сложен социотехнически предизвикателство. +При проектиране и тестване на ИИ системи трябва да гарантираме, че ИИ е справедлив и не е програмиран да взема пристрастни или дискриминационни решения, които също са забранени за хората. Гарантирането на справедливост в ИИ и машинното обучение остава сложен социотехнически предизвикателство. ### Надеждност и безопасност -За да изградим доверие, AI системите трябва да бъдат надеждни, безопасни и последователни при нормални и неочаквани условия. Важно е да знаем как AI системите ще се държат в различни ситуации, особено когато са изключения. Когато изграждаме AI решения, трябва да се съсредоточим значително върху това как да се справим с широк спектър от обстоятелства, които AI решенията биха срещнали. Например, самоуправляваща се кола трябва да постави безопасността на хората като основен приоритет. В резултат AI, който управлява колата, трябва да вземе предвид всички възможни сценарии, които колата може да срещне, като нощ, гръмотевични бури или снежни виелици, деца, които тичат по улицата, домашни любимци, пътни ремонти и др. Колко добре AI системата може да се справи с широк спектър от условия надеждно и безопасно отразява нивото на предвиждане, което специалистът по данни или AI разработчик е взел предвид по време на проектирането или тестването на системата. +За изграждане на доверие ИИ системите трябва да са надеждни, безопасни и последователни при нормални и непредвидени условия. Важно е да знаем как ИИ системите ще се държат в различни ситуации, особено когато са отклонения. При изграждане на ИИ решения трябва да се обърне значително внимание на това как да се справим с широк кръг обстоятелства, с които ИИ решенията могат да се сблъскат. Например, автомобил с автономно управление трябва да постави безопасността на хората като основен приоритет. Като резултат, ИИ, който управлява автомобила, трябва да вземе предвид всички възможни сценарии, с които може да се срещне като нощно време, бури, снежни виелици, деца, тичащи по улицата, домашни любимци, пътни ремонти и т.н. Колко добре една ИИ система може да се справи с разнообразни условия надеждно и безопасно отразява нивото на предвидливост, което е имал датасайнтистът или разработчикът на ИИ при проектирането или тестването на системата. > [🎥 Кликнете тук за видео: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) -### Инклузивност +### Приобщаване -AI системите трябва да бъдат проектирани така, че да ангажират и дават възможност на всички. Когато проектират и внедряват AI системи, специалистите по данни и AI разработчиците идентифицират и адресират потенциални бариери в системата, които биха могли неволно да изключат хора. Например, има 1 милиард хора с увреждания по света. С напредъка на AI те могат да получат достъп до широк спектър от информация и възможности по-лесно в ежедневния си живот. Като адресираме бариерите, създаваме възможности за иновации и разработване на AI продукти с по-добри преживявания, които са от полза за всички. +ИИ системите трябва да бъдат проектирани така, че да ангажират и овластят всички. При проектиране и внедряване на ИИ системи, датасайнтисти и разработчици на ИИ идентифицират и адресират потенциални бариери в системата, които могат несъзнателно да изключат хора. Например, има 1 милиард хора с увреждания по света. С напредъка на ИИ те могат по-лесно да имат достъп до широка гама от информация и възможности в своя ежедневен живот. Като се адресират бариерите, се създават възможности за иновации и разработване на ИИ продукти с по-добро потребителско изживяване, които да са от полза за всички. -> [🎥 Кликнете тук за видео: инклузивност в AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v) +> [🎥 Кликнете тук за видео: приобщаване в ИИ](https://www.microsoft.com/videoplayer/embed/RE4vl9v) ### Сигурност и поверителност -AI системите трябва да бъдат безопасни и да уважават поверителността на хората. Хората имат по-малко доверие в системи, които поставят тяхната поверителност, информация или живот в риск. Когато обучаваме модели за машинно обучение, разчитаме на данни, за да постигнем най-добри резултати. В този процес трябва да се вземе предвид произходът и интегритетът на данните. Например, дали данните са предоставени от потребители или са публично достъпни? Освен това, докато работим с данните, е важно да разработим AI системи, които могат да защитят конфиденциална информация и да устоят на атаки. С разпространението на AI защитата на поверителността и сигурността на важна лична и бизнес информация става все по-критична и сложна. Въпросите за поверителност и сигурност на данните изискват особено внимание за AI, защото достъпът до данни е от съществено значение за AI системите, за да правят точни и информирани прогнози и решения за хората. +ИИ системите трябва да бъдат безопасни и да уважават личната неприкосновеност на хората. Хората имат по-малко доверие в системи, които застрашават тяхната поверителност, информация или живот. При обучението на модели за машинно обучение разчитаме на данни, за да получим най-добрите резултати. При това, трябва да се вземе под внимание произходът и интегритетът на данните. Например, потребителски данни ли са или са публично достъпни? След това, при работа с данните, е важно да се разработят ИИ системи, които могат да защитят конфиденциална информация и да устоят на атаки. С нарастващото използване на ИИ защитата на поверителността и сигурността на важна лична и бизнес информация става все по-критична и сложна. Въпросите за поверителността и сигурността на данните изискват особено внимание за ИИ, защото достъпът до данни е от съществено значение за ИИ системите да правят точни и информирани прогнози и решения за хората. -> [🎥 Кликнете тук за видео: сигурност в AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) +> [🎥 Кликнете тук за видео: сигурност в ИИ](https://www.microsoft.com/videoplayer/embed/RE4voJF) -- Като индустрия постигнахме значителен напредък в поверителността и сигурността, значително подпомогнат от регулации като GDPR (Общ регламент за защита на данните). -- Въпреки това, с AI системите трябва да признаем напрежението между нуждата от повече лични данни за правене на системите по-лични и ефективни – и поверителността. -- Както при раждането на свързани компютри с интернет, наблюдаваме огромен ръст в броя на проблемите със сигурността, свързани с AI. -- В същото време виждаме AI, използван за подобряване на сигурността. Например, повечето съвременни антивирусни скенери се задвижват от AI евристики. -- Трябва да гарантираме, че нашите процеси за анализ на данни хармонично се съчетават с най-новите практики за поверителност и сигурност. +- Като индустрия направихме значителни напредъци в областта на Поверителност и сигурност, значително подпомогнати от регулации като GDPR (Общ регламент за защита на данните). +- Въпреки това при ИИ системите трябва да признаем напрежението между нуждата от повече лични данни, за да се направят системите по-персонални и ефективни – и личната неприкосновеност. +- Както при раждането на свързаните компютри с интернет, също виждаме голямо увеличение на броя на проблемите със сигурността, свързани с ИИ. +- В същото време видяхме ИИ да се използва за подобряване на сигурността. Например, повечето съвременни антивирусни скенери днес се управляват от ИИ евристики. +- Трябва да гарантираме, че нашите процеси в областта на данните се интегрират хармонично с най-новите практики за поверителност и сигурност. -### Прозрачност -AI системите трябва да бъдат разбираеми. Ключова част от прозрачността е обяснението на поведението на AI системите и техните компоненти. Подобряването на разбирането на AI системите изисква заинтересованите страни да разберат как и защо те функционират, за да могат да идентифицират потенциални проблеми с производителността, опасения за безопасността и поверителността, предразсъдъци, изключващи практики или нежелани резултати. Също така вярваме, че тези, които използват AI системи, трябва да бъдат честни и открити относно това кога, защо и как решават да ги внедрят, както и ограниченията на системите, които използват. Например, ако банка използва AI система за подпомагане на решения за потребителско кредитиране, важно е да се изследват резултатите и да се разбере кои данни влияят на препоръките на системата. Правителствата започват да регулират AI в различни индустрии, така че специалистите по данни и организациите трябва да обяснят дали AI системата отговаря на регулаторните изисквания, особено когато има нежелан резултат. +### Прозрачност +ИИ системите трябва да са разбираеми. Ключова част от прозрачността е обяснението на поведението на ИИ системите и техните компоненти. Подобряването на разбирането за ИИ системите изисква заинтересованите страни да разберат как и защо те функционират, за да могат да идентифицират потенциални проблеми с представянето, проблеми със сигурността и поверителността, пристрастия, изключващи практики или нежелани резултати. Ние също вярваме, че тези, които използват ИИ системи, трябва да бъдат честни и откровени за това кога, защо и как избират да ги внедрят. Както и за ограниченията на системите, които използват. Например, ако банка използва ИИ система, за да подпомогне решенията при кредитиране на потребители, е важно да се прегледат резултатите и да се разбере кои данни влияят върху препоръките на системата. Правителствата започват да регулират ИИ в различни индустрии, затова датасайнтисти и организации трябва да могат да обяснят дали ИИ система отговаря на регулаторните изисквания, особено при нежелан резултат. -> [🎥 Кликнете тук за видео: прозрачност в AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) +> [🎥 Кликнете тук за видео: прозрачност в ИИ](https://www.microsoft.com/videoplayer/embed/RE4voJF) -- Тъй като AI системите са толкова сложни, е трудно да се разбере как работят и да се интерпретират резултатите. -- Тази липса на разбиране влияе върху начина, по който тези системи се управляват, оперативизират и документират. -- Тази липса на разбиране, по-важното, влияе върху решенията, взети въз основа на резултатите, които тези системи произвеждат. +- Поради сложността на ИИ системите е трудно да се разбере как работят и да се интерпретират резултатите. +- Този недостиг на разбиране влияе на начина, по който системите се управляват, експлоатират и документират. +- Още по-важно е, че това недоразумение влияе на решенията, изготвени на базата на резултатите, които тези системи генерират. ### Отговорност + +Хората, които проектират и внедряват ИИ системи, трябва да бъдат отговорни за начина, по който техните системи работят. Необходимостта от отговорност е особено важна при чувствителни технологии като лицево разпознаване. Наскоро има нарастващо търсене на технология за лицево разпознаване, особено от правоохранителни органи, които виждат потенциала на технологията за намиране на изчезнали деца. Въпреки това тези технологии потенциално могат да бъдат използвани от правителство, за да застрашат основните свободи на гражданите, например чрез осигуряване на непрекъснато наблюдение на определени лица. Поради това датасайнтисти и организации трябва да носят отговорност за това как техните ИИ системи влияят на индивиди или обществото. -Хората, които проектират и внедряват AI системи, трябва да бъдат отговорни за начина, по който техните системи функционират. Необходимостта от отговорност е особено важна при чувствителни технологии като разпознаване на лица. Напоследък има нарастващо търсене на технологии за разпознаване на лица, особено от организации за правоприлагане, които виждат потенциала на технологията в приложения като намиране на изчезнали деца. Въпреки това, тези технологии могат потенциално да бъдат използвани от правителство, за да поставят основните свободи на гражданите в риск, например чрез непрекъснато наблюдение на конкретни лица. Затова специалистите по данни и организациите трябва да бъдат отговорни за начина, по който тяхната AI система влияе на индивидите или обществото. +[![Водещ изследовател в ИИ предупреждава за масово наблюдение чрез лицево разпознаване](../../../../translated_images/bg/accountability.41d8c0f4b85b6231.webp)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Подходът на Microsoft към отговорния ИИ") -[![Водещ AI изследовател предупреждава за масово наблюдение чрез разпознаване на лица](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Подходът на Microsoft към отговорния AI") +> 🎥 Кликнете върху изображението по-горе за видео: Предупреждения за масово наблюдение чрез лицево разпознаване -> 🎥 Кликнете върху изображението по-горе за видео: Предупреждения за масово наблюдение чрез разпознаване на лица - -В крайна сметка един от най-големите въпроси за нашето поколение, като първото поколение, което въвежда AI в обществото, е как да гарантираме, че компютрите ще останат отговорни пред хората и как да гарантираме, че хората, които проектират компютри, остават отговорни пред всички останали. +В крайна сметка един от най-големите въпроси за нашето поколение, като първото поколение, което въвежда ИИ в обществото, е как да се гарантира, че компютрите ще останат отговорни пред хората и как да се гарантира, че хората, които проектират компютрите, остават отговорни пред всички останали. ## Оценка на въздействието -Преди да обучите модел за машинно обучение, е важно да проведете оценка на въздействието, за да разберете целта на AI системата; какво е предназначението ѝ; къде ще бъде внедрена; и кой ще взаимодейства със системата. Това е полезно за рецензенти или тестери, които оценяват системата, за да знаят какви фактори да вземат предвид при идентифициране на потенциални рискове и очаквани последствия. +Преди да се обучи модел за машинно обучение, е важно да се проведе оценка на въздействието, за да се разбере целта на ИИ системата; как е предназначена да се използва; къде ще бъде внедрена; и кой ще взаимодейства със системата. Това е полезно за рецензенти или тестери, които ще оценяват системата, за да знаят кои фактори да вземат предвид при идентифициране на потенциални рискове и очаквани последствия. + +Следните области са във фокуса при провеждане на оценка на въздействието: + +* **Неблагоприятно въздействие върху индивидите**. Осъзнаването на всякакви ограничения или изисквания, неподдържана употреба или известни ограничения, които възпрепятстват представянето на системата, е от съществено значение, за да се гарантира, че системата не се използва по начин, който може да навреди на индивидите. +* **Изисквания към данните**. Разбирането как и къде системата ще използва данни позволява на рецензентите да проучат всякакви изисквания към данните, които трябва да се спазват (напр. GDPR или HIPAA регулации). Освен това, да се провери дали източникът или количеството данни е достатъчно за обучението. +* **Обобщение на въздействието**. Събират се списък с потенциални вреди, които могат да възникнат от използването на системата. През целия жизнен цикъл на машинното обучение се преглежда дали идентифицираните проблеми са смекчени или адресирани. +* **Приложими цели** за всеки от шестте основни принципа. Оценява се дали целите от всеки от принципите са изпълнени и дали съществуват пропуски. + + +## Отстраняване на грешки с отговорен ИИ + +Подобно на отстраняването на грешки при софтуерно приложение, отстраняването на грешки в ИИ система е необходим процес за идентифициране и разрешаване на проблеми в системата. Много фактори могат да повлияят на това моделът да не работи според очакванията или отговорно. Повечето традиционни метрики за представяне на модела са количествени агрегати на представянето, които не са достатъчни за анализ на нарушения на принципите на отговорен ИИ. Освен това, моделът за машинно обучение е черна кутия, която затруднява разбиране на движущите фактори зад резултата или даването на обяснение при грешка. По-нататък в курса ще научите как да използвате таблото за отговорен ИИ, за да помогнете при отстраняване на грешки на ИИ системи. Таблото предоставя цялостен инструмент за датасайнтисти и разработчици на ИИ да изпълняват: + +* **Анализ на грешки**. За идентифициране на разпределението на грешките на модела, които могат да повлияят на справедливостта или надеждността на системата. +* **Преглед на модела**. За откриване на различия в представянето на модела сред групи данни. +* **Анализ на данните**. За разбиране на разпределението на данните и идентифициране на потенциална пристрастност, която може да доведе до проблеми със справедливостта, приобщаването и надеждността. +* **Интерпретируемост на модела**. За да се разбере какво влияе или определя прогнозите на модела. Това помага при обяснението на поведението на модела, което е важно за прозрачност и отговорност. + + +## 🚀 Предизвикателство + +За да предотвратим въвеждането на вреди още в началото, трябва: + +- да имаме разнообразие от среди и гледни точки сред хората, работещи по системите +- да инвестираме в набори от данни, които отразяват многообразието на нашето общество +- да разработваме по-добри методи през целия жизнен цикъл на машинното обучение за откриване и коригиране на нарушения на отговорния ИИ, когато възникнат -Следните са области на фокус при провеждане на оценка на въздействието: +Помислете за реални ситуации, в които недоверие към модел е очевидно при изграждане и използване на модел. Какво още трябва да вземем под внимание? -* **Неблагоприятно въздействие върху индивидите**. Осъзнаването на всякакви ограничения или изисквания, неподдържана употреба или известни ограничения, които възпрепятстват производителността на системата, е жизненоважно, за да се гарантира, че системата не се използва по начин, който може да причини вреда на индивидите. -* **Изисквания за данни**. Разбирането на това как и къде системата ще използва данни позволява на рецензентите да изследват всякакви изисквания за данни, които трябва да се вземат предвид (например, GDPR или HIPPA регулации за данни). Освен това, проверете дали източникът или количеството данни са достатъчни за обучение. -* **Обобщение на въздействието**. Съберете списък с потенциални вреди, които могат да възникнат от използването на системата. През целия жизнен цикъл на ML проверявайте дали идентифицираните проблеми са смекчени или адресирани. -* **Приложими цели** за всяка от шестте основни принципа. Оценете дали целите от всеки принцип са постигнати и дали има пропуски. +## [Квиз след лекцията](https://ff-quizzes.netlify.app/en/ml/) -## Дебъгване с отговорен AI +## Преглед и самостоятелно изучаване + -Подобно на дебъгването на софтуерно приложение, дебъгването на AI система е необходим процес за идентифициране и разрешаване на проблеми в системата. Има много фактори, които могат да повлияят на модела да не работи според очакванията или отговорно. Повечето традиционни метрики за производителност на модела са количествени агрегати на производителността на модела, които не са достатъчни за анализиране как моделът нарушава принципите на отговорния AI. Освен това, моделът за машинно обучение е черна кутия, което затруднява разбирането на това, което движи неговия резултат или предоставянето на обяснение, когато прави греш -Гледайте този уъркшоп, за да се задълбочите в темите: +В този урок научихте някои основи на концепциите за справедливост и несправедливост в машинното обучение. + +Гледайте този уъркшоп, за да се потопите по-дълбоко в темите: -- В търсене на отговорен AI: Превръщане на принципите в практика от Бесмира Нуши, Мехрнуш Самеки и Амит Шарма +- В преследване на отговорния изкуствен интелект: Прилагането на принципите на практика от Бесмира Нуши, Мехрнуш Самеки и Амит Шарма -[![Responsible AI Toolbox: Отворена рамка за изграждане на отговорен AI](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Отворена рамка за изграждане на отговорен AI") +[![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 от Бесмира Нуши, Мехрнуш Самеки и Амит Шарма +> 🎥 Кликнете върху изображението по-горе за видео: RAI Toolbox: Отворена рамка за изграждане на отговорен ИИ от Бесмира Нуши, Мехрнуш Самеки и Амит Шарма -Също така, прочетете: +Също така, прочетете: -- Ресурсният център на Microsoft за отговорен AI: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) +- Ресурсен център за отговорен ИИ на 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/) +- Изследователска група FATE на Microsoft: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) -RAI Toolbox: +RAI Toolbox: -- [GitHub хранилище на Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox) +- [Отворено хранилище GitHub на Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox) -Прочетете за инструментите на Azure Machine Learning за осигуряване на справедливост: +Прочетете за инструментите на Azure Machine Learning за гарантиране на справедливост: -- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) +- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) ## Задача -[Разгледайте RAI Toolbox](assignment.md) +[Изследвайте RAI Toolbox](assignment.md) --- -**Отказ от отговорност**: -Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод. \ No newline at end of file + +**Отказ от отговорност**: +Този документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод. + \ No newline at end of file diff --git a/translations/bg/2-Regression/1-Tools/README.md b/translations/bg/2-Regression/1-Tools/README.md index cee531bf5..386d777f9 100644 --- a/translations/bg/2-Regression/1-Tools/README.md +++ b/translations/bg/2-Regression/1-Tools/README.md @@ -1,55 +1,55 @@ # Започнете с Python и Scikit-learn за регресионни модели -![Обобщение на регресиите в скица](../../../../sketchnotes/ml-regression.png) +![Резюме на регресиите в скицник](../../../../translated_images/bg/ml-regression.4e4f70e3b3ed446e.webp) -> Скица от [Tomomi Imura](https://www.twitter.com/girlie_mac) +> Скицник от [Tomomi Imura](https://www.twitter.com/girlie_mac) -## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/) +## [Квиз преди лекцията](https://ff-quizzes.netlify.app/en/ml/) > ### [Този урок е наличен и на R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) ## Въведение -В тези четири урока ще научите как да изграждате регресионни модели. Ще обсъдим за какво служат те след малко. Но преди да започнете, уверете се, че разполагате с правилните инструменти, за да стартирате процеса! +В тези четири урока ще откриете как да изграждате регресионни модели. Скоро ще обсъдим за какво служат те. Но преди да започнете каквото и да е, уверете се, че имате правилните инструменти за започване на процеса! В този урок ще научите как да: -- Конфигурирате компютъра си за локални задачи по машинно обучение. -- Работите с Jupyter notebooks. +- Конфигурирате вашия компютър за локални задачи за машинно обучение. +- Работите с Jupyter Notebooks. - Използвате Scikit-learn, включително инсталация. -- Изследвате линейна регресия чрез практическо упражнение. +- Изследвате линейната регресия чрез практически упражнение. ## Инсталации и конфигурации -[![Машинно обучение за начинаещи - Настройте инструментите си за изграждане на модели за машинно обучение](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "Машинно обучение за начинаещи - Настройте инструментите си за изграждане на модели за машинно обучение") +[![ML за начинаещи - Настройте инструментите си готови за изграждане на модели за машинно обучение](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML за начинаещи - Настройте инструментите си готови за изграждане на модели за машинно обучение") -> 🎥 Кликнете върху изображението по-горе за кратко видео за конфигуриране на компютъра за машинно обучение. +> 🎥 Кликнете върху изображението горе за кратко видео със стъпките за конфигуриране на компютъра за 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), които улесняват настройката за някои потребители. +1. **Инсталирайте Python**. Уверете се, че на вашия компютър е инсталиран [Python](https://www.python.org/downloads/). Ще използвате Python за много задачи в науката за данни и машинното обучение. Повечето компютърни системи вече включват инсталация на Python. Има полезни [Python пакети за кодиране](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott), които улесняват настройката за някои потребители. - Някои приложения на Python обаче изискват една версия на софтуера, докато други изискват различна версия. Поради тази причина е полезно да работите в [виртуална среда](https://docs.python.org/3/library/venv.html). + Някои употреби на Python обаче изискват една версия на софтуера, а други - различна версия. Поради тази причина е полезно да работите в [виртуална среда](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. +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, като преминете през тази колекция от [модули за обучение](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) + > Запознайте се с Python чрез този сбор от [учебни модули](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. + > 🎥 Кликнете върху изображението горе за видео: използване на Python във VS Code. -3. **Инсталирайте Scikit-learn**, като следвате [тези инструкции](https://scikit-learn.org/stable/install.html). Тъй като трябва да използвате Python 3, препоръчително е да използвате виртуална среда. Обърнете внимание, че ако инсталирате тази библиотека на Mac с M1, има специални инструкции на страницата, посочена по-горе. +3. **Инсталирайте Scikit-learn**, като следвате [тези инструкции](https://scikit-learn.org/stable/install.html). Тъй като трябва да използвате Python 3, препоръчително е да използвате виртуална среда. Забележете, ако инсталирате тази библиотека на M1 Mac, има специални инструкции на гореспоменатия сайт. -4. **Инсталирайте Jupyter Notebook**. Ще трябва да [инсталирате пакета Jupyter](https://pypi.org/project/jupyter/). +1. **Инсталирайте Jupyter Notebook**. Трябва да [инсталирате пакета Jupyter](https://pypi.org/project/jupyter/). -## Вашата среда за авторство на машинно обучение +## Вашата среда за разработка на ML -Ще използвате **notebooks**, за да разработвате своя Python код и да създавате модели за машинно обучение. Този тип файлове е често срещан инструмент за специалисти по данни и може да бъде разпознат по разширението `.ipynb`. +Ще използвате **notebooks** за разработка на Python код и създаване на модели за машинно обучение. Този тип файлове е общ инструмент за специалисти по данни, и могат да бъдат разпознати по суфикса или разширението `.ipynb`. -Notebooks са интерактивна среда, която позволява на разработчика както да кодира, така и да добавя бележки и документация около кода, което е доста полезно за експериментални или изследователски проекти. +Notebooks са интерактивна среда, която позволява на разработчика както да кодира, така и да добавя бележки и документация около кода, което е много полезно за експериментални или изследователски проекти. -[![Машинно обучение за начинаещи - Настройка на Jupyter Notebooks за започване на изграждане на регресионни модели](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "Машинно обучение за начинаещи - Настройка на Jupyter Notebooks за започване на изграждане на регресионни модели") +[![ML за начинаещи - Настройте Jupyter Notebooks, за да започнете изграждане на регресионни модели](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML за начинаещи - Настройте Jupyter Notebooks, за да започнете изграждане на регресионни модели") -> 🎥 Кликнете върху изображението по-горе за кратко видео за това упражнение. +> 🎥 Кликнете върху изображението горе за кратко видео с упражнението. ### Упражнение - работа с notebook @@ -57,50 +57,51 @@ Notebooks са интерактивна среда, която позволяв 1. Отворете _notebook.ipynb_ във Visual Studio Code. - Ще стартира Jupyter сървър с Python 3+. Ще намерите области в notebook-а, които могат да бъдат `изпълнени`, т.е. части от код. Можете да изпълните блок с код, като изберете иконата, която изглежда като бутон за възпроизвеждане. + Ще стартира Jupyter сървър с Python 3+. Ще намерите области на notebook-а, които могат да се `изпълнят`, парчета код. Можете да стартирате блок код, като изберете иконата, която прилича на бутон за пускане. -2. Изберете иконата `md` и добавете малко markdown с текста **# Добре дошли в своя notebook**. +1. Изберете иконата `md` и добавете малко markdown с текста **# Добре дошли във вашия notebook**. След това добавете малко Python код. -3. Въведете **print('hello notebook')** в блока с код. -4. Изберете стрелката, за да изпълните кода. +1. Въведете **print('hello notebook')** в блока с код. +1. Изберете стрелката, за да стартирате кода. - Трябва да видите отпечатаното съобщение: + Трябва да видите отпечатаното изявление: ```output hello notebook ``` -![VS Code с отворен notebook](../../../../2-Regression/1-Tools/images/notebook.jpg) +![VS Code с отворен notebook](../../../../translated_images/bg/notebook.4a3ee31f396b8832.webp) -Можете да преплитате кода си с коментари, за да документирате сами notebook-а. +Можете да редувате вашия код с коментари, за да документирате notebook-а. -✅ Помислете за момент колко различна е работната среда на уеб разработчика в сравнение с тази на специалиста по данни. +✅ Помислете за момент колко различна е работната среда на уеб разработчик спрямо тази на специалист по данни. -## Стартиране със Scikit-learn +## Натам и с Scikit-learn -Сега, когато Python е настроен във вашата локална среда и сте се запознали с Jupyter notebooks, нека се запознаем и със Scikit-learn (произнася се `сай`, както в `наука`). Scikit-learn предоставя [обширен API](https://scikit-learn.org/stable/modules/classes.html#api-ref), който ще ви помогне да изпълнявате задачи по машинно обучение. +Сега, когато Python е настроен във вашата локална среда и сте уверени с Jupyter Notebooks, нека се запознаем и с Scikit-learn (произнася се 'сай', както в 'science'). Scikit-learn предоставя [обширен API](https://scikit-learn.org/stable/modules/classes.html#api-ref), който да ви помогне с машинно-обучителни задачи. -Според техния [уебсайт](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn е библиотека с отворен код за машинно обучение, която поддържа контролирано и неконтролирано обучение. Тя също така предоставя различни инструменти за напасване на модели, предварителна обработка на данни, избор и оценка на модели, както и много други полезности." +Според техния [уебсайт](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn е библиотека с отворен код за машинно обучение, която поддържа надзирано и ненадзирано обучение. Тя също така предоставя различни инструменти за настройка на модели, предварителна обработка на данни, избор и оценка на модели и много други." -В този курс ще използвате Scikit-learn и други инструменти, за да изграждате модели за машинно обучение за изпълнение на това, което наричаме 'традиционни задачи по машинно обучение'. Умишлено сме избегнали невронни мрежи и дълбоко обучение, тъй като те са по-добре обхванати в предстоящата ни учебна програма 'AI за начинаещи'. +В този курс ще използвате Scikit-learn и други инструменти за изграждане на модели за машинно обучение, които изпълняват това, което наричаме 'традиционни задачи за машинно обучение'. Целенасочено сме избегнали невронните мрежи и дълбокото обучение, понеже те се разглеждат по-добре в предстоящия ни курс 'ИИ за начинаещи'. -Scikit-learn прави изграждането и оценяването на модели лесно за използване. Тя е основно фокусирана върху използването на числови данни и съдържа няколко готови набора от данни за използване като учебни инструменти. Тя също така включва предварително изградени модели, които студентите могат да изпробват. Нека изследваме процеса на зареждане на предварително пакетирани данни и използване на вграден оценител за първия ML модел със Scikit-learn с някои основни данни. +Scikit-learn улеснява изграждането и оценката на модели за използване. Тя е основно фокусирана върху числови данни и включва няколко готови набора от данни за учене. Също така включва предварително изградени модели за изпробване от студенти. Нека първо да разгледаме процеса на зареждане на предварително пакетирани данни и използване на вграден оценител - първи ML модел със Scikit-learn с някои основни данни. ## Упражнение - вашият първи Scikit-learn notebook -> Това ръководство е вдъхновено от [примера за линейна регресия](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) на уебсайта на 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") -> 🎥 Кликнете върху изображението по-горе за кратко видео за това упражнение. +[![ML за начинаещи - Вашият първи проект за линейна регресия в Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML за начинаещи - Вашият първи проект за линейна регресия в Python") -Във файла _notebook.ipynb_, свързан с този урок, изчистете всички клетки, като натиснете иконата 'кошче'. +> 🎥 Кликнете върху изображението горе за кратко видео с упражнението. -В този раздел ще работите с малък набор от данни за диабет, който е вграден в Scikit-learn за учебни цели. Представете си, че искате да тествате лечение за пациенти с диабет. Моделите за машинно обучение могат да ви помогнат да определите кои пациенти биха реагирали по-добре на лечението въз основа на комбинации от променливи. Дори много основен регресионен модел, когато е визуализиран, може да покаже информация за променливи, които биха ви помогнали да организирате теоретичните си клинични изпитвания. +Във файла _notebook.ipynb_, свързан с този урок, изчистете всички клетки, като натиснете иконата на 'кошче'. -✅ Съществуват много видове методи за регресия, и кой ще изберете зависи от въпроса, на който искате да отговорите. Ако искате да предскажете вероятната височина на човек на дадена възраст, ще използвате линейна регресия, тъй като търсите **числова стойност**. Ако се интересувате дали даден вид кухня трябва да се счита за веганска или не, търсите **категорийно присвояване**, така че ще използвате логистична регресия. Ще научите повече за логистичната регресия по-късно. Помислете малко за въпроси, които можете да зададете на данните, и кой от тези методи би бил по-подходящ. +В тази секция ще работите с малък набор от данни за диабет, вграден в Scikit-learn за учебни цели. Представете си, че искате да тествате лечение за диабетни пациенти. Моделите за машинно обучение може да ви помогнат да определите кои пациенти биха реагирали по-добре на лечението, базирайки се на комбинации от променливи. Дори много основен регресионен модел, визуализиран, може да покаже информация за променливи, която би помогнала при организирането на теоретични клинични изпитвания. + +✅ Има много видове регресионни методи, и кой ще изберете зависи от въпроса, който търсите да отговорите. Ако искате да предскажете вероятна височина за човек на определена възраст, ще използвате линейна регресия, тъй като търсите **числова стойност**. Ако ви интересува дали даден тип кухня трябва да се счита за веганска или не, търсите **класовa принадлежност**, затова ще използвате логистична регресия. Ще научите повече за логистичната регресия по-нататък. Помислете малко за някои въпроси, които можете да зададете на данни, и кой от тези методи би бил по-подходящ. Нека започнем с тази задача. @@ -108,11 +109,11 @@ Scikit-learn прави изграждането и оценяването на За тази задача ще импортираме някои библиотеки: -- **matplotlib**. Това е полезен [инструмент за графики](https://matplotlib.org/), който ще използваме за създаване на линейна графика. +- **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. Добавете импорти, като въведете следния код: @@ -122,26 +123,26 @@ Scikit-learn прави изграждането и оценяването на from sklearn import datasets, linear_model, model_selection ``` - По-горе импортирате `matplotlib`, `numpy` и импортирате `datasets`, `linear_model` и `model_selection` от `sklearn`. `model_selection` се използва за разделяне на данни на тренировъчни и тестови набори. + По-горе импортирате `matplotlib`, `numpy` и импортирате `datasets`, `linear_model` и `model_selection` от `sklearn`. `model_selection` се използва за разделяне на данните на обучителен и тестов комплект. ### Наборът от данни за диабет -Вграденият [набор от данни за диабет](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) включва 442 проби от данни за диабет с 10 характеристични променливи, някои от които включват: +Вграденият [набор от данни за диабет](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) включва 442 проби с данни за диабет с 10 характеристични променливи, някои от които са: -- age: възраст в години +- възраст: възраст в години - bmi: индекс на телесна маса - bp: средно кръвно налягане -- s1 tc: Т-клетки (вид бели кръвни клетки) +- s1 tc: T-клетки (вид бели кръвни клетки) -✅ Този набор от данни включва концепцията за 'пол' като характеристична променлива, важна за изследванията около диабета. Много медицински набори от данни включват този тип бинарна класификация. Помислете малко как подобни категоризации могат да изключат определени части от населението от лечения. +✅ Този набор от данни включва концепцията „пол“ като важна характеристична променлива за изследвания, свързани с диабета. Много медицински набори от данни включват този вид бинарна класификация. Помислете как такива категоризации могат да изключат определени части от населението от лечението. Сега заредете данните X и y. -> 🎓 Запомнете, това е контролирано обучение и ни трябва целева променлива 'y'. +> 🎓 Запомнете, че това е надзиравано обучение, и ни трябва именована цел 'y'. -В нова клетка с код заредете набора от данни за диабет, като извикате `load_diabetes()`. Входът `return_X_y=True` сигнализира, че `X` ще бъде матрица с данни, а `y` ще бъде целта на регресията. +В нов кодов блок заредете набора от данни за диабет, като извикате `load_diabetes()`. Параметърът `return_X_y=True` указва, че `X` ще бъде матрица от данни, а `y` ще бъде целят за регресия. -1. Добавете някои команди за печат, за да покажете формата на матрицата с данни и първия ѝ елемент: +1. Добавете някои команди за печат, за да покажете размера на матрицата и първия й елемент: ```python X, y = datasets.load_diabetes(return_X_y=True) @@ -149,9 +150,9 @@ Scikit-learn прави изграждането и оценяването на print(X[0]) ``` - Това, което получавате като отговор, е кортеж. Това, което правите, е да присвоите първите две стойности на кортежа съответно на `X` и `y`. Научете повече [за кортежите](https://wikipedia.org/wiki/Tuple). + Това, което връщате като отговор, е кортеж. Това, което правите, е да присвоите първите две стойности на кортежа на `X` и `y` съответно. Научете повече [за кортежите](https://wikipedia.org/wiki/Tuple). - Можете да видите, че тези данни имат 442 елемента, оформени в масиви от 10 елемента: + Можете да видите, че този набор има 442 елемента, подредени в масиви с по 10 елемента: ```text (442, 10) @@ -159,9 +160,9 @@ Scikit-learn прави изграждането и оценяването на -0.04340085 -0.00259226 0.01990842 -0.01764613] ``` - ✅ Помислете малко за връзката между данните и целевата променлива. Линейната регресия предсказва връзките между характеристиката X и целевата променлива y. Можете ли да намерите [целта](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) за набора от данни за диабет в документацията? Какво демонстрира този набор от данни, като се има предвид целта? + ✅ Помислете малко за връзката между данните и целта на регресията. Линейната регресия предсказва връзки между характеристика X и целева променлива y. Можете ли да намерите [цела](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) за набора от данни за диабет в документацията? Какво демонстрира този набор от данни, предвид тази цел? -2. След това изберете част от този набор от данни за графика, като изберете третата колона от набора от данни. Можете да направите това, като използвате оператора `:` за избор на всички редове и след това изберете третата колона, използвайки индекса (2). Можете също така да преформатирате данните в 2D масив - както се изисква за графиката - като използвате `reshape(n_rows, n_columns)`. Ако един от параметрите е -1, съответното измерение се изчислява автоматично. +2. След това изберете част от този набор за изобразяване, като изберете 3-тата колона на набора. Можете да го направите, като използвате оператора `:` за избиране на всички редове, след което изберете 3-тата колона с индекс (2). Можете също да преформатирате данните в 2D масив - както е необходимо за изчертаване - чрез използване на `reshape(n_rows, n_columns)`. Ако един от параметрите е -1, съответното измерение се изчислява автоматично. ```python X = X[:, 2] @@ -170,28 +171,28 @@ Scikit-learn прави изграждането и оценяването на ✅ По всяко време отпечатвайте данните, за да проверите формата им. -3. Сега, когато имате данни, готови за графика, можете да видите дали машината може да помогне за определяне на логическо разделение между числата в този набор от данни. За да направите това, трябва да разделите както данните (X), така и целта (y) на тестови и тренировъчни набори. Scikit-learn има лесен начин за това; можете да разделите тестовите си данни в дадена точка. +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()`: +4. Сега сте готови да обучите модела! Заредете линейния регресионен модел и го обучете с вашите обучителни множества X и y, използвайки `model.fit()`: ```python model = linear_model.LinearRegression() model.fit(X_train, y_train) ``` - ✅ `model.fit()` е функция, която ще виждате в много библиотеки за машинно обучение, като TensorFlow. + ✅ `model.fit()` е функция, която ще срещнете в много ML библиотеки като TensorFlow -5. След това създайте предсказание, използвайки тестовите данни, с помощта на функцията `predict()`. Това ще се използва за начертаване на линия между групите данни. +5. След това направете прогноза, използвайки тестовите данни, с функцията `predict()`. Това ще се използва за изчертаване на линия между групите данни. ```python y_pred = model.predict(X_test) ``` -6. Сега е време да покажете данните в графика. Matplotlib е много полезен инструмент за тази задача. Създайте разпръсната графика на всички тестови данни X и y и използвайте предсказанието, за да начертаете линия на най-подходящото място между групите данни на модела. +6. Сега е време да покажете данните в графика. Matplotlib е много полезен инструмент за тази задача. Създайте scatterplot на всички тестови данни X и y и използвайте прогнозата, за да нарисувате линия на най-подходящото място между групите данни на модела. ```python plt.scatter(X_test, y_test, color='black') @@ -202,28 +203,32 @@ Scikit-learn прави изграждането и оценяването на plt.show() ``` - ![разпръсната графика, показваща точки от данни за диабет](../../../../2-Regression/1-Tools/images/scatterplot.png) -✅ Помислете малко какво се случва тук. Една права линия минава през множество малки точки от данни, но какво точно прави тя? Можете ли да видите как бихте могли да използвате тази линия, за да предскажете къде нова, невиждана точка от данни би трябвало да се намира спрямо y оста на графиката? Опитайте се да обясните с думи практическата употреба на този модел. + ![scatterplot, показващ точки на данни за диабет](../../../../translated_images/bg/scatterplot.ad8b356bcbb33be6.webp) + + + ✅ Помислете малко върху това, което се случва тук. Една права линия преминава през множество малки точки с данни, но какво точно прави тя? Виждате ли как трябва да можете да използвате тази линия, за да предскажете къде нова, ненаблюдавана точка данни би трябвало да се разположи спрямо оста y на графиката? Опитайте да изразите с думи практическото приложение на този модел. -Поздравления, създадохте първия си модел за линейна регресия, направихте предсказание с него и го визуализирахте в графика! +Поздравления, създадохте първия си модел за линейна регресия, направихте прогноза с него и го визуализирахте в графика! --- ## 🚀Предизвикателство -Начертайте графика с различна променлива от този набор от данни. Подсказка: редактирайте този ред: `X = X[:,2]`. С оглед на целта на този набор от данни, какво можете да откриете за прогресията на диабета като заболяване? -## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/) +Начертайте друга променлива от този набор от данни. Подсказка: редактирайте този ред: `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://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), за да задълбочите разбирането си. +Прочетете повече за концепцията за регресия и помислете какви въпроси могат да бъдат отговорени чрез тази техника. Вземете този [урок](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott), за да задълбочите разбирането си. ## Задача -[Различен набор от данни](assignment.md) +[Друг набор от данни](assignment.md) --- -**Отказ от отговорност**: -Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод. \ No newline at end of file + +**Отказ от отговорност**: +Този документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод. + \ No newline at end of file diff --git a/translations/bg/2-Regression/2-Data/README.md b/translations/bg/2-Regression/2-Data/README.md index b31b820f0..faf6f2f98 100644 --- a/translations/bg/2-Regression/2-Data/README.md +++ b/translations/bg/2-Regression/2-Data/README.md @@ -1,62 +1,62 @@ -# Създаване на регресионен модел с помощта на Scikit-learn: подготовка и визуализация на данни +# Създаване на регресионен модел с помощта на Scikit-learn: подготвяне и визуализация на данни -![Инфографика за визуализация на данни](../../../../2-Regression/2-Data/images/data-visualization.png) +![Инфографика за визуализация на данни](../../../../translated_images/bg/data-visualization.54e56dded7c1a804.webp) Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded) -## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/) +## [Квиз преди лекцията](https://ff-quizzes.netlify.app/en/ml/) -> ### [Тази лекция е налична и на R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) +> ### [Този урок е наличен на R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) ## Въведение -След като сте настроили инструментите, необходими за изграждане на модели за машинно обучение със Scikit-learn, сте готови да започнете да задавате въпроси към вашите данни. Докато работите с данни и прилагате ML решения, е изключително важно да знаете как да задавате правилните въпроси, за да отключите потенциала на вашия набор от данни. +След като вече разполагате с необходимите инструменти, за да започнете да създавате модели за машинно обучение със Scikit-learn, сте готови да започнете да задавате въпроси към своите данни. Когато работите с данни и прилагате решения с машинно обучение, е много важно да разберете как да зададете правилния въпрос, за да отключите пълния потенциал на вашия набор от данни. -В тази лекция ще научите: +В този урок ще научите: -- Как да подготвите данните си за изграждане на модели. +- Как да подготвите данните си за създаване на модел. - Как да използвате Matplotlib за визуализация на данни. +- Как да използвате Seaborn за по-изразителна визуализация на данни. ## Задаване на правилния въпрос към вашите данни -Въпросът, който искате да получите отговор, ще определи какъв тип ML алгоритми ще използвате. А качеството на отговора, който ще получите, ще зависи силно от естеството на вашите данни. +Въпросът, на който трябва да получите отговор, ще определи какъв вид алгоритми за машинно обучение ще използвате. А качеството на отговора, който получите, ще зависи силно от естеството на вашите данни. -Разгледайте [данните](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), предоставени за тази лекция. Можете да отворите този .csv файл в VS Code. Бърз преглед веднага показва, че има празни полета и смесица от текстови и числови данни. Има и странна колона, наречена 'Package', където данните са смесица от 'sacks', 'bins' и други стойности. Данните, всъщност, са малко хаотични. +Разгледайте [данните](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 за начинаещи - Как да анализираме и почистим набор от данни") +[![ML за начинаещи - Как да анализирате и почистите набор от данни](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML за начинаещи - Как да анализирате и почистите набор от данни") -> 🎥 Кликнете върху изображението по-горе за кратко видео, което показва как да подготвите данните за тази лекция. +> 🎥 Кликнете върху изображението по-горе за кратко видео, в което се разглежда подготовката на данните за този урок. -Всъщност, не е много често да получите набор от данни, който е напълно готов за създаване на ML модел директно. В тази лекция ще научите как да подготвите суров набор от данни, използвайки стандартни Python библиотеки. Ще научите и различни техники за визуализация на данни. +Всъщност не е често да получите директно набор от данни, който да е напълно готов за създаване на модел за машинно обучение. В този урок ще научите как да подготвите суров набор от данни, използвайки стандартни библиотеки на Python. Също така ще научите различни техники за визуализация на данните. -## Казус: 'пазарът на тикви' +## Казус: „пазара на тиквите“ -В тази папка ще намерите .csv файл в основната папка `data`, наречен [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), който включва 1757 реда данни за пазара на тикви, сортирани по градове. Това са сурови данни, извлечени от [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), разпространявани от Министерството на земеделието на САЩ. +В тази папка ще намерите .csv файл в основната папка `data`, наречен [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), който съдържа 1757 реда с данни за пазара на тикви, сортирани по групи по градове. Това са сурови данни, извлечени от [Специализираните терминални пазари за култури - стандартни отчети](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), разпространявани от Министерството на земеделието на САЩ. -### Подготовка на данни +### Подготовка на данните -Тези данни са в публичното пространство. Те могат да бъдат изтеглени в много отделни файлове, за всеки град, от уебсайта на USDA. За да избегнем твърде много отделни файлове, сме обединили всички данни за градовете в една електронна таблица, така че вече сме _подготвили_ данните малко. Сега нека разгледаме данните по-отблизо. +Тези данни са в публично достояние. Могат да бъдат изтеглени в много отделни файлове, по градове, от уебсайта на USDA. За да избегнем твърде много отделни файлове, ние сме обединили всички градски данни в една таблица, така че вече сме леко _подготвили_ данните. След това нека разгледаме по-подробно данните. ### Данните за тиквите - първоначални заключения -Какво забелязвате за тези данни? Вече видяхте, че има смесица от текстове, числа, празни полета и странни стойности, които трябва да разберете. - -Какъв въпрос можете да зададете към тези данни, използвайки регресионна техника? Например: "Предскажете цената на тиква за продажба през даден месец". Поглеждайки отново към данните, има някои промени, които трябва да направите, за да създадете необходимата структура на данните за задачата. +Какво забелязвате по тези данни? Вече видяхте, че има смесица от низове, числа, празни места и странни стойности, които трябва да разберете. +Какъв въпрос можете да зададете към тези данни, използвайки техника на регресия? Например „Прогнозирай цената на тиква за продажба през даден месец“. Като погледнете отново данните, има някои промени, които трябва да направите, за да създадете необходимата структура от данни за тази задача. ## Упражнение - анализирайте данните за тиквите -Нека използваме [Pandas](https://pandas.pydata.org/) (името означава `Python Data Analysis`), инструмент, много полезен за оформяне на данни, за да анализираме и подготвим тези данни за тиквите. +Нека използваме [Pandas](https://pandas.pydata.org/) (името означава `Python Data Analysis`), много полезен инструмент за оформяне на данни, за да анализираме и подготвим тези данни за тикви. ### Първо, проверете за липсващи дати -Първо трябва да предприемете стъпки, за да проверите за липсващи дати: +Първо ще трябва да предприемете стъпки, за да проверите за липсващи дати: -1. Конвертирайте датите във формат на месец (това са американски дати, така че форматът е `MM/DD/YYYY`). +1. Преобразувайте датите във формат месец (това са американски дати, така че форматът е `MM/DD/YYYY`). 2. Извлечете месеца в нова колона. -Отворете файла _notebook.ipynb_ във Visual Studio Code и импортирайте електронната таблица в нов Pandas dataframe. +Отворете файла _notebook.ipynb_ във Visual Studio Code и импортирайте таблицата в нов Pandas dataframe. -1. Използвайте функцията `head()`, за да видите първите пет реда. +1. Използвайте функцията `head()` за преглед на първите пет реда. ```python import pandas as pd @@ -64,7 +64,7 @@ pumpkins.head() ``` - ✅ Каква функция бихте използвали, за да видите последните пет реда? + ✅ Коя функция бихте използвали, за да видите последните пет реда? 1. Проверете дали има липсващи данни в текущия dataframe: @@ -72,9 +72,9 @@ pumpkins.isnull().sum() ``` - Има липсващи данни, но може би това няма да е от значение за задачата. + Има липсващи данни, но може би това няма да е важно за настоящата задача. -1. За да направите вашия dataframe по-лесен за работа, изберете само колоните, които ви трябват, използвайки функцията `loc`, която извлича от оригиналния dataframe група от редове (предадени като първи параметър) и колони (предадени като втори параметър). Изразът `:` в случая означава "всички редове". +1. За да улесните работата с dataframe, изберете само нужните колони, като използвате функцията `loc`, която извлича от оригиналния dataframe група от редове (първи параметър) и колони (втори параметър). Изразът `:` в случая означава „всички редове“. ```python columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] @@ -83,9 +83,9 @@ ### Второ, определете средната цена на тиква -Помислете как да определите средната цена на тиква през даден месец. Кои колони бихте избрали за тази задача? Подсказка: ще ви трябват 3 колони. +Помислете как да определите средната цена на тиква за даден месец. Кои колони бихте избрали за тази задача? Подсказка: ще ви трябват 3 колони. -Решение: вземете средната стойност на колоните `Low Price` и `High Price`, за да попълните новата колона Price, и конвертирайте колоната Date, за да показва само месеца. За щастие, според проверката по-горе, няма липсващи данни за дати или цени. +Решение: вземете средната стойност на колоните `Low Price` и `High Price`, за да попълните новата колона Price, и преобразувайте колоната Date, така че да показва само месеца. За щастие, според проверката по-горе, няма липсващи данни за дати или цени. 1. За да изчислите средната стойност, добавете следния код: @@ -98,35 +98,35 @@ ✅ Чувствайте се свободни да отпечатате всякакви данни, които искате да проверите, използвайки `print(month)`. -2. Сега копирайте конвертираните данни в нов Pandas dataframe: +2. Сега копирайте преобразуваните си данни в нов Pandas dataframe: ```python new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) ``` - Отпечатването на вашия dataframe ще ви покаже чист, подреден набор от данни, върху който можете да изградите новия си регресионен модел. + Отпечатването на dataframe ще ви покаже чист и организиран набор от данни, върху който можете да изградите новия си регресионен модел. -### Но чакайте! Има нещо странно тук +### Но чакайте! Нещо странно -Ако погледнете колоната `Package`, тиквите се продават в много различни конфигурации. Някои се продават в мерки '1 1/9 bushel', други в '1/2 bushel', някои на тиква, някои на паунд, а някои в големи кутии с различни ширини. +Ако погледнете колоната `Package`, тиквите се продават в много различни конфигурации. Някои се продават в мерки „1 1/9 бушел“, други в „1/2 бушел“, някои на брой, някои на паунд, и някои в големи кутии с различна ширина. -> Тиквите изглежда са много трудни за консистентно претегляне +> Тиквите изглеждат много трудни за претегляне по постоянен начин -Разглеждайки оригиналните данни, е интересно, че всичко с `Unit of Sale`, равно на 'EACH' или 'PER BIN', също има тип `Package` на инч, на бин или 'each'. Тиквите изглежда са много трудни за консистентно претегляне, така че нека ги филтрираме, като изберем само тикви със стринга 'bushel' в колоната `Package`. +При по-задълбочен поглед върху оригиналните данни, е интересно, че всичко със `Unit of Sale`, равно на 'EACH' или 'PER BIN', има също `Package` тип на инч, на кош, или 'всяка'. Изглежда тиквите са много трудни за претегляне по постоянен начин, затова ще ги филтрираме като изберем само тиквите с низа 'bushel' в колоната `Package`. -1. Добавете филтър в началото на файла, под първоначалния импорт на .csv: +1. Добавете филтър в началото на файла, под първоначалния .csv импорт: ```python pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] ``` - Ако отпечатате данните сега, можете да видите, че получавате само около 415 реда данни, съдържащи тикви по bushel. + Ако отпечатате данните сега, ще видите, че получавате само около 415 реда от данни, съдържащи тикви на бушел. -### Но чакайте! Има още нещо за правене +### Но чакайте! Остава още нещо за правене -Забелязахте ли, че количеството bushel варира за всеки ред? Трябва да нормализирате цените, така че да показват цените на bushel, затова направете малко математика, за да ги стандартизирате. +Забелязахте ли, че количеството бушели варира при всеки ред? Трябва да нормализирате цените, така че да показват ценообразуването за бушел, затова направете някои математически операции, за да го стандартизирате. -1. Добавете тези редове след блока, който създава new_pumpkins dataframe: +1. Добавете тези редове след блока, създаващ новия dataframe new_pumpkins: ```python new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) @@ -134,29 +134,29 @@ 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 домати, например, трябва да тежи 56 паунда... Листата и зелените заемат повече пространство с по-малко тегло, така че bushel спанак е само 20 паунда." Всичко това е доста сложно! Нека не се занимаваме с конвертиране на bushel в паундове и вместо това да определим цените на bushel. Цялото това изучаване на bushel тикви, обаче, показва колко важно е да разберете естеството на вашите данни! +✅ Според [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), теглото на бушел зависи от вида на продукцията, тъй като той е обемна мярка. „Например, бушел домати трябва да тежи 56 паунда... Листата и зеленчуците заемат повече място с по-малко тегло, така че бушел спанак тежи само 20 паунда.“ Всичко това е доста сложно! Нека не се занимаваме с преобразуването от бушел към паунд, а вместо това да ценим на бушел. Въпреки това целият този анализ на бушели тикви показва колко е важно да разберем естеството на нашите данни! -Сега можете да анализирате цените на единица, базирани на тяхната bushel мярка. Ако отпечатате данните още веднъж, можете да видите как са стандартизирани. +Сега можете да анализирате ценообразуването на единица, базирано на мерките им в бушели. Ако отпечатате данните още веднъж, ще видите как са стандартизирани. -✅ Забелязахте ли, че тиквите, продавани на половин bushel, са много скъпи? Можете ли да разберете защо? Подсказка: малките тикви са много по-скъпи от големите, вероятно защото има много повече от тях на bushel, като се вземе предвид неизползваното пространство, заето от една голяма куха тиква за пай. +✅ Забелязахте ли, че тиквите, продавани на половин бушел, са много скъпи? Можете ли да разберете защо? Подсказка: малките тикви са много по-скъпи от големите, вероятно защото има много повече от тях на бушел, като се има предвид неизползваното пространство, което заема една голяма куха тиква за пай. ## Стратегии за визуализация -Част от ролята на специалиста по данни е да демонстрира качеството и естеството на данните, с които работи. За да направят това, те често създават интересни визуализации, като графики, диаграми и таблици, показващи различни аспекти на данните. По този начин те могат визуално да покажат връзки и пропуски, които иначе са трудни за откриване. +Част от ролята на специалиста по данни е да демонстрира качеството и естеството на данните, с които работи. За това те често създават интересни визуализации, графики, диаграми и таблици, които показват различни аспекти на данните. По този начин те могат визуално да покажат зависимости и пропуски, които иначе е трудно да се открият. [![ML за начинаещи - Как да визуализираме данни с Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML за начинаещи - Как да визуализираме данни с Matplotlib") -> 🎥 Кликнете върху изображението по-горе за кратко видео, което показва как да визуализирате данните за тази лекция. +> 🎥 Кликнете върху изображението по-горе за кратко видео, в което се разглежда визуализирането на данните за този урок. -Визуализациите могат също да помогнат за определяне на най-подходящата техника за машинно обучение за данните. Например, scatterplot, който изглежда следва линия, показва, че данните са добър кандидат за упражнение с линейна регресия. +Визуализациите могат също така да помогнат за определяне на машинната обучителна техника, най-подходяща за данните. Например точкова диаграма (scatterplot), която изглежда следва линия, показва, че данните са добър кандидат за упражнение с линейна регресия. -Една библиотека за визуализация на данни, която работи добре в Jupyter notebooks, е [Matplotlib](https://matplotlib.org/) (която видяхте и в предишната лекция). +Една библиотека за визуализация, която работи добре в Jupyter notebooks, е [Matplotlib](https://matplotlib.org/) (която видяхте и в предишния урок). -> Получете повече опит с визуализацията на данни в [тези уроци](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). +> Придобийте повече опит с визуализацията на данни в [тези уроци](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). ## Упражнение - експериментирайте с Matplotlib -Опитайте да създадете някои основни графики, за да покажете новия dataframe, който току-що създадохте. Какво би показала една основна линейна графика? +Опитайте се да създадете някои базови графики, за да покажете новия dataframe, който току-що създадохте. Какво би показала базова линейна графика? 1. Импортирайте Matplotlib в началото на файла, под импорта на Pandas: @@ -164,8 +164,8 @@ import matplotlib.pyplot as plt ``` -1. Презаредете целия notebook, за да го обновите. -1. В края на notebook-а добавете клетка, за да начертаете данните като кутия: +1. Стартирайте цялото notebook отново, за да го обновите. +1. В долната част на notebook добавете клетка, която да нарисува данните като кутиева диаграма: ```python price = new_pumpkins.Price @@ -174,44 +174,121 @@ plt.show() ``` - ![Scatterplot, показващ връзката между цена и месец](../../../../2-Regression/2-Data/images/scatterplot.png) + ![Точкова диаграма, показваща връзката цена към месец](../../../../translated_images/bg/scatterplot.b6868f44cbd2051c.webp) - Полезна ли е тази графика? Има ли нещо, което ви изненадва? + Полезна ли е тази графика? Нещо ли ви изненадва в нея? - Тя не е особено полезна, тъй като просто показва разпределението на точките в даден месец. + Тя не е особено полезна, тъй като просто показва разпределението на данните Ви като точки в даден месец. ### Направете я полезна -За да направите графиките полезни, обикновено трябва да групирате данните по някакъв начин. Нека опитаме да създадем графика, където y оста показва месеците, а данните демонстрират разпределението. +За да получите графики, които показват полезни данни, обикновено трябва да групирате данните по някакъв начин. Нека опитаме да създадем графика, където y-оста показва месеците, а данните илюстрират разпределението на данните. -1. Добавете клетка, за да създадете групирана бар графика: +1. Добавете клетка, която да създаде групирана стълбова диаграма: ```python new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') plt.ylabel("Pumpkin Price") ``` - ![Бар графика, показваща връзката между цена и месец](../../../../2-Regression/2-Data/images/barchart.png) + ![Стълбова диаграма, показваща връзката цена към месец](../../../../translated_images/bg/barchart.a833ea9194346d76.webp) + + Това е по-полезна визуализация на данни! Изглежда показва, че най-високата цена на тиквите е през септември и октомври. Това отговаря ли на вашите очаквания? Защо или защо не? + +## Упражнение - експериментирайте със Seaborn + +Matplotlib е мощен, но може да изисква много код, за да се получи полиранa графика. [Seaborn](https://seaborn.pydata.org/) е библиотека, изградена _върху_ Matplotlib, предназначена за статистическа визуализация на данни. Тя работи директно с Pandas dataframe, прилага атрактивни стилове по подразбиране и ви позволява да създавате информативни графики с много по-малко код. Тъй като Seaborn връща Matplotlib обекти, можете все още да използвате всичко, което вече знаете за Matplotlib, за да донастроите резултата. + +> Ако все още нямате инсталиран Seaborn, инсталирайте го с `pip install seaborn`. + +1. Импортирайте Seaborn в началото на notebook, под другите импорти. По конвенция се импортира като `sns`: + + ```python + import seaborn as sns + ``` + +### Точкови графики за показване на зависимости + +Голяма част от изследването на данните преди създаване на модел е търсенето на _зависимости_ между променливите. [Точкова графика](https://en.wikipedia.org/wiki/Scatter_plot) е един от най-добрите инструменти за това: ако точките изглежда следват линия, двете променливи може да са корелирани, което е добър знак, че линейният регресионен модел може да работи. + +1. Пресъздайте точковата графика цена-срещу-месец от преди, но този път използвайте Seaborn [`relplot()`](https://seaborn.pydata.org/generated/seaborn.relplot.html) (релационна графика), която работи директно с колоните на вашия dataframe: + + ```python + sns.relplot(x="Price", y="Month", data=new_pumpkins) + ``` + + ![Точкова графика със Seaborn, показваща връзката цена към месец](../../../../translated_images/bg/relplot.a03837d8f0329cec.webp) + + Забележете как подавате _имената на колоните_ и dataframe, а Seaborn се грижи за надписите на осите. + +2. Можете да превключите на линейна графика, като подадете `kind="line"`. Seaborn дори чертае засенчена лента, показваща доверителния интервал около линията: + + ```python + sns.relplot(x="Price", y="Month", kind="line", data=new_pumpkins) + ``` + + ![Линейна графика със Seaborn, показваща връзката цена към месец](../../../../translated_images/bg/lineplot.f9034ba47b1e30ee.webp) + + Тези конкретни данни са доста шумни, така че линейната графика не е най-ясният избор тук — но показва колко лесно можете да променяте типове графики в Seaborn. + +### Стълбови диаграми за показване на разпределения + + +По-рано вие групирахте данните ръчно, за да създадете лентов диаграма с Matplotlib. [`catplot()`](https://seaborn.pydata.org/generated/seaborn.catplot.html) на Seaborn (категориален график) може да направи групирането и агрегирането вместо вас. По подразбиране `kind="bar"` показва средното на всяка категория заедно с черна линия, която обозначава интервала на доверие. + +1. Създайте лентов диаграма на средната цена за месец: + + ```python + sns.catplot(x="Month", y="Price", data=new_pumpkins, kind="bar") + ``` + + ![Лентов диаграма на Seaborn, показваща разпределението на цените за месец](../../../../translated_images/bg/catplot.e73fc35fdf96242b.webp) + + Това потвърждава това, което видяхте с Matplotlib — цените достигат пика си около септември и октомври — но Seaborn също визуализира колко _варира_ цената в рамките на всеки месец. + +### Топлинни карти за показване на корелации + +Диаграмите с разпръскване сравняват две променливи наведнъж. Когато имате няколко числови колони, [топлинна карта](https://en.wikipedia.org/wiki/Heat_map) ви позволява да видите силата на връзката между _всяка_ двойка колони едновременно. Това е често използван начин за откриване кои характеристики са най-корелирани, преди да изберете какво да подавате в модел (и същият вид диаграма по-късно се използва за показване на матрици на объркване при класификация). + +1. Изградете корелационна матрица с Pandas, после я начертайте с [`heatmap()`](https://seaborn.pydata.org/generated/seaborn.heatmap.html) на Seaborn. Опцията `annot=True` отпечатва корелационните стойности във всяка клетка: + + ```python + correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr() + sns.heatmap(correlations, annot=True, cmap="coolwarm") + ``` + + ![Топлинна карта на Seaborn, показваща корелациите между числовите колони](../../../../translated_images/bg/heatmap.bd98dce43b404c57.webp) + + Стойности близки до `1` (или `-1`) означават, че колоните са силно _линейно_ корелирани. Обърнете внимание как `Low Price` и `High Price` са почти перфектно корелирани. От друга страна, `Month` показва само слаба линейна корелация с цената — въпреки че лентовата диаграма по-горе разкрива ясно сезонен пик през септември и октомври. Това е важен урок: коефициентът на корелация измерва само _праволинейни_ връзки, така че може да пропусне сезонни или други нелинейни модели. ✅ Защо е полезно да разглеждате както топлинна карта, *така и* диаграми като лентовата преди да решите кои колони да използвате? + +### Matplotlib или Seaborn? + +Двете библиотеки си струва да ги знаете: + +- **Matplotlib** ви дава детайлен контрол върху всеки елемент на диаграмата и е основата, върху която почти всички други Python библиотеки за графики се изграждат. +- **Seaborn** предоставя функции от по-високо ниво и привлекателни настройки за статистически диаграми, работи директно с dataframe-и и често е по-бърз за експлораторен анализ на данни. - Това е по-полезна визуализация на данни! Изглежда, че най-високата цена за тикви е през септември и октомври. Това отговаря ли на вашите очаквания? Защо или защо не? +Често срещан сценарий е първо да използвате Seaborn за бързо разглеждане на данните, а после да преминете към Matplotlib, когато трябва да персонализирате детайлите. --- ## 🚀Предизвикателство -Разгледайте различните типове визуализации, които Matplotlib предлага. Кои типове са най-подходящи за регресионни задачи? +Изследвайте различните типове визуализации, които предлагат Matplotlib и Seaborn. Кои типове са най-подходящи за регресионни задачи? -## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/) +## [Кратък тест след лекцията](https://ff-quizzes.netlify.app/en/ml/) -## Преглед и самостоятелно обучение +## Преглед и Самостоятельно учене -Разгледайте многото начини за визуализация на данни. Направете списък с различните налични библиотеки и отбележете кои са най-добри за дадени типове задачи, например 2D визуализации срещу 3D визуализации. Какво откривате? +Вижте многобройните начини за визуализация на данни. Направете списък на наличните библиотеки и отбележете кои са най-подходящи за дадени задачи, например 2D визуализации срещу 3D визуализации. Какво откривате? -## Задание +## Задача [Изследване на визуализацията](assignment.md) --- -**Отказ от отговорност**: -Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод. \ No newline at end of file + +**Отказ от отговорност**: +Този документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод. + \ No newline at end of file diff --git a/translations/bg/2-Regression/2-Data/solution/notebook.ipynb b/translations/bg/2-Regression/2-Data/solution/notebook.ipynb index 354230711..ce5417b29 100644 --- a/translations/bg/2-Regression/2-Data/solution/notebook.ipynb +++ b/translations/bg/2-Regression/2-Data/solution/notebook.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Линейна регресия за тикви - Урок 2\n" + "## Линеен регресионен анализ за тикви - Урок 2\n" ] }, { @@ -222,6 +222,7 @@ "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", "pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n", "\n", "pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n", @@ -385,18 +386,78 @@ "plt.ylabel(\"Pumpkin Price\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualizing with Seaborn\n", + "\n", + "[Seaborn](https://seaborn.pydata.org/) is built on top of Matplotlib and works directly with dataframes, making it quick to create attractive statistical plots with very little code.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Диаграми с разсейване за показване на връзки\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sns.relplot(x=\"Price\", y=\"Month\", data=new_pumpkins)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sns.relplot(x=\"Price\", y=\"Month\", kind=\"line\", data=new_pumpkins)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Лентови диаграми за показване на разпределенията\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sns.catplot(x=\"Month\", y=\"Price\", data=new_pumpkins, kind=\"bar\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Топлинни карти за показване на корелации\n" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr()\n", + "sns.heatmap(correlations, annot=True, cmap=\"coolwarm\")" + ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Отказ от отговорност**: \nТози документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматичните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия изходен език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален превод от човек. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.\n" + "---\n\n\n**Отказ от отговорност**:\nТози документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод.\n\n" ] } ], @@ -426,13 +487,7 @@ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" } }, - "orig_nbformat": 2, - "coopTranslator": { - "original_hash": "95726f0b8283628d5356a4f8eb8b4b76", - "translation_date": "2025-09-04T07:11:15+00:00", - "source_file": "2-Regression/2-Data/solution/notebook.ipynb", - "language_code": "bg" - } + "orig_nbformat": 2 }, "nbformat": 4, "nbformat_minor": 2 diff --git a/translations/bg/8-Reinforcement/1-QLearning/README.md b/translations/bg/8-Reinforcement/1-QLearning/README.md index 19516623a..e64b316af 100644 --- a/translations/bg/8-Reinforcement/1-QLearning/README.md +++ b/translations/bg/8-Reinforcement/1-QLearning/README.md @@ -1,47 +1,47 @@ -# Въведение в Укрепващото Обучение и Q-Learning +# Въведение в подсилващото обучение и Q-обучението -![Обобщение на укрепващото обучение в машинното обучение в скица](../../../../sketchnotes/ml-reinforcement.png) -> Скица от [Tomomi Imura](https://www.twitter.com/girlie_mac) +![Резюме на подсилващото обучение в машинното обучение в скично](../../../../translated_images/bg/ml-reinforcement.94024374d63348db.webp) +> Скично от [Tomomi Imura](https://www.twitter.com/girlie_mac) -Укрепващото обучение включва три важни концепции: агент, състояния и набор от действия за всяко състояние. Изпълнявайки действие в определено състояние, агентът получава награда. Представете си компютърната игра Super Mario. Вие сте Марио, намирате се на ниво в играта, стоите до ръба на скала. Над вас има монета. Вие, като Марио, на определено място в нивото на играта... това е вашето състояние. Ако направите крачка надясно (действие), ще паднете от скалата и ще получите ниска числена оценка. Но ако натиснете бутона за скок, ще спечелите точка и ще останете жив. Това е положителен резултат и трябва да ви донесе положителна числена оценка. +Подсилващото обучение включва три важни понятия: агент, няколко състояния и набор от действия за всяко състояние. Като изпълнява действие в определено състояние, агентът получава награда. Представете си отново компютърната игра Super Mario. Вие сте Марио, в ниво на игра, стоите до ръба на скала. Над вас има монета. Вие, като Марио, в ниво на игра, на конкретна позиция ... това е вашето състояние. Да направите една крачка вдясно (действие) ще ви изхвърли през ръба, и това ще ви даде нисък числов резултат. Обаче, като натиснете бутона за скок, ще спечелите точка и ще останете жив. Това е положителен резултат и трябва да ви награди с положителна числова оценка. -Използвайки укрепващо обучение и симулатор (играта), можете да научите как да играете играта, за да максимизирате наградата, която е да останете живи и да съберете възможно най-много точки. +Използвайки подсилващо обучение и симулатор (играта), можете да научите как да играете играта, за да максимизирате наградата, която е да останете живи и да съберете колкото се може повече точки. -[![Въведение в Укрепващото Обучение](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) +[![Въведение в подсилващото обучение](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) -> 🎥 Кликнете върху изображението по-горе, за да чуете Дмитрий да обсъжда Укрепващото Обучение +> 🎥 Кликнете върху изображението по-горе, за да чуете Дмитрий да обсъжда Подсилващото обучение -## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/) +## [Предварителен тест](https://ff-quizzes.netlify.app/en/ml/) -## Предпоставки и Настройка +## Предварителни условия и настройка -В този урок ще експериментираме с код на Python. Трябва да можете да изпълните кода от Jupyter Notebook, или на вашия компютър, или в облака. +В този урок ще експериментираме с някакъв код на Python. Трябва да можете да стартирате кода в Jupyter Notebook от този урок, или на вашия компютър, или някъде в облака. -Можете да отворите [ноутбука на урока](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) и да преминете през урока, за да го изградите. +Можете да отворите [учебния ноутбук](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) и да преминете през този урок, за да изградите. -> **Забележка:** Ако отваряте този код от облака, трябва също да изтеглите файла [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), който се използва в кода на ноутбука. Добавете го в същата директория като ноутбука. +> **Забележка:** Ако отваряте този код от облака, трябва да изтеглите и файла [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), който се използва в кода на ноутбука. Добавете го в същата директория с ноутбука. ## Въведение -В този урок ще изследваме света на **[Петър и Вълкът](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, вдъхновен от музикална приказка на руския композитор [Сергей Прокофиев](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Ще използваме **Укрепващо Обучение**, за да позволим на Петър да изследва своята среда, да събира вкусни ябълки и да избягва срещи с вълка. +В този урок ще разгледаме света на **[Питър и вълкът](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, вдъхновен от музикална приказка на руския композитор [Сергеј Прокофиев](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Ще използваме **подсилващо обучение**, за да позволим на Питър да изследва своята среда, да събира вкусни ябълки и да избягва срещата с вълка. -**Укрепващото Обучение** (RL) е техника за обучение, която ни позволява да научим оптималното поведение на **агент** в някаква **среда**, като провеждаме множество експерименти. Агентът в тази среда трябва да има някаква **цел**, дефинирана чрез **функция за награда**. +**Подсилващото обучение** (RL) е техника на обучение, която ни позволява да научим оптимално поведение на **агента** в някаква **среда** чрез провеждане на множество експерименти. Агентът в тази среда трябва да има някаква **цел**, дефинирана чрез **функция на наградата**. ## Средата -За простота, нека разгледаме света на Петър като квадратна дъска с размери `ширина` x `височина`, като тази: +За простота, нека светът на Питър да бъде квадратна дъска с размер `ширина` x `височина`, ето така: -![Средата на Петър](../../../../8-Reinforcement/1-QLearning/images/environment.png) +![Средата на Питър](../../../../translated_images/bg/environment.40ba3cb66256c93f.webp) Всяка клетка на тази дъска може да бъде: -* **земя**, върху която Петър и други същества могат да ходят. -* **вода**, върху която очевидно не можете да ходите. -* **дърво** или **трева**, място, където можете да си починете. -* **ябълка**, която представлява нещо, което Петър би се радвал да намери, за да се нахрани. +* **земя**, по която Питър и други създания могат да ходят. +* **вода**, по която очевидно не може да се ходи. +* **дърво** или **тръстика**, място, където може да се почине. +* **ябълка**, която представлява нещо, което Питър би се радвал да намери, за да се нахрани. * **вълк**, който е опасен и трябва да се избягва. -Има отделен Python модул, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), който съдържа кода за работа с тази среда. Тъй като този код не е важен за разбирането на нашите концепции, ще импортираме модула и ще го използваме, за да създадем примерна дъска (код блок 1): +Има отделен Python модул, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), който съдържа кода за работа с тази среда. Тъй като този код не е важен за разбирането на нашите концепции, ще импортираме модула и ще го използваме, за да създадем примерна дъска (кодов блок 1): ```python from rlboard import * @@ -52,63 +52,63 @@ m.randomize(seed=13) m.plot() ``` -Този код трябва да отпечата изображение на средата, подобно на горното. +Този код трябва да изведе изображение на средата, подобно на показаното по-горе. ## Действия и политика -В нашия пример целта на Петър е да намери ябълка, като избягва вълка и други препятствия. За да направи това, той може просто да се разхожда, докато намери ябълка. +В нашия пример целта на Питър е да намери ябълка, като същевременно избягва вълка и други препятствия. За да направи това, той просто може да се разхожда, докато не намери ябълка. -Следователно, на всяка позиция той може да избира между следните действия: нагоре, надолу, наляво и надясно. +Затова, на всяка позиция той може да избере едно от следните действия: нагоре, надолу, наляво и надясно. -Ще дефинираме тези действия като речник и ще ги свържем с двойки от съответните промени в координатите. Например, движението надясно (`R`) би съответствало на двойка `(1,0)`. (код блок 2): +Ще дефинираме тези действия като речник и ще ги асоциираме с двойки от съответните промени в координатите. Например, движението надясно (`R`) ще съответства на двойка `(1,0)`. (кодов блок 2): ```python actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) } action_idx = { a : i for i,a in enumerate(actions.keys()) } ``` -За да обобщим, стратегията и целта на този сценарий са следните: +В резюме, стратегията и целта на този сценарий са както следва: -- **Стратегията** на нашия агент (Петър) се дефинира чрез така наречената **политика**. Политиката е функция, която връща действието за всяко дадено състояние. В нашия случай състоянието на проблема се представя чрез дъската, включително текущата позиция на играча. +- **Стратегията**, на нашия агент (Питър) се дефинира чрез т.нар. **политика**. Политиката е функция, която връща действието във всяко дадено състояние. В нашия случай, състоянието на проблема се представя чрез дъската, включително и текущата позиция на играча. -- **Целта** на укрепващото обучение е в крайна сметка да научим добра политика, която ще ни позволи да решим проблема ефективно. Въпреки това, като базова линия, нека разгледаме най-простата политика, наречена **случайна разходка**. +- **Целта** на подсилващото обучение е в крайна сметка да научи добра политика, която да ни позволи да решим проблема ефективно. Но като изходна точка, нека разгледаме най-простата политика, наречена **случайна разходка**. ## Случайна разходка -Нека първо решим проблема, като приложим стратегията за случайна разходка. При случайна разходка ще избираме следващото действие случайно от позволените действия, докато стигнем до ябълката (код блок 3). +Нека първо решим нашия проблем като реализираме стратегия за случайна разходка. При случайна разходка ние на произволен принцип избираме следващото действие измежду позволените, докато не достигнем ябълката (кодов блок 3). -1. Реализирайте случайната разходка с кода по-долу: +1. Реализирайте случайната разходка с долния код: ```python def random_policy(m): return random.choice(list(actions)) def walk(m,policy,start_position=None): - n = 0 # number of steps - # set initial position + n = 0 # брой стъпки + # задаване на начална позиция if start_position: m.human = start_position else: m.random_start() while True: if m.at() == Board.Cell.apple: - return n # success! + return n # успех! if m.at() in [Board.Cell.wolf, Board.Cell.water]: - return -1 # eaten by wolf or drowned + return -1 # изяден от вълк или удавен while True: a = actions[policy(m)] new_pos = m.move_pos(m.human,a) if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water: - m.move(a) # do the actual move + m.move(a) # извършване на действителното движение break n+=1 walk(m,random_policy) ``` - Извикването на `walk` трябва да върне дължината на съответния път, която може да варира от едно изпълнение до друго. + Извикването на `walk` трябва да върне дължината на съответния път, който може да варира от едно изпълнение до друго. -1. Изпълнете експеримента за разходка няколко пъти (например 100) и отпечатайте получените статистики (код блок 4): +1. Стартирайте експеримента с разходката няколко пъти (например 100) и изведете получената статистика (кодов блок 4): ```python def print_statistics(policy): @@ -125,17 +125,17 @@ action_idx = { a : i for i,a in enumerate(actions.keys()) } print_statistics(random_policy) ``` - Забележете, че средната дължина на пътя е около 30-40 стъпки, което е доста, като се има предвид, че средното разстояние до най-близката ябълка е около 5-6 стъпки. + Обърнете внимание, че средната дължина на пътя е около 30-40 стъпки, което е доста много, имайки предвид факта, че средното разстояние до най-близката ябълка е около 5-6 стъпки. - Можете също така да видите как изглежда движението на Петър по време на случайната разходка: + Можете също така да видите как изглежда движението на Питър по време на случайната разходка: - ![Случайна разходка на Петър](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) + ![Случайна разходка на Питър](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) ## Функция за награда За да направим нашата политика по-интелигентна, трябва да разберем кои ходове са "по-добри" от други. За да направим това, трябва да дефинираме нашата цел. -Целта може да бъде дефинирана чрез **функция за награда**, която ще връща някаква стойност за всяко състояние. Колкото по-висока е стойността, толкова по-добра е наградата. (код блок 5) +Целта може да бъде дефинирана чрез **функция на наградата**, която ще връща някаква стойност за всяко състояние. Колкото по-високо е числото, толкова по-добра е функцията на наградата. (кодов блок 5) ```python move_reward = -0.1 @@ -154,39 +154,115 @@ def reward(m,pos=None): return move_reward ``` -Интересното при функциите за награда е, че в повечето случаи *получаваме значителна награда само в края на играта*. Това означава, че нашият алгоритъм трябва по някакъв начин да запомни "добрите" стъпки, които водят до положителна награда в края, и да увеличи тяхната важност. По същия начин всички ходове, които водят до лоши резултати, трябва да бъдат обезкуражени. +Интересно при функциите на наградата е, че в повечето случаи *получаваме съществена награда само в края на играта*. Това означава, че нашият алгоритъм трябва по някакъв начин да запомни "добрите" стъпки, които водят до положителна награда в края, и да увеличи тяхната важност. Съответно, всички ходове, които водят до лоши резултати, трябва да бъдат възпрепятствани. -## Q-Learning +## Q-обучение -Алгоритъмът, който ще обсъдим тук, се нарича **Q-Learning**. В този алгоритъм политиката се дефинира чрез функция (или структура от данни), наречена **Q-таблица**. Тя записва "доброто" на всяко действие в дадено състояние. +Алгоритъмът, който ще обсъдим тук, се нарича **Q-обучение**. При този алгоритъм политиката се дефинира чрез функция (или структура от данни), наречена **Q-таблица**. Тя записва "доброто" на всяко от действията в дадено състояние. -Тя се нарича Q-таблица, защото често е удобно да се представи като таблица или многомерен масив. Тъй като нашата дъска има размери `ширина` x `височина`, можем да представим Q-таблицата, използвайки numpy масив с форма `ширина` x `височина` x `len(actions)`: (код блок 6) +Тя се нарича Q-таблица, защото често е удобно да бъде представена като таблица или многомерен масив. Тъй като нашата дъска има размери `ширина` x `височина`, можем да представим Q-таблицата като numpy масив с форма `ширина` x `височина` x `len(actions)`: (кодов блок 6) ```python Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) ``` -Забележете, че инициализираме всички стойности на Q-таблицата с еднаква стойност, в нашия случай - 0.25. Това съответства на политиката за "случайна разходка", защото всички ходове във всяко състояние са еднакво добри. Можем да предадем Q-таблицата на функцията `plot`, за да визуализираме таблицата на дъската: `m.plot(Q)`. +Забележете, че инициализираме всички стойности на Q-таблицата с еднаква стойност, в нашия случай - 0.25. Това съответства на политиката "случайна разходка", защото всички ходове във всяко състояние са еднакво добри. Можем да подадем Q-таблицата на функцията `plot`, за да визуализираме таблицата върху дъската: `m.plot(Q)`. -![Средата на Петър](../../../../8-Reinforcement/1-QLearning/images/env_init.png) +![Средата на Питър](../../../../translated_images/bg/env_init.04e8f26d2d60089e.webp) -В центъра на всяка клетка има "стрелка", която показва предпочитаната посока на движение. Тъй като всички посоки са равни, се показва точка. +В центъра на всяка клетка има "стрелка", която указва предпочитаната посока на движение. Тъй като всички посоки са равни, се показва точка. -Сега трябва да изпълним симулацията, да изследваме нашата среда и да научим по-добро разпределение на стойностите в Q-таблицата, което ще ни позволи да намерим пътя до ябълката много по-бързо. +Сега трябва да стартираме симулацията, да изследваме нашата среда и да научим по-добро разпределение на стойностите в Q-таблицата, което ще ни позволи да намерим пътя до ябълката много по-бързо. -## Същност на Q-Learning: Уравнението на Белман +## Същност на Q-обучението: уравнението на Белман -След като започнем да се движим, всяко действие ще има съответна награда, т.е. теоретично можем да изберем следващото действие въз основа на най-високата непосредствена награда. Въпреки това, в повечето състояния ходът няма да постигне нашата цел да стигнем до ябълката, и следователно не можем веднага да решим коя посока е по-добра. +След като започнем да се движим, всяко действие ще има съответна награда, т.е. теоретично можем да изберем следващото действие въз основа на най-високата непосредствена награда. Въпреки това в повечето състояния ходът няма да ни доведе до целта – достигането до ябълката, и затова не можем веднага да решим коя посока е по-добра. -> Запомнете, че не непосредственият резултат е важен, а крайният резултат, който ще получим в края на симулацията. +> Запомнете, че не непосредственият резултат е важен, а по-скоро крайният резултат, който ще получим в края на симулацията. -За да отчетем тази забавена награда, трябва да използваме принципите на **[динамичното програмиране](https://en.wikipedia.org/wiki/Dynamic_programming)**, които ни позволяват да мислим за проблема си рекурсивно. +За да отчетем това отложено възнаграждение, трябва да използваме принципите на **[динамичното програмиране](https://en.wikipedia.org/wiki/Dynamic_programming)**, които ни позволяват да разсъждаваме за проблема рекурсивно. -Да предположим, че сега сме в състояние *s*, и искаме да преминем към следващото състояние *s'*. Като направим това, ще получим непосредствената награда *r(s,a)*, дефинирана чрез функцията за награда, плюс някаква бъдеща награда. Ако предположим, че нашата Q-таблица правилно отразява "привлекателността" на всяко действие, тогава в състояние *s'* ще изберем действие *a*, което съответства на максималната стойност на *Q(s',a')*. Така най-добрата възможна бъдеща награда, която можем да получим в състояние *s*, ще бъде дефинирана като `max` +Нека сме в състояние *s* и искаме да преминем в следващото състояние *s'*. Като направим това, ще получим непосредствена награда *r(s,a)*, дефинирана от функцията на наградата, плюс някаква бъдеща награда. Ако предположим, че нашата Q-таблица правилно отразява "атрактивността" на всяко действие, тогава в състояние *s'* ще изберем действие *a*, което съответства на максималната стойност на *Q(s',a')*. Следователно най-добрата бъдеща награда, която можем да получим в състояние *s*, ще бъде дефинирана като `max`a'*Q(s',a')* (максимумът тук се изчислява за всички възможни действия *a'* в състояние *s'*). + +Това дава **формулата на Белман** за изчисляване на стойността на Q-таблицата в състояние *s*, при дадено действие *a*: + + + +Тук γ е т.нар. **фактор на намаление**, който определя до каква степен трябва да предпочитате текущата награда пред бъдещата и обратно. + +## Алгоритъм на обучение + +Според горното уравнение можем сега да напишем псевдокод за нашия алгоритъм на обучение: + +* Инициализирайте Q-таблицата Q с равни стойности за всички състояния и действия +* Задайте скорост на учене α ← 1 +* Повтаряйте симулацията многократно + 1. Започнете от произволна позиция + 1. Повтаряйте + 1. Изберете действие *a* в състояние *s* + 2. Изпълнете действието като се преместите в ново състояние *s'* + 3. Ако настъпи условие за край на играта или общата награда е твърде малка - излезте от симулацията + 4. Изчислете наградата *r* в новото състояние + 5. Обновете Q-функцията според уравнението на Белман: *Q(s,a)* ← *(1-α)Q(s,a)+α(r+γ maxa'Q(s',a'))* + 6. *s* ← *s'* + 7. Обновете общата награда и намалете α. + +## Използване срещу изследване + +В горния алгоритъм не посочихме как точно да избираме действие на стъпка 2.1. Ако избираме действието случайно, ние случайно **изследваме** средата, и е много вероятно често да "умираме", както и да изследваме области, където нормално не бихме отишли. Алтернативен подход е да **използваме** стойностите от Q-таблицата, които вече знаем, и по този начин да изберем най-доброто действие (с по-висока стойност в Q-таблицата) в състояние *s*. Това обаче ще ни спре да изследваме други състояния и е вероятно да не намерим оптималното решение. + +Следователно, най-добрият подход е да се намери баланс между изследване и използване. Това може да стане, като изберем действие в състояние *s* с вероятности, пропорционални на стойностите в Q-таблицата. В началото, когато стойностите в Q-таблицата са всички еднакви, това ще съответства на случайно избиране, но докато учим повече за нашата среда, ще сме по-склонни да следваме оптималния маршрут, като позволяваме на агента от време на време да поеме неизследван път. + +## Реализация на Python + +Сега сме готови да реализираме алгоритъма на обучение. Преди това трябва също така да имаме функция, която да превръща произволни числа в Q-таблицата в вектор от вероятности за съответните действия. + +1. Създайте функция `probs()`: + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + ``` + + Добавяме няколко `eps` към оригиналния вектор, за да избегнем деление на 0 в началния случай, когато всички компоненти на вектора са еднакви. + +Стартирайте алгоритъма на обучение през 5000 експеримента, наречени още **епохи**: (кодов блок 8) +```python + for epoch in range(5000): + + # Изберете начална точка + m.random_start() + + # Започнете пътуването + n=0 + cum_reward = 0 + while True: + x,y = m.human + v = probs(Q[x,y]) + a = random.choices(list(actions),weights=v)[0] + dpos = actions[a] + m.move(dpos,check_correctness=False) # позволяваме на играча да се движи извън дъската, което прекратява епизода + r = reward(m) + cum_reward += r + if r==end_reward or cum_reward < -1000: + lpath.append(n) + break + alpha = np.exp(-n / 10e5) + gamma = 0.5 + ai = action_idx[a] + Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max()) + n+=1 +``` + +След изпълнението на този алгоритъм Q-таблицата трябва да е обновена със стойности, които определят атрактивността на различните действия на всяка стъпка. Можем да опитаме да визуализираме Q-таблицата, като изрисуваме вектор във всяка клетка, който сочи в желаната посока на движение. За простота чертаем малък кръг вместо острие на стрелка. + + ## Проверка на политиката -Тъй като Q-таблицата показва "привлекателността" на всяко действие във всяко състояние, е доста лесно да я използваме за определяне на ефективната навигация в нашия свят. В най-простия случай можем да изберем действието, съответстващо на най-високата стойност в Q-таблицата: (код блок 9) +Тъй като Q-таблицата изброява "атрактивността" на всяко действие във всяко състояние, лесно можем да я използваме, за да определим ефективна навигация в нашия свят. В най-простия случай можем да изберем действието, съответстващо на най-високата стойност в Q-таблицата: (кодов блок 9) ```python def qpolicy_strict(m): @@ -198,17 +274,18 @@ def qpolicy_strict(m): walk(m,qpolicy_strict) ``` -> Ако опитате кода по-горе няколко пъти, може да забележите, че понякога той "забива" и трябва да натиснете бутона STOP в бележника, за да го прекъснете. Това се случва, защото може да има ситуации, когато две състояния "посочват" едно към друго в контекста на оптималната Q-стойност, което води до това, че агентът се движи между тези състояния безкрайно. + +> Ако опитате горния код няколко пъти, може да забележите, че понякога той „виси“ и трябва да натиснете бутона STOP в тетрадката, за да го прекъснете. Това се случва, защото може да има ситуации, в които две състояния „сочат“ едно към друго по отношение на оптималната Q-стойност, при което агентът започва да се движи между тези състояния безкрайно. ## 🚀Предизвикателство -> **Задача 1:** Модифицирайте функцията `walk`, за да ограничите максималната дължина на пътя до определен брой стъпки (например 100), и наблюдавайте как кодът по-горе връща тази стойност от време на време. +> **Задача 1:** Модифицирайте функцията `walk`, така че да ограничи максималната дължина на пътя до определен брой стъпки (например 100) и наблюдавайте как горният код от време на време връща тази стойност. -> **Задача 2:** Модифицирайте функцията `walk`, така че да не се връща на места, където вече е бил. Това ще предотврати циклирането на `walk`, но агентът все пак може да се окаже "заклещен" на място, от което не може да избяга. +> **Задача 2:** Модифицирайте функцията `walk`, така че тя да не се връща на места, на които вече е била преди. Това ще предотврати безкрайни цикли в `walk`, но все пак агентът може да се окаже „заложен“ на място, от което не може да избяга. ## Навигация -По-добра навигационна политика би била тази, която използвахме по време на обучението, комбинираща експлоатация и изследване. В тази политика ще избираме всяко действие с определена вероятност, пропорционална на стойностите в Q-таблицата. Тази стратегия може все още да доведе до връщане на агента на позиция, която вече е изследвал, но, както можете да видите от кода по-долу, тя води до много кратък среден път до желаното местоположение (не забравяйте, че `print_statistics` изпълнява симулацията 100 пъти): (код блок 10) +По-добра навигационна политика би била тази, която използвахме по време на обучението, която комбинира експлоатация и изследване. В тази политика ще избираме всяко действие с определена вероятност, пропорционална на стойностите в Q-таблицата. Тази стратегия все още може да доведе до връщане на агента на вече изследвано място, но, както виждате от кода по-долу, резултира в много кратък среден път до желания обект (помнете, че `print_statistics` изпълнява симулацията 100 пъти): (кодов блок 10) ```python def qpolicy(m): @@ -220,28 +297,32 @@ def qpolicy(m): print_statistics(qpolicy) ``` -След изпълнение на този код, трябва да получите много по-малка средна дължина на пътя от преди, в диапазона 3-6. +След изпълнението на този код, трябва да получите много по-малка средна дължина на пътя отколкото преди, в диапазона 3-6. + +## Изследване на процеса на учене -## Изследване на процеса на обучение +Както споменахме, процесът на учене е баланс между изследване и експлоатация на придобитите знания за структурата на проблема. Видяхме, че резултатите от обучението (способността да помогне на агента да намери кратък път до целта) са се подобрили, но е интересно да наблюдаваме как средната дължина на пътя се променя по време на процеса на учене: -Както споменахме, процесът на обучение е баланс между изследване и използване на придобитите знания за структурата на пространството на проблема. Видяхме, че резултатите от обучението (способността да помогнем на агент да намери кратък път до целта) са се подобрили, но също така е интересно да наблюдаваме как се държи средната дължина на пътя по време на процеса на обучение: + -## Обобщение на наученото: +Изводите могат да се обобщят по следния начин: -- **Средната дължина на пътя се увеличава**. Това, което виждаме тук, е, че в началото средната дължина на пътя се увеличава. Вероятно това се дължи на факта, че когато не знаем нищо за средата, сме склонни да се "заклещим" в лоши състояния, като вода или вълк. Докато научаваме повече и започваме да използваме тези знания, можем да изследваме средата за по-дълго, но все още не знаем добре къде са ябълките. +- **Средната дължина на пътя се увеличава**. Това, което виждаме тук, е, че първоначално средната дължина на пътя се увеличава. Това вероятно се дължи на факта, че когато не знаем нищо за околната среда, сме склонни да се озоваваме в лоши състояния като вода или вълк. С напредването на ученето и използването на знанията, можем да изследваме средата по-дълго, но все още не знаем много добре къде са ябълките. -- **Дължината на пътя намалява, докато научаваме повече**. След като научим достатъчно, става по-лесно за агента да постигне целта, и дължината на пътя започва да намалява. Въпреки това, все още сме отворени към изследване, така че често се отклоняваме от най-добрия път и изследваме нови опции, което прави пътя по-дълъг от оптималния. +- **Дължината на пътя намалява, докато учим повече**. След като научим достатъчно, на агента става по-лесно да достигне целта и дължината на пътя започва да намалява. Все пак сме отворени към изследване, затова често се отклоняваме от най-добрия път и изследваме нови опции, което прави пътя по-дълъг от оптималния. -- **Дължината се увеличава рязко**. Това, което също наблюдаваме на този график, е, че в даден момент дължината се увеличава рязко. Това показва стохастичния характер на процеса и че в даден момент можем да "развалим" коефициентите в Q-таблицата, като ги презапишем с нови стойности. Това идеално трябва да се минимизира чрез намаляване на скоростта на обучение (например, към края на обучението, коригираме стойностите в Q-таблицата само с малка стойност). +- **Дължината рязко се увеличава**. Освен това на тази графика се наблюдава, че в някакъв момент дължината се увеличава рязко. Това показва стохастичния характер на процеса и че можем в някакъв момент да „развалим“ коефициентите в Q-таблицата, като ги презапишем с нови стойности. Идеално това трябва да бъде минимизирано чрез намаляване на скоростта на учене (например, към края на обучението коригираме стойностите в Q-таблицата с малки стойности). -Като цяло е важно да запомним, че успехът и качеството на процеса на обучение значително зависят от параметри като скорост на обучение, намаляване на скоростта на обучение и коефициент на дисконтиране. Те често се наричат **хиперпараметри**, за да се разграничат от **параметри**, които оптимизираме по време на обучението (например, коефициентите в Q-таблицата). Процесът на намиране на най-добрите стойности за хиперпараметрите се нарича **оптимизация на хиперпараметри**, и заслужава отделна тема. +Като цяло, важно е да запомните, че успехът и качеството на процеса на учене зависи значително от параметри, като скорост на учене, намаляване на скоростта на учене и фактор на дисконт. Те често се наричат **хиперпараметри**, за да се разграничат от **параметри**, които оптимизираме по време на обучението (например коефициентите в Q-таблицата). Процесът на намиране на най-добрите стойности за хиперпараметрите се нарича **оптимизация на хиперпараметрите** и заслужава отделна тема. -## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/) +## [Квиз след лекцията](https://ff-quizzes.netlify.app/en/ml/) ## Задание [По-реалистичен свят](assignment.md) --- -**Отказ от отговорност**: -Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод. \ No newline at end of file + +**Отказ от отговорност**: +Този документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод. + \ No newline at end of file diff --git a/translations/bg/9-Real-World/2-Debugging-ML-Models/README.md b/translations/bg/9-Real-World/2-Debugging-ML-Models/README.md index dcb8a850d..2c2dce2fe 100644 --- a/translations/bg/9-Real-World/2-Debugging-ML-Models/README.md +++ b/translations/bg/9-Real-World/2-Debugging-ML-Models/README.md @@ -1,153 +1,179 @@ -# Постскриптум: Дебъгване на модели в машинното обучение с помощта на компоненти от таблото за отговорен AI - -## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/) +# Постскриптум: Отстраняване на грешки в модели за машинно обучение с помощта на компоненти от таблото за отговорен ИИ + +## [Предварителен квиз](https://ff-quizzes.netlify.app/en/ml/) + ## Въведение -Машинното обучение оказва влияние върху ежедневния ни живот. AI навлиза в някои от най-важните системи, които ни засягат като индивиди и като общество – от здравеопазване, финанси, образование до заетост. Например, системи и модели участват в ежедневни задачи за вземане на решения, като диагностика в здравеопазването или откриване на измами. В резултат на това напредъкът в AI, заедно с ускореното му приемане, се среща с променящи се обществени очаквания и нарастваща регулация. Постоянно виждаме области, в които AI системите не оправдават очакванията, излагат нови предизвикателства, а правителствата започват да регулират AI решенията. Затова е важно тези модели да бъдат анализирани, за да предоставят справедливи, надеждни, приобщаващи, прозрачни и отговорни резултати за всички. +Машинното обучение влияе на нашия ежедневен живот. Изкуственият интелект намира място в някои от най-важните системи, които засягат както отделните хора, така и обществото ни – от здравеопазване, финанси, образование до заетост. Например, системи и модели участват в ежедневни задачи за вземане на решения, като здравни диагнози или откриване на измами. В резултат на това напредъкът в ИИ, заедно с ускореното му внедряване, се среща с развиващи се обществени очаквания и растящо регулиране. Непрекъснато виждаме области, в които системите на ИИ продължават да не отговарят на очакванията; те разкриват нови предизвикателства; а правителствата започват да регулират ИИ решенията. Затова е важно тези модели да бъдат анализирани, за да предоставят справедливи, надеждни, включващи, прозрачни и отговорни резултати за всички. -В този курс ще разгледаме практически инструменти, които могат да се използват за оценка дали даден модел има проблеми, свързани с отговорния AI. Традиционните техники за дебъгване на машинното обучение обикновено се основават на количествени изчисления, като агрегирана точност или средна загуба на грешка. Представете си какво може да се случи, ако данните, които използвате за изграждане на тези модели, липсват определени демографски характеристики, като раса, пол, политически възгледи, религия, или непропорционално представят такива демографски характеристики. Ами ако изходът на модела се интерпретира така, че да благоприятства определена демографска група? Това може да доведе до свръх или недостатъчно представяне на тези чувствителни характеристики, което да доведе до проблеми със справедливостта, приобщаването или надеждността на модела. Друг фактор е, че моделите за машинно обучение се считат за "черни кутии", което затруднява разбирането и обяснението на това, което движи прогнозите на модела. Всички тези предизвикателства са проблеми, пред които се изправят специалистите по данни и разработчиците на AI, когато нямат подходящи инструменти за дебъгване и оценка на справедливостта или надеждността на модела. +В този курс ще разгледаме практични инструменти, които могат да се използват за оценка дали даден модел има проблеми с отговорния ИИ. Традиционните техники за отстраняване на грешки при машинното обучение обикновено се базират на количествени изчисления като агрегирана точност или средна загуба на грешка. Представете си какво може да се случи, ако данните, които използвате за изграждане на тези модели, не включват определени демографски групи, като раса, пол, политически възглед, религия, или непропорционално представят такива групи. Какво става, когато изходът на модела се интерпретира така, че да фаворизира някоя демографска група? Това може да въведе пре- или недопредставеност на тези чувствителни групи, причинявайки проблеми със справедливостта, включването или надеждността на модела. Друг фактор е, че моделите за машинно обучение се считат за черни кутии, което затруднява разбирането и обяснението на това какво движи предсказанието на модела. Всички тези предизвикателства срещат специалистите по данни и разработчиците на ИИ, когато нямат адекватни инструменти за отстраняване на грешки и оценка на справедливостта или надеждността на модела. -В този урок ще научите как да дебъгвате вашите модели, използвайки: +В този урок ще научите за отстраняване на грешки на вашите модели чрез: -- **Анализ на грешки**: идентифициране на области в разпределението на данните, където моделът има високи нива на грешки. -- **Общ преглед на модела**: извършване на сравнителен анализ между различни групи данни, за да се открият несъответствия в метриките за производителност на модела. -- **Анализ на данни**: изследване на области, където може да има свръх или недостатъчно представяне на данни, което може да наклони модела да благоприятства една демографска група пред друга. -- **Важност на характеристиките**: разбиране кои характеристики движат прогнозите на модела на глобално или локално ниво. +- **Анализ на грешки**: идентифициране къде в разпределението на данните моделът има високи нива на грешки. +- **Преглед на модела**: извършване на сравнителен анализ на различни кохорти от данни, за да се открият различия в метриките за представяне на модела. +- **Анализ на данни**: проучване къде може да има пре- или недопредставеност на данни, която да наклони модела да фаворизира една демографска група пред друга. +- **Значимост на признаците**: разбиране кои признаци задвижват предсказанията на модела на глобално или локално ниво. -## Предварителни знания +## Предварителни изисквания -Като предварително условие, моля, прегледайте [Инструменти за отговорен AI за разработчици](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) +Като предварително изискване, моля, преминете през прегледа [Инструменти за отговорен ИИ за разработчици](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) -> ![Gif за инструменти за отговорен AI](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) +> ![Gif за Инструменти за отговорен ИИ](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) ## Анализ на грешки -Традиционните метрики за производителност на моделите, използвани за измерване на точността, обикновено са изчисления, базирани на правилни срещу неправилни прогнози. Например, определянето, че моделът е точен в 89% от случаите със загуба на грешка от 0.001, може да се счита за добро представяне. Грешките обаче често не са разпределени равномерно в основния набор от данни. Може да получите резултат за точност на модела от 89%, но да откриете, че има различни области в данните, за които моделът се проваля в 42% от случаите. Последиците от тези модели на провал с определени групи данни могат да доведат до проблеми със справедливостта или надеждността. Затова е важно да се разберат областите, в които моделът се представя добре или не. Областите в данните, където има голям брой неточности в модела, могат да се окажат важни демографски данни. +Традиционните метрики за представяне на модел, използвани за измерване на точност, са в по-голямата си част изчисления базирани на правилни срещу неправилни предсказания. Например, ако се определи, че моделът е точен 89% от времето с грешка от 0.001, това може да се счита за добро представяне. Грешките често не са равномерно разпределени в основния ви набор от данни. Може да получите резултат 89% точност на модела, но да откриете, че има различни региони от данните, в които моделът се проваля 42% от времето. Последствията от тези модели на провали с определени групи данни могат да доведат до проблеми със справедливостта или надеждността. Важно е да се разбере къде моделът се представя добре и къде не. Данните региони с висока неточност в модела може да се окажат важна демографска група. -![Анализ и дебъгване на грешки в модела](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-distribution.png) +![Анализ и отстраняване на грешки на модел](../../../../translated_images/bg/ea-error-distribution.117452e1177c1dd8.webp) -Компонентът за анализ на грешки в таблото за отговорен AI показва как провалите на модела са разпределени в различни групи с визуализация на дърво. Това е полезно за идентифициране на характеристики или области, където има висока степен на грешки в набора от данни. Като видите откъде идват повечето неточности на модела, можете да започнете да изследвате основната причина. Можете също така да създавате групи данни за анализ. Тези групи данни помагат в процеса на дебъгване, за да се определи защо представянето на модела е добро в една група, но грешно в друга. +Компонентът Анализ на грешки в таблото за отговорен ИИ илюстрира как грешките на модела се разпределят сред различните кохорти с визуализация на дървовидна структура. Това е полезно за идентифициране на признаци или области, където има висока степен на грешки с вашия набор от данни. Като виждате откъде идват повечето неточности на модела, можете да започнете да изследвате основната причина. Можете също така да създавате кохорти от данни за извършване на анализ. Тези кохорти от данни помагат в процеса на отстраняване на грешки, за да се определи защо представянето на модела е добро в една кохорта, но грешно в друга. -![Анализ на грешки](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png) +![Анализ на грешки](../../../../translated_images/bg/ea-error-cohort.6886209ea5d438c4.webp) -Визуалните индикатори на картата на дървото помагат за по-бързо локализиране на проблемните области. Например, колкото по-тъмно червен е цветът на възел в дървото, толкова по-висока е степента на грешка. +Визуалните индикатори на дървовидната карта помагат за по-бързо локализиране на проблемните области. Например, колкото по-тъмен е червеният цвят на възела, толкова по-висока е степента на грешки. -Топлинната карта е друга функционалност за визуализация, която потребителите могат да използват за изследване на степента на грешка, използвайки една или две характеристики, за да намерят фактор, допринасящ за грешките на модела в целия набор от данни или групи. +Топлинната карта е друга визуална функционалност, която потребителите могат да използват за изследване на степента на грешки с помощта на един или два признака, за да открият фактор, допринасящ за грешките на модела в цял набор от данни или сред кохорти. -![Топлинна карта за анализ на грешки](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png) +![Топлинна карта за анализ на грешки](../../../../translated_images/bg/ea-heatmap.8d27185e28cee383.webp) -Използвайте анализ на грешки, когато трябва: +Използвайте анализа на грешки, когато трябва да: -* Да получите дълбоко разбиране за това как провалите на модела са разпределени в набора от данни и в няколко входни и характеристични измерения. -* Да разбиете агрегирани метрики за производителност, за да откриете автоматично грешни групи и да информирате за целенасочени стъпки за смекчаване. +* Получите дълбоко разбиране за начина, по който грешките на моделите се разпределят в набора от данни и в няколко измерения на вход и признаци. +* Разградите агрегирани метрики за представяне, за да откриете автоматично грешни кохорти и да информирате мерки за отстраняване. -## Общ преглед на модела +## Преглед на модела -Оценяването на производителността на модел за машинно обучение изисква цялостно разбиране на неговото поведение. Това може да се постигне чрез преглед на повече от една метрика, като степен на грешка, точност, припомняне, прецизност или MAE (средна абсолютна грешка), за да се открият несъответствия между метриките за производителност. Една метрика за производителност може да изглежда добре, но неточности могат да бъдат разкрити в друга метрика. Освен това, сравняването на метриките за несъответствия в целия набор от данни или групи помага да се осветят областите, в които моделът се представя добре или не. Това е особено важно за наблюдение на представянето на модела сред чувствителни срещу нечувствителни характеристики (например раса, пол или възраст на пациента), за да се разкрие потенциална несправедливост в модела. Например, откриването, че моделът е по-неточен в група, която има чувствителни характеристики, може да разкрие потенциална несправедливост. +Оценяването на представянето на модел за машинно обучение изисква цялостно разбиране на неговото поведение. Това може да се постигне чрез преглед на повече от една метрика като скорост на грешки, точност, възстановяване, прецизност или MAE (Средна абсолютна грешка), за да се открият различия в метриките за представяне. Една метрика може да изглежда добре, но неточности могат да се разкрият в друга метрика. Освен това сравнението на метриките за различия през целия набор от данни или кохорти помага да се види къде моделът се представя добре или не. Това е особено важно при разглеждане на представянето на модела между чувствителни и нечувствителни признаци (например раса, пол или възраст на пациента), за да се разкрие потенциална несправедливост. Например, откриването, че моделът е по-грешен в кохорта, която съдържа чувствителни признаци, може да разкрие потенциална несправедливост на модела. -Компонентът "Общ преглед на модела" в таблото за отговорен AI помага не само за анализиране на метриките за производителност на представянето на данните в група, но и дава на потребителите възможност да сравняват поведението на модела между различни групи. +Компонентът Преглед на модела в таблото за отговорен ИИ помага не само при анализа на метриките за представяне на представянето на данните в кохорта, но и дава възможност на потребителите да сравняват поведението на модела в различни кохорти. -![Групи от данни - общ преглед на модела в таблото за отговорен AI](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png) +![Кохорти от данни - преглед на модел в таблото за отговорен ИИ](../../../../translated_images/bg/model-overview-dataset-cohorts.dfa463fb527a35a0.webp) -Функционалността за анализ, базирана на характеристики, позволява на потребителите да стеснят подгрупи от данни в рамките на определена характеристика, за да идентифицират аномалии на по-гранулирано ниво. Например, таблото има вградена интелигентност за автоматично генериране на групи за избрана от потребителя характеристика (например *"time_in_hospital < 3"* или *"time_in_hospital >= 7"*). Това позволява на потребителя да изолира определена характеристика от по-голяма група данни, за да види дали тя е ключов фактор за неточните резултати на модела. +Функционалността за анализ на признаци в компонента позволява на потребителите да стесняват подгрупи от данни в даден признак, за да идентифицират аномалии на по-фино ниво. Например, таблото има вградена интелигентност за автоматично генериране на кохорти за избран от потребителя признак (например *"time_in_hospital < 3"* или *"time_in_hospital >= 7"*). Това позволява на потребителя да изолира конкретен признак от по-голяма група данни, за да види дали той оказва съществено влияние върху грешните резултати на модела. -![Групи от характеристики - общ преглед на модела в таблото за отговорен AI](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png) +![Кохорти по признаци - преглед на модел в таблото за отговорен ИИ](../../../../translated_images/bg/model-overview-feature-cohorts.c5104d575ffd0c80.webp) -Компонентът "Общ преглед на модела" поддържа два класа метрики за несъответствия: +Компонентът Преглед на модела поддържа два класа метрики за различия: -**Несъответствие в производителността на модела**: Тези метрики изчисляват несъответствието (разликата) в стойностите на избраната метрика за производителност между подгрупи от данни. Ето няколко примера: +**Различия в представянето на модела**: Тези метрики изчисляват разликата (диспропорцията) в стойностите на избраната метрика за представяне сред подгрупи от данни. Ето няколко примера: -* Несъответствие в степента на точност -* Несъответствие в степента на грешка -* Несъответствие в прецизността -* Несъответствие в припомнянето -* Несъответствие в средната абсолютна грешка (MAE) +* Различия в скоростта на точност +* Различия в скоростта на грешка +* Различия в прецизността +* Различия във възстановяването +* Различия в средната абсолютна грешка (MAE) -**Несъответствие в степента на селекция**: Тази метрика съдържа разликата в степента на селекция (благоприятна прогноза) между подгрупи. Пример за това е несъответствието в степента на одобрение на заеми. Степента на селекция означава частта от точките от данни във всяка класа, класифицирани като 1 (в бинарна класификация) или разпределението на прогнозните стойности (в регресия). +**Различия в степента на селекция**: Тази метрика съдържа разликата в степента на селекция (благоприятно предсказание) между подгрупите. Един пример за това е различията в процентите на одобрение на заем. Степента на селекция означава частта от точките от данни в всяка класова категория, класифицирани като 1 (в двоична класификация) или разпределение на стойностите на предсказанията (в регресия). ## Анализ на данни -> "Ако измъчвате данните достатъчно дълго, те ще признаят всичко" - Роналд Коуз +> "Ако измъчваш данните достатъчно дълго, те ще признаят всичко" - Роналд Коуз + +Това изказване звучи крайно, но е вярно, че данните могат да бъдат манипулирани, за да подкрепят всяко заключение. Понякога такива манипулации се случват неволно. Като хора всички имаме предразсъдъци и често е трудно съзнателно да осъзнаем кога въвеждаме предразсъдъци в данните. Гарантирането на справедливост в ИИ и машинното обучение остава сложно предизвикателство. -Това изказване звучи крайно, но е вярно, че данните могат да бъдат манипулирани, за да подкрепят всяко заключение. Такава манипулация понякога може да се случи неволно. Като хора, всички имаме предразсъдъци и често е трудно да осъзнаем кога въвеждаме предразсъдъци в данните. Гарантирането на справедливост в AI и машинното обучение остава сложен предизвикателство. +Данните са голяма "слепа зона" за традиционните метрики за представяне на модел. Може да имате високи резултати за точност, но това не винаги отразява скритите пристрастия в набора ви от данни. Например, ако в набор данни за служители има 27% жени на ръководни позиции и 73% мъже на същото ниво, AI модел, обучен с тези данни за рекламиране на работни места, може да таргетира главно мъжка аудитория за високи позиции. Тази дисбалансирана представеност в данните наклонява предсказанията на модела да фаворизират един пол. Това разкрива проблем със справедливостта, при който има полова пристрастност в AI модела. -Данните са голямо сляпо петно за традиционните метрики за производителност на моделите. Може да имате високи резултати за точност, но това не винаги отразява основните предразсъдъци в набора от данни. Например, ако набор от данни за служители показва, че 27% от жените заемат изпълнителни позиции в компания, а 73% от мъжете са на същото ниво, AI модел за рекламиране на работни места, обучен на тези данни, може да насочи предимно мъжка аудитория за старши позиции. Този дисбаланс в данните накланя прогнозата на модела да благоприятства един пол. Това разкрива проблем със справедливостта, където има полова предразсъдък в AI модела. +Компонентът Анализ на данни в таблото за отговорен ИИ помага да се идентифицират области с пре- и недопредставеност в набора от данни. Той помага на потребителите да диагностицират основната причина за грешки и проблеми със справедливостта, породени от дисбаланси в данните или липса на представеност на конкретна група данни. Това дава възможност на потребителите да визуализират наборите от данни въз основа на предсказани и реални резултати, групи грешки и конкретни признаци. Понякога откриването на недопредставена група данни може също да разкрие, че моделът не се учи добре и затова има висока неточност. Модел, който има пристрастия в данните, не е само проблем със справедливостта, но и показва, че моделът не е приобщаващ или надежден. -Компонентът "Анализ на данни" в таблото за отговорен AI помага да се идентифицират области, където има свръх или недостатъчно представяне в набора от данни. Той помага на потребителите да диагностицират основната причина за грешки и проблеми със справедливостта, въведени от дисбаланси в данните или липса на представяне на определена група данни. Това дава на потребителите възможност да визуализират набори от данни въз основа на прогнозирани и действителни резултати, групи с грешки и специфични характеристики. Понякога откриването на недостатъчно представена група данни може също така да разкрие, че моделът не се учи добре, което води до високи неточности. Модел с предразсъдъци в данните не само е проблем със справедливостта, но показва, че моделът не е приобщаващ или надежден. +![Компонент Анализ на данни в таблото за отговорен ИИ](../../../../translated_images/bg/dataanalysis-cover.8d6d0683a70a5c1e.webp) -![Компонент за анализ на данни в таблото за отговорен AI](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png) -Използвайте анализ на данни, когато трябва: +Използвайте анализа на данни, когато трябва да: -* Да изследвате статистиката на вашия набор от данни, като избирате различни филтри, за да разделите данните в различни измерения (известни също като групи). -* Да разберете разпределението на вашия набор от данни между различни групи и характеристики. -* Да определите дали вашите открития, свързани със справедливостта, анализа на грешки и причинността (получени от други компоненти на таблото), са резултат от разпределението на вашия набор от данни. -* Да решите в кои области да съберете повече данни, за да смекчите грешки, произтичащи от проблеми с представянето, шум в етикетите, шум в характеристиките, предразсъдъци в етикетите и подобни фактори. +* Изследвате статистиките на вашия набор от данни чрез избор на различни филтри, за да разделите данните си на различни измерения (наричани още кохорти). +* Разберете разпределението на данните ви между различни кохорти и групи признаци. +* Определите дали вашите наблюдения, свързани със справедливост, анализ на грешки и причинно-следствени връзки (произтичащи от други компоненти на таблото), са резултат от разпределението на набора ви от данни. +* Изберете в кои области да съберете повече данни, за да намалите грешките, произтичащи от проблеми с представеността, шум в етикетите, шум в признаците, предразсъдъци в етикетите и подобни фактори. ## Интерпретируемост на модела -Моделите за машинно обучение обикновено са "черни кутии". Разбирането кои ключови характеристики на данните движат прогнозата на модела може да бъде предизвикателство. Важно е да се осигури прозрачност относно причините, поради които моделът прави определена прогноза. Например, ако AI система прогнозира, че диабетен пациент е изложен на риск от повторно приемане в болница в рамките на по-малко от 30 дни, тя трябва да може да предостави подкрепящи данни, които са довели до тази прогноза. Наличието на подкрепящи данни носи прозрачност, която помага на клиницистите или болниците да вземат добре информирани решения. Освен това, възможността да се обясни защо моделът е направил прогноза за индивидуален пациент осигурява отговорност спрямо здравните регулации. Когато използвате модели за машинно обучение по начини, които засягат живота на хората, е от съществено значение да разберете и обясните какво влияе върху поведението на модела. Интерпретируемостта и обяснимостта на модела помагат да се отговори на въпроси в сценарии като: +Моделите за машинно обучение често са черни кутии. Разбирането кои ключови признаци водят до предсказанието на модела може да бъде предизвикателство. Важно е да се осигури прозрачност защо модел дава дадено предсказание. Например, ако AI система предскаже, че диабетен пациент има риск да бъде повторно приет в болница за по-малко от 30 дни, тя трябва да може да предостави подкрепящи данни, довели до това предсказание. Наличието на индикатори за подкрепа въвежда прозрачност и помага на клиницисти или болници да взимат информирани решения. Освен това, възможността да се обясни защо модел е дал предсказание за отделен пациент осигурява отчетност според здравните регулации. Когато използвате модели за машинно обучение по начини, които засягат живота на хората, е жизненоважно да разберете и обясните какво влияе върху поведението на модела. Обяснимостта и интерпретируемостта на моделите помагат да се отговори на въпроси в сценарии като: -* Дебъгване на модела: Защо моделът ми направи тази грешка? Как мога да го подобря? -* Сътрудничество между хора и AI: Как мога да разбера и да се доверя на решенията на модела? -* Регулаторно съответствие: Дали моделът ми отговаря на законовите изисквания? +* Отстраняване на грешки в модел: Защо моят модел направи тази грешка? Как мога да го подобря? +* Сътрудничество между човек и ИИ: Как мога да разбера и да се доверя на решенията на модела? +* Спазване на регулации: Удволетворява ли моят модел законовите изисквания? -Компонентът "Важност на характеристиките" в таблото за отговорен AI помага да се дебъгва и да се получи цялостно разбиране за това как моделът прави прогнози. Това е полезен инструмент за професионалисти в машинното обучение и вземащи решения, за да обяснят и покажат доказателства за характеристиките, които влияят върху поведението на модела за регулаторно съответствие. Потребителите могат да изследват както глобални, така и локални обяснения, за да валидират кои характеристики движат прогнозата на модела. Глобалните обяснения изброяват основните характеристики, които са повлияли на общата прогноза на модела. Локалните обяснения показват кои характеристики са довели до прогноза на модела за индивидуален случай. Възможността за оценка на локални обяснения също е полезна при дебъгване или одит на конкретен случай, за да се разбере и интерпретира защо моделът е направил точна или неточна прогноза. +Компонентът Значимост на признаците в таблото за отговорен ИИ ви помага да отстранявате грешки и да добивате цялостно разбиране как моделът прави предсказания. Той е полезен инструмент за професионалисти в машинното обучение и вземащи решения, за да обясняват и показват доказателства за признаците, които влияят върху поведението на модела за спазване на регулации. След това потребителите могат да разглеждат както глобални, така и локални обяснения, за да валидират кои признаци движат предсказанията на модела. Глобалните обяснения изброяват основните признаци, които оказват влияние върху общото предсказание на модела. Локалните обяснения показват кои признаци са довели до предсказанието на модела за отделен случай. Възможността да се оценяват локални обяснения е полезна и при отстраняване на грешки или одит на конкретен случай с цел по-добро разбиране и интерпретация защо моделът е направил точно или неточно предсказание. -![Компонент за важност на характеристиките в таблото за отговорен AI](../../../../9-Real-World/2-Debugging-ML-Models/images/9-feature-importance.png) +![Компонент Значимост на признаците в таблото за отговорен ИИ](../../../../translated_images/bg/9-feature-importance.cd3193b4bba3fd4b.webp) -* Глобални обяснения: Например, кои характеристики влияят върху общото поведение на модела за повторно приемане в болница на диабетни пациенти? -* Локални обяснения: Например, защо диаб -- **Прекомерно или недостатъчно представяне**. Идеята е, че определена група не е представена в дадена професия, и всяка услуга или функция, която продължава да насърчава това, допринася за вреда. +* Глобални обяснения: Например, кои признаци влияят на общото поведение на модел за повторно приемане на пациенти с диабет в болница? +* Локални обяснения: Например, защо диабетен пациент над 60 години с предходни хоспитализации беше предсказан да бъде или да не бъде повторно приет в болница в рамките на 30 дни? -### Табло за отговорен AI в Azure +В процеса на отстраняване на грешки при разглеждане на представянето на модела в различни кохорти, компонентът Значимост на признаците показва нивото на влияние, което даден признак оказва в кохортите. Той помага да се разкрият аномалии при сравняване на степента, с която признак влияе върху грешните предсказания на модела. Компонентът може да покаже кои стойности в даден признак са оказали положително или отрицателно влияние върху резултата на модела. Например, ако моделът е направил неточно предсказание, компонентът ви дава възможност да навлезете в подробности и да установите кои признаци или стойности на признаците са предизвикали това предсказание. Това ниво на детайлност помага не само при отстраняване на грешки, но и осигурява прозрачност и отчетност при одит. Накрая компонентът може да помогне за идентифициране на проблеми със справедливостта. Например, ако чувствителен признак като етническа принадлежност или пол оказва силно влияние при предсказание на модела, това може да е знак за раса или полова пристрастност в модела. -[Табло за отговорен AI в Azure](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) е изградено върху инструменти с отворен код, разработени от водещи академични институции и организации, включително Microsoft. Те са от съществено значение за специалистите по данни и разработчиците на AI, за да разбират по-добре поведението на моделите, да откриват и смекчават нежелани проблеми в AI моделите. +![Значимост на признаците](../../../../translated_images/bg/9-features-influence.3ead3d3f68a84029.webp) -- Научете как да използвате различните компоненти, като разгледате [документацията за таблото за отговорен AI.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) +Използвайте интерпретируемостта, когато трябва да: -- Разгледайте някои [примерни ноутбуци за таблото за отговорен AI](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks), за да дебъгвате по-отговорни AI сценарии в Azure Machine Learning. +* Определите колко доверие заслужават предсказанията на вашата AI система, като разберете кои признаци са най-важни за предсказанията. +* Подходите към отстраняването на грешки на модела, като първо го разберете и установите дали моделът използва здрави признаци или просто фалшиви корелации. +* Откриете потенциални източници на несправедливост, като разберете дали моделът базира предсказанията си на чувствителни признаци или на такива, които са силно корелирани с тях. +* Изградите доверие на потребителите в решенията на модела чрез генериране на локални обяснения, илюстриращи техните резултати. +* Проведете регулаторен одит на AI система за валидиране на модели и наблюдение на въздействието на решенията на модела върху хората. ---- -## 🚀 Предизвикателство +## Заключение -За да предотвратим въвеждането на статистически или данни пристрастия от самото начало, трябва: +Всички компоненти от таблото за отговорен ИИ са практични инструменти, които ви помагат да изграждате модели за машинно обучение, които са по-малко вредни и по-надеждни за обществото. Те подобряват превенцията на заплахи за човешките права; дискриминация или изключване на определени групи от възможности за живот; и риска от физически или психологически травми. Също така помагат да се изгради доверие в решенията на вашия модел чрез генериране на локални обяснения за илюстриране на резултатите им. Някои от потенциалните вреди могат да бъдат класифицирани като: -- да имаме разнообразие от произходи и перспективи сред хората, работещи върху системите -- да инвестираме в набори от данни, които отразяват разнообразието на нашето общество -- да разработим по-добри методи за откриване и коригиране на пристрастия, когато те се появят +- **Разпределение**, ако например се фаворизира един пол или етнос пред друг. +- **Качество на услугата**. Ако обучите данните за един конкретен сценарий, но реалността е много по-сложна, това води до лошо представяща се услуга. +- **Стереотипизиране**. Свързване на дадена група с предварително зададени атрибути. -Помислете за реални сценарии, в които несправедливостта е очевидна при изграждането и използването на модели. Какво друго трябва да вземем предвид? +- **Обезценяване**. Несправедливо критикуване и етикиране на нещо или някого. +- **Прекомерно или недостатъчно представяне**. Идеята е, че дадена група не се вижда в определена професия и всяка услуга или функция, която продължава да популяризира това, допринася за вреда. -## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/) -## Преглед и самостоятелно обучение +### Azure RAI табло + +[Azure RAI табло](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) е изградено върху инструменти с отворен код, разработени от водещи академични институции и организации, включително Microsoft, които са от съществено значение за дата учени и AI разработчици да разбират по-добре поведението на моделите, да откриват и смекчават нежелани проблеми в AI моделите. -В този урок научихте някои от практическите инструменти за интегриране на отговорен AI в машинното обучение. +- Научете как да използвате различните компоненти, като прегледате RAI табло [документацията.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) -Гледайте този уъркшоп, за да се задълбочите в темите: +- Вижте някои RAI табло [примерни тетрадки](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) за отстраняване на грешки в по-отговорни AI сценарии в Azure Machine Learning. + +--- +## 🚀 Предизвикателство + +За да предотвратим въвеждането на статистически или данни предразсъдъци от самото начало, трябва: + +- да има разнообразие от среди и перспективи сред хората, работещи по системите +- да инвестираме в набори от данни, които отразяват разнообразието на нашето общество +- да разработим по-добри методи за откриване и коригиране на предразсъдъци, когато възникнат + +Помислете за реални сценарии, в които несправедливостта е очевидна при изграждането и използването на модели. Какво още трябва да вземем предвид? + +## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/) +## Преглед и Самообучение + +В този урок научихте някои от практическите инструменти за включване на отговорен AI в машинното обучение. -- Табло за отговорен AI: Единно решение за оперативизиране на отговорен AI на практика от Бесмира Нуши и Мехрнуш Самеки +Гледайте този уъркшоп, за да навлезете по-дълбоко в темите: -[![Табло за отговорен AI: Единно решение за оперативизиране на отговорен AI на практика](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Табло за отговорен AI: Единно решение за оперативизиране на отговорен AI на практика") +- Отговорно AI табло: Централно място за опериране с RAI на практика от Бесмира Нуши и Мехрнуш Самеки -> 🎥 Кликнете върху изображението по-горе за видео: Табло за отговорен AI: Единно решение за оперативизиране на отговорен AI на практика от Бесмира Нуши и Мехрнуш Самеки +[![Отговорно AI табло: Централно място за опериране с RAI на практика](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Отговорно AI табло: Централно място за опериране с RAI на практика") -Прегледайте следните материали, за да научите повече за отговорния AI и как да изграждате по-надеждни модели: +> 🎥 Кликнете върху изображението по-горе за видео: Отговорно AI табло: Централно място за опериране с RAI на практика от Бесмира Нуши и Мехрнуш Самеки + +Позовете се на следните материали, за да научите повече за отговорния AI и как да изградите по-доверени модели: -- Инструменти на Microsoft за отговорен AI за дебъгване на ML модели: [Ресурси за инструменти за отговорен AI](https://aka.ms/rai-dashboard) +- Инструменти на Microsoft за отговорно AI за отстраняване на грешки в ML модели: [Отговорни AI ресурси](https://aka.ms/rai-dashboard) -- Разгледайте комплекта инструменти за отговорен AI: [Github](https://github.com/microsoft/responsible-ai-toolbox) +- Разгледайте комплекта за отговорен AI: [Github](https://github.com/microsoft/responsible-ai-toolbox) -- Център за ресурси за отговорен AI на Microsoft: [Ресурси за отговорен AI – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) +- Центърът за ресурси на Microsoft за RAI: [Отговорни AI ресурси – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) -- Изследователска група FATE на Microsoft: [FATE: Справедливост, отчетност, прозрачност и етика в AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) +- Изследователската група на Microsoft FATE: [FATE: Справедливост, Отговорност, Прозрачност и Етика в AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) ## Задача -[Разгледайте таблото за отговорен AI](assignment.md) +[Разгледайте RAI табло](assignment.md) --- -**Отказ от отговорност**: -Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод. \ No newline at end of file + +**Отказ от отговорност**: +Този документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод. + \ No newline at end of file diff --git a/translations/ro/.co-op-translator.json b/translations/ro/.co-op-translator.json index ba20bfdcd..03a3e27ae 100644 --- a/translations/ro/.co-op-translator.json +++ b/translations/ro/.co-op-translator.json @@ -24,8 +24,8 @@ "language_code": "ro" }, "1-Introduction/3-fairness/README.md": { - "original_hash": "9a6b702d1437c0467e3c5c28d763dac2", - "translation_date": "2025-09-05T16:01:28+00:00", + "original_hash": "0f00d72169a0d37eecfd16d71e01700a", + "translation_date": "2026-07-14T06:16:38+00:00", "source_file": "1-Introduction/3-fairness/README.md", "language_code": "ro" }, @@ -54,8 +54,8 @@ "language_code": "ro" }, "2-Regression/1-Tools/README.md": { - "original_hash": "fa81d226c71d5af7a2cade31c1c92b88", - "translation_date": "2025-09-05T15:22:38+00:00", + "original_hash": "0b8635427b582d03ea4ab7089b93e505", + "translation_date": "2026-07-14T06:12:02+00:00", "source_file": "2-Regression/1-Tools/README.md", "language_code": "ro" }, @@ -72,8 +72,8 @@ "language_code": "ro" }, "2-Regression/2-Data/README.md": { - "original_hash": "7c077988328ebfe33b24d07945f16eca", - "translation_date": "2025-09-05T15:26:15+00:00", + "original_hash": "a58b2c4d16c6b122643391745ac15af6", + "translation_date": "2026-07-14T06:13:09+00:00", "source_file": "2-Regression/2-Data/README.md", "language_code": "ro" }, @@ -89,6 +89,12 @@ "source_file": "2-Regression/2-Data/solution/Julia/README.md", "language_code": "ro" }, + "2-Regression/2-Data/solution/notebook.ipynb": { + "original_hash": "96b95f8cf473481f2f371de8156f1571", + "translation_date": "2026-07-14T05:54:02+00:00", + "source_file": "2-Regression/2-Data/solution/notebook.ipynb", + "language_code": "ro" + }, "2-Regression/3-Linear/README.md": { "original_hash": "8b776e731c35b171d316d01d0e7b1369", "translation_date": "2026-04-26T19:09:51+00:00", @@ -457,7 +463,7 @@ }, "8-Reinforcement/1-QLearning/README.md": { "original_hash": "911efd5e595089000cb3c16fce1beab8", - "translation_date": "2025-09-05T16:41:50+00:00", + "translation_date": "2026-07-14T06:14:24+00:00", "source_file": "8-Reinforcement/1-QLearning/README.md", "language_code": "ro" }, @@ -481,7 +487,7 @@ }, "8-Reinforcement/2-Gym/README.md": { "original_hash": "107d5bb29da8a562e7ae72262d251a75", - "translation_date": "2025-09-05T16:47:06+00:00", + "translation_date": "2026-07-14T06:15:33+00:00", "source_file": "8-Reinforcement/2-Gym/README.md", "language_code": "ro" }, @@ -581,6 +587,19 @@ "source_file": "TROUBLESHOOTING.md", "language_code": "ro" }, + "__translation_failures__": { + "sketchnotes/LICENSE.md": { + "original_hash": "fba3b94d88bfb9b81369b869a1e9a20f", + "source_file": "sketchnotes/LICENSE.md", + "language_code": "ro", + "failure_date": "2026-07-14T06:11:04+00:00", + "status": "failed", + "error_type": "TranslationIncompleteError", + "error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.", + "translator_version": "0.20.0", + "failure_policy_version": 1 + } + }, "docs/_sidebar.md": { "original_hash": "68dd06c685f6ce840e0acfa313352e7c", "translation_date": "2025-09-05T15:48:44+00:00", diff --git a/translations/ro/1-Introduction/3-fairness/README.md b/translations/ro/1-Introduction/3-fairness/README.md index d393c2de5..35503812b 100644 --- a/translations/ro/1-Introduction/3-fairness/README.md +++ b/translations/ro/1-Introduction/3-fairness/README.md @@ -1,146 +1,167 @@ -# Construirea soluțiilor de învățare automată cu AI responsabil - -![Rezumat al AI responsabil în învățarea automată într-o schiță](../../../../sketchnotes/ml-fairness.png) -> Schiță realizată de [Tomomi Imura](https://www.twitter.com/girlie_mac) - -## [Chestionar înainte de lecție](https://ff-quizzes.netlify.app/en/ml/) +# Construirea soluțiilor de Machine Learning cu AI responsabil + +![Sumar al AI responsabil în Machine Learning într-un sketchnote](../../../../translated_images/ro/ml-fairness.ef296ebec6afc98a.webp) +> Sketchnote de [Tomomi Imura](https://www.twitter.com/girlie_mac) +## [Test înainte de lecție](https://ff-quizzes.netlify.app/en/ml/) + ## Introducere -În acest curriculum, vei începe să descoperi cum învățarea automată poate și influențează viețile noastre de zi cu zi. Chiar și acum, sistemele și modelele sunt implicate în sarcini de luare a deciziilor zilnice, cum ar fi diagnosticarea în sănătate, aprobarea împrumuturilor sau detectarea fraudei. De aceea, este important ca aceste modele să funcționeze bine pentru a oferi rezultate de încredere. La fel ca orice aplicație software, sistemele AI pot să nu îndeplinească așteptările sau să aibă un rezultat nedorit. De aceea, este esențial să putem înțelege și explica comportamentul unui model AI. +În acest curriculum, vei începe să descoperi cum învățarea automată poate și impactează viața noastră de zi cu zi. Chiar acum, sistemele și modelele sunt implicate în sarcini zilnice de luare a deciziilor, cum ar fi diagnostice medicale, aprobări de împrumuturi sau detectarea fraudelor. Prin urmare, este important ca aceste modele să funcționeze bine pentru a oferi rezultate de încredere. La fel ca orice aplicație software, sistemele AI pot să nu corespundă așteptărilor sau să aibă un rezultat nedorit. De aceea este esențial să înțelegem și să explicăm comportamentul unui model AI. -Imaginează-ți ce se poate întâmpla atunci când datele pe care le folosești pentru a construi aceste modele nu includ anumite demografii, cum ar fi rasa, genul, opiniile politice, religia sau reprezintă disproporționat astfel de demografii. Ce se întâmplă când rezultatul modelului este interpretat astfel încât să favorizeze o anumită demografie? Care este consecința pentru aplicație? În plus, ce se întâmplă când modelul are un rezultat advers și este dăunător pentru oameni? Cine este responsabil pentru comportamentul sistemelor AI? Acestea sunt câteva întrebări pe care le vom explora în acest curriculum. +Imaginează-ți ce se poate întâmpla când datele pe care le folosești pentru construirea acestor modele lipsesc anumite demografii, cum ar fi rasa, genul, orientarea politică, religia, sau reprezintă disproporționat astfel de demografii. Ce se întâmplă când rezultatul modelului este interpretat în favoarea unui anumit grup demografic? Care este consecința pentru aplicație? În plus, ce se întâmplă când modelul are un rezultat advers și este dăunător pentru oameni? Cine este responsabil pentru comportamentul sistemelor AI? Acestea sunt câteva întrebări pe care le vom explora în acest curriculum. -În această lecție, vei: +În această lecție vei: -- Conștientiza importanța echității în învățarea automată și daunele legate de echitate. -- Deveni familiar cu practica de explorare a valorilor extreme și scenariilor neobișnuite pentru a asigura fiabilitatea și siguranța. -- Înțelege necesitatea de a împuternici pe toată lumea prin proiectarea de sisteme incluzive. -- Explora cât de vital este să protejezi confidențialitatea și securitatea datelor și a oamenilor. -- Observa importanța unei abordări transparente pentru a explica comportamentul modelelor AI. -- Fi conștient de faptul că responsabilitatea este esențială pentru a construi încrederea în sistemele AI. +- Să-ți crești conștientizarea asupra importanței echității în învățarea automată și a daunelor legate de echitate. +- Să te familiarizezi cu practica explorării excepțiilor și scenariilor neobișnuite pentru a asigura fiabilitatea și siguranța. +- Să dobândești înțelegere despre nevoia de a împuternici pe toată lumea prin proiectarea sistemelor incluzive. +- Să explorezi cât de vital este să protejezi intimitatea și securitatea datelor și a persoanelor. +- Să vezi importanța unei abordări transparențe pentru a explica comportamentul modelelor AI. +- Să fii atent la cum responsabilitatea este esențială pentru a construi încredere în sistemele AI. -## Prerechizite +## Cerințe prealabile -Ca prerechizite, te rugăm să urmezi "Principiile AI Responsabil" pe Learn Path și să vizionezi videoclipul de mai jos pe acest subiect: +Ca cerință prealabilă, te rugăm să parcurgi "Principiile AI-ului Responsabil" în cadrul unui traseu de învățare și să urmărești videoclipul de mai jos pe acest subiect: -Află mai multe despre AI Responsabil urmând acest [Learning Path](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) +Află mai multe despre AI responsabil urmând acest [Traseu de învățare](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) -[![Abordarea Microsoft pentru AI Responsabil](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Abordarea Microsoft pentru AI Responsabil") +[![Abordarea Microsoft față de AI responsabil](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Abordarea Microsoft față de AI responsabil") -> 🎥 Click pe imaginea de mai sus pentru un videoclip: Abordarea Microsoft pentru AI Responsabil +> 🎥 Click pe imaginea de mai sus pentru un video: Abordarea Microsoft față de AI responsabil ## Echitate -Sistemele AI ar trebui să trateze pe toată lumea în mod echitabil și să evite să afecteze grupuri similare de oameni în moduri diferite. De exemplu, atunci când sistemele AI oferă recomandări pentru tratamente medicale, aplicații de împrumut sau angajare, acestea ar trebui să facă aceleași recomandări pentru toți cei cu simptome, circumstanțe financiare sau calificări profesionale similare. Fiecare dintre noi, ca oameni, purtăm prejudecăți moștenite care ne afectează deciziile și acțiunile. Aceste prejudecăți pot fi evidente în datele pe care le folosim pentru a antrena sistemele AI. Astfel de manipulări pot apărea uneori neintenționat. Este adesea dificil să conștientizezi când introduci prejudecăți în date. +Sistemele AI ar trebui să trateze pe toată lumea în mod echitabil și să evite să afecteze grupuri similare de oameni în moduri diferite. De exemplu, când sistemele AI oferă recomandări pentru tratament medical, aplicații de împrumuturi sau angajare, ele ar trebui să facă aceleași recomandări pentru toți cu simptome similare, condiții financiare sau calificări profesionale asemănătoare. Fiecare dintre noi ca oameni purtăm prejudecăți moștenite care ne influențează deciziile și acțiunile. Aceste prejudecăți pot fi evidente în datele folosite pentru antrenarea sistemelor AI. O astfel de manipulare poate apărea uneori neintenționat. Este adesea dificil de conștientizat când introduci un bias în date. -**„Nedreptatea”** cuprinde impacturi negative sau „daune” pentru un grup de oameni, cum ar fi cei definiți în termeni de rasă, gen, vârstă sau statut de dizabilitate. Principalele daune legate de echitate pot fi clasificate astfel: +**„Nedreptatea”** cuprinde impacturi negative, sau „daune”, pentru un grup de oameni, cum ar fi cele definite prin rasă, gen, vârstă sau statut de dizabilitate. Principalele daune legate de echitate pot fi clasificate astfel: -- **Alocare**, dacă un gen sau o etnie, de exemplu, este favorizată în detrimentul alteia. -- **Calitatea serviciului**. Dacă antrenezi datele pentru un scenariu specific, dar realitatea este mult mai complexă, aceasta duce la un serviciu slab. De exemplu, un dozator de săpun care nu pare să detecteze persoanele cu pielea închisă la culoare. [Referință](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) -- **Denigrare**. Criticarea și etichetarea nedreaptă a ceva sau a cuiva. De exemplu, o tehnologie de etichetare a imaginilor a etichetat în mod infam imagini ale persoanelor cu pielea închisă la culoare ca fiind gorile. -- **Reprezentare excesivă sau insuficientă**. Ideea este că un anumit grup nu este văzut într-o anumită profesie, iar orice serviciu sau funcție care continuă să promoveze acest lucru contribuie la daune. -- **Stereotipizare**. Asocierea unui grup dat cu atribute predefinite. De exemplu, un sistem de traducere între engleză și turcă poate avea inexactități din cauza cuvintelor asociate stereotipic cu genul. +- **Alocare**, dacă un gen sau o etnie, de exemplu, este favorizată în detrimentul altuia. +- **Calitatea serviciului**. Dacă antrenezi date pentru un scenariu specific, dar realitatea este mult mai complexă, rezultă un serviciu slab. De exemplu, un dozator de săpun care nu poate detecta persoane cu piele închisă la culoare. [Referință](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) +- **Denigrare**. Criticarea și etichetarea nedreaptă a unui lucru sau persoană. De exemplu, o tehnologie de etichetare a imaginilor care a etichetat infam imagini ale persoanelor cu piele închisă la culoare ca gorile. +- **Supra- sau subreprezentare**. Ideea este că un grup anume nu apare într-o anumită profesie, iar orice serviciu sau funcție ce promovează acest lucru contribuie la daune. +- **Stereotipizare**. Asocierea unui grup cu atribute prealabile atribuite. De exemplu, un sistem de traducere între engleză și turcă poate avea inexactități din cauza cuvintelor cu asocieri stereotipice de gen. -![traducere în turcă](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png) +![traducere în turcă](../../../../translated_images/ro/gender-bias-translate-en-tr.f185fd8822c2d437.webp) > traducere în turcă -![traducere înapoi în engleză](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) +![traducere înapoi în engleză](../../../../translated_images/ro/gender-bias-translate-tr-en.4eee7e3cecb8c70e.webp) > traducere înapoi în engleză -Când proiectăm și testăm sisteme AI, trebuie să ne asigurăm că AI este echitabil și nu este programat să ia decizii părtinitoare sau discriminatorii, pe care nici oamenii nu au voie să le ia. Garantarea echității în AI și învățarea automată rămâne o provocare complexă sociotehnică. +La proiectarea și testarea sistemelor AI, trebuie să ne asigurăm că AI este echitabil și nu este programat să ia decizii părtinitoare sau discriminatorii, decizii pe care oamenii sunt de asemenea opriți să le ia. Garantarea echității în AI și învățarea automată rămâne o provocare sociotehnică complexă. ### Fiabilitate și siguranță -Pentru a construi încredere, sistemele AI trebuie să fie fiabile, sigure și consistente în condiții normale și neașteptate. Este important să știm cum se vor comporta sistemele AI într-o varietate de situații, mai ales când sunt valori extreme. Când construim soluții AI, trebuie să ne concentrăm substanțial pe modul de gestionare a unei varietăți largi de circumstanțe pe care soluțiile AI le-ar putea întâlni. De exemplu, o mașină autonomă trebuie să pună siguranța oamenilor pe primul loc. Ca rezultat, AI-ul care alimentează mașina trebuie să ia în considerare toate scenariile posibile pe care mașina le-ar putea întâlni, cum ar fi noaptea, furtuni, viscol, copii care traversează strada, animale de companie, construcții pe drum etc. Cât de bine poate gestiona un sistem AI o gamă largă de condiții în mod fiabil și sigur reflectă nivelul de anticipare pe care l-a avut specialistul în date sau dezvoltatorul AI în timpul proiectării sau testării sistemului. +Pentru a construi încredere, sistemele AI trebuie să fie fiabile, sigure și consistente în condiții normale și neașteptate. Este important să știm cum se vor comporta sistemele AI în diverse situații, mai ales când sunt excepții. La construirea soluțiilor AI trebuie să existe un focus substanțial pe gestionarea unei varietăți largi de circumstanțe pe care soluțiile AI le-ar putea întâlni. De exemplu, o mașină autonomă trebuie să pună siguranța oamenilor pe primul loc. Drept urmare, AI care conduce mașina trebuie să ia în considerare toate scenariile posibile pe care mașina le-ar putea întâlni, cum ar fi noaptea, furtuni sau ninsori puternice, copii care traversează strada, animale de companie, construcții rutiere etc. Cât de bine poate gestiona un sistem AI o gamă largă de condiții în mod fiabil și sigur reflectă nivelul de anticipare pe care l-a avut omul de știință în date sau dezvoltatorul AI în timpul proiectării sau testării sistemului. -> [🎥 Click aici pentru un videoclip: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) +> [🎥 Click aici pentru un video: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) ### Incluziune -Sistemele AI ar trebui să fie proiectate pentru a implica și împuternici pe toată lumea. Când proiectează și implementează sisteme AI, specialiștii în date și dezvoltatorii AI identifică și abordează barierele potențiale din sistem care ar putea exclude neintenționat oamenii. De exemplu, există 1 miliard de persoane cu dizabilități în întreaga lume. Cu avansarea AI, acestea pot accesa o gamă largă de informații și oportunități mai ușor în viața lor de zi cu zi. Abordarea barierelor creează oportunități de a inova și dezvolta produse AI cu experiențe mai bune care beneficiază pe toată lumea. +Sistemele AI trebuie proiectate pentru a implica și împuternici pe toată lumea. La proiectarea și implementarea sistemelor AI, oamenii de știință în date și dezvoltatorii AI identifică și abordează posibile bariere în sistem care ar putea exclude neintenționat oamenii. De exemplu, există 1 miliard de persoane cu dizabilități în întreaga lume. Odată cu avansul AI, acestea pot accesa o gamă largă de informații și oportunități mai ușor în viața lor de zi cu zi. Prin eliminarea barierelor se creează oportunități de a inova și dezvolta produse AI cu experiențe mai bune care să beneficieze pe toată lumea. -> [🎥 Click aici pentru un videoclip: incluziunea în AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v) +> [🎥 Click aici pentru un video: incluziune în AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v) -### Securitate și confidențialitate +### Securitate și intimitate -Sistemele AI ar trebui să fie sigure și să respecte confidențialitatea oamenilor. Oamenii au mai puțină încredere în sistemele care le pun în pericol confidențialitatea, informațiile sau viețile. Când antrenăm modele de învățare automată, ne bazăm pe date pentru a produce cele mai bune rezultate. În acest proces, originea datelor și integritatea lor trebuie luate în considerare. De exemplu, datele au fost trimise de utilizatori sau sunt disponibile public? Apoi, în timp ce lucrăm cu datele, este crucial să dezvoltăm sisteme AI care pot proteja informațiile confidențiale și rezista atacurilor. Pe măsură ce AI devine mai răspândit, protejarea confidențialității și securizarea informațiilor personale și de afaceri devin din ce în ce mai critice și complexe. Problemele de confidențialitate și securitate a datelor necesită o atenție deosebită pentru AI, deoarece accesul la date este esențial pentru ca sistemele AI să facă predicții și decizii precise și informate despre oameni. +Sistemele AI trebuie să fie sigure și să respecte intimitatea persoanelor. Oamenii au mai puțină încredere în sistemele care le pun intimitatea, informațiile sau viețile în pericol. Când antrenăm modelele de învățare automată, ne bazăm pe date pentru a obține cele mai bune rezultate. În acest proces, trebuie să considerăm originea datelor și integritatea acestora. De exemplu, datele au fost furnizate de utilizator sau sunt disponibile public? În plus, în timpul lucrului cu datele, este crucial să dezvoltăm sisteme AI care să poată proteja informațiile confidențiale și să reziste atacurilor. Pe măsură ce AI devine tot mai răspândit, protejarea intimității și securizarea informațiilor personale și de afaceri importante devin din ce în ce mai critice și complexe. Problemele de intimitate și securitate a datelor necesită o atenție deosebită pentru AI pentru că accesul la date este esențial pentru ca sistemele AI să facă predicții și decizii corecte și informate despre oameni. -> [🎥 Click aici pentru un videoclip: securitatea în AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) +> [🎥 Click aici pentru un video: securitate în AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) -- Industria a făcut progrese semnificative în confidențialitate și securitate, alimentate în mod semnificativ de reglementări precum GDPR (Regulamentul General privind Protecția Datelor). -- Totuși, cu sistemele AI trebuie să recunoaștem tensiunea dintre necesitatea mai multor date personale pentru a face sistemele mai personale și eficiente – și confidențialitatea. -- La fel ca la nașterea computerelor conectate la internet, vedem o creștere semnificativă a numărului de probleme de securitate legate de AI. -- În același timp, am văzut AI fiind folosit pentru a îmbunătăți securitatea. De exemplu, majoritatea scanerelor antivirus moderne sunt alimentate de euristici AI. -- Trebuie să ne asigurăm că procesele noastre de știința datelor se îmbină armonios cu cele mai recente practici de confidențialitate și securitate. +- Ca industrie, am făcut progrese semnificative în intimitate și securitate, impulsionate semnificativ de reglementări precum GDPR (Regulamentul General pentru Protecția Datelor). +- Totuși, în cazul sistemelor AI trebuie să recunoaștem tensiunea dintre necesitatea de mai multe date personale pentru a face sistemele mai personale și eficiente – și intimitate. +- La fel cum la nașterea calculatoarelor conectate la internet am văzut o creștere masivă a problemelor de securitate, vedem acum o creștere semnificativă a problemelor de securitate legate de AI. +- În același timp, am văzut AI folosit pentru îmbunătățirea securității. De exemplu, majoritatea scanerelor antivirale moderne sunt astăzi conduse de euristici AI. +- Trebuie să ne asigurăm că procesele noastre de Data Science sunt în armonie cu cele mai noi practici de intimitate și securitate. -### Transparență -Sistemele AI ar trebui să fie ușor de înțeles. O parte crucială a transparenței este explicarea comportamentului sistemelor AI și a componentelor acestora. Îmbunătățirea înțelegerii sistemelor AI necesită ca părțile interesate să înțeleagă cum și de ce funcționează acestea, astfel încât să poată identifica potențiale probleme de performanță, preocupări legate de siguranță și confidențialitate, prejudecăți, practici de excludere sau rezultate neintenționate. De asemenea, credem că cei care folosesc sistemele AI ar trebui să fie sinceri și deschiși cu privire la momentul, motivul și modul în care aleg să le implementeze. La fel ca și limitările sistemelor pe care le folosesc. De exemplu, dacă o bancă folosește un sistem AI pentru a sprijini deciziile de creditare pentru consumatori, este important să examineze rezultatele și să înțeleagă ce date influențează recomandările sistemului. Guvernele încep să reglementeze AI în diverse industrii, astfel încât specialiștii în date și organizațiile trebuie să explice dacă un sistem AI îndeplinește cerințele de reglementare, mai ales atunci când există un rezultat nedorit. +### Transparență +Sistemele AI trebuie să fie înțelese. O parte crucială a transparenței este explicarea comportamentului sistemelor AI și a componentelor acestora. Îmbunătățirea înțelegerii sistemelor AI necesită ca părțile interesate să înțeleagă cum și de ce funcționează astfel încât să poată identifica eventuale probleme de performanță, preocupări de siguranță și intimitate, prejudecăți, practici excluzive sau rezultate nedorite. Credem, de asemenea, că cei care folosesc sistemele AI trebuie să fie sinceri și deschiși privind când, de ce și cum aleg să le utilizeze. Dar și limitările sistemelor pe care le folosesc. De exemplu, dacă o bancă folosește un sistem AI pentru a susține deciziile de creditare către consumatori, este important să examineze rezultatele și să înțeleagă ce date influențează recomandările sistemului. Guvernele încep să reglementeze AI-ul în diverse industrii, așa că oamenii de știință în date și organizațiile trebuie să explice dacă un sistem AI respectă cerințele reglementărilor, mai ales când există un rezultat nedorit. -> [🎥 Click aici pentru un videoclip: transparența în AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) +> [🎥 Click aici pentru un video: transparență în AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) -- Deoarece sistemele AI sunt atât de complexe, este dificil să înțelegem cum funcționează și să interpretăm rezultatele. +- Pentru că sistemele AI sunt atât de complexe, este greu să înțelegem cum funcționează și să interpretăm rezultatele. - Această lipsă de înțelegere afectează modul în care aceste sisteme sunt gestionate, operaționalizate și documentate. -- Mai important, această lipsă de înțelegere afectează deciziile luate pe baza rezultatelor produse de aceste sisteme. +- Mai important, lipsa de înțelegere afectează deciziile luate folosind rezultatele produse de aceste sisteme. ### Responsabilitate + +Persoanele care proiectează și implementează sistemele AI trebuie să fie responsabile pentru modul în care operază sistemele lor. Nevoia de responsabilitate este deosebit de crucială în cazul tehnologiilor sensibile, cum ar fi recunoașterea facială. Recent, există o cerere crescândă pentru tehnologia de recunoaștere facială, în special din partea organizațiilor de aplicare a legii care văd potențialul acestei tehnologii în utilizări precum găsirea copiilor dispăruți. Totuși, aceste tehnologii ar putea fi folosite de un guvern pentru a pune în pericol libertățile fundamentale ale cetățenilor prin, de exemplu, monitorizarea continuă a persoanelor specifice. Prin urmare, oamenii de știință în date și organizațiile trebuie să fie responsabile pentru modul în care sistemul lor AI influențează indivizii sau societatea. -Persoanele care proiectează și implementează sisteme AI trebuie să fie responsabile pentru modul în care funcționează sistemele lor. Necesitatea responsabilității este deosebit de crucială în cazul tehnologiilor sensibile, cum ar fi recunoașterea facială. Recent, a existat o cerere tot mai mare pentru tehnologia de recunoaștere facială, mai ales din partea organizațiilor de aplicare a legii care văd potențialul tehnologiei în utilizări precum găsirea copiilor dispăruți. Cu toate acestea, aceste tehnologii ar putea fi utilizate de un guvern pentru a pune în pericol libertățile fundamentale ale cetățenilor săi, de exemplu, prin supravegherea continuă a unor indivizi specifici. Prin urmare, specialiștii în date și organizațiile trebuie să fie responsabili pentru modul în care sistemul lor AI afectează indivizii sau societatea. +[![Cercetător principal în AI avertizează despre supravegherea în masă prin recunoaștere facială](../../../../translated_images/ro/accountability.41d8c0f4b85b6231.webp)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Abordarea Microsoft față de AI responsabil") -[![Cercetător de top în AI avertizează asupra supravegherii masive prin recunoaștere facială](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Abordarea Microsoft pentru AI Responsabil") +> 🎥 Click pe imaginea de mai sus pentru un video: Avertismente despre supravegherea în masă prin recunoaștere facială -> 🎥 Click pe imaginea de mai sus pentru un videoclip: Avertismente despre supravegherea masivă prin recunoaștere facială - -În cele din urmă, una dintre cele mai mari întrebări pentru generația noastră, ca prima generație care aduce AI în societate, este cum să ne asigurăm că computerele vor rămâne responsabile față de oameni și cum să ne asigurăm că persoanele care proiectează computere rămân responsabile față de toți ceilalți. +În cele din urmă, una dintre cele mai mari întrebări pentru generația noastră, ca prima generație care aduce AI în societate, este cum să asigurăm că calculatoarele vor rămâne responsabile față de oameni și cum să asigurăm că persoanele care proiectează calculatoarele rămân responsabile față de toți ceilalți. ## Evaluarea impactului -Înainte de a antrena un model de învățare automată, este important să efectuezi o evaluare a impactului pentru a înțelege scopul sistemului AI; utilizarea intenționată; unde va fi implementat; și cine va interacționa cu sistemul. Acestea sunt utile pentru evaluatorii sau testerii care analizează sistemul pentru a ști ce factori să ia în considerare atunci când identifică riscuri potențiale și consecințe așteptate. +Înainte de a antrena un model de învățare automată, este important să se efectueze o evaluare a impactului pentru a înțelege scopul sistemului AI; care este utilizarea intenționată; unde va fi implementat; și cine va interacționa cu sistemul. Acestea sunt utile pentru recenzori sau testeri care evaluează sistemul să știe ce factori să ia în considerare la identificarea riscurilor potențiale și a consecințelor așteptate. + +Următoarele sunt domenii de interes la efectuarea unei evaluări a impactului: -Următoarele sunt domenii de interes atunci când se efectuează o evaluare a impactului: +* **Impact advers asupra indivizilor**. A fi conștient de orice restricții sau cerințe, utilizare nesuportată sau orice limitări cunoscute ce pot afecta performanța sistemului este vital pentru a asigura că sistemul nu este folosit într-un mod care să cauzeze daune indivizilor. +* **Cerințe privind datele**. Înțelegerea modului și locului unde sistemul va folosi datele permite recenzenților să exploreze orice cerințe de date de care trebuie să se țină cont (de ex. regulamente GDPR sau HIPAA). În plus, să examineze dacă sursa sau cantitatea de date este suficientă pentru antrenare. +* **Sumar al impactului**. Strânge o listă de potențiale daune care pot apărea din utilizarea sistemului. Pe tot parcursul ciclului de viață al ML, verifică dacă problemele identificate sunt atenuate sau rezolvate. +* **Obiective aplicabile** pentru fiecare dintre cele șase principii de bază. Evaluează dacă obiectivele fiecăruia dintre principii sunt atinse și dacă există lacune. -* **Impact negativ asupra indivizilor**. Conștientizarea oricăror restricții sau cerințe, utilizări neacceptate sau limitări cunoscute care împiedică performanța sistemului este vitală pentru a ne asigura că sistemul nu este utilizat într-un mod care ar putea dăuna indivizilor. -* **Cerințe de date**. Înțelegerea modului și locului în care sistemul va utiliza datele permite evaluatorilor să exploreze orice cerințe de date de care trebuie să fii conștient (de exemplu, reglementările GDPR sau HIPPA). În plus, examinează dacă sursa sau cantitatea de date este suficientă pentru antrenare. -* **Rezumatul impactului**. Adună o listă de potențiale daune care ar putea apărea din utilizarea sistemului. Pe parcursul ciclului de viață al ML, verifică dacă problemele identificate sunt atenuate sau abordate. -* **Obiective aplicabile** pentru fiecare dintre cele șase principii de bază. Evaluează dacă obiectivele fiecărui principiu sunt îndeplinite și dacă există lacune. -## Debugging cu AI responsabil +## Depanare cu AI responsabil -Similar cu depanarea unei aplicații software, depanarea unui sistem AI este un proces necesar de identificare și rezolvare a problemelor din sistem. Există mulți factori care ar putea afecta un model să nu funcționeze conform așteptărilor sau responsabil. Majoritatea metricilor tradiționale de performanță ale modelului sunt agregate cantitative ale performanței modelului, care nu sunt suficiente pentru a analiza modul în care un model încalcă principiile AI responsabil. Mai mult, un model de învățare automată este o cutie neagră, ceea ce face dificilă înțelegerea a ceea ce determină rezultatul său sau oferirea unei explicații atunci când face o greșeală. Mai târziu în acest curs, vom învăța cum să folosim tabloul de bord AI Responsabil pentru a ajuta la depanarea sistemelor AI. Tabloul de bord oferă un instrument holistic pentru specialiștii în date și dezvoltatorii AI pentru a efectua: +Asemenea depanării unei aplicații software, depanarea unui sistem AI este un proces necesar de identificare și rezolvare a problemelor din sistem. Există mulți factori care pot determina un model să nu performeze conform așteptărilor sau responsabil. Majoritatea metricilor tradiționale de performanță a modelului sunt agregate cantitative ale performanței modelului, care nu sunt suficiente pentru a analiza cum un model încalcă principiile AI responsabile. Mai mult, un model de învățare automată este o cutie neagră care face dificilă înțelegerea ce determină rezultatul său sau oferirea unei explicații când face o greșeală. Mai târziu în acest curs, vom învăța cum să folosim tabloul de bord Responsible AI pentru a ajuta la depanarea sistemelor AI. Tabloul de bord oferă un instrument holistic pentru oamenii de știință în date și dezvoltatorii AI pentru a realiza: * **Analiza erorilor**. Pentru a identifica distribuția erorilor modelului care poate afecta echitatea sau fiabilitatea sistemului. -* **Prezentarea generală a modelului**. Pentru a descoperi unde există disparități în performanța modelului în diferite cohorte de date. -* **Analiza datelor**. Pentru a înțelege distribuția datelor și a identifica orice potențială prejudecată în date care ar putea duce la probleme de echitate, incluziune și fiabilitate. -* **Interpretabilitatea modelului**. Pentru a înțelege ce afectează sau influențează predicțiile modelului. Acest lucru ajută la explicarea comportamentului modelului, ceea ce este important pentru transparență și -Urmărește acest workshop pentru a aprofunda subiectele: +* **Prezentare generală a modelului**. Pentru a descoperi unde există disparități în performanța modelului pe diferite cohorte de date. +* **Analiza datelor**. Pentru a înțelege distribuția datelor și a identifica orice potențial bias în date care ar putea duce la probleme de echitate, incluziune și fiabilitate. +* **Interpretabilitatea modelului**. Pentru a înțelege ce afectează sau influențează predicțiile modelului. Aceasta ajută la explicarea comportamentului modelului, ceea ce este important pentru transparență și responsabilitate. -- În căutarea AI responsabil: Aplicarea principiilor în practică de Besmira Nushi, Mehrnoosh Sameki și Amit Sharma -[![Responsible AI Toolbox: Un cadru open-source pentru construirea AI responsabil](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Un cadru open-source pentru construirea AI responsabil") +## 🚀 Provocare + +Pentru a preveni apariția daunelor, ar trebui să: + +- avem o diversitate de background-uri și perspective în rândul celor care lucrează la sisteme +- investim în seturi de date care reflectă diversitatea societății noastre +- dezvoltăm metode mai bune pe tot parcursul ciclului de viață al învățării automate pentru a detecta și corecta AI responsabil atunci când apare + +Gândește-te la scenarii din viața reală în care lipsa de încredere într-un model este evidentă în construirea și utilizarea modelului. Ce altceva ar trebui să luăm în considerare? + +## [Test după lecție](https://ff-quizzes.netlify.app/en/ml/) + +## Recapitulare & Studiu individual + + +În această lecție, ai învățat câteva noțiuni de bază despre conceptele de echitate și inechitate în învățarea automată. + +Urmărește acest atelier pentru a aprofunda subiectele: + +- În căutarea AI responsabil: Aplicarea principiilor în practică de Besmira Nushi, Mehrnoosh Sameki și 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") -> 🎥 Click pe imaginea de mai sus pentru un videoclip: RAI Toolbox: Un cadru open-source pentru construirea AI responsabil de Besmira Nushi, Mehrnoosh Sameki și Amit Sharma +> 🎥 Apasă pe imaginea de mai sus pentru un videoclip: RAI Toolbox: Un cadru open-source pentru construirea AI responsabil de Besmira Nushi, Mehrnoosh Sameki și Amit Sharma -De asemenea, citește: +De asemenea, citește: - Centrul de resurse RAI al Microsoft: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) - Grupul de cercetare FATE al Microsoft: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) -RAI Toolbox: +RAI Toolbox: -- [Repository-ul GitHub Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox) +- [Depozitul GitHub Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox) -Citește despre instrumentele Azure Machine Learning pentru asigurarea echității: +Citește despre instrumentele Azure Machine Learning pentru a asigura echitatea: - [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) -## Temă +## Tema [Explorează RAI Toolbox](assignment.md) --- -**Declinare de responsabilitate**: -Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri. \ No newline at end of file + +**Declinare a responsabilității**: +Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un om. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care decurg din utilizarea acestei traduceri. + \ No newline at end of file diff --git a/translations/ro/2-Regression/1-Tools/README.md b/translations/ro/2-Regression/1-Tools/README.md index ef5c4156c..764ecd130 100644 --- a/translations/ro/2-Regression/1-Tools/README.md +++ b/translations/ro/2-Regression/1-Tools/README.md @@ -1,114 +1,115 @@ # Începeți cu Python și Scikit-learn pentru modele de regresie -![Rezumat al regresiilor într-un sketchnote](../../../../sketchnotes/ml-regression.png) +![Sumar al regresiilor într-un sketchnote](../../../../translated_images/ro/ml-regression.4e4f70e3b3ed446e.webp) > Sketchnote de [Tomomi Imura](https://www.twitter.com/girlie_mac) -## [Chestionar înainte de lecție](https://ff-quizzes.netlify.app/en/ml/) +## [Chestionar pre-lectură](https://ff-quizzes.netlify.app/en/ml/) -> ### [Această lecție este disponibilă și în R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) +> ### [Această lecție este disponibilă în R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) ## Introducere -În aceste patru lecții, veți descoperi cum să construiți modele de regresie. Vom discuta în curând la ce sunt utile acestea. Dar înainte de a începe, asigurați-vă că aveți instrumentele potrivite pentru a începe procesul! +În aceste patru lecții, veți descoperi cum să construiți modele de regresie. Vom discuta în curând la ce folosesc acestea. Dar înainte să faceți orice, asigurați-vă că aveți instrumentele potrivite pentru a începe procesul! În această lecție, veți învăța cum să: - Configurați computerul pentru sarcini locale de învățare automată. -- Lucrați cu Jupyter notebooks. -- Utilizați Scikit-learn, inclusiv instalarea acestuia. +- Lucrați cu Jupyter Notebooks. +- Folosiți Scikit-learn, inclusiv instalarea. - Explorați regresia liniară printr-un exercițiu practic. -## Instalări și configurări +## Instalări și configurații -[![ML pentru începători - Configurați-vă instrumentele pentru a construi modele de învățare automată](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML pentru începători - Configurați-vă instrumentele pentru a construi modele de învățare automată") +[![ML pentru începători - Configurați-vă instrumentele pregătite pentru a construi modele de învățare automată](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML pentru începători -Configurați-vă instrumentele pregătite pentru a construi modele de învățare automată") > 🎥 Faceți clic pe imaginea de mai sus pentru un scurt videoclip despre configurarea computerului pentru ML. -1. **Instalați Python**. Asigurați-vă că [Python](https://www.python.org/downloads/) este instalat pe computerul dvs. Veți utiliza Python pentru multe sarcini de știința datelor și învățare automată. Majoritatea sistemelor de operare includ deja o instalare Python. Există și [Pachete de codare Python](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) utile, pentru a ușura configurarea pentru unii utilizatori. +1. **Instalați Python**. Asigurați-vă că [Python](https://www.python.org/downloads/) este instalat pe computerul dumneavoastră. Veți folosi Python pentru multe sarcini de știința datelor și învățare automată. Majoritatea sistemelor de operare au deja o instalare Python. Există pachete utile [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) disponibile, pentru a ușura configurarea pentru unii utilizatori. - Totuși, unele utilizări ale Python necesită o anumită versiune a software-ului, în timp ce altele necesită o versiune diferită. Din acest motiv, este util să lucrați într-un [mediu virtual](https://docs.python.org/3/library/venv.html). + Totuși, unele utilizări ale Python cer o anumită versiune a software-ului, iar altele necesită o altă versiune. Din acest motiv, este util să lucrați într-un [mediu virtual](https://docs.python.org/3/library/venv.html). -2. **Instalați Visual Studio Code**. Asigurați-vă că Visual Studio Code este instalat pe computerul dvs. Urmați aceste instrucțiuni pentru a [instala Visual Studio Code](https://code.visualstudio.com/) pentru o instalare de bază. Veți utiliza Python în Visual Studio Code în acest curs, așa că poate doriți să vă familiarizați cu modul de [configurare a Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) pentru dezvoltarea în Python. +2. **Instalați Visual Studio Code**. Asigurați-vă că aveți instalat Visual Studio Code pe computer. Urmați aceste instrucțiuni pentru a [instala Visual Studio Code](https://code.visualstudio.com/) pentru instalarea de bază. Veți folosi Python în Visual Studio Code în acest curs, așa că poate doriți să vă familiarizați cu modul de a [configura Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) pentru dezvoltarea Python. - > Familiarizați-vă cu Python parcurgând această colecție de [module de învățare](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) + > Familiarizați-vă cu Python parcurgând această colecție de [module Learn](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) > - > [![Configurați Python cu Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Configurați Python cu Visual Studio Code") + > [![Configurare Python cu Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Configurare Python cu Visual Studio Code") > - > 🎥 Faceți clic pe imaginea de mai sus pentru un videoclip: utilizarea Python în VS Code. + > 🎥 Faceți clic pe imaginea de mai sus pentru un videoclip: folosirea Python în VS Code. -3. **Instalați Scikit-learn**, urmând [aceste instrucțiuni](https://scikit-learn.org/stable/install.html). Deoarece trebuie să vă asigurați că utilizați Python 3, este recomandat să utilizați un mediu virtual. Notă: dacă instalați această bibliotecă pe un Mac cu M1, există instrucțiuni speciale pe pagina menționată mai sus. +3. **Instalați Scikit-learn**, urmând [aceste instrucțiuni](https://scikit-learn.org/stable/install.html). Deoarece trebuie să vă asigurați că folosiți Python 3, se recomandă să utilizați un mediu virtual. Rețineți că, dacă instalați această bibliotecă pe un Mac M1, există instrucțiuni speciale pe pagina legată mai sus. -4. **Instalați Jupyter Notebook**. Va trebui să [instalați pachetul Jupyter](https://pypi.org/project/jupyter/). +1. **Instalați Jupyter Notebook**. Veți avea nevoie să [instalați pachetul Jupyter](https://pypi.org/project/jupyter/). -## Mediul dvs. de lucru pentru ML +## Mediul dvs. de dezvoltare ML -Veți utiliza **notebooks** pentru a dezvolta codul Python și a crea modele de învățare automată. Acest tip de fișier este un instrument comun pentru oamenii de știință în domeniul datelor și poate fi identificat prin sufixul sau extensia `.ipynb`. +Veți folosi **notebook-uri** pentru a dezvolta codul Python și pentru a crea modele de învățare automată. Acest tip de fișier este un instrument comun pentru oamenii de știință în date și poate fi recunoscut după sufixul sau extensia `.ipynb`. -Notebooks oferă un mediu interactiv care permite dezvoltatorului să scrie cod și să adauge note și documentație în jurul codului, ceea ce este foarte util pentru proiecte experimentale sau orientate spre cercetare. +Notebook-urile sunt un mediu interactiv care permite dezvoltatorului să scrie cod, să adauge note și să documenteze codul, ceea ce este foarte util pentru proiecte experimentale sau orientate spre cercetare. -[![ML pentru începători - Configurați Jupyter Notebooks pentru a începe să construiți modele de regresie](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML pentru începători - Configurați Jupyter Notebooks pentru a începe să construiți modele de regresie") +[![ML pentru începători - Configurați Jupyter Notebooks pentru a începe construirea modelelor de regresie](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML pentru începători - Configurați Jupyter Notebooks pentru a începe construirea modelelor de regresie") > 🎥 Faceți clic pe imaginea de mai sus pentru un scurt videoclip despre acest exercițiu. ### Exercițiu - lucrați cu un notebook -În acest folder, veți găsi fișierul _notebook.ipynb_. +În acest dosar, veți găsi fișierul _notebook.ipynb_. 1. Deschideți _notebook.ipynb_ în Visual Studio Code. - Un server Jupyter va porni cu Python 3+ activat. Veți găsi zone ale notebook-ului care pot fi `rulate`, adică bucăți de cod. Puteți rula un bloc de cod selectând pictograma care arată ca un buton de redare. + Un server Jupyter va porni cu Python 3+ lansat. Veți găsi zone în notebook care pot fi `run`, bucăți de cod. Puteți rula un bloc de cod selectând iconița care arată ca un buton de redare. -2. Selectați pictograma `md` și adăugați puțin markdown, precum și următorul text **# Bine ați venit în notebook-ul dvs.**. +1. Selectați iconița `md` și adăugați puțin markdown, și următorul text **# Bine ați venit în notebook-ul vostru**. - Apoi, adăugați ceva cod Python. + Apoi, adăugați cod Python. -3. Scrieți **print('hello notebook')** în blocul de cod. -4. Selectați săgeata pentru a rula codul. +1. Tastați **print('hello notebook')** în blocul de cod. +1. Selectați săgeata pentru a rula codul. - Ar trebui să vedeți declarația afișată: + Ar trebui să vedeți instrucțiunea afișată: ```output hello notebook ``` -![VS Code cu un notebook deschis](../../../../2-Regression/1-Tools/images/notebook.jpg) +![VS Code cu un notebook deschis](../../../../translated_images/ro/notebook.4a3ee31f396b8832.webp) -Puteți intercala codul cu comentarii pentru a documenta notebook-ul. +Puteți combina codul cu comentarii pentru a auto-documenta notebook-ul. -✅ Gândiți-vă un minut la cât de diferit este mediul de lucru al unui dezvoltator web față de cel al unui om de știință în domeniul datelor. +✅ Gândiți-vă pentru un minut cât de diferit este mediul de lucru al unui dezvoltator web față de cel al unui om de știință în date. -## Începeți cu Scikit-learn +## Pregătire și rulare cu Scikit-learn -Acum că Python este configurat în mediul dvs. local și sunteți confortabil cu Jupyter notebooks, să devenim la fel de confortabili cu Scikit-learn (se pronunță `sci` ca în `science`). Scikit-learn oferă o [API extinsă](https://scikit-learn.org/stable/modules/classes.html#api-ref) pentru a vă ajuta să efectuați sarcini de ML. +Acum că Python este configurat în mediul local și sunteți confortabil cu Jupyter Notebooks, haideți să devenim la fel de confortabili cu Scikit-learn (pronunțați `sci` ca în `science`). Scikit-learn oferă o [API extinsă](https://scikit-learn.org/stable/modules/classes.html#api-ref) pentru a vă ajuta să realizați sarcini de ML. -Conform [site-ului lor](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn este o bibliotecă open source pentru învățare automată care suportă învățarea supravegheată și nesupravegheată. De asemenea, oferă diverse instrumente pentru ajustarea modelelor, preprocesarea datelor, selecția și evaluarea modelelor, precum și multe alte utilități." +Conform [site-ului lor](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn este o bibliotecă open source de învățare automată care suportă învățare supravegheată și nesupravegheată. De asemenea, oferă diverse unelte pentru ajustarea modelelor, preprocesarea datelor, selecția și evaluarea modelelor și multe alte utilități." -În acest curs, veți utiliza Scikit-learn și alte instrumente pentru a construi modele de învățare automată pentru a efectua ceea ce numim sarcini de 'învățare automată tradițională'. Am evitat în mod deliberat rețelele neuronale și învățarea profundă, deoarece acestea sunt mai bine acoperite în viitorul nostru curriculum 'AI pentru Începători'. +În acest curs, veți folosi Scikit-learn și alte instrumente pentru a construi modele de învățare automată care să realizeze ceea ce numim sarcini 'tradiționale de învățare automată'. Am evitat deliberat rețelele neuronale și deep learning, deoarece acestea sunt mai bine acoperite în viitorul nostru curriculum 'AI pentru începători'. -Scikit-learn face ușor să construiți modele și să le evaluați pentru utilizare. Este axat în principal pe utilizarea datelor numerice și conține mai multe seturi de date gata făcute pentru utilizare ca instrumente de învățare. De asemenea, include modele pre-construite pentru studenți. Să explorăm procesul de încărcare a datelor preambalate și utilizarea unui estimator pentru primul model ML cu Scikit-learn, folosind câteva date de bază. +Scikit-learn face simplă construirea și evaluarea modelelor pentru utilizare. Se concentrează în principal pe folosirea datelor numerice și conține mai multe seturi de date gata făcute pentru a fi folosite ca instrumente de învățare. Include, de asemenea, modele predefinite pentru studenți. Să explorăm procesul de încărcare a datelor preambalate și să folosim un estimator încorporat pentru primul model ML cu Scikit-learn și date de bază. -## Exercițiu - primul dvs. notebook Scikit-learn +## Exercițiu - primul vostru notebook Scikit-learn > Acest tutorial a fost inspirat de [exemplul de regresie liniară](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) de pe site-ul Scikit-learn. -[![ML pentru începători - Primul dvs. proiect de regresie liniară în Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML pentru începători - Primul dvs. proiect de regresie liniară în Python") + +[![ML pentru începători - Primul vostru proiect de regresie liniară în Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML pentru începători - Primul vostru proiect de regresie liniară în Python") > 🎥 Faceți clic pe imaginea de mai sus pentru un scurt videoclip despre acest exercițiu. -În fișierul _notebook.ipynb_ asociat acestei lecții, ștergeți toate celulele apăsând pe pictograma 'coș de gunoi'. +În fișierul _notebook.ipynb_ asociat acestei lecții, ștergeți toate celulele apăsând iconița 'coș de gunoi'. -În această secțiune, veți lucra cu un set mic de date despre diabet, care este inclus în Scikit-learn pentru scopuri de învățare. Imaginați-vă că doriți să testați un tratament pentru pacienții diabetici. Modelele de învățare automată ar putea să vă ajute să determinați care pacienți ar răspunde mai bine la tratament, pe baza combinațiilor de variabile. Chiar și un model de regresie foarte simplu, atunci când este vizualizat, ar putea arăta informații despre variabilele care v-ar ajuta să organizați studiile clinice teoretice. +În această secțiune, veți lucra cu un set mic de date despre diabet care este încorporat în Scikit-learn pentru scopuri de învățare. Imaginați-vă că doriți să testați un tratament pentru pacienții cu diabet. Modelele de învățare automată v-ar putea ajuta să determinați care pacienți vor răspunde mai bine la tratament în funcție de combinații de variabile. Chiar și un model foarte simplu de regresie, atunci când este vizualizat, ar putea arăta informații despre variabile care v-ar ajuta să organizați teoretic studiile clinice. -✅ Există multe tipuri de metode de regresie, iar alegerea uneia depinde de răspunsul pe care îl căutați. Dacă doriți să preziceți înălțimea probabilă a unei persoane de o anumită vârstă, ați utiliza regresia liniară, deoarece căutați o **valoare numerică**. Dacă sunteți interesat să descoperiți dacă un tip de bucătărie ar trebui considerat vegan sau nu, căutați o **încadrare în categorie**, așa că ați utiliza regresia logistică. Veți învăța mai multe despre regresia logistică mai târziu. Gândiți-vă puțin la întrebările pe care le puteți pune datelor și care dintre aceste metode ar fi mai potrivită. +✅ Există multe tipuri de metode de regresie, iar alegerea depinde de răspunsul pe care îl căutați. Dacă doriți să preziceți înălțimea probabilă a unei persoane la o anumită vârstă, veți folosi regresia liniară, deoarece căutați o **valoare numerică**. Dacă sunteți interesat să descoperiți dacă un tip de bucătărie este considerat vegan sau nu, căutați o **atributie de categorie**, deci ați folosi regresia logistică. Veți învăța mai târziu despre regresia logistică. Gândiți-vă puțin la întrebările pe care le puteți pune datelor și la care dintre aceste metode ar fi mai potrivită. Să începem această sarcină. ### Importați biblioteci -Pentru această sarcină, vom importa câteva biblioteci: +Pentru această sarcină vom importa câteva biblioteci: -- **matplotlib**. Este un [instrument util pentru graficare](https://matplotlib.org/) și îl vom folosi pentru a crea un grafic liniar. +- **matplotlib**. Este un [instrument de graficare](https://matplotlib.org/) util pe care îl vom folosi pentru a crea un grafic liniar. - **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) este o bibliotecă utilă pentru manipularea datelor numerice în Python. - **sklearn**. Aceasta este biblioteca [Scikit-learn](https://scikit-learn.org/stable/user_guide.html). @@ -122,26 +123,26 @@ Importați câteva biblioteci pentru a vă ajuta cu sarcinile. from sklearn import datasets, linear_model, model_selection ``` - Mai sus importați `matplotlib`, `numpy` și importați `datasets`, `linear_model` și `model_selection` din `sklearn`. `model_selection` este utilizat pentru a împărți datele în seturi de antrenament și testare. + De mai sus importați `matplotlib`, `numpy` și importați `datasets`, `linear_model` și `model_selection` din `sklearn`. `model_selection` este folosit pentru împărțirea datelor în seturi de antrenament și test. ### Setul de date despre diabet -Setul de date [diabet](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) inclus conține 442 de mostre de date despre diabet, cu 10 variabile caracteristice, dintre care unele includ: +Setul de date încorporat [diabet](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) include 442 de mostre de date legate de diabet, cu 10 variabile caracteristice, dintre care unele includ: -- age: vârsta în ani +- vârstă: vârsta în ani - bmi: indicele de masă corporală - bp: tensiunea arterială medie -- s1 tc: T-Cells (un tip de globule albe) +- s1 tc: celule T (un tip de globule albe) -✅ Acest set de date include conceptul de 'sex' ca variabilă caracteristică importantă pentru cercetarea despre diabet. Multe seturi de date medicale includ acest tip de clasificare binară. Gândiți-vă puțin la modul în care astfel de clasificări ar putea exclude anumite părți ale populației de la tratamente. +✅ Acest set de date include conceptul de 'sex' ca o variabilă caracteristică importantă pentru cercetarea diabetului. Multe seturi medicale de date includ acest tip de clasificare binară. Gândiți-vă puțin la cum astfel de categorii ar putea exclude anumite părți ale populației de la tratamente. Acum, încărcați datele X și y. -> 🎓 Amintiți-vă, aceasta este învățare supravegheată, iar noi avem nevoie de o țintă 'y' denumită. +> 🎓 Amintiți-vă, aceasta este învățare supravegheată, și avem nevoie de o țintă denumită 'y'. -Într-o nouă celulă de cod, încărcați setul de date despre diabet apelând `load_diabetes()`. Parametrul `return_X_y=True` semnalează că `X` va fi o matrice de date, iar `y` va fi ținta regresiei. +Într-o celulă nouă de cod, încărcați setul de date pentru diabet apelând `load_diabetes()`. Intrarea `return_X_y=True` semnalează faptul că `X` va fi o matrice de date, iar `y` va fi ținta regresiei. -1. Adăugați câteva comenzi print pentru a afișa forma matricei de date și primul său element: +1. Adăugați câteva comenzi print pentru a arăta forma matricei de date și primul său element: ```python X, y = datasets.load_diabetes(return_X_y=True) @@ -149,9 +150,9 @@ Acum, încărcați datele X și y. print(X[0]) ``` - Ceea ce primiți ca răspuns este un tuplu. Ceea ce faceți este să atribuiți cele două prime valori ale tuplului lui `X` și `y`, respectiv. Aflați mai multe [despre tupluri](https://wikipedia.org/wiki/Tuple). + Ce primiți ca răspuns este un tuplu. Ce faceți este să atribuiți primele două valori ale tuplei la `X` și `y` respectiv. Aflați mai multe [despre tuple](https://wikipedia.org/wiki/Tuple). - Puteți vedea că aceste date au 442 de elemente organizate în matrici de 10 elemente: + Puteți vedea că acest set de date are 442 de itemi formați în array-uri cu câte 10 elemente: ```text (442, 10) @@ -159,39 +160,39 @@ Acum, încărcați datele X și y. -0.04340085 -0.00259226 0.01990842 -0.01764613] ``` - ✅ Gândiți-vă puțin la relația dintre date și ținta regresiei. Regresia liniară prezice relațiile dintre caracteristica X și variabila țintă y. Puteți găsi [ținta](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) pentru setul de date despre diabet în documentație? Ce demonstrează acest set de date, având în vedere ținta? + ✅ Gândiți-vă puțin la relația dintre date și ținta regresiei. Regresia liniară prezice relații între caracteristica X și variabila țintă y. Puteți găsi [ținta](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) pentru setul de date diabet în documentație? Ce demonstrează acest set de date, având ținta? -2. Apoi, selectați o parte din acest set de date pentru a o reprezenta grafic, selectând a treia coloană a setului de date. Puteți face acest lucru utilizând operatorul `:` pentru a selecta toate rândurile, apoi selectând a treia coloană utilizând indexul (2). De asemenea, puteți rearanja datele pentru a fi o matrice 2D - așa cum este necesar pentru reprezentarea grafică - utilizând `reshape(n_rows, n_columns)`. Dacă unul dintre parametri este -1, dimensiunea corespunzătoare este calculată automat. +2. În continuare, selectați o porțiune din acest set de date pentru grafic prin selectarea celei de-a 3-a coloane din setul de date. Puteți face asta folosind operatorul `:` pentru a selecta toate rândurile, apoi selectând a 3-a coloană folosind indexul (2). Puteți, de asemenea, să remodelați datele pentru a fi un array 2D - necesar pentru graficare - folosind `reshape(n_rânduri, n_coloane)`. Dacă unul dintre parametri este -1, dimensiunea respectivă se calculează automat. ```python X = X[:, 2] X = X.reshape((-1,1)) ``` - ✅ În orice moment, afișați datele pentru a verifica forma lor. + ✅ Oricând, afișați datele pentru a verifica forma lor. -3. Acum că aveți datele pregătite pentru a fi reprezentate grafic, puteți vedea dacă o mașină poate determina o separare logică între numerele din acest set de date. Pentru a face acest lucru, trebuie să împărțiți atât datele (X), cât și ținta (y) în seturi de testare și antrenament. Scikit-learn are o metodă simplă pentru aceasta; puteți împărți datele de testare la un anumit punct. +3. Acum că aveți datele pregătite pentru graficare, puteți vedea dacă o mașină poate ajuta să determine o separare logică între numerele din acest set de date. Pentru aceasta trebuie să împărțiți atât datele (X), cât și ținta (y) în seturi de testare și antrenament. Scikit-learn oferă o metodă simplă pentru asta; puteți diviza setul de testare la un punct dat. ```python X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) ``` -4. Acum sunteți gata să antrenați modelul! Încărcați modelul de regresie liniară și antrenați-l cu seturile de antrenament X și y utilizând `model.fit()`: +4. Acum sunteți gata să antrenați modelul! Încărcați modelul de regresie liniară și antrenați-l cu seturile de antrenament X și y folosind `model.fit()`: ```python model = linear_model.LinearRegression() model.fit(X_train, y_train) ``` - ✅ `model.fit()` este o funcție pe care o veți întâlni în multe biblioteci ML, cum ar fi TensorFlow. + ✅ `model.fit()` este o funcție pe care o veți vedea în multe biblioteci ML cum ar fi TensorFlow -5. Apoi, creați o predicție utilizând datele de testare, folosind funcția `predict()`. Aceasta va fi utilizată pentru a trasa linia între grupurile de date. +5. Apoi, creați o predicție folosind datele de testare, utilizând funcția `predict()`. Aceasta va fi folosită pentru a trasa linia între grupurile de date ```python y_pred = model.predict(X_test) ``` -6. Acum este momentul să afișați datele într-un grafic. Matplotlib este un instrument foarte util pentru această sarcină. Creați un grafic scatter cu toate datele de testare X și y și utilizați predicția pentru a trasa o linie în locul cel mai potrivit, între grupările de date ale modelului. +6. Acum este momentul să afișați datele într-un grafic. Matplotlib este un instrument foarte util pentru această sarcină. Creați un grafic de dispersie (scatterplot) al tuturor datelor X și y de testare, și folosiți predicția pentru a desena o linie în locul cel mai potrivit, între grupările de date ale modelului. ```python plt.scatter(X_test, y_test, color='black') @@ -202,28 +203,32 @@ Acum, încărcați datele X și y. plt.show() ``` - ![un grafic scatter care arată puncte de date despre diabet](../../../../2-Regression/1-Tools/images/scatterplot.png) -✅ Gândește-te puțin la ce se întâmplă aici. O linie dreaptă trece prin multe puncte mici de date, dar ce face exact? Poți vedea cum ar trebui să poți folosi această linie pentru a prezice unde ar trebui să se încadreze un punct de date nou, nevăzut, în raport cu axa y a graficului? Încearcă să exprimi în cuvinte utilitatea practică a acestui model. + ![un scatterplot care arată puncte de date în jurul diabetului](../../../../translated_images/ro/scatterplot.ad8b356bcbb33be6.webp) + + + ✅ Gândește-te puțin la ce se întâmplă aici. O linie dreaptă trece prin multe puncte mici de date, dar ce face exact? Poți vedea cum ar trebui să folosești această linie pentru a prezice unde ar trebui să se potrivească un punct de date nou, nevăzut, în raport cu axa y a graficului? Încearcă să pui în cuvinte utilizarea practică a acestui model. -Felicitări, ai construit primul tău model de regresie liniară, ai creat o predicție cu el și ai afișat-o într-un grafic! +Felicitări, ai construit primul tău model de regresie liniară, ai creat o predicție cu acesta și ai afișat-o într-un grafic! --- ## 🚀Provocare -Reprezintă grafic o variabilă diferită din acest set de date. Sugestie: editează această linie: `X = X[:,2]`. Având în vedere ținta acestui set de date, ce poți descoperi despre progresia diabetului ca boală? -## [Test de verificare după lecție](https://ff-quizzes.netlify.app/en/ml/) +Grafică o variabilă diferită din acest set de date. Sfat: editează această linie: `X = X[:,2]`. Având în vedere ținta acestui set de date, ce poți descoperi despre progresia diabetului ca boală? +## [Chestionar post-lectură](https://ff-quizzes.netlify.app/en/ml/) ## Recapitulare & Studiu individual -În acest tutorial, ai lucrat cu regresia liniară simplă, mai degrabă decât cu regresia univariată sau regresia multiplă. Citește puțin despre diferențele dintre aceste metode sau aruncă o privire la [acest videoclip](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef). +În acest tutorial, ai lucrat cu regresia liniară simplă, mai degrabă decât cu regresia liniară univariată sau multiplă. Citește puțin despre diferențele dintre aceste metode sau aruncă o privire la [acest videoclip](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef) -Citește mai multe despre conceptul de regresie și gândește-te la ce tipuri de întrebări pot fi răspunse prin această tehnică. Urmează acest [tutorial](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) pentru a-ți aprofunda înțelegerea. +Citește mai multe despre conceptul de regresie și gândește-te la ce fel de întrebări pot fi rezolvate cu această tehnică. Urmează acest [tutorial](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) pentru a-ți aprofunda înțelegerea. -## Temă +## Tema [Un set de date diferit](assignment.md) --- -**Declinare de responsabilitate**: -Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri. \ No newline at end of file + +**Declinare a responsabilității**: +Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un om. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care decurg din utilizarea acestei traduceri. + \ No newline at end of file diff --git a/translations/ro/2-Regression/2-Data/README.md b/translations/ro/2-Regression/2-Data/README.md index 2cfce794f..5521a9c09 100644 --- a/translations/ro/2-Regression/2-Data/README.md +++ b/translations/ro/2-Regression/2-Data/README.md @@ -1,60 +1,60 @@ -# Construiește un model de regresie folosind Scikit-learn: pregătirea și vizualizarea datelor +# Construiește un model de regresie folosind Scikit-learn: pregătește și vizualizează datele -![Infografic despre vizualizarea datelor](../../../../2-Regression/2-Data/images/data-visualization.png) +![Infografic de vizualizare a datelor](../../../../translated_images/ro/data-visualization.54e56dded7c1a804.webp) -Infografic realizat de [Dasani Madipalli](https://twitter.com/dasani_decoded) +Infografic de [Dasani Madipalli](https://twitter.com/dasani_decoded) -## [Chestionar înainte de lecție](https://ff-quizzes.netlify.app/en/ml/) +## [Chestionar pre-lectură](https://ff-quizzes.netlify.app/en/ml/) -> ### [Această lecție este disponibilă și în R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) +> ### [Această lecție este disponibilă în R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) ## Introducere -Acum că ai configurat instrumentele necesare pentru a începe să construiești modele de învățare automată cu Scikit-learn, ești pregătit să începi să pui întrebări datelor tale. Pe măsură ce lucrezi cu date și aplici soluții de ML, este foarte important să înțelegi cum să pui întrebarea potrivită pentru a valorifica pe deplin potențialul setului tău de date. +Acum că ai configurat uneltele de care ai nevoie pentru a începe construirea unui model de machine learning cu Scikit-learn, ești pregătit să începi să pui întrebări datelor tale. Pe măsură ce lucrezi cu datele și aplici soluții ML, este foarte important să înțelegi cum să pui întrebarea corectă pentru a valorifica pe deplin potențialul setului de date. -În această lecție vei învăța: +În această lecție, vei învăța: -- Cum să pregătești datele pentru construirea modelului. +- Cum să pregătești datele pentru construirea unui model. - Cum să folosești Matplotlib pentru vizualizarea datelor. +- Cum să folosești Seaborn pentru o vizualizare mai expresivă a datelor. -## Punerea întrebării potrivite datelor tale +## Pune întrebarea potrivită datelor tale -Întrebarea la care ai nevoie de răspuns va determina ce tip de algoritmi ML vei utiliza. Iar calitatea răspunsului pe care îl primești va depinde în mare măsură de natura datelor tale. +Întrebarea la care ai nevoie de răspuns va determina ce tip de algoritmi ML vei folosi. Iar calitatea răspunsului pe care îl primești depinde mult de natura datelor tale. -Aruncă o privire la [datele](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) furnizate pentru această lecție. Poți deschide acest fișier .csv în VS Code. O privire rapidă arată imediat că există spații goale și un amestec de date text și numerice. Există, de asemenea, o coloană ciudată numită 'Package', unde datele sunt un amestec între 'sacks', 'bins' și alte valori. Datele, de fapt, sunt destul de dezordonate. +Aruncă o privire la [datele](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) oferite pentru această lecție. Poți deschide acest fișier .csv în VS Code. O scanare rapidă arată imediat că există goluri și o combinație de șiruri și date numerice. Există și o coloană ciudată numită „Package” unde datele sunt un amestec între „sacs”, „bins” și alte valori. Datele, de fapt, sunt puțin dezordonate. [![ML pentru începători - Cum să analizezi și să cureți un set de date](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML pentru începători - Cum să analizezi și să cureți un set de date") -> 🎥 Fă clic pe imaginea de mai sus pentru un scurt videoclip despre pregătirea datelor pentru această lecție. +> 🎥 Dă click pe imaginea de mai sus pentru un videoclip scurt ce parcurge pregătirea datelor pentru această lecție. -De fapt, nu este foarte comun să primești un set de date complet pregătit pentru a crea un model ML direct. În această lecție, vei învăța cum să pregătești un set de date brut folosind biblioteci standard Python. De asemenea, vei învăța diverse tehnici pentru vizualizarea datelor. +De fapt, nu este foarte comun să primești un set de date complet gata pentru a construi un model ML imediat. În această lecție, vei învăța cum să pregătești un set de date brut folosind biblioteci Python standard. De asemenea, vei învăța diverse tehnici pentru a vizualiza datele. ## Studiu de caz: 'piața dovlecilor' -În acest folder vei găsi un fișier .csv în folderul rădăcină `data` numit [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), care include 1757 linii de date despre piața dovlecilor, grupate pe orașe. Acestea sunt date brute extrase din [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) distribuite de Departamentul Agriculturii al Statelor Unite. +În acest folder vei găsi un fișier .csv în folderul rădăcină `data` numit [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) care include 1757 de linii de date despre piața dovlecilor, sortate pe grupe după oraș. Acestea sunt date brute extrase din [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) distribuite de Departamentul de Agricultură al Statelor Unite. ### Pregătirea datelor -Aceste date sunt în domeniul public. Ele pot fi descărcate în mai multe fișiere separate, pe orașe, de pe site-ul USDA. Pentru a evita prea multe fișiere separate, am concatenat toate datele pe orașe într-un singur fișier, astfel încât am _pregătit_ deja puțin datele. Acum, să aruncăm o privire mai atentă asupra datelor. +Aceste date sunt în domeniul public. Pot fi descărcate în mai multe fișiere separate, câte unul pentru fiecare oraș, de pe site-ul USDA. Pentru a evita prea multe fișiere separate, am concatenat toate datele orașelor într-un singur tabel, astfel că am _pregătit_ deja datele puțin. Următorul pas este să analizăm datele mai în detaliu. -### Datele despre dovleci - concluzii inițiale +### Datele despre dovleci - concluzii preliminare -Ce observi despre aceste date? Ai văzut deja că există un amestec de text, numere, spații goale și valori ciudate pe care trebuie să le înțelegi. - -Ce întrebare poți pune acestor date, folosind o tehnică de regresie? Ce zici de "Prezice prețul unui dovleac de vânzare într-o anumită lună"? Privind din nou datele, există câteva modificări pe care trebuie să le faci pentru a crea structura de date necesară pentru această sarcină. +Ce observi despre aceste date? Ai văzut deja că există un amestec de șiruri, numere, goluri și valori ciudate de care trebuie să înțelegi sensul. +Ce întrebare poți pune acestor date, folosind o tehnică de regresie? Poate „Prezice prețul unui dovleac de vânzare într-o anumită lună”. Privind din nou datele, există unele modificări pe care trebuie să le faci pentru a crea structura necesară a datelor pentru acest scop. ## Exercițiu - analizează datele despre dovleci -Să folosim [Pandas](https://pandas.pydata.org/), (numele vine de la `Python Data Analysis`) un instrument foarte util pentru modelarea datelor, pentru a analiza și pregăti aceste date despre dovleci. +Să folosim [Pandas](https://pandas.pydata.org/), (numele vine de la `Python Data Analysis`), un instrument foarte util pentru modelarea datelor, pentru a analiza și a pregăti aceste date despre dovleci. ### Mai întâi, verifică datele lipsă -Mai întâi va trebui să iei măsuri pentru a verifica datele lipsă: +Trebuie să folosești pași pentru a verifica datele lipsă: -1. Convertește datele în format de lună (acestea sunt date din SUA, deci formatul este `MM/DD/YYYY`). +1. Convertește datele în format lună (sunt datele din SUA, deci formatul este `MM/DD/YYYY`). 2. Extrage luna într-o coloană nouă. -Deschide fișierul _notebook.ipynb_ în Visual Studio Code și importă foaia de calcul într-un nou dataframe Pandas. +Deschide fișierul _notebook.ipynb_ în Visual Studio Code și importă tabelul într-un nou dataframe Pandas. 1. Folosește funcția `head()` pentru a vizualiza primele cinci rânduri. @@ -64,28 +64,28 @@ Deschide fișierul _notebook.ipynb_ în Visual Studio Code și importă foaia de pumpkins.head() ``` - ✅ Ce funcție ai folosi pentru a vizualiza ultimele cinci rânduri? + ✅ Ce funcție ai folosi pentru a vedea ultimele cinci rânduri? -1. Verifică dacă există date lipsă în dataframe-ul curent: +1. Verifică dacă sunt date lipsă în cadrul dataframe-ului curent: ```python pumpkins.isnull().sum() ``` - Există date lipsă, dar poate că nu vor conta pentru sarcina de față. + Există date lipsă, dar poate că nu contează pentru sarcina de lucru. -1. Pentru a face dataframe-ul mai ușor de utilizat, selectează doar coloanele de care ai nevoie, folosind funcția `loc`, care extrage din dataframe-ul original un grup de rânduri (transmise ca prim parametru) și coloane (transmise ca al doilea parametru). Expresia `:` în cazul de mai jos înseamnă "toate rândurile". +1. Pentru a face dataframe-ul mai ușor de utilizat, selectează doar coloanele de care ai nevoie, folosind funcția `loc` care extrage din dataframe-ul original un grup de rânduri (trecut ca primul parametru) și coloane (trecute ca al doilea parametru). Expresia `:` în exemplul de mai jos înseamnă „toate rândurile”. ```python columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.loc[:, columns_to_select] ``` -### În al doilea rând, determină prețul mediu al dovlecilor +### Al doilea pas, determină prețul mediu al dovleacului -Gândește-te cum să determini prețul mediu al unui dovleac într-o anumită lună. Ce coloane ai alege pentru această sarcină? Indiciu: vei avea nevoie de 3 coloane. +Gândește-te cum să determini prețul mediu al unui dovleac într-o anumită lună. Ce coloane ai alege pentru această sarcină? Indiciu: ai nevoie de 3 coloane. -Soluție: ia media coloanelor `Low Price` și `High Price` pentru a popula noua coloană Price și convertește coloana Date astfel încât să afișeze doar luna. Din fericire, conform verificării de mai sus, nu există date lipsă pentru date sau prețuri. +Soluție: ia media coloanelor `Low Price` și `High Price` pentru a popula noua coloană Preț, și convertește coloana Date pentru a arăta doar luna. Din fericire, conform verificării de mai sus, nu există date lipsă pentru date sau prețuri. 1. Pentru a calcula media, adaugă următorul cod: @@ -96,7 +96,7 @@ Soluție: ia media coloanelor `Low Price` și `High Price` pentru a popula noua ``` - ✅ Simte-te liber să afișezi orice date dorești să verifici folosind `print(month)`. + ✅ Poți tipări orice date dorești să verifici cu `print(month)`. 2. Acum, copiază datele convertite într-un nou dataframe Pandas: @@ -104,15 +104,15 @@ Soluție: ia media coloanelor `Low Price` și `High Price` pentru a popula noua new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) ``` - Afișarea dataframe-ului va arăta un set de date curat și ordonat pe care poți construi noul model de regresie. + Tipărirea dataframe-ului arată un set de date curat și ordonat pe care poți construi un nou model de regresie. ### Dar stai! E ceva ciudat aici -Dacă te uiți la coloana `Package`, dovlecii sunt vânduți în multe configurații diferite. Unii sunt vânduți în măsuri de '1 1/9 bushel', alții în măsuri de '1/2 bushel', unii per dovleac, alții per kilogram, și unii în cutii mari cu lățimi variabile. +Dacă te uiți în coloana `Package`, dovlecii sunt vânduți în multe configurații diferite. Unii sunt vânduți în măsurători de '1 1/9 bushel', alții în '1/2 bushel', unii pe bucăți, alții pe livre, iar unii în cutii mari cu lățimi variate. -> Dovlecii par foarte greu de cântărit în mod consistent +> Dovlecii par foarte greu de cântărit constant -Analizând datele originale, este interesant că orice are `Unit of Sale` egal cu 'EACH' sau 'PER BIN' are, de asemenea, tipul `Package` per inch, per bin sau 'each'. Dovlecii par foarte greu de cântărit în mod consistent, așa că să-i filtrăm selectând doar dovlecii cu șirul 'bushel' în coloana `Package`. +Uitându-ne la datele originale, e interesant că orice cu `Unit of Sale` egal cu 'EACH' sau 'PER BIN' are și tipul `Package` după inch, bin, sau ‘fiecare’. Dovlecii par foarte greu de cântărit constant, așa că să-i filtrăm selectând doar dovlecii cu șirul 'bushel' în coloana `Package`. 1. Adaugă un filtru în partea de sus a fișierului, sub importul inițial .csv: @@ -120,13 +120,13 @@ Analizând datele originale, este interesant că orice are `Unit of Sale` egal c pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] ``` - Dacă afișezi datele acum, poți vedea că obții doar cele aproximativ 415 rânduri de date care conțin dovleci la bushel. + Dacă tipărești datele acum, vei vedea că primești doar aproximativ 415 rânduri cu dovleci vânduți pe bushel. ### Dar stai! Mai e ceva de făcut -Ai observat că cantitatea de bushel variază pe rând? Trebuie să normalizezi prețurile astfel încât să afișezi prețurile per bushel, așa că fă niște calcule pentru a le standardiza. +Ai observat că cantitatea pe bushel variază pe rând? Trebuie să normalizezi prețul simbolic astfel încât să arăți prețul per bushel, așa că fă niște calcule pentru a standardiza. -1. Adaugă aceste linii după blocul care creează dataframe-ul new_pumpkins: +1. Adaugă aceste linii după blocul care creează noul dataframe new_pumpkins: ```python new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) @@ -134,29 +134,29 @@ Ai observat că cantitatea de bushel variază pe rând? Trebuie să normalizezi new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) ``` -✅ Conform [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), greutatea unui bushel depinde de tipul de produs, deoarece este o măsurare a volumului. "Un bushel de roșii, de exemplu, ar trebui să cântărească 56 de livre... Frunzele și verdețurile ocupă mai mult spațiu cu mai puțină greutate, astfel încât un bushel de spanac cântărește doar 20 de livre." Este destul de complicat! Să nu ne deranjăm cu conversia bushel-livre și să stabilim prețul per bushel. Tot acest studiu despre bushel-uri de dovleci, însă, arată cât de important este să înțelegi natura datelor tale! +✅ Conform [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), greutatea unui bushel depinde de tipul de produs, deoarece este o măsură de volum. "Un bushel de roșii, de exemplu, ar trebui să cântărească 56 de livre... Frunzele și verdețurile ocupă mai mult spațiu cu mai puțină greutate, așa că un bushel de spanac cântărește doar 20 de livre." Totul este destul de complicat! Hai să nu ne complicăm cu o conversie bushel-livre și să păstrăm prețul per bushel. Tot acest studiu despre busheluri de dovleci arată cât de important este să înțelegi natura datelor tale! -Acum, poți analiza prețurile per unitate pe baza măsurării bushel-ului. Dacă afișezi datele încă o dată, poți vedea cum sunt standardizate. +Acum poți analiza prețul per unitate bazat pe măsurătoarea bushel. Dacă tipărești datele încă o dată, vei vedea cum sunt standardizate. -✅ Ai observat că dovlecii vânduți la jumătate de bushel sunt foarte scumpi? Poți să-ți dai seama de ce? Indiciu: dovlecii mici sunt mult mai scumpi decât cei mari, probabil pentru că sunt mult mai mulți per bushel, având în vedere spațiul neutilizat ocupat de un dovleac mare pentru plăcintă. +✅ Ai observat că dovlecii vânduți la jumătate de bushel sunt foarte scumpi? Poți să-ți dai seama de ce? Indiciu: dovlecii mici sunt mult mai scumpi decât cei mari, probabil pentru că sunt mult mai mulți în bushel, date fiind spațiile neutilizate ocupate de un dovleac mare și gol pentru plăcintă. ## Strategii de vizualizare -O parte din rolul unui specialist în date este să demonstreze calitatea și natura datelor cu care lucrează. Pentru a face acest lucru, ei creează adesea vizualizări interesante, cum ar fi diagrame, grafice și tabele, care arată diferite aspecte ale datelor. În acest fel, pot arăta vizual relații și lacune care altfel ar fi greu de descoperit. +O parte din rolul unui data scientist este să demonstreze calitatea și natura datelor cu care lucrează. Pentru aceasta, creează adesea vizualizări interesante, grafice, diagrame care arată diferite aspecte ale datelor. Astfel, pot arăta vizual relații și lacune ce sunt altfel greu de descoperit. [![ML pentru începători - Cum să vizualizezi datele cu Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML pentru începători - Cum să vizualizezi datele cu Matplotlib") -> 🎥 Fă clic pe imaginea de mai sus pentru un scurt videoclip despre vizualizarea datelor pentru această lecție. +> 🎥 Dă click pe imaginea de mai sus pentru un videoclip scurt despre vizualizarea datelor pentru această lecție. -Vizualizările pot ajuta, de asemenea, la determinarea tehnicii de învățare automată cea mai potrivită pentru date. Un scatterplot care pare să urmeze o linie, de exemplu, indică faptul că datele sunt un candidat bun pentru un exercițiu de regresie liniară. +Vizualizările pot, de asemenea, ajuta la determinarea tehnicii de machine learning cea mai potrivită pentru date. Un scatterplot care pare să urmeze o linie, de exemplu, indică faptul că datele sunt un bun candidat pentru un exercițiu de regresie liniară. -O bibliotecă de vizualizare a datelor care funcționează bine în notebook-urile Jupyter este [Matplotlib](https://matplotlib.org/) (pe care ai văzut-o și în lecția anterioară). +O bibliotecă de vizualizare a datelor care funcționează bine în Jupyter notebooks este [Matplotlib](https://matplotlib.org/) (pe care ai văzut-o și în lecția anterioară). -> Obține mai multă experiență cu vizualizarea datelor în [aceste tutoriale](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). +> Obține mai multă experiență în vizualizarea datelor în [aceste tutoriale](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). ## Exercițiu - experimentează cu Matplotlib -Încearcă să creezi câteva diagrame de bază pentru a afișa noul dataframe pe care tocmai l-ai creat. Ce ar arăta o diagramă liniară de bază? +Încearcă să creezi câteva grafice de bază pentru a afișa noul dataframe pe care tocmai l-ai creat. Ce ar arăta un grafic de linie simplu? 1. Importă Matplotlib în partea de sus a fișierului, sub importul Pandas: @@ -164,8 +164,8 @@ O bibliotecă de vizualizare a datelor care funcționează bine în notebook-uri import matplotlib.pyplot as plt ``` -1. Rulează din nou întregul notebook pentru a-l actualiza. -1. În partea de jos a notebook-ului, adaugă o celulă pentru a afișa datele sub formă de boxplot: +1. Rulează întreg notebook-ul din nou pentru a reîmprospăta. +1. La finalul notebook-ului, adaugă o celulă pentru a afișa datele ca un boxplot: ```python price = new_pumpkins.Price @@ -174,44 +174,121 @@ O bibliotecă de vizualizare a datelor care funcționează bine în notebook-uri plt.show() ``` - ![Un scatterplot care arată relația dintre preț și lună](../../../../2-Regression/2-Data/images/scatterplot.png) + ![Un scatterplot care arată relația preț - lună](../../../../translated_images/ro/scatterplot.b6868f44cbd2051c.webp) - Este aceasta o diagramă utilă? Te surprinde ceva la ea? + Este acest grafic util? Te surprinde ceva la el? - Nu este foarte utilă, deoarece tot ce face este să afișeze datele tale ca o răspândire de puncte într-o lună dată. + Nu este foarte util deoarece doar afișează datele tale ca o răspândire de puncte într-o lună dată. -### Fă-o utilă +### Fă-l util -Pentru a obține diagrame care să afișeze date utile, de obicei trebuie să grupezi datele cumva. Să încercăm să creăm o diagramă în care axa y să afișeze lunile, iar datele să demonstreze distribuția datelor. +Pentru a face graficele să afișeze date utile, de obicei trebuie să grupezi datele într-un fel. Hai să încercăm să creăm un grafic în care axa y să arate lunile și datele să demonstreze distribuția datelor. -1. Adaugă o celulă pentru a crea o diagramă de bare grupată: +1. Adaugă o celulă pentru a crea un grafic cu bare grupate: ```python new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') plt.ylabel("Pumpkin Price") ``` - ![O diagramă de bare care arată relația dintre preț și lună](../../../../2-Regression/2-Data/images/barchart.png) + ![Un grafic cu bare care arată relația preț - lună](../../../../translated_images/ro/barchart.a833ea9194346d76.webp) + + Aceasta este o vizualizare a datelor mai utilă! Pare să indice că cel mai mare preț pentru dovleci apare în septembrie și octombrie. Se potrivește cu așteptările tale? De ce sau de ce nu? + +## Exercițiu - experimentează cu Seaborn + +Matplotlib este puternic, dar poate necesita mult cod pentru a produce un grafic finisat. [Seaborn](https://seaborn.pydata.org/) este o bibliotecă construită _peste_ Matplotlib, destinată vizualizării datelor statistice. Lucrează direct cu dataframe-urile Pandas, aplică stiluri implicite atractive și permite crearea de grafice informative cu mult mai puțin cod. Deoarece Seaborn returnează obiecte Matplotlib, poți folosi în continuare tot ce știi despre Matplotlib pentru a ajusta fin rezultatul. + +> Dacă nu ai instalat deja Seaborn, instalează-l cu `pip install seaborn`. + +1. Importă Seaborn în partea de sus a notebook-ului, sub celelalte importuri. Este convențional importat ca `sns`: + + ```python + import seaborn as sns + ``` + +### Diagramă scatter pentru a arăta relații + +O parte importantă a explorării datelor înainte de a construi un model este căutarea _relațiilor_ între variabile. Un [scatter plot](https://en.wikipedia.org/wiki/Scatter_plot) este unul dintre cele mai bune instrumente pentru acest scop: dacă punctele par să urmeze o linie, cele două variabile pot fi corelate, ceea ce este un semn bun că un model de regresie liniară ar funcționa. + +1. Recreează scatterplot-ul preț-lună de mai înainte, de data aceasta folosind [`relplot()`](https://seaborn.pydata.org/generated/seaborn.relplot.html) (plot relațional) al Seaborn, care lucrează direct cu coloanele dataframe-ului tău: + + ```python + sns.relplot(x="Price", y="Month", data=new_pumpkins) + ``` + + ![Un scatterplot Seaborn arătând relația preț - lună](../../../../translated_images/ro/relplot.a03837d8f0329cec.webp) + + Observă cum treci _numele coloanelor_ și dataframe-ul, iar Seaborn se ocupă de etichetele axelor pentru tine. + +2. Poți schimba în grafic de linie trecând `kind="line"`. Seaborn trasează chiar o bandă umbrită care arată intervalul de încredere în jurul liniei: + + ```python + sns.relplot(x="Price", y="Month", kind="line", data=new_pumpkins) + ``` + + ![Un grafic de linie Seaborn arătând relația preț - lună](../../../../translated_images/ro/lineplot.f9034ba47b1e30ee.webp) + + Aceste date sunt destul de zgomotoase, așa că un grafic de linie nu este cea mai clară alegere aici — dar arată cât de ușor poți schimba tipul de grafic în Seaborn. + +### Grafice cu bare pentru a arăta distribuții + + +Mai devreme ai grupat datele manual pentru a crea un grafic cu bare cu Matplotlib. Seaborn's [`catplot()`](https://seaborn.pydata.org/generated/seaborn.catplot.html) (grafic categoric) poate face gruparea și agregarea pentru tine. Implicit, `kind="bar"` afișează media fiecărei categorii împreună cu o linie neagră care indică intervalul de încredere. + +1. Creează un grafic cu bare al prețului mediu pe lună: + + ```python + sns.catplot(x="Month", y="Price", data=new_pumpkins, kind="bar") + ``` + + ![A Seaborn bar chart showing the price distribution per month](../../../../translated_images/ro/catplot.e73fc35fdf96242b.webp) + + Aceasta confirmă ceea ce ai văzut cu Matplotlib — prețurile ating un maxim în jurul lunilor septembrie și octombrie — dar Seaborn vizualizează și cât de mult _variază_ prețul în fiecare lună. + +### Heatmaps pentru a arăta corelații + +Graficele scatter compară două variabile odată. Când ai mai multe coloane numerice, un [heatmap](https://en.wikipedia.org/wiki/Heat_map) îți permite să vezi puterea relației dintre _fiecare_ pereche de coloane simultan. Aceasta este o metodă obișnuită pentru a identifica ce caracteristici sunt cele mai corelate înainte de a alege ce să introduci într-un model (și același tip de grafic este folosit ulterior pentru a afișa matricile de confuzie în clasificare). + +1. Construiește o matrice de corelație cu Pandas, apoi deseneaz-o cu [`heatmap()`](https://seaborn.pydata.org/generated/seaborn.heatmap.html) din Seaborn. Opțiunea `annot=True` afișează valorile corelației în fiecare celulă: + + ```python + correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr() + sns.heatmap(correlations, annot=True, cmap="coolwarm") + ``` + + ![A Seaborn heatmap showing correlations between the numeric columns](../../../../translated_images/ro/heatmap.bd98dce43b404c57.webp) + + Valorile apropiate de `1` (sau `-1`) înseamnă că coloanele sunt puternic corelate _liniar_. Observă cum `Low Price` și `High Price` sunt aproape perfect corelate. `Month`, pe de altă parte, arată doar o corelație liniară slabă cu prețul — chiar dacă graficul cu bare de mai sus a arătat un vârf sezonier clar în septembrie și octombrie. Aceasta este o lecție importantă: coeficientul de corelație măsoară doar relațiile _liniare_, așa că poate să nu surprindă modelele sezoniere sau alte tipuri de relații neliniare. ✅ De ce este util să te uiți atât la un heatmap *cât și* la grafice precum cel cu bare înainte de a decide ce coloane să folosești? + +### Matplotlib sau Seaborn? + +Ambele biblioteci merită să fie cunoscute: + +- **Matplotlib** îți oferă control detaliat asupra fiecărui element al unui grafic și este baza pe care se construiește aproape orice altă bibliotecă de plotare Python. +- **Seaborn** oferă funcții la nivel înalt și setări implicite atractive pentru grafice statistice, lucrează direct cu dataframes și este adesea mai rapid pentru analiza exploratorie a datelor. - Aceasta este o vizualizare a datelor mai utilă! Pare să indice că cel mai mare preț pentru dovleci apare în septembrie și octombrie. Se potrivește aceasta cu așteptările tale? De ce sau de ce nu? +Un flux de lucru comun este să folosești Seaborn pentru a explora rapid datele, apoi să treci la Matplotlib când ai nevoie să personalizezi detaliile. --- ## 🚀Provocare -Explorează diferitele tipuri de vizualizări pe care le oferă Matplotlib. Care tipuri sunt cele mai potrivite pentru problemele de regresie? +Explorează diferitele tipuri de vizualizări pe care le oferă Matplotlib și Seaborn. Care tipuri sunt cele mai potrivite pentru probleme de regresie? -## [Chestionar după lecție](https://ff-quizzes.netlify.app/en/ml/) +## [Chestionar post-lectură](https://ff-quizzes.netlify.app/en/ml/) -## Recapitulare și studiu individual +## Recenzie & Auto-studiu -Aruncă o privire la numeroasele moduri de a vizualiza datele. Fă o listă cu diversele biblioteci disponibile și notează care sunt cele mai bune pentru anumite tipuri de sarcini, de exemplu vizualizări 2D vs. vizualizări 3D. Ce descoperi? +Aruncă o privire asupra multiplelor moduri de a vizualiza date. Fă o listă cu diferitele biblioteci disponibile și notează care sunt cele mai bune pentru anumite tipuri de taskuri, de exemplu vizualizări 2D vs. vizualizări 3D. Ce descoperi? ## Temă -[Explorarea vizualizării](assignment.md) +[Explorarea vizualizărilor](assignment.md) --- -**Declinare de responsabilitate**: -Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri. \ No newline at end of file + +**Declinare a responsabilității**: +Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un om. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care decurg din utilizarea acestei traduceri. + \ No newline at end of file diff --git a/translations/ro/2-Regression/2-Data/solution/notebook.ipynb b/translations/ro/2-Regression/2-Data/solution/notebook.ipynb index 2369096c7..eee76b383 100644 --- a/translations/ro/2-Regression/2-Data/solution/notebook.ipynb +++ b/translations/ro/2-Regression/2-Data/solution/notebook.ipynb @@ -3,7 +3,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "## Regresia liniară pentru dovleci - Lecția 2\n" + ] }, { "cell_type": "code", @@ -220,6 +222,7 @@ "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", "pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n", "\n", "pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n", @@ -383,18 +386,78 @@ "plt.ylabel(\"Pumpkin Price\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vizualizare cu Seaborn\n", + "\n", + "[Seaborn](https://seaborn.pydata.org/) este construit peste Matplotlib și funcționează direct cu dataframes, făcând rapidă crearea unor diagrame statistice atractive cu foarte puțin cod.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Diagrame de dispersie pentru a arăta relațiile\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sns.relplot(x=\"Price\", y=\"Month\", data=new_pumpkins)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sns.relplot(x=\"Price\", y=\"Month\", kind=\"line\", data=new_pumpkins)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Diagrame cu bare pentru a arăta distribuții\n" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "sns.catplot(x=\"Month\", y=\"Price\", data=new_pumpkins, kind=\"bar\")" + ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Declinare de responsabilitate**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa maternă ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\n" + "### Hărți termice pentru a arăta corelații\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr()\n", + "sns.heatmap(correlations, annot=True, cmap=\"coolwarm\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Declinare a responsabilității**:\nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un om. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care decurg din utilizarea acestei traduceri.\n\n" ] } ], @@ -424,13 +487,7 @@ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" } }, - "orig_nbformat": 2, - "coopTranslator": { - "original_hash": "95726f0b8283628d5356a4f8eb8b4b76", - "translation_date": "2025-09-06T11:53:24+00:00", - "source_file": "2-Regression/2-Data/solution/notebook.ipynb", - "language_code": "ro" - } + "orig_nbformat": 2 }, "nbformat": 4, "nbformat_minor": 2 diff --git a/translations/ro/8-Reinforcement/1-QLearning/README.md b/translations/ro/8-Reinforcement/1-QLearning/README.md index a4762ee88..bd1ea76c4 100644 --- a/translations/ro/8-Reinforcement/1-QLearning/README.md +++ b/translations/ro/8-Reinforcement/1-QLearning/README.md @@ -1,47 +1,47 @@ -# Introducere în Învățarea prin Recompensă și Q-Learning +# Introducere în Învățarea prin Recompensare și Q-Learning -![Rezumat al învățării prin recompensă în machine learning într-un sketchnote](../../../../sketchnotes/ml-reinforcement.png) -> Sketchnote de [Tomomi Imura](https://www.twitter.com/girlie_mac) +![Sumar al învățării prin recompensare în învățarea automată într-o schiță](../../../../translated_images/ro/ml-reinforcement.94024374d63348db.webp) +> Schiță realizată de [Tomomi Imura](https://www.twitter.com/girlie_mac) -Învățarea prin recompensă implică trei concepte importante: agentul, câteva stări și un set de acțiuni pentru fiecare stare. Prin executarea unei acțiuni într-o stare specificată, agentul primește o recompensă. Imaginează din nou jocul pe calculator Super Mario. Tu ești Mario, te afli într-un nivel de joc, stând lângă marginea unei prăpăstii. Deasupra ta este o monedă. Tu, fiind Mario, într-un nivel de joc, într-o poziție specifică... aceasta este starea ta. Dacă faci un pas spre dreapta (o acțiune), vei cădea în prăpastie, ceea ce îți va aduce un scor numeric scăzut. Totuși, dacă apeși butonul de săritură, vei obține un punct și vei rămâne în viață. Acesta este un rezultat pozitiv și ar trebui să îți aducă un scor numeric pozitiv. +Învățarea prin recompensare implică trei concepte importante: agentul, unele stări și un set de acțiuni pentru fiecare stare. Prin executarea unei acțiuni într-o stare specificată, agentul primește o recompensă. Imaginați din nou jocul video Super Mario. Tu ești Mario, ești într-un nivel al jocului, stând lângă marginea unei prăpastii. Deasupra ta este o monedă. Tu, fiind Mario, într-un nivel al jocului, într-o poziție specifică ... aceasta este starea ta. Să faci un pas spre dreapta (o acțiune) te va duce peste margine, ceea ce ți-ar da un scor numeric scăzut. Totuși, apăsând butonul de săritură ai putea să înscrii un punct și ai rămâne în viață. Acesta este un rezultat pozitiv și ar trebui să primești un scor numeric pozitiv. -Folosind învățarea prin recompensă și un simulator (jocul), poți învăța cum să joci pentru a maximiza recompensa, adică să rămâi în viață și să obții cât mai multe puncte. +Folosind învățarea prin recompensă și un simulator (jocul), poți învăța cum să joci jocul pentru a maximiza recompensa, care este să rămâi în viață și să înscrii cât mai multe puncte posibil. -[![Introducere în Învățarea prin Recompensă](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) +[![Introducere în Învățarea prin Recompensare](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) -> 🎥 Click pe imaginea de mai sus pentru a-l asculta pe Dmitry discutând despre Învățarea prin Recompensă +> 🎥 Click pe imaginea de mai sus pentru a-l auzi pe Dmitry discutând despre Învățarea prin Recompensare -## [Chestionar înainte de lecție](https://ff-quizzes.netlify.app/en/ml/) +## [Quiz înainte de lecție](https://ff-quizzes.netlify.app/en/ml/) -## Cerințe preliminare și configurare +## Cerințe și configurare -În această lecție, vom experimenta cu ceva cod în Python. Ar trebui să poți rula codul din Jupyter Notebook din această lecție, fie pe computerul tău, fie undeva în cloud. +În această lecție, vom experimenta cu un cod în Python. Ar trebui să fii capabil să rulezi codul din Jupyter Notebook al acestei lecții, fie pe calculatorul tău, fie undeva în cloud. Poți deschide [notebook-ul lecției](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) și să parcurgi lecția pentru a construi. -> **Notă:** Dacă deschizi acest cod din cloud, trebuie să obții și fișierul [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), care este utilizat în codul notebook-ului. Adaugă-l în același director ca notebook-ul. +> **Notă:** Dacă deschizi acest cod din cloud, trebuie să preiei și fișierul [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), care este folosit în codul notebook-ului. Adaugă-l în același director cu notebook-ul. ## Introducere -În această lecție, vom explora lumea **[Petru și Lupul](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, inspirată de un basm muzical al compozitorului rus [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Vom folosi **Învățarea prin Recompensă** pentru a-l lăsa pe Petru să-și exploreze mediul, să colecteze mere gustoase și să evite întâlnirea cu lupul. +În această lecție, vom explora lumea lui **[Petrica și Lupul](https://ro.wikipedia.org/wiki/Petrica_și_lupul)**, inspirată de o poveste muzicală de un compozitor rus, [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Vom folosi **Învățarea prin Recompensare** pentru a-l lăsa pe Petrica să exploreze mediul său, să adune mere gustoase și să evite să-l întâlnească pe lup. -**Învățarea prin Recompensă** (RL) este o tehnică de învățare care ne permite să învățăm un comportament optim al unui **agent** într-un **mediu** prin efectuarea multor experimente. Un agent în acest mediu ar trebui să aibă un **scop**, definit de o **funcție de recompensă**. +**Învățarea prin Recompensare** (RL) este o tehnică de învățare care ne permite să învățăm un comportament optim al unui **agent** într-un anumit **mediu** prin efectuarea multor experimente. Un agent în acest mediu ar trebui să aibă un **scop**, definit printr-o **funcție de recompensă**. ## Mediul -Pentru simplitate, să considerăm lumea lui Petru ca o tablă pătrată de dimensiune `width` x `height`, ca aceasta: +Pentru simplitate, să considerăm lumea lui Petrica ca fiind o tablă pătrată de dimensiunea `width` x `height`, astfel: -![Mediul lui Petru](../../../../8-Reinforcement/1-QLearning/images/environment.png) +![Mediul lui Petrica](../../../../translated_images/ro/environment.40ba3cb66256c93f.webp) Fiecare celulă din această tablă poate fi: -* **teren**, pe care Petru și alte creaturi pot merge. +* **teren**, pe care Petrica și alte creaturi pot umbla. * **apă**, pe care evident nu poți merge. -* un **copac** sau **iarbă**, un loc unde te poți odihni. -* un **măr**, care reprezintă ceva ce Petru ar fi bucuros să găsească pentru a se hrăni. -* un **lup**, care este periculos și ar trebui evitat. +* un **copac** sau **iarbă**, un loc unde poți să te odihnești. +* un **măr**, care reprezintă ceva ce Petrica ar fi fericit să găsească pentru a se hrăni. +* un **lup**, care este periculos și trebuie evitat. -Există un modul Python separat, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), care conține codul pentru a lucra cu acest mediu. Deoarece acest cod nu este important pentru înțelegerea conceptelor noastre, vom importa modulul și îl vom folosi pentru a crea tabla exemplu (bloc de cod 1): +Există un modul Python separat, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), care conține codul pentru a lucra cu acest mediu. Deoarece acest cod nu este important pentru înțelegerea conceptelor noastre, vom importa modulul și îl vom folosi pentru a crea tabla de probă (blocul de cod 1): ```python from rlboard import * @@ -52,63 +52,63 @@ m.randomize(seed=13) m.plot() ``` -Acest cod ar trebui să imprime o imagine a mediului similară cu cea de mai sus. +Acest cod ar trebui să afișeze o imagine a mediului asemănătoare cu cea de mai sus. ## Acțiuni și politică -În exemplul nostru, scopul lui Petru ar fi să găsească un măr, evitând lupul și alte obstacole. Pentru a face acest lucru, el poate, în esență, să se plimbe până găsește un măr. +În exemplul nostru, scopul lui Petrica ar fi să găsească un măr, evitând lupul și alte obstacole. Pentru aceasta, el poate pur și simplu să umble până găsește un măr. -Astfel, în orice poziție, el poate alege între una dintre următoarele acțiuni: sus, jos, stânga și dreapta. +Astfel, la orice poziție, el poate alege una dintre următoarele acțiuni: sus, jos, stânga și dreapta. -Vom defini aceste acțiuni ca un dicționar și le vom mapa la perechi de modificări corespunzătoare ale coordonatelor. De exemplu, deplasarea spre dreapta (`R`) ar corespunde perechii `(1,0)`. (bloc de cod 2): +Vom defini aceste acțiuni ca un dicționar și le vom asocia cu perechi de modificări corespunzătoare ale coordonatelor. De exemplu, mutarea spre dreapta (`R`) ar corespunde perechii `(1,0)`. (blocul de cod 2): ```python actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) } action_idx = { a : i for i,a in enumerate(actions.keys()) } ``` -Pentru a rezuma, strategia și scopul acestui scenariu sunt următoarele: +Pe scurt, strategia și scopul acestui scenariu sunt următoarele: -- **Strategia** agentului nostru (Petru) este definită de o așa-numită **politică**. O politică este o funcție care returnează acțiunea într-o stare dată. În cazul nostru, starea problemei este reprezentată de tablă, inclusiv poziția curentă a jucătorului. +- **Strategia**, a agentului nostru (Petrica) este definită de o așa-numită **politică**. O politică este o funcție care întoarce acțiunea pentru orice stare dată. În cazul nostru, starea problemei este reprezentată de tablă, inclusiv poziția curentă a jucătorului. -- **Scopul** învățării prin recompensă este să învățăm în cele din urmă o politică bună care ne va permite să rezolvăm problema eficient. Totuși, ca bază, să considerăm cea mai simplă politică numită **plimbare aleatorie**. +- **Scopul**, învățării prin recompensare este să învățăm eventual o politică bună care să ne permită să rezolvăm problema eficient. Totuși, ca punct de reper, să considerăm cea mai simplă politică numită **mers aleatoriu**. -## Plimbare aleatorie +## Mers aleatoriu -Să rezolvăm mai întâi problema noastră implementând o strategie de plimbare aleatorie. Cu plimbarea aleatorie, vom alege aleator următoarea acțiune din acțiunile permise, până ajungem la măr (bloc de cod 3). +Hai să rezolvăm mai întâi problema implementând o strategie de mers aleatoriu. Cu mers aleatoriu, vom alege aleator următoarea acțiune din acțiunile permise, până când ajungem la măr (blocul de cod 3). -1. Implementează plimbarea aleatorie cu codul de mai jos: +1. Implementează mersul aleator cu codul de mai jos: ```python def random_policy(m): return random.choice(list(actions)) def walk(m,policy,start_position=None): - n = 0 # number of steps - # set initial position + n = 0 # număr de pași + # setează poziția inițială if start_position: m.human = start_position else: m.random_start() while True: if m.at() == Board.Cell.apple: - return n # success! + return n # succes! if m.at() in [Board.Cell.wolf, Board.Cell.water]: - return -1 # eaten by wolf or drowned + return -1 # mâncat de lup sau înecat while True: a = actions[policy(m)] new_pos = m.move_pos(m.human,a) if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water: - m.move(a) # do the actual move + m.move(a) # execută mutarea propriu-zisă break n+=1 walk(m,random_policy) ``` - Apelul la `walk` ar trebui să returneze lungimea traseului corespunzător, care poate varia de la o rulare la alta. + Apelul către `walk` ar trebui să întoarcă lungimea traseului corespunzător, care poate varia de la o execuție la alta. -1. Rulează experimentul de plimbare de mai multe ori (să zicem, 100) și imprimă statisticile rezultate (bloc de cod 4): +1. Rulează experimentul de mers de mai multe ori (să zicem 100) și afișează statisticile rezultate (blocul de cod 4): ```python def print_statistics(policy): @@ -125,17 +125,17 @@ Să rezolvăm mai întâi problema noastră implementând o strategie de plimbar print_statistics(random_policy) ``` - Observă că lungimea medie a unui traseu este în jur de 30-40 de pași, ceea ce este destul de mult, având în vedere că distanța medie până la cel mai apropiat măr este în jur de 5-6 pași. + Observă că lungimea medie a unui traseu este în jur de 30-40 de pași, ceea ce este destul de mult, dat fiind faptul că distanța medie până la cel mai apropiat măr este în jur de 5-6 pași. - Poți vedea și cum arată mișcarea lui Petru în timpul plimbării aleatorii: + Poți vedea și cum arată mișcarea lui Petrica în timpul mersului aleator: - ![Plimbarea aleatorie a lui Petru](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) + ![Mersul Aleatoriu al lui Petrica](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) ## Funcția de recompensă -Pentru a face politica noastră mai inteligentă, trebuie să înțelegem care mișcări sunt "mai bune" decât altele. Pentru a face acest lucru, trebuie să definim scopul nostru. +Pentru a face politica noastră mai inteligentă, trebuie să înțelegem care mișcări sunt „mai bune” decât altele. Pentru acest lucru, trebuie să definim scopul nostru. -Scopul poate fi definit în termeni de o **funcție de recompensă**, care va returna o valoare de scor pentru fiecare stare. Cu cât numărul este mai mare, cu atât funcția de recompensă este mai bună. (bloc de cod 5) +Scopul poate fi definit în termeni de **funcție de recompensă**, care va întoarce o valoare de scor pentru fiecare stare. Cu cât numărul este mai mare, cu atât funcția de recompensă este mai bună. (blocul de cod 5) ```python move_reward = -0.1 @@ -154,39 +154,115 @@ def reward(m,pos=None): return move_reward ``` -Un lucru interesant despre funcțiile de recompensă este că, în cele mai multe cazuri, *primim o recompensă substanțială doar la sfârșitul jocului*. Aceasta înseamnă că algoritmul nostru ar trebui cumva să-și amintească "pașii buni" care duc la o recompensă pozitivă la final și să le crească importanța. În mod similar, toate mișcările care duc la rezultate proaste ar trebui descurajate. +Un lucru interesant despre funcțiile de recompensă este că, în cele mai multe cazuri, *ni se oferă o recompensă substanțială doar la sfârșitul jocului*. Aceasta înseamnă că algoritmul nostru ar trebui cumva să-și amintească pașii "buni" care duc la o recompensă pozitivă la final și să le dea o importanță mai mare. Similar, toate mișcările care duc la rezultate slabe ar trebui descurajate. ## Q-Learning -Un algoritm pe care îl vom discuta aici se numește **Q-Learning**. În acest algoritm, politica este definită de o funcție (sau o structură de date) numită **Q-Table**. Aceasta înregistrează "calitatea" fiecărei acțiuni într-o stare dată. +Un algoritm pe care îl vom discuta aici se numește **Q-Learning**. În acest algoritm, politica este definită printr-o funcție (sau o structură de date) numită **Q-Table**. Aceasta înregistrează „calitatea” fiecărei acțiuni într-o stare dată. -Se numește Q-Table deoarece este adesea convenabil să o reprezentăm ca o tabelă sau un array multidimensional. Deoarece tabla noastră are dimensiuni `width` x `height`, putem reprezenta Q-Table folosind un array numpy cu forma `width` x `height` x `len(actions)`: (bloc de cod 6) +Se numește Q-Table deoarece este adesea convenabil să o reprezentăm ca pe un tabel sau un array multidimensional. Deoarece tabla noastră are dimensiunile `width` x `height`, putem reprezenta Q-Table folosind un array numpy cu forma `width` x `height` x `len(actions)`: (blocul de cod 6) ```python Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) ``` -Observă că inițializăm toate valorile din Q-Table cu o valoare egală, în cazul nostru - 0.25. Aceasta corespunde politicii de "plimbare aleatorie", deoarece toate mișcările din fiecare stare sunt la fel de bune. Putem transmite Q-Table funcției `plot` pentru a vizualiza tabela pe tablă: `m.plot(Q)`. +Observă că inițializăm toate valorile din Q-Table cu o valoare egală, în cazul nostru - 0.25. Aceasta corespunde politicii „mersului aleatoriu”, deoarece toate mișcările într-o stare sunt la fel de bune. Putem transmite Q-Table funcției `plot` pentru a vizualiza tabela pe tablă: `m.plot(Q)`. -![Mediul lui Petru](../../../../8-Reinforcement/1-QLearning/images/env_init.png) +![Mediul lui Petrica](../../../../translated_images/ro/env_init.04e8f26d2d60089e.webp) -În centrul fiecărei celule există o "săgeată" care indică direcția preferată de mișcare. Deoarece toate direcțiile sunt egale, se afișează un punct. +În centrul fiecărei celule există o „săgeată” care indică direcția preferată de mișcare. Deoarece toate direcțiile sunt egale, este afișat un punct. -Acum trebuie să rulăm simularea, să explorăm mediul nostru și să învățăm o distribuție mai bună a valorilor din Q-Table, care ne va permite să găsim drumul către măr mult mai rapid. +Acum trebuie să rulăm simularea, să explorăm mediul nostru și să învățăm o distribuție mai bună a valorilor din Q-Table, care ne va permite să găsim drumul către măr mult mai repede. ## Esența Q-Learning: Ecuația Bellman -Odată ce începem să ne mișcăm, fiecare acțiune va avea o recompensă corespunzătoare, adică teoretic putem selecta următoarea acțiune pe baza celei mai mari recompense imediate. Totuși, în cele mai multe stări, mișcarea nu va atinge scopul nostru de a ajunge la măr și, astfel, nu putem decide imediat care direcție este mai bună. +Odată ce începem să ne mișcăm, fiecare acțiune va avea o recompensă corespunzătoare, adică teoretic putem selecta următoarea acțiune bazându-ne pe recompensa imediată cea mai mare. Totuși, în majoritatea stărilor, mișcarea nu va atinge scopul nostru de a ajunge la măr, astfel încât nu putem decide imediat care direcție este mai bună. > Amintește-ți că nu rezultatul imediat contează, ci mai degrabă rezultatul final, pe care îl vom obține la sfârșitul simulării. -Pentru a ține cont de această recompensă întârziată, trebuie să folosim principiile **[programării dinamice](https://en.wikipedia.org/wiki/Dynamic_programming)**, care ne permit să gândim problema noastră recursiv. +Pentru a lua în considerare această recompensă întârziată, trebuie să folosim principiile **[programării dinamice](https://en.wikipedia.org/wiki/Dynamic_programming)**, care ne permit să privim problema noastră recursiv. -Să presupunem că acum ne aflăm în starea *s* și vrem să ne mutăm în următoarea stare *s'*. Prin aceasta, vom primi recompensa imediată *r(s,a)*, definită de funcția de recompensă, plus o recompensă viitoare. Dacă presupunem că Q-Table reflectă corect "atractivitatea" fiecărei acțiuni, atunci în starea *s'* vom alege o acțiune *a'* care corespunde valorii maxime a *Q(s',a')*. Astfel, cea mai bună recompensă viitoare posibilă pe care am putea să o obținem în starea *s* va fi definită ca `max` +Să presupunem că acum ne aflăm în starea *s* și vrem să trecem în următoarea stare *s'*. Făcând acest lucru, vom primi recompensa imediată *r(s,a)*, definită de funcția de recompensă, plus o recompensă viitoare. Dacă presupunem că Q-Table reflectă corect „atractivitatea” fiecărei acțiuni, atunci în starea *s'* vom alege o acțiune *a* care corespunde valorii maxime *Q(s',a')*. Astfel, cea mai bună recompensă viitoare posibilă pe care am putea-o obține în starea *s* va fi definită ca `max`a'*Q(s',a')* (maximul aici este calculat peste toate acțiunile posibile *a'* din starea *s'*). + +Aceasta dă **formula Bellman** pentru calculul valorii Q-Table în starea *s*, dată acțiunea *a*: + + + +Aici γ este așa-numitul **factor de discount** care determină în ce măsură trebuie să preferi recompensa curentă față de recompensa viitoare și viceversa. + +## Algoritmul de învățare + +Având ecuația de mai sus, acum putem scrie pseudo-codul pentru algoritmul nostru de învățare: + +* Inițializează Q-Table Q cu numere egale pentru toate stările și acțiunile +* Setează rata de învățare α ← 1 +* Repetă simularea de multe ori + 1. Pornește de la o poziție aleatorie + 1. Repetă + 1. Alege o acțiune *a* în starea *s* + 2. Execută acțiunea mutându-te într-o nouă stare *s'* + 3. Dacă întâlnim condiția de sfârșit de joc, sau recompensa totală este prea mică - încheie simularea + 4. Calculează recompensa *r* în noua stare + 5. Actualizează funcția Q conform ecuației Bellman: *Q(s,a)* ← *(1-α)Q(s,a)+α(r+γ maxa'Q(s',a'))* + 6. *s* ← *s'* + 7. Actualizează recompensa totală și scade α. + +## Exploatare vs. explorare + +În algoritmul de mai sus, nu am specificat exact cum trebuie să alegem o acțiune la pasul 2.1. Dacă alegem acțiunea aleator, vom **explora** aleatoriu mediul și este foarte probabil să murim des, precum și să explorăm zone unde, în mod normal, nu am ajunge. O abordare alternativă ar fi să **exploatăm** valorile din Q-Table pe care deja le știm și astfel să alegem cea mai bună acțiune (cu valoarea Q-Table mai mare) în starea *s*. Totuși, aceasta ne va împiedica să explorăm alte stări și este posibil să nu găsim soluția optimă. + +Astfel, cea mai bună abordare este să echilibrăm între explorare și exploatare. Acest lucru se poate face alegând acțiunea în starea *s* cu probabilități proporționale cu valorile din Q-Table. La început, când valorile din Q-Table sunt toate la fel, ar corespunde unei alegeri aleatorii, dar pe măsură ce învățăm mai multe despre mediul nostru, vom fi mai înclinați să urmăm ruta optimă, permițând totuși agentului să aleagă o cale neexplorată din când în când. + +## Implementare în Python + +Suntem acum gata să implementăm algoritmul de învățare. Înainte de asta, avem nevoie și de o funcție care să convertească numere arbitrare din Q-Table într-un vector de probabilități pentru acțiunile corespunzătoare. + +1. Creează o funcție `probs()`: + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + ``` + + Adăugăm câteva `eps` la vectorul original pentru a evita împărțirea la 0 în cazul inițial, când toate componentele vectorului sunt identice. + +Rulează algoritmul de învățare prin 5000 de experimente, numite și **epoci**: (blocul de cod 8) +```python + for epoch in range(5000): + + # Alege punctul inițial + m.random_start() + + # Pornește călătoria + n=0 + cum_reward = 0 + while True: + x,y = m.human + v = probs(Q[x,y]) + a = random.choices(list(actions),weights=v)[0] + dpos = actions[a] + m.move(dpos,check_correctness=False) # permitem jucătorului să iasă în afara tablei, ceea ce termină episodul + r = reward(m) + cum_reward += r + if r==end_reward or cum_reward < -1000: + lpath.append(n) + break + alpha = np.exp(-n / 10e5) + gamma = 0.5 + ai = action_idx[a] + Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max()) + n+=1 +``` + +După executarea acestui algoritm, Q-Table ar trebui să fie actualizată cu valorile care definesc atractivitatea diferitelor acțiuni la fiecare pas. Putem încerca să vizualizăm Q-Table prin desenarea unui vector în fiecare celulă care indică direcția dorită a mișcării. Pentru simplitate, desenăm un cerc mic în loc de vârful săgeții. + + ## Verificarea politicii -Deoarece Q-Table listează "atractivitatea" fiecărei acțiuni în fiecare stare, este destul de simplu să o folosim pentru a defini navigarea eficientă în lumea noastră. În cel mai simplu caz, putem selecta acțiunea corespunzătoare valorii maxime din Q-Table: (bloc de cod 9) +Deoarece Q-Table listează „atractivitatea” fiecărei acțiuni în fiecare stare, este destul de ușor să o folosim pentru a defini navigarea eficientă în lumea noastră. În cel mai simplu caz, putem selecta acțiunea corespunzătoare celei mai mari valori din Q-Table: (blocul de cod 9) ```python def qpolicy_strict(m): @@ -198,17 +274,18 @@ def qpolicy_strict(m): walk(m,qpolicy_strict) ``` -> Dacă încercați codul de mai sus de mai multe ori, este posibil să observați că uneori "se blochează" și trebuie să apăsați butonul STOP din notebook pentru a-l întrerupe. Acest lucru se întâmplă deoarece pot exista situații în care două stări "indică" una către cealaltă în termeni de valoare optimă Q, caz în care agentul ajunge să se miște între aceste stări la nesfârșit. + +> Dacă încerci codul de mai sus de mai multe ori, poți observa că uneori „îngheață” și trebuie să apeși butonul STOP în notebook pentru a-l întrerupe. Acest lucru se întâmplă deoarece pot exista situații când două stări „se indică” reciproc în termeni de valoare optimă Q, caz în care agentul ajunge să se miște între aceste stări la nesfârșit. ## 🚀Provocare -> **Sarcina 1:** Modificați funcția `walk` pentru a limita lungimea maximă a traseului la un anumit număr de pași (de exemplu, 100) și observați cum codul de mai sus returnează această valoare din când în când. +> **Sarcina 1:** Modifică funcția `walk` pentru a limita lungimea maximă a traseului la un anumit număr de pași (să zicem, 100) și observă cum codul de mai sus returnează această valoare din când în când. -> **Sarcina 2:** Modificați funcția `walk` astfel încât să nu se întoarcă în locurile în care a fost deja anterior. Acest lucru va preveni ca `walk` să intre într-un ciclu, însă agentul poate ajunge totuși să fie "blocat" într-o locație din care nu poate scăpa. +> **Sarcina 2:** Modifică funcția `walk` astfel încât să nu se întoarcă în locurile în care a fost deja anterior. Acest lucru va preveni buclarea funcției `walk`, însă agentul poate totuși să ajungă „captiv” într-o locație din care nu poate scăpa. ## Navigare -O politică de navigare mai bună ar fi cea pe care am folosit-o în timpul antrenamentului, care combină exploatarea și explorarea. În această politică, vom selecta fiecare acțiune cu o anumită probabilitate, proporțională cu valorile din Q-Table. Această strategie poate duce totuși la revenirea agentului într-o poziție pe care a explorat-o deja, dar, după cum puteți vedea din codul de mai jos, rezultă într-un traseu mediu foarte scurt către locația dorită (amintiți-vă că `print_statistics` rulează simularea de 100 de ori): (bloc de cod 10) +O politică mai bună de navigare ar fi cea pe care am folosit-o în timpul antrenamentului, care combină exploatarea și explorarea. În această politică, vom selecta fiecare acțiune cu o anumită probabilitate, proporțională cu valorile din Q-Table. Această strategie poate încă duce la întoarcerea agentului într-o poziție deja explorată, dar, după cum poți vedea din codul de mai jos, rezultă într-un traseu mediu foarte scurt către locația dorită (amintește-ți că `print_statistics` rulează simularea de 100 de ori): (bloc de cod 10) ```python def qpolicy(m): @@ -220,28 +297,32 @@ def qpolicy(m): print_statistics(qpolicy) ``` -După rularea acestui cod, ar trebui să obțineți o lungime medie a traseului mult mai mică decât înainte, în intervalul 3-6. +După rularea acestui cod, ar trebui să obții o lungime medie a traseului mult mai mică decât înainte, în intervalul 3-6. ## Investigarea procesului de învățare -Așa cum am menționat, procesul de învățare este un echilibru între explorarea și exploatarea cunoștințelor dobândite despre structura spațiului problemei. Am observat că rezultatele învățării (capacitatea de a ajuta un agent să găsească un traseu scurt către obiectiv) s-au îmbunătățit, dar este, de asemenea, interesant să observăm cum se comportă lungimea medie a traseului în timpul procesului de învățare: +Așa cum am menționat, procesul de învățare este un echilibru între explorare și exploatarea cunoștințelor dobândite despre structura spațiului de problemă. Am văzut că rezultatele învățării (abilitatea de a ajuta un agent să găsească un traseu scurt către țintă) s-au îmbunătățit, dar este și interesant să observăm cum se comportă lungimea medie a traseului pe parcursul procesului de învățare: + + -## Rezumarea învățării +Învățăturile pot fi rezumate astfel: -- **Lungimea medie a traseului crește**. Ce vedem aici este că, la început, lungimea medie a traseului crește. Acest lucru se datorează probabil faptului că, atunci când nu știm nimic despre mediu, avem tendința să fim prinși în stări nefavorabile, cum ar fi apă sau lup. Pe măsură ce învățăm mai multe și începem să folosim aceste cunoștințe, putem explora mediul mai mult, dar încă nu știm foarte bine unde sunt merele. +- **Lungimea medie a traseului crește**. Ce observăm aici este că, la început, lungimea medie a traseului crește. Probabil acest lucru se datorează faptului că atunci când nu știm nimic despre mediu, avem probabilitatea să ne blocăm în stări proaste, cum ar fi apă sau lup. Pe măsură ce învățăm mai mult și începem să folosim această cunoaștere, putem explora mediul mai mult timp, dar încă nu știm foarte bine unde sunt merele. -- **Lungimea traseului scade, pe măsură ce învățăm mai mult**. Odată ce învățăm suficient, devine mai ușor pentru agent să atingă obiectivul, iar lungimea traseului începe să scadă. Totuși, suntem încă deschiși la explorare, așa că deseori ne abatem de la cel mai bun traseu și explorăm opțiuni noi, ceea ce face traseul mai lung decât optimul. +- **Lungimea traseului scade pe măsură ce învățăm mai mult**. Odată ce învățăm suficient, devine mai ușor pentru agent să atingă scopul, iar lungimea traseului începe să scadă. Totuși, încă suntem deschiși explorării, așa că adesea ne abatem de la cel mai bun traseu și explorăm opțiuni noi, făcând traseul mai lung decât optim. -- **Creștere bruscă a lungimii**. Ce mai observăm pe acest grafic este că, la un moment dat, lungimea a crescut brusc. Acest lucru indică natura stochastică a procesului și faptul că, la un moment dat, putem "strica" coeficienții din Q-Table prin suprascrierea lor cu valori noi. Acest lucru ar trebui minimizat ideal prin reducerea ratei de învățare (de exemplu, spre sfârșitul antrenamentului, ajustăm valorile din Q-Table doar cu o valoare mică). +- **Lungimea crește brusc**. De asemenea, observăm pe acest grafic că, la un moment dat, lungimea a crescut brusc. Aceasta indică natura stocastică a procesului și faptul că, la un moment dat, putem „strica” coeficienții din Q-Table, suprascriindu-i cu valori noi. În mod ideal, acest lucru ar trebui minimizat prin scăderea ratei de învățare (de exemplu, spre finalul antrenamentului, ajustăm valorile din Q-Table doar cu o valoare mică). -În general, este important să ne amintim că succesul și calitatea procesului de învățare depind semnificativ de parametri, cum ar fi rata de învățare, reducerea ratei de învățare și factorul de discount. Aceștia sunt adesea numiți **hiperparametri**, pentru a-i distinge de **parametri**, pe care îi optimizăm în timpul antrenamentului (de exemplu, coeficienții din Q-Table). Procesul de găsire a celor mai bune valori pentru hiperparametri se numește **optimizarea hiperparametrilor** și merită o discuție separată. +Per ansamblu, este important să ne amintim că succesul și calitatea procesului de învățare depind semnificativ de parametrii precum rata de învățare, scăderea ratei de învățare și factorul de discount. Aceștia sunt adesea numiți **hiperparametri**, pentru a fi distinși de **parametrii** pe care îi optimizăm în timpul antrenamentului (de exemplu, coeficienții din Q-Table). Procesul de găsire a celor mai buni valori pentru hiperparametri se numește **optimizarea hiperparametrilor** și merită un subiect separat. -## [Test de verificare post-lectură](https://ff-quizzes.netlify.app/en/ml/) +## [Chestionar post-lectură](https://ff-quizzes.netlify.app/en/ml/) ## Temă [O lume mai realistă](assignment.md) --- -**Declinare de responsabilitate**: -Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri. \ No newline at end of file + +**Declinare a responsabilității**: +Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un om. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care decurg din utilizarea acestei traduceri. + \ No newline at end of file diff --git a/translations/ro/8-Reinforcement/2-Gym/README.md b/translations/ro/8-Reinforcement/2-Gym/README.md index 6cbda3c79..2306670d3 100644 --- a/translations/ro/8-Reinforcement/2-Gym/README.md +++ b/translations/ro/8-Reinforcement/2-Gym/README.md @@ -1,14 +1,34 @@ +# CartPole Patinaj + +Problema pe care am rezolvat-o în lecția anterioară ar putea părea o problemă simplă, nu neapărat aplicabilă în scenarii din viața reală. Acest lucru nu este adevărat, deoarece multe probleme reale împărtășesc acest scenariu - inclusiv jocurile de Șah sau Go. Sunt similare deoarece avem o tablă cu reguli date și un **stare discretă**. + +## [Chestionar înainte de lecție](https://ff-quizzes.netlify.app/en/ml/) + +## Introducere + +În această lecție vom aplica aceleași principii ale Q-Learning la o problemă cu **stare continuă**, adică o stare care este dată de unul sau mai mulți numere reale. Vom aborda următoarea problemă: + +> **Problemă**: Dacă Peter vrea să scape de lup, trebuie să se poată mișca mai repede. Vom vedea cum Peter poate învăța să patineze, în special să-și mențină echilibrul, folosind Q-Learning. + +![Marea evadare!](../../../../translated_images/ro/escape.18862db9930337e3.webp) + +> Peter și prietenii săi devin creativi pentru a scăpa de lup! Imagine de [Jen Looper](https://twitter.com/jenlooper) + +Vom folosi o versiune simplificată a echilibrului cunoscută drept problema **CartPole**. În lumea cartpole, avem un glisor orizontal care poate să se miște la stânga sau la dreapta, iar scopul este să echilibrăm o tijă verticală pe vârful glisorului. + +un cartpole + ## Cerințe preliminare -În această lecție, vom folosi o bibliotecă numită **OpenAI Gym** pentru a simula diferite **medii**. Poți rula codul lecției local (de exemplu, din Visual Studio Code), caz în care simularea se va deschide într-o fereastră nouă. Dacă rulezi codul online, poate fi necesar să faci unele ajustări, așa cum este descris [aici](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7). +În această lecție vom folosi o bibliotecă numită **OpenAI Gym** pentru a simula diferite **medii**. Poți rula codul acestei lecții local (de ex. din Visual Studio Code), caz în care simularea se va deschide într-o fereastră nouă. Când rulezi codul online, este posibil să trebuiască să faci câteva ajustări în cod, așa cum este descris [aici](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7). ## OpenAI Gym -În lecția anterioară, regulile jocului și starea erau definite de clasa `Board`, pe care am creat-o noi. Aici vom folosi un **mediu de simulare** special, care va simula fizica din spatele balansării unui stâlp. Unul dintre cele mai populare medii de simulare pentru antrenarea algoritmilor de învățare prin întărire se numește [Gym](https://gym.openai.com/), care este întreținut de [OpenAI](https://openai.com/). Folosind acest Gym, putem crea diverse **medii**, de la simulări de tip cartpole până la jocuri Atari. +În lecția anterioară, regulile jocului și starea au fost date de clasa `Board` pe care am definit-o noi înșine. Aici vom folosi un **mediu de simulare** special, care va simula fizica din spatele tijei care se echilibrează. Unul dintre cele mai populare medii de simulare pentru antrenarea algoritmilor de învățare prin întărire se numește [Gym](https://gym.openai.com/), întreținut de [OpenAI](https://openai.com/). Folosind acest gym putem crea diferite **medii**, de la simularea cartpole până la jocuri Atari. > **Notă**: Poți vedea alte medii disponibile în OpenAI Gym [aici](https://gym.openai.com/envs/#classic_control). -Mai întâi, să instalăm Gym și să importăm bibliotecile necesare (bloc de cod 1): +Mai întâi, să instalăm gym și să importăm bibliotecile necesare (bloc de cod 1): ```python import sys @@ -22,13 +42,13 @@ import random ## Exercițiu - inițializează un mediu cartpole -Pentru a lucra cu problema balansării cartpole, trebuie să inițializăm mediul corespunzător. Fiecare mediu este asociat cu: +Pentru a lucra cu o problemă de echilibrare cartpole, trebuie să inițializăm mediul corespunzător. Fiecare mediu este asociat cu: -- **Spațiul de observație**, care definește structura informațiilor pe care le primim de la mediu. Pentru problema cartpole, primim poziția stâlpului, viteza și alte valori. +- **Spațiu de observații** care definește structura informației pe care o primim din mediu. Pentru problema cartpole, primim poziția tijei, viteza și alte valori. -- **Spațiul de acțiune**, care definește acțiunile posibile. În cazul nostru, spațiul de acțiune este discret și constă din două acțiuni - **stânga** și **dreapta**. (bloc de cod 2) +- **Spațiu de acțiune** care definește acțiunile posibile. În cazul nostru spațiul de acțiune este discret și constă în două acțiuni - **stânga** și **dreapta**. (bloc de cod 2) -1. Pentru a inițializa, tastează următorul cod: +1. Pentru a inițializa, scrie următorul cod: ```python env = gym.make("CartPole-v1") @@ -37,11 +57,11 @@ Pentru a lucra cu problema balansării cartpole, trebuie să inițializăm mediu print(env.action_space.sample()) ``` -Pentru a vedea cum funcționează mediul, să rulăm o simulare scurtă de 100 de pași. La fiecare pas, oferim una dintre acțiunile care trebuie luate - în această simulare selectăm aleatoriu o acțiune din `action_space`. +Să vedem cum funcționează mediul, să rulăm o simulare scurtă pentru 100 de pași. La fiecare pas, oferim o acțiune care trebuie executată - în această simulare selectăm aleator o acțiune din `action_space`. 1. Rulează codul de mai jos și vezi ce rezultă. - ✅ Amintește-ți că este preferabil să rulezi acest cod pe o instalare locală de Python! (bloc de cod 3) + ✅ Ține minte că este recomandat să rulezi acest cod pe o instalare locală de Python! (bloc de cod 3) ```python env.reset() @@ -52,11 +72,11 @@ Pentru a vedea cum funcționează mediul, să rulăm o simulare scurtă de 100 d env.close() ``` - Ar trebui să vezi ceva similar cu această imagine: + Ar trebui să vezi ceva asemănător cu această imagine: - ![cartpole fără balans](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) + ![cartpole nesusținut](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) -1. În timpul simulării, trebuie să obținem observații pentru a decide cum să acționăm. De fapt, funcția step returnează observațiile curente, o funcție de recompensă și un indicator `done` care arată dacă are sens să continuăm simularea sau nu: (bloc de cod 4) +1. În timpul simulării, trebuie să obținem observații pentru a decide cum să acționăm. De fapt, funcția step returnează observațiile curente, o funcție de recompensă și flag-ul done care indică dacă are sens să continuăm simularea sau nu: (bloc de cod 4) ```python env.reset() @@ -82,34 +102,34 @@ Pentru a vedea cum funcționează mediul, să rulăm o simulare scurtă de 100 d [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0 ``` - Vectorul de observație returnat la fiecare pas al simulării conține următoarele valori: + Vectorul de observații returnat la fiecare pas al simulării conține următoarele valori: - Poziția căruciorului - Viteza căruciorului - - Unghiul stâlpului - - Rata de rotație a stâlpului + - Unghiul tijei + - Rata de rotație a tijei -1. Obține valoarea minimă și maximă a acestor numere: (bloc de cod 5) +1. Obține valorile minime și maxime ale acestor numere: (bloc de cod 5) ```python print(env.observation_space.low) print(env.observation_space.high) ``` - De asemenea, vei observa că valoarea recompensei la fiecare pas al simulării este întotdeauna 1. Acest lucru se datorează faptului că scopul nostru este să supraviețuim cât mai mult timp posibil, adică să menținem stâlpul într-o poziție rezonabil verticală pentru cea mai lungă perioadă de timp. + Poți observa și că valoarea recompensei la fiecare pas al simulării este întotdeauna 1. Acest lucru este deoarece scopul nostru este să supraviețuim cât mai mult timp, adică să menținem tija într-o poziție verticală rezonabilă pentru cea mai lungă perioadă de timp. - ✅ De fapt, simularea CartPole este considerată rezolvată dacă reușim să obținem o recompensă medie de 195 pe parcursul a 100 de încercări consecutive. + ✅ De fapt, simularea CartPole este considerată rezolvată dacă reușim să obținem o recompensă medie de 195 pe 100 de încercări consecutive. ## Discretizarea stării -În Q-Learning, trebuie să construim un Q-Table care definește ce să facem în fiecare stare. Pentru a face acest lucru, starea trebuie să fie **discretă**, mai precis, trebuie să conțină un număr finit de valori discrete. Astfel, trebuie să **discretizăm** cumva observațiile, mapându-le la un set finit de stări. +În Q-Learning, trebuie să construim un Q-Table care definește ce să facem la fiecare stare. Pentru a face acest lucru, starea trebuie să fie **discretă**, mai precis, să conțină un număr finit de valori discrete. Astfel, trebuie cumva să **discretizăm** observațiile noastre, mapându-le într-un set finit de stări. -Există câteva moduri în care putem face acest lucru: +Există câteva moduri în care putem face asta: -- **Împărțirea în intervale**. Dacă știm intervalul unei anumite valori, putem împărți acest interval în mai multe **intervale** și apoi să înlocuim valoarea cu numărul intervalului căruia îi aparține. Acest lucru poate fi realizat folosind metoda [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) din numpy. În acest caz, vom ști exact dimensiunea stării, deoarece va depinde de numărul de intervale pe care le selectăm pentru digitalizare. +- **Împărțirea în intervale (bins)**. Dacă cunoaștem intervalul unei valori, putem împărți acest interval în mai multe **bins**, și apoi înlocui valoarea cu numărul bin-ului căruia îi aparține. Acest lucru se poate face folosind metoda numpy [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html). În acest caz, vom cunoaște exact dimensiunea stării, deoarece aceasta va depinde de numărul de bins selectate pentru digitalizare. + +✅ Putem folosi interpolarea liniară pentru a aduce valorile într-un interval finit (de exemplu, de la -20 la 20), iar apoi convertim numerele în întregi prin rotunjire. Acest lucru ne oferă un control mai redus asupra dimensiunii stării, mai ales dacă nu cunoaștem intervalele exacte ale valorilor de intrare. De exemplu, în cazul nostru, 2 din cele 4 valori nu au limite superioare/inferioare, ceea ce poate duce la un număr infinit de stări. -✅ Putem folosi interpolarea liniară pentru a aduce valorile la un interval finit (de exemplu, de la -20 la 20) și apoi să convertim numerele în întregi prin rotunjire. Acest lucru ne oferă un control mai redus asupra dimensiunii stării, mai ales dacă nu cunoaștem intervalele exacte ale valorilor de intrare. De exemplu, în cazul nostru, 2 din cele 4 valori nu au limite superioare/inferioare, ceea ce poate duce la un număr infinit de stări. - -În exemplul nostru, vom folosi a doua abordare. După cum vei observa mai târziu, în ciuda lipsei limitelor superioare/inferioare, aceste valori rareori iau valori în afara unor intervale finite, astfel încât stările cu valori extreme vor fi foarte rare. +În exemplul nostru, vom merge pe a doua variantă. După cum vei observa mai târziu, în ciuda faptului că limitele superioare/inferioare nu sunt definite, acele valori iau rar valori în afara anumitor intervale finite, astfel aceste stări cu valori extreme vor fi foarte rare. 1. Iată funcția care va lua observația din modelul nostru și va produce un tuplu de 4 valori întregi: (bloc de cod 6) @@ -118,7 +138,7 @@ Există câteva moduri în care putem face acest lucru: return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int)) ``` -1. Să explorăm și o altă metodă de discretizare folosind intervale: (bloc de cod 7) +1. Să explorăm și o altă metodă de discretizare folosind bins: (bloc de cod 7) ```python def create_bins(i,num): @@ -126,17 +146,17 @@ Există câteva moduri în care putem face acest lucru: print("Sample bins for interval (-5,5) with 10 bins\n",create_bins((-5,5),10)) - ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # intervals of values for each parameter - nbins = [20,20,10,10] # number of bins for each parameter + ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # intervale de valori pentru fiecare parametru + nbins = [20,20,10,10] # număr de coșuri pentru fiecare parametru bins = [create_bins(ints[i],nbins[i]) for i in range(4)] def discretize_bins(x): return tuple(np.digitize(x[i],bins[i]) for i in range(4)) ``` -1. Acum să rulăm o simulare scurtă și să observăm aceste valori discrete ale mediului. Simte-te liber să încerci atât `discretize`, cât și `discretize_bins` și să vezi dacă există vreo diferență. +1. Să rulăm acum o simulare scurtă și să observăm aceste valori discrete ale mediului. Poți încerca atât `discretize`, cât și `discretize_bins` pentru a vedea dacă există vreo diferență. - ✅ `discretize_bins` returnează numărul intervalului, care începe de la 0. Astfel, pentru valorile variabilei de intrare în jurul valorii 0, returnează numărul din mijlocul intervalului (10). În `discretize`, nu ne-am preocupat de intervalul valorilor de ieșire, permițându-le să fie negative, astfel încât valorile stării nu sunt deplasate, iar 0 corespunde lui 0. (bloc de cod 8) + ✅ discretize_bins returnează numărul bin-ului, care este indexat de la 0. Astfel, pentru valori ale variabilei de intrare în jurul valorii 0 returnează numărul din mijlocul intervalului (10). În discretize, nu ne-am preocupat de intervalul valorilor de ieșire, permițându-le să fie negative, astfel valorile stării nu sunt mutate, iar 0 corespunde lui 0. (bloc de cod 8) ```python env.reset() @@ -150,15 +170,15 @@ Există câteva moduri în care putem face acest lucru: env.close() ``` - ✅ Debifează linia care începe cu `env.render` dacă vrei să vezi cum se execută mediul. În caz contrar, poți să-l execuți în fundal, ceea ce este mai rapid. Vom folosi această execuție "invizibilă" în timpul procesului de Q-Learning. + ✅ Deblochează linia care începe cu env.render dacă vrei să vezi cum rulează mediul. Altfel, poți să-l execuți în fundal, ceea ce este mai rapid. Vom folosi această rulare „invizibilă” în timpul procesului nostru de Q-Learning. ## Structura Q-Table -În lecția anterioară, starea era un simplu pereche de numere de la 0 la 8, și astfel era convenabil să reprezentăm Q-Table printr-un tensor numpy cu o formă de 8x8x2. Dacă folosim discretizarea prin intervale, dimensiunea vectorului de stare este de asemenea cunoscută, astfel încât putem folosi aceeași abordare și să reprezentăm starea printr-un array cu forma 20x20x10x10x2 (aici 2 este dimensiunea spațiului de acțiune, iar primele dimensiuni corespund numărului de intervale pe care le-am selectat pentru fiecare dintre parametrii din spațiul de observație). +În lecția anterioară, starea era o pereche simplă de numere de la 0 la 8, deci a fost convenabil să reprezentăm Q-Table ca un tensor numpy cu forma 8x8x2. Dacă folosim discretizarea prin bins, dimensiunea vectorului nostru de stare este și ea cunoscută, deci putem folosi aceeași abordare și să reprezentăm starea printr-un array cu forma 20x20x10x10x2 (aici 2 este dimensiunea spațiului de acțiuni, iar primele dimensiuni corespund numărului de bins selectate pentru fiecare parametru din spațiul de observații). -Totuși, uneori dimensiunile precise ale spațiului de observație nu sunt cunoscute. În cazul funcției `discretize`, nu putem fi niciodată siguri că starea rămâne în anumite limite, deoarece unele dintre valorile originale nu sunt limitate. Astfel, vom folosi o abordare ușor diferită și vom reprezenta Q-Table printr-un dicționar. +Totuși, uneori dimensiunile exacte ale spațiului de observație nu sunt cunoscute. În cazul funcției `discretize`, poate nu vom fi niciodată siguri că starea rămâne în anumite limite, pentru că unele valori originale nu sunt limitate. Astfel, vom folosi o abordare ușor diferită și vom reprezenta Q-Table ca un dicționar. -1. Folosește perechea *(state,action)* ca cheie a dicționarului, iar valoarea ar corespunde valorii din Q-Table. (bloc de cod 9) +1. Folosește perechea *(stare, acțiune)* ca și cheie în dicționar, iar valoarea va corespunde valorii intrării din Q-Table. (bloc de cod 9) ```python Q = {} @@ -168,38 +188,38 @@ Totuși, uneori dimensiunile precise ale spațiului de observație nu sunt cunos return [Q.get((state,a),0) for a in actions] ``` - Aici definim și o funcție `qvalues()`, care returnează o listă de valori din Q-Table pentru o stare dată, corespunzătoare tuturor acțiunilor posibile. Dacă intrarea nu este prezentă în Q-Table, vom returna 0 ca valoare implicită. + Aici definim și o funcție `qvalues()`, care returnează o listă de valori din Q-Table pentru o stare dată corespunzătoare tuturor acțiunilor posibile. Dacă intrarea nu este prezentă în Q-Table, vom returna 0 ca valoare implicită. ## Să începem Q-Learning -Acum suntem gata să-l învățăm pe Peter să-și mențină echilibrul! +Acum suntem gata să-l învățăm pe Peter să se echilibreze! 1. Mai întâi, să setăm câțiva hiperparametri: (bloc de cod 10) ```python - # hyperparameters + # hiperparametri alpha = 0.3 gamma = 0.9 epsilon = 0.90 ``` - Aici, `alpha` este **rata de învățare**, care definește în ce măsură ar trebui să ajustăm valorile curente din Q-Table la fiecare pas. În lecția anterioară am început cu 1 și apoi am scăzut `alpha` la valori mai mici în timpul antrenamentului. În acest exemplu, îl vom menține constant doar pentru simplitate, iar tu poți experimenta ajustarea valorilor `alpha` mai târziu. + Aici, `alpha` este **rata de învățare** care definește în ce măsură ar trebui să ajustăm valorile curente din Q-Table la fiecare pas. În lecția anterioară am început cu 1, apoi am scăzut `alpha` la valori mai mici pe durata antrenării. În acest exemplu o vom păstra constantă doar pentru simplitate, iar tu poți experimenta cu ajustarea valorilor lui `alpha` mai târziu. - `gamma` este **factorul de reducere**, care arată în ce măsură ar trebui să prioritizăm recompensa viitoare față de recompensa curentă. + `gamma` este **factorul de reducere** care arată în ce măsură ar trebui să prioritizăm recompensa viitoare față de cea curentă. - `epsilon` este **factorul de explorare/exploatare**, care determină dacă ar trebui să preferăm explorarea sau exploatarea. În algoritmul nostru, vom selecta acțiunea următoare conform valorilor din Q-Table în procentul `epsilon` din cazuri, iar în restul cazurilor vom executa o acțiune aleatorie. Acest lucru ne va permite să explorăm zone ale spațiului de căutare pe care nu le-am văzut niciodată. + `epsilon` este **factorul de explorare/exploatare** care determină dacă ar trebui să preferăm explorarea în locul exploatării sau invers. În algoritmul nostru, în `epsilon` procente din cazuri vom selecta acțiunea următoare conform valorilor din Q-Table, iar în restul cazurilor vom executa o acțiune aleatoare. Acest lucru ne va permite să explorăm zone ale spațiului de căutare pe care nu le-am mai văzut înainte. - ✅ În termeni de echilibrare - alegerea unei acțiuni aleatorii (explorare) ar acționa ca o împingere aleatorie în direcția greșită, iar stâlpul ar trebui să învețe cum să-și recupereze echilibrul din aceste "greșeli". + ✅ În termeni de echilibrare - alegerea unei acțiuni aleatoare (explorare) ar acționa ca o lovitură aleatoare într-o direcție greșită, iar tija va trebui să învețe cum să-și recupereze echilibrul după aceste „greșeli”. ### Îmbunătățirea algoritmului -Putem face două îmbunătățiri algoritmului nostru din lecția anterioară: - -- **Calcularea recompensei cumulative medii**, pe parcursul unui număr de simulări. Vom afișa progresul la fiecare 5000 de iterații și vom calcula media recompensei cumulative pe acea perioadă de timp. Asta înseamnă că, dacă obținem mai mult de 195 de puncte, putem considera problema rezolvată, cu o calitate chiar mai mare decât cea cerută. +Putem face și două îmbunătățiri ale algoritmului din lecția anterioară: -- **Calcularea rezultatului cumulativ mediu maxim**, `Qmax`, și vom stoca Q-Table corespunzător acelui rezultat. Când rulezi antrenamentul, vei observa că uneori rezultatul cumulativ mediu începe să scadă, și vrem să păstrăm valorile din Q-Table care corespund celui mai bun model observat în timpul antrenamentului. +- **Calcularea recompensei cumulative medii**, pe o serie de simulări. Vom afișa progresul la fiecare 5000 de iterații, iar recompensa cumulativă va fi mediată pentru acea perioadă. Dacă obținem mai mult de 195 puncte - putem considera problema rezolvată, cu o calitate chiar mai bună decât cea cerută. + +- **Calcularea rezultatului mediu cumulat maxim**, `Qmax`, și vom stoca Q-Table corespunzătoare acelui rezultat. Când rulezi antrenamentul vei observa că uneori rezultatul mediu cumulat începe să scadă, iar noi vrem să păstrăm valorile din Q-Table care corespund celui mai bun model observat în timpul antrenării. -1. Colectează toate recompensele cumulative la fiecare simulare în vectorul `rewards` pentru a le reprezenta grafic ulterior. (bloc de cod 11) +1. Colectează toate recompensele cumulative la fiecare simulare în vectorul `rewards` pentru afișări ulterioare. (bloc de cod 11) ```python def probs(v,eps=1e-4): @@ -214,15 +234,15 @@ Putem face două îmbunătățiri algoritmului nostru din lecția anterioară: obs = env.reset() done = False cum_reward=0 - # == do the simulation == + # == efectuează simularea == while not done: s = discretize(obs) if random.random() Qmax: @@ -242,23 +262,23 @@ Putem face două îmbunătățiri algoritmului nostru din lecția anterioară: Ce poți observa din aceste rezultate: -- **Aproape de obiectivul nostru**. Suntem foarte aproape de a atinge obiectivul de a obține 195 de recompense cumulative pe parcursul a 100+ rulări consecutive ale simulării, sau poate chiar l-am atins! Chiar dacă obținem numere mai mici, încă nu știm, deoarece calculăm media pe 5000 de rulări, iar doar 100 de rulări sunt necesare conform criteriilor formale. +- **Aproape de țintă**. Suntem foarte aproape să atingem ținta de a obține o recompensă cumulativă de 195 pe 100+ rulări consecutive ale simulării, sau poate am și reușit! Chiar dacă obținem valori mai mici, nu este clar încă pentru că media este calculată pe 5000 de rulări, iar criteriile formale cer doar 100 rulări. + +- **Recompensa începe să scadă**. Uneori recompensa începe să scadă, ceea ce înseamnă că putem „distruge” valorile deja învățate din Q-Table cu altele care fac situația mai rea. -- **Recompensa începe să scadă**. Uneori recompensa începe să scadă, ceea ce înseamnă că putem "distruge" valorile deja învățate din Q-Table cu cele care fac situația mai rea. +Această observație este mai vizibilă dacă afișăm progresul antrenamentului. -Această observație este mai clar vizibilă dacă reprezentăm grafic progresul antrenamentului. +## Afișarea progresului antrenamentului -## Reprezentarea grafică a progresului antrenamentului - -În timpul antrenamentului, am colectat valoarea recompensei cumulative la fiecare dintre iterații în vectorul `rewards`. Iată cum arată când o reprezentăm grafic în funcție de numărul de iterații: +În timpul antrenamentului, am colectat valoarea recompensei cumulative la fiecare iterație în vectorul `rewards`. Iată cum arată când o afișăm în funcție de numărul iterației: ```python plt.plot(rewards) ``` -![progres brut](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png) +![progres brut](../../../../translated_images/ro/train_progress_raw.2adfdf2daea09c59.webp) -Din acest grafic, nu putem spune nimic, deoarece, datorită naturii procesului de antrenament stochastic, durata sesiunilor de antrenament variază foarte mult. Pentru a înțelege mai bine acest grafic, putem calcula **media mobilă** pe o serie de experimente, să zicem 100. Acest lucru poate fi realizat convenabil folosind `np.convolve`: (bloc de cod 12) +Din acest grafic nu putem spune mare lucru, pentru că din cauza naturii stochastice a procesului de antrenament lungimea sesiunilor de antrenament variază mult. Pentru a înțelege mai bine acest grafic, putem calcula **media mobilă** peste un număr de experimente, să zicem 100. Acest lucru se poate face convenabil folosind `np.convolve`: (bloc de cod 12) ```python def running_average(x,window): @@ -267,21 +287,24 @@ def running_average(x,window): plt.plot(running_average(rewards,100)) ``` -![progres antrenament](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png) +![progres antrenament](../../../../translated_images/ro/train_progress_runav.c71694a8fa9ab359.webp) + +## Varierea hiperparametrilor + +Pentru a face învățarea mai stabilă, are sens să ajustăm unii dintre hiperparametri în timpul antrenamentului. În particular: + +- **Pentru rata de învățare**, `alpha`, putem începe cu valori apropiate de 1, apoi să scădem treptat această valoare. În timp, vom obține valori probabilistice bune în Q-Table și ar trebui să le ajustăm ușor, fără a suprascrie complet cu valori noi. -## Variarea hiperparametrilor +- **Creșterea lui epsilon**. Putem dori să creștem lent valoarea lui `epsilon`, pentru a explora mai puțin și exploata mai mult. Probabil are sens să începem cu o valoare redusă de `epsilon` și să o ducem aproape de 1. -Pentru a face învățarea mai stabilă, are sens să ajustăm unii dintre hiperparametrii noștri în timpul antrenamentului. În special: +> **Sarcina 1**: Joacă-te cu valorile hiperparametrilor și vezi dacă poți obține o recompensă cumulativă mai mare. Reușești să depășești 195? -- **Pentru rata de învățare**, `alpha`, putem începe cu valori apropiate de 1 și apoi să continuăm să scădem parametrul. Cu timpul, vom obține valori bune de probabilitate în Q-Table și, astfel, ar trebui să le ajustăm ușor, fără să le suprascriem complet cu valori noi. -- **Creșterea lui epsilon**. Poate fi util să creștem `epsilon` treptat, pentru a explora mai puțin și a exploata mai mult. Probabil are sens să începem cu o valoare mai mică pentru `epsilon` și să o creștem până aproape de 1. -> **Sarcina 1**: Joacă-te cu valorile hiperparametrilor și vezi dacă poți obține o recompensă cumulativă mai mare. Ajungi peste 195? -> **Sarcina 2**: Pentru a rezolva formal problema, trebuie să obții o recompensă medie de 195 pe parcursul a 100 runde consecutive. Măsoară acest lucru în timpul antrenamentului și asigură-te că ai rezolvat problema în mod formal! +> **Sarcina 2**: Pentru a rezolva formal problema, trebuie să obțineți o recompensă medie de 195 pe parcursul a 100 de rulări consecutive. Măsurați acest lucru în timpul antrenamentului și asigurați-vă că ați rezolvat formal problema! -## Vizualizarea rezultatului în acțiune +## Văzând rezultatul în acțiune -Ar fi interesant să vedem cum se comportă modelul antrenat. Să rulăm simularea și să urmăm aceeași strategie de selecție a acțiunilor ca în timpul antrenamentului, eșantionând conform distribuției de probabilitate din Q-Table: (bloc de cod 13) +Ar fi interesant să vedem efectiv cum se comportă modelul antrenat. Haideți să rulăm simularea și să urmăm aceeași strategie de selecție a acțiunii ca în timpul antrenamentului, eșantionând conform distribuției de probabilitate din Q-Table: (bloc de cod 13) ```python obs = env.reset() @@ -295,30 +318,32 @@ while not done: env.close() ``` -Ar trebui să vezi ceva de genul acesta: +Ar trebui să vedeți ceva asemănător: -![un cartpole echilibrat](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) +![un cartpole balansându-se](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) --- ## 🚀Provocare -> **Sarcina 3**: Aici, am folosit copia finală a Q-Table, care poate să nu fie cea mai bună. Amintește-ți că am salvat cea mai performantă Q-Table în variabila `Qbest`! Încearcă același exemplu cu cea mai performantă Q-Table, copiază `Qbest` peste `Q` și vezi dacă observi vreo diferență. +> **Sarcina 3**: Aici, am folosit copia finală a Q-Table, care s-ar putea să nu fie cea mai bună. Țineți minte că am stocat cea mai performantă Q-Table în variabila `Qbest`! Încercați același exemplu cu cea mai performantă Q-Table copiată peste `Q` și vedeți dacă observați diferența. -> **Sarcina 4**: Aici nu am selectat cea mai bună acțiune la fiecare pas, ci am eșantionat conform distribuției de probabilitate corespunzătoare. Ar avea mai mult sens să selectăm mereu cea mai bună acțiune, cu cea mai mare valoare din Q-Table? Acest lucru poate fi realizat folosind funcția `np.argmax` pentru a afla numărul acțiunii corespunzătoare celei mai mari valori din Q-Table. Implementează această strategie și vezi dacă îmbunătățește echilibrarea. +> **Sarcina 4**: Aici nu am selectat cea mai bună acțiune la fiecare pas, ci am eșantionat cu distribuția de probabilitate corespunzătoare. Ar avea mai mult sens să selectăm întotdeauna cea mai bună acțiune, cu valoarea cea mai mare din Q-Table? Acest lucru se poate face folosind funcția `np.argmax` pentru a afla numărul acțiunii corespunzătoare celei mai mari valori din Q-Table. Implementați această strategie și vedeți dacă îmbunătățește balansarea. -## [Quiz post-lectură](https://ff-quizzes.netlify.app/en/ml/) +## [Chestionar post-lectură](https://ff-quizzes.netlify.app/en/ml/) ## Temă -[Antrenează un Mountain Car](assignment.md) +[Antrenează o mașină de munte](assignment.md) ## Concluzie -Am învățat acum cum să antrenăm agenți pentru a obține rezultate bune doar oferindu-le o funcție de recompensă care definește starea dorită a jocului și oferindu-le oportunitatea de a explora inteligent spațiul de căutare. Am aplicat cu succes algoritmul Q-Learning în cazurile de medii discrete și continue, dar cu acțiuni discrete. +Acum am învățat cum să antrenăm agenți să obțină rezultate bune doar oferindu-le o funcție de recompensă care definește starea dorită a jocului și oferindu-le oportunitatea de a explora inteligent spațiul de căutare. Am aplicat cu succes algoritmul Q-Learning în cazurile mediilor discrete și continue, dar cu acțiuni discrete. -Este important să studiem și situațiile în care starea acțiunii este continuă și când spațiul de observație este mult mai complex, cum ar fi imaginea de pe ecranul unui joc Atari. În astfel de probleme, deseori trebuie să folosim tehnici de învățare automată mai puternice, cum ar fi rețelele neuronale, pentru a obține rezultate bune. Aceste subiecte mai avansate vor fi abordate în cursul nostru viitor de AI avansat. +Este important să studiem și situațiile în care starea acțiunii este și ea continuă și când spațiul de observație este mult mai complex, cum ar fi imaginea din ecranul jocului Atari. În aceste probleme avem adesea nevoie să folosim tehnici de învățare automată mai puternice, cum ar fi rețele neuronale, pentru a obține rezultate bune. Aceste subiecte mai avansate sunt obiectul cursului nostru viitor mai avansat de AI. --- -**Declinare de responsabilitate**: -Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri. \ No newline at end of file + +**Declinare a responsabilității**: +Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un om. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care decurg din utilizarea acestei traduceri. + \ No newline at end of file diff --git a/translations/sk/.co-op-translator.json b/translations/sk/.co-op-translator.json index a03cf366b..54665c4ee 100644 --- a/translations/sk/.co-op-translator.json +++ b/translations/sk/.co-op-translator.json @@ -24,8 +24,8 @@ "language_code": "sk" }, "1-Introduction/3-fairness/README.md": { - "original_hash": "9a6b702d1437c0467e3c5c28d763dac2", - "translation_date": "2025-09-05T16:00:41+00:00", + "original_hash": "0f00d72169a0d37eecfd16d71e01700a", + "translation_date": "2026-07-14T06:05:35+00:00", "source_file": "1-Introduction/3-fairness/README.md", "language_code": "sk" }, @@ -54,8 +54,8 @@ "language_code": "sk" }, "2-Regression/1-Tools/README.md": { - "original_hash": "fa81d226c71d5af7a2cade31c1c92b88", - "translation_date": "2025-09-05T15:21:49+00:00", + "original_hash": "0b8635427b582d03ea4ab7089b93e505", + "translation_date": "2026-07-14T05:59:56+00:00", "source_file": "2-Regression/1-Tools/README.md", "language_code": "sk" }, @@ -72,8 +72,8 @@ "language_code": "sk" }, "2-Regression/2-Data/README.md": { - "original_hash": "7c077988328ebfe33b24d07945f16eca", - "translation_date": "2025-09-05T15:25:38+00:00", + "original_hash": "a58b2c4d16c6b122643391745ac15af6", + "translation_date": "2026-07-14T06:01:24+00:00", "source_file": "2-Regression/2-Data/README.md", "language_code": "sk" }, @@ -89,6 +89,12 @@ "source_file": "2-Regression/2-Data/solution/Julia/README.md", "language_code": "sk" }, + "2-Regression/2-Data/solution/notebook.ipynb": { + "original_hash": "96b95f8cf473481f2f371de8156f1571", + "translation_date": "2026-07-14T05:53:53+00:00", + "source_file": "2-Regression/2-Data/solution/notebook.ipynb", + "language_code": "sk" + }, "2-Regression/3-Linear/README.md": { "original_hash": "8b776e731c35b171d316d01d0e7b1369", "translation_date": "2026-04-26T19:08:20+00:00", @@ -457,7 +463,7 @@ }, "8-Reinforcement/1-QLearning/README.md": { "original_hash": "911efd5e595089000cb3c16fce1beab8", - "translation_date": "2025-09-05T16:40:14+00:00", + "translation_date": "2026-07-14T06:02:54+00:00", "source_file": "8-Reinforcement/1-QLearning/README.md", "language_code": "sk" }, @@ -481,7 +487,7 @@ }, "8-Reinforcement/2-Gym/README.md": { "original_hash": "107d5bb29da8a562e7ae72262d251a75", - "translation_date": "2025-09-05T16:46:17+00:00", + "translation_date": "2026-07-14T06:04:20+00:00", "source_file": "8-Reinforcement/2-Gym/README.md", "language_code": "sk" }, @@ -523,7 +529,7 @@ }, "9-Real-World/2-Debugging-ML-Models/README.md": { "original_hash": "df2b538e8fbb3e91cf0419ae2f858675", - "translation_date": "2025-09-05T15:55:18+00:00", + "translation_date": "2026-07-14T06:06:59+00:00", "source_file": "9-Real-World/2-Debugging-ML-Models/README.md", "language_code": "sk" }, @@ -581,6 +587,19 @@ "source_file": "TROUBLESHOOTING.md", "language_code": "sk" }, + "__translation_failures__": { + "sketchnotes/LICENSE.md": { + "original_hash": "fba3b94d88bfb9b81369b869a1e9a20f", + "source_file": "sketchnotes/LICENSE.md", + "language_code": "sk", + "failure_date": "2026-07-14T05:58:46+00:00", + "status": "failed", + "error_type": "TranslationIncompleteError", + "error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.", + "translator_version": "0.20.0", + "failure_policy_version": 1 + } + }, "docs/_sidebar.md": { "original_hash": "68dd06c685f6ce840e0acfa313352e7c", "translation_date": "2025-09-05T15:48:33+00:00", diff --git a/translations/sk/1-Introduction/3-fairness/README.md b/translations/sk/1-Introduction/3-fairness/README.md index c93b4cd85..2a9688f2c 100644 --- a/translations/sk/1-Introduction/3-fairness/README.md +++ b/translations/sk/1-Introduction/3-fairness/README.md @@ -1,134 +1,159 @@ -# Budovanie riešení strojového učenia s dôrazom na zodpovednú AI - -![Zhrnutie zodpovednej AI v strojovom učení v sketchnote](../../../../sketchnotes/ml-fairness.png) +# Budovanie riešení strojového učenia so zodpovednou AI + +![Prehľad zodpovednej AI v strojovom učení v sketchnote](../../../../translated_images/sk/ml-fairness.ef296ebec6afc98a.webp) > Sketchnote od [Tomomi Imura](https://www.twitter.com/girlie_mac) ## [Kvíz pred prednáškou](https://ff-quizzes.netlify.app/en/ml/) - + ## Úvod -V tomto kurze začnete objavovať, ako strojové učenie ovplyvňuje naše každodenné životy. Už teraz sú systémy a modely zapojené do rozhodovacích úloh, ako sú diagnostika v zdravotníctve, schvaľovanie úverov alebo odhaľovanie podvodov. Preto je dôležité, aby tieto modely fungovali spoľahlivo a poskytovali dôveryhodné výsledky. Rovnako ako akákoľvek softvérová aplikácia, aj systémy AI môžu zlyhať alebo mať nežiaduci výsledok. Preto je nevyhnutné rozumieť a vedieť vysvetliť správanie modelu AI. +V tomto učebnom pláne začnete objavovať, ako strojové učenie môže ovplyvňovať a ovplyvňuje náš každodenný život. Už teraz sú systémy a modely zapojené do denných rozhodovacích úloh, ako sú zdravotné diagnózy, schvaľovanie pôžičiek alebo detekcia podvodov. Preto je dôležité, aby tieto modely fungovali dobre a poskytovali dôveryhodné výsledky. Rovnako ako v prípade akéhokoľvek softvérového aplikovania, aj systémy AI môžu nesplniť očakávania alebo mať nežiaduci výsledok. Preto je nevyhnutné vedieť pochopiť a vysvetliť správanie AI modelu. -Predstavte si, čo sa môže stať, keď údaje, ktoré používate na vytvorenie týchto modelov, neobsahujú určité demografické skupiny, ako sú rasa, pohlavie, politické názory, náboženstvo, alebo ich neprimerane zastupujú. Čo ak je výstup modelu interpretovaný tak, že uprednostňuje určitú demografickú skupinu? Aké sú dôsledky pre aplikáciu? A čo sa stane, keď model má nepriaznivý výsledok a je škodlivý pre ľudí? Kto je zodpovedný za správanie systému AI? Toto sú niektoré otázky, ktoré budeme skúmať v tomto kurze. +Predstavte si, čo sa môže stať, keď dáta, ktoré používate na vytváranie týchto modelov, neobsahujú určité demografické údaje, ako je rasa, pohlavie, politický názor, náboženstvo, alebo neprimerane reprezentujú takéto demografické skupiny. Čo ak je výstup modelu interpretovaný tak, že uprednostňuje nejakú demografickú skupinu? Aké sú dôsledky pre aplikáciu? A čo sa stane, keď má model nepriaznivý výsledok a škodí ľuďom? Kto je zodpovedný za správanie AI systému? To sú niektoré otázky, ktoré v tomto kurzu preskúmame. -V tejto lekcii sa naučíte: +V tejto lekcii: -- Zvýšiť povedomie o dôležitosti spravodlivosti v strojovom učení a o škodách súvisiacich so spravodlivosťou. -- Oboznámiť sa s praxou skúmania odchýlok a neobvyklých scenárov na zabezpečenie spoľahlivosti a bezpečnosti. -- Získať pochopenie potreby posilniť všetkých prostredníctvom navrhovania inkluzívnych systémov. -- Preskúmať, aké dôležité je chrániť súkromie a bezpečnosť údajov a ľudí. -- Vidieť význam prístupu „sklenená krabica“ na vysvetlenie správania modelov AI. -- Byť si vedomý toho, ako je zodpovednosť kľúčová pre budovanie dôvery v systémy AI. +- Zvýšite si povedomie o význame spravodlivosti v strojovom učení a škodách súvisiacich so spravodlivosťou. +- Zoznámite sa s praxou skúmania odľahlých a neobvyklých scenárov na zabezpečenie spoľahlivosti a bezpečnosti. +- Získate pochopenie potreby posilniť každého navrhovaním inkluzívnych systémov. +- Preskúmate, aké je dôležité chrániť súkromie a bezpečnosť dát a ľudí. +- Uvidíte význam "skleneného boxu" na vysvetlenie správania AI modelov. +- Budete si uvedomovať, ako je zodpovednosť nevyhnutná na budovanie dôvery v AI systémy. -## Predpoklad +## Predpoklady -Ako predpoklad si prosím preštudujte „Zásady zodpovednej AI“ v rámci učebnej cesty a pozrite si nasledujúce video na túto tému: +Ako predpoklad si prosím prejdite „Princípy zodpovednej AI“ v Learn Path a pozrite si nižšie uvedené video k téme: -Viac o zodpovednej AI sa dozviete na tejto [učebnej ceste](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott). +Viac sa dozviete o Zodpovednej AI sledovaním tohto [Learning Path](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) -[![Prístup Microsoftu k zodpovednej AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Prístup Microsoftu k zodpovednej AI") +[![Microsoftov prístup k zodpovednej AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoft's Approach to Responsible AI") -> 🎥 Kliknite na obrázok vyššie pre video: Prístup Microsoftu k zodpovednej AI +> 🎥 Kliknite na obrázok vyššie pre video: Microsoftov prístup k zodpovednej AI ## Spravodlivosť -Systémy AI by mali zaobchádzať so všetkými spravodlivo a vyhnúť sa tomu, aby ovplyvňovali podobné skupiny ľudí rôznymi spôsobmi. Napríklad, keď systémy AI poskytujú odporúčania týkajúce sa lekárskej liečby, žiadostí o úver alebo zamestnania, mali by robiť rovnaké odporúčania všetkým s podobnými symptómami, finančnými okolnosťami alebo odbornými kvalifikáciami. Každý z nás ako človek nesie vrodené predsudky, ktoré ovplyvňujú naše rozhodnutia a činy. Tieto predsudky môžu byť zjavné v údajoch, ktoré používame na trénovanie systémov AI. Takáto manipulácia sa niekedy môže stať neúmyselne. Často je ťažké vedome rozpoznať, kedy do údajov zavádzame predsudky. +AI systémy by mali zaobchádzať so všetkými spravodlivo a vyhýbať sa tomu, aby rovnaké skupiny ľudí ovplyvňovali rôznym spôsobom. Napríklad, keď AI systémy poskytujú odporúčania o lekárskom ošetrení, žiadostiach o pôžičky alebo zamestnaní, mali by robiť rovnaké odporúčania všetkým s podobnými príznakmi, finančnými pomermi alebo profesijnými kvalifikáciami. Každý z nás ako ľudia nesie dedičné predsudky, ktoré ovplyvňujú naše rozhodnutia a konanie. Tieto predsudky môžu byť zjavné v dátach, ktoré používame na trénovanie AI systémov. Takéto manipulácie sa môžu niekedy stať neúmyselne. Často je ťažké vedome vedieť, kedy zavádzate predsudky do dát. -**„Nespravodlivosť“** zahŕňa negatívne dopady alebo „škody“ na skupinu ľudí, ako sú tí definovaní podľa rasy, pohlavia, veku alebo zdravotného postihnutia. Hlavné škody súvisiace so spravodlivosťou možno klasifikovať ako: +**„Nespravodlivosť“** zahŕňa negatívne dopady alebo „škody“ pre skupinu ľudí, napríklad definovaných podľa rasy, pohlavia, veku alebo statusu zdravotného postihnutia. Hlavné škody súvisiace so spravodlivosťou možno klasifikovať nasledovne: -- **Alokácia**, ak je napríklad uprednostnené jedno pohlavie alebo etnická skupina pred druhou. -- **Kvalita služby**. Ak trénujete údaje pre jeden konkrétny scenár, ale realita je oveľa zložitejšia, vedie to k zle fungujúcej službe. Napríklad dávkovač mydla, ktorý nedokázal rozpoznať ľudí s tmavou pokožkou. [Referencie](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) -- **Očierňovanie**. Nespravodlivé kritizovanie a označovanie niečoho alebo niekoho. Napríklad technológia označovania obrázkov neslávne označila obrázky ľudí s tmavou pokožkou ako gorily. -- **Nadmerné alebo nedostatočné zastúpenie**. Myšlienka, že určitá skupina nie je viditeľná v určitom povolaní, a akákoľvek služba alebo funkcia, ktorá to naďalej podporuje, prispieva k škode. -- **Stereotypizácia**. Priraďovanie preddefinovaných atribútov určitej skupine. Napríklad systém prekladu medzi angličtinou a turečtinou môže mať nepresnosti kvôli slovám so stereotypnými asociáciami k pohlaviu. +- **Pridelenie**, ak je napríklad pohlavie alebo etnicita uprednostňovaná pred iným. +- **Kvalita služby**. Ak trénujete dáta iba pre jeden špecifický scenár, ale realita je oveľa zložitejšia, vedie to k zlej výkonnosti služby. Napríklad dávkovač tekutého mydla, ktorý nevedel rozpoznať osoby s tmavou pokožkou. [Referencie](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) +- **Očierňovanie**. Nespravodlivo kritizovať a označovať niečo alebo niekoho. Napríklad technológia označovania obrázkov nesprávne označila obrázky tmavších ľudí ako gorily. +- **Nad- alebo podreprezentácia**. Myšlienka je, že určitá skupina nie je v určitej profesii viditeľná a akákoľvek služba alebo funkcia, ktorá to podporuje, prispieva ku škode. +- **Stereotypy**. Spájanie určitej skupiny s prednastavenými atribútmi. Napríklad systém prekladu medzi angličtinou a turečtinou môže mať nepresnosti v dôsledku slov so stereotypnými spojením s pohlavím. -![preklad do turečtiny](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png) +![preklad do turečtiny](../../../../translated_images/sk/gender-bias-translate-en-tr.f185fd8822c2d437.webp) > preklad do turečtiny -![preklad späť do angličtiny](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) +![preklad späť do angličtiny](../../../../translated_images/sk/gender-bias-translate-tr-en.4eee7e3cecb8c70e.webp) > preklad späť do angličtiny -Pri navrhovaní a testovaní systémov AI musíme zabezpečiť, že AI je spravodlivá a nie je naprogramovaná na prijímanie zaujatých alebo diskriminačných rozhodnutí, ktoré sú zakázané aj pre ľudí. Zaručenie spravodlivosti v AI a strojovom učení zostáva komplexnou sociotechnickou výzvou. +Pri navrhovaní a testovaní AI systémov musíme zabezpečiť, že AI je spravodlivá a nie je naprogramovaná robiť zaujaté alebo diskriminačné rozhodnutia, ktoré sú pre ľudí tiež zakázané. Zabezpečiť spravodlivosť v AI a strojovom učení je komplexná sociotechnická výzva. ### Spoľahlivosť a bezpečnosť -Na budovanie dôvery musia byť systémy AI spoľahlivé, bezpečné a konzistentné za normálnych aj neočakávaných podmienok. Je dôležité vedieť, ako sa systémy AI budú správať v rôznych situáciách, najmä keď ide o odchýlky. Pri budovaní riešení AI je potrebné venovať značnú pozornosť tomu, ako zvládnuť širokú škálu okolností, s ktorými sa riešenia AI môžu stretnúť. Napríklad autonómne auto musí klásť bezpečnosť ľudí na prvé miesto. Výsledkom je, že AI poháňajúca auto musí zohľadniť všetky možné scenáre, s ktorými sa auto môže stretnúť, ako sú noc, búrky alebo snehové búrky, deti bežiace cez ulicu, domáce zvieratá, cestné práce atď. To, ako dobre systém AI dokáže spoľahlivo a bezpečne zvládnuť širokú škálu podmienok, odráža úroveň predvídavosti, ktorú dátový vedec alebo vývojár AI zohľadnil počas návrhu alebo testovania systému. +Na vybudovanie dôvery musia byť AI systémy spoľahlivé, bezpečné a konzistentné za bežných aj neočakávaných podmienok. Je dôležité vedieť, ako sa AI systémy budú správať v rôznych situáciách, hlavne keď sú to odľahlé prípady. Pri vytváraní AI riešení musí byť veľký dôraz na to, ako riešiť široké spektrum okolností, s ktorými sa AI riešenia stretnú. Napríklad samo-riadiace auto musí klásť bezpečnosť ľudí na prvé miesto. Výkonná AI auta musí zvážiť všetky možné scenáre, ako napríklad noc, búrky alebo snehové víchrice, deti bežiace cez cestu, domáce zvieratá, cestné práce atď. Ako dobre môže AI systém spoľahlivo a bezpečne zvládnuť širokú škálu podmienok, odráža mieru predvídavosti, ktorú dátový vedec alebo AI vývojár bral do úvahy pri navrhovaní alebo testovaní systému. -> [🎥 Kliknite sem pre video: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) +> [🎥 Kliknite tu pre video: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) ### Inkluzívnosť -Systémy AI by mali byť navrhnuté tak, aby zapájali a posilňovali každého. Pri navrhovaní a implementácii systémov AI dátoví vedci a vývojári AI identifikujú a riešia potenciálne bariéry v systéme, ktoré by mohli neúmyselne vylúčiť ľudí. Napríklad na svete je 1 miliarda ľudí so zdravotným postihnutím. Vďaka pokroku v AI môžu ľahšie pristupovať k širokému spektru informácií a príležitostí vo svojom každodennom živote. Riešením bariér sa vytvárajú príležitosti na inovácie a vývoj produktov AI s lepšími skúsenosťami, ktoré prospievajú všetkým. +AI systémy by mali byť navrhnuté tak, aby zapojili a posilnili všetkých. Pri navrhovaní a implementácii AI systémov dátoví vedci a vývojári AI identifikujú a riešia potenciálne prekážky v systéme, ktoré by mohli neúmyselne vylúčiť ľudí. Napríklad na svete je 1 miliarda ľudí so zdravotným postihnutím. Vďaka pokroku AI môžu vo svojom každodennom živote ľahšie získať prístup k širokej škále informácií a príležitostí. Riešením prekážok sa vytvárajú príležitosti inovácií a vývoja AI produktov s lepším používateľským zážitkom, ktorý prospieva všetkým. -> [🎥 Kliknite sem pre video: inkluzívnosť v AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v) +> [🎥 Kliknite tu pre video: inkluzívnosť v AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v) ### Bezpečnosť a súkromie -Systémy AI by mali byť bezpečné a rešpektovať súkromie ľudí. Ľudia majú menšiu dôveru v systémy, ktoré ohrozujú ich súkromie, informácie alebo životy. Pri trénovaní modelov strojového učenia sa spoliehame na údaje, aby sme dosiahli čo najlepšie výsledky. Pri tom je potrebné zvážiť pôvod údajov a ich integritu. Napríklad, boli údaje poskytnuté používateľom alebo verejne dostupné? Ďalej, pri práci s údajmi je nevyhnutné vyvíjať systémy AI, ktoré dokážu chrániť dôverné informácie a odolávať útokom. Ako sa AI stáva rozšírenejšou, ochrana súkromia a zabezpečenie dôležitých osobných a obchodných informácií sa stáva čoraz kritickejšou a zložitejšou. Problémy so súkromím a bezpečnosťou údajov si vyžadujú obzvlášť dôkladnú pozornosť pri AI, pretože prístup k údajom je nevyhnutný na to, aby systémy AI mohli robiť presné a informované predpovede a rozhodnutia o ľuďoch. +AI systémy by mali byť bezpečné a rešpektovať súkromie ľudí. Ľudia menej dôverujú systémom, ktoré ohrozujú ich súkromie, informácie alebo životy. Pri trénovaní modelov strojového učenia sa spoliehame na dáta, aby sme dosiahli najlepšie výsledky. Pri tom je dôležité zohľadniť pôvod dát a ich integritu. Napríklad, boli dáta od používateľov alebo verejne dostupné? Pri práci s dátami je zásadné vyvíjať AI systémy, ktoré dokážu chrániť dôverné informácie a odolať útokom. Ako AI získava na rozšírení, ochrana súkromia a zabezpečenie dôležitých osobných a obchodných informácií sa stáva kritickejšou a zložitejšou. Otázky súkromia a bezpečnosti dát vyžadujú osobitnú pozornosť, pretože prístup k dátam je pre AI nevyhnutný na presné a informované predpovede a rozhodnutia o ľuďoch. -> [🎥 Kliknite sem pre video: bezpečnosť v AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) +> [🎥 Kliknite tu pre video: bezpečnosť v AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) -- Ako odvetvie sme dosiahli významný pokrok v oblasti súkromia a bezpečnosti, výrazne podporený reguláciami, ako je GDPR (Všeobecné nariadenie o ochrane údajov). -- Napriek tomu musíme pri systémoch AI uznať napätie medzi potrebou viac osobných údajov na zlepšenie systémov a ochranou súkromia. -- Rovnako ako pri vzniku pripojených počítačov s internetom, zaznamenávame aj výrazný nárast počtu bezpečnostných problémov súvisiacich s AI. -- Zároveň sme videli, že AI sa používa na zlepšenie bezpečnosti. Napríklad väčšina moderných antivírusových skenerov je dnes poháňaná heuristikou AI. -- Musíme zabezpečiť, aby naše procesy dátovej vedy harmonicky ladili s najnovšími praktikami v oblasti súkromia a bezpečnosti. +- Ako odvetvie sme dosiahli významné pokroky v oblasti súkromia a bezpečnosti, výrazne poháňané reguláciami ako GDPR (Všeobecné nariadenie o ochrane údajov). +- Avšak u AI systémov musíme uznať napätie medzi potrebou viac osobných dát na personalizovanie a zvýšenie efektívnosti systémov a ochranou súkromia. +- Rovnako ako pri nástupe pripojených počítačov s internetom, pozorujeme prudký nárast bezpečnostných problémov súvisiacich s AI. +- Zároveň sme videli, že AI sa používa na zlepšenie bezpečnosti. Napríklad väčšina moderných antivírusových skenerov je dnes riadená AI heuristikou. +- Musíme zabezpečiť, aby naše procesy dátovej vedy harmonicky zapadali do najnovších postupov ochrany súkromia a bezpečnosti. -### Transparentnosť -Systémy AI by mali byť zrozumiteľné. Kľúčovou súčasťou transparentnosti je vysvetlenie správania systémov AI a ich komponentov. Zlepšenie porozumenia systémom AI si vyžaduje, aby zainteresované strany pochopili, ako a prečo fungujú, aby mohli identifikovať potenciálne problémy s výkonom, obavy o bezpečnosť a súkromie, predsudky, vylučujúce praktiky alebo neúmyselné výsledky. Veríme tiež, že tí, ktorí používajú systémy AI, by mali byť úprimní a otvorení o tom, kedy, prečo a ako sa rozhodnú ich nasadiť. Rovnako ako o obmedzeniach systémov, ktoré používajú. Napríklad, ak banka používa systém AI na podporu svojich rozhodnutí o poskytovaní úverov, je dôležité preskúmať výsledky a pochopiť, ktoré údaje ovplyvňujú odporúčania systému. Vlády začínajú regulovať AI naprieč odvetviami, takže dátoví vedci a organizácie musia vysvetliť, či systém AI spĺňa regulačné požiadavky, najmä keď dôjde k nežiaducemu výsledku. +### Transparentnosť +AI systémy by mali byť pochopiteľné. Kľúčovou súčasťou transparentnosti je vysvetlenie správania AI systémov a ich komponentov. Zlepšenie porozumenia AI systémov si vyžaduje, aby zainteresované strany pochopili, ako a prečo fungujú tak, aby mohli identifikovať potenciálne problémy s výkonom, bezpečnosťou a súkromím, predsudkami, vylučovacími praktikami alebo neúmyselnými výsledkami. Veríme aj, že tí, ktorí AI systémy používajú, by mali byť čestní a otvorení o tom, kedy, prečo a ako sa rozhodujú ich nasadiť. Rovnako o obmedzeniach systémov, ktoré používajú. Napríklad, ak banka používa AI systém na podporu rozhodnutí o úveroch pre spotrebiteľov, je dôležité preskúmať výsledky a pochopiť, ktoré dáta ovplyvňujú odporúčania systému. Vládne orgány začínajú regulovať AI naprieč odvetviami, preto dátoví vedci a organizácie musia vysvetliť, či AI systém spĺňa regulačné požiadavky, najmä ak nastane nežiaduci výsledok. -> [🎥 Kliknite sem pre video: transparentnosť v AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) +> [🎥 Kliknite tu pre video: transparentnosť v AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) -- Keďže systémy AI sú veľmi komplexné, je ťažké pochopiť, ako fungujú a interpretovať výsledky. -- Tento nedostatok porozumenia ovplyvňuje spôsob, akým sú tieto systémy spravované, prevádzkované a dokumentované. -- Tento nedostatok porozumenia ešte dôležitejšie ovplyvňuje rozhodnutia prijaté na základe výsledkov, ktoré tieto systémy produkujú. +- Pretože AI systémy sú veľmi komplexné, je ťažké pochopiť, ako fungujú a interpretovať výsledky. +- Tento nedostatok porozumenia ovplyvňuje spôsob, akým sú tieto systémy riadené, operacionalizované a dokumentované. +- Tento nedostatok porozumenia predovšetkým ovplyvňuje rozhodnutia prijaté na základe výsledkov, ktoré tieto systémy produkujú. ### Zodpovednosť + +Ľudia, ktorí navrhujú a nasadzujú AI systémy, musia byť zodpovední za to, ako ich systémy fungujú. Potreba zodpovednosti je obzvlášť dôležitá pri citlivých technológiách, ako je rozpoznávanie tvárí. V poslednej dobe rastie dopyt po technológii rozpoznávania tvárí, najmä od orgánov činných v trestnom konaní, ktoré vidia potenciál tejto technológie pri hľadaní chýbajúcich detí. Avšak tieto technológie by mohli byť tiež zneužité vládou na ohrozenie základných slobôd občanov, napríklad umožnením nepretržitého sledovania určitých jednotlivcov. Preto dátoví vedci a organizácie musia byť zodpovední za to, ako ich AI systém ovplyvňuje jednotlivcov alebo spoločnosť. + +[![Vedúci výskumník AI varuje pred masovým dohľadom cez rozpoznávanie tvárí](../../../../translated_images/sk/accountability.41d8c0f4b85b6231.webp)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoft's Approach to Responsible AI") + +> 🎥 Kliknite na obrázok vyššie pre video: Varovania pred masovým dohľadom cez rozpoznávanie tvárí + +Nakoniec jedna z najväčších otázok pre našu generáciu, ako prvej generácie, ktorá prináša AI do spoločnosti, je, ako zabezpečiť, aby počítače zostali zodpovedné ľuďom a ako zabezpečiť, aby ľudia, ktorí počítače navrhujú, zostali zodpovední voči všetkým ostatným. + +## Hodnotenie dopadov + +Pred trénovaním modelu strojového učenia je dôležité vykonať hodnotenie dopadu, aby ste pochopili účel AI systému; na čo sa má používať; kde bude nasadený; a kto bude so systémom interagovať. To pomáha recenzentom alebo testerom hodnotiť systém a vedieť, aké faktory zohľadniť pri identifikovaní potenciálnych rizík a očakávaných dôsledkov. + +Nasledujúce oblasti sa zameriavajú pri vykonávaní hodnotenia dopadu: + +* **Nepriaznivý dopad na jednotlivcov**. Byť si vedomý akýchkoľvek obmedzení alebo požiadaviek, nepodporovaného použitia alebo akýchkoľvek známych limitácií, ktoré bránia výkonu systému, je nevyhnutné, aby sa zabezpečilo, že systém nebude používaný spôsobom, ktorý by mohol spôsobiť škodu jednotlivcom. +* **Požiadavky na dáta**. Získať pochopenie toho, ako a kde bude systém používať dáta, umožňuje recenzentom preskúmať všetky požiadavky na dáta, ktoré by ste mali mať na pamäti (napríklad GDPR alebo HIPAA). Navyše zvážte, či je zdroj alebo množstvo dát postačujúce pre trénovanie. +* **Zhrnutie dopadov**. Zhromaždite zoznam potenciálnych škôd, ktoré by mohli vzniknúť používaním systému. V priebehu celého životného cyklu ML skontrolujte, či boli identifikované problémy zmiernené alebo riešené. +* **Platné ciele** pre každý zo šiestich základných princípov. Zhodnoťte, či sú ciele z každého princípu splnené a či existujú nejaké medzery. + -Ľudia, ktorí navrhujú a nasadzujú systémy AI, musia byť zodpovední za to, ako ich systémy fungujú. Potreba zodpovednosti je obzvlášť dôležitá pri technológiách citlivého použitia, ako je rozpoznávanie tváre. V poslednej dobe rastie dopyt po technológii rozpoznávania tváre, najmä zo strany orgánov činných v trestnom konaní, ktoré vidia potenciál tejto technológie v aplikáciách, ako je hľadanie nezvestných detí. Tieto technológie však môžu byť potenciálne použité vládou na ohrozenie základných slobôd občanov, napríklad umožnením nepretržitého sledovania konkrétnych jednotlivcov. Preto musia byť dátoví vedci a organizácie zodpovední za to, ako ich systém AI ovplyvňuje jednotlivcov alebo spoločnosť. +## Ladenie s ohľadom na zodpovednú AI -[![Vedúci výskumník AI varuje pred masovým sledovaním prostredníctvom rozpoznávania tváre](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Prístup Microsoftu k zodpovednej AI") +Podobne ako ladenie softvérovej aplikácie, ladenie AI systému je potrebný proces identifikácie a riešenia problémov v systéme. Existuje mnoho faktorov, ktoré by mohli ovplyvniť výkon modelu spôsobom, ktorý nie je očakávaný alebo zodpovedný. Väčšina tradičných metrík výkonnosti modelov sú kvantitatívne agregáty výkonu modelu, ktoré nie sú dostatočné na analýzu, ako model porušuje princípy zodpovednej AI. Ďalej je model strojového učenia čierna skrinka a ťažko sa chápe, čo ovplyvňuje jeho výsledky alebo poskytuje vysvetlenie, keď urobí chybu. Neskôr v tomto kurze sa naučíme, ako používať dashboard Zodpovednej AI na ladenie AI systémov. Dashboard poskytuje komplexný nástroj pre dátových vedcov a AI vývojárov na vykonávanie: -> 🎥 Kliknite na obrázok vyššie pre video: Varovania pred masovým sledovaním prostredníctvom rozpoznávania tváre +* **Analýzy chýb**. Na identifikovanie rozloženia chýb modelu, ktoré môžu ovplyvniť spravodlivosť alebo spoľahlivosť systému. +* **Prehľadu modelu**. Na zistenie, kde existujú rozdiely vo výkonnosti modelu medzi jednotlivými dátovými skupinami. +* **Analýzy dát**. Na pochopenie rozloženia dát a identifikáciu možných predsudkov v dátach, ktoré by mohli viesť k problémom so spravodlivosťou, inkluzívnosťou a spoľahlivosťou. +* **Interpretovateľnosti modelu**. Na pochopenie, čo ovplyvňuje alebo riadi modelové predpovede. To pomáha vysvetliť správanie modelu, čo je dôležité pre transparentnosť a zodpovednosť. -Nakoniec jednou z najväčších otázok našej generácie, ako prvej generácie, ktorá prináša AI do spoločnosti, je, ako zabezpečiť, aby počítače zostali zodpovedné voči ľuďom a ako zabezpečiť, aby ľudia, ktorí navrhujú počítače, zostali zodpovední voči všetkým ostatným. -## Hodnotenie dopadu +## 🚀 Výzva + +Aby sme predišli vzniku škôd, mali by sme: -Pred trénovaním modelu strojového učenia je dôležité vykonať hodnotenie dopadu, aby ste pochopili účel systému AI; aké je jeho zamýšľané použitie; kde bude nasadený; a kto bude so systémom interagovať. Tieto informácie sú užitočné pre recenzentov alebo testerov, ktorí hodnotia systém, aby vedeli, aké faktory treba zohľadniť pri identifikácii potenciálnych rizík a očakávaných dôsledkov. +- mať rozmanitosť pozadí a pohľadov medzi ľuďmi pracujúcimi na systémoch +- investovať do datasetov, ktoré odrážajú rozmanitosť našej spoločnosti +- vyvíjať lepšie metódy počas celého životného cyklu strojového učenia na detekciu a opravu zodpovednej AI, keď k nej dôjde -Nasledujú oblasti zamerania pri vykonávaní hodnotenia dopadu: +Premýšľajte o reálnych scenároch, kde je nedôvera v model zrejmá pri tvorbe a používaní modelu. Čo ešte by sme mali zvážiť? -* **Nepriaznivý dopad na jednotlivcov**. Byť si vedomý akýchkoľvek obmedzení alebo požiadaviek, nepodporovaného použitia alebo akýchkoľvek známych obmedzení, ktoré bránia výkonu systému, je zásadné na zabezpečenie toho, aby systém nebol používaný spôsobom, ktorý by mohol spôsobiť škodu jednotlivcom. -* **Požiadavky na údaje**. Získanie pochopenia toho, ako a kde systém bude používať údaje, umožňuje recenzentom preskúmať akékoľvek požiadavky na údaje, na ktoré by ste mali byť pozorní (napr. GDPR alebo HIPPA regulácie údajov). Okrem toho preskúmajte, či je zdroj alebo množstvo údajov dostatočné na trénovanie. -* **Zhrnutie dopadu**. Zozbierajte zoznam potenciálnych škôd, ktoré by mohli vzniknúť z používania systému. Počas životného cyklu ML preskúmajte, či sú identifikované problémy zmiernené alebo riešené. -* **Platné ciele** pre každú zo šiestich základných zásad. Posúďte, či sú ciele z každej zásady splnené a či existujú nejaké medzery. +## [Kvíz po prednáške](https://ff-quizzes.netlify.app/en/ml/) -## Ladenie so zodpovednou AI +## Revízia a samostatné štúdium + -Podobne ako ladenie softvérovej aplikácie, ladenie systému AI je nevyhnutný proces identifikácie a riešenia problémov v systéme. Existuje mnoho faktorov, ktoré môžu ovplyvniť, že model nefunguje podľa očakávaní alebo zodpovedne. Väčšina tradičných metrík výkonu modelu sú kvantitatívne agregáty výkonu modelu, ktoré nie sú dostatočné -Pozrite si tento workshop, aby ste sa hlbšie ponorili do tém: +V tejto lekcii ste sa naučili niektoré základy konceptov spravodlivosti a nespravodlivosti v strojovom učení. + +Pozrite si tento workshop, aby ste sa hlbšie ponorili do tém: -- Na ceste k zodpovednej AI: Uplatnenie princípov v praxi od Besmiry Nushi, Mehrnoosh Sameki a Amita Sharmu +- V snahe o zodpovednú umelú inteligenciu: Prinášanie princípov do praxe od Besmira Nushi, Mehrnoosh Sameki a Amit Sharma -[![Responsible AI Toolbox: Open-source framework na budovanie zodpovednej AI](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Open-source framework na budovanie zodpovednej AI") +[![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") -> 🎥 Kliknite na obrázok vyššie pre video: RAI Toolbox: Open-source framework na budovanie zodpovednej AI od Besmiry Nushi, Mehrnoosh Sameki a Amita Sharmu +> 🎥 Kliknite na obrázok vyššie pre video: RAI Toolbox: Open-source framework pre budovanie zodpovednej umelej inteligencie od Besmira Nushi, Mehrnoosh Sameki a Amit Sharma -Prečítajte si tiež: +Tiež si prečítajte: -- Microsoftov zdrojový centrum pre zodpovednú AI: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) +- Centrum zdrojov RAI od Microsoftu: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) -- Microsoftova výskumná skupina FATE: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) +- Výskumná skupina FATE od Microsoftu: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) -RAI Toolbox: +RAI Toolbox: -- [GitHub repozitár Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox) +- [GitHub úložisko Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox) Prečítajte si o nástrojoch Azure Machine Learning na zabezpečenie spravodlivosti: -- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) +- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) ## Zadanie @@ -136,5 +161,7 @@ Prečítajte si o nástrojoch Azure Machine Learning na zabezpečenie spravodliv --- -**Zrieknutie sa zodpovednosti**: -Tento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nenesieme zodpovednosť za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. \ No newline at end of file + +**Vyhlásenie o zodpovednosti**: +Tento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. + \ No newline at end of file diff --git a/translations/sk/2-Regression/1-Tools/README.md b/translations/sk/2-Regression/1-Tools/README.md index d4441aaf4..10c17836f 100644 --- a/translations/sk/2-Regression/1-Tools/README.md +++ b/translations/sk/2-Regression/1-Tools/README.md @@ -1,119 +1,119 @@ -# Začíname s Pythonom a Scikit-learn pre regresné modely +# Začnite s Pythonom a Scikit-learn pre regresné modely -![Zhrnutie regresií v sketchnote](../../../../sketchnotes/ml-regression.png) +![Zhrnutie regresií v skicnote](../../../../translated_images/sk/ml-regression.4e4f70e3b3ed446e.webp) -> Sketchnote od [Tomomi Imura](https://www.twitter.com/girlie_mac) +> Skicnote od [Tomomi Imura](https://www.twitter.com/girlie_mac) -## [Kvíz pred prednáškou](https://ff-quizzes.netlify.app/en/ml/) +## [Začiatočný kvíz pred prednáškou](https://ff-quizzes.netlify.app/en/ml/) > ### [Táto lekcia je dostupná aj v R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) ## Úvod -V týchto štyroch lekciách sa naučíte, ako vytvárať regresné modely. Čoskoro si vysvetlíme, na čo slúžia. Ale predtým, než začnete, uistite sa, že máte správne nástroje na začatie procesu! +V týchto štyroch lekciách zistíte, ako stavať regresné modely. O chvíľu si povieme, na čo slúžia. Ale predtým, ako začnete, sa uistite, že máte pripravené správne nástroje na začatie procesu! V tejto lekcii sa naučíte: -- Ako nakonfigurovať váš počítač na lokálne úlohy strojového učenia. -- Ako pracovať s Jupyter notebookmi. -- Ako používať Scikit-learn, vrátane jeho inštalácie. -- Preskúmať lineárnu regresiu prostredníctvom praktického cvičenia. +- Nastaviť svoj počítač na lokálne úlohy strojového učenia. +- Pracovať s Jupyter Notebookmi. +- Používať Scikit-learn vrátane inštalácie. +- Preskúmať lineárnu regresiu pomocou praktického cvičenia. ## Inštalácie a konfigurácie -[![ML pre začiatočníkov - Nastavte si nástroje na vytváranie modelov strojového učenia](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML pre začiatočníkov - Nastavte si nástroje na vytváranie modelov strojového učenia") +[![ML pre začiatočníkov - Pripravte si nástroje na tvorbu modelov strojového učenia](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML pre začiatočníkov - Pripravte si nástroje na tvorbu modelov strojového učenia") -> 🎥 Kliknite na obrázok vyššie pre krátke video o konfigurácii vášho počítača pre ML. +> 🎥 Kliknite na obrázok vyššie pre krátke video o nastavení počítača pre ML. -1. **Nainštalujte Python**. Uistite sa, že máte [Python](https://www.python.org/downloads/) nainštalovaný na vašom počítači. Python budete používať na mnohé úlohy v oblasti dátovej vedy a strojového učenia. Väčšina počítačových systémov už obsahuje inštaláciu Pythonu. K dispozícii sú aj užitočné [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott), ktoré uľahčujú nastavenie pre niektorých používateľov. +1. **Nainštalujte Python**. Uistite sa, že máte na počítači nainštalovaný [Python](https://www.python.org/downloads/). Python použijete na mnohé úlohy v dátovej vede a strojovom učení. Väčšina počítačových systémov už obsahuje inštaláciu Pythonu. Existujú tiež užitočné [Python Coding Packy](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott), ktoré uľahčujú nastavenie niektorým používateľom. - Niektoré použitia Pythonu však vyžadujú jednu verziu softvéru, zatiaľ čo iné vyžadujú inú verziu. Z tohto dôvodu je užitočné pracovať v [virtuálnom prostredí](https://docs.python.org/3/library/venv.html). + Niektoré použitia Pythonu však vyžadujú rôzne verzie softvéru. Preto je užitočné pracovať vo [virtuálnom prostredí](https://docs.python.org/3/library/venv.html). -2. **Nainštalujte Visual Studio Code**. Uistite sa, že máte Visual Studio Code nainštalovaný na vašom počítači. Postupujte podľa týchto pokynov na [inštaláciu Visual Studio Code](https://code.visualstudio.com/) pre základnú inštaláciu. V tomto kurze budete používať Python vo Visual Studio Code, takže by ste si mohli osviežiť, ako [konfigurovať Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) pre vývoj v Pythone. +2. **Nainštalujte Visual Studio Code**. Uistite sa, že máte na počítači nainštalovaný Visual Studio Code. Postupujte podľa týchto inštrukcií na [inštaláciu Visual Studio Code](https://code.visualstudio.com/) pre základnú inštaláciu. V tomto kurze budete používať Python vo Visual Studio Code, preto možno budete chcieť osviežiť si, ako [nastaviť Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) pre vývoj v Pythone. - > Získajte pohodlie s Pythonom prostredníctvom tejto kolekcie [Learn modulov](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) + > Precvičujte si Python prostredníctvom tejto kolekcie [Learn modulov](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) > - > [![Nastavenie Pythonu vo Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Nastavenie Pythonu vo Visual Studio Code") + > [![Nastavenie Pythonu s Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Nastavenie Pythonu s Visual Studio Code") > - > 🎥 Kliknite na obrázok vyššie pre video: používanie Pythonu vo VS Code. + > 🎥 Kliknite na obrázok vyššie pre video o používaní Pythonu vo VS Code. -3. **Nainštalujte Scikit-learn**, podľa [týchto pokynov](https://scikit-learn.org/stable/install.html). Keďže je potrebné zabezpečiť, že používate Python 3, odporúča sa používať virtuálne prostredie. Ak inštalujete túto knižnicu na M1 Mac, na stránke vyššie sú špeciálne pokyny. +3. **Nainštalujte Scikit-learn**, postupujte podľa [týchto inštrukcií](https://scikit-learn.org/stable/install.html). Keďže musíte použiť Python 3, odporúča sa použiť virtuálne prostredie. Poznámka: ak inštalujete túto knižnicu na M1 Macu, na vyššie uvedenej stránke sú špeciálne inštrukcie. -4. **Nainštalujte Jupyter Notebook**. Budete potrebovať [nainštalovať balík Jupyter](https://pypi.org/project/jupyter/). +1. **Nainštalujte Jupyter Notebook**. Budete potrebovať [nainštalovať balík Jupyter](https://pypi.org/project/jupyter/). -## Vaše prostredie na tvorbu ML +## Vaše prostredie na písanie kódu pre ML -Budete používať **notebooky** na vývoj vášho Python kódu a vytváranie modelov strojového učenia. Tento typ súboru je bežným nástrojom pre dátových vedcov a je možné ho identifikovať podľa jeho prípony `.ipynb`. +Budete používať **notebooky** na vyvíjanie vášho Python kódu a tvorbu modelov strojového učenia. Tento typ súboru je bežný nástroj pre dátových vedcov a ľahko ho spoznáte podľa prípony `.ipynb`. -Notebooky sú interaktívne prostredie, ktoré umožňuje vývojárovi kódovať, pridávať poznámky a písať dokumentáciu okolo kódu, čo je veľmi užitočné pre experimentálne alebo výskumné projekty. +Notebooky sú interaktívne prostredie, ktoré umožňuje vývojárovi písať kód, pridávať poznámky a dokumentáciu okolo kódu, čo je veľmi užitočné pre experimentálne alebo výskumné projekty. -[![ML pre začiatočníkov - Nastavenie Jupyter Notebookov na začatie vytvárania regresných modelov](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML pre začiatočníkov - Nastavenie Jupyter Notebookov na začatie vytvárania regresných modelov") +[![ML pre začiatočníkov - Nastavte Jupyter Notebooky na začatie budovania regresných modelov](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML pre začiatočníkov - Nastavte Jupyter Notebooky na začatie budovania regresných modelov") -> 🎥 Kliknite na obrázok vyššie pre krátke video o tomto cvičení. +> 🎥 Kliknite na obrázok vyššie pre krátke video s týmto cvičením. ### Cvičenie - práca s notebookom -V tejto zložke nájdete súbor _notebook.ipynb_. +V tomto priečinku nájdete súbor _notebook.ipynb_. 1. Otvorte _notebook.ipynb_ vo Visual Studio Code. - Spustí sa Jupyter server s Pythonom 3+. Nájdete oblasti notebooku, ktoré je možné `spustiť`, kúsky kódu. Môžete spustiť blok kódu výberom ikony, ktorá vyzerá ako tlačidlo prehrávania. + Spustí sa Jupyter server s Python 3+. V notebooku nájdete časti, ktoré môžete `spustiť`, kusy kódu. Môžete spustiť blok kódu výberom ikony vyzerajúcej ako tlačidlo prehrávania. -2. Vyberte ikonu `md` a pridajte trochu markdownu, a nasledujúci text **# Vitajte vo vašom notebooku**. +1. Vyberte ikonu `md` a pridajte trochu markdownu, napríklad tento text **# Vitajte vo vašom notebooku**. - Potom pridajte nejaký Python kód. + Potom pridajte niekoľko riadkov Python kódu. -3. Napíšte **print('hello notebook')** do bloku kódu. -4. Vyberte šípku na spustenie kódu. +1. Napíšte **print('hello notebook')** do bloku kódu. +1. Vyberte šípku na spustenie kódu. - Mali by ste vidieť vytlačené vyhlásenie: + Mali by ste vidieť tlačený výstup: ```output hello notebook ``` -![VS Code s otvoreným notebookom](../../../../2-Regression/1-Tools/images/notebook.jpg) +![VS Code s otvoreným notebookom](../../../../translated_images/sk/notebook.4a3ee31f396b8832.webp) -Môžete prekladať váš kód s komentármi na samo-dokumentovanie notebooku. +Môžete miešať kód s komentármi pre vlastnú dokumentáciu notebooku. -✅ Zamyslite sa na chvíľu nad tým, aké odlišné je pracovné prostredie webového vývojára oproti dátovému vedcovi. +✅ Zamyslite sa chvíľu, ako veľmi sa líši pracovné prostredie webového vývojára od toho dátového vedca. -## Práca so Scikit-learn +## Začnite používať Scikit-learn -Teraz, keď je Python nastavený vo vašom lokálnom prostredí a ste pohodlní s Jupyter notebookmi, poďme sa rovnako oboznámiť so Scikit-learn (vyslovujte `sci` ako v `science`). Scikit-learn poskytuje [rozsiahle API](https://scikit-learn.org/stable/modules/classes.html#api-ref), ktoré vám pomôže vykonávať úlohy strojového učenia. +Teraz keď máte Python nastavený vo vašom lokálnom prostredí a v Jupyter Notebookoch sa cítite pohodlne, zoznámime sa rovnako dobre so Scikit-learn (vyslovujte `sci` ako v slove `science`). Scikit-learn poskytuje [rozsiahle API](https://scikit-learn.org/stable/modules/classes.html#api-ref), ktoré vám pomôže vykonávať úlohy strojového učenia. -Podľa ich [webovej stránky](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn je open source knižnica strojového učenia, ktorá podporuje učenie pod dohľadom a bez dohľadu. Poskytuje tiež rôzne nástroje na prispôsobenie modelov, predspracovanie dát, výber modelov a hodnotenie, a mnoho ďalších užitočných funkcií." +Podľa ich [webovej stránky](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn je open source knižnica strojového učenia, ktorá podporuje riadené aj neriadené učenie. Poskytuje tiež rôzne nástroje na prispôsobenie modelu, predspracovanie dát, výber a hodnotenie modelu a mnoho ďalších utilít." -V tomto kurze budete používať Scikit-learn a ďalšie nástroje na vytváranie modelov strojového učenia na vykonávanie toho, čo nazývame 'tradičné úlohy strojového učenia'. Úmyselne sme sa vyhli neurónovým sieťam a hlbokému učeniu, pretože sú lepšie pokryté v našom pripravovanom kurikule 'AI pre začiatočníkov'. +V tomto kurze budete používať Scikit-learn a ďalšie nástroje na tvorbu modelov strojového učenia na vykonávanie úloh nazývaných „tradičné strojové učenie“. Úmyselne sme vylúčili neurónové siete a hlboké učenie, pretože tie sú lepšie pokryté v našom pripravovanom kurze „AI pre začiatočníkov“. -Scikit-learn umožňuje jednoduché vytváranie modelov a ich hodnotenie na použitie. Primárne sa zameriava na používanie numerických dát a obsahuje niekoľko pripravených datasetov na použitie ako učebné nástroje. Obsahuje tiež predpripravené modely, ktoré si študenti môžu vyskúšať. Poďme preskúmať proces načítania predpripravených dát a použitia zabudovaného odhadovača na prvý ML model so Scikit-learn s niektorými základnými dátami. +Scikit-learn umožňuje jednoduché vytváranie a hodnotenie modelov. Je primárne zameraný na číselné údaje a obsahuje niekoľko pripravených datasetov na výučbu. Obsahuje tiež zabudované modely na vyskúšanie študentmi. Najskôr preskúmajme postup načítania predpripravených dát a použitia zabudovaného estimátora prvého modelu ML v Scikit-learn s niekoľkými základnými údajmi. -## Cvičenie - váš prvý notebook so Scikit-learn +## Cvičenie - váš prvý notebook v Scikit-learn -> Tento tutoriál bol inšpirovaný [príkladom lineárnej regresie](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) na webovej stránke Scikit-learn. +> Tento tutorial bol inšpirovaný [príkladom lineárnej regresie](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) na stránke Scikit-learn. [![ML pre začiatočníkov - Váš prvý projekt lineárnej regresie v Pythone](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML pre začiatočníkov - Váš prvý projekt lineárnej regresie v Pythone") -> 🎥 Kliknite na obrázok vyššie pre krátke video o tomto cvičení. +> 🎥 Kliknite na obrázok vyššie pre krátke video s týmto cvičením. -V súbore _notebook.ipynb_ priradenom k tejto lekcii vymažte všetky bunky stlačením ikony 'odpadkového koša'. +V súbore _notebook.ipynb_ pripojenom k tejto lekcii vymažte všetky bunky stlačením ikony „koša“. -V tejto sekcii budete pracovať s malým datasetom o cukrovke, ktorý je zabudovaný do Scikit-learn na učebné účely. Predstavte si, že chcete testovať liečbu pre diabetických pacientov. Modely strojového učenia vám môžu pomôcť určiť, ktorí pacienti by na liečbu reagovali lepšie, na základe kombinácií premenných. Dokonca aj veľmi základný regresný model, keď je vizualizovaný, môže ukázať informácie o premenných, ktoré by vám pomohli organizovať vaše teoretické klinické skúšky. +V tejto časti budete pracovať s malým datasetom o diabete, ktorý je zabudovaný v Scikit-learn pre výučbové účely. Predstavte si, že chcete testovať liečbu pre diabetických pacientov. Modely strojového učenia by vám mohli pomôcť určiť, ktorí pacienti by na liečbu reagovali lepšie, na základe kombinácií premenných. Aj veľmi jednoduchý regresný model, pri vizualizácii, môže ukázať informácie o premenných, ktoré by vám pomohli zorganizovať teoretické klinické skúšky. -✅ Existuje mnoho typov regresných metód a výber závisí od odpovede, ktorú hľadáte. Ak chcete predpovedať pravdepodobnú výšku osoby určitého veku, použili by ste lineárnu regresiu, pretože hľadáte **numerickú hodnotu**. Ak vás zaujíma, či by sa určitý typ kuchyne mal považovať za vegánsky alebo nie, hľadáte **kategóriu**, takže by ste použili logistickú regresiu. Neskôr sa dozviete viac o logistickej regresii. Zamyslite sa nad niektorými otázkami, ktoré môžete klásť dátam, a ktorá z týchto metód by bola vhodnejšia. +✅ Existuje mnoho typov regresných metód a ktorá z nich je vhodná, závisí od hľadaného odpovede. Ak chcete predpovedať pravdepodobnú výšku osoby určitého veku, použijete lineárnu regresiu, pretože hľadáte **číselnú hodnotu**. Ak vás zaujíma, či určitý druh kuchyne by mal byť považovaný za vegánsky alebo nie, hľadáte **priradenie kategórie**, takže by ste použili logistickú regresiu. O logistickej regresii sa dozviete viac neskôr. Zamyslite sa nad niektorými otázkami, ktoré môžete položiť dátam, a ktorá z týchto metód by bola vhodnejšia. -Poďme začať s touto úlohou. +Poďme sa pustiť do tejto úlohy. ### Import knižníc -Pre túto úlohu importujeme niektoré knižnice: +Na túto úlohu naimportujeme niekoľko knižníc: - **matplotlib**. Je to užitočný [nástroj na grafy](https://matplotlib.org/) a použijeme ho na vytvorenie čiarového grafu. -- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) je užitočná knižnica na prácu s numerickými dátami v Pythone. -- **sklearn**. Toto je [knižnica Scikit-learn](https://scikit-learn.org/stable/user_guide.html). +- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) je užitočná knižnica na prácu s číselnými údajmi v Pythone. +- **sklearn**. Toto je knižnica [Scikit-learn](https://scikit-learn.org/stable/user_guide.html). -Importujte niektoré knižnice na pomoc s vašimi úlohami. +Naimportujte knižnice, ktoré vám pomôžu pri úlohách. 1. Pridajte importy napísaním nasledujúceho kódu: @@ -123,26 +123,26 @@ Importujte niektoré knižnice na pomoc s vašimi úlohami. from sklearn import datasets, linear_model, model_selection ``` - Vyššie importujete `matplotlib`, `numpy` a importujete `datasets`, `linear_model` a `model_selection` zo `sklearn`. `model_selection` sa používa na rozdelenie dát na tréningové a testovacie sady. + Hore importujete `matplotlib`, `numpy` a importujete `datasets`, `linear_model` a `model_selection` zo `sklearn`. `model_selection` sa používa na rozdelenie dát na trénovacie a testovacie sady. -### Dataset o cukrovke +### Dataset o diabete -Zabudovaný [dataset o cukrovke](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) obsahuje 442 vzoriek dát o cukrovke s 10 premennými, z ktorých niektoré zahŕňajú: +Zabudovaný [diabetes dataset](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) obsahuje 442 vzoriek o diabete s 10 premennými vlastností, niektoré z nich sú: - vek: vek v rokoch - bmi: index telesnej hmotnosti - bp: priemerný krvný tlak - s1 tc: T-bunky (typ bielych krviniek) -✅ Tento dataset zahŕňa koncept 'pohlavia' ako premennú dôležitú pre výskum cukrovky. Mnohé medicínske datasety zahŕňajú tento typ binárnej klasifikácie. Zamyslite sa nad tým, ako takéto kategorizácie môžu vylúčiť určité časti populácie z liečby. +✅ Tento dataset zahŕňa koncept 'pohlavia' ako dôležitéj vlastnosti pre výskum okolo diabetu. Mnohé medicínske databázy obsahujú tento druh binárnej klasifikácie. Zamyslite sa nad tým, ako by takéto kategorizácie mohli vylúčiť určité časti populácie z liečby. Teraz načítajte dáta X a y. -> 🎓 Pamätajte, že ide o učenie pod dohľadom, a potrebujeme pomenovaný cieľ 'y'. +> 🎓 Pamätajte, že toto je riadené učenie (supervised learning) a potrebujeme pomenovaný 'y' cieľ. -V novej bunke kódu načítajte dataset o cukrovke volaním `load_diabetes()`. Vstup `return_X_y=True` signalizuje, že `X` bude dátová matica a `y` bude cieľ regresie. +V novej bunke kódu načítajte diabetes dataset volaním `load_diabetes()`. Vstup `return_X_y=True` znamená, že `X` bude dátová matica a `y` bude cieľ regresie. -1. Pridajte niekoľko príkazov na výpis, aby ste zobrazili tvar dátovej matice a jej prvý prvok: +1. Pridajte niekoľko príkazov na tlač tvaru dátovej matice a jej prvého prvku: ```python X, y = datasets.load_diabetes(return_X_y=True) @@ -150,9 +150,9 @@ V novej bunke kódu načítajte dataset o cukrovke volaním `load_diabetes()`. V print(X[0]) ``` - To, čo dostávate ako odpoveď, je tuple. Priraďujete prvé dve hodnoty tuple do `X` a `y`. Viac sa dozviete [o tuple](https://wikipedia.org/wiki/Tuple). + Čo dostávate ako odpoveď, je tuple. Čo robíte, je priradenie dvoch prvých hodnôt tuple do `X` a `y`. Viac sa dozviete [o tuple](https://wikipedia.org/wiki/Tuple). - Môžete vidieť, že tieto dáta majú 442 položiek usporiadaných v poliach s 10 prvkami: + Vidíte, že dáta obsahujú 442 položiek zoradených do polí s 10 prvkami: ```text (442, 10) @@ -160,39 +160,39 @@ V novej bunke kódu načítajte dataset o cukrovke volaním `load_diabetes()`. V -0.04340085 -0.00259226 0.01990842 -0.01764613] ``` - ✅ Zamyslite sa nad vzťahom medzi dátami a cieľovou premennou regresie. Lineárna regresia predpovedá vzťahy medzi premennou X a cieľovou premennou y. Nájdete [cieľ](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) pre dataset o cukrovke v dokumentácii? Čo tento dataset demonštruje, vzhľadom na cieľ? + ✅ Zamyslite sa nad vzťahom medzi dátami a cieľom regresie. Lineárna regresia predpovedá vzťahy medzi vlastnosťou X a cieľovou premennou y. Môžete nájsť [cieľ](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) pre diabetes dataset v dokumentácii? Čo tento dataset ukazuje, vzhľadom na cieľ? -2. Ďalej vyberte časť tohto datasetu na vykreslenie výberom 3. stĺpca datasetu. Môžete to urobiť pomocou operátora `:` na výber všetkých riadkov a potom výberom 3. stĺpca pomocou indexu (2). Dáta môžete tiež preformátovať na 2D pole - ako je požadované na vykreslenie - pomocou `reshape(n_rows, n_columns)`. Ak je jeden z parametrov -1, zodpovedajúci rozmer sa vypočíta automaticky. +2. Ďalej vyberte časť datasetu na vykreslenie výberom 3. stĺpca datasetu. Môžete to urobiť použitím operátora `:` na výber všetkých riadkov a potom výberom 3. stĺpca s indexom (2). Dáta môžete tiež prestaviť na 2D pole - čo je potrebné pre vykresľovanie - pomocou `reshape(n_rows, n_columns)`. Ak je jeden parameter -1, príslušný rozmer sa vypočíta automaticky. ```python X = X[:, 2] X = X.reshape((-1,1)) ``` - ✅ Kedykoľvek si vypíšte dáta, aby ste skontrolovali ich tvar. + ✅ Kedykoľvek si vypíšte dáta, aby ste si skontrolovali ich tvar. -3. Teraz, keď máte dáta pripravené na vykreslenie, môžete zistiť, či stroj môže pomôcť určiť logické rozdelenie medzi číslami v tomto datasete. Na to potrebujete rozdeliť dáta (X) a cieľ (y) na testovacie a tréningové sady. Scikit-learn má jednoduchý spôsob, ako to urobiť; môžete rozdeliť vaše testovacie dáta na danom bode. +3. Teraz keď máte dáta pripravené na vykreslenie, zistíte, či vám stroj môže pomôcť určiť logický bod rozdelenia v týchto číslach. Na to musíte rozdeliť dáta (X) aj cieľ (y) na testovaciu a tréningovú sadu. Scikit-learn ponúka jednoduchý spôsob, ako to urobiť; vykonáte rozdelenie dát na danom bode. ```python X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) ``` -4. Teraz ste pripravení trénovať váš model! Načítajte model lineárnej regresie a trénujte ho s vašimi tréningovými sadami X a y pomocou `model.fit()`: +4. Teraz ste pripravení trénovať svoj model! Načítajte lineárny regresný model a natrénujte ho na vašich trénovacích sadách X a y pomocou `model.fit()`: ```python model = linear_model.LinearRegression() model.fit(X_train, y_train) ``` - ✅ `model.fit()` je funkcia, ktorú uvidíte v mnohých knižniciach ML, ako je TensorFlow. + ✅ `model.fit()` je funkcia, ktorú uvidíte v mnohých ML knižniciach ako TensorFlow -5. Potom vytvorte predpoveď pomocou testovacích dát, pomocou funkcie `predict()`. Táto funkcia bude použitá na nakreslenie čiary medzi skupinami dát. +5. Potom vytvorte predikciu s použitím testovacích dát pomocou funkcie `predict()`. Táto predikcia sa použije na vykreslenie čiary medzi skupinami dát. ```python y_pred = model.predict(X_test) ``` -6. Teraz je čas zobraziť dáta v grafe. Matplotlib je veľmi užitočný nástroj na túto úlohu. Vytvorte scatterplot všetkých testovacích dát X a y a použite predpoveď na nakreslenie čiary na najvhodnejšom mieste medzi skupinami dát modelu. +6. Teraz je čas ukázať dáta na grafe. Matplotlib je veľmi užitočný nástroj na túto úlohu. Vytvorte bodový graf všetkých testovacích dát X a y a použite predikciu na nakreslenie čiary na najvhodnejšom mieste medzi skupinami dát podľa modelu. ```python plt.scatter(X_test, y_test, color='black') @@ -203,22 +203,24 @@ V novej bunke kódu načítajte dataset o cukrovke volaním `load_diabetes()`. V plt.show() ``` - ![scatterplot zobrazujúci dátové body o cukrovke](../../../../2-Regression/1-Tools/images/scatterplot.png) -✅ Zamyslite sa nad tým, čo sa tu deje. Priama čiara prechádza cez množstvo malých bodov údajov, ale čo presne robí? Vidíte, ako by ste mali byť schopní použiť túto čiaru na predpovedanie, kde by mal nový, nevidený bod údajov zapadnúť vo vzťahu k osi y grafu? Skúste slovami vyjadriť praktické využitie tohto modelu. + ![bodový graf zobrazujúci body dát o diabete](../../../../translated_images/sk/scatterplot.ad8b356bcbb33be6.webp) -Gratulujeme, vytvorili ste svoj prvý model lineárnej regresie, urobili ste predpoveď pomocou neho a zobrazili ste ju v grafe! + + ✅ Zamyslite sa trochu nad tým, čo sa tu deje. Priama čiara prechádza viacerými malými bodmi údajov, ale čo vlastne robí? Vidíte, ako by ste mali byť schopní použiť túto čiaru na predpovedanie, kde by sa nový, neznámy údaj mal nachádzať vzhľadom na os y grafu? Pokúste sa slovami opísať praktické využitie tohto modelu. + +Blahoželáme, vytvorili ste svoj prvý model lineárnej regresie, vytvorili ste pomocou neho predikciu a zobrazili ju v grafe! --- ## 🚀Výzva -Vykreslite iný premennú z tejto dátovej sady. Tip: upravte tento riadok: `X = X[:,2]`. Na základe cieľa tejto dátovej sady, čo dokážete zistiť o progresii cukrovky ako ochorenia? +Vykreslite inú premennú z tejto dátovej sady. Tip: upravte tento riadok: `X = X[:,2]`. Vzhľadom na cieľ tejto dátovej sady, čo môžete zistiť o priebehu cukrovky ako choroby? ## [Kvíz po prednáške](https://ff-quizzes.netlify.app/en/ml/) -## Prehľad a samostatné štúdium +## Prehľad a samostatná štúdia -V tomto tutoriáli ste pracovali s jednoduchou lineárnou regresiou, namiesto univariátnej alebo viacnásobnej lineárnej regresie. Prečítajte si niečo o rozdieloch medzi týmito metódami alebo si pozrite [toto video](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef). +V tomto návode ste pracovali s jednoduchou lineárnou regresiou, nie s univariátnou alebo viacnásobnou lineárnou regresiou. Prečítajte si niečo o rozdieloch medzi týmito metódami, alebo si pozrite [toto video](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef) -Prečítajte si viac o koncepte regresie a zamyslite sa nad tým, aké typy otázok je možné zodpovedať pomocou tejto techniky. Absolvujte tento [tutoriál](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott), aby ste si prehĺbili svoje porozumenie. +Prečítajte si viac o koncepte regresie a zamyslite sa nad tým, aké otázky môže táto technika zodpovedať. Prehĺbte si pochopenie týmto [návodom](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott). ## Zadanie @@ -226,5 +228,7 @@ Prečítajte si viac o koncepte regresie a zamyslite sa nad tým, aké typy otá --- -**Upozornenie**: -Tento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. \ No newline at end of file + +**Vyhlásenie o zodpovednosti**: +Tento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. + \ No newline at end of file diff --git a/translations/sk/2-Regression/2-Data/README.md b/translations/sk/2-Regression/2-Data/README.md index eb1394d10..456dee38e 100644 --- a/translations/sk/2-Regression/2-Data/README.md +++ b/translations/sk/2-Regression/2-Data/README.md @@ -1,62 +1,62 @@ -# Vytvorenie regresného modelu pomocou Scikit-learn: príprava a vizualizácia dát +# Vytvorte regresný model pomocou Scikit-learn: príprava a vizualizácia dát -![Infografika vizualizácie dát](../../../../2-Regression/2-Data/images/data-visualization.png) +![Infografika vizualizácie dát](../../../../translated_images/sk/data-visualization.54e56dded7c1a804.webp) -Infografiku vytvoril [Dasani Madipalli](https://twitter.com/dasani_decoded) +Infografika od [Dasani Madipalli](https://twitter.com/dasani_decoded) ## [Kvíz pred prednáškou](https://ff-quizzes.netlify.app/en/ml/) -> ### [Táto lekcia je dostupná aj v R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) +> ### [Táto lekcia je dostupná v R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) ## Úvod -Teraz, keď máte pripravené nástroje na budovanie modelov strojového učenia pomocou Scikit-learn, ste pripravení začať klásť otázky o svojich dátach. Pri práci s dátami a aplikovaní riešení strojového učenia je veľmi dôležité vedieť, ako položiť správnu otázku, aby ste mohli plne využiť potenciál svojho datasetu. +Teraz, keď máte nainštalované nástroje potrebné na začatie práce s tvorbou modelov strojového učenia pomocou Scikit-learn, ste pripravení začať klásť otázky vašim dátam. Pri práci s dátami a aplikovaní riešení ML je veľmi dôležité pochopiť, ako položiť správnu otázku, aby ste správne odomkli potenciál svojho datasetu. V tejto lekcii sa naučíte: -- Ako pripraviť dáta na budovanie modelov. -- Ako používať Matplotlib na vizualizáciu dát. +- Ako pripraviť vaše dáta na tvorbu modelu. +- Ako použiť Matplotlib na vizualizáciu dát. +- Ako použiť Seaborn pre expresívnejšiu vizualizáciu dát. -## Kladenie správnych otázok o vašich dátach +## Ako položiť správnu otázku vašim dátam -Otázka, na ktorú potrebujete odpoveď, určí, aký typ algoritmov strojového učenia budete používať. Kvalita odpovede, ktorú dostanete, bude výrazne závisieť od povahy vašich dát. +Otázka, na ktorú potrebujete odpoveď, určí, aký typ ML algoritmov použijete. A kvalita odpovede závisí veľmi od povahy vašich dát. -Pozrite sa na [dáta](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) poskytnuté pre túto lekciu. Tento .csv súbor môžete otvoriť vo VS Code. Rýchly pohľad okamžite ukáže, že sú tam prázdne miesta a mix textových a číselných dát. Je tam tiež zvláštny stĺpec nazvaný 'Package', kde sú dáta zmiešané medzi 'sacks', 'bins' a inými hodnotami. Dáta sú vlastne dosť chaotické. +Pozrite sa na [dáta](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) poskytnuté pre túto lekciu. Môžete otvoriť tento .csv súbor vo VS Code. Rýchly prehľad hneď ukáže, že sú tam prázdne miesta a mix reťazcov a číselných hodnôt. Je tam tiež zvláštna kolóna nazvaná 'Package', kde sú dáta zmiešané medzi 'sacks', 'bins' a inými hodnotami. Dáta sú vlastne trochu neusporiadané. -[![ML pre začiatočníkov - Ako analyzovať a čistiť dataset](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML pre začiatočníkov - Ako analyzovať a čistiť dataset") +[![ML pre začiatočníkov – Ako analyzovať a upraviť dataset](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML pre začiatočníkov – Ako analyzovať a upraviť dataset") -> 🎥 Kliknite na obrázok vyššie pre krátke video o príprave dát pre túto lekciu. +> 🎥 Kliknite na obrázok hore pre krátke video o príprave dát pre túto lekciu. -Nie je veľmi bežné dostať dataset, ktorý je úplne pripravený na použitie na vytvorenie modelu strojového učenia. V tejto lekcii sa naučíte, ako pripraviť surový dataset pomocou štandardných knižníc Pythonu. Naučíte sa tiež rôzne techniky vizualizácie dát. +V skutočnosti nie je bežné dostať priamo dataset úplne pripravený na použitie na vytvorenie modelu ML. V tejto lekcii sa naučíte, ako pripraviť surový dataset pomocou štandardných knižníc Pythonu. Tiež sa naučíte rôzne techniky vizualizácie dát. ## Prípadová štúdia: 'trh s tekvicami' -V tomto priečinku nájdete .csv súbor v koreňovom priečinku `data` nazvaný [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), ktorý obsahuje 1757 riadkov dát o trhu s tekvicami, rozdelených do skupín podľa miest. Ide o surové dáta extrahované z [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), ktoré distribuuje Ministerstvo poľnohospodárstva USA. +V tomto priečinku nájdete .csv súbor v koreňovom priečinku `data` nazvaný [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), ktorý obsahuje 1757 riadkov dát o trhu s tekvicami, zoradených podľa miest. Sú to surové dáta extrahované z [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) distribuovaných Ministerstvom poľnohospodárstva Spojených štátov. ### Príprava dát -Tieto dáta sú vo verejnej doméne. Môžu byť stiahnuté v mnohých samostatných súboroch, podľa miest, z webovej stránky USDA. Aby sme sa vyhli príliš mnohým samostatným súborom, spojili sme všetky dáta miest do jednej tabuľky, takže sme už dáta trochu _pripravili_. Teraz sa pozrime bližšie na dáta. +Tieto dáta sú vo verejnej doméne. Môžu byť stiahnuté v mnohých samostatných súboroch podľa miest zo stránky USDA. Aby sme predišli príliš mnohým samostatným súborom, všetky mestské dáta sme skonsolidovali do jednej tabuľky, takže sme už trochu _pripravili_ dáta. Teraz si dáta pozrime bližšie. -### Dáta o tekviciach - prvé závery +### Dáta o tekviciach – rané závery -Čo si všimnete na týchto dátach? Už ste videli, že je tam mix textov, čísel, prázdnych miest a zvláštnych hodnôt, ktoré musíte pochopiť. +Čo si všimnete na týchto dátach? Už ste videli, že tam je mix reťazcov, čísel, prázdnych polí a zvláštnych hodnôt, ktoré je potrebné pochopiť. -Akú otázku môžete položiť o týchto dátach pomocou regresnej techniky? Čo tak "Predpovedať cenu tekvice na predaj počas daného mesiaca". Pri pohľade na dáta je potrebné urobiť niekoľko zmien, aby ste vytvorili štruktúru dát potrebnú na túto úlohu. - -## Cvičenie - analýza dát o tekviciach +Akú otázku môžete položiť týmto dátam použitím regresnej techniky? Napríklad "Predpovedať cenu tekvice na predaj v danom mesiaci". Pri opätovnom pohľade na dáta sú potrebné úpravy na vytvorenie dátovej štruktúry potrebnej pre túto úlohu. +## Cvičenie – analyzujte dáta o tekviciach Použime [Pandas](https://pandas.pydata.org/) (názov znamená `Python Data Analysis`), nástroj veľmi užitočný na tvarovanie dát, na analýzu a prípravu týchto dát o tekviciach. -### Najskôr skontrolujte chýbajúce dátumy +### Najprv skontrolujte chýbajúce dátumy -Najprv musíte podniknúť kroky na kontrolu chýbajúcich dátumov: +Najprv treba podniknúť kroky na kontrolu chýbajúcich dátumov: -1. Konvertujte dátumy na formát mesiaca (ide o americké dátumy, takže formát je `MM/DD/YYYY`). -2. Extrahujte mesiac do nového stĺpca. +1. Preveďte dátumy na formát mesiaca (ide o americké dátumy, teda formát je `MM/DD/YYYY`). +2. Vytiahnite mesiac do novej kolónky. -Otvorte súbor _notebook.ipynb_ vo Visual Studio Code a importujte tabuľku do nového Pandas dataframe. +Otvorte súbor _notebook.ipynb_ vo Visual Studio Code a naimportujte tabuľku do nového Pandas dataframe. -1. Použite funkciu `head()`, aby ste si pozreli prvých päť riadkov. +1. Použite funkciu `head()` pre zobrazenie prvých piatich riadkov. ```python import pandas as pd @@ -64,7 +64,7 @@ Otvorte súbor _notebook.ipynb_ vo Visual Studio Code a importujte tabuľku do n pumpkins.head() ``` - ✅ Akú funkciu by ste použili na zobrazenie posledných piatich riadkov? + ✅ Ktorú funkciu by ste použili na zobrazenie posledných piatich riadkov? 1. Skontrolujte, či sú v aktuálnom dataframe chýbajúce dáta: @@ -72,22 +72,22 @@ Otvorte súbor _notebook.ipynb_ vo Visual Studio Code a importujte tabuľku do n pumpkins.isnull().sum() ``` - Sú tam chýbajúce dáta, ale možno to nebude mať vplyv na danú úlohu. + Niektoré dáta chýbajú, ale možno to nebude pre danú úlohu podstatné. -1. Aby bol váš dataframe ľahšie spracovateľný, vyberte iba stĺpce, ktoré potrebujete, pomocou funkcie `loc`, ktorá extrahuje z pôvodného dataframe skupinu riadkov (zadaných ako prvý parameter) a stĺpcov (zadaných ako druhý parameter). Výraz `:` v prípade nižšie znamená "všetky riadky". +1. Aby ste si uľahčili prácu s dataframe, vyberte iba potrebné kolónky pomocou funkcie `loc`, ktorá vyberá z pôvodného dataframe skupinu riadkov (ako prvý parameter) a stĺpcov (ako druhý parameter). Výraz `:` v nasledujúcom príklade znamená "všetky riadky". ```python columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.loc[:, columns_to_select] ``` -### Ďalej určte priemernú cenu tekvice +### Druhý krok, určte priemernú cenu tekvice -Premýšľajte o tom, ako určiť priemernú cenu tekvice v danom mesiaci. Ktoré stĺpce by ste si vybrali na túto úlohu? Tip: budete potrebovať 3 stĺpce. +Premyslite si, ako určiť priemernú cenu tekvice v danom mesiaci. Aké stĺpce by ste vybrali pre túto úlohu? Náznak: budete potrebovať 3 stĺpce. -Riešenie: vezmite priemer stĺpcov `Low Price` a `High Price`, aby ste naplnili nový stĺpec Price, a konvertujte stĺpec Date tak, aby zobrazoval iba mesiac. Našťastie, podľa vyššie uvedenej kontroly, nie sú chýbajúce dáta pre dátumy alebo ceny. +Riešenie: vezmite priemer z kolón `Low Price` a `High Price` pre novú kolónu Price, a prekonvertujte dátum tak, aby zobrazoval iba mesiac. Našťastie podľa predchádzajúcej kontroly v dátach nechýbajú dátumy ani ceny. -1. Na výpočet priemeru pridajte nasledujúci kód: +1. Pre výpočet priemeru pridajte tento kód: ```python price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 @@ -96,37 +96,37 @@ Riešenie: vezmite priemer stĺpcov `Low Price` a `High Price`, aby ste naplnili ``` - ✅ Ak chcete skontrolovať akékoľvek dáta, môžete použiť `print(month)`. + ✅ Kľudne si vypíšte akékoľvek dáta pomocou `print(month)`, aby ste skontrolovali. -2. Teraz skopírujte svoje konvertované dáta do nového Pandas dataframe: +2. Teraz skopírujte prevedené dáta do nového Pandas dataframe: ```python new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) ``` - Ak si vytlačíte svoj dataframe, uvidíte čistý, upravený dataset, na ktorom môžete postaviť svoj nový regresný model. + Vytlačenie tohto dataframe vám zobrazí čistý, uprataný dataset, na ktorom môžete stavať váš nový regresný model. -### Ale počkajte! Niečo tu nesedí +### Ale počkajte! Niečo je tu zvláštne -Ak sa pozriete na stĺpec `Package`, tekvice sa predávajú v mnohých rôznych konfiguráciách. Niektoré sa predávajú v jednotkách '1 1/9 bushel', niektoré v '1/2 bushel', niektoré na kus, niektoré na váhu, a niektoré vo veľkých boxoch s rôznymi šírkami. +Ak sa pozriete na kolónu `Package`, tekvice sa predávajú v mnohých rôznych formách. Niektoré sa predávajú v dávkach '1 1/9 bushel', iné v '1/2 bushel', niektoré po kusoch, iné po librách a niektoré v veľkých krabiciach rôznej šírky. -> Tekvice sa zdajú byť veľmi ťažké vážiť konzistentne +> Tekvice je podľa všetkého veľmi ťažké rovnomerne vážiť. -Pri skúmaní pôvodných dát je zaujímavé, že všetko, čo má `Unit of Sale` rovné 'EACH' alebo 'PER BIN', má tiež typ `Package` na palec, na box alebo 'each'. Tekvice sa zdajú byť veľmi ťažké vážiť konzistentne, takže ich filtrujme výberom iba tekvíc s reťazcom 'bushel' v ich stĺpci `Package`. +Pri bližšom skúmaní pôvodných dát je zaujímavé, že všetko s `Unit of Sale` rovnakým 'EACH' alebo 'PER BIN' má tiež `Package` ako na palec, na bin, alebo 'each'. Tekvice je veľmi ťažké vážiť konzistentne, tak ich vyfiltrujme výberom iba tekvíc s reťazcom 'bushel' v kolónke `Package`. -1. Pridajte filter na začiatok súboru, pod počiatočný import .csv: +1. Pridajte filter na vrch súboru, pod počiatočný import .csv: ```python pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] ``` - Ak si teraz vytlačíte dáta, uvidíte, že dostávate iba približne 415 riadkov dát obsahujúcich tekvice podľa bushel. + Ak teraz vytlačíte dáta, vidíte iba približne 415 riadkov obsahujúcich tekvice predávané po busheloch. -### Ale počkajte! Je tu ešte jedna vec, ktorú treba urobiť +### Ale počkajte! Ešte jedna vec -Všimli ste si, že množstvo bushel sa líši podľa riadku? Musíte normalizovať ceny tak, aby ste zobrazili ceny za bushel, takže urobte nejaké výpočty na ich štandardizáciu. +Všimli ste si, že množstvo bushelov sa líši v jednotlivých riadkoch? Je potrebné normalizovať ceny, aby sa ukazovali ceny za bushel, preto je treba urobiť nejakú matematiku na štandardizáciu. -1. Pridajte tieto riadky po bloku vytvárajúcom nový dataframe new_pumpkins: +1. Pridajte tieto riadky za blok vytvárajúci nový dataframe new_pumpkins: ```python new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) @@ -134,38 +134,38 @@ Všimli ste si, že množstvo bushel sa líši podľa riadku? Musíte normalizov new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) ``` -✅ Podľa [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) hmotnosť bushel závisí od typu produktu, pretože ide o objemové meranie. "Bushel paradajok, napríklad, by mal vážiť 56 libier... Listy a zelenina zaberajú viac miesta s menšou hmotnosťou, takže bushel špenátu váži iba 20 libier." Je to všetko dosť komplikované! Nebudeme sa zaoberať konverziou bushel na libry, namiesto toho budeme určovať cenu za bushel. Celá táto štúdia bushel tekvíc však ukazuje, aké dôležité je pochopiť povahu vašich dát! +✅ Podľa [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) záleží hmotnosť bushelu na druhu plodiny, keďže ide o objemové meranie. "Bushel paradajok napríklad váži 56 libier... Listy a zelenina zaberajú viac miesta pri menšej hmotnosti, takže bushel špenátu váži len 20 libier." Je to celkom komplikované! Nechceme sa pásť na prevody bushel na libru, radšej cenu nastavme za bushel. Toto skúmanie bushelov tekvíc však ukazuje, aké je dôležité rozumieť povahe vašich dát! -Teraz môžete analyzovať ceny za jednotku na základe ich merania bushel. Ak si ešte raz vytlačíte dáta, uvidíte, ako sú štandardizované. +Teraz môžete analyzovať ceny za jednotku podľa ich merania bushelmi. Ak vytlačíte dáta ešte raz, uvidíte, ako sú štandardizované. -✅ Všimli ste si, že tekvice predávané na polovičný bushel sú veľmi drahé? Dokážete zistiť prečo? Tip: malé tekvice sú oveľa drahšie ako veľké, pravdepodobne preto, že ich je oveľa viac na bushel, vzhľadom na nevyužitý priestor, ktorý zaberá jedna veľká dutá tekvica na koláč. +✅ Všimli ste si, že tekvice predávané po pol busheli sú veľmi drahé? Viete povedať prečo? Náznak: malé tekvice sú omnoho drahšie ako veľké, pravdepodobne preto, že ich je omnoho viac na jeden bushel z dôvodu nevyužitého priestoru, ktorý zaberá jedna veľká dutá tekvica na koláč. ## Stratégie vizualizácie -Súčasťou úlohy dátového vedca je demonštrovať kvalitu a povahu dát, s ktorými pracuje. Na tento účel často vytvárajú zaujímavé vizualizácie, ako sú grafy, diagramy a tabuľky, ktoré ukazujú rôzne aspekty dát. Týmto spôsobom môžu vizuálne ukázať vzťahy a medzery, ktoré by inak bolo ťažké odhaliť. +Súčasťou role dátového vedca je demonštrovať kvalitu a povahu dát, s ktorými pracuje. Na to často vytvárajú zaujímavé vizualizácie, ako grafy, diagramy a tabuľky, ktoré zobrazujú rôzne aspekty dát. Takto môžu vizuálne ukázať vzťahy a medzery, ktoré by inak bolo ťažké objaviť. -[![ML pre začiatočníkov - Ako vizualizovať dáta pomocou Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML pre začiatočníkov - Ako vizualizovať dáta pomocou Matplotlib") +[![ML pre začiatočníkov – Ako vizualizovať dáta pomocou Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML pre začiatočníkov – Ako vizualizovať dáta pomocou Matplotlib") -> 🎥 Kliknite na obrázok vyššie pre krátke video o vizualizácii dát pre túto lekciu. +> 🎥 Kliknite na obrázok hore pre krátke video o vizualizácii dát pre túto lekciu. -Vizualizácie môžu tiež pomôcť určiť techniku strojového učenia, ktorá je najvhodnejšia pre dané dáta. Napríklad scatterplot, ktorý sa zdá nasledovať líniu, naznačuje, že dáta sú dobrým kandidátom na cvičenie lineárnej regresie. +Vizualizácie môžu tiež pomôcť určiť najvhodnejšiu techniku strojového učenia pre dáta. Napríklad rozptylový graf (scatterplot), ktorý sa zdá nasledovať líniu, naznačuje, že dáta sú dobrými kandidátmi na lineárnu regresiu. -Jedna knižnica na vizualizáciu dát, ktorá dobre funguje v Jupyter notebookoch, je [Matplotlib](https://matplotlib.org/) (ktorú ste videli aj v predchádzajúcej lekcii). +Jednou z knižníc na vizualizáciu dát, ktorá dobre funguje v Jupyter notebooks, je [Matplotlib](https://matplotlib.org/) (ktorú ste videli aj v predchádzajúcej lekcii). > Získajte viac skúseností s vizualizáciou dát v [týchto tutoriáloch](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). -## Cvičenie - experimentujte s Matplotlib +## Cvičenie – experimentujte s Matplotlib -Skúste vytvoriť niekoľko základných grafov na zobrazenie nového dataframe, ktorý ste práve vytvorili. Čo by ukázal základný čiarový graf? +Vyskúšajte vytvoriť jednoduché grafy zobrazujúce nový dataframe, ktorý ste práve vytvorili. Čo by mohol ukázať jednoduchý čiarový graf? -1. Importujte Matplotlib na začiatok súboru, pod import Pandas: +1. Importujte Matplotlib na vrch súboru, pod Pandas import: ```python import matplotlib.pyplot as plt ``` -1. Znovu spustite celý notebook, aby ste ho aktualizovali. -1. Na konci notebooku pridajte bunku na vykreslenie dát ako box: +1. Znova spustite celý notebook pre obnovenie. +1. Na konci notebooku pridajte bunku na vykreslenie box plota: ```python price = new_pumpkins.Price @@ -174,38 +174,113 @@ Skúste vytvoriť niekoľko základných grafov na zobrazenie nového dataframe, plt.show() ``` - ![Scatterplot zobrazujúci vzťah medzi cenou a mesiacom](../../../../2-Regression/2-Data/images/scatterplot.png) + ![Rozptylový graf ukazujúci vzťah ceny a mesiaca](../../../../translated_images/sk/scatterplot.b6868f44cbd2051c.webp) - Je tento graf užitočný? Prekvapilo vás na ňom niečo? + Je tento graf užitočný? Prekvapuje vás niečo na ňom? - Nie je obzvlášť užitočný, pretože iba zobrazuje vaše dáta ako rozptyl bodov v danom mesiaci. + Nie je veľmi užitočný, pretože iba zobrazuje dáta rozptýlené do mesiacov. -### Urobte ho užitočným +### Spravme ho užitočným -Aby grafy zobrazovali užitočné dáta, zvyčajne je potrebné dáta nejako zoskupiť. Skúsme vytvoriť graf, kde os y zobrazuje mesiace a dáta ukazujú rozdelenie dát. +Aby grafy zobrazovali užitočné dáta, zvyčajne ich treba nejako zoskupiť. Skúsme vytvoriť graf, kde os y ukazuje mesiace a dáta ukazujú ich rozloženie. -1. Pridajte bunku na vytvorenie zoskupeného stĺpcového grafu: +1. Pridajte bunku na vytvorenie skupinového stĺpcového grafu: ```python new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') plt.ylabel("Pumpkin Price") ``` - ![Stĺpcový graf zobrazujúci vzťah medzi cenou a mesiacom](../../../../2-Regression/2-Data/images/barchart.png) + ![Stĺpcový graf ukazujúci vzťah ceny a mesiaca](../../../../translated_images/sk/barchart.a833ea9194346d76.webp) + + Toto je užitočnejšia vizualizácia dát! Zdá sa, že najvyššie ceny tekvíc sú v septembri a októbri. Súhlasí to s vaším očakávaním? Prečo áno alebo prečo nie? + +## Cvičenie – experimentujte so Seaborn + +Matplotlib je výkonný, ale na vytvorenie vylešteného grafu môže byť potrebný veľký kód. [Seaborn](https://seaborn.pydata.org/) je knižnica postavená _na vrchu_ Matplotlibu, určená na štatistickú vizualizáciu dát. Pracuje priamo s Pandas dataframeami, používa atraktívne predvolené štýly a umožňuje vytvárať informatívne grafy s oveľa menším kódom. Keďže Seaborn vracia objekty Matplotlibu, stále môžete použiť všetko, čo už viete o Matplotlib, na doladenie výsledku. + +> Ak ešte nemáte Seaborn nainštalovaný, nainštalujte ho pomocou `pip install seaborn`. + +1. Importujte Seaborn na vrch notebooku, pod ostatné importy. Konvenciou je importovať ho ako `sns`: + + ```python + import seaborn as sns + ``` + +### Rozptylové grafy na zobrazenie vzťahov + +Veľká časť skúmania dát pred tvorbou modelu je hľadanie _vzťahov_ medzi premennými. [Rozptylový graf](https://en.wikipedia.org/wiki/Scatter_plot) je jedným z najlepších nástrojov na to: ak sa body zdajú nasledovať priamku, obe premenné môžu byť korelované, čo je dobrý znak, že lineárny regresný model môže fungovať. + +1. Znova vytvorte rozptylový graf ceny podľa mesiaca, tentoraz pomocou Seaborn funkcie [`relplot()`](https://seaborn.pydata.org/generated/seaborn.relplot.html) (relačný plot), ktorá pracuje priamo so stĺpcami vášho dataframe: + + ```python + sns.relplot(x="Price", y="Month", data=new_pumpkins) + ``` + + ![Seaborn rozptylový graf ukazujúci vzťah ceny a mesiaca](../../../../translated_images/sk/relplot.a03837d8f0329cec.webp) + + Všimnite si, ako odovzdáte _názvy stĺpcov_ a dataframe, a Seaborn sa stará o popisky osí za vás. + +2. Môžete zmeniť typ grafu na čiarový zadaním `kind="line"`. Seaborn dokonca vykreslí zatienený pás ukazujúci interval dôvery okolo čiary: + + ```python + sns.relplot(x="Price", y="Month", kind="line", data=new_pumpkins) + ``` + + ![Seaborn čiarový graf ukazujúci vzťah ceny a mesiaca](../../../../translated_images/sk/lineplot.f9034ba47b1e30ee.webp) + + Tieto konkrétne dáta sú dosť hlučné, takže čiarový graf nie je najjasnejšia voľba — ale ukazuje, ako ľahko môžete meniť typ grafu v Seaborn. + +### Stĺpcové grafy na zobrazenie rozložení + + +Skôr ste ručne zoskupovali údaje, aby ste vytvorili stĺpcový graf s Matplotlib. Seabornova funkcia [`catplot()`](https://seaborn.pydata.org/generated/seaborn.catplot.html) (kategorizovaný graf) môže za vás urobiť zoskupovanie a agregáciu. Predvolene `kind="bar"` ukazuje priemer každej kategórie spolu s čiernou čiarou znázorňujúcou interval spoľahlivosti. + +1. Vytvorte stĺpcový graf priemernej ceny za mesiac: + + ```python + sns.catplot(x="Month", y="Price", data=new_pumpkins, kind="bar") + ``` + + ![A Seaborn bar chart showing the price distribution per month](../../../../translated_images/sk/catplot.e73fc35fdf96242b.webp) + + To potvrdzuje to, čo ste videli s Matplotlib — ceny vrcholia okolo septembra a októbra — ale Seaborn tiež vizualizuje, ako veľmi sa cena _mení_ v rámci každého mesiaca. + +### Tepelné mapy na zobrazenie korelácií + +Bodové grafy porovnávajú vždy dve premenné. Keď máte viacero číselných stĺpcov, [teplená mapa](https://en.wikipedia.org/wiki/Heat_map) vám umožní naraz vidieť silu vzťahu medzi _každým_ párom stĺpcov. Toto je bežný spôsob, ako spoznať, ktoré vlastnosti sú najviac korelované pred výberom, čo použiť do modelu (a rovnaký typ grafu sa neskôr používa na zobrazenie mätúcich matíc pri klasifikácii). + +1. Vytvorte korelačnú maticu pomocou Pandas a potom ju nakreslite pomocou Seabornovej funkcie [`heatmap()`](https://seaborn.pydata.org/generated/seaborn.heatmap.html). Voľba `annot=True` vypíše hodnoty korelácií v každej bunke: + + ```python + correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr() + sns.heatmap(correlations, annot=True, cmap="coolwarm") + ``` + + ![A Seaborn heatmap showing correlations between the numeric columns](../../../../translated_images/sk/heatmap.bd98dce43b404c57.webp) + + Hodnoty blízke k `1` (alebo `-1`) znamenajú, že stĺpce sú silne _lineárne_ korelované. Všimnite si, že `Low Price` a `High Price` sú takmer úplne korelované. `Month` na druhej strane ukazuje len slabú lineárnu koreláciu s cenou — aj keď vyššie uvedený stĺpcový graf odhalil jasný sezónny vrchol v septembri a októbri. To je dôležitá lekcia: korelačný koeficient meria len _priame čiary_, takže môže prehliadnuť sezónne alebo iné nelineárne vzory. ✅ Prečo je užitočné pozrieť sa na oboje: tepelnú mapu *a* grafy ako stĺpcový graf pred rozhodnutím, ktoré stĺpce použiť? + +### Matplotlib alebo Seaborn? + +Obe knižnice stoja za poznanie: + +- **Matplotlib** vám dáva detailnú kontrolu nad každým prvkom grafu a je základom, na ktorom staví takmer každá iná pythonovská knižnica na kreslenie. +- **Seaborn** poskytuje funkcie na vyššej úrovni a atraktívne prednastavenia pre štatistické grafy, pracuje priamo s dátovými rámcami (dataframes) a je často rýchlejší pre prieskumnú analýzu dát. - Toto je užitočnejšia vizualizácia dát! Zdá sa, že najvyššia cena za tekvice sa vyskytuje v septembri a októbri. Zodpovedá to vašim očakávaniam? Prečo áno alebo nie? +Bežný pracovný postup je najskôr použiť Seaborn na rýchlu prieskumnú analýzu, potom prejsť na Matplotlib, keď potrebujete prispôsobiť podrobnosti. --- ## 🚀Výzva -Preskúmajte rôzne typy vizualizácií, ktoré Matplotlib ponúka. Ktoré typy sú najvhodnejšie pre regresné problémy? +Preskúmajte rôzne typy vizualizácií, ktoré ponúkajú Matplotlib a Seaborn. Ktoré typy sú najvhodnejšie pre regresné problémy? ## [Kvíz po prednáške](https://ff-quizzes.netlify.app/en/ml/) ## Prehľad a samostatné štúdium -Pozrite sa na mnohé spôsoby vizualizácie dát. Vytvorte zoznam rôznych dostupných knižníc a poznačte si, ktoré sú najlepšie pre dané typy úloh, napríklad 2D vizualizácie vs. 3D vizualizácie. Čo ste zistili? +Pozrite si množstvo spôsobov vizualizácie dát. Vypracujte si zoznam dostupných knižníc a zaznamenajte, ktoré sú najlepšie pre dané typy úloh, napríklad 2D vizualizácie vs. 3D vizualizácie. Čo zistíte? ## Zadanie @@ -213,5 +288,7 @@ Pozrite sa na mnohé spôsoby vizualizácie dát. Vytvorte zoznam rôznych dostu --- -**Upozornenie**: -Tento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nenesieme zodpovednosť za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. \ No newline at end of file + +**Vyhlásenie o zodpovednosti**: +Tento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. + \ No newline at end of file diff --git a/translations/sk/2-Regression/2-Data/solution/notebook.ipynb b/translations/sk/2-Regression/2-Data/solution/notebook.ipynb index b4cd214e7..bfaf356fb 100644 --- a/translations/sk/2-Regression/2-Data/solution/notebook.ipynb +++ b/translations/sk/2-Regression/2-Data/solution/notebook.ipynb @@ -3,7 +3,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "## Lineárna regresia pre tekvice - Lekcia 2\n" + ] }, { "cell_type": "code", @@ -220,6 +222,7 @@ "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", "pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n", "\n", "pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n", @@ -383,18 +386,78 @@ "plt.ylabel(\"Pumpkin Price\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vizualizácia pomocou Seaborn\n", + "\n", + "[Seaborn](https://seaborn.pydata.org/) je postavený na Matplotlib a pracuje priamo s dataframe-ami, čo umožňuje rýchlo vytvárať atraktívne štatistické grafy s veľmi malým množstvom kódu.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Bodové grafy na zobrazenie vzťahov\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sns.relplot(x=\"Price\", y=\"Month\", data=new_pumpkins)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sns.relplot(x=\"Price\", y=\"Month\", kind=\"line\", data=new_pumpkins)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Stĺpcové grafy na zobrazenie rozdelení\n" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "sns.catplot(x=\"Month\", y=\"Price\", data=new_pumpkins, kind=\"bar\")" + ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby na automatický preklad [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, upozorňujeme, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre dôležité informácie sa odporúča profesionálny ľudský preklad. Nezodpovedáme za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n" + "### Tepelné mapy na zobrazenie korelácií\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr()\n", + "sns.heatmap(correlations, annot=True, cmap=\"coolwarm\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Vyhlásenie o zodpovednosti**:\nTento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n\n" ] } ], @@ -424,13 +487,7 @@ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" } }, - "orig_nbformat": 2, - "coopTranslator": { - "original_hash": "95726f0b8283628d5356a4f8eb8b4b76", - "translation_date": "2025-09-06T13:46:11+00:00", - "source_file": "2-Regression/2-Data/solution/notebook.ipynb", - "language_code": "sk" - } + "orig_nbformat": 2 }, "nbformat": 4, "nbformat_minor": 2 diff --git a/translations/sk/8-Reinforcement/1-QLearning/README.md b/translations/sk/8-Reinforcement/1-QLearning/README.md index f179811b9..81c9efb25 100644 --- a/translations/sk/8-Reinforcement/1-QLearning/README.md +++ b/translations/sk/8-Reinforcement/1-QLearning/README.md @@ -1,47 +1,47 @@ -# Úvod do posilňovacieho učenia a Q-Learningu +# Úvod do učenia posilňovaním a Q-Learningu -![Zhrnutie posilňovacieho učenia v strojovom učení v sketchnote](../../../../sketchnotes/ml-reinforcement.png) +![Zhrnutie posilňovania v strojovom učení v sketchnote](../../../../translated_images/sk/ml-reinforcement.94024374d63348db.webp) > Sketchnote od [Tomomi Imura](https://www.twitter.com/girlie_mac) -Posilňovacie učenie zahŕňa tri dôležité koncepty: agenta, určité stavy a súbor akcií pre každý stav. Vykonaním akcie v špecifikovanom stave dostane agent odmenu. Predstavte si počítačovú hru Super Mario. Vy ste Mario, nachádzate sa v úrovni hry, stojíte vedľa okraja útesu. Nad vami je minca. Vy ako Mario, v úrovni hry, na konkrétnej pozícii... to je váš stav. Pohyb o jeden krok doprava (akcia) vás zavedie cez okraj, čo by vám prinieslo nízke číselné skóre. Avšak stlačením tlačidla skoku by ste získali bod a zostali nažive. To je pozitívny výsledok, ktorý by vám mal priniesť pozitívne číselné skóre. +Učenie posilňovaním zahŕňa tri dôležité pojmy: agenta, niekoľko stavov a súbor akcií pre každý stav. Vykonaním akcie v určenom stave dostáva agent odmenu. Predstavte si znova počítačovú hru Super Mario. Ste Mario, ste v úrovni hry, stojíte vedľa okraja útesu. Nad vami je minca. Vy ako Mario, v hernej úrovni, na konkrétnej pozícii ... to je váš stav. Pohyb o jeden krok doprava (akcia) vás zhodí z okraja a dostanete nízke číselné skóre. Stlačenie tlačidla skoku by vám však umožnilo získať bod a prežiť. To je pozitívny výsledok a mal by vám udeliť pozitívne číselné skóre. -Pomocou posilňovacieho učenia a simulátora (hry) sa môžete naučiť, ako hrať hru tak, aby ste maximalizovali odmenu, čo znamená zostať nažive a získať čo najviac bodov. +Použitím učenia posilňovaním a simulátora (hry) sa môžete naučiť, ako hrať hru tak, aby ste maximalizovali odmenu, ktorou je prežitie a získanie čo najväčšieho počtu bodov. -[![Úvod do posilňovacieho učenia](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) +[![Úvod do učenia posilňovaním](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) -> 🎥 Kliknite na obrázok vyššie a vypočujte si Dmitryho diskusiu o posilňovacom učení +> 🎥 Kliknite na obrázok vyššie, aby ste si vypočuli Dmitryho diskusiu o učenie posilňovaním ## [Kvíz pred prednáškou](https://ff-quizzes.netlify.app/en/ml/) ## Predpoklady a nastavenie -V tejto lekcii budeme experimentovať s kódom v Pythone. Mali by ste byť schopní spustiť kód Jupyter Notebook z tejto lekcie, buď na svojom počítači alebo niekde v cloude. +V tejto lekcii budeme experimentovať s kódom v Pythone. Mali by ste byť schopní spustiť kód Jupyter Notebooku z tejto lekcie, buď na vašom počítači alebo niekde v cloude. -Môžete otvoriť [notebook lekcie](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) a prejsť touto lekciou, aby ste si ju osvojili. +Môžete otvoriť [lesson notebook](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) a prejsť si túto lekciu postupne. -> **Poznámka:** Ak otvárate tento kód z cloudu, musíte tiež stiahnuť súbor [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), ktorý sa používa v kóde notebooku. Pridajte ho do rovnakého adresára ako notebook. +> **Poznámka:** Ak otvárate tento kód z cloudu, musíte si tiež stiahnuť súbor [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), ktorý sa používa v kóde notebooku. Pridajte ho do rovnakého adresára ako notebook. ## Úvod -V tejto lekcii preskúmame svet **[Peter a vlk](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, inšpirovaný hudobnou rozprávkou od ruského skladateľa [Sergeja Prokofieva](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Použijeme **posilňovacie učenie**, aby sme umožnili Petrovi preskúmať jeho prostredie, zbierať chutné jablká a vyhnúť sa stretnutiu s vlkom. +V tejto lekcii preskúmame svet **[Petra a vlka](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, ktorý je inšpirovaný hudobnou rozprávkou od ruského skladateľa, [Sergeja Prokofieva](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Použijeme **učenie posilňovaním** na to, aby Peter preskúmal svoje prostredie, zbieral chutné jabĺčka a vyhýbal sa stretnutiu s vlkom. -**Posilňovacie učenie** (RL) je technika učenia, ktorá nám umožňuje naučiť sa optimálne správanie **agenta** v určitom **prostredí** vykonávaním mnohých experimentov. Agent v tomto prostredí by mal mať nejaký **cieľ**, definovaný pomocou **funkcie odmeny**. +**Učenie posilňovaním** (RL) je technika učenia, ktorá nám umožňuje naučiť sa optimálne správanie **agenta** v nejakom **prostredí** vykonaním mnohých experimentov. Agent v tomto prostredí by mal mať nejaký **cieľ**, definovaný **funkciou odmeny**. ## Prostredie -Pre jednoduchosť si predstavme Petrov svet ako štvorcovú dosku veľkosti `šírka` x `výška`, ako je táto: +Pre jednoduchosť si predstavme Petrovu svet ako štvorcovú dosku veľkosti `width` x `height` takto: -![Petrovo prostredie](../../../../8-Reinforcement/1-QLearning/images/environment.png) +![Petrovo prostredie](../../../../translated_images/sk/environment.40ba3cb66256c93f.webp) Každá bunka na tejto doske môže byť: -* **zem**, po ktorej Peter a iné bytosti môžu chodiť. +* **zem**, po ktorej sa Peter a ostatné tvory môžu pohybovať. * **voda**, po ktorej samozrejme nemôžete chodiť. -* **strom** alebo **tráva**, miesto, kde si môžete oddýchnuť. +* **strom** alebo **tráva**, miesto na oddych. * **jablko**, ktoré predstavuje niečo, čo by Peter rád našiel, aby sa nakŕmil. * **vlk**, ktorý je nebezpečný a treba sa mu vyhnúť. -Existuje samostatný Python modul, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), ktorý obsahuje kód na prácu s týmto prostredím. Keďže tento kód nie je dôležitý pre pochopenie našich konceptov, importujeme modul a použijeme ho na vytvorenie vzorovej dosky (blok kódu 1): +Existuje samostatný Python modul, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), ktorý obsahuje kód na prácu s týmto prostredím. Pretože tento kód nie je dôležitý pre pochopenie našich konceptov, importujeme modul a použijeme ho na vytvorenie vzorovej dosky (kódový blok 1): ```python from rlboard import * @@ -52,63 +52,63 @@ m.randomize(seed=13) m.plot() ``` -Tento kód by mal vytlačiť obrázok prostredia podobný tomu vyššie. +Tento kód by mal vytlačiť obrázok prostredia podobný ako vyššie. ## Akcie a politika -V našom príklade by Petrovým cieľom bolo nájsť jablko, pričom sa vyhne vlkovi a iným prekážkam. Na to môže v podstate chodiť, kým nenájde jablko. +V našom príklade by Petrovým cieľom bolo nájsť jablko a vyhnúť sa vlkovi a iným prekážkam. Na to môže v podstate chodiť, kým nenájde jablko. -Preto si na akejkoľvek pozícii môže vybrať jednu z nasledujúcich akcií: hore, dole, doľava a doprava. +Preto si môže zvoliť na akejkoľvek pozícii jednu z nasledujúcich akcií: hore, dole, vľavo a vpravo. -Tieto akcie definujeme ako slovník a mapujeme ich na dvojice zodpovedajúcich zmien súradníc. Napríklad pohyb doprava (`R`) by zodpovedal dvojici `(1,0)`. (blok kódu 2): +Tieto akcie definujeme ako slovník, a namapujeme ich na dvojice zodpovedajúcich zmien súradníc. Napríklad, pohyb doprava (`R`) zodpovedá dvojici `(1,0)`. (kódový blok 2): ```python actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) } action_idx = { a : i for i,a in enumerate(actions.keys()) } ``` -Aby sme to zhrnuli, stratégia a cieľ tohto scenára sú nasledovné: +Na záver, stratégia a cieľ scénaru sú nasledovné: -- **Stratégia** nášho agenta (Petra) je definovaná tzv. **politikou**. Politika je funkcia, ktorá vracia akciu v akomkoľvek danom stave. V našom prípade je stav problému reprezentovaný doskou vrátane aktuálnej pozície hráča. +- **Stratégia** nášho agenta (Petra) je definovaná tzv. **politikou**. Politika je funkcia, ktorá vracia akciu v danom stave. V našom prípade je stav problému reprezentovaný doskou vrátane aktuálnej pozície hráča. -- **Cieľ** posilňovacieho učenia je nakoniec naučiť sa dobrú politiku, ktorá nám umožní efektívne vyriešiť problém. Ako základ však zvážme najjednoduchšiu politiku nazývanú **náhodná chôdza**. +- **Cieľ** učenia posilňovaním je nakoniec naučiť sa dobrú politiku, ktorá nám umožní problém efektívne vyriešiť. Avšak ako základ zvážme najjednoduchšiu politiku nazvanú **náhodná prechádzka**. -## Náhodná chôdza +## Náhodná prechádzka -Najprv vyriešme náš problém implementáciou stratégie náhodnej chôdze. Pri náhodnej chôdzi budeme náhodne vyberať ďalšiu akciu z povolených akcií, kým nedosiahneme jablko (blok kódu 3). +Najskôr vyriešme náš problém implementovaním stratégie náhodnej prechádzky. Pri náhodnej prechádzke náhodne vyberieme ďalšiu akciu z povolených akcií, kým nedosiahneme jablko (kódový blok 3). -1. Implementujte náhodnú chôdzu pomocou nižšie uvedeného kódu: +1. Implementujte náhodnú prechádzku pomocou nasledujúceho kódu: ```python def random_policy(m): return random.choice(list(actions)) def walk(m,policy,start_position=None): - n = 0 # number of steps - # set initial position + n = 0 # počet krokov + # nastaviť počiatočnú pozíciu if start_position: m.human = start_position else: m.random_start() while True: if m.at() == Board.Cell.apple: - return n # success! + return n # úspech! if m.at() in [Board.Cell.wolf, Board.Cell.water]: - return -1 # eaten by wolf or drowned + return -1 # zožraný vlkom alebo utopený while True: a = actions[policy(m)] new_pos = m.move_pos(m.human,a) if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water: - m.move(a) # do the actual move + m.move(a) # vykonať skutočný pohyb break n+=1 walk(m,random_policy) ``` - Volanie `walk` by malo vrátiť dĺžku zodpovedajúcej cesty, ktorá sa môže líšiť od jedného spustenia k druhému. + Volanie `walk` by malo vrátiť dĺžku zodpovedajúcej cesty, ktorá sa môže líšiť pri každom spustení. -1. Spustite experiment chôdze niekoľkokrát (povedzme 100-krát) a vytlačte výsledné štatistiky (blok kódu 4): +1. Spustite experiment prechádzky niekoľkokrát (napríklad 100) a vypíšte výslednú štatistiku (kódový blok 4): ```python def print_statistics(policy): @@ -125,17 +125,17 @@ Najprv vyriešme náš problém implementáciou stratégie náhodnej chôdze. Pr print_statistics(random_policy) ``` - Všimnite si, že priemerná dĺžka cesty je okolo 30-40 krokov, čo je dosť veľa, vzhľadom na to, že priemerná vzdialenosť k najbližšiemu jablku je okolo 5-6 krokov. + Všimnite si, že priemerná dĺžka cesty je okolo 30-40 krokov, čo je dosť veľa, vzhľadom na fakt, že priemerná vzdialenosť k najbližšiemu jablku je okolo 5-6 krokov. - Môžete tiež vidieť, ako vyzerá Petrov pohyb počas náhodnej chôdze: + Tiež môžete vidieť, ako vyzerá Peterov pohyb počas náhodnej prechádzky: - ![Petrova náhodná chôdza](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) + ![Petrova náhodná prechádzka](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) ## Funkcia odmeny -Aby bola naša politika inteligentnejšia, musíme pochopiť, ktoré pohyby sú "lepšie" ako ostatné. Na to musíme definovať náš cieľ. +Aby sme našu politiku spravili inteligentnejšou, potrebujeme pochopiť, ktoré ťahy sú „lepšie“ než iné. Na to musíme definovať náš cieľ. -Cieľ môže byť definovaný pomocou **funkcie odmeny**, ktorá vráti nejakú hodnotu skóre pre každý stav. Čím vyššie číslo, tým lepšia funkcia odmeny. (blok kódu 5) +Cieľ môžeme definovať pomocou **funkcie odmeny**, ktorá vráti nejakú hodnotu skóre pre každý stav. Čím vyššie číslo, tým lepšia odmena. (kódový blok 5) ```python move_reward = -0.1 @@ -154,39 +154,115 @@ def reward(m,pos=None): return move_reward ``` -Zaujímavé na funkciách odmeny je, že vo väčšine prípadov *dostaneme podstatnú odmenu až na konci hry*. To znamená, že náš algoritmus by mal nejako zapamätať "dobré" kroky, ktoré vedú k pozitívnej odmene na konci, a zvýšiť ich dôležitosť. Podobne by mali byť odradené všetky pohyby, ktoré vedú k zlým výsledkom. +Zaujímavé na funkciách odmeny je, že vo väčšine prípadov *dostaneme výraznú odmenu až na konci hry*. To znamená, že náš algoritmus by mal nejako „pamätať“ si „dobré“ kroky, ktoré vedú k pozitívnej odmene na konci, a zvýšiť ich význam. Podobne všetky kroky, ktoré vedú k zlým výsledkom, by mali byť odradené. ## Q-Learning -Algoritmus, ktorý tu budeme diskutovať, sa nazýva **Q-Learning**. V tomto algoritme je politika definovaná funkciou (alebo dátovou štruktúrou) nazývanou **Q-Tabuľka**. Tá zaznamenáva "kvalitu" každej akcie v danom stave. +Algoritmus, o ktorom tu budeme diskutovať, sa nazýva **Q-Learning**. V tomto algoritme je politika definovaná funkciou (alebo dátovou štruktúrou) nazývanou **Q-Tabuľka**. Tá zaznamenáva „dobrotu“ každej akcie v danom stave. -Nazýva sa Q-Tabuľka, pretože je často výhodné ju reprezentovať ako tabuľku alebo viacrozmerné pole. Keďže naša doska má rozmery `šírka` x `výška`, môžeme Q-Tabuľku reprezentovať pomocou numpy poľa s tvarom `šírka` x `výška` x `len(akcie)`: (blok kódu 6) +Nazýva sa Q-Tabuľka, pretože je často pohodlné ju reprezentovať ako tabuľku alebo viacrozmerné pole. Keďže naša doska má rozmery `width` x `height`, môžeme Q-Tabuľku reprezentovať pomocou numpy poľa s tvarom `width` x `height` x `len(actions)`: (kódový blok 6) ```python Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) ``` -Všimnite si, že inicializujeme všetky hodnoty Q-Tabuľky rovnakou hodnotou, v našom prípade - 0.25. To zodpovedá politike "náhodnej chôdze", pretože všetky pohyby v každom stave sú rovnako dobré. Q-Tabuľku môžeme odovzdať funkcii `plot`, aby sme tabuľku vizualizovali na doske: `m.plot(Q)`. +Všimnite si, že inicializujeme všetky hodnoty Q-Tabuľky rovnakou hodnotou, v našom prípade - 0.25. To zodpovedá politike „náhodnej prechádzky“, pretože všetky pohyby v každom stave sú rovnako dobré. Môžeme Q-Tabuľku odovzdať funkcii `plot` na vizualizáciu tabuľky na doske: `m.plot(Q)`. -![Petrovo prostredie](../../../../8-Reinforcement/1-QLearning/images/env_init.png) +![Petrovo prostredie](../../../../translated_images/sk/env_init.04e8f26d2d60089e.webp) -V strede každej bunky je "šípka", ktorá označuje preferovaný smer pohybu. Keďže všetky smery sú rovnaké, zobrazí sa bodka. +V strede každej bunky je „šípka“, ktorá ukazuje preferovaný smer pohybu. Keďže všetky smery sú rovnaké, zobrazuje sa bodka. -Teraz musíme spustiť simuláciu, preskúmať naše prostredie a naučiť sa lepšie rozdelenie hodnôt Q-Tabuľky, ktoré nám umožní oveľa rýchlejšie nájsť cestu k jablku. +Teraz musíme spustiť simuláciu, preskúmať naše prostredie a naučiť sa lepšie rozdelenie hodnôt Q-Tabuľky, ktoré nám umožní nájsť cestu k jablku oveľa rýchlejšie. -## Podstata Q-Learningu: Bellmanova rovnica +## Podstata Q-Learningu: Bellmanova rovnice -Keď sa začneme pohybovať, každá akcia bude mať zodpovedajúcu odmenu, t.j. teoreticky môžeme vybrať ďalšiu akciu na základe najvyššej okamžitej odmeny. Avšak vo väčšine stavov pohyb nedosiahne náš cieľ dosiahnuť jablko, a preto nemôžeme okamžite rozhodnúť, ktorý smer je lepší. +Keď začneme pohybovať, každá akcia bude mať zodpovedajúcu odmenu, teda teoreticky môžeme vybrať ďalšiu akciu na základe najvyššej okamžitej odmeny. Avšak v väčšine stavov tento pohyb náš cieľ dosiahnuť nedosiahne, a preto nemôžeme okamžite rozhodnúť, ktorý smer je lepší. -> Pamätajte, že nezáleží na okamžitom výsledku, ale skôr na konečnom výsledku, ktorý dosiahneme na konci simulácie. +> Pamätajte, že nie okamžitý výsledok je podstatný, ale konečný výsledok, ktorý získame na konci simulácie. -Aby sme zohľadnili túto oneskorenú odmenu, musíme použiť princípy **[dynamického programovania](https://en.wikipedia.org/wiki/Dynamic_programming)**, ktoré nám umožňujú premýšľať o našom probléme rekurzívne. +Aby sme tento oneskorený odmien započítali, potrebujeme použiť princípy **[dynamického programovania](https://en.wikipedia.org/wiki/Dynamic_programming)**, ktoré nám umožňujú uvažovať o našom probléme rekurzívne. -Predpokladajme, že sa teraz nachádzame v stave *s*, a chceme sa presunúť do ďalšieho stavu *s'*. Týmto krokom získame okamžitú odmenu *r(s,a)*, definovanú funkciou odmeny, plus nejakú budúcu odmenu. Ak predpokladáme, že naša Q-Tabuľka správne odráža "atraktivitu" každej akcie, potom v stave *s'* si vyberieme akciu *a*, ktorá zodpovedá maximálnej hodnote *Q(s',a')*. Takže najlepšia možná budúca odmena, ktorú by sme mohli získať v stave *s*, bude definovaná ako `max` +Predstavme si, že sme teraz v stave *s* a chceme prejsť do ďalšieho stavu *s'*. Tým získame okamžitú odmenu *r(s,a)* definovanú funkciou odmeny, plus nejakú budúcu odmenu. Ak predpokladáme, že naša Q-Tabuľka správne odráža „atraktivitu“ každej akcie, potom v stave *s'* si vyberieme akciu *a*, ktorá zodpovedá maximálnej hodnote *Q(s',a')*. Najlepšia možná budúca odmena, ktorú môžeme získať v stave *s*, bude definovaná ako `max`a'*Q(s',a')* (maximálna hodnota je vypočítaná pre všetky možné akcie *a'* v stave *s'*). + +Toto dáva **Bellmanovu formulu** na výpočet hodnoty Q-Tabuľky v stave *s* pri akcii *a*: + + + +Tu γ je tzv. **diskontný faktor**, ktorý určuje, do akej miery by ste mali uprednostňovať aktuálnu odmenu pred budúcou odmenou a naopak. + +## Učiaci algoritmus + +Na základe rovnice vyššie môžeme napísať pseudo-kód nášho učiaceho algoritmu: + +* Inicializujte Q-Tabuľku Q rovnakými hodnotami pre všetky stavy a akcie +* Nastavte rýchlosť učenia α ← 1 +* Opakujte simuláciu mnohokrát + 1. Začnite na náhodnej pozícii + 1. Opakujte + 1. Vyberte akciu *a* v stave *s* + 2. Vykonajte akciu presunom do nového stavu *s'* + 3. Ak nastane koniec hry alebo je celková odmena príliš nízka - ukončite simuláciu + 4. Vypočítajte odmenu *r* v novom stave + 5. Aktualizujte Q-Funkciu podľa Bellmanovej rovnice: *Q(s,a)* ← *(1-α)Q(s,a)+α(r+γ maxa'Q(s',a'))* + 6. *s* ← *s'* + 7. Aktualizujte celkovú odmenu a znížte α. + +## Využívanie vs. skúmanie + +V algoritme vyššie sme neurčili, ako presne vyberieme akciu v kroku 2.1. Ak vyberáme akciu náhodne, budeme náhodne **preskúmavať** prostredie a pravdepodobne často zomrieme, ako aj preskúmame oblasti, kde by sme normálne nešli. Alternatívnym prístupom je **využiť** hodnoty Q-Tabuľky, ktoré už poznáme, a teda vybrať najlepšiu akciu (s vyššou hodnotou Q-Tabuľky) v stave *s*. To nás však zabrzdí v preskúmaní ďalších stavov a pravdepodobne nenájdeme optimálne riešenie. + +Preto je najlepším prístupom nájsť rovnováhu medzi skúmaním a využívaním. To môžeme dosiahnuť výberom akcie v stave *s* s pravdepodobnosťou úmernou hodnotám v Q-Tabuľke. Na začiatku, keď sú hodnoty Q-Tabuľky rovnaké, to zodpovedá náhodnému výberu, ale keď sa naučíme viac o našom prostredí, budeme pravdepodobnejšie nasledovať optimálnu trasu, pričom občas dovolíme agentovi vybrať nepreskúmanú cestu. + +## Implementácia v Pythone + +Teraz sme pripravení implementovať učiaci algoritmus. Predtým však potrebujeme funkciu, ktorá prevedie ľubovoľné čísla v Q-Tabuľke na vektor pravdepodobností pre zodpovedajúce akcie. + +1. Vytvorte funkciu `probs()`: + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + ``` + + Pridávame niekoľko `eps` do pôvodného vektora, aby sme sa vyhli deleniu nulou na začiatku, keď sú všetky komponenty vektora rovnaké. + +Spustite učiaci algoritmus počas 5000 experimentov, tiež nazývaných **epochy**: (kódový blok 8) +```python + for epoch in range(5000): + + # Vyberte počiatočný bod + m.random_start() + + # Začnite cestovanie + n=0 + cum_reward = 0 + while True: + x,y = m.human + v = probs(Q[x,y]) + a = random.choices(list(actions),weights=v)[0] + dpos = actions[a] + m.move(dpos,check_correctness=False) # Povoliť hráčovi pohybovať sa mimo dosky, čo ukončí epizódu + r = reward(m) + cum_reward += r + if r==end_reward or cum_reward < -1000: + lpath.append(n) + break + alpha = np.exp(-n / 10e5) + gamma = 0.5 + ai = action_idx[a] + Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max()) + n+=1 +``` + +Po vykonaní tohto algoritmu by mala byť Q-Tabuľka aktualizovaná hodnotami, ktoré definujú atraktivitu rôznych akcií v každom kroku. Môžeme sa pokúsiť vizualizovať Q-Tabuľku vykreslením vektora v každej bunke, ktorý ukáže požadovaný smer pohybu. Pre jednoduchosť kreslíme namiesto šípky malý kruh. + + ## Kontrola politiky -Keďže Q-Tabuľka uvádza „atraktivitu“ každej akcie v každom stave, je pomerne jednoduché použiť ju na definovanie efektívnej navigácie v našom svete. V najjednoduchšom prípade môžeme vybrať akciu zodpovedajúcu najvyššej hodnote v Q-Tabuľke: (kódový blok 9) +Keďže Q-Tabuľka obsahuje „atraktivitu“ každej akcie v každom stave, je veľmi jednoduché ju použiť na definovanie efektívnej navigácie v našom svete. V najjednoduchšom prípade môžeme vybrať akciu zodpovedajúcu najvyššej hodnote Q-Tabuľky: (kódový blok 9) ```python def qpolicy_strict(m): @@ -198,17 +274,18 @@ def qpolicy_strict(m): walk(m,qpolicy_strict) ``` -> Ak vyskúšate vyššie uvedený kód niekoľkokrát, môžete si všimnúť, že sa niekedy „zasekne“ a musíte stlačiť tlačidlo STOP v notebooku, aby ste ho prerušili. K tomu dochádza, pretože môžu existovať situácie, keď si dva stavy „ukazujú“ navzájom z hľadiska optimálnej hodnoty Q, v takom prípade agent skončí pohybom medzi týmito stavmi donekonečna. + +> Ak vyskúšate vyššie uvedený kód niekoľkokrát, môžete si všimnúť, že sa občas "zavesí" a je potrebné stlačiť tlačidlo STOP v poznámkovom bloku, aby sa preruší. To sa deje, pretože môžu nastať situácie, keď dva stavy „ukazujú“ na seba z hľadiska optimálnej hodnoty Q, v takom prípade agent skončí pohybom medzi týmito stavmi nekonečne dlho. ## 🚀Výzva -> **Úloha 1:** Upraviť funkciu `walk` tak, aby obmedzila maximálnu dĺžku cesty na určitý počet krokov (napríklad 100) a pozorovať, ako vyššie uvedený kód občas vráti túto hodnotu. +> **Úloha 1:** Upravte funkciu `walk` tak, aby ohraničila maximálnu dĺžku cesty určitým počtom krokov (napríklad 100) a sledujte, ako sa kód vyššie občas vráti k tejto hodnote. -> **Úloha 2:** Upraviť funkciu `walk` tak, aby sa nevracala na miesta, kde už predtým bola. Tým sa zabráni tomu, aby sa `walk` opakoval, avšak agent sa stále môže ocitnúť „uväznený“ na mieste, z ktorého sa nedokáže dostať. +> **Úloha 2:** Upravte funkciu `walk` tak, aby sa nevracala na miesta, kde už predtým bola. Tým sa zabráni nekonečnému slučkovaniu funkcie `walk`, aj keď agent môže byť stále „uväznený“ na mieste, z ktorého sa nedokáže dostať. ## Navigácia -Lepšia navigačná politika by bola tá, ktorú sme použili počas tréningu, ktorá kombinuje využívanie a skúmanie. V tejto politike vyberieme každú akciu s určitou pravdepodobnosťou, úmernou hodnotám v Q-Tabuľke. Táto stratégia môže stále viesť k tomu, že sa agent vráti na pozíciu, ktorú už preskúmal, ale, ako môžete vidieť z nižšie uvedeného kódu, výsledkom je veľmi krátka priemerná cesta k požadovanému miestu (nezabudnite, že `print_statistics` spúšťa simuláciu 100-krát): (kódový blok 10) +Lepšia navigačná stratégia by bola tá, ktorú sme používali počas tréningu, ktorá kombinuje využitie a skúmanie. V tejto stratégii vyberieme každú akciu s určitým pravdepodobnostným pomerom k hodnotám v Q-tabulke. Táto stratégia môže stále viesť k tomu, že sa agent vráti na pozíciu, ktorú už preskúmal, ale ako vidíte z kódu nižšie, vedie k veľmi krátkej priemernej trase k želanej lokalite (nezabudnite, že `print_statistics` spúšťa simuláciu 100-krát): (kód blok 10) ```python def qpolicy(m): @@ -220,21 +297,23 @@ def qpolicy(m): print_statistics(qpolicy) ``` -Po spustení tohto kódu by ste mali získať oveľa kratšiu priemernú dĺžku cesty ako predtým, v rozmedzí 3-6. +Po spustení tohto kódu by ste mali dostať oveľa kratšiu priemernú dĺžku cesty ako predtým, v rozsahu 3-6. + +## Skúmanie učenia sa procesu -## Skúmanie procesu učenia +Ako sme už spomenuli, učenie je rovnováha medzi skúmaním a využitím získaných poznatkov o štruktúre problému. Videli sme, že výsledky učenia (schopnosť pomôcť agentovi nájsť krátku cestu k cieľu) sa zlepšili, ale je tiež zaujímavé sledovať, ako sa správa priemerná dĺžka cesty počas procesu učenia: -Ako sme spomenuli, proces učenia je rovnováhou medzi skúmaním a využívaním získaných znalostí o štruktúre problémového priestoru. Videli sme, že výsledky učenia (schopnosť pomôcť agentovi nájsť krátku cestu k cieľu) sa zlepšili, ale je tiež zaujímavé pozorovať, ako sa priemerná dĺžka cesty správa počas procesu učenia: + -## Zhrnutie poznatkov: +Učenie možno zhrnúť takto: -- **Priemerná dĺžka cesty sa zvyšuje**. Na začiatku vidíme, že priemerná dĺžka cesty sa zvyšuje. Pravdepodobne je to spôsobené tým, že keď o prostredí nič nevieme, máme tendenciu uviaznuť v zlých stavoch, ako je voda alebo vlk. Keď sa dozvieme viac a začneme tieto znalosti využívať, môžeme prostredie skúmať dlhšie, ale stále nevieme presne, kde sú jablká. +- **Priemerná dĺžka cesty sa zvyšuje**. Čo tu vidíme, je, že spočiatku sa priemerná dĺžka cesty zvyšuje. Pravdepodobne je to spôsobené tým, že keď o prostredí nič nevieme, je pravdepodobné, že skončíme uviaznutí v zlých stavoch, vode alebo u vlka. Keď sa naučíme viac a začneme tieto poznatky využívať, môžeme prostredie skúmať dlhšie, ale stále ešte presne nevieme, kde sú jablká. -- **Dĺžka cesty sa znižuje, ako sa učíme viac**. Keď sa naučíme dosť, agentovi sa ľahšie dosahuje cieľ a dĺžka cesty sa začne znižovať. Stále však skúmame nové možnosti, takže sa často odkloníme od najlepšej cesty a skúmame nové možnosti, čo predlžuje cestu nad optimálnu hodnotu. +- **Dĺžka cesty sa znižuje, ako sa učíme viac**. Keď sa naučíme dosť, je pre agenta ľahšie dosiahnuť cieľ a dĺžka cesty začne klesať. Napriek tomu sme stále otvorení skúmaniu, takže sa často odkloníme od najlepšej cesty a preskúmavame nové možnosti, čím sa cesta predlžuje viac ako optimálne. -- **Dĺžka sa náhle zvýši**. Na grafe tiež vidíme, že v určitom bode sa dĺžka náhle zvýšila. To poukazuje na stochastickú povahu procesu a na to, že môžeme v určitom bode „pokaziť“ koeficienty Q-Tabuľky tým, že ich prepíšeme novými hodnotami. Ideálne by sa tomu malo predísť znížením rýchlosti učenia (napríklad ku koncu tréningu upravujeme hodnoty Q-Tabuľky len o malú hodnotu). +- **Dĺžka prudko stúpa**. Čo tiež pozorujeme na tomto grafe je, že v určitom bode dĺžka prudko stúpla. To naznačuje stochastickú povahu procesu a že môžeme v určitom momente „pokaziť“ koeficienty v Q-tabulke prepísaním novými hodnotami. Toto by sa ideálne malo minimalizovať znížením miery učenia (napríklad ku koncu tréningu upravujeme hodnoty v Q-tabulke len o malú hodnotu). -Celkovo je dôležité pamätať na to, že úspech a kvalita procesu učenia významne závisí od parametrov, ako je rýchlosť učenia, pokles rýchlosti učenia a diskontný faktor. Tieto sa často nazývajú **hyperparametre**, aby sa odlíšili od **parametrov**, ktoré optimalizujeme počas tréningu (napríklad koeficienty Q-Tabuľky). Proces hľadania najlepších hodnôt hyperparametrov sa nazýva **optimalizácia hyperparametrov** a zaslúži si samostatnú tému. +Celkovo je dôležité pamätať si, že úspech a kvalita procesu učenia závisia významne od parametrov, ako je miera učenia, zánik miery učenia a diskontný faktor. Tieto sa často nazývajú **hyperparametre**, aby ich odlíšili od **parametrov**, ktoré optimalizujeme počas tréningu (napríklad koeficienty v Q-tabulke). Proces hľadania najlepších hodnôt hyperparametrov sa nazýva **optimalizácia hyperparametrov** a vyžaduje si samostatnú tému. ## [Kvíz po prednáške](https://ff-quizzes.netlify.app/en/ml/) @@ -243,5 +322,7 @@ Celkovo je dôležité pamätať na to, že úspech a kvalita procesu učenia v --- -**Upozornenie**: -Tento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. \ No newline at end of file + +**Vyhlásenie o zodpovednosti**: +Tento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. + \ No newline at end of file diff --git a/translations/sk/8-Reinforcement/2-Gym/README.md b/translations/sk/8-Reinforcement/2-Gym/README.md index 660949c8f..587a35a08 100644 --- a/translations/sk/8-Reinforcement/2-Gym/README.md +++ b/translations/sk/8-Reinforcement/2-Gym/README.md @@ -1,14 +1,34 @@ +# CartPole korčuľovanie + +Problém, ktorý sme riešili v predchádzajúcej lekcii, sa môže javiť ako odľahčený problém, ktorý nie je naozaj použiteľný v reálnych situáciách. To však nie je pravda, pretože mnohé problémy zo skutočného sveta zdieľajú tento scenár - vrátane hrania šachu alebo Go. Sú podobné, pretože máme šachovnicu s danými pravidlami a **diskrétny stav**. + +## [Prednáškový kvíz](https://ff-quizzes.netlify.app/en/ml/) + +## Úvod + +V tejto lekcii aplikujeme rovnaké princípy Q-Learningu na problém s **kontinuálnym stavom**, teda stavom, ktorý je určený jedným alebo viacerými reálnymi číslami. Budeme riešiť nasledujúci problém: + +> **Problém**: Ak chce Peter uniknúť vlkovi, musí sa vedieť pohybovať rýchlejšie. Ukážeme si, ako sa Peter môže naučiť korčuľovať, konkrétne ako udržať rovnováhu, pomocou Q-Learningu. + +![Veľký únik!](../../../../translated_images/sk/escape.18862db9930337e3.webp) + +> Peter a jeho priatelia sú kreatívni, aby unikli vlkovi! Obrázok od [Jen Looper](https://twitter.com/jenlooper) + +Použijeme zjednodušenú verziu balančného problému známeho ako **CartPole**. V svete cartpole máme horizontálny posuvník, ktorý sa môže pohybovať doľava alebo doprava, a cieľom je vyvážiť vertikálnu tyč na vrchu posuvníka. + +cartpole + ## Predpoklady -V tejto lekcii budeme používať knižnicu **OpenAI Gym** na simuláciu rôznych **prostredí**. Kód z tejto lekcie môžete spustiť lokálne (napr. vo Visual Studio Code), v takom prípade sa simulácia otvorí v novom okne. Pri spúšťaní kódu online môže byť potrebné upraviť kód, ako je popísané [tu](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7). +V tejto lekcii použijeme knižnicu s názvom **OpenAI Gym** na simuláciu rôznych **prostredí**. Môžete spustiť kód tejto lekcie lokálne (napr. z Visual Studio Code), v takom prípade sa simulácia otvorí v novom okne. Pri spúšťaní kódu online možno bude potrebné urobiť niektoré úpravy kódu, ako je popísané [tu](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7). ## OpenAI Gym -V predchádzajúcej lekcii boli pravidlá hry a stav definované triedou `Board`, ktorú sme si sami vytvorili. Tu použijeme špeciálne **simulačné prostredie**, ktoré bude simulovať fyziku za balansujúcou tyčou. Jedným z najpopulárnejších simulačných prostredí na trénovanie algoritmov posilneného učenia je [Gym](https://gym.openai.com/), ktorý spravuje [OpenAI](https://openai.com/). Pomocou Gym môžeme vytvárať rôzne **prostredia**, od simulácie CartPole až po hry Atari. +V predchádzajúcej lekcii nám pravidlá hry a stav definovala trieda `Board`, ktorú sme si definovali sami. Tu použijeme špeciálne **simulačné prostredie**, ktoré bude simulovať fyziku za balančnou tyčou. Jedným z najpopulárnejších simulačných prostredí na trénovanie algoritmov posilňovaného učenia je [Gym](https://gym.openai.com/), ktorý spravuje [OpenAI](https://openai.com/). Použitím tohto gym môžeme vytvárať rôzne **prostredia** od simulácie cartpole až po Atari hry. -> **Poznámka**: Ďalšie prostredia dostupné v OpenAI Gym si môžete pozrieť [tu](https://gym.openai.com/envs/#classic_control). +> **Poznámka**: Ďalšie dostupné prostredia OpenAI Gym môžete vidieť [tu](https://gym.openai.com/envs/#classic_control). -Najskôr nainštalujme Gym a importujme potrebné knižnice (kódový blok 1): +Najskôr si nainštalujme gym a naimportujme potrebné knižnice (kódový blok 1): ```python import sys @@ -20,13 +40,13 @@ import numpy as np import random ``` -## Cvičenie - inicializácia prostredia CartPole +## Cvičenie – inicializácia prostredia cartpole -Aby sme mohli pracovať s problémom balansovania CartPole, musíme inicializovať príslušné prostredie. Každé prostredie je spojené s: +Na prácu s problémom balančnej tyče musíme inicializovať zodpovedajúce prostredie. Každé prostredie je spojené s: -- **Priestorom pozorovaní**, ktorý definuje štruktúru informácií, ktoré dostávame z prostredia. Pri probléme CartPole dostávame polohu tyče, rýchlosť a ďalšie hodnoty. +- **Prieskumný priestor** (Observation space), ktorý definuje štruktúru informácií, ktoré dostávame z prostredia. Pre cartpole problém dostávame polohu tyče, rýchlosť a niektoré ďalšie hodnoty. -- **Priestorom akcií**, ktorý definuje možné akcie. V našom prípade je priestor akcií diskrétny a pozostáva z dvoch akcií - **vľavo** a **vpravo**. (kódový blok 2) +- **Akčný priestor** (Action space), ktorý definuje možné akcie. V našom prípade je akčný priestor diskrétny a skladá sa z dvoch akcií – **doľava** a **doprava**. (kódový blok 2) 1. Na inicializáciu zadajte nasledujúci kód: @@ -37,11 +57,11 @@ Aby sme mohli pracovať s problémom balansovania CartPole, musíme inicializova print(env.action_space.sample()) ``` -Aby sme videli, ako prostredie funguje, spustime krátku simuláciu na 100 krokov. Pri každom kroku poskytneme jednu z akcií, ktoré sa majú vykonať - v tejto simulácii náhodne vyberáme akciu z `action_space`. +Aby sme videli, ako prostredie funguje, spustime krátku simuláciu na 100 krokov. Na každom kroku vykonáme jednu z akcií – v tejto simulácii náhodne vyberieme akciu z `action_space`. -1. Spustite nasledujúci kód a pozrite sa, čo sa stane. +1. Spustite kód nižšie a pozrite sa, čo z toho vyjde. - ✅ Pamätajte, že je preferované spustiť tento kód na lokálnej inštalácii Pythonu! (kódový blok 3) + ✅ Pamätajte, že je vhodnejšie spustiť tento kód na lokálnej inštalácii Pythonu! (kódový blok 3) ```python env.reset() @@ -52,11 +72,11 @@ Aby sme videli, ako prostredie funguje, spustime krátku simuláciu na 100 kroko env.close() ``` - Mali by ste vidieť niečo podobné ako na tomto obrázku: + Mali by ste vidieť niečo podobné tomuto obrázku: - ![nebalansujúci CartPole](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) + ![cartpole bez rovnováhy](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) -1. Počas simulácie musíme získavať pozorovania, aby sme sa rozhodli, ako konať. V skutočnosti funkcia `step` vracia aktuálne pozorovania, funkciu odmeny a príznak `done`, ktorý indikuje, či má zmysel pokračovať v simulácii alebo nie: (kódový blok 4) +1. Počas simulácie potrebujeme získať pozorovania, aby sme sa rozhodli, ako konať. Funkcia `step` vráti aktuálne pozorovanie, odmenu a príznak `done`, ktorý označuje, či má zmysel v simulácii pokračovať alebo nie: (kódový blok 4) ```python env.reset() @@ -69,7 +89,7 @@ Aby sme videli, ako prostredie funguje, spustime krátku simuláciu na 100 kroko env.close() ``` - V notebooku by ste mali vidieť niečo podobné ako toto: + Výstup v notebooku bude vyzerať nejako takto: ```text [ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0 @@ -82,43 +102,43 @@ Aby sme videli, ako prostredie funguje, spustime krátku simuláciu na 100 kroko [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0 ``` - Vektor pozorovaní, ktorý sa vracia pri každom kroku simulácie, obsahuje nasledujúce hodnoty: + Pozorovací vektor, ktorý sa vracia na každom kroku simulácie, obsahuje nasledujúce hodnoty: - Poloha vozíka - Rýchlosť vozíka - Uhol tyče - Rýchlosť rotácie tyče -1. Získajte minimálnu a maximálnu hodnotu týchto čísel: (kódový blok 5) +1. Zistite minimum a maximum týchto hodnôt: (kódový blok 5) ```python print(env.observation_space.low) print(env.observation_space.high) ``` - Môžete si tiež všimnúť, že hodnota odmeny pri každom kroku simulácie je vždy 1. Je to preto, že naším cieľom je prežiť čo najdlhšie, t. j. udržať tyč v primerane vertikálnej polohe čo najdlhšie. + Tiež si môžete všimnúť, že hodnota odmeny pri každom kroku simulácie je vždy 1. Je to preto, že naším cieľom je prežiť čo najdlhšie, teda udržať tyč v primerane vertikálnej polohe čo najdlhšie. - ✅ V skutočnosti sa simulácia CartPole považuje za vyriešenú, ak sa nám podarí dosiahnuť priemernú odmenu 195 počas 100 po sebe nasledujúcich pokusov. + ✅ Simulácia CartPole je považovaná za vyriešenú, ak dosiahneme priemernú odmenu 195 za 100 po sebe nasledujúcich pokusov. ## Diskretizácia stavu -Pri Q-Learningu musíme vytvoriť Q-Tabuľku, ktorá definuje, čo robiť v každom stave. Aby sme to mohli urobiť, potrebujeme, aby bol stav **diskrétny**, presnejšie, aby obsahoval konečný počet diskrétnych hodnôt. Preto musíme nejako **diskretizovať** naše pozorovania, mapovať ich na konečnú množinu stavov. +V Q-Learningu potrebujeme vytvoriť Q-tabulu, ktorá definuje, čo robiť v každom stave. Aby sme to mohli urobiť, potrebujeme, aby bol stav **diskrétny**, presnejšie, aby obsahoval konečný počet diskrétnych hodnôt. Preto musíme nejako **diskretizovať** naše pozorovania a namapovať ich na konečnú množinu stavov. -Existuje niekoľko spôsobov, ako to urobiť: +Existuje niekoľko spôsobov, ako to môžeme robiť: -- **Rozdelenie na intervaly**. Ak poznáme interval určitej hodnoty, môžeme tento interval rozdeliť na niekoľko **intervalov** a potom nahradiť hodnotu číslom intervalu, do ktorého patrí. To sa dá urobiť pomocou metódy numpy [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html). V tomto prípade budeme presne vedieť veľkosť stavu, pretože bude závisieť od počtu intervalov, ktoré vyberieme na digitalizáciu. +- **Rozdeliť do intervalov (bins)**. Ak poznáme interval určitej hodnoty, môžeme tento interval rozdeliť na niekoľko **intervalov (bins)** a následne hodnotu nahradiť číslom intervalu, do ktorého patrí. To sa dá urobiť pomocou numpy metódy [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html). V tomto prípade presne poznáme veľkosť stavu, pretože bude závisieť od počtu intervalov, ktoré vyberieme pre digitalizáciu. + +✅ Môžeme použiť lineárnu interpoláciu na prenesenie hodnôt do nejakého konečného intervalu (napr. od -20 do 20) a potom čísla previesť na celé čísla zaokrúhlením. Toto nám dá trochu menej kontroly nad veľkosťou stavu, najmä ak nepoznáme presné rozsahy vstupných hodnôt. Napríklad v našom prípade 2 zo 4 hodnôt nemajú horné alebo dolné hranice, čo by mohlo viesť k nekonečnému počtu stavov. -✅ Môžeme použiť lineárnu interpoláciu na privedenie hodnôt do určitého konečného intervalu (napríklad od -20 do 20) a potom previesť čísla na celé čísla zaokrúhlením. To nám dáva o niečo menšiu kontrolu nad veľkosťou stavu, najmä ak nepoznáme presné rozsahy vstupných hodnôt. Napríklad v našom prípade 2 zo 4 hodnôt nemajú horné/dolné hranice svojich hodnôt, čo môže viesť k nekonečnému počtu stavov. +V našom príklade použijeme druhý prístup. Ako si neskôr všimnete, napriek nedefinovaným horným a dolným hraniciam tieto hodnoty zriedkavo nadobúdajú hodnoty mimo určitých konečných intervalov, takže stavy s extrémnymi hodnotami budú veľmi zriedkavé. -V našom príklade použijeme druhý prístup. Ako si neskôr všimnete, napriek nedefinovaným horným/dolným hraniciam tieto hodnoty zriedka nadobúdajú hodnoty mimo určitých konečných intervalov, takže stavy s extrémnymi hodnotami budú veľmi zriedkavé. - -1. Tu je funkcia, ktorá vezme pozorovanie z nášho modelu a vytvorí z neho štvoricu 4 celých čísel: (kódový blok 6) +1. Tu je funkcia, ktorá vezme pozorovanie nášho modelu a vráti 4-ticu celých čísel: (kódový blok 6) ```python def discretize(x): return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int)) ``` -1. Preskúmajme aj ďalšiu metódu diskretizácie pomocou intervalov: (kódový blok 7) +1. Preskúmajme aj druhý spôsob diskretizácie pomocou intervalov: (kódový blok 7) ```python def create_bins(i,num): @@ -126,17 +146,17 @@ V našom príklade použijeme druhý prístup. Ako si neskôr všimnete, napriek print("Sample bins for interval (-5,5) with 10 bins\n",create_bins((-5,5),10)) - ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # intervals of values for each parameter - nbins = [20,20,10,10] # number of bins for each parameter + ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # intervaly hodnôt pre každý parameter + nbins = [20,20,10,10] # počet priehradiek pre každý parameter bins = [create_bins(ints[i],nbins[i]) for i in range(4)] def discretize_bins(x): return tuple(np.digitize(x[i],bins[i]) for i in range(4)) ``` -1. Teraz spustime krátku simuláciu a pozorujme tieto diskrétne hodnoty prostredia. Skúste použiť `discretize` aj `discretize_bins` a zistite, či je medzi nimi rozdiel. +1. Teraz spustime krátku simuláciu a pozorujme tieto diskrétne hodnoty prostredia. Kľudne vyskúšajte obe funkcie `discretize` a `discretize_bins` a uvidíte, či je rozdiel. - ✅ `discretize_bins` vracia číslo intervalu, ktoré je 0-based. Takže pre hodnoty vstupnej premennej okolo 0 vracia číslo zo stredu intervalu (10). Pri `discretize` sme sa nestarali o rozsah výstupných hodnôt, umožnili sme im byť záporné, takže hodnoty stavu nie sú posunuté a 0 zodpovedá 0. (kódový blok 8) + ✅ `discretize_bins` vracia číslo intervalu, ktoré je indexované od 0. Preto pre hodnoty vstupnej premennej okolo 0 vracia číslo zo stredu intervalu (10). Vo `discretize` sme nerozlišovali rozsah výstupných hodnôt, ktoré mohli byť aj záporné, takže hodnoty stavu nie sú posunuté a 0 zodpovedá 0. (kódový blok 8) ```python env.reset() @@ -145,20 +165,20 @@ V našom príklade použijeme druhý prístup. Ako si neskôr všimnete, napriek while not done: #env.render() obs, rew, done, info = env.step(env.action_space.sample()) - #print(discretize_bins(obs)) + #print(diskretizované_segmenty(obs)) print(discretize(obs)) env.close() ``` - ✅ Odkomentujte riadok začínajúci `env.render`, ak chcete vidieť, ako sa prostredie vykonáva. Inak ho môžete spustiť na pozadí, čo je rýchlejšie. Tento "neviditeľný" spôsob vykonávania použijeme počas procesu Q-Learningu. + ✅ Odinštalujte riadok začínajúci `env.render`, ak chcete vidieť, ako prostredie vykonáva simuláciu. Inak môžete simuláciu nechať bežať na pozadí, čo je rýchlejšie. Túto „neviditeľnú“ simuláciu použijeme počas Q-Learning procesu. -## Štruktúra Q-Tabuľky +## Štruktúra Q-tabule -V našej predchádzajúcej lekcii bol stav jednoduchou dvojicou čísel od 0 do 8, a preto bolo pohodlné reprezentovať Q-Tabuľku pomocou numpy tenzora s tvarom 8x8x2. Ak použijeme diskretizáciu pomocou intervalov, veľkosť nášho stavového vektora je tiež známa, takže môžeme použiť rovnaký prístup a reprezentovať stav pomocou poľa s tvarom 20x20x10x10x2 (tu 2 je dimenzia priestoru akcií a prvé dimenzie zodpovedajú počtu intervalov, ktoré sme vybrali na použitie pre každú z parametrov v priestore pozorovaní). +V predchádzajúcej lekcii bol stav jednoduchý pár čísel od 0 do 8, preto bolo pohodlné reprezentovať Q-tabulu ako numpy tenzor s tvarom 8x8x2. Ak použijeme diskretizáciu pomocou intervalov, veľkosť nášho vektorového stavu je tiež známa, takže môžeme použiť rovnaký prístup a reprezentovať stav ako pole tvaru 20x20x10x10x2 (tu je 2 rozmer akčného priestoru a prvé rozmery zodpovedajú počtu intervalov, ktoré sme vybrali pre každý parameter v pozorovacom priestore). -Avšak niekedy presné dimenzie priestoru pozorovaní nie sú známe. V prípade funkcie `discretize` si nikdy nemôžeme byť istí, že náš stav zostane v určitých hraniciach, pretože niektoré z pôvodných hodnôt nie sú ohraničené. Preto použijeme trochu iný prístup a reprezentujeme Q-Tabuľku pomocou slovníka. +Niekedy však presné rozmery pozorovacieho priestoru nie sú známe. V prípade funkcie `discretize` nemusíme byť istí, že náš stav zostane v určitých hraniciach, pretože niektoré z pôvodných hodnôt nie sú ohraničené. Preto použijeme trochu iný prístup a budeme reprezentovať Q-tabulu ako slovník. -1. Použite dvojicu *(state,action)* ako kľúč slovníka a hodnota by zodpovedala hodnote záznamu Q-Tabuľky. (kódový blok 9) +1. Použite dvojicu *(stav, akcia)* ako kľúč slovníka a hodnota bude zodpovedať hodnote položky v Q-tabuli. (kódový blok 9) ```python Q = {} @@ -168,38 +188,38 @@ Avšak niekedy presné dimenzie priestoru pozorovaní nie sú známe. V prípade return [Q.get((state,a),0) for a in actions] ``` - Tu tiež definujeme funkciu `qvalues()`, ktorá vracia zoznam hodnôt Q-Tabuľky pre daný stav, ktorý zodpovedá všetkým možným akciám. Ak záznam nie je prítomný v Q-Tabuľke, vrátime 0 ako predvolenú hodnotu. + Tu tiež definujeme funkciu `qvalues()`, ktorá vráti zoznam hodnôt Q-tabule pre daný stav zodpovedajúci všetkým možným akciám. Ak položka v Q-tabuli neexistuje, vrátime 0 ako predvolenú hodnotu. ## Začnime Q-Learning -Teraz sme pripravení naučiť Petra balansovať! +Teraz sme pripravení naučiť Petra, ako udržať rovnováhu! -1. Najskôr nastavme niektoré hyperparametre: (kódový blok 10) +1. Najprv nastavme niektoré hyperparametre: (kódový blok 10) ```python - # hyperparameters + # hyperparametre alpha = 0.3 gamma = 0.9 epsilon = 0.90 ``` - Tu `alpha` je **rýchlosť učenia**, ktorá určuje, do akej miery by sme mali upraviť aktuálne hodnoty Q-Tabuľky pri každom kroku. V predchádzajúcej lekcii sme začali s hodnotou 1 a potom sme znižovali `alpha` na nižšie hodnoty počas tréningu. V tomto príklade ju ponecháme konštantnú len pre jednoduchosť a môžete experimentovať s úpravou hodnôt `alpha` neskôr. + Tu je `alpha` **rýchlosť učenia**, ktorá definuje, do akej miery by sme mali upravovať aktuálne hodnoty Q-tabule na každom kroku. V predchádzajúcej lekcii sme začínali s hodnotou 1 a potom sme postupne znižovali `alpha` počas tréningu. V tomto príklade ju necháme konštantnú, pre jednoduchosť, a môžete si neskôr experimentovať s jej nastavením. - `gamma` je **faktor diskontovania**, ktorý ukazuje, do akej miery by sme mali uprednostniť budúcu odmenu pred aktuálnou odmenou. + `gamma` je **diskontný faktor**, ktorý ukazuje, do akej miery by sme mali uprednostňovať budúce odmeny oproti súčasným. - `epsilon` je **faktor prieskumu/využitia**, ktorý určuje, či by sme mali uprednostniť prieskum pred využitím alebo naopak. V našom algoritme v `epsilon` percentách prípadov vyberieme ďalšiu akciu podľa hodnôt Q-Tabuľky a v zostávajúcom počte prípadov vykonáme náhodnú akciu. To nám umožní preskúmať oblasti vyhľadávacieho priestoru, ktoré sme nikdy predtým nevideli. + `epsilon` je **faktor prieskumu/využitia**, ktorý určuje, či by sme mali uprednostniť prieskum pred využívaním alebo naopak. V našom algoritme v `epsilon` percentách prípadov vyberieme nasledujúcu akciu podľa hodnôt Q-tabule a v ostatných prípadoch vykonáme náhodnú akciu. To nám umožní preskúmať oblasti vyhľadávacieho priestoru, ktoré sme ešte nevideli. - ✅ Z hľadiska balansovania - výber náhodnej akcie (prieskum) by pôsobil ako náhodný úder nesprávnym smerom a tyč by sa musela naučiť, ako obnoviť rovnováhu z týchto "chýb". + ✅ Pokiaľ ide o balančné problémy - voľba náhodnej akcie (prieskum) by bola ako náhodný úder zlým smerom a tyč by sa musela naučiť, ako z týchto „chýb“ obnoviť rovnováhu. -### Zlepšenie algoritmu +### Vylepšiť algoritmus Môžeme tiež urobiť dve vylepšenia nášho algoritmu z predchádzajúcej lekcie: -- **Vypočítať priemernú kumulatívnu odmenu** počas niekoľkých simulácií. Pokrok budeme tlačiť každých 5000 iterácií a priemernú kumulatívnu odmenu vypočítame za toto obdobie. To znamená, že ak získame viac ako 195 bodov, môžeme problém považovať za vyriešený, dokonca s vyššou kvalitou, než je požadovaná. - -- **Vypočítať maximálny priemerný kumulatívny výsledok**, `Qmax`, a uložíme Q-Tabuľku zodpovedajúcu tomuto výsledku. Keď spustíte tréning, všimnete si, že niekedy priemerný kumulatívny výsledok začne klesať, a chceme si ponechať hodnoty Q-Tabuľky, ktoré zodpovedajú najlepšiemu modelu pozorovanému počas tréningu. +- **Vypočítať priemernú kumulatívnu odmenu** za určitý počet simulácií. Budeme tlačiť priebeh každých 5000 iterácií a za toto obdobie vyhladia kumulatívnu odmenu. To znamená, že ak dosiahneme viac ako 195 bodov, môžeme považovať problém za vyriešený, dokonca s ešte lepšou kvalitou. + +- **Vypočítať maximálny priemerný kumulatívny výsledok**, `Qmax`, a uložíme Q-tabulu príslušnú k tomuto výsledku. Pri tréningu často uvidíte, že priemerný kumulatívny výsledok začne klesať a my chceme uchovať hodnoty Q-tabule, ktoré zodpovedajú najlepšiemu modelu pozorovanému počas tréningu. -1. Zbierajte všetky kumulatívne odmeny pri každej simulácii do vektora `rewards` na ďalšie vykreslenie. (kódový blok 11) +1. Zhromaždite všetky kumulatívne odmeny pri každej simulácii do vektora `rewards` pre ďalšie znázornenie. (kódový blok 11) ```python def probs(v,eps=1e-4): @@ -214,15 +234,15 @@ Môžeme tiež urobiť dve vylepšenia nášho algoritmu z predchádzajúcej lek obs = env.reset() done = False cum_reward=0 - # == do the simulation == + # == vykonaj simuláciu == while not done: s = discretize(obs) if random.random() Qmax: @@ -242,23 +262,23 @@ Môžeme tiež urobiť dve vylepšenia nášho algoritmu z predchádzajúcej lek Čo si môžete všimnúť z týchto výsledkov: -- **Blízko nášho cieľa**. Sme veľmi blízko k dosiahnutiu cieľa získania 195 kumulatívnych odmien počas 100+ po sebe nasledujúcich simulácií, alebo sme ho možno už dosiahli! Aj keď získame menšie čísla, stále to nevieme, pretože priemerujeme cez 5000 pokusov a formálne kritérium vyžaduje iba 100 pokusov. +- **Blízko nášmu cieľu**. Sme veľmi blízko dosiahnutia ciela, ktorý je získať 195 kumulatívnych odmien za 100+ po sebe nasledujúcich spustení simulácie, alebo sme ho možno už dosiahli! Aj keď dostaneme menšie čísla, ešte to nevieme, pretože vyhladzujeme cez 5000 spustení a formálne je potrebných len 100. + +- **Odmena začína klesať**. Niekedy odmena začne klesať, čo znamená, že môžeme „zničiť“ už naučené hodnoty v Q-tabuli novými, ktoré situáciu zhoršujú. -- **Odmena začína klesať**. Niekedy odmena začne klesať, čo znamená, že môžeme "zničiť" už naučené hodnoty v Q-Tabuľke tými, ktoré situáciu zhoršujú. +Toto pozorovanie je jasnejšie viditeľné, keď si zobrazíme priebeh tréningu. -Toto pozorovanie je jasnejšie viditeľné, ak vykreslíme pokrok tréningu. +## Grafický priebeh tréningu -## Vykreslenie pokroku tréningu - -Počas tréningu sme zbierali hodnotu kumulatívnej odmeny pri každej iterácii do vektora `rewards`. Takto to vyzerá, keď to vykreslíme proti číslu iterácie: +Počas tréningu sme zhromaždili kumulatívnu odmenu v každej iterácii do vektora `rewards`. Takto to vyzerá, keď vyobrazíme túto hodnotu proti číslu iterácie: ```python plt.plot(rewards) ``` -![surový pokrok](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png) +![surový priebeh](../../../../translated_images/sk/train_progress_raw.2adfdf2daea09c59.webp) -Z tohto grafu nie je možné nič povedať, pretože kvôli povahe stochastického tréningového procesu sa dĺžka tréningových relácií veľmi líši. Aby sme tento graf urobili zrozumiteľnejším, môžeme vypočítať **bežiaci priemer** cez sériu experimentov, povedzme 100. To sa dá pohodlne urobiť pomocou `np.convolve`: (kódový blok 12) +Z tohto grafu nemožno nič vyčítať, pretože vzhľadom na povahu stochastického tréningového procesu sa dĺžka tréningových sekvencií veľmi líši. Aby to dávalo väčší zmysel, môžeme vypočítať **bežiaci priemer** cez sériu experimentov, povedzme 100. To sa dá pohodlne urobiť pomocou `np.convolve`: (kódový blok 12) ```python def running_average(x,window): @@ -267,21 +287,24 @@ def running_average(x,window): plt.plot(running_average(rewards,100)) ``` -![pokrok tréningu](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png) +![priebeh tréningu](../../../../translated_images/sk/train_progress_runav.c71694a8fa9ab359.webp) + +## Menenie hyperparametrov + +Pre stabilnejšie učenie je rozumné počas tréningu niektoré hyperparametre upravovať. Najmä: + +- **Pre rýchlosť učenia** `alpha` môžeme začať s hodnotami blízkymi 1 a postupne parameter znižovať. Postupom času budeme mať dobré pravdepodobnostné hodnoty v Q-tabuli a preto ich budeme upravovať len mierne, nie úplne meniť na nové hodnoty. -## Zmena hyperparametrov +- **Zvýšiť epsilon**. Môžeme postupne zvyšovať `epsilon`, aby sme menej preskúmavali a viac využívali. Pravdepodobne je rozumné začať s nízkou hodnotou `epsilon` a postupne ju zvyšovať takmer na 1. -Aby bolo učenie stabilnejšie, má zmysel upraviť niektoré z našich hyperparametrov počas tréningu. Konkrétne: +> **Úloha 1**: Hrajte sa s hodnotami hyperparametrov a skúste dosiahnuť vyššiu kumulatívnu odmenu. Dosahujete hodnoty nad 195? -- **Pre rýchlosť učenia**, `alpha`, môžeme začať s hodnotami blízkymi 1 a potom postupne znižovať parameter. S časom budeme získavať dobré pravdepodobnostné hodnoty v Q-Tabuľke, a preto by sme ich mali upravovať mierne, a nie úplne prepisovať novými hodnotami. -- **Zvýšiť epsilon**. Môžeme chcieť pomaly zvyšovať `epsilon`, aby sme menej skúmali a viac využívali. Pravdepodobne má zmysel začať s nižšou hodnotou `epsilon` a postupne ju zvýšiť takmer na 1. -> **Úloha 1**: Skúste experimentovať s hodnotami hyperparametrov a zistite, či dokážete dosiahnuť vyššiu kumulatívnu odmenu. Dosahujete viac ako 195? -> **Úloha 2**: Na formálne vyriešenie problému je potrebné dosiahnuť priemernú odmenu 195 počas 100 po sebe idúcich spustení. Merajte to počas tréningu a uistite sa, že ste problém formálne vyriešili! +> **Úloha 2**: Na formálne vyriešenie problému potrebujete dosiahnuť priemernú odmenu 195 za 100 po sebe nasledujúcich behov. Merajte to počas tréningu a uistite sa, že ste problém formálne vyriešili! ## Vidieť výsledok v akcii -Bolo by zaujímavé vidieť, ako sa vyškolený model správa. Spustime simuláciu a použime rovnakú stratégiu výberu akcií ako počas tréningu, pričom vzorkujeme podľa pravdepodobnostného rozdelenia v Q-Tabuľke: (blok kódu 13) +Bolo by zaujímavé skutočne vidieť, ako sa trénovaný model správa. Spustime simuláciu a použime rovnakú stratégiu výberu akcií ako počas tréningu, vzorkujúc podľa pravdepodobnostného rozdelenia v Q-tabulke: (kódový blok 13) ```python obs = env.reset() @@ -297,28 +320,30 @@ env.close() Mali by ste vidieť niečo takéto: -![balansujúci cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) +![a balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) --- ## 🚀Výzva -> **Úloha 3**: Tu sme používali finálnu verziu Q-Tabuľky, ktorá nemusí byť najlepšia. Pamätajte, že sme uložili najlepšie fungujúcu Q-Tabuľku do premennej `Qbest`! Skúste ten istý príklad s najlepšie fungujúcou Q-Tabuľkou tak, že skopírujete `Qbest` do `Q` a sledujte, či si všimnete rozdiel. +> **Úloha 3**: Tu sme používali finálnu kópiu Q-tabulky, ktorá nemusí byť najlepšia. Pamätajte, že sme uložili najlepšie fungujúcu Q-tabulku do premennej `Qbest`! Skúste ten istý príklad s najlepšie fungujúcou Q-tabulkou tak, že prekopírujete `Qbest` do `Q` a uvidíte, či si všimnete rozdiel. -> **Úloha 4**: Tu sme nevyberali najlepšiu akciu v každom kroku, ale namiesto toho vzorkovali podľa zodpovedajúceho pravdepodobnostného rozdelenia. Malo by väčší zmysel vždy vybrať najlepšiu akciu s najvyššou hodnotou v Q-Tabuľke? To sa dá urobiť pomocou funkcie `np.argmax`, ktorá nájde číslo akcie zodpovedajúce najvyššej hodnote v Q-Tabuľke. Implementujte túto stratégiu a sledujte, či zlepší balansovanie. +> **Úloha 4**: Tu sme nevyberali najlepšiu akciu v každom kroku, ale vzorkovali sme podľa zodpovedajúceho pravdepodobnostného rozdelenia. Dávalo by väčší zmysel vždy zvoliť najlepšiu akciu, s najvyššou hodnotou Q-tabulky? Toto sa dá urobiť použitím funkcie `np.argmax` na zistenie čísla akcie zodpovedajúcej najvyššej hodnote v Q-tabulke. Implementujte túto stratégiu a uvidíte, či to vylepší balansovanie. -## [Kvíz po prednáške](https://ff-quizzes.netlify.app/en/ml/) +## [Post-lekčný kvíz](https://ff-quizzes.netlify.app/en/ml/) ## Zadanie -[Vytrénujte Mountain Car](assignment.md) +[Natrénuj Mountain Car](assignment.md) ## Záver -Teraz sme sa naučili, ako trénovať agentov na dosiahnutie dobrých výsledkov len tým, že im poskytneme funkciu odmeny, ktorá definuje požadovaný stav hry, a dáme im príležitosť inteligentne preskúmať priestor možností. Úspešne sme aplikovali algoritmus Q-Learning v prípadoch diskrétnych a spojitých prostredí, ale s diskrétnymi akciami. +Teraz sme sa naučili, ako trénovať agentov na dosahovanie dobrých výsledkov len tým, že im poskytneme odmeňovaciu funkciu, ktorá definuje požadovaný stav hry, a tým, že im umožníme inteligentne skúmať vyhľadávací priestor. Úspešne sme aplikovali algoritmus Q-learning v prípadoch diskrétnych a súvislých prostredí, ale s diskrétnymi akciami. -Je dôležité študovať aj situácie, kde je stav akcií spojitý a kde je priestor pozorovaní oveľa zložitejší, napríklad obrazovka z hry Atari. Pri takýchto problémoch často potrebujeme použiť výkonnejšie techniky strojového učenia, ako sú neurónové siete, aby sme dosiahli dobré výsledky. Tieto pokročilejšie témy sú predmetom nášho nadchádzajúceho pokročilého kurzu AI. +Je dôležité tiež študovať situácie, kde je stav akcie tiež súvislý, a keď je pozorovací priestor oveľa zložitejší, napríklad obraz z obrazovky hry Atari. V týchto problémoch často potrebujeme použiť výkonnejšie metódy strojového učenia, ako sú neurónové siete, aby sme dosiahli dobré výsledky. Témy s vyššou náročnosťou sú predmetom nášho pripravovaného pokročilejšieho kurzu AI. --- -**Upozornenie**: -Tento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. \ No newline at end of file + +**Vyhlásenie o zodpovednosti**: +Tento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. + \ No newline at end of file diff --git a/translations/sk/9-Real-World/2-Debugging-ML-Models/README.md b/translations/sk/9-Real-World/2-Debugging-ML-Models/README.md index 15c07d2d9..56233a88a 100644 --- a/translations/sk/9-Real-World/2-Debugging-ML-Models/README.md +++ b/translations/sk/9-Real-World/2-Debugging-ML-Models/README.md @@ -1,155 +1,179 @@ -# Postscript: Ladenie modelov v strojovom učení pomocou komponentov zodpovedného AI dashboardu - -## [Kvíz pred prednáškou](https://ff-quizzes.netlify.app/en/ml/) +# Postscript: Ladenie modelov v strojovom učení pomocou komponentov panela Responsible AI + +## [Prednáškový kvíz](https://ff-quizzes.netlify.app/en/ml/) + ## Úvod -Strojové učenie ovplyvňuje naše každodenné životy. AI si nachádza cestu do niektorých z najdôležitejších systémov, ktoré ovplyvňujú nás ako jednotlivcov aj našu spoločnosť, od zdravotníctva, financií, vzdelávania až po zamestnanie. Napríklad systémy a modely sa podieľajú na každodenných rozhodovacích úlohách, ako sú diagnostiky v zdravotníctve alebo odhaľovanie podvodov. V dôsledku toho sú pokroky v AI spolu s zrýchleným prijímaním sprevádzané vyvíjajúcimi sa spoločenskými očakávaniami a rastúcou reguláciou. Neustále vidíme oblasti, kde systémy AI nesplňujú očakávania; odhaľujú nové výzvy; a vlády začínajú regulovať AI riešenia. Preto je dôležité, aby boli tieto modely analyzované s cieľom poskytovať spravodlivé, spoľahlivé, inkluzívne, transparentné a zodpovedné výsledky pre všetkých. +Strojové učenie ovplyvňuje náš každodenný život. AI sa dostáva do niektorých z najdôležitejších systémov, ktoré ovplyvňujú nás ako jednotlivcov, ako aj našu spoločnosť, od zdravotnej starostlivosti, financií, vzdelávania až po zamestnanosť. Napríklad systémy a modely sa podieľajú na každodenných rozhodovacích úlohách, ako sú zdravotné diagnózy alebo detekcia podvodov. Vývoj v oblasti AI spolu s rýchlym zavádzaním sú sprevádzané rastúcimi spoločenskými očakávaniami a reguláciou v reakcii na to. Neustále vidíme oblasti, kde systémy AI nespĺňajú očakávania; prinášajú nové výzvy; a vlády začínajú regulovať AI riešenia. Preto je dôležité tieto modely analyzovať s cieľom zabezpečiť spravodlivé, spoľahlivé, inkluzívne, transparentné a zodpovedné výsledky pre všetkých. -V tomto kurze sa pozrieme na praktické nástroje, ktoré môžu byť použité na posúdenie, či má model problémy so zodpovedným AI. Tradičné techniky ladenia strojového učenia majú tendenciu byť založené na kvantitatívnych výpočtoch, ako je agregovaná presnosť alebo priemerná strata chýb. Predstavte si, čo sa môže stať, keď údaje, ktoré používate na vytvorenie týchto modelov, postrádajú určité demografické skupiny, ako sú rasa, pohlavie, politické názory, náboženstvo, alebo neprimerane zastupujú takéto demografické skupiny. Čo ak je výstup modelu interpretovaný tak, že uprednostňuje určitú demografickú skupinu? To môže viesť k nadmernej alebo nedostatočnej reprezentácii týchto citlivých skupín, čo spôsobuje problémy so spravodlivosťou, inkluzívnosťou alebo spoľahlivosťou modelu. Ďalším faktorom je, že modely strojového učenia sú považované za čierne skrinky, čo sťažuje pochopenie a vysvetlenie toho, čo ovplyvňuje predikciu modelu. Toto sú výzvy, ktorým čelia dátoví vedci a vývojári AI, keď nemajú dostatočné nástroje na ladenie a posúdenie spravodlivosti alebo dôveryhodnosti modelu. +V tomto kurze sa pozrieme na praktické nástroje, ktoré možno použiť na posúdenie, či model má problémy zodpovedného AI. Tradičné techniky ladenia strojového učenia sú zvyčajne založené na kvantitatívnych výpočtoch, ako je súhrnná presnosť alebo priemerná chyba. Predstavte si, čo sa stane, keď dáta, ktoré používate na vytvorenie týchto modelov, obsahujú menej určitých demografických skupín, ako napríklad rasa, pohlavie, politické názory, náboženstvo, alebo ak takéto skupiny neprimerane zastupujú. Čo ak výstup modelu interpretujete tak, že uprednostňuje niektorú demografickú skupinu? To môže viesť k nadmernému alebo nedostatočnému zastúpeniu týchto citlivých skupín, čo spôsobí problémy so spravodlivosťou, inkluzivitou alebo spoľahlivosťou modelu. Ďalším faktorom je, že modely strojového učenia sa považujú za čierne skrinky, čo sťažuje pochopenie a vysvetlenie, čo ovplyvňuje predikciu modelu. Toto sú výzvy, ktorým čelia dátoví vedci a vývojári AI, keď nemajú dostatočné nástroje na ladenie a posúdenie spravodlivosti alebo spoľahlivosti modelu. -V tejto lekcii sa naučíte, ako ladiť svoje modely pomocou: +V tejto lekcii sa naučíte ladiť svoje modely pomocou: -- **Analýzy chýb**: identifikácia oblastí v distribúcii údajov, kde má model vysoké miery chýb. -- **Prehľadu modelu**: vykonanie porovnávacej analýzy medzi rôznymi kohortami údajov na odhalenie rozdielov vo výkonnostných metrikách modelu. -- **Analýzy údajov**: skúmanie, kde môže byť nadmerná alebo nedostatočná reprezentácia údajov, ktorá môže skresliť model tak, aby uprednostňoval jednu demografickú skupinu pred druhou. -- **Dôležitosti vlastností**: pochopenie, ktoré vlastnosti ovplyvňujú predikcie modelu na globálnej alebo lokálnej úrovni. +- **Analýza chýb**: identifikujte, kde v distribúcii dát má model vysoké miery chýb. +- **Prehľad modelu**: vykonajte porovnávaciu analýzu medzi rôznymi dátovými kohortami, aby ste odhalili rozdiely vo výkonových metrikách modelu. +- **Analýza dát**: preskúmajte, kde môže dôjsť k nadmernému alebo nedostatočnému zastúpeniu vašich dát, čo môže model skresliť v prospech jednej demografickej skupiny oproti druhej. +- **Dôležitosť atribútov**: pochopte, ktoré atribúty ovplyvňujú predikcie modelu na globálnej alebo lokálnej úrovni. ## Predpoklady -Ako predpoklad si prosím preštudujte [Nástroje zodpovedného AI pre vývojárov](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) +Ako predpoklad si prosím prejdite prehľad [Responsible AI tools for developers](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) -> ![Gif o nástrojoch zodpovedného AI](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) +> ![Gif o nástrojoch Responsible AI](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) ## Analýza chýb -Tradičné metriky výkonnosti modelu používané na meranie presnosti sú väčšinou výpočty založené na správnych vs nesprávnych predikciách. Napríklad určenie, že model je presný na 89 % s chybovou stratou 0,001, môže byť považované za dobrý výkon. Chyby však nie sú rovnomerne rozložené v podkladovom súbore údajov. Môžete dosiahnuť skóre presnosti modelu 89 %, ale zistiť, že existujú rôzne oblasti vašich údajov, v ktorých model zlyháva na 42 %. Dôsledky týchto vzorcov zlyhania s určitými skupinami údajov môžu viesť k problémom so spravodlivosťou alebo spoľahlivosťou. Je nevyhnutné pochopiť oblasti, kde model funguje dobre alebo nie. Oblasti údajov, kde má váš model vysoký počet nepresností, sa môžu ukázať ako dôležitá demografická skupina údajov. +Tradičné metriky výkonu modelu používané na meranie presnosti sú väčšinou založené na výpočtoch správnych a nesprávnych predikcií. Napríklad určiť, že model je presný 89 % času s chybou 0,001, možno považovať za dobrý výkon. Chyby však často nie sú rovnomerne rozložené v základnej dátovej sade. Môžete mať skóre presnosti modelu 89 %, ale zistiť, že existujú určité časti dát, kde model zlyháva 42 % času. Následky týchto vzorcov zlyhaní v určitých dátových skupinách môžu viesť k problémom so spravodlivosťou alebo spoľahlivosťou. Je nevyhnutné pochopiť oblasti, kde model dobre funguje alebo nie. Dátové oblasti s vysokým počtom nepresností v modeli môžu byť dôležitou dátovou demografickou skupinou. -![Analyzujte a ladte chyby modelu](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-distribution.png) +![Analyzujte a ladi chybné predikcie modelu](../../../../translated_images/sk/ea-error-distribution.117452e1177c1dd8.webp) -Komponent Analýza chýb na RAI dashboarde ilustruje, ako sú zlyhania modelu rozložené medzi rôznymi kohortami pomocou vizualizácie stromu. To je užitočné pri identifikácii vlastností alebo oblastí, kde je vysoká miera chýb vo vašom súbore údajov. Tým, že vidíte, odkiaľ pochádza väčšina nepresností modelu, môžete začať skúmať príčinu. Môžete tiež vytvárať kohorty údajov na vykonanie analýzy. Tieto kohorty údajov pomáhajú v procese ladenia určiť, prečo je výkon modelu dobrý v jednej kohorte, ale chybný v inej. +Komponent Analýza chýb na paneli RAI zobrazuje, ako je zlyhanie modelu rozložené naprieč rôznymi kohortami pomocou stromovej vizualizácie. To je užitočné pri identifikovaní atribútov alebo oblastí s vysokou chybovosťou vo vašich dátach. Keď vidíte, odkiaľ prichádza väčšina nepresností modelu, môžete začať vyšetrovací proces. Tiež môžete vytvárať dátové kohorty na vykonanie analýzy. Tieto dátové kohorty pomáhajú pri ladení, aby ste zistili, prečo model funguje dobre v jednej kohorte, ale zle v druhej. -![Analýza chýb](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png) +![Analýza chýb](../../../../translated_images/sk/ea-error-cohort.6886209ea5d438c4.webp) -Vizualizačné indikátory na mape stromu pomáhajú rýchlejšie lokalizovať problémové oblasti. Napríklad tmavší odtieň červenej farby na uzle stromu znamená vyššiu mieru chýb. +Vizualizačné indikátory na stromovej mape pomáhajú rýchlejšie lokalizovať problémové oblasti. Napríklad, tmavší odtieň červenej farby uzla stromu znamená vyššiu mieru chýb. -Heatmapa je ďalšou vizualizačnou funkciou, ktorú môžu používatelia použiť na skúmanie miery chýb pomocou jednej alebo dvoch vlastností na nájdenie prispievateľa k chybám modelu v celom súbore údajov alebo kohortách. +Heatmapa je ďalšia vizualizačná funkcia, ktorú používatelia môžu použiť na vyšetrovanie miery chýb pomocou jedného alebo dvoch atribútov s cieľom nájsť príčinu chýb modelu naprieč celou dátovou sadou alebo kohortami. -![Heatmapa analýzy chýb](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png) +![Heatmapa analýzy chýb](../../../../translated_images/sk/ea-heatmap.8d27185e28cee383.webp) -Použite analýzu chýb, keď potrebujete: +Používajte analýzu chýb, keď potrebujete: -* Získať hlboké pochopenie toho, ako sú zlyhania modelu rozložené v súbore údajov a medzi viacerými vstupnými a vlastnostnými dimenziami. -* Rozložiť agregované metriky výkonnosti na automatické objavenie chybných kohort na informovanie o vašich cielených krokoch na zmiernenie problémov. +* Získať hlboké pochopenie, ako sú zlyhania modelu rozložené naprieč dátovou sadou a rôznymi vstupnými a atribútovými rozmermi. +* Rozčleniť súhrnné metriky výkonu na automatické odhalenie chybových kohort na informovanie o cieľových krokoch zmierňovania. ## Prehľad modelu -Hodnotenie výkonnosti modelu strojového učenia si vyžaduje získanie holistického pochopenia jeho správania. To možno dosiahnuť preskúmaním viacerých metrík, ako sú miera chýb, presnosť, recall, precision alebo MAE (Mean Absolute Error), na odhalenie rozdielov medzi výkonnostnými metrikami. Jedna metrika výkonnosti môže vyzerať skvele, ale nepresnosti môžu byť odhalené v inej metrike. Okrem toho porovnávanie metrík na odhalenie rozdielov v celom súbore údajov alebo kohortách pomáha objasniť, kde model funguje dobre alebo nie. To je obzvlášť dôležité pri sledovaní výkonu modelu medzi citlivými vs necitlivými vlastnosťami (napr. rasa pacienta, pohlavie alebo vek), aby sa odhalila potenciálna nespravodlivosť modelu. Napríklad zistenie, že model je viac chybný v kohorte, ktorá má citlivé vlastnosti, môže odhaliť potenciálnu nespravodlivosť modelu. +Hodnotenie výkonu modelu strojového učenia vyžaduje celostné pochopenie jeho správania. To možno dosiahnuť prezeraním viacerých metrík, ako sú miera chýb, presnosť, recall, presnosť alebo MAE (Mean Absolute Error), aby sa odhalili rozdiely medzi výkonovými metrikami. Jedna metrika môže vyzerať skvele, ale nepresnosti môže odhaliť iná metrika. Porovnávanie metrík naprieč celou dátovou sadou alebo kohortami pomáha objasniť, kde model funguje dobre alebo nie. Toto je obzvlášť dôležité pri sledovaní výkonu modelu medzi citlivými a necitlivými atribútmi (napríklad rasa pacienta, pohlavie alebo vek) na odhalenie potenciálnej nespravodlivosti modelu. Napríklad zistenie, že model je chybnejší v kohorte s citlivými atribútmi, môže odhaliť potenciálnu nespravodlivosť modelu. -Komponent Prehľad modelu na RAI dashboarde pomáha nielen pri analýze výkonnostných metrík reprezentácie údajov v kohorte, ale dáva používateľom možnosť porovnávať správanie modelu medzi rôznymi kohortami. +Komponent Prehľad modelu na paneli RAI pomáha nielen pri analýze výkonových metrík dátovej reprezentácie v kohorte, ale poskytuje používateľom možnosť porovnávať správanie modelu naprieč rôznymi kohortami. -![Datasetové kohorty - prehľad modelu na RAI dashboarde](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png) +![Dátové kohorty - prehľad modelu na RAI paneli](../../../../translated_images/sk/model-overview-dataset-cohorts.dfa463fb527a35a0.webp) -Funkcia analýzy založená na vlastnostiach komponentu umožňuje používateľom zúžiť podskupiny údajov v rámci konkrétnej vlastnosti na identifikáciu anomálií na granulárnej úrovni. Napríklad dashboard má zabudovanú inteligenciu na automatické generovanie kohort pre používateľom vybranú vlastnosť (napr. *"time_in_hospital < 3"* alebo *"time_in_hospital >= 7"*). To umožňuje používateľovi izolovať konkrétnu vlastnosť z väčšej skupiny údajov, aby zistil, či je kľúčovým ovplyvňovateľom chybných výsledkov modelu. +Funkcia analýzy založenej na atribútoch komponentu umožňuje používateľom zúžiť dátové podskupiny v rámci konkrétneho atribútu na identifikáciu anomálií na detailnej úrovni. Napríklad panel má vstavanú inteligenciu na automatické generovanie kohort pre používateľom zvolený atribút (napr. *„time_in_hospital < 3“* alebo *„time_in_hospital >= 7“*). Toto umožňuje používateľovi izolovať konkrétny atribút zo širšej dátovej skupiny, aby zistil, či je kľúčovým faktorom ovplyvňujúcim chybné výstupy modelu. -![Kohorty vlastností - prehľad modelu na RAI dashboarde](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png) +![Kohorty atribútov - prehľad modelu na RAI paneli](../../../../translated_images/sk/model-overview-feature-cohorts.c5104d575ffd0c80.webp) -Komponent Prehľad modelu podporuje dve triedy metrík rozdielov: +Komponent Prehľad modelu podporuje dve triedy metrík disparity: -**Rozdiely vo výkonnosti modelu**: Tieto sady metrík vypočítavajú rozdiely (disparity) v hodnotách vybranej metriky výkonnosti medzi podskupinami údajov. Tu je niekoľko príkladov: +**Disparita vo výkone modelu**: Tieto metriky vypočítavajú rozdiel (disparitu) v hodnotách vybranej výkonovej metriky naprieč podsúbormi dát. Tu je niekoľko príkladov: -* Rozdiely v miere presnosti -* Rozdiely v miere chýb -* Rozdiely v precision -* Rozdiely v recall -* Rozdiely v Mean Absolute Error (MAE) +* Disparita v miere presnosti +* Disparita v miere chýb +* Disparita v presnosti (precision) +* Disparita v recall +* Disparita v priemernej absolútnej chybe (MAE) -**Rozdiely v miere výberu**: Táto metrika obsahuje rozdiely v miere výberu (priaznivá predikcia) medzi podskupinami. Príkladom je rozdiel v miere schvaľovania úverov. Miera výberu znamená podiel dátových bodov v každej triede klasifikovaných ako 1 (v binárnej klasifikácii) alebo distribúciu predikčných hodnôt (v regresii). +**Disparita v miere výberu**: Táto metrika obsahuje rozdiel v miere výberu (priaznivej predikcie) medzi podsúbormi. Príkladom je disparita v schvaľovaní úverov. Miera výberu znamená zlomok dátových bodov v každej triede klasifikovaných ako 1 (v binárnej klasifikácii) alebo rozloženie predikčných hodnôt (v regresii). -## Analýza údajov +## Analýza dát -> "Ak budete údaje mučiť dostatočne dlho, priznajú sa k čomukoľvek" - Ronald Coase +> „Ak budete dostatočne dlho mučiť dáta, priznajú všetko“ - Ronald Coase -Toto tvrdenie znie extrémne, ale je pravda, že údaje môžu byť manipulované na podporu akéhokoľvek záveru. Takáto manipulácia sa niekedy môže stať neúmyselne. Ako ľudia máme všetci predsudky a často je ťažké vedome vedieť, kedy zavádzame predsudky do údajov. Zaručenie spravodlivosti v AI a strojovom učení zostáva komplexnou výzvou. +Toto tvrdenie znie extrémne, ale je pravda, že dáta možno manipulovať tak, aby podporili akýkoľvek záver. Takáto manipulácia sa niekedy deje neúmyselne. Ako ľudia máme všetci predsudky a často je ťažké vedome si uvedomiť, kedy ich do dát vnášame. Zaručiť spravodlivosť v AI a strojovom učení zostáva zložitou výzvou. -Údaje sú veľkým slepým miestom pre tradičné metriky výkonnosti modelu. Môžete mať vysoké skóre presnosti, ale to nemusí vždy odrážať podkladové predsudky v údajoch, ktoré by mohli byť vo vašom súbore údajov. Napríklad, ak má súbor údajov zamestnancov 27 % žien na výkonných pozíciách v spoločnosti a 73 % mužov na rovnakej úrovni, model AI na inzerciu pracovných miest trénovaný na týchto údajoch môže cieliť prevažne na mužské publikum pre seniorné pracovné pozície. Táto nerovnováha v údajoch skreslila predikciu modelu tak, aby uprednostňovala jedno pohlavie. To odhaľuje problém spravodlivosti, kde je v AI modeli predsudok voči pohlaviu. +Dáta sú veľkým slepým miestom pre tradičné metriky výkonu modelu. Môžete mať vysoké skóre presnosti, ale to neodráža základnú dátovú zaujatost, ktorá môže byť vo vašej dataset. Napríklad, ak má dataset zamestnancov 27 % žien na vedúcich pozíciách a 73 % mužov na rovnakej úrovni, AI model na inzerovanie pracovných miest vycvičený na týchto dátach môže cieliť prevažne na mužskú časť publika pre vedúce pozície. Táto nevyváženosť v dátach skreslila predikciu modelu v prospech jedného pohlavia. Odhaľuje to problém spravodlivosti, kde v AI modeli existuje genderová zaujatost. -Komponent Analýza údajov na RAI dashboarde pomáha identifikovať oblasti, kde je nadmerná alebo nedostatočná reprezentácia v súbore údajov. Pomáha používateľom diagnostikovať príčinu chýb a problémov so spravodlivosťou, ktoré sú spôsobené nerovnováhou údajov alebo nedostatkom reprezentácie určitej skupiny údajov. To dáva používateľom možnosť vizualizovať súbory údajov na základe predikovaných a skutočných výsledkov, skupín chýb a konkrétnych vlastností. Niekedy objavenie nedostatočne zastúpenej skupiny údajov môže tiež odhaliť, že model sa neučí dobre, a preto má vysoké nepresnosti. Model s predsudkami v údajoch nie je len problémom spravodlivosti, ale ukazuje, že model nie je inkluzívny ani spoľahlivý. +Komponent Analýza dát na paneli RAI pomáha identifikovať oblasti, kde dochádza k nadmernému alebo nedostatočnému zastúpeniu v datasetoch. Pomáha používateľom diagnostikovať príčinu chýb a problémov so spravodlivosťou spôsobených nerovnováhou dát alebo nedostatočným zastúpením konkrétnej dátovej skupiny. Umožňuje používateľom vizualizovať dataset na základe predikovaných a skutočných výsledkov, skupín chýb a špecifických atribútov. Niekedy objavenie podzastúpenej dátovej skupiny môže tiež odhaliť, že model sa neučí dobre, a preto dochádza k veľkému počtu nepresností. Model, ktorý má dátovú zaujatost, nie je len otázkou spravodlivosti, ale tiež ukazuje, že model nie je inkluzívny ani spoľahlivý. -![Komponent Analýza údajov na RAI dashboarde](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png) +![Komponent Analýza dát na RAI paneli](../../../../translated_images/sk/dataanalysis-cover.8d6d0683a70a5c1e.webp) -Použite analýzu údajov, keď potrebujete: -* Preskúmať štatistiky vášho súboru údajov výberom rôznych filtrov na rozdelenie údajov do rôznych dimenzií (známych ako kohorty). -* Pochopiť distribúciu vášho súboru údajov medzi rôznymi kohortami a skupinami vlastností. -* Určiť, či vaše zistenia týkajúce sa spravodlivosti, analýzy chýb a kauzality (odvodené z iných komponentov dashboardu) sú výsledkom distribúcie vášho súboru údajov. -* Rozhodnúť, v ktorých oblastiach zbierať viac údajov na zmiernenie chýb spôsobených problémami s reprezentáciou, šumom v označení, šumom vo vlastnostiach, predsudkami v označení a podobnými faktormi. +Používajte analýzu dát, keď potrebujete: -## Interpretácia modelu +* Preskúmať štatistiky datasetu výberom rôznych filtrov na rozdelenie dát do rôznych dimenzií (známych tiež ako kohorty). +* Pochopiť rozloženie datasetu medzi rôznymi kohortami a atribútovými skupinami. +* Určiť, či sú zistenia týkajúce sa spravodlivosti, analýzy chýb a kauzality (získané z iných komponentov panela) dôsledkom distribúcie datasetu. +* Rozhodnúť, v ktorých oblastiach je potrebné zozbierať viac dát na zmiernenie chýb vyplývajúcich z problémov so zastúpením, šumu v označeniach, šumu v atribútoch, zaujatosti v označeniach a podobných faktorov. -Modely strojového učenia majú tendenciu byť čiernymi skrinkami. Pochopenie, ktoré kľúčové vlastnosti údajov ovplyvňujú predikciu modelu, môže byť náročné. Je dôležité poskytnúť transparentnosť, prečo model robí určitú predikciu. Napríklad, ak AI systém predikuje, že diabetický pacient je ohrozený opätovným prijatím do nemocnice do 30 dní, mal by byť schopný poskytnúť podporné údaje, ktoré viedli k jeho predikcii. Mať podporné indikátory údajov prináša transparentnosť, ktorá pomáha klinikám alebo nemocniciam robiť dobre informované rozhodnutia. Okrem toho schopnosť vysvetliť, prečo model urobil predikciu pre konkrétneho pacienta, umožňuje zodpovednosť voči zdravotným reguláciám. Keď používate modely strojového učenia spôsobmi, ktoré ovplyvňujú životy ľudí, je nevyhnutné pochopiť a vysvetliť, čo ovplyvňuje správanie modelu. Vysvetliteľnosť a interpretácia modelu pomáha odpovedať na otázky v scenároch, ako sú: +## Interpretovateľnosť modelu -* Ladenie modelu: Prečo môj model urobil túto chybu? Ako môžem zlepšiť svoj model? -* Spolupráca človek-AI: Ako môžem pochopiť a dôverovať rozhodnutiam modelu? -* Regulácia: Spĺňa môj model právne požiadavky? +Modely strojového učenia majú tendenciu byť čiernymi skrinkami. Pochopenie, ktoré kľúčové atribúty dát ovplyvňujú predikciu modelu, môže byť náročné. Je dôležité zabezpečiť transparentnosť, prečo model vykonal určitú predikciu. Napríklad, ak AI systém predpovedá, že diabetický pacient je ohrozený opätovným prijatím do nemocnice do 30 dní, mal by byť schopný poskytnúť podporné dáta, ktoré viedli k tejto predikcii. Mať takéto dátové indikátory prináša transparentnosť, ktorá pomáha lekárom alebo nemocniciam robiť dobre informované rozhodnutia. Okrem toho, schopnosť vysvetliť, prečo model vykonal predikciu pre konkrétneho pacienta, umožňuje zodpovednosť v súlade so zdravotnými predpismi. Keď používate modely strojového učenia spôsobmi, ktoré ovplyvňujú životy ľudí, je kľúčové pochopiť a vysvetliť, čo ovplyvňuje správanie modelu. Vysvetliteľnosť a interpretovateľnosť modelu pomáha odpovedať na otázky v scenároch ako: -Komponent Dôležitosť vlastností na RAI dashboarde vám pomáha ladiť a získať komplexné pochopenie toho, ako model robí predikcie. Je to tiež užitočný nástroj pre profesionálov v oblasti strojového učenia a rozhodovacích činiteľov na vysvetlenie a ukázanie dôkazov vlastností ovplyvňujúcich správanie modelu pre reguláciu. Používatelia môžu ďalej skúmať globálne aj lokálne vysvetlenia na validáciu, ktoré vlastnosti ovplyvňujú predikciu modelu. Globálne vysvetlenia uvádzajú najdôležitejšie vlastnosti, ktoré ovplyvnili celkovú predikciu modelu. Lokálne vysvetlenia zobrazujú, ktoré vlastnosti viedli k predikcii modelu pre konkrétny prípad. Schopnosť hodnotiť lokálne vysvetlenia je tiež užitočná pri ladení alebo audite konkrétneho prípadu na lepšie pochopenie a interpretáciu, prečo model urobil presnú alebo nepresnú predikciu. +* Ladenie modelu: Prečo môj model urobil túto chybu? Ako môžem model zlepšiť? +* Spolupráca človek-AI: Ako môžem porozumieť a dôverovať rozhodnutiam modelu? +* Súlad s reguláciou: Spĺňa môj model zákonné požiadavky? -![Komponent Dôležitosť vlastností na RAI dashboarde](../../../../9-Real-World/2-Debugging-ML-Models/images/9-feature-importance.png) +Komponent Dôležitosť atribútov na paneli RAI vám pomáha ladiť a získať komplexné pochopenie, ako model robí predikcie. Je to tiež užitočný nástroj pre profesionálov v oblasti strojového učenia a rozhodovacích činiteľov na vysvetlenie a preukázanie vplyvu atribútov na správanie modelu v súlade s reguláciami. Ďalej môžu používatelia preskúmať globálne aj lokálne vysvetlenia, aby overili, ktoré atribúty ovplyvňujú predikciu modelu. Globálne vysvetlenia uvádzajú najdôležitejšie atribúty, ktoré ovplyvnili celkové predikcie modelu. Lokálne vysvetlenia zobrazujú, ktoré atribúty viedli k predikcii modelu v konkrétnom prípade. Schopnosť vyhodnocovať lokálne vysvetlenia je užitočná aj pri ladení alebo audite konkrétneho prípadu na lepšie pochopenie a interpretáciu, prečo model vykonal presnú alebo nepresnú predikciu. -* Globálne vysvetlenia: Napríklad, ktoré vlastnosti ovplyvňujú celkové správanie modelu na opätovné prijatie diabetických pacientov do nemocnice? -* Lokálne vysvetlenia: Napríklad, prečo bol diabetický pacient nad 60 rokov s predchádzajúcimi hospitalizáciami predikovaný na opätovné prijatie alebo neprijatie do nemocnice do 30 dní? +![Komponent Dôležitosť atribútov na RAI paneli](../../../../translated_images/sk/9-feature-importance.cd3193b4bba3fd4b.webp) -V procese ladenia výkonu modelu medzi rôznymi kohortami Dôležitosť vlastností ukazuje, aký vplyv má vlastnosť na kohorty. Pomáha odhaliť anomálie pri porovnávaní úrovne vplyvu vlastnosti na chybnú predikciu modelu. Komponent Dôležitosť vlastností môže ukázať, ktoré -- **Nadmerné alebo nedostatočné zastúpenie**. Ide o to, že určitá skupina nie je viditeľná v určitej profesii, a akákoľvek služba alebo funkcia, ktorá to naďalej podporuje, prispieva k škodám. +* Globálne vysvetlenia: Napríklad, ktoré atribúty ovplyvňujú celkové správanie modelu na predikciu opätovného prijatia diabetických pacientov do nemocnice? +* Lokálne vysvetlenia: Napríklad, prečo bol diabetický pacient nad 60 rokov s predchádzajúcimi hospitalizáciami predpovedaný byť prijatý alebo neprijatý späť do nemocnice do 30 dní? -### Azure RAI dashboard +Pri ladení modelu a skúmaní jeho výkonu naprieč rôznymi kohortami, Dôležitosť atribútov ukazuje, aký vplyv má atribút v rámci kohôrt. Pomáha odhaliť anomálie pri porovnávaní úrovne vplyvu atribútu na chybné predikcie modelu. Komponent Dôležitosť atribútov môže zobraziť, ktoré hodnoty v atribúte pozitívne alebo negatívne ovplyvnili výsledok modelu. Napríklad, ak model urobil nepresnú predikciu, komponent vám umožňuje presne určiť, ktoré atribúty alebo hodnoty atribútov viedli k tejto predikcii. Táto úroveň detailov pomáha nielen pri ladení, ale prináša aj transparentnosť a zodpovednosť pri audite. Nakoniec komponent môže pomôcť identifikovať problémy so spravodlivosťou. Ilustračným príkladom je, ak citlivý atribút ako etnická príslušnosť alebo pohlavie má vysoký vplyv na predikciu modelu, môže to byť znakom rasovej alebo genderovej zaujatosti v modeli. + +![Dôležitosť atribútov](../../../../translated_images/sk/9-features-influence.3ead3d3f68a84029.webp) + +Používajte interpretovateľnosť, keď potrebujete: + +* Určiť, do akej miery sú predikcie vášho AI systému dôveryhodné tým, že pochopíte, ktoré atribúty sú pre predikcie najdôležitejšie. +* Pristúpiť k ladeniu modelu tak, že najprv pochopíte model a zistíte, či používa zdravé atribúty alebo iba falošné korelácie. +* Odhaľovať potenciálne zdroje nespravodlivosti tým, že pochopíte, či model zakladá predikcie na citlivých atribútoch alebo na atribútoch, ktoré s nimi silne korelujú. +* Budovať dôveru používateľov v rozhodnutia modelu generovaním lokálnych vysvetlení na ilustráciu ich výsledkov. +* Dokončiť regulačný audit AI systému na validáciu modelov a monitorovanie vplyvu rozhodnutí modelu na ľudí. + +## Záver -[Azure RAI dashboard](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) je postavený na open-source nástrojoch vyvinutých poprednými akademickými inštitúciami a organizáciami vrátane Microsoftu, ktoré sú nevyhnutné pre dátových vedcov a vývojárov AI na lepšie pochopenie správania modelov, objavovanie a zmierňovanie nežiaducich problémov z AI modelov. +Všetky komponenty panela RAI sú praktické nástroje, ktoré vám pomáhajú vytvárať modely strojového učenia, ktoré sú menej škodlivé a spoľahlivejšie pre spoločnosť. Zlepšujú prevenciu hrozieb ľudským právam; diskrimináciu alebo vylučovanie určitých skupín z životných príležitostí; a riziko fyzického alebo psychického poškodenia. Tiež pomáhajú budovať dôveru v rozhodnutia vášho modelu generovaním lokálnych vysvetlení, ktoré ilustrujú ich výsledky. Niektoré z potenciálnych škôd možno klasifikovať ako: -- Naučte sa, ako používať rôzne komponenty, prečítaním dokumentácie k RAI dashboardu [docs.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) +- **Alokácia**, ak je napríklad preferované pohlavie alebo etnický pôvod pred iným. +- **Kvalita služby**. Ak trénujete dáta iba na jeden konkrétny scenár, ale realita je oveľa zložitejšia, vedie to k zlému výkonu služby. +- **Stereotypizácia**. Spájanie danej skupiny s predpokladanými atribútmi. -- Pozrite si niektoré [ukážkové notebooky RAI dashboardu](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) na ladenie zodpovednejších AI scenárov v Azure Machine Learning. +- **Znehodnocovanie**. Nespravodlivo kritizovať a označovať niečo alebo niekoho. +- **Nadmerné alebo nedostatočné zastúpenie**. Myšlienka je, že určitá skupina nie je viditeľná v určitom povolaní, a akákoľvek služba alebo funkcia, ktorá to naďalej propaguje, prispieva k škode. +### Azure RAI dashboard + +[Azure RAI dashboard](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) je postavený na open-source nástrojoch vyvinutých vedúcimi akademickými inštitúciami a organizáciami vrátane Microsoftu, ktoré sú kľúčové pre dátových vedcov a vývojárov AI lepšie pochopiť správanie modelu, objaviť a zmierniť neželané problémy z AI modelov. + +- Naučte sa používať rôzne komponenty s pomocou dokumentácie pre RAI dashboard [docs.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) + +- Pozrite si niektoré vzorové RAI dashboard [sample notebooks](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) na ladenie zodpovednejších AI scenárov v Azure Machine Learning. + --- ## 🚀 Výzva + +Aby sme predišli zavádzaniu štatistických alebo dátových predsudkov už na začiatku, mali by sme: -Aby sme zabránili zavádzaniu štatistických alebo dátových predsudkov už na začiatku, mali by sme: - -- zabezpečiť rozmanitosť pozadí a perspektív medzi ľuďmi pracujúcimi na systémoch +- mať rôznorodé zázemie a perspektívy medzi ľuďmi pracujúcimi na systémoch - investovať do datasetov, ktoré odrážajú rozmanitosť našej spoločnosti -- vyvíjať lepšie metódy na detekciu a opravu predsudkov, keď sa objavia +- vyvíjať lepšie metódy na odhaľovanie a opravovanie predsudkov, keď vzniknú -Premýšľajte o reálnych situáciách, kde je nespravodlivosť evidentná pri budovaní a používaní modelov. Čo ďalšie by sme mali zvážiť? +Zamyslite sa nad reálnymi situáciami, kde je nespravodlivosť zjavná pri tvorbe a používaní modelov. Čo ďalšie by sme mali zvážiť? ## [Kvíz po prednáške](https://ff-quizzes.netlify.app/en/ml/) ## Prehľad a samostatné štúdium + +V tejto lekcii ste sa naučili niektoré praktické nástroje na začlenenie zodpovednej AI v strojovom učení. -V tejto lekcii ste sa naučili niektoré praktické nástroje na začlenenie zodpovednej AI do strojového učenia. - -Pozrite si tento workshop, aby ste sa hlbšie ponorili do tém: - -- Responsible AI Dashboard: Jednotné miesto na operacionalizáciu RAI v praxi od Besmiry Nushi a Mehrnoosh Sameki +Pozrite si tento workshop a ponorte sa hlbšie do tém: -[![Responsible AI Dashboard: Jednotné miesto na operacionalizáciu RAI v praxi](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Responsible AI Dashboard: Jednotné miesto na operacionalizáciu RAI v praxi") +- Responsible AI Dashboard: Všetko na jednom mieste pre uvedenie RAI do praxe od Besmira Nushi a Mehrnoosh Sameki -> 🎥 Kliknite na obrázok vyššie pre video: Responsible AI Dashboard: Jednotné miesto na operacionalizáciu RAI v praxi od Besmiry Nushi a Mehrnoosh Sameki +[![Responsible AI Dashboard: One-stop shop for operationalizing RAI in practice](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Responsible AI Dashboard: One-stop shop for operationalizing RAI in practice") -Odkážte na nasledujúce materiály, aby ste sa dozvedeli viac o zodpovednej AI a o tom, ako budovať dôveryhodnejšie modely: +> 🎥 Kliknite na obrázok vyššie pre video: Responsible AI Dashboard: Všetko na jednom mieste pre uvedenie RAI do praxe od Besmira Nushi a Mehrnoosh Sameki + +Prečítajte si nasledujúce materiály a naučte sa viac o zodpovednej AI a ako budovať dôveryhodnejšie modely: -- Microsoftove nástroje RAI dashboardu na ladenie ML modelov: [Responsible AI tools resources](https://aka.ms/rai-dashboard) +- Nástroje Microsoft RAI dashboard na ladenie ML modelov: [Responsible AI tools resources](https://aka.ms/rai-dashboard) -- Preskúmajte Responsible AI toolkit: [Github](https://github.com/microsoft/responsible-ai-toolbox) +- Preskúmajte sadu nástrojov Responsible AI: [Github](https://github.com/microsoft/responsible-ai-toolbox) -- Microsoftove centrum zdrojov RAI: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) +- Microsoft RAI resource center: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) -- Microsoftova výskumná skupina FATE: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) +- Výskumná skupina Microsoft FATE: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) ## Zadanie -[Preskúmajte RAI dashboard](assignment.md) +[Preskúmať RAI dashboard](assignment.md) --- -**Upozornenie**: -Tento dokument bol preložený pomocou služby na automatický preklad [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, upozorňujeme, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre dôležité informácie sa odporúča profesionálny ľudský preklad. Nezodpovedáme za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. \ No newline at end of file + +**Vyhlásenie o zodpovednosti**: +Tento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. + \ No newline at end of file