From e4c1af4385e01193e976200fc45588848a2be30d Mon Sep 17 00:00:00 2001 From: "localizeflow[bot]" Date: Tue, 14 Jul 2026 08:11:55 +0000 Subject: [PATCH] [zh-MO,zh-HK,zh-TW] chore(i18n): sync translations Sync translations with latest source changes. Languages: Chinese (Traditional, Macau) [zh-MO], Chinese (Traditional, Hong Kong) [zh-HK], Chinese (Traditional, Taiwan) [zh-TW] --- .../zh-HK/.co-op-translator.json | 24 ++ .../zh-HK/catplot.e73fc35fdf96242b.webp | Bin 0 -> 3624 bytes .../zh-HK/heatmap.bd98dce43b404c57.webp | Bin 0 -> 6960 bytes .../zh-HK/lineplot.f9034ba47b1e30ee.webp | Bin 0 -> 11914 bytes .../zh-HK/relplot.a03837d8f0329cec.webp | Bin 0 -> 6468 bytes .../zh-MO/.co-op-translator.json | 24 ++ .../zh-MO/catplot.e73fc35fdf96242b.webp | Bin 0 -> 3624 bytes .../zh-MO/heatmap.bd98dce43b404c57.webp | Bin 0 -> 6658 bytes .../zh-MO/lineplot.f9034ba47b1e30ee.webp | Bin 0 -> 11914 bytes .../zh-MO/relplot.a03837d8f0329cec.webp | Bin 0 -> 6444 bytes .../zh-TW/.co-op-translator.json | 24 ++ .../zh-TW/catplot.e73fc35fdf96242b.webp | Bin 0 -> 3624 bytes .../zh-TW/heatmap.bd98dce43b404c57.webp | Bin 0 -> 6960 bytes .../zh-TW/lineplot.f9034ba47b1e30ee.webp | Bin 0 -> 11834 bytes .../zh-TW/relplot.a03837d8f0329cec.webp | Bin 0 -> 6468 bytes translations/zh-HK/.co-op-translator.json | 35 ++- .../zh-HK/1-Introduction/3-fairness/README.md | 178 ++++++------ .../zh-HK/2-Regression/1-Tools/README.md | 184 ++++++------ .../zh-HK/2-Regression/2-Data/README.md | 229 ++++++++++----- .../2-Data/solution/notebook.ipynb | 77 +++++- .../8-Reinforcement/1-QLearning/README.md | 261 +++++++++++++----- .../zh-HK/8-Reinforcement/2-Gym/README.md | 197 +++++++------ translations/zh-MO/.co-op-translator.json | 33 ++- .../zh-MO/1-Introduction/3-fairness/README.md | 178 ++++++------ .../zh-MO/2-Regression/1-Tools/README.md | 182 ++++++------ .../zh-MO/2-Regression/2-Data/README.md | 219 ++++++++++----- .../2-Data/solution/notebook.ipynb | 77 +++++- .../8-Reinforcement/1-QLearning/README.md | 229 ++++++++++----- translations/zh-TW/.co-op-translator.json | 33 ++- .../zh-TW/1-Introduction/3-fairness/README.md | 180 ++++++------ .../zh-TW/2-Regression/1-Tools/README.md | 180 ++++++------ .../zh-TW/2-Regression/2-Data/README.md | 241 ++++++++++------ .../2-Data/solution/notebook.ipynb | 77 +++++- .../8-Reinforcement/1-QLearning/README.md | 231 +++++++++++----- 34 files changed, 1980 insertions(+), 1113 deletions(-) create mode 100644 translated_images/zh-HK/catplot.e73fc35fdf96242b.webp create mode 100644 translated_images/zh-HK/heatmap.bd98dce43b404c57.webp create mode 100644 translated_images/zh-HK/lineplot.f9034ba47b1e30ee.webp create mode 100644 translated_images/zh-HK/relplot.a03837d8f0329cec.webp create mode 100644 translated_images/zh-MO/catplot.e73fc35fdf96242b.webp create mode 100644 translated_images/zh-MO/heatmap.bd98dce43b404c57.webp create mode 100644 translated_images/zh-MO/lineplot.f9034ba47b1e30ee.webp create mode 100644 translated_images/zh-MO/relplot.a03837d8f0329cec.webp create mode 100644 translated_images/zh-TW/catplot.e73fc35fdf96242b.webp create mode 100644 translated_images/zh-TW/heatmap.bd98dce43b404c57.webp create mode 100644 translated_images/zh-TW/lineplot.f9034ba47b1e30ee.webp create mode 100644 translated_images/zh-TW/relplot.a03837d8f0329cec.webp diff --git a/translated_images/zh-HK/.co-op-translator.json b/translated_images/zh-HK/.co-op-translator.json index fbf93fece..75b58fbde 100644 --- a/translated_images/zh-HK/.co-op-translator.json +++ b/translated_images/zh-HK/.co-op-translator.json @@ -101,6 +101,12 @@ "source_file": "8-Reinforcement/2-Gym/images/cartpole.png", "language_code": "zh-HK" }, + "catplot.e73fc35fdf96242b.webp": { + "original_hash": "90cd4782a2f9b40dec8218b224b29c1c", + "translation_date": "2026-07-14T08:11:25+00:00", + "source_file": "2-Regression/2-Data/images/catplot.png", + "language_code": "zh-HK" + }, "centroid.097fde836cf6c918.webp": { "original_hash": "c8f866ed446563d8e59087f1bca1f97d", "translation_date": "2026-01-16T09:35:34+00:00", @@ -383,6 +389,12 @@ "source_file": "2-Regression/3-Linear/images/heatmap.png", "language_code": "zh-HK" }, + "heatmap.bd98dce43b404c57.webp": { + "original_hash": "7f2f2fbd993018bc01346e1eb8ae692e", + "translation_date": "2026-07-14T08:11:41+00:00", + "source_file": "2-Regression/2-Data/images/heatmap.png", + "language_code": "zh-HK" + }, "hierarchical.bf59403aa43c8c47.webp": { "original_hash": "50b9bc3298659c463ae76564ca645b12", "translation_date": "2026-01-16T09:35:16+00:00", @@ -473,6 +485,12 @@ "source_file": "2-Regression/3-Linear/images/linear.png", "language_code": "zh-HK" }, + "lineplot.f9034ba47b1e30ee.webp": { + "original_hash": "b3959c0ed0f02f668009c76b95c4ebbb", + "translation_date": "2026-07-14T08:11:47+00:00", + "source_file": "2-Regression/2-Data/images/lineplot.png", + "language_code": "zh-HK" + }, "lobe.2fa0806408ef9923.webp": { "original_hash": "e6ec71dbe350aef39135dbf88bc89163", "translation_date": "2026-01-16T09:32:45+00:00", @@ -743,6 +761,12 @@ "source_file": "2-Regression/3-Linear/images/recipes.png", "language_code": "zh-HK" }, + "relplot.a03837d8f0329cec.webp": { + "original_hash": "4733544cb1c2e58e987087283e66b4a5", + "translation_date": "2026-07-14T08:11:33+00:00", + "source_file": "2-Regression/2-Data/images/relplot.png", + "language_code": "zh-HK" + }, "scaled.91897dfbaa26ca4a.webp": { "original_hash": "789c70fafe6f6dd6e377a90b66e7d740", "translation_date": "2026-01-16T09:47:39+00:00", diff --git a/translated_images/zh-HK/catplot.e73fc35fdf96242b.webp b/translated_images/zh-HK/catplot.e73fc35fdf96242b.webp new file mode 100644 index 0000000000000000000000000000000000000000..9bfbd217f239a1c08f4c6430dd3b7cb95ac032b9 GIT binary patch literal 3624 zcmV+@4%hKgNk&E>4gdgGMM6+kP&gnI4gdg<6xV0zEnXYw_#)ckLgl2W~94dW3sz@-OTkk)PrJVtt-}Y5WxNiuFtUL;OGV zKihABKgal%Pz(5H@(=T$-9Ku-u6#58<^5;(6Z}8_|Bat6f3o{``v(3?{Ez%E_Al~( z@c+R7|NocwRqDs~m)K+VG>t}!>T!~ONcji}D{$4TJdyGa{Pl+Sj{Nkk!&a>FN60`) zTZUHb+EZKMKO}sF1eLgI&1wmr2Lz4YHxC2kp8vuQz;a9YI*A7QvuiOKGn zUkE@+TN5}S2thb{9TLeP(P&{Y<&~mVo18~eK4zz%NA%IEdM_hL7IcI**!+?5T&PK% z=(ZU6l+po#5DJY9iHi!)Bj3IViHJdjHwtyC$`-v5-?J$SX?o=veNGgv2xU=jtxN+NO z+R94VD)Xn8(^Zq6Kq@+iDMeg6k!8rWpUTqDfRNVa$3a&3WkT(?Be-^X8J$*6c>odt zl8z46fX<@Iotgb9vK``9HkPNwCwu~?i_Z}TV1!FufNA4 z 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 CAht6A literal 0 HcmV?d00001 diff --git a/translated_images/zh-HK/lineplot.f9034ba47b1e30ee.webp b/translated_images/zh-HK/lineplot.f9034ba47b1e30ee.webp new file mode 100644 index 0000000000000000000000000000000000000000..53240c236f271241358c7ba43f9a32c0ef495e8d GIT binary patch literal 11914 zcmV;5E_KmTNk&G3E&u>mMM6+kP&goVE&u>#Z@ zv$uXGDh87Dp$pwg?|nH zng28M@8;9~&+cdcPnmD=-|zoxJ`{gzzy51Pd1w32<42oc-G9ISUHQx8qu!sj{^$RH z_@wwB`Y-Q)xV~O|^XXkJ3|0=%VzAXJ+|2gxn z^AE;#yVN`EAD91l{I35Y`-|~i@}KvAF}=zBU;3Z@5A2_le_$WN|A_x!{-yhk{lowN z{tu`>;P{~Yhy73e&+uQAzhJ+`f1v-Y{{Q>8{zv~e+>i7>^*_&k>wm2DqyMq~m*9i> zzx99fKi+?K|HS|Q|Eu?%?Jv-`^tg|7ZkNHFra zaJ4LByP#hEZB-u|v*uCPaL$WQXx^??31cKcUE5P*-<^x-`Kf-|mLYl-3~bDO3{c3H z8JUnfA;QILV8M>k{HR=9`8HI%$*DB&RG2MO$We3Dx7SR8*$t9g=CUa_JkWb)eYu)- zKtT%JH5?b%ewlD;WWEPbkdrDPP{_t(onv&}7A0Ax=~G_CV2 zidjSb-yyfGI(|Q@cPrtxEY!9}8U3coXK8$=Z;S|sV~h)4lDpTRjCYe%Y9#?D@BBna ziC>h(dT{uLk{QG%Ypk!& zS3;`oix+XbS{?X>aRtCHLFz#Klmh3P+LV@?eR4~sj&@oL-UYe8MA725wzRS?lnkw4*?4!%`X{bf$1`GA8zZTOt8t^wLeXOP_t zuCgK>xG)K0Mzg&|M2JQ}>$j;$nKDgmoefoky!0el)4>J2qx^Ax4HtY_a|%KuD6B zGug6x6eZtGf!MkA-|ibQF!yLVQxl%O5Rk zZf@F?lz=bH(ahR~Tb{%#*Fa1A=4}c5^uyPzU_M>Dn@}7j0$gnqMOp|^$K}9ig!R?r z|6z)Blxr6Cm?W>z)!QENU&JVyoZ9_YbAg#`r2bbnNcBnAwxmdEmIygjsRwM~zHfRxA`kl|yW5kllD&By%lns&W(y&lw@ z%g_>;1F{?~OBnbHw!S9XQ`$Kz8}tOGKpig$OsDiIWDdxF9@?88{QtlJ{{PhocQe}-ylrD>00~%tG5G)=hLmo^+W!EK z3M>$Kc8PyWBoVOdUP<(l8Jn(=;qd*R@`uoV#V4|aFZkQJs{r?Uk!^srspdb6YLXX> zJdM^M>=kcJR1A*0@BML)hj&YhgM-|P84wxslIysdtQ~G;-4`>;hf#SyTvg=$XohM| zs+|ZBaJAn`>kZMSTWqBOUXECu(`B8%ZHN8cGgNQzit|o0xI$)ODh>Gyh~A*A-lij` z7Y>f6sflC0n~YT=4F?eApJCM`b?U(pyM4UNI&zk|B;$hLbE<1!m_%oi2B*kM!5=D} zOOF_>a?5U&lRGzEBtzP{$}5U7{o&lOm@k)?>|C(+@et+!F<%z)f0zo~(W%61!Vzk@ zRF~(A-Wchu`=XOf^ zzPM-k@p5PxKH%QGP#P$jq7wQQXEKgj4iEr&1b;Vsbul)#geM&37x~&F66=C*dq|1> zj4`a^BF7?L$^BDPO|!et9s~uEj|?zFwcyi&lDazLC`uQdRGYF-mSFiCzK0SEHN{vP zvv@70_XEp%ML*56GQU}$)G3{+qHjIBy{%Ls1hEv+0w?eSFqk?(EY^UQ7uxv!Jyxn) zt7%$d62vD}UdniYoo$`crp85CnEQG!juFn`&sdNm>n2Xnls@DU!Lf%n!Btngw>wRU+gFK5<%2^!BsG|M8}S}khq9l`&zk0$)qXfK+GXy&KU zed13!Qg$6#NXdy^VW}7G9OZj!S8>ry8!a*9D2|UeCcaxxxWk0rLHX)hg>lc`!S*9*1MfR?(< zoo3H|3<7-GdlZ2m7yg09Z&#vUoDSLd;!>>Gs}H8_m-#{2du@<_i~@}y2aG6BMg)`k zFg6wPHy(#u0yZrc$7&eFnp<{HGM841S6hCSkBL7Y|j`)W!pJqvHy*p9rw!UNCLY>_y7Y-N`!UsXzwYfN-nZI=RcUkmVwMQ zs&SG_f7PV>pP$+hZY;F0HY+-TxyNi&3|v>xea&x62AJwf_u0zCmC?ksEn;bQJt+ZY zr*)8%Sg7cIG6Tw44*2AeBh4FZ>q(y7$1R+^7Cr%s3Pdt9q$foH;>8dEWdm3g9!*>) ze+R9-dBrZaB*-h!Ze$6bweZqrm{a=yHe)lUmlk2ZdlTLM#3r-j zCHjN+ToN_TyP2B6#Hh^kjg$s+ZleE2f%yedn{hc#CY(E5dU%2JrK6eOG3%79S))~& z7YIiIBLpBFY;hj2)Dyrya*Oh;4DGE*2s|+u!#BBF^0G=o;8Ag+{KNEO_ff&lqC|<^ z2wbRQK4)wnYH}?})T%mXP*-jci$~wL=zCb@PKl-YS;IQ2y1_My}lH zF@NI_CM@dj$)^z6#K+y-M&u*`jI>fqK7;lBk-~`2%(y5K+D#eF9C$VD=Vi(I=FFvL zSyc9dLnYu_u4&>mZS1NIkOp$w>AbgIz@&#cB$?5DZQK1Dj=ym$x9M{TI?SdfO2UGk z)ZVFmSpRndn7EpslQ%RG?eg=X2}mWKu*PvsagrPPN`uvVeOaAtuyQ@9`h!0Kar`U2 z#-+x(NW+PuR!Y3f;VbcxsANC@A{Y(5&mts|0t1@uV7&Q!9o~n&Q2pahako}b3W)Px z!1#3mdU5m3Df`i?j`XoS!D_U06iJ8gGbIi7ui5bWKIf@U*-*jG8Zqb~7Fl+xfY}Q{ z?*mK~R_A(*p5D*zlax`4Rpw-aNQy~HLJ_85YsPUwmXOV{4k}m*`y%9LfM1oVv;F_A zpqt!+0}FgE(zxcC{8pag65;^sT50l(OX4D9Bf64%AKF{+#sLkK?sYBnFb`#8B*Ey9 ztPzv{Q+j#P7C?r^h*(3^yRe#}3CJIL|CqB?%=ikJt(cdBJicMS-hcK3p9+FidwO!7 zX5LDif8?|RTUb|8CM?LX=Hz}x_rD%qTd^q~bfCc#;H0`#OE}sb?@(i!be;z8Yrn}x zGmJc)IW2G}PaY7w))6^AimLS7=1_yFkzn>#8y<8o6sk!fJNph}zRQ!e5s8=|;`d*W z!EU%4sHxAYQJ3hLnflzYUSnZ86vjRoIm9RTyEAX@Li-=8N*tgAwZDgJwU@7Kf{^Bt znRAESkGQ{90}C}oD*vqXxW=rN1NX!jhBb-^O02nHGf4ACDQ^9_#T;wfETeQtQf889 zvla_dv6k)zr#MB`1_4(wGr71vLKZ}PbpQnkn5tap-7YH@UYvg#GQ%rJqY6pvaHRO) zdTYPDcp5*g7z-HFTTz60nApu|CC*=CnN3oQM~^yZXZOXd@2!mylW=h++6bCjTNUS` zMeT`w32!QU-_mZ+!U($H4vTd8sSG-=kN*c>{{q!3GKeQ*F1#rPdZ`Jf_EVAc>9~qE zdEsJ=3OZ)VQor4d{1%$IHV1g1T1k~ez%W5*i^L1|!HhjW*bn?`E0zzc$Jhv2VT6y- zBV?Q=z0!6pU)9_KXTuE}8m58CCHZO2)J-+-X;0$AJ)&RT_CYHyU*L{RNQA5y24Gq0 zW9cBgAS^ngc=YXn)qBKA$3?LaeU5q9lbV1e2uYH6*5nXRuZ!~PDwr48D4Wn;)w(~M zJz9P+U1qOgzw`XU3`!+ZfX0f{6_xbr9_x0|`_G4qUbA10~{Yl{m3-pxbp7cHuXXwP*3AtIsO>KDyE z5u_PKa)a%br{oww{`5T*(_09jMcPRrbl-s4(03? znARjcd5EV}PbJl;bxX_2%|y2#Ey8wGZmOHCtvLiRz#skBC8)G!8Fp*6pjSEnN|t5i0VH@#VpVU5QTO(iBw?xuSSO(oQF+@o}{ru*P&?AW!%}h*+DIL|9COU#|hgZRebF)XxOl3FJvBl@}&64y*6^dsy z#8m_wJ4}`8P&EW{IALi~_p*LfwLQy&MRz!Fh9b0eTPkgw&vL3kidMV8)1u~?5hGot zgX|uLSeey_jd8Tx1G0m**oTI#{x|txAnl%qRBzo0>E_eo_b@NGPJp5bZidwNbjq)q zUwV2}fG)`oEjqe89?2XIwrvPVXYRife&8lu&03RztxE1jD@hCY||mCi2)5Vr)tZ$qWrnRx8hzLAI)aVwfW>})Y7_3+|dor`=$jk_GXE-oS>?R zr8wbMz!m91`^aXUrS9I&5`dlEpUK&P@4W>hwrM9E_{^7Z%)$xyWYmXLa75#g$tlo zQC@oU1iM$O#Ogwg%HV_zsbAC;Uv+K78JC7z;gLQaq3)80e(aeeI~+Y92pyjoz_)cm z{f56a3?GFAxTb+w;hH<~FcF#S3Tqtm+qh=+Y5P z-F6;M4!{=4#sHh5aZr6(Nz;}+N3WJuiSohO;zA?LE@&jo3S!eT;FSk64*g)mPds8l zV1Vft8=TgKeZQ=)1^et03f1-i02SQp3)Nid19;T}-ParOTJ;Z)p{)TF=C@9_5G78v zll*ee_Q8oPmv#qgA*HW})F_Sfv1?#;yBWnYb1+FH$g0T+)BiS7 zd|KNnibzIlH-1nocXJxm?J=ZvfivtW%u+Ll0Tg@*$3vF|DPcCk;Js|+!^G0lL`7}1 z>d^vj9$#01@W;?8U%IF}&~Q z$4efn4#&!)gHhd@c6J$tD)*|j(J9HP^@SBtG4X*O}%XcRM`9>Tw;XS5^&GDJ>M z7Pl?)8Uvx_Ot6;V$K>J<{T2DB;0pNr2*U);S-w#+Mh5jn65AxGD6B@=+n}=pmUMJ< z5lC&FSa36Je=@oO_hkY&Qpx3O1bgql#3i0yW-glA*H5&7-C;yvtS7Y5u} z4=cNOk-x)@jb5}1sC%pyU_XWcF@`l`^xbL2zwv7r`&Gj>#BRKO4_yjc6m`(km5vZT z_|g&vsOEDV^8i($oZriF9mG1O;-%a`og3#_E&}A!38_>&?(j;!RZe#?QyCSIYKME% zXP6{@Q6gmzfzxBr-lIEkHRaZvIa$n@Ws~rm5-$TTmZ{>Vwt(0RBvj@s6zBD-LA%7O z*Px`T4b?=}_|T<$)S7+l43mj+m@2O}!~RQ!Q|B(HPaoRRZ>E4Q^e5Lmtu?X#oL3bq zUi>IIJy8|pE$(y?pc8auL%2fpy6$n-g@(L;KT~9l@A2YM6okxw7}p?Trk?o#*?4Rw z8h2zm@*_WED+K&>c2p&h?P)v?=c5!R8PzYGZjUmcv(mo_s3$es{U`c2b)%-@(&JyiZP8 z-AkPCl9)TdB4)k{PtIRjTpmV^mNf_VNk>DRl*RwzG@W@m@7s^OoLeMT;QgP|!R5Xr zZAD~=FYUQ@%u?RMo(G-BEt+=>fA(=78$<;TW_Paa=U$0NPpkis7sN5}C3k}5pn3Bs zv;5^~sWjoH5YV?tzOrWzzW%sU(L%w&$7d|;Mrm6#a&K1r?<)kKk-R#)nbfYog;UM$ zRi=P^TZOA=42*?APdi-1vy4m^)<&9b|4egwA~!O;F>(3tlVro)uV^5bWi)&ndIY@2 zAo)fZl;&y%gDzfHl@3epySawi{8*j20ASfoYKO_2RTdf7w5sz+HC<02|6jt^pFNxsmUsfd`fgWgNG1?l%F9Npb~7w^4| z2Ih?)9{X|_c~AwMP)ek^qs z8%n07?EIdA6IU#EAc(0se>u3TbcEXbtnRVxpXQF9Q}?1{gDda5kN++S5Z6 ztwZ(DX&?fv~S@L5uWbzlY0!-WKLYsb;aa;2@?W|FKSOG4i z7YjDd7ia23^z`YSe;qoRcn_9H@7ZcNCM@?J>8kN93D=(sKr`Ap9q{kYjEaU&-urmg zvG>6=v3A!HUx)^~a5esSON^%?Eei`O_4%&cwrjc%PZJZa7cQ~kSy73!y(zG#|y-;*B(H9d$_vK0F;|O z{=0M<2?E=n>`>R8KEqK&Bhvd38&+ncvpw8}#Wls&y*UwTOm6#)hIZrU62*S^S5E;D zVW2A&uTAZvbK5x!jA1^|2Otefvh|4omlEF*6hf6~t;9pM_ahQv*Q-$pGo;S+;Htym zaPpNehIU5uW^Eg9Z$U-fL;Fk~ha#R8)7o5{kvb$$Kz?NJIAFXa9HvrQah4q}C zX}2{@i9JOXKa84C30BJrxUVnGKcoE!$H9=wy#!kc-X0rq9A<8{WLUUMhUP^lBv1?t z(#*_#>mO0mGC+uvlP7#Aw=^v;H5tyWE$>DyzW&=i;wVtB!A4Wv+519I<*=8r!A)ZD zoAdm-$s+#d8#rdZG@@^;kJC_qY{LyxPtcXqZg5|%*8Kv??Tbjpn^5618%|2u`M_{3 zV*R~yK*$cFi79Ur;svhcU>Qx4Y`mLR5>zd_3(Y!Ru!l7yf@oPdDdr|bI$7B32wgUv zL_PNr>$SsJh5GQ0I!%rh0o6~bpASmto?3W1{Cevzoz+K=3msRhXn|5}U!i+du{Ic~ zYN@VJtzysjxqj8ZoO%6IQ=JbB@s16n+RLl4MiYp!hGfMwv(BOnY$EbIA+8BHRRrEh zR%aFOm@gZ4EGKJ&F7o;|TZ`*e=;28t%)Hmxn4%dRBlp_G=HcZ&O$yZ5a@Ziv0sJca zlbQ}balM5vS-Z6F@Nydc&5Cu4uXRw7sR@}+^lY}-d67OEo~;2fA=D`Mmc8KB6Uv!= zaZEL=R6K;7LTZg!3XtnP1p1BD0eE5{awME@mCvWH2O2U0lR?4eBR5*{TH>Cw)Mjk8 ztB0laBnDRdVJ*uoNqY>7`jL1X*gwgCmdFqK#wzWsN5lLiVn|fT<=NcuvZJxzU59*+ z-4SpykoPDAv(#Kxqz8~ko%!Nit;I?Q((7%EJ}6_LLxJ~rIw8fY3#c2TmgB3_~ZF%&=5anI%>8l!b9 zaH^8)q@uF zilFKrRHM$u^2ek`$n1yZf3Lr%PS2?f{ys0ZIr6J&cg5-?->tebjwKP& z^R?Dz_)J}Y?A+7x#F9wpa%P>FgL7Q-oYXF+4-?o$xrW=sk^50T!JdXKj@~bJ``FTs zFB5sk<*R~UA)6RBSe$g3h-%;V$^m-MI`c;KM!k_ARN3`CAB&s*b< z70|ztc{u{uY$IF$pyXNbK!I$tHG_vIKiheu>r2+nA33asW=k*Dd-_#UG*Vn*)wt+e zfCKfG;#>?(BCDa=f(tsyycd?Ee#Kpl8r)!}JRNeMkWX#lyzRV<5AxeFFOmP+04Nd! zu;%x!X=JJz(NXim#fv&n^Nhi-baVBz$;!0nq{%(Xd$Qnn zq}!&n6)#asnLbRqk;_-D;wS%-~0-6??-)Hp)2k}g&vYL}|9R`C7Iwa)}>4$K< zh3zCtew3SP#x(_CKq;7NC1f@W6I6Cav#WE(QZ+)=jr)|?R>yKj+tL#y^Ewibp*J`dx07^&-vJ}Yuu#kNKoL#Hzou=L z`a_zQ4=&&0Z2Chv$XCL;oN1X2p;2s71g>SYfa5Ytps5O=@PL?3#iLlOC(M)tcCb)qE z#SoY3_)MYV$+{}iJ3S1JFYNUhf$|~@YZBDp;cuyI<`0U3W(34`u&6d)C7FiieK0_F z2^SzsrkVtHIt07foScyvJ10+zX4IUZMgNvNLHK969t-XA=cj+`eW&v|I8}#P7L*%N zeZ`5v6+v83;dNWGG_KYh)C8%bG1#JYeBT`ecK)z!G!}{ZoIt{=s+O5(wBAf0a6ztF zIIs&j#)49sv^g~^G%N%683e}k#vjG%+C7DbeQ=o^M^%GnT1q-tj!o$+HKnp_q*9lE z(0E}|@`~fqruv9#1M^sD1^TWaABzChH^;y|2n;pvuEOdmpw}NEFyoS`El@~YHpAzoh>dB3j{xWLs?()gTn}4&+n-(;Q1EWWgN? zwoB3NYs!7*zWW?0A)Udk+kWlXhZymhex91Jieu(?vE+Q*`&i(n+9>OLKixj zGUQGKFlw0gLPZa@Top#D1ykCqZa0wWs}*5LYJ#*)I+4?KAqSjjx~jQvycV$P9)fB6 zkg{8vY{9;iDg_T(s;~T2Fn|haU=<%h0*C1rxv+jY-i;$v%C z($haO;Vx}V5SykWk6L)269wRBp$)$4LL8-LjSr(m$Nj_Lvwlp*?1PO~nEw8dU-p}9 zsrTmnbmu+5O{}Dm$j=zBh1zTs<1)=IjNR*b2Hm2XWxgPg5yzxq(3xHk|9@W?wp!>?{UrkL4W0+oM7-P$E@&59Ad}!-|;HF6|14M`vU~am`{{{7g~;2TiumF z$qWwh?<^OI2qqzHI^TsG;wu6)YiD22X(+xj%`>>9fqn^Zib0%GbMj=}?=5|TJw)>& zD9nlM@s~TywCJ%cToa$oiS_Y?|4C1xXPbz9XWr498XjhrFzN=4J2s;A%f^E6|80+u z^u2bs6Znz+jhv*`(+JEft4r%?l)zOg`3Oh&C5_eGJPYc}zCY2yJ|9`%F9rsa(D~M~}Z78v`VOGqD z5?X<~&)VIf*=qx_Ub*Y&#g+A--%3-F z`8CRD$K*qQ0S)NG@94M!fsA&ymW6q_ZY&4eB!T8{0!$2k$YnDOJq3QZwowA;!*+xe z#V;IE5pXEKJo&W#c;z>Wua%*OSmRcn^}P_abZ{bMW@{63nOTADFyF|@s}ZwV4kAbh zzR%i|`v;3 zn8x@=<56>+Rb<+t*atM#h==@~yS0d!`|G>sQ|1?&0?Ne@l`IGSlb7|rk*`<1IY$u* zBZ(XOYZ&PHqqJNGsr~nwYE4yf=f|cj`RRjPtk*M}(|D132Pr9-Uk) zd#~MMn7a+@siV9*_3K*$zmF>r$y(qO&xva?6tN6oYlh?eZtd5$PtJvIo?H$7=0y6o z%S0B33+#X zH!ynu0014`+Xw2&^f}Mi@(v=MBW%7<0oe_}R~+ zSxFV$8!n4Dd!!%PAN+vI1T^c2H#}_wt!aic8E(Ey_fAY$Ku1D}(SG$$`Zwbo3*AyyO)BX_tlEW5WM(?tbXZyK~P0T~!ARliXT%J5OA zIKgo}#OPeU`anpj&;VoC6{AzZ4q=y>$*TPXwIH2xm~~v zBaT`!`|g$-d+ONRmnq{_Hi&U`gFGA}6*C3lK;g$ z_AS*X?k-ByV_DT-{@5j_<`jPAN&=WBqHH zF(Vd+RdqG~9|HRY+8zj}$??4pY|6wFhy~)!P=pi3G-iraSyn$bO7C4vyObMIO-B1l(Yc92KO(gkie|FZKQ zlI?B)NASNE=%a7ukf-9#z!q$yDzklh+H-d?1y0h!PPBOGu8K^7vcnIFFA{#g=}Td* z;NgiYqDLc~c9+HkfTc@qRw1)CiPwSZpZk>XmV__B%zspRH?pHBXL0N1NvNSwMaL=Y ze+)Ge6>3Vu9kAY9=>SmqRwb*4 z)6rpS!{x1SRRc3X;y=p9z) zX>OI8vj~5a4jqG!=pc~XVUh#d8V&Oq1??eh_M_qQzt4jmy{{+WWm`MLtmi2^Pd6+g z$gQ>zaxFAaq;SWG0aOB*Nq_oi>gqQBO||H)xq_5c6? literal 0 HcmV?d00001 diff --git a/translated_images/zh-HK/relplot.a03837d8f0329cec.webp b/translated_images/zh-HK/relplot.a03837d8f0329cec.webp new file mode 100644 index 0000000000000000000000000000000000000000..126847632ec6f89b430d3a104f485a6e222e9434 GIT binary patch literal 6468 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 z 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 literal 0 HcmV?d00001 diff --git a/translated_images/zh-MO/relplot.a03837d8f0329cec.webp b/translated_images/zh-MO/relplot.a03837d8f0329cec.webp new file mode 100644 index 0000000000000000000000000000000000000000..e9161e3eb4c047cdda8a83221a5310ff0ba20f61 GIT binary patch literal 6444 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 literal 0 HcmV?d00001 diff --git a/translated_images/zh-TW/.co-op-translator.json b/translated_images/zh-TW/.co-op-translator.json index f645527d8..efb268375 100644 --- a/translated_images/zh-TW/.co-op-translator.json +++ b/translated_images/zh-TW/.co-op-translator.json @@ -101,6 +101,12 @@ "source_file": "8-Reinforcement/2-Gym/images/cartpole.png", "language_code": "zh-TW" }, + "catplot.e73fc35fdf96242b.webp": { + "original_hash": "90cd4782a2f9b40dec8218b224b29c1c", + "translation_date": "2026-07-14T08:11:26+00:00", + "source_file": "2-Regression/2-Data/images/catplot.png", + "language_code": "zh-TW" + }, "centroid.097fde836cf6c918.webp": { "original_hash": "c8f866ed446563d8e59087f1bca1f97d", "translation_date": "2026-01-16T09:35:37+00:00", @@ -383,6 +389,12 @@ "source_file": "2-Regression/3-Linear/images/heatmap.png", "language_code": "zh-TW" }, + "heatmap.bd98dce43b404c57.webp": { + "original_hash": "7f2f2fbd993018bc01346e1eb8ae692e", + "translation_date": "2026-07-14T08:11:44+00:00", + "source_file": "2-Regression/2-Data/images/heatmap.png", + "language_code": "zh-TW" + }, "hierarchical.bf59403aa43c8c47.webp": { "original_hash": "50b9bc3298659c463ae76564ca645b12", "translation_date": "2026-01-16T09:35:20+00:00", @@ -473,6 +485,12 @@ "source_file": "2-Regression/3-Linear/images/linear.png", "language_code": "zh-TW" }, + "lineplot.f9034ba47b1e30ee.webp": { + "original_hash": "b3959c0ed0f02f668009c76b95c4ebbb", + "translation_date": "2026-07-14T08:11:51+00:00", + "source_file": "2-Regression/2-Data/images/lineplot.png", + "language_code": "zh-TW" + }, "lobe.2fa0806408ef9923.webp": { "original_hash": "e6ec71dbe350aef39135dbf88bc89163", "translation_date": "2026-01-16T09:32:52+00:00", @@ -743,6 +761,12 @@ "source_file": "2-Regression/3-Linear/images/recipes.png", "language_code": "zh-TW" }, + "relplot.a03837d8f0329cec.webp": { + "original_hash": "4733544cb1c2e58e987087283e66b4a5", + "translation_date": "2026-07-14T08:11:36+00:00", + "source_file": "2-Regression/2-Data/images/relplot.png", + "language_code": "zh-TW" + }, "scaled.91897dfbaa26ca4a.webp": { "original_hash": "789c70fafe6f6dd6e377a90b66e7d740", "translation_date": "2026-01-16T09:47:40+00:00", diff --git a/translated_images/zh-TW/catplot.e73fc35fdf96242b.webp b/translated_images/zh-TW/catplot.e73fc35fdf96242b.webp new file mode 100644 index 0000000000000000000000000000000000000000..9bfbd217f239a1c08f4c6430dd3b7cb95ac032b9 GIT binary patch literal 3624 zcmV+@4%hKgNk&E>4gdgGMM6+kP&gnI4gdg<6xV0zEnXYw_#)ckLgl2W~94dW3sz@-OTkk)PrJVtt-}Y5WxNiuFtUL;OGV zKihABKgal%Pz(5H@(=T$-9Ku-u6#58<^5;(6Z}8_|Bat6f3o{``v(3?{Ez%E_Al~( z@c+R7|NocwRqDs~m)K+VG>t}!>T!~ONcji}D{$4TJdyGa{Pl+Sj{Nkk!&a>FN60`) zTZUHb+EZKMKO}sF1eLgI&1wmr2Lz4YHxC2kp8vuQz;a9YI*A7QvuiOKGn zUkE@+TN5}S2thb{9TLeP(P&{Y<&~mVo18~eK4zz%NA%IEdM_hL7IcI**!+?5T&PK% z=(ZU6l+po#5DJY9iHi!)Bj3IViHJdjHwtyC$`-v5-?J$SX?o=veNGgv2xU=jtxN+NO z+R94VD)Xn8(^Zq6Kq@+iDMeg6k!8rWpUTqDfRNVa$3a&3WkT(?Be-^X8J$*6c>odt zl8z46fX<@Iotgb9vK``9HkPNwCwu~?i_Z}TV1!FufNA4 z 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 CAht6A literal 0 HcmV?d00001 diff --git a/translated_images/zh-TW/lineplot.f9034ba47b1e30ee.webp b/translated_images/zh-TW/lineplot.f9034ba47b1e30ee.webp new file mode 100644 index 0000000000000000000000000000000000000000..4417942c07cf5f7804bc569879706bc679042f70 GIT binary patch literal 11834 zcmV-AF2&JONk&F8E&u>mMM6+kP&gnaE&u>5uz9Yd%H!-}_(g-`_uE{;Pkg^-=$0)C>JT zr|&?&_`L{z-g=b(iT|(uJNN(OZ|ZmaAMan>zx;gweynHqBip!GBO_uD_g|8xD!{^R>4_#^pV{Qq|G1@Uj{|N1YTcbI-Nt=^&E zVtm8<-{pt-AKVX$pOXK*`Hk*R;@{MN>VIbZnfn0#75q#42lWr!pYA{Z|L=WC{}06n z+s`~~0Dg6umZ}=bGzw)2?zU056|EvCg_gDRAr6>Jw^nU~&&A+Svoc{Cs zv;H6d|NURP4{1JxKc*yN6EwaI;ZLqma^XX2R>3E(ocdeSh}We~MD^35I~_M6O~~0z z#THVB^7cy5u1X;ishe(t%zFhRRrm4~`sCyO64@uNoe1P4X+oi>noRVP!W)+g8&b6v zjtm&=x%J8ma#a3vj*|ckh0pAECWu!(OMHbsxk17!he5)n$7OUJYdRrFt#lU{0FXVM z$54>3NZ8693E1hVLn;tL6!`nCf4av)Do$BE#1qALvT?0d(dZMbV#n0^Q~;U<3x}~j z(KSJ#=PJ`UrsOHdqKSvMTj*h=rYv5S=hrAK0*VYjqtbllcFzCcmdxvWNd7|yXe#T6 z(FCuwj4TKP5{uZtEqd05et7F(lg^)I;`zf|S_tlK;%TpN0N0i9bv0&yY2UdTQxuWk zWnjfrzx4)tNU{!q1uYzYnJ3>OrcJ2&KL=(g^^Dv`kDrFLMq{;k9_9S?`E(Q9dK95Q z<67rQjBEsb4LY3v5y%(}q{8D22V`K8gdtIHj#gzRa7mmPw-3`eOQ4hmu7UY9SEmn% zX(72nWBg(>=k5eZ>WV-zoSbg*q&s?_9-3@ z#mt_ZGQW)kT>Z_Bk18UGd$1{jVO;Hq`@U<{(zI~%vbMy(NE}hjoNVTsiBRS+BVJGT zPimgU6U?-j@m+vn(td#)sB3;pAy;J1y6p&rA~T*=(qCFkjBqxSp%^V)Qj5L@96lQ= z_{~_h`HSfCpkTU=)ffC|M05sFPXdQ%G}7lOHI}3ot!ZZSlmm6 z57Q=)Soa~F=#+5zCX3Tx_F1){GQ>ltR^vUcp51w6JG_E=h zTqVb@&K5x>QQ{Rog$~#2;-{6Y`Qu^xE}vJlkFH2T+2Cl5X@|=Cq8Djbqja4JZF=nY zMCdvaR#u|dEX^_I^~$Bga@tPN5e*MR3KQKALOkAEa_orK!vocDr;pXLw0M;@2eEnm zD?bP&UkzC8i|=YFTQZvA)~rrrh96w~BF8QMfZ>;NKLUYp zFxr){C$FJ99XBC0nrcUIrBdNTYF5D~uAK?PboGAl-Y7hfe>WE3Z=@CLMO``*vD0!C z`sD{Sz>PF}8j_S=R=%AH*y*_neR6}A|3Gmun;V~8pyk4b)UAR~H4BcV)SBeMVnu+E zA{TqFG`Q<4!tiW|15MA(S04u4Jbkls^~Au#@IYAW#q(BADTj(u{%>xB)eArfe)5D2m9%PXX&ep{D z!cgv`$ZMq#kEY6JwProX+cW*$lvfY%ijiRaA?T7htY}9kGFrS=H|zJO7Y>f6sflC0 zn~YT=4F?eApJCM`!4+=?x{UX`!@$?Hpe|8UX0B9)V;=oYq;k}D-{;H&F_~;`| z0UoEcH@y4hrif#h{_yTtOc%?`_AXd^c!+ZV7_Wy&yoahY=`MCS5A~mnnMyIguBA?BM(W_>2-hM_A9W3pIGB zs_s!36`gx7PV$m@ zZM(h#q#9lU{8vxKyzB(%_xfLI`xX!V`{ii~Q{oiFLs@y`)6`#u(Odkz+X%@l_n7*uUZGA=~FBa)rQQ zjUlOR!4hZS@}0I;IdC1wrZOVN5B88Rz7GzL;yWRIY2gBFi>Fa!G8XBa2j_bU=RND4 zdo`E0!xNx5BH?DX%7R#L%Sjau z?Afrs(ul2xdS~)t*%kGlf=08@%`(Wg){9!Z2XKGvNO-Ek{*7TEMu$-Tq%InV61!~*=YlV2^UTw%g*Ao^jPG8Og|_4P#gDi9I63ma@- z_oF8OZp)lmaMMjvkU>Sz@X*5cdlVh_`Z}bKgiXAIJ=KjEIws5S4tpko_-{bBXf6ZJ}jtu{E4RLcHolzb2rpTgsGJ zwjwJINJYX6p=*^D%vyk3XuZEm$HbqH@^$9ZlReGQQNfVw{)!PHI&RN=`s?gAtrh~Z ze708CB+;p`^xue5j8aKy>=Dk$3#U)bkh%QzK!z4&2ze`*wFpl6dc@I}54#XJh_D)M z;UR;pUM^E{?`i08Z#eI$naY)eLrn^0$b1VY4JH-shL;TBM$FlPA7Tgqw2@=E0|584oTEW8#+pgLvdn;o~YcT>;4=>P{qtu(OPspL|Gx zm9sr3{^l{=)`x6bhjsOUg*|&^tHc~w$-lF9|Btt>-$q89HQh{%u&VAmy2A6%STZF6 zep0&{9O{y{EubYi&1qC+M0pnzrt4QuXu#H2<)RxkWIqR^Y+1Orcgu&fz|;04vylc~ zBWhz8G%AJ?OWs)hBZ=ehvnnDfY73)k7=zlP0L`bSvTs_Im@9aW=>cuLKG-WGj&x9D z#NGo7{AH|ca7j?HRRqG_wL(~meR{Fjn5#<~+HUns=dV8tU)l(<^`{C`3S+YnP!@#S(%hpIoZ%uu;-qqLp7e38jnm)( z-xU`rTFXd1%w%v>@hdN=0-bwAZ)W&~F4!Pvxvul~G1?KRc$ic(%v=%A_nqnKg?!B7 zTrnV6$$?gE?&QlDyKY>hXDA*O^n!&$CK5JJX6}CE6`o}tgkxl6qDbmXAq!SBj+g#6 zQS5YB5Fb4*)Fj0GgRZOS(L&qaZ0pNRbuU5>tqqW@iad)zhibb*fk-f}_ZpWP=_3v% ziCY^E>!v;bULlZ!;=~n)L6{6yn+hR^QT(Mrup}D=v~QQYWL9y~<~uT-o%QJO89oMv zIxc$hs5hhI*@Eq1pEjg4ba!0vhJ|c`F||^_gmh3bPlx@&O0E|VhJr}HQL*8BBRLg( zw+5|ggDt8r&@36ZS1lx2L1V)KfHmVdpvy>R*oPG?1$~inGr%v()Y<<3&m$d^!dj-JRx{d@+MqMUo!^TocVU&sphtmRcU;$citS zzu>;)#dNsh4)oGnE=d|bR+t3*r3~;O!&-zOF~MH0iLJl;*FI35)_zYZu%`S>en0e; zX_*bOz#XkQ8Cq1W|NpiQUIL&lm3RD&DNzc1NGFZlQ=^e0CFJfqd56v#ggyw_Y3L2E z4)0l{fcc>X&WtNqw)0n^he{&7gg4kxP8<-Y@5H&WC1d|xRi1RxMuaqGY1Q0Xk`G6) zCZAy5ueq>yZ>&)!EB(j)_pJmiFq+D$TC}%)nfuJc04tZwdPs>oq3FsNiIco z8+@`3Ktq;=_9k~X2gpLmkk7BY*&v)YODmfuMJqb$(X=M*fCr3(M&T=@=?QoefU%#+ z)Jz*8tYyb=aanGt%`wvl)9zFGaFsTfp{;)Qly=yB?_INW4)tB_ico!T&Z-GgIii_o zJ-z&yLGtCgar5Bsxs(Ifub|Tb$Sl?3<~J&*h;?0tghvlI$(0oN!F_OloV7g&1IGq7 zOJ*9&imCxIa^n}u%ps^s-Ob(hLw~{sFW>?orvZ0wQPV!IVb(sPE)rGK+V~CW^PN3S zs(@BQ{u~vmQG{w|gDcI&uR|Z;^dz5bYAfu`Ir~m z`?ijrWPS~KUH&;PLhSIETsDUImg#FD^>efmRP*MUvyH&s8|@oY4PmIjom3owIpln8 z%=CS>lhXnNWz)-74o_|HU8v}EOfSVWL~AD=g4X=UVfxy(C6tcdwQIPQ{75knl)Yx} zYsOSdKAgjNo~&2H8lv$^X#BATNF5WC7Ic84iBqyX(vj5fF63)t*dwV;j&nudSx7r8 z4x5o>Z^Zf}k*0%|xZ4bT;~d_HVegcColsV@Q2R{*E5?FS_Qq7mmwo)U@(0#&_xqS) z)CBL6Xtt!ThoYKmVH60vN~54|6pVBQs^Pto6vnSsIL;wt6I#`$nja0$C=z&~XR#ZI z#Nl4__eUb4Ngp3}2xQb8MD|Pc&S~G>%lo*ma)C@Zh@FJp-O9V$Is&~VBvg65j%nYG> z5#c(&XH6@_Vr$#=fFIw6C9 ze00?Ej`?PGx#>p^-7`m9CyhQG_(rl%=W6oIeWOy4ENN zj&rAf1+2{LBDU|NzC-SHkYJ0O%%%;YLe zt#!FNP_!=BI_-6$O;HVY;aQUhD+cg!(m@;3?#%nKCt1-Cqi5vLSg55?D&4yOh~JRr z?9EGZ<(XCc+w!Vh=t4t3b@-e20W$7t)SL}!S9>Yem}w9{I+c8d<$!TsmS9P_q6-Q0 zcqS#bJ4=%n1e{qvr5=_%*hK^aOd=L9vA6(`tpw_fHI<&gm59=76cx6m%BaTE11U@U zpTWb@i*X#*+|!Wj-dMe(_Q;|pP&w4!Nku1#aO|;E5j9CV0VGKKiiq=;%0Hs8m|r|M zHDFygev_fdxr`HGBdVMDDQmU)3jpC6%ytQPFk!INt%M(Rz@|RT(KfS`6;TwY94goX zy(m9<4AZrHyc<(QwT^8+|2-!3%QCNj*0snj$?C0-ZjYY_+~^q$`zOi#d{F%HcEe~n z9IZ^}F`;=oHj6%6@j)z5bg%ajrF|6$hC)9WGt4E=ezX4G_BHwyNE(DFT>`ReR5S19 z^Oe9_L+M}3-PGIP<0Oi#74PVGL}CAiNBDWpGS(Z_G0-}9*l98WCLx0&4n;L50&?3}5Hh*%)^apt#lqOf z$+n623Jz$YnAN0HIS#?-9rcleL+;?qN1&~Cb_6~{lbTmm3pS1uInNsmq@ikF-;8u|kD}x-=%U`OB?0EHjzOGi8wW$v2 zo*F);Mi*YiAgC4t8--};MPG)m%ddLze6Z!dbMfdK;q z^i$K-EjaPla^$b}=*IYf$ubO`@6#oOu}rT%UPOFyrX)35f@mH7By*~(I=aO5h0CSC z5vLX}a1v@lR>0%Jb}wd<^-w#~p3!8^ICDpHKW(}GIgdztyM)eR?*INzmDwWFtnfr_ zmPa7cKT+-8{AG_*H-)~2oQ|RRGSbY~{x7g#wnd^v--u*R$y>}Mk^QBAemTENZ_Xp! z8Ln{6dgAR(^n{w>D)B)G%BL2$lxuV4#RMS)JiK7PtXj0A;)T{o^o;y=GcBtHKjze9 zmkAQ_APMQb+ifpW8{%a zd44KguoW$`zYg698Ls*iVh!ILQMcDl8^O$)dtlY%@vR{NP#pfg)W5sID2msF+7ik? z4mLG<)Wc{luwXqzvpGI!+53sXOo$h?(3+sZy4jdKuAm3FWJSGh6vCD*iId)wJr`4JYlub6!8^!k7Q#Y*bD(#wr!Km9_r~P&4~z?&B(Yed%AdZ*&%-LzVGs=? z468sM_CPwVzLXV5IUu?B*wYY`wiSU;1cm6&kMoJ-|28) zBcJU8x8uLO)ZxzEKA^IS{PmF6Yd5NgPD99rn=bW?1PFZJ)Vf*N}YlrV?q!1}fdf6zKTwHP% zOC7eIe+2b&uoAvo?l1(6sO7#}$9Pi@C-EkZ>8G zW5aE*JkRGxB8^+jh&4$sf+%->0WE#jT83nIv8=Hhe1-K{%=G^+g7C)MkF~XNZW2pN* zz<8{lpn@^`>h_fn%^$ci3QdVhj+6R1ky3AhDkIFJ#jBe+>OL$!?p*kD;jEPRR*cNa z=hhgfq-4i%90m-;EzI!=`lXAU}$-5Hie4}62N@Ai)1 zQik6-Eo~jQ%i-b16q_D8qZh4Zs%Na+Hkwraz|!Y075q=*z-$iz$0z{#Xl7vobQ><( ztrWm!c&|92f2TM@o!=hm3?mBPB4{H6BBATga-@tGWtcE{gafqCByhskunoTJP;wgj zAc5*qIgri3&6n|E+jZ8sAOmSrN(`U1aMZuWF4#TUwgmA9f?NP1M-B}b6A?GH2A4P9 zzW9xvm$;=dZ4zg~(^-c^>Sv^uByUe43NoQ<_gIjW_SXs_f?YJ0L6Ol5@pa}8MsF$IbqTg%9=6+#B=8LoInYT%( z0smhx*%w?RsfADha<=RQ)+L^0ty+pE2DaO65dGYEv*MG)C+*Eqk<7%}RG6IbFo%W= zJy6!7K<+Z>o#g4cZtQ`ps2EQnytW-9mPI6F9J2f)c3;-9YNxP*yUQUg+h7lJI!p!u@b&0(^aOiz-QI*E zq~Z;L=;~icx%=y7Ns+^BYmk{zd4#=BLCy7%&PSD^dgT$S+{a;gV^tLJEB`VDb3xV> zG=B4kMMX-Is*H`?0Sx*+MF#~6Buc<(<~4|}yGN$$P^G@(M&P>*O3y z*p3vuLOSVPHs=NU-EYt=uGqAUX|)b$baAlxPOpvHqLXFln#!b?C5WG`Zf@H5aQ+Jw zLXOircnSpqQKB0@R6s)=*v-D{a=embsbJCIHi*>qzBX)}azX^RH^)p+9NcpzDl`;z zQ|f4N*8w>_^b3Dwo^kL82#i|KIWXx{GM3NNu)Ra^a~$i6Ks!J3uyT=n7{^ilI=E&8 zRWSjuo8;6>(*)8@^`ojnvd4L(D3+9}61yfteQxyztpYznol0ryFa$t1QcnV?$3Y_J zZn4#qVQV39SH^0}gkn&5o(TPm`Srr+()24Ex==aG&)+6Hl2f;OF7_0?X71C!!N_a( zHYwIFz12cSq$Xk-2e24Z{}swjgy^w-o>AC}hH`1w8xXw|NEufXQ)UmDScOI|s(Xw{ z*J9OWf}36Z4oa=^)qb*^N4hD2b50v@1$?DKCUcckW5S()?gFfh9X`R>Ah6w~h;h z{1-3;8SVIXOY;OH9|VF0%|8D`1l@s;8R7_DaMsIzNje%F$G+Lpz21-%(6D!iB7SD3 zy+0?6jrmdWw&y_8K+D0FjH~|g zETp0-1wWP-(*)v0Qbs5z@6)~%p_+Yc7Vt7XUHAf)(?R`CNwaough@soOiCx(w=Qp~ z8?2Rs(27LT?FHfbqCh8{xlEJ-A;kGUQ} zW;m4$QWL^s(F(efJrP*VWC{ES1<9WY=Rr*!y&Dj*-$D6sf&#vF6@Ou`%}?*60V0uP zyEUAodCLk^b_(UN{0Ows+QY zGP(_KC3^FvEd9AbTD?@vyVBB_Mdxh6cRumJamLSOb#GS#1F-7#Mrg86J6G#c$(k_~ z46bIOG-mKB9VMkxL^Pm7z(n1GT{t0t(hBhrXZ!nguQ7~{agpY~@9d>pIWlQZ%Tt02 z_e4d5F&tjnEhjCcQKf5ZWt}D$G*hpq~6_UNL4(Ny9AzU+~ zHflIkf3kr3!@uki`H-+N@=lYAyq%i7D>@4>29i|b&j^&Wj4-kmDj7aZx{=FQt>P#G z1~;nVkOG<(ncrvi2M6&b?`wVy0uWbHjvHQ zQ$j(F)v1D5nj;^^o;q;R4+B$evpSjg9#2hd)3ac5fj!abf#mPw3GV5m3~kmBd|B!? zi=@Sn_hFO7mk&T#71#my&ySm_?rYu2_VFw&x4;VH^>1+d;8e9N>KMFh#}WS1<$4y= zdTneK8+r-^^7v1_7Gb<#sWLzaKH}BWCD2xQ&MO0-7o|qV1>|^JICLAgK^Ln#k9^F3 z*&BBJy|cJukJgPEs#Xq*>8dL&?27X;9Y&g+3yG0P9}#>rQ@u`cRKK>+l`pm}ny}8` zm=-?Q$3Y#xtQ$=QqJDH&JR3h5}Xje6#2lmboEgX$NN7YWsQCmh>I2)$lg ziEeHj(Z#L6wkV&^1G|1_(};4TKB{hyW=tOH>QG3-+QH8qAD$5jmRH4vWXtc{4_U-T z6LmSZCUD4m*D9)Qp6@XPBk|TU^!m2X5XJl4gSJTnb^i=!in&Q22#w2f^^-}p5=lmb za;Ipn<9FsMVanhRzA60=Gv&MO)&oh5Eh|dCPg{Lvmjl-r6o=O|p{vyY^-iF#S{a;J zZ76j3Zp#0}D?Sgs{F3U49Rys|XZ+C@AzvR^SV;q?=303>Mn&vwBJm_;jf9_1FXixy zkJ*+V#-YmV==Cx*}w1|U~`-r?D-0eSwYP)v@&aQ7VAgP99M5j;L);S9&Zxpow>(9Wq;cD&~4Tj0A4A9eKyI{bs2`OqD z#|vg=$;*kXDQTPt1ot$Jg_lvDQfK7(TAWa~WTq9O&D$Vh)A{ey?xt=5ArTZg;MrAU zU!_-j*p;gtDnNHj=5`K<${dDP%e|O_9jKc`U6m+9;%ZsE(~ZY8ZqDa@ic;<#)~v)X zFtzQrGPt`-9pv5S75Mzx!O56*$00}Yb*SZaz1dU@kihRA^1*nJf?^iKt@u&CBD9

P&-+OH@12O~+qx1B5y_R&elq#Ec+ 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 WjcBGec>Pz{COK8|K>fcz 草圖由 [Tomomi Imura](https://www.twitter.com/girlie_mac) 提供 +# 用負責任的 AI 建立機器學習解決方案 + +![機器學習中負責任 AI 的概要示意圖](../../../../translated_images/zh-HK/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 原則」學習路徑並觀看以下主題相關影片: -通過以下[學習路徑](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)深入了解負責任的 AI。 -[![微軟的負責任人工智能方法](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "微軟的負責任人工智能方法") +[![Microsoft's Approach to Responsible AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoft's Approach to Responsible AI") -> 🎥 點擊上方圖片觀看視頻:微軟的負責任人工智能方法 +> 🎥 點擊上方圖片觀賞影片:Microsoft 的負責任 AI 方法 ## 公平性 -人工智能系統應該公平對待每個人,避免對相似群體的人產生不同的影響。例如,當人工智能系統提供醫療建議、貸款申請或就業建議時,應該對具有相似症狀、財務狀況或專業資格的人給出相同的建議。我們每個人作為人類,都帶有影響我們決策和行動的固有偏見。這些偏見可能會體現在我們用來訓練人工智能系統的數據中。有時,這種操控可能是無意的。我們往往很難有意識地知道自己何時在數據中引入了偏見。 +AI 系統應公平對待每個人,避免以不同方式影響相似群體。例如,當 AI 系統提供醫療治療建議、貸款申請或就業建議時,應對所有具有相似症狀、財務狀況或專業資格的人做出相同的建議。我們每個人身上皆帶有影響決策與行動的固有偏見。這些偏見可能反映在用來訓練 AI 系統的資料中。這種偏見有時是無意中造成的,往往難以有意識地察覺自己在資料中引入了偏見。 -**「不公平」** 包括對某些群體(例如基於種族、性別、年齡或殘疾狀況定義的群體)的負面影響或「傷害」。主要與公平性相關的傷害可以分為以下幾類: +「不公平」涵蓋對特定族群(如基於種族、性別、年齡或殘疾狀況定義的群體)造成的負面影響或「傷害」。主要的公平性相關傷害可分為: -- **分配**:例如,偏向某一性別或種族。 -- **服務質量**:如果你只針對一個特定場景訓練數據,而現實情況更為複雜,則會導致服務表現不佳。例如,一個無法感應深色皮膚的洗手液分配器。[參考](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) -- **貶低**:不公平地批評或標籤某事或某人。例如,一個圖像標籤技術曾經將深色皮膚的人的照片錯誤標籤為大猩猩。 -- **過度或不足代表**:某些群體在某些職業中未被看到,而任何繼續推動這種情況的服務或功能都在助長傷害。 -- **刻板印象**:將某一群體與預先分配的屬性聯繫起來。例如,英語和土耳其語之間的語言翻譯系統可能因與性別相關的刻板印象而出現不準確。 +- 分配不公,例如偏袒某性別或族裔。 +- 服務品質。若訓練數據只涵蓋特定場景,但現實更複雜,會導致服務表現不佳。例如一款洗手液分配器無法感應深色皮膚的人。[參考](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/zh-HK/gender-bias-translate-en-tr.f185fd8822c2d437.webp) > 翻譯成土耳其語 -![翻譯回英語](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) -> 翻譯回英語 +![再翻譯回英文](../../../../translated_images/zh-HK/gender-bias-translate-tr-en.4eee7e3cecb8c70e.webp) +> 再翻譯回英文 -在設計和測試人工智能系統時,我們需要確保人工智能是公平的,並且不會被編程為做出偏見或歧視性的決策,這些決策是人類也被禁止做出的。保證人工智能和機器學習的公平性仍然是一個複雜的社會技術挑戰。 +在設計和測試 AI 系統時,我們需要確保 AI 公平且未被編程以做出偏見或歧視決策,這些也是人類被禁止的行為。保證 AI 和機器學習的公平性依然是個複雜的社會技術難題。 ### 可靠性與安全性 -為了建立信任,人工智能系統需要在正常和意外情況下保持可靠、安全和一致。了解人工智能系統在各種情況下的行為,尤其是在異常情況下的行為,是非常重要的。在構建人工智能解決方案時,需要大量關注如何處理人工智能解決方案可能遇到的各種情況。例如,自動駕駛汽車需要將人們的安全放在首位。因此,為汽車提供動力的人工智能需要考慮汽車可能遇到的所有可能情況,例如夜晚、雷暴或暴風雪、孩子橫穿馬路、寵物、道路施工等。人工智能系統能夠可靠、安全地處理廣泛條件的能力,反映了數據科學家或人工智能開發者在設計或測試系統時考慮的預見性水平。 +為建立信任,AI 系統需在正常與異常條件下均可靠、安全且一致。了解 AI 系統在各種情況,尤其是異常值下的行為至關重要。建立 AI 解決方案時,需高度關注如何處理 AI 解決方案可能遇到的各種情況。例如,自駕車必須將人員安全擺在首位。因此,驅動該車的 AI 需要考慮所有可能遇到的場景,如夜間、雷暴大風雪、街上奔跑的孩童、寵物、道路施工等。AI 系統能可靠且安全處理多樣情況,反映出資料科學家或 AI 開發者在設計或測試系統時的預期程度。 -> [🎥 點擊這裡觀看視頻:](https://www.microsoft.com/videoplayer/embed/RE4vvIl) +> [🎥 點擊此處觀看影片:](https://www.microsoft.com/videoplayer/embed/RE4vvIl) ### 包容性 -人工智能系統應該被設計為能夠吸引並賦能每個人。在設計和實施人工智能系統時,數據科學家和人工智能開發者需要識別並解決系統中可能無意中排除某些人的潛在障礙。例如,全球有10億殘疾人士。隨著人工智能的進步,他們可以更輕鬆地獲取廣泛的信息和機會。通過解決這些障礙,可以創造創新機會,並開發出能為每個人帶來更好體驗的人工智能產品。 - -> [🎥 點擊這裡觀看視頻:人工智能中的包容性](https://www.microsoft.com/videoplayer/embed/RE4vl9v) +AI 系統應設計為能讓每個人參與並獲得賦能。資料科學家與 AI 開發者在設計和實作 AI 系統時會辨識並解決可能無意中排除某些人的潛在障礙。例如,全球有十億名身心障礙者,隨著 AI 的進步,他們能更輕鬆取得資訊和機會。克服障礙能創造創新機會,開發出改善體驗且惠及所有人的 AI 產品。 -### 安全性與隱私 +> [🎥 點擊此處觀看影片:AI 的包容性](https://www.microsoft.com/videoplayer/embed/RE4vl9v) -人工智能系統應該是安全的,並尊重人們的隱私。如果系統威脅到人們的隱私、信息或生命,人們對其的信任就會減少。在訓練機器學習模型時,我們依賴數據來產生最佳結果。在此過程中,必須考慮數據的來源和完整性。例如,數據是用戶提交的還是公開可用的?接下來,在處理數據時,開發能夠保護機密信息並抵禦攻擊的人工智能系統至關重要。隨著人工智能的普及,保護隱私和確保重要的個人和商業信息的安全變得越來越重要和複雜。隱私和數據安全問題對於人工智能尤為重要,因為人工智能系統需要訪問數據來對人們做出準確且有根據的預測和決策。 +### 安全與隱私 -> [🎥 點擊這裡觀看視頻:人工智能中的安全性](https://www.microsoft.com/videoplayer/embed/RE4voJF) +AI 系統應安全且尊重個人隱私。人們對那些危及隱私、資訊或生命的系統信任度較低。訓練機器學習模型時,我們仰賴資料來產生最佳結果,因此需考慮資料的來源與完整性。例如,資料是用戶提交的還是公開可用?在處理資料時,也必須開發能保護機密資訊並抵禦攻擊的 AI 系統。隨著 AI 越來越普及,保護隱私和資訊安全變得更為重要且複雜。對 AI 而言,隱私與資料安全議題需特別注意,因為 AI 依賴資料來做出準確且有根據的預測和決策。 -- 作為一個行業,我們在隱私和安全性方面取得了顯著進展,這在很大程度上得益於如GDPR(通用數據保護條例)等法規的推動。 -- 然而,對於人工智能系統,我們必須承認在需要更多個人數據以使系統更加個性化和有效與隱私之間的緊張關係。 -- 就像互聯網誕生時連接計算機一樣,我們也看到了與人工智能相關的安全問題數量的急劇增加。 -- 同時,我們也看到了人工智能被用於改善安全性的例子。例如,大多數現代防病毒掃描器今天都由人工智能啟發的啟發式方法驅動。 -- 我們需要確保我們的數據科學流程與最新的隱私和安全實踐和諧融合。 +> [🎥 點擊此處觀看影片:AI 中的安全](https://www.microsoft.com/videoplayer/embed/RE4voJF) -### 透明性 +- 我們產業在隱私及安全方面已取得重大進展,受 GDPR(一般資料保護條例)等規範大力推動。 +- 然而在 AI 系統中,我們必須承認在需要更多個人資料以提升系統個人化與效能與隱私之間的矛盾。 +- 正如連結電腦和網際網路誕生時產生大量安全問題,我們也看到與 AI 相關的安全問題急劇增加。 +- 同時,我們也看到 AI 被用來提升安全。例如,現代多數防毒掃描器均由 AI 啟發式技術驅動。 +- 我們需要確保資料科學流程與最新隱私及安全實務和諧融合。 -人工智能系統應該是可理解的。透明性的一個關鍵部分是解釋人工智能系統及其組件的行為。提高對人工智能系統的理解需要利益相關者了解它們如何以及為什麼運作,以便能夠識別潛在的性能問題、安全和隱私問題、偏見、排他性做法或意外結果。我們還認為,那些使用人工智能系統的人應該誠實並坦率地說明何時、為什麼以及如何選擇部署它們,以及它們使用的系統的局限性。例如,如果一家銀行使用人工智能系統來支持其消費者貸款決策,則需要檢查結果並了解哪些數據影響了系統的建議。隨著政府開始對各行業的人工智能進行監管,數據科學家和組織必須解釋人工智能系統是否符合監管要求,尤其是在出現不良結果時。 -> [🎥 點擊這裡觀看視頻:人工智能中的透明性](https://www.microsoft.com/videoplayer/embed/RE4voJF) +### 透明度 +AI 系統應易於理解。透明度的關鍵部分是解釋 AI 系統及其組件的行為。提升對 AI 系統的理解,需要持份者明白系統如何運作以及背後原因,以識別潛在的性能問題、安全與隱私疑慮、偏見、排他性慣例或非預期結果。我們也相信 AI 使用者應誠實並公開說明何時、為何及如何選擇部署 AI 系統,以及他們使用系統的限制。例如,銀行使用 AI 系統支援消費貸款決策時,檢視結果並了解哪些資料影響系統建議非常重要。政府正開始跨產業對 AI 進行監管,資料科學家和組織必須說明 AI 系統是否符合監管要求,尤其是在出現不理想結果時。 -- 由於人工智能系統非常複雜,很難理解它們的工作原理並解釋結果。 -- 這種缺乏理解影響了這些系統的管理、運營和文檔化方式。 -- 更重要的是,這種缺乏理解影響了基於這些系統產生的結果所做的決策。 +> [🎥 點擊此處觀看影片:AI 中的透明度](https://www.microsoft.com/videoplayer/embed/RE4voJF) -### 責任 +- 由於 AI 系統非常複雜,很難理解其運作方式及結果解讀。 +- 這種理解不足影響系統的管理、運營和紀錄。 +- 更重要的是,這種缺乏理解影響使用這些系統產出結果時的決策。 -設計和部署人工智能系統的人必須對其系統的運作負責。責任的必要性在敏感技術(如面部識別)中尤為重要。最近,對面部識別技術的需求不斷增長,尤其是來自執法機構,他們看到了該技術在尋找失蹤兒童等用途中的潛力。然而,這些技術可能會被政府用來威脅公民的基本自由,例如,通過對特定個體進行持續監控。因此,數據科學家和組織需要對其人工智能系統對個人或社會的影響負責。 +### 責任制 + +設計和部署 AI 系統的人必須對系統的運作負責。責任制尤其在敏感技術(如臉部辨識)中尤為重要。近年來,臉部辨識技術需求日增,尤其是執法機構視其可用於尋找失蹤兒童等用途。然而,這項技術可能被政府用來危害公民的基本自由,例如對特定個體實施持續監控。因此,資料科學家與組織需要對 AI 系統對個人或社會的影響負責。 -[![領先的人工智能研究人員警告面部識別可能導致大規模監控](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "微軟的負責任人工智能方法") +[![前沿 AI 研究者警告臉部辨識造成大規模監控](../../../../translated_images/zh-HK/accountability.41d8c0f4b85b6231.webp)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoft's Approach to Responsible AI") -> 🎥 點擊上方圖片觀看視頻:面部識別可能導致大規模監控的警告 +> 🎥 點擊上方圖片觀看影片:臉部辨識帶來大規模監控的警告 -最終,作為第一代將人工智能帶入社會的世代,我們面臨的最大問題之一是如何確保計算機始終對人類負責,以及如何確保設計計算機的人對其他人負責。 +對我們這代人來說(首批將 AI 帶入社會的一代),最大問題之一就是如何確保電腦對人負責,以及設計電腦的人對所有人負責。 ## 影響評估 -在訓練機器學習模型之前,進行影響評估以了解人工智能系統的目的、預期用途、部署地點以及與系統交互的人是非常重要的。這些評估對於評審者或測試者來說非常有幫助,因為它們可以知道在識別潛在風險和預期後果時需要考慮哪些因素。 +在訓練機器學習模型之前,進行影響評估非常重要,以了解 AI 系統的目的、預期用途、部署地點及使用者。這有助於審查者或測試者在評估系統時,了解辨識潛在風險及預期後果時應考慮的因素。 進行影響評估時的重點領域包括: -* **對個人的不利影響**。意識到任何限制或要求、不支持的用途或任何已知的限制會妨礙系統性能,對於確保系統不會以可能對個人造成傷害的方式使用至關重要。 -* **數據要求**。了解系統如何以及在哪裡使用數據,使評審者能夠探索需要注意的任何數據要求(例如GDPR或HIPPA數據法規)。此外,檢查數據的來源或數量是否足夠用於訓練。 -* **影響摘要**。收集使用系統可能產生的潛在傷害清單。在機器學習生命周期中,檢查是否已緩解或解決識別出的問題。 -* **每個六大核心原則的適用目標**。評估是否達到了每個原則的目標,以及是否存在任何差距。 +* 對個人的不利影響。了解任何限制或需求、不支持的用途或已知限制,對確保系統不以可能傷害個人的方式使用至關重要。 +* 資料需求。了解系統如何以及在哪裡使用資料,能讓審查者檢視需留意的資料需求(例如 GDPR 或 HIPAA 規定)。此外,也要審查資料來源及量是否足夠訓練。 +* 影響摘要。蒐集使用系統可能產生的潛在傷害清單。於機器學習生命週期中檢視所辨識問題是否被緩解或解決。 +* 適用目標,針對六項核心原則,評估是否達到各目標,並找出任何缺口。 -## 使用負責任人工智能進行調試 -與調試軟件應用程序類似,調試人工智能系統是識別和解決系統問題的必要過程。許多因素可能導致模型未按預期或負責任地運行。大多數傳統的模型性能指標是模型性能的定量匯總,這不足以分析模型如何違反負責任人工智能原則。此外,機器學習模型是一個黑箱,難以理解其結果的驅動因素或在出錯時提供解釋。在本課程的後續部分,我們將學習如何使用負責任人工智能儀表板來幫助調試人工智能系統。該儀表板為數據科學家和人工智能開發者提供了一個全面的工具,用於執行以下操作: +## 負責任的 AI 除錯 -* **錯誤分析**。識別可能影響系統公平性或可靠性的模型錯誤分佈。 -* **模型概覽**。發現模型在數據群體中的性能差異。 -* **數據分析**。了解數據分佈並識別數據中可能導致公平性、包容性和可靠性問題的潛在偏見。 -* **模型可解釋性**。了解影響或影響模型預測的因素。這有助於解釋模型的行為,這對於透明性和責任感至關重要。 +如同除錯軟體應用程序,AI 系統除錯是識別及解決系統問題的必要過程。多種因素會影響模型表現不符合預期或負責任。大多數傳統模型性能指標是模型表現的量化彙總,無法充分分析模型如何違反負責任 AI 原則。此外,機器學習模型是黑盒,難以理解驅動結果的原因或當出錯時解釋原因。本課程稍後我們將學習如何使用負責任 AI 儀表板協助除錯 AI 系統。該儀表板為資料科學家和 AI 開發者提供全面工具,以進行: + +* 錯誤分析。識別模型錯誤分佈,可能影響系統公平性或可靠性。 +* 模型總覽。發現不同資料群體中模型表現差異。 +* 資料分析。了解資料分布並辨識可能導致公平性、包容性和可靠性問題的偏見。 +* 模型可解釋性。了解影響模型預測的因素,協助解釋模型行為,對透明度和責任制很重要。 -## 🚀 挑戰 -為了防止傷害的產生,我們應該: +## 🚀 挑戰 + +為避免傷害的產生,我們應: -- 確保參與系統工作的團隊成員具有多樣化的背景和觀點 -- 投資於反映我們社會多樣性的數據集 -- 在機器學習生命周期中開發更好的方法來檢測和糾正負責任人工智能問題 +- 團隊成員背景與觀點多元化 +- 投資反映社會多樣性的資料集 +- 在整個機器學習生命週期內,開發更佳方法檢測並糾正責任 AI 相關問題 -思考一些現實生活中的場景,這些場景中模型的不可信性在模型構建和使用中顯而易見。我們還應該考慮什麼? +思考現實情境中模型不可靠的具體表現及其帶來的影響。我們還應考慮什麼? ## [課後測驗](https://ff-quizzes.netlify.app/en/ml/) ## 回顧與自學 + -在這節課中,你已經學習了機器學習中公平性和不公平性概念的一些基礎知識。 -觀看這個工作坊以深入了解相關主題: +在本課程中,您已經學習了一些機器學習中公平與不公平概念的基礎知識。 + +觀看此工作坊以深入了解這些主題: -- 追求負責任的人工智能:將原則付諸實踐,由 Besmira Nushi、Mehrnoosh Sameki 和 Amit Sharma 主講 +- 追求負責任的 AI:將原則付諸實踐,講者 Besmira Nushi、Mehrnoosh Sameki 和 Amit Sharma -[![負責任的人工智能工具箱:建立負責任人工智能的開源框架](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: 建立負責任人工智能的開源框架") +[![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: 建立負責任人工智能的開源框架,由 Besmira Nushi、Mehrnoosh Sameki 和 Amit Sharma 主講 +> 🎥 點擊上方圖片觀看影片:RAI Toolbox:一個用於構建負責任 AI 的開源框架,講者 Besmira Nushi、Mehrnoosh Sameki 與 Amit Sharma -此外,閱讀以下資源: +另外,請閱讀: -- 微軟的負責任人工智能資源中心:[負責任人工智能資源 – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) +- 微軟的 RAI 資源中心:[Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) -- 微軟的 FATE 研究小組:[FATE:人工智能中的公平性、問責性、透明性和倫理 - Microsoft Research](https://www.microsoft.com/research/theme/fate/) +- 微軟的 FATE 研究組:[FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) -RAI 工具箱: +RAI Toolbox: -- [負責任人工智能工具箱 GitHub 儲存庫](https://github.com/microsoft/responsible-ai-toolbox) +- [Responsible AI Toolbox GitHub repository](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 工具箱](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/zh-HK/2-Regression/1-Tools/README.md b/translations/zh-HK/2-Regression/1-Tools/README.md index 2024b8807..698842726 100644 --- a/translations/zh-HK/2-Regression/1-Tools/README.md +++ b/translations/zh-HK/2-Regression/1-Tools/README.md @@ -1,120 +1,121 @@ -# 使用 Python 和 Scikit-learn 建立回歸模型 +# 使用 Python 和 Scikit-learn 開始迴歸模型之旅 -![回歸模型的手繪筆記摘要](../../../../sketchnotes/ml-regression.png) +![迴歸總結手繪筆記](../../../../translated_images/zh-HK/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) +> ### [這堂課也有 R 語言版本!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) -## 簡介 +## 介紹 -在這四節課中,你將學習如何建立回歸模型。我們稍後會討論這些模型的用途。但在開始之前,請確保你已經準備好合適的工具來進行這個過程! +在這四堂課中,你將學習如何建立迴歸模型。我們很快會討論這些模型的用途。但在做任何事之前,先確保你已經準備好合適的工具來開展流程! -在本課程中,你將學到如何: +在這堂課,你將學習如何: -- 配置你的電腦以進行本地機器學習任務。 -- 使用 Jupyter notebooks。 -- 安裝並使用 Scikit-learn。 -- 通過實際操作探索線性回歸。 +- 配置你的電腦進行本地機器學習任務。 +- 使用 Jupyter 筆記本。 +- 使用 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 編碼包](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/)。在本課程中,你將在 Visual Studio Code 中使用 Python,因此建議熟悉如何為 Python 開發 [配置 Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott)。 +2. **安裝 Visual Studio Code**。確保你的電腦已安裝 Visual Studio Code。遵循此說明[安裝 Visual Studio Code](https://code.visualstudio.com/)完成基礎安裝。因為你會在這課程中使用 Python,所以建議熟悉如何[為 Python 開發設定 Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott)。 - > 透過這個 [學習模組集合](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) 來熟悉 Python。 + > 透過一系列 [Learn 模組](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott)熟悉 Python。 > - > [![使用 Visual Studio Code 配置 Python](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "使用 Visual Studio Code 配置 Python") + > [![使用 Visual Studio Code 設定 Python](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "使用 Visual Studio Code 設定 Python") > - > 🎥 點擊上方圖片觀看影片:在 VS Code 中使用 Python。 + > 🎥 點擊上方圖片觀看如何在 VS Code 裡使用 Python 的教學影片。 -3. **安裝 Scikit-learn**,按照 [這些指引](https://scikit-learn.org/stable/install.html) 進行安裝。由於需要使用 Python 3,建議使用虛擬環境。如果你使用的是 M1 Mac,請參考上述頁面中的特別指引。 +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/)。 ## 你的機器學習開發環境 -你將使用 **notebooks** 來開發 Python 程式碼並建立機器學習模型。這種文件格式是數據科學家常用的工具,其文件副檔名為 `.ipynb`。 +你將使用 筆記本 來編寫 Python 程式碼和建立機器學習模型。這類文件是數據科學家常用工具,可以透過副檔名 `.ipynb` 識別。 -Notebooks 是一種互動式環境,允許開發者撰寫程式碼並添加註解或文件,這對於實驗性或研究導向的項目非常有幫助。 +筆記本是互動環境,開發者可同時撰寫程式碼、添加註解與文件,非常適合實驗或研究型項目。 -[![機器學習初學者 - 配置 Jupyter Notebooks 開始建立回歸模型](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "機器學習初學者 - 配置 Jupyter Notebooks 開始建立回歸模型") +[![為初學者準備的 ML - 設置 Jupyter 筆記本開始建立迴歸模型](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "為初學者準備的 ML - 設置 Jupyter 筆記本開始建立迴歸模型") -> 🎥 點擊上方圖片觀看一段短片,了解如何進行此操作。 +> 🎥 點擊上方圖片觀看此練習的教學短片。 -### 練習 - 使用 Notebook +### 練習 - 使用筆記本 -在此資料夾中,你會找到檔案 _notebook.ipynb_。 +在此資料夾中,你會找到 _notebook.ipynb_ 檔案。 1. 在 Visual Studio Code 中打開 _notebook.ipynb_。 - Jupyter 伺服器將啟動,並使用 Python 3+。你會看到 Notebook 中可以執行的程式碼區塊。點擊類似播放按鈕的圖標即可執行程式碼區塊。 + Jupyter 服務會以 Python 3+ 启动。你會看到筆記本中可 `執行` 的程式碼區塊。點擊類似播放按鈕的圖示即可執行區塊。 -2. 選擇 `md` 圖標,添加一些 Markdown,並輸入以下文字:**# Welcome to your notebook**。 +1. 選擇 `md` 圖標並添加一些 markdown,寫入以下文字 **# 歡迎使用你的筆記本**。 - 接著,添加一些 Python 程式碼。 + 接著,加入一些 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 中開啟的筆記本](../../../../translated_images/zh-HK/notebook.4a3ee31f396b8832.webp) -你可以在程式碼中穿插註解,為 Notebook 添加自我文件化的功能。 +你可以在程式碼中夾帶註解,讓筆記本自我文件化。 -✅ 想一想,網頁開發者的工作環境與數據科學家的工作環境有何不同。 +✅ 花點時間想想,網頁開發者的工作環境與數據科學家的工作環境有多不同。 -## 開始使用 Scikit-learn +## 使用 Scikit-learn 快速起步 -現在你的本地環境已經配置好 Python,並且你對 Jupyter Notebooks 感到熟悉,接下來讓我們熟悉一下 Scikit-learn(發音為 `sci`,如 `science`)。Scikit-learn 提供了一個[廣泛的 API](https://scikit-learn.org/stable/modules/classes.html#api-ref),幫助你執行機器學習任務。 +現在你的本地環境已安裝好 Python,且熟悉 Jupyter 筆記本,接下來讓我們來熟悉 Scikit-learn(發音為「sci」就像「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 和其他工具,建立所謂「傳統機器學習」的模型。我們有意避開神經網絡與深度學習,這些會在即將推出的「初學者 AI」課程中深入介紹。 -Scikit-learn 使得建立模型並評估其使用變得簡單。它主要專注於處理數值數據,並包含多個現成的數據集作為學習工具。它還提供了預建模型供學生嘗試。接下來,我們將探索如何加載預打包數據並使用內建的估算器來建立第一個機器學習模型。 +Scikit-learn 讓建立與評估模型變得簡單方便。它主要聚焦於使用數值資料,並內建多個現成數據集作學習範例,也包含已建好的模型供學生嘗試。讓我們先探索如何載入內建數據,使用 Scikit-learn 的預建估計器建立第一個機器學習模型,並分析簡單的數據。 -## 練習 - 你的第一個 Scikit-learn Notebook +## 練習 - 你的第一個 Scikit-learn 筆記本 -> 本教程靈感來自 Scikit-learn 網站上的 [線性回歸範例](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py)。 +> 本教程靈感來自 Scikit-learn 網站上的[線性迴歸範例](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py)。 -[![機器學習初學者 - 在 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 內建一個關於糖尿病的小型數據集。假設你想測試某項糖尿病病患的治療方法。機器學習模型可幫助你依據變數組合判斷哪些病患的反應會較佳。即使是非常基礎的迴歸模型,當視覺化後,也可揭露變數間的信息,幫你規劃理論臨床試驗。 -讓我們開始這個任務。 +✅ 有許多類型的迴歸方法,不同方法適合解決不同問題。若你想預測特定年齡的身高,會用線性迴歸,因為你尋求的是數值結果;若你想判定一道菜是否屬於素食料理,則是分類問題,會用邏輯迴歸。稍後你將學習邏輯迴歸。花點時間思考可向資料提出的問題,以及哪種方法更合適。 -### 導入庫 +現在開始著手這項任務。 -在這個任務中,我們將導入一些庫: +### 引入程式庫 -- **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) 庫。 +這項任務會用到以下一些程式庫: -導入一些幫助完成任務的庫。 +- **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. 輸入以下程式碼以添加導入: +引入所需的程式庫協助完成任務。 + +1. 輸入以下代碼以加入引用: ```python import matplotlib.pyplot as plt @@ -122,26 +123,26 @@ Scikit-learn 使得建立模型並評估其使用變得簡單。它主要專注 from sklearn import datasets, linear_model, model_selection ``` - 上述程式碼中,你導入了 `matplotlib` 和 `numpy`,並從 `sklearn` 中導入了 `datasets`、`linear_model` 和 `model_selection`。`model_selection` 用於將數據分割為訓練集和測試集。 + 你以上引用了 `matplotlib`、`numpy`,還從 `sklearn` 引入了 `datasets`、`linear_model` 和 `model_selection`。`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:T 細胞(白血球的一種類型) +- 年齡:years +- 體重指數 (bmi) +- 血壓平均值 (bp) +- s1 tc:T 細胞(一種白血球) -✅ 此數據集包含「性別」作為研究糖尿病的重要特徵變量。許多醫學數據集都包含這種類型的二元分類。想一想,這樣的分類可能如何將某些群體排除在治療之外。 +✅ 此資料集將「性別」視為一項重要特徵變數,醫學資料中常包含此類二元分類。思考一下這種分類方式可能導致部分族群因特徵被排除於療法之外。 -現在,載入 X 和 y 數據。 +現在載入資料矩陣 X 和目標 y。 -> 🎓 記住,這是監督式學習,我們需要一個名為 'y' 的目標變量。 +> 🎓 請記得,這是監督式學習,需要一個命名為 y 的目標變量。 -在新的程式碼區塊中,通過調用 `load_diabetes()` 載入糖尿病數據集。輸入參數 `return_X_y=True` 表示 `X` 將是數據矩陣,而 `y` 將是回歸目標。 +在新程式碼區塊中,透過呼叫 `load_diabetes()` 載入糖尿病資料集。參數 `return_X_y=True` 表示回傳的 X 是資料矩陣,y 是迴歸目標。 -1. 添加一些打印命令以顯示數據矩陣的形狀及其第一個元素: +1. 加入 print 指令以顯示資料矩陣形狀與第一筆資料: ```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,39 +160,39 @@ 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. 接下來,選擇數據集的一部分進行繪圖,選擇數據集的第 3 列。你可以使用 `:` 運算符選擇所有行,然後使用索引(2)選擇第 3 列。你還可以使用 `reshape(n_rows, n_columns)` 將數據重塑為 2D 數組(繪圖所需)。如果其中一個參數為 -1,則對應的維度會自動計算。 +2. 接著選取此資料集中的一部份畫圖,方法是選取第 3 欄數據。你可以使用 `:` 選擇所有列,再用索引 (2) 選擇第 3 欄。為符合繪圖需求,可以用 `reshape(n_rows, n_columns)` 將資料重新塑形。當一個參數為 -1 時,該維度大小會自動計算。 ```python X = X[:, 2] X = X.reshape((-1,1)) ``` - ✅ 隨時打印數據以檢查其形狀。 + ✅ 需要時隨時列印資料檢查其形狀。 -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. 現在你可以訓練模型了!加載線性回歸模型,並使用 `model.fit()` 訓練 X 和 y 訓練集: +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 是非常有用的工具。繪製所有 X 與 y 測試資料的散點圖,並利用預測結果畫出最合適的分界線,顯示模型資料分組。 ```python plt.scatter(X_test, y_test, color='black') @@ -202,29 +203,32 @@ Scikit-learn 使得建立模型並評估其使用變得簡單。它主要專注 plt.show() ``` - ![顯示糖尿病數據點的散點圖](../../../../2-Regression/1-Tools/images/scatterplot.png) -✅ 想一想這裡發生了什麼。一條直線穿過了許多小數據點,但它究竟在做什麼?你能否看出應該如何利用這條直線來預測一個新的、未見過的數據點應該在圖表的 y 軸上對應的位置?試著用語言描述這個模型的實際用途。 + ![展示糖尿病資料點的散點圖](../../../../translated_images/zh-HK/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/zh-HK/2-Regression/2-Data/README.md b/translations/zh-HK/2-Regression/2-Data/README.md index c87eaa669..1be3eebee 100644 --- a/translations/zh-HK/2-Regression/2-Data/README.md +++ b/translations/zh-HK/2-Regression/2-Data/README.md @@ -1,62 +1,62 @@ -# 使用 Scikit-learn 建立回歸模型:準備及視覺化數據 +# 使用 Scikit-learn 建立迴歸模型:準備與視覺化數據 -![數據視覺化資訊圖表](../../../../2-Regression/2-Data/images/data-visualization.png) +![數據視覺化資訊圖表](../../../../translated_images/zh-HK/data-visualization.54e56dded7c1a804.webp) -資訊圖表由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 製作 +資訊圖由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 製作 ## [課前測驗](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 開始建立機器學習模型,接下來可以開始向數據提出問題。在處理數據並應用機器學習解決方案時,了解如何提出正確的問題以充分發揮數據的潛力是非常重要的。 +現在你已經準備好所需工具,可以開始使用 Scikit-learn 進行機器學習模型的建立,準備好向你的數據提問。當你處理數據並應用機器學習解決方案時,非常重要的是要了解如何提出正確的問題,才能恰當地發掘數據集的潛力。 -在本課程中,你將學到: +在本課程中,你將學習: -- 如何為模型建立準備數據。 +- 如何準備數據以建立模型。 - 如何使用 Matplotlib 進行數據視覺化。 +- 如何使用 Seaborn 進行更具表現力的數據視覺化。 ## 向數據提出正確的問題 -你需要回答的問題將決定你使用哪種類型的機器學習算法。而你得到答案的質量將很大程度上取決於數據的性質。 +你需要回答的問題將決定你會使用哪種類型的機器學習算法。你得到的答案品質,也會很大程度取決於你的數據本質。 -看看本課程提供的[數據](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv)。你可以在 VS Code 中打開這個 .csv 文件。快速瀏覽後可以看到有空白值以及字符串和數字數據的混合。還有一個奇怪的名為 "Package" 的列,其中的數據混合了 "sacks"、"bins" 和其他值。事實上,這些數據有點混亂。 +看看這課程提供的 [數據](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv),你可以在 VS Code 中打開這個 .csv 檔案。快速瀏覽會立即發現有空白欄位和字串與數字的混合資料。還有一個奇怪的欄位叫「Package」,裡面混合了「sacks」、「bins」和其他值。事實上,資料狀況有點混亂。 -[![機器學習初學者 - 如何分析和清理數據集](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "機器學習初學者 - 如何分析和清理數據集") +[![機器學習入門 - 如何分析與清理資料集](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "機器學習入門 - 如何分析與清理資料集") -> 🎥 點擊上方圖片觀看一段短片,了解如何準備本課程的數據。 +> 🎥 點擊上圖觀看本課程準備數據的短片教學。 -事實上,很少能直接獲得完全準備好的數據集來建立機器學習模型。在本課程中,你將學習如何使用標準 Python 庫準備原始數據集。你還將學習各種視覺化數據的技術。 +事實上,很少會拿到一個完全準備好可直接用來建立機器學習模型的數據集。在本課中,你將學習如何使用標準 Python 函式庫來準備原始數據集,同時學習多種數據視覺化技巧。 -## 案例研究:'南瓜市場' +## 個案研究:「南瓜市場」 -在此文件夾中,你會在根目錄的 `data` 文件夾中找到一個名為 [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) 的 .csv 文件,其中包含 1757 行有關南瓜市場的數據,按城市分組。這是從美國農業部發布的[特殊作物終端市場標準報告](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice)中提取的原始數據。 +在此資料夾的根目錄 `data` 裡,有一個名為 [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) 的 .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 數據分析」)這個非常適合整理數據的工具,來分析並準備這份南瓜數據。 -### 首先,檢查是否有缺失日期 +### 首先,檢查缺少日期 -你需要首先檢查是否有缺失日期: +你需要先進行以下步驟檢查缺少的日期: -1. 將日期轉換為月份格式(這些是美國日期,格式為 `MM/DD/YYYY`)。 -2. 提取月份到新列。 +1. 將日期轉為月份格式(這裡為美式日期格式,`MM/DD/YYYY`)。 +2. 將月份擷取到一個新欄位。 -在 Visual Studio Code 中打開 _notebook.ipynb_ 文件,並將電子表格導入到新的 Pandas dataframe 中。 +在 Visual Studio Code 中開啟 _notebook.ipynb_ 檔案,並將試算表匯入新的 Pandas 資料框架(dataframe)。 -1. 使用 `head()` 函數查看前五行。 +1. 使用 `head()` 函式查看前五行數據。 ```python import pandas as pd @@ -64,30 +64,30 @@ pumpkins.head() ``` - ✅ 你會使用什麼函數來查看最後五行? + ✅ 你會用什麼函式來查看最後五行? -1. 檢查當前 dataframe 中是否有缺失數據: +1. 檢查目前 dataframe 中是否有遺失資料: ```python pumpkins.isnull().sum() ``` - 有缺失數據,但可能對當前任務影響不大。 + 有遺失資料,但可能對當前任務影響不大。 -1. 為了使 dataframe 更易於操作,使用 `loc` 函數選擇你需要的列。`loc` 函數從原始 dataframe 中提取一組行(作為第一個參數)和列(作為第二個參數)。以下表達式中的 `:` 表示 "所有行"。 +1. 為使 dataframe 更方便操作,使用 `loc` 函式選擇你需要的欄位。此函式從原 dataframe 中擷取列(第一個參數)與欄(第二個參數)。範例中 `:` 表示「所有列」。 ```python columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.loc[:, columns_to_select] ``` -### 第二步,確定南瓜的平均價格 +### 第二步,計算南瓜平均價格 -思考如何確定某個月份南瓜的平均價格。你會選擇哪些列來完成這項任務?提示:你需要 3 列。 +思考如何求得某月南瓜的平均價格。你會選哪些欄位?提示:需要 3 個欄位。 -解決方案:取 `Low Price` 和 `High Price` 列的平均值來填充新的 Price 列,並將 Date 列轉換為僅顯示月份。幸運的是,根據上述檢查,日期和價格沒有缺失數據。 +解法:將 `Low Price` 與 `High Price` 欄位取平均,填入新的 Price 欄;同時將日期欄位轉換為月份。幸運的是,前面檢查結果顯示日期與價格欄無遺失資料。 -1. 要計算平均值,添加以下代碼: +1. 計算平均價格,添加以下程式碼: ```python price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 @@ -96,37 +96,37 @@ ``` - ✅ 隨時使用 `print(month)` 打印任何數據以進行檢查。 + ✅ 如果想確認數據,可以用 `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"。南瓜似乎很難一致地稱重,因此讓我們通過選擇 `Package` 列中包含字符串 "bushel" 的南瓜來進行篩選。 +深入看原始數據,`Unit of Sale` 欄為 'EACH' 或 'PER BIN' 的記錄裡,`Package` 欄的值往往是按英寸、箱或「個」數量記錄。南瓜很難秤重一致,因此我們先只挑選 `Package` 欄包含「bushel」字串的南瓜篩選出來。 -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. 在建立 new_pumpkins dataframe 之後添加這段程式碼: ```python new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) @@ -134,38 +134,38 @@ 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 的小南瓜數量更多,而大南瓜的空心部分佔用了更多空間。 +✅ 你注意到按半公頃桶賣的南瓜非常貴嗎?能猜出原因嗎?提示:小南瓜比大南瓜每公頃桶貴許多,可能是因為小南瓜數量多,大南瓜佔據了許多未利用的空間。 ## 視覺化策略 -數據科學家的部分角色是展示他們正在處理的數據的質量和性質。為此,他們通常會創建有趣的視覺化,例如圖表、折線圖和柱狀圖,展示數據的不同方面。通過這種方式,他們能夠以視覺方式展示關係和差距,這些通常很難發現。 +資料科學家的部分工作,是展示所處理資料的品質與狀況。他們常利用有趣的視覺化圖像、圖表和曲線圖,呈現資料的不同面向。如此就可以直觀地顯示資料之間的關係與空白,這些往往是難以直接察覺的。 -[![機器學習初學者 - 如何使用 Matplotlib 視覺化數據](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "機器學習初學者 - 如何使用 Matplotlib 視覺化數據") +[![機器學習入門 - 如何用 Matplotlib 視覺化數據](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "機器學習入門 - 如何用 Matplotlib 視覺化數據") -> 🎥 點擊上方圖片觀看一段短片,了解如何視覺化本課程的數據。 +> 🎥 點擊上圖觀看本課程數據視覺化的短片教學。 -視覺化還可以幫助確定最適合數據的機器學習技術。例如,似乎遵循一條線的散點圖表明該數據非常適合線性回歸練習。 +視覺化也有助於判斷哪種機器學習技術最適合該數據。例如,散佈圖若呈線狀分布,代表資料適合進行線性迴歸。 -一個在 Jupyter notebooks 中表現良好的數據視覺化庫是 [Matplotlib](https://matplotlib.org/)(你在上一課中也見過)。 +Jupyter notebook 中常用的數據視覺化函式庫之一是 [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 +## 練習 - 嘗試 Matplotlib -嘗試創建一些基本的圖表來顯示你剛剛創建的新 dataframe。一個基本的折線圖會顯示什麼? +嘗試創建一些基本圖表來顯示你新建立的 dataframe。基本的線形圖會顯示什麼? -1. 在文件頂部的 Pandas 導入下導入 Matplotlib: +1. 在檔案開頭,Pandas 匯入後,匯入 Matplotlib: ```python import matplotlib.pyplot as plt ``` -1. 重新運行整個 notebook 以刷新。 -1. 在 notebook 底部添加一個單元格,將數據繪製為框圖: +1. 重新運行整個 notebook 以刷新數據。 +1. 在 notebook 底部新增一個儲存格,繪製箱型圖: ```python price = new_pumpkins.Price @@ -174,38 +174,113 @@ plt.show() ``` - ![一個顯示價格與月份關係的散點圖](../../../../2-Regression/2-Data/images/scatterplot.png) + ![顯示價格與月份關係的散佈圖](../../../../translated_images/zh-HK/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/zh-HK/barchart.a833ea9194346d76.webp) + + 這是較有用的視覺化!它顯示南瓜價格九月、十月最高。你的預期符合嗎?為什麼? + +## 練習 - 嘗試 Seaborn + +Matplotlib 功能強大,但生成精美圖表可能需寫較多代碼。[Seaborn](https://seaborn.pydata.org/) 是建立在 Matplotlib 之上的函式庫,專為統計數據視覺化設計。它直接配合 Pandas dataframe,提供美觀預設樣式,且能用較少代碼創建資訊豐富的圖表。因為 Seaborn 傳回 Matplotlib 物件,你仍可用已有的 Matplotlib 經驗微調結果。 + +> 如果你還沒有安裝 Seaborn,請用 `pip install seaborn` 安裝。 + +1. 在 notebook 頂部其他匯入後加入 Seaborn 匯入,習慣用別名 `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/zh-HK/relplot.a03837d8f0329cec.webp) + + 注意你只傳入 _欄位名稱_ 和 dataframe,Seaborn 能自動處理軸標籤。 + +2. 可以傳入 `kind="line"` 參數切換成線圖。Seaborn 還會畫出反映線周置信區間的藍色陰影帶: + + ```python + sns.relplot(x="Price", y="Month", kind="line", data=new_pumpkins) + ``` + + ![Seaborn 線圖顯示價格與月份關係](../../../../translated_images/zh-HK/lineplot.f9034ba47b1e30ee.webp) + + 該數據較嘈雜,線圖不算最清楚,但示範了如何輕鬆切換 Seaborn 的圖表種類。 + +### 長條圖顯示分布 + + +早前你親手將數據分組,以 Matplotlib 創建條形圖。Seaborn 的 [`catplot()`](https://seaborn.pydata.org/generated/seaborn.catplot.html)(類別圖)可以為你進行分組和聚合。預設情況下,`kind="bar"` 顯示每個類別的平均值,並帶有一條黑線標示信賴區間。 + +1. 創建每月平均價格的條形圖: + + ```python + sns.catplot(x="Month", y="Price", data=new_pumpkins, kind="bar") + ``` + + ![顯示每月價格分布的 Seaborn 條形圖](../../../../translated_images/zh-HK/catplot.e73fc35fdf96242b.webp) + + 這證實了你用 Matplotlib 看到的情況 — 價格在九月和十月達到高峰 — 但 Seaborn 亦可視化每個月份內價格的 _變異_ 程度。 + +### 顯示相關性的熱力圖 + +散點圖一次比較兩個變量。當你有多個數值欄時,[熱力圖](https://en.wikipedia.org/wiki/Heat_map) 能讓你一口氣觀察 _所有_ 欄位對的關係強度。這是選擇用於模型輸入的特徵前,一種常見的識別最相關欄位的方法(而同一類型的圖表稍後會用於顯示分類的混淆矩陣)。 + +1. 用 Pandas 建立相關矩陣,然後用 Seaborn 的 [`heatmap()`](https://seaborn.pydata.org/generated/seaborn.heatmap.html) 畫出來。`annot=True` 選項會在每個格子裡顯示相關係數: + + ```python + correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr() + sns.heatmap(correlations, annot=True, cmap="coolwarm") + ``` + + ![顯示數值欄位間相關性的 Seaborn 熱力圖](../../../../translated_images/zh-HK/heatmap.bd98dce43b404c57.webp) + + 接近 `1`(或 `-1`)的值意味著欄位間具有強烈的 _線性_ 相關性。注意 `Low Price` 和 `High Price` 幾乎完全相關。另一方面,`Month` 與價格的線性相關性很弱 — 儘管上面的條形圖展現了九月和十月明顯的季節高峰。這是一個重要的教訓:相關係數只衡量 _直線_ 關係,因此可能忽略季節性或其它非線性模式。✅ 為什麼在決定使用哪些欄位前,既看熱力圖 看像條形圖這樣的圖表很有用? + +### Matplotlib 還是 Seaborn? + +兩個庫都值得了解: + +- **Matplotlib** 讓你精細控制圖表的每個元素,是幾乎所有其他 Python 繪圖庫的基礎。 +- **Seaborn** 提供更高階的函數和吸引人的預設統計圖表樣式,直接支持資料框,且在探索性資料分析時通常更快。 - 這是一個更有用的數據視覺化!它似乎表明南瓜的最高價格出現在九月和十月。這符合你的預期嗎?為什麼? +常見工作流程是先用 Seaborn 快速探索數據,再在需要自訂細節時退回 Matplotlib。 --- ## 🚀挑戰 -探索 Matplotlib 提供的不同類型的視覺化。哪些類型最適合回歸問題? +探索 Matplotlib 和 Seaborn 提供的不同視覺化類型。哪些類型最適合迴歸問題? -## [課後測驗](https://ff-quizzes.netlify.app/en/ml/) +## [課後小測驗](https://ff-quizzes.netlify.app/en/ml/) -## 回顧與自學 +## 複習與自學 -看看數據視覺化的多種方式。列出可用的各種庫,並記下哪些庫最適合特定類型的任務,例如 2D 視覺化與 3D 視覺化。你發現了什麼? +查看多種資料視覺化方式。列出可用的各種庫,並註明哪些最適合特定任務,如 2D 視覺化與 3D 視覺化。你發現了什麼? ## 作業 @@ -213,5 +288,7 @@ --- -**免責聲明**: -本文件已使用人工智能翻譯服務 [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/zh-HK/2-Regression/2-Data/solution/notebook.ipynb b/translations/zh-HK/2-Regression/2-Data/solution/notebook.ipynb index 911ede54a..5690df7c8 100644 --- a/translations/zh-HK/2-Regression/2-Data/solution/notebook.ipynb +++ b/translations/zh-HK/2-Regression/2-Data/solution/notebook.ipynb @@ -3,7 +3,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "## 南瓜線性回歸 - 課程 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": [ + "## 使用 Seaborn 進行視覺化\n", + "\n", + "[Seaborn](https://seaborn.pydata.org/) 是建立在 Matplotlib 之上並可直接與資料框架合作,使得使用極少程式碼快速製作吸引人的統計圖表成為可能。\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": [] + "source": [ + "sns.catplot(x=\"Month\", y=\"Price\", data=new_pumpkins, kind=\"bar\")" + ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**免責聲明**: \n本文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於重要資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。\n" + "### 熱力圖顯示相關性\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**免責聲明**:\n本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。\n\n" ] } ], @@ -424,13 +487,7 @@ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" } }, - "orig_nbformat": 2, - "coopTranslator": { - "original_hash": "95726f0b8283628d5356a4f8eb8b4b76", - "translation_date": "2025-09-03T19:45:04+00:00", - "source_file": "2-Regression/2-Data/solution/notebook.ipynb", - "language_code": "hk" - } + "orig_nbformat": 2 }, "nbformat": 4, "nbformat_minor": 2 diff --git a/translations/zh-HK/8-Reinforcement/1-QLearning/README.md b/translations/zh-HK/8-Reinforcement/1-QLearning/README.md index cf0b00933..500a4cb3e 100644 --- a/translations/zh-HK/8-Reinforcement/1-QLearning/README.md +++ b/translations/zh-HK/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/zh-HK/ml-reinforcement.94024374d63348db.webp) +> 手繪筆記由 [Tomomi Imura](https://www.twitter.com/girlie_mac) 製作 -強化學習涉及三個重要概念:代理(agent)、一些狀態(states)以及每個狀態的一組行動(actions)。通過在指定狀態下執行某個行動,代理會獲得一個獎勵。想像一下電腦遊戲《超級瑪利歐》。你是瑪利歐,處於遊戲關卡中,站在懸崖邊上。你的上方有一枚硬幣。你作為瑪利歐,處於遊戲關卡中的特定位置……這就是你的狀態。向右移動一步(行動)會讓你掉下懸崖,這會給你一個低的數值分數。然而,按下跳躍按鈕可以讓你得分並保持存活。這是一個正面的結果,應該給你一個正的數值分數。 +強化學習包含三個重要概念:代理人、一些狀態,以及每個狀態的動作集。通過在指定的狀態執行一個動作,代理人會獲得獎勵。再次想像電腦遊戲超級瑪利歐。你是瑪利歐,你在遊戲關卡中,站在懸崖邊緣。你上面有一個金幣。你作為瑪利歐,在遊戲關卡中,處於一個特定位置...這就是你的狀態。向右邁一步(一個動作)會讓你掉下懸崖,這會給你一個較低的分數。然而,按跳躍按鈕會讓你得分並存活。那是正面結果,應該給你一個正數分數。 -通過使用強化學習和模擬器(遊戲),你可以學習如何玩遊戲以最大化獎勵,即保持存活並盡可能多地得分。 +使用強化學習和模擬器(遊戲),你可以學會如何玩這款遊戲,最大化獎勵,即保持存活並盡可能得分。 -[![強化學習簡介](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) -> 🎥 點擊上方圖片觀看 Dmitry 討論強化學習 +> 🎥 點擊上圖聽Dmitry討論強化學習 -## [課前測驗](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)** 的世界,靈感來自俄羅斯作曲家 [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev) 的音樂童話。我們將使用 **強化學習** 讓彼得探索他的環境,收集美味的蘋果並避免遇到狼。 +本課將探討受俄羅斯作曲家[謝爾蓋·普羅科菲耶夫](https://en.wikipedia.org/wiki/Sergei_Prokofiev)的音樂童話故事[彼得與狼](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)啟發的世界。我們將使用強化學習讓彼得探索環境,收集美味蘋果,並避免遇見狼。 -**強化學習**(RL)是一種學習技術,通過多次實驗讓我們學習代理在某個**環境**中的最佳行為。代理在這個環境中應該有某些**目標**,由**獎勵函數**定義。 +強化學習(RL)是一種學習技術,允許我們通過多次實驗學習一個代理人在某個環境中的最佳行為。代理人在此環境中應有某個由獎勵函數定義的目標。 ## 環境 -為了簡化,我們將彼得的世界視為一個大小為 `width` x `height` 的方形棋盤,如下所示: +為簡化起見,將彼得的世界視為一個 `width` x `height` 的方格棋盤,如下所示: -![彼得的環境](../../../../8-Reinforcement/1-QLearning/images/environment.png) +![彼得的環境](../../../../translated_images/zh-HK/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()) } ``` -總結一下,此場景的策略和目標如下: +總結而言,此情境的策略和目標如下: -- **策略**:代理(彼得)的策略由所謂的**策略函數**(policy)定義。策略函數在任何給定狀態下返回行動。在我們的例子中,問題的狀態由棋盤表示,包括玩家的當前位置。 +- 策略,我們的代理人(彼得)由所謂的策略(policy)定義。策略是一個函數,對任一狀態給予所採取的動作。在此例中,問題的狀態由棋盤的整體情況表示,包括玩家當前位置。 -- **目標**:強化學習的目標是最終學習一個良好的策略,能夠高效地解決問題。然而,作為基準,我們先考慮最簡單的策略,稱為**隨機行走**。 +- 目標,強化學習的目標是最終學習出一套好的策略,使得問題能有效解決。然而,作為基線,讓我們考慮最簡單的策略,稱為隨機漫步。 -## 隨機行走 +## 隨機漫步 -首先,我們通過實現隨機行走策略來解決問題。在隨機行走中,我們將從允許的行動中隨機選擇下一步,直到到達蘋果(代碼塊 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. 執行walk實驗若干次(例如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,52 +154,175 @@ def reward(m,pos=None): return move_reward ``` -獎勵函數的一個有趣之處在於,大多數情況下,*只有在遊戲結束時才會給予實質性獎勵*。這意味著我們的算法應該以某種方式記住導致正面獎勵的“好”步驟,並增加它們的重要性。同樣,所有導致不良結果的移動應該被抑制。 +獎勵函數的一個有趣特點是,在大多數情況下,我們只在遊戲結束時得到重要獎勵。這意味著演算法應記住那些導致最終正面獎勵的“好”步驟,並增強它們的重要性。相似地,所有導致負面結果的動作應該被抑制。 -## Q-Learning +## Q學習 -我們將討論的算法稱為 **Q-Learning**。在此算法中,策略由一個函數(或數據結構)定義,稱為 **Q-Table**。它記錄了在給定狀態下每個行動的“好壞程度”。 +我們將討論的演算法叫做Q學習。在此演算法中,策略由一個名為Q表的函數(或資料結構)定義。它記錄給定狀態中每個動作的“好壞”。 -之所以稱為 Q-Table,是因為將其表示為表格或多維數組通常很方便。由於我們的棋盤尺寸為 `width` x `height`,我們可以使用形狀為 `width` x `height` x `len(actions)` 的 numpy 數組來表示 Q-Table:(代碼塊 6) +它叫Q表,是因為通常將其表示成表格或多維陣列比較方便。由於我們的棋盤尺寸為 `width` x `height`,我們可以用形狀為 `width` x `height` x `len(actions)` 的numpy陣列表示Q表:(代碼塊6) ```python Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) ``` -注意,我們將 Q-Table 的所有值初始化為相等值,在我們的例子中為 0.25。這對應於“隨機行走”策略,因為每個狀態中的所有移動都是同樣好的。我們可以將 Q-Table 傳遞給 `plot` 函數,以便在棋盤上可視化該表:`m.plot(Q)`。 +注意,我們用相同數值(此處為0.25)初始化Q表所有值。這代表“隨機漫步”策略,因為在每個狀態中所有動作的好壞相等。我們可以呼叫 `m.plot(Q)` 函數,視覺化棋盤上的Q表。 -![彼得的環境](../../../../8-Reinforcement/1-QLearning/images/env_init.png) +![彼得的環境](../../../../translated_images/zh-HK/env_init.04e8f26d2d60089e.webp) -在每個格子的中心有一個“箭頭”,指示移動的首選方向。由於所有方向都是相等的,因此顯示為一個點。 +在每個格子中央有個「箭頭」,顯示偏好的移動方向。由於所有方向相等,顯示為一個點。 -現在我們需要運行模擬,探索環境,並學習 Q-Table 值的更好分佈,這將使我們能夠更快地找到蘋果的路徑。 +現在我們需要運行模擬,探索環境,學習更佳的Q表分布,這將幫助我們更快找到蘋果的路徑。 -## Q-Learning 的核心:貝爾曼方程 +## Q學習的本質:貝爾曼方程 -一旦我們開始移動,每個行動都會有相應的獎勵,即我們理論上可以根據最高的即時獎勵選擇下一個行動。然而,在大多數狀態下,移動並不能實現我們到達蘋果的目標,因此我們無法立即決定哪個方向更好。 +一旦開始移動,每個動作會有對應的獎勵,即我們理論上可以根據最高即時獎勵選擇下一步動作。但在多數狀態下,移動不會立即達成找到蘋果的目標,因此我們不能立即判斷哪方向較好。 -> 記住,重要的不是即時結果,而是最終結果,即我們在模擬結束時獲得的結果。 +> 請記住,重要的不是立刻結果,而是我們在模擬結束時獲得的最終結果。 -為了考慮這種延遲獎勵,我們需要使用 **[動態規劃](https://en.wikipedia.org/wiki/Dynamic_programming)** 的原則,這使我們能夠以遞歸方式思考問題。 +為了解決這個延遲獎勵問題,我們需使用[動態規劃](https://en.wikipedia.org/wiki/Dynamic_programming)原理,使我們能對問題進行遞歸思考。 -假設我們現在處於狀態 *s*,並希望移動到下一個狀態 *s'*。通過這樣做,我們將獲得由獎勵函數定義的即時獎勵 *r(s,a)*,加上一些未來的獎勵。如果我們假設 Q-Table 正確反映了每個行動的“吸引力”,那麼在狀態 *s'* 我們將選擇對應於 *Q(s',a')* 最大值的行動 *a*。因此,我們在狀態 *s* 能夠獲得的最佳未來獎勵將由 `max` 定義。 +假設我們當前在狀態 *s*,想移動到下一狀態 *s'*。如此,我們將獲得即時獎勵 *r(s,a)*,由獎勵函數定義,加上一些未來獎勵。如果Q表已正確反映每個動作的「吸引力」,在狀態 *s'* 我們會選擇使值 *Q(s',a')* 最大的動作 *a'*。因此,在狀態 *s* 所能獲得的最佳未來獎勵定義為對所有可能動作 *a'* 的 `max`a'*Q(s',a')*。 -學習過程可以總結如下: +這便得到以貝爾曼公式計算狀態 *s*,行動 *a* 的Q表值: -- **平均路徑長度增加**。我們觀察到,起初平均路徑長度會增加。這可能是因為當我們對環境一無所知時,很容易陷入不良狀態,例如水或狼。隨著我們學到更多並開始利用這些知識,我們可以探索更久的環境,但仍然不太清楚蘋果的位置。 + -- **隨著學習的深入,路徑長度減少**。當我們學到足夠多時,代理更容易達成目標,路徑長度開始減少。然而,我們仍然保持探索的開放性,因此經常偏離最佳路徑,探索新的選項,導致路徑比最佳路徑更長。 +其中 γ 是所謂的折扣因子,決定你應偏好現有獎勵還是未來獎勵的程度。 -- **路徑長度突然增加**。我們在圖表中還觀察到某些時候路徑長度突然增加。這表明過程的隨機性,並且我們可能在某些時候通過覆寫新的值來“破壞”Q-Table的係數。理想情況下,這應該通過降低學習率來最小化(例如,在訓練的後期,我們僅以小幅度調整Q-Table的值)。 +## 學習演算法 -總體而言,重要的是要記住,學習過程的成功和質量在很大程度上取決於參數,例如學習率、學習率衰減和折扣因子。這些通常被稱為**超參數**,以區分於**參數**,後者是在訓練過程中優化的(例如Q-Table的係數)。尋找最佳超參數值的過程被稱為**超參數優化**,這是一個值得單獨討論的主題。 +根據上述公式,我們可寫出演算法偽碼: + +* 初始化Q表Q,狀態和行動均設相同數值 +* 設學習率α ← 1 +* 重複多次模擬 + 1. 從隨機位置開始 + 1. 重複 + 1. 在狀態s選擇動作a + 2. 執行動作,移至新狀態s' + 3. 若遇遊戲結束條件或總獎勵太低—結束模擬 + 4. 計算新狀態下的獎勵r + 5. 根據貝爾曼方程更新Q函數:*Q(s,a)* ← *(1-α)Q(s,a)+α(r+γ maxa'Q(s',a'))* + 6. *s* ← *s'* + 7. 更新總獎勵並減少α。 + +## 利用 vs 探索 + +在上面演算法中,未具體說明第2.1步如何選擇動作。如果我們隨機選擇動作,會隨機探索環境,也很可能經常死亡並探索不常去的區域。另一方式是利用已知Q表值,選擇在狀態s中Q值最高的動作,然而這可能阻礙我們探索其他狀態,因而可能無法找到最佳解。 + +因此,最佳方案是在探索與利用間取得平衡。可透過依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次實驗,稱為epochs:(代碼塊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) + +```python +def qpolicy_strict(m): + x,y = m.human + v = probs(Q[x,y]) + a = list(actions)[np.argmax(v)] + return a + +walk(m,qpolicy_strict) +``` + + +> 如果你多次嘗試上面的程式碼,你可能會注意到有時它會「停頓」,你需要按筆記本上的停止按鈕來中斷它。這是因為可能存在兩個狀態在最佳 Q 值方面「互相指向」的情況,導致代理無限地在這些狀態之間移動。 + +## 🚀挑戰 + +> **任務 1:** 修改 `walk` 函數,以限制路徑的最大長度(例如 100 步),並觀察上面的程式碼不時返回該值。 + +> **任務 2:** 修改 `walk` 函數使其不會返回之前已經去過的地方。這會防止 `walk` 產生迴圈,但代理仍然有可能被「困」在無法逃脫的位置。 + +## 導航 + +一個更好的導航策略是我們訓練時使用的策略,結合了利用和探索。在此策略中,我們將以與 Q 表中的值成比例的某個概率選擇每個動作。這種策略仍可能導致代理返回已探索過的位置,但如下面的程式碼所示,它能產生到目標位置非常短的平均路徑長度(記住 `print_statistics` 是執行了 100 次模擬):(程式碼區塊 10) + +```python +def qpolicy(m): + x,y = m.human + v = probs(Q[x,y]) + a = random.choices(list(actions),weights=v)[0] + return a + +print_statistics(qpolicy) +``` + +執行此程式碼後,你應該會得到明顯比之前更短的平均路徑長度,約在 3-6 之間。 + +## 探究學習過程 + +如前所述,學習過程是在對問題空間結構已獲得知識的探索與利用之間取得平衡。我們看到學習結果(幫助代理找到目標的短路徑能力)有所改善,但觀察學習過程中平均路徑長度的變化也很有趣: + + + +學習過程可總結為: + +- 平均路徑長度上升。我們看到一開始平均路徑長度會增加。這很可能是因為當我們對環境一無所知時,代理很可能卡在不利狀態,比如水域或狼身邊。隨著學習增多並開始利用這些知識,我們可以探索環境更久,但仍不完全知道蘋果在哪裡。 + +- 學習更多後路徑長度下降。當學習足夠後,代理更容易達成目標,路徑長度開始減少。不過我們仍持續探索,因此經常會偏離最佳路徑,嘗試新選項,使路徑長度比理想狀況長。 + +- 路徑長度突然增加。我們還看到圖中某些點路徑長度突然增加,這體現了過程的隨機性,意味著有時會用新值覆寫 Q 表係數,對它們造成「損害」。理想情況下可透過減小學習率(例如訓練後期只做小幅度調整)來降低此影響。 + +總體來說,要記住學習過程的成功與質量很大程度上取決於參數,例如學習率、學習率衰減和折扣因子。這些通常稱為超參數,以區別於訓練中優化的參數(例如 Q 表係數)。尋找最佳超參數值的過程稱為超參數優化,是值得獨立探討的主題。 ## [課後測驗](https://ff-quizzes.netlify.app/en/ml/) -## 作業 -[更真實的世界](assignment.md) +## 作業 +[一個更現實的世界](assignment.md) --- -**免責聲明**: -本文件已使用人工智能翻譯服務 [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/zh-HK/8-Reinforcement/2-Gym/README.md b/translations/zh-HK/8-Reinforcement/2-Gym/README.md index 3bab34db8..fa4c9364f 100644 --- a/translations/zh-HK/8-Reinforcement/2-Gym/README.md +++ b/translations/zh-HK/8-Reinforcement/2-Gym/README.md @@ -1,14 +1,34 @@ -## 前置條件 +# 賽車桿滑冰 -在本課中,我們將使用名為 **OpenAI Gym** 的庫來模擬不同的 **環境**。你可以在本地運行本課的代碼(例如使用 Visual Studio Code),此時模擬將在新窗口中打開。如果在線運行代碼,可能需要對代碼進行一些調整,具體請參考 [這裡](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7)。 +我們在上一課解決的問題可能看起來像個玩具問題,似乎不太適用於現實生活場景。但事實並非如此,因為許多現實世界的問題也有類似的場景——包括下棋或圍棋。它們相似,因為我們也有一個有既定規則的棋盤和一個離散狀態。 + +## [課前測驗](https://ff-quizzes.netlify.app/en/ml/) + +## 介紹 + +本課中,我們將把相同的 Q-Learning 原則應用於一個具有連續狀態的問題,也就是由一個或多個實數表示的狀態。我們將處理以下問題: + +> 問題:如果 Peter 想要逃離狼群,他需要能夠更快移動。我們將看看 Peter 如何通過 Q-Learning 學會滑冰,尤其是如何保持平衡。 + +![偉大的逃脫!](../../../../translated_images/zh-HK/escape.18862db9930337e3.webp) + +> Peter 和朋友們發揮創意以逃離狼群!圖片來自 [Jen Looper](https://twitter.com/jenlooper) + +我們將使用一個簡化版本的平衡問題,稱為 **賽車桿(CartPole)** 問題。在賽車桿世界中,我們有一個可左右移動的水平滑軌,目標是在滑軌上平衡一根垂直桿。 + +a cartpole + +## 前置知識 + +本課中,我們將使用一個叫做 **OpenAI Gym** 的庫來模擬不同的環境。你可以在本地執行本課代碼(例如,從 Visual Studio Code 中),此時模擬會在新視窗中打開。若在網上執行代碼,你可能需要對代碼做一些調整,具體說明見[這裡](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7)。 ## OpenAI Gym -在上一課中,遊戲的規則和狀態是由我們自己定義的 `Board` 類提供的。在這裡,我們將使用一個特殊的 **模擬環境**,它將模擬平衡杆的物理行為。最受歡迎的用於訓練強化學習算法的模擬環境之一叫做 [Gym](https://gym.openai.com/),由 [OpenAI](https://openai.com/) 維護。通過使用這個 Gym,我們可以創建不同的 **環境**,從平衡杆模擬到 Atari 遊戲。 +在上一課中,遊戲規則和狀態由我們自定義的 `Board` 類給出。這裡我們會使用一個特殊的模擬環境,模擬平衡桿背後的物理。OpenAI 維護的一個非常流行的強化學習訓練模擬環境叫做 [Gym](https://gym.openai.com/),使用該 Gym,我們可以創建從賽車桿模擬到街機遊戲等不同的環境。 -> **注意**:你可以在 [這裡](https://gym.openai.com/envs/#classic_control) 查看 OpenAI Gym 提供的其他環境。 +> 注意:你可以在 [這裡](https://gym.openai.com/envs/#classic_control) 查看 OpenAI Gym 的其他可用環境。 -首先,讓我們安裝 Gym 並導入所需的庫(代碼塊 1): +首先,讓我們安裝 gym 並導入所需庫(代碼塊 1): ```python import sys @@ -20,15 +40,15 @@ import numpy as np import random ``` -## 練習 - 初始化平衡杆環境 +## 練習 - 初始化賽車桿環境 -要處理平衡杆問題,我們需要初始化相應的環境。每個環境都與以下內容相關聯: +若要處理賽車桿平衡問題,我們需要初始化相應環境。每個環境都關聯著: -- **觀察空間**:定義我們從環境中接收到的信息結構。對於平衡杆問題,我們接收到杆的位置、速度以及其他一些值。 +- 觀察空間,定義了我們從環境中接收到的信息結構。對賽車桿問題而言,我們獲取桿的位置、速度及其他一些數值。 -- **動作空間**:定義可能的動作。在我們的例子中,動作空間是離散的,由兩個動作組成——**左** 和 **右**。(代碼塊 2) +- 動作空間,定義可能的動作。在我們的例子中,動作空間是離散的,由兩個動作組成——。(代碼塊 2) -1. 要初始化,輸入以下代碼: +1. 初始化,輸入如下代碼: ```python env = gym.make("CartPole-v1") @@ -37,11 +57,11 @@ import random print(env.action_space.sample()) ``` -要了解環境如何運作,讓我們運行一個短模擬,持續 100 步。在每一步中,我們提供一個動作——在此模擬中,我們只是隨機選擇 `action_space` 中的一個動作。 +看看環境如何工作,我們運行100步簡短模擬。每一步,我們提供要採取的一個動作——這個模擬中,我們只是從 `action_space` 隨機選擇一個動作。 -1. 運行以下代碼並查看結果。 +1. 執行下面的代碼,看看結果如何。 - ✅ 請記住,最好在本地 Python 安裝中運行此代碼!(代碼塊 3) + ✅ 請記住,最好在本地 Python 環境運行此代碼!(代碼塊 3) ```python env.reset() @@ -52,11 +72,11 @@ import random env.close() ``` - 你應該會看到類似於以下圖片的效果: + 你應該會看到類似下圖的畫面: - ![未平衡的平衡杆](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) + ![未平衡的賽車桿](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) -1. 在模擬過程中,我們需要獲取觀察值以決定如何行動。事實上,`step` 函數返回當前的觀察值、獎勵函數以及一個 `done` 標誌,指示是否應繼續模擬:(代碼塊 4) +1. 在模擬過程中,我們需要獲取觀察值以決定如何行動。實際上,`step` 函數返回當前觀察、獎勵函數值以及完成標誌,用於指示是否應繼續模擬:(代碼塊 4) ```python env.reset() @@ -69,7 +89,7 @@ import random env.close() ``` - 你會在筆記本輸出中看到類似以下的結果: + 你最終會在筆記本輸出中看到如下內容: ```text [ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0 @@ -82,43 +102,43 @@ import random [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0 ``` - 在模擬的每一步中返回的觀察向量包含以下值: - - 小車的位置 - - 小車的速度 - - 杆的角度 - - 杆的旋轉速率 + 每步模擬返回的觀察向量包含以下數值: + - 賽車位置 + - 賽車速度 + - 桿的角度 + - 桿的旋轉速率 -1. 獲取這些數值的最小值和最大值:(代碼塊 5) +1. 獲取這些數值的最小和最大值:(代碼塊 5) ```python print(env.observation_space.low) print(env.observation_space.high) ``` - 你可能還會注意到,在每次模擬步驟中,獎勵值始終為 1。這是因為我們的目標是盡可能長時間保持杆在合理的垂直位置。 + 你可能還會注意到,每步模擬的獎勵值總是1。這是因為我們的目標是在最長時間內保持桿子相對垂直,也就是盡可能長時間生存。 - ✅ 事實上,如果我們能在 100 次連續試驗中平均獲得 195 的獎勵值,則平衡杆模擬被認為已解決。 + ✅ 事實上,當我們在100次連續試驗中平均獲得195分時,CartPole 模擬被認為已經解決。 ## 狀態離散化 -在 Q-Learning 中,我們需要構建 Q-表,定義在每個狀態下應採取的行動。為了做到這一點,我們需要狀態是 **離散的**,更準確地說,它應包含有限數量的離散值。因此,我們需要以某種方式 **離散化** 我們的觀察值,將它們映射到有限的狀態集合。 +在 Q-Learning 中,我們需要構建 Q-Table,定義在每個狀態下該怎麼做。為此,我們需要狀態是離散的,更精確說,應包含有限數量的離散值。因此,我們需要將觀察值離散化,映射到一個有限的狀態集合。 -有幾種方法可以做到這一點: +有幾種方法可以做到這點: -- **分割成區間**:如果我們知道某個值的範圍,我們可以將該範圍分割成若干 **區間**,然後用該值所屬的區間編號替代原值。這可以使用 numpy 的 [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) 方法來完成。在這種情況下,我們將精確知道狀態的大小,因為它將取決於我們為離散化選擇的區間數量。 +- 分箱。若知道某數值的區間,我們可以將該區間分成多個箱子,然後用該數值所在的箱位來替代原數值。這可以用 numpy 的 [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) 方法實現。如此一來,我們確切知道狀態大小,因為它取決於分箱數量。 + +✅ 另一種方法是利用線性插值將數值映射到有限區間(例如從 -20 到 20),然後通過四捨五入轉換為整數。這種方法對狀態大小的控制較少,尤其當我們不知道輸入數據的確切範圍時。比如本例中,4個數值中有2個沒有明確上限或下限,可能導致無限狀態數。 -✅ 我們可以使用線性插值將值映射到某個有限範圍(例如,從 -20 到 20),然後通過四捨五入將數字轉換為整數。這種方法對狀態大小的控制稍弱,特別是當我們不知道輸入值的確切範圍時。例如,在我們的例子中,4 個值中的 2 個沒有上下界,這可能導致無限的狀態數量。 +在本例中,我們會採用第二種方法。如你稍後可能會注意到,儘管沒有明確的界限,這些值很少超出某個有限區間,因此極端值的狀態會非常罕見。 -在我們的例子中,我們將採用第二種方法。正如你稍後可能注意到的,儘管某些值沒有明確的上下界,但它們很少超出某些有限範圍,因此具有極端值的狀態將非常罕見。 - -1. 以下是將模型的觀察值轉換為 4 個整數值元組的函數:(代碼塊 6) +1. 這是根據模擬觀察結果返回4個整數元組的函數:(代碼塊 6) ```python def discretize(x): return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int)) ``` -1. 我們還可以探索另一種使用區間的離散化方法:(代碼塊 7) +1. 我們也來看一下利用分箱的另一種離散化方法:(代碼塊 7) ```python def create_bins(i,num): @@ -126,17 +146,17 @@ import random 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)] # 每個參數的數值區間 + nbins = [20,20,10,10] # 每個參數的分箱數量 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. 現在讓我們運行一個短模擬並觀察這些離散化的環境值。可以嘗試使用 `discretize` 和 `discretize_bins`,看看是否有差異。 +1. 現在運行一段短模擬,觀察這些離散化的環境值。你可以嘗試 `discretize` 和 `discretize_bins`,看看有何不同。 - ✅ `discretize_bins` 返回的是區間編號,從 0 開始。因此,對於接近 0 的輸入值,它返回的是區間中間的編號(10)。在 `discretize` 中,我們並未關注輸出值的範圍,允許它們為負,因此狀態值未偏移,0 對應於 0。(代碼塊 8) + ✅ `discretize_bins` 返回的是箱號,從0開始。因此對接近0的輸入值,它返回中間箱號(10)。而 `discretize` 不限制輸出範圍,允許負值,狀態值未偏移,0 對應於 0。(代碼塊 8) ```python env.reset() @@ -150,15 +170,15 @@ import random env.close() ``` - ✅ 如果你想查看環境的執行效果,可以取消註釋以 `env.render` 開頭的行。否則,你可以在後台執行,這樣速度更快。在我們的 Q-Learning 過程中,我們將使用這種“隱形”執行。 + ✅ 如果你想看到環境如何執行,可取消註釋以 `env.render` 開頭的行。否則你也可以讓它在後台執行,速度更快。我們在 Q-Learning 過程中將使用這種“隱形”執行方式。 -## Q-表結構 +## Q-Table 結構 -在上一課中,狀態是一個簡單的數字對,範圍從 0 到 8,因此用形狀為 8x8x2 的 numpy 張量表示 Q-表非常方便。如果我們使用區間離散化,狀態向量的大小也是已知的,因此我們可以使用相同的方法,將狀態表示為形狀為 20x20x10x10x2 的數組(其中 2 是動作空間的維度,前幾個維度對應於我們為觀察空間中每個參數選擇的區間數量)。 +在上一課中,狀態是從0到8的簡單數字對,因此我們用形狀為 8x8x2 的 numpy 張量方便地表示 Q-Table。如果我們使用分箱離散化,狀態向量大小也是已知的,因此我們可以用形狀為 20x20x10x10x2 的陣列表示狀態(其中 2 是動作空間維度,前幾維是對應每個觀察空間參數選定的分箱數)。 -然而,有時觀察空間的精確維度是未知的。在使用 `discretize` 函數的情況下,我們可能無法確定狀態是否保持在某些限制範圍內,因為某些原始值是無界的。因此,我們將使用稍微不同的方法,通過字典來表示 Q-表。 +但有時候,觀察空間確切維度不明。對 `discretize` 函數而言,我們始終無法保證狀態會保持在一定限制內,因為原始值中有些沒有限定上下限。因此,我們將採用稍微不同的方法,用字典來表示 Q-Table。 -1. 使用 *(state, action)* 作為字典鍵,值則對應於 Q-表的條目值。(代碼塊 9) +1. 使用 *(state,action)* 對作為字典的鍵,對應值即 Q-Table 的條目值。(代碼塊 9) ```python Q = {} @@ -168,38 +188,38 @@ import random return [Q.get((state,a),0) for a in actions] ``` - 在這裡,我們還定義了一個函數 `qvalues()`,它返回給定狀態對應於所有可能動作的 Q-表值列表。如果 Q-表中沒有該條目,我們將返回默認值 0。 + 這裡我們還定義了 `qvalues()` 函數,返回給定狀態在所有可能動作下的 Q-Table 值列表。若 Q-Table 中沒有該條目,預設回傳 0。 ## 開始 Q-Learning -現在我們準備教 Peter 如何保持平衡了! +現在我們準備教 Peter 平衡了! 1. 首先,設置一些超參數:(代碼塊 10) ```python - # hyperparameters + # 超參數 alpha = 0.3 gamma = 0.9 epsilon = 0.90 ``` - 其中,`alpha` 是 **學習率**,定義了我們在每一步中應調整 Q-表當前值的程度。在上一課中,我們從 1 開始,然後在訓練過程中將 `alpha` 降低到較低的值。在本例中,為了簡化,我們將保持其不變,你可以稍後嘗試調整 `alpha` 值。 - - `gamma` 是 **折扣因子**,顯示了我們應優先考慮未來獎勵而非當前獎勵的程度。 + 這裡,`alpha` 是學習率,定義每步調整 Q-Table 當前值的幅度。上一課我們從1開始,然後在訓練過程中將 `alpha` 降到較低值。這裡為簡便起見,我們保持其恒定,後續你可以試試調整 `alpha`。 - `epsilon` 是 **探索/利用因子**,決定了我們應偏向探索還是利用。在我們的算法中,我們將在 `epsilon` 百分比的情況下根據 Q-表值選擇下一個動作,而在剩餘情況下執行隨機動作。這將允許我們探索以前未見過的搜索空間區域。 + `gamma` 是折扣因子,表示我們對未來獎勵相比於當前獎勵的重視程度。 - ✅ 就平衡而言,選擇隨機動作(探索)就像是隨機地向錯誤方向推了一下,杆需要學會如何從這些“錯誤”中恢復平衡。 + `epsilon` 是探索/利用因子,決定我們應該優先探索還是利用。在算法中,我們會在 `epsilon` 百分比情況下根據 Q-Table 選擇下一步動作,剩餘情況隨機選擇動作。這可以讓我們探索搜索空間中未曾見過的區域。 -### 改進算法 + ✅ 對平衡問題而言,隨機選擇動作(探索)就像隨機向錯誤方向用力,桿子必須學會如何從這些“錯誤”中恢復平衡。 -我們還可以對上一課的算法進行兩項改進: +### 優化算法 -- **計算平均累積獎勵**:在多次模擬中計算平均累積獎勵。我們將每 5000 次迭代打印一次進度,並將累積獎勵平均分配到這段時間內。這意味著如果我們獲得超過 195 分,我們可以認為問題已解決,並且質量甚至高於要求。 +我們可以對上一課的算法作兩個改進: -- **計算最大平均累積結果**:`Qmax`,並存儲對應於該結果的 Q-表值。當你運行訓練時,你會注意到有時平均累積結果開始下降,我們希望保留訓練過程中觀察到的最佳模型所對應的 Q-表值。 +- 計算平均累積獎勵,統計多次模擬。每5000次迭代我們輸出一次進度,並對累積獎勵取平均值。若平均超過 195 分,我們可認為問題已被解決,甚至優於要求質量。 + +- 記錄最大平均累積結果 `Qmax`,存儲對應該結果的 Q-Table。在訓練中你會發現,平均累積結果有時會下降,我們希望保留訓練中表現最好的 Q-Table。 -1. 在每次模擬中收集所有累積獎勵到 `rewards` 向量中,以便進一步繪圖。(代碼塊 11) +1. 收集每次模擬的累積獎勵到 `rewards` 向量,便於繪圖分析。(代碼塊 11) ```python def probs(v,eps=1e-4): @@ -214,15 +234,15 @@ import random obs = env.reset() done = False cum_reward=0 - # == do the simulation == + # == 進行模擬 == while not done: s = discretize(obs) if random.random() Qmax: @@ -240,25 +260,25 @@ import random cum_rewards=[] ``` -你可能會注意到以下結果: +你可能會注意到: -- **接近目標**:我們非常接近實現目標,即在 100 次以上的連續模擬中獲得 195 的累積獎勵,或者我們可能已經達到了目標!即使我們獲得較小的數值,我們仍然不知道,因為我們平均了 5000 次運行,而正式標準只需要 100 次運行。 +- 接近目標。我們很接近在100次連續模擬中獲得195累積獎勵的目標,甚至可能已經達成!即使數字較小,我們也無法判斷,因為取的是5000次的平均值,而正式判定只需100次。 + +- 獎勵開始下降。有時獎勵開始下降,表示我們的 Q-Table 中的值開始被更差的值覆蓋,導致模型退化。 -- **獎勵開始下降**:有時獎勵開始下降,這意味著我們可能用更糟糕的值覆蓋了 Q-表中已學到的值。 - -這一觀察在繪製訓練進度時更為明顯。 +這一現象在繪製訓練過程中更為明顯。 ## 繪製訓練進度 -在訓練過程中,我們將每次迭代的累積獎勵值收集到 `rewards` 向量中。以下是將其與迭代次數繪製的結果: +在訓練中,我們將每次迭代的累積獎勵值收集到了 `rewards` 向量中。當將其對迭代次數繪圖時: ```python plt.plot(rewards) ``` -![原始進度](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png) +![原始進度](../../../../translated_images/zh-HK/train_progress_raw.2adfdf2daea09c59.webp) -從這個圖表中,我們無法得出任何結論,因為由於隨機訓練過程的特性,訓練會話的長度差異很大。為了讓這個圖表更有意義,我們可以計算一系列實驗的 **移動平均值**,例如 100。這可以方便地使用 `np.convolve` 完成:(代碼塊 12) +從該圖無法看出什麼,因為隨機訓練過程的長度大不相同。為讓圖形更有意義,我們計算一系列實驗的移動平均,譬如 100 次。可使用 `np.convolve` 方便地實現:(代碼塊 12) ```python def running_average(x,window): @@ -267,21 +287,24 @@ def running_average(x,window): plt.plot(running_average(rewards,100)) ``` -![訓練進度](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png) +![訓練進度](../../../../translated_images/zh-HK/train_progress_runav.c71694a8fa9ab359.webp) + +## 變化超參數 + +為使學習更穩定,調整訓練過程中的部分超參數是合理的。特別是: + +- 學習率 `alpha`,我們可以先設為接近1的值,然後不斷減小。隨著時間推移,Q-Table 中概率值會越來越好,我們只需稍作調整而非完全更新。 -## 調整超參數 +- **增加 epsilon**。我們可能想慢慢增大 `epsilon`,逐步減少探索、增多利用。大概先用較低 `epsilon` 值,逐漸增大到接近1較為合理。 -為了使學習更加穩定,我們可以在訓練過程中調整一些超參數。特別是: +> **任務1**: 嘗試調整超參數值,看是否能達到更高累積獎勵。你能超過195嗎? -- **對學習率 `alpha`**:我們可以從接近 1 的值開始,然後逐漸降低該參數。隨著時間的推移,我們將在 Q-表中獲得良好的概率值,因此我們應該稍微調整它們,而不是完全用新值覆蓋。 -- **增加 `epsilon`**:我們可能希望慢慢增加 `epsilon`,以便減少探索並增加利用。可能更合理的是從較低的 `epsilon` 值開始,然後逐漸增加到接近 1。 -> **任務 1**:嘗試調整超參數的值,看看能否獲得更高的累積回報。你能達到超過 195 嗎? -> **任務 2**:為了正式解決這個問題,你需要在連續 100 次運行中獲得平均 195 的回報。在訓練過程中測量這一點,並確保你已經正式解決了這個問題! +> **任務 2**:正式解決此問題,您需要在連續 100 次運行中取得平均獎勵 195。訓練期間測量該值,並確保您已正式解決此問題! -## 查看結果的實際效果 +## 看到結果的實際表現 -觀察訓練後的模型行為會很有趣。我們來運行模擬,並按照訓練時相同的行動選擇策略進行操作,根據 Q-Table 中的概率分佈進行採樣:(代碼塊 13) +實際看看訓練好的模型如何表現會很有趣。讓我們運行模擬,並且遵循與訓練時相同的動作選擇策略,根據 Q-Table 中的機率分布進行抽樣:(程式碼區塊 13) ```python obs = env.reset() @@ -295,30 +318,32 @@ while not done: env.close() ``` -你應該會看到類似這樣的畫面: +你應該會見到類似以下的畫面: -![a balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) +![一個平衡的倒立擺小車](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) --- ## 🚀挑戰 -> **任務 3**:在這裡,我們使用的是 Q-Table 的最終版本,但這可能不是表現最好的版本。記得我們已經將表現最好的 Q-Table 存儲在 `Qbest` 變數中!嘗試將 `Qbest` 複製到 `Q` 中,並使用最佳表現的 Q-Table 來運行相同的例子,看看是否能發現差異。 +> **任務 3**:這裡我們使用的是最終版的 Q-Table,但這可能不是最佳版本。請記得我們已將表現最佳的 Q-Table 儲存在 `Qbest` 變數中!嘗試用這個表現最佳的 Q-Table 來做同樣的範例,把 `Qbest` 複製到 `Q`,並看看你是否能注意到不同。 -> **任務 4**:在這裡,我們並不是每一步都選擇最佳行動,而是根據相應的概率分佈進行採樣。是否更合理每次都選擇 Q-Table 值最高的最佳行動?這可以通過使用 `np.argmax` 函數來找到對應於最高 Q-Table 值的行動編號。實現這種策略,看看是否能改善平衡效果。 +> **任務 4**:這裡我們並非在每一步都選擇最佳動作,而是依照對應的機率分布進行抽樣。如果總是選擇 Q-Table 值最高的最佳動作會不會更合理?這可以透過 `np.argmax` 函數找出對應最高 Q-Table 值的動作編號來實現。請實作此策略,看看是否能改善平衡效果。 -## [課後測驗](https://ff-quizzes.netlify.app/en/ml/) +## [課後小測驗](https://ff-quizzes.netlify.app/en/ml/) ## 作業 [訓練一輛山地車](assignment.md) -## 總結 +## 結論 -我們現在已經學會如何通過提供定義遊戲期望狀態的回報函數,並讓代理智能地探索搜索空間,來訓練代理以獲得良好的結果。我們成功地將 Q-Learning 演算法應用於離散和連續環境中的情況,但行動是離散的。 +我們現已學會如何透過提供定義遊戲目標狀態的獎勵函數,並讓智能體有機會聰明地探索搜尋空間,來訓練智能代理達成良好表現。我們成功地在離散及連續環境(但動作為離散)情境中應用了 Q-Learning 演算法。 -同樣重要的是研究行動狀態也是連續的情況,以及觀察空間更加複雜的情況,例如來自 Atari 遊戲畫面的圖像。在這些問題中,我們通常需要使用更強大的機器學習技術,例如神經網絡,來獲得良好的結果。這些更高階的主題將是我們即將推出的進階 AI 課程的內容。 +同時也很重要去研究動作狀態也是連續的情況,還有當觀測空間更加複雜,例如來自 Atari 遊戲螢幕的影像。這些問題通常需要使用更強大的機器學習技術,如神經網絡,才能達到良好表現。這些更進階的主題將會是我們即將開設的進階 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/zh-MO/.co-op-translator.json b/translations/zh-MO/.co-op-translator.json index 786fc561e..e374a5dbd 100644 --- a/translations/zh-MO/.co-op-translator.json +++ b/translations/zh-MO/.co-op-translator.json @@ -24,8 +24,8 @@ "language_code": "zh-MO" }, "1-Introduction/3-fairness/README.md": { - "original_hash": "9a6b702d1437c0467e3c5c28d763dac2", - "translation_date": "2025-09-06T09:13:33+00:00", + "original_hash": "0f00d72169a0d37eecfd16d71e01700a", + "translation_date": "2026-07-14T07:52:00+00:00", "source_file": "1-Introduction/3-fairness/README.md", "language_code": "zh-MO" }, @@ -54,8 +54,8 @@ "language_code": "zh-MO" }, "2-Regression/1-Tools/README.md": { - "original_hash": "fa81d226c71d5af7a2cade31c1c92b88", - "translation_date": "2025-09-06T09:08:07+00:00", + "original_hash": "0b8635427b582d03ea4ab7089b93e505", + "translation_date": "2026-07-14T07:48:05+00:00", "source_file": "2-Regression/1-Tools/README.md", "language_code": "zh-MO" }, @@ -72,8 +72,8 @@ "language_code": "zh-MO" }, "2-Regression/2-Data/README.md": { - "original_hash": "7c077988328ebfe33b24d07945f16eca", - "translation_date": "2025-09-06T09:08:43+00:00", + "original_hash": "a58b2c4d16c6b122643391745ac15af6", + "translation_date": "2026-07-14T07:49:23+00:00", "source_file": "2-Regression/2-Data/README.md", "language_code": "zh-MO" }, @@ -89,6 +89,12 @@ "source_file": "2-Regression/2-Data/solution/Julia/README.md", "language_code": "zh-MO" }, + "2-Regression/2-Data/solution/notebook.ipynb": { + "original_hash": "96b95f8cf473481f2f371de8156f1571", + "translation_date": "2026-07-14T07:42:13+00:00", + "source_file": "2-Regression/2-Data/solution/notebook.ipynb", + "language_code": "zh-MO" + }, "2-Regression/3-Linear/README.md": { "original_hash": "8b776e731c35b171d316d01d0e7b1369", "translation_date": "2026-04-26T20:32:58+00:00", @@ -457,7 +463,7 @@ }, "8-Reinforcement/1-QLearning/README.md": { "original_hash": "911efd5e595089000cb3c16fce1beab8", - "translation_date": "2025-09-06T09:18:41+00:00", + "translation_date": "2026-07-14T07:50:46+00:00", "source_file": "8-Reinforcement/1-QLearning/README.md", "language_code": "zh-MO" }, @@ -581,6 +587,19 @@ "source_file": "TROUBLESHOOTING.md", "language_code": "zh-MO" }, + "__translation_failures__": { + "sketchnotes/LICENSE.md": { + "original_hash": "fba3b94d88bfb9b81369b869a1e9a20f", + "source_file": "sketchnotes/LICENSE.md", + "language_code": "zh-MO", + "failure_date": "2026-07-14T07:46:40+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-08-29T21:08:30+00:00", diff --git a/translations/zh-MO/1-Introduction/3-fairness/README.md b/translations/zh-MO/1-Introduction/3-fairness/README.md index 1eb7747a3..19bfb771a 100644 --- a/translations/zh-MO/1-Introduction/3-fairness/README.md +++ b/translations/zh-MO/1-Introduction/3-fairness/README.md @@ -1,155 +1,159 @@ -# 使用負責任的人工智慧建構機器學習解決方案 - -![機器學習中負責任人工智慧的摘要草圖](../../../../sketchnotes/ml-fairness.png) -> 草圖由 [Tomomi Imura](https://www.twitter.com/girlie_mac) 提供 +# 使用負責任的 AI 建構機器學習解決方案 + +![機器學習中負責任 AI 的概要以手繪筆記呈現](../../../../translated_images/zh-MO/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 原則」學習路徑,並觀看以下相關主題影片: -通過此 [學習路徑](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)進一步了解負責任 AI -[![微軟的負責任人工智慧方法](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "微軟的負責任人工智慧方法") +[![Microsoft 的負責任 AI 方法](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoft 的負責任 AI 方法") -> 🎥 點擊上方圖片觀看影片:微軟的負責任人工智慧方法 +> 🎥 點擊上方圖片觀看影片:Microsoft 的負責任 AI 方法 ## 公平性 -人工智慧系統應該公平對待每個人,避免對相似群體的人產生不同的影響。例如,當人工智慧系統提供醫療建議、貸款申請或就業建議時,應該對具有相似症狀、財務狀況或專業資格的人給出相同的建議。我們每個人都帶有一些繼承的偏見,這些偏見會影響我們的決策和行動。這些偏見可能會反映在我們用來訓練人工智慧系統的數據中,有時甚至是無意間發生的。我們往往很難有意識地察覺到自己在數據中引入了偏見。 +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/zh-MO/gender-bias-translate-en-tr.f185fd8822c2d437.webp) > 翻譯成土耳其語 -![翻譯回英語](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) -> 翻譯回英語 +![再翻譯回英語](../../../../translated_images/zh-MO/gender-bias-translate-tr-en.4eee7e3cecb8c70e.webp) +> 再翻譯回英語 -在設計和測試人工智慧系統時,我們需要確保人工智慧是公平的,並且未被編程為做出偏見或歧視性的決策,這些決策是人類也被禁止做出的。保證人工智慧和機器學習的公平性仍然是一個複雜的社會技術挑戰。 +在設計與測試 AI 系統時,我們需要確保 AI 是公平的,不會被編程成做出偏見或歧視性的決定,而人類也被禁止做這類決策。確保 AI 及機器學習的公平性仍是一個複雜的社會技術挑戰。 ### 可靠性與安全性 -為了建立信任,人工智慧系統需要在正常和意外情況下保持可靠、安全和一致。我們需要了解人工智慧系統在各種情境下的行為,特別是當它們面對異常情況時。在構建人工智慧解決方案時,需要大量關注如何處理人工智慧可能遇到的各種情況。例如,自駕車需要將人們的安全放在首位。因此,驅動汽車的人工智慧需要考慮所有可能的情境,例如夜晚、雷暴或暴風雪、孩子橫穿馬路、寵物、道路施工等。人工智慧系統能否可靠、安全地處理廣泛的情況,反映了數據科學家或人工智慧開發者在設計或測試系統時的考量程度。 +為了建立信任,AI 系統需要在正常及異常狀況下都能可靠、安全且一致地運作。重要的是要知道 AI 系統在各種情境下如何表現,特別是異常狀況。在建構 AI 解決方案時,必須大量關注如何處理 AI 解決方案可能遇到的多樣化狀況。例如,一輛自駕車必須將人的安全列為首要任務。因此,推動該車的 AI 需考慮所有可能遇到的場景,如夜間、雷雨或暴風雪、小孩奔跑穿越街道、寵物、道路施工等。AI 系統能多可靠安全地處理廣泛條件,反映了資料科學家或 AI 開發者在設計或測試時的預見程度。 -> [🎥 點擊這裡觀看影片:](https://www.microsoft.com/videoplayer/embed/RE4vvIl) +> [🎥 點擊此處觀看影片:](https://www.microsoft.com/videoplayer/embed/RE4vvIl) ### 包容性 -人工智慧系統應該被設計為能夠吸引並賦能每個人。在設計和實施人工智慧系統時,數據科學家和人工智慧開發者需要識別並解決系統中可能無意間排除某些人的潛在障礙。例如,全球有10億人有殘疾。隨著人工智慧的進步,他們可以更輕鬆地獲取廣泛的信息和機會。通過解決這些障礙,可以創造創新機會,開發出能為所有人提供更好體驗的人工智慧產品。 - -> [🎥 點擊這裡觀看影片:人工智慧中的包容性](https://www.microsoft.com/videoplayer/embed/RE4vl9v) +AI 系統應設計成能夠讓每個人都能參與和賦能。在設計與部署 AI 系統時,資料科學家與 AI 開發者會辨識並解決系統中可能無意排除人群的障礙。例如,全球有 10 億殘疾人士。隨著 AI 的進步,他們能更輕鬆地在日常生活中獲取廣泛的資訊與機會。通過排除障礙,創造了創新並開發出更佳用戶體驗的 AI 產品,有益於所有人。 -### 安全性與隱私 +> [🎥 點擊此處觀看影片:AI 包容性](https://www.microsoft.com/videoplayer/embed/RE4vl9v) -人工智慧系統應該是安全的,並尊重人們的隱私。如果系統威脅到人們的隱私、信息或生命安全,人們對其的信任就會減少。在訓練機器學習模型時,我們依賴數據來產生最佳結果。在此過程中,必須考慮數據的來源和完整性。例如,數據是用戶提交的還是公開可用的?接下來,在處理數據時,開發能夠保護機密信息並抵禦攻擊的人工智慧系統至關重要。隨著人工智慧的普及,保護隱私和確保重要的個人和商業信息的安全變得越來越重要且複雜。隱私和數據安全問題對人工智慧尤為重要,因為數據的可用性對於人工智慧系統做出準確且知情的預測和決策至關重要。 +### 安全與隱私 -> [🎥 點擊這裡觀看影片:人工智慧中的安全性](https://www.microsoft.com/videoplayer/embed/RE4voJF) +AI 系統應安全且尊重個人隱私。人們對危及其隱私、資訊或生命安全的系統信任度較低。訓練機器學習模型時,我們依賴資料以取得最佳結果。這過程中必須考慮資料的來源和正確性。例如,資料是用戶提交或公開取得的?同時,使用資料時,開發能保護機密資訊且具抵抗攻擊能力的 AI 系統十分關鍵。隨著 AI 越來越普及,保護隱私並確保重要個人與商業資訊安全變得更為重要且複雜。隱私與資料安全問題在 AI 領域尤其需要嚴密關注,因為 AI 系統需存取資料才能對人民作出準確且明智的預測與決策。 -- 作為一個行業,我們在隱私和安全性方面取得了顯著進展,這在很大程度上得益於《通用數據保護條例》(GDPR)等法規。 -- 然而,對於人工智慧系統,我們必須承認在需要更多個人數據以使系統更加個性化和有效與隱私之間的緊張關係。 -- 就像互聯網誕生時連接的計算機一樣,我們也看到了與人工智慧相關的安全問題數量的急劇增加。 -- 同時,我們也看到人工智慧被用於改善安全性。例如,大多數現代防病毒掃描器今天都由人工智慧啟發的啟發式方法驅動。 -- 我們需要確保我們的數據科學流程與最新的隱私和安全實踐和諧融合。 +> [🎥 點擊此處觀看影片:AI 的安全性](https://www.microsoft.com/videoplayer/embed/RE4voJF) -### 透明性 +- 身為產業,我們在隱私與安全方面已取得重大進展,特別是受到 GDPR(一般資料保護規則)等法規的推動。 +- 然而,針對 AI 系統,我們必須承認在需要更多個人資料以提升系統個人化與效能與隱私之間的矛盾。 +- 正如互聯網連結電腦的誕生,我們也看到 AI 相關的安全問題急速上升。 +- 同時,AI 也被用於提升安全性。例如,現代多數防毒掃描器現在多由 AI 偵測法則驅動。 +- 我們需確保資料科學流程與最新隱私及安全實務和諧融合。 -人工智慧系統應該是可理解的。透明性的一個關鍵部分是解釋人工智慧系統及其組件的行為。提高對人工智慧系統的理解需要利益相關者了解它們如何以及為什麼運作,以便識別潛在的性能問題、安全和隱私問題、偏見、排他性實踐或意外結果。我們還認為,使用人工智慧系統的人應該誠實並坦率地說明何時、為什麼以及如何選擇部署它們,以及它們使用的系統的局限性。例如,如果一家銀行使用人工智慧系統來支持其消費者貸款決策,則需要檢查結果並了解哪些數據影響了系統的建議。隨著政府開始對各行業的人工智慧進行監管,數據科學家和組織必須解釋人工智慧系統是否符合監管要求,特別是在出現不良結果時。 -> [🎥 點擊這裡觀看影片:人工智慧中的透明性](https://www.microsoft.com/videoplayer/embed/RE4voJF) +### 透明度 +AI 系統應該是可理解的。透明度的重要部分是解釋 AI 系統及其組件的行為。提升對 AI 系統的理解需要相關利害關係者明白系統如何及為何運作,以便辨識潛在的效能問題、安全及隱私疑慮、偏見、排他性措施或非預期結果。我們也相信使用 AI 系統的人應誠實且公開何時、為何及如何選擇部署,並說明所使用系統的限制。例如,銀行若用 AI 系統支持其消費貸款決策,就必須檢視結果並理解哪些數據影響系統建議。政府開始對產業中的 AI 進行規管,因此資料科學家與組織必須說明 AI 系統是否符合監管要求,尤其在出現不良結果時。 -- 由於人工智慧系統非常複雜,很難理解它們的工作原理並解釋結果。 -- 這種缺乏理解影響了這些系統的管理、運營和文檔化方式。 -- 更重要的是,這種缺乏理解影響了基於這些系統產生的結果所做的決策。 +> [🎥 點擊此處觀看影片:AI 的透明度](https://www.microsoft.com/videoplayer/embed/RE4voJF) -### 責任 +- 由於 AI 系統非常複雜,很難理解其運作方式及解讀結果。 +- 這種缺乏理解影響了系統管理、運作和文件記錄的方式。 +- 更重要的是,這種缺乏理解影響了根據系統輸出結果所做的決策。 -設計和部署人工智慧系統的人必須對其系統的運作方式負責。責任的必要性在面部識別等敏感技術中尤為重要。最近,對面部識別技術的需求不斷增長,特別是來自執法機構的需求,他們看到了該技術在尋找失蹤兒童等用途中的潛力。然而,這些技術可能會被政府用來威脅其公民的基本自由,例如,通過對特定個體進行持續監控。因此,數據科學家和組織需要對其人工智慧系統對個人或社會的影響負責。 +### 問責制 + +設計與部署 AI 系統的人必須對系統的運作負起責任。問責制的必要性在敏感的使用技術如人臉識別中特別重要。近來,人臉識別技術的需求不斷增加,尤其是執法機構看到該技術在尋找失蹤兒童等用途的潛力。然而,這些技術也可能被政府用來危害公民的基本自由,例如對特定個體進行持續監視。因此,資料科學家與組織需要對其 AI 系統對個人或社會的影響負責。 -[![人工智慧研究者警告面部識別可能導致大規模監控](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "微軟的負責任人工智慧方法") +[![領先 AI 研究人員警告人臉識別造成大規模監控](../../../../translated_images/zh-MO/accountability.41d8c0f4b85b6231.webp)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoft 的負責任 AI 方法") -> 🎥 點擊上方圖片觀看影片:面部識別可能導致大規模監控的警告 +> 🎥 點擊上方圖片觀看影片:關於人臉識別引起的大規模監控警告 -最終,作為第一代將人工智慧引入社會的人,我們這一代面臨的最大問題之一是如何確保計算機始終對人類負責,以及如何確保設計計算機的人對其他人負責。 +對我們這一代而言,作為帶來 AI 給社會的第一代,最大的問題之一是如何確保電腦能對人負責,以及如何確保設計電腦的人對其他所有人負責。 ## 影響評估 -在訓練機器學習模型之前,進行影響評估以了解人工智慧系統的目的、預期用途、部署地點以及與系統互動的對象是非常重要的。這些評估對於評審者或測試者來說非常有幫助,因為它們可以知道在識別潛在風險和預期後果時需要考慮哪些因素。 +在訓練機器學習模型之前,進行影響評估非常重要,藉此了解 AI 系統的目的;其預期用途;部署地點;以及誰會與系統互動。這些對評審者或測試者評估系統時了解哪些因素需考慮,以辨識潛在風險及預期後果很有幫助。 進行影響評估時的重點領域包括: -* **對個人的不利影響**:了解任何限制或要求、不支持的用途或任何已知限制對系統性能的影響至關重要,以確保系統不會以可能對個人造成傷害的方式使用。 -* **數據需求**:了解系統如何以及在哪裡使用數據,使評審者能夠探索需要注意的任何數據需求(例如 GDPR 或 HIPPA 數據法規)。此外,檢查數據的來源或數量是否足夠用於訓練。 -* **影響摘要**:收集使用系統可能產生的潛在傷害清單。在機器學習生命周期中,檢查是否已緩解或解決識別出的問題。 -* **適用於六大核心原則的目標**:評估每個原則的目標是否達成,以及是否存在任何差距。 +* 對個人的不良影響。了解任何限制或要求、不支持的用途或已知限制可能影響系統效能,對防止系統以可能對個人造成傷害的方式被使用至關重要。 +* 資料需求。了解系統如何及在哪裡使用資料,讓評審者能探討需要注意的資料要求(如 GDPR 或 HIPAA 資料規則)。此外,檢查資料來源或數量是否足以支持訓練。 +* 影響摘要。彙整使用系統可能帶來的潛在傷害清單。在機器學習生命週期中,檢視已辨識問題是否已緩解或處理。 +* 每項六核心原則的適用目標。評估每項原則的目標是否達成及是否存在缺口。 -## 使用負責任人工智慧進行調試 -與調試軟體應用程式類似,調試人工智慧系統是識別和解決系統問題的必要過程。許多因素可能導致模型未按預期或負責任地運行。大多數傳統的模型性能指標是模型性能的定量匯總,這不足以分析模型如何違反負責任人工智慧原則。此外,機器學習模型是一個黑箱,難以理解其結果的驅動因素或在出錯時提供解釋。在本課程的後續部分,我們將學習如何使用負責任人工智慧儀表板來幫助調試人工智慧系統。該儀表板為數據科學家和人工智慧開發者提供了一個全面的工具,用於執行以下操作: +## 負責任 AI 的除錯 -* **錯誤分析**:識別模型的錯誤分佈,這可能影響系統的公平性或可靠性。 -* **模型概覽**:發現模型在數據群體中的性能差異。 -* **數據分析**:了解數據分佈並識別數據中可能導致公平性、包容性和可靠性問題的潛在偏見。 -* **模型可解釋性**:了解影響或影響模型預測的因素。這有助於解釋模型的行為,這對於透明性和責任感至關重要。 +與軟體應用除錯類似,除錯 AI 系統是辨識及解決系統問題的必要過程。有許多因素會影響模型未如期或不負責任地運作。多數傳統模型效能指標是模型整體表現的定量彙總,這不足以分析模型如何違反負責任 AI 原則。此外,機器學習模型是黑盒,難以理解其產出動因或錯誤時提供解釋。稍後本課程將學習如何利用負責任 AI 儀表板協助除錯 AI 系統。該儀表板為資料科學家與 AI 開發者提供整合工具,能執行: + +* 錯誤分析。辨識可能影響系統公平性或可靠性的模型錯誤分布。 +* 模型概覽。發現模型在各資料群體間效能差異的位置。 +* 資料分析。理解資料分布及辨識資料中可能導致公平性、包容性和可靠性問題的偏見。 +* 模型可解釋性。理解影響模型預測的因素,協助解釋模型行為,對透明度與問責制重要。 -## 🚀 挑戰 -為了防止傷害的產生,我們應該: +## 🚀 挑戰 + +為防止傷害的產生,應該: -- 確保參與系統工作的團隊成員具有多樣化的背景和觀點。 -- 投資於反映社會多樣性的數據集。 -- 在機器學習生命周期中開發更好的方法來檢測和糾正負責任人工智慧問題。 +- 讓從事系統開發的人員背景與觀點多元化 +- 投資反映我們社會多元性的資料集 +- 在整個機器學習生命週期中發展更好的方法來偵測並修正負責任 AI 中的問題 -思考一些現實生活中的情境,模型的不可信性在模型構建和使用中顯而易見。我們還應該考慮什麼? +思考真實情境中模型不可信的例子,無論是在模型建構或使用過程中。我們還應該考慮什麼? ## [課後測驗](https://ff-quizzes.netlify.app/en/ml/) -## 回顧與自學 +## 複習與自學 + -在本課中,您已經學習了機器學習中公平性和不公平性概念的一些基礎知識。 -觀看這場工作坊,深入了解相關主題: +在本課程中,您已學習了機器學習中公平與不公平概念的一些基礎知識。 + +觀看此工作坊以更深入探討相關主題: -- 追求負責任的人工智慧:將原則付諸實踐,由 Besmira Nushi、Mehrnoosh Sameki 和 Amit Sharma 主講 +- 追求負責任的 AI:將原則付諸實踐,講者 Besmira Nushi、Mehrnoosh Sameki 與 Amit Sharma -[![負責任的人工智慧工具箱:建立負責任人工智慧的開源框架](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: 建立負責任人工智慧的開源框架") +[![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: 建立負責任人工智慧的開源框架,由 Besmira Nushi、Mehrnoosh Sameki 和 Amit Sharma 主講 +> 🎥 點擊上方圖片觀看影片:RAI Toolbox:由 Besmira Nushi、Mehrnoosh Sameki 與 Amit Sharma 分享的開源負責任 AI 框架 -此外,閱讀以下資源: +另外,請參閱: -- 微軟的負責任人工智慧資源中心:[負責任人工智慧資源 – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) +- 微軟的 RAI 資源中心:[Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) -- 微軟的 FATE 研究小組:[FATE: 公平性、問責性、透明性與人工智慧倫理 - Microsoft Research](https://www.microsoft.com/research/theme/fate/) +- 微軟的 FATE 研究團隊:[FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) -RAI 工具箱: +RAI 工具箱: -- [負責任人工智慧工具箱 GitHub 儲存庫](https://github.com/microsoft/responsible-ai-toolbox) +- [Responsible AI Toolbox GitHub 存儲庫](https://github.com/microsoft/responsible-ai-toolbox) -了解 Azure 機器學習工具如何確保公平性: +閱讀關於 Azure 機器學習確保公平性的工具: -- [Azure 機器學習](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) ## 作業 @@ -157,5 +161,7 @@ RAI 工具箱: --- -**免責聲明**: -本文件使用 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/zh-MO/2-Regression/1-Tools/README.md b/translations/zh-MO/2-Regression/1-Tools/README.md index 46c4a30c8..8eaba9d72 100644 --- a/translations/zh-MO/2-Regression/1-Tools/README.md +++ b/translations/zh-MO/2-Regression/1-Tools/README.md @@ -1,120 +1,121 @@ -# 使用 Python 和 Scikit-learn 建立回歸模型 +# 使用 Python 和 Scikit-learn 開始迴歸模型 -![回歸模型的概述手繪筆記](../../../../sketchnotes/ml-regression.png) +![迴歸總結手繪筆記](../../../../translated_images/zh-MO/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) +> ### [此課程亦有 R 版本!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) -## 簡介 +## 介紹 -在這四節課中,您將學習如何建立回歸模型。我們很快會討論這些模型的用途。但在開始之前,請確保您已準備好合適的工具來進行這個過程! +在這四課中,你將學習如何建立迴歸模型。我們稍後將討論它們的用途。但在開始操作之前,請先確認你已準備好正確的工具! -在本課程中,您將學到: +本課程你將學習如何: -- 配置您的電腦以進行本地機器學習任務。 +- 設置電腦以進行本地機器學習任務。 - 使用 Jupyter 筆記本。 -- 安裝並使用 Scikit-learn。 -- 通過實際操作探索線性回歸。 +- 使用 Scikit-learn,包括安裝。 +- 透過實作探索線性迴歸。 ## 安裝與配置 -[![機器學習入門 - 配置工具以建立機器學習模型](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "機器學習入門 - 配置工具以建立機器學習模型") +[![機器學習初學者 - 安裝您的工具準備建立機器學習模型](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "機器學習初學者 - 安裝您的工具準備建立機器學習模型") -> 🎥 點擊上方圖片觀看短片,了解如何配置您的電腦以進行機器學習。 +> 🎥 點擊上圖觀看教學影片,示範如何設定電腦以執行機器學習。 -1. **安裝 Python**。確保您的電腦已安裝 [Python](https://www.python.org/downloads/)。Python 是進行許多數據科學和機器學習任務的主要工具。大多數電腦系統已預裝 Python。也有一些 [Python 編碼包](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/) 的基本設置。在本課程中,您將在 Visual Studio Code 中使用 Python,因此可以先熟悉如何 [配置 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/) 以完成基礎安裝。您將在本課程中使用 Visual Studio Code 編寫 Python,建議了解如何 [設定 Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) 作為 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 配置 Python](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "使用 Visual Studio Code 配置 Python") + > [![視覺工作室碼中設定 Python](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "視覺工作室碼中設定 Python") > - > 🎥 點擊上方圖片觀看短片:在 VS Code 中使用 Python。 + > 🎥 點擊上圖觀看教學影片:在 VS Code 使用 Python。 -3. **安裝 Scikit-learn**,按照 [這些指示](https://scikit-learn.org/stable/install.html) 進行安裝。由於需要使用 Python 3,建議使用虛擬環境。如果您是在 M1 Mac 上安裝此庫,請參考上述頁面中的特殊指示。 +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/)。 -## 您的機器學習開發環境 +## 你的機器學習編輯環境 -您將使用 **筆記本** 來開發 Python 程式碼並建立機器學習模型。這種文件格式是數據科學家常用的工具,其文件擴展名為 `.ipynb`。 +你將使用 **notebooks** 來開發 Python 程式碼並建立機器學習模型。這類檔案是資料科學家常用工具,副檔名為 `.ipynb`。 -筆記本是一種互動式環境,允許開發者撰寫程式碼並添加註解或文件,這對於實驗性或研究導向的項目非常有幫助。 +筆記本是一個互動式環境,允許開發人員同時撰寫程式碼、加入筆記及撰寫程式說明,這對實驗性或研究導向專案非常有用。 -[![機器學習入門 - 配置 Jupyter 筆記本以開始建立回歸模型](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "機器學習入門 - 配置 Jupyter 筆記本以開始建立回歸模型") +[![機器學習初學者 - 設定 Jupyter 筆記本開始建立迴歸模型](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "機器學習初學者 - 設定 Jupyter 筆記本開始建立迴歸模型") -> 🎥 點擊上方圖片觀看短片,了解如何進行此操作。 +> 🎥 點擊上圖觀看示範本練習的短片。 -### 練習 - 使用筆記本 +### 練習 - 操作一個 notebook -在此文件夾中,您會找到文件 _notebook.ipynb_。 +在此資料夾中,你會找到檔案 _notebook.ipynb_。 -1. 在 Visual Studio Code 中打開 _notebook.ipynb_。 +1. 在 Visual Studio Code 中開啟 _notebook.ipynb_。 - Jupyter 伺服器將啟動,並使用 Python 3+。您會看到筆記本中的一些區塊可以 `執行`,這些是程式碼片段。您可以通過選擇播放按鈕圖標來執行程式碼區塊。 + 會啟動一個 Python 3+ 的 Jupyter 伺服器。你會看到可執行的程式碼區域。可按一個看似播放鍵的圖示,執行該程式碼區塊。 -2. 選擇 `md` 圖標並添加一些 Markdown,輸入以下文字 **# 歡迎來到您的筆記本**。 +1. 選擇 `md` 圖示,加入一些 markdown 語法和以下文字 **# Welcome to your notebook**。 - 接下來,添加一些 Python 程式碼。 + 接著,加入一些 Python 程式碼。 -3. 在程式碼區塊中輸入 **print('hello notebook')**。 -4. 選擇箭頭以執行程式碼。 +1. 在程式碼區塊鍵入 **print('hello notebook')**。 +1. 按箭頭執行程式碼。 - 您應該會看到以下輸出: + 你應該會看到輸出如下: ```output hello notebook ``` -![在 VS Code 中打開的筆記本](../../../../2-Regression/1-Tools/images/notebook.jpg) +![VS Code 開啟 notebook 的畫面](../../../../translated_images/zh-MO/notebook.4a3ee31f396b8832.webp) -您可以在程式碼中穿插註解,以自我記錄筆記本。 +你可以穿插程式碼與註解,自我記錄 notebook 內容。 -✅ 思考一下,網頁開發者的工作環境與數據科學家的工作環境有何不同。 +✅ 想想看,網頁開發者的工作環境與資料科學家的環境有何不同。 -## 使用 Scikit-learn 入門 +## 使用 Scikit-learn 上手 -現在 Python 已在您的本地環境中設置完成,並且您已熟悉 Jupyter 筆記本,接下來讓我們熟悉 Scikit-learn(發音為 `sci`,像 `science`)。Scikit-learn 提供了 [廣泛的 API](https://scikit-learn.org/stable/modules/classes.html#api-ref),幫助您執行機器學習任務。 +現在你的本地環境已設定好 Python,且熟悉 Jupyter 筆記本,接下來讓我們熟悉 Scikit-learn(發音為「sci」,類似「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 與其他工具建立機器學習模型,以完成我們所稱的“傳統機器學習”任務。我們故意避免使用神經網絡和深度學習,這部分會在即將推出的「AI 初學者」課程中更完整說明。 -Scikit-learn 使建立模型並評估其使用變得簡單。它主要專注於使用數值數據,並包含幾個現成的數據集供學習使用。它還包括一些預建模型供學生嘗試。讓我們探索如何加載預打包數據並使用內建估算器進行第一次機器學習模型的建立。 +Scikit-learn 讓建立模型及評估變得簡單。它主要使用數值資料,並包含多組預先準備好的學習用資料集,也有學生可試用的預建模型。讓我們先探索如何載入預設資料,並用內建的估算器建立首個 Scikit-learn 機器學習模型。 -## 練習 - 您的第一個 Scikit-learn 筆記本 +## 練習 - 你的第一個 Scikit-learn 筆記本 -> 本教程靈感來自 Scikit-learn 網站上的 [線性回歸範例](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py)。 +> 本教學靈感來自 Scikit-learn 網站上的[線性迴歸範例](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py)。 -[![機器學習入門 - 您的第一個 Python 線性回歸項目](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "機器學習入門 - 您的第一個 Python 線性回歸項目") -> 🎥 點擊上方圖片觀看短片,了解如何進行此練習。 +[![機器學習初學者 - 你的第一個 Python 線性迴歸專案](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "機器學習初學者 - 你的第一個 Python 線性迴歸專案") -在與本課程相關的 _notebook.ipynb_ 文件中,按下「垃圾桶」圖標清除所有單元格。 +> 🎥 點擊上圖觀看示範本練習的短片。 -在本節中,您將使用 Scikit-learn 中內建的關於糖尿病的小型數據集進行學習。假設您想測試一種糖尿病患者的治療方法。機器學習模型可能幫助您根據變數的組合,判斷哪些患者對治療的反應更好。即使是非常基本的回歸模型,當可視化時,也可能顯示出有助於組織理論臨床試驗的變數信息。 +在本課程附帶的 _notebook.ipynb_ 檔案中,請按「垃圾桶」圖示清空所有儲存格。 -✅ 回歸方法有很多種類型,選擇哪一種取決於您想要回答的問題。如果您想預測某個年齡的人的可能身高,您會使用線性回歸,因為您尋求的是一個 **數值**。如果您想判斷某種菜餚是否應被視為素食,您尋求的是一個 **類別分配**,因此您會使用邏輯回歸。稍後您將學習更多關於邏輯回歸的內容。思考一下您可以向數據提出哪些問題,以及哪種方法更適合。 +本節中,你將使用 Scikit-learn 內建的一組關於糖尿病的迷你資料集學習。假設你想測試一種糖尿病患者的治療方法。機器學習模型有助判斷哪些病患會較適合此治療方案,基於各變數組合。即使是基本迴歸模型,經視覺化後,也能揭示幫助理論性臨床試驗設計的變數資訊。 -讓我們開始這項任務。 +✅ 有許多迴歸方法,選擇哪種取決於你想得到什麼答案。若想預測特定年齡的人大約身高,則用線性迴歸,因為你想要預測的是數值數據。若要判斷某類料理是不是純素,則是分類任務,會用邏輯迴歸。後續你會進一步學習邏輯迴歸。思考一下你能向數據提出哪些問題,以及用哪種方法較適合。 -### 導入庫 +現在開始動手做吧。 -在此任務中,我們將導入一些庫: +### 匯入函式庫 -- **matplotlib**。這是一個有用的 [繪圖工具](https://matplotlib.org/),我們將使用它來創建折線圖。 -- **numpy**。 [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) 是一個處理 Python 數值數據的有用庫。 -- **sklearn**。這是 [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) 庫。 +本任務我們將匯入一些函式庫: -導入一些庫以幫助完成任務。 +- **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. 輸入以下程式碼以添加導入: +匯入函式庫以協助你的任務。 + +1. 輸入以下程式碼匯入: ```python import matplotlib.pyplot as plt @@ -122,26 +123,26 @@ Scikit-learn 使建立模型並評估其使用變得簡單。它主要專注於 from sklearn import datasets, linear_model, model_selection ``` - 上述程式碼中,您導入了 `matplotlib` 和 `numpy`,並從 `sklearn` 中導入了 `datasets`、`linear_model` 和 `model_selection`。`model_selection` 用於將數據分割為訓練集和測試集。 + 你匯入了 `matplotlib`、`numpy`,以及從 `sklearn` 匯入 `datasets`、`linear_model`、`model_selection`。其中 `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:年齡(以年為單位) +- age:年齡(歲) - bmi:身體質量指數 - bp:平均血壓 - s1 tc:T 細胞(一種白血球) -✅ 此數據集包含「性別」作為研究糖尿病的重要特徵變數。許多醫學數據集都包含這種二元分類。思考一下,這類分類可能如何排除某些群體的治療。 +✅ 此資料集中包含 'sex' 作為對糖尿病研究重要的特徵變數。許多醫療資料集都包含這類二元分類。思考一下這種分類是否可能導致部分族群被排除在治療之外。 -現在,載入 X 和 y 數據。 +接下來,載入 X 與 y 資料。 -> 🎓 記住,這是監督式學習,我們需要一個名為 'y' 的目標。 +> 🎓 記住,這是監督式學習,因此需要命名為 'y' 的目標變量。 -在新的程式碼單元格中,通過調用 `load_diabetes()` 載入糖尿病數據集。輸入 `return_X_y=True` 表示 `X` 將是數據矩陣,而 `y` 將是回歸目標。 +在新的程式碼儲存格中,呼叫 `load_diabetes()` 載入資料集。輸入參數 `return_X_y=True` 表示 `X` 會是資料矩陣,`y` 則是迴歸目標。 -1. 添加一些 print 命令以顯示數據矩陣的形狀及其第一個元素: +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,39 +160,39 @@ 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)選擇第三列。您還可以使用 `reshape(n_rows, n_columns)` 將數據重塑為 2D 數組——這是繪圖所需的格式。如果其中一個參數為 -1,則對應的維度會自動計算。 +2. 接著,挑選資料集其中一部分來繪圖,選取第 3 欄資料。使用 `:` 選取所有列,再用索引 (2) 選取第 3 欄。可用 `reshape(n_rows, n_columns)` 將資料改為二維陣列,是繪圖的需求。若其中一參數是 -1,則自動計算相應維度大小。 ```python X = X[:, 2] X = X.reshape((-1,1)) ``` - ✅ 隨時打印數據以檢查其形狀。 + ✅ 隨時印出資料確認其形狀。 -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. 現在您可以訓練模型了!載入線性回歸模型,並使用 `model.fit()` 訓練您的 X 和 y 訓練集: +4. 準備好後開始訓練模型!載入線性迴歸模型,並用 X 與 y 的訓練集以 `model.fit()` 訓練: ```python model = linear_model.LinearRegression() model.fit(X_train, y_train) ``` - ✅ `model.fit()` 是一個您會在許多機器學習庫(如 TensorFlow)中看到的函數。 + ✅ `model.fit()` 是許多機器學習函式庫(如 TensorFlow)通用的函式。 -5. 然後,使用測試數據創建預測,使用函數 `predict()`。這將用於繪製數據組之間的分割線。 +5. 接著,用測試資料使用 `predict()` 產生預測。它用來繪製模型數據分組間的線條。 ```python y_pred = model.predict(X_test) ``` -6. 現在是時候在圖中顯示數據了。Matplotlib 是完成此任務的非常有用的工具。創建所有 X 和 y 測試數據的散點圖,並使用預測在最合適的位置繪製一條線,分割模型的數據組。 +6. 現在該將資料以圖表呈現。Matplotlib 是此任務中很實用的工具。繪製所有 X 與 y 測試資料的散點圖,再用預測值畫出最適合的分界線。 ```python plt.scatter(X_test, y_test, color='black') @@ -202,29 +203,32 @@ Scikit-learn 使建立模型並評估其使用變得簡單。它主要專注於 plt.show() ``` - ![顯示糖尿病數據點的散點圖](../../../../2-Regression/1-Tools/images/scatterplot.png) -✅ 想一想這裡發生了什麼。一條直線穿過許多小數據點,但它究竟在做什麼?你能否看出如何利用這條直線來預測一個新的、未見過的數據點應該如何與圖表的 y 軸關係匹配?試著用語言描述這個模型的實際用途。 + ![顯示糖尿病資料點的散點圖](../../../../translated_images/zh-MO/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/zh-MO/2-Regression/2-Data/README.md b/translations/zh-MO/2-Regression/2-Data/README.md index 5eecb2be6..1e6edc9e6 100644 --- a/translations/zh-MO/2-Regression/2-Data/README.md +++ b/translations/zh-MO/2-Regression/2-Data/README.md @@ -1,62 +1,62 @@ -# 使用 Scikit-learn 建立回歸模型:準備並視覺化數據 +# 使用 Scikit-learn 建立迴歸模型:準備與視覺化數據 -![數據視覺化資訊圖表](../../../../2-Regression/2-Data/images/data-visualization.png) +![數據視覺化資訊圖](../../../../translated_images/zh-MO/data-visualization.54e56dded7c1a804.webp) -資訊圖表由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 製作 +資訊圖由 [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) ## 簡介 -現在您已經準備好使用 Scikit-learn 開始建立機器學習模型,您可以開始向數據提出問題了。在處理數據並應用機器學習解決方案時,了解如何提出正確的問題以充分發揮數據的潛力是非常重要的。 +現在你已經準備好了開始使用 Scikit-learn 進行機器學習模型構建所需的工具,可以開始對你的數據提出問題。在處理數據並應用機器學習解決方案時,了解如何提出正確的問題以充分發掘資料潛力是非常重要的。 -在本課程中,您將學到: +在本課程中,你將學習: -- 如何為模型建立準備數據。 +- 如何準備數據以用於模型建構。 - 如何使用 Matplotlib 進行數據視覺化。 +- 如何使用 Seaborn 進行更具表現力的數據視覺化。 -## 向數據提出正確的問題 +## 對數據提出正確的問題 -您需要回答的問題將決定您使用哪種類型的機器學習算法。而您得到答案的質量將在很大程度上取決於數據的性質。 +你需要回答的問題會決定你將使用哪種類型的機器學習算法。且你得到的答案品質很大程度上取決於數據的特性。 -看看本課程提供的[數據](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv)。您可以在 VS Code 中打開這個 .csv 文件。快速瀏覽後,您會發現其中有空白值,並且混合了字符串和數字數據。此外,還有一個名為 "Package" 的奇怪列,其中的數據混合了 "sacks"、"bins" 和其他值。事實上,這些數據有些混亂。 +請看看本課程所提供的 [數據](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv)。你可以在 VS Code 中打開這個 .csv 檔案。快速瀏覽會發現有空白,以及字串和數字資料混合。還有一個奇怪的欄位叫做 'Package',裡面的資料混雜了 'sacks'、'bins' 和其他值。這些資料實際上有些混亂。 -[![機器學習初學者 - 如何分析和清理數據集](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "機器學習初學者 - 如何分析和清理數據集") +[![機器學習入門-如何分析與清理數據集](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "機器學習入門-如何分析與清理數據集") -> 🎥 點擊上方圖片觀看一段短片,了解如何準備本課程的數據。 +> 🎥 點擊上方圖片觀看簡短影片,講解本課程數據準備過程。 -事實上,很少能直接獲得完全準備好的數據集來建立機器學習模型。在本課程中,您將學習如何使用標準 Python 庫準備原始數據集。您還將學習各種視覺化數據的技術。 +事實上,直接拿到一個完全準備好用於建立機器學習模型的數據集並不常見。在本課程中,你將學習如何使用標準 Python 函式庫準備原始數據集,並學習各種視覺化數據的技巧。 -## 案例研究:'南瓜市場' +## 案例研究:“南瓜市場” -在此文件夾中,您會在根目錄的 `data` 文件夾中找到一個名為 [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) 的 .csv 文件,其中包含 1757 行有關南瓜市場的數據,按城市分組。這是從美國農業部發布的[特殊作物終端市場標準報告](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice)中提取的原始數據。 +在此資料夾的根目錄 `data` 中,你會找到一個名為 [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) 的 .csv 檔,包含 1757 行關於南瓜市場的數據,依城市分組。這是從美國農業部發布的 [Specialty Crops Terminal Markets Standard Reports](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`)。 -2. 提取月份到新列。 +1. 將日期轉換為月份格式(這是美國日期格式,為 `MM/DD/YYYY`)。 +2. 將月份提取到新的欄位。 -在 Visual Studio Code 中打開 _notebook.ipynb_ 文件,並將電子表格導入到新的 Pandas dataframe 中。 +在 Visual Studio Code 中開啟 _notebook.ipynb_ 檔案,並將試算表導入新的 Pandas dataframe。 -1. 使用 `head()` 函數查看前五行。 +1. 使用 `head()` 函式查看前五行。 ```python import pandas as pd @@ -64,30 +64,30 @@ pumpkins.head() ``` - ✅ 您會使用什麼函數來查看最後五行? + ✅ 你會用什麼函式來查看最後五行? -1. 檢查當前 dataframe 中是否有缺失數據: +1. 檢查目前 dataframe 是否有缺資料: ```python pumpkins.isnull().sum() ``` - 有缺失數據,但可能對當前任務影響不大。 + 有缺資料,但可能對目前任務無大礙。 -1. 為了使 dataframe 更易於操作,使用 `loc` 函數選擇您需要的列。`loc` 函數從原始 dataframe 中提取一組行(作為第一個參數)和列(作為第二個參數)。以下表達式中的 `:` 表示 "所有行"。 +1. 為了讓 dataframe 更易於操作,使用 `loc` 函式選擇你需要的欄位。該函式會從原始 dataframe 中依參數抽取一組列(第一參數)和欄(第二參數)。“:” 表示「所有列」。 ```python columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.loc[:, columns_to_select] ``` -### 其次,確定南瓜的平均價格 +### 其次,計算南瓜平均價格 -思考如何確定某個月份南瓜的平均價格。您會選擇哪些列來完成此任務?提示:您需要 3 列。 +想想如何計算特定月份南瓜的平均價格。你會挑選哪些欄位?提示:你會需要三個欄位。 -解決方案:取 `Low Price` 和 `High Price` 列的平均值來填充新的 Price 列,並將 Date 列轉換為僅顯示月份。幸運的是,根據上述檢查,日期和價格沒有缺失數據。 +解法:取 `Low Price` 和 `High Price` 欄的平均值填入新 `Price` 欄,再將 `Date` 欄只顯示月份。幸好根據先前檢查,日期與價格無缺失資料。 -1. 要計算平均值,添加以下代碼: +1. 計算平均值時,加入下列程式碼: ```python price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 @@ -96,37 +96,37 @@ ``` - ✅ 隨時使用 `print(month)` 打印任何您想檢查的數據。 + ✅ 你也可以用 `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"。南瓜似乎很難一致地稱重,因此讓我們通過選擇 `Package` 列中包含 "bushel" 字符串的南瓜來進行篩選。 +仔細研究原始資料,`Unit of Sale` 為 'EACH' 或 'PER BIN' 的數據,`Package` 一欄也是按英寸、箱或顆計量。南瓜很難一致稱重,因此我們用篩選條件,僅選出 `Package` 欄含有 "bushel" 描述的南瓜。 -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. 在建立 new_pumpkins dataframe 區塊後加入這些程式碼: ```python new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) @@ -134,38 +134,38 @@ 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 中有更多的小南瓜,而大南瓜的空心部分佔用了更多空間。 +✅ 你有注意到半蒲式耳販售的南瓜非常昂貴嗎?能猜出原因嗎?提示:小南瓜比大南瓜貴很多,可能因為一蒲式耳內裝小南瓜數量多,而大中空派南瓜佔用未利用空間。 ## 視覺化策略 -數據科學家的部分職責是展示他們正在處理的數據的質量和性質。為此,他們通常會創建有趣的視覺化,例如圖表、折線圖和柱狀圖,展示數據的不同方面。通過這種方式,他們能夠直觀地展示數據中難以察覺的關係和差距。 +數據科學家的一部分工作就是展示他們處理資料的質量與特性。為此,他們常會製作有趣的視覺化圖表,如圖形、圖表和圖形,展現數據各面向。如此能讓人視覺化呈現關聯與空白,這些通常難以發現。 -[![機器學習初學者 - 如何使用 Matplotlib 視覺化數據](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "機器學習初學者 - 如何使用 Matplotlib 視覺化數據") +[![機器學習入門-如何用 Matplotlib 視覺化數據](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "機器學習入門-如何用 Matplotlib 視覺化數據") -> 🎥 點擊上方圖片觀看一段短片,了解如何視覺化本課程的數據。 +> 🎥 點擊圖片觀看簡短影片,示範本課程中數據視覺化。 -視覺化還可以幫助確定最適合數據的機器學習技術。例如,似乎遵循一條線的散點圖表明該數據非常適合線性回歸練習。 +視覺化也有助於判斷最適合資料的機器學習技術。例如若散佈圖看似線性,表示資料適合線性迴歸。 -一個在 Jupyter notebook 中效果良好的數據視覺化庫是 [Matplotlib](https://matplotlib.org/)(您在上一課中也見過)。 +一個在 Jupyter 筆記本中適用的數據視覺化函式庫是 [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. 在文件頂部的 Pandas 導入下導入 Matplotlib: +1. 在檔案頂端於 Pandas 導入下方加入 Matplotlib: ```python import matplotlib.pyplot as plt ``` -1. 重新運行整個 notebook 以刷新。 -1. 在 notebook 底部添加一個單元格,將數據繪製為框圖: +1. 重新執行整個筆記本來刷新。 +1. 在筆記本底部新增一個程式碼區塊,畫出箱型圖: ```python price = new_pumpkins.Price @@ -174,38 +174,113 @@ plt.show() ``` - ![顯示價格與月份關係的散點圖](../../../../2-Regression/2-Data/images/scatterplot.png) + ![一張散佈圖顯示價格與月份的關係](../../../../translated_images/zh-MO/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/zh-MO/barchart.a833ea9194346d76.webp) + + 這是更有用的資料視覺化!它似乎表示九月和十月的南瓜價格最高。符合你的預期嗎?為什麼或為什麼不? + +## 練習 - 嘗試使用 Seaborn + +Matplotlib 很強大,但可能要寫很多程式碼才能產出精美圖表。[Seaborn](https://seaborn.pydata.org/) 是建立在 Matplotlib 之上的專為統計數據視覺化設計的函式庫。它直接使用 Pandas dataframe,採用吸引人的預設樣式,並能用更少的程式碼創建信息豐富的圖表。因為 Seaborn 回傳 Matplotlib 物件,故你仍可用已掌握的 Matplotlib 知識調整結果。 + +> 如果你還沒安裝 Seaborn,請用 `pip install seaborn` 安裝。 + +1. 在筆記本頂端於其他導入下方加入 Seaborn,慣例名稱為 `sns`: + + ```python + import seaborn as sns + ``` + +### 散佈圖顯示關係 + +在建立模型前探索資料的一大重要步驟是尋找變數之間的 _關聯_。散佈圖是最佳工具之一:若點集看似沿線排列,表示兩變數可能相關,是使用線性迴歸模型的好跡象。 + +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/zh-MO/relplot.a03837d8f0329cec.webp) + + 注意你傳入的是 _欄位名稱_ 及 dataframe,Seaborn 幫你標示軸標籤。 + +2. 傳入 `kind="line"` 可改成折線圖。Seaborn 還會繪製一個顯示信賴區間的陰影帶: + + ```python + sns.relplot(x="Price", y="Month", kind="line", data=new_pumpkins) + ``` + + ![一張用 Seaborn 繪製的價格與月份關係折線圖](../../../../translated_images/zh-MO/lineplot.f9034ba47b1e30ee.webp) + + 這組資料雜訊較多,因此折線圖不是最清晰的選擇 — 但它展示了如何輕鬆更換 Seaborn 的圖表類型。 + +### 條形圖顯示分布 + + +之前你用手動分組的方式,利用 Matplotlib 製作了一個長條圖。Seaborn 的 [`catplot()`](https://seaborn.pydata.org/generated/seaborn.catplot.html)(分類圖)可以幫你處理分組和聚合。預設 `kind="bar"` 會顯示每個類別的平均值,並以黑線標示信賴區間。 + +1. 建立一個每月平均價格的長條圖: + + ```python + sns.catplot(x="Month", y="Price", data=new_pumpkins, kind="bar") + ``` + + ![一個 Seaborn 長條圖顯示每月價格分佈](../../../../translated_images/zh-MO/catplot.e73fc35fdf96242b.webp) + + 這確認了你用 Matplotlib 時看到的結果──價格在九月和十月達到高峰──但 Seaborn 也展示了每個月價格的_變異_情況。 + +### 熱力圖顯示相關性 + +散點圖是比較兩個變數。但當你有多個數值欄時,[熱力圖](https://en.wikipedia.org/wiki/Heat_map)可以同時顯示_每一組_欄位間的關聯強度。這是在選擇要輸入模型的特徵前,找出最相關欄位的常見方式(之後在分類中也會用類似圖表呈現混淆矩陣)。 + +1. 用 Pandas 建立相關矩陣,然後用 Seaborn 的 [`heatmap()`](https://seaborn.pydata.org/generated/seaborn.heatmap.html) 繪製。`annot=True` 選項會在每格中印出相關數值: + + ```python + correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr() + sns.heatmap(correlations, annot=True, cmap="coolwarm") + ``` + + ![一個 Seaborn 熱力圖顯示數值欄間的相關性](../../../../translated_images/zh-MO/heatmap.bd98dce43b404c57.webp) + + 數值接近 `1`(或 `-1`)代表欄位間是強烈的_線性_相關。注意 `Low Price` 和 `High Price` 幾乎完美相關。另一方面,`Month` 和價格呈現的線性相關性很弱──即使上述長條圖顯示了九月和十月有明顯的季節性高峰。這是個重要的教訓:相關係數只衡量_直線_關係,因此會忽略季節性或其他非線性模式。✅ 為什麼在決定使用哪些欄前,同時查看熱力圖像長條圖這種圖形是有用的? + +### Matplotlib 或 Seaborn? + +兩個函式庫都值得學習: + +- **Matplotlib** 讓你能精細控制圖表每個元素,是幾乎所有其他 Python 繪圖函式庫的基礎。 +- **Seaborn** 提供較高階的函式和吸引人的預設統計圖表,能直接操作資料框,且通常更快速用於探索性資料分析。 - 這是一個更有用的數據視覺化!它似乎表明南瓜的最高價格出現在九月和十月。這符合您的預期嗎?為什麼? +一般工作流程是先用 Seaborn 快速探索資料,當需要細部自訂時再使用 Matplotlib。 --- ## 🚀挑戰 -探索 Matplotlib 提供的不同類型的視覺化。哪些類型最適合回歸問題? +探索 Matplotlib 和 Seaborn 提供的不同視覺化類型。哪些類型最適合回歸問題? ## [課後測驗](https://ff-quizzes.netlify.app/en/ml/) -## 回顧與自學 +## 複習與自修 -看看數據視覺化的多種方式。列出可用的各種庫,並記錄哪些庫最適合特定類型的任務,例如 2D 視覺化與 3D 視覺化。您發現了什麼? +認識各種視覺化資料的方法,列出不同的函式庫,並註明它們各自在任務類型上的最佳用途,例如 2D 視覺化與 3D 視覺化。你有什麼發現? ## 作業 @@ -213,5 +288,7 @@ --- -**免責聲明**: -本文件已使用 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/zh-MO/2-Regression/2-Data/solution/notebook.ipynb b/translations/zh-MO/2-Regression/2-Data/solution/notebook.ipynb index 89162d978..d3424a5db 100644 --- a/translations/zh-MO/2-Regression/2-Data/solution/notebook.ipynb +++ b/translations/zh-MO/2-Regression/2-Data/solution/notebook.ipynb @@ -3,7 +3,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "## 南瓜線性回歸 - 第二課\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": [ + "## 使用 Seaborn 進行視覺化\n", + "\n", + "[Seaborn](https://seaborn.pydata.org/) 是建立在 Matplotlib 之上,並可直接與資料框(dataframes)配合使用,使得用極少的程式碼快速建立吸引人的統計圖表成為可能。\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": [] + "source": [ + "sns.catplot(x=\"Month\", y=\"Price\", data=new_pumpkins, kind=\"bar\")" + ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**免責聲明**: \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。\n" + "### 熱力圖展示相關性\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**免責聲明**:\n本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們力求準確,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議尋求專業人工翻譯。我們不對因使用本翻譯而引起的任何誤解或曲解承擔責任。\n\n" ] } ], @@ -424,13 +487,7 @@ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" } }, - "orig_nbformat": 2, - "coopTranslator": { - "original_hash": "95726f0b8283628d5356a4f8eb8b4b76", - "translation_date": "2025-08-29T23:10:55+00:00", - "source_file": "2-Regression/2-Data/solution/notebook.ipynb", - "language_code": "mo" - } + "orig_nbformat": 2 }, "nbformat": 4, "nbformat_minor": 2 diff --git a/translations/zh-MO/8-Reinforcement/1-QLearning/README.md b/translations/zh-MO/8-Reinforcement/1-QLearning/README.md index aa49d9a63..ccc00b267 100644 --- a/translations/zh-MO/8-Reinforcement/1-QLearning/README.md +++ b/translations/zh-MO/8-Reinforcement/1-QLearning/README.md @@ -1,47 +1,47 @@ # 強化學習與 Q-Learning 簡介 -![機器學習中強化學習的摘要示意圖](../../../../sketchnotes/ml-reinforcement.png) -> 示意圖由 [Tomomi Imura](https://www.twitter.com/girlie_mac) 提供 +![機器學習中強化學習的概念速寫](../../../../translated_images/zh-MO/ml-reinforcement.94024374d63348db.webp) +> 速寫作者:[Tomomi Imura](https://www.twitter.com/girlie_mac) -強化學習涉及三個重要概念:代理(agent)、一些狀態(states)以及每個狀態的一組行動(actions)。代理通過在特定狀態執行某個行動,會獲得一個獎勵。想像一下電腦遊戲《超級瑪利歐》。你是瑪利歐,處於遊戲的一個關卡中,站在懸崖邊上。你的上方有一枚金幣。你作為瑪利歐,處於遊戲關卡中的某個特定位置……這就是你的狀態。向右移動一步(行動)會讓你掉下懸崖,並獲得一個低分數。然而,按下跳躍按鈕可以讓你獲得一分並保持存活。這是一個正面的結果,應該給予你一個正的數值分數。 +強化學習涉及三個重要概念:代理人(agent)、一些狀態(states),以及每個狀態下的一組行動。透過在特定狀態執行一個行動,代理人會獲得一個獎勵。再次想像電腦遊戲《超級瑪利歐》。你是瑪利歐,你在一個遊戲關卡中,站在懸崖邊緣。上方有一個硬幣。你扮演的瑪利歐,在關卡內一個特定位置……這就是你的狀態。向右走一步(行動)會讓你掉下懸崖,這會給你一個低分數。然而,按下跳躍鍵會讓你獲得一分,並且你會繼續存活。這是一個正向的結果,應該給予你一個正的數值獎勵。 -通過使用強化學習和模擬器(遊戲),你可以學習如何玩遊戲以最大化獎勵,即保持存活並獲得盡可能多的分數。 +透過使用強化學習和模擬器(遊戲),你可以學習如何玩遊戲以最大化獎勵,也就是保持存活並盡可能多得分。 -[![強化學習簡介](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) -> 🎥 點擊上方圖片觀看 Dmitry 討論強化學習 +> 🎥 點擊上方圖片收聽 Dmitry 討論強化學習 -## [課前測驗](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)** 的世界,靈感來自俄羅斯作曲家 [Sergei Prokofiev](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)是一種學習技術,允許我們通過大量實驗來學習代理人在某個環境中最佳行為。代理人在此環境中應有明確的目標,以獎勵函數表示。 ## 環境 -為了簡化,我們將彼得的世界設想為一個大小為 `width` x `height` 的方形棋盤,如下所示: +為簡化起見,我們假設彼得的世界是一個大小為 `寬度` x `高度` 的方形棋盤,如下所示: -![彼得的環境](../../../../8-Reinforcement/1-QLearning/images/environment.png) +![彼得的環境](../../../../translated_images/zh-MO/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()) } ``` -總結一下,此場景的策略和目標如下: +總結來說,此場景的策略與目標如下: -- **策略**:代理(彼得)的策略由所謂的**政策**定義。政策是一個函數,能在任何給定狀態下返回行動。在我們的例子中,問題的狀態由棋盤表示,包括玩家的當前位置。 +- 策略,代理人(彼得)的策略由所謂的策略函數(policy)定義。策略是一個函數,輸入任一狀態即返回該狀態下的行動。在此,我們的問題狀態由棋盤包括玩家當前位置表示。 -- **目標**:強化學習的目標是最終學習一個良好的政策,使我們能有效地解決問題。然而,作為基準,我們先考慮最簡單的政策,稱為**隨機行走**。 +- 目標,強化學習的目標是最終學到一個優良策略,能有效解決問題。然而,作為基準,先考慮最簡單的策略稱為隨機漫步。 -## 隨機行走 +## 隨機漫步 -首先,我們通過實現隨機行走策略來解決問題。在隨機行走中,我們將從允許的行動中隨機選擇下一個行動,直到到達蘋果(程式碼塊 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,43 +154,115 @@ def reward(m,pos=None): return move_reward ``` -獎勵函數的一個有趣之處在於,大多數情況下,*只有在遊戲結束時才會給予實質性獎勵*。這意味著我們的算法應該以某種方式記住導致正面獎勵的“好”步驟,並增加它們的重要性。同樣,所有導致不良結果的移動應該被抑制。 +有趣的是,獎勵函數多數情況下,我們只會在遊戲結束時得到顯著的獎勵。這意味著我們的算法應該記憶導致結束時正面獎勵的「好」步驟,並加強它們的重要性。類似地,所有導致壞結果的移動應被削弱。 ## Q-Learning -我們將討論的算法稱為 **Q-Learning**。在此算法中,政策由一個函數(或數據結構)定義,稱為 **Q-Table**。它記錄了在給定狀態下每個行動的“好壞程度”。 +我們將介紹一個稱為 **Q-Learning** 的算法。在此算法中,策略由一個函數(或資料結構)稱為Q-表格定義。它記錄在給定狀態中各行動的「優劣」。 -之所以稱為 Q-Table,是因為將其表示為表格或多維數組通常很方便。由於我們的棋盤尺寸為 `width` x `height`,我們可以使用形狀為 `width` x `height` x `len(actions)` 的 numpy 數組來表示 Q-Table:(程式碼塊 6) +它稱為 Q-表,因為通常會以表格或多維陣列形式呈現。由於我們的棋盤是 `寬度` x `高度`,可用 numpy 陣列表示 Q-表,形狀為 `寬度` x `高度` x `len(actions)`:(程式碼塊 6) ```python Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) ``` -注意,我們將 Q-Table 的所有值初始化為相等值,在我們的例子中為 0.25。這對應於“隨機行走”政策,因為每個狀態中的所有移動都是同樣好的。我們可以將 Q-Table 傳遞給 `plot` 函數,以便在棋盤上可視化該表格:`m.plot(Q)`。 +注意我們以相同數值初始化 Q-表的所有值,在此為 0.25,對應「隨機漫步」策略,因為每狀態的行動同樣優劣。我們可以將 Q-表傳給 `plot` 函數,在棋盤中視覺化:`m.plot(Q)`。 -![彼得的環境](../../../../8-Reinforcement/1-QLearning/images/env_init.png) +![彼得的環境](../../../../translated_images/zh-MO/env_init.04e8f26d2d60089e.webp) -在每個格子的中心有一個“箭頭”,指示移動的首選方向。由於所有方向都是相等的,因此顯示為一個點。 +每格中心有一個「箭頭」指示偏好的移動方向。若所有方向相等,則顯示點。 -現在我們需要運行模擬,探索環境,並學習更好的 Q-Table 值分佈,這將使我們能更快地找到蘋果的路徑。 +現在我們要運行模擬,探索環境,學習較佳的 Q-表值分布,讓我們更快找到蘋果路徑。 -## Q-Learning 的核心:貝爾曼方程 +## Q-Learning 的本質:Bellman 方程式 -一旦我們開始移動,每個行動都會有相應的獎勵,即我們理論上可以根據最高的即時獎勵選擇下一個行動。然而,在大多數狀態下,移動並不能實現我們到達蘋果的目標,因此我們無法立即決定哪個方向更好。 +一旦開始移動,每個行動會有相應獎勵,即理論上可依最高即時獎勵選擇下一行動。但在多數狀態,行動無法馬上達成找蘋果目標,因此無法立即決定較佳方向。 -> 記住,重要的不是即時結果,而是最終結果,即我們在模擬結束時獲得的結果。 +> 請記住,不是即時結果重要,而是模擬結束時取得的最終結果。 -為了考慮這種延遲獎勵,我們需要使用 **[動態規劃](https://en.wikipedia.org/wiki/Dynamic_programming)** 的原則,這使我們能以遞歸方式思考問題。 +為了考慮此延遲獎勵,我們需使用[動態規劃](https://en.wikipedia.org/wiki/Dynamic_programming)的原理,讓我們以遞迴思考問題。 -假設我們現在處於狀態 *s*,並希望移動到下一個狀態 *s'*。通過這樣做,我們將獲得由獎勵函數定義的即時獎勵 *r(s,a)*,加上一些未來的獎勵。如果我們假設 Q-Table 正確反映了每個行動的“吸引力”,那麼在狀態 *s'* 我們將選擇對應於 *Q(s',a')* 最大值的行動 *a'*。因此,我們在狀態 *s* 能夠獲得的最佳未來獎勵將由 `max` 定義: +假設我們處於狀態 *s*,想移動到下一狀態 *s'*;此時會得到即時獎勵 *r(s,a)* 為函數定義,再加上一些未來獎勵。若假設 Q-表正確反映每行動「吸引力」,則在狀態 *s'* 會選擇行動 *a*,使 *Q(s',a')* 達最大值。故狀態 *s* 可取得的最佳未來獎勵定義為 `max`a'*Q(s',a')*(此處最大化運算涵蓋狀態 *s'* 所有可能行動 *a'*)。 -*Q(s',a')*(此處的最大值是針對狀態 *s'* 下所有可能行動 *a'* 計算的)。 +這給出在狀態 *s*、行動 *a* 下計算 Q-表值的 **Bellman 公式**: -這給出了計算狀態 *s* 下行動 *a* 的 Q-Table 值的 **貝爾曼公式**: + -## 檢查政策 +這裡的 γ 是所謂的折扣因子,決定你應多偏好當前獎勵還是未來獎勵。 -由於 Q-Table 列出了每個狀態下每個行動的「吸引力」,因此使用它來定義我們世界中的高效導航非常簡單。在最簡單的情況下,我們可以選擇對應於最高 Q-Table 值的行動:(程式碼區塊 9) +## 學習算法 + +基於上述方程式,我們現在可以寫出學習算法的伪代碼: + +* 用相同數值初始化 Q-表 Q,涵蓋所有狀態和行動 +* 設定學習率 α ← 1 +* 重複多次模擬 + 1. 從隨機位置開始 + 1. 重複 + 1. 在狀態 *s* 選擇行動 *a* + 2. 執行行動,移動到新狀態 *s'* + 3. 若遇遊戲結束條件或總獎勵過小,退出模擬 + 4. 計算新狀態的獎勵 *r* + 5. 根據 Bellman 方程更新 Q 函數:*Q(s,a)* ← *(1-α)Q(s,a)+α(r+γ maxa'Q(s',a'))* + 6. *s* ← *s'* + 7. 更新總獎勵並降低 α。 + +## 利用(exploit)與探索(explore) + +在上述算法中,我們未指定在 2.1 步驟如何選擇行動。若隨機選擇行動,我們會隨機探索環境,可能經常死亡且探索不常去的區域;另一方法是利用我們已知的 Q-表值,在狀態 *s* 選擇最佳行動(Q-表值高)。但此舉會阻礙探索其他狀態,可能無法找到最優解。 + +因此,最佳策略是在探索和利用間取得平衡。可根據 Q-表值按比例選擇狀態 *s* 下的行動。起初當 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 次實驗(稱為 **epoch**)執行學習算法:(程式碼塊 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) ```python def qpolicy_strict(m): @@ -202,17 +274,18 @@ def qpolicy_strict(m): walk(m,qpolicy_strict) ``` -> 如果多次嘗試上述程式碼,您可能會注意到有時它會「卡住」,需要按下筆記本中的 STOP 按鈕來中斷執行。這是因為可能存在某些情況,兩個狀態在最佳 Q-Value 上「指向」彼此,導致代理不斷在這些狀態之間移動。 + +> 如果你多次嘗試上述代碼,你可能會注意到有時它會「卡住」,你需要按下筆記本中的停止按鈕來中斷它。這是因為可能存在兩個狀態在最佳 Q 值方面「互相指向」的情況,在這種情況下,代理會無限地在這些狀態之間移動。 ## 🚀挑戰 -> **任務 1:** 修改 `walk` 函數,限制路徑的最大長度為一定步數(例如 100),並觀察上述程式碼有時會返回此值。 +> **任務 1:** 修改 `walk` 函數,使路徑的最大長度限制為一定步數(例如 100 步),並觀察上述代碼時不時返回該值。 -> **任務 2:** 修改 `walk` 函數,使其不會回到之前已經到過的地方。這將防止 `walk` 進入循環,但代理仍可能被「困住」在無法逃脫的位置。 +> **任務 2:** 修改 `walk` 函數,使其不返回之前已經去過的地方。這將防止 `walk` 進入循環,但代理仍可能被困在一個無法逃脫的位置。 ## 導航 -更好的導航政策是我們在訓練期間使用的政策,它結合了利用和探索。在此政策中,我們將以一定的概率選擇每個行動,該概率與 Q-Table 中的值成比例。此策略可能仍會導致代理返回到已探索過的位置,但正如您從以下程式碼中看到的,它會導致到達目標位置的平均路徑非常短(請記住,`print_statistics` 會模擬 100 次):(程式碼區塊 10) +一個更好的導航策略是我們在訓練時使用的,結合了利用和探索。在這個策略中,我們會以一定的概率選擇每個動作,概率與 Q 表中的值成比例。這種策略仍可能導致代理返回之前已經探索過的位置,但正如你從下面代碼中看到的,它能使到達目標位置的平均路徑非常短(記住 `print_statistics` 會運行模擬 100 次):(代碼塊 10) ```python def qpolicy(m): @@ -224,28 +297,32 @@ def qpolicy(m): print_statistics(qpolicy) ``` -執行此程式碼後,您應該會得到比之前更短的平均路徑長度,範圍約為 3-6。 +執行此代碼後,你應該會得到比之前小得多的平均路徑長度,約在 3-6 步之間。 + +## 探討學習過程 -## 探索學習過程 +如我們所述,學習過程是在問題空間結構的探索與利用間的平衡。我們已見到學習結果(幫助代理找到目標短路徑的能力)有所提升,但觀察平均路徑長度在學習過程中的變化同樣有趣: -如前所述,學習過程是在探索和利用已獲得的問題空間結構知識之間取得平衡。我們已經看到學習的結果(幫助代理找到通往目標的短路徑的能力)有所改善,但觀察平均路徑長度在學習過程中的變化也很有趣: + -學習過程可以總結如下: +學習總結如下: -- **平均路徑長度增加**。我們看到的是,起初平均路徑長度增加。這可能是因為當我們對環境一無所知時,很容易陷入不良狀態,例如水或狼。隨著我們學到更多並開始利用這些知識,我們可以更長時間地探索環境,但仍然不太清楚蘋果的位置。 +- 平均路徑長度增加。我們看到一開始平均路徑長度增加。這可能是因為當我們對環境一無所知時,容易陷入不良狀態,如水域或狼群。隨著學習更多並開始利用這些知識,我們能更長時間探索環境,但對蘋果的位置還不夠清楚。 -- **隨著學習的深入,路徑長度減少**。一旦我們學到足夠的知識,代理更容易達成目標,路徑長度開始減少。然而,我們仍然保持探索的開放性,因此經常偏離最佳路徑,探索新的選項,導致路徑比最佳路徑更長。 +- **隨著學習增多,路徑長度下降**。一旦學習足夠,代理達成目標變得更容易,路徑長逐漸縮短。然而,我們仍保持探索,因此常偏離最佳路徑,嘗試新選項,導致路徑比理想的更長。 -- **路徑長度突然增加**。我們在圖表上還觀察到某些時候路徑長度突然增加。這表明過程的隨機性,並且我們可能在某些時候通過覆蓋新值「破壞」了 Q-Table 的係數。理想情況下,這應該通過降低學習率來最小化(例如,在訓練結束時,我們僅以小值調整 Q-Table 的值)。 +- 路徑長度突然增加。圖中也可觀察到某些時候路徑長度突然增加,這顯示出過程的隨機特性,某些時刻我們可能會透過新值覆寫而「破壞」Q 表係數。理想中應透過降低學習率(如訓練後期僅修正 Q 表的值很小)來減少這種情況。 -總體而言,重要的是要記住,學習過程的成功和質量在很大程度上取決於參數,例如學習率、學習率衰減和折扣因子。這些通常被稱為 **超參數**,以區分 **參數**,即我們在訓練期間優化的內容(例如 Q-Table 的係數)。尋找最佳超參數值的過程稱為 **超參數優化**,這是一個值得單獨討論的主題。 +總的來說,重要的是記住學習過程的成功與質量嚴重依賴於參數,比如學習率、學習率衰減和折扣因子。這些通常稱為 超參數,以區別於我們在訓練中優化的 參數(例如 Q 表係數)。尋找最佳超參數值的過程稱為 超參數優化,是個值得獨立討論的主題。 -## [課後測驗](https://ff-quizzes.netlify.app/en/ml/) +## [課後小測驗](https://ff-quizzes.netlify.app/en/ml/) -## 作業 -[更真實的世界](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/zh-TW/.co-op-translator.json b/translations/zh-TW/.co-op-translator.json index 894528eaf..daf9f1a07 100644 --- a/translations/zh-TW/.co-op-translator.json +++ b/translations/zh-TW/.co-op-translator.json @@ -24,8 +24,8 @@ "language_code": "zh-TW" }, "1-Introduction/3-fairness/README.md": { - "original_hash": "9a6b702d1437c0467e3c5c28d763dac2", - "translation_date": "2025-09-05T09:52:29+00:00", + "original_hash": "0f00d72169a0d37eecfd16d71e01700a", + "translation_date": "2026-07-14T08:11:13+00:00", "source_file": "1-Introduction/3-fairness/README.md", "language_code": "zh-TW" }, @@ -54,8 +54,8 @@ "language_code": "zh-TW" }, "2-Regression/1-Tools/README.md": { - "original_hash": "fa81d226c71d5af7a2cade31c1c92b88", - "translation_date": "2025-09-05T09:44:11+00:00", + "original_hash": "0b8635427b582d03ea4ab7089b93e505", + "translation_date": "2026-07-14T08:07:25+00:00", "source_file": "2-Regression/1-Tools/README.md", "language_code": "zh-TW" }, @@ -72,8 +72,8 @@ "language_code": "zh-TW" }, "2-Regression/2-Data/README.md": { - "original_hash": "7c077988328ebfe33b24d07945f16eca", - "translation_date": "2025-09-05T09:45:20+00:00", + "original_hash": "a58b2c4d16c6b122643391745ac15af6", + "translation_date": "2026-07-14T08:08:50+00:00", "source_file": "2-Regression/2-Data/README.md", "language_code": "zh-TW" }, @@ -89,6 +89,12 @@ "source_file": "2-Regression/2-Data/solution/Julia/README.md", "language_code": "zh-TW" }, + "2-Regression/2-Data/solution/notebook.ipynb": { + "original_hash": "96b95f8cf473481f2f371de8156f1571", + "translation_date": "2026-07-14T07:42:36+00:00", + "source_file": "2-Regression/2-Data/solution/notebook.ipynb", + "language_code": "zh-TW" + }, "2-Regression/3-Linear/README.md": { "original_hash": "8b776e731c35b171d316d01d0e7b1369", "translation_date": "2026-04-26T20:35:22+00:00", @@ -457,7 +463,7 @@ }, "8-Reinforcement/1-QLearning/README.md": { "original_hash": "911efd5e595089000cb3c16fce1beab8", - "translation_date": "2025-09-05T09:58:52+00:00", + "translation_date": "2026-07-14T08:10:05+00:00", "source_file": "8-Reinforcement/1-QLearning/README.md", "language_code": "zh-TW" }, @@ -581,6 +587,19 @@ "source_file": "TROUBLESHOOTING.md", "language_code": "zh-TW" }, + "__translation_failures__": { + "sketchnotes/LICENSE.md": { + "original_hash": "fba3b94d88bfb9b81369b869a1e9a20f", + "source_file": "sketchnotes/LICENSE.md", + "language_code": "zh-TW", + "failure_date": "2026-07-14T08:06:19+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-03T17:21:34+00:00", diff --git a/translations/zh-TW/1-Introduction/3-fairness/README.md b/translations/zh-TW/1-Introduction/3-fairness/README.md index 93c93c666..2dc81114c 100644 --- a/translations/zh-TW/1-Introduction/3-fairness/README.md +++ b/translations/zh-TW/1-Introduction/3-fairness/README.md @@ -1,161 +1,167 @@ -# 使用負責任的人工智慧建構機器學習解決方案 - -![機器學習中負責任 AI 的摘要草圖](../../../../sketchnotes/ml-fairness.png) -> 草圖由 [Tomomi Imura](https://www.twitter.com/girlie_mac) 提供 +# 建立負責任 AI 的機器學習解決方案 + +![機器學習中負責任 AI 的摘要手繪筆記](../../../../translated_images/zh-TW/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 模型行為的必要性。 -- 意識到責任感對於建立 AI 系統信任的重要性。 +- 提升您對機器學習中公平性重要性及相關傷害的意識。 +- 熟悉探索異常值和不尋常情況以確保可靠性與安全性的做法。 +- 理解設計包容系統以賦能所有人的必要性。 +- 探索保護數據及個人隱私安全的重要性。 +- 了解採用透明(玻璃盒)方法解釋 AI 模型行為的重要性。 +- 注意問責制對於建立對 AI 系統信任的重要性。 -## 先修條件 +## 預備知識 -作為先修條件,請完成「負責任 AI 原則」學習路徑,並觀看以下主題的影片: +作為先修,請完成《負責任 AI 原則》學習路徑,並觀看以下相關主題影片: -通過以下 [學習路徑](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) 了解更多關於負責任 AI 的資訊。 +透過此[學習路徑](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)深入了解負責任 AI -[![Microsoft 的負責任 AI 方法](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoft 的負責任 AI 方法") +[![微軟負責任 AI 方法](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "微軟負責任 AI 方法") -> 🎥 點擊上方圖片觀看影片:Microsoft 的負責任 AI 方法 +> 🎥 點擊上方圖片觀看影片:微軟負責任 AI 方法 ## 公平性 -AI 系統應該公平對待每個人,避免對相似群體的人產生不同的影響。例如,當 AI 系統提供醫療建議、貸款申請或就業建議時,應該對具有相似症狀、財務狀況或專業資格的人給出相同的建議。我們每個人作為人類,都帶有影響我們決策和行動的固有偏見。這些偏見可能會體現在我們用來訓練 AI 系統的數據中。有時這種操控是無意的,並且很難有意識地知道何時在數據中引入了偏見。 +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/zh-TW/gender-bias-translate-en-tr.f185fd8822c2d437.webp) > 翻譯成土耳其語 -![翻譯回英語](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) -> 翻譯回英語 +![再翻譯回英文](../../../../translated_images/zh-TW/gender-bias-translate-tr-en.4eee7e3cecb8c70e.webp) +> 再翻譯回英文 -在設計和測試 AI 系統時,我們需要確保 AI 是公平的,並且未被編程為做出偏見或歧視性的決策,這些決策是人類也被禁止做出的。保證 AI 和機器學習的公平性仍然是一個複雜的社會技術挑戰。 +在設計和測試 AI 系統時,我們需確保 AI 公平,不受偏見或歧視決策控制,而人類亦被禁止做此類決策。要保證 AI 和機器學習的公平仍是複雜的社會技術挑戰。 ### 可靠性與安全性 -為了建立信任,AI 系統需要在正常和意外情況下保持可靠、安全和一致。了解 AI 系統在各種情境下的行為,尤其是在異常情況下的行為,是非常重要的。在構建 AI 解決方案時,需要大量關注如何處理 AI 解決方案可能遇到的各種情況。例如,自駕車需要將人們的安全放在首位。因此,驅動汽車的 AI 需要考慮汽車可能遇到的所有可能情境,例如夜晚、雷暴或暴風雪、孩子橫穿馬路、寵物、道路施工等。AI 系統能夠可靠、安全地處理廣泛條件的能力反映了數據科學家或 AI 開發者在系統設計或測試過程中考慮的預見性水平。 +為建立信任,AI 系統需在正常及意外情況下保持可靠、安全和一致。了解 AI 在各種情境下(尤其是異常狀況)的行為很重要。建構 AI 解決方案時,必須大量聚焦如何處理 AI 可能遇到的各種狀況。例如,自駕車必須將人身安全列為最高優先。結果,自駕車所用 AI 需考慮所有可能面臨的情況,如夜晚、雷暴或暴風雪、小孩突然跑過馬路、寵物、道路施工等。AI 系統在寬廣情況下的可靠與安全處理能力,反映了資料科學家或 AI 開發者在系統設計與測試階段的預見程度。 > [🎥 點擊這裡觀看影片:](https://www.microsoft.com/videoplayer/embed/RE4vvIl) ### 包容性 -AI 系統應該被設計為能夠吸引並賦能每個人。在設計和實施 AI 系統時,數據科學家和 AI 開發者需要識別並解決系統中可能無意排除某些人的潛在障礙。例如,全球有 10 億人有殘疾。隨著 AI 的進步,他們可以更輕鬆地獲取廣泛的資訊和機會。通過解決這些障礙,可以創造創新機會,開發出能為每個人帶來更好體驗的 AI 產品。 - -> [🎥 點擊這裡觀看影片:AI 中的包容性](https://www.microsoft.com/videoplayer/embed/RE4vl9v) +AI 系統設計應涵蓋並賦能每個人。設計和實施 AI 系統時,資料科學家和 AI 開發者需發掘並消除可能無意排斥某些人的障礙。例如,全球約有 10 億身心障礙者。隨著 AI 進步,他們能更輕鬆地獲得資訊和機會。藉由消除障礙,促成創新,開發體驗更佳、惠及所有人的 AI 產品。 -### 安全性與隱私 +> [🎥 點擊這裡觀看影片:AI 的包容性](https://www.microsoft.com/videoplayer/embed/RE4vl9v) -AI 系統應該是安全的,並尊重人們的隱私。人們對那些可能危及隱私、資訊或生命的系統信任度較低。在訓練機器學習模型時,我們依賴數據來產生最佳結果。在此過程中,必須考慮數據的來源和完整性。例如,數據是用戶提交的還是公開可用的?接下來,在處理數據時,開發能夠保護機密資訊並抵禦攻擊的 AI 系統至關重要。隨著 AI 的普及,保護隱私和確保重要的個人和商業資訊的安全變得越來越重要且複雜。隱私和數據安全問題需要特別關注,因為數據的可訪問性對於 AI 系統做出準確且有根據的預測和決策至關重要。 +### 安全與隱私 -> [🎥 點擊這裡觀看影片:AI 中的安全性](https://www.microsoft.com/videoplayer/embed/RE4voJF) +AI 系統需要安全且尊重個人隱私。民眾較不信任可能危害隱私、資訊或生命安全的系統。訓練機器學習模型時,我們依賴數據得出最佳結果,因此必須考慮數據來源與完整性。例如,數據是由用戶提交還是公開可用?在使用數據時,建立能保護機密信息且抵抗攻擊的 AI 系統至關重要。隨著 AI 越來越普及,保護隱私與重要個人及企業資訊變得愈加關鍵且複雜。AI 特別需要密切關注隱私和資料安全議題,因為 AI 系統獲取數據是做出準確且有根據判斷的基礎。 -- 作為一個行業,我們在隱私和安全性方面取得了顯著進展,這在很大程度上得益於 GDPR(通用數據保護條例)等法規的推動。 -- 然而,對於 AI 系統,我們必須承認在需要更多個人數據以使系統更個性化和有效與隱私之間的緊張關係。 -- 就像互聯網誕生時連接電腦一樣,我們也看到了與 AI 相關的安全問題數量的急劇增加。 -- 同時,我們也看到 AI 被用於改善安全性。例如,大多數現代防病毒掃描器今天都由 AI 啟發式技術驅動。 -- 我們需要確保我們的數據科學流程與最新的隱私和安全實踐和諧融合。 +> [🎥 點擊這裡觀看影片:AI 的安全性](https://www.microsoft.com/videoplayer/embed/RE4voJF) -### 透明性 +- 整個產業在隱私與安全方面已有顯著進展,很大程度受 GDPR(一般資料保護規範)等法規推動。 +- 但對 AI 系統而言,必須承認在提升系統個人化與效能與保障隱私間的緊張關係。 +- 正如連網電腦誕生初期,我們也觀察到 AI 相關安全問題大幅增加。 +- 同時,AI 也被用來強化安全。例如,大多數現代防毒掃描器如今以 AI 啟發式法則驅動。 +- 我們必須確保數據科學流程與最新隱私及安全實踐和諧合作。 -AI 系統應該是可理解的。透明性的一個關鍵部分是解釋 AI 系統及其組件的行為。提高對 AI 系統的理解需要利益相關者了解它們如何以及為什麼運作,以便能夠識別潛在的性能問題、安全和隱私問題、偏見、排他性實踐或意外結果。我們還認為,使用 AI 系統的人應該誠實並坦率地說明何時、為什麼以及如何選擇部署它們,以及它們使用的系統的局限性。例如,如果一家銀行使用 AI 系統來支持其消費者貸款決策,則需要檢查結果並了解哪些數據影響了系統的建議。各國政府開始對各行業的 AI 進行監管,因此數據科學家和組織必須解釋 AI 系統是否符合監管要求,特別是在出現不良結果時。 -> [🎥 點擊這裡觀看影片:AI 中的透明性](https://www.microsoft.com/videoplayer/embed/RE4voJF) +### 透明度 +AI 系統應該是可理解的。透明度的關鍵在於解釋 AI 系統及其組件的行為。要改善對 AI 系統的理解,持份者需明白系統如何及為何運作,以便識別潛在的性能問題、安全與隱私疑慮、偏見、排斥行為或非預期結果。我們也認為 AI 使用者應坦誠說明何時、為何以及如何部署 AI 系統,以及他們所用系統的限制。例如,若銀行使用 AI 支援其消費者貸款決策,重要的是檢視結果並了解哪些數據影響系統推薦。政府開始針對各行業管控 AI,故資料科學家和組織需說明 AI 系統是否符合法規,特別是當出現不良結果時。 -- 由於 AI 系統非常複雜,很難理解它們的運作方式並解釋結果。 -- 這種缺乏理解影響了這些系統的管理、運營和文檔化方式。 -- 更重要的是,這種缺乏理解影響了基於這些系統產生的結果所做的決策。 +> [🎥 點擊這裡觀看影片:AI 的透明度](https://www.microsoft.com/videoplayer/embed/RE4voJF) -### 責任 +- 由於 AI 系統十分複雜,理解其工作原理及解釋結果均不易。 +- 這種理解不足影響系統的管理、運作和文件編制。 +- 更重要的是,影響依據系統產出結果做決策的品質。 -設計和部署 AI 系統的人必須對其系統的運作方式負責。責任的必要性在面部識別等敏感技術的使用中尤為重要。最近,對面部識別技術的需求不斷增長,特別是來自執法機構,他們看到了該技術在尋找失蹤兒童等用途中的潛力。然而,這些技術可能會被政府用來威脅其公民的基本自由,例如,對特定個體進行持續監控。因此,數據科學家和組織需要對其 AI 系統對個人或社會的影響負責。 +### 問責制 + +設計與部署 AI 系統的人必須對系統運作負責。問責制在使用敏感技術如臉部辨識時尤其重要。近期,臉部辨識技術需求成長,尤其來自執法機構,他們看到此技術在尋找失蹤兒童等用途的潛力。然而,這些技術也可能被政府用於威脅公民基本自由,例如持續監視特定個人。因此,資料科學家與組織需對其 AI 系統對個人或社會的影響負責。 -[![領先的 AI 研究人員警告面部識別可能導致大規模監控](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoft 的負責任 AI 方法") +[![領先 AI 研究者警告臉部辨識引發大規模監控](../../../../translated_images/zh-TW/accountability.41d8c0f4b85b6231.webp)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "微軟負責任 AI 方法") -> 🎥 點擊上方圖片觀看影片:面部識別可能導致大規模監控的警告 +> 🎥 點擊上方圖片觀看影片:警告臉部辨識引起大規模監控 -最終,作為第一代將 AI 帶入社會的世代,我們面臨的最大問題之一是如何確保電腦始終對人類負責,以及如何確保設計電腦的人對其他人負責。 +最終,對於我們這一代—第一代將 AI 引入社會的人來說,最大的問題之一是如何確保電腦向人類負責,以及設計電腦的人對其他人負責。 ## 影響評估 -在訓練機器學習模型之前,進行影響評估以了解 AI 系統的目的、預期用途、部署地點以及與系統互動的對象是非常重要的。這些評估對於評審者或測試者來說非常有幫助,因為它們可以知道在識別潛在風險和預期後果時需要考慮哪些因素。 +在訓練機器學習模型之前,進行影響評估很重要,以了解 AI 系統的目的、預期用途、部署地點及使用者。這有助於評估者或測試者知道評估系統時需考慮的因素,從而識別潛在風險與預期結果。 進行影響評估時的重點領域包括: -* **對個人的不利影響**:了解任何限制或要求、不支持的用途或任何已知限制對系統性能的影響至關重要,以確保系統不會以可能對個人造成傷害的方式使用。 -* **數據需求**:了解系統如何以及在哪裡使用數據,使評審者能夠探索需要注意的任何數據需求(例如 GDPR 或 HIPPA 數據法規)。此外,檢查數據的來源或數量是否足夠用於訓練。 -* **影響摘要**:收集使用系統可能產生的潛在傷害清單。在 ML 生命週期中,檢查是否已緩解或解決識別出的問題。 -* **六大核心原則的適用目標**:評估每個原則的目標是否達成,以及是否存在任何差距。 +* 對個人的不良影響。了解任何限制或要求、不被支持的使用方式或已知性能限制,對避免系統被用於可能傷害個人的方式至關重要。 +* 數據需求。理解系統如何及在哪裡使用數據,讓評審能探討需顧慮的數據要求(如 GDPR 或 HIPAA 規定),並檢視數據來源與數量是否充足以訓練模型。 +* 影響摘要。收集可能因使用系統而產生的傷害清單。在 ML 生命週期中,不斷檢視是否已緩解或處理所識別問題。 +* 適用目標,對六大核心原則的評估。檢查是否達成各原則目標,並找出不足之處。 -## 使用負責任 AI 進行除錯 -與除錯軟體應用程式類似,除錯 AI 系統是識別和解決系統問題的必要過程。許多因素可能導致模型未按預期或負責任地運行。大多數傳統的模型性能指標是模型性能的定量匯總,這不足以分析模型如何違反負責任 AI 原則。此外,機器學習模型是一個黑箱,難以理解其結果的驅動因素,或者在出錯時提供解釋。在本課程的後續部分,我們將學習如何使用負責任 AI 儀表板來幫助除錯 AI 系統。該儀表板為數據科學家和 AI 開發者提供了一個全面的工具,用於執行以下操作: +## 負責任 AI 的除錯 -* **錯誤分析**:識別模型的錯誤分佈,這可能影響系統的公平性或可靠性。 -* **模型概覽**:發現模型在數據群體中的性能差異。 -* **數據分析**:了解數據分佈並識別數據中可能導致公平性、包容性和可靠性問題的潛在偏見。 -* **模型可解釋性**:了解影響或影響模型預測的因素。這有助於解釋模型的行為,這對於透明性和責任感至關重要。 +類似除錯軟體應用,除錯 AI 系統是找出並解決系統問題的必要過程。多種因素可能導致模型表現不如預期或不負責任。大多數傳統模型性能指標是模型表現的量化彙整,無法充分分析模型如何違反負責任 AI 原則。此外,機器學習模型是黑盒,難以理解其決策依據或在出錯時提供解釋。本課程後面將學習如何使用負責任 AI 儀表板來協助除錯 AI 系統。該儀表板為資料科學家與 AI 開發者提供整體工具以執行: + +* 錯誤分析。識別影響系統公平性或可靠性的模型誤差分布。 +* 模型概覽。發現模型於不同資料群組間的性能差異。 +* 數據分析。了解數據分布,識別可能導致公平性、包容性與可靠性問題的偏誤。 +* 模型可解釋性。理解影響模型預測的因素,有助解釋模型行為,對透明度與問責性至關重要。 -## 🚀 挑戰 -為了防止傷害的產生,我們應該: +## 🚀 挑戰 + +為防止初期即引入傷害,我們應該: -- 確保參與系統工作的團隊成員具有多樣化的背景和觀點。 -- 投資於反映我們社會多樣性的數據集。 -- 在機器學習生命週期中開發更好的方法來檢測和糾正負責任 AI 的問題。 +- 在系統開發團隊中具備多元背景與觀點 +- 投資反映社會多元性的數據集 +- 在機器學習生命週期中發展更佳方法以偵測並修正負責任 AI 問題 -思考一些現實生活中的情境,這些情境中模型的不可信性在模型構建和使用中顯而易見。我們還應該考慮什麼? +思考實際情況中模型不可信的例子,從模型建立與使用中可看出哪些問題?我們還應考慮什麼? ## [課後測驗](https://ff-quizzes.netlify.app/en/ml/) -## 回顧與自學 +## 複習與自學 + -在本課中,您已經學習了機器學習中公平性和不公平性概念的一些基礎知識。 -觀看這個工作坊以更深入了解相關主題: +在本課程中,您已經學習了機器學習中公平與不公平概念的一些基礎知識。 + +觀看此工作坊以深入探討相關主題: -- 追求負責任的人工智慧:將原則付諸實踐,由 Besmira Nushi、Mehrnoosh Sameki 和 Amit Sharma 主講 +- 追求負責任的 AI:將原則付諸實踐,由 Besmira Nushi、Mehrnoosh Sameki 和 Amit Sharma 主講 -[![負責任的人工智慧工具箱:一個用於構建負責任人工智慧的開源框架](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: 一個用於構建負責任人工智慧的開源框架") +[![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") -> 🎥 點擊上方圖片觀看影片:負責任的人工智慧工具箱:一個用於構建負責任人工智慧的開源框架,由 Besmira Nushi、Mehrnoosh Sameki 和 Amit Sharma 主講 +> 🎥 點擊上方圖片觀看影片:RAI Toolbox:由 Besmira Nushi、Mehrnoosh Sameki 和 Amit Sharma 主講的負責任 AI 建構開源框架 -此外,閱讀以下資源: +另外,閱讀: -- 微軟的負責任人工智慧資源中心:[負責任人工智慧資源 – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) +- 微軟的 RAI 資源中心:[Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) -- 微軟的 FATE 研究小組:[FATE:人工智慧中的公平性、問責性、透明性與倫理 - Microsoft Research](https://www.microsoft.com/research/theme/fate/) +- 微軟的 FATE 研究團隊:[FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) -RAI 工具箱: +RAI Toolbox: -- [負責任人工智慧工具箱 GitHub 儲存庫](https://github.com/microsoft/responsible-ai-toolbox) +- [Responsible AI Toolbox GitHub 儲存庫](https://github.com/microsoft/responsible-ai-toolbox) -了解 Azure 機器學習的工具如何確保公平性: +閱讀關於 Azure Machine Learning 確保公平性的工具: -- [Azure 機器學習](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 工具箱](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/zh-TW/2-Regression/1-Tools/README.md b/translations/zh-TW/2-Regression/1-Tools/README.md index 21b04bd09..c22c81cf1 100644 --- a/translations/zh-TW/2-Regression/1-Tools/README.md +++ b/translations/zh-TW/2-Regression/1-Tools/README.md @@ -1,120 +1,121 @@ -# 使用 Python 和 Scikit-learn 建立回歸模型 +# 使用 Python 和 Scikit-learn 開始建立回歸模型 -![回歸模型的手繪筆記摘要](../../../../sketchnotes/ml-regression.png) +![回歸模型的筆記總覽](../../../../translated_images/zh-TW/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/) -> ### [本課程也有 R 語言版本!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) +> ### [本課程亦提供 R 語言版本!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) -## 簡介 +## 介紹 -在這四節課中,您將學習如何建立回歸模型。我們稍後會討論這些模型的用途。但在開始之前,請確保您已準備好正確的工具來進行這個過程! +在這四課中,你將學會如何建立回歸模型。我們稍後會談談它們的用途。但在操作之前,請確保你已準備好所有正確的工具來開始此過程! -在本課程中,您將學習如何: +在本課程中,你將學會如何: -- 配置您的電腦以進行本地機器學習任務。 +- 為本機的機器學習任務設定電腦環境。 - 使用 Jupyter 筆記本。 -- 使用 Scikit-learn,包括安裝。 -- 通過實作練習探索線性回歸。 +- 使用 Scikit-learn,包含安裝步驟。 +- 透過實作練習了解線性回歸。 -## 安裝與配置 +## 安裝與設定 -[![機器學習初學者 - 配置工具以建立機器學習模型](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "機器學習初學者 - 配置工具以建立機器學習模型") +[![初學者機器學習 - 設定工具準備建構機器學習模型](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "初學者機器學習 - 設定工具準備建構機器學習模型") -> 🎥 點擊上方圖片觀看一段短片,了解如何配置您的電腦以進行機器學習。 +> 🎥 點擊上方圖片觀看快速教學影片,教你如何設定電腦環境進行機器學習。 -1. **安裝 Python**。確保您的電腦已安裝 [Python](https://www.python.org/downloads/)。Python 是進行許多數據科學和機器學習任務的必要工具。大多數電腦系統已經預裝了 Python。您也可以使用一些方便的 [Python 編碼包](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/)。在本課程中,您將在 Visual Studio Code 中使用 Python,因此建議您熟悉如何為 Python 開發 [配置 Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott)。 +2. **安裝 Visual Studio Code**。確保你已在電腦上安裝了 Visual Studio Code。請依據下列指引[安裝 Visual Studio Code](https://code.visualstudio.com/)。在本課程中你將使用 Visual Studio Code 來開發 Python 程式,因此建議你熟悉如何為 Python 開發[設定 Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott)。 - > 通過這些 [學習模組](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 中配置 Python](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "在 Visual Studio Code 中配置 Python") + > [![在 Visual Studio Code 中設定 Python](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "在 Visual Studio Code 中設定 Python") > - > 🎥 點擊上方圖片觀看一段短片:在 VS Code 中使用 Python。 + > 🎥 點擊上方圖片觀看如何在 VS Code 中使用 Python 的教學影片。 -3. **安裝 Scikit-learn**,按照 [這些指示](https://scikit-learn.org/stable/install.html) 進行安裝。由於需要使用 Python 3,建議您使用虛擬環境。如果您是在 M1 Mac 上安裝此庫,請參考上述頁面中的特殊指示。 +3. **安裝 Scikit-learn**,請依據[此處說明](https://scikit-learn.org/stable/install.html)操作。由於需要確保使用 Python 3,建議使用虛擬環境。如你是在 M1 Mac 上安裝該庫,請留意該頁面上的特別指示。 -4. **安裝 Jupyter Notebook**。您需要 [安裝 Jupyter 套件](https://pypi.org/project/jupyter/)。 +4. **安裝 Jupyter Notebook**。你需要[安裝 Jupyter 套件](https://pypi.org/project/jupyter/)。 -## 您的機器學習開發環境 +## 你的機器學習撰寫環境 -您將使用 **筆記本** 來開發 Python 程式碼並建立機器學習模型。這種類型的文件是數據科學家常用的工具,其文件副檔名為 `.ipynb`。 +你將使用 **筆記本(notebook)** 來撰寫 Python 程式碼並建立機器學習模型。這類檔案是資料科學家常用的工具,檔案副檔名為 `.ipynb`。 -筆記本是一種互動式環境,允許開發者撰寫程式碼並添加註解或文件,這對於實驗性或研究導向的專案非常有幫助。 +筆記本是一個互動式環境,允許開發者同時撰寫程式碼、加入註記與文件,對於實驗性或研究導向的專案非常有幫助。 -[![機器學習初學者 - 配置 Jupyter 筆記本以開始建立回歸模型](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "機器學習初學者 - 配置 Jupyter 筆記本以開始建立回歸模型") +[![初學者機器學習 - 設定 Jupyter 筆記本開始建構回歸模型](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "初學者機器學習 - 設定 Jupyter 筆記本開始建構回歸模型") -> 🎥 點擊上方圖片觀看一段短片,了解如何進行此練習。 +> 🎥 點擊上方圖片觀看本練習快速教學影片。 ### 練習 - 使用筆記本 -在此資料夾中,您會找到文件 _notebook.ipynb_。 +在此資料夾中,你會找到 _notebook.ipynb_ 檔案。 1. 在 Visual Studio Code 中打開 _notebook.ipynb_。 - Jupyter 伺服器將啟動,並使用 Python 3+。您會發現筆記本中有一些可以 `執行` 的程式碼區塊。您可以通過選擇類似播放按鈕的圖標來執行程式碼區塊。 + Jupyter 伺服器會啟動,使用 Python 3+。你會看到筆記本中有可執行的程式碼區塊。點擊類似播放按鈕的圖示,即可執行該區塊。 -2. 選擇 `md` 圖標並添加一些 Markdown,輸入以下文字 **# 歡迎來到您的筆記本**。 +1. 選取 `md` 圖示並加入 markdown,並輸入以下文字 **# Welcome to your notebook**。 - 接下來,添加一些 Python 程式碼。 + 接著,加入一些 Python 程式碼。 -3. 在程式碼區塊中輸入 **print('hello notebook')**。 -4. 選擇箭頭以執行程式碼。 +1. 在程式碼區塊中輸入 **print('hello notebook')**。 +1. 點擊箭頭執行程式碼。 - 您應該會看到以下輸出: + 你應該會看到輸出: ```output hello notebook ``` -![在 VS Code 中打開的筆記本](../../../../2-Regression/1-Tools/images/notebook.jpg) +![VS Code 開啟筆記本](../../../../translated_images/zh-TW/notebook.4a3ee31f396b8832.webp) -您可以在程式碼中穿插註解,以便自我記錄筆記本。 +你可以在程式碼中加入註解,以自我紀錄筆記本內容。 -✅ 想一想,網頁開發者的工作環境與數據科學家的工作環境有何不同。 +✅ 思考一下網頁開發者的工作環境和資料科學家的工作環境有何不同。 -## 使用 Scikit-learn 入門 +## 啟用 Scikit-learn -現在,Python 已在您的本地環境中配置完成,並且您已熟悉 Jupyter 筆記本,接下來讓我們熟悉 Scikit-learn(發音為 `sci`,如 `science`)。Scikit-learn 提供了一個 [廣泛的 API](https://scikit-learn.org/stable/modules/classes.html#api-ref),幫助您執行機器學習任務。 +既然已在本機設置好 Python,且熟悉 Jupyter 筆記本,現在讓我們熟悉 Scikit-learn(發音為 sci,類似 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 與其他工具來建立我們所謂的「傳統機器學習」模型。我們刻意避免神經網路與深度學習,因為這些內容我們會在即將推出的「AI 初學者」課程中深入講解。 -Scikit-learn 使建立模型並評估其使用變得簡單。它主要專注於使用數值數據,並包含多個現成的數據集作為學習工具。它還包括一些預建模型供學生嘗試。讓我們先探索如何加載預設數據並使用內建的估算器來建立第一個機器學習模型。 +Scikit-learn 使建立模型與評估變得簡單。它主要針對數值資料,包含多個內建數據集作為學習工具,也提供預建模型供學生嘗試。現在讓我們先探索如何載入預先封裝的資料,並使用內建估計器來建立 Scikit-learn 的第一個機器學習模型。 -## 練習 - 您的第一個 Scikit-learn 筆記本 +## 練習 - 你的第一個 Scikit-learn 筆記本 -> 本教程靈感來自 Scikit-learn 網站上的 [線性回歸範例](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py)。 +> 本教學靈感來源於 Scikit-learn 官網的[線性回歸範例](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py)。 -[![機器學習初學者 - 在 Python 中的第一個線性回歸專案](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "機器學習初學者 - 在 Python 中的第一個線性回歸專案") -> 🎥 點擊上方圖片觀看一段短片,了解如何進行此練習。 +[![初學者機器學習 - 你的第一個 Python 線性回歸專案](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "初學者機器學習 - 你的第一個 Python 線性回歸專案") -在與本課程相關的 _notebook.ipynb_ 文件中,按下「垃圾桶」圖標清除所有單元格。 +> 🎥 點擊上方圖片觀看本練習的快速教學影片。 -在本節中,您將使用 Scikit-learn 中內建的一個小型糖尿病數據集進行學習。假設您想測試一種針對糖尿病患者的治療方法。機器學習模型可能會幫助您根據變數的組合,確定哪些患者對治療的反應更好。即使是非常基本的回歸模型,當可視化時,也可能顯示出有助於組織理論臨床試驗的變數信息。 +在本課程配套的 _notebook.ipynb_ 檔案中,按下「垃圾桶」圖示清空所有儲存格。 -✅ 回歸方法有很多種類型,選擇哪一種取決於您想要回答的問題。如果您想預測某個年齡段的人的可能身高,您會使用線性回歸,因為您尋求的是一個 **數值**。如果您想確定某種菜餚是否應被歸類為素食,您尋求的是一個 **類別分配**,因此您會使用邏輯回歸。稍後您將學習更多關於邏輯回歸的內容。想一想,您可以向數據提出哪些問題,並判斷哪種方法更合適。 +本節將使用一個內建於 Scikit-learn 的小型糖尿病資料集作為學習素材。假設你想測試一種糖尿病病患的治療方式。機器學習模型或許能協助你根據變數組合,判斷哪些病患對治療反應較佳。即使是非常基礎的回歸模型,透過視覺化,也能顯示出哪些變數有助於設計理論性臨床試驗。 -讓我們開始這項任務。 +✅ 有很多種類型的回歸方法,選擇哪種取決於你想得到的答案。若你想預測某年齡對應可能身高,會使用線性回歸,因為你希望得到的是數值。若你想判別某種料理是否為純素食,則是在尋求分類,會使用邏輯斯回歸。邏輯斯回歸稍後會介紹。想一想你能問數據哪些問題,以及這些方法中哪一種更合適。 -### 導入庫 +那麼我們開始吧。 -在此任務中,我們將導入一些庫: +### 載入函式庫 -- **matplotlib**。這是一個有用的 [繪圖工具](https://matplotlib.org/),我們將用它來創建折線圖。 -- **numpy**。 [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) 是一個處理 Python 數值數據的有用庫。 -- **sklearn**。這是 [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) 庫。 +這個任務會用到以下函式庫: -導入一些幫助完成任務的庫。 +- **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. 輸入以下程式碼以添加導入: +載入函式庫以協助完成任務。 + +1. 輸入以下程式碼來加入函式庫: ```python import matplotlib.pyplot as plt @@ -122,26 +123,26 @@ Scikit-learn 使建立模型並評估其使用變得簡單。它主要專注於 from sklearn import datasets, linear_model, model_selection ``` - 上述程式碼中,您導入了 `matplotlib` 和 `numpy`,並從 `sklearn` 中導入了 `datasets`、`linear_model` 和 `model_selection`。`model_selection` 用於將數據分割為訓練集和測試集。 + 上述程式碼匯入了 `matplotlib`、`numpy`,並從 `sklearn` 中匯入 `datasets`、`linear_model` 和 `model_selection`。`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:身體質量指數 +- age:年齡(歲) +- bmi:身體質量指數(Body Mass Index) - bp:平均血壓 -- s1 tc:T 細胞(白血球的一種類型) +- s1 tc:T 細胞(一種白血球) -✅ 此數據集包含「性別」作為研究糖尿病的重要特徵變數。許多醫學數據集都包含這種類型的二元分類。想一想,這類分類可能如何將某些群體排除在治療之外。 +✅ 此資料集將「性別」列為重要的特徵變數之一。許多醫學資料集都包含這種二元分類。請思考此類分類如何可能使某些族群在治療上被排除。 -現在,載入 X 和 y 數據。 +接下來,載入 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,39 +160,39 @@ 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. 接下來,選擇數據集的一部分進行繪圖,選擇數據集的第 3 列。您可以使用 `:` 運算符選擇所有行,然後使用索引(2)選擇第 3 列。您還可以使用 `reshape(n_rows, n_columns)` 將數據重塑為 2D 數組(繪圖所需)。如果其中一個參數為 -1,則對應的維度將自動計算。 +2. 接著,選擇資料集中的一部分繪圖,即取資料集的第 3 欄。你可以用 `:` 選擇所有列,然後以索引(2)選擇第 3 欄。你也可以用 `reshape(n_rows, n_columns)` 將資料重塑成 2D 陣列以便繪圖。如果其中一個參數是 -1,該維度會自動計算。 ```python X = X[:, 2] X = X.reshape((-1,1)) ``` - ✅ 隨時打印數據以檢查其形狀。 + ✅ 隨時印出資料以確認其形狀。 -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. 現在您可以訓練模型了!加載線性回歸模型,並使用 `model.fit()` 訓練您的 X 和 y 訓練集: +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 是完成此任務很有用的工具。使用散佈圖表現所有 X 與 y 測試資料,並利用預測來畫出模型間分群最合適的分割線。 ```python plt.scatter(X_test, y_test, color='black') @@ -202,29 +203,32 @@ Scikit-learn 使建立模型並評估其使用變得簡單。它主要專注於 plt.show() ``` - ![顯示糖尿病數據點的散點圖](../../../../2-Regression/1-Tools/images/scatterplot.png) -✅ 想一想這裡發生了什麼。一條直線穿過了許多小數據點,但它究竟在做什麼?你能看出如何利用這條直線來預測一個新的、未見過的數據點應該在圖表的 y 軸上對應的位置嗎?試著用語言描述這個模型的實際用途。 + ![一個展示糖尿病資料散佈點的圖形](../../../../translated_images/zh-TW/scatterplot.ad8b356bcbb33be6.webp) + -恭喜你!你已經建立了第一個線性回歸模型,使用它進行了預測,並將結果顯示在圖表中! + ✅ 想一想這裡發生了什麼。一條直線穿過了許多小點的資料,但它到底在做什麼?你能看出應該如何使用這條線來預測一個新的、未見過的資料點在圖表的 y 軸上的相對位置嗎?試著用文字描述這個模型的實際用途。 + +恭喜,你建立了你的第一個線性迴歸模型,使用它做出預測,並將結果顯示在圖表上! --- ## 🚀挑戰 -繪製這個數據集中的另一個變量。提示:編輯這一行:`X = X[:,2]`。根據這個數據集的目標,你能發現糖尿病作為一種疾病的進展情況嗎? - +繪製該資料集中不同的變數。提示:編輯這一行:`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/zh-TW/2-Regression/2-Data/README.md b/translations/zh-TW/2-Regression/2-Data/README.md index cd84e783d..31716914b 100644 --- a/translations/zh-TW/2-Regression/2-Data/README.md +++ b/translations/zh-TW/2-Regression/2-Data/README.md @@ -1,62 +1,62 @@ -# 使用 Scikit-learn 建立回歸模型:準備與視覺化數據 +# 使用 Scikit-learn 建立迴歸模型:準備及視覺化資料 -![數據視覺化資訊圖表](../../../../2-Regression/2-Data/images/data-visualization.png) +![資料視覺化資訊圖表](../../../../translated_images/zh-TW/data-visualization.54e56dded7c1a804.webp) -資訊圖表由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 提供 +資訊圖表由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 製作 ## [課前測驗](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 開始建立機器學習模型,接下來可以開始對數據提出問題。在處理數據並應用機器學習解決方案時,了解如何提出正確的問題以充分發揮數據集的潛力是非常重要的。 +現在你已經安裝好開始使用 Scikit-learn 建置機器學習模型所需的工具,便可以開始探究資料中的問題了。當你操作資料並應用 ML 解決方案時,理解如何提出正確的問題以妥善開發資料潛力,是非常重要的。 -在本課程中,您將學到: +在本課程中,你將學到: -- 如何為模型建立準備數據。 -- 如何使用 Matplotlib 進行數據視覺化。 +- 如何準備你的資料以用於模型建立。 +- 如何使用 Matplotlib 進行資料視覺化。 +- 如何使用 Seaborn 進行更具表現力的資料視覺化。 -## 對數據提出正確的問題 +## 對資料提出正確的問題 -您需要回答的問題將決定您使用哪種類型的機器學習算法。而您獲得答案的質量將在很大程度上取決於數據的性質。 +你需要解決的問題將決定你會採用哪種類型的機器學習演算法。而你得到答案的品質很大程度取決於你的資料性質。 -看看為本課程提供的[數據](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv)。您可以在 VS Code 中打開這個 .csv 文件。快速瀏覽會發現其中有空白值,還有字符串和數字數據的混合。此外,還有一個奇怪的名為 "Package" 的列,其中的數據混合了 "sacks"、"bins" 和其他值。事實上,這些數據有點混亂。 +請看本課使用的 [資料](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv)。你可以在 VS Code 中開啟此 .csv 檔。快速瀏覽後,會發現裡面有空白欄位,以及字串與數字資料混合。此外還有一欄奇怪的「Package」欄位,裡面的資料是「sacks」、「bins」及其他值混雜。事實上,這資料有點亂。 -[![機器學習初學者 - 如何分析和清理數據集](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "機器學習初學者 - 如何分析和清理數據集") +[![ML 新手 - 如何分析與清理資料集](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML 新手 - 如何分析與清理資料集") -> 🎥 點擊上方圖片觀看一段短視頻,了解如何準備本課程的數據。 +> 🎥 點擊上方圖片觀看短片,示範本課如何準備資料。 -事實上,很少能直接獲得一個完全準備好用於建立機器學習模型的數據集。在本課程中,您將學習如何使用標準 Python 庫準備原始數據集,並學習各種數據視覺化技術。 +事實上,通常不會直接拿到一組完全就緒可用來建立 ML 模型的資料集。在本課,你將學習如何使用標準 Python 函式庫準備原始資料。也會了解多種資料視覺化技巧。 -## 案例研究:'南瓜市場' +## 案例研究:「南瓜市場」 -在此文件夾中,您會在根目錄的 `data` 文件夾中找到一個名為 [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) 的 .csv 文件,其中包含 1757 行有關南瓜市場的數據,按城市分組。這是從美國農業部發布的[特殊作物終端市場標準報告](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice)中提取的原始數據。 +在本資料夾的根目錄 `data` 裡,有一個名為 [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) 的 .csv 檔案,包含 1757 行關於美國南瓜市場的資料,依城市分組排序。這是從美國農業部發布的 [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) 取得的原始資料。 -### 準備數據 +### 資料準備 -這些數據屬於公共領域。它可以從 USDA 網站下載,並以每個城市為單位分成多個文件。為了避免過多的文件,我們已將所有城市數據合併到一個電子表格中,因此我們已經對數據進行了一些_準備_。接下來,讓我們仔細看看這些數據。 +這些資料屬於公有領域,能從美國農業部網站分城市以多個檔案下載。為避免太多分散檔案,我們已將所有城市的資料合併到一個活頁簿中,換句話說,我們已稍作「預備」。接著,我們仔細檢視這些資料。 -### 南瓜數據 - 初步結論 +### 南瓜資料 - 初步結論 -您對這些數據有什麼觀察?您可能已經注意到其中混合了字符串、數字、空白值和一些需要理解的奇怪值。 +你對這些資料有什麼觀察?你已看到它混合了字串、數字、空值及怪異的資料,需要分析清楚。 -使用回歸技術,您可以對這些數據提出什麼問題?例如,"預測某個月份出售的南瓜價格"。再次查看數據,您會發現需要進行一些更改,以創建適合此任務的數據結構。 +你能用迴歸方法,對此資料提出什麼問題?試想「預測某月份南瓜的售價」。再看資料,你需要先做幾個調整,製作出適合此任務的資料結構。 +## 練習 - 分析南瓜資料 -## 練習 - 分析南瓜數據 +我們來用 [Pandas](https://pandas.pydata.org/)(名稱代表 `Python Data Analysis`)這個相當實用的資料整理工具,分析並準備這份南瓜資料。 -讓我們使用 [Pandas](https://pandas.pydata.org/)(名稱代表 `Python Data Analysis`),這是一個非常有用的數據處理工具,來分析和準備這些南瓜數據。 +### 首先,檢查是否有缺少的日期 -### 首先,檢查是否有缺失日期 +你需要先採取以下步驟檢查資料中是否缺少日期: -您需要首先檢查是否有缺失的日期: +1. 將日期轉換成月份格式(這是美國日期,格式為 `MM/DD/YYYY`)。 +2. 從中擷取月份並存到新欄位。 -1. 將日期轉換為月份格式(這些是美國日期格式,為 `MM/DD/YYYY`)。 -2. 提取月份到一個新列中。 +在 Visual Studio Code 中開啟 _notebook.ipynb_ 檔,並將活頁簿導入新 Pandas dataframe。 -在 Visual Studio Code 中打開 _notebook.ipynb_ 文件,並將電子表格導入到一個新的 Pandas dataframe 中。 - -1. 使用 `head()` 函數查看前五行。 +1. 使用 `head()` 函數查看前五列。 ```python import pandas as pd @@ -64,30 +64,30 @@ pumpkins.head() ``` - ✅ 您會使用什麼函數來查看最後五行? + ✅ 若想看最後五列資料,應用什麼函數? -1. 檢查當前 dataframe 中是否有缺失數據: +1. 檢查目前 dataframe 中是否有缺少資料: ```python pumpkins.isnull().sum() ``` - 有缺失數據,但可能對當前任務無關緊要。 + 資料中有缺值,但或許對這任務不造成影響。 -1. 為了使 dataframe 更易於處理,使用 `loc` 函數選擇您需要的列。該函數從原始 dataframe 中提取一組行(作為第一個參數傳遞)和列(作為第二個參數傳遞)。以下示例中的表達式 `:` 表示 "所有行"。 +1. 為讓 dataframe 使用更方便,使用 `loc` 函數選取所需欄位,該函數從原始 dataframe 選出一群列(作為第一參數)與欄(第二參數)。範例中 `:` 表示「所有列」。 ```python columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.loc[:, columns_to_select] ``` -### 其次,確定南瓜的平均價格 +### 第二步,計算南瓜平均價格 -思考如何確定某個月份南瓜的平均價格。您會選擇哪些列來完成此任務?提示:您需要 3 列。 +思考如何算出某月份南瓜的平均價格。你會選哪幾個欄位?提示:需要三個欄位。 -解決方案:取 `Low Price` 和 `High Price` 列的平均值來填充新的 Price 列,並將 Date 列轉換為僅顯示月份。幸運的是,根據上面的檢查,日期和價格的數據沒有缺失。 +解法:用 `Low Price` 與 `High Price` 欄位平均數填入新欄 Price,並將 Date 欄只保留月份。幸運的是,前述檢查結果顯示日期和價格欄位無缺值。 -1. 要計算平均值,添加以下代碼: +1. 計算平均價格,加入以下程式碼: ```python price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 @@ -96,37 +96,37 @@ ``` - ✅ 您可以使用 `print(month)` 打印任何您想檢查的數據。 + ✅ 你可以用 `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"。南瓜似乎很難以一致的方式稱重,因此我們只選擇 `Package` 列中包含 "bushel" 字符串的南瓜。 +深入查看原始資料,凡 `Unit of Sale` 值為「EACH」或「PER BIN」者,`Package` 欄位都會以每英寸、每箱或「each」計。不過南瓜很難有固定的磅重,因此我們以「bushel」字串篩選,只挑選出以「bushel」售賣的南瓜。 -1. 在文件頂部的 .csv 導入下方添加一個篩選器: +1. 在檔案起始,csv 導入後,加入篩選條件: ```python pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] ``` - 如果您現在打印數據,您會看到只剩下大約 415 行包含以 bushel 為單位的南瓜數據。 + 若你此時印出資料,可看到剩余約 415 筆以 bushel 計價的南瓜資料。 -### 但是等等!還有一件事要做 +### 等等!還有一件事 -您是否注意到每行的 bushel 數量不同?您需要對價格進行標準化,以顯示每 bushel 的價格,因此需要進行一些數學運算來標準化它。 +你有注意到不同列的 bushel 數量有差異嗎?你需要標準化價格,算出每 bushel 的價格,必須做些運算讓資料統一。 -1. 在創建 new_pumpkins dataframe 的代碼塊後添加以下行: +1. 在建立 new_pumpkins dataframe 的程式碼塊後,加入這些程式碼: ```python new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) @@ -134,38 +134,38 @@ 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) 的說明,bushel 是一種體積單位,重量依作物不同而有差異。舉例而言,「一 bushel 西紅柿大約重 56 磅……青葉類體積大但重量少,因此一 bushel 菠菜約 20 磅。」這相當複雜!我們不打算作 bushel 與磅的轉換,改以每 bushel 價格計算。對南瓜的這些研究,也凸顯理解資料本質的重要性! -現在,您可以根據 bushel 測量單位分析每單位的定價。如果您再打印一次數據,您會看到它已經標準化。 +現在,你可以根據 bushel 這個單位分析南瓜價格。再印出一次資料,即可看到標準化後的結果。 -✅ 您是否注意到按半 bushel 出售的南瓜非常昂貴?您能找出原因嗎?提示:小南瓜比大南瓜貴得多,可能是因為每 bushel 中小南瓜的數量更多,而大南瓜的空心部分佔用了更多空間。 +✅ 你注意到半 bushel 售價特別高嗎?你能猜出原因嗎?提示:小南瓜單價較高,因為半 bushel 中小顆數量較多,而大顆中間有空洞,使用空間較浪費。 -## 視覺化策略 +## 資料視覺化策略 -數據科學家的部分工作是展示他們正在處理的數據的質量和性質。為此,他們通常會創建有趣的視覺化圖表,例如散點圖、柱狀圖和折線圖,展示數據的不同方面。通過這種方式,他們能夠直觀地顯示數據中難以發現的關係和差距。 +資料科學家的工作之一是展現所處理資料的品質與性質。為此,他們會製作有趣的圖表、繪圖、圖形和圖表,展示資料的不同面貌。透過視覺化,他們能以直觀方式呈現關聯與缺口,這些關聯否則難以發現。 -[![機器學習初學者 - 如何使用 Matplotlib 視覺化數據](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "機器學習初學者 - 如何使用 Matplotlib 視覺化數據") +[![ML 新手 - 如何使用 Matplotlib 視覺化資料](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML 新手 - 如何使用 Matplotlib 視覺化資料") -> 🎥 點擊上方圖片觀看一段短視頻,了解如何視覺化本課程的數據。 +> 🎥 點擊上方圖片觀看短片,示範本課如何視覺化資料。 -視覺化還可以幫助確定最適合數據的機器學習技術。例如,看起來像一條線的散點圖表明該數據非常適合線性回歸練習。 +視覺化也有助於辨別最適合資料的機器學習方法。舉例來說,一個看來呈線狀分布的散點圖,表明資料較適合用線性迴歸。 -在 Jupyter notebook 中,一個非常好用的數據視覺化庫是 [Matplotlib](https://matplotlib.org/)(您在上一課中也見過它)。 +一款在 Jupyter notebook 中表現良好的資料視覺化函式庫是 [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 +## 練習 - 試試 Matplotlib -嘗試創建一些基本圖表來顯示您剛剛創建的新 dataframe。基本的折線圖會顯示什麼? +嘗試製作一些基本圖形,顯示你剛建立的新 dataframe。簡單的折線圖會呈現什麼結果? -1. 在文件頂部的 Pandas 導入下方導入 Matplotlib: +1. 在檔案頂部,在 Pandas 導入後面,導入 Matplotlib: ```python import matplotlib.pyplot as plt ``` -1. 重新運行整個 notebook 以刷新。 -1. 在 notebook 底部添加一個單元格,將數據繪製為箱形圖: +1. 重新執行整個 notebook 以更新。 +1. 在 notebook 底部新增儲存格,以箱形圖來繪製資料: ```python price = new_pumpkins.Price @@ -174,44 +174,121 @@ plt.show() ``` - ![顯示價格與月份關係的散點圖](../../../../2-Regression/2-Data/images/scatterplot.png) + ![一個展示價格與月份關係的散點圖](../../../../translated_images/zh-TW/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/zh-TW/barchart.a833ea9194346d76.webp) + + 這是比較有用的資料視覺化!貌似最高南瓜價格出現在九月與十月。和你的預期吻合嗎?為什麼? + +## 練習 - 嘗試 Seaborn + +Matplotlib 很厲害,但繪製精美圖表程式碼量通常不少。[Seaborn](https://seaborn.pydata.org/) 是構建在 Matplotlib 之上的函式庫,專為統計資料視覺化而設計。它可直接與 Pandas dataframe 配合,提供漂亮的預設樣式,使你能用更少程式碼創建資訊豐富的圖表。而且因為 Seaborn 回傳的是 Matplotlib 物件,你仍可以用 Matplotlib 的方法微調結果。 + +> 若你尚未安裝 Seaborn,請用 `pip install seaborn` 安裝。 + +1. 在 notebook 頂部,其他導入後,導入 Seaborn。習慣以 `sns` 為代號: + + ```python + import seaborn as sns + ``` + +### 散點圖示變數間關係 + +建模型前,探索資料一大部分是尋找變數的 _關聯_。散點圖是最佳工具之一。如果點狀分布有線狀趨勢,兩項變數可能相關,說明線性迴歸模型有望適用。 + +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/zh-TW/relplot.a03837d8f0329cec.webp) + + 注意你只要傳入 _欄位名稱_ 與 dataframe,Seaborn 會自動處理軸標籤。 + +2. 傳入 `kind="line"` 參數即可切換成折線圖。Seaborn 甚至會繪製一條代表信賴區間的陰影帶: + + ```python + sns.relplot(x="Price", y="Month", kind="line", data=new_pumpkins) + ``` + + ![Seaborn 折線圖示價格對月份關係](../../../../translated_images/zh-TW/lineplot.f9034ba47b1e30ee.webp) + + 這組資料干擾比較大,所以折線圖不一定是最佳選擇──但也說明你用 Seaborn 改變圖表類型的方便性。 + +### 長條圖示分布情形 + + +之前你用手動分組的方式,利用 Matplotlib 製作長條圖。Seaborn 的 [`catplot()`](https://seaborn.pydata.org/generated/seaborn.catplot.html)(分類圖)可以幫你完成分組與匯總。預設的 `kind="bar"` 顯示每個類別的平均值,並用黑線標示信賴區間。 + +1. 建立每月平均價格的長條圖: + + ```python + sns.catplot(x="Month", y="Price", data=new_pumpkins, kind="bar") + ``` + + ![A Seaborn bar chart showing the price distribution per month](../../../../translated_images/zh-TW/catplot.e73fc35fdf96242b.webp) + + 這與你用 Matplotlib 看到的結果相符 — 價格在九月和十月飆升 — 同時 Seaborn 也將每個月內價格的 _變異_ 可視化。 + +### 熱圖顯示相關性 + +散點圖是比較兩個變數的方式。當你有多個數值欄位時,[熱圖](https://en.wikipedia.org/wiki/Heat_map) 讓你能一次查看 _每一對_ 欄位間關係的強度。這常用於挑選要餵進模型的特徵前的相關性探查(分類時同樣的圖也用於顯示混淆矩陣)。 + +1. 用 Pandas 建立相關係數矩陣,然後用 Seaborn 的 [`heatmap()`](https://seaborn.pydata.org/generated/seaborn.heatmap.html) 繪製。`annot=True` 選項會在每個儲存格印出相關值: + + ```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/zh-TW/heatmap.bd98dce43b404c57.webp) + + 接近 `1`(或 `-1`)的值代表欄位間有強烈 _線性_ 相關。注意 `Low Price` 和 `High Price` 幾乎完美相關。另一方面,`Month` 與價格的線性相關較弱 — 儘管前面長條圖清楚顯示九月和十月有明顯季節高峰。這是一個重要的教訓:相關係數只衡量 _直線_ 關係,因此可能漏掉季節性或其他非線性模式。✅ 為什麼決定用哪些欄位前,同時看熱圖 長條圖很有用? + +### Matplotlib 還是 Seaborn? + +兩個函式庫都值得了解: + +- **Matplotlib** 提供對圖表每個元素的細緻控制,且幾乎所有 Python 繪圖庫都建立於其基礎上。 +- **Seaborn** 提供更高階的統計圖函式及吸睛的預設值,能直接操作資料框,常用於快速探索性資料分析。 - 這是一個更有用的數據視覺化!它似乎表明南瓜的最高價格出現在九月和十月。這符合您的預期嗎?為什麼或為什麼不符合? +一個常見工作流程是先用 Seaborn 快速探索資料,需求細節自定義時再切回 Matplotlib。 --- -## 🚀挑戰 +## 🚀 挑戰 -探索 Matplotlib 提供的不同類型的視覺化。哪些類型最適合回歸問題? +探索 Matplotlib 和 Seaborn 所提供的各種類型視覺化。哪幾種視覺化類型最適合用於回歸問題? -## [課後測驗](https://ff-quizzes.netlify.app/en/ml/) +## [課後小測驗](https://ff-quizzes.netlify.app/en/ml/) -## 回顧與自學 +## 複習與自學 -了解數據視覺化的多種方式。列出可用的各種庫,並記下哪些庫最適合特定類型的任務,例如 2D 視覺化與 3D 視覺化。您發現了什麼? +多看看可視化資料的各種方法,列出不同的函式庫並標示它們最適合哪類任務,例如 2D 視覺化 vs. 3D 視覺化。你發現了什麼? ## 作業 -[探索視覺化](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/zh-TW/2-Regression/2-Data/solution/notebook.ipynb b/translations/zh-TW/2-Regression/2-Data/solution/notebook.ipynb index 825ff1b13..5934aa8d9 100644 --- a/translations/zh-TW/2-Regression/2-Data/solution/notebook.ipynb +++ b/translations/zh-TW/2-Regression/2-Data/solution/notebook.ipynb @@ -3,7 +3,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "## 南瓜線性迴歸 - 課程 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": [ + "## 使用 Seaborn 進行視覺化\n", + "\n", + "[Seaborn](https://seaborn.pydata.org/) 建立於 Matplotlib 之上,並直接支援 DataFrame,使其能以非常少的程式碼快速創建美觀的統計圖表。\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": [] + "source": [ + "sns.catplot(x=\"Month\", y=\"Price\", data=new_pumpkins, kind=\"bar\")" + ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**免責聲明**: \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。\n" + "### 熱圖以顯示相關性\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**免責聲明**:\n此文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。\n\n" ] } ], @@ -424,13 +487,7 @@ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" } }, - "orig_nbformat": 2, - "coopTranslator": { - "original_hash": "95726f0b8283628d5356a4f8eb8b4b76", - "translation_date": "2025-09-03T19:45:08+00:00", - "source_file": "2-Regression/2-Data/solution/notebook.ipynb", - "language_code": "tw" - } + "orig_nbformat": 2 }, "nbformat": 4, "nbformat_minor": 2 diff --git a/translations/zh-TW/8-Reinforcement/1-QLearning/README.md b/translations/zh-TW/8-Reinforcement/1-QLearning/README.md index e8b6afd9b..b282a9958 100644 --- a/translations/zh-TW/8-Reinforcement/1-QLearning/README.md +++ b/translations/zh-TW/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/zh-TW/ml-reinforcement.94024374d63348db.webp) +> 示意圖作者為 [Tomomi Imura](https://www.twitter.com/girlie_mac) -強化學習涉及三個重要概念:代理(agent)、一些狀態(states)以及每個狀態的一組行動(actions)。通過在指定狀態下執行某個行動,代理會獲得一個獎勵。想像一下電腦遊戲《超級瑪利歐》。你是瑪利歐,處於遊戲關卡中,站在懸崖邊上。你的上方有一枚金幣。你作為瑪利歐,處於遊戲關卡中的特定位置……這就是你的狀態。向右移動一步(行動)會讓你掉下懸崖,這會給你一個低的數值分數。然而,按下跳躍按鈕可以讓你得分並保持存活。這是一個正面的結果,應該給你一個正的數值分數。 +強化學習包含三個重要概念:代理人(agent)、一些狀態(states),以及每個狀態下的一組動作(actions)。透過在指定狀態執行一個動作,代理人會獲得回饋(reward)。再次想像電腦遊戲超級瑪利歐(Super Mario)。你是瑪利歐,身處一個遊戲關卡,站在懸崖邊。你的上方有一個金幣。你身為瑪利歐,處於遊戲關卡中一個特定位置…這就是你的狀態(state)。向右走一步(一個動作)會讓你掉下懸崖,導致低分。但跳躍按鈕則會幫你得分且保持存活。這是一個正向結果,應該給予正向數值的分數。 -通過使用強化學習和模擬器(遊戲),你可以學習如何玩遊戲以最大化獎勵,即保持存活並盡可能多地得分。 +利用強化學習與模擬器(遊戲),你可以學會怎麼玩遊戲以最大化獎勵,也就是保持存活並取得盡可能多的分數。 -[![強化學習簡介](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) > 🎥 點擊上方圖片聽 Dmitry 討論強化學習 -## [課前測驗](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)** 的世界,靈感來自俄羅斯作曲家 [Sergei Prokofiev](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) 是一種學習技術,允許我們透過大量實驗學習代理人在某個環境中達成最佳行為。代理人在此環境應有一個目標,由一個回饋函數定義。 ## 環境 -為了簡化,我們將彼得的世界視為一個大小為 `width` x `height` 的方形棋盤,如下所示: +為簡化起見,讓我們將彼得的世界視為一個 `width` x `height` 的方形棋盤,如下圖: -![彼得的環境](../../../../8-Reinforcement/1-QLearning/images/environment.png) +![彼得的環境](../../../../translated_images/zh-TW/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()) } ``` -總結一下,此場景的策略和目標如下: +總結來說,本場景中策略與目標如下: -- **策略**:我們的代理(彼得)的策略由所謂的**策略函數**(policy)定義。策略是一個函數,能在任何給定狀態下返回行動。在我們的例子中,問題的狀態由棋盤表示,包括玩家的當前位置。 +- 策略:代理人(彼得)的策略由所謂的策略函數(policy)定義。策略是函數,輸入為任一狀態,輸出為該狀態下的動作。在我們的問題中,狀態由棋盤及玩家當前位置表示。 -- **目標**:強化學習的目標是最終學習一個良好的策略,能有效地解決問題。然而,作為基線,我們先考慮最簡單的策略,稱為**隨機行走**。 +- 目標:強化學習的目標是最終學習出一個能有效解決問題的良好策略。不過作為基線,我們先考慮最簡單的策略——**隨機行走(random walk)**。 ## 隨機行走 -首先,我們通過實現隨機行走策略來解決問題。在隨機行走中,我們將隨機選擇下一個行動,直到到達蘋果(代碼塊 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) ## 獎勵函數 -為了讓我們的策略更智能,我們需要了解哪些移動比其他移動更“好”。為此,我們需要定義目標。 +為了讓我們的策略更智慧,我們需了解哪些動作比其他更「好」。為此,我們必須定義目標。 -目標可以通過**獎勵函數**定義,該函數會為每個狀態返回一些分數值。數值越高,獎勵函數越好。(代碼塊 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-Table**。它記錄了在給定狀態下每個行動的“好壞程度”。 +我們將討論一種稱為 **Q 學習** 的演算法。在此演算法中,策略由名為 **Q-表** 的函數(或資料結構)定義。Q-表紀錄每個狀態下各動作的「好壞」程度。 -之所以稱為 Q-Table,是因為將其表示為表格或多維數組通常很方便。由於我們的棋盤尺寸為 `width` x `height`,我們可以使用形狀為 `width` x `height` x `len(actions)` 的 numpy 數組來表示 Q-Table:(代碼塊 6) +它稱為 Q-表,是因為常以表格或多維陣列形式呈現。由於我們的棋盤維度為 `width` x `height`,可用 shape 為 `width` x `height` x `len(actions)` 的 numpy 陣列來表示 Q-表:(程式碼區塊 6) ```python Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) ``` -注意,我們將 Q-Table 的所有值初始化為相等值,在我們的例子中是 0.25。這對應於“隨機行走”策略,因為每個狀態中的所有移動都是同樣好的。我們可以將 Q-Table 傳遞給 `plot` 函數,以便在棋盤上可視化該表:`m.plot(Q)`。 +注意,我們將 Q-表的初始值都設為相同的數值,本例為 0.25。這對應於「隨機行走」策略,因為在每個狀態下各動作的價值相等。我們可以將 Q-表傳給 `plot` 函數來在棋盤上視覺化此表:`m.plot(Q)`。 -![彼得的環境](../../../../8-Reinforcement/1-QLearning/images/env_init.png) +![彼得的環境](../../../../translated_images/zh-TW/env_init.04e8f26d2d60089e.webp) -在每個格子的中心有一個“箭頭”,指示移動的首選方向。由於所有方向都是相等的,因此顯示為一個點。 +在每一格中心都有一個「箭頭」指示偏好移動方向。因所有方向價值相同,所以會顯示一個點。 -現在我們需要運行模擬,探索環境,並學習更好的 Q-Table 值分佈,這將使我們更快地找到蘋果的路徑。 +現在我們需要執行模擬,探索環境並學習更好的 Q-表分佈,以便更快速找到蘋果的路徑。 -## Q-Learning 的核心:貝爾曼方程 +## Q 學習的核心:貝爾曼方程式 -一旦我們開始移動,每個行動都會有相應的獎勵,即我們理論上可以根據最高的即時獎勵選擇下一個行動。然而,在大多數狀態下,移動並不會實現我們到達蘋果的目標,因此我們無法立即決定哪個方向更好。 +一旦開始移動,每個動作會有對應的回饋,也就是理論上可根據即時回饋選擇下一步動作。然而,在大多數狀態下,該動作不會立即達成我們想找蘋果的目標,因此無法馬上判斷哪個方向較好。 -> 記住,重要的不是即時結果,而是最終結果,即我們在模擬結束時獲得的結果。 +> 請記得,重要的不是即時結果,而是最後的結果,也就是模擬結束時獲得的結果。 -為了考慮這種延遲獎勵,我們需要使用**[動態規劃](https://en.wikipedia.org/wiki/Dynamic_programming)**的原則,這使我們能以遞歸方式思考問題。 +為了因應這種延遲回饋,我們需要用到[動態規劃](https://en.wikipedia.org/wiki/Dynamic_programming) 的原理,讓我們能以遞迴方式思考問題。 -假設我們現在處於狀態 *s*,並希望移動到下一個狀態 *s'*。通過這樣做,我們將獲得由獎勵函數定義的即時獎勵 *r(s,a)*,加上一些未來的獎勵。如果我們假設 Q-Table 正確反映了每個行動的“吸引力”,那麼在狀態 *s'* 我們將選擇對應於最大值 *Q(s',a')* 的行動 *a'*。因此,我們在狀態 *s* 能夠獲得的最佳未來獎勵將定義為 `max` +假設我們目前處於狀態 *s*,想移動到下一狀態 *s'*。這麼做會拿到即時回饋 *r(s,a)*,由獎勵函數定義,外加未來的獎勵。如果假設 Q-表能正確反映每個動作的「誘因」,那麼在狀態 *s'* 我們會選擇動作 *a*,該動作使 *Q(s',a')* 最大。因此,在狀態 *s* 可取得的最佳未來回饋由 `max`a'*Q(s',a')* 定義(最大值基於狀態 *s'* 下的所有可能動作 *a'*)。 -## 檢查政策 +這樣我們得到對動作 *a* 在狀態 *s* 的 Q-表計算公式,即為以下 貝爾曼方程式: -由於 Q-Table 列出了每個狀態下每個行動的「吸引力」,因此使用它來定義我們世界中的高效導航非常簡單。在最簡單的情況下,我們可以選擇對應於最高 Q-Table 值的行動:(程式碼區塊 9) + + +其中 γ 是所謂的折扣因子(discount factor),決定你應多大程度偏好當前回饋而非未來回饋,反之亦然。 + +## 學習演算法 + +根據上述方程式,現在可以撰寫出學習演算法的偽代碼: + +* 用相同值初始化所有狀態和動作的 Q-表 Q +* 設定學習率 α ← 1 +* 重複多次模擬 + 1. 從隨機位置開始 + 1. 重複 + 1. 在狀態 *s* 選擇行動 *a* + 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-表數值,總是選擇狀態 *s* 下 Q 值最高的動作。但這會阻止探勘其它狀態,可能無法找到最佳解。 + +因此最佳方式是在探索與利用間取得平衡。這可作為以 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` 以避免初期向量成分完全一樣時的除零錯誤。 + +執行 5000 次實驗(稱為 **epochs**)來跑學習演算法:(程式碼區塊 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) ```python def qpolicy_strict(m): @@ -198,17 +274,18 @@ def qpolicy_strict(m): walk(m,qpolicy_strict) ``` -> 如果多次嘗試上述程式碼,您可能會注意到有時它會「卡住」,需要按下筆記本中的 STOP 按鈕來中斷執行。這是因為可能存在某些情況,兩個狀態在最佳 Q-Value 上「指向」彼此,導致代理無限地在這些狀態之間移動。 + +> 如果你嘗試執行上面的程式碼好幾次,你可能會注意到有時它會「卡住」,這時你需要按下筆記本中的停止按鈕以中斷它。這是因為可能出現兩個狀態在最佳 Q-值的意義上「互相指向」的情況,在這種情況下,代理會不斷在那兩個狀態之間移動而無限循環。 ## 🚀挑戰 -> **任務 1:** 修改 `walk` 函數以限制路徑的最大長度為一定步數(例如 100),並觀察上述程式碼有時會返回此值。 +> **任務 1:** 修改 `walk` 函式,限制路徑的最大長度為一定的步數(例如,100步),並觀察上面程式碼不時返回這個值。 -> **任務 2:** 修改 `walk` 函數,使其不會回到之前已經到過的地方。這將防止 `walk` 進入循環,但代理仍可能被「困」在無法逃脫的位置。 +> **任務 2:** 修改 `walk` 函式,使其不會返回先前已經到過的地方。這將防止 `walk` 產生無限循環,但代理仍然可能會被困在一個無法逃脫的位置。 ## 導航 -更好的導航政策是我們在訓練期間使用的政策,它結合了利用和探索。在此政策中,我們將以一定的概率選擇每個行動,該概率與 Q-Table 中的值成比例。此策略可能仍會導致代理返回到已探索過的位置,但正如您從以下程式碼中看到的,它會導致到達目標位置的平均路徑非常短(請記住,`print_statistics` 會模擬 100 次):(程式碼區塊 10) +一個更好的導航策略是我們訓練時使用的,結合了利用與探索。在這個策略中,我們會以與 Q-表中數值成比例的機率選擇每個動作。這個策略仍可能導致代理回到已探索過的位置,但正如以下程式碼所示,這會導致到達目標位置的平均路徑非常短(記得 `print_statistics` 會執行模擬100次):(code block 10) ```python def qpolicy(m): @@ -220,28 +297,32 @@ def qpolicy(m): print_statistics(qpolicy) ``` -執行此程式碼後,您應該會得到比之前更短的平均路徑長度,範圍約為 3-6。 +執行此程式碼後,你應該會看到平均路徑長度比之前小得多,大約介於3到6之間。 + +## 探討學習過程 -## 探索學習過程 +如我們所提,學習過程是在探索與利用獲得的問題空間結構知識之間取得平衡。我們已看到學習結果(幫助代理找到短路徑的能力)有所提升,但觀察平均路徑長度在學習過程中的行為也很有趣: -如我們所提到的,學習過程是在探索和利用已獲得的問題空間結構知識之間取得平衡。我們已經看到學習的結果(幫助代理找到通往目標的短路徑的能力)有所改善,但觀察平均路徑長度在學習過程中的變化也很有趣: + -學習過程可以總結如下: +這些學習可以總結為: -- **平均路徑長度增加**。我們在這裡看到的是,起初平均路徑長度增加。這可能是因為當我們對環境一無所知時,很容易陷入不良狀態,例如水或狼。隨著我們學到更多並開始使用這些知識,我們可以更長時間地探索環境,但仍然不太清楚蘋果的位置。 +- 平均路徑長度先增加。我們看到的是,一開始平均路徑長度會增加。這大概是因為當我們對環境一無所知時,很可能會被困在壞狀態中,如水域或狼。當我們學到更多並開始利用這些知識時,可以探索環境更長時間,但仍不太了解蘋果的位置。 -- **隨著學習的深入,路徑長度減少**。一旦我們學到足夠的知識,代理更容易達成目標,路徑長度開始減少。然而,我們仍然保持探索的開放性,因此經常偏離最佳路徑,探索新的選項,導致路徑比最佳路徑更長。 +- 隨著學習增加路徑長度減少。一旦學習足夠,代理達成目標變得更容易,路徑長度開始縮短。然而,我們仍然保持探索,因此常常偏離最佳路徑並嘗試新選項,使路徑比最優長。 -- **路徑長度突然增加**。我們在圖表上還觀察到某些時候路徑長度突然增加。這表明過程的隨機性,並且我們可能在某些時候通過覆寫新值「破壞」了 Q-Table 的係數。理想情況下,這應該通過降低學習率來最小化(例如,在訓練結束時,我們僅以小值調整 Q-Table 的值)。 +- 路徑長度突然增加。我們也從圖中觀察到,有時路徑長度會突然增加。這顯示過程的隨機性,以及在某些時候我們可能會用新值覆蓋 Q-表係數,導致「破壞」它們。在理想狀況下,這種情形應該透過降低學習率來減少(例如,在訓練末期,只以很小的值調整 Q-表)。 -總體而言,重要的是要記住,學習過程的成功和質量在很大程度上取決於參數,例如學習率、學習率衰減和折扣因子。這些通常被稱為 **超參數**,以區別於 **參數**,後者是在訓練期間優化的(例如 Q-Table 的係數)。尋找最佳超參數值的過程稱為 **超參數優化**,這是一個值得單獨討論的主題。 +整體而言,重要的是要記住學習過程的成功與品質在很大程度上取決於參數,如學習率、學習率衰減及折扣因子。這些通常稱為超參數,用以區別於在訓練中優化的參數(例如 Q-表係數)。尋找最佳超參數的過程稱為超參數優化,這是值得另行討論的主題。 ## [課後測驗](https://ff-quizzes.netlify.app/en/ml/) -## 作業 -[更真實的世界](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