diff --git a/translations/hr/1-Introduction/1-intro-to-ML/README.md b/translations/hr/1-Introduction/1-intro-to-ML/README.md new file mode 100644 index 00000000..32121867 --- /dev/null +++ b/translations/hr/1-Introduction/1-intro-to-ML/README.md @@ -0,0 +1,159 @@ + +# Uvod u strojno učenje + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML za početnike - Uvod u strojno učenje za početnike](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "ML za početnike - Uvod u strojno učenje za početnike") + +> 🎥 Kliknite na sliku iznad za kratki video koji prolazi kroz ovu lekciju. + +Dobrodošli na ovaj tečaj klasičnog strojnog učenja za početnike! Bez obzira jeste li potpuno novi u ovoj temi ili ste iskusni praktičar strojnog učenja koji želi obnoviti znanje u određenom području, drago nam je što ste s nama! Želimo stvoriti prijateljsko polazište za vaše proučavanje strojnog učenja i rado ćemo procijeniti, odgovoriti na i uključiti vaše [povratne informacije](https://github.com/microsoft/ML-For-Beginners/discussions). + +[![Uvod u ML](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Uvod u ML") + +> 🎥 Kliknite na sliku iznad za video: John Guttag s MIT-a uvodi u strojno učenje + +--- +## Početak sa strojnim učenjem + +Prije nego što započnete s ovim kurikulumom, trebate pripremiti svoje računalo za lokalno pokretanje bilježnica. + +- **Konfigurirajte svoje računalo pomoću ovih videa**. Koristite sljedeće poveznice kako biste naučili [kako instalirati Python](https://youtu.be/CXZYvNRIAKM) na svoj sustav i [postaviti uređivač teksta](https://youtu.be/EU8eayHWoZg) za razvoj. +- **Naučite Python**. Također se preporučuje osnovno razumijevanje [Pythona](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), programskog jezika korisnog za znanstvenike podataka koji koristimo u ovom tečaju. +- **Naučite Node.js i JavaScript**. Također ćemo nekoliko puta koristiti JavaScript u ovom tečaju prilikom izrade web aplikacija, pa ćete trebati imati instalirane [node](https://nodejs.org) i [npm](https://www.npmjs.com/), kao i [Visual Studio Code](https://code.visualstudio.com/) za razvoj u Pythonu i JavaScriptu. +- **Kreirajte GitHub račun**. Budući da ste nas pronašli ovdje na [GitHubu](https://github.com), možda već imate račun, ali ako nemate, kreirajte ga i zatim forkajte ovaj kurikulum kako biste ga koristili sami. (Slobodno nam dajte zvjezdicu 😊) +- **Istražite Scikit-learn**. Upoznajte se s [Scikit-learn](https://scikit-learn.org/stable/user_guide.html), skupom ML biblioteka na koje se pozivamo u ovim lekcijama. + +--- +## Što je strojno učenje? + +Pojam 'strojno učenje' jedan je od najpopularnijih i najčešće korištenih pojmova današnjice. Postoji velika vjerojatnost da ste ovaj pojam čuli barem jednom ako imate bilo kakvu povezanost s tehnologijom, bez obzira na područje u kojem radite. Međutim, mehanika strojnog učenja za većinu ljudi ostaje misterij. Za početnika u strojnome učenju, tema ponekad može djelovati zastrašujuće. Stoga je važno razumjeti što strojno učenje zapravo jest i učiti o njemu korak po korak, kroz praktične primjere. + +--- +## Krivulja popularnosti + +![krivulja popularnosti strojnog učenja](../../../../1-Introduction/1-intro-to-ML/images/hype.png) + +> Google Trends prikazuje nedavnu 'krivulju popularnosti' pojma 'strojno učenje' + +--- +## Tajanstveni svemir + +Živimo u svemiru punom fascinantnih misterija. Veliki znanstvenici poput Stephena Hawkinga, Alberta Einsteina i mnogih drugih posvetili su svoje živote traženju značajnih informacija koje otkrivaju misterije svijeta oko nas. Ovo je ljudska potreba za učenjem: ljudsko dijete uči nove stvari i otkriva strukturu svog svijeta iz godine u godinu dok odrasta. + +--- +## Dječji mozak + +Dječji mozak i osjetila percipiraju činjenice iz svoje okoline i postupno uče skrivene obrasce života koji pomažu djetetu da oblikuje logička pravila za prepoznavanje naučenih obrazaca. Proces učenja ljudskog mozga čini ljude najsloženijim živim bićima na svijetu. Kontinuirano učenje otkrivanjem skrivenih obrazaca, a zatim inoviranje na temelju tih obrazaca omogućuje nam da postajemo sve bolji tijekom života. Ova sposobnost učenja i evolucije povezana je s konceptom zvanim [plastičnost mozga](https://www.simplypsychology.org/brain-plasticity.html). Površno gledano, možemo povući neke motivacijske sličnosti između procesa učenja ljudskog mozga i koncepata strojnog učenja. + +--- +## Ljudski mozak + +[Ljudski mozak](https://www.livescience.com/29365-human-brain.html) percipira stvari iz stvarnog svijeta, obrađuje percipirane informacije, donosi racionalne odluke i izvodi određene radnje na temelju okolnosti. To nazivamo inteligentnim ponašanjem. Kada programiramo imitaciju procesa inteligentnog ponašanja u stroj, to nazivamo umjetnom inteligencijom (AI). + +--- +## Neki pojmovi + +Iako se pojmovi mogu zamijeniti, strojno učenje (ML) važan je podskup umjetne inteligencije. **ML se bavi korištenjem specijaliziranih algoritama za otkrivanje značajnih informacija i pronalaženje skrivenih obrazaca iz percipiranih podataka kako bi se podržao proces donošenja racionalnih odluka**. + +--- +## AI, ML, Duboko učenje + +![AI, ML, duboko učenje, znanost o podacima](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png) + +> Dijagram koji prikazuje odnose između AI, ML, dubokog učenja i znanosti o podacima. Infografika autorice [Jen Looper](https://twitter.com/jenlooper) inspirirana [ovom grafikom](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining) + +--- +## Koncepti koje ćemo obraditi + +U ovom kurikulumu obradit ćemo samo osnovne koncepte strojnog učenja koje početnik mora znati. Obradit ćemo ono što nazivamo 'klasičnim strojnim učenjem', primarno koristeći Scikit-learn, izvrsnu biblioteku koju mnogi studenti koriste za učenje osnova. Za razumijevanje šireg konteksta umjetne inteligencije ili dubokog učenja, snažno temeljno znanje o strojnome učenju je neophodno, i to vam želimo ponuditi ovdje. + +--- +## Na ovom tečaju naučit ćete: + +- osnovne koncepte strojnog učenja +- povijest ML-a +- ML i pravednost +- tehnike regresijskog ML-a +- tehnike klasifikacijskog ML-a +- tehnike klasteriranja ML-a +- tehnike obrade prirodnog jezika ML-a +- tehnike predviđanja vremenskih serija ML-a +- učenje pojačanjem +- primjene ML-a u stvarnom svijetu + +--- +## Što nećemo obraditi + +- duboko učenje +- neuronske mreže +- AI + +Kako bismo omogućili bolje iskustvo učenja, izbjeći ćemo složenosti neuronskih mreža, 'dubokog učenja' - modeliranja s više slojeva koristeći neuronske mreže - i AI, o čemu ćemo raspravljati u drugom kurikulumu. Također ćemo ponuditi nadolazeći kurikulum o znanosti o podacima kako bismo se usredotočili na taj aspekt ovog šireg područja. + +--- +## Zašto učiti strojno učenje? + +Strojno učenje, iz perspektive sustava, definira se kao stvaranje automatiziranih sustava koji mogu učiti skrivene obrasce iz podataka kako bi pomogli u donošenju inteligentnih odluka. + +Ova motivacija labavo je inspirirana načinom na koji ljudski mozak uči određene stvari na temelju podataka koje percipira iz vanjskog svijeta. + +✅ Razmislite na trenutak zašto bi neka tvrtka željela koristiti strategije strojnog učenja umjesto stvaranja strogo kodiranog sustava temeljenog na pravilima. + +--- +## Primjene strojnog učenja + +Primjene strojnog učenja sada su gotovo svugdje i jednako su sveprisutne kao i podaci koji kruže našim društvima, generirani našim pametnim telefonima, povezanim uređajima i drugim sustavima. S obzirom na ogroman potencijal najsuvremenijih algoritama strojnog učenja, istraživači istražuju njihove mogućnosti za rješavanje višedimenzionalnih i multidisciplinarnih problema iz stvarnog života s iznimno pozitivnim rezultatima. + +--- +## Primjeri primijenjenog ML-a + +**Strojno učenje možete koristiti na mnogo načina**: + +- Za predviđanje vjerojatnosti bolesti na temelju medicinske povijesti ili izvještaja pacijenta. +- Za korištenje meteoroloških podataka za predviđanje vremenskih događaja. +- Za razumijevanje sentimenta teksta. +- Za otkrivanje lažnih vijesti kako bi se zaustavilo širenje propagande. + +Financije, ekonomija, znanost o Zemlji, istraživanje svemira, biomedicinsko inženjerstvo, kognitivna znanost, pa čak i područja humanističkih znanosti prilagodila su strojno učenje za rješavanje teških problema obrade podataka u svojim domenama. + +--- +## Zaključak + +Strojno učenje automatizira proces otkrivanja obrazaca pronalazeći značajne uvide iz stvarnih ili generiranih podataka. Pokazalo se iznimno vrijednim u poslovnim, zdravstvenim i financijskim primjenama, među ostalima. + +U bliskoj budućnosti, razumijevanje osnova strojnog učenja postat će nužnost za ljude iz bilo kojeg područja zbog njegove široke primjene. + +--- +# 🚀 Izazov + +Nacrtajte, na papiru ili koristeći online aplikaciju poput [Excalidraw](https://excalidraw.com/), svoje razumijevanje razlika između AI, ML, dubokog učenja i znanosti o podacima. Dodajte neke ideje o problemima koje su ove tehnike dobre u rješavanju. + +# [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +--- +# Pregled i samostalno učenje + +Kako biste saznali više o tome kako raditi s ML algoritmima u oblaku, slijedite ovu [Putanju učenja](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott). + +Prođite [Putanju učenja](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) o osnovama ML-a. + +--- +# Zadatak + +[Pokrenite se](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za nesporazume ili pogrešne interpretacije koje mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/1-Introduction/1-intro-to-ML/assignment.md b/translations/hr/1-Introduction/1-intro-to-ML/assignment.md new file mode 100644 index 00000000..00f03890 --- /dev/null +++ b/translations/hr/1-Introduction/1-intro-to-ML/assignment.md @@ -0,0 +1,23 @@ + +# Pokreni i započni + +## Upute + +U ovom zadatku bez ocjenjivanja, trebali biste osvježiti svoje znanje o Pythonu i pripremiti svoje okruženje za pokretanje bilježnica. + +Prođite kroz ovaj [Put učenja Pythona](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), a zatim postavite svoje sustave gledajući ove uvodne videozapise: + +https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6 + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/1-Introduction/2-history-of-ML/README.md b/translations/hr/1-Introduction/2-history-of-ML/README.md new file mode 100644 index 00000000..68fe43c5 --- /dev/null +++ b/translations/hr/1-Introduction/2-history-of-ML/README.md @@ -0,0 +1,164 @@ + +# Povijest strojnog učenja + +![Sažetak povijesti strojnog učenja u sketchnoteu](../../../../sketchnotes/ml-history.png) +> Sketchnote autorice [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![Strojno učenje za početnike - Povijest strojnog učenja](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "Strojno učenje za početnike - Povijest strojnog učenja") + +> 🎥 Kliknite na sliku iznad za kratki video koji obrađuje ovu lekciju. + +U ovoj lekciji proći ćemo kroz ključne prekretnice u povijesti strojnog učenja i umjetne inteligencije. + +Povijest umjetne inteligencije (AI) kao područja usko je povezana s poviješću strojnog učenja, budući da su algoritmi i računalni napredak koji čine temelj ML-a pridonijeli razvoju AI-a. Važno je zapamtiti da, iako su se ova područja kao zasebne discipline počela kristalizirati 1950-ih, važna [algoritamska, statistička, matematička, računalna i tehnička otkrića](https://wikipedia.org/wiki/Timeline_of_machine_learning) prethodila su tom razdoblju i preklapala se s njim. Zapravo, ljudi razmišljaju o ovim pitanjima već [stotinama godina](https://wikipedia.org/wiki/History_of_artificial_intelligence): ovaj članak raspravlja o povijesnim intelektualnim temeljima ideje o 'stroju koji razmišlja'. + +--- +## Značajna otkrića + +- 1763, 1812 [Bayesov teorem](https://wikipedia.org/wiki/Bayes%27_theorem) i njegovi prethodnici. Ovaj teorem i njegove primjene čine temelj zaključivanja, opisujući vjerojatnost događaja na temelju prethodnog znanja. +- 1805 [Teorija najmanjih kvadrata](https://wikipedia.org/wiki/Least_squares) francuskog matematičara Adriena-Marie Legendrea. Ova teorija, o kojoj ćete učiti u našoj jedinici o regresiji, pomaže u prilagodbi podataka. +- 1913 [Markovljevi lanci](https://wikipedia.org/wiki/Markov_chain), nazvani po ruskom matematičaru Andreju Markovu, koriste se za opisivanje slijeda mogućih događaja na temelju prethodnog stanja. +- 1957 [Perceptron](https://wikipedia.org/wiki/Perceptron) je vrsta linearnog klasifikatora koju je izumio američki psiholog Frank Rosenblatt, a koja čini temelj napretka u dubokom učenju. + +--- + +- 1967 [Najbliži susjed](https://wikipedia.org/wiki/Nearest_neighbor) je algoritam izvorno dizajniran za mapiranje ruta. U kontekstu ML-a koristi se za otkrivanje uzoraka. +- 1970 [Backpropagation](https://wikipedia.org/wiki/Backpropagation) koristi se za treniranje [feedforward neuronskih mreža](https://wikipedia.org/wiki/Feedforward_neural_network). +- 1982 [Rekurentne neuronske mreže](https://wikipedia.org/wiki/Recurrent_neural_network) su umjetne neuronske mreže izvedene iz feedforward neuronskih mreža koje stvaraju vremenske grafove. + +✅ Istražite malo. Koji drugi datumi se ističu kao ključni u povijesti ML-a i AI-a? + +--- +## 1950: Strojevi koji razmišljaju + +Alan Turing, doista izvanredna osoba koju je [javnost 2019. godine](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) proglasila najvećim znanstvenikom 20. stoljeća, zaslužan je za postavljanje temelja koncepta 'stroja koji može razmišljati'. Suočavao se s kritičarima i vlastitom potrebom za empirijskim dokazima ovog koncepta djelomično stvaranjem [Turingovog testa](https://www.bbc.com/news/technology-18475646), koji ćete istražiti u našim lekcijama o NLP-u. + +--- +## 1956: Ljetni istraživački projekt na Dartmouthu + +"Ljetni istraživački projekt na Dartmouthu o umjetnoj inteligenciji bio je ključni događaj za umjetnu inteligenciju kao područje," i ovdje je skovan termin 'umjetna inteligencija' ([izvor](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)). + +> Svaki aspekt učenja ili bilo koja druga značajka inteligencije može se u načelu tako precizno opisati da se stroj može napraviti da ga simulira. + +--- + +Glavni istraživač, profesor matematike John McCarthy, nadao se "nastaviti na temelju pretpostavke da se svaki aspekt učenja ili bilo koja druga značajka inteligencije može u načelu tako precizno opisati da se stroj može napraviti da ga simulira." Sudionici su uključivali još jednu istaknutu osobu u ovom području, Marvina Minskyja. + +Radionica je zaslužna za pokretanje i poticanje nekoliko rasprava, uključujući "uspon simboličkih metoda, sustava usmjerenih na ograničene domene (rani ekspertni sustavi) i deduktivnih sustava naspram induktivnih sustava." ([izvor](https://wikipedia.org/wiki/Dartmouth_workshop)). + +--- +## 1956 - 1974: "Zlatne godine" + +Od 1950-ih do sredine '70-ih, optimizam je bio velik u nadi da AI može riješiti mnoge probleme. Godine 1967. Marvin Minsky je samouvjereno izjavio: "Unutar jedne generacije ... problem stvaranja 'umjetne inteligencije' bit će u velikoj mjeri riješen." (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall) + +Istraživanje obrade prirodnog jezika je cvjetalo, pretraživanje je usavršeno i postalo moćnije, a stvoren je koncept 'mikro-svjetova', gdje su jednostavni zadaci izvršavani koristeći upute u običnom jeziku. + +--- + +Istraživanje je bilo dobro financirano od strane vladinih agencija, postignut je napredak u računalstvu i algoritmima, a prototipovi inteligentnih strojeva su izgrađeni. Neki od tih strojeva uključuju: + +* [Shakey robot](https://wikipedia.org/wiki/Shakey_the_robot), koji se mogao kretati i odlučivati kako inteligentno obavljati zadatke. + + ![Shakey, inteligentni robot](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg) + > Shakey 1972. godine + +--- + +* Eliza, rani 'chatterbot', mogla je razgovarati s ljudima i djelovati kao primitivni 'terapeut'. Više o Elizi ćete naučiti u lekcijama o NLP-u. + + ![Eliza, bot](../../../../1-Introduction/2-history-of-ML/images/eliza.png) + > Verzija Elize, chatbot + +--- + +* "Blocks world" bio je primjer mikro-svijeta gdje su se blokovi mogli slagati i sortirati, a eksperimenti u podučavanju strojeva donošenju odluka mogli su se testirati. Napredak postignut s bibliotekama poput [SHRDLU](https://wikipedia.org/wiki/SHRDLU) pomogao je u napretku obrade jezika. + + [![blocks world sa SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "blocks world sa SHRDLU") + + > 🎥 Kliknite na sliku iznad za video: Blocks world sa SHRDLU + +--- +## 1974 - 1980: "Zima AI-a" + +Do sredine 1970-ih postalo je jasno da je složenost stvaranja 'inteligentnih strojeva' bila podcijenjena i da je njezino obećanje, s obzirom na dostupnu računalnu snagu, bilo precijenjeno. Financiranje je presušilo, a povjerenje u ovo područje usporilo. Neki problemi koji su utjecali na povjerenje uključuju: +--- +- **Ograničenja**. Računalna snaga bila je previše ograničena. +- **Kombinatorna eksplozija**. Broj parametara koje je trebalo trenirati eksponencijalno je rastao kako se od računala tražilo više, bez paralelnog razvoja računalne snage i sposobnosti. +- **Nedostatak podataka**. Nedostatak podataka otežavao je proces testiranja, razvoja i usavršavanja algoritama. +- **Postavljamo li prava pitanja?**. Sama pitanja koja su se postavljala počela su se dovoditi u pitanje. Istraživači su se suočavali s kritikama svojih pristupa: + - Turingovi testovi dovedeni su u pitanje, između ostalog, teorijom 'kineske sobe' koja je tvrdila da "programiranje digitalnog računala može učiniti da izgleda kao da razumije jezik, ali ne može proizvesti stvarno razumijevanje." ([izvor](https://plato.stanford.edu/entries/chinese-room/)) + - Etika uvođenja umjetnih inteligencija poput "terapeuta" ELIZE u društvo bila je izazvana. + +--- + +Istovremeno, počele su se formirati različite škole mišljenja o AI-u. Uspostavljena je dihotomija između praksi ["neurednog" i "urednog AI-a"](https://wikipedia.org/wiki/Neats_and_scruffies). _Neuredni_ laboratoriji su satima prilagođavali programe dok nisu postigli željene rezultate. _Uredni_ laboratoriji "fokusirali su se na logiku i formalno rješavanje problema". ELIZA i SHRDLU bili su poznati _neuredni_ sustavi. U 1980-ima, kako se pojavila potreba za reproducibilnošću ML sustava, _uredni_ pristup postupno je preuzeo primat jer su njegovi rezultati bili objašnjiviji. + +--- +## 1980-e Ekspertni sustavi + +Kako je područje raslo, njegova korist za poslovanje postala je jasnija, a 1980-ih došlo je do proliferacije 'ekspertnih sustava'. "Ekspertni sustavi bili su među prvim zaista uspješnim oblicima softvera umjetne inteligencije (AI)." ([izvor](https://wikipedia.org/wiki/Expert_system)). + +Ova vrsta sustava zapravo je _hibridna_, djelomično se sastoji od sustava pravila koji definira poslovne zahtjeve i sustava zaključivanja koji koristi sustav pravila za izvođenje novih činjenica. + +Ovo razdoblje također je donijelo sve veći interes za neuronske mreže. + +--- +## 1987 - 1993: AI 'hladnoća' + +Proliferacija specijaliziranog hardvera za ekspertne sustave imala je nesretan učinak prevelike specijalizacije. Pojava osobnih računala također je konkurirala ovim velikim, specijaliziranim, centraliziranim sustavima. Demokratizacija računalstva je započela i na kraju otvorila put za modernu eksploziju velikih podataka. + +--- +## 1993 - 2011 + +Ovo razdoblje donijelo je novu eru za ML i AI kako bi mogli riješiti neke probleme uzrokovane ranije nedostatkom podataka i računalne snage. Količina podataka počela je brzo rasti i postajati dostupnija, na bolje i na gore, posebno s pojavom pametnog telefona oko 2007. godine. Računalna snaga eksponencijalno se povećala, a algoritmi su se razvijali paralelno. Područje je počelo sazrijevati kako su slobodniji dani prošlosti počeli kristalizirati u pravu disciplinu. + +--- +## Sada + +Danas strojno učenje i AI dodiruju gotovo svaki dio našeg života. Ovo razdoblje zahtijeva pažljivo razumijevanje rizika i potencijalnih učinaka ovih algoritama na ljudske živote. Kako je izjavio Brad Smith iz Microsofta: "Informacijska tehnologija postavlja pitanja koja se tiču temeljnih zaštita ljudskih prava poput privatnosti i slobode izražavanja. Ova pitanja povećavaju odgovornost tehnoloških tvrtki koje stvaraju ove proizvode. Po našem mišljenju, također pozivaju na promišljenu regulaciju vlade i razvoj normi oko prihvatljivih upotreba" ([izvor](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)). + +--- + +Ostaje vidjeti što budućnost donosi, ali važno je razumjeti ove računalne sustave i softver te algoritme koje pokreću. Nadamo se da će vam ovaj kurikulum pomoći da steknete bolje razumijevanje kako biste sami mogli donijeti odluke. + +[![Povijest dubokog učenja](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "Povijest dubokog učenja") +> 🎥 Kliknite na sliku iznad za video: Yann LeCun raspravlja o povijesti dubokog učenja u ovom predavanju + +--- +## 🚀Izazov + +Zaronite u jedan od ovih povijesnih trenutaka i saznajte više o ljudima koji stoje iza njih. Postoje fascinantni likovi, a nijedno znanstveno otkriće nikada nije nastalo u kulturnom vakuumu. Što otkrivate? + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +--- +## Pregled i samostalno učenje + +Evo stavki za gledanje i slušanje: + +[Ovaj podcast u kojem Amy Boyd raspravlja o evoluciji AI-a](http://runasradio.com/Shows/Show/739) + +[![Povijest AI-a od Amy Boyd](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "Povijest AI-a od Amy Boyd") + +--- + +## Zadatak + +[Izradite vremensku crtu](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/1-Introduction/2-history-of-ML/assignment.md b/translations/hr/1-Introduction/2-history-of-ML/assignment.md new file mode 100644 index 00000000..7e7a260d --- /dev/null +++ b/translations/hr/1-Introduction/2-history-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Izradite vremensku crtu + +## Upute + +Koristeći [ovaj repozitorij](https://github.com/Digital-Humanities-Toolkit/timeline-builder), izradite vremensku crtu nekog aspekta povijesti algoritama, matematike, statistike, AI ili ML, ili kombinaciju ovih. Možete se fokusirati na jednu osobu, jednu ideju ili duži vremenski period razmišljanja. Obavezno dodajte multimedijalne elemente. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ------------------------------------------------ | --------------------------------------- | ------------------------------------------------------------- | +| | Objavljena vremenska crta prikazana kao GitHub stranica | Kod je nepotpun i nije objavljen | Vremenska crta je nepotpuna, nedovoljno istražena i nije objavljena | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden koristeći AI uslugu za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/1-Introduction/3-fairness/README.md b/translations/hr/1-Introduction/3-fairness/README.md new file mode 100644 index 00000000..89369704 --- /dev/null +++ b/translations/hr/1-Introduction/3-fairness/README.md @@ -0,0 +1,164 @@ + +# Izgradnja rješenja za strojno učenje s odgovornom umjetnom inteligencijom + +![Sažetak odgovorne umjetne inteligencije u strojnome učenju u obliku sketchnotea](../../../../sketchnotes/ml-fairness.png) +> Sketchnote autorice [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +U ovom kurikulumu počet ćete otkrivati kako strojno učenje može utjecati na naše svakodnevne živote. Već sada sustavi i modeli sudjeluju u svakodnevnim zadacima donošenja odluka, poput dijagnoza u zdravstvenoj skrbi, odobravanja kredita ili otkrivanja prijevara. Stoga je važno da ti modeli dobro funkcioniraju kako bi pružili pouzdane rezultate. Kao i svaka softverska aplikacija, sustavi umjetne inteligencije mogu podbaciti u ispunjavanju očekivanja ili imati neželjene ishode. Zato je ključno razumjeti i objasniti ponašanje AI modela. + +Zamislite što se može dogoditi kada podaci koje koristite za izgradnju tih modela nedostaju određene demografske skupine, poput rase, spola, političkih stavova, religije, ili kada su te demografske skupine neproporcionalno zastupljene. Što ako se izlaz modela interpretira tako da favorizira određenu demografsku skupinu? Koje su posljedice za aplikaciju? Osim toga, što se događa kada model ima negativan ishod koji šteti ljudima? Tko je odgovoran za ponašanje AI sustava? Ovo su neka od pitanja koja ćemo istražiti u ovom kurikulumu. + +U ovoj lekciji ćete: + +- Povećati svijest o važnosti pravednosti u strojnome učenju i štetama povezanim s nepravednošću. +- Upoznati se s praksom istraživanja odstupanja i neobičnih scenarija kako biste osigurali pouzdanost i sigurnost. +- Steći razumijevanje o potrebi osnaživanja svih kroz dizajniranje inkluzivnih sustava. +- Istražiti koliko je važno zaštititi privatnost i sigurnost podataka i ljudi. +- Uvidjeti važnost pristupa "staklene kutije" za objašnjavanje ponašanja AI modela. +- Biti svjesni kako je odgovornost ključna za izgradnju povjerenja u AI sustave. + +## Preduvjeti + +Kao preduvjet, molimo vas da završite "Principi odgovorne umjetne inteligencije" Learn Path i pogledate videozapis u nastavku na tu temu: + +Saznajte više o odgovornoj umjetnoj inteligenciji prateći ovaj [Learning Path](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) + +[![Microsoftov pristup odgovornoj umjetnoj inteligenciji](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoftov pristup odgovornoj umjetnoj inteligenciji") + +> 🎥 Kliknite na sliku iznad za video: Microsoftov pristup odgovornoj umjetnoj inteligenciji + +## Pravednost + +AI sustavi trebali bi tretirati sve ljude jednako i izbjegavati različito utjecanje na slične skupine ljudi. Na primjer, kada AI sustavi pružaju smjernice o medicinskom tretmanu, aplikacijama za kredite ili zapošljavanju, trebali bi davati iste preporuke svima sličnih simptoma, financijskih okolnosti ili profesionalnih kvalifikacija. Svaki od nas kao ljudi nosi naslijeđene pristranosti koje utječu na naše odluke i postupke. Te pristranosti mogu biti vidljive u podacima koje koristimo za treniranje AI sustava. Takva manipulacija ponekad se događa nenamjerno. Često je teško svjesno znati kada uvodite pristranost u podatke. + +**"Nepravednost"** obuhvaća negativne utjecaje ili "štete" za skupinu ljudi, poput onih definiranih prema rasi, spolu, dobi ili statusu invaliditeta. Glavne štete povezane s pravednošću mogu se klasificirati kao: + +- **Dodjela**, ako je, na primjer, spol ili etnička pripadnost favorizirana u odnosu na drugu. +- **Kvaliteta usluge**. Ako trenirate podatke za jedan specifičan scenarij, ali stvarnost je mnogo složenija, to dovodi do loše izvedbe usluge. Na primjer, dozator sapuna koji ne može prepoznati ljude s tamnom kožom. [Referenca](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) +- **Omalovažavanje**. Nepravedno kritiziranje i označavanje nečega ili nekoga. Na primjer, tehnologija za označavanje slika neslavno je pogrešno označila slike tamnoputih ljudi kao gorile. +- **Prekomjerna ili nedovoljna zastupljenost**. Ideja da određena skupina nije viđena u određenoj profesiji, a svaka usluga ili funkcija koja to nastavlja promovirati doprinosi šteti. +- **Stereotipiziranje**. Povezivanje određene skupine s unaprijed dodijeljenim atributima. Na primjer, sustav za prevođenje između engleskog i turskog može imati netočnosti zbog riječi sa stereotipnim asocijacijama na spol. + +![prijevod na turski](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png) +> prijevod na turski + +![prijevod natrag na engleski](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) +> prijevod natrag na engleski + +Prilikom dizajniranja i testiranja AI sustava, moramo osigurati da AI bude pravedan i da nije programiran za donošenje pristranih ili diskriminatornih odluka, koje su zabranjene i ljudima. Osiguravanje pravednosti u AI i strojnome učenju ostaje složen sociotehnički izazov. + +### Pouzdanost i sigurnost + +Kako bismo izgradili povjerenje, AI sustavi moraju biti pouzdani, sigurni i dosljedni u normalnim i neočekivanim uvjetima. Važno je znati kako će se AI sustavi ponašati u raznim situacijama, posebno kada su u pitanju odstupanja. Prilikom izgradnje AI rješenja, potrebno je posvetiti značajnu pažnju tome kako se nositi s raznim okolnostima koje AI rješenja mogu susresti. Na primjer, samovozeći automobil mora staviti sigurnost ljudi kao glavni prioritet. Kao rezultat toga, AI koji pokreće automobil mora uzeti u obzir sve moguće scenarije s kojima se automobil može susresti, poput noći, oluja, snježnih mećava, djece koja trče preko ulice, kućnih ljubimaca, radova na cesti itd. Koliko dobro AI sustav može pouzdano i sigurno upravljati širokim rasponom uvjeta odražava razinu predviđanja koju je podatkovni znanstvenik ili AI programer uzeo u obzir tijekom dizajna ili testiranja sustava. + +> [🎥 Kliknite ovdje za video: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) + +### Inkluzivnost + +AI sustavi trebali bi biti dizajnirani tako da angažiraju i osnažuju sve ljude. Prilikom dizajniranja i implementacije AI sustava, podatkovni znanstvenici i AI programeri identificiraju i rješavaju potencijalne prepreke u sustavu koje bi mogle nenamjerno isključiti ljude. Na primjer, postoji 1 milijarda ljudi s invaliditetom diljem svijeta. S napretkom AI-a, oni mogu lakše pristupiti širokom rasponu informacija i prilika u svakodnevnom životu. Rješavanjem prepreka stvaraju se prilike za inovacije i razvoj AI proizvoda s boljim iskustvima koja koriste svima. + +> [🎥 Kliknite ovdje za video: inkluzivnost u AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v) + +### Sigurnost i privatnost + +AI sustavi trebali bi biti sigurni i poštovati privatnost ljudi. Ljudi imaju manje povjerenja u sustave koji ugrožavaju njihovu privatnost, informacije ili živote. Prilikom treniranja modela strojnog učenja, oslanjamo se na podatke kako bismo postigli najbolje rezultate. Pritom se mora uzeti u obzir podrijetlo podataka i njihov integritet. Na primjer, jesu li podaci korisnički dostavljeni ili javno dostupni? Nadalje, dok radimo s podacima, ključno je razviti AI sustave koji mogu zaštititi povjerljive informacije i odoljeti napadima. Kako AI postaje sve prisutniji, zaštita privatnosti i osiguranje važnih osobnih i poslovnih informacija postaje sve kritičnija i složenija. Problemi privatnosti i sigurnosti podataka zahtijevaju posebnu pažnju za AI jer je pristup podacima ključan za to da AI sustavi donose točne i informirane predikcije i odluke o ljudima. + +> [🎥 Kliknite ovdje za video: sigurnost u AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Industrija je postigla značajan napredak u privatnosti i sigurnosti, potaknut značajno regulativama poput GDPR-a (Opća uredba o zaštiti podataka). +- Ipak, s AI sustavima moramo priznati napetost između potrebe za više osobnih podataka kako bi sustavi bili osobniji i učinkovitiji – i privatnosti. +- Kao i s pojavom povezanih računala putem interneta, također vidimo veliki porast broja sigurnosnih problema povezanih s AI-jem. +- Istovremeno, vidimo da se AI koristi za poboljšanje sigurnosti. Na primjer, većina modernih antivirusnih skenera danas se pokreće AI heuristikom. +- Moramo osigurati da naši procesi podatkovne znanosti skladno surađuju s najnovijim praksama privatnosti i sigurnosti. + +### Transparentnost + +AI sustavi trebali bi biti razumljivi. Ključni dio transparentnosti je objašnjavanje ponašanja AI sustava i njihovih komponenti. Poboljšanje razumijevanja AI sustava zahtijeva da dionici shvate kako i zašto funkcioniraju kako bi mogli identificirati potencijalne probleme s izvedbom, zabrinutosti za sigurnost i privatnost, pristranosti, isključujuće prakse ili neželjene ishode. Također vjerujemo da oni koji koriste AI sustave trebaju biti iskreni i otvoreni o tome kada, zašto i kako odlučuju implementirati te sustave, kao i o ograničenjima sustava koje koriste. Na primjer, ako banka koristi AI sustav za podršku svojim odlukama o kreditiranju potrošača, važno je ispitati ishode i razumjeti koji podaci utječu na preporuke sustava. Vlade počinju regulirati AI u različitim industrijama, pa podatkovni znanstvenici i organizacije moraju objasniti ispunjava li AI sustav regulatorne zahtjeve, posebno kada dođe do neželjenog ishoda. + +> [🎥 Kliknite ovdje za video: transparentnost u AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Budući da su AI sustavi toliko složeni, teško je razumjeti kako funkcioniraju i interpretirati rezultate. +- Taj nedostatak razumijevanja utječe na način na koji se ti sustavi upravljaju, operacionaliziraju i dokumentiraju. +- Taj nedostatak razumijevanja još važnije utječe na odluke donesene na temelju rezultata koje ti sustavi proizvode. + +### Odgovornost + +Ljudi koji dizajniraju i implementiraju AI sustave moraju biti odgovorni za način na koji njihovi sustavi funkcioniraju. Potreba za odgovornošću posebno je važna kod osjetljivih tehnologija poput prepoznavanja lica. Nedavno je porasla potražnja za tehnologijom prepoznavanja lica, posebno od strane organizacija za provedbu zakona koje vide potencijal tehnologije u primjenama poput pronalaženja nestale djece. Međutim, te tehnologije potencijalno bi mogle biti korištene od strane vlada za ugrožavanje temeljnih sloboda građana, primjerice omogućavanjem kontinuiranog nadzora određenih pojedinaca. Stoga podatkovni znanstvenici i organizacije moraju biti odgovorni za način na koji njihov AI sustav utječe na pojedince ili društvo. + +[![Vodeći istraživač AI-a upozorava na masovni nadzor putem prepoznavanja lica](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoftov pristup odgovornoj umjetnoj inteligenciji") + +> 🎥 Kliknite na sliku iznad za video: Upozorenja o masovnom nadzoru putem prepoznavanja lica + +Na kraju, jedno od najvećih pitanja za našu generaciju, kao prvu generaciju koja donosi AI u društvo, jest kako osigurati da računala ostanu odgovorna ljudima i kako osigurati da ljudi koji dizajniraju računala ostanu odgovorni svima ostalima. + +## Procjena utjecaja + +Prije treniranja modela strojnog učenja, važno je provesti procjenu utjecaja kako biste razumjeli svrhu AI sustava; koja je namjeravana upotreba; gdje će biti implementiran; i tko će komunicirati sa sustavom. Ovo je korisno za recenzente ili testere koji procjenjuju sustav kako bi znali koje čimbenike uzeti u obzir prilikom identificiranja potencijalnih rizika i očekivanih posljedica. + +Sljedeća su područja fokusa prilikom provođenja procjene utjecaja: + +* **Negativan utjecaj na pojedince**. Svijest o bilo kakvim ograničenjima ili zahtjevima, nepodržanoj upotrebi ili poznatim ograničenjima koja ometaju izvedbu sustava ključna je kako bi se osiguralo da sustav nije korišten na način koji bi mogao nanijeti štetu pojedincima. +* **Zahtjevi za podatke**. Razumijevanje kako i gdje će sustav koristiti podatke omogućuje recenzentima da istraže sve zahtjeve za podatke na koje treba obratiti pažnju (npr. GDPR ili HIPPA regulative). Osim toga, provjerite je li izvor ili količina podataka dovoljna za treniranje. +* **Sažetak utjecaja**. Prikupite popis potencijalnih šteta koje bi mogle nastati korištenjem sustava. Tijekom životnog ciklusa ML-a, provjerite jesu li identificirani problemi ublaženi ili riješeni. +* **Primjenjivi ciljevi** za svaki od šest osnovnih principa. Procijenite jesu li ciljevi iz svakog principa ispunjeni i postoje li praznine. + +## Otklanjanje pogrešaka s odgovornom umjetnom inteligencijom + +Slično otklanjanju pogrešaka u softverskoj aplikaciji, otklanjanje pogrešaka u AI sustavu nužan je proces identificiranja i rješavanja problema u sustavu. Postoji mnogo čimbenika koji mogu utjecati na to da model ne funkcionira kako se očekuje ili odgovorno. Većina tradicionalnih metrika izvedbe modela su kvantitativni agregati izvedbe modela, što nije dovoljno za analizu kako model krši principe odgovorne umjetne inteligencije. Nadalje, model strojnog učenja je "crna kutija" koja otežava razumijevanje što pokreće njegov ishod ili pružanje objašnjenja kada pogriješi. Kasnije u ovom tečaju naučit ćemo kako koristiti nadzornu ploču odgovorne umjetne inteligencije za pomoć pri otklanjanju pogrešaka u AI sustavima. Nadzorna ploča pruža holistički alat za podatkovne znanstvenike i AI programere za obavljanje: + +* **Analize pogrešaka**. Identificiranje distribucije pogrešaka modela koje mogu utjecati na pravednost ili pouzdanost sustava. +* **Pregleda modela**. Otkrivanje gdje postoje razlike u izvedbi modela među skupovima podataka. +* **Analize podataka**. Razumijevanje distribucije podataka i identificiranje potencijalne pristranosti u podacima koja bi mogla dovesti do problema s pravednošću, inkluzivnošću i pouzdanošću. +* **Interpretacije modela**. Razumijevanje što utječe ili utječe na predikcije modela. Ovo pomaže u objašnjavanju ponašanja modela, što je važno za transparentnost i odgovornost. + +## 🚀 Izazov + +Kako bismo spriječili da se štete uopće uvedu, trebali bismo: + +- imati raznolikost pozadina i perspektiva među ljudima koji rade na sustavima +- ulagati u skupove podataka koji odražavaju raznolikost našeg društva +- razviti bolje metode tijekom životnog ciklusa strojnog učenja za otkrivanje i ispravljanje odgovorne umjetne inteligencije kada se pojavi + +Razmislite o stvarnim scenarijima gdje je nepouzdanost modela očita u +Pogledajte ovu radionicu za dublje razumijevanje tema: + +- U potrazi za odgovornom umjetnom inteligencijom: Primjena principa u praksi od Besmire Nushi, Mehrnoosh Sameki i Amita Sharme + +[![Responsible AI Toolbox: Otvoreni okvir za izgradnju odgovorne umjetne inteligencije](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Otvoreni okvir za izgradnju odgovorne umjetne inteligencije") + +> 🎥 Kliknite na sliku iznad za video: RAI Toolbox: Otvoreni okvir za izgradnju odgovorne umjetne inteligencije od Besmire Nushi, Mehrnoosh Sameki i Amita Sharme + +Također, pročitajte: + +- Microsoftov centar resursa za odgovornu umjetnu inteligenciju: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsoftova FATE istraživačka grupa: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +RAI Toolbox: + +- [Responsible AI Toolbox GitHub repozitorij](https://github.com/microsoft/responsible-ai-toolbox) + +Pročitajte o alatima Azure Machine Learninga za osiguranje pravednosti: + +- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) + +## Zadatak + +[Istrazite RAI Toolbox](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/1-Introduction/3-fairness/assignment.md b/translations/hr/1-Introduction/3-fairness/assignment.md new file mode 100644 index 00000000..bb54e471 --- /dev/null +++ b/translations/hr/1-Introduction/3-fairness/assignment.md @@ -0,0 +1,25 @@ + +# Istražite Responsible AI Toolbox + +## Upute + +U ovoj lekciji ste naučili o Responsible AI Toolbox, "projektu otvorenog koda vođenom zajednicom koji pomaže znanstvenicima za podatke u analizi i poboljšanju AI sustava." Za ovaj zadatak, istražite jedan od [notebookova](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) RAI Toolboxa i iznesite svoja otkrića u radu ili prezentaciji. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | --------- | -------- | ----------------- | +| | Predstavljen je rad ili PowerPoint prezentacija koja raspravlja o sustavima Fairlearn, pokrenutom notebooku i zaključcima donesenim na temelju njegovog pokretanja | Predstavljen je rad bez zaključaka | Rad nije predstavljen | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/1-Introduction/4-techniques-of-ML/README.md b/translations/hr/1-Introduction/4-techniques-of-ML/README.md new file mode 100644 index 00000000..3766d8dc --- /dev/null +++ b/translations/hr/1-Introduction/4-techniques-of-ML/README.md @@ -0,0 +1,132 @@ + +# Tehnike strojnog učenja + +Proces izrade, korištenja i održavanja modela strojnog učenja te podataka koje koriste vrlo je različit od mnogih drugih razvojnih tijekova rada. U ovoj lekciji razjasnit ćemo taj proces i istaknuti glavne tehnike koje trebate znati. Naučit ćete: + +- Razumjeti procese koji podržavaju strojno učenje na visokoj razini. +- Istražiti osnovne pojmove poput 'modela', 'predikcija' i 'podataka za treniranje'. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +[![ML za početnike - Tehnike strojnog učenja](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML za početnike - Tehnike strojnog učenja") + +> 🎥 Kliknite na sliku iznad za kratki video koji obrađuje ovu lekciju. + +## Uvod + +Na visokoj razini, proces stvaranja strojnog učenja (ML) sastoji se od nekoliko koraka: + +1. **Odlučite o pitanju**. Većina ML procesa započinje postavljanjem pitanja koje se ne može odgovoriti jednostavnim uvjetnim programom ili sustavom temeljenim na pravilima. Ta pitanja često se odnose na predikcije temeljene na zbirci podataka. +2. **Prikupite i pripremite podatke**. Da biste mogli odgovoriti na svoje pitanje, trebate podatke. Kvaliteta, a ponekad i količina vaših podataka, odredit će koliko dobro možete odgovoriti na početno pitanje. Vizualizacija podataka važan je aspekt ove faze. Ova faza također uključuje podjelu podataka na skup za treniranje i testiranje kako biste izgradili model. +3. **Odaberite metodu treniranja**. Ovisno o vašem pitanju i prirodi vaših podataka, trebate odabrati način na koji želite trenirati model kako bi najbolje odražavao vaše podatke i davao točne predikcije. Ovo je dio ML procesa koji zahtijeva specifičnu stručnost i često značajnu količinu eksperimentiranja. +4. **Trenirajte model**. Koristeći podatke za treniranje, koristit ćete razne algoritme za treniranje modela kako bi prepoznao obrasce u podacima. Model može koristiti unutarnje težine koje se mogu prilagoditi kako bi se privilegirali određeni dijelovi podataka u odnosu na druge za izgradnju boljeg modela. +5. **Procijenite model**. Koristite podatke koje model nikada prije nije vidio (vaše testne podatke) iz prikupljenog skupa kako biste vidjeli kako model funkcionira. +6. **Podešavanje parametara**. Na temelju performansi vašeg modela, možete ponoviti proces koristeći različite parametre ili varijable koje kontroliraju ponašanje algoritama korištenih za treniranje modela. +7. **Predikcija**. Koristite nove ulaze kako biste testirali točnost vašeg modela. + +## Koje pitanje postaviti + +Računala su posebno vješta u otkrivanju skrivenih obrazaca u podacima. Ova korisnost vrlo je korisna za istraživače koji imaju pitanja o određenom području koja se ne mogu lako odgovoriti stvaranjem sustava temeljenog na uvjetima. Na primjer, u aktuarskom zadatku, podatkovni znanstvenik mogao bi konstruirati ručno izrađena pravila o smrtnosti pušača u odnosu na nepušače. + +Međutim, kada se u jednadžbu uključi mnogo drugih varijabli, ML model mogao bi se pokazati učinkovitijim za predviđanje budućih stopa smrtnosti na temelju povijesti zdravlja. Jedan veseliji primjer mogao bi biti izrada vremenskih predikcija za mjesec travanj na određenoj lokaciji na temelju podataka koji uključuju geografsku širinu, dužinu, klimatske promjene, blizinu oceana, obrasce mlaznih struja i više. + +✅ Ova [prezentacija](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) o vremenskim modelima nudi povijesnu perspektivu korištenja ML-a u analizi vremena. + +## Zadaci prije izgradnje + +Prije nego što počnete graditi svoj model, postoji nekoliko zadataka koje trebate dovršiti. Kako biste testirali svoje pitanje i oblikovali hipotezu na temelju predikcija modela, trebate identificirati i konfigurirati nekoliko elemenata. + +### Podaci + +Da biste mogli odgovoriti na svoje pitanje s bilo kakvom sigurnošću, trebate dobru količinu podataka odgovarajućeg tipa. U ovom trenutku trebate učiniti dvije stvari: + +- **Prikupiti podatke**. Imajući na umu prethodnu lekciju o pravednosti u analizi podataka, pažljivo prikupite svoje podatke. Budite svjesni izvora tih podataka, bilo kakvih inherentnih pristranosti koje bi mogli imati, i dokumentirajte njihovo podrijetlo. +- **Pripremiti podatke**. Postoji nekoliko koraka u procesu pripreme podataka. Možda ćete trebati objediniti podatke i normalizirati ih ako dolaze iz različitih izvora. Možete poboljšati kvalitetu i količinu podataka raznim metodama, poput pretvaranja stringova u brojeve (kao što radimo u [Klasterizaciji](../../5-Clustering/1-Visualize/README.md)). Možete također generirati nove podatke na temelju originalnih (kao što radimo u [Klasifikaciji](../../4-Classification/1-Introduction/README.md)). Možete očistiti i urediti podatke (kao što ćemo učiniti prije lekcije o [Web aplikaciji](../../3-Web-App/README.md)). Na kraju, možda ćete trebati nasumično rasporediti i promiješati podatke, ovisno o tehnikama treniranja. + +✅ Nakon prikupljanja i obrade podataka, odvojite trenutak da vidite hoće li njihov oblik omogućiti da se pozabavite svojim namjeravanim pitanjem. Može se dogoditi da podaci neće dobro funkcionirati u vašem zadatku, kao što otkrivamo u našim lekcijama o [Klasterizaciji](../../5-Clustering/1-Visualize/README.md)! + +### Značajke i cilj + +[Značajka](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) je mjerljiva karakteristika vaših podataka. U mnogim skupovima podataka izražena je kao naslov stupca poput 'datum', 'veličina' ili 'boja'. Vaša varijabla značajke, obično predstavljena kao `X` u kodu, predstavlja ulaznu varijablu koja će se koristiti za treniranje modela. + +Cilj je ono što pokušavate predvidjeti. Cilj, obično predstavljen kao `y` u kodu, predstavlja odgovor na pitanje koje pokušavate postaviti svojim podacima: u prosincu, koje će **boje** bundeve biti najjeftinije? U San Franciscu, koje će četvrti imati najbolju **cijenu** nekretnina? Ponekad se cilj također naziva atribut oznake. + +### Odabir varijable značajke + +🎓 **Odabir značajki i ekstrakcija značajki** Kako znati koju varijablu odabrati prilikom izrade modela? Vjerojatno ćete proći kroz proces odabira značajki ili ekstrakcije značajki kako biste odabrali prave varijable za najperformantniji model. Međutim, nisu iste stvari: "Ekstrakcija značajki stvara nove značajke iz funkcija originalnih značajki, dok odabir značajki vraća podskup značajki." ([izvor](https://wikipedia.org/wiki/Feature_selection)) + +### Vizualizirajte svoje podatke + +Važan aspekt alata podatkovnog znanstvenika je moć vizualizacije podataka koristeći nekoliko izvrsnih biblioteka poput Seaborn ili MatPlotLib. Predstavljanje vaših podataka vizualno može vam omogućiti otkrivanje skrivenih korelacija koje možete iskoristiti. Vaše vizualizacije također vam mogu pomoći otkriti pristranost ili neuravnotežene podatke (kao što otkrivamo u [Klasifikaciji](../../4-Classification/2-Classifiers-1/README.md)). + +### Podijelite svoj skup podataka + +Prije treniranja, trebate podijeliti svoj skup podataka na dva ili više dijelova nejednake veličine koji i dalje dobro predstavljaju podatke. + +- **Treniranje**. Ovaj dio skupa podataka koristi se za treniranje modela. Ovaj skup čini većinu originalnog skupa podataka. +- **Testiranje**. Testni skup podataka je neovisna grupa podataka, često prikupljena iz originalnih podataka, koju koristite za potvrdu performansi izgrađenog modela. +- **Validacija**. Skup za validaciju je manja neovisna grupa primjera koju koristite za podešavanje hiperparametara modela ili arhitekture kako biste poboljšali model. Ovisno o veličini vaših podataka i pitanju koje postavljate, možda nećete trebati izgraditi ovaj treći skup (kao što primjećujemo u [Predviđanju vremenskih serija](../../7-TimeSeries/1-Introduction/README.md)). + +## Izrada modela + +Koristeći podatke za treniranje, vaš cilj je izgraditi model, odnosno statistički prikaz vaših podataka, koristeći razne algoritme za **treniranje**. Treniranje modela izlaže ga podacima i omogućuje mu da donosi pretpostavke o uočenim obrascima koje otkriva, potvrđuje i prihvaća ili odbacuje. + +### Odlučite o metodi treniranja + +Ovisno o vašem pitanju i prirodi vaših podataka, odabrat ćete metodu za treniranje. Pregledavajući [dokumentaciju Scikit-learn](https://scikit-learn.org/stable/user_guide.html) - koju koristimo u ovom tečaju - možete istražiti mnoge načine treniranja modela. Ovisno o vašem iskustvu, možda ćete morati isprobati nekoliko različitih metoda kako biste izgradili najbolji model. Vjerojatno ćete proći kroz proces u kojem podatkovni znanstvenici procjenjuju performanse modela hranjenjem neviđenih podataka, provjeravajući točnost, pristranost i druge probleme koji degradiraju kvalitetu te odabiru najprikladniju metodu treniranja za zadatak. + +### Trenirajte model + +Naoružani podacima za treniranje, spremni ste 'prilagoditi' ih kako biste stvorili model. Primijetit ćete da u mnogim ML bibliotekama postoji kod 'model.fit' - u ovom trenutku šaljete svoju varijablu značajke kao niz vrijednosti (obično 'X') i ciljnu varijablu (obično 'y'). + +### Procijenite model + +Nakon što je proces treniranja završen (može potrajati mnogo iteracija ili 'epoha' za treniranje velikog modela), moći ćete procijeniti kvalitetu modela koristeći testne podatke za procjenu njegovih performansi. Ovi podaci su podskup originalnih podataka koje model prethodno nije analizirao. Možete ispisati tablicu metrike o kvaliteti vašeg modela. + +🎓 **Prilagodba modela** + +U kontekstu strojnog učenja, prilagodba modela odnosi se na točnost osnovne funkcije modela dok pokušava analizirati podatke s kojima nije upoznat. + +🎓 **Premalo prilagođavanje** i **preveliko prilagođavanje** su uobičajeni problemi koji degradiraju kvalitetu modela, jer model ili ne odgovara dovoljno dobro ili previše dobro. To uzrokuje da model daje predikcije koje su ili previše usklađene ili premalo usklađene s podacima za treniranje. Previše prilagođen model predviđa podatke za treniranje previše dobro jer je previše naučio detalje i šum podataka. Premalo prilagođen model nije točan jer ne može ni točno analizirati podatke za treniranje niti podatke koje još nije 'vidio'. + +![model prevelikog prilagođavanja](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png) +> Infografika od [Jen Looper](https://twitter.com/jenlooper) + +## Podešavanje parametara + +Nakon što je početno treniranje završeno, promatrajte kvalitetu modela i razmislite o njegovom poboljšanju podešavanjem njegovih 'hiperparametara'. Pročitajte više o procesu [u dokumentaciji](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott). + +## Predikcija + +Ovo je trenutak kada možete koristiti potpuno nove podatke za testiranje točnosti vašeg modela. U 'primijenjenom' ML okruženju, gdje gradite web alate za korištenje modela u produkciji, ovaj proces može uključivati prikupljanje korisničkog unosa (na primjer, pritisak na gumb) za postavljanje varijable i slanje modelu za inferenciju ili procjenu. + +U ovim lekcijama otkrit ćete kako koristiti ove korake za pripremu, izgradnju, testiranje, procjenu i predikciju - sve geste podatkovnog znanstvenika i više, dok napredujete na svom putu da postanete 'full stack' ML inženjer. + +--- + +## 🚀Izazov + +Nacrtajte dijagram toka koji odražava korake ML praktičara. Gdje se trenutno vidite u procesu? Gdje predviđate da ćete naići na poteškoće? Što vam se čini jednostavno? + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Pretražite online intervjue s podatkovnim znanstvenicima koji raspravljaju o svom svakodnevnom radu. Evo [jednog](https://www.youtube.com/watch?v=Z3IjgbbCEfs). + +## Zadatak + +[Intervjuirajte podatkovnog znanstvenika](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za kritične informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/1-Introduction/4-techniques-of-ML/assignment.md b/translations/hr/1-Introduction/4-techniques-of-ML/assignment.md new file mode 100644 index 00000000..d24f8b97 --- /dev/null +++ b/translations/hr/1-Introduction/4-techniques-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Intervju s podatkovnim znanstvenikom + +## Upute + +U vašoj tvrtki, korisničkoj grupi, među prijateljima ili kolegama studentima, razgovarajte s nekim tko profesionalno radi kao podatkovni znanstvenik. Napišite kratki rad (500 riječi) o njihovim svakodnevnim zadacima. Jesu li specijalisti ili rade 'full stack'? + +## Rubrika + +| Kriterij | Primjerno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------ | --------------------- | +| | Esej odgovarajuće duljine, s navedenim izvorima, predan u .doc formatu | Esej je loše pripisan ili kraći od tražene duljine | Esej nije predan | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/1-Introduction/README.md b/translations/hr/1-Introduction/README.md new file mode 100644 index 00000000..d1961642 --- /dev/null +++ b/translations/hr/1-Introduction/README.md @@ -0,0 +1,37 @@ + +# Uvod u strojno učenje + +U ovom dijelu kurikuluma upoznat ćete osnovne pojmove koji čine temelj područja strojnog učenja, što ono jest, te ćete saznati o njegovoj povijesti i tehnikama koje istraživači koriste za rad s njim. Istražimo zajedno ovaj novi svijet strojnog učenja! + +![globus](../../../1-Introduction/images/globe.jpg) +> Fotografija autora Bill Oxford na Unsplash + +### Lekcije + +1. [Uvod u strojno učenje](1-intro-to-ML/README.md) +1. [Povijest strojnog učenja i umjetne inteligencije](2-history-of-ML/README.md) +1. [Pravednost i strojno učenje](3-fairness/README.md) +1. [Tehnike strojnog učenja](4-techniques-of-ML/README.md) + +### Zasluge + +"Uvod u strojno učenje" napisali su s ♥️ tim ljudi uključujući [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) i [Jen Looper](https://twitter.com/jenlooper) + +"Povijest strojnog učenja" napisali su s ♥️ [Jen Looper](https://twitter.com/jenlooper) i [Amy Boyd](https://twitter.com/AmyKateNicho) + +"Pravednost i strojno učenje" napisala je s ♥️ [Tomomi Imura](https://twitter.com/girliemac) + +"Tehnike strojnog učenja" napisali su s ♥️ [Jen Looper](https://twitter.com/jenlooper) i [Chris Noring](https://twitter.com/softchris) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/1-Tools/README.md b/translations/hr/2-Regression/1-Tools/README.md new file mode 100644 index 00000000..efd5ad47 --- /dev/null +++ b/translations/hr/2-Regression/1-Tools/README.md @@ -0,0 +1,238 @@ + +# Početak rada s Pythonom i Scikit-learn za regresijske modele + +![Sažetak regresija u obliku sketchnotea](../../../../sketchnotes/ml-regression.png) + +> Sketchnote autorice [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ova lekcija je dostupna i na R jeziku!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) + +## Uvod + +U ove četiri lekcije otkrit ćete kako izgraditi regresijske modele. Uskoro ćemo razgovarati o tome za što se koriste. No prije nego što krenete, provjerite imate li sve potrebne alate za početak! + +U ovoj lekciji naučit ćete: + +- Kako konfigurirati svoje računalo za lokalne zadatke strojnog učenja. +- Kako raditi s Jupyter bilježnicama. +- Kako koristiti Scikit-learn, uključujući instalaciju. +- Kako istražiti linearnu regresiju kroz praktičnu vježbu. + +## Instalacije i konfiguracije + +[![ML za početnike - Pripremite alate za izgradnju modela strojnog učenja](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML za početnike - Pripremite alate za izgradnju modela strojnog učenja") + +> 🎥 Kliknite na sliku iznad za kratki video o konfiguraciji vašeg računala za ML. + +1. **Instalirajte Python**. Provjerite je li [Python](https://www.python.org/downloads/) instaliran na vašem računalu. Python ćete koristiti za mnoge zadatke vezane uz znanost o podacima i strojno učenje. Većina računalnih sustava već ima instaliran Python. Dostupni su i korisni [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) koji olakšavaju postavljanje za neke korisnike. + + Međutim, neka korištenja Pythona zahtijevaju jednu verziju softvera, dok druga zahtijevaju drugu verziju. Zbog toga je korisno raditi unutar [virtualnog okruženja](https://docs.python.org/3/library/venv.html). + +2. **Instalirajte Visual Studio Code**. Provjerite imate li instaliran Visual Studio Code na svom računalu. Slijedite ove upute za [instalaciju Visual Studio Code-a](https://code.visualstudio.com/) za osnovnu instalaciju. U ovom ćete tečaju koristiti Python u Visual Studio Code-u, pa bi bilo korisno osvježiti znanje o tome kako [konfigurirati Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) za razvoj u Pythonu. + + > Upoznajte se s Pythonom radeći kroz ovu kolekciju [Learn modula](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) + > + > [![Postavljanje Pythona s Visual Studio Code-om](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Postavljanje Pythona s Visual Studio Code-om") + > + > 🎥 Kliknite na sliku iznad za video: korištenje Pythona unutar VS Code-a. + +3. **Instalirajte Scikit-learn**, slijedeći [ove upute](https://scikit-learn.org/stable/install.html). Budući da trebate osigurati korištenje Pythona 3, preporučuje se korištenje virtualnog okruženja. Napomena: ako ovu biblioteku instalirate na M1 Macu, na stranici iznad nalaze se posebne upute. + +4. **Instalirajte Jupyter Notebook**. Trebat ćete [instalirati Jupyter paket](https://pypi.org/project/jupyter/). + +## Vaše okruženje za autorstvo ML-a + +Koristit ćete **bilježnice** za razvoj svog Python koda i izradu modela strojnog učenja. Ova vrsta datoteke uobičajeni je alat za znanstvenike podataka, a prepoznat ćete ih po sufiksu ili ekstenziji `.ipynb`. + +Bilježnice su interaktivno okruženje koje omogućuje programeru da istovremeno piše kod i dodaje bilješke te dokumentaciju oko koda, što je vrlo korisno za eksperimentalne ili istraživačke projekte. + +[![ML za početnike - Postavljanje Jupyter bilježnica za početak izrade regresijskih modela](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML za početnike - Postavljanje Jupyter bilježnica za početak izrade regresijskih modela") + +> 🎥 Kliknite na sliku iznad za kratki video o ovoj vježbi. + +### Vježba - rad s bilježnicom + +U ovoj mapi pronaći ćete datoteku _notebook.ipynb_. + +1. Otvorite _notebook.ipynb_ u Visual Studio Code-u. + + Pokrenut će se Jupyter poslužitelj s Pythonom 3+. Pronaći ćete dijelove bilježnice koji se mogu `pokrenuti`, tj. dijelove koda. Možete pokrenuti blok koda odabirom ikone koja izgleda kao gumb za reprodukciju. + +2. Odaberite ikonu `md` i dodajte malo markdowna, te sljedeći tekst **# Dobrodošli u svoju bilježnicu**. + + Zatim dodajte malo Python koda. + +3. Upišite **print('hello notebook')** u blok koda. +4. Odaberite strelicu za pokretanje koda. + + Trebali biste vidjeti ispisanu izjavu: + + ```output + hello notebook + ``` + +![VS Code s otvorenom bilježnicom](../../../../2-Regression/1-Tools/images/notebook.jpg) + +Možete izmjenjivati svoj kod s komentarima kako biste sami dokumentirali bilježnicu. + +✅ Razmislite na trenutak koliko se radno okruženje web programera razlikuje od onog znanstvenika podataka. + +## Početak rada sa Scikit-learn + +Sada kada je Python postavljen u vašem lokalnom okruženju i osjećate se ugodno s Jupyter bilježnicama, upoznajmo se sa Scikit-learn (izgovara se `sci` kao u `science`). Scikit-learn pruža [opsežan API](https://scikit-learn.org/stable/modules/classes.html#api-ref) koji vam pomaže u obavljanju zadataka strojnog učenja. + +Prema njihovoj [web stranici](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn je biblioteka za strojno učenje otvorenog koda koja podržava nadzirano i nenadzirano učenje. Također pruža razne alate za prilagodbu modela, predobradu podataka, odabir modela i evaluaciju, te mnoge druge korisne funkcije." + +U ovom tečaju koristit ćete Scikit-learn i druge alate za izgradnju modela strojnog učenja za obavljanje onoga što nazivamo 'tradicionalnim zadacima strojnog učenja'. Namjerno smo izbjegli neuronske mreže i duboko učenje jer su bolje obrađeni u našem nadolazećem kurikulumu 'AI za početnike'. + +Scikit-learn olakšava izgradnju modela i njihovu evaluaciju za upotrebu. Primarno je fokusiran na korištenje numeričkih podataka i sadrži nekoliko gotovih skupova podataka za učenje. Također uključuje unaprijed izgrađene modele koje studenti mogu isprobati. Istražimo proces učitavanja unaprijed pripremljenih podataka i korištenja ugrađenog procjenitelja za prvi ML model sa Scikit-learnom koristeći osnovne podatke. + +## Vježba - vaša prva Scikit-learn bilježnica + +> Ovaj je vodič inspiriran [primjerom linearne regresije](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) na web stranici Scikit-learn. + +[![ML za početnike - Vaš prvi projekt linearne regresije u Pythonu](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML za početnike - Vaš prvi projekt linearne regresije u Pythonu") + +> 🎥 Kliknite na sliku iznad za kratki video o ovoj vježbi. + +U datoteci _notebook.ipynb_ povezanoj s ovom lekcijom, izbrišite sve ćelije pritiskom na ikonu 'kanta za smeće'. + +U ovom ćete odjeljku raditi s malim skupom podataka o dijabetesu koji je ugrađen u Scikit-learn za potrebe učenja. Zamislite da želite testirati tretman za pacijente s dijabetesom. Modeli strojnog učenja mogli bi vam pomoći odrediti koji bi pacijenti bolje reagirali na tretman, na temelju kombinacija varijabli. Čak i vrlo osnovni regresijski model, kada se vizualizira, mogao bi pokazati informacije o varijablama koje bi vam pomogle organizirati teoretska klinička ispitivanja. + +✅ Postoji mnogo vrsta metoda regresije, a koju ćete odabrati ovisi o odgovoru koji tražite. Ako želite predvidjeti vjerojatnu visinu osobe određene dobi, koristili biste linearnu regresiju jer tražite **numeričku vrijednost**. Ako vas zanima otkrivanje treba li određena kuhinja biti smatrana veganskom ili ne, tražite **kategorizaciju**, pa biste koristili logističku regresiju. Kasnije ćete naučiti više o logističkoj regresiji. Razmislite malo o pitanjima koja možete postaviti podacima i koja bi od ovih metoda bila prikladnija. + +Krenimo s ovim zadatkom. + +### Uvoz biblioteka + +Za ovaj zadatak uvest ćemo neke biblioteke: + +- **matplotlib**. Koristan [alat za grafički prikaz](https://matplotlib.org/) koji ćemo koristiti za stvaranje linijskog grafa. +- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) je korisna biblioteka za rad s numeričkim podacima u Pythonu. +- **sklearn**. Ovo je [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) biblioteka. + +Uvezite neke biblioteke za pomoć pri zadacima. + +1. Dodajte uvoze upisivanjem sljedećeg koda: + + ```python + import matplotlib.pyplot as plt + import numpy as np + from sklearn import datasets, linear_model, model_selection + ``` + + Ovdje uvozite `matplotlib`, `numpy` te `datasets`, `linear_model` i `model_selection` iz `sklearn`. `model_selection` se koristi za podjelu podataka na skupove za treniranje i testiranje. + +### Skup podataka o dijabetesu + +Ugrađeni [skup podataka o dijabetesu](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) uključuje 442 uzorka podataka o dijabetesu s 10 značajki, od kojih neke uključuju: + +- age: dob u godinama +- bmi: indeks tjelesne mase +- bp: prosječan krvni tlak +- s1 tc: T-stanice (vrsta bijelih krvnih stanica) + +✅ Ovaj skup podataka uključuje koncept 'spola' kao varijable značajke važne za istraživanje dijabetesa. Mnogi medicinski skupovi podataka uključuju ovu vrstu binarne klasifikacije. Razmislite malo o tome kako takve kategorizacije mogu isključiti određene dijelove populacije iz tretmana. + +Sada učitajte podatke X i y. + +> 🎓 Zapamtite, ovo je nadzirano učenje i trebamo imenovanu ciljnu varijablu 'y'. + +U novoj ćeliji koda učitajte skup podataka o dijabetesu pozivom `load_diabetes()`. Ulaz `return_X_y=True` signalizira da će `X` biti matrica podataka, a `y` ciljana varijabla regresije. + +1. Dodajte neke naredbe za ispis kako biste prikazali oblik matrice podataka i njezin prvi element: + + ```python + X, y = datasets.load_diabetes(return_X_y=True) + print(X.shape) + print(X[0]) + ``` + + Ono što dobivate kao odgovor je tuple. Ono što radite je dodjeljivanje prva dva elementa tuplea varijablama `X` i `y`. Saznajte više [o tupleovima](https://wikipedia.org/wiki/Tuple). + + Možete vidjeti da ovi podaci imaju 442 stavke oblikovane u nizove od 10 elemenata: + + ```text + (442, 10) + [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076 + -0.04340085 -0.00259226 0.01990842 -0.01764613] + ``` + + ✅ Razmislite malo o odnosu između podataka i ciljne varijable regresije. Linearna regresija predviđa odnose između značajke X i ciljne varijable y. Možete li pronaći [cilj](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) za skup podataka o dijabetesu u dokumentaciji? Što ovaj skup podataka pokazuje, s obzirom na cilj? + +2. Zatim odaberite dio ovog skupa podataka za grafički prikaz odabirom 3. stupca skupa podataka. To možete učiniti korištenjem operatora `:` za odabir svih redaka, a zatim odabirom 3. stupca pomoću indeksa (2). Također možete preoblikovati podatke u 2D niz - kako je potrebno za grafički prikaz - korištenjem `reshape(n_rows, n_columns)`. Ako je jedan od parametara -1, odgovarajuća dimenzija se automatski izračunava. + + ```python + X = X[:, 2] + X = X.reshape((-1,1)) + ``` + + ✅ U bilo kojem trenutku ispišite podatke kako biste provjerili njihov oblik. + +3. Sada kada su podaci spremni za grafički prikaz, možete vidjeti može li stroj pomoći u određivanju logičke podjele između brojeva u ovom skupu podataka. Da biste to učinili, trebate podijeliti i podatke (X) i cilj (y) na skupove za testiranje i treniranje. Scikit-learn ima jednostavan način za to; možete podijeliti svoje testne podatke na određenoj točki. + + ```python + X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) + ``` + +4. Sada ste spremni trenirati svoj model! Učitajte model linearne regresije i trenirajte ga s vašim X i y skupovima za treniranje koristeći `model.fit()`: + + ```python + model = linear_model.LinearRegression() + model.fit(X_train, y_train) + ``` + + ✅ `model.fit()` je funkcija koju ćete vidjeti u mnogim ML bibliotekama poput TensorFlowa. + +5. Zatim, stvorite predviđanje koristeći testne podatke, koristeći funkciju `predict()`. Ovo će se koristiti za crtanje linije između grupa podataka. + + ```python + y_pred = model.predict(X_test) + ``` + +6. Sada je vrijeme za prikaz podataka na grafu. Matplotlib je vrlo koristan alat za ovaj zadatak. Stvorite scatterplot svih X i y testnih podataka i koristite predviđanje za crtanje linije na najprikladnijem mjestu između grupiranja podataka modela. + + ```python + plt.scatter(X_test, y_test, color='black') + plt.plot(X_test, y_pred, color='blue', linewidth=3) + plt.xlabel('Scaled BMIs') + plt.ylabel('Disease Progression') + plt.title('A Graph Plot Showing Diabetes Progression Against BMI') + plt.show() + ``` + + ![scatterplot koji prikazuje podatke o dijabetesu](../../../../2-Regression/1-Tools/images/scatterplot.png) +✅ Razmislite malo o tome što se ovdje događa. Ravna linija prolazi kroz mnogo malih točaka podataka, ali što točno radi? Možete li vidjeti kako biste trebali moći koristiti ovu liniju za predviđanje gdje bi nova, neviđena točka podataka trebala pripadati u odnosu na y-os grafikona? Pokušajte riječima opisati praktičnu primjenu ovog modela. + +Čestitamo, izradili ste svoj prvi model linearne regresije, napravili predviđanje s njim i prikazali ga na grafikonu! + +--- +## 🚀Izazov + +Prikažite drugu varijablu iz ovog skupa podataka. Savjet: uredite ovu liniju: `X = X[:,2]`. S obzirom na cilj ovog skupa podataka, što možete otkriti o napredovanju dijabetesa kao bolesti? +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +U ovom ste vodiču radili s jednostavnom linearnom regresijom, a ne s univarijatnom ili višestrukom linearnom regresijom. Pročitajte malo o razlikama između ovih metoda ili pogledajte [ovaj video](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef). + +Pročitajte više o konceptu regresije i razmislite o vrstama pitanja na koja se može odgovoriti ovom tehnikom. Prođite kroz [ovaj vodič](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) kako biste produbili svoje razumijevanje. + +## Zadatak + +[Drugi skup podataka](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/1-Tools/assignment.md b/translations/hr/2-Regression/1-Tools/assignment.md new file mode 100644 index 00000000..7854530b --- /dev/null +++ b/translations/hr/2-Regression/1-Tools/assignment.md @@ -0,0 +1,27 @@ + +# Regresija s Scikit-learnom + +## Upute + +Pogledajte [Linnerud dataset](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) u Scikit-learnu. Ovaj dataset ima više [ciljeva](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): 'Sastoji se od tri varijable vezane uz vježbanje (podaci) i tri fiziološke varijable (ciljevi) prikupljene od dvadeset muškaraca srednje dobi u fitness klubu'. + +Svojim riječima, opišite kako kreirati model regresije koji bi prikazao odnos između opsega struka i broja izvedenih trbušnjaka. Učinite isto za ostale podatke u ovom datasetu. + +## Rubrika + +| Kriterij | Primjerno | Zadovoljavajuće | Potrebno poboljšanje | +| ------------------------------ | ----------------------------------- | ----------------------------- | -------------------------- | +| Dostaviti opisni paragraf | Dostavljen je dobro napisan paragraf | Dostavljeno je nekoliko rečenica | Nije dostavljen opis | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešne interpretacije koje mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/1-Tools/solution/Julia/README.md b/translations/hr/2-Regression/1-Tools/solution/Julia/README.md new file mode 100644 index 00000000..5cf218a6 --- /dev/null +++ b/translations/hr/2-Regression/1-Tools/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/2-Data/README.md b/translations/hr/2-Regression/2-Data/README.md new file mode 100644 index 00000000..516c2804 --- /dev/null +++ b/translations/hr/2-Regression/2-Data/README.md @@ -0,0 +1,226 @@ + +# Izgradnja regresijskog modela pomoću Scikit-learn: priprema i vizualizacija podataka + +![Infografika o vizualizaciji podataka](../../../../2-Regression/2-Data/images/data-visualization.png) + +Infografiku izradio [Dasani Madipalli](https://twitter.com/dasani_decoded) + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ova lekcija dostupna je u R-u!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) + +## Uvod + +Sada kada imate alate potrebne za izgradnju modela strojnog učenja pomoću Scikit-learn, spremni ste početi postavljati pitanja o svojim podacima. Dok radite s podacima i primjenjujete rješenja strojnog učenja, vrlo je važno znati kako postaviti pravo pitanje kako biste pravilno iskoristili potencijale svog skupa podataka. + +U ovoj lekciji naučit ćete: + +- Kako pripremiti podatke za izgradnju modela. +- Kako koristiti Matplotlib za vizualizaciju podataka. + +## Postavljanje pravog pitanja o podacima + +Pitanje na koje trebate odgovoriti odredit će vrstu algoritama strojnog učenja koje ćete koristiti. Kvaliteta odgovora koji dobijete uvelike će ovisiti o prirodi vaših podataka. + +Pogledajte [podatke](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) koji su dostupni za ovu lekciju. Možete otvoriti ovu .csv datoteku u VS Codeu. Brzi pregled odmah pokazuje da postoje praznine i mješavina tekstualnih i numeričkih podataka. Tu je i neobičan stupac nazvan 'Package' gdje su podaci mješavina između 'sacks', 'bins' i drugih vrijednosti. Podaci su, zapravo, pomalo neuredni. + +[![ML za početnike - Kako analizirati i očistiti skup podataka](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML za početnike - Kako analizirati i očistiti skup podataka") + +> 🎥 Kliknite na sliku iznad za kratki video o pripremi podataka za ovu lekciju. + +Zapravo, nije uobičajeno dobiti skup podataka koji je potpuno spreman za korištenje u stvaranju modela strojnog učenja. U ovoj lekciji naučit ćete kako pripremiti sirove podatke koristeći standardne Python biblioteke. Također ćete naučiti različite tehnike za vizualizaciju podataka. + +## Studija slučaja: 'tržište bundeva' + +U ovom direktoriju pronaći ćete .csv datoteku u korijenskoj mapi `data` pod nazivom [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) koja uključuje 1757 redaka podataka o tržištu bundeva, grupiranih po gradovima. Ovo su sirovi podaci izvučeni iz [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) koje distribuira Ministarstvo poljoprivrede Sjedinjenih Američkih Država. + +### Priprema podataka + +Ovi podaci su javno dostupni. Mogu se preuzeti u mnogo zasebnih datoteka, po gradovima, s web stranice USDA. Kako bismo izbjegli previše zasebnih datoteka, spojili smo sve podatke po gradovima u jednu tablicu, tako da smo već _pripremili_ podatke malo. Sada, pogledajmo podatke detaljnije. + +### Podaci o bundevama - prvi zaključci + +Što primjećujete o ovim podacima? Već ste vidjeli da postoji mješavina tekstualnih podataka, brojeva, praznina i neobičnih vrijednosti koje trebate razumjeti. + +Koje pitanje možete postaviti o ovim podacima koristeći tehniku regresije? Što kažete na "Predvidjeti cijenu bundeve za prodaju tijekom određenog mjeseca". Ponovno pogledajući podatke, postoje neke promjene koje trebate napraviti kako biste stvorili strukturu podataka potrebnu za zadatak. + +## Vježba - analizirajte podatke o bundevama + +Koristimo [Pandas](https://pandas.pydata.org/), (ime dolazi od `Python Data Analysis`) alat vrlo koristan za oblikovanje podataka, kako bismo analizirali i pripremili ove podatke o bundevama. + +### Prvo, provjerite nedostaju li datumi + +Prvo ćete morati poduzeti korake kako biste provjerili nedostaju li datumi: + +1. Pretvorite datume u format mjeseca (ovo su američki datumi, pa je format `MM/DD/YYYY`). +2. Izvucite mjesec u novi stupac. + +Otvorite datoteku _notebook.ipynb_ u Visual Studio Codeu i uvezite tablicu u novi Pandas dataframe. + +1. Koristite funkciju `head()` za pregled prvih pet redaka. + + ```python + import pandas as pd + pumpkins = pd.read_csv('../data/US-pumpkins.csv') + pumpkins.head() + ``` + + ✅ Koju biste funkciju koristili za pregled zadnjih pet redaka? + +1. Provjerite ima li nedostajućih podataka u trenutnom dataframeu: + + ```python + pumpkins.isnull().sum() + ``` + + Postoje nedostajući podaci, ali možda neće biti važni za zadatak. + +1. Kako biste olakšali rad s dataframeom, odaberite samo stupce koji su vam potrebni koristeći funkciju `loc`, koja iz izvornog dataframea izvlači grupu redaka (proslijeđeno kao prvi parametar) i stupaca (proslijeđeno kao drugi parametar). Izraz `:` u slučaju ispod znači "svi redovi". + + ```python + columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] + pumpkins = pumpkins.loc[:, columns_to_select] + ``` + +### Drugo, odredite prosječnu cijenu bundeve + +Razmislite kako odrediti prosječnu cijenu bundeve u određenom mjesecu. Koje biste stupce odabrali za ovaj zadatak? Savjet: trebat će vam 3 stupca. + +Rješenje: uzmite prosjek stupaca `Low Price` i `High Price` kako biste popunili novi stupac Price, i pretvorite stupac Date da prikazuje samo mjesec. Srećom, prema provjeri iznad, nema nedostajućih podataka za datume ili cijene. + +1. Za izračunavanje prosjeka dodajte sljedeći kod: + + ```python + price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 + + month = pd.DatetimeIndex(pumpkins['Date']).month + + ``` + + ✅ Slobodno ispišite bilo koje podatke koje želite provjeriti koristeći `print(month)`. + +2. Sada kopirajte svoje konvertirane podatke u novi Pandas dataframe: + + ```python + new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) + ``` + + Ispisivanje vašeg dataframea pokazat će vam čist, uredan skup podataka na kojem možete izgraditi svoj novi regresijski model. + +### Ali čekajte! Nešto ovdje izgleda čudno + +Ako pogledate stupac `Package`, bundeve se prodaju u mnogim različitim konfiguracijama. Neke se prodaju u mjerama '1 1/9 bushel', neke u '1/2 bushel', neke po bundevi, neke po funti, a neke u velikim kutijama različitih širina. + +> Čini se da je bundeve vrlo teško dosljedno vagati + +Kopajući po izvornim podacima, zanimljivo je da sve što ima `Unit of Sale` jednako 'EACH' ili 'PER BIN' također ima tip `Package` po inču, po binu ili 'each'. Čini se da je bundeve vrlo teško dosljedno vagati, pa ih filtrirajmo odabirom samo bundeva s nizom 'bushel' u stupcu `Package`. + +1. Dodajte filter na vrh datoteke, ispod početnog uvoza .csv datoteke: + + ```python + pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] + ``` + + Ako sada ispišete podatke, možete vidjeti da dobivate samo oko 415 redaka podataka koji sadrže bundeve po bushelu. + +### Ali čekajte! Još nešto treba napraviti + +Jeste li primijetili da se količina bushela razlikuje po retku? Trebate normalizirati cijene tako da prikazujete cijene po bushelu, pa napravite neke izračune kako biste ih standardizirali. + +1. Dodajte ove linije nakon bloka koji stvara dataframe new_pumpkins: + + ```python + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) + + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) + ``` + +✅ Prema [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), težina bushela ovisi o vrsti proizvoda, jer je to mjera volumena. "Bushel rajčica, na primjer, trebao bi težiti 56 funti... Lišće i zelje zauzimaju više prostora s manje težine, pa bushel špinata teži samo 20 funti." Sve je to prilično komplicirano! Nećemo se zamarati konverzijom bushel-u-funtu, već ćemo cijene prikazivati po bushelu. Sva ova studija bushela bundeva, međutim, pokazuje koliko je važno razumjeti prirodu svojih podataka! + +Sada možete analizirati cijene po jedinici na temelju njihove mjere bushela. Ako još jednom ispišete podatke, možete vidjeti kako su standardizirani. + +✅ Jeste li primijetili da su bundeve prodane po pola bushela vrlo skupe? Možete li shvatiti zašto? Savjet: male bundeve su puno skuplje od velikih, vjerojatno zato što ih ima puno više po bushelu, s obzirom na neiskorišten prostor koji zauzima jedna velika šuplja bundeva za pitu. + +## Strategije vizualizacije + +Dio uloge znanstvenika za podatke je demonstrirati kvalitetu i prirodu podataka s kojima rade. Da bi to učinili, često stvaraju zanimljive vizualizacije, poput grafikona, dijagrama i tablica, koje prikazuju različite aspekte podataka. Na taj način mogu vizualno pokazati odnose i praznine koje je inače teško otkriti. + +[![ML za početnike - Kako vizualizirati podatke pomoću Matplotliba](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML za početnike - Kako vizualizirati podatke pomoću Matplotliba") + +> 🎥 Kliknite na sliku iznad za kratki video o vizualizaciji podataka za ovu lekciju. + +Vizualizacije također mogu pomoći u određivanju tehnike strojnog učenja koja je najprikladnija za podatke. Na primjer, scatterplot koji izgleda kao da slijedi liniju ukazuje na to da su podaci dobar kandidat za vježbu linearne regresije. + +Jedna biblioteka za vizualizaciju podataka koja dobro funkcionira u Jupyter notebookovima je [Matplotlib](https://matplotlib.org/) (koju ste također vidjeli u prethodnoj lekciji). + +> Steknite više iskustva s vizualizacijom podataka u [ovim tutorijalima](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). + +## Vježba - eksperimentirajte s Matplotlibom + +Pokušajte stvoriti osnovne grafikone za prikaz novog dataframea koji ste upravo stvorili. Što bi pokazao osnovni linijski grafikon? + +1. Uvezite Matplotlib na vrh datoteke, ispod uvoza Pandasa: + + ```python + import matplotlib.pyplot as plt + ``` + +1. Ponovno pokrenite cijeli notebook za osvježavanje. +1. Na dnu notebooka dodajte ćeliju za prikaz podataka kao kutiju: + + ```python + price = new_pumpkins.Price + month = new_pumpkins.Month + plt.scatter(price, month) + plt.show() + ``` + + ![Scatterplot koji prikazuje odnos cijene i mjeseca](../../../../2-Regression/2-Data/images/scatterplot.png) + + Je li ovo koristan grafikon? Iznenađuje li vas nešto u vezi s njim? + + Nije osobito koristan jer samo prikazuje vaše podatke kao raspršene točke u određenom mjesecu. + +### Učinite ga korisnim + +Da bi grafikoni prikazivali korisne podatke, obično trebate grupirati podatke na neki način. Pokušajmo stvoriti grafikon gdje y os prikazuje mjesece, a podaci pokazuju distribuciju podataka. + +1. Dodajte ćeliju za stvaranje grupiranog stupčastog grafikona: + + ```python + new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') + plt.ylabel("Pumpkin Price") + ``` + + ![Stupčasti grafikon koji prikazuje odnos cijene i mjeseca](../../../../2-Regression/2-Data/images/barchart.png) + + Ovo je korisnija vizualizacija podataka! Čini se da pokazuje da je najviša cijena bundeva u rujnu i listopadu. Odgovara li to vašim očekivanjima? Zašto ili zašto ne? + +--- + +## 🚀Izazov + +Istražite različite vrste vizualizacija koje Matplotlib nudi. Koje vrste su najprikladnije za regresijske probleme? + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Pogledajte mnoge načine vizualizacije podataka. Napravite popis raznih dostupnih biblioteka i zabilježite koje su najbolje za određene vrste zadataka, na primjer 2D vizualizacije naspram 3D vizualizacija. Što otkrivate? + +## Zadatak + +[Istrazivanje vizualizacije](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/2-Data/assignment.md b/translations/hr/2-Regression/2-Data/assignment.md new file mode 100644 index 00000000..ad63920b --- /dev/null +++ b/translations/hr/2-Regression/2-Data/assignment.md @@ -0,0 +1,23 @@ + +# Istraživanje Vizualizacija + +Postoji nekoliko različitih biblioteka dostupnih za vizualizaciju podataka. Kreirajte neke vizualizacije koristeći podatke o bundevama iz ove lekcije s matplotlib i seaborn u uzorku bilježnice. Koje biblioteke su lakše za rad? + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno Poboljšanje | +| -------- | --------- | -------- | ----------------- | +| | Bilježnica je predana s dvije istraživačke/vizualizacijske analize | Bilježnica je predana s jednom istraživačkom/vizualizacijskom analizom | Bilježnica nije predana | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/2-Data/solution/Julia/README.md b/translations/hr/2-Regression/2-Data/solution/Julia/README.md new file mode 100644 index 00000000..bc8bbc22 --- /dev/null +++ b/translations/hr/2-Regression/2-Data/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/3-Linear/README.md b/translations/hr/2-Regression/3-Linear/README.md new file mode 100644 index 00000000..2a9b9872 --- /dev/null +++ b/translations/hr/2-Regression/3-Linear/README.md @@ -0,0 +1,380 @@ + +# Izgradnja regresijskog modela koristeći Scikit-learn: četiri načina regresije + +![Infografika linearne i polinomne regresije](../../../../2-Regression/3-Linear/images/linear-polynomial.png) +> Infografika od [Dasani Madipalli](https://twitter.com/dasani_decoded) +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ova lekcija je dostupna u R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html) +### Uvod + +Do sada ste istražili što je regresija koristeći uzorke podataka iz skupa podataka o cijenama bundeva, koji ćemo koristiti tijekom ove lekcije. Također ste vizualizirali podatke koristeći Matplotlib. + +Sada ste spremni dublje zaroniti u regresiju za strojno učenje. Dok vizualizacija omogućuje razumijevanje podataka, prava snaga strojnog učenja dolazi iz _treniranja modela_. Modeli se treniraju na povijesnim podacima kako bi automatski uhvatili ovisnosti podataka i omogućili predviđanje ishoda za nove podatke koje model nije prethodno vidio. + +U ovoj lekciji naučit ćete više o dvije vrste regresije: _osnovnoj linearnoj regresiji_ i _polinomnoj regresiji_, zajedno s nekim matematičkim osnovama ovih tehnika. Ti modeli omogućit će nam predviđanje cijena bundeva ovisno o različitim ulaznim podacima. + +[![ML za početnike - Razumijevanje linearne regresije](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "ML za početnike - Razumijevanje linearne regresije") + +> 🎥 Kliknite na sliku iznad za kratki video pregled linearne regresije. + +> Tijekom ovog kurikuluma pretpostavljamo minimalno znanje matematike i nastojimo ga učiniti dostupnim studentima iz drugih područja, pa obratite pažnju na bilješke, 🧮 matematičke primjere, dijagrame i druge alate za učenje koji pomažu u razumijevanju. + +### Preduvjeti + +Do sada biste trebali biti upoznati sa strukturom podataka o bundevama koje analiziramo. Možete ih pronaći unaprijed učitane i očišćene u datoteci _notebook.ipynb_ ove lekcije. U datoteci je cijena bundeve prikazana po bušelu u novom podatkovnom okviru. Provjerite možete li pokrenuti ove bilježnice u kernelima u Visual Studio Codeu. + +### Priprema + +Podsjetnik: učitavate ove podatke kako biste postavili pitanja o njima. + +- Kada je najbolje vrijeme za kupnju bundeva? +- Koju cijenu mogu očekivati za kutiju minijaturnih bundeva? +- Trebam li ih kupiti u košarama od pola bušela ili u kutijama od 1 1/9 bušela? +Nastavimo istraživati ove podatke. + +U prethodnoj lekciji kreirali ste Pandas podatkovni okvir i popunili ga dijelom izvornog skupa podataka, standardizirajući cijene po bušelu. Međutim, na taj način uspjeli ste prikupiti samo oko 400 podatkovnih točaka i to samo za jesenske mjesece. + +Pogledajte podatke koje smo unaprijed učitali u bilježnici koja prati ovu lekciju. Podaci su unaprijed učitani, a početni dijagram raspršenja je nacrtan kako bi prikazao podatke po mjesecima. Možda možemo dobiti malo više detalja o prirodi podataka ako ih dodatno očistimo. + +## Linija linearne regresije + +Kao što ste naučili u Lekciji 1, cilj vježbe linearne regresije je moći nacrtati liniju kako bi: + +- **Prikazali odnose varijabli**. Prikazali odnos između varijabli +- **Napravili predviđanja**. Napravili točna predviđanja o tome gdje bi nova podatkovna točka mogla pasti u odnosu na tu liniju. + +Tipično je za **regresiju metodom najmanjih kvadrata** nacrtati ovu vrstu linije. Pojam 'najmanji kvadrati' znači da su sve podatkovne točke oko regresijske linije kvadrirane i zatim zbrojene. Idealno, taj konačni zbroj je što manji, jer želimo mali broj pogrešaka, ili `najmanje kvadrate`. + +To radimo jer želimo modelirati liniju koja ima najmanju kumulativnu udaljenost od svih naših podatkovnih točaka. Također kvadriramo vrijednosti prije zbrajanja jer nas zanima njihova veličina, a ne smjer. + +> **🧮 Pokaži mi matematiku** +> +> Ova linija, nazvana _linija najboljeg pristajanja_, može se izraziti [jednadžbom](https://en.wikipedia.org/wiki/Simple_linear_regression): +> +> ``` +> Y = a + bX +> ``` +> +> `X` je 'objašnjavajuća varijabla'. `Y` je 'ovisna varijabla'. Nagib linije je `b`, a `a` je presjek s y-osom, koji se odnosi na vrijednost `Y` kada je `X = 0`. +> +>![izračunaj nagib](../../../../2-Regression/3-Linear/images/slope.png) +> +> Prvo, izračunajte nagib `b`. Infografika od [Jen Looper](https://twitter.com/jenlooper) +> +> Drugim riječima, i referirajući se na izvorno pitanje o podacima o bundevama: "predvidite cijenu bundeve po bušelu po mjesecu", `X` bi se odnosio na cijenu, a `Y` na mjesec prodaje. +> +>![dovršite jednadžbu](../../../../2-Regression/3-Linear/images/calculation.png) +> +> Izračunajte vrijednost Y. Ako plaćate oko $4, mora da je travanj! Infografika od [Jen Looper](https://twitter.com/jenlooper) +> +> Matematika koja izračunava liniju mora pokazati nagib linije, koji također ovisi o presjeku, odnosno gdje se `Y` nalazi kada je `X = 0`. +> +> Metodu izračuna ovih vrijednosti možete vidjeti na web stranici [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Također posjetite [ovaj kalkulator najmanjih kvadrata](https://www.mathsisfun.com/data/least-squares-calculator.html) kako biste vidjeli kako vrijednosti brojeva utječu na liniju. + +## Korelacija + +Još jedan pojam koji treba razumjeti je **koeficijent korelacije** između danih X i Y varijabli. Koristeći dijagram raspršenja, možete brzo vizualizirati ovaj koeficijent. Dijagram s podatkovnim točkama raspoređenim u urednu liniju ima visoku korelaciju, dok dijagram s podatkovnim točkama raspršenim svugdje između X i Y ima nisku korelaciju. + +Dobar model linearne regresije bit će onaj koji ima visok (bliži 1 nego 0) koeficijent korelacije koristeći metodu najmanjih kvadrata s regresijskom linijom. + +✅ Pokrenite bilježnicu koja prati ovu lekciju i pogledajte dijagram raspršenja Mjesec prema Cijeni. Čini li se da podaci koji povezuju Mjesec s Cijenom za prodaju bundeva imaju visoku ili nisku korelaciju, prema vašoj vizualnoj interpretaciji dijagrama raspršenja? Mijenja li se to ako koristite precizniju mjeru umjesto `Mjesec`, npr. *dan u godini* (tj. broj dana od početka godine)? + +U kodu ispod pretpostavit ćemo da smo očistili podatke i dobili podatkovni okvir nazvan `new_pumpkins`, sličan sljedećem: + +ID | Mjesec | DanUGodini | Vrsta | Grad | Paket | Najniža cijena | Najviša cijena | Cijena +---|--------|------------|-------|------|-------|----------------|----------------|------- +70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 +71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 +72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 +73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545 +74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 + +> Kod za čišćenje podataka dostupan je u [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb). Proveli smo iste korake čišćenja kao u prethodnoj lekciji i izračunali stupac `DanUGodini` koristeći sljedeći izraz: + +```python +day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days) +``` + +Sada kada razumijete matematiku iza linearne regresije, kreirajmo regresijski model kako bismo vidjeli možemo li predvidjeti koji paket bundeva će imati najbolje cijene bundeva. Netko tko kupuje bundeve za blagdanski vrt bundeva možda želi ove informacije kako bi optimizirao svoje kupnje paketa bundeva za vrt. + +## Traženje korelacije + +[![ML za početnike - Traženje korelacije: Ključ za linearnu regresiju](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "ML za početnike - Traženje korelacije: Ključ za linearnu regresiju") + +> 🎥 Kliknite na sliku iznad za kratki video pregled korelacije. + +Iz prethodne lekcije vjerojatno ste vidjeli da prosječna cijena za različite mjesece izgleda ovako: + +Prosječna cijena po mjesecu + +To sugerira da bi mogla postojati neka korelacija, i možemo pokušati trenirati model linearne regresije kako bismo predvidjeli odnos između `Mjesec` i `Cijena`, ili između `DanUGodini` i `Cijena`. Evo dijagrama raspršenja koji pokazuje potonji odnos: + +Dijagram raspršenja Cijena vs. Dan u godini + +Pogledajmo postoji li korelacija koristeći funkciju `corr`: + +```python +print(new_pumpkins['Month'].corr(new_pumpkins['Price'])) +print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price'])) +``` + +Čini se da je korelacija prilično mala, -0.15 za `Mjesec` i -0.17 za `DanUGodini`, ali mogla bi postojati druga važna veza. Izgleda da postoje različiti klasteri cijena koji odgovaraju različitim vrstama bundeva. Da bismo potvrdili ovu hipotezu, nacrtajmo svaku kategoriju bundeva koristeći različitu boju. Prosljeđivanjem parametra `ax` funkciji za crtanje raspršenja možemo nacrtati sve točke na istom grafikonu: + +```python +ax=None +colors = ['red','blue','green','yellow'] +for i,var in enumerate(new_pumpkins['Variety'].unique()): + df = new_pumpkins[new_pumpkins['Variety']==var] + ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var) +``` + +Dijagram raspršenja Cijena vs. Dan u godini + +Naša istraga sugerira da vrsta bundeve ima veći utjecaj na ukupnu cijenu nego stvarni datum prodaje. To možemo vidjeti s dijagramom stupaca: + +```python +new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar') +``` + +Dijagram stupaca cijena vs vrsta + +Usredotočimo se za trenutak samo na jednu vrstu bundeve, 'pie type', i pogledajmo kakav učinak datum ima na cijenu: + +```python +pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE'] +pie_pumpkins.plot.scatter('DayOfYear','Price') +``` +Dijagram raspršenja Cijena vs. Dan u godini + +Ako sada izračunamo korelaciju između `Cijena` i `DanUGodini` koristeći funkciju `corr`, dobit ćemo nešto poput `-0.27` - što znači da treniranje prediktivnog modela ima smisla. + +> Prije treniranja modela linearne regresije, važno je osigurati da su naši podaci čisti. Linearna regresija ne funkcionira dobro s nedostajućim vrijednostima, stoga ima smisla riješiti se svih praznih ćelija: + +```python +pie_pumpkins.dropna(inplace=True) +pie_pumpkins.info() +``` + +Drugi pristup bio bi popuniti te prazne vrijednosti srednjim vrijednostima iz odgovarajućeg stupca. + +## Jednostavna linearna regresija + +[![ML za početnike - Linearna i polinomna regresija koristeći Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "ML za početnike - Linearna i polinomna regresija koristeći Scikit-learn") + +> 🎥 Kliknite na sliku iznad za kratki video pregled linearne i polinomne regresije. + +Za treniranje našeg modela linearne regresije koristit ćemo biblioteku **Scikit-learn**. + +```python +from sklearn.linear_model import LinearRegression +from sklearn.metrics import mean_squared_error +from sklearn.model_selection import train_test_split +``` + +Počinjemo razdvajanjem ulaznih vrijednosti (značajki) i očekivanog izlaza (oznaka) u zasebne numpy nizove: + +```python +X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1) +y = pie_pumpkins['Price'] +``` + +> Napomena: morali smo izvršiti `reshape` na ulaznim podacima kako bi paket za linearnu regresiju ispravno razumio podatke. Linearna regresija očekuje 2D-niz kao ulaz, gdje svaki redak niza odgovara vektoru ulaznih značajki. U našem slučaju, budući da imamo samo jedan ulaz, trebamo niz oblika N×1, gdje je N veličina skupa podataka. + +Zatim trebamo podijeliti podatke na skupove za treniranje i testiranje, kako bismo mogli validirati naš model nakon treniranja: + +```python +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) +``` + +Na kraju, treniranje stvarnog modela linearne regresije traje samo dva retka koda. Definiramo objekt `LinearRegression` i prilagodimo ga našim podacima koristeći metodu `fit`: + +```python +lin_reg = LinearRegression() +lin_reg.fit(X_train,y_train) +``` + +Objekt `LinearRegression` nakon prilagodbe (`fit`) sadrži sve koeficijente regresije, koji se mogu pristupiti koristeći svojstvo `.coef_`. U našem slučaju postoji samo jedan koeficijent, koji bi trebao biti oko `-0.017`. To znači da se cijene čini da malo padaju s vremenom, ali ne previše, oko 2 centa dnevno. Također možemo pristupiti točki presjeka regresije s Y-osom koristeći `lin_reg.intercept_` - ona će biti oko `21` u našem slučaju, što ukazuje na cijenu na početku godine. + +Kako bismo vidjeli koliko je naš model točan, možemo predvidjeti cijene na testnom skupu podataka, a zatim izmjeriti koliko su naše predikcije blizu očekivanim vrijednostima. To se može učiniti koristeći metriku srednje kvadratne pogreške (MSE), koja je srednja vrijednost svih kvadriranih razlika između očekivane i predviđene vrijednosti. + +```python +pred = lin_reg.predict(X_test) + +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') +``` +Naša pogreška čini se da se kreće oko 2 točke, što je ~17%. Nije baš dobro. Još jedan pokazatelj kvalitete modela je **koeficijent determinacije**, koji se može dobiti ovako: + +```python +score = lin_reg.score(X_train,y_train) +print('Model determination: ', score) +``` +Ako je vrijednost 0, to znači da model ne uzima ulazne podatke u obzir i ponaša se kao *najgori linearni prediktor*, što je jednostavno prosječna vrijednost rezultata. Vrijednost 1 znači da možemo savršeno predvidjeti sve očekivane izlaze. U našem slučaju, koeficijent je oko 0.06, što je prilično nisko. + +Također možemo prikazati testne podatke zajedno s regresijskom linijom kako bismo bolje vidjeli kako regresija funkcionira u našem slučaju: + +```python +plt.scatter(X_test,y_test) +plt.plot(X_test,pred) +``` + +Linear regression + +## Polinomijalna regresija + +Druga vrsta linearne regresije je polinomijalna regresija. Iako ponekad postoji linearna veza između varijabli - što je veća bundeva po volumenu, to je viša cijena - ponekad te veze ne mogu biti prikazane kao ravnina ili ravna linija. + +✅ Evo [nekoliko primjera](https://online.stat.psu.edu/stat501/lesson/9/9.8) podataka koji bi mogli koristiti polinomijalnu regresiju. + +Pogledajte ponovno vezu između datuma i cijene. Čini li se ovaj dijagram raspršenosti kao da bi nužno trebao biti analiziran ravnom linijom? Zar cijene ne mogu fluktuirati? U ovom slučaju možete pokušati s polinomijalnom regresijom. + +✅ Polinomi su matematički izrazi koji mogu sadržavati jednu ili više varijabli i koeficijenata. + +Polinomijalna regresija stvara zakrivljenu liniju kako bi bolje odgovarala nelinearnim podacima. U našem slučaju, ako uključimo kvadratnu varijablu `DayOfYear` u ulazne podatke, trebali bismo moći prilagoditi naše podatke paraboličnoj krivulji, koja će imati minimum u određenom trenutku unutar godine. + +Scikit-learn uključuje koristan [pipeline API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) za kombiniranje različitih koraka obrade podataka. **Pipeline** je lanac **procjenitelja**. U našem slučaju, stvorit ćemo pipeline koji prvo dodaje polinomijalne značajke našem modelu, a zatim trenira regresiju: + +```python +from sklearn.preprocessing import PolynomialFeatures +from sklearn.pipeline import make_pipeline + +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) + +pipeline.fit(X_train,y_train) +``` + +Korištenje `PolynomialFeatures(2)` znači da ćemo uključiti sve polinome drugog stupnja iz ulaznih podataka. U našem slučaju to će jednostavno značiti `DayOfYear`2, ali s obzirom na dvije ulazne varijable X i Y, to će dodati X2, XY i Y2. Također možemo koristiti polinome višeg stupnja ako želimo. + +Pipeline se može koristiti na isti način kao i originalni objekt `LinearRegression`, tj. možemo koristiti `fit` za treniranje pipelinea, a zatim `predict` za dobivanje rezultata predikcije. Evo grafikona koji prikazuje testne podatke i aproksimacijsku krivulju: + +Polynomial regression + +Korištenjem polinomijalne regresije možemo dobiti nešto niži MSE i viši koeficijent determinacije, ali ne značajno. Moramo uzeti u obzir i druge značajke! + +> Možete vidjeti da su minimalne cijene bundeva zabilježene negdje oko Noći vještica. Kako to možete objasniti? + +🎃 Čestitamo, upravo ste stvorili model koji može pomoći u predviđanju cijene bundeva za pite. Vjerojatno možete ponoviti isti postupak za sve vrste bundeva, ali to bi bilo zamorno. Sada naučimo kako uzeti u obzir raznolikost bundeva u našem modelu! + +## Kategorijalne značajke + +U idealnom svijetu želimo moći predvidjeti cijene za različite vrste bundeva koristeći isti model. Međutim, stupac `Variety` je donekle drugačiji od stupaca poput `Month`, jer sadrži nenumeričke vrijednosti. Takvi stupci nazivaju se **kategorijalni**. + +[![ML for beginners - Categorical Feature Predictions with Linear Regression](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression") + +> 🎥 Kliknite na sliku iznad za kratki video pregled korištenja kategorijalnih značajki. + +Ovdje možete vidjeti kako prosječna cijena ovisi o vrsti: + +Average price by variety + +Kako bismo uzeli u obzir vrstu, prvo je moramo pretvoriti u numerički oblik, odnosno **kodirati**. Postoji nekoliko načina kako to možemo učiniti: + +* Jednostavno **numeričko kodiranje** će izgraditi tablicu različitih vrsta, a zatim zamijeniti naziv vrste indeksom u toj tablici. Ovo nije najbolja ideja za linearnu regresiju, jer linearna regresija uzima stvarnu numeričku vrijednost indeksa i dodaje je rezultatu, množeći je nekim koeficijentom. U našem slučaju, veza između broja indeksa i cijene očito nije linearna, čak i ako osiguramo da su indeksi poredani na neki specifičan način. +* **One-hot kodiranje** će zamijeniti stupac `Variety` s 4 različita stupca, po jedan za svaku vrstu. Svaki stupac će sadržavati `1` ako odgovarajući redak pripada određenoj vrsti, a `0` inače. To znači da će u linearnom regresijskom modelu postojati četiri koeficijenta, po jedan za svaku vrstu bundeve, odgovorna za "početnu cijenu" (ili radije "dodatnu cijenu") za tu određenu vrstu. + +Kod ispod pokazuje kako možemo one-hot kodirati vrstu: + +```python +pd.get_dummies(new_pumpkins['Variety']) +``` + + ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE +----|-----------|-----------|--------------------------|---------- +70 | 0 | 0 | 0 | 1 +71 | 0 | 0 | 0 | 1 +... | ... | ... | ... | ... +1738 | 0 | 1 | 0 | 0 +1739 | 0 | 1 | 0 | 0 +1740 | 0 | 1 | 0 | 0 +1741 | 0 | 1 | 0 | 0 +1742 | 0 | 1 | 0 | 0 + +Kako bismo trenirali linearnu regresiju koristeći one-hot kodiranu vrstu kao ulaz, samo trebamo ispravno inicijalizirati podatke `X` i `y`: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) +y = new_pumpkins['Price'] +``` + +Ostatak koda je isti kao što smo koristili gore za treniranje linearne regresije. Ako ga isprobate, vidjet ćete da je srednja kvadratna pogreška otprilike ista, ali dobivamo puno viši koeficijent determinacije (~77%). Kako bismo dobili još točnija predviđanja, možemo uzeti u obzir više kategorijalnih značajki, kao i numeričke značajke poput `Month` ili `DayOfYear`. Kako bismo dobili jedan veliki niz značajki, možemo koristiti `join`: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] +``` + +Ovdje također uzimamo u obzir `City` i vrstu `Package`, što nam daje MSE 2.84 (10%) i determinaciju 0.94! + +## Sve zajedno + +Kako bismo napravili najbolji model, možemo koristiti kombinirane (one-hot kodirane kategorijalne + numeričke) podatke iz gornjeg primjera zajedno s polinomijalnom regresijom. Evo kompletnog koda za vašu praktičnost: + +```python +# set up training data +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] + +# make train-test split +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + +# setup and train the pipeline +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) +pipeline.fit(X_train,y_train) + +# predict results for test data +pred = pipeline.predict(X_test) + +# calculate MSE and determination +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') + +score = pipeline.score(X_train,y_train) +print('Model determination: ', score) +``` + +Ovo bi nam trebalo dati najbolji koeficijent determinacije od gotovo 97% i MSE=2.23 (~8% pogreške u predviđanju). + +| Model | MSE | Determinacija | +|-------|-----|---------------| +| `DayOfYear` Linear | 2.77 (17.2%) | 0.07 | +| `DayOfYear` Polynomial | 2.73 (17.0%) | 0.08 | +| `Variety` Linear | 5.24 (19.7%) | 0.77 | +| Sve značajke Linear | 2.84 (10.5%) | 0.94 | +| Sve značajke Polynomial | 2.23 (8.25%) | 0.97 | + +🏆 Bravo! Stvorili ste četiri regresijska modela u jednoj lekciji i poboljšali kvalitetu modela na 97%. U završnom dijelu o regresiji naučit ćete o logističkoj regresiji za određivanje kategorija. + +--- +## 🚀Izazov + +Testirajte nekoliko različitih varijabli u ovom notebooku kako biste vidjeli kako korelacija odgovara točnosti modela. + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +U ovoj lekciji naučili smo o linearnoj regresiji. Postoje i druge važne vrste regresije. Pročitajte o tehnikama Stepwise, Ridge, Lasso i Elasticnet. Dobar tečaj za daljnje učenje je [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning). + +## Zadatak + +[Izgradite model](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/3-Linear/assignment.md b/translations/hr/2-Regression/3-Linear/assignment.md new file mode 100644 index 00000000..51a826ef --- /dev/null +++ b/translations/hr/2-Regression/3-Linear/assignment.md @@ -0,0 +1,25 @@ + +# Kreiranje regresijskog modela + +## Upute + +U ovoj lekciji pokazano vam je kako izraditi model koristeći Linearnu i Polinomnu regresiju. Koristeći ovo znanje, pronađite skup podataka ili upotrijebite jedan od ugrađenih skupova podataka Scikit-learn biblioteke za izradu novog modela. U svom bilježniku objasnite zašto ste odabrali tehniku koju ste koristili i demonstrirajte točnost svog modela. Ako model nije točan, objasnite zašto. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ------------------------------------------------------------ | -------------------------- | ------------------------------- | +| | prikazuje kompletan bilježnik s dobro dokumentiranim rješenjem | rješenje je nepotpuno | rješenje je pogrešno ili ima grešaka | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/3-Linear/solution/Julia/README.md b/translations/hr/2-Regression/3-Linear/solution/Julia/README.md new file mode 100644 index 00000000..61b6026a --- /dev/null +++ b/translations/hr/2-Regression/3-Linear/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/4-Logistic/README.md b/translations/hr/2-Regression/4-Logistic/README.md new file mode 100644 index 00000000..3222e96c --- /dev/null +++ b/translations/hr/2-Regression/4-Logistic/README.md @@ -0,0 +1,410 @@ + +# Logistička regresija za predviđanje kategorija + +![Infografika: Logistička vs. linearna regresija](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png) + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ova lekcija je dostupna i na R jeziku!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html) + +## Uvod + +U ovoj završnoj lekciji o regresiji, jednoj od osnovnih _klasičnih_ tehnika strojnog učenja, proučit ćemo logističku regresiju. Ovu tehniku koristite za otkrivanje obrazaca kako biste predvidjeli binarne kategorije. Je li ovaj slatkiš čokolada ili nije? Je li ova bolest zarazna ili nije? Hoće li ovaj kupac odabrati ovaj proizvod ili neće? + +U ovoj lekciji naučit ćete: + +- Novi alat za vizualizaciju podataka +- Tehnike logističke regresije + +✅ Produbite svoje razumijevanje rada s ovom vrstom regresije u ovom [modulu za učenje](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott) + +## Preduvjeti + +Radili smo s podacima o bundevama i sada smo dovoljno upoznati s njima da shvatimo kako postoji jedna binarna kategorija s kojom možemo raditi: `Boja`. + +Izgradimo model logističke regresije kako bismo predvidjeli, na temelju nekih varijabli, _koje je boje određena bundeva_ (narančasta 🎃 ili bijela 👻). + +> Zašto govorimo o binarnoj klasifikaciji u lekciji o regresiji? Samo radi jezične praktičnosti, jer je logistička regresija [zapravo metoda klasifikacije](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), iako se temelji na linearnim modelima. Saznajte više o drugim načinima klasifikacije podataka u sljedećoj grupi lekcija. + +## Definirajte pitanje + +Za naše potrebe, izrazit ćemo ovo kao binarnu kategoriju: 'Bijela' ili 'Nije bijela'. U našem skupu podataka postoji i kategorija 'prugasta', ali ima malo primjera te kategorije, pa je nećemo koristiti. Ionako nestaje kada uklonimo null vrijednosti iz skupa podataka. + +> 🎃 Zanimljivost: bijele bundeve ponekad nazivamo 'duh' bundevama. Nisu baš jednostavne za rezbarenje, pa nisu toliko popularne kao narančaste, ali izgledaju zanimljivo! Tako bismo svoje pitanje mogli preformulirati i kao: 'Duh' ili 'Nije duh'. 👻 + +## O logističkoj regresiji + +Logistička regresija razlikuje se od linearne regresije, o kojoj ste ranije učili, u nekoliko važnih aspekata. + +[![ML za početnike - Razumijevanje logističke regresije za klasifikaciju](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "ML za početnike - Razumijevanje logističke regresije za klasifikaciju") + +> 🎥 Kliknite na sliku iznad za kratki video pregled logističke regresije. + +### Binarna klasifikacija + +Logistička regresija ne nudi iste mogućnosti kao linearna regresija. Prva nudi predviđanje binarne kategorije ("bijela ili nije bijela"), dok druga može predvidjeti kontinuirane vrijednosti, na primjer, s obzirom na podrijetlo bundeve i vrijeme berbe, _koliko će joj cijena porasti_. + +![Model klasifikacije bundeva](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png) +> Infografika: [Dasani Madipalli](https://twitter.com/dasani_decoded) + +### Druge vrste klasifikacije + +Postoje i druge vrste logističke regresije, uključujući multinomijalnu i ordinalnu: + +- **Multinomijalna**, koja uključuje više od jedne kategorije - "Narančasta, Bijela i Prugasta". +- **Ordinalna**, koja uključuje uređene kategorije, korisno ako želimo logički poredati ishode, poput bundeva koje su poredane prema veličini (mini, sm, med, lg, xl, xxl). + +![Multinomijalna vs ordinalna regresija](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png) + +### Varijable NE moraju biti povezane + +Sjećate se kako je linearna regresija bolje funkcionirala s više povezanih varijabli? Logistička regresija je suprotna - varijable ne moraju biti povezane. To odgovara ovim podacima koji imaju prilično slabe korelacije. + +### Potrebno je puno čistih podataka + +Logistička regresija daje točnije rezultate ako koristite više podataka; naš mali skup podataka nije optimalan za ovaj zadatak, pa to imajte na umu. + +[![ML za početnike - Analiza i priprema podataka za logističku regresiju](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "ML za početnike - Analiza i priprema podataka za logističku regresiju") + +✅ Razmislite o vrstama podataka koje bi bile prikladne za logističku regresiju. + +## Vježba - priprema podataka + +Prvo, očistite podatke, uklonite null vrijednosti i odaberite samo neke stupce: + +1. Dodajte sljedeći kod: + + ```python + + columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] + pumpkins = full_pumpkins.loc[:, columns_to_select] + + pumpkins.dropna(inplace=True) + ``` + + Uvijek možete zaviriti u svoj novi dataframe: + + ```python + pumpkins.info + ``` + +### Vizualizacija - kategorijalni graf + +Do sada ste ponovno učitali [početnu bilježnicu](../../../../2-Regression/4-Logistic/notebook.ipynb) s podacima o bundevama i očistili je kako biste sačuvali skup podataka koji sadrži nekoliko varijabli, uključujući `Boju`. Vizualizirajmo dataframe u bilježnici koristeći drugu biblioteku: [Seaborn](https://seaborn.pydata.org/index.html), koja je izgrađena na Matplotlibu koji smo ranije koristili. + +Seaborn nudi zanimljive načine za vizualizaciju podataka. Na primjer, možete usporediti distribucije podataka za svaku `Varijantu` i `Boju` u kategorijalnom grafu. + +1. Stvorite takav graf koristeći funkciju `catplot`, koristeći naše podatke o bundevama `pumpkins` i specificirajući mapiranje boja za svaku kategoriju bundeva (narančasta ili bijela): + + ```python + import seaborn as sns + + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + + sns.catplot( + data=pumpkins, y="Variety", hue="Color", kind="count", + palette=palette, + ) + ``` + + ![Mreža vizualiziranih podataka](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png) + + Promatrajući podatke, možete vidjeti kako se podaci o boji odnose na varijantu. + + ✅ Na temelju ovog kategorijalnog grafa, koje zanimljive analize možete zamisliti? + +### Predobrada podataka: kodiranje značajki i oznaka + +Naš skup podataka o bundevama sadrži tekstualne vrijednosti za sve stupce. Rad s kategorijalnim podacima intuitivan je za ljude, ali ne i za strojeve. Algoritmi strojnog učenja bolje rade s brojevima. Zato je kodiranje vrlo važan korak u fazi predobrade podataka jer nam omogućuje pretvaranje kategorijalnih podataka u numeričke, bez gubitka informacija. Dobro kodiranje vodi do izgradnje dobrog modela. + +Za kodiranje značajki postoje dvije glavne vrste kodera: + +1. Ordinalni koder: dobro odgovara za ordinalne varijable, koje su kategorijalne varijable čiji podaci slijede logički redoslijed, poput stupca `Veličina predmeta` u našem skupu podataka. Stvara mapiranje tako da je svaka kategorija predstavljena brojem, koji odgovara redoslijedu kategorije u stupcu. + + ```python + from sklearn.preprocessing import OrdinalEncoder + + item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']] + ordinal_features = ['Item Size'] + ordinal_encoder = OrdinalEncoder(categories=item_size_categories) + ``` + +2. Kategorijalni koder: dobro odgovara za nominalne varijable, koje su kategorijalne varijable čiji podaci ne slijede logički redoslijed, poput svih značajki osim `Veličine predmeta` u našem skupu podataka. To je kodiranje s jednom vrućom vrijednošću, što znači da je svaka kategorija predstavljena binarnim stupcem: kodirana varijabla jednaka je 1 ako bundeva pripada toj varijanti, a 0 inače. + + ```python + from sklearn.preprocessing import OneHotEncoder + + categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] + categorical_encoder = OneHotEncoder(sparse_output=False) + ``` + +Zatim se `ColumnTransformer` koristi za kombiniranje više kodera u jedan korak i njihovu primjenu na odgovarajuće stupce. + +```python + from sklearn.compose import ColumnTransformer + + ct = ColumnTransformer(transformers=[ + ('ord', ordinal_encoder, ordinal_features), + ('cat', categorical_encoder, categorical_features) + ]) + + ct.set_output(transform='pandas') + encoded_features = ct.fit_transform(pumpkins) +``` + +S druge strane, za kodiranje oznaka koristimo klasu `LabelEncoder` iz scikit-learn biblioteke, koja je pomoćna klasa za normalizaciju oznaka tako da sadrže samo vrijednosti između 0 i n_klasa-1 (ovdje, 0 i 1). + +```python + from sklearn.preprocessing import LabelEncoder + + label_encoder = LabelEncoder() + encoded_label = label_encoder.fit_transform(pumpkins['Color']) +``` + +Nakon što smo kodirali značajke i oznake, možemo ih spojiti u novi dataframe `encoded_pumpkins`. + +```python + encoded_pumpkins = encoded_features.assign(Color=encoded_label) +``` + +✅ Koje su prednosti korištenja ordinalnog kodera za stupac `Veličina predmeta`? + +### Analiza odnosa između varijabli + +Sada kada smo obradili podatke, možemo analizirati odnose između značajki i oznaka kako bismo stekli ideju o tome koliko će model biti uspješan u predviđanju oznaka na temelju značajki. Najbolji način za izvođenje ove vrste analize je grafičko prikazivanje podataka. Ponovno ćemo koristiti funkciju `catplot` iz Seaborna za vizualizaciju odnosa između `Veličine predmeta`, `Varijante` i `Boje` u kategorijalnom grafu. Za bolje prikazivanje podataka koristit ćemo kodirani stupac `Veličina predmeta` i nekodirani stupac `Varijanta`. + +```python + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size'] + + g = sns.catplot( + data=pumpkins, + x="Item Size", y="Color", row='Variety', + kind="box", orient="h", + sharex=False, margin_titles=True, + height=1.8, aspect=4, palette=palette, + ) + g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6)) + g.set_titles(row_template="{row_name}") +``` + +![Kategorijalni graf vizualiziranih podataka](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png) + +### Korištenje swarm grafa + +Budući da je `Boja` binarna kategorija (Bijela ili Nije), potrebna je '[posebna metoda](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) za vizualizaciju'. Postoje i drugi načini za vizualizaciju odnosa ove kategorije s drugim varijablama. + +Možete vizualizirati varijable usporedno pomoću Seaborn grafova. + +1. Isprobajte 'swarm' graf za prikaz distribucije vrijednosti: + + ```python + palette = { + 0: 'orange', + 1: 'wheat' + } + sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette) + ``` + + ![Swarm graf vizualiziranih podataka](../../../../2-Regression/4-Logistic/images/swarm_2.png) + +**Napomena**: kod iznad može generirati upozorenje jer Seaborn ne može prikazati toliku količinu podataka u swarm grafu. Moguće rješenje je smanjenje veličine markera pomoću parametra 'size'. Međutim, imajte na umu da to može utjecati na čitljivost grafa. + +> **🧮 Matematika iza toga** +> +> Logistička regresija temelji se na konceptu 'maksimalne vjerodostojnosti' koristeći [sigmoidne funkcije](https://wikipedia.org/wiki/Sigmoid_function). 'Sigmoidna funkcija' na grafu izgleda poput oblika slova 'S'. Uzima vrijednost i mapira je na raspon između 0 i 1. Njezina krivulja također se naziva 'logistička krivulja'. Formula izgleda ovako: +> +> ![logistička funkcija](../../../../2-Regression/4-Logistic/images/sigmoid.png) +> +> gdje se sredina sigmoidne funkcije nalazi na x-ovoj 0 točki, L je maksimalna vrijednost krivulje, a k je strmina krivulje. Ako je ishod funkcije veći od 0.5, oznaka će biti dodijeljena klasi '1' binarnog izbora. Ako nije, bit će klasificirana kao '0'. + +## Izgradite svoj model + +Izgradnja modela za pronalaženje binarne klasifikacije iznenađujuće je jednostavna u Scikit-learn biblioteci. + +[![ML za početnike - Logistička regresija za klasifikaciju podataka](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "ML za početnike - Logistička regresija za klasifikaciju podataka") + +> 🎥 Kliknite na sliku iznad za kratki video pregled izgradnje modela logističke regresije. + +1. Odaberite varijable koje želite koristiti u svom modelu klasifikacije i podijelite skup podataka na trening i testni pozivom `train_test_split()`: + + ```python + from sklearn.model_selection import train_test_split + + X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])] + y = encoded_pumpkins['Color'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + + ``` + +2. Sada možete trenirati svoj model pozivom `fit()` s vašim trening podacima i ispisati njegov rezultat: + + ```python + from sklearn.metrics import f1_score, classification_report + from sklearn.linear_model import LogisticRegression + + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('F1-score: ', f1_score(y_test, predictions)) + ``` + + Pogledajte rezultat svog modela. Nije loše, s obzirom na to da imate samo oko 1000 redaka podataka: + + ```output + precision recall f1-score support + + 0 0.94 0.98 0.96 166 + 1 0.85 0.67 0.75 33 + + accuracy 0.92 199 + macro avg 0.89 0.82 0.85 199 + weighted avg 0.92 0.92 0.92 199 + + Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 0 0 0 1 0 0 0 0 0 0 0 0 1 1] + F1-score: 0.7457627118644068 + ``` + +## Bolje razumijevanje putem matrice konfuzije + +Iako možete dobiti izvještaj o rezultatima modela [termini](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) ispisivanjem gore navedenih stavki, možda ćete bolje razumjeti svoj model korištenjem [matrice konfuzije](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) koja pomaže razumjeti kako model funkcionira. + +> 🎓 '[Matrica konfuzije](https://wikipedia.org/wiki/Confusion_matrix)' (ili 'matrica pogrešaka') je tablica koja izražava stvarne i lažne pozitivne i negativne rezultate vašeg modela, čime se procjenjuje točnost predviđanja. + +1. Za korištenje matrice konfuzije, pozovite `confusion_matrix()`: + + ```python + from sklearn.metrics import confusion_matrix + confusion_matrix(y_test, predictions) + ``` + + Pogledajte matricu konfuzije svog modela: + + ```output + array([[162, 4], + [ 11, 22]]) + ``` + +U Scikit-learn biblioteci, redovi (os x) predstavljaju stvarne oznake, a stupci (os y) predviđene oznake. + +| | 0 | 1 | +| :---: | :---: | :---: | +| 0 | TN | FP | +| 1 | FN | TP | + +Što se ovdje događa? Recimo da naš model treba klasificirati bundeve između dvije binarne kategorije, kategorije 'bijela' i kategorije 'nije bijela'. + +- Ako vaš model predvidi bundevu kao 'nije bijela', a ona stvarno pripada kategoriji 'nije bijela', to nazivamo pravim negativnim rezultatom, prikazanim u gornjem lijevom kutu. +- Ako vaš model predvidi bundevu kao 'bijela', a ona stvarno pripada kategoriji 'nije bijela', to nazivamo lažnim negativnim rezultatom, prikazanim u donjem lijevom kutu. +- Ako vaš model predvidi bundevu kao 'nije bijela', a ona stvarno pripada kategoriji 'bijela', to nazivamo lažnim pozitivnim rezultatom, prikazanim u gornjem desnom kutu. +- Ako vaš model predvidi bundevu kao 'bijela', a ona stvarno pripada kategoriji 'bijela', to nazivamo pravim pozitivnim rezultatom, prikazanim u donjem desnom kutu. + +Kao što ste mogli pretpostaviti, poželjno je imati veći broj pravih pozitivnih i pravih negativnih rezultata te manji broj lažnih pozitivnih i lažnih negativnih rezultata, što implicira da model bolje funkcionira. +Kako se matrica zabune odnosi na preciznost i odziv? Zapamtite, izvještaj o klasifikaciji prikazan iznad pokazao je preciznost (0.85) i odziv (0.67). + +Preciznost = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461 + +Odziv = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666 + +✅ P: Prema matrici zabune, kako je model prošao? O: Nije loše; postoji dobar broj točnih negativnih, ali i nekoliko lažnih negativnih. + +Ponovno ćemo pogledati pojmove koje smo ranije vidjeli uz pomoć mapiranja TP/TN i FP/FN u matrici zabune: + +🎓 Preciznost: TP/(TP + FP) Omjer relevantnih instanci među pronađenim instancama (npr. koje oznake su dobro označene). + +🎓 Odziv: TP/(TP + FN) Omjer relevantnih instanci koje su pronađene, bez obzira jesu li dobro označene ili ne. + +🎓 f1-score: (2 * preciznost * odziv)/(preciznost + odziv) Ponderirani prosjek preciznosti i odziva, gdje je najbolji rezultat 1, a najgori 0. + +🎓 Podrška: Broj pojavljivanja svake pronađene oznake. + +🎓 Točnost: (TP + TN)/(TP + TN + FP + FN) Postotak oznaka koje su točno predviđene za uzorak. + +🎓 Makro prosjek: Izračunavanje neponderiranog srednjeg rezultata za svaku oznaku, ne uzimajući u obzir neravnotežu oznaka. + +🎓 Ponderirani prosjek: Izračunavanje srednjeg rezultata za svaku oznaku, uzimajući u obzir neravnotežu oznaka ponderiranjem prema njihovoj podršci (broj točnih instanci za svaku oznaku). + +✅ Možete li zamisliti koji bi metrik trebali pratiti ako želite da vaš model smanji broj lažnih negativnih? + +## Vizualizirajte ROC krivulju ovog modela + +[![ML za početnike - Analiza performansi logističke regresije s ROC krivuljama](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML za početnike - Analiza performansi logističke regresije s ROC krivuljama") + +> 🎥 Kliknite na sliku iznad za kratki video pregled ROC krivulja. + +Napravimo još jednu vizualizaciju kako bismo vidjeli takozvanu 'ROC' krivulju: + +```python +from sklearn.metrics import roc_curve, roc_auc_score +import matplotlib +import matplotlib.pyplot as plt +%matplotlib inline + +y_scores = model.predict_proba(X_test) +fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1]) + +fig = plt.figure(figsize=(6, 6)) +plt.plot([0, 1], [0, 1], 'k--') +plt.plot(fpr, tpr) +plt.xlabel('False Positive Rate') +plt.ylabel('True Positive Rate') +plt.title('ROC Curve') +plt.show() +``` + +Koristeći Matplotlib, nacrtajte [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) ili ROC krivulju modela. ROC krivulje se često koriste za pregled izlaza klasifikatora u smislu njegovih točnih i lažnih pozitivnih. "ROC krivulje obično prikazuju stopu točnih pozitivnih na Y osi, a stopu lažnih pozitivnih na X osi." Dakle, strmina krivulje i prostor između središnje linije i krivulje su važni: želite krivulju koja brzo ide gore i preko linije. U našem slučaju, postoje lažni pozitivni na početku, a zatim linija ide gore i preko pravilno: + +![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png) + +Na kraju, koristite Scikit-learnov [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) za izračun stvarne 'Površine ispod krivulje' (AUC): + +```python +auc = roc_auc_score(y_test,y_scores[:,1]) +print(auc) +``` +Rezultat je `0.9749908725812341`. S obzirom na to da AUC varira od 0 do 1, želite visok rezultat, jer model koji je 100% točan u svojim predviđanjima ima AUC od 1; u ovom slučaju, model je _prilično dobar_. + +U budućim lekcijama o klasifikacijama naučit ćete kako iterirati kako biste poboljšali rezultate svog modela. Ali za sada, čestitamo! Završili ste ove lekcije o regresiji! + +--- +## 🚀Izazov + +Ima još puno toga za istražiti o logističkoj regresiji! No, najbolji način za učenje je eksperimentiranje. Pronađite skup podataka koji se dobro uklapa u ovu vrstu analize i izradite model s njim. Što ste naučili? savjet: pokušajte [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) za zanimljive skupove podataka. + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Pročitajte prvih nekoliko stranica [ovog rada sa Stanforda](https://web.stanford.edu/~jurafsky/slp3/5.pdf) o nekim praktičnim primjenama logističke regresije. Razmislite o zadacima koji su bolje prilagođeni jednoj ili drugoj vrsti regresijskih zadataka koje smo do sada proučavali. Što bi najbolje funkcioniralo? + +## Zadatak + +[Ponovno pokušavanje ove regresije](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/4-Logistic/assignment.md b/translations/hr/2-Regression/4-Logistic/assignment.md new file mode 100644 index 00000000..183a67ba --- /dev/null +++ b/translations/hr/2-Regression/4-Logistic/assignment.md @@ -0,0 +1,25 @@ + +# Ponovno pokušavanje regresije + +## Upute + +U lekciji ste koristili podskup podataka o bundevama. Sada se vratite na izvorne podatke i pokušajte koristiti sve, očišćene i standardizirane, kako biste izgradili model logističke regresije. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ---------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- | +| | Prikazan je bilježnica s dobro objašnjenim i dobro izvedenim modelom | Prikazan je bilježnica s modelom koji minimalno zadovoljava | Prikazan je bilježnica s loše izvedenim modelom ili bez njega | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/4-Logistic/solution/Julia/README.md b/translations/hr/2-Regression/4-Logistic/solution/Julia/README.md new file mode 100644 index 00000000..1e6b80ef --- /dev/null +++ b/translations/hr/2-Regression/4-Logistic/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/2-Regression/README.md b/translations/hr/2-Regression/README.md new file mode 100644 index 00000000..f93b142b --- /dev/null +++ b/translations/hr/2-Regression/README.md @@ -0,0 +1,54 @@ + +# Regresijski modeli za strojno učenje +## Regionalna tema: Regresijski modeli za cijene bundeva u Sjevernoj Americi 🎃 + +U Sjevernoj Americi bundeve se često izrezuju u zastrašujuća lica za Noć vještica. Otkrijmo više o ovim fascinantnim povrćem! + +![jack-o-lanterns](../../../2-Regression/images/jack-o-lanterns.jpg) +> Fotografija: Beth Teutschmann na Unsplash + +## Što ćete naučiti + +[![Uvod u regresiju](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "Video uvod u regresiju - Kliknite za gledanje!") +> 🎥 Kliknite na sliku iznad za kratki uvodni video u ovu lekciju + +Lekcije u ovom dijelu pokrivaju vrste regresije u kontekstu strojnog učenja. Regresijski modeli mogu pomoći u određivanju _odnosa_ između varijabli. Ova vrsta modela može predvidjeti vrijednosti poput duljine, temperature ili starosti, otkrivajući odnose između varijabli dok analizira podatkovne točke. + +U ovom nizu lekcija otkrit ćete razlike između linearne i logističke regresije te kada biste trebali preferirati jednu u odnosu na drugu. + +[![Strojno učenje za početnike - Uvod u regresijske modele za strojno učenje](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "Strojno učenje za početnike - Uvod u regresijske modele za strojno učenje") + +> 🎥 Kliknite na sliku iznad za kratki video koji uvodi regresijske modele. + +U ovom skupu lekcija pripremit ćete se za početak zadataka strojnog učenja, uključujući konfiguriranje Visual Studio Code-a za upravljanje bilježnicama, uobičajenim okruženjem za podatkovne znanstvenike. Otkrit ćete Scikit-learn, biblioteku za strojno učenje, i izgraditi svoje prve modele, s fokusom na regresijske modele u ovom poglavlju. + +> Postoje korisni alati s malo koda koji vam mogu pomoći u učenju rada s regresijskim modelima. Isprobajte [Azure ML za ovaj zadatak](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +### Lekcije + +1. [Alati zanata](1-Tools/README.md) +2. [Upravljanje podacima](2-Data/README.md) +3. [Linearna i polinomijalna regresija](3-Linear/README.md) +4. [Logistička regresija](4-Logistic/README.md) + +--- +### Zasluge + +"Strojno učenje s regresijom" napisano je s ♥️ od strane [Jen Looper](https://twitter.com/jenlooper) + +♥️ Suradnici na kvizu uključuju: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) i [Ornella Altunyan](https://twitter.com/ornelladotcom) + +Skup podataka o bundevama predložen je od strane [ovog projekta na Kaggleu](https://www.kaggle.com/usda/a-year-of-pumpkin-prices), a njegovi podaci potječu iz [Standardnih izvještaja o cijenama na terminalnim tržištima za specijalne kulture](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) koje distribuira Ministarstvo poljoprivrede Sjedinjenih Američkih Država. Dodali smo nekoliko točaka vezanih uz boju na temelju sorte kako bismo normalizirali distribuciju. Ovi podaci su u javnom vlasništvu. + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/3-Web-App/1-Web-App/README.md b/translations/hr/3-Web-App/1-Web-App/README.md new file mode 100644 index 00000000..0d9f767b --- /dev/null +++ b/translations/hr/3-Web-App/1-Web-App/README.md @@ -0,0 +1,359 @@ + +# Izgradnja web aplikacije za korištenje ML modela + +U ovoj lekciji, trenirat ćete ML model na skupu podataka koji je doslovno van ovog svijeta: _viđenja NLO-a tijekom prošlog stoljeća_, preuzetih iz NUFORC baze podataka. + +Naučit ćete: + +- Kako 'pickle-ati' trenirani model +- Kako koristiti taj model u Flask aplikaciji + +Nastavit ćemo koristiti bilježnice za čišćenje podataka i treniranje modela, ali možete napraviti korak dalje istražujući kako koristiti model "u divljini", da tako kažemo: u web aplikaciji. + +Da biste to učinili, trebate izgraditi web aplikaciju koristeći Flask. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Izgradnja aplikacije + +Postoji nekoliko načina za izgradnju web aplikacija koje koriste modele strojnog učenja. Vaša web arhitektura može utjecati na način na koji je model treniran. Zamislite da radite u tvrtki gdje je tim za podatkovnu znanost trenirao model koji žele da koristite u aplikaciji. + +### Razmatranja + +Postoji mnogo pitanja koja trebate postaviti: + +- **Je li to web aplikacija ili mobilna aplikacija?** Ako gradite mobilnu aplikaciju ili trebate koristiti model u IoT kontekstu, možete koristiti [TensorFlow Lite](https://www.tensorflow.org/lite/) i koristiti model u Android ili iOS aplikaciji. +- **Gdje će model biti smješten?** U oblaku ili lokalno? +- **Podrška za offline rad.** Mora li aplikacija raditi offline? +- **Koja tehnologija je korištena za treniranje modela?** Odabrana tehnologija može utjecati na alate koje trebate koristiti. + - **Korištenje TensorFlow-a.** Ako trenirate model koristeći TensorFlow, na primjer, taj ekosustav omogućuje konverziju TensorFlow modela za korištenje u web aplikaciji pomoću [TensorFlow.js](https://www.tensorflow.org/js/). + - **Korištenje PyTorch-a.** Ako gradite model koristeći biblioteku poput [PyTorch](https://pytorch.org/), imate opciju izvesti ga u [ONNX](https://onnx.ai/) (Open Neural Network Exchange) formatu za korištenje u JavaScript web aplikacijama koje mogu koristiti [Onnx Runtime](https://www.onnxruntime.ai/). Ova opcija će biti istražena u budućoj lekciji za model treniran pomoću Scikit-learn. + - **Korištenje Lobe.ai ili Azure Custom Vision.** Ako koristite ML SaaS (Software as a Service) sustav poput [Lobe.ai](https://lobe.ai/) ili [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) za treniranje modela, ovaj tip softvera pruža načine za izvoz modela za mnoge platforme, uključujući izgradnju prilagođenog API-ja koji se može upitati u oblaku putem vaše online aplikacije. + +Također imate priliku izgraditi cijelu Flask web aplikaciju koja bi mogla trenirati model unutar web preglednika. To se također može učiniti koristeći TensorFlow.js u JavaScript kontekstu. + +Za naše potrebe, budući da radimo s bilježnicama temeljenim na Pythonu, istražimo korake koje trebate poduzeti kako biste izvezli trenirani model iz takve bilježnice u format čitljiv Python-izgrađenoj web aplikaciji. + +## Alat + +Za ovaj zadatak trebate dva alata: Flask i Pickle, oba se pokreću na Pythonu. + +✅ Što je [Flask](https://palletsprojects.com/p/flask/)? Definiran kao 'mikro-okvir' od strane svojih kreatora, Flask pruža osnovne značajke web okvira koristeći Python i motor za predloške za izgradnju web stranica. Pogledajte [ovaj modul za učenje](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) kako biste vježbali izgradnju s Flaskom. + +✅ Što je [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 je Python modul koji serijalizira i de-serijalizira strukturu Python objekta. Kada 'pickle-ate' model, serijalizirate ili "spljoštavate" njegovu strukturu za korištenje na webu. Budite oprezni: pickle nije inherentno siguran, pa budite oprezni ako vas se potiče da 'un-pickle-ate' datoteku. Pickle-ana datoteka ima sufiks `.pkl`. + +## Vježba - očistite svoje podatke + +U ovoj lekciji koristit ćete podatke iz 80.000 viđenja NLO-a, prikupljenih od strane [NUFORC](https://nuforc.org) (Nacionalni centar za prijavu NLO-a). Ovi podaci imaju zanimljive opise viđenja NLO-a, na primjer: + +- **Dugi opis primjera.** "Čovjek izlazi iz zrake svjetlosti koja obasjava travnato polje noću i trči prema parkiralištu Texas Instrumentsa". +- **Kratki opis primjera.** "svjetla su nas progonila". + +[ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) proračunska tablica uključuje stupce o `grad`, `država` i `zemlja` gdje se viđenje dogodilo, oblik objekta (`shape`) te njegovu `širinu` i `dužinu`. + +U praznoj [bilježnici](../../../../3-Web-App/1-Web-App/notebook.ipynb) uključene u ovu lekciju: + +1. importirajte `pandas`, `matplotlib` i `numpy` kao što ste to učinili u prethodnim lekcijama i importirajte proračunsku tablicu ufos. Možete pogledati uzorak skupa podataka: + + ```python + import pandas as pd + import numpy as np + + ufos = pd.read_csv('./data/ufos.csv') + ufos.head() + ``` + +1. Pretvorite podatke ufos u mali dataframe sa svježim naslovima. Provjerite jedinstvene vrijednosti u polju `Country`. + + ```python + ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) + + ufos.Country.unique() + ``` + +1. Sada možete smanjiti količinu podataka s kojima trebamo raditi tako da odbacite sve null vrijednosti i uvezete samo viđenja između 1-60 sekundi: + + ```python + ufos.dropna(inplace=True) + + ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] + + ufos.info() + ``` + +1. Importirajte Scikit-learnovu biblioteku `LabelEncoder` za pretvaranje tekstualnih vrijednosti za zemlje u broj: + + ✅ LabelEncoder kodira podatke abecedno + + ```python + from sklearn.preprocessing import LabelEncoder + + ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) + + ufos.head() + ``` + + Vaši podaci trebali bi izgledati ovako: + + ```output + Seconds Country Latitude Longitude + 2 20.0 3 53.200000 -2.916667 + 3 20.0 4 28.978333 -96.645833 + 14 30.0 4 35.823889 -80.253611 + 23 60.0 4 45.582778 -122.352222 + 24 3.0 3 51.783333 -0.783333 + ``` + +## Vježba - izgradite svoj model + +Sada se možete pripremiti za treniranje modela dijeljenjem podataka u skup za treniranje i testiranje. + +1. Odaberite tri značajke na kojima želite trenirati kao svoj X vektor, a y vektor će biti `Country`. Želite moći unijeti `Seconds`, `Latitude` i `Longitude` i dobiti ID zemlje kao rezultat. + + ```python + from sklearn.model_selection import train_test_split + + Selected_features = ['Seconds','Latitude','Longitude'] + + X = ufos[Selected_features] + y = ufos['Country'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + ``` + +1. Trenirajte svoj model koristeći logističku regresiju: + + ```python + from sklearn.metrics import accuracy_score, classification_report + from sklearn.linear_model import LogisticRegression + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('Accuracy: ', accuracy_score(y_test, predictions)) + ``` + +Točnost nije loša **(oko 95%)**, što nije iznenađujuće, jer `Country` i `Latitude/Longitude` koreliraju. + +Model koji ste kreirali nije baš revolucionaran jer biste trebali moći zaključiti `Country` iz njegovih `Latitude` i `Longitude`, ali ovo je dobra vježba za pokušaj treniranja od sirovih podataka koje ste očistili, izvezli, a zatim koristili ovaj model u web aplikaciji. + +## Vježba - 'pickle-ajte' svoj model + +Sada je vrijeme da _pickle-ate_ svoj model! To možete učiniti u nekoliko linija koda. Jednom kada je _pickle-an_, učitajte svoj pickle-ani model i testirajte ga na uzorku podataka koji sadrži vrijednosti za sekunde, širinu i dužinu. + +```python +import pickle +model_filename = 'ufo-model.pkl' +pickle.dump(model, open(model_filename,'wb')) + +model = pickle.load(open('ufo-model.pkl','rb')) +print(model.predict([[50,44,-12]])) +``` + +Model vraća **'3'**, što je kod zemlje za UK. Nevjerojatno! 👽 + +## Vježba - izgradite Flask aplikaciju + +Sada možete izgraditi Flask aplikaciju koja poziva vaš model i vraća slične rezultate, ali na vizualno privlačniji način. + +1. Započnite stvaranjem mape nazvane **web-app** pored datoteke _notebook.ipynb_ gdje se nalazi vaša datoteka _ufo-model.pkl_. + +1. U toj mapi stvorite još tri mape: **static**, s mapom **css** unutar nje, i **templates**. Sada biste trebali imati sljedeće datoteke i direktorije: + + ```output + web-app/ + static/ + css/ + templates/ + notebook.ipynb + ufo-model.pkl + ``` + + ✅ Pogledajte mapu rješenja za pregled gotove aplikacije + +1. Prva datoteka koju treba stvoriti u mapi _web-app_ je datoteka **requirements.txt**. Kao _package.json_ u JavaScript aplikaciji, ova datoteka navodi ovisnosti potrebne za aplikaciju. U **requirements.txt** dodajte linije: + + ```text + scikit-learn + pandas + numpy + flask + ``` + +1. Sada pokrenite ovu datoteku navigacijom do _web-app_: + + ```bash + cd web-app + ``` + +1. U svom terminalu upišite `pip install`, kako biste instalirali biblioteke navedene u _requirements.txt_: + + ```bash + pip install -r requirements.txt + ``` + +1. Sada ste spremni stvoriti još tri datoteke za dovršetak aplikacije: + + 1. Stvorite **app.py** u korijenu. + 2. Stvorite **index.html** u direktoriju _templates_. + 3. Stvorite **styles.css** u direktoriju _static/css_. + +1. Izgradite datoteku _styles.css_ s nekoliko stilova: + + ```css + body { + width: 100%; + height: 100%; + font-family: 'Helvetica'; + background: black; + color: #fff; + text-align: center; + letter-spacing: 1.4px; + font-size: 30px; + } + + input { + min-width: 150px; + } + + .grid { + width: 300px; + border: 1px solid #2d2d2d; + display: grid; + justify-content: center; + margin: 20px auto; + } + + .box { + color: #fff; + background: #2d2d2d; + padding: 12px; + display: inline-block; + } + ``` + +1. Zatim izgradite datoteku _index.html_: + + ```html + + + + + 🛸 UFO Appearance Prediction! 👽 + + + + +
+ +
+ +

According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?

+ +
+ + + + +
+ +

{{ prediction_text }}

+ +
+ +
+ + + + ``` + + Pogledajte predloške u ovoj datoteci. Primijetite 'mustache' sintaksu oko varijabli koje će biti pružene od strane aplikacije, poput teksta predikcije: `{{}}`. Tu je i obrazac koji šalje predikciju na rutu `/predict`. + + Konačno, spremni ste izgraditi Python datoteku koja pokreće korištenje modela i prikaz predikcija: + +1. U `app.py` dodajte: + + ```python + import numpy as np + from flask import Flask, request, render_template + import pickle + + app = Flask(__name__) + + model = pickle.load(open("./ufo-model.pkl", "rb")) + + + @app.route("/") + def home(): + return render_template("index.html") + + + @app.route("/predict", methods=["POST"]) + def predict(): + + int_features = [int(x) for x in request.form.values()] + final_features = [np.array(int_features)] + prediction = model.predict(final_features) + + output = prediction[0] + + countries = ["Australia", "Canada", "Germany", "UK", "US"] + + return render_template( + "index.html", prediction_text="Likely country: {}".format(countries[output]) + ) + + + if __name__ == "__main__": + app.run(debug=True) + ``` + + > 💡 Savjet: kada dodate [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) dok pokrećete web aplikaciju koristeći Flask, sve promjene koje napravite u svojoj aplikaciji bit će odmah vidljive bez potrebe za ponovnim pokretanjem servera. Pazite! Nemojte omogućiti ovaj način rada u produkcijskoj aplikaciji. + +Ako pokrenete `python app.py` ili `python3 app.py` - vaš web server se pokreće lokalno, i možete ispuniti kratki obrazac kako biste dobili odgovor na svoje goruće pitanje o tome gdje su NLO-i viđeni! + +Prije nego što to učinite, pogledajte dijelove `app.py`: + +1. Prvo se učitavaju ovisnosti i aplikacija se pokreće. +1. Zatim se model importira. +1. Zatim se index.html prikazuje na početnoj ruti. + +Na ruti `/predict`, nekoliko stvari se događa kada se obrazac pošalje: + +1. Varijable obrasca se prikupljaju i pretvaraju u numpy niz. Zatim se šalju modelu i vraća se predikcija. +2. Zemlje koje želimo prikazati ponovno se prikazuju kao čitljiv tekst iz njihovog predviđenog koda zemlje, i ta vrijednost se vraća na index.html kako bi se prikazala u predlošku. + +Korištenje modela na ovaj način, s Flaskom i pickle-anim modelom, relativno je jednostavno. Najteže je razumjeti kakvog oblika moraju biti podaci koji se šalju modelu kako bi se dobila predikcija. Sve ovisi o tome kako je model treniran. Ovaj ima tri podatkovne točke koje treba unijeti kako bi se dobila predikcija. + +U profesionalnom okruženju, možete vidjeti koliko je dobra komunikacija važna između ljudi koji treniraju model i onih koji ga koriste u web ili mobilnoj aplikaciji. U našem slučaju, to je samo jedna osoba, vi! + +--- + +## 🚀 Izazov + +Umjesto rada u bilježnici i uvoza modela u Flask aplikaciju, mogli biste trenirati model direktno unutar Flask aplikacije! Pokušajte pretvoriti svoj Python kod iz bilježnice, možda nakon što su vaši podaci očišćeni, kako biste trenirali model unutar aplikacije na ruti nazvanoj `train`. Koji su prednosti i nedostaci ovog pristupa? + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Postoji mnogo načina za izgradnju web aplikacije koja koristi ML modele. Napravite popis načina na koje biste mogli koristiti JavaScript ili Python za izgradnju web aplikacije koja koristi strojno učenje. Razmotrite arhitekturu: treba li model ostati u aplikaciji ili živjeti u oblaku? Ako je ovo drugo, kako biste mu pristupili? Nacrtajte arhitektonski model za primijenjeno ML web rješenje. + +## Zadatak + +[Isprobajte drugačiji model](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/3-Web-App/1-Web-App/assignment.md b/translations/hr/3-Web-App/1-Web-App/assignment.md new file mode 100644 index 00000000..3e061c4f --- /dev/null +++ b/translations/hr/3-Web-App/1-Web-App/assignment.md @@ -0,0 +1,25 @@ + +# Isprobajte drugi model + +## Upute + +Sada kada ste izradili jednu web aplikaciju koristeći trenirani model regresije, upotrijebite jedan od modela iz ranije lekcije o regresiji kako biste ponovno izradili ovu web aplikaciju. Možete zadržati isti stil ili ga dizajnirati drugačije kako bi odražavao podatke o bundevama. Pazite da promijenite ulazne podatke kako bi odgovarali metodi treniranja vašeg modela. + +## Rubrika + +| Kriterij | Primjeran | Zadovoljavajući | Potrebno poboljšanje | +| -------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------- | +| Funkcionalnost | Web aplikacija radi kako se očekuje i postavljena je u oblak | Web aplikacija sadrži nedostatke ili daje neočekivane rezultate | Web aplikacija ne funkcionira ispravno | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/3-Web-App/README.md b/translations/hr/3-Web-App/README.md new file mode 100644 index 00000000..84bcf69d --- /dev/null +++ b/translations/hr/3-Web-App/README.md @@ -0,0 +1,35 @@ + +# Izgradite web aplikaciju za korištenje vašeg ML modela + +U ovom dijelu kurikuluma upoznat ćete se s primijenjenom temom strojnog učenja: kako spremiti svoj Scikit-learn model kao datoteku koja se može koristiti za predviđanja unutar web aplikacije. Kada model bude spremljen, naučit ćete kako ga koristiti u web aplikaciji izgrađenoj u Flasku. Prvo ćete kreirati model koristeći podatke koji se odnose na viđenja NLO-a! Zatim ćete izgraditi web aplikaciju koja će vam omogućiti unos broja sekundi, zajedno s vrijednostima geografske širine i dužine, kako biste predvidjeli koja je zemlja prijavila viđenje NLO-a. + +![NLO Parking](../../../3-Web-App/images/ufo.jpg) + +Fotografija autora Michael Herren na Unsplash + +## Lekcije + +1. [Izgradite web aplikaciju](1-Web-App/README.md) + +## Zasluge + +"Izgradite web aplikaciju" napisala je s ♥️ [Jen Looper](https://twitter.com/jenlooper). + +♥️ Kvizove je napisao Rohan Raj. + +Skup podataka preuzet je s [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings). + +Arhitektura web aplikacije djelomično je predložena u [ovom članku](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) i [ovom repozitoriju](https://github.com/abhinavsagar/machine-learning-deployment) autora Abhinav Sagar. + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/1-Introduction/README.md b/translations/hr/4-Classification/1-Introduction/README.md new file mode 100644 index 00000000..7ea10451 --- /dev/null +++ b/translations/hr/4-Classification/1-Introduction/README.md @@ -0,0 +1,313 @@ + +# Uvod u klasifikaciju + +U ovih četiri lekcije istražit ćete temeljni fokus klasičnog strojnog učenja - _klasifikaciju_. Proći ćemo kroz korištenje različitih algoritama klasifikacije s datasetom o svim briljantnim kuhinjama Azije i Indije. Nadamo se da ste gladni! + +![samo prstohvat!](../../../../4-Classification/1-Introduction/images/pinch.png) + +> Proslavite pan-azijske kuhinje u ovim lekcijama! Slika: [Jen Looper](https://twitter.com/jenlooper) + +Klasifikacija je oblik [nadziranog učenja](https://wikipedia.org/wiki/Supervised_learning) koji ima mnogo zajedničkog s tehnikama regresije. Ako je strojno učenje usmjereno na predviđanje vrijednosti ili naziva stvari pomoću podataka, tada se klasifikacija općenito dijeli u dvije skupine: _binarna klasifikacija_ i _višeklasna klasifikacija_. + +[![Uvod u klasifikaciju](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Uvod u klasifikaciju") + +> 🎥 Kliknite na sliku iznad za video: John Guttag s MIT-a predstavlja klasifikaciju + +Zapamtite: + +- **Linearna regresija** pomogla vam je predvidjeti odnose između varijabli i napraviti točna predviđanja o tome gdje će novi podatak pasti u odnosu na tu liniju. Na primjer, mogli ste predvidjeti _koja će cijena bundeve biti u rujnu u usporedbi s prosincem_. +- **Logistička regresija** pomogla vam je otkriti "binarne kategorije": na ovoj cjenovnoj razini, _je li bundeva narančasta ili nije narančasta_? + +Klasifikacija koristi različite algoritme za određivanje drugih načina dodjeljivanja oznake ili klase podatkovnoj točki. Radit ćemo s ovim podacima o kuhinjama kako bismo vidjeli možemo li, promatrajući skup sastojaka, odrediti iz koje kuhinje potječu. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ova lekcija dostupna je i na R jeziku!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html) + +### Uvod + +Klasifikacija je jedna od temeljnih aktivnosti istraživača strojnog učenja i podatkovnih znanstvenika. Od osnovne klasifikacije binarne vrijednosti ("je li ovaj email spam ili nije?"), do složene klasifikacije i segmentacije slika pomoću računalnog vida, uvijek je korisno moći razvrstati podatke u klase i postavljati pitanja o njima. + +Da bismo proces izrazili na znanstveniji način, vaša metoda klasifikacije stvara prediktivni model koji vam omogućuje mapiranje odnosa između ulaznih varijabli i izlaznih varijabli. + +![binarna vs. višeklasna klasifikacija](../../../../4-Classification/1-Introduction/images/binary-multiclass.png) + +> Binarni i višeklasni problemi za algoritme klasifikacije. Infografika: [Jen Looper](https://twitter.com/jenlooper) + +Prije nego što započnemo proces čišćenja podataka, njihove vizualizacije i pripreme za zadatke strojnog učenja, naučimo malo više o različitim načinima na koje se strojno učenje može koristiti za klasifikaciju podataka. + +Izvedena iz [statistike](https://wikipedia.org/wiki/Statistical_classification), klasifikacija pomoću klasičnog strojnog učenja koristi značajke, poput `smoker`, `weight` i `age`, kako bi odredila _vjerojatnost razvoja određene bolesti_. Kao tehnika nadziranog učenja slična regresijskim vježbama koje ste ranije izvodili, vaši podaci su označeni, a algoritmi strojnog učenja koriste te oznake za klasifikaciju i predviđanje klasa (ili 'značajki') skupa podataka te njihovo dodjeljivanje grupi ili ishodu. + +✅ Zastanite na trenutak i zamislite skup podataka o kuhinjama. Na što bi višeklasni model mogao odgovoriti? Na što bi binarni model mogao odgovoriti? Što ako želite odrediti koristi li određena kuhinja vjerojatno piskavicu? Što ako želite vidjeti možete li, s obzirom na vrećicu namirnica punu zvjezdastog anisa, artičoka, cvjetače i hrena, pripremiti tipično indijsko jelo? + +[![Lude misteriozne košare](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Lude misteriozne košare") + +> 🎥 Kliknite na sliku iznad za video. Cijela premisa emisije 'Chopped' je 'misteriozna košara' u kojoj kuhari moraju pripremiti jelo od nasumično odabranih sastojaka. Sigurno bi ML model pomogao! + +## Pozdrav 'klasifikatoru' + +Pitanje koje želimo postaviti ovom skupu podataka o kuhinjama zapravo je **višeklasno pitanje**, jer imamo nekoliko potencijalnih nacionalnih kuhinja s kojima radimo. S obzirom na skup sastojaka, kojoj od ovih mnogih klasa će podaci pripadati? + +Scikit-learn nudi nekoliko različitih algoritama za klasifikaciju podataka, ovisno o vrsti problema koji želite riješiti. U sljedeće dvije lekcije naučit ćete o nekoliko tih algoritama. + +## Vježba - očistite i uravnotežite svoje podatke + +Prvi zadatak prije početka ovog projekta je očistiti i **uravnotežiti** svoje podatke kako biste dobili bolje rezultate. Počnite s praznom datotekom _notebook.ipynb_ u korijenu ove mape. + +Prvo što trebate instalirati je [imblearn](https://imbalanced-learn.org/stable/). Ovo je Scikit-learn paket koji će vam omogućiti bolje uravnoteženje podataka (o ovom zadatku ćete naučiti više za trenutak). + +1. Za instalaciju `imblearn`, pokrenite `pip install`, ovako: + + ```python + pip install imblearn + ``` + +1. Uvezite pakete potrebne za uvoz i vizualizaciju podataka, također uvezite `SMOTE` iz `imblearn`. + + ```python + import pandas as pd + import matplotlib.pyplot as plt + import matplotlib as mpl + import numpy as np + from imblearn.over_sampling import SMOTE + ``` + + Sada ste spremni za uvoz podataka. + +1. Sljedeći zadatak je uvoz podataka: + + ```python + df = pd.read_csv('../data/cuisines.csv') + ``` + + Korištenje `read_csv()` učitat će sadržaj csv datoteke _cusines.csv_ i smjestiti ga u varijablu `df`. + +1. Provjerite oblik podataka: + + ```python + df.head() + ``` + + Prvih pet redaka izgleda ovako: + + ```output + | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | + | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | + | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + ``` + +1. Dobijte informacije o ovim podacima pozivom `info()`: + + ```python + df.info() + ``` + + Vaš izlaz izgleda ovako: + + ```output + + RangeIndex: 2448 entries, 0 to 2447 + Columns: 385 entries, Unnamed: 0 to zucchini + dtypes: int64(384), object(1) + memory usage: 7.2+ MB + ``` + +## Vježba - učenje o kuhinjama + +Sada rad postaje zanimljiviji. Otkrijmo distribuciju podataka po kuhinji. + +1. Prikaz podataka kao stupaca pozivom `barh()`: + + ```python + df.cuisine.value_counts().plot.barh() + ``` + + ![distribucija podataka o kuhinjama](../../../../4-Classification/1-Introduction/images/cuisine-dist.png) + + Postoji ograničen broj kuhinja, ali distribucija podataka je neujednačena. To možete popraviti! Prije toga, istražite malo više. + +1. Saznajte koliko je podataka dostupno po kuhinji i ispišite ih: + + ```python + thai_df = df[(df.cuisine == "thai")] + japanese_df = df[(df.cuisine == "japanese")] + chinese_df = df[(df.cuisine == "chinese")] + indian_df = df[(df.cuisine == "indian")] + korean_df = df[(df.cuisine == "korean")] + + print(f'thai df: {thai_df.shape}') + print(f'japanese df: {japanese_df.shape}') + print(f'chinese df: {chinese_df.shape}') + print(f'indian df: {indian_df.shape}') + print(f'korean df: {korean_df.shape}') + ``` + + izlaz izgleda ovako: + + ```output + thai df: (289, 385) + japanese df: (320, 385) + chinese df: (442, 385) + indian df: (598, 385) + korean df: (799, 385) + ``` + +## Otkrijte sastojke + +Sada možete dublje istražiti podatke i saznati koji su tipični sastojci po kuhinji. Trebali biste očistiti ponavljajuće podatke koji stvaraju konfuziju između kuhinja, pa naučimo o ovom problemu. + +1. Napravite funkciju `create_ingredient()` u Pythonu za stvaranje dataframea sastojaka. Ova funkcija će započeti uklanjanjem nevažnog stupca i sortirati sastojke prema njihovom broju: + + ```python + def create_ingredient_df(df): + ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') + ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] + ingredient_df = ingredient_df.sort_values(by='value', ascending=False, + inplace=False) + return ingredient_df + ``` + + Sada možete koristiti tu funkciju kako biste dobili ideju o deset najpopularnijih sastojaka po kuhinji. + +1. Pozovite `create_ingredient()` i prikažite rezultate pozivom `barh()`: + + ```python + thai_ingredient_df = create_ingredient_df(thai_df) + thai_ingredient_df.head(10).plot.barh() + ``` + + ![tajlandska](../../../../4-Classification/1-Introduction/images/thai.png) + +1. Učinite isto za japanske podatke: + + ```python + japanese_ingredient_df = create_ingredient_df(japanese_df) + japanese_ingredient_df.head(10).plot.barh() + ``` + + ![japanska](../../../../4-Classification/1-Introduction/images/japanese.png) + +1. Sada za kineske sastojke: + + ```python + chinese_ingredient_df = create_ingredient_df(chinese_df) + chinese_ingredient_df.head(10).plot.barh() + ``` + + ![kineska](../../../../4-Classification/1-Introduction/images/chinese.png) + +1. Prikažite indijske sastojke: + + ```python + indian_ingredient_df = create_ingredient_df(indian_df) + indian_ingredient_df.head(10).plot.barh() + ``` + + ![indijska](../../../../4-Classification/1-Introduction/images/indian.png) + +1. Na kraju, prikažite korejske sastojke: + + ```python + korean_ingredient_df = create_ingredient_df(korean_df) + korean_ingredient_df.head(10).plot.barh() + ``` + + ![korejska](../../../../4-Classification/1-Introduction/images/korean.png) + +1. Sada uklonite najčešće sastojke koji stvaraju konfuziju između različitih kuhinja, pozivom `drop()`: + + Svi vole rižu, češnjak i đumbir! + + ```python + feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) + labels_df = df.cuisine #.unique() + feature_df.head() + ``` + +## Uravnotežite skup podataka + +Sada kada ste očistili podatke, koristite [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Tehnika sintetičkog manjinskog uzorkovanja" - za uravnoteženje podataka. + +1. Pozovite `fit_resample()`, ova strategija generira nove uzorke interpolacijom. + + ```python + oversample = SMOTE() + transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df) + ``` + + Uravnoteženjem podataka, postići ćete bolje rezultate pri klasifikaciji. Razmislite o binarnoj klasifikaciji. Ako većina vaših podataka pripada jednoj klasi, ML model će češće predviđati tu klasu, samo zato što za nju ima više podataka. Uravnoteženje podataka uklanja ovu neravnotežu. + +1. Sada možete provjeriti broj oznaka po sastojku: + + ```python + print(f'new label count: {transformed_label_df.value_counts()}') + print(f'old label count: {df.cuisine.value_counts()}') + ``` + + Vaš izlaz izgleda ovako: + + ```output + new label count: korean 799 + chinese 799 + indian 799 + japanese 799 + thai 799 + Name: cuisine, dtype: int64 + old label count: korean 799 + indian 598 + chinese 442 + japanese 320 + thai 289 + Name: cuisine, dtype: int64 + ``` + + Podaci su sada čisti, uravnoteženi i vrlo ukusni! + +1. Posljednji korak je spremanje uravnoteženih podataka, uključujući oznake i značajke, u novi dataframe koji se može izvesti u datoteku: + + ```python + transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer') + ``` + +1. Možete još jednom pogledati podatke koristeći `transformed_df.head()` i `transformed_df.info()`. Spremite kopiju ovih podataka za korištenje u budućim lekcijama: + + ```python + transformed_df.head() + transformed_df.info() + transformed_df.to_csv("../data/cleaned_cuisines.csv") + ``` + + Ovaj svježi CSV sada se nalazi u korijenskoj mapi podataka. + +--- + +## 🚀Izazov + +Ovaj kurikulum sadrži nekoliko zanimljivih skupova podataka. Pregledajte mape `data` i provjerite sadrže li neki skupovi podataka koji bi bili prikladni za binarnu ili višeklasnu klasifikaciju? Koja biste pitanja postavili ovom skupu podataka? + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Istražite SMOTE-ov API. Za koje slučajeve upotrebe je najprikladniji? Koje probleme rješava? + +## Zadatak + +[Istrazite metode klasifikacije](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/1-Introduction/assignment.md b/translations/hr/4-Classification/1-Introduction/assignment.md new file mode 100644 index 00000000..ba728cbb --- /dev/null +++ b/translations/hr/4-Classification/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Istražite metode klasifikacije + +## Upute + +U [Scikit-learn dokumentaciji](https://scikit-learn.org/stable/supervised_learning.html) pronaći ćete veliki popis načina za klasifikaciju podataka. Napravite malu potragu u ovim dokumentima: vaš cilj je pronaći metode klasifikacije i povezati ih s datasetom iz ovog kurikuluma, pitanjem koje možete postaviti o njemu i tehnikom klasifikacije. Kreirajte proračunsku tablicu ili tablicu u .doc datoteci i objasnite kako bi dataset funkcionirao s algoritmom klasifikacije. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| | dokument je predstavljen s pregledom 5 algoritama uz tehniku klasifikacije. Pregled je dobro objašnjen i detaljan. | dokument je predstavljen s pregledom 3 algoritma uz tehniku klasifikacije. Pregled je dobro objašnjen i detaljan. | dokument je predstavljen s pregledom manje od tri algoritma uz tehniku klasifikacije, a pregled nije dobro objašnjen niti detaljan. | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/1-Introduction/solution/Julia/README.md b/translations/hr/4-Classification/1-Introduction/solution/Julia/README.md new file mode 100644 index 00000000..cbb4a7d2 --- /dev/null +++ b/translations/hr/4-Classification/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/2-Classifiers-1/README.md b/translations/hr/4-Classification/2-Classifiers-1/README.md new file mode 100644 index 00000000..e78f1ebc --- /dev/null +++ b/translations/hr/4-Classification/2-Classifiers-1/README.md @@ -0,0 +1,253 @@ + +# Klasifikatori kuhinja 1 + +U ovoj lekciji koristit ćete skup podataka koji ste spremili iz prethodne lekcije, pun uravnoteženih i očišćenih podataka o kuhinjama. + +Koristit ćete ovaj skup podataka s raznim klasifikatorima kako biste _predvidjeli određenu nacionalnu kuhinju na temelju grupe sastojaka_. Dok to radite, naučit ćete više o načinima na koje se algoritmi mogu koristiti za zadatke klasifikacije. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) +# Priprema + +Pod pretpostavkom da ste završili [Lekciju 1](../1-Introduction/README.md), provjerite postoji li datoteka _cleaned_cuisines.csv_ u korijenskoj mapi `/data` za ove četiri lekcije. + +## Vježba - predviđanje nacionalne kuhinje + +1. Radite u mapi _notebook.ipynb_ ove lekcije i uvezite tu datoteku zajedno s Pandas bibliotekom: + + ```python + import pandas as pd + cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") + cuisines_df.head() + ``` + + Podaci izgledaju ovako: + +| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | +| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + + +1. Sada uvezite još nekoliko biblioteka: + + ```python + from sklearn.linear_model import LogisticRegression + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + from sklearn.svm import SVC + import numpy as np + ``` + +1. Podijelite X i y koordinate u dva dataframea za treniranje. `cuisine` može biti dataframe s oznakama: + + ```python + cuisines_label_df = cuisines_df['cuisine'] + cuisines_label_df.head() + ``` + + Izgledat će ovako: + + ```output + 0 indian + 1 indian + 2 indian + 3 indian + 4 indian + Name: cuisine, dtype: object + ``` + +1. Izbacite stupce `Unnamed: 0` i `cuisine` koristeći `drop()`. Ostatak podataka spremite kao značajke za treniranje: + + ```python + cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) + cuisines_feature_df.head() + ``` + + Vaše značajke izgledaju ovako: + +| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | + +Sada ste spremni za treniranje modela! + +## Odabir klasifikatora + +Sada kada su vaši podaci očišćeni i spremni za treniranje, morate odlučiti koji algoritam koristiti za zadatak. + +Scikit-learn grupira klasifikaciju pod Nadzirano učenje, a u toj kategoriji postoji mnogo načina za klasifikaciju. [Raznolikost](https://scikit-learn.org/stable/supervised_learning.html) može na prvi pogled djelovati zbunjujuće. Sljedeće metode uključuju tehnike klasifikacije: + +- Linearni modeli +- Strojevi za potporne vektore (SVM) +- Stohastički gradijentni spust +- Najbliži susjedi +- Gaussovi procesi +- Stabla odluke +- Metode ansambla (glasajući klasifikator) +- Višeklasni i višerezultatski algoritmi (višeklasna i višeznačna klasifikacija, višeklasna-višerezultatska klasifikacija) + +> Također možete koristiti [neuronske mreže za klasifikaciju podataka](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification), ali to je izvan opsega ove lekcije. + +### Koji klasifikator odabrati? + +Dakle, koji klasifikator odabrati? Često je korisno isprobati nekoliko njih i tražiti dobar rezultat. Scikit-learn nudi [usporedbu](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) na stvorenom skupu podataka, uspoređujući KNeighbors, SVC na dva načina, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB i QuadraticDiscriminationAnalysis, prikazujući rezultate vizualno: + +![usporedba klasifikatora](../../../../4-Classification/2-Classifiers-1/images/comparison.png) +> Grafovi generirani u dokumentaciji Scikit-learn-a + +> AutoML rješava ovaj problem jednostavno pokretanjem ovih usporedbi u oblaku, omogućujući vam odabir najboljeg algoritma za vaše podatke. Isprobajte [ovdje](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott) + +### Bolji pristup + +Bolji način od nasumičnog pogađanja je slijediti ideje iz ovog preuzimljivog [ML Cheat Sheeta](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott). Ovdje otkrivamo da za naš višeklasni problem imamo nekoliko izbora: + +![cheatsheet za višeklasne probleme](../../../../4-Classification/2-Classifiers-1/images/cheatsheet.png) +> Dio Microsoftovog Algorithm Cheat Sheeta, koji detaljno opisuje opcije za višeklasnu klasifikaciju + +✅ Preuzmite ovaj cheat sheet, isprintajte ga i objesite na zid! + +### Razmišljanje + +Pokušajmo razmotriti različite pristupe s obzirom na ograničenja koja imamo: + +- **Neuronske mreže su preteške**. S obzirom na naš očišćeni, ali minimalni skup podataka i činjenicu da treniranje provodimo lokalno putem bilježnica, neuronske mreže su preteške za ovaj zadatak. +- **Nema klasifikatora za dvije klase**. Ne koristimo klasifikator za dvije klase, što isključuje one-vs-all. +- **Stablo odluke ili logistička regresija mogli bi raditi**. Stablo odluke moglo bi raditi, kao i logistička regresija za višeklasne podatke. +- **Višeklasna Boosted Decision Trees rješava drugi problem**. Višeklasno pojačano stablo odluke najprikladnije je za neparametarske zadatke, npr. zadatke dizajnirane za izradu rangiranja, pa nam nije korisno. + +### Korištenje Scikit-learn-a + +Koristit ćemo Scikit-learn za analizu naših podataka. Međutim, postoji mnogo načina za korištenje logističke regresije u Scikit-learn-u. Pogledajte [parametre za prosljeđivanje](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +U osnovi, postoje dva važna parametra - `multi_class` i `solver` - koje trebamo specificirati kada tražimo od Scikit-learn-a da izvede logističku regresiju. Vrijednost `multi_class` primjenjuje određeno ponašanje. Vrijednost solvera određuje koji algoritam koristiti. Nisu svi solveri kompatibilni sa svim vrijednostima `multi_class`. + +Prema dokumentaciji, u slučaju višeklasne klasifikacije, algoritam treniranja: + +- **Koristi shemu one-vs-rest (OvR)**, ako je opcija `multi_class` postavljena na `ovr` +- **Koristi gubitak unakrsne entropije**, ako je opcija `multi_class` postavljena na `multinomial`. (Trenutno opciju `multinomial` podržavaju samo solveri ‘lbfgs’, ‘sag’, ‘saga’ i ‘newton-cg’.) + +> 🎓 'Shema' ovdje može biti 'ovr' (one-vs-rest) ili 'multinomial'. Budući da je logistička regresija zapravo dizajnirana za podršku binarnoj klasifikaciji, ove sheme omogućuju joj bolje rukovanje zadacima višeklasne klasifikacije. [izvor](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/) + +> 🎓 'Solver' je definiran kao "algoritam koji se koristi u problemu optimizacije". [izvor](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +Scikit-learn nudi ovu tablicu kako bi objasnio kako solveri rješavaju različite izazove koje predstavljaju različite vrste struktura podataka: + +![solvers](../../../../4-Classification/2-Classifiers-1/images/solvers.png) + +## Vježba - podjela podataka + +Možemo se usredotočiti na logističku regresiju za naš prvi pokušaj treniranja jer ste nedavno naučili o njoj u prethodnoj lekciji. +Podijelite svoje podatke u grupe za treniranje i testiranje pozivom `train_test_split()`: + +```python +X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) +``` + +## Vježba - primjena logističke regresije + +Budući da koristite slučaj višeklasne klasifikacije, trebate odabrati koju _shemu_ koristiti i koji _solver_ postaviti. Koristite LogisticRegression s višeklasnim postavkama i **liblinear** solverom za treniranje. + +1. Kreirajte logističku regresiju s multi_class postavljenim na `ovr` i solverom postavljenim na `liblinear`: + + ```python + lr = LogisticRegression(multi_class='ovr',solver='liblinear') + model = lr.fit(X_train, np.ravel(y_train)) + + accuracy = model.score(X_test, y_test) + print ("Accuracy is {}".format(accuracy)) + ``` + + ✅ Isprobajte drugi solver poput `lbfgs`, koji je često postavljen kao zadani +> Napomena, koristite Pandasovu funkciju [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) za izravnavanje podataka kada je to potrebno. +Točnost je dobra, preko **80%**! + +1. Možete vidjeti ovaj model u akciji testiranjem jednog retka podataka (#50): + + ```python + print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') + print(f'cuisine: {y_test.iloc[50]}') + ``` + + Rezultat se ispisuje: + + ```output + ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') + cuisine: indian + ``` + + ✅ Isprobajte drugi broj retka i provjerite rezultate. + +1. Ako želite dublje istražiti, možete provjeriti točnost ove predikcije: + + ```python + test= X_test.iloc[50].values.reshape(-1, 1).T + proba = model.predict_proba(test) + classes = model.classes_ + resultdf = pd.DataFrame(data=proba, columns=classes) + + topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) + topPrediction.head() + ``` + + Rezultat se ispisuje - Indijska kuhinja je najbolja pretpostavka, s dobrom vjerojatnošću: + + | | 0 | + | -------: | -------: | + | indian | 0.715851 | + | chinese | 0.229475 | + | japanese | 0.029763 | + | korean | 0.017277 | + | thai | 0.007634 | + + ✅ Možete li objasniti zašto je model prilično siguran da se radi o indijskoj kuhinji? + +1. Dobijte više detalja ispisivanjem izvještaja o klasifikaciji, kao što ste radili u lekcijama o regresiji: + + ```python + y_pred = model.predict(X_test) + print(classification_report(y_test,y_pred)) + ``` + + | | preciznost | odziv | f1-rezultat | podrška | + | ------------ | ---------- | ----- | ----------- | ------- | + | chinese | 0.73 | 0.71 | 0.72 | 229 | + | indian | 0.91 | 0.93 | 0.92 | 254 | + | japanese | 0.70 | 0.75 | 0.72 | 220 | + | korean | 0.86 | 0.76 | 0.81 | 242 | + | thai | 0.79 | 0.85 | 0.82 | 254 | + | točnost | 0.80 | 1199 | | | + | prosjek makro| 0.80 | 0.80 | 0.80 | 1199 | + | prosjek tež. | 0.80 | 0.80 | 0.80 | 1199 | + +## 🚀Izazov + +U ovoj lekciji koristili ste očišćene podatke za izradu modela strojnog učenja koji može predvidjeti nacionalnu kuhinju na temelju niza sastojaka. Odvojite malo vremena da proučite mnoge opcije koje Scikit-learn nudi za klasifikaciju podataka. Dublje istražite koncept 'solver' kako biste razumjeli što se događa iza kulisa. + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Dublje istražite matematiku iza logističke regresije u [ovoj lekciji](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf) +## Zadatak + +[Proučite solvere](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/2-Classifiers-1/assignment.md b/translations/hr/4-Classification/2-Classifiers-1/assignment.md new file mode 100644 index 00000000..ca53d12b --- /dev/null +++ b/translations/hr/4-Classification/2-Classifiers-1/assignment.md @@ -0,0 +1,23 @@ + +# Proučite rješavače +## Upute + +U ovoj lekciji ste naučili o raznim rješavačima koji uparuju algoritme s procesom strojnog učenja kako bi stvorili točan model. Pregledajte rješavače navedene u lekciji i odaberite dva. Svojim riječima usporedite i kontrastirajte ta dva rješavača. Koji tip problema rješavaju? Kako rade s različitim strukturama podataka? Zašto biste odabrali jedan umjesto drugog? +## Rubrika + +| Kriterij | Primjerno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------- | +| | Predan je .doc dokument s dva odlomka, svaki o jednom rješavaču, s promišljenom usporedbom. | Predan je .doc dokument s jednim odlomkom | Zadatak nije dovršen | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/2-Classifiers-1/solution/Julia/README.md b/translations/hr/4-Classification/2-Classifiers-1/solution/Julia/README.md new file mode 100644 index 00000000..d953dad2 --- /dev/null +++ b/translations/hr/4-Classification/2-Classifiers-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/3-Classifiers-2/README.md b/translations/hr/4-Classification/3-Classifiers-2/README.md new file mode 100644 index 00000000..39d01bc3 --- /dev/null +++ b/translations/hr/4-Classification/3-Classifiers-2/README.md @@ -0,0 +1,249 @@ + +# Klasifikatori kuhinja 2 + +U ovoj drugoj lekciji o klasifikaciji istražit ćete više načina za klasifikaciju numeričkih podataka. Također ćete naučiti o posljedicama odabira jednog klasifikatora u odnosu na drugi. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +### Preduvjeti + +Pretpostavljamo da ste završili prethodne lekcije i da imate očišćeni skup podataka u svojoj mapi `data` pod nazivom _cleaned_cuisines.csv_ u korijenu ove mape s 4 lekcije. + +### Priprema + +Učitali smo vašu datoteku _notebook.ipynb_ s očišćenim skupom podataka i podijelili je u X i y podatkovne okvire, spremne za proces izgradnje modela. + +## Karta klasifikacije + +Ranije ste naučili o raznim opcijama koje imate pri klasifikaciji podataka koristeći Microsoftov vodič. Scikit-learn nudi sličan, ali detaljniji vodič koji može dodatno pomoći u sužavanju izbora procjenitelja (drugi naziv za klasifikatore): + +![ML Karta iz Scikit-learn](../../../../4-Classification/3-Classifiers-2/images/map.png) +> Savjet: [posjetite ovu kartu online](https://scikit-learn.org/stable/tutorial/machine_learning_map/) i kliknite na putanju kako biste pročitali dokumentaciju. + +### Plan + +Ova karta je vrlo korisna kada imate jasno razumijevanje svojih podataka, jer možete 'hodati' njenim stazama do odluke: + +- Imamo >50 uzoraka +- Želimo predvidjeti kategoriju +- Imamo označene podatke +- Imamo manje od 100K uzoraka +- ✨ Možemo odabrati Linear SVC +- Ako to ne uspije, budući da imamo numeričke podatke + - Možemo pokušati ✨ KNeighbors Classifier + - Ako to ne uspije, pokušajte ✨ SVC i ✨ Ensemble Classifiers + +Ovo je vrlo koristan put za slijediti. + +## Vježba - podijelite podatke + +Slijedeći ovu putanju, trebali bismo započeti uvozom nekih biblioteka koje ćemo koristiti. + +1. Uvezite potrebne biblioteke: + + ```python + from sklearn.neighbors import KNeighborsClassifier + from sklearn.linear_model import LogisticRegression + from sklearn.svm import SVC + from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + import numpy as np + ``` + +1. Podijelite svoje podatke za treniranje i testiranje: + + ```python + X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) + ``` + +## Linear SVC klasifikator + +Support-Vector clustering (SVC) je dio obitelji tehnika strojnog učenja Support-Vector machines (SVM) (saznajte više o njima dolje). U ovoj metodi možete odabrati 'kernel' kako biste odlučili kako grupirati oznake. Parametar 'C' odnosi se na 'regularizaciju' koja regulira utjecaj parametara. Kernel može biti jedan od [nekoliko](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); ovdje ga postavljamo na 'linear' kako bismo osigurali korištenje linearne SVC. Vjerojatnost je prema zadanim postavkama 'false'; ovdje je postavljamo na 'true' kako bismo dobili procjene vjerojatnosti. Postavljamo random state na '0' kako bismo promiješali podatke za dobivanje vjerojatnosti. + +### Vježba - primijenite linearni SVC + +Započnite stvaranjem niza klasifikatora. Postupno ćete dodavati ovom nizu dok testiramo. + +1. Započnite s Linear SVC: + + ```python + C = 10 + # Create different classifiers. + classifiers = { + 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0) + } + ``` + +2. Trenirajte svoj model koristeći Linear SVC i ispišite izvještaj: + + ```python + n_classifiers = len(classifiers) + + for index, (name, classifier) in enumerate(classifiers.items()): + classifier.fit(X_train, np.ravel(y_train)) + + y_pred = classifier.predict(X_test) + accuracy = accuracy_score(y_test, y_pred) + print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100)) + print(classification_report(y_test,y_pred)) + ``` + + Rezultat je prilično dobar: + + ```output + Accuracy (train) for Linear SVC: 78.6% + precision recall f1-score support + + chinese 0.71 0.67 0.69 242 + indian 0.88 0.86 0.87 234 + japanese 0.79 0.74 0.76 254 + korean 0.85 0.81 0.83 242 + thai 0.71 0.86 0.78 227 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +## K-Neighbors klasifikator + +K-Neighbors je dio obitelji metoda strojnog učenja "neighbors", koje se mogu koristiti za nadzirano i nenadzirano učenje. U ovoj metodi unaprijed definirani broj točaka se stvara, a podaci se prikupljaju oko tih točaka kako bi se predvidjele generalizirane oznake za podatke. + +### Vježba - primijenite K-Neighbors klasifikator + +Prethodni klasifikator je bio dobar i dobro je radio s podacima, ali možda možemo postići bolju točnost. Pokušajte s K-Neighbors klasifikatorom. + +1. Dodajte liniju svom nizu klasifikatora (dodajte zarez nakon stavke Linear SVC): + + ```python + 'KNN classifier': KNeighborsClassifier(C), + ``` + + Rezultat je malo lošiji: + + ```output + Accuracy (train) for KNN classifier: 73.8% + precision recall f1-score support + + chinese 0.64 0.67 0.66 242 + indian 0.86 0.78 0.82 234 + japanese 0.66 0.83 0.74 254 + korean 0.94 0.58 0.72 242 + thai 0.71 0.82 0.76 227 + + accuracy 0.74 1199 + macro avg 0.76 0.74 0.74 1199 + weighted avg 0.76 0.74 0.74 1199 + ``` + + ✅ Saznajte više o [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) + +## Support Vector Classifier + +Support-Vector klasifikatori su dio obitelji metoda strojnog učenja [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) koje se koriste za zadatke klasifikacije i regresije. SVM "mapira primjere za treniranje na točke u prostoru" kako bi maksimizirao udaljenost između dvije kategorije. Naknadni podaci se mapiraju u ovaj prostor kako bi se predvidjela njihova kategorija. + +### Vježba - primijenite Support Vector Classifier + +Pokušajmo postići malo bolju točnost s Support Vector Classifier. + +1. Dodajte zarez nakon stavke K-Neighbors, a zatim dodajte ovu liniju: + + ```python + 'SVC': SVC(), + ``` + + Rezultat je vrlo dobar! + + ```output + Accuracy (train) for SVC: 83.2% + precision recall f1-score support + + chinese 0.79 0.74 0.76 242 + indian 0.88 0.90 0.89 234 + japanese 0.87 0.81 0.84 254 + korean 0.91 0.82 0.86 242 + thai 0.74 0.90 0.81 227 + + accuracy 0.83 1199 + macro avg 0.84 0.83 0.83 1199 + weighted avg 0.84 0.83 0.83 1199 + ``` + + ✅ Saznajte više o [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm) + +## Ensemble Classifiers + +Slijedimo put do samog kraja, iako je prethodni test bio vrlo dobar. Pokušajmo s 'Ensemble Classifiers', konkretno Random Forest i AdaBoost: + +```python + 'RFST': RandomForestClassifier(n_estimators=100), + 'ADA': AdaBoostClassifier(n_estimators=100) +``` + +Rezultat je vrlo dobar, posebno za Random Forest: + +```output +Accuracy (train) for RFST: 84.5% + precision recall f1-score support + + chinese 0.80 0.77 0.78 242 + indian 0.89 0.92 0.90 234 + japanese 0.86 0.84 0.85 254 + korean 0.88 0.83 0.85 242 + thai 0.80 0.87 0.83 227 + + accuracy 0.84 1199 + macro avg 0.85 0.85 0.84 1199 +weighted avg 0.85 0.84 0.84 1199 + +Accuracy (train) for ADA: 72.4% + precision recall f1-score support + + chinese 0.64 0.49 0.56 242 + indian 0.91 0.83 0.87 234 + japanese 0.68 0.69 0.69 254 + korean 0.73 0.79 0.76 242 + thai 0.67 0.83 0.74 227 + + accuracy 0.72 1199 + macro avg 0.73 0.73 0.72 1199 +weighted avg 0.73 0.72 0.72 1199 +``` + +✅ Saznajte više o [Ensemble Classifiers](https://scikit-learn.org/stable/modules/ensemble.html) + +Ova metoda strojnog učenja "kombinira predviđanja nekoliko osnovnih procjenitelja" kako bi poboljšala kvalitetu modela. U našem primjeru koristili smo Random Trees i AdaBoost. + +- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), metoda prosjeka, gradi 'šumu' 'odlučujućih stabala' s dodanom slučajnošću kako bi se izbjeglo prekomjerno prilagođavanje. Parametar n_estimators postavljen je na broj stabala. + +- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) prilagođava klasifikator skupu podataka, a zatim prilagođava kopije tog klasifikatora istom skupu podataka. Fokusira se na težine pogrešno klasificiranih stavki i prilagođava fit za sljedeći klasifikator kako bi ih ispravio. + +--- + +## 🚀Izazov + +Svaka od ovih tehnika ima veliki broj parametara koje možete prilagoditi. Istražite zadane parametre svake od njih i razmislite što bi prilagodba tih parametara značila za kvalitetu modela. + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +U ovim lekcijama ima puno stručnih izraza, pa odvojite trenutak da pregledate [ovaj popis](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) korisne terminologije! + +## Zadatak + +[Parametarska igra](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/3-Classifiers-2/assignment.md b/translations/hr/4-Classification/3-Classifiers-2/assignment.md new file mode 100644 index 00000000..74d8d165 --- /dev/null +++ b/translations/hr/4-Classification/3-Classifiers-2/assignment.md @@ -0,0 +1,25 @@ + +# Parametri u igri + +## Upute + +Postoji mnogo parametara koji su zadani prilikom rada s ovim klasifikatorima. Intellisense u VS Code-u može vam pomoći da ih istražite. Usvojite jednu od tehnika strojnog učenja za klasifikaciju iz ove lekcije i ponovno obučite modele mijenjajući različite vrijednosti parametara. Izradite bilježnicu u kojoj ćete objasniti zašto neke promjene poboljšavaju kvalitetu modela, dok druge pogoršavaju. Budite detaljni u svom odgovoru. + +## Rubrika + +| Kriterij | Primjeran | Zadovoljavajući | Potrebno poboljšanje | +| -------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ----------------------------- | +| | Predstavljena je bilježnica s potpuno izgrađenim klasifikatorom, podešenim parametrima i objašnjenim promjenama u tekstualnim okvirima | Bilježnica je djelomično predstavljena ili loše objašnjena | Bilježnica je puna grešaka ili manjkava | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za nesporazume ili pogrešne interpretacije koje mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/3-Classifiers-2/solution/Julia/README.md b/translations/hr/4-Classification/3-Classifiers-2/solution/Julia/README.md new file mode 100644 index 00000000..0aa99dd9 --- /dev/null +++ b/translations/hr/4-Classification/3-Classifiers-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/4-Applied/README.md b/translations/hr/4-Classification/4-Applied/README.md new file mode 100644 index 00000000..f3fc63ab --- /dev/null +++ b/translations/hr/4-Classification/4-Applied/README.md @@ -0,0 +1,329 @@ + +# Izgradnja web aplikacije za preporuku kuhinja + +U ovoj lekciji izgradit ćete model klasifikacije koristeći neke od tehnika koje ste naučili u prethodnim lekcijama, uz ukusni dataset kuhinja koji se koristi kroz cijeli ovaj serijal. Osim toga, izradit ćete malu web aplikaciju za korištenje spremljenog modela, koristeći Onnx web runtime. + +Jedna od najkorisnijih praktičnih primjena strojnog učenja je izrada sustava za preporuke, a danas možete napraviti prvi korak u tom smjeru! + +[![Predstavljanje ove web aplikacije](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Primijenjeno ML") + +> 🎥 Kliknite na sliku iznad za video: Jen Looper izrađuje web aplikaciju koristeći klasificirane podatke o kuhinjama + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +U ovoj lekciji naučit ćete: + +- Kako izraditi model i spremiti ga kao Onnx model +- Kako koristiti Netron za pregled modela +- Kako koristiti svoj model u web aplikaciji za inferenciju + +## Izradite svoj model + +Izrada primijenjenih ML sustava važan je dio korištenja ovih tehnologija za poslovne sustave. Možete koristiti modele unutar svojih web aplikacija (i tako ih koristiti u offline kontekstu ako je potrebno) koristeći Onnx. + +U [prethodnoj lekciji](../../3-Web-App/1-Web-App/README.md) izradili ste regresijski model o viđenjima NLO-a, "pickle-ali" ga i koristili u Flask aplikaciji. Iako je ova arhitektura vrlo korisna za znati, radi se o full-stack Python aplikaciji, a vaši zahtjevi mogu uključivati korištenje JavaScript aplikacije. + +U ovoj lekciji možete izraditi osnovni sustav temeljen na JavaScriptu za inferenciju. No, prvo morate trenirati model i konvertirati ga za korištenje s Onnx-om. + +## Vježba - treniranje modela klasifikacije + +Prvo, trenirajte model klasifikacije koristeći očišćeni dataset kuhinja koji smo koristili. + +1. Započnite uvozom korisnih biblioteka: + + ```python + !pip install skl2onnx + import pandas as pd + ``` + + Trebat će vam '[skl2onnx](https://onnx.ai/sklearn-onnx/)' za pomoć pri konverziji vašeg Scikit-learn modela u Onnx format. + +1. Zatim radite s podacima na isti način kao u prethodnim lekcijama, čitajući CSV datoteku koristeći `read_csv()`: + + ```python + data = pd.read_csv('../data/cleaned_cuisines.csv') + data.head() + ``` + +1. Uklonite prva dva nepotrebna stupca i spremite preostale podatke kao 'X': + + ```python + X = data.iloc[:,2:] + X.head() + ``` + +1. Spremite oznake kao 'y': + + ```python + y = data[['cuisine']] + y.head() + + ``` + +### Započnite rutinu treniranja + +Koristit ćemo biblioteku 'SVC' koja ima dobru točnost. + +1. Uvezite odgovarajuće biblioteke iz Scikit-learn: + + ```python + from sklearn.model_selection import train_test_split + from sklearn.svm import SVC + from sklearn.model_selection import cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report + ``` + +1. Odvojite skupove za treniranje i testiranje: + + ```python + X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3) + ``` + +1. Izradite SVC model klasifikacije kao što ste to učinili u prethodnoj lekciji: + + ```python + model = SVC(kernel='linear', C=10, probability=True,random_state=0) + model.fit(X_train,y_train.values.ravel()) + ``` + +1. Sada testirajte svoj model pozivajući `predict()`: + + ```python + y_pred = model.predict(X_test) + ``` + +1. Ispišite izvještaj o klasifikaciji kako biste provjerili kvalitetu modela: + + ```python + print(classification_report(y_test,y_pred)) + ``` + + Kao što smo vidjeli prije, točnost je dobra: + + ```output + precision recall f1-score support + + chinese 0.72 0.69 0.70 257 + indian 0.91 0.87 0.89 243 + japanese 0.79 0.77 0.78 239 + korean 0.83 0.79 0.81 236 + thai 0.72 0.84 0.78 224 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +### Konvertirajte svoj model u Onnx + +Pobrinite se da konverziju obavite s odgovarajućim brojem tenzora. Ovaj dataset ima 380 navedenih sastojaka, pa morate zabilježiti taj broj u `FloatTensorType`: + +1. Konvertirajte koristeći broj tenzora 380. + + ```python + from skl2onnx import convert_sklearn + from skl2onnx.common.data_types import FloatTensorType + + initial_type = [('float_input', FloatTensorType([None, 380]))] + options = {id(model): {'nocl': True, 'zipmap': False}} + ``` + +1. Kreirajte onx i spremite kao datoteku **model.onnx**: + + ```python + onx = convert_sklearn(model, initial_types=initial_type, options=options) + with open("./model.onnx", "wb") as f: + f.write(onx.SerializeToString()) + ``` + + > Napomena: možete proslijediti [opcije](https://onnx.ai/sklearn-onnx/parameterized.html) u svom skriptu za konverziju. U ovom slučaju, postavili smo 'nocl' na True i 'zipmap' na False. Budući da je ovo model klasifikacije, imate opciju ukloniti ZipMap koji proizvodi popis rječnika (nije potrebno). `nocl` se odnosi na uključivanje informacija o klasama u model. Smanjite veličinu svog modela postavljanjem `nocl` na 'True'. + +Pokretanjem cijele bilježnice sada ćete izraditi Onnx model i spremiti ga u ovu mapu. + +## Pregledajte svoj model + +Onnx modeli nisu baš vidljivi u Visual Studio Code-u, ali postoji vrlo dobar besplatan softver koji mnogi istraživači koriste za vizualizaciju modela kako bi se osigurali da je pravilno izrađen. Preuzmite [Netron](https://github.com/lutzroeder/Netron) i otvorite svoju model.onnx datoteku. Možete vidjeti svoj jednostavni model vizualiziran, s njegovih 380 ulaza i klasifikatorom: + +![Netron vizualizacija](../../../../4-Classification/4-Applied/images/netron.png) + +Netron je koristan alat za pregled vaših modela. + +Sada ste spremni koristiti ovaj zgodni model u web aplikaciji. Izradimo aplikaciju koja će biti korisna kada pogledate u svoj hladnjak i pokušate odrediti koju kombinaciju svojih preostalih sastojaka možete koristiti za pripremu određene kuhinje, prema vašem modelu. + +## Izradite web aplikaciju za preporuke + +Možete koristiti svoj model izravno u web aplikaciji. Ova arhitektura također omogućuje lokalno pokretanje, pa čak i offline ako je potrebno. Započnite stvaranjem datoteke `index.html` u istoj mapi gdje ste spremili svoju datoteku `model.onnx`. + +1. U ovoj datoteci _index.html_, dodajte sljedeći markup: + + ```html + + +
+ Cuisine Matcher +
+ + ... + + + ``` + +1. Sada, radeći unutar oznaka `body`, dodajte malo markupa za prikaz popisa checkboxova koji odražavaju neke sastojke: + + ```html +

Check your refrigerator. What can you create?

+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ +
+ ``` + + Primijetite da je svakom checkboxu dodijeljena vrijednost. To odražava indeks gdje se sastojak nalazi prema datasetu. Jabuka, na primjer, u ovom abecednom popisu zauzima peti stupac, pa je njezina vrijednost '4' jer počinjemo brojati od 0. Možete konzultirati [tablicu sastojaka](../../../../4-Classification/data/ingredient_indexes.csv) kako biste otkrili indeks određenog sastojka. + + Nastavljajući rad u datoteci index.html, dodajte blok skripte gdje se model poziva nakon završnog zatvaranja ``. + +1. Prvo, uvezite [Onnx Runtime](https://www.onnxruntime.ai/): + + ```html + + ``` + + > Onnx Runtime se koristi za omogućavanje pokretanja vaših Onnx modela na širokom rasponu hardverskih platformi, uključujući optimizacije i API za korištenje. + +1. Kada je Runtime na mjestu, možete ga pozvati: + + ```html + + ``` + +U ovom kodu događa se nekoliko stvari: + +1. Kreirali ste niz od 380 mogućih vrijednosti (1 ili 0) koje se postavljaju i šalju modelu za inferenciju, ovisno o tome je li checkbox označen. +2. Kreirali ste niz checkboxova i način za određivanje jesu li označeni u funkciji `init` koja se poziva kada aplikacija započne. Kada je checkbox označen, niz `ingredients` se mijenja kako bi odražavao odabrani sastojak. +3. Kreirali ste funkciju `testCheckboxes` koja provjerava je li neki checkbox označen. +4. Koristite funkciju `startInference` kada se pritisne gumb i, ako je neki checkbox označen, započinjete inferenciju. +5. Rutina inferencije uključuje: + 1. Postavljanje asinkronog učitavanja modela + 2. Kreiranje Tensor strukture za slanje modelu + 3. Kreiranje 'feeds' koji odražava `float_input` ulaz koji ste kreirali prilikom treniranja modela (možete koristiti Netron za provjeru tog naziva) + 4. Slanje ovih 'feeds' modelu i čekanje odgovora + +## Testirajte svoju aplikaciju + +Otvorite terminal sesiju u Visual Studio Code-u u mapi gdje se nalazi vaša datoteka index.html. Osigurajte da imate [http-server](https://www.npmjs.com/package/http-server) instaliran globalno i upišite `http-server` na promptu. Trebao bi se otvoriti localhost i možete pregledati svoju web aplikaciju. Provjerite koja kuhinja se preporučuje na temelju različitih sastojaka: + +![web aplikacija sa sastojcima](../../../../4-Classification/4-Applied/images/web-app.png) + +Čestitamo, izradili ste web aplikaciju za 'preporuke' s nekoliko polja. Odvojite malo vremena za proširenje ovog sustava! + +## 🚀Izazov + +Vaša web aplikacija je vrlo minimalna, pa je nastavite proširivati koristeći sastojke i njihove indekse iz podataka [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv). Koje kombinacije okusa funkcioniraju za stvaranje određenog nacionalnog jela? + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Iako je ova lekcija samo dotaknula korisnost stvaranja sustava za preporuke za sastojke hrane, ovo područje primjena strojnog učenja vrlo je bogato primjerima. Pročitajte više o tome kako se ovi sustavi izrađuju: + +- https://www.sciencedirect.com/topics/computer-science/recommendation-engine +- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/ +- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/ + +## Zadatak + +[Izradite novi sustav za preporuke](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prijevod [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/4-Applied/assignment.md b/translations/hr/4-Classification/4-Applied/assignment.md new file mode 100644 index 00000000..4af5c1a7 --- /dev/null +++ b/translations/hr/4-Classification/4-Applied/assignment.md @@ -0,0 +1,25 @@ + +# Izgradite preporučitelj + +## Upute + +Na temelju vaših vježbi u ovoj lekciji, sada znate kako izraditi web aplikaciju temeljenu na JavaScriptu koristeći Onnx Runtime i konvertirani Onnx model. Eksperimentirajte s izradom novog preporučitelja koristeći podatke iz ovih lekcija ili iz drugih izvora (molimo da navedete izvor). Možete, primjerice, izraditi preporučitelj za kućne ljubimce na temelju različitih osobnih karakteristika ili preporučitelj glazbenih žanrova na temelju raspoloženja osobe. Budite kreativni! + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | --------------------------------------------------------------------- | ------------------------------------- | --------------------------------- | +| | Predstavljena je web aplikacija i bilježnica, obje dobro dokumentirane i funkcionalne | Jedna od njih nedostaje ili ima nedostatke | Obje nedostaju ili imaju nedostatke | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/4-Classification/README.md b/translations/hr/4-Classification/README.md new file mode 100644 index 00000000..65c38c58 --- /dev/null +++ b/translations/hr/4-Classification/README.md @@ -0,0 +1,41 @@ + +# Početak rada s klasifikacijom + +## Regionalna tema: Ukusna azijska i indijska kuhinja 🍜 + +U Aziji i Indiji, tradicije hrane su izuzetno raznolike i vrlo ukusne! Pogledajmo podatke o regionalnim kuhinjama kako bismo bolje razumjeli njihove sastojke. + +![Prodavač tajlandske hrane](../../../4-Classification/images/thai-food.jpg) +> Fotografija autora Lisheng Chang na Unsplash + +## Što ćete naučiti + +U ovom dijelu, nadogradit ćete svoje prethodno znanje o regresiji i naučiti o drugim klasifikatorima koje možete koristiti za bolje razumijevanje podataka. + +> Postoje korisni alati s malo koda koji vam mogu pomoći u učenju rada s modelima klasifikacije. Isprobajte [Azure ML za ovaj zadatak](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Lekcije + +1. [Uvod u klasifikaciju](1-Introduction/README.md) +2. [Više klasifikatora](2-Classifiers-1/README.md) +3. [Još drugih klasifikatora](3-Classifiers-2/README.md) +4. [Primijenjeni ML: izrada web aplikacije](4-Applied/README.md) + +## Zasluge + +"Početak rada s klasifikacijom" napisali su s ♥️ [Cassie Breviu](https://www.twitter.com/cassiebreviu) i [Jen Looper](https://www.twitter.com/jenlooper) + +Skup podataka o ukusnim kuhinjama preuzet je s [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines). + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prijevod [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/5-Clustering/1-Visualize/README.md b/translations/hr/5-Clustering/1-Visualize/README.md new file mode 100644 index 00000000..bc8cf7aa --- /dev/null +++ b/translations/hr/5-Clustering/1-Visualize/README.md @@ -0,0 +1,347 @@ + +# Uvod u klasteriranje + +Klasteriranje je vrsta [Nenadziranog učenja](https://wikipedia.org/wiki/Unsupervised_learning) koja pretpostavlja da je skup podataka neoznačen ili da njegovi ulazi nisu povezani s unaprijed definiranim izlazima. Koristi razne algoritme za analizu neoznačenih podataka i pruža grupiranja prema obrascima koje prepoznaje u podacima. + +[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare") + +> 🎥 Kliknite na sliku iznad za video. Dok proučavate strojno učenje s klasteriranjem, uživajte u nigerijskim Dance Hall pjesmama - ovo je visoko ocijenjena pjesma iz 2014. od PSquare. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +### Uvod + +[Klasteriranje](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) je vrlo korisno za istraživanje podataka. Pogledajmo može li pomoći u otkrivanju trendova i obrazaca u načinu na koji nigerijska publika konzumira glazbu. + +✅ Odvojite trenutak da razmislite o primjenama klasteriranja. U stvarnom životu, klasteriranje se događa kad imate hrpu rublja i trebate razvrstati odjeću članova obitelji 🧦👕👖🩲. U podatkovnoj znanosti, klasteriranje se događa kada pokušavate analizirati korisničke preferencije ili odrediti karakteristike bilo kojeg neoznačenog skupa podataka. Klasteriranje, na neki način, pomaže u stvaranju reda iz kaosa, poput ladice za čarape. + +[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering") + +> 🎥 Kliknite na sliku iznad za video: John Guttag s MIT-a uvodi klasteriranje + +U profesionalnom okruženju, klasteriranje se može koristiti za određivanje stvari poput segmentacije tržišta, utvrđivanja koje dobne skupine kupuju koje proizvode, na primjer. Druga primjena bila bi otkrivanje anomalija, možda za otkrivanje prijevara iz skupa podataka o transakcijama kreditnim karticama. Ili biste mogli koristiti klasteriranje za određivanje tumora u seriji medicinskih skenova. + +✅ Razmislite na trenutak o tome kako ste možda naišli na klasteriranje 'u divljini', u bankarstvu, e-trgovini ili poslovnom okruženju. + +> 🎓 Zanimljivo je da analiza klastera potječe iz područja antropologije i psihologije 1930-ih. Možete li zamisliti kako se mogla koristiti? + +Alternativno, mogli biste ga koristiti za grupiranje rezultata pretraživanja - prema poveznicama za kupovinu, slikama ili recenzijama, na primjer. Klasteriranje je korisno kada imate veliki skup podataka koji želite smanjiti i na kojem želite provesti detaljniju analizu, pa se tehnika može koristiti za upoznavanje podataka prije nego što se izgrade drugi modeli. + +✅ Kada su vaši podaci organizirani u klastere, dodjeljujete im ID klastera, a ova tehnika može biti korisna pri očuvanju privatnosti skupa podataka; umjesto toga možete se referirati na podatkovnu točku prema njenom ID-u klastera, umjesto prema otkrivanju identifikacijskih podataka. Možete li smisliti druge razloge zašto biste koristili ID klastera umjesto drugih elemenata klastera za identifikaciju? + +Produbite svoje razumijevanje tehnika klasteriranja u ovom [modulu za učenje](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) + +## Početak rada s klasteriranjem + +[Scikit-learn nudi širok raspon](https://scikit-learn.org/stable/modules/clustering.html) metoda za izvođenje klasteriranja. Vrsta koju odaberete ovisit će o vašem slučaju upotrebe. Prema dokumentaciji, svaka metoda ima različite prednosti. Evo pojednostavljene tablice metoda koje podržava Scikit-learn i njihovih odgovarajućih slučajeva upotrebe: + +| Naziv metode | Slučaj upotrebe | +| :--------------------------- | :------------------------------------------------------------------ | +| K-Means | opća namjena, induktivno | +| Affinity propagation | mnogi, nejednaki klasteri, induktivno | +| Mean-shift | mnogi, nejednaki klasteri, induktivno | +| Spectral clustering | malo, jednaki klasteri, transduktivno | +| Ward hierarchical clustering | mnogi, ograničeni klasteri, transduktivno | +| Agglomerative clustering | mnogi, ograničeni, ne-Euklidske udaljenosti, transduktivno | +| DBSCAN | ne-ravna geometrija, nejednaki klasteri, transduktivno | +| OPTICS | ne-ravna geometrija, nejednaki klasteri s promjenjivom gustoćom, transduktivno | +| Gaussian mixtures | ravna geometrija, induktivno | +| BIRCH | veliki skup podataka s iznimkama, induktivno | + +> 🎓 Kako stvaramo klastere ima puno veze s načinom na koji grupiramo podatkovne točke u skupine. Razjasnimo neke pojmove: +> +> 🎓 ['Transduktivno' vs. 'induktivno'](https://wikipedia.org/wiki/Transduction_(machine_learning)) +> +> Transduktivno zaključivanje proizlazi iz promatranih slučajeva treninga koji se mapiraju na specifične testne slučajeve. Induktivno zaključivanje proizlazi iz slučajeva treninga koji se mapiraju na opća pravila koja se tek tada primjenjuju na testne slučajeve. +> +> Primjer: Zamislite da imate skup podataka koji je samo djelomično označen. Neke stvari su 'ploče', neke 'CD-i', a neke su prazne. Vaš zadatak je dodijeliti oznake praznima. Ako odaberete induktivni pristup, trenirali biste model tražeći 'ploče' i 'CD-e' i primijenili te oznake na neoznačene podatke. Ovaj pristup će imati problema s klasifikacijom stvari koje su zapravo 'kasete'. Transduktivni pristup, s druge strane, učinkovitije se nosi s ovim nepoznatim podacima jer radi na grupiranju sličnih stavki zajedno i zatim primjenjuje oznaku na grupu. U ovom slučaju, klasteri bi mogli odražavati 'okrugle glazbene stvari' i 'kvadratne glazbene stvari'. +> +> 🎓 ['Ne-ravna' vs. 'ravna' geometrija](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) +> +> Izvedeno iz matematičke terminologije, ne-ravna vs. ravna geometrija odnosi se na mjerenje udaljenosti između točaka bilo 'ravnim' ([Euklidskim](https://wikipedia.org/wiki/Euclidean_geometry)) ili 'ne-ravnim' (ne-Euklidskim) geometrijskim metodama. +> +>'Ravna' u ovom kontekstu odnosi se na Euklidsku geometriju (dijelovi koje se uče kao 'ravninska' geometrija), a ne-ravna se odnosi na ne-Euklidsku geometriju. Što geometrija ima veze sa strojnim učenjem? Pa, kao dva područja koja su ukorijenjena u matematici, mora postojati zajednički način mjerenja udaljenosti između točaka u klasterima, a to se može učiniti na 'ravni' ili 'ne-ravni' način, ovisno o prirodi podataka. [Euklidske udaljenosti](https://wikipedia.org/wiki/Euclidean_distance) mjere se kao duljina segmenta linije između dvije točke. [Ne-Euklidske udaljenosti](https://wikipedia.org/wiki/Non-Euclidean_geometry) mjere se duž krivulje. Ako se vaši podaci, vizualizirani, čine da ne postoje na ravnini, možda ćete trebati koristiti specijalizirani algoritam za njihovu obradu. +> +![Infografika ravne vs. ne-ravne geometrije](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png) +> Infografika od [Dasani Madipalli](https://twitter.com/dasani_decoded) +> +> 🎓 ['Udaljenosti'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) +> +> Klasteri su definirani njihovom matricom udaljenosti, npr. udaljenostima između točaka. Ova udaljenost može se mjeriti na nekoliko načina. Euklidski klasteri definirani su prosjekom vrijednosti točaka i sadrže 'centroid' ili središnju točku. Udaljenosti se stoga mjere udaljenosti do tog centroida. Ne-Euklidske udaljenosti odnose se na 'clustroid', točku najbližu drugim točkama. Clustroidi se pak mogu definirati na različite načine. +> +> 🎓 ['Ograničeno'](https://wikipedia.org/wiki/Constrained_clustering) +> +> [Ograničeno klasteriranje](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) uvodi 'polu-nadzirano' učenje u ovu nenadziranu metodu. Odnosi između točaka označeni su kao 'ne može se povezati' ili 'mora se povezati' pa se neka pravila nameću skupu podataka. +> +>Primjer: Ako se algoritam pusti na skup neoznačenih ili polu-označenih podataka, klasteri koje proizvede mogu biti loše kvalitete. U gore navedenom primjeru, klasteri bi mogli grupirati 'okrugle glazbene stvari' i 'kvadratne glazbene stvari' i 'trokutaste stvari' i 'kolačiće'. Ako se daju neka ograničenja ili pravila koja treba slijediti ("stavka mora biti izrađena od plastike", "stavka mora moći proizvoditi glazbu") to može pomoći 'ograničiti' algoritam da donosi bolje odluke. +> +> 🎓 'Gustoća' +> +> Podaci koji su 'bučni' smatraju se 'gustima'. Udaljenosti između točaka u svakom od njegovih klastera mogu se pokazati, pri ispitivanju, više ili manje gustima, ili 'zbijenima', pa se ti podaci moraju analizirati odgovarajućom metodom klasteriranja. [Ovaj članak](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) pokazuje razliku između korištenja K-Means klasteriranja i HDBSCAN algoritama za istraživanje bučnog skupa podataka s nejednakom gustoćom klastera. + +## Algoritmi klasteriranja + +Postoji preko 100 algoritama klasteriranja, a njihova upotreba ovisi o prirodi podataka. Razgovarajmo o nekima od glavnih: + +- **Hijerarhijsko klasteriranje**. Ako se objekt klasificira prema njegovoj blizini obližnjem objektu, a ne onom udaljenijem, klasteri se formiraju na temelju udaljenosti članova od i prema drugim objektima. Scikit-learn-ovo aglomerativno klasteriranje je hijerarhijsko. + + ![Infografika hijerarhijskog klasteriranja](../../../../5-Clustering/1-Visualize/images/hierarchical.png) + > Infografika od [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Centroid klasteriranje**. Ovaj popularni algoritam zahtijeva odabir 'k', ili broja klastera koje treba formirati, nakon čega algoritam određuje središnju točku klastera i okuplja podatke oko te točke. [K-means klasteriranje](https://wikipedia.org/wiki/K-means_clustering) je popularna verzija centroid klasteriranja. Središte se određuje prema najbližem prosjeku, otuda i naziv. Kvadratna udaljenost od klastera se minimizira. + + ![Infografika centroid klasteriranja](../../../../5-Clustering/1-Visualize/images/centroid.png) + > Infografika od [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Klasteriranje temeljeno na distribuciji**. Temeljeno na statističkom modeliranju, klasteriranje temeljeno na distribuciji usredotočuje se na određivanje vjerojatnosti da podatkovna točka pripada klasteru i dodjeljuje je u skladu s tim. Metode Gaussian mješavina pripadaju ovom tipu. + +- **Klasteriranje temeljeno na gustoći**. Podatkovne točke dodjeljuju se klasterima na temelju njihove gustoće, odnosno njihovog grupiranja jedne oko drugih. Podatkovne točke udaljene od grupe smatraju se iznimkama ili šumom. DBSCAN, Mean-shift i OPTICS pripadaju ovom tipu klasteriranja. + +- **Klasteriranje temeljeno na mreži**. Za višedimenzionalne skupove podataka, stvara se mreža i podaci se dijele među ćelijama mreže, čime se stvaraju klasteri. + +## Vježba - klasterirajte svoje podatke + +Klasteriranje kao tehnika uvelike se olakšava pravilnom vizualizacijom, pa krenimo s vizualizacijom naših glazbenih podataka. Ova vježba pomoći će nam odlučiti koju od metoda klasteriranja najefikasnije koristiti za prirodu ovih podataka. + +1. Otvorite datoteku [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) u ovoj mapi. + +1. Uvezite paket `Seaborn` za dobru vizualizaciju podataka. + + ```python + !pip install seaborn + ``` + +1. Dodajte podatke o pjesmama iz [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv). Učitajte dataframe s nekim podacima o pjesmama. Pripremite se za istraživanje ovih podataka uvozom biblioteka i ispisivanjem podataka: + + ```python + import matplotlib.pyplot as plt + import pandas as pd + + df = pd.read_csv("../data/nigerian-songs.csv") + df.head() + ``` + + Provjerite prvih nekoliko redaka podataka: + + | | naziv | album | izvođač | glavni žanr izvođača | datum izlaska | duljina | popularnost | plesnost | akustičnost | energija | instrumentalnost | živost | glasnoća | govornost | tempo | vremenski potpis | + | --- | ------------------------ | ---------------------------- | ------------------- | -------------------- | ------------- | ------- | ----------- | ------------ | ----------- | -------- | ---------------- | -------- | -------- | ----------- | ------- | ---------------- | + | 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternativni r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 | + | 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 | +| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 | +| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 | +| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 | + +1. Dobijte informacije o dataframeu pozivajući `info()`: + + ```python + df.info() + ``` + + Izlaz izgleda ovako: + + ```output + + RangeIndex: 530 entries, 0 to 529 + Data columns (total 16 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 name 530 non-null object + 1 album 530 non-null object + 2 artist 530 non-null object + 3 artist_top_genre 530 non-null object + 4 release_date 530 non-null int64 + 5 length 530 non-null int64 + 6 popularity 530 non-null int64 + 7 danceability 530 non-null float64 + 8 acousticness 530 non-null float64 + 9 energy 530 non-null float64 + 10 instrumentalness 530 non-null float64 + 11 liveness 530 non-null float64 + 12 loudness 530 non-null float64 + 13 speechiness 530 non-null float64 + 14 tempo 530 non-null float64 + 15 time_signature 530 non-null int64 + dtypes: float64(8), int64(4), object(4) + memory usage: 66.4+ KB + ``` + +1. Provjerite ima li null vrijednosti pozivajući `isnull()` i provjerite da je zbroj 0: + + ```python + df.isnull().sum() + ``` + + Izgleda dobro: + + ```output + name 0 + album 0 + artist 0 + artist_top_genre 0 + release_date 0 + length 0 + popularity 0 + danceability 0 + acousticness 0 + energy 0 + instrumentalness 0 + liveness 0 + loudness 0 + speechiness 0 + tempo 0 + time_signature 0 + dtype: int64 + ``` + +1. Opis podataka: + + ```python + df.describe() + ``` + + | | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | + | ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- | + | count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | + | mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 | + | std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 | + | min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 | + | 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 | + | 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 | + | 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 | + | max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 | + +> 🤔 Ako radimo s klasteriranjem, nesuperviziranom metodom koja ne zahtijeva označene podatke, zašto prikazujemo ove podatke s oznakama? Tijekom faze istraživanja podataka, oznake su korisne, ali nisu nužne za rad algoritama klasteriranja. Mogli biste jednostavno ukloniti zaglavlja stupaca i referirati se na podatke prema broju stupca. + +Pogledajte opće vrijednosti podataka. Primijetite da popularnost može biti '0', što pokazuje pjesme koje nemaju rangiranje. Uskoro ćemo ih ukloniti. + +1. Koristite barplot za otkrivanje najpopularnijih žanrova: + + ```python + import seaborn as sns + + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top[:5].index,y=top[:5].values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + ![najpopularniji](../../../../5-Clustering/1-Visualize/images/popular.png) + +✅ Ako želite vidjeti više top vrijednosti, promijenite top `[:5]` na veću vrijednost ili ga uklonite da vidite sve. + +Napomena: kada je top žanr opisan kao 'Missing', to znači da ga Spotify nije klasificirao, pa ga uklonimo. + +1. Uklonite nedostajuće podatke filtriranjem: + + ```python + df = df[df['artist_top_genre'] != 'Missing'] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + Sada ponovno provjerite žanrove: + + ![svi žanrovi](../../../../5-Clustering/1-Visualize/images/all-genres.png) + +1. Tri najpopularnija žanra dominiraju ovim skupom podataka. Usredotočimo se na `afro dancehall`, `afropop` i `nigerian pop`, dodatno filtrirajmo skup podataka kako bismo uklonili sve s vrijednošću popularnosti 0 (što znači da nije klasificirano s popularnošću u skupu podataka i može se smatrati šumom za naše svrhe): + + ```python + df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] + df = df[(df['popularity'] > 0)] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + +1. Brzo testirajte koreliraju li podaci na neki posebno jak način: + + ```python + corrmat = df.corr(numeric_only=True) + f, ax = plt.subplots(figsize=(12, 9)) + sns.heatmap(corrmat, vmax=.8, square=True) + ``` + + ![korelacije](../../../../5-Clustering/1-Visualize/images/correlation.png) + + Jedina jaka korelacija je između `energy` i `loudness`, što nije previše iznenađujuće, s obzirom na to da je glasna glazba obično prilično energična. Inače, korelacije su relativno slabe. Bit će zanimljivo vidjeti što algoritam klasteriranja može napraviti s ovim podacima. + + > 🎓 Napomena: korelacija ne implicira uzročnost! Imamo dokaz korelacije, ali ne i dokaz uzročnosti. [Zabavna web stranica](https://tylervigen.com/spurious-correlations) ima vizuale koji naglašavaju ovu točku. + +Postoji li konvergencija u ovom skupu podataka oko percepcije popularnosti i plesnosti pjesme? FacetGrid pokazuje da postoje koncentrični krugovi koji se podudaraju, bez obzira na žanr. Može li biti da se nigerijski ukusi konvergiraju na određenoj razini plesnosti za ovaj žanr? + +✅ Isprobajte različite podatkovne točke (energy, loudness, speechiness) i više ili različite glazbene žanrove. Što možete otkriti? Pogledajte tablicu `df.describe()` kako biste vidjeli opći raspon podatkovnih točaka. + +### Vježba - distribucija podataka + +Jesu li ova tri žanra značajno različita u percepciji njihove plesnosti, na temelju njihove popularnosti? + +1. Ispitajte distribuciju podataka za naša tri najbolja žanra za popularnost i plesnost duž zadane x i y osi. + + ```python + sns.set_theme(style="ticks") + + g = sns.jointplot( + data=df, + x="popularity", y="danceability", hue="artist_top_genre", + kind="kde", + ) + ``` + + Možete otkriti koncentrične krugove oko opće točke konvergencije, pokazujući distribuciju točaka. + + > 🎓 Napomena: ovaj primjer koristi KDE (Kernel Density Estimate) graf koji predstavlja podatke koristeći kontinuiranu krivulju gustoće vjerojatnosti. To nam omogućuje interpretaciju podataka pri radu s višestrukim distribucijama. + + Općenito, tri žanra se labavo usklađuju u smislu njihove popularnosti i plesnosti. Određivanje klastera u ovim labavo usklađenim podacima bit će izazov: + + ![distribucija](../../../../5-Clustering/1-Visualize/images/distribution.png) + +1. Napravite scatter plot: + + ```python + sns.FacetGrid(df, hue="artist_top_genre", height=5) \ + .map(plt.scatter, "popularity", "danceability") \ + .add_legend() + ``` + + Scatterplot istih osi pokazuje sličan obrazac konvergencije. + + ![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png) + +Općenito, za klasteriranje možete koristiti scatterplotove za prikaz klastera podataka, pa je ovladavanje ovom vrstom vizualizacije vrlo korisno. U sljedećoj lekciji, uzet ćemo ove filtrirane podatke i koristiti k-means klasteriranje za otkrivanje grupa u ovim podacima koje se preklapaju na zanimljive načine. + +--- + +## 🚀Izazov + +U pripremi za sljedeću lekciju, napravite grafikon o raznim algoritmima klasteriranja koje biste mogli otkriti i koristiti u produkcijskom okruženju. Koje vrste problema klasteriranje pokušava riješiti? + +## [Post-lecture kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Prije nego što primijenite algoritme klasteriranja, kao što smo naučili, dobro je razumjeti prirodu vašeg skupa podataka. Pročitajte više o ovoj temi [ovdje](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) + +[Ovaj koristan članak](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) vodi vas kroz različite načine na koje se različiti algoritmi klasteriranja ponašaju, s obzirom na različite oblike podataka. + +## Zadatak + +[Istrazite druge vizualizacije za klasteriranje](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/5-Clustering/1-Visualize/assignment.md b/translations/hr/5-Clustering/1-Visualize/assignment.md new file mode 100644 index 00000000..43227701 --- /dev/null +++ b/translations/hr/5-Clustering/1-Visualize/assignment.md @@ -0,0 +1,25 @@ + +# Istražite druge vizualizacije za klasteriranje + +## Upute + +U ovoj lekciji radili ste s nekim tehnikama vizualizacije kako biste stekli uvid u prikazivanje svojih podataka u pripremi za klasteriranje. Raspršeni dijagrami (scatterplots), posebno, korisni su za pronalaženje grupa objekata. Istražite različite načine i različite biblioteke za izradu raspršenih dijagrama i dokumentirajte svoj rad u bilježnici. Možete koristiti podatke iz ove lekcije, drugih lekcija ili podatke koje sami pronađete (molimo da u bilježnici navedete izvor podataka). Prikažite neke podatke pomoću raspršenih dijagrama i objasnite što ste otkrili. + +## Rubrika + +| Kriterij | Primjerno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------------- | ----------------------------------- | +| | Predstavljena je bilježnica s pet dobro dokumentiranih raspršenih dijagrama | Predstavljena je bilježnica s manje od pet raspršenih dijagrama i slabijom dokumentacijom | Predstavljena je nepotpuna bilježnica | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/5-Clustering/1-Visualize/solution/Julia/README.md b/translations/hr/5-Clustering/1-Visualize/solution/Julia/README.md new file mode 100644 index 00000000..f11fa4cc --- /dev/null +++ b/translations/hr/5-Clustering/1-Visualize/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/5-Clustering/2-K-Means/README.md b/translations/hr/5-Clustering/2-K-Means/README.md new file mode 100644 index 00000000..3de15e69 --- /dev/null +++ b/translations/hr/5-Clustering/2-K-Means/README.md @@ -0,0 +1,261 @@ + +# K-Means klasteriranje + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +U ovoj lekciji naučit ćete kako kreirati klastere koristeći Scikit-learn i nigerijski glazbeni dataset koji ste ranije uvezli. Pokrit ćemo osnove K-Means metode za klasteriranje. Imajte na umu da, kao što ste naučili u prethodnoj lekciji, postoji mnogo načina za rad s klasterima, a metoda koju koristite ovisi o vašim podacima. Isprobat ćemo K-Means jer je to najčešće korištena tehnika klasteriranja. Krenimo! + +Pojmovi koje ćete naučiti: + +- Silhouette ocjenjivanje +- Metoda lakta +- Inercija +- Varijanca + +## Uvod + +[K-Means klasteriranje](https://wikipedia.org/wiki/K-means_clustering) je metoda koja potječe iz područja obrade signala. Koristi se za podjelu i grupiranje podataka u 'k' klastera pomoću niza opažanja. Svako opažanje radi na grupiranju određenog podatka najbližem njegovom 'prosjeku', odnosno središnjoj točki klastera. + +Klasteri se mogu vizualizirati kao [Voronoi dijagrami](https://wikipedia.org/wiki/Voronoi_diagram), koji uključuju točku (ili 'sjeme') i njezinu odgovarajuću regiju. + +![voronoi diagram](../../../../5-Clustering/2-K-Means/images/voronoi.png) + +> Infografika od [Jen Looper](https://twitter.com/jenlooper) + +Proces K-Means klasteriranja [izvodi se u tri koraka](https://scikit-learn.org/stable/modules/clustering.html#k-means): + +1. Algoritam odabire k-broj središnjih točaka uzorkovanjem iz skupa podataka. Nakon toga, ponavlja: + 1. Dodjeljuje svaki uzorak najbližem centroidu. + 2. Stvara nove centre uzimajući prosječnu vrijednost svih uzoraka dodijeljenih prethodnim centrima. + 3. Zatim izračunava razliku između novih i starih centara i ponavlja dok se centri ne stabiliziraju. + +Jedan nedostatak korištenja K-Means metode je činjenica da morate odrediti 'k', odnosno broj centara. Srećom, 'metoda lakta' pomaže procijeniti dobru početnu vrijednost za 'k'. Uskoro ćete je isprobati. + +## Preduvjeti + +Radit ćete u datoteci [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) koja uključuje uvoz podataka i preliminarno čišćenje koje ste obavili u prethodnoj lekciji. + +## Vježba - priprema + +Započnite tako da ponovno pogledate podatke o pjesmama. + +1. Kreirajte boxplot pozivajući `boxplot()` za svaki stupac: + + ```python + plt.figure(figsize=(20,20), dpi=200) + + plt.subplot(4,3,1) + sns.boxplot(x = 'popularity', data = df) + + plt.subplot(4,3,2) + sns.boxplot(x = 'acousticness', data = df) + + plt.subplot(4,3,3) + sns.boxplot(x = 'energy', data = df) + + plt.subplot(4,3,4) + sns.boxplot(x = 'instrumentalness', data = df) + + plt.subplot(4,3,5) + sns.boxplot(x = 'liveness', data = df) + + plt.subplot(4,3,6) + sns.boxplot(x = 'loudness', data = df) + + plt.subplot(4,3,7) + sns.boxplot(x = 'speechiness', data = df) + + plt.subplot(4,3,8) + sns.boxplot(x = 'tempo', data = df) + + plt.subplot(4,3,9) + sns.boxplot(x = 'time_signature', data = df) + + plt.subplot(4,3,10) + sns.boxplot(x = 'danceability', data = df) + + plt.subplot(4,3,11) + sns.boxplot(x = 'length', data = df) + + plt.subplot(4,3,12) + sns.boxplot(x = 'release_date', data = df) + ``` + + Ovi podaci su malo bučni: promatrajući svaki stupac kao boxplot, možete vidjeti outliere. + + ![outliers](../../../../5-Clustering/2-K-Means/images/boxplots.png) + +Možete proći kroz skup podataka i ukloniti ove outliere, ali to bi učinilo podatke prilično minimalnima. + +1. Za sada odaberite koje stupce ćete koristiti za vježbu klasteriranja. Odaberite one sa sličnim rasponima i kodirajte stupac `artist_top_genre` kao numeričke podatke: + + ```python + from sklearn.preprocessing import LabelEncoder + le = LabelEncoder() + + X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')] + + y = df['artist_top_genre'] + + X['artist_top_genre'] = le.fit_transform(X['artist_top_genre']) + + y = le.transform(y) + ``` + +1. Sada trebate odabrati koliko klastera ciljati. Znate da postoje 3 glazbena žanra koja smo izdvojili iz skupa podataka, pa pokušajmo s 3: + + ```python + from sklearn.cluster import KMeans + + nclusters = 3 + seed = 0 + + km = KMeans(n_clusters=nclusters, random_state=seed) + km.fit(X) + + # Predict the cluster for each data point + + y_cluster_kmeans = km.predict(X) + y_cluster_kmeans + ``` + +Vidite ispisan niz s predviđenim klasterima (0, 1 ili 2) za svaki redak dataframea. + +1. Koristite ovaj niz za izračunavanje 'silhouette ocjene': + + ```python + from sklearn import metrics + score = metrics.silhouette_score(X, y_cluster_kmeans) + score + ``` + +## Silhouette ocjena + +Tražite silhouette ocjenu bližu 1. Ova ocjena varira od -1 do 1, a ako je ocjena 1, klaster je gust i dobro odvojen od drugih klastera. Vrijednost blizu 0 predstavlja preklapajuće klastere s uzorcima vrlo blizu granice odluke susjednih klastera. [(Izvor)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam) + +Naša ocjena je **.53**, dakle točno u sredini. To ukazuje da naši podaci nisu osobito prikladni za ovu vrstu klasteriranja, ali nastavimo. + +### Vježba - izgradnja modela + +1. Uvezite `KMeans` i započnite proces klasteriranja. + + ```python + from sklearn.cluster import KMeans + wcss = [] + + for i in range(1, 11): + kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42) + kmeans.fit(X) + wcss.append(kmeans.inertia_) + + ``` + + Postoji nekoliko dijelova koji zaslužuju objašnjenje. + + > 🎓 range: Ovo su iteracije procesa klasteriranja + + > 🎓 random_state: "Određuje generiranje slučajnih brojeva za inicijalizaciju centara." [Izvor](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans) + + > 🎓 WCSS: "sume kvadrata unutar klastera" mjere prosječnu kvadratnu udaljenost svih točaka unutar klastera do centra klastera. [Izvor](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce). + + > 🎓 Inercija: K-Means algoritmi pokušavaju odabrati centre kako bi minimizirali 'inerciju', "mjeru koliko su klasteri interno koherentni." [Izvor](https://scikit-learn.org/stable/modules/clustering.html). Vrijednost se dodaje varijabli wcss pri svakoj iteraciji. + + > 🎓 k-means++: U [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) možete koristiti 'k-means++' optimizaciju, koja "inicijalizira centre tako da budu (općenito) udaljeni jedni od drugih, što dovodi do vjerojatno boljih rezultata od slučajne inicijalizacije. + +### Metoda lakta + +Ranije ste pretpostavili da, budući da ste ciljali 3 glazbena žanra, trebate odabrati 3 klastera. Ali je li to slučaj? + +1. Koristite 'metodu lakta' da budete sigurni. + + ```python + plt.figure(figsize=(10,5)) + sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red') + plt.title('Elbow') + plt.xlabel('Number of clusters') + plt.ylabel('WCSS') + plt.show() + ``` + + Koristite varijablu `wcss` koju ste izgradili u prethodnom koraku za kreiranje grafikona koji pokazuje gdje je 'savijanje' u laktu, što ukazuje na optimalan broj klastera. Možda je to **zaista** 3! + + ![elbow method](../../../../5-Clustering/2-K-Means/images/elbow.png) + +## Vježba - prikaz klastera + +1. Pokušajte ponovno proces, ovaj put postavljajući tri klastera, i prikažite klastere kao scatterplot: + + ```python + from sklearn.cluster import KMeans + kmeans = KMeans(n_clusters = 3) + kmeans.fit(X) + labels = kmeans.predict(X) + plt.scatter(df['popularity'],df['danceability'],c = labels) + plt.xlabel('popularity') + plt.ylabel('danceability') + plt.show() + ``` + +1. Provjerite točnost modela: + + ```python + labels = kmeans.labels_ + + correct_labels = sum(y == labels) + + print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size)) + + print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size))) + ``` + + Točnost ovog modela nije baš dobra, a oblik klastera daje vam nagovještaj zašto. + + ![clusters](../../../../5-Clustering/2-K-Means/images/clusters.png) + + Ovi podaci su previše neuravnoteženi, premalo korelirani i postoji prevelika varijanca između vrijednosti stupaca da bi se dobro klasterirali. Zapravo, klasteri koji se formiraju vjerojatno su jako pod utjecajem ili iskrivljeni zbog tri kategorije žanrova koje smo gore definirali. To je bio proces učenja! + + U dokumentaciji Scikit-learn možete vidjeti da model poput ovog, s klasterima koji nisu dobro razgraničeni, ima problem 'varijance': + + ![problem models](../../../../5-Clustering/2-K-Means/images/problems.png) + > Infografika iz Scikit-learn + +## Varijanca + +Varijanca je definirana kao "prosjek kvadrata razlika od srednje vrijednosti" [(Izvor)](https://www.mathsisfun.com/data/standard-deviation.html). U kontekstu ovog problema klasteriranja, odnosi se na podatke kod kojih brojevi našeg skupa podataka imaju tendenciju previše odstupati od srednje vrijednosti. + +✅ Ovo je odličan trenutak da razmislite o svim načinima na koje biste mogli ispraviti ovaj problem. Malo više prilagoditi podatke? Koristiti različite stupce? Koristiti drugačiji algoritam? Savjet: Pokušajte [skalirati svoje podatke](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) kako biste ih normalizirali i testirali druge stupce. + +> Pokušajte ovaj '[kalkulator varijance](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' kako biste bolje razumjeli koncept. + +--- + +## 🚀Izazov + +Provedite neko vrijeme s ovim notebookom, prilagođavajući parametre. Možete li poboljšati točnost modela čišćenjem podataka (na primjer, uklanjanjem outliera)? Možete koristiti težine kako biste dali veću težinu određenim uzorcima podataka. Što još možete učiniti kako biste stvorili bolje klastere? + +Savjet: Pokušajte skalirati svoje podatke. U notebooku postoji komentirani kod koji dodaje standardno skaliranje kako bi stupci podataka više nalikovali jedni drugima u smislu raspona. Primijetit ćete da, iako silhouette ocjena opada, 'savijanje' u grafu lakta postaje glađe. To je zato što ostavljanje podataka neskaliranima omogućuje podacima s manje varijance da imaju veću težinu. Pročitajte malo više o ovom problemu [ovdje](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226). + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Pogledajte simulator K-Means [poput ovog](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Možete koristiti ovaj alat za vizualizaciju uzoraka podataka i određivanje njihovih centara. Možete uređivati slučajnost podataka, broj klastera i broj centara. Pomaže li vam ovo da steknete ideju o tome kako se podaci mogu grupirati? + +Također, pogledajte [ovaj materijal o K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) sa Stanforda. + +## Zadatak + +[Isprobajte različite metode klasteriranja](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/5-Clustering/2-K-Means/assignment.md b/translations/hr/5-Clustering/2-K-Means/assignment.md new file mode 100644 index 00000000..2b32d10e --- /dev/null +++ b/translations/hr/5-Clustering/2-K-Means/assignment.md @@ -0,0 +1,25 @@ + +# Isprobajte različite metode grupiranja + +## Upute + +U ovoj lekciji ste naučili o K-Means grupiranju. Ponekad K-Means nije prikladan za vaše podatke. Napravite bilježnicu koristeći podatke iz ovih lekcija ili iz nekog drugog izvora (navedite izvor) i pokažite drugačiju metodu grupiranja koja NE koristi K-Means. Što ste naučili? + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | -------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------- | +| | Predstavljena je bilježnica s dobro dokumentiranim modelom grupiranja | Predstavljena je bilježnica bez dobre dokumentacije i/ili nepotpuna | Predan je nepotpun rad | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/5-Clustering/2-K-Means/solution/Julia/README.md b/translations/hr/5-Clustering/2-K-Means/solution/Julia/README.md new file mode 100644 index 00000000..6d726c9f --- /dev/null +++ b/translations/hr/5-Clustering/2-K-Means/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/5-Clustering/README.md b/translations/hr/5-Clustering/README.md new file mode 100644 index 00000000..968f8727 --- /dev/null +++ b/translations/hr/5-Clustering/README.md @@ -0,0 +1,42 @@ + +# Modeli grupiranja za strojno učenje + +Grupiranje je zadatak strojnog učenja koji nastoji pronaći objekte koji su slični jedni drugima i grupirati ih u skupine koje nazivamo klasterima. Ono što razlikuje grupiranje od drugih pristupa u strojnome učenju jest činjenica da se proces odvija automatski; zapravo, može se reći da je to suprotnost nadziranom učenju. + +## Regionalna tema: modeli grupiranja za glazbeni ukus nigerijske publike 🎧 + +Raznolika publika u Nigeriji ima raznolike glazbene ukuse. Koristeći podatke prikupljene sa Spotifyja (inspirirano [ovim člankom](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)), pogledajmo neke od popularnih pjesama u Nigeriji. Ovaj skup podataka uključuje informacije o raznim pjesmama, poput ocjene 'plesnosti', 'akustičnosti', glasnoće, 'govorljivosti', popularnosti i energije. Bit će zanimljivo otkriti obrasce u ovim podacima! + +![Gramofon](../../../5-Clustering/images/turntable.jpg) + +> Fotografija autora Marcela Laskoski na Unsplash + +U ovom nizu lekcija otkrit ćete nove načine analize podataka koristeći tehnike grupiranja. Grupiranje je posebno korisno kada vaš skup podataka nema oznake. Ako ima oznake, tada bi tehnike klasifikacije, poput onih koje ste naučili u prethodnim lekcijama, mogle biti korisnije. No, u slučajevima kada želite grupirati nepovezane podatke, grupiranje je odličan način za otkrivanje obrazaca. + +> Postoje korisni alati s malo koda koji vam mogu pomoći u radu s modelima grupiranja. Isprobajte [Azure ML za ovaj zadatak](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Lekcije + +1. [Uvod u grupiranje](1-Visualize/README.md) +2. [K-Means grupiranje](2-K-Means/README.md) + +## Zasluge + +Ove lekcije napisane su uz 🎶 od strane [Jen Looper](https://www.twitter.com/jenlooper) uz korisne recenzije od [Rishit Dagli](https://rishit_dagli) i [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan). + +Skup podataka [Nigerijske pjesme](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) preuzet je s Kagglea, prikupljen sa Spotifyja. + +Korisni primjeri K-Means grupiranja koji su pomogli u stvaranju ove lekcije uključuju ovu [analizu irisa](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), ovaj [uvodni notebook](https://www.kaggle.com/prashant111/k-means-clustering-with-python) i ovaj [hipotetski primjer za nevladinu organizaciju](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering). + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/1-Introduction-to-NLP/README.md b/translations/hr/6-NLP/1-Introduction-to-NLP/README.md new file mode 100644 index 00000000..d5de0785 --- /dev/null +++ b/translations/hr/6-NLP/1-Introduction-to-NLP/README.md @@ -0,0 +1,179 @@ + +# Uvod u obradu prirodnog jezika + +Ova lekcija pokriva kratku povijest i važne koncepte *obrade prirodnog jezika*, područja unutar *računalne lingvistike*. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +NLP, kako se često naziva, jedno je od najpoznatijih područja gdje se strojno učenje primjenjuje i koristi u proizvodnom softveru. + +✅ Možete li se sjetiti softvera koji svakodnevno koristite, a koji vjerojatno ima ugrađen NLP? Što je s vašim programima za obradu teksta ili mobilnim aplikacijama koje redovito koristite? + +Naučit ćete o: + +- **Ideji jezika**. Kako su se jezici razvijali i koja su glavna područja proučavanja. +- **Definicijama i konceptima**. Također ćete naučiti definicije i koncepte o tome kako računala obrađuju tekst, uključujući parsiranje, gramatiku i prepoznavanje imenica i glagola. U ovoj lekciji postoje neki zadaci kodiranja, a uvode se nekoliko važnih koncepata koje ćete kasnije naučiti kodirati u sljedećim lekcijama. + +## Računalna lingvistika + +Računalna lingvistika je područje istraživanja i razvoja koje se proučava desetljećima, a bavi se time kako računala mogu raditi s jezicima, pa čak i razumjeti, prevoditi i komunicirati s njima. Obrada prirodnog jezika (NLP) je povezano područje koje se fokusira na to kako računala mogu obrađivati 'prirodne', odnosno ljudske jezike. + +### Primjer - diktiranje na telefonu + +Ako ste ikada diktirali svom telefonu umjesto da tipkate ili pitali virtualnog asistenta pitanje, vaš govor je pretvoren u tekstualni oblik, a zatim obrađen ili *parsiran* iz jezika kojim ste govorili. Detektirane ključne riječi zatim su obrađene u format koji telefon ili asistent može razumjeti i na temelju kojeg može djelovati. + +![razumijevanje](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png) +> Pravo lingvističko razumijevanje je teško! Slika: [Jen Looper](https://twitter.com/jenlooper) + +### Kako je ova tehnologija omogućena? + +Ovo je moguće jer je netko napisao računalni program za to. Prije nekoliko desetljeća, neki pisci znanstvene fantastike predviđali su da će ljudi uglavnom razgovarati sa svojim računalima, a računala će uvijek točno razumjeti što misle. Nažalost, pokazalo se da je to teži problem nego što su mnogi zamišljali, i iako je danas puno bolje razumljiv problem, postoje značajni izazovi u postizanju 'savršene' obrade prirodnog jezika kada je riječ o razumijevanju značenja rečenice. Ovo je posebno težak problem kada je riječ o razumijevanju humora ili otkrivanju emocija poput sarkazma u rečenici. + +U ovom trenutku možda se prisjećate školskih sati gdje je učitelj objašnjavao dijelove gramatike u rečenici. U nekim zemljama učenici uče gramatiku i lingvistiku kao poseban predmet, dok su u mnogima ti sadržaji uključeni u učenje jezika: bilo prvog jezika u osnovnoj školi (učenje čitanja i pisanja) ili možda drugog jezika u srednjoj školi. Ne brinite ako niste stručnjak za razlikovanje imenica od glagola ili priloga od pridjeva! + +Ako se mučite s razlikom između *jednostavnog sadašnjeg vremena* i *sadašnjeg trajnog vremena*, niste sami. Ovo je izazov za mnoge ljude, čak i za izvorne govornike jezika. Dobra vijest je da su računala jako dobra u primjeni formalnih pravila, i naučit ćete pisati kod koji može *parsirati* rečenicu jednako dobro kao i čovjek. Veći izazov koji ćete kasnije istražiti je razumijevanje *značenja* i *sentimenta* rečenice. + +## Preduvjeti + +Za ovu lekciju, glavni preduvjet je sposobnost čitanja i razumijevanja jezika ove lekcije. Nema matematičkih problema ili jednadžbi za rješavanje. Iako je originalni autor napisao ovu lekciju na engleskom, ona je također prevedena na druge jezike, pa biste mogli čitati prijevod. Postoje primjeri gdje se koristi nekoliko različitih jezika (za usporedbu različitih gramatičkih pravila različitih jezika). Ti primjeri *nisu* prevedeni, ali objašnjavajući tekst jest, pa bi značenje trebalo biti jasno. + +Za zadatke kodiranja koristit ćete Python, a primjeri koriste Python 3.8. + +U ovom dijelu trebat ćete i koristiti: + +- **Razumijevanje Pythona 3**. Razumijevanje programskog jezika Python 3, ova lekcija koristi unos, petlje, čitanje datoteka, nizove. +- **Visual Studio Code + ekstenzija**. Koristit ćemo Visual Studio Code i njegovu Python ekstenziju. Također možete koristiti Python IDE po svom izboru. +- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) je pojednostavljena biblioteka za obradu teksta u Pythonu. Slijedite upute na web stranici TextBlob-a kako biste ga instalirali na svoj sustav (instalirajte i korpuse, kao što je prikazano dolje): + + ```bash + pip install -U textblob + python -m textblob.download_corpora + ``` + +> 💡 Savjet: Python možete pokrenuti izravno u okruženjima VS Code-a. Pogledajte [dokumentaciju](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) za više informacija. + +## Razgovor s računalima + +Povijest pokušaja da se računala natjeraju da razumiju ljudski jezik seže desetljećima unatrag, a jedan od najranijih znanstvenika koji je razmatrao obradu prirodnog jezika bio je *Alan Turing*. + +### 'Turingov test' + +Kada je Turing istraživao *umjetnu inteligenciju* 1950-ih, razmatrao je može li se provesti test razgovora između čovjeka i računala (putem pisanog dopisivanja) gdje čovjek u razgovoru nije siguran razgovara li s drugim čovjekom ili računalom. + +Ako, nakon određenog trajanja razgovora, čovjek ne može odrediti jesu li odgovori od računala ili ne, može li se tada reći da računalo *razmišlja*? + +### Inspiracija - 'igra imitacije' + +Ideja za ovo došla je iz društvene igre zvane *Igra imitacije* gdje je ispitivač sam u sobi i ima zadatak odrediti tko su od dvije osobe (u drugoj sobi) muškarac i žena. Ispitivač može slati bilješke i mora pokušati smisliti pitanja gdje pisani odgovori otkrivaju spol misteriozne osobe. Naravno, igrači u drugoj sobi pokušavaju zavarati ispitivača odgovarajući na pitanja na način koji zbunjuje ili dovodi u zabludu ispitivača, dok istovremeno daju dojam da odgovaraju iskreno. + +### Razvoj Elize + +1960-ih, znanstvenik s MIT-a po imenu *Joseph Weizenbaum* razvio je [*Elizu*](https://wikipedia.org/wiki/ELIZA), računalnog 'terapeuta' koji bi postavljao ljudima pitanja i davao dojam da razumije njihove odgovore. Međutim, iako je Eliza mogla parsirati rečenicu i identificirati određene gramatičke konstrukte i ključne riječi kako bi dala razuman odgovor, nije se moglo reći da *razumije* rečenicu. Ako bi Eliza bila suočena s rečenicom u formatu "**Ja sam** tužan", mogla bi preurediti i zamijeniti riječi u rečenici kako bi formirala odgovor "Koliko dugo ste **vi bili** tužni". + +To je davalo dojam da Eliza razumije izjavu i postavlja dodatno pitanje, dok je u stvarnosti mijenjala vrijeme i dodavala neke riječi. Ako Eliza nije mogla identificirati ključnu riječ za koju ima odgovor, umjesto toga bi dala nasumičan odgovor koji bi mogao biti primjenjiv na mnoge različite izjave. Elizu se lako moglo zavarati, na primjer, ako bi korisnik napisao "**Vi ste** bicikl", mogla bi odgovoriti s "Koliko dugo sam **ja bio** bicikl?", umjesto razumnijeg odgovora. + +[![Razgovor s Elizom](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Razgovor s Elizom") + +> 🎥 Kliknite na sliku iznad za video o originalnom programu ELIZA + +> Napomena: Možete pročitati originalni opis [Elize](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) objavljen 1966. ako imate ACM račun. Alternativno, pročitajte o Elizi na [wikipediji](https://wikipedia.org/wiki/ELIZA) + +## Vježba - kodiranje osnovnog razgovornog bota + +Razgovorni bot, poput Elize, je program koji potiče unos korisnika i daje dojam da razumije i odgovara inteligentno. Za razliku od Elize, naš bot neće imati nekoliko pravila koja mu daju dojam inteligentnog razgovora. Umjesto toga, naš bot će imati samo jednu sposobnost: održavati razgovor s nasumičnim odgovorima koji bi mogli funkcionirati u gotovo svakom trivijalnom razgovoru. + +### Plan + +Koraci za izradu razgovornog bota: + +1. Ispišite upute koje savjetuju korisniku kako komunicirati s botom +2. Pokrenite petlju + 1. Prihvatite unos korisnika + 2. Ako korisnik zatraži izlaz, izađite + 3. Obradite unos korisnika i odredite odgovor (u ovom slučaju, odgovor je nasumičan odabir iz popisa mogućih generičkih odgovora) + 4. Ispišite odgovor +3. Vratite se na korak 2 + +### Izrada bota + +Sljedeće ćemo izraditi bota. Počet ćemo definiranjem nekih fraza. + +1. Napravite ovog bota sami u Pythonu s sljedećim nasumičnim odgovorima: + + ```python + random_responses = ["That is quite interesting, please tell me more.", + "I see. Do go on.", + "Why do you say that?", + "Funny weather we've been having, isn't it?", + "Let's change the subject.", + "Did you catch the game last night?"] + ``` + + Evo uzorka izlaza koji će vas voditi (unos korisnika je na linijama koje počinju s `>`): + + ```output + Hello, I am Marvin, the simple robot. + You can end this conversation at any time by typing 'bye' + After typing each answer, press 'enter' + How are you today? + > I am good thanks + That is quite interesting, please tell me more. + > today I went for a walk + Did you catch the game last night? + > I did, but my team lost + Funny weather we've been having, isn't it? + > yes but I hope next week is better + Let's change the subject. + > ok, lets talk about music + Why do you say that? + > because I like music! + Why do you say that? + > bye + It was nice talking to you, goodbye! + ``` + + Jedno moguće rješenje zadatka nalazi se [ovdje](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py) + + ✅ Zaustavite se i razmislite + + 1. Mislite li da bi nasumični odgovori 'zavarali' nekoga da pomisli da bot zapravo razumije? + 2. Koje bi značajke bot trebao imati da bi bio učinkovitiji? + 3. Ako bi bot zaista mogao 'razumjeti' značenje rečenice, bi li trebao 'zapamtiti' značenje prethodnih rečenica u razgovoru? + +--- + +## 🚀Izazov + +Odaberite jedan od elemenata "zaustavite se i razmislite" iznad i pokušajte ga implementirati u kodu ili napišite rješenje na papiru koristeći pseudokod. + +U sljedećoj lekciji naučit ćete o brojnim drugim pristupima parsiranju prirodnog jezika i strojnog učenja. + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Pogledajte dolje navedene reference kao prilike za daljnje čitanje. + +### Reference + +1. Schubert, Lenhart, "Računalna lingvistika", *Stanford Encyclopedia of Philosophy* (Proljetno izdanje 2020.), Edward N. Zalta (ur.), URL = . +2. Princeton University "O WordNetu." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010. + +## Zadatak + +[Potražite bota](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/1-Introduction-to-NLP/assignment.md b/translations/hr/6-NLP/1-Introduction-to-NLP/assignment.md new file mode 100644 index 00000000..f006a463 --- /dev/null +++ b/translations/hr/6-NLP/1-Introduction-to-NLP/assignment.md @@ -0,0 +1,25 @@ + +# Potraga za botom + +## Upute + +Botovi su svugdje. Vaš zadatak: pronađite jednog i "usvojite" ga! Možete ih pronaći na web stranicama, u bankarskim aplikacijama i na telefonu, na primjer kada zovete financijske tvrtke za savjet ili informacije o računu. Analizirajte bota i provjerite možete li ga zbuniti. Ako ga možete zbuniti, zašto mislite da se to dogodilo? Napišite kratki rad o svom iskustvu. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ------------------------------------------------------------------------------------------------------------ | -------------------------------------------- | --------------------- | +| | Napisana je cijela stranica rada, objašnjava se pretpostavljena arhitektura bota i opisuje vaše iskustvo s njim | Rad je nepotpun ili nije dobro istražen | Rad nije predan | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/2-Tasks/README.md b/translations/hr/6-NLP/2-Tasks/README.md new file mode 100644 index 00000000..9f879ad5 --- /dev/null +++ b/translations/hr/6-NLP/2-Tasks/README.md @@ -0,0 +1,224 @@ + +# Uobičajeni zadaci i tehnike obrade prirodnog jezika + +Za većinu zadataka obrade prirodnog jezika (*natural language processing*), tekst koji se obrađuje mora se razložiti, analizirati i rezultati pohraniti ili usporediti s pravilima i skupovima podataka. Ovi zadaci omogućuju programeru da izvuče _značenje_, _namjeru_ ili samo _učestalost_ pojmova i riječi u tekstu. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +Otkrijmo uobičajene tehnike koje se koriste u obradi teksta. U kombinaciji sa strojnim učenjem, ove tehnike pomažu vam da učinkovito analizirate velike količine teksta. Međutim, prije nego što primijenimo strojno učenje na ove zadatke, prvo razumijmo probleme s kojima se susreće stručnjak za obradu prirodnog jezika. + +## Uobičajeni zadaci u obradi prirodnog jezika + +Postoje različiti načini za analizu teksta na kojem radite. Postoje zadaci koje možete izvršiti, a kroz njih možete steći razumijevanje teksta i donijeti zaključke. Obično se ovi zadaci izvode u nizu. + +### Tokenizacija + +Vjerojatno prva stvar koju većina algoritama za obradu prirodnog jezika mora učiniti jest podijeliti tekst na tokene ili riječi. Iako to zvuči jednostavno, uzimanje u obzir interpunkcije i različitih jezičnih granica riječi i rečenica može biti izazovno. Možda ćete morati koristiti različite metode za određivanje granica. + +![tokenizacija](../../../../6-NLP/2-Tasks/images/tokenization.png) +> Tokenizacija rečenice iz **Ponosa i predrasuda**. Infografika autorice [Jen Looper](https://twitter.com/jenlooper) + +### Ugrađivanja + +[Ugrađivanja riječi](https://wikipedia.org/wiki/Word_embedding) su način pretvaranja vaših tekstualnih podataka u numerički oblik. Ugrađivanja se rade na način da riječi sa sličnim značenjem ili riječi koje se često koriste zajedno budu grupirane. + +![ugrađivanja riječi](../../../../6-NLP/2-Tasks/images/embedding.png) +> "Imam najveće poštovanje prema vašim živcima, oni su moji stari prijatelji." - Ugrađivanja riječi za rečenicu iz **Ponosa i predrasuda**. Infografika autorice [Jen Looper](https://twitter.com/jenlooper) + +✅ Isprobajte [ovaj zanimljiv alat](https://projector.tensorflow.org/) za eksperimentiranje s ugrađivanjima riječi. Klikom na jednu riječ prikazuju se skupine sličnih riječi: 'toy' je grupiran s 'disney', 'lego', 'playstation' i 'console'. + +### Parsiranje i označavanje dijelova govora + +Svaka riječ koja je tokenizirana može se označiti kao dio govora - imenica, glagol ili pridjev. Rečenica `brza crvena lisica skočila je preko lijenog smeđeg psa` mogla bi biti označena kao lisica = imenica, skočila = glagol. + +![parsiranje](../../../../6-NLP/2-Tasks/images/parse.png) + +> Parsiranje rečenice iz **Ponosa i predrasuda**. Infografika autorice [Jen Looper](https://twitter.com/jenlooper) + +Parsiranje prepoznaje koje su riječi povezane u rečenici - na primjer, `brza crvena lisica skočila` je slijed pridjev-imenica-glagol koji je odvojen od slijeda `lijeni smeđi pas`. + +### Učestalost riječi i fraza + +Korisna procedura pri analizi velikog teksta je izgradnja rječnika svake riječi ili fraze od interesa i koliko se često pojavljuje. Fraza `brza crvena lisica skočila je preko lijenog smeđeg psa` ima učestalost riječi 2 za riječ "the". + +Pogledajmo primjer teksta u kojem brojimo učestalost riječi. Pjesma The Winners autora Rudyarda Kiplinga sadrži sljedeće stihove: + +```output +What the moral? Who rides may read. +When the night is thick and the tracks are blind +A friend at a pinch is a friend, indeed, +But a fool to wait for the laggard behind. +Down to Gehenna or up to the Throne, +He travels the fastest who travels alone. +``` + +Kako učestalost fraza može biti osjetljiva ili neosjetljiva na velika i mala slova, fraza `a friend` ima učestalost 2, `the` ima učestalost 6, a `travels` ima učestalost 2. + +### N-grami + +Tekst se može podijeliti na sekvence riječi određene duljine: jedna riječ (unigram), dvije riječi (bigrami), tri riječi (trigrami) ili bilo koji broj riječi (n-grami). + +Na primjer, `brza crvena lisica skočila je preko lijenog smeđeg psa` s n-gramom duljine 2 daje sljedeće n-grame: + +1. brza crvena +2. crvena lisica +3. lisica skočila +4. skočila preko +5. preko lijenog +6. lijenog smeđeg +7. smeđeg psa + +Možda će biti lakše vizualizirati to kao klizni okvir preko rečenice. Evo kako to izgleda za n-grame od 3 riječi, gdje je n-gram podebljan u svakoj rečenici: + +1. **brza crvena lisica** skočila je preko lijenog smeđeg psa +2. brza **crvena lisica skočila** je preko lijenog smeđeg psa +3. brza crvena **lisica skočila preko** lijenog smeđeg psa +4. brza crvena lisica **skočila preko lijenog** smeđeg psa +5. brza crvena lisica skočila **preko lijenog smeđeg** psa +6. brza crvena lisica skočila preko **lijenog smeđeg psa** + +![klizni prozor n-grama](../../../../6-NLP/2-Tasks/images/n-grams.gif) + +> Vrijednost n-grama 3: Infografika autorice [Jen Looper](https://twitter.com/jenlooper) + +### Ekstrakcija imenskih fraza + +U većini rečenica postoji imenica koja je subjekt ili objekt rečenice. U engleskom jeziku često se može prepoznati po tome što joj prethodi 'a', 'an' ili 'the'. Identificiranje subjekta ili objekta rečenice pomoću 'ekstrakcije imenske fraze' uobičajen je zadatak u obradi prirodnog jezika kada se pokušava razumjeti značenje rečenice. + +✅ U rečenici "Ne mogu odrediti sat, ni mjesto, ni pogled ni riječi, koje su postavile temelje. To je bilo davno. Bio sam usred toga prije nego što sam shvatio da sam počeo.", možete li identificirati imenske fraze? + +U rečenici `brza crvena lisica skočila je preko lijenog smeđeg psa` postoje 2 imenske fraze: **brza crvena lisica** i **lijeni smeđi pas**. + +### Analiza sentimenta + +Rečenica ili tekst mogu se analizirati prema sentimentu, odnosno koliko su *pozitivni* ili *negativni*. Sentiment se mjeri prema *polaritetu* i *objektivnosti/subjektivnosti*. Polaritet se mjeri od -1.0 do 1.0 (negativno do pozitivno), a objektivnost od 0.0 do 1.0 (najobjektivnije do najsubjektivnije). + +✅ Kasnije ćete naučiti da postoje različiti načini za određivanje sentimenta pomoću strojnog učenja, ali jedan od načina je imati popis riječi i fraza koje su kategorizirane kao pozitivne ili negativne od strane ljudskog stručnjaka i primijeniti taj model na tekst kako biste izračunali polaritet. Možete li vidjeti kako bi ovo funkcioniralo u nekim okolnostima, a u drugima ne? + +### Infleksija + +Infleksija vam omogućuje da uzmete riječ i dobijete njezin jedninski ili množinski oblik. + +### Lemmatizacija + +*Lema* je korijen ili osnovna riječ za skup riječi, na primjer *letio*, *leti*, *leteći* imaju lemu glagola *letjeti*. + +Također postoje korisne baze podataka dostupne istraživačima obrade prirodnog jezika, a posebno: + +### WordNet + +[WordNet](https://wordnet.princeton.edu/) je baza podataka riječi, sinonima, antonima i mnogih drugih detalja za svaku riječ na mnogim različitim jezicima. Nevjerojatno je korisna pri pokušaju izrade prijevoda, provjere pravopisa ili alata za jezik bilo koje vrste. + +## Biblioteke za obradu prirodnog jezika + +Srećom, ne morate sami graditi sve ove tehnike jer postoje izvrsne Python biblioteke koje ih čine mnogo pristupačnijima za programere koji nisu specijalizirani za obradu prirodnog jezika ili strojno učenje. Sljedeće lekcije uključuju više primjera ovih biblioteka, ali ovdje ćete naučiti nekoliko korisnih primjera koji će vam pomoći u sljedećem zadatku. + +### Vježba - korištenje biblioteke `TextBlob` + +Koristimo biblioteku pod nazivom TextBlob jer sadrži korisne API-je za rješavanje ovakvih zadataka. TextBlob "stoji na ramenima divova [NLTK](https://nltk.org) i [pattern](https://github.com/clips/pattern), i lijepo surađuje s oboje." Ima značajnu količinu strojnog učenja ugrađenu u svoj API. + +> Napomena: Koristan [Vodič za brzi početak](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) dostupan je za TextBlob i preporučuje se iskusnim Python programerima. + +Kada pokušavate identificirati *imenske fraze*, TextBlob nudi nekoliko opcija ekstraktora za pronalaženje imenskih fraza. + +1. Pogledajte `ConllExtractor`. + + ```python + from textblob import TextBlob + from textblob.np_extractors import ConllExtractor + # import and create a Conll extractor to use later + extractor = ConllExtractor() + + # later when you need a noun phrase extractor: + user_input = input("> ") + user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified + np = user_input_blob.noun_phrases + ``` + + > Što se ovdje događa? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) je "Ekstraktor imenskih fraza koji koristi parsiranje segmenata trenirano na ConLL-2000 korpusu za treniranje." ConLL-2000 odnosi se na Konferenciju o računalnom učenju jezika iz 2000. godine. Svake godine konferencija je organizirala radionicu za rješavanje složenog problema obrade prirodnog jezika, a 2000. godine to je bilo segmentiranje imenskih fraza. Model je treniran na Wall Street Journalu, s "odjeljcima 15-18 kao podacima za treniranje (211727 tokena) i odjeljkom 20 kao testnim podacima (47377 tokena)". Možete pogledati postupke korištene [ovdje](https://www.clips.uantwerpen.be/conll2000/chunking/) i [rezultate](https://ifarm.nl/erikt/research/np-chunking.html). + +### Izazov - poboljšajte svog bota pomoću obrade prirodnog jezika + +U prethodnoj lekciji izradili ste vrlo jednostavnog Q&A bota. Sada ćete učiniti Marvina malo suosjećajnijim analizirajući vaš unos za sentiment i ispisujući odgovor koji odgovara sentimentu. Također ćete morati identificirati `imensku frazu` i postaviti pitanje o njoj. + +Vaši koraci pri izradi boljeg konverzacijskog bota: + +1. Ispišite upute koje savjetuju korisnika kako komunicirati s botom +2. Pokrenite petlju + 1. Prihvatite korisnikov unos + 2. Ako korisnik zatraži izlaz, izađite + 3. Obradite korisnikov unos i odredite odgovarajući odgovor na temelju sentimenta + 4. Ako se u sentimentu otkrije imenska fraza, množite je i zatražite dodatni unos o toj temi + 5. Ispišite odgovor +3. Vratite se na korak 2 + +Evo isječka koda za određivanje sentimenta pomoću TextBlob-a. Imajte na umu da postoje samo četiri *gradijenta* odgovora na sentiment (možete ih imati više ako želite): + +```python +if user_input_blob.polarity <= -0.5: + response = "Oh dear, that sounds bad. " +elif user_input_blob.polarity <= 0: + response = "Hmm, that's not great. " +elif user_input_blob.polarity <= 0.5: + response = "Well, that sounds positive. " +elif user_input_blob.polarity <= 1: + response = "Wow, that sounds great. " +``` + +Evo primjera izlaza koji će vas voditi (korisnikov unos je na linijama koje počinju s >): + +```output +Hello, I am Marvin, the friendly robot. +You can end this conversation at any time by typing 'bye' +After typing each answer, press 'enter' +How are you today? +> I am ok +Well, that sounds positive. Can you tell me more? +> I went for a walk and saw a lovely cat +Well, that sounds positive. Can you tell me more about lovely cats? +> cats are the best. But I also have a cool dog +Wow, that sounds great. Can you tell me more about cool dogs? +> I have an old hounddog but he is sick +Hmm, that's not great. Can you tell me more about old hounddogs? +> bye +It was nice talking to you, goodbye! +``` + +Jedno moguće rješenje zadatka nalazi se [ovdje](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py) + +✅ Provjera znanja + +1. Mislite li da bi suosjećajni odgovori mogli 'zavarati' nekoga da pomisli da bot zapravo razumije? +2. Čini li identificiranje imenske fraze bota 'uvjerljivijim'? +3. Zašto bi ekstrakcija 'imenske fraze' iz rečenice bila korisna stvar? + +--- + +Implementirajte bota iz prethodne provjere znanja i testirajte ga na prijatelju. Može li ih zavarati? Možete li učiniti svog bota 'uvjerljivijim'? + +## 🚀Izazov + +Uzmite zadatak iz prethodne provjere znanja i pokušajte ga implementirati. Testirajte bota na prijatelju. Može li ih zavarati? Možete li učiniti svog bota 'uvjerljivijim'? + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +U sljedećih nekoliko lekcija naučit ćete više o analizi sentimenta. Istražite ovu zanimljivu tehniku u člancima poput ovih na [KDNuggets](https://www.kdnuggets.com/tag/nlp) + +## Zadatak + +[Natjerajte bota da odgovara](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden koristeći AI uslugu za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/2-Tasks/assignment.md b/translations/hr/6-NLP/2-Tasks/assignment.md new file mode 100644 index 00000000..251e902c --- /dev/null +++ b/translations/hr/6-NLP/2-Tasks/assignment.md @@ -0,0 +1,25 @@ + +# Napravite da bot odgovara + +## Upute + +U prethodnim lekcijama programirali ste osnovnog bota s kojim možete razgovarati. Ovaj bot daje nasumične odgovore dok ne kažete 'bye'. Možete li učiniti odgovore malo manje nasumičnima i potaknuti odgovore ako kažete određene stvari, poput 'zašto' ili 'kako'? Razmislite kako bi strojno učenje moglo učiniti ovaj tip rada manje ručnim dok proširujete svog bota. Možete koristiti knjižnice NLTK ili TextBlob kako biste si olakšali zadatke. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | --------------------------------------------- | ------------------------------------------------ | ----------------------- | +| | Predstavljen je novi bot.py datoteku i dokumentiran | Predstavljen je novi bot datoteka, ali sadrži greške | Datoteka nije predstavljena | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/3-Translation-Sentiment/README.md b/translations/hr/6-NLP/3-Translation-Sentiment/README.md new file mode 100644 index 00000000..fc0d61ad --- /dev/null +++ b/translations/hr/6-NLP/3-Translation-Sentiment/README.md @@ -0,0 +1,200 @@ + +# Prijevod i analiza sentimenta s ML-om + +U prethodnim lekcijama naučili ste kako izraditi osnovnog bota koristeći `TextBlob`, biblioteku koja koristi strojno učenje iza kulisa za obavljanje osnovnih NLP zadataka poput izdvajanja imenskih fraza. Još jedan važan izazov u računalnoj lingvistici je točno _prevođenje_ rečenice s jednog govornog ili pisanog jezika na drugi. + +## [Pre-lecture kviz](https://ff-quizzes.netlify.app/en/ml/) + +Prevođenje je vrlo težak problem, dodatno otežan činjenicom da postoje tisuće jezika, od kojih svaki može imati vrlo različita gramatička pravila. Jedan pristup je pretvoriti formalna gramatička pravila jednog jezika, poput engleskog, u strukturu neovisnu o jeziku, a zatim je prevesti pretvaranjem natrag u drugi jezik. Ovaj pristup uključuje sljedeće korake: + +1. **Identifikacija**. Identificirajte ili označite riječi u ulaznom jeziku kao imenice, glagole itd. +2. **Izrada prijevoda**. Proizvedite izravan prijevod svake riječi u formatu ciljnog jezika. + +### Primjer rečenice, engleski na irski + +Na 'engleskom', rečenica _I feel happy_ sastoji se od tri riječi u sljedećem redoslijedu: + +- **subjekt** (I) +- **glagol** (feel) +- **pridjev** (happy) + +Međutim, na 'irskom' jeziku, ista rečenica ima vrlo drugačiju gramatičku strukturu - emocije poput "*happy*" ili "*sad*" izražavaju se kao da su *na tebi*. + +Engleska fraza `I feel happy` na irskom bi bila `Tá athas orm`. Doslovni prijevod bio bi `Sreća je na meni`. + +Govornik irskog jezika koji prevodi na engleski rekao bi `I feel happy`, a ne `Happy is upon me`, jer razumije značenje rečenice, čak i ako su riječi i struktura rečenice različite. + +Formalni redoslijed za rečenicu na irskom je: + +- **glagol** (Tá ili jest) +- **pridjev** (athas, ili sretan) +- **subjekt** (orm, ili na meni) + +## Prevođenje + +Naivan program za prevođenje mogao bi prevoditi samo riječi, ignorirajući strukturu rečenice. + +✅ Ako ste naučili drugi (ili treći ili više) jezik kao odrasla osoba, možda ste započeli razmišljanjem na svom materinjem jeziku, prevodeći koncept riječ po riječ u svojoj glavi na drugi jezik, a zatim izgovarajući svoj prijevod. Ovo je slično onome što rade naivni računalni programi za prevođenje. Važno je prijeći ovu fazu kako biste postigli tečnost! + +Naivno prevođenje dovodi do loših (i ponekad smiješnih) pogrešnih prijevoda: `I feel happy` doslovno se prevodi kao `Mise bhraitheann athas` na irskom. To znači (doslovno) `ja osjećam sreću` i nije valjana irska rečenica. Iako su engleski i irski jezici koji se govore na dva susjedna otoka, oni su vrlo različiti jezici s različitim gramatičkim strukturama. + +> Možete pogledati neke videozapise o irskim jezičnim tradicijama, poput [ovog](https://www.youtube.com/watch?v=mRIaLSdRMMs) + +### Pristupi strojnog učenja + +Do sada ste naučili o pristupu formalnih pravila u obradi prirodnog jezika. Drugi pristup je ignorirati značenje riječi i _umjesto toga koristiti strojno učenje za otkrivanje obrazaca_. Ovo može funkcionirati u prevođenju ako imate puno teksta (*korpus*) ili tekstova (*korpusi*) na izvornom i ciljanom jeziku. + +Na primjer, razmotrite slučaj *Ponos i predrasude*, poznatog engleskog romana koji je napisala Jane Austen 1813. godine. Ako konzultirate knjigu na engleskom i ljudski prijevod knjige na *francuski*, mogli biste otkriti fraze u jednoj koje su _idiomatski_ prevedene u drugu. To ćete učiniti za trenutak. + +Na primjer, kada se engleska fraza `I have no money` doslovno prevede na francuski, mogla bi postati `Je n'ai pas de monnaie`. "Monnaie" je nezgodan francuski 'lažni prijatelj', jer 'money' i 'monnaie' nisu sinonimi. Bolji prijevod koji bi ljudski prevoditelj mogao napraviti bio bi `Je n'ai pas d'argent`, jer bolje prenosi značenje da nemate novca (umjesto 'sitniša', što je značenje 'monnaie'). + +![monnaie](../../../../6-NLP/3-Translation-Sentiment/images/monnaie.png) + +> Slika od [Jen Looper](https://twitter.com/jenlooper) + +Ako ML model ima dovoljno ljudskih prijevoda na temelju kojih može izgraditi model, može poboljšati točnost prijevoda identificiranjem uobičajenih obrazaca u tekstovima koje su prethodno preveli stručni govornici oba jezika. + +### Vježba - prevođenje + +Možete koristiti `TextBlob` za prevođenje rečenica. Isprobajte poznatu prvu rečenicu **Ponosa i predrasuda**: + +```python +from textblob import TextBlob + +blob = TextBlob( + "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!" +) +print(blob.translate(to="fr")) + +``` + +`TextBlob` prilično dobro obavlja prijevod: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!". + +Može se tvrditi da je prijevod TextBlob-a daleko točniji, zapravo, od francuskog prijevoda knjige iz 1932. godine od V. Leconte i Ch. Pressoir: + +"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles." + +U ovom slučaju, prijevod informiran ML-om obavlja bolji posao od ljudskog prevoditelja koji nepotrebno stavlja riječi u usta originalnog autora radi 'jasnoće'. + +> Što se ovdje događa? I zašto je TextBlob tako dobar u prevođenju? Pa, iza kulisa koristi Google Translate, sofisticirani AI sposoban analizirati milijune fraza kako bi predvidio najbolje nizove za zadatak. Ovdje se ništa ne radi ručno i potrebna vam je internetska veza za korištenje `blob.translate`. + +✅ Isprobajte još nekoliko rečenica. Što je bolje, ML ili ljudski prijevod? U kojim slučajevima? + +## Analiza sentimenta + +Još jedno područje gdje strojno učenje može vrlo dobro funkcionirati je analiza sentimenta. Pristup bez ML-a sentimentu je identificiranje riječi i fraza koje su 'pozitivne' i 'negativne'. Zatim, s obzirom na novi tekst, izračunajte ukupnu vrijednost pozitivnih, negativnih i neutralnih riječi kako biste identificirali ukupni sentiment. + +Ovaj pristup se lako može prevariti, kao što ste možda vidjeli u zadatku Marvin - rečenica `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` je sarkastična, negativna rečenica, ali jednostavni algoritam detektira 'great', 'wonderful', 'glad' kao pozitivne i 'waste', 'lost' i 'dark' kao negativne. Ukupni sentiment je pod utjecajem ovih suprotstavljenih riječi. + +✅ Zastanite na trenutak i razmislite o tome kako kao govornici prenosimo sarkazam. Intonacija igra veliku ulogu. Pokušajte izgovoriti frazu "Well, that film was awesome" na različite načine kako biste otkrili kako vaš glas prenosi značenje. + +### Pristupi ML-a + +Pristup ML-a bio bi ručno prikupljanje negativnih i pozitivnih tekstova - tweetova, recenzija filmova ili bilo čega gdje je čovjek dao ocjenu *i* napisano mišljenje. Zatim se NLP tehnike mogu primijeniti na mišljenja i ocjene, tako da se pojavljuju obrasci (npr., pozitivne recenzije filmova imaju frazu 'Oscar worthy' više nego negativne recenzije filmova, ili pozitivne recenzije restorana kažu 'gourmet' mnogo više nego 'disgusting'). + +> ⚖️ **Primjer**: Ako radite u uredu političara i raspravlja se o nekom novom zakonu, birači bi mogli pisati uredu s e-mailovima koji podržavaju ili se protive određenom novom zakonu. Recimo da vam je zadatak čitati e-mailove i razvrstavati ih u 2 hrpe, *za* i *protiv*. Ako bi bilo puno e-mailova, mogli biste biti preopterećeni pokušajem da ih sve pročitate. Ne bi li bilo lijepo da bot može pročitati sve za vas, razumjeti ih i reći vam u koju hrpu svaki e-mail pripada? +> +> Jedan način da se to postigne je korištenje strojnog učenja. Model biste trenirali s dijelom *protiv* e-mailova i dijelom *za* e-mailova. Model bi imao tendenciju povezivanja fraza i riječi s protiv stranom i za stranom, *ali ne bi razumio nijedan sadržaj*, samo da se određene riječi i obrasci češće pojavljuju u *protiv* ili *za* e-mailovima. Mogli biste ga testirati s nekim e-mailovima koje niste koristili za treniranje modela i vidjeti dolazi li do istog zaključka kao i vi. Zatim, kada budete zadovoljni točnošću modela, mogli biste obrađivati buduće e-mailove bez potrebe da čitate svaki. + +✅ Zvuči li vam ovaj proces kao procesi koje ste koristili u prethodnim lekcijama? + +## Vježba - sentimentalne rečenice + +Sentiment se mjeri s *polaritetom* od -1 do 1, što znači da je -1 najnegativniji sentiment, a 1 najpozitivniji. Sentiment se također mjeri s ocjenom od 0 - 1 za objektivnost (0) i subjektivnost (1). + +Pogledajte ponovno *Ponos i predrasude* Jane Austen. Tekst je dostupan ovdje na [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm). Uzorak u nastavku prikazuje kratki program koji analizira sentiment prve i posljednje rečenice iz knjige i prikazuje njezin polaritet sentimenta i ocjenu subjektivnosti/objektivnosti. + +Trebali biste koristiti biblioteku `TextBlob` (opisanu gore) za određivanje `sentimenta` (ne morate pisati vlastiti kalkulator sentimenta) u sljedećem zadatku. + +```python +from textblob import TextBlob + +quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.""" + +quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them.""" + +sentiment1 = TextBlob(quote1).sentiment +sentiment2 = TextBlob(quote2).sentiment + +print(quote1 + " has a sentiment of " + str(sentiment1)) +print(quote2 + " has a sentiment of " + str(sentiment2)) +``` + +Vidite sljedeći izlaz: + +```output +It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146) + +Darcy, as well as Elizabeth, really loved them; and they were + both ever sensible of the warmest gratitude towards the persons + who, by bringing her into Derbyshire, had been the means of + uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8) +``` + +## Izazov - provjerite polaritet sentimenta + +Vaš zadatak je odrediti, koristeći polaritet sentimenta, ima li *Ponos i predrasude* više apsolutno pozitivnih rečenica nego apsolutno negativnih. Za ovaj zadatak možete pretpostaviti da je polaritetna ocjena od 1 ili -1 apsolutno pozitivna ili negativna. + +**Koraci:** + +1. Preuzmite [kopiju Ponosa i predrasuda](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) s Project Gutenberg kao .txt datoteku. Uklonite metapodatke na početku i kraju datoteke, ostavljajući samo originalni tekst +2. Otvorite datoteku u Pythonu i izdvojite sadržaj kao string +3. Kreirajte TextBlob koristeći string knjige +4. Analizirajte svaku rečenicu u knjizi u petlji + 1. Ako je polaritet 1 ili -1, pohranite rečenicu u niz ili popis pozitivnih ili negativnih poruka +5. Na kraju, ispišite sve pozitivne rečenice i negativne rečenice (odvojeno) i broj svake. + +Evo uzorka [rješenja](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb). + +✅ Provjera znanja + +1. Sentiment se temelji na riječima koje se koriste u rečenici, ali razumije li kod *riječi*? +2. Mislite li da je polaritet sentimenta točan, odnosno slažete li se s ocjenama? + 1. Konkretno, slažete li se ili ne slažete s apsolutno **pozitivnim** polaritetom sljedećih rečenica? + * “What an excellent father you have, girls!” said she, when the door was shut. + * “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect. + * How wonderfully these sort of things occur! + * I have the greatest dislike in the world to that sort of thing. + * Charlotte is an excellent manager, I dare say. + * “This is delightful indeed! + * I am so happy! + * Your idea of the ponies is delightful. + 2. Sljedeće 3 rečenice ocijenjene su apsolutno pozitivnim sentimentom, ali pri pažljivom čitanju, one nisu pozitivne rečenice. Zašto je analiza sentimenta mislila da su pozitivne rečenice? + * Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power. + * If I could but see you as happy! + * Our distress, my dear Lizzy, is very great. + 3. Slažete li se ili ne slažete s apsolutno **negativnim** polaritetom sljedećih rečenica? + - Everybody is disgusted with his pride. + - “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful. + - The pause was to Elizabeth’s feelings dreadful. + - It would be dreadful! + +✅ Svaki zaljubljenik u Jane Austen razumjet će da ona često koristi svoje knjige za kritiku smiješnijih aspekata engleskog društva iz razdoblja regencije. Elizabeth Bennett, glavni lik u *Ponosa i predrasuda*, je oštroumna društvena promatračica (poput autorice) i njezin jezik često je vrlo nijansiran. Čak i gospodin Darcy (ljubavni interes u priči) primjećuje Elizabethinu razigranu i zadirkujuću upotrebu jezika: "I have had the pleasure of your acquaintance long enough to know that you find great enjoyment in occasionally professing opinions which in fact are not your own." + +--- + +## 🚀Izazov + +Možete li učiniti Marvina još boljim tako da izvučete druge značajke iz korisničkog unosa? + +## [Post-lecture kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje +Postoji mnogo načina za izdvajanje sentimenta iz teksta. Razmislite o poslovnim primjenama koje bi mogle koristiti ovu tehniku. Razmislite o tome kako može poći po zlu. Pročitajte više o sofisticiranim sustavima spremnim za poduzeća koji analiziraju sentiment, poput [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott). Testirajte neke od rečenica iz "Ponosa i predrasuda" iznad i provjerite može li otkriti nijanse. + +## Zadatak + +[Poetska sloboda](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/3-Translation-Sentiment/assignment.md b/translations/hr/6-NLP/3-Translation-Sentiment/assignment.md new file mode 100644 index 00000000..251acf98 --- /dev/null +++ b/translations/hr/6-NLP/3-Translation-Sentiment/assignment.md @@ -0,0 +1,25 @@ + +# Poetska licenca + +## Upute + +U [ovom bilježniku](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) možete pronaći preko 500 pjesama Emily Dickinson koje su prethodno analizirane za sentiment koristeći Azure tekstualnu analitiku. Koristeći ovaj skup podataka, analizirajte ga koristeći tehnike opisane u lekciji. Odgovara li predloženi sentiment pjesme odluci sofisticiranije Azure usluge? Zašto ili zašto ne, po vašem mišljenju? Iznenađuje li vas nešto? + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ------------------------------------------------------------------------ | ------------------------------------------------------- | ------------------------ | +| | Predstavljen je bilježnik s kvalitetnom analizom uzorka autorovog rada | Bilježnik je nepotpun ili ne provodi analizu | Bilježnik nije predstavljen | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/3-Translation-Sentiment/solution/Julia/README.md b/translations/hr/6-NLP/3-Translation-Sentiment/solution/Julia/README.md new file mode 100644 index 00000000..0d9cbabe --- /dev/null +++ b/translations/hr/6-NLP/3-Translation-Sentiment/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/3-Translation-Sentiment/solution/R/README.md b/translations/hr/6-NLP/3-Translation-Sentiment/solution/R/README.md new file mode 100644 index 00000000..540a0244 --- /dev/null +++ b/translations/hr/6-NLP/3-Translation-Sentiment/solution/R/README.md @@ -0,0 +1,15 @@ + +ovo je privremeni rezervirani prostor + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden koristeći AI uslugu za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/4-Hotel-Reviews-1/README.md b/translations/hr/6-NLP/4-Hotel-Reviews-1/README.md new file mode 100644 index 00000000..1a4f2ebc --- /dev/null +++ b/translations/hr/6-NLP/4-Hotel-Reviews-1/README.md @@ -0,0 +1,417 @@ + +# Analiza sentimenta s recenzijama hotela - obrada podataka + +U ovom dijelu koristit ćete tehnike iz prethodnih lekcija za provođenje istraživačke analize velikog skupa podataka. Kada steknete dobar uvid u korisnost različitih stupaca, naučit ćete: + +- kako ukloniti nepotrebne stupce +- kako izračunati nove podatke na temelju postojećih stupaca +- kako spremiti dobiveni skup podataka za korištenje u završnom izazovu + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +### Uvod + +Do sada ste naučili kako se tekstualni podaci značajno razlikuju od numeričkih podataka. Ako je tekst napisan ili izgovoren od strane čovjeka, može se analizirati kako bi se pronašli obrasci, učestalosti, sentiment i značenje. Ova lekcija vas uvodi u stvarni skup podataka sa stvarnim izazovom: **[515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)** koji uključuje [CC0: Public Domain licencu](https://creativecommons.org/publicdomain/zero/1.0/). Podaci su prikupljeni s Booking.com-a iz javnih izvora. Autor skupa podataka je Jiashen Liu. + +### Priprema + +Trebat će vam: + +* Mogućnost pokretanja .ipynb bilježnica koristeći Python 3 +* pandas +* NLTK, [koji biste trebali instalirati lokalno](https://www.nltk.org/install.html) +* Skup podataka dostupan na Kaggleu [515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe). Skup podataka ima oko 230 MB kada se raspakira. Preuzmite ga u korijensku mapu `/data` povezanu s ovim NLP lekcijama. + +## Istraživačka analiza podataka + +Ovaj izazov pretpostavlja da gradite bot za preporuku hotela koristeći analizu sentimenta i ocjene gostiju. Skup podataka koji ćete koristiti uključuje recenzije 1493 različita hotela u 6 gradova. + +Koristeći Python, skup podataka recenzija hotela i NLTK-ovu analizu sentimenta, mogli biste otkriti: + +* Koje su najčešće korištene riječi i fraze u recenzijama? +* Jesu li službeni *tagovi* koji opisuju hotel povezani s ocjenama recenzija (npr. postoje li negativnije recenzije za određeni hotel od strane *Obitelji s malom djecom* nego od *Solo putnika*, što možda ukazuje da je hotel bolji za *Solo putnike*)? +* Slažu li se NLTK ocjene sentimenta s numeričkom ocjenom recenzenta? + +#### Skup podataka + +Istražimo skup podataka koji ste preuzeli i spremili lokalno. Otvorite datoteku u uređivaču poput VS Codea ili čak Excela. + +Naslovi u skupu podataka su sljedeći: + +*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng* + +Ovdje su grupirani na način koji bi mogao biti lakši za pregled: +##### Stupci hotela + +* `Hotel_Name`, `Hotel_Address`, `lat` (geografska širina), `lng` (geografska dužina) + * Koristeći *lat* i *lng* mogli biste nacrtati kartu u Pythonu koja prikazuje lokacije hotela (možda obojene prema negativnim i pozitivnim recenzijama) + * Hotel_Address nije očito koristan za nas, i vjerojatno ćemo ga zamijeniti državom radi lakšeg sortiranja i pretraživanja + +**Meta-recenzijski stupci hotela** + +* `Average_Score` + * Prema autoru skupa podataka, ovaj stupac predstavlja *Prosječnu ocjenu hotela, izračunatu na temelju najnovijeg komentara u posljednjih godinu dana*. Ovo se čini neobičnim načinom izračuna ocjene, ali to su podaci prikupljeni pa ih za sada možemo uzeti zdravo za gotovo. + + ✅ Na temelju drugih stupaca u ovom skupu podataka, možete li smisliti drugi način za izračun prosječne ocjene? + +* `Total_Number_of_Reviews` + * Ukupan broj recenzija koje je hotel primio - nije jasno (bez pisanja koda) odnosi li se to na recenzije u skupu podataka. +* `Additional_Number_of_Scoring` + * Ovo znači da je ocjena dana, ali nije napisana pozitivna ili negativna recenzija od strane recenzenta. + +**Stupci recenzija** + +- `Reviewer_Score` + - Ovo je numerička vrijednost s najviše jednom decimalom između minimalne i maksimalne vrijednosti 2.5 i 10 + - Nije objašnjeno zašto je 2.5 najniža moguća ocjena +- `Negative_Review` + - Ako recenzent nije ništa napisao, ovo polje će sadržavati "**No Negative**" + - Imajte na umu da recenzent može napisati pozitivnu recenziju u stupcu Negative review (npr. "nema ništa loše u ovom hotelu") +- `Review_Total_Negative_Word_Counts` + - Veći broj negativnih riječi ukazuje na nižu ocjenu (bez provjere sentimentalnosti) +- `Positive_Review` + - Ako recenzent nije ništa napisao, ovo polje će sadržavati "**No Positive**" + - Imajte na umu da recenzent može napisati negativnu recenziju u stupcu Positive review (npr. "u ovom hotelu nema ništa dobro") +- `Review_Total_Positive_Word_Counts` + - Veći broj pozitivnih riječi ukazuje na višu ocjenu (bez provjere sentimentalnosti) +- `Review_Date` i `days_since_review` + - Može se primijeniti mjera svježine ili zastarjelosti recenzije (starije recenzije možda nisu toliko točne kao novije jer se uprava hotela promijenila, izvršene su renovacije, dodan je bazen itd.) +- `Tags` + - Ovo su kratki opisi koje recenzent može odabrati kako bi opisao vrstu gosta (npr. solo ili obitelj), vrstu sobe koju su imali, duljinu boravka i način na koji je recenzija poslana. + - Nažalost, korištenje ovih tagova je problematično, pogledajte odjeljak u nastavku koji raspravlja o njihovoj korisnosti. + +**Stupci recenzenta** + +- `Total_Number_of_Reviews_Reviewer_Has_Given` + - Ovo bi moglo biti faktor u modelu preporuke, na primjer, ako možete utvrditi da su plodniji recenzenti s desecima recenzija skloniji negativnim nego pozitivnim ocjenama. Međutim, recenzent bilo koje pojedine recenzije nije identificiran jedinstvenim kodom, i stoga se ne može povezati s nizom recenzija. Postoji 30 recenzenata s 100 ili više recenzija, ali teško je vidjeti kako to može pomoći modelu preporuke. +- `Reviewer_Nationality` + - Neki bi mogli pomisliti da su određene nacionalnosti sklonije davanju pozitivnih ili negativnih recenzija zbog nacionalne sklonosti. Budite oprezni pri uključivanju takvih anegdotalnih pogleda u svoje modele. Ovo su nacionalni (a ponekad i rasni) stereotipi, a svaki recenzent je bio pojedinac koji je napisao recenziju na temelju svog iskustva. To iskustvo moglo je biti filtrirano kroz mnoge leće poput njihovih prethodnih boravaka u hotelima, udaljenosti koju su putovali i njihove osobne naravi. Teško je opravdati mišljenje da je njihova nacionalnost bila razlog za ocjenu recenzije. + +##### Primjeri + +| Prosječna ocjena | Ukupan broj recenzija | Ocjena recenzenta | Negativna
recenzija | Pozitivna recenzija | Tagovi | +| ----------------- | --------------------- | ----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- | +| 7.8 | 1945 | 2.5 | Ovo trenutno nije hotel već gradilište. Teroriziran sam od ranog jutra i cijeli dan neprihvatljivom bukom građevinskih radova dok sam se odmarao nakon dugog puta i radio u sobi. Ljudi su radili cijeli dan, npr. s bušilicama u susjednim sobama. Zatražio sam promjenu sobe, ali nije bilo tihe sobe. Da stvar bude gora, naplaćeno mi je više nego što je trebalo. Odjavio sam se navečer jer sam morao rano na let i dobio odgovarajući račun. Dan kasnije hotel je napravio dodatnu naplatu bez mog pristanka, iznad dogovorene cijene. Strašno mjesto. Nemojte se kažnjavati rezervacijom ovdje. | Ništa. Strašno mjesto. Klonite se. | Poslovno putovanje, Par, Standardna dvokrevetna soba, Boravak 2 noći | + +Kao što možete vidjeti, ovaj gost nije imao sretan boravak u ovom hotelu. Hotel ima dobru prosječnu ocjenu od 7.8 i 1945 recenzija, ali ovaj recenzent dao je ocjenu 2.5 i napisao 115 riječi o tome koliko je njihov boravak bio negativan. Ako nisu ništa napisali u stupcu Positive_Review, mogli biste zaključiti da nije bilo ništa pozitivno, ali ipak su napisali 7 riječi upozorenja. Ako bismo samo brojali riječi umjesto značenja ili sentimenta riječi, mogli bismo imati iskrivljen pogled na namjeru recenzenta. Zanimljivo, njihova ocjena od 2.5 je zbunjujuća, jer ako je boravak u hotelu bio tako loš, zašto uopće dati bodove? Istražujući skup podataka pažljivo, vidjet ćete da je najniža moguća ocjena 2.5, a ne 0. Najviša moguća ocjena je 10. + +##### Tagovi + +Kao što je gore spomenuto, na prvi pogled ideja korištenja `Tags` za kategorizaciju podataka ima smisla. Nažalost, ovi tagovi nisu standardizirani, što znači da u određenom hotelu opcije mogu biti *Single room*, *Twin room* i *Double room*, ali u sljedećem hotelu, one su *Deluxe Single Room*, *Classic Queen Room* i *Executive King Room*. Ovo bi moglo biti isto, ali postoji toliko varijacija da izbor postaje: + +1. Pokušati promijeniti sve izraze u jedan standard, što je vrlo teško, jer nije jasno koji bi put konverzije bio u svakom slučaju (npr. *Classic single room* mapira se na *Single room*, ali *Superior Queen Room with Courtyard Garden or City View* je mnogo teže mapirati) + +1. Možemo pristupiti NLP-u i mjeriti učestalost određenih izraza poput *Solo*, *Business Traveller* ili *Family with young kids* kako se primjenjuju na svaki hotel, i to uključiti u preporuku + +Tagovi su obično (ali ne uvijek) jedno polje koje sadrži popis od 5 do 6 vrijednosti odvojenih zarezima koje se odnose na *Vrstu putovanja*, *Vrstu gostiju*, *Vrstu sobe*, *Broj noćenja* i *Vrstu uređaja na kojem je recenzija poslana*. Međutim, budući da neki recenzenti ne popunjavaju svako polje (mogu ostaviti jedno prazno), vrijednosti nisu uvijek u istom redoslijedu. + +Na primjer, uzmite *Vrstu grupe*. Postoji 1025 jedinstvenih mogućnosti u ovom polju u stupcu `Tags`, i nažalost samo neki od njih odnose se na grupu (neki su vrsta sobe itd.). Ako filtrirate samo one koji spominju obitelj, rezultati sadrže mnoge rezultate tipa *Family room*. Ako uključite izraz *with*, tj. brojite vrijednosti *Family with*, rezultati su bolji, s preko 80,000 od 515,000 rezultata koji sadrže frazu "Family with young children" ili "Family with older children". + +To znači da stupac tagova nije potpuno beskoristan za nas, ali će zahtijevati određeni rad kako bi bio koristan. + +##### Prosječna ocjena hotela + +Postoji niz neobičnosti ili neslaganja u skupu podataka koje ne mogu objasniti, ali su ovdje ilustrirane kako biste bili svjesni njih prilikom izrade svojih modela. Ako ih uspijete razjasniti, javite nam u odjeljku za raspravu! + +Skup podataka ima sljedeće stupce koji se odnose na prosječnu ocjenu i broj recenzija: + +1. Hotel_Name +2. Additional_Number_of_Scoring +3. Average_Score +4. Total_Number_of_Reviews +5. Reviewer_Score + +Hotel s najviše recenzija u ovom skupu podataka je *Britannia International Hotel Canary Wharf* s 4789 recenzija od ukupno 515,000. Ali ako pogledamo vrijednost `Total_Number_of_Reviews` za ovaj hotel, ona iznosi 9086. Mogli biste zaključiti da postoji mnogo više ocjena bez recenzija, pa možda trebamo dodati vrijednost stupca `Additional_Number_of_Scoring`. Ta vrijednost iznosi 2682, a dodavanjem na 4789 dobivamo 7471, što je još uvijek 1615 manje od `Total_Number_of_Reviews`. + +Ako uzmete stupac `Average_Score`, mogli biste zaključiti da je to prosjek recenzija u skupu podataka, ali opis s Kagglea je "*Prosječna ocjena hotela, izračunata na temelju najnovijeg komentara u posljednjih godinu dana*". To se ne čini korisnim, ali možemo izračunati vlastiti prosjek na temelju ocjena recenzenata u skupu podataka. Koristeći isti hotel kao primjer, prosječna ocjena hotela je navedena kao 7.1, ali izračunata ocjena (prosječna ocjena recenzenata *u* skupu podataka) je 6.8. Ovo je blizu, ali nije ista vrijednost, i možemo samo pretpostaviti da su ocjene dane u recenzijama `Additional_Number_of_Scoring` povećale prosjek na 7.1. Nažalost, bez načina da testiramo ili dokažemo tu tvrdnju, teško je koristiti ili vjerovati `Average_Score`, `Additional_Number_of_Scoring` i `Total_Number_of_Reviews` kada se temelje na podacima koje nemamo. + +Da dodatno zakompliciramo stvari, hotel s drugim najvećim brojem recenzija ima izračunatu prosječnu ocjenu od 8.12, dok je `Average_Score` u skupu podataka 8.1. Je li ova točna ocjena slučajnost ili je prvi hotel neslaganje? + +S obzirom na mogućnost da bi ovi hoteli mogli biti iznimke, i da možda većina vrijednosti odgovara (ali neke ne iz nekog razloga), sljedeće ćemo napisati kratki program za istraživanje vrijednosti u skupu podataka i određivanje ispravne upotrebe (ili neupotrebe) vrijednosti. +> 🚨 Napomena upozorenja +> +> Kada radite s ovim skupom podataka, pisat ćete kod koji izračunava nešto iz teksta bez potrebe da sami čitate ili analizirate tekst. Ovo je suština NLP-a, interpretiranje značenja ili sentimenta bez potrebe da to radi čovjek. Međutim, moguće je da ćete pročitati neke od negativnih recenzija. Preporučujem da to ne radite, jer nije potrebno. Neke od njih su glupe ili nebitne negativne recenzije hotela, poput "Vrijeme nije bilo dobro", što je izvan kontrole hotela, ili bilo koga drugog. No, postoji i mračna strana nekih recenzija. Ponekad su negativne recenzije rasističke, seksističke ili diskriminiraju na temelju dobi. To je nesretno, ali očekivano u skupu podataka prikupljenom s javne web stranice. Neki recenzenti ostavljaju recenzije koje biste mogli smatrati neukusnima, neugodnima ili uznemirujućima. Bolje je pustiti kod da izmjeri sentiment nego da ih sami čitate i uzrujate se. Ipak, manjina je onih koji pišu takve stvari, ali oni ipak postoje. +## Vježba - Istraživanje podataka +### Učitajte podatke + +Dosta je bilo vizualnog pregleda podataka, sada ćete napisati malo koda i dobiti odgovore! Ovaj dio koristi biblioteku pandas. Vaš prvi zadatak je osigurati da možete učitati i pročitati CSV podatke. Biblioteka pandas ima brz učitavač za CSV, a rezultat se smješta u dataframe, kao u prethodnim lekcijama. CSV koji učitavamo ima više od pola milijuna redaka, ali samo 17 stupaca. Pandas vam pruža mnogo moćnih načina za rad s dataframeovima, uključujući mogućnost izvođenja operacija na svakom retku. + +Od sada nadalje u ovoj lekciji, bit će isječaka koda, objašnjenja koda i rasprava o tome što rezultati znače. Koristite priloženi _notebook.ipynb_ za svoj kod. + +Počnimo s učitavanjem datoteke s podacima koju ćete koristiti: + +```python +# Load the hotel reviews from CSV +import pandas as pd +import time +# importing time so the start and end time can be used to calculate file loading time +print("Loading data file now, this could take a while depending on file size") +start = time.time() +# df is 'DataFrame' - make sure you downloaded the file to the data folder +df = pd.read_csv('../../data/Hotel_Reviews.csv') +end = time.time() +print("Loading took " + str(round(end - start, 2)) + " seconds") +``` + +Sada kada su podaci učitani, možemo izvoditi neke operacije na njima. Držite ovaj kod na vrhu svog programa za sljedeći dio. + +## Istražite podatke + +U ovom slučaju, podaci su već *čisti*, što znači da su spremni za rad i ne sadrže znakove na drugim jezicima koji bi mogli zbuniti algoritme koji očekuju samo engleske znakove. + +✅ Možda ćete morati raditi s podacima koji zahtijevaju početnu obradu kako bi se formatirali prije primjene NLP tehnika, ali ne ovaj put. Da morate, kako biste se nosili s ne-engleskim znakovima? + +Odvojite trenutak da osigurate da, nakon što su podaci učitani, možete ih istražiti pomoću koda. Vrlo je lako poželjeti se usredotočiti na stupce `Negative_Review` i `Positive_Review`. Oni su ispunjeni prirodnim tekstom za vaše NLP algoritme. Ali pričekajte! Prije nego što se upustite u NLP i analizu sentimenta, trebali biste slijediti kod u nastavku kako biste utvrdili odgovaraju li vrijednosti u skupu podataka vrijednostima koje izračunate pomoću pandas. + +## Operacije s dataframeovima + +Prvi zadatak u ovoj lekciji je provjeriti jesu li sljedeće tvrdnje točne pisanjem koda koji ispituje dataframe (bez mijenjanja istog). + +> Kao i kod mnogih programerskih zadataka, postoji nekoliko načina za njihovo rješavanje, ali dobar savjet je učiniti to na najjednostavniji i najlakši način, posebno ako će biti lakše razumjeti kada se vratite ovom kodu u budućnosti. Kod dataframeova postoji sveobuhvatan API koji često ima način da učinkovito postignete ono što želite. + +Tretirajte sljedeća pitanja kao zadatke kodiranja i pokušajte ih riješiti bez gledanja rješenja. + +1. Ispišite *oblik* dataframea koji ste upravo učitali (oblik je broj redaka i stupaca). +2. Izračunajte učestalost pojavljivanja nacionalnosti recenzenata: + 1. Koliko različitih vrijednosti postoji za stupac `Reviewer_Nationality` i koje su to vrijednosti? + 2. Koja je nacionalnost recenzenata najčešća u skupu podataka (ispisati državu i broj recenzija)? + 3. Koje su sljedećih 10 najčešće pronađenih nacionalnosti i njihova učestalost? +3. Koji je hotel najčešće recenziran za svaku od 10 najčešćih nacionalnosti recenzenata? +4. Koliko recenzija ima po hotelu (učestalost recenzija po hotelu) u skupu podataka? +5. Iako postoji stupac `Average_Score` za svaki hotel u skupu podataka, možete također izračunati prosječnu ocjenu (dobivanjem prosjeka svih ocjena recenzenata u skupu podataka za svaki hotel). Dodajte novi stupac u svoj dataframe s naslovom stupca `Calc_Average_Score` koji sadrži taj izračunati prosjek. +6. Imaju li neki hoteli iste (zaokružene na jednu decimalu) vrijednosti `Average_Score` i `Calc_Average_Score`? + 1. Pokušajte napisati Python funkciju koja uzima Series (redak) kao argument i uspoređuje vrijednosti, ispisujući poruku kada vrijednosti nisu jednake. Zatim koristite metodu `.apply()` za obradu svakog retka pomoću funkcije. +7. Izračunajte i ispišite koliko redaka ima vrijednosti stupca `Negative_Review` kao "No Negative". +8. Izračunajte i ispišite koliko redaka ima vrijednosti stupca `Positive_Review` kao "No Positive". +9. Izračunajte i ispišite koliko redaka ima vrijednosti stupca `Positive_Review` kao "No Positive" **i** `Negative_Review` kao "No Negative". + +### Odgovori u kodu + +1. Ispišite *oblik* dataframea koji ste upravo učitali (oblik je broj redaka i stupaca). + + ```python + print("The shape of the data (rows, cols) is " + str(df.shape)) + > The shape of the data (rows, cols) is (515738, 17) + ``` + +2. Izračunajte učestalost pojavljivanja nacionalnosti recenzenata: + + 1. Koliko različitih vrijednosti postoji za stupac `Reviewer_Nationality` i koje su to vrijednosti? + 2. Koja je nacionalnost recenzenata najčešća u skupu podataka (ispisati državu i broj recenzija)? + + ```python + # value_counts() creates a Series object that has index and values in this case, the country and the frequency they occur in reviewer nationality + nationality_freq = df["Reviewer_Nationality"].value_counts() + print("There are " + str(nationality_freq.size) + " different nationalities") + # print first and last rows of the Series. Change to nationality_freq.to_string() to print all of the data + print(nationality_freq) + + There are 227 different nationalities + United Kingdom 245246 + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + ... + Comoros 1 + Palau 1 + Northern Mariana Islands 1 + Cape Verde 1 + Guinea 1 + Name: Reviewer_Nationality, Length: 227, dtype: int64 + ``` + + 3. Koje su sljedećih 10 najčešće pronađenih nacionalnosti i njihova učestalost? + + ```python + print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.") + # Notice there is a leading space on the values, strip() removes that for printing + # What is the top 10 most common nationalities and their frequencies? + print("The next 10 highest frequency reviewer nationalities are:") + print(nationality_freq[1:11].to_string()) + + The highest frequency reviewer nationality is United Kingdom with 245246 reviews. + The next 10 highest frequency reviewer nationalities are: + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + Saudi Arabia 8951 + Netherlands 8772 + Switzerland 8678 + Germany 7941 + Canada 7894 + France 7296 + ``` + +3. Koji je hotel najčešće recenziran za svaku od 10 najčešćih nacionalnosti recenzenata? + + ```python + # What was the most frequently reviewed hotel for the top 10 nationalities + # Normally with pandas you will avoid an explicit loop, but wanted to show creating a new dataframe using criteria (don't do this with large amounts of data because it could be very slow) + for nat in nationality_freq[:10].index: + # First, extract all the rows that match the criteria into a new dataframe + nat_df = df[df["Reviewer_Nationality"] == nat] + # Now get the hotel freq + freq = nat_df["Hotel_Name"].value_counts() + print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.") + + The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews. + The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews. + The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews. + The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews. + The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews. + The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews. + The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews. + The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews. + The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews. + The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews. + ``` + +4. Koliko recenzija ima po hotelu (učestalost recenzija po hotelu) u skupu podataka? + + ```python + # First create a new dataframe based on the old one, removing the uneeded columns + hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1) + + # Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found + hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count') + + # Get rid of all the duplicated rows + hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"]) + display(hotel_freq_df) + ``` + | Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found | + | :----------------------------------------: | :---------------------: | :-----------------: | + | Britannia International Hotel Canary Wharf | 9086 | 4789 | + | Park Plaza Westminster Bridge London | 12158 | 4169 | + | Copthorne Tara Hotel London Kensington | 7105 | 3578 | + | ... | ... | ... | + | Mercure Paris Porte d Orleans | 110 | 10 | + | Hotel Wagner | 135 | 10 | + | Hotel Gallitzinberg | 173 | 8 | + + Možda ćete primijetiti da se *broj recenzija u skupu podataka* ne podudara s vrijednošću u `Total_Number_of_Reviews`. Nije jasno predstavlja li ova vrijednost ukupan broj recenzija koje je hotel imao, ali nisu sve prikupljene, ili neki drugi izračun. `Total_Number_of_Reviews` se ne koristi u modelu zbog ove nejasnoće. + +5. Iako postoji stupac `Average_Score` za svaki hotel u skupu podataka, možete također izračunati prosječnu ocjenu (dobivanjem prosjeka svih ocjena recenzenata u skupu podataka za svaki hotel). Dodajte novi stupac u svoj dataframe s naslovom stupca `Calc_Average_Score` koji sadrži taj izračunati prosjek. Ispišite stupce `Hotel_Name`, `Average_Score` i `Calc_Average_Score`. + + ```python + # define a function that takes a row and performs some calculation with it + def get_difference_review_avg(row): + return row["Average_Score"] - row["Calc_Average_Score"] + + # 'mean' is mathematical word for 'average' + df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + + # Add a new column with the difference between the two average scores + df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1) + + # Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel) + review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"]) + + # Sort the dataframe to find the lowest and highest average score difference + review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"]) + + display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]]) + ``` + + Možda ćete se zapitati o vrijednosti `Average_Score` i zašto je ponekad različita od izračunate prosječne ocjene. Kako ne možemo znati zašto se neke vrijednosti podudaraju, a druge imaju razliku, najsigurnije je u ovom slučaju koristiti ocjene recenzenata koje imamo za izračun prosjeka. Ipak, razlike su obično vrlo male, evo hotela s najvećim odstupanjem između prosječne ocjene iz skupa podataka i izračunate prosječne ocjene: + + | Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Name | + | :----------------------: | :-----------: | :----------------: | ------------------------------------------: | + | -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria | + | -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery | + | -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans | + | -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel | + | -0.5 | 7.0 | 7.5 | Hotel Royal Elys es | + | ... | ... | ... | ... | + | 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre | + | 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur | + | 0.9 | 6.8 | 5.9 | Villa Eugenie | + | 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux | + | 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar | + + S obzirom na to da samo 1 hotel ima razliku u ocjeni veću od 1, to znači da vjerojatno možemo zanemariti razliku i koristiti izračunatu prosječnu ocjenu. + +6. Izračunajte i ispišite koliko redaka ima vrijednosti stupca `Negative_Review` kao "No Negative". + +7. Izračunajte i ispišite koliko redaka ima vrijednosti stupca `Positive_Review` kao "No Positive". + +8. Izračunajte i ispišite koliko redaka ima vrijednosti stupca `Positive_Review` kao "No Positive" **i** `Negative_Review` kao "No Negative". + + ```python + # with lambdas: + start = time.time() + no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1) + print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index))) + + no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index))) + + both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index))) + end = time.time() + print("Lambdas took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Lambdas took 9.64 seconds + ``` + +## Drugi način + +Drugi način brojanja stavki bez Lambdi, koristeći sum za brojanje redaka: + + ```python + # without lambdas (using a mixture of notations to show you can use both) + start = time.time() + no_negative_reviews = sum(df.Negative_Review == "No Negative") + print("Number of No Negative reviews: " + str(no_negative_reviews)) + + no_positive_reviews = sum(df["Positive_Review"] == "No Positive") + print("Number of No Positive reviews: " + str(no_positive_reviews)) + + both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive")) + print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews)) + + end = time.time() + print("Sum took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Sum took 0.19 seconds + ``` + + Možda ste primijetili da postoji 127 redaka koji imaju i "No Negative" i "No Positive" vrijednosti za stupce `Negative_Review` i `Positive_Review`. To znači da je recenzent dao hotelu numeričku ocjenu, ali je odbio napisati pozitivnu ili negativnu recenziju. Srećom, ovo je mali broj redaka (127 od 515738, ili 0,02%), tako da vjerojatno neće utjecati na naš model ili rezultate u bilo kojem smjeru, ali možda niste očekivali da skup podataka sadrži retke bez recenzija, pa vrijedi istražiti podatke kako biste otkrili takve retke. + +Sada kada ste istražili skup podataka, u sljedećoj lekciji filtrirat ćete podatke i dodati analizu sentimenta. + +--- +## 🚀Izazov + +Ova lekcija pokazuje, kao što smo vidjeli u prethodnim lekcijama, koliko je kritično važno razumjeti svoje podatke i njihove specifičnosti prije izvođenja operacija na njima. Tekstualni podaci, posebno, zahtijevaju pažljivo ispitivanje. Pregledajte različite skupove podataka bogate tekstom i provjerite možete li otkriti područja koja bi mogla unijeti pristranost ili iskrivljeni sentiment u model. + +## [Post-lecture kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Prođite [ovaj put učenja o NLP-u](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) kako biste otkrili alate koje možete isprobati prilikom izrade modela temeljenih na govoru i tekstu. + +## Zadatak + +[NLTK](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/4-Hotel-Reviews-1/assignment.md b/translations/hr/6-NLP/4-Hotel-Reviews-1/assignment.md new file mode 100644 index 00000000..2be299cd --- /dev/null +++ b/translations/hr/6-NLP/4-Hotel-Reviews-1/assignment.md @@ -0,0 +1,19 @@ + +# NLTK + +## Upute + +NLTK je poznata biblioteka za primjenu u računalnoj lingvistici i obradi prirodnog jezika. Iskoristite ovu priliku da pročitate '[NLTK knjigu](https://www.nltk.org/book/)' i isprobate njezine vježbe. U ovom zadatku bez ocjenjivanja, bolje ćete upoznati ovu biblioteku. + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md b/translations/hr/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md new file mode 100644 index 00000000..29745132 --- /dev/null +++ b/translations/hr/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/4-Hotel-Reviews-1/solution/R/README.md b/translations/hr/6-NLP/4-Hotel-Reviews-1/solution/R/README.md new file mode 100644 index 00000000..84cb9812 --- /dev/null +++ b/translations/hr/6-NLP/4-Hotel-Reviews-1/solution/R/README.md @@ -0,0 +1,15 @@ + +ovo je privremeni rezervirani prostor + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/5-Hotel-Reviews-2/README.md b/translations/hr/6-NLP/5-Hotel-Reviews-2/README.md new file mode 100644 index 00000000..a2510d3c --- /dev/null +++ b/translations/hr/6-NLP/5-Hotel-Reviews-2/README.md @@ -0,0 +1,389 @@ + +# Analiza sentimenta s recenzijama hotela + +Sada kada ste detaljno istražili skup podataka, vrijeme je da filtrirate stupce i primijenite NLP tehnike na skup podataka kako biste dobili nove uvide o hotelima. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +### Operacije filtriranja i analize sentimenta + +Kao što ste vjerojatno primijetili, skup podataka ima nekoliko problema. Neki stupci sadrže beskorisne informacije, dok se drugi čine netočnima. Ako su točni, nije jasno kako su izračunati, a odgovore ne možete neovisno provjeriti vlastitim izračunima. + +## Vježba: malo više obrade podataka + +Očistite podatke još malo. Dodajte stupce koji će biti korisni kasnije, promijenite vrijednosti u drugim stupcima i potpuno uklonite određene stupce. + +1. Početna obrada stupaca + + 1. Uklonite `lat` i `lng` + + 2. Zamijenite vrijednosti u `Hotel_Address` sljedećim vrijednostima (ako adresa sadrži ime grada i države, promijenite je tako da ostanu samo grad i država). + + Ovo su jedini gradovi i države u skupu podataka: + + Amsterdam, Nizozemska + + Barcelona, Španjolska + + London, Ujedinjeno Kraljevstvo + + Milano, Italija + + Pariz, Francuska + + Beč, Austrija + + ```python + def replace_address(row): + if "Netherlands" in row["Hotel_Address"]: + return "Amsterdam, Netherlands" + elif "Barcelona" in row["Hotel_Address"]: + return "Barcelona, Spain" + elif "United Kingdom" in row["Hotel_Address"]: + return "London, United Kingdom" + elif "Milan" in row["Hotel_Address"]: + return "Milan, Italy" + elif "France" in row["Hotel_Address"]: + return "Paris, France" + elif "Vienna" in row["Hotel_Address"]: + return "Vienna, Austria" + + # Replace all the addresses with a shortened, more useful form + df["Hotel_Address"] = df.apply(replace_address, axis = 1) + # The sum of the value_counts() should add up to the total number of reviews + print(df["Hotel_Address"].value_counts()) + ``` + + Sada možete upitima dohvatiti podatke na razini države: + + ```python + display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"})) + ``` + + | Hotel_Address | Hotel_Name | + | :--------------------- | :--------: | + | Amsterdam, Netherlands | 105 | + | Barcelona, Spain | 211 | + | London, United Kingdom | 400 | + | Milan, Italy | 162 | + | Paris, France | 458 | + | Vienna, Austria | 158 | + +2. Obrada stupaca meta-recenzija hotela + + 1. Uklonite `Additional_Number_of_Scoring` + + 2. Zamijenite `Total_Number_of_Reviews` ukupnim brojem recenzija za taj hotel koje su stvarno prisutne u skupu podataka + + 3. Zamijenite `Average_Score` vlastitim izračunatim prosjekom + + ```python + # Drop `Additional_Number_of_Scoring` + df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True) + # Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values + df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count') + df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + ``` + +3. Obrada stupaca recenzija + + 1. Uklonite `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` i `days_since_review` + + 2. Zadržite `Reviewer_Score`, `Negative_Review` i `Positive_Review` kakvi jesu + + 3. Zadržite `Tags` za sada + + - U sljedećem dijelu ćemo provesti dodatne operacije filtriranja na oznakama, a zatim će oznake biti uklonjene + +4. Obrada stupaca recenzenta + + 1. Uklonite `Total_Number_of_Reviews_Reviewer_Has_Given` + + 2. Zadržite `Reviewer_Nationality` + +### Stupac oznaka + +Stupac `Tag` je problematičan jer je popis (u tekstualnom obliku) pohranjen u stupcu. Nažalost, redoslijed i broj podsekcija u ovom stupcu nisu uvijek isti. Teško je ljudima identificirati točne fraze koje bi ih mogle zanimati, jer postoji 515.000 redaka i 1427 hotela, a svaki ima malo drugačije opcije koje recenzent može odabrati. Tu dolazi NLP do izražaja. Možete skenirati tekst i pronaći najčešće fraze te ih prebrojati. + +Nažalost, ne zanima nas pojedinačne riječi, već višerječne fraze (npr. *Poslovno putovanje*). Pokretanje algoritma za distribuciju frekvencije višerječnih fraza na tolikoj količini podataka (6762646 riječi) moglo bi potrajati iznimno dugo, ali bez pregleda podataka čini se da je to nužan trošak. Tu dolazi do izražaja istraživačka analiza podataka, jer ste vidjeli uzorak oznaka poput `[' Poslovno putovanje ', ' Solo putnik ', ' Jednokrevetna soba ', ' Boravak od 5 noći ', ' Poslano s mobilnog uređaja ']`, možete početi postavljati pitanje je li moguće značajno smanjiti obradu koju morate obaviti. Srećom, jest - ali prvo morate slijediti nekoliko koraka kako biste utvrdili oznake od interesa. + +### Filtriranje oznaka + +Zapamtite da je cilj skupa podataka dodati sentiment i stupce koji će vam pomoći odabrati najbolji hotel (za sebe ili možda za klijenta koji od vas traži da napravite bot za preporuku hotela). Morate se zapitati jesu li oznake korisne ili ne u konačnom skupu podataka. Evo jedne interpretacije (ako vam je skup podataka potreban iz drugih razloga, različite oznake bi mogle ostati/izaći iz odabira): + +1. Vrsta putovanja je relevantna i treba ostati +2. Vrsta grupe gostiju je važna i treba ostati +3. Vrsta sobe, apartmana ili studija u kojem je gost boravio nije relevantna (svi hoteli imaju otprilike iste sobe) +4. Uređaj s kojeg je recenzija poslana nije relevantan +5. Broj noći koje je recenzent boravio *mogao bi* biti relevantan ako dulji boravak povežete s većim zadovoljstvom hotelom, ali to je upitno i vjerojatno nije relevantno + +Ukratko, **zadržite 2 vrste oznaka i uklonite ostale**. + +Prvo, ne želite brojati oznake dok nisu u boljem formatu, što znači uklanjanje uglatih zagrada i navodnika. To možete učiniti na nekoliko načina, ali želite najbrži jer bi obrada velike količine podataka mogla potrajati dugo. Srećom, pandas ima jednostavan način za svaki od ovih koraka. + +```Python +# Remove opening and closing brackets +df.Tags = df.Tags.str.strip("[']") +# remove all quotes too +df.Tags = df.Tags.str.replace(" ', '", ",", regex = False) +``` + +Svaka oznaka postaje nešto poput: `Poslovno putovanje, Solo putnik, Jednokrevetna soba, Boravak od 5 noći, Poslano s mobilnog uređaja`. + +Zatim nailazimo na problem. Neke recenzije ili redci imaju 5 stupaca, neke 3, neke 6. To je rezultat načina na koji je skup podataka stvoren i teško ga je popraviti. Želite dobiti frekvencijski broj svake fraze, ali one su u različitom redoslijedu u svakoj recenziji, pa brojanje može biti netočno, a hotel možda neće dobiti oznaku koja mu pripada. + +Umjesto toga, iskoristit ćete različit redoslijed u svoju korist, jer je svaka oznaka višerječna, ali također odvojena zarezom! Najjednostavniji način za to je stvaranje 6 privremenih stupaca, pri čemu se svaka oznaka umetne u stupac koji odgovara njezinom redoslijedu u oznaci. Zatim možete spojiti tih 6 stupaca u jedan veliki stupac i pokrenuti metodu `value_counts()` na rezultirajućem stupcu. Kada to ispišete, vidjet ćete da je bilo 2428 jedinstvenih oznaka. Evo malog uzorka: + +| Oznaka | Broj | +| ------------------------------- | ------ | +| Rekreacijsko putovanje | 417778 | +| Poslano s mobilnog uređaja | 307640 | +| Par | 252294 | +| Boravak od 1 noći | 193645 | +| Boravak od 2 noći | 133937 | +| Solo putnik | 108545 | +| Boravak od 3 noći | 95821 | +| Poslovno putovanje | 82939 | +| Grupa | 65392 | +| Obitelj s malom djecom | 61015 | +| Boravak od 4 noći | 47817 | +| Dvokrevetna soba | 35207 | +| Standardna dvokrevetna soba | 32248 | +| Superior dvokrevetna soba | 31393 | +| Obitelj sa starijom djecom | 26349 | +| Deluxe dvokrevetna soba | 24823 | +| Dvokrevetna ili twin soba | 22393 | +| Boravak od 5 noći | 20845 | +| Standardna dvokrevetna ili twin | 17483 | +| Klasična dvokrevetna soba | 16989 | +| Superior dvokrevetna ili twin | 13570 | +| 2 sobe | 12393 | + +Neke od uobičajenih oznaka poput `Poslano s mobilnog uređaja` nisu nam korisne, pa bi bilo pametno ukloniti ih prije brojanja pojavljivanja fraza, ali to je tako brza operacija da ih možete ostaviti i ignorirati. + +### Uklanjanje oznaka duljine boravka + +Uklanjanje ovih oznaka je prvi korak, što malo smanjuje ukupan broj oznaka koje treba razmotriti. Napominjemo da ih ne uklanjate iz skupa podataka, već ih samo odlučujete ukloniti iz razmatranja kao vrijednosti koje treba brojati/zadržati u skupu podataka recenzija. + +| Duljina boravka | Broj | +| --------------- | ------ | +| Boravak od 1 noći | 193645 | +| Boravak od 2 noći | 133937 | +| Boravak od 3 noći | 95821 | +| Boravak od 4 noći | 47817 | +| Boravak od 5 noći | 20845 | +| Boravak od 6 noći | 9776 | +| Boravak od 7 noći | 7399 | +| Boravak od 8 noći | 2502 | +| Boravak od 9 noći | 1293 | +| ... | ... | + +Postoji veliki broj soba, apartmana, studija, stanova i tako dalje. Svi oni znače otprilike isto i nisu relevantni za vas, pa ih uklonite iz razmatranja. + +| Vrsta sobe | Broj | +| --------------------------- | ----- | +| Dvokrevetna soba | 35207 | +| Standardna dvokrevetna soba | 32248 | +| Superior dvokrevetna soba | 31393 | +| Deluxe dvokrevetna soba | 24823 | +| Dvokrevetna ili twin soba | 22393 | +| Standardna dvokrevetna ili twin | 17483 | +| Klasična dvokrevetna soba | 16989 | +| Superior dvokrevetna ili twin | 13570 | + +Na kraju, i ovo je sjajno (jer nije zahtijevalo puno obrade), ostat ćete s sljedećim *korisnim* oznakama: + +| Oznaka | Broj | +| ------------------------------------------- | ------ | +| Rekreacijsko putovanje | 417778 | +| Par | 252294 | +| Solo putnik | 108545 | +| Poslovno putovanje | 82939 | +| Grupa (kombinirano s Putnici s prijateljima)| 67535 | +| Obitelj s malom djecom | 61015 | +| Obitelj sa starijom djecom | 26349 | +| S kućnim ljubimcem | 1405 | + +Možete tvrditi da je `Putnici s prijateljima` isto što i `Grupa` više-manje, i bilo bi pošteno kombinirati te dvije oznake kao gore. Kod za identifikaciju ispravnih oznaka nalazi se u [bilježnici s oznakama](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb). + +Završni korak je stvaranje novih stupaca za svaku od ovih oznaka. Zatim, za svaki red recenzije, ako stupac `Tag` odgovara jednom od novih stupaca, dodajte 1, ako ne, dodajte 0. Krajnji rezultat bit će broj koliko je recenzenata odabralo ovaj hotel (u zbiru) za, recimo, poslovno naspram rekreacijskog putovanja, ili za dolazak s kućnim ljubimcem, i to su korisne informacije pri preporuci hotela. + +```python +# Process the Tags into new columns +# The file Hotel_Reviews_Tags.py, identifies the most important tags +# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends, +# Family with young children, Family with older children, With a pet +df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0) +df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0) +df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0) +df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0) +df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0) +df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0) +df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0) +df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0) + +``` + +### Spremite datoteku + +Na kraju, spremite skup podataka kakav je sada s novim imenom. + +```python +df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True) + +# Saving new data file with calculated columns +print("Saving results to Hotel_Reviews_Filtered.csv") +df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False) +``` + +## Operacije analize sentimenta + +U ovom završnom dijelu primijenit ćete analizu sentimenta na stupce recenzija i spremiti rezultate u skup podataka. + +## Vježba: učitajte i spremite filtrirane podatke + +Napominjemo da sada učitavate filtrirani skup podataka koji je spremljen u prethodnom dijelu, **ne** originalni skup podataka. + +```python +import time +import pandas as pd +import nltk as nltk +from nltk.corpus import stopwords +from nltk.sentiment.vader import SentimentIntensityAnalyzer +nltk.download('vader_lexicon') + +# Load the filtered hotel reviews from CSV +df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv') + +# You code will be added here + + +# Finally remember to save the hotel reviews with new NLP data added +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False) +``` + +### Uklanjanje stop riječi + +Ako biste pokrenuli analizu sentimenta na stupcima negativnih i pozitivnih recenzija, to bi moglo potrajati dugo. Testirano na snažnom testnom prijenosnom računalu s brzim CPU-om, trajalo je 12 - 14 minuta ovisno o tome koja je biblioteka za analizu sentimenta korištena. To je (relativno) dugo vrijeme, pa vrijedi istražiti može li se ubrzati. + +Uklanjanje stop riječi, odnosno uobičajenih engleskih riječi koje ne mijenjaju sentiment rečenice, prvi je korak. Uklanjanjem tih riječi analiza sentimenta trebala bi se brže izvršiti, ali ne biti manje točna (jer stop riječi ne utječu na sentiment, ali usporavaju analizu). + +Najduža negativna recenzija imala je 395 riječi, ali nakon uklanjanja stop riječi, ima 195 riječi. + +Uklanjanje stop riječi također je brza operacija, uklanjanje stop riječi iz 2 stupca recenzija preko 515.000 redaka trajalo je 3,3 sekunde na testnom uređaju. Može potrajati malo više ili manje vremena ovisno o brzini vašeg CPU-a, RAM-u, imate li SSD ili ne, i nekim drugim čimbenicima. Relativna kratkoća operacije znači da, ako poboljšava vrijeme analize sentimenta, vrijedi je provesti. + +```python +from nltk.corpus import stopwords + +# Load the hotel reviews from CSV +df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv") + +# Remove stop words - can be slow for a lot of text! +# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches +# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends +start = time.time() +cache = set(stopwords.words("english")) +def remove_stopwords(review): + text = " ".join([word for word in review.split() if word not in cache]) + return text + +# Remove the stop words from both columns +df.Negative_Review = df.Negative_Review.apply(remove_stopwords) +df.Positive_Review = df.Positive_Review.apply(remove_stopwords) +``` + +### Provođenje analize sentimenta + +Sada biste trebali izračunati analizu sentimenta za stupce negativnih i pozitivnih recenzija te spremiti rezultat u 2 nova stupca. Test sentimenta bit će usporedba s ocjenom recenzenta za istu recenziju. Na primjer, ako sentiment pokazuje da negativna recenzija ima sentiment 1 (iznimno pozitivan sentiment) i sentiment pozitivne recenzije također 1, ali recenzent je hotelu dao najnižu moguću ocjenu, tada tekst recenzije ne odgovara ocjeni ili analizator sentimenta nije mogao ispravno prepoznati sentiment. Trebali biste očekivati da će neki rezultati sentimenta biti potpuno pogrešni, a često će to biti objašnjivo, npr. recenzija bi mogla biti iznimno sarkastična "Naravno da sam OBOŽAVAO spavati u sobi bez grijanja" i analizator sentimenta misli da je to pozitivan sentiment, iako bi čovjek koji to čita znao da je to sarkazam. +NLTK nudi različite analizatore sentimenta za učenje, a možete ih zamijeniti i provjeriti je li sentiment precizniji ili manje precizan. Ovdje se koristi VADER analiza sentimenta. + +> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, lipanj 2014. + +```python +from nltk.sentiment.vader import SentimentIntensityAnalyzer + +# Create the vader sentiment analyser (there are others in NLTK you can try too) +vader_sentiment = SentimentIntensityAnalyzer() +# Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014. + +# There are 3 possibilities of input for a review: +# It could be "No Negative", in which case, return 0 +# It could be "No Positive", in which case, return 0 +# It could be a review, in which case calculate the sentiment +def calc_sentiment(review): + if review == "No Negative" or review == "No Positive": + return 0 + return vader_sentiment.polarity_scores(review)["compound"] +``` + +Kasnije u programu, kada budete spremni za izračunavanje sentimenta, možete ga primijeniti na svaku recenziju na sljedeći način: + +```python +# Add a negative sentiment and positive sentiment column +print("Calculating sentiment columns for both positive and negative reviews") +start = time.time() +df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment) +df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment) +end = time.time() +print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds") +``` + +Ovo traje otprilike 120 sekundi na mom računalu, ali vrijeme će varirati ovisno o računalu. Ako želite ispisati rezultate i provjeriti odgovara li sentiment recenziji: + +```python +df = df.sort_values(by=["Negative_Sentiment"], ascending=True) +print(df[["Negative_Review", "Negative_Sentiment"]]) +df = df.sort_values(by=["Positive_Sentiment"], ascending=True) +print(df[["Positive_Review", "Positive_Sentiment"]]) +``` + +Posljednja stvar koju trebate učiniti s datotekom prije nego što je upotrijebite u izazovu jest spremiti je! Također biste trebali razmisliti o preuređivanju svih novih stupaca kako bi bili lakši za rad (za čovjeka, to je kozmetička promjena). + +```python +# Reorder the columns (This is cosmetic, but to make it easier to explore the data later) +df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1) + +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False) +``` + +Trebali biste pokrenuti cijeli kod za [bilježnicu analize](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (nakon što ste pokrenuli [bilježnicu za filtriranje](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) kako biste generirali datoteku Hotel_Reviews_Filtered.csv). + +Za pregled, koraci su: + +1. Izvorna datoteka **Hotel_Reviews.csv** istražena je u prethodnoj lekciji pomoću [bilježnice za istraživanje](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb) +2. Hotel_Reviews.csv filtriran je pomoću [bilježnice za filtriranje](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb), što rezultira datotekom **Hotel_Reviews_Filtered.csv** +3. Hotel_Reviews_Filtered.csv obrađen je pomoću [bilježnice za analizu sentimenta](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb), što rezultira datotekom **Hotel_Reviews_NLP.csv** +4. Koristite Hotel_Reviews_NLP.csv u NLP izazovu u nastavku + +### Zaključak + +Kada ste započeli, imali ste skup podataka sa stupcima i podacima, ali ne sve od njih mogli ste provjeriti ili koristiti. Istražili ste podatke, filtrirali ono što vam nije potrebno, pretvorili oznake u nešto korisno, izračunali vlastite prosjeke, dodali stupce sentimenta i, nadamo se, naučili nešto zanimljivo o obradi prirodnog teksta. + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Izazov + +Sada kada ste analizirali svoj skup podataka za sentiment, pokušajte koristiti strategije koje ste naučili u ovom kurikulumu (možda klasteriranje?) kako biste odredili obrasce vezane uz sentiment. + +## Pregled i samostalno učenje + +Proučite [ovaj modul na Learn platformi](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) kako biste saznali više i koristili različite alate za istraživanje sentimenta u tekstu. + +## Zadatak + +[Isprobajte drugi skup podataka](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prijevod [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/5-Hotel-Reviews-2/assignment.md b/translations/hr/6-NLP/5-Hotel-Reviews-2/assignment.md new file mode 100644 index 00000000..0b6f6dd0 --- /dev/null +++ b/translations/hr/6-NLP/5-Hotel-Reviews-2/assignment.md @@ -0,0 +1,25 @@ + +# Isprobajte drugi skup podataka + +## Upute + +Sada kada ste naučili kako koristiti NLTK za dodjelu sentimenta tekstu, isprobajte drugi skup podataka. Vjerojatno ćete trebati obraditi podatke, pa kreirajte bilježnicu i dokumentirajte svoj proces razmišljanja. Što otkrivate? + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ---------------------- | +| | Predstavljena je kompletna bilježnica i skup podataka s dobro dokumentiranim ćelijama koje objašnjavaju kako se sentiment dodjeljuje | Bilježnica nedostaje dobrih objašnjenja | Bilježnica je manjkava | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden koristeći AI uslugu za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md b/translations/hr/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md new file mode 100644 index 00000000..69cb5c58 --- /dev/null +++ b/translations/hr/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/5-Hotel-Reviews-2/solution/R/README.md b/translations/hr/6-NLP/5-Hotel-Reviews-2/solution/R/README.md new file mode 100644 index 00000000..f3aa2c19 --- /dev/null +++ b/translations/hr/6-NLP/5-Hotel-Reviews-2/solution/R/README.md @@ -0,0 +1,15 @@ + +ovo je privremeni rezervirani prostor + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/README.md b/translations/hr/6-NLP/README.md new file mode 100644 index 00000000..b51274bc --- /dev/null +++ b/translations/hr/6-NLP/README.md @@ -0,0 +1,38 @@ + +# Početak rada s obradom prirodnog jezika + +Obrada prirodnog jezika (NLP) je sposobnost računalnog programa da razumije ljudski jezik onako kako se govori i piše – poznat kao prirodni jezik. To je komponenta umjetne inteligencije (AI). NLP postoji više od 50 godina i ima korijene u području lingvistike. Cijelo područje usmjereno je na pomoć strojevima da razumiju i obrađuju ljudski jezik. To se zatim može koristiti za obavljanje zadataka poput provjere pravopisa ili strojne prijevode. Ima razne primjene u stvarnom svijetu u brojnim područjima, uključujući medicinska istraživanja, tražilice i poslovnu inteligenciju. + +## Regionalna tema: Europski jezici i književnost te romantični hoteli Europe ❤️ + +U ovom dijelu kurikuluma bit ćete upoznati s jednom od najraširenijih primjena strojnog učenja: obradom prirodnog jezika (NLP). Proizašla iz računalne lingvistike, ova kategorija umjetne inteligencije predstavlja most između ljudi i strojeva putem glasovne ili tekstualne komunikacije. + +U ovim lekcijama naučit ćemo osnove NLP-a izradom malih razgovornih botova kako bismo razumjeli kako strojno učenje pomaže da ti razgovori postanu sve 'pametniji'. Vratit ćete se u prošlost, razgovarajući s Elizabeth Bennett i gospodinom Darcyjem iz klasičnog romana Jane Austen, **Ponos i predrasude**, objavljenog 1813. godine. Zatim ćete proširiti svoje znanje učeći o analizi sentimenta putem recenzija hotela u Europi. + +![Knjiga Ponos i predrasude i čaj](../../../6-NLP/images/p&p.jpg) +> Fotografija: Elaine Howlin na Unsplash + +## Lekcije + +1. [Uvod u obradu prirodnog jezika](1-Introduction-to-NLP/README.md) +2. [Uobičajeni zadaci i tehnike NLP-a](2-Tasks/README.md) +3. [Prijevod i analiza sentimenta pomoću strojnog učenja](3-Translation-Sentiment/README.md) +4. [Priprema vaših podataka](4-Hotel-Reviews-1/README.md) +5. [NLTK za analizu sentimenta](5-Hotel-Reviews-2/README.md) + +## Zasluge + +Ove lekcije o obradi prirodnog jezika napisane su uz ☕ od strane [Stephen Howell](https://twitter.com/Howell_MSFT) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/6-NLP/data/README.md b/translations/hr/6-NLP/data/README.md new file mode 100644 index 00000000..38ad4855 --- /dev/null +++ b/translations/hr/6-NLP/data/README.md @@ -0,0 +1,15 @@ + +Preuzmite podatke o recenzijama hotela u ovu mapu. + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/7-TimeSeries/1-Introduction/README.md b/translations/hr/7-TimeSeries/1-Introduction/README.md new file mode 100644 index 00000000..4b52b69e --- /dev/null +++ b/translations/hr/7-TimeSeries/1-Introduction/README.md @@ -0,0 +1,199 @@ + +# Uvod u predviđanje vremenskih serija + +![Sažetak vremenskih serija u sketchnoteu](../../../../sketchnotes/ml-timeseries.png) + +> Sketchnote od [Tomomi Imura](https://www.twitter.com/girlie_mac) + +U ovoj lekciji i sljedećoj, naučit ćete nešto o predviđanju vremenskih serija, zanimljivom i vrijednom dijelu repertoara ML znanstvenika koji je nešto manje poznat od drugih tema. Predviđanje vremenskih serija je poput 'kristalne kugle': na temelju prošlih performansi varijable, poput cijene, možete predvidjeti njezinu buduću potencijalnu vrijednost. + +[![Uvod u predviđanje vremenskih serija](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "Uvod u predviđanje vremenskih serija") + +> 🎥 Kliknite na sliku iznad za video o predviđanju vremenskih serija + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +To je korisno i zanimljivo područje s pravom vrijednošću za poslovanje, s obzirom na njegovu izravnu primjenu na probleme cijena, inventara i pitanja opskrbnog lanca. Iako su tehnike dubokog učenja počele pružati više uvida za bolje predviđanje budućih performansi, predviđanje vremenskih serija ostaje područje koje se uvelike oslanja na klasične ML tehnike. + +> Korisni kurikulum o vremenskim serijama sa Sveučilišta Penn State možete pronaći [ovdje](https://online.stat.psu.edu/stat510/lesson/1) + +## Uvod + +Pretpostavimo da održavate niz pametnih parkirnih mjerača koji pružaju podatke o tome koliko često se koriste i koliko dugo tijekom vremena. + +> Što ako biste mogli predvidjeti, na temelju prošlih performansi mjerača, njegovu buduću vrijednost prema zakonima ponude i potražnje? + +Točno predviđanje kada djelovati kako biste postigli svoj cilj izazov je koji se može riješiti predviđanjem vremenskih serija. Ne bi bilo popularno naplaćivati više u prometnim vremenima kada ljudi traže parkirno mjesto, ali to bi bio siguran način za generiranje prihoda za čišćenje ulica! + +Istražimo neke vrste algoritama vremenskih serija i započnimo rad u bilježnici kako bismo očistili i pripremili podatke. Podaci koje ćete analizirati preuzeti su iz natjecanja za predviđanje GEFCom2014. Sastoje se od 3 godine satnih vrijednosti potrošnje električne energije i temperature između 2012. i 2014. Na temelju povijesnih obrazaca potrošnje električne energije i temperature, možete predvidjeti buduće vrijednosti potrošnje električne energije. + +U ovom primjeru naučit ćete kako predvidjeti jedan korak unaprijed, koristeći samo povijesne podatke o potrošnji. Međutim, prije nego što započnete, korisno je razumjeti što se događa iza kulisa. + +## Neke definicije + +Kada naiđete na pojam 'vremenske serije', trebate razumjeti njegovu upotrebu u nekoliko različitih konteksta. + +🎓 **Vremenske serije** + +U matematici, "vremenska serija je niz podatkovnih točaka indeksiranih (ili navedenih ili grafički prikazanih) u vremenskom redoslijedu. Najčešće, vremenska serija je sekvenca uzeta u sukcesivnim jednako razmaknutim vremenskim točkama." Primjer vremenske serije je dnevna završna vrijednost [Dow Jones Industrial Average](https://wikipedia.org/wiki/Time_series). Upotreba grafova vremenskih serija i statističkog modeliranja često se susreće u obradi signala, prognozi vremena, predviđanju potresa i drugim područjima gdje se događaji odvijaju i podatkovne točke mogu biti prikazane tijekom vremena. + +🎓 **Analiza vremenskih serija** + +Analiza vremenskih serija odnosi se na analizu gore spomenutih podataka vremenskih serija. Podaci vremenskih serija mogu imati različite oblike, uključujući 'prekinute vremenske serije' koje otkrivaju obrasce u evoluciji vremenske serije prije i nakon prekidnog događaja. Vrsta analize potrebna za vremensku seriju ovisi o prirodi podataka. Sami podaci vremenskih serija mogu biti niz brojeva ili znakova. + +Analiza se provodi koristeći razne metode, uključujući frekvencijsku domenu i vremensku domenu, linearne i nelinearne metode i druge. [Saznajte više](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) o mnogim načinima analize ove vrste podataka. + +🎓 **Predviđanje vremenskih serija** + +Predviđanje vremenskih serija je upotreba modela za predviđanje budućih vrijednosti na temelju obrazaca prikazanih prethodno prikupljenim podacima kako su se događali u prošlosti. Iako je moguće koristiti regresijske modele za istraživanje podataka vremenskih serija, s vremenskim indeksima kao x varijablama na grafu, takvi podaci najbolje se analiziraju pomoću posebnih vrsta modela. + +Podaci vremenskih serija su popis uređenih opažanja, za razliku od podataka koji se mogu analizirati linearnom regresijom. Najčešći model je ARIMA, akronim koji označava "Autoregresivni Integrirani Pokretni Prosjek". + +[ARIMA modeli](https://online.stat.psu.edu/stat510/lesson/1/1.1) "povezuju trenutnu vrijednost serije s prošlim vrijednostima i prošlim pogreškama predviđanja." Najprikladniji su za analizu podataka vremenske domene, gdje su podaci poredani tijekom vremena. + +> Postoji nekoliko vrsta ARIMA modela, o kojima možete saznati [ovdje](https://people.duke.edu/~rnau/411arim.htm) i koje ćete obraditi u sljedećoj lekciji. + +U sljedećoj lekciji izgradit ćete ARIMA model koristeći [Univarijantne Vremenske Serije](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm), koje se fokusiraju na jednu varijablu koja mijenja svoju vrijednost tijekom vremena. Primjer ove vrste podataka je [ovaj skup podataka](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) koji bilježi mjesečnu koncentraciju CO2 na opservatoriju Mauna Loa: + +| CO2 | YearMonth | Year | Month | +| :----: | :-------: | :---: | :---: | +| 330.62 | 1975.04 | 1975 | 1 | +| 331.40 | 1975.13 | 1975 | 2 | +| 331.87 | 1975.21 | 1975 | 3 | +| 333.18 | 1975.29 | 1975 | 4 | +| 333.92 | 1975.38 | 1975 | 5 | +| 333.43 | 1975.46 | 1975 | 6 | +| 331.85 | 1975.54 | 1975 | 7 | +| 330.01 | 1975.63 | 1975 | 8 | +| 328.51 | 1975.71 | 1975 | 9 | +| 328.41 | 1975.79 | 1975 | 10 | +| 329.25 | 1975.88 | 1975 | 11 | +| 330.97 | 1975.96 | 1975 | 12 | + +✅ Identificirajte varijablu koja se mijenja tijekom vremena u ovom skupu podataka. + +## Karakteristike podataka vremenskih serija koje treba uzeti u obzir + +Kada promatrate podatke vremenskih serija, možda ćete primijetiti da imaju [određene karakteristike](https://online.stat.psu.edu/stat510/lesson/1/1.1) koje trebate uzeti u obzir i ublažiti kako biste bolje razumjeli njihove obrasce. Ako smatrate da podaci vremenskih serija potencijalno pružaju 'signal' koji želite analizirati, ove karakteristike mogu se smatrati 'šumom'. Često ćete morati smanjiti taj 'šum' koristeći neke statističke tehnike. + +Evo nekoliko pojmova koje biste trebali znati kako biste mogli raditi s vremenskim serijama: + +🎓 **Trendovi** + +Trendovi su definirani kao mjerljiva povećanja i smanjenja tijekom vremena. [Pročitajte više](https://machinelearningmastery.com/time-series-trends-in-python). U kontekstu vremenskih serija, radi se o tome kako koristiti i, ako je potrebno, ukloniti trendove iz vremenskih serija. + +🎓 **[Sezonalnost](https://machinelearningmastery.com/time-series-seasonality-with-python/)** + +Sezonalnost je definirana kao periodične fluktuacije, poput blagdanskih navala koje mogu utjecati na prodaju, na primjer. [Pogledajte](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) kako različite vrste grafova prikazuju sezonalnost u podacima. + +🎓 **Izvanredne vrijednosti** + +Izvanredne vrijednosti su daleko od standardne varijance podataka. + +🎓 **Dugoročni ciklus** + +Neovisno o sezonalnosti, podaci mogu pokazivati dugoročni ciklus, poput ekonomskog pada koji traje dulje od godine dana. + +🎓 **Konstantna varijanca** + +Tijekom vremena, neki podaci pokazuju konstantne fluktuacije, poput potrošnje energije po danu i noći. + +🎓 **Nagla promjena** + +Podaci mogu pokazivati naglu promjenu koja može zahtijevati daljnju analizu. Naglo zatvaranje poslovanja zbog COVID-a, na primjer, uzrokovalo je promjene u podacima. + +✅ Ovdje je [primjer grafičkog prikaza vremenskih serija](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) koji prikazuje dnevnu potrošnju valute u igri tijekom nekoliko godina. Možete li identificirati neke od gore navedenih karakteristika u ovim podacima? + +![Potrošnja valute u igri](../../../../7-TimeSeries/1-Introduction/images/currency.png) + +## Vježba - početak rada s podacima o potrošnji energije + +Započnimo stvaranje modela vremenskih serija za predviđanje buduće potrošnje energije na temelju prošle potrošnje. + +> Podaci u ovom primjeru preuzeti su iz natjecanja za predviđanje GEFCom2014. Sastoje se od 3 godine satnih vrijednosti potrošnje električne energije i temperature između 2012. i 2014. +> +> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli i Rob J. Hyndman, "Probabilističko energetsko predviđanje: Globalno natjecanje za energetsko predviđanje 2014 i dalje", International Journal of Forecasting, vol.32, no.3, str. 896-913, srpanj-rujan, 2016. + +1. U mapi `working` ove lekcije, otvorite datoteku _notebook.ipynb_. Započnite dodavanjem biblioteka koje će vam pomoći učitati i vizualizirati podatke. + + ```python + import os + import matplotlib.pyplot as plt + from common.utils import load_data + %matplotlib inline + ``` + + Napomena, koristite datoteke iz uključene mape `common` koje postavljaju vaše okruženje i upravljaju preuzimanjem podataka. + +2. Zatim, pregledajte podatke kao dataframe pozivajući `load_data()` i `head()`: + + ```python + data_dir = './data' + energy = load_data(data_dir)[['load']] + energy.head() + ``` + + Možete vidjeti da postoje dva stupca koji predstavljaju datum i potrošnju: + + | | load | + | :-----------------: | :----: | + | 2012-01-01 00:00:00 | 2698.0 | + | 2012-01-01 01:00:00 | 2558.0 | + | 2012-01-01 02:00:00 | 2444.0 | + | 2012-01-01 03:00:00 | 2402.0 | + | 2012-01-01 04:00:00 | 2403.0 | + +3. Sada, grafički prikažite podatke pozivajući `plot()`: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![graf potrošnje energije](../../../../7-TimeSeries/1-Introduction/images/energy-plot.png) + +4. Sada, grafički prikažite prvi tjedan srpnja 2014., pružajući ga kao ulaz u `energy` u obrascu `[od datuma]: [do datuma]`: + + ```python + energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![srpanj](../../../../7-TimeSeries/1-Introduction/images/july-2014.png) + + Prekrasan graf! Pogledajte ove grafove i pokušajte odrediti neke od gore navedenih karakteristika. Što možemo zaključiti vizualizacijom podataka? + +U sljedećoj lekciji, izradit ćete ARIMA model za stvaranje nekih predviđanja. + +--- + +## 🚀Izazov + +Napravite popis svih industrija i područja istraživanja koja bi mogla imati koristi od predviđanja vremenskih serija. Možete li smisliti primjenu ovih tehnika u umjetnosti? U ekonometriji? Ekologiji? Maloprodaji? Industriji? Financijama? Gdje još? + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Iako ih ovdje nećemo obraditi, neuronske mreže ponekad se koriste za poboljšanje klasičnih metoda predviđanja vremenskih serija. Pročitajte više o njima [u ovom članku](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412) + +## Zadatak + +[Vizualizirajte još vremenskih serija](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/7-TimeSeries/1-Introduction/assignment.md b/translations/hr/7-TimeSeries/1-Introduction/assignment.md new file mode 100644 index 00000000..96d59ae9 --- /dev/null +++ b/translations/hr/7-TimeSeries/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Vizualizirajte još nekoliko vremenskih serija + +## Upute + +Počeli ste učiti o predviđanju vremenskih serija proučavajući vrstu podataka koja zahtijeva ovo posebno modeliranje. Vizualizirali ste neke podatke vezane uz energiju. Sada potražite neke druge podatke koji bi mogli imati koristi od predviđanja vremenskih serija. Pronađite tri primjera (isprobajte [Kaggle](https://kaggle.com) i [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)) i izradite bilježnicu za njihovu vizualizaciju. Zabilježite sve posebne karakteristike koje imaju (sezonalnost, nagle promjene ili drugi trendovi) u bilježnici. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ----------------------------------------------------- | --------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| | Tri skupa podataka su prikazana i objašnjena u bilježnici | Dva skupa podataka su prikazana i objašnjena u bilježnici | Malo skupova podataka je prikazano ili objašnjeno u bilježnici ili su prikazani podaci nedostatni | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/7-TimeSeries/1-Introduction/solution/Julia/README.md b/translations/hr/7-TimeSeries/1-Introduction/solution/Julia/README.md new file mode 100644 index 00000000..9bc43278 --- /dev/null +++ b/translations/hr/7-TimeSeries/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/7-TimeSeries/1-Introduction/solution/R/README.md b/translations/hr/7-TimeSeries/1-Introduction/solution/R/README.md new file mode 100644 index 00000000..0595ab0f --- /dev/null +++ b/translations/hr/7-TimeSeries/1-Introduction/solution/R/README.md @@ -0,0 +1,15 @@ + +ovo je privremeni rezervirani prostor + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/7-TimeSeries/2-ARIMA/README.md b/translations/hr/7-TimeSeries/2-ARIMA/README.md new file mode 100644 index 00000000..125e995a --- /dev/null +++ b/translations/hr/7-TimeSeries/2-ARIMA/README.md @@ -0,0 +1,405 @@ + +# Prognoza vremenskih serija s ARIMA + +U prethodnoj lekciji naučili ste nešto o prognozi vremenskih serija i učitali skup podataka koji prikazuje fluktuacije električnog opterećenja tijekom određenog vremenskog razdoblja. + +[![Uvod u ARIMA](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Uvod u ARIMA") + +> 🎥 Kliknite na sliku iznad za video: Kratak uvod u ARIMA modele. Primjer je napravljen u R-u, ali koncepti su univerzalni. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +U ovoj lekciji otkrit ćete specifičan način izrade modela pomoću [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average). ARIMA modeli posebno su prikladni za podatke koji pokazuju [nestacionarnost](https://wikipedia.org/wiki/Stationary_process). + +## Opći koncepti + +Da biste mogli raditi s ARIMA modelima, potrebno je razumjeti nekoliko ključnih pojmova: + +- 🎓 **Stacionarnost**. U statističkom kontekstu, stacionarnost se odnosi na podatke čija distribucija ne mijenja kada se pomakne u vremenu. Nestacionarni podaci pokazuju fluktuacije zbog trendova koje je potrebno transformirati kako bi se analizirali. Sezonalnost, na primjer, može uzrokovati fluktuacije u podacima i može se eliminirati procesom 'sezonskog diferenciranja'. + +- 🎓 **[Diferenciranje](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. Diferenciranje podataka, opet u statističkom kontekstu, odnosi se na proces transformacije nestacionarnih podataka kako bi postali stacionarni uklanjanjem njihovog nekonstantnog trenda. "Diferenciranje uklanja promjene u razini vremenske serije, eliminirajući trend i sezonalnost te stabilizirajući srednju vrijednost vremenske serije." [Rad Shixionga i sur.](https://arxiv.org/abs/1904.07632) + +## ARIMA u kontekstu vremenskih serija + +Razložimo dijelove ARIMA modela kako bismo bolje razumjeli kako pomaže u modeliranju vremenskih serija i omogućuje prognoze. + +- **AR - AutoRegresivno**. Autoregresivni modeli, kako ime sugerira, gledaju 'unatrag' u vremenu kako bi analizirali prethodne vrijednosti u vašim podacima i napravili pretpostavke o njima. Te prethodne vrijednosti nazivaju se 'zaostaci'. Primjer bi bili podaci koji prikazuju mjesečnu prodaju olovaka. Ukupna prodaja svakog mjeseca smatra se 'promjenjivom varijablom' u skupu podataka. Ovaj model se gradi tako da se "promjenjiva varijabla od interesa regresira na svoje vlastite zaostale (tj. prethodne) vrijednosti." [wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) + +- **I - Integrirano**. Za razliku od sličnih 'ARMA' modela, 'I' u ARIMA odnosi se na njegov *[integrirani](https://wikipedia.org/wiki/Order_of_integration)* aspekt. Podaci se 'integriraju' kada se primjenjuju koraci diferenciranja kako bi se eliminirala nestacionarnost. + +- **MA - Pomični prosjek**. [Pomični prosjek](https://wikipedia.org/wiki/Moving-average_model) u ovom modelu odnosi se na izlaznu varijablu koja se određuje promatranjem trenutnih i prošlih vrijednosti zaostataka. + +Zaključak: ARIMA se koristi za izradu modela koji što bolje odgovara specifičnom obliku podataka vremenskih serija. + +## Vježba - izrada ARIMA modela + +Otvorite [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) mapu u ovoj lekciji i pronađite datoteku [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb). + +1. Pokrenite notebook kako biste učitali Python biblioteku `statsmodels`; trebat će vam za ARIMA modele. + +1. Učitajte potrebne biblioteke. + +1. Sada učitajte još nekoliko biblioteka korisnih za vizualizaciju podataka: + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from pandas.plotting import autocorrelation_plot + from statsmodels.tsa.statespace.sarimax import SARIMAX + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + from IPython.display import Image + + %matplotlib inline + pd.options.display.float_format = '{:,.2f}'.format + np.set_printoptions(precision=2) + warnings.filterwarnings("ignore") # specify to ignore warning messages + ``` + +1. Učitajte podatke iz datoteke `/data/energy.csv` u Pandas dataframe i pogledajte ih: + + ```python + energy = load_data('./data')[['load']] + energy.head(10) + ``` + +1. Prikaz svih dostupnih podataka o energiji od siječnja 2012. do prosinca 2014. Ne bi trebalo biti iznenađenja jer smo te podatke vidjeli u prethodnoj lekciji: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + Sada, izradimo model! + +### Izrada skupa za treniranje i testiranje + +Sada kada su podaci učitani, možete ih podijeliti na skup za treniranje i skup za testiranje. Model ćete trenirati na skupu za treniranje. Kao i obično, nakon što model završi treniranje, procijenit ćete njegovu točnost pomoću skupa za testiranje. Morate osigurati da skup za testiranje pokriva kasnije vremensko razdoblje od skupa za treniranje kako biste osigurali da model ne dobije informacije iz budućih vremenskih razdoblja. + +1. Dodijelite dvomjesečno razdoblje od 1. rujna do 31. listopada 2014. skupu za treniranje. Skup za testiranje uključivat će dvomjesečno razdoblje od 1. studenog do 31. prosinca 2014.: + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + + Budući da ovi podaci odražavaju dnevnu potrošnju energije, postoji snažan sezonski obrazac, ali potrošnja je najsličnija potrošnji u nedavnim danima. + +1. Vizualizirajte razlike: + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![podaci za treniranje i testiranje](../../../../7-TimeSeries/2-ARIMA/images/train-test.png) + + Stoga bi korištenje relativno malog vremenskog okvira za treniranje podataka trebalo biti dovoljno. + + > Napomena: Budući da funkcija koju koristimo za prilagodbu ARIMA modela koristi validaciju unutar skupa tijekom prilagodbe, izostavit ćemo podatke za validaciju. + +### Priprema podataka za treniranje + +Sada trebate pripremiti podatke za treniranje filtriranjem i skaliranjem podataka. Filtrirajte svoj skup podataka tako da uključuje samo potrebna vremenska razdoblja i stupce, te skalirajte podatke kako bi bili u intervalu 0,1. + +1. Filtrirajte originalni skup podataka tako da uključuje samo prethodno navedena vremenska razdoblja po skupu i samo potrebni stupac 'load' plus datum: + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + Možete vidjeti oblik podataka: + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +1. Skalirajte podatke tako da budu u rasponu (0, 1). + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + train.head(10) + ``` + +1. Vizualizirajte originalne i skalirane podatke: + + ```python + energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12) + train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12) + plt.show() + ``` + + ![originalni](../../../../7-TimeSeries/2-ARIMA/images/original.png) + + > Originalni podaci + + ![skalirani](../../../../7-TimeSeries/2-ARIMA/images/scaled.png) + + > Skalirani podaci + +1. Sada kada ste kalibrirali skalirane podatke, možete skalirati podatke za testiranje: + + ```python + test['load'] = scaler.transform(test) + test.head() + ``` + +### Implementacija ARIMA + +Vrijeme je za implementaciju ARIMA modela! Sada ćete koristiti biblioteku `statsmodels` koju ste ranije instalirali. + +Sada trebate slijediti nekoliko koraka: + + 1. Definirajte model pozivanjem `SARIMAX()` i prosljeđivanjem parametara modela: p, d i q parametara, te P, D i Q parametara. + 2. Pripremite model za podatke za treniranje pozivanjem funkcije `fit()`. + 3. Napravite prognoze pozivanjem funkcije `forecast()` i određivanjem broja koraka (horizonta) za prognozu. + +> 🎓 Što znače svi ti parametri? U ARIMA modelu postoje 3 parametra koji se koriste za modeliranje glavnih aspekata vremenske serije: sezonalnost, trend i šum. Ti parametri su: + +`p`: parametar povezan s autoregresivnim aspektom modela, koji uključuje *prošle* vrijednosti. +`d`: parametar povezan s integriranim dijelom modela, koji utječe na količinu *diferenciranja* (🎓 sjetite se diferenciranja 👆?) primijenjenog na vremensku seriju. +`q`: parametar povezan s dijelom modela koji se odnosi na pomični prosjek. + +> Napomena: Ako vaši podaci imaju sezonski aspekt - što ovi podaci imaju - koristimo sezonski ARIMA model (SARIMA). U tom slučaju trebate koristiti drugi skup parametara: `P`, `D` i `Q` koji opisuju iste asocijacije kao `p`, `d` i `q`, ali odgovaraju sezonskim komponentama modela. + +1. Započnite postavljanjem željene vrijednosti horizonta. Pokušajmo s 3 sata: + + ```python + # Specify the number of steps to forecast ahead + HORIZON = 3 + print('Forecasting horizon:', HORIZON, 'hours') + ``` + + Odabir najboljih vrijednosti za parametre ARIMA modela može biti izazovan jer je donekle subjektivan i vremenski zahtjevan. Možete razmotriti korištenje funkcije `auto_arima()` iz biblioteke [`pyramid`](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html). + +1. Za sada pokušajte s ručnim odabirom kako biste pronašli dobar model. + + ```python + order = (4, 1, 0) + seasonal_order = (1, 1, 0, 24) + + model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order) + results = model.fit() + + print(results.summary()) + ``` + + Ispisuje se tablica rezultata. + +Napravili ste svoj prvi model! Sada trebamo pronaći način za njegovu evaluaciju. + +### Evaluacija modela + +Za evaluaciju modela možete koristiti tehniku nazvanu `walk forward` validacija. U praksi se modeli vremenskih serija ponovno treniraju svaki put kada postanu dostupni novi podaci. To omogućuje modelu da napravi najbolju prognozu u svakom vremenskom koraku. + +Počevši od početka vremenske serije, koristeći ovu tehniku, trenirajte model na skupu podataka za treniranje. Zatim napravite prognozu za sljedeći vremenski korak. Prognoza se procjenjuje u odnosu na poznatu vrijednost. Skup za treniranje se zatim proširuje kako bi uključio poznatu vrijednost i proces se ponavlja. + +> Napomena: Trebali biste zadržati fiksni prozor skupa za treniranje radi učinkovitijeg treniranja, tako da svaki put kada dodate novu promatranje u skup za treniranje, uklonite promatranje s početka skupa. + +Ovaj proces pruža robusniju procjenu kako će model funkcionirati u praksi. Međutim, dolazi s računalnim troškom stvaranja toliko modela. To je prihvatljivo ako su podaci mali ili ako je model jednostavan, ali može biti problem na većim razmjerima. + +Walk-forward validacija je zlatni standard za evaluaciju modela vremenskih serija i preporučuje se za vaše projekte. + +1. Prvo, stvorite testnu točku podataka za svaki korak HORIZON-a. + + ```python + test_shifted = test.copy() + + for t in range(1, HORIZON+1): + test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H') + + test_shifted = test_shifted.dropna(how='any') + test_shifted.head(5) + ``` + + | | | load | load+1 | load+2 | + | ---------- | -------- | ---- | ------ | ------ | + | 2014-12-30 | 00:00:00 | 0.33 | 0.29 | 0.27 | + | 2014-12-30 | 01:00:00 | 0.29 | 0.27 | 0.27 | + | 2014-12-30 | 02:00:00 | 0.27 | 0.27 | 0.30 | + | 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 | + | 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 | + + Podaci se horizontalno pomiču prema točki horizonta. + +1. Napravite prognoze na testnim podacima koristeći ovaj pristup kliznog prozora u petlji veličine duljine testnih podataka: + + ```python + %%time + training_window = 720 # dedicate 30 days (720 hours) for training + + train_ts = train['load'] + test_ts = test_shifted + + history = [x for x in train_ts] + history = history[(-training_window):] + + predictions = list() + + order = (2, 1, 0) + seasonal_order = (1, 1, 0, 24) + + for t in range(test_ts.shape[0]): + model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order) + model_fit = model.fit() + yhat = model_fit.forecast(steps = HORIZON) + predictions.append(yhat) + obs = list(test_ts.iloc[t]) + # move the training window + history.append(obs[0]) + history.pop(0) + print(test_ts.index[t]) + print(t+1, ': predicted =', yhat, 'expected =', obs) + ``` + + Možete pratiti proces treniranja: + + ```output + 2014-12-30 00:00:00 + 1 : predicted = [0.32 0.29 0.28] expected = [0.32945389435989236, 0.2900626678603402, 0.2739480752014323] + + 2014-12-30 01:00:00 + 2 : predicted = [0.3 0.29 0.3 ] expected = [0.2900626678603402, 0.2739480752014323, 0.26812891674127126] + + 2014-12-30 02:00:00 + 3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795] + ``` + +1. Usporedite prognoze s stvarnim opterećenjem: + + ```python + eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)]) + eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1] + eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h') + eval_df['actual'] = np.array(np.transpose(test_ts)).ravel() + eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']]) + eval_df.head() + ``` + + Izlaz + | | | timestamp | h | prediction | actual | + | --- | ---------- | --------- | --- | ---------- | -------- | + | 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 | + | 1 | 2014-12-30 | 01:00:00 | t+1 | 2,955.53 | 2,935.00 | + | 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 | + | 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 | + | 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 | + + Promatrajte prognozu podataka po satu u usporedbi sa stvarnim opterećenjem. Koliko je točno? + +### Provjera točnosti modela + +Provjerite točnost svog modela testiranjem njegove srednje apsolutne postotne pogreške (MAPE) na svim prognozama. +> **🧮 Pokaži mi matematiku** +> +> ![MAPE](../../../../7-TimeSeries/2-ARIMA/images/mape.png) +> +> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) koristi se za prikaz točnosti predviđanja kao omjera definiranog gornjom formulom. Razlika između stvarne i predviđene vrijednosti dijeli se sa stvarnom vrijednošću. "Apsolutna vrijednost u ovom izračunu zbraja se za svaku predviđenu točku u vremenu i dijeli s brojem prilagođenih točaka n." [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error) +1. Izrazite jednadžbu u kodu: + + ```python + if(HORIZON > 1): + eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual'] + print(eval_df.groupby('h')['APE'].mean()) + ``` + +1. Izračunajte MAPE za jedan korak: + + ```python + print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%') + ``` + + MAPE prognoze za jedan korak: 0.5570581332313952 % + +1. Ispišite MAPE za višekoraksku prognozu: + + ```python + print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%') + ``` + + ```output + Multi-step forecast MAPE: 1.1460048657704118 % + ``` + + Niska vrijednost je najbolja: uzmite u obzir da prognoza s MAPE od 10 odstupa za 10%. + +1. No, kao i uvijek, lakše je vizualno vidjeti ovakvo mjerenje točnosti, pa hajdemo to prikazati: + + ```python + if(HORIZON == 1): + ## Plotting single step forecast + eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8)) + + else: + ## Plotting multi step forecast + plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']] + for t in range(1, HORIZON+1): + plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values + + fig = plt.figure(figsize=(15, 8)) + ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0) + ax = fig.add_subplot(111) + for t in range(1, HORIZON+1): + x = plot_df['timestamp'][(t-1):] + y = plot_df['t+'+str(t)][0:len(x)] + ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t)) + + ax.legend(loc='best') + + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![model vremenskih serija](../../../../7-TimeSeries/2-ARIMA/images/accuracy.png) + +🏆 Vrlo lijep graf, koji prikazuje model s dobrom točnošću. Bravo! + +--- + +## 🚀Izazov + +Istražite načine testiranja točnosti modela vremenskih serija. U ovoj lekciji spominjemo MAPE, ali postoje li drugi načini koje biste mogli koristiti? Istražite ih i zabilježite. Koristan dokument možete pronaći [ovdje](https://otexts.com/fpp2/accuracy.html) + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Ova lekcija pokriva samo osnove prognoziranja vremenskih serija pomoću ARIMA. Odvojite vrijeme za produbljivanje svog znanja istražujući [ovaj repozitorij](https://microsoft.github.io/forecasting/) i njegove različite vrste modela kako biste naučili druge načine izrade modela vremenskih serija. + +## Zadatak + +[Novi ARIMA model](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/7-TimeSeries/2-ARIMA/assignment.md b/translations/hr/7-TimeSeries/2-ARIMA/assignment.md new file mode 100644 index 00000000..5ddadd6d --- /dev/null +++ b/translations/hr/7-TimeSeries/2-ARIMA/assignment.md @@ -0,0 +1,25 @@ + +# Novi ARIMA model + +## Upute + +Sada kada ste izradili ARIMA model, izradite novi koristeći svježe podatke (isprobajte jedan od [ovih skupova podataka s Dukea](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Zabilježite svoj rad u bilježnici, vizualizirajte podatke i svoj model te testirajte njegovu točnost koristeći MAPE. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ----------------------------------- | +| | Predstavljena je bilježnica s novim ARIMA modelom, testirana i objašnjena uz vizualizacije i navedenu točnost. | Predstavljena bilježnica nije zabilježena ili sadrži greške | Predstavljena je nepotpuna bilježnica | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/7-TimeSeries/2-ARIMA/solution/Julia/README.md b/translations/hr/7-TimeSeries/2-ARIMA/solution/Julia/README.md new file mode 100644 index 00000000..f06af0ce --- /dev/null +++ b/translations/hr/7-TimeSeries/2-ARIMA/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/7-TimeSeries/2-ARIMA/solution/R/README.md b/translations/hr/7-TimeSeries/2-ARIMA/solution/R/README.md new file mode 100644 index 00000000..3020ccb6 --- /dev/null +++ b/translations/hr/7-TimeSeries/2-ARIMA/solution/R/README.md @@ -0,0 +1,15 @@ + +ovo je privremeni rezervirani prostor + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/7-TimeSeries/3-SVR/README.md b/translations/hr/7-TimeSeries/3-SVR/README.md new file mode 100644 index 00000000..6a1b20e8 --- /dev/null +++ b/translations/hr/7-TimeSeries/3-SVR/README.md @@ -0,0 +1,393 @@ + +# Predviđanje vremenskih serija pomoću Support Vector Regressor-a + +U prethodnoj lekciji naučili ste kako koristiti ARIMA model za predviđanje vremenskih serija. Sada ćemo se fokusirati na model Support Vector Regressor, koji se koristi za predviđanje kontinuiranih podataka. + +## [Pre-lecture kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +U ovoj lekciji otkrit ćete specifičan način izgradnje modela pomoću [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) za regresiju, ili **SVR: Support Vector Regressor**. + +### SVR u kontekstu vremenskih serija [^1] + +Prije nego što razumijete važnost SVR-a u predviđanju vremenskih serija, evo nekoliko važnih pojmova koje trebate znati: + +- **Regresija:** Tehnika nadziranog učenja za predviđanje kontinuiranih vrijednosti iz skupa ulaznih podataka. Ideja je prilagoditi krivulju (ili liniju) u prostoru značajki koja ima maksimalan broj podataka. [Kliknite ovdje](https://en.wikipedia.org/wiki/Regression_analysis) za više informacija. +- **Support Vector Machine (SVM):** Vrsta modela nadziranog strojnog učenja koji se koristi za klasifikaciju, regresiju i otkrivanje odstupanja. Model je hiperravnina u prostoru značajki, koja u slučaju klasifikacije djeluje kao granica, a u slučaju regresije kao linija najboljeg pristajanja. U SVM-u se obično koristi Kernel funkcija za transformaciju skupa podataka u prostor s većim brojem dimenzija, kako bi se podaci lakše razdvojili. [Kliknite ovdje](https://en.wikipedia.org/wiki/Support-vector_machine) za više informacija o SVM-ovima. +- **Support Vector Regressor (SVR):** Vrsta SVM-a, koja pronalazi liniju najboljeg pristajanja (koja je u slučaju SVM-a hiperravnina) s maksimalnim brojem podataka. + +### Zašto SVR? [^1] + +U prethodnoj lekciji naučili ste o ARIMA modelu, koji je vrlo uspješna statistička linearna metoda za predviđanje vremenskih serija. Međutim, u mnogim slučajevima podaci vremenskih serija imaju *nelinearnost*, koju linearni modeli ne mogu mapirati. U takvim slučajevima sposobnost SVM-a da uzme u obzir nelinearnost podataka za regresijske zadatke čini SVR uspješnim u predviđanju vremenskih serija. + +## Vježba - izgradnja SVR modela + +Prvi koraci za pripremu podataka isti su kao u prethodnoj lekciji o [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA). + +Otvorite mapu [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) u ovoj lekciji i pronađite datoteku [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb). [^2] + +1. Pokrenite notebook i uvezite potrebne biblioteke: [^2] + + ```python + import sys + sys.path.append('../../') + ``` + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from sklearn.svm import SVR + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + ``` + +2. Učitajte podatke iz datoteke `/data/energy.csv` u Pandas dataframe i pogledajte ih: [^2] + + ```python + energy = load_data('../../data')[['load']] + ``` + +3. Prikažite sve dostupne podatke o energiji od siječnja 2012. do prosinca 2014.: [^2] + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![puni podaci](../../../../7-TimeSeries/3-SVR/images/full-data.png) + + Sada ćemo izgraditi naš SVR model. + +### Kreiranje skupa za treniranje i testiranje + +Sada su vaši podaci učitani, pa ih možete podijeliti na skup za treniranje i skup za testiranje. Zatim ćete preoblikovati podatke kako biste stvorili skup podataka temeljen na vremenskim koracima, što će biti potrebno za SVR. Model ćete trenirati na skupu za treniranje. Nakon što model završi s treniranjem, procijenit ćete njegovu točnost na skupu za treniranje, skupu za testiranje i zatim na cijelom skupu podataka kako biste vidjeli ukupnu izvedbu. Morate osigurati da skup za testiranje pokriva kasniji vremenski period od skupa za treniranje kako biste osigurali da model ne dobije informacije iz budućih vremenskih perioda [^2] (situacija poznata kao *Overfitting*). + +1. Dodijelite dvomjesečno razdoblje od 1. rujna do 31. listopada 2014. skupu za treniranje. Skup za testiranje uključivat će dvomjesečno razdoblje od 1. studenog do 31. prosinca 2014.: [^2] + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + +2. Vizualizirajte razlike: [^2] + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![podaci za treniranje i testiranje](../../../../7-TimeSeries/3-SVR/images/train-test.png) + +### Priprema podataka za treniranje + +Sada trebate pripremiti podatke za treniranje filtriranjem i skaliranjem podataka. Filtrirajte svoj skup podataka tako da uključuje samo potrebne vremenske periode i stupce, te skalirajte podatke kako biste osigurali da su projicirani u interval 0,1. + +1. Filtrirajte originalni skup podataka tako da uključuje samo prethodno navedene vremenske periode po skupu i samo potrebni stupac 'load' plus datum: [^2] + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +2. Skalirajte podatke za treniranje u raspon (0, 1): [^2] + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + ``` + +4. Sada skalirajte podatke za testiranje: [^2] + + ```python + test['load'] = scaler.transform(test) + ``` + +### Kreiranje podataka s vremenskim koracima [^1] + +Za SVR, transformirate ulazne podatke u oblik `[batch, timesteps]`. Dakle, preoblikujete postojeće `train_data` i `test_data` tako da postoji nova dimenzija koja se odnosi na vremenske korake. + +```python +# Converting to numpy arrays +train_data = train.values +test_data = test.values +``` + +Za ovaj primjer uzimamo `timesteps = 5`. Dakle, ulazi u model su podaci za prva 4 vremenska koraka, a izlaz će biti podaci za 5. vremenski korak. + +```python +timesteps=5 +``` + +Pretvaranje podataka za treniranje u 2D tensor pomoću ugniježđenih list comprehensions: + +```python +train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0] +train_data_timesteps.shape +``` + +```output +(1412, 5) +``` + +Pretvaranje podataka za testiranje u 2D tensor: + +```python +test_data_timesteps=np.array([[j for j in test_data[i:i+timesteps]] for i in range(0,len(test_data)-timesteps+1)])[:,:,0] +test_data_timesteps.shape +``` + +```output +(44, 5) +``` + +Odabir ulaza i izlaza iz podataka za treniranje i testiranje: + +```python +x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]] +x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]] + +print(x_train.shape, y_train.shape) +print(x_test.shape, y_test.shape) +``` + +```output +(1412, 4) (1412, 1) +(44, 4) (44, 1) +``` + +### Implementacija SVR-a [^1] + +Sada je vrijeme za implementaciju SVR-a. Za više informacija o ovoj implementaciji, možete se referirati na [ovu dokumentaciju](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html). Za našu implementaciju slijedimo ove korake: + + 1. Definirajte model pozivanjem `SVR()` i prosljeđivanjem hiperparametara modela: kernel, gamma, c i epsilon + 2. Pripremite model za podatke za treniranje pozivanjem funkcije `fit()` + 3. Napravite predviđanja pozivanjem funkcije `predict()` + +Sada kreiramo SVR model. Ovdje koristimo [RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel), i postavljamo hiperparametre gamma, C i epsilon na 0.5, 10 i 0.05. + +```python +model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05) +``` + +#### Treniranje modela na podacima za treniranje [^1] + +```python +model.fit(x_train, y_train[:,0]) +``` + +```output +SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5, + kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False) +``` + +#### Izrada predviđanja modela [^1] + +```python +y_train_pred = model.predict(x_train).reshape(-1,1) +y_test_pred = model.predict(x_test).reshape(-1,1) + +print(y_train_pred.shape, y_test_pred.shape) +``` + +```output +(1412, 1) (44, 1) +``` + +Izgradili ste svoj SVR! Sada ga trebamo procijeniti. + +### Procjena modela [^1] + +Za procjenu, prvo ćemo skalirati podatke natrag na našu originalnu skalu. Zatim, kako bismo provjerili izvedbu, prikazat ćemo originalni i predviđeni graf vremenskih serija, te ispisati rezultat MAPE-a. + +Skaliranje predviđenih i originalnih izlaza: + +```python +# Scaling the predictions +y_train_pred = scaler.inverse_transform(y_train_pred) +y_test_pred = scaler.inverse_transform(y_test_pred) + +print(len(y_train_pred), len(y_test_pred)) +``` + +```python +# Scaling the original values +y_train = scaler.inverse_transform(y_train) +y_test = scaler.inverse_transform(y_test) + +print(len(y_train), len(y_test)) +``` + +#### Provjera izvedbe modela na podacima za treniranje i testiranje [^1] + +Izvlačimo vremenske oznake iz skupa podataka kako bismo ih prikazali na x-osi našeg grafa. Napominjemo da koristimo prvih ```timesteps-1``` vrijednosti kao ulaz za prvi izlaz, tako da vremenske oznake za izlaz počinju nakon toga. + +```python +train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:] +test_timestamps = energy[test_start_dt:].index[timesteps-1:] + +print(len(train_timestamps), len(test_timestamps)) +``` + +```output +1412 44 +``` + +Prikaz predviđanja za podatke za treniranje: + +```python +plt.figure(figsize=(25,6)) +plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.title("Training data prediction") +plt.show() +``` + +![predviđanje podataka za treniranje](../../../../7-TimeSeries/3-SVR/images/train-data-predict.png) + +Ispis MAPE-a za podatke za treniranje + +```python +print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%') +``` + +```output +MAPE for training data: 1.7195710200875551 % +``` + +Prikaz predviđanja za podatke za testiranje + +```python +plt.figure(figsize=(10,3)) +plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![predviđanje podataka za testiranje](../../../../7-TimeSeries/3-SVR/images/test-data-predict.png) + +Ispis MAPE-a za podatke za testiranje + +```python +print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%') +``` + +```output +MAPE for testing data: 1.2623790187854018 % +``` + +🏆 Imate vrlo dobar rezultat na skupu podataka za testiranje! + +### Provjera izvedbe modela na cijelom skupu podataka [^1] + +```python +# Extracting load values as numpy array +data = energy.copy().values + +# Scaling +data = scaler.transform(data) + +# Transforming to 2D tensor as per model input requirement +data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0] +print("Tensor shape: ", data_timesteps.shape) + +# Selecting inputs and outputs from data +X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]] +print("X shape: ", X.shape,"\nY shape: ", Y.shape) +``` + +```output +Tensor shape: (26300, 5) +X shape: (26300, 4) +Y shape: (26300, 1) +``` + +```python +# Make model predictions +Y_pred = model.predict(X).reshape(-1,1) + +# Inverse scale and reshape +Y_pred = scaler.inverse_transform(Y_pred) +Y = scaler.inverse_transform(Y) +``` + +```python +plt.figure(figsize=(30,8)) +plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(Y_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![predviđanje cijelog skupa podataka](../../../../7-TimeSeries/3-SVR/images/full-data-predict.png) + +```python +print('MAPE: ', mape(Y_pred, Y)*100, '%') +``` + +```output +MAPE: 2.0572089029888656 % +``` + +🏆 Vrlo lijepi grafovi, koji pokazuju model s dobrom točnošću. Bravo! + +--- + +## 🚀Izazov + +- Pokušajte prilagoditi hiperparametre (gamma, C, epsilon) prilikom kreiranja modela i procijeniti na podacima kako biste vidjeli koji skup hiperparametara daje najbolje rezultate na skupu podataka za testiranje. Za više informacija o ovim hiperparametrima, možete se referirati na dokument [ovdje](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel). +- Pokušajte koristiti različite kernel funkcije za model i analizirati njihove izvedbe na skupu podataka. Koristan dokument možete pronaći [ovdje](https://scikit-learn.org/stable/modules/svm.html#kernel-functions). +- Pokušajte koristiti različite vrijednosti za `timesteps` kako bi model gledao unatrag za predviđanje. + +## [Post-lecture kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Ova lekcija je bila uvod u primjenu SVR-a za predviđanje vremenskih serija. Za više informacija o SVR-u, možete se referirati na [ovaj blog](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/). Ova [dokumentacija o scikit-learn](https://scikit-learn.org/stable/modules/svm.html) pruža sveobuhvatnije objašnjenje o SVM-ovima općenito, [SVR-ima](https://scikit-learn.org/stable/modules/svm.html#regression) i također drugim detaljima implementacije kao što su različite [kernel funkcije](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) koje se mogu koristiti, i njihovi parametri. + +## Zadatak + +[Novi SVR model](assignment.md) + +## Zasluge + +[^1]: Tekst, kod i izlaz u ovom odjeljku doprinio je [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD) +[^2]: Tekst, kod i izlaz u ovom odjeljku preuzet je iz [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/7-TimeSeries/3-SVR/assignment.md b/translations/hr/7-TimeSeries/3-SVR/assignment.md new file mode 100644 index 00000000..ed1cddce --- /dev/null +++ b/translations/hr/7-TimeSeries/3-SVR/assignment.md @@ -0,0 +1,27 @@ + +# Novi SVR model + +## Upute [^1] + +Sada kada ste izradili SVR model, izradite novi koristeći svježe podatke (isprobajte jedan od [ovih skupova podataka s Dukea](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Zabilježite svoj rad u bilježnici, vizualizirajte podatke i svoj model te testirajte njegovu točnost koristeći odgovarajuće grafikone i MAPE. Također pokušajte prilagoditi različite hiperparametre i koristiti različite vrijednosti za vremenske korake. + +## Rubrika [^1] + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ---------------------------------------------------------- | --------------------------------------------------------- | ----------------------------------- | +| | Predstavljena je bilježnica s izgrađenim, testiranim i objašnjenim SVR modelom, uz vizualizacije i navedenu točnost. | Predstavljena bilježnica nije zabilježena ili sadrži greške. | Predstavljena je nepotpuna bilježnica | + +[^1]: Tekst u ovom odjeljku temelji se na [zadatku iz ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/7-TimeSeries/README.md b/translations/hr/7-TimeSeries/README.md new file mode 100644 index 00000000..29f11864 --- /dev/null +++ b/translations/hr/7-TimeSeries/README.md @@ -0,0 +1,37 @@ + +# Uvod u predviđanje vremenskih serija + +Što je predviđanje vremenskih serija? Radi se o predviđanju budućih događaja analizom trendova iz prošlosti. + +## Regionalna tema: svjetska potrošnja električne energije ✨ + +U ova dva lekcija bit ćete upoznati s predviđanjem vremenskih serija, područjem strojnog učenja koje je možda manje poznato, ali izuzetno vrijedno za industrijske i poslovne primjene, kao i za druge oblasti. Iako se neuronske mreže mogu koristiti za povećanje korisnosti ovih modela, proučavat ćemo ih u kontekstu klasičnog strojnog učenja jer modeli pomažu u predviđanju budućih performansi na temelju prošlih podataka. + +Naš regionalni fokus je potrošnja električne energije u svijetu, zanimljiv skup podataka za učenje o predviđanju buduće potrošnje energije na temelju obrazaca prošlog opterećenja. Možete vidjeti kako ovakvo predviđanje može biti izuzetno korisno u poslovnom okruženju. + +![električna mreža](../../../7-TimeSeries/images/electric-grid.jpg) + +Fotografija [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) električnih tornjeva na cesti u Rajasthanu na [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +## Lekcije + +1. [Uvod u predviđanje vremenskih serija](1-Introduction/README.md) +2. [Izrada ARIMA modela vremenskih serija](2-ARIMA/README.md) +3. [Izrada Support Vector Regressor modela za predviđanje vremenskih serija](3-SVR/README.md) + +## Zasluge + +"Uvod u predviđanje vremenskih serija" napisali su s ⚡️ [Francesca Lazzeri](https://twitter.com/frlazzeri) i [Jen Looper](https://twitter.com/jenlooper). Bilježnice su se prvi put pojavile online u [Azure "Deep Learning For Time Series" repo](https://github.com/Azure/DeepLearningForTimeSeriesForecasting) koje je izvorno napisala Francesca Lazzeri. Lekciju o SVR-u napisao je [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD). + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/8-Reinforcement/1-QLearning/README.md b/translations/hr/8-Reinforcement/1-QLearning/README.md new file mode 100644 index 00000000..557e7fdd --- /dev/null +++ b/translations/hr/8-Reinforcement/1-QLearning/README.md @@ -0,0 +1,256 @@ + +# Uvod u učenje pojačanjem i Q-učenje + +![Sažetak učenja pojačanjem u strojnom učenju u obliku sketchnotea](../../../../sketchnotes/ml-reinforcement.png) +> Sketchnote autorice [Tomomi Imura](https://www.twitter.com/girlie_mac) + +Učenje pojačanjem uključuje tri važna koncepta: agenta, određena stanja i skup akcija za svako stanje. Izvršavanjem akcije u određenom stanju, agent dobiva nagradu. Zamislite računalnu igru Super Mario. Vi ste Mario, nalazite se na razini igre, stojite pored ruba litice. Iznad vas je novčić. Vi, kao Mario, na razini igre, na određenoj poziciji... to je vaše stanje. Pomicanje korak udesno (akcija) odvest će vas preko ruba, što bi vam donijelo nisku numeričku ocjenu. Međutim, pritiskom na gumb za skok osvojili biste bod i ostali živi. To je pozitivan ishod i trebao bi vam donijeti pozitivnu numeričku ocjenu. + +Korištenjem učenja pojačanjem i simulatora (igre), možete naučiti kako igrati igru kako biste maksimizirali nagradu, što znači ostati živ i osvojiti što više bodova. + +[![Uvod u učenje pojačanjem](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) + +> 🎥 Kliknite na sliku iznad kako biste čuli Dmitryja kako govori o učenju pojačanjem + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Preduvjeti i postavljanje + +U ovoj lekciji eksperimentirat ćemo s nekim kodom u Pythonu. Trebali biste moći pokrenuti Jupyter Notebook kod iz ove lekcije, bilo na svom računalu ili negdje u oblaku. + +Možete otvoriti [bilježnicu lekcije](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) i proći kroz ovu lekciju kako biste je izgradili. + +> **Napomena:** Ako otvarate ovaj kod iz oblaka, također trebate preuzeti datoteku [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), koja se koristi u kodu bilježnice. Dodajte je u isti direktorij kao i bilježnicu. + +## Uvod + +U ovoj lekciji istražit ćemo svijet **[Petra i vuka](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, inspiriran glazbenom bajkom ruskog skladatelja [Sergeja Prokofjeva](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Koristit ćemo **učenje pojačanjem** kako bismo omogućili Petru da istraži svoje okruženje, prikupi ukusne jabuke i izbjegne susret s vukom. + +**Učenje pojačanjem** (RL) je tehnika učenja koja nam omogućuje da naučimo optimalno ponašanje **agenta** u nekom **okruženju** izvođenjem mnogih eksperimenata. Agent u ovom okruženju treba imati neki **cilj**, definiran pomoću **funkcije nagrade**. + +## Okruženje + +Radi jednostavnosti, zamislimo Petrov svijet kao kvadratnu ploču veličine `širina` x `visina`, ovako: + +![Petrovo okruženje](../../../../8-Reinforcement/1-QLearning/images/environment.png) + +Svaka ćelija na ovoj ploči može biti: + +* **tlo**, po kojem Peter i druga bića mogu hodati. +* **voda**, po kojoj očito ne možete hodati. +* **stablo** ili **trava**, mjesto gdje se možete odmoriti. +* **jabuka**, što predstavlja nešto što bi Peter rado pronašao kako bi se nahranio. +* **vuk**, koji je opasan i treba ga izbjegavati. + +Postoji zaseban Python modul, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), koji sadrži kod za rad s ovim okruženjem. Budući da ovaj kod nije važan za razumijevanje naših koncepata, uvest ćemo modul i koristiti ga za stvaranje uzorka ploče (blok koda 1): + +```python +from rlboard import * + +width, height = 8,8 +m = Board(width,height) +m.randomize(seed=13) +m.plot() +``` + +Ovaj kod bi trebao ispisati sliku okruženja sličnu onoj gore. + +## Akcije i politika + +U našem primjeru, Petrov cilj bio bi pronaći jabuku, dok izbjegava vuka i druge prepreke. Da bi to učinio, može se kretati dok ne pronađe jabuku. + +Dakle, na bilo kojoj poziciji, može birati između sljedećih akcija: gore, dolje, lijevo i desno. + +Te ćemo akcije definirati kao rječnik i mapirati ih na parove odgovarajućih promjena koordinata. Na primjer, pomicanje udesno (`R`) odgovaralo bi paru `(1,0)`. (blok koda 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()) } +``` + +Da rezimiramo, strategija i cilj ovog scenarija su sljedeći: + +- **Strategija** našeg agenta (Petra) definirana je tzv. **politikom**. Politika je funkcija koja vraća akciju u bilo kojem danom stanju. U našem slučaju, stanje problema predstavljeno je pločom, uključujući trenutnu poziciju igrača. + +- **Cilj** učenja pojačanjem je na kraju naučiti dobru politiku koja će nam omogućiti učinkovito rješavanje problema. Međutim, kao osnovnu liniju, razmotrit ćemo najjednostavniju politiku zvanu **slučajna šetnja**. + +## Slučajna šetnja + +Najprije ćemo riješiti naš problem implementacijom strategije slučajne šetnje. Kod slučajne šetnje, nasumično ćemo birati sljedeću akciju iz dopuštenih akcija, sve dok ne dođemo do jabuke (blok koda 3). + +1. Implementirajte slučajnu šetnju pomoću donjeg koda: + + ```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 + if start_position: + m.human = start_position + else: + m.random_start() + while True: + if m.at() == Board.Cell.apple: + return n # success! + if m.at() in [Board.Cell.wolf, Board.Cell.water]: + return -1 # eaten by wolf or drowned + 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 + break + n+=1 + + walk(m,random_policy) + ``` + + Poziv funkcije `walk` trebao bi vratiti duljinu odgovarajuće staze, koja može varirati od jednog pokretanja do drugog. + +1. Pokrenite eksperiment šetnje nekoliko puta (recimo, 100) i ispišite dobivene statistike (blok koda 4): + + ```python + def print_statistics(policy): + s,w,n = 0,0,0 + for _ in range(100): + z = walk(m,policy) + if z<0: + w+=1 + else: + s += z + n += 1 + print(f"Average path length = {s/n}, eaten by wolf: {w} times") + + print_statistics(random_policy) + ``` + + Primijetite da je prosječna duljina staze oko 30-40 koraka, što je prilično puno, s obzirom na to da je prosječna udaljenost do najbliže jabuke oko 5-6 koraka. + + Također možete vidjeti kako izgleda Petrov pokret tijekom slučajne šetnje: + + ![Petrova slučajna šetnja](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) + +## Funkcija nagrade + +Kako bismo našu politiku učinili inteligentnijom, trebamo razumjeti koji su potezi "bolji" od drugih. Da bismo to učinili, trebamo definirati naš cilj. + +Cilj se može definirati u smislu **funkcije nagrade**, koja će vraćati neku vrijednost ocjene za svako stanje. Što je broj veći, to je funkcija nagrade bolja. (blok koda 5) + +```python +move_reward = -0.1 +goal_reward = 10 +end_reward = -10 + +def reward(m,pos=None): + pos = pos or m.human + if not m.is_valid(pos): + return end_reward + x = m.at(pos) + if x==Board.Cell.water or x == Board.Cell.wolf: + return end_reward + if x==Board.Cell.apple: + return goal_reward + return move_reward +``` + +Zanimljivo je da u većini slučajeva *značajnu nagradu dobivamo tek na kraju igre*. To znači da naš algoritam nekako treba zapamtiti "dobre" korake koji vode do pozitivne nagrade na kraju i povećati njihovu važnost. Slično tome, svi potezi koji vode do loših rezultata trebaju se obeshrabriti. + +## Q-učenje + +Algoritam koji ćemo ovdje raspraviti zove se **Q-učenje**. U ovom algoritmu, politika je definirana funkcijom (ili strukturom podataka) zvanom **Q-Tablica**. Ona bilježi "dobrotu" svake od akcija u danom stanju. + +Zove se Q-Tablica jer je često zgodno predstavljati je kao tablicu ili višedimenzionalni niz. Budući da naša ploča ima dimenzije `širina` x `visina`, možemo predstaviti Q-Tablicu pomoću numpy niza s oblikom `širina` x `visina` x `len(actions)`: (blok koda 6) + +```python +Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) +``` + +Primijetite da inicijaliziramo sve vrijednosti Q-Tablice s jednakom vrijednošću, u našem slučaju - 0.25. Ovo odgovara politici "slučajne šetnje", jer su svi potezi u svakom stanju jednako dobri. Q-Tablicu možemo proslijediti funkciji `plot` kako bismo vizualizirali tablicu na ploči: `m.plot(Q)`. + +![Petrovo okruženje](../../../../8-Reinforcement/1-QLearning/images/env_init.png) + +U središtu svake ćelije nalazi se "strelica" koja označava preferirani smjer kretanja. Budući da su svi smjerovi jednaki, prikazuje se točka. + +Sada trebamo pokrenuti simulaciju, istražiti naše okruženje i naučiti bolju raspodjelu vrijednosti Q-Tablice, što će nam omogućiti da mnogo brže pronađemo put do jabuke. + +## Suština Q-učenja: Bellmanova jednadžba + +Jednom kada se počnemo kretati, svaka akcija imat će odgovarajuću nagradu, tj. teoretski možemo odabrati sljedeću akciju na temelju najveće neposredne nagrade. Međutim, u većini stanja potez neće postići naš cilj dolaska do jabuke, pa stoga ne možemo odmah odlučiti koji je smjer bolji. + +> Zapamtite da nije važan neposredni rezultat, već konačni rezultat, koji ćemo dobiti na kraju simulacije. + +Kako bismo uzeli u obzir ovu odgođenu nagradu, trebamo koristiti principe **[dinamičkog programiranja](https://en.wikipedia.org/wiki/Dynamic_programming)**, koji nam omogućuju da o našem problemu razmišljamo rekurzivno. + +Pretpostavimo da se sada nalazimo u stanju *s* i želimo se pomaknuti u sljedeće stanje *s'*. Time ćemo dobiti neposrednu nagradu *r(s,a)*, definiranu funkcijom nagrade, plus neku buduću nagradu. Ako pretpostavimo da naša Q-Tablica točno odražava "privlačnost" svake akcije, tada ćemo u stanju *s'* odabrati akciju *a* koja odgovara maksimalnoj vrijednosti *Q(s',a')*. Tako će najbolja moguća buduća nagrada koju bismo mogli dobiti u stanju *s* biti definirana kao `max` + +## Provjera politike + +Budući da Q-Tablica prikazuje "privlačnost" svake akcije u svakom stanju, vrlo je jednostavno koristiti je za definiranje učinkovitog kretanja u našem svijetu. U najjednostavnijem slučaju, možemo odabrati akciju koja odgovara najvećoj vrijednosti u Q-Tablici: (kodni blok 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) +``` + +> Ako nekoliko puta isprobate gornji kod, možda ćete primijetiti da se ponekad "zaglavi" i morate pritisnuti gumb STOP u bilježnici kako biste ga prekinuli. To se događa jer mogu postojati situacije u kojima dva stanja "pokazuju" jedno na drugo u smislu optimalne Q-Vrijednosti, u kojem slučaju agent završava krećući se između tih stanja beskonačno. + +## 🚀Izazov + +> **Zadatak 1:** Modificirajte funkciju `walk` kako biste ograničili maksimalnu duljinu puta na određeni broj koraka (recimo, 100) i promatrajte kako gornji kod povremeno vraća ovu vrijednost. + +> **Zadatak 2:** Modificirajte funkciju `walk` tako da se ne vraća na mjesta na kojima je već bio. Ovo će spriječiti da se `walk` ponavlja, no agent i dalje može završiti "zarobljen" na lokaciji s koje ne može pobjeći. + +## Navigacija + +Bolja navigacijska politika bila bi ona koju smo koristili tijekom treninga, a koja kombinira eksploataciju i istraživanje. U ovoj politici odabiremo svaku akciju s određenom vjerojatnošću, proporcionalno vrijednostima u Q-Tablici. Ova strategija može i dalje rezultirati time da se agent vraća na poziciju koju je već istražio, ali, kao što možete vidjeti iz koda dolje, rezultira vrlo kratkim prosječnim putem do željene lokacije (zapamtite da `print_statistics` pokreće simulaciju 100 puta): (kodni blok 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) +``` + +Nakon pokretanja ovog koda, trebali biste dobiti znatno manju prosječnu duljinu puta nego prije, u rasponu od 3-6. + +## Istraživanje procesa učenja + +Kao što smo spomenuli, proces učenja je ravnoteža između istraživanja i korištenja stečenog znanja o strukturi prostora problema. Vidjeli smo da su rezultati učenja (sposobnost pomaganja agentu da pronađe kratak put do cilja) poboljšani, ali također je zanimljivo promatrati kako se prosječna duljina puta ponaša tijekom procesa učenja: + +## Sažetak naučenog: + +- **Prosječna duljina puta raste**. Ono što ovdje vidimo jest da na početku prosječna duljina puta raste. To je vjerojatno zbog činjenice da, kada ništa ne znamo o okolišu, vjerojatno ćemo se zaglaviti u lošim stanjima, poput vode ili vuka. Kako učimo više i počnemo koristiti to znanje, možemo dulje istraživati okoliš, ali još uvijek ne znamo dobro gdje se nalaze jabuke. + +- **Duljina puta se smanjuje kako učimo više**. Kada dovoljno naučimo, agentu postaje lakše postići cilj, a duljina puta počinje se smanjivati. Međutim, još uvijek smo otvoreni za istraživanje, pa često skrećemo s najboljeg puta i istražujemo nove opcije, čime put postaje dulji od optimalnog. + +- **Duljina naglo raste**. Ono što također primjećujemo na ovom grafu jest da u nekom trenutku duljina naglo raste. To ukazuje na stohastičku prirodu procesa i da u nekom trenutku možemo "pokvariti" koeficijente u Q-Tablici prepisivanjem novih vrijednosti. Ovo bi idealno trebalo minimizirati smanjenjem stope učenja (na primjer, prema kraju treninga, prilagođavamo vrijednosti u Q-Tablici samo malim iznosom). + +Sveukupno, važno je zapamtiti da uspjeh i kvaliteta procesa učenja značajno ovise o parametrima, poput stope učenja, smanjenja stope učenja i faktora diskonta. Ti se parametri često nazivaju **hiperparametri**, kako bi se razlikovali od **parametara**, koje optimiziramo tijekom treninga (na primjer, koeficijenti u Q-Tablici). Proces pronalaženja najboljih vrijednosti hiperparametara naziva se **optimizacija hiperparametara**, i zaslužuje zasebnu temu. + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Zadatak +[Realističniji svijet](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/8-Reinforcement/1-QLearning/assignment.md b/translations/hr/8-Reinforcement/1-QLearning/assignment.md new file mode 100644 index 00000000..985acc6c --- /dev/null +++ b/translations/hr/8-Reinforcement/1-QLearning/assignment.md @@ -0,0 +1,41 @@ + +# Realističniji svijet + +U našoj situaciji, Peter se mogao kretati gotovo bez umaranja ili osjećaja gladi. U realističnijem svijetu, morao bi se povremeno odmoriti i nahraniti. Učinimo naš svijet realističnijim implementirajući sljedeća pravila: + +1. Kretanjem s jednog mjesta na drugo, Peter gubi **energiju** i dobiva **umor**. +2. Peter može dobiti više energije jedući jabuke. +3. Peter se može riješiti umora odmarajući se ispod stabla ili na travi (tj. hodanjem do polja na ploči koje ima stablo ili travu - zeleno polje). +4. Peter mora pronaći i ubiti vuka. +5. Da bi ubio vuka, Peter mora imati određene razine energije i umora, inače gubi bitku. + +## Upute + +Koristite originalni [notebook.ipynb](../../../../8-Reinforcement/1-QLearning/notebook.ipynb) kao početnu točku za svoje rješenje. + +Modificirajte funkciju nagrade prema pravilima igre, pokrenite algoritam za učenje pojačanjem kako biste naučili najbolju strategiju za pobjedu u igri, i usporedite rezultate nasumičnog hodanja s vašim algoritmom u smislu broja pobijeđenih i izgubljenih igara. + +> **Note**: U vašem novom svijetu, stanje je složenije i, uz poziciju čovjeka, uključuje i razine umora i energije. Možete odabrati prikazati stanje kao tuple (Ploča, energija, umor), ili definirati klasu za stanje (možete je također izvesti iz `Board`), ili čak modificirati originalnu klasu `Board` unutar [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py). + +U svom rješenju, molimo vas da zadržite kod odgovoran za strategiju nasumičnog hodanja i usporedite rezultate svog algoritma s nasumičnim hodanjem na kraju. + +> **Note**: Možda ćete morati prilagoditi hiperparametre kako bi sve funkcioniralo, posebno broj epoha. Budući da je uspjeh u igri (borba s vukom) rijedak događaj, možete očekivati znatno duže vrijeme treniranja. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| | Predstavljen je notebook s definicijom novih pravila svijeta, Q-Learning algoritmom i nekim tekstualnim objašnjenjima. Q-Learning značajno poboljšava rezultate u usporedbi s nasumičnim hodanjem. | Predstavljen je notebook, Q-Learning je implementiran i poboljšava rezultate u usporedbi s nasumičnim hodanjem, ali ne značajno; ili je notebook loše dokumentiran, a kod nije dobro strukturiran. | Napravljeni su neki pokušaji redefiniranja pravila svijeta, ali Q-Learning algoritam ne funkcionira ili funkcija nagrade nije potpuno definirana. | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden koristeći AI uslugu za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/8-Reinforcement/1-QLearning/solution/Julia/README.md b/translations/hr/8-Reinforcement/1-QLearning/solution/Julia/README.md new file mode 100644 index 00000000..a5eca29f --- /dev/null +++ b/translations/hr/8-Reinforcement/1-QLearning/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/8-Reinforcement/1-QLearning/solution/R/README.md b/translations/hr/8-Reinforcement/1-QLearning/solution/R/README.md new file mode 100644 index 00000000..48aed689 --- /dev/null +++ b/translations/hr/8-Reinforcement/1-QLearning/solution/R/README.md @@ -0,0 +1,15 @@ + +ovo je privremeni rezervirani prostor + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/8-Reinforcement/2-Gym/README.md b/translations/hr/8-Reinforcement/2-Gym/README.md new file mode 100644 index 00000000..51694396 --- /dev/null +++ b/translations/hr/8-Reinforcement/2-Gym/README.md @@ -0,0 +1,351 @@ + +# CartPole Klizanje + +Problem koji smo rješavali u prethodnoj lekciji može se činiti kao igračka, ne baš primjenjiva u stvarnim životnim situacijama. No, to nije slučaj, jer mnogi stvarni problemi dijele sličan scenarij - uključujući igranje šaha ili Go. Oni su slični jer također imamo ploču s određenim pravilima i **diskretno stanje**. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +U ovoj lekciji primijenit ćemo iste principe Q-Learninga na problem s **kontinuiranim stanjem**, tj. stanjem koje je definirano jednim ili više realnih brojeva. Bavimo se sljedećim problemom: + +> **Problem**: Ako Peter želi pobjeći od vuka, mora se moći kretati brže. Vidjet ćemo kako Peter može naučiti klizati, posebno održavati ravnotežu, koristeći Q-Learning. + +![Veliki bijeg!](../../../../8-Reinforcement/2-Gym/images/escape.png) + +> Peter i njegovi prijatelji postaju kreativni kako bi pobjegli od vuka! Slika: [Jen Looper](https://twitter.com/jenlooper) + +Koristit ćemo pojednostavljenu verziju održavanja ravnoteže poznatu kao problem **CartPole**. U svijetu CartPole-a imamo horizontalni klizač koji se može kretati lijevo ili desno, a cilj je održati vertikalni stup na vrhu klizača. + +## Preduvjeti + +U ovoj lekciji koristit ćemo biblioteku pod nazivom **OpenAI Gym** za simulaciju različitih **okruženja**. Kod ove lekcije možete pokrenuti lokalno (npr. iz Visual Studio Code-a), u kojem slučaju će se simulacija otvoriti u novom prozoru. Kada pokrećete kod online, možda ćete morati napraviti neke prilagodbe koda, kao što je opisano [ovdje](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7). + +## OpenAI Gym + +U prethodnoj lekciji pravila igre i stanje definirali smo pomoću klase `Board` koju smo sami kreirali. Ovdje ćemo koristiti posebno **simulacijsko okruženje**, koje će simulirati fiziku iza balansirajućeg stupa. Jedno od najpopularnijih simulacijskih okruženja za treniranje algoritama za učenje pojačanjem zove se [Gym](https://gym.openai.com/), kojeg održava [OpenAI](https://openai.com/). Koristeći ovaj Gym možemo kreirati različita **okruženja**, od simulacije CartPole-a do Atari igara. + +> **Napomena**: Ostala dostupna okruženja iz OpenAI Gym-a možete vidjeti [ovdje](https://gym.openai.com/envs/#classic_control). + +Prvo, instalirajmo Gym i uvezimo potrebne biblioteke (blok koda 1): + +```python +import sys +!{sys.executable} -m pip install gym + +import gym +import matplotlib.pyplot as plt +import numpy as np +import random +``` + +## Vježba - inicijalizacija okruženja CartPole + +Za rad s problemom balansiranja CartPole-a, moramo inicijalizirati odgovarajuće okruženje. Svako okruženje povezano je s: + +- **Prostorom opažanja** koji definira strukturu informacija koje primamo iz okruženja. Za problem CartPole-a primamo poziciju stupa, brzinu i neke druge vrijednosti. + +- **Prostorom akcija** koji definira moguće akcije. U našem slučaju prostor akcija je diskretan i sastoji se od dvije akcije - **lijevo** i **desno**. (blok koda 2) + +1. Za inicijalizaciju, upišite sljedeći kod: + + ```python + env = gym.make("CartPole-v1") + print(env.action_space) + print(env.observation_space) + print(env.action_space.sample()) + ``` + +Da bismo vidjeli kako okruženje funkcionira, pokrenimo kratku simulaciju od 100 koraka. Na svakom koraku pružamo jednu od akcija koje treba poduzeti - u ovoj simulaciji nasumično biramo akciju iz `action_space`. + +1. Pokrenite kod ispod i pogledajte rezultat. + + ✅ Zapamtite da je poželjno pokrenuti ovaj kod na lokalnoj Python instalaciji! (blok koda 3) + + ```python + env.reset() + + for i in range(100): + env.render() + env.step(env.action_space.sample()) + env.close() + ``` + + Trebali biste vidjeti nešto slično ovoj slici: + + ![CartPole bez ravnoteže](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) + +1. Tijekom simulacije, trebamo dobiti opažanja kako bismo odlučili što učiniti. Zapravo, funkcija `step` vraća trenutna opažanja, funkciju nagrade i zastavicu `done` koja označava ima li smisla nastaviti simulaciju ili ne: (blok koda 4) + + ```python + env.reset() + + done = False + while not done: + env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + print(f"{obs} -> {rew}") + env.close() + ``` + + Na kraju ćete vidjeti nešto slično ovome u izlazu bilježnice: + + ```text + [ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0 + [ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0 + [ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0 + [ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0 + [ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0 + ... + [ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0 + [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0 + ``` + + Vektor opažanja koji se vraća na svakom koraku simulacije sadrži sljedeće vrijednosti: + - Pozicija klizača + - Brzina klizača + - Kut stupa + - Brzina rotacije stupa + +1. Dobijte minimalne i maksimalne vrijednosti tih brojeva: (blok koda 5) + + ```python + print(env.observation_space.low) + print(env.observation_space.high) + ``` + + Također možete primijetiti da je vrijednost nagrade na svakom koraku simulacije uvijek 1. To je zato što je naš cilj preživjeti što je dulje moguće, tj. održavati stup u razumno vertikalnom položaju što duže. + + ✅ Zapravo, simulacija CartPole-a smatra se riješenom ako uspijemo postići prosječnu nagradu od 195 tijekom 100 uzastopnih pokušaja. + +## Diskretizacija stanja + +U Q-Learningu, moramo izgraditi Q-Tablicu koja definira što učiniti u svakom stanju. Da bismo to mogli učiniti, stanje mora biti **diskretno**, preciznije, mora sadržavati konačan broj diskretnih vrijednosti. Dakle, moramo nekako **diskretizirati** naša opažanja, mapirajući ih na konačan skup stanja. + +Postoji nekoliko načina kako to možemo učiniti: + +- **Podjela u binove**. Ako znamo interval određene vrijednosti, možemo podijeliti taj interval u određeni broj **binova**, a zatim zamijeniti vrijednost brojem bina kojem pripada. To se može učiniti pomoću metode numpy [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html). U ovom slučaju, točno ćemo znati veličinu stanja, jer će ovisiti o broju binova koje odaberemo za digitalizaciju. + +✅ Možemo koristiti linearnu interpolaciju kako bismo vrijednosti doveli na neki konačan interval (recimo, od -20 do 20), a zatim pretvoriti brojeve u cijele brojeve zaokruživanjem. To nam daje malo manje kontrole nad veličinom stanja, posebno ako ne znamo točne raspone ulaznih vrijednosti. Na primjer, u našem slučaju 2 od 4 vrijednosti nemaju gornje/donje granice svojih vrijednosti, što može rezultirati beskonačnim brojem stanja. + +U našem primjeru, koristit ćemo drugi pristup. Kao što ćete kasnije primijetiti, unatoč neodređenim gornjim/donjim granicama, te vrijednosti rijetko uzimaju vrijednosti izvan određenih konačnih intervala, pa će ta stanja s ekstremnim vrijednostima biti vrlo rijetka. + +1. Evo funkcije koja će uzeti opažanje iz našeg modela i proizvesti tuple od 4 cijele vrijednosti: (blok koda 6) + + ```python + def discretize(x): + return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int)) + ``` + +1. Također istražimo drugu metodu diskretizacije koristeći binove: (blok koda 7) + + ```python + def create_bins(i,num): + return np.arange(num+1)*(i[1]-i[0])/num+i[0] + + 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 + 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. Sada pokrenimo kratku simulaciju i promatrajmo te diskretne vrijednosti okruženja. Slobodno isprobajte obje funkcije `discretize` i `discretize_bins` i provjerite postoji li razlika. + + ✅ `discretize_bins` vraća broj bina, koji počinje od 0. Dakle, za vrijednosti ulazne varijable oko 0 vraća broj iz sredine intervala (10). U `discretize`, nismo se brinuli o rasponu izlaznih vrijednosti, dopuštajući im da budu negativne, pa vrijednosti stanja nisu pomaknute, i 0 odgovara 0. (blok koda 8) + + ```python + env.reset() + + done = False + while not done: + #env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + #print(discretize_bins(obs)) + print(discretize(obs)) + env.close() + ``` + + ✅ Uklonite komentar s linije koja počinje s `env.render` ako želite vidjeti kako se okruženje izvršava. Inače ga možete izvršiti u pozadini, što je brže. Koristit ćemo ovo "nevidljivo" izvršavanje tijekom našeg procesa Q-Learninga. + +## Struktura Q-Tablice + +U našoj prethodnoj lekciji, stanje je bilo jednostavan par brojeva od 0 do 8, pa je bilo zgodno predstaviti Q-Tablicu pomoću numpy tensor-a oblika 8x8x2. Ako koristimo diskretizaciju binova, veličina našeg vektora stanja također je poznata, pa možemo koristiti isti pristup i predstaviti stanje pomoću niza oblika 20x20x10x10x2 (ovdje 2 predstavlja dimenziju prostora akcija, a prve dimenzije odgovaraju broju binova koje smo odabrali za svaku od parametara u prostoru opažanja). + +Međutim, ponekad precizne dimenzije prostora opažanja nisu poznate. U slučaju funkcije `discretize`, nikada ne možemo biti sigurni da naše stanje ostaje unutar određenih granica, jer neke od originalnih vrijednosti nisu ograničene. Stoga ćemo koristiti malo drugačiji pristup i predstaviti Q-Tablicu pomoću rječnika. + +1. Koristite par *(state,action)* kao ključ rječnika, a vrijednost bi odgovarala vrijednosti unosa u Q-Tablici. (blok koda 9) + + ```python + Q = {} + actions = (0,1) + + def qvalues(state): + return [Q.get((state,a),0) for a in actions] + ``` + + Ovdje također definiramo funkciju `qvalues()`, koja vraća popis vrijednosti Q-Tablice za dano stanje koje odgovara svim mogućim akcijama. Ako unos nije prisutan u Q-Tablici, vratit ćemo 0 kao zadanu vrijednost. + +## Započnimo Q-Learning + +Sada smo spremni naučiti Petera kako održavati ravnotežu! + +1. Prvo, postavimo neke hiperparametre: (blok koda 10) + + ```python + # hyperparameters + alpha = 0.3 + gamma = 0.9 + epsilon = 0.90 + ``` + + Ovdje, `alpha` je **stopa učenja** koja definira u kojoj mjeri trebamo prilagoditi trenutne vrijednosti Q-Tablice na svakom koraku. U prethodnoj lekciji započeli smo s 1, a zatim smanjili `alpha` na niže vrijednosti tijekom treninga. U ovom primjeru zadržat ćemo ga konstantnim radi jednostavnosti, a vi možete eksperimentirati s prilagodbom vrijednosti `alpha` kasnije. + + `gamma` je **faktor diskontiranja** koji pokazuje u kojoj mjeri trebamo prioritizirati buduću nagradu nad trenutnom nagradom. + + `epsilon` je **faktor istraživanja/iskorištavanja** koji određuje trebamo li preferirati istraživanje ili iskorištavanje. U našem algoritmu, u `epsilon` postotku slučajeva odabrat ćemo sljedeću akciju prema vrijednostima Q-Tablice, a u preostalom broju slučajeva izvršit ćemo nasumičnu akciju. To će nam omogućiti istraživanje područja prostora pretraživanja koja nikada prije nismo vidjeli. + + ✅ U smislu održavanja ravnoteže - odabir nasumične akcije (istraživanje) djelovao bi kao nasumični udarac u pogrešnom smjeru, a stup bi morao naučiti kako povratiti ravnotežu iz tih "pogrešaka". + +### Poboljšanje algoritma + +Možemo napraviti dva poboljšanja našem algoritmu iz prethodne lekcije: + +- **Izračunajte prosječnu kumulativnu nagradu**, tijekom određenog broja simulacija. Ispisivat ćemo napredak svakih 5000 iteracija, i prosječno ćemo izračunati kumulativnu nagradu tijekom tog vremenskog razdoblja. To znači da ako postignemo više od 195 bodova - možemo smatrati problem riješenim, čak i s višom kvalitetom nego što je potrebno. + +- **Izračunajte maksimalni prosječni kumulativni rezultat**, `Qmax`, i pohraniti ćemo Q-Tablicu koja odgovara tom rezultatu. Kada pokrenete trening primijetit ćete da ponekad prosječni kumulativni rezultat počinje padati, i želimo zadržati vrijednosti Q-Tablice koje odgovaraju najboljem modelu promatranom tijekom treninga. + +1. Prikupite sve kumulativne nagrade na svakoj simulaciji u vektor `rewards` za daljnje crtanje. (blok koda 11) + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + + Qmax = 0 + cum_rewards = [] + rewards = [] + for epoch in range(100000): + obs = env.reset() + done = False + cum_reward=0 + # == do the simulation == + while not done: + s = discretize(obs) + if random.random() Qmax: + Qmax = np.average(cum_rewards) + Qbest = Q + cum_rewards=[] + ``` + +Što možete primijetiti iz tih rezultata: + +- **Blizu našeg cilja**. Vrlo smo blizu postizanja cilja od 195 kumulativnih nagrada tijekom 100+ uzastopnih simulacija, ili smo ga možda već postigli! Čak i ako dobijemo manje brojeve, još uvijek ne znamo, jer prosječno računamo tijekom 5000 pokušaja, a samo 100 pokušaja je potrebno prema formalnim kriterijima. + +- **Nagrada počinje padati**. Ponekad nagrada počinje padati, što znači da možemo "uništiti" već naučene vrijednosti u Q-Tablici s onima koje pogoršavaju situaciju. + +Ovo opažanje je jasnije vidljivo ako nacrtamo napredak treninga. + +## Crtanje napretka treninga + +Tijekom treninga, prikupili smo vrijednost kumulativne nagrade na svakoj iteraciji u vektor `rewards`. Evo kako izgleda kada ga nacrtamo u odnosu na broj iteracija: + +```python +plt.plot(rewards) +``` + +![sirovi napredak](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png) + +Iz ovog grafikona nije moguće ništa zaključiti, jer zbog prirode stohastičkog procesa treninga duljina sesija treninga jako varira. Da bi grafikon imao više smisla, možemo izračunati **pokretni prosjek** tijekom serije eksperimenata, recimo 100. To se može zgodno učiniti pomoću `np.convolve`: (blok koda 12) + +```python +def running_average(x,window): + return np.convolve(x,np.ones(window)/window,mode='valid') + +plt.plot(running_average(rewards,100)) +``` + +![napredak treninga](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png) + +## Variranje hiperparametara + +Kako bi učenje bilo stabilnije, ima smisla prilagoditi neke od naših hiperparametara tijekom treninga. Konkretno: + +- **Za stopu učenja**, `alpha`, možemo započeti s vrijednostima blizu 1, a zatim postupno smanjivati parametar. S vremenom ćemo dobivati dobre vrijednosti vjerojatnosti u Q-Tablici, pa bismo ih trebali lagano prilagođavati, a ne potpuno prepisivati novim vrijednostima. + +- **Povećajte epsilon**. Možda ćemo htjeti postupno povećavati `epsilon`, kako bismo manje istraživali, a više iskorištavali. Vjerojatno ima smisla započeti s nižom vrijednosti `epsilon`, i postupno je povećavati do gotovo 1. +> **Zadatak 1**: Igrajte se s vrijednostima hiperparametara i provjerite možete li postići veći kumulativni nagradni rezultat. Dosežete li iznad 195? +> **Zadatak 2**: Da biste formalno riješili problem, trebate postići prosječnu nagradu od 195 kroz 100 uzastopnih pokretanja. Mjerite to tijekom treninga i uvjerite se da ste formalno riješili problem! + +## Promatranje rezultata u praksi + +Bilo bi zanimljivo vidjeti kako se trenirani model ponaša. Pokrenimo simulaciju i slijedimo istu strategiju odabira akcija kao tijekom treninga, uzorkujući prema distribuciji vjerojatnosti u Q-Tablici: (blok koda 13) + +```python +obs = env.reset() +done = False +while not done: + s = discretize(obs) + env.render() + v = probs(np.array(qvalues(s))) + a = random.choices(actions,weights=v)[0] + obs,_,done,_ = env.step(a) +env.close() +``` + +Trebali biste vidjeti nešto poput ovoga: + +![balansirajući cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) + +--- + +## 🚀Izazov + +> **Zadatak 3**: Ovdje smo koristili završnu verziju Q-Tablice, koja možda nije najbolja. Zapamtite da smo najbolju Q-Tablicu spremili u varijablu `Qbest`! Isprobajte isti primjer s najboljom Q-Tablicom tako da kopirate `Qbest` u `Q` i provjerite primjećujete li razliku. + +> **Zadatak 4**: Ovdje nismo birali najbolju akciju u svakom koraku, već smo uzorkovali prema odgovarajućoj distribuciji vjerojatnosti. Bi li imalo više smisla uvijek birati najbolju akciju, onu s najvišom vrijednošću u Q-Tablici? To se može učiniti korištenjem funkcije `np.argmax` kako biste pronašli broj akcije koji odgovara najvišoj vrijednosti u Q-Tablici. Implementirajte ovu strategiju i provjerite poboljšava li balansiranje. + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Zadatak +[Trenirajte Mountain Car](assignment.md) + +## Zaključak + +Sada smo naučili kako trenirati agente da postignu dobre rezultate samo pružanjem funkcije nagrade koja definira željeno stanje igre i omogućavanjem inteligentnog istraživanja prostora pretraživanja. Uspješno smo primijenili algoritam Q-Learning u slučajevima diskretnih i kontinuiranih okruženja, ali s diskretnim akcijama. + +Važno je također proučiti situacije u kojima je stanje akcije također kontinuirano, a prostor opažanja mnogo složeniji, poput slike s ekrana Atari igre. U tim problemima često trebamo koristiti moćnije tehnike strojnog učenja, poput neuronskih mreža, kako bismo postigli dobre rezultate. Ti napredniji koncepti bit će tema našeg nadolazećeg naprednog AI tečaja. + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/8-Reinforcement/2-Gym/assignment.md b/translations/hr/8-Reinforcement/2-Gym/assignment.md new file mode 100644 index 00000000..e71d5735 --- /dev/null +++ b/translations/hr/8-Reinforcement/2-Gym/assignment.md @@ -0,0 +1,57 @@ + +# Treniranje Mountain Car + +[OpenAI Gym](http://gym.openai.com) je dizajniran na način da svi okoliši pružaju isti API - tj. iste metode `reset`, `step` i `render`, te iste apstrakcije **prostora akcija** i **prostora opažanja**. Stoga bi trebalo biti moguće prilagoditi iste algoritme za učenje pojačanjem različitim okruženjima uz minimalne promjene koda. + +## Okruženje Mountain Car + +[Okruženje Mountain Car](https://gym.openai.com/envs/MountainCar-v0/) sadrži automobil zaglavljen u dolini: + +Cilj je izaći iz doline i dohvatiti zastavu, izvodeći pri svakom koraku jednu od sljedećih akcija: + +| Vrijednost | Značenje | +|---|---| +| 0 | Ubrzaj ulijevo | +| 1 | Ne ubrzavaj | +| 2 | Ubrzaj udesno | + +Glavni trik ovog problema je, međutim, da motor automobila nije dovoljno snažan da prijeđe planinu u jednom pokušaju. Stoga je jedini način za uspjeh vožnja naprijed-nazad kako bi se stvorio zamah. + +Prostor opažanja sastoji se od samo dvije vrijednosti: + +| Br. | Opažanje | Min | Max | +|-----|--------------|-----|-----| +| 0 | Pozicija automobila | -1.2| 0.6 | +| 1 | Brzina automobila | -0.07 | 0.07 | + +Sustav nagrađivanja za Mountain Car je prilično izazovan: + + * Nagrada od 0 dodjeljuje se ako agent dosegne zastavu (pozicija = 0.5) na vrhu planine. + * Nagrada od -1 dodjeljuje se ako je pozicija agenta manja od 0.5. + +Epizoda završava ako je pozicija automobila veća od 0.5 ili ako duljina epizode premaši 200 koraka. + +## Upute + +Prilagodite naš algoritam za učenje pojačanjem kako biste riješili problem Mountain Car. Počnite s postojećim kodom iz [notebook.ipynb](../../../../8-Reinforcement/2-Gym/notebook.ipynb), zamijenite okruženje, promijenite funkcije za diskretizaciju stanja i pokušajte natjerati postojeći algoritam da trenira uz minimalne izmjene koda. Optimizirajte rezultat podešavanjem hiperparametara. + +> **Napomena**: Podešavanje hiperparametara vjerojatno će biti potrebno kako bi algoritam konvergirao. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | --------- | -------- | ----------------- | +| | Algoritam Q-Learning uspješno je prilagođen iz primjera CartPole uz minimalne izmjene koda i sposoban je riješiti problem dohvaćanja zastave u manje od 200 koraka. | Novi algoritam Q-Learning preuzet je s interneta, ali je dobro dokumentiran; ili je postojeći algoritam prilagođen, ali ne postiže željene rezultate. | Student nije uspio uspješno prilagoditi nijedan algoritam, ali je napravio značajne korake prema rješenju (implementirao diskretizaciju stanja, strukturu podataka Q-Tablice itd.) | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/8-Reinforcement/2-Gym/solution/Julia/README.md b/translations/hr/8-Reinforcement/2-Gym/solution/Julia/README.md new file mode 100644 index 00000000..614c8b89 --- /dev/null +++ b/translations/hr/8-Reinforcement/2-Gym/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/8-Reinforcement/2-Gym/solution/R/README.md b/translations/hr/8-Reinforcement/2-Gym/solution/R/README.md new file mode 100644 index 00000000..d1fbeb0c --- /dev/null +++ b/translations/hr/8-Reinforcement/2-Gym/solution/R/README.md @@ -0,0 +1,15 @@ + +ovo je privremeni rezervirani prostor + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/8-Reinforcement/README.md b/translations/hr/8-Reinforcement/README.md new file mode 100644 index 00000000..0dd4f71a --- /dev/null +++ b/translations/hr/8-Reinforcement/README.md @@ -0,0 +1,67 @@ + +# Uvod u učenje pojačanjem + +Učenje pojačanjem, RL, smatra se jednim od osnovnih paradigmi strojnog učenja, uz nadzirano i nenadzirano učenje. RL se bavi donošenjem odluka: donošenjem ispravnih odluka ili barem učenjem iz njih. + +Zamislite da imate simulirano okruženje poput burze. Što se događa ako uvedete određenu regulaciju? Ima li to pozitivan ili negativan učinak? Ako se dogodi nešto negativno, trebate uzeti tu _negativnu povratnu informaciju_, učiti iz nje i promijeniti smjer. Ako je ishod pozitivan, trebate graditi na toj _pozitivnoj povratnoj informaciji_. + +![peter i vuk](../../../8-Reinforcement/images/peter.png) + +> Peter i njegovi prijatelji moraju pobjeći od gladnog vuka! Slika: [Jen Looper](https://twitter.com/jenlooper) + +## Regionalna tema: Peter i vuk (Rusija) + +[Peter i vuk](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) je glazbena bajka koju je napisao ruski skladatelj [Sergej Prokofjev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). To je priča o mladom pioniru Peteru, koji hrabro izlazi iz svoje kuće na šumsku čistinu kako bi ulovio vuka. U ovom dijelu ćemo trenirati algoritme strojnog učenja koji će pomoći Peteru: + +- **Istražiti** okolno područje i izgraditi optimalnu kartu navigacije +- **Naučiti** kako koristiti skateboard i održavati ravnotežu na njemu kako bi se brže kretao. + +[![Peter i vuk](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM) + +> 🎥 Kliknite na sliku iznad kako biste poslušali "Peter i vuk" od Prokofjeva + +## Učenje pojačanjem + +U prethodnim dijelovima vidjeli ste dva primjera problema strojnog učenja: + +- **Nadzirano učenje**, gdje imamo skupove podataka koji sugeriraju primjere rješenja problema koji želimo riješiti. [Klasifikacija](../4-Classification/README.md) i [regresija](../2-Regression/README.md) su zadaci nadziranog učenja. +- **Nadzirano učenje**, u kojem nemamo označene podatke za treniranje. Glavni primjer nenadziranog učenja je [Grupiranje](../5-Clustering/README.md). + +U ovom dijelu ćemo vas upoznati s novom vrstom problema učenja koji ne zahtijeva označene podatke za treniranje. Postoji nekoliko vrsta takvih problema: + +- **[Polunadzirano učenje](https://wikipedia.org/wiki/Semi-supervised_learning)**, gdje imamo puno neoznačenih podataka koji se mogu koristiti za predtreniranje modela. +- **[Učenje pojačanjem](https://wikipedia.org/wiki/Reinforcement_learning)**, u kojem agent uči kako se ponašati izvođenjem eksperimenata u nekom simuliranom okruženju. + +### Primjer - računalna igra + +Pretpostavimo da želite naučiti računalo kako igrati igru, poput šaha ili [Super Maria](https://wikipedia.org/wiki/Super_Mario). Da bi računalo moglo igrati igru, potrebno je predvidjeti koji potez napraviti u svakom stanju igre. Iako se to može činiti kao problem klasifikacije, nije - jer nemamo skup podataka sa stanjima i odgovarajućim akcijama. Iako možda imamo neke podatke poput postojećih šahovskih partija ili snimki igrača koji igraju Super Maria, vjerojatno ti podaci neće dovoljno pokriti veliki broj mogućih stanja. + +Umjesto traženja postojećih podataka o igri, **učenje pojačanjem** (RL) temelji se na ideji da *računalo igra* mnogo puta i promatra rezultat. Dakle, za primjenu učenja pojačanjem potrebne su nam dvije stvari: + +- **Okruženje** i **simulator** koji nam omogućuju da igru igramo mnogo puta. Ovaj simulator bi definirao sva pravila igre, kao i moguća stanja i akcije. + +- **Funkcija nagrade**, koja bi nam govorila koliko smo dobro igrali tijekom svakog poteza ili igre. + +Glavna razlika između drugih vrsta strojnog učenja i RL-a je ta što u RL-u obično ne znamo hoćemo li pobijediti ili izgubiti dok ne završimo igru. Dakle, ne možemo reći je li određeni potez sam po sebi dobar ili ne - nagradu dobivamo tek na kraju igre. Naš cilj je osmisliti algoritme koji će nam omogućiti treniranje modela u uvjetima nesigurnosti. Naučit ćemo o jednom RL algoritmu zvanom **Q-učenje**. + +## Lekcije + +1. [Uvod u učenje pojačanjem i Q-učenje](1-QLearning/README.md) +2. [Korištenje simulacijskog okruženja Gym](2-Gym/README.md) + +## Zasluge + +"Uvod u učenje pojačanjem" napisano je s ♥️ od strane [Dmitry Soshnikov](http://soshnikov.com) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/9-Real-World/1-Applications/README.md b/translations/hr/9-Real-World/1-Applications/README.md new file mode 100644 index 00000000..7bb940c0 --- /dev/null +++ b/translations/hr/9-Real-World/1-Applications/README.md @@ -0,0 +1,159 @@ + +# Postscript: Strojno učenje u stvarnom svijetu + +![Sažetak strojnog učenja u stvarnom svijetu u obliku sketchnotea](../../../../sketchnotes/ml-realworld.png) +> Sketchnote autorice [Tomomi Imura](https://www.twitter.com/girlie_mac) + +U ovom kurikulumu naučili ste mnoge načine pripreme podataka za treniranje i izradu modela strojnog učenja. Izradili ste niz klasičnih modela za regresiju, klasteriranje, klasifikaciju, obradu prirodnog jezika i vremenske serije. Čestitamo! Sada se možda pitate čemu sve to... koje su stvarne primjene ovih modela? + +Iako je industrija pokazala veliki interes za AI, koji obično koristi duboko učenje, klasični modeli strojnog učenja i dalje imaju vrijedne primjene. Možda već danas koristite neke od tih primjena! U ovoj lekciji istražit ćete kako osam različitih industrija i područja primjene koriste ove vrste modela kako bi njihove aplikacije bile učinkovitije, pouzdanije, inteligentnije i korisnije za korisnike. + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## 💰 Financije + +Financijski sektor nudi mnoge prilike za primjenu strojnog učenja. Mnogi problemi u ovom području mogu se modelirati i riješiti pomoću ML-a. + +### Otkrivanje prijevara s kreditnim karticama + +Ranije u tečaju naučili smo o [k-means klasteriranju](../../5-Clustering/2-K-Means/README.md), ali kako se ono može koristiti za rješavanje problema povezanih s prijevarama s kreditnim karticama? + +K-means klasteriranje korisno je u tehnici otkrivanja prijevara s kreditnim karticama koja se naziva **otkrivanje odstupanja**. Odstupanja, ili devijacije u opažanjima skupa podataka, mogu nam pokazati koristi li se kreditna kartica na uobičajen način ili se događa nešto neobično. Kao što je prikazano u povezanom radu, podatke o kreditnim karticama možete sortirati pomoću k-means algoritma klasteriranja i dodijeliti svaku transakciju klasteru na temelju toga koliko odstupa od norme. Zatim možete procijeniti najrizičnije klastere kako biste razlikovali prijevarne od legitimnih transakcija. +[Referenca](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf) + +### Upravljanje bogatstvom + +U upravljanju bogatstvom, pojedinac ili tvrtka upravlja investicijama u ime svojih klijenata. Njihov je posao dugoročno održavati i povećavati bogatstvo, pa je ključno odabrati investicije koje dobro performiraju. + +Jedan od načina procjene performansi određene investicije je statistička regresija. [Linearna regresija](../../2-Regression/1-Tools/README.md) vrijedna je alatka za razumijevanje kako fond performira u odnosu na neki referentni pokazatelj. Također možemo zaključiti jesu li rezultati regresije statistički značajni, odnosno koliko bi mogli utjecati na investicije klijenta. Analizu možete dodatno proširiti koristeći višestruku regresiju, gdje se mogu uzeti u obzir dodatni faktori rizika. Za primjer kako bi to funkcioniralo za određeni fond, pogledajte rad u nastavku o procjeni performansi fonda pomoću regresije. +[Referenca](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/) + +## 🎓 Obrazovanje + +Obrazovni sektor također je vrlo zanimljivo područje za primjenu ML-a. Postoje zanimljivi problemi koje treba riješiti, poput otkrivanja varanja na testovima ili esejima, ili upravljanja pristranostima, namjernim ili nenamjernim, u procesu ocjenjivanja. + +### Predviđanje ponašanja studenata + +[Coursera](https://coursera.com), pružatelj online otvorenih tečajeva, ima odličan tehnički blog gdje raspravlja o mnogim inženjerskim odlukama. U ovom studiju slučaja, nacrtali su regresijsku liniju kako bi istražili postoji li korelacija između niskog NPS (Net Promoter Score) ocjenjivanja i zadržavanja ili odustajanja od tečaja. +[Referenca](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a) + +### Ublažavanje pristranosti + +[Grammarly](https://grammarly.com), asistent za pisanje koji provjerava pravopisne i gramatičke pogreške, koristi sofisticirane [sustave za obradu prirodnog jezika](../../6-NLP/README.md) u svojim proizvodima. Objavili su zanimljiv studij slučaja na svom tehničkom blogu o tome kako su se nosili s rodnom pristranošću u strojnim modelima, što ste naučili u našoj [uvodnoj lekciji o pravednosti](../../1-Introduction/3-fairness/README.md). +[Referenca](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/) + +## 👜 Maloprodaja + +Maloprodajni sektor definitivno može imati koristi od primjene ML-a, od stvaranja boljeg korisničkog iskustva do optimalnog upravljanja zalihama. + +### Personalizacija korisničkog iskustva + +U Wayfairu, tvrtki koja prodaje kućne potrepštine poput namještaja, pomaganje kupcima da pronađu proizvode koji odgovaraju njihovom ukusu i potrebama je od ključne važnosti. U ovom članku, inženjeri iz tvrtke opisuju kako koriste ML i NLP za "prikazivanje pravih rezultata za kupce". Njihov Query Intent Engine izgrađen je za korištenje ekstrakcije entiteta, treniranja klasifikatora, ekstrakcije stavova i mišljenja te označavanja sentimenta u recenzijama kupaca. Ovo je klasičan primjer kako NLP funkcionira u online maloprodaji. +[Referenca](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search) + +### Upravljanje zalihama + +Inovativne, agilne tvrtke poput [StitchFix](https://stitchfix.com), usluge kutija koja šalje odjeću potrošačima, uvelike se oslanjaju na ML za preporuke i upravljanje zalihama. Njihovi timovi za stiliziranje surađuju s timovima za nabavu: "jedan od naših znanstvenika za podatke eksperimentirao je s genetskim algoritmom i primijenio ga na odjeću kako bi predvidio što bi bio uspješan komad odjeće koji danas ne postoji. To smo predstavili timu za nabavu i sada to mogu koristiti kao alat." +[Referenca](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/) + +## 🏥 Zdravstvo + +Sektor zdravstva može koristiti ML za optimizaciju istraživačkih zadataka, kao i logističkih problema poput ponovnog prijema pacijenata ili zaustavljanja širenja bolesti. + +### Upravljanje kliničkim ispitivanjima + +Toksičnost u kliničkim ispitivanjima veliki je problem za proizvođače lijekova. Koliko je toksičnosti prihvatljivo? U ovom istraživanju, analiza različitih metoda kliničkih ispitivanja dovela je do razvoja novog pristupa za predviđanje ishoda kliničkih ispitivanja. Konkretno, koristili su random forest za izradu [klasifikatora](../../4-Classification/README.md) koji može razlikovati skupine lijekova. +[Referenca](https://www.sciencedirect.com/science/article/pii/S2451945616302914) + +### Upravljanje ponovnim prijemom u bolnicu + +Bolničko liječenje je skupo, posebno kada se pacijenti moraju ponovno primiti. Ovaj rad raspravlja o tvrtki koja koristi ML za predviđanje potencijala ponovnog prijema pomoću [klasteriranja](../../5-Clustering/README.md) algoritama. Ovi klasteri pomažu analitičarima da "otkriju skupine ponovnih prijema koji mogu dijeliti zajednički uzrok". +[Referenca](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning) + +### Upravljanje bolestima + +Nedavna pandemija bacila je svjetlo na načine na koje strojno učenje može pomoći u zaustavljanju širenja bolesti. U ovom članku prepoznat ćete korištenje ARIMA, logističkih krivulja, linearne regresije i SARIMA. "Ovaj rad pokušava izračunati stopu širenja ovog virusa i tako predvidjeti smrti, oporavke i potvrđene slučajeve, kako bi nam pomogao da se bolje pripremimo i preživimo." +[Referenca](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/) + +## 🌲 Ekologija i zelena tehnologija + +Priroda i ekologija sastoje se od mnogih osjetljivih sustava gdje interakcija između životinja i prirode dolazi u fokus. Važno je moći precizno mjeriti ove sustave i djelovati prikladno ako se nešto dogodi, poput šumskog požara ili pada populacije životinja. + +### Upravljanje šumama + +Naučili ste o [Pojačanom učenju](../../8-Reinforcement/README.md) u prethodnim lekcijama. Može biti vrlo korisno kada pokušavate predvidjeti obrasce u prirodi. Konkretno, može se koristiti za praćenje ekoloških problema poput šumskih požara i širenja invazivnih vrsta. U Kanadi, grupa istraživača koristila je Pojačano učenje za izradu modela dinamike šumskih požara iz satelitskih snimaka. Koristeći inovativni "proces prostornog širenja (SSP)", zamislili su šumski požar kao "agenta na bilo kojoj ćeliji u krajoliku." "Skup akcija koje požar može poduzeti s lokacije u bilo kojem trenutku uključuje širenje na sjever, jug, istok ili zapad ili ne širenje. + +Ovaj pristup obrće uobičajeni RL postav budući da su dinamike odgovarajućeg Markovljevog procesa odlučivanja (MDP) poznata funkcija za trenutno širenje požara." Pročitajte više o klasičnim algoritmima koje je koristila ova grupa na poveznici u nastavku. +[Referenca](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full) + +### Praćenje kretanja životinja + +Iako je duboko učenje stvorilo revoluciju u vizualnom praćenju kretanja životinja (možete izraditi vlastiti [tracker za polarne medvjede](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) ovdje), klasični ML i dalje ima svoje mjesto u ovom zadatku. + +Senzori za praćenje kretanja domaćih životinja i IoT koriste ovu vrstu vizualne obrade, ali osnovnije ML tehnike korisne su za predobradu podataka. Na primjer, u ovom radu, držanje ovaca praćeno je i analizirano pomoću različitih algoritama klasifikatora. Možda ćete prepoznati ROC krivulju na stranici 335. +[Referenca](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf) + +### ⚡️ Upravljanje energijom + +U našim lekcijama o [prognoziranju vremenskih serija](../../7-TimeSeries/README.md), spomenuli smo koncept pametnih parkirnih metara za generiranje prihoda za grad na temelju razumijevanja ponude i potražnje. Ovaj članak detaljno raspravlja o tome kako su klasteriranje, regresija i prognoziranje vremenskih serija kombinirani kako bi se predvidjela buduća potrošnja energije u Irskoj, na temelju pametnog mjerenja. +[Referenca](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf) + +## 💼 Osiguranje + +Sektor osiguranja još je jedno područje koje koristi ML za izradu i optimizaciju održivih financijskih i aktuarskih modela. + +### Upravljanje volatilnošću + +MetLife, pružatelj životnog osiguranja, otvoreno govori o načinu na koji analizira i ublažava volatilnost u svojim financijskim modelima. U ovom članku primijetit ćete vizualizacije binarne i ordinalne klasifikacije. Također ćete otkriti vizualizacije prognoziranja. +[Referenca](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf) + +## 🎨 Umjetnost, kultura i književnost + +U umjetnosti, primjerice u novinarstvu, postoje mnogi zanimljivi problemi. Otkrivanje lažnih vijesti veliki je problem jer se pokazalo da utječe na mišljenje ljudi, pa čak i na rušenje demokracija. Muzeji također mogu imati koristi od korištenja ML-a u svemu, od pronalaženja poveznica između artefakata do planiranja resursa. + +### Otkrivanje lažnih vijesti + +Otkrivanje lažnih vijesti postalo je igra mačke i miša u današnjim medijima. U ovom članku, istraživači predlažu sustav koji kombinira nekoliko ML tehnika koje smo proučavali i testira najbolji model: "Ovaj sustav temelji se na obradi prirodnog jezika za ekstrakciju značajki iz podataka, a zatim se te značajke koriste za treniranje klasifikatora strojnog učenja kao što su Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD) i Logistic Regression (LR)." +[Referenca](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf) + +Ovaj članak pokazuje kako kombiniranje različitih ML domena može proizvesti zanimljive rezultate koji mogu pomoći u zaustavljanju širenja lažnih vijesti i stvaranju stvarne štete; u ovom slučaju, poticaj je bilo širenje glasina o COVID tretmanima koje su izazvale nasilje. + +### Muzejski ML + +Muzeji su na pragu AI revolucije u kojoj katalogiziranje i digitalizacija zbirki te pronalaženje poveznica između artefakata postaje lakše kako tehnologija napreduje. Projekti poput [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) pomažu u otkrivanju misterija nedostupnih zbirki poput Vatikanskih arhiva. No, poslovni aspekt muzeja također ima koristi od ML modela. + +Na primjer, Umjetnički institut u Chicagu izradio je modele za predviđanje interesa publike i vremena kada će posjetiti izložbe. Cilj je stvoriti individualizirana i optimizirana iskustva posjetitelja svaki put kada korisnik posjeti muzej. "Tijekom fiskalne 2017. godine, model je predvidio posjećenost i prihode s točnošću od 1 posto, kaže Andrew Simnick, viši potpredsjednik u Umjetničkom institutu." +[Referenca](https://www.chicagobusiness.com/article/20180518/ISSUE01/180519840/art-institute-of-chicago-uses-data-to-make-exhibit-choices) + +## 🏷 Marketing + +### Segmentacija kupaca + +Najučinkovitije marketinške strategije ciljaju kupce na različite načine na temelju različitih grupiranja. U ovom članku raspravlja se o primjeni algoritama klasteriranja za podršku diferenciranom marketingu. Diferencirani marketing pomaže tvrtkama poboljšati prepoznatljivost brenda, dosegnuti više kupaca i ostvariti veći prihod. +[Referenca](https://ai.inqline.com/machine-learning-for-marketing-customer-segmentation/) + +## 🚀 Izazov + +Identificirajte još jedan sektor koji koristi neke od tehnika koje ste naučili u ovom kurikulumu i otkrijte kako koristi ML. +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled i samostalno učenje + +Tim za podatkovnu znanost u Wayfairu ima nekoliko zanimljivih videa o tome kako koriste ML u svojoj tvrtki. Vrijedi [pogledati](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)! + +## Zadatak + +[Potraga za ML](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za kritične informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/9-Real-World/1-Applications/assignment.md b/translations/hr/9-Real-World/1-Applications/assignment.md new file mode 100644 index 00000000..9b37a231 --- /dev/null +++ b/translations/hr/9-Real-World/1-Applications/assignment.md @@ -0,0 +1,27 @@ + +# Lov na blago s ML-om + +## Upute + +U ovoj lekciji ste naučili o mnogim stvarnim slučajevima koji su riješeni korištenjem klasičnog strojnog učenja (ML). Iako upotreba dubokog učenja, novih tehnika i alata u umjetnoj inteligenciji te primjena neuronskih mreža pomaže ubrzati razvoj alata u ovim sektorima, klasično ML, koristeći tehnike iz ovog kurikuluma, i dalje ima veliku vrijednost. + +U ovom zadatku zamislite da sudjelujete na hackathonu. Iskoristite ono što ste naučili u kurikulumu kako biste predložili rješenje koristeći klasično ML za rješavanje problema u jednom od sektora obrađenih u ovoj lekciji. Napravite prezentaciju u kojoj ćete raspraviti kako ćete implementirati svoju ideju. Dodatni bodovi ako uspijete prikupiti uzorke podataka i izgraditi ML model koji podržava vaš koncept! + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | ------------------------------------------------------------------ | ------------------------------------------------ | ---------------------- | +| | Predstavljena je PowerPoint prezentacija - dodatni bodovi za izradu modela | Predstavljena je osnovna, ne-inovativna prezentacija | Rad je nepotpun | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/9-Real-World/2-Debugging-ML-Models/README.md b/translations/hr/9-Real-World/2-Debugging-ML-Models/README.md new file mode 100644 index 00000000..1866f0ec --- /dev/null +++ b/translations/hr/9-Real-World/2-Debugging-ML-Models/README.md @@ -0,0 +1,172 @@ + +# Postscript: Otklanjanje pogrešaka u modelima strojnog učenja pomoću komponenti nadzorne ploče za odgovornu umjetnu inteligenciju + +## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +Strojno učenje utječe na naše svakodnevne živote. Umjetna inteligencija (AI) pronalazi svoj put u neke od najvažnijih sustava koji utječu na nas kao pojedince i na naše društvo, od zdravstva, financija, obrazovanja do zapošljavanja. Na primjer, sustavi i modeli uključeni su u svakodnevne zadatke donošenja odluka, poput dijagnoza u zdravstvu ili otkrivanja prijevara. Posljedično, napredak u AI-u, zajedno s ubrzanim usvajanjem, suočava se s evoluirajućim društvenim očekivanjima i sve većom regulacijom. Stalno svjedočimo područjima u kojima AI sustavi ne ispunjavaju očekivanja; otkrivaju nove izazove; a vlade počinju regulirati AI rješenja. Stoga je važno analizirati ove modele kako bi se osigurali pravedni, pouzdani, uključivi, transparentni i odgovorni ishodi za sve. + +U ovom kurikulumu istražit ćemo praktične alate koji se mogu koristiti za procjenu ima li model problema s odgovornom umjetnom inteligencijom. Tradicionalne tehnike otklanjanja pogrešaka u strojnome učenju obično se temelje na kvantitativnim izračunima poput agregirane točnosti ili prosječnog gubitka pogreške. Zamislite što se može dogoditi kada podaci koje koristite za izgradnju ovih modela nedostaju određenih demografskih podataka, poput rase, spola, političkog stava, religije ili su nerazmjerno zastupljeni. Što ako se izlaz modela interpretira tako da favorizira neku demografsku skupinu? To može dovesti do prekomjerne ili nedovoljne zastupljenosti ovih osjetljivih značajki, što rezultira problemima pravednosti, uključivosti ili pouzdanosti modela. Još jedan faktor je taj što se modeli strojnog učenja smatraju "crnim kutijama", što otežava razumijevanje i objašnjenje što pokreće predikciju modela. Sve su to izazovi s kojima se suočavaju znanstvenici za podatke i AI programeri kada nemaju odgovarajuće alate za otklanjanje pogrešaka i procjenu pravednosti ili pouzdanosti modela. + +U ovoj lekciji naučit ćete kako otklanjati pogreške u svojim modelima koristeći: + +- **Analizu pogrešaka**: identificiranje dijelova distribucije podataka gdje model ima visoke stope pogrešaka. +- **Pregled modela**: provođenje usporedne analize među različitim kohortama podataka kako bi se otkrile razlike u metrikama izvedbe modela. +- **Analizu podataka**: istraživanje područja gdje može postojati prekomjerna ili nedovoljna zastupljenost podataka koja može iskriviti model u korist jedne demografske skupine u odnosu na drugu. +- **Važnost značajki**: razumijevanje koje značajke pokreću predikcije modela na globalnoj ili lokalnoj razini. + +## Preduvjet + +Kao preduvjet, pregledajte [Alate za odgovornu umjetnu inteligenciju za programere](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) + +> ![Gif o alatima za odgovornu umjetnu inteligenciju](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) + +## Analiza pogrešaka + +Tradicionalne metrike izvedbe modela koje se koriste za mjerenje točnosti uglavnom su izračuni temeljeni na ispravnim i pogrešnim predikcijama. Na primjer, određivanje da je model točan 89% vremena s gubitkom pogreške od 0,001 može se smatrati dobrom izvedbom. Međutim, pogreške često nisu ravnomjerno raspoređene u vašem osnovnom skupu podataka. Možete dobiti rezultat točnosti modela od 89%, ali otkriti da postoje različiti dijelovi vaših podataka za koje model griješi 42% vremena. Posljedice ovih obrazaca pogrešaka s određenim skupinama podataka mogu dovesti do problema pravednosti ili pouzdanosti. Ključno je razumjeti područja u kojima model dobro ili loše radi. Područja podataka s velikim brojem netočnosti u vašem modelu mogu se pokazati važnim demografskim podacima. + +![Analizirajte i otklonite pogreške modela](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-distribution.png) + +Komponenta za analizu pogrešaka na nadzornoj ploči RAI ilustrira kako su pogreške modela raspoređene među različitim kohortama pomoću vizualizacije stabla. Ovo je korisno za identificiranje značajki ili područja s visokom stopom pogrešaka u vašem skupu podataka. Promatranjem odakle dolazi većina netočnosti modela, možete započeti istraživanje uzroka. Također možete stvoriti kohorte podataka za provođenje analize. Ove kohorte podataka pomažu u procesu otklanjanja pogrešaka kako bi se utvrdilo zašto model dobro radi u jednoj kohorti, a griješi u drugoj. + +![Analiza pogrešaka](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png) + +Vizualni pokazatelji na karti stabla pomažu brže locirati problematična područja. Na primjer, što je tamnija nijansa crvene boje na čvoru stabla, to je veća stopa pogreške. + +Toplinska karta je još jedna funkcionalnost vizualizacije koju korisnici mogu koristiti za istraživanje stope pogreške koristeći jednu ili dvije značajke kako bi pronašli čimbenike koji doprinose pogreškama modela u cijelom skupu podataka ili kohortama. + +![Toplinska karta analize pogrešaka](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png) + +Koristite analizu pogrešaka kada trebate: + +* Dobiti duboko razumijevanje kako su pogreške modela raspoređene u skupu podataka i među različitim ulaznim i značajkama. +* Raspodijeliti agregirane metrike izvedbe kako biste automatski otkrili pogrešne kohorte i informirali svoje ciljne korake za ublažavanje problema. + +## Pregled modela + +Procjena izvedbe modela strojnog učenja zahtijeva holističko razumijevanje njegovog ponašanja. To se može postići pregledom više od jedne metrike, poput stope pogreške, točnosti, prisjećanja, preciznosti ili MAE (prosječne apsolutne pogreške), kako bi se otkrile razlike među metrikama izvedbe. Jedna metrika izvedbe može izgledati izvrsno, ali netočnosti se mogu otkriti u drugoj metriki. Osim toga, usporedba metrika za razlike u cijelom skupu podataka ili kohortama pomaže rasvijetliti gdje model dobro ili loše radi. Ovo je posebno važno za uočavanje izvedbe modela među osjetljivim i neosjetljivim značajkama (npr. rasa pacijenta, spol ili dob) kako bi se otkrila potencijalna nepravednost modela. Na primjer, otkrivanje da je model pogrešniji u kohorti koja ima osjetljive značajke može otkriti potencijalnu nepravednost modela. + +Komponenta Pregled modela na nadzornoj ploči RAI pomaže ne samo u analizi metrika izvedbe reprezentacije podataka u kohorti, već korisnicima daje mogućnost usporedbe ponašanja modela među različitim kohortama. + +![Kohorte skupa podataka - pregled modela na nadzornoj ploči RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png) + +Funkcionalnost analize temeljene na značajkama komponente omogućuje korisnicima sužavanje podskupina podataka unutar određene značajke kako bi se identificirale anomalije na detaljnoj razini. Na primjer, nadzorna ploča ima ugrađenu inteligenciju za automatsko generiranje kohorti za korisnički odabranu značajku (npr. *"time_in_hospital < 3"* ili *"time_in_hospital >= 7"*). Ovo omogućuje korisniku da izolira određenu značajku iz veće skupine podataka kako bi vidio je li ona ključni čimbenik netočnih ishoda modela. + +![Kohorte značajki - pregled modela na nadzornoj ploči RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png) + +Komponenta Pregled modela podržava dvije klase metrika razlika: + +**Razlike u izvedbi modela**: Ovi skupovi metrika izračunavaju razliku u vrijednostima odabrane metrike izvedbe među podskupinama podataka. Evo nekoliko primjera: + +* Razlika u stopi točnosti +* Razlika u stopi pogreške +* Razlika u preciznosti +* Razlika u prisjećanju +* Razlika u prosječnoj apsolutnoj pogrešci (MAE) + +**Razlike u stopi odabira**: Ova metrika sadrži razliku u stopi odabira (povoljne predikcije) među podskupinama. Primjer ovoga je razlika u stopama odobravanja kredita. Stopa odabira znači udio točaka podataka u svakoj klasi klasificiranih kao 1 (u binarnoj klasifikaciji) ili distribuciju vrijednosti predikcije (u regresiji). + +## Analiza podataka + +> "Ako dovoljno dugo mučite podatke, priznat će bilo što" - Ronald Coase + +Ova izjava zvuči ekstremno, ali istina je da se podaci mogu manipulirati kako bi podržali bilo koji zaključak. Takva manipulacija ponekad se događa nenamjerno. Kao ljudi, svi imamo pristranosti i često je teško svjesno znati kada unosimo pristranost u podatke. Osiguravanje pravednosti u AI-u i strojnome učenju ostaje složen izazov. + +Podaci su velika slijepa točka za tradicionalne metrike izvedbe modela. Možete imati visoke rezultate točnosti, ali to ne odražava uvijek osnovnu pristranost podataka koja bi mogla postojati u vašem skupu podataka. Na primjer, ako skup podataka zaposlenika ima 27% žena na izvršnim pozicijama u tvrtki i 73% muškaraca na istoj razini, AI model za oglašavanje poslova obučen na ovim podacima mogao bi ciljati uglavnom mušku publiku za visoke pozicije. Ova neravnoteža u podacima iskrivila je predikciju modela u korist jednog spola. Ovo otkriva problem pravednosti gdje postoji rodna pristranost u AI modelu. + +Komponenta Analiza podataka na nadzornoj ploči RAI pomaže identificirati područja gdje postoji prekomjerna ili nedovoljna zastupljenost u skupu podataka. Pomaže korisnicima dijagnosticirati uzrok pogrešaka i problema pravednosti koji su uvedeni neravnotežom podataka ili nedostatkom zastupljenosti određene skupine podataka. Ovo korisnicima omogućuje vizualizaciju skupova podataka na temelju predviđenih i stvarnih ishoda, skupina pogrešaka i specifičnih značajki. Ponekad otkrivanje nedovoljno zastupljene skupine podataka također može otkriti da model ne uči dobro, što rezultira visokim netočnostima. Model s pristranošću podataka nije samo problem pravednosti, već pokazuje da model nije uključiv ili pouzdan. + +![Komponenta za analizu podataka na nadzornoj ploči RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png) + +Koristite analizu podataka kada trebate: + +* Istražiti statistiku svog skupa podataka odabirom različitih filtera za razdvajanje podataka u različite dimenzije (poznate i kao kohorte). +* Razumjeti distribuciju svog skupa podataka među različitim kohortama i skupinama značajki. +* Utvrditi jesu li vaši nalazi vezani za pravednost, analizu pogrešaka i uzročnost (dobiveni iz drugih komponenti nadzorne ploče) rezultat distribucije vašeg skupa podataka. +* Odlučiti u kojim područjima prikupiti više podataka kako biste ublažili pogreške koje proizlaze iz problema zastupljenosti, buke oznaka, buke značajki, pristranosti oznaka i sličnih čimbenika. + +## Interpretacija modela + +Modeli strojnog učenja često se smatraju "crnim kutijama". Razumijevanje koje ključne značajke podataka pokreću predikciju modela može biti izazovno. Važno je pružiti transparentnost u vezi s time zašto model donosi određenu predikciju. Na primjer, ako AI sustav predviđa da je dijabetičar u riziku od ponovnog prijema u bolnicu unutar 30 dana, trebao bi moći pružiti potporne podatke koji su doveli do te predikcije. Imati potporne pokazatelje podataka donosi transparentnost kako bi liječnici ili bolnice mogli donositi dobro informirane odluke. Osim toga, mogućnost objašnjenja zašto je model donio predikciju za pojedinog pacijenta omogućuje odgovornost prema zdravstvenim propisima. Kada koristite modele strojnog učenja na načine koji utječu na ljudske živote, ključno je razumjeti i objasniti što utječe na ponašanje modela. Interpretacija i objašnjivost modela pomažu odgovoriti na pitanja u scenarijima kao što su: + +* Otklanjanje pogrešaka modela: Zašto je moj model napravio ovu pogrešku? Kako mogu poboljšati svoj model? +* Suradnja čovjeka i AI-a: Kako mogu razumjeti i vjerovati odlukama modela? +* Usklađenost s propisima: Zadovoljava li moj model zakonske zahtjeve? + +Komponenta Važnost značajki na nadzornoj ploči RAI pomaže vam otkloniti pogreške i dobiti sveobuhvatno razumijevanje kako model donosi predikcije. Također je koristan alat za stručnjake za strojno učenje i donositelje odluka kako bi objasnili i pokazali dokaze o značajkama koje utječu na ponašanje modela radi usklađenosti s propisima. Korisnici zatim mogu istražiti globalna i lokalna objašnjenja kako bi potvrdili koje značajke pokreću predikciju modela. Globalna objašnjenja navode glavne značajke koje su utjecale na ukupnu predikciju modela. Lokalna objašnjenja prikazuju koje su značajke dovele do predikcije modela za pojedinačni slučaj. Mogućnost procjene lokalnih objašnjenja također je korisna u otklanjanju pogrešaka ili reviziji određenog slučaja kako bi se bolje razumjelo i interpretiralo zašto je model donio točnu ili netočnu predikciju. + +![Komponenta Važnost značajki na nadzornoj ploči RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/9-feature-importance.png) + +* Globalna objašnjenja: Na primjer, koje značajke utječu na ukupno ponašanje modela za ponovno prijem dijabetičara u bolnicu? +* Lokalna objašnjenja: Na primjer, zašto je dijabetičar stariji od 60 godina s prethodnim hospitalizacijama predviđen da će biti ponovno primljen ili neće biti ponovno primljen u bolnicu unutar 30 dana? + +U procesu otklanjanja pogrešaka i ispitivanja izvedbe modela među različitim kohortama, Važnost značajki pokazuje koliki utjecaj određena značajka ima među kohortama. Pomaže otkriti anomalije kada se uspoređuje razina utjecaja značajke na pogrešne predikcije modela. Komponenta Važnost značajki može pokazati koje vrijednosti u značajci pozitivno ili negativno utječu na ishod modela. Na primjer, ako je model donio netočnu predikciju, komponenta vam omogućuje da detaljno istražite i identificirate koje značajke ili vrijednosti značajki su dovele do predikcije. Ova razina detalja pomaže ne samo u otklanjanju pogrešaka već pruža transparentnost i odgovornost u situacijama revizije. Konačno, komponenta može pomoći u identificiranju problema pravednosti. Na primjer, ako osjetljiva značajka poput etničke pripadnosti ili spola ima veliki utjecaj na predikciju modela, to bi mogao biti znak rasne ili rodne pristranosti u modelu. + +![Važnost značajki](../../../../9-Real-World/2-Debugging-ML-Models/images/9-features-influence.png) + +Koristite interpretaciju kada trebate: + +* Odrediti koliko su pouzdane predikcije vašeg AI sustava razumijevanjem koje su značajke najvažnije za predikcije. +* Pristupiti otklanjanju pogrešaka modela tako da ga prvo razumijete i identificirate koristi li model zdrave značajke ili samo lažne korelacije. +* Otkriti potencijalne izvore nepravednosti razumijevanjem +- **Prekomjerna ili nedovoljna zastupljenost**. Ideja je da određena skupina nije zastupljena u određenoj profesiji, a svaka usluga ili funkcija koja to nastavlja promovirati doprinosi šteti. + +### Azure RAI nadzorna ploča + +[Azure RAI nadzorna ploča](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) temelji se na alatima otvorenog koda koje su razvile vodeće akademske institucije i organizacije, uključujući Microsoft, a koji su ključni za podatkovne znanstvenike i AI programere kako bi bolje razumjeli ponašanje modela, otkrili i ublažili neželjene probleme iz AI modela. + +- Naučite kako koristiti različite komponente pregledavajući [dokumentaciju](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) RAI nadzorne ploče. + +- Pogledajte neke [primjere bilježnica](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) RAI nadzorne ploče za otklanjanje problema u scenarijima odgovornog AI-a u Azure Machine Learningu. + +--- +## 🚀 Izazov + +Kako bismo spriječili uvođenje statističkih ili podatkovnih pristranosti od samog početka, trebali bismo: + +- osigurati raznolikost pozadina i perspektiva među ljudima koji rade na sustavima +- ulagati u skupove podataka koji odražavaju raznolikost našeg društva +- razviti bolje metode za otkrivanje i ispravljanje pristranosti kada se pojavi + +Razmislite o stvarnim scenarijima u kojima je nepravda očita u izgradnji i korištenju modela. Što još trebamo uzeti u obzir? + +## [Kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) +## Pregled i samostalno učenje + +U ovoj lekciji naučili ste neke praktične alate za uključivanje odgovornog AI-a u strojno učenje. + +Pogledajte ovu radionicu za dublje istraživanje tema: + +- Odgovorna AI nadzorna ploča: Sve na jednom mjestu za operacionalizaciju RAI-a u praksi, autorice Besmira Nushi i Mehrnoosh Sameki + +[![Odgovorna AI nadzorna ploča: Sve na jednom mjestu za operacionalizaciju RAI-a u praksi](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Odgovorna AI nadzorna ploča: Sve na jednom mjestu za operacionalizaciju RAI-a u praksi") + +> 🎥 Kliknite na sliku iznad za video: Odgovorna AI nadzorna ploča: Sve na jednom mjestu za operacionalizaciju RAI-a u praksi, autorice Besmira Nushi i Mehrnoosh Sameki + +Referencirajte sljedeće materijale kako biste saznali više o odgovornom AI-u i kako izgraditi pouzdanije modele: + +- Microsoftovi alati RAI nadzorne ploče za otklanjanje problema u ML modelima: [Resursi alata za odgovorni AI](https://aka.ms/rai-dashboard) + +- Istražite alatni okvir za odgovorni AI: [Github](https://github.com/microsoft/responsible-ai-toolbox) + +- Microsoftov centar resursa za RAI: [Resursi za odgovorni AI – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsoftova istraživačka grupa FATE: [FATE: Pravednost, odgovornost, transparentnost i etika u AI-u - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +## Zadatak + +[Istražite RAI nadzornu ploču](assignment.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/9-Real-World/2-Debugging-ML-Models/assignment.md b/translations/hr/9-Real-World/2-Debugging-ML-Models/assignment.md new file mode 100644 index 00000000..6d0eaaa5 --- /dev/null +++ b/translations/hr/9-Real-World/2-Debugging-ML-Models/assignment.md @@ -0,0 +1,25 @@ + +# Istražite nadzornu ploču za odgovornu umjetnu inteligenciju (RAI) + +## Upute + +U ovoj lekciji ste naučili o nadzornoj ploči za odgovornu umjetnu inteligenciju (RAI), skupu komponenti izgrađenih na "open-source" alatima koji pomažu znanstvenicima za podatke u provođenju analize pogrešaka, istraživanju podataka, procjeni pravednosti, interpretaciji modela, procjenama "što-ako" i kontrafaktualnim analizama te uzročno-posljedičnim analizama AI sustava. Za ovaj zadatak istražite neke od uzoraka [bilježnica](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) s RAI nadzorne ploče i izložite svoja otkrića u radu ili prezentaciji. + +## Rubrika + +| Kriterij | Izvrsno | Zadovoljavajuće | Potrebno poboljšanje | +| -------- | --------- | -------- | ----------------- | +| | Predstavljen je rad ili PowerPoint prezentacija koja raspravlja o komponentama RAI nadzorne ploče, bilježnici koja je pokrenuta i zaključcima donesenim iz njezina pokretanja | Predstavljen je rad bez zaključaka | Nije predstavljen rad | + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/9-Real-World/README.md b/translations/hr/9-Real-World/README.md new file mode 100644 index 00000000..3ee293d3 --- /dev/null +++ b/translations/hr/9-Real-World/README.md @@ -0,0 +1,32 @@ + +# Postscript: Primjene klasičnog strojnog učenja u stvarnom svijetu + +U ovom dijelu kurikuluma upoznat ćete se s nekim stvarnim primjenama klasičnog strojnog učenja. Pretražili smo internet kako bismo pronašli znanstvene radove i članke o primjenama koje koriste ove strategije, izbjegavajući neuralne mreže, duboko učenje i umjetnu inteligenciju koliko je to moguće. Saznajte kako se strojno učenje koristi u poslovnim sustavima, ekološkim aplikacijama, financijama, umjetnosti i kulturi, i još mnogo toga. + +![chess](../../../9-Real-World/images/chess.jpg) + +> Fotografija autora Alexis Fauvet na Unsplash + +## Lekcija + +1. [Primjene strojnog učenja u stvarnom svijetu](1-Applications/README.md) +2. [Otklanjanje pogrešaka modela strojnog učenja pomoću komponenti nadzorne ploče odgovorne AI](2-Debugging-ML-Models/README.md) + +## Zasluge + +"Primjene u stvarnom svijetu" napisao je tim ljudi, uključujući [Jen Looper](https://twitter.com/jenlooper) i [Ornella Altunyan](https://twitter.com/ornelladotcom). + +"Otklanjanje pogrešaka modela strojnog učenja pomoću komponenti nadzorne ploče odgovorne AI" napisala je [Ruth Yakubu](https://twitter.com/ruthieyakubu) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva pogrešna tumačenja ili nesporazume koji mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/CODE_OF_CONDUCT.md b/translations/hr/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..c6c13c64 --- /dev/null +++ b/translations/hr/CODE_OF_CONDUCT.md @@ -0,0 +1,23 @@ + +# Microsoftov Kodeks ponašanja za otvoreni izvor + +Ovaj projekt je usvojio [Microsoftov Kodeks ponašanja za otvoreni izvor](https://opensource.microsoft.com/codeofconduct/). + +Resursi: + +- [Microsoftov Kodeks ponašanja za otvoreni izvor](https://opensource.microsoft.com/codeofconduct/) +- [Česta pitanja o Kodeksu ponašanja](https://opensource.microsoft.com/codeofconduct/faq/) +- Kontaktirajte [opencode@microsoft.com](mailto:opencode@microsoft.com) za pitanja ili zabrinutosti + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/CONTRIBUTING.md b/translations/hr/CONTRIBUTING.md new file mode 100644 index 00000000..61cb6965 --- /dev/null +++ b/translations/hr/CONTRIBUTING.md @@ -0,0 +1,25 @@ + +# Sudjelovanje + +Ovaj projekt pozdravlja doprinose i prijedloge. Većina doprinosa zahtijeva da se složite s Ugovorom o licenci za doprinos (CLA) kojim izjavljujete da imate pravo, i da stvarno dajete prava za korištenje vašeg doprinosa. Za detalje posjetite https://cla.microsoft.com. + +> Važno: prilikom prevođenja teksta u ovom repozitoriju, molimo osigurajte da ne koristite strojno prevođenje. Provjerit ćemo prijevode putem zajednice, stoga se prijavite za prijevode samo na jezicima u kojima ste vješti. + +Kada pošaljete pull request, CLA-bot će automatski odrediti trebate li dostaviti CLA i označiti PR na odgovarajući način (npr. oznaka, komentar). Jednostavno slijedite upute koje vam bot pruži. Ovo ćete morati učiniti samo jednom za sve repozitorije koji koriste naš CLA. + +Ovaj projekt je usvojio [Microsoftov Kodeks ponašanja za otvoreni izvor](https://opensource.microsoft.com/codeofconduct/). +Za više informacija pogledajte [FAQ o Kodeksu ponašanja](https://opensource.microsoft.com/codeofconduct/faq/) +ili kontaktirajte [opencode@microsoft.com](mailto:opencode@microsoft.com) s dodatnim pitanjima ili komentarima. + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/README.md b/translations/hr/README.md new file mode 100644 index 00000000..4c46ef72 --- /dev/null +++ b/translations/hr/README.md @@ -0,0 +1,178 @@ + +[![GitHub license](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/) + +### 🌐 Podrška za više jezika + +#### Podržano putem GitHub Action (Automatizirano i uvijek ažurirano) + +[French](../fr/README.md) | [Spanish](../es/README.md) | [German](../de/README.md) | [Russian](../ru/README.md) | [Arabic](../ar/README.md) | [Persian (Farsi)](../fa/README.md) | [Urdu](../ur/README.md) | [Chinese (Simplified)](../zh/README.md) | [Chinese (Traditional, Macau)](../mo/README.md) | [Chinese (Traditional, Hong Kong)](../hk/README.md) | [Chinese (Traditional, Taiwan)](../tw/README.md) | [Japanese](../ja/README.md) | [Korean](../ko/README.md) | [Hindi](../hi/README.md) | [Bengali](../bn/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Portuguese (Portugal)](../pt/README.md) | [Portuguese (Brazil)](../br/README.md) | [Italian](../it/README.md) | [Polish](../pl/README.md) | [Turkish](../tr/README.md) | [Greek](../el/README.md) | [Thai](../th/README.md) | [Swedish](../sv/README.md) | [Danish](../da/README.md) | [Norwegian](../no/README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](../he/README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Croatian](./README.md) | [Slovenian](../sl/README.md) | [Ukrainian](../uk/README.md) | [Burmese (Myanmar)](../my/README.md) + +#### Pridružite se zajednici + +[![Azure AI Discord](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) + +# Strojno učenje za početnike - Kurikulum + +> 🌍 Putujte svijetom dok istražujemo strojno učenje kroz kulture svijeta 🌍 + +Cloud Advocates u Microsoftu s ponosom nude 12-tjedni kurikulum s 26 lekcija o **strojnom učenju**. U ovom kurikulumu naučit ćete o onome što se ponekad naziva **klasično strojno učenje**, koristeći prvenstveno Scikit-learn kao biblioteku i izbjegavajući duboko učenje, koje je pokriveno u našem [kurikulumu AI za početnike](https://aka.ms/ai4beginners). Povežite ove lekcije s našim kurikulumom ['Data Science za početnike'](https://aka.ms/ds4beginners), također! + +Putujte s nama svijetom dok primjenjujemo ove klasične tehnike na podatke iz različitih dijelova svijeta. Svaka lekcija uključuje kvizove prije i nakon lekcije, pisane upute za dovršavanje lekcije, rješenje, zadatak i još mnogo toga. Naša metodologija temeljena na projektima omogućuje vam učenje kroz izgradnju, što je dokazano učinkovit način za usvajanje novih vještina. + +**✍️ Velika zahvala našim autorima** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Anirban Mukherjee, Ornella Altunyan, Ruth Yakubu i Amy Boyd + +**🎨 Zahvala i našim ilustratorima** Tomomi Imura, Dasani Madipalli i Jen Looper + +**🙏 Posebna zahvala 🙏 našim Microsoft Student Ambassador autorima, recenzentima i suradnicima sadržaja**, posebno Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila i Snigdha Agarwal + +**🤩 Dodatna zahvalnost Microsoft Student Ambassadorima Eric Wanjau, Jasleen Sondhi i Vidushi Gupta za naše lekcije o R-u!** + +# Početak + +Slijedite ove korake: +1. **Forkajte repozitorij**: Kliknite na gumb "Fork" u gornjem desnom kutu ove stranice. +2. **Klonirajte repozitorij**: `git clone https://github.com/microsoft/ML-For-Beginners.git` + +> [pronađite sve dodatne resurse za ovaj tečaj u našoj Microsoft Learn kolekciji](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +**[Studenti](https://aka.ms/student-page)**, za korištenje ovog kurikuluma, forkajte cijeli repo na svoj GitHub račun i dovršite vježbe sami ili u grupi: + +- Započnite s kvizom prije predavanja. +- Pročitajte predavanje i dovršite aktivnosti, zaustavljajući se i razmišljajući na svakom provjeravanju znanja. +- Pokušajte izraditi projekte razumijevanjem lekcija umjesto pokretanja rješenja koda; međutim, taj kod je dostupan u `/solution` mapama u svakoj lekciji temeljenoj na projektu. +- Riješite kviz nakon predavanja. +- Dovršite izazov. +- Dovršite zadatak. +- Nakon dovršetka grupe lekcija, posjetite [Diskusijsku ploču](https://github.com/microsoft/ML-For-Beginners/discussions) i "učite glasno" ispunjavanjem odgovarajuće PAT rubrike. 'PAT' je alat za procjenu napretka, rubrika koju ispunjavate kako biste dodatno unaprijedili svoje učenje. Također možete reagirati na druge PAT-ove kako bismo učili zajedno. + +> Za daljnje učenje, preporučujemo praćenje ovih [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott) modula i putova učenja. + +**Nastavnici**, [uključili smo neke prijedloge](for-teachers.md) o tome kako koristiti ovaj kurikulum. + +--- + +## Video vodiči + +Neke lekcije dostupne su kao kratki videozapisi. Sve ih možete pronaći unutar lekcija ili na [ML za početnike playlisti na Microsoft Developer YouTube kanalu](https://aka.ms/ml-beginners-videos) klikom na sliku ispod. + +[![ML za početnike banner](../../images/ml-for-beginners-video-banner.png)](https://aka.ms/ml-beginners-videos) + +--- + +## Upoznajte tim + +[![Promo video](../../images/ml.gif)](https://youtu.be/Tj1XWrDSYJU) + +**Gif autor** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal) + +> 🎥 Kliknite na sliku iznad za video o projektu i ljudima koji su ga stvorili! + +--- + +## Pedagogija + +Odabrali smo dva pedagoška načela prilikom izrade ovog kurikuluma: osigurati da je praktičan **temeljen na projektima** i da uključuje **česte kvizove**. Osim toga, ovaj kurikulum ima zajedničku **temu** koja mu daje koheziju. + +Osiguravanjem da sadržaj odgovara projektima, proces postaje zanimljiviji za studente, a zadržavanje koncepata se povećava. Osim toga, kviz s niskim rizikom prije predavanja usmjerava namjeru studenta prema učenju teme, dok drugi kviz nakon predavanja osigurava daljnje zadržavanje. Ovaj kurikulum je dizajniran da bude fleksibilan i zabavan te se može uzeti u cijelosti ili djelomično. Projekti počinju jednostavno i postaju sve složeniji do kraja 12-tjednog ciklusa. Ovaj kurikulum također uključuje dodatak o stvarnim primjenama strojnog učenja, koji se može koristiti kao dodatni zadatak ili kao osnova za raspravu. + +> Pronađite naš [Kodeks ponašanja](CODE_OF_CONDUCT.md), [Doprinos](CONTRIBUTING.md) i [Smjernice za prijevod](TRANSLATIONS.md). Dobrodošli ste podijeliti konstruktivne povratne informacije! + +## Svaka lekcija uključuje + +- opcionalni sketchnote +- opcionalni dopunski video +- video vodič (samo neke lekcije) +- [kviz za zagrijavanje prije predavanja](https://ff-quizzes.netlify.app/en/ml/) +- pisanu lekciju +- za lekcije temeljene na projektima, vodiče korak po korak kako izraditi projekt +- provjere znanja +- izazov +- dopunsko čitanje +- zadatak +- [kviz nakon predavanja](https://ff-quizzes.netlify.app/en/ml/) + +> **Napomena o jezicima**: Ove lekcije su prvenstveno napisane u Pythonu, ali mnoge su dostupne i u R-u. Za dovršavanje lekcije u R-u, idite u `/solution` mapu i potražite lekcije u R-u. One uključuju .rmd ekstenziju koja predstavlja **R Markdown** datoteku koja se može jednostavno definirati kao ugrađivanje `code chunks` (R ili drugih jezika) i `YAML header` (koji vodi kako formatirati izlaze poput PDF-a) u `Markdown dokument`. Kao takva, služi kao primjeran okvir za autorstvo u znanosti o podacima jer vam omogućuje kombiniranje vašeg koda, njegovog izlaza i vaših misli pisanjem u Markdownu. Osim toga, R Markdown dokumenti mogu se prikazati u formatima izlaza poput PDF-a, HTML-a ili Worda. + +> **Napomena o kvizovima**: Svi kvizovi nalaze se u [Quiz App mapi](../../quiz-app), ukupno 52 kviza s po tri pitanja. Povezani su unutar lekcija, ali aplikacija za kviz može se pokrenuti lokalno; slijedite upute u `quiz-app` mapi za lokalno hostiranje ili implementaciju na Azure. + +| Broj lekcije | Tema | Grupiranje lekcija | Ciljevi učenja | Povezana lekcija | Autor | +| :-----------: | :------------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: | +| 01 | Uvod u strojno učenje | [Uvod](1-Introduction/README.md) | Naučite osnovne koncepte strojnog učenja | [Lekcija](1-Introduction/1-intro-to-ML/README.md) | Muhammad | +| 02 | Povijest strojnog učenja | [Uvod](1-Introduction/README.md) | Naučite povijest ovog područja | [Lekcija](1-Introduction/2-history-of-ML/README.md) | Jen i Amy | +| 03 | Pravednost i strojno učenje | [Uvod](1-Introduction/README.md) | Koja su važna filozofska pitanja o pravednosti koja studenti trebaju razmotriti prilikom izrade i primjene ML modela? | [Lekcija](1-Introduction/3-fairness/README.md) | Tomomi | +| 04 | Tehnike za strojno učenje | [Uvod](1-Introduction/README.md) | Koje tehnike koriste istraživači strojnog učenja za izradu modela strojnog učenja? | [Lekcija](1-Introduction/4-techniques-of-ML/README.md) | Chris i Jen | +| 05 | Uvod u regresiju | [Regresija](2-Regression/README.md) | Počnite s Pythonom i Scikit-learnom za modele regresije | +
  • [Python](2-Regression/1-Tools/README.md)
  • [R](../../2-Regression/1-Tools/solution/R/lesson_1.html)
|
  • Jen
  • Eric Wanjau
| +| 06 | Cijene bundeva u Sjevernoj Americi 🎃 | [Regresija](2-Regression/README.md) | Vizualizirajte i očistite podatke u pripremi za strojno učenje |
  • [Python](2-Regression/2-Data/README.md)
  • [R](../../2-Regression/2-Data/solution/R/lesson_2.html)
|
  • Jen
  • Eric Wanjau
| +| 07 | Cijene bundeva u Sjevernoj Americi 🎃 | [Regresija](2-Regression/README.md) | Izradite linearne i polinomne regresijske modele |
  • [Python](2-Regression/3-Linear/README.md)
  • [R](../../2-Regression/3-Linear/solution/R/lesson_3.html)
|
  • Jen i Dmitry
  • Eric Wanjau
| +| 08 | Cijene bundeva u Sjevernoj Americi 🎃 | [Regresija](2-Regression/README.md) | Izradite logistički regresijski model |
  • [Python](2-Regression/4-Logistic/README.md)
  • [R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)
|
  • Jen
  • Eric Wanjau
| +| 09 | Web aplikacija 🔌 | [Web aplikacija](3-Web-App/README.md) | Izradite web aplikaciju za korištenje vašeg treniranog modela | [Python](3-Web-App/1-Web-App/README.md) | Jen | +| 10 | Uvod u klasifikaciju | [Klasifikacija](4-Classification/README.md) | Očistite, pripremite i vizualizirajte podatke; uvod u klasifikaciju |
  • [Python](4-Classification/1-Introduction/README.md)
  • [R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) |
    • Jen i Cassie
    • Eric Wanjau
    | +| 11 | Ukusna azijska i indijska kuhinja 🍜 | [Klasifikacija](4-Classification/README.md) | Uvod u klasifikatore |
    • [Python](4-Classification/2-Classifiers-1/README.md)
    • [R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) |
      • Jen i Cassie
      • Eric Wanjau
      | +| 12 | Ukusna azijska i indijska kuhinja 🍜 | [Klasifikacija](4-Classification/README.md) | Više klasifikatora |
      • [Python](4-Classification/3-Classifiers-2/README.md)
      • [R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) |
        • Jen i Cassie
        • Eric Wanjau
        | +| 13 | Ukusna azijska i indijska kuhinja 🍜 | [Klasifikacija](4-Classification/README.md) | Izradite web aplikaciju za preporuke koristeći vaš model | [Python](4-Classification/4-Applied/README.md) | Jen | +| 14 | Uvod u grupiranje | [Grupiranje](5-Clustering/README.md) | Očistite, pripremite i vizualizirajte podatke; uvod u grupiranje |
        • [Python](5-Clustering/1-Visualize/README.md)
        • [R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) |
          • Jen
          • Eric Wanjau
          | +| 15 | Istraživanje glazbenih ukusa u Nigeriji 🎧 | [Grupiranje](5-Clustering/README.md) | Istražite metodu grupiranja K-Means |
          • [Python](5-Clustering/2-K-Means/README.md)
          • [R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) |
            • Jen
            • Eric Wanjau
            | +| 16 | Uvod u obradu prirodnog jezika ☕️ | [Obrada prirodnog jezika](6-NLP/README.md) | Naučite osnove NLP-a izradom jednostavnog bota | [Python](6-NLP/1-Introduction-to-NLP/README.md) | Stephen | +| 17 | Uobičajeni NLP zadaci ☕️ | [Obrada prirodnog jezika](6-NLP/README.md) | Produbite svoje znanje o NLP-u razumijevanjem uobičajenih zadataka vezanih uz jezične strukture | [Python](6-NLP/2-Tasks/README.md) | Stephen | +| 18 | Prijevod i analiza sentimenta ♥️ | [Obrada prirodnog jezika](6-NLP/README.md) | Prijevod i analiza sentimenta s Jane Austen | [Python](6-NLP/3-Translation-Sentiment/README.md) | Stephen | +| 19 | Romantični hoteli u Europi ♥️ | [Obrada prirodnog jezika](6-NLP/README.md) | Analiza sentimenta s recenzijama hotela 1 | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | Stephen | +| 20 | Romantični hoteli u Europi ♥️ | [Obrada prirodnog jezika](6-NLP/README.md) | Analiza sentimenta s recenzijama hotela 2 | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | Stephen | +| 21 | Uvod u predviđanje vremenskih serija | [Vremenske serije](7-TimeSeries/README.md) | Uvod u predviđanje vremenskih serija | [Python](7-TimeSeries/1-Introduction/README.md) | Francesca | +| 22 | ⚡️ Svjetska potrošnja energije ⚡️ - predviđanje vremenskih serija s ARIMA | [Vremenske serije](7-TimeSeries/README.md) | Predviđanje vremenskih serija s ARIMA | [Python](7-TimeSeries/2-ARIMA/README.md) | Francesca | +| 23 | ⚡️ Svjetska potrošnja energije ⚡️ - predviđanje vremenskih serija s SVR | [Vremenske serije](7-TimeSeries/README.md) | Predviđanje vremenskih serija s regresorom potpornih vektora | [Python](7-TimeSeries/3-SVR/README.md) | Anirban | +| 24 | Uvod u učenje putem pojačanja | [Učenje putem pojačanja](8-Reinforcement/README.md) | Uvod u učenje putem pojačanja s Q-Learning | [Python](8-Reinforcement/1-QLearning/README.md) | Dmitry | +| 25 | Pomozite Peteru izbjeći vuka! 🐺 | [Učenje putem pojačanja](8-Reinforcement/README.md) | Gym za učenje putem pojačanja | [Python](8-Reinforcement/2-Gym/README.md) | Dmitry | +| Postscript | Scenariji i primjene strojnog učenja u stvarnom svijetu | [ML u stvarnom svijetu](9-Real-World/README.md) | Zanimljive i otkrivajuće primjene klasičnog strojnog učenja u stvarnom svijetu | [Lekcija](9-Real-World/1-Applications/README.md) | Tim | +| Postscript | Debugging modela u ML-u koristeći RAI nadzornu ploču | [ML u stvarnom svijetu](9-Real-World/README.md) | Debugging modela strojnog učenja koristeći komponente nadzorne ploče za odgovornu umjetnu inteligenciju | [Lekcija](9-Real-World/2-Debugging-ML-Models/README.md) | Ruth Yakubu | + +> [pronađite sve dodatne resurse za ovaj tečaj u našoj Microsoft Learn kolekciji](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +## Offline pristup + +Možete pokrenuti ovu dokumentaciju offline koristeći [Docsify](https://docsify.js.org/#/). Forkajte ovaj repo, [instalirajte Docsify](https://docsify.js.org/#/quickstart) na vašem lokalnom računalu, a zatim u root folderu ovog repozitorija upišite `docsify serve`. Web stranica će biti poslužena na portu 3000 na vašem localhostu: `localhost:3000`. + +## PDF-ovi + +Pronađite PDF kurikuluma s poveznicama [ovdje](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf). + + +## 🎒 Ostali tečajevi + +Naš tim proizvodi i druge tečajeve! Pogledajte: + +- [Generativna AI za početnike](https://aka.ms/genai-beginners) +- [Generativna AI za početnike .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet) +- [Generativna AI s JavaScriptom](https://github.com/microsoft/generative-ai-with-javascript) +- [Generativna AI s Javom](https://github.com/microsoft/Generative-AI-for-beginners-java) +- [AI za početnike](https://aka.ms/ai-beginners) +- [Data Science za početnike](https://aka.ms/datascience-beginners) +- [ML za početnike](https://aka.ms/ml-beginners) +- [Kibernetička sigurnost za početnike](https://github.com/microsoft/Security-101) +- [Web razvoj za početnike](https://aka.ms/webdev-beginners) +- [IoT za početnike](https://aka.ms/iot-beginners) +- [XR razvoj za početnike](https://github.com/microsoft/xr-development-for-beginners) +- [Ovladavanje GitHub Copilotom za parno programiranje](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming) +- [Ovladavanje GitHub Copilotom za C#/.NET developere](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers) +- [Odaberite svoju Copilot avanturu](https://github.com/microsoft/CopilotAdventures) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za nesporazume ili pogrešne interpretacije koje mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/SECURITY.md b/translations/hr/SECURITY.md new file mode 100644 index 00000000..a98ee4d5 --- /dev/null +++ b/translations/hr/SECURITY.md @@ -0,0 +1,51 @@ + +## Sigurnost + +Microsoft ozbiljno shvaća sigurnost svojih softverskih proizvoda i usluga, uključujući sve repozitorije izvornog koda kojima upravljamo putem naših GitHub organizacija, koje uključuju [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin) i [naše GitHub organizacije](https://opensource.microsoft.com/). + +Ako smatrate da ste pronašli sigurnosni propust u bilo kojem repozitoriju u vlasništvu Microsofta koji odgovara [Microsoftovoj definiciji sigurnosnog propusta](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott), molimo da ga prijavite na način opisan u nastavku. + +## Prijava sigurnosnih problema + +**Molimo da ne prijavljujete sigurnosne propuste putem javnih GitHub problema.** + +Umjesto toga, prijavite ih Microsoftovom centru za sigurnosne odgovore (MSRC) na [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). + +Ako preferirate prijavu bez prijave, pošaljite email na [secure@microsoft.com](mailto:secure@microsoft.com). Ako je moguće, šifrirajte svoju poruku našim PGP ključem; preuzmite ga sa stranice [Microsoft Security Response Center PGP Key](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). + +Trebali biste dobiti odgovor unutar 24 sata. Ako iz nekog razloga ne dobijete odgovor, molimo da nas kontaktirate putem emaila kako biste osigurali da smo primili vašu originalnu poruku. Dodatne informacije možete pronaći na [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Molimo da uključite tražene informacije navedene u nastavku (koliko god možete pružiti) kako biste nam pomogli bolje razumjeti prirodu i opseg mogućeg problema: + + * Vrsta problema (npr. buffer overflow, SQL injekcija, cross-site scripting, itd.) + * Puni putovi izvornog file-a povezanog s manifestacijom problema + * Lokacija pogođenog izvornog koda (tag/grana/commit ili direktni URL) + * Bilo koja posebna konfiguracija potrebna za reprodukciju problema + * Korak-po-korak upute za reprodukciju problema + * Proof-of-concept ili exploit kod (ako je moguće) + * Utjecaj problema, uključujući kako napadač može iskoristiti problem + +Ove informacije pomoći će nam da brže obradimo vaš izvještaj. + +Ako prijavljujete za nagradu za greške, detaljniji izvještaji mogu doprinijeti većem iznosu nagrade. Posjetite našu stranicu [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) za više detalja o našim aktivnim programima. + +## Preferirani jezici + +Preferiramo da sva komunikacija bude na engleskom jeziku. + +## Politika + +Microsoft slijedi načelo [Koordiniranog otkrivanja ranjivosti](https://www.microsoft.com/en-us/msrc/cvd). + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/SUPPORT.md b/translations/hr/SUPPORT.md new file mode 100644 index 00000000..b2124f62 --- /dev/null +++ b/translations/hr/SUPPORT.md @@ -0,0 +1,24 @@ + +# Podrška +## Kako prijaviti probleme i dobiti pomoć + +Ovaj projekt koristi GitHub Issues za praćenje grešaka i zahtjeva za značajkama. Prije nego što prijavite novi problem, pretražite postojeće probleme kako biste izbjegli dupliciranje. Za nove probleme, prijavite svoju grešku ili zahtjev za značajkom kao novi problem. + +Za pomoć i pitanja o korištenju ovog projekta, prijavite problem. + +## Microsoftova politika podrške + +Podrška za ovaj repozitorij ograničena je na gore navedene resurse. + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/docs/_sidebar.md b/translations/hr/docs/_sidebar.md new file mode 100644 index 00000000..00a632a2 --- /dev/null +++ b/translations/hr/docs/_sidebar.md @@ -0,0 +1,57 @@ + +- Uvod + - [Uvod u strojno učenje](../1-Introduction/1-intro-to-ML/README.md) + - [Povijest strojnog učenja](../1-Introduction/2-history-of-ML/README.md) + - [Strojno učenje i pravednost](../1-Introduction/3-fairness/README.md) + - [Tehnike strojnog učenja](../1-Introduction/4-techniques-of-ML/README.md) + +- Regresija + - [Alati za rad](../2-Regression/1-Tools/README.md) + - [Podaci](../2-Regression/2-Data/README.md) + - [Linearna regresija](../2-Regression/3-Linear/README.md) + - [Logistička regresija](../2-Regression/4-Logistic/README.md) + +- Izrada web aplikacije + - [Web aplikacija](../3-Web-App/1-Web-App/README.md) + +- Klasifikacija + - [Uvod u klasifikaciju](../4-Classification/1-Introduction/README.md) + - [Klasifikatori 1](../4-Classification/2-Classifiers-1/README.md) + - [Klasifikatori 2](../4-Classification/3-Classifiers-2/README.md) + - [Primijenjeno strojno učenje](../4-Classification/4-Applied/README.md) + +- Grupiranje + - [Vizualizacija podataka](../5-Clustering/1-Visualize/README.md) + - [K-Means](../5-Clustering/2-K-Means/README.md) + +- Obrada prirodnog jezika (NLP) + - [Uvod u NLP](../6-NLP/1-Introduction-to-NLP/README.md) + - [NLP zadaci](../6-NLP/2-Tasks/README.md) + - [Prijevod i sentiment](../6-NLP/3-Translation-Sentiment/README.md) + - [Recenzije hotela 1](../6-NLP/4-Hotel-Reviews-1/README.md) + - [Recenzije hotela 2](../6-NLP/5-Hotel-Reviews-2/README.md) + +- Predviđanje vremenskih serija + - [Uvod u predviđanje vremenskih serija](../7-TimeSeries/1-Introduction/README.md) + - [ARIMA](../7-TimeSeries/2-ARIMA/README.md) + - [SVR](../7-TimeSeries/3-SVR/README.md) + +- Učenje kroz potkrepljenje + - [Q-Learning](../8-Reinforcement/1-QLearning/README.md) + - [Gym](../8-Reinforcement/2-Gym/README.md) + +- Strojno učenje u stvarnom svijetu + - [Primjene](../9-Real-World/1-Applications/README.md) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/for-teachers.md b/translations/hr/for-teachers.md new file mode 100644 index 00000000..5283c7c5 --- /dev/null +++ b/translations/hr/for-teachers.md @@ -0,0 +1,37 @@ + +## Za edukatore + +Želite li koristiti ovaj kurikulum u svojoj učionici? Slobodno ga iskoristite! + +Zapravo, možete ga koristiti direktno na GitHubu pomoću GitHub Classroom. + +Da biste to učinili, napravite fork ovog repozitorija. Trebat ćete kreirati repozitorij za svaku lekciju, pa ćete morati izdvojiti svaku mapu u zaseban repozitorij. Na taj način [GitHub Classroom](https://classroom.github.com/classrooms) može prepoznati svaku lekciju zasebno. + +Ove [detaljne upute](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) dat će vam ideju kako postaviti svoju učionicu. + +## Korištenje repozitorija u trenutnom obliku + +Ako želite koristiti ovaj repozitorij u njegovom trenutnom obliku, bez korištenja GitHub Classroom, to je također moguće. Trebat ćete komunicirati sa svojim učenicima o tome koju lekciju zajedno obraditi. + +U online formatu (Zoom, Teams ili drugi) možete organizirati breakout sobe za kvizove i mentorirati učenike kako bi se pripremili za učenje. Zatim pozovite učenike da sudjeluju u kvizovima i predaju svoje odgovore kao 'issues' u određeno vrijeme. Isto možete učiniti s zadacima, ako želite da učenici surađuju javno. + +Ako preferirate privatniji format, zamolite učenike da forkaju kurikulum, lekciju po lekciju, u svoje privatne GitHub repozitorije i daju vam pristup. Tada mogu privatno završiti kvizove i zadatke te ih predati vama putem 'issues' na vašem repozitoriju za učionicu. + +Postoji mnogo načina kako ovo može funkcionirati u online učionici. Javite nam što vam najbolje odgovara! + +## Molimo podijelite svoje mišljenje! + +Želimo da ovaj kurikulum bude koristan za vas i vaše učenike. Molimo vas da nam ostavite [povratne informacije](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u). + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/quiz-app/README.md b/translations/hr/quiz-app/README.md new file mode 100644 index 00000000..9a0a9f68 --- /dev/null +++ b/translations/hr/quiz-app/README.md @@ -0,0 +1,126 @@ + +# Kvizovi + +Ovi kvizovi su uvodni i završni kvizovi za ML kurikulum na https://aka.ms/ml-beginners + +## Postavljanje projekta + +``` +npm install +``` + +### Kompajlira i automatski učitava za razvoj + +``` +npm run serve +``` + +### Kompajlira i minimizira za produkciju + +``` +npm run build +``` + +### Provjerava i popravlja datoteke + +``` +npm run lint +``` + +### Prilagodba konfiguracije + +Pogledajte [Referencu za konfiguraciju](https://cli.vuejs.org/config/). + +Zasluge: Zahvala originalnoj verziji ove aplikacije za kviz: https://github.com/arpan45/simple-quiz-vue + +## Postavljanje na Azure + +Evo korak-po-korak vodiča koji će vam pomoći da započnete: + +1. Forkajte GitHub repozitorij +Osigurajte da je kod vaše statične web aplikacije u vašem GitHub repozitoriju. Forkajte ovaj repozitorij. + +2. Kreirajte Azure Static Web App +- Kreirajte [Azure račun](http://azure.microsoft.com) +- Idite na [Azure portal](https://portal.azure.com) +- Kliknite na “Create a resource” i potražite “Static Web App”. +- Kliknite “Create”. + +3. Konfigurirajte Static Web App +- Osnovno: Pretplata: Odaberite svoju Azure pretplatu. +- Resource Group: Kreirajte novu grupu resursa ili koristite postojeću. +- Naziv: Dodijelite naziv svojoj statičnoj web aplikaciji. +- Regija: Odaberite regiju najbližu vašim korisnicima. + +- #### Detalji o implementaciji: +- Izvor: Odaberite “GitHub”. +- GitHub račun: Autorizirajte Azure za pristup vašem GitHub računu. +- Organizacija: Odaberite svoju GitHub organizaciju. +- Repozitorij: Odaberite repozitorij koji sadrži vašu statičnu web aplikaciju. +- Grana: Odaberite granu iz koje želite implementirati. + +- #### Detalji o izgradnji: +- Predlošci za izgradnju: Odaberite okvir na kojem je vaša aplikacija izgrađena (npr. React, Angular, Vue, itd.). +- Lokacija aplikacije: Navedite mapu koja sadrži kod vaše aplikacije (npr. / ako je u korijenu). +- Lokacija API-ja: Ako imate API, navedite njegovu lokaciju (opcionalno). +- Lokacija izlaza: Navedite mapu u kojoj se generira izlaz izgradnje (npr. build ili dist). + +4. Pregled i kreiranje +Pregledajte svoje postavke i kliknite “Create”. Azure će postaviti potrebne resurse i kreirati GitHub Actions workflow u vašem repozitoriju. + +5. GitHub Actions Workflow +Azure će automatski kreirati GitHub Actions workflow datoteku u vašem repozitoriju (.github/workflows/azure-static-web-apps-.yml). Ovaj workflow će upravljati procesom izgradnje i implementacije. + +6. Praćenje implementacije +Idite na karticu “Actions” u vašem GitHub repozitoriju. +Trebali biste vidjeti workflow koji se pokreće. Ovaj workflow će izgraditi i implementirati vašu statičnu web aplikaciju na Azure. +Nakon što workflow završi, vaša aplikacija će biti dostupna na dodijeljenom Azure URL-u. + +### Primjer datoteke workflowa + +Evo primjera kako bi GitHub Actions workflow datoteka mogla izgledati: +name: Azure Static Web Apps CI/CD +``` +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - main + +jobs: + build_and_deploy_job: + runs-on: ubuntu-latest + name: Build and Deploy Job + steps: + - uses: actions/checkout@v2 + - name: Build And Deploy + id: builddeploy + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }} + repo_token: ${{ secrets.GITHUB_TOKEN }} + action: "upload" + app_location: "/quiz-app" # App source code path + api_location: ""API source code path optional + output_location: "dist" #Built app content directory - optional +``` + +### Dodatni resursi +- [Dokumentacija za Azure Static Web Apps](https://learn.microsoft.com/azure/static-web-apps/getting-started) +- [Dokumentacija za GitHub Actions](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/sketchnotes/LICENSE.md b/translations/hr/sketchnotes/LICENSE.md new file mode 100644 index 00000000..3dc6444f --- /dev/null +++ b/translations/hr/sketchnotes/LICENSE.md @@ -0,0 +1,277 @@ + +Priznanje-Dijeljenje pod istim uvjetima 4.0 Međunarodna + +======================================================================= + +Creative Commons Corporation ("Creative Commons") nije odvjetnička tvrtka i ne pruža pravne usluge ili pravne savjete. Distribucija javnih licenci Creative Commons ne stvara odnos odvjetnika i klijenta ili bilo koji drugi odnos. Creative Commons čini svoje licence i povezane informacije dostupnima "takvima kakve jesu". Creative Commons ne daje nikakva jamstva u vezi sa svojim licencama, bilo kojim materijalom licenciranim prema njihovim uvjetima i odredbama, ili bilo kojim povezanim informacijama. Creative Commons odriče svaku odgovornost za štetu koja proizlazi iz njihove upotrebe u najvećoj mogućoj mjeri. + +Korištenje javnih licenci Creative Commons + +Javne licence Creative Commons pružaju standardni skup uvjeta koje autori i drugi nositelji prava mogu koristiti za dijeljenje originalnih autorskih djela i drugog materijala podložnog autorskom pravu i određenim drugim pravima navedenim u javnoj licenci u nastavku. Sljedeće napomene služe samo u informativne svrhe, nisu iscrpne i ne čine dio naših licenci. + + Napomene za davatelje licenci: Naše javne licence namijenjene su + za korištenje od strane onih koji su ovlašteni dati javnosti + dopuštenje za korištenje materijala na načine koji su inače + ograničeni autorskim pravom i određenim drugim pravima. Naše + licence su neopozive. Davatelji licenci trebaju pročitati i + razumjeti uvjete licence koju odaberu prije nego što je primijene. + Davatelji licenci također trebaju osigurati sva potrebna prava + prije primjene naših licenci kako bi javnost mogla ponovno + koristiti materijal kako se očekuje. Davatelji licenci trebaju + jasno označiti bilo koji materijal koji nije podložan licenci. To + uključuje drugi materijal licenciran pod CC-licencama ili + materijal korišten pod iznimkom ili ograničenjem autorskog prava. + Više napomena za davatelje licenci: + wiki.creativecommons.org/Considerations_for_licensors + + Napomene za javnost: Korištenjem jedne od naših javnih licenci, + davatelj licence daje javnosti dopuštenje za korištenje + licenciranog materijala pod određenim uvjetima. Ako dopuštenje + davatelja licence nije potrebno iz bilo kojeg razloga – na + primjer, zbog primjenjive iznimke ili ograničenja autorskog prava + – tada takva upotreba nije regulirana licencom. Naše licence + dodjeljuju samo dopuštenja pod autorskim pravom i određenim + drugim pravima koje davatelj licence ima ovlast dodijeliti. + Korištenje licenciranog materijala može i dalje biti ograničeno + iz drugih razloga, uključujući zbog toga što drugi imaju autorska + prava ili druga prava na materijal. Davatelj licence može + postaviti posebne zahtjeve, poput traženja da se sve promjene + označe ili opišu. Iako to nije zahtjev naših licenci, potiče se + poštivanje takvih zahtjeva gdje je to razumno. Više napomena za + javnost: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Priznanje-Dijeljenje pod istim uvjetima 4.0 Međunarodna javna licenca + +Korištenjem Licenciranih prava (definiranih u nastavku), prihvaćate i slažete se da ćete biti vezani uvjetima i odredbama ove Creative Commons Priznanje-Dijeljenje pod istim uvjetima 4.0 Međunarodne javne licence ("Javna licenca"). U mjeri u kojoj se ova Javna licenca može tumačiti kao ugovor, dodijeljena su vam Licencirana prava u zamjenu za vaše prihvaćanje ovih uvjeta i odredbi, a Davatelj licence vam dodjeljuje takva prava u zamjenu za koristi koje Davatelj licence dobiva stavljanjem Licenciranog materijala na raspolaganje pod ovim uvjetima i odredbama. + +Odjeljak 1 -- Definicije. + + a. Prilagođeni materijal znači materijal podložan autorskom pravu i + sličnim pravima koji je izveden iz ili temeljen na Licenciranom + materijalu i u kojem je Licencirani materijal preveden, + izmijenjen, aranžiran, transformiran ili na drugi način + modificiran na način koji zahtijeva dopuštenje prema autorskom + pravu i sličnim pravima koja drži Davatelj licence. Za potrebe + ove Javne licence, gdje je Licencirani materijal glazbeno djelo, + izvedba ili zvučni zapis, Prilagođeni materijal uvijek se + proizvodi kada je Licencirani materijal sinkroniziran u vremenskom + odnosu s pokretnom slikom. + + b. Licenca prilagoditelja znači licenca koju primjenjujete na svoja + autorska prava i slična prava u svojim doprinosima Prilagođenom + materijalu u skladu s uvjetima i odredbama ove Javne licence. + + c. Licenca kompatibilna s BY-SA znači licenca navedena na + creativecommons.org/compatiblelicenses, odobrena od strane + Creative Commonsa kao suštinski ekvivalent ove Javne licence. + + d. Autorska prava i slična prava znače autorska prava i/ili slična + prava usko povezana s autorskim pravom, uključujući, bez + ograničenja, prava na izvedbu, emitiranje, zvučni zapis i prava + sui generis na baze podataka, bez obzira na to kako su prava + označena ili kategorizirana. Za potrebe ove Javne licence, prava + navedena u Odjeljku 2(b)(1)-(2) nisu autorska prava i slična + prava. + + e. Učinkovite tehnološke mjere znače one mjere koje, u odsutnosti + odgovarajuće ovlasti, ne mogu biti zaobiđene prema zakonima koji + ispunjavaju obveze prema članku 11. WIPO Ugovora o autorskom + pravu usvojenog 20. prosinca 1996. i/ili sličnim međunarodnim + sporazumima. + + f. Iznimke i ograničenja znače poštenu upotrebu, pošteno postupanje + i/ili bilo koju drugu iznimku ili ograničenje autorskog prava i + sličnih prava koja se primjenjuju na vašu upotrebu Licenciranog + materijala. + + g. Elementi licence znače atribute licence navedene u nazivu Javne + licence Creative Commons. Elementi licence ove Javne licence su + Priznanje i Dijeljenje pod istim uvjetima. + + h. Licencirani materijal znači umjetničko ili književno djelo, + baza podataka ili drugi materijal na koji je Davatelj licence + primijenio ovu Javnu licencu. + + i. Licencirana prava znače prava dodijeljena vama pod uvjetima i + odredbama ove Javne licence, koja su ograničena na sva autorska + prava i slična prava koja se primjenjuju na vašu upotrebu + Licenciranog materijala i koja Davatelj licence ima ovlast + licencirati. + + j. Davatelj licence znači pojedinac(i) ili entitet(i) koji dodjeljuju + prava prema ovoj Javnoj licenci. + + k. Dijeljenje znači pružanje materijala javnosti bilo kojim sredstvom + ili procesom koji zahtijeva dopuštenje prema Licenciranim pravima, + poput reprodukcije, javnog prikazivanja, javne izvedbe, + distribucije, širenja, komunikacije ili uvoza, te stavljanje + materijala na raspolaganje javnosti, uključujući na načine koji + omogućuju članovima javnosti pristup materijalu s mjesta i u + vrijeme koje sami odaberu. + + l. Prava sui generis na baze podataka znače prava koja nisu autorska + prava, a proizlaze iz Direktive 96/9/EC Europskog parlamenta i + Vijeća od 11. ožujka 1996. o pravnoj zaštiti baza podataka, kako + je izmijenjena i/ili naslijeđena, kao i druga suštinski ekvivalentna + prava bilo gdje u svijetu. + + m. Vi znači pojedinac ili entitet koji koristi Licencirana prava + prema ovoj Javnoj licenci. Vaš ima odgovarajuće značenje. + +Odjeljak 2 -- Opseg. + + a. Dodjela licence. + + 1. Pod uvjetima i odredbama ove Javne licence, Davatelj licence + vam ovime dodjeljuje globalnu, besplatnu, ne-sublicencibilnu, + ne-ekskluzivnu, neopozivu licencu za korištenje Licenciranih + prava u Licenciranom materijalu kako biste: + + a. reproducirali i dijelili Licencirani materijal, u cijelosti + ili djelomično; i + + b. proizvodili, reproducirali i dijelili Prilagođeni materijal. + + 2. Iznimke i ograničenja. Radi izbjegavanja sumnje, gdje se + primjenjuju iznimke i ograničenja na vašu upotrebu, ova Javna + licenca se ne primjenjuje, i ne morate se pridržavati njezinih + uvjeta i odredbi. + + 3. Trajanje. Trajanje ove Javne licence navedeno je u Odjeljku + 6(a). + + 4. Mediji i formati; dopuštene tehničke izmjene. Davatelj licence + ovlašćuje vas da koristite Licencirana prava u svim medijima i + formatima, bilo poznatim ili budućim, te da napravite tehničke + izmjene potrebne za to. Davatelj licence odriče se i/ili + pristaje ne isticati bilo koje pravo ili ovlast da vam zabrani + tehničke izmjene potrebne za korištenje Licenciranih prava, + uključujući tehničke izmjene potrebne za zaobilaženje + Učinkovitih tehnoloških mjera. Za potrebe ove Javne licence, + samo izrada izmjena ovlaštenih ovim Odjeljkom 2(a)(4) nikada + ne proizvodi Prilagođeni materijal. + + 5. Primatelji nizvodno. + + a. Ponuda Davatelja licence -- Licencirani materijal. Svaki + primatelj Licenciranog materijala automatski prima ponudu + Davatelja licence za korištenje Licenciranih prava pod + uvjetima i odredbama ove Javne licence. + + b. Dodatna ponuda Davatelja licence -- Prilagođeni materijal. + Svaki primatelj Prilagođenog materijala od vas automatski + prima ponudu Davatelja licence za korištenje Licenciranih + prava u Prilagođenom materijalu pod uvjetima Licence + prilagoditelja koju primjenjujete. + + c. Bez ograničenja nizvodno. Ne smijete ponuditi ili nametnuti + nikakve dodatne ili različite uvjete ili odredbe, niti + primijeniti bilo koje Učinkovite tehnološke mjere na + Licencirani materijal ako to ograničava korištenje + Licenciranih prava od strane bilo kojeg primatelja + Licenciranog materijala. + + 6. Bez odobrenja. Ništa u ovoj Javnoj licenci ne predstavlja niti + se može tumačiti kao dopuštenje za tvrdnju ili impliciranje da + ste vi, ili da je vaša upotreba Licenciranog materijala, + povezana s, sponzorirana, odobrena ili dodijeljena službeni + status od strane Davatelja licence ili drugih označenih za + primanje priznanja kako je navedeno u Odjeljku 3(a)(1)(A)(i). + + b. Ostala prava. + + 1. Moralna prava, poput prava na integritet, nisu licencirana + prema ovoj Javnoj licenci, niti su prava na javnost, privatnost + i/ili druga slična prava osobnosti; međutim, u mjeri u kojoj je + to moguće, Davatelj licence odriče se i/ili pristaje ne isticati + takva prava koja drži Davatelj licence u ograničenoj mjeri + potrebnoj za omogućavanje korištenja Licenciranih prava, ali ne + inače. + + 2. Prava na patente i žigove nisu licencirana prema ovoj Javnoj + licenci. + + 3. U mjeri u kojoj je to moguće, Davatelj licence odriče se + bilo kojeg prava na prikupljanje naknada od vas za korištenje + Licenciranih prava, bilo izravno ili putem društva za + prikupljanje naknada prema bilo kojem dobrovoljnom ili + odricajućem zakonskom ili obveznom licencnom režimu. U svim + ostalim slučajevima Davatelj licence izričito zadržava pravo + na prikupljanje takvih naknada. +Prava, zatim baza podataka u kojoj imate prava sui generis na bazu podataka (ali ne i njezin pojedinačni sadržaj) je prilagođeni materijal, + +uključujući za svrhe iz Odjeljka 3(b); i +c. Morate se pridržavati uvjeta iz Odjeljka 3(a) ako dijelite cijeli ili značajan dio sadržaja baze podataka. + +Radi izbjegavanja sumnje, ovaj Odjeljak 4 dopunjuje i ne zamjenjuje vaše obveze prema ovoj javnoj licenci gdje licencirana prava uključuju druga autorska prava i slična prava. + +--- + +Odjeljak 5 -- Odricanje od jamstava i ograničenje odgovornosti. + +a. OSIM AKO LICENCODAVAC NIJE IZRIČITO DRUGAČIJE ODREDIO, U NAJVEĆOJ MOGUĆOJ MJERI LICENCODAVAC NUDI LICENCIRANI MATERIJAL "TAKAV KAKAV JE" I "DOSTUPAN", TE NE DAJE NIKAKVE IZJAVE ILI JAMSTVA BILO KOJE VRSTE U VEZI S LICENCIRANIM MATERIJALOM, BILO IZRIČITA, IMPLICIRANA, ZAKONSKA ILI DRUGA. TO UKLJUČUJE, BEZ OGRANIČENJA, JAMSTVA O VLASNIŠTVU, PRODAJNOSTI, PRIKLADNOSTI ZA ODREĐENU SVRHU, NEKRŠENJE, ODSUTNOST SKRIVENIH ILI DRUGIH NEDOSTATAKA, TOČNOST, ILI PRISUTNOST ILI ODSUTNOST POGREŠAKA, BILO DA SU POZNATE ILI OTKRIVENE. GDJE ODRICANJE OD JAMSTAVA NIJE DOZVOLJENO U CIJELOSTI ILI DJELOMIČNO, OVO ODRICANJE MOŽDA SE NE PRIMJENJUJE NA VAS. + +b. U NAJVEĆOJ MOGUĆOJ MJERI, LICENCODAVAC NI U KOJEM SLUČAJU NEĆE BITI ODGOVORAN VAMA NA TEMELJU BILO KOJE PRAVNE TEORIJE (UKLJUČUJUĆI, BEZ OGRANIČENJA, NEMAR) ILI DRUGAČIJE ZA BILO KAKVE IZRAVNE, POSEBNE, NEIZRAVNE, SLUČAJNE, POSLJEDIČNE, KAZNENE, PRIMJERNE ILI DRUGE GUBITKE, TROŠKOVE, IZDATKE ILI ŠTETE KOJE PROIZLAZE IZ OVE JAVNE LICENCE ILI KORIŠTENJA LICENCIRANOG MATERIJALA, ČAK I AKO JE LICENCODAVAC BIO OBAVIJEŠTEN O MOGUĆNOSTI TAKVIH GUBITAKA, TROŠKOVA, IZDATAKA ILI ŠTETA. GDJE OGRANIČENJE ODGOVORNOSTI NIJE DOZVOLJENO U CIJELOSTI ILI DJELOMIČNO, OVO OGRANIČENJE MOŽDA SE NE PRIMJENJUJE NA VAS. + +c. Odricanje od jamstava i ograničenje odgovornosti navedeno gore treba se tumačiti na način koji, u najvećoj mogućoj mjeri, najbliže odgovara apsolutnom odricanju i odustajanju od sve odgovornosti. + +--- + +Odjeljak 6 -- Trajanje i prestanak. + +a. Ova javna licenca primjenjuje se za trajanje autorskih prava i sličnih prava licenciranih ovdje. Međutim, ako se ne pridržavate ove javne licence, vaša prava prema ovoj javnoj licenci automatski prestaju. + +b. Kada vaše pravo na korištenje licenciranog materijala prestane prema Odjeljku 6(a), ono se ponovno uspostavlja: + +1. automatski na datum kada se kršenje ispravi, pod uvjetom da se ispravi unutar 30 dana od vašeg otkrića kršenja; ili +2. uz izričitu ponovnu uspostavu od strane licencodavca. + +Radi izbjegavanja sumnje, ovaj Odjeljak 6(b) ne utječe na bilo koje pravo koje licencodavac može imati da traži pravne lijekove za vaša kršenja ove javne licence. + +c. Radi izbjegavanja sumnje, licencodavac također može ponuditi licencirani materijal pod zasebnim uvjetima ili prestati distribuirati licencirani materijal u bilo kojem trenutku; međutim, to neće prekinuti ovu javnu licencu. + +d. Odjeljci 1, 5, 6, 7 i 8 ostaju na snazi nakon prestanka ove javne licence. + +--- + +Odjeljak 7 -- Ostali uvjeti i odredbe. + +a. Licencodavac nije obvezan dodatnim ili različitim uvjetima i odredbama koje vi komunicirate, osim ako ih izričito ne prihvati. + +b. Bilo koji dogovori, razumijevanja ili sporazumi u vezi s licenciranim materijalom koji nisu navedeni ovdje su odvojeni i neovisni od uvjeta i odredbi ove javne licence. + +--- + +Odjeljak 8 -- Tumačenje. + +a. Radi izbjegavanja sumnje, ova javna licenca ne smanjuje, ograničava, ograničava ili nameće uvjete za bilo kakvo korištenje licenciranog materijala koje bi se moglo zakonito provesti bez dopuštenja prema ovoj javnoj licenci. + +b. U najvećoj mogućoj mjeri, ako se bilo koja odredba ove javne licence smatra neprovedivom, automatski će se reformirati u najmanjoj mjeri potrebnoj da postane provediva. Ako se odredba ne može reformirati, bit će odvojena od ove javne licence bez utjecaja na provedivost preostalih uvjeta i odredbi. + +c. Nijedan uvjet ili odredba ove javne licence neće biti odustani niti će se pristati na nepoštivanje, osim ako to izričito ne prihvati licencodavac. + +d. Ništa u ovoj javnoj licenci ne predstavlja niti se može tumačiti kao ograničenje ili odricanje od bilo kakvih privilegija i imuniteta koji se primjenjuju na licencodavca ili vas, uključujući od pravnih postupaka bilo koje jurisdikcije ili vlasti. + +--- + +======================================================================= + +Creative Commons nije stranka svojih javnih licenci. Bez obzira na to, Creative Commons može odlučiti primijeniti jednu od svojih javnih licenci na materijal koji objavljuje i u tim slučajevima će se smatrati "licencodavcem". Tekst javnih licenci Creative Commonsa posvećen je javnoj domeni prema CC0 posveti javnoj domeni. Osim za ograničenu svrhu označavanja da je materijal podijeljen pod javnom licencom Creative Commonsa ili kako je drugačije dopušteno prema politikama Creative Commonsa objavljenim na creativecommons.org/policies, Creative Commons ne dopušta korištenje zaštitnog znaka "Creative Commons" ili bilo kojeg drugog zaštitnog znaka ili logotipa Creative Commonsa bez prethodnog pisanog pristanka, uključujući, bez ograničenja, u vezi s bilo kakvim neovlaštenim izmjenama bilo koje od njegovih javnih licenci ili bilo kojim drugim dogovorima, razumijevanjima ili sporazumima u vezi s korištenjem licenciranog materijala. Radi izbjegavanja sumnje, ovaj odlomak nije dio javnih licenci. + +Creative Commons možete kontaktirati na creativecommons.org. + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/hr/sketchnotes/README.md b/translations/hr/sketchnotes/README.md new file mode 100644 index 00000000..2bf43581 --- /dev/null +++ b/translations/hr/sketchnotes/README.md @@ -0,0 +1,21 @@ + +Sve sketchnoteovi kurikuluma mogu se preuzeti ovdje. + +🖨 Za ispis u visokoj rezoluciji, TIFF verzije dostupne su na [ovom repozitoriju](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff). + +🎨 Autor: [Tomomi Imura](https://github.com/girliemac) (Twitter: [@girlie_mac](https://twitter.com/girlie_mac)) + +[![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-sa/4.0/) + +--- + +**Odricanje od odgovornosti**: +Ovaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda. \ No newline at end of file diff --git a/translations/my/1-Introduction/1-intro-to-ML/README.md b/translations/my/1-Introduction/1-intro-to-ML/README.md new file mode 100644 index 00000000..0f6b9d33 --- /dev/null +++ b/translations/my/1-Introduction/1-intro-to-ML/README.md @@ -0,0 +1,159 @@ + +# စက်ရုပ်သင်ယူမှုအကြောင်းအရာ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML for beginners - စက်ရုပ်သင်ယူမှုအကြောင်းအရာ](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "ML for beginners - စက်ရုပ်သင်ယူမှုအကြောင်းအရာ") + +> 🎥 အပေါ်ရှိပုံကိုနှိပ်ပြီး ဒီသင်ခန်းစာကို လိုက်လံလေ့လာပါ။ + +စက်ရုပ်သင်ယူမှုအကြောင်းအရာကို စတင်လေ့လာရန် ဒီသင်ခန်းစာကို ကြိုဆိုပါတယ်။ သင်သည် ဒီအကြောင်းအရာကို လုံးဝအသစ်ဖြစ်စေ၊ ML အတွေ့အကြုံရှိသူဖြစ်စေ၊ ကျွန်ုပ်တို့နှင့်အတူ လေ့လာရန် ဝမ်းသာစွာကြိုဆိုပါတယ်။ ML ကို စတင်လေ့လာရန် သင့်အတွက် သက်တောင့်သက်သာရှိသော အခြေခံနေရာတစ်ခု ဖန်တီးရန် ကျွန်ုပ်တို့ရည်ရွယ်ထားပြီး သင်၏ [အကြံပြုချက်](https://github.com/microsoft/ML-For-Beginners/discussions) ကိုလည်း လက်ခံပြီး တုံ့ပြန်ပေးပါမည်။ + +[![Introduction to ML](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Introduction to ML") + +> 🎥 အပေါ်ရှိပုံကိုနှိပ်ပြီး MIT မှ John Guttag ၏ စက်ရုပ်သင်ယူမှုအကြောင်းအရာကို ကြည့်ရှုပါ။ + +--- +## စက်ရုပ်သင်ယူမှုကို စတင်လေ့လာခြင်း + +ဒီသင်ခန်းစာကို စတင်မတိုင်မီ သင့်ကွန်ပျူတာကို notebook များကို ဒေသတွင်းတွင် အဆင်ပြေစွာ အသုံးပြုနိုင်ရန် ပြင်ဆင်ထားရမည်။ + +- **သင့်စက်ကို ဤဗီဒီယိုများဖြင့် ပြင်ဆင်ပါ**။ [Python](https://youtu.be/CXZYvNRIAKM) ကို သင့်စနစ်တွင် ထည့်သွင်းနည်းနှင့် [စာသားတည်းဖြတ်ရေးကိရိယာ](https://youtu.be/EU8eayHWoZg) ကို စတင်အသုံးပြုနည်းကို လေ့လာရန် အောက်ပါလင့်ခ်များကို အသုံးပြုပါ။ +- **Python ကို လေ့လာပါ**။ [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott) အခြေခံကို သိရှိထားရန် အကြံပြုပါသည်။ Python သည် ဒေတာသိပ္ပံပညာရှင်များအတွက် အသုံးဝင်သော programming language ဖြစ်ပြီး ဒီသင်ခန်းစာတွင် အသုံးပြုပါမည်။ +- **Node.js နှင့် JavaScript ကို လေ့လာပါ**။ ဒီသင်ခန်းစာတွင် web app များတည်ဆောက်ရာတွင် JavaScript ကို အနည်းငယ်အသုံးပြုမည်ဖြစ်သောကြောင့် [node](https://nodejs.org) နှင့် [npm](https://www.npmjs.com/) ကို ထည့်သွင်းထားရန် လိုအပ်ပါသည်။ Python နှင့် JavaScript တို့အတွက် [Visual Studio Code](https://code.visualstudio.com/) ကိုလည်း အသုံးပြုနိုင်ရန် ပြင်ဆင်ထားပါ။ +- **GitHub အကောင့်တစ်ခု ဖန်တီးပါ**။ သင် [GitHub](https://github.com) တွင် ကျွန်ုပ်တို့ကို ရှာဖွေတွေ့ရှိခဲ့သောကြောင့် အကောင့်ရှိပြီးဖြစ်နိုင်သော်လည်း မရှိသေးပါက အကောင့်တစ်ခု ဖန်တီးပြီး ဒီသင်ခန်းစာကို fork လုပ်ပါ။ (ကျွန်ုပ်တို့ကို star တစ်ခုလည်း ပေးပါ 😊) +- **Scikit-learn ကို လေ့လာပါ**။ [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) သည် ML libraries များဖြစ်ပြီး ဒီသင်ခန်းစာများတွင် ကိုးကားအသုံးပြုမည်ဖြစ်သည်။ + +--- +## စက်ရုပ်သင်ယူမှုဆိုတာဘာလဲ? + +'Sစက်ရုပ်သင်ယူမှု' ဆိုသော စကားလုံးသည် ယနေ့ခေတ်တွင် အလွန်လူကြိုက်များပြီး မကြာခဏအသုံးပြုသော စကားလုံးတစ်ခုဖြစ်သည်။ သင်သည် နည်းပညာနှင့် ရင်းနှီးပြီး အလုပ်အကိုင်မည်သည့်နယ်ပယ်တွင်မဆို ဒီစကားလုံးကို အနည်းဆုံးတစ်ကြိမ်တော့ ကြားဖူးနိုင်ပါသည်။ သို့သော် စက်ရုပ်သင်ယူမှု၏ လုပ်ဆောင်ပုံများသည် လူအများအတွက် နက်နဲသောအရာတစ်ခုဖြစ်သည်။ စက်ရုပ်သင်ယူမှုကို စတင်လေ့လာသူများအတွက် အခါအားလျော်စွာ အလွန်ခက်ခဲသောအရာတစ်ခုလို ခံစားရနိုင်သည်။ ထို့ကြောင့် စက်ရုပ်သင်ယူမှုဆိုတာဘာလဲဆိုတာကို နားလည်ရန်အရေးကြီးပြီး လက်တွေ့နမူနာများဖြင့် အဆင့်ဆင့်လေ့လာသင့်သည်။ + +--- +## Hype curve + +![ml hype curve](../../../../1-Introduction/1-intro-to-ML/images/hype.png) + +> Google Trends မှ 'machine learning' စကားလုံး၏ နောက်ဆုံးရ 'hype curve' ကို ပြသထားသည်။ + +--- +## အံ့ဖွယ်ကမ္ဘာ + +ကျွန်ုပ်တို့သည် အံ့ဖွယ်အရာများနှင့် ပြည့်နှက်နေသော ကမ္ဘာတစ်ခုတွင် နေထိုင်ကြသည်။ Stephen Hawking, Albert Einstein စသည်ဖြင့် အထင်ကရ သိပ္ပံပညာရှင်များသည် ကမ္ဘာ့အကြောင်းအရာများကို ရှာဖွေဖော်ထုတ်ရန် အသက်ကို အလုံးစုံအပ်နှံခဲ့ကြသည်။ လူသားများသည် အသက်အရွယ်ကြီးလာသည်နှင့်အမျှ ကမ္ဘာ့ဖွဲ့စည်းပုံကို ရှာဖွေဖော်ထုတ်သည့် သင်ယူမှုအခြေအနေဖြစ်သည်။ + +--- +## ကလေး၏ ဦးနှောက် + +ကလေး၏ ဦးနှောက်နှင့် အာရုံခံကိရိယာများသည် ပတ်ဝန်းကျင်မှ အချက်အလက်များကို သိရှိပြီး gradually hidden patterns များကို သင်ယူသည်။ ဒီသင်ယူမှုသည် ကလေးကို logical rules များဖန်တီးရန် အထောက်အကူပြုသည်။ လူသား၏ ဦးနှောက်သည် hidden patterns များကို ရှာဖွေဖော်ထုတ်ပြီး အဆင့်ဆင့်တိုးတက်လာစေသည်။ ဒီသင်ယူနိုင်စွမ်းနှင့် တိုးတက်နိုင်စွမ်းသည် [brain plasticity](https://www.simplypsychology.org/brain-plasticity.html) ဆိုသော အယူအဆနှင့် ဆက်စပ်နေသည်။ လူသား၏ ဦးနှောက်၏ သင်ယူမှုနှင့် စက်ရုပ်သင်ယူမှု၏ အယူအဆများအကြား motivational similarities များကို ရှာဖွေနိုင်သည်။ + +--- +## လူသား၏ ဦးနှောက် + +[lူသား၏ ဦးနှောက်](https://www.livescience.com/29365-human-brain.html) သည် အပြင်လောကမှ အချက်အလက်များကို သိရှိပြီး အချက်အလက်များကို လုပ်ဆောင်မှုအခြေအနေအရ ဆုံးဖြတ်ချက်များကို ချမှတ်သည်။ ဒီလိုလုပ်ဆောင်မှုကို intelligent behavior ဟုခေါ်သည်။ ဒီ intelligent behavior ကို စက်တစ်ခုတွင် program လုပ်ခြင်းသည် artificial intelligence (AI) ဟုခေါ်သည်။ + +--- +## အဓိကအသုံးအနှုန်းများ + +စကားလုံးများသည် အလွယ်တကူ ရောထွေးနိုင်သော်လည်း machine learning (ML) သည် artificial intelligence ၏ အရေးပါသော အခွဲတစ်ခုဖြစ်သည်။ **ML သည် အထူး algorithm များကို အသုံးပြု၍ hidden patterns များကို ရှာဖွေဖော်ထုတ်ပြီး အချက်အလက်များကို အသုံးပြု၍ ဆုံးဖြတ်ချက်များကို အတည်ပြုရန် အရေးပါသော အချက်အလက်များကို ရှာဖွေဖော်ထုတ်ခြင်းနှင့် ဆက်စပ်နေသည်**။ + +--- +## AI, ML, Deep Learning + +![AI, ML, deep learning, data science](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png) + +> AI, ML, deep learning, data science တို့၏ ဆက်စပ်မှုကို ပြသထားသော diagram။ [Jen Looper](https://twitter.com/jenlooper) မှ [ဒီ graphic](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining) ကို အခြေခံ၍ ဖန်တီးထားသည်။ + +--- +## လေ့လာရန် အကြောင်းအရာများ + +ဒီသင်ခန်းစာတွင် စက်ရုပ်သင်ယူမှု၏ အဓိကအကြောင်းအရာများကိုသာ လေ့လာမည်ဖြစ်သည်။ ကျွန်ုပ်တို့သည် classical machine learning ကို Scikit-learn ကို အသုံးပြု၍ အဓိကအခြေခံများကို လေ့လာမည်ဖြစ်သည်။ artificial intelligence သို့မဟုတ် deep learning ၏ ကျယ်ပြန့်သော အကြောင်းအရာများကို နားလည်ရန် ML အခြေခံကို သိရှိထားရန် အရေးကြီးသည်။ + +--- +## ဒီသင်ခန်းစာတွင် သင်လေ့လာမည့်အရာများ: + +- စက်ရုပ်သင်ယူမှု၏ အဓိကအကြောင်းအရာများ +- ML ၏ သမိုင်းကြောင်း +- ML နှင့် တရားမျှတမှု +- regression ML နည်းလမ်းများ +- classification ML နည်းလမ်းများ +- clustering ML နည်းလမ်းများ +- natural language processing ML နည်းလမ်းများ +- time series forecasting ML နည်းလမ်းများ +- reinforcement learning +- ML ၏ လက်တွေ့အသုံးချမှုများ + +--- +## ကျွန်ုပ်တို့ မလေ့လာမည့်အရာများ + +- deep learning +- neural networks +- AI + +သင်ယူမှုကို ပိုမိုလွယ်ကူစေရန် neural networks, deep learning, AI တို့၏ ရှုပ်ထွေးမှုများကို ရှောင်ရှားမည်ဖြစ်သည်။ ကျွန်ုပ်တို့သည် data science curriculum တစ်ခုကို လာမည့်အချိန်တွင် တင်ဆက်မည်ဖြစ်သည်။ + +--- +## စက်ရုပ်သင်ယူမှုကို ဘာကြောင့်လေ့လာရမလဲ? + +စနစ်အမြင်မှ machine learning ကို data မှ hidden patterns များကို ရှာဖွေဖော်ထုတ်ပြီး intelligent decisions များကို အထောက်အကူပြုရန် automated systems များဖန်တီးခြင်းဟု သတ်မှတ်သည်။ + +ဒီ motivation သည် လူသား၏ ဦးနှောက်သည် အပြင်လောကမှ perceives data ကို အသုံးပြု၍ သင်ယူပုံကို အနည်းငယ်အခြေခံထားသည်။ + +✅ စဉ်းစားကြည့်ပါ - ဘာကြောင့် စီးပွားရေးလုပ်ငန်းတစ်ခုသည် hard-coded rules-based engine တစ်ခု ဖန်တီးခြင်းအစား machine learning strategies များကို အသုံးပြုရန် ကြိုးစားမည်နည်း။ + +--- +## စက်ရုပ်သင်ယူမှု၏ အသုံးချမှုများ + +စက်ရုပ်သင်ယူမှု၏ အသုံးချမှုများသည် ယနေ့ခေတ်တွင် data များနှင့်အတူ နေရာတိုင်းတွင် ရှိနေသည်။ state-of-the-art ML algorithms များ၏ အလွန်ကြီးမားသော potential ကို ရှာဖွေဖော်ထုတ်ရန် သုတေသနများကို လုပ်ဆောင်နေကြသည်။ + +--- +## ML ကို လက်တွေ့အသုံးချမှုများ + +**စက်ရုပ်သင်ယူမှုကို အမျိုးမျိုးအသုံးပြုနိုင်သည်**: + +- လူနာ၏ ဆေးဘက်ဆိုင်ရာမှတ်တမ်းများမှ ရောဂါဖြစ်နိုင်ခြေကို ခန့်မှန်းရန် +- ရာသီဥတုအချက်အလက်များကို အသုံးပြု၍ ရာသီဥတုဖြစ်နိုင်ခြေကို ခန့်မှန်းရန် +- စာသား၏ စိတ်ထားကို နားလည်ရန် +- အတုသတင်းများကို ရှာဖွေဖော်ထုတ်ပြီး propaganda ကို ရပ်တန့်ရန် + +Finance, economics, earth science, space exploration, biomedical engineering, cognitive science, humanities စသည်တို့တွင် ML ကို အသုံးပြု၍ data-processing-heavy problems များကို ဖြေရှင်းနေကြသည်။ + +--- +## နိဂုံး + +စက်ရုပ်သင်ယူမှုသည် real-world သို့မဟုတ် generated data မှ hidden patterns များကို ရှာဖွေဖော်ထုတ်ပြီး အရေးပါသော insights များကို ရှာဖွေဖော်ထုတ်သည်။ စီးပွားရေး, ကျန်းမာရေး, ငွေကြေး application များတွင် အလွန်တန်ဖိုးရှိသည်။ + +အနာဂတ်တွင် ML အခြေခံကို နားလည်ခြင်းသည် နယ်ပယ်မည်သည့်နယ်ပယ်မှမဆို လူတိုင်းအတွက် မဖြစ်မနေလိုအပ်လာမည်။ + +--- +# 🚀 စိန်ခေါ်မှု + +AI, ML, deep learning, data science တို့၏ ကွာခြားချက်များကို သင်၏ နားလည်မှုကို [Excalidraw](https://excalidraw.com/) ကဲ့သို့သော online app သို့မဟုတ် စက္ကူပေါ်တွင် ရေးဆွဲပါ။ အခြားနည်းလမ်းများဖြင့် ဖြေရှင်းနိုင်သော ပြဿနာများကို ထည့်သွင်းပါ။ + +# [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +--- +# ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +ML algorithms များကို cloud တွင် အသုံးပြုနည်းကို လေ့လာရန် [Learning Path](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott) ကို လိုက်နာပါ။ + +ML အခြေခံများကို လေ့လာရန် [Learning Path](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) ကို လိုက်နာပါ။ + +--- +# လုပ်ငန်းတာဝန် + +[Get up and running](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/1-Introduction/1-intro-to-ML/assignment.md b/translations/my/1-Introduction/1-intro-to-ML/assignment.md new file mode 100644 index 00000000..2f4c1515 --- /dev/null +++ b/translations/my/1-Introduction/1-intro-to-ML/assignment.md @@ -0,0 +1,23 @@ + +# စတင်ပြီး အလုပ်လုပ်နိုင်ရန် + +## လမ်းညွှန်ချက်များ + +ဒီအမှတ်မပေးတဲ့အလုပ်မှာ Python ကို ပြန်လည်လေ့လာပြီး သင့်ပတ်ဝန်းကျင်ကို ပြင်ဆင်ထားကာ notebook များကို အလုပ်လုပ်နိုင်အောင် ပြင်ဆင်ပါ။ + +ဒီ [Python Learning Path](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott) ကို လိုက်နာပြီး၊ အောက်ပါ အနိမ့်အဆင့်ဗီဒီယိုများကို ကြည့်ပြီး သင့်စနစ်များကို ပြင်ဆင်ပါ။ + +https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6 + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတရ အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားယူမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/1-Introduction/2-history-of-ML/README.md b/translations/my/1-Introduction/2-history-of-ML/README.md new file mode 100644 index 00000000..a26882d9 --- /dev/null +++ b/translations/my/1-Introduction/2-history-of-ML/README.md @@ -0,0 +1,140 @@ + +# စက်ရုပ်သင်ယူမှု၏ သမိုင်းကြောင်း + +![စက်ရုပ်သင်ယူမှု၏ သမိုင်းကြောင်းကို Sketchnote ဖြင့် အကျဉ်းချုပ်](../../../../sketchnotes/ml-history.png) +> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML for beginners - History of Machine Learning](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "ML for beginners - History of Machine Learning") + +> 🎥 အထက်ပါပုံကို နှိပ်ပြီး ဒီသင်ခန်းစာကို ရှင်းလင်းထားသော ဗီဒီယိုကို ကြည့်ပါ။ + +ဒီသင်ခန်းစာမှာ စက်ရုပ်သင်ယူမှုနှင့် အတုအမြင့်တုအာရုံ၏ သမိုင်းကြောင်းတွင် အရေးပါသော အခန်းကဏ္ဍများကို လေ့လာသွားပါမည်။ + +အတုအမြင့်တုအာရုံ (AI) ၏ သမိုင်းကြောင်းသည် စက်ရုပ်သင်ယူမှု၏ သမိုင်းကြောင်းနှင့် ဆက်စပ်နေပြီး ML ကို အခြေခံသော algorithm များနှင့် ကွန်ပျူတာတိုးတက်မှုများသည် AI ၏ ဖွံ့ဖြိုးတိုးတက်မှုကို အထောက်အကူပြုခဲ့သည်။ ဒီနယ်ပယ်များသည် 1950 ခုနှစ်များတွင် သီးခြားသော သုတေသနနယ်ပယ်များအဖြစ် ပုံသွင်းလာခဲ့သော်လည်း [algorithm, statistical, mathematical, computational နှင့် technical discoveries](https://wikipedia.org/wiki/Timeline_of_machine_learning) များသည် ဒီကာလမတိုင်မီ ရှိခဲ့ပြီး အချို့ overlap ဖြစ်ခဲ့သည်။ အမှန်တကယ်တော့ လူသားများသည် [ရာစုနှစ်များစွာ](https://wikipedia.org/wiki/History_of_artificial_intelligence) အတွင်း ဒီမေးခွန်းများကို စဉ်းစားခဲ့ကြသည်။ ဒီဆောင်းပါးသည် 'စဉ်းစားနိုင်သော စက်' ၏ အတွေးအမြင်၏ သမိုင်းဆိုင်ရာ အခြေခံအမြင်များကို ဆွေးနွေးထားသည်။ + +--- +## အရေးပါသော ရှာဖွေတွေ့ရှိမှုများ + +- 1763, 1812 [Bayes Theorem](https://wikipedia.org/wiki/Bayes%27_theorem) နှင့် ၎င်း၏ ရှေးဦးများ။ ဒီသီအိုရီသည် အကြိုသိရှိမှုအပေါ် အခြေခံပြီး ဖြစ်နိုင်ခြေကို ဖော်ပြသော inference ကို အခြေခံသည်။ +- 1805 [Least Square Theory](https://wikipedia.org/wiki/Least_squares) ကို ပြင်သစ်ဂဏန်းသိပ္ပံပညာရှင် Adrien-Marie Legendre မှ တီထွင်ခဲ့သည်။ ဒီသီအိုရီကို Regression unit တွင် လေ့လာရမည်ဖြစ်ပြီး ဒေတာ fitting ကို အထောက်အကူပြုသည်။ +- 1913 [Markov Chains](https://wikipedia.org/wiki/Markov_chain) ကို ရုရှားဂဏန်းသိပ္ပံပညာရှင် Andrey Markov မှ တီထွင်ခဲ့ပြီး အခြေခံအခြေအနေအပေါ် အခြေခံသော ဖြစ်နိုင်သော အဖြစ်အပျက်များ၏ အစဉ်အလာကို ဖော်ပြသည်။ +- 1957 [Perceptron](https://wikipedia.org/wiki/Perceptron) ကို အမေရိကန် စိတ်ပညာရှင် Frank Rosenblatt မှ တီထွင်ခဲ့ပြီး deep learning တိုးတက်မှုများ၏ အခြေခံဖြစ်သည်။ + +--- + +- 1967 [Nearest Neighbor](https://wikipedia.org/wiki/Nearest_neighbor) ကို route များကို map ပြုလုပ်ရန် အစတင်ဖန်တီးခဲ့သည်။ ML context တွင် pattern များကို ရှာဖွေဖော်ထုတ်ရန် အသုံးပြုသည်။ +- 1970 [Backpropagation](https://wikipedia.org/wiki/Backpropagation) ကို [feedforward neural networks](https://wikipedia.org/wiki/Feedforward_neural_network) များကို training ပြုလုပ်ရန် အသုံးပြုသည်။ +- 1982 [Recurrent Neural Networks](https://wikipedia.org/wiki/Recurrent_neural_network) ကို feedforward neural networks မှ ဆင်းသက်လာပြီး အချိန်ဇယားများကို ဖန်တီးသည်။ + +✅ သုတေသနအနည်းငယ် ပြုလုပ်ပါ။ ML နှင့် AI ၏ သမိုင်းကြောင်းတွင် အရေးပါသော အခြားသော ရက်စွဲများကို ရှာဖွေပါ။ + +--- +## 1950: စဉ်းစားနိုင်သော စက်များ + +Alan Turing သည် 2019 ခုနှစ်တွင် [လူထုမှ](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) 20 ရာစု၏ အကြီးမားဆုံး သိပ္ပံပညာရှင်အဖြစ် မဲပေးရွေးချယ်ခံရသော ထူးချွန်သောပုဂ္ဂိုလ်ဖြစ်ပြီး 'စဉ်းစားနိုင်သော စက်' ၏ အခြေခံအမြင်ကို တည်ဆောက်ရန် အထောက်အကူပြုခဲ့သည်။ ၎င်းသည် [Turing Test](https://www.bbc.com/news/technology-18475646) ကို ဖန်တီးခြင်းဖြင့် ဒီအမြင်ကို အတည်ပြုရန် ကြိုးစားခဲ့သည်။ Turing Test ကို NLP သင်ခန်းစာများတွင် လေ့လာရမည်။ + +--- +## 1956: Dartmouth Summer Research Project + +"Dartmouth Summer Research Project on artificial intelligence သည် အတုအမြင့်တုအာရုံနယ်ပယ်အတွက် အရေးပါသော အခန်းကဏ္ဍတစ်ခုဖြစ်ပြီး ဒီနေရာတွင် 'artificial intelligence' ဆိုသော စကားလုံးကို ပထမဆုံး အသုံးပြုခဲ့သည်။" ([source](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)) + +> သင်ယူမှု၏ အပိုင်းအစများ သို့မဟုတ် ဉာဏ်ရည်၏ အခြားသော လက္ခဏာများကို စက်တစ်ခုမှ simulation ပြုလုပ်နိုင်ရန် အလွန်တိကျစွာ ဖော်ပြနိုင်သည်။ + +--- + +ဦးဆောင်သုတေသနပညာရှင်ဖြစ်သော ဂဏန်းသိပ္ပံပညာရှင် John McCarthy သည် "သင်ယူမှု၏ အပိုင်းအစများ သို့မဟုတ် ဉာဏ်ရည်၏ အခြားသော လက္ခဏာများကို စက်တစ်ခုမှ simulation ပြုလုပ်နိုင်ရန် အလွန်တိကျစွာ ဖော်ပြနိုင်သည်" ဆိုသော အယူအဆအပေါ် အခြေခံ၍ ဆက်လက်လုပ်ဆောင်ရန် မျှော်လင့်ခဲ့သည်။ ၎င်း၏ ပါဝင်သူများတွင် Marvin Minsky ကဲ့သို့သော နယ်ပယ်၏ ထူးချွန်သောပုဂ္ဂိုလ်တစ်ဦးလည်း ပါဝင်ခဲ့သည်။ + +ဒီ workshop ကို "symbolic methods, limited domains (early expert systems), deductive systems နှင့် inductive systems" တိုးတက်မှုများကို စတင်ပြီး အားပေးခဲ့သည်ဟု သတ်မှတ်ထားသည်။ ([source](https://wikipedia.org/wiki/Dartmouth_workshop)) + +--- +## 1956 - 1974: "ရွှေခေတ်" + +1950 ခုနှစ်များမှ 1970 ခုနှစ်ဝန်းကျင်အထိ AI သည် အများပြည်သူ၏ ပြဿနာများကို ဖြေရှင်းနိုင်မည်ဟု မျှော်လင့်မှုများ အလွန်မြင့်မားခဲ့သည်။ 1967 ခုနှစ်တွင် Marvin Minsky သည် "တစ်မျိုးဆက်အတွင်း ... 'artificial intelligence' ဖန်တီးခြင်း၏ ပြဿနာကို အများအားဖြင့် ဖြေရှင်းနိုင်မည်" ဟု ယုံကြည်စွာ ပြောကြားခဲ့သည်။ (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall) + +natural language processing သုတေသနများ တိုးတက်မှုရှိခဲ့ပြီး ရှာဖွေမှုများကို ပိုမိုစွမ်းဆောင်နိုင်စေခဲ့သည်။ 'micro-worlds' ဆိုသော အတွေးအမြင်ကို ဖန်တီးခဲ့ပြီး ရိုးရှင်းသော လုပ်ငန်းများကို ရိုးရှင်းသော စကားလုံးများဖြင့် ပြုလုပ်နိုင်ခဲ့သည်။ + +--- + +သုတေသနများကို အစိုးရအေဂျင်စီများမှ ရန်ပုံငွေထောက်ပံ့ခဲ့ပြီး ကွန်ပျူတာနှင့် algorithm များတွင် တိုးတက်မှုများ ရှိခဲ့သည်။ ဉာဏ်ရည်ရှိသော စက်များ၏ prototype များကို ဖန်တီးခဲ့သည်။ ၎င်းတို့ထဲတွင် ပါဝင်သော စက်များမှာ - + +* [Shakey the robot](https://wikipedia.org/wiki/Shakey_the_robot) သည် လှုပ်ရှားနိုင်ပြီး 'ဉာဏ်ရည်ရှိ' လုပ်ငန်းများကို ဆုံးဖြတ်နိုင်သည်။ + + ![Shakey, an intelligent robot](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg) + > Shakey in 1972 + +--- + +* Eliza သည် စောစောပိုင်း 'chatterbot' တစ်ခုဖြစ်ပြီး လူများနှင့် စကားပြောနိုင်သည်။ ၎င်းသည် primitive 'therapist' အဖြစ် လုပ်ဆောင်နိုင်သည်။ Eliza ကို NLP သင်ခန်းစာများတွင် ပိုမိုလေ့လာရမည်။ + + ![Eliza, a bot](../../../../1-Introduction/2-history-of-ML/images/eliza.png) + > Eliza ၏ version တစ်ခု + +--- + +* "Blocks world" သည် blocks များကို စုစည်းခြင်းနှင့် စီမံခြင်းကို ပြုလုပ်နိုင်သော micro-world တစ်ခုဖြစ်ပြီး စက်များကို ဆုံးဖြတ်ချက်ချရန် သင်ကြားမှုများကို စမ်းသပ်နိုင်သည်။ [SHRDLU](https://wikipedia.org/wiki/SHRDLU) ကဲ့သို့သော library များဖြင့် language processing ကို တိုးတက်စေခဲ့သည်။ + + [![blocks world with SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "blocks world with SHRDLU") + + > 🎥 အထက်ပါပုံကို နှိပ်ပြီး ဗီဒီယိုကြည့်ပါ: Blocks world with SHRDLU + +--- +## 1974 - 1980: "AI Winter" + +1970 ခုနှစ်ဝန်းကျင်တွင် 'ဉာဏ်ရည်ရှိသော စက်' ဖန်တီးခြင်း၏ အခက်အခဲများကို အလွန်နည်းနည်းသာ သတ်မှတ်ထားသည်ဟု သိရှိလာခဲ့ပြီး compute power ရှိမှုအပေါ် အလွန်မြှင့်တင်ထားသည်ဟု သိရှိလာခဲ့သည်။ ရန်ပုံငွေများ လျော့နည်းလာခဲ့ပြီး နယ်ပယ်အပေါ် ယုံကြည်မှုများ လျော့နည်းလာခဲ့သည်။ ယုံကြည်မှုကို ထိခိုက်စေသော အချက်များမှာ - + +--- +- **ကန့်သတ်ချက်များ**။ Compute power သည် အလွန်နည်းပါးနေသည်။ +- **Combinatorial explosion**။ စက်များကို ပိုမိုတိုးတက်စွမ်းဆောင်စေရန် training လိုအပ်သော parameters များသည် exponential အတိုင်း တိုးလာခဲ့သည်။ +- **ဒေတာနည်းပါးမှု**။ ဒေတာနည်းပါးမှုသည် algorithm များကို စမ်းသပ်ခြင်း၊ ဖွံ့ဖြိုးတိုးတက်ခြင်းနှင့် ပြုပြင်ခြင်းကို အတားအဆီးဖြစ်စေခဲ့သည်။ +- **ကျွန်ုပ်တို့မှန်ကန်သောမေးခွန်းများကို မေးနေပါသလား?**။ မေးခွန်းများကို မေးနေသော နည်းလမ်းများကို ပြန်လည်စဉ်းစားခဲ့သည်။ + - Turing tests ကို 'chinese room theory' ကဲ့သို့သော အယူအဆများဖြင့် ပြန်လည်စဉ်းစားခဲ့သည်။ "digital computer ကို programming ပြုလုပ်ခြင်းသည် ဘာသာစကားကို နားလည်သည့်အတိုင်း ထင်ရစေသော်လည်း အမှန်တကယ် နားလည်မှုကို ဖန်တီးနိုင်မည်မဟုတ်ပါ။" ([source](https://plato.stanford.edu/entries/chinese-room/)) + - "therapist" ELIZA ကဲ့သို့သော artificial intelligences များကို လူ့အဖွဲ့အစည်းထဲသို့ ထည့်သွင်းခြင်း၏ ethics ကို စိစစ်ခဲ့သည်။ + +--- + +AI သုတေသနနယ်ပယ်များတွင် အမျိုးအစားများ ပေါ်ပေါက်လာခဲ့သည်။ ["scruffy" vs. "neat AI"](https://wikipedia.org/wiki/Neats_and_scruffies) အယူအဆများကို ဖွဲ့စည်းခဲ့သည်။ _Scruffy_ labs များသည် ရလဒ်လိုက်ဖို့အတွက် program များကို အချိန်ကြာကြာ tweak ပြုလုပ်ခဲ့သည်။ _Neat_ labs များသည် "logic နှင့် formal problem solving" ကို အဓိကထားခဲ့သည်။ ELIZA နှင့် SHRDLU သည် _scruffy_ systems များဖြစ်သည်။ 1980 ခုနှစ်များတွင် ML systems များကို reproducible ဖြစ်စေရန် demand ပေါ်လာသည်နှင့်အမျှ _neat_ approach သည် gradually အရေးပါလာခဲ့သည်။ + +--- +## 1980s Expert systems + +နယ်ပယ်သည် တိုးတက်လာသည်နှင့် ၎င်း၏ စီးပွားရေးအကျိုးကျေးဇူးများ ပိုမိုရှင်းလင်းလာခဲ့ပြီး 1980 ခုနှစ်များတွင် 'expert systems' များ ပေါ်ပေါက်လာခဲ့သည်။ "Expert systems သည် အတုအမြင့်တုအာရုံ (AI) software ၏ ပထမဆုံးအောင်မြင်သော အမျိုးအစားများအနက် တစ်ခုဖြစ်သည်။" ([source](https://wikipedia.org/wiki/Expert_system)) + +ဒီအမျိုးအစားသည် _hybrid_ system တစ်ခုဖြစ်ပြီး rules engine တစ်ခုနှင့် inference engine တစ်ခုကို ပေါင်းစပ်ထားသည်။ + +ဒီကာလတွင် neural networks အပေါ် အာရုံစိုက်မှုများလည်း တိုးလာခဲ့သည်။ + +--- +## 1987 - 1993: AI 'Chill' + +specialized expert systems hardware များ၏ ပေါ်ပေါက်မှုသည် အလွန် specialized ဖြစ်လာခဲ့သည်။ Personal computers များ၏ တိုးတက်မှုသည် ဒီအကြီးမားသော specialized systems များနှင့် ယှဉ်ပြိုင်ခဲ့သည်။ Computing ၏ democratization သည် စတင်ခဲ့ပြီး big data ၏ explosion ကို pave လုပ်ပေးခဲ့သည်။ + +--- +## 1993 - 2011 + +ဒီကာလတွင် ML နှင့် AI သည် data နှင့် compute power နည်းပါးမှုကြောင့် ဖြစ်ပေါ်ခဲ့သော ပြဿနာများကို ဖြေရှင်းနိုင်စွမ်းရှိလာခဲ့သည်။ ဒေတာပမာဏသည် အလွန်မြန်ဆန်စွာ တိုးလာခဲ့ပြီး smartphone ၏ ပေါ်ပေါက်မှု (2007) ကြောင့် ပိုမိုရရှိနိုင်လာခဲ့သည်။ Compute power သည် exponential အတိုင်း တိုးလာခဲ့ပြီး algorithm များလည်း တိုးတက်လာခဲ့သည်။ နယ်ပယ်သည် အတိတ်ကာလ၏ freewheeling days များမှ အတည်ပြု discipline တစ်ခုအဖြစ် crystallize ဖြစ်လာခဲ့သည်။ + +--- +## ယနေ့ + +ယနေ့တွင် စက်ရုပ်သင်ယူမှုနှင့် AI သည် လူသားများ၏ ဘဝ၏ အစိတ်အပိုင်းများအားလုံးကို ထိခိုက်စေသည်။ ဒီကာလသည် algorithm များ၏ လူသားဘဝများအပေါ် ရှုထောင့်များနှင့် အကျိုးသက်ရောက်မှုများကို သေချာနားလည်ရန် လိုအပ်သည်။ Microsoft's Brad Smith က "သတင်းအချက်အလက်နည်းပညာသည် privacy နှင့် freedom of expression ကဲ့သို့သော အခြေခံလူ့အခွင့်အရေးများကို ထိခိုက်စေသော ပြဿနာများကို ရှုထောင့်ပေးသည်။ ဒီပြဿနာများသည် ဒီထုတ်ကုန်များကို ဖန်တီးသော နည်းပညာကုမ္ပဏီများအတွက် တာဝန်ရှိမှုကို မြှင့်တင်စေသည်။ ကျွန်ုပ်တို့၏အမြင်အရ၊ ၎င်းတို့သည် thoughtful government regulation နှင့် acceptable uses အပေါ် norms ဖွံ့ဖြိုးတိုးတက်မှုကို လိုအပ်သည်။" ([source](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)) ဟု ပြောကြားခဲ့သည်။ + +--- + +အနာဂတ်တွင် ဘာဖြစ်မည်ဆိုသည်ကို မသိရသေးပါသော်လည်း ဒီ computer systems များနှင့် ၎င်းတို့ run လုပ်သော software နှင့် algorithm + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များ၏ ပရော်ဖက်ရှင်နယ်ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/1-Introduction/2-history-of-ML/assignment.md b/translations/my/1-Introduction/2-history-of-ML/assignment.md new file mode 100644 index 00000000..e9a474bd --- /dev/null +++ b/translations/my/1-Introduction/2-history-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# အချိန်ဇယား တစ်ခု ဖန်တီးပါ + +## လမ်းညွှန်ချက်များ + +[ဒီ repo](https://github.com/Digital-Humanities-Toolkit/timeline-builder) ကို အသုံးပြု၍ အယ်လဂိုရီသမ်များ၊ သင်္ချာ၊ သက်တမ်းသတ်မှတ်ခြင်း၊ AI သို့မဟုတ် ML သမိုင်း၏ တစ်စိတ်တစ်ပိုင်းကို အချိန်ဇယားအဖြစ် ဖန်တီးပါ။ သို့မဟုတ်၊ အထက်ပါအရာများကို ပေါင်းစပ်၍ ဖန်တီးနိုင်ပါသည်။ တစ်ဦးတည်းသော ပုဂ္ဂိုလ်၊ တစ်ခုတည်းသော အယူအဆ၊ သို့မဟုတ် အချိန်ကာလရှည်လျားသော စဉ်းစားမှုကို အာရုံစိုက်နိုင်ပါသည်။ မီဒီယာအကြောင်းအရာများကို ထည့်သွင်းရန် သေချာပါစေ။ + +## အကဲဖြတ်စံနှုန်း + +| စံနှုန်း | ထူးချွန်သောအဆင့် | လုံလောက်သောအဆင့် | တိုးတက်မှုလိုအပ်သောအဆင့် | +| --------- | ----------------------------------------------- | --------------------------------------- | -------------------------------------------------------------- | +| | GitHub စာမျက်နှာအဖြစ် တင်ထားသော အချိန်ဇယားတစ်ခု | ကုဒ်မပြည့်စုံဘဲ တင်မထားသေးပါ | အချိန်ဇယားမပြည့်စုံဘဲ၊ သုတေသနမကောင်းဘဲ၊ တင်မထားသေးပါ | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/1-Introduction/3-fairness/README.md b/translations/my/1-Introduction/3-fairness/README.md new file mode 100644 index 00000000..3bf7e268 --- /dev/null +++ b/translations/my/1-Introduction/3-fairness/README.md @@ -0,0 +1,144 @@ + +# တာဝန်ရှိသော AI ဖြင့် စက်မှုသင်ယူမှုဖြေရှင်းချက်များ တည်ဆောက်ခြင်း + +![စက်မှုသင်ယူမှုတွင် တာဝန်ရှိသော AI အကြောင်းအရာကို ရှင်းပြထားသော ပုံ](../../../../sketchnotes/ml-fairness.png) +> ပုံရေးဆွဲသူ - [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [မတိုင်မီ စစ်ဆေးမေးခွန်း](https://ff-quizzes.netlify.app/en/ml/) + +## အကျဉ်းချုပ် + +ဒီသင်ရိုးမှာ သင်သည် စက်မှုသင်ယူမှု (Machine Learning) က ဘယ်လိုနဲ့ ဘယ်လိုများ ကျွန်တော်တို့ရဲ့ နေ့စဉ်ဘဝတွေကို သက်ရောက်နေတယ်ဆိုတာကို စတင်လေ့လာသိရှိရမှာဖြစ်ပါတယ်။ ယနေ့တိုင် အချိန်မှာတောင် စနစ်များနဲ့ မော်ဒယ်များဟာ ကျွန်တော်တို့ရဲ့ နေ့စဉ်ဆုံးဖြတ်မှုလုပ်ငန်းစဉ်တွေမှာ ပါဝင်နေပါတယ်။ ဥပမာ - ကျန်းမာရေးစစ်ဆေးမှု၊ ချေးငွေခွင့်ပြုမှု သို့မဟုတ် လိမ်လည်မှုတွေကို ရှာဖွေခြင်းစသဖြင့်။ ဒါကြောင့် ဒီမော်ဒယ်တွေက ယုံကြည်စိတ်ချရတဲ့ ရလဒ်တွေကို ပေးနိုင်ဖို့ အရေးကြီးပါတယ်။ အခြားသော ဆော့ဖ်ဝဲလ်လျှောက်လွှာတစ်ခုလိုပဲ AI စနစ်တွေကလည်း မျှော်မှန်းချက်နဲ့ မကိုက်ညီတာတွေ သို့မဟုတ် မလိုလားအပ်တဲ့ ရလဒ်တွေကို ရရှိစေတတ်ပါတယ်။ ဒါကြောင့် AI မော်ဒယ်တစ်ခုရဲ့ အပြုအမူကို နားလည်နိုင်ဖို့နဲ့ ရှင်းပြနိုင်ဖို့ အရေးကြီးပါတယ်။ + +သင်တစ်ခါမှ မော်ဒယ်တည်ဆောက်ဖို့ သုံးတဲ့ ဒေတာတွေမှာ လူမျိုး၊ လိင်၊ နိုင်ငံရေးအမြင်၊ ဘာသာရေး စသဖြင့် အချို့သော လူမှုအုပ်စုတွေ မပါဝင်ဘူးဆိုရင် ဘာတွေဖြစ်နိုင်မလဲ စဉ်းစားကြည့်ပါ။ ဒါမှမဟုတ် မော်ဒယ်ရဲ့ ရလဒ်တွေက အချို့သော လူမှုအုပ်စုတွေကို အားပေးတဲ့အနေနဲ့ အဓိပ္ပာယ်ဖွင့်ဆိုရင်လည်း ဘာတွေဖြစ်နိုင်မလဲ။ ထို့အပြင် မော်ဒယ်ရဲ့ ရလဒ်တွေက လူတွေကို နစ်နာစေတဲ့အခါမှာလည်း ဘယ်သူက AI စနစ်ရဲ့ အပြုအမူအတွက် တာဝန်ရှိမလဲ။ ဒီသင်ရိုးမှာ ဒီလိုမေးခွန်းတွေကို လေ့လာသွားမှာဖြစ်ပါတယ်။ + +ဒီသင်ခန်းစာမှာ သင်သည် - + +- စက်မှုသင်ယူမှုမှာ တရားမျှတမှုရဲ့ အရေးပါမှုနဲ့ ဆက်စပ်သော နစ်နာမှုများကို နားလည်သိရှိလာမယ်။ +- ယုံကြည်စိတ်ချရမှုနဲ့ လုံခြုံမှုရှိစေရန် အထူးအခြေအနေတွေကို စူးစမ်းလေ့လာတဲ့ လေ့ကျင့်မှုနဲ့ ရင်းနှီးလာမယ်။ +- လူတိုင်းကို အခွင့်အရေးပေးနိုင်ဖို့ အပါဝင်စနစ်တွေကို ဒီဇိုင်းဆွဲဖို့ လိုအပ်ချက်ကို နားလည်လာမယ်။ +- ဒေတာနဲ့ လူတွေရဲ့ ကိုယ်ရေးအချက်အလက်ကို ကာကွယ်ဖို့ အရေးကြီးမှုကို လေ့လာမယ်။ +- AI မော်ဒယ်ရဲ့ အပြုအမူကို ရှင်းပြနိုင်ဖို့ "ဖန်သားပုံး" လိုက်နာမှုရဲ့ အရေးကြီးမှုကို မြင်တွေ့မယ်။ +- AI စနစ်တွေမှာ ယုံကြည်မှုတည်ဆောက်ဖို့ တာဝန်ရှိမှုရဲ့ အရေးကြီးမှုကို သတိပြုမယ်။ + +## ကြိုတင်လိုအပ်ချက် + +ဒီသင်ခန်းစာကို စတင်မတိုင်မီ "တာဝန်ရှိသော AI မူဝါဒများ" သင်ခန်းစာကို လေ့လာပြီး အောက်ပါဗီဒီယိုကို ကြည့်ပါ။ + +[ဒီသင်ခန်းစာကို လေ့လာရန်](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) + +[![Microsoft ရဲ့ တာဝန်ရှိသော AI မူဝါဒ](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoft ရဲ့ တာဝန်ရှိသော AI မူဝါဒ") + +> 🎥 အထက်ပါပုံကို နှိပ်ပြီး Microsoft ရဲ့ တာဝန်ရှိသော AI မူဝါဒကို ကြည့်ပါ။ + +## တရားမျှတမှု + +AI စနစ်တွေဟာ လူတိုင်းကို တရားမျှတစွာ ဆက်ဆံရမယ်။ နောက်ထပ် လူမှုအုပ်စုတွေကို မတူညီစွာ သက်ရောက်မှုမရှိစေရမယ်။ ဥပမာ - AI စနစ်တွေက ဆေးကုသမှုအကြံပြုမှု၊ ချေးငွေလျှောက်လွှာ သို့မဟုတ် အလုပ်ခန့်အပ်မှုအတွက် လမ်းညွှန်မှုပေးတဲ့အခါမှာ တူညီတဲ့ ရောဂါလက္ခဏာ၊ ငွေကြေးအခြေအနေ သို့မဟုတ် အလုပ်အတွေ့အကြုံရှိသူတိုင်းကို တူညီတဲ့ အကြံပြုချက်ပေးရမယ်။ + +လူတိုင်းမှာ မျိုးရိုးစဉ်ဆက်နဲ့ ရရှိလာတဲ့ အမြင်များရှိပြီး ဒါတွေက ကျွန်တော်တို့ရဲ့ဆုံးဖြတ်မှုနဲ့ လုပ်ဆောင်မှုတွေကို သက်ရောက်စေတတ်ပါတယ်။ ဒီလို အမြင်တွေဟာ AI စနစ်တွေကို သင်ကြားဖို့ သုံးတဲ့ ဒေတာထဲမှာပါဝင်လာတတ်ပါတယ်။ တစ်ခါတစ်ရံ ဒီလိုအခြေအနေတွေဟာ မတော်တဆ ဖြစ်တတ်ပါတယ်။ ဒေတာထဲမှာ ဘယ်အချိန်မှာ ဘာအမြင်တွေ ထည့်သွင်းနေတယ်ဆိုတာကို သိရှိဖို့ ခက်ခဲတတ်ပါတယ်။ + +**“မတရားမှု”** ဆိုတာ လူမျိုး၊ လိင်၊ အသက်အရွယ် သို့မဟုတ် မသန်စွမ်းမှုအခြေအနေ စသဖြင့် လူတစ်စုအပေါ် အနုတ်လက္ခဏာ သို့မဟုတ် “နစ်နာမှု” ဖြစ်စေတဲ့ သက်ရောက်မှုတွေကို ဆိုလိုပါတယ်။ မတရားမှုနဲ့ ဆက်စပ်တဲ့ နစ်နာမှုတွေကို အောက်ပါအတိုင်း ခွဲခြားနိုင်ပါတယ် - + +- **ခွဲဝေမှု (Allocation)** - ဥပမာအားဖြင့် လိင် သို့မဟုတ် လူမျိုးတစ်ခုကို အခြားတစ်ခုထက် အားပေးခြင်း။ +- **ဝန်ဆောင်မှုအရည်အသွေး (Quality of service)** - ဒေတာကို တစ်ခုတည်းသော အခြေအနေအတွက် သင်ကြားပြီး အမှန်တရားမှာ ပိုမိုရှုပ်ထွေးတဲ့အခါ၊ ဝန်ဆောင်မှုအရည်အသွေးကျဆင်းတတ်ပါတယ်။ ဥပမာအားဖြင့် အမဲရောင်အသားရည်ရှိသူတွေကို မသိနိုင်တဲ့ လက်ဆေးဆပ်ပြာထည့်စက်။ +- **အပြစ်တင်မှု (Denigration)** - တစ်စုံတစ်ခု သို့မဟုတ် တစ်စုံတစ်ယောက်ကို မတရားစွာ အပြစ်တင်ခြင်း။ +- **အလွန်အကျွံ သို့မဟုတ် အနည်းငယ်သာ ပါဝင်မှု (Over- or under-representation)** - လူတစ်စုကို သက်ဆိုင်ရာ အလုပ်အကိုင်မှာ မမြင်ရခြင်း။ +- **စံနှုန်းသတ်မှတ်မှု (Stereotyping)** - လူတစ်စုကို သတ်မှတ်ထားတဲ့ အင်္ဂါရပ်တွေနဲ့ ဆက်စပ်ခြင်း။ + +![အင်္ဂလိပ်မှ တူရကီဘာသာပြန်](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png) +> အင်္ဂလိပ်မှ တူရကီဘာသာပြန် + +![တူရကီမှ အင်္ဂလိပ်ပြန်](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) +> တူရကီမှ အင်္ဂလိပ်ပြန် + +AI စနစ်တွေကို ဒီဇိုင်းဆွဲပြီး စမ်းသပ်တဲ့အခါမှာ AI ဟာ မတရား သို့မဟုတ် ခွဲခြားဆက်ဆံမှု ဆုံးဖြတ်ချက်တွေ မလုပ်ဖို့ သေချာစေရမယ်။ AI နဲ့ စက်မှုသင်ယူမှုမှာ တရားမျှတမှုကို အာမခံဖို့ဟာ လူမှုနဲ့ နည်းပညာဆိုင်ရာ စိန်ခေါ်မှုတစ်ခုဖြစ်နေဆဲပါ။ + +### ယုံကြည်စိတ်ချမှုနှင့် လုံခြုံမှု + +AI စနစ်တွေဟာ ယုံကြည်စိတ်ချရပြီး သာမန်အခြေအနေနဲ့ မထင်မှတ်ထားတဲ့ အခြေအနေတွေမှာ တိကျမှုရှိရမယ်။ AI စနစ်တွေဟာ အမျိုးမျိုးသော အခြေအနေတွေမှာ ဘယ်လို အပြုအမူပြုမယ်ဆိုတာ သိရှိထားဖို့ အရေးကြီးပါတယ်။ AI ဖြေရှင်းချက်တွေကို တည်ဆောက်တဲ့အခါမှာ AI ဖြေရှင်းချက်တွေ ကြုံတွေ့နိုင်တဲ့ အခြေအနေမျိုးစုံကို စဉ်းစားထားဖို့ အလေးပေးရမယ်။ + +ဥပမာအားဖြင့် ကိုယ်တိုင်မောင်းနှင်တဲ့ ကားတစ်စီးဟာ လူတွေ့လုံခြုံမှုကို အဓိကထားရမယ်။ AI ကားမောင်းစနစ်ဟာ ည၊ မိုးသီး၊ မိုးနှင်း၊ လမ်းပေါ်မှာ ကလေးတွေ သို့မဟုတ် တိရစ္ဆာန်တွေ ရုတ်တရက်ပေါ်လာတာ စသဖြင့် အခြေအနေမျိုးစုံကို စဉ်းစားထားရမယ်။ + +> [🎥 ဗီဒီယိုကြည့်ရန်](https://www.microsoft.com/videoplayer/embed/RE4vvIl) + +### အပါဝင်မှု + +AI စနစ်တွေဟာ လူတိုင်းကို ပါဝင်စေပြီး အခွင့်အရေးပေးနိုင်ဖို့ ဒီဇိုင်းဆွဲရမယ်။ AI စနစ်တွေကို ဒီဇိုင်းဆွဲပြီး အကောင်အထည်ဖော်တဲ့အခါ ဒေတာသိပ္ပံပညာရှင်တွေနဲ့ AI တီထွင်သူတွေဟာ စနစ်ထဲမှာ လူတွေကို မတော်တဆ ခွဲခြားမထားဖို့ အတားအဆီးတွေကို သတ်မှတ်ပြီး ဖြေရှင်းရမယ်။ + +ဥပမာအားဖြင့် ကမ္ဘာပေါ်မှာ မသန်စွမ်းသူ ၁ ဘီလီယံရှိပါတယ်။ AI ရဲ့ တိုးတက်မှုကြောင့် သူတို့ဟာ နေ့စဉ်ဘဝမှာ အချက်အလက်နဲ့ အခွင့်အရေးတွေကို ပိုမိုလွယ်ကူစွာ ရရှိနိုင်ပါတယ်။ + +> [🎥 ဗီဒီယိုကြည့်ရန်](https://www.microsoft.com/videoplayer/embed/RE4vl9v) + +### လုံခြုံမှုနှင့် ကိုယ်ရေးအချက်အလက် + +AI စနစ်တွေဟာ လုံခြုံပြီး လူတွေရဲ့ ကိုယ်ရေးအချက်အလက်ကို လေးစားရမယ်။ AI စနစ်တွေကို ယုံကြည်မှုရှိဖို့ လူတွေရဲ့ ကိုယ်ရေးအချက်အလက် သို့မဟုတ် ဘဝကို အန္တရာယ်မဖြစ်စေရမယ်။ + +> [🎥 ဗီဒီယိုကြည့်ရန်](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +### တာဝန်ရှိမှု + +AI စနစ်တွေကို ဒီဇိုင်းဆွဲပြီး တည်ဆောက်သူတွေဟာ သူတို့ရဲ့ စနစ်တွေ ဘယ်လိုအလုပ်လုပ်တယ်ဆိုတာအတွက် တာဝန်ရှိရမယ်။ + +[![AI နဲ့ မျက်နှာသိရှိမှုနည်းပညာရဲ့ အန္တရာယ်](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "AI နဲ့ မျက်နှာသိရှိမှုနည်းပညာရဲ့ အန္တရာယ်") + +> 🎥 ဗီဒီယိုကြည့်ရန်: မျက်နှာသိရှိမှုနည်းပညာရဲ့ အန္တရာယ် + +## သက်ရောက်မှုအကဲဖြတ်မှု + +မော်ဒယ်တစ်ခုကို သင်ကြားမတိုင်မီ AI စနစ်ရဲ့ ရည်ရွယ်ချက်၊ သုံးစွဲမည့်နေရာ၊ သက်ဆိုင်သူတွေကို နားလည်ဖို့ အရေးကြီးပါတယ်။ + +## တာဝန်ရှိသော AI ဖြင့် Debugging + +AI စနစ်တွေကို Debugging လုပ်တဲ့အခါမှာ တာဝန်ရှိသော AI မူဝါဒတွေကို ထည့်သွင်းစဉ်းစားရမယ်။ + +## 🚀 စိန်ခေါ်မှု + +နစ်နာမှုတွေ မဖြစ်ပေါ်စေရန် - + +- အလုပ်လုပ်သူတွေမှာ အမျိုးမျိုးသော နောက်ခံနဲ့ အမြင်တွေ ပါဝင်စေရမယ်။ +- လူမှုအဖွဲ့အစည်းရဲ့ အမျိုးမျိုးသော အချက်အလက်တွေကို အထောက်အပံ့ပေးမယ့် ဒေတာတွေကို ရင်းနှီးမြှုပ်နှံရမယ်။ +- စက်မှုသင်ယူမှု လုပ်ငန်းစဉ်တစ်လျှောက်မှာ တာဝန်ရှိသော AI ကို ရှာဖွေပြီး ပြင်ဆင်နိုင်တဲ့ နည်းလမ်းတွေ တိုးတက်အောင်လုပ်ရမယ်။ + +## [သင်ခန်းစာပြီးနောက် စစ်ဆေးမေးခွန်း](https://ff-quizzes.netlify.app/en/ml/) + +## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +ဒီသင်ခန်းစာမှာ သင်သည် စက်မှုသင်ယူမှုမှာ တရားမျှတမှုနဲ့ မတရားမှုဆိုင်ရာ အခြေခံအယူအဆတွေကို လေ့လာသိရှိခဲ့ပါတယ်။ +ဒီ workshop ကို ကြည့်ပြီး အကြောင်းအရာများကို ပိုမိုနက်ရှိုင်းစွာ လေ့လာပါ: + +- တာဝန်ရှိသော AI ရှာဖွေမှု: အခြေခံသဘောတရားများကို လက်တွေ့ကျအောင် ပြုလုပ်ခြင်း - Besmira Nushi, Mehrnoosh Sameki နှင့် Amit Sharma + +[![Responsible AI Toolbox: တာဝန်ရှိသော AI ဖန်တီးရန်အတွက် အခမဲ့ framework](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: တာဝန်ရှိသော AI ဖန်တီးရန်အတွက် အခမဲ့ framework") + +> 🎥 အထက်ပါပုံကို နှိပ်ပြီး ဗီဒီယိုကြည့်ပါ: RAI Toolbox: တာဝန်ရှိသော AI ဖန်တီးရန်အတွက် အခမဲ့ framework - Besmira Nushi, Mehrnoosh Sameki နှင့် Amit Sharma + +ထို့အပြင် ဖတ်ရှုရန်: + +- Microsoft ရဲ့ RAI အရင်းအမြစ်စင်တာ: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsoft ရဲ့ FATE သုတေသနအဖွဲ့: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +RAI Toolbox: + +- [Responsible AI Toolbox GitHub repository](https://github.com/microsoft/responsible-ai-toolbox) + +Azure Machine Learning ရဲ့ တရားမျှတမှုကို အာမခံရန် tools များအကြောင်း ဖတ်ရှုပါ: + +- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) + +## လုပ်ငန်း + +[RAI Toolbox ကို လေ့လာပါ](assignment.md) + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူရင်းဘာသာစကားဖြင့် အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/1-Introduction/3-fairness/assignment.md b/translations/my/1-Introduction/3-fairness/assignment.md new file mode 100644 index 00000000..385144a6 --- /dev/null +++ b/translations/my/1-Introduction/3-fairness/assignment.md @@ -0,0 +1,25 @@ + +# တာဝန်ရှိသော AI Toolbox ကိုလေ့လာပါ + +## လမ်းညွှန်ချက်များ + +ဒီသင်ခန်းစာမှာ သင် တာဝန်ရှိသော AI Toolbox အကြောင်းကိုလေ့လာခဲ့ပြီး၊ "AI စနစ်များကို ခွဲခြမ်းစိတ်ဖြာပြီး တိုးတက်အောင်လုပ်ဆောင်ရန် အကူအညီပေးသော open-source, community-driven project" ဖြစ်သည်။ ဒီအလုပ်ပေးစာအတွက် RAI Toolbox ရဲ့ [notebooks](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) တစ်ခုကိုလေ့လာပြီး သင်ရရှိသောအချက်အလက်များကို စာတမ်း သို့မဟုတ် တင်ပြချက်အဖြစ်တင်ပြပါ။ + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| -------- | --------- | -------- | ----------------- | +| | Fairlearn ရဲ့ စနစ်များ၊ run လုပ်ထားသော notebook နှင့် run လုပ်ပြီးရရှိသော အကျိုးအမြတ်များကို ဆွေးနွေးထားသော စာတမ်း သို့မဟုတ် powerpoint တင်ပြချက်တစ်ခုကို တင်ပြထားသည် | အကျိုးအမြတ်များမပါရှိသော စာတမ်းတစ်ခုကို တင်ပြထားသည် | စာတမ်းမတင်ပြထားပါ | + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူရင်းဘာသာစကားဖြင့် အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် ရှုလို့ရပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/1-Introduction/4-techniques-of-ML/README.md b/translations/my/1-Introduction/4-techniques-of-ML/README.md new file mode 100644 index 00000000..4bf6dd9e --- /dev/null +++ b/translations/my/1-Introduction/4-techniques-of-ML/README.md @@ -0,0 +1,128 @@ + +# စက်ရုပ်သင်ယူမှုနည်းလမ်းများ + +စက်ရုပ်သင်ယူမှု (Machine Learning) မော်ဒယ်များကို တည်ဆောက်ခြင်း၊ အသုံးပြုခြင်းနှင့် ထိန်းသိမ်းခြင်းလုပ်ငန်းစဉ်သည် အခြားသော ဖွံ့ဖြိုးတိုးတက်မှုလုပ်ငန်းစဉ်များနှင့် အတော်လေး ကွဲပြားနေသည်။ ဒီသင်ခန်းစာမှာ အဲဒီလုပ်ငန်းစဉ်ကို ရှင်းလင်းဖော်ပြပြီး သင်သိထားရမယ့် အဓိကနည်းလမ်းများကို ဖော်ပြပေးပါမယ်။ သင်သည်: + +- စက်ရုပ်သင်ယူမှုကို အထွေထွေ အဆင့်မြင့်မှာ နားလည်နိုင်ပါမယ်။ +- 'မော်ဒယ်များ', 'ခန့်မှန်းချက်များ', 'သင်ကြားမှုဒေတာ' စတဲ့ အခြေခံအယူအဆများကို လေ့လာနိုင်ပါမယ်။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +[![ML for beginners - Techniques of Machine Learning](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML for beginners - Techniques of Machine Learning") + +> 🎥 အပေါ်က ပုံကို နှိပ်ပြီး ဒီသင်ခန်းစာကို လေ့လာနိုင်တဲ့ အတိုချုံးဗီဒီယိုကို ကြည့်ပါ။ + +## အကျဉ်းချုပ် + +အထွေထွေ အဆင့်မြင့်မှာ စက်ရုပ်သင်ယူမှု (ML) လုပ်ငန်းစဉ်ကို ဖန်တီးခြင်းသည် အဆင့်အတန်းများစွာ ပါဝင်သည်။ + +1. **မေးခွန်းကို ဆုံးဖြတ်ပါ**။ ML လုပ်ငန်းစဉ်များစွာသည် ရိုးရှင်းသော အခြေအနေ-based ပရိုဂရမ်များ သို့မဟုတ် စည်းကမ်း-based engine များဖြင့် ဖြေရှင်းလို့မရတဲ့ မေးခွန်းတစ်ခုကို မေးခြင်းဖြင့် စတင်သည်။ ဒီမေးခွန်းများသည် ဒေတာအစုအဝေးအပေါ် အခြေခံပြီး ခန့်မှန်းချက်များကို လုပ်ဆောင်ခြင်းနှင့် ဆက်စပ်နေတတ်သည်။ +2. **ဒေတာကို စုဆောင်းပြီး ပြင်ဆင်ပါ**။ မေးခွန်းကို ဖြေရှင်းနိုင်ဖို့ သင့်မှာ ဒေတာလိုအပ်ပါတယ်။ ဒေတာရဲ့ အရည်အသွေးနှင့် အချို့အခါမှာ အရေအတွက်က သင့်မေးခွန်းကို ဘယ်လောက်ကောင်းကောင်း ဖြေရှင်းနိုင်မလဲဆိုတာကို သတ်မှတ်ပေးပါမယ်။ ဒေတာကို မြင်သာအောင် ဖော်ပြခြင်းက ဒီအဆင့်မှာ အရေးကြီးပါတယ်။ ဒီအဆင့်မှာ ဒေတာကို သင်ကြားမှုအုပ်စုနဲ့ စမ်းသပ်မှုအုပ်စုအဖြစ် ခွဲခြားဖွဲ့စည်းခြင်းလည်း ပါဝင်ပါတယ်။ +3. **သင်ကြားမှုနည်းလမ်းကို ရွေးချယ်ပါ**။ မေးခွန်းနှင့် ဒေတာရဲ့ သဘာဝအပေါ် မူတည်ပြီး မော်ဒယ်ကို သင်ကြားဖို့ အကောင်းဆုံးနည်းလမ်းကို ရွေးချယ်ရပါမယ်။ ဒီအပိုင်းမှာ အထူးကျွမ်းကျင်မှုလိုအပ်ပြီး အတော်လေး စမ်းသပ်မှုများ လိုအပ်တတ်ပါတယ်။ +4. **မော်ဒယ်ကို သင်ကြားပါ**။ သင်ကြားမှုဒေတာကို အသုံးပြုပြီး မော်ဒယ်ကို ဒေတာထဲက ပုံစံများကို မှတ်မိနိုင်အောင် သင်ကြားပါမယ်။ မော်ဒယ်သည် အတွင်းပိုင်းအလေးချိန်များကို အသုံးပြုပြီး ဒေတာရဲ့ အချို့အပိုင်းများကို ပိုမိုအရေးထားနိုင်အောင် ပြင်ဆင်နိုင်ပါတယ်။ +5. **မော်ဒယ်ကို အကဲဖြတ်ပါ**။ သင်စုဆောင်းထားတဲ့ ဒေတာထဲက မော်ဒယ်မမြင်ဖူးတဲ့ ဒေတာ (စမ်းသပ်မှုဒေတာ) ကို အသုံးပြုပြီး မော်ဒယ်ရဲ့ လုပ်ဆောင်မှုကို စမ်းသပ်ပါမယ်။ +6. **Parameter tuning**။ မော်ဒယ်ရဲ့ လုပ်ဆောင်မှုအပေါ် မူတည်ပြီး သင်ကြားမှုအတွက် အသုံးပြုတဲ့ algorithm များရဲ့ အပြုအမူကို ထိန်းချုပ်တဲ့ parameter များကို ပြန်လည်ပြင်ဆင်နိုင်ပါတယ်။ +7. **ခန့်မှန်းချက်လုပ်ဆောင်ပါ**။ မော်ဒယ်ရဲ့ တိကျမှုကို စမ်းသပ်ဖို့ အခြားသော input များကို အသုံးပြုပါ။ + +## မေးခွန်းကို ဘာလို့ မေးရမလဲ + +ကွန်ပျူတာများသည် ဒေတာထဲက ဖုံးကွယ်နေတဲ့ ပုံစံများကို ရှာဖွေဖော်ထုတ်နိုင်စွမ်းရှိသည်။ ဒီစွမ်းရည်သည် သတ်မှတ်ထားတဲ့ နယ်ပယ်အတွင်း မေးခွန်းများကို ဖြေရှင်းဖို့ အလွန်အသုံးဝင်ပါတယ်။ + +ဥပမာအားဖြင့် သေဆုံးမှုနှုန်းကို ခန့်မှန်းဖို့ actuarial task တစ်ခုမှာ ဒေတာသိပ္ပံပညာရှင်တစ်ဦးသည် ဆေးလိပ်သောက်သူများနှင့် မသောက်သူများအကြား သေဆုံးမှုနှုန်းအပေါ် စည်းကမ်းများကို လက်ဖြင့်ဖန်တီးနိုင်ပါတယ်။ + +ဒါပေမယ့် အခြားသော variable များစွာ ပါဝင်လာတဲ့အခါမှာတော့ ML မော်ဒယ်တစ်ခုသည် အတိတ်ကျန်းမာရေးမှတ်တမ်းများအပေါ် အခြေခံပြီး အနာဂတ်သေဆုံးမှုနှုန်းကို ခန့်မှန်းဖို့ ပိုမိုထိရောက်နိုင်ပါတယ်။ + +✅ ဒီ [slide deck](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) သည် မိုးလေဝသကို ML အသုံးပြု၍ ခန့်မှန်းခြင်းအပေါ် သမိုင်းအမြင်ကို ဖော်ပြထားသည်။ + +## မော်ဒယ်တည်ဆောက်မှုမတိုင်မီလုပ်ငန်းစဉ်များ + +မော်ဒယ်တစ်ခုကို တည်ဆောက်မတိုင်မီ သင်လုပ်ဆောင်ရမယ့် အလုပ်များစွာ ရှိပါတယ်။ မော်ဒယ်ရဲ့ ခန့်မှန်းချက်များအပေါ် အခြေခံပြီး သင့်မေးခွန်းကို စမ်းသပ်ဖို့ သင့်အနေနဲ့ အချို့သော အစိတ်အပိုင်းများကို သတ်မှတ်ပြီး ဖော်ပြရပါမယ်။ + +### ဒေတာ + +သင့်မေးခွန်းကို တိကျမှုရှိရှိ ဖြေရှင်းနိုင်ဖို့ သင့်မှာ အရည်အသွေးကောင်းမွန်ပြီး သင့်တော်တဲ့ ဒေတာအရေအတွက်လိုအပ်ပါတယ်။ ဒီအချိန်မှာ သင်လုပ်ဆောင်ရမယ့် အရာနှစ်ခုရှိပါတယ်။ + +- **ဒေတာကို စုဆောင်းပါ**။ ဒေတာကို စုဆောင်းတဲ့အခါမှာ အရင်းအမြစ်များ၊ bias ရှိနိုင်မှုများကို သတိထားပြီး documentation လုပ်ပါ။ +- **ဒေတာကို ပြင်ဆင်ပါ**။ ဒေတာကို collate လုပ်ခြင်း၊ normalize လုပ်ခြင်း၊ string ကို number ပြောင်းခြင်း၊ ဒေတာအသစ်ဖန်တီးခြင်း၊ ဒေတာကို ရှင်းလင်းခြင်း၊ randomize လုပ်ခြင်း စတဲ့ အဆင့်များ ပါဝင်ပါတယ်။ + +✅ ဒေတာကို စုဆောင်းပြီး ပြင်ဆင်ပြီးနောက် သင့်မေးခွန်းကို ဖြေရှင်းနိုင်ဖို့ ဒေတာရဲ့ ပုံစံကို စစ်ဆေးပါ။ + +### Features နှင့် Target + +[Feature](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) ဆိုတာ ဒေတာရဲ့ တိုင်းတာနိုင်တဲ့ အကျဉ်းချုပ်ပါ။ Feature variable ကို `X` အဖြစ် code မှာ ကိုယ်စားပြုပါတယ်။ + +Target ဆိုတာ သင့်မေးခွန်းရဲ့ အဖြေကို ကိုယ်စားပြုပါတယ်။ Target variable ကို `y` အဖြစ် code မှာ ကိုယ်စားပြုပါတယ်။ + +### Feature variable ရွေးချယ်ခြင်း + +🎓 **Feature Selection နှင့် Feature Extraction** Feature variable ကို ရွေးချယ်တဲ့အခါ Feature Selection သို့မဟုတ် Feature Extraction လုပ်ဆောင်ရတတ်ပါတယ်။ Feature Extraction သည် အစပိုင်း feature များကို အသုံးပြု၍ feature အသစ်များ ဖန်တီးသည်။ Feature Selection သည် feature များ၏ အစိတ်အပိုင်းတစ်ခုကို ပြန်လည်ပေးသည်။ + +### ဒေတာကို မြင်သာအောင် ဖော်ပြပါ + +Seaborn သို့မဟုတ် MatPlotLib စတဲ့ libraries များကို အသုံးပြုပြီး ဒေတာကို မြင်သာအောင် ဖော်ပြပါ။ ဒေတာကို visualized လုပ်ခြင်းက hidden correlation များကို ရှာဖွေဖော်ထုတ်နိုင်စွမ်းရှိပါတယ်။ + +### ဒေတာကို ခွဲခြားပါ + +သင်ကြားမှုမတိုင်မီ ဒေတာကို training, testing, validating အဖြစ် ခွဲခြားပါ။ + +## မော်ဒယ်တည်ဆောက်ခြင်း + +သင့် training data ကို အသုံးပြုပြီး မော်ဒယ်တစ်ခုကို statistical representation အဖြစ် တည်ဆောက်ပါ။ + +### သင်ကြားမှုနည်းလမ်းကို ဆုံးဖြတ်ပါ + +Scikit-learn documentation ကို လေ့လာပြီး သင့်မော်ဒယ်အတွက် သင့်တော်တဲ့ training method ကို ရွေးချယ်ပါ။ + +### မော်ဒယ်ကို သင်ကြားပါ + +Training data ကို အသုံးပြုပြီး 'model.fit' ကို အသုံးပြုပါ။ + +### မော်ဒယ်ကို အကဲဖြတ်ပါ + +Test data ကို အသုံးပြုပြီး မော်ဒယ်ရဲ့ quality ကို စစ်ဆေးပါ။ + +🎓 **Model fitting** Model fitting သည် မော်ဒယ်ရဲ့ function တစ်ခုသည် မသိတဲ့ ဒေတာကို စမ်းသပ်တဲ့အခါမှာ ရရှိတဲ့ တိကျမှုကို ကိုယ်စားပြုသည်။ + +🎓 **Underfitting** နှင့် **Overfitting** မော်ဒယ်ရဲ့ quality ကို ထိခိုက်စေတတ်သော ပြဿနာများဖြစ်သည်။ + +![overfitting model](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png) +> Infographic by [Jen Looper](https://twitter.com/jenlooper) + +## Parameter tuning + +Hyperparameters ကို ပြင်ဆင်ခြင်းဖြင့် မော်ဒယ်ရဲ့ quality ကို တိုးတက်စေပါ။ + +## ခန့်မှန်းချက်လုပ်ဆောင်ခြင်း + +အသစ်သော input များကို အသုံးပြုပြီး မော်ဒယ်ရဲ့ တိကျမှုကို စမ်းသပ်ပါ။ + +ဒီသင်ခန်းစာများတွင် သင်သည် ML engineer အဖြစ် တိုးတက်ဖွံ့ဖြိုးရန် လိုအပ်သော အဆင့်များကို လေ့လာနိုင်ပါမယ်။ + +--- + +## 🚀Challenge + +ML practitioner တစ်ဦးရဲ့ လုပ်ငန်းစဉ်ကို ဖော်ပြတဲ့ flow chart တစ်ခု ရေးဆွဲပါ။ သင့်အနေဖြင့် လက်ရှိမှာ ဘယ်အဆင့်မှာ ရှိနေလဲ? ဘယ်အပိုင်းမှာ အခက်အခဲရှိမလဲ? ဘာတွေကို လွယ်ကူလို့ ထင်ပါသလဲ? + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Review & Self Study + +Data scientist များရဲ့ နေ့စဉ်လုပ်ငန်းအကြောင်းကို ဆွေးနွေးထားတဲ့ အင်တာဗျူးများကို အွန်လိုင်းမှာ ရှာဖွေပါ။ ဒီမှာ [တစ်ခု](https://www.youtube.com/watch?v=Z3IjgbbCEfs) ရှိပါတယ်။ + +## Assignment + +[Data scientist တစ်ဦးကို အင်တာဗျူးလုပ်ပါ](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူပညာရှင်များမှ လက်တွေ့ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/1-Introduction/4-techniques-of-ML/assignment.md b/translations/my/1-Introduction/4-techniques-of-ML/assignment.md new file mode 100644 index 00000000..d98aa72a --- /dev/null +++ b/translations/my/1-Introduction/4-techniques-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# ဒေတာသိပ္ပံပညာရှင်တစ်ဦးကို မေးမြန်းခြင်း + +## လမ်းညွှန်ချက်များ + +သင့်ကုမ္ပဏီတွင်ဖြစ်စေ၊ အသုံးပြုသူအဖွဲ့တွင်ဖြစ်စေ၊ သင့်မိတ်ဆွေများ သို့မဟုတ် ကျောင်းသားများအနက်မှ တစ်ဦးဖြစ်စေ၊ ဒေတာသိပ္ပံပညာရှင်အဖြစ် အလုပ်လုပ်နေသူတစ်ဦးကို မေးမြန်းပါ။ သူတို့၏ နေ့စဉ်လုပ်ငန်းတာဝန်များအကြောင်းကို ၅၀၀ စကားလုံးအတိုင်းအတာဖြင့် အကျဉ်းချုပ်စာတမ်းရေးပါ။ သူတို့သည် အထူးကျွမ်းကျင်သူများဖြစ်ပါသလား၊ သို့မဟုတ် 'full stack' အဖြစ် အလုပ်လုပ်ပါသလား? + +## အဆင့်သတ်မှတ်ချက် + +| အဆင့်သတ်မှတ်ချက် | ထူးချွန်သောအဆင့် | လုံလောက်သောအဆင့် | တိုးတက်မှုလိုအပ်သောအဆင့် | +| ----------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------ | ------------------------- | +| | သတ်မှတ်ထားသော စကားလုံးအရေအတွက်နှင့် ရင်းမြစ်များကို မှတ်သားထားသော စာတမ်းကို .doc ဖိုင်အဖြစ် တင်ပြထားသည် | စာတမ်းသည် ရင်းမြစ်များကို မှတ်သားမှုမလုံလောက်ခြင်း သို့မဟုတ် သတ်မှတ်ထားသော စကားလုံးအရေအတွက်ထက် ပိုမိုတိုတောင်းခြင်း | စာတမ်းမတင်ပြထားခြင်း | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပါယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/1-Introduction/README.md b/translations/my/1-Introduction/README.md new file mode 100644 index 00000000..57cdd8fa --- /dev/null +++ b/translations/my/1-Introduction/README.md @@ -0,0 +1,37 @@ + +# မက်ရှင်လေန်နင်းကို မိတ်ဆက်ခြင်း + +ဒီသင်ခန်းစာအပိုင်းမှာ မက်ရှင်လေန်နင်းနယ်ပယ်ရဲ့ အခြေခံအယူအဆများ၊ ၎င်းကဘာလဲ၊ ၎င်းရဲ့ သမိုင်းကြောင်းနှင့် သုတေသနလုပ်ငန်းများတွင် အသုံးပြုသောနည်းလမ်းများကို သင်လေ့လာရမည်ဖြစ်သည်။ မက်ရှင်လေန်နင်းရဲ့ အသစ်သောကမ္ဘာကို အတူတူလေ့လာကြမယ်! + +![globe](../../../1-Introduction/images/globe.jpg) +> ဓာတ်ပုံကို Bill Oxford မှ Unsplash တွင် ရိုက်ထားသည် + +### သင်ခန်းစာများ + +1. [မက်ရှင်လေန်နင်းကို မိတ်ဆက်ခြင်း](1-intro-to-ML/README.md) +1. [မက်ရှင်လေန်နင်းနှင့် AI ရဲ့ သမိုင်းကြောင်း](2-history-of-ML/README.md) +1. [တရားမျှတမှုနှင့် မက်ရှင်လေန်နင်း](3-fairness/README.md) +1. [မက်ရှင်လေန်နင်းနည်းလမ်းများ](4-techniques-of-ML/README.md) + +### အကျိုးတူဝိုင်း + +"မက်ရှင်လေန်နင်းကို မိတ်ဆက်ခြင်း" ကို [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) နှင့် [Jen Looper](https://twitter.com/jenlooper) တို့အပါအဝင် အဖွဲ့ဝင်များမှ ♥️ ဖြင့် ရေးသားထားသည်။ + +"မက်ရှင်လေန်နင်းရဲ့ သမိုင်းကြောင်း" ကို [Jen Looper](https://twitter.com/jenlooper) နှင့် [Amy Boyd](https://twitter.com/AmyKateNicho) တို့မှ ♥️ ဖြင့် ရေးသားထားသည်။ + +"တရားမျှတမှုနှင့် မက်ရှင်လေန်နင်း" ကို [Tomomi Imura](https://twitter.com/girliemac) မှ ♥️ ဖြင့် ရေးသားထားသည်။ + +"မက်ရှင်လေန်နင်းနည်းလမ်းများ" ကို [Jen Looper](https://twitter.com/jenlooper) နှင့် [Chris Noring](https://twitter.com/softchris) တို့မှ ♥️ ဖြင့် ရေးသားထားသည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/1-Tools/README.md b/translations/my/2-Regression/1-Tools/README.md new file mode 100644 index 00000000..a80dfed3 --- /dev/null +++ b/translations/my/2-Regression/1-Tools/README.md @@ -0,0 +1,222 @@ + +# Python နှင့် Scikit-learn ကို အသုံးပြု၍ Regression Models တည်ဆောက်ခြင်း + +![Regression များ၏ အကျဉ်းချုပ်ကို Sketchnote](../../../../sketchnotes/ml-regression.png) + +> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +> ### [ဒီသင်ခန်းစာကို R မှာလည်းရနိုင်ပါတယ်!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) + +## အကျဉ်းချုပ် + +ဒီသင်ခန်းစာလေးများမှာ Regression Models တည်ဆောက်ပုံကို လေ့လာနိုင်ပါမယ်။ Regression Models သည် ဘာအတွက်အသုံးဝင်သလဲဆိုတာကို မကြာမီဆွေးနွေးသွားပါမယ်။ သို့သော် စတင်လုပ်ဆောင်ရန်အတွက် သင့်စက်မှာ လိုအပ်သော Tools များကို အရင်ဆုံး ပြင်ဆင်ထားဖို့ လိုအပ်ပါတယ်။ + +ဒီသင်ခန်းစာမှာ သင်လေ့လာနိုင်မယ့်အရာများမှာ - + +- သင့်ကွန်ပျူတာကို Local Machine Learning Tasks အတွက် ပြင်ဆင်ခြင်း။ +- Jupyter Notebooks ကို အသုံးပြုခြင်း။ +- Scikit-learn ကို အသုံးပြုခြင်း (installation အပါအဝင်)။ +- Linear Regression ကို လက်တွေ့လုပ်ဆောင်ခြင်း။ + +## Installations နှင့် Configurations + +[![ML for beginners - Machine Learning Models တည်ဆောက်ရန် Tools များကို ပြင်ဆင်ခြင်း](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML for beginners - Machine Learning Models တည်ဆောက်ရန် Tools များကို ပြင်ဆင်ခြင်း") + +> 🎥 အထက်ပါပုံကို Click လုပ်ပြီး ML အတွက် သင့်ကွန်ပျူတာကို Configure လုပ်ပုံကို ကြည့်ပါ။ + +1. **Python ကို Install လုပ်ပါ**။ သင့်ကွန်ပျူတာမှာ [Python](https://www.python.org/downloads/) ကို Install လုပ်ထားရှိရပါမယ်။ Python ကို Data Science နှင့် Machine Learning Tasks များအတွက် အသုံးပြုပါမယ်။ အများစုသော ကွန်ပျူတာစနစ်များမှာ Python ကို အရင်ကတည်းက Install လုပ်ထားပြီးဖြစ်ပါတယ်။ [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) များလည်း ရနိုင်ပြီး၊ အချို့သောအသုံးပြုသူများအတွက် Setup ကို ပိုမိုလွယ်ကူစေပါတယ်။ + + သို့သော် Python ကို အသုံးပြုခြင်းမှာ Version များကွဲပြားမှုရှိနိုင်ပါတယ်။ အချို့သော Tasks များအတွက် Version တစ်ခုလိုအပ်ပြီး၊ အခြား Tasks များအတွက် Version တစ်ခုလိုအပ်နိုင်ပါတယ်။ ဒီအကြောင်းကြောင့် [Virtual Environment](https://docs.python.org/3/library/venv.html) တွင် အလုပ်လုပ်ခြင်းသည် အကျိုးရှိပါတယ်။ + +2. **Visual Studio Code ကို Install လုပ်ပါ**။ သင့်ကွန်ပျူတာမှာ Visual Studio Code ကို Install လုပ်ထားရှိရပါမယ်။ [Visual Studio Code](https://code.visualstudio.com/) ကို Install လုပ်ပုံအဆင့်ဆင့်ကို လိုက်နာပါ။ ဒီသင်ခန်းစာမှာ Python ကို Visual Studio Code မှာ အသုံးပြုမယ်၊ [Visual Studio Code ကို Python Development အတွက် Configure လုပ်ပုံ](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) ကိုလည်း လေ့လာပါ။ + + > Python ကို အသုံးပြုရင်း ကျွမ်းကျင်စေဖို့ ဒီ [Learn modules](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) များကို လေ့လာပါ။ + > + > [![Visual Studio Code မှာ Python ကို Setup လုပ်ခြင်း](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Visual Studio Code မှာ Python ကို Setup လုပ်ခြင်း") + > + > 🎥 အထက်ပါပုံကို Click လုပ်ပြီး VS Code မှာ Python ကို အသုံးပြုပုံကို ကြည့်ပါ။ + +3. **Scikit-learn ကို Install လုပ်ပါ**။ [ဒီအညွှန်းများ](https://scikit-learn.org/stable/install.html) ကို လိုက်နာပြီး Install လုပ်ပါ။ Python 3 ကို အသုံးပြုရမယ်ဆိုတာ သေချာစေဖို့ Virtual Environment ကို အသုံးပြုရန် အကြံပြုပါတယ်။ M1 Mac မှာ Library ကို Install လုပ်ရင် အထူးအညွှန်းများရှိပါတယ်။ + +4. **Jupyter Notebook ကို Install လုပ်ပါ**။ [Jupyter package](https://pypi.org/project/jupyter/) ကို Install လုပ်ပါ။ + +## သင့် ML Authoring Environment + +သင် **notebooks** ကို အသုံးပြုပြီး Python Code တွေကို Develop လုပ်ပြီး Machine Learning Models တွေကို တည်ဆောက်ပါမယ်။ ဒီအမျိုးအစားဖိုင်တွေဟာ Data Scientists တွေအတွက် အများဆုံးအသုံးပြုတဲ့ Tools ဖြစ်ပြီး `.ipynb` extension နဲ့ ဖိုင်တွေကို မှတ်သားနိုင်ပါတယ်။ + +Notebooks တွေဟာ Interactive Environment ဖြစ်ပြီး Developer တွေကို Code ရေးခြင်း၊ Notes ထည့်ခြင်း၊ Documentation ရေးခြင်း စတဲ့ အလုပ်တွေကို လုပ်နိုင်စေပါတယ်။ အထူးသဖြင့် Experimental သို့မဟုတ် Research-oriented Projects တွေအတွက် အထောက်အကူဖြစ်ပါတယ်။ + +[![ML for beginners - Jupyter Notebooks ကို Setup လုပ်ပြီး Regression Models တည်ဆောက်ခြင်း](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML for beginners - Jupyter Notebooks ကို Setup လုပ်ပြီး Regression Models တည်ဆောက်ခြင်း") + +> 🎥 အထက်ပါပုံကို Click လုပ်ပြီး ဒီအလုပ်ကို လုပ်ဆောင်ပုံကို ကြည့်ပါ။ + +### လက်တွေ့လုပ်ဆောင်မှု - Notebook ကို အသုံးပြုခြင်း + +ဒီ Folder မှာ _notebook.ipynb_ ဖိုင်ကို တွေ့နိုင်ပါမယ်။ + +1. _notebook.ipynb_ ကို Visual Studio Code မှာ ဖွင့်ပါ။ + + Jupyter Server တစ်ခု Python 3+ နဲ့ စတင်ပါမယ်။ Notebook မှာ `run` လို့ရတဲ့ Code Block တွေကို တွေ့နိုင်ပါမယ်။ Code Block တစ်ခုကို Run လုပ်ဖို့ Play Button ပုံစံ Icon ကို ရွေးပါ။ + +2. `md` icon ကို ရွေးပြီး Markdown အနည်းငယ်ထည့်ပါ၊ **# Welcome to your notebook** ဆိုတဲ့ စာသားကို ထည့်ပါ။ + + နောက်တစ်ဆင့်မှာ Python Code ကို ထည့်ပါ။ + +3. Code Block မှာ **print('hello notebook')** ကို ရိုက်ပါ။ +4. Arrow ကို ရွေးပြီး Code ကို Run လုပ်ပါ။ + + Printed Statement ကို တွေ့ရပါမယ် - + + ```output + hello notebook + ``` + +![VS Code မှာ Notebook ဖွင့်ထားပုံ](../../../../2-Regression/1-Tools/images/notebook.jpg) + +သင့် Code ကို Comments တွေနဲ့ ပေါင်းစပ်ပြီး Notebook ကို Self-document လုပ်နိုင်ပါတယ်။ + +✅ Web Developer ရဲ့ အလုပ်လုပ်ပုံနဲ့ Data Scientist ရဲ့ အလုပ်လုပ်ပုံက ဘယ်လိုကွာခြားနေလဲဆိုတာ အနည်းငယ်တွေးကြည့်ပါ။ + +## Scikit-learn ကို အသုံးပြုခြင်း + +Python ကို Local Environment မှာ Setup လုပ်ပြီး၊ Jupyter Notebooks ကို အသုံးပြုရင်း ကျွမ်းကျင်လာပြီးနောက်၊ Scikit-learn ကိုလည်း ကျွမ်းကျင်စေဖို့ လိုအပ်ပါတယ်။ Scikit-learn ကို `sci` (science) လို့ အသံထွက်ပါ။ Scikit-learn မှာ ML Tasks တွေကို လုပ်ဆောင်ဖို့ [အကျယ်အဝန်း API](https://scikit-learn.org/stable/modules/classes.html#api-ref) ရှိပါတယ်။ + +သူတို့ရဲ့ [website](https://scikit-learn.org/stable/getting_started.html) အရ - "Scikit-learn သည် supervised learning နှင့် unsupervised learning ကို ပံ့ပိုးပေးတဲ့ open source machine learning library ဖြစ်ပါတယ်။ Model fitting, data preprocessing, model selection နှင့် evaluation အပါအဝင် အခြားသော Utilities များစွာကိုလည်း ပံ့ပိုးပေးပါတယ်။" + +ဒီသင်ခန်းစာမှာ Scikit-learn နှင့် အခြား Tools များကို အသုံးပြုပြီး 'traditional machine learning' tasks တွေကို လုပ်ဆောင်ပါမယ်။ Neural Networks နှင့် Deep Learning ကို မပါဝင်စေဖို့ ရည်ရွယ်ထားပြီး၊ အဲဒီအကြောင်းအရာတွေကို 'AI for Beginners' curriculum မှာ ပိုမိုလေ့လာနိုင်ပါမယ်။ + +Scikit-learn သည် Models တွေကို တည်ဆောက်ပြီး အသုံးပြုဖို့ အလွယ်ကူဆုံးဖြစ်စေပါတယ်။ Numeric Data ကို အဓိကထားပြီး Learning Tools အဖြစ် အသုံးပြုနိုင်တဲ့ Dataset များစွာပါဝင်ပါတယ်။ Pre-built Models တွေကိုလည်း Students တွေ စမ်းသပ်နိုင်ပါတယ်။ Prepackaged Data ကို Load လုပ်ပြီး Built-in Estimator ကို အသုံးပြုတဲ့ ပထမဆုံး ML Model ကို လေ့လာကြည့်ပါမယ်။ + +## လက်တွေ့လုပ်ဆောင်မှု - ပထမဆုံး Scikit-learn Notebook + +> ဒီ Tutorial ကို Scikit-learn ရဲ့ [linear regression example](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) မှာ အခြေခံပြီး ရေးသားထားပါတယ်။ + +[![ML for beginners - Python မှာ ပထမဆုံး Linear Regression Project](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML for beginners - Python မှာ ပထမဆုံး Linear Regression Project") + +> 🎥 အထက်ပါပုံကို Click လုပ်ပြီး ဒီအလုပ်ကို လုပ်ဆောင်ပုံကို ကြည့်ပါ။ + +_notebook.ipynb_ ဖိုင်မှာရှိတဲ့ Cell တွေကို 'trash can' icon ကို နှိပ်ပြီး ရှင်းလင်းပါ။ + +ဒီအပိုင်းမှာ Scikit-learn မှာ Learning အတွက် Built-in ဖြစ်တဲ့ Diabetes Dataset ကို အသုံးပြုပါမယ်။ Diabetic Patients တွေအတွက် Treatment ကို စမ်းသပ်ချင်တယ်လို့ စဉ်းစားပါ။ Machine Learning Models တွေက Variables တွေကို အခြေခံပြီး ဘယ်သူတွေ Treatment ကို ပိုမိုတုံ့ပြန်နိုင်မလဲဆိုတာကို သတ်မှတ်ပေးနိုင်ပါတယ်။ Visualization လုပ်ထားတဲ့ Basic Regression Model တစ်ခုက Variables တွေကို သုံးပြီး Clinical Trials တွေကို စီမံခန့်ခွဲဖို့ အထောက်အကူဖြစ်စေမယ်။ + +✅ Regression Methods များစွာရှိပြီး၊ သင်ရွေးချယ်ရမယ့် Method က သင်လိုချင်တဲ့ အဖြေကို အခြေခံပါတယ်။ လူတစ်ဦးရဲ့ အသက်အရွယ်ကို အခြေခံပြီး အမြင့်ကို ခန့်မှန်းချင်တယ်ဆို Linear Regression ကို အသုံးပြုပါမယ်၊ အကြောင်းက Numeric Value ကို ရှာဖွေနေပါတယ်။ အစားအစာအမျိုးအစားတစ်ခုကို Vegan ဖြစ်/မဖြစ် သတ်မှတ်ချင်တယ်ဆို Logistic Regression ကို အသုံးပြုပါမယ်၊ အကြောင်းက Category Assignment ကို ရှာဖွေနေပါတယ်။ Logistic Regression ကို နောက်ပိုင်းမှာ ပိုမိုလေ့လာနိုင်ပါမယ်။ Data ကို အခြေခံပြီး မေးခွန်းများစွာကို တွေးကြည့်ပြီး၊ ဘယ် Method က ပိုသင့်တော်မလဲဆိုတာ တွေးကြည့်ပါ။ + +အလုပ်ကို စတင်လိုက်ပါ။ + +### Libraries များ Import လုပ်ခြင်း + +ဒီအလုပ်အတွက် Libraries အချို့ကို Import လုပ်ပါမယ် - + +- **matplotlib**. [Graphing Tool](https://matplotlib.org/) အဖြစ် အသုံးဝင်ပြီး Line Plot တစ်ခုကို ဖန်တီးဖို့ အသုံးပြုပါမယ်။ +- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) သည် Python မှာ Numeric Data ကို Handle လုပ်ဖို့ အသုံးဝင်တဲ့ Library ဖြစ်ပါတယ်။ +- **sklearn**. [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) Library ဖြစ်ပါတယ်။ + +သင့် Tasks များအတွက် အထောက်အကူဖြစ်စေမယ့် Libraries များကို Import လုပ်ပါ။ + +1. အောက်ပါ Code ကို ရိုက်ပါ - + + ```python + import matplotlib.pyplot as plt + import numpy as np + from sklearn import datasets, linear_model, model_selection + ``` + + အထက်မှာ `matplotlib`, `numpy` ကို Import လုပ်ပြီး၊ `datasets`, `linear_model` နှင့် `model_selection` ကို `sklearn` မှ Import လုပ်ထားပါတယ်။ `model_selection` ကို Data ကို Training နှင့် Test Sets အဖြစ် ခွဲခြားဖို့ အသုံးပြုပါတယ်။ + +### Diabetes Dataset + +Built-in [diabetes dataset](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) မှာ Diabetes နှင့် ပတ်သက်တဲ့ Data Samples 442 ခုပါဝင်ပြီး Feature Variables 10 ခုပါဝင်ပါတယ်၊ အချို့မှာ - + +- age: အသက် (နှစ်) +- bmi: Body Mass Index +- bp: ပျမ်းမျှ သွေးပေါင်ချိန် +- s1 tc: T-Cells (အဖြူရောင် သွေးဆဲလ်အမျိုးအစား) + +✅ ဒီ Dataset မှာ Diabetes နှင့် ပတ်သက်တဲ့ Research အတွက် Feature Variable အဖြစ် 'sex' ကိုပါဝင်ထားပါတယ်။ Medical Datasets များစွာမှာ ဒီလို Binary Classification ပါဝင်ပါတယ်။ Population တစ်ခုခုကို Treatment မရနိုင်စေတဲ့ Categorization များအကြောင်း အနည်းငယ်တွေးကြည့်ပါ။ + +အခု X နှင့် y Data ကို Load လုပ်ပါ။ + +> 🎓 ဒီဟာ supervised learning ဖြစ်ပြီး၊ Named 'y' Target လိုအပ်ပါတယ်။ + +Code Cell အသစ်တစ်ခုမှာ `load_diabetes()` ကို ခေါ်ပြီး Diabetes Dataset ကို Load လုပ်ပါ။ Input `return_X_y=True` သည် `X` ကို Data Matrix အဖြစ်၊ `y` ကို Regression Target အဖြစ် Return ပြန်ပေးပါမယ်။ + +1. Data Matrix ရဲ့ Shape နဲ့ ပထမဆုံး Element ကို ပြသဖို့ Print Commands အချို့ကို ထည့်ပါ - + + ```python + X, y = datasets.load_diabetes(return_X_y=True) + print(X.shape) + print(X[0]) + ``` + + Response အနေနဲ့ Tuple တစ်ခုကို ပြန်ပေးပါမယ်။ Tuple ရဲ့ ပထမဆုံးနှင့် ဒုတိယတန်ဖိုးကို `X` နှင့် `y` အဖြစ် Assign လုပ်ထားပါတယ်။ [Tuples](https://wikipedia.org/wiki/Tuple) အကြောင်းပိုမိုလေ့လာပါ။ + + ဒီ Data မှာ 442 Items ရှိပြီး 10 Elements ပါဝင်တဲ့ Arrays အဖြစ် Shape ရှိပါတယ် - + + ```text + (442, 10) + [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076 + -0.04340085 -0.00259226 0.01990842 -0.01764613] + ``` + + ✅ Data နဲ့ Regression Target အကြား ဆက်နွယ်မှုကို အနည်းငယ်တွေးကြည့်ပါ။ Linear Regression သည် Feature X နှင့် Target Variable y အကြား ဆက်နွယ်မှုကို ခန့်မှန်းပေးပါတယ်။ Diabetes Dataset ရဲ့ [Target](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) ကို Documentation မှာ ရှာဖွေပါ။ ဒီ Dataset က ဘာကို ပြသနေသလဲ? + +2. Dataset ရဲ့ တစ်စိတ်တစ်ပိုင်းကို Plot ဖို့ Dataset ရဲ့ 3rd Column ကို ရွေးပါ။ `:` Operator ကို အသုံးပြုပြီး Rows အားလုံးကို ရွေးပြီး၊ Index (2) ကို အသုံးပြုပြီး 3rd Column ကို ရွေးပါ။ Data ကို 2D Array အဖြစ် Reshape လုပ်ဖို့ `reshape(n_rows, n_columns)` ကို အသုံးပြုပါ။ Parameter တစ်ခုမှာ -1 ရှိရင်၊ Dimension ကို အလိုအလျောက်တွက်ချက်ပေးပါမယ်။ + + ```python + X = X[:, 2] + X = X.reshape((-1,1)) + ``` + + ✅ Data ရဲ့ Shape ကို အချိန်မရွေး Print လုပ်ပြီး စစ်ဆေးပါ။ + +3. Data ကို Plot လုပ်ဖို့ ပြင်ဆင်ပြီးနောက်၊ ဒီ Dataset မှာ Numbers တွေကို Logical Split လုပ်ဖို့ Machine ကို အသုံးပြုနိုင်ပါမယ်။ ဒီအလုပ်ကို လုပ်ဖို့ Data (X) နှင့် Target (y) ကို Test နှင့် Training Sets အဖြစ် ခွဲခြားဖို့ လိုအပ်ပါတယ်။ Scikit-learn မှာ ဒီအလုပ်ကို လုပ်ဖို့ လွယ်ကူတဲ့ နည်းလမ်းရှိပါတယ်၊ Test Data ကို တစ်ခုခု Point မှာ Split လုပ်နိုင်ပါတယ်။ + + ```python + X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) + ``` + +4. Model ကို Training လုပ်ဖို့ ပြင်ဆင်ပါ! Linear Regression Model ကို Load လုပ်ပြီး `model.fit()` ကို အသုံးပြုပြီး X နှင့် y Training Sets များကို Training လုပ်ပါ။ + + ```python + model = linear_model.LinearRegression() + model.fit(X_train, y_train) + ``` + + ✅ `model.fit()` သည် TensorFlow ကဲ့သို့သော ML Libraries များမှာ တွေ့ရနိုင်တဲ့ Function ဖြစ်ပါတယ်။ + +5. Test Data ကို အသုံးပြုပြီး Prediction တစ်ခုကို ဖန်တီးပါ၊ `predict()` Function ကို အသုံးပြုပါ။ ဒီဟာကို Model ရဲ့ Data Groupings အကြား Line ကို ရေးဆ +✅ ဒီမှာဘာဖြစ်နေတာလဲဆိုတာကိုအနည်းငယ်တွေးကြည့်ပါ။ တစ်ခုတည်းသောတည့်တည့်လိုင်းတစ်ခုဟာ အချက်အလက်အနည်းငယ်များကိုဖြတ်သွားနေပါတယ်၊ ဒါပေမယ့် အတိအကျဘာလုပ်နေတာလဲ? မသိသေးတဲ့ အချက်အလက်တစ်ခုဟာ ဒီလိုင်းနဲ့ပတ်သက်ပြီး y axis ပေါ်မှာဘယ်နေရာမှာရှိမလဲဆိုတာကို သင်ခန့်မှန်းနိုင်ပုံကိုမြင်နိုင်ပါသလား? ဒီမော်ဒယ်ရဲ့ အကျိုးကျေးဇူးကို လက်တွေ့အသုံးချပုံအနေနဲ့ စကားလုံးတွေနဲ့ဖော်ပြကြည့်ပါ။ + +အောင်မြင်ပါတယ်၊ သင့်ရဲ့ ပထမဆုံး linear regression မော်ဒယ်ကို တည်ဆောက်ပြီး၊ အဲဒီနဲ့ ခန့်မှန်းချက်တစ်ခုကိုဖန်တီးပြီး၊ plot ထဲမှာ ပြသနိုင်ခဲ့ပါပြီ! + +--- +## 🚀စိန်ခေါ်မှု + +ဒီ dataset ထဲက အခြား variable တစ်ခုကို plot လုပ်ပါ။ အကြံပြုချက်: ဒီလိုင်းကို ပြင်ဆင်ပါ `X = X[:,2]`။ ဒီ dataset ရဲ့ target ကိုအခြေခံပြီး၊ ဆီးချိုရောဂါရဲ့ တိုးတက်မှုအခြေအနေကို ဘာတွေရှာဖွေနိုင်မလဲ? + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +ဒီသင်ခန်းစာမှာ သင် simple linear regression ကို အသုံးပြုခဲ့ပြီး၊ univariate regression သို့မဟုတ် multiple linear regression မဟုတ်ပါဘူး။ ဒီနည်းလမ်းတွေကြားက ကွာခြားချက်တွေကို အနည်းငယ်ဖတ်ရှုပါ၊ ဒါမှမဟုတ် [ဒီဗီဒီယို](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef) ကိုကြည့်ပါ။ + +Regression ရဲ့ အယူအဆကို ပိုမိုနားလည်ရန် ဖတ်ရှုပါ၊ ဒီနည်းလမ်းနဲ့ ဖြေရှင်းနိုင်တဲ့ မေးခွန်းအမျိုးမျိုးကို တွေးကြည့်ပါ။ သင့်နားလည်မှုကို ပိုမိုတိုးတက်စေရန် [ဒီသင်ခန်းစာ](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) ကို လေ့လာပါ။ + +## အလုပ်ပေးစာ + +[A different dataset](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/1-Tools/assignment.md b/translations/my/2-Regression/1-Tools/assignment.md new file mode 100644 index 00000000..23ec6e41 --- /dev/null +++ b/translations/my/2-Regression/1-Tools/assignment.md @@ -0,0 +1,27 @@ + +# Scikit-learn ဖြင့် Regression + +## လမ်းညွှန်ချက်များ + +Scikit-learn မှ [Linnerud dataset](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) ကိုကြည့်ပါ။ ဒီ dataset တွင် [targets](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset) များစွာပါဝင်သည်။ 'ဤ dataset တွင် အလယ်အလတ်အသက်ရှိသော လူပေါင်း ၂၀ ရဲ့ fitness club မှ စုဆောင်းထားသော လေ့ကျင့်ခန်း (data) နှင့် ရုပ်ပိုင်းဆိုင်ရာ (target) အချက်အလက် ၃ ခု ပါဝင်သည်'။ + +သင်၏စကားလုံးများဖြင့်၊ ခါးပတ်အကျယ်နှင့် situps အရေအတွက်အကြား ဆက်နွယ်မှုကို ရှင်းလင်းပြသမည့် Regression model တစ်ခုကို ဘယ်လိုဖန်တီးရမည်ကို ရှင်းပြပါ။ ဒီ dataset ရဲ့ အခြား data points များအတွက်လည်း အတူတူလုပ်ဆောင်ပါ။ + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သည် | +| ------------------------------ | ----------------------------------- | ----------------------------- | -------------------------- | +| ဖော်ပြချက်စာပိုဒ်တင်သွင်းမှု | ရေးသားမှုကောင်းမွန်သောစာပိုဒ်တစ်ခုတင်သွင်းသည် | စာကြောင်းအနည်းငယ်တင်သွင်းသည် | ဖော်ပြချက်မပါဝင်ပါ | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/1-Tools/solution/Julia/README.md b/translations/my/2-Regression/1-Tools/solution/Julia/README.md new file mode 100644 index 00000000..1ce17f13 --- /dev/null +++ b/translations/my/2-Regression/1-Tools/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူပညာရှင်များမှ ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/2-Data/README.md b/translations/my/2-Regression/2-Data/README.md new file mode 100644 index 00000000..8576495e --- /dev/null +++ b/translations/my/2-Regression/2-Data/README.md @@ -0,0 +1,218 @@ + +# Scikit-learn ကို အသုံးပြု၍ Regression Model တည်ဆောက်ခြင်း - ဒေတာကို ပြင်ဆင်ပြီး ရှင်းလင်းဖော်ပြခြင်း + +![ဒေတာရှင်းလင်းဖော်ပြမှု infographic](../../../../2-Regression/2-Data/images/data-visualization.png) + +Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +> ### [ဒီသင်ခန်းစာကို R မှာလည်းရနိုင်ပါတယ်!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) + +## အကျဉ်းချုပ် + +Scikit-learn ကို အသုံးပြု၍ Machine Learning Model တည်ဆောက်ရန် လိုအပ်သော tools များကို ပြင်ဆင်ပြီးနောက်၊ သင်၏ဒေတာကို မေးခွန်းထုတ်ရန် အဆင်သင့်ဖြစ်ပါပြီ။ ML ဖြေရှင်းချက်များကို အသုံးပြုပြီး ဒေတာနှင့်အလုပ်လုပ်သည့်အခါ၊ သင့်ဒေတာ၏ အခွင့်အလမ်းများကို အကောင်းဆုံးအသုံးချနိုင်ရန် မေးခွန်းကို မှန်ကန်စွာမေးနိုင်ဖို့ အရေးကြီးပါတယ်။ + +ဒီသင်ခန်းစာမှာ သင်လေ့လာရမည့်အရာများမှာ: + +- Model တည်ဆောက်ရန်အတွက် ဒေတာကို ပြင်ဆင်နည်း။ +- Matplotlib ကို အသုံးပြု၍ ဒေတာကို ရှင်းလင်းဖော်ပြနည်း။ + +## သင့်ဒေတာကို မှန်ကန်စွာမေးခွန်းထုတ်ခြင်း + +သင်လိုအပ်သော အဖြေကို သတ်မှတ်သည့် မေးခွန်းသည် သင်အသုံးပြုမည့် ML algorithm အမျိုးအစားကို ဆုံးဖြတ်ပေးပါမည်။ သင်ရရှိမည့် အဖြေ၏ အရည်အသွေးသည် သင့်ဒေတာ၏ သဘာဝပေါ်မူတည်ပါမည်။ + +ဒီသင်ခန်းစာအတွက် [ဒေတာ](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) ကို ကြည့်ပါ။ ဒီ .csv ဖိုင်ကို VS Code မှာ ဖွင့်နိုင်ပါတယ်။ အမြန်ကြည့်လိုက်တာနဲ့ အလွတ်နေရာများ၊ စာသားနှင့် ကိန်းဂဏန်းများရောနှောနေမှုကို တွေ့နိုင်ပါတယ်။ 'Package' ဆိုတဲ့ ထူးဆန်းတဲ့ ကော်လံမှာ 'sacks', 'bins' စတဲ့ အမျိုးမျိုးသော အချက်အလက်တွေ ရှိပါတယ်။ ဒေတာက တကယ်တော့ အတော်လေး ရှုပ်ထွေးနေပါတယ်။ + +[![ML for beginners - How to Analyze and Clean a Dataset](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML for beginners - How to Analyze and Clean a Dataset") + +> 🎥 အထက်ပါပုံကို နှိပ်ပြီး ဒီသင်ခန်းစာအတွက် ဒေတာကို ပြင်ဆင်နည်းကို ကြည့်ပါ။ + +တကယ်တော့ ML model တစ်ခုကို တည်ဆောက်ရန် အဆင်သင့်ဖြစ်နေသော ဒေတာကို ရရှိခြင်းသည် ရှားပါးသောအရာဖြစ်သည်။ ဒီသင်ခန်းစာမှာ သင် Python libraries များကို အသုံးပြု၍ raw dataset ကို ပြင်ဆင်နည်းကို လေ့လာပါမည်။ ဒါ့အပြင် ဒေတာကို ရှင်းလင်းဖော်ပြရန် နည်းလမ်းများကိုလည်း လေ့လာပါမည်။ + +## Case study: 'ဖရုံသီးဈေးကွက်' + +ဒီ folder မှာ [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) ဆိုတဲ့ .csv ဖိုင်ကို `data` folder ရဲ့ root မှာ တွေ့နိုင်ပါတယ်။ ဒီဖိုင်မှာ မြို့အလိုက် အုပ်စုဖွဲ့ထားတဲ့ ဖရုံသီးဈေးကွက်အကြောင်း 1757 လိုင်းရှိပါတယ်။ ဒါဟာ [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) မှ ထုတ်ယူထားတဲ့ raw data ဖြစ်ပြီး အမေရိကန် စိုက်ပျိုးရေးဌာနက ဖြန့်ဝေထားတာဖြစ်ပါတယ်။ + +### ဒေတာကို ပြင်ဆင်ခြင်း + +ဒီဒေတာဟာ public domain မှာ ရှိပါတယ်။ ဒေတာကို USDA website မှာ မြို့အလိုက် ဖိုင်များအနေနဲ့ ဒေါင်းလုဒ်လုပ်နိုင်ပါတယ်။ အလွဲလွဲအချော်ချော် ဖိုင်များကို ရှောင်ရှားရန် မြို့အလိုက် ဒေတာအားလုံးကို spreadsheet တစ်ခုအဖြစ် ပေါင်းစည်းထားပြီး ဒေတာကို အနည်းငယ် ပြင်ဆင်ထားပါတယ်။ အခုတော့ ဒေတာကို နီးကပ်စွာ ကြည့်လိုက်ရအောင်။ + +### ဖရုံသီးဒေတာ - စောစောကနေ သုံးသပ်ချက်များ + +ဒီဒေတာအကြောင်း သင်ဘာတွေ သတိထားမိပါသလဲ? စာသား၊ ကိန်းဂဏန်း၊ အလွတ်နေရာများနှင့် ထူးဆန်းတဲ့ အချက်အလက်များ ရောနှောနေမှုကို သင်ကြည့်ပြီးသားဖြစ်ပါတယ်။ + +Regression နည်းလမ်းကို အသုံးပြု၍ ဒီဒေတာကို ဘယ်လိုမေးခွန်းထုတ်နိုင်မလဲ? "တစ်လအတွင်းရောင်းချသော ဖရုံသီးတစ်လုံး၏ဈေးနှုန်းကို ခန့်မှန်းပါ" ဆိုတဲ့ မေးခွန်းကို မေးနိုင်ပါတယ်။ ဒေတာကို ပြန်ကြည့်လိုက်ရင် ဒီ task အတွက် လိုအပ်သော data structure ကို ဖန်တီးရန် အချို့ပြောင်းလဲမှုများ လိုအပ်ပါသည်။ + +## လေ့ကျင့်ခန်း - ဖရုံသီးဒေတာကို သုံးသပ်ခြင်း + +[Pandas](https://pandas.pydata.org/) ကို အသုံးပြုပါ။ (Pandas ဆိုတာ `Python Data Analysis` ကို ရည်ညွှန်းပါတယ်) ဒေတာကို အဆင်ပြေစွာ ပြင်ဆင်ရန် အထူးအသုံးဝင်တဲ့ tool ဖြစ်ပါတယ်။ + +### ပထမဦးဆုံး၊ နေ့စွဲပျောက်နေမှုကို စစ်ဆေးပါ + +သင်အရင်ဆုံး နေ့စွဲပျောက်နေမှုကို စစ်ဆေးရန် လိုအပ်ပါမည်: + +1. နေ့စွဲများကို လအဖြစ် ပြောင်းပါ (ဒီဟာ US dates ဖြစ်တဲ့အတွက် format က `MM/DD/YYYY` ဖြစ်ပါတယ်)။ +2. လကို အသစ်သော ကော်လံတစ်ခုထဲမှာ ထုတ်ယူပါ။ + +_notebook.ipynb_ ဖိုင်ကို Visual Studio Code မှာ ဖွင့်ပြီး spreadsheet ကို Pandas dataframe အသစ်တစ်ခုထဲ import လုပ်ပါ။ + +1. `head()` function ကို အသုံးပြု၍ ပထမ ၅ ရွေ့ကို ကြည့်ပါ။ + + ```python + import pandas as pd + pumpkins = pd.read_csv('../data/US-pumpkins.csv') + pumpkins.head() + ``` + + ✅ နောက်ဆုံး ၅ ရွေ့ကို ကြည့်ရန် ဘယ် function ကို အသုံးပြုမလဲ? + +1. လက်ရှိ dataframe မှာ ပျောက်နေသော ဒေတာရှိမရှိ စစ်ဆေးပါ: + + ```python + pumpkins.isnull().sum() + ``` + + ပျောက်နေသော ဒေတာရှိပါတယ်၊ ဒါပေမယ့် ဒီ task အတွက် အရေးမကြီးလို့ ဖြစ်နိုင်ပါတယ်။ + +1. သင့် dataframe ကို အလုပ်လုပ်ရန် ပိုမိုလွယ်ကူစေရန် `loc` function ကို အသုံးပြု၍ လိုအပ်သော ကော်လံများကိုသာ ရွေးပါ။ `:` ဆိုတဲ့ expression က "အလုံးစုံသော ရွေ့များ" ကို ရည်ညွှန်းပါတယ်။ + + ```python + columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] + pumpkins = pumpkins.loc[:, columns_to_select] + ``` + +### ဒုတိယ၊ ဖရုံသီး၏ ပျမ်းမျှဈေးနှုန်းကို ဆုံးဖြတ်ပါ + +ဖရုံသီးတစ်လုံး၏ ပျမ်းမျှဈေးနှုန်းကို ဆုံးဖြတ်ရန် ဘယ်ကော်လံများကို ရွေးမလဲ? အကြံပြုချက် - သင့်အတွက် ၃ ကော်လံလိုအပ်ပါမည်။ + +ဖြေရှင်းချက် - `Low Price` နှင့် `High Price` ကော်လံများ၏ ပျမ်းမျှကို ရယူပြီး Price column အသစ်ကို ဖြည့်ပါ၊ နေ့စွဲကော်လံကို လသာသာ ပြောင်းပါ။ အထက်ပါစစ်ဆေးမှုအရ၊ နေ့စွဲများနှင့်ဈေးနှုန်းများအတွက် ပျောက်နေသော ဒေတာမရှိပါ။ + +1. ပျမ်းမျှကိုတွက်ရန် အောက်ပါ code ကို ထည့်ပါ: + + ```python + price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 + + month = pd.DatetimeIndex(pumpkins['Date']).month + + ``` + + ✅ `print(month)` ကို အသုံးပြု၍ သင်စစ်ဆေးလိုသော ဒေတာကို print လုပ်နိုင်ပါတယ်။ + +2. ပြောင်းလဲထားသော ဒေတာကို Pandas dataframe အသစ်တစ်ခုထဲ copy လုပ်ပါ: + + ```python + new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) + ``` + + သင့် dataframe ကို print လုပ်ပါက သင် regression model အသစ်တစ်ခုတည်ဆောက်ရန် သန့်ရှင်းပြီး tidy ဖြစ်သော dataset ကို တွေ့ပါမည်။ + +### ဒါပေမယ့်! ဒီမှာ ထူးဆန်းတဲ့အရာတစ်ခုရှိပါတယ် + +`Package` ကော်လံကို ကြည့်ပါက ဖရုံသီးများကို အမျိုးမျိုးသော configuration များဖြင့် ရောင်းချထားသည်ကို တွေ့နိုင်ပါတယ်။ တချို့ကို '1 1/9 bushel' အတိုင်းရောင်းပြီး တချို့ကို '1/2 bushel' အတိုင်းရောင်းထားပါတယ်၊ တချို့ကို တစ်လုံးချင်း၊ တချို့ကို ပေါင်ချင်း၊ တချို့ကို အကျယ်အဝန်းအမျိုးမျိုးရှိသော box ใหญ่များဖြင့် ရောင်းထားပါတယ်။ + +> ဖရုံသီးများကို တိကျစွာချိန်ဆမရလွယ်ကူပါ + +မူရင်းဒေတာကို စူးစမ်းကြည့်ပါက `Unit of Sale` က 'EACH' သို့မဟုတ် 'PER BIN' ဖြစ်သောအခါ `Package` အမျိုးအစားသည် inch, bin, သို့မဟုတ် 'each' ဖြစ်သည်ကို တွေ့နိုင်ပါတယ်။ ဖရုံသီးများကို တိကျစွာချိန်ဆမရလွယ်ကူသောကြောင့် `Package` ကော်လံတွင် 'bushel' စာသားပါသော ဖရုံသီးများကိုသာ ရွေးပါ။ + +1. .csv import အစပိုင်းတွင် filter တစ်ခု ထည့်ပါ: + + ```python + pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] + ``` + + ဒေတာကို print လုပ်ပါက သင် bushel ဖြင့် ရောင်းချသော ဖရုံသီး 415 ရွေ့ခန့်သာ ရရှိနေသည်ကို တွေ့နိုင်ပါမည်။ + +### ဒါပေမယ့်! လုပ်စရာတစ်ခုကျန်နေပါတယ် + +Bushel အရေအတွက်သည် row တစ်ခုချင်းစီအလိုက် ကွဲပြားနေသည်ကို သတိထားမိပါသလား? သင် bushel တစ်ခုအတိုင်းဈေးနှုန်းကို ပြသရန် ဈေးနှုန်းကို normalize လုပ်ရန် လိုအပ်ပါသည်။ + +1. new_pumpkins dataframe ဖန်တီးသော block အောက်တွင် အောက်ပါ code ကို ထည့်ပါ: + + ```python + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) + + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) + ``` + +✅ [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) အဆိုအရ bushel ၏ အလေးချိန်သည် ထုတ်ကုန်အမျိုးအစားပေါ်မူတည်ပြီး ကွဲပြားပါသည်။ "ဥပမာအားဖြင့် တမာတီဖရုံသီး bushel တစ်ခုသည် 56 ပေါင်အလေးချိန်ရှိသင့်သည်... အရွက်များနှင့် အပင်များသည် ပိုမိုနေရာယူပြီး အလေးချိန်နည်းပါသည်၊ ထို့ကြောင့် spinach bushel တစ်ခုသည် 20 ပေါင်သာရှိသည်။" ဒါဟာ အတော်ရှုပ်ထွေးပါတယ်! Bushel-to-pound conversion ကို မလုပ်တော့ပါ၊ bushel အတိုင်းဈေးနှုန်းကိုသာ ပြသပါ။ Bushel ၏ သဘာဝကို နားလည်ရန် အရေးကြီးကြောင်းကို ဒီဖရုံသီး bushel များကို လေ့လာခြင်းမှ သက်သေပြနိုင်ပါတယ်။ + +အခုတော့ bushel အတိုင်း standardized ဖြစ်သောဈေးနှုန်းကို သုံးသပ်နိုင်ပါပြီ။ ဒေတာကို print လုပ်ပါက သင် standardized ဖြစ်သော ဒေတာကို တွေ့နိုင်ပါမည်။ + +✅ Half-bushel ဖြင့် ရောင်းချသော ဖရုံသီးများသည် အတော်လေးဈေးကြီးနေသည်ကို သတိထားမိပါသလား? ဘာကြောင့်ဖြစ်နိုင်မလဲ? အကြံပြုချက် - သေးငယ်သော ဖရုံသီးများသည် ကြီးမားသော ဖရုံသီးများထက် ပိုမိုဈေးကြီးပါသည်၊ အကြောင်းကတော့ တစ် bushel အတွင်း သေးငယ်သော ဖရုံသီးများသည် အလုံးအရေအတွက်ပိုများပြီး ကြီးမားသော ဖရုံသီးတစ်လုံး၏ အလွတ်နေရာများကို ယူထားသောကြောင့် ဖြစ်နိုင်ပါသည်။ + +## Visualization Strategies + +Data Scientist တစ်ဦး၏ အလုပ်တစ်ခုမှာ သူတို့အလုပ်လုပ်နေသော ဒေတာ၏ အရည်အသွေးနှင့် သဘာဝကို ဖော်ပြရန် ဖြစ်သည်။ ဒေတာ၏ အမျိုးမျိုးသော aspect များကို ဖော်ပြသော interesting visualizations, plots, graphs, နှင့် charts များကို ဖန်တီးခြင်းဖြင့် ဒေတာ၏ ဆက်နွယ်မှုများနှင့် ရှာဖွေရန်ခက်ခဲသော အပိုင်းများကို ရှင်းလင်းဖော်ပြနိုင်သည်။ + +[![ML for beginners - How to Visualize Data with Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML for beginners - How to Visualize Data with Matplotlib") + +> 🎥 အထက်ပါပုံကို နှိပ်ပြီး ဒီသင်ခန်းစာအတွက် ဒေတာကို ရှင်းလင်းဖော်ပြနည်းကို ကြည့်ပါ။ + +Visualizations များသည် ML technique အတွက် သင့်လျော်သောနည်းလမ်းကို ဆုံးဖြတ်ရန်လည်း အထောက်အကူပြုနိုင်သည်။ Scatterplot တစ်ခုသည် လိုင်းတစ်ခုလိုမျိုးဖြစ်နေသည်ကို တွေ့ပါက ဒေတာသည် linear regression exercise အတွက် သင့်လျော်သည်ကို ပြသနိုင်သည်။ + +Jupyter notebooks တွင် အလုပ်လုပ်ရန် သင့်လျော်သော data visualization library တစ်ခုမှာ [Matplotlib](https://matplotlib.org/) ဖြစ်သည် (သင်မကြာသေးမီက သင်ခန်းစာတွင်လည်း Matplotlib ကို တွေ့ခဲ့ပါသည်)။ + +> [ဒီ tutorials](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott) တွင် data visualization ကို ပိုမိုလေ့လာပါ။ + +## လေ့ကျင့်ခန်း - Matplotlib ကို စမ်းသပ်ခြင်း + +သင်ဖန်တီးထားသော dataframe အသစ်ကို ပြသရန် အခြေခံ plot များကို ဖန်တီးကြည့်ပါ။ အခြေခံ line plot တစ်ခုက ဘာကို ပြသမလဲ? + +1. ဖိုင်၏ အပေါ်ပိုင်း Pandas import အောက်တွင် Matplotlib ကို import လုပ်ပါ: + + ```python + import matplotlib.pyplot as plt + ``` + +1. notebook အားလုံးကို ပြန်လည် run လုပ်ပါ။ +1. notebook အောက်ဆုံးတွင် box အဖြစ် ဒေတာကို plot လုပ်ရန် cell တစ်ခု ထည့်ပါ: + + ```python + price = new_pumpkins.Price + month = new_pumpkins.Month + plt.scatter(price, month) + plt.show() + ``` + + ![Scatterplot showing price to month relationship](../../../../2-Regression/2-Data/images/scatterplot.png) + + ဒီ plot သုံးစွဲရန် အသုံးဝင်ပါသလား? ဘာအကြောင်းကြောင့် အံ့ဩမိပါသလဲ? + + ဒါဟာ အသုံးဝင်တဲ့ plot မဟုတ်ပါဘူး၊ ဒါက သင့်ဒေတာကို တစ်လအတွင်း point များအဖြစ် ပြသထားတာသာ ဖြစ်ပါတယ်။ + +### အသုံးဝင်အောင်လုပ်ပါ + +Charts များကို အသုံးဝင်အောင်လုပ်ရန် ဒေတာကို အုပ်စုဖွဲ့ရန် လိုအပ်ပါသည်။ ဒေတာကို အုပ်စုဖွဲ့ပြီး y axis တွင် လများကို ပြသပြီး ဒေတာသည် distribution ကို ပြသသော plot တစ်ခုကို ဖန်တီးကြည့်ပါ။ + +1. Grouped bar chart ဖန်တီးရန် cell တစ်ခု ထည့်ပါ: + + ```python + new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') + plt.ylabel("Pumpkin Price") + ``` + + ![Bar chart showing price to month relationship](../../../../2-Regression/2-Data/images/barchart.png) + + ဒါဟာ ပိုမိုအသုံးဝင်သော data visualization ဖြစ်ပါတယ်! ဖရုံသီးများ၏ အမြင့်ဆုံးဈေးနှုန်းသည် စက်တင်ဘာနှင့် အောက်တိုဘာတွင် ဖြစ်သည်ကို ပြသနေသည်။ ဒါဟာ သင့်မျှော်လင့်ချက်နှင့် ကိုက်ညီပါသလား? ဘာကြောင့်/ဘာကြောင့်မဟုတ်ပါလဲ? + +--- + +## 🚀Challenge + +Matplotlib မှ ပေးသော visualization အမျိုးအစားများကို စူးစမ်းပါ။ Regression problems အတွက် သင့်လျော်သော အမျိုးအစားများက ဘာတွေလဲ? + +## [Post-lecture quiz](https://ff-quizzes.netlify + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကူးဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/2-Data/assignment.md b/translations/my/2-Regression/2-Data/assignment.md new file mode 100644 index 00000000..744b01bb --- /dev/null +++ b/translations/my/2-Regression/2-Data/assignment.md @@ -0,0 +1,23 @@ + +# ရှုထောင့်များကို လေ့လာခြင်း + +ဒေတာကို ရှုထောင့်ဖော်ပြရန် အသုံးပြုနိုင်သော စာကြောင်းများ အမျိုးမျိုးရှိသည်။ ဒီသင်ခန်းစာမှာ Pumpkin ဒေတာကို အသုံးပြုပြီး matplotlib နှင့် seaborn ကို အသုံးပြုကာ နမူနာ notebook တွင် ရှုထောင့်များ ဖော်ပြပါ။ ဘယ်စာကြောင်းတွေက အသုံးပြုရလွယ်ကူသလဲ? + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| -------- | --------- | -------- | ----------------- | +| | notebook တစ်ခုကို ရှုထောင့်/ဖော်ပြချက် နှစ်ခုနှင့်တင်သွင်းထားသည် | notebook တစ်ခုကို ရှုထောင့်/ဖော်ပြချက် တစ်ခုနှင့်တင်သွင်းထားသည် | notebook တစ်ခုကို မတင်သွင်းထားပါ | + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွဲအချော်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/2-Data/solution/Julia/README.md b/translations/my/2-Regression/2-Data/solution/Julia/README.md new file mode 100644 index 00000000..cfac64d6 --- /dev/null +++ b/translations/my/2-Regression/2-Data/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် ရှုလေ့လာသင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်မှု ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားယူမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/3-Linear/README.md b/translations/my/2-Regression/3-Linear/README.md new file mode 100644 index 00000000..8ed20c29 --- /dev/null +++ b/translations/my/2-Regression/3-Linear/README.md @@ -0,0 +1,365 @@ + +# Scikit-learn ကို အသုံးပြု၍ Regression မော်ဒယ်တစ်ခု တည်ဆောက်ခြင်း: Regression လုပ်နည်း ၄ မျိုး + +![Linear vs polynomial regression infographic](../../../../2-Regression/3-Linear/images/linear-polynomial.png) +> Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +> ### [ဒီသင်ခန်းစာကို R မှာလည်းရနိုင်ပါတယ်!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html) +### အကျဉ်းချုပ် + +ယခင်အခန်းများတွင် Regression ဆိုတာဘာလဲဆိုတာကို သင် Pumpkin စျေးနှုန်း dataset ကို အသုံးပြု၍ လေ့လာခဲ့ပြီး Matplotlib ကို အသုံးပြု၍ visualization လုပ်ခဲ့ပါသည်။ + +အခုတော့ ML အတွက် Regression ကို ပိုမိုနက်နက်ရှိုင်းရှိုင်း လေ့လာရန် အဆင်သင့်ဖြစ်ပါပြီ။ Visualization က ဒေတာကို နားလည်စေသလို Machine Learning ရဲ့ အဓိကအားသာချက်ကတော့ _မော်ဒယ်များကို လေ့ကျင့်ခြင်း_ ဖြစ်ပါတယ်။ မော်ဒယ်များကို သမိုင်းကြောင်းဒေတာပေါ်မှာ လေ့ကျင့်ပြီး ဒေတာအချင်းချင်း ဆက်နွယ်မှုများကို အလိုအလျောက် ဖမ်းဆီးနိုင်စေပြီး မော်ဒယ်မမြင်ဖူးသေးတဲ့ ဒေတာအသစ်များအတွက် အကျိုးအမြတ်ကို ခန့်မှန်းနိုင်စေပါတယ်။ + +ဒီသင်ခန်းစာမှာ Regression အမျိုးအစား ၂ မျိုးကို ပိုမိုနက်နက်ရှိုင်းရှိုင်း လေ့လာပါမည်။ _အခြေခံ Linear Regression_ နှင့် _Polynomial Regression_ တို့ဖြစ်ပြီး ဒီနည်းလမ်းများရဲ့ သင်္ချာဆိုင်ရာ အခြေခံကိုလည်း လေ့လာပါမည်။ ဒီမော်ဒယ်များက Pumpkin စျေးနှုန်းကို input data အမျိုးမျိုးပေါ်မူတည်ပြီး ခန့်မှန်းနိုင်စေပါမည်။ + +[![ML for beginners - Understanding Linear Regression](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "ML for beginners - Understanding Linear Regression") + +> 🎥 Linear Regression ရဲ့ အကျဉ်းချုပ်ကို ကြည့်ရန် အထက်ပါပုံကို နှိပ်ပါ။ + +> ဒီသင်ရိုးတစ်ခုလုံးမှာ သင်္ချာအပေါ် အနည်းငယ်သာ သိရှိမှုရှိသည်ဟု သတ်မှတ်ပြီး သင်္ချာကို အခြားနယ်ပယ်မှ ကျောင်းသားများလည်း နားလည်နိုင်စေရန် ရည်ရွယ်ထားပါသည်။ 🧮 မှတ်ချက်များ၊ အကြောင်းပြ callouts၊ ရှင်းလင်းပုံများနှင့် အခြားသင်ယူမှုကိရိယာများကို အသုံးပြုထားသည်။ + +### ကြိုတင်လိုအပ်ချက် + +Pumpkin data ရဲ့ ဖွဲ့စည်းပုံကို ယခုအချိန်မှာ သင်နားလည်ပြီးဖြစ်ရမည်။ ဒီသင်ခန်းစာရဲ့ _notebook.ipynb_ ဖိုင်မှာ preloaded နှင့် pre-cleaned ဖြစ်ပြီး bushel တစ်ခုအတွက် Pumpkin စျေးနှုန်းကို အသစ်သော data frame မှာ ပြထားသည်။ Visual Studio Code ရဲ့ kernels တွင် ဒီ notebooks များကို run လုပ်နိုင်ရမည်။ + +### ပြင်ဆင်မှု + +ဒီဒေတာကို load လုပ်ပြီး အမေးအဖြေများကို ရှာဖွေဖို့ သတိပြုပါ။ + +- Pumpkin ဝယ်ဖို့ အချိန်ကောင်းဆုံးက ဘယ်အချိန်လဲ? +- Miniature pumpkins တစ် case ရဲ့ စျေးနှုန်းကို ဘယ်လောက်ခန့်မှန်းနိုင်မလဲ? +- Half-bushel baskets နဲ့ 1 1/9 bushel box တစ်ခုကို ဘယ်ဟာကို ဝယ်သင့်လဲ? +ဒီဒေတာကို ဆက်လက် လေ့လာကြည့်ရအောင်။ + +ယခင်သင်ခန်းစာမှာ Pandas data frame တစ်ခုကို ဖန်တီးပြီး မူရင်း dataset ရဲ့ အစိတ်အပိုင်းတစ်ခုကို ထည့်သွင်းခဲ့သည်။ Pricing ကို bushel အတိုင်းအတာဖြင့် စံပြုခဲ့သည်။ ဒါပေမယ့် ၄၀၀ ခန့်သော datapoints ကိုသာ ရရှိခဲ့ပြီး ဆောင်းရာသီလများအတွက်သာ ရရှိခဲ့သည်။ + +ဒီသင်ခန်းစာရဲ့ notebook တွင် preloaded data ကို ကြည့်ပါ။ ဒေတာကို preloaded လုပ်ပြီး month data ကို scatterplot တစ်ခုအဖြစ် chart လုပ်ထားသည်။ ဒေတာရဲ့ nature ကို ပိုမိုသေချာစေရန် ပိုမိုသန့်စင်နိုင်မလားဆိုတာ ကြည့်ပါ။ + +## Linear Regression Line တစ်ခု + +Lesson 1 မှာ သင်လေ့လာခဲ့သလို Linear Regression ရဲ့ ရည်ရွယ်ချက်ကတော့ လိုင်းတစ်ခုကို plot လုပ်နိုင်ရန် ဖြစ်သည်။ + +- **Variable ဆက်နွယ်မှုများကို ပြသရန်**။ Variable များအကြား ဆက်နွယ်မှုကို ပြသရန် +- **ခန့်မှန်းချက်များ ပြုလုပ်ရန်**။ Datapoint အသစ်တစ်ခုကို လိုင်းနှင့် ဆက်နွယ်မှုအပေါ် အတိအကျ ခန့်မှန်းရန် + +**Least-Squares Regression** သုံးပြီး ဒီလိုင်းကို ရေးဆွဲသည်။ 'Least-squares' ဆိုတာက Regression လိုင်းကို ဝန်းရံထားသော datapoints များကို square လုပ်ပြီး ထည့်ပေါင်းခြင်းဖြစ်သည်။ အဆုံးသတ်ပေါင်းစုက အနည်းဆုံးဖြစ်ရမည်။ အမှားများနည်းသော `least-squares` ကို ရရှိရန် ဖြစ်သည်။ + +ဒါကို လုပ်ရတဲ့အကြောင်းကတော့ ဒေတာပွိုင့်များအားလုံးမှ cumulative distance အနည်းဆုံးဖြစ်သော လိုင်းတစ်ခုကို မော်ဒယ်ဖန်တီးလိုခြင်း ဖြစ်သည်။ ထို့အပြင် direction ကိုမဟုတ်ဘဲ magnitude ကိုသာ စိုးရိမ်သောကြောင့် term များကို square လုပ်ပြီး ထည့်ပေါင်းသည်။ + +> **🧮 သင်္ချာကို ပြပါ** +> +> ဒီလိုင်းကို _line of best fit_ ဟုခေါ်ပြီး [equation](https://en.wikipedia.org/wiki/Simple_linear_regression) ဖြင့် ဖော်ပြနိုင်သည်။ +> +> ``` +> Y = a + bX +> ``` +> +> `X` က 'explanatory variable' ဖြစ်သည်။ `Y` က 'dependent variable' ဖြစ်သည်။ လိုင်းရဲ့ slope ကို `b` ဟုခေါ်ပြီး y-intercept ကို `a` ဟုခေါ်သည်။ `X = 0` ဖြစ်သောအခါ `Y` ရဲ့တန်ဖိုးကို ရည်ညွှန်းသည်။ +> +>![calculate the slope](../../../../2-Regression/3-Linear/images/slope.png) +> +> ပထမဆုံး slope `b` ကိုတွက်ပါ။ Infographic by [Jen Looper](https://twitter.com/jenlooper) +> +> Pumpkin data ရဲ့ မူရင်းမေးခွန်းကို ရည်ညွှန်းပါက "month အပေါ်မူတည်ပြီး bushel တစ်ခုအတွက် Pumpkin စျေးနှုန်းကို ခန့်မှန်းပါ" ဆိုသည်မှာ `X` က စျေးနှုန်းကို ရည်ညွှန်းပြီး `Y` က ရောင်းချသောလကို ရည်ညွှန်းသည်။ +> +>![complete the equation](../../../../2-Regression/3-Linear/images/calculation.png) +> +> `Y` ရဲ့တန်ဖိုးကိုတွက်ပါ။ $4 ဝန်းကျင်ပေးရမယ်ဆိုရင် April ဖြစ်နေလိမ့်မယ်! Infographic by [Jen Looper](https://twitter.com/jenlooper) +> +> လိုင်းရဲ့ slope ကိုတွက်ရန် သင်္ချာက intercept ကိုလည်း အခြေခံထားသည်။ `X = 0` ဖြစ်သောအခါ `Y` ရဲ့တည်နေရာကိုလည်း ထည့်သွင်းတွက်ချက်ထားသည်။ +> +> ဒီတန်ဖိုးများရဲ့ လိုင်းကို ဘယ်လိုသတ်မှတ်ရမလဲဆိုတာကို [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) ဝဘ်ဆိုဒ်မှာ ကြည့်နိုင်သည်။ [Least-squares calculator](https://www.mathsisfun.com/data/least-squares-calculator.html) ကိုလည်း သုံးပြီး တန်ဖိုးများက လိုင်းကို ဘယ်လိုသက်ရောက်မှုရှိသလဲဆိုတာ ကြည့်နိုင်သည်။ + +## Correlation + +နောက်ထပ်နားလည်ရမည့် term တစ်ခုကတော့ **Correlation Coefficient** ဖြစ်သည်။ X နှင့် Y variable များအကြား scatterplot ကို အသုံးပြု၍ Coefficient ကို မြန်မြန်ဆန်ဆန် visualization လုပ်နိုင်သည်။ Datapoints များကို တိကျသောလိုင်းတစ်ခုအတိုင်း scatter လုပ်ထားသော plot တွင် correlation မြင့်မားသည်။ X နှင့် Y အကြား scatter လုပ်ထားသော plot တွင် correlation နည်းပါမည်။ + +Linear Regression မော်ဒယ်က correlation coefficient မြင့်မားသော (၁ နီးစပ်ပြီး ၀ မနီးစပ်သော) Least-Squares Regression method နှင့် regression line ရှိရမည်။ + +✅ ဒီသင်ခန်းစာရဲ့ notebook ကို run လုပ်ပြီး Month နှင့် Price scatterplot ကိုကြည့်ပါ။ Pumpkin ရောင်းချမှုအတွက် Month နှင့် Price data တွေဟာ scatterplot အရ correlation မြင့်မားသလား၊ နိမ့်နားသလားဆိုတာ သင့် visual interpretation အရ သတ်မှတ်ပါ။ `Month` အစား *day of the year* (နှစ်အစမှစ၍ ရက်ပေါင်း) ကို အသုံးပြုပါက အဲဒီ correlation က ပြောင်းလဲသလား? + +အောက်ပါ code မှာ သန့်စင်ပြီး data frame `new_pumpkins` ကို ရရှိထားသည်ဟု သတ်မှတ်ပါမည်။ အဲဒီ data frame က အောက်ပါအတိုင်းဖြစ်သည်။ + +ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price +---|-------|-----------|---------|------|---------|-----------|------------|------- +70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 +71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 +72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 +73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545 +74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 + +> ဒီ data ကို သန့်စင်ရန် code ကို [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb) တွင် ရရှိနိုင်သည်။ ယခင်သင်ခန်းစာတွင် လုပ်ခဲ့သည့် သန့်စင်ခြင်းအဆင့်များကို ပြုလုပ်ပြီး `DayOfYear` column ကို အောက်ပါ expression ကို အသုံးပြု၍ တွက်ချက်ထားသည်။ + +```python +day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days) +``` + +Linear Regression ရဲ့ သင်္ချာကို နားလည်ပြီးပြီဆိုရင် Pumpkin စျေးနှုန်းများကို ခန့်မှန်းနိုင်ရန် Regression မော်ဒယ်တစ်ခုကို ဖန်တီးကြည့်ရအောင်။ Holiday Pumpkin Patch အတွက် Pumpkin packages များကို optimize လုပ်ရန် ဝယ်ယူသူတစ်ဦးအတွက် ဒီအချက်အလက်များ အသုံးဝင်နိုင်ပါမည်။ + +## Correlation ရှာဖွေခြင်း + +[![ML for beginners - Looking for Correlation: The Key to Linear Regression](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "ML for beginners - Looking for Correlation: The Key to Linear Regression") + +> 🎥 Correlation ရဲ့ အကျဉ်းချုပ်ကို ကြည့်ရန် အထက်ပါပုံကို နှိပ်ပါ။ + +ယခင်သင်ခန်းစာမှ သင်မြင်ခဲ့သည်မှာ အမျိုးမျိုးသောလများအတွက် အလယ်ပျဉ်စျေးနှုန်းသည် အောက်ပါအတိုင်းဖြစ်သည်။ + +Average price by month + +ဒါက correlation ရှိနိုင်သည်ဟု အကြံပြုသည်။ Linear Regression မော်ဒယ်ကို `Month` နှင့် `Price` အကြား သို့မဟုတ် `DayOfYear` နှင့် `Price` အကြား ဆက်နွယ်မှုကို ခန့်မှန်းရန် လေ့ကျင့်ကြည့်နိုင်သည်။ အောက်ပါ scatter plot က `DayOfYear` နှင့် `Price` အကြား ဆက်နွယ်မှုကို ပြသည်။ + +Scatter plot of Price vs. Day of Year + +`corr` function ကို အသုံးပြု၍ correlation ရှိမရှိ ကြည့်ရအောင်။ + +```python +print(new_pumpkins['Month'].corr(new_pumpkins['Price'])) +print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price'])) +``` + +`Month` အပေါ် correlation က -0.15 ဖြစ်ပြီး `DayOfYear` အပေါ် correlation က -0.17 ဖြစ်သည်။ ဒါပေမယ့် အခြားသော ဆက်နွယ်မှုတစ်ခုရှိနိုင်သည်။ Pumpkin အမျိုးအစားများနှင့် ဆက်နွယ်မှုရှိသည်ဟု ထင်ရသည်။ ဒီ hypothesis ကို အတည်ပြုရန် Pumpkin အမျိုးအစားတစ်ခုစီကို အရောင်ကွဲကွဲဖြင့် plot လုပ်ကြည့်ရအောင်။ `scatter` plotting function မှ `ax` parameter ကို အသုံးပြု၍ point အားလုံးကို graph တစ်ခုအပေါ် plot လုပ်နိုင်သည်။ + +```python +ax=None +colors = ['red','blue','green','yellow'] +for i,var in enumerate(new_pumpkins['Variety'].unique()): + df = new_pumpkins[new_pumpkins['Variety']==var] + ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var) +``` + +Scatter plot of Price vs. Day of Year + +ကျွန်ုပ်တို့ရဲ့ စုံစမ်းမှုက variety က စျေးနှုန်းအပေါ် date ထက် ပိုမိုသက်ရောက်မှုရှိသည်ဟု အတည်ပြုသည်။ Bar graph ဖြင့်လည်း မြင်နိုင်သည်။ + +```python +new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar') +``` + +Bar graph of price vs variety + +ယခုအချိန်မှာ 'pie type' ဟုခေါ်သော Pumpkin အမျိုးအစားတစ်ခုကိုသာ အာရုံစိုက်ပြီး date ရဲ့ စျေးနှုန်းအပေါ် သက်ရောက်မှုကို ကြည့်ရအောင်။ + +```python +pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE'] +pie_pumpkins.plot.scatter('DayOfYear','Price') +``` +Scatter plot of Price vs. Day of Year + +`corr` function ကို အသုံးပြု၍ `Price` နှင့် `DayOfYear` အကြား correlation ကို တွက်ချက်ပါက `-0.27` ရရှိမည် - ဒါက predictive model တစ်ခုကို လေ့ကျင့်ခြင်း make sense ဖြစ်သည်ဟု ဆိုလိုသည်။ + +> Linear Regression မော်ဒယ်ကို လေ့ကျင့်မည်ဆိုရင် ဒေတာကို သန့်စင်ထားရန် အရေးကြီးသည်။ Linear Regression က missing values များနှင့် အလုပ်မလုပ်သင့်သောကြောင့် အလွတ်နေသော cell များကို ဖယ်ရှားရန် make sense ဖြစ်သည်။ + +```python +pie_pumpkins.dropna(inplace=True) +pie_pumpkins.info() +``` + +အခြားနည်းလမ်းတစ်ခုကတော့ အလွတ်နေသော value များကို column တစ်ခုစီမှ mean value များဖြင့် ဖြည့်ရန် ဖြစ်သည်။ + +## Simple Linear Regression + +[![ML for beginners - Linear and Polynomial Regression using Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "ML for beginners - Linear and Polynomial Regression using Scikit-learn") + +> 🎥 Linear Regression နှင့် Polynomial Regression ရဲ့ အကျဉ်းချုပ်ကို ကြည့်ရန် အထက်ပါပုံကို နှိပ်ပါ။ + +Linear Regression မော်ဒယ်ကို လေ့ကျင့်ရန် **Scikit-learn** library ကို အသုံးပြုပါမည်။ + +```python +from sklearn.linear_model import LinearRegression +from sklearn.metrics import mean_squared_error +from sklearn.model_selection import train_test_split +``` + +ပထမဆုံး input values (features) နှင့် ရလဒ် output (label) ကို numpy arrays သို့ ခွဲခြားပါ: + +```python +X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1) +y = pie_pumpkins['Price'] +``` + +> Linear Regression package ကို မှန်ကန်စွာ နားလည်စေရန် input data ကို `reshape` ပြုလုပ်ရန် လိုအပ်သည်။ Linear Regression က input အဖြစ် 2D-array ကို မျှော်မှန်းသည်။ အဲဒီ array ရဲ့ row တစ်ခုစီက input features ရဲ့ vector ကို ကိုယ်စားပြုသည်။ ကျွန်ုပ်တို့ရဲ့အခြေအနေမှာ input တစ်ခုသာရှိသောကြောင့် N×1 အရွယ်အစားရှိသော array တစ်ခုလိုအပ်သည်။ N က dataset size ဖြစ်သည်။ + +ထို့နောက် train dataset နှင့် test dataset များသို့ data ကို ခွဲခြားရန် လိုအပ်သည်။ ဒါက training ပြီးနောက် မော်ဒယ်ကို validate လုပ်နိုင်ရန် ဖြစ်သည်။ + +```python +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) +``` + +နောက်ဆုံးမှာ Linear Regression မော်ဒယ်ကို training လုပ်ရန် code ၂ လိုင်းသာ လိုအပ်သည်။ `Linear +ကျွန်တော်တို့ရဲ့အမှားဟာ ၂ ခုလောက်မှာရှိပြီး၊ ~17% လောက်ဖြစ်ပါတယ်။ အတော်လေးမကောင်းပါဘူး။ မော်ဒယ်ရဲ့အရည်အသွေးကိုပြသနိုင်တဲ့အခြားအချက်တစ်ခုက **coefficient of determination** ဖြစ်ပြီး၊ ဒီလိုရနိုင်ပါတယ်။ + +```python +score = lin_reg.score(X_train,y_train) +print('Model determination: ', score) +``` +တန်ဖိုးက 0 ဖြစ်ရင်၊ မော်ဒယ်က input data ကိုမထည့်သွင်းစဉ်းစားဘဲ၊ *အဆိုးဆုံး linear predictor* ဖြစ်ပြီး၊ ရလဒ်ရဲ့ပျမ်းမျှတန်ဖိုးကိုသာပြသပါတယ်။ တန်ဖိုးက 1 ဖြစ်ရင်၊ မျှော်မှန်းထားတဲ့ output အားလုံးကိုတိကျစွာခန့်မှန်းနိုင်ပါတယ်။ ကျွန်တော်တို့ရဲ့အခြေအနေမှာ coefficient က 0.06 လောက်ရှိပြီး၊ အတော်လေးနိမ့်ပါတယ်။ + +ကျွန်တော်တို့ test data ကို regression line နဲ့အတူ plot လုပ်ပြီး၊ regression ကကျွန်တော်တို့အခြေအနေမှာဘယ်လိုအလုပ်လုပ်သလဲဆိုတာပိုမိုမြင်နိုင်ပါတယ်။ + +```python +plt.scatter(X_test,y_test) +plt.plot(X_test,pred) +``` + +Linear regression + +## Polynomial Regression + +Linear Regression ရဲ့အခြားအမျိုးအစားတစ်ခုက Polynomial Regression ဖြစ်ပါတယ်။ တစ်ခါတစ်လေ variable တွေကြား linear relationship ရှိနိုင်ပေမယ့် - ဥပမာ၊ ဖရဲသီးရဲ့အရွယ်အစားကြီးလာတာနဲ့အမျှ၊ စျေးနှုန်းမြင့်လာတာ - တစ်ခါတစ်လေ relationship တွေကို plane သို့မဟုတ်တည့်တည့်လိုင်းအဖြစ် plot လုပ်လို့မရနိုင်ပါဘူး။ + +✅ [ဒီမှာ](https://online.stat.psu.edu/stat501/lesson/9/9.8) Polynomial Regression အသုံးပြုနိုင်တဲ့ data အမျိုးအစားအချို့ကိုကြည့်ပါ။ + +Date နဲ့ Price ကြားက relationship ကိုထပ်ကြည့်ပါ။ ဒီ scatterplot ကိုတည့်တည့်လိုင်းနဲ့ခန့်မှန်းသင့်တယ်လို့ထင်ပါသလား။ စျေးနှုန်းတွေကအတက်အကျဖြစ်နိုင်တာမဟုတ်လား။ ဒီအခြေအနေမှာ Polynomial Regression ကိုစမ်းကြည့်နိုင်ပါတယ်။ + +✅ Polynomial တွေက variable တစ်ခုသို့မဟုတ်အများကြီးနဲ့ coefficient တွေပါဝင်နိုင်တဲ့ mathematical expression တွေဖြစ်ပါတယ်။ + +Polynomial regression က nonlinear data ကိုပိုမိုတည့်တည့်အောင် curve လိုင်းတစ်ခုဖန်တီးပါတယ်။ ကျွန်တော်တို့အခြေအနေမှာ `DayOfYear` variable ကို input data ထဲမှာ squared အဖြစ်ထည့်သွင်းရင်၊ parabolic curve တစ်ခုနဲ့ data ကို fit လုပ်နိုင်ပြီး၊ curve ရဲ့အနိမ့်ဆုံးအချက်ကိုနှစ်တစ်နှစ်အတွင်းတစ်နေရာမှာရရှိနိုင်ပါမယ်။ + +Scikit-learn မှာ data processing ရဲ့အဆင့်အမျိုးမျိုးကိုပေါင်းစည်းဖို့အတွက်အသုံးဝင်တဲ့ [pipeline API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) ပါဝင်ပါတယ်။ **pipeline** က **estimators** တွေရဲ့ chain ဖြစ်ပါတယ်။ ကျွန်တော်တို့အခြေအနေမှာ၊ မော်ဒယ်ကို polynomial features တွေထည့်သွင်းပြီး၊ regression ကို training လုပ်တဲ့ pipeline တစ်ခုဖန်တီးပါမယ်။ + +```python +from sklearn.preprocessing import PolynomialFeatures +from sklearn.pipeline import make_pipeline + +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) + +pipeline.fit(X_train,y_train) +``` + +`PolynomialFeatures(2)` ကိုအသုံးပြုခြင်းက input data ထဲက second-degree polynomials အားလုံးကိုထည့်သွင်းပါမယ်။ ကျွန်တော်တို့အခြေအနေမှာ `DayOfYear`2 ဖြစ်ပြီး၊ input variable X နဲ့ Y နှစ်ခုရှိရင်၊ X2, XY နဲ့ Y2 ကိုထည့်သွင်းပါမယ်။ ပိုမြင့်တဲ့ degree polynomials တွေကိုအသုံးပြုချင်ရင်လည်းရပါတယ်။ + +Pipelines တွေကို original `LinearRegression` object နဲ့တူညီတဲ့နည်းလမ်းနဲ့အသုံးပြုနိုင်ပြီး၊ pipeline ကို `fit` လုပ်ပြီး၊ `predict` ကိုအသုံးပြုပြီး prediction results ရနိုင်ပါတယ်။ ဒီမှာ test data နဲ့ approximation curve ကိုပြသထားပါတယ်။ + +Polynomial regression + +Polynomial Regression ကိုအသုံးပြုပြီး MSE နည်းပြီး determination မြင့်တက်နိုင်ပေမယ့်၊ အတော်လေးမထူးခြားပါဘူး။ အခြား feature တွေကိုလည်းထည့်သွင်းစဉ်းစားဖို့လိုအပ်ပါတယ်။ + +> ဖရဲသီးစျေးနှုန်းအနိမ့်ဆုံးက Halloween အနီးမှာတွေ့ရတာကိုဘယ်လိုရှင်းပြနိုင်မလဲ? + +🎃 အားလုံးကိုဂုဏ်ပြုပါတယ်၊ pie ဖရဲသီးရဲ့စျေးနှုန်းကိုခန့်မှန်းနိုင်တဲ့မော်ဒယ်တစ်ခုဖန်တီးနိုင်ခဲ့ပါပြီ။ ဖရဲသီးအမျိုးအစားအားလုံးအတွက်တူညီတဲ့နည်းလမ်းကိုအသုံးပြုနိုင်ပေမယ့်၊ အတော်လေးအလုပ်ရှုပ်ပါတယ်။ အခုတော့ဖရဲသီးအမျိုးအစားကိုမော်ဒယ်ထဲမှာထည့်သွင်းစဉ်းစားနည်းကိုလေ့လာကြပါစို့! + +## Categorical Features + +အကောင်းဆုံးအခြေအနေမှာ၊ ဖရဲသီးအမျိုးအစားအမျိုးမျိုးအတွက်တူညီတဲ့မော်ဒယ်ကိုအသုံးပြုပြီးစျေးနှုန်းကိုခန့်မှန်းနိုင်ချင်ပါတယ်။ သို့သော် `Variety` column က `Month` ကဲ့သို့ numeric value မပါဝင်ပါဘူး။ ဒီလို column တွေကို **categorical** လို့ခေါ်ပါတယ်။ + +[![ML for beginners - Categorical Feature Predictions with Linear Regression](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression") + +> 🎥 အထက်ကပုံကိုနှိပ်ပြီး categorical features အသုံးပြုနည်းအကျဉ်းချုပ်ဗီဒီယိုကိုကြည့်ပါ။ + +ဒီမှာ variety အပေါ်မူတည်ပြီးပျမ်းမျှစျေးနှုန်းကိုမြင်နိုင်ပါတယ်။ + +Average price by variety + +Variety ကိုစဉ်းစားဖို့အတွက်၊ variety ကို numeric form သို့မဟုတ် **encode** လုပ်ဖို့လိုအပ်ပါတယ်။ encode လုပ်နည်းအမျိုးမျိုးရှိပါတယ်- + +* **Numeric encoding** က variety အမျိုးအစားတွေကို table တစ်ခုထဲမှာတည်ဆောက်ပြီး၊ variety နာမည်ကို table ထဲက index နဲ့အစားထိုးပါမယ်။ ဒါဟာ linear regression အတွက်အကောင်းဆုံးနည်းလမ်းမဟုတ်ပါဘူး၊ အကြောင်းက linear regression က index ရဲ့ actual numeric value ကိုယူပြီး၊ coefficient တစ်ခုနဲ့မြှောက်ပြီးရလဒ်ထဲထည့်သွင်းပါတယ်။ ကျွန်တော်တို့အခြေအနေမှာ index နံပါတ်နဲ့စျေးနှုန်းကြားက relationship က non-linear ဖြစ်ပါတယ်၊ indices တွေကိုအတိအကျစီစဉ်ထားတယ်ဆိုရင်တောင်ပါ။ +* **One-hot encoding** က `Variety` column ကို variety တစ်ခုစီအတွက် column ၄ ခုနဲ့အစားထိုးပါမယ်။ တစ်ခုချင်းစီ column မှာ၊ row တစ်ခုဟာအတိအကျ variety တစ်ခုဖြစ်ရင် `1` ပါမယ်၊ မဟုတ်ရင် `0` ပါမယ်။ ဒါက linear regression မှာ variety တစ်ခုချင်းစီအတွက် coefficient ၄ ခုပါဝင်ပြီး၊ အဲဒီ variety အတွက် "starting price" (သို့မဟုတ် "additional price") ကိုတာဝန်ယူပါမယ်။ + +Variety ကို one-hot encode လုပ်နည်းကိုအောက်မှာပြထားပါတယ်- + +```python +pd.get_dummies(new_pumpkins['Variety']) +``` + + ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE +----|-----------|-----------|--------------------------|---------- +70 | 0 | 0 | 0 | 1 +71 | 0 | 0 | 0 | 1 +... | ... | ... | ... | ... +1738 | 0 | 1 | 0 | 0 +1739 | 0 | 1 | 0 | 0 +1740 | 0 | 1 | 0 | 0 +1741 | 0 | 1 | 0 | 0 +1742 | 0 | 1 | 0 | 0 + +One-hot encoded variety ကို input အဖြစ်အသုံးပြုပြီး linear regression ကို training လုပ်ဖို့အတွက်၊ `X` နဲ့ `y` data ကိုမှန်ကန်စွာ initialize လုပ်ဖို့လိုအပ်ပါတယ်- + +```python +X = pd.get_dummies(new_pumpkins['Variety']) +y = new_pumpkins['Price'] +``` + +အပေါ်မှာ Linear Regression ကို training လုပ်ဖို့အသုံးပြုတဲ့ code နဲ့အတူတူပါပဲ။ စမ်းကြည့်ရင်၊ mean squared error ကအတော်လေးတူတူပါပေမယ့်၊ coefficient of determination (~77%) ကပိုမြင့်တက်ပါတယ်။ ပိုမိုတိကျတဲ့ခန့်မှန်းချက်ရဖို့အတွက်၊ categorical features တွေ၊ နဲ့ numeric features တွေဖြစ်တဲ့ `Month` သို့မဟုတ် `DayOfYear` ကိုထည့်သွင်းစဉ်းစားနိုင်ပါတယ်။ feature တွေကိုတစ်စုတစ်စည်းအဖြစ်ရဖို့ `join` ကိုအသုံးပြုနိုင်ပါတယ်- + +```python +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] +``` + +ဒီမှာ `City` နဲ့ `Package` type ကိုလည်းထည့်သွင်းထားပြီး၊ MSE 2.84 (10%) နဲ့ determination 0.94 ရရှိပါတယ်! + +## Putting it all together + +အကောင်းဆုံးမော်ဒယ်ကိုဖန်တီးဖို့အတွက်၊ အပေါ်ကဥပမာထဲက combined (one-hot encoded categorical + numeric) data ကို Polynomial Regression နဲ့အတူအသုံးပြုနိုင်ပါတယ်။ အောက်မှာအပြည့်အစုံ code ကိုပြထားပါတယ်- + +```python +# set up training data +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] + +# make train-test split +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + +# setup and train the pipeline +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) +pipeline.fit(X_train,y_train) + +# predict results for test data +pred = pipeline.predict(X_test) + +# calculate MSE and determination +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') + +score = pipeline.score(X_train,y_train) +print('Model determination: ', score) +``` + +ဒီနည်းလမ်းက determination coefficient 97% နီးပါးနဲ့ MSE=2.23 (~8% prediction error) ရရှိစေပါမယ်။ + +| Model | MSE | Determination | +|-------|-----|---------------| +| `DayOfYear` Linear | 2.77 (17.2%) | 0.07 | +| `DayOfYear` Polynomial | 2.73 (17.0%) | 0.08 | +| `Variety` Linear | 5.24 (19.7%) | 0.77 | +| All features Linear | 2.84 (10.5%) | 0.94 | +| All features Polynomial | 2.23 (8.25%) | 0.97 | + +🏆 အားလုံးကိုဂုဏ်ပြုပါတယ်! Regression models ၄ ခုကိုတစ်ခန်းတည်းမှာဖန်တီးပြီး၊ မော်ဒယ်ရဲ့အရည်အသွေးကို 97% အထိတိုးတက်စေခဲ့ပါတယ်။ Regression ရဲ့နောက်ဆုံးအပိုင်းမှာ၊ category တွေကိုသတ်မှတ်ဖို့ Logistic Regression ကိုလေ့လာပါမယ်။ + +--- + +## 🚀Challenge + +ဒီ notebook ထဲမှာ variable အမျိုးမျိုးကိုစမ်းကြည့်ပြီး၊ correlation နဲ့ model accuracy ကြားကဆက်နွယ်မှုကိုကြည့်ပါ။ + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Review & Self Study + +ဒီခန်းမှာ Linear Regression ကိုလေ့လာခဲ့ပါတယ်။ Regression ရဲ့အရေးကြီးတဲ့အမျိုးအစားအခြားများလည်းရှိပါတယ်။ Stepwise, Ridge, Lasso နဲ့ Elasticnet techniques တွေကိုဖတ်ရှုပါ။ ပိုမိုလေ့လာချင်ရင် [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning) ကိုလေ့လာပါ။ + +## Assignment + +[Build a Model](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/3-Linear/assignment.md b/translations/my/2-Regression/3-Linear/assignment.md new file mode 100644 index 00000000..49b88e02 --- /dev/null +++ b/translations/my/2-Regression/3-Linear/assignment.md @@ -0,0 +1,25 @@ + +# ရှုထောင့်မော်ဒယ်တစ်ခု ဖန်တီးခြင်း + +## လမ်းညွှန်ချက်များ + +ဒီသင်ခန်းစာမှာ Linear Regression နဲ့ Polynomial Regression နှစ်မျိုးလုံးကို အသုံးပြုပြီး မော်ဒယ်တစ်ခု ဖန်တီးပုံကို ပြသထားပါတယ်။ ဒီအတန်းမှာ သင်ယူခဲ့တဲ့ အတတ်ပညာကို အသုံးပြုပြီး dataset တစ်ခု ရှာပါ၊ ဒါမှမဟုတ် Scikit-learn ရဲ့ built-in sets တစ်ခုကို အသုံးပြုပါ။ မော်ဒယ်အသစ်တစ်ခု ဖန်တီးပြီး သင် notebook မှာ ဘာကြောင့် ဒီနည်းလမ်းကို ရွေးချယ်ခဲ့တာလဲဆိုတာ ရှင်းပြပါ။ မော်ဒယ်ရဲ့ တိကျမှုကို သက်သေပြပါ။ တိကျမှုမရှိပါက ဘာကြောင့်ဆိုတာ ရှင်းပြပါ။ + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| --------- | ---------------------------------------------------------- | -------------------------- | ------------------------------- | +| | notebook တစ်ခုကို ပြည့်စုံစွာ ဖော်ပြပြီး ဖြေရှင်းချက်ကို ကောင်းမွန်စွာ မှတ်တမ်းတင်ထားသည် | ဖြေရှင်းချက်မှာ မပြည့်စုံပါ | ဖြေရှင်းချက်မှာ အမှားများ သို့မဟုတ် bug ရှိသည် | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/3-Linear/solution/Julia/README.md b/translations/my/2-Regression/3-Linear/solution/Julia/README.md new file mode 100644 index 00000000..424c6397 --- /dev/null +++ b/translations/my/2-Regression/3-Linear/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားယူမှုမှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/4-Logistic/README.md b/translations/my/2-Regression/4-Logistic/README.md new file mode 100644 index 00000000..23b6313a --- /dev/null +++ b/translations/my/2-Regression/4-Logistic/README.md @@ -0,0 +1,405 @@ + +# Logistic regression ဖြင့် အမျိုးအစားများခန့်မှန်းခြင်း + +![Logistic vs. linear regression infographic](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png) + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +> ### [ဒီသင်ခန်းစာကို R မှာလည်းရနိုင်ပါတယ်!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html) + +## အကျဉ်းချုပ် + +Regression အပေါ် သင်ခန်းစာများ၏ နောက်ဆုံးပိုင်းတွင်, _classic_ ML နည်းလမ်းများထဲမှ တစ်ခုဖြစ်သော Logistic Regression ကို လေ့လာပါမည်။ Binary အမျိုးအစားများကို ခန့်မှန်းရန် ပုံစံများကို ရှာဖွေဖို့ ဒီနည်းလမ်းကို သုံးနိုင်ပါတယ်။ ဥပမာ - ဒီချောကလက်က ချောကလက်လား မဟုတ်ဘူးလား? ဒီရောဂါက ကူးစက်နိုင်လား မဟုတ်ဘူးလား? ဒီဖောက်သည်က ဒီထုတ်ကုန်ကို ရွေးချယ်မလား မဟုတ်ဘူးလား? + +ဒီသင်ခန်းစာတွင် သင်လေ့လာရမည့်အရာများမှာ: + +- ဒေတာကို မြင်သာစေဖို့ အသစ်သော library +- Logistic regression နည်းလမ်းများ + +✅ ဒီ [Learn module](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott) မှာ ဒီ regression အမျိုးအစားကို ပိုမိုနားလည်စေပါ။ + +## ကြိုတင်လိုအပ်ချက် + +Pumpkin data ကို အသုံးပြုပြီးနောက်, `Color` ဆိုတဲ့ binary အမျိုးအစားကို လုပ်ဆောင်နိုင်မယ်ဆိုတာ နားလည်လာပါပြီ။ + +အဲဒီအမျိုးအစားကို ခန့်မှန်းဖို့ Logistic regression model တစ်ခု တည်ဆောက်ကြမယ်။ _ပုံမှန်အားဖြင့် ဖရဲသီးရဲ့ အရောင်က ဘယ်လိုဖြစ်နိုင်မလဲ_ (လိမ္မော်ရောင် 🎃 သို့မဟုတ် အဖြူရောင် 👻) ဆိုတာကို ခန့်မှန်းပါမည်။ + +> Regression အပေါ် သင်ခန်းစာတွင် Binary classification ကို ဘာကြောင့် ထည့်သွင်းပြောဆိုနေရတာလဲ? ဒါဟာ စကားလုံးအသုံးအနှုန်းအဆင်ပြေမှုအတွက်သာဖြစ်ပြီး Logistic regression က [အမှန်တကယ်တော့ classification နည်းလမ်း](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression) ဖြစ်ပါတယ်။ Linear-based classification ဖြစ်ပေမယ့်, ဒေတာကို အခြားနည်းလမ်းများဖြင့် classify လုပ်နည်းကို နောက်သင်ခန်းစာတွင် လေ့လာပါမည်။ + +## မေးခွန်းကို သတ်မှတ်ပါ + +ဒီအတွက်, 'White' သို့မဟုတ် 'Not White' ဆိုတဲ့ binary အနေနဲ့ ဖော်ပြပါမည်။ Dataset မှာ 'striped' ဆိုတဲ့ အမျိုးအစားလည်း ပါဝင်ပေမယ့်, အဲဒီအမျိုးအစားက နည်းနည်းပဲရှိတာကြောင့် မသုံးပါဘူး။ Null values တွေကို ဖယ်ရှားလိုက်တဲ့အခါ, အဲဒီအမျိုးအစားက dataset မှာ မပါတော့ပါဘူး။ + +> 🎃 စိတ်ဝင်စားစရာကောင်းတဲ့ အချက် - အဖြူရောင်ဖရဲသီးတွေကို 'ghost' ဖရဲသီးတွေ လို့ခေါ်တတ်ကြပါတယ်။ အဲဒီဖရဲသီးတွေကို ပုံဖော်ဖို့ မလွယ်ကူလို့, လိမ္မော်ရောင်ဖရဲသီးတွေလို လူကြိုက်များတာမဟုတ်ပေမယ့်, အလှတရားရှိပါတယ်! ဒါကြောင့်, မေးခွန်းကို 'Ghost' သို့မဟုတ် 'Not Ghost' 👻 လို့ ပြန်ဖော်ပြနိုင်ပါတယ်။ + +## Logistic regression အကြောင်း + +Logistic regression က Linear regression နဲ့ အရေးကြီးတဲ့ အချက်အချို့မှာ ကွဲပြားပါတယ်။ + +[![ML for beginners - Understanding Logistic Regression for Machine Learning Classification](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "ML for beginners - Understanding Logistic Regression for Machine Learning Classification") + +> 🎥 Logistic regression အကြောင်း အကျဉ်းချုပ်ဗီဒီယိုကို ကြည့်ရန် အထက်ပါပုံကို နှိပ်ပါ။ + +### Binary classification + +Logistic regression က Linear regression နဲ့ တူညီတဲ့ feature များ မပေးပါဘူး။ Logistic regression က binary အမျိုးအစား ("white or not white") ကို ခန့်မှန်းနိုင်သလို, Linear regression ကတော့ ဆက်လက်တိုးတက်နေတဲ့ အချက်အလက်များကို ခန့်မှန်းနိုင်ပါတယ်။ ဥပမာ - ဖရဲသီးရဲ့ မူလနေရာနဲ့ ခူးဆွတ်ချိန်အပေါ် မူတည်ပြီး _ဈေးနှုန်းဘယ်လောက်တက်မလဲ_ ဆိုတာကို ခန့်မှန်းနိုင်ပါတယ်။ + +![Pumpkin classification Model](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png) +> Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) + +### အခြား classification များ + +Logistic regression ရဲ့ အခြားအမျိုးအစားများလည်း ရှိပါတယ်၊ Multinomial နဲ့ Ordinal အပါအဝင်: + +- **Multinomial** - အမျိုးအစားများစွာ ပါဝင်သောအခါ ("Orange, White, and Striped"). +- **Ordinal** - အမျိုးအစားများကို အစီအစဉ်အလိုက် စီရင်သောအခါ, ဥပမာ - ဖရဲသီးများကို အရွယ်အစား (mini, sm, med, lg, xl, xxl) အလိုက် စီရင်ခြင်း။ + +![Multinomial vs ordinal regression](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png) + +### Variables များ correlation မလိုအပ်ပါ + +Linear regression က correlation များရှိတဲ့ variables တွေကို ပိုကောင်းစွာ အလုပ်လုပ်နိုင်ပါတယ်။ Logistic regression ကတော့ ဆန့်ကျင်ဘက်ဖြစ်ပြီး - variables တွေ alignment မလိုအပ်ပါဘူး။ ဒါက correlation များအားနည်းတဲ့ ဒီဒေတာအတွက် အဆင်ပြေပါတယ်။ + +### သန့်ရှင်းတဲ့ ဒေတာများ များများလိုအပ်ပါတယ် + +Logistic regression က ဒေတာများ များများသုံးရင် ပိုမိုတိကျတဲ့ ရလဒ်တွေ ပေးနိုင်ပါတယ်။ ကျွန်တော်တို့ dataset က သေးငယ်တဲ့အတွက်, ဒီ task အတွက် အကောင်းဆုံးမဟုတ်ပါဘူး၊ ဒါကို သတိထားပါ။ + +[![ML for beginners - Data Analysis and Preparation for Logistic Regression](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "ML for beginners - Data Analysis and Preparation for Logistic Regression") + +> 🎥 Linear regression အတွက် ဒေတာကို ပြင်ဆင်ခြင်းအကြောင်း အကျဉ်းချုပ်ဗီဒီယိုကို ကြည့်ရန် အထက်ပါပုံကို နှိပ်ပါ။ + +✅ Logistic regression အတွက် သင့်လျော်တဲ့ ဒေတာအမျိုးအစားများကို စဉ်းစားပါ + +## လေ့ကျင့်ခန်း - ဒေတာကို tidy လုပ်ပါ + +ပထမဦးဆုံး, null values တွေကို ဖယ်ရှားပြီး column အချို့ကိုသာ ရွေးချယ်ပါ: + +1. အောက်ပါ code ကို ထည့်ပါ: + + ```python + + columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] + pumpkins = full_pumpkins.loc[:, columns_to_select] + + pumpkins.dropna(inplace=True) + ``` + + သင့် dataframe အသစ်ကို အမြဲကြည့်ရှုနိုင်ပါတယ်: + + ```python + pumpkins.info + ``` + +### Visualization - categorical plot + +Starter notebook [starter notebook](../../../../2-Regression/4-Logistic/notebook.ipynb) ကို pumpkin data နဲ့ ပြန်တင်ပြီး, `Color` အပါအဝင် variables အချို့ကို ထိန်းသိမ်းထားတဲ့ dataset ကို သန့်စင်ပြီးဖြစ်ပါပြီ။ Notebook မှာ dataframe ကို visualized လုပ်ဖို့ Seaborn [Seaborn](https://seaborn.pydata.org/index.html) ဆိုတဲ့ library အသစ်ကို အသုံးပြုပါမည်။ + +Seaborn က ဒေတာကို visualized လုပ်ဖို့ အဆင်ပြေတဲ့ နည်းလမ်းများ ပေးပါတယ်။ ဥပမာ - `Variety` နဲ့ `Color` တို့ရဲ့ distribution ကို categorical plot မှာ နှိုင်းယှဉ်နိုင်ပါတယ်။ + +1. Pumpkin data `pumpkins` ကို အသုံးပြုပြီး, ဖရဲသီး category (orange or white) တစ်ခုစီအတွက် အရောင် mapping ကို သတ်မှတ်ပြီး `catplot` function ကို အသုံးပြုပါ: + + ```python + import seaborn as sns + + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + + sns.catplot( + data=pumpkins, y="Variety", hue="Color", kind="count", + palette=palette, + ) + ``` + + ![A grid of visualized data](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png) + + ဒေတာကို ကြည့်ရှုခြင်းအားဖြင့်, Color data က Variety နဲ့ ဘယ်လိုဆက်စပ်နေသလဲဆိုတာကို တွေ့နိုင်ပါတယ်။ + + ✅ ဒီ categorical plot ကို ကြည့်ပြီး, စိတ်ဝင်စားစရာ အခြေခံအချက်များကို စဉ်းစားပါ + +### Data pre-processing: feature and label encoding +Pumpkins dataset မှာ column အားလုံး string values ပါဝင်ပါတယ်။ Categorical data ကို လူတွေ အလွယ်တကူ နားလည်နိုင်ပေမယ့်, machine learning algorithms တွေကတော့ numbers နဲ့ ပိုကောင်းစွာ အလုပ်လုပ်နိုင်ပါတယ်။ ဒါကြောင့် encoding က data pre-processing အဆင့်မှာ အရေးကြီးတဲ့ အဆင့်ဖြစ်ပါတယ်။ ဒါက categorical data ကို numerical data အဖြစ် ပြောင်းနိုင်စေပြီး, အချက်အလက်မဆုံးရှုံးစေပါဘူး။ ကောင်းမွန်တဲ့ encoding က ကောင်းမွန်တဲ့ model တည်ဆောက်နိုင်စေပါတယ်။ + +Feature encoding အတွက် အဓိက encoder အမျိုးအစားနှစ်မျိုးရှိပါတယ်: + +1. Ordinal encoder: Ordinal variables အတွက် သင့်လျော်ပါတယ်။ Ordinal variables ဆိုတာ logical ordering ရှိတဲ့ categorical variables ဖြစ်ပါတယ်။ ဥပမာ - dataset ရဲ့ `Item Size` column. Ordinal encoder က mapping တစ်ခု ဖန်တီးပြီး, category တစ်ခုစီကို column ရဲ့ အစီအစဉ်အလိုက် နံပါတ်တစ်ခုဖြင့် ကိုယ်စားပြုပါတယ်။ + + ```python + from sklearn.preprocessing import OrdinalEncoder + + item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']] + ordinal_features = ['Item Size'] + ordinal_encoder = OrdinalEncoder(categories=item_size_categories) + ``` + +2. Categorical encoder: Nominal variables အတွက် သင့်လျော်ပါတယ်။ Nominal variables ဆိုတာ logical ordering မရှိတဲ့ categorical variables ဖြစ်ပါတယ်။ One-hot encoding ဖြစ်ပြီး, category တစ်ခုစီကို binary column ဖြင့် ကိုယ်စားပြုပါတယ်။ Encoded variable က ဖရဲသီးက အဲဒီ Variety ကိုယ်စားပြုရင် 1 ဖြစ်ပြီး, မဟုတ်ရင် 0 ဖြစ်ပါတယ်။ + + ```python + from sklearn.preprocessing import OneHotEncoder + + categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] + categorical_encoder = OneHotEncoder(sparse_output=False) + ``` +ပြီးနောက်, `ColumnTransformer` ကို အသုံးပြုပြီး, encoder များစွာကို တစ်ခုတည်းသောအဆင့်အဖြစ် ပေါင်းစည်းပြီး သင့် columns များကို အကျိုးသက်ရောက်စေပါမည်။ + +```python + from sklearn.compose import ColumnTransformer + + ct = ColumnTransformer(transformers=[ + ('ord', ordinal_encoder, ordinal_features), + ('cat', categorical_encoder, categorical_features) + ]) + + ct.set_output(transform='pandas') + encoded_features = ct.fit_transform(pumpkins) +``` +Label ကို encode လုပ်ဖို့, scikit-learn ရဲ့ `LabelEncoder` class ကို အသုံးပြုပါမည်။ LabelEncoder က labels တွေကို normalize လုပ်ပြီး, 0 နဲ့ n_classes-1 (ဒီမှာ 0 နဲ့ 1) အကြားရှိတဲ့ values တွေကိုသာ ပါဝင်စေပါတယ်။ + +```python + from sklearn.preprocessing import LabelEncoder + + label_encoder = LabelEncoder() + encoded_label = label_encoder.fit_transform(pumpkins['Color']) +``` +Features နဲ့ label ကို encode လုပ်ပြီးနောက်, `encoded_pumpkins` ဆိုတဲ့ dataframe အသစ်တစ်ခုအဖြစ် ပေါင်းစည်းနိုင်ပါတယ်။ + +```python + encoded_pumpkins = encoded_features.assign(Color=encoded_label) +``` +✅ `Item Size` column အတွက် ordinal encoder ကို အသုံးပြုခြင်းရဲ့ အကျိုးကျေးဇူးများက ဘာတွေလဲ? + +### Variables များအကြား ဆက်နွယ်မှုများကို ချဉ်းကပ်ပါ + +Data pre-processing ပြီးနောက်, features နဲ့ label အကြား ဆက်နွယ်မှုများကို ချဉ်းကပ်နိုင်ပါပြီ။ Model က features တွေကို အသုံးပြုပြီး label ကို ခန့်မှန်းနိုင်မယ့် အခြေအနေကို နားလည်ရန်, ဒေတာကို plot လုပ်ခြင်းက အကောင်းဆုံးနည်းလမ်းဖြစ်ပါတယ်။ Seaborn ရဲ့ `catplot` function ကို အသုံးပြုပြီး, `Item Size`, `Variety` နဲ့ `Color` တို့ရဲ့ ဆက်နွယ်မှုကို categorical plot မှာ visualized လုပ်ပါမည်။ Encoded `Item Size` column နဲ့ unencoded `Variety` column ကို အသုံးပြုပါမည်။ + +```python + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size'] + + g = sns.catplot( + data=pumpkins, + x="Item Size", y="Color", row='Variety', + kind="box", orient="h", + sharex=False, margin_titles=True, + height=1.8, aspect=4, palette=palette, + ) + g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6)) + g.set_titles(row_template="{row_name}") +``` +![A catplot of visualized data](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png) + +### Swarm plot ကို အသုံးပြုပါ + +Color က binary category (White or Not) ဖြစ်တဲ့အတွက်, 'a [specialized approach](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) to visualization' လိုအပ်ပါတယ်။ Category နဲ့ အခြား variables တွေကြား ဆက်နွယ်မှုကို visualized လုပ်ဖို့ အခြားနည်းလမ်းများလည်း ရှိပါတယ်။ + +Seaborn plots ကို အသုံးပြုပြီး, variables တွေကို side-by-side visualized လုပ်နိုင်ပါတယ်။ + +1. Values တွေ distribution ကို ပြသဖို့ 'swarm' plot ကို စမ်းသုံးပါ: + + ```python + palette = { + 0: 'orange', + 1: 'wheat' + } + sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette) + ``` + + ![A swarm of visualized data](../../../../2-Regression/4-Logistic/images/swarm_2.png) + +**သတိထားပါ**: အထက်ပါ code က warning တစ်ခု ဖြစ်စေနိုင်ပါတယ်၊ အကြောင်းကတော့ seaborn က datapoints များစွာကို swarm plot မှာ represent လုပ်ဖို့ မအောင်မြင်တာကြောင့် ဖြစ်ပါတယ်။ Marker size ကို 'size' parameter ဖြင့် လျှော့ချခြင်းက ဖြေရှင်းနည်းတစ်ခုဖြစ်နိုင်ပါတယ်။ သို့သော်, ဒါက plot ရဲ့ readability ကို ထိခိုက်စေနိုင်တာကို သတိထားပါ။ + +> **🧮 သင်္ချာကို ပြပါ** +> +> Logistic regression က 'maximum likelihood' concept ကို [sigmoid functions](https://wikipedia.org/wiki/Sigmoid_function) အသုံးပြုပါတယ်။ 'Sigmoid Function' ဟာ plot မှာ 'S' ပုံစံရှိပါတယ်။ Value တစ်ခုကို 0 နဲ့ 1 အကြား map လုပ်ပါတယ်။ Curve ကို 'logistic curve' လို့လည်း ခေါ်ပါတယ်။ Formula က ဒီလိုပုံစံရှိပါတယ်: +> +> ![logistic function](../../../../2-Regression/4-Logistic/images/sigmoid.png) +> +> Sigmoid ရဲ့ midpoint က x ရဲ့ 0 point မှာ ရှိပြီး, L က curve ရဲ့ အများဆုံး value ဖြစ်ပါတယ်။ k က curve ရဲ့ steepness ဖြစ်ပါတယ်။ Function ရဲ့ result က 0.5 ထက်ပိုရင်, label ကို binary choice ရဲ့ '1' class အဖြစ် assign လုပ်ပါမည်။ မဟုတ်ရင်, '0' အဖြစ် classify လုပ်ပါမည်။ + +## Model ကို တည်ဆောက်ပါ + +Binary classification တွေကို ရှာဖွေဖို့ model တစ်ခု တည်ဆောက်ခြင်းက Scikit-learn မှာ အလွယ်ကူပါတယ်။ + +[![ML for beginners - Logistic Regression for classification of data](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "ML for beginners - Logistic Regression for classification of data") + +> 🎥 Linear regression model တည်ဆောက်ခြင်းအကြောင်း အကျဉ်းချုပ်ဗီဒီယိုကို ကြည့်ရန် အထက်ပါပုံကို နှိပ်ပါ။ + +1. Classification model မှာ အသုံးပြုလိုတဲ့ variables တွေကို ရွေးချယ်ပြီး, `train_test_split()` ကို ခေါ်ပြီး training နဲ့ test sets ကို ခွဲပါ: + + ```python + from sklearn.model_selection import train_test_split + + X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])] + y = encoded_pumpkins['Color'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + + ``` + +2. Model ကို training data နဲ့ `fit()` ကို ခေါ်ပြီး train လုပ်ပါ၊ ရလဒ်ကို print လုပ်ပါ: + + ```python + from sklearn.metrics import f1_score, classification_report + from sklearn.linear_model import LogisticRegression + + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('F1-score: ', f1_score(y_test, predictions)) + ``` + + Model ရဲ့ scoreboard ကို ကြည့်ပါ။ ဒေတာ 1000 rows လောက်ပဲ ရှိတာကို တွေးမိရင်, အဆင်ပြေပါတယ်: + + ```output + precision recall f1-score support + + 0 0.94 0.98 0.96 166 + 1 0.85 0.67 0.75 33 + + accuracy 0.92 199 + macro avg 0.89 0.82 0.85 199 + weighted avg 0.92 0.92 0.92 199 + + Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 0 0 0 1 0 0 0 0 0 0 0 0 1 1] + F1-score: 0.7457627118644068 + ``` + +## Confusion matrix ဖြင့် ပိုမိုနားလည်မှုရရှိပါ + +အထက်ပါ items တွေကို print လုပ်ပြီး, [terms](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) ရဲ့ scoreboard report ကို ရနိုင်ပါတယ်။ သို့သော်, model ကို ပိုမိုနားလည်စေရန်, [confusion matrix](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) ကို အသုံးပြုပါ။ + +> 🎓 '[confusion matrix](https://wikipedia.org/wiki/Confusion_matrix)' (သို့မဟုတ် 'error matrix') က model ရဲ့ true vs. false positives နဲ့ negatives ကို table အနေနဲ့ ဖော်ပြပြီး, ခန့်မှန်းမှုရဲ့ တိကျမှုကို တိုင်းတာပါတယ်။ + +1. Confusion matrix ကို အသုံးပြုဖို့, `confusion_matrix()` ကို ခေါ်ပါ: + + ```python + from sklearn.metrics import confusion_matrix + confusion_matrix(y_test, predictions) + ``` + + Model ရဲ့ confusion matrix ကို ကြည့်ပါ: + + ```output + array([[162, 4], + [ 11, 22]]) + ``` + +Scikit-learn မှာ confusion matrices ရဲ့ Rows (axis 0) က actual labels ဖြစ်ပြီး, Columns (axis 1) က predicted labels ဖြစ်ပါတယ်။ + +| | 0 | 1 | +| :---: | :---: | :---: | +| 0 | TN | FP | +| +အကြောင်းအရာများနှင့် Precision နှင့် Recall တို့သည် Confusion Matrix နှင့် ဘယ်လိုဆက်စပ်နေသလဲ? အထက်တွင် ဖော်ပြထားသော Classification Report မှ Precision (0.85) နှင့် Recall (0.67) ကို ပြထားသည်။ + +Precision = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461 + +Recall = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666 + +✅ Q: Confusion Matrix အရ မော်ဒယ်က ဘယ်လိုလုပ်ဆောင်ခဲ့သလဲ? +A: မဆိုးပါဘူး၊ true negatives များစွာရှိပြီး false negatives အနည်းငယ်လည်းရှိပါတယ်။ + +Confusion Matrix မှ TP/TN နှင့် FP/FN mapping ကို အသုံးပြု၍ အရင်တွေ့ခဲ့သော အကြောင်းအရာများကို ပြန်လည်သုံးသပ်ကြမယ်။ + +🎓 Precision: TP/(TP + FP) +Retrieved ဖြစ်သော instances တွင် Relevant ဖြစ်သော instances ရဲ့ အချိုး (ဥပမာ- label များကို မှန်ကန်စွာ label လုပ်ထားသည်) + +🎓 Recall: TP/(TP + FN) +Relevant ဖြစ်သော instances တွေကို Retrieved လုပ်ထားသော အချိုး (မှန်ကန်စွာ label လုပ်ထားခြင်းဖြစ်စေ၊ မဖြစ်စေ) + +🎓 f1-score: (2 * precision * recall)/(precision + recall) +Precision နှင့် Recall ရဲ့ Weighted Average (အကောင်းဆုံး 1 ဖြစ်ပြီး အဆိုးဆုံး 0 ဖြစ်သည်) + +🎓 Support: +Retrieved လုပ်ထားသော label တစ်ခုချင်းစီရဲ့ ဖြစ်ပေါ်မှုအရေအတွက် + +🎓 Accuracy: (TP + TN)/(TP + TN + FP + FN) +Sample တစ်ခုအတွက် label များကို မှန်ကန်စွာ ခန့်မှန်းထားသော ရာခိုင်နှုန်း + +🎓 Macro Avg: +Label များရဲ့ Imbalance ကို မထည့်သွင်းစဉ်းစားဘဲ Label တစ်ခုချင်းစီအတွက် Unweighted Mean Metrics တွေကို တွက်ချက်ထားခြင်း + +🎓 Weighted Avg: +Label များရဲ့ Imbalance ကို Support (label တစ်ခုချင်းစီရဲ့ true instances အရေအတွက်) ဖြင့် weighting လုပ်ပြီး Mean Metrics တွေကို တွက်ချက်ထားခြင်း + +✅ Q: False negatives အရေအတွက်ကို လျှော့ချချင်ရင် မော်ဒယ်ရဲ့ ဘယ် Metric ကို အဓိကကြည့်သင့်သလဲ? + +## မော်ဒယ်ရဲ့ ROC Curve ကို Visualize လုပ်ပါ + +[![ML for beginners - Analyzing Logistic Regression Performance with ROC Curves](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML for beginners - Analyzing Logistic Regression Performance with ROC Curves") + +> 🎥 အထက်ပါပုံကို Click လုပ်ပြီး ROC Curves အကြောင်း ရှင်းလင်းထားသော ဗီဒီယိုကို ကြည့်ပါ + +"ROC" Curve ကို ကြည့်ရှုရန် Visualization တစ်ခုကို ပြုလုပ်ကြမယ်။ + +```python +from sklearn.metrics import roc_curve, roc_auc_score +import matplotlib +import matplotlib.pyplot as plt +%matplotlib inline + +y_scores = model.predict_proba(X_test) +fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1]) + +fig = plt.figure(figsize=(6, 6)) +plt.plot([0, 1], [0, 1], 'k--') +plt.plot(fpr, tpr) +plt.xlabel('False Positive Rate') +plt.ylabel('True Positive Rate') +plt.title('ROC Curve') +plt.show() +``` + +Matplotlib ကို အသုံးပြု၍ မော်ဒယ်ရဲ့ [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) (ROC) ကို Plot လုပ်ပါ။ ROC curves ကို Classifier ရဲ့ True vs. False Positives output ကို ကြည့်ရှုရန် အများအားဖြင့် အသုံးပြုသည်။ "ROC curves တွင် Y axis တွင် True Positive Rate ကို feature လုပ်ပြီး X axis တွင် False Positive Rate ကို feature လုပ်သည်။" Curve ရဲ့ steepness နှင့် Midpoint Line နှင့် Curve အကြားရှိနေသော နေရာသည် အရေးကြီးသည်။ Curve က မြန်မြန် Heading Up လုပ်ပြီး Line အပေါ်ကို ရောက်သင့်သည်။ ကျွန်ုပ်တို့ရဲ့ မော်ဒယ်တွင် False Positives များစွာရှိပြီး Line က Heading Up လုပ်ပြီး အပေါ်ကို ရောက်သွားသည်။ + +![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png) + +နောက်ဆုံးတွင် Scikit-learn ရဲ့ [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) ကို အသုံးပြု၍ 'Area Under the Curve' (AUC) ကို တွက်ချက်ပါ။ + +```python +auc = roc_auc_score(y_test,y_scores[:,1]) +print(auc) +``` +ရလဒ်မှာ `0.9749908725812341` ဖြစ်သည်။ AUC သည် 0 မှ 1 အထိ ရှိနိုင်ပြီး Prediction များကို 100% မှန်ကန်စွာ ခန့်မှန်းနိုင်သော မော်ဒယ်သည် AUC 1 ရှိမည်။ ဒီအခါမှာတော့ မော်ဒယ်က _တော်တော်လေးကောင်းပါတယ်_။ + +အနာဂတ် Classifications သင်ခန်းစာများတွင် မော်ဒယ်ရဲ့ Score များကို တိုးတက်အောင် Iteration လုပ်နည်းကို သင်ယူရမည်။ ဒါပေမယ့် အခုအချိန်မှာ Congratulations! Regression သင်ခန်းစာများကို ပြီးမြောက်စွာ လုပ်ဆောင်နိုင်ပါပြီ! + +--- +## 🚀Challenge + +Logistic Regression အကြောင်းမှာ သင်ယူစရာများစွာ ရှိနေဆဲပါ။ သို့သော် အကောင်းဆုံး သင်ယူနည်းက စမ်းသပ်ခြင်းဖြစ်သည်။ ဒီအမျိုးအစား Analysis အတွက် သင့်လျော်သော Dataset တစ်ခုကို ရှာဖွေပြီး မော်ဒယ်တစ်ခုကို တည်ဆောက်ပါ။ သင်ဘာတွေ သင်ယူရမလဲ? tip: [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) မှ စိတ်ဝင်စားဖွယ် Dataset များကို စမ်းကြည့်ပါ။ + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Review & Self Study + +Stanford မှ [ဒီစာတမ်း](https://web.stanford.edu/~jurafsky/slp3/5.pdf) ရဲ့ ပထမပိုင်းစာမျက်နှာများကို ဖတ်ပါ။ Logistic Regression ရဲ့ လက်တွေ့အသုံးချမှုများအကြောင်းတွင် စဉ်းစားပါ။ ကျွန်ုပ်တို့ သင်ယူခဲ့သော Regression အမျိုးအစားများအနက် ဘယ်အမျိုးအစားက သင့်လျော်မလဲဆိုတာကို စဉ်းစားပါ။ + +## Assignment + +[Retrying this regression](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/4-Logistic/assignment.md b/translations/my/2-Regression/4-Logistic/assignment.md new file mode 100644 index 00000000..df8cb9b0 --- /dev/null +++ b/translations/my/2-Regression/4-Logistic/assignment.md @@ -0,0 +1,25 @@ + +# ပြန်လည်ကြိုးစားခြင်း - Regression + +## လမ်းညွှန်ချက်များ + +ဒီသင်ခန်းစာမှာ သင်သည် ဖရုံသီးဒေတာ၏ အစိတ်အပိုင်းတစ်ခုကို အသုံးပြုခဲ့သည်။ အခုတော့ မူရင်းဒေတာကို ပြန်သွားပြီး သန့်စင်ထားပြီး စံပြုထားသော ဒေတာအားလုံးကို အသုံးပြု၍ Logistic Regression မော်ဒယ်တစ်ခု တည်ဆောက်ရန် ကြိုးစားပါ။ + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| ----------- | ----------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- | +| | မော်ဒယ်ကို ကောင်းစွာရှင်းပြထားပြီး ကောင်းစွာအလုပ်လုပ်သော notebook တစ်ခုကို တင်ပြထားသည် | မော်ဒယ်သည် အနည်းဆုံးအလုပ်လုပ်သော notebook တစ်ခုကို တင်ပြထားသည် | မော်ဒယ်သည် အလုပ်မလုပ်သော notebook တစ်ခု သို့မဟုတ် မတင်ပြထားသော | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/4-Logistic/solution/Julia/README.md b/translations/my/2-Regression/4-Logistic/solution/Julia/README.md new file mode 100644 index 00000000..cca42a5e --- /dev/null +++ b/translations/my/2-Regression/4-Logistic/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/2-Regression/README.md b/translations/my/2-Regression/README.md new file mode 100644 index 00000000..f39f900b --- /dev/null +++ b/translations/my/2-Regression/README.md @@ -0,0 +1,54 @@ + +# စက်မှုသင်ယူမှုအတွက် ပြန်လည်ခန့်မှန်းမော်ဒယ်များ +## ဒေသဆိုင်ရာ ခေါင်းစဉ်: မြောက်အမေရိကာရှိ ဖရုံဈေးနှုန်းများအတွက် ပြန်လည်ခန့်မှန်းမော်ဒယ်များ 🎃 + +မြောက်အမေရိကာတွင် ဖရုံများကို Halloween အတွက် ကြောက်မက်ဖွယ်မျက်နှာများအဖြစ် ပုံဖော်တတ်ကြသည်။ ဒီစိတ်ဝင်စားဖွယ် ဟင်းသီးဟင်းရွက်များအကြောင်း ပိုမိုလေ့လာကြရအောင်! + +![jack-o-lanterns](../../../2-Regression/images/jack-o-lanterns.jpg) +> ဓာတ်ပုံ - Beth Teutschmann မှ Unsplash တွင် ရရှိသည် + +## သင်လေ့လာမည့်အရာများ + +[![Regression ကိုမိတ်ဆက်ခြင်း](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "Regression ကိုမိတ်ဆက်ခြင်း - ကြည့်ရန်နှိပ်ပါ!") +> 🎥 အထက်ပါပုံကိုနှိပ်ပြီး ဒီသင်ခန်းစာအတွက် အကျဉ်းချုပ်ဗီဒီယိုကို ကြည့်ပါ + +ဒီအပိုင်းတွင် ပါဝင်သင်ကြားမည့် သင်ခန်းစာများသည် စက်မှုသင်ယူမှုအတွင်း ပြန်လည်ခန့်မှန်းမော်ဒယ်များအကြောင်းကို ဖော်ပြထားသည်။ ပြန်လည်ခန့်မှန်းမော်ဒယ်များသည် အပြောင်းအလဲများအကြား _ဆက်စပ်မှု_ ကို သတ်မှတ်နိုင်စေသည်။ ဒီမော်ဒယ်အမျိုးအစားသည် အရှည်၊ အပူချိန်၊ အသက် စသည့် တန်ဖိုးများကို ခန့်မှန်းနိုင်ပြီး ဒေတာအချက်အလက်များကို ခွဲခြမ်းစိတ်ဖြာသည့်အခါ အပြောင်းအလဲများအကြား ဆက်စပ်မှုများကို ဖော်ထုတ်နိုင်သည်။ + +ဒီသင်ခန်းစာများစီးရီးတွင် Linear regression နှင့် Logistic regression တို့အကြား ကွာခြားချက်များကို ရှာဖွေပြီး တစ်ခုကို တစ်ခုထက် မည်သည့်အခါမှာ ပိုသင့်တော်မည်ကို သိရှိနိုင်မည်ဖြစ်သည်။ + +[![စက်မှုသင်ယူမှုအတွက် ပြန်လည်ခန့်မှန်းမော်ဒယ်များကို မိတ်ဆက်ခြင်း](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "စက်မှုသင်ယူမှုအတွက် ပြန်လည်ခန့်မှန်းမော်ဒယ်များကို မိတ်ဆက်ခြင်း") + +> 🎥 အထက်ပါပုံကိုနှိပ်ပြီး ပြန်လည်ခန့်မှန်းမော်ဒယ်များအကြောင်း အကျဉ်းချုပ်ဗီဒီယိုကို ကြည့်ပါ + +ဒီသင်ခန်းစာအုပ်စုတွင် စက်မှုသင်ယူမှုလုပ်ငန်းများကို စတင်ရန် ပြင်ဆင်မည့်အခန်းကဏ္ဍများကို လေ့လာမည်ဖြစ်ပြီး Visual Studio Code ကို notebook များကို စီမံခန့်ခွဲရန် ပြင်ဆင်သည့်နည်းလမ်းများ၊ ဒေတာသိပ္ပံပညာရှင်များအတွက် ပုံမှန်ပတ်ဝန်းကျင်များကို လေ့လာမည်ဖြစ်သည်။ သင်သည် Scikit-learn လိုက်ဘရေးရီးကို ရှာဖွေပြီး ဒီအခန်းတွင် ပြန်လည်ခန့်မှန်းမော်ဒယ်များကို အထူးအာရုံစိုက်ကာ သင်၏ ပထမဆုံးမော်ဒယ်များကို တည်ဆောက်မည်ဖြစ်သည်။ + +> ပြန်လည်ခန့်မှန်းမော်ဒယ်များနှင့် အလုပ်လုပ်ရန် အထောက်အကူပြုသော နည်းလမ်းများကို လေ့လာရန် အထောက်အကူပြုသော အနည်းဆုံးကုဒ်တစ်ချို့ရှိသည်။ ဒီအလုပ်အတွက် [Azure ML](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) ကို စမ်းကြည့်ပါ + +### သင်ခန်းစာများ + +1. [အသုံးပြုရမည့် ကိရိယာများ](1-Tools/README.md) +2. [ဒေတာကို စီမံခန့်ခွဲခြင်း](2-Data/README.md) +3. [Linear နှင့် Polynomial ပြန်လည်ခန့်မှန်းမှု](3-Linear/README.md) +4. [Logistic ပြန်လည်ခန့်မှန်းမှု](4-Logistic/README.md) + +--- +### အကျိုးတူဆောင်ရွက်သူများ + +"ML with regression" ကို [Jen Looper](https://twitter.com/jenlooper) မှ ♥️ ဖြင့် ရေးသားထားသည် + +♥️ စမ်းမေးခွန်းအထောက်အကူပြုသူများတွင် [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) နှင့် [Ornella Altunyan](https://twitter.com/ornelladotcom) တို့ ပါဝင်သည် + +ဖရုံဒေတာအစုကို [Kaggle တွင်ရှိသော ဒီပရောဂျက်](https://www.kaggle.com/usda/a-year-of-pumpkin-prices) မှ အကြံပြုထားပြီး ဒေတာကို အမေရိကန်စိုက်ပျိုးရေးဌာနမှ ထုတ်ဝေသည့် [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) မှ ရယူထားသည်။ ကျွန်ုပ်တို့သည် အမျိုးအစားအလိုက် အရောင်များကို ပုံမှန်ဖြန့်ဝေမှုအတွက် အချို့အချက်အလက်များ ထည့်သွင်းထားသည်။ ဒီဒေတာသည် Public Domain အတွင်းရှိသည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူပညာရှင်များမှ ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/3-Web-App/1-Web-App/README.md b/translations/my/3-Web-App/1-Web-App/README.md new file mode 100644 index 00000000..85f3e195 --- /dev/null +++ b/translations/my/3-Web-App/1-Web-App/README.md @@ -0,0 +1,355 @@ + +# ML မော်ဒယ်ကို အသုံးပြုရန် Web App တည်ဆောက်ခြင်း + +ဒီသင်ခန်းစာမှာ သင်သည် _နောက်ဆုံးရာစုအတွင်း UFO တွေ့ရှိမှုများ_ ဆိုတဲ့ အထူးအဆန်းသော ဒေတာစနစ်ပေါ်မှာ ML မော်ဒယ်ကို လေ့ကျင့်ပါမည်။ ဒေတာများကို NUFORC ရဲ့ ဒေတာဘေ့စ်မှ ရယူထားသည်။ + +သင်လေ့လာရမည့်အရာများမှာ: + +- လေ့ကျင့်ပြီးသော မော်ဒယ်ကို 'pickle' လုပ်နည်း +- Flask app မှာ မော်ဒယ်ကို အသုံးပြုနည်း + +ကျွန်တော်တို့သည် ဒေတာကို သန့်စင်ခြင်းနှင့် မော်ဒယ်ကို လေ့ကျင့်ခြင်းအတွက် notebook များကို ဆက်လက်အသုံးပြုမည်ဖြစ်ပြီး၊ သင်သည် မော်ဒယ်ကို 'အပြင်မှာ' အသုံးပြုခြင်းကို စူးစမ်းခြင်းဖြင့် တစ်ဆင့်အဆင့်တက်နိုင်ပါသည်။ ဒါကိုလုပ်ဖို့ Flask ကို အသုံးပြုပြီး web app တစ်ခုကို တည်ဆောက်ရပါမည်။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## App တစ်ခုတည်ဆောက်ခြင်း + +Machine learning မော်ဒယ်များကို အသုံးပြုရန် web app များတည်ဆောက်ရန် နည်းလမ်းများစွာရှိသည်။ သင့် web architecture သည် မော်ဒယ်ကို လေ့ကျင့်ပုံကို သက်ရောက်စေနိုင်သည်။ သင်သည် data science group မှ လေ့ကျင့်ထားသော မော်ဒယ်ကို app မှာ အသုံးပြုရန်လိုအပ်သော စီးပွားရေးလုပ်ငန်းတွင် အလုပ်လုပ်နေသည်ဟု စဉ်းစားပါ။ + +### စဉ်းစားရန်အချက်များ + +သင်မေးရမည့်မေးခွန်းများစွာရှိသည်: + +- **Web app လား mobile app လား?** သင် mobile app တစ်ခုတည်ဆောက်နေသည်၊ ဒါမှမဟုတ် IoT context မှာ မော်ဒယ်ကို အသုံးပြုရန်လိုအပ်ပါက [TensorFlow Lite](https://www.tensorflow.org/lite/) ကို အသုံးပြုပြီး Android သို့မဟုတ် iOS app မှာ မော်ဒယ်ကို အသုံးပြုနိုင်ပါသည်။ +- **မော်ဒယ်ကို ဘယ်မှာထားမလဲ?** Cloud မှာလား ဒေသတွင်းမှာလား? +- **Offline support.** App သည် offline မှာ အလုပ်လုပ်ရမလား? +- **မော်ဒယ်ကို လေ့ကျင့်ရန် ဘယ်နည်းပညာကို အသုံးပြုခဲ့သလဲ?** ရွေးချယ်ထားသော နည်းပညာသည် သင်အသုံးပြုရမည့် tooling ကို သက်ရောက်စေပါမည်။ + - **TensorFlow ကို အသုံးပြုခြင်း။** TensorFlow ကို အသုံးပြု၍ မော်ဒယ်ကို လေ့ကျင့်နေပါက [TensorFlow.js](https://www.tensorflow.org/js/) ကို အသုံးပြု၍ web app မှာ အသုံးပြုရန် TensorFlow မော်ဒယ်ကို ပြောင်းနိုင်စွမ်းပေးသည်။ + - **PyTorch ကို အသုံးပြုခြင်း။** [PyTorch](https://pytorch.org/) ကဲ့သို့သော library ကို အသုံးပြု၍ မော်ဒယ်တစ်ခုကို တည်ဆောက်နေပါက [ONNX](https://onnx.ai/) (Open Neural Network Exchange) format ကို JavaScript web app များတွင် အသုံးပြုနိုင်ရန် [Onnx Runtime](https://www.onnxruntime.ai/) ကို အသုံးပြုနိုင်သည်။ ဒီ option ကို Scikit-learn-trained မော်ဒယ်အတွက် နောက်ဆုံးသင်ခန်းစာမှာ စူးစမ်းပါမည်။ + - **Lobe.ai သို့မဟုတ် Azure Custom Vision ကို အသုံးပြုခြင်း။** [Lobe.ai](https://lobe.ai/) သို့မဟုတ် [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) ကဲ့သို့သော ML SaaS (Software as a Service) စနစ်ကို အသုံးပြု၍ မော်ဒယ်ကို လေ့ကျင့်နေပါက၊ ဒီ software များသည် မော်ဒယ်ကို အမျိုးမျိုးသော platform များအတွက် export လုပ်ရန် နည်းလမ်းများပေးသည်။ Cloud မှာ query လုပ်နိုင်သော bespoke API တစ်ခုတည်ဆောက်ရန်လည်း ရနိုင်သည်။ + +သင်သည် web browser မှာ မော်ဒယ်ကို ကိုယ်တိုင်လေ့ကျင့်နိုင်သော Flask web app တစ်ခုလုံးကို တည်ဆောက်နိုင်သည်။ JavaScript context မှာ TensorFlow.js ကို အသုံးပြု၍လည်း လုပ်နိုင်ပါသည်။ + +ကျွန်တော်တို့ရဲ့ ရည်ရွယ်ချက်အရ၊ Python-based notebooks များကို အသုံးပြုနေသောကြောင့် notebook မှ trained မော်ဒယ်ကို Python-built web app မှာ ဖတ်နိုင်သော format သို့ export လုပ်ရန် လိုအပ်သော အဆင့်များကို စူးစမ်းကြည့်ပါမည်။ + +## Tool + +ဒီ task အတွက် သင်သည် Flask နှင့် Pickle ဆိုသော Python မှ run လုပ်သော tool နှစ်ခုလိုအပ်ပါမည်။ + +✅ [Flask](https://palletsprojects.com/p/flask/) ဆိုတာဘာလဲ? Flask ကို 'micro-framework' ဟု ဖန်တီးသူများက ဖော်ပြထားပြီး Python ကို အသုံးပြု၍ web frameworks ရဲ့ အခြေခံ features များနှင့် web pages တည်ဆောက်ရန် templating engine ကို ပေးသည်။ Flask ကို အသုံးပြု၍ AI web app တစ်ခုတည်ဆောက်ရန် [ဒီ Learn module](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) ကို ကြည့်ပါ။ + +✅ [Pickle](https://docs.python.org/3/library/pickle.html) ဆိုတာဘာလဲ? Pickle 🥒 သည် Python module တစ်ခုဖြစ်ပြီး Python object structure ကို serialize နှင့် de-serialize လုပ်ပေးသည်။ မော်ဒယ်ကို 'pickle' လုပ်သည်ဆိုတာ မော်ဒယ်ရဲ့ structure ကို web မှာ အသုံးပြုရန် serialize သို့မဟုတ် flatten လုပ်ခြင်းဖြစ်သည်။ သတိထားပါ: pickle သည် intrinsic security မရှိသောကြောင့် 'un-pickle' လုပ်ရန် prompt လုပ်ပါက သတိထားပါ။ Pickled file တွင် `.pkl` suffix ပါသည်။ + +## လေ့ကျင့်ခန်း - သင့်ဒေတာကို သန့်စင်ပါ + +ဒီသင်ခန်းစာမှာ သင်သည် [NUFORC](https://nuforc.org) (The National UFO Reporting Center) မှ စုဆောင်းထားသော 80,000 UFO တွေ့ရှိမှုများ၏ ဒေတာကို အသုံးပြုပါမည်။ ဒီဒေတာမှာ UFO တွေ့ရှိမှုများ၏ စိတ်ဝင်စားဖွယ်ဖော်ပြချက်များပါဝင်သည်၊ ဥပမာ: + +- **ရှည်လျားသော ဖော်ပြချက်။** "အလင်းတန်းတစ်ခုက ညဘက် မြက်ခင်းပေါ်ကို ထွန်းလင်းနေပြီး အလင်းတန်းထဲက လူတစ်ယောက် ထွက်လာပြီး Texas Instruments parking lot ကို ပြေးသွားသည်။" +- **တိုတောင်းသော ဖော်ပြချက်။** "အလင်းတွေက ကျွန်တော်တို့ကို လိုက်ခဲ့တယ်။" + +[ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) spreadsheet တွင် `city`, `state`, `country` (တွေ့ရှိမှုဖြစ်ပွားသောနေရာ), object's `shape`, `latitude` နှင့် `longitude` column များပါဝင်သည်။ + +ဒီသင်ခန်းစာတွင် ပါဝင်သော [notebook](../../../../3-Web-App/1-Web-App/notebook.ipynb) မှာ: + +1. `pandas`, `matplotlib`, နှင့် `numpy` ကို ယခင်သင်ခန်းစာများတွင်လုပ်ခဲ့သလို import လုပ်ပြီး ufos spreadsheet ကို import လုပ်ပါ။ ဒေတာစနစ်တစ်ခုကို ကြည့်နိုင်သည်: + + ```python + import pandas as pd + import numpy as np + + ufos = pd.read_csv('./data/ufos.csv') + ufos.head() + ``` + +1. ufos ဒေတာကို fresh titles ပါသော dataframe သေးငယ်တစ်ခုသို့ ပြောင်းပါ။ `Country` field ရဲ့ unique values များကို စစ်ဆေးပါ။ + + ```python + ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) + + ufos.Country.unique() + ``` + +1. အခုတော့ null values များကို drop လုပ်ပြီး 1-60 seconds ကြားမှာ ဖြစ်ပွားသော တွေ့ရှိမှုများကိုသာ import လုပ်ခြင်းဖြင့် ကျွန်တော်တို့ကိုလိုအပ်သော ဒေတာပမာဏကို လျှော့ချနိုင်ပါသည်: + + ```python + ufos.dropna(inplace=True) + + ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] + + ufos.info() + ``` + +1. Scikit-learn ရဲ့ `LabelEncoder` library ကို import လုပ်ပြီး text values များကို number သို့ ပြောင်းပါ: + + ✅ LabelEncoder သည် ဒေတာကို အက္ခရာစဉ်အတိုင်း encode လုပ်သည် + + ```python + from sklearn.preprocessing import LabelEncoder + + ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) + + ufos.head() + ``` + + သင့်ဒေတာသည် ဒီလိုပုံစံရှိသင့်သည်: + + ```output + Seconds Country Latitude Longitude + 2 20.0 3 53.200000 -2.916667 + 3 20.0 4 28.978333 -96.645833 + 14 30.0 4 35.823889 -80.253611 + 23 60.0 4 45.582778 -122.352222 + 24 3.0 3 51.783333 -0.783333 + ``` + +## လေ့ကျင့်ခန်း - မော်ဒယ်ကို တည်ဆောက်ပါ + +အခုတော့ ဒေတာကို လေ့ကျင့်ခြင်းနှင့် စမ်းသပ်ခြင်းအုပ်စုသို့ ခွဲခြားပြီး မော်ဒယ်ကို လေ့ကျင့်ရန် ပြင်ဆင်နိုင်ပါပြီ။ + +1. သင်လေ့ကျင့်လိုသော feature သုံးခုကို X vector အဖြစ် ရွေးချယ်ပါ၊ y vector သည် `Country` ဖြစ်ပါမည်။ သင်သည် `Seconds`, `Latitude` နှင့် `Longitude` ကို input လုပ်ပြီး country id ကို return လုပ်နိုင်ရန်လိုအပ်သည်။ + + ```python + from sklearn.model_selection import train_test_split + + Selected_features = ['Seconds','Latitude','Longitude'] + + X = ufos[Selected_features] + y = ufos['Country'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + ``` + +1. Logistic regression ကို အသုံးပြု၍ မော်ဒယ်ကို လေ့ကျင့်ပါ: + + ```python + from sklearn.metrics import accuracy_score, classification_report + from sklearn.linear_model import LogisticRegression + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('Accuracy: ', accuracy_score(y_test, predictions)) + ``` + +Accuracy သည် **(95% ခန့်)** မဆိုးပါဘူး၊ အံ့မခန်းပဲ၊ `Country` နှင့် `Latitude/Longitude` သည် correlation ရှိသောကြောင့်ဖြစ်သည်။ + +သင်ဖန်တီးထားသော မော်ဒယ်သည် `Latitude` နှင့် `Longitude` မှ `Country` ကို အတိအကျသုံးသပ်နိုင်သည့်အတွက် အလွန်ထူးခြားသော မော်ဒယ်မဟုတ်ပါ၊ ဒါပေမယ့် crude ဒေတာကို သန့်စင်ပြီး export လုပ်ကာ web app မှာ မော်ဒယ်ကို အသုံးပြုရန် လေ့ကျင့်ခြင်းကို လေ့ကျင့်ရန်ကောင်းသော လေ့ကျင့်ခန်းဖြစ်သည်။ + +## လေ့ကျင့်ခန်း - မော်ဒယ်ကို 'pickle' လုပ်ပါ + +အခုတော့ သင့်မော်ဒယ်ကို _pickle_ လုပ်ရန် အချိန်ရောက်ပါပြီ! ```python +import pickle +model_filename = 'ufo-model.pkl' +pickle.dump(model, open(model_filename,'wb')) + +model = pickle.load(open('ufo-model.pkl','rb')) +print(model.predict([[50,44,-12]])) +``` + +မော်ဒယ်သည် **'3'** ကို return လုပ်သည်၊ UK ရဲ့ country code ဖြစ်သည်။ အံ့မခန်း! 👽 + +## လေ့ကျင့်ခန်း - Flask app တစ်ခုတည်ဆောက်ပါ + +အခုတော့ သင့်မော်ဒယ်ကို ခေါ်ပြီး ရလဒ်များကို ပိုမိုကြည့်လို့ကောင်းသောပုံစံဖြင့် ပြသနိုင်သော Flask app တစ်ခုကို တည်ဆောက်နိုင်ပါပြီ။ + +1. **web-app** folder တစ်ခုကို _notebook.ipynb_ ဖိုင်နှင့် _ufo-model.pkl_ ဖိုင်ရှိရာနေရာအနီးတွင် ဖန်တီးပါ။ + +1. အဲဒီ folder မှာ **static** folder တစ်ခု (အတွင်းမှာ **css** folder ပါ) နှင့် **templates** folder တစ်ခု ဖန်တီးပါ။ သင့်တွင် အောက်ပါဖိုင်များနှင့် directories ရှိသင့်သည်: + + ```output + web-app/ + static/ + css/ + templates/ + notebook.ipynb + ufo-model.pkl + ``` + + ✅ အပြီးသတ် app ရဲ့ solution folder ကို ကြည့်ပါ + +1. _web-app_ folder မှာ ဖန်တီးရမည့် ပထမဆုံးဖိုင်မှာ **requirements.txt** ဖြစ်သည်။ JavaScript app ရဲ့ _package.json_ ကဲ့သို့ requirements.txt ဖိုင်သည် app မှာလိုအပ်သော dependencies များကို ဖော်ပြသည်။ **requirements.txt** မှာ အောက်ပါလိုင်းများထည့်ပါ: + + ```text + scikit-learn + pandas + numpy + flask + ``` + +1. အခုတော့ _web-app_ folder ကို navigate လုပ်ပြီး ဒီဖိုင်ကို run လုပ်ပါ: + + ```bash + cd web-app + ``` + +1. Terminal မှာ `pip install` ကို ရိုက်ပါ၊ _requirements.txt_ မှာ ဖော်ပြထားသော libraries များကို install လုပ်ရန်: + + ```bash + pip install -r requirements.txt + ``` + +1. အခုတော့ app ကို အပြီးသတ်ရန် ဖိုင်သုံးခုကို ဖန်တီးရန် ပြင်ဆင်ထားပါ: + + 1. **app.py** ကို root မှာ ဖန်တီးပါ။ + 2. **index.html** ကို _templates_ directory မှာ ဖန်တီးပါ။ + 3. **styles.css** ကို _static/css_ directory မှာ ဖန်တီးပါ။ + +1. _styles.css_ ဖိုင်ကို အနည်းငယ် styles ဖြင့် တည်ဆောက်ပါ: + + ```css + body { + width: 100%; + height: 100%; + font-family: 'Helvetica'; + background: black; + color: #fff; + text-align: center; + letter-spacing: 1.4px; + font-size: 30px; + } + + input { + min-width: 150px; + } + + .grid { + width: 300px; + border: 1px solid #2d2d2d; + display: grid; + justify-content: center; + margin: 20px auto; + } + + .box { + color: #fff; + background: #2d2d2d; + padding: 12px; + display: inline-block; + } + ``` + +1. နောက်ဆုံး _index.html_ ဖိုင်ကို တည်ဆောက်ပါ: + + ```html + + + + + 🛸 UFO Appearance Prediction! 👽 + + + + +
            + +
            + +

            According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?

            + +
            + + + + +
            + +

            {{ prediction_text }}

            + +
            + +
            + + + + ``` + + ဒီဖိုင်မှာ templating ကို ကြည့်ပါ။ `{{}}` ကဲ့သို့ app မှပေးမည့် variables များကို 'mustache' syntax ဖြင့် ဖော်ပြထားသည်။ `/predict` route မှာ prediction ကို post လုပ်မည့် form တစ်ခုလည်း ပါဝင်သည်။ + + နောက်ဆုံးတော့ မော်ဒယ်ကို အသုံးပြုခြင်းနှင့် prediction များကို ပြသရန် Python ဖိုင်ကို တည်ဆောက်ရန် ပြင်ဆင်ထားပါ: + +1. `app.py` မှာ အောက်ပါအတိုင်း ထည့်ပါ: + + ```python + import numpy as np + from flask import Flask, request, render_template + import pickle + + app = Flask(__name__) + + model = pickle.load(open("./ufo-model.pkl", "rb")) + + + @app.route("/") + def home(): + return render_template("index.html") + + + @app.route("/predict", methods=["POST"]) + def predict(): + + int_features = [int(x) for x in request.form.values()] + final_features = [np.array(int_features)] + prediction = model.predict(final_features) + + output = prediction[0] + + countries = ["Australia", "Canada", "Germany", "UK", "US"] + + return render_template( + "index.html", prediction_text="Likely country: {}".format(countries[output]) + ) + + + if __name__ == "__main__": + app.run(debug=True) + ``` + + > 💡 Tip: Flask ကို အသုံးပြု၍ web app ကို run လုပ်နေစဉ် `debug=True` ကို ထည့်ပါက app မှာ ပြောင်းလဲမှုများကို server ကို restart မလုပ်ဘဲ ချက်ချင်းပြောင်းလဲနိုင်သည်။ သတိထားပါ! ဒီ mode ကို production app မှာ enable မလုပ်ပါနှင့်။ + +`python app.py` သို့မဟုတ် `python3 app.py` ကို run လုပ်ပါ - သင့် web server သည် locally မှာ စတင်ပြီး သင့်ရဲ့ UFO တွေ့ရှိမှုများအကြောင်း burning question ကို ဖြေရှင်းရန် short form တစ်ခုကို ဖြည့်နိုင်ပါသည်! + +ဒီလုပ်ဆောင်မှုကိုလုပ်မည်မပြုမီ `app.py` ရဲ့ အပိုင်းများကို ကြည့်ပါ: + +1. ပထမဆုံး dependencies များကို load လုပ်ပြီး app ကို စတင်ပါသည်။ +1. နောက်ဆုံး မော်ဒယ်ကို import လုပ်ပါသည်။ +1. index.html ကို home route မှာ render လုပ်ပါသည်။ + +`/predict` route မှာ form ကို post လုပ်သောအခါ အချက်အလက်များစွာဖြစ်ပျက်သည်: + +1. Form variables များကို စုဆောင်းပြီး numpy array သို့ ပြောင်းပါ။ မော်ဒယ်ထံပို့ပြီး prediction ကို return လုပ်ပါသည်။ +2. Countries များကို readable text အဖြစ် ပြန်လည် render လုပ်ပြီး predicted country code မှာ ပြသရန် index.html သို့ ပြန်ပို့ပါသည်။ + +Flask နှင့် pickled မော်ဒယ်ကို အသုံးပြု၍ မော်ဒယ်ကို ဒီလိုအသုံးပြုခြင်းသည် အလွန်ရိုးရှင်းသည်။ မော်ဒယ်ထံ prediction ရရန် ပို့ရမည့် ဒေတာရဲ့ ပုံစံကို နားလည်ရန်သာ အခက်အခဲရှိသည်။ ဒါဟာ မော်ဒယ်ကို လေ့ကျင့်ပုံပေါ်မူတည်သည်။ ဒီမော်ဒယ်မှာ prediction ရရန် input လုပ်ရမည့် data points သုံးခုရှိသည်။ + +ပရော်ဖက်ရှင်နယ် setting မှာ မော်ဒယ်ကို လေ့ကျင့်သူများနှင့် web သို့မဟုတ် mobile app မှာ မော်ဒယ်ကို အသုံးပြုသူများအကြား ကောင်းမွန်သော ဆက်သွယ်မှုလိုအပ်သည်ကို သင်မြင်နိုင်ပါသည်။ ကျွန်တော်တို့ရဲ့ အခြေအနေမှာတော့ တစ်ယောက်တည်းဖြစ်သည်၊ သင်ပဲ! + +--- + +## 🚀 Challenge + +Notebook မှာ အလုပ်လုပ်ပြီး မော်ဒယ်ကို Flask app သို့ import လုပ်ခြင်းအစား၊ Flask app မှာတင် မော်ဒယ်ကို လေ့ကျင့်နိုင်ပါသည်! သင့် notebook မှ Python code ကို app မှာ data ကို သန့်စင်ပြီးနောက် `train` route မှာ မော်ဒယ်ကို လေ့ကျင့်ရန် ပြောင်းပါ။ ဒီနည်းလမ်းကို လိုက်နာခြင်းရဲ့ အကျိုးကျေးဇူးများနှင့် အနုတ်လက္ခဏာများကို စဉ်းစားပါ။ + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Review & Self Study + +ML မော်ဒယ်များကို အသုံးပြုရန် web app တစ်ခုတည်ဆောက်ရန် နည်းလမ်းများစွာရှိသည်။ JavaScript သို့မဟုတ် Python ကို အသုံးပြု၍ ML ကို leverage လုပ်ရန် web app တစ်ခုတည်ဆောက်နိုင်သော နည်းလမ်းများကို စဉ်းစားပါ။ Architecture ကို စဉ်းစားပါ: မော်ဒယ်ကို app မှာထားသင့်သလား cloud မှာထားသင့်သလား? Cloud မှာထားပါက ဘယ်လို access လုပ်မလဲ? Applied ML web solution အတွက် architectural model တစ်ခုကို ရေးဆွဲပါ။ + +## Assignment + +[မော်ဒယ်တစ်ခုကို စမ်းကြည့်ပါ](assignment.md) + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူရင်းဘာသာစကားဖြင့် အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/3-Web-App/1-Web-App/assignment.md b/translations/my/3-Web-App/1-Web-App/assignment.md new file mode 100644 index 00000000..b2d7682f --- /dev/null +++ b/translations/my/3-Web-App/1-Web-App/assignment.md @@ -0,0 +1,25 @@ + +# မော်ဒယ်တစ်ခုကို ပြောင်းလဲစမ်းကြည့်ပါ + +## လမ်းညွှန်ချက်များ + +Regression မော်ဒယ်တစ်ခုကို သင်အသုံးပြုပြီး web app တစ်ခုကို တည်ဆောက်ပြီးပြီဆိုရင်၊ Regression သင်ခန်းစာအရင်ပိုင်းက မော်ဒယ်တစ်ခုကို အသုံးပြုပြီး web app ကို ပြန်လုပ်ပါ။ ဒီ app ရဲ့ ပုံစံကို ထိန်းသိမ်းထားနိုင်သလို၊ သို့မဟုတ် သင့်ရဲ့ pumpkin data ကို ပြသနိုင်အောင် ပုံစံအသစ်တစ်ခုအဖြစ် ဒီဇိုင်းပြောင်းလဲနိုင်ပါတယ်။ သင့်မော်ဒယ်ရဲ့ လေ့ကျင့်ပုံစံကို ထင်ဟပ်အောင် input တွေကို ပြောင်းလဲဖို့ သတိထားပါ။ + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက်များ | ထူးချွန်သောအဆင့် | လုံလောက်သောအဆင့် | တိုးတက်မှုလိုအပ်သောအဆင့် | +| -------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------- | +| | web app သည် မျှော်မှန်းထားသလို အလုပ်လုပ်ပြီး cloud တွင် တင်ထားသည် | web app တွင် အမှားများရှိပြီး မမျှော်လင့်ထားသော ရလဒ်များကို ပြသသည် | web app သည် မှန်ကန်စွာ အလုပ်မလုပ်ပါ | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မှားယွင်းမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/3-Web-App/README.md b/translations/my/3-Web-App/README.md new file mode 100644 index 00000000..5daca282 --- /dev/null +++ b/translations/my/3-Web-App/README.md @@ -0,0 +1,35 @@ + +# သင့် ML မော်ဒယ်ကို အသုံးပြုနိုင်ရန် Web App တစ်ခု တည်ဆောက်ပါ + +ဒီသင်ခန်းစာအပိုင်းမှာ သင်သည် လက်တွေ့အသုံးချနိုင်သော ML ခေါင်းစဉ်တစ်ခုကို လေ့လာမည်ဖြစ်ပြီး၊ Scikit-learn မော်ဒယ်ကို ဖိုင်အဖြစ် သိမ်းဆည်းပြီး Web Application အတွင်းမှာ ခန့်မှန်းချက်များ ပြုလုပ်နိုင်ရန် အသုံးပြုနည်းကို သင်ယူမည်ဖြစ်သည်။ မော်ဒယ်ကို သိမ်းဆည်းပြီးနောက်၊ Flask ဖြင့် တည်ဆောက်ထားသော Web App အတွင်း၌ မော်ဒယ်ကို အသုံးပြုနည်းကို သင်ယူမည်ဖြစ်သည်။ သင်သည် UFO တွေ့ကြုံမှုများနှင့် ပတ်သက်သော ဒေတာတစ်ခုကို အသုံးပြု၍ မော်ဒယ်တစ်ခုကို စတင်တည်ဆောက်မည်ဖြစ်သည်။ ထို့နောက် သင်သည် latitude နှင့် longitude တန်ဖိုးများနှင့်အတူ စက္ကန့်အရေအတွက်တစ်ခုကို ထည့်သွင်းပြီး UFO တွေ့ကြုံမှုကို ဘယ်နိုင်ငံမှ သတင်းပို့ခဲ့သည်ကို ခန့်မှန်းနိုင်မည့် Web App တစ်ခုကို တည်ဆောက်မည်ဖြစ်သည်။ + +![UFO Parking](../../../3-Web-App/images/ufo.jpg) + +ဓာတ်ပုံ - Michael Herren မှ Unsplash တွင် ရရှိသည်။ + +## သင်ခန်းစာများ + +1. [Web App တစ်ခု တည်ဆောက်ခြင်း](1-Web-App/README.md) + +## အထူးကျေးဇူးတင်စကား + +"Web App တစ်ခု တည်ဆောက်ခြင်း" ကို [Jen Looper](https://twitter.com/jenlooper) မှ ♥️ ဖြင့် ရေးသားထားပါသည်။ + +♥️ စစ်ဆေးမေးခွန်းများကို Rohan Raj မှ ရေးသားထားပါသည်။ + +ဒေတာအစုအဖွဲ့ကို [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings) မှ ရယူထားပါသည်။ + +Web App အဆောက်အဦးကို [ဒီဆောင်းပါး](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) နှင့် [ဒီ repo](https://github.com/abhinavsagar/machine-learning-deployment) မှ Abhinav Sagar ၏ အကြံပြုချက်အချို့အပေါ် အခြေခံ၍ တည်ဆောက်ထားပါသည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/1-Introduction/README.md b/translations/my/4-Classification/1-Introduction/README.md new file mode 100644 index 00000000..4a97dbd9 --- /dev/null +++ b/translations/my/4-Classification/1-Introduction/README.md @@ -0,0 +1,309 @@ + +# အမျိုးအစားခွဲခြားမှုကိုမိတ်ဆက်ခြင်း + +ဒီသင်ခန်းစာလေးခုမှာ သင်သည် အခြေခံစက်ရုပ်သင်ယူမှု၏ အရေးပါသောအချက်တစ်ခုဖြစ်သော _အမျိုးအစားခွဲခြားမှု_ ကိုလေ့လာမည်ဖြစ်သည်။ အာရှနှင့်အိန္ဒိယ၏ အံ့ဩဖွယ်အစားအစာများနှင့်ပတ်သက်သောဒေတာအချက်အလက်များကို အသုံးပြု၍ အမျိုးအစားခွဲခြားမှုအယ်လဂိုရစ်သမ်များကို အသုံးပြုခြင်းကို လေ့လာမည်ဖြစ်သည်။ အစားအသောက်အတွက်ဆာလောင်နေတယ်လို့မျှော်လင့်ပါတယ်! + +![just a pinch!](../../../../4-Classification/1-Introduction/images/pinch.png) + +> ဒီသင်ခန်းစာတွေမှာ အာရှအစားအစာတွေကို ကျေးဇူးတင်ပါ။ ပုံကို [Jen Looper](https://twitter.com/jenlooper) မှဖန်တီးထားသည်။ + +အမျိုးအစားခွဲခြားမှုသည် [supervised learning](https://wikipedia.org/wiki/Supervised_learning) ၏ အမျိုးအစားတစ်ခုဖြစ်ပြီး regression နည်းလမ်းများနှင့် ဆင်တူသောအချက်များစွာပါရှိသည်။ စက်ရုပ်သင်ယူမှုသည် ဒေတာအချက်အလက်များကို အသုံးပြု၍ တန်ဖိုးများ သို့မဟုတ် အမည်များကို ခန့်မှန်းခြင်းနှင့်ပတ်သက်သည်ဆိုပါက အမျိုးအစားခွဲခြားမှုသည် အဓိကအားဖြင့် _binary classification_ နှင့် _multiclass classification_ ဆိုသောအုပ်စုနှစ်ခုအတွင်းတွင်ပါဝင်သည်။ + +[![Introduction to classification](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Introduction to classification") + +> 🎥 အထက်ပါပုံကိုနှိပ်ပြီးဗီဒီယိုကြည့်ပါ။ MIT မှ John Guttag သည် အမျိုးအစားခွဲခြားမှုကိုမိတ်ဆက်သည်။ + +သတိထားပါ: + +- **Linear regression** သည် အပြောင်းအလဲများအကြားဆက်နွယ်မှုများကို ခန့်မှန်းရန်နှင့် အချက်အလက်အသစ်တစ်ခုသည် အဲဒီလိုင်းနှင့်ဆက်နွယ်မှုအတွင်းမှာ ရောက်ရှိမည့်နေရာကို မှန်ကန်စွာခန့်မှန်းရန် ကူညီပေးသည်။ ဥပမာအားဖြင့် _ဖွံ့ဖြိုးမှုအချိန်အလိုက် ဖရဲသီး၏စျေးနှုန်းကို ခန့်မှန်းနိုင်သည်_။ +- **Logistic regression** သည် "binary categories" ကို ရှာဖွေရာတွင် ကူညီပေးသည်။ ဥပမာအားဖြင့် _ဤစျေးနှုန်းတွင် ဖရဲသီးသည် လိမ္မော်ရောင်ဖြစ်မည်လား၊ မဖြစ်မည်လား_? + +အမျိုးအစားခွဲခြားမှုသည် အချက်အလက်တစ်ခု၏ label သို့မဟုတ် class ကို သတ်မှတ်ရန် အခြားနည်းလမ်းများကို သတ်မှတ်ရန် အယ်လဂိုရစ်သမ်များကို အသုံးပြုသည်။ အစားအစာဒေတာကို အသုံးပြု၍ အဖွဲ့အစည်းတစ်ခု၏ အစိတ်အပိုင်းများကို ကြည့်ရှုခြင်းဖြင့် အစားအစာ၏မူလအမျိုးအစားကို သတ်မှတ်နိုင်မည်လားဆိုတာကို လေ့လာကြည့်ပါ။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +> ### [ဒီသင်ခန်းစာကို R မှာလည်းရနိုင်ပါတယ်!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html) + +### မိတ်ဆက် + +အမျိုးအစားခွဲခြားမှုသည် စက်ရုပ်သင်ယူမှုသုတေသနရှင်နှင့် ဒေတာသိပ္ပံပညာရှင်၏ အခြေခံလုပ်ငန်းများထဲမှတစ်ခုဖြစ်သည်။ binary value ("ဤအီးမေးလ်သည် spam ဖြစ်ပါသလား၊ မဖြစ်ပါသလား") ကို အခြေခံ၍ အမျိုးအစားခွဲခြားမှုမှစ၍ computer vision ကိုအသုံးပြု၍ ရုပ်ပုံခွဲခြားမှုနှင့် segmentation အထိ၊ ဒေတာကို အမျိုးအစားများအလိုက်ခွဲခြားရန်နှင့် မေးခွန်းများမေးရန် အမြဲအသုံးဝင်သည်။ + +သိပ္ပံပညာဆန်သောနည်းလမ်းဖြင့် ပြောရမည်ဆိုပါက သင်၏အမျိုးအစားခွဲခြားမှုနည်းလမ်းသည် input variables နှင့် output variables အကြားဆက်နွယ်မှုကို map လုပ်ရန် ခန့်မှန်းမှုမော်ဒယ်တစ်ခုကို ဖန်တီးပေးသည်။ + +![binary vs. multiclass classification](../../../../4-Classification/1-Introduction/images/binary-multiclass.png) + +> Binary vs. multiclass problems အမျိုးအစားခွဲခြားမှုအယ်လဂိုရစ်သမ်များကို ကိုင်တွယ်ရန်။ Infographic by [Jen Looper](https://twitter.com/jenlooper) + +ဒေတာကို သန့်စင်ခြင်း၊ visualization ပြုလုပ်ခြင်းနှင့် ML tasks များအတွက် ပြင်ဆင်ခြင်းလုပ်ငန်းစဉ်ကို စတင်မတိုင်မီ စက်ရုပ်သင်ယူမှုကို အသုံးပြု၍ ဒေတာကို အမျိုးအစားခွဲခြားရန် နည်းလမ်းများအကြောင်းကို နည်းနည်းလေ့လာကြည့်ပါ။ + +[statistics](https://wikipedia.org/wiki/Statistical_classification) မှ ဆင်းသက်လာသော classic machine learning ကို အသုံးပြု၍ classification သည် `smoker`, `weight`, နှင့် `age` ကဲ့သို့သော features များကို အသုံးပြု၍ _X ရောဂါဖြစ်ပွားနိုင်မှု_ ကို သတ်မှတ်ပေးသည်။ သင်မကြာသေးမီက လုပ်ဆောင်ခဲ့သော regression လေ့ကျင့်ခန်းများနှင့် ဆင်တူသော supervised learning နည်းလမ်းတစ်ခုအဖြစ် သင်၏ဒေတာသည် label လုပ်ထားပြီး ML အယ်လဂိုရစ်သမ်များသည် အဲဒီ label များကို အသုံးပြု၍ ဒေတာအချက်အလက်များ၏ အမျိုးအစားများ (သို့မဟုတ် 'features') ကို ခွဲခြားရန်နှင့် အုပ်စု သို့မဟုတ် ရလဒ်တစ်ခုသို့ သတ်မှတ်ရန် ကူညီပေးသည်။ + +✅ အစားအစာများနှင့်ပတ်သက်သောဒေတာအချက်အလက်တစ်ခုကို စိတ်ကူးကြည့်ပါ။ multiclass မော်ဒယ်သည် ဘာကိုဖြေရှင်းနိုင်မည်လဲ? binary မော်ဒယ်သည် ဘာကိုဖြေရှင်းနိုင်မည်လဲ? ဥပမာအားဖြင့် အစားအစာတစ်ခုသည် fenugreek ကို အသုံးပြုမည်လားမသုံးမည်လားဆိုတာကို သတ်မှတ်နိုင်မည်လား? သို့မဟုတ် star anise, artichokes, cauliflower, နှင့် horseradish တို့ပါဝင်သော grocery bag တစ်ခုကို ပေးလှူခဲ့ပါက အိန္ဒိယအစားအစာတစ်မျိုးကို ဖန်တီးနိုင်မည်လား? + +[![Crazy mystery baskets](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Crazy mystery baskets") + +> 🎥 အထက်ပါပုံကိုနှိပ်ပြီးဗီဒီယိုကြည့်ပါ။ 'Chopped' ဆိုသောရုပ်ရှင်၏ အဓိကအကြောင်းအရာမှာ 'mystery basket' ဖြစ်ပြီး ချက်ပြုတ်သူများသည် အလွတ်ရွေးချယ်ထားသောအစားအစာများကို အသုံးပြု၍ အစားအစာတစ်မျိုးကို ပြုလုပ်ရမည်။ ML မော်ဒယ်တစ်ခုက အကူအညီပေးနိုင်မည်ဖြစ်သည်။ + +## Hello 'classifier' + +ဤအစားအစာဒေတာအချက်အလက်ကို သင်မေးလိုသောမေးခွန်းသည် **multiclass question** ဖြစ်သည်။ အကြောင်းမှာ အမျိုးအစားများစွာရှိပြီး အစားအစာအစုတစ်ခုသည် အဲဒီအမျိုးအစားများထဲမှ မည်သည့်အမျိုးအစားနှင့် ကိုက်ညီမည်လဲဆိုတာကို သတ်မှတ်ရန်လိုအပ်သည်။ + +Scikit-learn သည် အမျိုးအစားခွဲခြားရန် သင်လိုအပ်သောပြဿနာအမျိုးအစားပေါ်မူတည်၍ အမျိုးမျိုးသောအယ်လဂိုရစ်သမ်များကို ပေးသည်။ နောက်ထပ်သင်ခန်းစာနှစ်ခုတွင် သင်သည် အယ်လဂိုရစ်သမ်များအကြောင်းကို လေ့လာမည်ဖြစ်သည်။ + +## လေ့ကျင့်ခန်း - သင်၏ဒေတာကို သန့်စင်ပြီး balance လုပ်ပါ + +ဤပရောဂျက်ကို စတင်မတိုင်မီ ပထမဦးဆုံးလုပ်ဆောင်ရမည့်အလုပ်မှာ သင်၏ဒေတာကို သန့်စင်ပြီး **balance** လုပ်ခြင်းဖြစ်သည်။ ဤဖိုလ်ဒါ၏ root တွင်ရှိသော blank _notebook.ipynb_ ဖိုင်ကို စတင်ပါ။ + +ပထမဦးဆုံး install လုပ်ရမည့်အရာမှာ [imblearn](https://imbalanced-learn.org/stable/) ဖြစ်သည်။ ၎င်းသည် Scikit-learn package တစ်ခုဖြစ်ပြီး ဒေတာကို ပိုမို balance လုပ်ရန် ကူညီပေးမည် (ဤအလုပ်ကို နည်းနည်းအကြောင်းသိရှိမည်)။ + +1. `imblearn` ကို install လုပ်ရန် `pip install` ကို အောက်ပါအတိုင်း run လုပ်ပါ: + + ```python + pip install imblearn + ``` + +1. သင်၏ဒေတာကို import လုပ်ရန်လိုအပ်သော packages များကို import လုပ်ပြီး visualize လုပ်ပါ၊ `imblearn` မှ `SMOTE` ကိုလည်း import လုပ်ပါ။ + + ```python + import pandas as pd + import matplotlib.pyplot as plt + import matplotlib as mpl + import numpy as np + from imblearn.over_sampling import SMOTE + ``` + + ယခု သင်သည် ဒေတာကို import လုပ်ရန် ပြင်ဆင်ပြီးဖြစ်သည်။ + +1. နောက်တစ်ခုလုပ်ဆောင်ရမည့်အလုပ်မှာ ဒေတာကို import လုပ်ခြင်းဖြစ်သည်: + + ```python + df = pd.read_csv('../data/cuisines.csv') + ``` + + `read_csv()` ကို အသုံးပြု၍ _cusines.csv_ ဆိုသော csv ဖိုင်၏ content ကို ဖတ်ပြီး `df` variable ထဲသို့ ထည့်သွင်းပါ။ + +1. ဒေတာ၏ shape ကို စစ်ဆေးပါ: + + ```python + df.head() + ``` + + ပထမဦးဆုံး rows ၅ ခုသည် အောက်ပါအတိုင်းဖြစ်သည်: + + ```output + | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | + | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | + | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + ``` + +1. ဤဒေတာအကြောင်းကို `info()` ကိုခေါ်၍ သိရှိပါ: + + ```python + df.info() + ``` + + သင်၏ output သည် အောက်ပါအတိုင်းဖြစ်သည်: + + ```output + + RangeIndex: 2448 entries, 0 to 2447 + Columns: 385 entries, Unnamed: 0 to zucchini + dtypes: int64(384), object(1) + memory usage: 7.2+ MB + ``` + +## လေ့ကျင့်ခန်း - အစားအစာအမျိုးအစားများကိုလေ့လာခြင်း + +ယခုအလုပ်သည် ပိုမိုစိတ်ဝင်စားဖွယ်ဖြစ်လာသည်။ ဒေတာ၏ distribution ကို အမျိုးအစားအလိုက် ရှာဖွေကြည့်ပါ။ + +1. `barh()` ကိုခေါ်၍ ဒေတာကို bars အဖြစ် plot လုပ်ပါ: + + ```python + df.cuisine.value_counts().plot.barh() + ``` + + ![cuisine data distribution](../../../../4-Classification/1-Introduction/images/cuisine-dist.png) + + အမျိုးအစားများသည် အကန့်အသတ်ရှိသော်လည်း ဒေတာ၏ distribution သည် မညီမျှပါ။ သင်သည် အဲဒီကို ပြင်ဆင်နိုင်သည်! ပြင်ဆင်မတိုင်မီ နည်းနည်းလေ့လာပါ။ + +1. အမျိုးအစားအလိုက် ရရှိနိုင်သောဒေတာပမာဏကို ရှာဖွေပြီး print ထုတ်ပါ: + + ```python + thai_df = df[(df.cuisine == "thai")] + japanese_df = df[(df.cuisine == "japanese")] + chinese_df = df[(df.cuisine == "chinese")] + indian_df = df[(df.cuisine == "indian")] + korean_df = df[(df.cuisine == "korean")] + + print(f'thai df: {thai_df.shape}') + print(f'japanese df: {japanese_df.shape}') + print(f'chinese df: {chinese_df.shape}') + print(f'indian df: {indian_df.shape}') + print(f'korean df: {korean_df.shape}') + ``` + + output သည် အောက်ပါအတိုင်းဖြစ်သည်: + + ```output + thai df: (289, 385) + japanese df: (320, 385) + chinese df: (442, 385) + indian df: (598, 385) + korean df: (799, 385) + ``` + +## အစားအစာပစ္စည်းများကိုရှာဖွေခြင်း + +ယခု သင်သည် ဒေတာကို နက်ရှိုင်းစွာရှာဖွေပြီး အမျိုးအစားအလိုက် အစားအစာပစ္စည်းများကို သိရှိနိုင်သည်။ အမျိုးအစားများအကြား ရှုပ်ထွေးမှုကို ဖြစ်စေသော ထပ်တူဖြစ်သောဒေတာများကို ဖယ်ရှားရန်လိုအပ်သည်၊ ထို့ကြောင့်ဤပြဿနာအကြောင်းကို လေ့လာကြည့်ပါ။ + +1. Python တွင် `create_ingredient()` ဆိုသော function တစ်ခုကို ဖန်တီးပါ။ ဤ function သည် မအသုံးဝင်သော column တစ်ခုကို drop လုပ်ပြီး အစားအစာပစ္စည်းများကို count အလိုက် sort လုပ်ပါမည်: + + ```python + def create_ingredient_df(df): + ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') + ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] + ingredient_df = ingredient_df.sort_values(by='value', ascending=False, + inplace=False) + return ingredient_df + ``` + + ယခု သင်သည် function ကို အသုံးပြု၍ အမျိုးအစားအလိုက် အစားအစာပစ္စည်းများ၏ ထိပ်ဆုံး ၁၀ ခုကို သိရှိနိုင်သည်။ + +1. `create_ingredient()` ကိုခေါ်ပြီး `barh()` ကိုခေါ်၍ plot လုပ်ပါ: + + ```python + thai_ingredient_df = create_ingredient_df(thai_df) + thai_ingredient_df.head(10).plot.barh() + ``` + + ![thai](../../../../4-Classification/1-Introduction/images/thai.png) + +1. ဂျပန်ဒေတာအတွက်လည်း အလားတူလုပ်ဆောင်ပါ: + + ```python + japanese_ingredient_df = create_ingredient_df(japanese_df) + japanese_ingredient_df.head(10).plot.barh() + ``` + + ![japanese](../../../../4-Classification/1-Introduction/images/japanese.png) + +1. ယခုတစ်ခါ တရုတ်အစားအစာပစ္စည်းများအတွက်: + + ```python + chinese_ingredient_df = create_ingredient_df(chinese_df) + chinese_ingredient_df.head(10).plot.barh() + ``` + + ![chinese](../../../../4-Classification/1-Introduction/images/chinese.png) + +1. အိန္ဒိယအစားအစာပစ္စည်းများကို plot လုပ်ပါ: + + ```python + indian_ingredient_df = create_ingredient_df(indian_df) + indian_ingredient_df.head(10).plot.barh() + ``` + + ![indian](../../../../4-Classification/1-Introduction/images/indian.png) + +1. နောက်ဆုံးတွင် ကိုရီးယားအစားအစာပစ္စည်းများကို plot လုပ်ပါ: + + ```python + korean_ingredient_df = create_ingredient_df(korean_df) + korean_ingredient_df.head(10).plot.barh() + ``` + + ![korean](../../../../4-Classification/1-Introduction/images/korean.png) + +1. အမျိုးအစားများအကြား ရှုပ်ထွေးမှုကို ဖြစ်စေသော အစားအစာပစ္စည်းများကို drop လုပ်ပါ။ + + အားလုံး rice, garlic, နှင့် ginger ကိုချစ်ကြသည်! + + ```python + feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) + labels_df = df.cuisine #.unique() + feature_df.head() + ``` + +## ဒေတာကို balance လုပ်ပါ + +ယခု သင်သည် ဒေတာကို သန့်စင်ပြီးဖြစ်သည်၊ [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Synthetic Minority Over-sampling Technique" - ကို အသုံးပြု၍ balance လုပ်ပါ။ + +1. `fit_resample()` ကိုခေါ်ပါ၊ ဤနည်းလမ်းသည် interpolation ဖြင့် sample အသစ်များကို ဖန်တီးပေးသည်။ + + ```python + oversample = SMOTE() + transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df) + ``` + + သင်၏ဒေတာကို balance လုပ်ခြင်းဖြင့် classification လုပ်ရာတွင် ပိုမိုကောင်းမွန်သောရလဒ်များရရှိမည်ဖြစ်သည်။ binary classification ကိုစဉ်းစားပါ။ သင်၏ဒေတာအများစုသည် class တစ်ခုဖြစ်ပါက ML မော်ဒယ်သည် အဲဒီ class ကို ပိုမိုခန့်မှန်းမည်ဖြစ်သည်၊ အကြောင်းမှာ အဲဒီ class အတွက် ဒေတာများပိုမိုရှိသောကြောင့်ဖြစ်သည်။ ဒေတာကို balance လုပ်ခြင်းသည် skewed data များကို ဖယ်ရှားပြီး ဤမညီမျှမှုကို ဖြေရှင်းပေးသည်။ + +1. ယခု သင်သည် label များ၏ numbers ကို ingredient အလိုက် စစ်ဆေးနိုင်သည်: + + ```python + print(f'new label count: {transformed_label_df.value_counts()}') + print(f'old label count: {df.cuisine.value_counts()}') + ``` + + သင်၏ output သည် အောက်ပါအတိုင်းဖြစ်သည်: + + ```output + new label count: korean 799 + chinese 799 + indian 799 + japanese 799 + thai 799 + Name: cuisine, dtype: int64 + old label count: korean 799 + indian 598 + chinese 442 + japanese 320 + thai 289 + Name: cuisine, dtype: int64 + ``` + + ဒေတာသည် သန့်စင်ပြီး balance လုပ်ထားပြီး အရသာရှိသောအခြေအနေတွင်ရှိသည်! + +1. နောက်ဆုံးအဆင့်မှာ label များနှင့် features များပါဝင်သော balanced data ကို အသစ်သော dataframe ထဲသို့ သိမ်းဆည်းပြီး ဖိုင်အဖြစ် export လုပ်ရန်ဖြစ်သည်: + + ```python + transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer') + ``` + +1. `transformed_df.head()` နှင့် `transformed_df.info()` ကို အသုံးပြု၍ ဒေတာကို နောက်တစ်ကြိမ်ကြည့်ပါ။ ဤဒေတာကို အနာဂတ်သင်ခန်းစာများတွင် အသုံးပြုရန်အတွက် copy တစ်ခု save လုပ်ပါ: + + ```python + transformed_df.head() + transformed_df.info() + transformed_df.to_csv("../data/cleaned_cuisines.csv") + ``` + + ဤအသစ်သော CSV ကို ယခု root data folder တွင်တွေ့နိုင်ပါသည်။ + +--- + +## 🚀Challenge + +ဤသင်ခန်းစာတွင် စိတ်ဝင်စားဖွယ်ဒေတာအချက်အလက်များစွာပါဝင်သည်။ `data` folder များကို ရှာဖွေကြည့်ပြီး binary classification သို့မဟုတ် multi-class classification အတွက် သင့်လျော်သောဒေတာအချက်အလက်များပါဝင်ပါသလားဆိုတာကို စစ်ဆေးပါ။ ဤဒေတာအချက်အလက်များကို သင်မေးလိုသောမေးခွန်းများက ဘာတွေလဲ? + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Review & Self Study + +SMOTE ၏ API ကိုလေ့လာပါ။ ၎င်းကို အသုံးပြုရန်အကောင်း + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မှန်ကန်မှုမရှိသောအချက်များ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူသားပညာရှင်များမှ ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/1-Introduction/assignment.md b/translations/my/4-Classification/1-Introduction/assignment.md new file mode 100644 index 00000000..5f817631 --- /dev/null +++ b/translations/my/4-Classification/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# အမျိုးအစားခွဲခြားမှုနည်းလမ်းများကိုလေ့လာပါ + +## လမ်းညွှန်ချက်များ + +[Scikit-learn documentation](https://scikit-learn.org/stable/supervised_learning.html) တွင် ဒေတာများကိုအမျိုးအစားခွဲခြားရန်နည်းလမ်းများစွာကိုတွေ့နိုင်ပါသည်။ ဒီစာရွက်စာတမ်းများကိုရှာဖွေကြည့်ပါ: သင့်ရည်မှန်းချက်မှာ အမျိုးအစားခွဲခြားမှုနည်းလမ်းများကိုရှာဖွေပြီး ဒီသင်ခန်းစာတွင်ပါဝင်သောဒေတာတစ်ခု၊ ဒေတာအပေါ်မေးခွန်းတစ်ခု၊ နှင့် အမျိုးအစားခွဲခြားမှုနည်းလမ်းတစ်ခုကိုတူညီစေဖို့ဖြစ်သည်။ စာရင်းဇယားတစ်ခု သို့မဟုတ် .doc ဖိုင်တွင်ဇယားတစ်ခုဖန်တီးပြီး ဒေတာသည် အမျိုးအစားခွဲခြားမှုအယ်လဂိုရစ်သို့မည်သို့အလုပ်လုပ်မည်ကိုရှင်းပြပါ။ + +## အဆင့်သတ်မှတ်ချက် + +| စံနှုန်း | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သည် | +| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| | အယ်လဂိုရစ် ၅ ခုနှင့်အမျိုးအစားခွဲခြားမှုနည်းလမ်းကိုအကျဉ်းချုပ်ထားသောစာရွက်စာတမ်းတစ်ခုကိုတင်ပြသည်။ အကျဉ်းချုပ်သည်ကောင်းမွန်ပြီးအသေးစိတ်ပါဝင်သည်။ | အယ်လဂိုရစ် ၃ ခုနှင့်အမျိုးအစားခွဲခြားမှုနည်းလမ်းကိုအကျဉ်းချုပ်ထားသောစာရွက်စာတမ်းတစ်ခုကိုတင်ပြသည်။ အကျဉ်းချုပ်သည်ကောင်းမွန်ပြီးအသေးစိတ်ပါဝင်သည်။ | အယ်လဂိုရစ် ၃ ခုအောက်နှင့်အမျိုးအစားခွဲခြားမှုနည်းလမ်းကိုအကျဉ်းချုပ်ထားသောစာရွက်စာတမ်းတစ်ခုကိုတင်ပြသည်။ အကျဉ်းချုပ်သည်ကောင်းမွန်ခြင်းမရှိဘဲအသေးစိတ်ပါဝင်ခြင်းမရှိပါ။ | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူသားပညာရှင်များမှ ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/1-Introduction/solution/Julia/README.md b/translations/my/4-Classification/1-Introduction/solution/Julia/README.md new file mode 100644 index 00000000..361f3682 --- /dev/null +++ b/translations/my/4-Classification/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသောအချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/2-Classifiers-1/README.md b/translations/my/4-Classification/2-Classifiers-1/README.md new file mode 100644 index 00000000..18795b16 --- /dev/null +++ b/translations/my/4-Classification/2-Classifiers-1/README.md @@ -0,0 +1,253 @@ + +# Cuisine classifiers 1 + +ဒီသင်ခန်းစာမှာ မိမိအရင်သင်ခန်းစာမှာ သိမ်းဆည်းထားတဲ့ အစားအစာအမျိုးအစားများနှင့်ပတ်သက်သော အချက်အလက်များကို အသုံးပြုပါမည်။ + +ဒီအချက်အလက်များကို အသုံးပြုပြီး _ပစ္စည်းများအုပ်စုအပေါ်မူတည်၍ အမျိုးသားအစားအစာကို ခန့်မှန်းနိုင်ရန်_ အမျိုးမျိုးသော classifiers များကို အသုံးပြုပါမည်။ ဒီလုပ်ငန်းစဉ်တွင် classification tasks များအတွက် algorithm များကို ဘယ်လိုအသုံးချနိုင်သည်ဆိုတာကို ပိုမိုလေ့လာနိုင်ပါမည်။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) +# ပြင်ဆင်မှု + +[Lesson 1](../1-Introduction/README.md) ကို ပြီးမြောက်ထားသည်ဟု ခန့်မှန်းပါက, _cleaned_cuisines.csv_ ဖိုင်ကို `/data` folder ရဲ့ root မှာ ရှိနေဖို့ သေချာပါစေ။ + +## လေ့ကျင့်ခန်း - အမျိုးသားအစားအစာကို ခန့်မှန်းပါ + +1. ဒီသင်ခန်းစာရဲ့ _notebook.ipynb_ folder မှာ Pandas library နဲ့အတူ ဖိုင်ကို import လုပ်ပါ: + + ```python + import pandas as pd + cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") + cuisines_df.head() + ``` + + အချက်အလက်တွေက ဒီလိုပုံစံနဲ့ ရှိပါမယ်: + +| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | +| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + + +1. အခြား libraries များကို import လုပ်ပါ: + + ```python + from sklearn.linear_model import LogisticRegression + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + from sklearn.svm import SVC + import numpy as np + ``` + +1. X နဲ့ y coordinates ကို training အတွက် dataframes နှစ်ခုအဖြစ် ခွဲပါ။ `cuisine` ကို labels dataframe အဖြစ် သတ်မှတ်ပါ: + + ```python + cuisines_label_df = cuisines_df['cuisine'] + cuisines_label_df.head() + ``` + + ဒါဟာ ဒီလိုပုံစံနဲ့ ရှိပါမယ်: + + ```output + 0 indian + 1 indian + 2 indian + 3 indian + 4 indian + Name: cuisine, dtype: object + ``` + +1. `Unnamed: 0` column နဲ့ `cuisine` column ကို `drop()` ကိုခေါ်ပြီး ဖယ်ရှားပါ။ ကျန်တဲ့ data ကို trainable features အဖြစ် သိမ်းဆည်းပါ: + + ```python + cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) + cuisines_feature_df.head() + ``` + + Features တွေက ဒီလိုပုံစံနဲ့ ရှိပါမယ်: + +| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | + +အခုတော့ မိမိရဲ့ model ကို training လုပ်ဖို့ အဆင်သင့်ဖြစ်ပါပြီ! + +## Classifier ရွေးချယ်ခြင်း + +အချက်အလက်တွေကို training လုပ်ဖို့ အဆင်သင့်ဖြစ်ပြီးနောက်, မိမိလုပ်ငန်းစဉ်အတွက် algorithm ကို ရွေးချယ်ရပါမည်။ + +Scikit-learn က classification ကို Supervised Learning အဖြစ် grouping လုပ်ပြီး, အဲဒီ category မှာ classification လုပ်နိုင်တဲ့ နည်းလမ်းများစွာကို တွေ့နိုင်ပါမည်။ [အမျိုးမျိုးသောနည်းလမ်းများ](https://scikit-learn.org/stable/supervised_learning.html) ကို ပထမဆုံးကြည့်တဲ့အခါ အတော်လေးရှုပ်ထွေးစေပါသည်။ အောက်ပါနည်းလမ်းများသည် classification techniques များပါဝင်သည်: + +- Linear Models +- Support Vector Machines +- Stochastic Gradient Descent +- Nearest Neighbors +- Gaussian Processes +- Decision Trees +- Ensemble methods (voting Classifier) +- Multiclass and multioutput algorithms (multiclass and multilabel classification, multiclass-multioutput classification) + +> [neural networks](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification) ကို data classification အတွက် အသုံးပြုနိုင်သော်လည်း, ဒီသင်ခန်းစာရဲ့ အကျိုးအာနိသင်အတွင်းမှာ မပါဝင်ပါ။ + +### ဘယ် classifier ကို သုံးမလဲ? + +ဒါဆို, ဘယ် classifier ကို သုံးသင့်သလဲ? အများအားဖြင့်, အမျိုးမျိုးကို run လုပ်ပြီး ရလဒ်ကောင်းတစ်ခုကို ရှာဖွေခြင်းသည် စမ်းသပ်မှုတစ်ခုဖြစ်သည်။ Scikit-learn က [side-by-side comparison](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) ကို dataset တစ်ခုမှာ ပြုလုပ်ပြီး, KNeighbors, SVC နှစ်မျိုး, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB နဲ့ QuadraticDiscrinationAnalysis တို့ကို visualized ရလဒ်များဖြင့် နှိုင်းယှဉ်ပြထားသည်: + +![comparison of classifiers](../../../../4-Classification/2-Classifiers-1/images/comparison.png) +> Scikit-learn ရဲ့ documentation မှ Plots + +> AutoML က ဒီပြဿနာကို cloud မှာ comparison များ run လုပ်ခြင်းဖြင့် အလွယ်တကူ ဖြေရှင်းပေးပြီး, မိမိ data အတွက် algorithm အကောင်းဆုံးကို ရွေးချယ်နိုင်စေသည်။ [ဒီမှာ](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott) စမ်းသပ်ကြည့်ပါ။ + +### ပိုမိုကောင်းမွန်တဲ့နည်းလမ်း + +အကြံပေးမှုများကို လိုက်နာခြင်းသည် wild guessing လုပ်ခြင်းထက် ပိုမိုကောင်းမွန်ပါသည်။ [ML Cheat sheet](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott) ကို download လုပ်ပြီး, multiclass problem အတွက် ရွေးချယ်စရာများကို ရှာဖွေကြည့်ပါ: + +![cheatsheet for multiclass problems](../../../../4-Classification/2-Classifiers-1/images/cheatsheet.png) +> Microsoft's Algorithm Cheat Sheet ရဲ့ multiclass classification options ကို ဖော်ပြထားသော အပိုင်း + +✅ Cheat sheet ကို download လုပ်ပြီး, print ထုတ်ထားပြီး မိမိရဲ့ နံရံမှာ တင်ထားပါ! + +### Reasoning + +မိမိရဲ့ constraints တွေကို အခြေခံပြီး အမျိုးမျိုးသောနည်းလမ်းများကို reasoning လုပ်ကြည့်ပါ: + +- **Neural networks မလိုအပ်ပါ**။ မိမိရဲ့ clean ဖြစ်တဲ့ dataset နဲ့ local notebooks မှာ training လုပ်နေတဲ့အခြေအနေကြောင့်, neural networks က ဒီ task အတွက် မလိုအပ်ပါ။ +- **Two-class classifier မလိုအပ်ပါ**။ Two-class classifier ကို မသုံးသင့်ပါ, ဒါကြောင့် one-vs-all ကို မသုံးပါ။ +- **Decision tree သို့မဟုတ် logistic regression သုံးနိုင်ပါ**။ Decision tree သို့မဟုတ် logistic regression ကို multiclass data အတွက် အသုံးပြုနိုင်ပါသည်။ +- **Multiclass Boosted Decision Trees က အခြားပြဿနာကို ဖြေရှင်းသည်**။ Multiclass boosted decision tree က nonparametric tasks များအတွက် အကောင်းဆုံးဖြစ်ပြီး, ranking များကို ဖန်တီးရန်အတွက် အသုံးပြုသည်, ဒါကြောင့် ဒီ task အတွက် မသင့်တော်ပါ။ + +### Scikit-learn ကို အသုံးပြုခြင်း + +Scikit-learn ကို အသုံးပြုပြီး data ကို analysis လုပ်ပါမည်။ သို့သော်, Scikit-learn မှာ logistic regression ကို အသုံးပြုနိုင်တဲ့ နည်းလမ်းများစွာ ရှိပါသည်။ [parameters to pass](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression) ကို ကြည့်ပါ။ + +အဓိကအားဖြင့် `multi_class` နဲ့ `solver` ဆိုတဲ့ parameters နှစ်ခုကို သတ်မှတ်ရန်လိုအပ်ပါသည်။ Scikit-learn ကို logistic regression လုပ်ရန် တောင်းဆိုတဲ့အခါ, `multi_class` value က behavior တစ်ခုကို သတ်မှတ်ပေးပါသည်။ Solver ရဲ့ value က algorithm ကို သတ်မှတ်ပေးပါသည်။ Solvers အားလုံးကို `multi_class` values အားလုံးနဲ့ pair လုပ်လို့ မရပါ။ + +Docs အရ, multiclass case မှာ training algorithm: + +- **one-vs-rest (OvR) scheme ကို အသုံးပြုသည်**, အကယ်၍ `multi_class` option ကို `ovr` အဖြစ် သတ်မှတ်ထားပါက +- **cross-entropy loss ကို အသုံးပြုသည်**, အကယ်၍ `multi_class` option ကို `multinomial` အဖြစ် သတ်မှတ်ထားပါက။ (လက်ရှိမှာ `multinomial` option ကို ‘lbfgs’, ‘sag’, ‘saga’ နဲ့ ‘newton-cg’ solvers တွေကသာ support လုပ်ပါသည်။) + +> 🎓 'scheme' ဆိုတာက 'ovr' (one-vs-rest) သို့မဟုတ် 'multinomial' ဖြစ်နိုင်ပါသည်။ Logistic regression ကို binary classification အတွက် design လုပ်ထားသော်လည်း, ဒီ schemes တွေက multiclass classification tasks များကို ပိုမိုကောင်းမွန်စွာ handle လုပ်နိုင်စေပါသည်။ [source](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/) + +> 🎓 'solver' ကို "optimization problem အတွက် အသုံးပြုမည့် algorithm" အဖြစ် သတ်မှတ်ထားသည်။ [source](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +Scikit-learn က solvers တွေက data structure မျိုးစုံရဲ့ ပြဿနာများကို handle လုပ်ပုံကို ရှင်းပြထားသော table ကို ပေးထားပါသည်: + +![solvers](../../../../4-Classification/2-Classifiers-1/images/solvers.png) + +## လေ့ကျင့်ခန်း - data ကို ခွဲခြားပါ + +မိမိအရင်သင်ခန်းစာမှာ logistic regression ကို လေ့လာထားပြီးဖြစ်သောကြောင့်, training trial အတွက် logistic regression ကို အဓိကထားပါမည်။ +`train_test_split()` ကို ခေါ်ပြီး data ကို training group နဲ့ testing group အဖြစ် ခွဲပါ: + +```python +X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) +``` + +## လေ့ကျင့်ခန်း - logistic regression ကို အသုံးပြုပါ + +Multiclass case ကို အသုံးပြုနေသောကြောင့်, မိမိသုံးမည့် _scheme_ နဲ့ _solver_ ကို ရွေးချယ်ရန်လိုအပ်ပါသည်။ LogisticRegression ကို multi_class setting နဲ့ **liblinear** solver ကို သတ်မှတ်ပြီး training လုပ်ပါ။ + +1. multi_class ကို `ovr` အဖြစ် သတ်မှတ်ပြီး solver ကို `liblinear` အဖြစ် သတ်မှတ်ထားသော logistic regression ကို ဖန်တီးပါ: + + ```python + lr = LogisticRegression(multi_class='ovr',solver='liblinear') + model = lr.fit(X_train, np.ravel(y_train)) + + accuracy = model.score(X_test, y_test) + print ("Accuracy is {}".format(accuracy)) + ``` + + ✅ `lbfgs` က default အဖြစ် သတ်မှတ်ထားသော solver ဖြစ်ပြီး, အဲဒီ solver ကို စမ်းသပ်ကြည့်ပါ +> မှတ်ချက်၊ သင့်ဒေတာကိုလိုအပ်သောအခါချောမောစေရန် Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) function ကိုအသုံးပြုပါ။ +အတိအကျမှုသည် **80%** အထက်မှာကောင်းမွန်ပါသည်။ + +1. ဒီမော်ဒယ်ကို စမ်းသပ်ရန်အတွက် ဒေတာတစ်တန်း (#50) ကို စမ်းကြည့်နိုင်သည်- + + ```python + print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') + print(f'cuisine: {y_test.iloc[50]}') + ``` + + ရလဒ်ကို ပုံနှိပ်ထားသည်- + + ```output + ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') + cuisine: indian + ``` + + ✅ အခြားတန်းနံပါတ်ကို စမ်းကြည့်ပြီး ရလဒ်များကို စစ်ဆေးပါ။ + +1. နက်နက်ရှိုင်းရှိုင်း စစ်ဆေးလိုပါက ဒီခန့်မှန်းမှု၏ အတိအကျမှုကို စစ်ဆေးနိုင်သည်- + + ```python + test= X_test.iloc[50].values.reshape(-1, 1).T + proba = model.predict_proba(test) + classes = model.classes_ + resultdf = pd.DataFrame(data=proba, columns=classes) + + topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) + topPrediction.head() + ``` + + ရလဒ်ကို ပုံနှိပ်ထားသည် - အိန္ဒိယအစားအစာဟာ အကောင်းဆုံးခန့်မှန်းချက်ဖြစ်ပြီး အလားအလာကောင်းများပါသည်- + + | | 0 | + | -------: | -------: | + | indian | 0.715851 | + | chinese | 0.229475 | + | japanese | 0.029763 | + | korean | 0.017277 | + | thai | 0.007634 | + + ✅ မော်ဒယ်က အိန္ဒိယအစားအစာဖြစ်တယ်လို့ အတော်လေးသေချာနေတာကို ရှင်းပြနိုင်ပါသလား? + +1. Regression သင်ခန်းစာများတွင် လုပ်ခဲ့သလို Classification Report ကို ပုံနှိပ်ပြီး အသေးစိတ်ကို ရယူပါ- + + ```python + y_pred = model.predict(X_test) + print(classification_report(y_test,y_pred)) + ``` + + | | precision | recall | f1-score | support | + | ------------ | --------- | ------ | -------- | ------- | + | chinese | 0.73 | 0.71 | 0.72 | 229 | + | indian | 0.91 | 0.93 | 0.92 | 254 | + | japanese | 0.70 | 0.75 | 0.72 | 220 | + | korean | 0.86 | 0.76 | 0.81 | 242 | + | thai | 0.79 | 0.85 | 0.82 | 254 | + | accuracy | 0.80 | 1199 | | | + | macro avg | 0.80 | 0.80 | 0.80 | 1199 | + | weighted avg | 0.80 | 0.80 | 0.80 | 1199 | + +## 🚀စိန်ခေါ်မှု + +ဒီသင်ခန်းစာမှာ သင်ရဲ့ သန့်စင်ထားသော ဒေတာကို အသုံးပြုပြီး အစားအစာအမျိုးအစားကို ခန့်မှန်းနိုင်တဲ့ Machine Learning မော်ဒယ်တစ်ခုကို တည်ဆောက်ခဲ့ပါတယ်။ Scikit-learn မှာ ဒေတာကို ခွဲခြားဖို့ ရရှိနိုင်တဲ့ အမျိုးမျိုးသော ရွေးချယ်မှုများကို ဖတ်ရှုရန် အချိန်ယူပါ။ 'solver' ဆိုတဲ့ အယူအဆကို နက်နက်ရှိုင်းရှိုင်း လေ့လာပြီး မော်ဒယ်အတွင်းမှာ ဘာတွေဖြစ်ပျက်နေလဲဆိုတာကို နားလည်ပါ။ + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +Logistic Regression ရဲ့ သင်္ချာဆိုင်ရာ အခြေခံကို နက်နက်ရှိုင်းရှိုင်း လေ့လာရန် [ဒီသင်ခန်းစာ](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf) ကို ဖတ်ရှုပါ။ +## အလုပ်ပေးစာ + +[Solvers ကို လေ့လာပါ](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/2-Classifiers-1/assignment.md b/translations/my/4-Classification/2-Classifiers-1/assignment.md new file mode 100644 index 00000000..ebd4891d --- /dev/null +++ b/translations/my/4-Classification/2-Classifiers-1/assignment.md @@ -0,0 +1,24 @@ + +# ဆော့လ်ဗာများကိုလေ့လာပါ +## လမ်းညွှန်ချက်များ + +ဒီသင်ခန်းစာမှာ မိမိတို့အတန်းထဲမှာ သင်ကြားခဲ့တဲ့ အမျိုးမျိုးသော ဆော့လ်ဗာများအကြောင်းကို သင်လေ့လာခဲ့ပါတယ်။ အဲဒီဆော့လ်ဗာတွေဟာ အယ်လဂိုရစ်သမ်တွေနဲ့ စက်ရုပ်သင်ယူမှုလုပ်ငန်းစဉ်တွေကို တွဲဖက်ပြီး တိကျတဲ့မော်ဒယ်တစ်ခုကို ဖန်တီးပေးနိုင်ပါတယ်။ သင်ခန်းစာမှာ ဖော်ပြထားတဲ့ ဆော့လ်ဗာများကို တစ်ခုချင်းစီ လေ့လာပြီး နှစ်ခုကို ရွေးပါ။ မိမိစကားနဲ့ အဲဒီနှစ်ခုကို နှိုင်းယှဉ်ပြီး ကွာခြားချက်တွေကို ရှင်းပြပါ။ သူတို့က ဘယ်လိုပြဿနာမျိုးကို ဖြေရှင်းပေးနိုင်သလဲ? အမျိုးမျိုးသော ဒေတာဖွဲ့စည်းမှုတွေနဲ့ ဘယ်လိုအလုပ်လုပ်သလဲ? တစ်ခုကို တစ်ခုထက် ဘာကြောင့် ရွေးချယ်မလဲ? + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| -------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------- | +| | ဆော့လ်ဗာနှစ်ခုကို စဉ်ဆက်မပြတ်နှိုင်းယှဉ်ထားသော အပိုဒ်နှစ်ခုပါဝင်သော .doc ဖိုင်တစ်ခုကို တင်ပြထားသည် | ဆော့လ်ဗာတစ်ခုသာ ဖော်ပြထားသော အပိုဒ်တစ်ခုပါဝင်သော .doc ဖိုင်တစ်ခုကို တင်ပြထားသည် | လုပ်ငန်းတာဝန်မပြီးစီးသေးပါ | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/2-Classifiers-1/solution/Julia/README.md b/translations/my/4-Classification/2-Classifiers-1/solution/Julia/README.md new file mode 100644 index 00000000..a07845c7 --- /dev/null +++ b/translations/my/4-Classification/2-Classifiers-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်ကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/3-Classifiers-2/README.md b/translations/my/4-Classification/3-Classifiers-2/README.md new file mode 100644 index 00000000..ad3d6d91 --- /dev/null +++ b/translations/my/4-Classification/3-Classifiers-2/README.md @@ -0,0 +1,249 @@ + +# Cuisine classifiers 2 + +ဒီ classification သင်ခန်းစာအပိုင်း (၂) မှာ သင် numeric data ကို classify လုပ်နိုင်တဲ့ နည်းလမ်းတွေကို ပိုမိုလေ့လာနိုင်မှာဖြစ်ပါတယ်။ အပြင်မှာ classifier တစ်ခုကို ရွေးချယ်တဲ့အခါမှာ ဖြစ်နိုင်တဲ့ အကျိုးဆက်တွေကိုလည်း သင်လေ့လာနိုင်ပါမယ်။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +### ကြိုတင်လိုအပ်ချက် + +သင်ဟာ အရင် lessons တွေကိုပြီးစီးထားပြီး `data` folder ထဲမှာ _cleaned_cuisines.csv_ ဆိုတဲ့ cleaned dataset ကိုရှိထားတယ်လို့ ယူဆပါတယ်။ ဒီ dataset ဟာ lessons (၄) ခုပါဝင်တဲ့ folder ရဲ့ root မှာရှိပါတယ်။ + +### ပြင်ဆင်မှု + +သင့် _notebook.ipynb_ ဖိုင်ကို cleaned dataset နဲ့ loaded လုပ်ပြီး model တည်ဆောက်မှုအတွက် X နဲ့ y dataframes အဖြစ် ခွဲထားပါတယ်။ + +## Classification map + +အရင် lessons မှာ Microsoft ရဲ့ cheat sheet ကို အသုံးပြုပြီး data ကို classify လုပ်နိုင်တဲ့ နည်းလမ်းတွေကို သင်လေ့လာခဲ့ပါတယ်။ Scikit-learn မှာ cheat sheet တစ်ခုလည်းရှိပြီး၊ အဲဒီ cheat sheet က သင့် estimators (classifier ကိုခေါ်တဲ့အခြားအမည်) ကို ပိုမိုကျဉ်းကျဉ်းစစ်နိုင်အောင် ကူညီပေးနိုင်ပါတယ်။ + +![ML Map from Scikit-learn](../../../../4-Classification/3-Classifiers-2/images/map.png) +> Tip: [visit this map online](https://scikit-learn.org/stable/tutorial/machine_learning_map/) နှင့် path ကို click လုပ်ပြီး documentation ကိုဖတ်ပါ။ + +### အစီအစဉ် + +ဒီ map ဟာ သင့် data ကို ရှင်းလင်းစွာနားလည်ပြီးတဲ့အခါမှာ အလွန်အသုံးဝင်ပါတယ်။ သင့် data ကို 'လမ်း' တစ်ခုလိုဖြတ်သန်းပြီး ဆုံးဖြတ်ချက်ကို ရယူနိုင်ပါတယ်။ + +- ကျွန်တော်တို့မှာ >50 samples ရှိပါတယ် +- ကျွန်တော်တို့ category တစ်ခုကို predict လုပ်ချင်ပါတယ် +- ကျွန်တော်တို့မှာ labeled data ရှိပါတယ် +- ကျွန်တော်တို့မှာ 100K samples ထက်နည်းပါတယ် +- ✨ Linear SVC ကို ရွေးချယ်နိုင်ပါတယ် +- အဲဒါမအောင်မြင်ရင်၊ ကျွန်တော်တို့မှာ numeric data ရှိတဲ့အတွက် + - ✨ KNeighbors Classifier ကို စမ်းကြည့်နိုင်ပါတယ် + - အဲဒါမအောင်မြင်ရင် ✨ SVC နဲ့ ✨ Ensemble Classifiers ကို စမ်းကြည့်ပါ + +ဒီလမ်းကြောင်းဟာ အလွန်အသုံးဝင်ပါတယ်။ + +## လေ့ကျင့်မှု - data ကို ခွဲခြားပါ + +ဒီလမ်းကြောင်းကိုလိုက်ပြီး အသုံးပြုရန် libraries တချို့ကို import လုပ်ရပါမယ်။ + +1. လိုအပ်တဲ့ libraries တွေကို Import လုပ်ပါ: + + ```python + from sklearn.neighbors import KNeighborsClassifier + from sklearn.linear_model import LogisticRegression + from sklearn.svm import SVC + from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + import numpy as np + ``` + +1. သင့် training data နဲ့ test data ကို ခွဲခြားပါ: + + ```python + X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) + ``` + +## Linear SVC classifier + +Support-Vector clustering (SVC) ဟာ Support-Vector machines ML techniques မျိုးရိုးရဲ့ အစိတ်အပိုင်းတစ်ခုဖြစ်ပါတယ် (အောက်မှာပိုမိုလေ့လာနိုင်ပါတယ်)။ ဒီနည်းလမ်းမှာ label တွေကို cluster လုပ်ဖို့ 'kernel' ကိုရွေးချယ်နိုင်ပါတယ်။ 'C' parameter ဟာ 'regularization' ကိုဆိုလိုပြီး parameters တွေ၏ အကျိုးသက်ရောက်မှုကို ထိန်းညှိပေးပါတယ်။ Kernel ဟာ [အမျိုးမျိုး](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC) ရှိနိုင်ပြီး၊ ဒီမှာ 'linear' ကို set လုပ်ထားပါတယ်။ Probability ဟာ 'false' အဖြစ် default ဖြစ်ပြီး၊ ဒီမှာ 'true' ကို set လုပ်ထားပါတယ်။ Random state ကို '0' အဖြစ် set လုပ်ထားပြီး data ကို shuffle လုပ်ကာ probabilities ရယူထားပါတယ်။ + +### လေ့ကျင့်မှု - Linear SVC ကို အသုံးပြုပါ + +Classifiers array တစ်ခုကို စတင်ဖန်တီးပါ။ စမ်းသပ်မှုအတိုင်း ဒီ array ကို တိုးချဲ့သွားပါမယ်။ + +1. Linear SVC ကို စတင်ပါ: + + ```python + C = 10 + # Create different classifiers. + classifiers = { + 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0) + } + ``` + +2. Linear SVC ကို အသုံးပြုပြီး model ကို train လုပ်ပြီး report ကို print ထုတ်ပါ: + + ```python + n_classifiers = len(classifiers) + + for index, (name, classifier) in enumerate(classifiers.items()): + classifier.fit(X_train, np.ravel(y_train)) + + y_pred = classifier.predict(X_test) + accuracy = accuracy_score(y_test, y_pred) + print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100)) + print(classification_report(y_test,y_pred)) + ``` + + ရလဒ်က အတော်လည်းကောင်းပါတယ်: + + ```output + Accuracy (train) for Linear SVC: 78.6% + precision recall f1-score support + + chinese 0.71 0.67 0.69 242 + indian 0.88 0.86 0.87 234 + japanese 0.79 0.74 0.76 254 + korean 0.85 0.81 0.83 242 + thai 0.71 0.86 0.78 227 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +## K-Neighbors classifier + +K-Neighbors ဟာ ML methods "neighbors" မျိုးရိုးရဲ့ အစိတ်အပိုင်းတစ်ခုဖြစ်ပြီး supervised နဲ့ unsupervised learning နှစ်မျိုးလုံးမှာ အသုံးပြုနိုင်ပါတယ်။ ဒီနည်းလမ်းမှာ point အရေအတွက်ကို predefined လုပ်ပြီး၊ generalized labels တွေကို predict လုပ်နိုင်ဖို့ data တွေကို အဲဒီ point တွေကို စုစည်းထားပါတယ်။ + +### လေ့ကျင့်မှု - K-Neighbors classifier ကို အသုံးပြုပါ + +အရင် classifier က data နဲ့ အတော်လည်းကောင်းပါတယ်၊ ဒါပေမယ့် accuracy ပိုမိုကောင်းနိုင်မလား စမ်းကြည့်ပါ။ K-Neighbors classifier ကို စမ်းသပ်ပါ။ + +1. Linear SVC item အပြီးမှာ comma ထည့်ပြီး classifier array ကို တိုးချဲ့ပါ: + + ```python + 'KNN classifier': KNeighborsClassifier(C), + ``` + + ရလဒ်က နည်းနည်းပိုမိုဆိုးပါတယ်: + + ```output + Accuracy (train) for KNN classifier: 73.8% + precision recall f1-score support + + chinese 0.64 0.67 0.66 242 + indian 0.86 0.78 0.82 234 + japanese 0.66 0.83 0.74 254 + korean 0.94 0.58 0.72 242 + thai 0.71 0.82 0.76 227 + + accuracy 0.74 1199 + macro avg 0.76 0.74 0.74 1199 + weighted avg 0.76 0.74 0.74 1199 + ``` + + ✅ [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) ကိုလေ့လာပါ + +## Support Vector Classifier + +Support-Vector classifiers ဟာ [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) မျိုးရိုးရဲ့ အစိတ်အပိုင်းတစ်ခုဖြစ်ပြီး classification နဲ့ regression tasks တွေမှာ အသုံးပြုနိုင်ပါတယ်။ SVMs ဟာ "training examples တွေကို အာကာသထဲမှာ point အဖြစ် map လုပ်ပြီး" category နှစ်ခုကြားအကွာအဝေးကို maximize လုပ်ပါတယ်။ နောက်ထပ် data တွေကို အဲဒီအာကာသထဲ map လုပ်ပြီး category ကို predict လုပ်နိုင်ပါတယ်။ + +### လေ့ကျင့်မှု - Support Vector Classifier ကို အသုံးပြုပါ + +Support Vector Classifier ကို အသုံးပြုပြီး accuracy ပိုမိုကောင်းနိုင်မလား စမ်းကြည့်ပါ။ + +1. K-Neighbors item အပြီးမှာ comma ထည့်ပြီး ဒီ line ကို ထည့်ပါ: + + ```python + 'SVC': SVC(), + ``` + + ရလဒ်က အတော်လည်းကောင်းပါတယ်! + + ```output + Accuracy (train) for SVC: 83.2% + precision recall f1-score support + + chinese 0.79 0.74 0.76 242 + indian 0.88 0.90 0.89 234 + japanese 0.87 0.81 0.84 254 + korean 0.91 0.82 0.86 242 + thai 0.74 0.90 0.81 227 + + accuracy 0.83 1199 + macro avg 0.84 0.83 0.83 1199 + weighted avg 0.84 0.83 0.83 1199 + ``` + + ✅ [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm) ကိုလေ့လာပါ + +## Ensemble Classifiers + +အရင် test က အတော်လည်းကောင်းပါတယ်၊ ဒါပေမယ့် လမ်းကြောင်းကို အဆုံးထိလိုက်ကြည့်ပါ။ 'Ensemble Classifiers' ကို စမ်းသပ်ကြည့်ပါ၊ အထူးသဖြင့် Random Forest နဲ့ AdaBoost: + +```python + 'RFST': RandomForestClassifier(n_estimators=100), + 'ADA': AdaBoostClassifier(n_estimators=100) +``` + +ရလဒ်က အတော်လည်းကောင်းပါတယ်၊ အထူးသဖြင့် Random Forest: + +```output +Accuracy (train) for RFST: 84.5% + precision recall f1-score support + + chinese 0.80 0.77 0.78 242 + indian 0.89 0.92 0.90 234 + japanese 0.86 0.84 0.85 254 + korean 0.88 0.83 0.85 242 + thai 0.80 0.87 0.83 227 + + accuracy 0.84 1199 + macro avg 0.85 0.85 0.84 1199 +weighted avg 0.85 0.84 0.84 1199 + +Accuracy (train) for ADA: 72.4% + precision recall f1-score support + + chinese 0.64 0.49 0.56 242 + indian 0.91 0.83 0.87 234 + japanese 0.68 0.69 0.69 254 + korean 0.73 0.79 0.76 242 + thai 0.67 0.83 0.74 227 + + accuracy 0.72 1199 + macro avg 0.73 0.73 0.72 1199 +weighted avg 0.73 0.72 0.72 1199 +``` + +✅ [Ensemble Classifiers](https://scikit-learn.org/stable/modules/ensemble.html) ကိုလေ့လာပါ + +Machine Learning ရဲ့ ဒီနည်းလမ်းဟာ "base estimators အများအပြားရဲ့ prediction တွေကို ပေါင်းစပ်ပြီး" model quality ကို တိုးတက်စေပါတယ်။ ကျွန်တော်တို့ရဲ့ ဥပမာမှာ Random Trees နဲ့ AdaBoost ကို အသုံးပြုထားပါတယ်။ + +- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest) ဟာ averaging method ဖြစ်ပြီး၊ 'decision trees' တွေကို 'forest' တစ်ခုအဖြစ် တည်ဆောက်ကာ randomness ကို ထည့်သွင်းပြီး overfitting ကိုရှောင်ရှားပါတယ်။ n_estimators parameter ကို trees အရေအတွက်အဖြစ် set လုပ်ထားပါတယ်။ + +- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) ဟာ dataset ကို classifier တစ်ခုနဲ့ fit လုပ်ပြီး၊ အဲဒီ classifier ကို dataset အပေါ်မှာ ထပ်မံ fit လုပ်ပါတယ်။ အမှားဖြစ်တဲ့ items တွေ၏ weight ကို အာရုံစိုက်ပြီး၊ နောက်ထပ် classifier အတွက် fit ကို ပြင်ဆင်ပေးပါတယ်။ + +--- + +## 🚀Challenge + +ဒီ techniques တစ်ခုချင်းစီမှာ parameters အများအပြားရှိပြီး၊ default parameters တွေကို tweak လုပ်နိုင်ပါတယ်။ တစ်ခုချင်းစီရဲ့ default parameters တွေကို လေ့လာပြီး၊ parameters တွေကို tweak လုပ်ရင် model quality အပေါ် ဘယ်လိုသက်ရောက်မှုရှိမလဲ စဉ်းစားပါ။ + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Review & Self Study + +ဒီ lessons တွေမှာ jargon အများကြီးပါဝင်ပါတယ်၊ [ဒီစာရင်း](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) ကိုကြည့်ပြီး terminology အသုံးဝင်တဲ့အရာတွေကို ပြန်လည်သုံးသပ်ပါ။ + +## Assignment + +[Parameter play](assignment.md) + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါရှိနိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာရှိသော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/3-Classifiers-2/assignment.md b/translations/my/4-Classification/3-Classifiers-2/assignment.md new file mode 100644 index 00000000..e4e69567 --- /dev/null +++ b/translations/my/4-Classification/3-Classifiers-2/assignment.md @@ -0,0 +1,25 @@ + +# ပါရာမီတာများနှင့် ကစားခြင်း + +## လမ်းညွှန်ချက်များ + +ဒီ Classifiers တွေကို အသုံးပြုတဲ့အခါမှာ Default အနေနဲ့ သတ်မှတ်ထားတဲ့ ပါရာမီတာတွေ အများကြီးရှိပါတယ်။ VS Code ရဲ့ Intellisense က ဒီပါရာမီတာတွေကို ရှာဖွေဖို့ အကူအညီပေးနိုင်ပါတယ်။ ဒီသင်ခန်းစာမှာ ML Classification Techniques တစ်ခုကို ရွေးပြီး ပါရာမီတာတန်ဖိုးတွေကို အမျိုးမျိုး ပြောင်းလဲပြီး မော်ဒယ်တွေကို ပြန်လည်လေ့ကျင့်ပါ။ မော်ဒယ်ရဲ့ အရည်အသွေးကို တိုးတက်စေတဲ့ ပြောင်းလဲမှုတွေ၊ အရည်အသွေးကို ကျဆင်းစေတဲ့ ပြောင်းလဲမှုတွေကို ရှင်းလင်းဖော်ပြထားတဲ့ Notebook တစ်ခု တည်ဆောက်ပါ။ သင့်အဖြေမှာ အသေးစိတ်ဖော်ပြပါ။ + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| -------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ----------------------------- | +| | Classifier တစ်ခုကို အပြည့်အစုံ တည်ဆောက်ပြီး ပါရာမီတာတွေကို ပြောင်းလဲမှုများကို Textbox တွေမှာ ရှင်းလင်းဖော်ပြထားသည် | Notebook တစ်ခုကို အစိတ်အပိုင်းတစ်ချို့သာ တင်ပြထားသည် သို့မဟုတ် ရှင်းလင်းမှုမလုံလောက်သည် | Notebook မှာ အမှားများ သို့မဟုတ် အဆင်မပြေမှုများရှိသည် | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/3-Classifiers-2/solution/Julia/README.md b/translations/my/4-Classification/3-Classifiers-2/solution/Julia/README.md new file mode 100644 index 00000000..46e442a8 --- /dev/null +++ b/translations/my/4-Classification/3-Classifiers-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါရှိနိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူရင်းဘာသာစကားဖြင့် အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/4-Applied/README.md b/translations/my/4-Classification/4-Applied/README.md new file mode 100644 index 00000000..48bfa51b --- /dev/null +++ b/translations/my/4-Classification/4-Applied/README.md @@ -0,0 +1,327 @@ + +# အစားအစာအမျိုးအစား အကြံပေးဝက်ဘ်အက်ပ် တည်ဆောက်ခြင်း + +ဒီသင်ခန်းစာမှာ သင်ဟာ အတိတ်သင်ခန်းစာတွေမှာ သင်ယူခဲ့တဲ့နည်းလမ်းတွေကို အသုံးပြုပြီး အစားအစာအမျိုးအစားဒေတာစနစ်ကို အသုံးပြုကာ အမျိုးအစားခွဲခြားမော်ဒယ်တစ်ခု တည်ဆောက်ပါမယ်။ ထို့အပြင် Onnx ရဲ့ web runtime ကို အသုံးပြုကာ သိမ်းဆည်းထားတဲ့မော်ဒယ်ကို အသုံးပြုနိုင်တဲ့ ဝက်ဘ်အက်ပ်လေးတစ်ခုကိုလည်း တည်ဆောက်ပါမယ်။ + +Machine Learning ရဲ့ အကျိုးရှိတဲ့ လက်တွေ့အသုံးချမှုတစ်ခုက အကြံပေးစနစ်တွေ တည်ဆောက်ခြင်းဖြစ်ပြီး ဒီနေ့မှာ သင်အဲဒီလမ်းကြောင်းကို စတင်နိုင်ပါပြီ! + +[![ဒီဝက်ဘ်အက်ပ်ကို ဖော်ပြခြင်း](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Applied ML") + +> 🎥 အပေါ်ကပုံကို နှိပ်ပြီး ဗီဒီယိုကြည့်ပါ: Jen Looper က အစားအစာအမျိုးအစားဒေတာကို အသုံးပြုကာ ဝက်ဘ်အက်ပ်တစ်ခု တည်ဆောက်နေသည် + +## [သင်ခန်းစာမတိုင်မီ မေးခွန်း](https://ff-quizzes.netlify.app/en/ml/) + +ဒီသင်ခန်းစာမှာ သင်လေ့လာရမယ့်အရာတွေက: + +- မော်ဒယ်တစ်ခုကို တည်ဆောက်ပြီး Onnx မော်ဒယ်အဖြစ် သိမ်းဆည်းနည်း +- Netron ကို အသုံးပြုကာ မော်ဒယ်ကို စစ်ဆေးနည်း +- မော်ဒယ်ကို ဝက်ဘ်အက်ပ်မှာ အသုံးပြုကာ အတိအကျခန့်မှန်းနည်း + +## မော်ဒယ်ကို တည်ဆောက်ပါ + +Applied ML စနစ်တွေကို တည်ဆောက်ခြင်းဟာ ဒီနည်းပညာတွေကို သင့်လုပ်ငန်းစနစ်တွေမှာ အသုံးချဖို့ အရေးကြီးတဲ့အပိုင်းတစ်ခုဖြစ်ပါတယ်။ Onnx ကို အသုံးပြုကာ သင့်ဝက်ဘ်အက်ပ်တွေမှာ မော်ဒယ်တွေကို အသုံးပြုနိုင်ပါတယ် (လိုအပ်ပါက offline context မှာလည်း အသုံးပြုနိုင်ပါတယ်)။ + +[အတိတ်သင်ခန်းစာ](../../3-Web-App/1-Web-App/README.md) မှာ သင်ဟာ UFO တွေကို ရှာဖွေတဲ့ Regression မော်ဒယ်တစ်ခုကို တည်ဆောက်ပြီး "pickle" လုပ်ကာ Flask app မှာ အသုံးပြုခဲ့ပါတယ်။ ဒီ architecture ဟာ သိထားသင့်တဲ့ အသုံးဝင်တဲ့နည်းလမ်းတစ်ခုဖြစ်ပေမယ့် Python အပြည့်အစုံ stack app ဖြစ်ပြီး သင့်လိုအပ်ချက်တွေမှာ JavaScript application ကို အသုံးပြုဖို့လိုအပ်နိုင်ပါတယ်။ + +ဒီသင်ခန်းစာမှာ JavaScript-based စနစ်တစ်ခုကို အတိအကျခန့်မှန်းဖို့ တည်ဆောက်နိုင်ပါတယ်။ ဒါပေမယ့် အရင်ဆုံး မော်ဒယ်တစ်ခုကို လေ့ကျင့်ပြီး Onnx နဲ့ အသုံးပြုနိုင်ဖို့ ပြောင်းလဲရပါမယ်။ + +## လေ့ကျင့်မှု - အမျိုးအစားခွဲခြားမော်ဒယ်ကို လေ့ကျင့်ပါ + +အရင်ဆုံး သင်အသုံးပြုခဲ့တဲ့ အစားအစာအမျိုးအစားဒေတာစနစ်ကို အသုံးပြုကာ အမျိုးအစားခွဲခြားမော်ဒယ်တစ်ခုကို လေ့ကျင့်ပါ။ + +1. အသုံးဝင်တဲ့ library တွေကို အရင် Import လုပ်ပါ: + + ```python + !pip install skl2onnx + import pandas as pd + ``` + + '[skl2onnx](https://onnx.ai/sklearn-onnx/)' ကို သင့် Scikit-learn မော်ဒယ်ကို Onnx format ပြောင်းဖို့ အထောက်အကူပြုပါမယ်။ + +1. အတိတ်သင်ခန်းစာတွေမှာ လုပ်ခဲ့သလို `read_csv()` ကို အသုံးပြုကာ သင့်ဒေတာကို အလုပ်လုပ်ပါ: + + ```python + data = pd.read_csv('../data/cleaned_cuisines.csv') + data.head() + ``` + +1. မလိုအပ်တဲ့ အတန်းနှစ်ခုကို ဖယ်ရှားပြီး ကျန်ရှိတဲ့ဒေတာကို 'X' အဖြစ် သိမ်းဆည်းပါ: + + ```python + X = data.iloc[:,2:] + X.head() + ``` + +1. Label တွေကို 'y' အဖြစ် သိမ်းဆည်းပါ: + + ```python + y = data[['cuisine']] + y.head() + + ``` + +### လေ့ကျင့်မှုစနစ်ကို စတင်ပါ + +'SVC' library ကို အသုံးပြုပါမယ်၊ accuracy ကောင်းပါတယ်။ + +1. Scikit-learn မှ သင့် library တွေကို Import လုပ်ပါ: + + ```python + from sklearn.model_selection import train_test_split + from sklearn.svm import SVC + from sklearn.model_selection import cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report + ``` + +1. လေ့ကျင့်မှုနှင့် စမ်းသပ်မှု set တွေကို ခွဲခြားပါ: + + ```python + X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3) + ``` + +1. အတိတ်သင်ခန်းစာမှာ လုပ်ခဲ့သလို SVC Classification မော်ဒယ်တစ်ခုကို တည်ဆောက်ပါ: + + ```python + model = SVC(kernel='linear', C=10, probability=True,random_state=0) + model.fit(X_train,y_train.values.ravel()) + ``` + +1. အခုတော့ သင့်မော်ဒယ်ကို စမ်းသပ်ပြီး `predict()` ကို ခေါ်ပါ: + + ```python + y_pred = model.predict(X_test) + ``` + +1. Classification report ကို print ထုတ်ပြီး မော်ဒယ်ရဲ့ အရည်အသွေးကို စစ်ဆေးပါ: + + ```python + print(classification_report(y_test,y_pred)) + ``` + + အရင်မြင်ခဲ့သလို accuracy ကောင်းပါတယ်: + + ```output + precision recall f1-score support + + chinese 0.72 0.69 0.70 257 + indian 0.91 0.87 0.89 243 + japanese 0.79 0.77 0.78 239 + korean 0.83 0.79 0.81 236 + thai 0.72 0.84 0.78 224 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +### သင့်မော်ဒယ်ကို Onnx format ပြောင်းပါ + +Tensor နံပါတ်ကို သင့်တော်အောင် ပြောင်းလဲပါ။ ဒီဒေတာစနစ်မှာ 380 ခုသော အစားအစာပါဝင်ပြီး `FloatTensorType` မှာ အဲဒီနံပါတ်ကို မှတ်သားရပါမယ်။ + +1. Tensor နံပါတ် 380 ကို အသုံးပြုကာ ပြောင်းပါ: + + ```python + from skl2onnx import convert_sklearn + from skl2onnx.common.data_types import FloatTensorType + + initial_type = [('float_input', FloatTensorType([None, 380]))] + options = {id(model): {'nocl': True, 'zipmap': False}} + ``` + +1. **model.onnx** အဖြစ် ဖိုင်အနေနဲ့ သိမ်းဆည်းပါ: + + ```python + onx = convert_sklearn(model, initial_types=initial_type, options=options) + with open("./model.onnx", "wb") as f: + f.write(onx.SerializeToString()) + ``` + + > မှတ်ချက် - သင့် conversion script မှာ [options](https://onnx.ai/sklearn-onnx/parameterized.html) တွေကို pass လုပ်နိုင်ပါတယ်။ ဒီအခါမှာ 'nocl' ကို True အဖြစ်၊ 'zipmap' ကို False အဖြစ် pass လုပ်ထားပါတယ်။ Classification မော်ဒယ်ဖြစ်တဲ့အတွက် ZipMap ကို ဖယ်ရှားနိုင်ပါတယ် (မလိုအပ်ပါဘူး)။ `nocl` ဟာ မော်ဒယ်မှာ class အချက်အလက်ကို ထည့်သွင်းခြင်းကို ရည်ညွှန်းပါတယ်။ `nocl` ကို 'True' အဖြစ် သတ်မှတ်ခြင်းအားဖြင့် မော်ဒယ်ရဲ့အရွယ်အစားကို လျှော့ချနိုင်ပါတယ်။ + +Notebook အားလုံးကို run လုပ်ပြီး Onnx မော်ဒယ်တစ်ခုကို တည်ဆောက်ကာ ဒီ folder မှာ သိမ်းဆည်းပါ။ + +## သင့်မော်ဒယ်ကို ကြည့်ပါ + +Onnx မော်ဒယ်တွေဟာ Visual Studio Code မှာ မမြင်နိုင်ပါဘူး၊ ဒါပေမယ့် မော်ဒယ်တစ်ခုကို visualization လုပ်ဖို့ အခမဲ့ software ကောင်းတစ်ခုရှိပါတယ်။ [Netron](https://github.com/lutzroeder/Netron) ကို download လုပ်ပြီး သင့် model.onnx ဖိုင်ကို ဖွင့်ပါ။ 380 inputs နဲ့ classifier ပါဝင်တဲ့ သင့်မော်ဒယ်ကို ရိုးရှင်းစွာ visualization လုပ်နိုင်ပါတယ်: + +![Netron visual](../../../../4-Classification/4-Applied/images/netron.png) + +Netron ဟာ သင့်မော်ဒယ်တွေကို ကြည့်ရှုဖို့ အထောက်အကူပြုတဲ့ tool တစ်ခုဖြစ်ပါတယ်။ + +## အကြံပေးဝက်ဘ်အက်ပ် တည်ဆောက်ပါ + +သင့်မော်ဒယ်ကို ဝက်ဘ်အက်ပ်မှာ တိုက်ရိုက်အသုံးပြုနိုင်ပါတယ်။ ဒီ architecture ဟာ local မှာ run လုပ်နိုင်ပြီး offline မှာလည်း အသုံးပြုနိုင်ပါတယ်။ သင့် `model.onnx` ဖိုင်ကို သိမ်းဆည်းထားတဲ့ folder မှာ `index.html` ဖိုင်တစ်ခုကို စတင်ဖန်တီးပါ။ + +1. ဒီဖိုင် _index.html_ မှာ အောက်ပါ markup ကို ထည့်ပါ: + + ```html + + +
            + Cuisine Matcher +
            + + ... + + + ``` + +1. `body` tag တွေထဲမှာ အစားအစာအချို့ကို ပြသတဲ့ checkbox တွေကို ထည့်ပါ: + + ```html +

            Check your refrigerator. What can you create?

            +
            +
            + + +
            + +
            + + +
            + +
            + + +
            + +
            + + +
            + +
            + + +
            + +
            + + +
            + +
            + + +
            +
            +
            + +
            + ``` + + Checkbox တစ်ခုစီကို value သတ်မှတ်ထားပါတယ်။ ဒါဟာ dataset အရ အစားအစာရဲ့ index ကို ရည်ညွှန်းပါတယ်။ ဥပမာ - Apple ဟာ alphabetic စဉ်အရ column 5 မှာရှိပြီး value ဟာ '4' ဖြစ်ပါတယ် (0 မှ စတင်ရေတွက်ပါတယ်)။ [ingredients spreadsheet](../../../../4-Classification/data/ingredient_indexes.csv) ကို ကြည့်ပြီး အစားအစာတစ်ခုရဲ့ index ကို ရှာဖွေပါ။ + + index.html ဖိုင်မှာ ဆက်လက်လုပ်ဆောင်ပြီး script block ကို နောက်ဆုံး `` tag ရဲ့ အောက်မှာ ထည့်ပါ။ + +1. အရင်ဆုံး [Onnx Runtime](https://www.onnxruntime.ai/) ကို Import လုပ်ပါ: + + ```html + + ``` + + > Onnx Runtime ကို အသုံးပြုကာ သင့် Onnx မော်ဒယ်တွေကို hardware platform အမျိုးမျိုးမှာ run လုပ်နိုင်ပါတယ်၊ optimization တွေကိုလည်း ပါဝင်ပါတယ်။ + +1. Runtime ကို အသုံးပြုပါ: + + ```html + + ``` + +ဒီ code မှာ အောက်ပါအရာတွေကို လုပ်ဆောင်ထားပါတယ်: + +1. 380 ခုသော value (1 or 0) တွေကို သတ်မှတ်ပြီး မော်ဒယ်ကို inference အတွက် ပို့ရန် array တစ်ခုကို ဖန်တီးထားပါတယ်။ +2. Checkbox array တစ်ခုကို ဖန်တီးပြီး `init` function မှာ checkbox တွေ checked ဖြစ်/မဖြစ်ကို စစ်ဆေးထားပါတယ်။ +3. `testCheckboxes` function ကို ဖန်တီးပြီး checkbox checked ဖြစ်/မဖြစ်ကို စစ်ဆေးထားပါတယ်။ +4. Button ကို နှိပ်တဲ့အခါ `startInference` function ကို အသုံးပြုကာ inference စတင်ပါ။ +5. Inference routine မှာ: + 1. မော်ဒယ်ကို asynchronous load လုပ်ခြင်း + 2. Tensor structure ကို ဖန်တီးပြီး မော်ဒယ်ကို ပို့ခြင်း + 3. `float_input` input ကို feeds အဖြစ် ဖန်တီးခြင်း (Netron မှာ အဲဒီနာမည်ကို စစ်ဆေးနိုင်ပါတယ်) + 4. Feed တွေကို မော်ဒယ်ကို ပို့ပြီး အဖြေကို စောင့်ဆိုင်းခြင်း + +## သင့်အက်ပ်ကို စမ်းသပ်ပါ + +Visual Studio Code မှာ terminal session ကို ဖွင့်ပြီး သင့် index.html ဖိုင်ရှိတဲ့ folder မှာ `http-server` ကို run လုပ်ပါ။ localhost ကို ဖွင့်ပြီး သင့်ဝက်ဘ်အက်ပ်ကို ကြည့်ရှုနိုင်ပါတယ်။ အစားအစာအမျိုးအစားကို အကြံပေးမှုအတွက် စမ်းသပ်ပါ: + +![ingredient web app](../../../../4-Classification/4-Applied/images/web-app.png) + +အောင်မြင်ပါတယ်၊ သင့်အစားအစာအမျိုးအစားအကြံပေးဝက်ဘ်အက်ပ်ကို တည်ဆောက်ပြီး ပြီးဆုံးပါပြီ။ ဒီစနစ်ကို ဆက်လက်တိုးချဲ့ဖို့ အချိန်ယူပါ! + +## 🚀စိန်ခေါ်မှု + +သင့်ဝက်ဘ်အက်ပ်ဟာ အလွန်ရိုးရှင်းပါတယ်၊ [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv) ဒေတာမှ အစားအစာနဲ့ index တွေကို အသုံးပြုကာ ဆက်လက်တိုးချဲ့ပါ။ ဘယ်အစားအစာအရသာပေါင်းစပ်မှုတွေက အမျိုးသားအစားအစာကို ဖန်တီးနိုင်မလဲ? + +## [သင်ခန်းစာပြီးနောက် မေးခွန်း](https://ff-quizzes.netlify.app/en/ml/) + +## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +ဒီသင်ခန်းစာမှာ အစားအစာအမျိုးအစားအကြံပေးစနစ်တစ်ခုကို တည်ဆောက်ခြင်းရဲ့ အသုံးဝင်မှုကို အနည်းငယ်သာ ထိတွေ့ခဲ့ပါတယ်။ ဒီ ML application နယ်ပယ်ဟာ ဥပမာများစွာပါဝင်တဲ့ နယ်ပယ်တစ်ခုဖြစ်ပါတယ်။ ဒီစနစ်တွေကို ဘယ်လိုတည်ဆောက်ကြောင်းကို ဆက်လက်ဖတ်ရှုပါ: + +- https://www.sciencedirect.com/topics/computer-science/recommendation-engine +- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/ +- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/ + +## လုပ်ငန်းတာဝန် + +[အကြံပေးစနစ်အသစ်တစ်ခု တည်ဆောက်ပါ](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသောအချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/4-Applied/assignment.md b/translations/my/4-Classification/4-Applied/assignment.md new file mode 100644 index 00000000..f4424337 --- /dev/null +++ b/translations/my/4-Classification/4-Applied/assignment.md @@ -0,0 +1,25 @@ + +# အကြံပြုမှုစနစ် တည်ဆောက်ခြင်း + +## လမ်းညွှန်ချက်များ + +ဒီသင်ခန်းစာတွင် သင်လုပ်ဆောင်ခဲ့သော လေ့ကျင့်ခန်းများအရ၊ Onnx Runtime နှင့် ပြောင်းလဲထားသော Onnx မော်ဒယ်ကို အသုံးပြု၍ JavaScript အခြေခံထားသော ဝက်ဘ်အက်ပ်တစ်ခုကို တည်ဆောက်နိုင်ပုံကို သင်သိရှိပြီးဖြစ်သည်။ ဒီသင်ခန်းစာများမှ ဒေတာများ သို့မဟုတ် အခြားနေရာမှ ရရှိသော ဒေတာများကို အသုံးပြု၍ အကြံပြုမှုစနစ်အသစ်တစ်ခုကို စမ်းသပ်တည်ဆောက်ပါ (အရင်းအမြစ်ကို အားလုံးကိုယ်တိုင်မှတ်သားပေးပါ။)။ သင်သည် လူပုဂ္ဂိုလ်၏ ပုဂ္ဂိုလ်ရေးဂုဏ်သတ္တိများအပေါ် အခြေခံ၍ အိမ်မွေးတိရစ္ဆာန်အကြံပြုမှုစနစ်တစ်ခု သို့မဟုတ် လူတစ်ဦး၏ စိတ်နေအခြေအနေအပေါ် အခြေခံ၍ ဂီတအမျိုးအစားအကြံပြုမှုစနစ်တစ်ခုကို ဖန်တီးနိုင်ပါသည်။ ဖန်တီးမှုအရည်အချင်းကို ပြသပါ! + +## အဆင့်သတ်မှတ်ချက် + +| အဆင့်သတ်မှတ်ချက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| ----------------- | ---------------------------------------------------------------------- | ------------------------------------- | --------------------------------- | +| | ဝက်ဘ်အက်ပ်နှင့် နိုက်ဘွတ်စ်ကို တင်ပြထားပြီး၊ နှစ်ခုစလုံး စာရွက်စာတမ်းပြည့်စုံပြီး လည်ပတ်နေသည် | တစ်ခုခုပျောက်နေသည် သို့မဟုတ် အချို့အပိုင်းတွင် အခက်အခဲရှိသည် | နှစ်ခုစလုံးပျောက်နေသည် သို့မဟုတ် အခက်အခဲများရှိသည် | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆောင်ရွက်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/4-Classification/README.md b/translations/my/4-Classification/README.md new file mode 100644 index 00000000..ffe5b7ab --- /dev/null +++ b/translations/my/4-Classification/README.md @@ -0,0 +1,41 @@ + +# အမျိုးအစားခွဲခြားမှုနှင့် စတင်မိတ်ဆက်ခြင်း + +## ဒေသဆိုင်ရာ ခေါင်းစဉ်: အာရှနှင့် အိန္ဒိယအစားအစာများ 🍜 + +အာရှနှင့် အိန္ဒိယတွင် အစားအစာရိုးရာများသည် အလွန်စုံလင်ပြီး အရသာရှိလှပါသည်! ဒေသဆိုင်ရာအစားအစာများ၏ ပါဝင်ပစ္စည်းများကို နားလည်ရန်အတွက် ဒေတာများကို လေ့လာကြမည်။ + +![ထိုင်းအစားအစာရောင်းသူ](../../../4-Classification/images/thai-food.jpg) +> ဓာတ်ပုံကို Lisheng Chang မှ Unsplash တွင် ရိုက်ထားသည် + +## သင်လေ့လာမည့်အရာများ + +ဤအပိုင်းတွင် သင်၏ Regression လေ့လာမှုကို အခြေခံပြီး ဒေတာကို ပိုမိုနားလည်စေရန် အသုံးပြုနိုင်သော အခြားအမျိုးအစားခွဲခြားမှုများကို လေ့လာမည်ဖြစ်သည်။ + +> အမျိုးအစားခွဲခြားမှုမော်ဒယ်များနှင့် အလုပ်လုပ်ခြင်းကို လေ့လာရန် အထောက်အကူပြုသော low-code tools များရှိသည်။ ဤအလုပ်အတွက် [Azure ML](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) ကို စမ်းသုံးကြည့်ပါ။ + +## သင်ခန်းစာများ + +1. [အမျိုးအစားခွဲခြားမှုနှင့် မိတ်ဆက်ခြင်း](1-Introduction/README.md) +2. [အခြားအမျိုးအစားခွဲခြားမှုများ](2-Classifiers-1/README.md) +3. [နောက်ထပ်အမျိုးအစားခွဲခြားမှုများ](3-Classifiers-2/README.md) +4. [Applied ML: ဝက်ဘ်အက်ပ်တည်ဆောက်ခြင်း](4-Applied/README.md) + +## အကျိုးတူ + +"အမျိုးအစားခွဲခြားမှုနှင့် စတင်မိတ်ဆက်ခြင်း" ကို [Cassie Breviu](https://www.twitter.com/cassiebreviu) နှင့် [Jen Looper](https://www.twitter.com/jenlooper) တို့မှ ♥️ ဖြင့် ရေးသားခဲ့သည်။ + +အရသာရှိသော အစားအစာဒေတာကို [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines) မှ ရယူထားပါသည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သိရှိပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/5-Clustering/1-Visualize/README.md b/translations/my/5-Clustering/1-Visualize/README.md new file mode 100644 index 00000000..a8df08cb --- /dev/null +++ b/translations/my/5-Clustering/1-Visualize/README.md @@ -0,0 +1,332 @@ + +# Clustering ကိုမိတ်ဆက်ခြင်း + +Clustering သည် [Unsupervised Learning](https://wikipedia.org/wiki/Unsupervised_learning) အမျိုးအစားတစ်ခုဖြစ်ပြီး၊ dataset တွင် label မပါရှိခြင်း သို့မဟုတ် input များကို predefined output များနှင့်မတူညီခြင်းကိုယူဆသည်။ Clustering သည် unlabeled data များကိုစီစဉ်ရန်အတွက် အမျိုးမျိုးသော algorithm များကိုအသုံးပြုပြီး၊ data တွင်တွေ့ရှိသော pattern များအပေါ်အခြေခံ၍ အုပ်စုများကိုဖော်ထုတ်ပေးသည်။ + +[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare") + +> 🎥 အထက်ပါပုံကိုနှိပ်ပြီး video ကိုကြည့်ပါ။ Clustering ဖြင့် machine learning ကိုလေ့လာနေစဉ်၊ Nigerian Dance Hall သီချင်းများကိုခံစားပါ - PSquare ၏ 2014 ခုနှစ်မှ highly rated သီချင်းတစ်ပုဒ်ဖြစ်သည်။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +### မိတ်ဆက် + +[Clustering](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) သည် data exploration အတွက် အလွန်အသုံးဝင်သည်။ Nigerian audience များ၏ music စားသုံးပုံစံများတွင် trend များနှင့် pattern များကိုဖော်ထုတ်နိုင်မလားဆိုတာကြည့်ကြမယ်။ + +✅ Clustering ၏အသုံးဝင်မှုများအကြောင်းကိုအချိန်တစ်မိနစ်ယူပြီးစဉ်းစားပါ။ အမှန်တစ်ရားတွင် Clustering သည် သင်အဝတ်လျှော်ပုံတစ်ပုံကိုယူပြီး မိသားစုဝင်များ၏အဝတ်အစားများကိုစီစဉ်သောအခါဖြစ်ပေါ်သည် 🧦👕👖🩲။ Data science တွင် Clustering သည် user ၏စိတ်ကြိုက်များကိုခွဲခြားရန် သို့မဟုတ် unlabeled dataset တစ်ခု၏လက္ခဏာများကိုသတ်မှတ်ရန်အခါဖြစ်ပေါ်သည်။ Clustering သည် chaos ကိုအဓိပ္ပါယ်ရှိစေရာအတွက် အကူအညီပေးသည်၊ ဥပမာ - sock drawer တစ်ခုလိုပါပဲ။ + +[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering") + +> 🎥 အထက်ပါပုံကိုနှိပ်ပြီး video ကိုကြည့်ပါ။ MIT ၏ John Guttag မှ Clustering ကိုမိတ်ဆက်သည်။ + +အလုပ်အကိုင် setting တွင် Clustering ကို market segmentation သတ်မှတ်ရန်၊ ဥပမာ - ဘယ်အသက်အရွယ်အုပ်စုများက ဘယ်ပစ္စည်းများကိုဝယ်လဲဆိုတာသတ်မှတ်ရန် အသုံးပြုနိုင်သည်။ အခြားအသုံးပြုမှုတစ်ခုကတော့ anomaly detection ဖြစ်ပြီး၊ ဥပမာ - credit card transaction dataset မှ fraud ကိုဖော်ထုတ်ရန်ဖြစ်သည်။ သို့မဟုတ် medical scan များအစုအပေါ်တွင် tumor များကိုသတ်မှတ်ရန် Clustering ကိုအသုံးပြုနိုင်သည်။ + +✅ Banking, e-commerce, သို့မဟုတ် business setting တစ်ခုတွင် Clustering ကို 'in the wild' တွေ့ရှိဖူးလားဆိုတာကိုအချိန်တစ်မိနစ်ယူပြီးစဉ်းစားပါ။ + +> 🎓 စိတ်ဝင်စားဖွယ်ကောင်းသည်မှာ၊ Cluster analysis သည် 1930 ခုနှစ်များတွင် Anthropology နှင့် Psychology ကဏ္ဍများတွင်မူလစတင်ခဲ့သည်။ အဲဒီအချိန်မှာဘယ်လိုအသုံးပြုခဲ့မလဲဆိုတာကိုစဉ်းစားနိုင်မလား? + +အခြားနည်းလမ်းတစ်ခုကတော့ search result များကို grouping လုပ်ရန်ဖြစ်သည် - shopping link များ၊ image များ သို့မဟုတ် review များဖြင့် grouping လုပ်ခြင်း။ Clustering သည် dataset ကြီးတစ်ခုကိုလျှော့ချပြီး၊ granular analysis ပိုမိုလုပ်ဆောင်လိုသောအခါ အသုံးဝင်သည်။ ထို့ကြောင့်၊ အခြား model များကိုတည်ဆောက်မီ data အကြောင်းကိုလေ့လာရန်အတွက် technique တစ်ခုအဖြစ်အသုံးပြုနိုင်သည်။ + +✅ Data ကို cluster များအတွင်းစီစဉ်ပြီးနောက်၊ Cluster Id တစ်ခုကိုပေးအပ်ပြီး၊ dataset privacy ကိုထိန်းသိမ်းရန်အတွက် technique တစ်ခုအဖြစ်အသုံးဝင်သည်။ Data point ကိုပိုမိုဖော်ထုတ်နိုင်သော identifiable data များမဟုတ်ဘဲ Cluster Id ဖြင့်ရည်ညွှန်းနိုင်သည်။ Cluster Id ကိုအသုံးပြုရန်အခြားအကြောင်းရင်းများကိုစဉ်းစားနိုင်မလား? + +Clustering technique များအကြောင်းကို [Learn module](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) တွင်ပိုမိုနက်နက်ရှိုင်းရှိုင်းလေ့လာပါ။ + +## Clustering ကိုစတင်အသုံးပြုခြင်း + +[Scikit-learn မှာ](https://scikit-learn.org/stable/modules/clustering.html) Clustering ကိုလုပ်ဆောင်ရန်အတွက် နည်းလမ်းများစွာရှိသည်။ သင်ရွေးချယ်မည့်အမျိုးအစားသည် သင့် use case အပေါ်မူတည်သည်။ Documentation အရ၊ နည်းလမ်းတစ်ခုစီမှာ အမျိုးမျိုးသောအကျိုးကျေးဇူးများရှိသည်။ Scikit-learn မှ support ပြုသောနည်းလမ်းများနှင့်၎င်းတို့၏သင့်လျော်သော use case များကိုရိုးရှင်းသောဇယားအဖြစ်ဖော်ပြထားသည်။ + +| နည်းလမ်းအမည် | Use case | +| :--------------------------- | :--------------------------------------------------------------------- | +| K-Means | general purpose, inductive | +| Affinity propagation | many, uneven clusters, inductive | +| Mean-shift | many, uneven clusters, inductive | +| Spectral clustering | few, even clusters, transductive | +| Ward hierarchical clustering | many, constrained clusters, transductive | +| Agglomerative clustering | many, constrained, non Euclidean distances, transductive | +| DBSCAN | non-flat geometry, uneven clusters, transductive | +| OPTICS | non-flat geometry, uneven clusters with variable density, transductive | +| Gaussian mixtures | flat geometry, inductive | +| BIRCH | large dataset with outliers, inductive | + +> 🎓 Cluster များကိုဖန်တီးပုံသည် data point များကိုအုပ်စုများအတွင်းစုစည်းပုံနှင့်အလွန်ဆက်စပ်နေသည်။ Vocabulary အချို့ကိုရှင်းလင်းကြည့်ရအောင်: +> +> 🎓 ['Transductive' vs. 'inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning)) +> +> Transductive inference သည် observed training case များမှတစ်ဆင့် specific test case များကို map လုပ်ခြင်းဖြစ်သည်။ Inductive inference သည် training case များမှတစ်ဆင့် general rule များကို map လုပ်ပြီး၊ test case များတွင်သာအသုံးပြုခြင်းဖြစ်သည်။ +> +> ဥပမာ - သင့် dataset တွင် label တစ်စိတ်တစ်ပိုင်းသာပါရှိသည်။ အချို့သည် 'records'၊ အချို့သည် 'cds'၊ အချို့သည် blank ဖြစ်သည်။ Blank များအတွက် label များပေးရန်သင့်တာဝန်ဖြစ်သည်။ Inductive approach ကိုရွေးချယ်ပါက၊ 'records' နှင့် 'cds' ကိုရှာဖွေသော model တစ်ခုကို train လုပ်ပြီး၊ unlabeled data တွင် label များကိုအသုံးပြုမည်။ ဤနည်းလမ်းသည် 'cassettes' ဖြစ်သောအရာများကို classify လုပ်ရန်အခက်အခဲရှိမည်။ Transductive approach သည် unknown data ကိုပိုမိုထိရောက်စွာကိုင်တွယ်နိုင်သည်၊ အရာများကိုအုပ်စုများအတွင်းစုစည်းပြီး၊ အုပ်စုတစ်ခုကို label ပေးသည်။ ဤကိစ္စတွင် cluster များသည် 'round musical things' နှင့် 'square musical things' ကိုဖော်ပြနိုင်သည်။ +> +> 🎓 ['Non-flat' vs. 'flat' geometry](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) +> +> Mathematical terminology မှရရှိသော၊ non-flat vs. flat geometry သည် point များအကြားအကွာအဝေးကို 'flat' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) သို့မဟုတ် 'non-flat' (non-Euclidean) geometrical နည်းလမ်းများဖြင့်တိုင်းတာခြင်းကိုရည်ညွှန်းသည်။ +> +>'Flat' သည် Euclidean geometry ကိုရည်ညွှန်းပြီး၊ 'non-flat' သည် non-Euclidean geometry ကိုရည်ညွှန်းသည်။ Geometry သည် machine learning နှင့်ဘာကြောင့်ဆက်စပ်နေရသလဲ? Mathematics အပေါ်အခြေခံထားသောနယ်ပယ်နှစ်ခုအဖြစ်၊ cluster များအတွင်း point များအကြားအကွာအဝေးကိုတိုင်းတာရန်နည်းလမ်းတစ်ခုရှိရမည်။ [Euclidean distances](https://wikipedia.org/wiki/Euclidean_distance) သည် point နှစ်ခုအကြား line segment ၏အရှည်ကိုတိုင်းတာခြင်းဖြစ်သည်။ [Non-Euclidean distances](https://wikipedia.org/wiki/Non-Euclidean_geometry) သည် curve အတိုင်းတာခြင်းဖြစ်သည်။ သင့် data ကို visualization လုပ်ပါက၊ plane ပေါ်တွင်မရှိသည့်အခါ၊ specialized algorithm တစ်ခုကိုအသုံးပြုရန်လိုအပ်နိုင်သည်။ +> +![Flat vs Nonflat Geometry Infographic](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png) +> Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) +> +> 🎓 ['Distances'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) +> +> Cluster များကို၎င်းတို့၏ distance matrix ဖြင့်သတ်မှတ်သည်၊ ဥပမာ - point များအကြားအကွာအဝေးများ။ ဤအကွာအဝေးကိုအနည်းငယ်နည်းလမ်းများဖြင့်တိုင်းတာနိုင်သည်။ Euclidean cluster များကို point value များ၏ပျမ်းမျှတန်ဖိုးဖြင့်သတ်မှတ်ပြီး၊ 'centroid' သို့မဟုတ် center point ပါရှိသည်။ အကွာအဝေးများကို၎င်း centroid အထိအကွာအဝေးဖြင့်တိုင်းတာသည်။ Non-Euclidean distance များသည် 'clustroid' များကိုရည်ညွှန်းသည်၊ အခြား point များနှင့်အနီးဆုံး point ဖြစ်သည်။ Clustroid များကိုအမျိုးမျိုးသောနည်းလမ်းများဖြင့်သတ်မှတ်နိုင်သည်။ +> +> 🎓 ['Constrained'](https://wikipedia.org/wiki/Constrained_clustering) +> +> [Constrained Clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) သည် unsupervised method တွင် 'semi-supervised' learning ကိုမိတ်ဆက်သည်။ Point များအကြားဆက်နွယ်မှုများကို 'cannot link' သို့မဟုတ် 'must-link' အဖြစ် flag လုပ်ပြီး၊ dataset အပေါ် rule များကိုအတင်းအဓမ္မသတ်မှတ်သည်။ +> +>ဥပမာ - Algorithm တစ်ခုကို unlabeled သို့မဟုတ် semi-labelled data အပေါ်တွင်လွတ်လပ်စွာအသုံးပြုပါက၊ ဖန်တီးသော cluster များသည်အရည်အသွေးမကောင်းနိုင်သည်။ အထက်ပါဥပမာတွင် cluster များသည် 'round music things' နှင့် 'square music things' နှင့် 'triangular things' နှင့် 'cookies' ကို grouping လုပ်နိုင်သည်။ Constraint များ သို့မဟုတ် rule များ ("item သည် plastic ဖြင့်ပြုလုပ်ထားရမည်"၊ "item သည် music ထုတ်လုပ်နိုင်ရမည်") ပေးခြင်းဖြင့် algorithm ကိုပိုမိုကောင်းမွန်သောရွေးချယ်မှုများလုပ်ဆောင်ရန်အကူအညီပေးနိုင်သည်။ +> +> 🎓 'Density' +> +> 'Noisy' data သည် 'dense' ဟုခေါ်သည်။ Cluster တစ်ခုစီတွင် point များအကြားအကွာအဝေးများသည် ပိုမိုသိပ်သည့် သို့မဟုတ် 'crowded' ဖြစ်နိုင်ပြီး၊ ဤ data ကိုသင့် data nature အပေါ်မူတည်၍ clustering method သင့်လျော်သောနည်းလမ်းဖြင့် analysis လုပ်ရန်လိုအပ်သည်။ [ဤဆောင်းပါး](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) သည် noisy dataset တစ်ခုကို uneven cluster density ဖြင့် K-Means clustering နှင့် HDBSCAN algorithm များကိုအသုံးပြု၍ explore လုပ်ခြင်း၏ကွာခြားချက်ကိုဖော်ပြသည်။ + +## Clustering algorithm များ + +Clustering algorithm များ 100 ကျော်ရှိပြီး၊ ၎င်းတို့၏အသုံးပြုမှုသည် data nature အပေါ်မူတည်သည်။ အဓိက algorithm များအချို့ကိုဆွေးနွေးကြည့်ရအောင်: + +- **Hierarchical clustering**. Object တစ်ခုကိုအနီးဆုံး object နှင့်အကွာအဝေးအပေါ်အခြေခံ၍ classify လုပ်ပါက၊ cluster များကို၎င်းတို့၏အဖွဲ့ဝင်များ၏အကွာအဝေးအပေါ်အခြေခံ၍ဖွဲ့စည်းသည်။ Scikit-learn ၏ agglomerative clustering သည် hierarchical ဖြစ်သည်။ + + ![Hierarchical clustering Infographic](../../../../5-Clustering/1-Visualize/images/hierarchical.png) + > Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Centroid clustering**. ဤလူကြိုက်များ algorithm သည် 'k' သို့မဟုတ် ဖွဲ့စည်းရန် cluster အရေအတွက်ကိုရွေးချယ်ရန်လိုအပ်ပြီး၊ algorithm သည် cluster ၏ center point ကိုသတ်မှတ်ပြီး၊ data ကို၎င်း point အနီးတွင်စုစည်းသည်။ [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) သည် centroid clustering ၏လူကြိုက်များသော version ဖြစ်သည်။ Center ကို nearest mean ဖြင့်သတ်မှတ်ပြီး၊ cluster မှ squared distance ကိုလျှော့ချသည်။ + + ![Centroid clustering Infographic](../../../../5-Clustering/1-Visualize/images/centroid.png) + > Infographic by [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Distribution-based clustering**. Statistical modeling အပေါ်အခြေခံပြီး၊ distribution-based clustering သည် data point တစ်ခုသည် cluster တစ်ခုနှင့်ဆက်စပ်မှုရှိနိုင်သော probability ကိုသတ်မှတ်ပြီး၊ ၎င်းအတိုင်း assign လုပ်သည်။ Gaussian mixture method များသည်ဤအမျိုးအစားတွင်ပါဝင်သည်။ + +- **Density-based clustering**. Data point များကို၎င်းတို့၏ density အပေါ်အခြေခံ၍ cluster များအတွင်း assign လုပ်သည်၊ ၎င်းတို့အုပ်စုအနီးတွင်စုစည်းခြင်းဖြစ်သည်။ အုပ်စုမှဝေးသော data point များကို outlier သို့မဟုတ် noise ဟုယူဆသည်။ DBSCAN, Mean-shift နှင့် OPTICS သည်ဤအမျိုးအစားတွင်ပါဝင်သည်။ + +- **Grid-based clustering**. Multi-dimensional dataset များအတွက် grid တစ်ခုကိုဖန်တီးပြီး၊ data ကို grid ၏ cell များအတွင်းခွဲခြားခြင်းဖြင့် cluster များဖန်တီးသည်။ + +## လေ့ကျင့်ခန်း - သင့် data ကို cluster လုပ်ပါ + +Clustering သည် visualization မှတစ်ဆင့်အလွန်အကောင်းဆုံးအကူအညီရရှိသည်၊ ထို့ကြောင့် သင့် music data ကို visualize လုပ်ခြင်းဖြင့်စတင်ကြည့်ရအောင်။ ဤလေ့ကျင့်ခန်းသည် data nature အပေါ်အခြေခံ၍ clustering method မည်သို့အသုံးပြုရမည်ကိုဆုံးဖြတ်ရန်အကူအညီပေးမည်။ + +1. [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) ဖိုင်ကို folder အတွင်းဖွင့်ပါ။ + +1. Data visualization ကောင်းစွာလုပ်ရန် `Seaborn` package ကို import လုပ်ပါ။ + + ```python + !pip install seaborn + ``` + +1. [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv) မှ song +| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 | +| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 | +| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 | + +1. Dataframe အကြောင်းကို သိရှိရန် `info()` ကိုခေါ်ပါ: + + ```python + df.info() + ``` + + အထွေထွေ output က ဒီလိုပုံစံနဲ့ပါလိမ့်မယ်: + + ```output + + RangeIndex: 530 entries, 0 to 529 + Data columns (total 16 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 name 530 non-null object + 1 album 530 non-null object + 2 artist 530 non-null object + 3 artist_top_genre 530 non-null object + 4 release_date 530 non-null int64 + 5 length 530 non-null int64 + 6 popularity 530 non-null int64 + 7 danceability 530 non-null float64 + 8 acousticness 530 non-null float64 + 9 energy 530 non-null float64 + 10 instrumentalness 530 non-null float64 + 11 liveness 530 non-null float64 + 12 loudness 530 non-null float64 + 13 speechiness 530 non-null float64 + 14 tempo 530 non-null float64 + 15 time_signature 530 non-null int64 + dtypes: float64(8), int64(4), object(4) + memory usage: 66.4+ KB + ``` + +1. Null values ရှိမရှိ double-check လုပ်ပါ၊ `isnull()` ကိုခေါ်ပြီး sum ကို 0 ဖြစ်ကြောင်းအတည်ပြုပါ: + + ```python + df.isnull().sum() + ``` + + အဆင်ပြေပါတယ်: + + ```output + name 0 + album 0 + artist 0 + artist_top_genre 0 + release_date 0 + length 0 + popularity 0 + danceability 0 + acousticness 0 + energy 0 + instrumentalness 0 + liveness 0 + loudness 0 + speechiness 0 + tempo 0 + time_signature 0 + dtype: int64 + ``` + +1. Data ကို ဖော်ပြပါ: + + ```python + df.describe() + ``` + + | | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | + | ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- | + | count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | + | mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 | + | std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 | + | min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 | + | 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 | + | 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 | + | 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 | + | max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 | + +> 🤔 Clustering သည် labeled data မလိုအပ်သော unsupervised method ဖြစ်သည့်အတွက် label data ကို ဖော်ပြနေခြင်းက ဘာကြောင့်လဲ? Data exploration အဆင့်တွင် အသုံးဝင်နိုင်သော်လည်း clustering algorithms အတွက် မလိုအပ်ပါ။ Column headers ကို ဖယ်ရှားပြီး column number ဖြင့် data ကို ရည်ညွှန်းနိုင်ပါတယ်။ + +Data ရဲ့ အထွေထွေတန်ဖိုးတွေကို ကြည့်ပါ။ Popularity က '0' ဖြစ်နိုင်ပြီး အဲဒါက songs တွေ ranking မရှိကြောင်းပြသပါတယ်။ အဲဒါတွေကို ခဏလေးမှာ ဖယ်ရှားလိုက်ပါမယ်။ + +1. Barplot ကို အသုံးပြုပြီး အများဆုံး popular genres တွေကို ရှာပါ: + + ```python + import seaborn as sns + + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top[:5].index,y=top[:5].values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + ![most popular](../../../../5-Clustering/1-Visualize/images/popular.png) + +✅ Top values ပိုများစေချင်ရင် `[:5]` ကို value ပိုကြီးတဲ့အရာနဲ့ ပြောင်းပါ၊ ဒါမှမဟုတ် ဖယ်ရှားပြီး အားလုံးကို ကြည့်ပါ။ + +Note, top genre ကို 'Missing' လို့ ဖော်ပြထားရင် Spotify က အဲဒါကို classify မလုပ်တာဖြစ်ပါတယ်၊ ဒါကြောင့် ဖယ်ရှားလိုက်ပါ။ + +1. Missing data ကို ဖယ်ရှားပါ: + + ```python + df = df[df['artist_top_genre'] != 'Missing'] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + အခုတော့ genres တွေကို ပြန်စစ်ပါ: + + ![most popular](../../../../5-Clustering/1-Visualize/images/all-genres.png) + +1. Top three genres တွေ dataset ကို အဓိကထားပြီး `afro dancehall`, `afropop`, `nigerian pop` တွေကို စုစည်းပါ၊ Popularity value 0 ဖြစ်တဲ့အရာတွေကို ဖယ်ရှားပါ (အဲဒါက dataset မှာ popularity classification မရှိတာဖြစ်ပြီး noise အဖြစ် သတ်မှတ်နိုင်ပါတယ်): + + ```python + df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] + df = df[(df['popularity'] > 0)] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + +1. Data တွေ correlation ရှိမရှိ စစ်ဆေးပါ: + + ```python + corrmat = df.corr(numeric_only=True) + f, ax = plt.subplots(figsize=(12, 9)) + sns.heatmap(corrmat, vmax=.8, square=True) + ``` + + ![correlations](../../../../5-Clustering/1-Visualize/images/correlation.png) + + `energy` နဲ့ `loudness` အကြား correlation က အားကောင်းပါတယ်၊ ဒါက အံ့ဩစရာမဟုတ်ပါဘူး၊ အကြမ်း music တွေက အများအားဖြင့် energetic ဖြစ်တတ်ပါတယ်။ အခြား correlation တွေက အားနည်းပါတယ်။ Clustering algorithm က ဒီ data ကို ဘယ်လိုသုံးနိုင်မလဲ စိတ်ဝင်စားစရာပါ။ + + > 🎓 Correlation က causation ကို မပြသနိုင်ပါ! Correlation ရှိကြောင်း သက်သေရှိသော်လည်း causation ရှိကြောင်း သက်သေမရှိပါ။ [အလွဲလွဲ correlation တွေ](https://tylervigen.com/spurious-correlations) ကို ဖော်ပြတဲ့ website က ဒီအချက်ကို အထောက်အထားပေးပါတယ်။ + +Dataset မှာ song popularity နဲ့ danceability အကြား convergence ရှိပါသလား? FacetGrid က genre မရွေး concentric circles တွေ alignment ရှိကြောင်း ပြသပါတယ်။ Nigerian tastes တွေ danceability ရဲ့ အတိအကျတန်းမှာ converge ဖြစ်နိုင်ပါသလား? + +✅ အခြား datapoints (energy, loudness, speechiness) နဲ့ အခြား genres တွေကို စမ်းကြည့်ပါ။ ဘာတွေ ရှာဖွေနိုင်မလဲ? `df.describe()` table ကို ကြည့်ပြီး data points ရဲ့ general spread ကို သိပါ။ + +### လေ့ကျင့်ခန်း - data distribution + +Top three genres တွေ popularity နဲ့ danceability perception အတွက် significantly ကွဲပြားမှု ရှိပါသလား? + +1. Top three genres data distribution ကို popularity နဲ့ danceability အတွက် x axis နဲ့ y axis အတူတူကြည့်ပါ: + + ```python + sns.set_theme(style="ticks") + + g = sns.jointplot( + data=df, + x="popularity", y="danceability", hue="artist_top_genre", + kind="kde", + ) + ``` + + Concentric circles တွေ general point of convergence အနီးမှာ distribution ကို ပြသပါတယ်။ + + > 🎓 KDE (Kernel Density Estimate) graph ကို အသုံးပြုထားပြီး continuous probability density curve ဖြင့် data ကို ဖော်ပြထားပါတယ်။ ဒါက multiple distributions တွေကို အဓိကထားပြီး data ကို အဓိပ္ပါယ်ဖော်ပြနိုင်စေပါတယ်။ + + အထွေထွေအားဖြင့် genres သုံးခုက popularity နဲ့ danceability အတွက် loosely alignment ရှိပါတယ်။ Clustering algorithm အတွက် ဒီ alignment data ကို သတ်မှတ်ရမှာ စိန်ခေါ်မှုဖြစ်ပါမယ်: + + ![distribution](../../../../5-Clustering/1-Visualize/images/distribution.png) + +1. Scatter plot တစ်ခု ဖန်တီးပါ: + + ```python + sns.FacetGrid(df, hue="artist_top_genre", height=5) \ + .map(plt.scatter, "popularity", "danceability") \ + .add_legend() + ``` + + အတူတူ axis တွေ scatterplot က convergence pattern ကို ပြသပါတယ်။ + + ![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png) + +Clustering အတွက် scatterplots ကို အသုံးပြုပြီး data clusters တွေကို ဖော်ပြနိုင်ပါတယ်၊ ဒါကြောင့် visualization အမျိုးအစားကို ကျွမ်းကျင်စွာ အသုံးပြုနိုင်ဖို့ အရေးကြီးပါတယ်။ နောက် lesson မှာ filtered data ကို k-means clustering နဲ့ သုံးပြီး interesting overlap တွေကို ရှာဖွေပါမယ်။ + +--- + +## 🚀Challenge + +နောက် lesson အတွက် ပြင်ဆင်ရန်၊ production environment မှာ အသုံးပြုနိုင်တဲ့ clustering algorithms အမျိုးမျိုးအကြောင်း chart တစ်ခု ဖန်တီးပါ။ Clustering က ဘယ်လိုပြဿနာတွေကို ဖြေရှင်းဖို့ ကြိုးစားနေလဲ? + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Review & Self Study + +Clustering algorithms ကို အသုံးပြုမီ dataset ရဲ့ nature ကို နားလည်ထားတာ အရေးကြီးပါတယ်။ ဒီအကြောင်းကို [ဒီမှာ](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) ဖတ်ရှုပါ။ + +[ဒီ article](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) က clustering algorithms အမျိုးမျိုးရဲ့ behavior ကို data shapes အမျိုးမျိုးနဲ့ ဖော်ပြထားပါတယ်။ + +## Assignment + +[Clustering visualization အခြားအမျိုးအစားတွေကို ရှာဖွေပါ](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/5-Clustering/1-Visualize/assignment.md b/translations/my/5-Clustering/1-Visualize/assignment.md new file mode 100644 index 00000000..06aa07eb --- /dev/null +++ b/translations/my/5-Clustering/1-Visualize/assignment.md @@ -0,0 +1,25 @@ + +# အုပ်စုဖွဲ့ခြင်းအတွက် အခြားဗီဇွယ်လိုက်ဇေးရှင်းများကို သုတေသနလုပ်ပါ + +## လမ်းညွှန်ချက်များ + +ဒီသင်ခန်းစာမှာ သင်ဟာ သင့်ဒေတာကို အုပ်စုဖွဲ့ရန် ပြင်ဆင်နေစဉ်မှာ ဒေတာကို ပုံဖော်ရန် အသုံးပြုနိုင်တဲ့ ဗီဇွယ်လိုက်ဇေးရှင်းနည်းလမ်းများကို လေ့လာခဲ့ပါတယ်။ အထူးသဖြင့် Scatterplots တွေဟာ အုပ်စုဖွဲ့ထားတဲ့ အရာများကို ရှာဖွေဖို့ အထောက်အကူဖြစ်ပါတယ်။ Scatterplots ဖန်တီးဖို့ အခြားနည်းလမ်းများနဲ့ အခြား libraries တွေကို သုတေသနလုပ်ပြီး သင့်ရဲ့ notebook မှာ မှတ်တမ်းတင်ပါ။ ဒီသင်ခန်းစာက ဒေတာ၊ အခြားသင်ခန်းစာများက ဒေတာ၊ ဒါမှမဟုတ် သင့်ကိုယ်တိုင် ရှာဖွေတဲ့ ဒေတာကို အသုံးပြုနိုင်ပါတယ် (သို့သော် သင့် notebook မှာ ဒေတာရင်းမြစ်ကို မှတ်တမ်းတင်ပေးပါ။) Scatterplots အသုံးပြုပြီး ဒေတာတစ်ချို့ကို ပုံဖော်ပါ၊ သင့်ရဲ့ ရှာဖွေတွေ့ရှိချက်များကို ရှင်းပြပါ။ + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| -------- | -------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------- | +| | Scatterplots ၅ ခုကို မှတ်တမ်းပြုထားပြီး notebook တစ်ခုကို တင်ပြထားသည် | Scatterplots ၅ ခုအောက်ကို မှတ်တမ်းပြုထားပြီး documentation မလုံလောက်သော notebook တစ်ခုကို တင်ပြထားသည် | မပြီးစီးသော notebook တစ်ခုကို တင်ပြထားသည် | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသောအချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/5-Clustering/1-Visualize/solution/Julia/README.md b/translations/my/5-Clustering/1-Visualize/solution/Julia/README.md new file mode 100644 index 00000000..e9f7e29a --- /dev/null +++ b/translations/my/5-Clustering/1-Visualize/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ပညာရှင်များ၏ ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/5-Clustering/2-K-Means/README.md b/translations/my/5-Clustering/2-K-Means/README.md new file mode 100644 index 00000000..4364de99 --- /dev/null +++ b/translations/my/5-Clustering/2-K-Means/README.md @@ -0,0 +1,261 @@ + +# K-Means clustering + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +ဒီသင်ခန်းစာမှာ Scikit-learn နဲ့ နိုင်ဂျီးရီးယားဂီတဒေတာစနစ်ကို အသုံးပြုပြီး cluster တွေဖန်တီးနည်းကို သင်ယူပါမယ်။ K-Means Clustering ရဲ့ အခြေခံကို လေ့လာပါမယ်။ အရင်သင်ခန်းစာမှာ သင်ယူခဲ့သလို၊ cluster တွေကို အလုပ်လုပ်စေဖို့ နည်းလမ်းများစွာရှိပြီး သင့်ဒေတာပေါ်မူတည်ပြီး သင့်လျော်တဲ့နည်းလမ်းကို ရွေးချယ်ရပါမယ်။ K-Means က အများဆုံးအသုံးပြုတဲ့ clustering နည်းလမ်းဖြစ်တဲ့အတွက် အခုနည်းလမ်းကို စမ်းကြည့်ပါမယ်။ စလိုက်ကြစို့! + +သင်လေ့လာရမယ့်အကြောင်းအရာများ: + +- Silhouette scoring +- Elbow method +- Inertia +- Variance + +## Introduction + +[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering) က signal processing နယ်ပယ်ကနေ ဆင်းသက်လာတဲ့ နည်းလမ်းတစ်ခုဖြစ်ပါတယ်။ ဒါကို 'k' cluster တွေထဲမှာ observation တွေကို အသုံးပြုပြီး ဒေတာအုပ်စုတွေကို ခွဲခြားဖို့ အသုံးပြုပါတယ်။ observation တစ်ခုစီက cluster ရဲ့ center point (mean) နီးစပ်ဆုံးနေရာကို group ဖွဲ့ဖို့ အလုပ်လုပ်ပါတယ်။ + +ဒီ cluster တွေကို [Voronoi diagrams](https://wikipedia.org/wiki/Voronoi_diagram) အနေနဲ့ visualization လုပ်နိုင်ပါတယ်။ Voronoi diagram တွေမှာ point (seed) နဲ့ region တွေပါဝင်ပါတယ်။ + +![voronoi diagram](../../../../5-Clustering/2-K-Means/images/voronoi.png) + +> infographic by [Jen Looper](https://twitter.com/jenlooper) + +K-Means clustering process [သုံးအဆင့်ဖြင့် အလုပ်လုပ်ပါတယ်](https://scikit-learn.org/stable/modules/clustering.html#k-means): + +1. Algorithm က dataset ထဲကနေ k-number center points ကို ရွေးချယ်ပါတယ်။ အဲဒီနောက် loop လုပ်ပါတယ်: + 1. Sample တစ်ခုစီကို နီးစပ်ဆုံး centroid ကို assign လုပ်ပါတယ်။ + 2. အရင် centroid တွေကို assign လုပ်ထားတဲ့ sample တွေကို mean value အနေနဲ့ အသစ်သော centroid တွေဖန်တီးပါတယ်။ + 3. အဟောင်း centroid နဲ့ အသစ် centroid တွေကြားက အကွာအဝေးကိုတွက်ပြီး centroid တွေတည်ငြိမ်တဲ့အထိ ထပ်လုပ်ပါတယ်။ + +K-Means ရဲ့ အားနည်းချက်တစ်ခုက 'k' (centroid အရေအတွက်) ကို သတ်မှတ်ဖို့လိုပါတယ်။ ကံကောင်းစွာ 'elbow method' က 'k' ရဲ့ စတင်အရေအတွက်ကို ခန့်မှန်းဖို့ ကူညီပေးပါတယ်။ အခုလိုလုပ်ကြည့်ပါမယ်။ + +## Prerequisite + +ဒီသင်ခန်းစာရဲ့ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) ဖိုင်မှာ အရင်သင်ခန်းစာမှာလုပ်ခဲ့တဲ့ data import နဲ့ preliminary cleaning ပါဝင်ပါတယ်။ + +## Exercise - preparation + +သီချင်းဒေတာကို ပြန်ကြည့်ပါ။ + +1. Column တစ်ခုစီအတွက် `boxplot()` ကိုခေါ်ပြီး boxplot တစ်ခုဖန်တီးပါ: + + ```python + plt.figure(figsize=(20,20), dpi=200) + + plt.subplot(4,3,1) + sns.boxplot(x = 'popularity', data = df) + + plt.subplot(4,3,2) + sns.boxplot(x = 'acousticness', data = df) + + plt.subplot(4,3,3) + sns.boxplot(x = 'energy', data = df) + + plt.subplot(4,3,4) + sns.boxplot(x = 'instrumentalness', data = df) + + plt.subplot(4,3,5) + sns.boxplot(x = 'liveness', data = df) + + plt.subplot(4,3,6) + sns.boxplot(x = 'loudness', data = df) + + plt.subplot(4,3,7) + sns.boxplot(x = 'speechiness', data = df) + + plt.subplot(4,3,8) + sns.boxplot(x = 'tempo', data = df) + + plt.subplot(4,3,9) + sns.boxplot(x = 'time_signature', data = df) + + plt.subplot(4,3,10) + sns.boxplot(x = 'danceability', data = df) + + plt.subplot(4,3,11) + sns.boxplot(x = 'length', data = df) + + plt.subplot(4,3,12) + sns.boxplot(x = 'release_date', data = df) + ``` + + ဒီဒေတာက noise အနည်းငယ်ပါဝင်ပါတယ်။ Column တစ်ခုစီကို boxplot အနေနဲ့ကြည့်ပြီး outlier တွေကိုတွေ့နိုင်ပါတယ်။ + + ![outliers](../../../../5-Clustering/2-K-Means/images/boxplots.png) + +ဒေတာထဲက outlier တွေကို ဖယ်ရှားနိုင်ပေမယ့် ဒေတာအရေအတွက်က နည်းသွားနိုင်ပါတယ်။ + +1. Clustering exercise အတွက် သုံးမယ့် column တွေကို ရွေးချယ်ပါ။ အတူတူ range ရှိတဲ့ column တွေကို ရွေးပြီး `artist_top_genre` column ကို numeric data အနေနဲ့ encode လုပ်ပါ: + + ```python + from sklearn.preprocessing import LabelEncoder + le = LabelEncoder() + + X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')] + + y = df['artist_top_genre'] + + X['artist_top_genre'] = le.fit_transform(X['artist_top_genre']) + + y = le.transform(y) + ``` + +1. Cluster အရေအတွက်ကို ရွေးချယ်ဖို့လိုပါတယ်။ Dataset ထဲက သီချင်းအမျိုးအစား 3 ခုရှိတာကိုသိပြီးသားဖြစ်တဲ့အတွက် 3 ကိုစမ်းကြည့်ပါ: + + ```python + from sklearn.cluster import KMeans + + nclusters = 3 + seed = 0 + + km = KMeans(n_clusters=nclusters, random_state=seed) + km.fit(X) + + # Predict the cluster for each data point + + y_cluster_kmeans = km.predict(X) + y_cluster_kmeans + ``` + +Dataframe ရဲ့ row တစ်ခုစီအတွက် (0, 1, 2) cluster တွေကို ခန့်မှန်းထားတဲ့ array ကို print ထုတ်ကြည့်နိုင်ပါတယ်။ + +1. ဒီ array ကို အသုံးပြုပြီး 'silhouette score' ကိုတွက်ပါ: + + ```python + from sklearn import metrics + score = metrics.silhouette_score(X, y_cluster_kmeans) + score + ``` + +## Silhouette score + +Silhouette score 1 နီးစပ်တဲ့အရေအတွက်ကို ရှာပါ။ ဒီ score က -1 မှ 1 အထိရှိပြီး score 1 ဆို cluster က အထူးသီးသန့်ပြီး အခြား cluster တွေထဲက sample တွေကို ကောင်းစွာခွဲခြားထားပါတယ်။ 0 နီးစပ်တဲ့ value က cluster တွေ overlap ဖြစ်ပြီး sample တွေက decision boundary နီးစပ်နေတဲ့အခြေအနေကို ဖော်ပြပါတယ်။ [(Source)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam) + +ကျွန်တော်တို့ရဲ့ score က **.53** ဖြစ်ပြီး အလယ်တန်းမှာရှိပါတယ်။ ဒါက ဒီ data က ဒီလို clustering နည်းလမ်းအတွက် သင့်လျော်မှုမရှိတာကို ဖော်ပြပါတယ်။ ဒါပေမယ့် ဆက်လုပ်ကြည့်ပါမယ်။ + +### Exercise - build a model + +1. `KMeans` ကို import လုပ်ပြီး clustering process ကို စတင်ပါ။ + + ```python + from sklearn.cluster import KMeans + wcss = [] + + for i in range(1, 11): + kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42) + kmeans.fit(X) + wcss.append(kmeans.inertia_) + + ``` + + ဒီမှာ အဓိကအချက်အချို့ကိုရှင်းပြပါမယ်။ + + > 🎓 range: Clustering process ရဲ့ iteration တွေ + + > 🎓 random_state: "Centroid initialization အတွက် random number generation ကို သတ်မှတ်ပါတယ်။" [Source](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans) + + > 🎓 WCSS: "within-cluster sums of squares" က cluster centroid နဲ့ cluster ထဲမှာရှိတဲ့ point တွေကြားက squared average distance ကိုတိုင်းတာပါတယ်။ [Source](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce). + + > 🎓 Inertia: K-Means algorithm တွေက 'inertia' ကို လျှော့ချဖို့ centroid တွေကို ရွေးချယ်ဖို့ကြိုးစားပါတယ်။ "Cluster တွေ internally coherent ဖြစ်မှုကိုတိုင်းတာတဲ့အချက်" [Source](https://scikit-learn.org/stable/modules/clustering.html). WCSS variable ထဲကို iteration တစ်ခုစီမှာ value ကိုထည့်သွင်းပါတယ်။ + + > 🎓 k-means++: [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) မှာ 'k-means++' optimization ကို အသုံးပြုနိုင်ပြီး "Centroid တွေကို အချင်းချင်းဝေးဝေးနေဖို့ initialize လုပ်ပြီး random initialization ထက်ပိုကောင်းတဲ့ရလဒ်ရဖို့ အကောင်းဆုံးဖြစ်နိုင်ပါတယ်။" + +### Elbow method + +အရင်က သီချင်းအမျိုးအစား 3 ခုကို target လုပ်ထားတဲ့အတွက် cluster 3 ခုကို ရွေးချယ်သင့်တယ်လို့ ခန့်မှန်းထားပါတယ်။ ဒါပေမယ့် အဲဒါမှန်ပါသလား? + +1. 'elbow method' ကို အသုံးပြုပြီး သေချာစေပါ။ + + ```python + plt.figure(figsize=(10,5)) + sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red') + plt.title('Elbow') + plt.xlabel('Number of clusters') + plt.ylabel('WCSS') + plt.show() + ``` + + အရင်အဆင့်မှာ တည်ဆောက်ထားတဲ့ `wcss` variable ကို အသုံးပြုပြီး elbow graph ရဲ့ 'bend' ကိုဖော်ပြတဲ့ chart တစ်ခုဖန်တီးပါ။ ဒီနေရာက optimum cluster အရေအတွက်ကို ဖော်ပြပါတယ်။ 3 ဖြစ်နိုင်ပါတယ်! + + ![elbow method](../../../../5-Clustering/2-K-Means/images/elbow.png) + +## Exercise - display the clusters + +1. Process ကို ထပ်လုပ်ပြီး cluster 3 ခုကို သတ်မှတ်ပြီး scatterplot အနေနဲ့ cluster တွေကို ဖော်ပြပါ: + + ```python + from sklearn.cluster import KMeans + kmeans = KMeans(n_clusters = 3) + kmeans.fit(X) + labels = kmeans.predict(X) + plt.scatter(df['popularity'],df['danceability'],c = labels) + plt.xlabel('popularity') + plt.ylabel('danceability') + plt.show() + ``` + +1. Model ရဲ့ accuracy ကိုစစ်ပါ: + + ```python + labels = kmeans.labels_ + + correct_labels = sum(y == labels) + + print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size)) + + print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size))) + ``` + + ဒီ model ရဲ့ accuracy က မကောင်းပါဘူး။ Cluster တွေ၏ shape က အကြောင်းပြချက်ကို ဖော်ပြပါတယ်။ + + ![clusters](../../../../5-Clustering/2-K-Means/images/clusters.png) + + ဒီ data က အလွန်မညီမျှမှုရှိပြီး column value တွေကြား variance များလွန်းတဲ့အတွက် cluster တွေကောင်းစွာဖွဲ့မရနိုင်ပါဘူး။ အမှန်တကယ် cluster တွေက အထက်မှာ သတ်မှတ်ထားတဲ့ genre category 3 ခုကြောင့် skew ဖြစ်နေပါတယ်။ ဒါက သင်ယူမှုဖြစ်ပါတယ်! + + Scikit-learn ရဲ့ documentation မှာ cluster တွေကောင်းစွာခွဲခြားမရတဲ့ model တစ်ခုက 'variance' ပြဿနာရှိတယ်လို့ ဖော်ပြထားပါတယ်။ + + ![problem models](../../../../5-Clustering/2-K-Means/images/problems.png) + > Infographic from Scikit-learn + +## Variance + +Variance ကို "Mean နဲ့ အကွာအဝေး squared differences ရဲ့ အလယ်တန်း" အနေနဲ့ သတ်မှတ်ထားပါတယ် [(Source)](https://www.mathsisfun.com/data/standard-deviation.html). Clustering problem ရဲ့ အခြေအနေမှာ ဒေတာက mean နဲ့ အကွာအဝေးများလွန်းတာကို ဖော်ပြပါတယ်။ + +✅ ဒီအချိန်မှာ ဒီပြဿနာကို ဖြေရှင်းဖို့ နည်းလမ်းတွေကို စဉ်းစားဖို့ အချိန်ကောင်းတစ်ခုဖြစ်ပါတယ်။ ဒေတာကို နည်းနည်းပိုပြီး ပြင်ဆင်မလား? Column အခြားတစ်ခုကို အသုံးပြုမလား? Algorithm အခြားတစ်ခုကို စမ်းမလား? Hint: [ဒေတာကို scale လုပ်](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/)ပြီး normalize လုပ်ပြီး column အခြားတစ်ခုကို စမ်းကြည့်ပါ။ + +> '[variance calculator](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' ကို အသုံးပြုပြီး concept ကို နားလည်ပါ။ + +--- + +## 🚀Challenge + +ဒီ notebook ကို အချိန်ယူပြီး parameter တွေကို ပြင်ဆင်ပါ။ ဒေတာကို ပိုပြီးသန့်စင် (outlier တွေဖယ်ရှားခြင်း) လုပ်ပြီး model ရဲ့ accuracy ကို တိုးမြှင့်နိုင်ပါသလား? Weight တွေကို အသုံးပြုပြီး data sample တစ်ခုချင်းစီကို ပိုအလေးထားနိုင်ပါတယ်။ Cluster တွေကို ပိုကောင်းစွာဖန်တီးဖို့ ဘာတွေလုပ်နိုင်မလဲ? + +Hint: ဒေတာကို scale လုပ်ကြည့်ပါ။ Notebook ထဲမှာ commented code ရှိပြီး standard scaling ကိုထည့်သွင်းထားပါတယ်။ ဒါက data column တွေကို range အနေနဲ့ ပိုနီးစပ်စေပါတယ်။ Silhouette score က ကျသွားပေမယ့် elbow graph ရဲ့ 'kink' က smooth ဖြစ်သွားပါတယ်။ ဒေတာကို unscaled ထားရင် variance နည်းတဲ့ data က ပိုအလေးထားခံရပါတယ်။ ဒီပြဿနာအကြောင်းကို [ဒီမှာ](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226) ဖတ်ပါ။ + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Review & Self Study + +K-Means Simulator [ဒီလို](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/) တစ်ခုကို ကြည့်ပါ။ ဒီ tool ကို အသုံးပြုပြီး sample data point တွေကို visualization လုပ်ပြီး centroid တွေကို သတ်မှတ်နိုင်ပါတယ်။ ဒေတာရဲ့ randomness, cluster အရေအတွက်နဲ့ centroid အရေအတွက်ကို ပြင်ဆင်နိုင်ပါတယ်။ ဒေတာကို group ဖွဲ့နည်းကို နားလည်ဖို့ ကူညီပါသလား? + +Stanford ရဲ့ [ဒီ K-Means handout](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) ကိုလည်း ကြည့်ပါ။ + +## Assignment + +[Clustering နည်းလမ်းအခြားတစ်ခုကို စမ်းကြည့်ပါ](assignment.md) + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါရှိနိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာရှိသော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားယူမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/5-Clustering/2-K-Means/assignment.md b/translations/my/5-Clustering/2-K-Means/assignment.md new file mode 100644 index 00000000..90e245b6 --- /dev/null +++ b/translations/my/5-Clustering/2-K-Means/assignment.md @@ -0,0 +1,25 @@ + +# ကွဲပြားသော Clustering နည်းလမ်းများကို စမ်းသပ်ပါ + +## လမ်းညွှန်ချက်များ + +ဒီသင်ခန်းစာမှာ K-Means clustering အကြောင်းကို သင်လေ့လာခဲ့ပါတယ်။ တစ်ခါတစ်ရံ K-Means သင့်ရဲ့ဒေတာအတွက် သင့်တော်မဖြစ်နိုင်ပါ။ ဒီသင်ခန်းစာတွေက ဒေတာတွေကို သို့မဟုတ် အခြားနေရာက ဒေတာတွေကို အသုံးပြုပြီး notebook တစ်ခုကို ဖန်တီးပါ။ (သင်ရဲ့အရင်းအမြစ်ကို ဖော်ပြပါ) K-Means ကို မသုံးဘဲ ကွဲပြားတဲ့ clustering နည်းလမ်းတစ်ခုကို ပြပါ။ သင်ဘာတွေသင်ယူခဲ့ပါသလဲ? + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သည် | +| -------- | --------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------- | +| | notebook တစ်ခုကို ကောင်းမွန်စွာ ရှင်းလင်းရေးသားထားသော clustering မော်ဒယ်နှင့်တင်ပြထားသည် | notebook တစ်ခုကို ရှင်းလင်းရေးသားမှုမကောင်းဘဲ သို့မဟုတ် မပြီးစီးဘဲတင်ပြထားသည် | မပြီးစီးသောအလုပ်ကို တင်ပြထားသည် | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသည့် နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/5-Clustering/2-K-Means/solution/Julia/README.md b/translations/my/5-Clustering/2-K-Means/solution/Julia/README.md new file mode 100644 index 00000000..f74ac461 --- /dev/null +++ b/translations/my/5-Clustering/2-K-Means/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/5-Clustering/README.md b/translations/my/5-Clustering/README.md new file mode 100644 index 00000000..796f9248 --- /dev/null +++ b/translations/my/5-Clustering/README.md @@ -0,0 +1,42 @@ + +# စက်ရုပ်သင်ယူမှုအတွက် Clustering မော်ဒယ်များ + +Clustering သည် စက်ရုပ်သင်ယူမှုလုပ်ငန်းတစ်ခုဖြစ်ပြီး၊ တူညီမှုရှိသော အရာများကို ရှာဖွေပြီး အုပ်စုများ (clusters) အဖြစ် စုစည်းပေးသည်။ Clustering သည် စက်ရုပ်သင်ယူမှု၏ အခြားနည်းလမ်းများနှင့် ကွဲပြားခြားနားပြီး၊ အလိုအလျောက်ဖြစ်ပျက်သည်။ တကယ်တော့ supervised learning နှင့် ဆန့်ကျင်ဘက်ဖြစ်သည်ဟု ဆိုနိုင်သည်။ + +## ဒေသဆိုင်ရာ ခေါင်းစဉ် - နိုင်ဂျီးရီးယားပရိသတ်၏ ဂီတအရသာအတွက် clustering မော်ဒယ်များ 🎧 + +နိုင်ဂျီးရီးယား၏ အမျိုးမျိုးသောပရိသတ်များတွင် အမျိုးမျိုးသော ဂီတအရသာများရှိသည်။ [ဒီဆောင်းပါး](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421) မှ အားကိုးပြီး Spotify မှ ရှာဖွေထားသော ဒေတာကို အသုံးပြု၍ နိုင်ဂျီးရီးယားတွင် လူကြိုက်များသော ဂီတအချို့ကို ကြည့်ကြမည်။ ဒီဒေတာစဉ်တွင် သီချင်းများ၏ 'danceability' အဆင့်၊ 'acousticness'၊ 'loudness'၊ 'speechiness'၊ လူကြိုက်များမှုနှင့် 'energy' အကြောင်းအရာများ ပါဝင်သည်။ ဒီဒေတာတွင် ပုံစံများကို ရှာဖွေဖို့ စိတ်ဝင်စားဖွယ်ကောင်းပါသည်။ + +![A turntable](../../../5-Clustering/images/turntable.jpg) + +> Marcela Laskoski မှ Unsplash တွင် ရိုက်ထားသော ဓာတ်ပုံ + +ဒီသင်ခန်းစာများတွင် Clustering နည်းလမ်းများကို အသုံးပြု၍ ဒေတာကို လေ့လာသုံးသပ်ရန် နည်းလမ်းအသစ်များကို ရှာဖွေမည်ဖြစ်သည်။ Clustering သည် သင်၏ ဒေတာစဉ်တွင် label မပါဝင်သောအခါ အထူးအသုံးဝင်သည်။ Label ပါဝင်ပါက၊ ယခင်သင်ခန်းစာများတွင် သင်လေ့လာခဲ့သော classification နည်းလမ်းများက ပိုအသုံးဝင်နိုင်သည်။ သို့သော် label မပါဝင်သော ဒေတာကို အုပ်စုဖွဲ့လိုသောအခါ Clustering သည် ပုံစံများကို ရှာဖွေဖို့ အကောင်းဆုံးနည်းလမ်းဖြစ်သည်။ + +> Clustering မော်ဒယ်များနှင့် အလုပ်လုပ်ခြင်းကို လေ့လာရန် အထောက်အကူပြုသော low-code tools များရှိသည်။ [Azure ML](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) ကို စမ်းကြည့်ပါ။ + +## သင်ခန်းစာများ + +1. [Clustering ကိုမိတ်ဆက်ခြင်း](1-Visualize/README.md) +2. [K-Means Clustering](2-K-Means/README.md) + +## အကျိုးတူ + +ဒီသင်ခန်းစာများကို 🎶 [Jen Looper](https://www.twitter.com/jenlooper) မှ ရေးသားပြီး၊ [Rishit Dagli](https://rishit_dagli) နှင့် [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) မှ အထောက်အကူပြုသုံးသပ်ချက်များဖြင့် အကောင်းဆုံးဖြစ်စေရန် ပြုလုပ်ထားသည်။ + +[Nigerian Songs](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) ဒေတာစဉ်ကို Kaggle မှ Spotify မှ ရှာဖွေထားသည်။ + +ဒီသင်ခန်းစာကို ဖန်တီးရာတွင် အထောက်အကူပြုခဲ့သော အသုံးဝင်သော K-Means နမူနာများမှာ [iris exploration](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering)၊ [introductory notebook](https://www.kaggle.com/prashant111/k-means-clustering-with-python) နှင့် [hypothetical NGO example](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering) တို့ဖြစ်သည်။ + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွဲအချော်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/1-Introduction-to-NLP/README.md b/translations/my/6-NLP/1-Introduction-to-NLP/README.md new file mode 100644 index 00000000..351656b5 --- /dev/null +++ b/translations/my/6-NLP/1-Introduction-to-NLP/README.md @@ -0,0 +1,163 @@ + +# သဘာဝဘာသာစကားလုပ်ငန်းစဉ် (NLP) အကြောင်းမိတ်ဆက် + +ဒီသင်ခန်းစာမှာ *သဘာဝဘာသာစကားလုပ်ငန်းစဉ်* (NLP) ရဲ့ သမိုင်းအကျဉ်းချုပ်နဲ့ အရေးကြီးသောအယူအဆများကို လေ့လာသွားမှာ ဖြစ်ပါတယ်။ ဒါဟာ *ကွန်ပျူတာဘာသာဗေဒ* (computational linguistics) ရဲ့ အခန်းကဏ္ဍတစ်ခုဖြစ်ပါတယ်။ + +## [သင်ခန်းမတိုင်မီ စမ်းမေးခွန်း](https://ff-quizzes.netlify.app/en/ml/) + +## မိတ်ဆက် + +NLP ဟာ လူသိများတဲ့ အခန်းကဏ္ဍတစ်ခုဖြစ်ပြီး၊ ဒီနယ်ပယ်မှာ စက်လေ့လာမှု (machine learning) ကို အောင်မြင်စွာ အသုံးချထားပါတယ်။ + +✅ သင်နေ့စဉ်အသုံးပြုနေတဲ့ ဆော့ဖ်ဝဲတွေထဲမှာ NLP ပါဝင်နေတာကို သတိထားမိပါသလား။ ဥပမာ - သင့်ရဲ့ စကားဝိုင်းဆော့ဖ်ဝဲတွေ၊ သို့မဟုတ် မိုဘိုင်းအက်ပ်တွေမှာပါ။ + +ဒီသင်ခန်းစာမှာ သင်လေ့လာရမယ့်အရာတွေက: + +- **ဘာသာစကားရဲ့ အယူအဆ**: ဘာသာစကားတွေ ဘယ်လိုဖွံ့ဖြိုးလာပြီး ဘာသာဗေဒရဲ့ အဓိကလေ့လာရေးနယ်ပယ်တွေက ဘာတွေလဲဆိုတာ။ +- **အဓိပ္ပါယ်နဲ့ အယူအဆများ**: ကွန်ပျူတာတွေ ဘာသာစကားကို ဘယ်လိုလုပ်ငန်းစဉ်ဖြင့် ကိုင်တွယ်တယ်ဆိုတာ၊ ဥပမာ - စာကြောင်းခွဲခြမ်းစိတ်ဖြာခြင်း၊ သဒ္ဒါနဲ့ နာမ်၊ ကြိယာတွေကို သတ်မှတ်ခြင်း စတာတွေကို လေ့လာရမှာ ဖြစ်ပါတယ်။ + +## ကွန်ပျူတာဘာသာဗေဒ + +ကွန်ပျူတာဘာသာဗေဒ (computational linguistics) ဟာ အတော်လေးနှစ်ပေါင်းများစွာ လေ့လာရေးနဲ့ ဖွံ့ဖြိုးရေးလုပ်နေတဲ့ နယ်ပယ်တစ်ခုဖြစ်ပြီး၊ ကွန်ပျူတာတွေက ဘာသာစကားနဲ့ အလုပ်လုပ်နိုင်ဖို့၊ နားလည်နိုင်ဖို့၊ ဘာသာပြန်နိုင်ဖို့ စမ်းသပ်နေတဲ့ နယ်ပယ်တစ်ခုပါ။ သဘာဝဘာသာစကားလုပ်ငန်းစဉ် (NLP) ဟာ လူသားဘာသာစကားတွေကို အဓိကထားပြီး လေ့လာတဲ့ နယ်ပယ်တစ်ခုဖြစ်ပါတယ်။ + +### ဥပမာ - ဖုန်း dictation + +သင်ဖုန်းမှာ စာရိုက်မယ့်အစား စကားပြောပြီး စာသားအဖြစ် ပြောင်းတာကို သုံးဖူးလား။ ဒါဟာ သင်ပြောတဲ့စကားကို စနစ်တစ်ခုက စာသားအဖြစ် ပြောင်းပြီး၊ နောက်ပြီးတော့ အဲဒီစာသားကို သင့်ဖုန်း သို့မဟုတ် အကူအညီပေးစနစ်နဲ့ နားလည်နိုင်အောင် ပြောင်းတာပါ။ + +![comprehension](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png) +> ဘာသာစကားနားလည်မှုဟာ အလွန်ခက်ခဲပါတယ်! ပုံကို [Jen Looper](https://twitter.com/jenlooper) မှ ဖန်တီးထားပါတယ်။ + +### ဒီနည်းပညာ ဘယ်လိုဖြစ်နိုင်တာလဲ? + +ဒါဟာ တစ်စုံတစ်ယောက်က ဒီလိုလုပ်ဖို့ ကွန်ပျူတာပရိုဂရမ်ရေးသားထားလို့ ဖြစ်ပါတယ်။ အချို့သော သိပ္ပံစိတ်ကူးရေးသားသူတွေက လူတွေက ကွန်ပျူတာနဲ့ စကားပြောပြီး၊ ကွန်ပျူတာက အမြဲတမ်း နားလည်နိုင်မယ်လို့ ခန့်မှန်းခဲ့ကြပါတယ်။ ဒါပေမယ့် အဲဒါဟာ အလွန်ခက်ခဲတဲ့ ပြဿနာတစ်ခုဖြစ်ပြီး၊ ယနေ့အချိန်မှာ ပိုမိုနားလည်နိုင်ပေမယ့်၊ စာကြောင်းတစ်ကြောင်းရဲ့ အဓိပ္ပါယ်ကို အပြည့်အဝနားလည်နိုင်ဖို့ အခက်အခဲတွေ ရှိနေဆဲပါ။ + +သင့်ကို သဒ္ဒါနဲ့ ပတ်သက်ပြီး ကျောင်းမှာ သင်ခဲ့တဲ့ အချိန်တွေကို သတိရစေမလား။ နာမ်နဲ့ ကြိယာကို ခွဲခြားဖို့ ခက်ခဲတယ်ဆိုရင်၊ သင်တစ်ယောက်တည်းမဟုတ်ပါဘူး။ ကံကောင်းစွာနဲ့ ကွန်ပျူတာတွေက သဒ္ဒါစည်းမျဉ်းတွေကို အလွန်ကောင်းစွာ လိုက်နာနိုင်ပါတယ်။ + +## ကြိုတင်လိုအပ်ချက်များ + +ဒီသင်ခန်းစာအတွက် အဓိကလိုအပ်ချက်က သင့်အတွက် ဒီသင်ခန်းစာရဲ့ ဘာသာစကားကို နားလည်ဖတ်ရှုနိုင်ဖို့ပါ။ သင့်မှာ သင်္ချာပြဿနာတွေ သို့မဟုတ် ဆာမီးမရှိပါဘူး။ + +ဒီသင်ခန်းစာမှာ သင်လိုအပ်မယ့်အရာတွေက: + +- **Python 3 comprehension**: Python 3 ကို နားလည်ဖို့လိုအပ်ပါတယ်။ +- **Visual Studio Code + extension**: Visual Studio Code နဲ့ Python extension ကို သုံးပါ။ +- **TextBlob**: [TextBlob](https://github.com/sloria/TextBlob) ဟာ Python အတွက် ရိုးရှင်းတဲ့ စာသားလုပ်ငန်းစဉ် စာကြောင်းပါ။ + + ```bash + pip install -U textblob + python -m textblob.download_corpora + ``` + +> 💡 အကြံပြုချက်: Python ကို VS Code ပတ်ဝန်းကျင်မှာ တိုက်ရိုက် အလုပ်လုပ်နိုင်ပါတယ်။ [docs](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) ကို ကြည့်ပါ။ + +## စက်တွေနဲ့ စကားပြောခြင်း + +လူသားဘာသာစကားကို ကွန်ပျူတာနားလည်စေဖို့ ကြိုးစားမှုဟာ အတော်လေးနှစ်ပေါင်းများစွာ ရှိခဲ့ပြီး၊ အစောဆုံး သိပ္ပံပညာရှင်တစ်ဦးဖြစ်တဲ့ *Alan Turing* က ဒီအကြောင်းကို စဉ်းစားခဲ့ပါတယ်။ + +### 'Turing Test' + +Turing ဟာ 1950 ခုနှစ်တွေမှာ *အတုယူပွဲ* (The Imitation Game) ဆိုတဲ့ အကြံကနေ စတင်ပြီး၊ လူနဲ့ ကွန်ပျူတာကို စကားပြောစမ်းသပ်မှုတစ်ခုလုပ်ခဲ့ပါတယ်။ + +### Eliza ဖွံ့ဖြိုးတိုးတက်မှု + +1960 ခုနှစ်တွေမှာ MIT ရဲ့ သိပ္ပံပညာရှင်တစ်ဦးဖြစ်တဲ့ *Joseph Weizenbaum* က [*Eliza*](https://wikipedia.org/wiki/ELIZA) ဆိုတဲ့ ကွန်ပျူတာ 'သိပ္ပံဆရာ' တစ်ဦးကို ဖန်တီးခဲ့ပါတယ်။ + +[![Chatting with Eliza](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Chatting with Eliza") + +> 🎥 Eliza အကြောင်း ဗီဒီယိုကို ကြည့်ရန် ပုံကို နှိပ်ပါ။ + +## လေ့ကျင့်မှု - အခြေခံ စကားပြော bot တစ်ခုရေးခြင်း + +Eliza လိုပဲ စကားပြော bot တစ်ခုကို Python နဲ့ ဖန်တီးကြည့်ပါ။ + +### အစီအစဉ် + +1. အသုံးပြုသူကို bot နဲ့ ဘယ်လိုအလုပ်လုပ်ရမယ်ဆိုတာ ရှင်းပြပါ။ +2. loop တစ်ခုစတင်ပါ။ + 1. အသုံးပြုသူရဲ့ input ကို လက်ခံပါ။ + 2. အသုံးပြုသူက ထွက်ချင်တယ်ဆိုရင် ထွက်ပါ။ + 3. အသုံးပြုသူရဲ့ input ကို လုပ်ငန်းစဉ်ဖြင့် ပြောင်းပါ။ + 4. ပြန်လည်ဖြေကြားပါ။ +3. loop ကို ပြန်လုပ်ပါ။ + +### Bot ဖန်တီးခြင်း + +Python နဲ့ bot ကို ဖန်တီးပါ။ + +1. အောက်ပါ random responses တွေကို သုံးပြီး bot ကို ဖန်တီးပါ: + + ```python + random_responses = ["That is quite interesting, please tell me more.", + "I see. Do go on.", + "Why do you say that?", + "Funny weather we've been having, isn't it?", + "Let's change the subject.", + "Did you catch the game last night?"] + ``` + + အောက်ပါ output ကို အညွှန်းအဖြစ် သုံးပါ (အသုံးပြုသူရဲ့ input ဟာ `>` နဲ့ စတင်ပါတယ်): + + ```output + Hello, I am Marvin, the simple robot. + You can end this conversation at any time by typing 'bye' + After typing each answer, press 'enter' + How are you today? + > I am good thanks + That is quite interesting, please tell me more. + > today I went for a walk + Did you catch the game last night? + > I did, but my team lost + Funny weather we've been having, isn't it? + > yes but I hope next week is better + Let's change the subject. + > ok, lets talk about music + Why do you say that? + > because I like music! + Why do you say that? + > bye + It was nice talking to you, goodbye! + ``` + + တစ်ခုဖြေရှင်းနည်းကို [ဒီမှာ](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py) ကြည့်နိုင်ပါတယ်။ + + ✅ စဉ်းစားကြည့်ပါ + + 1. Random responses တွေက bot ဟာ တကယ်နားလည်တယ်လို့ လူတွေကို လှည့်စားနိုင်မလား? + 2. Bot ကို ပိုထိရောက်အောင် ဘာတွေလိုအပ်မလဲ? + 3. Bot တစ်ခုဟာ စကားကြောင်းရဲ့ အဓိပ္ပါယ်ကို တကယ်နားလည်နိုင်ဖို့၊ ယခင်စကားကြောင်းတွေကို မှတ်မိဖို့ လိုအပ်မလား? + +--- + +## 🚀 စိန်ခေါ်မှု + +အထက်ပါ "စဉ်းစားကြည့်ပါ" အချက်တစ်ခုကို ရွေးပြီး၊ code နဲ့ စမ်းသပ်ကြည့်ပါ၊ သို့မဟုတ် pseudocode နဲ့ ဖြေရှင်းနည်းရေးပါ။ + +နောက်သင်ခန်းစာမှာ သဘာဝဘာသာစကားကို စနစ်တကျ ခွဲခြမ်းစိတ်ဖြာဖို့ နည်းလမ်းအမျိုးမျိုးကို လေ့လာသွားပါမယ်။ + +## [သင်ခန်းပြီးနောက် စမ်းမေးခွန်း](https://ff-quizzes.netlify.app/en/ml/) + +## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +အောက်ပါ ရင်းမြစ်တွေကို ဖတ်ရှုပါ: + +### ရင်းမြစ်များ + +1. Schubert, Lenhart, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = . +2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010. + +## လုပ်ငန်း + +[Bot ရှာဖွေပါ](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်ကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/1-Introduction-to-NLP/assignment.md b/translations/my/6-NLP/1-Introduction-to-NLP/assignment.md new file mode 100644 index 00000000..afb08144 --- /dev/null +++ b/translations/my/6-NLP/1-Introduction-to-NLP/assignment.md @@ -0,0 +1,25 @@ + +# ဘော့ကို ရှာဖွေပါ + +## လမ်းညွှန်ချက်များ + +ဘော့တွေဟာ နေရာတိုင်းမှာရှိပါတယ်။ သင့်တာဝန်က ဘော့တစ်ခုကို ရှာဖွေပြီး လက်ခံယူပါ! ဘော့တွေကို ဝဘ်ဆိုဒ်တွေ၊ ဘဏ်ဆိုင်ရာ အက်ပလီကေးရှင်းတွေ၊ ဖုန်းမှာ ရှာဖွေနိုင်ပါတယ်။ ဥပမာအားဖြင့် ဘဏ္ဍာရေးဝန်ဆောင်မှုကုမ္ပဏီတွေကို အကြံပေးမှု သို့မဟုတ် အကောင့်အချက်အလက်အတွက် ဖုန်းခေါ်တဲ့အခါ တွေ့နိုင်ပါတယ်။ ဘော့ကို လေ့လာပြီး သင့်အနေနဲ့ ဘော့ကို ရှုပ်ထွေးစေနိုင်မလား စမ်းကြည့်ပါ။ ဘော့ကို ရှုပ်ထွေးစေနိုင်ခဲ့ရင် ဘာကြောင့် အဲဒီအတိုင်းဖြစ်ခဲ့တယ်လို့ သင်ထင်ပါသလဲ? သင့်အတွေ့အကြုံအကြောင်းကို အကျဉ်းချုပ်စာတစ်စောင် ရေးပါ။ + +## အဆင့်သတ်မှတ်ချက် + +| အဆင့်သတ်မှတ်ချက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သည် | +| ----------------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------- | +| | စာမျက်နှာတစ်မျက်နှာလုံးကို ရေးသားပြီး ဘော့၏ အဆောက်အအုံကို ခန့်မှန်းရေးသားထားပြီး သင့်အတွေ့အကြုံကို ဖော်ပြထားသည် | စာတစ်စောင်မပြည့်စုံ သို့မဟုတ် လိုအပ်ချက်မပြည့်စုံ | စာတစ်စောင်မတင်သွင်းထား | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆောင်ရွက်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/2-Tasks/README.md b/translations/my/6-NLP/2-Tasks/README.md new file mode 100644 index 00000000..af064b98 --- /dev/null +++ b/translations/my/6-NLP/2-Tasks/README.md @@ -0,0 +1,214 @@ + +# သဘာဝဘာသာစကားကို အလုပ်လုပ်စေခြင်းဆိုင်ရာ အလုပ်များနှင့် နည်းလမ်းများ + +*သဘာဝဘာသာစကားကို အလုပ်လုပ်စေခြင်း* အလုပ်များအတွက်၊ အလုပ်လုပ်စေလိုသော စာသားကို အစိတ်အပိုင်းများ ခွဲခြားပြီး၊ စစ်ဆေးကာ၊ ရလဒ်များကို စည်းမျဉ်းများနှင့် ဒေတာအစုများနှင့် တွဲဆက်ထားရမည်။ အလုပ်များသည်၊ အရေးအသား၏ *အဓိပ္ပါယ်*၊ *ရည်ရွယ်ချက်* သို့မဟုတ် *စကားလုံးများ၏ ထပ်တလဲလဲဖြစ်မှု* ကို ရယူရန် အခွင့်အရေးပေးသည်။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +စာသားကို အလုပ်လုပ်စေရာတွင် အသုံးပြုသော နည်းလမ်းများကို ရှာဖွေကြမည်။ စက်ရုပ်သင်ယူမှုနှင့် ပေါင်းစပ်ပြီး၊ ဤနည်းလမ်းများသည် စာသားအများအပြားကို ထိရောက်စွာ ခွဲခြားစစ်ဆေးရန် ကူညီပေးသည်။ သို့သော် စက်ရုပ်သင်ယူမှုကို ဤအလုပ်များတွင် အသုံးပြုမီ၊ သဘာဝဘာသာစကားကို အလုပ်လုပ်စေသူများ ရင်ဆိုင်ရသော ပြဿနာများကို နားလည်ရမည်။ + +## သဘာဝဘာသာစကားကို အလုပ်လုပ်စေခြင်းဆိုင်ရာ အလုပ်များ + +သင်လုပ်ဆောင်လိုသော စာသားကို ခွဲခြားစစ်ဆေးရန် နည်းလမ်းများ မျိုးစုံရှိသည်။ သင်လုပ်ဆောင်နိုင်သော အလုပ်များရှိပြီး၊ ဤအလုပ်များမှတစ်ဆင့် စာသားကို နားလည်နိုင်ပြီး သုံးသပ်ချက်များ ဆွဲယူနိုင်သည်။ အလုပ်များကို အဆင့်ဆင့် လုပ်ဆောင်လေ့ရှိသည်။ + +### Tokenization + +NLP အယ်လဂိုရစ်သမားများအတွက် ပထမဆုံးလုပ်ဆောင်ရမည့်အရာမှာ စာသားကို token သို့မဟုတ် စကားလုံးများအဖြစ် ခွဲခြားခြင်းဖြစ်သည်။ ဤအရာသည် ရိုးရှင်းသလို ထင်ရပေမယ့်၊ စာကြောင်းအတွင်းရှိ သတ်မှတ်ချက်များနှင့် ဘာသာစကားအမျိုးမျိုး၏ စကားလုံးနှင့် စာကြောင်းအဆုံးသတ်ချက်များကို ထည့်သွင်းစဉ်းစားရခြင်းကြောင့် ခက်ခဲနိုင်သည်။ သတ်မှတ်ချက်များကို ဆုံးဖြတ်ရန် နည်းလမ်းများ မျိုးစုံကို အသုံးပြုရနိုင်သည်။ + +![tokenization](../../../../6-NLP/2-Tasks/images/tokenization.png) +> **Pride and Prejudice** စာအုပ်မှ စာကြောင်းတစ်ကြောင်းကို token ခွဲခြင်း။ [Jen Looper](https://twitter.com/jenlooper) မှ Infographic + +### Embeddings + +[Word embeddings](https://wikipedia.org/wiki/Word_embedding) သည် စာသားဒေတာကို ကိန်းဂဏန်းအဖြစ် ပြောင်းလဲရန် နည်းလမ်းတစ်ခုဖြစ်သည်။ Embeddings ကို အဓိပ္ပါယ်တူသော စကားလုံးများ သို့မဟုတ် အတူတူအသုံးပြုသော စကားလုံးများကို အစုအဖွဲ့တစ်ခုအဖြစ် စုပုံစေသော နည်းလမ်းဖြင့် ပြုလုပ်သည်။ + +![word embeddings](../../../../6-NLP/2-Tasks/images/embedding.png) +> "I have the highest respect for your nerves, they are my old friends." - **Pride and Prejudice** စာအုပ်မှ စာကြောင်းတစ်ကြောင်းအတွက် Word embeddings။ [Jen Looper](https://twitter.com/jenlooper) မှ Infographic + +✅ [ဤစိတ်ဝင်စားဖွယ် tool](https://projector.tensorflow.org/) ကို အသုံးပြု၍ word embeddings ကို စမ်းသပ်ပါ။ စကားလုံးတစ်လုံးကို နှိပ်ပါက အဓိပ္ပါယ်တူသော စကားလုံးများ၏ အစုအဖွဲ့ကို ပြသသည်။ ဥပမာ - 'toy' သည် 'disney', 'lego', 'playstation', နှင့် 'console' တို့နှင့် အစုအဖွဲ့တူသည်။ + +### Parsing & Part-of-speech Tagging + +Tokenized ဖြစ်ထားသော စကားလုံးတစ်ခုစီကို noun, verb, adjective စသည့် part of speech အဖြစ် tag လုပ်နိုင်သည်။ ဥပမာ - `the quick red fox jumped over the lazy brown dog` စာကြောင်းကို POS tagging လုပ်ပါက fox = noun, jumped = verb ဖြစ်နိုင်သည်။ + +![parsing](../../../../6-NLP/2-Tasks/images/parse.png) + +> **Pride and Prejudice** စာအုပ်မှ စာကြောင်းတစ်ကြောင်းကို Parsing လုပ်ခြင်း။ [Jen Looper](https://twitter.com/jenlooper) မှ Infographic + +Parsing သည် စာကြောင်းအတွင်း စကားလုံးများသည် အချင်းချင်း ဆက်စပ်နေမှုကို သိရှိခြင်းဖြစ်သည်။ ဥပမာ - `the quick red fox jumped` သည် adjective-noun-verb အစဉ်ဖြစ်ပြီး၊ `lazy brown dog` အစဉ်နှင့် သီးသန့်ဖြစ်သည်။ + +### Word and Phrase Frequencies + +စာသားအများအပြားကို ခွဲခြားစစ်ဆေးရာတွင် အသုံးဝင်သော နည်းလမ်းတစ်ခုမှာ စိတ်ဝင်စားဖွယ် စကားလုံး သို့မဟုတ် စကားစုများ၏ အကြိမ်ရေကို စာရင်းပြုစုခြင်းဖြစ်သည်။ `the quick red fox jumped over the lazy brown dog` စာကြောင်းတွင် `the` စကားလုံး၏ frequency သည် 2 ဖြစ်သည်။ + +ဥပမာစာသားတစ်ခုကို ကြည့်ပြီး စကားလုံးများ၏ frequency ကို ရေတွက်ကြည့်ပါ။ Rudyard Kipling ရေးသားသော The Winners ကဗျာတွင် အောက်ပါ စာပိုဒ်ပါဝင်သည် - + +```output +What the moral? Who rides may read. +When the night is thick and the tracks are blind +A friend at a pinch is a friend, indeed, +But a fool to wait for the laggard behind. +Down to Gehenna or up to the Throne, +He travels the fastest who travels alone. +``` + +Phrase frequencies သည် case sensitive သို့မဟုတ် case insensitive ဖြစ်နိုင်သည်။ ဥပမာ - `a friend` phrase ၏ frequency သည် 2 ဖြစ်ပြီး၊ `the` phrase ၏ frequency သည် 6 ဖြစ်သည်။ `travels` phrase ၏ frequency သည် 2 ဖြစ်သည်။ + +### N-grams + +စာသားကို စကားလုံးအရေအတွက် သတ်မှတ်ထားသော အစဉ်အတိုင်း ခွဲခြားနိုင်သည်။ တစ်လုံး (unigram), နှစ်လုံး (bigram), သုံးလုံး (trigram) သို့မဟုတ် စကားလုံးအရေအတွက် မည်သည့်အတိုင်း (n-grams) ဖြစ်နိုင်သည်။ + +ဥပမာ - `the quick red fox jumped over the lazy brown dog` ကို n-gram score 2 ဖြင့် ခွဲခြားပါက အောက်ပါ n-grams များရရှိသည် - + +1. the quick +2. quick red +3. red fox +4. fox jumped +5. jumped over +6. over the +7. the lazy +8. lazy brown +9. brown dog + +ဤအရာကို sliding box အဖြစ် စဉ်းစားပါက ပိုမိုလွယ်ကူနိုင်သည်။ ဤသည်မှာ 3 စကားလုံး n-grams အတွက် sliding box ဖြစ်သည် - + +1. **the quick red** fox jumped over the lazy brown dog +2. the **quick red fox** jumped over the lazy brown dog +3. the quick **red fox jumped** over the lazy brown dog +4. the quick red **fox jumped over** the lazy brown dog +5. the quick red fox **jumped over the** lazy brown dog +6. the quick red fox jumped **over the lazy** brown dog +7. the quick red fox jumped over **the lazy brown** dog +8. the quick red fox jumped over the **lazy brown dog** + +![n-grams sliding window](../../../../6-NLP/2-Tasks/images/n-grams.gif) + +> N-gram value of 3: [Jen Looper](https://twitter.com/jenlooper) မှ Infographic + +### Noun phrase Extraction + +စာကြောင်းအများစုတွင် subject သို့မဟုတ် object ဖြစ်သော noun phrase တစ်ခုရှိသည်။ အင်္ဂလိပ်ဘာသာစကားတွင် `a`, `an`, `the` စသည်ဖြင့် စတင်သော noun phrase ကို ရှာဖွေခြင်းသည် စာကြောင်း၏ အဓိပ္ပါယ်ကို နားလည်ရန် အသုံးဝင်သော NLP အလုပ်တစ်ခုဖြစ်သည်။ + +✅ "I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun." စာကြောင်းတွင် noun phrases ကို ရှာဖွေပါ။ + +`the quick red fox jumped over the lazy brown dog` စာကြောင်းတွင် noun phrases 2 ခုရှိသည် - **quick red fox** နှင့် **lazy brown dog**။ + +### Sentiment analysis + +စာကြောင်း သို့မဟုတ် စာသားကို *အပျော်* သို့မဟုတ် *အနည်းငယ်စိတ်ဆိုး* ဖြစ်မှုအပေါ် အခြေခံ၍ sentiment ကို ခွဲခြားနိုင်သည်။ Sentiment ကို *polarity* နှင့် *objectivity/subjectivity* ဖြင့် တိုင်းတာသည်။ Polarity သည် -1.0 မှ 1.0 (negative to positive) ဖြစ်ပြီး၊ 0.0 မှ 1.0 (most objective to most subjective) ဖြစ်သည်။ + +✅ နောက်ပိုင်းတွင် sentiment ကို စက်ရုပ်သင်ယူမှုဖြင့် ဆုံးဖြတ်နိုင်သော နည်းလမ်းများကို သင်လေ့လာမည်။ သို့သော် လူ့အတတ်ပညာရှင်က စိတ်ဝင်စားဖွယ် positive သို့မဟုတ် negative စကားလုံးများနှင့် phrase များကို စာရင်းပြုစုထားသော နည်းလမ်းတစ်ခုကို စဉ်းစားပါ။ ဤနည်းလမ်းသည် အချို့သောအခြေအနေများတွင် အလုပ်လုပ်နိုင်ပြီး အခြားအခြေအနေများတွင် မလုပ်နိုင်ခြင်းကို သင်မြင်နိုင်ပါသလား။ + +### Inflection + +Inflection သည် စကားလုံးတစ်လုံးကို singular သို့မဟုတ် plural အဖြစ် ပြောင်းလဲရန် ခွင့်ပြုသည်။ + +### Lemmatization + +*Lemma* သည် စကားလုံးများအစုအဖွဲ့၏ root သို့မဟုတ် headword ဖြစ်သည်။ ဥပမာ - *flew*, *flies*, *flying* ၏ lemma သည် *fly* ဖြစ်သည်။ + +NLP သုတေသနသူများအတွက် အသုံးဝင်သော ဒေတာဘေ့စ်များလည်း ရရှိနိုင်သည်၊ အထူးသဖြင့် - + +### WordNet + +[WordNet](https://wordnet.princeton.edu/) သည် စကားလုံးများ၊ အဓိပ္ပါယ်တူစကားလုံးများ၊ အဓိပ္ပါယ်ဆန်စကားလုံးများနှင့် အခြားသော အသေးစိတ်များကို ဘာသာစကားအမျိုးမျိုးအတွက် စုစည်းထားသော ဒေတာဘေ့စ်ဖြစ်သည်။ ဘာသာပြန်များ၊ စာလုံးပေါင်းစစ်ဆေးသူများ သို့မဟုတ် ဘာသာစကား tools များကို တည်ဆောက်ရာတွင် အလွန်အသုံးဝင်သည်။ + +## NLP Libraries + +ကံကောင်းစွာ၊ ဤနည်းလမ်းများအားလုံးကို ကိုယ်တိုင် တည်ဆောက်ရန် မလိုအပ်ပါ၊ အလွန်ထိရောက်သော Python libraries များ ရရှိနိုင်ပြီး၊ သဘာဝဘာသာစကားကို အလုပ်လုပ်စေခြင်း သို့မဟုတ် စက်ရုပ်သင်ယူမှုတွင် အထူးကျွမ်းကျင်မဟုတ်သော developer များအတွက် ပိုမိုလွယ်ကူစေသည်။ နောက်ပိုင်းသင်ခန်းစာများတွင် ဤ libraries များ၏ နမူနာများကို ပိုမိုလေ့လာမည်၊ သို့သော် အခုမှာ သင်၏ အလုပ်ကို ကူညီနိုင်သော အသုံးဝင်သော နမူနာများကို လေ့လာပါ။ + +### Exercise - `TextBlob` library ကို အသုံးပြုခြင်း + +TextBlob ဟုခေါ်သော library ကို အသုံးပြုကြည့်ပါ၊ ဤ library တွင် ဤအမျိုးအစားအလုပ်များကို လုပ်ဆောင်ရန် API များပါဝင်သည်။ TextBlob သည် "[NLTK](https://nltk.org) နှင့် [pattern](https://github.com/clips/pattern) ၏ အကြီးမားသော အခြေခံအရပ်များပေါ်တွင် ရပ်တည်ပြီး၊ နှစ်ခုစလုံးနှင့် သင့်တော်စွာ အလုပ်လုပ်သည်။" ၎င်း၏ API တွင် ML အများအပြား ပါဝင်သည်။ + +> Note: [Quick Start](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) လမ်းညွှန်သည် အတွေ့အကြုံရှိ Python developer များအတွက် အကြံပြုထားသည်။ + +*Noun phrases* ကို ရှာဖွေရာတွင် TextBlob သည် extractors များစွာကို ပေးထားသည်။ + +1. `ConllExtractor` ကို ကြည့်ပါ။ + + ```python + from textblob import TextBlob + from textblob.np_extractors import ConllExtractor + # import and create a Conll extractor to use later + extractor = ConllExtractor() + + # later when you need a noun phrase extractor: + user_input = input("> ") + user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified + np = user_input_blob.noun_phrases + ``` + + > ဤနေရာတွင် ဘာဖြစ်နေသနည်း? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) သည် "ConLL-2000 training corpus ဖြင့် လေ့ကျင့်ထားသော chunk parsing ကို အသုံးပြုသော noun phrase extractor" ဖြစ်သည်။ ConLL-2000 သည် 2000 ခုနှစ် Computational Natural Language Learning Conference ကို ရည်ညွှန်းသည်။ 2000 ခုနှစ်တွင် noun chunking ကို လေ့လာရန် model တစ်ခုကို Wall Street Journal မှ training data (211727 tokens) နှင့် test data (47377 tokens) ဖြင့် လေ့ကျင့်ခဲ့သည်။ [Procedures](https://www.clips.uantwerpen.be/conll2000/chunking/) နှင့် [results](https://ifarm.nl/erikt/research/np-chunking.html) ကို ကြည့်နိုင်သည်။ + +### Challenge - သင့် bot ကို NLP ဖြင့် တိုးတက်စေခြင်း + +ယခင်သင်ခန်းစာတွင် သင်အလွန်ရိုးရှင်းသော Q&A bot တစ်ခုကို တည်ဆောက်ခဲ့သည်။ အခုမှာ Marvin ကို သင့် input ကို sentiment အပေါ်အခြေခံ၍ သုံးသပ်ပြီး၊ sentiment နှင့် ကိုက်ညီသော အဖြေကို ပေးနိုင်စေရန် တိုးတက်စေပါမည်။ သင် noun phrase ကို ရှာဖွေပြီး၊ pluralize လုပ်ကာ အဲဒီအကြောင်းအရာအပေါ် input ပေးရန် မေးမြန်းရပါမည်။ + +သင့် bot ကို ပိုမိုကောင်းမွန်စေရန် လုပ်ဆောင်ရမည့် အဆင့်များ - + +1. အသုံးပြုသူကို bot နှင့် အပြန်အလှန် ဆက်သွယ်ရန် လမ်းညွှန်ချက်များကို print လုပ်ပါ +2. loop ကို စတင်ပါ + 1. အသုံးပြုသူ input ကို လက်ခံပါ + 2. အသုံးပြုသူသည် exit မေးမြန်းပါက ထွက်ပါ + 3. အသုံးပြုသူ input ကို စစ်ဆေးပြီး sentiment response ကို ဆုံးဖြတ်ပါ + 4. sentiment တွင် noun phrase ရှိပါက pluralize လုပ်ပြီး အဲဒီအကြောင်းအရာအပေါ် input ပေးရန် မေးမြန်းပါ + 5. အဖြေကို print လုပ်ပါ +3. အဆင့် 2 သို့ ပြန်သွားပါ + +TextBlob ကို အသုံးပြု၍ sentiment ကို ဆုံးဖြတ်ရန် code snippet ကို ကြည့်ပါ။ Sentiment response ၏ *gradients* သာ 4 ခုရှိသည် (သင်လိုချင်ပါက ပိုမိုများစွာ ထည့်နိုင်သည်) - + +```python +if user_input_blob.polarity <= -0.5: + response = "Oh dear, that sounds bad. " +elif user_input_blob.polarity <= 0: + response = "Hmm, that's not great. " +elif user_input_blob.polarity <= 0.5: + response = "Well, that sounds positive. " +elif user_input_blob.polarity <= 1: + response = "Wow, that sounds great. " +``` + +ဤနမူနာ output ကို လမ်းညွှန်အဖြစ် အသုံးပြုပါ (အသုံးပြုသူ input သည် > ဖြင့် စတင်သော အကြောင်းအရာများတွင် ရှိသည်) - + +```output +Hello, I am Marvin, the friendly robot. +You can end this conversation at any time by typing 'bye' +After typing each answer, press 'enter' +How are you today? +> I am ok +Well, that sounds positive. Can you tell me more? +> I went for a walk and saw a lovely cat +Well, that sounds positive. Can you tell me more about lovely cats? +> cats are the best. But I also have a cool dog +Wow, that sounds great. Can you tell me more about cool dogs? +> I have an old hounddog but he is sick +Hmm, that's not great. Can you tell me more about old hounddogs? +> bye +It was nice talking to you, goodbye! +``` + +ဤအလုပ်ကို ပြုလုပ်ရန် အဖြေတစ်ခုကို [ဒီမှာ](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py) ကြည့်နိုင်သည်။ + +✅ Knowledge Check + +1. Sympathetic responses သည် bot ကို အသုံးပြုသူက အမှန်တကယ် နားလည်နေသည်ဟု ထင်ရစေမည်လား? +2. Noun phrase ကို ရှာဖွေခြင်းသည် bot ကို ပိုမို 'ယုံကြည်စရာကောင်း' စေမည်လား? +3. စာကြောင်းမှ 'noun phrase' ကို ရှာဖွေခြင်းသည် ဘာကြောင့် အသုံးဝင်သနည်း? + +--- + +ယခင် knowledge check တွင် bot ကို တည်ဆောက်ပြီး၊ သူငယ်ချင်းတစ်ဦးကို စမ်းသပ်ပါ။ Bot သည် သူတို့ကို လှည့်စားနိုင်ပါသလား? Bot ကို ပိုမို 'ယုံကြည်စရာကောင်း' + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဒီစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အကြံပြုပါသည်။ ဒီဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/2-Tasks/assignment.md b/translations/my/6-NLP/2-Tasks/assignment.md new file mode 100644 index 00000000..e960eda3 --- /dev/null +++ b/translations/my/6-NLP/2-Tasks/assignment.md @@ -0,0 +1,25 @@ + +# ဘော့ကို ပြန်ပြောစေမယ် + +## လုပ်ဆောင်ရန်ညွှန်ကြားချက်များ + +လွန်ခဲ့သော သင်ခန်းစာများတွင် သင်သည် စကားပြောနိုင်သော အခြေခံဘော့တစ်ခုကို အစီအစဉ်ရေးသားခဲ့ပါသည်။ ဒီဘော့က သင် "bye" မပြောမချင်း အလွတ်တန်းအဖြေများပေးပါသည်။ အခုတော့ အဖြေများကို အလွတ်တန်းမဟုတ်အောင် ပြောင်းလဲပြီး သင် "why" သို့မဟုတ် "how" စသည်တို့ကို ပြောသောအခါ အထူးအဖြေများပေးစေမည်လား။ သင့်ဘော့ကို တိုးချဲ့ရာတွင် ဒီလိုအလုပ်များကို လက်တွေ့လုပ်ရခြင်းကို ဘယ်လိုစက်လေ့လာမှုနည်းပညာများက ပိုမိုလွယ်ကူစေမလဲဆိုတာကို တွေးကြည့်ပါ။ သင့်အလုပ်များကို ပိုမိုလွယ်ကူစေရန် NLTK သို့မဟုတ် TextBlob စာကြည့်တိုက်များကို အသုံးပြုနိုင်ပါသည်။ + +## အကဲဖြတ်စံနှုန်း + +| စံနှုန်း | ထူးချွန်သောအခြေအနေ | လုံလောက်သောအခြေအနေ | တိုးတက်မှုလိုအပ်သောအခြေအနေ | +| -------- | --------------------------------------------- | ------------------------------------------------ | ----------------------- | +| | bot.py ဖိုင်အသစ်တစ်ခုကို တင်ပြပြီး မှတ်ချက်ထည့်ထားသည် | bot ဖိုင်အသစ်တစ်ခုကို တင်ပြထားသော်လည်း အမှားများပါဝင်သည် | ဖိုင်တစ်ခုမှ မတင်ပြထားပါ | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/3-Translation-Sentiment/README.md b/translations/my/6-NLP/3-Translation-Sentiment/README.md new file mode 100644 index 00000000..949c8709 --- /dev/null +++ b/translations/my/6-NLP/3-Translation-Sentiment/README.md @@ -0,0 +1,198 @@ + +# Machine Learning ဖြင့် ဘာသာပြန်ခြင်းနှင့်ခံစားချက်ခွဲခြားခြင်း + +ယခင်သင်ခန်းစာများတွင် `TextBlob` ကို အသုံးပြု၍ အခြေခံ bot တစ်ခုကို တည်ဆောက်နည်းကို သင်လေ့လာခဲ့ပါသည်။ `TextBlob` သည် noun phrase extraction ကဲ့သို့သော အခြေခံ NLP လုပ်ငန်းများကို လုပ်ဆောင်ရန် ML ကို နောက်ကွယ်တွင် ပေါင်းစပ်ထားသော library တစ်ခုဖြစ်သည်။ Computational linguistics တွင် အရေးကြီးသော စိန်ခေါ်မှုတစ်ခုမှာ စကားလုံးများကို တစ်ဘာသာမှ တစ်ဘာသာသို့ တိကျစွာ _ဘာသာပြန်ခြင်း_ ဖြစ်သည်။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +ဘာသာပြန်ခြင်းသည် အလွန်ခက်ခဲသော ပြဿနာတစ်ခုဖြစ်ပြီး ဘာသာစကားများ အထောင်ပေါင်းများစွာရှိပြီး တစ်ခုနှင့်တစ်ခု၏ သဒ္ဒါစည်းမျဉ်းများက အလွန်ကွဲပြားနိုင်သည်။ တစ်ခုသော နည်းလမ်းမှာ ဘာသာစကားတစ်ခု၏ သဒ္ဒါစည်းမျဉ်းများကို non-language dependent structure သို့ ပြောင်းလဲပြီး ထို structure ကို အခြားဘာသာစကားသို့ ပြန်လည်ပြောင်းလဲခြင်းဖြစ်သည်။ ဤနည်းလမ်းသည် အောက်ပါအဆင့်များကို လိုက်နာရမည်ဖြစ်သည်- + +1. **Identification** - input ဘာသာစကားရှိ စကားလုံးများကို noun, verb စသည်ဖြင့် သတ်မှတ်ခြင်း။ +2. **Create translation** - target ဘာသာစကား format အတိုင်း တိုက်ရိုက်ဘာသာပြန်ခြင်း။ + +### ဥပမာ စာကြောင်း - အင်္ဂလိပ်မှ အိုင်းရစ် + +အင်္ဂလိပ်ဘာသာစကားတွင် _I feel happy_ ဆိုသော စာကြောင်းသည် စကားလုံးသုံးခုပါရှိပြီး အစီအစဉ်မှာ- + +- **subject** (I) +- **verb** (feel) +- **adjective** (happy) + +သို့သော် အိုင်းရစ်ဘာသာစကားတွင် ထိုစာကြောင်း၏ သဒ္ဒါစည်းမျဉ်းများက အလွန်ကွဲပြားသည်။ "*happy*" သို့ "*sad*" ကဲ့သို့သော ခံစားချက်များကို *upon* you အဖြစ်ဖော်ပြသည်။ + +အင်္ဂလိပ်စာကြောင်း `I feel happy` ကို အိုင်းရစ်ဘာသာစကားတွင် `Tá athas orm` ဟု ပြောဆိုသည်။ *literal* translation သည် `Happy is upon me` ဖြစ်သည်။ + +အိုင်းရစ် speaker တစ်ဦးသည် အင်္ဂလိပ်ဘာသာစကားသို့ ဘာသာပြန်သောအခါ `Happy is upon me` ဟု မပြောပါ၊ `I feel happy` ဟု ပြောပါသည်။ အကြောင်းမှာ စာကြောင်း၏ အဓိပ္ပါယ်ကို နားလည်သောကြောင့်ဖြစ်သည်။ စကားလုံးများနှင့် စာကြောင်းဖွဲ့စည်းမှုက ကွဲပြားနေသော်လည်း အဓိပ္ပါယ်ကို နားလည်နိုင်သည်။ + +အိုင်းရစ်ဘာသာစကားတွင် စာကြောင်း၏ formal order သည်- + +- **verb** (Tá or is) +- **adjective** (athas, or happy) +- **subject** (orm, or upon me) + +## ဘာသာပြန်ခြင်း + +naive translation program တစ်ခုသည် စာကြောင်းဖွဲ့စည်းမှုကို မထည့်သွင်းဘဲ စကားလုံးများကိုသာ ဘာသာပြန်နိုင်သည်။ + +✅ သင်အရွယ်ရောက်ပြီးနောက် ဘာသာစကားတစ်ခု (သို့မဟုတ် နှစ်ခု၊ သုံးခု) ကို သင်ယူခဲ့ပါက သင်၏ native ဘာသာစကားတွင် စဉ်းစားပြီး concept ကို စကားလုံးတစ်လုံးချင်းစီ translation ပြုလုပ်ကာ ဒုတိယဘာသာစကားသို့ ပြောဆိုခဲ့ဖူးနိုင်သည်။ ဤနည်းလမ်းသည် naive translation computer programs လုပ်ဆောင်နည်းနှင့် ဆင်တူသည်။ fluency ရရှိရန် ဤအဆင့်ကို ကျော်လွှားရန် အရေးကြီးသည်။ + +naive translation သည် မကောင်းသော (တစ်ခါတစ်ရံ အလွဲလွဲအချော်ချော်) ဘာသာပြန်မှုများကို ဖြစ်စေသည်- `I feel happy` ကို literal translation ပြုလုပ်ပါက `Mise bhraitheann athas` ဟု အိုင်းရစ်ဘာသာစကားသို့ ပြောင်းလဲသည်။ ၎င်းသည် (literal) `me feel happy` ဟု အဓိပ္ပါယ်ရပြီး အိုင်းရစ်စာကြောင်းတစ်ခုအဖြစ် မမှန်ကန်ပါ။ + +> [ဤဗီဒီယို](https://www.youtube.com/watch?v=mRIaLSdRMMs) ကဲ့သို့သော အိုင်းရစ်ဘာသာစကား၏ သမိုင်းနှင့်ယဉ်ကျေးမှုအကြောင်းကို ကြည့်ရှုနိုင်ပါသည်။ + +### Machine learning နည်းလမ်းများ + +ယခုအထိ သင်သည် natural language processing အတွက် formal rules နည်းလမ်းကို လေ့လာခဲ့ပါသည်။ အခြားနည်းလမ်းတစ်ခုမှာ စကားလုံးများ၏ အဓိပ္ပါယ်ကို မထည့်သွင်းဘဲ _machine learning ကို အသုံးပြု၍ pattern များကို ရှာဖွေခြင်း_ ဖြစ်သည်။ origin နှင့် target ဘာသာစကားများတွင် text များ (*corpus*) သို့မဟုတ် texts (*corpora*) အများအပြားရှိပါက translation အတွက် ဤနည်းလမ်းကို အသုံးပြုနိုင်သည်။ + +ဥပမာအားဖြင့် Jane Austen ရေးသားသော 1813 ခုနှစ်ထုတ် *Pride and Prejudice* အင်္ဂလိပ်ဝတ္ထုကို ရှုပါ။ အင်္ဂလိပ်စာအုပ်နှင့် *French* ဘာသာစကားသို့ လူသားဘာသာပြန်မှုကို ကြည့်ရှုပါက phrase များကို _idiomatically_ translation ပြုလုပ်ထားသည်ကို တွေ့နိုင်သည်။ သင်မကြာမီ ဤလုပ်ငန်းကို လုပ်ဆောင်မည်။ + +ဥပမာအားဖြင့် `I have no money` ဆိုသော အင်္ဂလိပ် phrase ကို literal translation ပြုလုပ်ပါက `Je n'ai pas de monnaie` ဟု French ဘာသာစကားသို့ ပြောင်းလဲနိုင်သည်။ "Monnaie" သည် tricky French 'false cognate' တစ်ခုဖြစ်ပြီး 'money' နှင့် 'monnaie' သည် အဓိပ္ပါယ်တူမဟုတ်ပါ။ လူသားဘာသာပြန်သူတစ်ဦးက `Je n'ai pas d'argent` ဟု ပြောင်းလဲနိုင်သည်။ ၎င်းသည် 'loose change' (monnaie) မဟုတ်ဘဲ 'money' (argent) ကို ပိုမိုတိကျစွာဖော်ပြသည်။ + +![monnaie](../../../../6-NLP/3-Translation-Sentiment/images/monnaie.png) + +> [Jen Looper](https://twitter.com/jenlooper) မှ ရေးသားထားသော ပုံ + +ML model တွင် လူသားဘာသာပြန်မှုများလုံလောက်စွာရှိပါက expert human speakers နှစ်ဦး၏ translation pattern များကို ရှာဖွေကာ translation တိကျမှုကို တိုးတက်စေနိုင်သည်။ + +### လေ့ကျင့်ခန်း - ဘာသာပြန်ခြင်း + +`TextBlob` ကို အသုံးပြု၍ စာကြောင်းများကို ဘာသာပြန်နိုင်သည်။ **Pride and Prejudice** ၏ ပထမဆုံးစာကြောင်းကို စမ်းကြည့်ပါ- + +```python +from textblob import TextBlob + +blob = TextBlob( + "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!" +) +print(blob.translate(to="fr")) + +``` + +`TextBlob` သည် translation ကို အလွန်ကောင်းစွာ ပြုလုပ်နိုင်သည်- "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!". + +1932 ခုနှစ် V. Leconte နှင့် Ch. Pressoir မှ French translation နှင့် နှိုင်းယှဉ်ပါက TextBlob ၏ translation သည် original author ၏ စကားလုံးများကို ပိုမိုတိကျစွာ ဖော်ပြထားသည်- + +"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles." + +ဤကိစ္စတွင် ML ဖြင့် translation ပြုလုပ်ခြင်းသည် လူသားဘာသာပြန်သူ၏ translation ထက် ပိုမိုကောင်းမွန်သည်။ + +> TextBlob သည် translation ကို အလွန်ကောင်းစွာ ပြုလုပ်နိုင်ခြင်း၏ အကြောင်းရင်းမှာ ML သုံး Google Translate ကို နောက်ကွယ်တွင် အသုံးပြုထားခြင်းဖြစ်သည်။ ၎င်းသည် AI တစ်ခုဖြစ်ပြီး phrase များကို မီလီယံချီ parse ပြုလုပ်ကာ အကောင်းဆုံး string များကို ခန့်မှန်းနိုင်သည်။ manual လုပ်ငန်းစဉ်မရှိဘဲ internet connection လိုအပ်သည်။ + +✅ စာကြောင်းများကို ထပ်မံစမ်းကြည့်ပါ။ ML translation နှင့် လူသားဘာသာပြန်မှုတို့တွင် ဘယ်ဟာက ပိုကောင်းသနည်း။ ဘယ်အခြေအနေတွင်ကောင်းသနည်း။ + +## ခံစားချက်ခွဲခြားခြင်း + +Machine learning သည် sentiment analysis တွင်လည်း အလွန်ကောင်းစွာ လုပ်ဆောင်နိုင်သည်။ non-ML နည်းလမ်းမှာ 'positive' နှင့် 'negative' စကားလုံးများကို သတ်မှတ်ကာ sentiment ကိုတွက်ချက်ခြင်းဖြစ်သည်။ + +ဤနည်းလမ်းသည် `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` ကဲ့သို့သော sarcastic sentence များကို trick ပြုနိုင်သည်။ simple algorithm သည် 'great', 'wonderful', 'glad' ကို positive ဟု သတ်မှတ်ပြီး 'waste', 'lost', 'dark' ကို negative ဟု သတ်မှတ်သည်။ conflicting words များကြောင့် overall sentiment ကို မမှန်ကန်စေသည်။ + +✅ လူသား speaker အနေဖြင့် sarcasm ကို ဘယ်လိုဖော်ပြသနည်း စဉ်းစားကြည့်ပါ။ tone inflection သည် အဓိကအခန်းကဏ္ဍ ပါဝင်သည်။ "Well, that film was awesome" ဟု အမျိုးမျိုးသောနည်းလမ်းဖြင့် ပြောကြည့်ပါ။ + +### ML နည်းလမ်းများ + +ML နည်းလမ်းမှာ negative နှင့် positive text များကို manually စုဆောင်းခြင်းဖြစ်သည်- tweets, movie reviews, သို့မဟုတ် opinion နှင့် score ပါဝင်သော text များ။ opinion နှင့် score များကို NLP techniques ဖြင့် ခွဲခြားကာ pattern များကို ရှာဖွေသည်။ + +> ⚖️ **ဥပမာ**: နိုင်ငံရေးသမား၏ရုံးတွင် ဥပဒေသစ်တစ်ခုကို ဆွေးနွေးနေသည်။ constituents များသည် email များကို support သို့မဟုတ် against အဖြစ် ရေးသားနိုင်သည်။ email များအများကြီးရှိပါက bot တစ်ခုကို အသုံးပြု၍ email များကို ဖတ်စစ်နိုင်မည်။ + +✅ ယခင်သင်ခန်းစာများတွင် သင်အသုံးပြုခဲ့သော လုပ်ငန်းစဉ်များနှင့် ဆင်တူပါသလား။ + +## လေ့ကျင့်ခန်း - sentimental စာကြောင်းများ + +sentiment ကို -1 မှ 1 အထိ *polarity* ဖြင့် တိုင်းတာသည်။ -1 သည် အဆိုးဆုံး negative sentiment ဖြစ်ပြီး 1 သည် အကောင်းဆုံး positive sentiment ဖြစ်သည်။ sentiment ကို 0 မှ 1 အထိ objectivity (0) နှင့် subjectivity (1) ဖြင့်လည်း တိုင်းတာသည်။ + +Jane Austen ရေးသားသော *Pride and Prejudice* ကို ထပ်မံကြည့်ရှုပါ။ [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) တွင် text ရရှိနိုင်သည်။ အောက်ပါ program သည် စာအုပ်၏ ပထမဆုံးနှင့် နောက်ဆုံးစာကြောင်းများ၏ sentiment polarity နှင့် subjectivity/objectivity score ကို ခွဲခြားပြသည်။ + +`TextBlob` library ကို sentiment ကို သတ်မှတ်ရန် အသုံးပြုပါ (သင်၏ sentiment calculator ကို ရေးရန် မလိုအပ်ပါ)။ + +```python +from textblob import TextBlob + +quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.""" + +quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them.""" + +sentiment1 = TextBlob(quote1).sentiment +sentiment2 = TextBlob(quote2).sentiment + +print(quote1 + " has a sentiment of " + str(sentiment1)) +print(quote2 + " has a sentiment of " + str(sentiment2)) +``` + +output အဖြစ်- + +```output +It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146) + +Darcy, as well as Elizabeth, really loved them; and they were + both ever sensible of the warmest gratitude towards the persons + who, by bringing her into Derbyshire, had been the means of + uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8) +``` + +## စိန်ခေါ်မှု - sentiment polarity ကို စစ်ဆေးပါ + +သင်၏ task သည် *Pride and Prejudice* တွင် absolutely positive sentences များသည် absolutely negative sentences များထက် ပိုများသလားဆိုသည်ကို sentiment polarity ဖြင့် သတ်မှတ်ခြင်းဖြစ်သည်။ polarity score 1 သို့မဟုတ် -1 ကို absolutely positive သို့မဟုတ် negative ဟု သတ်မှတ်နိုင်သည်။ + +**အဆင့်များ**: + +1. [Pride and Prejudice](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) ကို .txt file အဖြစ် download ပြုလုပ်ပါ။ metadata များကို ဖယ်ရှားပြီး original text ကိုသာထားပါ။ +2. Python တွင် file ကို ဖွင့်ကာ string အဖြစ် extract ပြုလုပ်ပါ။ +3. book string ကို TextBlob ဖြင့် ဖန်တီးပါ။ +4. စာအုပ်ရှိ စာကြောင်းတစ်ခုချင်းစီကို loop ဖြင့် ခွဲခြားပါ။ + 1. polarity သည် 1 သို့မဟုတ် -1 ဖြစ်ပါက positive သို့မဟုတ် negative messages များကို array သို့မဟုတ် list တွင် သိမ်းဆည်းပါ။ +5. နောက်ဆုံးတွင် positive sentences နှင့် negative sentences (သီးသန့်) နှင့် ၎င်းတို့၏ အရေအတွက်ကို print ပြပါ။ + +[solution](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb) ကို ကြည့်ရှုနိုင်သည်။ + +✅ Knowledge Check + +1. sentiment သည် စာကြောင်းတွင် အသုံးပြုထားသော စကားလုံးများအပေါ် အခြေခံသည်။ code သည် စကားလုံးများကို *နားလည်* သလား။ +2. sentiment polarity သည် တိကျသလား၊ သို့မဟုတ် score များနှင့် သင် *သဘောတူ* သလား။ + 1. အထူးသဖြင့် အောက်ပါ absolute **positive** polarity စာကြောင်းများနှင့် သဘောတူသလား- + * “What an excellent father you have, girls!” said she, when the door was shut. + * “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect. + * How wonderfully these sort of things occur! + * I have the greatest dislike in the world to that sort of thing. + * Charlotte is an excellent manager, I dare say. + * “This is delightful indeed! + * I am so happy! + * Your idea of the ponies is delightful. + 2. အောက်ပါ absolute positive sentiment စာကြောင်းများသည် positive မဟုတ်သော်လည်း sentiment analysis သည် positive ဟု သတ်မှတ်ခဲ့သည်။ အဘယ်ကြောင့် positive ဟု သတ်မှတ်ခဲ့သနည်း- + * Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power. + * If I could but see you as happy! + * Our distress, my dear Lizzy, is very great. + 3. အောက်ပါ absolute **negative** polarity စာကြောင်းများနှင့် သဘောတူသလား- + - Everybody is disgusted with his pride. + - “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful. + - The pause was to Elizabeth’s feelings dreadful. + - It would be dreadful! + +✅ Jane Austen ၏ ဝတ္ထုများကို နားလည်သူများသည် Regency England ၏ ရိုးရာများကို critique ပြုလုပ်ထားသည်ကို သိရှိနိုင်သည်။ Elizabeth Bennett သည် *Pride and Prejudice* ၏ အဓိကဇာတ်ကောင်ဖြစ်ပြီး ၎င်း၏ စကားလုံးများသည် nuance အများအပြားပါဝင်သည်။ Mr. Darcy သည် Elizabeth ၏ playful language ကိုမှတ်ချက်ပြုထားသည်- "I have had the pleasure of your acquaintance long enough to know that you find great enjoyment in occasionally professing opinions which in fact are not your own." + +--- + +## 🚀စိန်ခေါ်မှု + +Marvin ကို user input မှ feature များကို ထုတ်ယူခြင်းဖြင့် ပိုမိုကောင်းမွန်အောင် ပြုလုပ်နိုင်ပါသလား။ + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Review & Self Study +စာသားမှခံစားချက်ကိုထုတ်ယူရန်နည်းလမ်းများစွာရှိသည်။ ဒီနည်းလမ်းကိုအသုံးပြုနိုင်မည့်လုပ်ငန်းဆိုင်ရာအက်ပလီကေးရှင်းများကိုစဉ်းစားပါ။ ဒါဟာဘယ်လိုမှားယွင်းနိုင်တယ်ဆိုတာကိုလည်းစဉ်းစားပါ။ ခံစားချက်ကိုခွဲခြားစစ်ဆေးပေးသော [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott) ကဲ့သို့သောစီးပွားရေးလုပ်ငန်းများအတွက်အသင့်ဖြစ်သောစနစ်များအကြောင်းပိုမိုဖတ်ရှုပါ။ အထက်တွင်ဖော်ပြထားသော Pride and Prejudice စာကြောင်းများကိုစမ်းသပ်ပြီး၊ အနုနုကျကျခံစားချက်များကိုသိနိုင်မလားစစ်ဆေးပါ။ + +## လုပ်ငန်းတာဝန် + +[Poetic license](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူသားပညာရှင်များမှ ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/3-Translation-Sentiment/assignment.md b/translations/my/6-NLP/3-Translation-Sentiment/assignment.md new file mode 100644 index 00000000..a36d4b0d --- /dev/null +++ b/translations/my/6-NLP/3-Translation-Sentiment/assignment.md @@ -0,0 +1,25 @@ + +# ကဗျာရေးဆရာ၏ လွတ်လပ်ခွင့် + +## လမ်းညွှန်ချက်များ + +[ဒီ notebook](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) မှာ Azure text analytics ကို အသုံးပြုပြီး sentiment ကို ယခင်က ခွဲခြားထားသော Emily Dickinson ရဲ့ ကဗျာ ၅၀၀ ကျော်ကို တွေ့နိုင်ပါတယ်။ ဒီ dataset ကို သင်ခန်းစာမှာ ဖော်ပြထားတဲ့ နည်းလမ်းတွေကို အသုံးပြုပြီး ခွဲခြားပါ။ ကဗျာတစ်ပုဒ်ရဲ့ အကြံပြုထားတဲ့ sentiment က Azure service ရဲ့ ဆုံးဖြတ်ချက်နဲ့ ကိုက်ညီပါသလား? သင့်အမြင်အရ ဘာကြောင့် ကိုက်ညီသို့မဟုတ် မကိုက်ညီပါသလဲ? ဘာအရာတွေက သင့်ကို အံ့အားသင့်စေပါသလဲ? + +## အဆင့်သတ်မှတ်ချက် + +| စံနှုန်း | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| -------- | -------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------ | +| | စာရေးသူရဲ့ နမူနာ output ကို ခိုင်မာတဲ့ ခွဲခြားမှုနဲ့ notebook တစ်ခု ဖော်ပြထားသည် | notebook က မပြီးစီးသို့မဟုတ် ခွဲခြားမှုမပြုလုပ်ထားပါ | notebook မဖော်ပြထားပါ | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/3-Translation-Sentiment/solution/Julia/README.md b/translations/my/6-NLP/3-Translation-Sentiment/solution/Julia/README.md new file mode 100644 index 00000000..d626186c --- /dev/null +++ b/translations/my/6-NLP/3-Translation-Sentiment/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/3-Translation-Sentiment/solution/R/README.md b/translations/my/6-NLP/3-Translation-Sentiment/solution/R/README.md new file mode 100644 index 00000000..ae2fe592 --- /dev/null +++ b/translations/my/6-NLP/3-Translation-Sentiment/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/4-Hotel-Reviews-1/README.md b/translations/my/6-NLP/4-Hotel-Reviews-1/README.md new file mode 100644 index 00000000..2da30ebf --- /dev/null +++ b/translations/my/6-NLP/4-Hotel-Reviews-1/README.md @@ -0,0 +1,286 @@ + +# ဟိုတယ်ပြန်လည်သုံးသပ်မှုများနှင့် စိတ်ခံစားမှုခွဲခြမ်းစိတ်ဖြာမှု - ဒေတာကို အလုပ်လုပ်စေခြင်း + +ဤအပိုင်းတွင် သင်သည် ယခင်သင်ခန်းစာများတွင် သင်ယူခဲ့သော နည်းလမ်းများကို အသုံးပြု၍ ဒေတာအစုအဝေးကြီးတစ်ခုကို စူးစမ်းလေ့လာမှု ဒေတာခွဲခြမ်းစိတ်ဖြာမှု (EDA) ပြုလုပ်မည်ဖြစ်သည်။ အမျိုးမျိုးသော ကော်လံများ၏ အသုံးဝင်မှုကို နားလည်ပြီးနောက် သင်သည် အောက်ပါအရာများကို သင်ယူမည်ဖြစ်သည်- + +- မလိုအပ်သော ကော်လံများကို ဖယ်ရှားနည်း +- ရှိပြီးသား ကော်လံများအပေါ် အခြေခံပြီး ဒေတာအသစ်များကို တွက်ချက်နည်း +- နောက်ဆုံး စိန်ခေါ်မှုတွင် အသုံးပြုရန်အတွက် ရလဒ်အဖြစ်ရသော ဒေတာအစုအဝေးကို သိမ်းဆည်းနည်း + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +### အကျဉ်းချုပ် + +ယခုအချိန်ထိ သင်သည် စာသားဒေတာသည် ကိန်းဂဏန်းဒေတာများနှင့် မတူကြောင်း သင်ယူခဲ့ပြီဖြစ်သည်။ လူသားများရေးသားထားသည့် သို့မဟုတ် ပြောဆိုထားသည့် စာသားများကို ပုံစံများနှင့် မကြာခဏဖြစ်သော စကားလုံးများ၊ စိတ်ခံစားမှုများနှင့် အဓိပ္ပါယ်များကို ရှာဖွေခွဲခြမ်းနိုင်သည်။ ဤသင်ခန်းစာတွင် သင်သည် အမှန်တကယ်သော ဒေတာအစုအဝေးနှင့် အမှန်တကယ်သော စိန်ခေါ်မှုတစ်ခုကို ရင်ဆိုင်မည်ဖြစ်သည် - **[515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)** (ဤဒေတာသည် [CC0: Public Domain license](https://creativecommons.org/publicdomain/zero/1.0/) ဖြင့် ထုတ်ဝေထားသည်)။ ဒေတာကို Booking.com မှ ပြည်သူ့ရင်းမြစ်များမှ စုဆောင်းထားပြီး ဒေတာဖန်တီးသူမှာ Jiashen Liu ဖြစ်သည်။ + +### ပြင်ဆင်မှု + +သင်လိုအပ်မည့်အရာများ- + +* Python 3 ဖြင့် .ipynb notebooks များကို အလုပ်လုပ်စေနိုင်ရမည် +* pandas +* NLTK, [ဤနေရာတွင် ဒေသတွင်းတွင် ထည့်သွင်းပါ](https://www.nltk.org/install.html) +* Kaggle တွင် ရရှိနိုင်သည့် ဒေတာအစုအဝေး [515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)။ ဒေတာကို ဖိုင်ဖွင့်ပြီးနောက် 230 MB ခန့်ရှိသည်။ ဒေတာကို ဤ NLP သင်ခန်းစာများနှင့် ဆက်စပ်သော `/data` ဖိုလ်ဒါတွင် ဒေါင်းလုပ်ဆွဲထားပါ။ + +## စူးစမ်းလေ့လာမှု ဒေတာခွဲခြမ်းစိတ်ဖြာမှု + +ဤစိန်ခေါ်မှုသည် စိတ်ခံစားမှုခွဲခြမ်းစိတ်ဖြာမှုနှင့် ဧည့်သည်ပြန်လည်သုံးသပ်မှုအမှတ်များကို အသုံးပြု၍ ဟိုတယ်အကြံပြုမှုဘော့တစ်ခုကို တည်ဆောက်နေသည်ဟု သင်ယူထားသည်။ သင်အသုံးပြုမည့် ဒေတာအစုအဝေးတွင် မြို့ကြီး ၆ ခုရှိ ဟိုတယ် ၁၄၉၃ ခုမှ ပြန်လည်သုံးသပ်မှုများ ပါဝင်သည်။ + +Python, ဟိုတယ်ပြန်လည်သုံးသပ်မှုဒေတာအစုအဝေးနှင့် NLTK ၏ စိတ်ခံစားမှုခွဲခြမ်းစိတ်ဖြာမှုကို အသုံးပြု၍ သင်သည် အောက်ပါအရာများကို ရှာဖွေနိုင်သည်- + +* ပြန်လည်သုံးသပ်မှုများတွင် အကြိမ်ရေအများဆုံးဖြစ်သော စကားလုံးများနှင့် စကားစုများက ဘာတွေလဲ။ +* ဟိုတယ်ကို ဖော်ပြသည့် *tags* များသည် ပြန်လည်သုံးသပ်မှုအမှတ်များနှင့် ဆက်စပ်နေပါသလား (ဥပမာ- *Family with young children* အတွက် အနုတ်လက္ခဏာပြန်လည်သုံးသပ်မှုများသည် *Solo traveller* ထက် ပိုများနေပါသလား၊ ဤဟိုတယ်သည် *Solo travellers* အတွက် ပိုသင့်တော်ကြောင်း ပြသနိုင်သည်)။ +* NLTK ၏ စိတ်ခံစားမှုအမှတ်များသည် ဟိုတယ်ပြန်လည်သုံးသပ်သူ၏ ကိန်းဂဏန်းအမှတ်နှင့် 'သဘောတူ' နေပါသလား။ + +#### ဒေတာအစုအဝေး + +သင်ဒေါင်းလုပ်ဆွဲပြီး ဒေသတွင်းတွင် သိမ်းဆည်းထားသော ဒေတာအစုအဝေးကို စူးစမ်းကြည့်ပါ။ ဖိုင်ကို VS Code သို့မဟုတ် Excel ကဲ့သို့သော တည်းဖြတ်ရေးဆော့ဖ်ဝဲတစ်ခုဖြင့် ဖွင့်ပါ။ + +ဒေတာအစုအဝေးတွင် ပါဝင်သော ခေါင်းစဉ်များမှာ အောက်ပါအတိုင်းဖြစ်သည်- + +*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng* + +ဤခေါင်းစဉ်များကို အောက်ပါအတိုင်း အုပ်စုဖွဲ့ထားသည်- + +##### ဟိုတယ်ကော်လံများ + +* `Hotel_Name`, `Hotel_Address`, `lat` (latitude), `lng` (longitude) + * *lat* နှင့် *lng* ကို အသုံးပြု၍ Python ဖြင့် ဟိုတယ်တည်နေရာများကို မြေပုံပေါ်တွင် ရှုထောင့်အရောင်သတ်မှတ်ထားပြီး ရေးဆွဲနိုင်သည်။ + * Hotel_Address သည် ကျွန်ုပ်တို့အတွက် ထင်ရှားစွာ အသုံးမဝင်သည့်အရာဖြစ်ပြီး၊ အလွယ်တကူ စီစစ်ခြင်းနှင့် ရှာဖွေမှုအတွက် နိုင်ငံတစ်ခုဖြင့် အစားထိုးမည်ဖြစ်သည်။ + +**ဟိုတယ် Meta-review ကော်လံများ** + +* `Average_Score` + * ဒေတာဖန်တီးသူအဆိုအရ၊ ဤကော်လံသည် *နောက်ဆုံးနှစ်အတွင်းမှ နောက်ဆုံးမှတ်ချက်အပေါ် အခြေခံ၍ တွက်ချက်ထားသော ဟိုတယ်၏ ပျမ်းမျှအမှတ်* ဖြစ်သည်။ ၎င်းသည် အမှတ်ကို တွက်ချက်သည့် ပုံစံအနေနှင့် ထူးဆန်းသော်လည်း၊ ယခုအချိန်အတွက် ကျွန်ုပ်တို့သည် ၎င်းကို ယုံကြည်ရမည်ဖြစ်သည်။ + + ✅ ဤဒေတာအတွင်းရှိ အခြားသော ကော်လံများအပေါ် အခြေခံ၍ ပျမ်းမျှအမှတ်ကို တွက်ချက်ရန် နည်းလမ်းတစ်ခုကို သင်စဉ်းစားနိုင်ပါသလား။ + +* `Total_Number_of_Reviews` + * ဤဟိုတယ်သည် ရရှိထားသော ပြန်လည်သုံးသပ်မှုအရေအတွက် - ၎င်းသည် (အချို့သော ကုဒ်ရေးသားမှုမပြုလုပ်မီ) ဒေတာအစုအဝေးတွင် ပါဝင်သော ပြန်လည်သုံးသပ်မှုများကို ဆိုလိုသည်ဟု မရှင်းလင်းပါ။ +* `Additional_Number_of_Scoring` + * ၎င်းသည် ပြန်လည်သုံးသပ်မှုအမှတ်ကို ပေးခဲ့သော်လည်း ပြန်လည်သုံးသပ်မှုအနုတ်လက္ခဏာ သို့မဟုတ် အပေါင်းလက္ခဏာကို မရေးသားခဲ့သော အခြေအနေကို ဆိုလိုသည်။ + +**ပြန်လည်သုံးသပ်မှုကော်လံများ** + +- `Reviewer_Score` + - ၎င်းသည် အနည်းဆုံးနှင့် အများဆုံးတန်ဖိုး 2.5 နှင့် 10 အကြားတွင် အများဆုံး ဒသမ ၁ ချက်ရှိသော ကိန်းဂဏန်းတန်ဖိုးဖြစ်သည်။ + - အနည်းဆုံးအမှတ်ဖြစ်နိုင်သော 2.5 သည် အနိမ့်ဆုံးအမှတ်ဖြစ်ရမည့်အကြောင်းကို မရှင်းလင်းထားပါ။ +- `Negative_Review` + - ပြန်လည်သုံးသပ်သူသည် ဘာမှ မရေးသားပါက၊ ဤကွင်းသည် "**No Negative**" ဟု ရေးထားမည်။ + - ပြန်လည်သုံးသပ်သူသည် အနုတ်လက္ခဏာကွင်းတွင် အပေါင်းလက္ခဏာပြန်လည်သုံးသပ်မှုကို ရေးသားနိုင်သည် (ဥပမာ- "ဤဟိုတယ်တွင် မကောင်းသောအရာမရှိပါ")။ +- `Review_Total_Negative_W +🚨 သတိပေးချက် +ဒီ dataset ကို အသုံးပြုတဲ့အခါမှာ သင်ရေးတဲ့ code က text ကို ဖတ်စရာမလိုဘဲ text ထဲကနေ တစ်ခုခုကိုတွက်ချက်ပေးနိုင်ရမယ်။ ဒါဟာ NLP ရဲ့ အဓိကအချက်ဖြစ်ပြီး လူ့အဖွဲ့အစည်းမပါဘဲ အဓိပ္ပါယ်နဲ့ခံစားချက်ကို အနက်ဖွင့်ပေးနိုင်တာပဲဖြစ်ပါတယ်။ သို့သော် သင်အချို့သော အနုတ်လက္ခဏာရှိတဲ့ review တွေကို ဖတ်မိနိုင်ပါတယ်။ အဲ့ဒီ review တွေကို မဖတ်ဖို့ အကြံပေးချင်ပါတယ်၊ ဘာဖြစ်လို့လဲဆိုတော့ သင်ဖတ်စရာမလိုလို့ပါ။ အချို့ review တွေက အလွဲလွဲအချော်ချော်ဖြစ်ပြီး hotel နဲ့မသက်ဆိုင်တဲ့ အနုတ်လက္ခဏာရှိတဲ့ review တွေဖြစ်နိုင်ပါတယ်၊ ဥပမာ "ရာသီဥတုက မကောင်းဘူး" ဆိုတဲ့အရာတွေ၊ hotel ရဲ့ ထိန်းချုပ်မှုအောက်မှာမရှိတဲ့အရာတွေ၊ ဒါမှမဟုတ် ဘယ်သူ့အတွက်မှ ထိန်းချုပ်လို့မရတဲ့အရာတွေပါ။ ဒါပေမယ့် review တွေထဲမှာ အနောက်ဖက်မှောင်မိုက်တဲ့အပိုင်းလည်းရှိပါတယ်။ အချို့သော အနုတ်လက္ခဏာရှိတဲ့ review တွေက လူမျိုးရေး၊ လိင်ရေး၊ အသက်အရွယ်ရေး အနက်ဖွင့်မှုတွေပါဝင်နိုင်ပါတယ်။ ဒါဟာ စိတ်မကောင်းစရာကောင်းပေမယ့် public website မှာ scrape လုပ်ထားတဲ့ dataset မှာ ဖြစ်နိုင်တဲ့အရာပါ။ အချို့သော reviewer တွေက သင်မကြိုက်မယ်၊ သက်တောင့်သက်သာမရှိမယ်၊ ဒါမှမဟုတ် စိတ်မကောင်းစရာကောင်းမယ်လို့ ခံစားရမယ့် review တွေကို ရေးသားထားနိုင်ပါတယ်။ sentiment ကို code က တိုင်းတာပေးစေပြီး review တွေကို ကိုယ်တိုင်ဖတ်ပြီး စိတ်မကောင်းဖြစ်စေဖို့ မလုပ်ပါနဲ့။ ဒါဆိုလည်း အဲ့ဒီလိုအရာတွေကို ရေးသားတဲ့သူတွေက အနည်းငယ်ပဲရှိပေမယ့် သူတို့ရှိနေတယ်ဆိုတာတော့ အမှန်ပါပဲ။ +## လေ့ကျင့်မှု - ဒေတာစူးစမ်းခြင်း +### ဒေတာကို တင်ပါ + +ဒေတာကို မျက်မြင်ဖြင့် စစ်ဆေးတာလုံလောက်ပြီဆိုရင်၊ အခုတော့ သင့်ရဲ့ ကုဒ်ကိုရေးပြီး အဖြေတွေကို ရယူကြည့်ပါ။ ဒီအပိုင်းမှာ pandas library ကို အသုံးပြုမှာဖြစ်ပါတယ်။ သင့်ရဲ့ ပထမဆုံးတာဝန်က CSV ဒေတာကို load လုပ်ပြီး ဖတ်နိုင်တာ သေချာစေဖို့ပါ။ pandas library မှာ CSV loader တစ်ခုရှိပြီး၊ ရလဒ်ကို dataframe အနေနဲ့ ထည့်သွင်းပေးပါတယ်၊ ယခင် သင်ခန်းစာတွေမှာလိုပဲ။ ကျွန်တော်တို့ load လုပ်မယ့် CSV ဖိုင်မှာ တန်းစီထားတဲ့ အတန်း ၅ သိန်းကျော်ရှိပေမယ့် ကော်လံ ၁၇ ခုသာ ပါဝင်ပါတယ်။ Pandas က dataframe နဲ့ အလုပ်လုပ်ဖို့ အစွမ်းထက်နည်းလမ်းတွေ အများကြီးပေးထားပြီး၊ တန်းစီထားတဲ့ အတန်းတိုင်းမှာ လုပ်ဆောင်ချက်တွေ ပြုလုပ်နိုင်ပါတယ်။ + +ဒီသင်ခန်းစာမှာ ဒီနေရာကစပြီး ကုဒ် snippet တွေ၊ ကုဒ်ရဲ့ ရှင်းလင်းချက်တွေ၊ ရလဒ်တွေက ဘာကို ဆိုလိုတာလဲဆိုတာ ဆွေးနွေးချက်တွေ ပါဝင်မှာဖြစ်ပါတယ်။ သင့်ရဲ့ ကုဒ်အတွက် _notebook.ipynb_ ကို အသုံးပြုပါ။ + +အရင်ဆုံး သင်အသုံးပြုမယ့် ဒေတာဖိုင်ကို load လုပ်တာကစပါမယ် - + +```python +# Load the hotel reviews from CSV +import pandas as pd +import time +# importing time so the start and end time can be used to calculate file loading time +print("Loading data file now, this could take a while depending on file size") +start = time.time() +# df is 'DataFrame' - make sure you downloaded the file to the data folder +df = pd.read_csv('../../data/Hotel_Reviews.csv') +end = time.time() +print("Loading took " + str(round(end - start, 2)) + " seconds") +``` + +ဒေတာကို load လုပ်ပြီးပြီဆိုရင်၊ အခုတော့ ဒေတာပေါ်မှာ လုပ်ဆောင်ချက်တွေ ပြုလုပ်နိုင်ပါပြီ။ ဒီကုဒ်ကို သင့်ရဲ့ အစီအစဉ်ရဲ့ အပေါ်ဆုံးမှာ ထည့်ထားပါ။ + +## ဒေတာကို စူးစမ်းပါ + +ဒီအခါမှာတော့ ဒေတာဟာ *သန့်ရှင်း* ဖြစ်ပြီး၊ အလုပ်လုပ်ဖို့ အဆင်သင့်ဖြစ်နေပါပြီ။ ဒါက ဘာကိုဆိုလိုတာလဲဆိုရင်၊ အင်္ဂလိပ်စာလုံးတွေကိုသာ မျှော်လင့်နေတဲ့ အယ်လဂိုရီသမ်တွေကို အနှောက်အယှက်ဖြစ်စေမယ့် အခြားဘာသာစကားတွေရဲ့ စာလုံးတွေ မပါဝင်ဘူးဆိုတာပါ။ + +✅ သင့်အနေနဲ့ NLP နည်းပညာတွေကို အသုံးချမယ့်အခါ၊ ဒေတာကို အစပိုင်းမှာ format ပြင်ဆင်ဖို့ လိုအပ်တတ်ပါတယ်၊ ဒါပေမယ့် ဒီအခါမှာတော့ မလိုအပ်ပါဘူး။ သင့်အနေနဲ့ အင်္ဂလိပ်မဟုတ်တဲ့ စာလုံးတွေကို ဘယ်လိုကိုင်တွယ်မလဲ? + +ဒေတာကို load လုပ်ပြီးတာနဲ့၊ ကုဒ်နဲ့အတူ စူးစမ်းနိုင်တာ သေချာစေပါ။ `Negative_Review` နဲ့ `Positive_Review` ကော်လံတွေကို အလွယ်တကူ အာရုံစိုက်ချင်တတ်ပါတယ်။ ဒီကော်လံတွေမှာ သင့်ရဲ့ NLP အယ်လဂိုရီသမ်တွေ အလုပ်လုပ်ဖို့ သဘာဝစာသားတွေ ပါဝင်ပါတယ်။ ဒါပေမယ့် ခဏစောင့်ပါ! NLP နဲ့ စိတ်ခံစားမှုကို စတင်မလုပ်ခင်၊ pandas နဲ့ ရှာဖွေတွေ့ရှိထားတဲ့ တန်ဖိုးတွေဟာ ဒေတာစဉ်မှာပေးထားတဲ့ တန်ဖိုးတွေနဲ့ ကိုက်ညီမကိုက်ညီ စစ်ဆေးဖို့ အောက်ပါကုဒ်ကို လိုက်နာပါ။ + +## Dataframe လုပ်ဆောင်ချက်များ + +ဒီသင်ခန်းစာရဲ့ ပထမဆုံးတာဝန်ကတော့ အောက်ပါ အတည်ပြုချက်တွေကို စစ်ဆေးဖို့ ကုဒ်ရေးပါ။ ဒေတာဖရိမ်ကို ပြောင်းလဲမလုပ်ဘဲ စစ်ဆေးပါ။ + +> Programming လုပ်ငန်းတာဝန်အများစုလိုပဲ၊ ဒီအလုပ်ကို ပြီးမြောက်ဖို့ နည်းလမ်းအများကြီး ရှိပါတယ်၊ ဒါပေမယ့် အကောင်းဆုံးအကြံပေးချက်ကတော့ သင်နောက်ပိုင်းမှာ ဒီကုဒ်ကို ပြန်ကြည့်တဲ့အခါ အလွယ်တကူ နားလည်နိုင်အောင် ရိုးရှင်းပြီး လွယ်ကူတဲ့ နည်းလမ်းနဲ့ လုပ်ပါ။ Dataframe တွေအတွက် Comprehensive API တစ်ခုရှိပြီး၊ သင်လိုချင်တာကို ထိရောက်စွာ ပြုလုပ်နိုင်မယ့် နည်းလမ်းတစ်ခု ရှိတတ်ပါတယ်။ + +အောက်ပါမေးခွန်းတွေကို coding task အနေနဲ့ သတ်မှတ်ပြီး၊ ဖြေရှင်းချက်ကို မကြည့်ဘဲ ကြိုးစားဖြေပါ။ + +1. သင် load လုပ်ထားတဲ့ dataframe ရဲ့ *shape* ကို print ထုတ်ပါ (shape ဆိုတာက အတန်းနဲ့ ကော်လံအရေအတွက်ပါ) +2. Reviewer နိုင်ငံသားများအတွက် frequency count ကိုတွက်ပါ - + 1. `Reviewer_Nationality` ကော်လံမှာ ဘယ်လောက် distinct value တွေရှိပြီး၊ အဲဒီ value တွေက ဘာတွေလဲ? + 2. Dataset မှာ အများဆုံးတွေ့ရတဲ့ reviewer နိုင်ငံသားက ဘယ်နိုင်ငံသားလဲ (နိုင်ငံနဲ့ review အရေအတွက်ကို print ထုတ်ပါ) + 3. နောက်ထပ် အများဆုံးတွေ့ရတဲ့ နိုင်ငံသား ၁၀ ယောက်နဲ့ သူတို့ရဲ့ frequency count တွေက ဘယ်လောက်လဲ? +3. အများဆုံး review ရရှိတဲ့ ဟိုတယ်ကို top 10 reviewer နိုင်ငံသားအလိုက် တွက်ပါ။ +4. Dataset မှာ ဟိုတယ်တစ်ခုစီအတွက် review အရေအတွက် (frequency count) ကို တွက်ပါ။ +5. Dataset မှာ ဟိုတယ်တစ်ခုစီအတွက် `Average_Score` ကော်လံတစ်ခုရှိပေမယ့်၊ reviewer score တွေကို အသုံးပြုပြီး သင့်ကိုယ်တိုင်လည်း အလယ်ပျမ်းမျှကို တွက်နိုင်ပါတယ်။ `Calc_Average_Score` ဆိုတဲ့ ကော်လံခေါင်းစဉ်နဲ့ အသစ်တစ်ခုထည့်ပါ။ +6. `Average_Score` နဲ့ `Calc_Average_Score` တန်ဖိုးတွေဟာ တူညီတဲ့ ဟိုတယ်တွေ ရှိပါသလား (တစ်ဆင့်တည်းအနက် rounded)? + 1. Python function တစ်ခုရေးပါ၊ Series (row) တစ်ခုကို argument အနေနဲ့ ယူပြီး၊ တန်ဖိုးတွေ မတူညီတဲ့အခါ message တစ်ခု print ထုတ်ပါ။ `.apply()` method ကို အသုံးပြုပြီး row တစ်ခုစီကို process လုပ်ပါ။ +7. `Negative_Review` ကော်လံမှာ "No Negative" ဆိုတဲ့ တန်ဖိုးရှိတဲ့ row အရေအတွက်ကို တွက်ပြီး print ထုတ်ပါ။ +8. `Positive_Review` ကော်လံမှာ "No Positive" ဆိုတဲ့ တန်ဖိုးရှိတဲ့ row အရေအတွက်ကို တွက်ပြီး print ထုတ်ပါ။ +9. `Positive_Review` ကော်လံမှာ "No Positive" နဲ့ `Negative_Review` ကော်လံမှာ "No Negative" ဆိုတဲ့ တန်ဖိုးနှစ်ခုလုံးရှိတဲ့ row အရေအတွက်ကို တွက်ပြီး print ထုတ်ပါ။ + +### ကုဒ်ဖြေရှင်းချက် + +1. ```python + print("The shape of the data (rows, cols) is " + str(df.shape)) + > The shape of the data (rows, cols) is (515738, 17) + ``` + +2. ```python + # value_counts() creates a Series object that has index and values in this case, the country and the frequency they occur in reviewer nationality + nationality_freq = df["Reviewer_Nationality"].value_counts() + print("There are " + str(nationality_freq.size) + " different nationalities") + # print first and last rows of the Series. Change to nationality_freq.to_string() to print all of the data + print(nationality_freq) + + There are 227 different nationalities + United Kingdom 245246 + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + ... + Comoros 1 + Palau 1 + Northern Mariana Islands 1 + Cape Verde 1 + Guinea 1 + Name: Reviewer_Nationality, Length: 227, dtype: int64 + ``` + +3. ```python + # What was the most frequently reviewed hotel for the top 10 nationalities + # Normally with pandas you will avoid an explicit loop, but wanted to show creating a new dataframe using criteria (don't do this with large amounts of data because it could be very slow) + for nat in nationality_freq[:10].index: + # First, extract all the rows that match the criteria into a new dataframe + nat_df = df[df["Reviewer_Nationality"] == nat] + # Now get the hotel freq + freq = nat_df["Hotel_Name"].value_counts() + print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.") + + The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews. + The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews. + The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews. + The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews. + The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews. + The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews. + The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews. + The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews. + The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews. + The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews. + ``` + +4. ```python + # First create a new dataframe based on the old one, removing the uneeded columns + hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1) + + # Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found + hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count') + + # Get rid of all the duplicated rows + hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"]) + display(hotel_freq_df) + ``` + +5. ```python + # define a function that takes a row and performs some calculation with it + def get_difference_review_avg(row): + return row["Average_Score"] - row["Calc_Average_Score"] + + # 'mean' is mathematical word for 'average' + df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + + # Add a new column with the difference between the two average scores + df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1) + + # Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel) + review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"]) + + # Sort the dataframe to find the lowest and highest average score difference + review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"]) + + display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]]) + ``` + +6. ```python + # with lambdas: + start = time.time() + no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1) + print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index))) + + no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index))) + + both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index))) + end = time.time() + print("Lambdas took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Lambdas took 9.64 seconds + ``` + +## အခြားနည်းလမ်း + +Lambda မသုံးဘဲ item တွေကို count လုပ်ပြီး၊ row တွေကို count လုပ်ဖို့ sum ကို အသုံးပြုပါ - + + ```python + # without lambdas (using a mixture of notations to show you can use both) + start = time.time() + no_negative_reviews = sum(df.Negative_Review == "No Negative") + print("Number of No Negative reviews: " + str(no_negative_reviews)) + + no_positive_reviews = sum(df["Positive_Review"] == "No Positive") + print("Number of No Positive reviews: " + str(no_positive_reviews)) + + both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive")) + print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews)) + + end = time.time() + print("Sum took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Sum took 0.19 seconds + ``` + +127 rows မှာ `Negative_Review` နဲ့ `Positive_Review` ကော်လံတွေမှာ "No Negative" နဲ့ "No Positive" တန်ဖိုးတွေ ရှိနေတယ်ဆိုတာ သတိထားမိမှာပါ။ ဒါကဆိုရင် reviewer က ဟိုတယ်ကို နံပါတ်အဆင့်ပေးခဲ့ပေမယ့်၊ အပြုသဘော သို့မဟုတ် အနုတ်သဘော review မရေးခဲ့တာဖြစ်ပါတယ်။ ဒေတာစဉ်မှာ review မပါဝင်တဲ့ row တွေ ရှိတယ်ဆိုတာ မမျှော်လင့်ထားတာဖြစ်ပေမယ့်၊ ဒေတာကို စူးစမ်းတဲ့အခါ ဒီလို row တွေကို ရှာဖွေတွေ့ရှိရမှာပါ။ + +အခုတော့ dataset ကို စူးစမ်းပြီးဖြစ်တဲ့အတွက်၊ နောက်သင်ခန်းစာမှာ ဒေတာကို filter လုပ်ပြီး sentiment analysis တစ်ခု ထည့်သွင်းပါမယ်။ + +--- +## 🚀 စိန်ခေါ်မှု + +ဒီသင်ခန်းစာက ပြသသလို၊ သင့်ဒေတာနဲ့ ဒေတာရဲ့ အားနည်းချက်တွေကို နားလည်ဖို့ အရေးကြီးကြောင်း ပြသပါတယ်။ စာသားအခြေပြု ဒေတာတွေကို အထူးသဖြင့် သေချာစွာ စစ်ဆေးဖို့ လိုအပ်ပါတယ်။ စာသားအများကြီးပါတဲ့ dataset တွေကို စူးစမ်းပြီး၊ မော်ဒယ်မှာ bias သို့မဟုတ် skewed sentiment ဖြစ်စေနိုင်တဲ့ အပိုင်းတွေ ရှာဖွေကြည့်ပါ။ + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +[ဒီ Learning Path on NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) ကို လေ့လာပြီး၊ စကားပြောနဲ့ စာသားအခြေပြု မော်ဒယ်တွေ တည်ဆောက်တဲ့အခါ အသုံးပြုနိုင်မယ့် ကိရိယာတွေကို ရှာဖွေပါ။ + +## လုပ်ငန်းတာဝန် + +[NLTK](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/4-Hotel-Reviews-1/assignment.md b/translations/my/6-NLP/4-Hotel-Reviews-1/assignment.md new file mode 100644 index 00000000..24e70f45 --- /dev/null +++ b/translations/my/6-NLP/4-Hotel-Reviews-1/assignment.md @@ -0,0 +1,19 @@ + +# NLTK + +## လမ်းညွှန်ချက်များ + +NLTK သည် ကွန်ပျူတာဘာသာဗေဒနှင့် သဘာဝဘာသာစကားလုပ်ငန်းစဉ်များတွင် အသုံးပြုရန် အထင်ရှားဆုံးစာကြည့်တိုက်တစ်ခုဖြစ်သည်။ '[NLTK စာအုပ်](https://www.nltk.org/book/)' ကို ဖတ်ရှုရန်နှင့် ၎င်း၏ လေ့ကျင့်ခန်းများကို စမ်းသပ်ရန် အခွင့်အရေးကို ယခုယူပါ။ ဤအမှတ်မပေးသော လုပ်ငန်းမှာ သင် NLTK စာကြည့်တိုက်ကို ပိုမိုနက်ရှိုင်းစွာ သိရှိနိုင်မည်ဖြစ်သည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပါယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md b/translations/my/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md new file mode 100644 index 00000000..edf596d5 --- /dev/null +++ b/translations/my/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆောင်ရွက်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/4-Hotel-Reviews-1/solution/R/README.md b/translations/my/6-NLP/4-Hotel-Reviews-1/solution/R/README.md new file mode 100644 index 00000000..c9087888 --- /dev/null +++ b/translations/my/6-NLP/4-Hotel-Reviews-1/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်ကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/5-Hotel-Reviews-2/README.md b/translations/my/6-NLP/5-Hotel-Reviews-2/README.md new file mode 100644 index 00000000..66beb65f --- /dev/null +++ b/translations/my/6-NLP/5-Hotel-Reviews-2/README.md @@ -0,0 +1,389 @@ + +# ဟိုတယ်အကြောင်းအမြင်သုံးသပ်မှု (Sentiment Analysis) + +အခု dataset ကိုအသေးစိတ်လေ့လာပြီးပြီဆိုတော့၊ column တွေကို filter လုပ်ပြီးနောက်မှာ NLP နည်းလမ်းတွေကိုအသုံးပြုကာ ဟိုတယ်များအကြောင်းအသစ်အမြင်တွေ ရယူနိုင်ဖို့အချိန်ရောက်ပါပြီ။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +### Filtering & Sentiment Analysis လုပ်ဆောင်မှုများ + +သင်မိမိ dataset ကိုကြည့်ပြီးသားဆိုရင်၊ dataset မှာအချို့ပြဿနာတွေရှိနေတယ်ဆိုတာသတိထားမိမှာပါ။ အချို့ column တွေမှာ အသုံးမဝင်တဲ့အချက်အလက်တွေဖြည့်ထားပြီး၊ အချို့ကတော့မှားယွင်းနေတယ်လို့ပုံရပါတယ်။ မှန်ကန်နေရင်တောင်၊ အဲဒီအချက်အလက်တွေကိုဘယ်လိုတွက်ချက်ထားတယ်ဆိုတာရှင်းလင်းမှုမရှိဘဲ၊ မိမိ calculation တွေကိုအသုံးပြုပြီး independent verification လုပ်လို့မရနိုင်ပါ။ + +## လေ့ကျင့်ခန်း - အချက်အလက်တွေကိုနောက်ထပ် process လုပ်ခြင်း + +အချက်အလက်တွေကိုနည်းနည်းပိုပြီးသန့်စင်ပါ။ နောက်ပိုင်းမှာအသုံးဝင်မယ့် column တွေထည့်ပါ၊ အချို့ column တွေမှာ value တွေကိုပြောင်းပါ၊ အချို့ column တွေကိုလုံးဝဖျက်ပစ်ပါ။ + +1. Initial column processing + + 1. `lat` နဲ့ `lng` ကိုဖျက်ပါ။ + + 2. `Hotel_Address` value တွေကိုအောက်ပါ value တွေဖြင့်အစားထိုးပါ (address မှာမြို့နဲ့နိုင်ငံအမည်ပါဝင်ရင်၊ မြို့နဲ့နိုင်ငံအမည်ကိုသာထားပါ)။ + + Dataset မှာပါဝင်တဲ့မြို့နဲ့နိုင်ငံတွေကတော့: + + Amsterdam, Netherlands + + Barcelona, Spain + + London, United Kingdom + + Milan, Italy + + Paris, France + + Vienna, Austria + + ```python + def replace_address(row): + if "Netherlands" in row["Hotel_Address"]: + return "Amsterdam, Netherlands" + elif "Barcelona" in row["Hotel_Address"]: + return "Barcelona, Spain" + elif "United Kingdom" in row["Hotel_Address"]: + return "London, United Kingdom" + elif "Milan" in row["Hotel_Address"]: + return "Milan, Italy" + elif "France" in row["Hotel_Address"]: + return "Paris, France" + elif "Vienna" in row["Hotel_Address"]: + return "Vienna, Austria" + + # Replace all the addresses with a shortened, more useful form + df["Hotel_Address"] = df.apply(replace_address, axis = 1) + # The sum of the value_counts() should add up to the total number of reviews + print(df["Hotel_Address"].value_counts()) + ``` + + အခုတော့ country အဆင့်အချက်အလက်တွေကို query လုပ်နိုင်ပါပြီ: + + ```python + display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"})) + ``` + + | Hotel_Address | Hotel_Name | + | :--------------------- | :--------: | + | Amsterdam, Netherlands | 105 | + | Barcelona, Spain | 211 | + | London, United Kingdom | 400 | + | Milan, Italy | 162 | + | Paris, France | 458 | + | Vienna, Austria | 158 | + +2. Hotel Meta-review column တွေကို process လုပ်ပါ။ + + 1. `Additional_Number_of_Scoring` ကိုဖျက်ပါ။ + + 1. `Total_Number_of_Reviews` ကို dataset မှာတကယ်ပါဝင်တဲ့ review အရေအတွက်နဲ့အစားထိုးပါ။ + + 1. `Average_Score` ကိုမိမိတို့တွက်ချက်ထားတဲ့ score နဲ့အစားထိုးပါ။ + + ```python + # Drop `Additional_Number_of_Scoring` + df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True) + # Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values + df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count') + df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + ``` + +3. Review column တွေကို process လုပ်ပါ။ + + 1. `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` နဲ့ `days_since_review` ကိုဖျက်ပါ။ + + 2. `Reviewer_Score`, `Negative_Review`, နဲ့ `Positive_Review` ကိုအတိုင်းထားပါ။ + + 3. `Tags` ကိုယာယီထားပါ။ + + - နောက်ပိုင်းမှာ tag တွေကိုနောက်ထပ် filter လုပ်ပြီးနောက်မှာတော့ tag တွေကိုဖျက်ပစ်ပါမယ်။ + +4. Reviewer column တွေကို process လုပ်ပါ။ + + 1. `Total_Number_of_Reviews_Reviewer_Has_Given` ကိုဖျက်ပါ။ + + 2. `Reviewer_Nationality` ကိုအတိုင်းထားပါ။ + +### Tag column တွေ + +`Tag` column ကပြဿနာရှိနေပါတယ်၊ အဲဒါက list (text အနေနဲ့) ကို column ထဲမှာသိမ်းထားတာဖြစ်ပါတယ်။ အလွယ်တကူလူ့အမြင်နဲ့စစ်ဆေးဖို့ခက်ခဲပါတယ်၊ အကြောင်းကတော့ dataset မှာ 515,000 rows ရှိပြီး၊ 1427 ဟိုတယ်တွေရှိပြီး၊ review တစ်ခုစီမှာ reviewer ရွေးချယ်နိုင်တဲ့ option တွေကနည်းနည်းကွဲပြားနေပါတယ်။ ဒီနေရာမှာတော့ NLP ကအထောက်အကူဖြစ်ပါတယ်။ Text ကို scan လုပ်ပြီးအများဆုံးတွေ့ရတဲ့ phrase တွေကို count လုပ်နိုင်ပါတယ်။ + +သို့သော်၊ single word တွေမဟုတ်ဘဲ multi-word phrase တွေ (ဥပမာ - *Business trip*) ကိုစိတ်ဝင်စားပါတယ်။ အဲဒီလို data အများကြီး (6762646 words) ကို multi-word frequency distribution algorithm နဲ့ run လုပ်ရင် အချိန်အတော်ကြာနိုင်ပါတယ်။ ဒါပေမယ့် data ကိုမကြည့်ဘဲ အဲဒီလိုလုပ်ဖို့လိုအပ်တယ်လို့ပုံရပါတယ်။ ဒီနေရာမှာ exploratory data analysis ကအထောက်အကူဖြစ်ပါတယ်၊ အကြောင်းကတော့ tag တွေကို sample အနေနဲ့ကြည့်ပြီး `[' Business trip ', ' Solo traveler ', ' Single Room ', ' Stayed 5 nights ', ' Submitted from a mobile device ']` စသဖြင့် tag တွေကိုစစ်ဆေးနိုင်ပါတယ်။ အဲဒီနောက်မှာတော့ process လုပ်ရမယ့်အချက်အလက်တွေကိုလျှော့ချနိုင်မလားဆိုတာစဉ်းစားနိုင်ပါတယ်။ ကံကောင်းစွာ၊ လျှော့ချနိုင်ပါတယ် - ဒါပေမယ့်အရင်ဆုံးအချို့အဆင့်တွေကိုလိုက်နာဖို့လိုပါတယ်။ + +### Tag တွေကို filter လုပ်ခြင်း + +Dataset ရဲ့ရည်ရွယ်ချက်က sentiment တွေကိုထည့်ပြီး dataset ကိုအသုံးပြုသူအတွက်အကောင်းဆုံးဟိုတယ်ကိုရွေးချယ်နိုင်ဖို့ column တွေထည့်ဖို့ဖြစ်ပါတယ်။ Tag တွေကအသုံးဝင်မလားမသုံးဝင်ဘူးလားကိုမေးမြန်းဖို့လိုပါတယ်။ အောက်မှာ interpretation တစ်ခုကိုပေးထားပါတယ် (သင် dataset ကိုအခြားရည်ရွယ်ချက်အတွက်အသုံးပြုမယ်ဆိုရင် tag တွေကိုထည့်/မထည့်တာကွဲပြားနိုင်ပါတယ်)။ + +1. ခရီးအမျိုးအစားကအရေးကြီးပါတယ်၊ ထားပါ။ +2. ဧည့်သည်အုပ်စုအမျိုးအစားကအရေးကြီးပါတယ်၊ ထားပါ။ +3. ဧည့်သည်နေထိုင်ခဲ့တဲ့အခန်း၊ suite, studio အမျိုးအစားကမအရေးကြီးပါဘူး (ဟိုတယ်တိုင်းမှာအခန်းတွေကအခြေခံအားဖြင့်တူတူပါ)။ +4. Review ကိုဘယ် device မှတင်ထားတယ်ဆိုတာကမအရေးကြီးပါဘူး။ +5. Reviewer နေထိုင်ခဲ့တဲ့ညအရေအတွက်က hotel ကိုပိုကြိုက်တယ်လို့ထင်ရင်အရေးကြီးနိုင်ပါတယ်၊ ဒါပေမယ့်အရေးကြီးမှုနည်းပါတယ်၊ အများအားဖြင့်မအရေးကြီးပါဘူး။ + +အကျဉ်းချုပ်အားဖြင့် **tag ၂ မျိုးကိုထားပြီးအခြား tag တွေကိုဖယ်ရှားပါ**။ + +အရင်ဆုံး tag တွေကို count လုပ်မယ့်အချိန်မှာ format ပိုမကောင်းတဲ့အခြေအနေကိုဖယ်ရှားဖို့လိုပါတယ်၊ square bracket နဲ့ quotes တွေကိုဖယ်ရှားပါ။ အဲဒီအဆင့်တွေကိုအလွယ်တကူလုပ်နိုင်တဲ့ pandas library ရှိပါတယ်။ + +```Python +# Remove opening and closing brackets +df.Tags = df.Tags.str.strip("[']") +# remove all quotes too +df.Tags = df.Tags.str.replace(" ', '", ",", regex = False) +``` + +Tag တစ်ခုစီက `Business trip, Solo traveler, Single Room, Stayed 5 nights, Submitted from a mobile device` လိုမျိုးဖြစ်လာပါမယ်။ + +နောက်ထပ်ပြဿနာတစ်ခုကိုတွေ့ရပါတယ်။ Review တစ်ခုစီမှာ column 5 ခုရှိတယ်၊ အချို့မှာ 3 ခု၊ အချို့မှာ 6 ခုရှိတယ်။ Dataset ကိုဘယ်လိုဖန်တီးထားတယ်ဆိုတာကြောင့်ဖြစ်ပါတယ်၊ ပြင်ဖို့ခက်ပါတယ်။ Phrase တစ်ခုစီရဲ့ frequency count ကိုရယူချင်ပေမယ့် review တစ်ခုစီမှာ order ကွဲပြားနေတဲ့အတွက် count မှားနိုင်ပါတယ်၊ hotel တစ်ခုမှာ deserve လုပ်ထားတဲ့ tag ကိုမရနိုင်ပါဘူး။ + +အဲဒီ order ကွဲပြားမှုကိုအကျိုးရှိအောင်အသုံးပြုပါမယ်၊ tag တစ်ခုစီမှာ multi-word phrase ဖြစ်ပြီး comma နဲ့ခွဲထားပါတယ်။ အလွယ်ဆုံးနည်းကတော့ ယာယီ column 6 ခုဖန်တီးပြီး tag တစ်ခုစီကို tag ရဲ့ order နဲ့ကိုက်ညီတဲ့ column ထဲထည့်ပါ။ အဲဒီနောက် column 6 ခုကို merge လုပ်ပြီး `value_counts()` method ကို run လုပ်ပါ။ Print လုပ်ပြီးရင် unique tag 2428 ခုရှိတယ်ဆိုတာတွေ့ရပါမယ်။ အောက်မှာ sample တစ်ခုကိုပေးထားပါတယ်: + +| Tag | Count | +| ------------------------------ | ------ | +| Leisure trip | 417778 | +| Submitted from a mobile device | 307640 | +| Couple | 252294 | +| Stayed 1 night | 193645 | +| Stayed 2 nights | 133937 | +| Solo traveler | 108545 | +| Stayed 3 nights | 95821 | +| Business trip | 82939 | +| Group | 65392 | +| Family with young children | 61015 | +| Stayed 4 nights | 47817 | +| Double Room | 35207 | +| Standard Double Room | 32248 | +| Superior Double Room | 31393 | +| Family with older children | 26349 | +| Deluxe Double Room | 24823 | +| Double or Twin Room | 22393 | +| Stayed 5 nights | 20845 | +| Standard Double or Twin Room | 17483 | +| Classic Double Room | 16989 | +| Superior Double or Twin Room | 13570 | +| 2 rooms | 12393 | + +`Submitted from a mobile device` လိုမျိုးအသုံးမဝင်တဲ့ tag တွေကိုဖယ်ရှားဖို့ smart ဖြစ်နိုင်ပါတယ်၊ ဒါပေမယ့် operation လုပ်ရတာမြန်လွန်းတဲ့အတွက် ထည့်ထားပြီး ignore လုပ်နိုင်ပါတယ်။ + +### နေထိုင်ခဲ့တဲ့ညအရေအတွက် tag တွေကိုဖယ်ရှားခြင်း + +Tag တွေကိုဖယ်ရှားခြင်းကအဆင့် ၁ ဖြစ်ပါတယ်၊ အစီအစဉ်မှာပါဝင်တဲ့ tag အရေအတွက်ကိုနည်းနည်းလျှော့ချနိုင်ပါတယ်။ သတိပြုပါ၊ dataset မှ tag တွေကိုဖျက်မပစ်ပါဘူး၊ review dataset မှာ count/keep လုပ်ဖို့အတွက်သာဖယ်ရှားပါ။ + +| Length of stay | Count | +| ---------------- | ------ | +| Stayed 1 night | 193645 | +| Stayed 2 nights | 133937 | +| Stayed 3 nights | 95821 | +| Stayed 4 nights | 47817 | +| Stayed 5 nights | 20845 | +| Stayed 6 nights | 9776 | +| Stayed 7 nights | 7399 | +| Stayed 8 nights | 2502 | +| Stayed 9 nights | 1293 | +| ... | ... | + +Room, suite, studio, apartment စသဖြင့်အခန်းအမျိုးအစားတွေကအများအားဖြင့်တူတူဖြစ်ပြီး dataset ရဲ့ရည်ရွယ်ချက်အတွက်မအရေးကြီးပါဘူး၊ အဲဒီအခန်းအမျိုးအစား tag တွေကိုဖယ်ရှားပါ။ + +| Type of room | Count | +| ----------------------------- | ----- | +| Double Room | 35207 | +| Standard Double Room | 32248 | +| Superior Double Room | 31393 | +| Deluxe Double Room | 24823 | +| Double or Twin Room | 22393 | +| Standard Double or Twin Room | 17483 | +| Classic Double Room | 16989 | +| Superior Double or Twin Room | 13570 | + +နောက်ဆုံးမှာတော့ delight ဖြစ်စရာကောင်းပါတယ် (process လုပ်ရတာအတော်လွယ်ကူပါတယ်)၊ အသုံးဝင်တဲ့ tag တွေကအောက်ပါအတိုင်းဖြစ်လာပါမယ်: + +| Tag | Count | +| --------------------------------------------- | ------ | +| Leisure trip | 417778 | +| Couple | 252294 | +| Solo traveler | 108545 | +| Business trip | 82939 | +| Group (combined with Travellers with friends) | 67535 | +| Family with young children | 61015 | +| Family with older children | 26349 | +| With a pet | 1405 | + +`Travellers with friends` ကို `Group` နဲ့တူတူဖြစ်တယ်လို့ဆိုနိုင်ပါတယ်၊ အဲဒီအတွက်အထက်မှာပေါင်းစပ်ထားပါတယ်။ Correct tag တွေကိုစစ်ဆေးဖို့ code က [Tags notebook](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) မှာပါဝင်ပါတယ်။ + +နောက်ဆုံးအဆင့်ကတော့ tag တစ်ခုစီအတွက် column အသစ်တွေဖန်တီးပါ။ Review row တစ်ခုစီမှာ `Tag` column ကအသစ်ဖန်တီးထားတဲ့ column တစ်ခုနဲ့ကိုက်ညီရင် 1 ထည့်ပါ၊ မကိုက်ညီရင် 0 ထည့်ပါ။ အဆုံးမှာတော့ hotel recommendation အတွက် အသုံးဝင်တဲ့အချက်အလက်တွေကိုရရှိပါမယ်၊ ဥပမာ - business vs leisure, pet နဲ့အတူလာတဲ့ hotel စသဖြင့်။ + +```python +# Process the Tags into new columns +# The file Hotel_Reviews_Tags.py, identifies the most important tags +# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends, +# Family with young children, Family with older children, With a pet +df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0) +df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0) +df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0) +df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0) +df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0) +df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0) +df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0) +df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0) + +``` + +### File ကိုသိမ်းဆည်းပါ + +နောက်ဆုံးမှာ dataset ကိုအသစ်နာမည်နဲ့သိမ်းဆည်းပါ။ + +```python +df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True) + +# Saving new data file with calculated columns +print("Saving results to Hotel_Reviews_Filtered.csv") +df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False) +``` + +## Sentiment Analysis လုပ်ဆောင်မှုများ + +နောက်ဆုံးအပိုင်းမှာ review column တွေကို sentiment analysis လုပ်ပြီးရလဒ်တွေကို dataset မှာသိမ်းဆည်းပါမယ်။ + +## လေ့ကျင့်ခန်း - filtered data ကို load နဲ့ save လုပ်ပါ + +အခုတော့နောက်ဆုံးအပိုင်းမှာသိမ်းဆည်းထားတဲ့ filtered dataset ကို load လုပ်ပါ၊ **original dataset ကိုမသုံးပါနဲ့**။ + +```python +import time +import pandas as pd +import nltk as nltk +from nltk.corpus import stopwords +from nltk.sentiment.vader import SentimentIntensityAnalyzer +nltk.download('vader_lexicon') + +# Load the filtered hotel reviews from CSV +df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv') + +# You code will be added here + + +# Finally remember to save the hotel reviews with new NLP data added +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False) +``` + +### Stop words ဖယ်ရှားခြင်း + +Negative နဲ့ Positive review column တွေမှာ Sentiment Analysis run လုပ်မယ်ဆိုရင် အချိန်အတော်ကြာနိုင်ပါတယ်။ စမ်းသပ်ထားတဲ့ laptop (CPU မြန်ဆန်တဲ့ device) မှာ sentiment library အမျိုးအစားပေါ်မူတည်ပြီး 12 - 14 မိနစ်ကြာပါတယ်။ အချိန်အတော်ကြာတဲ့အတွက် အချိန်လျှော့ချနိုင်မလားစဉ်းစားဖို့လိုပါတယ်။ + +Stop words (sentiment ကိုမပြောင်းလဲတဲ့ common English words) ကိုဖယ်ရှားခြင်းကပထမအဆင့်ဖြစ်ပါတယ်။ Stop words ကိုဖယ်ရှားခြင်းက sentiment analysis run လုပ်တဲ့အချိန်ကိုမြန်ဆန်စေပြီး၊ accuracy ကိုမလျော့ချပါဘူး (stop words တွေက sentiment ကိုမထိခိုက်ပေမယ့် analysis ကိုနှေးစေပါတယ်)။ + +အရှည်ဆုံး negative review က 395 words ရှိပါတယ်၊ Stop words ကိုဖယ်ရှားပြီးနောက်မှာတော့ 195 words ဖြစ်ပါတယ်။ + +Stop words ကိုဖယ်ရှားခြင်းကလည်းမြန်ဆန်တဲ့ operation ဖြစ်ပါတယ်၊ 515,000 rows ရှိတဲ့ review column 2 ခုမှာ stop words ကိုဖယ်ရှားဖို့ 3.3 seconds ကြာပါတယ်။ Device ရဲ့ CPU မြန်နှုန်း၊ RAM, SSD ရှိ/မရှိ၊ အခြား factor တွေကြောင့် အချိန်နည်းနည်းကွဲနိုင်ပါတယ်။ Operation ရဲ့အချိန်တိုမှုကြောင့် sentiment analysis အချိန်ကိုလျှော့ချနိုင်ရင်လုပ်ဖို့တန်ပါတယ်။ + +```python +from nltk.corpus import stopwords + +# Load the hotel reviews from CSV +df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv") + +# Remove stop words - can be slow for a lot of text! +# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches +# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends +start = time.time() +cache = set(stopwords.words("english")) +def remove_stopwords(review): + text = " ".join([word for word in review.split() if word not in cache]) + return text + +# Remove the stop words from both columns +df.Negative_Review = df.Negative_Review.apply(remove_stopwords) +df.Positive_Review = df.Positive_Review.apply(remove_stopwords) +``` + +### Sentiment analysis လုပ်ဆောင်ခြင်း + +အခုတော့ negative နဲ့ positive review column 2 ခုအတွက် sentiment analysis ကိုတွက်ချက်ပြီး၊ ရလဒ်ကို column အသစ် 2 ခုမှာသိမ်းဆည်းပါ။ Sentiment ကို reviewer ရဲ့ score နဲ့နှိုင်းယှဉ်ပါမယ်။ ဥပမာ - Negative review sentiment က 1 (အလွန် positive sentiment) ဖြစ်ပြီး Positive review sentiment က 1 ဖြစ်တယ်၊ Reviewer က hotel ကိုအနိမ့်ဆုံး score ပေးထားတယ်ဆိုရင် review text က score နဲ့မကိုက်ညီတာဖြစ်နိုင်ပါတယ်၊ ဒါမှမဟုတ် sentiment analyser က sentiment ကိုမှန်ကန်စွာမသိနိုင်တာဖြစ်နိုင်ပါတယ်။ Sentiment score တွေမှားနေတဲ့အချို့ကိုတွေ့ရနိုင်ပါတယ်၊ Sarcasm လိုမျိုးအခြေအနေတွေကြောင့်ဖြစ်နိုင်ပါတယ်၊ ဥပမာ - "Of course I LOVED sleeping in a room with no heating" ဆိုပြီး sarcasm ပြောထားတဲ့ review ကို sentiment analyser က positive sentiment လို့ထင်နိုင်ပါတယ်၊ ဒါပေမယ့်လူ့အမြ +NLTK သည် အမျိုးမျိုးသော စိတ်ခံစားမှု ခွဲခြားစနစ်များကို သင်ယူရန် ပံ့ပိုးပေးပြီး၊ သင်သည် အဲဒီစနစ်များကို အစားထိုးအသုံးပြု၍ စိတ်ခံစားမှု ခွဲခြားမှု၏ တိကျမှုကို ပိုမိုကောင်းမွန်သို့မဟုတ် ပိုမိုနည်းပါးသည်ကို ကြည့်ရှုနိုင်သည်။ ဒီနေရာမှာ VADER စိတ်ခံစားမှု ခွဲခြားမှုကို အသုံးပြုထားသည်။ + +> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014. + +```python +from nltk.sentiment.vader import SentimentIntensityAnalyzer + +# Create the vader sentiment analyser (there are others in NLTK you can try too) +vader_sentiment = SentimentIntensityAnalyzer() +# Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014. + +# There are 3 possibilities of input for a review: +# It could be "No Negative", in which case, return 0 +# It could be "No Positive", in which case, return 0 +# It could be a review, in which case calculate the sentiment +def calc_sentiment(review): + if review == "No Negative" or review == "No Positive": + return 0 + return vader_sentiment.polarity_scores(review)["compound"] +``` + +သင်၏ အစီအစဉ်တွင် စိတ်ခံစားမှုကို တွက်ချက်ရန် ပြင်ဆင်ပြီးနောက်၊ သင်သည် အောက်ပါအတိုင်း တစ်ခုချင်းစီကို အသုံးပြုနိုင်သည်- + +```python +# Add a negative sentiment and positive sentiment column +print("Calculating sentiment columns for both positive and negative reviews") +start = time.time() +df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment) +df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment) +end = time.time() +print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds") +``` + +ဤလုပ်ငန်းစဉ်သည် ကျွန်ုပ်၏ ကွန်ပျူတာတွင် ၁၂၀ စက္ကန့်ခန့် ကြာမြင့်သည်၊ သို့သော် ကွန်ပျူတာတစ်ခုချင်းစီတွင် ကွဲပြားနိုင်သည်။ ရလဒ်များကို ပုံနှိပ်ပြီး စိတ်ခံစားမှုသည် သုံးသပ်ချက်နှင့် ကိုက်ညီမညီကြည့်လိုပါက- + +```python +df = df.sort_values(by=["Negative_Sentiment"], ascending=True) +print(df[["Negative_Review", "Negative_Sentiment"]]) +df = df.sort_values(by=["Positive_Sentiment"], ascending=True) +print(df[["Positive_Review", "Positive_Sentiment"]]) +``` + +အခန်းစဉ်တွင် အသုံးပြုရန် မတိုင်မီ ဖိုင်ကို သိမ်းဆည်းရန် အရေးကြီးသည်။ သင်၏ ကော်လံအသစ်များကို လူသားများအတွက် အဆင်ပြေစေရန် ပြန်လည်စီစဉ်ရန်လည်း စဉ်းစားသင့်သည် (ဓာတ်ပုံဆိုင်ရာ ပြောင်းလဲမှုဖြစ်သည်)။ + +```python +# Reorder the columns (This is cosmetic, but to make it easier to explore the data later) +df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1) + +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False) +``` + +သင်သည် [အာနိသင်မှတ်စု](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) အားလုံးကို အပြည့်အဝ လုပ်ဆောင်သင့်သည် (Hotel_Reviews_Filtered.csv ဖိုင်ကို ဖန်တီးရန် [သင်၏ စစ်ထုတ်မှတ်စု](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) ကို လုပ်ဆောင်ပြီးနောက်)။ + +ပြန်လည်သုံးသပ်ရန် အဆင့်များမှာ- + +1. မူရင်းဒေတာဖိုင် **Hotel_Reviews.csv** ကို [စူးစမ်းမှတ်စု](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb) ဖြင့် ယခင်သင်ခန်းစာတွင် စူးစမ်းခဲ့သည်။ +2. Hotel_Reviews.csv ကို [စစ်ထုတ်မှတ်စု](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) ဖြင့် စစ်ထုတ်ပြီး **Hotel_Reviews_Filtered.csv** ဖြစ်လာသည်။ +3. Hotel_Reviews_Filtered.csv ကို [စိတ်ခံစားမှု ခွဲခြားမှတ်စု](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) ဖြင့် လုပ်ဆောင်ပြီး **Hotel_Reviews_NLP.csv** ဖြစ်လာသည်။ +4. Hotel_Reviews_NLP.csv ကို အောက်ပါ NLP စိန်ခေါ်မှုတွင် အသုံးပြုပါ။ + +### နိဂုံးချုပ် + +သင်စတင်ခဲ့သောအခါ၊ သင်သည် ကော်လံများနှင့် ဒေတာများပါရှိသော ဒေတာဖိုင်တစ်ခု ရှိခဲ့သည်၊ သို့သော် အားလုံးကို အတည်ပြုနိုင်ခြင်း သို့မဟုတ် အသုံးပြုနိုင်ခြင်း မရှိခဲ့ပါ။ သင်သည် ဒေတာကို စူးစမ်းခဲ့ပြီး၊ မလိုအပ်သောအရာများကို ဖယ်ရှားခဲ့ပြီး၊ tag များကို အသုံးဝင်သောအရာများအဖြစ် ပြောင်းလဲခဲ့ပြီး၊ သင်၏ကိုယ်ပိုင် ပျမ်းမျှချက်များကို တွက်ချက်ခဲ့ပြီး၊ စိတ်ခံစားမှု ကော်လံများကို ထည့်သွင်းခဲ့ပြီး၊ သဘာဝစာသားကို အလုပ်လုပ်စေခြင်းနှင့် ပတ်သက်သော စိတ်ဝင်စားဖွယ် အရာများကို သင်ယူခဲ့မည်ဟု မျှော်လင့်ပါသည်။ + +## [သင်ခန်းစာပြီးနောက် မေးခွန်း](https://ff-quizzes.netlify.app/en/ml/) + +## စိန်ခေါ်မှု + +ယခု သင်၏ ဒေတာဖိုင်ကို စိတ်ခံစားမှုအတွက် ခွဲခြားပြီးဖြစ်သောကြောင့်၊ သင်သည် သင်ယူခဲ့သော မဟာဗျူဟာများ (တစ်ခုပြီးတစ်ခု ခွဲခြားခြင်း၊ ဥပမာအားဖြင့်) ကို အသုံးပြု၍ စိတ်ခံစားမှုနှင့် ပတ်သက်သော ပုံစံများကို သတ်မှတ်နိုင်မည်လား ကြိုးစားပါ။ + +## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +[ဒီ Learn module](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) ကို လေ့လာပြီး စိတ်ခံစားမှုကို စူးစမ်းရန် အခြားကိရိယာများကို အသုံးပြုပါ။ + +## လုပ်ငန်း + +[အခြားဒေတာဖိုင်ကို ကြိုးစားပါ](assignment.md) + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာရှိသော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/5-Hotel-Reviews-2/assignment.md b/translations/my/6-NLP/5-Hotel-Reviews-2/assignment.md new file mode 100644 index 00000000..b1324417 --- /dev/null +++ b/translations/my/6-NLP/5-Hotel-Reviews-2/assignment.md @@ -0,0 +1,25 @@ + +# အခြားသော ဒေတာစုကို စမ်းကြည့်ပါ + +## လမ်းညွှန်ချက်များ + +NLTK ကို အသုံးပြု၍ စိတ်ခံစားမှုကို စာသားတွင် သတ်မှတ်ပေးနိုင်သည်ကို သင်လေ့လာပြီးပါပြီ။ အခုတော့ အခြားသော ဒေတာစုကို စမ်းကြည့်ပါ။ ဒေတာကို အနည်းငယ် ပြင်ဆင်ဖို့ လိုအပ်နိုင်ပါသည်၊ ထို့ကြောင့် notebook တစ်ခု ဖန်တီးပြီး သင်၏ အတွေးအခေါ်များကို မှတ်တမ်းတင်ပါ။ သင်ဘာတွေ ရှာဖွေတွေ့ရှိပါသလဲ? + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှု လိုအပ်သော | +| --------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ---------------------- | +| | notebook နှင့် ဒေတာစုကို ပြည့်စုံစွာ တင်ပြပြီး စိတ်ခံစားမှုကို သတ်မှတ်ပေးပုံကို ရှင်းလင်းစွာ ရေးသားထားသည် | notebook တွင် ရှင်းလင်းမှု မလုံလောက်ပါ | notebook တွင် အမှားများ ရှိပါသည် | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md b/translations/my/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md new file mode 100644 index 00000000..e7dcf816 --- /dev/null +++ b/translations/my/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်ပါသည်။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/5-Hotel-Reviews-2/solution/R/README.md b/translations/my/6-NLP/5-Hotel-Reviews-2/solution/R/README.md new file mode 100644 index 00000000..3723d7dc --- /dev/null +++ b/translations/my/6-NLP/5-Hotel-Reviews-2/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ပါ။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/README.md b/translations/my/6-NLP/README.md new file mode 100644 index 00000000..cb958739 --- /dev/null +++ b/translations/my/6-NLP/README.md @@ -0,0 +1,38 @@ + +# သဘာဝဘာသာစကားကို အဆင့်ဆင့်လေ့လာခြင်း + +သဘာဝဘာသာစကားကို လေ့လာခြင်း (NLP) ဆိုသည်မှာ ကွန်ပျူတာပရိုဂရမ်တစ်ခုသည် လူသားများ၏ စကားပြောနှင့် ရေးသားထားသော ဘာသာစကားကို နားလည်နိုင်စွမ်းဖြစ်သည်။ ၎င်းကို သဘာဝဘာသာစကားဟု ခေါ်ဆိုသည်။ ၎င်းသည် အတုအကျင့်တု (AI) ၏ အစိတ်အပိုင်းတစ်ခုဖြစ်သည်။ NLP သည် ၅၀ နှစ်ကျော်ကြာ ရှိပြီး ဘာသာဗေဒနယ်ပယ်မှ အမြစ်များရှိသည်။ အနုပညာနယ်ပယ်တစ်ခုလုံးသည် စက်များကို လူသားဘာသာစကားကို နားလည်စေပြီး အလုပ်များကို ဆောင်ရွက်နိုင်စေရန် ရည်ရွယ်ထားသည်။ ၎င်းကို စာလုံးပေါင်းစစ်ခြင်း သို့မဟုတ် စက်ဖြင့် ဘာသာပြန်ခြင်းကဲ့သို့သော အလုပ်များတွင် အသုံးပြုနိုင်သည်။ ၎င်းသည် ဆေးဘက်ဆိုင်ရာ သုတေသန၊ ရှာဖွေမှုအင်ဂျင်များနှင့် စီးပွားရေးသတင်းအချက်အလက်များအပါအဝင် နယ်ပယ်များစွာတွင် အမှန်တကယ်အသုံးဝင်သော လက်တွေ့အသုံးချမှုများရှိသည်။ + +## ဒေသဆိုင်ရာအကြောင်းအရာ: ဥရောပဘာသာစကားများ၊ စာပေများနှင့် ဥရောပ၏ romantic hotels ❤️ + +ဒီသင်ခန်းစာအပိုင်းတွင် စက်လေ့လာမှု၏ အကျယ်အပြန့်အသုံးပြုမှုများထဲမှ တစ်ခုဖြစ်သော သဘာဝဘာသာစကားကို လေ့လာခြင်း (NLP) ကို မိတ်ဆက်ပေးပါမည်။ ကွန်ပျူတာဘာသာဗေဒမှ ဆင်းသက်လာသော ဒီအတုအကျင့်တုအမျိုးအစားသည် လူသားများနှင့် စက်များအကြား အသံသို့မဟုတ် စာသားဆက်သွယ်မှုမှတစ်ဆင့် တံတားတစ်ခုဖြစ်သည်။ + +ဒီသင်ခန်းစာများတွင် စကားပြော bot များကို တည်ဆောက်ခြင်းဖြင့် NLP ၏ အခြေခံကို လေ့လာမည်ဖြစ်ပြီး စက်လေ့လာမှုသည် ဒီစကားပြောများကို ပိုမို 'smart' ဖြစ်စေရာတွင် ဘယ်လိုအထောက်အကူပြုသည်ကို သိရှိရမည်။ သင် Jane Austen ရဲ့ ၁၈၁၃ ခုနှစ်တွင် ထုတ်ဝေခဲ့သော **Pride and Prejudice** စာအုပ်မှ Elizabeth Bennett နှင့် Mr. Darcy နှင့် အတိတ်ကို ပြန်လည်ခရီးသွားပြီး စကားပြောမည်။ ထို့နောက် သင်၏ အသိပညာကို hotel reviews မှတစ်ဆင့် စိတ်ခံစားမှုခွဲခြားခြင်းကို လေ့လာခြင်းဖြင့် တိုးတက်စေပါမည်။ + +![Pride and Prejudice စာအုပ်နှင့် လက်ဖက်ရည်](../../../6-NLP/images/p&p.jpg) +> ဓာတ်ပုံကို Elaine Howlin မှ Unsplash တွင် ရိုက်ထားသည် + +## သင်ခန်းစာများ + +1. [သဘာဝဘာသာစကားကို လေ့လာခြင်းအကြောင်းမိတ်ဆက်](1-Introduction-to-NLP/README.md) +2. [NLP အလုပ်များနှင့် နည်းလမ်းများ](2-Tasks/README.md) +3. [စက်လေ့လာမှုဖြင့် ဘာသာပြန်ခြင်းနှင့် စိတ်ခံစားမှုခွဲခြားခြင်း](3-Translation-Sentiment/README.md) +4. [သင့်ဒေတာကို ပြင်ဆင်ခြင်း](4-Hotel-Reviews-1/README.md) +5. [NLTK ဖြင့် စိတ်ခံစားမှုခွဲခြားခြင်း](5-Hotel-Reviews-2/README.md) + +## အကျိုးတူ + +ဒီသဘာဝဘာသာစကားကို လေ့လာခြင်း သင်ခန်းစာများကို ☕ ဖြင့် [Stephen Howell](https://twitter.com/Howell_MSFT) မှ ရေးသားထားသည် + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/6-NLP/data/README.md b/translations/my/6-NLP/data/README.md new file mode 100644 index 00000000..1e97b1f3 --- /dev/null +++ b/translations/my/6-NLP/data/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပါယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/7-TimeSeries/1-Introduction/README.md b/translations/my/7-TimeSeries/1-Introduction/README.md new file mode 100644 index 00000000..6c9fc0ab --- /dev/null +++ b/translations/my/7-TimeSeries/1-Introduction/README.md @@ -0,0 +1,193 @@ + +# အချိန်စီးဆင်းမှုခန့်မှန်းခြေကိုမိတ်ဆက်ခြင်း + +![အချိန်စီးဆင်းမှုအကျဉ်းချုပ်ကို Sketchnote](../../../../sketchnotes/ml-timeseries.png) + +> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) + +ဒီသင်ခန်းစာနဲ့နောက်ထပ်သင်ခန်းစာမှာ ML သိပ္ပံပညာရှင်တစ်ဦးရဲ့အရေးပါတဲ့ကျွမ်းကျင်မှုတစ်ခုဖြစ်တဲ့ အချိန်စီးဆင်းမှုခန့်မှန်းခြေကိုလေ့လာပါမယ်။ ဒါဟာနည်းနည်းနဲ့နည်းနည်းနောက်ကျကျသိပ်မလူသိများတဲ့အကြောင်းအရာတစ်ခုဖြစ်ပါတယ်။ အချိန်စီးဆင်းမှုခန့်မှန်းခြေဟာ 'ခရစ်စတယ်ဘောလ်' တစ်ခုလိုမျိုးဖြစ်ပြီး၊ ဈေးနှုန်းလိုမျိုးသော variable ရဲ့အတိတ်လုပ်ဆောင်မှုအပေါ်အခြေခံပြီး၊ ၎င်းရဲ့အနာဂတ်တန်ဖိုးကိုခန့်မှန်းနိုင်ပါတယ်။ + +[![အချိန်စီးဆင်းမှုခန့်မှန်းခြေကိုမိတ်ဆက်ခြင်း](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "Introduction to time series forecasting") + +> 🎥 အပေါ်ကပုံကိုနှိပ်ပြီး အချိန်စီးဆင်းမှုခန့်မှန်းခြေကိုမိတ်ဆက်တဲ့ဗီဒီယိုကိုကြည့်ပါ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +ဈေးနှုန်းသတ်မှတ်ခြင်း၊ အရောင်းအဝယ်စာရင်းနှင့်ထောက်ပံ့ရေးကိစ္စများကိုဖြေရှင်းရာတွင်တိုက်ရိုက်အသုံးချနိုင်သောကြောင့်၊ အချိန်စီးဆင်းမှုခန့်မှန်းခြေဟာစီးပွားရေးလုပ်ငန်းအတွက်တန်ဖိုးရှိတဲ့နယ်ပယ်တစ်ခုဖြစ်ပါတယ်။ အနာဂတ်လုပ်ဆောင်မှုကိုပိုမိုကောင်းမွန်စွာခန့်မှန်းနိုင်ဖို့ insights ရရှိရန်အတွက် deep learning နည်းလမ်းများကိုအသုံးပြုလာကြပေမယ့်၊ အချိန်စီးဆင်းမှုခန့်မှန်းခြေဟာ classic ML နည်းလမ်းများကနေတစ်ဆင့်အများကြီးသိရှိထားတဲ့နယ်ပယ်တစ်ခုဖြစ်နေဆဲပါ။ + +> Penn State ရဲ့အသုံးဝင်တဲ့အချိန်စီးဆင်းမှုသင်ခန်းစာကို [ဒီမှာ](https://online.stat.psu.edu/stat510/lesson/1) ရှာဖွေပါ + +## မိတ်ဆက် + +သင်ဟာ smart parking meters တစ်ခုစီကိုထိန်းသိမ်းပြီး၊ ၎င်းတို့ကိုဘယ်အချိန်မှာအသုံးပြုပြီး၊ ဘယ်လောက်ကြာကြာအသုံးပြုခဲ့တယ်ဆိုတာကိုအချိန်အလိုက် data ပေးတဲ့ array တစ်ခုရှိတယ်လို့ဆိုပါစို့။ + +> အတိတ်လုပ်ဆောင်မှုအပေါ်အခြေခံပြီး၊ supply နဲ့ demand ရဲ့ဥပဒေများအရ meter ရဲ့အနာဂတ်တန်ဖိုးကိုခန့်မှန်းနိုင်မယ်ဆိုရင်ရောဘယ်လိုဖြစ်မလဲ? + +သင့်ရည်မှန်းချက်ကိုရရှိဖို့အတွက်ဘယ်အချိန်မှာလုပ်ဆောင်ရမလဲဆိုတာကိုတိကျစွာခန့်မှန်းခြေခြင်းဟာ အချိန်စီးဆင်းမှုခန့်မှန်းခြေကဖြေရှင်းနိုင်တဲ့အခက်အခဲတစ်ခုဖြစ်ပါတယ်။ လူတွေက parking spot ရှာနေရင်းအလုပ်များတဲ့အချိန်မှာပိုကြေးပေးရတာကိုမကြိုက်ကြပေမယ့်၊ လမ်းတွေသန့်စင်ဖို့အတွက်ဝင်ငွေထုတ်ယူဖို့အကောင်းဆုံးနည်းလမ်းတစ်ခုဖြစ်နိုင်ပါတယ်! + +အချိန်စီးဆင်းမှု algorithm အမျိုးအစားတစ်ချို့ကိုလေ့လာပြီး၊ data ကိုသန့်စင်ပြီးပြင်ဆင်ဖို့ notebook တစ်ခုစတင်ကြပါစို့။ သင်ခန့်မှန်းမယ့် data ဟာ GEFCom2014 forecasting competition ကနေယူထားတာဖြစ်ပြီး၊ 2012 မှ 2014 အထိ 3 နှစ်တာအတွင်း hourly electricity load နဲ့ temperature values ပါဝင်ပါတယ်။ electricity load နဲ့ temperature ရဲ့အတိတ် pattern တွေကိုအခြေခံပြီး၊ electricity load ရဲ့အနာဂတ်တန်ဖိုးကိုခန့်မှန်းနိုင်ပါတယ်။ + +ဒီဥပမာမှာ၊ historical load data ကိုသာအသုံးပြုပြီး၊ တစ်ခုတည်းသောအချိန်အဆင့်ကိုခန့်မှန်းဖို့လေ့လာပါမယ်။ သို့သော်စတင်မလုပ်ခင်မှာ၊ နောက်ကွယ်မှာဖြစ်နေတဲ့အရာတွေကိုနားလည်ထားရင်အသုံးဝင်ပါတယ်။ + +## အဓိပ္ပါယ်အချို့ + +'အချိန်စီးဆင်းမှု' ဆိုတဲ့စကားလုံးကိုတွေ့ရင်၊ ၎င်းကိုအခြား context အမျိုးမျိုးမှာအသုံးပြုပုံကိုနားလည်ဖို့လိုပါတယ်။ + +🎓 **အချိန်စီးဆင်းမှု** + +ဂဏန်းသိပ္ပံမှာ "အချိန်စီးဆင်းမှုဆိုတာ အချိန်အလိုက်စဉ်ဆက်မပြတ် data points တွေကို index လုပ်ထားတာ (သို့မဟုတ် စာရင်းပြုလုပ်ထားတာ သို့မဟုတ် graph ပုံဖော်ထားတာ) ဖြစ်ပါတယ်။ အများဆုံးအချိန်စီးဆင်းမှုဟာ အချိန်အလိုက်တန်းစီထားတဲ့အဆက်မပြတ် data points တွေဖြစ်ပါတယ်။" အချိန်စီးဆင်းမှုရဲ့ဥပမာတစ်ခုက [Dow Jones Industrial Average](https://wikipedia.org/wiki/Time_series) ရဲ့နေ့စဉ်ပိတ်ချိန်တန်ဖိုးဖြစ်ပါတယ်။ အချိန်စီးဆင်းမှု plot တွေကိုအသုံးပြုခြင်းနဲ့ စာရင်းဇယားပုံစံကို signal processing, မိုးလေဝသခန့်မှန်းခြေ, ငလျင်ခန့်မှန်းခြေ, နဲ့အခြားအခွင့်အရေးတွေမှာတွေ့ရပါတယ်။ + +🎓 **အချိန်စီးဆင်းမှုခန့်မှန်းခြေ** + +အချိန်စီးဆင်းမှုခန့်မှန်းခြေဟာ အတိတ် data ရဲ့ pattern တွေကိုအခြေခံပြီး model တစ်ခုကိုအသုံးပြုပြီးအနာဂတ်တန်ဖိုးကိုခန့်မှန်းခြင်းဖြစ်ပါတယ်။ Regression models တွေကိုအသုံးပြုပြီးအချိန်စီးဆင်းမှု data ကိုလေ့လာနိုင်ပေမယ့်၊ time indices တွေကို x variables အနေနဲ့ plot ပေါ်မှာထားပြီး၊ ဒီ data ကိုအထူး model အမျိုးအစားတွေကိုအသုံးပြုပြီးလေ့လာရတာပိုကောင်းပါတယ်။ + +အချိန်စီးဆင်းမှု data ဟာတန်းစီထားတဲ့ observation တွေဖြစ်ပြီး၊ linear regression နဲ့လေ့လာနိုင်တဲ့ data မဟုတ်ပါဘူး။ အများဆုံးအသုံးပြုတဲ့ model တစ်ခုက ARIMA ဖြစ်ပြီး၊ "Autoregressive Integrated Moving Average" ဆိုတဲ့အတိုကောက်ဖြစ်ပါတယ်။ + +[ARIMA models](https://online.stat.psu.edu/stat510/lesson/1/1.1) "series ရဲ့လက်ရှိတန်ဖိုးကို အတိတ်တန်ဖိုးတွေနဲ့ အတိတ်ခန့်မှန်းမှု error တွေကိုဆက်စပ်ထားပါတယ်။" ARIMA models တွေဟာ time-domain data ကိုလေ့လာဖို့အကောင်းဆုံးဖြစ်ပြီး၊ data ဟာအချိန်အလိုက်တန်းစီထားပါတယ်။ + +> ARIMA models အမျိုးအစားအများကြီးရှိပြီး၊ [ဒီမှာ](https://people.duke.edu/~rnau/411arim.htm) လေ့လာနိုင်ပါတယ်။ နောက်ထပ်သင်ခန်းစာမှာ ARIMA model တစ်ခုကိုတည်ဆောက်မယ်။ + +နောက်ထပ်သင်ခန်းစာမှာ [Univariate Time Series](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm) ကိုအသုံးပြုပြီး ARIMA model တစ်ခုကိုတည်ဆောက်ပါမယ်။ Univariate Time Series ဟာတစ်ခုတည်းသော variable ကိုအခြေခံပြီး၊ အချိန်အလိုက်တန်ဖိုးပြောင်းလဲမှုကိုလေ့လာပါတယ်။ ဒီ data ရဲ့ဥပမာတစ်ခုက Mauna Loa Observatory မှာ monthly CO2 concentration ကိုမှတ်တမ်းတင်ထားတဲ့ [ဒီ dataset](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) ဖြစ်ပါတယ်။ + +| CO2 | YearMonth | Year | Month | +| :----: | :-------: | :---: | :---: | +| 330.62 | 1975.04 | 1975 | 1 | +| 331.40 | 1975.13 | 1975 | 2 | +| 331.87 | 1975.21 | 1975 | 3 | +| 333.18 | 1975.29 | 1975 | 4 | +| 333.92 | 1975.38 | 1975 | 5 | +| 333.43 | 1975.46 | 1975 | 6 | +| 331.85 | 1975.54 | 1975 | 7 | +| 330.01 | 1975.63 | 1975 | 8 | +| 328.51 | 1975.71 | 1975 | 9 | +| 328.41 | 1975.79 | 1975 | 10 | +| 329.25 | 1975.88 | 1975 | 11 | +| 330.97 | 1975.96 | 1975 | 12 | + +✅ ဒီ dataset မှာအချိန်အလိုက်ပြောင်းလဲနေတဲ့ variable ကိုဖော်ထုတ်ပါ + +## အချိန်စီးဆင်းမှု data ရဲ့ဂုဏ်သတ္တိများကိုစဉ်းစားရန် + +အချိန်စီးဆင်းမှု data ကိုကြည့်မယ်ဆိုရင်၊ [အချို့သောဂုဏ်သတ္တိများ](https://online.stat.psu.edu/stat510/lesson/1/1.1) ရှိနေနိုင်ပြီး၊ pattern တွေကိုပိုမိုနားလည်နိုင်ဖို့အတွက် offset လုပ်ဖို့ statistical techniques တစ်ချို့ကိုအသုံးပြုရပါမယ်။ + +ဒီအချက်အလက်တွေကိုနားလည်ဖို့လိုတဲ့အဓိက concept တွေက: + +🎓 **Trends** + +Trend တွေဟာအချိန်အလိုက်တိုးတက်မှုနဲ့ကျဆင်းမှုတွေကိုတိုင်းတာနိုင်ပါတယ်။ [ပိုမိုလေ့လာရန်](https://machinelearningmastery.com/time-series-trends-in-python) + +🎓 **[Seasonality](https://machinelearningmastery.com/time-series-seasonality-with-python/)** + +Seasonality ဆိုတာပုံမှန်အချိန်ကာလအတွင်းဖြစ်ပေါ်တဲ့အတက်အကျတွေကိုဆိုလိုပါတယ်။ ဥပမာအားဖြင့် အရောင်းအဝယ်ပုံစံတွေကိုသက်ရောက်စေတဲ့ပွဲတော်ကာလတွေ။ + +🎓 **Outliers** + +Outliers ဆိုတာ data ရဲ့ပုံမှန် variance ကနေဝေးနေတဲ့ data point တွေဖြစ်ပါတယ်။ + +🎓 **Long-run cycle** + +Seasonality ကိုမထည့်သွင်းပဲ၊ data ဟာအချိန်ကြာမြင့်တဲ့ cycle ကိုပြသနိုင်ပါတယ်။ + +🎓 **Constant variance** + +အချိန်အလိုက် data တစ်ချို့ဟာ constant fluctuations ကိုပြသနိုင်ပါတယ်။ + +🎓 **Abrupt changes** + +Data ဟာရုတ်တရက်ပြောင်းလဲမှုကိုပြသနိုင်ပြီး၊ နောက်ထပ် analysis လိုအပ်နိုင်ပါတယ်။ + +✅ [ဒီဥပမာ plot](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) ကိုကြည့်ပြီး၊ အထက်မှာဖော်ပြထားတဲ့ဂုဏ်သတ္တိတွေကိုရှာဖွေပါ။ + +![In-game currency spend](../../../../7-TimeSeries/1-Introduction/images/currency.png) + +## လေ့ကျင့်ခန်း - power usage data ကိုစတင်ခြင်း + +အတိတ် usage ကိုအခြေခံပြီး၊ အနာဂတ် power usage ကိုခန့်မှန်းမယ့်အချိန်စီးဆင်းမှု model တစ်ခုကိုစတင်ဖန်တီးပါ။ + +> ဒီဥပမာရဲ့ data ဟာ GEFCom2014 forecasting competition ကနေယူထားတာဖြစ်ပြီး၊ 2012 မှ 2014 အထိ 3 နှစ်တာအတွင်း hourly electricity load နဲ့ temperature values ပါဝင်ပါတယ်။ +> +> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli and Rob J. Hyndman, "Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016. + +1. ဒီသင်ခန်းစာရဲ့ `working` folder မှာ _notebook.ipynb_ ဖိုင်ကိုဖွင့်ပါ။ Data ကို load နဲ့ visualize လုပ်ဖို့လိုအပ်တဲ့ libraries တွေကိုထည့်ပါ။ + + ```python + import os + import matplotlib.pyplot as plt + from common.utils import load_data + %matplotlib inline + ``` + + သင့် environment ကို set up လုပ်ပြီး၊ data ကို download လုပ်ဖို့ `common` folder ထဲက files တွေကိုအသုံးပြုနေပါတယ်။ + +2. နောက်တစ်ဆင့်မှာ၊ `load_data()` နဲ့ `head()` ကိုခေါ်ပြီး data ကို dataframe အနေနဲ့ကြည့်ပါ။ + + ```python + data_dir = './data' + energy = load_data(data_dir)[['load']] + energy.head() + ``` + + သင့်မှာ date နဲ့ load ကိုကိုယ်စားပြုတဲ့ column နှစ်ခုရှိပါတယ်။ + + | | load | + | :-----------------: | :----: | + | 2012-01-01 00:00:00 | 2698.0 | + | 2012-01-01 01:00:00 | 2558.0 | + | 2012-01-01 02:00:00 | 2444.0 | + | 2012-01-01 03:00:00 | 2402.0 | + | 2012-01-01 04:00:00 | 2403.0 | + +3. အခုတော့ data ကို `plot()` ကိုခေါ်ပြီး plot လုပ်ပါ။ + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![energy plot](../../../../7-TimeSeries/1-Introduction/images/energy-plot.png) + +4. 2014 ခုနှစ် ဇူလိုင်လပထမအပတ်ကို plot လုပ်ပါ။ `energy` ကို `[from date]: [to date]` ပုံစံအနေနဲ့ input ပေးပါ။ + + ```python + energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![july](../../../../7-TimeSeries/1-Introduction/images/july-2014.png) + + အလှပဆုံး plot တစ်ခု! ဒီ plot တွေကိုကြည့်ပြီး၊ အထက်မှာဖော်ပြထားတဲ့ဂုဏ်သတ္တိတွေကိုရှာဖွေပါ။ Data ကို visualize လုပ်ခြင်းကနေဘာတွေကိုသုံးသပ်နိုင်မလဲ? + +နောက်ထပ်သင်ခန်းစာမှာ ARIMA model တစ်ခုကိုဖန်တီးပြီး forecast လုပ်ပါမယ်။ + +--- + +## 🚀Challenge + +အချိန်စီးဆင်းမှုခန့်မှန်းခြေကအကျိုးရှိမယ့်စက်မှုလုပ်ငန်းနဲ့နယ်ပယ်တွေကိုစာရင်းပြုစုပါ။ အနုပညာ၊ စီးပွားရေးသိပ္ပံ (Econometrics)၊ သဘာဝပတ်ဝန်းကျင် (Ecology)၊ လက်လီရောင်းဝယ်ရေး၊ စက်မှုလုပ်ငန်း၊ ငွေကြေးနယ်ပယ်တွေမှာဒီနည်းလမ်းတွေကိုအသုံးချနိုင်မယ့် application တွေကိုစဉ်းစားနိုင်ပါသလား? + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Review & Self Study + +ဒီမှာမဖော်ပြထားပေမယ့်၊ neural networks တွေကိုအချိန်စီးဆင်းမှုခန့်မှန်းခြေ classic နည်းလမ်းတွေကိုတိုးတက်စေဖို့ sometimes အသုံးပြုပါတယ်။ [ဒီဆောင်းပါး](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412) မှာပိုမိုလေ့လာပါ။ + +## Assignment + +[အချိန်စီးဆင်းမှု data တွေကိုပိုမို visualize လုပ်ပါ](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆောင်ရွက်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/7-TimeSeries/1-Introduction/assignment.md b/translations/my/7-TimeSeries/1-Introduction/assignment.md new file mode 100644 index 00000000..06002d7c --- /dev/null +++ b/translations/my/7-TimeSeries/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# အချိန်စီးရီးများကို နောက်ထပ်မြင်ကွင်းကျယ်စေပါ + +## လမ်းညွှန်ချက်များ + +သင်သည် အချိန်စီးရီးခန့်မှန်းမှု (Time Series Forecasting) အကြောင်းကို သင်ယူရန် စတင်ပြီးဖြစ်သည်။ အချိန်စီးရီးခန့်မှန်းမှုအတွက် အထူးမော်ဒယ်တစ်ခုလိုအပ်သည့် ဒေတာအမျိုးအစားကို ကြည့်ရှုခဲ့ပြီးဖြစ်သည်။ သင်သည် စွမ်းအင်ဆိုင်ရာ ဒေတာအချို့ကို မြင်ကွင်းကျယ်စေခဲ့ပါပြီ။ ယခုအခါ အချိန်စီးရီးခန့်မှန်းမှုမှ အကျိုးရှိမည့် အခြားဒေတာများကို ရှာဖွေကြည့်ပါ။ ဥပမာသုံးခု (ဥပမာအားဖြင့် [Kaggle](https://kaggle.com) နှင့် [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)) ကို ရှာဖွေပြီး၊ ၎င်းတို့ကို မြင်ကွင်းကျယ်စေသော notebook တစ်ခု ဖန်တီးပါ။ ၎င်းတို့တွင် ရှိနိုင်သည့် အထူးလက္ခဏာများ (ဥပမာ - ရာသီဥတုဆိုင်ရာ လက္ခဏာများ၊ ရုတ်တရက်ပြောင်းလဲမှုများ၊ သို့မဟုတ် အခြားအဆင့်ဆင့်လမ်းကြောင်းများ) ကို notebook တွင် မှတ်သားပါ။ + +## အကဲဖြတ်စံနှုန်း + +| စံနှုန်း | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| -------- | ------------------------------------------------------ | ---------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| | Notebook တွင် ဒေတာစုများ သုံးခုကို ရှင်းပြထားပြီး ရှုထောင့်ဖော်ပြထားသည် | Notebook တွင် ဒေတာစုများ နှစ်ခုကို ရှင်းပြထားပြီး ရှုထောင့်ဖော်ပြထားသည် | Notebook တွင် ဒေတာစုအနည်းငယ်သာ ရှင်းပြထားသို့မဟုတ် ဖော်ပြထားသော ဒေတာများ မလုံလောက်ပါ | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/7-TimeSeries/1-Introduction/solution/Julia/README.md b/translations/my/7-TimeSeries/1-Introduction/solution/Julia/README.md new file mode 100644 index 00000000..4b1e4341 --- /dev/null +++ b/translations/my/7-TimeSeries/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူရင်းဘာသာစကားဖြင့် အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/7-TimeSeries/1-Introduction/solution/R/README.md b/translations/my/7-TimeSeries/1-Introduction/solution/R/README.md new file mode 100644 index 00000000..04b6fc3a --- /dev/null +++ b/translations/my/7-TimeSeries/1-Introduction/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သိရှိထားပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များ၏ ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/7-TimeSeries/2-ARIMA/README.md b/translations/my/7-TimeSeries/2-ARIMA/README.md new file mode 100644 index 00000000..5a474cce --- /dev/null +++ b/translations/my/7-TimeSeries/2-ARIMA/README.md @@ -0,0 +1,310 @@ + +# ARIMA ဖြင့် အချိန်စီးရီးခန့်မှန်းခြေ + +ယခင်သင်ခန်းစာတွင်၊ အချိန်စီးရီးခန့်မှန်းခြေကို အနည်းငယ်လေ့လာပြီး အချိန်ကာလအတွင်း လျှပ်စစ်သုံးစွဲမှုအတက်အကျကို ဖော်ပြသည့် ဒေတာစဉ်ကို တင်သွင်းခဲ့ပါသည်။ + +[![ARIMA အကြောင်းမိတ်ဆက်](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "ARIMA အကြောင်းမိတ်ဆက်") + +> 🎥 အထက်ပါပုံကို နှိပ်ပြီး ဗီဒီယိုကြည့်ပါ: ARIMA မော်ဒယ်များအကြောင်း အကျဉ်းချုပ်။ ဤနမူနာကို R တွင် ပြုလုပ်ထားသော်လည်း၊ အယူအဆများသည် အထွေထွေသဘောတူပါသည်။ + +## [သင်ခန်းစာမတိုင်မီ မေးခွန်း](https://ff-quizzes.netlify.app/en/ml/) + +## မိတ်ဆက် + +ဤသင်ခန်းစာတွင်၊ [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) ဖြင့် မော်ဒယ်များတည်ဆောက်ရန် နည်းလမ်းတစ်ခုကို ရှာဖွေပါမည်။ ARIMA မော်ဒယ်များသည် [non-stationarity](https://wikipedia.org/wiki/Stationary_process) ပြသသည့် ဒေတာများကို အထူးသင့်လျော်သည်။ + +## အထွေထွေအယူအဆများ + +ARIMA ကို အသုံးပြုနိုင်ရန် အောက်ပါအယူအဆများကို သိရှိထားရန် လိုအပ်ပါသည်- + +- 🎓 **Stationarity**: စာရင်းဇယားအရ၊ stationarity သည် အချိန်အလိုက် ရွှေ့လျားသည့်အခါ မပြောင်းလဲသော ဒေတာဖြန့်ဖြူးမှုကို ဆိုလိုသည်။ Non-stationary ဒေတာသည် အဆင့်အတက်အကျကြောင့် အတက်အကျပြသပြီး၊ ခန့်မှန်းရန်အတွက် ပြောင်းလဲမှုများ လိုအပ်သည်။ ဥပမာအားဖြင့် ရာသီဥတုအခြေအနေသည် ဒေတာတွင် အတက်အကျများကို ဖြစ်ပေါ်စေပြီး 'seasonal-differencing' လုပ်ငန်းစဉ်ဖြင့် ဖယ်ရှားနိုင်သည်။ + +- 🎓 **[Differencing](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**: Differencing သည် non-stationary ဒေတာကို stationarity ဖြစ်စေရန် ပြောင်းလဲခြင်းဖြစ်ပြီး၊ non-constant trend ကို ဖယ်ရှားသည်။ "Differencing သည် အချိန်စီးရီး၏ အဆင့်အတက်အကျများကို ဖယ်ရှားပြီး၊ trend နှင့် seasonality ကို ဖယ်ရှားကာ အချိန်စီးရီး၏ mean ကို တည်ငြိမ်စေသည်။" [Shixiong et al မှ စာတမ်း](https://arxiv.org/abs/1904.07632) + +## အချိန်စီးရီးတွင် ARIMA ၏ အရေးပါမှု + +ARIMA ၏ အစိတ်အပိုင်းများကို ဖွင့်ရှင်းပြီး၊ အချိန်စီးရီးကို မော်ဒယ်တည်ဆောက်ရန်နှင့် ခန့်မှန်းရန် အကူအညီပေးပုံကို နားလည်ပါမည်။ + +- **AR - AutoRegressive**: Autoregressive မော်ဒယ်များသည် အတိတ်ဒေတာများကို 'နောက်' ပြန်ကြည့်ကာ ခန့်မှန်းချက်များ ပြုလုပ်သည်။ ဥပမာအားဖြင့် ခဲတံရောင်းအား၏ လစဉ်ဒေတာသည် 'evolving variable' အဖြစ် သတ်မှတ်နိုင်သည်။ [wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) + +- **I - Integrated**: ARIMA ၏ 'I' သည် [integrated](https://wikipedia.org/wiki/Order_of_integration) aspect ကို ဆိုလိုသည်။ Differencing လုပ်ငန်းစဉ်များကို အသုံးပြုကာ non-stationarity ကို ဖယ်ရှားသည်။ + +- **MA - Moving Average**: [Moving-average](https://wikipedia.org/wiki/Moving-average_model) aspect သည် lag များ၏ လက်ရှိနှင့် အတိတ်တန်ဖိုးများကို ကြည့်ကာ output variable ကို သတ်မှတ်သည်။ + +အကျဉ်းချုပ်: ARIMA သည် အချိန်စီးရီးဒေတာ၏ အထူးပုံစံနှင့် အနီးစပ်ဆုံးဖြစ်စေရန် မော်ဒယ်တည်ဆောက်ရန် အသုံးပြုသည်။ + +## လေ့ကျင့်ခန်း - ARIMA မော်ဒယ်တည်ဆောက်ခြင်း + +ဤသင်ခန်းစာ၏ [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) ဖိုလ်ဒါကို ဖွင့်ပြီး [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb) ဖိုင်ကို ရှာပါ။ + +1. `statsmodels` Python library ကို notebook တွင် run လုပ်ပါ။ ARIMA မော်ဒယ်များအတွက် လိုအပ်ပါသည်။ + +1. လိုအပ်သော libraries များကို load လုပ်ပါ။ + +1. ဒေတာကို `/data/energy.csv` ဖိုင်မှ Pandas dataframe သို့ load လုပ်ပြီး ကြည့်ပါ: + + ```python + energy = load_data('./data')[['load']] + energy.head(10) + ``` + +1. 2012 ခုနှစ် ဇန်နဝါရီမှ 2014 ခုနှစ် ဒီဇင်ဘာအထိရှိသော လျှပ်စစ်သုံးစွဲမှုဒေတာအား plot လုပ်ပါ: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ယခု မော်ဒယ်တည်ဆောက်ရန် စတင်ပါ။ + +### Training နှင့် Testing ဒေတာစဉ်များ ဖန်တီးခြင်း + +ဒေတာကို load လုပ်ပြီးပါက၊ train နှင့် test sets သို့ ခွဲခြားပါ။ Train set တွင် မော်ဒယ်ကို လေ့ကျင့်ပြီး၊ test set တွင် accuracy ကို စစ်ဆေးပါမည်။ + +1. 2014 ခုနှစ် စက်တင်ဘာ 1 မှ အောက်တိုဘာ 31 အထိ train set အဖြစ် သတ်မှတ်ပါ။ Test set သည် 2014 ခုနှစ် နိုဝင်ဘာ 1 မှ ဒီဇင်ဘာ 31 အထိ ဖြစ်ပါမည်: + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + + ဒေတာသည် ရာသီဥတုအတက်အကျများကို ပြသသော်လည်း၊ နောက်ဆုံးရက်များနှင့် ဆင်တူသည်။ + +1. ခွဲခြားထားသော train နှင့် test sets ကို visualization ပြုလုပ်ပါ: + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![training and testing data](../../../../7-TimeSeries/2-ARIMA/images/train-test.png) + + > မှတ်ချက်: ARIMA မော်ဒယ် fitting လုပ်စဉ်တွင် in-sample validation ကို အသုံးပြုသဖြင့် validation data ကို မထည့်ပါ။ + +### Training အတွက် ဒေတာကို ပြင်ဆင်ခြင်း + +Training အတွက် ဒေတာကို filter နှင့် scale ပြုလုပ်ပါ။ + +1. Train နှင့် test sets အတွက် လိုအပ်သော column များကို filter လုပ်ပါ: + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + +1. ဒေတာကို (0, 1) interval အတွင်း scale ပြုလုပ်ပါ: + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + train.head(10) + ``` + +1. Original ဒေတာနှင့် scaled ဒေတာကို ကြည့်ပါ: + + ```python + energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12) + train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12) + plt.show() + ``` + + ![original](../../../../7-TimeSeries/2-ARIMA/images/original.png) + + > Original ဒေတာ + + ![scaled](../../../../7-TimeSeries/2-ARIMA/images/scaled.png) + + > Scaled ဒေတာ + +### ARIMA ကို အကောင်အထည်ဖော်ခြင်း + +`statsmodels` library ကို အသုံးပြုကာ ARIMA ကို အကောင်အထည်ဖော်ပါ။ + +1. Horizon value ကို သတ်မှတ်ပါ။ ဥပမာအားဖြင့် 3 နာရီ: + + ```python + # Specify the number of steps to forecast ahead + HORIZON = 3 + print('Forecasting horizon:', HORIZON, 'hours') + ``` + +1. Parameters များကို manual ရွေးချယ်ပါ: + + ```python + order = (4, 1, 0) + seasonal_order = (1, 1, 0, 24) + + model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order) + results = model.fit() + + print(results.summary()) + ``` + + > 🎓 Parameters များသည် seasonality, trend, နှင့် noise ကို မော်ဒယ်တည်ဆောက်ရန် အရေးပါသည်။ + +### မော်ဒယ်ကို အကဲဖြတ်ခြင်း + +Walk-forward validation ကို အသုံးပြုကာ မော်ဒယ်ကို အကဲဖြတ်ပါ။ + +1. Test data point များကို horizon step အလိုက် ဖန်တီးပါ: + + ```python + test_shifted = test.copy() + + for t in range(1, HORIZON+1): + test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H') + + test_shifted = test_shifted.dropna(how='any') + test_shifted.head(5) + ``` + +1. Sliding window approach ဖြင့် prediction ပြုလုပ်ပါ: + + ```python + %%time + training_window = 720 # dedicate 30 days (720 hours) for training + + train_ts = train['load'] + test_ts = test_shifted + + history = [x for x in train_ts] + history = history[(-training_window):] + + predictions = list() + + order = (2, 1, 0) + seasonal_order = (1, 1, 0, 24) + + for t in range(test_ts.shape[0]): + model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order) + model_fit = model.fit() + yhat = model_fit.forecast(steps = HORIZON) + predictions.append(yhat) + obs = list(test_ts.iloc[t]) + # move the training window + history.append(obs[0]) + history.pop(0) + print(test_ts.index[t]) + print(t+1, ': predicted =', yhat, 'expected =', obs) + ``` + +1. Prediction နှင့် actual load ကို နှိုင်းယှဉ်ပါ: + + ```python + eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)]) + eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1] + eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h') + eval_df['actual'] = np.array(np.transpose(test_ts)).ravel() + eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']]) + eval_df.head() + ``` + + > Output: Prediction နှင့် actual load တို့၏ တိကျမှုကို စစ်ဆေးပါ။ + +### မော်ဒယ်၏ တိကျမှုကို စစ်ဆေးခြင်း + +Mean absolute percentage error (MAPE) ကို အသုံးပြုကာ မော်ဒယ်၏ တိကျမှုကို စစ်ဆေးပါ။ +> **🧮 သင်္ချာကို ပြပါ** +> +> ![MAPE](../../../../7-TimeSeries/2-ARIMA/images/mape.png) +> +> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) ကို အထက်ပါဖော်ပြထားသော ဖော်မြူလာအတိုင်း အချိုးအစားအဖြစ် သတ်မှတ်ပြီး ခန့်မှန်းချက်တိကျမှုကို ပြရန် အသုံးပြုသည်။ အမှန်တကယ်ဖြစ်ရပ်နှင့် ခန့်မှန်းချက်အကြားကွာဟချက်ကို အမှန်တကယ်ဖြစ်ရပ်ဖြင့် ခွဲခြားသည်။ +> +> "ဤတွက်ချက်မှုတွင် အပြည့်အဝတန်ဖိုးကို အချိန်အပိုင်းအခြားတိုင်းတွင် ခန့်မှန်းထားသော အချက်အလက်များအတွက် စုစုပေါင်းတွက်ချက်ပြီး ခန့်မှန်းထားသော အချက်အလက်အရေအတွက် n ဖြင့် ခွဲခြားသည်။" [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error) +1. ကုဒ်ဖြင့် ဆွဲချက်ကို ဖော်ပြပါ။ + + ```python + if(HORIZON > 1): + eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual'] + print(eval_df.groupby('h')['APE'].mean()) + ``` + +1. တစ်ဆင့် MAPE ကိုတွက်ချက်ပါ။ + + ```python + print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%') + ``` + + တစ်ဆင့်ခန့်မှန်းချက် MAPE: 0.5570581332313952 % + +1. အဆင့်များစွာခန့်မှန်းချက် MAPE ကို ပုံနှိပ်ပါ။ + + ```python + print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%') + ``` + + ```output + Multi-step forecast MAPE: 1.1460048657704118 % + ``` + + နိမ့်သောနံပါတ်က အကောင်းဆုံးဖြစ်သည်။ MAPE 10 ရှိသောခန့်မှန်းချက်တစ်ခုသည် 10% မှားနေသည်ဟု ဆိုလိုသည်။ + +1. သို့သော် အမြဲတမ်းလိုလို၊ ဒီလိုတိကျမှုတိုင်းတာမှုကို မြင်ရလွယ်အောင် ပုံဆွဲကြည့်ရင် ပိုမိုကောင်းမွန်သည်။ + + ```python + if(HORIZON == 1): + ## Plotting single step forecast + eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8)) + + else: + ## Plotting multi step forecast + plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']] + for t in range(1, HORIZON+1): + plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values + + fig = plt.figure(figsize=(15, 8)) + ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0) + ax = fig.add_subplot(111) + for t in range(1, HORIZON+1): + x = plot_df['timestamp'][(t-1):] + y = plot_df['t+'+str(t)][0:len(x)] + ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t)) + + ax.legend(loc='best') + + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![အချိန်စီးရီးမော်ဒယ်တစ်ခု](../../../../7-TimeSeries/2-ARIMA/images/accuracy.png) + +🏆 တိကျမှုကောင်းမွန်သော မော်ဒယ်ကို ဖော်ပြထားသည့် အလွန်ကောင်းမွန်သော ပုံတစ်ပုံ။ အလုပ်ကောင်းပါတယ်! + +--- + +## 🚀စိန်ခေါ်မှု + +အချိန်စီးရီးမော်ဒယ်တစ်ခု၏ တိကျမှုကို စမ်းသပ်နိုင်သော နည်းလမ်းများကို လေ့လာပါ။ ဒီသင်ခန်းစာတွင် MAPE ကိုသာ ထိတွေ့ခဲ့ကြပေမယ့် သင်အသုံးပြုနိုင်သည့် အခြားနည်းလမ်းများ ရှိပါသလား။ ၎င်းတို့ကို သုတေသနပြုပြီး မှတ်ချက်ထည့်ပါ။ အသုံးဝင်သော စာရွက်စာတမ်းကို [ဒီမှာ](https://otexts.com/fpp2/accuracy.html) တွေ့နိုင်ပါသည်။ + +## [သင်ခန်းစာပြီးနောက် မေးခွန်း](https://ff-quizzes.netlify.app/en/ml/) + +## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +ဒီသင်ခန်းစာသည် ARIMA ဖြင့် အချိန်စီးရီးခန့်မှန်းခြင်း၏ အခြေခံအချက်များကိုသာ ထိတွေ့သည်။ [ဒီ repository](https://microsoft.github.io/forecasting/) နှင့် ၎င်း၏ မော်ဒယ်အမျိုးအစားများကို လေ့လာခြင်းဖြင့် အချိန်စီးရီးမော်ဒယ်များ တည်ဆောက်ရန် အခြားနည်းလမ်းများကို သင်ယူရန် အချိန်ယူပါ။ + +## လုပ်ငန်းတာဝန် + +[ARIMA မော်ဒယ်အသစ်](assignment.md) + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွဲအချော်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/7-TimeSeries/2-ARIMA/assignment.md b/translations/my/7-TimeSeries/2-ARIMA/assignment.md new file mode 100644 index 00000000..3004a540 --- /dev/null +++ b/translations/my/7-TimeSeries/2-ARIMA/assignment.md @@ -0,0 +1,25 @@ + +# ARIMA မော်ဒယ်အသစ်တစ်ခု + +## လုပ်ဆောင်ရန်ညွှန်ကြားချက်များ + +သင် ARIMA မော်ဒယ်တစ်ခုကို ဆောက်လုပ်ပြီးပြီဆိုပါက၊ အချက်အလက်အသစ်များဖြင့် မော်ဒယ်အသစ်တစ်ခုကို ဆောက်လုပ်ပါ (ဒီ [Duke မှ အချက်အလက်များ](http://www2.stat.duke.edu/~mw/ts_data_sets.html) တစ်ခုကို စမ်းကြည့်ပါ။) သင်၏လုပ်ဆောင်မှုကို notebook တွင် မှတ်ချက်ထည့်ပါ၊ အချက်အလက်များနှင့် မော်ဒယ်ကို ရှုထောင့်ပြပါ၊ MAPE ကို အသုံးပြု၍ တိကျမှုကို စမ်းသပ်ပါ။ + +## အကဲဖြတ်စံနှုန်း + +| စံနှုန်း | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| -------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------- | +| | notebook တစ်ခုကို ARIMA မော်ဒယ်အသစ်တစ်ခုနှင့်အတူ တည်ဆောက်ပြီး၊ စမ်းသပ်ပြီး၊ ရှင်းပြထားပြီး၊ ရှုထောင့်များနှင့် တိကျမှုကို ဖော်ပြထားသည်။ | notebook တင်ပြမှုတွင် မှတ်ချက်မပါဝင်ပါ သို့မဟုတ် အမှားများပါဝင်သည် | အပြီးမပြည့်စုံသော notebook တစ်ခုကို တင်ပြထားသည် | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသောအချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များ၏ ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/7-TimeSeries/2-ARIMA/solution/Julia/README.md b/translations/my/7-TimeSeries/2-ARIMA/solution/Julia/README.md new file mode 100644 index 00000000..0d8c4926 --- /dev/null +++ b/translations/my/7-TimeSeries/2-ARIMA/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ပါ။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/7-TimeSeries/2-ARIMA/solution/R/README.md b/translations/my/7-TimeSeries/2-ARIMA/solution/R/README.md new file mode 100644 index 00000000..e643d78c --- /dev/null +++ b/translations/my/7-TimeSeries/2-ARIMA/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မှန်ကန်မှုမရှိသောအချက်များ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသောအချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/7-TimeSeries/3-SVR/README.md b/translations/my/7-TimeSeries/3-SVR/README.md new file mode 100644 index 00000000..cdf2d03b --- /dev/null +++ b/translations/my/7-TimeSeries/3-SVR/README.md @@ -0,0 +1,393 @@ + +# Support Vector Regressor ကို အသုံးပြု၍ အချိန်လိုက်ခန့်မှန်းခြေ + +ယခင်သင်ခန်းစာတွင် ARIMA မော်ဒယ်ကို အသုံးပြု၍ အချိန်လိုက်ခန့်မှန်းမှုများ ပြုလုပ်ပုံကို သင်လေ့လာခဲ့ပါသည်။ ယခု သင် Support Vector Regressor မော်ဒယ်ကို လေ့လာမည်ဖြစ်ပြီး၊ ၎င်းသည် ဆက်လက်တိုးတက်နေသော ဒေတာများကို ခန့်မှန်းရန် အသုံးပြုသော regression မော်ဒယ်တစ်ခုဖြစ်သည်။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## အကျဉ်းချုပ် + +ဒီသင်ခန်းစာမှာ [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) ကို regression အတွက် အသုံးပြုပုံ၊ အထူးသဖြင့် **SVR: Support Vector Regressor** ကို လေ့လာပါမည်။ + +### အချိန်လိုက်ခန့်မှန်းမှုတွင် SVR [^1] + +SVR ၏ အရေးပါမှုကို နားလည်ရန်မတိုင်မီ၊ သင်သိထားရမည့် အရေးကြီးသော အယူအဆများမှာ: + +- **Regression:** Supervisory learning နည်းလမ်းတစ်ခုဖြစ်ပြီး၊ ပေးထားသော input set မှ ဆက်လက်တိုးတက်နေသော တန်ဖိုးများကို ခန့်မှန်းရန် အသုံးပြုသည်။ ၎င်း၏ အဓိကအကြောင်းအရာမှာ feature space တွင် အများဆုံး data points ရှိသော curve (သို့မဟုတ်) လိုင်းတစ်ခုကို fit လုပ်ရန်ဖြစ်သည်။ [ပိုမိုသိရှိရန်](https://en.wikipedia.org/wiki/Regression_analysis) နှိပ်ပါ။ +- **Support Vector Machine (SVM):** Supervisory machine learning မော်ဒယ်တစ်ခုဖြစ်ပြီး classification, regression နှင့် outliers detection အတွက် အသုံးပြုသည်။ SVM တွင် Kernel function ကို dataset ကို dimension အမြင့်ရှိသော space သို့ ပြောင်းလဲရန် အသုံးပြုသည်။ [ပိုမိုသိရှိရန်](https://en.wikipedia.org/wiki/Support-vector_machine) နှိပ်ပါ။ +- **Support Vector Regressor (SVR):** SVM ၏ regression အတွက် version ဖြစ်ပြီး၊ အများဆုံး data points ရှိသော best-fit line (SVM ၏ hyperplane) ကို ရှာဖွေသည်။ + +### SVR ကို ဘာကြောင့် အသုံးပြုသင့်သလဲ? [^1] + +ယခင်သင်ခန်းစာတွင် ARIMA ကို လေ့လာခဲ့ပြီး၊ ၎င်းသည် အချိန်လိုက်ဒေတာများကို ခန့်မှန်းရန် အောင်မြင်သော statistical linear method တစ်ခုဖြစ်သည်။ သို့သော် အချို့သောအခါတွင် အချိန်လိုက်ဒေတာများတွင် *non-linearity* ရှိနိုင်ပြီး၊ linear မော်ဒယ်များဖြင့် မဖြေရှင်းနိုင်ပါ။ ဒီလိုအခြေအနေများတွင် non-linearity ကို handle လုပ်နိုင်သော SVR ၏ စွမ်းရည်သည် time series forecasting အတွက် အောင်မြင်မှုကို ရရှိစေပါသည်။ + +## လေ့ကျင့်မှု - SVR မော်ဒယ်တစ်ခု တည်ဆောက်ပါ + +ဒေတာပြင်ဆင်မှုအဆင့်များသည် [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) သင်ခန်းစာတွင် လေ့လာခဲ့သော အဆင့်များနှင့် တူညီသည်။ + +ဒီသင်ခန်းစာ၏ [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) folder ကို ဖွင့်ပြီး [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb) ဖိုင်ကို ရှာပါ။[^2] + +1. Notebook ကို run လုပ်ပြီး လိုအပ်သော libraries များကို import လုပ်ပါ: [^2] + + ```python + import sys + sys.path.append('../../') + ``` + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from sklearn.svm import SVR + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + ``` + +2. `/data/energy.csv` ဖိုင်မှ ဒေတာကို Pandas dataframe ထဲသို့ load လုပ်ပြီး ကြည့်ပါ: [^2] + + ```python + energy = load_data('../../data')[['load']] + ``` + +3. 2012 ခုနှစ် ဇန်နဝါရီမှ 2014 ခုနှစ် ဒီဇင်ဘာအထိရှိသော energy data အားလုံးကို plot လုပ်ပါ: [^2] + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![full data](../../../../7-TimeSeries/3-SVR/images/full-data.png) + + ယခု SVR မော်ဒယ်ကို တည်ဆောက်ပါ။ + +### Training နှင့် Testing datasets ဖန်တီးပါ + +ဒေတာကို load လုပ်ပြီးပြီးလျှင် train နှင့် test sets သို့ ခွဲခြားပါ။ SVR အတွက် time-step based dataset ဖန်တီးရန် ဒေတာကို reshape လုပ်ပါ။ Train set တွင် မော်ဒယ်ကို train လုပ်ပြီး၊ training set, testing set နှင့် full dataset တွင် accuracy ကို စစ်ဆေးပါ။ Test set သည် training set ထက် နောက်ပိုင်းအချိန်ကာလကို ဖုံးအုပ်ထားရမည်ဖြစ်ပြီး၊ မော်ဒယ်သည် အနာဂတ်အချိန်ကာလမှ အချက်အလက်များကို မရရှိစေရန် သေချာစေရမည် [^2] (*Overfitting* ဟုခေါ်သည်)။ + +1. 2014 ခုနှစ် စက်တင်ဘာ 1 မှ အောက်တိုဘာ 31 အထိကို training set အဖြစ် သတ်မှတ်ပါ။ Test set သည် 2014 ခုနှစ် နိုဝင်ဘာ 1 မှ ဒီဇင်ဘာ 31 အထိကို ဖုံးအုပ်ထားမည်ဖြစ်သည်: [^2] + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + +2. ခွဲခြားမှုများကို visualization ပြုလုပ်ပါ: [^2] + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![training and testing data](../../../../7-TimeSeries/3-SVR/images/train-test.png) + +### Training အတွက် ဒေတာကို ပြင်ဆင်ပါ + +Training အတွက် ဒေတာကို filter လုပ်ပြီး scale လုပ်ရန် လိုအပ်သည်။ Dataset ကို လိုအပ်သော ကာလများနှင့် column ('load' နှင့် date) များသာ ထည့်သွင်းရန် filter လုပ်ပြီး၊ ဒေတာကို (0, 1) interval တွင် project လုပ်ရန် scale လုပ်ပါ။ + +1. Original dataset ကို filter လုပ်ပြီး training နှင့် testing sets အတွက် လိုအပ်သော ကာလများနှင့် column များသာ ထည့်သွင်းပါ: [^2] + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +2. Training data ကို (0, 1) interval တွင် scale လုပ်ပါ: [^2] + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + ``` + +4. Testing data ကို scale လုပ်ပါ: [^2] + + ```python + test['load'] = scaler.transform(test) + ``` + +### Time-steps ဖြင့် ဒေတာကို ပြင်ဆင်ပါ [^1] + +SVR အတွက် input data ကို `[batch, timesteps]` format သို့ ပြောင်းလဲရန် လိုအပ်သည်။ Training နှင့် testing data ကို reshape လုပ်ပြီး timesteps ကို အသစ်ထည့်သွင်းပါ။ + +```python +# Converting to numpy arrays +train_data = train.values +test_data = test.values +``` + +ဒီဥပမာတွင် `timesteps = 5` ကို အသုံးပြုပါမည်။ Model inputs သည် ပထမ timesteps 4 ခု၏ ဒေတာများဖြစ်ပြီး၊ output သည် 5th timestep ၏ ဒေတာဖြစ်သည်။ + +```python +timesteps=5 +``` + +Training data ကို nested list comprehension အသုံးပြု၍ 2D tensor သို့ ပြောင်းပါ: + +```python +train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0] +train_data_timesteps.shape +``` + +```output +(1412, 5) +``` + +Testing data ကို 2D tensor သို့ ပြောင်းပါ: + +```python +test_data_timesteps=np.array([[j for j in test_data[i:i+timesteps]] for i in range(0,len(test_data)-timesteps+1)])[:,:,0] +test_data_timesteps.shape +``` + +```output +(44, 5) +``` + +Training နှင့် testing data မှ inputs နှင့် outputs ကို ရွေးချယ်ပါ: + +```python +x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]] +x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]] + +print(x_train.shape, y_train.shape) +print(x_test.shape, y_test.shape) +``` + +```output +(1412, 4) (1412, 1) +(44, 4) (44, 1) +``` + +### SVR ကို အကောင်အထည်ဖော်ပါ [^1] + +ယခု SVR ကို အကောင်အထည်ဖော်ရန် အချိန်ရောက်ပါပြီ။ ဒီ implementation အကြောင်းပိုမိုသိရှိရန် [ဒီ documentation](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html) ကို ဖတ်ရှုနိုင်ပါသည်။ + + 1. `SVR()` ကို ခေါ်ပြီး kernel, gamma, c နှင့် epsilon စသည့် hyperparameters များကို pass လုပ်ပါ။ + 2. `fit()` function ကို ခေါ်ပြီး training data အတွက် model ကို ပြင်ဆင်ပါ။ + 3. `predict()` function ကို ခေါ်ပြီး ခန့်မှန်းမှုများ ပြုလုပ်ပါ။ + +ယခု SVR မော်ဒယ်ကို ဖန်တီးပါမည်။ [RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) ကို အသုံးပြုပြီး၊ gamma, C နှင့် epsilon ကို 0.5, 10 နှင့် 0.05 အဖြစ် သတ်မှတ်ပါမည်။ + +```python +model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05) +``` + +#### Training data တွင် မော်ဒယ်ကို fit လုပ်ပါ [^1] + +```python +model.fit(x_train, y_train[:,0]) +``` + +```output +SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5, + kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False) +``` + +#### Model ခန့်မှန်းမှုများ ပြုလုပ်ပါ [^1] + +```python +y_train_pred = model.predict(x_train).reshape(-1,1) +y_test_pred = model.predict(x_test).reshape(-1,1) + +print(y_train_pred.shape, y_test_pred.shape) +``` + +```output +(1412, 1) (44, 1) +``` + +SVR ကို တည်ဆောက်ပြီးပါပြီ! ယခု ၎င်းကို အကဲဖြတ်ရန် လိုအပ်ပါသည်။ + +### မော်ဒယ်ကို အကဲဖြတ်ပါ [^1] + +အကဲဖြတ်ရန်အတွက် ပထမဦးဆုံး original scale သို့ data ကို ပြန်လည် scale လုပ်ပါ။ Performance ကို စစ်ဆေးရန် original နှင့် predicted time series plot ကို plot လုပ်ပြီး၊ MAPE ရလဒ်ကို print လုပ်ပါ။ + +Predicted နှင့် original output ကို scale ပြန်လည်ပြုလုပ်ပါ: + +```python +# Scaling the predictions +y_train_pred = scaler.inverse_transform(y_train_pred) +y_test_pred = scaler.inverse_transform(y_test_pred) + +print(len(y_train_pred), len(y_test_pred)) +``` + +```python +# Scaling the original values +y_train = scaler.inverse_transform(y_train) +y_test = scaler.inverse_transform(y_test) + +print(len(y_train), len(y_test)) +``` + +#### Training နှင့် Testing data တွင် မော်ဒယ်၏ performance ကို စစ်ဆေးပါ [^1] + +Dataset မှ timestamps ကို x-axis တွင် ပြရန် extract လုပ်ပါ။ Output ၏ timestamps သည် input ၏ ပထမ ```timesteps-1``` values အပြီးမှ စတင်ပါမည်။ + +```python +train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:] +test_timestamps = energy[test_start_dt:].index[timesteps-1:] + +print(len(train_timestamps), len(test_timestamps)) +``` + +```output +1412 44 +``` + +Training data အတွက် prediction များကို plot လုပ်ပါ: + +```python +plt.figure(figsize=(25,6)) +plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.title("Training data prediction") +plt.show() +``` + +![training data prediction](../../../../7-TimeSeries/3-SVR/images/train-data-predict.png) + +Training data အတွက် MAPE ကို print လုပ်ပါ: + +```python +print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%') +``` + +```output +MAPE for training data: 1.7195710200875551 % +``` + +Testing data အတွက် prediction များကို plot လုပ်ပါ: + +```python +plt.figure(figsize=(10,3)) +plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![testing data prediction](../../../../7-TimeSeries/3-SVR/images/test-data-predict.png) + +Testing data အတွက် MAPE ကို print လုပ်ပါ: + +```python +print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%') +``` + +```output +MAPE for testing data: 1.2623790187854018 % +``` + +🏆 Testing dataset တွင် အလွန်ကောင်းမွန်သောရလဒ် ရရှိပါသည်! + +### Full dataset တွင် မော်ဒယ်၏ performance ကို စစ်ဆေးပါ [^1] + +```python +# Extracting load values as numpy array +data = energy.copy().values + +# Scaling +data = scaler.transform(data) + +# Transforming to 2D tensor as per model input requirement +data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0] +print("Tensor shape: ", data_timesteps.shape) + +# Selecting inputs and outputs from data +X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]] +print("X shape: ", X.shape,"\nY shape: ", Y.shape) +``` + +```output +Tensor shape: (26300, 5) +X shape: (26300, 4) +Y shape: (26300, 1) +``` + +```python +# Make model predictions +Y_pred = model.predict(X).reshape(-1,1) + +# Inverse scale and reshape +Y_pred = scaler.inverse_transform(Y_pred) +Y = scaler.inverse_transform(Y) +``` + +```python +plt.figure(figsize=(30,8)) +plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(Y_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![full data prediction](../../../../7-TimeSeries/3-SVR/images/full-data-predict.png) + +```python +print('MAPE: ', mape(Y_pred, Y)*100, '%') +``` + +```output +MAPE: 2.0572089029888656 % +``` + +🏆 အလွန်ကောင်းမွန်သော accuracy ရရှိသော မော်ဒယ်ကို ပြသထားသော plot များ ဖြစ်ပါသည်။ အလုပ်ကောင်းပါသည်! + +--- + +## 🚀Challenge + +- မော်ဒယ်ကို ဖန်တီးစဉ် hyperparameters (gamma, C, epsilon) များကို ပြောင်းလဲပြီး testing data တွင် အကဲဖြတ်ပါ။ Testing data တွင် အကောင်းဆုံးရလဒ်ရရှိစေသော hyperparameters set ကို ရှာဖွေပါ။ [ဒီ documentation](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) ကို ဖတ်ရှုပါ။ +- မော်ဒယ်အတွက် kernel functions များကို ပြောင်းလဲအသုံးပြုပြီး၊ dataset တွင် ၎င်းတို့၏ performance များကို စစ်ဆေးပါ။ [ဒီ documentation](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) ကို ဖတ်ရှုပါ။ +- မော်ဒယ်အတွက် `timesteps` အတန်အရွယ်ကို ပြောင်းလဲအသုံးပြုပြီး ခန့်မှန်းမှုများ ပြုလုပ်ပါ။ + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Review & Self Study + +ဒီသင်ခန်းစာသည် Time Series Forecasting အတွက် SVR ၏ အသုံးပြုမှုကို မိတ်ဆက်ရန် ရည်ရွယ်ပါသည်။ SVR အကြောင်းပိုမိုသိရှိရန် [ဒီ blog](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/) ကို ဖတ်ရှုနိုင်ပါသည်။ [scikit-learn documentation](https://scikit-learn.org/stable/modules/svm.html) တွင် SVMs, [SVRs](https://scikit-learn.org/stable/modules/svm.html#regression) နှင့် [kernel functions](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) အကြောင်း အပြည့်အစုံ ရှင်းလင်းထားပါသည်။ + +## Assignment + +[A new SVR model](assignment.md) + +## Credits + +[^1]: ဒီအပိုင်းတွင် ပါဝင်သော စာသား၊ ကုဒ်နှင့် output များကို [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD) မှ ပံ့ပိုးခဲ့သည်။ +[^2]: ဒီအပိုင်းတွင် ပါဝင်သော စာသား၊ ကုဒ်နှင့် output များကို [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) မှ ယူထားသည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/7-TimeSeries/3-SVR/assignment.md b/translations/my/7-TimeSeries/3-SVR/assignment.md new file mode 100644 index 00000000..754db357 --- /dev/null +++ b/translations/my/7-TimeSeries/3-SVR/assignment.md @@ -0,0 +1,27 @@ + +# SVR မော်ဒယ်အသစ်တစ်ခု + +## လမ်းညွှန်ချက်များ [^1] + +SVR မော်ဒယ်တစ်ခုကို တည်ဆောက်ပြီးသားဖြစ်သောကြောင့်၊ အခုတစ်ခါမှာတော့ သစ်စက်သစ်သောဒေတာများနှင့်အတူ မော်ဒယ်အသစ်တစ်ခုကို တည်ဆောက်ပါ (Duke မှ [ဒီဒေတာများ](http://www2.stat.duke.edu/~mw/ts_data_sets.html) တစ်ခုကို စမ်းကြည့်ပါ။) သင်၏အလုပ်ကို notebook တွင် မှတ်ချက်ထည့်ပါ၊ ဒေတာနှင့် မော်ဒယ်ကို ရှင်းလင်းစွာ ဖော်ပြပါ၊ accuracy ကို သင့်လျော်သော ပုံစံများနှင့် MAPE ကို အသုံးပြု၍ စမ်းသပ်ပါ။ Hyperparameters များကို ပြောင်းလဲကြည့်ပါ၊ timesteps အတွက် တန်ဖိုးများကိုလည်း စမ်းကြည့်ပါ။ + +## အဆင့်သတ်မှတ်ချက် [^1] + +| အဆင့်သတ်မှတ်ချက် | ထူးချွန်သောအဆင့် | လုံလောက်သောအဆင့် | တိုးတက်မှုလိုအပ်သောအဆင့် | +| ------------------ | ------------------------------------------------------------ | ------------------------------------------------------- | ----------------------------------- | +| | Notebook တစ်ခုကို SVR မော်ဒယ်တည်ဆောက်ပြီး စမ်းသပ်ထားပြီး၊ visualizations နှင့် accuracy ကို ရှင်းလင်းစွာ ဖော်ပြထားသည်။ | Notebook တစ်ခုကို မှတ်ချက်မထည့်ထားခြင်း သို့မဟုတ် error များပါဝင်ခြင်း။ | မပြီးစီးသော notebook တစ်ခုကို တင်ပြထားသည်။ | + +[^1]:ဤအပိုင်းရှိစာသားကို [ARIMA မှ assignment](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md) မှ အခြေခံ၍ ရေးသားထားသည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သိရှိထားပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/7-TimeSeries/README.md b/translations/my/7-TimeSeries/README.md new file mode 100644 index 00000000..b87aa6e6 --- /dev/null +++ b/translations/my/7-TimeSeries/README.md @@ -0,0 +1,37 @@ + +# အချိန်စီးရီးခန့်မှန်းခြေကို မိတ်ဆက်ခြင်း + +အချိန်စီးရီးခန့်မှန်းခြင်းဆိုတာဘာလဲ? အတိတ်တွင်ဖြစ်ပျက်ခဲ့သည့် လမ်းကြောင်းများကို ချဉ်းကပ်လေ့လာပြီး အနာဂတ်ဖြစ်ရပ်များကို ခန့်မှန်းခြင်းဖြစ်သည်။ + +## ဒေသဆိုင်ရာ ခေါင်းစဉ်: ကမ္ဘာတစ်ဝှမ်း လျှပ်စစ်သုံးစွဲမှု ✨ + +ဒီသင်ခန်းစာနှစ်ခုအတွင်းမှာ သင်သည် အချိန်စီးရီးခန့်မှန်းခြင်းကို မိတ်ဆက်ပေးမည်ဖြစ်ပြီး၊ ၎င်းသည် စက်မှုလုပ်ငန်းနှင့် စီးပွားရေးလောကအတွက် အလွန်အရေးကြီးသော်လည်း အများအားဖြင့် နည်းနည်းမိတ်ဆက်ထားသော စက်မှုလေ့လာမှုဧရိယာတစ်ခုဖြစ်သည်။ နယူးရယ်နက်ဝက်များကို ဒီမော်ဒယ်များ၏ အသုံးဝင်မှုကို တိုးတက်စေရန် အသုံးပြုနိုင်သော်လည်း၊ ကျွန်ုပ်တို့သည် ၎င်းတို့ကို ရိုးရာစက်မှုလေ့လာမှုအတွင်း လေ့လာသွားမည်ဖြစ်ပြီး၊ အတိတ်အခြေခံ၍ အနာဂတ်ဆောင်ရွက်မှုကို ခန့်မှန်းရန် မော်ဒယ်များက ကူညီပေးသည်။ + +ကျွန်ုပ်တို့၏ ဒေသဆိုင်ရာ အာရုံစိုက်မှုမှာ ကမ္ဘာတစ်ဝှမ်း လျှပ်စစ်သုံးစွဲမှုဖြစ်ပြီး၊ အတိတ်အလားအလာများအပေါ် အခြေခံ၍ အနာဂတ် လျှပ်စစ်သုံးစွဲမှုကို ခန့်မှန်းရန် သင်ယူရန် စိတ်ဝင်စားဖွယ် ဒေတာအစုတစ်ခုဖြစ်သည်။ ဒီလိုခန့်မှန်းမှုဟာ စီးပွားရေးပတ်ဝန်းကျင်မှာ အလွန်အသုံးဝင်နိုင်ပုံကို သင်မြင်နိုင်ပါမည်။ + +![electric grid](../../../7-TimeSeries/images/electric-grid.jpg) + +ဓာတ်ပုံ - [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) မှ Rajasthan တွင် လမ်းပေါ်ရှိ လျှပ်စစ်အင်အားမြှင့်စက်များ၏ ဓာတ်ပုံကို [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) တွင် ရိုက်ထားသည်။ + +## သင်ခန်းစာများ + +1. [အချိန်စီးရီးခန့်မှန်းခြင်းကို မိတ်ဆက်ခြင်း](1-Introduction/README.md) +2. [ARIMA အချိန်စီးရီးမော်ဒယ်များ တည်ဆောက်ခြင်း](2-ARIMA/README.md) +3. [အချိန်စီးရီးခန့်မှန်းရန် Support Vector Regressor တည်ဆောက်ခြင်း](3-SVR/README.md) + +## အားကျေးဇူးတင်စကား + +"အချိန်စီးရီးခန့်မှန်းခြင်းကို မိတ်ဆက်ခြင်း" ကို ⚡️ ဖြင့် [Francesca Lazzeri](https://twitter.com/frlazzeri) နှင့် [Jen Looper](https://twitter.com/jenlooper) တို့က ရေးသားခဲ့သည်။ ဒီနိုက်ဘွတ်များကို ပထမဆုံး [Azure "Deep Learning For Time Series" repo](https://github.com/Azure/DeepLearningForTimeSeriesForecasting) တွင် Francesca Lazzeri မှ ရေးသားခဲ့သည်။ SVR သင်ခန်းစာကို [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD) မှ ရေးသားခဲ့သည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အတည်ပြုရမည့် အရင်းအမြစ်အဖြစ် သတ်မှတ်ပါ။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသည့် အလွဲအချော်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/8-Reinforcement/1-QLearning/README.md b/translations/my/8-Reinforcement/1-QLearning/README.md new file mode 100644 index 00000000..0f02dce1 --- /dev/null +++ b/translations/my/8-Reinforcement/1-QLearning/README.md @@ -0,0 +1,258 @@ + +# Reinforcement Learning နှင့် Q-Learning အကြောင်းမိတ်ဆက် + +![Machine Learning တွင် reinforcement အကျဉ်းချုပ်ကို sketchnote](../../../../sketchnotes/ml-reinforcement.png) +> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) + +Reinforcement learning တွင် အရေးပါသော အချက် ၃ ခုရှိသည်။ အဲဒါတွေကတော့ agent, states တစ်ချို့, နှင့် state တစ်ခုစီအတွက် actions တွေဖြစ်သည်။ သတ်မှတ်ထားသော state မှာ action တစ်ခုကို လုပ်ဆောင်ခြင်းအားဖြင့် agent သည် reward ရရှိမည်။ Super Mario ကွန်ပျူတာဂိမ်းကို ထပ်မံစဉ်းစားပါ။ သင်သည် Mario ဖြစ်ပြီး၊ ဂိမ်းအဆင့်တစ်ခုတွင်၊ ချိုင့်စွန်းအနားမှာရပ်နေသည်။ သင့်အပေါ်မှာ coin တစ်ခုရှိသည်။ သင်သည် Mario ဖြစ်ပြီး၊ ဂိမ်းအဆင့်တစ်ခုတွင်၊ တိကျသောနေရာတွင် ရပ်နေသည်... ဒါက သင့် state ဖြစ်သည်။ ညာဘက်ကို တစ်ခြေလှမ်း (action) ရွှေ့ခြင်းသည် ချိုင့်စွန်းအောက်ကို ကျသွားစေပြီး၊ အနိမ့်သော ကိန်းဂဏန်း score ရရှိမည်။ သို့သော် jump ခလုတ်ကို နှိပ်ခြင်းဖြင့် သင် point ရရှိပြီး အသက်ရှင်နေမည်။ ဒါက အကောင်းဆုံးရလဒ်ဖြစ်ပြီး၊ သင့်ကို အကောင်းသော ကိန်းဂဏန်း score ပေးသင့်သည်။ + +Reinforcement learning နှင့် simulator (ဂိမ်း) ကို အသုံးပြုခြင်းအားဖြင့် သင်သည် အသက်ရှင်နေခြင်းနှင့် အများဆုံး point ရရှိရန် ဂိမ်းကို ကစားပုံကို သင်ယူနိုင်သည်။ + +[![Reinforcement Learning မိတ်ဆက်](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) + +> 🎥 အထက်ပါပုံကို နှိပ်ပြီး Dmitry ၏ Reinforcement Learning အကြောင်းဆွေးနွေးမှုကို ကြည့်ပါ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## အကြိုလိုအပ်ချက်များနှင့် Setup + +ဒီသင်ခန်းစာမှာ Python မှာ code တွေကို စမ်းသပ်မည်ဖြစ်သည်။ သင်သည် Jupyter Notebook code ကို သင်ခန်းစာမှ သင်၏ကွန်ပျူတာတွင် သို့မဟုတ် cloud တစ်ခုခုတွင် run လို့ရနိုင်ရမည်။ + +[သင်ခန်းစာ notebook](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) ကို ဖွင့်ပြီး ဒီသင်ခန်းစာကို လိုက်လျောညီထွေဖြင့် တည်ဆောက်ပါ။ + +> **Note:** သင်သည် ဒီ code ကို cloud မှ ဖွင့်နေပါက၊ notebook code တွင် အသုံးပြုထားသော [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py) ဖိုင်ကိုလည်း fetch လုပ်ရန်လိုအပ်သည်။ notebook နှင့် တူညီသော directory တွင် ထည့်ပါ။ + +## မိတ်ဆက် + +ဒီသင်ခန်းစာမှာ **[Peter and the Wolf](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)** ၏ ကမ္ဘာကို ရုရှားတေးရေးဆရာ [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev) ၏ ဂီတပုံပြင်မှ အားပေးမှုဖြင့် ရှာဖွေမည်။ **Reinforcement Learning** ကို အသုံးပြုပြီး Peter ကို သူ့ပတ်ဝန်းကျင်ကို စူးစမ်းစေပြီး၊ အရသာရှိသောပန်းသီးများကို စုဆောင်းစေပြီး ဝံကို မတွေ့ရအောင်လုပ်မည်။ + +**Reinforcement Learning** (RL) သည် **agent** တစ်ခု၏ **environment** တစ်ခုတွင် အကောင်းဆုံးအပြုအမူကို သင်ယူရန် အတတ်ပညာဖြစ်သည်။ ဒီ environment တွင် agent တစ်ခုသည် **reward function** ဖြင့် သတ်မှတ်ထားသော **goal** တစ်ခုရှိရမည်။ + +## Environment + +ရိုးရှင်းစွာပြောရမည်ဆိုပါက Peter ၏ ကမ္ဘာကို `width` x `height` အရွယ်ရှိသော စတုရန်း board အဖြစ် သတ်မှတ်ပါမည်၊ ဒီလိုပုံစံဖြစ်သည်။ + +![Peter ၏ Environment](../../../../8-Reinforcement/1-QLearning/images/environment.png) + +ဒီ board ရဲ့ cell တစ်ခုစီမှာ အောက်ပါအတိုင်းဖြစ်နိုင်သည်- + +* **ground**, Peter နှင့် အခြားသော သတ္တဝါများ လမ်းလျှောက်နိုင်သောနေရာ။ +* **water**, လမ်းလျှောက်လို့မရသောနေရာ။ +* **tree** သို့မဟုတ် **grass**, အနားယူနိုင်သောနေရာ။ +* **apple**, Peter အတွက် အစားအသောက်အဖြစ် ရှာဖွေလိုသောနေရာ။ +* **wolf**, အန္တရာယ်ရှိပြီး ရှောင်ရှားသင့်သောနေရာ။ + +Python module တစ်ခုဖြစ်သော [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py) တွင် ဒီ environment နှင့် အလုပ်လုပ်ရန် code ပါဝင်သည်။ ဒီ code သည် ကျွန်ုပ်တို့၏ concepts ကို နားလည်ရန်အရေးကြီးမဟုတ်သောကြောင့် module ကို import လုပ်ပြီး sample board ကို ဖန်တီးရန် အသုံးပြုမည် (code block 1): + +```python +from rlboard import * + +width, height = 8,8 +m = Board(width,height) +m.randomize(seed=13) +m.plot() +``` + +ဒီ code သည် အထက်ပါပုံနှင့် ဆင်တူသော environment ၏ ပုံကို print လုပ်သင့်သည်။ + +## Actions နှင့် Policy + +ဒီဥပမာမှာ Peter ၏ ရည်မှန်းချက်မှာ ဝံနှင့် အခြားသော အတားအဆီးများကို ရှောင်ရှားပြီး ပန်းသီးကို ရှာဖွေခြင်းဖြစ်သည်။ ဒီအတွက် သူသည် ပန်းသီးကို ရှာဖွေမရအောင် လမ်းလျှောက်နိုင်သည်။ + +ထို့ကြောင့်၊ တည်နေရာတစ်ခုစီတွင် သူသည် အောက်ပါ action များအနက် တစ်ခုကို ရွေးချယ်နိုင်သည်- up, down, left နှင့် right။ + +action များကို dictionary အဖြစ် သတ်မှတ်ပြီး၊ coordinate changes နှင့် mapping လုပ်မည်။ ဥပမာအားဖြင့်, right (`R`) ကို `(1,0)` pair နှင့် ကိုက်ညီစေမည်။ (code block 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()) } +``` + +အကျဉ်းချုပ်အားဖြင့်၊ ဒီ scenario ၏ strategy နှင့် goal သည် အောက်ပါအတိုင်းဖြစ်သည်- + +- **Strategy**, agent (Peter) ၏ strategy ကို **policy** ဟုခေါ်သော function ဖြင့် သတ်မှတ်သည်။ Policy သည် တည်နေရာတစ်ခုစီတွင် action ကို ပြန်ပေးသည်။ ကျွန်ုပ်တို့၏ problem ၏ state သည် player ၏ လက်ရှိတည်နေရာအပါအဝင် board ကို ကိုယ်စားပြုသည်။ + +- **Goal**, reinforcement learning ၏ ရည်မှန်းချက်မှာ problem ကို ထိရောက်စွာ ဖြေရှင်းနိုင်ရန် အကောင်းဆုံး policy ကို သင်ယူရန်ဖြစ်သည်။ သို့သော် baseline အနေဖြင့် **random walk** ဟုခေါ်သော ရိုးရှင်းသော policy ကို စဉ်းစားပါမည်။ + +## Random Walk + +အရင်ဆုံး random walk strategy ကို အသုံးပြု၍ ကျွန်ုပ်တို့၏ problem ကို ဖြေရှင်းပါမည်။ Random walk ဖြင့်၊ ကျွန်ုပ်တို့သည် ခွင့်ပြုထားသော actions များအနက်မှ နောက်တစ်ခုကို အလွတ်ရွေးချယ်ပြီး၊ ပန်းသီးကို ရောက်သည်အထိ ဆက်လုပ်မည် (code block 3)။ + +1. အောက်ပါ code ဖြင့် random walk ကို အကောင်အထည်ဖော်ပါ- + + ```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 + if start_position: + m.human = start_position + else: + m.random_start() + while True: + if m.at() == Board.Cell.apple: + return n # success! + if m.at() in [Board.Cell.wolf, Board.Cell.water]: + return -1 # eaten by wolf or drowned + 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 + break + n+=1 + + walk(m,random_policy) + ``` + + `walk` ကို ခေါ်ဆိုခြင်းသည် သက်ဆိုင်ရာ လမ်းကြောင်း၏ အရှည်ကို ပြန်ပေးသင့်ပြီး၊ run တစ်ခုစီတွင် ကွဲပြားနိုင်သည်။ + +1. walk စမ်းသပ်မှုကို အကြိမ်ရေ (ဥပမာ 100) အများကြီး run လုပ်ပြီး၊ ရလဒ် statistics ကို print လုပ်ပါ (code block 4): + + ```python + def print_statistics(policy): + s,w,n = 0,0,0 + for _ in range(100): + z = walk(m,policy) + if z<0: + w+=1 + else: + s += z + n += 1 + print(f"Average path length = {s/n}, eaten by wolf: {w} times") + + print_statistics(random_policy) + ``` + + လမ်းကြောင်း၏ အရှည်ပျမ်းမျှသည် 30-40 ခြေလှမ်းအနီးအနားရှိသည်ကို သတိပြုပါ၊ ပန်းသီးအနီးဆုံးအကွာအဝေးပျမ်းမျှသည် 5-6 ခြေလှမ်းသာရှိသည်။ + + Random walk အတွင်း Peter ၏ လှုပ်ရှားမှုကိုလည်း ကြည့်နိုင်သည်- + + ![Peter ၏ Random Walk](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) + +## Reward Function + +Policy ကို ပိုပြီး ဉာဏ်ရည်ရှိအောင်လုပ်ရန်၊ ဘယ် moves တွေက "ပိုကောင်း" သောအရာများဖြစ်သည်ကို နားလည်ရန်လိုအပ်သည်။ ဒီအတွက် ကျွန်ုပ်တို့၏ ရည်မှန်းချက်ကို သတ်မှတ်ရန်လိုအပ်သည်။ + +ရည်မှန်းချက်ကို **reward function** ဖြင့် သတ်မှတ်နိုင်ပြီး၊ state တစ်ခုစီအတွက် score value တစ်ခုကို ပြန်ပေးမည်။ ကိန်းဂဏန်းမြင့်မည်လျှင် reward function ပိုကောင်းသည်။ (code block 5) + +```python +move_reward = -0.1 +goal_reward = 10 +end_reward = -10 + +def reward(m,pos=None): + pos = pos or m.human + if not m.is_valid(pos): + return end_reward + x = m.at(pos) + if x==Board.Cell.water or x == Board.Cell.wolf: + return end_reward + if x==Board.Cell.apple: + return goal_reward + return move_reward +``` + +Reward functions ၏ စိတ်ဝင်စားဖွယ်ကောင်းသောအချက်မှာ အများဆုံးအခြေအနေတွင် *ဂိမ်းအဆုံးတွင်သာ အရေးပါသော reward ရရှိသည်* ဖြစ်သည်။ ဒါကဆိုရင် ကျွန်ုပ်တို့၏ algorithm သည် positive reward ရရှိသောအခြေအနေများကို "မှတ်မိ" ရမည်။ ထို့နောက်၊ အကောင်းဆုံးရလဒ်ရရှိရန် "ကောင်းသော" လှုပ်ရှားမှုများ၏ အရေးပါမှုကို တိုးမြှင့်ရမည်။ ထို့နောက်၊ အဆိုးဆုံးရလဒ်ရရှိသော moves များကိုလည်း လျော့နည်းစေရမည်။ + +## Q-Learning + +ဒီမှာ ဆွေးနွေးမည့် algorithm ကို **Q-Learning** ဟုခေါ်သည်။ ဒီ algorithm တွင် policy ကို **Q-Table** ဟုခေါ်သော function (သို့မဟုတ် data structure) ဖြင့် သတ်မှတ်သည်။ Q-Table သည် တည်နေရာတစ်ခုစီတွင် action များ၏ "ကောင်းမှု" ကို မှတ်တမ်းတင်သည်။ + +Q-Table ဟုခေါ်ရသည်မှာ table သို့မဟုတ် multi-dimensional array အဖြစ် ကိုယ်စားပြုရန် အဆင်ပြေသောကြောင့်ဖြစ်သည်။ ကျွန်ုပ်တို့၏ board တွင် `width` x `height` အတိုင်းအတာရှိသည့်အတွက် Q-Table ကို numpy array ဖြင့် `width` x `height` x `len(actions)` အရွယ်အစားဖြင့် ကိုယ်စားပြုနိုင်သည်။ (code block 6) + +```python +Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) +``` + +Q-Table ၏ value အားလုံးကို တူညီသောတန်ဖိုးဖြင့် initialize လုပ်သည်ကို သတိပြုပါ၊ ကျွန်ုပ်တို့၏အခြေအနေတွင် - 0.25 ဖြစ်သည်။ ဒါက "random walk" policy ကို ကိုယ်စားပြုသည်၊ အကြောင်းမူကား တစ်ခုစီတွင် moves အားလုံးသည် တူညီသောအကောင်းမှုရှိသည်။ Q-Table ကို board တွင် visualize လုပ်ရန် `plot` function ကို pass လုပ်နိုင်သည်- `m.plot(Q)`။ + +![Peter ၏ Environment](../../../../8-Reinforcement/1-QLearning/images/env_init.png) + +Cell တစ်ခုစီ၏ အလယ်တွင် "arrow" တစ်ခုရှိပြီး၊ လှုပ်ရှားမှု၏ အကြိုက်ဆုံး direction ကို ဖော်ပြသည်။ Direction အားလုံးတူညီသောကြောင့် dot တစ်ခုကို ဖော်ပြသည်။ + +အခု simulation ကို run လုပ်ပြီး၊ environment ကို စူးစမ်းပြီး၊ Q-Table values များ၏ distribution ကို ပိုကောင်းစေပြီး၊ ပန်းသီးကို ရှာဖွေရာတွင် ပိုမြန်စေမည်။ + +## Q-Learning ၏ အဓိကအချက်: Bellman Equation + +လှုပ်ရှားမှုကို စတင်ပြီးနောက်၊ action တစ်ခုစီတွင် သက်ဆိုင်ရာ reward ရရှိမည်၊ ဉပမာ immediate reward အမြင့်ဆုံးဖြင့် နောက်တစ်ခုကို ရွေးချယ်နိုင်သည်။ သို့သော်၊ အများဆုံး states တွင် move သည် ပန်းသီးကို ရောက်ရန် ရည်မှန်းချက်ကို မရောက်စေပါ၊ ထို့ကြောင့် ဘယ် direction က ပိုကောင်းသည်ကို ချက်ချင်းဆုံးဖြတ်လို့မရပါ။ + +> သတိပြုပါ၊ ချက်ချင်းရလဒ်သည် အရေးမကြီးပါ၊ အရေးကြီးသည် simulation ၏ အဆုံးတွင် ရရှိမည့် နောက်ဆုံးရလဒ်ဖြစ်သည်။ + +ဒီ delayed reward ကို ထည့်သွင်းစဉ်းစားရန် **[dynamic programming](https://en.wikipedia.org/wiki/Dynamic_programming)** ၏ မူကွဲများကို အသုံးပြုရမည်၊ အဲဒါက ကျွန်ုပ်တို့၏ပြဿနာကို recursive အနေနှင့် စဉ်းစားရန် ခွင့်ပြုသည်။ + +ယခု state *s* တွင်ရှိပြီး၊ နောက် state *s'* သို့ ရွှေ့လိုသည်ဟု ယူဆပါ။ ဒီလိုလုပ်ခြင်းအားဖြင့် immediate reward *r(s,a)* ကို reward function ဖြင့် သတ်မှတ်ပြီး၊ အနာဂတ် reward တစ်ခုရရှိမည်။ ကျွန်ုပ်တို့၏ Q-Table သည် action တစ်ခုစီ၏ "attractiveness" ကို မှန်ကန်စွာ ဖော်ပြသည်ဟု ယူဆပါက၊ state *s'* တွင် *Q(s',a')* ၏ maximum value ကို ကိုက်ညီသော action *a'* ကို ရွေးချယ်မည်။ ထို့ကြောင့် state *s* တွင် ရရှိနိုင်သော အကောင်းဆုံး အနာဂတ် reward ကို `max` *Q(s',a')* (state *s'* တွင် action *a'* များအားလုံးအပေါ်မှာ maximum ကိုတွက်ချက်သည်) ဖြင့် သတ်မှတ်နိုင်သည်။ + +ဒီအချက်သည် **Bellman formula** ကို ပေးသည်၊ action *a* ကို ရွေးချယ်သော state *s* တွင် Q-Table ၏ value ကိုတွက်ချက်ရန်: + +## မူဝါဒကို စစ်ဆေးခြင်း + +Q-Table သည် အခြေအနေတစ်ခုစီတွင် လုပ်ဆောင်မှုတစ်ခုစီ၏ "ဆွဲဆောင်မှု" ကို ဖော်ပြထားသောကြောင့် ကျွန်ုပ်တို့၏ကမ္ဘာတွင် ထိရောက်သော လမ်းကြောင်းရှာဖွေမှုကို သတ်မှတ်ရန် အလွယ်တကူ အသုံးပြုနိုင်သည်။ အလွယ်တကူဆုံးသောအခြေအနေတွင် Q-Table အတန်ဖိုးအမြင့်ဆုံးနှင့် ကိုက်ညီသော လုပ်ဆောင်မှုကို ရွေးချယ်နိုင်သည်။ (code block 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) +``` + +> အထက်ပါ code ကို အကြိမ်ကြိမ် စမ်းကြည့်ပါက တစ်ခါတစ်ရံ "hang" ဖြစ်ပြီး notebook တွင် STOP ခလုတ်ကို နှိပ်၍ ရပ်တန့်ရန်လိုအပ်သည်ကို သတိထားမိနိုင်သည်။ ၎င်းသည် အခြေအနေနှစ်ခုသည် အကောင်းဆုံး Q-Value အရ တစ်ခုနှင့်တစ်ခုကို "ညွှန်ပြ" သည့်အခြေအနေများရှိနိုင်သောကြောင့် ဖြစ်ပြီး agent သည် အခြေအနေများအကြား အဆုံးမရှိလှုပ်ရှားနေမိသည်။ + +## 🚀စိန်ခေါ်မှု + +> **Task 1:** `walk` function ကို ပြင်ဆင်ပြီး လမ်းကြောင်း၏ အရှည်ကို အတိအကျ အဆင့်အတန်း (ဥပမာ 100) ဖြင့် ကန့်သတ်ပါ၊ အထက်ပါ code သည် အချိန်အခါမရွေး ဤတန်ဖိုးကို ပြန်ပေးသည်ကို ကြည့်ပါ။ + +> **Task 2:** `walk` function ကို ပြင်ဆင်ပြီး ယခင်က ရောက်ရှိခဲ့သောနေရာများကို ပြန်မသွားအောင်လုပ်ပါ။ ၎င်းသည် `walk` ကို loop ဖြစ်ခြင်းမှ ကာကွယ်ပေးနိုင်သော်လည်း agent သည် ထွက်မရနိုင်သောနေရာတွင် "ပိတ်မိ" ဖြစ်နိုင်သည်။ + +## လမ်းကြောင်းရှာဖွေမှု + +လမ်းကြောင်းရှာဖွေမှု မူဝါဒအကောင်းဆုံးသည် ကျွန်ုပ်တို့ သင်ကြားမှုအတွင်း အသုံးပြုခဲ့သော မူဝါဒဖြစ်ပြီး exploitation နှင့် exploration ကို ပေါင်းစပ်ထားသည်။ ဤမူဝါဒတွင် Q-Table တွင်ရှိသောတန်ဖိုးများနှင့် အချိုးကျသော probability ဖြင့် လုပ်ဆောင်မှုတစ်ခုစီကို ရွေးချယ်မည်ဖြစ်သည်။ ဤနည်းလမ်းသည် agent ကို ရှာဖွေပြီးသားနေရာသို့ ပြန်သွားစေမည့် အခွင့်အရေးရှိသော်လည်း အောက်ပါ code မှာ မြင်နိုင်သည့်အတိုင်း ရှိသည့်နေရာသို့ ရောက်ရန် အလွန်တိုသော လမ်းကြောင်းကို ရလဒ်ပေးသည်။ (သတိရပါ - `print_statistics` သည် simulation ကို 100 ကြိမ် ပြုလုပ်သည်): (code block 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) +``` + +ဤ code ကို run ပြီးပါက အရင်ကထက် average path length အလွန်တိုသော 3-6 အတွင်း ရရှိသင့်သည်။ + +## သင်ယူမှုလုပ်ငန်းစဉ်ကို စုံစမ်းခြင်း + +ကျွန်ုပ်တို့ ပြောခဲ့သည့်အတိုင်း သင်ယူမှုလုပ်ငန်းစဉ်သည် problem space ၏ ဖွဲ့စည်းမှုအပေါ် ရရှိထားသော အသိပညာကို ရှာဖွေခြင်းနှင့် အသုံးချခြင်းအကြား တစ်ခုတည်းသော လိုက်လျောမှုဖြစ်သည်။ သင်ယူမှုရလဒ်များ (agent ကို ရည်မှန်းချက်သို့ ရောက်ရန် အတိုသော လမ်းကြောင်းကို ရှာဖွေနိုင်စွမ်း) ကောင်းမွန်လာသည်ကို မြင်ရသော်လည်း သင်ယူမှုလုပ်ငန်းစဉ်အတွင်း average path length ၏ အပြောင်းအလဲကို ကြည့်ရှုခြင်းလည်း စိတ်ဝင်စားဖွယ်ကောင်းသည်။ + +## သင်ယူမှုများကို အကျဉ်းချုပ်နိုင်သည်။ + +- **Average path length တိုးလာသည်**။ အစပိုင်းတွင် average path length တိုးလာသည်ကို မြင်ရသည်။ ၎င်းသည် ပတ်ဝန်းကျင်အကြောင်း မသိသေးသောအခါတွင် အဆိုးဆုံး state များ (ရေ၊ ဝက်ဝံ) တွင် ပိတ်မိနိုင်သောကြောင့် ဖြစ်နိုင်သည်။ ပတ်ဝန်းကျင်အကြောင်းပိုမိုသိလာပြီး ဤအသိပညာကို အသုံးပြု၍ ပတ်ဝန်းကျင်ကို ရှာဖွေနိုင်သော်လည်း ပန်းသီးများရှိရာကို မသိသေးသောကြောင့် ဖြစ်နိုင်သည်။ + +- **Path length လျော့ကျလာသည်**။ သင်ယူမှုများလုံလောက်စွာ ရရှိလာသည့်အခါ agent အတွက် ရည်မှန်းချက်ကို ရောက်ရန် ပိုမိုလွယ်ကူလာပြီး path length လျော့ကျလာသည်။ သို့သော်လည်း agent သည် အကောင်းဆုံးလမ်းကြောင်းမှ ချော်၍ အခြားရွေးချယ်မှုများကို ရှာဖွေသည့်အခါ path length သည် အကောင်းဆုံးထက် ပိုမိုရှည်လျားလာနိုင်သည်။ + +- **Length တစ်ခါတစ်ရံ ရုတ်တရက် တိုးလာသည်**။ ဤ graph တွင် တစ်ချိန်ချိန်တွင် length ရုတ်တရက် တိုးလာသည်ကိုလည်း တွေ့ရသည်။ ၎င်းသည် လုပ်ငန်းစဉ်၏ stochastic nature ကို ဖော်ပြပြီး Q-Table coefficients များကို တန်ဖိုးအသစ်များဖြင့် ပြန်ရေးသားခြင်းကြောင့် ဖြစ်နိုင်သည်။ ၎င်းကို သင်ကြားမှုအဆုံးပိုင်းတွင် learning rate ကို လျော့ချခြင်းဖြင့် minimize လုပ်သင့်သည် (ဥပမာ Q-Table တန်ဖိုးများကို အနည်းငယ်သာ ပြင်ဆင်ခြင်း)။ + +စုစုပေါင်းအားဖြင့် သင်ယူမှုလုပ်ငန်းစဉ်၏ အောင်မြင်မှုနှင့် အရည်အသွေးသည် learning rate, learning rate decay, နှင့် discount factor ကဲ့သို့သော parameters များအပေါ် အလွန်အမင်း မှီခိုနေသည်ကို သတိထားရမည်။ ၎င်းတို့ကို **hyperparameters** ဟု ခေါ်ပြီး **parameters** (ဥပမာ Q-Table coefficients) နှင့် ခွဲခြားရန် သတ်မှတ်ထားသည်။ hyperparameter များ၏ အကောင်းဆုံးတန်ဖိုးများကို ရှာဖွေခြင်းလုပ်ငန်းစဉ်ကို **hyperparameter optimization** ဟု ခေါ်ပြီး ၎င်းသည် သီးခြားအကြောင်းအရာတစ်ခုအဖြစ် သတ်မှတ်ရန် တန်ဖိုးရှိသည်။ + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## အလုပ်ပေးစာ +[A More Realistic World](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဝန်ဆောင်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/8-Reinforcement/1-QLearning/assignment.md b/translations/my/8-Reinforcement/1-QLearning/assignment.md new file mode 100644 index 00000000..e6db61c1 --- /dev/null +++ b/translations/my/8-Reinforcement/1-QLearning/assignment.md @@ -0,0 +1,41 @@ + +# အကောင်းမွန်သော အပြည့်အစုံသော ကမ္ဘာ + +ကျွန်တော်တို့ရဲ့ အခြေအနေမှာ Peter ဟာ မိမိကိုယ်ကို မပင်ပန်းဘဲ၊ မဆာဘဲ နေရာတစ်ခုမှ နေရာတစ်ခုကို လွယ်ကူစွာ ရွှေ့လျားနိုင်ခဲ့ပါတယ်။ အကောင်းမွန်သော အပြည့်အစုံသော ကမ္ဘာတစ်ခုမှာတော့ Peter ဟာ အချိန်အခါတစ်ချို့မှာ ထိုင်ပြီး အနားယူဖို့လိုအပ်တယ်၊ နောက်ပြီး သူ့ကိုယ်သူ အစာစားဖို့လည်း လိုအပ်ပါတယ်။ ကမ္ဘာကို ပိုမိုအပြည့်အစုံဖြစ်အောင် လုပ်ဆောင်ဖို့အတွက် အောက်ပါ စည်းကမ်းများကို အကောင်အထည်ဖော်ကြရအောင်။ + +1. နေရာတစ်ခုမှ နေရာတစ်ခုကို ရွှေ့လျားတဲ့အခါ Peter ဟာ **စွမ်းအင်** ဆုံးရှုံးပြီး **ပင်ပန်းမှု** တိုးလာမယ်။ +2. Peter ဟာ ပန်းသီးတွေ စားခြင်းအားဖြင့် စွမ်းအင်ကို ပြန်လည်ရရှိနိုင်မယ်။ +3. Peter ဟာ သစ်ပင်အောက်မှာ ဒါမှမဟုတ် မြက်ခင်းပေါ်မှာ အနားယူခြင်းအားဖြင့် ပင်ပန်းမှုကို လျှော့ချနိုင်မယ် (ဥပမာ - သစ်ပင်နဲ့ မြက်ခင်းရှိတဲ့ နေရာကို လမ်းလျှောက်ဝင်ရောက်ခြင်း)။ +4. Peter ဟာ ဝက်ဝံကို ရှာဖွေပြီး သတ်ဖို့ လိုအပ်တယ်။ +5. ဝက်ဝံကို သတ်ဖို့အတွက် Peter ဟာ သတ်ပွဲမှာ အနိုင်ရဖို့ လိုအပ်တဲ့ စွမ်းအင်နဲ့ ပင်ပန်းမှု အဆင့်ကို ရှိထားဖို့ လိုအပ်တယ်။ မဟုတ်ရင် သူဟာ သတ်ပွဲမှာ ရှုံးမယ်။ + +## လမ်းညွှန်ချက်များ + +မူရင်း [notebook.ipynb](../../../../8-Reinforcement/1-QLearning/notebook.ipynb) ကို သင့်ရဲ့ ဖြေရှင်းချက်အတွက် အခြေခံအနေဖြင့် အသုံးပြုပါ။ + +အပေါ်မှာ ဖော်ပြထားတဲ့ ဆုချီးမြှင့်မှု ဖန်တီးမှုကို ပြင်ဆင်ပြီး၊ reinforcement learning algorithm ကို အသုံးပြု၍ အနိုင်ရဖို့ strategy အကောင်းဆုံးကို သင်ယူပါ၊ random walk နဲ့ သင့် algorithm ရဲ့ ရလဒ်ကို အနိုင်ရမှုနဲ့ ရှုံးမှု အရေအတွက်အပေါ်မှာ နှိုင်းယှဉ်ပါ။ + +> **Note**: သင့်ရဲ့ ကမ္ဘာအသစ်မှာ state ဟာ ပိုမိုရှုပ်ထွေးလာပြီး လူ့နေရာအပြင် ပင်ပန်းမှုနဲ့ စွမ်းအင်အဆင့်တွေကိုလည်း ပါဝင်ပါတယ်။ state ကို (Board, energy, fatigue) အဖြစ် tuple အနေနဲ့ ကိုယ်တိုင်ဖော်ပြနိုင်ပါတယ်၊ ဒါမှမဟုတ် state အတွက် class တစ်ခုကို သတ်မှတ်နိုင်ပါတယ် (သို့မဟုတ် `Board` မှ ဆင်းသက်ထားတဲ့ class ကို ဖန်တီးနိုင်ပါတယ်)၊ ဒါမှမဟုတ် မူရင်း `Board` class ကို [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py) မှာ ပြင်ဆင်နိုင်ပါတယ်။ + +သင့်ရဲ့ ဖြေရှင်းချက်မှာ random walk strategy အတွက် code ကို ထားရှိပါ၊ နောက်ဆုံးမှာ သင့် algorithm နဲ့ random walk ရဲ့ ရလဒ်ကို နှိုင်းယှဉ်ပါ။ + +> **Note**: သင့် algorithm ကို အလုပ်လုပ်စေဖို့ hyperparameters တွေကို ပြင်ဆင်ဖို့ လိုအပ်နိုင်ပါတယ်၊ အထူးသဖြင့် epochs အရေအတွက်ကို။ ကမ္ဘာရဲ့ အောင်မြင်မှု (ဝက်ဝံနဲ့ တိုက်ခိုက်မှု) ဟာ ရှားပါးတဲ့ အဖြစ်အပျက်ဖြစ်တဲ့အတွက် သင့်ရဲ့ training time ဟာ ပိုကြာမြင့်နိုင်ပါတယ်။ + +## အဆင့်သတ်မှတ်ချက် + +| စံနှုန်း | အထူးကောင်းမွန် | လုံလောက်သော | တိုးတက်မှုလိုအပ်သည် | +| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| | notebook တစ်ခုကို အသစ်သော ကမ္ဘာစည်းကမ်းများ၊ Q-Learning algorithm နဲ့ အချို့သော စာသားရှင်းလင်းချက်များနဲ့တင်ပြထားသည်။ Q-Learning ဟာ random walk နဲ့ နှိုင်းယှဉ်ပြီး ရလဒ်ကို အထူးကောင်းမွန်စွာ တိုးတက်စေသည်။ | notebook တစ်ခုကို တင်ပြထားပြီး၊ Q-Learning ကို အကောင်အထည်ဖော်ထားပြီး random walk နဲ့ နှိုင်းယှဉ်ပြီး ရလဒ်ကို တိုးတက်စေသည်၊ သို့သော် အထူးကောင်းမွန်မှုမရှိပါ။ ဒါမှမဟုတ် notebook ဟာ documentation မလုံလောက်ပါ၊ code ဟာ အဆင့်မပြေပါ။ | ကမ္ဘာစည်းကမ်းအသစ်များကို ပြန်လည်သတ်မှတ်ရန် ကြိုးစားမှုများပြုလုပ်ထားသော်လည်း Q-Learning algorithm ဟာ အလုပ်မလုပ်ပါ၊ ဒါမှမဟုတ် reward function ဟာ အပြည့်အစုံမသတ်မှတ်ထားပါ။ | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/8-Reinforcement/1-QLearning/solution/Julia/README.md b/translations/my/8-Reinforcement/1-QLearning/solution/Julia/README.md new file mode 100644 index 00000000..48379f58 --- /dev/null +++ b/translations/my/8-Reinforcement/1-QLearning/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/8-Reinforcement/1-QLearning/solution/R/README.md b/translations/my/8-Reinforcement/1-QLearning/solution/R/README.md new file mode 100644 index 00000000..7ab80b90 --- /dev/null +++ b/translations/my/8-Reinforcement/1-QLearning/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသောအချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/8-Reinforcement/2-Gym/README.md b/translations/my/8-Reinforcement/2-Gym/README.md new file mode 100644 index 00000000..bb30cb48 --- /dev/null +++ b/translations/my/8-Reinforcement/2-Gym/README.md @@ -0,0 +1,349 @@ + +# ကတ်ပိုးလ် စကိတ်စီးခြင်း + +ယခင်သင်ခန်းစာတွင် ကျွန်ုပ်တို့ဖြေရှင်းခဲ့သော ပြဿနာသည် အလွန်ရိုးရှင်းသော ပြဿနာတစ်ခုဖြစ်ပြီး၊ အမှန်တကယ်ဘဝတွင် အသုံးမဝင်နိုင်သလို ထင်ရနိုင်ပါသည်။ သို့သော် အမှန်တကယ်ဘဝရှိ ပြဿနာများစွာသည်လည်း ယင်းအခြေအနေနှင့် ဆင်တူပါသည် - ဥပမာ Chess သို့မဟုတ် Go ကစားခြင်းတို့ပါဝင်သည်။ ၎င်းတို့သည် ဆင်တူသည်မှာ ကျွန်ုပ်တို့တွင် စည်းမျဉ်းများနှင့် **Discrete State** ပါဝင်သော ဘုတ်အဖွဲ့တစ်ခုရှိသောကြောင့်ဖြစ်သည်။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## အကျဉ်းချုပ် + +ဒီသင်ခန်းစာမှာ ကျွန်ုပ်တို့ Q-Learning ၏ အခြေခံအချက်များကို **Continuous State** (တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော အမှန်တကယ်ဂဏန်းများဖြင့် ဖော်ပြထားသော state) တွင် အသုံးပြုမည်ဖြစ်သည်။ ကျွန်ုပ်တို့သည် အောက်ပါပြဿနာကို ကိုင်တွယ်မည်ဖြစ်သည် - + +> **ပြဿနာ**: Peter သည် ဝက်ဝံမှ လွတ်မြောက်ရန် ပိုမိုမြန်ဆန်စွာ ရွေ့လျားနိုင်ရမည်။ Q-Learning ကို အသုံးပြု၍ Peter သည် စကိတ်စီးခြင်းကို, အထူးသဖြင့် တိုင်းတာမှုကို ထိန်းသိမ်းရန် လေ့လာနိုင်ပုံကို ကြည့်ရှုမည်။ + +![The great escape!](../../../../8-Reinforcement/2-Gym/images/escape.png) + +> ဝက်ဝံမှ လွတ်မြောက်ရန် Peter နှင့် သူ၏ မိတ်ဆွေများသည် ဖန်တီးမှုအပြည့်အဝဖြစ်နေသည်! ပုံ - [Jen Looper](https://twitter.com/jenlooper) + +ကျွန်ုပ်တို့သည် **CartPole** ပြဿနာအဖြစ် သိရှိထားသော တိုင်းတာမှုကို ထိန်းသိမ်းရန် ရိုးရှင်းသော ဗားရှင်းကို အသုံးပြုမည်။ CartPole ကမ္ဘာတွင်, ကျွန်ုပ်တို့တွင် ဘယ်ဘက် သို့မဟုတ် ညာဘက်သို့ ရွေ့လျားနိုင်သော အလျားလိုက် slider တစ်ခုရှိပြီး, ရည်မှန်းချက်မှာ slider အပေါ်တွင် တည်နေသော တိုင်တစ်ခုကို ထိန်းသိမ်းရန်ဖြစ်သည်။ + +## လိုအပ်ချက်များ + +ဒီသင်ခန်းစာတွင်, **OpenAI Gym** ဟုခေါ်သော စာကြည့်တိုက်ကို အသုံးပြု၍ အမျိုးမျိုးသော **ပတ်ဝန်းကျင်များ** ကို အတုယူမည်။ သင်ဤသင်ခန်းစာ၏ ကုဒ်ကို ဒေသတွင်းတွင် (ဥပမာ Visual Studio Code မှ) အလုပ်လည်နိုင်ပြီး, simulation သည် ပြတင်းပေါ်တွင် ဖွင့်လှစ်မည်ဖြစ်သည်။ အွန်လိုင်းတွင် ကုဒ်ကို အလုပ်လည်စေရန်, [ဒီမှာ](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7) ဖော်ပြထားသည့်အတိုင်း အချို့ပြင်ဆင်မှုများ လိုအပ်နိုင်သည်။ + +## OpenAI Gym + +ယခင်သင်ခန်းစာတွင်, ကစားပွဲ၏ စည်းမျဉ်းများနှင့် state ကို ကျွန်ုပ်တို့ကိုယ်တိုင် သတ်မှတ်ထားသော `Board` class မှပေးထားသည်။ ဒီနေရာမှာတော့, **simulation environment** အထူးတစ်ခုကို အသုံးပြုမည်ဖြစ်ပြီး, ၎င်းသည် တိုင်ကို ထိန်းသိမ်းရန် ရူပဗေဒကို အတုယူမည်။ reinforcement learning algorithm များကို လေ့ကျင့်ရန် အများဆုံးအသုံးပြုသော simulation environment တစ်ခုမှာ [Gym](https://gym.openai.com/) ဖြစ်ပြီး, ၎င်းကို [OpenAI](https://openai.com/) မှ ထိန်းသိမ်းထားသည်။ Gym ကို အသုံးပြုခြင်းဖြင့်, cartpole simulation မှ Atari ဂိမ်းများအထိ အမျိုးမျိုးသော **ပတ်ဝန်းကျင်များ** ကို ဖန်တီးနိုင်သည်။ + +> **မှတ်ချက်**: OpenAI Gym မှ ရရှိနိုင်သော အခြားသော ပတ်ဝန်းကျင်များကို [ဒီမှာ](https://gym.openai.com/envs/#classic_control) ကြည့်ရှုနိုင်သည်။ + +ပထမဦးစွာ, gym ကို install လုပ်ပြီး လိုအပ်သော စာကြည့်တိုက်များကို import လုပ်ပါ (code block 1): + +```python +import sys +!{sys.executable} -m pip install gym + +import gym +import matplotlib.pyplot as plt +import numpy as np +import random +``` + +## လေ့ကျင့်မှု - cartpole ပတ်ဝန်းကျင်ကို initialize လုပ်ပါ + +Cartpole တိုင်ထိန်းသိမ်းမှု ပြဿနာကို ကိုင်တွယ်ရန်, သက်ဆိုင်ရာ ပတ်ဝန်းကျင်ကို initialize လုပ်ရန် လိုအပ်သည်။ ပတ်ဝန်းကျင်တစ်ခုစီသည် အောက်ပါအရာများနှင့် ဆက်စပ်သည် - + +- **Observation space**: ပတ်ဝန်းကျင်မှ ရရှိသော အချက်အလက်၏ ဖွဲ့စည်းမှုကို သတ်မှတ်သည်။ Cartpole ပြဿနာအတွက်, တိုင်၏ တည်နေရာ, အရှိန်နှင့် အခြားတန်ဖိုးများကို ရရှိသည်။ + +- **Action space**: ဖြစ်နိုင်သော လုပ်ဆောင်မှုများကို သတ်မှတ်သည်။ ကျွန်ုပ်တို့၏ အမှုအတွက်, action space သည် discrete ဖြစ်ပြီး, **ဘယ်ဘက်** နှင့် **ညာဘက်** ဆိုသော လုပ်ဆောင်မှုနှစ်ခုပါဝင်သည်။ (code block 2) + +1. Initialize လုပ်ရန်, အောက်ပါကုဒ်ကို ရိုက်ထည့်ပါ: + + ```python + env = gym.make("CartPole-v1") + print(env.action_space) + print(env.observation_space) + print(env.action_space.sample()) + ``` + +ပတ်ဝန်းကျင်သည် မည်သို့အလုပ်လုပ်သည်ကို ကြည့်ရန်, 100 ခြေလှမ်းအတွက် simulation တစ်ခုကို အတိုချုပ်ပြုလုပ်ပါ။ ခြေလှမ်းတစ်ခုစီတွင်, ကျွန်ုပ်တို့သည် လုပ်ဆောင်ရန် လုပ်ဆောင်မှုတစ်ခုကို ပေးရမည် - ဒီ simulation တွင် ကျွန်ုပ်တို့သည် `action_space` မှ လုပ်ဆောင်မှုတစ်ခုကို အလွတ်ရွေးချယ်သည်။ + +1. အောက်ပါကုဒ်ကို အလုပ်လည်စေပြီး, ၎င်းက ဘာဖြစ်လာမည်ကို ကြည့်ပါ။ + + ✅ ဒီကုဒ်ကို ဒေသတွင်း Python installation တွင် အလုပ်လည်စေရန် အကြံပြုသည်! (code block 3) + + ```python + env.reset() + + for i in range(100): + env.render() + env.step(env.action_space.sample()) + env.close() + ``` + + သင်သည် အောက်ပါပုံနှင့် ဆင်တူသော အရာကို မြင်ရမည် - + + ![non-balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) + +1. Simulation အတွင်း, လုပ်ဆောင်ရန် ဆုံးဖြတ်ရန် observation များကို ရယူရန် လိုအပ်သည်။ အမှန်တကယ်, step function သည် လက်ရှိ observation များ, reward function နှင့် simulation ကို ဆက်လက်လုပ်ဆောင်ရန် make sense ဖြစ်မဖြစ်ကို ပြသသော done flag ကို ပြန်ပေးသည်။ (code block 4) + + ```python + env.reset() + + done = False + while not done: + env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + print(f"{obs} -> {rew}") + env.close() + ``` + + သင်သည် notebook output တွင် အောက်ပါအတိုင်း အရာတစ်ခုကို မြင်ရမည် - + + ```text + [ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0 + [ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0 + [ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0 + [ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0 + [ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0 + ... + [ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0 + [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0 + ``` + + Simulation ၏ ခြေလှမ်းတစ်ခုစီတွင် ပြန်ပေးသော observation vector တွင် အောက်ပါတန်ဖိုးများပါဝင်သည် - + - ကတ်၏ တည်နေရာ + - ကတ်၏ အရှိန် + - တိုင်၏ ထောင့် + - တိုင်၏ လည်ပတ်နှုန်း + +1. အဲဒီတန်ဖိုးများ၏ အနိမ့်နှင့် အမြင့်တန်ဖိုးကို ရယူပါ - (code block 5) + + ```python + print(env.observation_space.low) + print(env.observation_space.high) + ``` + + သင်သည် simulation ခြေလှမ်းတစ်ခုစီတွင် reward တန်ဖိုးသည် အမြဲ 1 ဖြစ်နေသည်ကိုလည်း သတိပြုမိနိုင်သည်။ ၎င်းသည် ကျွန်ုပ်တို့၏ ရည်မှန်းချက်မှာ အချိန်အတော်ကြာအထိ အသက်ရှင်နေခြင်းဖြစ်သောကြောင့်ဖြစ်သည်၊ အတည်တကျ တိုင်ကို တည်နေရာမှန်ကန်စွာ ထိန်းသိမ်းထားရန်ဖြစ်သည်။ + + ✅ အမှန်တကယ်, CartPole simulation ကို 100 ကြိမ်ဆက်တိုက် စမ်းသပ်မှုများအတွင်း 195 အထက်ရှိ ပျမ်းမျှ reward ရရှိနိုင်ပါက ဖြေရှင်းပြီးဖြစ်သည်ဟု သတ်မှတ်သည်။ + +## State Discretization + +Q-Learning တွင်, state တစ်ခုစီတွင် ဘာလုပ်ရမည်ကို သတ်မှတ်ထားသော Q-Table တစ်ခုကို တည်ဆောက်ရန် လိုအပ်သည်။ ၎င်းကို ပြုလုပ်နိုင်ရန်, state သည် **discrete** ဖြစ်ရမည်၊ ပိုမိုတိကျစွာဆိုရမည်ဆိုပါက, ၎င်းသည် discrete တန်ဖိုးများ အနည်းငယ်သာ ပါဝင်ရမည်။ ထို့ကြောင့်, observation များကို **discretize** ပြုလုပ်ပြီး, ၎င်းတို့ကို discrete state များအဖြစ် သတ်မှတ်ရန် လိုအပ်သည်။ + +ဒီအတွက် ကျွန်ုပ်တို့မှာ အနည်းဆုံးနည်းလမ်းနှစ်ခုရှိသည် - + +- **Bins အဖြစ် ခွဲခြားခြင်း**: တန်ဖိုးတစ်ခု၏ အကွာအဝေးကို သိပါက, ၎င်းကို **bins** အရေအတွက်တစ်ခုအဖြင့် ခွဲခြားနိုင်ပြီး, ထို့နောက် ၎င်းတန်ဖိုးကို ၎င်းပါဝင်သော bin အမှတ်ဖြင့် အစားထိုးနိုင်သည်။ ၎င်းကို numpy [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) method ကို အသုံးပြု၍ ပြုလုပ်နိုင်သည်။ + +✅ Linear interpolation ကို အသုံးပြု၍ တန်ဖိုးများကို သတ်မှတ်ထားသော အကွာအဝေး (ဥပမာ -20 မှ 20) သို့ ဆွဲဆောင်ပြီး, ထို့နောက် အနီးဆုံး integer သို့ ပြောင်းနိုင်သည်။ + +ဒီဥပမာတွင်, ကျွန်ုပ်တို့သည် ဒုတိယနည်းလမ်းကို အသုံးပြုမည်။ ၎င်းကို နောက်ပိုင်းတွင် သတိပြုမိနိုင်သလို, အကွာအဝေးမသတ်မှတ်ထားသော တန်ဖိုးများသည် အလွန်ရှားပါးသောကြောင့်, အလွန်ရှားပါးသော state များသာ ဖြစ်ပေါ်မည်။ + +1. ကျွန်ုပ်တို့၏ မော်ဒယ်မှ observation ကို ယူပြီး, 4 ခုသော integer တန်ဖိုးများ၏ tuple ကို ထုတ်ပေးမည့် function ကို အောက်တွင် ဖော်ပြထားသည် - (code block 6) + + ```python + def discretize(x): + return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int)) + ``` + +1. Bins အသုံးပြု၍ discretization နည်းလမ်းတစ်ခုကိုလည်း စမ်းကြည့်ပါ - (code block 7) + + ```python + def create_bins(i,num): + return np.arange(num+1)*(i[1]-i[0])/num+i[0] + + 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 + 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. ယခု simulation အတိုချုပ်တစ်ခုကို အလုပ်လည်စေပြီး, discrete environment တန်ဖိုးများကို ကြည့်ရှုပါ။ `discretize` နှင့် `discretize_bins` နှစ်ခုစလုံးကို စမ်းကြည့်ပြီး, မည်သည့်ကွာခြားချက်ရှိသည်ကို ကြည့်ပါ။ + + ✅ `discretize_bins` သည် bin အမှတ်ကို ပြန်ပေးသည်, ၎င်းသည် 0-based ဖြစ်သည်။ `discretize` တွင်, output တန်ဖိုးများ၏ အကွာအဝေးကို ဂရုမစိုက်ဘဲ, 0 သည် 0 ကို ကိုယ်စားပြုသည်။ (code block 8) + + ```python + env.reset() + + done = False + while not done: + #env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + #print(discretize_bins(obs)) + print(discretize(obs)) + env.close() + ``` + + ✅ ပတ်ဝန်းကျင်အလုပ်လုပ်ပုံကို ကြည့်လိုပါက, `env.render` ဖြင့် စတန်းထားသောလိုင်းကို uncomment လုပ်ပါ။ + +## Q-Table ဖွဲ့စည်းမှု + +ယခင်သင်ခန်းစာတွင်, state သည် 0 မှ 8 အတွင်းရှိ နံပါတ်နှစ်ခုဖြစ်ပြီး, Q-Table ကို 8x8x2 အရွယ်အစားရှိ numpy tensor ဖြင့် ကိုယ်စားပြုရန် အဆင်ပြေသည်။ Bins discretization ကို အသုံးပြုပါက, state vector ၏ အရွယ်အစားကိုလည်း သိနိုင်ပြီး, 20x20x10x10x2 အရွယ်အစားရှိ array ဖြင့် state ကို ကိုယ်စားပြုနိုင်သည်။ + +သို့သော်, observation space ၏ တိကျသော အရွယ်အစားကို မသိနိုင်သောအခါလည်း ရှိသည်။ `discretize` function ၏ အမှုအတွက်, state သည် သတ်မှတ်ထားသော အကွာအဝေးအတွင်းသာ ရှိနေမည်ဟု သေချာမရနိုင်ပါ။ ထို့ကြောင့်, Q-Table ကို dictionary ဖြင့် ကိုယ်စားပြုမည်။ + +1. *(state, action)* ကို dictionary key အဖြစ် အသုံးပြုပြီး, value သည် Q-Table entry value ကို ကိုယ်စားပြုမည်။ (code block 9) + + ```python + Q = {} + actions = (0,1) + + def qvalues(state): + return [Q.get((state,a),0) for a in actions] + ``` + + ဒီနေရာမှာ, `qvalues()` function ကိုလည်း သတ်မှတ်ထားပြီး, state တစ်ခုအတွက် Q-Table တန်ဖိုးများကို ပြန်ပေးသည်။ + +## Q-Learning စတင်ကြရအောင် + +ယခု Peter ကို တိုင်ထိန်းသိမ်းရန် သင်ကြားရန် ပြင်ဆင်ပြီးပြီ! + +1. ပထမဦးစွာ, အချို့သော hyperparameters ကို သတ်မှတ်ပါ - (code block 10) + + ```python + # hyperparameters + alpha = 0.3 + gamma = 0.9 + epsilon = 0.90 + ``` + + ဒီနေရာမှာ, `alpha` သည် **learning rate** ဖြစ်ပြီး, Q-Table ၏ လက်ရှိတန်ဖိုးများကို ချိန်ညှိရန် အတိုင်းအတာကို သတ်မှတ်သည်။ `gamma` သည် **discount factor** ဖြစ်ပြီး, အနာဂတ် reward ကို ပိုမိုဦးစားပေးရန် သတ်မှတ်သည်။ `epsilon` သည် **exploration/exploitation factor** ဖြစ်ပြီး, random action နှင့် Q-Table အရ next action ကို ရွေးချယ်ရန် ရွေးချယ်မှုကို သတ်မှတ်သည်။ + + ✅ Balancing အရ random action (exploration) သည် မှားယွင်းသော ဦးတည်ချက်သို့ random punch တစ်ခုအဖြစ် လုပ်ဆောင်မည်။ + +### Algorithm ကို တိုးတက်အောင် ပြုလုပ်ပါ + +ယခင်သင်ခန်းစာမှ algorithm ကို အောက်ပါအတိုင်း တိုးတက်အောင် ပြုလုပ်နိုင်သည် - + +- **ပျမ်းမျှ cumulative reward ကိုတွက်ချက်ပါ**: 5000 ကြိမ် iteration အတွင်း cumulative reward ကို ပျမ်းမျှတွက်ချက်ပြီး, 195 အထက်ရရှိပါက, ပြဿနာကို ဖြေရှင်းပြီးဖြစ်သည်ဟု သတ်မှတ်နိုင်သည်။ + +- **အများဆုံး cumulative result ကိုတွက်ချက်ပါ**: `Qmax` ကိုတွက်ချက်ပြီး, Q-Table ၏ အကောင်းဆုံးမော်ဒယ်ကို သိမ်းဆည်းပါ။ + +1. Simulation တစ်ခုစီတွင် cumulative rewards ကို `rewards` vector တွင် စုဆောင်းပါ - (code block 11) + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + + Qmax = 0 + cum_rewards = [] + rewards = [] + for epoch in range(100000): + obs = env.reset() + done = False + cum_reward=0 + # == do the simulation == + while not done: + s = discretize(obs) + if random.random() Qmax: + Qmax = np.average(cum_rewards) + Qbest = Q + cum_rewards=[] + ``` + +ဒီရလဒ်များမှ သတိပြုနိုင်သောအရာများ - + +- **ရည်မှန်းချက်အနီး**: 195 cumulative rewards ရရှိရန် အနီးကပ်ဖြစ်နေသည်။ + +- **Reward ကျဆင်းမှု**: Reward ကျဆင်းမှုသည် Q-Table ၏ ရှိပြီးသားတန်ဖိုးများကို ပျက်စီးစေနိုင်သည်။ + +ဒီအချက်ကို training progress ကို plot လုပ်ပါက ပိုမိုရှင်းလင်းစေမည်။ + +## Training Progress ကို Plot လုပ်ခြင်း + +Training အတွင်း, cumulative reward တန်ဖိုးကို `rewards` vector တွင် စုဆောင်းထားသည်။ Iteration နံပါတ်နှင့်အတူ plot လုပ်ပါက - + +```python +plt.plot(rewards) +``` + +![raw progress](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png) + +ဒီ graph မှ အချက်အလက်မရနိုင်ပါ, stochastic training process ၏ သဘာဝကြောင့် ဖြစ်သည်။ + +Running average ကိုတွက်ချက်ပြီး, graph ကို ပိုမိုရှင်းလင်းစေရန် - + +```python +def running_average(x,window): + return np.convolve(x,np.ones(window)/window,mode='valid') + +plt.plot(running_average(rewards,100)) +``` + +![training progress](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png) + +## Hyperparameters ကို ပြောင်းလဲခြင်း + +Learning ကို ပိုမိုတည်ငြိမ်စေရန်, training အတွင်း hyperparameters အချို့ကို ပြောင်းလဲရန် make sense ဖြစ်သည်။ အထူးသဖြင့် - + +- **Learning rate (`alpha`)**: 1 အနီးမှ စတင်ပြီး, အချိန်နှင့်အမျှ တဖြည်းဖြည်းလျော့ချနိုင်သည်။ + +- **Epsilon ကို တိုးချဲ့ပါ**: Exploration ကို လျော့ချပြီး, exploitation ကို ပိုမိုလုပ်ဆောင်ရန် `epsilon` ကို တဖြည်းဖြည်းတိုးချဲ့နိုင်သည်။ +> **အလုပ် ၁**: ဟိုက်ပါပါမီတာတန်ဖိုးများကို ပြောင်းလဲကစားကြည့်ပြီး ပိုမိုမြင့်မားသော စုစုပေါင်းဆုရမှတ်ကို ရရှိနိုင်မလား ကြည့်ပါ။ သင် ၁၉၅ အထက်ရရှိနေတာရှိပါသလား? +> **Task 2**: ပြဿနာကို တရားဝင်ဖြေရှင်းနိုင်ရန် 100 ကြိမ်ဆက်တိုက် လည်ပတ်မှုများအတွက် 195 အလယ်အလတ်ဆုလာဘ်ရမှတ်ကို ရရှိရမည်။ လေ့ကျင့်မှုအတွင်း၌ ထိုရလဒ်ကိုတိုင်းတာပြီး ပြဿနာကို တရားဝင်ဖြေရှင်းနိုင်ကြောင်း သေချာစေပါ။ + +## ရလဒ်ကို လက်တွေ့ကြည့်ရှုခြင်း + +လေ့ကျင့်ပြီးသော မော်ဒယ်၏ အပြုအမူကို လက်တွေ့ကြည့်ရှုရတာ စိတ်ဝင်စားဖွယ်ဖြစ်မည်။ စမ်းသပ်မှုကို လည်ပတ်ပြီး Q-Table အတွင်းရှိ probability distribution အတိုင်း လေ့ကျင့်မှုအတွင်း အသုံးပြုခဲ့သည့် အလားတူသော လုပ်ဆောင်မှုရွေးချယ်မှု မဟာဗျူဟာကို လိုက်နာကြည့်ပါ။ (code block 13) + +```python +obs = env.reset() +done = False +while not done: + s = discretize(obs) + env.render() + v = probs(np.array(qvalues(s))) + a = random.choices(actions,weights=v)[0] + obs,_,done,_ = env.step(a) +env.close() +``` + +သင်သည် အောက်ပါအတိုင်း တစ်စုံတစ်ရာကို မြင်ရမည်ဖြစ်သည်- + +![a balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) + +--- + +## 🚀စိန်ခေါ်မှု + +> **Task 3**: ဒီနေရာမှာတော့ Q-Table ၏ နောက်ဆုံးမိတ္တူကို အသုံးပြုခဲ့ပြီးဖြစ်သည်၊ ဒါပေမယ့် အကောင်းဆုံးမဟုတ်နိုင်ပါ။ သတိပြုပါ၊ အကောင်းဆုံးလုပ်ဆောင်မှုရ Q-Table ကို `Qbest` variable ထဲသို့ သိမ်းဆည်းထားပြီးဖြစ်သည်! `Qbest` ကို `Q` ထဲသို့ ကူးယူပြီး အကောင်းဆုံး Q-Table ဖြင့် ထိုနမူနာကို ထပ်မံစမ်းသပ်ကြည့်ပါ၊ ကွာခြားချက်ကို သတိပြုမိပါက မှတ်သားပါ။ + +> **Task 4**: ဒီနေရာမှာတော့ အဆင့်တိုင်းမှာ အကောင်းဆုံးလုပ်ဆောင်မှုကို ရွေးချယ်ခြင်းမဟုတ်ဘဲ၊ probability distribution နှင့် ကိုက်ညီသော လုပ်ဆောင်မှုကို ရွေးချယ်ခဲ့ပါသည်။ Q-Table ရဲ့ အမြင့်ဆုံးတန်ဖိုးကို ကိုယ်စားပြုသော လုပ်ဆောင်မှုကို အမြဲရွေးချယ်ခြင်းက ပို make sense ဖြစ်မည်မဟုတ်လား? ဒါကို `np.argmax` function ကို အသုံးပြု၍ Q-Table ရဲ့ အမြင့်ဆုံးတန်ဖိုးနှင့် ကိုက်ညီသော လုပ်ဆောင်မှုနံပါတ်ကို ရှာဖွေပြီး အကောင်အထည်ဖော်နိုင်သည်။ ဒီမဟာဗျူဟာကို အကောင်အထည်ဖော်ပြီး balancing ကို တိုးတက်စေမလား စမ်းသပ်ကြည့်ပါ။ + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## လုပ်ငန်းတာဝန် +[Train a Mountain Car](assignment.md) + +## နိဂုံးချုပ် + +ယခုအခါတွင် သင်သည် ဆုလာဘ် function တစ်ခုကို ပေးခြင်းဖြင့်၊ ဂိမ်း၏ လိုအပ်သောအခြေအနေကို သတ်မှတ်ပေးခြင်းဖြင့်၊ ထိုအခြေအနေကို ရှာဖွေစူးစမ်းရန် အခွင့်အရေးပေးခြင်းဖြင့် အေးဂျင့်များကို ကောင်းမွန်သောရလဒ်များရရှိအောင် လေ့ကျင့်ပေးနိုင်သည်ကို သင်ယူပြီးဖြစ်သည်။ Q-Learning algorithm ကို discrete နှင့် continuous environment များတွင်၊ သို့သော် discrete actions များဖြင့် အောင်မြင်စွာ အသုံးပြုနိုင်ခဲ့ပါသည်။ + +သို့သော်လည်း၊ action state သည် continuous ဖြစ်သည့်အခြေအနေများနှင့် observation space သည် ပိုမိုရှုပ်ထွေးသော အခြေအနေများကိုလည်း လေ့လာရန် အရေးကြီးပါသည်၊ ဥပမာ Atari ဂိမ်း screen မှ ရရှိသော ပုံရိပ်များကဲ့သို့။ ထိုပြဿနာများတွင် ကောင်းမွန်သောရလဒ်များရရှိရန် အားကောင်းသော machine learning နည်းလမ်းများ၊ neural networks ကဲ့သို့သော နည်းလမ်းများကို အသုံးပြုရန် လိုအပ်ပါသည်။ ထို advanced အကြောင်းအရာများသည် ကျွန်ုပ်တို့၏ လာမည့် အဆင့်မြင့် AI သင်တန်း၏ အကြောင်းအရာများဖြစ်ပါသည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သိရှိထားပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူသားပညာရှင်များမှ ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/8-Reinforcement/2-Gym/assignment.md b/translations/my/8-Reinforcement/2-Gym/assignment.md new file mode 100644 index 00000000..11957c0a --- /dev/null +++ b/translations/my/8-Reinforcement/2-Gym/assignment.md @@ -0,0 +1,57 @@ + +# တောင်တက်ကားကို လေ့ကျင့်ပါ + +[OpenAI Gym](http://gym.openai.com) ကို အားလုံးတူညီသော API - `reset`, `step` နှင့် `render` method များနှင့် **action space** နှင့် **observation space** အတွက် တူညီသော အခြေခံအဆင့်များကို ပံ့ပိုးပေးသော ပုံစံဖြင့် ဖန်တီးထားသည်။ ထို့ကြောင့် reinforcement learning algorithm များကို အခြေခံကုဒ်ပြောင်းလဲမှု အနည်းငယ်ဖြင့် အခြားသော environment များတွင် လွယ်ကူစွာ အသုံးပြုနိုင်သည်။ + +## တောင်တက်ကား Environment + +[Mountain Car environment](https://gym.openai.com/envs/MountainCar-v0/) တွင် ကားတစ်စီးသည် တောင်ကြားတွင် ပိတ်မိနေသည်။ + +အဓိကရည်ရွယ်ချက်မှာ တောင်ကြားမှ ထွက်ပြီး အလံကို ဖမ်းယူရန်ဖြစ်ပြီး၊ အောက်ပါ လုပ်ဆောင်ချက်များကို တစ်ဆင့်ချင်းလုပ်ဆောင်ရမည်။ + +| တန်ဖိုး | အဓိပ္ပါယ် | +|---|---| +| 0 | ဘယ်ဘက်သို့ အရှိန်မြှင့်ပါ | +| 1 | အရှိန်မမြှင့်ပါနှင့် | +| 2 | ညာဘက်သို့ အရှိန်မြှင့်ပါ | + +ဒီပြဿနာရဲ့ အဓိကလှည့်ကွက်ကတော့ ကားရဲ့ engine က တစ်ကြိမ်တည်းနဲ့ တောင်ကို တက်နိုင်အောင် အားကောင်းမနေပါဘူး။ ထို့ကြောင့် အောင်မြင်ရန် တစ်ခုတည်းသော နည်းလမ်းမှာ အရှိန်တိုးဖို့အတွက် နောက်ပြန်နှင့်ရှေ့ပြန် မောင်းရမည်ဖြစ်သည်။ + +Observation space တွင် တန်ဖိုးနှစ်ခုသာ ပါဝင်သည်။ + +| နံပါတ် | Observation | အနည်းဆုံး | အများဆုံး | +|-----|--------------|-----|-----| +| 0 | ကားတည်နေရာ | -1.2| 0.6 | +| 1 | ကားအရှိန် | -0.07 | 0.07 | + +တောင်တက်ကားအတွက် Reward system က အတော်လှည့်ကွက်များပါဝင်သည်။ + + * အကယ်၍ agent သည် တောင်ထိပ်ရှိ အလံ (position = 0.5) ကို ရောက်ရှိနိုင်ပါက Reward 0 ကို ချီးမြှင့်သည်။ + * အကယ်၍ agent ၏ တည်နေရာသည် 0.5 ထက် နည်းပါက Reward -1 ကို ချီးမြှင့်သည်။ + +Episode သည် ကားတည်နေရာသည် 0.5 ထက် များသောအခါ၊ သို့မဟုတ် episode အရှည်သည် 200 ထက် များသောအခါ အဆုံးသတ်သည်။ + +## လမ်းညွှန်ချက်များ + +တောင်တက်ကားပြဿနာကို ဖြေရှင်းရန် reinforcement learning algorithm ကို ပြောင်းလဲအသုံးပြုပါ။ ရှိပြီးသား [notebook.ipynb](../../../../8-Reinforcement/2-Gym/notebook.ipynb) code ကို စတင်ပြီး၊ environment အသစ်ကို အစားထိုးပါ၊ state discretization function များကို ပြောင်းလဲပါ၊ ရှိပြီးသား algorithm ကို အနည်းငယ်သော code ပြောင်းလဲမှုဖြင့် လေ့ကျင့်နိုင်ရန် ကြိုးစားပါ။ Hyperparameter များကို ပြင်ဆင်ခြင်းဖြင့် ရလဒ်ကို အကောင်းဆုံးဖြစ်အောင် လုပ်ဆောင်ပါ။ + +> **Note**: Algorithm ကို convergence ဖြစ်အောင် Hyperparameter များကို ပြင်ဆင်ရန် လိုအပ်နိုင်သည်။ + +## အဆင့်သတ်မှတ်ချက် + +| အဆင့်သတ်မှတ်ချက် | ထူးချွန် | လုံလောက် | တိုးတက်မှုလိုအပ် | +| -------- | --------- | -------- | ----------------- | +| | Q-Learning algorithm ကို CartPole ဥပမာမှ အနည်းငယ်သော code ပြောင်းလဲမှုဖြင့် အောင်မြင်စွာ ပြောင်းလဲအသုံးပြုပြီး၊ တောင်ထိပ်တွင် အလံကို 200 ဆင့်အတွင်း ဖမ်းယူနိုင်သော ပြဿနာကို ဖြေရှင်းနိုင်သည်။ | အင်တာနက်မှ Q-Learning algorithm အသစ်ကို ယူပြီး documentation ကောင်းစွာရေးသားထားသည်။ သို့မဟုတ် ရှိပြီးသား algorithm ကို အသုံးပြုထားပြီး၊ ရလဒ်လိုအပ်ချက်များကို မရောက်ရှိနိုင်ပါ။ | ကျောင်းသားသည် algorithm တစ်ခုကို အောင်မြင်စွာ အသုံးပြုနိုင်ခြင်း မရှိသော်လည်း၊ ဖြေရှင်းရန် အရေးကြီးသော အဆင့်များ (state discretization, Q-Table data structure စသည်တို့) ကို အကောင်အထည်ဖော်ထားသည်။ | + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်ကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/8-Reinforcement/2-Gym/solution/Julia/README.md b/translations/my/8-Reinforcement/2-Gym/solution/Julia/README.md new file mode 100644 index 00000000..cf1b5a11 --- /dev/null +++ b/translations/my/8-Reinforcement/2-Gym/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/8-Reinforcement/2-Gym/solution/R/README.md b/translations/my/8-Reinforcement/2-Gym/solution/R/README.md new file mode 100644 index 00000000..3af27bf3 --- /dev/null +++ b/translations/my/8-Reinforcement/2-Gym/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/8-Reinforcement/README.md b/translations/my/8-Reinforcement/README.md new file mode 100644 index 00000000..963928be --- /dev/null +++ b/translations/my/8-Reinforcement/README.md @@ -0,0 +1,67 @@ + +# reinforcement learning အကြောင်းမိတ်ဆက် + +Reinforcement learning (RL) သည် supervised learning နှင့် unsupervised learning အနောက်တွင် machine learning ရဲ့ အခြေခံ paradigm တစ်ခုအဖြစ်လေ့လာခံရသော နည်းလမ်းတစ်ခုဖြစ်သည်။ RL သည် ဆုံးဖြတ်ချက်များနှင့်ပတ်သက်ပြီးဖြစ်သည်။ မှန်ကန်သော ဆုံးဖြတ်ချက်များပေးခြင်း သို့မဟုတ် အနည်းဆုံး အဲဒီဆုံးဖြတ်ချက်များမှ သင်ယူခြင်းကို အဓိကထားသည်။ + +သင် stock market ကဲ့သို့သော simulation environment တစ်ခုရှိသည်ဟု စဉ်းစားပါ။ သတ်မှတ်ထားသော regulation တစ်ခုကို ထည့်သွင်းလိုက်ရင် ဘာဖြစ်မလဲ? အဲဒါက အကျိုးသက်ရောက်မှုက အကောင်းတစ်ခုလား၊ အဆိုးတစ်ခုလား? အဆိုးတစ်ခုဖြစ်လာရင် _negative reinforcement_ ကို သင်ယူပြီး လမ်းကြောင်းပြောင်းဖို့လိုအပ်သည်။ အကောင်းတစ်ခုဖြစ်လာရင် _positive reinforcement_ ကို အခြေခံပြီး ဆက်လက်တိုးတက်ဖို့လိုအပ်သည်။ + +![peter and the wolf](../../../8-Reinforcement/images/peter.png) + +> Peter နဲ့ သူ့မိတ်ဆွေတွေဟာ ဝက်ခြံဆာတဲ့ ဝက်ကို လွတ်မြောက်ဖို့ လိုအပ်ပါတယ်! [Jen Looper](https://twitter.com/jenlooper) ရဲ့ ပုံ + +## ဒေသဆိုင်ရာအကြောင်းအရာ: Peter and the Wolf (ရုရှား) + +[Peter and the Wolf](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) သည် ရုရှား composer [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev) ရေးသားထားသော ဂီတပုံပြင်တစ်ခုဖြစ်သည်။ အဲဒါက သူရဲကောင်းလေး Peter ရဲ့ အကြောင်းဖြစ်ပြီး သူဟာ ဝက်ကို လိုက်ဖမ်းဖို့ အိမ်ကနေ တောထဲကို သွားတဲ့ ပုံပြင်ဖြစ်သည်။ ဒီအပိုင်းမှာ Peter ကို အကူအညီပေးမယ့် machine learning algorithm တွေကို သင်ကြမယ်။ + +- **ရှာဖွေ** ပတ်ဝန်းကျင်ကို လေ့လာပြီး အကောင်းဆုံး navigation map တစ်ခုတည်ဆောက်ရန် +- **သင်ယူ** skateboard ကို အသုံးပြုနည်းနဲ့ balance လုပ်နည်းကို သင်ယူပြီး ပိုမြန်မြန်ရွေ့လျားနိုင်ရန် + +[![Peter and the Wolf](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM) + +> 🎥 Prokofiev ရဲ့ Peter and the Wolf ကို နားဆင်ဖို့ အထက်ပါပုံကို နှိပ်ပါ + +## reinforcement learning + +အရင်အပိုင်းတွေမှာ machine learning problem နှစ်ခုကို တွေ့မြင်ခဲ့ပါပြီ။ + +- **Supervised learning** သည် သင်လိုက်ဖျက်လိုသော ပြဿနာအတွက် နမူနာဖြေရှင်းချက်များကို အကြံပြုသော dataset များကို အသုံးပြုသည်။ [Classification](../4-Classification/README.md) နဲ့ [regression](../2-Regression/README.md) သည် supervised learning task များဖြစ်သည်။ +- **Unsupervised learning** သည် labeled training data မရှိသော နည်းလမ်းဖြစ်သည်။ Unsupervised learning ရဲ့ အဓိကဥပမာမှာ [Clustering](../5-Clustering/README.md) ဖြစ်သည်။ + +ဒီအပိုင်းမှာ labeled training data မလိုအပ်တဲ့ learning problem အသစ်တစ်ခုကို မိတ်ဆက်ပေးပါမယ်။ ဒီလို problem တွေမှာ အမျိုးအစားအများကြီးရှိပါတယ်။ + +- **[Semi-supervised learning](https://wikipedia.org/wiki/Semi-supervised_learning)** သည် unlabeled data များစွာကို model ကို pre-train လုပ်ရန် အသုံးပြုနိုင်သည်။ +- **[Reinforcement learning](https://wikipedia.org/wiki/Reinforcement_learning)** သည် agent တစ်ခုက simulated environment တစ်ခုမှာ စမ်းသပ်မှုများလုပ်ပြီး အပြုအမူကို သင်ယူသည်။ + +### ဥပမာ - ကွန်ပျူတာဂိမ်း + +ကွန်ပျူတာကို chess သို့မဟုတ် [Super Mario](https://wikipedia.org/wiki/Super_Mario) ကဲ့သို့သော ဂိမ်းတစ်ခုကို ကစားဖို့ သင်ပေးချင်တယ်ဆိုပါစို့။ ကွန်ပျူတာကို ဂိမ်းကစားစေဖို့ ဂိမ်းရဲ့ state တစ်ခုစီမှာ ဘယ်လိုလှုပ်ရှားမှုကို လုပ်မလဲဆိုတာကို ခန့်မှန်းနိုင်ဖို့လိုအပ်သည်။ ဒါဟာ classification problem တစ်ခုလိုပုံရပေမယ့် အဲဒါမဟုတ်ပါဘူး - အကြောင်းက states နဲ့ အတူတူသော actions ရှိတဲ့ dataset မရှိလို့ပါ။ Chess match တွေ သို့မဟုတ် Super Mario ကစားနေတဲ့ player တွေကို record လုပ်ထားတဲ့ data ရှိနေပေမယ့် အဲဒီ data က states များစွာကို လုံလောက်စွာ မဖုံးလွှမ်းနိုင်ပါ။ + +ဂိမ်း data ရှာဖွေခြင်းကို မလုပ်ဘဲ **Reinforcement Learning** (RL) သည် *ကွန်ပျူတာကို အကြိမ်ကြိမ် ကစားစေပြီး ရလဒ်ကို ကြည့်ရှုခြင်း* ဆိုတဲ့ အတွေးအခေါ်ကို အခြေခံထားသည်။ ဒါကြောင့် RL ကို အသုံးပြုဖို့အတွက် အဓိကလိုအပ်ချက်နှစ်ခုရှိပါတယ်။ + +- **Environment** နဲ့ **Simulator** တစ်ခုလိုအပ်သည်။ ဂိမ်းကို အကြိမ်ကြိမ် ကစားနိုင်ရန် simulator က ဂိမ်းရဲ့ rule တွေ၊ state တွေ၊ action တွေကို သတ်မှတ်ပေးရမယ်။ + +- **Reward function** တစ်ခုလိုအပ်သည်။ အဲဒါက အကြိမ်စီမှာ သင်ဘယ်လိုလုပ်ဆောင်ခဲ့တယ်ဆိုတာကို ပြောပြပေးမယ်။ + +Machine learning အခြားနည်းလမ်းတွေနဲ့ RL ရဲ့ အဓိကကွာခြားချက်က RL မှာ ဂိမ်းပြီးဆုံးမှသာ အနိုင်ရ/အရှုံးပေါ်မယ်ဆိုတာကို သိနိုင်ခြင်းဖြစ်သည်။ ဒါကြောင့် move တစ်ခုတည်းက အကောင်းတစ်ခုလားဆိုတာကို မသိနိုင်ပါဘူး - ဂိမ်းပြီးဆုံးမှသာ reward ကို ရရှိနိုင်သည်။ အဲဒီလို မသေချာတဲ့အခြေအနေတွေအောက်မှာ model ကို train လုပ်နိုင်တဲ့ algorithm တွေကို ဒီဇိုင်းဆွဲဖို့ ကျွန်တော်တို့ရဲ့ ရည်မှန်းချက်ဖြစ်ပါတယ်။ ကျွန်တော်တို့ **Q-learning** ဆိုတဲ့ RL algorithm တစ်ခုကို လေ့လာပါမယ်။ + +## သင်ခန်းစာများ + +1. [Reinforcement learning နဲ့ Q-Learning အကြောင်းမိတ်ဆက်](1-QLearning/README.md) +2. [Gym simulation environment ကို အသုံးပြုခြင်း](2-Gym/README.md) + +## Credit + +"Introduction to Reinforcement Learning" ကို [Dmitry Soshnikov](http://soshnikov.com) မှ ♥️ ဖြင့် ရေးသားထားသည်။ + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာရှိသော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွဲအချော်များ သို့မဟုတ် အနားယူမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/9-Real-World/1-Applications/README.md b/translations/my/9-Real-World/1-Applications/README.md new file mode 100644 index 00000000..1fa9a721 --- /dev/null +++ b/translations/my/9-Real-World/1-Applications/README.md @@ -0,0 +1,136 @@ + +# Postscript: အမှန်တကယ်သောကမ္ဘာတွင် Machine Learning + +![အမှန်တကယ်သောကမ္ဘာတွင် Machine Learning အကျဉ်းချုပ်ကို Sketchnote အနေနဲ့](../../../../sketchnotes/ml-realworld.png) +> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac) + +ဒီသင်ခန်းစာတွဲမှာ သင်သည် training အတွက် data ကိုပြင်ဆင်နည်းများနှင့် machine learning models ဖန်တီးနည်းများကိုလေ့လာခဲ့ပါသည်။ သင်သည် regression, clustering, classification, natural language processing, နှင့် time series models များကိုတစ်စဉ်တစ်စဉ်တည်ဆောက်ခဲ့ပါသည်။ ဂုဏ်ယူပါတယ်! အခုတော့ သင်သည် "ဒါတွေဘာအတွက်လဲ..." "ဒီ models တွေကို အမှန်တကယ်ဘယ်လိုအသုံးချနိုင်မလဲ" ဆိုပြီး စဉ်းစားနေရနိုင်ပါတယ်။ + +AI သည် deep learning ကိုအခြေခံပြီး စက်မှုလုပ်ငန်းများတွင် အလွန်စိတ်ဝင်စားမှုရရှိထားသော်လည်း classical machine learning models များအတွက်လည်း အရေးပါသောအသုံးချမှုများရှိနေဆဲဖြစ်သည်။ သင်သည် ယနေ့တိုင်အောင် ဒီအသုံးချမှုများကိုတချို့အသုံးပြုနေတတ်ပါသည်။ ဒီသင်ခန်းစာမှာ သင်သည် အခြားသောလုပ်ငန်းများနှင့် အထူးကျွမ်းကျင်မှုရှိသောနယ်ပယ် ၈ ခုက ဒီ models များကို application များကိုပိုမိုထိရောက်စေခြင်း၊ ယုံကြည်စိတ်ချစေခြင်း၊ ဉာဏ်ရည်ရှိစေခြင်း၊ နှင့် အသုံးပြုသူများအတွက်တန်ဖိုးရှိစေခြင်းအတွက် ဘယ်လိုအသုံးချကြောင်းကိုလေ့လာပါမည်။ + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## 💰 ဘဏ္ဍာရေး + +ဘဏ္ဍာရေးကဏ္ဍသည် machine learning အတွက် အခွင့်အလမ်းများစွာပေးနိုင်သည်။ ဒီကဏ္ဍရှိပြဿနာများစွာသည် ML ကိုအသုံးပြု၍ မော်ဒယ်တည်ဆောက်ခြင်းနှင့် ဖြေရှင်းခြင်းအတွက် သင့်လျော်သည်။ + +### ခရက်ဒစ်ကတ်လိမ်လည်မှုရှာဖွေခြင်း + +ကျွန်ုပ်တို့သည် [k-means clustering](../../5-Clustering/2-K-Means/README.md) ကို သင်ခန်းစာတွင်လေ့လာခဲ့ပါသည်၊ ဒါပေမယ့် ဒါကို ခရက်ဒစ်ကတ်လိမ်လည်မှုဆိုင်ရာပြဿနာများကို ဘယ်လိုဖြေရှင်းနိုင်မလဲ? + +K-means clustering သည် **outlier detection** ဟုခေါ်သော ခရက်ဒစ်ကတ်လိမ်လည်မှုရှာဖွေခြင်းနည်းလမ်းတွင် အလွန်အသုံးဝင်သည်။ Outliers သည် data set တစ်ခုအပေါ်ရှိ observation များတွင် အထူးပြောင်းလဲမှုများဖြစ်ပြီး ခရက်ဒစ်ကတ်ကို သာမန်အသုံးပြုမှုဖြစ်မဖြစ်၊ သို့မဟုတ် ထူးခြားသောအရာတစ်ခုဖြစ်နေမဖြစ်ကို ပြောပြနိုင်သည်။ အောက်ပါစာတမ်းတွင် ဖော်ပြထားသည့်အတိုင်း သင်သည် k-means clustering algorithm ကိုအသုံးပြု၍ ခရက်ဒစ်ကတ် data ကို စီစစ်နိုင်ပြီး transaction တစ်ခုစီကို outlier ဖြစ်ပုံကိုအခြေခံ၍ cluster တစ်ခုသို့ သတ်မှတ်နိုင်သည်။ ထို့နောက် သင်သည် fraudulent versus legitimate transactions အတွက် အန္တရာယ်များသော clusters များကို အကဲဖြတ်နိုင်သည်။ +[Reference](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf) + +### Wealth management + +Wealth management တွင် တစ်ဦးတစ်ယောက် သို့မဟုတ် ကုမ္ပဏီတစ်ခုသည် သူတို့၏ client များအတွက် ရင်းနှီးမြှုပ်နှံမှုများကို စီမံခန့်ခွဲသည်။ သူတို့၏အလုပ်သည် ရေရှည်တွင် ငွေကြေးကို ထိန်းသိမ်းပြီး တိုးတက်စေခြင်းဖြစ်သည်၊ ထို့ကြောင့် အကောင်းဆုံးလုပ်ဆောင်သော ရင်းနှီးမြှုပ်နှံမှုများကို ရွေးချယ်ရန် အရေးကြီးသည်။ + +ရင်းနှီးမြှုပ်နှံမှုတစ်ခုသည် ဘယ်လိုလုပ်ဆောင်သလဲဆိုတာကို အကဲဖြတ်ရန် statistical regression သည် အလွန်တန်ဖိုးရှိသော tools ဖြစ်သည်။ [Linear regression](../../2-Regression/1-Tools/README.md) သည် fund တစ်ခုသည် benchmark တစ်ခုနှင့် ဆက်စပ်မှုကို နားလည်ရန် အရေးပါသော tools ဖြစ်သည်။ Regression ရလဒ်များသည် statistically significant ဖြစ်မဖြစ်၊ သို့မဟုတ် client ၏ ရင်းနှီးမြှုပ်နှံမှုများကို ဘယ်လောက်ထိခိုက်စေမည်ကိုလည်း သုံးသပ်နိုင်သည်။ သင်သည် multiple regression ကို အသုံးပြု၍ အခြားသော risk factors များကိုပါ ထည့်သွင်းပြီး analysis ကို တိုးချဲ့နိုင်သည်။ Fund တစ်ခုအတွက် ဒီနည်းလမ်းက ဘယ်လိုအလုပ်လုပ်မည်ဆိုတာကို အောက်ပါစာတမ်းတွင် ကြည့်ရှုနိုင်ပါသည်။ +[Reference](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/) + +## 🎓 ပညာရေး + +ပညာရေးကဏ္ဍသည် ML ကို အသုံးချနိုင်သော စိတ်ဝင်စားဖွယ်ရာနယ်ပယ်တစ်ခုဖြစ်သည်။ စမ်းသပ်မှုများ သို့မဟုတ် စာတမ်းများတွင် လိမ်လည်မှုကို ရှာဖွေခြင်း၊ correction process တွင် bias (မတူညီမှု) ကို စီမံခန့်ခွဲခြင်းစသည်တို့က စိတ်ဝင်စားဖွယ်ရာပြဿနာများဖြစ်သည်။ + +### ကျောင်းသားအပြုအမူကိုခန့်မှန်းခြင်း + +[Coursera](https://coursera.com) သည် online open course provider တစ်ခုဖြစ်ပြီး သူတို့ engineering ဆုံးဖြတ်ချက်များစွာကို ဆွေးနွေးသော tech blog တစ်ခုရှိသည်။ ဒီ case study တွင် သူတို့သည် regression line တစ်ခုကို plot လုပ်ပြီး low NPS (Net Promoter Score) rating နှင့် course retention သို့မဟုတ် drop-off အကြား correlation ရှိမရှိကို ရှာဖွေခဲ့သည်။ +[Reference](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a) + +### Bias ကိုလျှော့ချခြင်း + +[Grammarly](https://grammarly.com) သည် spelling နှင့် grammar အမှားများကို စစ်ဆေးပေးသော writing assistant တစ်ခုဖြစ်ပြီး သူတို့၏ product များတွင် sophisticated [natural language processing systems](../../6-NLP/README.md) များကို အသုံးပြုသည်။ သူတို့ tech blog တွင် gender bias ကို machine learning တွင် ဘယ်လိုကိုင်တွယ်ခဲ့သည်ဆိုတာကို case study အနေနဲ့ ဖော်ပြထားသည်။ သင်သည် [introductory fairness lesson](../../1-Introduction/3-fairness/README.md) တွင်လည်း ဒီအကြောင်းကိုလေ့လာခဲ့ပါသည်။ +[Reference](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/) + +## 👜 လက်လီရောင်းဝယ်ရေး + +လက်လီရောင်းဝယ်ရေးကဏ္ဍသည် ML ကို အသုံးပြု၍ customer journey ကိုပိုမိုကောင်းမွန်စေခြင်း၊ inventory ကို အကောင်းဆုံးစီမံခန့်ခွဲခြင်းစသည်တို့တွင် အကျိုးရှိစေသည်။ + +### Customer journey ကို personalize လုပ်ခြင်း + +Wayfair သည် furniture ကဲ့သို့သော home goods များကိုရောင်းချသောကုမ္ပဏီတစ်ခုဖြစ်ပြီး customer များအတွက် taste နှင့်လိုအပ်ချက်များကိုဖြည့်ဆည်းပေးရန် အရေးကြီးသည်။ ဒီ article တွင် Wayfair ၏ engineers များက ML နှင့် NLP ကို "customer များအတွက် အမှန်တကယ်သောရလဒ်များကို surface လုပ်ရန်" ဘယ်လိုအသုံးပြုကြောင်းကို ဖော်ပြထားသည်။ အထူးသဖြင့် သူတို့၏ Query Intent Engine သည် entity extraction, classifier training, asset နှင့် opinion extraction, နှင့် sentiment tagging ကို customer reviews တွင် အသုံးပြုထားသည်။ ဒါဟာ online retail တွင် NLP ဘယ်လိုအလုပ်လုပ်တတ်သလဲဆိုတာကို classic use case တစ်ခုဖြစ်သည်။ +[Reference](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search) + +### Inventory management + +[StitchFix](https://stitchfix.com) ကဲ့သို့သော innovative, nimble ကုမ္ပဏီများသည် ML ကို recommendation နှင့် inventory management အတွက် အလွန်အကျိုးရှိစွာအသုံးပြုသည်။ သူတို့၏ styling teams များသည် merchandising teams များနှင့်ပေါင်းစည်းလုပ်ဆောင်ကြသည်။ "ကျွန်ုပ်တို့၏ data scientist တစ်ဦးသည် genetic algorithm တစ်ခုကို apparel တွင် အသုံးပြု၍ ယနေ့မရှိသေးသော successful piece of clothing ကိုခန့်မှန်းခဲ့သည်။" +[Reference](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/) + +## 🏥 ကျန်းမာရေး + +ကျန်းမာရေးကဏ္ဍသည် ML ကို အသုံးပြု၍ သုတေသနလုပ်ငန်းများနှင့် logistic ပြဿနာများကို optimize လုပ်နိုင်သည်။ ဥပမာ - လူနာများကိုပြန်လည်လက်ခံခြင်း၊ သို့မဟုတ် ရောဂါများပျံ့နှံ့မှုကိုတားဆီးခြင်း။ + +### Clinical trials စီမံခန့်ခွဲခြင်း + +Clinical trials တွင် toxicity သည် drug makers များအတွက် အရေးကြီးသောပြဿနာတစ်ခုဖြစ်သည်။ Toxicity ဘယ်လောက်ထိခံနိုင်ရမလဲ? ဒီသုတေသနတွင် clinical trial methods များကို analysis လုပ်ပြီး clinical trial outcomes ကိုခန့်မှန်းရန်နည်းလမ်းအသစ်တစ်ခုကို ဖန်တီးခဲ့သည်။ အထူးသဖြင့် random forest ကိုအသုံးပြု၍ [classifier](../../4-Classification/README.md) တစ်ခုကို ဖန်တီးခဲ့သည်။ +[Reference](https://www.sciencedirect.com/science/article/pii/S2451945616302914) + +### လူနာပြန်လည်လက်ခံမှုစီမံခန့်ခွဲခြင်း + +ဆေးရုံ care သည် အလွန်ကုန်ကျစရိတ်များရှိပြီး လူနာများကိုပြန်လည်လက်ခံရခြင်းသည် အထူးကုန်ကျစရိတ်များရှိသည်။ ဒီစာတမ်းတွင် ML ကို clustering algorithms အသုံးပြု၍ readmission potential ကိုခန့်မှန်းရန် ဘယ်လိုအသုံးပြုကြောင်းကို ဖော်ပြထားသည်။ ဒီ clusters များက "readmissions များတွင် common cause ရှိနိုင်သောအုပ်စုများကို ရှာဖွေရန်" analyst များကိုကူညီပေးသည်။ +[Reference](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning) + +### ရောဂါစီမံခန့်ခွဲခြင်း + +နောက်ဆုံးကာလ pandemic သည် ML ကိုရောဂါပျံ့နှံ့မှုကိုတားဆီးရန် ဘယ်လိုအသုံးပြုနိုင်သည်ဆိုတာကို အလင်းရောင်ပေးခဲ့သည်။ ဒီ article တွင် ARIMA, logistic curves, linear regression, နှင့် SARIMA ကိုအသုံးပြုထားသည်။ "ဒီအလုပ်သည် virus ၏ပျံ့နှံ့နှုန်းကိုတွက်ချက်ရန်နှင့် သေဆုံးမှုများ၊ ပြန်လည်ကောင်းမွန်မှုများ၊ နှင့် အတည်ပြုမှုများကိုခန့်မှန်းရန် ကြိုးစားမှုတစ်ခုဖြစ်သည်။" +[Reference](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/) + +## 🌲 သဘာဝပတ်ဝန်းကျင်နှင့် Green Tech + +သဘာဝနှင့်သဘာဝပတ်ဝန်းကျင်သည် အလွန်နူးညံ့သောစနစ်များဖြစ်ပြီး တိရစ္ဆာန်များနှင့်သဘာဝအကြားဆက်ဆံရေးကိုအဓိကထားသည်။ ဒီစနစ်များကိုတိကျစွာတိုင်းတာနိုင်ရန်နှင့် တစ်စုံတစ်ခုဖြစ်ပျက်ပါက သင့်တော်သောအရေးယူမှုများလုပ်ဆောင်ရန် အရေးကြီးသည်။ + +### သစ်တောစီမံခန့်ခွဲမှု + +သင်သည် [Reinforcement Learning](../../8-Reinforcement/README.md) ကို ယခင်သင်ခန်းစာများတွင်လေ့လာခဲ့ပါသည်။ သဘာဝတွင် pattern များကိုခန့်မှန်းရန် အလွန်အသုံးဝင်သည်။ အထူးသဖြင့် သစ်တောမီးလောင်မှုများနှင့် invasive species များပျံ့နှံ့မှုကဲ့သို့သော ecological ပြဿနာများကို tracking လုပ်ရန် အသုံးပြုနိုင်သည်။ ကနေဒါတွင် သုတေသနလုပ်ငန်းတစ်ခုသည် satellite images ကိုအသုံးပြု၍ forest wildfire dynamics models များကို reinforcement learning ဖြင့်တည်ဆောက်ခဲ့သည်။ +[Reference](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full) + +### တိရစ္ဆာန်များ၏လှုပ်ရှားမှုကိုစစ်ဆေးခြင်း + +Deep learning သည် တိရစ္ဆာန်လှုပ်ရှားမှုများကို visually tracking လုပ်ရန် revolution တစ်ခုဖန်တီးခဲ့သော်လည်း classic ML သည် ဒီအလုပ်တွင် အရေးပါနေဆဲဖြစ်သည်။ + +Farm animals များ၏လှုပ်ရှားမှုများကို tracking လုပ်ရန် sensor များနှင့် IoT ကိုအသုံးပြုသော်လည်း data ကို preprocess လုပ်ရန် basic ML techniques များကိုအသုံးပြုသည်။ ဥပမာ - ဒီစာတမ်းတွင် classifier algorithms များကိုအသုံးပြု၍ သိုးများ၏ posture များကိုစစ်ဆေးခဲ့သည်။ +[Reference](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf) + +### ⚡️ စွမ်းအင်စီမံခန့်ခွဲမှု + +[time series forecasting](../../7-TimeSeries/README.md) သင်ခန်းစာများတွင် supply နှင့် demand ကိုနားလည်ခြင်းအပေါ်အခြေခံပြီး smart parking meters ကို revenue ရရှိရန်အသုံးပြုခဲ့သည်။ ဒီ article တွင် clustering, regression နှင့် time series forecasting ကိုပေါင်းစပ်ပြီး smart metering အပေါ်အခြေခံ၍ အနာဂတ်စွမ်းအင်အသုံးပြုမှုကိုခန့်မှန်းခဲ့သည်။ +[Reference](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf) + +## 💼 အာမခံ + +အာမခံကဏ္ဍသည် ML ကိုအသုံးပြု၍ financial နှင့် actuarial models များကိုတည်ဆောက်ခြင်းနှင့် optimize လုပ်ခြင်းအတွက် အသုံးပြုသည်။ + +### Volatility Management + +MetLife သည် life insurance provider တစ်ခုဖြစ်ပြီး သူတို့ financial models တွင် volatility ကိုဘယ်လိုခန့်မှန်းပြီး လျှော့ချကြောင်းကို ဖော်ပြထားသည်။ ဒီ article တွင် binary နှင့် ordinal classification visualizations များကိုတွေ့နိုင်သည်။ +[Reference](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf) + +## 🎨 အနုပညာ၊ ယဉ်ကျေးမှုနှင့်စာပေ + +အနုပညာတွင် ဥပမာ - သတင်းစာပညာတွင် စိတ်ဝင်စားဖွယ်ရာပြဿနာများစွာရှိသည်။ Fake news ကိုရှာဖွေခြင်းသည် လူများ၏အမြင်ကိုသက်ရောက်စေခြင်းနှင့် ဒီမိုကရေစီများကိုတုန်လှုပ်စေခြင်းအထိ သက်ရောက်မှုရှိသည်ဟု သက်သေပြထားသည်။ ပြတိုက်များသည် artifacts များအကြားဆက်စပ်မှုများကိုရှာဖွေခြင်းမှစ၍ resource planning အထိ ML ကိုအသုံးပြုနိုင်သည်။ + +### Fake news detection + +Fake news ကိုရှာဖွေခြင်းသည် ယနေ့မီဒီယာတွင် ကြောင်နှင့်ကြွက်ကစားပွဲတစ်ခုဖြစ်လာသည်။ ဒီ article တွင် သုတေသနလုပ်ငန်းများက ML techniques များစွာကိုပေါင်းစပ်ပြီး အကောင်းဆုံးမော်ဒယ်ကို deploy လုပ်နိုင်ကြောင်းကိုဖော်ပြထားသည်။ "ဒီစနစ်သည် data မှ features များကို extract လုပ်ရန် natural language processing ကို +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +Wayfair ရဲ့ ဒေတာသိပ္ပံအဖွဲ့က ML ကို သူတို့ကုမ္ပဏီမှာ ဘယ်လိုအသုံးပြုတယ်ဆိုတာနဲ့ပတ်သက်ပြီး စိတ်ဝင်စားဖွယ်ဗီဒီယိုများစွာရှိပါတယ်။ [ကြည့်ရှုဖို့](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos) တန်ပါတယ်! + +## လုပ်ငန်းတာဝန် + +[A ML scavenger hunt](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူပညာရှင်များမှ ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/9-Real-World/1-Applications/assignment.md b/translations/my/9-Real-World/1-Applications/assignment.md new file mode 100644 index 00000000..c169db72 --- /dev/null +++ b/translations/my/9-Real-World/1-Applications/assignment.md @@ -0,0 +1,27 @@ + +# ML Scavenger Hunt + +## လမ်းညွှန်ချက်များ + +ဒီသင်ခန်းစာမှာ သင် Classical ML ကို အသုံးပြုပြီး အစစ်အမှန်အသုံးချနိုင်တဲ့ နေရာများအကြောင်းကို လေ့လာခဲ့ပါတယ်။ Deep Learning, AI ရဲ့ နည်းပညာအသစ်များ၊ Neural Networks ကို အသုံးပြုခြင်းက အစိတ်အပိုင်းများကို အရှိန်မြှင့်ပေးနိုင်ပေမယ့် ဒီသင်ခန်းစာမှာ သင်ယူခဲ့တဲ့ Classical ML နည်းလမ်းတွေက အရေးပါမှုကို ဆက်လက်ထိန်းသိမ်းထားပါတယ်။ + +ဒီအလုပ်မှာ သင် Hackathon တစ်ခုမှာ ပါဝင်နေတယ်လို့ စိတ်ကူးပါ။ သင်သင်ခန်းစာမှာ လေ့လာခဲ့တဲ့ အရာတွေကို အသုံးပြုပြီး ဒီသင်ခန်းစာမှာ ပြောထားတဲ့ နေရာတစ်ခုမှာ Classical ML ကို အသုံးပြုပြီး ပြဿနာတစ်ခုကို ဖြေရှင်းဖို့ အကြံပေးပါ။ သင့်အကြံကို အကောင်အထည်ဖော်ပုံကို ဆွေးနွေးတဲ့ Presentation တစ်ခုကို ဖန်တီးပါ။ သင့်အကြံကို ထောက်ခံဖို့ Sample Data ရှာဖွေပြီး ML Model တစ်ခုကို တည်ဆောက်နိုင်ရင် အပိုအမှတ်ရပါမယ်! + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သည် | +| -------- | ------------------------------------------------------------------- | ------------------------------------------------- | ---------------------- | +| | PowerPoint Presentation တစ်ခုကို တင်ပြထားသည် - Model တည်ဆောက်ခြင်းအတွက် အပိုအမှတ်ရ | အဆန်းပြားမှုမရှိသော၊ အခြေခံ Presentation တစ်ခုကို တင်ပြထားသည် | အလုပ်မပြီးစီးသေးပါ | + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူရင်းဘာသာစကားဖြင့် အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/9-Real-World/2-Debugging-ML-Models/README.md b/translations/my/9-Real-World/2-Debugging-ML-Models/README.md new file mode 100644 index 00000000..75bb974f --- /dev/null +++ b/translations/my/9-Real-World/2-Debugging-ML-Models/README.md @@ -0,0 +1,172 @@ + +# Postscript: မော်ဒယ် Debugging ကို Responsible AI Dashboard Components အသုံးပြု၍ Machine Learning တွင် ပြုလုပ်ခြင်း + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## အကျဉ်းချုပ် + +Machine learning သည် ကျွန်ုပ်တို့၏ နေ့စဉ်ဘဝများကို အကျိုးသက်ရောက်စေပါသည်။ AI သည် ကျွန်ုပ်တို့၏ လူ့အဖွဲ့အစည်းနှင့် တစ်ဦးချင်းစီအပေါ် သက်ရောက်မှုရှိသော အရေးကြီးသော စနစ်များတွင် ဝင်ရောက်လာပြီး ကျန်းမာရေး၊ ဘဏ္ဍာရေး၊ ပညာရေးနှင့် အလုပ်အကိုင်ကဏ္ဍများတွင် အသုံးပြုလာသည်။ ဥပမာအားဖြင့် ကျန်းမာရေးရောဂါရှာဖွေခြင်း သို့မဟုတ် လိမ်လည်မှုကို ရှာဖွေခြင်းကဲ့သို့သော နေ့စဉ်ဆုံးဖြတ်မှုလုပ်ငန်းစဉ်များတွင် စနစ်များနှင့် မော်ဒယ်များ ပါဝင်နေသည်။ ထို့ကြောင့် AI ၏ တိုးတက်မှုများနှင့် အလျင်အမြန် အသုံးပြုမှုများသည် လူ့အဖွဲ့အစည်း၏ မျှော်လင့်ချက်များနှင့် အတူတိုးတက်လာပြီး အစိုးရများက AI ဖြေရှင်းချက်များကို စတင်ထိန်းချုပ်လာသည်။ ထို့ကြောင့် မော်ဒယ်များကို လူတိုင်းအတွက် တရားမျှတမှု၊ ယုံကြည်စိတ်ချရမှု၊ ပါဝင်မှု၊ ထင်ရှားမှုနှင့် တာဝန်ယူမှုရှိသော ရလဒ်များပေးနိုင်ရန် အကဲဖြတ်ရန် အရေးကြီးပါသည်။ + +ဒီသင်ခန်းစာတွင် မော်ဒယ်တွင် Responsible AI ပြဿနာများရှိမရှိကို အကဲဖြတ်ရန် အသုံးပြုနိုင်သော လက်တွေ့ကိရိယာများကို လေ့လာပါမည်။ ရှေးရိုးစဉ်လာ Machine Learning Debugging နည်းလမ်းများသည် စုစုပေါင်းတိကျမှု သို့မဟုတ် အလျော့အတိကျမှုများကို အခြေခံ၍ တွက်ချက်မှုများဖြစ်သည်။ သင်၏ မော်ဒယ်များကို တည်ဆောက်ရန် အသုံးပြုသော ဒေတာတွင် လူမျိုး၊ လိင်၊ နိုင်ငံရေးအမြင်၊ ဘာသာရေးကဲ့သို့သော အမျိုးအစားများ မပါဝင်ခြင်း သို့မဟုတ် အလွန်များလွန်းသော အမျိုးအစားများ ပါဝင်ခြင်းဖြစ်ပါက ဘာဖြစ်နိုင်မလဲ စဉ်းစားကြည့်ပါ။ မော်ဒယ်၏ ရလဒ်သည် အချို့သော အမျိုးအစားများကို အားပေးသောအနေဖြင့် အဓိပ္ပာယ်ဖွင့်ဆိုခြင်းဖြစ်ပါကလည်း မျှတမှု၊ ပါဝင်မှု သို့မဟုတ် ယုံကြည်စိတ်ချရမှု ပြဿနာများ ဖြစ်ပေါ်စေနိုင်ပါသည်။ ထို့အပြင် Machine Learning မော်ဒယ်များသည် "Black Boxes" အဖြစ် ရှိနေသောကြောင့် မော်ဒယ်၏ ခန့်မှန်းချက်များကို ဘာက အားပေးနေသည်ကို နားလည်ရန် ခက်ခဲစေပါသည်။ ဒီအရာများသည် မော်ဒယ်၏ တရားမျှတမှု သို့မဟုတ် ယုံကြည်စိတ်ချရမှုကို Debugging ပြုလုပ်ရန် လုံလောက်သော ကိရိယာများ မရှိသောအခါ Data Scientist များနှင့် AI Developer များ ရင်ဆိုင်ရသော စိန်ခေါ်မှုများဖြစ်သည်။ + +ဒီသင်ခန်းစာတွင် သင်သည် မော်ဒယ်များကို Debugging ပြုလုပ်ရန် အောက်ပါအရာများကို လေ့လာပါမည်- + +- **Error Analysis**: မော်ဒယ်၏ အမှားနှုန်းများ မြင့်မားသော ဒေတာဖြန့်ဝေမှုနေရာများကို ရှာဖွေပါ။ +- **Model Overview**: မော်ဒယ်၏ စွမ်းဆောင်ရည် metrics များတွင် ကွာဟမှုများကို ရှာဖွေရန် ဒေတာ cohorts များအကြား နှိုင်းယှဉ်အကဲဖြတ်မှု ပြုလုပ်ပါ။ +- **Data Analysis**: သင့်မော်ဒယ်သည် အချို့သော ဒေတာအမျိုးအစားများကို အားပေးရန် skew ဖြစ်စေသော ဒေတာ၏ over-representation သို့မဟုတ် under-representation ရှိနေသောနေရာများကို စုံစမ်းပါ။ +- **Feature Importance**: မော်ဒယ်၏ ခန့်မှန်းချက်များကို Global Level သို့မဟုတ် Local Level တွင် အားပေးနေသော features များကို နားလည်ပါ။ + +## ကြိုတင်လိုအပ်ချက် + +ကြိုတင်လိုအပ်ချက်အနေဖြင့် [Responsible AI tools for developers](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) ကို ပြန်လည်သုံးသပ်ပါ။ + +> ![Gif on Responsible AI Tools](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) + +## Error Analysis + +ရိုးရာ မော်ဒယ်စွမ်းဆောင်ရည် metrics များသည် တိကျမှုကို တိုင်းတာရန် အမှန်/အမှား ခန့်မှန်းချက်များအပေါ် အခြေခံ၍ တွက်ချက်မှုများဖြစ်သည်။ ဥပမာအားဖြင့် မော်ဒယ်သည် 89% တိကျမှုနှုန်းနှင့် 0.001 အမှားဆုံးရှုံးမှုရှိသည်ဟု သတ်မှတ်ခြင်းသည် စွမ်းဆောင်ရည်ကောင်းမွန်သည်ဟု ယူဆနိုင်သည်။ သို့သော် အမှားများသည် သင့်ဒေတာအတွင်း တူညီစွာ မဖြန့်ဝေထားနိုင်ပါ။ သင် 89% တိကျမှုနှုန်းရရှိနိုင်သော်လည်း မော်ဒယ်သည် သင့်ဒေတာ၏ အချို့သောနေရာများတွင် 42% အမှားနှုန်းရှိနေသည်ကို ရှာဖွေနိုင်ပါသည်။ ဒေတာအုပ်စုအချို့တွင် အမှားများရှိနေသော ဒီအခြေအနေများသည် မျှတမှု သို့မဟုတ် ယုံကြည်စိတ်ချရမှု ပြဿနာများကို ဖြစ်ပေါ်စေနိုင်ပါသည်။ မော်ဒယ်သည် ဘယ်နေရာတွင် ကောင်းမွန်စွာ လုပ်ဆောင်နေသည် သို့မဟုတ် မလုပ်ဆောင်နိုင်သည်ကို နားလည်ရန် အရေးကြီးပါသည်။ + +Error Analysis component သည် RAI dashboard တွင် မော်ဒယ်၏ အမှားဖြန့်ဝေမှုကို tree visualization ဖြင့် ဖော်ပြသည်။ ဒါသည် သင့်ဒေတာတွင် အမှားနှုန်းများ မြင့်မားသော features သို့မဟုတ် နေရာများကို ရှာဖွေရာတွင် အထောက်အကူပြုသည်။ + +![Error Analysis](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png) + +Tree map တွင် အနီရောင်မှောင်သော node များသည် အမှားနှုန်းများ မြင့်မားနေသည်ကို မြန်ဆန်စွာ ရှာဖွေရန် visual indicators အဖြစ် အသုံးပြုနိုင်သည်။ + +Heat map သည် feature တစ်ခု သို့မဟုတ် feature နှစ်ခုကို အသုံးပြု၍ မော်ဒယ်၏ အမှားများကို စုံစမ်းရန် အသုံးပြုနိုင်သော visualization တစ်ခုဖြစ်သည်။ + +![Error Analysis Heatmap](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png) + +Error Analysis ကို သင်လိုအပ်သောအခါ အသုံးပြုပါ- + +* မော်ဒယ်၏ အမှားများသည် ဒေတာအတွင်း ဘယ်လိုဖြန့်ဝေထားသည်ကို နက်ရှိုင်းစွာ နားလည်ရန်။ +* စုစုပေါင်း စွမ်းဆောင်ရည် metrics များကို ခွဲခြမ်းစိတ်ဖြာပြီး အမှားများရှိသော cohorts များကို ရှာဖွေ၍ ပြဿနာများကို Targeted mitigation ဖြင့် ဖြေရှင်းရန်။ + +## Model Overview + +Machine learning မော်ဒယ်၏ စွမ်းဆောင်ရည်ကို အကဲဖြတ်ရန် မော်ဒယ်၏ အပြုသဘောဆောင်သောနှင့် အနုတ်သဘောဆောင်သော metrics များကို Comprehensive Analysis ပြုလုပ်ရန် လိုအပ်သည်။ Metrics တစ်ခုကောင်းမွန်နေသော်လည်း အခြား metrics တွင် အမှားများကို ရှာဖွေနိုင်ပါသည်။ ထို့အပြင် Sensitive features (ဥပမာ- လူမျိုး၊ လိင်၊ အသက်) နှင့် insensitive features အကြား performance disparities များကို ရှာဖွေခြင်းသည် မော်ဒယ်၏ fairness ပြဿနာများကို ရှာဖွေရာတွင် အရေးကြီးပါသည်။ + +Model Overview component သည် RAI dashboard တွင် မော်ဒယ်၏ စွမ်းဆောင်ရည် metrics များကို cohort များအကြား နှိုင်းယှဉ်အကဲဖြတ်ရန် အထောက်အကူပြုသည်။ + +![Dataset cohorts - model overview in RAI dashboard](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png) + +Feature-based analysis functionality သည် feature တစ်ခုကို Narrow Down ပြုလုပ်၍ granular level တွင် anomalies များကို ရှာဖွေရန် အထောက်အကူပြုသည်။ + +![Feature cohorts - model overview in RAI dashboard](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png) + +Model Overview component သည် disparity metrics နှစ်မျိုးကို ပံ့ပိုးသည်- + +**Disparity in model performance**: Performance metrics များ၏ subgroups အကြား disparity ကို တွက်ချက်သည်။ ဥပမာ- + +* Accuracy rate disparity +* Error rate disparity +* Precision disparity +* Recall disparity +* Mean absolute error (MAE) disparity + +**Disparity in selection rate**: Subgroups အကြား selection rate disparity ကို တွက်ချက်သည်။ ဥပမာ- ချေးငွေ အတည်ပြုနှုန်း disparity။ + +## Data Analysis + +> "If you torture the data long enough, it will confess to anything" - Ronald Coase + +ဒီစကားသည် အလွန်ကြမ်းတမ်းသော်လည်း ဒေတာကို မည်သည့်အကျိုးဆောင်ချက်ကိုမဆို ထောက်ခံရန် Manipulate ပြုလုပ်နိုင်သည်ဟု အမှန်ပါသည်။ ဒေတာကို Manipulate ပြုလုပ်ခြင်းသည် တစ်ခါတစ်ရံ မတော်တဆဖြစ်နိုင်ပါသည်။ လူသားများအနေဖြင့် bias ရှိပြီး ဒေတာတွင် bias ထည့်သွင်းနေသည်ကို သိရှိရန် ခက်ခဲပါသည်။ AI နှင့် Machine Learning တွင် fairness ကို အာမခံရန် အလွန်ခက်ခဲသော စိန်ခေါ်မှုတစ်ခုဖြစ်သည်။ + +Data Analysis component သည် RAI dashboard တွင် ဒေတာ၏ over-representation နှင့် under-representation ရှိနေသောနေရာများကို ရှာဖွေရာတွင် အထောက်အကူပြုသည်။ ဒေတာ၏ imbalance များကြောင့် fairness ပြဿနာများကို ရှာဖွေခြင်းနှင့် root cause ကို စုံစမ်းရန် အထောက်အကူပြုသည်။ + +![Data Analysis component on RAI Dashboard](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png) + +Data Analysis ကို သင်လိုအပ်သောအခါ အသုံးပြုပါ- + +* သင့်ဒေတာ၏ statistics များကို filters များရွေးချယ်၍ dimensions များအဖြစ် slice ပြုလုပ်ရန်။ +* Dataset distribution ကို cohorts နှင့် feature groups များအတွင်း နားလည်ရန်။ +* Fairness, error analysis နှင့် causality ရလဒ်များသည် ဒေတာ၏ distribution ကြောင့်ဖြစ်သည်ကို သတ်မှတ်ရန်။ +* Representation issues, label noise, feature noise, label bias စသည်တို့ကြောင့် error များကို လျှော့ချရန် ဒေတာကို စုဆောင်းရန်။ + +## Model Interpretability + +Machine learning မော်ဒယ်များသည် "Black Boxes" ဖြစ်သောကြောင့် ခန့်မှန်းချက်များကို ဘာ features အားပေးနေသည်ကို နားလည်ရန် ခက်ခဲပါသည်။ မော်ဒယ်၏ ခန့်မှန်းချက်များကို ဘာကြောင့်ဖြစ်သည်ကို ရှင်းလင်းရန် transparency ပေးရန် အရေးကြီးပါသည်။ Feature Importance component သည် RAI dashboard တွင် မော်ဒယ်၏ ခန့်မှန်းချက်များကို Debugging ပြုလုပ်ရန် အထောက်အကူပြုသည်။ + +![Feature Importance component of the RAI dashboard](../../../../9-Real-World/2-Debugging-ML-Models/images/9-feature-importance.png) + +Global explanations: မော်ဒယ်၏ စုစုပေါင်း ခန့်မှန်းချက်များကို အားပေးသော features များကို ဖော်ပြသည်။ +Local explanations: မော်ဒယ်၏ ခန့်မှန်းချက်တစ်ခုကို အားပေးသော features များကို ဖော်ပြသည်။ + +![Feature importance](../../../../9-Real-World/2-Debugging-ML-Models/images/9-features-influence.png) + +Interpretability ကို သင်လိုအပ်သောအခါ အသုံးပြုပါ- + +* AI စနစ်၏ ခန့်မှန်းချက်များကို ယုံကြည်စိတ်ချရမှုရှိသည်ကို သတ်မှတ်ရန်။ +* Debugging ပြုလုပ်ရန် မော်ဒယ်ကို နားလည်ပြီး Healthy features သို့မဟုတ် False correlations ကို ရှာဖွေရန်။ +* Fairness ပြဿနာများကို ရှာဖွေရန် Sensitive features သို့မဟုတ် Correlated features များကို နားလည်ရန်။ +* User trust တည်ဆောက်ရန် Local explanations များကို ဖော်ပြရန်။ +* Regulatory audit ပြုလုပ်ရန် မော်ဒယ်များကို Validate ပြုလုပ်ပြီး လူသားများအပေါ် မော်ဒယ်၏ ဆုံးဖြတ်ချက်များ၏ သက်ရောက်မှုကို စောင့်ကြည့်ရန်။ + +## နိဂုံး + +RAI dashboard components များသည် လူ့အဖွဲ့အစည်းအပေါ် အနည်းဆုံးအန္တရာယ်ရှိပြီး ယုံကြည်စိတ်ချရသော Machine Learning မော်ဒယ်များ တည်ဆောက်ရန် အထောက်အကူပြုသည်။ Human rights ကို ထိခိုက်မှုမှ ကာကွယ်ရန်၊ အချို့သောအုပ်စုများကို အခွင့်အလမ်းများမှ ခွဲထုတ်ခြင်းမှ ကာကွယ်ရန်၊ ရုပ်ပိုင်းဆိုင်ရာ သို့မဟုတ် စိတ်ပိုင်းဆိုင်ရာ ထိခိုက်မှုများမှ ကာကွယ်ရန် အထောက်အကူပြုသည်။ Potential harms များကို အောက်ပါအတိုင်း ခွဲခြားနိုင်သည်- + +- **Allocation**: ဥပမာ- လူမျိုး သို့မဟုတ် လိင်ကို အခြားအမျိုးအစားထက် အားပေးခြင်း။ +- **Quality of service**: ဒေတာကို တစ်ခုတည်းသော အခြေအနေအတွက် training ပြုလုပ်ပြီး အမှန်တကယ်မှာ ပိုမိုရှုပ်ထွေးသောအခါ၊ poor performing service ဖြစ်စေသည်။ +- **Stereotyping**: အုပ်စုတစ်ခုကို သတ်မှတ် attributes များနှင့် ဆက်စပ်ခြင်း။ +- **Denigration**: တစ်စုံတစ်ခု သို့မဟုတ် တစ်စုံတစ်ဦးကို မတရားစွာ ဝေဖန်ခြင်း။ +- **အလွန်များခြင်း သို့မဟုတ် အလွန်နည်းခြင်း**။ အဓိကအကြောင်းအရာမှာ အချို့သောအဖွဲ့အစည်းများသည် အချို့သောအလုပ်အကိုင်များတွင် မမြင်တွေ့ရခြင်းဖြစ်ပြီး၊ ထိုအခြေအနေကို ဆက်လက်မြှင့်တင်နေသော ဝန်ဆောင်မှု သို့မဟုတ် လုပ်ဆောင်မှုများသည် အနာတရကို ဖြစ်ပေါ်စေခြင်းဖြစ်သည်။ + +### Azure RAI Dashboard + +[Azure RAI Dashboard](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) သည် Microsoft အပါအဝင် ထိပ်တန်းပညာရေးအဖွဲ့အစည်းများနှင့် အဖွဲ့အစည်းများမှ ဖွံ့ဖြိုးတိုးတက်လာသော အခမဲ့အရင်းအမြစ်များပေါ်တွင် တည်ဆောက်ထားပြီး၊ ဒေတာသိပ္ပံပညာရှင်များနှင့် AI ဖွံ့ဖြိုးတိုးတက်ရေးလုပ်ငန်းများအတွက် မော်ဒယ်အပြုအမူကို ပိုမိုနားလည်စေခြင်း၊ AI မော်ဒယ်များမှ မလိုလားအပ်သောပြဿနာများကို ရှာဖွေပြီး လျှော့ချနိုင်ရန် အရေးပါသောအခန်းကဏ္ဍတစ်ခုဖြစ်သည်။ + +- RAI Dashboard [အကြောင်းအရာများ](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) ကိုကြည့်ရှု၍ အစိတ်အပိုင်းများကို အသုံးပြုနည်းကို လေ့လာပါ။ + +- Azure Machine Learning တွင် ပိုမိုတာဝန်ရှိသော AI အခြေအနေများကို အကောင်းဆုံးရှာဖွေခြင်းအတွက် RAI Dashboard [နမူနာ notebook များ](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) ကိုကြည့်ရှုပါ။ + +--- +## 🚀 စိန်ခေါ်မှု + +စစ်မှန်သော သို့မဟုတ် ဒေတာအလွှာများမှ အစပျိုးမဖြစ်စေရန်၊ ကျွန်ုပ်တို့သည် အောက်ပါအချက်များကို လုပ်ဆောင်သင့်သည်- + +- စနစ်များတွင် လုပ်ဆောင်နေသောသူများအကြား နောက်ခံနှင့် အမြင်များ၏ အမျိုးမျိုးကို ရှိစေရန် +- ကျွန်ုပ်တို့၏ လူ့အဖွဲ့အစည်း၏ အမျိုးမျိုးကို အကျိုးသက်ရောက်စေသော ဒေတာများအတွက် ရင်းနှီးမြှုပ်နှံရန် +- အလွှာများကို ရှာဖွေပြီး ပြင်ဆင်နိုင်သော နည်းလမ်းများကို ပိုမိုကောင်းမွန်စေရန် ဖွံ့ဖြိုးတိုးတက်စေရန် + +မော်ဒယ်တည်ဆောက်ခြင်းနှင့် အသုံးပြုခြင်းတွင် မတရားမှုများကို တွေ့ရှိရသော အမှန်တကယ်အခြေအနေများကို စဉ်းစားပါ။ ကျွန်ုပ်တို့အနေဖြင့် အခြားဘာများကို ထည့်သွင်းစဉ်းစားသင့်သနည်း? + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) +## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +ဒီသင်ခန်းစာမှာ သင်သည် Machine Learning တွင် တာဝန်ရှိသော AI ကို ပေါင်းစပ်အသုံးပြုရန် အကောင်းဆုံးကိရိယာများကို လေ့လာခဲ့ပါသည်။ + +ဒီအကြောင်းအရာများကို ပိုမိုနက်ရှိုင်းစွာ လေ့လာရန် workshop ကို ကြည့်ရှုပါ- + +- Responsible AI Dashboard: တာဝန်ရှိသော AI ကို လက်တွေ့အသုံးချရန်အတွက် အစုံအလင်ဖြစ်သော Besmira Nushi နှင့် Mehrnoosh Sameki + +[![Responsible AI Dashboard: တာဝန်ရှိသော AI ကို လက်တွေ့အသုံးချရန်အတွက် အစုံအလင်](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Responsible AI Dashboard: တာဝန်ရှိသော AI ကို လက်တွေ့အသုံးချရန်အတွက် အစုံအလင်") + + +> 🎥 အထက်ပါပုံကို နှိပ်၍ Responsible AI Dashboard: တာဝန်ရှိသော AI ကို လက်တွေ့အသုံးချရန်အတွက် အစုံအလင် Besmira Nushi နှင့် Mehrnoosh Sameki ၏ ဗီဒီယိုကို ကြည့်ရှုပါ + +တာဝန်ရှိသော AI နှင့် ပိုမိုယုံကြည်ရသော မော်ဒယ်များကို တည်ဆောက်နည်းကို လေ့လာရန် အောက်ပါအထောက်အထားများကို ကိုးကားပါ- + +- ML မော်ဒယ်များကို Debugging ပြုလုပ်ရန် Microsoft ၏ RAI Dashboard Tools: [Responsible AI tools resources](https://aka.ms/rai-dashboard) + +- Responsible AI toolkit ကို ရှာဖွေပါ: [Github](https://github.com/microsoft/responsible-ai-toolbox) + +- Microsoft ၏ RAI အရင်းအမြစ်စင်တာ: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsoft ၏ FATE သုတေသနအဖွဲ့: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +## လုပ်ငန်းတာဝန် + +[RAI Dashboard ကို ရှာဖွေပါ](assignment.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/9-Real-World/2-Debugging-ML-Models/assignment.md b/translations/my/9-Real-World/2-Debugging-ML-Models/assignment.md new file mode 100644 index 00000000..f32c5e2b --- /dev/null +++ b/translations/my/9-Real-World/2-Debugging-ML-Models/assignment.md @@ -0,0 +1,25 @@ + +# တာဝန်ရှိသော AI (RAI) ဒိုင်ဘုတ်ကို လေ့လာပါ + +## လမ်းညွှန်ချက်များ + +ဒီသင်ခန်းစာမှာ RAI ဒိုင်ဘုတ်အကြောင်းကို သင်လေ့လာခဲ့ပြီး၊ ဒါဟာ "open-source" tools တွေကို အခြေခံပြီး data scientist တွေကို အမှားခွဲခြမ်းစိတ်ဖြာခြင်း၊ ဒေတာလေ့လာခြင်း၊ တရားမျှတမှုအကဲဖြတ်ခြင်း၊ မော်ဒယ်ကိုနားလည်ခြင်း၊ counterfact/what-if အကဲဖြတ်ခြင်းနဲ့ AI စနစ်များအပေါ် causal analysis လုပ်ဆောင်နိုင်ဖို့ အစိတ်အပိုင်းများကို တစ်စုတစ်စည်းတည်းပေးထားတဲ့ suite ဖြစ်ပါတယ်။ ဒီအလုပ်မှာ RAI ဒိုင်ဘုတ်ရဲ့ [notebooks](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) အချို့ကို လေ့လာပြီး သင့်ရဲ့ ရလဒ်တွေကို စာတမ်းတစ်စောင် သို့မဟုတ် တင်ပြချက်တစ်ခုအနေနဲ့ ဖော်ပြပါ။ + +## အဆင့်သတ်မှတ်ချက် + +| အချက်အလက် | ထူးချွန်သော | လုံလောက်သော | တိုးတက်မှုလိုအပ်သော | +| -------- | --------- | -------- | ----------------- | +| | RAI ဒိုင်ဘုတ်ရဲ့ အစိတ်အပိုင်းများ၊ run လုပ်ထားတဲ့ notebook နဲ့ run လုပ်ပြီးရရှိတဲ့ အနှိပ်အကြောင်းကို ဆွေးနွေးထားတဲ့ စာတမ်း သို့မဟုတ် powerpoint တင်ပြချက်တစ်ခုကို ဖော်ပြထားသည် | အနှိပ်မပါရှိတဲ့ စာတမ်းတစ်စောင်ကို ဖော်ပြထားသည် | စာတမ်းမဖော်ပြထားပါ | + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူရင်းဘာသာစကားဖြင့် အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် ရှုလေ့လာသင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/9-Real-World/README.md b/translations/my/9-Real-World/README.md new file mode 100644 index 00000000..5ad1c713 --- /dev/null +++ b/translations/my/9-Real-World/README.md @@ -0,0 +1,32 @@ + +# Postscript: ရိုးရာစက်မှုသင်ယူမှု၏ အမှန်တကယ်အသုံးချမှုများ + +ဒီသင်ခန်းစာအပိုင်းမှာ ရိုးရာစက်မှုသင်ယူမှု (Classical ML) ကို အသုံးချထားတဲ့ အမှန်တကယ်အသုံးချမှုများကို မိတ်ဆက်ပေးမှာဖြစ်ပါတယ်။ ကျွန်တော်တို့အင်တာနက်ကို လေ့လာပြီး neural networks, deep learning, AI စသည်တို့ကို အနည်းဆုံးအသုံးမပြုဘဲ ဒီနည်းလမ်းများကို အသုံးပြုထားတဲ့ whitepapers နဲ့ ဆောင်းပါးများကို ရှာဖွေခဲ့ပါတယ်။ စီးပွားရေးစနစ်များ၊ သဘာဝပတ်ဝန်းကျင်ဆိုင်ရာအသုံးချမှုများ၊ ငွေကြေး၊ အနုပညာနှင့်ယဉ်ကျေးမှု၊ အခြားသောနယ်ပယ်များတွင် ML ကို ဘယ်လိုအသုံးပြုထားသည်ကို လေ့လာပါ။ + +![chess](../../../9-Real-World/images/chess.jpg) + +> ဓာတ်ပုံကို Alexis Fauvet မှ Unsplash တွင် ရိုက်ထားသည်။ + +## သင်ခန်းစာ + +1. [ML အတွက် အမှန်တကယ်အသုံးချမှုများ](1-Applications/README.md) +2. [Responsible AI dashboard components ကို အသုံးပြု၍ စက်မှုသင်ယူမှု မော်ဒယ်များကို Debugging ပြုလုပ်ခြင်း](2-Debugging-ML-Models/README.md) + +## အကျိုးတူ + +"Real-World Applications" ကို [Jen Looper](https://twitter.com/jenlooper) နှင့် [Ornella Altunyan](https://twitter.com/ornelladotcom) တို့အပါအဝင် အဖွဲ့ဝင်များက ရေးသားခဲ့သည်။ + +"Model Debugging in Machine Learning using Responsible AI dashboard components" ကို [Ruth Yakubu](https://twitter.com/ruthieyakubu) မှ ရေးသားခဲ့သည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အတည်ပြုရမည့် အရင်းအမြစ်အဖြစ် သတ်မှတ်ပါ။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသည့် နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/CODE_OF_CONDUCT.md b/translations/my/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..d55955ae --- /dev/null +++ b/translations/my/CODE_OF_CONDUCT.md @@ -0,0 +1,23 @@ + +# Microsoft Open Source Code of Conduct + +ဒီပရောဂျက်သည် [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) ကို လက်ခံအသုံးပြုထားပါသည်။ + +အထောက်အကူပြုရန်အရင်းအမြစ်များ: + +- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) +- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +- မေးခွန်းများ သို့မဟုတ် စိုးရိမ်မှုများရှိပါက [opencode@microsoft.com](mailto:opencode@microsoft.com) သို့ ဆက်သွယ်ပါ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သိရှိပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/CONTRIBUTING.md b/translations/my/CONTRIBUTING.md new file mode 100644 index 00000000..f29736c2 --- /dev/null +++ b/translations/my/CONTRIBUTING.md @@ -0,0 +1,25 @@ + +# ပူးပေါင်းဆောင်ရွက်မှု + +ဒီပရောဂျက်ဟာ ပူးပေါင်းဆောင်ရွက်မှုများနှင့် အကြံပြုချက်များကို ကြိုဆိုပါတယ်။ ပူးပေါင်းဆောင်ရွက်မှုအများစုအတွက် Contributor License Agreement (CLA) ကို သဘောတူရန် လိုအပ်ပါမည်။ သင်သည် သင့်ပူးပေါင်းဆောင်ရွက်မှုကို အသုံးပြုခွင့်ပေးရန် အခွင့်အရေးရှိကြောင်းနှင့် အမှန်တကယ်ပေးလိုက်ကြောင်း ကြေညာရမည်ဖြစ်သည်။ အသေးစိတ်အချက်အလက်များအတွက် https://cla.microsoft.com ကို ကြည့်ပါ။ + +> အရေးကြီးချက် - ဒီ repo ထဲမှာ စာသားများကို ဘာသာပြန်တဲ့အခါမှာ စက်ဘာသာပြန်ကို အသုံးမပြုပါနှင့်။ ဘာသာပြန်မှုများကို အသိုင်းအဝိုင်းမှ အတည်ပြုသွားမည်ဖြစ်သောကြောင့် သင့်အတတ်ပညာရှိသော ဘာသာစကားများအတွက်သာ ဘာသာပြန်မှုများကို လုပ်ဆောင်ပါ။ + +သင် pull request တင်သည့်အခါ CLA-bot က သင် CLA ပေးရန် လိုအပ်မလိုအပ် စစ်ဆေးပြီး PR ကို သင့်တော်စွာ အမှတ်အသား (ဥပမာ - label, comment) ပြုလုပ်ပေးပါမည်။ Bot မှ ပေးထားသောညွှန်ကြားချက်များကို လိုက်နာပါ။ Microsoft CLA ကို အသုံးပြုသည့် repository အားလုံးအတွက် သင်ဤလုပ်ငန်းစဉ်ကို တစ်ကြိမ်သာ လိုအပ်ပါမည်။ + +ဒီပရောဂျက်သည် [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) ကို လက်ခံထားပါသည်။ +ပိုမိုသိရှိလိုပါက [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) ကို ကြည့်ပါ +သို့မဟုတ် [opencode@microsoft.com](mailto:opencode@microsoft.com) သို့ အပိုဆောင်းမေးခွန်းများ သို့မဟုတ် မှတ်ချက်များ ပေးပို့နိုင်ပါသည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/README.md b/translations/my/README.md new file mode 100644 index 00000000..d05a4bb3 --- /dev/null +++ b/translations/my/README.md @@ -0,0 +1,176 @@ + +[![GitHub license](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/) + +### 🌐 ဘာသာစကားများ အထောက်အပံ့ + +#### GitHub Action မှတဆင့် အလိုအလျောက် (အမြဲနောက်ဆုံးပေါ်) + +[French](../fr/README.md) | [Spanish](../es/README.md) | [German](../de/README.md) | [Russian](../ru/README.md) | [Arabic](../ar/README.md) | [Persian (Farsi)](../fa/README.md) | [Urdu](../ur/README.md) | [Chinese (Simplified)](../zh/README.md) | [Chinese (Traditional, Macau)](../mo/README.md) | [Chinese (Traditional, Hong Kong)](../hk/README.md) | [Chinese (Traditional, Taiwan)](../tw/README.md) | [Japanese](../ja/README.md) | [Korean](../ko/README.md) | [Hindi](../hi/README.md) | [Bengali](../bn/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Portuguese (Portugal)](../pt/README.md) | [Portuguese (Brazil)](../br/README.md) | [Italian](../it/README.md) | [Polish](../pl/README.md) | [Turkish](../tr/README.md) | [Greek](../el/README.md) | [Thai](../th/README.md) | [Swedish](../sv/README.md) | [Danish](../da/README.md) | [Norwegian](../no/README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](../he/README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Croatian](../hr/README.md) | [Slovenian](../sl/README.md) | [Ukrainian](../uk/README.md) | [Burmese (Myanmar)](./README.md) + +#### အသိုင်းအဝိုင်းနှင့် ပူးပေါင်းပါ + +[![Azure AI Discord](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) + +# စတင်လေ့လာရန် - Machine Learning အခြေခံသင်ခန်းစာ + +> 🌍 ကမ္ဘာ့ယဉ်ကျေးမှုများကို အခြေခံပြီး Machine Learning ကို လေ့လာရင်း ကမ္ဘာပတ်လည် ခရီးသွားလိုက်ပါ 🌍 + +Microsoft ၏ Cloud Advocates များသည် **Machine Learning** အကြောင်းကို 12 ပတ်၊ 26 သင်ခန်းစာဖြင့် သင်ကြားရန် သင်ခန်းစာအစီအစဉ်တစ်ခုကို ပေးဆောင်ရန် ဝမ်းမြောက်စွာ တင်ပြပါသည်။ ဒီသင်ခန်းစာအစီအစဉ်တွင် **classic machine learning** ဟုခေါ်ဆိုသော နည်းလမ်းများကို Scikit-learn ကို အဓိကစာကြည့်တိုက်အဖြစ် အသုံးပြု၍ သင်ယူမည်ဖြစ်ပြီး deep learning ကို [AI for Beginners' curriculum](https://aka.ms/ai4beginners) တွင် ဖော်ပြထားသောအတိုင်း ခွဲခြားထားပါသည်။ ['Data Science for Beginners' curriculum](https://aka.ms/ds4beginners) နှင့် တွဲဖက်၍ သင်ခန်းစာများကို လေ့လာပါ။ + +ကမ္ဘာပတ်လည် ခရီးသွားလိုက်ရင်း classic နည်းလမ်းများကို ကမ္ဘာ့ဒေတာများတွင် အသုံးချပါ။ သင်ခန်းစာတစ်ခုစီတွင် သင်ခန်းစာမတိုင်မီနှင့် သင်ခန်းစာပြီးဆုံးပြီးနောက် စစ်တမ်းများ၊ သင်ခန်းစာကို ပြီးမြောက်ရန် ရေးသားထားသော လမ်းညွှန်ချက်များ၊ ဖြေရှင်းချက်၊ လေ့ကျင့်ခန်းများနှင့် အခြားအရာများ ပါဝင်သည်။ Project-based သင်ကြားမှုနည်းလမ်းသည် သင်ယူမှုကို တိုးတက်စေပြီး ကျွမ်းကျင်မှုအသစ်များကို ထိန်းသိမ်းနိုင်စေသည်။ + +**✍️ ကျေးဇူးအထူးတင်ရှိပါသည်** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Anirban Mukherjee, Ornella Altunyan, Ruth Yakubu နှင့် Amy Boyd + +**🎨 ကျေးဇူးတင်ရှိပါသည်** Tomomi Imura, Dasani Madipalli, နှင့် Jen Looper + +**🙏 Microsoft Student Ambassador များအား အထူးကျေးဇူးတင်ရှိပါသည်** Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila, နှင့် Snigdha Agarwal + +**🤩 Microsoft Student Ambassadors Eric Wanjau, Jasleen Sondhi, နှင့် Vidushi Gupta အား R သင်ခန်းစာများအတွက် အထူးကျေးဇူးတင်ရှိပါသည်!** + +# စတင်ရန် + +အောက်ပါအဆင့်များကို လိုက်နာပါ: +1. **Repository ကို Fork လုပ်ပါ**: ဒီစာမျက်နှာ၏ အပေါ်ယာဘက်ရှိ "Fork" ခလုတ်ကို နှိပ်ပါ။ +2. **Repository ကို Clone လုပ်ပါ**: `git clone https://github.com/microsoft/ML-For-Beginners.git` + +> [ဒီသင်ခန်းစာအတွက် အပိုဆောင်းအရင်းအမြစ်များကို Microsoft Learn collection တွင် ရှာဖွေပါ](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +**[ကျောင်းသားများ](https://aka.ms/student-page)**, ဒီသင်ခန်းစာအစီအစဉ်ကို သင်၏ GitHub အကောင့်သို့ Fork လုပ်ပြီး သင့်အတန်းအဖွဲ့နှင့် သီးသန့် သို့မဟုတ် အုပ်စုဖြင့် လေ့ကျင့်ခန်းများကို ပြီးမြောက်ပါ: + +- သင်ခန်းစာမတိုင်မီ စစ်တမ်းကို စတင်ပါ။ +- သင်ခန်းစာကို ဖတ်ပြီး လေ့ကျင့်ခန်းများကို ပြီးမြောက်ပါ၊ knowledge check တစ်ခုစီတွင် ရပ်နားပြီး အတွေးအမြင်များကို ပြန်လည်သုံးသပ်ပါ။ +- သင်ခန်းစာများကို နားလည်ခြင်းဖြင့် Project များကို ဖန်တီးရန် ကြိုးစားပါ၊ သို့သော် ဖြေရှင်းချက် code ကို `/solution` folder တွင် ရှာနိုင်ပါသည်။ +- သင်ခန်းစာပြီးဆုံးပြီးနောက် စစ်တမ်းကို ပြုလုပ်ပါ။ +- လေ့ကျင့်ခန်းကို ပြီးမြောက်ပါ။ +- သင်ခန်းစာအုပ်စုတစ်ခုကို ပြီးမြောက်ပြီးနောက် [Discussion Board](https://github.com/microsoft/ML-For-Beginners/discussions) သို့ သွားပြီး PAT rubric ကို ဖြည့်စွက်ပါ။ PAT သည် Progress Assessment Tool ဖြစ်ပြီး သင့်လေ့လာမှုကို တိုးတက်စေရန် ရည်ရွယ်ထားသော rubric တစ်ခုဖြစ်သည်။ PAT များကို အခြားသူများနှင့် ပြန်လည်ဆွေးနွေးနိုင်ပါသည်။ + +> အပိုဆောင်းလေ့လာရန်အတွက် [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott) module များနှင့် learning path များကို လိုက်နာရန် အကြံပြုပါသည်။ + +**ဆရာများ**, [ဒီသင်ခန်းစာကို အသုံးပြုရန် အကြံပြုချက်များ](for-teachers.md) ပါဝင်သည်။ + +--- + +## ဗီဒီယို လမ်းညွှန်ချက်များ + +သင်ခန်းစာတစ်ချို့ကို အတိုချုပ်ဗီဒီယိုအဖြစ် ရရှိနိုင်ပါသည်။ သင်ခန်းစာများတွင် အတွင်းပိုင်းတွင် ရှာနိုင်သလို [Microsoft Developer YouTube channel](https://aka.ms/ml-beginners-videos) တွင် ML for Beginners playlist တွင်လည်း ရှာနိုင်ပါသည်။ + +[![ML for beginners banner](../../images/ml-for-beginners-video-banner.png)](https://aka.ms/ml-beginners-videos) + +--- + +## အဖွဲ့ကို တွေ့ဆုံပါ + +[![Promo video](../../images/ml.gif)](https://youtu.be/Tj1XWrDSYJU) + +**Gif by** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal) + +> 🎥 အပေါ်ရှိ ပုံကို နှိပ်ပြီး ဒီ project နှင့် ဖန်တီးသူများအကြောင်း ဗီဒီယိုကို ကြည့်ပါ! + +--- + +## သင်ကြားမှုနည်းလမ်း + +ဒီသင်ခန်းစာကို ဖန်တီးရာတွင် **project-based** ဖြစ်စေရန်နှင့် **စစ်တမ်းများ** မကြာခဏ ပါဝင်စေရန် အခြေခံထားသည်။ ထို့အပြင် သင်ခန်းစာများကို **theme** တစ်ခုဖြင့် တစ်စည်းတစ်လုံးဖြစ်စေရန် ရည်ရွယ်ထားသည်။ + +Project-based သင်ကြားမှုနည်းလမ်းသည် ကျောင်းသားများအတွက် စိတ်ဝင်စားမှုကို တိုးတက်စေပြီး သင်ယူမှုကို ထိန်းသိမ်းနိုင်စေသည်။ သင်ခန်းစာမတိုင်မီ စစ်တမ်းသည် ကျောင်းသားများကို သင်ခန်းစာအကြောင်း စိတ်ဝင်စားစေပြီး သင်ခန်းစာပြီးဆုံးပြီးနောက် စစ်တမ်းသည် သင်ယူမှုကို ထိန်းသိမ်းနိုင်စေသည်။ ဒီသင်ခန်းစာအစီအစဉ်ကို အပြည့်အစုံ သို့မဟုတ် အစိတ်အပိုင်းအဖြစ် flexible ဖြစ်စေရန် ဖန်တီးထားသည်။ Project များသည် သေးငယ်ပြီး 12 ပတ်အတွင်း increasingly complex ဖြစ်လာမည်ဖြစ်သည်။ + +> [Code of Conduct](CODE_OF_CONDUCT.md), [Contributing](CONTRIBUTING.md), နှင့် [Translation](TRANSLATIONS.md) လမ်းညွှန်ချက်များကို ရှာပါ။ သင်၏ အဆောက်အအုံဆန်းစစ်ချက်များကို ကြိုဆိုပါသည်! + +## သင်ခန်းစာတစ်ခုစီတွင် ပါဝင်သည် + +- optional sketchnote +- optional supplemental video +- video walkthrough (သင်ခန်းစာတစ်ချို့တွင်သာ) +- [pre-lecture warmup quiz](https://ff-quizzes.netlify.app/en/ml/) +- written lesson +- project-based သင်ခန်းစာများအတွက် project ကို ဖန်တီးရန် လမ်းညွှန်ချက်များ +- knowledge checks +- challenge +- supplemental reading +- assignment +- [post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +> **ဘာသာစကားများအကြောင်း မှတ်ချက်**: သင်ခန်းစာများကို အဓိကအားဖြင့် Python ဖြင့် ရေးသားထားပြီး R ဖြင့်လည်း ရရှိနိုင်ပါသည်။ R သင်ခန်းစာကို `/solution` folder တွင် ရှာပါ။ .rmd extension ပါဝင်သော R Markdown ဖိုင်များကို ရှာနိုင်ပါသည်။ + +> **စစ်တမ်းများအကြောင်း မှတ်ချက်**: [Quiz App folder](../../quiz-app) တွင် စစ်တမ်းများအားလုံး ပါဝင်ပြီး စုစုပေါင်း 52 စစ်တမ်း၊ တစ်ခုလျှင် 3 မေးခွန်းပါဝင်သည်။ + +| သင်ခန်းစာနံပါတ် | ခေါင်းစဉ် | သင်ခန်းစာအုပ်စု | သင်ယူရမည့် ရည်ရွယ်ချက်များ | သင်ခန်းစာ | ဖန်တီးသူ | +| :-----------: | :------------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: | +| 01 | Machine Learning အကြောင်း အကျဉ်းချုပ် | [Introduction](1-Introduction/README.md) | Machine Learning အခြေခံအယူအဆများကို သင်ယူပါ | [Lesson](1-Introduction/1-intro-to-ML/README.md) | Muhammad | +| 02 | Machine Learning ၏ သမိုင်းကြောင်း | [Introduction](1-Introduction/README.md) | ဒီနယ်ပယ်၏ သမိုင်းကြောင်းကို သင်ယူပါ | [Lesson](1-Introduction/2-history-of-ML/README.md) | Jen and Amy | +| 03 | Machine Learning နှင့် တရားမျှတမှု | [Introduction](1-Introduction/README.md) | ML models ဖန်တီးခြင်းနှင့် အသုံးချခြင်းတွင် ကျောင်းသားများ သတိထားသင့်သော တရားမျှတမှုဆိုင်ရာ အရေးကြီးသော အတွေးအမြင်များကို သင်ယူပါ | [Lesson](1-Introduction/3-fairness/README.md) | Tomomi | +| 04 | မက်ရှင်လေန်နင်းအတွက်နည်းလမ်းများ | [Introduction](1-Introduction/README.md) | ML မော်ဒယ်များကိုတည်ဆောက်ရန် ML သုတေသနပြုသူများအသုံးပြုသောနည်းလမ်းများကဘာလဲ? | [Lesson](1-Introduction/4-techniques-of-ML/README.md) | Chris နှင့် Jen | +| 05 | Regression အကြောင်းမိတ်ဆက် | [Regression](2-Regression/README.md) | Regression မော်ဒယ်များအတွက် Python နှင့် Scikit-learn ကိုစတင်အသုံးပြုပါ | +
            • [Python](2-Regression/1-Tools/README.md)
            • [R](../../2-Regression/1-Tools/solution/R/lesson_1.html)
            |
            • Jen
            • Eric Wanjau
            | +| 06 | မြောက်အမေရိကန်ဖရုံသီးဈေးနှုန်း 🎃 | [Regression](2-Regression/README.md) | ML အတွက်အချက်အလက်များကိုမြင်ကွင်းဖန်တီးပြီးသန့်စင်ပါ |
            • [Python](2-Regression/2-Data/README.md)
            • [R](../../2-Regression/2-Data/solution/R/lesson_2.html)
            |
            • Jen
            • Eric Wanjau
            | +| 07 | မြောက်အမေရိကန်ဖရုံသီးဈေးနှုန်း 🎃 | [Regression](2-Regression/README.md) | Linear နှင့် Polynomial Regression မော်ဒယ်များကိုတည်ဆောက်ပါ |
            • [Python](2-Regression/3-Linear/README.md)
            • [R](../../2-Regression/3-Linear/solution/R/lesson_3.html)
            |
            • Jen နှင့် Dmitry
            • Eric Wanjau
            | +| 08 | မြောက်အမေရိကန်ဖရုံသီးဈေးနှုန်း 🎃 | [Regression](2-Regression/README.md) | Logistic Regression မော်ဒယ်တစ်ခုကိုတည်ဆောက်ပါ |
            • [Python](2-Regression/4-Logistic/README.md)
            • [R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)
            |
            • Jen
            • Eric Wanjau
            | +| 09 | ဝက်ဘ်အက်ပ် 🔌 | [Web App](3-Web-App/README.md) | သင်၏လေ့ကျင့်ထားသောမော်ဒယ်ကိုအသုံးပြုရန်ဝက်ဘ်အက်ပ်တစ်ခုကိုတည်ဆောက်ပါ | [Python](3-Web-App/1-Web-App/README.md) | Jen | +| 10 | Classification အကြောင်းမိတ်ဆက် | [Classification](4-Classification/README.md) | သင်၏အချက်အလက်များကိုသန့်စင်၊ ပြင်ဆင်၊ မြင်ကွင်းဖန်တီးပါ။ Classification အကြောင်းမိတ်ဆက်ပါ |
            • [Python](4-Classification/1-Introduction/README.md)
            • [R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) |
              • Jen နှင့် Cassie
              • Eric Wanjau
              | +| 11 | အာရှနှင့်အိန္ဒိယအစားအစာများ 🍜 | [Classification](4-Classification/README.md) | Classifiers အကြောင်းမိတ်ဆက် |
              • [Python](4-Classification/2-Classifiers-1/README.md)
              • [R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) |
                • Jen နှင့် Cassie
                • Eric Wanjau
                | +| 12 | အာရှနှင့်အိန္ဒိယအစားအစာများ 🍜 | [Classification](4-Classification/README.md) | Classifiers ပိုမိုများပြား |
                • [Python](4-Classification/3-Classifiers-2/README.md)
                • [R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) |
                  • Jen နှင့် Cassie
                  • Eric Wanjau
                  | +| 13 | အာရှနှင့်အိန္ဒိယအစားအစာများ 🍜 | [Classification](4-Classification/README.md) | သင်၏မော်ဒယ်ကိုအသုံးပြု၍ recommender ဝက်ဘ်အက်ပ်တစ်ခုကိုတည်ဆောက်ပါ | [Python](4-Classification/4-Applied/README.md) | Jen | +| 14 | Clustering အကြောင်းမိတ်ဆက် | [Clustering](5-Clustering/README.md) | သင်၏အချက်အလက်များကိုသန့်စင်၊ ပြင်ဆင်၊ မြင်ကွင်းဖန်တီးပါ။ Clustering အကြောင်းမိတ်ဆက်ပါ |
                  • [Python](5-Clustering/1-Visualize/README.md)
                  • [R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) |
                    • Jen
                    • Eric Wanjau
                    | +| 15 | နိုင်ဂျီးရီးယားဂီတအရသာများ 🎧 | [Clustering](5-Clustering/README.md) | K-Means Clustering နည်းလမ်းကိုလေ့လာပါ |
                    • [Python](5-Clustering/2-K-Means/README.md)
                    • [R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) |
                      • Jen
                      • Eric Wanjau
                      | +| 16 | သဘာဝဘာသာစကားလုပ်ငန်းစဉ်အကြောင်းမိတ်ဆက် ☕️ | [Natural language processing](6-NLP/README.md) | Bot တစ်ခုကိုတည်ဆောက်ခြင်းဖြင့် NLP အခြေခံကိုလေ့လာပါ | [Python](6-NLP/1-Introduction-to-NLP/README.md) | Stephen | +| 17 | ရှေ့ပြေး NLP လုပ်ငန်းစဉ်များ ☕️ | [Natural language processing](6-NLP/README.md) | ဘာသာစကားဖွဲ့စည်းမှုများနှင့်ဆက်နွယ်သောလုပ်ငန်းစဉ်များကိုနားလည်ခြင်းဖြင့် NLP အသိပညာကိုပိုမိုတိုးချဲ့ပါ | [Python](6-NLP/2-Tasks/README.md) | Stephen | +| 18 | ဘာသာပြန်ခြင်းနှင့်ခံစားချက်ခွဲခြားခြင်း ♥️ | [Natural language processing](6-NLP/README.md) | Jane Austen နှင့်အတူဘာသာပြန်ခြင်းနှင့်ခံစားချက်ခွဲခြားခြင်း | [Python](6-NLP/3-Translation-Sentiment/README.md) | Stephen | +| 19 | ဥရောပ၏ရိုမန်တစ်ဟိုတယ်များ ♥️ | [Natural language processing](6-NLP/README.md) | ဟိုတယ်ပြန်လည်သုံးသပ်ချက်များ 1 ဖြင့်ခံစားချက်ခွဲခြားခြင်း | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | Stephen | +| 20 | ဥရောပ၏ရိုမန်တစ်ဟိုတယ်များ ♥️ | [Natural language processing](6-NLP/README.md) | ဟိုတယ်ပြန်လည်သုံးသပ်ချက်များ 2 ဖြင့်ခံစားချက်ခွဲခြားခြင်း | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | Stephen | +| 21 | အချိန်စီးရီးခန့်မှန်းခြင်းအကြောင်းမိတ်ဆက် | [Time series](7-TimeSeries/README.md) | အချိန်စီးရီးခန့်မှန်းခြင်းအကြောင်းမိတ်ဆက် | [Python](7-TimeSeries/1-Introduction/README.md) | Francesca | +| 22 | ⚡️ ကမ္ဘာ့လျှပ်စစ်သုံးစွဲမှု ⚡️ - ARIMA ဖြင့်အချိန်စီးရီးခန့်မှန်းခြင်း | [Time series](7-TimeSeries/README.md) | ARIMA ဖြင့်အချိန်စီးရီးခန့်မှန်းခြင်း | [Python](7-TimeSeries/2-ARIMA/README.md) | Francesca | +| 23 | ⚡️ ကမ္ဘာ့လျှပ်စစ်သုံးစွဲမှု ⚡️ - SVR ဖြင့်အချိန်စီးရီးခန့်မှန်းခြင်း | [Time series](7-TimeSeries/README.md) | Support Vector Regressor ဖြင့်အချိန်စီးရီးခန့်မှန်းခြင်း | [Python](7-TimeSeries/3-SVR/README.md) | Anirban | +| 24 | Reinforcement Learning အကြောင်းမိတ်ဆက် | [Reinforcement learning](8-Reinforcement/README.md) | Q-Learning ဖြင့် Reinforcement Learning အကြောင်းမိတ်ဆက် | [Python](8-Reinforcement/1-QLearning/README.md) | Dmitry | +| 25 | Peter ကိုဝက်မထိစေပါ 🐺 | [Reinforcement learning](8-Reinforcement/README.md) | Reinforcement Learning Gym | [Python](8-Reinforcement/2-Gym/README.md) | Dmitry | +| Postscript | အမှန်တကယ် ML အခြေအနေများနှင့်လျှောက်လွှာများ | [ML in the Wild](9-Real-World/README.md) | ရိုးရာ ML ၏စိတ်ဝင်စားဖွယ်နှင့်ဖော်ထုတ်နိုင်သောအမှန်တကယ်လျှောက်လွှာများ | [Lesson](9-Real-World/1-Applications/README.md) | Team | +| Postscript | RAI Dashboard ဖြင့် ML မော်ဒယ် Debugging | [ML in the Wild](9-Real-World/README.md) | Responsible AI Dashboard အစိတ်အပိုင်းများကိုအသုံးပြု၍ ML မော်ဒယ် Debugging | [Lesson](9-Real-World/2-Debugging-ML-Models/README.md) | Ruth Yakubu | + +> [ဤသင်ခန်းစာအတွက် Microsoft Learn collection တွင်အပိုဆောင်းအရင်းအမြစ်များအားလုံးကိုရှာပါ](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +## အော့ဖ်လိုင်းအသုံးပြုမှု + +ဤစာရွက်စာတမ်းကို [Docsify](https://docsify.js.org/#/) ကိုအသုံးပြု၍ အော့ဖ်လိုင်းတွင်လည်ပတ်နိုင်သည်။ ဤ repo ကို Fork လုပ်ပြီး [Docsify](https://docsify.js.org/#/quickstart) ကိုသင်၏ဒေသခံစက်တွင်ထည့်သွင်းပါ၊ ထို့နောက်ဤ repo ၏ root folder တွင် `docsify serve` ကိုရိုက်ပါ။ ဝက်ဘ်ဆိုဒ်ကို localhost: `localhost:3000` တွင် port 3000 တွင်လည်ပတ်မည်။ + +## PDFs + +လင့်များပါရှိသော curriculum ၏ pdf ကို [ဒီမှာ](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf) တွေ့ပါ။ + +## 🎒 အခြားသင်ခန်းစာများ + +ကျွန်ုပ်တို့၏အဖွဲ့သည်အခြားသင်ခန်းစာများကိုထုတ်လုပ်ပါသည်! စစ်ဆေးပါ: + +- [Generative AI for Beginners](https://aka.ms/genai-beginners) +- [Generative AI for Beginners .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet) +- [Generative AI with JavaScript](https://github.com/microsoft/generative-ai-with-javascript) +- [Generative AI with Java](https://github.com/microsoft/Generative-AI-for-beginners-java) +- [AI for Beginners](https://aka.ms/ai-beginners) +- [Data Science for Beginners](https://aka.ms/datascience-beginners) +- [ML for Beginners](https://aka.ms/ml-beginners) +- [Cybersecurity for Beginners](https://github.com/microsoft/Security-101) +- [Web Dev for Beginners](https://aka.ms/webdev-beginners) +- [IoT for Beginners](https://aka.ms/iot-beginners) +- [XR Development for Beginners](https://github.com/microsoft/xr-development-for-beginners) +- [Mastering GitHub Copilot for Paired Programming](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming) +- [Mastering GitHub Copilot for C#/.NET Developers](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers) +- [Choose Your Own Copilot Adventure](https://github.com/microsoft/CopilotAdventures) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/SECURITY.md b/translations/my/SECURITY.md new file mode 100644 index 00000000..61037c01 --- /dev/null +++ b/translations/my/SECURITY.md @@ -0,0 +1,51 @@ + +## လုံခြုံရေး + +Microsoft သည် ၎င်း၏ ဆော့ဖ်ဝဲထုတ်ကုန်များနှင့် ဝန်ဆောင်မှုများ၏ လုံခြုံရေးကို အလေးထားဆောင်ရွက်ပါသည်။ ၎င်းတွင် [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin) နှင့် [ကျွန်ုပ်တို့၏ GitHub အဖွဲ့အစည်းများ](https://opensource.microsoft.com/) အပါအဝင် GitHub အဖွဲ့အစည်းများမှ စီမံခန့်ခွဲထားသော အရင်းအမြစ်ကုဒ်ရုံများအားလုံးပါဝင်သည်။ + +Microsoft ပိုင် GitHub ရုံများအတွင်း [Microsoft ၏ လုံခြုံရေးထိခိုက်မှုအဓိပ္ပာယ်](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott) အတိုင်း သတ်မှတ်ထားသော လုံခြုံရေးထိခိုက်မှုတစ်ခုကို ရှာဖွေတွေ့ရှိခဲ့သည်ဟု သင်ယုံကြည်ပါက၊ အောက်တွင် ဖော်ပြထားသည့်အတိုင်း ကျွန်ုပ်တို့ထံ တင်ပြပါ။ + +## လုံခြုံရေးပြဿနာများ တင်ပြခြင်း + +**GitHub public issues မှတစ်ဆင့် လုံခြုံရေးထိခိုက်မှုများကို တင်ပြမထားပါနှင့်။** + +ထို့အစား၊ Microsoft Security Response Center (MSRC) သို့ [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report) တွင် တင်ပြပါ။ + +အကောင့်ဝင်မလုပ်ဘဲ တင်ပြလိုပါက [secure@microsoft.com](mailto:secure@microsoft.com) သို့ အီးမေးလ်ပို့ပါ။ သင်၏ စာကို PGP key ဖြင့် စာဝှက်ထားနိုင်ပါက ပိုမိုကောင်းမွန်ပါမည်။ [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc) မှ ဒေါင်းလုဒ်ဆွဲပါ။ + +သင်သည် ၂၄ နာရီအတွင်း တုံ့ပြန်မှုကို ရရှိသင့်ပါသည်။ တစ်စုံတစ်ရာအကြောင်းကြောင့် မရရှိပါက၊ သင်၏မူရင်းစာကို ကျွန်ုပ်တို့လက်ခံရရှိခဲ့ကြောင်း အတည်ပြုရန် အီးမေးလ်ဖြင့် ထပ်မံဆက်သွယ်ပါ။ အပိုဆောင်းအချက်အလက်များကို [microsoft.com/msrc](https://www.microsoft.com/msrc) တွင် ရှာဖွေနိုင်ပါသည်။ + +ကျွန်ုပ်တို့အား အောက်ဖော်ပြပါ အချက်အလက်များ (သင်ပေးနိုင်သလောက်) ဖြင့် တင်ပြပါက ပြဿနာ၏ သဘာဝနှင့် အကျယ်အဝန်းကို ပိုမိုနားလည်နိုင်မည်ဖြစ်သည်- + + * ပြဿနာအမျိုးအစား (ဥပမာ - buffer overflow, SQL injection, cross-site scripting, စသည်) + * ပြဿနာနှင့်ဆက်စပ်သော အရင်းအမြစ်ဖိုင်(များ) ၏ လမ်းကြောင်းအပြည့်အစုံ + * ထိခိုက်မှုရှိသော အရင်းအမြစ်ကုဒ်တည်နေရာ (tag/branch/commit သို့မဟုတ် direct URL) + * ပြဿနာကို ထပ်မံဖြစ်ပေါ်စေရန် လိုအပ်သော အထူးဖွဲ့စည်းမှုများ + * ပြဿနာကို ထပ်မံဖြစ်ပေါ်စေရန် လိုက်နာရမည့် လမ်းညွှန်ချက်များ + * Proof-of-concept သို့မဟုတ် exploit code (ဖြစ်နိုင်ပါက) + * ပြဿနာ၏ သက်ရောက်မှု၊ ထိုပြဿနာကို တိုက်ခိုက်သူတစ်ဦးက မည်သို့ အသုံးချနိုင်မည်ဆိုသည်ကို အပါအဝင် + +ဤအချက်အလက်များသည် သင်၏ တင်ပြချက်ကို ပိုမိုမြန်ဆန်စွာ စီစစ်နိုင်ရန် ကူညီပေးမည်ဖြစ်သည်။ + +Bug bounty အတွက် တင်ပြနေပါက၊ အပြည့်အစုံသော အစီရင်ခံစာများသည် ပိုမိုမြင့်မားသော bounty ဆုချီးမြှင့်မှုကို ရရှိစေနိုင်ပါသည်။ ကျွန်ုပ်တို့၏ လက်ရှိအစီအစဉ်များအကြောင်း အသေးစိတ်ကို [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) စာမျက်နှာတွင် ကြည့်ရှုနိုင်ပါသည်။ + +## အကြိုက်ဆုံးဘာသာစကားများ + +ကျွန်ုပ်တို့သည် အားလုံးကို အင်္ဂလိပ်ဘာသာဖြင့် ဆက်သွယ်ရန် ပိုမိုနှစ်သက်ပါသည်။ + +## မူဝါဒ + +Microsoft သည် [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd) ကို လိုက်နာဆောင်ရွက်ပါသည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပါယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/SUPPORT.md b/translations/my/SUPPORT.md new file mode 100644 index 00000000..6d0c8b77 --- /dev/null +++ b/translations/my/SUPPORT.md @@ -0,0 +1,24 @@ + +# အထောက်အပံ့ +## ပြဿနာများကို တင်ပြခြင်းနှင့် အကူအညီရယူရန် + +ဒီပရောဂျက်သည် GitHub Issues ကို အသုံးပြု၍ အမှားများနှင့် အင်္ဂါရပ်တိုးချဲ့ရန် တောင်းဆိုမှုများကို မှတ်တမ်းတင်ထားပါသည်။ မတူညီသော ပြဿနာများကို ရှောင်ရှားရန်အတွက် အသစ်တင်မီ ရှိပြီးသား ပြဿနာများကို ရှာဖွေပါ။ အသစ်သော ပြဿနာများအတွက်၊ သင့်အမှား သို့မဟုတ် အင်္ဂါရပ်တိုးချဲ့ရန် တောင်းဆိုမှုကို အသစ်သော Issue အဖြစ် တင်ပါ။ + +ဒီပရောဂျက်ကို အသုံးပြုခြင်းနှင့် ပတ်သက်သော အကူအညီနှင့် မေးခွန်းများအတွက် Issue တစ်ခု တင်ပါ။ + +## Microsoft အထောက်အပံ့ မူဝါဒ + +ဒီ repository အတွက် အထောက်အပံ့သည် အထက်တွင် ဖော်ပြထားသော အရင်းအမြစ်များအပေါ် အကန့်အသတ်ရှိပါသည်။ + +--- + +**အကြောင်းကြားချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူရင်းဘာသာစကားဖြင့် အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားယူမှုမှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/docs/_sidebar.md b/translations/my/docs/_sidebar.md new file mode 100644 index 00000000..c288264b --- /dev/null +++ b/translations/my/docs/_sidebar.md @@ -0,0 +1,57 @@ + +- နိဒါန်း + - [စက်မှုသင်ယူမှုအကြောင်းအရာ](../1-Introduction/1-intro-to-ML/README.md) + - [စက်မှုသင်ယူမှု၏ သမိုင်းကြောင်း](../1-Introduction/2-history-of-ML/README.md) + - [စက်မှုသင်ယူမှုနှင့် တရားမျှတမှု](../1-Introduction/3-fairness/README.md) + - [စက်မှုသင်ယူမှု၏ နည်းလမ်းများ](../1-Introduction/4-techniques-of-ML/README.md) + +- ရေဂရက်ရှင်း + - [အသုံးချစရာ ကိရိယာများ](../2-Regression/1-Tools/README.md) + - [ဒေတာ](../2-Regression/2-Data/README.md) + - [လျှာကျစေသော ရေဂရက်ရှင်း](../2-Regression/3-Linear/README.md) + - [လော့ဂျစ်စတစ် ရေဂရက်ရှင်း](../2-Regression/4-Logistic/README.md) + +- ဝက်ဘ်အက်ပ် တည်ဆောက်ခြင်း + - [ဝက်ဘ်အက်ပ်](../3-Web-App/1-Web-App/README.md) + +- ခွဲခြားသတ်မှတ်ခြင်း + - [ခွဲခြားသတ်မှတ်ခြင်း အကြောင်းအရာ](../4-Classification/1-Introduction/README.md) + - [Classifiers 1](../4-Classification/2-Classifiers-1/README.md) + - [Classifiers 2](../4-Classification/3-Classifiers-2/README.md) + - [လက်တွေ့ စက်မှုသင်ယူမှု](../4-Classification/4-Applied/README.md) + +- အုပ်စုဖွဲ့ခြင်း + - [သင့်ဒေတာကို မြင်နိုင်အောင် ပြသခြင်း](../5-Clustering/1-Visualize/README.md) + - [K-Means](../5-Clustering/2-K-Means/README.md) + +- သဘာဝဘာသာစကားလုပ်ငန်းစဉ် (NLP) + - [NLP အကြောင်းအရာ](../6-NLP/1-Introduction-to-NLP/README.md) + - [NLP လုပ်ငန်းစဉ်များ](../6-NLP/2-Tasks/README.md) + - [ဘာသာပြန်ခြင်းနှင့်ခံစားချက်](../6-NLP/3-Translation-Sentiment/README.md) + - [ဟိုတယ်ပြန်လည်သုံးသပ်မှု 1](../6-NLP/4-Hotel-Reviews-1/README.md) + - [ဟိုတယ်ပြန်လည်သုံးသပ်မှု 2](../6-NLP/5-Hotel-Reviews-2/README.md) + +- အချိန်လိုက်အဆင့်ခန့်မှန်းခြင်း + - [အချိန်လိုက်ခန့်မှန်းခြင်း အကြောင်းအရာ](../7-TimeSeries/1-Introduction/README.md) + - [ARIMA](../7-TimeSeries/2-ARIMA/README.md) + - [SVR](../7-TimeSeries/3-SVR/README.md) + +- အားဖြည့်သင်ယူမှု + - [Q-Learning](../8-Reinforcement/1-QLearning/README.md) + - [Gym](../8-Reinforcement/2-Gym/README.md) + +- လက်တွေ့ စက်မှုသင်ယူမှု + - [လျှောက်လွှာများ](../9-Real-World/1-Applications/README.md) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သော ရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/for-teachers.md b/translations/my/for-teachers.md new file mode 100644 index 00000000..d28509d4 --- /dev/null +++ b/translations/my/for-teachers.md @@ -0,0 +1,37 @@ + +## ကျောင်းဆရာများအတွက် + +ဒီသင်ခန်းစာများကို သင့်အတန်းထဲမှာ အသုံးပြုချင်ပါသလား? အခမဲ့အသုံးပြုနိုင်ပါတယ်! + +အမှန်တကယ်တော့ GitHub ကို အသုံးပြုပြီး GitHub Classroom မှာ အသုံးပြုနိုင်ပါတယ်။ + +ဒါလုပ်ဖို့အတွက် ဒီ repo ကို fork လုပ်ပါ။ သင့်အနေနဲ့ သင်ခန်းစာတစ်ခုချင်းစီအတွက် repo တစ်ခုဖန်တီးဖို့လိုအပ်မှာဖြစ်ပြီး၊ folder တစ်ခုချင်းစီကို သီးသန့် repo အဖြစ် extract လုပ်ဖို့လိုအပ်ပါမယ်။ ဒီလိုလုပ်ရင် [GitHub Classroom](https://classroom.github.com/classrooms) က သင်ခန်းစာတစ်ခုချင်းစီကို သီးသန့်အသုံးပြုနိုင်ပါမယ်။ + +ဒီ [အပြည့်အစုံလမ်းညွှန်ချက်များ](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) က သင့်အတန်းကို စီစဉ်ပုံကို အကြမ်းဖျင်းသိရှိစေပါမယ်။ + +## Repo ကို လက်ရှိအတိုင်းအသုံးပြုခြင်း + +GitHub Classroom ကို အသုံးမပြုဘဲ Repo ကို လက်ရှိအတိုင်း အသုံးပြုချင်တယ်ဆိုရင်လည်း အဆင်ပြေပါတယ်။ သင့်အနေနဲ့ သင့်ကျောင်းသားများကို ဘယ်သင်ခန်းစာကို အတူတူ လေ့လာရမယ်ဆိုတာ ဆက်သွယ်ပေးရပါမယ်။ + +အွန်လိုင်းပုံစံ (Zoom, Teams, ဒါမှမဟုတ် အခြား) မှာ quizzes အတွက် breakout rooms ဖွဲ့ပြီး၊ ကျောင်းသားများကို လေ့လာရန် ပြင်ဆင်စေဖို့ mentor လုပ်နိုင်ပါတယ်။ ပြီးရင် quizzes အတွက် ကျောင်းသားများကို ဖိတ်ခေါ်ပြီး 'issues' အနေနဲ့ အချိန်တစ်ခုမှာ အဖြေများကို submit လုပ်စေပါ။ Assignments အတွက်လည်း ကျောင်းသားများကို ပွင့်လင်းပုံစံနဲ့ ပူးပေါင်းလုပ်ဆောင်စေချင်တယ်ဆိုရင် ဒီလိုပုံစံနဲ့ လုပ်နိုင်ပါတယ်။ + +ပိုပြီး private ပုံစံကို သင့်အတန်းမှာ အသုံးပြုချင်တယ်ဆိုရင် ကျောင်းသားများကို curriculum ကို lesson တစ်ခုချင်းစီ fork လုပ်ပြီး သူတို့ရဲ့ GitHub repos တွေကို private repos အဖြစ်ထားစေပါ။ ပြီးရင် သင့်ကို access ပေးပါ။ ဒီလိုလုပ်ပြီး quizzes နဲ့ assignments တွေကို private ပုံစံနဲ့ ပြီးစီးစေပြီး၊ classroom repo မှာ issues အနေနဲ့ submit လုပ်စေပါ။ + +အွန်လိုင်းအတန်းပုံစံမှာ ဒီလိုလုပ်ဖို့ နည်းလမ်းများစွာရှိပါတယ်။ သင့်အတွက် အကောင်းဆုံးအဆင်ပြေတဲ့နည်းလမ်းကို ကျေးဇူးပြုပြီး ပြောပြပေးပါ! + +## ကျေးဇူးပြုပြီး သင့်အမြင်ကို မျှဝေပါ! + +ဒီ curriculum ကို သင့်နဲ့ သင့်ကျောင်းသားများအတွက် အကောင်းဆုံးဖြစ်စေချင်ပါတယ်။ ကျေးဇူးပြုပြီး [အကြံပြုချက်](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u) ပေးပါ! + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပြန်ဆိုမှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/quiz-app/README.md b/translations/my/quiz-app/README.md new file mode 100644 index 00000000..7cd4a33a --- /dev/null +++ b/translations/my/quiz-app/README.md @@ -0,0 +1,127 @@ + +# မေးခွန်းများ + +ဒီမေးခွန်းများက ML သင်ခန်းစာများအတွက် [https://aka.ms/ml-beginners](https://aka.ms/ml-beginners) မှာရှိတဲ့ သင်ခန်းစာမတိုင်မီနှင့် သင်ခန်းစာပြီးနောက် မေးခွန်းများဖြစ်ပါတယ်။ + +## Project setup + +``` +npm install +``` + +### Development အတွက် Compile လုပ်ပြီး Hot-reload + +``` +npm run serve +``` + +### Production အတွက် Compile လုပ်ပြီး Minify + +``` +npm run build +``` + +### ဖိုင်များကို Lint လုပ်ပြီး ပြင်ဆင် + +``` +npm run lint +``` + +### Configuration ကို Customize လုပ်ရန် + +[Configuration Reference](https://cli.vuejs.org/config/) ကိုကြည့်ပါ။ + +Credit: ဒီ Quiz App ရဲ့ မူရင်းဗားရှင်းကို ဖန်တီးသူ [https://github.com/arpan45/simple-quiz-vue](https://github.com/arpan45/simple-quiz-vue) ကို ကျေးဇူးတင်ပါတယ်။ + +## Azure မှာ Deploy လုပ်ခြင်း + +ဒီအဆင့်ဆင့်လမ်းညွှန်ကို အသုံးပြုပြီး စတင်လုပ်ဆောင်ပါ: + +1. GitHub Repository ကို Fork လုပ်ပါ +သင့် Static Web App Code ကို GitHub Repository မှာရှိအောင်လုပ်ပါ။ ဒီ Repository ကို Fork လုပ်ပါ။ + +2. Azure Static Web App တစ်ခု Create လုပ်ပါ +- [Azure account](http://azure.microsoft.com) တစ်ခု Create လုပ်ပါ +- [Azure portal](https://portal.azure.com) ကိုသွားပါ +- “Create a resource” ကိုနှိပ်ပြီး “Static Web App” ကို ရှာပါ။ +- “Create” ကိုနှိပ်ပါ။ + +3. Static Web App ကို Configure လုပ်ပါ +- #### Basics: + - Subscription: သင့် Azure subscription ကို ရွေးပါ။ + - Resource Group: Resource group အသစ်တစ်ခု Create လုပ်ပါ၊ ဒါမှမဟုတ် ရှိပြီးသား Resource group ကို အသုံးပြုပါ။ + - Name: သင့် Static Web App အတွက် နာမည်ပေးပါ။ + - Region: သင့်အသုံးပြုသူများနီးစပ်ရာ Region ကို ရွေးပါ။ + +- #### Deployment Details: + - Source: “GitHub” ကို ရွေးပါ။ + - GitHub Account: Azure ကို သင့် GitHub account ကို အသုံးပြုခွင့်ပေးပါ။ + - Organization: သင့် GitHub organization ကို ရွေးပါ။ + - Repository: သင့် Static Web App ရှိတဲ့ Repository ကို ရွေးပါ။ + - Branch: Deploy လုပ်ချင်တဲ့ Branch ကို ရွေးပါ။ + +- #### Build Details: + - Build Presets: သင့် App ဖန်တီးထားတဲ့ Framework ကို ရွေးပါ (ဥပမာ React, Angular, Vue စသည်တို့)။ + - App Location: သင့် App Code ရှိတဲ့ Folder ကို ဖော်ပြပါ (ဥပမာ / သို့မဟုတ် Root မှာရှိပါက /)။ + - API Location: API ရှိပါက အဲဒီနေရာကို ဖော်ပြပါ (optional)။ + - Output Location: Build output ဖိုင်များ ရှိတဲ့ Folder ကို ဖော်ပြပါ (ဥပမာ build သို့မဟုတ် dist)။ + +4. Review and Create +သင့် Settings များကို ပြန်လည်ကြည့်ရှုပြီး “Create” ကိုနှိပ်ပါ။ Azure က လိုအပ်တဲ့ Resources များကို Setup လုပ်ပြီး GitHub Actions Workflow ကို သင့် Repository မှာ Create လုပ်ပါမည်။ + +5. GitHub Actions Workflow +Azure က GitHub Actions Workflow ဖိုင် (.github/workflows/azure-static-web-apps-.yml) ကို သင့် Repository မှာ အလိုအလျောက် Create လုပ်ပါမည်။ ဒီ Workflow က Build နှင့် Deployment လုပ်ငန်းစဉ်ကို Handle လုပ်ပါမည်။ + +6. Deployment ကို Monitor လုပ်ပါ +GitHub Repository ရဲ့ “Actions” tab ကိုသွားပါ။ +Workflow တစ်ခု Run ဖြစ်နေသည်ကို တွေ့ရပါမည်။ ဒီ Workflow က သင့် Static Web App ကို Azure မှာ Build နှင့် Deploy လုပ်ပါမည်။ +Workflow ပြီးဆုံးပြီးနောက် သင့် App ကို Azure URL မှာ Live ဖြစ်နေပါမည်။ + +### Example Workflow File + +GitHub Actions Workflow ဖိုင်ရဲ့ ဥပမာကို အောက်မှာကြည့်ပါ: +name: Azure Static Web Apps CI/CD +``` +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - main + +jobs: + build_and_deploy_job: + runs-on: ubuntu-latest + name: Build and Deploy Job + steps: + - uses: actions/checkout@v2 + - name: Build And Deploy + id: builddeploy + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }} + repo_token: ${{ secrets.GITHUB_TOKEN }} + action: "upload" + app_location: "/quiz-app" # App source code path + api_location: ""API source code path optional + output_location: "dist" #Built app content directory - optional +``` + +### အပိုဆောင်း Resources +- [Azure Static Web Apps Documentation](https://learn.microsoft.com/azure/static-web-apps/getting-started) +- [GitHub Actions Documentation](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပာယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/sketchnotes/LICENSE.md b/translations/my/sketchnotes/LICENSE.md new file mode 100644 index 00000000..bdaa3231 --- /dev/null +++ b/translations/my/sketchnotes/LICENSE.md @@ -0,0 +1,90 @@ + +အကျိုးသက်သာ-မျှဝေခြင်း 4.0 အပြည်ပြည်ဆိုင်ရာ + +======================================================================= + +Creative Commons Corporation ("Creative Commons") သည် ဥပဒေကြားဝန်ဆောင်မှုများ သို့မဟုတ် ဥပဒေဆိုင်ရာ အကြံဉာဏ်များ ပေးသည့် အဖွဲ့အစည်းမဟုတ်ပါ။ Creative Commons အများပြည်သူလိုင်စင်များကို ဖြန့်ဝေခြင်းသည် ရှေ့နေ-ဖောက်သည်ဆက်ဆံရေး သို့မဟုတ် အခြားဆက်ဆံရေးကို ဖန်တီးပေးခြင်းမဟုတ်ပါ။ Creative Commons သည် ၎င်း၏လိုင်စင်များနှင့် ဆက်စပ်သည့် အချက်အလက်များကို "အခြေအနေရှိသည့်အတိုင်း" ပေးထားပြီး၊ ၎င်း၏လိုင်စင်များ၊ ၎င်းတို့၏ စည်းမျဉ်းစည်းကမ်းများအောက်တွင်လိုင်စင်ရရှိထားသော ပစ္စည်းများ သို့မဟုတ် ဆက်စပ်သည့် အချက်အလက်များနှင့် ပတ်သက်၍ အာမခံချက်မပေးပါ။ Creative Commons သည် ၎င်းတို့ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နစ်နာမှုများအတွက် တာဝန်မယူပါ။ + +Creative Commons အများပြည်သူလိုင်စင်များကို အသုံးပြုခြင်း + +Creative Commons အများပြည်သူလိုင်စင်များသည် စာရေးသူများနှင့် အခြားအခွင့်အရေးပိုင်ရှင်များအတွက် မူပိုင်ခွင့်နှင့် အောက်တွင်ဖော်ပြထားသော အများပြည်သူလိုင်စင်၏ စည်းမျဉ်းစည်းကမ်းများအောက်တွင် မူရင်းအနုပညာလက်ရာများနှင့် အခြားပစ္စည်းများကို မျှဝေရန် အသုံးပြုနိုင်သော စံသတ်မှတ်ချက်များကို ပေးသည်။ အောက်ပါအချက်များသည် သတင်းအချက်အလက်ရည်ရွယ်ချက်များအတွက်သာဖြစ်ပြီး၊ အပြည့်အစုံမဟုတ်သလို၊ ၎င်းတို့သည် ၎င်း၏လိုင်စင်များ၏ အစိတ်အပိုင်းမဟုတ်ပါ။ + + Licensors အတွက် အချက်အလက်များ: ၎င်းတို့၏ အများပြည်သူလိုင်စင်များသည် မူပိုင်ခွင့်နှင့် အခြားအခွင့်အရေးများဖြင့် ကန့်သတ်ထားသော ပစ္စည်းများကို အသုံးပြုရန် အများပြည်သူကို ခွင့်ပြုရန် အခွင့်အာဏာရှိသူများအတွက် ရည်ရွယ်ထားသည်။ ၎င်းတို့၏လိုင်စင်များသည် ပြန်လည်ရုပ်သိမ်း၍ မရနိုင်ပါ။ Licensors သည် ၎င်းတို့ရွေးချယ်သော လိုင်စင်၏ စည်းမျဉ်းစည်းကမ်းများကို လိုင်စင်ပေးမည့်အခါတွင် နားလည်ထားရန် လိုအပ်သည်။ Licensors သည် လိုင်စင်ပေးမည့်အခါတွင် အများပြည်သူက မျှော်မှန်းထားသည့်အတိုင်း ပစ္စည်းကို ပြန်လည်အသုံးပြုနိုင်ရန် လိုအပ်သော အခွင့်အရေးများကို လုံလောက်စွာ ရရှိထားရန် လိုအပ်သည်။ လိုင်စင်မပေးထားသော ပစ္စည်းများကို ရှင်းလင်းစွာ အမှတ်အသားပြုထားရန် လိုအပ်သည်။ ဤတွင် CC-licensed ပစ္စည်းများ သို့မဟုတ် မူပိုင်ခွင့်၏ အခွင့်အရေးကန့်သတ်ချက်များအောက်တွင် အသုံးပြုထားသော ပစ္စည်းများ ပါဝင်သည်။ Licensors အတွက် အခြားအချက်အလက်များ: + wiki.creativecommons.org/Considerations_for_licensors + + အများပြည်သူအတွက် အချက်အလက်များ: ၎င်းတို့၏ အများပြည်သူလိုင်စင်များကို အသုံးပြုခြင်းအားဖြင့်၊ Licensor သည် လိုင်စင်ရရှိထားသော ပစ္စည်းကို သတ်မှတ်ထားသော စည်းမျဉ်းစည်းကမ်းများအောက်တွင် အသုံးပြုရန် အများပြည်သူကို ခွင့်ပြုသည်။ Licensor ၏ ခွင့်ပြုချက်မလိုအပ်သော အကြောင်းအရင်းတစ်ခုခုရှိပါက—ဥပမာအားဖြင့် မူပိုင်ခွင့်၏ အခွင့်အရေးကန့်သတ်ချက်များကြောင့်—၎င်းအသုံးပြုမှုသည် လိုင်စင်ဖြင့် စည်းမျဉ်းမထားပါ။ ၎င်းတို့၏ လိုင်စင်များသည် Licensor ၏ ခွင့်ပြုနိုင်သော မူပိုင်ခွင့်နှင့် အခြားအခွင့်အရေးများအောက်တွင်သာ ခွင့်ပြုချက်များကို ပေးသည်။ လိုင်စင်ရရှိထားသော ပစ္စည်းကို အသုံးပြုခြင်းသည် အခြားအကြောင်းအရင်းများကြောင့် ကန့်သတ်ထားနိုင်ပါသည်၊ ဥပမာအားဖြင့် အခြားသူများသည် ၎င်းပစ္စည်းတွင် မူပိုင်ခွင့် သို့မဟုတ် အခြားအခွင့်အရေးများရှိနေခြင်းကြောင့် ဖြစ်သည်။ Licensor သည် အထူးတောင်းဆိုမှုများကို ပြုလုပ်နိုင်ပါသည်၊ ဥပမာအားဖြင့် အပြောင်းအလဲများကို အမှတ်အသားပြုရန် သို့မဟုတ် ဖော်ပြရန် တောင်းဆိုခြင်း။ ၎င်းတို့၏ လိုင်စင်များဖြင့် မလိုအပ်သော်လည်း၊ သင့်တောင်းဆိုမှုများကို သင့်တော်သောနေရာတွင် လေးစားရန် အားပေးပါသည်။ အများပြည်သူအတွက် အခြားအချက်အလက်များ: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public License + +Licensed Rights (အောက်တွင်ဖော်ပြထားသည်) ကို အသုံးပြုခြင်းအားဖြင့်၊ သင်သည် Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License") ၏ စည်းမျဉ်းစည်းကမ်းများနှင့် အခြေအနေများကို လက်ခံပြီး ၎င်းတို့ကို လိုက်နာရန် သဘောတူပါသည်။ ဤ Public License ကို သဘောတူညီချက်အဖြစ် အဓိပ္ပါယ်ဖွင့်ဆိုနိုင်သည့်အတိုင်း၊ သင်သည် ဤစည်းမျဉ်းစည်းကမ်းများနှင့် အခြေအနေများကို လက်ခံခြင်းအားဖြင့် Licensed Rights ကို ရရှိပြီး၊ Licensor သည် ဤစည်းမျဉ်းစည်းကမ်းများနှင့် အခြေအနေများအောက်တွင် Licensed Material ကို ရရှိနိုင်စေရန် ရရှိသော အကျိုးကျေးဇူးများအတွက် သင့်အား ၎င်းအခွင့်အရေးများကို ပေးသည်။ + +... +အခန်း ၄ - အခွင့်အရေးများနှင့် တာဝန်များ + +သင့်တွင် Sui Generis Database အခွင့်အရေးရှိပြီး၊ သို့သော် ဒေတာဘေ့စ်၏ အ jednotliv အကြောင်းအရာများမဟုတ်ပါက၊ ဒါသည် Adapted Material ဖြစ်သည်။ + +အခန်း ၃(b) ရည်ရွယ်ချက်များအတွက်ပါဝင်သည်။ +c. သင်သည် ဒေတာဘေ့စ်၏ အကြောင်းအရာများအားလုံး သို့မဟုတ် အများကြီးကို မျှဝေပါက အခန်း ၃(a) တွင် ဖော်ပြထားသော အခြေအနေများကို လိုက်နာရမည်။ + +ရှင်းလင်းစေရန်၊ အခန်း ၄ သည် သင့် Public License အောက်တွင် Licensed Rights တွင် အခြား Copyright နှင့် Similar Rights ပါဝင်သောအခါ သင့်တာဝန်များကို အစားထိုးမထားဘဲ ဖြည့်စွက်ပေးသည်။ + +အခန်း ၅ - အာမခံချက်များနှင့် တာဝန်ကန့်သတ်မှု + +a. Licensor မှ သီးခြားစီလုပ်ဆောင်ခြင်းမရှိသလောက်၊ အလှည့်အပြောင်းဖြစ်နိုင်သမျှအတိုင်း၊ Licensor သည် Licensed Material ကို "အတိုင်းအတာ" နှင့် "ရရှိနိုင်သောအတိုင်း" ပေးသည်။ Licensed Material နှင့်ပတ်သက်၍ အာမခံချက်များ သို့မဟုတ် အာမခံချက်များကို မည်သည့်အမျိုးအစားဖြစ်စေ မပေးပါ။ ဥပမာအားဖြင့်၊ အခွင့်အရေး၊ စျေးကွက်အတွက် သင့်တော်မှု၊ အထူးရည်ရွယ်ချက်အတွက် သင့်တော်မှု၊ မဖောက်ဖျက်မှု၊ အမှားများ ရှိခြင်း သို့မဟုတ် မရှိခြင်း၊ သို့မဟုတ် အခြားအကြောင်းအရာများပါဝင်သည်။ အာမခံချက်များကို အပြည့်အဝ သို့မဟုတ် အစိတ်အပိုင်းများတွင် ခွင့်မပြုပါက၊ ဤအာမခံချက်များ သင့်အပေါ် မသက်ဆိုင်နိုင်ပါ။ + +b. ဖြစ်နိုင်သလောက်၊ မည်သည့်အခါတွင်မဆို Licensor သည် သင့်အပေါ် တရားဝင်အခြေခံချက် (ဥပမာအားဖြင့် အာမခံမှု) သို့မဟုတ် Licensed Material ကို အသုံးပြုခြင်းနှင့်ပတ်သက်၍ တိုက်ရိုက်၊ အထူး၊ အလျင်အမြန်၊ အကြောင်းဆိုင်သော၊ ဒဏ်ငွေ၊ အထူးပြု၊ သို့မဟုတ် အခြားအကျိုးဆုံးရှုံးမှုများ၊ ကုန်ကျစရိတ်များ၊ သို့မဟုတ် ထိခိုက်မှုများအတွက် တာဝန်မရှိပါ။ တာဝန်ကန့်သတ်မှုများကို အပြည့်အဝ သို့မဟုတ် အစိတ်အပိုင်းများတွင် ခွင့်မပြုပါက၊ ဤကန့်သတ်မှုများ သင့်အပေါ် မသက်ဆိုင်နိုင်ပါ။ + +c. အထက်ဖော်ပြထားသော အာမခံချက်များနှင့် တာဝန်ကန့်သတ်မှုများကို အပြည့်အဝ သို့မဟုတ် အနီးစပ်ဆုံး အကန့်အသတ်နှင့် တာဝန်လွှတ်ခြင်းအဖြစ် အနီးစပ်ဆုံးအတိုင်း အဓိပ္ပာယ်ဖွင့်ဆိုရမည်။ + +အခန်း ၆ - သက်တမ်းနှင့် ရပ်ဆိုင်းမှု + +a. ဤ Public License သည် ဤတွင် Licensed Copyright နှင့် Similar Rights ရှိသည့် သက်တမ်းအတွက် သက်တမ်းရှိသည်။ သို့သော် သင်ဤ Public License ကို လိုက်နာရန် မအောင်မြင်ပါက၊ သင့် Public License အောက်တွင်ရှိသော အခွင့်အရေးများသည် အလိုအလျောက် ရပ်ဆိုင်းသွားမည်။ + +b. သင့် Licensed Material ကို အသုံးပြုရန် အခွင့်အရေးသည် အခန်း ၆(a) အောက်တွင် ရပ်ဆိုင်းသွားသောအခါ၊ ၎င်းသည် ပြန်လည်သက်တမ်းရရှိသည်- + +1. သင့်ဖောက်ဖျက်မှုကို ရှာဖွေတွေ့ရှိပြီး ၃၀ ရက်အတွင်း ပြန်လည်ပြုပြင်မှုကို အလိုအလျောက် ပြုလုပ်ပါက၊ သို့မဟုတ် +2. Licensor မှ ထူးထူးခြားခြား ပြန်လည်သက်တမ်းရရှိမှုကို ပေးပါက။ + +ရှင်းလင်းစေရန်၊ အခန်း ၆(b) သည် သင့် Public License ကို ဖောက်ဖျက်မှုများအတွက် Licensor မှ အရေးယူရန် အခွင့်အရေးကို မထိခိုက်စေပါ။ + +c. ရှင်းလင်းစေရန်၊ Licensor သည် Licensed Material ကို သီးခြားစီ စည်းကမ်း သို့မဟုတ် အခြေအနေများအောက်တွင် ပေးသည့်အခါ သို့မဟုတ် Licensed Material ကို မျှဝေမှုကို ရပ်တန့်နိုင်သည်။ သို့သော် ဤလုပ်ဆောင်မှုသည် ဤ Public License ကို ရပ်ဆိုင်းမည်မဟုတ်ပါ။ + +d. အခန်း ၁၊ ၅၊ ၆၊ ၇၊ နှင့် ၈ သည် ဤ Public License ရပ်ဆိုင်းပြီးနောက်လည်း သက်တမ်းရှိနေသည်။ + +အခန်း ၇ - အခြားစည်းကမ်းနှင့် အခြေအနေများ + +a. Licensor သည် သင့်အနေဖြင့် ဆက်သွယ်သော အခြားစည်းကမ်း သို့မဟုတ် အခြေအနေများကို သဘောတူမတူမရှိပါ။ + +b. Licensed Material နှင့်ပတ်သက်၍ ဤတွင် ဖော်ပြထားခြင်းမရှိသော စီစဉ်မှုများ၊ နားလည်မှုများ သို့မဟုတ် သဘောတူညီမှုများသည် ဤ Public License ၏ စည်းကမ်းနှင့် အခြေအနေများနှင့် သီးခြားစီ သက်ဆိုင်သည်။ + +အခန်း ၈ - အဓိပ္ပာယ်ဖွင့်ဆိုမှု + +a. ရှင်းလင်းစေရန်၊ ဤ Public License သည် Licensed Material ကို ဤ Public License အောက်တွင် ခွင့်ပြုချက်မလိုအပ်ဘဲ တရားဝင်အသုံးပြုနိုင်သော မည်သည့်အသုံးပြုမှုကိုမဆို လျှော့ချခြင်း၊ ကန့်သတ်ခြင်း၊ ကန့်သတ်ခြင်း သို့မဟုတ် အခြေအနေများ ချမှတ်ခြင်းမပြုပါ။ + +b. ဖြစ်နိုင်သလောက်၊ ဤ Public License ၏ မည်သည့်အပိုဒ်ကိုမဆို အကန့်အသတ်မရှိဟု သတ်မှတ်ပါက၊ ၎င်းကို အနည်းဆုံးအတိုင်း ပြုပြင်ရန် အလိုအလျောက် ပြုပြင်ရမည်။ အပိုဒ်ကို ပြုပြင်၍ မရပါက၊ ၎င်းကို ဤ Public License မှ ဖယ်ရှားရမည်။ သို့သော် ကျန်ရှိသော စည်းကမ်းနှင့် အခြေအနေများ၏ အကန့်အသတ်မရှိမှုကို မထိခိုက်စေပါ။ + +c. ဤ Public License ၏ မည်သည့်စည်းကမ်း သို့မဟုတ် အခြေအနေကိုမဆို Licensor မှ ထူးထူးခြားခြား သဘောတူညီမှုမရှိပါက လွှတ်လပ်ခြင်း သို့မဟုတ် လိုက်နာမှုကို သဘောတူမတူမရှိပါ။ + +d. ဤ Public License တွင် မည်သည့်အရာကိုမဆို Licensor သို့မဟုတ် သင့်အပေါ် သက်ဆိုင်သော တရားဝင်လုပ်ငန်းစဉ်များ သို့မဟုတ် အာဏာပိုင်၏ အခွင့်အရေးများနှင့် အခွင့်အရေးများကို ကန့်သတ်ခြင်း သို့မဟုတ် လွှတ်လပ်ခြင်းအဖြစ် သတ်မှတ်ခြင်းမရှိပါ။ + +======================================================================= + +Creative Commons သည် ၎င်း၏ Public License များ၏ အဖွဲ့ဝင်မဟုတ်ပါ။ သို့သော် Creative Commons သည် ၎င်း၏ Public License များကို ၎င်း၏ပုံနှိပ်ထားသော ပစ္စည်းများတွင် အသုံးပြုရန် ရွေးချယ်နိုင်ပြီး၊ ၎င်းအခါတွင် “Licensor” အဖြစ် သတ်မှတ်နိုင်သည်။ Creative Commons Public License များ၏ စာသားကို CC0 Public Domain Dedication အောက်တွင် Public Domain သို့ လှူဒါန်းထားသည်။ Creative Commons ၏ မူဝါဒများတွင် ဖော်ပြထားသောအတိုင်း သို့မဟုတ် Creative Commons Public License အောက်တွင် မျှဝေထားသော ပစ္စည်းများကို ဖော်ပြရန် အကန့်အသတ်အတွက်သာ Creative Commons အမှတ်တံဆိပ် "Creative Commons" သို့မဟုတ် Creative Commons ၏ အခြားအမှတ်တံဆိပ် သို့မဟုတ် လိုဂိုကို အသုံးပြုရန် ခွင့်ပြုချက်မရှိပါ။ Creative Commons ၏ Public License များကို မည်သည့်မူပြောင်းမှုများနှင့်ပတ်သက်၍ မည်သည့်သဘောတူညီမှုများနှင့်ပတ်သက်၍ Creative Commons ၏ ရေးသားထားသော ခွင့်ပြုချက်မရှိပါ။ + +Creative Commons ကို creativecommons.org တွင် ဆက်သွယ်နိုင်သည်။ + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားမှုများ သို့မဟုတ် အဓိပ္ပါယ်မှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/my/sketchnotes/README.md b/translations/my/sketchnotes/README.md new file mode 100644 index 00000000..676d02bc --- /dev/null +++ b/translations/my/sketchnotes/README.md @@ -0,0 +1,21 @@ + +အမျိုးသားသင်ရိုးညွှန်းတမ်းများ၏ စကက်မှတ်စုများကို ဒီနေရာမှာ ဒေါင်းလုဒ်လုပ်နိုင်ပါတယ်။ + +🖨 အရည်အသွေးမြင့်ဖြင့် ပုံနှိပ်ရန်အတွက် TIFF ဗားရှင်းများကို [ဒီ repo](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff) မှာ ရရှိနိုင်ပါတယ်။ + +🎨 ဖန်တီးသူ: [Tomomi Imura](https://github.com/girliemac) (Twitter: [@girlie_mac](https://twitter.com/girlie_mac)) + +[![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-sa/4.0/) + +--- + +**ဝက်ဘ်ဆိုက်မှတ်ချက်**: +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူကောင်းမွန်သော ပရော်ဖက်ရှင်နယ်ဘာသာပြန်ဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပါယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file diff --git a/translations/sl/1-Introduction/1-intro-to-ML/README.md b/translations/sl/1-Introduction/1-intro-to-ML/README.md new file mode 100644 index 00000000..5df15410 --- /dev/null +++ b/translations/sl/1-Introduction/1-intro-to-ML/README.md @@ -0,0 +1,159 @@ + +# Uvod v strojno učenje + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML za začetnike - Uvod v strojno učenje za začetnike](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "ML za začetnike - Uvod v strojno učenje za začetnike") + +> 🎥 Kliknite na zgornjo sliko za kratek video, ki obravnava to lekcijo. + +Dobrodošli v tem tečaju klasičnega strojnega učenja za začetnike! Ne glede na to, ali ste popolnoma novi na tem področju ali izkušen strokovnjak za strojno učenje, ki želi osvežiti svoje znanje, veseli smo, da ste se nam pridružili! Želimo ustvariti prijazno izhodišče za vaše študije strojnega učenja in z veseljem ocenimo, odgovorimo ter vključimo vaše [povratne informacije](https://github.com/microsoft/ML-For-Beginners/discussions). + +[![Uvod v strojno učenje](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Uvod v strojno učenje") + +> 🎥 Kliknite na zgornjo sliko za video: MIT-ov John Guttag predstavlja strojno učenje + +--- +## Začetek s strojnim učenjem + +Preden začnete s tem učnim načrtom, morate pripraviti svoj računalnik za lokalno izvajanje beležk. + +- **Pripravite svoj računalnik s temi videi**. Uporabite naslednje povezave, da se naučite [kako namestiti Python](https://youtu.be/CXZYvNRIAKM) na vaš sistem in [nastaviti urejevalnik besedila](https://youtu.be/EU8eayHWoZg) za razvoj. +- **Naučite se Python**. Priporočljivo je, da imate osnovno razumevanje [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), programskega jezika, ki je koristen za podatkovne znanstvenike in ga uporabljamo v tem tečaju. +- **Naučite se Node.js in JavaScript**. JavaScript uporabljamo nekajkrat v tem tečaju pri gradnji spletnih aplikacij, zato boste potrebovali [node](https://nodejs.org) in [npm](https://www.npmjs.com/), pa tudi [Visual Studio Code](https://code.visualstudio.com/) za razvoj v Pythonu in JavaScriptu. +- **Ustvarite GitHub račun**. Ker ste nas našli tukaj na [GitHub](https://github.com), morda že imate račun, če pa ne, ga ustvarite in nato razvejite ta učni načrt za lastno uporabo. (Lahko nam tudi podarite zvezdico 😊) +- **Raziščite Scikit-learn**. Seznanite se z [Scikit-learn](https://scikit-learn.org/stable/user_guide.html), nizom knjižnic za strojno učenje, ki jih uporabljamo v teh lekcijah. + +--- +## Kaj je strojno učenje? + +Izraz 'strojno učenje' je eden najbolj priljubljenih in pogosto uporabljenih izrazov danes. Obstaja velika verjetnost, da ste ta izraz vsaj enkrat slišali, če imate kakršnokoli povezavo s tehnologijo, ne glede na področje, v katerem delate. Mehanika strojnega učenja pa je za večino ljudi skrivnost. Za začetnika v strojnem učenju se lahko tema včasih zdi preobsežna. Zato je pomembno razumeti, kaj strojno učenje dejansko je, in se o njem učiti korak za korakom, skozi praktične primere. + +--- +## Krivulja navdušenja + +![krivulja navdušenja strojnega učenja](../../../../1-Introduction/1-intro-to-ML/images/hype.png) + +> Google Trends prikazuje nedavno 'krivuljo navdušenja' izraza 'strojno učenje' + +--- +## Skrivnostno vesolje + +Živimo v vesolju, polnem fascinantnih skrivnosti. Veliki znanstveniki, kot so Stephen Hawking, Albert Einstein in mnogi drugi, so svoja življenja posvetili iskanju smiselnih informacij, ki razkrivajo skrivnosti sveta okoli nas. To je človeška narava učenja: človeški otrok se uči novih stvari in odkriva strukturo svojega sveta leto za letom, ko odrašča. + +--- +## Otroški možgani + +Otroški možgani in čuti zaznavajo dejstva iz okolice ter postopoma spoznavajo skrite vzorce življenja, ki otroku pomagajo oblikovati logična pravila za prepoznavanje naučenih vzorcev. Proces učenja človeških možganov naredi ljudi najbolj sofisticirana živa bitja na tem svetu. Nenehno učenje z odkrivanjem skritih vzorcev in nato inoviranje na podlagi teh vzorcev nam omogoča, da se skozi življenje nenehno izboljšujemo. Ta sposobnost učenja in evolucije je povezana s konceptom, imenovanim [plastičnost možganov](https://www.simplypsychology.org/brain-plasticity.html). Površinsko lahko potegnemo nekaj motivacijskih podobnosti med procesom učenja človeških možganov in koncepti strojnega učenja. + +--- +## Človeški možgani + +[Človeški možgani](https://www.livescience.com/29365-human-brain.html) zaznavajo stvari iz resničnega sveta, obdelujejo zaznane informacije, sprejemajo racionalne odločitve in izvajajo določena dejanja glede na okoliščine. To imenujemo inteligentno vedenje. Ko programiramo posnemanje inteligentnega vedenjskega procesa v stroj, to imenujemo umetna inteligenca (AI). + +--- +## Nekaj terminologije + +Čeprav se izrazi lahko zamenjujejo, je strojno učenje (ML) pomemben podsklop umetne inteligence. **ML se ukvarja z uporabo specializiranih algoritmov za odkrivanje smiselnih informacij in iskanje skritih vzorcev iz zaznanih podatkov, da podpre racionalni proces odločanja**. + +--- +## AI, ML, globoko učenje + +![AI, ML, globoko učenje, podatkovna znanost](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png) + +> Diagram, ki prikazuje odnose med AI, ML, globokim učenjem in podatkovno znanostjo. Infografika avtorice [Jen Looper](https://twitter.com/jenlooper), navdihnjena z [to grafiko](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining) + +--- +## Koncepti, ki jih bomo obravnavali + +V tem učnem načrtu bomo obravnavali le osnovne koncepte strojnega učenja, ki jih mora poznati začetnik. Obravnavamo tisto, kar imenujemo 'klasično strojno učenje', predvsem z uporabo Scikit-learn, odlične knjižnice, ki jo mnogi študenti uporabljajo za učenje osnov. Za razumevanje širših konceptov umetne inteligence ali globokega učenja je močno temeljno znanje strojnega učenja nepogrešljivo, zato ga želimo ponuditi tukaj. + +--- +## V tem tečaju se boste naučili: + +- osnovnih konceptov strojnega učenja +- zgodovine ML +- ML in pravičnosti +- regresijskih tehnik ML +- klasifikacijskih tehnik ML +- tehnik grupiranja ML +- tehnik obdelave naravnega jezika ML +- tehnik napovedovanja časovnih vrst ML +- okrepljenega učenja +- resničnih aplikacij za ML + +--- +## Kaj ne bomo obravnavali + +- globoko učenje +- nevronske mreže +- AI + +Za boljšo izkušnjo učenja se bomo izognili kompleksnostim nevronskih mrež, 'globokega učenja' - gradnje modelov z več plastmi z uporabo nevronskih mrež - in AI, o čemer bomo razpravljali v drugem učnem načrtu. Prav tako bomo ponudili prihajajoči učni načrt podatkovne znanosti, ki se bo osredotočil na ta vidik širšega področja. + +--- +## Zakaj študirati strojno učenje? + +Strojno učenje je z vidika sistemov opredeljeno kot ustvarjanje avtomatiziranih sistemov, ki lahko iz podatkov odkrijejo skrite vzorce za pomoč pri sprejemanju inteligentnih odločitev. + +Ta motivacija je ohlapno navdihnjena z načinom, kako človeški možgani učijo določene stvari na podlagi podatkov, ki jih zaznavajo iz zunanjega sveta. + +✅ Premislite za trenutek, zakaj bi podjetje želelo uporabiti strategije strojnega učenja namesto ustvarjanja sistema s trdo kodiranimi pravili. + +--- +## Aplikacije strojnega učenja + +Aplikacije strojnega učenja so zdaj skoraj povsod in so tako razširjene kot podatki, ki krožijo po naših družbah, ustvarjeni s pametnimi telefoni, povezanimi napravami in drugimi sistemi. Glede na izjemen potencial najsodobnejših algoritmov strojnega učenja raziskovalci preučujejo njihovo sposobnost reševanja večdimenzionalnih in večdisciplinarnih resničnih problemov z odličnimi pozitivnimi rezultati. + +--- +## Primeri uporabe ML + +**Strojno učenje lahko uporabite na številne načine**: + +- Za napovedovanje verjetnosti bolezni na podlagi pacientove zdravstvene zgodovine ali poročil. +- Za uporabo vremenskih podatkov za napovedovanje vremenskih dogodkov. +- Za razumevanje sentimenta besedila. +- Za odkrivanje lažnih novic in preprečevanje širjenja propagande. + +Finance, ekonomija, znanost o Zemlji, raziskovanje vesolja, biomedicinski inženiring, kognitivna znanost in celo področja humanistike so prilagodili strojno učenje za reševanje težkih problemov obdelave podatkov v svojih domenah. + +--- +## Zaključek + +Strojno učenje avtomatizira proces odkrivanja vzorcev z iskanjem smiselnih vpogledov iz resničnih ali generiranih podatkov. Izkazalo se je, da je izjemno dragoceno na področjih poslovanja, zdravja in financ, med drugim. + +V bližnji prihodnosti bo razumevanje osnov strojnega učenja postalo nujno za ljudi iz katerega koli področja zaradi njegove široke uporabe. + +--- +# 🚀 Izziv + +Narišite, na papirju ali z uporabo spletne aplikacije, kot je [Excalidraw](https://excalidraw.com/), vaše razumevanje razlik med AI, ML, globokim učenjem in podatkovno znanostjo. Dodajte nekaj idej o problemih, ki jih lahko vsaka od teh tehnik dobro rešuje. + +# [Kviz po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +--- +# Pregled in samostojno učenje + +Če želite izvedeti več o tem, kako lahko delate z algoritmi ML v oblaku, sledite tej [učni poti](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott). + +Sprejmite [učni načrt](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) o osnovah ML. + +--- +# Naloga + +[Začnite z delom](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/1-Introduction/1-intro-to-ML/assignment.md b/translations/sl/1-Introduction/1-intro-to-ML/assignment.md new file mode 100644 index 00000000..19ea6993 --- /dev/null +++ b/translations/sl/1-Introduction/1-intro-to-ML/assignment.md @@ -0,0 +1,23 @@ + +# Začnite z delom + +## Navodila + +V tej nalogi, ki ni ocenjena, se osvežite v znanju Pythona in pripravite svoje okolje, da bo sposobno poganjati beležke. + +Sledite tej [učni poti za Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), nato pa pripravite svoje sisteme z ogledom teh uvodnih videoposnetkov: + +https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6 + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/1-Introduction/2-history-of-ML/README.md b/translations/sl/1-Introduction/2-history-of-ML/README.md new file mode 100644 index 00000000..00fa1fde --- /dev/null +++ b/translations/sl/1-Introduction/2-history-of-ML/README.md @@ -0,0 +1,164 @@ + +# Zgodovina strojnega učenja + +![Povzetek zgodovine strojnega učenja v sketchnote](../../../../sketchnotes/ml-history.png) +> Sketchnote avtorja [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML za začetnike - Zgodovina strojnega učenja](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "ML za začetnike - Zgodovina strojnega učenja") + +> 🎥 Kliknite zgornjo sliko za kratek video, ki obravnava to lekcijo. + +V tej lekciji bomo pregledali glavne mejnike v zgodovini strojnega učenja in umetne inteligence. + +Zgodovina umetne inteligence (UI) kot področja je tesno povezana z zgodovino strojnega učenja, saj so algoritmi in računalniški napredki, ki podpirajo strojno učenje, prispevali k razvoju UI. Pomembno je vedeti, da so se ta področja kot ločeni raziskovalni smeri začela oblikovati v 50. letih prejšnjega stoletja, vendar so pomembna [algoritmična, statistična, matematična, računalniška in tehnična odkritja](https://wikipedia.org/wiki/Timeline_of_machine_learning) predhodila in prekrivala to obdobje. Pravzaprav ljudje razmišljajo o teh vprašanjih že [stoletja](https://wikipedia.org/wiki/History_of_artificial_intelligence): ta članek obravnava zgodovinske intelektualne temelje ideje o 'mislečem stroju.' + +--- +## Pomembna odkritja + +- 1763, 1812 [Bayesov izrek](https://wikipedia.org/wiki/Bayes%27_theorem) in njegovi predhodniki. Ta izrek in njegove aplikacije so osnova za sklepanje, saj opisujejo verjetnost dogodka na podlagi predhodnega znanja. +- 1805 [Teorija najmanjših kvadratov](https://wikipedia.org/wiki/Least_squares) francoskega matematika Adriena-Marieja Legendra. Ta teorija, o kateri se boste učili v enoti o regresiji, pomaga pri prilagajanju podatkov. +- 1913 [Markovske verige](https://wikipedia.org/wiki/Markov_chain), poimenovane po ruskem matematiku Andreju Markovu, opisujejo zaporedje možnih dogodkov na podlagi prejšnjega stanja. +- 1957 [Perceptron](https://wikipedia.org/wiki/Perceptron) je vrsta linearnega klasifikatorja, ki ga je izumil ameriški psiholog Frank Rosenblatt in je osnova za napredek v globokem učenju. + +--- + +- 1967 [Najbližji sosed](https://wikipedia.org/wiki/Nearest_neighbor) je algoritem, prvotno zasnovan za načrtovanje poti. V kontekstu strojnega učenja se uporablja za prepoznavanje vzorcev. +- 1970 [Povratno širjenje](https://wikipedia.org/wiki/Backpropagation) se uporablja za učenje [feedforward nevronskih mrež](https://wikipedia.org/wiki/Feedforward_neural_network). +- 1982 [Rekurentne nevronske mreže](https://wikipedia.org/wiki/Recurrent_neural_network) so umetne nevronske mreže, izpeljane iz feedforward mrež, ki ustvarjajo časovne grafe. + +✅ Raziščite. Kateri drugi datumi so po vašem mnenju ključni v zgodovini strojnega učenja in umetne inteligence? + +--- +## 1950: Stroji, ki mislijo + +Alan Turing, resnično izjemna oseba, ki je bil [leta 2019](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) izbran za največjega znanstvenika 20. stoletja, je zaslužen za postavitev temeljev koncepta 'stroja, ki lahko misli.' Soočen je bil s skeptiki in lastno potrebo po empiričnih dokazih tega koncepta, deloma z ustvarjanjem [Turingovega testa](https://www.bbc.com/news/technology-18475646), ki ga boste raziskali v lekcijah o obdelavi naravnega jezika. + +--- +## 1956: Poletni raziskovalni projekt na Dartmouthu + +"Poletni raziskovalni projekt o umetni inteligenci na Dartmouthu je bil ključen dogodek za umetno inteligenco kot področje," in prav tukaj je bil skovan izraz 'umetna inteligenca' ([vir](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)). + +> Vsak vidik učenja ali katera koli druga značilnost inteligence je načeloma mogoče tako natančno opisati, da jo lahko stroj simulira. + +--- + +Vodja raziskave, profesor matematike John McCarthy, je upal, "da bo mogoče nadaljevati na podlagi domneve, da je vsak vidik učenja ali katera koli druga značilnost inteligence načeloma mogoče tako natančno opisati, da jo lahko stroj simulira." Med udeleženci je bil tudi drug pomemben raziskovalec na tem področju, Marvin Minsky. + +Delavnica je zaslužna za spodbujanje več razprav, vključno z "vzponom simboličnih metod, sistemov, osredotočenih na omejena področja (zgodnji ekspertni sistemi), in deduktivnih sistemov v primerjavi z induktivnimi sistemi." ([vir](https://wikipedia.org/wiki/Dartmouth_workshop)). + +--- +## 1956 - 1974: "Zlata leta" + +Od 50. let do sredine 70. let je vladal optimizem, da bi UI lahko rešila številne težave. Leta 1967 je Marvin Minsky samozavestno izjavil: "V eni generaciji ... bo problem ustvarjanja 'umetne inteligence' v veliki meri rešen." (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall) + +Raziskave obdelave naravnega jezika so cvetele, iskanje je postalo bolj izpopolnjeno in zmogljivo, ter ustvarjen je bil koncept 'mikro-svetov', kjer so bile preproste naloge izvedene z uporabo navodil v preprostem jeziku. + +--- + +Raziskave so bile dobro financirane s strani vladnih agencij, napredek je bil dosežen na področju računalništva in algoritmov, ter prototipi inteligentnih strojev so bili zgrajeni. Nekateri od teh strojev vključujejo: + +* [Robot Shakey](https://wikipedia.org/wiki/Shakey_the_robot), ki se je lahko premikal in 'inteligentno' odločal, kako opraviti naloge. + + ![Shakey, inteligentni robot](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg) + > Shakey leta 1972 + +--- + +* Eliza, zgodnji 'klepetalni robot', je lahko komunicirala z ljudmi in delovala kot primitivni 'terapevt'. Več o Elizi boste izvedeli v lekcijah o obdelavi naravnega jezika. + + ![Eliza, bot](../../../../1-Introduction/2-history-of-ML/images/eliza.png) + > Različica Elize, klepetalnega robota + +--- + +* "Svet blokov" je bil primer mikro-sveta, kjer so se bloki lahko zlagali in razvrščali, ter so se izvajali eksperimenti pri učenju strojev za sprejemanje odločitev. Napredki, doseženi z knjižnicami, kot je [SHRDLU](https://wikipedia.org/wiki/SHRDLU), so pomagali pri razvoju obdelave jezika. + + [![svet blokov s SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "svet blokov s SHRDLU") + + > 🎥 Kliknite zgornjo sliko za video: Svet blokov s SHRDLU + +--- +## 1974 - 1980: "Zima UI" + +Do sredine 70. let je postalo jasno, da je bila kompleksnost ustvarjanja 'inteligentnih strojev' podcenjena in da so bile obljube, glede na razpoložljivo računalniško moč, pretirane. Financiranje se je zmanjšalo, zaupanje v področje pa je upadlo. Nekateri problemi, ki so vplivali na zaupanje, vključujejo: +--- +- **Omejitve**. Računalniška moč je bila prešibka. +- **Kombinatorna eksplozija**. Število parametrov, ki jih je bilo treba naučiti, je eksponentno naraščalo, brez vzporednega razvoja računalniške moči in zmogljivosti. +- **Pomanjkanje podatkov**. Pomanjkanje podatkov je oviralo proces testiranja, razvoja in izboljševanja algoritmov. +- **Ali postavljamo prava vprašanja?**. Začela so se postavljati vprašanja o samih vprašanjih, ki so jih raziskovalci zastavljali: + - Turingovi testi so bili postavljeni pod vprašaj, med drugim tudi s teorijo 'kitajske sobe', ki je trdila, da "programiranje digitalnega računalnika lahko ustvari videz razumevanja jezika, vendar ne more ustvariti pravega razumevanja." ([vir](https://plato.stanford.edu/entries/chinese-room/)) + - Etika uvajanja umetnih inteligenc, kot je "terapevt" ELIZA, v družbo je bila izzvana. + +--- + +Hkrati so se začele oblikovati različne šole misli o UI. Ustanovila se je dihotomija med ["neurejeno" in "urejeno UI"](https://wikipedia.org/wiki/Neats_and_scruffies). _Neurejeni_ laboratoriji so urejali programe, dokler niso dosegli želenih rezultatov. _Urejeni_ laboratoriji so se osredotočali na logiko in formalno reševanje problemov. ELIZA in SHRDLU sta bila znana _neurejena_ sistema. V 80. letih, ko se je pojavilo povpraševanje po reproducibilnosti sistemov strojnega učenja, je _urejen_ pristop postopoma prevladal, saj so njegovi rezultati bolj razložljivi. + +--- +## 1980: Ekspertni sistemi + +Z rastjo področja je postala njegova korist za poslovanje bolj očitna, v 80. letih pa se je razširila uporaba 'ekspertnih sistemov'. "Ekspertni sistemi so bili med prvimi resnično uspešnimi oblikami programske opreme umetne inteligence (UI)." ([vir](https://wikipedia.org/wiki/Expert_system)). + +Ta vrsta sistema je pravzaprav _hibridna_, saj delno vključuje pravila, ki določajo poslovne zahteve, in sklepni mehanizem, ki uporablja sistem pravil za sklepanje novih dejstev. + +To obdobje je prineslo tudi večjo pozornost nevronskim mrežam. + +--- +## 1987 - 1993: Ohladitev UI + +Razširitev specializirane strojne opreme za ekspertne sisteme je imela nesrečen učinek, da je postala preveč specializirana. Pojav osebnih računalnikov je prav tako tekmoval s temi velikimi, specializiranimi, centraliziranimi sistemi. Začela se je demokratizacija računalništva, ki je sčasoma tlakovala pot za sodobno eksplozijo velikih podatkov. + +--- +## 1993 - 2011 + +To obdobje je prineslo novo ero za strojno učenje in umetno inteligenco, da bi lahko rešila nekatere težave, ki so jih povzročili pomanjkanje podatkov in računalniške moči. Količina podatkov se je začela hitro povečevati in postajati bolj dostopna, tako v dobrem kot slabem, še posebej z uvedbo pametnega telefona okoli leta 2007. Računalniška moč se je eksponentno povečala, algoritmi pa so se razvijali vzporedno. Področje je začelo dosegati zrelost, saj so se svobodomiselni dnevi preteklosti začeli oblikovati v pravo disciplino. + +--- +## Danes + +Danes strojno učenje in umetna inteligenca vplivata na skoraj vsak del našega življenja. To obdobje zahteva skrbno razumevanje tveganj in možnih učinkov teh algoritmov na človeška življenja. Kot je dejal Brad Smith iz Microsofta: "Informacijska tehnologija odpira vprašanja, ki segajo v samo srčiko temeljnih zaščit človekovih pravic, kot sta zasebnost in svoboda izražanja. Ta vprašanja povečujejo odgovornost tehnoloških podjetij, ki ustvarjajo te izdelke. Po našem mnenju zahtevajo tudi premišljeno vladno regulacijo in razvoj norm glede sprejemljive uporabe" ([vir](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)). + +--- + +Kaj prinaša prihodnost, ostaja neznano, vendar je pomembno razumeti te računalniške sisteme ter programsko opremo in algoritme, ki jih poganjajo. Upamo, da vam bo ta učni načrt pomagal pridobiti boljše razumevanje, da boste lahko sami presodili. + +[![Zgodovina globokega učenja](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "Zgodovina globokega učenja") +> 🎥 Kliknite zgornjo sliko za video: Yann LeCun razpravlja o zgodovini globokega učenja v tem predavanju + +--- +## 🚀Izziv + +Poglobite se v enega od teh zgodovinskih trenutkov in izvedite več o ljudeh, ki stojijo za njimi. Obstajajo fascinantni liki, in nobeno znanstveno odkritje ni bilo ustvarjeno v kulturnem vakuumu. Kaj odkrijete? + +## [Kviz po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +--- +## Pregled in samostojno učenje + +Tukaj so predmeti za ogled in poslušanje: + +[Ta podcast, kjer Amy Boyd razpravlja o razvoju UI](http://runasradio.com/Shows/Show/739) + +[![Zgodovina UI avtorice Amy Boyd](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "Zgodovina UI avtorice Amy Boyd") + +--- + +## Naloga + +[Ustvarite časovnico](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/1-Introduction/2-history-of-ML/assignment.md b/translations/sl/1-Introduction/2-history-of-ML/assignment.md new file mode 100644 index 00000000..dc59dafc --- /dev/null +++ b/translations/sl/1-Introduction/2-history-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Ustvarite časovnico + +## Navodila + +Z uporabo [tega repozitorija](https://github.com/Digital-Humanities-Toolkit/timeline-builder) ustvarite časovnico, ki prikazuje določen vidik zgodovine algoritmov, matematike, statistike, umetne inteligence ali strojnega učenja, ali kombinacijo teh. Osredotočite se lahko na eno osebo, eno idejo ali daljše časovno obdobje razmišljanja. Ne pozabite dodati multimedijskih elementov. + +## Merila ocenjevanja + +| Merilo | Odlično | Zadostno | Potrebno izboljšanje | +| --------| ------------------------------------------------ | --------------------------------------- | -------------------------------------------------------------- | +| | Predstavljena je objavljena časovnica kot GitHub stran | Koda je nepopolna in ni objavljena | Časovnica je nepopolna, slabo raziskana in ni objavljena | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/1-Introduction/3-fairness/README.md b/translations/sl/1-Introduction/3-fairness/README.md new file mode 100644 index 00000000..f6a30c7e --- /dev/null +++ b/translations/sl/1-Introduction/3-fairness/README.md @@ -0,0 +1,153 @@ + +# Gradnja rešitev strojnega učenja z odgovorno umetno inteligenco + +![Povzetek odgovorne umetne inteligence v strojnem učenju v sketchnote](../../../../sketchnotes/ml-fairness.png) +> Sketchnote avtorja [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +V tem učnem načrtu boste začeli odkrivati, kako strojno učenje vpliva na naše vsakdanje življenje. Že zdaj so sistemi in modeli vključeni v vsakodnevne odločitve, kot so zdravstvene diagnoze, odobritve posojil ali odkrivanje goljufij. Zato je pomembno, da ti modeli delujejo zanesljivo in zagotavljajo rezultate, ki jim lahko zaupamo. Tako kot pri vsaki programski aplikaciji tudi sistemi umetne inteligence včasih ne izpolnijo pričakovanj ali privedejo do neželenih rezultatov. Zato je ključno razumeti in pojasniti vedenje modela umetne inteligence. + +Predstavljajte si, kaj se lahko zgodi, če podatki, ki jih uporabljate za gradnjo teh modelov, ne vključujejo določenih demografskih skupin, kot so rasa, spol, politično prepričanje, religija, ali pa so te skupine nesorazmerno zastopane. Kaj pa, če je izhod modela interpretiran tako, da favorizira določeno demografsko skupino? Kakšne so posledice za aplikacijo? Poleg tega, kaj se zgodi, če model povzroči škodljive rezultate? Kdo je odgovoren za vedenje sistema umetne inteligence? To so nekatera vprašanja, ki jih bomo raziskali v tem učnem načrtu. + +V tej lekciji boste: + +- Povečali zavedanje o pomembnosti pravičnosti v strojnem učenju in škodah, povezanih s pravičnostjo. +- Spoznali prakso raziskovanja odstopanj in nenavadnih scenarijev za zagotavljanje zanesljivosti in varnosti. +- Pridobili razumevanje o potrebi po vključevanju vseh z oblikovanjem inkluzivnih sistemov. +- Raziskali, kako pomembno je varovati zasebnost in varnost podatkov ter ljudi. +- Spoznali pomen pristopa "steklene škatle" za pojasnjevanje vedenja modelov umetne inteligence. +- Postali pozorni na to, kako je odgovornost ključna za gradnjo zaupanja v sisteme umetne inteligence. + +## Predpogoj + +Kot predpogoj si oglejte učni načrt "Načela odgovorne umetne inteligence" in si oglejte spodnji video na to temo: + +Več o odgovorni umetni inteligenci lahko izveste s sledenjem temu [učnemu načrtu](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott). + +[![Microsoftov pristop k odgovorni umetni inteligenci](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoftov pristop k odgovorni umetni inteligenci") + +> 🎥 Kliknite zgornjo sliko za video: Microsoftov pristop k odgovorni umetni inteligenci + +## Pravičnost + +Sistemi umetne inteligence bi morali obravnavati vse enako in se izogibati različnemu vplivu na podobne skupine ljudi. Na primer, ko sistemi umetne inteligence svetujejo pri medicinskem zdravljenju, prošnjah za posojila ali zaposlitvi, bi morali podati enaka priporočila vsem z enakimi simptomi, finančnimi okoliščinami ali poklicnimi kvalifikacijami. Vsak od nas kot človek nosi podedovane pristranskosti, ki vplivajo na naše odločitve in dejanja. Te pristranskosti so lahko vidne v podatkih, ki jih uporabljamo za treniranje sistemov umetne inteligence. Takšna manipulacija se včasih zgodi nenamerno. Pogosto je težko zavestno vedeti, kdaj vnašate pristranskost v podatke. + +**"Nepravičnost"** zajema negativne vplive ali "škode" za skupino ljudi, kot so tiste, opredeljene glede na raso, spol, starost ali status invalidnosti. Glavne škode, povezane s pravičnostjo, lahko razvrstimo kot: + +- **Dodeljevanje**, če je na primer spol ali etnična pripadnost favorizirana pred drugo. +- **Kakovost storitve**. Če trenirate podatke za en specifičen scenarij, vendar je resničnost veliko bolj kompleksna, to vodi do slabo delujoče storitve. Na primer, podajalnik mila, ki ne zazna ljudi s temno kožo. [Referenca](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) +- **Omalovaževanje**. Nepravično kritiziranje in označevanje nečesa ali nekoga. Na primer, tehnologija za označevanje slik je zloglasno napačno označila slike temnopolte ljudi kot gorile. +- **Prekomerna ali nezadostna zastopanost**. Ideja, da določena skupina ni vidna v določenem poklicu, in vsaka storitev ali funkcija, ki to še naprej promovira, prispeva k škodi. +- **Stereotipiziranje**. Povezovanje določene skupine s predhodno določenimi lastnostmi. Na primer, sistem za prevajanje med angleščino in turščino lahko vsebuje netočnosti zaradi besed s stereotipnimi povezavami s spolom. + +![prevod v turščino](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png) +> prevod v turščino + +![prevod nazaj v angleščino](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) +> prevod nazaj v angleščino + +Pri oblikovanju in testiranju sistemov umetne inteligence moramo zagotoviti, da je umetna inteligenca pravična in ni programirana za sprejemanje pristranskih ali diskriminatornih odločitev, ki jih ljudje prav tako ne smejo sprejemati. Zagotavljanje pravičnosti v umetni inteligenci in strojnem učenju ostaja kompleksen sociotehnični izziv. + +### Zanesljivost in varnost + +Za gradnjo zaupanja morajo biti sistemi umetne inteligence zanesljivi, varni in dosledni v običajnih in nepričakovanih pogojih. Pomembno je vedeti, kako se bodo sistemi umetne inteligence obnašali v različnih situacijah, še posebej, ko gre za odstopanja. Pri gradnji rešitev umetne inteligence je treba nameniti veliko pozornosti temu, kako obravnavati širok spekter okoliščin, s katerimi se lahko srečajo rešitve umetne inteligence. Na primer, avtonomni avtomobil mora postaviti varnost ljudi kot najvišjo prioriteto. Posledično mora umetna inteligenca, ki poganja avtomobil, upoštevati vse možne scenarije, s katerimi se lahko avtomobil sreča, kot so noč, nevihte ali snežni meteži, otroci, ki tečejo čez cesto, hišni ljubljenčki, gradbena dela itd. Kako dobro sistem umetne inteligence obravnava širok spekter pogojev zanesljivo in varno, odraža raven predvidevanja, ki jo je podatkovni znanstvenik ali razvijalec umetne inteligence upošteval med oblikovanjem ali testiranjem sistema. + +> [🎥 Kliknite tukaj za video: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) + +### Inkluzivnost + +Sistemi umetne inteligence bi morali biti zasnovani tako, da vključujejo in opolnomočijo vse. Pri oblikovanju in implementaciji sistemov umetne inteligence podatkovni znanstveniki in razvijalci umetne inteligence identificirajo in obravnavajo morebitne ovire v sistemu, ki bi lahko nenamerno izključile ljudi. Na primer, po svetu je 1 milijarda ljudi z invalidnostmi. Z napredkom umetne inteligence lahko dostopajo do širokega spektra informacij in priložnosti bolj enostavno v svojem vsakdanjem življenju. Z odpravljanjem ovir se ustvarjajo priložnosti za inovacije in razvoj izdelkov umetne inteligence z boljšimi izkušnjami, ki koristijo vsem. + +> [🎥 Kliknite tukaj za video: inkluzivnost v umetni inteligenci](https://www.microsoft.com/videoplayer/embed/RE4vl9v) + +### Varnost in zasebnost + +Sistemi umetne inteligence bi morali biti varni in spoštovati zasebnost ljudi. Ljudje manj zaupajo sistemom, ki ogrožajo njihovo zasebnost, informacije ali življenja. Pri treniranju modelov strojnega učenja se zanašamo na podatke za doseganje najboljših rezultatov. Pri tem je treba upoštevati izvor podatkov in njihovo integriteto. Na primer, ali so podatki uporabniško posredovani ali javno dostopni? Poleg tega je med delom s podatki ključno razviti sisteme umetne inteligence, ki lahko zaščitijo zaupne informacije in se uprejo napadom. Ker umetna inteligenca postaja vse bolj razširjena, postaja zaščita zasebnosti in varnost pomembnih osebnih ter poslovnih informacij vse bolj kritična in kompleksna. Zasebnost in varnost podatkov zahtevata posebno pozornost pri umetni inteligenci, saj je dostop do podatkov bistven za to, da sistemi umetne inteligence sprejemajo natančne in informirane napovedi ter odločitve o ljudeh. + +> [🎥 Kliknite tukaj za video: varnost v umetni inteligenci](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Kot industrija smo dosegli pomemben napredek na področju zasebnosti in varnosti, ki ga močno spodbujajo regulacije, kot je GDPR (Splošna uredba o varstvu podatkov). +- Kljub temu moramo pri sistemih umetne inteligence priznati napetost med potrebo po več osebnih podatkih za izboljšanje učinkovitosti sistemov in zasebnostjo. +- Tako kot ob rojstvu povezanih računalnikov z internetom, opažamo tudi velik porast števila varnostnih težav, povezanih z umetno inteligenco. +- Hkrati pa opažamo, da se umetna inteligenca uporablja za izboljšanje varnosti. Na primer, večina sodobnih protivirusnih skenerjev temelji na AI heuristiki. +- Zagotoviti moramo, da se naši procesi podatkovne znanosti harmonično prepletajo z najnovejšimi praksami zasebnosti in varnosti. + +### Transparentnost + +Sistemi umetne inteligence bi morali biti razumljivi. Ključni del transparentnosti je pojasnjevanje vedenja sistemov umetne inteligence in njihovih komponent. Izboljšanje razumevanja sistemov umetne inteligence zahteva, da deležniki razumejo, kako in zakaj delujejo, da lahko identificirajo morebitne težave z zmogljivostjo, varnostjo in zasebnostjo, pristranskosti, izključujoče prakse ali nenamerne rezultate. Prav tako verjamemo, da bi morali biti tisti, ki uporabljajo sisteme umetne inteligence, iskreni in odkriti glede tega, kdaj, zakaj in kako se odločijo za njihovo uporabo. Prav tako morajo pojasniti omejitve sistemov, ki jih uporabljajo. Na primer, če banka uporablja sistem umetne inteligence za podporo pri odločanju o potrošniških posojilih, je pomembno preučiti rezultate in razumeti, kateri podatki vplivajo na priporočila sistema. Vlade začenjajo regulirati umetno inteligenco v različnih industrijah, zato morajo podatkovni znanstveniki in organizacije pojasniti, ali sistem umetne inteligence izpolnjuje regulativne zahteve, še posebej, ko pride do neželenega rezultata. + +> [🎥 Kliknite tukaj za video: transparentnost v umetni inteligenci](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Ker so sistemi umetne inteligence tako kompleksni, je težko razumeti, kako delujejo in interpretirati rezultate. +- To pomanjkanje razumevanja vpliva na način upravljanja, operacionalizacije in dokumentiranja teh sistemov. +- Še pomembneje pa to pomanjkanje razumevanja vpliva na odločitve, sprejete na podlagi rezultatov, ki jih ti sistemi proizvajajo. + +### Odgovornost + +Ljudje, ki oblikujejo in uvajajo sisteme umetne inteligence, morajo biti odgovorni za delovanje svojih sistemov. Potreba po odgovornosti je še posebej ključna pri občutljivih tehnologijah, kot je prepoznavanje obrazov. V zadnjem času se povečuje povpraševanje po tehnologiji prepoznavanja obrazov, zlasti s strani organov pregona, ki vidijo potencial tehnologije pri uporabi, kot je iskanje pogrešanih otrok. Vendar pa bi te tehnologije lahko potencialno uporabila vlada za ogrožanje temeljnih svoboščin svojih državljanov, na primer z omogočanjem neprekinjenega nadzora določenih posameznikov. Zato morajo podatkovni znanstveniki in organizacije prevzeti odgovornost za to, kako njihov sistem umetne inteligence vpliva na posameznike ali družbo. + +[![Vodilni raziskovalec umetne inteligence opozarja na množični nadzor prek prepoznavanja obrazov](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoftov pristop k odgovorni umetni inteligenci") + +> 🎥 Kliknite zgornjo sliko za video: Opozorila o množičnem nadzoru prek prepoznavanja obrazov + +Na koncu je eno največjih vprašanj naše generacije, kot prve generacije, ki prinaša umetno inteligenco v družbo, kako zagotoviti, da bodo računalniki ostali odgovorni ljudem in kako zagotoviti, da bodo ljudje, ki oblikujejo računalnike, ostali odgovorni vsem drugim. + +## Ocena vpliva + +Pred treniranjem modela strojnega učenja je pomembno izvesti oceno vpliva, da razumemo namen sistema umetne inteligence; kakšna je predvidena uporaba; kje bo uveden; in kdo bo interagiral s sistemom. To je koristno za pregledovalce ali preizkuševalce, ki ocenjujejo sistem, da vedo, katere dejavnike je treba upoštevati pri prepoznavanju morebitnih tveganj in pričakovanih posledic. + +Naslednja področja so v ospredju pri izvajanju ocene vpliva: + +* **Negativen vpliv na posameznike**. Zavedanje o kakršnih koli omejitvah ali zahtevah, nepodprti uporabi ali znanih omejitvah, ki ovirajo delovanje sistema, je ključno za zagotovitev, da sistem ni uporabljen na način, ki bi lahko škodoval posameznikom. +* **Zahteve glede podatkov**. Razumevanje, kako in kje bo sistem uporabljal podatke, omogoča pregledovalcem, da raziščejo morebitne zahteve glede podatkov, na katere morate biti pozorni (npr. GDPR ali HIPPA regulacije podatkov). Poleg tega preučite, ali je vir ali količina podatkov zadostna za treniranje. +* **Povzetek vpliva**. Zberite seznam morebitnih škod, ki bi lahko nastale zaradi uporabe sistema. Skozi življenjski cikel strojnega učenja preverite, ali so identificirane težave ublažene ali obravnavane. +* **Ustrezni cilji** za vsako od šestih temeljnih načel. Ocenite, ali so cilji iz vsakega načela doseženi in ali obstajajo kakršne koli vrzeli. + +## Odpravljanje napak z odgovorno umetno inteligenco + +Podobno kot odpravljanje napak v programski aplikaciji je odpravljanje napak v sistemu umetne inteligence nujen proces prepoznavanja in reševanja težav v sistemu. Obstaja veliko dejavnikov, ki lahko vplivajo na to, da model ne deluje, kot je pričakovano ali odgovorno. Večina tradicionalnih metrik zmogljivosti modela so kvantitativni agregati zmogljivosti modela, ki niso dovolj za analizo, kako model krši načela odgovorne umetne inteligence. Poleg tega je model strojnega učenja črna škatla, kar otežuje razumevanje, kaj vodi do njegovih rezultatov ali zagotavljanje pojasnil, ko naredi napako. Kasneje v tem tečaju se bomo naučili, kako uporabljati nadzorno ploščo odgovorne umetne inteligence za pomoč pri odpravljanju napak v sistemih umetne inteligence. Nadzorna plošča zagotavlja celovit pripomoček za podatkovne znanstvenike in razvijalce umetne inteligence za izvajanje: + +* **Analiza napak**. Za prepoznavanje porazdelitve napak modela, ki lahko vplivajo na pravičnost ali zanesljivost sistema. +* **Pregled modela**. Za odkrivanje, kje obstajajo razlike v zmogljivosti modela med podatkovnimi skupinami. +* **Analiza podatkov**. Za razumevanje porazdelitve podatkov in prepoznavanje morebitne pristranskosti v podatkih, ki bi lahko povzročila težave s pravi +Oglejte si ta delavnico za poglobitev v teme: + +- Na poti do odgovorne umetne inteligence: Prenos načel v prakso, avtorji Besmira Nushi, Mehrnoosh Sameki in Amit Sharma + +[![Responsible AI Toolbox: Odprtokodni okvir za gradnjo odgovorne umetne inteligence](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Odprtokodni okvir za gradnjo odgovorne umetne inteligence") + +> 🎥 Kliknite zgornjo sliko za video: RAI Toolbox: Odprtokodni okvir za gradnjo odgovorne umetne inteligence, avtorji Besmira Nushi, Mehrnoosh Sameki in Amit Sharma + +Preberite tudi: + +- Microsoftov center virov za RAI: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsoftova raziskovalna skupina FATE: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +RAI Toolbox: + +- [GitHub repozitorij Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox) + +Preberite o orodjih Azure Machine Learning za zagotavljanje pravičnosti: + +- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) + +## Naloga + +[Raziščite RAI Toolbox](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/1-Introduction/3-fairness/assignment.md b/translations/sl/1-Introduction/3-fairness/assignment.md new file mode 100644 index 00000000..1ceac83a --- /dev/null +++ b/translations/sl/1-Introduction/3-fairness/assignment.md @@ -0,0 +1,25 @@ + +# Raziskovanje orodja Responsible AI Toolbox + +## Navodila + +V tej lekciji ste spoznali orodje Responsible AI Toolbox, "projekt odprte kode, ki ga vodi skupnost, z namenom pomagati podatkovnim znanstvenikom analizirati in izboljšati sisteme umetne inteligence." Za to nalogo raziščite enega od [zvezkov](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) orodja RAI Toolbox in svoje ugotovitve predstavite v obliki poročila ali predstavitve. + +## Merila ocenjevanja + +| Merila | Odlično | Zadostno | Potrebne izboljšave | +| ------- | -------- | -------- | ------------------- | +| | Predstavljeno je poročilo ali PowerPoint predstavitev, ki obravnava sisteme Fairlearn, zvezek, ki je bil izveden, in sklepe, ki so bili sprejeti na podlagi izvedbe | Predstavljeno je poročilo brez sklepov | Poročilo ni predstavljeno | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitne nesporazume ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/1-Introduction/4-techniques-of-ML/README.md b/translations/sl/1-Introduction/4-techniques-of-ML/README.md new file mode 100644 index 00000000..7b069cc1 --- /dev/null +++ b/translations/sl/1-Introduction/4-techniques-of-ML/README.md @@ -0,0 +1,132 @@ + +# Tehnike strojnega učenja + +Proces gradnje, uporabe in vzdrževanja modelov strojnega učenja ter podatkov, ki jih uporabljajo, se močno razlikuje od mnogih drugih razvojnih delovnih tokov. V tej lekciji bomo razjasnili ta proces in predstavili glavne tehnike, ki jih morate poznati. Naučili se boste: + +- Razumeti procese, ki so osnova strojnega učenja na visoki ravni. +- Raziskati osnovne koncepte, kot so 'modeli', 'napovedi' in 'podatki za učenje'. + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +[![ML za začetnike - Tehnike strojnega učenja](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML za začetnike - Tehnike strojnega učenja") + +> 🎥 Kliknite zgornjo sliko za kratek video, ki obravnava to lekcijo. + +## Uvod + +Na visoki ravni je proces ustvarjanja strojnega učenja (ML) sestavljen iz več korakov: + +1. **Odločite se za vprašanje**. Večina procesov ML se začne z vprašanjem, na katerega ni mogoče odgovoriti z enostavnim pogojnim programom ali sistemom, ki temelji na pravilih. Ta vprašanja se pogosto vrtijo okoli napovedi na podlagi zbirke podatkov. +2. **Zberite in pripravite podatke**. Da bi lahko odgovorili na svoje vprašanje, potrebujete podatke. Kakovost in včasih količina vaših podatkov bosta določili, kako dobro lahko odgovorite na začetno vprašanje. Vizualizacija podatkov je pomemben vidik te faze. Ta faza vključuje tudi razdelitev podatkov na skupino za učenje in testiranje za gradnjo modela. +3. **Izberite metodo učenja**. Glede na vaše vprašanje in naravo podatkov morate izbrati način, kako želite model naučiti, da bo najbolje odražal vaše podatke in podajal natančne napovedi. Ta del procesa ML zahteva specifično strokovno znanje in pogosto veliko eksperimentiranja. +4. **Naučite model**. Z uporabo podatkov za učenje boste uporabili različne algoritme za učenje modela, da prepozna vzorce v podatkih. Model lahko uporablja notranje uteži, ki jih je mogoče prilagoditi, da daje prednost določenim delom podatkov pred drugimi, da zgradi boljši model. +5. **Ocenite model**. Uporabite podatke, ki jih model še ni videl (vaše testne podatke), da preverite, kako se model obnese. +6. **Prilagodite parametre**. Na podlagi uspešnosti modela lahko proces ponovite z različnimi parametri ali spremenljivkami, ki nadzorujejo vedenje algoritmov, uporabljenih za učenje modela. +7. **Napovedujte**. Uporabite nove vnose za testiranje natančnosti vašega modela. + +## Kakšno vprašanje zastaviti + +Računalniki so še posebej spretni pri odkrivanju skritih vzorcev v podatkih. Ta uporabnost je zelo koristna za raziskovalce, ki imajo vprašanja o določenem področju, na katera ni mogoče enostavno odgovoriti z ustvarjanjem sistema, ki temelji na pogojnih pravilih. Pri aktuarskih nalogah, na primer, bi lahko podatkovni znanstvenik oblikoval ročno izdelana pravila o smrtnosti kadilcev v primerjavi z nekadilci. + +Ko pa v enačbo vključimo veliko drugih spremenljivk, se lahko model ML izkaže za bolj učinkovitega pri napovedovanju prihodnjih stopenj smrtnosti na podlagi pretekle zdravstvene zgodovine. Bolj vesel primer bi lahko bila napoved vremena za mesec april na določenem območju na podlagi podatkov, ki vključujejo zemljepisno širino, dolžino, podnebne spremembe, bližino oceana, vzorce zračnih tokov in še več. + +✅ Ta [predstavitev](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) o vremenskih modelih ponuja zgodovinski pogled na uporabo ML pri analizi vremena. + +## Naloge pred gradnjo + +Preden začnete graditi svoj model, morate opraviti več nalog. Da bi preizkusili svoje vprašanje in oblikovali hipotezo na podlagi napovedi modela, morate identificirati in konfigurirati več elementov. + +### Podatki + +Da bi lahko odgovorili na svoje vprašanje z določeno stopnjo gotovosti, potrebujete zadostno količino podatkov ustrezne vrste. Na tej točki morate storiti dve stvari: + +- **Zberite podatke**. Ob upoštevanju prejšnje lekcije o pravičnosti pri analizi podatkov zbirajte podatke skrbno. Bodite pozorni na vire teh podatkov, morebitne inherentne pristranskosti in dokumentirajte njihov izvor. +- **Pripravite podatke**. Obstaja več korakov v procesu priprave podatkov. Morda boste morali združiti podatke in jih normalizirati, če prihajajo iz različnih virov. Kakovost in količino podatkov lahko izboljšate z različnimi metodami, kot je pretvorba nizov v številke (kot to počnemo pri [Gručenju](../../5-Clustering/1-Visualize/README.md)). Morda boste ustvarili nove podatke na podlagi izvirnih (kot to počnemo pri [Klasifikaciji](../../4-Classification/1-Introduction/README.md)). Podatke lahko očistite in uredite (kot bomo storili pred lekcijo o [Spletni aplikaciji](../../3-Web-App/README.md)). Na koncu jih boste morda morali naključno razporediti in premešati, odvisno od vaših tehnik učenja. + +✅ Po zbiranju in obdelavi podatkov si vzemite trenutek, da preverite, ali njihova oblika omogoča obravnavo zastavljenega vprašanja. Morda se izkaže, da podatki ne bodo dobro delovali pri vaši nalogi, kot odkrijemo v naših lekcijah o [Gručenju](../../5-Clustering/1-Visualize/README.md)! + +### Značilnosti in cilj + +[Značilnost](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) je merljiva lastnost vaših podatkov. V mnogih podatkovnih nizih je izražena kot naslov stolpca, kot so 'datum', 'velikost' ali 'barva'. Vaša spremenljivka značilnosti, običajno predstavljena kot `X` v kodi, predstavlja vhodno spremenljivko, ki bo uporabljena za učenje modela. + +Cilj je stvar, ki jo poskušate napovedati. Cilj, običajno predstavljen kot `y` v kodi, predstavlja odgovor na vprašanje, ki ga poskušate zastaviti svojim podatkom: v decembru, kakšne **barve** bodo najcenejše buče? v San Franciscu, katera soseska bo imela najboljšo ceno **nepremičnin**? Včasih se cilj imenuje tudi atribut oznake. + +### Izbor spremenljivke značilnosti + +🎓 **Izbor značilnosti in ekstrakcija značilnosti** Kako veste, katero spremenljivko izbrati pri gradnji modela? Verjetno boste šli skozi proces izbora značilnosti ali ekstrakcije značilnosti, da izberete prave spremenljivke za najbolj zmogljiv model. Vendar pa to ni isto: "Ekstrakcija značilnosti ustvarja nove značilnosti iz funkcij izvirnih značilnosti, medtem ko izbor značilnosti vrne podmnožico značilnosti." ([vir](https://wikipedia.org/wiki/Feature_selection)) + +### Vizualizirajte svoje podatke + +Pomemben vidik orodij podatkovnega znanstvenika je moč vizualizacije podatkov z uporabo več odličnih knjižnic, kot sta Seaborn ali MatPlotLib. Vizualizacija podatkov vam lahko omogoči odkrivanje skritih korelacij, ki jih lahko izkoristite. Vaše vizualizacije vam lahko pomagajo tudi pri odkrivanju pristranskosti ali neuravnoteženih podatkov (kot odkrijemo pri [Klasifikaciji](../../4-Classification/2-Classifiers-1/README.md)). + +### Razdelite svoj podatkovni niz + +Pred učenjem morate razdeliti svoj podatkovni niz na dva ali več delov neenake velikosti, ki še vedno dobro predstavljajo podatke. + +- **Učenje**. Ta del podatkovnega niza se prilega vašemu modelu, da ga nauči. Ta niz predstavlja večino izvirnega podatkovnega niza. +- **Testiranje**. Testni podatkovni niz je neodvisna skupina podatkov, pogosto pridobljena iz izvirnih podatkov, ki jo uporabite za potrditev uspešnosti zgrajenega modela. +- **Validacija**. Validacijski niz je manjša neodvisna skupina primerov, ki jo uporabite za prilagoditev hiperparametrov ali arhitekture modela, da izboljšate model. Glede na velikost vaših podatkov in vprašanje, ki ga zastavljate, morda ne boste potrebovali gradnje tega tretjega niza (kot ugotavljamo pri [Napovedovanju časovnih vrst](../../7-TimeSeries/1-Introduction/README.md)). + +## Gradnja modela + +Z uporabo podatkov za učenje je vaš cilj zgraditi model ali statistično predstavitev vaših podatkov z uporabo različnih algoritmov za **učenje**. Učenje modela ga izpostavi podatkom in mu omogoči, da naredi predpostavke o zaznanih vzorcih, ki jih odkrije, potrdi in sprejme ali zavrne. + +### Odločite se za metodo učenja + +Glede na vaše vprašanje in naravo podatkov boste izbrali metodo za učenje. Če preučite [dokumentacijo Scikit-learn](https://scikit-learn.org/stable/user_guide.html) - ki jo uporabljamo v tem tečaju - lahko raziščete številne načine za učenje modela. Glede na vaše izkušnje boste morda morali preizkusiti več različnih metod, da zgradite najboljši model. Verjetno boste šli skozi proces, pri katerem podatkovni znanstveniki ocenjujejo uspešnost modela z uporabo podatkov, ki jih model še ni videl, preverjajo natančnost, pristranskost in druge težave, ki zmanjšujejo kakovost, ter izbirajo najbolj primerno metodo učenja za obravnavano nalogo. + +### Naučite model + +Oboroženi s podatki za učenje ste pripravljeni, da jih 'prilagodite' za ustvarjanje modela. Opazili boste, da v mnogih knjižnicah ML najdete kodo 'model.fit' - to je trenutek, ko pošljete svojo spremenljivko značilnosti kot niz vrednosti (običajno 'X') in ciljno spremenljivko (običajno 'y'). + +### Ocenite model + +Ko je proces učenja zaključen (za učenje velikega modela lahko traja veliko iteracij ali 'epoh'), boste lahko ocenili kakovost modela z uporabo testnih podatkov za oceno njegove uspešnosti. Ti podatki so podmnožica izvirnih podatkov, ki jih model še ni analiziral. Lahko natisnete tabelo metrik o kakovosti vašega modela. + +🎓 **Prilagajanje modela** + +V kontekstu strojnega učenja prilagajanje modela pomeni natančnost osnovne funkcije modela, ko poskuša analizirati podatke, s katerimi ni seznanjen. + +🎓 **Premalo prilagajanje** in **prekomerno prilagajanje** sta pogosti težavi, ki zmanjšujeta kakovost modela, saj se model prilagodi bodisi premalo bodisi preveč. To povzroči, da model podaja napovedi bodisi preveč usklajene bodisi premalo usklajene s podatki za učenje. Prekomerno prilagojen model preveč dobro napoveduje podatke za učenje, ker se je preveč naučil podrobnosti in šuma podatkov. Premalo prilagojen model ni natančen, saj ne more natančno analizirati niti podatkov za učenje niti podatkov, ki jih še ni 'videl'. + +![prekomerno prilagajanje modela](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png) +> Infografika avtorice [Jen Looper](https://twitter.com/jenlooper) + +## Prilagoditev parametrov + +Ko je vaše začetno učenje zaključeno, opazujte kakovost modela in razmislite o izboljšanju z nastavitvijo njegovih 'hiperparametrov'. Več o procesu preberite [v dokumentaciji](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott). + +## Napovedovanje + +To je trenutek, ko lahko uporabite popolnoma nove podatke za testiranje natančnosti vašega modela. V 'aplikativnem' okolju ML, kjer gradite spletne aplikacije za uporabo modela v produkciji, lahko ta proces vključuje zbiranje uporabniških vnosov (na primer pritisk na gumb), da nastavite spremenljivko in jo pošljete modelu za sklepanje ali oceno. + +V teh lekcijah boste odkrili, kako uporabiti te korake za pripravo, gradnjo, testiranje, ocenjevanje in napovedovanje - vse korake podatkovnega znanstvenika in še več, ko napredujete na svoji poti, da postanete 'full stack' inženir strojnega učenja. + +--- + +## 🚀Izziv + +Narišite diagram poteka, ki odraža korake strokovnjaka za strojno učenje. Kje se trenutno vidite v procesu? Kje predvidevate, da boste imeli težave? Kaj se vam zdi enostavno? + +## [Kviz po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Poiščite spletne intervjuje s podatkovnimi znanstveniki, ki razpravljajo o svojem vsakdanjem delu. Tukaj je [eden](https://www.youtube.com/watch?v=Z3IjgbbCEfs). + +## Naloga + +[Intervjuirajte podatkovnega znanstvenika](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitne nesporazume ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/1-Introduction/4-techniques-of-ML/assignment.md b/translations/sl/1-Introduction/4-techniques-of-ML/assignment.md new file mode 100644 index 00000000..3d14b9f4 --- /dev/null +++ b/translations/sl/1-Introduction/4-techniques-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Intervju z podatkovnim znanstvenikom + +## Navodila + +V vašem podjetju, uporabniški skupini ali med prijatelji ali sošolci se pogovorite z nekom, ki profesionalno dela kot podatkovni znanstvenik. Napišite kratko poročilo (500 besed) o njihovih vsakodnevnih nalogah. Ali so specialisti ali delajo 'full stack'? + +## Merila + +| Merilo | Odlično | Zadostno | Potrebno izboljšanje | +| --------| ----------------------------------------------------------------------------------- | ----------------------------------------------------------------- | --------------------- | +| | Esej ustrezne dolžine, z navedenimi viri, je predstavljen kot .doc datoteka | Esej je slabo naveden ali krajši od zahtevane dolžine | Esej ni predstavljen | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/1-Introduction/README.md b/translations/sl/1-Introduction/README.md new file mode 100644 index 00000000..22333b74 --- /dev/null +++ b/translations/sl/1-Introduction/README.md @@ -0,0 +1,37 @@ + +# Uvod v strojno učenje + +V tem delu učnega načrta boste spoznali osnovne koncepte, ki so temelj področja strojnega učenja, kaj to je, ter se seznanili z njegovo zgodovino in tehnikami, ki jih raziskovalci uporabljajo pri delu z njim. Raziskujmo ta novi svet strojnega učenja skupaj! + +![zemeljska obla](../../../1-Introduction/images/globe.jpg) +> Fotografija avtorja Bill Oxford na Unsplash + +### Lekcije + +1. [Uvod v strojno učenje](1-intro-to-ML/README.md) +1. [Zgodovina strojnega učenja in umetne inteligence](2-history-of-ML/README.md) +1. [Pravičnost in strojno učenje](3-fairness/README.md) +1. [Tehnike strojnega učenja](4-techniques-of-ML/README.md) + +### Zasluge + +"Uvod v strojno učenje" je bil napisan z ♥️ s strani ekipe, ki vključuje [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) in [Jen Looper](https://twitter.com/jenlooper) + +"Zgodovina strojnega učenja" je bila napisana z ♥️ s strani [Jen Looper](https://twitter.com/jenlooper) in [Amy Boyd](https://twitter.com/AmyKateNicho) + +"Pravičnost in strojno učenje" je bila napisana z ♥️ s strani [Tomomi Imura](https://twitter.com/girliemac) + +"Tehnike strojnega učenja" so bile napisane z ♥️ s strani [Jen Looper](https://twitter.com/jenlooper) in [Chris Noring](https://twitter.com/softchris) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna napačna razumevanja ali napačne interpretacije, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/1-Tools/README.md b/translations/sl/2-Regression/1-Tools/README.md new file mode 100644 index 00000000..445d57cd --- /dev/null +++ b/translations/sl/2-Regression/1-Tools/README.md @@ -0,0 +1,239 @@ + +# Začnite s Pythonom in Scikit-learn za regresijske modele + +![Povzetek regresij v sketchnote](../../../../sketchnotes/ml-regression.png) + +> Sketchnote avtorja [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Predavanje kviz](https://ff-quizzes.netlify.app/en/ml/) + +> ### [To lekcijo lahko najdete tudi v jeziku R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) + +## Uvod + +V teh štirih lekcijah boste odkrili, kako zgraditi regresijske modele. Kmalu bomo razpravljali, za kaj so ti modeli uporabni. Preden pa začnete, poskrbite, da imate na voljo ustrezna orodja za začetek procesa! + +V tej lekciji boste izvedeli, kako: + +- Pripraviti računalnik za lokalne naloge strojnega učenja. +- Delati z Jupyter zvezki. +- Uporabljati Scikit-learn, vključno z namestitvijo. +- Raziskati linearno regresijo s praktično vajo. + +## Namestitve in konfiguracije + +[![ML za začetnike - Pripravite orodja za gradnjo modelov strojnega učenja](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML za začetnike - Pripravite orodja za gradnjo modelov strojnega učenja") + +> 🎥 Kliknite zgornjo sliko za kratek video o konfiguraciji računalnika za strojno učenje. + +1. **Namestite Python**. Prepričajte se, da je [Python](https://www.python.org/downloads/) nameščen na vašem računalniku. Python boste uporabljali za številne naloge podatkovne znanosti in strojnega učenja. Večina računalniških sistemov že vključuje namestitev Pythona. Na voljo so tudi uporabni [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott), ki olajšajo nastavitev za nekatere uporabnike. + + Nekatere uporabe Pythona pa zahtevajo eno različico programske opreme, druge pa drugo. Zato je koristno delati v [virtualnem okolju](https://docs.python.org/3/library/venv.html). + +2. **Namestite Visual Studio Code**. Prepričajte se, da imate na računalniku nameščen Visual Studio Code. Sledite tem navodilom za [namestitev Visual Studio Code](https://code.visualstudio.com/) za osnovno namestitev. Python boste uporabljali v Visual Studio Code v tem tečaju, zato se morda želite seznaniti z [nastavitvijo Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) za razvoj v Pythonu. + + > Seznanite se s Pythonom z delom skozi to zbirko [učnih modulov](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) + > + > [![Nastavitev Pythona z Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Nastavitev Pythona z Visual Studio Code") + > + > 🎥 Kliknite zgornjo sliko za video: uporaba Pythona v VS Code. + +3. **Namestite Scikit-learn**, tako da sledite [tem navodilom](https://scikit-learn.org/stable/install.html). Ker morate zagotoviti uporabo Pythona 3, je priporočljivo, da uporabite virtualno okolje. Če to knjižnico nameščate na računalnik Mac z M1, so na zgoraj navedeni strani posebna navodila. + +4. **Namestite Jupyter Notebook**. Potrebovali boste [namestitev paketa Jupyter](https://pypi.org/project/jupyter/). + +## Vaše okolje za avtorstvo ML + +Uporabljali boste **zvezke** za razvoj kode v Pythonu in ustvarjanje modelov strojnega učenja. Ta vrsta datoteke je pogosto orodje za podatkovne znanstvenike, prepoznate pa jih po priponi `.ipynb`. + +Zvezki so interaktivno okolje, ki razvijalcu omogoča tako kodiranje kot dodajanje opomb in pisanje dokumentacije okoli kode, kar je zelo uporabno za eksperimentalne ali raziskovalno usmerjene projekte. + +[![ML za začetnike - Nastavitev Jupyter zvezkov za začetek gradnje regresijskih modelov](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML za začetnike - Nastavitev Jupyter zvezkov za začetek gradnje regresijskih modelov") + +> 🎥 Kliknite zgornjo sliko za kratek video o tej vaji. + +### Vaja - delo z zvezkom + +V tej mapi boste našli datoteko _notebook.ipynb_. + +1. Odprite _notebook.ipynb_ v Visual Studio Code. + + Začel se bo Jupyter strežnik s Pythonom 3+. V zvezku boste našli območja, ki jih je mogoče `zagnati`, torej dele kode. Kodo lahko zaženete tako, da izberete ikono, ki izgleda kot gumb za predvajanje. + +2. Izberite ikono `md` in dodajte nekaj markdowna ter naslednje besedilo **# Dobrodošli v vašem zvezku**. + + Nato dodajte nekaj kode v Pythonu. + +3. Vnesite **print('hello notebook')** v blok kode. +4. Izberite puščico za zagon kode. + + Videti bi morali natisnjeno izjavo: + + ```output + hello notebook + ``` + +![VS Code z odprtim zvezkom](../../../../2-Regression/1-Tools/images/notebook.jpg) + +Kodo lahko prepletate z opombami, da sami dokumentirate zvezek. + +✅ Razmislite za trenutek, kako se delovno okolje spletnega razvijalca razlikuje od okolja podatkovnega znanstvenika. + +## Začetek dela s Scikit-learn + +Zdaj, ko je Python nastavljen v vašem lokalnem okolju in ste seznanjeni z Jupyter zvezki, se enako seznanimo s Scikit-learn (izgovorjava `sci` kot v `science`). Scikit-learn ponuja [obsežen API](https://scikit-learn.org/stable/modules/classes.html#api-ref) za izvajanje nalog strojnega učenja. + +Po navedbah njihove [spletne strani](https://scikit-learn.org/stable/getting_started.html) je "Scikit-learn odprtokodna knjižnica strojnega učenja, ki podpira nadzorovano in nenadzorovano učenje. Prav tako ponuja različna orodja za prileganje modelov, predobdelavo podatkov, izbiro modelov in ocenjevanje ter številne druge pripomočke." + +V tem tečaju boste uporabljali Scikit-learn in druga orodja za gradnjo modelov strojnega učenja za izvajanje nalog, ki jih imenujemo 'tradicionalno strojno učenje'. Namenoma smo se izognili nevronskim mrežam in globokemu učenju, saj so bolje obravnavani v našem prihajajočem učnem načrtu 'AI za začetnike'. + +Scikit-learn omogoča enostavno gradnjo modelov in njihovo ocenjevanje za uporabo. Osredotoča se predvsem na uporabo numeričnih podatkov in vsebuje več pripravljenih naborov podatkov za uporabo kot učna orodja. Prav tako vključuje vnaprej pripravljene modele, ki jih lahko študentje preizkusijo. Raziskujmo proces nalaganja vnaprej pripravljenih podatkov in uporabe vgrajenega ocenjevalnika za prvi ML model s Scikit-learn z osnovnimi podatki. + +## Vaja - vaš prvi zvezek s Scikit-learn + +> Ta vadnica je bila navdihnjena z [primerom linearne regresije](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) na spletni strani Scikit-learn. + + +[![ML za začetnike - Vaš prvi projekt linearne regresije v Pythonu](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML za začetnike - Vaš prvi projekt linearne regresije v Pythonu") + +> 🎥 Kliknite zgornjo sliko za kratek video o tej vaji. + +V datoteki _notebook.ipynb_, povezani s to lekcijo, izbrišite vse celice s pritiskom na ikono 'koš za smeti'. + +V tem razdelku boste delali z majhnim naborom podatkov o sladkorni bolezni, ki je vgrajen v Scikit-learn za učne namene. Predstavljajte si, da želite preizkusiti zdravljenje za bolnike s sladkorno boleznijo. Modeli strojnega učenja vam lahko pomagajo določiti, kateri bolniki bi se bolje odzvali na zdravljenje, na podlagi kombinacij spremenljivk. Tudi zelo osnovni regresijski model, ko je vizualiziran, lahko pokaže informacije o spremenljivkah, ki bi vam pomagale organizirati teoretične klinične preizkuse. + +✅ Obstaja veliko vrst regresijskih metod, izbira pa je odvisna od vprašanja, na katerega želite odgovoriti. Če želite napovedati verjetno višino osebe določene starosti, bi uporabili linearno regresijo, saj iščete **numerično vrednost**. Če vas zanima, ali naj se določena vrsta kuhinje šteje za vegansko ali ne, iščete **kategorijsko dodelitev**, zato bi uporabili logistično regresijo. Kasneje boste izvedeli več o logistični regresiji. Razmislite o nekaterih vprašanjih, ki jih lahko postavite podatkom, in kateri od teh metod bi bila bolj primerna. + +Začnimo s to nalogo. + +### Uvoz knjižnic + +Za to nalogo bomo uvozili nekaj knjižnic: + +- **matplotlib**. To je uporabno [orodje za risanje grafov](https://matplotlib.org/), ki ga bomo uporabili za ustvarjanje linijskega grafa. +- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) je uporabna knjižnica za obdelavo numeričnih podatkov v Pythonu. +- **sklearn**. To je [knjižnica Scikit-learn](https://scikit-learn.org/stable/user_guide.html). + +Uvozite nekaj knjižnic za pomoč pri nalogah. + +1. Dodajte uvoze z vnosom naslednje kode: + + ```python + import matplotlib.pyplot as plt + import numpy as np + from sklearn import datasets, linear_model, model_selection + ``` + + Zgornja koda uvaža `matplotlib`, `numpy` in `datasets`, `linear_model` ter `model_selection` iz `sklearn`. `model_selection` se uporablja za razdelitev podatkov na učne in testne sklope. + +### Nabor podatkov o sladkorni bolezni + +Vgrajeni [nabor podatkov o sladkorni bolezni](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) vključuje 442 vzorcev podatkov o sladkorni bolezni z 10 značilnimi spremenljivkami, med katerimi so nekatere: + +- starost: starost v letih +- bmi: indeks telesne mase +- bp: povprečni krvni tlak +- s1 tc: T-celice (vrsta belih krvnih celic) + +✅ Ta nabor podatkov vključuje koncept 'spola' kot značilne spremenljivke, pomembne za raziskave o sladkorni bolezni. Številni medicinski nabori podatkov vključujejo tovrstno binarno klasifikacijo. Razmislite, kako bi lahko takšne kategorizacije izključile določene dele populacije iz zdravljenja. + +Zdaj naložite podatke X in y. + +> 🎓 Ne pozabite, da gre za nadzorovano učenje, zato potrebujemo imenovan cilj 'y'. + +V novi celici kode naložite nabor podatkov o sladkorni bolezni z uporabo `load_diabetes()`. Vhod `return_X_y=True` signalizira, da bo `X` matrika podatkov, `y` pa regresijski cilj. + +1. Dodajte nekaj ukazov za izpis, da prikažete obliko matrike podatkov in njen prvi element: + + ```python + X, y = datasets.load_diabetes(return_X_y=True) + print(X.shape) + print(X[0]) + ``` + + Kar dobite kot odgovor, je nabor. Prva dva vrednosti nabora dodelite `X` in `y`. Več o [naborih](https://wikipedia.org/wiki/Tuple) lahko izveste tukaj. + + Vidite lahko, da ti podatki vsebujejo 442 elementov, oblikovanih v poljih z 10 elementi: + + ```text + (442, 10) + [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076 + -0.04340085 -0.00259226 0.01990842 -0.01764613] + ``` + + ✅ Razmislite o razmerju med podatki in regresijskim ciljem. Linearna regresija napoveduje razmerja med značilnostjo X in ciljno spremenljivko y. Ali lahko v dokumentaciji najdete [cilj](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) za nabor podatkov o sladkorni bolezni? Kaj ta nabor podatkov prikazuje, glede na cilj? + +2. Nato izberite del tega nabora podatkov za risanje tako, da izberete 3. stolpec nabora podatkov. To lahko storite z uporabo operatorja `:` za izbiro vseh vrstic, nato pa izberete 3. stolpec z uporabo indeksa (2). Podatke lahko preoblikujete v 2D matriko - kot je potrebno za risanje - z uporabo `reshape(n_rows, n_columns)`. Če je eden od parametrov -1, se ustrezna dimenzija izračuna samodejno. + + ```python + X = X[:, 2] + X = X.reshape((-1,1)) + ``` + + ✅ Kadarkoli natisnite podatke, da preverite njihovo obliko. + +3. Zdaj, ko imate podatke pripravljene za risanje, lahko preverite, ali lahko stroj pomaga določiti logično ločnico med številkami v tem naboru podatkov. Za to morate razdeliti tako podatke (X) kot cilj (y) na testne in učne sklope. Scikit-learn ima preprost način za to; testne podatke lahko razdelite na določenem mestu. + + ```python + X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) + ``` + +4. Zdaj ste pripravljeni na učenje modela! Naložite model linearne regresije in ga naučite z učnimi sklopi X in y z uporabo `model.fit()`: + + ```python + model = linear_model.LinearRegression() + model.fit(X_train, y_train) + ``` + + ✅ `model.fit()` je funkcija, ki jo boste videli v številnih knjižnicah ML, kot je TensorFlow. + +5. Nato ustvarite napoved z uporabo testnih podatkov z uporabo funkcije `predict()`. To bo uporabljeno za risanje črte med skupinami podatkov. + + ```python + y_pred = model.predict(X_test) + ``` + +6. Zdaj je čas, da prikažete podatke na grafu. Matplotlib je zelo uporabno orodje za to nalogo. Ustvarite razpršeni grafikon vseh testnih podatkov X in y ter uporabite napoved za risanje črte na najbolj primernem mestu med skupinami podatkov modela. + + ```python + plt.scatter(X_test, y_test, color='black') + plt.plot(X_test, y_pred, color='blue', linewidth=3) + plt.xlabel('Scaled BMIs') + plt.ylabel('Disease Progression') + plt.title('A Graph Plot Showing Diabetes Progression Against BMI') + plt.show() + ``` + + ![razpršeni grafikon, ki prikazuje podatkovne točke o sladkorni bolezni](../../../../2-Regression/1-Tools/images/scatterplot.png) +✅ Razmislite malo o tem, kaj se tukaj dogaja. Ravna črta poteka skozi številne majhne točke podatkov, vendar kaj pravzaprav počne? Ali vidite, kako bi morali biti sposobni uporabiti to črto za napovedovanje, kje bi se nova, nevidna podatkovna točka morala uvrstiti glede na y-os grafa? Poskusite z besedami opisati praktično uporabo tega modela. + +Čestitke, izdelali ste svoj prvi model linearne regresije, ustvarili napoved z njim in jo prikazali na grafu! + +--- +## 🚀Izziv + +Prikažite drugo spremenljivko iz tega nabora podatkov. Namig: uredite to vrstico: `X = X[:,2]`. Glede na cilj tega nabora podatkov, kaj lahko odkrijete o napredovanju sladkorne bolezni kot bolezni? +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled & Samostojno učenje + +V tem vodiču ste delali z enostavno linearno regresijo, ne pa z univariatno ali večkratno linearno regresijo. Preberite nekaj o razlikah med temi metodami ali si oglejte [ta video](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef). + +Preberite več o konceptu regresije in razmislite, kakšna vprašanja je mogoče odgovoriti s to tehniko. Vzemite [ta vodič](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott), da poglobite svoje razumevanje. + +## Naloga + +[Drug nabor podatkov](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/1-Tools/assignment.md b/translations/sl/2-Regression/1-Tools/assignment.md new file mode 100644 index 00000000..ecb16ad2 --- /dev/null +++ b/translations/sl/2-Regression/1-Tools/assignment.md @@ -0,0 +1,27 @@ + +# Regresija s Scikit-learn + +## Navodila + +Oglejte si [Linnerudov nabor podatkov](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) v Scikit-learn. Ta nabor podatkov ima več [ciljnih spremenljivk](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): 'Sestavljen je iz treh vadbenih (podatkovnih) in treh fizioloških (ciljnih) spremenljivk, zbranih pri dvajsetih moških srednjih let v fitnes klubu'. + +Z lastnimi besedami opišite, kako ustvariti regresijski model, ki bi prikazal razmerje med obsegom pasu in številom opravljenih trebušnjakov. Enako naredite za ostale podatkovne točke v tem naboru podatkov. + +## Merila + +| Merilo | Odlično | Zadostno | Potrebna izboljšava | +| ----------------------------- | ------------------------------------- | ---------------------------- | -------------------------- | +| Oddaja opisnega odstavka | Oddan je dobro napisan odstavek | Oddanih je nekaj stavkov | Opis ni priložen | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/1-Tools/solution/Julia/README.md b/translations/sl/2-Regression/1-Tools/solution/Julia/README.md new file mode 100644 index 00000000..384e898d --- /dev/null +++ b/translations/sl/2-Regression/1-Tools/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/2-Data/README.md b/translations/sl/2-Regression/2-Data/README.md new file mode 100644 index 00000000..def071dd --- /dev/null +++ b/translations/sl/2-Regression/2-Data/README.md @@ -0,0 +1,226 @@ + +# Ustvarjanje regresijskega modela s Scikit-learn: priprava in vizualizacija podatkov + +![Infografika vizualizacije podatkov](../../../../2-Regression/2-Data/images/data-visualization.png) + +Infografika avtorja [Dasani Madipalli](https://twitter.com/dasani_decoded) + +## [Predavanje kviz](https://ff-quizzes.netlify.app/en/ml/) + +> ### [To lekcijo lahko najdete tudi v jeziku R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) + +## Uvod + +Zdaj, ko imate na voljo orodja za gradnjo modelov strojnega učenja s Scikit-learn, ste pripravljeni začeti postavljati vprašanja svojim podatkom. Pri delu s podatki in uporabi rešitev strojnega učenja je zelo pomembno, da znate postaviti prava vprašanja, da lahko pravilno izkoristite potenciale svojega nabora podatkov. + +V tej lekciji boste spoznali: + +- Kako pripraviti podatke za gradnjo modela. +- Kako uporabiti Matplotlib za vizualizacijo podatkov. + +## Postavljanje pravih vprašanj svojim podatkom + +Vprašanje, na katerega želite odgovor, bo določilo, katere vrste algoritmov strojnega učenja boste uporabili. Kakovost odgovora pa bo močno odvisna od narave vaših podatkov. + +Oglejte si [podatke](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), ki so na voljo za to lekcijo. Datoteko .csv lahko odprete v programu VS Code. Hiter pregled takoj pokaže, da so prisotne prazne vrednosti ter mešanica nizov in številskih podatkov. Obstaja tudi nenavaden stolpec z imenom 'Package', kjer so podatki mešanica 'sacks', 'bins' in drugih vrednosti. Podatki so pravzaprav precej neurejeni. + +[![ML za začetnike - Kako analizirati in očistiti nabor podatkov](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML za začetnike - Kako analizirati in očistiti nabor podatkov") + +> 🎥 Kliknite zgornjo sliko za kratek video o pripravi podatkov za to lekcijo. + +Pravzaprav ni pogosto, da dobite nabor podatkov, ki je popolnoma pripravljen za ustvarjanje modela strojnega učenja. V tej lekciji se boste naučili, kako pripraviti surove podatke z uporabo standardnih knjižnic za Python. Spoznali boste tudi različne tehnike za vizualizacijo podatkov. + +## Študija primera: 'trg buč' + +V tej mapi boste našli datoteko .csv v korenski mapi `data`, imenovano [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), ki vključuje 1757 vrstic podatkov o trgu buč, razvrščenih po mestih. To so surovi podatki, pridobljeni iz [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), ki jih distribuira Ministrstvo za kmetijstvo ZDA. + +### Priprava podatkov + +Ti podatki so v javni domeni. Na spletni strani USDA jih je mogoče prenesti v številnih ločenih datotekah, po mestih. Da bi se izognili prevelikemu številu ločenih datotek, smo združili vse podatke mest v eno preglednico, kar pomeni, da smo podatke že nekoliko _pripravili_. Zdaj si podrobneje oglejmo podatke. + +### Podatki o bučah - prvi vtisi + +Kaj opazite pri teh podatkih? Že prej ste videli, da gre za mešanico nizov, števil, praznih vrednosti in nenavadnih vrednosti, ki jih morate razumeti. + +Katero vprašanje lahko postavite tem podatkom z uporabo regresijske tehnike? Kaj pa "Napovedovanje cene buče za prodajo v določenem mesecu"? Če ponovno pogledate podatke, boste opazili, da morate narediti nekaj sprememb, da ustvarite strukturo podatkov, potrebno za to nalogo. + +## Vaja - analiza podatkov o bučah + +Uporabimo [Pandas](https://pandas.pydata.org/) (ime pomeni `Python Data Analysis`), zelo uporabno orodje za oblikovanje podatkov, za analizo in pripravo teh podatkov o bučah. + +### Najprej preverite manjkajoče datume + +Najprej boste morali preveriti, ali manjkajo datumi: + +1. Pretvorite datume v mesečni format (to so datumi iz ZDA, zato je format `MM/DD/YYYY`). +2. Izluščite mesec v nov stolpec. + +Odprite datoteko _notebook.ipynb_ v Visual Studio Code in uvozite preglednico v nov Pandas dataframe. + +1. Uporabite funkcijo `head()`, da si ogledate prvih pet vrstic. + + ```python + import pandas as pd + pumpkins = pd.read_csv('../data/US-pumpkins.csv') + pumpkins.head() + ``` + + ✅ Katero funkcijo bi uporabili za ogled zadnjih petih vrstic? + +1. Preverite, ali v trenutnem dataframeu manjkajo podatki: + + ```python + pumpkins.isnull().sum() + ``` + + Manjkajo podatki, vendar morda to ne bo pomembno za nalogo. + +1. Da bo vaš dataframe lažji za delo, izberite samo stolpce, ki jih potrebujete, z uporabo funkcije `loc`, ki iz izvirnega dataframea izlušči skupino vrstic (podanih kot prvi parameter) in stolpcev (podanih kot drugi parameter). Izraz `:` v spodnjem primeru pomeni "vse vrstice". + + ```python + columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] + pumpkins = pumpkins.loc[:, columns_to_select] + ``` + +### Drugič, določite povprečno ceno buče + +Razmislite, kako določiti povprečno ceno buče v določenem mesecu. Katere stolpce bi izbrali za to nalogo? Namig: potrebovali boste 3 stolpce. + +Rešitev: vzemite povprečje stolpcev `Low Price` in `High Price`, da napolnite nov stolpec Price, in pretvorite stolpec Date, da prikaže samo mesec. Na srečo, glede na zgornjo preverbo, ni manjkajočih podatkov za datume ali cene. + +1. Za izračun povprečja dodajte naslednjo kodo: + + ```python + price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 + + month = pd.DatetimeIndex(pumpkins['Date']).month + + ``` + + ✅ Po želji natisnite katerikoli podatek, ki ga želite preveriti, z uporabo `print(month)`. + +2. Zdaj kopirajte pretvorjene podatke v nov Pandas dataframe: + + ```python + new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) + ``` + + Če natisnete svoj dataframe, boste videli čist, urejen nabor podatkov, na katerem lahko gradite svoj novi regresijski model. + +### Ampak počakajte! Nekaj je čudnega + +Če pogledate stolpec `Package`, so buče prodane v različnih konfiguracijah. Nekatere so prodane v '1 1/9 bushel' enotah, nekatere v '1/2 bushel' enotah, nekatere na bučo, nekatere na funt, in nekatere v velikih škatlah različnih širin. + +> Zdi se, da je buče zelo težko dosledno tehtati + +Če se poglobite v izvirne podatke, je zanimivo, da imajo vse enote z `Unit of Sale` enako 'EACH' ali 'PER BIN' tudi vrsto `Package` na palec, na bin ali 'each'. Zdi se, da je buče zelo težko dosledno tehtati, zato jih filtrirajmo tako, da izberemo samo buče z nizom 'bushel' v njihovem stolpcu `Package`. + +1. Dodajte filter na vrhu datoteke, pod začetnim uvozom .csv: + + ```python + pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] + ``` + + Če zdaj natisnete podatke, lahko vidite, da dobite le približno 415 vrstic podatkov, ki vsebujejo buče po buslju. + +### Ampak počakajte! Še nekaj je treba narediti + +Ste opazili, da se količina buslja razlikuje po vrsticah? Potrebno je normalizirati cene, da prikažete cene na buselj, zato naredite nekaj izračunov za standardizacijo. + +1. Dodajte te vrstice po bloku, ki ustvarja dataframe new_pumpkins: + + ```python + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) + + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) + ``` + +✅ Po podatkih [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) teža buslja variira glede na vrsto pridelka, saj gre za meritev prostornine. "Buselj paradižnikov, na primer, naj bi tehtal 56 funtov... Listi in zelenjava zavzamejo več prostora z manjšo težo, zato buselj špinače tehta le 20 funtov." Vse skupaj je precej zapleteno! Ne ukvarjajmo se s pretvorbo buslja v funte, ampak raje določimo ceno na buselj. Vse to proučevanje busljev buč pa kaže, kako zelo pomembno je razumeti naravo svojih podatkov! + +Zdaj lahko analizirate cene na enoto glede na njihovo meritev buslja. Če še enkrat natisnete podatke, lahko vidite, kako so standardizirani. + +✅ Ste opazili, da so buče, prodane po pol buslja, zelo drage? Ali lahko ugotovite, zakaj? Namig: majhne buče so veliko dražje od velikih, verjetno zato, ker jih je veliko več na buselj, glede na neizkoriščen prostor, ki ga zavzame ena velika votla buča za pito. + +## Strategije vizualizacije + +Del naloge podatkovnega znanstvenika je prikazati kakovost in naravo podatkov, s katerimi dela. To pogosto dosežejo z ustvarjanjem zanimivih vizualizacij, kot so grafi, diagrami in tabele, ki prikazujejo različne vidike podatkov. Na ta način lahko vizualno prikažejo odnose in vrzeli, ki jih je sicer težko odkriti. + +[![ML za začetnike - Kako vizualizirati podatke z Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML za začetnike - Kako vizualizirati podatke z Matplotlib") + +> 🎥 Kliknite zgornjo sliko za kratek video o vizualizaciji podatkov za to lekcijo. + +Vizualizacije lahko pomagajo tudi pri določanju tehnike strojnega učenja, ki je najbolj primerna za podatke. Na primer, raztrosni diagram, ki sledi liniji, kaže, da so podatki primerni za nalogo linearne regresije. + +Ena od knjižnic za vizualizacijo podatkov, ki dobro deluje v Jupyterjevih beležnicah, je [Matplotlib](https://matplotlib.org/) (ki ste jo videli tudi v prejšnji lekciji). + +> Pridobite več izkušenj z vizualizacijo podatkov v [teh vadnicah](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). + +## Vaja - eksperimentiranje z Matplotlib + +Poskusite ustvariti osnovne grafe za prikaz novega dataframea, ki ste ga pravkar ustvarili. Kaj bi pokazal osnovni linijski graf? + +1. Uvozite Matplotlib na vrhu datoteke, pod uvozom Pandas: + + ```python + import matplotlib.pyplot as plt + ``` + +1. Ponovno zaženite celotno beležnico za osvežitev. +1. Na dnu beležnice dodajte celico za prikaz podatkov kot škatlasti graf: + + ```python + price = new_pumpkins.Price + month = new_pumpkins.Month + plt.scatter(price, month) + plt.show() + ``` + + ![Raztrosni diagram, ki prikazuje razmerje med ceno in mesecem](../../../../2-Regression/2-Data/images/scatterplot.png) + + Ali je ta graf uporaben? Vas kaj na njem preseneča? + + Ni posebej uporaben, saj le prikazuje razpršenost točk v določenem mesecu. + +### Naredimo ga uporabnega + +Da bi grafi prikazovali uporabne podatke, jih običajno morate nekako združiti. Poskusimo ustvariti graf, kjer y-os prikazuje mesece, podatki pa prikazujejo porazdelitev podatkov. + +1. Dodajte celico za ustvarjanje združenega stolpčnega diagrama: + + ```python + new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') + plt.ylabel("Pumpkin Price") + ``` + + ![Stolpčni diagram, ki prikazuje razmerje med ceno in mesecem](../../../../2-Regression/2-Data/images/barchart.png) + + To je bolj uporabna vizualizacija podatkov! Zdi se, da kaže, da so najvišje cene buč v septembru in oktobru. Ali to ustreza vašim pričakovanjem? Zakaj ali zakaj ne? + +--- + +## 🚀Izziv + +Raziščite različne vrste vizualizacij, ki jih ponuja Matplotlib. Katere vrste so najbolj primerne za regresijske probleme? + +## [Kviz po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Oglejte si različne načine vizualizacije podatkov. Naredite seznam različnih knjižnic, ki so na voljo, in zabeležite, katere so najboljše za določene vrste nalog, na primer 2D vizualizacije v primerjavi s 3D vizualizacijami. Kaj odkrijete? + +## Naloga + +[Raziskovanje vizualizacije](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/2-Data/assignment.md b/translations/sl/2-Regression/2-Data/assignment.md new file mode 100644 index 00000000..2cfde65d --- /dev/null +++ b/translations/sl/2-Regression/2-Data/assignment.md @@ -0,0 +1,22 @@ + +# Raziskovanje vizualizacij + +Na voljo je več različnih knjižnic za vizualizacijo podatkov. Ustvarite nekaj vizualizacij z uporabo podatkov o bučah iz te lekcije z matplotlib in seaborn v vzorčnem zvezku. Katere knjižnice so lažje za uporabo? +## Merila + +| Merila | Odlično | Zadostno | Potrebna izboljšava | +| ------- | -------- | -------- | ------------------- | +| | Zvezek je predložen z dvema raziskavama/vizualizacijama | Zvezek je predložen z eno raziskavo/vizualizacijo | Zvezek ni predložen | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/2-Data/solution/Julia/README.md b/translations/sl/2-Regression/2-Data/solution/Julia/README.md new file mode 100644 index 00000000..7ba9c462 --- /dev/null +++ b/translations/sl/2-Regression/2-Data/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto za izpolnitev + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/3-Linear/README.md b/translations/sl/2-Regression/3-Linear/README.md new file mode 100644 index 00000000..c2fb4113 --- /dev/null +++ b/translations/sl/2-Regression/3-Linear/README.md @@ -0,0 +1,380 @@ + +# Ustvarjanje regresijskega modela s Scikit-learn: štiri načini regresije + +![Infografika linearne in polinomske regresije](../../../../2-Regression/3-Linear/images/linear-polynomial.png) +> Infografika avtorja [Dasani Madipalli](https://twitter.com/dasani_decoded) +## [Predavanje kviz](https://ff-quizzes.netlify.app/en/ml/) + +> ### [To lekcijo lahko najdete tudi v jeziku R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html) +### Uvod + +Do sedaj ste raziskali, kaj je regresija, z vzorčnimi podatki iz nabora podatkov o cenah buč, ki ga bomo uporabljali skozi celotno lekcijo. Prav tako ste podatke vizualizirali z uporabo knjižnice Matplotlib. + +Zdaj ste pripravljeni, da se poglobite v regresijo za strojno učenje. Medtem ko vizualizacija omogoča razumevanje podatkov, je prava moč strojnega učenja v _treningu modelov_. Modele treniramo na zgodovinskih podatkih, da samodejno zajamejo odvisnosti podatkov, kar omogoča napovedovanje rezultatov za nove podatke, ki jih model še ni videl. + +V tej lekciji boste izvedeli več o dveh vrstah regresije: _osnovni linearni regresiji_ in _polinomski regresiji_, skupaj z nekaj matematike, ki stoji za temi tehnikami. Ti modeli nam bodo omogočili napovedovanje cen buč glede na različne vhodne podatke. + +[![ML za začetnike - Razumevanje linearne regresije](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "ML za začetnike - Razumevanje linearne regresije") + +> 🎥 Kliknite zgornjo sliko za kratek video pregled linearne regresije. + +> Skozi celoten učni načrt predpostavljamo minimalno matematično predznanje in si prizadevamo, da bi bilo gradivo dostopno študentom iz drugih področij. Zato bodite pozorni na opombe, 🧮 poudarke, diagrame in druga učna orodja, ki pomagajo pri razumevanju. + +### Predpogoji + +Do zdaj bi morali biti že seznanjeni s strukturo podatkov o bučah, ki jih preučujemo. Najdete jih prednaložene in predhodno očiščene v datoteki _notebook.ipynb_ te lekcije. V datoteki so cene buč prikazane na bušel v novem podatkovnem okviru. Prepričajte se, da lahko zaženete te beležnice v jedrih Visual Studio Code. + +### Priprava + +Kot opomnik, te podatke nalagate, da bi si zastavili vprašanja, kot so: + +- Kdaj je najboljši čas za nakup buč? +- Kakšno ceno lahko pričakujem za zabojček mini buč? +- Ali naj jih kupim v polovičnih bušelskih košarah ali v škatlah velikosti 1 1/9 bušla? +Poglobimo se v te podatke. + +V prejšnji lekciji ste ustvarili podatkovni okvir Pandas in ga napolnili z delom izvirnega nabora podatkov, standardizirali cene na bušel. S tem pa ste lahko zbrali le približno 400 podatkovnih točk in le za jesenske mesece. + +Oglejte si podatke, ki so prednaloženi v beležnici, ki spremlja to lekcijo. Podatki so prednaloženi, začetni raztrosni diagram pa je narisan, da prikaže podatke po mesecih. Morda lahko z dodatnim čiščenjem pridobimo več podrobnosti o naravi podatkov. + +## Linearna regresijska premica + +Kot ste se naučili v 1. lekciji, je cilj linearne regresije narisati premico, ki: + +- **Prikaže odnose med spremenljivkami**. Prikaže razmerje med spremenljivkami. +- **Omogoča napovedi**. Omogoča natančne napovedi, kje bi nova podatkovna točka padla v razmerju do te premice. + +Za risanje te vrste premice je značilna metoda **najmanjših kvadratov**. Izraz 'najmanjši kvadrati' pomeni, da so vse podatkovne točke okoli regresijske premice kvadrirane in nato seštejejo. Idealno je, da je ta končna vsota čim manjša, saj želimo nizko število napak ali `najmanjše kvadrate`. + +To storimo, ker želimo modelirati premico, ki ima najmanjšo kumulativno razdaljo od vseh naših podatkovnih točk. Člene kvadriramo pred seštevanjem, saj nas zanima njihova velikost, ne pa smer. + +> **🧮 Pokaži mi matematiko** +> +> Ta premica, imenovana _premica najboljše prileganja_, je izražena z [enačbo](https://en.wikipedia.org/wiki/Simple_linear_regression): +> +> ``` +> Y = a + bX +> ``` +> +> `X` je 'pojasnjevalna spremenljivka'. `Y` je 'odvisna spremenljivka'. Naklon premice je `b`, `a` pa je presečišče z osjo y, kar se nanaša na vrednost `Y`, ko `X = 0`. +> +>![izračun naklona](../../../../2-Regression/3-Linear/images/slope.png) +> +> Najprej izračunajte naklon `b`. Infografika avtorja [Jen Looper](https://twitter.com/jenlooper) +> +> Z drugimi besedami, glede na naše izvirno vprašanje o podatkih o bučah: "napovedati ceno buče na bušel glede na mesec", bi `X` predstavljal ceno, `Y` pa mesec prodaje. +> +>![dopolnitev enačbe](../../../../2-Regression/3-Linear/images/calculation.png) +> +> Izračunajte vrednost Y. Če plačujete približno 4 $, mora biti april! Infografika avtorja [Jen Looper](https://twitter.com/jenlooper) +> +> Matematika, ki izračuna premico, mora prikazati njen naklon, ki je odvisen tudi od presečišča, torej od tega, kje se `Y` nahaja, ko `X = 0`. +> +> Metodo izračuna teh vrednosti si lahko ogledate na spletnem mestu [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Obiščite tudi [ta kalkulator najmanjših kvadratov](https://www.mathsisfun.com/data/least-squares-calculator.html), da vidite, kako vrednosti številk vplivajo na premico. + +## Korelacija + +Še en izraz, ki ga je treba razumeti, je **koeficient korelacije** med danima spremenljivkama X in Y. Z raztrosnim diagramom lahko hitro vizualizirate ta koeficient. Diagram s podatkovnimi točkami, razporejenimi v ravni črti, ima visoko korelacijo, medtem ko ima diagram s podatkovnimi točkami, razpršenimi povsod med X in Y, nizko korelacijo. + +Dober model linearne regresije bo tisti, ki ima visok (bližje 1 kot 0) koeficient korelacije z uporabo metode najmanjših kvadratov in regresijske premice. + +✅ Zaženite beležnico, ki spremlja to lekcijo, in si oglejte raztrosni diagram meseca in cene. Ali se vam zdi, da imajo podatki, ki povezujejo mesec in ceno prodaje buč, visoko ali nizko korelacijo glede na vašo vizualno interpretacijo raztrosnega diagrama? Ali se to spremeni, če uporabite bolj natančno merilo namesto `Mesec`, npr. *dan v letu* (tj. število dni od začetka leta)? + +V spodnji kodi bomo predpostavili, da smo očistili podatke in pridobili podatkovni okvir z imenom `new_pumpkins`, podoben naslednjemu: + +ID | Mesec | DanVLeto | Vrsta | Mesto | Paket | Najnižja cena | Najvišja cena | Cena +---|-------|----------|-------|-------|-------|---------------|---------------|------ +70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 škatle | 15.0 | 15.0 | 13.636364 +71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 škatle | 18.0 | 18.0 | 16.363636 +72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 škatle | 18.0 | 18.0 | 16.363636 +73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 škatle | 17.0 | 17.0 | 15.454545 +74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 škatle | 15.0 | 15.0 | 13.636364 + +> Koda za čiščenje podatkov je na voljo v datoteki [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb). Izvedli smo enake korake čiščenja kot v prejšnji lekciji in izračunali stolpec `DanVLeto` z naslednjim izrazom: + +```python +day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days) +``` + +Zdaj, ko razumete matematiko za linearno regresijo, ustvarimo regresijski model, da preverimo, ali lahko napovemo, kateri paket buč bo imel najboljše cene. Nekdo, ki kupuje buče za praznični bučni nasad, bi morda želel te informacije, da bi optimiziral svoje nakupe paketov buč za nasad. + +## Iskanje korelacije + +[![ML za začetnike - Iskanje korelacije: Ključ do linearne regresije](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "ML za začetnike - Iskanje korelacije: Ključ do linearne regresije") + +> 🎥 Kliknite zgornjo sliko za kratek video pregled korelacije. + +Iz prejšnje lekcije ste verjetno videli, da povprečna cena za različne mesece izgleda takole: + +Povprečna cena po mesecih + +To nakazuje, da bi morala obstajati neka korelacija, in lahko poskusimo trenirati linearni regresijski model za napovedovanje razmerja med `Mesec` in `Cena` ali med `DanVLeto` in `Cena`. Tukaj je raztrosni diagram, ki prikazuje slednje razmerje: + +Raztrosni diagram cene glede na dan v letu + +Preverimo, ali obstaja korelacija, z uporabo funkcije `corr`: + +```python +print(new_pumpkins['Month'].corr(new_pumpkins['Price'])) +print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price'])) +``` + +Zdi se, da je korelacija precej majhna, -0,15 za `Mesec` in -0,17 za `DanVLeto`, vendar bi lahko obstajalo drugo pomembno razmerje. Zdi se, da obstajajo različni grozdi cen, ki ustrezajo različnim vrstam buč. Da potrdimo to hipotezo, narišimo vsako kategorijo buč z drugo barvo. S posredovanjem parametra `ax` funkciji za risanje raztrosa lahko narišemo vse točke na isti grafikon: + +```python +ax=None +colors = ['red','blue','green','yellow'] +for i,var in enumerate(new_pumpkins['Variety'].unique()): + df = new_pumpkins[new_pumpkins['Variety']==var] + ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var) +``` + +Raztrosni diagram cene glede na dan v letu + +Naša raziskava nakazuje, da ima vrsta buče večji vpliv na skupno ceno kot dejanski datum prodaje. To lahko vidimo z barvnim grafom: + +```python +new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar') +``` + +Barvni graf cene glede na vrsto + +Osredotočimo se za trenutek samo na eno vrsto buč, 'pie type', in preverimo, kakšen vpliv ima datum na ceno: + +```python +pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE'] +pie_pumpkins.plot.scatter('DayOfYear','Price') +``` +Raztrosni diagram cene glede na dan v letu + +Če zdaj izračunamo korelacijo med `Cena` in `DanVLeto` z uporabo funkcije `corr`, bomo dobili nekaj okoli `-0,27` - kar pomeni, da ima smisel trenirati napovedni model. + +> Pred treningom linearnega regresijskega modela je pomembno zagotoviti, da so naši podatki čisti. Linearna regresija ne deluje dobro z manjkajočimi vrednostmi, zato je smiselno odstraniti vse prazne celice: + +```python +pie_pumpkins.dropna(inplace=True) +pie_pumpkins.info() +``` + +Drugi pristop bi bil zapolniti te prazne vrednosti s povprečnimi vrednostmi iz ustreznega stolpca. + +## Enostavna linearna regresija + +[![ML za začetnike - Linearna in polinomska regresija z uporabo Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "ML za začetnike - Linearna in polinomska regresija z uporabo Scikit-learn") + +> 🎥 Kliknite zgornjo sliko za kratek video pregled linearne in polinomske regresije. + +Za treniranje našega linearnega regresijskega modela bomo uporabili knjižnico **Scikit-learn**. + +```python +from sklearn.linear_model import LinearRegression +from sklearn.metrics import mean_squared_error +from sklearn.model_selection import train_test_split +``` + +Začnemo z ločevanjem vhodnih vrednosti (značilnosti) in pričakovanega izhoda (oznake) v ločena numpy polja: + +```python +X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1) +y = pie_pumpkins['Price'] +``` + +> Upoštevajte, da smo morali izvesti `reshape` na vhodnih podatkih, da jih Linear Regression paket pravilno razume. Linearna regresija pričakuje 2D polje kot vhod, kjer vsaka vrstica polja ustreza vektorju vhodnih značilnosti. V našem primeru, ker imamo samo en vhod, potrebujemo polje oblike N×1, kjer je N velikost nabora podatkov. + +Nato moramo podatke razdeliti na učni in testni nabor, da lahko po treningu preverimo naš model: + +```python +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) +``` + +Na koncu trening dejanskega linearnega regresijskega modela zahteva le dve vrstici kode. Definiramo objekt `LinearRegression` in ga prilagodimo našim podatkom z uporabo metode `fit`: + +```python +lin_reg = LinearRegression() +lin_reg.fit(X_train,y_train) +``` + +Objekt `LinearRegression` po prilagoditvi vsebuje vse koeficiente regresije, do katerih lahko dostopamo z lastnostjo `.coef_`. V našem primeru je le en koeficient, ki bi moral biti okoli `-0,017`. To pomeni, da se cene zdi, da rahlo padajo s časom, vendar ne preveč, približno 2 centa na dan. Prav tako lahko dostopamo do presečišča regresije z osjo Y z uporabo `lin_reg.intercept_` - v našem primeru bo to okoli `21`, kar kaže na ceno na začetku leta. + +Da vidimo, kako natančen je naš model, lahko napovemo cene na testnem naboru podatkov in nato izmerimo, kako blizu so naše napovedi pričakovanim vrednostim. To lahko storimo z uporabo metrike srednje kvadratne napake (MSE), ki je povprečje vseh kvadratnih razlik med pričakovano in napovedano vrednostjo. + +```python +pred = lin_reg.predict(X_test) + +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') +``` +Naša napaka se zdi okoli 2 točk, kar je približno 17 %. Ni ravno dobro. Drug kazalnik kakovosti modela je **koeficient determinacije**, ki ga lahko pridobimo na naslednji način: + +```python +score = lin_reg.score(X_train,y_train) +print('Model determination: ', score) +``` +Če je vrednost 0, to pomeni, da model ne upošteva vhodnih podatkov in deluje kot *najslabši linearni napovedovalec*, kar je preprosto povprečna vrednost rezultata. Vrednost 1 pomeni, da lahko popolnoma napovemo vse pričakovane izhode. V našem primeru je koeficient okoli 0,06, kar je precej nizko. + +Prav tako lahko narišemo testne podatke skupaj z regresijsko premico, da bolje vidimo, kako regresija deluje v našem primeru: + +```python +plt.scatter(X_test,y_test) +plt.plot(X_test,pred) +``` + +Linearna regresija + +## Polinomska regresija + +Druga vrsta linearne regresije je polinomska regresija. Čeprav včasih obstaja linearna povezava med spremenljivkami – večja kot je buča po prostornini, višja je cena – včasih teh povezav ni mogoče prikazati kot ravnino ali premico. + +✅ Tukaj so [nekateri dodatni primeri](https://online.stat.psu.edu/stat501/lesson/9/9.8) podatkov, ki bi lahko uporabili polinomsko regresijo. + +Poglejte še enkrat razmerje med datumom in ceno. Ali se zdi, da bi moral biti ta raztros nujno analiziran s premico? Ali cene ne morejo nihati? V tem primeru lahko poskusite polinomsko regresijo. + +✅ Polinomi so matematični izrazi, ki lahko vsebujejo eno ali več spremenljivk in koeficientov. + +Polinomska regresija ustvari ukrivljeno premico, ki bolje ustreza nelinearnim podatkom. V našem primeru, če v vhodne podatke vključimo kvadratno spremenljivko `DayOfYear`, bi morali biti sposobni prilagoditi naše podatke s parabolično krivuljo, ki bo imela minimum na določenem mestu v letu. + +Scikit-learn vključuje uporabno [API za pipeline](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline), ki združuje različne korake obdelave podatkov. **Pipeline** je veriga **ocenjevalcev**. V našem primeru bomo ustvarili pipeline, ki najprej doda polinomske značilnosti našemu modelu, nato pa izvede regresijo: + +```python +from sklearn.preprocessing import PolynomialFeatures +from sklearn.pipeline import make_pipeline + +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) + +pipeline.fit(X_train,y_train) +``` + +Uporaba `PolynomialFeatures(2)` pomeni, da bomo vključili vse polinome druge stopnje iz vhodnih podatkov. V našem primeru to pomeni le `DayOfYear`2, vendar ob dveh vhodnih spremenljivkah X in Y to doda X2, XY in Y2. Uporabimo lahko tudi polinome višjih stopenj, če želimo. + +Pipeline lahko uporabljamo na enak način kot originalni objekt `LinearRegression`, tj. lahko uporabimo `fit` za prilagoditev modela in nato `predict` za pridobitev rezultatov napovedi. Tukaj je graf, ki prikazuje testne podatke in aproksimacijsko krivuljo: + +Polinomska regresija + +S polinomsko regresijo lahko dosežemo nekoliko nižji MSE in višji koeficient determinacije, vendar ne bistveno. Upoštevati moramo tudi druge značilnosti! + +> Opazite, da so najnižje cene buč opazovane nekje okoli noči čarovnic. Kako to razložite? + +🎃 Čestitke, pravkar ste ustvarili model, ki lahko pomaga napovedati ceno buč za pite. Verjetno lahko ponovite isti postopek za vse vrste buč, vendar bi bilo to zamudno. Zdaj se naučimo, kako upoštevati različne vrste buč v našem modelu! + +## Kategorijske značilnosti + +V idealnem svetu bi želeli napovedati cene za različne vrste buč z istim modelom. Vendar je stolpec `Variety` nekoliko drugačen od stolpcev, kot je `Month`, saj vsebuje nenumerične vrednosti. Takšni stolpci se imenujejo **kategorijski**. + +[![ML za začetnike - Napovedovanje kategorijskih značilnosti z linearno regresijo](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML za začetnike - Napovedovanje kategorijskih značilnosti z linearno regresijo") + +> 🎥 Kliknite zgornjo sliko za kratek video pregled uporabe kategorijskih značilnosti. + +Tukaj lahko vidite, kako povprečna cena odvisna od vrste buče: + +Povprečna cena po vrsti + +Da upoštevamo vrsto buče, jo moramo najprej pretvoriti v numerično obliko, ali jo **kodirati**. Obstaja več načinov, kako to storiti: + +* Preprosto **numerično kodiranje** bo ustvarilo tabelo različnih vrst in nato zamenjalo ime vrste z indeksom v tej tabeli. To ni najboljša ideja za linearno regresijo, saj linearna regresija upošteva dejansko numerično vrednost indeksa in jo doda rezultatu, pomnoženo z nekim koeficientom. V našem primeru je razmerje med številko indeksa in ceno očitno nelinearno, tudi če poskrbimo, da so indeksi urejeni na določen način. +* **One-hot kodiranje** bo zamenjalo stolpec `Variety` s 4 različnimi stolpci, enim za vsako vrsto. Vsak stolpec bo vseboval `1`, če je ustrezna vrstica določene vrste, in `0` sicer. To pomeni, da bo v linearni regresiji štiri koeficiente, po enega za vsako vrsto buče, ki bodo odgovorni za "začetno ceno" (ali bolje "dodatno ceno") za to določeno vrsto. + +Spodnja koda prikazuje, kako lahko izvedemo one-hot kodiranje vrste: + +```python +pd.get_dummies(new_pumpkins['Variety']) +``` + + ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE +----|-----------|-----------|--------------------------|---------- +70 | 0 | 0 | 0 | 1 +71 | 0 | 0 | 0 | 1 +... | ... | ... | ... | ... +1738 | 0 | 1 | 0 | 0 +1739 | 0 | 1 | 0 | 0 +1740 | 0 | 1 | 0 | 0 +1741 | 0 | 1 | 0 | 0 +1742 | 0 | 1 | 0 | 0 + +Za treniranje linearne regresije z uporabo one-hot kodirane vrste kot vhodnih podatkov moramo le pravilno inicializirati podatke `X` in `y`: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) +y = new_pumpkins['Price'] +``` + +Preostala koda je enaka kot tista, ki smo jo uporabili zgoraj za treniranje linearne regresije. Če jo preizkusite, boste videli, da je povprečna kvadratna napaka približno enaka, vendar dobimo veliko višji koeficient determinacije (~77 %). Za še bolj natančne napovedi lahko upoštevamo več kategorijskih značilnosti, pa tudi numerične značilnosti, kot sta `Month` ali `DayOfYear`. Za pridobitev ene velike matrike značilnosti lahko uporabimo `join`: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] +``` + +Tukaj upoštevamo tudi `City` in vrsto `Package`, kar nam daje MSE 2,84 (10 %) in determinacijo 0,94! + +## Vse skupaj + +Za najboljši model lahko uporabimo kombinirane (one-hot kodirane kategorijske + numerične) podatke iz zgornjega primera skupaj s polinomsko regresijo. Tukaj je celotna koda za vašo uporabo: + +```python +# set up training data +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] + +# make train-test split +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + +# setup and train the pipeline +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) +pipeline.fit(X_train,y_train) + +# predict results for test data +pred = pipeline.predict(X_test) + +# calculate MSE and determination +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') + +score = pipeline.score(X_train,y_train) +print('Model determination: ', score) +``` + +To bi nam moralo dati najboljši koeficient determinacije skoraj 97 % in MSE=2,23 (~8 % napake pri napovedi). + +| Model | MSE | Determinacija | +|-------|-----|---------------| +| `DayOfYear` Linear | 2,77 (17,2 %) | 0,07 | +| `DayOfYear` Polinomski | 2,73 (17,0 %) | 0,08 | +| `Variety` Linear | 5,24 (19,7 %) | 0,77 | +| Vse značilnosti Linear | 2,84 (10,5 %) | 0,94 | +| Vse značilnosti Polinomski | 2,23 (8,25 %) | 0,97 | + +🏆 Odlično! Ustvarili ste štiri regresijske modele v eni lekciji in izboljšali kakovost modela na 97 %. V zadnjem delu o regresiji se boste naučili o logistični regresiji za določanje kategorij. + +--- +## 🚀Izziv + +Preizkusite več različnih spremenljivk v tej beležnici, da vidite, kako korelacija ustreza natančnosti modela. + +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +V tej lekciji smo se naučili o linearni regresiji. Obstajajo tudi druge pomembne vrste regresije. Preberite o tehnikah Stepwise, Ridge, Lasso in Elasticnet. Dober tečaj za nadaljnje učenje je [Stanfordov tečaj statističnega učenja](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning). + +## Naloga + +[Ustvarite model](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/3-Linear/assignment.md b/translations/sl/2-Regression/3-Linear/assignment.md new file mode 100644 index 00000000..725d1966 --- /dev/null +++ b/translations/sl/2-Regression/3-Linear/assignment.md @@ -0,0 +1,25 @@ + +# Ustvarite regresijski model + +## Navodila + +V tej lekciji ste se naučili, kako zgraditi model z uporabo linearne in polinomske regresije. Na podlagi tega znanja poiščite podatkovni niz ali uporabite enega od vgrajenih nizov Scikit-learn za izdelavo novega modela. V svojem zvezku pojasnite, zakaj ste izbrali določeno tehniko, in pokažite natančnost svojega modela. Če model ni natančen, pojasnite, zakaj. + +## Merila ocenjevanja + +| Merilo | Odlično | Zadostno | Potrebne izboljšave | +| -------- | ------------------------------------------------------------ | -------------------------- | ------------------------------- | +| | predstavi popoln zvezek z dobro dokumentirano rešitvijo | rešitev je nepopolna | rešitev je pomanjkljiva ali vsebuje napake | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna napačna razumevanja ali napačne interpretacije, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/3-Linear/solution/Julia/README.md b/translations/sl/2-Regression/3-Linear/solution/Julia/README.md new file mode 100644 index 00000000..bb755878 --- /dev/null +++ b/translations/sl/2-Regression/3-Linear/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto rezervacije + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/4-Logistic/README.md b/translations/sl/2-Regression/4-Logistic/README.md new file mode 100644 index 00000000..56990db1 --- /dev/null +++ b/translations/sl/2-Regression/4-Logistic/README.md @@ -0,0 +1,405 @@ + +# Logistična regresija za napovedovanje kategorij + +![Infografika: Logistična vs. linearna regresija](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png) + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ta lekcija je na voljo tudi v R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html) + +## Uvod + +V tej zadnji lekciji o regresiji, eni izmed osnovnih _klasičnih_ tehnik strojnega učenja, si bomo ogledali logistično regresijo. To tehniko bi uporabili za odkrivanje vzorcev za napovedovanje binarnih kategorij. Ali je ta sladkarija čokolada ali ne? Ali je ta bolezen nalezljiva ali ne? Ali bo ta stranka izbrala ta izdelek ali ne? + +V tej lekciji boste spoznali: + +- Novo knjižnico za vizualizacijo podatkov +- Tehnike logistične regresije + +✅ Poglobite svoje razumevanje dela s to vrsto regresije v tem [učnem modulu](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott) + +## Predpogoji + +Ker smo že delali s podatki o bučah, smo dovolj seznanjeni, da opazimo, da obstaja ena binarna kategorija, s katero lahko delamo: `Barva`. + +Zgradimo model logistične regresije, da napovemo, _kakšne barve bo določena buča_ (oranžna 🎃 ali bela 👻), glede na nekatere spremenljivke. + +> Zakaj govorimo o binarni klasifikaciji v lekciji o regresiji? Izključno zaradi jezikovne priročnosti, saj je logistična regresija [pravzaprav metoda klasifikacije](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), čeprav temelji na linearni osnovi. O drugih načinih klasifikacije podatkov se boste naučili v naslednji skupini lekcij. + +## Določite vprašanje + +Za naše namene bomo to izrazili kot binarno: 'Bela' ali 'Ne bela'. V našem naboru podatkov obstaja tudi kategorija 'črtasta', vendar je primerov te kategorije malo, zato je ne bomo uporabili. Ta kategorija tako ali tako izgine, ko odstranimo manjkajoče vrednosti iz nabora podatkov. + +> 🎃 Zabavno dejstvo: bele buče včasih imenujemo 'duhove buče'. Niso zelo enostavne za rezljanje, zato niso tako priljubljene kot oranžne, vendar so videti kul! Tako bi lahko naše vprašanje preoblikovali tudi kot: 'Duh' ali 'Ne duh'. 👻 + +## O logistični regresiji + +Logistična regresija se od linearne regresije, ki ste jo spoznali prej, razlikuje v nekaj pomembnih vidikih. + +[![Strojno učenje za začetnike - Razumevanje logistične regresije za klasifikacijo](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "Strojno učenje za začetnike - Razumevanje logistične regresije za klasifikacijo") + +> 🎥 Kliknite zgornjo sliko za kratek video pregled logistične regresije. + +### Binarna klasifikacija + +Logistična regresija ne ponuja enakih funkcij kot linearna regresija. Prva ponuja napoved binarne kategorije ("bela ali ne bela"), medtem ko je druga sposobna napovedovati neprekinjene vrednosti, na primer glede na izvor buče in čas žetve, _koliko se bo njena cena zvišala_. + +![Model klasifikacije buč](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png) +> Infografika avtorja [Dasani Madipalli](https://twitter.com/dasani_decoded) + +### Druge klasifikacije + +Obstajajo tudi druge vrste logistične regresije, vključno z multinomno in ordinalno: + +- **Multinomna**, ki vključuje več kot eno kategorijo - "Oranžna, Bela in Črtasta". +- **Ordinalna**, ki vključuje urejene kategorije, uporabna, če želimo logično urediti naše rezultate, kot so buče, ki so razvrščene po končnem številu velikosti (mini, sm, med, lg, xl, xxl). + +![Multinomna vs. ordinalna regresija](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png) + +### Spremenljivke NI NUJNO, da so korelirane + +Se spomnite, kako je linearna regresija bolje delovala z bolj koreliranimi spremenljivkami? Logistična regresija je nasprotje - spremenljivke ni nujno, da se ujemajo. To ustreza tem podatkom, ki imajo nekoliko šibke korelacije. + +### Potrebujete veliko čistih podatkov + +Logistična regresija bo dala natančnejše rezultate, če uporabite več podatkov; naš majhen nabor podatkov ni optimalen za to nalogo, zato to upoštevajte. + +[![Strojno učenje za začetnike - Analiza in priprava podatkov za logistično regresijo](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "Strojno učenje za začetnike - Analiza in priprava podatkov za logistično regresijo") + +✅ Razmislite o vrstah podatkov, ki bi bile primerne za logistično regresijo. + +## Naloga - uredite podatke + +Najprej nekoliko očistite podatke, odstranite manjkajoče vrednosti in izberite le nekatere stolpce: + +1. Dodajte naslednjo kodo: + + ```python + + columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] + pumpkins = full_pumpkins.loc[:, columns_to_select] + + pumpkins.dropna(inplace=True) + ``` + + Vedno lahko pokukate v svoj novi podatkovni okvir: + + ```python + pumpkins.info + ``` + +### Vizualizacija - kategorni graf + +Do zdaj ste znova naložili [začetni zvezek](../../../../2-Regression/4-Logistic/notebook.ipynb) s podatki o bučah in jih očistili, da ste ohranili nabor podatkov, ki vsebuje nekaj spremenljivk, vključno z `Barvo`. Vizualizirajmo podatkovni okvir v zvezku z uporabo druge knjižnice: [Seaborn](https://seaborn.pydata.org/index.html), ki temelji na Matplotlibu, ki smo ga uporabljali prej. + +Seaborn ponuja nekaj zanimivih načinov za vizualizacijo vaših podatkov. Na primer, lahko primerjate porazdelitve podatkov za vsako `Sorto` in `Barvo` v kategorni graf. + +1. Ustvarite tak graf z uporabo funkcije `catplot`, uporabite naše podatke o bučah `pumpkins` in določite barvno preslikavo za vsako kategorijo buč (oranžna ali bela): + + ```python + import seaborn as sns + + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + + sns.catplot( + data=pumpkins, y="Variety", hue="Color", kind="count", + palette=palette, + ) + ``` + + ![Mreža vizualiziranih podatkov](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png) + + Z opazovanjem podatkov lahko vidite, kako se podatki o barvi nanašajo na sorto. + + ✅ Glede na ta kategorni graf, kakšne zanimive raziskave si lahko zamislite? + +### Predobdelava podatkov: kodiranje značilnosti in oznak +Naš nabor podatkov o bučah vsebuje nizovne vrednosti za vse svoje stolpce. Delo s kategorijskimi podatki je za ljudi intuitivno, za stroje pa ne. Algoritmi strojnega učenja dobro delujejo s številkami. Zato je kodiranje zelo pomemben korak v fazi predobdelave podatkov, saj nam omogoča pretvorbo kategorijskih podatkov v številčne podatke, ne da bi pri tem izgubili kakršne koli informacije. Dobro kodiranje vodi k gradnji dobrega modela. + +Za kodiranje značilnosti obstajata dve glavni vrsti kodirnikov: + +1. Ordinalni kodirnik: dobro se prilega ordinalnim spremenljivkam, ki so kategorijske spremenljivke, kjer njihovi podatki sledijo logičnemu vrstnemu redu, kot je stolpec `Item Size` v našem naboru podatkov. Ustvari preslikavo, tako da je vsaka kategorija predstavljena s številko, ki je vrstni red kategorije v stolpcu. + + ```python + from sklearn.preprocessing import OrdinalEncoder + + item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']] + ordinal_features = ['Item Size'] + ordinal_encoder = OrdinalEncoder(categories=item_size_categories) + ``` + +2. Kategorni kodirnik: dobro se prilega nominalnim spremenljivkam, ki so kategorijske spremenljivke, kjer njihovi podatki ne sledijo logičnemu vrstnemu redu, kot so vse značilnosti, razen `Item Size` v našem naboru podatkov. To je kodiranje z eno vročo vrednostjo, kar pomeni, da je vsaka kategorija predstavljena z binarnim stolpcem: kodirana spremenljivka je enaka 1, če buča pripada tej sorti, in 0 sicer. + + ```python + from sklearn.preprocessing import OneHotEncoder + + categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] + categorical_encoder = OneHotEncoder(sparse_output=False) + ``` +Nato se `ColumnTransformer` uporabi za združitev več kodirnikov v en korak in njihovo uporabo na ustreznih stolpcih. + +```python + from sklearn.compose import ColumnTransformer + + ct = ColumnTransformer(transformers=[ + ('ord', ordinal_encoder, ordinal_features), + ('cat', categorical_encoder, categorical_features) + ]) + + ct.set_output(transform='pandas') + encoded_features = ct.fit_transform(pumpkins) +``` +Po drugi strani pa za kodiranje oznake uporabimo razred `LabelEncoder` knjižnice scikit-learn, ki je pripomoček za normalizacijo oznak, tako da vsebujejo le vrednosti med 0 in n_classes-1 (tukaj 0 in 1). + +```python + from sklearn.preprocessing import LabelEncoder + + label_encoder = LabelEncoder() + encoded_label = label_encoder.fit_transform(pumpkins['Color']) +``` +Ko smo kodirali značilnosti in oznako, jih lahko združimo v nov podatkovni okvir `encoded_pumpkins`. + +```python + encoded_pumpkins = encoded_features.assign(Color=encoded_label) +``` +✅ Kakšne so prednosti uporabe ordinalnega kodirnika za stolpec `Item Size`? + +### Analizirajte odnose med spremenljivkami + +Zdaj, ko smo predhodno obdelali naše podatke, lahko analiziramo odnose med značilnostmi in oznako, da dobimo idejo o tem, kako dobro bo model lahko napovedal oznako glede na značilnosti. +Najboljši način za izvedbo te vrste analize je risanje podatkov. Ponovno bomo uporabili funkcijo `catplot` knjižnice Seaborn, da vizualiziramo odnose med `Item Size`, `Variety` in `Color` v kategorni graf. Za boljše risanje podatkov bomo uporabili kodiran stolpec `Item Size` in nekodiran stolpec `Variety`. + +```python + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size'] + + g = sns.catplot( + data=pumpkins, + x="Item Size", y="Color", row='Variety', + kind="box", orient="h", + sharex=False, margin_titles=True, + height=1.8, aspect=4, palette=palette, + ) + g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6)) + g.set_titles(row_template="{row_name}") +``` +![Kategorni graf vizualiziranih podatkov](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png) + +### Uporabite graf 'swarm' + +Ker je `Color` binarna kategorija (Bela ali Ne bela), potrebuje '[specializiran pristop](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) za vizualizacijo'. Obstajajo drugi načini za vizualizacijo odnosa te kategorije z drugimi spremenljivkami. + +Spremenljivke lahko vizualizirate vzporedno z grafi knjižnice Seaborn. + +1. Poskusite graf 'swarm', da prikažete porazdelitev vrednosti: + + ```python + palette = { + 0: 'orange', + 1: 'wheat' + } + sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette) + ``` + + ![Swarm graf vizualiziranih podatkov](../../../../2-Regression/4-Logistic/images/swarm_2.png) + +**Opozorilo**: zgornja koda lahko ustvari opozorilo, saj Seaborn ne uspe predstaviti takšne količine podatkovnih točk v grafu swarm. Možna rešitev je zmanjšanje velikosti označevalca z uporabo parametra 'size'. Vendar bodite pozorni, da to vpliva na berljivost grafa. + +> **🧮 Pokaži mi matematiko** +> +> Logistična regresija temelji na konceptu 'maksimalne verjetnosti' z uporabo [sigmoidnih funkcij](https://wikipedia.org/wiki/Sigmoid_function). 'Sigmoidna funkcija' na grafu izgleda kot oblika črke 'S'. Vzame vrednost in jo preslika nekam med 0 in 1. Njena krivulja se imenuje tudi 'logistična krivulja'. Njena formula izgleda takole: +> +> ![logistična funkcija](../../../../2-Regression/4-Logistic/images/sigmoid.png) +> +> kjer se sredinska točka sigmoidne funkcije nahaja na x-ovi točki 0, L je največja vrednost krivulje, k pa je strmina krivulje. Če je rezultat funkcije večji od 0,5, bo oznaka dodeljena razredu '1' binarne izbire. Če ne, bo razvrščena kot '0'. + +## Zgradite svoj model + +Gradnja modela za iskanje teh binarnih klasifikacij je presenetljivo enostavna v Scikit-learn. + +[![Strojno učenje za začetnike - Logistična regresija za klasifikacijo podatkov](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "Strojno učenje za začetnike - Logistična regresija za klasifikacijo podatkov") + +> 🎥 Kliknite zgornjo sliko za kratek video pregled gradnje modela linearne regresije. + +1. Izberite spremenljivke, ki jih želite uporabiti v svojem klasifikacijskem modelu, in razdelite učne ter testne nize z uporabo `train_test_split()`: + + ```python + from sklearn.model_selection import train_test_split + + X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])] + y = encoded_pumpkins['Color'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + + ``` + +2. Zdaj lahko trenirate svoj model z uporabo `fit()` z učnimi podatki in natisnete njegov rezultat: + + ```python + from sklearn.metrics import f1_score, classification_report + from sklearn.linear_model import LogisticRegression + + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('F1-score: ', f1_score(y_test, predictions)) + ``` + + Oglejte si oceno svojega modela. Ni slabo, glede na to, da imate le približno 1000 vrstic podatkov: + + ```output + precision recall f1-score support + + 0 0.94 0.98 0.96 166 + 1 0.85 0.67 0.75 33 + + accuracy 0.92 199 + macro avg 0.89 0.82 0.85 199 + weighted avg 0.92 0.92 0.92 199 + + Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 0 0 0 1 0 0 0 0 0 0 0 0 1 1] + F1-score: 0.7457627118644068 + ``` + +## Boljše razumevanje prek matrike zmede + +Medtem ko lahko dobite poročilo o oceni modela [pogoji](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) z natisom zgornjih elementov, boste morda lažje razumeli svoj model z uporabo [matrike zmede](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix), ki nam pomaga razumeti, kako model deluje. + +> 🎓 '[Matrika zmede](https://wikipedia.org/wiki/Confusion_matrix)' (ali 'matrika napak') je tabela, ki izraža resnične in napačne pozitivne ter negativne rezultate vašega modela, s čimer ocenjuje natančnost napovedi. + +1. Za uporabo matrike zmede pokličite `confusion_matrix()`: + + ```python + from sklearn.metrics import confusion_matrix + confusion_matrix(y_test, predictions) + ``` + + Oglejte si matriko zmede svojega modela: + + ```output + array([[162, 4], + [ 11, 22]]) + ``` + +V Scikit-learn matrike zmede vrstice (os 0) predstavljajo dejanske oznake, stolpci (os 1) pa napovedane oznake. + +| | 0 | 1 | +| :---: | :---: | :---: | +| 0 | TN | FP | +| 1 | FN | TP | + +Kaj se dogaja tukaj? Recimo, da je naš model pozvan, da klasificira buče med dvema binarnima kategorijama, kategorijo 'bela' in kategorijo 'ne bela'. + +- Če vaš model napove bučo kot ne belo in v resnici pripada kategoriji 'ne bela', to imenujemo resnični negativni rezultat, prikazan z zgornjo levo številko. +- Če vaš model napove bučo kot belo in v resnici pripada kategoriji 'ne bela', to imenujemo napačni negativni rezultat, prikazan z spodnjo levo številko. +- Če vaš model napove bučo kot ne belo in v resnici pripada kategoriji 'bela', to imenujemo napačni pozitivni rezultat, prikazan z zgornjo desno številko. +- Če vaš model napove bučo kot belo in v resnici pripada kategoriji 'bela', to imenujemo resnični pozitivni rezultat, prikazan z spodnjo desno številko. + +Kot ste morda uganili, je zaželeno imeti večje število resničnih pozitivnih in resničnih negativnih rezultatov ter manjše število napačnih pozitivnih in napačnih negativnih rezultatov, kar pomeni, da model deluje bolje. +Kako se matrika zmede povezuje s natančnostjo in priklicem? Spomnite se, da je poročilo o klasifikaciji, ki je bilo natisnjeno zgoraj, pokazalo natančnost (0,85) in priklic (0,67). + +Natančnost = tp / (tp + fp) = 22 / (22 + 4) = 0,8461538461538461 + +Priklic = tp / (tp + fn) = 22 / (22 + 11) = 0,6666666666666666 + +✅ V: Glede na matriko zmede, kako se je model odrezal? O: Ni slabo; obstaja kar nekaj pravih negativnih primerov, vendar tudi nekaj lažnih negativnih primerov. + +Ponovno si poglejmo izraze, ki smo jih videli prej, s pomočjo matrike zmede in njenega preslikavanja TP/TN ter FP/FN: + +🎓 Natančnost: TP/(TP + FP) Delež relevantnih primerov med pridobljenimi primeri (npr. katere oznake so bile dobro označene). + +🎓 Priklic: TP/(TP + FN) Delež relevantnih primerov, ki so bili pridobljeni, ne glede na to, ali so bili dobro označeni ali ne. + +🎓 f1-ocena: (2 * natančnost * priklic)/(natančnost + priklic) Tehtano povprečje natančnosti in priklica, pri čemer je najboljša ocena 1, najslabša pa 0. + +🎓 Podpora: Število pojavitev vsake pridobljene oznake. + +🎓 Točnost: (TP + TN)/(TP + TN + FP + FN) Delež oznak, ki so bile pravilno napovedane za vzorec. + +🎓 Makro povprečje: Izračun neuteženega povprečja metrik za vsako oznako, ne upoštevajoč neravnovesje oznak. + +🎓 Tehtano povprečje: Izračun povprečja metrik za vsako oznako, pri čemer se upošteva neravnovesje oznak z njihovo težo glede na podporo (število pravih primerov za vsako oznako). + +✅ Ali lahko ugotovite, katero metriko bi morali spremljati, če želite, da vaš model zmanjša število lažnih negativnih primerov? + +## Vizualizacija ROC krivulje tega modela + +[![ML za začetnike - Analiza zmogljivosti logistične regresije z ROC krivuljami](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML za začetnike - Analiza zmogljivosti logistične regresije z ROC krivuljami") + +> 🎥 Kliknite zgornjo sliko za kratek video pregled ROC krivulj. + +Naredimo še eno vizualizacijo, da si ogledamo tako imenovano 'ROC' krivuljo: + +```python +from sklearn.metrics import roc_curve, roc_auc_score +import matplotlib +import matplotlib.pyplot as plt +%matplotlib inline + +y_scores = model.predict_proba(X_test) +fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1]) + +fig = plt.figure(figsize=(6, 6)) +plt.plot([0, 1], [0, 1], 'k--') +plt.plot(fpr, tpr) +plt.xlabel('False Positive Rate') +plt.ylabel('True Positive Rate') +plt.title('ROC Curve') +plt.show() +``` + +S pomočjo Matplotliba narišite [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) ali ROC krivuljo modela. ROC krivulje se pogosto uporabljajo za pregled rezultatov klasifikatorja glede na njegove prave in lažne pozitivne primere. "ROC krivulje običajno prikazujejo stopnjo pravih pozitivnih primerov na Y osi in stopnjo lažnih pozitivnih primerov na X osi." Zato sta strmina krivulje in prostor med sredinsko črto ter krivuljo pomembna: želite krivuljo, ki hitro gre navzgor in čez črto. V našem primeru so na začetku prisotni lažni pozitivni primeri, nato pa se črta pravilno dvigne in gre čez. + +![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png) + +Na koncu uporabite Scikit-learnov [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) za izračun dejanskega 'Področja pod krivuljo' (AUC): + +```python +auc = roc_auc_score(y_test,y_scores[:,1]) +print(auc) +``` +Rezultat je `0.9749908725812341`. Ker se AUC giblje med 0 in 1, si želite visok rezultat, saj bo model, ki je 100 % pravilen v svojih napovedih, imel AUC 1; v tem primeru je model _kar dober_. + +V prihodnjih lekcijah o klasifikacijah se boste naučili, kako iterirati za izboljšanje rezultatov modela. Za zdaj pa čestitke! Zaključili ste te lekcije o regresiji! + +--- +## 🚀Izziv + +Logistična regresija skriva še veliko več! Najboljši način za učenje pa je eksperimentiranje. Poiščite podatkovni niz, ki je primeren za tovrstno analizo, in z njim zgradite model. Kaj ste se naučili? namig: poskusite [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) za zanimive podatkovne nize. + +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Preberite prve strani [tega dokumenta s Stanforda](https://web.stanford.edu/~jurafsky/slp3/5.pdf) o nekaterih praktičnih uporabah logistične regresije. Razmislite o nalogah, ki so bolj primerne za eno ali drugo vrsto regresijskih nalog, ki smo jih preučevali do zdaj. Kaj bi delovalo najbolje? + +## Naloga + +[Ponovno preizkusite to regresijo](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas opozarjamo, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi izhajale iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/4-Logistic/assignment.md b/translations/sl/2-Regression/4-Logistic/assignment.md new file mode 100644 index 00000000..019ea5a5 --- /dev/null +++ b/translations/sl/2-Regression/4-Logistic/assignment.md @@ -0,0 +1,25 @@ + +# Ponovno preizkušanje regresije + +## Navodila + +V lekciji ste uporabili podmnožico podatkov o bučah. Zdaj se vrnite k originalnim podatkom in poskusite uporabiti vse, očiščene in standardizirane, za izdelavo modela logistične regresije. + +## Merila + +| Merila | Odlično | Zadostno | Potrebne izboljšave | +| -------- | ----------------------------------------------------------------------- | ---------------------------------------------------------- | ----------------------------------------------------------- | +| | Predstavljen je zvezek z dobro razloženim in dobro delujočim modelom | Predstavljen je zvezek z modelom, ki deluje minimalno | Predstavljen je zvezek s slabo delujočim modelom ali brez njega | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/4-Logistic/solution/Julia/README.md b/translations/sl/2-Regression/4-Logistic/solution/Julia/README.md new file mode 100644 index 00000000..a7026ae7 --- /dev/null +++ b/translations/sl/2-Regression/4-Logistic/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto za izpolnitev + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve AI za prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/2-Regression/README.md b/translations/sl/2-Regression/README.md new file mode 100644 index 00000000..a3fd5c7b --- /dev/null +++ b/translations/sl/2-Regression/README.md @@ -0,0 +1,54 @@ + +# Regresijski modeli za strojno učenje +## Regionalna tema: Regresijski modeli za cene buč v Severni Ameriki 🎃 + +V Severni Ameriki buče pogosto izrezljajo v strašljive obraze za noč čarovnic. Odkrijmo več o teh fascinantnih zelenjavah! + +![jack-o-lanterns](../../../2-Regression/images/jack-o-lanterns.jpg) +> Fotografija avtorja Beth Teutschmann na Unsplash + +## Kaj se boste naučili + +[![Uvod v regresijo](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "Uvod v regresijo - Kliknite za ogled!") +> 🎥 Kliknite zgornjo sliko za kratek uvodni video v to lekcijo + +Lekcije v tem poglavju obravnavajo vrste regresije v kontekstu strojnega učenja. Regresijski modeli lahko pomagajo določiti _razmerje_ med spremenljivkami. Ta vrsta modela lahko napoveduje vrednosti, kot so dolžina, temperatura ali starost, in tako razkriva odnose med spremenljivkami, medtem ko analizira podatkovne točke. + +V tej seriji lekcij boste odkrili razlike med linearno in logistično regresijo ter kdaj je bolje uporabiti eno ali drugo. + +[![Strojno učenje za začetnike - Uvod v regresijske modele za strojno učenje](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "Strojno učenje za začetnike - Uvod v regresijske modele za strojno učenje") + +> 🎥 Kliknite zgornjo sliko za kratek video, ki uvaja regresijske modele. + +V tej skupini lekcij se boste pripravili na naloge strojnega učenja, vključno z nastavitvijo Visual Studio Code za upravljanje zvezkov, ki so običajno okolje za podatkovne znanstvenike. Odkrijte knjižnico Scikit-learn za strojno učenje in zgradite svoje prve modele, pri čemer se v tem poglavju osredotočite na regresijske modele. + +> Obstajajo uporabna orodja z malo kode, ki vam lahko pomagajo pri učenju dela z regresijskimi modeli. Poskusite [Azure ML za to nalogo](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +### Lekcije + +1. [Orodja za delo](1-Tools/README.md) +2. [Upravljanje podatkov](2-Data/README.md) +3. [Linearna in polinomska regresija](3-Linear/README.md) +4. [Logistična regresija](4-Logistic/README.md) + +--- +### Zasluge + +"Strojno učenje z regresijo" je bilo napisano z ♥️ avtorice [Jen Looper](https://twitter.com/jenlooper) + +♥️ Prispevki za kviz vključujejo: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) in [Ornella Altunyan](https://twitter.com/ornelladotcom) + +Podatkovni niz o bučah je predlagan v [tem projektu na Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices), njegovi podatki pa izvirajo iz [Standardnih poročil o cenah na terminalnih trgih za posebne pridelke](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), ki jih distribuira Ministrstvo za kmetijstvo Združenih držav Amerike. Dodali smo nekaj točk glede barve na podlagi sorte, da normaliziramo porazdelitev. Ti podatki so v javni domeni. + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/3-Web-App/1-Web-App/README.md b/translations/sl/3-Web-App/1-Web-App/README.md new file mode 100644 index 00000000..6e2f7521 --- /dev/null +++ b/translations/sl/3-Web-App/1-Web-App/README.md @@ -0,0 +1,359 @@ + +# Zgradite spletno aplikacijo za uporabo modela strojnega učenja + +V tej lekciji boste trenirali model strojnega učenja na podatkovnem naboru, ki je resnično izjemen: _opazovanja NLP-jev v zadnjem stoletju_, pridobljenih iz baze podatkov NUFORC. + +Naučili se boste: + +- Kako 'shraniti' treniran model +- Kako uporabiti ta model v aplikaciji Flask + +Še naprej bomo uporabljali beležke za čiščenje podatkov in treniranje modela, vendar lahko proces nadgradite tako, da raziščete uporabo modela 'v divjini', če lahko tako rečemo: v spletni aplikaciji. + +Za to morate zgraditi spletno aplikacijo z uporabo Flask. + +## [Predlekcijski kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Gradnja aplikacije + +Obstaja več načinov za gradnjo spletnih aplikacij, ki uporabljajo modele strojnega učenja. Vaša spletna arhitektura lahko vpliva na način, kako je model treniran. Predstavljajte si, da delate v podjetju, kjer je skupina za podatkovno znanost trenirala model, ki ga želite uporabiti v aplikaciji. + +### Premisleki + +Obstaja veliko vprašanj, ki jih morate zastaviti: + +- **Ali gre za spletno ali mobilno aplikacijo?** Če gradite mobilno aplikacijo ali morate model uporabiti v kontekstu IoT, lahko uporabite [TensorFlow Lite](https://www.tensorflow.org/lite/) in model uporabite v aplikaciji za Android ali iOS. +- **Kje bo model shranjen?** V oblaku ali lokalno? +- **Podpora brez povezave.** Ali mora aplikacija delovati brez povezave? +- **Katera tehnologija je bila uporabljena za treniranje modela?** Izbrana tehnologija lahko vpliva na orodja, ki jih morate uporabiti. + - **Uporaba TensorFlow.** Če trenirate model z uporabo TensorFlow, na primer, ta ekosistem omogoča pretvorbo modela TensorFlow za uporabo v spletni aplikaciji z uporabo [TensorFlow.js](https://www.tensorflow.org/js/). + - **Uporaba PyTorch.** Če gradite model z uporabo knjižnice, kot je [PyTorch](https://pytorch.org/), imate možnost, da ga izvozite v format [ONNX](https://onnx.ai/) (Open Neural Network Exchange) za uporabo v JavaScript spletnih aplikacijah, ki lahko uporabljajo [Onnx Runtime](https://www.onnxruntime.ai/). To možnost bomo raziskali v prihodnji lekciji za model, treniran s Scikit-learn. + - **Uporaba Lobe.ai ali Azure Custom Vision.** Če uporabljate sistem ML SaaS (Software as a Service), kot sta [Lobe.ai](https://lobe.ai/) ali [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) za treniranje modela, ta vrsta programske opreme omogoča načine za izvoz modela za številne platforme, vključno z gradnjo prilagojenega API-ja, ki ga vaša spletna aplikacija lahko poizveduje v oblaku. + +Imate tudi možnost zgraditi celotno spletno aplikacijo Flask, ki bi lahko trenirala model kar v spletnem brskalniku. To je mogoče storiti tudi z uporabo TensorFlow.js v kontekstu JavaScript. + +Za naše namene, ker smo delali z beležkami, ki temeljijo na Pythonu, raziščimo korake, ki jih morate narediti, da izvozite treniran model iz takšne beležke v format, ki ga lahko bere spletna aplikacija, zgrajena v Pythonu. + +## Orodje + +Za to nalogo potrebujete dve orodji: Flask in Pickle, oba delujeta na Pythonu. + +✅ Kaj je [Flask](https://palletsprojects.com/p/flask/)? Flask, opisan kot 'mikro-okvir' s strani njegovih ustvarjalcev, ponuja osnovne funkcije spletnih okvirov z uporabo Pythona in predloge za gradnjo spletnih strani. Oglejte si [ta modul za učenje](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott), da vadite gradnjo s Flask. + +✅ Kaj je [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 je Python modul, ki serializira in de-serializira strukturo Python objektov. Ko 'shranite' model, serializirate ali sploščite njegovo strukturo za uporabo na spletu. Bodite previdni: pickle ni sam po sebi varen, zato bodite previdni, če vas pozove k 'odshranjevanju' datoteke. Shranjena datoteka ima pripono `.pkl`. + +## Naloga - očistite svoje podatke + +V tej lekciji boste uporabili podatke iz 80.000 opazovanj NLP-jev, zbranih s strani [NUFORC](https://nuforc.org) (Nacionalni center za poročanje o NLP-jih). Ti podatki vsebujejo zanimive opise opazovanj NLP-jev, na primer: + +- **Dolgi opis primera.** "Moški se pojavi iz svetlobnega žarka, ki sveti na travnato polje ponoči, in teče proti parkirišču Texas Instruments." +- **Kratki opis primera.** "luči so nas lovile." + +Preglednica [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) vključuje stolpce o `mestu`, `državi` in `državi`, kjer se je opazovanje zgodilo, obliki objekta (`shape`) ter njegovi `zemljepisni širini` in `zemljepisni dolžini`. + +V prazni [beležki](../../../../3-Web-App/1-Web-App/notebook.ipynb), ki je vključena v to lekcijo: + +1. uvozite `pandas`, `matplotlib` in `numpy`, kot ste to storili v prejšnjih lekcijah, ter uvozite preglednico NLP-jev. Lahko si ogledate vzorčni podatkovni nabor: + + ```python + import pandas as pd + import numpy as np + + ufos = pd.read_csv('./data/ufos.csv') + ufos.head() + ``` + +1. Pretvorite podatke NLP-jev v majhen podatkovni okvir z novimi naslovi. Preverite unikatne vrednosti v polju `Country`. + + ```python + ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) + + ufos.Country.unique() + ``` + +1. Zdaj lahko zmanjšate količino podatkov, s katerimi se morate ukvarjati, tako da odstranite vse vrednosti null in uvozite samo opazovanja med 1-60 sekundami: + + ```python + ufos.dropna(inplace=True) + + ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] + + ufos.info() + ``` + +1. Uvozite knjižnico Scikit-learn `LabelEncoder`, da pretvorite besedilne vrednosti za države v številke: + + ✅ LabelEncoder kodira podatke po abecedi + + ```python + from sklearn.preprocessing import LabelEncoder + + ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) + + ufos.head() + ``` + + Vaši podatki bi morali izgledati takole: + + ```output + Seconds Country Latitude Longitude + 2 20.0 3 53.200000 -2.916667 + 3 20.0 4 28.978333 -96.645833 + 14 30.0 4 35.823889 -80.253611 + 23 60.0 4 45.582778 -122.352222 + 24 3.0 3 51.783333 -0.783333 + ``` + +## Naloga - zgradite svoj model + +Zdaj se lahko pripravite na treniranje modela tako, da podatke razdelite v skupino za treniranje in testiranje. + +1. Izberite tri značilnosti, na katerih želite trenirati, kot vaš X vektor, medtem ko bo y vektor `Country`. Želite vnesti `Seconds`, `Latitude` in `Longitude` ter dobiti ID države kot rezultat. + + ```python + from sklearn.model_selection import train_test_split + + Selected_features = ['Seconds','Latitude','Longitude'] + + X = ufos[Selected_features] + y = ufos['Country'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + ``` + +1. Trenirajte svoj model z uporabo logistične regresije: + + ```python + from sklearn.metrics import accuracy_score, classification_report + from sklearn.linear_model import LogisticRegression + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('Accuracy: ', accuracy_score(y_test, predictions)) + ``` + +Natančnost ni slaba **(približno 95%)**, kar ni presenetljivo, saj se `Country` in `Latitude/Longitude` korelirata. + +Model, ki ste ga ustvarili, ni zelo revolucionaren, saj bi morali biti sposobni sklepati `Country` iz njegovih `Latitude` in `Longitude`, vendar je to dobra vaja za treniranje iz surovih podatkov, ki ste jih očistili, izvozili in nato uporabili ta model v spletni aplikaciji. + +## Naloga - 'shranite' svoj model + +Zdaj je čas, da _shranite_ svoj model! To lahko storite v nekaj vrsticah kode. Ko je _shranjen_, naložite shranjeni model in ga preizkusite na vzorčnem podatkovnem nizu, ki vsebuje vrednosti za sekunde, zemljepisno širino in dolžino. + +```python +import pickle +model_filename = 'ufo-model.pkl' +pickle.dump(model, open(model_filename,'wb')) + +model = pickle.load(open('ufo-model.pkl','rb')) +print(model.predict([[50,44,-12]])) +``` + +Model vrne **'3'**, kar je koda države za Združeno kraljestvo. Neverjetno! 👽 + +## Naloga - zgradite aplikacijo Flask + +Zdaj lahko zgradite aplikacijo Flask, ki bo klicala vaš model in vračala podobne rezultate, vendar na bolj vizualno privlačen način. + +1. Začnite z ustvarjanjem mape **web-app** poleg datoteke _notebook.ipynb_, kjer se nahaja vaša datoteka _ufo-model.pkl_. + +1. V tej mapi ustvarite še tri mape: **static**, z mapo **css** znotraj nje, in **templates**. Zdaj bi morali imeti naslednje datoteke in direktorije: + + ```output + web-app/ + static/ + css/ + templates/ + notebook.ipynb + ufo-model.pkl + ``` + + ✅ Oglejte si mapo z rešitvami za pogled na končano aplikacijo + +1. Prva datoteka, ki jo ustvarite v mapi _web-app_, je datoteka **requirements.txt**. Kot _package.json_ v aplikaciji JavaScript, ta datoteka navaja odvisnosti, ki jih aplikacija potrebuje. V **requirements.txt** dodajte vrstice: + + ```text + scikit-learn + pandas + numpy + flask + ``` + +1. Zdaj zaženite to datoteko tako, da se premaknete v _web-app_: + + ```bash + cd web-app + ``` + +1. V terminalu vnesite `pip install`, da namestite knjižnice, navedene v _requirements.txt_: + + ```bash + pip install -r requirements.txt + ``` + +1. Zdaj ste pripravljeni ustvariti še tri datoteke za dokončanje aplikacije: + + 1. Ustvarite **app.py** v korenu. + 2. Ustvarite **index.html** v mapi _templates_. + 3. Ustvarite **styles.css** v mapi _static/css_. + +1. Izdelajte datoteko _styles.css_ z nekaj slogi: + + ```css + body { + width: 100%; + height: 100%; + font-family: 'Helvetica'; + background: black; + color: #fff; + text-align: center; + letter-spacing: 1.4px; + font-size: 30px; + } + + input { + min-width: 150px; + } + + .grid { + width: 300px; + border: 1px solid #2d2d2d; + display: grid; + justify-content: center; + margin: 20px auto; + } + + .box { + color: #fff; + background: #2d2d2d; + padding: 12px; + display: inline-block; + } + ``` + +1. Nato izdelajte datoteko _index.html_: + + ```html + + + + + 🛸 UFO Appearance Prediction! 👽 + + + + +
                      + +
                      + +

                      According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?

                      + +
                      + + + + +
                      + +

                      {{ prediction_text }}

                      + +
                      + +
                      + + + + ``` + + Oglejte si predloge v tej datoteki. Opazite sintakso 'mustache' okoli spremenljivk, ki jih bo zagotovila aplikacija, kot je besedilo napovedi: `{{}}`. Obstaja tudi obrazec, ki pošlje napoved na pot `/predict`. + + Končno ste pripravljeni zgraditi Python datoteko, ki upravlja porabo modela in prikaz napovedi: + +1. V `app.py` dodajte: + + ```python + import numpy as np + from flask import Flask, request, render_template + import pickle + + app = Flask(__name__) + + model = pickle.load(open("./ufo-model.pkl", "rb")) + + + @app.route("/") + def home(): + return render_template("index.html") + + + @app.route("/predict", methods=["POST"]) + def predict(): + + int_features = [int(x) for x in request.form.values()] + final_features = [np.array(int_features)] + prediction = model.predict(final_features) + + output = prediction[0] + + countries = ["Australia", "Canada", "Germany", "UK", "US"] + + return render_template( + "index.html", prediction_text="Likely country: {}".format(countries[output]) + ) + + + if __name__ == "__main__": + app.run(debug=True) + ``` + + > 💡 Nasvet: ko dodate [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) med zagonom spletne aplikacije z uporabo Flask, bodo vse spremembe, ki jih naredite v svoji aplikaciji, takoj vidne brez potrebe po ponovnem zagonu strežnika. Pazite! Ne omogočite tega načina v produkcijski aplikaciji. + +Če zaženete `python app.py` ali `python3 app.py` - vaš spletni strežnik se zažene lokalno in lahko izpolnite kratek obrazec, da dobite odgovor na svoje pereče vprašanje o tem, kje so bili NLP-ji opaženi! + +Preden to storite, si oglejte dele `app.py`: + +1. Najprej se naložijo odvisnosti in aplikacija se zažene. +1. Nato se model uvozi. +1. Nato se na domači poti prikaže index.html. + +Na poti `/predict` se zgodi več stvari, ko je obrazec poslan: + +1. Spremenljivke obrazca se zberejo in pretvorijo v numpy array. Nato se pošljejo modelu in vrne se napoved. +2. Države, ki jih želimo prikazati, se ponovno prikažejo kot berljivo besedilo iz njihove predvidene kode države, in ta vrednost se pošlje nazaj v index.html, da se prikaže v predlogi. + +Uporaba modela na ta način, z Flask in shranjenim modelom, je razmeroma preprosta. Najtežje je razumeti, kakšne oblike morajo biti podatki, ki jih je treba poslati modelu, da dobite napoved. To je odvisno od tega, kako je bil model treniran. Ta model zahteva tri podatkovne točke za vnos, da vrne napoved. + +V profesionalnem okolju lahko vidite, kako pomembna je dobra komunikacija med ljudmi, ki trenirajo model, in tistimi, ki ga uporabljajo v spletni ali mobilni aplikaciji. V našem primeru ste to le vi! + +--- + +## 🚀 Izziv + +Namesto da delate v beležki in uvozite model v aplikacijo Flask, bi lahko model trenirali kar znotraj aplikacije Flask! Poskusite pretvoriti svojo Python kodo v beležki, morda po tem, ko so vaši podatki očiščeni, da trenirate model znotraj aplikacije na poti, imenovani `train`. Kakšne so prednosti in slabosti tega pristopa? + +## [Po-lekcijski kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Obstaja veliko načinov za gradnjo spletne aplikacije, ki uporablja modele strojnega učenja. Naredite seznam načinov, kako bi lahko uporabili JavaScript ali Python za gradnjo spletne aplikacije, ki izkorišča strojno učenje. Razmislite o arhitekturi: naj model ostane v aplikaciji ali naj živi v oblaku? Če slednje, kako bi dostopali do njega? Narišite arhitekturni model za rešitev spletne aplikacije z uporabo strojnega učenja. + +## Naloga + +[Preizkusite drugačen model](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/3-Web-App/1-Web-App/assignment.md b/translations/sl/3-Web-App/1-Web-App/assignment.md new file mode 100644 index 00000000..e73f985f --- /dev/null +++ b/translations/sl/3-Web-App/1-Web-App/assignment.md @@ -0,0 +1,25 @@ + +# Poskusite drugačen model + +## Navodila + +Zdaj, ko ste izdelali eno spletno aplikacijo z uporabo treniranega regresijskega modela, uporabite enega od modelov iz prejšnje lekcije o regresiji, da ponovno ustvarite to spletno aplikacijo. Slog lahko ohranite ali ga oblikujete drugače, da odraža podatke o bučah. Bodite pozorni, da spremenite vhodne podatke, da bodo ustrezali metodi treniranja vašega modela. + +## Merila ocenjevanja + +| Merila | Odlično | Zadostno | Potrebne izboljšave | +| ------------------------ | --------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------- | +| | Spletna aplikacija deluje, kot je pričakovano, in je nameščena v oblaku | Spletna aplikacija vsebuje napake ali prikazuje nepričakovane rezultate | Spletna aplikacija ne deluje pravilno | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/3-Web-App/README.md b/translations/sl/3-Web-App/README.md new file mode 100644 index 00000000..3ca88b6f --- /dev/null +++ b/translations/sl/3-Web-App/README.md @@ -0,0 +1,35 @@ + +# Ustvarite spletno aplikacijo za uporabo vašega ML modela + +V tem delu učnega načrta boste spoznali praktično temo strojnega učenja: kako shraniti vaš Scikit-learn model kot datoteko, ki jo lahko uporabite za napovedi znotraj spletne aplikacije. Ko je model shranjen, se boste naučili, kako ga uporabiti v spletni aplikaciji, zgrajeni v Flasku. Najprej boste ustvarili model z uporabo podatkov, ki se nanašajo na opažanja NLP-jev! Nato boste zgradili spletno aplikacijo, ki vam bo omogočila vnos števila sekund skupaj z vrednostmi zemljepisne širine in dolžine za napoved, katera država je poročala o opažanju NLP-ja. + +![UFO Parking](../../../3-Web-App/images/ufo.jpg) + +Fotografija avtorja Michael Herren na Unsplash + +## Lekcije + +1. [Ustvarite spletno aplikacijo](1-Web-App/README.md) + +## Zasluge + +"Ustvarite spletno aplikacijo" je bilo napisano z ♥️ avtorice [Jen Looper](https://twitter.com/jenlooper). + +♥️ Kvize je napisal Rohan Raj. + +Podatkovni niz je pridobljen iz [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings). + +Arhitektura spletne aplikacije je bila delno predlagana v [tem članku](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) in [tem repozitoriju](https://github.com/abhinavsagar/machine-learning-deployment) avtorja Abhinav Sagar. + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/1-Introduction/README.md b/translations/sl/4-Classification/1-Introduction/README.md new file mode 100644 index 00000000..0d9352ab --- /dev/null +++ b/translations/sl/4-Classification/1-Introduction/README.md @@ -0,0 +1,313 @@ + +# Uvod v klasifikacijo + +V teh štirih lekcijah boste raziskovali eno temeljnih področij klasičnega strojnega učenja - _klasifikacijo_. Preučili bomo uporabo različnih algoritmov za klasifikacijo z uporabo nabora podatkov o vseh čudovitih azijskih in indijskih kuhinjah. Upam, da ste lačni! + +![samo ščepec!](../../../../4-Classification/1-Introduction/images/pinch.png) + +> Praznujte panazijske kuhinje v teh lekcijah! Slika: [Jen Looper](https://twitter.com/jenlooper) + +Klasifikacija je oblika [nadzorovanega učenja](https://wikipedia.org/wiki/Supervised_learning), ki ima veliko skupnega s tehnikami regresije. Če je strojno učenje namenjeno napovedovanju vrednosti ali imen stvari z uporabo naborov podatkov, potem klasifikacijo običajno delimo v dve skupini: _binarna klasifikacija_ in _večrazredna klasifikacija_. + +[![Uvod v klasifikacijo](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Uvod v klasifikacijo") + +> 🎥 Kliknite zgornjo sliko za video: MIT-jev John Guttag predstavlja klasifikacijo + +Zapomnite si: + +- **Linearna regresija** vam je pomagala napovedati odnose med spremenljivkami in natančno predvideti, kam bo padla nova podatkovna točka glede na to črto. Na primer, lahko ste napovedali _kakšna bo cena buče septembra v primerjavi z decembrom_. +- **Logistična regresija** vam je pomagala odkriti "binarne kategorije": pri tej ceni, _ali je ta buča oranžna ali ne-oranžna_? + +Klasifikacija uporablja različne algoritme za določanje drugih načinov ugotavljanja oznake ali razreda podatkovne točke. Delali bomo s temi podatki o kuhinjah, da ugotovimo, ali lahko na podlagi skupine sestavin določimo izvorno kuhinjo. + +## [Predlekcijski kviz](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ta lekcija je na voljo tudi v jeziku R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html) + +### Uvod + +Klasifikacija je ena temeljnih dejavnosti raziskovalcev strojnega učenja in podatkovnih znanstvenikov. Od osnovne klasifikacije binarne vrednosti ("ali je to e-poštno sporočilo vsiljena pošta ali ne?") do zapletene klasifikacije slik in segmentacije s pomočjo računalniškega vida, je vedno koristno znati razvrstiti podatke v razrede in jim zastaviti vprašanja. + +Če proces opišemo na bolj znanstven način, vaša metoda klasifikacije ustvari napovedni model, ki vam omogoča, da preslikate odnos med vhodnimi in izhodnimi spremenljivkami. + +![binarna vs. večrazredna klasifikacija](../../../../4-Classification/1-Introduction/images/binary-multiclass.png) + +> Binarni in večrazredni problemi za algoritme klasifikacije. Infografika: [Jen Looper](https://twitter.com/jenlooper) + +Preden začnemo s procesom čiščenja podatkov, njihove vizualizacije in priprave za naloge strojnega učenja, se naučimo nekaj več o različnih načinih, kako lahko strojno učenje uporabimo za klasifikacijo podatkov. + +Izpeljana iz [statistike](https://wikipedia.org/wiki/Statistical_classification), klasifikacija s klasičnim strojnim učenjem uporablja značilnosti, kot so `kadilec`, `teža` in `starost`, za določanje _verjetnosti razvoja določene bolezni_. Kot tehnika nadzorovanega učenja, podobna regresijskim vajam, ki ste jih izvajali prej, so vaši podatki označeni, algoritmi strojnega učenja pa te oznake uporabljajo za klasifikacijo in napovedovanje razredov (ali 'značilnosti') nabora podatkov ter njihovo dodelitev skupini ali izidu. + +✅ Vzemite si trenutek in si zamislite nabor podatkov o kuhinjah. Na katera vprašanja bi lahko odgovoril večrazredni model? Na katera vprašanja bi lahko odgovoril binarni model? Kaj če bi želeli ugotoviti, ali določena kuhinja uporablja sabljiko? Kaj če bi želeli preveriti, ali bi lahko iz vrečke zvezdastega janeža, artičok, cvetače in hrena pripravili tipično indijsko jed? + +[![Nore skrivnostne košare](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Nore skrivnostne košare") + +> 🎥 Kliknite zgornjo sliko za video. Celoten koncept oddaje 'Chopped' temelji na 'skrivnostni košari', kjer morajo kuharji iz naključnih sestavin pripraviti jed. Zagotovo bi jim model strojnega učenja pomagal! + +## Pozdravljen 'klasifikator' + +Vprašanje, ki si ga želimo zastaviti o tem naboru podatkov o kuhinjah, je pravzaprav **večrazredno vprašanje**, saj imamo na voljo več potencialnih nacionalnih kuhinj. Glede na skupino sestavin, v kateri od teh številnih razredov bodo podatki ustrezali? + +Scikit-learn ponuja več različnih algoritmov za klasifikacijo podatkov, odvisno od vrste problema, ki ga želite rešiti. V naslednjih dveh lekcijah se boste naučili več o teh algoritmih. + +## Vaja - očistite in uravnotežite svoje podatke + +Prva naloga, preden začnemo s tem projektom, je očistiti in **uravnotežiti** podatke za boljše rezultate. Začnite z prazno datoteko _notebook.ipynb_ v korenski mapi te mape. + +Prva stvar, ki jo morate namestiti, je [imblearn](https://imbalanced-learn.org/stable/). To je paket Scikit-learn, ki vam bo omogočil boljše uravnoteženje podatkov (več o tej nalogi boste izvedeli v nadaljevanju). + +1. Za namestitev `imblearn` zaženite `pip install`, kot sledi: + + ```python + pip install imblearn + ``` + +1. Uvozite pakete, ki jih potrebujete za uvoz in vizualizacijo podatkov, prav tako uvozite `SMOTE` iz `imblearn`. + + ```python + import pandas as pd + import matplotlib.pyplot as plt + import matplotlib as mpl + import numpy as np + from imblearn.over_sampling import SMOTE + ``` + + Zdaj ste pripravljeni na uvoz podatkov. + +1. Naslednja naloga je uvoz podatkov: + + ```python + df = pd.read_csv('../data/cuisines.csv') + ``` + + Z uporabo `read_csv()` boste prebrali vsebino csv datoteke _cusines.csv_ in jo shranili v spremenljivko `df`. + +1. Preverite obliko podatkov: + + ```python + df.head() + ``` + + Prvih pet vrstic izgleda takole: + + ```output + | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | + | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | + | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + ``` + +1. Pridobite informacije o teh podatkih z uporabo `info()`: + + ```python + df.info() + ``` + + Vaš izpis je podoben: + + ```output + + RangeIndex: 2448 entries, 0 to 2447 + Columns: 385 entries, Unnamed: 0 to zucchini + dtypes: int64(384), object(1) + memory usage: 7.2+ MB + ``` + +## Vaja - spoznavanje kuhinj + +Zdaj postane delo bolj zanimivo. Odkrijmo porazdelitev podatkov po kuhinjah. + +1. Prikaz podatkov kot stolpce z uporabo `barh()`: + + ```python + df.cuisine.value_counts().plot.barh() + ``` + + ![porazdelitev podatkov o kuhinjah](../../../../4-Classification/1-Introduction/images/cuisine-dist.png) + + Število kuhinj je omejeno, vendar je porazdelitev podatkov neenakomerna. To lahko popravite! Preden to storite, raziščite še malo. + +1. Ugotovite, koliko podatkov je na voljo za vsako kuhinjo, in jih izpišite: + + ```python + thai_df = df[(df.cuisine == "thai")] + japanese_df = df[(df.cuisine == "japanese")] + chinese_df = df[(df.cuisine == "chinese")] + indian_df = df[(df.cuisine == "indian")] + korean_df = df[(df.cuisine == "korean")] + + print(f'thai df: {thai_df.shape}') + print(f'japanese df: {japanese_df.shape}') + print(f'chinese df: {chinese_df.shape}') + print(f'indian df: {indian_df.shape}') + print(f'korean df: {korean_df.shape}') + ``` + + Izpis izgleda takole: + + ```output + thai df: (289, 385) + japanese df: (320, 385) + chinese df: (442, 385) + indian df: (598, 385) + korean df: (799, 385) + ``` + +## Odkrijte sestavine + +Zdaj lahko globlje raziščete podatke in ugotovite, katere so tipične sestavine za posamezno kuhinjo. Odstraniti morate ponavljajoče se podatke, ki povzročajo zmedo med kuhinjami, zato se lotimo tega problema. + +1. Ustvarite funkcijo `create_ingredient()` v Pythonu za ustvarjanje podatkovnega okvira sestavin. Ta funkcija bo začela z odstranitvijo neuporabnega stolpca in razvrstila sestavine po njihovem številu: + + ```python + def create_ingredient_df(df): + ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') + ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] + ingredient_df = ingredient_df.sort_values(by='value', ascending=False, + inplace=False) + return ingredient_df + ``` + + Zdaj lahko uporabite to funkcijo, da dobite idejo o desetih najbolj priljubljenih sestavinah po kuhinji. + +1. Pokličite `create_ingredient()` in jo prikažite z uporabo `barh()`: + + ```python + thai_ingredient_df = create_ingredient_df(thai_df) + thai_ingredient_df.head(10).plot.barh() + ``` + + ![tajska](../../../../4-Classification/1-Introduction/images/thai.png) + +1. Enako storite za japonske podatke: + + ```python + japanese_ingredient_df = create_ingredient_df(japanese_df) + japanese_ingredient_df.head(10).plot.barh() + ``` + + ![japonska](../../../../4-Classification/1-Introduction/images/japanese.png) + +1. Zdaj za kitajske sestavine: + + ```python + chinese_ingredient_df = create_ingredient_df(chinese_df) + chinese_ingredient_df.head(10).plot.barh() + ``` + + ![kitajska](../../../../4-Classification/1-Introduction/images/chinese.png) + +1. Prikažite indijske sestavine: + + ```python + indian_ingredient_df = create_ingredient_df(indian_df) + indian_ingredient_df.head(10).plot.barh() + ``` + + ![indijska](../../../../4-Classification/1-Introduction/images/indian.png) + +1. Na koncu prikažite korejske sestavine: + + ```python + korean_ingredient_df = create_ingredient_df(korean_df) + korean_ingredient_df.head(10).plot.barh() + ``` + + ![korejska](../../../../4-Classification/1-Introduction/images/korean.png) + +1. Zdaj odstranite najpogostejše sestavine, ki povzročajo zmedo med različnimi kuhinjami, z uporabo `drop()`: + + Vsi imajo radi riž, česen in ingver! + + ```python + feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) + labels_df = df.cuisine #.unique() + feature_df.head() + ``` + +## Uravnotežite nabor podatkov + +Zdaj, ko ste očistili podatke, uporabite [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Synthetic Minority Over-sampling Technique" - za njihovo uravnoteženje. + +1. Pokličite `fit_resample()`, ta strategija ustvari nove vzorce z interpolacijo. + + ```python + oversample = SMOTE() + transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df) + ``` + + Z uravnoteženjem podatkov boste dosegli boljše rezultate pri klasifikaciji. Pomislite na binarno klasifikacijo. Če je večina vaših podatkov enega razreda, bo model strojnega učenja ta razred pogosteje napovedal, zgolj zato, ker je zanj več podatkov. Uravnoteženje podatkov odstrani to neravnovesje. + +1. Zdaj lahko preverite število oznak na sestavino: + + ```python + print(f'new label count: {transformed_label_df.value_counts()}') + print(f'old label count: {df.cuisine.value_counts()}') + ``` + + Vaš izpis izgleda takole: + + ```output + new label count: korean 799 + chinese 799 + indian 799 + japanese 799 + thai 799 + Name: cuisine, dtype: int64 + old label count: korean 799 + indian 598 + chinese 442 + japanese 320 + thai 289 + Name: cuisine, dtype: int64 + ``` + + Podatki so zdaj čisti, uravnoteženi in zelo okusni! + +1. Zadnji korak je shranjevanje uravnoteženih podatkov, vključno z oznakami in značilnostmi, v nov podatkovni okvir, ki ga lahko izvozite v datoteko: + + ```python + transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer') + ``` + +1. Še enkrat si oglejte podatke z uporabo `transformed_df.head()` in `transformed_df.info()`. Shranite kopijo teh podatkov za uporabo v prihodnjih lekcijah: + + ```python + transformed_df.head() + transformed_df.info() + transformed_df.to_csv("../data/cleaned_cuisines.csv") + ``` + + Ta svež CSV je zdaj na voljo v korenski mapi podatkov. + +--- + +## 🚀Izziv + +Ta učni načrt vsebuje več zanimivih naborov podatkov. Prebrskajte mape `data` in preverite, ali katera vsebuje nabore podatkov, ki bi bili primerni za binarno ali večrazredno klasifikacijo? Na katera vprašanja bi lahko odgovorili s tem naborom podatkov? + +## [Po-lekcijski kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Raziščite API za SMOTE. Za katere primere uporabe je najbolj primeren? Katere težave rešuje? + +## Naloga + +[Raziščite metode klasifikacije](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/1-Introduction/assignment.md b/translations/sl/4-Classification/1-Introduction/assignment.md new file mode 100644 index 00000000..ce64f928 --- /dev/null +++ b/translations/sl/4-Classification/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Raziskovanje metod klasifikacije + +## Navodila + +V [dokumentaciji Scikit-learn](https://scikit-learn.org/stable/supervised_learning.html) boste našli obsežen seznam načinov za klasifikacijo podatkov. Opravite majhno raziskovanje v teh dokumentih: vaš cilj je poiskati metode klasifikacije in jih povezati z naborom podatkov iz tega učnega načrta, vprašanjem, ki ga lahko zastavite, ter tehniko klasifikacije. Ustvarite preglednico ali tabelo v .doc datoteki in pojasnite, kako bi nabor podatkov deloval z algoritmom klasifikacije. + +## Merila ocenjevanja + +| Merila | Odlično | Zadostno | Potrebna izboljšava | +| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| | Predstavljen je dokument, ki zajema pregled 5 algoritmov skupaj s tehniko klasifikacije. Pregled je dobro razložen in podroben. | Predstavljen je dokument, ki zajema pregled 3 algoritmov skupaj s tehniko klasifikacije. Pregled je dobro razložen in podroben. | Predstavljen je dokument, ki zajema pregled manj kot treh algoritmov skupaj s tehniko klasifikacije, pregled pa ni dobro razložen ali podroben. | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/1-Introduction/solution/Julia/README.md b/translations/sl/4-Classification/1-Introduction/solution/Julia/README.md new file mode 100644 index 00000000..cb73e280 --- /dev/null +++ b/translations/sl/4-Classification/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto za izpolnitev + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/2-Classifiers-1/README.md b/translations/sl/4-Classification/2-Classifiers-1/README.md new file mode 100644 index 00000000..8915e216 --- /dev/null +++ b/translations/sl/4-Classification/2-Classifiers-1/README.md @@ -0,0 +1,253 @@ + +# Razvrščevalniki kuhinj 1 + +V tej lekciji boste uporabili podatkovni niz, ki ste ga shranili v prejšnji lekciji, poln uravnoteženih in čistih podatkov o kuhinjah. + +Ta podatkovni niz boste uporabili z različnimi razvrščevalniki, da _napoveste določeno nacionalno kuhinjo na podlagi skupine sestavin_. Med tem boste spoznali več o tem, kako lahko algoritme uporabimo za naloge razvrščanja. + +## [Predlekcijski kviz](https://ff-quizzes.netlify.app/en/ml/) +# Priprava + +Če ste zaključili [Lekcijo 1](../1-Introduction/README.md), preverite, ali datoteka _cleaned_cuisines.csv_ obstaja v korenskem imeniku `/data` za te štiri lekcije. + +## Vaja - napoved nacionalne kuhinje + +1. V mapi _notebook.ipynb_ te lekcije uvozite to datoteko skupaj s knjižnico Pandas: + + ```python + import pandas as pd + cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") + cuisines_df.head() + ``` + + Podatki izgledajo takole: + +| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | +| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + + +1. Zdaj uvozite še nekaj knjižnic: + + ```python + from sklearn.linear_model import LogisticRegression + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + from sklearn.svm import SVC + import numpy as np + ``` + +1. Razdelite koordinate X in y v dva podatkovna okvira za učenje. `cuisine` lahko uporabite kot podatkovni okvir z oznakami: + + ```python + cuisines_label_df = cuisines_df['cuisine'] + cuisines_label_df.head() + ``` + + Videti bo takole: + + ```output + 0 indian + 1 indian + 2 indian + 3 indian + 4 indian + Name: cuisine, dtype: object + ``` + +1. Odstranite stolpca `Unnamed: 0` in `cuisine` z uporabo funkcije `drop()`. Preostale podatke shranite kot značilnosti za učenje: + + ```python + cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) + cuisines_feature_df.head() + ``` + + Vaše značilnosti izgledajo takole: + +| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | + +Zdaj ste pripravljeni na učenje modela! + +## Izbira razvrščevalnika + +Zdaj, ko so vaši podatki čisti in pripravljeni za učenje, morate izbrati algoritem za nalogo. + +Scikit-learn razvršča razvrščanje pod Nadzorovano učenje, v tej kategoriji pa najdete veliko načinov za razvrščanje. [Raznolikost](https://scikit-learn.org/stable/supervised_learning.html) je na prvi pogled precej osupljiva. Naslednje metode vključujejo tehnike razvrščanja: + +- Linearni modeli +- Podporni vektorski stroji +- Stohastični gradientni spust +- Najbližji sosedje +- Gaussovi procesi +- Odločitvena drevesa +- Metode ansambla (glasovalni razvrščevalnik) +- Večrazredni in večizhodni algoritmi (večrazredna in večoznačna razvrstitev, večrazredna-večizhodna razvrstitev) + +> Za razvrščanje podatkov lahko uporabite tudi [nevronske mreže](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification), vendar to presega obseg te lekcije. + +### Kateri razvrščevalnik izbrati? + +Torej, kateri razvrščevalnik izbrati? Pogosto je smiselno preizkusiti več razvrščevalnikov in iskati najboljši rezultat. Scikit-learn ponuja [primerjavo](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) na ustvarjenem podatkovnem nizu, kjer primerja KNeighbors, SVC na dva načina, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB in QuadraticDiscriminationAnalysis, pri čemer so rezultati vizualizirani: + +![primerjava razvrščevalnikov](../../../../4-Classification/2-Classifiers-1/images/comparison.png) +> Grafi, ustvarjeni v dokumentaciji Scikit-learn + +> AutoML to težavo elegantno reši tako, da te primerjave izvaja v oblaku, kar vam omogoča izbiro najboljšega algoritma za vaše podatke. Preizkusite ga [tukaj](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott) + +### Boljši pristop + +Boljši način kot naključno ugibanje je, da sledite idejam na tem prenosljivem [ML plonk listu](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott). Tukaj ugotovimo, da imamo za našo večrazredno težavo nekaj možnosti: + +![plonk list za večrazredne težave](../../../../4-Classification/2-Classifiers-1/images/cheatsheet.png) +> Del Microsoftovega plonk lista algoritmov, ki podrobno opisuje možnosti za večrazredno razvrščanje + +✅ Prenesite ta plonk list, natisnite ga in obesite na steno! + +### Razmišljanje + +Poglejmo, ali lahko z razmišljanjem izberemo različne pristope glede na omejitve, ki jih imamo: + +- **Nevronske mreže so pretežke**. Glede na naš čist, a minimalen podatkovni niz in dejstvo, da izvajamo učenje lokalno prek beležk, so nevronske mreže pretežke za to nalogo. +- **Ni razvrščevalnika za dva razreda**. Ne uporabljamo razvrščevalnika za dva razreda, zato izključimo one-vs-all. +- **Odločitveno drevo ali logistična regresija bi lahko delovala**. Odločitveno drevo bi lahko delovalo, prav tako logistična regresija za večrazredne podatke. +- **Večrazredna izboljšana odločitvena drevesa rešujejo drugačen problem**. Večrazredna izboljšana odločitvena drevesa so najbolj primerna za neparametrične naloge, npr. naloge za ustvarjanje razvrstitev, zato za nas niso uporabna. + +### Uporaba Scikit-learn + +Za analizo podatkov bomo uporabili Scikit-learn. Vendar pa obstaja veliko načinov za uporabo logistične regresije v Scikit-learn. Oglejte si [parametre za nastavitev](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +V bistvu sta dva pomembna parametra - `multi_class` in `solver` - ki ju moramo določiti, ko Scikit-learn prosimo za izvedbo logistične regresije. Vrednost `multi_class` določa določeno vedenje. Vrednost `solver` določa, kateri algoritem uporabiti. Vsi reševalci ne morejo biti združeni z vsemi vrednostmi `multi_class`. + +Po dokumentaciji, v primeru večrazredne naloge, algoritem za učenje: + +- **Uporablja shemo one-vs-rest (OvR)**, če je možnost `multi_class` nastavljena na `ovr` +- **Uporablja izgubo navzkrižne entropije**, če je možnost `multi_class` nastavljena na `multinomial`. (Trenutno možnost `multinomial` podpirajo samo reševalci ‘lbfgs’, ‘sag’, ‘saga’ in ‘newton-cg’.) + +> 🎓 'Shema' tukaj je lahko 'ovr' (one-vs-rest) ali 'multinomial'. Ker je logistična regresija zasnovana za podporo binarni razvrstitvi, ji te sheme omogočajo boljše obravnavanje večrazrednih nalog razvrščanja. [vir](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/) + +> 🎓 'Solver' je definiran kot "algoritem za uporabo pri optimizacijskem problemu". [vir](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +Scikit-learn ponuja to tabelo za razlago, kako reševalci obravnavajo različne izzive, ki jih predstavljajo različne vrste podatkovnih struktur: + +![reševalci](../../../../4-Classification/2-Classifiers-1/images/solvers.png) + +## Vaja - razdelitev podatkov + +Osredotočimo se na logistično regresijo za naš prvi poskus učenja, saj ste se o njej nedavno učili v prejšnji lekciji. +Razdelite svoje podatke v skupine za učenje in testiranje z uporabo funkcije `train_test_split()`: + +```python +X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) +``` + +## Vaja - uporaba logistične regresije + +Ker uporabljate večrazredno nalogo, morate izbrati, katero _shemo_ uporabiti in kateri _reševalec_ nastaviti. Uporabite LogisticRegression z večrazredno nastavitvijo in reševalcem **liblinear** za učenje. + +1. Ustvarite logistično regresijo z `multi_class` nastavljeno na `ovr` in reševalcem nastavljenim na `liblinear`: + + ```python + lr = LogisticRegression(multi_class='ovr',solver='liblinear') + model = lr.fit(X_train, np.ravel(y_train)) + + accuracy = model.score(X_test, y_test) + print ("Accuracy is {}".format(accuracy)) + ``` + + ✅ Preizkusite drugega reševalca, kot je `lbfgs`, ki je pogosto nastavljen kot privzet. +> Upoštevajte, uporabite funkcijo Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) za sploščitev vaših podatkov, kadar je to potrebno. +Natančnost je dobra pri več kot **80%**! + +1. Ta model lahko preizkusite z eno vrstico podatkov (#50): + + ```python + print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') + print(f'cuisine: {y_test.iloc[50]}') + ``` + + Rezultat se izpiše: + + ```output + ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') + cuisine: indian + ``` + + ✅ Poskusite z drugo številko vrstice in preverite rezultate. + +1. Če želite podrobneje raziskati, lahko preverite natančnost te napovedi: + + ```python + test= X_test.iloc[50].values.reshape(-1, 1).T + proba = model.predict_proba(test) + classes = model.classes_ + resultdf = pd.DataFrame(data=proba, columns=classes) + + topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) + topPrediction.head() + ``` + + Rezultat se izpiše - indijska kuhinja je najboljša ugotovitev z dobro verjetnostjo: + + | | 0 | + | -------: | -------: | + | indian | 0.715851 | + | chinese | 0.229475 | + | japanese | 0.029763 | + | korean | 0.017277 | + | thai | 0.007634 | + + ✅ Ali lahko razložite, zakaj je model precej prepričan, da gre za indijsko kuhinjo? + +1. Pridobite več podrobnosti z izpisom poročila o klasifikaciji, kot ste to storili pri lekcijah o regresiji: + + ```python + y_pred = model.predict(X_test) + print(classification_report(y_test,y_pred)) + ``` + + | | precision | recall | f1-score | support | + | ------------ | --------- | ------ | -------- | ------- | + | chinese | 0.73 | 0.71 | 0.72 | 229 | + | indian | 0.91 | 0.93 | 0.92 | 254 | + | japanese | 0.70 | 0.75 | 0.72 | 220 | + | korean | 0.86 | 0.76 | 0.81 | 242 | + | thai | 0.79 | 0.85 | 0.82 | 254 | + | accuracy | 0.80 | 1199 | | | + | macro avg | 0.80 | 0.80 | 0.80 | 1199 | + | weighted avg | 0.80 | 0.80 | 0.80 | 1199 | + +## 🚀Izziv + +V tej lekciji ste uporabili očiščene podatke za izdelavo modela strojnega učenja, ki lahko napove nacionalno kuhinjo na podlagi serije sestavin. Vzemite si čas in preberite številne možnosti, ki jih Scikit-learn ponuja za klasifikacijo podatkov. Podrobneje raziščite koncept 'solverja', da boste razumeli, kaj se dogaja v ozadju. + +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled & Samostojno učenje + +Podrobneje raziščite matematiko za logistično regresijo v [tej lekciji](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf) +## Naloga + +[Preučite solverje](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/2-Classifiers-1/assignment.md b/translations/sl/4-Classification/2-Classifiers-1/assignment.md new file mode 100644 index 00000000..6fbd955b --- /dev/null +++ b/translations/sl/4-Classification/2-Classifiers-1/assignment.md @@ -0,0 +1,23 @@ + +# Preučite reševalnike +## Navodila + +V tej lekciji ste spoznali različne reševalnike, ki združujejo algoritme s procesom strojnega učenja za ustvarjanje natančnega modela. Preglejte reševalnike, navedene v lekciji, in izberite dva. S svojimi besedami primerjajte in primerjajte ta dva reševalnika. Kakšno vrsto problema rešujeta? Kako delujeta z različnimi podatkovnimi strukturami? Zakaj bi izbrali enega namesto drugega? +## Merila + +| Merila | Izjemno | Zadostno | Potrebne izboljšave | +| -------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------- | +| | Predstavljen je .doc dokument z dvema odstavkoma, vsak o enem reševalniku, s premišljenimi primerjavami. | Predstavljen je .doc dokument z enim odstavkom | Naloga je nepopolna | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas opozarjamo, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/2-Classifiers-1/solution/Julia/README.md b/translations/sl/4-Classification/2-Classifiers-1/solution/Julia/README.md new file mode 100644 index 00000000..402d7838 --- /dev/null +++ b/translations/sl/4-Classification/2-Classifiers-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto za izpolnitev + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/3-Classifiers-2/README.md b/translations/sl/4-Classification/3-Classifiers-2/README.md new file mode 100644 index 00000000..a78d428a --- /dev/null +++ b/translations/sl/4-Classification/3-Classifiers-2/README.md @@ -0,0 +1,249 @@ + +# Razvrščevalniki kuhinj 2 + +V tej drugi lekciji o razvrščanju boste raziskali več načinov za razvrščanje numeričnih podatkov. Prav tako boste spoznali posledice izbire enega razvrščevalnika namesto drugega. + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +### Predpogoji + +Predvidevamo, da ste zaključili prejšnje lekcije in imate očiščen nabor podatkov v svoji mapi `data`, imenovan _cleaned_cuisines.csv_, ki se nahaja v korenski mapi tega 4-lekcijskega sklopa. + +### Priprava + +Vaša datoteka _notebook.ipynb_ je bila naložena z očiščenim naborom podatkov, ki je razdeljen na podatkovna okvira X in y, pripravljena za proces gradnje modela. + +## Zemljevid razvrščanja + +Prej ste se naučili o različnih možnostih razvrščanja podatkov z uporabo Microsoftovega priročnika. Scikit-learn ponuja podoben, vendar bolj podroben priročnik, ki vam lahko dodatno pomaga zožiti izbiro ocenjevalnikov (drugi izraz za razvrščevalnike): + +![ML Zemljevid iz Scikit-learn](../../../../4-Classification/3-Classifiers-2/images/map.png) +> Nasvet: [obiskujte ta zemljevid na spletu](https://scikit-learn.org/stable/tutorial/machine_learning_map/) in kliknite po poti za branje dokumentacije. + +### Načrt + +Ta zemljevid je zelo koristen, ko imate jasno predstavo o svojih podatkih, saj lahko 'hodite' po njegovih poteh do odločitve: + +- Imamo >50 vzorcev +- Želimo napovedati kategorijo +- Imamo označene podatke +- Imamo manj kot 100K vzorcev +- ✨ Lahko izberemo Linear SVC +- Če to ne deluje, ker imamo numerične podatke + - Lahko poskusimo ✨ KNeighbors Classifier + - Če to ne deluje, poskusimo ✨ SVC in ✨ Ensemble Classifiers + +To je zelo koristna pot za sledenje. + +## Naloga - razdelite podatke + +Sledimo tej poti in začnemo z uvozom nekaterih knjižnic za uporabo. + +1. Uvozite potrebne knjižnice: + + ```python + from sklearn.neighbors import KNeighborsClassifier + from sklearn.linear_model import LogisticRegression + from sklearn.svm import SVC + from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + import numpy as np + ``` + +1. Razdelite svoje podatke na trening in test: + + ```python + X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) + ``` + +## Linearni SVC razvrščevalnik + +Support-Vector clustering (SVC) je del družine tehnik strojnega učenja Support-Vector Machines (več o tem spodaj). Pri tej metodi lahko izberete 'jedro' za odločanje, kako razvrstiti oznake. Parameter 'C' se nanaša na 'regularizacijo', ki uravnava vpliv parametrov. Jedro je lahko eno izmed [več možnosti](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); tukaj ga nastavimo na 'linearno', da zagotovimo uporabo linearnega SVC. Privzeta vrednost za verjetnost je 'false'; tukaj jo nastavimo na 'true', da pridobimo ocene verjetnosti. Naključno stanje nastavimo na '0', da premešamo podatke za pridobitev verjetnosti. + +### Naloga - uporabite linearni SVC + +Začnite z ustvarjanjem matrike razvrščevalnikov. Postopoma boste dodajali tej matriki, ko bomo testirali. + +1. Začnite z Linearnim SVC: + + ```python + C = 10 + # Create different classifiers. + classifiers = { + 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0) + } + ``` + +2. Natrenirajte svoj model z Linearnim SVC in natisnite poročilo: + + ```python + n_classifiers = len(classifiers) + + for index, (name, classifier) in enumerate(classifiers.items()): + classifier.fit(X_train, np.ravel(y_train)) + + y_pred = classifier.predict(X_test) + accuracy = accuracy_score(y_test, y_pred) + print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100)) + print(classification_report(y_test,y_pred)) + ``` + + Rezultat je precej dober: + + ```output + Accuracy (train) for Linear SVC: 78.6% + precision recall f1-score support + + chinese 0.71 0.67 0.69 242 + indian 0.88 0.86 0.87 234 + japanese 0.79 0.74 0.76 254 + korean 0.85 0.81 0.83 242 + thai 0.71 0.86 0.78 227 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +## K-Neighbors razvrščevalnik + +K-Neighbors je del družine metod strojnega učenja "neighbors", ki se lahko uporablja za nadzorovano in nenadzorovano učenje. Pri tej metodi se ustvari vnaprej določeno število točk, okoli katerih se zbirajo podatki, da se lahko za podatke napovejo posplošene oznake. + +### Naloga - uporabite K-Neighbors razvrščevalnik + +Prejšnji razvrščevalnik je bil dober in je dobro deloval s podatki, vendar morda lahko dosežemo boljšo natančnost. Poskusite K-Neighbors razvrščevalnik. + +1. Dodajte vrstico v svojo matriko razvrščevalnikov (dodajte vejico za element Linear SVC): + + ```python + 'KNN classifier': KNeighborsClassifier(C), + ``` + + Rezultat je nekoliko slabši: + + ```output + Accuracy (train) for KNN classifier: 73.8% + precision recall f1-score support + + chinese 0.64 0.67 0.66 242 + indian 0.86 0.78 0.82 234 + japanese 0.66 0.83 0.74 254 + korean 0.94 0.58 0.72 242 + thai 0.71 0.82 0.76 227 + + accuracy 0.74 1199 + macro avg 0.76 0.74 0.74 1199 + weighted avg 0.76 0.74 0.74 1199 + ``` + + ✅ Preberite več o [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) + +## Support Vector razvrščevalnik + +Support-Vector razvrščevalniki so del družine metod strojnega učenja [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine), ki se uporabljajo za naloge razvrščanja in regresije. SVM "preslika primere treninga v točke v prostoru", da maksimizira razdaljo med dvema kategorijama. Naknadni podatki so preslikani v ta prostor, da se lahko napove njihova kategorija. + +### Naloga - uporabite Support Vector razvrščevalnik + +Poskusimo doseči nekoliko boljšo natančnost s Support Vector razvrščevalnikom. + +1. Dodajte vejico za element K-Neighbors in nato dodajte to vrstico: + + ```python + 'SVC': SVC(), + ``` + + Rezultat je zelo dober! + + ```output + Accuracy (train) for SVC: 83.2% + precision recall f1-score support + + chinese 0.79 0.74 0.76 242 + indian 0.88 0.90 0.89 234 + japanese 0.87 0.81 0.84 254 + korean 0.91 0.82 0.86 242 + thai 0.74 0.90 0.81 227 + + accuracy 0.83 1199 + macro avg 0.84 0.83 0.83 1199 + weighted avg 0.84 0.83 0.83 1199 + ``` + + ✅ Preberite več o [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm) + +## Ensemble razvrščevalniki + +Sledimo poti do samega konca, čeprav je bil prejšnji test zelo dober. Poskusimo nekaj 'Ensemble razvrščevalnikov', natančneje Random Forest in AdaBoost: + +```python + 'RFST': RandomForestClassifier(n_estimators=100), + 'ADA': AdaBoostClassifier(n_estimators=100) +``` + +Rezultat je zelo dober, še posebej za Random Forest: + +```output +Accuracy (train) for RFST: 84.5% + precision recall f1-score support + + chinese 0.80 0.77 0.78 242 + indian 0.89 0.92 0.90 234 + japanese 0.86 0.84 0.85 254 + korean 0.88 0.83 0.85 242 + thai 0.80 0.87 0.83 227 + + accuracy 0.84 1199 + macro avg 0.85 0.85 0.84 1199 +weighted avg 0.85 0.84 0.84 1199 + +Accuracy (train) for ADA: 72.4% + precision recall f1-score support + + chinese 0.64 0.49 0.56 242 + indian 0.91 0.83 0.87 234 + japanese 0.68 0.69 0.69 254 + korean 0.73 0.79 0.76 242 + thai 0.67 0.83 0.74 227 + + accuracy 0.72 1199 + macro avg 0.73 0.73 0.72 1199 +weighted avg 0.73 0.72 0.72 1199 +``` + +✅ Preberite več o [Ensemble razvrščevalnikih](https://scikit-learn.org/stable/modules/ensemble.html) + +Ta metoda strojnega učenja "združuje napovedi več osnovnih ocenjevalnikov", da izboljša kakovost modela. V našem primeru smo uporabili Random Trees in AdaBoost. + +- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), metoda povprečenja, gradi 'gozd' 'odločilnih dreves', ki so prežeta z naključnostjo, da se izogne prekomernemu prileganju. Parameter n_estimators je nastavljen na število dreves. + +- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) prilagodi razvrščevalnik naboru podatkov in nato prilagodi kopije tega razvrščevalnika istemu naboru podatkov. Osredotoča se na uteži nepravilno razvrščenih elementov in prilagodi prileganje za naslednji razvrščevalnik, da jih popravi. + +--- + +## 🚀Izziv + +Vsaka od teh tehnik ima veliko število parametrov, ki jih lahko prilagodite. Raziskujte privzete parametre vsake metode in razmislite, kaj bi pomenilo prilagajanje teh parametrov za kakovost modela. + +## [Zaključni kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +V teh lekcijah je veliko žargona, zato si vzemite trenutek za pregled [tega seznama](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) uporabne terminologije! + +## Naloga + +[Parameter play](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni prevod s strani človeka. Ne prevzemamo odgovornosti za morebitna napačna razumevanja ali napačne interpretacije, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/3-Classifiers-2/assignment.md b/translations/sl/4-Classification/3-Classifiers-2/assignment.md new file mode 100644 index 00000000..45b1da25 --- /dev/null +++ b/translations/sl/4-Classification/3-Classifiers-2/assignment.md @@ -0,0 +1,25 @@ + +# Igra s parametri + +## Navodila + +Pri delu s temi klasifikatorji je veliko parametrov, ki so privzeto nastavljeni. Intellisense v VS Code vam lahko pomaga raziskati te parametre. Uporabite eno od tehnik strojnega učenja za klasifikacijo, ki so predstavljene v tej lekciji, in ponovno trenirajte modele, pri čemer prilagodite različne vrednosti parametrov. Ustvarite beležko, v kateri pojasnite, zakaj nekatere spremembe izboljšajo kakovost modela, medtem ko druge poslabšajo. Bodite podrobni v svojem odgovoru. + +## Merila ocenjevanja + +| Merilo | Odlično | Zadostno | Potrebne izboljšave | +| -------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ----------------------------- | +| | Predstavljena je beležka z v celoti izdelanim klasifikatorjem, prilagojenimi parametri in pojasnili v besedilnih poljih | Beležka je delno predstavljena ali slabo pojasnjena | Beležka je hroščata ali pomanjkljiva | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna napačna razumevanja ali napačne interpretacije, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/3-Classifiers-2/solution/Julia/README.md b/translations/sl/4-Classification/3-Classifiers-2/solution/Julia/README.md new file mode 100644 index 00000000..270433eb --- /dev/null +++ b/translations/sl/4-Classification/3-Classifiers-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno nadomestno besedilo + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/4-Applied/README.md b/translations/sl/4-Classification/4-Applied/README.md new file mode 100644 index 00000000..21a0dfea --- /dev/null +++ b/translations/sl/4-Classification/4-Applied/README.md @@ -0,0 +1,329 @@ + +# Zgradite spletno aplikacijo za priporočanje kulinarike + +V tej lekciji boste zgradili model za klasifikacijo z uporabo nekaterih tehnik, ki ste se jih naučili v prejšnjih lekcijah, ter z okusnim kulinaričnim naborom podatkov, ki smo ga uporabljali skozi celotno serijo. Poleg tega boste zgradili majhno spletno aplikacijo, ki bo uporabljala shranjen model, pri čemer boste izkoristili Onnx-ov spletni runtime. + +Ena najbolj uporabnih praktičnih aplikacij strojnega učenja je gradnja sistemov za priporočanje, in danes lahko naredite prvi korak v tej smeri! + +[![Predstavitev te spletne aplikacije](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Applied ML") + +> 🎥 Kliknite zgornjo sliko za video: Jen Looper gradi spletno aplikacijo z uporabo klasificiranih kulinaričnih podatkov + +## [Predlekcijski kviz](https://ff-quizzes.netlify.app/en/ml/) + +V tej lekciji se boste naučili: + +- Kako zgraditi model in ga shraniti kot Onnx model +- Kako uporabiti Netron za pregled modela +- Kako uporabiti vaš model v spletni aplikaciji za sklepanje + +## Zgradite svoj model + +Gradnja aplikativnih sistemov strojnega učenja je pomemben del uporabe teh tehnologij v poslovnih sistemih. Modele lahko uporabite znotraj svojih spletnih aplikacij (in jih tako po potrebi uporabite v offline kontekstu) z uporabo Onnx-a. + +V [prejšnji lekciji](../../3-Web-App/1-Web-App/README.md) ste zgradili regresijski model o opažanjih NLP-jev, ga "pickle-ali" in uporabili v Flask aplikaciji. Čeprav je ta arhitektura zelo uporabna, gre za polno Python aplikacijo, vaše zahteve pa lahko vključujejo uporabo JavaScript aplikacije. + +V tej lekciji lahko zgradite osnovni sistem za sklepanje, ki temelji na JavaScript-u. Najprej pa morate trenirati model in ga pretvoriti za uporabo z Onnx-om. + +## Naloga - trenirajte klasifikacijski model + +Najprej trenirajte klasifikacijski model z uporabo očiščenega nabora podatkov o kulinariki, ki smo ga uporabljali. + +1. Začnite z uvozom uporabnih knjižnic: + + ```python + !pip install skl2onnx + import pandas as pd + ``` + + Potrebujete '[skl2onnx](https://onnx.ai/sklearn-onnx/)', da pomagate pretvoriti vaš Scikit-learn model v Onnx format. + +1. Nato obdelajte podatke na enak način kot v prejšnjih lekcijah, tako da preberete CSV datoteko z uporabo `read_csv()`: + + ```python + data = pd.read_csv('../data/cleaned_cuisines.csv') + data.head() + ``` + +1. Odstranite prvi dve nepotrebni stolpci in shranite preostale podatke kot 'X': + + ```python + X = data.iloc[:,2:] + X.head() + ``` + +1. Shranite oznake kot 'y': + + ```python + y = data[['cuisine']] + y.head() + + ``` + +### Začnite rutino treniranja + +Uporabili bomo knjižnico 'SVC', ki ima dobro natančnost. + +1. Uvozite ustrezne knjižnice iz Scikit-learn: + + ```python + from sklearn.model_selection import train_test_split + from sklearn.svm import SVC + from sklearn.model_selection import cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report + ``` + +1. Ločite podatke na učne in testne sklope: + + ```python + X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3) + ``` + +1. Zgradite klasifikacijski model SVC, kot ste to storili v prejšnji lekciji: + + ```python + model = SVC(kernel='linear', C=10, probability=True,random_state=0) + model.fit(X_train,y_train.values.ravel()) + ``` + +1. Zdaj preizkusite svoj model z uporabo `predict()`: + + ```python + y_pred = model.predict(X_test) + ``` + +1. Izpišite poročilo o klasifikaciji, da preverite kakovost modela: + + ```python + print(classification_report(y_test,y_pred)) + ``` + + Kot smo videli prej, je natančnost dobra: + + ```output + precision recall f1-score support + + chinese 0.72 0.69 0.70 257 + indian 0.91 0.87 0.89 243 + japanese 0.79 0.77 0.78 239 + korean 0.83 0.79 0.81 236 + thai 0.72 0.84 0.78 224 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +### Pretvorite svoj model v Onnx + +Poskrbite, da bo pretvorba izvedena z ustreznim številom tenzorjev. Ta nabor podatkov ima 380 sestavin, zato morate to število označiti v `FloatTensorType`: + +1. Pretvorite z uporabo števila tenzorjev 380. + + ```python + from skl2onnx import convert_sklearn + from skl2onnx.common.data_types import FloatTensorType + + initial_type = [('float_input', FloatTensorType([None, 380]))] + options = {id(model): {'nocl': True, 'zipmap': False}} + ``` + +1. Ustvarite onx in shranite kot datoteko **model.onnx**: + + ```python + onx = convert_sklearn(model, initial_types=initial_type, options=options) + with open("./model.onnx", "wb") as f: + f.write(onx.SerializeToString()) + ``` + + > Opomba: V vašem skriptu za pretvorbo lahko podate [možnosti](https://onnx.ai/sklearn-onnx/parameterized.html). V tem primeru smo nastavili 'nocl' na True in 'zipmap' na False. Ker gre za klasifikacijski model, imate možnost odstraniti ZipMap, ki ustvari seznam slovarjev (ni potrebno). `nocl` se nanaša na vključitev informacij o razredih v model. Zmanjšajte velikost modela tako, da nastavite `nocl` na 'True'. + +Zagon celotnega zvezka bo zdaj zgradil Onnx model in ga shranil v to mapo. + +## Preglejte svoj model + +Onnx modeli niso zelo vidni v Visual Studio Code, vendar obstaja zelo dobra brezplačna programska oprema, ki jo mnogi raziskovalci uporabljajo za vizualizacijo modela, da se prepričajo, da je pravilno zgrajen. Prenesite [Netron](https://github.com/lutzroeder/Netron) in odprite datoteko model.onnx. Videli boste vizualizacijo vašega preprostega modela, z njegovimi 380 vhodi in klasifikatorjem: + +![Netron vizualizacija](../../../../4-Classification/4-Applied/images/netron.png) + +Netron je uporabno orodje za pregled vaših modelov. + +Zdaj ste pripravljeni uporabiti ta zanimiv model v spletni aplikaciji. Zgradimo aplikacijo, ki bo uporabna, ko boste pogledali v svoj hladilnik in poskušali ugotoviti, katero kombinacijo preostalih sestavin lahko uporabite za pripravo določene kulinarike, kot jo določi vaš model. + +## Zgradite spletno aplikacijo za priporočanje + +Svoj model lahko uporabite neposredno v spletni aplikaciji. Ta arhitektura omogoča tudi lokalno delovanje in celo offline uporabo, če je potrebno. Začnite z ustvarjanjem datoteke `index.html` v isti mapi, kjer ste shranili svojo datoteko `model.onnx`. + +1. V tej datoteki _index.html_ dodajte naslednjo oznako: + + ```html + + +
                      + Cuisine Matcher +
                      + + ... + + + ``` + +1. Zdaj, znotraj oznak `body`, dodajte nekaj oznak za prikaz seznama potrditvenih polj, ki odražajo nekatere sestavine: + + ```html +

                      Check your refrigerator. What can you create?

                      +
                      +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      +
                      +
                      + +
                      + ``` + + Opazite, da je vsakemu potrditvenemu polju dodeljena vrednost. To odraža indeks, kjer je sestavina najdena glede na nabor podatkov. Jabolko, na primer, v tem abecednem seznamu zaseda peti stolpec, zato je njegova vrednost '4', saj začnemo šteti pri 0. Posvetujte se s [preglednico sestavin](../../../../4-Classification/data/ingredient_indexes.csv), da odkrijete indeks določene sestavine. + + Nadaljujte delo v datoteki index.html in dodajte blok skripta, kjer je model poklican po zadnjem zapiralnem ``. + +1. Najprej uvozite [Onnx Runtime](https://www.onnxruntime.ai/): + + ```html + + ``` + + > Onnx Runtime omogoča izvajanje vaših Onnx modelov na širokem spektru strojne opreme, vključno z optimizacijami in API-jem za uporabo. + +1. Ko je Runtime na mestu, ga lahko pokličete: + + ```html + + ``` + +V tej kodi se dogaja več stvari: + +1. Ustvarili ste polje 380 možnih vrednosti (1 ali 0), ki se nastavijo in pošljejo modelu za sklepanje, odvisno od tega, ali je potrditveno polje označeno. +2. Ustvarili ste polje potrditvenih polj in način za določanje, ali so označena, v funkciji `init`, ki se pokliče ob zagonu aplikacije. Ko je potrditveno polje označeno, se polje `ingredients` spremeni, da odraža izbrano sestavino. +3. Ustvarili ste funkcijo `testCheckboxes`, ki preverja, ali je bilo katero potrditveno polje označeno. +4. Uporabite funkcijo `startInference`, ko je gumb pritisnjen, in če je katero potrditveno polje označeno, začnete sklepanje. +5. Rutina sklepanja vključuje: + 1. Nastavitev asinhronega nalaganja modela + 2. Ustvarjanje strukture Tensor za pošiljanje modelu + 3. Ustvarjanje 'feeds', ki odražajo vhod `float_input`, ki ste ga ustvarili med treniranjem modela (lahko uporabite Netron za preverjanje tega imena) + 4. Pošiljanje teh 'feeds' modelu in čakanje na odgovor + +## Preizkusite svojo aplikacijo + +Odprite terminal v Visual Studio Code v mapi, kjer se nahaja vaša datoteka index.html. Poskrbite, da imate [http-server](https://www.npmjs.com/package/http-server) globalno nameščen, in vnesite `http-server` v ukazni vrstici. Odpre se localhost, kjer lahko vidite svojo spletno aplikacijo. Preverite, katera kulinarika je priporočena glede na različne sestavine: + +![spletna aplikacija za sestavine](../../../../4-Classification/4-Applied/images/web-app.png) + +Čestitamo, ustvarili ste spletno aplikacijo za 'priporočanje' z nekaj polji. Vzemite si čas za nadgradnjo tega sistema! + +## 🚀Izziv + +Vaša spletna aplikacija je zelo osnovna, zato jo nadaljujte z nadgradnjo z uporabo sestavin in njihovih indeksov iz podatkov [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv). Katere kombinacije okusov delujejo za pripravo določene nacionalne jedi? + +## [Po-lekcijski kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Čeprav je ta lekcija le na kratko obravnavala uporabnost ustvarjanja sistema za priporočanje sestavin, je to področje aplikacij strojnega učenja zelo bogato z zgledi. Preberite več o tem, kako so ti sistemi zgrajeni: + +- https://www.sciencedirect.com/topics/computer-science/recommendation-engine +- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/ +- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/ + +## Naloga + +[Zgradite nov sistem za priporočanje](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/4-Applied/assignment.md b/translations/sl/4-Classification/4-Applied/assignment.md new file mode 100644 index 00000000..7da4f63b --- /dev/null +++ b/translations/sl/4-Classification/4-Applied/assignment.md @@ -0,0 +1,25 @@ + +# Ustvari priporočilni sistem + +## Navodila + +Glede na vaje v tej lekciji zdaj veste, kako zgraditi spletno aplikacijo na osnovi JavaScripta z uporabo Onnx Runtime in pretvorjenega Onnx modela. Poskusite ustvariti nov priporočilni sistem z uporabo podatkov iz teh lekcij ali drugih virov (prosimo, navedite vir). Morda bi lahko ustvarili priporočilni sistem za hišne ljubljenčke glede na različne osebnostne lastnosti ali priporočilni sistem za glasbene žanre glede na razpoloženje osebe. Bodite ustvarjalni! + +## Merila + +| Merilo | Odlično | Zadostno | Potrebno izboljšanje | +| -------- | ----------------------------------------------------------------------- | ------------------------------------ | --------------------------------- | +| | Predstavljena sta spletna aplikacija in zvezek, oba dobro dokumentirana in delujoča | Eden od teh dveh manjka ali ima pomanjkljivosti | Oba manjkata ali imata pomanjkljivosti | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/4-Classification/README.md b/translations/sl/4-Classification/README.md new file mode 100644 index 00000000..209d3f28 --- /dev/null +++ b/translations/sl/4-Classification/README.md @@ -0,0 +1,41 @@ + +# Začetek s klasifikacijo + +## Regionalna tema: Okusne azijske in indijske kuhinje 🍜 + +V Aziji in Indiji so prehranske tradicije izjemno raznolike in zelo okusne! Poglejmo podatke o regionalnih kuhinjah, da bi bolje razumeli njihove sestavine. + +![Prodajalec tajske hrane](../../../4-Classification/images/thai-food.jpg) +> Fotografija avtorja Lisheng Chang na Unsplash + +## Kaj se boste naučili + +V tem poglavju boste nadgradili svoje predhodno znanje o regresiji in spoznali druge klasifikatorje, ki jih lahko uporabite za boljše razumevanje podatkov. + +> Obstajajo uporabna orodja z malo kode, ki vam lahko pomagajo pri učenju dela s klasifikacijskimi modeli. Poskusite [Azure ML za to nalogo](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Lekcije + +1. [Uvod v klasifikacijo](1-Introduction/README.md) +2. [Več klasifikatorjev](2-Classifiers-1/README.md) +3. [Še drugi klasifikatorji](3-Classifiers-2/README.md) +4. [Uporabljeni ML: izdelava spletne aplikacije](4-Applied/README.md) + +## Avtorji + +"Začetek s klasifikacijo" sta napisali z ♥️ [Cassie Breviu](https://www.twitter.com/cassiebreviu) in [Jen Looper](https://www.twitter.com/jenlooper) + +Podatki o okusnih kuhinjah so bili pridobljeni iz [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines). + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/5-Clustering/1-Visualize/README.md b/translations/sl/5-Clustering/1-Visualize/README.md new file mode 100644 index 00000000..db7f1eed --- /dev/null +++ b/translations/sl/5-Clustering/1-Visualize/README.md @@ -0,0 +1,347 @@ + +# Uvod v razvrščanje v skupine + +Razvrščanje v skupine je vrsta [nenadzorovanega učenja](https://wikipedia.org/wiki/Unsupervised_learning), ki predpostavlja, da je podatkovni niz neoznačen ali da njegovi vnosi niso povezani z vnaprej določenimi izhodi. Uporablja različne algoritme za razvrščanje neoznačenih podatkov in zagotavlja skupine glede na vzorce, ki jih zazna v podatkih. + +[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare") + +> 🎥 Kliknite zgornjo sliko za video. Medtem ko študirate strojno učenje z razvrščanjem v skupine, uživajte ob nigerijskih plesnih skladbah - to je visoko ocenjena pesem iz leta 2014 skupine PSquare. + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +### Uvod + +[Razvrščanje v skupine](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) je zelo uporabno za raziskovanje podatkov. Poglejmo, ali lahko pomaga odkriti trende in vzorce v načinu, kako nigerijsko občinstvo uživa glasbo. + +✅ Vzemite si trenutek in razmislite o uporabi razvrščanja v skupine. V resničnem življenju se razvrščanje zgodi, kadar imate kup perila in morate razvrstiti oblačila družinskih članov 🧦👕👖🩲. V podatkovni znanosti se razvrščanje zgodi, ko poskušate analizirati uporabnikove preference ali določiti značilnosti katerega koli neoznačenega podatkovnega niza. Razvrščanje na nek način pomaga razumeti kaos, kot je predal za nogavice. + +[![Uvod v strojno učenje](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering") + +> 🎥 Kliknite zgornjo sliko za video: John Guttag z MIT-a predstavlja razvrščanje v skupine. + +V profesionalnem okolju se razvrščanje lahko uporablja za določanje stvari, kot je segmentacija trga, na primer za ugotavljanje, katere starostne skupine kupujejo določene izdelke. Druga uporaba bi bila odkrivanje anomalij, morda za zaznavanje goljufij iz podatkovnega niza transakcij s kreditnimi karticami. Lahko pa uporabite razvrščanje za določanje tumorjev v seriji medicinskih skenov. + +✅ Razmislite za trenutek, kako ste morda naleteli na razvrščanje 'v naravi', v bančništvu, e-trgovini ali poslovnem okolju. + +> 🎓 Zanimivo je, da analiza skupin izvira iz področij antropologije in psihologije v 30. letih prejšnjega stoletja. Si lahko predstavljate, kako bi jo takrat uporabljali? + +Druga možnost je, da jo uporabite za razvrščanje rezultatov iskanja - na primer po nakupovalnih povezavah, slikah ali ocenah. Razvrščanje je uporabno, kadar imate velik podatkovni niz, ki ga želite zmanjšati in na katerem želite opraviti bolj podrobno analizo, zato se tehnika lahko uporablja za spoznavanje podatkov, preden se zgradijo drugi modeli. + +✅ Ko so vaši podatki organizirani v skupine, jim dodelite ID skupine, kar je lahko uporabno pri ohranjanju zasebnosti podatkovnega niza; namesto bolj razkrivajočih identifikacijskih podatkov se lahko sklicujete na podatkovno točko z njenim ID-jem skupine. Ali lahko pomislite na druge razloge, zakaj bi se sklicevali na ID skupine namesto na druge elemente skupine za identifikacijo? + +Poglobite svoje razumevanje tehnik razvrščanja v tem [učnem modulu](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott). + +## Začetek z razvrščanjem v skupine + +[Scikit-learn ponuja širok nabor](https://scikit-learn.org/stable/modules/clustering.html) metod za izvajanje razvrščanja v skupine. Vrsta, ki jo izberete, bo odvisna od vašega primera uporabe. Po dokumentaciji ima vsaka metoda različne prednosti. Tukaj je poenostavljena tabela metod, ki jih podpira Scikit-learn, in njihovih ustreznih primerov uporabe: + +| Ime metode | Primer uporabe | +| :-------------------------- | :-------------------------------------------------------------------- | +| K-Means | splošna uporaba, induktivna | +| Affinity propagation | številne, neenakomerne skupine, induktivna | +| Mean-shift | številne, neenakomerne skupine, induktivna | +| Spectral clustering | malo, enakomerne skupine, transduktivna | +| Ward hierarchical clustering | številne, omejene skupine, transduktivna | +| Agglomerative clustering | številne, omejene, neevklidske razdalje, transduktivna | +| DBSCAN | neploska geometrija, neenakomerne skupine, transduktivna | +| OPTICS | neploska geometrija, neenakomerne skupine z različno gostoto, transduktivna | +| Gaussian mixtures | ploska geometrija, induktivna | +| BIRCH | velik podatkovni niz z odstopanji, induktivna | + +> 🎓 Kako ustvarjamo skupine, je močno povezano s tem, kako združujemo podatkovne točke v skupine. Razložimo nekaj terminologije: +> +> 🎓 ['Transduktivno' vs. 'induktivno'](https://wikipedia.org/wiki/Transduction_(machine_learning)) +> +> Transduktivno sklepanje izhaja iz opazovanih primerov usposabljanja, ki se preslikajo na specifične testne primere. Induktivno sklepanje izhaja iz primerov usposabljanja, ki se preslikajo na splošna pravila, ki se nato uporabijo na testnih primerih. +> +> Primer: Predstavljajte si, da imate podatkovni niz, ki je le delno označen. Nekatere stvari so 'plošče', nekatere 'CD-ji', nekatere pa so prazne. Vaša naloga je zagotoviti oznake za prazne. Če izberete induktivni pristop, bi usposobili model, ki išče 'plošče' in 'CD-je', ter te oznake uporabili na neoznačenih podatkih. Ta pristop bo imel težave pri razvrščanju stvari, ki so dejansko 'kasete'. Transduktivni pristop pa učinkoviteje obravnava te neznane podatke, saj deluje na združevanju podobnih predmetov in nato dodeli oznako skupini. V tem primeru bi skupine lahko odražale 'okrogle glasbene stvari' in 'kvadratne glasbene stvari'. +> +> 🎓 ['Neploska' vs. 'ploska' geometrija](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) +> +> Izpeljano iz matematične terminologije, neploska vs. ploska geometrija se nanaša na merjenje razdalj med točkami bodisi s 'plosko' ([evklidsko](https://wikipedia.org/wiki/Euclidean_geometry)) bodisi z 'neplosko' (neevklidsko) geometrijsko metodo. +> +>'Ploska' v tem kontekstu se nanaša na evklidsko geometrijo (deli katere se učijo kot 'ravninska' geometrija), medtem ko se 'neploska' nanaša na neevklidsko geometrijo. Kaj ima geometrija skupnega s strojno inteligenco? Kot dve področji, ki temeljita na matematiki, mora obstajati skupen način merjenja razdalj med točkami v skupinah, kar se lahko izvede na 'ploski' ali 'neploski' način, odvisno od narave podatkov. [Evklidske razdalje](https://wikipedia.org/wiki/Euclidean_distance) se merijo kot dolžina odseka med dvema točkama. [Neevklidske razdalje](https://wikipedia.org/wiki/Non-Euclidean_geometry) se merijo vzdolž krivulje. Če se vaši podatki, vizualizirani, ne nahajajo na ravnini, boste morda morali uporabiti specializiran algoritem za obravnavo. +> +![Ploska vs. neploska geometrija Infografika](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png) +> Infografika avtorja [Dasani Madipalli](https://twitter.com/dasani_decoded) +> +> 🎓 ['Razdalje'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) +> +> Skupine so opredeljene z matriko razdalj, npr. razdaljami med točkami. Te razdalje je mogoče meriti na več načinov. Evklidske skupine so opredeljene z povprečjem vrednosti točk in vsebujejo 'centroid' ali osrednjo točko. Razdalje se tako merijo glede na razdaljo do tega centroida. Neevklidske razdalje se nanašajo na 'clustroid', točko, ki je najbližja drugim točkam. Clustroidi so lahko opredeljeni na različne načine. +> +> 🎓 ['Omejeno'](https://wikipedia.org/wiki/Constrained_clustering) +> +> [Omejeno razvrščanje](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) uvaja 'polnadzorovano' učenje v to nenadzorovano metodo. Razmerja med točkami so označena kot 'ne smejo se povezati' ali 'morajo se povezati', tako da se na podatkovni niz vsilijo nekatera pravila. +> +>Primer: Če je algoritem sproščen na seriji neoznačenih ali delno označenih podatkov, so lahko skupine, ki jih ustvari, slabe kakovosti. V zgornjem primeru bi skupine lahko združevale 'okrogle glasbene stvari', 'kvadratne glasbene stvari', 'trikotne stvari' in 'piškote'. Če so podane nekatere omejitve ali pravila ("predmet mora biti iz plastike", "predmet mora biti sposoben proizvajati glasbo"), to lahko pomaga 'omejiti' algoritem, da sprejme boljše odločitve. +> +> 🎓 'Gostota' +> +> Podatki, ki so 'hrupni', se štejejo za 'goste'. Razdalje med točkami v vsaki od njihovih skupin se lahko ob pregledu izkažejo za bolj ali manj goste ali 'natrpane', zato je treba te podatke analizirati z ustrezno metodo razvrščanja. [Ta članek](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) prikazuje razliko med uporabo algoritmov K-Means in HDBSCAN za raziskovanje hrupnega podatkovnega niza z neenakomerno gostoto skupin. + +## Algoritmi za razvrščanje v skupine + +Obstaja več kot 100 algoritmov za razvrščanje v skupine, njihova uporaba pa je odvisna od narave podatkov. Oglejmo si nekatere glavne: + +- **Hierarhično razvrščanje**. Če je predmet razvrščen glede na svojo bližino bližnjemu predmetu, namesto bolj oddaljenemu, se skupine oblikujejo na podlagi razdalje njihovih članov do in od drugih predmetov. Scikit-learnova aglomerativna razvrstitev je hierarhična. + + ![Hierarhično razvrščanje Infografika](../../../../5-Clustering/1-Visualize/images/hierarchical.png) + > Infografika avtorja [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Razvrščanje po centroidih**. Ta priljubljen algoritem zahteva izbiro 'k', ali število skupin, ki jih je treba oblikovati, nato pa algoritem določi osrednjo točko skupine in zbira podatke okoli te točke. [K-means razvrščanje](https://wikipedia.org/wiki/K-means_clustering) je priljubljena različica razvrščanja po centroidih. Center je določen glede na najbližje povprečje, od tod tudi ime. Kvadratna razdalja od skupine je minimizirana. + + ![Razvrščanje po centroidih Infografika](../../../../5-Clustering/1-Visualize/images/centroid.png) + > Infografika avtorja [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Razvrščanje na podlagi porazdelitve**. Temelji na statističnem modeliranju, razvrščanje na podlagi porazdelitve se osredotoča na določanje verjetnosti, da podatkovna točka pripada skupini, in ji ustrezno dodeli mesto. Metode Gaussovih mešanic spadajo v to vrsto. + +- **Razvrščanje na podlagi gostote**. Podatkovne točke so dodeljene skupinam glede na njihovo gostoto ali njihovo združevanje okoli drugih točk. Podatkovne točke, ki so daleč od skupine, se štejejo za odstopanja ali hrup. DBSCAN, Mean-shift in OPTICS spadajo v to vrsto razvrščanja. + +- **Razvrščanje na podlagi mreže**. Za večdimenzionalne podatkovne nize se ustvari mreža, podatki pa se razdelijo med celice mreže, s čimer se ustvarijo skupine. + +## Vaja - razvrstite svoje podatke + +Razvrščanje kot tehnika je močno podprto z ustrezno vizualizacijo, zato začnimo z vizualizacijo naših glasbenih podatkov. Ta vaja nam bo pomagala odločiti, katero metodo razvrščanja bi bilo najbolj učinkovito uporabiti glede na naravo teh podatkov. + +1. Odprite datoteko [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) v tej mapi. + +1. Uvozite paket `Seaborn` za dobro vizualizacijo podatkov. + + ```python + !pip install seaborn + ``` + +1. Dodajte podatke o pesmih iz [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv). Naložite podatkovni okvir z nekaterimi podatki o pesmih. Pripravite se na raziskovanje teh podatkov z uvozom knjižnic in izpisom podatkov: + + ```python + import matplotlib.pyplot as plt + import pandas as pd + + df = pd.read_csv("../data/nigerian-songs.csv") + df.head() + ``` + + Preverite prvih nekaj vrstic podatkov: + + | | ime | album | izvajalec | glavni žanr izvajalca | datum izdaje | dolžina | priljubljenost | plesnost | akustičnost | energija | instrumentalnost | živost | glasnost | govornost | tempo | časovni podpis | + | --- | ------------------------ | ---------------------------- | ------------------- | --------------------- | ------------ | ------ | ------------- | ------------ | ------------ | ------ | ---------------- | ------- | -------- | ----------- | ------- | -------------- | + | 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternativni r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 | + | 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 | +| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 | +| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 | +| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 | + +1. Pridobite nekaj informacij o podatkovnem okviru z uporabo `info()`: + + ```python + df.info() + ``` + + Izhod je videti takole: + + ```output + + RangeIndex: 530 entries, 0 to 529 + Data columns (total 16 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 name 530 non-null object + 1 album 530 non-null object + 2 artist 530 non-null object + 3 artist_top_genre 530 non-null object + 4 release_date 530 non-null int64 + 5 length 530 non-null int64 + 6 popularity 530 non-null int64 + 7 danceability 530 non-null float64 + 8 acousticness 530 non-null float64 + 9 energy 530 non-null float64 + 10 instrumentalness 530 non-null float64 + 11 liveness 530 non-null float64 + 12 loudness 530 non-null float64 + 13 speechiness 530 non-null float64 + 14 tempo 530 non-null float64 + 15 time_signature 530 non-null int64 + dtypes: float64(8), int64(4), object(4) + memory usage: 66.4+ KB + ``` + +1. Dvakrat preverite, ali obstajajo manjkajoče vrednosti, tako da pokličete `isnull()` in preverite, da je vsota 0: + + ```python + df.isnull().sum() + ``` + + Videti je dobro: + + ```output + name 0 + album 0 + artist 0 + artist_top_genre 0 + release_date 0 + length 0 + popularity 0 + danceability 0 + acousticness 0 + energy 0 + instrumentalness 0 + liveness 0 + loudness 0 + speechiness 0 + tempo 0 + time_signature 0 + dtype: int64 + ``` + +1. Opis podatkov: + + ```python + df.describe() + ``` + + | | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | + | ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- | + | count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | + | mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 | + | std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 | + | min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 | + | 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 | + | 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 | + | 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 | + | max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 | + +> 🤔 Če delamo s klastriranjem, nenadzorovano metodo, ki ne zahteva označenih podatkov, zakaj prikazujemo te podatke z oznakami? V fazi raziskovanja podatkov so koristne, vendar za delovanje algoritmov klastriranja niso nujno potrebne. Stolpčne oznake bi lahko odstranili in se sklicevali na podatke po številki stolpca. + +Poglejte splošne vrednosti podatkov. Upoštevajte, da priljubljenost lahko znaša '0', kar kaže na pesmi, ki nimajo uvrstitve. Te bomo kmalu odstranili. + +1. Uporabite stolpčni graf za ugotavljanje najbolj priljubljenih žanrov: + + ```python + import seaborn as sns + + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top[:5].index,y=top[:5].values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + ![najbolj priljubljeni](../../../../5-Clustering/1-Visualize/images/popular.png) + +✅ Če želite videti več najvišjih vrednosti, spremenite zgornji `[:5]` v večjo vrednost ali ga odstranite, da vidite vse. + +Upoštevajte, da ko je najvišji žanr opisan kot 'Missing', to pomeni, da ga Spotify ni razvrstil, zato ga odstranimo. + +1. Odstranite manjkajoče podatke z njihovo filtracijo + + ```python + df = df[df['artist_top_genre'] != 'Missing'] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + Zdaj ponovno preverite žanre: + + ![vsi žanri](../../../../5-Clustering/1-Visualize/images/all-genres.png) + +1. Trije najboljši žanri močno prevladujejo v tem naboru podatkov. Osredotočimo se na `afro dancehall`, `afropop` in `nigerian pop`, dodatno filtrirajmo nabor podatkov, da odstranimo vse z vrednostjo priljubljenosti 0 (kar pomeni, da ni bilo razvrščeno glede na priljubljenost v naboru podatkov in se lahko za naše namene šteje kot šum): + + ```python + df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] + df = df[(df['popularity'] > 0)] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + +1. Hitro preverite, ali podatki močno korelirajo na kakšen poseben način: + + ```python + corrmat = df.corr(numeric_only=True) + f, ax = plt.subplots(figsize=(12, 9)) + sns.heatmap(corrmat, vmax=.8, square=True) + ``` + + ![korelacije](../../../../5-Clustering/1-Visualize/images/correlation.png) + + Edina močna korelacija je med `energy` in `loudness`, kar ni preveč presenetljivo, saj je glasna glasba običajno precej energična. Sicer so korelacije razmeroma šibke. Zanimivo bo videti, kaj lahko algoritem klastriranja naredi iz teh podatkov. + + > 🎓 Upoštevajte, da korelacija ne pomeni vzročnosti! Imamo dokaz korelacije, vendar ne dokaz vzročnosti. [Zabavna spletna stran](https://tylervigen.com/spurious-correlations) ima nekaj vizualizacij, ki poudarjajo to točko. + +Ali obstaja kakšna konvergenca v tem naboru podatkov glede na zaznano priljubljenost pesmi in plesnost? FacetGrid kaže, da obstajajo koncentrični krogi, ki se ujemajo, ne glede na žanr. Ali je mogoče, da se nigerijski okusi za ta žanr konvergirajo na določeni ravni plesnosti? + +✅ Preizkusite različne podatkovne točke (energija, glasnost, govorljivost) in več ali različne glasbene žanre. Kaj lahko odkrijete? Oglejte si tabelo `df.describe()` za splošno razporeditev podatkovnih točk. + +### Naloga - razporeditev podatkov + +Ali se ti trije žanri bistveno razlikujejo v zaznavanju njihove plesnosti glede na njihovo priljubljenost? + +1. Preučite razporeditev podatkov za priljubljenost in plesnost naših treh najboljših žanrov vzdolž dane osi x in y. + + ```python + sns.set_theme(style="ticks") + + g = sns.jointplot( + data=df, + x="popularity", y="danceability", hue="artist_top_genre", + kind="kde", + ) + ``` + + Lahko odkrijete koncentrične kroge okoli splošne točke konvergence, ki prikazujejo razporeditev točk. + + > 🎓 Upoštevajte, da ta primer uporablja graf KDE (Kernel Density Estimate), ki predstavlja podatke z uporabo kontinuirane krivulje gostote verjetnosti. To nam omogoča interpretacijo podatkov pri delu z več razporeditvami. + + Na splošno se trije žanri ohlapno uskladijo glede na njihovo priljubljenost in plesnost. Določanje skupin v teh ohlapno usklajenih podatkih bo izziv: + + ![razporeditev](../../../../5-Clustering/1-Visualize/images/distribution.png) + +1. Ustvarite razpršeni graf: + + ```python + sns.FacetGrid(df, hue="artist_top_genre", height=5) \ + .map(plt.scatter, "popularity", "danceability") \ + .add_legend() + ``` + + Razpršeni graf na istih oseh kaže podoben vzorec konvergence + + ![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png) + +Na splošno lahko za klastriranje uporabite razpršene grafe za prikaz skupin podatkov, zato je obvladovanje te vrste vizualizacije zelo koristno. V naslednji lekciji bomo uporabili te filtrirane podatke in uporabili klastriranje k-means za odkrivanje skupin v teh podatkih, ki se zanimivo prekrivajo. + +--- + +## 🚀Izziv + +V pripravi na naslednjo lekcijo naredite graf o različnih algoritmih klastriranja, ki jih lahko odkrijete in uporabite v produkcijskem okolju. Kakšne vrste težav poskuša klastriranje rešiti? + +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Preden uporabite algoritme klastriranja, kot smo se naučili, je dobro razumeti naravo vašega nabora podatkov. Preberite več o tej temi [tukaj](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) + +[Ta koristen članek](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) vas vodi skozi različne načine, kako se različni algoritmi klastriranja obnašajo glede na različne oblike podatkov. + +## Naloga + +[Raziskujte druge vizualizacije za klastriranje](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/5-Clustering/1-Visualize/assignment.md b/translations/sl/5-Clustering/1-Visualize/assignment.md new file mode 100644 index 00000000..bb69baee --- /dev/null +++ b/translations/sl/5-Clustering/1-Visualize/assignment.md @@ -0,0 +1,25 @@ + +# Raziskovanje drugih vizualizacij za gručenje + +## Navodila + +V tej lekciji ste spoznali nekaj tehnik vizualizacije, ki vam pomagajo pri pripravi podatkov za gručenje. Razpršeni diagrami (scatterplots) so še posebej uporabni za iskanje skupin objektov. Raziščite različne načine in knjižnice za ustvarjanje razpršenih diagramov ter svoje ugotovitve dokumentirajte v zvezku. Uporabite lahko podatke iz te lekcije, drugih lekcij ali podatke, ki jih pridobite sami (vendar v zvezku navedite vir podatkov). Narišite nekaj razpršenih diagramov in pojasnite, kaj ste odkrili. + +## Merila + +| Merilo | Odlično | Zadostno | Potrebno izboljšanje | +| --------| -------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ---------------------------------- | +| | Predstavljen je zvezek s petimi dobro dokumentiranimi diagrami | Predstavljen je zvezek z manj kot petimi diagrami, ki je manj dobro dokumentiran | Predstavljen je nepopoln zvezek | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/5-Clustering/1-Visualize/solution/Julia/README.md b/translations/sl/5-Clustering/1-Visualize/solution/Julia/README.md new file mode 100644 index 00000000..0c19fe41 --- /dev/null +++ b/translations/sl/5-Clustering/1-Visualize/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas opozarjamo, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/5-Clustering/2-K-Means/README.md b/translations/sl/5-Clustering/2-K-Means/README.md new file mode 100644 index 00000000..3396843f --- /dev/null +++ b/translations/sl/5-Clustering/2-K-Means/README.md @@ -0,0 +1,261 @@ + +# K-Means grozdenje + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +V tej lekciji se boste naučili, kako ustvariti grozde z uporabo Scikit-learn in nigerijskega glasbenega nabora podatkov, ki ste ga uvozili prej. Pokrili bomo osnove K-Means za grozdenje. Upoštevajte, da obstaja veliko načinov za delo z grozdi, kot ste se naučili v prejšnji lekciji, in metoda, ki jo uporabite, je odvisna od vaših podatkov. Poskusili bomo K-Means, saj je to najpogostejša tehnika grozdenja. Začnimo! + +Pojmi, o katerih se boste učili: + +- Silhuetno ocenjevanje +- Metoda komolca +- Inercija +- Varianca + +## Uvod + +[K-Means grozdenje](https://wikipedia.org/wiki/K-means_clustering) je metoda, ki izvira iz področja obdelave signalov. Uporablja se za razdelitev in razvrščanje skupin podatkov v 'k' grozde z uporabo serije opazovanj. Vsako opazovanje deluje tako, da razvrsti določeno podatkovno točko najbližje njenemu 'povprečju' ali središčni točki grozda. + +Grozde je mogoče vizualizirati kot [Voronoijeve diagrame](https://wikipedia.org/wiki/Voronoi_diagram), ki vključujejo točko (ali 'seme') in njeno ustrezno regijo. + +![voronoi diagram](../../../../5-Clustering/2-K-Means/images/voronoi.png) + +> Infografika avtorice [Jen Looper](https://twitter.com/jenlooper) + +Postopek K-Means grozdenja [poteka v treh korakih](https://scikit-learn.org/stable/modules/clustering.html#k-means): + +1. Algoritem izbere k-število središčnih točk z vzorčenjem iz nabora podatkov. Nato se zanka nadaljuje: + 1. Vsak vzorec dodeli najbližjemu centroidu. + 2. Ustvari nove centroide z izračunom povprečne vrednosti vseh vzorcev, dodeljenih prejšnjim centroidom. + 3. Nato izračuna razliko med novimi in starimi centroidi ter ponavlja, dokler se centroidi ne stabilizirajo. + +Ena od pomanjkljivosti uporabe K-Means je, da morate določiti 'k', torej število centroidov. Na srečo metoda 'komolca' pomaga oceniti dobro začetno vrednost za 'k'. To boste poskusili čez trenutek. + +## Predpogoj + +Delali boste v datoteki [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb), ki vključuje uvoz podatkov in predhodno čiščenje, ki ste ga opravili v prejšnji lekciji. + +## Naloga - priprava + +Začnite tako, da ponovno pregledate podatke o pesmih. + +1. Ustvarite boxplot za vsak stolpec z uporabo funkcije `boxplot()`: + + ```python + plt.figure(figsize=(20,20), dpi=200) + + plt.subplot(4,3,1) + sns.boxplot(x = 'popularity', data = df) + + plt.subplot(4,3,2) + sns.boxplot(x = 'acousticness', data = df) + + plt.subplot(4,3,3) + sns.boxplot(x = 'energy', data = df) + + plt.subplot(4,3,4) + sns.boxplot(x = 'instrumentalness', data = df) + + plt.subplot(4,3,5) + sns.boxplot(x = 'liveness', data = df) + + plt.subplot(4,3,6) + sns.boxplot(x = 'loudness', data = df) + + plt.subplot(4,3,7) + sns.boxplot(x = 'speechiness', data = df) + + plt.subplot(4,3,8) + sns.boxplot(x = 'tempo', data = df) + + plt.subplot(4,3,9) + sns.boxplot(x = 'time_signature', data = df) + + plt.subplot(4,3,10) + sns.boxplot(x = 'danceability', data = df) + + plt.subplot(4,3,11) + sns.boxplot(x = 'length', data = df) + + plt.subplot(4,3,12) + sns.boxplot(x = 'release_date', data = df) + ``` + + Ti podatki so nekoliko hrupni: z opazovanjem vsakega stolpca kot boxplota lahko vidite odstopajoče vrednosti. + + ![outliers](../../../../5-Clustering/2-K-Means/images/boxplots.png) + +Lahko bi pregledali nabor podatkov in odstranili te odstopajoče vrednosti, vendar bi to podatke precej zmanjšalo. + +1. Za zdaj izberite, katere stolpce boste uporabili za nalogo grozdenja. Izberite tiste s podobnimi razponi in kodirajte stolpec `artist_top_genre` kot numerične podatke: + + ```python + from sklearn.preprocessing import LabelEncoder + le = LabelEncoder() + + X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')] + + y = df['artist_top_genre'] + + X['artist_top_genre'] = le.fit_transform(X['artist_top_genre']) + + y = le.transform(y) + ``` + +1. Zdaj morate izbrati, koliko grozdov boste ciljali. Veste, da obstajajo 3 glasbeni žanri, ki smo jih izluščili iz nabora podatkov, zato poskusimo s 3: + + ```python + from sklearn.cluster import KMeans + + nclusters = 3 + seed = 0 + + km = KMeans(n_clusters=nclusters, random_state=seed) + km.fit(X) + + # Predict the cluster for each data point + + y_cluster_kmeans = km.predict(X) + y_cluster_kmeans + ``` + +Vidite natisnjen niz s predvidenimi grozdi (0, 1 ali 2) za vsako vrstico podatkovnega okvira. + +1. Uporabite ta niz za izračun 'silhuetne ocene': + + ```python + from sklearn import metrics + score = metrics.silhouette_score(X, y_cluster_kmeans) + score + ``` + +## Silhuetna ocena + +Iščite silhuetno oceno bližje 1. Ta ocena se giblje od -1 do 1, in če je ocena 1, je grozd gost in dobro ločen od drugih grozdov. Vrednost blizu 0 predstavlja prekrivajoče se grozde z vzorci, ki so zelo blizu odločitveni meji sosednjih grozdov. [(Vir)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam) + +Naša ocena je **0,53**, torej nekje na sredini. To kaže, da naši podatki niso posebej primerni za to vrsto grozdenja, vendar nadaljujmo. + +### Naloga - izdelava modela + +1. Uvozite `KMeans` in začnite postopek grozdenja. + + ```python + from sklearn.cluster import KMeans + wcss = [] + + for i in range(1, 11): + kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42) + kmeans.fit(X) + wcss.append(kmeans.inertia_) + + ``` + + Tukaj je nekaj delov, ki jih je vredno pojasniti. + + > 🎓 range: To so iteracije postopka grozdenja. + + > 🎓 random_state: "Določa generacijo naključnih števil za inicializacijo centroidov." [Vir](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans) + + > 🎓 WCSS: "vsota kvadratov znotraj grozda" meri povprečno kvadratno razdaljo vseh točk znotraj grozda do centroida grozda. [Vir](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce). + + > 🎓 Inercija: Algoritmi K-Means poskušajo izbrati centroide, da minimizirajo 'inercijo', "merilo, kako notranje koherentni so grozdi." [Vir](https://scikit-learn.org/stable/modules/clustering.html). Vrednost se doda spremenljivki wcss pri vsaki iteraciji. + + > 🎓 k-means++: V [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) lahko uporabite optimizacijo 'k-means++', ki "inicializira centroide tako, da so (na splošno) oddaljeni drug od drugega, kar vodi do verjetno boljših rezultatov kot naključna inicializacija." + +### Metoda komolca + +Prej ste domnevali, da bi morali izbrati 3 grozde, ker ste ciljali 3 glasbene žanre. Je to res? + +1. Uporabite metodo 'komolca', da se prepričate. + + ```python + plt.figure(figsize=(10,5)) + sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red') + plt.title('Elbow') + plt.xlabel('Number of clusters') + plt.ylabel('WCSS') + plt.show() + ``` + + Uporabite spremenljivko `wcss`, ki ste jo ustvarili v prejšnjem koraku, da ustvarite graf, ki prikazuje, kje je 'pregib' v komolcu, kar označuje optimalno število grozdov. Morda je **res** 3! + + ![elbow method](../../../../5-Clustering/2-K-Means/images/elbow.png) + +## Naloga - prikaz grozdov + +1. Poskusite postopek znova, tokrat nastavite tri grozde in prikažite grozde kot razpršen diagram: + + ```python + from sklearn.cluster import KMeans + kmeans = KMeans(n_clusters = 3) + kmeans.fit(X) + labels = kmeans.predict(X) + plt.scatter(df['popularity'],df['danceability'],c = labels) + plt.xlabel('popularity') + plt.ylabel('danceability') + plt.show() + ``` + +1. Preverite natančnost modela: + + ```python + labels = kmeans.labels_ + + correct_labels = sum(y == labels) + + print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size)) + + print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size))) + ``` + + Natančnost tega modela ni zelo dobra, oblika grozdov pa vam daje namig, zakaj. + + ![clusters](../../../../5-Clustering/2-K-Means/images/clusters.png) + + Ti podatki so preveč neuravnoteženi, premalo korelirani in med vrednostmi stolpcev je preveč variance, da bi jih dobro razvrstili v grozde. Pravzaprav so grozdi, ki se oblikujejo, verjetno močno vplivani ali pristranski zaradi treh kategorij žanrov, ki smo jih opredelili zgoraj. To je bil učni proces! + + V dokumentaciji Scikit-learn lahko vidite, da ima model, kot je ta, z grozdi, ki niso dobro razmejeni, težavo z 'varianco': + + ![problem models](../../../../5-Clustering/2-K-Means/images/problems.png) + > Infografika iz Scikit-learn + +## Varianca + +Varianca je definirana kot "povprečje kvadratnih razlik od povprečja" [(Vir)](https://www.mathsisfun.com/data/standard-deviation.html). V kontekstu tega problema grozdenja se nanaša na podatke, pri katerih se številke našega nabora podatkov preveč oddaljujejo od povprečja. + +✅ To je odličen trenutek, da razmislite o vseh načinih, kako bi lahko odpravili to težavo. Bi še malo prilagodili podatke? Uporabili druge stolpce? Uporabili drugačen algoritem? Namig: Poskusite [normalizirati podatke](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) in preizkusiti druge stolpce. + +> Poskusite ta '[kalkulator variance](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)', da bolje razumete koncept. + +--- + +## 🚀Izziv + +Preživite nekaj časa s tem zvezkom in prilagodite parametre. Ali lahko izboljšate natančnost modela z dodatnim čiščenjem podatkov (na primer odstranjevanjem odstopajočih vrednosti)? Lahko uporabite uteži, da določene vzorce podatkov bolj poudarite. Kaj še lahko storite, da ustvarite boljše grozde? + +Namig: Poskusite normalizirati podatke. V zvezku je komentirana koda, ki dodaja standardno skaliranje, da stolpci podatkov bolj spominjajo drug na drugega glede na razpon. Ugotovili boste, da se silhuetna ocena zniža, vendar se 'pregib' v grafu komolca zgladi. To je zato, ker neobdelani podatki omogočajo, da podatki z manj varianco nosijo večjo težo. Preberite več o tej težavi [tukaj](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226). + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Oglejte si simulator K-Means [kot je ta](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). S tem orodjem lahko vizualizirate vzorčne podatkovne točke in določite njihove centroide. Lahko urejate naključnost podatkov, število grozdov in število centroidov. Ali vam to pomaga pridobiti predstavo o tem, kako je mogoče podatke razvrstiti? + +Prav tako si oglejte [ta priročnik o K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) s Stanforda. + +## Naloga + +[Preizkusite različne metode grozdenja](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna napačna razumevanja ali napačne interpretacije, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/5-Clustering/2-K-Means/assignment.md b/translations/sl/5-Clustering/2-K-Means/assignment.md new file mode 100644 index 00000000..ee5d54d2 --- /dev/null +++ b/translations/sl/5-Clustering/2-K-Means/assignment.md @@ -0,0 +1,25 @@ + +# Preizkusite različne metode grozdenja + +## Navodila + +V tej lekciji ste se naučili o grozdenju s K-sredinami (K-Means). Včasih metoda K-sredin ni primerna za vaše podatke. Ustvarite beležnico z uporabo podatkov iz teh lekcij ali od drugod (navedite vir) in prikažite drugo metodo grozdenja, ki NE uporablja K-sredin. Kaj ste se naučili? + +## Merila + +| Merilo | Odlično | Zadostno | Potrebne izboljšave | +| -------- | --------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------- | +| | Predstavljena je beležnica z dobro dokumentiranim modelom grozdenja | Predstavljena je beležnica brez dobre dokumentacije in/ali nepopolna | Predloženo je nepopolno delo | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/5-Clustering/2-K-Means/solution/Julia/README.md b/translations/sl/5-Clustering/2-K-Means/solution/Julia/README.md new file mode 100644 index 00000000..9d93c14d --- /dev/null +++ b/translations/sl/5-Clustering/2-K-Means/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto za rezervacijo + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/5-Clustering/README.md b/translations/sl/5-Clustering/README.md new file mode 100644 index 00000000..99327b58 --- /dev/null +++ b/translations/sl/5-Clustering/README.md @@ -0,0 +1,42 @@ + +# Modeli za gručenje v strojnem učenju + +Gručenje je naloga strojnega učenja, pri kateri iščemo predmete, ki so si med seboj podobni, in jih združujemo v skupine, imenovane gruče. Kar razlikuje gručenje od drugih pristopov v strojnem učenju, je dejstvo, da se stvari dogajajo samodejno; pravzaprav lahko rečemo, da je to nasprotje nadzorovanega učenja. + +## Regionalna tema: modeli za gručenje glasbenih okusov nigerijskega občinstva 🎧 + +Raznoliko nigerijsko občinstvo ima raznolike glasbene okuse. Z uporabo podatkov, pridobljenih s Spotifyja (navdihnjeno s [tem člankom](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)), si poglejmo nekaj glasbe, ki je priljubljena v Nigeriji. Ta podatkovni niz vključuje podatke o različnih pesmih, kot so ocena 'plesnosti', 'akustičnosti', glasnosti, 'govorljivosti', priljubljenosti in energije. Zanimivo bo odkriti vzorce v teh podatkih! + +![Gramofon](../../../5-Clustering/images/turntable.jpg) + +> Fotografija Marcele Laskoski na Unsplash + +V tej seriji lekcij boste odkrili nove načine za analizo podatkov z uporabo tehnik gručenja. Gručenje je še posebej uporabno, kadar vaš podatkovni niz nima oznak. Če pa oznake obstajajo, so tehnike klasifikacije, kot ste jih spoznali v prejšnjih lekcijah, morda bolj uporabne. V primerih, ko želite združiti neoznačene podatke, je gručenje odličen način za odkrivanje vzorcev. + +> Obstajajo uporabna orodja z malo kode, ki vam lahko pomagajo pri delu z modeli za gručenje. Poskusite [Azure ML za to nalogo](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Lekcije + +1. [Uvod v gručenje](1-Visualize/README.md) +2. [Gručenje s K-Means](2-K-Means/README.md) + +## Zasluge + +Te lekcije so bile napisane z 🎶 s strani [Jen Looper](https://www.twitter.com/jenlooper) z uporabnimi pregledi s strani [Rishit Dagli](https://rishit_dagli) in [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan). + +Podatkovni niz [Nigerijske pesmi](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) je bil pridobljen s Kaggleja, kot je bil pridobljen s Spotifyja. + +Uporabni primeri K-Means, ki so pomagali pri ustvarjanju te lekcije, vključujejo to [raziskovanje irisa](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), ta [uvodni zvezek](https://www.kaggle.com/prashant111/k-means-clustering-with-python) in ta [hipotetični primer nevladne organizacije](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering). + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/1-Introduction-to-NLP/README.md b/translations/sl/6-NLP/1-Introduction-to-NLP/README.md new file mode 100644 index 00000000..61d0ef57 --- /dev/null +++ b/translations/sl/6-NLP/1-Introduction-to-NLP/README.md @@ -0,0 +1,179 @@ + +# Uvod v obdelavo naravnega jezika + +Ta lekcija zajema kratko zgodovino in pomembne koncepte *obdelave naravnega jezika* (ONJ), podpodročja *računalniške lingvistike*. + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +ONJ, kot jo pogosto imenujemo, je eno najbolj znanih področij, kjer se strojno učenje uporablja in vključuje v produkcijsko programsko opremo. + +✅ Ali lahko pomislite na programsko opremo, ki jo uporabljate vsak dan in ki verjetno vključuje ONJ? Kaj pa vaši programi za urejanje besedil ali mobilne aplikacije, ki jih redno uporabljate? + +Naučili se boste: + +- **Ideje o jezikih**. Kako so se jeziki razvijali in katera so bila glavna področja raziskovanja. +- **Definicije in koncepti**. Spoznali boste definicije in koncepte, kako računalniki obdelujejo besedilo, vključno z razčlenjevanjem, slovnico ter prepoznavanjem samostalnikov in glagolov. V tej lekciji so vključene nekatere naloge s kodiranjem, prav tako pa so predstavljeni pomembni koncepti, ki se jih boste naučili kodirati v naslednjih lekcijah. + +## Računalniška lingvistika + +Računalniška lingvistika je področje raziskav in razvoja, ki že desetletja preučuje, kako lahko računalniki delujejo z jeziki, jih razumejo, prevajajo in komunicirajo z njimi. Obdelava naravnega jezika (ONJ) je sorodno področje, osredotočeno na to, kako računalniki obdelujejo 'naravne' ali človeške jezike. + +### Primer - narekovanje na telefonu + +Če ste kdaj narekovali svojemu telefonu namesto tipkanja ali vprašali virtualnega asistenta, je vaš govor pretvorjen v besedilo in nato obdelan oziroma *razčlenjen* iz jezika, ki ste ga govorili. Zaznane ključne besede so nato obdelane v obliki, ki jo telefon ali asistent razume in na katero lahko ukrepa. + +![razumevanje](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png) +> Resnično razumevanje jezika je težko! Slika: [Jen Looper](https://twitter.com/jenlooper) + +### Kako je ta tehnologija mogoča? + +To je mogoče, ker je nekdo napisal računalniški program, ki to omogoča. Pred nekaj desetletji so nekateri pisci znanstvene fantastike napovedovali, da bodo ljudje večinoma govorili s svojimi računalniki, ki bodo vedno natančno razumeli, kaj mislijo. Žal se je izkazalo, da je ta problem težji, kot so mnogi mislili. Čeprav je danes veliko bolje razumljen, še vedno obstajajo pomembni izzivi pri doseganju 'popolne' obdelave naravnega jezika, zlasti ko gre za razumevanje pomena stavka. To je še posebej težavno pri razumevanju humorja ali zaznavanju čustev, kot je sarkazem, v stavku. + +Morda se zdaj spomnite šolskih ur, kjer je učitelj razlagal dele stavčne slovnice. V nekaterih državah se učenci učijo slovnice in lingvistike kot samostojnega predmeta, v mnogih pa so te teme vključene v učenje jezika: bodisi vašega prvega jezika v osnovni šoli (učenje branja in pisanja) bodisi morda drugega jezika v srednji šoli. Ne skrbite, če niste strokovnjak za razlikovanje med samostalniki in glagoli ali prislovi in pridevniki! + +Če se vam zdi težko razlikovati med *enostavnim sedanjikom* in *sedanjim trpnikom*, niste edini. To je izziv za mnoge ljudi, tudi za naravne govorce jezika. Dobra novica je, da so računalniki zelo dobri pri uporabi formalnih pravil, in naučili se boste pisati kodo, ki lahko *razčleni* stavek tako dobro kot človek. Večji izziv, ki ga boste raziskali kasneje, je razumevanje *pomena* in *čustev* stavka. + +## Predznanje + +Za to lekcijo je glavni pogoj sposobnost branja in razumevanja jezika te lekcije. Ni matematičnih nalog ali enačb za reševanje. Čeprav je avtor to lekcijo napisal v angleščini, je prevedena tudi v druge jezike, zato morda berete prevod. Obstajajo primeri, kjer se uporablja več različnih jezikov (za primerjavo različnih slovničnih pravil jezikov). Ti *niso* prevedeni, vendar je razlagalno besedilo prevedeno, zato bi moral biti pomen jasen. + +Za naloge s kodiranjem boste uporabljali Python, primeri pa so napisani v Pythonu 3.8. + +V tem razdelku boste potrebovali in uporabljali: + +- **Razumevanje Pythona 3**. Razumevanje programskega jezika Python 3, ta lekcija uporablja vnos, zanke, branje datotek, tabele. +- **Visual Studio Code + razširitev**. Uporabili bomo Visual Studio Code in njegovo razširitev za Python. Lahko pa uporabite tudi IDE za Python po svoji izbiri. +- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) je poenostavljena knjižnica za obdelavo besedila v Pythonu. Sledite navodilom na strani TextBlob za namestitev na vaš sistem (namestite tudi korpuse, kot je prikazano spodaj): + + ```bash + pip install -U textblob + python -m textblob.download_corpora + ``` + +> 💡 Nasvet: Python lahko zaženete neposredno v okolju VS Code. Preverite [dokumentacijo](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) za več informacij. + +## Pogovor z računalniki + +Zgodovina poskusov, da bi računalniki razumeli človeški jezik, sega desetletja nazaj. Eden prvih znanstvenikov, ki je razmišljal o obdelavi naravnega jezika, je bil *Alan Turing*. + +### 'Turingov test' + +Ko je Turing v 50. letih raziskoval *umetno inteligenco*, je razmišljal, ali bi lahko izvedli pogovorni test, kjer bi človek in računalnik (prek tipkanja) komunicirala, pri čemer človek ne bi bil prepričan, ali se pogovarja z drugim človekom ali računalnikom. + +Če po določenem času pogovora človek ne bi mogel ugotoviti, ali odgovori prihajajo od računalnika ali ne, bi lahko rekli, da računalnik *razmišlja*? + +### Navdih - 'igra posnemanja' + +Ideja za to je prišla iz družabne igre *Igra posnemanja*, kjer je zasliševalec sam v sobi in mora ugotoviti, kdo od dveh oseb (v drugi sobi) je moški in kdo ženska. Zasliševalec lahko pošilja zapiske in mora poskušati oblikovati vprašanja, kjer pisni odgovori razkrivajo spol skrivnostne osebe. Seveda se igralci v drugi sobi trudijo zavajati zasliševalca z odgovori, ki ga zmedejo, hkrati pa dajejo vtis, da odgovarjajo iskreno. + +### Razvoj Elize + +V 60. letih je znanstvenik z MIT, *Joseph Weizenbaum*, razvil [*Elizo*](https://wikipedia.org/wiki/ELIZA), računalniškega 'terapevta', ki je postavljal vprašanja in dajal vtis, da razume odgovore. Vendar pa, čeprav je Eliza lahko razčlenila stavek in prepoznala določene slovnične strukture in ključne besede, da bi dala razumen odgovor, ni mogla *razumeti* stavka. Če je bila Elizi predstavljena poved v obliki "**Jaz sem** žalosten", bi morda preuredila in zamenjala besede v stavku, da bi oblikovala odgovor "Kako dolgo ste **vi** žalostni?". + +To je dalo vtis, da Eliza razume izjavo in postavlja nadaljnje vprašanje, medtem ko je v resnici le spreminjala čas in dodajala nekaj besed. Če Eliza ni mogla prepoznati ključne besede, za katero je imela odgovor, bi namesto tega podala naključen odgovor, ki bi lahko ustrezal številnim različnim izjavam. Elizo je bilo mogoče zlahka pretentati, na primer, če je uporabnik napisal "**Ti si** kolo", bi morda odgovorila "Kako dolgo sem **jaz** kolo?", namesto bolj smiselnega odgovora. + +[![Pogovor z Elizo](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Pogovor z Elizo") + +> 🎥 Kliknite zgornjo sliko za video o izvirnem programu ELIZA + +> Opomba: Izvirni opis [Elize](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract), objavljen leta 1966, lahko preberete, če imate račun ACM. Alternativno lahko o Elizi preberete na [Wikipediji](https://wikipedia.org/wiki/ELIZA). + +## Vaja - kodiranje osnovnega pogovornega bota + +Pogovorni bot, kot je Eliza, je program, ki pridobiva uporabniški vnos in daje vtis, da razume in inteligentno odgovarja. Za razliko od Elize naš bot ne bo imel več pravil, ki bi dajala vtis inteligentnega pogovora. Namesto tega bo imel bot le eno sposobnost: nadaljevati pogovor z naključnimi odgovori, ki bi lahko delovali v skoraj vsakem trivialnem pogovoru. + +### Načrt + +Koraki pri gradnji pogovornega bota: + +1. Natisnite navodila, kako naj uporabnik komunicira z botom. +2. Zaženite zanko: + 1. Sprejmite uporabniški vnos. + 2. Če uporabnik zahteva izhod, izstopite. + 3. Obdelajte uporabniški vnos in določite odgovor (v tem primeru je odgovor naključna izbira iz seznama možnih splošnih odgovorov). + 4. Natisnite odgovor. +3. Vrni se na korak 2. + +### Gradnja bota + +Zdaj bomo ustvarili bota. Začeli bomo z definiranjem nekaterih fraz. + +1. Ustvarite tega bota sami v Pythonu z naslednjimi naključnimi odgovori: + + ```python + random_responses = ["That is quite interesting, please tell me more.", + "I see. Do go on.", + "Why do you say that?", + "Funny weather we've been having, isn't it?", + "Let's change the subject.", + "Did you catch the game last night?"] + ``` + + Tukaj je nekaj primerov izhoda za orientacijo (uporabniški vnos je na vrsticah, ki se začnejo z `>`): + + ```output + Hello, I am Marvin, the simple robot. + You can end this conversation at any time by typing 'bye' + After typing each answer, press 'enter' + How are you today? + > I am good thanks + That is quite interesting, please tell me more. + > today I went for a walk + Did you catch the game last night? + > I did, but my team lost + Funny weather we've been having, isn't it? + > yes but I hope next week is better + Let's change the subject. + > ok, lets talk about music + Why do you say that? + > because I like music! + Why do you say that? + > bye + It was nice talking to you, goodbye! + ``` + + Ena možna rešitev naloge je [tukaj](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py). + + ✅ Ustavi se in razmisli + + 1. Ali menite, da bi naključni odgovori 'pretentali' nekoga, da bi mislil, da bot dejansko razume? + 2. Katere funkcije bi bot potreboval, da bi bil bolj učinkovit? + 3. Če bi bot resnično 'razumel' pomen stavka, ali bi moral 'zapomniti' pomen prejšnjih stavkov v pogovoru? + +--- + +## 🚀 Izziv + +Izberite enega od zgornjih elementov "ustavi se in razmisli" in ga poskusite implementirati v kodi ali napišite rešitev na papirju z uporabo psevdo kode. + +V naslednji lekciji boste spoznali številne druge pristope k razčlenjevanju naravnega jezika in strojnega učenja. + +## [Kviz po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Oglejte si spodnje reference za dodatne priložnosti za branje. + +### Reference + +1. Schubert, Lenhart, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = . +2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010. + +## Naloga + +[Poiščite bota](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/1-Introduction-to-NLP/assignment.md b/translations/sl/6-NLP/1-Introduction-to-NLP/assignment.md new file mode 100644 index 00000000..492763df --- /dev/null +++ b/translations/sl/6-NLP/1-Introduction-to-NLP/assignment.md @@ -0,0 +1,25 @@ + +# Poišči bota + +## Navodila + +Boti so povsod. Tvoja naloga: najdi enega in ga "posvoji"! Najdeš jih lahko na spletnih straneh, v bančnih aplikacijah in po telefonu, na primer, ko pokličeš finančne storitve za nasvet ali informacije o računu. Analiziraj bota in preveri, ali ga lahko zmedeš. Če ti uspe zmediti bota, zakaj misliš, da se je to zgodilo? Napiši kratko poročilo o svoji izkušnji. + +## Merila ocenjevanja + +| Merilo | Odlično | Zadostno | Potrebno izboljšanje | +| -------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | --------------------- | +| | Napisana je celostranska naloga, ki pojasnjuje domnevno arhitekturo bota in opisuje tvojo izkušnjo z njim | Naloga je nepopolna ali slabo raziskana | Naloga ni oddana | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/2-Tasks/README.md b/translations/sl/6-NLP/2-Tasks/README.md new file mode 100644 index 00000000..6a78ae4c --- /dev/null +++ b/translations/sl/6-NLP/2-Tasks/README.md @@ -0,0 +1,226 @@ + +# Pogoste naloge in tehnike obdelave naravnega jezika + +Pri večini nalog obdelave *naravnega jezika* je treba besedilo razčleniti, analizirati in rezultate shraniti ali primerjati s pravili in podatkovnimi nabori. Te naloge omogočajo programerju, da iz besedila izpelje _pomen_, _namen_ ali zgolj _pogostost_ izrazov in besed. + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +Odkrijmo pogoste tehnike, ki se uporabljajo pri obdelavi besedila. V kombinaciji s strojnim učenjem te tehnike omogočajo učinkovito analizo velikih količin besedila. Preden uporabimo strojno učenje za te naloge, pa moramo razumeti težave, s katerimi se srečuje specialist za obdelavo naravnega jezika. + +## Pogoste naloge pri obdelavi naravnega jezika + +Obstajajo različni načini za analizo besedila, s katerim delate. Obstajajo naloge, ki jih lahko izvedete, in prek teh nalog lahko pridobite razumevanje besedila ter izpeljete zaključke. Te naloge običajno izvajate v zaporedju. + +### Tokenizacija + +Prva stvar, ki jo mora večina algoritmov za obdelavo naravnega jezika narediti, je razdelitev besedila na tokene ali besede. Čeprav se to sliši preprosto, lahko upoštevanje ločil in različnih jezikovnih mej med besedami in stavki postane zapleteno. Morda boste morali uporabiti različne metode za določanje teh mej. + +![tokenizacija](../../../../6-NLP/2-Tasks/images/tokenization.png) +> Tokenizacija stavka iz **Prevzetnosti in pristranosti**. Infografika avtorice [Jen Looper](https://twitter.com/jenlooper) + +### Vdelave + +[Vdelave besed](https://wikipedia.org/wiki/Word_embedding) so način, kako besedilne podatke pretvoriti v številčno obliko. Vdelave so narejene tako, da se besede s podobnim pomenom ali besede, ki se pogosto uporabljajo skupaj, združijo v skupine. + +![vdelave besed](../../../../6-NLP/2-Tasks/images/embedding.png) +> "Imam največje spoštovanje do vaših živcev, so moji stari prijatelji." - Vdelave besed za stavek iz **Prevzetnosti in pristranosti**. Infografika avtorice [Jen Looper](https://twitter.com/jenlooper) + +✅ Preizkusite [to zanimivo orodje](https://projector.tensorflow.org/) za eksperimentiranje z vdelavami besed. Klik na eno besedo pokaže skupine podobnih besed: 'igrača' se združi z 'disney', 'lego', 'playstation' in 'konzola'. + +### Razčlenjevanje in označevanje delov govora + +Vsako besedo, ki je bila tokenizirana, je mogoče označiti kot del govora - samostalnik, glagol ali pridevnik. Stavek `hitra rdeča lisica je skočila čez lenega rjavega psa` bi lahko bil označen kot lisica = samostalnik, skočila = glagol. + +![razčlenjevanje](../../../../6-NLP/2-Tasks/images/parse.png) + +> Razčlenjevanje stavka iz **Prevzetnosti in pristranosti**. Infografika avtorice [Jen Looper](https://twitter.com/jenlooper) + +Razčlenjevanje pomeni prepoznavanje, katere besede so med seboj povezane v stavku - na primer `hitra rdeča lisica je skočila` je zaporedje pridevnik-samostalnik-glagol, ki je ločeno od zaporedja `lenega rjavega psa`. + +### Pogostost besed in fraz + +Koristen postopek pri analizi velikega besedila je izdelava slovarja vseh besed ali fraz, ki nas zanimajo, in kako pogosto se pojavljajo. Fraza `hitra rdeča lisica je skočila čez lenega rjavega psa` ima pogostost besede "je" 2. + +Poglejmo primer besedila, kjer štejemo pogostost besed. Pesem Zmagovalci avtorja Rudyard Kiplinga vsebuje naslednjo kitico: + +```output +What the moral? Who rides may read. +When the night is thick and the tracks are blind +A friend at a pinch is a friend, indeed, +But a fool to wait for the laggard behind. +Down to Gehenna or up to the Throne, +He travels the fastest who travels alone. +``` + +Ker je pogostost fraz lahko občutljiva na velike in male črke ali ne, ima fraza `prijatelj` pogostost 2, `je` pogostost 6, in `potuje` pogostost 2. + +### N-grami + +Besedilo je mogoče razdeliti na zaporedja besed določene dolžine, eno besedo (unigram), dve besedi (bigram), tri besede (trigram) ali poljubno število besed (n-grami). + +Na primer `hitra rdeča lisica je skočila čez lenega rjavega psa` z n-gramom dolžine 2 ustvari naslednje n-grame: + +1. hitra rdeča +2. rdeča lisica +3. lisica je +4. je skočila +5. skočila čez +6. čez lenega +7. lenega rjavega +8. rjavega psa + +Lahko si to predstavljate kot drsno polje nad stavkom. Tukaj je prikazano za n-grame dolžine 3 besed, n-gram je poudarjen v vsakem stavku: + +1. **hitra rdeča lisica** je skočila čez lenega rjavega psa +2. hitra **rdeča lisica je** skočila čez lenega rjavega psa +3. hitra rdeča **lisica je skočila** čez lenega rjavega psa +4. hitra rdeča lisica **je skočila čez** lenega rjavega psa +5. hitra rdeča lisica je **skočila čez lenega** rjavega psa +6. hitra rdeča lisica je skočila **čez lenega rjavega** psa +7. hitra rdeča lisica je skočila čez **lenega rjavega psa** + +![drsno okno n-gramov](../../../../6-NLP/2-Tasks/images/n-grams.gif) + +> N-gram dolžine 3: Infografika avtorice [Jen Looper](https://twitter.com/jenlooper) + +### Izvleček samostalniških fraz + +V večini stavkov je samostalnik, ki je predmet ali objekt stavka. V angleščini ga pogosto prepoznamo po besedah 'a', 'an' ali 'the', ki mu sledijo. Prepoznavanje predmeta ali objekta stavka z 'izvlekom samostalniške fraze' je pogosta naloga pri obdelavi naravnega jezika, ko poskušamo razumeti pomen stavka. + +✅ V stavku "Ne morem določiti ure, kraja, pogleda ali besed, ki so postavile temelje. To je bilo predolgo nazaj. Bil sem na sredini, preden sem vedel, da sem začel." Ali lahko prepoznate samostalniške fraze? + +V stavku `hitra rdeča lisica je skočila čez lenega rjavega psa` sta 2 samostalniški frazi: **hitra rdeča lisica** in **lenega rjavega psa**. + +### Analiza sentimenta + +Stavek ali besedilo je mogoče analizirati glede sentimenta, ali je *pozitivno* ali *negativno*. Sentiment se meri v *polariteti* in *objektivnosti/subjektivnosti*. Polariteta se meri od -1.0 do 1.0 (negativno do pozitivno) in od 0.0 do 1.0 (najbolj objektivno do najbolj subjektivno). + +✅ Kasneje boste izvedeli, da obstajajo različni načini za določanje sentimenta s strojnim učenjem, vendar je eden od načinov, da imamo seznam besed in fraz, ki jih človeški strokovnjak kategorizira kot pozitivne ali negativne, ter ta model uporabimo na besedilu za izračun polaritetne ocene. Ali vidite, kako bi to delovalo v nekaterih okoliščinah in manj dobro v drugih? + +### Pregibanje + +Pregibanje omogoča, da vzamete besedo in pridobite njen edninsko ali množinsko obliko. + +### Lemmatizacija + +*Lema* je koren ali osnovna beseda za niz besed, na primer *letel*, *leti*, *letenje* imajo lemo glagola *leteti*. + +Na voljo so tudi uporabne baze podatkov za raziskovalce obdelave naravnega jezika, med njimi: + +### WordNet + +[WordNet](https://wordnet.princeton.edu/) je baza podatkov besed, sinonimov, antonimov in mnogih drugih podrobnosti za vsako besedo v različnih jezikih. Izjemno je uporabna pri poskusih gradnje prevodov, črkovalnikov ali jezikovnih orodij kakršne koli vrste. + +## Knjižnice za obdelavo naravnega jezika + +Na srečo vam ni treba sami razvijati vseh teh tehnik, saj so na voljo odlične knjižnice za Python, ki obdelavo naravnega jezika in strojno učenje naredijo veliko bolj dostopno za razvijalce, ki niso specializirani za to področje. V naslednjih lekcijah boste spoznali več primerov teh knjižnic, tukaj pa boste izvedeli nekaj uporabnih primerov, ki vam bodo pomagali pri naslednji nalogi. + +### Vaja - uporaba knjižnice `TextBlob` + +Uporabimo knjižnico TextBlob, saj vsebuje uporabne API-je za reševanje teh vrst nalog. TextBlob "stoji na ramenih velikanov [NLTK](https://nltk.org) in [pattern](https://github.com/clips/pattern) ter se lepo povezuje z obema." V svojem API-ju ima vgrajeno veliko strojnega učenja. + +> Opomba: Priporočamo [hitri začetek](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) za TextBlob, ki je namenjen izkušenim Python razvijalcem. + +Pri poskusu prepoznavanja *samostalniških fraz* TextBlob ponuja več možnosti izvlečkov za iskanje samostalniških fraz. + +1. Oglejte si `ConllExtractor`. + + ```python + from textblob import TextBlob + from textblob.np_extractors import ConllExtractor + # import and create a Conll extractor to use later + extractor = ConllExtractor() + + # later when you need a noun phrase extractor: + user_input = input("> ") + user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified + np = user_input_blob.noun_phrases + ``` + + > Kaj se tukaj dogaja? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) je "Izvleček samostalniških fraz, ki uporablja razčlenjevanje kosov, trenirano na korpusu ConLL-2000." ConLL-2000 se nanaša na konferenco o računalniškem učenju naravnega jezika leta 2000. Vsako leto je konferenca gostila delavnico za reševanje težav obdelave naravnega jezika, leta 2000 pa je bila tema razčlenjevanje samostalniških fraz. Model je bil treniran na Wall Street Journalu, z "oddelki 15-18 kot podatki za treniranje (211727 tokenov) in oddelkom 20 kot testnimi podatki (47377 tokenov)". Postopke, ki so bili uporabljeni, si lahko ogledate [tukaj](https://www.clips.uantwerpen.be/conll2000/chunking/) in [rezultate](https://ifarm.nl/erikt/research/np-chunking.html). + +### Izziv - izboljšanje vašega bota z obdelavo naravnega jezika + +V prejšnji lekciji ste ustvarili zelo preprost Q&A bot. Zdaj boste Marvina naredili nekoliko bolj sočutnega, tako da boste analizirali vaš vnos glede sentimenta in natisnili odgovor, ki ustreza sentimentu. Prav tako boste morali prepoznati `samostalniško frazo` in o njej povprašati. + +Koraki pri gradnji boljšega pogovornega bota: + +1. Natisnite navodila, ki uporabnika obveščajo, kako komunicirati z botom +2. Začnite zanko + 1. Sprejmite uporabnikov vnos + 2. Če uporabnik zahteva izhod, izstopite + 3. Obdelajte uporabnikov vnos in določite ustrezen odgovor glede na sentiment + 4. Če je v sentimentu zaznana samostalniška fraza, jo postavite v množinsko obliko in povprašajte za več informacij o tej temi + 5. Natisnite odgovor +3. Vrnite se na korak 2 + +Tukaj je del kode za določanje sentimenta z uporabo TextBlob. Upoštevajte, da obstajajo samo štiri *stopnje* odziva na sentiment (lahko jih dodate več, če želite): + +```python +if user_input_blob.polarity <= -0.5: + response = "Oh dear, that sounds bad. " +elif user_input_blob.polarity <= 0: + response = "Hmm, that's not great. " +elif user_input_blob.polarity <= 0.5: + response = "Well, that sounds positive. " +elif user_input_blob.polarity <= 1: + response = "Wow, that sounds great. " +``` + +Tukaj je nekaj primerov izhoda, ki vas lahko vodi (uporabnikov vnos je na vrsticah, ki se začnejo z >): + +```output +Hello, I am Marvin, the friendly robot. +You can end this conversation at any time by typing 'bye' +After typing each answer, press 'enter' +How are you today? +> I am ok +Well, that sounds positive. Can you tell me more? +> I went for a walk and saw a lovely cat +Well, that sounds positive. Can you tell me more about lovely cats? +> cats are the best. But I also have a cool dog +Wow, that sounds great. Can you tell me more about cool dogs? +> I have an old hounddog but he is sick +Hmm, that's not great. Can you tell me more about old hounddogs? +> bye +It was nice talking to you, goodbye! +``` + +Ena od možnih rešitev naloge je [tukaj](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py) + +✅ Preverjanje znanja + +1. Ali menite, da bi sočutni odgovori 'pretentali' nekoga, da bi mislil, da bot dejansko razume? +2. Ali prepoznavanje samostalniške fraze naredi bota bolj 'prepričljivega'? +3. Zakaj bi bilo izvlečenje 'samostalniške fraze' iz stavka koristno? + +--- + +Implementirajte bota iz prejšnjega preverjanja znanja in ga preizkusite na prijatelju. Ali ga lahko pretenta? Ali lahko naredite svojega bota bolj 'prepričljivega'? + +## 🚀Izziv + +Izvedite nalogo iz prejšnjega preverjanja znanja in jo poskusite implementirati. Preizkusite bota na prijatelju. Ali ga lahko pretenta? Ali lahko naredite svojega bota bolj 'prepričljivega'? + +## [Kviz po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +V naslednjih lekcijah boste izvedeli več o analizi sentimenta. Raziskujte to zanimivo tehniko v člankih, kot so ti na [KDNuggets](https://www.kdnuggets.com/tag/nlp). + +## Naloga + +[Naredite, da bot odgovarja](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas opozarjamo, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/2-Tasks/assignment.md b/translations/sl/6-NLP/2-Tasks/assignment.md new file mode 100644 index 00000000..1bb03445 --- /dev/null +++ b/translations/sl/6-NLP/2-Tasks/assignment.md @@ -0,0 +1,25 @@ + +# Naredite, da bot odgovarja + +## Navodila + +V preteklih lekcijah ste programirali osnovnega bota, s katerim se lahko pogovarjate. Ta bot daje naključne odgovore, dokler ne rečete 'bye'. Ali lahko naredite odgovore nekoliko manj naključne in sprožite specifične odgovore, če rečete določene stvari, kot so 'zakaj' ali 'kako'? Razmislite, kako bi strojno učenje lahko naredilo tovrstno delo manj ročno, ko boste razširili svojega bota. Uporabite knjižnice NLTK ali TextBlob, da si olajšate naloge. + +## Merila + +| Merilo | Odlično | Zadostno | Potrebna izboljšava | +| -------- | --------------------------------------------- | ------------------------------------------------ | ----------------------- | +| | Predstavljen je nov bot.py datoteka in dokumentirana | Predstavljen je nov bot datoteka, vendar vsebuje napake | Datoteka ni predstavljena | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas opozarjamo, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi izhajale iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/3-Translation-Sentiment/README.md b/translations/sl/6-NLP/3-Translation-Sentiment/README.md new file mode 100644 index 00000000..1d63c8ba --- /dev/null +++ b/translations/sl/6-NLP/3-Translation-Sentiment/README.md @@ -0,0 +1,200 @@ + +# Prevajanje in analiza sentimenta z ML + +V prejšnjih lekcijah ste se naučili, kako zgraditi osnovnega bota z uporabo knjižnice `TextBlob`, ki vključuje strojno učenje za izvajanje osnovnih nalog obdelave naravnega jezika, kot je ekstrakcija samostalniških fraz. Drug pomemben izziv v računalniški lingvistiki je natančno _prevajanje_ stavka iz enega govorjenega ali pisanega jezika v drugega. + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +Prevajanje je zelo težaven problem, ki ga otežuje dejstvo, da obstaja na tisoče jezikov, od katerih ima vsak lahko zelo različna slovnična pravila. Eden od pristopov je pretvorba formalnih slovničnih pravil enega jezika, kot je angleščina, v strukturo, ki ni odvisna od jezika, nato pa prevod nazaj v drug jezik. Ta pristop vključuje naslednje korake: + +1. **Identifikacija**. Identificirajte ali označite besede v vhodnem jeziku kot samostalnike, glagole itd. +2. **Ustvarjanje prevoda**. Ustvarite neposreden prevod vsake besede v formatu ciljnega jezika. + +### Primer stavka, angleščina v irščino + +V 'angleščini' je stavek _I feel happy_ sestavljen iz treh besed v naslednjem vrstnem redu: + +- **osebek** (I) +- **glagol** (feel) +- **pridevnik** (happy) + +Vendar pa ima v 'irščini' isti stavek zelo drugačno slovnično strukturo - čustva, kot sta "*happy*" ali "*sad*", se izražajo kot nekaj, kar je *na tebi*. + +Angleški stavek `I feel happy` v irščini postane `Tá athas orm`. Dobesedni prevod bi bil `Happy is upon me`. + +Govorec irščine, ki prevaja v angleščino, bi rekel `I feel happy`, ne pa `Happy is upon me`, ker razume pomen stavka, tudi če so besede in struktura stavka različne. + +Formalni vrstni red stavka v irščini je: + +- **glagol** (Tá ali is) +- **pridevnik** (athas, ali happy) +- **osebek** (orm, ali upon me) + +## Prevajanje + +Naiven program za prevajanje bi morda prevedel samo besede, ne da bi upošteval strukturo stavka. + +✅ Če ste se kot odrasli naučili drugega (ali tretjega ali več) jezika, ste morda začeli razmišljati v svojem maternem jeziku, koncept prevajali besedo za besedo v glavi v drugi jezik in nato izgovorili prevod. To je podobno temu, kar počnejo naivni računalniški programi za prevajanje. Pomembno je preseči to fazo, da dosežete tekoče znanje jezika! + +Naivno prevajanje vodi do slabih (in včasih smešnih) napačnih prevodov: `I feel happy` se dobesedno prevede v `Mise bhraitheann athas` v irščini. To pomeni (dobesedno) `me feel happy` in ni veljaven irski stavek. Čeprav sta angleščina in irščina jezika, ki se govorita na dveh sosednjih otokih, sta zelo različna jezika z različnimi slovničnimi strukturami. + +> Lahko si ogledate nekaj videoposnetkov o irskih jezikovnih tradicijah, kot je [ta](https://www.youtube.com/watch?v=mRIaLSdRMMs) + +### Pristopi strojnega učenja + +Do sedaj ste se naučili o formalnem pristopu pravil k obdelavi naravnega jezika. Drug pristop je ignoriranje pomena besed in _namesto tega uporaba strojnega učenja za zaznavanje vzorcev_. To lahko deluje pri prevajanju, če imate veliko besedila (*korpus*) ali besedil (*korpusi*) v izvornih in ciljnih jezikih. + +Na primer, razmislite o primeru *Prevzetnost in pristranost*, znanega angleškega romana, ki ga je leta 1813 napisala Jane Austen. Če preučite knjigo v angleščini in njen človeški prevod v *francoščino*, lahko zaznate fraze v enem jeziku, ki so _idiomatično_ prevedene v drugega. To boste storili čez trenutek. + +Na primer, ko se angleška fraza `I have no money` dobesedno prevede v francoščino, postane `Je n'ai pas de monnaie`. "Monnaie" je zavajajoča francoska 'lažna sorodnica', saj 'money' in 'monnaie' nista sinonima. Boljši prevod, ki bi ga naredil človek, bi bil `Je n'ai pas d'argent`, ker bolje izraža pomen, da nimate denarja (namesto 'drobnega denarja', kar pomeni 'monnaie'). + +![monnaie](../../../../6-NLP/3-Translation-Sentiment/images/monnaie.png) + +> Slika avtorice [Jen Looper](https://twitter.com/jenlooper) + +Če ima model strojnega učenja dovolj človeških prevodov za izdelavo modela, lahko izboljša natančnost prevodov z identifikacijo pogostih vzorcev v besedilih, ki so jih prej prevedli strokovni govorci obeh jezikov. + +### Naloga - prevajanje + +Uporabite lahko `TextBlob` za prevajanje stavkov. Poskusite slavni prvi stavek iz **Prevzetnosti in pristranosti**: + +```python +from textblob import TextBlob + +blob = TextBlob( + "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!" +) +print(blob.translate(to="fr")) + +``` + +`TextBlob` naredi precej dober prevod: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!". + +Lahko bi trdili, da je prevod TextBlob-a dejansko veliko natančnejši od francoskega prevoda knjige iz leta 1932, ki sta ga naredila V. Leconte in Ch. Pressoir: + +"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles." + +V tem primeru prevod, ki ga vodi strojno učenje, opravi boljše delo kot človeški prevajalec, ki nepotrebno dodaja besede v ustih originalnega avtorja za 'jasnost'. + +> Kaj se tukaj dogaja? In zakaj je TextBlob tako dober pri prevajanju? No, v ozadju uporablja Google Translate, sofisticirano umetno inteligenco, ki lahko analizira milijone fraz za napovedovanje najboljših nizov za določeno nalogo. Tukaj ni nič ročnega, za uporabo `blob.translate` pa potrebujete internetno povezavo. + +✅ Poskusite še nekaj stavkov. Kaj je boljše, strojno učenje ali človeški prevod? V katerih primerih? + +## Analiza sentimenta + +Drugo področje, kjer strojno učenje deluje zelo dobro, je analiza sentimenta. Pristop brez strojnega učenja k sentimentu je identificiranje besed in fraz, ki so 'pozitivne' in 'negativne'. Nato, glede na novo besedilo, izračunajte skupno vrednost pozitivnih, negativnih in nevtralnih besed za identifikacijo splošnega sentimenta. + +Ta pristop je enostavno zavajati, kot ste morda videli v nalogi Marvin - stavek `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` je sarkastičen, negativno naravnan stavek, vendar preprost algoritem zazna 'great', 'wonderful', 'glad' kot pozitivne in 'waste', 'lost' ter 'dark' kot negativne. Splošni sentiment je zmeden zaradi teh nasprotujočih si besed. + +✅ Ustavite se za trenutek in razmislite, kako kot ljudje izražamo sarkazem. Ton glasu igra veliko vlogo. Poskusite izgovoriti frazo "Well, that film was awesome" na različne načine, da odkrijete, kako vaš glas izraža pomen. + +### Pristopi strojnega učenja + +Pristop strojnega učenja bi bil ročno zbrati negativna in pozitivna besedila - tvite, ocene filmov ali karkoli, kjer je človek podal oceno *in* pisno mnenje. Nato se lahko na mnenja in ocene uporabijo tehnike NLP, tako da se pojavijo vzorci (npr. pozitivne ocene filmov pogosto vsebujejo frazo 'Oscar worthy' bolj kot negativne ocene filmov, ali pozitivne ocene restavracij pogosteje uporabljajo 'gourmet' kot 'disgusting'). + +> ⚖️ **Primer**: Če bi delali v pisarni politika in bi se razpravljalo o novem zakonu, bi volivci morda pisali pisarni z e-poštnimi sporočili v podporo ali proti določenemu novemu zakonu. Recimo, da bi vam bilo dodeljeno branje teh e-poštnih sporočil in razvrščanje v 2 kupčka, *za* in *proti*. Če bi bilo veliko e-poštnih sporočil, bi vas lahko preplavilo branje vseh. Ali ne bi bilo lepo, če bi bot lahko prebral vsa sporočila namesto vas, jih razumel in vam povedal, v kateri kupček spada vsako sporočilo? +> +> Eden od načinov za dosego tega je uporaba strojnega učenja. Model bi trenirali z delom *proti* e-poštnih sporočil in delom *za* e-poštnih sporočil. Model bi težil k povezovanju fraz in besed z nasprotno stranjo in stranjo za, *vendar ne bi razumel nobene vsebine*, le da se določene besede in vzorci pogosteje pojavljajo v *proti* ali *za* e-poštnem sporočilu. Testirali bi ga z nekaterimi e-poštnimi sporočili, ki jih niste uporabili za treniranje modela, in preverili, ali je prišel do enakega zaključka kot vi. Ko bi bili zadovoljni z natančnostjo modela, bi lahko obdelali prihodnja e-poštna sporočila, ne da bi morali prebrati vsakega posebej. + +✅ Ali se vam ta proces zdi podoben procesom, ki ste jih uporabljali v prejšnjih lekcijah? + +## Naloga - sentimentalni stavki + +Sentiment se meri z *polarizacijo* od -1 do 1, kar pomeni, da je -1 najbolj negativni sentiment, 1 pa najbolj pozitivni. Sentiment se meri tudi z oceno od 0 do 1 za objektivnost (0) in subjektivnost (1). + +Ponovno si oglejte *Prevzetnost in pristranost* Jane Austen. Besedilo je na voljo tukaj na [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm). Spodnji vzorec prikazuje kratek program, ki analizira sentiment prvega in zadnjega stavka iz knjige ter prikaže njegovo polarizacijo sentimenta in oceno subjektivnosti/objektivnosti. + +Uporabiti morate knjižnico `TextBlob` (opisano zgoraj) za določanje `sentimenta` (ni vam treba napisati lastnega kalkulatorja sentimenta) v naslednji nalogi. + +```python +from textblob import TextBlob + +quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.""" + +quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them.""" + +sentiment1 = TextBlob(quote1).sentiment +sentiment2 = TextBlob(quote2).sentiment + +print(quote1 + " has a sentiment of " + str(sentiment1)) +print(quote2 + " has a sentiment of " + str(sentiment2)) +``` + +Vidite naslednji izhod: + +```output +It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146) + +Darcy, as well as Elizabeth, really loved them; and they were + both ever sensible of the warmest gratitude towards the persons + who, by bringing her into Derbyshire, had been the means of + uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8) +``` + +## Izziv - preverite polarizacijo sentimenta + +Vaša naloga je določiti, ali ima *Prevzetnost in pristranost* več absolutno pozitivnih stavkov kot absolutno negativnih. Za to nalogo lahko predpostavite, da je polarizacijska ocena 1 ali -1 absolutno pozitivna ali negativna. + +**Koraki:** + +1. Prenesite [kopijo Prevzetnosti in pristranosti](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) s Project Gutenberg kot .txt datoteko. Odstranite metapodatke na začetku in koncu datoteke, tako da ostane samo originalno besedilo. +2. Odprite datoteko v Pythonu in izvlecite vsebino kot niz. +3. Ustvarite TextBlob z nizom knjige. +4. Analizirajte vsak stavek v knjigi v zanki. + 1. Če je polarizacija 1 ali -1, shranite stavek v seznam pozitivnih ali negativnih sporočil. +5. Na koncu natisnite vse pozitivne stavke in negativne stavke (ločeno) ter število vsakega. + +Tukaj je vzorec [rešitve](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb). + +✅ Preverjanje znanja + +1. Sentiment temelji na besedah, uporabljenih v stavku, vendar ali koda *razume* besede? +2. Ali menite, da je polarizacija sentimenta natančna, oziroma ali se *strinjate* z ocenami? + 1. Zlasti, ali se strinjate ali ne strinjate z absolutno **pozitivno** polarizacijo naslednjih stavkov? + * “What an excellent father you have, girls!” said she, when the door was shut. + * “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect. + * How wonderfully these sort of things occur! + * I have the greatest dislike in the world to that sort of thing. + * Charlotte is an excellent manager, I dare say. + * “This is delightful indeed! + * I am so happy! + * Your idea of the ponies is delightful. + 2. Naslednji 3 stavki so bili ocenjeni z absolutno pozitivnim sentimentom, vendar ob natančnem branju niso pozitivni stavki. Zakaj je analiza sentimenta menila, da so pozitivni stavki? + * Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power. + * If I could but see you as happy! + * Our distress, my dear Lizzy, is very great. + 3. Ali se strinjate ali ne strinjate z absolutno **negativno** polarizacijo naslednjih stavkov? + - Everybody is disgusted with his pride. + - “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful. + - The pause was to Elizabeth’s feelings dreadful. + - It would be dreadful! + +✅ Vsak ljubitelj Jane Austen bo razumel, da pogosto uporablja svoje knjige za kritiko bolj smešnih vidikov angleške regentske družbe. Elizabeth Bennett, glavna junakinja v *Prevzetnosti in pristranosti*, je ostra opazovalka družbe (kot avtorica) in njen jezik je pogosto močno niansiran. Tudi gospod Darcy (ljubezenski interes v zgodbi) opazi Elizabethino igrivo in dražilno uporabo jezika: "I have had the pleasure of your acquaintance long enough to know that you find great enjoyment in occasionally professing opinions which in fact are not your own." + +--- + +## 🚀Izziv + +Ali lahko Marvina še izboljšate z ekstrakcijo drugih značilnosti iz uporabniškega vnosa? + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje +Obstaja veliko načinov za pridobivanje sentimenta iz besedila. Pomislite na poslovne aplikacije, ki bi lahko uporabile to tehniko. Razmislite o tem, kako lahko gre kaj narobe. Preberite več o naprednih sistemih, pripravljenih za podjetja, ki analizirajo sentiment, kot je [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott). Preizkusite nekaj stavkov iz "Prevzetnost in pristranost" zgoraj in preverite, ali lahko zazna nianse. + +## Naloga + +[Pesniška svoboda](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/3-Translation-Sentiment/assignment.md b/translations/sl/6-NLP/3-Translation-Sentiment/assignment.md new file mode 100644 index 00000000..68b590d5 --- /dev/null +++ b/translations/sl/6-NLP/3-Translation-Sentiment/assignment.md @@ -0,0 +1,25 @@ + +# Pesniška licenca + +## Navodila + +V [tem zvezku](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) lahko najdete več kot 500 pesmi Emily Dickinson, ki so bile predhodno analizirane glede na sentiment z uporabo Azure text analytics. Uporabite ta nabor podatkov in ga analizirajte z uporabo tehnik, opisanih v lekciji. Ali predlagani sentiment pesmi ustreza odločitvi bolj sofisticirane Azure storitve? Zakaj ali zakaj ne, po vašem mnenju? Ali vas kaj preseneti? + +## Merila + +| Merilo | Izjemno | Zadostno | Potrebno izboljšanje | +| -------- | ----------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------ | +| | Predstavljen je zvezek s temeljito analizo vzorčnega izpisa avtorja | Zvezek je nepopoln ali ne izvaja analize | Zvezek ni predstavljen | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/3-Translation-Sentiment/solution/Julia/README.md b/translations/sl/6-NLP/3-Translation-Sentiment/solution/Julia/README.md new file mode 100644 index 00000000..53a31da4 --- /dev/null +++ b/translations/sl/6-NLP/3-Translation-Sentiment/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto za rezervacijo + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/3-Translation-Sentiment/solution/R/README.md b/translations/sl/6-NLP/3-Translation-Sentiment/solution/R/README.md new file mode 100644 index 00000000..cc315bc1 --- /dev/null +++ b/translations/sl/6-NLP/3-Translation-Sentiment/solution/R/README.md @@ -0,0 +1,15 @@ + +to je začasno nadomestilo + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/4-Hotel-Reviews-1/README.md b/translations/sl/6-NLP/4-Hotel-Reviews-1/README.md new file mode 100644 index 00000000..fe8598fd --- /dev/null +++ b/translations/sl/6-NLP/4-Hotel-Reviews-1/README.md @@ -0,0 +1,417 @@ + +# Analiza sentimenta s hotelskimi ocenami - obdelava podatkov + +V tem poglavju boste uporabili tehnike iz prejšnjih lekcij za izvedbo raziskovalne analize velikega nabora podatkov. Ko boste pridobili dobro razumevanje uporabnosti različnih stolpcev, se boste naučili: + +- kako odstraniti nepotrebne stolpce +- kako izračunati nove podatke na podlagi obstoječih stolpcev +- kako shraniti nastali nabor podatkov za uporabo v končnem izzivu + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +### Uvod + +Do sedaj ste se naučili, da so besedilni podatki precej drugačni od numeričnih podatkov. Če gre za besedilo, ki ga je napisal ali izgovoril človek, ga je mogoče analizirati za iskanje vzorcev, frekvenc, sentimenta in pomena. Ta lekcija vas popelje v resničen nabor podatkov z resničnim izzivom: **[515K Hotelske ocene v Evropi](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)**, ki vključuje [CC0: javno domeno](https://creativecommons.org/publicdomain/zero/1.0/). Podatki so bili pridobljeni iz Booking.com iz javnih virov. Ustvarjalec nabora podatkov je Jiashen Liu. + +### Priprava + +Potrebovali boste: + +* Zmožnost izvajanja .ipynb zvezkov z uporabo Python 3 +* pandas +* NLTK, [ki ga morate namestiti lokalno](https://www.nltk.org/install.html) +* Nabor podatkov, ki je na voljo na Kaggle [515K Hotelske ocene v Evropi](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe). Velikost datoteke po razpakiranju je približno 230 MB. Prenesite jo v korensko mapo `/data`, povezano s temi lekcijami NLP. + +## Raziskovalna analiza podatkov + +Ta izziv predvideva, da gradite hotelskega priporočilnega bota z uporabo analize sentimenta in ocen gostov. Nabor podatkov, ki ga boste uporabili, vključuje ocene 1493 različnih hotelov v 6 mestih. + +Z uporabo Pythona, nabora hotelskih ocen in analize sentimenta NLTK lahko ugotovite: + +* Katere so najpogosteje uporabljene besede in fraze v ocenah? +* Ali se uradne *oznake* hotela ujemajo z ocenami (npr. ali so bolj negativne ocene za določen hotel pri *Družinah z majhnimi otroki* kot pri *Samostojnih popotnikih*, kar morda nakazuje, da je hotel bolj primeren za *Samostojne popotnike*)? +* Ali se ocene sentimenta NLTK 'strinjajo' s številčno oceno hotelskega ocenjevalca? + +#### Nabor podatkov + +Raziskujmo nabor podatkov, ki ste ga prenesli in shranili lokalno. Odprite datoteko v urejevalniku, kot je VS Code ali celo Excel. + +Naslovi stolpcev v naboru podatkov so naslednji: + +*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng* + +Tukaj so razvrščeni na način, ki je morda lažji za pregled: +##### Stolpci hotela + +* `Hotel_Name`, `Hotel_Address`, `lat` (geografska širina), `lng` (geografska dolžina) + * Z uporabo *lat* in *lng* lahko s Pythonom narišete zemljevid, ki prikazuje lokacije hotelov (morda barvno kodirane za negativne in pozitivne ocene) + * Hotel_Address ni očitno uporaben za nas, zato ga bomo verjetno zamenjali z državo za lažje razvrščanje in iskanje + +**Stolpci meta-ocen hotela** + +* `Average_Score` + * Po navedbah ustvarjalca nabora podatkov ta stolpec predstavlja *Povprečno oceno hotela, izračunano na podlagi najnovejšega komentarja v zadnjem letu*. To se zdi nenavaden način izračuna ocene, vendar so to pridobljeni podatki, zato jih za zdaj sprejmemo kot takšne. + + ✅ Glede na druge stolpce v teh podatkih, ali lahko pomislite na drug način za izračun povprečne ocene? + +* `Total_Number_of_Reviews` + * Skupno število ocen, ki jih je hotel prejel - ni jasno (brez pisanja kode), ali se to nanaša na ocene v naboru podatkov. +* `Additional_Number_of_Scoring` + * To pomeni, da je bila podana ocena, vendar ocenjevalec ni napisal pozitivne ali negativne ocene. + +**Stolpci ocen** + +- `Reviewer_Score` + - To je številčna vrednost z največ 1 decimalnim mestom med minimalno in maksimalno vrednostjo 2.5 in 10 + - Ni pojasnjeno, zakaj je najnižja možna ocena 2.5 +- `Negative_Review` + - Če ocenjevalec ni napisal ničesar, bo to polje vsebovalo "**No Negative**" + - Upoštevajte, da lahko ocenjevalec napiše pozitivno oceno v stolpec Negative review (npr. "ni nič slabega glede tega hotela") +- `Review_Total_Negative_Word_Counts` + - Višje število negativnih besed nakazuje nižjo oceno (brez preverjanja sentimenta) +- `Positive_Review` + - Če ocenjevalec ni napisal ničesar, bo to polje vsebovalo "**No Positive**" + - Upoštevajte, da lahko ocenjevalec napiše negativno oceno v stolpec Positive review (npr. "ni nič dobrega glede tega hotela") +- `Review_Total_Positive_Word_Counts` + - Višje število pozitivnih besed nakazuje višjo oceno (brez preverjanja sentimenta) +- `Review_Date` in `days_since_review` + - Svežino ali zastarelost ocene bi lahko uporabili kot merilo (starejše ocene morda niso tako natančne kot novejše, ker se je upravljanje hotela spremenilo, izvedene so bile prenove, dodan je bil bazen itd.) +- `Tags` + - To so kratki opisi, ki jih ocenjevalec lahko izbere za opis vrste gosta (npr. samostojni ali družinski), vrste sobe, dolžine bivanja in načina oddaje ocene. + - Na žalost je uporaba teh oznak problematična, preverite spodnji razdelek, ki obravnava njihovo uporabnost. + +**Stolpci ocenjevalca** + +- `Total_Number_of_Reviews_Reviewer_Has_Given` + - To bi lahko bil dejavnik v priporočilnem modelu, na primer, če bi lahko ugotovili, da so bolj plodni ocenjevalci s stotinami ocen bolj verjetno negativni kot pozitivni. Vendar ocenjevalec posamezne ocene ni identificiran z edinstveno kodo, zato ga ni mogoče povezati z naborom ocen. Obstaja 30 ocenjevalcev s 100 ali več ocenami, vendar je težko videti, kako bi to lahko pomagalo priporočilnemu modelu. +- `Reviewer_Nationality` + - Nekateri ljudje morda mislijo, da so določene narodnosti bolj verjetno podale pozitivno ali negativno oceno zaradi nacionalne nagnjenosti. Bodite previdni pri vključevanju takšnih anekdotičnih pogledov v svoje modele. To so nacionalni (in včasih rasni) stereotipi, vsak ocenjevalec pa je bil posameznik, ki je napisal oceno na podlagi svoje izkušnje. Ta je bila morda filtrirana skozi številne leče, kot so njihova prejšnja bivanja v hotelih, prepotovana razdalja in njihova osebna temperamentnost. Težko je upravičiti razmišljanje, da je bila njihova narodnost razlog za oceno. + +##### Primeri + +| Povprečna ocena | Skupno število ocen | Ocena ocenjevalca | Negativna
                      ocena | Pozitivna ocena | Oznake | +| -------------- | ---------------------- | ---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- | +| 7.8 | 1945 | 2.5 | Trenutno to ni hotel, ampak gradbišče. Terorizirali so me od zgodnjega jutra in ves dan z nesprejemljivim gradbenim hrupom, medtem ko sem počival po dolgem potovanju in delal v sobi. Ljudje so delali ves dan, npr. z udarnimi kladivi v sosednjih sobah. Prosil sem za zamenjavo sobe, vendar ni bilo na voljo tihe sobe. Da bi bilo še huje, so mi zaračunali preveč. Odjavil sem se zvečer, saj sem moral zgodaj zjutraj na let in prejel ustrezen račun. Dan kasneje je hotel brez mojega soglasja izvedel dodatno bremenitev, ki je presegala ceno rezervacije. To je grozno mesto. Ne kaznujte se z rezervacijo tukaj. | Nič. Grozno mesto. Izogibajte se. | Poslovno potovanje Par Standardna dvoposteljna soba Bivanje 2 noči | + +Kot lahko vidite, gost ni imel prijetnega bivanja v tem hotelu. Hotel ima dobro povprečno oceno 7.8 in 1945 ocen, vendar mu je ta ocenjevalec dal oceno 2.5 in napisal 115 besed o tem, kako negativno je bilo njegovo bivanje. Če v stolpcu Positive_Review ni napisal ničesar, bi lahko sklepali, da ni bilo nič pozitivnega, vendar je napisal 7 opozorilnih besed. Če bi šteli samo besede namesto pomena ali sentimenta besed, bi lahko imeli izkrivljen pogled na namen ocenjevalca. Nenavadno je, da je njihova ocena 2.5 zmedena, saj če je bilo bivanje v hotelu tako slabo, zakaj sploh dati kakršne koli točke? Pri podrobnem pregledu nabora podatkov boste videli, da je najnižja možna ocena 2.5, ne 0. Najvišja možna ocena je 10. + +##### Oznake + +Kot je bilo omenjeno zgoraj, se na prvi pogled zdi ideja uporabe `Tags` za kategorizacijo podatkov smiselna. Na žalost te oznake niso standardizirane, kar pomeni, da so v določenem hotelu možnosti *Enoposteljna soba*, *Dvoposteljna soba* in *Zakonska soba*, v naslednjem hotelu pa *Deluxe enoposteljna soba*, *Klasična soba Queen* in *Izvrstna soba King*. To so morda iste stvari, vendar je toliko različic, da izbira postane: + +1. Poskus spremeniti vse izraze v en sam standard, kar je zelo težko, ker ni jasno, kakšna bi bila pot pretvorbe v vsakem primeru (npr. *Klasična enoposteljna soba* se preslika v *Enoposteljna soba*, vendar *Superior Queen soba z vrtom ali pogledom na mesto* je veliko težje preslikati) + +1. Lahko uporabimo pristop NLP in izmerimo pogostost določenih izrazov, kot so *Samostojni*, *Poslovni popotnik* ali *Družina z majhnimi otroki*, kot se nanašajo na vsak hotel, ter to vključimo v priporočilo + +Oznake so običajno (vendar ne vedno) eno polje, ki vsebuje seznam 5 do 6 vrednosti, ločenih z vejicami, ki se nanašajo na *Vrsto potovanja*, *Vrsto gostov*, *Vrsto sobe*, *Število nočitev* in *Vrsto naprave, na kateri je bila oddana ocena*. Ker pa nekateri ocenjevalci ne izpolnijo vsakega polja (morda pustijo eno prazno), vrednosti niso vedno v istem vrstnem redu. + +Na primer, vzemimo *Vrsto skupine*. V tem polju v stolpcu `Tags` je 1025 edinstvenih možnosti, na žalost pa se le nekatere nanašajo na skupino (nekatere so vrsta sobe itd.). Če filtrirate samo tiste, ki omenjajo družino, rezultati vsebujejo veliko rezultatov tipa *Družinska soba*. Če vključite izraz *z*, tj. štejete vrednosti *Družina z*, so rezultati boljši, saj več kot 80.000 od 515.000 rezultatov vsebuje frazo "Družina z majhnimi otroki" ali "Družina z starejšimi otroki". + +To pomeni, da stolpec oznak ni popolnoma neuporaben za nas, vendar bo potrebno nekaj dela, da ga naredimo uporabnega. + +##### Povprečna ocena hotela + +Obstaja nekaj nenavadnosti ali neskladnosti z naborom podatkov, ki jih ne morem razložiti, vendar so tukaj prikazane, da se jih zavedate pri gradnji svojih modelov. Če jih razložite, nam to prosim sporočite v razdelku za razpravo! + +Nabor podatkov ima naslednje stolpce, povezane s povprečno oceno in številom ocen: + +1. Hotel_Name +2. Additional_Number_of_Scoring +3. Average_Score +4. Total_Number_of_Reviews +5. Reviewer_Score + +Hotel z največ ocenami v tem naboru podatkov je *Britannia International Hotel Canary Wharf* s 4789 ocenami od 515.000. Če pa pogledamo vrednost `Total_Number_of_Reviews` za ta hotel, je 9086. Lahko bi sklepali, da obstaja veliko več ocen brez besedilnih ocen, zato bi morda morali dodati vrednost stolpca `Additional_Number_of_Scoring`. Ta vrednost je 2682, in če jo dodamo k 4789, dobimo 7471, kar je še vedno 1615 manj od `Total_Number_of_Reviews`. + +Če vzamete stolpec `Average_Score`, bi lahko sklepali, da gre za povprečje ocen v naboru podatkov, vendar opis iz Kaggle pravi: "*Povprečna ocena hotela, izračunana na podlagi najnovejšega komentarja v zadnjem letu*". To se ne zdi zelo uporabno, vendar lahko izračunamo svoje povprečje na podlagi ocen v naboru podatkov. Če vzamemo isti hotel kot primer, je podana povprečna ocena hotela 7.1, vendar je izračunana ocena (povprečna ocena ocenjevalca *v* naboru podatkov) 6.8. To je blizu, vendar ni enaka vrednost, in lahko le ugibamo, da so ocene podane v ocenah `Additional_Number_of_Scoring` povečale povprečje na 7.1. Na žalost brez načina za testiranje ali dokazovanje te trditve je težko uporabiti ali zaupati `Average_Score`, `Additional_Number_of_Scoring` in `Total_Number_of_Reviews`, ko temeljijo na podatkih, ki jih nimamo. + +Da bi stvari še bolj zapletli, ima hotel z drugim največjim številom ocen izračunano povprečno oceno 8.12, medtem ko je podana povprečna ocena v naboru podatkov 8.1. Ali je ta pravilna ocena naključje ali je prvi hotel neskladje? + +Ob možnosti, da bi ti hoteli lahko bili odstopajoči, in da morda večina vrednosti ustreza (nekateri pa ne iz nekega razloga), bomo v naslednjem koraku napisali kratek program za raziskovanje vrednosti v naboru podatkov in določitev pravilne uporabe (ali neuporabe) vrednosti. +> 🚨 Opozorilo + +> Pri delu s tem naborom podatkov boste pisali kodo, ki izračuna nekaj iz besedila, ne da bi morali sami prebrati ali analizirati besedilo. To je bistvo NLP-ja: interpretacija pomena ali sentimenta brez potrebe po človeškem posredovanju. Vendar pa obstaja možnost, da boste prebrali nekatere negativne ocene. Svetoval bi vam, da tega ne počnete, saj ni potrebno. Nekatere od teh ocen so nesmiselne ali nepomembne negativne ocene hotelov, kot na primer: "Vreme ni bilo dobro," kar je zunaj nadzora hotela ali kogarkoli drugega. Toda obstaja tudi temna plat nekaterih ocen. Včasih so negativne ocene rasistične, seksistične ali starostno diskriminatorne. To je žalostno, vendar pričakovano v naboru podatkov, pridobljenem z javne spletne strani. Nekateri ocenjevalci pustijo ocene, ki bi jih lahko dojemali kot neprijetne, nelagodne ali vznemirljive. Bolje je, da koda izmeri sentiment, kot da jih sami preberete in se ob tem vznemirite. Kljub temu gre za manjšino, ki piše takšne stvari, vendar vseeno obstajajo. +## Vaja - Raziskovanje podatkov +### Nalaganje podatkov + +Dovolj je bilo vizualnega pregledovanja podatkov, zdaj boste napisali nekaj kode in dobili odgovore! Ta del uporablja knjižnico pandas. Vaša prva naloga je zagotoviti, da lahko naložite in preberete podatke iz datoteke CSV. Knjižnica pandas ima hiter nalagalnik za CSV, rezultat pa je shranjen v dataframe, kot v prejšnjih lekcijah. CSV, ki ga nalagamo, ima več kot pol milijona vrstic, vendar le 17 stolpcev. Pandas vam ponuja veliko zmogljivih načinov za interakcijo z dataframe, vključno z možnostjo izvajanja operacij na vsaki vrstici. + +Od tu naprej v tej lekciji bodo vključeni odlomki kode, razlage kode in razprave o tem, kaj rezultati pomenijo. Uporabite priloženi _notebook.ipynb_ za svojo kodo. + +Začnimo z nalaganjem datoteke s podatki, ki jo boste uporabljali: + +```python +# Load the hotel reviews from CSV +import pandas as pd +import time +# importing time so the start and end time can be used to calculate file loading time +print("Loading data file now, this could take a while depending on file size") +start = time.time() +# df is 'DataFrame' - make sure you downloaded the file to the data folder +df = pd.read_csv('../../data/Hotel_Reviews.csv') +end = time.time() +print("Loading took " + str(round(end - start, 2)) + " seconds") +``` + +Ko so podatki naloženi, lahko na njih izvajamo operacije. To kodo obdržite na vrhu svojega programa za naslednji del. + +## Raziskovanje podatkov + +V tem primeru so podatki že *čisti*, kar pomeni, da so pripravljeni za delo in ne vsebujejo znakov v drugih jezikih, ki bi lahko povzročili težave algoritmom, ki pričakujejo samo angleške znake. + +✅ Morda boste morali delati s podatki, ki zahtevajo začetno obdelavo, da jih formatirate, preden uporabite tehnike NLP, vendar tokrat ne. Če bi morali, kako bi obravnavali ne-angleške znake? + +Vzemite si trenutek, da se prepričate, da lahko po nalaganju podatkov z njimi raziskujete s kodo. Zelo enostavno je osredotočiti se na stolpca `Negative_Review` in `Positive_Review`. Napolnjena sta z naravnim besedilom, ki ga lahko obdelajo vaši NLP algoritmi. Ampak počakajte! Preden se lotite NLP in sentimenta, sledite spodnji kodi, da ugotovite, ali vrednosti v podatkovnem naboru ustrezajo vrednostim, ki jih izračunate s pandas. + +## Operacije na dataframe + +Prva naloga v tej lekciji je preveriti, ali so naslednje trditve pravilne, tako da napišete kodo, ki preučuje dataframe (brez spreminjanja). + +> Kot pri mnogih programerskih nalogah obstaja več načinov za izvedbo, vendar je dobro priporočilo, da to storite na najpreprostejši in najlažji način, še posebej, če bo to lažje razumeti, ko se boste kasneje vrnili k tej kodi. Pri dataframe obstaja obsežen API, ki pogosto ponuja učinkovit način za dosego želenega. + +Obravnavajte naslednja vprašanja kot naloge kodiranja in jih poskusite rešiti brez gledanja rešitve. + +1. Izpišite *obliko* dataframe, ki ste ga pravkar naložili (oblika je število vrstic in stolpcev). +2. Izračunajte frekvenčno število za narodnosti ocenjevalcev: + 1. Koliko različnih vrednosti je v stolpcu `Reviewer_Nationality` in katere so? + 2. Katera narodnost ocenjevalcev je najpogostejša v podatkovnem naboru (izpišite državo in število ocen)? + 3. Katere so naslednjih 10 najpogostejših narodnosti in njihovo frekvenčno število? +3. Kateri hotel je bil najpogosteje ocenjen za vsako od 10 najpogostejših narodnosti ocenjevalcev? +4. Koliko ocen je na hotel (frekvenčno število ocen na hotel) v podatkovnem naboru? +5. Čeprav obstaja stolpec `Average_Score` za vsak hotel v podatkovnem naboru, lahko izračunate tudi povprečno oceno (pridobite povprečje vseh ocen ocenjevalcev v podatkovnem naboru za vsak hotel). Dodajte nov stolpec v svoj dataframe z naslovom stolpca `Calc_Average_Score`, ki vsebuje to izračunano povprečje. +6. Ali imajo hoteli enako (zaokroženo na 1 decimalno mesto) vrednost `Average_Score` in `Calc_Average_Score`? + 1. Poskusite napisati funkcijo v Pythonu, ki sprejme Series (vrstico) kot argument in primerja vrednosti, pri čemer izpiše sporočilo, ko vrednosti niso enake. Nato uporabite metodo `.apply()`, da obdelate vsako vrstico s funkcijo. +7. Izračunajte in izpišite, koliko vrstic ima stolpec `Negative_Review` z vrednostjo "No Negative". +8. Izračunajte in izpišite, koliko vrstic ima stolpec `Positive_Review` z vrednostjo "No Positive". +9. Izračunajte in izpišite, koliko vrstic ima stolpec `Positive_Review` z vrednostjo "No Positive" **in** stolpec `Negative_Review` z vrednostjo "No Negative". + +### Odgovori s kodo + +1. Izpišite *obliko* dataframe, ki ste ga pravkar naložili (oblika je število vrstic in stolpcev). + + ```python + print("The shape of the data (rows, cols) is " + str(df.shape)) + > The shape of the data (rows, cols) is (515738, 17) + ``` + +2. Izračunajte frekvenčno število za narodnosti ocenjevalcev: + + 1. Koliko različnih vrednosti je v stolpcu `Reviewer_Nationality` in katere so? + 2. Katera narodnost ocenjevalcev je najpogostejša v podatkovnem naboru (izpišite državo in število ocen)? + + ```python + # value_counts() creates a Series object that has index and values in this case, the country and the frequency they occur in reviewer nationality + nationality_freq = df["Reviewer_Nationality"].value_counts() + print("There are " + str(nationality_freq.size) + " different nationalities") + # print first and last rows of the Series. Change to nationality_freq.to_string() to print all of the data + print(nationality_freq) + + There are 227 different nationalities + United Kingdom 245246 + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + ... + Comoros 1 + Palau 1 + Northern Mariana Islands 1 + Cape Verde 1 + Guinea 1 + Name: Reviewer_Nationality, Length: 227, dtype: int64 + ``` + + 3. Katere so naslednjih 10 najpogostejših narodnosti in njihovo frekvenčno število? + + ```python + print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.") + # Notice there is a leading space on the values, strip() removes that for printing + # What is the top 10 most common nationalities and their frequencies? + print("The next 10 highest frequency reviewer nationalities are:") + print(nationality_freq[1:11].to_string()) + + The highest frequency reviewer nationality is United Kingdom with 245246 reviews. + The next 10 highest frequency reviewer nationalities are: + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + Saudi Arabia 8951 + Netherlands 8772 + Switzerland 8678 + Germany 7941 + Canada 7894 + France 7296 + ``` + +3. Kateri hotel je bil najpogosteje ocenjen za vsako od 10 najpogostejših narodnosti ocenjevalcev? + + ```python + # What was the most frequently reviewed hotel for the top 10 nationalities + # Normally with pandas you will avoid an explicit loop, but wanted to show creating a new dataframe using criteria (don't do this with large amounts of data because it could be very slow) + for nat in nationality_freq[:10].index: + # First, extract all the rows that match the criteria into a new dataframe + nat_df = df[df["Reviewer_Nationality"] == nat] + # Now get the hotel freq + freq = nat_df["Hotel_Name"].value_counts() + print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.") + + The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews. + The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews. + The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews. + The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews. + The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews. + The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews. + The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews. + The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews. + The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews. + The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews. + ``` + +4. Koliko ocen je na hotel (frekvenčno število ocen na hotel) v podatkovnem naboru? + + ```python + # First create a new dataframe based on the old one, removing the uneeded columns + hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1) + + # Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found + hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count') + + # Get rid of all the duplicated rows + hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"]) + display(hotel_freq_df) + ``` + | Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found | + | :----------------------------------------: | :---------------------: | :-----------------: | + | Britannia International Hotel Canary Wharf | 9086 | 4789 | + | Park Plaza Westminster Bridge London | 12158 | 4169 | + | Copthorne Tara Hotel London Kensington | 7105 | 3578 | + | ... | ... | ... | + | Mercure Paris Porte d Orleans | 110 | 10 | + | Hotel Wagner | 135 | 10 | + | Hotel Gallitzinberg | 173 | 8 | + + Morda boste opazili, da se rezultati *štetja v podatkovnem naboru* ne ujemajo z vrednostjo v `Total_Number_of_Reviews`. Ni jasno, ali ta vrednost v podatkovnem naboru predstavlja skupno število ocen, ki jih je hotel imel, vendar niso bile vse pridobljene, ali pa je bil uporabljen kakšen drug izračun. `Total_Number_of_Reviews` se v modelu ne uporablja zaradi te nejasnosti. + +5. Čeprav obstaja stolpec `Average_Score` za vsak hotel v podatkovnem naboru, lahko izračunate tudi povprečno oceno (pridobite povprečje vseh ocen ocenjevalcev v podatkovnem naboru za vsak hotel). Dodajte nov stolpec v svoj dataframe z naslovom stolpca `Calc_Average_Score`, ki vsebuje to izračunano povprečje. Izpišite stolpce `Hotel_Name`, `Average_Score` in `Calc_Average_Score`. + + ```python + # define a function that takes a row and performs some calculation with it + def get_difference_review_avg(row): + return row["Average_Score"] - row["Calc_Average_Score"] + + # 'mean' is mathematical word for 'average' + df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + + # Add a new column with the difference between the two average scores + df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1) + + # Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel) + review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"]) + + # Sort the dataframe to find the lowest and highest average score difference + review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"]) + + display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]]) + ``` + + Morda se sprašujete o vrednosti `Average_Score` in zakaj se včasih razlikuje od izračunanega povprečja. Ker ne moremo vedeti, zakaj se nekatere vrednosti ujemajo, druge pa imajo razlike, je v tem primeru najvarneje uporabiti ocene, ki jih imamo, za izračun povprečja sami. Kljub temu so razlike običajno zelo majhne, tukaj so hoteli z največjim odstopanjem med povprečjem iz podatkovnega niza in izračunanim povprečjem: + + | Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Name | + | :----------------------: | :-----------: | :----------------: | ------------------------------------------: | + | -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria | + | -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery | + | -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans | + | -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel | + | -0.5 | 7.0 | 7.5 | Hotel Royal Elys es | + | ... | ... | ... | ... | + | 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre | + | 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur | + | 0.9 | 6.8 | 5.9 | Villa Eugenie | + | 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux | + | 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar | + + Ker ima le 1 hotel razliko v oceni večjo od 1, to pomeni, da lahko verjetno ignoriramo razliko in uporabimo izračunano povprečno oceno. + +6. Izračunajte in izpišite, koliko vrstic ima stolpec `Negative_Review` z vrednostjo "No Negative". + +7. Izračunajte in izpišite, koliko vrstic ima stolpec `Positive_Review` z vrednostjo "No Positive". + +8. Izračunajte in izpišite, koliko vrstic ima stolpec `Positive_Review` z vrednostjo "No Positive" **in** stolpec `Negative_Review` z vrednostjo "No Negative". + + ```python + # with lambdas: + start = time.time() + no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1) + print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index))) + + no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index))) + + both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index))) + end = time.time() + print("Lambdas took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Lambdas took 9.64 seconds + ``` + +## Drug način + +Drug način za štetje elementov brez Lambdas in uporaba funkcije sum za štetje vrstic: + + ```python + # without lambdas (using a mixture of notations to show you can use both) + start = time.time() + no_negative_reviews = sum(df.Negative_Review == "No Negative") + print("Number of No Negative reviews: " + str(no_negative_reviews)) + + no_positive_reviews = sum(df["Positive_Review"] == "No Positive") + print("Number of No Positive reviews: " + str(no_positive_reviews)) + + both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive")) + print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews)) + + end = time.time() + print("Sum took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Sum took 0.19 seconds + ``` + + Morda ste opazili, da je 127 vrstic, ki imajo vrednosti "No Negative" in "No Positive" v stolpcih `Negative_Review` in `Positive_Review`. To pomeni, da je ocenjevalec hotelu dal numerično oceno, vendar se je odločil, da ne napiše niti pozitivne niti negativne ocene. Na srečo je to majhno število vrstic (127 od 515738, ali 0,02%), zato verjetno ne bo vplivalo na naš model ali rezultate v nobeni smeri, vendar morda ne bi pričakovali, da bo podatkovni nabor ocen vseboval vrstice brez ocen, zato je vredno raziskati podatke, da odkrijete takšne vrstice. + +Zdaj, ko ste raziskali podatkovni nabor, boste v naslednji lekciji filtrirali podatke in dodali analizo sentimenta. + +--- +## 🚀Izziv + +Ta lekcija prikazuje, kot smo videli v prejšnjih lekcijah, kako izjemno pomembno je razumeti svoje podatke in njihove posebnosti, preden na njih izvajate operacije. Besedilni podatki, zlasti, zahtevajo skrbno preučitev. Prebrskajte različne podatkovne nize, bogate z besedilom, in preverite, ali lahko odkrijete področja, ki bi lahko v model vnesla pristranskost ali izkrivljen sentiment. + +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Vzemite [to učno pot o NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott), da odkrijete orodja, ki jih lahko preizkusite pri gradnji modelov, bogatih z govorom in besedilom. + +## Naloga + +[NLTK](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/4-Hotel-Reviews-1/assignment.md b/translations/sl/6-NLP/4-Hotel-Reviews-1/assignment.md new file mode 100644 index 00000000..e78d5e95 --- /dev/null +++ b/translations/sl/6-NLP/4-Hotel-Reviews-1/assignment.md @@ -0,0 +1,19 @@ + +# NLTK + +## Navodila + +NLTK je priznana knjižnica za uporabo v računalniški lingvistiki in obdelavi naravnega jezika. Izkoristite to priložnost, da preberete '[NLTK knjigo](https://www.nltk.org/book/)' in preizkusite njene vaje. V tej neocenjeni nalogi boste podrobneje spoznali to knjižnico. + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md b/translations/sl/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md new file mode 100644 index 00000000..9c852da9 --- /dev/null +++ b/translations/sl/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto za izpolnitev + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazume ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/4-Hotel-Reviews-1/solution/R/README.md b/translations/sl/6-NLP/4-Hotel-Reviews-1/solution/R/README.md new file mode 100644 index 00000000..826065f4 --- /dev/null +++ b/translations/sl/6-NLP/4-Hotel-Reviews-1/solution/R/README.md @@ -0,0 +1,15 @@ + +to je začasno nadomestilo + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/5-Hotel-Reviews-2/README.md b/translations/sl/6-NLP/5-Hotel-Reviews-2/README.md new file mode 100644 index 00000000..1686f5eb --- /dev/null +++ b/translations/sl/6-NLP/5-Hotel-Reviews-2/README.md @@ -0,0 +1,389 @@ + +# Analiza sentimenta s hotelskimi ocenami + +Zdaj, ko ste podrobno raziskali podatkovni niz, je čas, da filtrirate stolpce in nato uporabite tehnike NLP na podatkovnem nizu, da pridobite nove vpoglede o hotelih. + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +### Operacije filtriranja in analize sentimenta + +Kot ste verjetno opazili, ima podatkovni niz nekaj težav. Nekateri stolpci so napolnjeni z neuporabnimi informacijami, drugi se zdijo napačni. Če so pravilni, ni jasno, kako so bili izračunani, in odgovore ni mogoče neodvisno preveriti z lastnimi izračuni. + +## Naloga: malo več obdelave podatkov + +Podatke očistite še malo. Dodajte stolpce, ki bodo uporabni kasneje, spremenite vrednosti v drugih stolpcih in nekatere stolpce popolnoma odstranite. + +1. Začetna obdelava stolpcev + + 1. Odstranite `lat` in `lng`. + + 2. Zamenjajte vrednosti `Hotel_Address` z naslednjimi vrednostmi (če naslov vsebuje ime mesta in države, ga spremenite v samo mesto in državo). + + To so edina mesta in države v podatkovnem nizu: + + Amsterdam, Nizozemska + + Barcelona, Španija + + London, Združeno kraljestvo + + Milano, Italija + + Pariz, Francija + + Dunaj, Avstrija + + ```python + def replace_address(row): + if "Netherlands" in row["Hotel_Address"]: + return "Amsterdam, Netherlands" + elif "Barcelona" in row["Hotel_Address"]: + return "Barcelona, Spain" + elif "United Kingdom" in row["Hotel_Address"]: + return "London, United Kingdom" + elif "Milan" in row["Hotel_Address"]: + return "Milan, Italy" + elif "France" in row["Hotel_Address"]: + return "Paris, France" + elif "Vienna" in row["Hotel_Address"]: + return "Vienna, Austria" + + # Replace all the addresses with a shortened, more useful form + df["Hotel_Address"] = df.apply(replace_address, axis = 1) + # The sum of the value_counts() should add up to the total number of reviews + print(df["Hotel_Address"].value_counts()) + ``` + + Zdaj lahko poizvedujete podatke na ravni države: + + ```python + display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"})) + ``` + + | Hotel_Address | Hotel_Name | + | :--------------------- | :--------: | + | Amsterdam, Nizozemska | 105 | + | Barcelona, Španija | 211 | + | London, Združeno kraljestvo | 400 | + | Milano, Italija | 162 | + | Pariz, Francija | 458 | + | Dunaj, Avstrija | 158 | + +2. Obdelava stolpcev meta-ocene hotela + + 1. Odstranite `Additional_Number_of_Scoring`. + + 2. Zamenjajte `Total_Number_of_Reviews` s skupnim številom ocen za ta hotel, ki so dejansko v podatkovnem nizu. + + 3. Zamenjajte `Average_Score` z lastno izračunano oceno. + + ```python + # Drop `Additional_Number_of_Scoring` + df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True) + # Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values + df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count') + df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + ``` + +3. Obdelava stolpcev ocen + + 1. Odstranite `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` in `days_since_review`. + + 2. Obdržite `Reviewer_Score`, `Negative_Review` in `Positive_Review` takšne, kot so. + + 3. Za zdaj obdržite `Tags`. + + - V naslednjem razdelku bomo izvedli dodatne operacije filtriranja na oznakah, nato pa bodo oznake odstranjene. + +4. Obdelava stolpcev ocenjevalcev + + 1. Odstranite `Total_Number_of_Reviews_Reviewer_Has_Given`. + + 2. Obdržite `Reviewer_Nationality`. + +### Stolpec oznak + +Stolpec `Tag` je problematičen, saj je seznam (v obliki besedila), shranjen v stolpcu. Na žalost vrstni red in število podsekcij v tem stolpcu nista vedno enaka. Težko je za človeka identificirati pravilne fraze, ki bi ga zanimale, ker je 515.000 vrstic in 1427 hotelov, vsak pa ima nekoliko drugačne možnosti, ki jih lahko izbere ocenjevalec. Tukaj pride NLP do izraza. Besedilo lahko pregledate, najdete najpogostejše fraze in jih preštejete. + +Na žalost nas ne zanimajo posamezne besede, temveč večbesedne fraze (npr. *Poslovno potovanje*). Zagon algoritma za frekvenčno porazdelitev večbesednih fraz na toliko podatkov (6762646 besed) bi lahko trajal izjemno dolgo, vendar brez pregleda podatkov bi se zdelo, da je to nujen strošek. Tukaj je koristna raziskovalna analiza podatkov, saj ste videli vzorec oznak, kot so `[' Poslovno potovanje ', ' Samostojni potnik ', ' Enoposteljna soba ', ' Bivanje 5 noči ', ' Oddano z mobilne naprave ']`, lahko začnete spraševati, ali je mogoče močno zmanjšati obdelavo, ki jo morate opraviti. Na srečo je to mogoče - vendar morate najprej slediti nekaj korakom, da določite zanimive oznake. + +### Filtriranje oznak + +Ne pozabite, da je cilj podatkovnega niza dodati sentiment in stolpce, ki vam bodo pomagali izbrati najboljši hotel (za vas ali morda za stranko, ki vas prosi, da ustvarite bot za priporočanje hotelov). Morate se vprašati, ali so oznake koristne ali ne v končnem podatkovnem nizu. Tukaj je ena interpretacija (če bi potrebovali podatkovni niz za druge namene, bi lahko bile oznake drugače vključene/izključene): + +1. Vrsta potovanja je pomembna in naj ostane. +2. Vrsta skupine gostov je pomembna in naj ostane. +3. Vrsta sobe, apartmaja ali studia, v katerem je gost bival, je nepomembna (vsi hoteli imajo v bistvu enake sobe). +4. Naprava, na kateri je bila ocena oddana, je nepomembna. +5. Število noči, ki jih je ocenjevalec bival, *bi* lahko bilo pomembno, če bi daljše bivanje povezali z večjim zadovoljstvom hotela, vendar je to malo verjetno in verjetno nepomembno. + +Povzetek: **obdržite 2 vrsti oznak in odstranite ostale**. + +Najprej ne želite šteti oznak, dokler niso v boljši obliki, kar pomeni odstranitev oglatih oklepajev in narekovajev. To lahko storite na več načinov, vendar želite najhitrejši, saj bi obdelava velike količine podatkov lahko trajala dolgo. Na srečo ima pandas enostaven način za izvedbo vsakega od teh korakov. + +```Python +# Remove opening and closing brackets +df.Tags = df.Tags.str.strip("[']") +# remove all quotes too +df.Tags = df.Tags.str.replace(" ', '", ",", regex = False) +``` + +Vsaka oznaka postane nekaj takega: `Poslovno potovanje, Samostojni potnik, Enoposteljna soba, Bivanje 5 noči, Oddano z mobilne naprave`. + +Nato naletite na težavo. Nekatere ocene ali vrstice imajo 5 stolpcev, nekatere 3, nekatere 6. To je rezultat načina, kako je bil podatkovni niz ustvarjen, in težko ga je popraviti. Želite dobiti frekvenčno število vsake fraze, vendar so v različnih vrstah v vsaki oceni, zato je lahko število napačno, hotel pa morda ne dobi oznake, ki si jo zasluži. + +Namesto tega boste uporabili različne vrste v svojo korist, saj je vsaka oznaka večbesedna, hkrati pa ločena z vejico! Najenostavnejši način za to je, da ustvarite 6 začasnih stolpcev, v katere vstavite vsako oznako glede na njen vrstni red v oznaki. Nato lahko združite teh 6 stolpcev v en velik stolpec in zaženete metodo `value_counts()` na nastalem stolpcu. Če to natisnete, boste videli, da je bilo 2428 edinstvenih oznak. Tukaj je majhen vzorec: + +| Oznaka | Število | +| ------------------------------- | ------- | +| Prostočasno potovanje | 417778 | +| Oddano z mobilne naprave | 307640 | +| Par | 252294 | +| Bivanje 1 noč | 193645 | +| Bivanje 2 noči | 133937 | +| Samostojni potnik | 108545 | +| Bivanje 3 noči | 95821 | +| Poslovno potovanje | 82939 | +| Skupina | 65392 | +| Družina z majhnimi otroki | 61015 | +| Bivanje 4 noči | 47817 | +| Dvoposteljna soba | 35207 | +| Standardna dvoposteljna soba | 32248 | +| Superior dvoposteljna soba | 31393 | +| Družina z večjimi otroki | 26349 | +| Deluxe dvoposteljna soba | 24823 | +| Dvoposteljna ali enoposteljna soba | 22393 | +| Bivanje 5 noči | 20845 | +| Standardna dvoposteljna ali enoposteljna soba | 17483 | +| Klasična dvoposteljna soba | 16989 | +| Superior dvoposteljna ali enoposteljna soba | 13570 | +| 2 sobe | 12393 | + +Nekatere pogoste oznake, kot je `Oddano z mobilne naprave`, nam niso koristne, zato bi jih bilo pametno odstraniti, preden štejemo pojavnost fraz, vendar je to tako hitra operacija, da jih lahko pustite notri in jih ignorirate. + +### Odstranjevanje oznak dolžine bivanja + +Odstranjevanje teh oznak je prvi korak, saj nekoliko zmanjša skupno število oznak, ki jih je treba upoštevati. Upoštevajte, da jih ne odstranite iz podatkovnega niza, temveč se odločite, da jih ne upoštevate kot vrednosti za štetje/obdržanje v podatkovnem nizu ocen. + +| Dolžina bivanja | Število | +| --------------- | ------- | +| Bivanje 1 noč | 193645 | +| Bivanje 2 noči | 133937 | +| Bivanje 3 noči | 95821 | +| Bivanje 4 noči | 47817 | +| Bivanje 5 noči | 20845 | +| Bivanje 6 noči | 9776 | +| Bivanje 7 noči | 7399 | +| Bivanje 8 noči | 2502 | +| Bivanje 9 noči | 1293 | +| ... | ... | + +Obstaja ogromna raznolikost sob, apartmajev, studiev, stanovanj in podobno. Vse to pomeni približno isto stvar in ni relevantno za vas, zato jih odstranite iz obravnave. + +| Vrsta sobe | Število | +| ------------------------------ | ------- | +| Dvoposteljna soba | 35207 | +| Standardna dvoposteljna soba | 32248 | +| Superior dvoposteljna soba | 31393 | +| Deluxe dvoposteljna soba | 24823 | +| Dvoposteljna ali enoposteljna soba | 22393 | +| Standardna dvoposteljna ali enoposteljna soba | 17483 | +| Klasična dvoposteljna soba | 16989 | +| Superior dvoposteljna ali enoposteljna soba | 13570 | + +Na koncu, in to je razveseljivo (ker ni zahtevalo veliko obdelave), boste ostali z naslednjimi *koristnimi* oznakami: + +| Oznaka | Število | +| ------------------------------------------- | ------- | +| Prostočasno potovanje | 417778 | +| Par | 252294 | +| Samostojni potnik | 108545 | +| Poslovno potovanje | 82939 | +| Skupina (združeno s Potniki s prijatelji) | 67535 | +| Družina z majhnimi otroki | 61015 | +| Družina z večjimi otroki | 26349 | +| S hišnim ljubljenčkom | 1405 | + +Lahko bi trdili, da je `Potniki s prijatelji` približno enako kot `Skupina`, in to bi bilo pošteno združiti, kot je prikazano zgoraj. Koda za identifikacijo pravilnih oznak je v [zvezku z oznakami](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb). + +Zadnji korak je ustvariti nove stolpce za vsako od teh oznak. Nato za vsako vrstico ocene, če stolpec `Tag` ustreza enemu od novih stolpcev, dodajte 1, če ne, dodajte 0. Končni rezultat bo število, koliko ocenjevalcev je izbralo ta hotel (v agregatu) za, recimo, poslovno ali prostočasno potovanje, ali za bivanje s hišnim ljubljenčkom, kar je koristna informacija pri priporočanju hotela. + +```python +# Process the Tags into new columns +# The file Hotel_Reviews_Tags.py, identifies the most important tags +# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends, +# Family with young children, Family with older children, With a pet +df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0) +df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0) +df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0) +df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0) +df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0) +df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0) +df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0) +df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0) + +``` + +### Shranite datoteko + +Na koncu shranite podatkovni niz, kot je zdaj, z novim imenom. + +```python +df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True) + +# Saving new data file with calculated columns +print("Saving results to Hotel_Reviews_Filtered.csv") +df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False) +``` + +## Operacije analize sentimenta + +V tem zadnjem razdelku boste uporabili analizo sentimenta na stolpcih ocen in shranili rezultate v podatkovni niz. + +## Naloga: naložite in shranite filtrirane podatke + +Upoštevajte, da zdaj nalagate filtrirani podatkovni niz, ki je bil shranjen v prejšnjem razdelku, **ne** originalnega podatkovnega niza. + +```python +import time +import pandas as pd +import nltk as nltk +from nltk.corpus import stopwords +from nltk.sentiment.vader import SentimentIntensityAnalyzer +nltk.download('vader_lexicon') + +# Load the filtered hotel reviews from CSV +df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv') + +# You code will be added here + + +# Finally remember to save the hotel reviews with new NLP data added +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False) +``` + +### Odstranjevanje nepomembnih besed + +Če bi izvedli analizo sentimenta na stolpcih negativnih in pozitivnih ocen, bi to lahko trajalo dolgo. Testirano na zmogljivem prenosniku z hitrim procesorjem je trajalo 12–14 minut, odvisno od uporabljenega knjižničnega orodja za analizo sentimenta. To je (relativno) dolgo, zato je vredno raziskati, ali je mogoče to pospešiti. + +Odstranjevanje nepomembnih besed, ali pogostih angleških besed, ki ne spreminjajo sentimenta stavka, je prvi korak. Z odstranitvijo teh besed bi morala analiza sentimenta potekati hitreje, vendar ne biti manj natančna (saj nepomembne besede ne vplivajo na sentiment, vendar upočasnjujejo analizo). + +Najdaljša negativna ocena je imela 395 besed, vendar po odstranitvi nepomembnih besed ima 195 besed. + +Odstranjevanje nepomembnih besed je tudi hitra operacija; odstranjevanje nepomembnih besed iz 2 stolpcev ocen čez 515.000 vrstic je trajalo 3,3 sekunde na testni napravi. Lahko traja nekoliko več ali manj časa, odvisno od hitrosti procesorja vaše naprave, RAM-a, ali imate SSD in nekaterih drugih dejavnikov. Relativna kratkost operacije pomeni, da če izboljša čas analize sentimenta, je vredno to storiti. + +```python +from nltk.corpus import stopwords + +# Load the hotel reviews from CSV +df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv") + +# Remove stop words - can be slow for a lot of text! +# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches +# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends +start = time.time() +cache = set(stopwords.words("english")) +def remove_stopwords(review): + text = " ".join([word for word in review.split() if word not in cache]) + return text + +# Remove the stop words from both columns +df.Negative_Review = df.Negative_Review.apply(remove_stopwords) +df.Positive_Review = df.Positive_Review.apply(remove_stopwords) +``` + +### Izvajanje analize sentimenta + +Zdaj morate izračunati analizo sentimenta za oba stolpca ocen, negativne in pozitivne, ter rezultat shraniti v 2 nova stolpca. Test sentimenta bo primerjava z oceno ocenjevalca za isto oceno. Na primer, če sentiment meni, da ima negativna ocena sentiment 1 (izjemno pozitiven sentiment) in pozitivna ocena sentiment 1, vendar je ocenjevalec hotelu dal najnižjo možno oceno, potem bodisi besedilo ocene ne ustreza oceni, bodisi analizator sentimenta ni mogel pravilno prepoznati sentimenta. Pričakujete lahko, da bodo nekatere ocene sentimenta popolnoma napačne, kar bo pogosto razložljivo, npr. ocena bi lahko bila izjemno sarkastična "Seveda sem OBOŽEVAL spanje v sobi brez ogrevanja", analizator sentimenta pa meni, da je to pozitiven sentiment, čeprav bi človek, ki to bere, vedel, da gre za sarkazem. +NLTK ponuja različne analizatorje sentimenta, s katerimi se lahko učite, in jih lahko zamenjate ter preverite, ali je sentiment bolj ali manj natančen. Tukaj je uporabljena analiza sentimenta VADER. + +> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, junij 2014. + +```python +from nltk.sentiment.vader import SentimentIntensityAnalyzer + +# Create the vader sentiment analyser (there are others in NLTK you can try too) +vader_sentiment = SentimentIntensityAnalyzer() +# Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014. + +# There are 3 possibilities of input for a review: +# It could be "No Negative", in which case, return 0 +# It could be "No Positive", in which case, return 0 +# It could be a review, in which case calculate the sentiment +def calc_sentiment(review): + if review == "No Negative" or review == "No Positive": + return 0 + return vader_sentiment.polarity_scores(review)["compound"] +``` + +Kasneje v programu, ko ste pripravljeni izračunati sentiment, ga lahko uporabite za vsako oceno na naslednji način: + +```python +# Add a negative sentiment and positive sentiment column +print("Calculating sentiment columns for both positive and negative reviews") +start = time.time() +df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment) +df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment) +end = time.time() +print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds") +``` + +To traja približno 120 sekund na mojem računalniku, vendar se bo čas razlikoval glede na računalnik. Če želite natisniti rezultate in preveriti, ali sentiment ustreza oceni: + +```python +df = df.sort_values(by=["Negative_Sentiment"], ascending=True) +print(df[["Negative_Review", "Negative_Sentiment"]]) +df = df.sort_values(by=["Positive_Sentiment"], ascending=True) +print(df[["Positive_Review", "Positive_Sentiment"]]) +``` + +Zadnja stvar, ki jo morate narediti s datoteko, preden jo uporabite v izzivu, je, da jo shranite! Prav tako bi morali razmisliti o preurejanju vseh novih stolpcev, da bodo bolj pregledni (za človeka je to kozmetična sprememba). + +```python +# Reorder the columns (This is cosmetic, but to make it easier to explore the data later) +df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1) + +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False) +``` + +Zaženite celotno kodo za [analizni zvezek](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (po tem, ko ste zagnali [zvezek za filtriranje](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb), da ustvarite datoteko Hotel_Reviews_Filtered.csv). + +Če povzamemo, koraki so: + +1. Izvirna datoteka **Hotel_Reviews.csv** je bila raziskana v prejšnji lekciji z [raziskovalnim zvezkom](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb) +2. Hotel_Reviews.csv je filtriran z [zvezkom za filtriranje](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb), kar ustvari **Hotel_Reviews_Filtered.csv** +3. Hotel_Reviews_Filtered.csv je obdelan z [zvezkom za analizo sentimenta](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb), kar ustvari **Hotel_Reviews_NLP.csv** +4. Uporabite Hotel_Reviews_NLP.csv v NLP izzivu spodaj + +### Zaključek + +Ko ste začeli, ste imeli podatkovno zbirko s stolpci in podatki, vendar ni bilo vse mogoče preveriti ali uporabiti. Raziskali ste podatke, filtrirali, kar ni bilo potrebno, pretvorili oznake v nekaj uporabnega, izračunali svoje povprečje, dodali nekaj stolpcev sentimenta in upajmo, da ste se naučili nekaj zanimivega o obdelavi naravnega besedila. + +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Izziv + +Zdaj, ko imate analizirano podatkovno zbirko za sentiment, preverite, ali lahko uporabite strategije, ki ste se jih naučili v tem učnem načrtu (morda razvrščanje v skupine?), da določite vzorce glede sentimenta. + +## Pregled in samostojno učenje + +Vzemite [ta modul Learn](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott), da se naučite več in uporabite različna orodja za raziskovanje sentimenta v besedilu. + +## Naloga + +[Preizkusite drugo podatkovno zbirko](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/5-Hotel-Reviews-2/assignment.md b/translations/sl/6-NLP/5-Hotel-Reviews-2/assignment.md new file mode 100644 index 00000000..30ff0d96 --- /dev/null +++ b/translations/sl/6-NLP/5-Hotel-Reviews-2/assignment.md @@ -0,0 +1,25 @@ + +# Poskusite drugačen nabor podatkov + +## Navodila + +Zdaj, ko ste se naučili uporabljati NLTK za dodeljevanje sentimenta besedilu, poskusite z drugačnim naborom podatkov. Verjetno boste morali opraviti nekaj obdelave podatkov, zato ustvarite beležko in dokumentirajte svoj miselni proces. Kaj odkrijete? + +## Merila + +| Merila | Odlično | Zadostno | Potrebno izboljšanje | +| ------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | ----------------------- | +| | Predstavljena sta popolna beležka in nabor podatkov z dobro dokumentiranimi celicami, ki pojasnjujejo, kako je sentiment dodeljen | Beležka nima dobrih pojasnil | Beležka je pomanjkljiva | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md b/translations/sl/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md new file mode 100644 index 00000000..43906387 --- /dev/null +++ b/translations/sl/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto za rezervacijo + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/5-Hotel-Reviews-2/solution/R/README.md b/translations/sl/6-NLP/5-Hotel-Reviews-2/solution/R/README.md new file mode 100644 index 00000000..d16c16c3 --- /dev/null +++ b/translations/sl/6-NLP/5-Hotel-Reviews-2/solution/R/README.md @@ -0,0 +1,15 @@ + +to je začasno nadomestilo + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/README.md b/translations/sl/6-NLP/README.md new file mode 100644 index 00000000..3d93170a --- /dev/null +++ b/translations/sl/6-NLP/README.md @@ -0,0 +1,38 @@ + +# Začetek z obdelavo naravnega jezika + +Obdelava naravnega jezika (NLP) je sposobnost računalniškega programa, da razume človeški jezik, kot je govorjen in pisan – temu pravimo naravni jezik. Gre za sestavni del umetne inteligence (AI). NLP obstaja že več kot 50 let in ima korenine na področju jezikoslovja. Celotno področje je usmerjeno v pomoč strojem pri razumevanju in obdelavi človeškega jezika. To se nato lahko uporablja za izvajanje nalog, kot so preverjanje črkovanja ali strojno prevajanje. Ima številne praktične aplikacije na različnih področjih, vključno z medicinskimi raziskavami, iskalniki in poslovno analitiko. + +## Regionalna tema: Evropski jeziki in literatura ter romantični hoteli Evrope ❤️ + +V tem delu učnega načrta boste spoznali eno najpogostejših uporab strojnega učenja: obdelavo naravnega jezika (NLP). Ta kategorija umetne inteligence, ki izhaja iz računalniškega jezikoslovja, predstavlja most med ljudmi in stroji prek glasovne ali besedilne komunikacije. + +V teh lekcijah bomo spoznali osnove NLP z gradnjo majhnih pogovornih botov, da bi razumeli, kako strojno učenje pomaga, da so ti pogovori vse bolj 'pametni'. Potovali boste nazaj v čas in se pogovarjali z Elizabeth Bennett in gospodom Darcyjem iz klasičnega romana Jane Austen, **Prevzetnost in pristranost**, objavljenega leta 1813. Nato boste svoje znanje nadgradili z učenjem o analizi sentimenta prek hotelskih ocen v Evropi. + +![Knjiga Prevzetnost in pristranost ter čaj](../../../6-NLP/images/p&p.jpg) +> Fotografija avtorice Elaine Howlin na Unsplash + +## Lekcije + +1. [Uvod v obdelavo naravnega jezika](1-Introduction-to-NLP/README.md) +2. [Pogoste naloge in tehnike NLP](2-Tasks/README.md) +3. [Prevajanje in analiza sentimenta s strojnim učenjem](3-Translation-Sentiment/README.md) +4. [Priprava vaših podatkov](4-Hotel-Reviews-1/README.md) +5. [NLTK za analizo sentimenta](5-Hotel-Reviews-2/README.md) + +## Avtorji + +Te lekcije o obdelavi naravnega jezika so bile napisane s ☕ avtorja [Stephen Howell](https://twitter.com/Howell_MSFT) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/6-NLP/data/README.md b/translations/sl/6-NLP/data/README.md new file mode 100644 index 00000000..d3738401 --- /dev/null +++ b/translations/sl/6-NLP/data/README.md @@ -0,0 +1,15 @@ + +Prenesite podatke o ocenah hotela v to mapo. + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/7-TimeSeries/1-Introduction/README.md b/translations/sl/7-TimeSeries/1-Introduction/README.md new file mode 100644 index 00000000..33296c27 --- /dev/null +++ b/translations/sl/7-TimeSeries/1-Introduction/README.md @@ -0,0 +1,199 @@ + +# Uvod v napovedovanje časovnih vrst + +![Povzetek časovnih vrst v sketchnote](../../../../sketchnotes/ml-timeseries.png) + +> Sketchnote avtorja [Tomomi Imura](https://www.twitter.com/girlie_mac) + +V tej lekciji in naslednji boste spoznali osnove napovedovanja časovnih vrst, zanimivega in dragocenega dela repertoarja znanstvenika za strojno učenje, ki je nekoliko manj poznan kot drugi tematski sklopi. Napovedovanje časovnih vrst je nekakšna 'kristalna krogla': na podlagi preteklega delovanja spremenljivke, kot je cena, lahko napovemo njeno prihodnjo potencialno vrednost. + +[![Uvod v napovedovanje časovnih vrst](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "Uvod v napovedovanje časovnih vrst") + +> 🎥 Kliknite zgornjo sliko za video o napovedovanju časovnih vrst + +## [Predlekcijski kviz](https://ff-quizzes.netlify.app/en/ml/) + +Gre za uporabno in zanimivo področje z resnično vrednostjo za poslovanje, saj ima neposredno aplikacijo pri reševanju težav s cenami, zalogami in dobavnimi verigami. Čeprav se za pridobivanje boljših vpogledov v prihodnje delovanje vse bolj uporabljajo tehnike globokega učenja, napovedovanje časovnih vrst ostaja področje, ki ga močno zaznamujejo klasične tehnike strojnega učenja. + +> Koristno gradivo o časovnih vrstah univerze Penn State najdete [tukaj](https://online.stat.psu.edu/stat510/lesson/1) + +## Uvod + +Predstavljajte si, da upravljate mrežo pametnih parkirnih števcev, ki zagotavljajo podatke o tem, kako pogosto in kako dolgo se uporabljajo skozi čas. + +> Kaj če bi lahko na podlagi preteklega delovanja števca napovedali njegovo prihodnjo vrednost v skladu z zakoni ponudbe in povpraševanja? + +Natančno napovedovanje, kdaj ukrepati za dosego cilja, je izziv, ki ga je mogoče rešiti z napovedovanjem časovnih vrst. Morda ljudje ne bi bili navdušeni, če bi morali plačati več v času največje zasedenosti, ko iščejo parkirno mesto, vendar bi bil to zanesljiv način za ustvarjanje prihodkov za čiščenje ulic! + +Raziskali bomo nekaj vrst algoritmov časovnih vrst in začeli z beležko za čiščenje in pripravo podatkov. Podatki, ki jih boste analizirali, so vzeti iz tekmovanja GEFCom2014 za napovedovanje. Vključujejo 3 leta urnih vrednosti porabe električne energije in temperature med letoma 2012 in 2014. Glede na zgodovinske vzorce porabe električne energije in temperature lahko napoveste prihodnje vrednosti porabe električne energije. + +V tem primeru se boste naučili, kako napovedati eno časovno točko vnaprej, pri čemer boste uporabili le zgodovinske podatke o porabi. Preden začnete, pa je koristno razumeti, kaj se dogaja v ozadju. + +## Nekatere definicije + +Ko naletite na izraz 'časovne vrste', morate razumeti njegovo uporabo v različnih kontekstih. + +🎓 **Časovne vrste** + +V matematiki so "časovne vrste zaporedje podatkovnih točk, ki so indeksirane (ali navedene ali narisane) v časovnem zaporedju. Najpogosteje so časovne vrste zaporedje, zajeto v enakih časovnih intervalih." Primer časovnih vrst je dnevna zaključna vrednost [Dow Jones Industrial Average](https://wikipedia.org/wiki/Time_series). Uporaba grafov časovnih vrst in statističnega modeliranja je pogosto prisotna pri obdelavi signalov, vremenskih napovedih, napovedovanju potresov in drugih področjih, kjer se dogodki pojavljajo in podatkovne točke lahko narišemo skozi čas. + +🎓 **Analiza časovnih vrst** + +Analiza časovnih vrst je analiza zgoraj omenjenih podatkov časovnih vrst. Podatki časovnih vrst lahko zavzamejo različne oblike, vključno z 'prekinjenimi časovnimi vrstami', ki zaznavajo vzorce v razvoju časovnih vrst pred in po prekinjajočem dogodku. Vrsta analize, ki je potrebna za časovne vrste, je odvisna od narave podatkov. Podatki časovnih vrst sami lahko zavzamejo obliko zaporedja številk ali znakov. + +Analiza uporablja različne metode, vključno s frekvenčno domeno in časovno domeno, linearne in nelinearne metode ter druge. [Preberite več](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) o številnih načinih analize te vrste podatkov. + +🎓 **Napovedovanje časovnih vrst** + +Napovedovanje časovnih vrst je uporaba modela za napovedovanje prihodnjih vrednosti na podlagi vzorcev, ki jih prikazujejo prej zbrani podatki, kot so se pojavili v preteklosti. Čeprav je mogoče uporabiti regresijske modele za raziskovanje podatkov časovnih vrst, pri čemer so časovni indeksi x spremenljivke na grafu, je takšne podatke najbolje analizirati s posebnimi vrstami modelov. + +Podatki časovnih vrst so seznam urejenih opazovanj, za razliko od podatkov, ki jih je mogoče analizirati z linearno regresijo. Najpogostejši model je ARIMA, kratica za "Avtoregresivno Integrirano Premično Povprečje". + +[ARIMA modeli](https://online.stat.psu.edu/stat510/lesson/1/1.1) "povezujejo trenutno vrednost serije s preteklimi vrednostmi in preteklimi napakami napovedi." Najbolj so primerni za analizo podatkov v časovni domeni, kjer so podatki urejeni skozi čas. + +> Obstaja več vrst ARIMA modelov, o katerih lahko preberete [tukaj](https://people.duke.edu/~rnau/411arim.htm) in jih boste obravnavali v naslednji lekciji. + +V naslednji lekciji boste zgradili ARIMA model z uporabo [Univariatnih časovnih vrst](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm), ki se osredotočajo na eno spremenljivko, ki spreminja svojo vrednost skozi čas. Primer te vrste podatkov je [ta podatkovni niz](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm), ki beleži mesečno koncentracijo CO2 na observatoriju Mauna Loa: + +| CO2 | YearMonth | Year | Month | +| :----: | :-------: | :---: | :---: | +| 330.62 | 1975.04 | 1975 | 1 | +| 331.40 | 1975.13 | 1975 | 2 | +| 331.87 | 1975.21 | 1975 | 3 | +| 333.18 | 1975.29 | 1975 | 4 | +| 333.92 | 1975.38 | 1975 | 5 | +| 333.43 | 1975.46 | 1975 | 6 | +| 331.85 | 1975.54 | 1975 | 7 | +| 330.01 | 1975.63 | 1975 | 8 | +| 328.51 | 1975.71 | 1975 | 9 | +| 328.41 | 1975.79 | 1975 | 10 | +| 329.25 | 1975.88 | 1975 | 11 | +| 330.97 | 1975.96 | 1975 | 12 | + +✅ Prepoznajte spremenljivko, ki se spreminja skozi čas v tem podatkovnem nizu. + +## Značilnosti podatkov časovnih vrst, ki jih je treba upoštevati + +Ko opazujete podatke časovnih vrst, lahko opazite, da imajo [določene značilnosti](https://online.stat.psu.edu/stat510/lesson/1/1.1), ki jih morate upoštevati in omiliti, da bi bolje razumeli njihove vzorce. Če podatke časovnih vrst obravnavate kot potencialni 'signal', ki ga želite analizirati, lahko te značilnosti obravnavate kot 'šum'. Pogosto boste morali zmanjšati ta 'šum' z uporabo nekaterih statističnih tehnik. + +Tukaj je nekaj konceptov, ki jih morate poznati, da lahko delate s časovnimi vrstami: + +🎓 **Trendi** + +Trendi so opredeljeni kot merljive rasti in padci skozi čas. [Preberite več](https://machinelearningmastery.com/time-series-trends-in-python). V kontekstu časovnih vrst gre za to, kako uporabiti in, če je potrebno, odstraniti trende iz časovnih vrst. + +🎓 **[Sezonskost](https://machinelearningmastery.com/time-series-seasonality-with-python/)** + +Sezonskost je opredeljena kot periodična nihanja, kot so na primer praznični nakupovalni vrhovi, ki lahko vplivajo na prodajo. [Oglejte si](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm), kako različne vrste grafov prikazujejo sezonskost v podatkih. + +🎓 **Izstopajoče vrednosti** + +Izstopajoče vrednosti so daleč od standardne variance podatkov. + +🎓 **Dolgotrajni cikli** + +Neodvisno od sezonskosti lahko podatki prikazujejo dolgotrajne cikle, kot je gospodarska recesija, ki traja dlje kot eno leto. + +🎓 **Konstanta varianca** + +Skozi čas nekateri podatki prikazujejo konstantna nihanja, kot je poraba energije podnevi in ponoči. + +🎓 **Nenadne spremembe** + +Podatki lahko prikazujejo nenadno spremembo, ki jo je treba dodatno analizirati. Nenadno zaprtje podjetij zaradi COVID-a, na primer, je povzročilo spremembe v podatkih. + +✅ Tukaj je [primer grafa časovnih vrst](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python), ki prikazuje dnevno porabo valute v igri skozi nekaj let. Ali lahko v teh podatkih prepoznate katere koli od zgoraj navedenih značilnosti? + +![Poraba valute v igri](../../../../7-TimeSeries/1-Introduction/images/currency.png) + +## Naloga - začetek z podatki o porabi energije + +Začnimo z ustvarjanjem modela časovnih vrst za napovedovanje prihodnje porabe energije glede na preteklo porabo. + +> Podatki v tem primeru so vzeti iz tekmovanja GEFCom2014 za napovedovanje. Vključujejo 3 leta urnih vrednosti porabe električne energije in temperature med letoma 2012 in 2014. +> +> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli in Rob J. Hyndman, "Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond", International Journal of Forecasting, vol.32, no.3, pp 896-913, julij-september, 2016. + +1. V mapi `working` te lekcije odprite datoteko _notebook.ipynb_. Začnite z dodajanjem knjižnic, ki vam bodo pomagale naložiti in vizualizirati podatke. + + ```python + import os + import matplotlib.pyplot as plt + from common.utils import load_data + %matplotlib inline + ``` + + Upoštevajte, da uporabljate datoteke iz priložene mape `common`, ki nastavijo vaše okolje in poskrbijo za prenos podatkov. + +2. Nato preglejte podatke kot podatkovni okvir z uporabo `load_data()` in `head()`: + + ```python + data_dir = './data' + energy = load_data(data_dir)[['load']] + energy.head() + ``` + + Vidite lahko, da sta dva stolpca, ki predstavljata datum in porabo: + + | | load | + | :-----------------: | :----: | + | 2012-01-01 00:00:00 | 2698.0 | + | 2012-01-01 01:00:00 | 2558.0 | + | 2012-01-01 02:00:00 | 2444.0 | + | 2012-01-01 03:00:00 | 2402.0 | + | 2012-01-01 04:00:00 | 2403.0 | + +3. Zdaj narišite podatke z uporabo `plot()`: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![graf energije](../../../../7-TimeSeries/1-Introduction/images/energy-plot.png) + +4. Zdaj narišite prvi teden julija 2014, tako da ga podate kot vhod v `energy` v vzorcu `[od datuma]: [do datuma]`: + + ```python + energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![julij](../../../../7-TimeSeries/1-Introduction/images/july-2014.png) + + Čudovit graf! Oglejte si te grafe in preverite, ali lahko določite katere koli od zgoraj navedenih značilnosti. Kaj lahko sklepamo z vizualizacijo podatkov? + +V naslednji lekciji boste ustvarili ARIMA model za izdelavo napovedi. + +--- + +## 🚀Izziv + +Naredite seznam vseh industrij in področij raziskovanja, ki bi lahko imeli koristi od napovedovanja časovnih vrst. Ali lahko pomislite na aplikacijo teh tehnik v umetnosti? V ekonometriji? Ekologiji? Maloprodaji? Industriji? Financah? Kje še? + +## [Po-lekcijski kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Čeprav jih tukaj ne bomo obravnavali, se včasih za izboljšanje klasičnih metod napovedovanja časovnih vrst uporabljajo nevronske mreže. Preberite več o njih [v tem članku](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412) + +## Naloga + +[Vizualizirajte še več časovnih vrst](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/7-TimeSeries/1-Introduction/assignment.md b/translations/sl/7-TimeSeries/1-Introduction/assignment.md new file mode 100644 index 00000000..b39249fb --- /dev/null +++ b/translations/sl/7-TimeSeries/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Vizualizirajte še nekaj časovnih vrst + +## Navodila + +Začeli ste se učiti o napovedovanju časovnih vrst, tako da ste si ogledali vrsto podatkov, ki zahtevajo to posebno modeliranje. Vizualizirali ste nekaj podatkov o energiji. Zdaj poiščite še nekaj drugih podatkov, ki bi koristili napovedovanju časovnih vrst. Poiščite tri primere (poskusite [Kaggle](https://kaggle.com) in [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)) in ustvarite beležko za njihovo vizualizacijo. V beležki zabeležite vse posebne značilnosti, ki jih imajo (sezonskost, nenadne spremembe ali druge trende). + +## Merila + +| Merila | Odlično | Zadostno | Potrebna izboljšava | +| -------- | ----------------------------------------------------- | -------------------------------------------------- | --------------------------------------------------------------------------------------- | +| | Trije nabori podatkov so prikazani in razloženi v beležki | Dva nabora podatkov sta prikazana in razložena v beležki | Malo naborov podatkov je prikazanih ali razloženih v beležki ali predstavljeni podatki niso zadostni | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/7-TimeSeries/1-Introduction/solution/Julia/README.md b/translations/sl/7-TimeSeries/1-Introduction/solution/Julia/README.md new file mode 100644 index 00000000..6b628ae9 --- /dev/null +++ b/translations/sl/7-TimeSeries/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto za izpolnitev + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/7-TimeSeries/1-Introduction/solution/R/README.md b/translations/sl/7-TimeSeries/1-Introduction/solution/R/README.md new file mode 100644 index 00000000..b79af9e4 --- /dev/null +++ b/translations/sl/7-TimeSeries/1-Introduction/solution/R/README.md @@ -0,0 +1,15 @@ + +to je začasno nadomestilo + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/7-TimeSeries/2-ARIMA/README.md b/translations/sl/7-TimeSeries/2-ARIMA/README.md new file mode 100644 index 00000000..560e634b --- /dev/null +++ b/translations/sl/7-TimeSeries/2-ARIMA/README.md @@ -0,0 +1,403 @@ + +# Napovedovanje časovnih vrst z ARIMA + +V prejšnji lekciji ste se naučili nekaj o napovedovanju časovnih vrst in naložili podatkovni niz, ki prikazuje nihanja električne obremenitve skozi časovno obdobje. + +🎥 Kliknite zgornjo sliko za video: Kratek uvod v modele ARIMA. Primer je narejen v R, vendar so koncepti univerzalni. + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +V tej lekciji boste spoznali specifičen način za gradnjo modelov z [ARIMA: *A*uto*R*egresivno *I*ntegrirano *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average). ARIMA modeli so še posebej primerni za podatke, ki kažejo [nestacionarnost](https://wikipedia.org/wiki/Stationary_process). + +## Splošni koncepti + +Da bi lahko delali z ARIMA, morate poznati nekaj osnovnih konceptov: + +- 🎓 **Stacionarnost**. V statističnem kontekstu stacionarnost pomeni podatke, katerih porazdelitev se ne spreminja, ko jih premaknemo v času. Nestacionarni podatki kažejo nihanja zaradi trendov, ki jih je treba transformirati za analizo. Sezonskost, na primer, lahko povzroči nihanja v podatkih, ki jih je mogoče odpraviti s procesom 'sezonskega razlikovanja'. + +- 🎓 **[Razlikovanje](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. Razlikovanje podatkov, ponovno v statističnem kontekstu, se nanaša na proces transformacije nestacionarnih podatkov v stacionarne z odstranitvijo njihovega nespremenljivega trenda. "Razlikovanje odstrani spremembe v ravni časovne vrste, odpravi trend in sezonskost ter posledično stabilizira povprečje časovne vrste." [Študija Shixiong et al](https://arxiv.org/abs/1904.07632) + +## ARIMA v kontekstu časovnih vrst + +Razčlenimo dele ARIMA, da bolje razumemo, kako nam pomaga modelirati časovne vrste in napovedovati podatke. + +- **AR - za AutoRegresivno**. Avtoregresivni modeli, kot že ime pove, gledajo 'nazaj' v času, da analizirajo prejšnje vrednosti v vaših podatkih in naredijo predpostavke o njih. Te prejšnje vrednosti se imenujejo 'zaostanki'. Primer bi bili podatki, ki prikazujejo mesečno prodajo svinčnikov. Skupna prodaja vsakega meseca bi se štela kot 'spremenljivka v razvoju' v podatkovnem nizu. Ta model je zgrajen tako, da se "spremenljivka v razvoju regresira na svoje zaostale (tj. prejšnje) vrednosti." [wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) + +- **I - za Integrirano**. V nasprotju s podobnimi modeli 'ARMA' se 'I' v ARIMA nanaša na njegovo *[integrirano](https://wikipedia.org/wiki/Order_of_integration)* lastnost. Podatki so 'integrirani', ko se uporabijo koraki razlikovanja za odpravo nestacionarnosti. + +- **MA - za Premično Povprečje**. Vidik [premičnega povprečja](https://wikipedia.org/wiki/Moving-average_model) v tem modelu se nanaša na izhodno spremenljivko, ki je določena z opazovanjem trenutnih in preteklih vrednosti zaostankov. + +Zaključek: ARIMA se uporablja za prilagoditev modela posebni obliki podatkov časovnih vrst čim bolj natančno. + +## Naloga - zgradite ARIMA model + +Odprite mapo [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) v tej lekciji in poiščite datoteko [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb). + +1. Zaženite beležko, da naložite knjižnico Python `statsmodels`; to boste potrebovali za modele ARIMA. + +1. Naložite potrebne knjižnice. + +1. Nato naložite še nekaj knjižnic, ki so uporabne za vizualizacijo podatkov: + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from pandas.plotting import autocorrelation_plot + from statsmodels.tsa.statespace.sarimax import SARIMAX + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + from IPython.display import Image + + %matplotlib inline + pd.options.display.float_format = '{:,.2f}'.format + np.set_printoptions(precision=2) + warnings.filterwarnings("ignore") # specify to ignore warning messages + ``` + +1. Naložite podatke iz datoteke `/data/energy.csv` v Pandas dataframe in si jih oglejte: + + ```python + energy = load_data('./data')[['load']] + energy.head(10) + ``` + +1. Prikažite vse razpoložljive podatke o energiji od januarja 2012 do decembra 2014. Presenečenj ne bi smelo biti, saj smo te podatke videli v prejšnji lekciji: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + Zdaj pa zgradimo model! + +### Ustvarite učne in testne podatkovne nize + +Zdaj so vaši podatki naloženi, zato jih lahko ločite na učni in testni niz. Model boste trenirali na učnem nizu. Kot običajno, ko bo model končal učenje, boste ocenili njegovo natančnost z uporabo testnega niza. Poskrbeti morate, da testni niz zajema kasnejše časovno obdobje od učnega niza, da zagotovite, da model ne pridobi informacij iz prihodnjih časovnih obdobij. + +1. Dodelite dvomesečno obdobje od 1. septembra do 31. oktobra 2014 učnemu nizu. Testni niz bo vključeval dvomesečno obdobje od 1. novembra do 31. decembra 2014: + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + + Ker ti podatki odražajo dnevno porabo energije, obstaja močan sezonski vzorec, vendar je poraba najbolj podobna porabi v bolj nedavnih dneh. + +1. Vizualizirajte razlike: + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![učni in testni podatki](../../../../7-TimeSeries/2-ARIMA/images/train-test.png) + + Zato bi moralo biti dovolj, da za učenje podatkov uporabimo relativno majhno časovno okno. + + > Opomba: Ker funkcija, ki jo uporabljamo za prilagoditev modela ARIMA, uporablja validacijo znotraj vzorca med prilagajanjem, bomo izpustili validacijske podatke. + +### Pripravite podatke za učenje + +Zdaj morate pripraviti podatke za učenje z izvajanjem filtriranja in skaliranja podatkov. Filtrirajte svoj podatkovni niz, da vključite le potrebna časovna obdobja in stolpce, ter skalirajte podatke, da zagotovite, da so prikazani v intervalu 0,1. + +1. Filtrirajte izvirni podatkovni niz, da vključite le prej omenjena časovna obdobja za vsak niz in le potrebni stolpec 'load' ter datum: + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + Lahko vidite obliko podatkov: + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +1. Skalirajte podatke, da bodo v razponu (0, 1). + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + train.head(10) + ``` + +1. Vizualizirajte izvirne in skalirane podatke: + + ```python + energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12) + train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12) + plt.show() + ``` + + ![izvirni](../../../../7-TimeSeries/2-ARIMA/images/original.png) + + > Izvirni podatki + + ![skalirani](../../../../7-TimeSeries/2-ARIMA/images/scaled.png) + + > Skalirani podatki + +1. Zdaj, ko ste kalibrirali skalirane podatke, lahko skalirate testne podatke: + + ```python + test['load'] = scaler.transform(test) + test.head() + ``` + +### Implementirajte ARIMA + +Čas je, da implementirate ARIMA! Zdaj boste uporabili knjižnico `statsmodels`, ki ste jo prej namestili. + +Zdaj morate slediti več korakom: + + 1. Določite model z uporabo `SARIMAX()` in podajte parametre modela: parametre p, d in q ter parametre P, D in Q. + 2. Pripravite model za učne podatke z uporabo funkcije fit(). + 3. Naredite napovedi z uporabo funkcije `forecast()` in določite število korakov (obzorje), ki jih želite napovedati. + +> 🎓 Kaj pomenijo vsi ti parametri? V modelu ARIMA obstajajo 3 parametri, ki pomagajo modelirati glavne vidike časovne vrste: sezonskost, trend in šum. Ti parametri so: + +`p`: parameter, povezan z avtoregresivnim vidikom modela, ki vključuje *pretekle* vrednosti. +`d`: parameter, povezan z integriranim delom modela, ki vpliva na količino *razlikovanja* (🎓 spomnite se razlikovanja 👆?), ki se uporabi na časovni vrsti. +`q`: parameter, povezan z delom modela, ki se nanaša na premično povprečje. + +> Opomba: Če vaši podatki vsebujejo sezonski vidik - kar ti podatki vsebujejo -, uporabimo sezonski ARIMA model (SARIMA). V tem primeru morate uporabiti še en niz parametrov: `P`, `D` in `Q`, ki opisujejo enake povezave kot `p`, `d` in `q`, vendar ustrezajo sezonskim komponentam modela. + +1. Začnite z nastavitvijo želene vrednosti obzorja. Poskusimo s 3 urami: + + ```python + # Specify the number of steps to forecast ahead + HORIZON = 3 + print('Forecasting horizon:', HORIZON, 'hours') + ``` + + Izbira najboljših vrednosti za parametre modela ARIMA je lahko zahtevna, saj je nekoliko subjektivna in časovno intenzivna. Morda boste želeli uporabiti funkcijo `auto_arima()` iz knjižnice [`pyramid`](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html). + +1. Za zdaj poskusite nekaj ročnih izbir, da najdete dober model. + + ```python + order = (4, 1, 0) + seasonal_order = (1, 1, 0, 24) + + model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order) + results = model.fit() + + print(results.summary()) + ``` + + Tabela rezultatov je natisnjena. + +Zgradili ste svoj prvi model! Zdaj moramo najti način za njegovo oceno. + +### Ocenite svoj model + +Za oceno svojega modela lahko izvedete tako imenovano validacijo `walk forward`. V praksi se modeli časovnih vrst ponovno trenirajo vsakič, ko so na voljo novi podatki. To omogoča modelu, da naredi najboljšo napoved na vsakem časovnem koraku. + +Začnite na začetku časovne vrste z uporabo te tehnike, trenirajte model na učnem podatkovnem nizu. Nato naredite napoved za naslednji časovni korak. Napoved se oceni glede na znano vrednost. Učni niz se nato razširi, da vključuje znano vrednost, in proces se ponovi. + +> Opomba: Učno okno podatkovnega niza bi morali ohraniti fiksno za bolj učinkovito učenje, tako da vsakič, ko dodate novo opazovanje v učni niz, odstranite opazovanje z začetka niza. + +Ta proces zagotavlja bolj robustno oceno, kako bo model deloval v praksi. Vendar pa to prinaša računske stroške ustvarjanja toliko modelov. To je sprejemljivo, če so podatki majhni ali če je model preprost, vendar bi lahko bil problem pri večjih podatkih. + +Validacija z metodo walk-forward je zlati standard za ocenjevanje modelov časovnih vrst in jo priporočamo za vaše projekte. + +1. Najprej ustvarite testno podatkovno točko za vsak korak obzorja. + + ```python + test_shifted = test.copy() + + for t in range(1, HORIZON+1): + test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H') + + test_shifted = test_shifted.dropna(how='any') + test_shifted.head(5) + ``` + + | | | load | load+1 | load+2 | + | ---------- | -------- | ---- | ------ | ------ | + | 2014-12-30 | 00:00:00 | 0.33 | 0.29 | 0.27 | + | 2014-12-30 | 01:00:00 | 0.29 | 0.27 | 0.27 | + | 2014-12-30 | 02:00:00 | 0.27 | 0.27 | 0.30 | + | 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 | + | 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 | + + Podatki se horizontalno premaknejo glede na točko obzorja. + +1. Naredite napovedi za svoje testne podatke z uporabo tega drsnega okna v zanki dolžine testnih podatkov: + + ```python + %%time + training_window = 720 # dedicate 30 days (720 hours) for training + + train_ts = train['load'] + test_ts = test_shifted + + history = [x for x in train_ts] + history = history[(-training_window):] + + predictions = list() + + order = (2, 1, 0) + seasonal_order = (1, 1, 0, 24) + + for t in range(test_ts.shape[0]): + model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order) + model_fit = model.fit() + yhat = model_fit.forecast(steps = HORIZON) + predictions.append(yhat) + obs = list(test_ts.iloc[t]) + # move the training window + history.append(obs[0]) + history.pop(0) + print(test_ts.index[t]) + print(t+1, ': predicted =', yhat, 'expected =', obs) + ``` + + Lahko opazujete potek učenja: + + ```output + 2014-12-30 00:00:00 + 1 : predicted = [0.32 0.29 0.28] expected = [0.32945389435989236, 0.2900626678603402, 0.2739480752014323] + + 2014-12-30 01:00:00 + 2 : predicted = [0.3 0.29 0.3 ] expected = [0.2900626678603402, 0.2739480752014323, 0.26812891674127126] + + 2014-12-30 02:00:00 + 3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795] + ``` + +1. Primerjajte napovedi z dejansko obremenitvijo: + + ```python + eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)]) + eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1] + eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h') + eval_df['actual'] = np.array(np.transpose(test_ts)).ravel() + eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']]) + eval_df.head() + ``` + + Izhod + | | | timestamp | h | prediction | actual | + | --- | ---------- | --------- | --- | ---------- | -------- | + | 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 | + | 1 | 2014-12-30 | 01:00:00 | t+1 | 2,955.53 | 2,935.00 | + | 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 | + | 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 | + | 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 | + + Opazujte napovedi urnih podatkov v primerjavi z dejansko obremenitvijo. Kako natančen je model? + +### Preverite natančnost modela + +Preverite natančnost svojega modela z oceno njegove povprečne absolutne odstotne napake (MAPE) za vse napovedi. +> **🧮 Poglejmo matematiko** +> +> ![MAPE](../../../../7-TimeSeries/2-ARIMA/images/mape.png) +> +> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) se uporablja za prikaz natančnosti napovedi kot razmerje, opredeljeno z zgornjo formulo. Razlika med dejansko vrednostjo in napovedano vrednostjo je deljena z dejansko vrednostjo. "Absolutna vrednost v tem izračunu se sešteje za vsako napovedano točko v času in deli s številom prilagojenih točk n." [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error) +1. Izrazite enačbo v kodi: + + ```python + if(HORIZON > 1): + eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual'] + print(eval_df.groupby('h')['APE'].mean()) + ``` + +1. Izračunajte MAPE za en korak: + + ```python + print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%') + ``` + + MAPE napovedi za en korak: 0.5570581332313952 % + +1. Izpišite MAPE za več korakov: + + ```python + print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%') + ``` + + ```output + Multi-step forecast MAPE: 1.1460048657704118 % + ``` + + Nizka vrednost je najboljša: upoštevajte, da je napoved z MAPE 10 odstopanje za 10 %. + +1. Kot vedno je tovrstno merjenje natančnosti lažje razumeti vizualno, zato ga prikažimo na grafu: + + ```python + if(HORIZON == 1): + ## Plotting single step forecast + eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8)) + + else: + ## Plotting multi step forecast + plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']] + for t in range(1, HORIZON+1): + plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values + + fig = plt.figure(figsize=(15, 8)) + ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0) + ax = fig.add_subplot(111) + for t in range(1, HORIZON+1): + x = plot_df['timestamp'][(t-1):] + y = plot_df['t+'+str(t)][0:len(x)] + ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t)) + + ax.legend(loc='best') + + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![model časovne vrste](../../../../7-TimeSeries/2-ARIMA/images/accuracy.png) + +🏆 Zelo lep graf, ki prikazuje model z dobro natančnostjo. Odlično opravljeno! + +--- + +## 🚀Izziv + +Raziskujte načine za testiranje natančnosti modela časovnih vrst. V tej lekciji smo se dotaknili MAPE, vendar obstajajo tudi druge metode, ki jih lahko uporabite. Raziskujte jih in jih označite. Koristen dokument najdete [tukaj](https://otexts.com/fpp2/accuracy.html). + +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Ta lekcija se dotika le osnov napovedovanja časovnih vrst z ARIMA. Vzemite si čas za poglobitev znanja z raziskovanjem [tega repozitorija](https://microsoft.github.io/forecasting/) in njegovih različnih tipov modelov, da se naučite drugih načinov za gradnjo modelov časovnih vrst. + +## Naloga + +[Nov ARIMA model](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/7-TimeSeries/2-ARIMA/assignment.md b/translations/sl/7-TimeSeries/2-ARIMA/assignment.md new file mode 100644 index 00000000..bfcd438a --- /dev/null +++ b/translations/sl/7-TimeSeries/2-ARIMA/assignment.md @@ -0,0 +1,25 @@ + +# Nov ARIMA model + +## Navodila + +Zdaj, ko ste izdelali ARIMA model, ustvarite novega z novimi podatki (poskusite enega od [teh podatkovnih nizov z Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Svoje delo dokumentirajte v zvezku, vizualizirajte podatke in model ter preverite njegovo natančnost z uporabo MAPE. + +## Merila + +| Merila | Odlično | Zadostno | Potrebno izboljšanje | +| --------| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------- | +| | Predstavljen je zvezek z novim ARIMA modelom, ki je bil izdelan, testiran in pojasnjen z vizualizacijami ter navedeno natančnostjo. | Predstavljen zvezek ni dokumentiran ali vsebuje napake | Predstavljen je nepopoln zvezek | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas opozarjamo, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazuma ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/7-TimeSeries/2-ARIMA/solution/Julia/README.md b/translations/sl/7-TimeSeries/2-ARIMA/solution/Julia/README.md new file mode 100644 index 00000000..8a56eb16 --- /dev/null +++ b/translations/sl/7-TimeSeries/2-ARIMA/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/7-TimeSeries/2-ARIMA/solution/R/README.md b/translations/sl/7-TimeSeries/2-ARIMA/solution/R/README.md new file mode 100644 index 00000000..584c1cbc --- /dev/null +++ b/translations/sl/7-TimeSeries/2-ARIMA/solution/R/README.md @@ -0,0 +1,15 @@ + +to je začasno mesto + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas opozarjamo, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/7-TimeSeries/3-SVR/README.md b/translations/sl/7-TimeSeries/3-SVR/README.md new file mode 100644 index 00000000..2aa3b63c --- /dev/null +++ b/translations/sl/7-TimeSeries/3-SVR/README.md @@ -0,0 +1,393 @@ + +# Napovedovanje časovnih vrst z regresorjem podpornih vektorjev + +V prejšnji lekciji ste se naučili uporabljati model ARIMA za napovedovanje časovnih vrst. Zdaj si bomo ogledali model Support Vector Regressor, ki je regresijski model za napovedovanje neprekinjenih podatkov. + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +V tej lekciji boste spoznali specifičen način gradnje modelov z [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) za regresijo, ali **SVR: Support Vector Regressor**. + +### SVR v kontekstu časovnih vrst [^1] + +Preden razumemo pomen SVR pri napovedovanju časovnih vrst, je pomembno poznati naslednje koncepte: + +- **Regresija:** Tehnika nadzorovanega učenja za napovedovanje neprekinjenih vrednosti na podlagi danih vhodnih podatkov. Ideja je prilagoditi krivuljo (ali premico) v prostoru značilnosti, ki zajame največje število podatkovnih točk. [Kliknite tukaj](https://en.wikipedia.org/wiki/Regression_analysis) za več informacij. +- **Support Vector Machine (SVM):** Vrsta modela nadzorovanega strojnega učenja, ki se uporablja za klasifikacijo, regresijo in zaznavanje odstopanj. Model je hiperploskev v prostoru značilnosti, ki v primeru klasifikacije deluje kot meja, v primeru regresije pa kot najboljša prilagoditvena premica. Pri SVM se pogosto uporablja funkcija jedra (Kernel function), ki transformira podatkovni niz v prostor z več dimenzijami, da postane lažje ločljiv. [Kliknite tukaj](https://en.wikipedia.org/wiki/Support-vector_machine) za več informacij o SVM. +- **Support Vector Regressor (SVR):** Vrsta SVM, ki najde najboljšo prilagoditveno premico (ki je v primeru SVM hiperploskev), ki zajame največje število podatkovnih točk. + +### Zakaj SVR? [^1] + +V prejšnji lekciji ste spoznali ARIMA, ki je zelo uspešna statistična linearna metoda za napovedovanje časovnih vrst. Vendar pa so podatki časovnih vrst pogosto *nelinearni*, kar linearni modeli ne morejo zajeti. V takih primerih sposobnost SVM, da upošteva nelinearnost podatkov pri regresijskih nalogah, naredi SVR uspešnega pri napovedovanju časovnih vrst. + +## Naloga - izdelava modela SVR + +Prvi koraki za pripravo podatkov so enaki kot v prejšnji lekciji o [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA). + +Odprite mapo [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) v tej lekciji in poiščite datoteko [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb). [^2] + +1. Zaženite beležko in uvozite potrebne knjižnice: [^2] + + ```python + import sys + sys.path.append('../../') + ``` + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from sklearn.svm import SVR + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + ``` + +2. Naložite podatke iz datoteke `/data/energy.csv` v Pandas dataframe in si jih oglejte: [^2] + + ```python + energy = load_data('../../data')[['load']] + ``` + +3. Prikažite vse razpoložljive podatke o energiji od januarja 2012 do decembra 2014: [^2] + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![celotni podatki](../../../../7-TimeSeries/3-SVR/images/full-data.png) + + Zdaj pa izdelajmo naš model SVR. + +### Ustvarjanje učnih in testnih podatkovnih nizov + +Ko so podatki naloženi, jih lahko ločite na učni in testni niz. Nato jih boste preoblikovali v podatkovni niz, ki temelji na časovnih korakih, kar bo potrebno za SVR. Model boste trenirali na učnem nizu. Ko bo model končal s treniranjem, boste ocenili njegovo natančnost na učnem nizu, testnem nizu in nato na celotnem podatkovnem nizu, da preverite splošno zmogljivost. Poskrbeti morate, da testni niz zajema poznejše obdobje v času od učnega niza, da zagotovite, da model ne pridobi informacij iz prihodnjih časovnih obdobij [^2] (situacija, znana kot *Overfitting*). + +1. Dodelite dvomesečno obdobje od 1. septembra do 31. oktobra 2014 učnemu nizu. Testni niz bo vključeval dvomesečno obdobje od 1. novembra do 31. decembra 2014: [^2] + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + +2. Vizualizirajte razlike: [^2] + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![učni in testni podatki](../../../../7-TimeSeries/3-SVR/images/train-test.png) + +### Priprava podatkov za treniranje + +Zdaj morate pripraviti podatke za treniranje z izvajanjem filtriranja in skaliranja podatkov. Filtrirajte svoj podatkovni niz, da vključite samo potrebna časovna obdobja in stolpce, ter skalirajte podatke, da jih projicirate v interval 0,1. + +1. Filtrirajte izvirni podatkovni niz, da vključite samo omenjena časovna obdobja na nizih in samo potrebni stolpec 'load' ter datum: [^2] + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +2. Skalirajte učne podatke, da bodo v razponu (0, 1): [^2] + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + ``` + +4. Zdaj skalirajte testne podatke: [^2] + + ```python + test['load'] = scaler.transform(test) + ``` + +### Ustvarjanje podatkov s časovnimi koraki [^1] + +Za SVR preoblikujete vhodne podatke v obliko `[batch, timesteps]`. Tako obstoječe `train_data` in `test_data` preoblikujete tako, da dodate novo dimenzijo, ki se nanaša na časovne korake. + +```python +# Converting to numpy arrays +train_data = train.values +test_data = test.values +``` + +Za ta primer vzamemo `timesteps = 5`. Tako so vhodni podatki za model podatki za prve 4 časovne korake, izhod pa bodo podatki za 5. časovni korak. + +```python +timesteps=5 +``` + +Pretvorba učnih podatkov v 2D tensor z uporabo ugnezdene listne komprehencije: + +```python +train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0] +train_data_timesteps.shape +``` + +```output +(1412, 5) +``` + +Pretvorba testnih podatkov v 2D tensor: + +```python +test_data_timesteps=np.array([[j for j in test_data[i:i+timesteps]] for i in range(0,len(test_data)-timesteps+1)])[:,:,0] +test_data_timesteps.shape +``` + +```output +(44, 5) +``` + +Izbor vhodov in izhodov iz učnih in testnih podatkov: + +```python +x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]] +x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]] + +print(x_train.shape, y_train.shape) +print(x_test.shape, y_test.shape) +``` + +```output +(1412, 4) (1412, 1) +(44, 4) (44, 1) +``` + +### Implementacija SVR [^1] + +Zdaj je čas za implementacijo SVR. Za več informacij o tej implementaciji si lahko ogledate [to dokumentacijo](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html). Za našo implementacijo sledimo tem korakom: + + 1. Definirajte model z uporabo `SVR()` in podajte hiperparametre modela: kernel, gamma, c in epsilon + 2. Pripravite model za učne podatke z uporabo funkcije `fit()` + 3. Izvedite napovedi z uporabo funkcije `predict()` + +Zdaj ustvarimo model SVR. Tukaj uporabimo [RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) in nastavimo hiperparametre gamma, C in epsilon na 0.5, 10 in 0.05. + +```python +model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05) +``` + +#### Prilagoditev modela na učne podatke [^1] + +```python +model.fit(x_train, y_train[:,0]) +``` + +```output +SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5, + kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False) +``` + +#### Izvedba napovedi modela [^1] + +```python +y_train_pred = model.predict(x_train).reshape(-1,1) +y_test_pred = model.predict(x_test).reshape(-1,1) + +print(y_train_pred.shape, y_test_pred.shape) +``` + +```output +(1412, 1) (44, 1) +``` + +Izdelali ste svoj SVR! Zdaj ga moramo oceniti. + +### Ocenjevanje modela [^1] + +Za ocenjevanje najprej skaliramo podatke nazaj na našo izvirno lestvico. Nato za preverjanje zmogljivosti prikažemo izvirni in napovedani časovni niz ter natisnemo rezultat MAPE. + +Skaliranje napovedanih in izvirnih izhodov: + +```python +# Scaling the predictions +y_train_pred = scaler.inverse_transform(y_train_pred) +y_test_pred = scaler.inverse_transform(y_test_pred) + +print(len(y_train_pred), len(y_test_pred)) +``` + +```python +# Scaling the original values +y_train = scaler.inverse_transform(y_train) +y_test = scaler.inverse_transform(y_test) + +print(len(y_train), len(y_test)) +``` + +#### Preverjanje zmogljivosti modela na učnih in testnih podatkih [^1] + +Iz podatkovnega niza izvlečemo časovne oznake za prikaz na x-osi našega grafa. Upoštevajte, da uporabljamo prvih ```timesteps-1``` vrednosti kot vhod za prvi izhod, zato se časovne oznake za izhod začnejo po tem. + +```python +train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:] +test_timestamps = energy[test_start_dt:].index[timesteps-1:] + +print(len(train_timestamps), len(test_timestamps)) +``` + +```output +1412 44 +``` + +Prikaz napovedi za učne podatke: + +```python +plt.figure(figsize=(25,6)) +plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.title("Training data prediction") +plt.show() +``` + +![napoved učnih podatkov](../../../../7-TimeSeries/3-SVR/images/train-data-predict.png) + +Natisnite MAPE za učne podatke + +```python +print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%') +``` + +```output +MAPE for training data: 1.7195710200875551 % +``` + +Prikaz napovedi za testne podatke + +```python +plt.figure(figsize=(10,3)) +plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![napoved testnih podatkov](../../../../7-TimeSeries/3-SVR/images/test-data-predict.png) + +Natisnite MAPE za testne podatke + +```python +print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%') +``` + +```output +MAPE for testing data: 1.2623790187854018 % +``` + +🏆 Na testnem podatkovnem nizu imate zelo dober rezultat! + +### Preverjanje zmogljivosti modela na celotnem podatkovnem nizu [^1] + +```python +# Extracting load values as numpy array +data = energy.copy().values + +# Scaling +data = scaler.transform(data) + +# Transforming to 2D tensor as per model input requirement +data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0] +print("Tensor shape: ", data_timesteps.shape) + +# Selecting inputs and outputs from data +X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]] +print("X shape: ", X.shape,"\nY shape: ", Y.shape) +``` + +```output +Tensor shape: (26300, 5) +X shape: (26300, 4) +Y shape: (26300, 1) +``` + +```python +# Make model predictions +Y_pred = model.predict(X).reshape(-1,1) + +# Inverse scale and reshape +Y_pred = scaler.inverse_transform(Y_pred) +Y = scaler.inverse_transform(Y) +``` + +```python +plt.figure(figsize=(30,8)) +plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(Y_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![napoved celotnih podatkov](../../../../7-TimeSeries/3-SVR/images/full-data-predict.png) + +```python +print('MAPE: ', mape(Y_pred, Y)*100, '%') +``` + +```output +MAPE: 2.0572089029888656 % +``` + +🏆 Zelo lepi grafi, ki prikazujejo model z dobro natančnostjo. Odlično opravljeno! + +--- + +## 🚀Izziv + +- Poskusite prilagoditi hiperparametre (gamma, C, epsilon) med ustvarjanjem modela in ocenite podatke, da vidite, kateri nabor hiperparametrov daje najboljše rezultate na testnih podatkih. Za več informacij o teh hiperparametrih si lahko ogledate dokument [tukaj](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel). +- Poskusite uporabiti različne funkcije jedra za model in analizirajte njihovo zmogljivost na podatkovnem nizu. Koristen dokument najdete [tukaj](https://scikit-learn.org/stable/modules/svm.html#kernel-functions). +- Poskusite uporabiti različne vrednosti za `timesteps`, da model pogleda nazaj za napovedovanje. + +## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled in samostojno učenje + +Ta lekcija je bila namenjena predstavitvi uporabe SVR za napovedovanje časovnih vrst. Za več informacij o SVR si lahko ogledate [ta blog](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/). Ta [dokumentacija o scikit-learn](https://scikit-learn.org/stable/modules/svm.html) ponuja bolj celovito razlago o SVM na splošno, [SVR](https://scikit-learn.org/stable/modules/svm.html#regression) in tudi druge podrobnosti implementacije, kot so različne [funkcije jedra](https://scikit-learn.org/stable/modules/svm.html#kernel-functions), ki jih je mogoče uporabiti, ter njihovi parametri. + +## Naloga + +[Novi model SVR](assignment.md) + +## Zasluge + +[^1]: Besedilo, koda in izhod v tem razdelku je prispeval [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD) +[^2]: Besedilo, koda in izhod v tem razdelku je vzeto iz [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/7-TimeSeries/3-SVR/assignment.md b/translations/sl/7-TimeSeries/3-SVR/assignment.md new file mode 100644 index 00000000..cb82c4f6 --- /dev/null +++ b/translations/sl/7-TimeSeries/3-SVR/assignment.md @@ -0,0 +1,29 @@ + +# Nov model SVR + +## Navodila [^1] + +Zdaj, ko ste zgradili model SVR, zgradite novega z novimi podatki (poskusite enega od [teh podatkovnih nizov z Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Svoje delo dokumentirajte v zvezku, vizualizirajte podatke in svoj model ter preizkusite njegovo natančnost z ustreznimi grafi in MAPE. Prav tako poskusite prilagoditi različne hiperparametre in uporabiti različne vrednosti za časovne korake. + +## Merila [^1] + +| Merila | Odlično | Zadostno | Potrebno izboljšanje | +| -------- | ----------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------- | +| | Predstavljen je zvezek z zgrajenim, testiranim in pojasnjenim modelom SVR, skupaj z vizualizacijami in navedeno natančnostjo. | Predstavljen zvezek ni dokumentiran ali vsebuje napake. | Predstavljen je nepopoln zvezek. | + + + +[^1]: Besedilo v tem razdelku temelji na [nalogi iz ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/7-TimeSeries/README.md b/translations/sl/7-TimeSeries/README.md new file mode 100644 index 00000000..3fffb560 --- /dev/null +++ b/translations/sl/7-TimeSeries/README.md @@ -0,0 +1,37 @@ + +# Uvod v napovedovanje časovnih vrst + +Kaj je napovedovanje časovnih vrst? Gre za napovedovanje prihodnjih dogodkov z analizo preteklih trendov. + +## Regionalna tema: svetovna poraba električne energije ✨ + +V teh dveh lekcijah boste spoznali napovedovanje časovnih vrst, nekoliko manj znano področje strojnega učenja, ki je kljub temu izjemno dragoceno za industrijske in poslovne aplikacije ter druge področja. Čeprav se lahko nevronske mreže uporabljajo za izboljšanje uporabnosti teh modelov, jih bomo preučevali v kontekstu klasičnega strojnega učenja, saj modeli pomagajo napovedovati prihodnjo uspešnost na podlagi preteklosti. + +Naša regionalna osredotočenost je poraba električne energije po svetu, zanimiv nabor podatkov za učenje o napovedovanju prihodnje porabe električne energije na podlagi vzorcev pretekle obremenitve. Vidite lahko, kako je takšno napovedovanje lahko izjemno koristno v poslovnem okolju. + +![električno omrežje](../../../7-TimeSeries/images/electric-grid.jpg) + +Fotografija [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) električnih stolpov na cesti v Rajasthanu na [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +## Lekcije + +1. [Uvod v napovedovanje časovnih vrst](1-Introduction/README.md) +2. [Izdelava ARIMA modelov časovnih vrst](2-ARIMA/README.md) +3. [Izdelava Support Vector Regressor za napovedovanje časovnih vrst](3-SVR/README.md) + +## Zasluge + +"Uvod v napovedovanje časovnih vrst" sta napisali ⚡️ [Francesca Lazzeri](https://twitter.com/frlazzeri) in [Jen Looper](https://twitter.com/jenlooper). Zvezki so se prvič pojavili na spletu v [Azure "Deep Learning For Time Series" repozitoriju](https://github.com/Azure/DeepLearningForTimeSeriesForecasting), ki ga je prvotno napisala Francesca Lazzeri. Lekcijo o SVR je napisal [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD). + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/8-Reinforcement/1-QLearning/README.md b/translations/sl/8-Reinforcement/1-QLearning/README.md new file mode 100644 index 00000000..f39ce4a9 --- /dev/null +++ b/translations/sl/8-Reinforcement/1-QLearning/README.md @@ -0,0 +1,256 @@ + +# Uvod v učenje z okrepitvijo in Q-učenje + +![Povzetek učenja z okrepitvijo v strojnem učenju v obliki sketchnote](../../../../sketchnotes/ml-reinforcement.png) +> Sketchnote avtorja [Tomomi Imura](https://www.twitter.com/girlie_mac) + +Učenje z okrepitvijo vključuje tri pomembne koncepte: agenta, določena stanja in niz dejanj za vsako stanje. Z izvajanjem dejanja v določenem stanju agent prejme nagrado. Predstavljajte si računalniško igro Super Mario. Vi ste Mario, nahajate se na ravni igre, stojite ob robu prepada. Nad vami je kovanec. Vi kot Mario, na določeni ravni igre, na določenem položaju ... to je vaše stanje. Če se premaknete korak v desno (dejanje), boste padli čez rob in prejeli nizko številčno oceno. Če pa pritisnete gumb za skok, boste dosegli točko in ostali živi. To je pozitiven izid, ki bi vam moral prinesti pozitivno številčno oceno. + +Z uporabo učenja z okrepitvijo in simulatorja (igre) se lahko naučite igrati igro tako, da maksimizirate nagrado, kar pomeni, da ostanete živi in dosežete čim več točk. + +[![Uvod v učenje z okrepitvijo](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) + +> 🎥 Kliknite zgornjo sliko, da poslušate Dmitryja, kako razpravlja o učenju z okrepitvijo + +## [Pred-predavanje kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Predpogoji in nastavitev + +V tej lekciji bomo eksperimentirali s kodo v Pythonu. Kodo iz Jupyter Notebooka iz te lekcije bi morali biti sposobni zagnati na svojem računalniku ali v oblaku. + +Odprite [notebook lekcije](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) in sledite lekciji za gradnjo. + +> **Opomba:** Če odpirate to kodo iz oblaka, morate pridobiti tudi datoteko [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), ki se uporablja v kodi notebooka. Dodajte jo v isto mapo kot notebook. + +## Uvod + +V tej lekciji bomo raziskali svet **[Peter in volk](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, ki ga je navdihnila glasbena pravljica ruskega skladatelja [Sergeja Prokofjeva](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Uporabili bomo **učenje z okrepitvijo**, da bomo Petru omogočili raziskovanje njegovega okolja, zbiranje okusnih jabolk in izogibanje volku. + +**Učenje z okrepitvijo** (RL) je tehnika učenja, ki nam omogoča, da se naučimo optimalnega vedenja **agenta** v določenem **okolju** z izvajanjem številnih eksperimentov. Agent v tem okolju mora imeti določen **cilj**, ki ga določa **funkcija nagrade**. + +## Okolje + +Za enostavnost si predstavljajmo Petrov svet kot kvadratno ploščo velikosti `širina` x `višina`, kot je ta: + +![Petrovo okolje](../../../../8-Reinforcement/1-QLearning/images/environment.png) + +Vsaka celica na tej plošči je lahko: + +* **zemlja**, po kateri lahko Peter in druga bitja hodijo. +* **voda**, po kateri očitno ne morete hoditi. +* **drevo** ali **trava**, kjer se lahko spočijete. +* **jabolko**, ki predstavlja nekaj, kar bi Peter z veseljem našel, da se nahrani. +* **volk**, ki je nevaren in se mu je treba izogniti. + +Obstaja ločen Python modul, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), ki vsebuje kodo za delo s tem okoljem. Ker ta koda ni pomembna za razumevanje naših konceptov, bomo modul uvozili in ga uporabili za ustvarjanje vzorčne plošče (koda blok 1): + +```python +from rlboard import * + +width, height = 8,8 +m = Board(width,height) +m.randomize(seed=13) +m.plot() +``` + +Ta koda bi morala natisniti sliko okolja, podobno zgornji. + +## Dejanja in politika + +V našem primeru bi bil Petrov cilj najti jabolko, medtem ko se izogiba volku in drugim oviram. Da bi to dosegel, se lahko preprosto sprehaja, dokler ne najde jabolka. + +Zato lahko na katerem koli položaju izbere eno od naslednjih dejanj: gor, dol, levo in desno. + +Ta dejanja bomo definirali kot slovar in jih preslikali v pare ustreznih sprememb koordinat. Na primer, premik v desno (`R`) bi ustrezal paru `(1,0)`. (koda blok 2): + +```python +actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) } +action_idx = { a : i for i,a in enumerate(actions.keys()) } +``` + +Če povzamemo, strategija in cilj tega scenarija sta naslednja: + +- **Strategija** našega agenta (Petra) je definirana z tako imenovano **politiko**. Politika je funkcija, ki vrne dejanje v katerem koli danem stanju. V našem primeru je stanje problema predstavljeno s ploščo, vključno s trenutnim položajem igralca. + +- **Cilj** učenja z okrepitvijo je sčasoma naučiti dobro politiko, ki nam bo omogočila učinkovito reševanje problema. Vendar pa kot osnovo upoštevajmo najpreprostejšo politiko, imenovano **naključna hoja**. + +## Naključna hoja + +Najprej rešimo naš problem z implementacijo strategije naključne hoje. Pri naključni hoji bomo naključno izbrali naslednje dejanje iz dovoljenih dejanj, dokler ne dosežemo jabolka (koda blok 3). + +1. Implementirajte naključno hojo s spodnjo kodo: + + ```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 + if start_position: + m.human = start_position + else: + m.random_start() + while True: + if m.at() == Board.Cell.apple: + return n # success! + if m.at() in [Board.Cell.wolf, Board.Cell.water]: + return -1 # eaten by wolf or drowned + 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 + break + n+=1 + + walk(m,random_policy) + ``` + + Klic funkcije `walk` bi moral vrniti dolžino ustrezne poti, ki se lahko razlikuje od enega zagona do drugega. + +1. Izvedite eksperiment hoje večkrat (recimo 100-krat) in natisnite rezultate statistike (koda blok 4): + + ```python + def print_statistics(policy): + s,w,n = 0,0,0 + for _ in range(100): + z = walk(m,policy) + if z<0: + w+=1 + else: + s += z + n += 1 + print(f"Average path length = {s/n}, eaten by wolf: {w} times") + + print_statistics(random_policy) + ``` + + Opazite, da je povprečna dolžina poti okoli 30-40 korakov, kar je precej, glede na to, da je povprečna razdalja do najbližjega jabolka okoli 5-6 korakov. + + Prav tako lahko vidite, kako izgleda Petrov premik med naključno hojo: + + ![Petrova naključna hoja](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) + +## Funkcija nagrade + +Da bi bila naša politika bolj inteligentna, moramo razumeti, katera dejanja so "boljša" od drugih. Za to moramo definirati naš cilj. + +Cilj lahko definiramo v smislu **funkcije nagrade**, ki bo vrnila neko vrednost ocene za vsako stanje. Višja kot je številka, boljša je nagrada. (koda blok 5) + +```python +move_reward = -0.1 +goal_reward = 10 +end_reward = -10 + +def reward(m,pos=None): + pos = pos or m.human + if not m.is_valid(pos): + return end_reward + x = m.at(pos) + if x==Board.Cell.water or x == Board.Cell.wolf: + return end_reward + if x==Board.Cell.apple: + return goal_reward + return move_reward +``` + +Zanimivo pri funkcijah nagrade je, da v večini primerov *prejmemo bistveno nagrado šele na koncu igre*. To pomeni, da mora naš algoritem nekako zapomniti "dobre" korake, ki vodijo do pozitivne nagrade na koncu, in povečati njihov pomen. Podobno je treba odvračati vse poteze, ki vodijo do slabih rezultatov. + +## Q-učenje + +Algoritem, ki ga bomo tukaj obravnavali, se imenuje **Q-učenje**. V tem algoritmu je politika definirana s funkcijo (ali podatkovno strukturo), imenovano **Q-tabela**. Ta beleži "dobroto" vsakega dejanja v določenem stanju. + +Imenuje se Q-tabela, ker jo je pogosto priročno predstavljati kot tabelo ali večdimenzionalno matriko. Ker ima naša plošča dimenzije `širina` x `višina`, lahko Q-tabelo predstavimo z numpy matriko oblike `širina` x `višina` x `len(actions)`: (koda blok 6) + +```python +Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) +``` + +Opazite, da vse vrednosti Q-tabele inicializiramo z enako vrednostjo, v našem primeru - 0,25. To ustreza politiki "naključne hoje", ker so vse poteze v vsakem stanju enako dobre. Q-tabelo lahko posredujemo funkciji `plot`, da vizualiziramo tabelo na plošči: `m.plot(Q)`. + +![Petrovo okolje](../../../../8-Reinforcement/1-QLearning/images/env_init.png) + +V središču vsake celice je "puščica", ki označuje prednostno smer gibanja. Ker so vse smeri enake, je prikazana pika. + +Zdaj moramo zagnati simulacijo, raziskati naše okolje in se naučiti boljše porazdelitve vrednosti Q-tabele, kar nam bo omogočilo veliko hitrejše iskanje poti do jabolka. + +## Bistvo Q-učenja: Bellmanova enačba + +Ko se začnemo premikati, bo vsako dejanje imelo ustrezno nagrado, tj. teoretično lahko izberemo naslednje dejanje na podlagi najvišje takojšnje nagrade. Vendar pa v večini stanj poteza ne bo dosegla našega cilja doseči jabolko, zato ne moremo takoj odločiti, katera smer je boljša. + +> Ne pozabite, da ni pomemben trenutni rezultat, temveč končni rezultat, ki ga bomo dosegli na koncu simulacije. + +Da bi upoštevali to odloženo nagrado, moramo uporabiti načela **[dinamičnega programiranja](https://en.wikipedia.org/wiki/Dynamic_programming)**, ki nam omogočajo, da o problemu razmišljamo rekurzivno. + +Recimo, da smo zdaj v stanju *s* in se želimo premakniti v naslednje stanje *s'*. S tem bomo prejeli takojšnjo nagrado *r(s,a)*, določeno s funkcijo nagrade, plus neko prihodnjo nagrado. Če predpostavimo, da naša Q-tabela pravilno odraža "privlačnost" vsakega dejanja, bomo v stanju *s'* izbrali dejanje *a*, ki ustreza največji vrednosti *Q(s',a')*. Tako bo najboljša možna prihodnja nagrada, ki jo lahko dobimo v stanju *s*, definirana kot `max` + +## Preverjanje politike + +Ker Q-tabela prikazuje "privlačnost" vsakega dejanja v vsakem stanju, jo je precej enostavno uporabiti za določitev učinkovite navigacije v našem svetu. V najpreprostejšem primeru lahko izberemo dejanje, ki ustreza najvišji vrednosti v Q-tabeli: (koda 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) +``` + +> Če zgornjo kodo poskusite večkrat, boste morda opazili, da se včasih "zatakne" in morate pritisniti gumb STOP v beležnici, da jo prekinete. To se zgodi, ker lahko pride do situacij, ko si dve stanji "kažeta" druga na drugo glede na optimalno Q-vrednost, zaradi česar agent neskončno prehaja med tema dvema stanjema. + +## 🚀Izziv + +> **Naloga 1:** Spremenite funkcijo `walk`, da omejite največjo dolžino poti na določeno število korakov (na primer 100) in opazujte, kako zgornja koda občasno vrne to vrednost. + +> **Naloga 2:** Spremenite funkcijo `walk`, da se ne vrača na mesta, kjer je že bil. To bo preprečilo, da bi se `walk` zanko ponavljal, vendar se agent še vedno lahko "ujame" na lokaciji, iz katere ne more pobegniti. + +## Navigacija + +Boljša navigacijska politika bi bila tista, ki smo jo uporabili med učenjem, in ki združuje izkoriščanje in raziskovanje. Pri tej politiki bomo vsako dejanje izbrali z določeno verjetnostjo, sorazmerno z vrednostmi v Q-tabeli. Ta strategija lahko še vedno povzroči, da se agent vrne na že raziskano mesto, vendar, kot lahko vidite iz spodnje kode, vodi do zelo kratke povprečne poti do želene lokacije (ne pozabite, da `print_statistics` simulacijo zažene 100-krat): (koda 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) +``` + +Po zagonu te kode bi morali dobiti precej krajšo povprečno dolžino poti kot prej, v razponu od 3 do 6. + +## Preučevanje učnega procesa + +Kot smo omenili, je učni proces ravnovesje med raziskovanjem in izkoriščanjem pridobljenega znanja o strukturi problemskega prostora. Videli smo, da so se rezultati učenja (sposobnost pomagati agentu najti kratko pot do cilja) izboljšali, vendar je zanimivo tudi opazovati, kako se povprečna dolžina poti spreminja med učnim procesom: + +Ugotovitve lahko povzamemo takole: + +- **Povprečna dolžina poti se poveča.** Na začetku opazimo, da se povprečna dolžina poti povečuje. To je verjetno zato, ker ko ne vemo ničesar o okolju, se zlahka ujamemo v slaba stanja, kot so voda ali volk. Ko se naučimo več in začnemo uporabljati to znanje, lahko okolje raziskujemo dlje, vendar še vedno ne vemo dobro, kje so jabolka. + +- **Dolžina poti se zmanjša, ko se naučimo več.** Ko se naučimo dovolj, postane agentu lažje doseči cilj, dolžina poti pa se začne zmanjševati. Vendar smo še vedno odprti za raziskovanje, zato pogosto odstopimo od najboljše poti in raziskujemo nove možnosti, kar podaljša pot. + +- **Dolžina se nenadoma poveča.** Na grafu opazimo tudi, da se dolžina na neki točki nenadoma poveča. To kaže na stohastično naravo procesa in na to, da lahko na neki točki "pokvarimo" koeficiente v Q-tabeli, tako da jih prepišemo z novimi vrednostmi. To bi morali idealno zmanjšati z zniževanjem učne stopnje (na primer, proti koncu učenja Q-tabeli dodajamo le majhne vrednosti). + +Na splošno je pomembno vedeti, da uspeh in kakovost učnega procesa močno odvisna od parametrov, kot so učna stopnja, zmanjševanje učne stopnje in faktor diskontiranja. Ti se pogosto imenujejo **hiperparametri**, da jih ločimo od **parametrov**, ki jih optimiziramo med učenjem (na primer koeficienti Q-tabele). Proces iskanja najboljših vrednosti hiperparametrov se imenuje **optimizacija hiperparametrov** in si zasluži ločeno obravnavo. + +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Naloga +[Bolj realističen svet](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitne nesporazume ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/8-Reinforcement/1-QLearning/assignment.md b/translations/sl/8-Reinforcement/1-QLearning/assignment.md new file mode 100644 index 00000000..438aa6e5 --- /dev/null +++ b/translations/sl/8-Reinforcement/1-QLearning/assignment.md @@ -0,0 +1,41 @@ + +# Bolj realističen svet + +V naši situaciji se je Peter lahko premikal skoraj brez utrujenosti ali lakote. V bolj realističnem svetu se mora občasno ustaviti, da si odpočije, in se tudi nahraniti. Naredimo naš svet bolj realističen z uvedbo naslednjih pravil: + +1. Pri premikanju iz enega kraja v drugega Peter izgublja **energijo** in pridobiva **utrujenost**. +2. Peter lahko pridobi več energije z uživanjem jabolk. +3. Peter se lahko znebi utrujenosti z počitkom pod drevesom ali na travi (tj. ko stopi na polje z drevesom ali travo - zeleno polje). +4. Peter mora najti in ubiti volka. +5. Da bi ubil volka, mora Peter imeti določene ravni energije in utrujenosti, sicer izgubi bitko. + +## Navodila + +Uporabite originalni zvezek [notebook.ipynb](../../../../8-Reinforcement/1-QLearning/notebook.ipynb) kot izhodišče za vašo rešitev. + +Spremenite funkcijo nagrajevanja glede na pravila igre, zaženite algoritem za okrepitev učenja, da se naučite najboljše strategije za zmago v igri, in primerjajte rezultate naključnega sprehoda z vašim algoritmom glede na število zmag in porazov. + +> **Note**: V vašem novem svetu je stanje bolj kompleksno in poleg človeške pozicije vključuje tudi ravni utrujenosti in energije. Stanje lahko predstavite kot nabor (Polje, energija, utrujenost) ali definirate razred za stanje (lahko ga tudi izpeljete iz `Board`), ali pa celo spremenite originalni razred `Board` znotraj [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py). + +V vaši rešitvi prosimo, da ohranite kodo, ki je odgovorna za strategijo naključnega sprehoda, in na koncu primerjajte rezultate vašega algoritma z naključnim sprehodom. + +> **Note**: Morda boste morali prilagoditi hiperparametre, da bo delovalo, še posebej število epoh. Ker je uspeh igre (boj z volkom) redek dogodek, lahko pričakujete precej daljši čas učenja. + +## Merila + +| Merilo | Odlično | Zadostno | Potrebno izboljšanje | +| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| | Predstavljen je zvezek z definicijo novih pravil sveta, algoritmom Q-Learning in nekaj besedilnimi razlagami. Q-Learning bistveno izboljša rezultate v primerjavi z naključnim sprehodom. | Predstavljen je zvezek, Q-Learning je implementiran in izboljša rezultate v primerjavi z naključnim sprehodom, vendar ne bistveno; ali zvezek je slabo dokumentiran in koda ni dobro strukturirana | Narejen je poskus redefinicije pravil sveta, vendar algoritem Q-Learning ne deluje ali funkcija nagrajevanja ni v celoti definirana | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/8-Reinforcement/1-QLearning/solution/Julia/README.md b/translations/sl/8-Reinforcement/1-QLearning/solution/Julia/README.md new file mode 100644 index 00000000..814c05fe --- /dev/null +++ b/translations/sl/8-Reinforcement/1-QLearning/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto za izpolnitev + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/8-Reinforcement/1-QLearning/solution/R/README.md b/translations/sl/8-Reinforcement/1-QLearning/solution/R/README.md new file mode 100644 index 00000000..4d0f947b --- /dev/null +++ b/translations/sl/8-Reinforcement/1-QLearning/solution/R/README.md @@ -0,0 +1,15 @@ + +to je začasno nadomestilo + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/8-Reinforcement/2-Gym/README.md b/translations/sl/8-Reinforcement/2-Gym/README.md new file mode 100644 index 00000000..e6144e10 --- /dev/null +++ b/translations/sl/8-Reinforcement/2-Gym/README.md @@ -0,0 +1,351 @@ + +# CartPole Drsanje + +Problem, ki smo ga reševali v prejšnji lekciji, se morda zdi kot igrača, ki ni uporabna v resničnih scenarijih. To ni res, saj veliko resničnih problemov deli podobne značilnosti – vključno z igranjem šaha ali Go. Ti problemi so podobni, ker imamo tudi tukaj ploščo z določenimi pravili in **diskretno stanje**. + +## [Predhodni kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +V tej lekciji bomo uporabili enaka načela Q-učenja za problem s **kontinuiranim stanjem**, tj. stanjem, ki ga določajo ena ali več realnih števil. Ukvarjali se bomo z naslednjim problemom: + +> **Problem**: Če želi Peter pobegniti volku, mora biti sposoben hitreje premikati. Videli bomo, kako se Peter lahko nauči drsati, zlasti ohranjati ravnotežje, z uporabo Q-učenja. + +![Veliki pobeg!](../../../../8-Reinforcement/2-Gym/images/escape.png) + +> Peter in njegovi prijatelji postanejo ustvarjalni, da pobegnejo volku! Slika: [Jen Looper](https://twitter.com/jenlooper) + +Uporabili bomo poenostavljeno različico ohranjanja ravnotežja, znano kot problem **CartPole**. V svetu CartPole imamo horizontalni drsnik, ki se lahko premika levo ali desno, cilj pa je uravnotežiti vertikalno palico na vrhu drsnika. + +## Predpogoji + +V tej lekciji bomo uporabili knjižnico **OpenAI Gym** za simulacijo različnih **okolij**. Kodo te lekcije lahko zaženete lokalno (npr. iz Visual Studio Code), v tem primeru se bo simulacija odprla v novem oknu. Pri izvajanju kode na spletu boste morda morali narediti nekaj prilagoditev, kot je opisano [tukaj](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7). + +## OpenAI Gym + +V prejšnji lekciji so bila pravila igre in stanje podana z razredom `Board`, ki smo ga sami definirali. Tukaj bomo uporabili posebno **simulacijsko okolje**, ki bo simuliralo fiziko palice za uravnoteženje. Eno najbolj priljubljenih simulacijskih okolij za treniranje algoritmov za krepitev učenja se imenuje [Gym](https://gym.openai.com/), ki ga vzdržuje [OpenAI](https://openai.com/). Z uporabo tega Gym-a lahko ustvarimo različna **okolja**, od simulacije CartPole do Atari iger. + +> **Opomba**: Druge okolja, ki jih ponuja OpenAI Gym, si lahko ogledate [tukaj](https://gym.openai.com/envs/#classic_control). + +Najprej namestimo Gym in uvozimo potrebne knjižnice (koda blok 1): + +```python +import sys +!{sys.executable} -m pip install gym + +import gym +import matplotlib.pyplot as plt +import numpy as np +import random +``` + +## Naloga - inicializacija okolja CartPole + +Za delo s problemom uravnoteženja CartPole moramo inicializirati ustrezno okolje. Vsako okolje je povezano z: + +- **Prostorom opazovanja**, ki določa strukturo informacij, ki jih prejmemo iz okolja. Pri problemu CartPole prejmemo položaj palice, hitrost in nekatere druge vrednosti. + +- **Prostorom akcij**, ki določa možne akcije. V našem primeru je prostor akcij diskreten in obsega dve akciji - **levo** in **desno**. (koda blok 2) + +1. Za inicializacijo vnesite naslednjo kodo: + + ```python + env = gym.make("CartPole-v1") + print(env.action_space) + print(env.observation_space) + print(env.action_space.sample()) + ``` + +Da vidimo, kako okolje deluje, zaženimo kratko simulacijo za 100 korakov. Na vsakem koraku podamo eno od akcij, ki jih je treba izvesti – v tej simulaciji naključno izberemo akcijo iz `action_space`. + +1. Zaženite spodnjo kodo in preverite rezultat. + + ✅ Ne pozabite, da je priporočljivo to kodo zagnati na lokalni Python namestitvi! (koda blok 3) + + ```python + env.reset() + + for i in range(100): + env.render() + env.step(env.action_space.sample()) + env.close() + ``` + + Videti bi morali nekaj podobnega tej sliki: + + ![ne-uravnotežen CartPole](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) + +1. Med simulacijo moramo pridobiti opazovanja, da se odločimo, kako ukrepati. Pravzaprav funkcija koraka vrne trenutna opazovanja, funkcijo nagrade in zastavico "done", ki označuje, ali ima smisel nadaljevati simulacijo ali ne: (koda blok 4) + + ```python + env.reset() + + done = False + while not done: + env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + print(f"{obs} -> {rew}") + env.close() + ``` + + V zvezku boste videli nekaj podobnega temu: + + ```text + [ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0 + [ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0 + [ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0 + [ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0 + [ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0 + ... + [ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0 + [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0 + ``` + + Vektor opazovanja, ki se vrne na vsakem koraku simulacije, vsebuje naslednje vrednosti: + - Položaj vozička + - Hitrost vozička + - Kot palice + - Hitrost vrtenja palice + +1. Pridobite minimalno in maksimalno vrednost teh števil: (koda blok 5) + + ```python + print(env.observation_space.low) + print(env.observation_space.high) + ``` + + Opazili boste tudi, da je vrednost nagrade na vsakem koraku simulacije vedno 1. To je zato, ker je naš cilj preživeti čim dlje, tj. ohraniti palico v razumno vertikalnem položaju čim dlje. + + ✅ Pravzaprav se simulacija CartPole šteje za rešeno, če nam uspe doseči povprečno nagrado 195 v 100 zaporednih poskusih. + +## Diskretizacija stanja + +Pri Q-učenju moramo zgraditi Q-tabelo, ki določa, kaj storiti v vsakem stanju. Da bi to lahko storili, mora biti stanje **diskretno**, natančneje, vsebovati mora končno število diskretnih vrednosti. Zato moramo nekako **diskretizirati** naša opazovanja in jih preslikati v končno množico stanj. + +Obstaja nekaj načinov, kako to storiti: + +- **Razdelitev na razrede**. Če poznamo interval določene vrednosti, lahko ta interval razdelimo na število **razredov** in nato vrednost zamenjamo s številko razreda, kateremu pripada. To lahko storimo z metodo numpy [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html). V tem primeru bomo natančno poznali velikost stanja, saj bo odvisna od števila razredov, ki jih izberemo za digitalizacijo. + +✅ Uporabimo lahko linearno interpolacijo, da vrednosti prenesemo na nek končni interval (recimo od -20 do 20), nato pa številke pretvorimo v cela števila z zaokroževanjem. To nam daje nekoliko manj nadzora nad velikostjo stanja, zlasti če ne poznamo natančnih razponov vhodnih vrednosti. Na primer, v našem primeru 2 od 4 vrednosti nimata zgornjih/spodnjih mej svojih vrednosti, kar lahko povzroči neskončno število stanj. + +V našem primeru bomo uporabili drugi pristop. Kot boste morda opazili kasneje, kljub neomejenim zgornjim/spodnjim mejam te vrednosti redko zavzamejo vrednosti zunaj določenih končnih intervalov, zato bodo ta stanja z ekstremnimi vrednostmi zelo redka. + +1. Tukaj je funkcija, ki bo vzela opazovanje iz našega modela in ustvarila nabor 4 celih števil: (koda blok 6) + + ```python + def discretize(x): + return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int)) + ``` + +1. Raziščimo še drugo metodo diskretizacije z uporabo razredov: (koda blok 7) + + ```python + def create_bins(i,num): + return np.arange(num+1)*(i[1]-i[0])/num+i[0] + + 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 + 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. Zdaj zaženimo kratko simulacijo in opazujmo te diskretne vrednosti okolja. Preizkusite `discretize` in `discretize_bins` ter preverite, ali obstaja razlika. + + ✅ `discretize_bins` vrne številko razreda, ki je osnovana na 0. Tako za vrednosti vhodne spremenljivke okoli 0 vrne številko iz sredine intervala (10). Pri `discretize` nas ni skrbelo za razpon izhodnih vrednosti, kar omogoča, da so negativne, zato vrednosti stanja niso premaknjene, in 0 ustreza 0. (koda blok 8) + + ```python + env.reset() + + done = False + while not done: + #env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + #print(discretize_bins(obs)) + print(discretize(obs)) + env.close() + ``` + + ✅ Odkomentirajte vrstico, ki se začne z `env.render`, če želite videti, kako se okolje izvaja. Sicer pa lahko izvedete v ozadju, kar je hitreje. To "nevidno" izvajanje bomo uporabili med procesom Q-učenja. + +## Struktura Q-tabele + +V prejšnji lekciji je bilo stanje preprosta dvojica števil od 0 do 8, zato je bilo priročno predstaviti Q-tabelo z numpy tensorjem oblike 8x8x2. Če uporabimo diskretizacijo z razredi, je velikost našega vektorskega stanja prav tako znana, zato lahko uporabimo enak pristop in predstavimo stanje z matriko oblike 20x20x10x10x2 (tu je 2 dimenzija prostora akcij, prve dimenzije pa ustrezajo številu razredov, ki smo jih izbrali za vsako od parametrov v prostoru opazovanja). + +Vendar pa včasih natančne dimenzije prostora opazovanja niso znane. V primeru funkcije `discretize` morda nikoli ne bomo prepričani, da naše stanje ostane znotraj določenih omejitev, ker nekatere izvirne vrednosti niso omejene. Zato bomo uporabili nekoliko drugačen pristop in predstavili Q-tabelo z uporabo slovarja. + +1. Uporabite par *(state,action)* kot ključ slovarja, vrednost pa bo ustrezala vrednosti vnosa Q-tabele. (koda blok 9) + + ```python + Q = {} + actions = (0,1) + + def qvalues(state): + return [Q.get((state,a),0) for a in actions] + ``` + + Tukaj definiramo tudi funkcijo `qvalues()`, ki vrne seznam vrednosti Q-tabele za dano stanje, ki ustreza vsem možnim akcijam. Če vnos ni prisoten v Q-tabeli, bomo privzeto vrnili 0. + +## Začnimo Q-učenje + +Zdaj smo pripravljeni naučiti Petra, kako ohranjati ravnotežje! + +1. Najprej nastavimo nekaj hiperparametrov: (koda blok 10) + + ```python + # hyperparameters + alpha = 0.3 + gamma = 0.9 + epsilon = 0.90 + ``` + + Tukaj je `alpha` **stopnja učenja**, ki določa, v kolikšni meri naj prilagodimo trenutne vrednosti Q-tabele na vsakem koraku. V prejšnji lekciji smo začeli z 1, nato pa zmanjšali `alpha` na nižje vrednosti med treningom. V tem primeru bomo ohranili konstantno vrednost za preprostost, kasneje pa lahko eksperimentirate z nastavitvijo vrednosti `alpha`. + + `gamma` je **faktor popusta**, ki kaže, v kolikšni meri naj dajemo prednost prihodnji nagradi pred trenutno nagrado. + + `epsilon` je **faktor raziskovanja/izkoriščanja**, ki določa, ali naj raje raziskujemo ali izkoriščamo. V našem algoritmu bomo v `epsilon` odstotkih primerov izbrali naslednjo akcijo glede na vrednosti Q-tabele, v preostalih primerih pa bomo izvedli naključno akcijo. To nam bo omogočilo raziskovanje področij iskalnega prostora, ki jih še nismo videli. + + ✅ Kar zadeva uravnoteženje – izbira naključne akcije (raziskovanje) bi delovala kot naključni udarec v napačno smer, palica pa bi se morala naučiti, kako obnoviti ravnotežje iz teh "napak". + +### Izboljšajmo algoritem + +Algoritem iz prejšnje lekcije lahko izboljšamo na dva načina: + +- **Izračunaj povprečno kumulativno nagrado** skozi več simulacij. Napredek bomo tiskali vsakih 5000 iteracij, povprečno kumulativno nagrado pa bomo izračunali za to obdobje. Če dosežemo več kot 195 točk, lahko problem štejemo za rešen, in to z boljšo kakovostjo, kot je zahtevano. + +- **Izračunaj največji povprečni kumulativni rezultat**, `Qmax`, in shranili bomo Q-tabelo, ki ustreza temu rezultatu. Ko zaženete trening, boste opazili, da se povprečni kumulativni rezultat včasih začne zmanjševati, zato želimo obdržati vrednosti Q-tabele, ki ustrezajo najboljšemu modelu, opaženemu med treningom. + +1. Zberite vse kumulativne nagrade pri vsaki simulaciji v vektorju `rewards` za nadaljnje risanje. (koda blok 11) + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + + Qmax = 0 + cum_rewards = [] + rewards = [] + for epoch in range(100000): + obs = env.reset() + done = False + cum_reward=0 + # == do the simulation == + while not done: + s = discretize(obs) + if random.random() Qmax: + Qmax = np.average(cum_rewards) + Qbest = Q + cum_rewards=[] + ``` + +Kaj lahko opazite iz teh rezultatov: + +- **Blizu našega cilja**. Zelo smo blizu doseganju cilja 195 kumulativnih nagrad v več kot 100 zaporednih simulacijah, ali pa smo ga morda že dosegli! Tudi če dobimo manjše številke, tega ne vemo, ker povprečimo skozi 5000 poskusov, medtem ko je formalno merilo le 100 poskusov. + +- **Nagrada začne upadati**. Včasih se nagrada začne zmanjševati, kar pomeni, da lahko "uničimo" že naučene vrednosti v Q-tabeli z novimi, ki poslabšajo situacijo. + +To opazovanje je bolj jasno vidno, če narišemo napredek treninga. + +## Risanje napredka treninga + +Med treningom smo zbirali vrednosti kumulativne nagrade pri vsaki iteraciji v vektorju `rewards`. Tukaj je, kako to izgleda, ko ga narišemo glede na številko iteracije: + +```python +plt.plot(rewards) +``` + +![surov napredek](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png) + +Iz tega grafa ni mogoče razbrati ničesar, saj se zaradi narave stohastičnega procesa treninga dolžina treninga močno razlikuje. Da bi ta graf imel več smisla, lahko izračunamo **tekoče povprečje** skozi serijo poskusov, recimo 100. To lahko priročno storimo z `np.convolve`: (koda blok 12) + +```python +def running_average(x,window): + return np.convolve(x,np.ones(window)/window,mode='valid') + +plt.plot(running_average(rewards,100)) +``` + +![napredek treninga](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png) + +## Spreminjanje hiperparametrov + +Da bi učenje postalo bolj stabilno, je smiselno med treningom prilagoditi nekatere naše hiperparametre. Zlasti: + +- **Za stopnjo učenja**, `alpha`, lahko začnemo z vrednostmi blizu 1, nato pa postopoma zmanjšujemo parameter. Sčasoma bomo dobili dobre verjetnostne vrednosti v Q-tabeli, zato jih moramo le rahlo prilagoditi in ne popolnoma prepisati z novimi vrednostmi. + +- **Povečaj epsilon**. Morda želimo počasi povečati `epsilon`, da bi manj raziskovali in bolj izkoriščali. Verjetno ima smisel začeti z nižjo vrednostjo `epsilon` in jo postopoma povečati skoraj do 1. +> **Naloga 1**: Preizkusite različne vrednosti hiperparametrov in preverite, ali lahko dosežete višjo kumulativno nagrado. Ali dosežete več kot 195? +> **Naloga 2**: Da formalno rešite problem, morate doseči povprečno nagrado 195 v 100 zaporednih poskusih. Merite to med treningom in se prepričajte, da ste problem formalno rešili! + +## Ogled rezultata v praksi + +Zanimivo bi bilo dejansko videti, kako se trenirani model obnaša. Zaženimo simulacijo in sledimo isti strategiji izbire akcij kot med treningom, vzorčimo glede na porazdelitev verjetnosti v Q-tabeli: (koda blok 13) + +```python +obs = env.reset() +done = False +while not done: + s = discretize(obs) + env.render() + v = probs(np.array(qvalues(s))) + a = random.choices(actions,weights=v)[0] + obs,_,done,_ = env.step(a) +env.close() +``` + +Videti bi morali nekaj takega: + +![a balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) + +--- + +## 🚀Izziv + +> **Naloga 3**: Tukaj smo uporabljali končno kopijo Q-tabele, ki morda ni najboljša. Ne pozabite, da smo najboljšo Q-tabelo shranili v spremenljivko `Qbest`! Poskusite isti primer z najboljšo Q-tabelo tako, da kopirate `Qbest` v `Q` in preverite, ali opazite razliko. + +> **Naloga 4**: Tukaj nismo izbirali najboljše akcije na vsakem koraku, ampak smo vzorčili glede na ustrezno porazdelitev verjetnosti. Ali bi bilo bolj smiselno vedno izbrati najboljšo akcijo z najvišjo vrednostjo v Q-tabeli? To lahko storite z uporabo funkcije `np.argmax`, da ugotovite številko akcije, ki ustreza najvišji vrednosti v Q-tabeli. Implementirajte to strategijo in preverite, ali izboljša ravnotežje. + +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Naloga +[Trenirajte Mountain Car](assignment.md) + +## Zaključek + +Sedaj smo se naučili, kako trenirati agente, da dosežejo dobre rezultate zgolj z zagotavljanjem funkcije nagrajevanja, ki definira želeno stanje igre, in z omogočanjem inteligentnega raziskovanja iskalnega prostora. Uspešno smo uporabili algoritem Q-Learning v primerih diskretnih in kontinuiranih okolij, vendar z diskretnimi akcijami. + +Pomembno je preučiti tudi situacije, kjer je stanje akcij kontinuirano in kjer je opazovalni prostor veliko bolj kompleksen, kot na primer slika zaslona igre Atari. Pri teh problemih pogosto potrebujemo močnejše tehnike strojnega učenja, kot so nevronske mreže, da dosežemo dobre rezultate. Te bolj napredne teme so predmet našega prihajajočega naprednega tečaja umetne inteligence. + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas opozarjamo, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/8-Reinforcement/2-Gym/assignment.md b/translations/sl/8-Reinforcement/2-Gym/assignment.md new file mode 100644 index 00000000..4490d1b5 --- /dev/null +++ b/translations/sl/8-Reinforcement/2-Gym/assignment.md @@ -0,0 +1,55 @@ + +# Treniraj Mountain Car + +[OpenAI Gym](http://gym.openai.com) je zasnovan tako, da vsa okolja zagotavljajo enak API - tj. iste metode `reset`, `step` in `render`, ter enake abstrakcije **akcijskega prostora** in **prostora opazovanj**. Zato bi moralo biti mogoče prilagoditi iste algoritme za krepitev učenja različnim okoljem z minimalnimi spremembami kode. + +## Okolje Mountain Car + +[Okolje Mountain Car](https://gym.openai.com/envs/MountainCar-v0/) vsebuje avto, ki je obtičal v dolini: + +Cilj je priti iz doline in ujeti zastavo, pri čemer na vsakem koraku izvedemo eno od naslednjih akcij: + +| Vrednost | Pomen | +|---|---| +| 0 | Pospeši v levo | +| 1 | Ne pospešuj | +| 2 | Pospeši v desno | + +Glavna težava tega problema pa je, da motor avtomobila ni dovolj močan, da bi premagal goro v enem poskusu. Zato je edini način za uspeh vožnja naprej in nazaj, da se pridobi zagon. + +Prostor opazovanj vsebuje le dve vrednosti: + +| Št. | Opazovanje | Min | Max | +|-----|--------------|-----|-----| +| 0 | Položaj avtomobila | -1.2| 0.6 | +| 1 | Hitrost avtomobila | -0.07 | 0.07 | + +Sistem nagrajevanja za Mountain Car je precej zahteven: + + * Nagrada 0 je podeljena, če agent doseže zastavo (položaj = 0.5) na vrhu gore. + * Nagrada -1 je podeljena, če je položaj agenta manjši od 0.5. + +Epizoda se zaključi, če je položaj avtomobila večji od 0.5 ali če dolžina epizode presega 200. +## Navodila + +Prilagodite naš algoritem za krepitev učenja, da rešite problem Mountain Car. Začnite z obstoječo kodo [notebook.ipynb](../../../../8-Reinforcement/2-Gym/notebook.ipynb), zamenjajte okolje, spremenite funkcije za diskretizacijo stanja in poskusite obstoječi algoritem usposobiti z minimalnimi spremembami kode. Optimizirajte rezultat z nastavitvijo hiperparametrov. + +> **Opomba**: Nastavitev hiperparametrov bo verjetno potrebna, da se algoritem konvergira. +## Merila + +| Merila | Odlično | Zadostno | Potrebno izboljšanje | +| -------- | --------- | -------- | ----------------- | +| | Algoritem Q-Learning je uspešno prilagojen iz primera CartPole z minimalnimi spremembami kode, ki je sposoben rešiti problem ujetja zastave v manj kot 200 korakih. | Nov algoritem Q-Learning je bil prevzet z interneta, vendar je dobro dokumentiran; ali obstoječi algoritem prilagojen, vendar ne dosega želenih rezultatov. | Študent ni uspel uspešno prilagoditi nobenega algoritma, vendar je naredil pomembne korake proti rešitvi (implementiral diskretizacijo stanja, podatkovno strukturo Q-Table itd.) | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas opozarjamo, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/8-Reinforcement/2-Gym/solution/Julia/README.md b/translations/sl/8-Reinforcement/2-Gym/solution/Julia/README.md new file mode 100644 index 00000000..bdd5f9e7 --- /dev/null +++ b/translations/sl/8-Reinforcement/2-Gym/solution/Julia/README.md @@ -0,0 +1,15 @@ + +To je začasno mesto za izpolnitev + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas opozarjamo, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/8-Reinforcement/2-Gym/solution/R/README.md b/translations/sl/8-Reinforcement/2-Gym/solution/R/README.md new file mode 100644 index 00000000..50803e54 --- /dev/null +++ b/translations/sl/8-Reinforcement/2-Gym/solution/R/README.md @@ -0,0 +1,15 @@ + +to je začasno nadomestilo + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/8-Reinforcement/README.md b/translations/sl/8-Reinforcement/README.md new file mode 100644 index 00000000..34a7ffc9 --- /dev/null +++ b/translations/sl/8-Reinforcement/README.md @@ -0,0 +1,67 @@ + +# Uvod v učenje z okrepitvami + +Učenje z okrepitvami, RL, velja za enega osnovnih paradigm strojnega učenja, poleg nadzorovanega in nenadzorovanega učenja. RL se osredotoča na sprejemanje odločitev: sprejemanje pravih odločitev ali vsaj učenje iz njih. + +Predstavljajte si simulirano okolje, kot je borza. Kaj se zgodi, če uvedete določeno regulacijo? Ali ima pozitiven ali negativen učinek? Če se zgodi nekaj negativnega, morate to _negativno okrepitev_ uporabiti, se iz nje naučiti in spremeniti smer. Če je rezultat pozitiven, morate graditi na tej _pozitivni okrepitvi_. + +![Peter in volk](../../../8-Reinforcement/images/peter.png) + +> Peter in njegovi prijatelji morajo pobegniti lačnemu volku! Slika: [Jen Looper](https://twitter.com/jenlooper) + +## Regionalna tema: Peter in volk (Rusija) + +[Peter in volk](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) je glasbena pravljica, ki jo je napisal ruski skladatelj [Sergej Prokofjev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Gre za zgodbo o mladem pionirju Petru, ki pogumno zapusti svojo hišo in se odpravi na gozdno jaso, da bi ujel volka. V tem poglavju bomo trenirali algoritme strojnega učenja, ki bodo Petru pomagali: + +- **Raziskovati** okolico in zgraditi optimalen navigacijski zemljevid +- **Naučiti se** uporabljati rolko in ohranjati ravnotežje, da se bo lahko hitreje premikal. + +[![Peter in volk](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM) + +> 🎥 Kliknite zgornjo sliko, da poslušate Peter in volk, skladbo Prokofjeva + +## Učenje z okrepitvami + +V prejšnjih poglavjih ste videli dva primera problemov strojnega učenja: + +- **Nadzorovano učenje**, kjer imamo podatkovne nabore, ki predlagajo vzorčne rešitve za problem, ki ga želimo rešiti. [Klasifikacija](../4-Classification/README.md) in [regresija](../2-Regression/README.md) sta nalogi nadzorovanega učenja. +- **Nenadzorovano učenje**, pri katerem nimamo označenih podatkov za učenje. Glavni primer nenadzorovanega učenja je [Gručenje](../5-Clustering/README.md). + +V tem poglavju vam bomo predstavili nov tip problema učenja, ki ne zahteva označenih podatkov za učenje. Obstaja več vrst takšnih problemov: + +- **[Polnadzorovano učenje](https://wikipedia.org/wiki/Semi-supervised_learning)**, kjer imamo veliko neoznačenih podatkov, ki jih lahko uporabimo za predhodno treniranje modela. +- **[Učenje z okrepitvami](https://wikipedia.org/wiki/Reinforcement_learning)**, pri katerem agent uči, kako se obnašati, z izvajanjem eksperimentov v simuliranem okolju. + +### Primer - računalniška igra + +Recimo, da želite naučiti računalnik igrati igro, kot sta šah ali [Super Mario](https://wikipedia.org/wiki/Super_Mario). Da bi računalnik igral igro, mora napovedati, katero potezo naj izvede v vsakem stanju igre. Čeprav se to morda zdi kot problem klasifikacije, ni - ker nimamo podatkovnega nabora s stanji in ustreznimi akcijami. Čeprav imamo morda nekaj podatkov, kot so obstoječe šahovske partije ali posnetki igralcev, ki igrajo Super Mario, je verjetno, da ti podatki ne bodo zadostno pokrili velikega števila možnih stanj. + +Namesto iskanja obstoječih podatkov o igri se **učenje z okrepitvami** (RL) opira na idejo, da *računalnik večkrat igra igro* in opazuje rezultate. Tako za uporabo učenja z okrepitvami potrebujemo dve stvari: + +- **Okolje** in **simulator**, ki nam omogočata, da igro večkrat igramo. Ta simulator bi določal vsa pravila igre ter možna stanja in akcije. + +- **Funkcijo nagrajevanja**, ki nam pove, kako dobro smo se odrezali med posamezno potezo ali igro. + +Glavna razlika med drugimi vrstami strojnega učenja in RL je, da pri RL običajno ne vemo, ali zmagamo ali izgubimo, dokler ne končamo igre. Tako ne moremo reči, ali je določena poteza sama po sebi dobra ali ne - nagrado prejmemo šele na koncu igre. Naš cilj je oblikovati algoritme, ki nam omogočajo treniranje modela v negotovih razmerah. Spoznali bomo en RL-algoritem, imenovan **Q-učenje**. + +## Lekcije + +1. [Uvod v učenje z okrepitvami in Q-učenje](1-QLearning/README.md) +2. [Uporaba simulacijskega okolja Gym](2-Gym/README.md) + +## Zasluge + +"Uvod v učenje z okrepitvami" je bilo napisano z ♥️ avtorja [Dmitry Soshnikov](http://soshnikov.com) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna napačna razumevanja ali napačne interpretacije, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/9-Real-World/1-Applications/README.md b/translations/sl/9-Real-World/1-Applications/README.md new file mode 100644 index 00000000..1854c0c5 --- /dev/null +++ b/translations/sl/9-Real-World/1-Applications/README.md @@ -0,0 +1,159 @@ + +# Postscript: Strojno učenje v resničnem svetu + +![Povzetek strojnega učenja v resničnem svetu v sketchnote](../../../../sketchnotes/ml-realworld.png) +> Sketchnote avtorja [Tomomi Imura](https://www.twitter.com/girlie_mac) + +V tem učnem načrtu ste se naučili številnih načinov za pripravo podatkov za učenje in ustvarjanje modelov strojnega učenja. Zgradili ste serijo klasičnih modelov za regresijo, razvrščanje, klasifikacijo, obdelavo naravnega jezika in časovne vrste. Čestitke! Zdaj se morda sprašujete, za kaj vse to služi... kakšne so resnične aplikacije teh modelov? + +Čeprav je industrija zelo zainteresirana za umetno inteligenco, ki običajno temelji na globokem učenju, obstajajo še vedno dragocene aplikacije za klasične modele strojnega učenja. Nekatere od teh aplikacij morda že uporabljate danes! V tej lekciji boste raziskali, kako osem različnih industrij in področij uporablja te vrste modelov za izboljšanje zmogljivosti, zanesljivosti, inteligence in vrednosti svojih aplikacij za uporabnike. + +## [Predhodni kviz pred predavanjem](https://ff-quizzes.netlify.app/en/ml/) + +## 💰 Finance + +Finančni sektor ponuja številne priložnosti za strojno učenje. Veliko težav na tem področju je mogoče modelirati in rešiti z uporabo strojnega učenja. + +### Odkrivanje goljufij s kreditnimi karticami + +V tečaju smo se naučili o [k-means razvrščanju](../../5-Clustering/2-K-Means/README.md), vendar kako ga lahko uporabimo za reševanje težav, povezanih z goljufijami s kreditnimi karticami? + +K-means razvrščanje je uporabno pri tehniki odkrivanja goljufij s kreditnimi karticami, imenovani **odkrivanje odstopanj**. Odstopanja ali nepravilnosti v opazovanjih podatkovnega nabora nam lahko povedo, ali se kreditna kartica uporablja na običajen način ali pa se dogaja nekaj nenavadnega. Kot je prikazano v spodnjem članku, lahko podatke o kreditnih karticah razvrstimo z algoritmom k-means in vsako transakcijo dodelimo skupini glede na to, kako močno odstopa. Nato lahko ocenimo najbolj tvegane skupine za goljufive ali legitimne transakcije. +[Referenca](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf) + +### Upravljanje premoženja + +Pri upravljanju premoženja posameznik ali podjetje upravlja naložbe v imenu svojih strank. Njihova naloga je dolgoročno ohranjati in povečevati premoženje, zato je ključnega pomena izbrati naložbe, ki dobro delujejo. + +Eden od načinov za oceno uspešnosti določene naložbe je statistična regresija. [Linearna regresija](../../2-Regression/1-Tools/README.md) je dragoceno orodje za razumevanje, kako sklad deluje v primerjavi z nekim merilom. Prav tako lahko ugotovimo, ali so rezultati regresije statistično pomembni oziroma kako močno bi vplivali na naložbe stranke. Analizo lahko še razširite z večkratno regresijo, kjer lahko upoštevate dodatne dejavnike tveganja. Za primer, kako bi to delovalo za določen sklad, si oglejte spodnji članek o ocenjevanju uspešnosti sklada z uporabo regresije. +[Referenca](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/) + +## 🎓 Izobraževanje + +Izobraževalni sektor je prav tako zelo zanimivo področje, kjer se lahko uporabi strojno učenje. Obstajajo zanimive težave, ki jih je mogoče rešiti, kot so odkrivanje goljufij pri testih ali esejih ter obvladovanje pristranskosti, namerne ali nenamerne, v procesu ocenjevanja. + +### Napovedovanje vedenja študentov + +[Coursera](https://coursera.com), ponudnik spletnih odprtih tečajev, ima odličen tehnični blog, kjer razpravljajo o številnih inženirskih odločitvah. V tej študiji primera so narisali regresijsko črto, da bi raziskali morebitno korelacijo med nizko oceno NPS (Net Promoter Score) in ohranjanjem ali opuščanjem tečaja. +[Referenca](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a) + +### Zmanjševanje pristranskosti + +[Grammarly](https://grammarly.com), pisalni asistent, ki preverja črkovanje in slovnične napake, uporablja sofisticirane [sisteme za obdelavo naravnega jezika](../../6-NLP/README.md) v svojih izdelkih. Na svojem tehničnem blogu so objavili zanimivo študijo primera o tem, kako so se spopadli s spolno pristranskostjo v strojnem učenju, o čemer ste se učili v naši [uvodni lekciji o pravičnosti](../../1-Introduction/3-fairness/README.md). +[Referenca](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/) + +## 👜 Trgovina na drobno + +Trgovinski sektor lahko zagotovo koristi uporabo strojnega učenja, od ustvarjanja boljše uporabniške izkušnje do optimalnega upravljanja zalog. + +### Personalizacija uporabniške izkušnje + +Pri Wayfair, podjetju, ki prodaja izdelke za dom, kot je pohištvo, je ključnega pomena pomagati strankam najti prave izdelke za njihov okus in potrebe. V tem članku inženirji podjetja opisujejo, kako uporabljajo strojno učenje in NLP za "prikazovanje pravih rezultatov za stranke". Njihov Query Intent Engine je bil zasnovan za uporabo ekstrakcije entitet, usposabljanje klasifikatorjev, ekstrakcijo mnenj in označevanje sentimenta v pregledih strank. To je klasičen primer uporabe NLP v spletni trgovini. +[Referenca](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search) + +### Upravljanje zalog + +Inovativna, agilna podjetja, kot je [StitchFix](https://stitchfix.com), storitev, ki pošilja oblačila potrošnikom, se močno zanašajo na strojno učenje za priporočila in upravljanje zalog. Njihove ekipe za stiliranje sodelujejo z ekipami za trgovanje: "eden od naših podatkovnih znanstvenikov je eksperimentiral z genetskim algoritmom in ga uporabil na oblačilih za napovedovanje, kaj bi bil uspešen kos oblačila, ki danes še ne obstaja. To smo predstavili ekipi za trgovanje, ki zdaj lahko to uporablja kot orodje." +[Referenca](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/) + +## 🏥 Zdravstvo + +Zdravstveni sektor lahko izkoristi strojno učenje za optimizacijo raziskovalnih nalog in logističnih težav, kot so ponovne hospitalizacije ali preprečevanje širjenja bolezni. + +### Upravljanje kliničnih študij + +Toksičnost v kliničnih študijah je velika skrb za proizvajalce zdravil. Koliko toksičnosti je sprejemljivo? V tej študiji je analiza različnih metod kliničnih študij privedla do razvoja novega pristopa za napovedovanje verjetnosti izidov kliničnih študij. Konkretno, uporabili so random forest za izdelavo [klasifikatorja](../../4-Classification/README.md), ki lahko razlikuje med skupinami zdravil. +[Referenca](https://www.sciencedirect.com/science/article/pii/S2451945616302914) + +### Upravljanje ponovnih hospitalizacij + +Bolnišnično zdravljenje je drago, zlasti ko je treba paciente ponovno hospitalizirati. Ta članek obravnava podjetje, ki uporablja strojno učenje za napovedovanje potenciala ponovne hospitalizacije z uporabo [razvrščanja](../../5-Clustering/README.md) algoritmov. Te skupine pomagajo analitikom "odkriti skupine ponovnih hospitalizacij, ki lahko delijo skupni vzrok". +[Referenca](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning) + +### Upravljanje bolezni + +Nedavna pandemija je osvetlila načine, kako lahko strojno učenje pomaga pri zaustavitvi širjenja bolezni. V tem članku boste prepoznali uporabo ARIMA, logističnih krivulj, linearne regresije in SARIMA. "To delo je poskus izračunati stopnjo širjenja tega virusa in tako napovedati smrti, okrevanja in potrjene primere, da bi se lahko bolje pripravili in preživeli." +[Referenca](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/) + +## 🌲 Ekologija in zelena tehnologija + +Narava in ekologija vključujeta številne občutljive sisteme, kjer je pomembno natančno meriti te sisteme in ustrezno ukrepati, če se zgodi kaj nenavadnega, kot je gozdni požar ali upad populacije živali. + +### Upravljanje gozdov + +V prejšnjih lekcijah ste se naučili o [okrepitvenem učenju](../../8-Reinforcement/README.md). To je lahko zelo uporabno pri napovedovanju vzorcev v naravi. Zlasti se lahko uporablja za sledenje ekološkim težavam, kot so gozdni požari in širjenje invazivnih vrst. V Kanadi je skupina raziskovalcev uporabila okrepitveno učenje za izdelavo modelov dinamike gozdnih požarov iz satelitskih posnetkov. Z inovativnim "procesom prostorskega širjenja (SSP)" so si zamislili gozdni požar kot "agenta na katerem koli mestu v pokrajini." "Nabor dejanj, ki jih lahko požar izvede z določene lokacije v katerem koli trenutku, vključuje širjenje na sever, jug, vzhod ali zahod ali ne širjenje." + +Ta pristop obrne običajno nastavitev okrepitvenega učenja, saj je dinamika ustreznega Markovskega odločitvenega procesa (MDP) znana funkcija za takojšnje širjenje požara. Več o klasičnih algoritmih, ki jih je uporabila ta skupina, si preberite na spodnji povezavi. +[Referenca](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full) + +### Sledenje gibanju živali + +Čeprav je globoko učenje povzročilo revolucijo pri vizualnem sledenju gibanja živali (tukaj lahko zgradite svojega [sledilca polarnih medvedov](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott)), ima klasično strojno učenje še vedno svoje mesto pri tej nalogi. + +Senzorji za sledenje gibanju kmetijskih živali in IoT uporabljajo tovrstno vizualno obdelavo, vendar so osnovnejše tehnike strojnega učenja uporabne za predhodno obdelavo podatkov. Na primer, v tem članku so bile drže ovc spremljane in analizirane z različnimi algoritmi klasifikatorjev. Na strani 335 boste morda prepoznali krivuljo ROC. +[Referenca](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf) + +### ⚡️ Upravljanje energije + +V naših lekcijah o [napovedovanju časovnih vrst](../../7-TimeSeries/README.md) smo uvedli koncept pametnih parkirnih števcev za ustvarjanje prihodkov za mesto na podlagi razumevanja ponudbe in povpraševanja. Ta članek podrobno obravnava, kako so razvrščanje, regresija in napovedovanje časovnih vrst združeni za pomoč pri napovedovanju prihodnje porabe energije na Irskem, na podlagi pametnega merjenja. +[Referenca](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf) + +## 💼 Zavarovalništvo + +Zavarovalniški sektor je še eno področje, ki uporablja strojno učenje za gradnjo in optimizacijo izvedljivih finančnih in aktuarskih modelov. + +### Upravljanje volatilnosti + +MetLife, ponudnik življenjskih zavarovanj, je odprt glede načina, kako analizira in zmanjšuje volatilnost v svojih finančnih modelih. V tem članku boste opazili vizualizacije binarne in ordinalne klasifikacije. Prav tako boste odkrili vizualizacije napovedovanja. +[Referenca](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf) + +## 🎨 Umetnost, kultura in literatura + +Na področju umetnosti, na primer v novinarstvu, obstajajo številne zanimive težave. Odkrivanje lažnih novic je velik problem, saj je dokazano, da vpliva na mnenje ljudi in celo ogroža demokracije. Muzeji lahko prav tako koristijo uporabo strojnega učenja pri vsem, od iskanja povezav med artefakti do načrtovanja virov. + +### Odkrivanje lažnih novic + +Odkrivanje lažnih novic je postalo igra mačke in miši v današnjih medijih. V tem članku raziskovalci predlagajo sistem, ki združuje več tehnik strojnega učenja, ki smo jih preučevali, in testiranje najboljšega modela: "Ta sistem temelji na obdelavi naravnega jezika za ekstrakcijo značilnosti iz podatkov, nato pa se te značilnosti uporabijo za usposabljanje klasifikatorjev strojnega učenja, kot so Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD) in Logistic Regression (LR)." +[Referenca](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf) + +Ta članek prikazuje, kako lahko kombiniranje različnih področij strojnega učenja ustvari zanimive rezultate, ki lahko pomagajo preprečiti širjenje lažnih novic in ustvarjanje resnične škode; v tem primeru je bil povod širjenje govoric o zdravljenju COVID, ki je sprožilo nasilje množic. + +### Muzejsko strojno učenje + +Muzeji so na pragu revolucije umetne inteligence, kjer postaja katalogizacija in digitalizacija zbirk ter iskanje povezav med artefakti lažje z napredkom tehnologije. Projekti, kot je [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.), pomagajo odkriti skrivnosti nedostopnih zbirk, kot so Vatikanski arhivi. Toda poslovni vidik muzejev koristi tudi modelom strojnega učenja. + +Na primer, Umetnostni inštitut v Chicagu je zgradil modele za napovedovanje, kaj občinstvo zanima in kdaj bodo obiskali razstave. Cilj je ustvariti individualizirane in optimizirane izkušnje obiskovalcev ob vsakem obisku muzeja. "Med fiskalnim letom 2017 je model napovedal obisk in vstopnine z natančnostjo 1 odstotka, pravi Andrew Simnick, višji podpredsednik v Umetnostnem inštitutu." +[Referenca](https://www.chicagobusiness.com/article/20180518/ISSUE01/180519840/art-institute-of-chicago-uses-data-to-make-exhibit-choices) + +## 🏷 Marketing + +### Segmentacija strank + +Najbolj učinkovite marketinške strategije ciljajo na stranke na različne načine glede na različne skupine. V tem članku so obravnavane uporabe algoritmov razvrščanja za podporo diferenciranemu marketingu. Diferencirani marketing pomaga podjetjem izboljšati prepoznavnost blagovne znamke, doseči več strank in zaslužiti več denarja. +[Referenca](https://ai.inqline.com/machine-learning-for-marketing-customer-segmentation/) + +## 🚀 Izziv + +Prepoznajte še en sektor, ki koristi nekatere tehnike, ki ste se jih naučili v tem učnem načrtu, in odkrijte, kako uporablja strojno učenje. +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +## Pregled & Samostojno učenje + +Ekipa za podatkovno znanost pri Wayfairu ima več zanimivih videoposnetkov o tem, kako uporabljajo strojno učenje v svojem podjetju. Vredno si je [ogledati](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)! + +## Naloga + +[Lov na zaklad s strojno učenje](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/9-Real-World/1-Applications/assignment.md b/translations/sl/9-Real-World/1-Applications/assignment.md new file mode 100644 index 00000000..07bdffa0 --- /dev/null +++ b/translations/sl/9-Real-World/1-Applications/assignment.md @@ -0,0 +1,27 @@ + +# Lov na zaklad v strojnem učenju + +## Navodila + +V tej lekciji ste spoznali številne resnične primere uporabe, ki so bili rešeni s klasičnim strojnim učenjem. Čeprav uporaba globokega učenja, novih tehnik in orodij v umetni inteligenci ter uporaba nevronskih mrež pomaga pospešiti razvoj orodij za pomoč v teh sektorjih, ima klasično strojno učenje z uporabo tehnik iz tega učnega načrta še vedno veliko vrednost. + +V tej nalogi si predstavljajte, da sodelujete na hackathonu. Uporabite, kar ste se naučili v učnem načrtu, da predlagate rešitev s klasičnim strojnim učenjem za reševanje problema v enem od sektorjev, obravnavanih v tej lekciji. Pripravite predstavitev, v kateri boste razložili, kako boste izvedli svojo idejo. Dodatne točke dobite, če lahko zberete vzorčne podatke in zgradite model strojnega učenja, ki podpira vaš koncept! + +## Merila ocenjevanja + +| Merilo | Odlično | Zadostno | Potrebno izboljšanje | +| -------- | ------------------------------------------------------------------ | ------------------------------------------------ | ---------------------- | +| | Predstavljena je PowerPoint predstavitev - dodatne točke za model | Predstavljena je osnovna, ne-inovativna predstavitev | Delo je nepopolno | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitne nesporazume ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/9-Real-World/2-Debugging-ML-Models/README.md b/translations/sl/9-Real-World/2-Debugging-ML-Models/README.md new file mode 100644 index 00000000..5bf3aa8e --- /dev/null +++ b/translations/sl/9-Real-World/2-Debugging-ML-Models/README.md @@ -0,0 +1,172 @@ + +# Postscript: Odpravljanje napak modelov strojnega učenja z uporabo komponent nadzorne plošče za odgovorno umetno inteligenco + +## [Predavanje kviz](https://ff-quizzes.netlify.app/en/ml/) + +## Uvod + +Strojno učenje vpliva na naša vsakodnevna življenja. Umetna inteligenca (UI) se vključuje v nekatere najpomembnejše sisteme, ki vplivajo na nas kot posameznike in na našo družbo, od zdravstva, financ, izobraževanja do zaposlovanja. Na primer, sistemi in modeli sodelujejo pri vsakodnevnih odločitvah, kot so zdravstvene diagnoze ali odkrivanje goljufij. Posledično so napredki v UI skupaj s pospešeno uporabo soočeni z razvijajočimi se družbenimi pričakovanji in naraščajočo regulacijo. Nenehno opažamo področja, kjer sistemi UI ne izpolnjujejo pričakovanj, razkrivajo nove izzive, in vlade začenjajo regulirati rešitve UI. Zato je pomembno, da so ti modeli analizirani, da zagotovijo pravične, zanesljive, vključujoče, pregledne in odgovorne rezultate za vse. + +V tem učnem načrtu bomo raziskali praktična orodja, ki jih lahko uporabimo za oceno, ali ima model težave z odgovorno UI. Tradicionalne tehnike odpravljanja napak pri strojnem učenju so običajno osnovane na kvantitativnih izračunih, kot so združena natančnost ali povprečna izguba napake. Predstavljajte si, kaj se lahko zgodi, ko podatki, ki jih uporabljate za gradnjo teh modelov, ne vključujejo določenih demografskih skupin, kot so rasa, spol, politično prepričanje, religija, ali pa te demografske skupine nesorazmerno predstavljajo. Kaj pa, če je izhod modela interpretiran tako, da daje prednost določeni demografski skupini? To lahko povzroči prekomerno ali nezadostno zastopanost teh občutljivih skupin, kar vodi do vprašanj pravičnosti, vključenosti ali zanesljivosti modela. Drug dejavnik je, da so modeli strojnega učenja pogosto obravnavani kot "črne škatle", kar otežuje razumevanje in razlago, kaj vpliva na napovedi modela. Vse to so izzivi, s katerimi se soočajo podatkovni znanstveniki in razvijalci UI, kadar nimajo ustreznih orodij za odpravljanje napak ali ocenjevanje pravičnosti in zanesljivosti modela. + +V tej lekciji se boste naučili odpravljati napake v svojih modelih z uporabo: + +- **Analize napak**: prepoznajte, kje v porazdelitvi podatkov ima model visoke stopnje napak. +- **Pregleda modela**: izvedite primerjalno analizo med različnimi kohortami podatkov, da odkrijete razlike v metrikah uspešnosti modela. +- **Analize podatkov**: raziščite, kje bi lahko prišlo do prekomerne ali nezadostne zastopanosti podatkov, kar lahko povzroči, da model daje prednost eni demografski skupini pred drugo. +- **Pomembnosti značilnosti**: razumite, katere značilnosti vplivajo na napovedi modela na globalni ali lokalni ravni. + +## Predpogoj + +Kot predpogoj si oglejte [Orodja za odgovorno UI za razvijalce](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) + +> ![Gif o orodjih za odgovorno UI](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) + +## Analiza napak + +Tradicionalne metrike uspešnosti modelov, ki se uporabljajo za merjenje natančnosti, so večinoma izračuni, osnovani na pravilnih in nepravilnih napovedih. Na primer, določitev, da je model natančen 89 % časa z izgubo napake 0,001, se lahko šteje za dobro uspešnost. Napake pa pogosto niso enakomerno porazdeljene v osnovnem naboru podatkov. Lahko dosežete 89 % natančnost modela, vendar ugotovite, da obstajajo različni deli vaših podatkov, kjer model odpove 42 % časa. Posledice teh vzorcev napak pri določenih skupinah podatkov lahko vodijo do vprašanj pravičnosti ali zanesljivosti. Ključno je razumeti področja, kjer model deluje dobro ali ne. Področja podatkov, kjer je veliko netočnosti modela, se lahko izkažejo za pomembne demografske skupine podatkov. + +![Analizirajte in odpravljajte napake modela](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-distribution.png) + +Komponenta za analizo napak na nadzorni plošči RAI prikazuje, kako so napake modela porazdeljene med različnimi kohortami s pomočjo vizualizacije drevesa. To je uporabno za prepoznavanje značilnosti ali področij, kjer je stopnja napak v vašem naboru podatkov visoka. Z opazovanjem, od kod prihaja večina netočnosti modela, lahko začnete raziskovati osnovni vzrok. Prav tako lahko ustvarite kohorte podatkov za izvedbo analize. Te kohorte podatkov pomagajo pri odpravljanju napak, da ugotovite, zakaj je uspešnost modela dobra v eni kohorti, a napačna v drugi. + +![Analiza napak](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png) + +Vizualni kazalniki na zemljevidu drevesa pomagajo hitreje locirati problematična področja. Na primer, temnejši odtenek rdeče barve na vozlišču drevesa pomeni višjo stopnjo napak. + +Toplotni zemljevid je še ena funkcionalnost vizualizacije, ki jo uporabniki lahko uporabijo za raziskovanje stopnje napak z uporabo ene ali dveh značilnosti, da najdejo prispevek k napakam modela v celotnem naboru podatkov ali kohortah. + +![Toplotni zemljevid analize napak](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png) + +Uporabite analizo napak, kadar potrebujete: + +* Globoko razumevanje, kako so napake modela porazdeljene po naboru podatkov in po več vhodnih in značilnostnih dimenzijah. +* Razčlenitev združenih metrik uspešnosti za samodejno odkrivanje napačnih kohort, da obvestite svoje ciljno usmerjene korake za odpravljanje težav. + +## Pregled modela + +Ocenjevanje uspešnosti modela strojnega učenja zahteva celostno razumevanje njegovega vedenja. To je mogoče doseči z analizo več kot ene metrike, kot so stopnja napak, natančnost, priklic, natančnost ali MAE (povprečna absolutna napaka), da bi odkrili razlike med metrikami uspešnosti. Ena metrika uspešnosti se lahko zdi odlična, vendar lahko netočnosti razkrije druga metrika. Poleg tega primerjava metrik za razlike v celotnem naboru podatkov ali kohortah pomaga osvetliti, kje model deluje dobro ali ne. To je še posebej pomembno pri opazovanju uspešnosti modela med občutljivimi in neobčutljivimi značilnostmi (npr. rasa, spol ali starost pacienta), da bi odkrili morebitno nepravičnost modela. Na primer, odkritje, da je model bolj napačen v kohorti z občutljivimi značilnostmi, lahko razkrije morebitno nepravičnost modela. + +Komponenta Pregled modela na nadzorni plošči RAI pomaga ne le pri analizi metrik uspešnosti predstavitve podatkov v kohorti, temveč uporabnikom omogoča tudi primerjavo vedenja modela med različnimi kohortami. + +![Kohorte nabora podatkov - pregled modela na nadzorni plošči RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png) + +Funkcionalnost analize, osnovane na značilnostih, omogoča uporabnikom, da zožijo podskupine podatkov znotraj določene značilnosti, da prepoznajo anomalije na bolj podrobni ravni. Na primer, nadzorna plošča ima vgrajeno inteligenco za samodejno ustvarjanje kohort za uporabniško izbrano značilnost (npr. *"čas_v_bolnišnici < 3"* ali *"čas_v_bolnišnici >= 7"*). To omogoča uporabniku, da izolira določeno značilnost iz večje skupine podatkov, da preveri, ali je ključni dejavnik napačnih rezultatov modela. + +![Kohorte značilnosti - pregled modela na nadzorni plošči RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png) + +Komponenta Pregled modela podpira dva razreda metrik razlik: + +**Razlike v uspešnosti modela**: Ti nabori metrik izračunajo razlike v vrednostih izbrane metrike uspešnosti med podskupinami podatkov. Tukaj je nekaj primerov: + +* Razlike v stopnji natančnosti +* Razlike v stopnji napak +* Razlike v natančnosti +* Razlike v priklicu +* Razlike v povprečni absolutni napaki (MAE) + +**Razlike v stopnji izbire**: Ta metrika vsebuje razliko v stopnji izbire (ugodna napoved) med podskupinami. Primer tega je razlika v stopnjah odobritve posojil. Stopnja izbire pomeni delež podatkovnih točk v vsakem razredu, ki so razvrščene kot 1 (pri binarni klasifikaciji) ali porazdelitev vrednosti napovedi (pri regresiji). + +## Analiza podatkov + +> "Če dovolj dolgo mučite podatke, bodo priznali karkoli." - Ronald Coase + +Ta izjava se sliši skrajna, vendar drži, da je mogoče podatke manipulirati, da podpirajo katerikoli zaključek. Takšna manipulacija se lahko včasih zgodi nenamerno. Kot ljudje imamo vsi pristranskosti in pogosto je težko zavestno vedeti, kdaj vnašamo pristranskost v podatke. Zagotavljanje pravičnosti v UI in strojnem učenju ostaja kompleksen izziv. + +Podatki so velika slepa pega za tradicionalne metrike uspešnosti modelov. Lahko imate visoke ocene natančnosti, vendar to ne odraža vedno osnovne pristranskosti podatkov, ki bi lahko bila prisotna v vašem naboru podatkov. Na primer, če ima nabor podatkov o zaposlenih 27 % žensk na izvršnih položajih v podjetju in 73 % moških na isti ravni, lahko model za oglaševanje delovnih mest, usposobljen na teh podatkih, cilja predvsem na moško občinstvo za višje položaje. Ta neuravnoteženost v podatkih je izkrivila napoved modela, da daje prednost enemu spolu. To razkriva vprašanje pravičnosti, kjer je v modelu UI prisotna spolna pristranskost. + +Komponenta Analiza podatkov na nadzorni plošči RAI pomaga prepoznati področja, kjer je v naboru podatkov prisotna prekomerna ali nezadostna zastopanost. Uporabnikom pomaga diagnosticirati osnovni vzrok napak in vprašanj pravičnosti, ki so posledica neuravnoteženosti podatkov ali pomanjkanja zastopanosti določene skupine podatkov. To uporabnikom omogoča vizualizacijo naborov podatkov na podlagi napovedanih in dejanskih rezultatov, skupin napak in specifičnih značilnosti. Včasih lahko odkritje premalo zastopane skupine podatkov razkrije tudi, da se model ne uči dobro, kar vodi do visokih netočnosti. Model, ki ima pristranskost v podatkih, ni le vprašanje pravičnosti, temveč kaže, da model ni vključujoč ali zanesljiv. + +![Komponenta Analiza podatkov na nadzorni plošči RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png) + +Uporabite analizo podatkov, kadar potrebujete: + +* Raziskovanje statistike vašega nabora podatkov z izbiro različnih filtrov za razdelitev podatkov na različne dimenzije (znane tudi kot kohorte). +* Razumevanje porazdelitve vašega nabora podatkov med različnimi kohortami in skupinami značilnosti. +* Določitev, ali so vaša odkritja, povezana s pravičnostjo, analizo napak in vzročnostjo (pridobljena iz drugih komponent nadzorne plošče), posledica porazdelitve vašega nabora podatkov. +* Odločitev, na katerih področjih zbrati več podatkov za zmanjšanje napak, ki izhajajo iz težav z zastopanostjo, šuma oznak, šuma značilnosti, pristranskosti oznak in podobnih dejavnikov. + +## Razložljivost modela + +Modeli strojnega učenja so pogosto obravnavani kot "črne škatle". Razumevanje, katere ključne značilnosti podatkov vplivajo na napovedi modela, je lahko zahtevno. Pomembno je zagotoviti preglednost, zakaj model poda določeno napoved. Na primer, če sistem UI napove, da je diabetični pacient v nevarnosti ponovne hospitalizacije v manj kot 30 dneh, bi moral biti sposoben zagotoviti podporne podatke, ki so privedli do te napovedi. Imati podporne kazalnike podatkov prinaša preglednost, ki pomaga zdravnikom ali bolnišnicam sprejemati dobro informirane odločitve. Poleg tega omogočanje razlage, zakaj je model podal določeno napoved za posameznega pacienta, omogoča odgovornost v skladu z zdravstvenimi predpisi. Ko uporabljate modele strojnega učenja na načine, ki vplivajo na življenja ljudi, je ključno razumeti in razložiti, kaj vpliva na vedenje modela. Razložljivost in interpretacija modela pomagata odgovoriti na vprašanja v scenarijih, kot so: + +* Odpravljanje napak modela: Zakaj je moj model naredil to napako? Kako lahko izboljšam svoj model? +* Sodelovanje človek-UI: Kako lahko razumem in zaupam odločitvam modela? +* Skladnost s predpisi: Ali moj model izpolnjuje zakonske zahteve? + +Komponenta Pomembnost značilnosti na nadzorni plošči RAI vam pomaga odpravljati napake in pridobiti celovito razumevanje, kako model podaja napovedi. Prav tako je uporabno orodje za strokovnjake za strojno učenje in odločevalce, da razložijo in pokažejo dokaze o značilnostih, ki vplivajo na vedenje modela, za skladnost s predpisi. Nato lahko uporabniki raziskujejo tako globalne kot lokalne razlage, da preverijo, katere značilnosti vplivajo na napovedi modela. Globalne razlage navajajo glavne značilnosti, ki so vplivale na splošno napoved modela. Lokalne razlage prikazujejo, katere značilnosti so privedle do napovedi modela za posamezen primer. Sposobnost ocenjevanja lokalnih razlag je prav tako koristna pri odpravljanju napak ali reviziji določenega primera, da bi bolje razumeli in interpretirali, zakaj je model podal pravilno ali napačno napoved. + +![Komponenta Pomembnost značilnosti na nadzorni plošči RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/9-feature-importance.png) + +* Globalne razlage: Na primer, katere značilnosti vplivajo na splošno vedenje modela za ponovno hospitalizacijo diabetikov? +* Lokalne razlage: Na primer, zakaj je bil diabetični pacient, starejši od 60 let, z več prejšnjimi hospitalizacijami napovedan, da bo ponovno hospitaliziran ali ne v 30 dneh? + +V procesu odpravljanja napak pri pregledu uspešnosti modela med različnimi kohortami Pomembnost značilnosti prikazuje, kakšen vpliv ima značilnost na kohorte. Pomaga razkriti anomalije pri primerjavi ravni vpliva značilnosti na napačne napovedi modela. Komponenta Pomembnost značilnosti lahko pokaže, katere vrednosti v značilnosti so pozitivno ali negativno vplivale na izid modela. Na primer, če je model podal napačno napoved, komponenta omogoča podrobno analizo in prepoznavanje, katere značilnosti ali vrednosti značilnosti so vplivale na napoved. Ta raven podrobnosti pomaga ne le pri odpravljanju napak, temveč zagotavlja preglednost in odgovornost v revizijskih situacijah. Na koncu lahko komponenta pomaga prepoznati vprašanja pravičnosti. Na primer, če občutljiva značilnost, kot je etnična pripadnost ali spol, močno vpliva na napoved modela, bi to lahko bil znak rasne ali spolne pristranskosti v modelu. + +![Pomembnost značilnosti](../../../../9-Real-World/2-Debugging-ML-Models/images/9-features-influence.png) + +Uporabite razložljivost, kadar potrebujete: + +* Določiti, kako zanesljive so napovedi vašega sistema UI, z razumevanjem, katere značilnosti so najpomembnejše za napovedi. +* Pristopiti k odpravljanju napak modela tako, da ga najprej razumete in ugotovite, ali model uporablja ustrezne značilnosti ali zgolj napačne korelacije. +* Razkriti morebitne vire nepravičnosti z razumevanjem, ali model temelji na občutljivih značilnostih ali na značil +- **Prekomerna ali nezadostna zastopanost**. Ideja je, da določena skupina ni vidna v določenem poklicu, in vsaka storitev ali funkcija, ki to še naprej spodbuja, prispeva k škodi. + +### Azure RAI nadzorna plošča + +[Azure RAI nadzorna plošča](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) temelji na odprtokodnih orodjih, ki so jih razvile vodilne akademske institucije in organizacije, vključno z Microsoftom. Ta orodja so ključna za podatkovne znanstvenike in razvijalce umetne inteligence, da bolje razumejo vedenje modelov, odkrijejo in odpravijo neželene težave v modelih umetne inteligence. + +- Naučite se uporabljati različne komponente tako, da si ogledate dokumentacijo nadzorne plošče RAI [docs.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) + +- Oglejte si nekaj primerov zvezkov nadzorne plošče RAI [sample notebooks](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) za odpravljanje težav pri bolj odgovornem scenariju umetne inteligence v Azure Machine Learning. + +--- +## 🚀 Izziv + +Da bi preprečili uvajanje statističnih ali podatkovnih pristranskosti, moramo: + +- zagotoviti raznolikost ozadij in perspektiv med ljudmi, ki delajo na sistemih +- vlagati v podatkovne nabore, ki odražajo raznolikost naše družbe +- razviti boljše metode za zaznavanje in odpravljanje pristranskosti, ko se pojavi + +Razmislite o resničnih scenarijih, kjer je nepoštenost očitna pri gradnji in uporabi modelov. Kaj bi še morali upoštevati? + +## [Kvizi po predavanju](https://ff-quizzes.netlify.app/en/ml/) +## Pregled in samostojno učenje + +V tej lekciji ste spoznali nekaj praktičnih orodij za vključevanje odgovorne umetne inteligence v strojno učenje. + +Oglejte si ta delavnico za poglobitev v teme: + +- Nadzorna plošča odgovorne umetne inteligence: Celovita rešitev za operacionalizacijo RAI v praksi, avtorja Besmira Nushi in Mehrnoosh Sameki + +[![Nadzorna plošča odgovorne umetne inteligence: Celovita rešitev za operacionalizacijo RAI v praksi](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Nadzorna plošča odgovorne umetne inteligence: Celovita rešitev za operacionalizacijo RAI v praksi") + +> 🎥 Kliknite zgornjo sliko za video: Nadzorna plošča odgovorne umetne inteligence: Celovita rešitev za operacionalizacijo RAI v praksi, avtorja Besmira Nushi in Mehrnoosh Sameki + +Oglejte si naslednje materiale, da se naučite več o odgovorni umetni inteligenci in kako graditi bolj zaupanja vredne modele: + +- Microsoftova orodja nadzorne plošče RAI za odpravljanje težav pri modelih strojnega učenja: [Viri orodij odgovorne umetne inteligence](https://aka.ms/rai-dashboard) + +- Raziščite orodja odgovorne umetne inteligence: [Github](https://github.com/microsoft/responsible-ai-toolbox) + +- Microsoftov center virov za RAI: [Viri odgovorne umetne inteligence – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsoftova raziskovalna skupina FATE: [FATE: Pravičnost, odgovornost, transparentnost in etika v umetni inteligenci - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +## Naloga + +[Raziščite nadzorno ploščo RAI](assignment.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/9-Real-World/2-Debugging-ML-Models/assignment.md b/translations/sl/9-Real-World/2-Debugging-ML-Models/assignment.md new file mode 100644 index 00000000..c32af336 --- /dev/null +++ b/translations/sl/9-Real-World/2-Debugging-ML-Models/assignment.md @@ -0,0 +1,25 @@ + +# Raziskovanje nadzorne plošče za odgovorno umetno inteligenco (RAI) + +## Navodila + +V tej lekciji ste spoznali nadzorno ploščo RAI, niz komponent, zgrajenih na "orodjih odprte kode", ki pomagajo podatkovnim znanstvenikom pri analizi napak, raziskovanju podatkov, ocenjevanju pravičnosti, razlagi modelov, ocenjevanju hipotetičnih scenarijev ("kaj če") in vzročni analizi v sistemih umetne inteligence. Za to nalogo raziščite nekaj vzorčnih [zvezkov](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) nadzorne plošče RAI in svoje ugotovitve predstavite v obliki poročila ali predstavitve. + +## Merila ocenjevanja + +| Merilo | Odlično | Zadostno | Potrebne izboljšave | +| ------- | -------- | -------- | ------------------- | +| | Predstavljeno je poročilo ali PowerPoint predstavitev, ki obravnava komponente nadzorne plošče RAI, zvezek, ki je bil izveden, in sklepe, ki so bili iz tega izpeljani | Predstavljeno je poročilo brez sklepov | Poročilo ni predstavljeno | + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/9-Real-World/README.md b/translations/sl/9-Real-World/README.md new file mode 100644 index 00000000..3b5409a1 --- /dev/null +++ b/translations/sl/9-Real-World/README.md @@ -0,0 +1,32 @@ + +# Postscript: Resnične aplikacije klasičnega strojnega učenja + +V tem delu učnega načrta boste spoznali nekaj resničnih aplikacij klasičnega strojnega učenja. Preiskali smo internet, da bi našli znanstvene članke in prispevke o aplikacijah, ki uporabljajo te strategije, pri čemer smo se čim bolj izogibali nevronskim mrežam, globokemu učenju in umetni inteligenci. Spoznajte, kako se strojno učenje uporablja v poslovnih sistemih, ekoloških aplikacijah, financah, umetnosti in kulturi ter še več. + +![chess](../../../9-Real-World/images/chess.jpg) + +> Fotografija avtorja Alexis Fauvet na Unsplash + +## Lekcija + +1. [Resnične aplikacije strojnega učenja](1-Applications/README.md) +2. [Odpravljanje napak modelov strojnega učenja z uporabo komponent nadzorne plošče Responsible AI](2-Debugging-ML-Models/README.md) + +## Zasluge + +"Resnične aplikacije" je napisala ekipa, vključno z [Jen Looper](https://twitter.com/jenlooper) in [Ornella Altunyan](https://twitter.com/ornelladotcom). + +"Odpravljanje napak modelov strojnega učenja z uporabo komponent nadzorne plošče Responsible AI" je napisala [Ruth Yakubu](https://twitter.com/ruthieyakubu) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/CODE_OF_CONDUCT.md b/translations/sl/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..15af9e25 --- /dev/null +++ b/translations/sl/CODE_OF_CONDUCT.md @@ -0,0 +1,23 @@ + +# Microsoftov kodeks ravnanja za odprto kodo + +Ta projekt je sprejel [Microsoftov kodeks ravnanja za odprto kodo](https://opensource.microsoft.com/codeofconduct/). + +Viri: + +- [Microsoftov kodeks ravnanja za odprto kodo](https://opensource.microsoft.com/codeofconduct/) +- [Pogosta vprašanja o kodeksu ravnanja](https://opensource.microsoft.com/codeofconduct/faq/) +- Za vprašanja ali pomisleke se obrnite na [opencode@microsoft.com](mailto:opencode@microsoft.com) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/CONTRIBUTING.md b/translations/sl/CONTRIBUTING.md new file mode 100644 index 00000000..ccabadeb --- /dev/null +++ b/translations/sl/CONTRIBUTING.md @@ -0,0 +1,25 @@ + +# Prispevanje + +Ta projekt sprejema prispevke in predloge. Večina prispevkov zahteva, da se strinjate s Pogodbo o licenciranju prispevkov (CLA), s katero potrjujete, da imate pravico in dejansko podeljujete pravice za uporabo vašega prispevka. Za podrobnosti obiščite https://cla.microsoft.com. + +> Pomembno: pri prevajanju besedila v tem repozitoriju poskrbite, da ne uporabljate strojnega prevajanja. Prevajanje bomo preverili prek skupnosti, zato prostovoljno prevajajte le v jezike, v katerih ste vešči. + +Ko oddate zahtevo za združitev (pull request), bo CLA-bot samodejno določil, ali morate predložiti CLA, in ustrezno označil PR (npr. oznaka, komentar). Preprosto sledite navodilom, ki jih zagotovi bot. To boste morali storiti le enkrat za vse repozitorije, ki uporabljajo naš CLA. + +Ta projekt je sprejel [Microsoftov kodeks ravnanja za odprto kodo](https://opensource.microsoft.com/codeofconduct/). +Za več informacij si oglejte [Pogosta vprašanja o kodeksu ravnanja](https://opensource.microsoft.com/codeofconduct/faq/) +ali se obrnite na [opencode@microsoft.com](mailto:opencode@microsoft.com) z dodatnimi vprašanji ali komentarji. + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna napačna razumevanja ali napačne interpretacije, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/README.md b/translations/sl/README.md new file mode 100644 index 00000000..f89e9d45 --- /dev/null +++ b/translations/sl/README.md @@ -0,0 +1,178 @@ + +[![GitHub license](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/) + +### 🌐 Podpora več jezikov + +#### Podprto prek GitHub Action (samodejno in vedno posodobljeno) + +[French](../fr/README.md) | [Spanish](../es/README.md) | [German](../de/README.md) | [Russian](../ru/README.md) | [Arabic](../ar/README.md) | [Persian (Farsi)](../fa/README.md) | [Urdu](../ur/README.md) | [Chinese (Simplified)](../zh/README.md) | [Chinese (Traditional, Macau)](../mo/README.md) | [Chinese (Traditional, Hong Kong)](../hk/README.md) | [Chinese (Traditional, Taiwan)](../tw/README.md) | [Japanese](../ja/README.md) | [Korean](../ko/README.md) | [Hindi](../hi/README.md) | [Bengali](../bn/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Portuguese (Portugal)](../pt/README.md) | [Portuguese (Brazil)](../br/README.md) | [Italian](../it/README.md) | [Polish](../pl/README.md) | [Turkish](../tr/README.md) | [Greek](../el/README.md) | [Thai](../th/README.md) | [Swedish](../sv/README.md) | [Danish](../da/README.md) | [Norwegian](../no/README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](../he/README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Croatian](../hr/README.md) | [Slovenian](./README.md) | [Ukrainian](../uk/README.md) | [Burmese (Myanmar)](../my/README.md) + +#### Pridružite se skupnosti + +[![Azure AI Discord](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) + +# Strojno učenje za začetnike - učni načrt + +> 🌍 Potujte po svetu, medtem ko raziskujete strojno učenje skozi prizmo svetovnih kultur 🌍 + +Microsoftovi Cloud Advocates z veseljem ponujajo 12-tedenski učni načrt s 26 lekcijami o **strojnem učenju**. V tem učnem načrtu se boste naučili osnov, ki jih pogosto imenujemo **klasično strojno učenje**, pri čemer boste večinoma uporabljali knjižnico Scikit-learn in se izognili globokemu učenju, ki je obravnavano v našem [učnem načrtu AI za začetnike](https://aka.ms/ai4beginners). Te lekcije lahko združite z našim učnim načrtom ['Podatkovna znanost za začetnike'](https://aka.ms/ds4beginners). + +Potujte z nami po svetu, medtem ko uporabljamo te klasične tehnike na podatkih iz različnih delov sveta. Vsaka lekcija vključuje kvize pred in po lekciji, pisna navodila za dokončanje lekcije, rešitev, nalogo in še več. Naš projektno usmerjen pristop vam omogoča učenje skozi ustvarjanje, kar je dokazano učinkovit način za utrjevanje novih veščin. + +**✍️ Iskrena zahvala našim avtorjem** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Anirban Mukherjee, Ornella Altunyan, Ruth Yakubu in Amy Boyd + +**🎨 Zahvala tudi našim ilustratorjem** Tomomi Imura, Dasani Madipalli in Jen Looper + +**🙏 Posebna zahvala 🙏 našim Microsoftovim študentskim ambasadorjem, avtorjem, recenzentom in prispevalcem vsebine**, zlasti Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila in Snigdha Agarwal + +**🤩 Dodatna zahvala Microsoftovim študentskim ambasadorjem Eric Wanjau, Jasleen Sondhi in Vidushi Gupta za naše lekcije v R!** + +# Začetek + +Sledite tem korakom: +1. **Forkajte repozitorij**: Kliknite gumb "Fork" v zgornjem desnem kotu te strani. +2. **Klonirajte repozitorij**: `git clone https://github.com/microsoft/ML-For-Beginners.git` + +> [poiščite vse dodatne vire za ta tečaj v naši zbirki Microsoft Learn](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +**[Študenti](https://aka.ms/student-page)**, za uporabo tega učnega načrta forkajte celoten repozitorij v svoj GitHub račun in dokončajte vaje sami ali v skupini: + +- Začnite s kvizom pred predavanjem. +- Preberite predavanje in dokončajte aktivnosti, pri čemer se ustavite in razmislite ob vsakem preverjanju znanja. +- Poskusite ustvariti projekte z razumevanjem lekcij, namesto da bi samo zagnali rešitev; vendar je ta koda na voljo v mapah `/solution` v vsaki projektno usmerjeni lekciji. +- Opravite kviz po predavanju. +- Dokončajte izziv. +- Dokončajte nalogo. +- Po zaključku skupine lekcij obiščite [diskusijsko ploščo](https://github.com/microsoft/ML-For-Beginners/discussions) in "učite na glas" tako, da izpolnite ustrezno PAT rubriko. 'PAT' je orodje za ocenjevanje napredka, rubrika, ki jo izpolnite za poglobitev svojega učenja. Lahko se odzovete tudi na druge PAT-e, da se učimo skupaj. + +> Za nadaljnje študije priporočamo, da sledite tem [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott) modulom in učnim potem. + +**Učitelji**, [vključili smo nekaj predlogov](for-teachers.md) o tem, kako uporabiti ta učni načrt. + +--- + +## Video vodiči + +Nekatere lekcije so na voljo kot kratki video posnetki. Vse te najdete v lekcijah ali na [seznamu predvajanja ML za začetnike na YouTube kanalu Microsoft Developer](https://aka.ms/ml-beginners-videos) s klikom na spodnjo sliko. + +[![ML za začetnike banner](../../images/ml-for-beginners-video-banner.png)](https://aka.ms/ml-beginners-videos) + +--- + +## Spoznajte ekipo + +[![Promocijski video](../../images/ml.gif)](https://youtu.be/Tj1XWrDSYJU) + +**Gif avtorja** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal) + +> 🎥 Kliknite zgornjo sliko za video o projektu in ljudeh, ki so ga ustvarili! + +--- + +## Pedagogika + +Pri oblikovanju tega učnega načrta smo izbrali dva pedagoška načela: zagotoviti, da je praktično **projektno usmerjen** in da vključuje **pogoste kvize**. Poleg tega ima ta učni načrt skupno **temo**, ki mu daje kohezijo. + +Z zagotavljanjem, da vsebina ustreza projektom, je proces bolj privlačen za študente, koncepti pa se bolje ohranijo. Poleg tega nizko-stresni kviz pred predavanjem usmeri pozornost študenta na učenje teme, medtem ko drugi kviz po predavanju zagotavlja dodatno utrjevanje. Ta učni načrt je bil zasnovan tako, da je prilagodljiv in zabaven ter ga je mogoče vzeti v celoti ali delno. Projekti se začnejo majhni in postajajo vse bolj kompleksni do konca 12-tedenskega cikla. Ta učni načrt vključuje tudi dodatek o realnih aplikacijah ML, ki ga je mogoče uporabiti kot dodatne točke ali kot osnovo za razpravo. + +> Poiščite naš [Kodeks ravnanja](CODE_OF_CONDUCT.md), [Prispevanje](CONTRIBUTING.md) in [Smernice za prevajanje](TRANSLATIONS.md). Veseli bomo vaših konstruktivnih povratnih informacij! + +## Vsaka lekcija vključuje + +- opcijsko sketchnote +- opcijski dopolnilni video +- video vodič (samo nekatere lekcije) +- [kviz za ogrevanje pred predavanjem](https://ff-quizzes.netlify.app/en/ml/) +- pisno lekcijo +- za projektno usmerjene lekcije, vodnik po korakih za izdelavo projekta +- preverjanje znanja +- izziv +- dopolnilno branje +- nalogo +- [kviz po predavanju](https://ff-quizzes.netlify.app/en/ml/) + +> **Opomba o jezikih**: Te lekcije so večinoma napisane v Pythonu, vendar so mnoge na voljo tudi v R. Za dokončanje lekcije v R pojdite v mapo `/solution` in poiščite lekcije v R. Te vključujejo razširitev .rmd, ki predstavlja **R Markdown** datoteko, ki jo lahko preprosto opišemo kot vdelavo `kodnih delov` (R ali drugih jezikov) in `YAML glave` (ki usmerja, kako formatirati izhode, kot so PDF) v `Markdown dokumentu`. Tako služi kot odličen avtorski okvir za podatkovno znanost, saj vam omogoča kombiniranje kode, njenega izhoda in vaših misli z zapisovanjem v Markdown. Poleg tega je mogoče R Markdown dokumente upodobiti v izhodne formate, kot so PDF, HTML ali Word. + +> **Opomba o kvizih**: Vsi kvizi so vsebovani v [mapi Quiz App](../../quiz-app), skupaj 52 kvizov s po tremi vprašanji. Povezani so znotraj lekcij, vendar je aplikacijo za kvize mogoče zagnati lokalno; sledite navodilom v mapi `quiz-app` za lokalno gostovanje ali namestitev na Azure. + +| Številka lekcije | Tema | Skupina lekcij | Cilji učenja | Povezana lekcija | Avtor | +| :--------------: | :----------------------------------------------------------: | :------------------------------------------------: | ----------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------: | +| 01 | Uvod v strojno učenje | [Uvod](1-Introduction/README.md) | Spoznajte osnovne koncepte stroja za učenje | [Lekcija](1-Introduction/1-intro-to-ML/README.md) | Muhammad | +| 02 | Zgodovina stroja za učenje | [Uvod](1-Introduction/README.md) | Spoznajte zgodovino tega področja | [Lekcija](1-Introduction/2-history-of-ML/README.md) | Jen in Amy | +| 03 | Pravičnost in strojno učenje | [Uvod](1-Introduction/README.md) | Katere so pomembne filozofske teme o pravičnosti, ki jih morajo študenti upoštevati pri gradnji in uporabi ML modelov? | [Lekcija](1-Introduction/3-fairness/README.md) | Tomomi | +| 04 | Tehnike za strojno učenje | [Introduction](1-Introduction/README.md) | Katere tehnike uporabljajo raziskovalci strojnega učenja za gradnjo modelov? | [Lesson](1-Introduction/4-techniques-of-ML/README.md) | Chris in Jen | +| 05 | Uvod v regresijo | [Regression](2-Regression/README.md) | Začnite s Pythonom in Scikit-learn za regresijske modele | +
                      • [Python](2-Regression/1-Tools/README.md)
                      • [R](../../2-Regression/1-Tools/solution/R/lesson_1.html)
                      |
                      • Jen
                      • Eric Wanjau
                      | +| 06 | Cene buč v Severni Ameriki 🎃 | [Regression](2-Regression/README.md) | Vizualizirajte in očistite podatke za pripravo na strojno učenje |
                      • [Python](2-Regression/2-Data/README.md)
                      • [R](../../2-Regression/2-Data/solution/R/lesson_2.html)
                      |
                      • Jen
                      • Eric Wanjau
                      | +| 07 | Cene buč v Severni Ameriki 🎃 | [Regression](2-Regression/README.md) | Zgradite linearne in polinomske regresijske modele |
                      • [Python](2-Regression/3-Linear/README.md)
                      • [R](../../2-Regression/3-Linear/solution/R/lesson_3.html)
                      |
                      • Jen in Dmitry
                      • Eric Wanjau
                      | +| 08 | Cene buč v Severni Ameriki 🎃 | [Regression](2-Regression/README.md) | Zgradite logistični regresijski model |
                      • [Python](2-Regression/4-Logistic/README.md)
                      • [R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)
                      |
                      • Jen
                      • Eric Wanjau
                      | +| 09 | Spletna aplikacija 🔌 | [Web App](3-Web-App/README.md) | Zgradite spletno aplikacijo za uporabo vašega modela | [Python](3-Web-App/1-Web-App/README.md) | Jen | +| 10 | Uvod v klasifikacijo | [Classification](4-Classification/README.md) | Očistite, pripravite in vizualizirajte podatke; uvod v klasifikacijo |
                      • [Python](4-Classification/1-Introduction/README.md)
                      • [R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) |
                        • Jen in Cassie
                        • Eric Wanjau
                        | +| 11 | Okusne azijske in indijske jedi 🍜 | [Classification](4-Classification/README.md) | Uvod v klasifikatorje |
                        • [Python](4-Classification/2-Classifiers-1/README.md)
                        • [R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) |
                          • Jen in Cassie
                          • Eric Wanjau
                          | +| 12 | Okusne azijske in indijske jedi 🍜 | [Classification](4-Classification/README.md) | Več klasifikatorjev |
                          • [Python](4-Classification/3-Classifiers-2/README.md)
                          • [R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) |
                            • Jen in Cassie
                            • Eric Wanjau
                            | +| 13 | Okusne azijske in indijske jedi 🍜 | [Classification](4-Classification/README.md) | Zgradite spletno aplikacijo za priporočila z uporabo vašega modela | [Python](4-Classification/4-Applied/README.md) | Jen | +| 14 | Uvod v gručenje | [Clustering](5-Clustering/README.md) | Očistite, pripravite in vizualizirajte podatke; uvod v gručenje |
                            • [Python](5-Clustering/1-Visualize/README.md)
                            • [R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) |
                              • Jen
                              • Eric Wanjau
                              | +| 15 | Raziskovanje glasbenih okusov v Nigeriji 🎧 | [Clustering](5-Clustering/README.md) | Raziskovanje metode K-Means |
                              • [Python](5-Clustering/2-K-Means/README.md)
                              • [R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) |
                                • Jen
                                • Eric Wanjau
                                | +| 16 | Uvod v obdelavo naravnega jezika ☕️ | [Natural language processing](6-NLP/README.md) | Naučite se osnov NLP z gradnjo preprostega bota | [Python](6-NLP/1-Introduction-to-NLP/README.md) | Stephen | +| 17 | Pogoste naloge NLP ☕️ | [Natural language processing](6-NLP/README.md) | Poglobite svoje znanje NLP z razumevanjem pogostih nalog pri delu z jezikovnimi strukturami | [Python](6-NLP/2-Tasks/README.md) | Stephen | +| 18 | Prevajanje in analiza sentimenta ♥️ | [Natural language processing](6-NLP/README.md) | Prevajanje in analiza sentimenta z Jane Austen | [Python](6-NLP/3-Translation-Sentiment/README.md) | Stephen | +| 19 | Romantični hoteli v Evropi ♥️ | [Natural language processing](6-NLP/README.md) | Analiza sentimenta z ocenami hotelov 1 | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | Stephen | +| 20 | Romantični hoteli v Evropi ♥️ | [Natural language processing](6-NLP/README.md) | Analiza sentimenta z ocenami hotelov 2 | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | Stephen | +| 21 | Uvod v napovedovanje časovnih vrst | [Time series](7-TimeSeries/README.md) | Uvod v napovedovanje časovnih vrst | [Python](7-TimeSeries/1-Introduction/README.md) | Francesca | +| 22 | ⚡️ Svetovna poraba energije ⚡️ - napovedovanje časovnih vrst z ARIMA | [Time series](7-TimeSeries/README.md) | Napovedovanje časovnih vrst z ARIMA | [Python](7-TimeSeries/2-ARIMA/README.md) | Francesca | +| 23 | ⚡️ Svetovna poraba energije ⚡️ - napovedovanje časovnih vrst z SVR | [Time series](7-TimeSeries/README.md) | Napovedovanje časovnih vrst z regressorjem podpornih vektorjev | [Python](7-TimeSeries/3-SVR/README.md) | Anirban | +| 24 | Uvod v okrepljeno učenje | [Reinforcement learning](8-Reinforcement/README.md) | Uvod v okrepljeno učenje z Q-Learning | [Python](8-Reinforcement/1-QLearning/README.md) | Dmitry | +| 25 | Pomagajte Petru, da se izogne volku! 🐺 | [Reinforcement learning](8-Reinforcement/README.md) | Okrepljeno učenje z Gym | [Python](8-Reinforcement/2-Gym/README.md) | Dmitry | +| Postscript | Resnični scenariji in aplikacije strojnega učenja | [ML in the Wild](9-Real-World/README.md) | Zanimive in razkrivajoče resnične aplikacije klasičnega strojnega učenja | [Lesson](9-Real-World/1-Applications/README.md) | Ekipa | +| Postscript | Razhroščevanje modelov v ML z uporabo RAI nadzorne plošče | [ML in the Wild](9-Real-World/README.md) | Razhroščevanje modelov strojnega učenja z uporabo komponent nadzorne plošče za odgovorno AI | [Lesson](9-Real-World/2-Debugging-ML-Models/README.md) | Ruth Yakubu | + +> [poiščite vse dodatne vire za ta tečaj v naši zbirki Microsoft Learn](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +## Dostop brez povezave + +To dokumentacijo lahko zaženete brez povezave z uporabo [Docsify](https://docsify.js.org/#/). Forkajte to repozitorij, [namestite Docsify](https://docsify.js.org/#/quickstart) na vaš lokalni računalnik, nato pa v korenski mapi tega repozitorija vnesite `docsify serve`. Spletna stran bo na voljo na portu 3000 na vašem lokalnem strežniku: `localhost:3000`. + +## PDF-ji + +Najdite PDF učnega načrta s povezavami [tukaj](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf). + + +## 🎒 Drugi tečaji + +Naša ekipa ustvarja tudi druge tečaje! Oglejte si: + +- [Generativna AI za začetnike](https://aka.ms/genai-beginners) +- [Generativna AI za začetnike .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet) +- [Generativna AI z JavaScript](https://github.com/microsoft/generative-ai-with-javascript) +- [Generativna AI z Java](https://github.com/microsoft/Generative-AI-for-beginners-java) +- [AI za začetnike](https://aka.ms/ai-beginners) +- [Podatkovna znanost za začetnike](https://aka.ms/datascience-beginners) +- [Strojno učenje za začetnike](https://aka.ms/ml-beginners) +- [Kibernetska varnost za začetnike](https://github.com/microsoft/Security-101) +- [Spletni razvoj za začetnike](https://aka.ms/webdev-beginners) +- [IoT za začetnike](https://aka.ms/iot-beginners) +- [Razvoj XR za začetnike](https://github.com/microsoft/xr-development-for-beginners) +- [Obvladovanje GitHub Copilot za parno programiranje](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming) +- [Obvladovanje GitHub Copilot za razvijalce C#/.NET](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers) +- [Izberite svojo Copilot pustolovščino](https://github.com/microsoft/CopilotAdventures) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/SECURITY.md b/translations/sl/SECURITY.md new file mode 100644 index 00000000..5c9af047 --- /dev/null +++ b/translations/sl/SECURITY.md @@ -0,0 +1,51 @@ + +## Varnost + +Microsoft jemlje varnost svojih programske opreme in storitev resno, kar vključuje vse repozitorije izvorne kode, ki jih upravljajo naše GitHub organizacije, med katerimi so [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin) in [naše GitHub organizacije](https://opensource.microsoft.com/). + +Če menite, da ste odkrili varnostno ranljivost v katerem koli repozitoriju, ki je v lasti Microsofta in ustreza [Microsoftovi definiciji varnostne ranljivosti](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott), nam jo prosimo prijavite, kot je opisano spodaj. + +## Prijava varnostnih težav + +**Prosimo, ne prijavljajte varnostnih ranljivosti prek javnih GitHub težav.** + +Namesto tega jih prijavite Microsoftovemu centru za odzivanje na varnost (MSRC) na [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). + +Če želite prijavo oddati brez prijave, pošljite e-pošto na [secure@microsoft.com](mailto:secure@microsoft.com). Če je mogoče, šifrirajte svoje sporočilo z našim PGP ključem; prenesite ga s strani [Microsoft Security Response Center PGP Key](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). + +Odgovor bi morali prejeti v 24 urah. Če ga iz kakršnega koli razloga ne prejmete, prosimo, da pošljete nadaljnje sporočilo prek e-pošte, da zagotovite, da smo prejeli vaše prvotno sporočilo. Dodatne informacije najdete na [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Prosimo, vključite zahtevane informacije, navedene spodaj (kolikor jih lahko zagotovite), da nam pomagate bolje razumeti naravo in obseg možne težave: + + * Vrsta težave (npr. prelivanje medpomnilnika, SQL injekcija, skriptiranje med spletnimi mesti itd.) + * Polne poti izvornih datotek, povezanih z manifestacijo težave + * Lokacija prizadete izvorne kode (oznaka/veja/commit ali neposredni URL) + * Kakršna koli posebna konfiguracija, potrebna za reprodukcijo težave + * Korak za korakom navodila za reprodukcijo težave + * Dokaz koncepta ali izkoriščevalna koda (če je mogoče) + * Vpliv težave, vključno s tem, kako bi napadalec lahko izkoristil težavo + +Te informacije nam bodo pomagale hitreje obravnavati vaše poročilo. + +Če poročate v okviru programa nagrajevanja za napake, lahko bolj popolna poročila prispevajo k višji nagradi. Prosimo, obiščite našo stran [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) za več podrobnosti o naših aktivnih programih. + +## Prednostni jeziki + +Za komunikacijo dajemo prednost angleščini. + +## Politika + +Microsoft sledi načelu [Koordiniranega razkritja ranljivosti](https://www.microsoft.com/en-us/msrc/cvd). + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da se zavedate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/SUPPORT.md b/translations/sl/SUPPORT.md new file mode 100644 index 00000000..a7ea9432 --- /dev/null +++ b/translations/sl/SUPPORT.md @@ -0,0 +1,24 @@ + +# Podpora +## Kako prijaviti težave in dobiti pomoč + +Ta projekt uporablja GitHub Issues za sledenje hroščem in zahtevam za funkcije. Preden prijavite novo težavo, prosimo, preiščite obstoječe težave, da se izognete podvajanju. Za nove težave prijavite svoj hrošč ali zahtevo za funkcijo kot novo težavo. + +Za pomoč in vprašanja o uporabi tega projekta prijavite težavo. + +## Microsoftova politika podpore + +Podpora za to repozitorij je omejena na zgoraj navedene vire. + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas opozarjamo, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/docs/_sidebar.md b/translations/sl/docs/_sidebar.md new file mode 100644 index 00000000..716fceb6 --- /dev/null +++ b/translations/sl/docs/_sidebar.md @@ -0,0 +1,57 @@ + +- Uvod + - [Uvod v strojno učenje](../1-Introduction/1-intro-to-ML/README.md) + - [Zgodovina strojnega učenja](../1-Introduction/2-history-of-ML/README.md) + - [Strojno učenje in pravičnost](../1-Introduction/3-fairness/README.md) + - [Tehnike strojnega učenja](../1-Introduction/4-techniques-of-ML/README.md) + +- Regresija + - [Orodja za delo](../2-Regression/1-Tools/README.md) + - [Podatki](../2-Regression/2-Data/README.md) + - [Linearna regresija](../2-Regression/3-Linear/README.md) + - [Logistična regresija](../2-Regression/4-Logistic/README.md) + +- Izdelava spletne aplikacije + - [Spletna aplikacija](../3-Web-App/1-Web-App/README.md) + +- Klasifikacija + - [Uvod v klasifikacijo](../4-Classification/1-Introduction/README.md) + - [Klasifikatorji 1](../4-Classification/2-Classifiers-1/README.md) + - [Klasifikatorji 2](../4-Classification/3-Classifiers-2/README.md) + - [Uporabljeno strojno učenje](../4-Classification/4-Applied/README.md) + +- Grozdenje + - [Vizualizacija podatkov](../5-Clustering/1-Visualize/README.md) + - [K-Means](../5-Clustering/2-K-Means/README.md) + +- NLP + - [Uvod v obdelavo naravnega jezika](../6-NLP/1-Introduction-to-NLP/README.md) + - [Naloge NLP](../6-NLP/2-Tasks/README.md) + - [Prevajanje in sentiment](../6-NLP/3-Translation-Sentiment/README.md) + - [Ocene hotelov 1](../6-NLP/4-Hotel-Reviews-1/README.md) + - [Ocene hotelov 2](../6-NLP/5-Hotel-Reviews-2/README.md) + +- Napovedovanje časovnih vrst + - [Uvod v napovedovanje časovnih vrst](../7-TimeSeries/1-Introduction/README.md) + - [ARIMA](../7-TimeSeries/2-ARIMA/README.md) + - [SVR](../7-TimeSeries/3-SVR/README.md) + +- Učenje z okrepitvijo + - [Q-Learning](../8-Reinforcement/1-QLearning/README.md) + - [Gym](../8-Reinforcement/2-Gym/README.md) + +- Strojno učenje v resničnem svetu + - [Aplikacije](../9-Real-World/1-Applications/README.md) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/for-teachers.md b/translations/sl/for-teachers.md new file mode 100644 index 00000000..0c4a2678 --- /dev/null +++ b/translations/sl/for-teachers.md @@ -0,0 +1,37 @@ + +## Za učitelje + +Bi radi uporabili ta učni načrt v svojem razredu? Kar izvolite! + +Pravzaprav ga lahko uporabite kar znotraj GitHuba, tako da uporabite GitHub Classroom. + +Za to morate narediti fork tega repozitorija. Za vsako lekcijo boste morali ustvariti ločen repozitorij, zato boste morali vsako mapo izvleči v ločen repozitorij. Na ta način lahko [GitHub Classroom](https://classroom.github.com/classrooms) vsako lekcijo obravnava ločeno. + +Te [celovite smernice](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) vam bodo pokazale, kako vzpostaviti svoj razred. + +## Uporaba repozitorija v trenutni obliki + +Če želite uporabiti ta repozitorij v trenutni obliki, brez uporabe GitHub Classroom, je to prav tako mogoče. S študenti boste morali komunicirati, katero lekcijo naj skupaj predelajo. + +V spletnem formatu (Zoom, Teams ali drugo) lahko organizirate ločene sobe za kvize in mentorirate študente, da se pripravijo na učenje. Nato povabite študente, da rešijo kvize in oddajo svoje odgovore kot 'issues' ob določenem času. Podobno lahko ravnate z nalogami, če želite, da študenti sodelujejo javno. + +Če imate raje bolj zaseben format, prosite študente, da naredijo fork učnega načrta, lekcijo za lekcijo, v svoje zasebne GitHub repozitorije, in vam omogočijo dostop. Tako lahko kvize in naloge opravijo zasebno ter vam jih oddajo prek 'issues' na vašem razrednem repozitoriju. + +Obstaja veliko načinov, kako to prilagoditi spletnemu učnemu okolju. Prosimo, sporočite nam, kaj vam najbolj ustreza! + +## Prosimo, delite svoje mnenje! + +Želimo, da ta učni načrt deluje za vas in vaše študente. Prosimo, da nam posredujete [povratne informacije](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u). + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/quiz-app/README.md b/translations/sl/quiz-app/README.md new file mode 100644 index 00000000..4470a392 --- /dev/null +++ b/translations/sl/quiz-app/README.md @@ -0,0 +1,126 @@ + +# Kvizi + +Ti kvizi so predhodni in zaključni kvizi za učni načrt strojnega učenja na https://aka.ms/ml-beginners + +## Nastavitev projekta + +``` +npm install +``` + +### Kompilacija in samodejno osveževanje za razvoj + +``` +npm run serve +``` + +### Kompilacija in minimizacija za produkcijo + +``` +npm run build +``` + +### Preverjanje kode in odpravljanje napak + +``` +npm run lint +``` + +### Prilagoditev konfiguracije + +Glej [Referenca konfiguracije](https://cli.vuejs.org/config/). + +Zasluge: Zahvala za izvirno različico te aplikacije za kvize: https://github.com/arpan45/simple-quiz-vue + +## Namestitev na Azure + +Tukaj je korak-po-korak vodič, ki vam bo pomagal začeti: + +1. Forkajte GitHub repozitorij +Poskrbite, da je koda vaše statične spletne aplikacije v vašem GitHub repozitoriju. Forkajte ta repozitorij. + +2. Ustvarite Azure Static Web App +- Ustvarite [Azure račun](http://azure.microsoft.com) +- Pojdite na [Azure portal](https://portal.azure.com) +- Kliknite “Create a resource” in poiščite “Static Web App”. +- Kliknite “Create”. + +3. Konfigurirajte Static Web App +- Osnovno: Naročnina: Izberite svojo Azure naročnino. +- Skupina virov: Ustvarite novo skupino virov ali uporabite obstoječo. +- Ime: Dajte ime svoji statični spletni aplikaciji. +- Regija: Izberite regijo, ki je najbližja vašim uporabnikom. + +- #### Podrobnosti o namestitvi: +- Vir: Izberite “GitHub”. +- GitHub račun: Avtorizirajte Azure za dostop do vašega GitHub računa. +- Organizacija: Izberite svojo GitHub organizacijo. +- Repozitorij: Izberite repozitorij, ki vsebuje vašo statično spletno aplikacijo. +- Branch: Izberite branch, iz katerega želite namestiti. + +- #### Podrobnosti o gradnji: +- Prednastavitve gradnje: Izberite okvir, na katerem je vaša aplikacija zgrajena (npr. React, Angular, Vue itd.). +- Lokacija aplikacije: Določite mapo, ki vsebuje kodo vaše aplikacije (npr. /, če je v korenu). +- Lokacija API-ja: Če imate API, določite njegovo lokacijo (neobvezno). +- Lokacija izhoda: Določite mapo, kjer je generiran izhod gradnje (npr. build ali dist). + +4. Pregled in ustvarjanje +Preglejte svoje nastavitve in kliknite “Create”. Azure bo nastavil potrebne vire in ustvaril GitHub Actions workflow v vašem repozitoriju. + +5. GitHub Actions Workflow +Azure bo samodejno ustvaril GitHub Actions workflow datoteko v vašem repozitoriju (.github/workflows/azure-static-web-apps-.yml). Ta workflow bo upravljal proces gradnje in namestitve. + +6. Spremljanje namestitve +Pojdite na zavihek “Actions” v vašem GitHub repozitoriju. +Videti bi morali, da se izvaja workflow. Ta workflow bo zgradil in namestil vašo statično spletno aplikacijo na Azure. +Ko se workflow zaključi, bo vaša aplikacija na voljo na dodeljenem Azure URL-ju. + +### Primer datoteke workflow + +Tukaj je primer, kako bi lahko izgledala GitHub Actions workflow datoteka: +name: Azure Static Web Apps CI/CD +``` +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - main + +jobs: + build_and_deploy_job: + runs-on: ubuntu-latest + name: Build and Deploy Job + steps: + - uses: actions/checkout@v2 + - name: Build And Deploy + id: builddeploy + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }} + repo_token: ${{ secrets.GITHUB_TOKEN }} + action: "upload" + app_location: "/quiz-app" # App source code path + api_location: ""API source code path optional + output_location: "dist" #Built app content directory - optional +``` + +### Dodatni viri +- [Dokumentacija Azure Static Web Apps](https://learn.microsoft.com/azure/static-web-apps/getting-started) +- [Dokumentacija GitHub Actions](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/sketchnotes/LICENSE.md b/translations/sl/sketchnotes/LICENSE.md new file mode 100644 index 00000000..619c20ec --- /dev/null +++ b/translations/sl/sketchnotes/LICENSE.md @@ -0,0 +1,126 @@ + +Priznanje-Deljenje pod enakimi pogoji 4.0 Mednarodna + +======================================================================= + +Creative Commons Corporation ("Creative Commons") ni odvetniška družba in ne nudi pravnih storitev ali pravnih nasvetov. Distribucija javnih licenc Creative Commons ne ustvarja odnosa med odvetnikom in stranko ali kakršnega koli drugega odnosa. Creative Commons omogoča svoje licence in povezane informacije na podlagi "kot so". Creative Commons ne daje nobenih jamstev glede svojih licenc, gradiva, licenciranega pod njihovimi pogoji, ali povezanih informacij. Creative Commons zavrača vso odgovornost za škodo, ki izhaja iz njihove uporabe, v največjem možnem obsegu. + +Uporaba javnih licenc Creative Commons + +Javne licence Creative Commons zagotavljajo standardni nabor pogojev, ki jih lahko ustvarjalci in drugi imetniki pravic uporabijo za deljenje izvirnih avtorskih del in drugega gradiva, ki je predmet avtorskih pravic in določenih drugih pravic, navedenih v spodnji javni licenci. Naslednje točke so zgolj informativne narave, niso izčrpne in niso del naših licenc. + + Premisleki za dajalce licenc: Naše javne licence so namenjene tistim, ki so pooblaščeni, da javnosti dovolijo uporabo gradiva na načine, ki bi sicer bili omejeni z avtorskimi pravicami in določenimi drugimi pravicami. Naše licence so nepreklicne. Dajalci licenc naj preberejo in razumejo pogoje licence, ki jo izberejo, preden jo uporabijo. Prav tako naj dajalci licenc zagotovijo vse potrebne pravice, preden uporabijo naše licence, da bo javnost lahko ponovno uporabila gradivo, kot je pričakovano. Dajalci licenc naj jasno označijo gradivo, ki ni predmet licence. To vključuje drugo gradivo, licencirano pod CC, ali gradivo, uporabljeno na podlagi izjeme ali omejitve avtorskih pravic. Več premislekov za dajalce licenc: + wiki.creativecommons.org/Considerations_for_licensors + + Premisleki za javnost: Z uporabo ene od naših javnih licenc dajalec licence javnosti podeli dovoljenje za uporabo licenciranega gradiva pod določenimi pogoji. Če dovoljenje dajalca licence ni potrebno iz kakršnega koli razloga – na primer zaradi veljavne izjeme ali omejitve avtorskih pravic – potem ta uporaba ni urejena z licenco. Naše licence podeljujejo le dovoljenja v okviru avtorskih pravic in določenih drugih pravic, ki jih ima dajalec licence pooblastilo podeliti. Uporaba licenciranega gradiva je lahko še vedno omejena iz drugih razlogov, vključno s tem, da imajo drugi avtorske pravice ali druge pravice do gradiva. Dajalec licence lahko poda posebne zahteve, kot je zahteva, da so vse spremembe označene ali opisane. Čeprav to ni zahtevano z našimi licencami, vas spodbujamo, da te zahteve spoštujete, kjer je to razumno. Več premislekov za javnost: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Priznanje-Deljenje pod enakimi pogoji 4.0 Mednarodna javna licenca + +Z izvajanjem Licenciranih pravic (kot so opredeljene spodaj) sprejemate in se strinjate s pogoji te Creative Commons Priznanje-Deljenje pod enakimi pogoji 4.0 Mednarodne javne licence ("Javna licenca"). V obsegu, v katerem se ta Javna licenca lahko razlaga kot pogodba, vam Licencirane pravice podeljujemo v zameno za vaše sprejetje teh pogojev, dajalec licence pa vam te pravice podeljuje v zameno za koristi, ki jih prejme zaradi omogočanja dostopa do Licenciranega gradiva pod temi pogoji. + +Razdelek 1 -- Definicije. + + a. Prirejeno gradivo pomeni gradivo, ki je predmet avtorskih pravic in podobnih pravic, ki izhaja iz ali temelji na Licenciranem gradivu in v katerem je Licencirano gradivo prevedeno, spremenjeno, urejeno, preoblikovano ali kako drugače prilagojeno na način, ki zahteva dovoljenje po avtorskih pravicah in podobnih pravicah, ki jih ima dajalec licence. Za namene te Javne licence se šteje, da je Prirejeno gradivo vedno ustvarjeno, kadar je Licencirano gradivo sinhronizirano v časovni povezavi s premikajočo se sliko. + + b. Licenca prirejevalca pomeni licenco, ki jo uporabite za svoje avtorske pravice in podobne pravice v svojih prispevkih k Prirejenemu gradivu v skladu s pogoji te Javne licence. + + c. Združljiva licenca BY-SA pomeni licenco, navedeno na creativecommons.org/compatiblelicenses, ki jo je Creative Commons odobril kot bistveno enakovredno tej Javni licenci. + + d. Avtorske pravice in podobne pravice pomenijo avtorske pravice in/ali podobne pravice, ki so tesno povezane z avtorskimi pravicami, vključno z, brez omejitev, pravicami do izvedbe, oddajanja, zvočnega posnetka in sui generis pravicami do podatkovnih zbirk, ne glede na to, kako so pravice označene ali kategorizirane. Za namene te Javne licence pravice, določene v Razdelku 2(b)(1)-(2), niso Avtorske pravice in podobne pravice. + + e. Učinkoviti tehnološki ukrepi pomenijo tiste ukrepe, ki jih brez ustreznega pooblastila ni mogoče zaobiti po zakonih, ki izpolnjujejo obveznosti iz člena 11 Pogodbe WIPO o avtorskih pravicah, sprejete 20. decembra 1996, in/ali podobnih mednarodnih sporazumov. + + f. Izjeme in omejitve pomenijo pošteno uporabo, pošteno ravnanje in/ali katero koli drugo izjemo ali omejitev avtorskih pravic in podobnih pravic, ki velja za vašo uporabo Licenciranega gradiva. + + g. Elementi licence pomenijo atribute licence, navedene v imenu Javne licence Creative Commons. Elementi licence te Javne licence so Priznanje in Deljenje pod enakimi pogoji. + + h. Licencirano gradivo pomeni umetniško ali literarno delo, podatkovno zbirko ali drugo gradivo, za katero je dajalec licence uporabil to Javno licenco. + + i. Licencirane pravice pomenijo pravice, podeljene vam pod pogoji te Javne licence, ki so omejene na vse Avtorske pravice in podobne pravice, ki veljajo za vašo uporabo Licenciranega gradiva in za katere ima dajalec licence pooblastilo za licenciranje. + + j. Dajalec licence pomeni posameznika(e) ali subjekt(e), ki podeljujejo pravice po tej Javni licenci. + + k. Deljenje pomeni zagotavljanje gradiva javnosti na kakršen koli način ali proces, ki zahteva dovoljenje po Licenciranih pravicah, kot so reproduciranje, javno prikazovanje, javno izvajanje, distribucija, razširjanje, komunikacija ali uvoz, ter omogočanje dostopa do gradiva javnosti, vključno na načine, ki omogočajo članom javnosti dostop do gradiva z mesta in ob času, ki ga sami izberejo. + + l. Sui generis pravice do podatkovnih zbirk pomenijo pravice, ki niso avtorske pravice, izhajajoče iz Direktive 96/9/ES Evropskega parlamenta in Sveta z dne 11. marca 1996 o pravnem varstvu podatkovnih zbirk, kot je bila spremenjena in/ali nadomeščena, ter druge bistveno enakovredne pravice kjer koli na svetu. + + m. Vi pomeni posameznika ali subjekt, ki izvaja Licencirane pravice po tej Javni licenci. Vaš ima ustrezen pomen. + +... +Pravice, nato pa podatkovna zbirka, v kateri imate pravice sui generis do podatkovne zbirke (vendar ne do njenih posameznih vsebin), je prilagojeno gradivo, + +vključno za namene oddelka 3(b); in +c. Upoštevati morate pogoje iz oddelka 3(a), če delite celotno ali bistven del vsebine podatkovne zbirke. + +Da bi se izognili dvomom, ta oddelek 4 dopolnjuje in ne nadomešča vaših obveznosti po tej javni licenci, kadar licencirane pravice vključujejo druge avtorske pravice in podobne pravice. + +--- + +Oddelek 5 -- Izjava o omejitvi jamstev in omejitvi odgovornosti. + +a. RAZEN ČE LICENCODAJALEC LOČENO NE DOLOČI DRUGAČE, LICENCODAJALEC, KOLIKOR JE TO MOGOČE, PONUJA LICENCIRANO GRADIVO TAKŠNO, KOT JE, IN TAKŠNO, KOT JE NA VOLJO, TER NE DAJE NOBENIH IZJAV ALI JAMSTEV KAKRŠNEKOLI VRSTE GLEDE LICENCIRANEGA GRADIVA, BODISI IZRECNIH, IMPLICITNIH, ZAKONSKIH ALI DRUGIH. TO VKLJUČUJE, BREZ OMEJITEV, JAMSTVA GLEDE LASTNIŠTVA, PRIMERNOSTI ZA DOLOČEN NAMEN, NEKRŠENJA, ODSOTNOSTI SKRITIH ALI DRUGIH NAPAK, TOČNOSTI ALI PRISOTNOSTI ALI ODSOTNOSTI NAPAK, NE GLEDE NA TO, ALI SO ZNANE ALI ODKRITE. KJER IZJAVE O OMEJITVI JAMSTEV NISO DOVOLJENE V CELOTI ALI DELNO, TA IZJAVA ZA VAS MORDA NE VELJA. + +b. KOLIKOR JE TO MOGOČE, LICENCODAJALEC V NOBENEM PRIMERU NE BO ODGOVOREN VAM NA KATERIKOLI PRAVNI PODLAGI (VKLJUČNO, BREZ OMEJITEV, MALOMARNOST) ALI DRUGAČE ZA KAKRŠNEKOLI NEPOSREDNE, POSEBNE, POSREDNE, NAKLJUČNE, POSLEDIČNE, KAZENSKE, VZORNE ALI DRUGE IZGUBE, STROŠKE, IZDATKE ALI ŠKODO, KI IZHAJAJO IZ TE JAVNE LICENCE ALI UPORABE LICENCIRANEGA GRADIVA, ČETUDI JE LICENCODAJALEC OBVEŠČEN O MOŽNOSTI TAKŠNIH IZGUB, STROŠKOV, IZDATKOV ALI ŠKODE. KJER OMEJITEV ODGOVORNOSTI NI DOVOLJENA V CELOTI ALI DELNO, TA OMEJITEV ZA VAS MORDA NE VELJA. + +c. Izjava o omejitvi jamstev in omejitvi odgovornosti, navedena zgoraj, se razlaga na način, ki, kolikor je to mogoče, najbolj približa absolutni izjavi o omejitvi in odpovedi vsem odgovornostim. + +--- + +Oddelek 6 -- Trajanje in prenehanje. + +a. Ta javna licenca velja za obdobje avtorskih pravic in podobnih pravic, ki so tukaj licencirane. Vendar pa, če ne upoštevate te javne licence, se vaše pravice po tej javni licenci samodejno prekinejo. + +b. Kadar se vaša pravica do uporabe licenciranega gradiva prekine v skladu z oddelkom 6(a), se ponovno vzpostavi: + +1. samodejno na datum, ko je kršitev odpravljena, pod pogojem, da je odpravljena v 30 dneh od vaše ugotovitve kršitve; ali +2. z izrecno ponovno vzpostavitvijo s strani licencodajalca. + +Da bi se izognili dvomom, ta oddelek 6(b) ne vpliva na nobeno pravico, ki jo ima licencodajalec, da zahteva pravna sredstva za vaše kršitve te javne licence. + +c. Da bi se izognili dvomom, lahko licencodajalec ponudi licencirano gradivo pod ločenimi pogoji ali preneha distribuirati licencirano gradivo kadarkoli; vendar pa to ne bo prekinilo te javne licence. + +d. Oddelki 1, 5, 6, 7 in 8 ostanejo v veljavi po prenehanju te javne licence. + +--- + +Oddelek 7 -- Drugi pogoji in določila. + +a. Licencodajalec ni zavezan nobenim dodatnim ali drugačnim pogojem ali določilom, ki jih sporočite vi, razen če se izrecno strinja. + +b. Kakršnekoli dogovori, razumevanja ali sporazumi glede licenciranega gradiva, ki niso navedeni tukaj, so ločeni od in neodvisni od pogojev in določil te javne licence. + +--- + +Oddelek 8 -- Razlaga. + +a. Da bi se izognili dvomom, ta javna licenca ne omejuje, zmanjšuje, omejuje ali nalaga pogojev za kakršnokoli uporabo licenciranega gradiva, ki bi bila zakonito izvedljiva brez dovoljenja po tej javni licenci. + +b. Kolikor je to mogoče, če se katera koli določba te javne licence šteje za neizvršljivo, se samodejno spremeni v najmanjši možni meri, da postane izvršljiva. Če določbe ni mogoče spremeniti, se izloči iz te javne licence, ne da bi to vplivalo na izvršljivost preostalih pogojev in določil. + +c. Noben pogoj ali določilo te javne licence ne bo opuščen in nobena neizpolnitev ne bo odobrena, razen če se licencodajalec izrecno strinja. + +d. Nič v tej javni licenci ne predstavlja ali se lahko razlaga kot omejitev ali odpoved kakršnimkoli privilegijem in imunitetam, ki veljajo za licencodajalca ali vas, vključno z zakonitimi postopki katere koli jurisdikcije ali oblasti. + +--- + +======================================================================= + +Creative Commons ni stranka svojih javnih licenc. Kljub temu lahko Creative Commons izbere uporabo ene od svojih javnih licenc za gradivo, ki ga objavi, in v teh primerih se šteje za "licencodajalca". Besedilo javnih licenc Creative Commons je posvečeno javni domeni v skladu z CC0 Public Domain Dedication. Razen za omejen namen označevanja, da je gradivo deljeno pod javno licenco Creative Commons ali kot je drugače dovoljeno s politikami Creative Commons, objavljenimi na creativecommons.org/policies, Creative Commons ne dovoljuje uporabe blagovne znamke "Creative Commons" ali katere koli druge blagovne znamke ali logotipa Creative Commons brez predhodnega pisnega soglasja, vključno, brez omejitev, v povezavi s kakršnimi koli nepooblaščenimi spremembami katere koli od svojih javnih licenc ali kakršnimi koli drugimi dogovori, razumevanji ali sporazumi glede uporabe licenciranega gradiva. Da bi se izognili dvomom, ta odstavek ni del javnih licenc. + +Creative Commons je dosegljiv na creativecommons.org. + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna napačna razumevanja ali napačne interpretacije, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/sketchnotes/README.md b/translations/sl/sketchnotes/README.md new file mode 100644 index 00000000..751f0b30 --- /dev/null +++ b/translations/sl/sketchnotes/README.md @@ -0,0 +1,21 @@ + +Vse skice učnega načrta lahko prenesete tukaj. + +🖨 Za tiskanje v visoki ločljivosti so TIFF različice na voljo v [tem repozitoriju](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff). + +🎨 Ustvarila: [Tomomi Imura](https://github.com/girliemac) (Twitter: [@girlie_mac](https://twitter.com/girlie_mac)) + +[![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-sa/4.0/) + +--- + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sr/1-Introduction/1-intro-to-ML/README.md b/translations/sr/1-Introduction/1-intro-to-ML/README.md new file mode 100644 index 00000000..e5aab851 --- /dev/null +++ b/translations/sr/1-Introduction/1-intro-to-ML/README.md @@ -0,0 +1,159 @@ + +# Увод у машинско учење + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![Машинско учење за почетнике - Увод у машинско учење за почетнике](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "Машинско учење за почетнике - Увод у машинско учење за почетнике") + +> 🎥 Кликните на слику изнад за кратак видео који обрађује ову лекцију. + +Добродошли на овај курс о класичном машинском учењу за почетнике! Било да сте потпуно нови у овој области или сте искусан практичар машинског учења који жели да обнови знање, драго нам је што сте нам се придружили! Желимо да створимо пријатно место за почетак вашег изучавања машинског учења и биће нам драго да проценимо, одговоримо и укључимо ваше [повратне информације](https://github.com/microsoft/ML-For-Beginners/discussions). + +[![Увод у машинско учење](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Увод у машинско учење") + +> 🎥 Кликните на слику изнад за видео: Џон Гуттаг са МИТ-а представља машинско учење + +--- +## Почетак са машинским учењем + +Пре него што почнете са овим програмом, потребно је да ваш рачунар буде подешен и спреман за локално покретање бележница. + +- **Подесите свој рачунар помоћу ових видеа**. Користите следеће линкове да научите [како да инсталирате Python](https://youtu.be/CXZYvNRIAKM) на вашем систему и [подесите текст едитор](https://youtu.be/EU8eayHWoZg) за развој. +- **Научите Python**. Такође се препоручује да имате основно разумевање [Python-а](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), програмског језика корисног за научнике података који користимо у овом курсу. +- **Научите Node.js и JavaScript**. Неколико пута у овом курсу користимо JavaScript за изградњу веб апликација, па ће вам бити потребно да имате [node](https://nodejs.org) и [npm](https://www.npmjs.com/) инсталиране, као и [Visual Studio Code](https://code.visualstudio.com/) доступан за развој у Python-у и JavaScript-у. +- **Направите GitHub налог**. Пошто сте нас пронашли на [GitHub-у](https://github.com), можда већ имате налог, али ако немате, направите га и затим форкујте овај програм како бисте га користили сами. (Слободно нам дајте и звездицу 😊) +- **Истражите Scikit-learn**. Упознајте се са [Scikit-learn](https://scikit-learn.org/stable/user_guide.html), скупом библиотека за машинско учење које користимо у овим лекцијама. + +--- +## Шта је машинско учење? + +Термин 'машинско учење' је један од најпопуларнијих и најчешће коришћених термина данашњице. Постоји велика вероватноћа да сте овај термин чули бар једном ако имате било какву повезаност са технологијом, без обзира на област у којој радите. Механизми машинског учења, међутим, остају мистерија за већину људи. За почетника у машинском учењу, ова тема може понекад деловати застрашујуће. Зато је важно разумети шта машинско учење заправо јесте и учити о њему корак по корак, кроз практичне примере. + +--- +## Крива хипе-а + +![крива хипе-а за машинско учење](../../../../1-Introduction/1-intro-to-ML/images/hype.png) + +> Google Trends приказује недавну 'криву хипе-а' за термин 'машинско учење' + +--- +## Мистериозни универзум + +Живимо у универзуму пуном фасцинантних мистерија. Велики научници попут Стивена Хокинга, Алберта Ајнштајна и многих других посветили су своје животе трагању за значајним информацијама које откривају мистерије света око нас. Ово је људска потреба за учењем: људско дете учи нове ствари и открива структуру свог света из године у годину како расте до одраслог доба. + +--- +## Дечји мозак + +Дечји мозак и чула перципирају чињенице из своје околине и постепено уче скривене обрасце живота који помажу детету да обликује логичка правила за препознавање научених образаца. Процес учења људског мозга чини људе најсофистициранијим живим бићима на овом свету. Континуирано учење откривањем скривених образаца и затим иновације на тим обрасцима омогућавају нам да постајемо све бољи током живота. Ова способност учења и еволуције повезана је са концептом који се зове [пластичност мозга](https://www.simplypsychology.org/brain-plasticity.html). Површно гледано, можемо повући неке мотивационе сличности између процеса учења људског мозга и концепата машинског учења. + +--- +## Људски мозак + +[Људски мозак](https://www.livescience.com/29365-human-brain.html) перципира ствари из стварног света, обрађује перципиране информације, доноси рационалне одлуке и изводи одређене радње у зависности од околности. Ово називамо интелигентним понашањем. Када програмирамо реплику процеса интелигентног понашања у машину, то називамо вештачком интелигенцијом (AI). + +--- +## Нека терминологија + +Иако се термини могу мешати, машинско учење (ML) је важан подсет вештачке интелигенције. **ML се бави коришћењем специјализованих алгоритама за откривање значајних информација и проналажење скривених образаца из перципираних података како би се потврдио процес рационалног доношења одлука**. + +--- +## AI, ML, дубоко учење + +![AI, ML, дубоко учење, наука о подацима](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png) + +> Дијаграм који приказује односе између AI, ML, дубоког учења и науке о подацима. Инфографика аутора [Џен Лупер](https://twitter.com/jenlooper) инспирисана [овом графиком](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining) + +--- +## Концепти које ћемо обрадити + +У овом програму ћемо обрадити само основне концепте машинског учења које почетник мора знати. Обрађујемо оно што називамо 'класичним машинским учењем', углавном користећи Scikit-learn, одличну библиотеку коју многи студенти користе за учење основа. Да бисмо разумели шире концепте вештачке интелигенције или дубоког учења, неопходно је имати јако основно знање машинског учења, и зато желимо да га понудимо овде. + +--- +## На овом курсу ћете научити: + +- основне концепте машинског учења +- историју ML-а +- ML и правичност +- технике регресије у ML-у +- технике класификације у ML-у +- технике кластерисања у ML-у +- обраду природног језика у ML-у +- технике прогнозирања временских серија +- учење путем појачања +- примене ML-а у стварном свету + +--- +## Шта нећемо обрађивати + +- дубоко учење +- неуронске мреже +- вештачку интелигенцију + +Да бисмо омогућили боље искуство учења, избегаваћемо сложености неуронских мрежа, 'дубоког учења' - изградње модела са више слојева користећи неуронске мреже - и вештачке интелигенције, о чему ћемо говорити у другом програму. Такође ћемо понудити предстојећи програм о науци о подацима како бисмо се фокусирали на тај аспект ове шире области. + +--- +## Зашто изучавати машинско учење? + +Машинско учење, из перспективе система, дефинише се као стварање аутоматизованих система који могу учити скривене обрасце из података како би помогли у доношењу интелигентних одлука. + +Ова мотивација је лабаво инспирисана начином на који људски мозак учи одређене ствари на основу података које перципира из спољашњег света. + +✅ Размислите на тренутак зашто би нека компанија желела да користи стратегије машинског учења уместо да креира систем заснован на фиксним правилима. + +--- +## Примене машинског учења + +Примене машинског учења сада су готово свуда и присутне су као и подаци који круже нашим друштвима, генерисани нашим паметним телефонима, повезаним уређајима и другим системима. С обзиром на огроман потенцијал савремених алгоритама машинског учења, истраживачи истражују њихову способност да реше вишедимензионалне и мултидисциплинарне проблеме из стварног живота са изузетно позитивним резултатима. + +--- +## Примери примене ML-а + +**Машинско учење можете користити на многе начине**: + +- За предвиђање вероватноће болести на основу медицинске историје или извештаја пацијента. +- За коришћење података о времену ради предвиђања временских догађаја. +- За разумевање сентимента текста. +- За откривање лажних вести како би се спречило ширење пропаганде. + +Финансије, економија, наука о Земљи, истраживање свемира, биомедицинско инжењерство, когнитивна наука, па чак и области хуманистичких наука адаптирале су машинско учење за решавање тешких проблема обраде података у својим доменима. + +--- +## Закључак + +Машинско учење аутоматизује процес откривања образаца проналажењем значајних увида из стварних или генерисаних података. Доказало је своју вредност у пословним, здравственим и финансијским применама, између осталог. + +У блиској будућности, разумевање основа машинског учења биће неопходно за људе из било које области због његове широке примене. + +--- +# 🚀 Изазов + +Нацртајте, на папиру или користећи онлајн апликацију попут [Excalidraw](https://excalidraw.com/), своје разумевање разлика између AI, ML, дубоког учења и науке о подацима. Додајте неке идеје о проблемима које свака од ових техника добро решава. + +# [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +--- +# Преглед и самостално учење + +Да бисте сазнали више о томе како можете радити са ML алгоритмима у облаку, пратите овај [пут учења](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott). + +Пратите [пут учења](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) о основама машинског учења. + +--- +# Задатак + +[Покрените се](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/1-Introduction/1-intro-to-ML/assignment.md b/translations/sr/1-Introduction/1-intro-to-ML/assignment.md new file mode 100644 index 00000000..26569aa8 --- /dev/null +++ b/translations/sr/1-Introduction/1-intro-to-ML/assignment.md @@ -0,0 +1,23 @@ + +# Покрените се и започните + +## Упутства + +У овом задатку који се не оцењује, требало би да обновите своје знање о Python-у и припремите своје окружење тако да можете покретати бележнице. + +Пратите овај [Python пут учења](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), а затим подесите своје системе тако што ћете погледати ове уводне видео снимке: + +https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6 + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/1-Introduction/2-history-of-ML/README.md b/translations/sr/1-Introduction/2-history-of-ML/README.md new file mode 100644 index 00000000..52323954 --- /dev/null +++ b/translations/sr/1-Introduction/2-history-of-ML/README.md @@ -0,0 +1,164 @@ + +# Историја машинског учења + +![Резиме историје машинског учења у скици](../../../../sketchnotes/ml-history.png) +> Скица од [Томоми Имура](https://www.twitter.com/girlie_mac) + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![Машинско учење за почетнике - Историја машинског учења](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "Машинско учење за почетнике - Историја машинског учења") + +> 🎥 Кликните на слику изнад за кратак видео који обрађује ову лекцију. + +У овој лекцији, проћи ћемо кроз главне прекретнице у историји машинског учења и вештачке интелигенције. + +Историја вештачке интелигенције (AI) као области је тесно повезана са историјом машинског учења, јер су алгоритми и рачунарски напредак који подупиру машинско учење допринели развоју AI. Корисно је запамтити да, иако су се ове области као посебне области истраживања почеле кристализовати 1950-их, важна [алгоритамска, статистичка, математичка, рачунарска и техничка открића](https://wikipedia.org/wiki/Timeline_of_machine_learning) претходила и преклапала се са овим периодом. У ствари, људи размишљају о овим питањима већ [стотинама година](https://wikipedia.org/wiki/History_of_artificial_intelligence): овај чланак разматра историјске интелектуалне основе идеје о 'машини која мисли'. + +--- +## Значајна открића + +- 1763, 1812 [Бајесова теорема](https://wikipedia.org/wiki/Bayes%27_theorem) и њени претходници. Ова теорема и њене примене су основа за закључивање, описујући вероватноћу да се догађај догоди на основу претходног знања. +- 1805 [Теорија најмањих квадрата](https://wikipedia.org/wiki/Least_squares) француског математичара Адријена-Марија Лежандра. Ова теорија, коју ћете научити у нашем модулу о регресији, помаже у прилагођавању података. +- 1913 [Марковљеви ланци](https://wikipedia.org/wiki/Markov_chain), названи по руском математичару Андреју Маркову, користе се за описивање низа могућих догађаја на основу претходног стања. +- 1957 [Перцептрон](https://wikipedia.org/wiki/Perceptron) је врста линеарног класификатора коју је изумео амерички психолог Френк Розенблат и која је основа за напредак у дубоком учењу. + +--- + +- 1967 [Најближи сусед](https://wikipedia.org/wiki/Nearest_neighbor) је алгоритам првобитно дизајниран за мапирање рута. У контексту машинског учења користи се за откривање образаца. +- 1970 [Бекпропагација](https://wikipedia.org/wiki/Backpropagation) се користи за тренирање [напредних неуронских мрежа](https://wikipedia.org/wiki/Feedforward_neural_network). +- 1982 [Рекурентне неуронске мреже](https://wikipedia.org/wiki/Recurrent_neural_network) су вештачке неуронске мреже изведене из напредних неуронских мрежа које стварају временске графове. + +✅ Урадите мало истраживања. Који други датуми се истичу као кључни у историји машинског учења и вештачке интелигенције? + +--- +## 1950: Машине које мисле + +Алан Тјуринг, заиста изузетна личност која је [гласањем јавности 2019. године](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) проглашен за највећег научника 20. века, заслужан је за постављање темеља концепта 'машине која може да мисли'. Он се суочавао са скептицима и сопственом потребом за емпиријским доказима овог концепта делимично креирајући [Тјурингов тест](https://www.bbc.com/news/technology-18475646), који ћете истражити у нашим лекцијама о обради природног језика. + +--- +## 1956: Летњи истраживачки пројекат на Дартмуту + +"Летњи истраживачки пројекат на Дартмуту о вештачкој интелигенцији био је кључни догађај за вештачку интелигенцију као област," и овде је скован термин 'вештачка интелигенција' ([извор](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)). + +> Сваки аспект учења или било која друга карактеристика интелигенције може се у принципу тако прецизно описати да се машина може направити да га симулира. + +--- + +Водећи истраживач, професор математике Џон Мекарти, надао се "да настави на основу претпоставке да се сваки аспект учења или било која друга карактеристика интелигенције може у принципу тако прецизно описати да се машина може направити да га симулира." Учесници су укључивали још једну значајну личност у области, Марвина Минског. + +Радионица је заслужна за покретање и подстицање неколико дискусија, укључујући "успон симболичких метода, система фокусираних на ограничене домене (рани експертски системи) и дедуктивних система наспрам индуктивних система." ([извор](https://wikipedia.org/wiki/Dartmouth_workshop)). + +--- +## 1956 - 1974: "Златне године" + +Од 1950-их до средине '70-их, оптимизам је био висок у нади да AI може решити многе проблеме. Године 1967, Марвин Мински је самоуверено изјавио: "Унутар једне генерације ... проблем стварања 'вештачке интелигенције' ће бити суштински решен." (Мински, Марвин (1967), Рачунање: Коначне и бесконачне машине, Енглвуд Клифс, Њ.: Прентис-Хол) + +Истраживање обраде природног језика је процветало, претрага је усавршена и постала моћнија, а концепт 'микро-светова' је створен, где су једноставни задаци извршавани користећи упутства на обичном језику. + +--- + +Истраживање је било добро финансирано од стране владиних агенција, постигнут је напредак у рачунарству и алгоритмима, а прототипови интелигентних машина су изграђени. Неке од ових машина укључују: + +* [Шејки робот](https://wikipedia.org/wiki/Shakey_the_robot), који је могао да се креће и одлучује како да обавља задатке 'интелигентно'. + + ![Шејки, интелигентни робот](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg) + > Шејки 1972. године + +--- + +* Елиза, рани 'четбот', могла је да разговара са људима и делује као примитивни 'терапеут'. Више о Елизи ћете научити у лекцијама о обради природног језика. + + ![Елиза, бот](../../../../1-Introduction/2-history-of-ML/images/eliza.png) + > Верзија Елизе, четбота + +--- + +* "Свет блокова" био је пример микро-света где су блокови могли бити сложени и сортирани, а експерименти у учењу машина да доносе одлуке могли су бити тестирани. Напредак изграђен уз библиотеке као што је [SHRDLU](https://wikipedia.org/wiki/SHRDLU) помогао је да се обрада језика унапреди. + + [![Свет блокова са SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "Свет блокова са SHRDLU") + + > 🎥 Кликните на слику изнад за видео: Свет блокова са SHRDLU + +--- +## 1974 - 1980: "Зима AI" + +До средине 1970-их, постало је очигледно да је сложеност стварања 'интелигентних машина' била потцењена и да је њено обећање, с обзиром на доступну рачунарску моћ, било преувеличано. Финансирање је пресушило, а поверење у област је опало. Неки од проблема који су утицали на поверење укључују: +--- +- **Ограничења**. Рачунарска моћ је била сувише ограничена. +- **Комбинаторна експлозија**. Количина параметара које је требало обучити је експоненцијално расла како се више захтевало од рачунара, без паралелне еволуције рачунарске моћи и способности. +- **Недостатак података**. Недостатак података је ометао процес тестирања, развоја и усавршавања алгоритама. +- **Да ли постављамо права питања?**. Саме постављене питања су почеле да се доводе у питање. Истраживачи су почели да се суочавају са критикама о својим приступима: + - Тјурингов тест је доведен у питање, између осталог, кроз теорију 'кинеске собе' која је поставила да, "програмирање дигиталног рачунара може учинити да изгледа као да разуме језик, али не може произвести стварно разумевање." ([извор](https://plato.stanford.edu/entries/chinese-room/)) + - Етика увођења вештачке интелигенције као што је "терапеут" Елиза у друштво је изазвала расправе. + +--- + +Истовремено, различите школе мишљења о AI су почеле да се формирају. Успостављена је дихотомија између ["неуредног" и "уредног AI"](https://wikipedia.org/wiki/Neats_and_scruffies) приступа. _Неуредне_ лабораторије су сатима прилагођавале програме док нису добиле жељене резултате. _Уредне_ лабораторије су се "фокусирале на логику и формално решавање проблема". Елиза и SHRDLU су били познати _неуредни_ системи. У 1980-им, како је потражња за репродуктивним системима машинског учења расла, _уредни_ приступ је постепено преузео примат јер су његови резултати били објашњивији. + +--- +## 1980-те Експертски системи + +Како је област расла, њена корист за пословање постала је јаснија, а 1980-их је дошло до ширења 'експертских система'. "Експертски системи су били међу првим заиста успешним облицима софтвера за вештачку интелигенцију (AI)." ([извор](https://wikipedia.org/wiki/Expert_system)). + +Овај тип система је заправо _хибридан_, делимично се састоји од правила која дефинишу пословне захтеве и мотора за закључивање који користи систем правила за извођење нових чињеница. + +Овај период је такође видео повећану пажњу посвећену неуронским мрежама. + +--- +## 1987 - 1993: AI 'Хладноћа' + +Ширење специјализованог хардвера за експертске системе имало је несрећан ефекат да постане превише специјализовано. Појава персоналних рачунара такође је конкурисала овим великим, специјализованим, централизованим системима. Демократизација рачунарства је почела, и на крају је отворила пут за савремени експлозију великих података. + +--- +## 1993 - 2011 + +Овај период је донео нову еру за машинско учење и AI да реше неке од проблема који су раније били узроковани недостатком података и рачунарске моћи. Количина података је почела брзо да расте и постала је доступнија, на добро и на зло, посебно са појавом паметних телефона око 2007. године. Рачунарска моћ је експоненцијално расла, а алгоритми су се развијали упоредо. Област је почела да добија зрелост како су се слободни дани прошлости кристализовали у праву дисциплину. + +--- +## Сада + +Данас машинско учење и AI додирују скоро сваки део наших живота. Овај период захтева пажљиво разумевање ризика и потенцијалних ефеката ових алгоритама на људске животе. Како је изјавио Бред Смит из Мајкрософта: "Информациона технологија поставља питања која се тичу суштинских људских права као што су приватност и слобода изражавања. Ова питања повећавају одговорност технолошких компанија које стварају ове производе. По нашем мишљењу, она такође захтевају промишљену регулацију владе и развој норми о прихватљивим употребама" ([извор](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)). + +--- + +Остаје да се види шта будућност доноси, али је важно разумети ове рачунарске системе и софтвер и алгоритме које они покрећу. Надамо се да ће вам овај курикулум помоћи да боље разумете како бисте могли сами да донесете одлуке. + +[![Историја дубоког учења](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "Историја дубоког учења") +> 🎥 Кликните на слику изнад за видео: Јан Лекун говори о историји дубоког учења у овом предавању + +--- +## 🚀Изазов + +Истражите један од ових историјских тренутака и сазнајте више о људима који стоје иза њих. Постоје фасцинантни карактери, и ниједно научно откриће није настало у културном вакууму. Шта откривате? + +## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ml/) + +--- +## Преглед и самостално учење + +Ево ставки за гледање и слушање: + +[Овај подкаст где Ејми Бојд говори о еволуцији AI](http://runasradio.com/Shows/Show/739) + +[![Историја AI од Ејми Бојд](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "Историја AI од Ејми Бојд") + +--- + +## Задатак + +[Направите временску линију](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/1-Introduction/2-history-of-ML/assignment.md b/translations/sr/1-Introduction/2-history-of-ML/assignment.md new file mode 100644 index 00000000..8e7e2d15 --- /dev/null +++ b/translations/sr/1-Introduction/2-history-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Направите временску линију + +## Упутства + +Користећи [овај репозиторијум](https://github.com/Digital-Humanities-Toolkit/timeline-builder), направите временску линију неког аспекта историје алгоритама, математике, статистике, вештачке интелигенције или машинског учења, или комбинацију ових области. Можете се фокусирати на једну особу, једну идеју или дуг временски период размишљања. Обавезно додајте мултимедијалне елементе. + +## Рубрика + +| Критеријум | Изузетно | Задовољавајуће | Потребно побољшање | +| ---------- | ------------------------------------------------ | --------------------------------------- | ---------------------------------------------------------------- | +| | Објављена временска линија као GitHub страница | Код је непотпун и није објављен | Временска линија је непотпуна, недовољно истражена и није објављена | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/1-Introduction/3-fairness/README.md b/translations/sr/1-Introduction/3-fairness/README.md new file mode 100644 index 00000000..62d61d83 --- /dev/null +++ b/translations/sr/1-Introduction/3-fairness/README.md @@ -0,0 +1,138 @@ + +# Изградња решења за машинско учење са одговорном вештачком интелигенцијом + +![Резиме одговорне вештачке интелигенције у машинском учењу у скици](../../../../sketchnotes/ml-fairness.png) +> Скица од [Томоми Имура](https://www.twitter.com/girlie_mac) + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Увод + +У овом курикулуму, почећете да откривате како машинско учење може и већ утиче на наше свакодневне животе. Чак и сада, системи и модели су укључени у свакодневне задатке доношења одлука, као што су дијагнозе у здравству, одобравање кредита или откривање превара. Због тога је важно да ти модели добро функционишу како би пружили резултате који су поуздани. Као и свака софтверска апликација, системи вештачке интелигенције могу да не испуне очекивања или да имају непожељан исход. Зато је од суштинског значаја разумети и објаснити понашање модела вештачке интелигенције. + +Замислите шта може да се догоди када подаци које користите за изградњу ових модела недостају одређеним демографским групама, као што су раса, пол, политички ставови, религија, или када непропорционално представљају те демографске групе. Шта ако је излаз модела интерпретиран тако да фаворизује одређену демографску групу? Које су последице за апликацију? Поред тога, шта се дешава када модел има негативан исход и наноси штету људима? Ко је одговоран за понашање система вештачке интелигенције? Ово су нека од питања која ћемо истражити у овом курикулуму. + +У овој лекцији, научићете: + +- Да подигнете свест о важности правичности у машинском учењу и штетама повезаним са неправичношћу. +- Да се упознате са праксом истраживања изузетака и необичних сценарија ради осигурања поузданости и безбедности. +- Да стекнете разумевање о потреби оснаживања свих кроз дизајнирање инклузивних система. +- Да истражите колико је важно заштитити приватност и безбедност података и људи. +- Да увидите значај приступа „стаклене кутије“ за објашњавање понашања модела вештачке интелигенције. +- Да будете свесни како је одговорност кључна за изградњу поверења у системе вештачке интелигенције. + +## Предуслов + +Као предуслов, молимо вас да прођете кроз „Принципе одговорне вештачке интелигенције“ и погледате видео испод на ову тему: + +Сазнајте више о одговорној вештачкој интелигенцији пратећи овај [пут учења](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) + +[![Приступ Microsoft-а одговорној вештачкој интелигенцији](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Приступ Microsoft-а одговорној вештачкој интелигенцији") + +> 🎥 Кликните на слику изнад за видео: Приступ Microsoft-а одговорној вештачкој интелигенцији + +## Правичност + +Системи вештачке интелигенције треба да третирају све људе праведно и избегавају различите ефекте на сличне групе људи. На пример, када системи вештачке интелигенције пружају смернице о медицинском лечењу, апликацијама за кредите или запошљавању, они треба да дају исте препоруке свима са сличним симптомима, финансијским околностима или професионалним квалификацијама. Сваки од нас као људско биће носи у себи наследне предрасуде које утичу на наше одлуке и поступке. Те предрасуде могу бити очигледне у подацима које користимо за обучавање система вештачке интелигенције. Таква манипулација понекад може да се догоди ненамерно. Често је тешко свесно знати када уносите предрасуде у податке. + +**„Неправичност“** обухвата негативне утицаје, или „штете“, за групу људи, као што су они дефинисани у смислу расе, пола, старости или инвалидитета. Главне штете повезане са неправичношћу могу се класификовати као: + +- **Додела ресурса**, ако је, на пример, одређени пол или етничка група фаворизована у односу на другу. +- **Квалитет услуге**. Ако обучите податке за један специфичан сценарио, али је стварност много сложенија, то доводи до лоше услуге. На пример, дозатор сапуна који не може да препозна људе са тамном кожом. [Референца](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) +- **Омаловажавање**. Неправедно критиковање и етикетирање нечега или некога. На пример, технологија за означавање слика је озлоглашено погрешно означила слике људи тамне коже као гориле. +- **Прекомерна или недовољна заступљеност**. Идеја је да одређена група није видљива у одређеној професији, а свака услуга или функција која наставља да промовише то доприноси штети. +- **Стереотипизација**. Повезивање одређене групе са унапред додељеним атрибутима. На пример, систем за превођење између енглеског и турског може имати нетачности због речи са стереотипним асоцијацијама на пол. + +![превод на турски](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png) +> превод на турски + +![превод назад на енглески](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) +> превод назад на енглески + +Када дизајнирамо и тестирамо системе вештачке интелигенције, морамо осигурати да вештачка интелигенција буде праведна и да није програмирана да доноси пристрасне или дискриминаторне одлуке, које су и људима забрањене. Гарантовање правичности у вештачкој интелигенцији и машинском учењу остаје сложен социотехнички изазов. + +### Поузданост и безбедност + +Да би се изградило поверење, системи вештачке интелигенције морају бити поуздани, безбедни и конзистентни у нормалним и неочекиваним условима. Важно је знати како ће се системи вештачке интелигенције понашати у различитим ситуацијама, посебно када су у питању изузеци. Приликом изградње решења заснованих на вештачкој интелигенцији, потребно је посветити значајну пажњу томе како се носити са широким спектром околности које би решења могла да сусретну. На пример, аутомобил који се самостално управља мора ставити безбедност људи као главни приоритет. Као резултат, вештачка интелигенција која покреће аутомобил мора узети у обзир све могуће сценарије са којима би се аутомобил могао суочити, као што су ноћ, грмљавина или снежне олује, деца која трче преко улице, кућни љубимци, радови на путу итд. Колико добро систем вештачке интелигенције може да се носи са широким спектром услова поуздано и безбедно одражава ниво предвиђања који је научник за податке или програмер вештачке интелигенције разматрао током дизајна или тестирања система. + +> [🎥 Кликните овде за видео: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) + +### Инклузивност + +Системи вештачке интелигенције треба да буду дизајнирани тако да ангажују и оснажују све. Приликом дизајнирања и имплементације система вештачке интелигенције, научници за податке и програмери вештачке интелигенције идентификују и решавају потенцијалне препреке у систему које би могле ненамерно искључити људе. На пример, постоји 1 милијарда људи са инвалидитетом широм света. Са напретком вештачке интелигенције, они могу лакше приступити широком спектру информација и могућности у свакодневном животу. Решавањем препрека стварају се могућности за иновације и развој производа заснованих на вештачкој интелигенцији са бољим искуствима која користе свима. + +> [🎥 Кликните овде за видео: инклузивност у вештачкој интелигенцији](https://www.microsoft.com/videoplayer/embed/RE4vl9v) + +### Безбедност и приватност + +Системи вештачке интелигенције треба да буду безбедни и да поштују приватност људи. Људи имају мање поверења у системе који угрожавају њихову приватност, информације или животе. Приликом обучавања модела машинског учења, ослањамо се на податке како бисмо произвели најбоље резултате. У том процесу, порекло података и њихов интегритет морају бити узети у обзир. На пример, да ли су подаци достављени од стране корисника или јавно доступни? Затим, док радимо са подацима, од суштинског је значаја развијати системе вештачке интелигенције који могу заштитити поверљиве информације и одолети нападима. Како вештачка интелигенција постаје све присутнија, заштита приватности и обезбеђивање важних личних и пословних информација постаје све критичнија и сложенија. Питања приватности и безбедности података захтевају посебну пажњу за вештачку интелигенцију јер је приступ подацима од суштинског значаја за системе вештачке интелигенције да би донели тачне и информисане предвиђања и одлуке о људима. + +> [🎥 Кликните овде за видео: безбедност у вештачкој интелигенцији](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Као индустрија, постигли смо значајан напредак у области приватности и безбедности, значајно подстакнут регулативама као што је GDPR (Општа уредба о заштити података). +- Ипак, са системима вештачке интелигенције морамо признати тензију између потребе за више личних података како би системи били персонализованији и ефикаснији – и приватности. +- Као што је било са појавом повезаних рачунара преко интернета, такође видимо велики пораст броја безбедносних проблема повезаних са вештачком интелигенцијом. +- Истовремено, видели смо да се вештачка интелигенција користи за побољшање безбедности. На пример, већина модерних антивирусних скенера данас се покреће помоћу хеуристике засноване на вештачкој интелигенцији. +- Морамо осигурати да наши процеси у области науке о подацима хармонично функционишу са најновијим праксама приватности и безбедности. + +### Транспарентност + +Системи вештачке интелигенције треба да буду разумљиви. Кључни део транспарентности је објашњавање понашања система вештачке интелигенције и њихових компоненти. Побољшање разумевања система вештачке интелигенције захтева да заинтересоване стране разумеју како и зашто функционишу, како би могли да идентификују потенцијалне проблеме у перформансама, забринутости у вези са безбедношћу и приватношћу, пристрасности, праксе искључивања или непредвиђене исходе. Такође верујемо да они који користе системе вештачке интелигенције треба да буду искрени и отворени о томе када, зашто и како одлучују да их примене, као и о ограничењима система које користе. На пример, ако банка користи систем вештачке интелигенције за подршку у доношењу одлука о кредитима за потрошаче, важно је испитати исходе и разумети који подаци утичу на препоруке система. Владе почињу да регулишу вештачку интелигенцију у различитим индустријама, па научници за податке и организације морају објаснити да ли систем вештачке интелигенције испуњава регулаторне захтеве, посебно када дође до непожељног исхода. + +> [🎥 Кликните овде за видео: транспарентност у вештачкој интелигенцији](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Због сложености система вештачке интелигенције, тешко је разумети како они функционишу и интерпретирати резултате. +- Овај недостатак разумевања утиче на начин на који се ти системи управљају, оперативно користе и документују. +- Овај недостатак разумевања, што је још важније, утиче на одлуке донете на основу резултата које ти системи производе. + +### Одговорност + +Људи који дизајнирају и примењују системе вештачке интелигенције морају бити одговорни за начин на који њихови системи функционишу. Потреба за одговорношћу је посебно важна код осетљивих технологија као што је препознавање лица. У последње време, постоји растућа потражња за технологијом препознавања лица, посебно од стране организација за спровођење закона које виде потенцијал технологије у употребама као што је проналажење нестале деце. Међутим, те технологије би потенцијално могле бити коришћене од стране владе да угрозе основне слободе својих грађана, на пример, омогућавањем континуираног надзора одређених појединаца. Зато научници за податке и организације морају бити одговорни за начин на који њихов систем вештачке интелигенције утиче на појединце или друштво. + +[![Водећи истраживач вештачке интелигенције упозорава на масовни надзор кроз препознавање лица](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Приступ Microsoft-а одговорној вештачкој интелигенцији") + +> 🎥 Кликните на слику изнад за видео: Упозорења о масовном надзору кроз препознавање лица + +На крају, једно од највећих питања за нашу генерацију, као прву генерацију која доноси вештачку интелигенцију у друштво, јесте како осигурати да рачунари остану одговорни људима и како осигурати да људи који дизајнирају рачунаре остану одговорни свима осталима. + +## Процена утицаја + +Пре него што обучите модел машинског учења, важно је спровести процену утицаја како бисте разум +Погледајте овај радионицу да бисте се дубље упознали са темама: + +- У потрази за одговорном вештачком интелигенцијом: Примена принципа у пракси од стране Бесмире Нуши, Мехрнуш Самеки и Амита Шарме + +[![Responsible AI Toolbox: Отворени оквир за изградњу одговорне вештачке интелигенције](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Отворени оквир за изградњу одговорне вештачке интелигенције") + +> 🎥 Кликните на слику изнад за видео: RAI Toolbox: Отворени оквир за изградњу одговорне вештачке интелигенције од стране Бесмире Нуши, Мехрнуш Самеки и Амита Шарме + +Такође, прочитајте: + +- Microsoft-ов центар ресурса за одговорну вештачку интелигенцију: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsoft-ова истраживачка група FATE: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +RAI Toolbox: + +- [Responsible AI Toolbox GitHub репозиторијум](https://github.com/microsoft/responsible-ai-toolbox) + +Прочитајте о алатима Azure Machine Learning-а за обезбеђивање правичности: + +- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) + +## Задатак + +[Истражите RAI Toolbox](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/1-Introduction/3-fairness/assignment.md b/translations/sr/1-Introduction/3-fairness/assignment.md new file mode 100644 index 00000000..37fa96d9 --- /dev/null +++ b/translations/sr/1-Introduction/3-fairness/assignment.md @@ -0,0 +1,25 @@ + +# Истражите алат за одговорну вештачку интелигенцију + +## Упутства + +У овом лекцији сте научили о алату за одговорну вештачку интелигенцију, „пројекту отвореног кода који покреће заједница, а који помаже научницима података да анализирају и унапреде системе вештачке интелигенције.“ За овај задатак, истражите један од [бележака](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) RAI Toolbox-а и изнесите своје закључке у раду или презентацији. + +## Рубрика + +| Критеријум | Изузетно | Прихватљиво | Потребно побољшање | +| ---------- | -------- | ----------- | ------------------ | +| | Рад или презентација у PowerPoint-у представљају систем Fairlearn-а, бележак који је покренут и закључке изведене из његовог покретања | Представљен је рад без закључака | Рад није представљен | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/1-Introduction/4-techniques-of-ML/README.md b/translations/sr/1-Introduction/4-techniques-of-ML/README.md new file mode 100644 index 00000000..0f3371c1 --- /dev/null +++ b/translations/sr/1-Introduction/4-techniques-of-ML/README.md @@ -0,0 +1,132 @@ + +# Технике машинског учења + +Процес креирања, коришћења и одржавања модела машинског учења и података које они користе веома се разликује од многих других развојних токова рада. У овом лекцији, разјаснићемо процес и представити главне технике које треба да знате. Ви ћете: + +- Разумети процесе који подупиру машинско учење на високом нивоу. +- Истражити основне концепте као што су „модели“, „предвиђања“ и „тренинг подаци“. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +[![Машинско учење за почетнике - Технике машинског учења](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "Машинско учење за почетнике - Технике машинског учења") + +> 🎥 Кликните на слику изнад за кратак видео који обрађује ову лекцију. + +## Увод + +На високом нивоу, вештина креирања процеса машинског учења (ML) састоји се од неколико корака: + +1. **Одлучите о питању**. Већина процеса машинског учења почиње постављањем питања које не може бити одговорено једноставним условним програмом или системом заснованим на правилима. Ова питања често се односе на предвиђања заснована на збирци података. +2. **Сакупите и припремите податке**. Да бисте могли да одговорите на своје питање, потребни су вам подаци. Квалитет и, понекад, количина ваших података одредиће колико добро можете одговорити на почетно питање. Визуализација података је важан аспект ове фазе. Ова фаза такође укључује поделу података на групу за тренинг и тестирање ради изградње модела. +3. **Изаберите метод тренинга**. У зависности од вашег питања и природе ваших података, потребно је да изаберете како желите да обучите модел да најбоље одражава ваше податке и прави тачна предвиђања. Ово је део вашег процеса машинског учења који захтева специфичну експертизу и, често, значајну количину експериментисања. +4. **Тренирајте модел**. Користећи ваше тренинг податке, користићете различите алгоритме да обучите модел да препозна обрасце у подацима. Модел може користити унутрашње тежине које се могу прилагодити да би се одређени делови података привилеговали у односу на друге ради изградње бољег модела. +5. **Оцените модел**. Користите податке које модел никада раније није видео (ваше тест податке) из ваше сакупљене збирке да бисте видели како модел функционише. +6. **Подешавање параметара**. На основу перформанси вашег модела, можете поново урадити процес користећи различите параметре или променљиве које контролишу понашање алгоритама коришћених за тренинг модела. +7. **Предвиђање**. Користите нове уносе да бисте тестирали тачност вашег модела. + +## Које питање поставити + +Рачунари су посебно вешти у откривању скривених образаца у подацима. Ова корисност је веома корисна за истраживаче који имају питања о одређеној области која се не могу лако одговорити креирањем система заснованог на условима. На пример, у актуарском задатку, научник података може бити у стању да конструише ручно израђена правила о смртности пушача у односу на непушаче. + +Међутим, када се у једначину укључи много других променљивих, модел машинског учења може се показати ефикаснијим за предвиђање будућих стопа смртности на основу историје здравља из прошлости. Веселији пример може бити прављење временских предвиђања за месец април на одређеној локацији на основу података који укључују географску ширину, дужину, климатске промене, близину океана, обрасце млазног струјања и још много тога. + +✅ Ова [презентација](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) о временским моделима нуди историјску перспективу коришћења машинског учења у анализи времена. + +## Задаци пре изградње + +Пре него што почнете да градите свој модел, постоји неколико задатака које треба да завршите. Да бисте тестирали своје питање и формирали хипотезу засновану на предвиђањима модела, потребно је да идентификујете и конфигуришете неколико елемената. + +### Подаци + +Да бисте могли да одговорите на своје питање са било каквом сигурношћу, потребна вам је добра количина података одговарајућег типа. У овом тренутку треба да урадите две ствари: + +- **Сакупите податке**. Имајући на уму претходну лекцију о правичности у анализи података, сакупите своје податке пажљиво. Будите свесни извора ових података, било каквих урођених пристрасности које могу имати и документујте њихово порекло. +- **Припремите податке**. Постоји неколико корака у процесу припреме података. Можда ћете морати да сакупите податке и нормализујете их ако долазе из различитих извора. Можете побољшати квалитет и количину података кроз различите методе као што је конвертовање стрингова у бројеве (као што радимо у [Кластерисању](../../5-Clustering/1-Visualize/README.md)). Можда ћете такође генерисати нове податке, засноване на оригиналним (као што радимо у [Класификацији](../../4-Classification/1-Introduction/README.md)). Можете очистити и уредити податке (као што ћемо урадити пре лекције о [Веб апликацији](../../3-Web-App/README.md)). На крају, можда ћете морати да их рандомизујете и измешате, у зависности од ваших техника тренинга. + +✅ Након сакупљања и обраде ваших података, одвојите тренутак да видите да ли њихов облик омогућава да се адресира ваше намеравано питање. Може се десити да подаци неће добро функционисати у вашем задатом задатку, као што откривамо у нашим лекцијама о [Кластерисању](../../5-Clustering/1-Visualize/README.md)! + +### Карактеристике и циљ + +[Карактеристика](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) је мерљиво својство ваших података. У многим скуповима података она је изражена као наслов колоне, као што су „датум“, „величина“ или „боја“. Ваша променљива карактеристика, обично представљена као `X` у коду, представља улазну променљиву која ће се користити за тренинг модела. + +Циљ је оно што покушавате да предвидите. Циљ, обично представљен као `y` у коду, представља одговор на питање које покушавате да поставите вашим подацима: у децембру, која **боја** тиквица ће бити најјефтинија? У Сан Франциску, који квартови ће имати најбољу **цену** некретнина? Понекад се циљ назива и атрибутом етикете. + +### Избор променљиве карактеристике + +🎓 **Избор карактеристика и екстракција карактеристика** Како знате коју променљиву да изаберете приликом изградње модела? Вероватно ћете проћи кроз процес избора карактеристика или екстракције карактеристика да бисте изабрали праве променљиве за најперформантнији модел. Међутим, они нису исто: „Екстракција карактеристика креира нове карактеристике из функција оригиналних карактеристика, док избор карактеристика враћа подскуп карактеристика.“ ([извор](https://wikipedia.org/wiki/Feature_selection)) + +### Визуализујте своје податке + +Важан аспект алатки научника података је моћ визуализације података користећи неколико одличних библиотека као што су Seaborn или MatPlotLib. Представљање ваших података визуелно може вам омогућити да откријете скривене корелације које можете искористити. Ваше визуализације могу вам такође помоћи да откријете пристрасност или неуравнотежене податке (као што откривамо у [Класификацији](../../4-Classification/2-Classifiers-1/README.md)). + +### Поделите свој скуп података + +Пре тренинга, потребно је да поделите свој скуп података на два или више делова неједнаке величине који и даље добро представљају податке. + +- **Тренинг**. Овај део скупа података се уклапа у ваш модел да би га обучио. Овај сет чини већину оригиналног скупа података. +- **Тестирање**. Тест скуп података је независна група података, често сакупљена из оригиналних података, коју користите да потврдите перформансе изграђеног модела. +- **Валидација**. Валидациони сет је мања независна група примера коју користите да подесите хиперпараметре модела или архитектуру како бисте побољшали модел. У зависности од величине ваших података и питања које постављате, можда нећете морати да изградите овај трећи сет (као што напомињемо у [Предвиђању временских серија](../../7-TimeSeries/1-Introduction/README.md)). + +## Изградња модела + +Користећи ваше тренинг податке, ваш циљ је да изградите модел, или статистичку репрезентацију ваших података, користећи различите алгоритме да га **тренирате**. Тренинг модела излаже га подацима и омогућава му да прави претпоставке о уоченим обрасцима које открива, верификује и прихвата или одбацује. + +### Одлучите о методу тренинга + +У зависности од вашег питања и природе ваших података, изабраћете метод за тренинг. Пролазећи кроз [документацију Scikit-learn](https://scikit-learn.org/stable/user_guide.html) - коју користимо у овом курсу - можете истражити многе начине за тренинг модела. У зависности од вашег искуства, можда ћете морати да испробате неколико различитих метода да бисте изградили најбољи модел. Вероватно ћете проћи кроз процес у којем научници података процењују перформансе модела тако што му дају податке које није видео, проверавајући тачност, пристрасност и друге проблеме који умањују квалитет, и бирајући најприкладнији метод тренинга за задатак. + +### Тренирајте модел + +Наоружани вашим тренинг подацима, спремни сте да их „уклопите“ да бисте креирали модел. Приметићете да у многим библиотекама машинског учења налазите код „model.fit“ - у то време шаљете своју променљиву карактеристику као низ вредности (обично „X“) и циљну променљиву (обично „y“). + +### Оцените модел + +Када је процес тренинга завршен (може бити потребно много итерација, или „епоха“, да се обучи велики модел), моћи ћете да процените квалитет модела користећи тест податке да бисте измерили његове перформансе. Ови подаци су подскуп оригиналних података које модел раније није анализирао. Можете одштампати табелу метрика о квалитету вашег модела. + +🎓 **Уклапање модела** + +У контексту машинског учења, уклапање модела односи се на тачност основне функције модела док покушава да анализира податке са којима није упознат. + +🎓 **Недовољно уклапање** и **претерано уклапање** су уобичајени проблеми који умањују квалитет модела, јер модел или није довољно добро уклопљен или је превише добро уклопљен. Ово узрокује да модел прави предвиђања која су или превише блиско или превише лабаво повезана са његовим тренинг подацима. Претерано уклопљен модел предвиђа тренинг податке превише добро јер је превише добро научио детаље и шум података. Недовољно уклопљен модел није тачан јер не може ни тачно анализирати своје тренинг податке ни податке које још није „видео“. + +![модел претераног уклапања](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png) +> Инфографика од [Jen Looper](https://twitter.com/jenlooper) + +## Подешавање параметара + +Када је ваш почетни тренинг завршен, посматрајте квалитет модела и размислите о његовом побољшању подешавањем његових „хиперпараметара“. Прочитајте више о процесу [у документацији](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott). + +## Предвиђање + +Ово је тренутак када можете користити потпуно нове податке да тестирате тачност вашег модела. У „примењеном“ окружењу машинског учења, где градите веб ресурсе за коришћење модела у продукцији, овај процес може укључивати сакупљање корисничког уноса (на пример, притисак на дугме) да бисте поставили променљиву и послали је моделу за инференцију или евалуацију. + +У овим лекцијама, открићете како да користите ове кораке за припрему, изградњу, тестирање, евалуацију и предвиђање - све гестове научника података и више, док напредујете на свом путу да постанете „фул стејк“ инжењер машинског учења. + +--- + +## 🚀Изазов + +Нацртајте дијаграм тока који одражава кораке практичара машинског учења. Где себе видите тренутно у процесу? Где предвиђате да ћете наћи потешкоће? Шта вам се чини лако? + +## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Претражите интернет за интервјуе са научницима података који говоре о свом свакодневном раду. Ево [једног](https://www.youtube.com/watch?v=Z3IjgbbCEfs). + +## Задатак + +[Интервјуишите научника података](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/1-Introduction/4-techniques-of-ML/assignment.md b/translations/sr/1-Introduction/4-techniques-of-ML/assignment.md new file mode 100644 index 00000000..42099ff7 --- /dev/null +++ b/translations/sr/1-Introduction/4-techniques-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Интервју са научником за податке + +## Упутства + +У вашој компанији, корисничкој групи, или међу вашим пријатељима или колегама студентима, разговарајте са неким ко професионално ради као научник за податке. Напишите кратак есеј (500 речи) о њиховим свакодневним задацима. Да ли су специјалисти или раде као 'фул стек'? + +## Рубрика + +| Критеријум | Изузетно | Довољно | Потребно побољшање | +| ---------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------- | --------------------- | +| | Есеј одговарајуће дужине, са наведеним изворима, представљен као .doc датотека | Есеј је слабо атрибуиран или краћи од захтеване дужине | Есеј није представљен | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/1-Introduction/README.md b/translations/sr/1-Introduction/README.md new file mode 100644 index 00000000..58d275ab --- /dev/null +++ b/translations/sr/1-Introduction/README.md @@ -0,0 +1,37 @@ + +# Увод у машинско учење + +У овом делу курикулума, упознаћете се са основним концептима који чине основу области машинског учења, шта је то, и сазнаћете више о његовој историји и техникама које истраживачи користе за рад у овој области. Хајде да заједно истражимо овај нови свет машинског учења! + +![глобус](../../../1-Introduction/images/globe.jpg) +> Фотографија од Била Оксфорда на Unsplash + +### Лекције + +1. [Увод у машинско учење](1-intro-to-ML/README.md) +1. [Историја машинског учења и вештачке интелигенције](2-history-of-ML/README.md) +1. [Праведност и машинско учење](3-fairness/README.md) +1. [Технике машинског учења](4-techniques-of-ML/README.md) + +### Аутори + +"Увод у машинско учење" написан је са ♥️ од стране тима који укључује [Мухамеда Сакиба Кана Инана](https://twitter.com/Sakibinan), [Орнелу Алтуњан](https://twitter.com/ornelladotcom) и [Џен Лупер](https://twitter.com/jenlooper) + +"Историја машинског учења" написана је са ♥️ од стране [Џен Лупер](https://twitter.com/jenlooper) и [Ејми Бојд](https://twitter.com/AmyKateNicho) + +"Праведност и машинско учење" написана је са ♥️ од стране [Томоми Имуре](https://twitter.com/girliemac) + +"Технике машинског учења" написане су са ♥️ од стране [Џен Лупер](https://twitter.com/jenlooper) и [Криса Норинга](https://twitter.com/softchris) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/1-Tools/README.md b/translations/sr/2-Regression/1-Tools/README.md new file mode 100644 index 00000000..524f38cf --- /dev/null +++ b/translations/sr/2-Regression/1-Tools/README.md @@ -0,0 +1,228 @@ + +# Почетак рада са Python-ом и Scikit-learn-ом за регресионе моделе + +![Резиме регресија у скицама](../../../../sketchnotes/ml-regression.png) + +> Скица од [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ова лекција је доступна на R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) + +## Увод + +У овим четири лекције, открићете како да направите регресионе моделе. Ускоро ћемо разговарати о томе за шта они служе. Али пре него што било шта урадите, уверите се да имате одговарајуће алате за почетак процеса! + +У овој лекцији, научићете како да: + +- Конфигуришете свој рачунар за локалне задатке машинског учења. +- Радите са Jupyter нотебуком. +- Користите Scikit-learn, укључујући инсталацију. +- Истражите линеарну регресију кроз практичну вежбу. + +## Инсталације и конфигурације + +[![ML за почетнике - Припремите своје алате за прављење модела машинског учења](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML за почетнике - Припремите своје алате за прављење модела машинског учења") + +> 🎥 Кликните на слику изнад за кратак видео о конфигурисању вашег рачунара за ML. + +1. **Инсталирајте Python**. Уверите се да је [Python](https://www.python.org/downloads/) инсталиран на вашем рачунару. Користићете Python за многе задатке у области науке о подацима и машинског учења. Већина рачунарских система већ укључује Python инсталацију. Постоје корисни [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) који олакшавају поставку за неке кориснике. + + Међутим, неке употребе Python-а захтевају једну верзију софтвера, док друге захтевају другу верзију. Због тога је корисно радити у [виртуелном окружењу](https://docs.python.org/3/library/venv.html). + +2. **Инсталирајте Visual Studio Code**. Уверите се да је Visual Studio Code инсталиран на вашем рачунару. Пратите ова упутства за [инсталацију Visual Studio Code](https://code.visualstudio.com/) за основну инсталацију. Користићете Python у Visual Studio Code-у током овог курса, па би било добро да се упознате са [конфигурисањем Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) за Python развој. + + > Упознајте се са Python-ом кроз ову колекцију [Learn модула](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) + > + > [![Подешавање Python-а са Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Подешавање Python-а са Visual Studio Code") + > + > 🎥 Кликните на слику изнад за видео: коришћење Python-а унутар VS Code-а. + +3. **Инсталирајте Scikit-learn**, пратећи [ова упутства](https://scikit-learn.org/stable/install.html). Пошто треба да осигурате да користите Python 3, препоручује се да користите виртуелно окружење. Напомена, ако инсталирате ову библиотеку на M1 Mac-у, постоје посебна упутства на страници изнад. + +4. **Инсталирајте Jupyter Notebook**. Требаће вам [инсталација Jupyter пакета](https://pypi.org/project/jupyter/). + +## Ваше окружење за ауторство ML-а + +Користићете **нотебуке** за развој вашег Python кода и креирање модела машинског учења. Овај тип датотеке је уобичајен алат за научнике о подацима, и могу се идентификовати по њиховом суфиксу или екстензији `.ipynb`. + +Нотебуци су интерактивно окружење које омогућава програмеру да и кодира и додаје белешке и пише документацију око кода, што је веома корисно за експерименталне или истраживачке пројекте. + +[![ML за почетнике - Подесите Jupyter Notebooks за почетак прављења регресионе моделе](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML за почетнике - Подесите Jupyter Notebooks за почетак прављења регресионе моделе") + +> 🎥 Кликните на слику изнад за кратак видео о овом задатку. + +### Вежба - рад са нотебуком + +У овом фолдеру, наћи ћете датотеку _notebook.ipynb_. + +1. Отворите _notebook.ipynb_ у Visual Studio Code-у. + + Jupyter сервер ће се покренути са Python 3+. Наћи ћете области нотебука које могу бити `покренуте`, делове кода. Можете покренути блок кода, тако што ћете изабрати икону која изгледа као дугме за репродукцију. + +2. Изаберите икону `md` и додајте мало markdown-а, и следећи текст **# Добродошли у ваш нотебук**. + + Затим, додајте мало Python кода. + +3. Унесите **print('hello notebook')** у блок кода. +4. Изаберите стрелицу да покренете код. + + Требало би да видите исписану изјаву: + + ```output + hello notebook + ``` + +![VS Code са отвореним нотебуком](../../../../2-Regression/1-Tools/images/notebook.jpg) + +Можете испреплетати свој код са коментарима како бисте сами документовали нотебук. + +✅ Размислите на тренутак колико је различито радно окружење веб програмера у односу на оно научника о подацима. + +## Покретање Scikit-learn-а + +Сада када је 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 је библиотека машинског учења отвореног кода која подржава надгледано и ненадгледано учење. Такође пружа разне алате за прилагођавање модела, предобраду података, избор модела и евалуацију, као и многе друге корисне функције." + +У овом курсу, користићете Scikit-learn и друге алате за прављење модела машинског учења за обављање онога што називамо 'традиционалним задацима машинског учења'. Намерно смо избегли неуронске мреже и дубоко учење, јер су боље покривени у нашем предстојећем курикулуму 'AI за почетнике'. + +Scikit-learn олакшава прављење модела и њихову евалуацију за употребу. Првенствено је фокусиран на коришћење нумеричких података и садржи неколико готових скупова података за употребу као алате за учење. Такође укључује унапред направљене моделе које студенти могу испробати. Хајде да истражимо процес учитавања унапред припремљених података и коришћења уграђеног проценитеља за први ML модел са 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 веб сајту. + +[![ML за почетнике - Ваш први пројекат линеарне регресије у Python-у](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML за почетнике - Ваш први пројекат линеарне регресије у Python-у") + +> 🎥 Кликните на слику изнад за кратак видео о овој вежби. + +У датотеци _notebook.ipynb_ повезаној са овом лекцијом, очистите све ћелије притиском на икону 'канта за смеће'. + +У овом делу, радићете са малим скупом података о дијабетесу који је уграђен у Scikit-learn за потребе учења. Замислите да желите да тестирате третман за пацијенте са дијабетесом. Модели машинског учења могу вам помоћи да одредите који пацијенти би боље реаговали на третман, на основу комбинација променљивих. Чак и веома основни регресиони модел, када се визуализује, може показати информације о променљивим које би вам помогле да организујете своје теоријске клиничке студије. + +✅ Постоји много типова метода регресије, и који ћете изабрати зависи од одговора који тражите. Ако желите да предвидите вероватну висину особе одређене старости, користили бисте линеарну регресију, јер тражите **нумеричку вредност**. Ако вас занима да ли одређена врста кухиње треба да се сматра веганском или не, тражите **категоријску доделу**, па бисте користили логистичку регресију. Касније ћете научити више о логистичкој регресији. Размислите мало о неким питањима која можете поставити подацима, и који од ових метода би био прикладнији. + +Хајде да започнемо овај задатак. + +### Увоз библиотека + +За овај задатак увешћемо неке библиотеке: + +- **matplotlib**. То је користан [алат за графиконе](https://matplotlib.org/) и користићемо га за креирање линијског графикона. +- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) је корисна библиотека за руковање нумеричким подацима у Python-у. +- **sklearn**. Ово је [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) библиотека. + +Увезите неке библиотеке за помоћ у задацима. + +1. Додајте увозе тако што ћете унети следећи код: + + ```python + import matplotlib.pyplot as plt + import numpy as np + from sklearn import datasets, linear_model, model_selection + ``` + + Изнад увозите `matplotlib`, `numpy` и увозите `datasets`, `linear_model` и `model_selection` из `sklearn`. `model_selection` се користи за раздвајање података на сетове за обуку и тестирање. + +### Скуп података о дијабетесу + +Уграђени [скуп података о дијабетесу](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) укључује 442 узорка података о дијабетесу, са 10 променљивих карактеристика, од којих неке укључују: + +- age: старост у годинама +- bmi: индекс телесне масе +- bp: просечан крвни притисак +- s1 tc: Т-ћелије (врста белих крвних зрнаца) + +✅ Овај скуп података укључује концепт 'пол' као променљиву карактеристику важну за истраживање о дијабетесу. Многи медицински скупови података укључују ову врсту бинарне класификације. Размислите мало о томе како категоризације попут ове могу искључити одређене делове популације из третмана. + +Сада, учитајте X и y податке. + +> 🎓 Запамтите, ово је надгледано учење, и потребан нам је именовани 'y' циљ. + +У новој ћелији кода, учитајте скуп података о дијабетесу позивајући `load_diabetes()`. Улаз `return_X_y=True` сигнализира да ће `X` бити матрица података, а `y` ће бити циљ регресије. + +1. Додајте неке команде за испис како бисте приказали облик матрице података и њен први елемент: + + ```python + X, y = datasets.load_diabetes(return_X_y=True) + print(X.shape) + print(X[0]) + ``` + + Оно што добијате као одговор је тупл. Оно што радите је да доделите две прве вредности тупла `X` и `y` респективно. Сазнајте више [о тупловима](https://wikipedia.org/wiki/Tuple). + + Можете видети да ови подаци имају 442 ставке обликоване у низове од 10 елемената: + + ```text + (442, 10) + [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076 + -0.04340085 -0.00259226 0.01990842 -0.01764613] + ``` + + ✅ Размислите мало о односу између података и циљне регресије. Линеарна регресија предвиђа односе између карактеристике X и циљне променљиве y. Можете ли пронаћи [циљ](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) за скуп података о дијабетесу у документацији? Шта овај скуп података показује, с обзиром на циљ? + +2. Затим, изаберите део овог скупа података за графикон тако што ћете изабрати трећу колону скупа података. Можете то урадити коришћењем оператора `:` за избор свих редова, а затим избором треће колоне користећи индекс (2). Такође можете променити облик података у 2D низ - како је потребно за графикон - коришћењем `reshape(n_rows, n_columns)`. Ако је један од параметара -1, одговарајућа димензија се рачуна аутоматски. + + ```python + X = X[:, 2] + X = X.reshape((-1,1)) + ``` + + ✅ У било ком тренутку, испишите податке да проверите њихов облик. + +3. Сада када имате податке спремне за графикон, можете видети да ли машина може помоћи у одређивању логичке поделе између бројева у овом скупу података. Да бисте то урадили, потребно је да поделите и податке (X) и циљ (y) на сетове за тестирање и обуку. Scikit-learn има једноставан начин за то; можете поделити своје тест податке на одређеној тачки. + + ```python + X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) + ``` + +4. Сада сте спремни да обучите свој модел! Учитајте модел линеарне регресије и обучите га са својим X и y сетовима за обуку користећи `model.fit()`: + + ```python + model = linear_model.LinearRegression() + model.fit(X_train, y_train) + ``` + + ✅ `model.fit()` је функција коју ћете видети у многим ML библиотекама као што је TensorFlow. + +5. Затим, направите предвиђање користећи тест податке, користећи функцију `predict()`. Ово ће се користити за цртање линије између група података. + + ```python + y_pred = model.predict(X_test) + ``` + +6. Сада је време да прикажете податке на графикону. Matplotlib је веома користан алат за овај +✅ Размислите мало о томе шта се овде дешава. Права линија пролази кроз много малих тачака података, али шта она заправо ради? Можете ли видети како би требало да будете у могућности да користите ову линију за предвиђање где би нова, непозната тачка података требало да се уклопи у односу на y осу графикона? Покушајте да речима објасните практичну употребу овог модела. + +Честитамо, направили сте свој први модел линеарне регресије, креирали предвиђање са њим и приказали га на графикону! + +--- +## 🚀Изазов + +Прикажите графикон за другу променљиву из овог скупа података. Савет: измените ову линију: `X = X[:,2]`. С обзиром на циљ овог скупа података, шта можете открити о прогресији дијабетеса као болести? + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +У овом туторијалу, радили сте са једноставном линеарном регресијом, а не са униваријантном или мултиваријантном линеарном регресијом. Прочитајте мало о разликама између ових метода или погледајте [овај видео](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef). + +Прочитајте више о концепту регресије и размислите о томе каква питања могу бити одговорена овом техником. Узмите [овај туторијал](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) да бисте продубили своје разумевање. + +## Задатак + +[Други скуп података](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/1-Tools/assignment.md b/translations/sr/2-Regression/1-Tools/assignment.md new file mode 100644 index 00000000..05c83bf2 --- /dev/null +++ b/translations/sr/2-Regression/1-Tools/assignment.md @@ -0,0 +1,27 @@ + +# Регресија са Scikit-learn + +## Упутства + +Погледајте [Linnerud dataset](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) у Scikit-learn. Овај скуп података има више [циљева](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): „Састоји се од три вежбе (подаци) и три физиолошке (циљне) променљиве прикупљене од двадесет мушкараца средњих година у фитнес клубу“. + +Својим речима, опишите како направити модел регресије који би приказао однос између обима струка и броја урађених трбушњака. Урадите исто за остале тачке података у овом скупу. + +## Рубрика + +| Критеријум | Изузетно | Прихватљиво | Потребно побољшање | +| ------------------------------ | ----------------------------------- | ----------------------------- | -------------------------- | +| Доставити описни пасус | Достављен је добро написан пасус | Достављено је неколико реченица | Опис није достављен | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/1-Tools/solution/Julia/README.md b/translations/sr/2-Regression/1-Tools/solution/Julia/README.md new file mode 100644 index 00000000..1bd4e75f --- /dev/null +++ b/translations/sr/2-Regression/1-Tools/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/2-Data/README.md b/translations/sr/2-Regression/2-Data/README.md new file mode 100644 index 00000000..cdb2f1c7 --- /dev/null +++ b/translations/sr/2-Regression/2-Data/README.md @@ -0,0 +1,226 @@ + +# Изградња модела регресије помоћу Scikit-learn: припрема и визуализација података + +![Инфографика визуализације података](../../../../2-Regression/2-Data/images/data-visualization.png) + +Инфографика: [Dasani Madipalli](https://twitter.com/dasani_decoded) + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ова лекција је доступна на R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) + +## Увод + +Сада када сте поставили алате који су вам потребни за изградњу модела машинског учења помоћу Scikit-learn, спремни сте да почнете да постављате питања о вашим подацима. Док радите са подацима и примењујете решења машинског учења, веома је важно да знате како да поставите право питање како бисте правилно искористили потенцијале вашег скупа података. + +У овој лекцији ћете научити: + +- Како припремити податке за изградњу модела. +- Како користити Matplotlib за визуализацију података. + +## Постављање правог питања о вашим подацима + +Питање које желите да добијете одговор одредиће који тип алгоритама машинског учења ћете користити. Квалитет одговора који добијете у великој мери зависи од природе ваших података. + +Погледајте [подаци](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) који су обезбеђени за ову лекцију. Можете отворити овај .csv фајл у VS Code. Брзим прегледом одмах се види да постоје празнине и мешавина стрингова и нумеричких података. Такође постоји необичан стубац под називом 'Package' где су подаци мешавина 'sacks', 'bins' и других вредности. Подаци су, у ствари, прилично неуредни. + +[![ML за почетнике - Како анализирати и очистити скуп података](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML за почетнике - Како анализирати и очистити скуп података") + +> 🎥 Кликните на слику изнад за кратак видео о припреми података за ову лекцију. + +У ствари, није баш уобичајено добити скуп података који је потпуно спреман за употребу и креирање модела машинског учења одмах. У овој лекцији ћете научити како да припремите сирове податке користећи стандардне Python библиотеке. Такође ћете научити различите технике за визуализацију података. + +## Студија случаја: 'тржиште бундева' + +У овом директоријуму ћете пронаћи .csv фајл у корену `data` директоријума под називом [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) који садржи 1757 линија података о тржишту бундева, сортираних по градовима. Ово су сирови подаци извучени из [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) које дистрибуира Министарство пољопривреде Сједињених Америчких Држава. + +### Припрема података + +Ови подаци су у јавном домену. Могу се преузети у многим одвојеним фајловима, по градовима, са веб сајта USDA. Да бисмо избегли превише одвојених фајлова, спојили смо све податке о градовима у један табеларни документ, тако да смо већ _припремили_ податке мало. Сада, хајде да детаљније погледамо податке. + +### Подаци о бундевама - рани закључци + +Шта примећујете о овим подацима? Већ сте видели да постоји мешавина стрингова, бројева, празнина и чудних вредности које треба да разумете. + +Које питање можете поставити о овим подацима, користећи технику регресије? Шта кажете на "Предвидите цену бундеве за продају током одређеног месеца". Поново гледајући податке, постоје неке промене које треба да направите да бисте креирали структуру података неопходну за задатак. + +## Вежба - анализа података о бундевама + +Хајде да користимо [Pandas](https://pandas.pydata.org/), (име значи `Python Data Analysis`) алат веома користан за обликовање података, да анализирамо и припремимо ове податке о бундевама. + +### Прво, проверите недостајуће датуме + +Прво ћете морати да предузмете кораке да проверите недостајуће датуме: + +1. Конвертујте датуме у формат месеца (ово су амерички датуми, па је формат `MM/DD/YYYY`). +2. Извуците месец у нови стубац. + +Отворите _notebook.ipynb_ фајл у Visual Studio Code и увезите табеларни документ у нови Pandas dataframe. + +1. Користите функцију `head()` да видите првих пет редова. + + ```python + import pandas as pd + pumpkins = pd.read_csv('../data/US-pumpkins.csv') + pumpkins.head() + ``` + + ✅ Коју функцију бисте користили да видите последњих пет редова? + +1. Проверите да ли постоје недостајући подаци у тренутном dataframe-у: + + ```python + pumpkins.isnull().sum() + ``` + + Постоје недостајући подаци, али можда неће бити битни за задатак. + +1. Да бисте свој dataframe учинили лакшим за рад, изаберите само стубце који су вам потребни, користећи функцију `loc` која из оригиналног dataframe-а извлачи групу редова (прослеђено као први параметар) и стубаца (прослеђено као други параметар). Израз `:` у случају испод значи "сви редови". + + ```python + columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] + pumpkins = pumpkins.loc[:, columns_to_select] + ``` + +### Друго, одредите просечну цену бундеве + +Размислите како да одредите просечну цену бундеве у датом месецу. Које стубце бисте изабрали за овај задатак? Савет: биће вам потребна 3 стубца. + +Решење: узмите просек стубаца `Low Price` и `High Price` да попуните нови стубац Price, и конвертујте стубац Date да приказује само месец. Срећом, према горњој провери, нема недостајућих података за датуме или цене. + +1. Да бисте израчунали просек, додајте следећи код: + + ```python + price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 + + month = pd.DatetimeIndex(pumpkins['Date']).month + + ``` + + ✅ Слободно испишите било које податке које желите да проверите користећи `print(month)`. + +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-а ће вам показати чист, уредан скуп података на којем можете изградити свој нови модел регресије. + +### Али чекајте! Овде има нешто чудно + +Ако погледате стубац `Package`, бундеве се продају у многим различитим конфигурацијама. Неке се продају у мерама '1 1/9 bushel', неке у '1/2 bushel', неке по бундевама, неке по фунти, а неке у великим кутијама са различитим ширинама. + +> Бундеве изгледа веома тешко конзистентно измерити + +Копајући у оригиналне податке, занимљиво је да све што има `Unit of Sale` једнако 'EACH' или 'PER BIN' такође има тип `Package` по инчу, по бин-у, или 'each'. Бундеве изгледа веома тешко конзистентно измерити, па хајде да их филтрирамо тако што ћемо изабрати само бундеве са стрингом 'bushel' у њиховом стубцу `Package`. + +1. Додајте филтер на врху фајла, испод почетног .csv увоза: + + ```python + pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] + ``` + + Ако сада испишете податке, можете видети да добијате само око 415 редова података који садрже бундеве по бушелу. + +### Али чекајте! Постоји још једна ствар коју треба урадити + +Да ли сте приметили да се количина бушела разликује по реду? Морате нормализовати цене тако да приказујете цене по бушелу, па урадите мало математике да их стандардизујете. + +1. Додајте ове линије након блока који креира нови dataframe new_pumpkins: + + ```python + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) + + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) + ``` + +✅ Према [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), тежина бушела зависи од врсте производа, јер је то мерење запремине. "Бушел парадајза, на пример, треба да тежи 56 фунти... Листови и зелени производи заузимају више простора са мање тежине, па бушел спанаћа тежи само 20 фунти." Све је прилично компликовано! Хајде да се не замарамо конверзијом бушела у фунте, већ да одредимо цену по бушелу. Све ово проучавање бушела бундева, међутим, показује колико је важно разумети природу ваших података! + +Сада можете анализирати цене по јединици на основу њихове мере бушела. Ако још једном испишете податке, можете видети како су стандардизовани. + +✅ Да ли сте приметили да су бундеве које се продају по пола бушела веома скупе? Можете ли схватити зашто? Савет: мале бундеве су много скупље од великих, вероватно зато што их има много више по бушелу, с обзиром на неискоришћени простор који заузима једна велика шупља бундева за питу. + +## Стратегије визуализације + +Део улоге научника података је да демонстрира квалитет и природу података са којима ради. Да би то урадили, често креирају занимљиве визуализације, или графиконе, дијаграме и табеле, који приказују различите аспекте података. На овај начин могу визуелно приказати односе и празнине које је иначе тешко открити. + +[![ML за почетнике - Како визуализовати податке помоћу Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML за почетнике - Како визуализовати податке помоћу Matplotlib") + +> 🎥 Кликните на слику изнад за кратак видео о визуализацији података за ову лекцију. + +Визуализације такође могу помоћи у одређивању технике машинског учења која је најприкладнија за податке. Распршени графикон који изгледа као да прати линију, на пример, указује на то да су подаци добар кандидат за вежбу линеарне регресије. + +Једна библиотека за визуализацију података која добро функционише у Jupyter нотебоок-овима је [Matplotlib](https://matplotlib.org/) (коју сте такође видели у претходној лекцији). + +> Стекните више искуства са визуализацијом података у [овим туторијалима](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). + +## Вежба - експериментисање са Matplotlib + +Покушајте да креирате неке основне графиконе за приказ новог dataframe-а који сте управо креирали. Шта би показао основни графикон линија? + +1. Увезите Matplotlib на врху фајла, испод увоза Pandas: + + ```python + import matplotlib.pyplot as plt + ``` + +1. Поново покрените цео нотебоок да освежите. +1. На дну нотебоок-а, додајте ћелију за приказ података као кутију: + + ```python + price = new_pumpkins.Price + month = new_pumpkins.Month + plt.scatter(price, month) + plt.show() + ``` + + ![Распршени графикон који показује однос цене и месеца](../../../../2-Regression/2-Data/images/scatterplot.png) + + Да ли је ово користан графикон? Да ли вас нешто изненађује? + + Није нарочито користан јер само приказује ваше податке као распон тачака у датом месецу. + +### Учинимо га корисним + +Да би графикони приказивали корисне податке, обично је потребно груписати податке на неки начин. Хајде да покушамо да креирамо графикон где оса y приказује месеце, а подаци показују расподелу података. + +1. Додајте ћелију за креирање груписаног стубичастог графикона: + + ```python + new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') + plt.ylabel("Pumpkin Price") + ``` + + ![Стубичасти графикон који показује однос цене и месеца](../../../../2-Regression/2-Data/images/barchart.png) + + Ово је кориснија визуализација података! Чини се да указује на то да је највиша цена бундева у септембру и октобру. Да ли то одговара вашим очекивањима? Зашто или зашто не? + +--- + +## 🚀Изазов + +Истражите различите типове визуализација које Matplotlib нуди. Који типови су најприкладнији за проблеме регресије? + +## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Погледајте многе начине за визуализацију података. Направите списак различитих библиотека које су доступне и забележите које су најбоље за одређене типове задатака, на пример 2D визуализације у односу на 3D визуализације. Шта откривате? + +## Задатак + +[Истраживање визуализације](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/2-Data/assignment.md b/translations/sr/2-Regression/2-Data/assignment.md new file mode 100644 index 00000000..2c3366a6 --- /dev/null +++ b/translations/sr/2-Regression/2-Data/assignment.md @@ -0,0 +1,23 @@ + +# Истраживање визуализација + +Постоји неколико различитих библиотека доступних за визуализацију података. Направите неке визуализације користећи податке о бундевама из овог часа уз помоћ matplotlib и seaborn у пример нотебуку. Које библиотеке су лакше за рад? + +## Рубрика + +| Критеријум | Изузетно | Довољно | Потребно побољшање | +| ----------- | -------- | ------- | ------------------ | +| | Нотебук је предат са две истраживања/визуализације | Нотебук је предат са једним истраживањем/визуализацијом | Нотебук није предат | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/2-Data/solution/Julia/README.md b/translations/sr/2-Regression/2-Data/solution/Julia/README.md new file mode 100644 index 00000000..cc725729 --- /dev/null +++ b/translations/sr/2-Regression/2-Data/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/3-Linear/README.md b/translations/sr/2-Regression/3-Linear/README.md new file mode 100644 index 00000000..b70f11d8 --- /dev/null +++ b/translations/sr/2-Regression/3-Linear/README.md @@ -0,0 +1,374 @@ + +# Изградите регресиони модел користећи Scikit-learn: регресија на четири начина + +![Инфографика линеарне и полиномске регресије](../../../../2-Regression/3-Linear/images/linear-polynomial.png) +> Инфографика од [Dasani Madipalli](https://twitter.com/dasani_decoded) +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ова лекција је доступна на R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html) +### Увод + +До сада сте истраживали шта је регресија користећи пример података из скупа података о ценама бундева, који ћемо користити током ове лекције. Такође сте је визуализовали користећи Matplotlib. + +Сада сте спремни да дубље уђете у регресију за машинско учење. Док визуализација омогућава разумевање података, права моћ машинског учења долази из _тренирања модела_. Модели се тренирају на историјским подацима како би аутоматски ухватили зависности података и омогућили предвиђање исхода за нове податке које модел раније није видео. + +У овој лекцији, научићете више о две врсте регресије: _основна линеарна регресија_ и _полиномска регресија_, заједно са неким математичким основама ових техника. Ови модели ће нам омогућити да предвидимо цене бундева у зависности од различитих улазних података. + +[![Машинско учење за почетнике - Разумевање линеарне регресије](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "Машинско учење за почетнике - Разумевање линеарне регресије") + +> 🎥 Кликните на слику изнад за кратак видео преглед линеарне регресије. + +> Кроз овај курикулум претпостављамо минимално знање математике и настојимо да га учинимо доступним студентима из других области, па обратите пажњу на белешке, 🧮 позиве, дијаграме и друге алате за учење који помажу у разумевању. + +### Предуслов + +До сада би требало да сте упознати са структуром података о бундевама које испитујемо. Можете их пронаћи унапред учитане и очишћене у датотеци _notebook.ipynb_ ове лекције. У датотеци, цена бундева је приказана по бушелу у новом оквиру података. Уверите се да можете покренути ове бележнице у језгрима у Visual Studio Code-у. + +### Припрема + +Као подсетник, учитавате ове податке како бисте постављали питања о њима. + +- Када је најбоље време за куповину бундева? +- Коју цену могу очекивати за кутију минијатурних бундева? +- Да ли да их купим у корпама од пола бушела или у кутијама од 1 1/9 бушела? +Хајде да наставимо са истраживањем ових података. + +У претходној лекцији, креирали сте Pandas оквир података и попунили га делом оригиналног скупа података, стандардизујући цене по бушелу. Међутим, тиме сте успели да сакупите само око 400 података и то само за јесење месеце. + +Погледајте податке које смо унапред учитали у пратећој бележници ове лекције. Подаци су унапред учитани, а почетни распршени графикон је направљен да покаже податке по месецима. Можда можемо добити мало више детаља о природи података ако их боље очистимо. + +## Линија линеарне регресије + +Као што сте научили у Лекцији 1, циљ вежбе линеарне регресије је да се нацрта линија која: + +- **Показује односе између променљивих**. Показује однос између променљивих +- **Прави предвиђања**. Прави тачна предвиђања о томе где би нова тачка података могла пасти у односу на ту линију. + +Типично је за **регресију методом најмањих квадрата** да се нацрта ова врста линије. Термин 'најмањи квадрати' значи да су све тачке података око линије регресије квадриране и затим сабране. Идеално, тај коначни збир је што је могуће мањи, јер желимо низак број грешака, или `најмањи квадрати`. + +То радимо јер желимо да моделирамо линију која има најмању кумулативну удаљеност од свих наших тачака података. Такође квадрирамо термине пре него што их саберемо јер нас занима њихова величина, а не њихов смер. + +> **🧮 Покажите ми математику** +> +> Ова линија, названа _линија најбољег уклапања_, може се изразити [једначином](https://en.wikipedia.org/wiki/Simple_linear_regression): +> +> ``` +> Y = a + bX +> ``` +> +> `X` је 'објашњавајућа променљива'. `Y` је 'зависна променљива'. Нагиб линије је `b`, а `a` је пресек са Y-осом, који се односи на вредност `Y` када је `X = 0`. +> +>![израчунајте нагиб](../../../../2-Regression/3-Linear/images/slope.png) +> +> Прво, израчунајте нагиб `b`. Инфографика од [Jen Looper](https://twitter.com/jenlooper) +> +> Другим речима, и позивајући се на оригинално питање о подацима о бундевама: "предвидите цену бундеве по бушелу по месецу", `X` би се односио на цену, а `Y` би се односио на месец продаје. +> +>![завршите једначину](../../../../2-Regression/3-Linear/images/calculation.png) +> +> Израчунајте вредност Y. Ако плаћате око $4, мора да је април! Инфографика од [Jen Looper](https://twitter.com/jenlooper) +> +> Математика која израчунава линију мора показати нагиб линије, који такође зависи од пресека, или где се `Y` налази када је `X = 0`. +> +> Можете посматрати метод израчунавања ових вредности на веб сајту [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Такође посетите [овој калкулатор најмањих квадрата](https://www.mathsisfun.com/data/least-squares-calculator.html) да видите како вредности бројева утичу на линију. + +## Корелација + +Још један термин који треба разумети је **коефицијент корелације** између датих X и Y променљивих. Користећи распршени графикон, можете брзо визуализовати овај коефицијент. Графикон са тачкама података распршеним у уредној линији има високу корелацију, али графикон са тачкама података распршеним свуда између X и Y има ниску корелацију. + +Добар модел линеарне регресије биће онај који има висок (ближи 1 него 0) коефицијент корелације користећи метод регресије најмањих квадрата са линијом регресије. + +✅ Покрените бележницу која прати ову лекцију и погледајте распршени графикон Месец према Цени. Да ли се подаци који повезују Месец са Ценом за продају бундева чине да имају високу или ниску корелацију, према вашој визуелној интерпретацији распршеног графикона? Да ли се то мења ако користите прецизнију меру уместо `Месец`, нпр. *дан у години* (тј. број дана од почетка године)? + +У коду испод, претпоставићемо да смо очистили податке и добили оквир података назван `new_pumpkins`, сличан следећем: + +ID | Месец | ДанУГодини | Врста | Град | Паковање | Најнижа цена | Највиша цена | Цена +---|-------|------------|-------|------|----------|--------------|--------------|------ +70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 бушел кутије | 15.0 | 15.0 | 13.636364 +71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 бушел кутије | 18.0 | 18.0 | 16.363636 +72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 бушел кутије | 18.0 | 18.0 | 16.363636 +73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 бушел кутије | 17.0 | 17.0 | 15.454545 +74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 бушел кутије | 15.0 | 15.0 | 13.636364 + +> Код за чишћење података доступан је у [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb). Извршили смо исте кораке чишћења као у претходној лекцији и израчунали колону `ДанУГодини` користећи следећи израз: + +```python +day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days) +``` + +Сада када имате разумевање математике иза линеарне регресије, хајде да креирамо регресиони модел да видимо да ли можемо предвидети који пакет бундева ће имати најбоље цене бундева. Неко ко купује бундеве за празничну фарму бундева можда жели ове информације како би оптимизовао своје куповине пакета бундева за фарму. + +## Тражење корелације + +[![Машинско учење за почетнике - Тражење корелације: Кључ за линеарну регресију](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "Машинско учење за почетнике - Тражење корелације: Кључ за линеарну регресију") + +> 🎥 Кликните на слику изнад за кратак видео преглед корелације. + +Из претходне лекције вероватно сте видели да просечна цена за различите месеце изгледа овако: + +Просечна цена по месецу + +Ово сугерише да би требало да постоји нека корелација, и можемо покушати да обучимо модел линеарне регресије да предвиди однос између `Месец` и `Цена`, или између `ДанУГодини` и `Цена`. Ево распршеног графикона који показује овај други однос: + +Распршени графикон Цена према Дан у години + +Хајде да видимо да ли постоји корелација користећи функцију `corr`: + +```python +print(new_pumpkins['Month'].corr(new_pumpkins['Price'])) +print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price'])) +``` + +Изгледа да је корелација прилично мала, -0.15 за `Месец` и -0.17 за `ДанУГодини`, али можда постоји друга важна веза. Изгледа да постоје различити кластери цена који одговарају различитим врстама бундева. Да потврдимо ову хипотезу, хајде да нацртамо сваку категорију бундева користећи различиту боју. Прослеђивањем параметра `ax` функцији за цртање распршених графикона можемо нацртати све тачке на истом графикону: + +```python +ax=None +colors = ['red','blue','green','yellow'] +for i,var in enumerate(new_pumpkins['Variety'].unique()): + df = new_pumpkins[new_pumpkins['Variety']==var] + ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var) +``` + +Распршени графикон Цена према Дан у години + +Наша истрага сугерише да врста има већи утицај на укупну цену него стварни датум продаје. То можемо видети помоћу стубног графикона: + +```python +new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar') +``` + +Стубни графикон цена према врсти + +Фокусирајмо се за тренутак само на једну врсту бундева, 'pie type', и видимо какав ефекат датум има на цену: + +```python +pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE'] +pie_pumpkins.plot.scatter('DayOfYear','Price') +``` +Распршени графикон Цена према Дан у години + +Ако сада израчунате корелацију између `Цена` и `ДанУГодини` користећи функцију `corr`, добићемо нешто попут `-0.27` - што значи да тренирање предиктивног модела има смисла. + +> Пре тренирања модела линеарне регресије, важно је осигурати да су наши подаци чисти. Линеарна регресија не функционише добро са недостајућим вредностима, па има смисла уклонити све празне ћелије: + +```python +pie_pumpkins.dropna(inplace=True) +pie_pumpkins.info() +``` + +Други приступ би био да се те празне вредности попуне просечним вредностима из одговарајуће колоне. + +## Једноставна линеарна регресија + +[![Машинско учење за почетнике - Линеарна и полиномска регресија користећи Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "Машинско учење за почетнике - Линеарна и полиномска регресија користећи Scikit-learn") + +> 🎥 Кликните на слику изнад за кратак видео преглед линеарне и полиномске регресије. + +Да бисмо обучили наш модел линеарне регресије, користићемо библиотеку **Scikit-learn**. + +```python +from sklearn.linear_model import LinearRegression +from sklearn.metrics import mean_squared_error +from sklearn.model_selection import train_test_split +``` + +Почињемо раздвајањем улазних вредности (карактеристика) и очекиваног излаза (ознаке) у одвојене numpy низове: + +```python +X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1) +y = pie_pumpkins['Price'] +``` + +> Напомена да смо морали да извршимо `reshape` на улазним подацима како би пакет за линеарну регресију правилно разумео. Линеарна регресија очекује 2D-низ као улаз, где сваки ред низа одговара вектору улазних карактеристика. У нашем случају, пошто имамо само један улаз - потребан нам је низ облика N×1, где је N величина скупа података. + +Затим, потребно је да поделимо податке на тренирајући и тестирајући скуп података, како бисмо могли да валидирамо наш модел након тренирања: + +```python +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) +``` + +На крају, тренирање стварног модела линеарне регресије траје само два реда кода. Дефинишемо објекат `LinearRegression` и прилагођавамо га нашим подацима користећи метод `fit`: + +```python +lin_reg = LinearRegression() +lin_reg.fit(X_train,y_train) +``` + +Објекат `LinearRegression` након `fit`-овања садржи све коефицијенте регресије, који се могу приступити користећи својство `.coef_`. У нашем случају, постоји само један коефицијент, који би требало да буде око `-0.017`. То значи да цене изгледа падају мало током времена, али не превише, око 2 цента дневно. Такође можемо приступити тачки пресека регресије са Y-осом користећи `lin_reg.intercept_` - она ће бити око `21` у нашем случају, што указује на цену на почетку године. + +Да бисмо видели колико је наш модел тачан, можем +Нашa грешка изгледа да се врти око 2 тачке, што је ~17%. Није баш добро. Још један показатељ квалитета модела је **коефицијент детерминације**, који можемо добити овако: + +```python +score = lin_reg.score(X_train,y_train) +print('Model determination: ', score) +``` +Ако је вредност 0, то значи да модел не узима у обзир улазне податке и делује као *најгори линеарни предиктор*, што је једноставно просечна вредност резултата. Вредност 1 значи да можемо савршено предвидети све очекиване излазе. У нашем случају, коефицијент је око 0.06, што је прилично ниско. + +Такође можемо приказати тест податке заједно са регресионом линијом да бисмо боље видели како регресија функционише у нашем случају: + +```python +plt.scatter(X_test,y_test) +plt.plot(X_test,pred) +``` + +Линеарна регресија + +## Полиномијална регресија + +Још један тип линеарне регресије је полиномијална регресија. Иако понекад постоји линеарна веза између променљивих - што је већа запремина бундеве, то је већа цена - понекад те везе не могу бити приказане као раван или права линија. + +✅ Ево [неколико примера](https://online.stat.psu.edu/stat501/lesson/9/9.8) података који би могли користити полиномијалну регресију. + +Погледајте поново однос између датума и цене. Да ли овај распоред тачака изгледа као да би нужно требало да се анализира правом линијом? Зар цене не могу да варирају? У овом случају можете пробати полиномијалну регресију. + +✅ Полиноми су математички изрази који могу садржати једну или више променљивих и коефицијената. + +Полиномијална регресија ствара закривљену линију да би боље одговарала нелинеарним подацима. У нашем случају, ако укључимо квадратну променљиву `DayOfYear` у улазне податке, требало би да можемо да прилагодимо наше податке параболичном кривом, која ће имати минимум у одређеном тренутку у години. + +Scikit-learn укључује корисни [pipeline API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) за комбиновање различитих корака обраде података. **Pipeline** је ланац **процесора**. У нашем случају, направићемо pipeline који прво додаје полиномијалне карактеристике нашем моделу, а затим тренира регресију: + +```python +from sklearn.preprocessing import PolynomialFeatures +from sklearn.pipeline import make_pipeline + +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) + +pipeline.fit(X_train,y_train) +``` + +Коришћење `PolynomialFeatures(2)` значи да ћемо укључити све полиноме другог степена из улазних података. У нашем случају то ће значити само `DayOfYear`2, али ако имамо две улазне променљиве X и Y, то ће додати X2, XY и Y2. Можемо користити и полиноме вишег степена ако желимо. + +Pipeline се може користити на исти начин као оригинални објекат `LinearRegression`, тј. можемо `fit` pipeline, а затим користити `predict` за добијање резултата предвиђања. Ево графикона који приказује тест податке и криву апроксимације: + +Полиномијална регресија + +Коришћењем полиномијалне регресије можемо добити нешто нижи MSE и већи коефицијент детерминације, али не значајно. Морамо узети у обзир и друге карактеристике! + +> Можете видети да су минималне цене бундева примећене негде око Ноћи вештица. Како то можете објаснити? + +🎃 Честитамо, управо сте направили модел који може помоћи у предвиђању цене бундева за питу. Вероватно можете поновити исти поступак за све типове бундева, али то би било заморно. Сада ћемо научити како да узмемо у обзир сорту бундева у нашем моделу! + +## Категоријалне карактеристике + +У идеалном свету, желимо да будемо у могућности да предвиђамо цене за различите сорте бундева користећи исти модел. Међутим, колона `Variety` је нешто другачија од колона као што је `Month`, јер садржи ненумеричке вредности. Такве колоне се називају **категоријалне**. + +[![ML за почетнике - Предвиђање категоријалних карактеристика са линеарном регресијом](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML за почетнике - Предвиђање категоријалних карактеристика са линеарном регресијом") + +> 🎥 Кликните на слику изнад за кратак видео преглед коришћења категоријалних карактеристика. + +Овде можете видети како просечна цена зависи од сорте: + +Просечна цена по сорти + +Да бисмо узели сорту у обзир, прво је морамо претворити у нумерички облик, или **кодирати**. Постоји неколико начина на који то можемо урадити: + +* Једноставно **нумеричко кодирање** ће направити табелу различитих сорти, а затим заменити име сорте индексом у тој табели. Ово није најбоља идеја за линеарну регресију, јер линеарна регресија узима стварну нумеричку вредност индекса и додаје је резултату, множећи је неким коефицијентом. У нашем случају, однос између броја индекса и цене је очигледно нелинеаран, чак и ако се побринемо да индекси буду поређани на одређени начин. +* **One-hot кодирање** ће заменити колону `Variety` са 4 различите колоне, једну за сваку сорту. Свака колона ће садржати `1` ако одговарајући ред припада датој сорти, и `0` у супротном. То значи да ће постојати четири коефицијента у линеарној регресији, један за сваку сорту бундева, одговоран за "почетну цену" (или боље речено "додатну цену") за ту конкретну сорту. + +Код испод показује како можемо one-hot кодирати сорту: + +```python +pd.get_dummies(new_pumpkins['Variety']) +``` + + ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE +----|-----------|-----------|--------------------------|---------- +70 | 0 | 0 | 0 | 1 +71 | 0 | 0 | 0 | 1 +... | ... | ... | ... | ... +1738 | 0 | 1 | 0 | 0 +1739 | 0 | 1 | 0 | 0 +1740 | 0 | 1 | 0 | 0 +1741 | 0 | 1 | 0 | 0 +1742 | 0 | 1 | 0 | 0 + +Да бисмо тренирали линеарну регресију користећи one-hot кодиране сорте као улаз, само треба да правилно иницијализујемо `X` и `y` податке: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) +y = new_pumpkins['Price'] +``` + +Остатак кода је исти као што смо користили горе за тренирање линеарне регресије. Ако пробате, видећете да је средња квадратна грешка отприлике иста, али добијамо много већи коефицијент детерминације (~77%). Да бисмо добили још прецизнија предвиђања, можемо узети у обзир више категоријалних карактеристика, као и нумеричке карактеристике, као што су `Month` или `DayOfYear`. Да бисмо добили један велики низ карактеристика, можемо користити `join`: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] +``` + +Овде узимамо у обзир и `City` и тип `Package`, што нам даје MSE 2.84 (10%) и детерминацију 0.94! + +## Све на једном месту + +Да бисмо направили најбољи модел, можемо користити комбиноване (one-hot кодиране категоријалне + нумеричке) податке из горњег примера заједно са полиномијалном регресијом. Ево комплетног кода за вашу удобност: + +```python +# set up training data +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] + +# make train-test split +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + +# setup and train the pipeline +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) +pipeline.fit(X_train,y_train) + +# predict results for test data +pred = pipeline.predict(X_test) + +# calculate MSE and determination +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') + +score = pipeline.score(X_train,y_train) +print('Model determination: ', score) +``` + +Ово би требало да нам да најбољи коефицијент детерминације од скоро 97% и MSE=2.23 (~8% грешке у предвиђању). + +| Модел | MSE | Детерминација | +|-------|-----|---------------| +| `DayOfYear` Линеарни | 2.77 (17.2%) | 0.07 | +| `DayOfYear` Полиномијални | 2.73 (17.0%) | 0.08 | +| `Variety` Линеарни | 5.24 (19.7%) | 0.77 | +| Све карактеристике Линеарни | 2.84 (10.5%) | 0.94 | +| Све карактеристике Полиномијални | 2.23 (8.25%) | 0.97 | + +🏆 Браво! Направили сте четири модела регресије у једном часу и побољшали квалитет модела до 97%. У последњем делу о регресији, научићете о логистичкој регресији за одређивање категорија. + +--- + +## 🚀Изазов + +Тестирајте неколико различитих променљивих у овом нотебооку да видите како корелација одговара тачности модела. + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +У овом часу смо научили о линеарној регресији. Постоје и други важни типови регресије. Прочитајте о техникама Stepwise, Ridge, Lasso и Elasticnet. Добар курс за даље учење је [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning). + +## Задатак + +[Направите модел](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/3-Linear/assignment.md b/translations/sr/2-Regression/3-Linear/assignment.md new file mode 100644 index 00000000..0b8ed8bf --- /dev/null +++ b/translations/sr/2-Regression/3-Linear/assignment.md @@ -0,0 +1,25 @@ + +# Креирајте регресиони модел + +## Упутства + +У овој лекцији сте научили како да изградите модел користећи Линеарну и Полиномијалну регресију. Користећи то знање, пронађите скуп података или искористите један од уграђених скупова из Scikit-learn-а како бисте изградили нови модел. Објасните у свесци зашто сте изабрали одређену технику и покажите тачност вашег модела. Ако модел није тачан, објасните зашто. + +## Рубрика + +| Критеријум | Изузетно | Задовољавајуће | Потребно побољшање | +| ---------- | ---------------------------------------------------------- | -------------------------- | ------------------------------ | +| | представља комплетну свеску са добро документованим решењем | решење је непотпуно | решење је неисправно или са грешкама | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/3-Linear/solution/Julia/README.md b/translations/sr/2-Regression/3-Linear/solution/Julia/README.md new file mode 100644 index 00000000..3aa21a12 --- /dev/null +++ b/translations/sr/2-Regression/3-Linear/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/4-Logistic/README.md b/translations/sr/2-Regression/4-Logistic/README.md new file mode 100644 index 00000000..cb72da6f --- /dev/null +++ b/translations/sr/2-Regression/4-Logistic/README.md @@ -0,0 +1,401 @@ + +# Логистичка регресија за предвиђање категорија + +![Инфографика логистичке и линеарне регресије](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png) + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ова лекција је доступна и на R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html) + +## Увод + +У овој последњој лекцији о регресији, једној од основних _класичних_ техника машинског учења, погледаћемо логистичку регресију. Ову технику бисте користили за откривање образаца ради предвиђања бинарних категорија. Да ли је овај слаткиш чоколада или не? Да ли је ова болест заразна или не? Да ли ће овај купац изабрати овај производ или не? + +У овој лекцији ћете научити: + +- Нову библиотеку за визуализацију података +- Технике за логистичку регресију + +✅ Продубите своје разумевање рада са овом врстом регресије у овом [модулу за учење](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott) + +## Предуслов + +Радећи са подацима о бундевама, сада смо довољно упознати са њима да схватимо да постоји једна бинарна категорија са којом можемо радити: `Боја`. + +Хајде да направимо модел логистичке регресије да предвидимо, на основу неких варијабли, _која боја је вероватно дата бундева_ (наранџаста 🎃 или бела 👻). + +> Зашто говоримо о бинарној класификацији у лекцији о регресији? Само ради језичке погодности, јер је логистичка регресија [заправо метода класификације](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), иако заснована на линеарности. Сазнајте више о другим начинима класификације података у следећој групи лекција. + +## Дефинисање питања + +За наше потребе, изразићемо ово као бинарно: 'Бела' или 'Није бела'. У нашем скупу података постоји и категорија 'пругаста', али има мало примера, па је нећемо користити. Ионако нестаје када уклонимо вредности null из скупа података. + +> 🎃 Забавна чињеница: беле бундеве понекад називамо 'духовима'. Нису баш лаке за резбарење, па нису толико популарне као наранџасте, али изгледају занимљиво! Тако да бисмо могли да формулишемо наше питање као: 'Дух' или 'Није дух'. 👻 + +## О логистичкој регресији + +Логистичка регресија се разликује од линеарне регресије, коју сте раније научили, у неколико важних аспеката. + +[![Машинско учење за почетнике - Разумевање логистичке регресије за класификацију](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "Машинско учење за почетнике - Разумевање логистичке регресије за класификацију") + +> 🎥 Кликните на слику изнад за кратак видео преглед логистичке регресије. + +### Бинарна класификација + +Логистичка регресија не нуди исте могућности као линеарна регресија. Прва нуди предвиђање бинарне категорије ("бела или није бела"), док друга може да предвиди континуалне вредности, на пример, на основу порекла бундеве и времена жетве, _колико ће њена цена порасти_. + +![Модел класификације бундеве](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png) +> Инфографика од [Dasani Madipalli](https://twitter.com/dasani_decoded) + +### Друге класификације + +Постоје и друге врсте логистичке регресије, укључујући мултиномијалну и ординалну: + +- **Мултиномијална**, која укључује више од једне категорије - "Наранџаста, Бела и Пругаста". +- **Ординална**, која укључује уређене категорије, корисна ако желимо да логички поређамо наше исходе, као што су бундеве које су поређане по ограниченом броју величина (мини, мала, средња, велика, XL, XXL). + +![Мултиномијална vs ординална регресија](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png) + +### Варијабле НЕ морају бити корелисане + +Сећате се како је линеарна регресија боље функционисала са више корелисаних варијабли? Логистичка регресија је супротна - варијабле не морају бити усклађене. То одговара овим подацима који имају релативно слабе корелације. + +### Потребно је много чистих података + +Логистичка регресија ће дати прецизније резултате ако користите више података; наш мали скуп података није оптималан за овај задатак, па то имајте на уму. + +[![Машинско учење за почетнике - Анализа и припрема података за логистичку регресију](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "Машинско учење за почетнике - Анализа и припрема података за логистичку регресију") + +✅ Размислите о врстама података које би се добро уклопиле у логистичку регресију. + +## Вежба - уредите податке + +Прво, мало очистите податке, уклањајући null вредности и бирајући само неке од колона: + +1. Додајте следећи код: + + ```python + + columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] + pumpkins = full_pumpkins.loc[:, columns_to_select] + + pumpkins.dropna(inplace=True) + ``` + + Увек можете погледати свој нови dataframe: + + ```python + pumpkins.info + ``` + +### Визуализација - категоријални графикон + +До сада сте учитали [почетни нотебук](../../../../2-Regression/4-Logistic/notebook.ipynb) са подацима о бундевама и очистили га тако да задржите скуп података који садржи неколико варијабли, укључујући `Боја`. Хајде да визуализујемо dataframe у нотебуку користећи другу библиотеку: [Seaborn](https://seaborn.pydata.org/index.html), која је изграђена на Matplotlib коју смо раније користили. + +Seaborn нуди неке занимљиве начине за визуализацију ваших података. На пример, можете упоредити дистрибуције података за сваку `Сорта` и `Боја` у категоријалном графикону. + +1. Направите такав графикон користећи функцију `catplot`, користећи наше податке о бундевама `pumpkins`, и специфицирајући мапирање боја за сваку категорију бундеве (наранџаста или бела): + + ```python + import seaborn as sns + + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + + sns.catplot( + data=pumpkins, y="Variety", hue="Color", kind="count", + palette=palette, + ) + ``` + + ![Мрежа визуализованих података](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png) + + Посматрајући податке, можете видети како се подаци о боји односе на сорту. + + ✅ На основу овог категоријалног графикона, које занимљиве анализе можете замислити? + +### Претпроцесирање података: кодирање карактеристика и ознака +Наш скуп података о бундевама садржи стринг вредности за све своје колоне. Рад са категоријалним подацима је интуитиван за људе, али не и за машине. Алгоритми машинског учења добро функционишу са бројевима. Зато је кодирање веома важан корак у фази претпроцесирања података, јер нам омогућава да категоријалне податке претворимо у нумеричке податке, без губитка информација. Добро кодирање води ка изградњи доброг модела. + +За кодирање карактеристика постоје две главне врсте кодера: + +1. Ординални кодер: добро одговара ординалним варијаблама, које су категоријалне варијабле где њихови подаци следе логички редослед, као што је колона `Величина артикла` у нашем скупу података. Он ствара мапирање тако да је свака категорија представљена бројем, који је редослед категорије у колони. + + ```python + from sklearn.preprocessing import OrdinalEncoder + + item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']] + ordinal_features = ['Item Size'] + ordinal_encoder = OrdinalEncoder(categories=item_size_categories) + ``` + +2. Категоријални кодер: добро одговара номиналним варијаблама, које су категоријалне варијабле где њихови подаци не следе логички редослед, као што су све карактеристике различите од `Величина артикла` у нашем скупу података. То је једно-хот кодирање, што значи да је свака категорија представљена бинарном колоном: кодирана варијабла је једнака 1 ако бундева припада тој сорти, а 0 у супротном. + + ```python + from sklearn.preprocessing import OneHotEncoder + + categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] + categorical_encoder = OneHotEncoder(sparse_output=False) + ``` +Затим, `ColumnTransformer` се користи за комбиновање више кодера у један корак и њихово примену на одговарајуће колоне. + +```python + from sklearn.compose import ColumnTransformer + + ct = ColumnTransformer(transformers=[ + ('ord', ordinal_encoder, ordinal_features), + ('cat', categorical_encoder, categorical_features) + ]) + + ct.set_output(transform='pandas') + encoded_features = ct.fit_transform(pumpkins) +``` +С друге стране, за кодирање ознаке користимо scikit-learn класу `LabelEncoder`, која је помоћна класа за нормализацију ознака тако да садрже само вредности између 0 и n_classes-1 (овде, 0 и 1). + +```python + from sklearn.preprocessing import LabelEncoder + + label_encoder = LabelEncoder() + encoded_label = label_encoder.fit_transform(pumpkins['Color']) +``` +Када кодиране карактеристике и ознаке, можемо их спојити у нови dataframe `encoded_pumpkins`. + +```python + encoded_pumpkins = encoded_features.assign(Color=encoded_label) +``` +✅ Које су предности коришћења ординалног кодера за колону `Величина артикла`? + +### Анализа односа између варијабли + +Сада када смо претпроцесирали наше податке, можемо анализирати односе између карактеристика и ознаке како бисмо стекли идеју о томе колико ће модел бити способан да предвиди ознаку на основу карактеристика. +Најбољи начин за извођење ове врсте анализе је графичко приказивање података. Поново ћемо користити Seaborn функцију `catplot`, да визуализујемо односе између `Величина артикла`, `Сорта` и `Боја` у категоријалном графикону. За боље приказивање података користићемо кодиране колоне `Величина артикла` и некодиране колоне `Сорта`. + +```python + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size'] + + g = sns.catplot( + data=pumpkins, + x="Item Size", y="Color", row='Variety', + kind="box", orient="h", + sharex=False, margin_titles=True, + height=1.8, aspect=4, palette=palette, + ) + g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6)) + g.set_titles(row_template="{row_name}") +``` +![Категоријални графикон визуализованих података](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png) + +### Користите swarm графикон + +Пошто је `Боја` бинарна категорија (Бела или Није), потребан је '[специјализован приступ](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) за визуализацију'. Постоје и други начини за визуализацију односа ове категорије са другим варијаблама. + +Можете визуализовати варијабле једну поред друге помоћу Seaborn графикона. + +1. Пробајте 'swarm' графикон да покажете дистрибуцију вредности: + + ```python + palette = { + 0: 'orange', + 1: 'wheat' + } + sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette) + ``` + + ![Swarm графикон визуализованих података](../../../../2-Regression/4-Logistic/images/swarm_2.png) + +**Пазите**: горњи код може генерисати упозорење, пошто Seaborn не успева да представи толики број тачака у swarm графикону. Могуће решење је смањење величине маркера, коришћењем параметра 'size'. Међутим, будите свесни да то утиче на читљивост графикона. + +> **🧮 Покажите ми математику** +> +> Логистичка регресија се ослања на концепт 'максималне вероватноће' користећи [сигмоидне функције](https://wikipedia.org/wiki/Sigmoid_function). 'Сигмоидна функција' на графикону изгледа као облик слова 'S'. Она узима вредност и мапира је негде између 0 и 1. Њена крива се такође назива 'логистичка крива'. Њена формула изгледа овако: +> +> ![логистичка функција](../../../../2-Regression/4-Logistic/images/sigmoid.png) +> +> где се средишња тачка сигмоида налази на x-овој 0 тачки, L је максимална вредност криве, а k је стрмина криве. Ако је исход функције већи од 0.5, ознака у питању ће бити додељена класи '1' бинарног избора. Ако није, биће класификована као '0'. + +## Направите свој модел + +Изградња модела за проналажење ових бинарних класификација је изненађујуће једноставна у Scikit-learn. + +[![Машинско учење за почетнике - Логистичка регресија за класификацију података](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "Машинско учење за почетнике - Логистичка регресија за класификацију података") + +> 🎥 Кликните на слику изнад за кратак видео преглед изградње модела линеарне регресије. + +1. Изаберите варијабле које желите да користите у свом моделу класификације и поделите скуп за тренинг и тестирање позивајући `train_test_split()`: + + ```python + from sklearn.model_selection import train_test_split + + X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])] + y = encoded_pumpkins['Color'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + + ``` + +2. Сада можете обучити свој модел, позивајући `fit()` са својим тренинг подацима, и исписати његов резултат: + + ```python + from sklearn.metrics import f1_score, classification_report + from sklearn.linear_model import LogisticRegression + + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('F1-score: ', f1_score(y_test, predictions)) + ``` + + Погледајте резултате свог модела. Није лоше, с обзиром на то да имате само око 1000 редова података: + + ```output + precision recall f1-score support + + 0 0.94 0.98 0.96 166 + 1 0.85 0.67 0.75 33 + + accuracy 0.92 199 + macro avg 0.89 0.82 0.85 199 + weighted avg 0.92 0.92 0.92 199 + + Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 0 0 0 1 0 0 0 0 0 0 0 0 1 1] + F1-score: 0.7457627118644068 + ``` + +## Боље разумевање кроз матрицу конфузије + +Иако можете добити извештај о резултатима [термини](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) исписивањем горе наведених ставки, можда ћете моћи боље да разумете свој модел користећи [матрицу конфузије](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) која нам помаже да разумемо како модел функционише. + +> 🎓 '[Матрица конфузије](https://wikipedia.org/wiki/Confusion_matrix)' (или 'матрица грешке') је табела која изражава стварне и лажне позитивне и негативне резултате вашег модела, чиме се процењује тачност предвиђања. + +1. Да бисте користили матрицу конфузије, позовите `confusion_matrix()`: + + ```python + from sklearn.metrics import confusion_matrix + confusion_matrix(y_test, predictions) + ``` + + Погледајте матрицу конфузије вашег модела: + + ```output + array([[162, 4], + [ 11, 22]]) + ``` + +У Scikit-learn, редови (осовина 0) су стварне ознаке, а колоне (осовина 1) су предвиђене ознаке. + +| | 0 | 1 | +| :---: | :---: | :---: | +| 0 | TN | FP | +| 1 | FN | TP | + +Шта се овде дешава? Рецимо да се од нашег модела тражи да класификује бундеве између две бинарне категорије, категорије 'бела' и категорије 'није бела'. + +- Ако ваш модел предвиди да је бундева није бела, а она заиста припада категорији 'није бела', то називамо истинским негативним резултатом, приказаним горњим левим +Како се матрица конфузије односи на прецизност и одзив? Запамтите, извештај о класификацији приказан изнад показао је прецизност (0.85) и одзив (0.67). + +Прецизност = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461 + +Одзив = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666 + +✅ П: Према матрици конфузије, како је модел прошао? О: Није лоше; постоји добар број истинских негативних, али и неколико лажних негативних. + +Хајде да поново погледамо термине које смо раније видели уз помоћ мапирања TP/TN и FP/FN у матрици конфузије: + +🎓 Прецизност: TP/(TP + FP) Удео релевантних примера међу пронађеним примерима (нпр. који су ознаке добро означене) + +🎓 Одзив: TP/(TP + FN) Удео релевантних примера који су пронађени, било добро означени или не + +🎓 f1-скор: (2 * прецизност * одзив)/(прецизност + одзив) Тежински просек прецизности и одзива, где је најбољи 1, а најгори 0 + +🎓 Подршка: Број појављивања сваке ознаке која је пронађена + +🎓 Тачност: (TP + TN)/(TP + TN + FP + FN) Проценат ознака које су тачно предвиђене за узорак. + +🎓 Макро просек: Израчунавање неутежаног просека метрика за сваку ознаку, без узимања у обзир неравнотеже ознака. + +🎓 Тежински просек: Израчунавање просека метрика за сваку ознаку, узимајући у обзир неравнотежу ознака тако што их тежински прилагођава њиховој подршци (броју истинских примера за сваку ознаку). + +✅ Можете ли замислити коју метрику треба пратити ако желите да ваш модел смањи број лажних негативних? + +## Визуализација ROC криве овог модела + +[![ML за почетнике - Анализа перформанси логистичке регресије уз ROC криве](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML за почетнике - Анализа перформанси логистичке регресије уз ROC криве") + + +> 🎥 Кликните на слику изнад за кратак видео преглед ROC криве + +Хајде да направимо још једну визуализацију да видимо такозвану 'ROC' криву: + +```python +from sklearn.metrics import roc_curve, roc_auc_score +import matplotlib +import matplotlib.pyplot as plt +%matplotlib inline + +y_scores = model.predict_proba(X_test) +fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1]) + +fig = plt.figure(figsize=(6, 6)) +plt.plot([0, 1], [0, 1], 'k--') +plt.plot(fpr, tpr) +plt.xlabel('False Positive Rate') +plt.ylabel('True Positive Rate') +plt.title('ROC Curve') +plt.show() +``` + +Користећи Matplotlib, нацртајте [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) или ROC модела. ROC криве се често користе за добијање прегледа излазних резултата класификатора у смислу истинских и лажних позитивних. "ROC криве обично приказују стопу истинских позитивних на Y оси, а стопу лажних позитивних на X оси." Дакле, стрмина криве и простор између средишње линије и криве су важни: желите криву која брзо иде горе и преко линије. У нашем случају, постоје лажни позитивни на почетку, а затим линија правилно иде горе и преко: + +![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png) + +На крају, користите Scikit-learn [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) да израчунате стварну 'Површину испод криве' (AUC): + +```python +auc = roc_auc_score(y_test,y_scores[:,1]) +print(auc) +``` +Резултат је `0.9749908725812341`. С обзиром да AUC варира од 0 до 1, желите велики резултат, јер модел који је 100% тачан у својим предвиђањима имаће AUC од 1; у овом случају, модел је _прилично добар_. + +У будућим лекцијама о класификацијама, научићете како да итеративно побољшате резултате вашег модела. Али за сада, честитамо! Завршили сте ове лекције о регресији! + +--- +## 🚀Изазов + +Постоји много више за истраживање у вези са логистичком регресијом! Али најбољи начин за учење је експериментисање. Пронађите скуп података који се добро уклапа у ову врсту анализе и направите модел са њим. Шта сте научили? савет: пробајте [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) за занимљиве скупове података. + +## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Прочитајте првих неколико страница [овог рада са Станфорда](https://web.stanford.edu/~jurafsky/slp3/5.pdf) о неким практичним применама логистичке регресије. Размислите о задацима који су боље прилагођени једној или другој врсти регресије коју смо до сада проучавали. Шта би најбоље функционисало? + +## Задатак + +[Поновно испробавање ове регресије](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/4-Logistic/assignment.md b/translations/sr/2-Regression/4-Logistic/assignment.md new file mode 100644 index 00000000..a12a449d --- /dev/null +++ b/translations/sr/2-Regression/4-Logistic/assignment.md @@ -0,0 +1,25 @@ + +# Поновно тестирање регресије + +## Упутства + +У лекцији сте користили подскуп података о бундевама. Сада се вратите на оригиналне податке и покушајте да искористите све, очишћене и стандардизоване, како бисте изградили модел логистичке регресије. + +## Рубрика + +| Критеријум | Изузетно | Прихватљиво | Потребно побољшање | +| ---------- | ---------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- | +| | Представљен је нотебук са добро објашњеним и добро функционишућим моделом | Представљен је нотебук са моделом који минимално функционише | Представљен је нотебук са моделом који слабо функционише или га нема | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/4-Logistic/solution/Julia/README.md b/translations/sr/2-Regression/4-Logistic/solution/Julia/README.md new file mode 100644 index 00000000..33bedeaf --- /dev/null +++ b/translations/sr/2-Regression/4-Logistic/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/2-Regression/README.md b/translations/sr/2-Regression/README.md new file mode 100644 index 00000000..2e3b5636 --- /dev/null +++ b/translations/sr/2-Regression/README.md @@ -0,0 +1,54 @@ + +# Регресиони модели за машинско учење +## Регионална тема: Регресиони модели за цене бундева у Северној Америци 🎃 + +У Северној Америци, бундеве се често резбаре у застрашујуће ликове за Ноћ вештица. Хајде да сазнамо више о овим фасцинантним поврћем! + +![jack-o-lanterns](../../../2-Regression/images/jack-o-lanterns.jpg) +> Фотографија: Beth Teutschmann на Unsplash + +## Шта ћете научити + +[![Увод у регресију](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "Видео увод у регресију - Кликните за гледање!") +> 🎥 Кликните на слику изнад за брзи уводни видео у ову лекцију + +Лекције у овом одељку обрађују типове регресије у контексту машинског учења. Регресиони модели могу помоћи у одређивању _односа_ између променљивих. Овај тип модела може предвидети вредности као што су дужина, температура или старост, откривајући тако односе између променљивих док анализира податке. + +У овом низу лекција, открићете разлике између линеарне и логистичке регресије, као и када је боље користити једну уместо друге. + +[![Машинско учење за почетнике - Увод у регресионе моделе за машинско учење](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "Машинско учење за почетнике - Увод у регресионе моделе за машинско учење") + +> 🎥 Кликните на слику изнад за кратак видео који уводи у регресионе моделе. + +У овом сету лекција, припремићете се за почетак задатака машинског учења, укључујући конфигурисање Visual Studio Code-а за управљање бележницама, уобичајеним окружењем за научнике података. Открићете Scikit-learn, библиотеку за машинско учење, и изградићете своје прве моделе, са фокусом на регресионе моделе у овом поглављу. + +> Постоје корисни алати са мало кода који вам могу помоћи да научите како да радите са регресионим моделима. Пробајте [Azure ML за овај задатак](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +### Лекције + +1. [Алатке заната](1-Tools/README.md) +2. [Управљање подацима](2-Data/README.md) +3. [Линеарна и полиномијална регресија](3-Linear/README.md) +4. [Логистичка регресија](4-Logistic/README.md) + +--- +### Захвалнице + +"Машинско учење са регресијом" написано је са ♥️ од стране [Jen Looper](https://twitter.com/jenlooper) + +♥️ Доприноси за квизове укључују: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) и [Ornella Altunyan](https://twitter.com/ornelladotcom) + +Скуп података о бундевама предложен је од стране [овог пројекта на Kaggle-у](https://www.kaggle.com/usda/a-year-of-pumpkin-prices), а његови подаци су преузети из [Извештаја о стандардима терминалних тржишта за специјалне усеве](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) које дистрибуира Министарство пољопривреде Сједињених Држава. Додали смо неке тачке око боје на основу сорте како бисмо нормализовали дистрибуцију. Ови подаци су у јавном домену. + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/3-Web-App/1-Web-App/README.md b/translations/sr/3-Web-App/1-Web-App/README.md new file mode 100644 index 00000000..a8650c80 --- /dev/null +++ b/translations/sr/3-Web-App/1-Web-App/README.md @@ -0,0 +1,359 @@ + +# Изградња веб апликације за коришћење ML модела + +У овој лекцији, обучићете ML модел на скупу података који је ван овог света: _УФО виђења у последњем веку_, преузетих из базе података NUFORC-а. + +Научићете: + +- Како да „пиклујете“ обучени модел +- Како да користите тај модел у Flask апликацији + +Наставићемо да користимо бележнице за чишћење података и обуку модела, али можете отићи корак даље и истражити како да користите модел „у природи“, односно у веб апликацији. + +Да бисте то урадили, потребно је да изградите веб апликацију користећи Flask. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Изградња апликације + +Постоји неколико начина за изградњу веб апликација које користе моделе машинског учења. Ваша веб архитектура може утицати на начин на који је модел обучен. Замислите да радите у компанији где је тим за науку о подацима обучио модел који желе да користите у апликацији. + +### Разматрања + +Постоји много питања која треба поставити: + +- **Да ли је то веб апликација или мобилна апликација?** Ако градите мобилну апликацију или треба да користите модел у IoT контексту, можете користити [TensorFlow Lite](https://www.tensorflow.org/lite/) и применити модел у Android или iOS апликацији. +- **Где ће модел бити смештен?** У облаку или локално? +- **Подршка за рад ван мреже.** Да ли апликација мора да ради ван мреже? +- **Која технологија је коришћена за обуку модела?** Одабрана технологија може утицати на алате које треба користити. + - **Коришћење TensorFlow-а.** Ако обучавате модел користећи TensorFlow, на пример, тај екосистем омогућава конвертовање TensorFlow модела за употребу у веб апликацији помоћу [TensorFlow.js](https://www.tensorflow.org/js/). + - **Коришћење PyTorch-а.** Ако градите модел користећи библиотеку као што је [PyTorch](https://pytorch.org/), имате могућност да га извезете у [ONNX](https://onnx.ai/) (Open Neural Network Exchange) формат за употребу у JavaScript веб апликацијама које могу користити [Onnx Runtime](https://www.onnxruntime.ai/). Ова опција ће бити истражена у будућој лекцији за модел обучен помоћу Scikit-learn-а. + - **Коришћење Lobe.ai или Azure Custom Vision.** Ако користите ML SaaS (Software as a Service) систем као што су [Lobe.ai](https://lobe.ai/) или [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) за обуку модела, ова врста софтвера пружа начине за извоз модела за многе платформе, укључујући изградњу прилагођеног API-ја који се може упитати у облаку од стране ваше онлајн апликације. + +Такође имате могућност да изградите целу Flask веб апликацију која би могла да обучава модел директно у веб прегледачу. Ово се такође може урадити користећи TensorFlow.js у JavaScript контексту. + +За наше потребе, пошто смо радили са бележницама заснованим на Python-у, хајде да истражимо кораке које треба предузети да бисмо извезли обучени модел из такве бележнице у формат који је читљив за Python веб апликацију. + +## Алат + +За овај задатак потребна су вам два алата: Flask и Pickle, оба која раде на Python-у. + +✅ Шта је [Flask](https://palletsprojects.com/p/flask/)? Flask је дефинисан као „микро-оквир“ од стране својих креатора и пружа основне функције веб оквира користећи Python и механизам за шаблонирање за изградњу веб страница. Погледајте [овај модул за учење](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) да бисте вежбали изградњу са Flask-ом. + +✅ Шта је [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 је Python модул који серијализује и десеријализује структуру Python објеката. Када „пиклујете“ модел, серијализујете или спљоштите његову структуру за употребу на вебу. Будите опрезни: Pickle није инхерентно безбедан, па будите пажљиви ако вам се предложи да „распакујете“ датотеку. Pickle датотека има наставак `.pkl`. + +## Вежба - очистите своје податке + +У овој лекцији користићете податке из 80.000 УФО виђења, прикупљених од стране [NUFORC](https://nuforc.org) (Национални центар за пријаву УФО-а). Ови подаци садрже занимљиве описе УФО виђења, на пример: + +- **Дуг опис примера.** „Човек излази из зрака светлости који обасјава травнато поље ноћу и трчи према паркингу Texas Instruments-а“. +- **Кратак опис примера.** „Светла су нас јурила“. + +[ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) табела укључује колоне о `граду`, `држави` и `земљи` где се виђење догодило, облику објекта (`shape`) и његовој `географској ширини` и `дужини`. + +У празној [бележници](../../../../3-Web-App/1-Web-App/notebook.ipynb) која је укључена у ову лекцију: + +1. Увезите `pandas`, `matplotlib` и `numpy` као што сте радили у претходним лекцијама и увезите табелу са УФО подацима. Можете погледати пример скупа података: + + ```python + import pandas as pd + import numpy as np + + ufos = pd.read_csv('./data/ufos.csv') + ufos.head() + ``` + +1. Претворите УФО податке у мањи dataframe са новим насловима. Проверите јединствене вредности у пољу `Country`. + + ```python + ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) + + ufos.Country.unique() + ``` + +1. Сада можете смањити количину података са којима треба да радимо тако што ћете избацити све вредности које недостају и увезти само виђења у трајању од 1-60 секунди: + + ```python + ufos.dropna(inplace=True) + + ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] + + ufos.info() + ``` + +1. Увезите библиотеку `LabelEncoder` из Scikit-learn-а да бисте текстуалне вредности за земље претворили у бројеве: + + ✅ LabelEncoder кодира податке азбучним редом + + ```python + from sklearn.preprocessing import LabelEncoder + + ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) + + ufos.head() + ``` + + Ваши подаци би требало да изгледају овако: + + ```output + Seconds Country Latitude Longitude + 2 20.0 3 53.200000 -2.916667 + 3 20.0 4 28.978333 -96.645833 + 14 30.0 4 35.823889 -80.253611 + 23 60.0 4 45.582778 -122.352222 + 24 3.0 3 51.783333 -0.783333 + ``` + +## Вежба - изградите свој модел + +Сада можете припремити податке за обуку модела тако што ћете их поделити у групе за обуку и тестирање. + +1. Изаберите три карактеристике које желите да користите за обуку као свој X вектор, док ће y вектор бити `Country`. Желите да унесете `Seconds`, `Latitude` и `Longitude` и добијете ID земље као резултат. + + ```python + from sklearn.model_selection import train_test_split + + Selected_features = ['Seconds','Latitude','Longitude'] + + X = ufos[Selected_features] + y = ufos['Country'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + ``` + +1. Обучите свој модел користећи логистичку регресију: + + ```python + from sklearn.metrics import accuracy_score, classification_report + from sklearn.linear_model import LogisticRegression + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('Accuracy: ', accuracy_score(y_test, predictions)) + ``` + +Тачност није лоша **(око 95%)**, што није изненађујуће, јер `Country` и `Latitude/Longitude` корелирају. + +Модел који сте креирали није баш револуционаран, јер би требало да можете да закључите `Country` из његове `Latitude` и `Longitude`, али је добра вежба покушати обучити модел од сирових података које сте очистили, извезли и затим користили у веб апликацији. + +## Вежба - „пиклујте“ свој модел + +Сада је време да _пиклујете_ свој модел! То можете урадити у неколико линија кода. Када је модел _пиклован_, учитајте га и тестирајте на пример подацима који садрже вредности за секунде, географску ширину и дужину. + +```python +import pickle +model_filename = 'ufo-model.pkl' +pickle.dump(model, open(model_filename,'wb')) + +model = pickle.load(open('ufo-model.pkl','rb')) +print(model.predict([[50,44,-12]])) +``` + +Модел враћа **'3'**, што је код земље за Велику Британију. Невероватно! 👽 + +## Вежба - изградите Flask апликацију + +Сада можете изградити Flask апликацију која ће позивати ваш модел и враћати сличне резултате, али на визуелно привлачнији начин. + +1. Почните тако што ћете креирати фасциклу под називом **web-app** поред датотеке _notebook.ipynb_ где се налази ваша _ufo-model.pkl_ датотека. + +1. У тој фасцикли креирајте још три фасцикле: **static**, са фасциклом **css** унутар ње, и **templates**. Сада би требало да имате следеће датотеке и директоријуме: + + ```output + web-app/ + static/ + css/ + templates/ + notebook.ipynb + ufo-model.pkl + ``` + + ✅ Погледајте решење у фасцикли за преглед готове апликације + +1. Прва датотека коју треба креирати у фасцикли _web-app_ је **requirements.txt**. Као _package.json_ у JavaScript апликацији, ова датотека наводи зависности које су потребне апликацији. У **requirements.txt** додајте линије: + + ```text + scikit-learn + pandas + numpy + flask + ``` + +1. Сада покрените ову датотеку тако што ћете отићи у фасциклу _web-app_: + + ```bash + cd web-app + ``` + +1. У вашем терминалу укуцајте `pip install`, да бисте инсталирали библиотеке наведене у _requirements.txt_: + + ```bash + pip install -r requirements.txt + ``` + +1. Сада сте спремни да креирате још три датотеке за завршетак апликације: + + 1. Креирајте **app.py** у корену. + 2. Креирајте **index.html** у фасцикли _templates_. + 3. Креирајте **styles.css** у фасцикли _static/css_. + +1. Направите _styles.css_ датотеку са неколико стилова: + + ```css + body { + width: 100%; + height: 100%; + font-family: 'Helvetica'; + background: black; + color: #fff; + text-align: center; + letter-spacing: 1.4px; + font-size: 30px; + } + + input { + min-width: 150px; + } + + .grid { + width: 300px; + border: 1px solid #2d2d2d; + display: grid; + justify-content: center; + margin: 20px auto; + } + + .box { + color: #fff; + background: #2d2d2d; + padding: 12px; + display: inline-block; + } + ``` + +1. Затим направите _index.html_ датотеку: + + ```html + + + + + 🛸 UFO Appearance Prediction! 👽 + + + + +
                                + +
                                + +

                                According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?

                                + +
                                + + + + +
                                + +

                                {{ prediction_text }}

                                + +
                                + +
                                + + + + ``` + + Погледајте шаблонирање у овој датотеци. Приметите „mustache“ синтаксу око променљивих које ће бити обезбеђене од стране апликације, као што је текст предвиђања: `{{}}`. Такође постоји форма која шаље предвиђање на руту `/predict`. + + Коначно, спремни сте да изградите Python датотеку која управља коришћењем модела и приказом предвиђања: + +1. У `app.py` додајте: + + ```python + import numpy as np + from flask import Flask, request, render_template + import pickle + + app = Flask(__name__) + + model = pickle.load(open("./ufo-model.pkl", "rb")) + + + @app.route("/") + def home(): + return render_template("index.html") + + + @app.route("/predict", methods=["POST"]) + def predict(): + + int_features = [int(x) for x in request.form.values()] + final_features = [np.array(int_features)] + prediction = model.predict(final_features) + + output = prediction[0] + + countries = ["Australia", "Canada", "Germany", "UK", "US"] + + return render_template( + "index.html", prediction_text="Likely country: {}".format(countries[output]) + ) + + + if __name__ == "__main__": + app.run(debug=True) + ``` + + > 💡 Савет: када додате [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) док покрећете веб апликацију користећи Flask, све промене које направите у вашој апликацији биће одмах видљиве без потребе за поновним покретањем сервера. Пазите! Немојте омогућити овај режим у продукцијској апликацији. + +Ако покренете `python app.py` или `python3 app.py` - ваш веб сервер ће се покренути локално, и можете попунити кратку форму да добијете одговор на ваше горуће питање о томе где су УФО-и виђени! + +Пре него што то урадите, погледајте делове `app.py`: + +1. Прво се учитавају зависности и апликација се покреће. +1. Затим се модел увози. +1. Затим се `index.html` рендерује на почетној рути. + +На рути `/predict`, дешава се неколико ствари када се форма пошаље: + +1. Променљиве из форме се прикупљају и претварају у numpy низ. Оне се затим шаљу моделу и враћа се предвиђање. +2. Земље које желимо да прикажемо се поново рендерују као читљив текст из њиховог предвиђеног кода земље, и та вредност се шаље назад у `index.html` да би се рендеровала у шаблону. + +Коришћење модела на овај начин, са Flask-ом и пиклованим моделом, је релативно једноставно. Најтежа ствар је разумети у ком облику подаци морају бити послати моделу да би се добило предвиђање. То све зависи од тога како је модел обучен. Овај модел захтева три тачке података за унос како би се добило предвиђање. + +У професионалном окружењу, можете видети колико је добра комуникација неопходна између људи који обучавају модел и оних који га користе у веб или мобилној апликацији. У нашем случају, то је само једна особа - ви! + +--- + +## 🚀 Изазов + +Уместо рада у бележници и увоза модела у Flask апликацију, могли бисте обучити модел директно у Flask апликацији! Покушајте да конвертујете свој Python код из бележнице, можда након што очистите податке, како бисте обучили модел директно у апликацији на рути под називом `train`. Које су предности и мане овог приступа? + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Постоји много начина за изградњу веб апликације која користи ML моделе. Направите списак начина на које бисте могли користити JavaScript или Python за изградњу веб апликације која користи машинско учење. Размотрите архитектуру: да ли модел треба да остане у апликацији или да буде у облаку? Ако је у облаку, како бисте му приступили? Нацртајте архитектонски модел за примену ML решења у веб апликацији. + +## Задатак + +[Испробајте другачији модел](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/3-Web-App/1-Web-App/assignment.md b/translations/sr/3-Web-App/1-Web-App/assignment.md new file mode 100644 index 00000000..21ba78ce --- /dev/null +++ b/translations/sr/3-Web-App/1-Web-App/assignment.md @@ -0,0 +1,25 @@ + +# Пробајте другачији модел + +## Упутства + +Сада када сте направили једну веб апликацију користећи обучени Регресиони модел, искористите један од модела из претходног часа о Регресији да поново направите ову веб апликацију. Можете задржати стил или га дизајнирати другачије како би одражавао податке о бундевама. Водите рачуна да промените уносе како би одговарали методи обуке вашег модела. + +## Рубрика + +| Критеријум | Изузетно | Довољно | Потребно побољшање | +| -------------------------- | ------------------------------------------------------ | ------------------------------------------------------- | ------------------------------------ | +| | Веб апликација ради како се очекује и постављена је у облак | Веб апликација садржи грешке или показује неочекиване резултате | Веб апликација не функционише исправно | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/3-Web-App/README.md b/translations/sr/3-Web-App/README.md new file mode 100644 index 00000000..fee9464c --- /dev/null +++ b/translations/sr/3-Web-App/README.md @@ -0,0 +1,35 @@ + +# Направите веб апликацију за коришћење вашег ML модела + +У овом делу курикулума, бићете упознати са применом машинског учења: како да сачувате ваш Scikit-learn модел као датотеку која може да се користи за предвиђања унутар веб апликације. Када модел буде сачуван, научићете како да га користите у веб апликацији направљеној у Flask-у. Прво ћете креирати модел користећи податке који се односе на виђења НЛО-а! Затим ћете направити веб апликацију која ће вам омогућити да унесете број секунди, као и вредности географске ширине и дужине, како бисте предвидели која земља је пријавила виђење НЛО-а. + +![Паркинг за НЛО](../../../3-Web-App/images/ufo.jpg) + +Фотографија од Мајкл Херен на Unsplash + +## Лекције + +1. [Направите веб апликацију](1-Web-App/README.md) + +## Кредити + +"Направите веб апликацију" је написано са ♥️ од стране [Џен Лупер](https://twitter.com/jenlooper). + +♥️ Квизове је написао Рохан Рај. + +Скуп података је преузет са [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings). + +Архитектура веб апликације је делимично предложена у [овом чланку](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) и [овом репозиторијуму](https://github.com/abhinavsagar/machine-learning-deployment) од Абхинав Сагара. + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да превод буде тачан, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/1-Introduction/README.md b/translations/sr/4-Classification/1-Introduction/README.md new file mode 100644 index 00000000..076d29fd --- /dev/null +++ b/translations/sr/4-Classification/1-Introduction/README.md @@ -0,0 +1,313 @@ + +# Увод у класификацију + +У овим четири лекције, истражићете основни аспект класичног машинског учења - _класификацију_. Проћи ћемо кроз употребу различитих алгоритама класификације са скупом података о свим сјајним кухињама Азије и Индије. Надамо се да сте гладни! + +![само мало!](../../../../4-Classification/1-Introduction/images/pinch.png) + +> Прославите паназијске кухиње у овим лекцијама! Слика: [Џен Лупер](https://twitter.com/jenlooper) + +Класификација је облик [надгледаног учења](https://wikipedia.org/wiki/Supervised_learning) који има много заједничког са техникама регресије. Ако је машинско учење усмерено на предвиђање вредности или имена ствари користећи скупове података, онда класификација генерално спада у две групе: _бинарна класификација_ и _вишекласна класификација_. + +[![Увод у класификацију](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Увод у класификацију") + +> 🎥 Кликните на слику изнад за видео: Џон Гуттаг са МИТ-а представља класификацију + +Запамтите: + +- **Линеарна регресија** вам је помогла да предвидите односе између променљивих и направите тачна предвиђања о томе где ће нова тачка података пасти у односу на ту линију. На пример, могли сте да предвидите _која ће цена бундеве бити у септембру у односу на децембар_. +- **Логистичка регресија** вам је помогла да откријете "бинарне категорије": на овом ценовном нивоу, _да ли је ова бундева наранџаста или није_? + +Класификација користи различите алгоритме за одређивање других начина за утврђивање етикете или класе тачке података. Радимо са овим подацима о кухињама да бисмо видели да ли, посматрајући групу састојака, можемо утврдити њихово порекло. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Ова лекција је доступна на R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html) + +### Увод + +Класификација је једна од основних активности истраживача машинског учења и научника за податке. Од основне класификације бинарне вредности ("да ли је овај имејл спам или није?"), до сложене класификације слика и сегментације користећи компјутерски вид, увек је корисно бити у могућности да сортирате податке у класе и постављате питања о њима. + +Научно речено, ваш метод класификације креира предиктивни модел који вам омогућава да мапирате однос између улазних променљивих и излазних променљивих. + +![бинарна vs. вишекласна класификација](../../../../4-Classification/1-Introduction/images/binary-multiclass.png) + +> Бинарни и вишекласни проблеми за алгоритме класификације. Инфографика: [Џен Лупер](https://twitter.com/jenlooper) + +Пре него што започнемо процес чишћења наших података, њихове визуализације и припреме за задатке машинског учења, научимо мало о различитим начинима на које машинско учење може бити коришћено за класификацију података. + +Изведена из [статистике](https://wikipedia.org/wiki/Statistical_classification), класификација користећи класично машинско учење користи карактеристике, као што су `пушач`, `тежина` и `године` да би утврдила _вероватноћу развоја X болести_. Као техника надгледаног учења слична вежбама регресије које сте раније радили, ваши подаци су означени, а алгоритми машинског учења користе те ознаке да класификују и предвиђају класе (или 'карактеристике') скупа података и додељују их групи или исходу. + +✅ Замислите скуп података о кухињама. Шта би модел вишекласне класификације могао да одговори? Шта би модел бинарне класификације могао да одговори? Шта ако желите да утврдите да ли је одређена кухиња вероватно користила пискавицу? Шта ако желите да видите да ли, уз поклон торбе пуне звезданог аниса, артичока, карфиола и рена, можете направити типично индијско јело? + +[![Луде мистериозне корпе](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Луде мистериозне корпе") + +> 🎥 Кликните на слику изнад за видео. Цела премиса емисије 'Chopped' је 'мистериозна корпа' где кувари морају да направе јело од насумичног избора састојака. Сигурно би модел машинског учења помогао! + +## Здраво 'класификаторе' + +Питање које желимо да поставимо о овом скупу података о кухињама је заправо **вишекласно питање**, јер имамо неколико потенцијалних националних кухиња са којима радимо. Узимајући групу састојака, којој од ових многих класа ће подаци припадати? + +Scikit-learn нуди неколико различитих алгоритама за класификацију података, у зависности од врсте проблема који желите да решите. У наредне две лекције, научићете о неколико ових алгоритама. + +## Вежба - очистите и избалансирајте своје податке + +Први задатак, пре него што започнете овај пројекат, је да очистите и **избалансирате** своје податке како бисте добили боље резултате. Почните са празним _notebook.ipynb_ фајлом у корену овог директоријума. + +Прва ствар коју треба инсталирати је [imblearn](https://imbalanced-learn.org/stable/). Ово је Scikit-learn пакет који ће вам омогућити боље балансирање података (о овом задатку ћете научити више за тренутак). + +1. Да бисте инсталирали `imblearn`, покрените `pip install`, овако: + + ```python + pip install imblearn + ``` + +1. Увезите пакете који су вам потребни за увоз ваших података и њихову визуализацију, такође увезите `SMOTE` из `imblearn`. + + ```python + import pandas as pd + import matplotlib.pyplot as plt + import matplotlib as mpl + import numpy as np + from imblearn.over_sampling import SMOTE + ``` + + Сада сте спремни да увезете податке. + +1. Следећи задатак је да увезете податке: + + ```python + df = pd.read_csv('../data/cuisines.csv') + ``` + + Коришћење `read_csv()` ће прочитати садржај csv фајла _cusines.csv_ и поставити га у променљиву `df`. + +1. Проверите облик података: + + ```python + df.head() + ``` + + Првих пет редова изгледа овако: + + ```output + | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | + | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | + | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + ``` + +1. Добијте информације о овим подацима позивајући `info()`: + + ```python + df.info() + ``` + + Ваш излаз изгледа овако: + + ```output + + RangeIndex: 2448 entries, 0 to 2447 + Columns: 385 entries, Unnamed: 0 to zucchini + dtypes: int64(384), object(1) + memory usage: 7.2+ MB + ``` + +## Вежба - учење о кухињама + +Сада рад постаје занимљивији. Хајде да откријемо расподелу података по кухињама. + +1. Прикажите податке као траке позивајући `barh()`: + + ```python + df.cuisine.value_counts().plot.barh() + ``` + + ![расподела података о кухињама](../../../../4-Classification/1-Introduction/images/cuisine-dist.png) + + Постоји ограничен број кухиња, али расподела података је неравномерна. Можете то поправити! Пре него што то урадите, истражите мало више. + +1. Сазнајте колико података је доступно по кухињи и испишите их: + + ```python + thai_df = df[(df.cuisine == "thai")] + japanese_df = df[(df.cuisine == "japanese")] + chinese_df = df[(df.cuisine == "chinese")] + indian_df = df[(df.cuisine == "indian")] + korean_df = df[(df.cuisine == "korean")] + + print(f'thai df: {thai_df.shape}') + print(f'japanese df: {japanese_df.shape}') + print(f'chinese df: {chinese_df.shape}') + print(f'indian df: {indian_df.shape}') + print(f'korean df: {korean_df.shape}') + ``` + + излаз изгледа овако: + + ```output + thai df: (289, 385) + japanese df: (320, 385) + chinese df: (442, 385) + indian df: (598, 385) + korean df: (799, 385) + ``` + +## Откривање састојака + +Сада можете дубље истражити податке и сазнати који су типични састојци по кухињи. Требало би да очистите поновљене податке који стварају конфузију између кухиња, па хајде да научимо о овом проблему. + +1. Направите функцију `create_ingredient()` у Python-у за креирање dataframe-а састојака. Ова функција ће започети уклањањем некорисне колоне и сортирањем састојака по њиховом броју: + + ```python + def create_ingredient_df(df): + ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') + ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] + ingredient_df = ingredient_df.sort_values(by='value', ascending=False, + inplace=False) + return ingredient_df + ``` + + Сада можете користити ту функцију да добијете идеју о десет најпопуларнијих састојака по кухињи. + +1. Позовите `create_ingredient()` и прикажите резултате позивајући `barh()`: + + ```python + thai_ingredient_df = create_ingredient_df(thai_df) + thai_ingredient_df.head(10).plot.barh() + ``` + + ![тајландска](../../../../4-Classification/1-Introduction/images/thai.png) + +1. Урадите исто за јапанске податке: + + ```python + japanese_ingredient_df = create_ingredient_df(japanese_df) + japanese_ingredient_df.head(10).plot.barh() + ``` + + ![јапанска](../../../../4-Classification/1-Introduction/images/japanese.png) + +1. Сада за кинеске састојке: + + ```python + chinese_ingredient_df = create_ingredient_df(chinese_df) + chinese_ingredient_df.head(10).plot.barh() + ``` + + ![кинеска](../../../../4-Classification/1-Introduction/images/chinese.png) + +1. Прикажите индијске састојке: + + ```python + indian_ingredient_df = create_ingredient_df(indian_df) + indian_ingredient_df.head(10).plot.barh() + ``` + + ![индијска](../../../../4-Classification/1-Introduction/images/indian.png) + +1. На крају, прикажите корејске састојке: + + ```python + korean_ingredient_df = create_ingredient_df(korean_df) + korean_ingredient_df.head(10).plot.barh() + ``` + + ![корејска](../../../../4-Classification/1-Introduction/images/korean.png) + +1. Сада уклоните најчешће састојке који стварају конфузију између различитих кухиња, позивајући `drop()`: + + Сви воле пиринач, бели лук и ђумбир! + + ```python + feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) + labels_df = df.cuisine #.unique() + feature_df.head() + ``` + +## Балансирање скупа података + +Сада када сте очистили податке, користите [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Техника синтетичког прекомерног узорковања мањинских класа" - да их избалансирате. + +1. Позовите `fit_resample()`, ова стратегија генерише нове узорке интерполацијом. + + ```python + oversample = SMOTE() + transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df) + ``` + + Балансирањем ваших података, добићете боље резултате приликом класификације. Размислите о бинарној класификацији. Ако је већина ваших података једна класа, модел машинског учења ће чешће предвиђати ту класу, само зато што има више података за њу. Балансирање података уклања ову неравнотежу. + +1. Сада можете проверити број ознака по састојку: + + ```python + print(f'new label count: {transformed_label_df.value_counts()}') + print(f'old label count: {df.cuisine.value_counts()}') + ``` + + Ваш излаз изгледа овако: + + ```output + new label count: korean 799 + chinese 799 + indian 799 + japanese 799 + thai 799 + Name: cuisine, dtype: int64 + old label count: korean 799 + indian 598 + chinese 442 + japanese 320 + thai 289 + Name: cuisine, dtype: int64 + ``` + + Подаци су лепи, чисти, избалансирани и веома укусни! + +1. Последњи корак је да сачувате ваше избалансиране податке, укључујући ознаке и карактеристике, у нови dataframe који можете извозити у фајл: + + ```python + transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer') + ``` + +1. Можете још једном погледати податке користећи `transformed_df.head()` и `transformed_df.info()`. Сачувајте копију ових података за употребу у будућим лекцијама: + + ```python + transformed_df.head() + transformed_df.info() + transformed_df.to_csv("../data/cleaned_cuisines.csv") + ``` + + Овај свеж CSV сада се може наћи у коренском директоријуму података. + +--- + +## 🚀Изазов + +Овај курикулум садржи неколико занимљивих скупова података. Претражите директоријуме `data` и видите да ли неки садрже скупове података који би били погодни за бинарну или вишекласну класификацију? Која питања бисте поставили о овом скупу података? + +## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Истражите SMOTE API. За које случајеве употребе је најбоље коришћен? Које проблеме решава? + +## Задатак + +[Истражите методе класификације](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/1-Introduction/assignment.md b/translations/sr/4-Classification/1-Introduction/assignment.md new file mode 100644 index 00000000..82c6fc16 --- /dev/null +++ b/translations/sr/4-Classification/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Истражите методе класификације + +## Упутства + +У [документацији за Scikit-learn](https://scikit-learn.org/stable/supervised_learning.html) можете пронаћи велики списак начина за класификацију података. Направите мало истраживање у овој документацији: ваш циљ је да пронађете методе класификације и повежете их са скупом података из овог курикулума, питањем које можете поставити о њему и техником класификације. Направите табелу или таблицу у .doc фајлу и објасните како би скуп података функционисао са алгоритмом класификације. + +## Рубрика + +| Критеријум | Изузетно | Задовољавајуће | Потребна побољшања | +| ---------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| | представљен је документ који обухвата 5 алгоритама заједно са техником класификације. Преглед је добро објашњен и детаљан. | представљен је документ који обухвата 3 алгоритма заједно са техником класификације. Преглед је добро објашњен и детаљан. | представљен је документ који обухвата мање од три алгоритма заједно са техником класификације, а преглед није добро објашњен нити детаљан. | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/1-Introduction/solution/Julia/README.md b/translations/sr/4-Classification/1-Introduction/solution/Julia/README.md new file mode 100644 index 00000000..f6db19d2 --- /dev/null +++ b/translations/sr/4-Classification/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/2-Classifiers-1/README.md b/translations/sr/4-Classification/2-Classifiers-1/README.md new file mode 100644 index 00000000..10a92b06 --- /dev/null +++ b/translations/sr/4-Classification/2-Classifiers-1/README.md @@ -0,0 +1,253 @@ + +# Класификатори кухиња 1 + +У овом часу, користићете скуп података који сте сачували из претходног часа, пун уравнотежених и чистих података о кухињама. + +Користићете овај скуп података са различитим класификаторима да _предвидите одређену националну кухињу на основу групе састојака_. Док то радите, научићете више о неким начинима на које алгоритми могу бити коришћени за задатке класификације. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) +# Припрема + +Под претпоставком да сте завршили [Час 1](../1-Introduction/README.md), уверите се да датотека _cleaned_cuisines.csv_ постоји у коренском `/data` фолдеру за ова четири часа. + +## Вежба - предвидите националну кухињу + +1. Радите у фолдеру _notebook.ipynb_ овог часа, увезите ту датотеку заједно са библиотеком Pandas: + + ```python + import pandas as pd + cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") + cuisines_df.head() + ``` + + Подаци изгледају овако: + +| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | +| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + + +1. Сада увезите још неколико библиотека: + + ```python + from sklearn.linear_model import LogisticRegression + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + from sklearn.svm import SVC + import numpy as np + ``` + +1. Поделите X и y координате у два датафрејма за тренинг. `cuisine` може бити датафрејм са ознакама: + + ```python + cuisines_label_df = cuisines_df['cuisine'] + cuisines_label_df.head() + ``` + + Изгледаће овако: + + ```output + 0 indian + 1 indian + 2 indian + 3 indian + 4 indian + Name: cuisine, dtype: object + ``` + +1. Избаците колону `Unnamed: 0` и колону `cuisine`, користећи `drop()`. Сачувајте остатак података као карактеристике за тренинг: + + ```python + cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) + cuisines_feature_df.head() + ``` + + Ваше карактеристике изгледају овако: + +| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | + +Сада сте спремни да обучите свој модел! + +## Избор класификатора + +Сада када су ваши подаци чисти и спремни за тренинг, морате одлучити који алгоритам да користите за задатак. + +Scikit-learn групише класификацију под Надгледано учење, и у тој категорији ћете пронаћи много начина за класификацију. [Разноврсност](https://scikit-learn.org/stable/supervised_learning.html) може изгледати збуњујуће на први поглед. Следеће методе укључују технике класификације: + +- Линеарни модели +- Машине за подршку векторима +- Стохастички градијентни спуст +- Најближи суседи +- Гаусови процеси +- Дрвеће одлука +- Методе ансамбла (гласајући класификатор) +- Алгоритми за више класа и више излаза (класификација више класа и више ознака, класификација више класа-више излаза) + +> Такође можете користити [неуронске мреже за класификацију података](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification), али то је ван оквира овог часа. + +### Који класификатор одабрати? + +Па, који класификатор треба да изаберете? Често је тестирање неколико њих и тражење доброг резултата начин да се испроба. Scikit-learn нуди [упоредни приказ](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) на креираном скупу података, упоређујући KNeighbors, SVC на два начина, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB и QuadraticDiscrinationAnalysis, приказујући резултате визуализоване: + +![упоредни приказ класификатора](../../../../4-Classification/2-Classifiers-1/images/comparison.png) +> Графикони генерисани у документацији Scikit-learn-а + +> AutoML решава овај проблем елегантно тако што врши ова поређења у облаку, омогућавајући вам да изаберете најбољи алгоритам за ваше податке. Пробајте [овде](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott) + +### Бољи приступ + +Бољи начин од насумичног погађања је да следите идеје из овог преузимљивог [ML Cheat sheet](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott). Овде откривамо да, за наш проблем са више класа, имамо неке опције: + +![чит листа за проблеме са више класа](../../../../4-Classification/2-Classifiers-1/images/cheatsheet.png) +> Део Microsoft-ове чит листе алгоритама, који детаљно описује опције класификације више класа + +✅ Преузмите ову чит листу, одштампајте је и окачите на зид! + +### Размишљање + +Хајде да видимо да ли можемо да размишљамо о различитим приступима с обзиром на ограничења која имамо: + +- **Неуронске мреже су превише захтевне**. С обзиром на наш чист, али минималан скуп података, и чињеницу да тренинг изводимо локално преко нотебука, неуронске мреже су превише захтевне за овај задатак. +- **Нема класификатора за две класе**. Не користимо класификатор за две класе, тако да то искључује one-vs-all. +- **Дрво одлука или логистичка регресија би могли да раде**. Дрво одлука би могло да ради, или логистичка регресија за податке са више класа. +- **Побољшана дрва одлука за више класа решавају другачији проблем**. Побољшано дрво одлука за више класа је најпогодније за непараметарске задатке, нпр. задатке дизајниране за креирање рангирања, тако да нам није корисно. + +### Коришћење Scikit-learn-а + +Користићемо Scikit-learn за анализу наших података. Међутим, постоји много начина за коришћење логистичке регресије у Scikit-learn-у. Погледајте [параметре за прослеђивање](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +У суштини, постоје два важна параметра - `multi_class` и `solver` - које треба да наведемо када тражимо од Scikit-learn-а да изврши логистичку регресију. Вредност `multi_class` примењује одређено понашање. Вредност solver-а је алгоритам који се користи. Не могу се сви solver-и упарити са свим вредностима `multi_class`. + +Према документацији, у случају више класа, алгоритам за тренинг: + +- **Користи шему one-vs-rest (OvR)**, ако је опција `multi_class` постављена на `ovr` +- **Користи губитак унакрсне ентропије**, ако је опција `multi_class` постављена на `multinomial`. (Тренутно је опција `multinomial` подржана само од стране solver-а ‘lbfgs’, ‘sag’, ‘saga’ и ‘newton-cg’.)" + +> 🎓 'Шема' овде може бити 'ovr' (one-vs-rest) или 'multinomial'. Пошто је логистичка регресија заправо дизајнирана да подржи бинарну класификацију, ове шеме јој омогућавају да боље обради задатке класификације више класа. [извор](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/) + +> 🎓 'Solver' је дефинисан као "алгоритам који се користи у проблему оптимизације". [извор](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +Scikit-learn нуди ову табелу да објасни како solver-и решавају различите изазове које представљају различите врсте структура података: + +![solver-и](../../../../4-Classification/2-Classifiers-1/images/solvers.png) + +## Вежба - поделите податке + +Можемо се фокусирати на логистичку регресију за наш први тренинг, пошто сте недавно научили о њој у претходном часу. +Поделите своје податке у групе за тренинг и тестирање позивањем `train_test_split()`: + +```python +X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) +``` + +## Вежба - примените логистичку регресију + +Пошто користите случај више класа, потребно је да изаберете коју _шему_ да користите и који _solver_ да поставите. Користите LogisticRegression са подешавањем више класа и **liblinear** solver-ом за тренинг. + +1. Креирајте логистичку регресију са multi_class постављеним на `ovr` и solver-ом постављеним на `liblinear`: + + ```python + lr = LogisticRegression(multi_class='ovr',solver='liblinear') + model = lr.fit(X_train, np.ravel(y_train)) + + accuracy = model.score(X_test, y_test) + print ("Accuracy is {}".format(accuracy)) + ``` + + ✅ Пробајте другачији solver као што је `lbfgs`, који је често постављен као подразумеван +> Напомена, користите Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) функцију за изравнавање ваших података када је то потребно. +Тачност је добра, преко **80%**! + +1. Можете видети овај модел у акцији тестирањем једног реда података (#50): + + ```python + print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') + print(f'cuisine: {y_test.iloc[50]}') + ``` + + Резултат се исписује: + + ```output + ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') + cuisine: indian + ``` + + ✅ Пробајте други број реда и проверите резултате. + +1. Ако желите да истражите дубље, можете проверити тачност ове предикције: + + ```python + test= X_test.iloc[50].values.reshape(-1, 1).T + proba = model.predict_proba(test) + classes = model.classes_ + resultdf = pd.DataFrame(data=proba, columns=classes) + + topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) + topPrediction.head() + ``` + + Резултат се исписује - индијска кухиња је најбоља претпоставка, са добром вероватноћом: + + | | 0 | + | -------: | -------: | + | indian | 0.715851 | + | chinese | 0.229475 | + | japanese | 0.029763 | + | korean | 0.017277 | + | thai | 0.007634 | + + ✅ Можете ли објаснити зашто је модел прилично сигуран да је ово индијска кухиња? + +1. Добијте више детаља исписивањем извештаја о класификацији, као што сте радили у лекцијама о регресији: + + ```python + y_pred = model.predict(X_test) + print(classification_report(y_test,y_pred)) + ``` + + | | прецизност | одзив | f1-резултат | подршка | + | ------------ | ---------- | ----- | ----------- | ------- | + | chinese | 0.73 | 0.71 | 0.72 | 229 | + | indian | 0.91 | 0.93 | 0.92 | 254 | + | japanese | 0.70 | 0.75 | 0.72 | 220 | + | korean | 0.86 | 0.76 | 0.81 | 242 | + | thai | 0.79 | 0.85 | 0.82 | 254 | + | тачност | 0.80 | 1199 | | | + | макро просек | 0.80 | 0.80 | 0.80 | 1199 | + | пондерисан просек | 0.80 | 0.80 | 0.80 | 1199 | + +## 🚀Изазов + +У овој лекцији, користили сте очишћене податке за изградњу модела машинског учења који може предвидети националну кухињу на основу серије састојака. Одвојите време да прочитате многе опције које Scikit-learn пружа за класификацију података. Истражите дубље концепт 'solver'-а да бисте разумели шта се дешава иза сцене. + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Истражите мало више математику иза логистичке регресије у [овој лекцији](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf) +## Задатак + +[Проучите решаваче](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/2-Classifiers-1/assignment.md b/translations/sr/4-Classification/2-Classifiers-1/assignment.md new file mode 100644 index 00000000..b52fb8f9 --- /dev/null +++ b/translations/sr/4-Classification/2-Classifiers-1/assignment.md @@ -0,0 +1,24 @@ + +# Проучите решаваче +## Упутства + +У овој лекцији сте научили о различитим решавачима који комбинују алгоритме са процесом машинског учења како би створили прецизан модел. Прођите кроз решаваче наведене у лекцији и изаберите два. Својим речима упоредите и супротставите ова два решавача. Који тип проблема решавају? Како раде са различитим структурама података? Зашто бисте изабрали један уместо другог? + +## Рубрика + +| Критеријум | Изузетно | Довољно | Потребно побољшање | +| ---------- | -------------------------------------------------------------------------------------------- | ----------------------------------------------- | ---------------------------- | +| | Представљен је .doc фајл са два пасуса, по један за сваки решавач, уз промишљено поређење. | Представљен је .doc фајл са само једним пасусом | Задатак је непотпун | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/2-Classifiers-1/solution/Julia/README.md b/translations/sr/4-Classification/2-Classifiers-1/solution/Julia/README.md new file mode 100644 index 00000000..5ba2579f --- /dev/null +++ b/translations/sr/4-Classification/2-Classifiers-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/3-Classifiers-2/README.md b/translations/sr/4-Classification/3-Classifiers-2/README.md new file mode 100644 index 00000000..a7f90114 --- /dev/null +++ b/translations/sr/4-Classification/3-Classifiers-2/README.md @@ -0,0 +1,249 @@ + +# Класификатори кухиња 2 + +У овој другој лекцији о класификацији, истражићете више начина за класификацију нумеричких података. Такође ћете научити о последицама избора једног класификатора у односу на други. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +### Предуслови + +Претпостављамо да сте завршили претходне лекције и да имате очишћен скуп података у вашем фолдеру `data` под називом _cleaned_cuisines.csv_ у корену овог фолдера са 4 лекције. + +### Припрема + +Учитали смо ваш фајл _notebook.ipynb_ са очишћеним скупом података и поделили га на X и y оквире података, спремне за процес изградње модела. + +## Мапа класификације + +Претходно сте научили о различитим опцијама које имате приликом класификације података користећи Microsoft-ов „cheat sheet“. Scikit-learn нуди сличан, али детаљнији „cheat sheet“ који вам може додатно помоћи да сузите избор класификатора (други термин за класификаторе): + +![МЛ мапа из Scikit-learn](../../../../4-Classification/3-Classifiers-2/images/map.png) +> Савет: [погледајте ову мапу онлајн](https://scikit-learn.org/stable/tutorial/machine_learning_map/) и кликните дуж путање да бисте прочитали документацију. + +### План + +Ова мапа је веома корисна када имате јасну представу о вашим подацима, јер можете „ходати“ дуж њених путања до одлуке: + +- Имамо >50 узорака +- Желимо да предвидимо категорију +- Имамо означене податке +- Имамо мање од 100.000 узорака +- ✨ Можемо изабрати Linear SVC +- Ако то не ради, пошто имамо нумеричке податке + - Можемо пробати ✨ KNeighbors Classifier + - Ако то не ради, пробајте ✨ SVC и ✨ Ensemble Classifiers + +Ово је веома корисна путања коју треба пратити. + +## Вежба - поделите податке + +Пратећи ову путању, требало би да почнемо увозом неких библиотека за коришћење. + +1. Увезите потребне библиотеке: + + ```python + from sklearn.neighbors import KNeighborsClassifier + from sklearn.linear_model import LogisticRegression + from sklearn.svm import SVC + from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + import numpy as np + ``` + +2. Поделите ваше податке на тренинг и тест: + + ```python + X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) + ``` + +## Linear SVC класификатор + +Support-Vector Clustering (SVC) је део породице техника машинског учења Support-Vector Machines (СВМ) (више о томе у наставку). У овом методу, можете изабрати „kernel“ да одлучите како да групишете ознаке. Параметар 'C' се односи на 'регуларизацију', која регулише утицај параметара. Kernel може бити један од [неколико](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); овде га постављамо на 'linear' како бисмо искористили Linear SVC. Вероватноћа је подразумевано 'false'; овде је постављамо на 'true' како бисмо добили процене вероватноће. Постављамо random state на '0' како бисмо измешали податке за добијање вероватноћа. + +### Вежба - примените Linear SVC + +Почните са креирањем низа класификатора. Додаваћете постепено у овај низ како будемо тестирали. + +1. Почните са Linear SVC: + + ```python + C = 10 + # Create different classifiers. + classifiers = { + 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0) + } + ``` + +2. Тренирајте ваш модел користећи Linear SVC и испишите извештај: + + ```python + n_classifiers = len(classifiers) + + for index, (name, classifier) in enumerate(classifiers.items()): + classifier.fit(X_train, np.ravel(y_train)) + + y_pred = classifier.predict(X_test) + accuracy = accuracy_score(y_test, y_pred) + print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100)) + print(classification_report(y_test,y_pred)) + ``` + + Резултат је прилично добар: + + ```output + Accuracy (train) for Linear SVC: 78.6% + precision recall f1-score support + + chinese 0.71 0.67 0.69 242 + indian 0.88 0.86 0.87 234 + japanese 0.79 0.74 0.76 254 + korean 0.85 0.81 0.83 242 + thai 0.71 0.86 0.78 227 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +## K-Neighbors класификатор + +K-Neighbors је део породице метода машинског учења „neighbors“, које се могу користити за надгледано и ненадгледано учење. У овом методу, унапред дефинисан број тачака се креира, а подаци се групишу око тих тачака тако да се могу предвидети генерализоване ознаке за податке. + +### Вежба - примените K-Neighbors класификатор + +Претходни класификатор је био добар и добро је радио са подацима, али можда можемо добити бољу тачност. Пробајте K-Neighbors класификатор. + +1. Додајте линију у ваш низ класификатора (додајте зарез након Linear SVC ставке): + + ```python + 'KNN classifier': KNeighborsClassifier(C), + ``` + + Резултат је мало лошији: + + ```output + Accuracy (train) for KNN classifier: 73.8% + precision recall f1-score support + + chinese 0.64 0.67 0.66 242 + indian 0.86 0.78 0.82 234 + japanese 0.66 0.83 0.74 254 + korean 0.94 0.58 0.72 242 + thai 0.71 0.82 0.76 227 + + accuracy 0.74 1199 + macro avg 0.76 0.74 0.74 1199 + weighted avg 0.76 0.74 0.74 1199 + ``` + + ✅ Сазнајте више о [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) + +## Support Vector Classifier + +Support-Vector класификатори су део породице метода машинског учења [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) које се користе за задатке класификације и регресије. СВМ-ови „мапирају примере тренинга у тачке у простору“ како би максимизовали удаљеност између две категорије. Накнадни подаци се мапирају у овај простор како би се предвидела њихова категорија. + +### Вежба - примените Support Vector Classifier + +Покушајмо да добијемо мало бољу тачност са Support Vector Classifier. + +1. Додајте зарез након K-Neighbors ставке, а затим додајте ову линију: + + ```python + 'SVC': SVC(), + ``` + + Резултат је прилично добар! + + ```output + Accuracy (train) for SVC: 83.2% + precision recall f1-score support + + chinese 0.79 0.74 0.76 242 + indian 0.88 0.90 0.89 234 + japanese 0.87 0.81 0.84 254 + korean 0.91 0.82 0.86 242 + thai 0.74 0.90 0.81 227 + + accuracy 0.83 1199 + macro avg 0.84 0.83 0.83 1199 + weighted avg 0.84 0.83 0.83 1199 + ``` + + ✅ Сазнајте више о [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm) + +## Ensemble класификатори + +Хајде да пратимо путању до самог краја, иако је претходни тест био прилично добар. Пробајмо неке 'Ensemble класификаторе', конкретно Random Forest и AdaBoost: + +```python + 'RFST': RandomForestClassifier(n_estimators=100), + 'ADA': AdaBoostClassifier(n_estimators=100) +``` + +Резултат је веома добар, посебно за Random Forest: + +```output +Accuracy (train) for RFST: 84.5% + precision recall f1-score support + + chinese 0.80 0.77 0.78 242 + indian 0.89 0.92 0.90 234 + japanese 0.86 0.84 0.85 254 + korean 0.88 0.83 0.85 242 + thai 0.80 0.87 0.83 227 + + accuracy 0.84 1199 + macro avg 0.85 0.85 0.84 1199 +weighted avg 0.85 0.84 0.84 1199 + +Accuracy (train) for ADA: 72.4% + precision recall f1-score support + + chinese 0.64 0.49 0.56 242 + indian 0.91 0.83 0.87 234 + japanese 0.68 0.69 0.69 254 + korean 0.73 0.79 0.76 242 + thai 0.67 0.83 0.74 227 + + accuracy 0.72 1199 + macro avg 0.73 0.73 0.72 1199 +weighted avg 0.73 0.72 0.72 1199 +``` + +✅ Сазнајте више о [Ensemble класификаторима](https://scikit-learn.org/stable/modules/ensemble.html) + +Овај метод машинског учења „комбинује предвиђања неколико основних процењивача“ како би побољшао квалитет модела. У нашем примеру, користили смо Random Trees и AdaBoost. + +- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), метод просечавања, гради „шуму“ од „одлука дрвећа“ са додатком случајности како би се избегло пренапасавање. Параметар n_estimators је подешен на број стабала. + +- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) прилагођава класификатор скупу података, а затим прилагођава копије тог класификатора истом скупу података. Фокусира се на тежине погрешно класификованих ставки и прилагођава следећи класификатор како би исправио грешке. + +--- + +## 🚀Изазов + +Свака од ових техника има велики број параметара које можете подесити. Истражите подразумеване параметре сваке од њих и размислите шта би значило подешавање тих параметара за квалитет модела. + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +У овим лекцијама има доста жаргона, па одвојите минут да прегледате [ову листу](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) корисне терминологије! + +## Задатак + +[Играње са параметрима](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/3-Classifiers-2/assignment.md b/translations/sr/4-Classification/3-Classifiers-2/assignment.md new file mode 100644 index 00000000..0f7eea1b --- /dev/null +++ b/translations/sr/4-Classification/3-Classifiers-2/assignment.md @@ -0,0 +1,25 @@ + +# Параметарска игра + +## Упутства + +Постоји много параметара који су подразумевано постављени када радите са овим класификаторима. Интелисенс у VS Code-у може вам помоћи да их истражите. Усвојите једну од техника машинског учења за класификацију из овог часа и поново обучите моделе мењајући различите вредности параметара. Направите бележницу у којој ћете објаснити зашто неке промене побољшавају квалитет модела, док друге погоршавају. Будите детаљни у свом одговору. + +## Рубрика + +| Критеријум | Изузетно | Довољно | Потребно побољшање | +| ---------- | --------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------ | +| | Представљена је бележница са потпуно изграђеним класификатором, подешеним параметрима и објашњењима у текстуалним оквирима | Бележница је делимично представљена или лоше објашњена | Бележница је баговита или неисправна | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/3-Classifiers-2/solution/Julia/README.md b/translations/sr/4-Classification/3-Classifiers-2/solution/Julia/README.md new file mode 100644 index 00000000..469bf164 --- /dev/null +++ b/translations/sr/4-Classification/3-Classifiers-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/4-Applied/README.md b/translations/sr/4-Classification/4-Applied/README.md new file mode 100644 index 00000000..2be68c3b --- /dev/null +++ b/translations/sr/4-Classification/4-Applied/README.md @@ -0,0 +1,329 @@ + +# Направите веб апликацију за препоруку кухиње + +У овом часу, направићете модел класификације користећи неке од техника које сте научили у претходним лекцијама, уз помоћ укусног скупа података о кухињама који се користио током ове серије. Поред тога, направићете малу веб апликацију која користи сачувани модел, користећи Onnx веб рунтајм. + +Једна од најкориснијих практичних примена машинског учења је изградња система за препоруке, и данас можете направити први корак у том правцу! + +[![Презентација ове веб апликације](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Applied ML") + +> 🎥 Кликните на слику изнад за видео: Џен Лупер прави веб апликацију користећи класификоване податке о кухињама + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +У овом часу ћете научити: + +- Како направити модел и сачувати га као Onnx модел +- Како користити Netron за преглед модела +- Како користити ваш модел у веб апликацији за инференцију + +## Направите свој модел + +Изградња примењених ML система је важан део коришћења ових технологија за ваше пословне системе. Моделе можете користити унутар ваших веб апликација (и тако их користити у офлајн контексту ако је потребно) користећи Onnx. + +У [претходном часу](../../3-Web-App/1-Web-App/README.md), направили сте регресиони модел о виђењима НЛО-а, "пикловали" га и користили у Flask апликацији. Иако је ова архитектура веома корисна за познавање, то је апликација са пуним стеком у Python-у, а ваши захтеви могу укључивати употребу JavaScript апликације. + +У овом часу, можете направити основни систем заснован на JavaScript-у за инференцију. Прво, међутим, потребно је да обучите модел и конвертујете га за употребу са Onnx-ом. + +## Вежба - обучите модел класификације + +Прво, обучите модел класификације користећи очишћени скуп података о кухињама који смо користили. + +1. Почните увозом корисних библиотека: + + ```python + !pip install skl2onnx + import pandas as pd + ``` + + Потребан вам је '[skl2onnx](https://onnx.ai/sklearn-onnx/)' да бисте помогли у конверзији вашег Scikit-learn модела у Onnx формат. + +1. Затим, радите са вашим подацима на исти начин као у претходним часовима, читајући CSV фајл користећи `read_csv()`: + + ```python + data = pd.read_csv('../data/cleaned_cuisines.csv') + data.head() + ``` + +1. Уклоните прве две непотребне колоне и сачувајте преостале податке као 'X': + + ```python + X = data.iloc[:,2:] + X.head() + ``` + +1. Сачувајте ознаке као 'y': + + ```python + y = data[['cuisine']] + y.head() + + ``` + +### Започните рутину тренинга + +Користићемо библиотеку 'SVC' која има добру тачност. + +1. Увезите одговарајуће библиотеке из Scikit-learn: + + ```python + from sklearn.model_selection import train_test_split + from sklearn.svm import SVC + from sklearn.model_selection import cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report + ``` + +1. Одвојите сетове за тренинг и тестирање: + + ```python + X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3) + ``` + +1. Направите SVC модел класификације као што сте урадили у претходном часу: + + ```python + model = SVC(kernel='linear', C=10, probability=True,random_state=0) + model.fit(X_train,y_train.values.ravel()) + ``` + +1. Сада тестирајте ваш модел, позивајући `predict()`: + + ```python + y_pred = model.predict(X_test) + ``` + +1. Испишите извештај о класификацији да проверите квалитет модела: + + ```python + print(classification_report(y_test,y_pred)) + ``` + + Као што смо видели раније, тачност је добра: + + ```output + precision recall f1-score support + + chinese 0.72 0.69 0.70 257 + indian 0.91 0.87 0.89 243 + japanese 0.79 0.77 0.78 239 + korean 0.83 0.79 0.81 236 + thai 0.72 0.84 0.78 224 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +### Конвертујте ваш модел у Onnx + +Уверите се да сте извршили конверзију са одговарајућим бројем тензора. Овај скуп података има 380 састојака, па је потребно да наведете тај број у `FloatTensorType`: + +1. Конвертујте користећи број тензора 380. + + ```python + from skl2onnx import convert_sklearn + from skl2onnx.common.data_types import FloatTensorType + + initial_type = [('float_input', FloatTensorType([None, 380]))] + options = {id(model): {'nocl': True, 'zipmap': False}} + ``` + +1. Направите onx и сачувајте као фајл **model.onnx**: + + ```python + onx = convert_sklearn(model, initial_types=initial_type, options=options) + with open("./model.onnx", "wb") as f: + f.write(onx.SerializeToString()) + ``` + + > Напомена, можете проследити [опције](https://onnx.ai/sklearn-onnx/parameterized.html) у вашем скрипту за конверзију. У овом случају, поставили смо 'nocl' да буде True и 'zipmap' да буде False. Пошто је ово модел класификације, имате опцију да уклоните ZipMap који производи листу речника (није неопходно). `nocl` се односи на информације о класи које су укључене у модел. Смањите величину вашег модела постављањем `nocl` на 'True'. + +Извршавање целог нотебука сада ће направити Onnx модел и сачувати га у овај фолдер. + +## Прегледајте ваш модел + +Onnx модели нису баш видљиви у Visual Studio Code-у, али постоји веома добар бесплатан софтвер који многи истраживачи користе за визуализацију модела како би се уверили да је правилно направљен. Преузмите [Netron](https://github.com/lutzroeder/Netron) и отворите ваш model.onnx фајл. Можете видети ваш једноставан модел визуализован, са његових 380 улаза и класификатором: + +![Netron визуализација](../../../../4-Classification/4-Applied/images/netron.png) + +Netron је користан алат за преглед ваших модела. + +Сада сте спремни да користите овај занимљив модел у веб апликацији. Направимо апликацију која ће бити корисна када погледате у ваш фрижидер и покушате да схватите коју комбинацију ваших преосталих састојака можете користити за припрему одређене кухиње, како је одредио ваш модел. + +## Направите веб апликацију за препоруке + +Можете користити ваш модел директно у веб апликацији. Ова архитектура такође омогућава да га покренете локално и чак офлајн ако је потребно. Почните креирањем фајла `index.html` у истом фолдеру где сте сачували ваш `model.onnx` фајл. + +1. У овом фајлу _index.html_, додајте следећи маркуп: + + ```html + + +
                                + Cuisine Matcher +
                                + + ... + + + ``` + +1. Сада, радећи унутар `body` тагова, додајте мало маркупа да прикажете листу чекбокса који одражавају неке састојке: + + ```html +

                                Check your refrigerator. What can you create?

                                +
                                +
                                + + +
                                + +
                                + + +
                                + +
                                + + +
                                + +
                                + + +
                                + +
                                + + +
                                + +
                                + + +
                                + +
                                + + +
                                +
                                +
                                + +
                                + ``` + + Приметите да је сваком чекбоксу додељена вредност. Ово одражава индекс где се састојак налази према скупу података. На пример, јабука у овој азбучној листи заузима пету колону, па је њена вредност '4' јер почињемо бројати од 0. Можете консултовати [табелу састојака](../../../../4-Classification/data/ingredient_indexes.csv) да откријете индекс датог састојка. + + Настављајући рад у index.html фајлу, додајте блок скрипте где се модел позива након завршног затварајућег ``. + +1. Прво, увезите [Onnx Runtime](https://www.onnxruntime.ai/): + + ```html + + ``` + + > Onnx Runtime се користи за омогућавање покретања ваших Onnx модела на широком спектру хардверских платформи, укључујући оптимизације и API за употребу. + +1. Када је Runtime на месту, можете га позвати: + + ```html + + ``` + +У овом коду, дешава се неколико ствари: + +1. Направили сте низ од 380 могућих вредности (1 или 0) који се постављају и шаљу моделу за инференцију, у зависности од тога да ли је чекбокс означен. +2. Направили сте низ чекбокса и начин да утврдите да ли су означени у функцији `init` која се позива када апликација почне. Када је чекбокс означен, низ `ingredients` се мења да одражава изабрани састојак. +3. Направили сте функцију `testCheckboxes` која проверава да ли је било који чекбокс означен. +4. Користите функцију `startInference` када се притисне дугме и, ако је било који чекбокс означен, започињете инференцију. +5. Рутина инференције укључује: + 1. Постављање асинхроног учитавања модела + 2. Креирање Tensor структуре за слање моделу + 3. Креирање 'feeds' који одражавају `float_input` улаз који сте креирали приликом тренинга вашег модела (можете користити Netron да проверите то име) + 4. Слање ових 'feeds' моделу и чекање одговора + +## Тестирајте вашу апликацију + +Отворите терминал у Visual Studio Code-у у фолдеру где се налази ваш index.html фајл. Уверите се да имате [http-server](https://www.npmjs.com/package/http-server) инсталиран глобално, и укуцајте `http-server` на промпту. Требало би да се отвори localhost и можете видети вашу веб апликацију. Проверите која кухиња се препоручује на основу различитих састојака: + +![веб апликација за састојке](../../../../4-Classification/4-Applied/images/web-app.png) + +Честитамо, направили сте веб апликацију за препоруке са неколико поља. Одвојите мало времена да развијете овај систем! + +## 🚀Изазов + +Ваша веб апликација је веома минимална, па наставите да је развијате користећи састојке и њихове индексе из [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv) података. Које комбинације укуса раде за креирање одређеног националног јела? + +## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Иако је ова лекција само дотакла корисност креирања система за препоруке за састојке хране, ова област примена машинског учења је веома богата примерима. Прочитајте више о томе како се ови системи граде: + +- https://www.sciencedirect.com/topics/computer-science/recommendation-engine +- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/ +- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/ + +## Задатак + +[Направите нови систем за препоруке](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/4-Applied/assignment.md b/translations/sr/4-Classification/4-Applied/assignment.md new file mode 100644 index 00000000..df4a9e28 --- /dev/null +++ b/translations/sr/4-Classification/4-Applied/assignment.md @@ -0,0 +1,25 @@ + +# Направите препоручивач + +## Упутства + +На основу вежби из ове лекције, сада знате како да направите веб апликацију засновану на JavaScript-у користећи Onnx Runtime и конвертовани Onnx модел. Експериментишите са прављењем новог препоручивача користећи податке из ових лекција или из других извора (молимо наведите изворе). Можете, на пример, направити препоручивач кућних љубимаца на основу различитих особина личности, или препоручивач музичких жанрова на основу расположења особе. Будите креативни! + +## Рубрика + +| Критеријум | Изузетно | Задовољавајуће | Потребно побољшање | +| ---------- | -------------------------------------------------------------------- | ------------------------------------- | --------------------------------- | +| | Представљени су веб апликација и бележница, оба добро документована и функционална | Једно од та два недостаје или има недостатке | Оба недостају или имају недостатке | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/4-Classification/README.md b/translations/sr/4-Classification/README.md new file mode 100644 index 00000000..f46a3d99 --- /dev/null +++ b/translations/sr/4-Classification/README.md @@ -0,0 +1,41 @@ + +# Почетак рада са класификацијом + +## Регионална тема: Укусна азијска и индијска кухиња 🍜 + +У Азији и Индији, традиције у храни су изузетно разноврсне и веома укусне! Погледајмо податке о регионалним кухињама како бисмо боље разумели њихове састојке. + +![Продавац тајландске хране](../../../4-Classification/images/thai-food.jpg) +> Фотографија од Лишенг Чанг на Unsplash + +## Шта ћете научити + +У овом делу, надоградићете своје претходно знање о регресији и научити о другим класификаторима које можете користити за боље разумевање података. + +> Постоје корисни алати са мало кода који вам могу помоћи да научите како да радите са моделима класификације. Пробајте [Azure ML за овај задатак](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Лекције + +1. [Увод у класификацију](1-Introduction/README.md) +2. [Више класификатора](2-Classifiers-1/README.md) +3. [Још класификатора](3-Classifiers-2/README.md) +4. [Примењени ML: направите веб апликацију](4-Applied/README.md) + +## Кредити + +"Почетак рада са класификацијом" написали су са ♥️ [Кеси Бревиу](https://www.twitter.com/cassiebreviu) и [Џен Лупер](https://www.twitter.com/jenlooper) + +Скуп података о укусним кухињама преузет је са [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines). + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/5-Clustering/1-Visualize/README.md b/translations/sr/5-Clustering/1-Visualize/README.md new file mode 100644 index 00000000..f5496d19 --- /dev/null +++ b/translations/sr/5-Clustering/1-Visualize/README.md @@ -0,0 +1,346 @@ + +# Увод у кластеризацију + +Кластеризација је врста [ненаџираног учења](https://wikipedia.org/wiki/Unsupervised_learning) која претпоставља да је скуп података необележен или да његови уноси нису повезани са унапред дефинисаним излазима. Користи различите алгоритме за сортирање необележених података и пружа груписања на основу образаца које препознаје у подацима. + +[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare") + +> 🎥 Кликните на слику изнад за видео. Док изучавате машинско учење са кластеризацијом, уживајте у неким нигеријским Dance Hall песмама - ово је високо оцењена песма из 2014. године од PSquare. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +### Увод + +[Кластеризација](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) је веома корисна за истраживање података. Хајде да видимо да ли може помоћи у откривању трендова и образаца у начину на који нигеријска публика конзумира музику. + +✅ Одвојите минут да размислите о употребама кластеризације. У стварном животу, кластеризација се дешава кад год имате гомилу веша и треба да сортирате одећу чланова породице 🧦👕👖🩲. У науци о подацима, кластеризација се дешава када покушавате да анализирате корисничке преференције или одредите карактеристике било ког необележеног скупа података. Кластеризација, на неки начин, помаже да се уведе ред у хаос, као у фиоци за чарапе. + +[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering") + +> 🎥 Кликните на слику изнад за видео: Џон Гуттаг са MIT-а представља кластеризацију. + +У професионалном окружењу, кластеризација се може користити за одређивање ствари као што су сегментација тржишта, утврђивање које старосне групе купују које артикле, на пример. Друга употреба би била откривање аномалија, можда за откривање преваре из скупа података о трансакцијама кредитним картицама. Или можете користити кластеризацију за одређивање тумора у серији медицинских снимака. + +✅ Размислите минут о томе како сте можда наишли на кластеризацију 'у природи', у банкарству, е-трговини или пословном окружењу. + +> 🎓 Занимљиво је да је анализа кластера настала у областима антропологије и психологије 1930-их. Можете ли замислити како је могла бити коришћена? + +Алтернативно, можете је користити за груписање резултата претраге - на пример, по куповним линковима, сликама или рецензијама. Кластеризација је корисна када имате велики скуп података који желите да смањите и на којем желите да извршите детаљнију анализу, па се техника може користити за учење о подацима пре него што се конструишу други модели. + +✅ Када су ваши подаци организовани у кластере, додељујете им идентификатор кластера, и ова техника може бити корисна када желите да сачувате приватност скупа података; можете уместо тога да се позовете на тачку података преко њеног идентификатора кластера, а не преко откривенијих идентификационих података. Можете ли смислити друге разлоге зашто бисте се позивали на идентификатор кластера уместо на друге елементе кластера да бисте га идентификовали? + +Продубите своје разумевање техника кластеризације у овом [модулу за учење](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott). + +## Почетак рада са кластеризацијом + +[Scikit-learn нуди велики избор](https://scikit-learn.org/stable/modules/clustering.html) метода за извођење кластеризације. Тип који изаберете зависиће од вашег случаја употребе. Према документацији, свака метода има различите предности. Ево поједностављене табеле метода које подржава Scikit-learn и њихових одговарајућих случајева употребе: + +| Назив методе | Случај употребе | +| :--------------------------- | :------------------------------------------------------------------ | +| K-Means | општа намена, индуктивна | +| Affinity propagation | многи, неравномерни кластери, индуктивна | +| Mean-shift | многи, неравномерни кластери, индуктивна | +| Spectral clustering | мало, равномерни кластери, трансдуктивна | +| Ward hierarchical clustering | многи, ограничени кластери, трансдуктивна | +| Agglomerative clustering | многи, ограничени, неевклидске удаљености, трансдуктивна | +| DBSCAN | неравна геометрија, неравномерни кластери, трансдуктивна | +| OPTICS | неравна геометрија, неравномерни кластери са променљивом густином, трансдуктивна | +| Gaussian mixtures | равна геометрија, индуктивна | +| BIRCH | велики скуп података са изузецима, индуктивна | + +> 🎓 Како креирамо кластере има много везе са начином на који групишемо тачке података у групе. Хајде да разјаснимо неке термине: +> +> 🎓 ['Трансдуктивно' vs. 'индуктивно'](https://wikipedia.org/wiki/Transduction_(machine_learning)) +> +> Трансдуктивно закључивање се изводи из посматраних случајева тренинга који се мапирају на одређене тест случајеве. Индуктивно закључивање се изводи из случајева тренинга који се мапирају на општа правила која се тек онда примењују на тест случајеве. +> +> Пример: Замислите да имате скуп података који је само делимично обележен. Неке ствари су 'плоче', неке 'цд-ови', а неке су празне. Ваш задатак је да обезбедите ознаке за празне. Ако изаберете индуктивни приступ, обучили бисте модел тражећи 'плоче' и 'цд-ове', и применили те ознаке на необележене податке. Овај приступ ће имати проблема са класификацијом ствари које су заправо 'касете'. Трансдуктивни приступ, с друге стране, ефикасније обрађује ове непознате податке јер ради на груписању сличних ставки заједно и затим примењује ознаку на групу. У овом случају, кластери би могли одражавати 'округле музичке ствари' и 'квадратне музичке ствари'. +> +> 🎓 ['Неравна' vs. 'равна' геометрија](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) +> +> Изведено из математичке терминологије, неравна vs. равна геометрија односи се на мерење удаљености између тачака било 'равним' ([евклидским](https://wikipedia.org/wiki/Euclidean_geometry)) или 'неравним' (неевклидским) геометријским методама. +> +>'Равно' у овом контексту се односи на евклидску геометрију (делови које се уче као 'планарна' геометрија), а 'неравно' се односи на неевклидску геометрију. Шта геометрија има са машинским учењем? Па, као две области које су укорењене у математици, мора постојати заједнички начин мерења удаљености између тачака у кластерима, и то се може урадити на 'раван' или 'нераван' начин, у зависности од природе података. [Евклидске удаљености](https://wikipedia.org/wiki/Euclidean_distance) се мере као дужина сегмента линије између две тачке. [Неевклидске удаљености](https://wikipedia.org/wiki/Non-Euclidean_geometry) се мере дуж криве. Ако ваши подаци, визуализовани, изгледају као да не постоје на равни, можда ћете морати да користите специјализовани алгоритам за њихову обраду. +> +![Flat vs Nonflat Geometry Infographic](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png) +> Инфографика од [Dasani Madipalli](https://twitter.com/dasani_decoded) +> +> 🎓 ['Удаљености'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) +> +> Кластери су дефинисани својом матрицом удаљености, нпр. удаљеностима између тачака. Ова удаљеност се може мерити на неколико начина. Евклидски кластери су дефинисани просеком вредности тачака и садрже 'центроид' или централну тачку. Удаљености се стога мере удаљеношћу до тог центроида. Неевклидске удаљености се односе на 'кластроиде', тачку најближу другим тачкама. Кластроиди се могу дефинисати на различите начине. +> +> 🎓 ['Ограничени'](https://wikipedia.org/wiki/Constrained_clustering) +> +> [Ограничена кластеризација](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) уводи 'полу-наџирано' учење у овај ненаџирани метод. Односи између тачака су означени као 'не може се повезати' или 'мора се повезати' тако да се нека правила намећу на скуп података. +> +>Пример: Ако је алгоритам пуштен на серију необележених или полу-обележених података, кластери које производи могу бити лошег квалитета. У горњем примеру, кластери би могли груписати 'округле музичке ствари' и 'квадратне музичке ствари' и 'троугласте ствари' и 'колачиће'. Ако се дају нека ограничења, или правила која треба следити ("ставка мора бити направљена од пластике", "ставка треба да може да производи музику") то може помоћи да се 'ограничи' алгоритам да донесе боље изборе. +> +> 🎓 'Густина' +> +> Подаци који су 'шумни' сматрају се 'густим'. Удаљености између тачака у сваком од њихових кластера могу се, при испитивању, показати као више или мање густе, или 'претрпане', и стога ове податке треба анализирати одговарајућом методом кластеризације. [Овај чланак](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) демонстрира разлику између коришћења K-Means кластеризације и HDBSCAN алгоритама за истраживање шумног скупа података са неравномерном густином кластера. + +## Алгоритми кластеризације + +Постоји преко 100 алгоритама кластеризације, а њихова употреба зависи од природе података. Хајде да разговарамо о неким од главних: + +- **Хијерархијска кластеризација**. Ако се објекат класификује према његовој близини другом објекту, а не оном који је удаљенији, кластери се формирају на основу удаљености њихових чланова од других објеката. Agglomerative кластеризација у Scikit-learn-у је хијерархијска. + + ![Hierarchical clustering Infographic](../../../../5-Clustering/1-Visualize/images/hierarchical.png) + > Инфографика од [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Кластеризација центроида**. Овај популарни алгоритам захтева избор 'k', или броја кластера који треба формирати, након чега алгоритам одређује централну тачку кластера и окупља податке око те тачке. [K-means кластеризација](https://wikipedia.org/wiki/K-means_clustering) је популарна верзија кластеризације центроида. Центар се одређује најближим просеком, отуда и назив. Квадрат удаљености од кластера се минимизира. + + ![Centroid clustering Infographic](../../../../5-Clustering/1-Visualize/images/centroid.png) + > Инфографика од [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Кластеризација заснована на расподели**. Заснована на статистичком моделовању, кластеризација заснована на расподели се фокусира на одређивање вероватноће да тачка података припада кластеру и додељује је у складу с тим. Методи Gaussian mixture припадају овом типу. + +- **Кластеризација заснована на густини**. Тачке података се додељују кластерима на основу њихове густине, или њиховог груписања једна око друге. Тачке података далеко од групе се сматрају изузецима или шумом. DBSCAN, Mean-shift и OPTICS припадају овом типу кластеризације. + +- **Кластеризација заснована на мрежи**. За мултидимензионалне скупове података, креира се мрежа и подаци се деле међу ћелијама мреже, чиме се стварају кластери. + +## Вежба - кластеризујте своје податке + +Кластеризација као техника је значајно олакшана правилном визуализацијом, па хајде да почнемо визуализацијом наших музичких података. Ова вежба ће нам помоћи да одлучимо који од метода кластеризације најбоље одговара природи ових података. + +1. Отворите [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) датотеку у овом фолдеру. + +1. Увезите пакет `Seaborn` за добру визуализацију података. + + ```python + !pip install seaborn + ``` + +1. Додајте податке о песмама из [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv). Учитајте dataframe са неким подацима о песмама. Припремите се за истраживање ових података увозом библиотека и исписивањем података: + + ```python + import matplotlib.pyplot as plt + import pandas as pd + + df = pd.read_csv("../data/nigerian-songs.csv") + df.head() + ``` + + Проверите првих неколико линија података: + + | | name | album | artist | artist_top_genre | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | + | --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ------------ | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- | + | 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0 +| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 | +| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 | +| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 | + +1. Добијте неке информације о подацима, позивањем `info()`: + + ```python + df.info() + ``` + + Излаз изгледа овако: + + ```output + + RangeIndex: 530 entries, 0 to 529 + Data columns (total 16 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 name 530 non-null object + 1 album 530 non-null object + 2 artist 530 non-null object + 3 artist_top_genre 530 non-null object + 4 release_date 530 non-null int64 + 5 length 530 non-null int64 + 6 popularity 530 non-null int64 + 7 danceability 530 non-null float64 + 8 acousticness 530 non-null float64 + 9 energy 530 non-null float64 + 10 instrumentalness 530 non-null float64 + 11 liveness 530 non-null float64 + 12 loudness 530 non-null float64 + 13 speechiness 530 non-null float64 + 14 tempo 530 non-null float64 + 15 time_signature 530 non-null int64 + dtypes: float64(8), int64(4), object(4) + memory usage: 66.4+ KB + ``` + +1. Поново проверите да ли постоје празне вредности, позивањем `isnull()` и проверавањем да ли је збир 0: + + ```python + df.isnull().sum() + ``` + + Изгледа добро: + + ```output + name 0 + album 0 + artist 0 + artist_top_genre 0 + release_date 0 + length 0 + popularity 0 + danceability 0 + acousticness 0 + energy 0 + instrumentalness 0 + liveness 0 + loudness 0 + speechiness 0 + tempo 0 + time_signature 0 + dtype: int64 + ``` + +1. Опис података: + + ```python + df.describe() + ``` + + | | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | + | ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- | + | count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | + | mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 | + | std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 | + | min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 | + | 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 | + | 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 | + | 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 | + | max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 | + +> 🤔 Ако радимо са кластерисањем, ненадгледаним методом који не захтева означене податке, зашто приказујемо ове податке са ознакама? У фази истраживања података, оне су корисне, али нису неопходне за рад алгоритама кластерисања. Могли бисмо једноставно уклонити заглавља колона и позивати се на податке по броју колоне. + +Погледајте опште вредности података. Имајте на уму да популарност може бити '0', што показује песме које немају ранг. Ускоро ћемо их уклонити. + +1. Користите стубичасти графикон да бисте сазнали који су жанрови најпопуларнији: + + ```python + import seaborn as sns + + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top[:5].index,y=top[:5].values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + ![most popular](../../../../5-Clustering/1-Visualize/images/popular.png) + +✅ Ако желите да видите више највиших вредности, промените `[:5]` у већу вредност или га уклоните да бисте видели све. + +Имајте на уму, када је најпопуларнији жанр описан као 'Missing', то значи да га Spotify није класификовао, па хајде да га уклонимо. + +1. Уклоните недостајуће податке филтрирањем: + + ```python + df = df[df['artist_top_genre'] != 'Missing'] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + Сада поново проверите жанрове: + + ![most popular](../../../../5-Clustering/1-Visualize/images/all-genres.png) + +1. Три најпопуларнија жанра доминирају овим скупом података. Фокусирајмо се на `afro dancehall`, `afropop` и `nigerian pop`, додатно филтрирајући скуп података да уклонимо све са вредношћу популарности 0 (што значи да није класификовано са популарношћу у скупу података и може се сматрати шумом за наше потребе): + + ```python + df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] + df = df[(df['popularity'] > 0)] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + +1. Урадите брзи тест да видите да ли подаци корелирају на неки посебно јак начин: + + ```python + corrmat = df.corr(numeric_only=True) + f, ax = plt.subplots(figsize=(12, 9)) + sns.heatmap(corrmat, vmax=.8, square=True) + ``` + + ![correlations](../../../../5-Clustering/1-Visualize/images/correlation.png) + + Једина јака корелација је између `energy` и `loudness`, што није изненађујуће, с обзиром на то да је гласна музика обично прилично енергична. У супротном, корелације су релативно слабе. Биће занимљиво видети шта алгоритам кластерисања може да направи од ових података. + + > 🎓 Имајте на уму да корелација не имплицира узрочност! Имамо доказ корелације, али немамо доказ узрочности. [Занимљив веб сајт](https://tylervigen.com/spurious-correlations) има визуализације које наглашавају ову тачку. + +Постоји ли нека конвергенција у овом скупу података око перципиране популарности песме и њене плесности? FacetGrid показује да постоје концентрични кругови који се поравнавају, без обзира на жанр. Да ли је могуће да се укуси у Нигерији конвергирају на одређеном нивоу плесности за овај жанр? + +✅ Испробајте различите тачке података (енергија, гласноћа, говорност) и више или различитих музичких жанрова. Шта можете открити? Погледајте табелу `df.describe()` да видите општи распон тачака података. + +### Вежба - расподела података + +Да ли се ова три жанра значајно разликују у перцепцији њихове плесности, на основу њихове популарности? + +1. Испитајте расподелу података за наша три најпопуларнија жанра у погледу популарности и плесности дуж задате x и y осе. + + ```python + sns.set_theme(style="ticks") + + g = sns.jointplot( + data=df, + x="popularity", y="danceability", hue="artist_top_genre", + kind="kde", + ) + ``` + + Можете открити концентричне кругове око опште тачке конвергенције, који показују расподелу тачака. + + > 🎓 Имајте на уму да овај пример користи KDE (Kernel Density Estimate) графикон који представља податке користећи континуирану криву густине вероватноће. Ово нам омогућава да интерпретирамо податке када радимо са више расподела. + + Уопштено, три жанра се лабаво поравнавају у смислу њихове популарности и плесности. Одређивање кластера у овим лабаво поравнатим подацима биће изазов: + + ![distribution](../../../../5-Clustering/1-Visualize/images/distribution.png) + +1. Направите графикон расејања: + + ```python + sns.FacetGrid(df, hue="artist_top_genre", height=5) \ + .map(plt.scatter, "popularity", "danceability") \ + .add_legend() + ``` + + Графикон расејања истих оса показује сличан образац конвергенције + + ![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png) + +Уопштено, за кластерисање можете користити графиконе расејања да бисте приказали кластере података, тако да је савладавање ове врсте визуализације веома корисно. У следећем часу, користићемо ове филтриране податке и применити k-means кластерисање како бисмо открили групе у овим подацима које се преклапају на занимљиве начине. + +--- + +## 🚀Изазов + +У припреми за следећи час, направите графикон о различитим алгоритмима кластерисања које бисте могли открити и користити у производном окружењу. Које врсте проблема кластерисање покушава да реши? + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Пре него што примените алгоритме кластерисања, као што смо научили, добра је идеја да разумете природу вашег скупа података. Прочитајте више о овој теми [овде](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) + +[Овај користан чланак](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) вас води кроз различите начине на које различити алгоритми кластерисања функционишу, с обзиром на различите облике података. + +## Задатак + +[Истражите друге визуализације за кластерисање](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/5-Clustering/1-Visualize/assignment.md b/translations/sr/5-Clustering/1-Visualize/assignment.md new file mode 100644 index 00000000..0ab15bc2 --- /dev/null +++ b/translations/sr/5-Clustering/1-Visualize/assignment.md @@ -0,0 +1,25 @@ + +# Истражите друге визуализације за кластеровање + +## Упутства + +У овој лекцији сте радили са неким техникама визуализације како бисте стекли увид у приказивање ваших података у припреми за кластеровање. Расејани графици (scatterplots), посебно, су корисни за проналажење група објеката. Истражите различите начине и различите библиотеке за креирање расејаних графика и документујте свој рад у свесци. Можете користити податке из ове лекције, других лекција или податке које сами пронађете (међутим, наведите извор тих података у вашој свесци). Прикажите неке податке користећи расејане графике и објасните шта сте открили. + +## Рубрика + +| Критеријум | Изузетно | Задовољавајуће | Потребно побољшање | +| ---------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------- | ---------------------------------- | +| | Свеска је представљена са пет добро документованих расејаних графика | Свеска је представљена са мање од пет расејаних графика и мање је добро документована | Представљена је непотпуна свеска | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људског преводиоца. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/5-Clustering/1-Visualize/solution/Julia/README.md b/translations/sr/5-Clustering/1-Visualize/solution/Julia/README.md new file mode 100644 index 00000000..4ca77d76 --- /dev/null +++ b/translations/sr/5-Clustering/1-Visualize/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/5-Clustering/2-K-Means/README.md b/translations/sr/5-Clustering/2-K-Means/README.md new file mode 100644 index 00000000..7029afc4 --- /dev/null +++ b/translations/sr/5-Clustering/2-K-Means/README.md @@ -0,0 +1,261 @@ + +# K-Means кластерисање + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +У овом лекцији ћете научити како да креирате кластере користећи Scikit-learn и нигеријски музички сет података који сте раније увезли. Покрићемо основе K-Means метода за кластерисање. Имајте на уму да, као што сте научили у претходној лекцији, постоји много начина за рад са кластерима, а метод који користите зависи од ваших података. Пробаћемо K-Means јер је то најчешћа техника кластерисања. Хајде да почнемо! + +Термини које ћете научити: + +- Силуетно оцењивање +- Елбоу метода +- Инерција +- Варијанса + +## Увод + +[K-Means кластерисање](https://wikipedia.org/wiki/K-means_clustering) је метода која потиче из области обраде сигнала. Користи се за поделу и груписање података у 'k' кластера користећи серију опсервација. Свака опсервација ради на груписању датих тачака података најближе њиховом 'средњем', или централној тачки кластера. + +Кластери се могу визуализовати као [Воронојеви дијаграми](https://wikipedia.org/wiki/Voronoi_diagram), који укључују тачку (или 'семе') и њену одговарајућу регију. + +![voronoi diagram](../../../../5-Clustering/2-K-Means/images/voronoi.png) + +> инфографика од [Jen Looper](https://twitter.com/jenlooper) + +Процес K-Means кластерисања [извршава се у три корака](https://scikit-learn.org/stable/modules/clustering.html#k-means): + +1. Алгоритам бира k-број централних тачака узорковањем из скупа података. Након тога, понавља: + 1. Додељује сваки узорак најближем центроиду. + 2. Креира нове центроиде узимајући средњу вредност свих узорака додељених претходним центроидима. + 3. Затим израчунава разлику између нових и старих центроида и понавља док се центроиди не стабилизују. + +Један недостатак коришћења K-Means је то што морате одредити 'k', односно број центроида. Срећом, 'елбоу метода' помаже у процени доброг почетног броја за 'k'. Ускоро ћете је испробати. + +## Предуслов + +Радићете у датотеци [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) која укључује увоз података и прелиминарно чишћење које сте урадили у претходној лекцији. + +## Вежба - припрема + +Почните тако што ћете поново погледати податке о песмама. + +1. Креирајте boxplot, позивајући `boxplot()` за сваку колону: + + ```python + plt.figure(figsize=(20,20), dpi=200) + + plt.subplot(4,3,1) + sns.boxplot(x = 'popularity', data = df) + + plt.subplot(4,3,2) + sns.boxplot(x = 'acousticness', data = df) + + plt.subplot(4,3,3) + sns.boxplot(x = 'energy', data = df) + + plt.subplot(4,3,4) + sns.boxplot(x = 'instrumentalness', data = df) + + plt.subplot(4,3,5) + sns.boxplot(x = 'liveness', data = df) + + plt.subplot(4,3,6) + sns.boxplot(x = 'loudness', data = df) + + plt.subplot(4,3,7) + sns.boxplot(x = 'speechiness', data = df) + + plt.subplot(4,3,8) + sns.boxplot(x = 'tempo', data = df) + + plt.subplot(4,3,9) + sns.boxplot(x = 'time_signature', data = df) + + plt.subplot(4,3,10) + sns.boxplot(x = 'danceability', data = df) + + plt.subplot(4,3,11) + sns.boxplot(x = 'length', data = df) + + plt.subplot(4,3,12) + sns.boxplot(x = 'release_date', data = df) + ``` + + Ови подаци су мало бучни: посматрајући сваку колону као boxplot, можете видети одступања. + + ![outliers](../../../../5-Clustering/2-K-Means/images/boxplots.png) + +Могли бисте проћи кроз сет података и уклонити ова одступања, али то би учинило податке прилично минималним. + +1. За сада, изаберите које колоне ћете користити за своју вежбу кластерисања. Одаберите оне са сличним опсегом и кодирајте колону `artist_top_genre` као нумеричке податке: + + ```python + from sklearn.preprocessing import LabelEncoder + le = LabelEncoder() + + X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')] + + y = df['artist_top_genre'] + + X['artist_top_genre'] = le.fit_transform(X['artist_top_genre']) + + y = le.transform(y) + ``` + +1. Сада треба да одредите колико кластера ћете циљати. Знате да постоје 3 жанра песама које смо издвојили из скупа података, па хајде да пробамо са 3: + + ```python + from sklearn.cluster import KMeans + + nclusters = 3 + seed = 0 + + km = KMeans(n_clusters=nclusters, random_state=seed) + km.fit(X) + + # Predict the cluster for each data point + + y_cluster_kmeans = km.predict(X) + y_cluster_kmeans + ``` + +Видећете низ исписан са предвиђеним кластерима (0, 1 или 2) за сваки ред у dataframe-у. + +1. Користите овај низ да израчунате 'силуетну оцену': + + ```python + from sklearn import metrics + score = metrics.silhouette_score(X, y_cluster_kmeans) + score + ``` + +## Силуетна оцена + +Тражите силуетну оцену ближу 1. Ова оцена варира од -1 до 1, и ако је оцена 1, кластер је густ и добро одвојен од других кластера. Вредност близу 0 представља преклапајуће кластере са узорцима веома близу граници одлуке суседних кластера. [(Извор)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam) + +Наша оцена је **.53**, што је негде у средини. Ово указује да наши подаци нису нарочито погодни за ову врсту кластерисања, али хајде да наставимо. + +### Вежба - изградња модела + +1. Увезите `KMeans` и започните процес кластерисања. + + ```python + from sklearn.cluster import KMeans + wcss = [] + + for i in range(1, 11): + kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42) + kmeans.fit(X) + wcss.append(kmeans.inertia_) + + ``` + + Постоји неколико делова овде који заслужују објашњење. + + > 🎓 range: Ово су итерације процеса кластерисања + + > 🎓 random_state: "Одређује генерисање случајних бројева за иницијализацију центроида." [Извор](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans) + + > 🎓 WCSS: "сума квадрата унутар кластера" мери просечну квадратну удаљеност свих тачака унутар кластера до центроида кластера. [Извор](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce). + + > 🎓 Инерција: K-Means алгоритми покушавају да изаберу центроиде како би минимизовали 'инерцију', "меру колико су кластери унутрашње кохерентни." [Извор](https://scikit-learn.org/stable/modules/clustering.html). Вредност се додаје променљивој wcss на свакој итерацији. + + > 🎓 k-means++: У [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) можете користити 'k-means++' оптимизацију, која "иницијализује центроиде да буду (углавном) удаљени један од другог, што доводи до вероватно бољих резултата него случајна иницијализација." + +### Елбоу метода + +Раније сте претпоставили да, пошто сте циљали 3 жанра песама, треба да изаберете 3 кластера. Али да ли је то случај? + +1. Користите 'елбоу методу' да се уверите. + + ```python + plt.figure(figsize=(10,5)) + sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red') + plt.title('Elbow') + plt.xlabel('Number of clusters') + plt.ylabel('WCSS') + plt.show() + ``` + + Користите променљиву `wcss` коју сте изградили у претходном кораку да креирате графикон који показује где је 'прелом' у лакту, што указује на оптималан број кластера. Можда је то **заиста** 3! + + ![elbow method](../../../../5-Clustering/2-K-Means/images/elbow.png) + +## Вежба - приказ кластера + +1. Поновите процес, овог пута постављајући три кластера, и прикажите кластере као scatterplot: + + ```python + from sklearn.cluster import KMeans + kmeans = KMeans(n_clusters = 3) + kmeans.fit(X) + labels = kmeans.predict(X) + plt.scatter(df['popularity'],df['danceability'],c = labels) + plt.xlabel('popularity') + plt.ylabel('danceability') + plt.show() + ``` + +1. Проверите тачност модела: + + ```python + labels = kmeans.labels_ + + correct_labels = sum(y == labels) + + print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size)) + + print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size))) + ``` + + Тачност овог модела није баш добра, а облик кластера вам даје наговештај зашто. + + ![clusters](../../../../5-Clustering/2-K-Means/images/clusters.png) + + Ови подаци су превише неуравнотежени, премало корелисани и постоји превелика варијанса између вредности колона да би се добро кластерисали. У ствари, кластери који се формирају вероватно су снажно утицани или искривљени од стране три категорије жанра које смо горе дефинисали. То је био процес учења! + + У документацији Scikit-learn-а можете видети да модел попут овог, са кластерима који нису баш добро разграничени, има проблем 'варијансе': + + ![problem models](../../../../5-Clustering/2-K-Means/images/problems.png) + > Инфографика из Scikit-learn-а + +## Варијанса + +Варијанса је дефинисана као "просек квадратних разлика од средње вредности" [(Извор)](https://www.mathsisfun.com/data/standard-deviation.html). У контексту овог проблема кластерисања, она се односи на податке где бројеви нашег скупа података имају тенденцију да се превише удаљавају од средње вредности. + +✅ Ово је одличан тренутак да размислите о свим начинима на које бисте могли да исправите овај проблем. Да ли да мало више прилагодите податке? Да ли да користите друге колоне? Да ли да користите другачији алгоритам? Савет: Пробајте [скалирање података](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) да их нормализујете и тестирајте друге колоне. + +> Пробајте овај '[калкулатор варијансе](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' да боље разумете концепт. + +--- + +## 🚀Изазов + +Проведите мало времена са овим notebook-ом, прилагођавајући параметре. Можете ли побољшати тачност модела чишћењем података (на пример, уклањањем одступања)? Можете користити тежине да дате већу тежину одређеним узорцима података. Шта још можете урадити да креирате боље кластере? + +Савет: Пробајте да скалирате своје податке. У notebook-у постоји коментарисан код који додаје стандардно скалирање како би колоне података више личиле једна на другу у смислу опсега. Приметићете да, иако силуетна оцена опада, 'прелом' у графикону лакта се изравнава. То је зато што остављање података нескалираним омогућава подацима са мањом варијансом да носе већу тежину. Прочитајте мало више о овом проблему [овде](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226). + +## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Погледајте симулатор K-Means [као што је овај](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Можете користити овај алат за визуализацију узорака података и одређивање њихових центроида. Можете уређивати случајност података, број кластера и број центроида. Да ли вам ово помаже да добијете идеју о томе како се подаци могу груписати? + +Такође, погледајте [овај материјал о K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) са Станфорда. + +## Задатак + +[Испробајте различите методе кластерисања](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/5-Clustering/2-K-Means/assignment.md b/translations/sr/5-Clustering/2-K-Means/assignment.md new file mode 100644 index 00000000..36844370 --- /dev/null +++ b/translations/sr/5-Clustering/2-K-Means/assignment.md @@ -0,0 +1,25 @@ + +# Испробајте различите методе кластерисања + +## Упутства + +У овој лекцији сте научили о К-Меанс кластерисању. Понекад К-Меанс није одговарајући за ваше податке. Направите бележницу користећи податке из ових лекција или из неког другог извора (наведите извор) и покажите другачију методу кластерисања која НЕ користи К-Меанс. Шта сте научили? + +## Рубрика + +| Критеријум | Изузетно | Прихватљиво | Потребно побољшање | +| ---------- | ------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------- | +| | Бележница је представљена са добро документованим моделом кластерисања | Бележница је представљена без добре документације и/или је непотпуна | Поднет је непотпун рад | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/5-Clustering/2-K-Means/solution/Julia/README.md b/translations/sr/5-Clustering/2-K-Means/solution/Julia/README.md new file mode 100644 index 00000000..db9bbfe2 --- /dev/null +++ b/translations/sr/5-Clustering/2-K-Means/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/5-Clustering/README.md b/translations/sr/5-Clustering/README.md new file mode 100644 index 00000000..056375c3 --- /dev/null +++ b/translations/sr/5-Clustering/README.md @@ -0,0 +1,42 @@ + +# Модели кластерисања за машинско учење + +Кластерисање је задатак машинског учења који има за циљ да пронађе објекте који личе један на други и групише их у групе које се називају кластери. Оно што кластерисање разликује од других приступа у машинском учењу је то што се ствари дешавају аутоматски; заправо, може се рећи да је то супротност надгледаном учењу. + +## Регионална тема: модели кластерисања за музички укус публике у Нигерији 🎧 + +Разнолика публика у Нигерији има разнолике музичке укусе. Користећи податке прикупљене са Spotify-а (инспирисано [овим чланком](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)), погледајмо неке од популарних песама у Нигерији. Овај скуп података укључује информације о различитим песмама као што су оцена 'плесности', 'акустичности', јачина звука, 'говорност', популарност и енергија. Биће занимљиво открити обрасце у овим подацима! + +![Грамофон](../../../5-Clustering/images/turntable.jpg) + +> Фотографија од Marcela Laskoski на Unsplash + +У овом низу лекција открићете нове начине за анализу података користећи технике кластерисања. Кластерисање је посебно корисно када вашем скупу података недостају ознаке. Ако има ознаке, онда би технике класификације, као оне које сте научили у претходним лекцијама, могле бити корисније. Али у случајевима када желите да групишете податке без ознака, кластерисање је одличан начин за откривање образаца. + +> Постоје корисни алати са мало кода који вам могу помоћи да научите како да радите са моделима кластерисања. Пробајте [Azure ML за овај задатак](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Лекције + +1. [Увод у кластерисање](1-Visualize/README.md) +2. [К-Меанс кластерисање](2-K-Means/README.md) + +## Кредити + +Ове лекције су написане са 🎶 од стране [Jen Looper](https://www.twitter.com/jenlooper) уз корисне рецензије од [Rishit Dagli](https://rishit_dagli) и [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan). + +Скуп података [Нигеријске песме](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) је преузет са Kaggle-а као прикупљен са Spotify-а. + +Корисни примери К-Меанс кластерисања који су помогли у креирању ове лекције укључују ову [анализу ириса](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), овај [уводни нотебук](https://www.kaggle.com/prashant111/k-means-clustering-with-python), и овај [хипотетички пример НВО](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering). + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/1-Introduction-to-NLP/README.md b/translations/sr/6-NLP/1-Introduction-to-NLP/README.md new file mode 100644 index 00000000..d52bb8b9 --- /dev/null +++ b/translations/sr/6-NLP/1-Introduction-to-NLP/README.md @@ -0,0 +1,179 @@ + +# Увод у обраду природног језика + +Ова лекција покрива кратку историју и важне концепте *обраде природног језика*, подпоља *рачунарске лингвистике*. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Увод + +НЛП, како се често назива, је једна од најпознатијих области у којима је машинско учење примењено и коришћено у производном софтверу. + +✅ Можете ли да се сетите софтвера који користите свакодневно, а који вероватно има уграђен НЛП? Шта је са вашим програмима за обраду текста или мобилним апликацијама које редовно користите? + +Научићете о: + +- **Идеји језика**. Како су језици развијени и која су главна подручја проучавања. +- **Дефиницији и концептима**. Такође ћете научити дефиниције и концепте о томе како рачунари обрађују текст, укључујући парсирање, граматику и идентификовање именица и глагола. У овој лекцији постоје неки задаци кодирања, а представљени су неколико важних концепата које ћете касније научити да кодирате у наредним лекцијама. + +## Рачунарска лингвистика + +Рачунарска лингвистика је област истраживања и развоја током многих деценија која проучава како рачунари могу да раде са језицима, па чак и да их разумеју, преводе и комуницирају. Обрада природног језика (НЛП) је сродна област која се фокусира на то како рачунари могу да обрађују 'природне', односно људске језике. + +### Пример - диктирање на телефону + +Ако сте икада диктирали текст на телефону уместо да га куцате или питали виртуелног асистента неко питање, ваш говор је претворен у текстуални облик, а затим обрађен или *парсиран* из језика који сте говорили. Детектоване кључне речи су затим обрађене у формат који телефон или асистент може да разуме и на основу њих делује. + +![разумевање](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png) +> Право лингвистичко разумевање је тешко! Слика од [Jen Looper](https://twitter.com/jenlooper) + +### Како је ова технологија омогућена? + +Ово је могуће јер је неко написао компјутерски програм да то уради. Пре неколико деценија, неки писци научне фантастике су предвидели да ће људи углавном разговарати са својим рачунарима, а рачунари ће увек тачно разумети шта мисле. Нажалост, испоставило се да је то тежи проблем него што су многи замишљали, и иако је данас много боље разумљив проблем, постоје значајни изазови у постизању 'савршене' обраде природног језика када је у питању разумевање значења реченице. Ово је посебно тежак проблем када је у питању разумевање хумора или откривање емоција као што је сарказам у реченици. + +У овом тренутку, можда се сећате школских часова где је наставник обрађивао делове граматике у реченици. У неким земљама, ученици уче граматику и лингвистику као посебан предмет, али у многима, ове теме су укључене као део учења језика: било вашег првог језика у основној школи (учење читања и писања) и можда другог језика у средњој школи. Не брините ако нисте стручњак за разликовање именица од глагола или прилога од придева! + +Ако се борите са разликом између *простог садашњег времена* и *садашњег прогресивног времена*, нисте сами. Ово је изазовна ствар за многе људе, чак и за изворне говорнике језика. Добра вест је да су рачунари заиста добри у примени формалних правила, и научићете да пишете код који може *парсирати* реченицу једнако добро као човек. Већи изазов који ћете касније испитати је разумевање *значења* и *осећаја* реченице. + +## Предуслови + +За ову лекцију, главни предуслов је способност читања и разумевања језика ове лекције. Нема математичких проблема или једначина за решавање. Иако је оригинални аутор написао ову лекцију на енглеском, она је такође преведена на друге језике, тако да можете читати превод. Постоје примери где се користи више различитих језика (за поређење различитих граматичких правила различитих језика). Ови примери *нису* преведени, али је објашњавајући текст преведен, тако да би значење требало да буде јасно. + +За задатке кодирања, користићете Python, а примери користе Python 3.8. + +У овом делу, биће вам потребно и користићете: + +- **Разумевање Python 3**. Разумевање програмског језика Python 3, ова лекција користи унос, петље, читање датотека, низове. +- **Visual Studio Code + екстензија**. Користићемо Visual Studio Code и његову Python екстензију. Такође можете користити Python IDE по вашем избору. +- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) је поједностављена библиотека за обраду текста за Python. Пратите упутства на TextBlob сајту да га инсталирате на свој систем (инсталирајте и корпусе, као што је приказано испод): + + ```bash + pip install -U textblob + python -m textblob.download_corpora + ``` + +> 💡 Савет: Python можете покренути директно у VS Code окружењима. Погледајте [документацију](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) за више информација. + +## Разговор са машинама + +Историја покушаја да се рачунари натерају да разумеју људски језик сеже деценијама уназад, а један од најранијих научника који је разматрао обраду природног језика био је *Алан Тјуринг*. + +### 'Тјурингов тест' + +Када је Тјуринг истраживао *вештачку интелигенцију* 1950-их, разматрао је да ли би се могао дати тест разговора човеку и рачунару (путем куцане преписке) где човек у разговору није сигуран да ли разговара са другим човеком или рачунаром. + +Ако, након одређене дужине разговора, човек не може да утврди да ли су одговори од рачунара или не, да ли би се онда могло рећи да рачунар *мисли*? + +### Инспирација - 'игра имитације' + +Идеја за ово је дошла из друштвене игре зване *Игра имитације* где је испитивач сам у соби и има задатак да утврди који од двоје људи (у другој соби) су мушко и женско. Испитивач може слати белешке и мора покушати да смисли питања где писани одговори откривају пол мистериозне особе. Наравно, играчи у другој соби покушавају да збуне испитивача тако што одговарају на питања на начин који га доводи у заблуду, док истовремено дају изглед да одговарају искрено. + +### Развој Елајзе + +1960-их, научник са МИТ-а по имену *Џозеф Вајзенбаум* развио је [*Елајзу*](https://wikipedia.org/wiki/ELIZA), компјутерског 'терапеута' који би постављао питања човеку и давао изглед да разуме његове одговоре. Међутим, иако је Елајза могла да парсира реченицу и идентификује одређене граматичке конструкције и кључне речи како би дала разумни одговор, није се могло рећи да *разуме* реченицу. Ако би Елајзи била представљена реченица у формату "**Ја сам** тужан", могла би да преуреди и замени речи у реченици да формира одговор "Колико дуго сте **ви били** тужни". + +Ово је давало утисак да Елајза разуме изјаву и поставља пратеће питање, док је у стварности мењала време и додавала неке речи. Ако Елајза није могла да идентификује кључну реч за коју има одговор, уместо тога би дала насумичан одговор који би могао бити применљив на многе различите изјаве. Елајза се могла лако преварити, на пример ако би корисник написао "**Ти си** бицикл", могла би да одговори са "Колико дуго сам **ја био** бицикл?", уместо разумнијег одговора. + +[![Разговор са Елајзом](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Разговор са Елајзом") + +> 🎥 Кликните на слику изнад за видео о оригиналном Елајза програму + +> Напомена: Можете прочитати оригинални опис [Елајзе](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) објављен 1966. ако имате ACM налог. Алтернативно, прочитајте о Елајзи на [википедији](https://wikipedia.org/wiki/ELIZA) + +## Вежба - кодирање основног конверзационог бота + +Конверзациони бот, као Елајза, је програм који изазива унос корисника и изгледа да разуме и одговара интелигентно. За разлику од Елајзе, наш бот неће имати неколико правила која му дају изглед интелигентног разговора. Уместо тога, наш бот ће имати само једну способност, да настави разговор са насумичним одговорима који би могли функционисати у готово сваком тривијалном разговору. + +### План + +Ваши кораци при изради конверзационог бота: + +1. Испишите упутства која саветују корисника како да комуницира са ботом +2. Покрените петљу + 1. Прихватите унос корисника + 2. Ако корисник затражи излаз, изађите + 3. Обрадите унос корисника и одредите одговор (у овом случају, одговор је насумичан избор из листе могућих општих одговора) + 4. Испишите одговор +3. Вратите се на корак 2 + +### Израда бота + +Хајде да следеће направимо бота. Почећемо дефинисањем неких фраза. + +1. Направите овог бота сами у Python-у са следећим насумичним одговорима: + + ```python + random_responses = ["That is quite interesting, please tell me more.", + "I see. Do go on.", + "Why do you say that?", + "Funny weather we've been having, isn't it?", + "Let's change the subject.", + "Did you catch the game last night?"] + ``` + + Ево неког примерног излаза који ће вас водити (унос корисника је на линијама које почињу са `>`): + + ```output + Hello, I am Marvin, the simple robot. + You can end this conversation at any time by typing 'bye' + After typing each answer, press 'enter' + How are you today? + > I am good thanks + That is quite interesting, please tell me more. + > today I went for a walk + Did you catch the game last night? + > I did, but my team lost + Funny weather we've been having, isn't it? + > yes but I hope next week is better + Let's change the subject. + > ok, lets talk about music + Why do you say that? + > because I like music! + Why do you say that? + > bye + It was nice talking to you, goodbye! + ``` + + Једно могуће решење задатка је [овде](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py) + + ✅ Зауставите се и размислите + + 1. Да ли мислите да би насумични одговори 'преварили' некога да помисли да бот заиста разуме њих? + 2. Које карактеристике би бот требало да има да би био ефикаснији? + 3. Ако би бот заиста могао да 'разуме' значење реченице, да ли би морао да 'памти' значење претходних реченица у разговору? + +--- + +## 🚀Изазов + +Изаберите један од елемената "зауставите се и размислите" изнад и покушајте да га имплементирате у коду или напишите решење на папиру користећи псеудокод. + +У следећој лекцији, научићете о бројним другим приступима парсирању природног језика и машинском учењу. + +## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Погледајте референце испод као могућности за даље читање. + +### Референце + +1. Шуберт, Ленхарт, "Рачунарска лингвистика", *Станфордска енциклопедија филозофије* (Пролећно издање 2020), Едвард Н. Залта (ур.), URL = . +2. Принстон универзитет "О WordNet-у." [WordNet](https://wordnet.princeton.edu/). Принстон универзитет. 2010. + +## Задатак + +[Претражите бота](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/1-Introduction-to-NLP/assignment.md b/translations/sr/6-NLP/1-Introduction-to-NLP/assignment.md new file mode 100644 index 00000000..852b9992 --- /dev/null +++ b/translations/sr/6-NLP/1-Introduction-to-NLP/assignment.md @@ -0,0 +1,25 @@ + +# Потрага за ботом + +## Упутства + +Ботови су свуда око нас. Ваш задатак: пронађите једног и усвојите га! Можете их пронаћи на веб сајтовима, у апликацијама за банкарство и на телефону, на пример када позовете финансијске компаније за савет или информације о налогу. Анализирајте бота и проверите да ли можете да га збуните. Ако успете да га збуните, зашто мислите да се то догодило? Напишите кратак есеј о вашем искуству. + +## Рубрика + +| Критеријум | Изузетно | Задовољавајуће | Потребно побољшање | +| ---------- | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------- | --------------------- | +| | Написан је цео есеј на једној страници, који објашњава претпостављену архитектуру бота и описује ваше искуство | Есеј је непотпун или недовољно истражен | Есеј није предат | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/2-Tasks/README.md b/translations/sr/6-NLP/2-Tasks/README.md new file mode 100644 index 00000000..745e238a --- /dev/null +++ b/translations/sr/6-NLP/2-Tasks/README.md @@ -0,0 +1,228 @@ + +# Уобичајени задаци и технике обраде природног језика + +За већину задатака обраде *природног језика*, текст који се обрађује мора бити разложен, анализиран, а резултати сачувани или упоређени са правилима и скуповима података. Ови задаци омогућавају програмеру да изведе _значење_, _намеру_ или само _учесталост_ термина и речи у тексту. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +Хајде да откријемо уобичајене технике које се користе у обради текста. У комбинацији са машинским учењем, ове технике вам помажу да ефикасно анализирате велике количине текста. Међутим, пре него што примените машинско учење на ове задатке, важно је разумети проблеме са којима се сусреће специјалиста за обраду природног језика. + +## Уобичајени задаци у обради природног језика + +Постоје различити начини за анализу текста на којем радите. Постоје задаци које можете извршити, а кроз те задатке можете стећи разумевање текста и извући закључке. Ове задатке обично извршавате у одређеном редоследу. + +### Токенизација + +Вероватно прва ствар коју већина алгоритама за обраду природног језика мора да уради јесте да подели текст на токене, или речи. Иако ово звучи једноставно, узимање у обзир интерпункције и различитих језичких разграничења речи и реченица може бити компликовано. Можда ћете морати да користите различите методе за одређивање граница. + +![токенизација](../../../../6-NLP/2-Tasks/images/tokenization.png) +> Токенизација реченице из **Гордости и предрасуда**. Инфографика од [Jen Looper](https://twitter.com/jenlooper) + +### Ембединг + +[Ембединг речи](https://wikipedia.org/wiki/Word_embedding) је начин да се ваш текстуални подаци конвертују у нумерички облик. Ембединг се ради тако да речи са сличним значењем или речи које се често користе заједно буду груписане. + +![ембединг речи](../../../../6-NLP/2-Tasks/images/embedding.png) +> "Имам највеће поштовање према вашим нервима, они су моји стари пријатељи." - Ембединг речи за реченицу из **Гордости и предрасуда**. Инфографика од [Jen Looper](https://twitter.com/jenlooper) + +✅ Испробајте [овај занимљив алат](https://projector.tensorflow.org/) за експериментисање са ембедингом речи. Кликом на једну реч приказују се групе сличних речи: 'toy' је груписан са 'disney', 'lego', 'playstation' и 'console'. + +### Парсирање и означавање делова говора + +Свака реч која је токенизована може бити означена као део говора - именица, глагол или придев. Реченица `the quick red fox jumped over the lazy brown dog` може бити означена као fox = именица, jumped = глагол. + +![парсирање](../../../../6-NLP/2-Tasks/images/parse.png) + +> Парсирање реченице из **Гордости и предрасуда**. Инфографика од [Jen Looper](https://twitter.com/jenlooper) + +Парсирање подразумева препознавање које речи су међусобно повезане у реченици - на пример, `the quick red fox jumped` је секвенца придев-именица-глагол која је одвојена од секвенце `lazy brown dog`. + +### Учесталост речи и фраза + +Корисна процедура при анализи великог текста је изградња речника сваке речи или фразе од интереса и учесталости њиховог појављивања. Фраза `the quick red fox jumped over the lazy brown dog` има учесталост речи 2 за the. + +Хајде да погледамо пример текста где бројимо учесталост речи. Песма Редијарда Киплинга "The Winners" садржи следећи стих: + +```output +What the moral? Who rides may read. +When the night is thick and the tracks are blind +A friend at a pinch is a friend, indeed, +But a fool to wait for the laggard behind. +Down to Gehenna or up to the Throne, +He travels the fastest who travels alone. +``` + +Како учесталост фраза може бити осетљива или неосетљива на велика и мала слова, фраза `a friend` има учесталост 2, `the` има учесталост 6, а `travels` је 2. + +### N-грамови + +Текст се може поделити на секвенце речи одређене дужине, једна реч (униграм), две речи (биграм), три речи (триграм) или било који број речи (n-грам). + +На пример, `the quick red fox jumped over the lazy brown dog` са n-грам оценом 2 производи следеће n-грамове: + +1. the quick +2. quick red +3. red fox +4. fox jumped +5. jumped over +6. over the +7. the lazy +8. lazy brown +9. brown dog + +Можда је лакше визуализовати то као клизну кутију преко реченице. Ево како изгледа за n-грамове од 3 речи, n-грам је означен у свакој реченици: + +1. **the quick red** fox jumped over the lazy brown dog +2. the **quick red fox** jumped over the lazy brown dog +3. the quick **red fox jumped** over the lazy brown dog +4. the quick red **fox jumped over** the lazy brown dog +5. the quick red fox **jumped over the** lazy brown dog +6. the quick red fox jumped **over the lazy** brown dog +7. the quick red fox jumped over **the lazy brown** dog +8. the quick red fox jumped over the **lazy brown dog** + +![клизни прозор n-грамова](../../../../6-NLP/2-Tasks/images/n-grams.gif) + +> Вредност n-грама 3: Инфографика од [Jen Looper](https://twitter.com/jenlooper) + +### Екстракција именичких фраза + +У већини реченица постоји именица која је субјекат или објекат реченице. У енглеском језику често се може идентификовати као реч која има 'a', 'an' или 'the' испред себе. Идентификовање субјекта или објекта реченице кроз 'екстракцију именичке фразе' је уобичајен задатак у обради природног језика када се покушава разумети значење реченице. + +✅ У реченици "I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun.", можете ли идентификовати именичке фразе? + +У реченици `the quick red fox jumped over the lazy brown dog` постоје 2 именичке фразе: **quick red fox** и **lazy brown dog**. + +### Анализа сентимента + +Реченица или текст могу се анализирати за сентимент, односно колико су *позитивни* или *негативни*. Сентимент се мери кроз *поларитет* и *објективност/субјективност*. Поларитет се мери од -1.0 до 1.0 (негативно до позитивно) и 0.0 до 1.0 (најобјективније до најсубјективније). + +✅ Касније ћете научити да постоје различити начини за одређивање сентимента користећи машинско учење, али један начин је да имате листу речи и фраза које су категорисане као позитивне или негативне од стране људског експерта и примените тај модел на текст да бисте израчунали оцену поларитета. Можете ли видети како би ово функционисало у неким околностима, а мање добро у другим? + +### Инфлексија + +Инфлексија вам омогућава да узмете реч и добијете њен једнину или множину. + +### Лематизација + +*Лема* је корен или основна реч за скуп речи, на пример *flew*, *flies*, *flying* имају лему глагола *fly*. + +Такође постоје корисне базе података доступне истраживачима обраде природног језика, нарочито: + +### WordNet + +[WordNet](https://wordnet.princeton.edu/) је база података речи, синонима, антонима и многих других детаља за сваку реч на многим различитим језицима. Изузетно је корисна када се покушавају изградити преводи, провере правописа или алати за језик било које врсте. + +## Библиотеке за обраду природног језика + +Срећом, не морате сами да градите све ове технике, јер постоје одличне Python библиотеке које чине обраду природног језика много приступачнијом за програмере који нису специјализовани за обраду природног језика или машинско учење. У наредним лекцијама биће више примера ових библиотека, али овде ћете научити неке корисне примере који ће вам помоћи у следећем задатку. + +### Вежба - коришћење библиотеке `TextBlob` + +Хајде да користимо библиотеку TextBlob јер садржи корисне API-је за решавање ових типова задатака. TextBlob "се ослања на гигантска рамена [NLTK](https://nltk.org) и [pattern](https://github.com/clips/pattern), и лепо сарађује са оба." Има значајну количину машинског учења уграђену у свој API. + +> Напомена: Корисни [Quick Start](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) водич је доступан за TextBlob и препоручује се искусним Python програмерима. + +Када покушавате да идентификујете *именичке фразе*, TextBlob нуди неколико опција екстрактора за проналажење именица. + +1. Погледајте `ConllExtractor`. + + ```python + from textblob import TextBlob + from textblob.np_extractors import ConllExtractor + # import and create a Conll extractor to use later + extractor = ConllExtractor() + + # later when you need a noun phrase extractor: + user_input = input("> ") + user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified + np = user_input_blob.noun_phrases + ``` + + > Шта се овде дешава? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) је "Екстрактор именица који користи chunk парсирање обучено са ConLL-2000 корпусом за обуку." ConLL-2000 се односи на Конференцију о рачунарском учењу природног језика из 2000. године. Сваке године конференција је организовала радионицу за решавање сложеног проблема обраде природног језика, а 2000. године то је било chunking именица. Модел је обучен на Wall Street Journal-у, са "секцијама 15-18 као подаци за обуку (211727 токена) и секцијом 20 као тест подаци (47377 токена)". Можете погледати процедуре коришћене [овде](https://www.clips.uantwerpen.be/conll2000/chunking/) и [резултате](https://ifarm.nl/erikt/research/np-chunking.html). + +### Изазов - побољшање вашег бота уз обраду природног језика + +У претходној лекцији направили сте веома једноставан Q&A бот. Сада ћете учинити Марвина мало симпатичнијим анализирајући ваш унос за сентимент и штампајући одговор који одговара сентименту. Такође ћете морати да идентификујете `noun_phrase` и поставите питање о њој. + +Ваши кораци при изградњи бољег конверзационог бота: + +1. Штампајте упутства која саветују корисника како да комуницира са ботом +2. Покрените петљу + 1. Прихватите унос корисника + 2. Ако корисник затражи излаз, изађите + 3. Обрадите унос корисника и одредите одговарајући сентимент одговор + 4. Ако је именица детектована у сентименту, множите је и поставите додатно питање о тој теми + 5. Штампајте одговор +3. Вратите се на корак 2 + +Ево исечка кода за одређивање сентимента користећи TextBlob. Напомена: постоје само четири *градијента* сентимент одговора (можете додати више ако желите): + +```python +if user_input_blob.polarity <= -0.5: + response = "Oh dear, that sounds bad. " +elif user_input_blob.polarity <= 0: + response = "Hmm, that's not great. " +elif user_input_blob.polarity <= 0.5: + response = "Well, that sounds positive. " +elif user_input_blob.polarity <= 1: + response = "Wow, that sounds great. " +``` + +Ево примера излазног резултата који вас може водити (кориснички унос је на линијама које почињу са >): + +```output +Hello, I am Marvin, the friendly robot. +You can end this conversation at any time by typing 'bye' +After typing each answer, press 'enter' +How are you today? +> I am ok +Well, that sounds positive. Can you tell me more? +> I went for a walk and saw a lovely cat +Well, that sounds positive. Can you tell me more about lovely cats? +> cats are the best. But I also have a cool dog +Wow, that sounds great. Can you tell me more about cool dogs? +> I have an old hounddog but he is sick +Hmm, that's not great. Can you tell me more about old hounddogs? +> bye +It was nice talking to you, goodbye! +``` + +Једно могуће решење задатка је [овде](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py) + +✅ Провера знања + +1. Мислите ли да би симпатични одговори могли 'преварити' некога да помисли да бот заиста разуме њих? +2. Да ли идентификовање именице чини бота 'веродостојнијим'? +3. Зашто би екстракција 'именице' из реченице била корисна ствар? + +--- + +Имплементирајте бота из претходне провере знања и тестирајте га на пријатељу. Може ли их преварити? Можете ли учинити вашег бота 'веродостојнијим'? + +## 🚀Изазов + +Узмите задатак из претходне провере знања и покушајте да га имплементирате. Тестирајте бота на пријатељу. Може ли их преварити? Можете ли учинити вашег бота 'веродостојнијим'? + +## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +У наредним лекцијама ћете научити више о анализи сентимента. Истражите ову занимљиву технику у чланцима као што су они на [KDNuggets](https://www.kdnuggets.com/tag/nlp) + +## Задатак + +[Учини да бот одговара](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације, препоручује се професионални превод од стране људског преводиоца. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/2-Tasks/assignment.md b/translations/sr/6-NLP/2-Tasks/assignment.md new file mode 100644 index 00000000..587c4008 --- /dev/null +++ b/translations/sr/6-NLP/2-Tasks/assignment.md @@ -0,0 +1,25 @@ + +# Направите да бот одговара + +## Упутства + +У претходним лекцијама, програмирали сте основног бота са којим можете да разговарате. Овај бот даје насумичне одговоре све док не кажете 'збогом'. Можете ли учинити да одговори буду мало мање насумични и да се активирају када кажете одређене ствари, као што су 'зашто' или 'како'? Размислите како би машинско учење могло учинити овај тип рада мање ручним док проширујете свог бота. Можете користити библиотеке NLTK или TextBlob како бисте олакшали задатке. + +## Рубрика + +| Критеријум | Изузетно | Задовољавајуће | Потребна побољшања | +| ---------- | ------------------------------------------- | ------------------------------------------------ | ----------------------- | +| | Нови bot.py фајл је представљен и документован | Нови бот фајл је представљен, али садржи грешке | Фајл није представљен | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/3-Translation-Sentiment/README.md b/translations/sr/6-NLP/3-Translation-Sentiment/README.md new file mode 100644 index 00000000..36dd1b95 --- /dev/null +++ b/translations/sr/6-NLP/3-Translation-Sentiment/README.md @@ -0,0 +1,190 @@ + +# Превод и анализа сентимента уз помоћ машинског учења + +У претходним лекцијама научили сте како да направите основног бота користећи `TextBlob`, библиотеку која користи машинско учење у позадини за обављање основних NLP задатака као што је издвајање именица. Један од важних изазова у рачунарској лингвистици је тачна _превод_ реченице са једног говорног или писаног језика на други. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +Превод је веома тежак проблем, додатно компликован чињеницом да постоје хиљаде језика, а сваки од њих може имати веома различита граматичка правила. Један приступ је конвертовање формалних граматичких правила једног језика, као што је енглески, у структуру која није зависна од језика, а затим превођење тако што се та структура враћа у други језик. Овај приступ подразумева следеће кораке: + +1. **Идентификација**. Идентификујте или означите речи у улазном језику као именице, глаголе итд. +2. **Креирање превода**. Направите директан превод сваке речи у формату циљног језика. + +### Пример реченице, енглески у ирски + +На енглеском, реченица _I feel happy_ има три речи у следећем редоследу: + +- **субјекат** (I) +- **глагол** (feel) +- **придев** (happy) + +Међутим, на ирском језику, иста реченица има веома другачију граматичку структуру - емоције као што су "*срећан*" или "*тужан*" изражавају се као да су *на теби*. + +Енглеска фраза `I feel happy` на ирском би била `Tá athas orm`. *Буквалан* превод би био `Срећа је на мени`. + +Говорник ирског језика који преводи на енглески рекао би `I feel happy`, а не `Happy is upon me`, јер разуме значење реченице, чак и ако су речи и структура реченице различите. + +Формални редослед за реченицу на ирском је: + +- **глагол** (Tá или је) +- **придев** (athas, или срећан) +- **субјекат** (orm, или на мени) + +## Превод + +Наивни програм за превођење могао би да преводи само речи, игноришући структуру реченице. + +✅ Ако сте научили други (или трећи или више) језик као одрасла особа, можда сте почели тако што сте размишљали на свом матерњем језику, преводећи концепт реч по реч у својој глави на други језик, а затим изговарали свој превод. Ово је слично ономе што раде наивни компјутерски програми за превођење. Важно је превазићи ову фазу да бисте постигли течност! + +Наивно превођење доводи до лоших (а понекад и смешних) погрешних превода: `I feel happy` буквално се преводи као `Mise bhraitheann athas` на ирском. То значи (буквално) `ја осећам срећу` и није валидна ирска реченица. Иако су енглески и ирски језици који се говоре на два суседна острва, они су веома различити језици са различитим граматичким структурама. + +> Можете погледати неке видео снимке о ирским лингвистичким традицијама као што је [овај](https://www.youtube.com/watch?v=mRIaLSdRMMs) + +### Приступи машинског учења + +До сада сте научили о приступу формалних правила у обради природног језика. Други приступ је игнорисање значења речи и _уместо тога коришћење машинског учења за откривање образаца_. Ово може функционисати у превођењу ако имате много текста (*корпус*) или текстова (*корпора*) на оба језика - изворном и циљном. + +На пример, узмите у обзир случај *Гордости и предрасуда*, познатог енглеског романа који је написала Џејн Остин 1813. године. Ако консултујете књигу на енглеском и људски превод књиге на *француски*, могли бисте открити фразе у једном које су _идиоматски_ преведене у други. Ускоро ћете то урадити. + +На пример, када се енглеска фраза `I have no money` буквално преведе на француски, могла би постати `Je n'ai pas de monnaie`. "Monnaie" је незгодан француски 'лажни сродник', јер 'money' и 'monnaie' нису синоними. Бољи превод који би човек могао направити био би `Je n'ai pas d'argent`, јер боље преноси значење да немате новца (уместо 'ситниша', што је значење 'monnaie'). + +![monnaie](../../../../6-NLP/3-Translation-Sentiment/images/monnaie.png) + +> Слика од [Jen Looper](https://twitter.com/jenlooper) + +Ако ML модел има довољно људских превода за изградњу модела, може побољшати тачност превода идентификовањем уобичајених образаца у текстовима који су претходно преведени од стране стручних говорника оба језика. + +### Вежба - превођење + +Можете користити `TextBlob` за превођење реченица. Пробајте чувену прву реченицу из **Гордости и предрасуда**: + +```python +from textblob import TextBlob + +blob = TextBlob( + "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!" +) +print(blob.translate(to="fr")) + +``` + +`TextBlob` ради прилично добар превод: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!". + +Може се тврдити да је превод TextBlob-а далеко прецизнији, у ствари, од француског превода књиге из 1932. године од стране В. Леконта и Ш. Пресоара: + +"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles." + +У овом случају, превод заснован на ML ради бољи посао од људског преводиоца који непотребно додаје речи у уста оригиналног аутора ради 'јасноће'. + +> Шта се овде дешава? И зашто је TextBlob тако добар у превођењу? Па, у позадини, користи Google Translate, софистицирани AI способан да анализира милионе фраза како би предвидео најбоље низове за задатак. Овде нема ничег ручног и потребна вам је интернет конекција да бисте користили `blob.translate`. + +✅ Пробајте још неке реченице. Шта је боље, ML или људски превод? У којим случајевима? + +## Анализа сентимента + +Још једна област у којој машинско учење може веома добро функционисати је анализа сентимента. Приступ без ML-а за сентимент је идентификовање речи и фраза које су 'позитивне' и 'негативне'. Затим, узимајући нови текст, израчунајте укупну вредност позитивних, негативних и неутралних речи како бисте идентификовали укупни сентимент. + +Овај приступ се лако може преварити, као што сте можда видели у задатку са Марвином - реченица `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` је саркастична, негативна сентимент реченица, али једноставан алгоритам детектује 'great', 'wonderful', 'glad' као позитивне и 'waste', 'lost' и 'dark' као негативне. Укупни сентимент је под утицајем ових конфликтних речи. + +✅ Застаните на тренутак и размислите о томе како као људски говорници преносимо сарказам. Интонација игра велику улогу. Покушајте да кажете фразу "Well, that film was awesome" на различите начине да откријете како ваш глас преноси значење. + +### Приступи машинског учења + +Приступ машинског учења би био ручно сакупљање негативних и позитивних текстова - твитова, или рецензија филмова, или било чега где је човек дао оцену *и* писано мишљење. Затим се NLP технике могу применити на мишљења и оцене, тако да се појаве обрасци (нпр., позитивне рецензије филмова имају фразу 'Oscar worthy' више него негативне рецензије филмова, или позитивне рецензије ресторана кажу 'gourmet' много више него 'disgusting'). + +> ⚖️ **Пример**: Ако радите у канцеларији политичара и постоји неки нови закон о коме се расправља, грађани би могли писати канцеларији са имејловима који подржавају или се противе одређеном новом закону. Рецимо да вам је задатак да читате имејлове и сортирате их у 2 гомиле, *за* и *против*. Ако има много имејлова, могли бисте бити преоптерећени покушавајући да их све прочитате. Зар не би било лепо да бот може да их све прочита уместо вас, разуме их и каже вам у коју гомилу сваки имејл припада? +> +> Један начин да се то постигне је коришћење машинског учења. Тренирали бисте модел са делом имејлова *против* и делом имејлова *за*. Модел би имао тенденцију да повезује фразе и речи са страном против и страном за, *али не би разумео ниједан садржај*, само да се одређене речи и обрасци чешће појављују у имејлу *против* или *за*. Могли бисте га тестирати са неким имејловима које нисте користили за тренирање модела и видети да ли долази до истог закључка као и ви. Затим, када будете задовољни тачношћу модела, могли бисте обрађивати будуће имејлове без потребе да читате сваки. + +✅ Да ли вам овај процес звучи као процеси које сте користили у претходним лекцијама? + +## Вежба - сентименталне реченице + +Сентимент се мери са *поларитетом* од -1 до 1, што значи да је -1 најнегативнији сентимент, а 1 најпозитивнији. Сентимент се такође мери са оценом од 0 до 1 за објективност (0) и субјективност (1). + +Поново погледајте *Гордост и предрасуде* Џејн Остин. Текст је доступан овде на [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm). Узорак испод показује кратак програм који анализира сентимент прве и последње реченице из књиге и приказује њен поларитет сентимента и оцену субјективности/објективности. + +Требало би да користите библиотеку `TextBlob` (описану горе) за одређивање `sentiment` (не морате сами писати калкулатор сентимента) у следећем задатку. + +```python +from textblob import TextBlob + +quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.""" + +quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them.""" + +sentiment1 = TextBlob(quote1).sentiment +sentiment2 = TextBlob(quote2).sentiment + +print(quote1 + " has a sentiment of " + str(sentiment1)) +print(quote2 + " has a sentiment of " + str(sentiment2)) +``` + +Видите следећи излаз: + +```output +It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146) + +Darcy, as well as Elizabeth, really loved them; and they were + both ever sensible of the warmest gratitude towards the persons + who, by bringing her into Derbyshire, had been the means of + uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8) +``` + +## Изазов - проверите поларитет сентимента + +Ваш задатак је да одредите, користећи поларитет сентимента, да ли *Гордост и предрасуде* има више апсолутно позитивних реченица него апсолутно негативних. За овај задатак, можете претпоставити да је поларитетна оцена од 1 или -1 апсолутно позитивна или негативна, респективно. + +**Кораци:** + +1. Преузмите [копију Гордости и предрасуда](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) са Project Gutenberg као .txt датотеку. Уклоните метаподатке на почетку и крају датотеке, остављајући само оригинални текст +2. Отворите датотеку у Python-у и извучите садржај као стринг +3. Направите TextBlob користећи стринг књиге +4. Анализирајте сваку реченицу у књизи у петљи + 1. Ако је поларитет 1 или -1, сачувајте реченицу у низу или листи позитивних или негативних порука +5. На крају, одштампајте све позитивне реченице и негативне реченице (одвојено) и број сваке. + +Ево узорка [решења](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb). + +✅ Провера знања + +1. Сентимент се заснива на речима које се користе у реченици, али да ли код *разуме* речи? +2. Да ли мислите да је поларитет сентимента тачан, или другим речима, да ли се *слажете* са оценама? + 1. Посебно, да ли се слажете или не слажете са апсолутно **позитивним** поларитетом следећих реченица? + * “Каквог одличног оца имате, девојке!” рекла је она, када су врата била затворена. + * “Ваше испитивање господина Дарсија је завршено, претпостављам,” рекла је госпођица Бингли; “и молим вас, какав је резултат?” “Савршено сам убеђена да господин Дарси нема ниједан недостатак. + * Како се дивно дешавају овакве ствари! + * Имам највећу одбојност на свету према таквим стварима. + * Шарлот је одличан менаџер, усуђујем се рећи. + * “Ово је заиста дивно! + * Тако сам срећна! + * Ваша идеја о понијима је дивна. + 2. Следеће 3 реченице су оцењене са апсолутно позитивним сентиментом, али при ближем читању, оне нису позитивне реченице. Зашто је анализа сентимента мислила да су позитивне реченице? + * Срећна ћу бити када његов боравак у Нетерфилду буде завршен!” “Волела бих да могу рећи било шта да вас утешим,” одговорила је Елизабет; “али то је потпуно ван моје моћи. + * Када бих само могла да вас видим срећним! + * Наша невоља, драга Лизи, је веома велика. + 3. Да ли се слажете или не слажете са апсолутно **негативним** поларитетом следећих реченица? + - Сви су згрозени његовом гордошћу. + - “Волео бих да знам како се понаша међу странцима.” “Чућете онда—али припремите се за нешто веома страшно. + - Паузу је Елизабет осетила као страшну. + - Било би страшно! + +✅ Сваки љубитељ Џејн Остин ће разумети да она често користи своје књиге да критикује смешније аспекте енглеског регентског друштва. Елизабет Бенет, главни лик у *Гордости и предрасудама*, је оштроумни посматрач друштва (као и ауторка) и њен језик је често веома нијансиран. Чак и господин Дарси (љубавни интерес у причи) примећује Елизабетино раз +Постоји много начина за извлачење сентимента из текста. Размислите о пословним апликацијама које би могле користити ову технику. Размислите о томе како она може да крене наопако. Прочитајте више о софистицираним системима спремним за предузећа који анализирају сентимент, као што је [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott). Тестирајте неке од реченица из „Гордости и предрасуда“ изнад и видите да ли може да открије нијансе. + +## Задатак + +[Песничка слобода](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/3-Translation-Sentiment/assignment.md b/translations/sr/6-NLP/3-Translation-Sentiment/assignment.md new file mode 100644 index 00000000..61b97417 --- /dev/null +++ b/translations/sr/6-NLP/3-Translation-Sentiment/assignment.md @@ -0,0 +1,25 @@ + +# Поетска лиценца + +## Упутства + +У [овом нотебуку](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) можете пронаћи преко 500 песама Емили Дикинсон које су претходно анализиране за сентимент користећи Azure текстуалну аналитику. Користећи овај скуп података, анализирајте га користећи технике описане у лекцији. Да ли предложени сентимент песме одговара одлуци напредније Azure услуге? Зашто или зашто не, по вашем мишљењу? Да ли вас нешто изненађује? + +## Рубрика + +| Критеријум | Изузетно | Прихватљиво | Потребно побољшање | +| ---------- | ------------------------------------------------------------------------ | ------------------------------------------------------- | ------------------------ | +| | Нотебук је представљен са солидном анализом узорка ауторовог рада | Нотебук је непотпун или не извршава анализу | Нотебук није представљен | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/3-Translation-Sentiment/solution/Julia/README.md b/translations/sr/6-NLP/3-Translation-Sentiment/solution/Julia/README.md new file mode 100644 index 00000000..d6d1782e --- /dev/null +++ b/translations/sr/6-NLP/3-Translation-Sentiment/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/3-Translation-Sentiment/solution/R/README.md b/translations/sr/6-NLP/3-Translation-Sentiment/solution/R/README.md new file mode 100644 index 00000000..f72d353d --- /dev/null +++ b/translations/sr/6-NLP/3-Translation-Sentiment/solution/R/README.md @@ -0,0 +1,15 @@ + +ово је привремени привремени текст + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/4-Hotel-Reviews-1/README.md b/translations/sr/6-NLP/4-Hotel-Reviews-1/README.md new file mode 100644 index 00000000..aa4ad3d9 --- /dev/null +++ b/translations/sr/6-NLP/4-Hotel-Reviews-1/README.md @@ -0,0 +1,415 @@ + +# Анализа сентимента са рецензијама хотела - обрада података + +У овом делу ћете користити технике из претходних лекција за истраживачку анализу великог скупа података. Када стекнете добро разумевање корисности различитих колона, научићете: + +- како да уклоните непотребне колоне +- како да израчунате нове податке на основу постојећих колона +- како да сачувате резултујући скуп података за употребу у завршном изазову + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +### Увод + +До сада сте научили да текстуални подаци значајно одступају од нумеричких типова података. Ако је текст написан или изговорен од стране човека, може се анализирати ради проналажења образаца, учесталости, сентимента и значења. Ова лекција вас уводи у прави скуп података са правим изазовом: **[515K рецензија хотела у Европи](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)**, који укључује [CC0: Јавна доменска лиценца](https://creativecommons.org/publicdomain/zero/1.0/). Подаци су прикупљени са Booking.com са јавних извора. Креатор скупа података је Џијашен Лиу. + +### Припрема + +Потребно вам је: + +* Могућност покретања .ipynb нотебука користећи Python 3 +* pandas +* NLTK, [који треба да инсталирате локално](https://www.nltk.org/install.html) +* Скуп података који је доступан на Kaggle [515K рецензија хотела у Европи](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe). Скуп података је величине око 230 MB када се распакује. Преузмите га у коренски `/data` директоријум повезан са овим лекцијама о NLP-у. + +## Истраживачка анализа података + +Овај изазов претпоставља да правите бота за препоруке хотела користећи анализу сентимента и оцене гостију. Скуп података који ћете користити укључује рецензије 1493 различита хотела у 6 градова. + +Користећи Python, скуп података о рецензијама хотела и NLTK анализу сентимента, могли бисте открити: + +* Које су најчешће коришћене речи и фразе у рецензијама? +* Да ли званичне *ознаке* које описују хотел корелирају са оценама рецензија (нпр. да ли су негативније рецензије за одређени хотел од *Породица са малом децом* него од *Самостални путник*, што можда указује да је бољи за *Самосталне путнике*)? +* Да ли NLTK оцене сентимента 'сагласне' са нумеричком оценом рецензента хотела? + +#### Скуп података + +Хајде да истражимо скуп података који сте преузели и сачували локално. Отворите датотеку у уређивачу као што је VS Code или чак Excel. + +Заглавља у скупу података су следећа: + +*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng* + +Ево их груписаних на начин који може бити лакши за преглед: +##### Колоне хотела + +* `Hotel_Name`, `Hotel_Address`, `lat` (географска ширина), `lng` (географска дужина) + * Користећи *lat* и *lng* могли бисте направити мапу у Python-у која приказује локације хотела (можда обојене у складу са негативним и позитивним рецензијама) + * Hotel_Address нам није очигледно користан, и вероватно ћемо га заменити државом ради лакшег сортирања и претраге + +**Колоне мета-рецензија хотела** + +* `Average_Score` + * Према креатору скупа података, ова колона представља *Просечну оцену хотела, израчунату на основу најновијег коментара у последњој години*. Ово изгледа као необичан начин за израчунавање оцене, али то су подаци који су прикупљени, па их за сада можемо узети здраво за готово. + + ✅ На основу осталих колона у овим подацима, можете ли смислити други начин за израчунавање просечне оцене? + +* `Total_Number_of_Reviews` + * Укупни број рецензија које је хотел добио - није јасно (без писања кода) да ли се ово односи на рецензије у скупу података. +* `Additional_Number_of_Scoring` + * Ово значи да је дата оцена, али није написана позитивна или негативна рецензија од стране рецензента. + +**Колоне рецензија** + +- `Reviewer_Score` + - Ово је нумеричка вредност са највише једним децималним местом између минималне и максималне вредности 2.5 и 10 + - Није објашњено зашто је 2.5 најнижа могућа оцена +- `Negative_Review` + - Ако рецензент није ништа написао, ово поље ће имати "**No Negative**" + - Имајте на уму да рецензент може написати позитивну рецензију у колони Negative review (нпр. "нема ништа лоше у овом хотелу") +- `Review_Total_Negative_Word_Counts` + - Већи број негативних речи указује на нижу оцену (без провере сентимента) +- `Positive_Review` + - Ако рецензент није ништа написао, ово поље ће имати "**No Positive**" + - Имајте на уму да рецензент може написати негативну рецензију у колони Positive review (нпр. "нема ништа добро у овом хотелу") +- `Review_Total_Positive_Word_Counts` + - Већи број позитивних речи указује на вишу оцену (без провере сентимента) +- `Review_Date` и `days_since_review` + - Може се применити мера свежине или застарелости рецензије (старије рецензије можда нису толико тачне као новије јер се менаџмент хотела променио, или су извршене реновације, или је додат базен итд.) +- `Tags` + - Ово су кратки описи које рецензент може изабрати да опише тип госта који је био (нпр. самосталан или породичан), тип собе коју је имао, дужину боравка и начин на који је рецензија поднета. + - Нажалост, коришћење ових ознака је проблематично, погледајте одељак испод који разматра њихову корисност. + +**Колоне рецензента** + +- `Total_Number_of_Reviews_Reviewer_Has_Given` + - Ово би могло бити фактор у моделу препоруке, на пример, ако можете утврдити да су продуктивнији рецензенти са стотинама рецензија вероватније негативни него позитивни. Међутим, рецензент било које конкретне рецензије није идентификован јединственим кодом, и стога се не може повезати са сетом рецензија. Постоји 30 рецензената са 100 или више рецензија, али је тешко видети како ово може помоћи моделу препоруке. +- `Reviewer_Nationality` + - Неки људи могу мислити да су одређене националности склоније дају позитивне или негативне рецензије због националне склоности. Будите опрезни приликом уградње таквих анегдотских ставова у своје моделе. Ово су национални (а понекад и расни) стереотипи, а сваки рецензент је био појединац који је написао рецензију на основу свог искуства. То искуство је могло бити филтрирано кроз многе призме као што су њихови претходни боравци у хотелима, пређена удаљеност и њихов лични темперамент. Тешко је оправдати мишљење да је њихова националност била разлог за оцену рецензије. + +##### Примери + +| Просечна оцена | Укупно рецензија | Оцена рецензента | Негативна
                                рецензија | Позитивна рецензија | Ознаке | +| -------------- | ---------------------- | ---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- | +| 7.8 | 1945 | 2.5 | Ово тренутно није хотел већ градилиште. Терорисан сам од раног јутра и током целог дана неприхватљивом буком грађевинских радова док сам се одмарао након дугог путовања и радио у соби. Људи су радили током целог дана, нпр. са бушилицама у суседним собама. Тражио сам промену собе, али није било доступне тихе собе. Да ствар буде гора, наплатили су ми више. Одјавио сам се увече јер сам морао да кренем рано на лет и добио одговарајући рачун. Дан касније хотел је направио још једну наплату без мог пристанка, која је премашила договорену цену. То је ужасно место. Немојте се кажњавати резервисањем овде. | Ништа. Ужасно место. Држите се даље. | Пословно путовање. Пар. Стандардна двокреветна соба. Боравак 2 ноћи. | + +Као што видите, овај гост није имао срећан боравак у овом хотелу. Хотел има добру просечну оцену од 7.8 и 1945 рецензија, али овај рецензент му је дао 2.5 и написао 115 речи о томе колико је његов боравак био негативан. Ако није написао ништа у колони Positive_Review, могли бисте закључити да није било ничег позитивног, али ипак је написао 7 речи упозорења. Ако бисмо само бројали речи уместо значења или сентимента речи, могли бисмо добити искривљену слику намере рецензента. Чудно, њихова оцена од 2.5 је збуњујућа, јер ако је боравак у хотелу био толико лош, зашто му уопште дати било какве бодове? Истражујући скуп података пажљиво, видећете да је најнижа могућа оцена 2.5, а не 0. Највиша могућа оцена је 10. + +##### Ознаке + +Као што је горе поменуто, на први поглед, идеја да се користе `Tags` за категоризацију података има смисла. Нажалост, ове ознаке нису стандардизоване, што значи да у датом хотелу опције могу бити *Single room*, *Twin room* и *Double room*, али у следећем хотелу, оне су *Deluxe Single Room*, *Classic Queen Room* и *Executive King Room*. Ово могу бити исте ствари, али постоји толико варијација да избор постаје: + +1. Покушај да се сви термини промене у један стандард, што је веома тешко, јер није јасно какав би био пут конверзије у сваком случају (нпр. *Classic single room* се мапира на *Single room*, али *Superior Queen Room with Courtyard Garden or City View* је много теже мапирати) + +1. Можемо применити NLP приступ и измерити учесталост одређених термина као што су *Solo*, *Business Traveller* или *Family with young kids* како се односе на сваки хотел, и то укључити у препоруку + +Ознаке су обично (али не увек) једно поље које садржи листу од 5 до 6 вредности одвојених зарезима које се односе на *Тип путовања*, *Тип гостију*, *Тип собе*, *Број ноћи* и *Тип уређаја на којем је рецензија поднета*. Међутим, пошто неки рецензенти не попуњавају свако поље (могу оставити једно празно), вредности нису увек у истом редоследу. + +На пример, узмите *Тип групе*. Постоји 1025 јединствених могућности у овом пољу у колони `Tags`, и нажалост само неке од њих се односе на групу (неке су тип собе итд.). Ако филтрирате само оне које помињу породицу, резултати садрже много резултата типа *Family room*. Ако укључите термин *with*, тј. бројите вредности *Family with*, резултати су бољи, са преко 80,000 од 515,000 резултата који садрже фразу "Family with young children" или "Family with older children". + +Ово значи да колона ознака није потпуно бескорисна за нас, али ће бити потребно мало рада да би била корисна. + +##### Просечна оцена хотела + +Постоји низ необичности или неслагања са скупом података које не могу да схватим, али су овде илустроване како бисте били свесни њих приликом изградње својих модела. Ако их схватите, молимо вас да нас обавестите у делу за дискусију! + +Скуп података има следеће колоне које се односе на просечну оцену и број рецензија: + +1. Hotel_Name +2. Additional_Number_of_Scoring +3. Average_Score +4. Total_Number_of_Reviews +5. Reviewer_Score + +Хотел са највише рецензија у овом скупу података је *Britannia International Hotel Canary Wharf* са 4789 рецензија од 515,000. Али ако погледамо вредност `Total_Number_of_Reviews` за овај хотел, она је 9086. Могли бисте закључити да постоји много више оцена без рецензија, па можда треба додати вредност колоне `Additional_Number_of_Scoring`. Та вредност је 2682, и додајући је на 4789 добијамо 7471, што је и даље 1615 мање од `Total_Number_of_Reviews`. + +Ако узмете колону `Average_Score`, могли бисте закључити да је то просек рецензија у скупу података, али опис са Kaggle-а је "*Просечна оцена хотела, израчуната на основу најновијег коментара у последњој години*". То не изгледа баш корисно, али можемо израчунати сопствени просек на основу оцена рецензија у скупу података. Узимајући исти хотел као пример, просечна оцена хотела је дата као 7.1, али израчуната оцена (просечна оцена рецензента *у* скупу података) је 6.8. Ово је близу, али није иста вредност, и можемо само претпоставити да су оцене дате у рецензијама `Additional_Number_of_Scoring` повећале просек на 7.1. Нажалост, без начина да се тестира или докаже та тврдња, тешко је користити или веровати `Average_Score`, `Additional_Number_of_Scoring` и `Total_Number_of_Reviews` када се заснивају на, или се односе на, податке које немамо. + +Да додатно закомпликујемо ствари, хотел са другим највећим бројем рецензија има израчунату просечну оцену од 8.12, а `Average_Score` у скупу података је +> 🚨 Напомена о опрезу +> +> Када радите са овим скупом података, писаћете код који израчунава нешто из текста без потребе да сами читате или анализирате текст. Ово је суштина обраде природног језика (NLP), тумачење значења или сентимента без потребе да то ради човек. Међутим, могуће је да ћете прочитати неке од негативних рецензија. Саветовао бих вам да то не радите, јер нема потребе. Неки од њих су бесмислени или небитни негативни коментари о хотелима, као што је „Време није било добро“, нешто што је ван контроле хотела, или било кога другог. Али постоји и мрачна страна неких рецензија. Понекад су негативне рецензије расистичке, сексистичке или дискриминаторне према старосној доби. Ово је нажалост очекивано у скупу података који је прикупљен са јавног веб-сајта. Неки рецензенти остављају коментаре који би вам могли бити непријатни, узнемирујући или неприхватљиви. Боље је дозволити коду да измери сентимент него да их сами читате и узнемирите се. Ипак, мањина је оних који пишу такве ствари, али они ипак постоје. +## Вежба - Истраживање података +### Учитавање података + +Довољно је визуелно прегледати податке, сада ћете написати код и добити одговоре! Овај део користи библиотеку pandas. Ваш први задатак је да се уверите да можете учитати и прочитати CSV податке. Библиотека pandas има брз CSV учитач, а резултат се смешта у dataframe, као у претходним лекцијама. CSV који учитавамо има преко пола милиона редова, али само 17 колона. Pandas вам пружа много моћних начина за интеракцију са dataframe-ом, укључујући могућност извршавања операција на сваком реду. + +Од овог тренутка у лекцији, биће укључени делови кода, објашњења кода и дискусија о томе шта резултати значе. Користите приложени _notebook.ipynb_ за ваш код. + +Хајде да почнемо са учитавањем датотеке коју ћете користити: + +```python +# Load the hotel reviews from CSV +import pandas as pd +import time +# importing time so the start and end time can be used to calculate file loading time +print("Loading data file now, this could take a while depending on file size") +start = time.time() +# df is 'DataFrame' - make sure you downloaded the file to the data folder +df = pd.read_csv('../../data/Hotel_Reviews.csv') +end = time.time() +print("Loading took " + str(round(end - start, 2)) + " seconds") +``` + +Сада када су подаци учитани, можемо извршити неке операције над њима. Држите овај код на врху вашег програма за следећи део. + +## Истраживање података + +У овом случају, подаци су већ *чисти*, што значи да су спремни за рад и да не садрже карактере на другим језицима који би могли да збуне алгоритме који очекују само енглеске карактере. + +✅ Можда ћете морати да радите са подацима који захтевају почетну обраду како би се форматирали пре примене NLP техника, али не овог пута. Ако бисте морали, како бисте се носили са карактерима који нису на енглеском? + +Одвојите тренутак да се уверите да, када се подаци учитају, можете их истражити помоћу кода. Веома је лако фокусирати се на колоне `Negative_Review` и `Positive_Review`. Оне су испуњене природним текстом за ваше NLP алгоритме. Али сачекајте! Пре него што ускочите у NLP и анализу сентимента, требало би да следите код испод како бисте утврдили да ли вредности дате у датасету одговарају вредностима које израчунате помоћу pandas-а. + +## Операције над dataframe-ом + +Први задатак у овој лекцији је да проверите да ли су следеће тврдње тачне тако што ћете написати код који испитује dataframe (без промене истог). + +> Као и код многих програмских задатака, постоји више начина да се ово уради, али добар савет је да то урадите на најједноставнији, најлакши начин, посебно ако ће бити лакше разумети када се вратите на овај код у будућности. Са dataframe-ом, постоји свеобухватан API који ће често имати начин да ефикасно урадите оно што желите. + +Третирајте следећа питања као програмске задатке и покушајте да их решите без гледања у решење. + +1. Испишите *облик* dataframe-а који сте управо учитали (облик је број редова и колона). +2. Израчунати учесталост националности рецензената: + 1. Колико различитих вредности постоји за колону `Reviewer_Nationality` и које су то вредности? + 2. Која националност рецензената је најчешћа у датасету (испишите земљу и број рецензија)? + 3. Које су следећих 10 најчешћих националности и њихова учесталост? +3. Који је хотел најчешће рецензиран за сваку од 10 најчешћих националности рецензената? +4. Колико рецензија има по хотелу (учесталост рецензија по хотелу) у датасету? +5. Иако постоји колона `Average_Score` за сваки хотел у датасету, можете израчунати просечну оцену (узимајући просек свих оцена рецензената у датасету за сваки хотел). Додајте нову колону у ваш dataframe са заглављем колоне `Calc_Average_Score` која садржи израчунати просек. +6. Да ли неки хотели имају исту (заокружену на 1 децималу) `Average_Score` и `Calc_Average_Score`? + 1. Покушајте да напишете Python функцију која узима Series (ред) као аргумент и упоређује вредности, исписујући поруку када вредности нису једнаке. Затим користите `.apply()` метод да обрадите сваки ред помоћу функције. +7. Израчунати и исписати колико редова има вредност колоне `Negative_Review` "No Negative". +8. Израчунати и исписати колико редова има вредност колоне `Positive_Review` "No Positive". +9. Израчунати и исписати колико редова има вредност колоне `Positive_Review` "No Positive" **и** вредност колоне `Negative_Review` "No Negative". + +### Одговори у коду + +1. Испишите *облик* dataframe-а који сте управо учитали (облик је број редова и колона). + + ```python + print("The shape of the data (rows, cols) is " + str(df.shape)) + > The shape of the data (rows, cols) is (515738, 17) + ``` + +2. Израчунати учесталост националности рецензената: + + 1. Колико различитих вредности постоји за колону `Reviewer_Nationality` и које су то вредности? + 2. Која националност рецензената је најчешћа у датасету (испишите земљу и број рецензија)? + + ```python + # value_counts() creates a Series object that has index and values in this case, the country and the frequency they occur in reviewer nationality + nationality_freq = df["Reviewer_Nationality"].value_counts() + print("There are " + str(nationality_freq.size) + " different nationalities") + # print first and last rows of the Series. Change to nationality_freq.to_string() to print all of the data + print(nationality_freq) + + There are 227 different nationalities + United Kingdom 245246 + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + ... + Comoros 1 + Palau 1 + Northern Mariana Islands 1 + Cape Verde 1 + Guinea 1 + Name: Reviewer_Nationality, Length: 227, dtype: int64 + ``` + + 3. Које су следећих 10 најчешћих националности и њихова учесталост? + + ```python + print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.") + # Notice there is a leading space on the values, strip() removes that for printing + # What is the top 10 most common nationalities and their frequencies? + print("The next 10 highest frequency reviewer nationalities are:") + print(nationality_freq[1:11].to_string()) + + The highest frequency reviewer nationality is United Kingdom with 245246 reviews. + The next 10 highest frequency reviewer nationalities are: + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + Saudi Arabia 8951 + Netherlands 8772 + Switzerland 8678 + Germany 7941 + Canada 7894 + France 7296 + ``` + +3. Који је хотел најчешће рецензиран за сваку од 10 најчешћих националности рецензената? + + ```python + # What was the most frequently reviewed hotel for the top 10 nationalities + # Normally with pandas you will avoid an explicit loop, but wanted to show creating a new dataframe using criteria (don't do this with large amounts of data because it could be very slow) + for nat in nationality_freq[:10].index: + # First, extract all the rows that match the criteria into a new dataframe + nat_df = df[df["Reviewer_Nationality"] == nat] + # Now get the hotel freq + freq = nat_df["Hotel_Name"].value_counts() + print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.") + + The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews. + The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews. + The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews. + The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews. + The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews. + The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews. + The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews. + The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews. + The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews. + The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews. + ``` + +4. Колико рецензија има по хотелу (учесталост рецензија по хотелу) у датасету? + + ```python + # First create a new dataframe based on the old one, removing the uneeded columns + hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1) + + # Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found + hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count') + + # Get rid of all the duplicated rows + hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"]) + display(hotel_freq_df) + ``` + | Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found | + | :----------------------------------------: | :---------------------: | :-----------------: | + | Britannia International Hotel Canary Wharf | 9086 | 4789 | + | Park Plaza Westminster Bridge London | 12158 | 4169 | + | Copthorne Tara Hotel London Kensington | 7105 | 3578 | + | ... | ... | ... | + | Mercure Paris Porte d Orleans | 110 | 10 | + | Hotel Wagner | 135 | 10 | + | Hotel Gallitzinberg | 173 | 8 | + + Можда ћете приметити да резултати *израчунати у датасету* не одговарају вредности у `Total_Number_of_Reviews`. Није јасно да ли ова вредност у датасету представља укупан број рецензија које је хотел имао, али нису све биле scraped, или нека друга рачуница. `Total_Number_of_Reviews` се не користи у моделу због ове нејасноће. + +5. Иако постоји колона `Average_Score` за сваки хотел у датасету, можете израчунати просечну оцену (узимајући просек свих оцена рецензената у датасету за сваки хотел). Додајте нову колону у ваш dataframe са заглављем колоне `Calc_Average_Score` која садржи израчунати просек. Испишите колоне `Hotel_Name`, `Average_Score` и `Calc_Average_Score`. + + ```python + # define a function that takes a row and performs some calculation with it + def get_difference_review_avg(row): + return row["Average_Score"] - row["Calc_Average_Score"] + + # 'mean' is mathematical word for 'average' + df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + + # Add a new column with the difference between the two average scores + df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1) + + # Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel) + review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"]) + + # Sort the dataframe to find the lowest and highest average score difference + review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"]) + + display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]]) + ``` + + Можда ћете се запитати о вредности `Average_Score` и зашто је понекад различита од израчунатог просека. Како не можемо знати зашто неке вредности одговарају, а друге имају разлику, најсигурније је у овом случају користити оцене рецензената које имамо за израчунавање просека. Ипак, разлике су обично веома мале, ево хотела са највећим одступањем између просека из датасета и израчунатог просека: + + | Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Name | + | :----------------------: | :-----------: | :----------------: | ------------------------------------------: | + | -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria | + | -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery | + | -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans | + | -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel | + | -0.5 | 7.0 | 7.5 | Hotel Royal Elys es | + | ... | ... | ... | ... | + | 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre | + | 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur | + | 0.9 | 6.8 | 5.9 | Villa Eugenie | + | 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux | + | 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar | + + Са само 1 хотелом који има разлику у оцени већу од 1, то значи да вероватно можемо игнорисати разлику и користити израчунати просек. + +6. Израчунати и исписати колико редова има вредност колоне `Negative_Review` "No Negative". + +7. Израчунати и исписати колико редова има вредност колоне `Positive_Review` "No Positive". + +8. Израчунати и исписати колико редова има вредност колоне `Positive_Review` "No Positive" **и** вредност колоне `Negative_Review` "No Negative". + + ```python + # with lambdas: + start = time.time() + no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1) + print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index))) + + no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index))) + + both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index))) + end = time.time() + print("Lambdas took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Lambdas took 9.64 seconds + ``` + +## Други начин + +Други начин за бројање ставки без Lambdas, и коришћење sum за бројање редова: + + ```python + # without lambdas (using a mixture of notations to show you can use both) + start = time.time() + no_negative_reviews = sum(df.Negative_Review == "No Negative") + print("Number of No Negative reviews: " + str(no_negative_reviews)) + + no_positive_reviews = sum(df["Positive_Review"] == "No Positive") + print("Number of No Positive reviews: " + str(no_positive_reviews)) + + both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive")) + print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews)) + + end = time.time() + print("Sum took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Sum took 0.19 seconds + ``` + + Можда сте приметили да постоји 127 редова који имају и "No Negative" и "No Positive" вредности за колоне `Negative_Review` и `Positive_Review` респективно. То значи да је рецензент дао хотелу нумеричку оцену, али је одбио да напише позитивну или негативну рецензију. Срећом, ово је мали број редова (127 од 515738, или 0.02%), тако да вероватно неће утицати на наш модел или резултате у било ком правцу, али можда нисте очекивали да датасет рецензија има редове без рецензија, па је вредно истражити податке како бисте открили овакве редове. + +Сада када сте истражили датасет, у следећој лекцији ћете филтрирати податке и додати анализу сентимента. + +--- +## 🚀Изазов + +Ова лекција показује, као што смо видели у претходним лекцијама, колико је критично важно разумети ваше податке и њихове недостатке пре него што извршите операције над њима. Подаци засновани на тексту, посебно, захтевају пажљиво испитивање. Претражите различите датасете богате текстом и видите да ли можете открити области које би могле увести пристрасност или искривљен сентимент у модел. + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Пређите [овај пут учења о NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) да бисте открили алате које можете испробати приликом изградње модела заснованих на говору и тексту. + +## Задатак + +[NLTK](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења настала услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/4-Hotel-Reviews-1/assignment.md b/translations/sr/6-NLP/4-Hotel-Reviews-1/assignment.md new file mode 100644 index 00000000..b9e6625c --- /dev/null +++ b/translations/sr/6-NLP/4-Hotel-Reviews-1/assignment.md @@ -0,0 +1,19 @@ + +# NLTK + +## Упутства + +NLTK је позната библиотека за употребу у рачунарској лингвистици и обради природног језика. Искористите ову прилику да прочитате '[NLTK књигу](https://www.nltk.org/book/)' и испробате њене вежбе. У овом задатку који се не оцењује, имаћете прилику да боље упознате ову библиотеку. + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md b/translations/sr/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md new file mode 100644 index 00000000..92bab9e5 --- /dev/null +++ b/translations/sr/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/4-Hotel-Reviews-1/solution/R/README.md b/translations/sr/6-NLP/4-Hotel-Reviews-1/solution/R/README.md new file mode 100644 index 00000000..3c91a6c6 --- /dev/null +++ b/translations/sr/6-NLP/4-Hotel-Reviews-1/solution/R/README.md @@ -0,0 +1,15 @@ + +ово је привремени привремени текст + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/5-Hotel-Reviews-2/README.md b/translations/sr/6-NLP/5-Hotel-Reviews-2/README.md new file mode 100644 index 00000000..6882937a --- /dev/null +++ b/translations/sr/6-NLP/5-Hotel-Reviews-2/README.md @@ -0,0 +1,389 @@ + +# Анализа сентимента са рецензијама хотела + +Сада када сте детаљно истражили скуп података, време је да филтрирате колоне и примените NLP технике на скуп података како бисте добили нове увиде о хотелима. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +### Операције филтрирања и анализе сентимента + +Као што сте вероватно приметили, скуп података има неколико проблема. Неке колоне су испуњене бескорисним информацијама, друге изгледају нетачно. Чак и ако су тачне, није јасно како су израчунате, а одговори се не могу независно проверити вашим сопственим прорачунима. + +## Вежба: мало више обраде података + +Очистите податке још мало. Додајте колоне које ће бити корисне касније, промените вредности у другим колонама и потпуно уклоните одређене колоне. + +1. Почетна обрада колона + + 1. Уклоните `lat` и `lng` + + 2. Замените вредности у `Hotel_Address` следећим вредностима (ако адреса садржи име града и државе, промените је тако да садржи само град и државу). + + Ово су једини градови и државе у скупу података: + + Амстердам, Холандија + + Барселона, Шпанија + + Лондон, Уједињено Краљевство + + Милано, Италија + + Париз, Француска + + Беч, Аустрија + + ```python + def replace_address(row): + if "Netherlands" in row["Hotel_Address"]: + return "Amsterdam, Netherlands" + elif "Barcelona" in row["Hotel_Address"]: + return "Barcelona, Spain" + elif "United Kingdom" in row["Hotel_Address"]: + return "London, United Kingdom" + elif "Milan" in row["Hotel_Address"]: + return "Milan, Italy" + elif "France" in row["Hotel_Address"]: + return "Paris, France" + elif "Vienna" in row["Hotel_Address"]: + return "Vienna, Austria" + + # Replace all the addresses with a shortened, more useful form + df["Hotel_Address"] = df.apply(replace_address, axis = 1) + # The sum of the value_counts() should add up to the total number of reviews + print(df["Hotel_Address"].value_counts()) + ``` + + Сада можете упитати податке на нивоу државе: + + ```python + display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"})) + ``` + + | Hotel_Address | Hotel_Name | + | :--------------------- | :--------: | + | Амстердам, Холандија | 105 | + | Барселона, Шпанија | 211 | + | Лондон, Уједињено Краљевство | 400 | + | Милано, Италија | 162 | + | Париз, Француска | 458 | + | Беч, Аустрија | 158 | + +2. Обрада колона мета-рецензија хотела + + 1. Уклоните `Additional_Number_of_Scoring` + + 2. Замените `Total_Number_of_Reviews` са укупним бројем рецензија за тај хотел које су заправо у скупу података + + 3. Замените `Average_Score` са сопствено израчунатом оценом + + ```python + # Drop `Additional_Number_of_Scoring` + df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True) + # Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values + df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count') + df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + ``` + +3. Обрада колона рецензија + + 1. Уклоните `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` и `days_since_review` + + 2. Задржите `Reviewer_Score`, `Negative_Review` и `Positive_Review` како јесу + + 3. Задржите `Tags` за сада + + - У следећем одељку ћемо извршити додатне операције филтрирања на таговима, а затим ће тагови бити уклоњени + +4. Обрада колона рецензената + + 1. Уклоните `Total_Number_of_Reviews_Reviewer_Has_Given` + + 2. Задржите `Reviewer_Nationality` + +### Колона са таговима + +Колона `Tag` је проблематична јер је листа (у текстуалном облику) која се чува у колони. Нажалост, редослед и број пододсека у овој колони нису увек исти. Тешко је човеку да идентификује тачне фразе које су од интереса, јер постоји 515,000 редова и 1427 хотела, а сваки има мало другачије опције које рецензент може изабрати. Овде NLP долази до изражаја. Можете скенирати текст и пронаћи најчешће фразе и пребројати их. + +Нажалост, нас не интересују појединачне речи, већ фразе са више речи (нпр. *Пословно путовање*). Покретање алгоритма за дистрибуцију учесталости фраза на толико података (6762646 речи) могло би да траје изузетно дуго, али без прегледа података, чини се да је то неопходан трошак. Овде је корисна истраживачка анализа података, јер сте видели узорак тагова као што су `[' Пословно путовање ', ' Самостални путник ', ' Једнокреветна соба ', ' Боравак од 5 ноћи ', ' Послато са мобилног уређаја ']`, можете почети да се питате да ли је могуће значајно смањити обраду коју морате да урадите. Срећом, јесте - али прво морате да следите неколико корака да бисте утврдили тагове од интереса. + +### Филтрирање тагова + +Запамтите да је циљ скупа података да додате сентимент и колоне које ће вам помоћи да изаберете најбољи хотел (за себе или можда за клијента који вам задаје задатак да направите бота за препоруке хотела). Морате се запитати да ли су тагови корисни или не у коначном скупу података. Ево једне интерпретације (ако вам је скуп података потребан из других разлога, различити тагови би могли остати/бити уклоњени): + +1. Тип путовања је релевантан и треба да остане +2. Тип групе гостију је важан и треба да остане +3. Тип собе, апартмана или студија у којем је гост боравио је ирелевантан (сви хотели имају отприлике исте собе) +4. Уређај са којег је рецензија послата је ирелевантан +5. Број ноћи које је рецензент боравио *може* бити релевантан ако приписујете дужи боравак као знак да им се хотел више свидео, али је то натегнуто и вероватно ирелевантно + +Укратко, **задржите 2 врсте тагова и уклоните остале**. + +Прво, не желите да бројите тагове док нису у бољем формату, што значи уклањање угластих заграда и наводника. Ово можете урадити на неколико начина, али желите најбржи јер би обрада великог броја података могла да траје дуго. Срећом, pandas има једноставан начин за сваки од ових корака. + +```Python +# Remove opening and closing brackets +df.Tags = df.Tags.str.strip("[']") +# remove all quotes too +df.Tags = df.Tags.str.replace(" ', '", ",", regex = False) +``` + +Сваки таг постаје нешто попут: `Пословно путовање, Самостални путник, Једнокреветна соба, Боравак од 5 ноћи, Послато са мобилног уређаја`. + +Следећи проблем је различит број колона у рецензијама. Неки редови имају 5 колона, неки 3, неки 6. Ово је резултат начина на који је скуп података креиран и тешко је поправити. Желите да добијете учесталост сваке фразе, али оне су у различитом редоследу у свакој рецензији, па број може бити нетачан, а хотел можда не добије таг који заслужује. + +Уместо тога, искористићете различит редослед у своју корист, јер је сваки таг фраза са више речи, али је такође одвојен зарезом! Најједноставнији начин да то урадите је да креирате 6 привремених колона са сваким тагом уметнутим у колону која одговара његовом редоследу у тагу. Затим можете спојити 6 колона у једну велику колону и покренути `value_counts()` метод на резултујућој колони. Када то испишете, видећете да је било 2428 јединствених тагова. Ево малог узорка: + +| Таг | Број | +| ------------------------------ | ------ | +| Одмор | 417778 | +| Послато са мобилног уређаја | 307640 | +| Пар | 252294 | +| Боравак од 1 ноћи | 193645 | +| Боравак од 2 ноћи | 133937 | +| Самостални путник | 108545 | +| Боравак од 3 ноћи | 95821 | +| Пословно путовање | 82939 | +| Група | 65392 | +| Породица са малом децом | 61015 | +| Боравак од 4 ноћи | 47817 | +| Двокреветна соба | 35207 | +| Стандардна двокреветна соба | 32248 | +| Супериор двокреветна соба | 31393 | +| Породица са старијом децом | 26349 | +| Делукс двокреветна соба | 24823 | +| Двокреветна или соба са два кревета | 22393 | +| Боравак од 5 ноћи | 20845 | +| Стандардна двокреветна или соба са два кревета | 17483 | +| Класична двокреветна соба | 16989 | +| Супериор двокреветна или соба са два кревета | 13570 | +| 2 собе | 12393 | + +Неки од уобичајених тагова као што је `Послато са мобилног уређаја` нису нам од користи, па би било паметно уклонити их пре бројања учесталости фраза, али је то тако брза операција да их можете оставити и игнорисати. + +### Уклањање тагова о дужини боравка + +Уклањање ових тагова је први корак, што благо смањује укупан број тагова који се разматрају. Напомињемо да их не уклањате из скупа података, већ само одлучујете да их уклоните из разматрања као вредности које треба бројати/задржати у скупу рецензија. + +| Дужина боравка | Број | +| -------------- | ------ | +| Боравак од 1 ноћи | 193645 | +| Боравак од 2 ноћи | 133937 | +| Боравак од 3 ноћи | 95821 | +| Боравак од 4 ноћи | 47817 | +| Боравак од 5 ноћи | 20845 | +| Боравак од 6 ноћи | 9776 | +| Боравак од 7 ноћи | 7399 | +| Боравак од 8 ноћи | 2502 | +| Боравак од 9 ноћи | 1293 | +| ... | ... | + +Постоји огромна разноврсност соба, апартмана, студија, апартмана и тако даље. Сви они значе отприлике исто и нису релевантни за вас, па их уклоните из разматрања. + +| Тип собе | Број | +| ---------------------------- | ------ | +| Двокреветна соба | 35207 | +| Стандардна двокреветна соба | 32248 | +| Супериор двокреветна соба | 31393 | +| Делукс двокреветна соба | 24823 | +| Двокреветна или соба са два кревета | 22393 | +| Стандардна двокреветна или соба са два кревета | 17483 | +| Класична двокреветна соба | 16989 | +| Супериор двокреветна или соба са два кревета | 13570 | + +На крају, и ово је одлично (јер није захтевало много обраде), остаћете са следећим *корисним* таговима: + +| Таг | Број | +| --------------------------------------------- | ------ | +| Одмор | 417778 | +| Пар | 252294 | +| Самостални путник | 108545 | +| Пословно путовање | 82939 | +| Група (комбиновано са Путници са пријатељима) | 67535 | +| Породица са малом децом | 61015 | +| Породица са старијом децом | 26349 | +| Са кућним љубимцем | 1405 | + +Могли бисте тврдити да је `Путници са пријатељима` исто што и `Група` мање-више, и било би фер комбиновати их као горе. Код за идентификовање исправних тагова је [Tags notebook](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb). + +Последњи корак је креирање нових колона за сваки од ових тагова. Затим, за сваки ред рецензије, ако колона `Tag` одговара једној од нових колона, додајте 1, ако не, додајте 0. Коначни резултат ће бити број рецензената који су изабрали овај хотел (у агрегату) за, рецимо, пословно путовање у односу на одмор, или да доведу кућног љубимца, и то је корисна информација приликом препоруке хотела. + +```python +# Process the Tags into new columns +# The file Hotel_Reviews_Tags.py, identifies the most important tags +# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends, +# Family with young children, Family with older children, With a pet +df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0) +df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0) +df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0) +df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0) +df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0) +df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0) +df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0) +df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0) + +``` + +### Сачувајте ваш фајл + +На крају, сачувајте скуп података у тренутном стању под новим именом. + +```python +df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True) + +# Saving new data file with calculated columns +print("Saving results to Hotel_Reviews_Filtered.csv") +df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False) +``` + +## Операције анализе сентимента + +У овом последњем одељку, применићете анализу сентимента на колоне рецензија и сачувати резултате у скупу података. + +## Вежба: учитајте и сачувајте филтриране податке + +Напомињемо да сада учитавате филтрирани скуп података који је сачуван у претходном одељку, **не** оригинални скуп података. + +```python +import time +import pandas as pd +import nltk as nltk +from nltk.corpus import stopwords +from nltk.sentiment.vader import SentimentIntensityAnalyzer +nltk.download('vader_lexicon') + +# Load the filtered hotel reviews from CSV +df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv') + +# You code will be added here + + +# Finally remember to save the hotel reviews with new NLP data added +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False) +``` + +### Уклањање стоп речи + +Ако бисте покренули анализу сентимента на колонама негативних и позитивних рецензија, то би могло трајати дуго. Тестирано на моћном лаптопу са брзим CPU-ом, трајало је 12 - 14 минута у зависности од тога која библиотека за анализу сентимента је коришћена. То је (релативно) дуго, па је вредно истражити да ли се то може убрзати. + +Уклањање стоп речи, или уобичајених енглеских речи које не мењају сентимент реченице, је први корак. Уклањањем њих, анализа сентимента би требало да се брже изврши, али да не буде мање тачна (јер стоп речи не утичу на сентимент, али успоравају анализу). + +Најдужа негативна рецензија имала је 395 речи, али након уклањања стоп речи, има 195 речи. + +Уклањање стоп речи је такође брза операција, уклањање стоп речи из 2 колоне рецензија преко 515,000 редова трајало је 3.3 секунде на тест уређају. Могло би трајати мало више или мање времена за вас у зависности од брзине вашег CPU-а, RAM-а, да ли имате SSD или не, и неких других фактора. Релативна краткоћа операције значи да ако побољшава време анализе сентимента, онда је вредно урадити. + +```python +from nltk.corpus import stopwords + +# Load the hotel reviews from CSV +df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv") + +# Remove stop words - can be slow for a lot of text! +# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches +# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends +start = time.time() +cache = set(stopwords.words("english")) +def remove_stopwords(review): + text = " ".join([word for word in review.split() if word not in cache]) + return text + +# Remove the stop words from both columns +df.Negative_Review = df.Negative_Review.apply(remove_stopwords) +df.Positive_Review = df.Positive_Review.apply(remove_stopwords) +``` + +### Извршавање анализе сентимента + +Сада треба да израчунате анализу сентимента за обе колоне рецензија, негативне и позитивне, и сачувате резултат у 2 нове колоне. Тест сентимента ће бити упоређивање са оценом рецензента за исту рецензију. На пример, ако сентимент мисли да је негативна рецензија имала сентимент од +NLTK нуди различите анализаторе сентимента за учење, и можете их заменити и проверити да ли је сентимент тачнији или мање тачан. Овде се користи VADER анализа сентимента. + +> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, јун 2014. + +```python +from nltk.sentiment.vader import SentimentIntensityAnalyzer + +# Create the vader sentiment analyser (there are others in NLTK you can try too) +vader_sentiment = SentimentIntensityAnalyzer() +# Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014. + +# There are 3 possibilities of input for a review: +# It could be "No Negative", in which case, return 0 +# It could be "No Positive", in which case, return 0 +# It could be a review, in which case calculate the sentiment +def calc_sentiment(review): + if review == "No Negative" or review == "No Positive": + return 0 + return vader_sentiment.polarity_scores(review)["compound"] +``` + +Касније у вашем програму, када будете спремни да израчунате сентимент, можете га применити на сваку рецензију на следећи начин: + +```python +# Add a negative sentiment and positive sentiment column +print("Calculating sentiment columns for both positive and negative reviews") +start = time.time() +df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment) +df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment) +end = time.time() +print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds") +``` + +Ово траје приближно 120 секунди на мом рачунару, али ће се време разликовати у зависности од рачунара. Ако желите да одштампате резултате и проверите да ли сентимент одговара рецензији: + +```python +df = df.sort_values(by=["Negative_Sentiment"], ascending=True) +print(df[["Negative_Review", "Negative_Sentiment"]]) +df = df.sort_values(by=["Positive_Sentiment"], ascending=True) +print(df[["Positive_Review", "Positive_Sentiment"]]) +``` + +Последња ствар коју треба урадити са фајлом пре него што га употребите у изазову је да га сачувате! Такође би требало да размислите о реорганизацији свих нових колона како би биле лакше за рад (за људе, то је козметичка промена). + +```python +# Reorder the columns (This is cosmetic, but to make it easier to explore the data later) +df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1) + +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False) +``` + +Требало би да покренете цео код за [аналитички нотебук](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (након што сте покренули [ваш нотебук за филтрирање](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) како бисте генерисали фајл Hotel_Reviews_Filtered.csv). + +Да резимирамо, кораци су: + +1. Оригинални фајл података **Hotel_Reviews.csv** је истражен у претходној лекцији помоћу [експлорер нотебука](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb) +2. Hotel_Reviews.csv је филтриран помоћу [ноутбука за филтрирање](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb), што резултира фајлом **Hotel_Reviews_Filtered.csv** +3. Hotel_Reviews_Filtered.csv је обрађен помоћу [ноутбука за анализу сентимента](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb), што резултира фајлом **Hotel_Reviews_NLP.csv** +4. Користите Hotel_Reviews_NLP.csv у NLP изазову испод + +### Закључак + +Када сте почели, имали сте скуп података са колонама и подацима, али не све је могло бити проверено или коришћено. Истражили сте податке, филтрирали оно што вам није потребно, конвертовали тагове у нешто корисно, израчунали сопствене просеке, додали неке колоне за сентимент и, надамо се, научили нешто занимљиво о обради природног текста. + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Изазов + +Сада када сте анализирали сентимент вашег скупа података, видите да ли можете користити стратегије које сте научили у овом курикулуму (кластерисање, можда?) како бисте утврдили обрасце у сентименту. + +## Преглед и самостално учење + +Погледајте [овај Learn модул](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) како бисте сазнали више и користили различите алате за истраживање сентимента у тексту. + +## Задатак + +[Испробајте други скуп података](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/5-Hotel-Reviews-2/assignment.md b/translations/sr/6-NLP/5-Hotel-Reviews-2/assignment.md new file mode 100644 index 00000000..f0f9f087 --- /dev/null +++ b/translations/sr/6-NLP/5-Hotel-Reviews-2/assignment.md @@ -0,0 +1,25 @@ + +# Пробајте други скуп података + +## Упутства + +Сада када сте научили како да користите NLTK за додељивање сентимента тексту, пробајте други скуп података. Вероватно ће бити потребно да обрадите податке, па направите бележницу и документујте свој процес размишљања. Шта откривате? + +## Рубрика + +| Критеријум | Изузетно | Довољно | Потребно побољшање | +| ---------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | ----------------------- | +| | Комплетна бележница и скуп података су представљени са добро документованим ћелијама које објашњавају како се сентимент додељује | Бележница недостаје добрим објашњењима | Бележница је неисправна | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md b/translations/sr/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md new file mode 100644 index 00000000..949819b5 --- /dev/null +++ b/translations/sr/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/5-Hotel-Reviews-2/solution/R/README.md b/translations/sr/6-NLP/5-Hotel-Reviews-2/solution/R/README.md new file mode 100644 index 00000000..516fa95b --- /dev/null +++ b/translations/sr/6-NLP/5-Hotel-Reviews-2/solution/R/README.md @@ -0,0 +1,15 @@ + +ово је привремени привремени текст + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/README.md b/translations/sr/6-NLP/README.md new file mode 100644 index 00000000..700d63ea --- /dev/null +++ b/translations/sr/6-NLP/README.md @@ -0,0 +1,38 @@ + +# Увод у обраду природног језика + +Обрада природног језика (NLP) је способност компјутерског програма да разуме људски језик онако како се говори и пише — што се назива природним језиком. То је компонента вештачке интелигенције (AI). NLP постоји више од 50 година и има корене у области лингвистике. Целокупно поље је усмерено на помоћ машинама да разумеју и обрађују људски језик. Ово се затим може користити за извршавање задатака као што су провера правописа или машински превод. NLP има различите примене у стварном свету у бројним областима, укључујући медицинска истраживања, претраживаче и пословну интелигенцију. + +## Регионална тема: Европски језици и књижевност и романтични хотели Европе ❤️ + +У овом делу наставног програма, упознаћете се са једном од најраспрострањенијих употреба машинског учења: обрадом природног језика (NLP). Проистекла из рачунарске лингвистике, ова категорија вештачке интелигенције представља мост између људи и машина путем гласовне или текстуалне комуникације. + +У овим лекцијама ћемо научити основе NLP-а кроз прављење малих конверзацијских ботова како бисмо разумели како машинско учење помаже да ови разговори постану све „паметнији“. Путоваћете кроз време, разговарајући са Елизабетом Бенет и господином Дарсијем из класичног романа Џејн Остин, **Гордост и предрасуда**, објављеног 1813. године. Затим ћете продубити своје знање учењем о анализи сентимента кроз рецензије хотела у Европи. + +![Књига Гордост и предрасуда и чај](../../../6-NLP/images/p&p.jpg) +> Фотографија од Elaine Howlin на Unsplash + +## Лекције + +1. [Увод у обраду природног језика](1-Introduction-to-NLP/README.md) +2. [Уобичајени задаци и технике NLP-а](2-Tasks/README.md) +3. [Превод и анализа сентимента уз машинско учење](3-Translation-Sentiment/README.md) +4. [Припрема ваших података](4-Hotel-Reviews-1/README.md) +5. [NLTK за анализу сентимента](5-Hotel-Reviews-2/README.md) + +## Захвалнице + +Ове лекције о обради природног језика написане су уз ☕ од стране [Stephen Howell](https://twitter.com/Howell_MSFT) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/6-NLP/data/README.md b/translations/sr/6-NLP/data/README.md new file mode 100644 index 00000000..8f3f18eb --- /dev/null +++ b/translations/sr/6-NLP/data/README.md @@ -0,0 +1,15 @@ + +Преузмите податке о рецензијама хотела у овај фолдер. + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/7-TimeSeries/1-Introduction/README.md b/translations/sr/7-TimeSeries/1-Introduction/README.md new file mode 100644 index 00000000..4a59ea1f --- /dev/null +++ b/translations/sr/7-TimeSeries/1-Introduction/README.md @@ -0,0 +1,199 @@ + +# Увод у предвиђање временских серија + +![Резиме временских серија у скици](../../../../sketchnotes/ml-timeseries.png) + +> Скица од [Томоми Имура](https://www.twitter.com/girlie_mac) + +У овој лекцији и наредној, научићете нешто о предвиђању временских серија, занимљивом и вредном делу репертоара научника за машинско учење, који је мање познат у односу на друге теме. Предвиђање временских серија је нека врста „кристалне кугле“: на основу претходних перформанси неке променљиве, као што је цена, можете предвидети њену будућу потенцијалну вредност. + +[![Увод у предвиђање временских серија](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "Увод у предвиђање временских серија") + +> 🎥 Кликните на слику изнад за видео о предвиђању временских серија + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +Ово је корисно и занимљиво поље са стварном вредношћу за пословање, с обзиром на његову директну примену у решавању проблема цена, залиха и ланца снабдевања. Иако су технике дубоког учења почеле да се користе за добијање бољих увида ради прецизнијег предвиђања будућих перформанси, предвиђање временских серија остаје поље које се у великој мери ослања на класичне технике машинског учења. + +> Корисни наставни план и програм за временске серије са Универзитета Пен Стејт можете пронаћи [овде](https://online.stat.psu.edu/stat510/lesson/1) + +## Увод + +Претпоставимо да одржавате низ паметних паркинг метара који пружају податке о томе колико често се користе и колико дуго током времена. + +> Шта ако бисте могли да предвидите, на основу претходних перформанси метра, његову будућу вредност у складу са законима понуде и потражње? + +Прецизно предвиђање када треба деловати како бисте постигли свој циљ је изазов који би могао бити решен предвиђањем временских серија. Људи можда не би били срећни да плаћају више у ужурбаним временима када траже паркинг место, али то би био сигуран начин за генерисање прихода за чишћење улица! + +Хајде да истражимо неке врсте алгоритама за временске серије и започнемо рад у бележници како бисмо очистили и припремили неке податке. Подаци које ћете анализирати преузети су са такмичења за предвиђање GEFCom2014. Они садрже три године података о сатној потрошњи електричне енергије и температури између 2012. и 2014. године. С обзиром на историјске обрасце потрошње електричне енергије и температуре, можете предвидети будуће вредности потрошње електричне енергије. + +У овом примеру, научићете како да предвидите један корак унапред, користећи само историјске податке о потрошњи. Међутим, пре него што почнете, корисно је разумети шта се дешава „иза сцене“. + +## Неке дефиниције + +Када наиђете на термин „временске серије“, потребно је да разумете његову употребу у неколико различитих контекста. + +🎓 **Временске серије** + +У математици, „временске серије су низ података индексираних (или наведених или графички приказаних) у временском редоследу. Најчешће, временске серије су секвенца узета у једнако размакнутим тачкама у времену.“ Пример временских серија је дневна завршна вредност [Дау Џонс индустријског просека](https://wikipedia.org/wiki/Time_series). Употреба графикона временских серија и статистичког моделирања често се среће у обради сигнала, предвиђању времена, предвиђању земљотреса и другим областима где се догађаји дешавају и подаци могу бити приказани током времена. + +🎓 **Анализа временских серија** + +Анализа временских серија је анализа горе поменутих података временских серија. Подаци временских серија могу имати различите облике, укључујући „прекинуте временске серије“ које откривају обрасце у еволуцији временских серија пре и после неког прекидајућег догађаја. Тип анализе који је потребан за временске серије зависи од природе података. Подаци временских серија могу бити у облику низа бројева или карактера. + +Анализа која се спроводи користи разне методе, укључујући методе у домену фреквенције и времена, линеарне и нелинеарне, и друге. [Сазнајте више](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) о многим начинима анализе ове врсте података. + +🎓 **Предвиђање временских серија** + +Предвиђање временских серија је употреба модела за предвиђање будућих вредности на основу образаца приказаних у претходно прикупљеним подацима. Иако је могуће користити регресионе моделе за истраживање података временских серија, са временским индексима као x-променљивама на графикону, такви подаци се најбоље анализирају коришћењем посебних типова модела. + +Подаци временских серија су листа уређених запажања, за разлику од података који се могу анализирати линеарном регресијом. Најчешћи модел је ARIMA, акроним за „Ауторегресивни интегрисани покретни просек“. + +[ARIMA модели](https://online.stat.psu.edu/stat510/lesson/1/1.1) „повезују тренутну вредност серије са претходним вредностима и претходним грешкама у предвиђању.“ Они су најприкладнији за анализу података у временском домену, где су подаци уређени током времена. + +> Постоји неколико типова ARIMA модела, о којима можете сазнати више [овде](https://people.duke.edu/~rnau/411arim.htm) и које ћете обрадити у наредној лекцији. + +У наредној лекцији, изградићете ARIMA модел користећи [Униваријантне временске серије](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm), које се фокусирају на једну променљиву која мења своју вредност током времена. Пример ове врсте података је [овај скуп података](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) који бележи месечну концентрацију CO2 на опсерваторији Мауна Лоа: + +| CO2 | YearMonth | Year | Month | +| :----: | :-------: | :---: | :---: | +| 330.62 | 1975.04 | 1975 | 1 | +| 331.40 | 1975.13 | 1975 | 2 | +| 331.87 | 1975.21 | 1975 | 3 | +| 333.18 | 1975.29 | 1975 | 4 | +| 333.92 | 1975.38 | 1975 | 5 | +| 333.43 | 1975.46 | 1975 | 6 | +| 331.85 | 1975.54 | 1975 | 7 | +| 330.01 | 1975.63 | 1975 | 8 | +| 328.51 | 1975.71 | 1975 | 9 | +| 328.41 | 1975.79 | 1975 | 10 | +| 329.25 | 1975.88 | 1975 | 11 | +| 330.97 | 1975.96 | 1975 | 12 | + +✅ Идентификујте променљиву која се мења током времена у овом скупу података + +## Карактеристике података временских серија које треба узети у обзир + +Када посматрате податке временских серија, можда ћете приметити да они имају [одређене карактеристике](https://online.stat.psu.edu/stat510/lesson/1/1.1) које треба узети у обзир и ублажити како бисте боље разумели њихове обрасце. Ако податке временских серија сматрате потенцијалним „сигналом“ који желите да анализирате, ове карактеристике могу се сматрати „шумом“. Често ћете морати да смањите овај „шум“ коришћењем неких статистичких техника. + +Ево неких концепата које треба да знате како бисте могли да радите са временским серијама: + +🎓 **Трендови** + +Трендови се дефинишу као мерљиви пораст или пад током времена. [Прочитајте више](https://machinelearningmastery.com/time-series-trends-in-python). У контексту временских серија, ради се о томе како користити и, ако је потребно, уклонити трендове из ваших временских серија. + +🎓 **[Сезоналност](https://machinelearningmastery.com/time-series-seasonality-with-python/)** + +Сезоналност се дефинише као периодичне флуктуације, као што су празничне гужве које могу утицати на продају, на пример. [Погледајте](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) како различите врсте графикона приказују сезоналност у подацима. + +🎓 **Изузетне вредности** + +Изузетне вредности су далеко од стандардне варијансе података. + +🎓 **Дугорочни циклус** + +Независно од сезоналности, подаци могу показивати дугорочни циклус, као што је економски пад који траје дуже од годину дана. + +🎓 **Константна варијанса** + +Током времена, неки подаци показују константне флуктуације, као што је потрошња енергије током дана и ноћи. + +🎓 **Нагле промене** + +Подаци могу показивати наглу промену која захтева даљу анализу. Нагло затварање предузећа због COVID-а, на пример, изазвало је промене у подацима. + +✅ Ево [пример графикона временских серија](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) који приказује дневну потрошњу валуте у игри током неколико година. Можете ли идентификовати неку од горе наведених карактеристика у овим подацима? + +![Потрошња валуте у игри](../../../../7-TimeSeries/1-Introduction/images/currency.png) + +## Вежба - почетак рада са подацима о потрошњи енергије + +Хајде да почнемо са креирањем модела временских серија за предвиђање будуће потрошње енергије на основу претходне потрошње. + +> Подаци у овом примеру преузети су са такмичења за предвиђање GEFCom2014. Они садрже три године података о сатној потрошњи електричне енергије и температури између 2012. и 2014. године. +> +> Тао Хонг, Пјер Пинсон, Шу Фан, Хамидреза Зареипур, Алберто Троколи и Роб Џ. Хајндман, „Прогностичко предвиђање енергије: Глобално такмичење за предвиђање енергије 2014 и даље“, International Journal of Forecasting, vol.32, no.3, pp 896-913, јул-септембар, 2016. + +1. У фасцикли `working` ове лекције, отворите датотеку _notebook.ipynb_. Почните додавањем библиотека које ће вам помоћи да учитате и визуализујете податке: + + ```python + import os + import matplotlib.pyplot as plt + from common.utils import load_data + %matplotlib inline + ``` + + Имајте на уму да користите датотеке из укључене фасцикле `common` које подешавају ваше окружење и обрађују преузимање података. + +2. Затим, прегледајте податке као dataframe позивајући `load_data()` и `head()`: + + ```python + data_dir = './data' + energy = load_data(data_dir)[['load']] + energy.head() + ``` + + Можете видети да постоје две колоне које представљају датум и потрошњу: + + | | load | + | :-----------------: | :----: | + | 2012-01-01 00:00:00 | 2698.0 | + | 2012-01-01 01:00:00 | 2558.0 | + | 2012-01-01 02:00:00 | 2444.0 | + | 2012-01-01 03:00:00 | 2402.0 | + | 2012-01-01 04:00:00 | 2403.0 | + +3. Сада, нацртајте графикон података позивајући `plot()`: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![графикон енергије](../../../../7-TimeSeries/1-Introduction/images/energy-plot.png) + +4. Сада, нацртајте прву недељу јула 2014. године, тако што ћете је унети као улаз у `energy` у облику `[од датума]: [до датума]`: + + ```python + energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![јул](../../../../7-TimeSeries/1-Introduction/images/july-2014.png) + + Прелеп графикон! Погледајте ове графиконе и видите да ли можете утврдити неку од горе наведених карактеристика. Шта можемо закључити визуализацијом података? + +У наредној лекцији, креираћете ARIMA модел за креирање предвиђања. + +--- + +## 🚀Изазов + +Направите листу свих индустрија и области истраживања које вам падну на памет, а које би имале користи од предвиђања временских серија. Можете ли смислити примену ових техника у уметности? У економетрији? Екологији? Малопродаји? Индустрији? Финансијама? Где још? + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Иако их овде нећемо обрађивати, неуронске мреже се понекад користе за побољшање класичних метода предвиђања временских серија. Прочитајте више о томе [у овом чланку](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412) + +## Задатак + +[Визуелизујте још неке временске серије](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/7-TimeSeries/1-Introduction/assignment.md b/translations/sr/7-TimeSeries/1-Introduction/assignment.md new file mode 100644 index 00000000..b2f97e74 --- /dev/null +++ b/translations/sr/7-TimeSeries/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Визуализујте још неке временске серије + +## Упутства + +Почели сте да учите о предвиђању временских серија тако што сте погледали тип података који захтевају ово посебно моделирање. Визуализовали сте неке податке о енергији. Сада, потражите неке друге податке који би могли да имају користи од предвиђања временских серија. Пронађите три примера (покушајте [Kaggle](https://kaggle.com) и [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)) и направите бележницу за њихову визуализацију. У бележници забележите све посебне карактеристике које имају (сезоналност, нагле промене или други трендови). + +## Рубрика + +| Критеријум | Изузетно | Довољно | Потребно побољшање | +| ---------- | ----------------------------------------------------- | -------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| | Три скупа података су приказана и објашњена у бележници | Два скупа података су приказана и објашњена у бележници | Неколико скупова података је приказано или објашњено у бележници или представљени подаци нису довољни | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен помоћу услуге за превођење уз помоћ вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/7-TimeSeries/1-Introduction/solution/Julia/README.md b/translations/sr/7-TimeSeries/1-Introduction/solution/Julia/README.md new file mode 100644 index 00000000..3c3af2c8 --- /dev/null +++ b/translations/sr/7-TimeSeries/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/7-TimeSeries/1-Introduction/solution/R/README.md b/translations/sr/7-TimeSeries/1-Introduction/solution/R/README.md new file mode 100644 index 00000000..203a3634 --- /dev/null +++ b/translations/sr/7-TimeSeries/1-Introduction/solution/R/README.md @@ -0,0 +1,15 @@ + +ово је привремени привремени текст + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/7-TimeSeries/2-ARIMA/README.md b/translations/sr/7-TimeSeries/2-ARIMA/README.md new file mode 100644 index 00000000..a82433dd --- /dev/null +++ b/translations/sr/7-TimeSeries/2-ARIMA/README.md @@ -0,0 +1,405 @@ + +# Прогнозирање временских серија помоћу ARIMA модела + +У претходној лекцији, научили сте нешто о прогнозирању временских серија и учитали скуп података који приказује флуктуације електричног оптерећења током одређеног временског периода. + +[![Увод у ARIMA](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Увод у ARIMA") + +> 🎥 Кликните на слику изнад за видео: Кратак увод у ARIMA моделе. Пример је урађен у R језику, али су концепти универзални. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Увод + +У овој лекцији, открићете специфичан начин за изградњу модела помоћу [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average). ARIMA модели су посебно погодни за податке који показују [неконстантност](https://wikipedia.org/wiki/Stationary_process). + +## Општи концепти + +Да бисте могли да радите са ARIMA моделима, потребно је да разумете неке основне концепте: + +- 🎓 **Стационарност**. У статистичком контексту, стационарност се односи на податке чија се дистрибуција не мења када се помери у времену. Неконстантни подаци показују флуктуације услед трендова који морају бити трансформисани како би се анализирали. На пример, сезоналност може унети флуктуације у податке и може се елиминисати процесом 'сезонског разликовања'. + +- 🎓 **[Разликовање](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. Разликовање података, у статистичком контексту, односи се на процес трансформисања неконстантних података у константне уклањањем њиховог неконстантног тренда. "Разликовање уклања промене у нивоу временске серије, елиминише тренд и сезоналност и тиме стабилизује средњу вредност временске серије." [Рад Шиксионга и сарадника](https://arxiv.org/abs/1904.07632) + +## ARIMA у контексту временских серија + +Хајде да разложимо делове ARIMA модела како бисмо боље разумели како нам помаже у моделирању временских серија и прављењу предвиђања. + +- **AR - АутоРегресивно**. Ауторегресивни модели, како и само име каже, гледају 'уназад' у времену како би анализирали претходне вредности у вашим подацима и направили претпоставке о њима. Те претходне вредности се називају 'закашњења'. Пример би били подаци који приказују месечну продају оловака. Укупна продаја сваког месеца би се сматрала 'променљивом која се развија' у скупу података. Овај модел се гради тако што се "променљива која нас занима регресира на своје закашњеле (тј. претходне) вредности." [википедија](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) + +- **I - Интегрисано**. За разлику од сличних 'ARMA' модела, 'I' у ARIMA се односи на његов *[интегрисани](https://wikipedia.org/wiki/Order_of_integration)* аспект. Подаци се 'интегришу' када се примењују кораци разликовања како би се елиминисала неконстантност. + +- **MA - Покретни Просек**. Аспект [покретног просека](https://wikipedia.org/wiki/Moving-average_model) овог модела односи се на излазну променљиву која се одређује посматрањем тренутних и претходних вредности закашњења. + +Суштина: ARIMA се користи за прављење модела који што боље одговара специфичном облику података временских серија. + +## Вежба - изградња ARIMA модела + +Отворите [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) фасциклу у овој лекцији и пронађите [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb) датотеку. + +1. Покрените бележницу да учитате Python библиотеку `statsmodels`; биће вам потребна за ARIMA моделе. + +1. Учитајте неопходне библиотеке. + +1. Сада учитајте још неколико библиотека корисних за визуализацију података: + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from pandas.plotting import autocorrelation_plot + from statsmodels.tsa.statespace.sarimax import SARIMAX + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + from IPython.display import Image + + %matplotlib inline + pd.options.display.float_format = '{:,.2f}'.format + np.set_printoptions(precision=2) + warnings.filterwarnings("ignore") # specify to ignore warning messages + ``` + +1. Учитајте податке из `/data/energy.csv` датотеке у Pandas dataframe и погледајте их: + + ```python + energy = load_data('./data')[['load']] + energy.head(10) + ``` + +1. Прикажите све доступне податке о енергији од јануара 2012. до децембра 2014. Не би требало да буде изненађења јер смо ове податке видели у претходној лекцији: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + Сада, хајде да изградимо модел! + +### Креирање скупова за обуку и тестирање + +Сада када су ваши подаци учитани, можете их поделити на скупове за обуку и тестирање. Модел ћете обучавати на скупу за обуку. Као и обично, након што модел заврши обуку, проценићете његову тачност користећи скуп за тестирање. Морате осигурати да скуп за тестирање покрива каснији временски период у односу на скуп за обуку како бисте били сигурни да модел не добија информације из будућих временских периода. + +1. Доделите двомесечни период од 1. септембра до 31. октобра 2014. скупу за обуку. Скуп за тестирање ће укључивати двомесечни период од 1. новембра до 31. децембра 2014: + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + + Пошто ови подаци одражавају дневну потрошњу енергије, постоји снажан сезонски образац, али је потрошња најсличнија потрошњи у последњим данима. + +1. Визуелизујте разлике: + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![подаци за обуку и тестирање](../../../../7-TimeSeries/2-ARIMA/images/train-test.png) + + Дакле, коришћење релативно малог временског прозора за обуку података требало би да буде довољно. + + > Напомена: Пошто функција коју користимо за прилагођавање ARIMA модела користи унутар-узорка валидацију током прилагођавања, изоставићемо валидационе податке. + +### Припрема података за обуку + +Сада треба да припремите податке за обуку тако што ћете извршити филтрирање и скалирање података. Филтрирајте свој скуп података тако да укључује само потребне временске периоде и колоне, а затим извршите скалирање како би подаци били у интервалу 0,1. + +1. Филтрирајте оригинални скуп података тако да укључује само претходно наведене временске периоде по скупу и само потребну колону 'load' плус датум: + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + Можете видети облик података: + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +1. Скалирајте податке тако да буду у опсегу (0, 1). + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + train.head(10) + ``` + +1. Визуелизујте оригиналне и скалиране податке: + + ```python + energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12) + train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12) + plt.show() + ``` + + ![оригинални](../../../../7-TimeSeries/2-ARIMA/images/original.png) + + > Оригинални подаци + + ![скалирани](../../../../7-TimeSeries/2-ARIMA/images/scaled.png) + + > Скалирани подаци + +1. Сада када сте калибрисали скалиране податке, можете скалирати и тест податке: + + ```python + test['load'] = scaler.transform(test) + test.head() + ``` + +### Имплементација ARIMA модела + +Време је да имплементирате ARIMA модел! Сада ћете користити библиотеку `statsmodels` коју сте раније инсталирали. + +Сада треба да следите неколико корака: + + 1. Дефинишите модел позивањем `SARIMAX()` и прослеђивањем параметара модела: p, d, и q параметара, као и P, D, и Q параметара. + 2. Припремите модел за скуп података за обуку позивањем функције `fit()`. + 3. Направите предвиђања позивањем функције `forecast()` и специфицирањем броја корака (хоризонта) за предвиђање. + +> 🎓 Шта значе сви ови параметри? У ARIMA моделу постоје 3 параметра која се користе за моделирање главних аспеката временске серије: сезоналност, тренд и шум. Ови параметри су: + +`p`: параметар повезан са ауторегресивним аспектом модела, који укључује *прошле* вредности. +`d`: параметар повезан са интегрисаним делом модела, који утиче на количину *разликовања* (🎓 сећате се разликовања 👆?) која се примењује на временску серију. +`q`: параметар повезан са делом модела који се односи на покретни просек. + +> Напомена: Ако ваши подаци имају сезонски аспект - што је овде случај - користимо сезонски ARIMA модел (SARIMA). У том случају треба да користите још један сет параметара: `P`, `D`, и `Q` који описују исте асоцијације као `p`, `d`, и `q`, али се односе на сезонске компоненте модела. + +1. Почните тако што ћете подесити вредност хоризонта. Пробајмо 3 сата: + + ```python + # Specify the number of steps to forecast ahead + HORIZON = 3 + print('Forecasting horizon:', HORIZON, 'hours') + ``` + + Одабир најбољих вредности за параметре ARIMA модела може бити изазован јер је донекле субјективан и временски захтеван. Можете размотрити коришћење функције `auto_arima()` из библиотеке [`pyramid`](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html). + +1. За сада пробајте неке ручне изборе како бисте пронашли добар модел. + + ```python + order = (4, 1, 0) + seasonal_order = (1, 1, 0, 24) + + model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order) + results = model.fit() + + print(results.summary()) + ``` + + Исписује се табела резултата. + +Направили сте свој први модел! Сада треба да пронађемо начин да га евалуирамо. + +### Евалуација вашег модела + +Да бисте евалуирали свој модел, можете извршити такозвану `walk forward` валидацију. У пракси, модели временских серија се поново обучавају сваки пут када нови подаци постану доступни. Ово омогућава моделу да направи најбољу прогнозу у сваком временском кораку. + +Почевши од почетка временске серије, користећи ову технику, обучите модел на скупу података за обуку. Затим направите предвиђање за следећи временски корак. Предвиђање се евалуира у односу на познату вредност. Скуп за обуку се затим проширује тако да укључује познату вредност и процес се понавља. + +> Напомена: Требало би да задржите прозор скупа за обуку фиксним ради ефикасније обуке, тако да сваки пут када додате нову опсервацију у скуп за обуку, уклоните опсервацију са почетка скупа. + +Овај процес пружа робуснију процену како ће модел функционисати у пракси. Међутим, долази са рачунарским трошковима креирања толико модела. Ово је прихватљиво ако су подаци мали или ако је модел једноставан, али може бити проблем на већем обиму. + +`Walk-forward` валидација је златни стандард за евалуацију модела временских серија и препоручује се за ваше пројекте. + +1. Прво, креирајте тестну тачку података за сваки корак ХОРИЗОНТА. + + ```python + test_shifted = test.copy() + + for t in range(1, HORIZON+1): + test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H') + + test_shifted = test_shifted.dropna(how='any') + test_shifted.head(5) + ``` + + | | | load | load+1 | load+2 | + | ---------- | -------- | ---- | ------ | ------ | + | 2014-12-30 | 00:00:00 | 0.33 | 0.29 | 0.27 | + | 2014-12-30 | 01:00:00 | 0.29 | 0.27 | 0.27 | + | 2014-12-30 | 02:00:00 | 0.27 | 0.27 | 0.30 | + | 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 | + | 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 | + + Подаци се померају хоризонтално у складу са тачком хоризонта. + +1. Направите предвиђања за тест податке користећи овај приступ клизног прозора у петљи величине скупа тест података: + + ```python + %%time + training_window = 720 # dedicate 30 days (720 hours) for training + + train_ts = train['load'] + test_ts = test_shifted + + history = [x for x in train_ts] + history = history[(-training_window):] + + predictions = list() + + order = (2, 1, 0) + seasonal_order = (1, 1, 0, 24) + + for t in range(test_ts.shape[0]): + model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order) + model_fit = model.fit() + yhat = model_fit.forecast(steps = HORIZON) + predictions.append(yhat) + obs = list(test_ts.iloc[t]) + # move the training window + history.append(obs[0]) + history.pop(0) + print(test_ts.index[t]) + print(t+1, ': predicted =', yhat, 'expected =', obs) + ``` + + Можете пратити процес обуке: + + ```output + 2014-12-30 00:00:00 + 1 : predicted = [0.32 0.29 0.28] expected = [0.32945389435989236, 0.2900626678603402, 0.2739480752014323] + + 2014-12-30 01:00:00 + 2 : predicted = [0.3 0.29 0.3 ] expected = [0.2900626678603402, 0.2739480752014323, 0.26812891674127126] + + 2014-12-30 02:00:00 + 3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795] + ``` + +1. Упоредите предвиђања са стварним оптерећењем: + + ```python + eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)]) + eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1] + eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h') + eval_df['actual'] = np.array(np.transpose(test_ts)).ravel() + eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']]) + eval_df.head() + ``` + + Излаз + | | | timestamp | h | prediction | actual | + | --- | ---------- | --------- | --- | ---------- | -------- | + | 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 | + | 1 | 2014-12-30 | 01:00:00 | t+1 | 2,955.53 | 2,935.00 | + | 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 | + | 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 | + | 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 | + + Посматрајте предвиђања података на сатном нивоу у поређењу са стварним оптерећењем. Колико је тачно? + +### Провера тачности модела + +Проверите тачност вашег модела тестирањем његове средње апсолутне процентуалне грешке (MAPE) за сва предвиђања. +> **🧮 Покажите ми математику** +> +> ![MAPE](../../../../7-TimeSeries/2-ARIMA/images/mape.png) +> +> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) се користи за приказивање тачности предвиђања као односа дефинисаног горњом формулом. Разлика између стварне и предвиђене вредности дели се са стварном вредношћу. "Апсолутна вредност у овом израчунавању се сабира за сваку предвиђену тачку у времену и дели са бројем прилагођених тачака n." [википедија](https://wikipedia.org/wiki/Mean_absolute_percentage_error) +1. Изразите једначину у коду: + + ```python + if(HORIZON > 1): + eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual'] + print(eval_df.groupby('h')['APE'].mean()) + ``` + +1. Израчунајте MAPE за један корак: + + ```python + print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%') + ``` + + MAPE за прогнозу једног корака: 0.5570581332313952 % + +1. Испишите MAPE за прогнозу више корака: + + ```python + print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%') + ``` + + ```output + Multi-step forecast MAPE: 1.1460048657704118 % + ``` + + Добар низак број је најбољи: узмите у обзир да је прогноза са MAPE од 10 погрешна за 10%. + +1. Али као и увек, лакше је видети овакву врсту мерења тачности визуелно, па хајде да то прикажемо графички: + + ```python + if(HORIZON == 1): + ## Plotting single step forecast + eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8)) + + else: + ## Plotting multi step forecast + plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']] + for t in range(1, HORIZON+1): + plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values + + fig = plt.figure(figsize=(15, 8)) + ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0) + ax = fig.add_subplot(111) + for t in range(1, HORIZON+1): + x = plot_df['timestamp'][(t-1):] + y = plot_df['t+'+str(t)][0:len(x)] + ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t)) + + ax.legend(loc='best') + + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![модел временске серије](../../../../7-TimeSeries/2-ARIMA/images/accuracy.png) + +🏆 Веома леп графикон, који приказује модел са добром тачношћу. Одличан посао! + +--- + +## 🚀Изазов + +Истражите начине за тестирање тачности модела временске серије. У овој лекцији смо се дотакли MAPE-а, али да ли постоје други методи које бисте могли користити? Истражите их и додајте белешке. Корисни документ можете пронаћи [овде](https://otexts.com/fpp2/accuracy.html) + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Ова лекција покрива само основе прогнозирања временских серија са ARIMA моделом. Одвојите време да продубите своје знање истражујући [овај репозиторијум](https://microsoft.github.io/forecasting/) и његове различите типове модела како бисте научили друге начине за креирање модела временских серија. + +## Задатак + +[Нови ARIMA модел](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/7-TimeSeries/2-ARIMA/assignment.md b/translations/sr/7-TimeSeries/2-ARIMA/assignment.md new file mode 100644 index 00000000..37ae2c26 --- /dev/null +++ b/translations/sr/7-TimeSeries/2-ARIMA/assignment.md @@ -0,0 +1,25 @@ + +# Нови ARIMA модел + +## Упутства + +Сада када сте направили ARIMA модел, направите нови користећи свежије податке (испробајте један од [ових скупова података са Дјука](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Анотирајте свој рад у свесци, визуализујте податке и свој модел, и тестирајте његову тачност користећи MAPE. + +## Рубрика + +| Критеријум | Изузетно | Задовољавајуће | Потребно побољшање | +| ---------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------- | ---------------------------------- | +| | Представљена је свеска са новим ARIMA моделом који је направљен, тестиран и објашњен уз визуализације и наведену тачност. | Представљена свеска није анотирана или садржи грешке | Представљена је непотпуна свеска | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/7-TimeSeries/2-ARIMA/solution/Julia/README.md b/translations/sr/7-TimeSeries/2-ARIMA/solution/Julia/README.md new file mode 100644 index 00000000..819f1c75 --- /dev/null +++ b/translations/sr/7-TimeSeries/2-ARIMA/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да превод буде тачан, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/7-TimeSeries/2-ARIMA/solution/R/README.md b/translations/sr/7-TimeSeries/2-ARIMA/solution/R/README.md new file mode 100644 index 00000000..470ea0ab --- /dev/null +++ b/translations/sr/7-TimeSeries/2-ARIMA/solution/R/README.md @@ -0,0 +1,15 @@ + +ово је привремени чувач места + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људског преводиоца. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/7-TimeSeries/3-SVR/README.md b/translations/sr/7-TimeSeries/3-SVR/README.md new file mode 100644 index 00000000..3ba38ca6 --- /dev/null +++ b/translations/sr/7-TimeSeries/3-SVR/README.md @@ -0,0 +1,393 @@ + +# Прогнозирање временских серија помоћу модела Support Vector Regressor + +У претходној лекцији научили сте како да користите ARIMA модел за предвиђање временских серија. Сада ћете се упознати са моделом Support Vector Regressor, који је регресиони модел за предвиђање континуираних података. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Увод + +У овој лекцији ћете открити специфичан начин за изградњу модела помоћу [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) за регресију, односно **SVR: Support Vector Regressor**. + +### SVR у контексту временских серија [^1] + +Пре него што разумете значај SVR-а у предвиђању временских серија, ево неких важних концепата које треба да знате: + +- **Регресија:** Надгледана техника учења за предвиђање континуираних вредности из датог скупа улаза. Идеја је да се уклопи крива (или права) у простор карактеристика која садржи максималан број података. [Кликните овде](https://en.wikipedia.org/wiki/Regression_analysis) за више информација. +- **Support Vector Machine (SVM):** Тип модела машинског учења са надзором који се користи за класификацију, регресију и детекцију одступања. Модел представља хиперраван у простору карактеристика, која у случају класификације делује као граница, а у случају регресије као најбоље уклопљена линија. У SVM-у се обично користи Kernel функција за трансформацију скупа података у простор са већим бројем димензија, како би били лакше раздвојиви. [Кликните овде](https://en.wikipedia.org/wiki/Support-vector_machine) за више информација о SVM-у. +- **Support Vector Regressor (SVR):** Тип SVM-а који проналази најбоље уклопљену линију (која је у случају SVM-а хиперраван) са максималним бројем података. + +### Зашто SVR? [^1] + +У претходној лекцији научили сте о ARIMA моделу, који је веома успешан статистички линеарни метод за прогнозирање временских серија. Међутим, у многим случајевима, временске серије садрже *нелинеарности*, које линеарни модели не могу да обраде. У таквим случајевима, способност SVM-а да узме у обзир нелинеарности у подацима за задатке регресије чини SVR успешним у прогнозирању временских серија. + +## Вежба - изградња SVR модела + +Први кораци у припреми података исти су као у претходној лекцији о [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA). + +Отворите [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) фасциклу у овој лекцији и пронађите [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb) датотеку.[^2] + +1. Покрените бележницу и увезите неопходне библиотеке: [^2] + + ```python + import sys + sys.path.append('../../') + ``` + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from sklearn.svm import SVR + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + ``` + +2. Учитајте податке из `/data/energy.csv` датотеке у Pandas dataframe и погледајте их: [^2] + + ```python + energy = load_data('../../data')[['load']] + ``` + +3. Прикажите све доступне податке о енергији од јануара 2012. до децембра 2014: [^2] + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![пуни подаци](../../../../7-TimeSeries/3-SVR/images/full-data.png) + + Сада, хајде да изградимо наш SVR модел. + +### Креирање скупова за обуку и тестирање + +Сада када су ваши подаци учитани, можете их поделити на скуп за обуку и скуп за тестирање. Затим ћете преобликовати податке како бисте креирали скуп података заснован на временским корацима, што ће бити потребно за SVR. Обучаваћете модел на скупу за обуку. Након што модел заврши обуку, проценићете његову тачност на скупу за обуку, скупу за тестирање и затим на целом скупу података како бисте видели укупне перформансе. Морате осигурати да скуп за тестирање покрива каснији временски период у односу на скуп за обуку како бисте спречили да модел добије информације из будућих временских периода [^2] (ситуација позната као *претерано уклапање*). + +1. Доделите двомесечни период од 1. септембра до 31. октобра 2014. скупу за обуку. Скуп за тестирање ће укључивати двомесечни период од 1. новембра до 31. децембра 2014: [^2] + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + +2. Визуелизујте разлике: [^2] + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![подаци за обуку и тестирање](../../../../7-TimeSeries/3-SVR/images/train-test.png) + +### Припрема података за обуку + +Сада треба да припремите податке за обуку тако што ћете извршити филтрирање и скалирање података. Филтрирајте скуп података тако да укључује само потребне временске периоде и колоне, а затим извршите скалирање како би подаци били пројектовани у интервалу 0,1. + +1. Филтрирајте оригинални скуп података тако да укључује само претходно наведене временске периоде по скупу и само потребну колону 'load' плус датум: [^2] + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +2. Скалирајте податке за обуку тако да буду у опсегу (0, 1): [^2] + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + ``` + +4. Сада скалирајте податке за тестирање: [^2] + + ```python + test['load'] = scaler.transform(test) + ``` + +### Креирање података са временским корацима [^1] + +За SVR, трансформишете улазне податке у облик `[batch, timesteps]`. Дакле, преобликујете постојеће `train_data` и `test_data` тако да постоји нова димензија која се односи на временске кораке. + +```python +# Converting to numpy arrays +train_data = train.values +test_data = test.values +``` + +За овај пример, узимамо `timesteps = 5`. Дакле, улази у модел су подаци за прва 4 временска корака, а излаз ће бити подаци за 5. временски корак. + +```python +timesteps=5 +``` + +Претварање података за обуку у 2D тензор помоћу угнежђене листе: + +```python +train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0] +train_data_timesteps.shape +``` + +```output +(1412, 5) +``` + +Претварање података за тестирање у 2D тензор: + +```python +test_data_timesteps=np.array([[j for j in test_data[i:i+timesteps]] for i in range(0,len(test_data)-timesteps+1)])[:,:,0] +test_data_timesteps.shape +``` + +```output +(44, 5) +``` + +Одабир улаза и излаза из података за обуку и тестирање: + +```python +x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]] +x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]] + +print(x_train.shape, y_train.shape) +print(x_test.shape, y_test.shape) +``` + +```output +(1412, 4) (1412, 1) +(44, 4) (44, 1) +``` + +### Имплементација SVR [^1] + +Сада је време за имплементацију SVR-а. За више информација о овој имплементацији, можете погледати [ову документацију](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html). За нашу имплементацију, следимо ове кораке: + +1. Дефинишите модел позивањем `SVR()` и прослеђивањем хиперпараметара модела: kernel, gamma, c и epsilon +2. Припремите модел за податке за обуку позивањем функције `fit()` +3. Направите предвиђања позивањем функције `predict()` + +Сада креирамо SVR модел. Овде користимо [RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel), и постављамо хиперпараметре gamma, C и epsilon на 0.5, 10 и 0.05 респективно. + +```python +model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05) +``` + +#### Обучите модел на подацима за обуку [^1] + +```python +model.fit(x_train, y_train[:,0]) +``` + +```output +SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5, + kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False) +``` + +#### Направите предвиђања модела [^1] + +```python +y_train_pred = model.predict(x_train).reshape(-1,1) +y_test_pred = model.predict(x_test).reshape(-1,1) + +print(y_train_pred.shape, y_test_pred.shape) +``` + +```output +(1412, 1) (44, 1) +``` + +Изградили сте свој SVR! Сада треба да га процените. + +### Процена вашег модела [^1] + +За процену, прво ћемо вратити податке на оригиналну скалу. Затим, како бисмо проверили перформансе, приказаћемо оригинални и предвиђени график временских серија, као и исписати MAPE резултат. + +Скалирајте предвиђени и оригинални излаз: + +```python +# Scaling the predictions +y_train_pred = scaler.inverse_transform(y_train_pred) +y_test_pred = scaler.inverse_transform(y_test_pred) + +print(len(y_train_pred), len(y_test_pred)) +``` + +```python +# Scaling the original values +y_train = scaler.inverse_transform(y_train) +y_test = scaler.inverse_transform(y_test) + +print(len(y_train), len(y_test)) +``` + +#### Проверите перформансе модела на подацима за обуку и тестирање [^1] + +Извлачимо временске ознаке из скупа података како бисмо их приказали на x-оси нашег графика. Имајте у виду да користимо првих ```timesteps-1``` вредности као улаз за први излаз, тако да временске ознаке за излаз почињу након тога. + +```python +train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:] +test_timestamps = energy[test_start_dt:].index[timesteps-1:] + +print(len(train_timestamps), len(test_timestamps)) +``` + +```output +1412 44 +``` + +Прикажите предвиђања за податке за обуку: + +```python +plt.figure(figsize=(25,6)) +plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.title("Training data prediction") +plt.show() +``` + +![предвиђање података за обуку](../../../../7-TimeSeries/3-SVR/images/train-data-predict.png) + +Испишите MAPE за податке за обуку + +```python +print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%') +``` + +```output +MAPE for training data: 1.7195710200875551 % +``` + +Прикажите предвиђања за податке за тестирање + +```python +plt.figure(figsize=(10,3)) +plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![предвиђање података за тестирање](../../../../7-TimeSeries/3-SVR/images/test-data-predict.png) + +Испишите MAPE за податке за тестирање + +```python +print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%') +``` + +```output +MAPE for testing data: 1.2623790187854018 % +``` + +🏆 Имате веома добар резултат на скупу података за тестирање! + +### Проверите перформансе модела на целом скупу података [^1] + +```python +# Extracting load values as numpy array +data = energy.copy().values + +# Scaling +data = scaler.transform(data) + +# Transforming to 2D tensor as per model input requirement +data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0] +print("Tensor shape: ", data_timesteps.shape) + +# Selecting inputs and outputs from data +X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]] +print("X shape: ", X.shape,"\nY shape: ", Y.shape) +``` + +```output +Tensor shape: (26300, 5) +X shape: (26300, 4) +Y shape: (26300, 1) +``` + +```python +# Make model predictions +Y_pred = model.predict(X).reshape(-1,1) + +# Inverse scale and reshape +Y_pred = scaler.inverse_transform(Y_pred) +Y = scaler.inverse_transform(Y) +``` + +```python +plt.figure(figsize=(30,8)) +plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(Y_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![предвиђање целог скупа података](../../../../7-TimeSeries/3-SVR/images/full-data-predict.png) + +```python +print('MAPE: ', mape(Y_pred, Y)*100, '%') +``` + +```output +MAPE: 2.0572089029888656 % +``` + +🏆 Врло лепи графици, који показују модел са добром тачношћу. Браво! + +--- + +## 🚀Изазов + +- Покушајте да подесите хиперпараметре (gamma, C, epsilon) приликом креирања модела и процените на подацима како бисте видели који сет хиперпараметара даје најбоље резултате на скупу података за тестирање. За више информација о овим хиперпараметрима, можете погледати [документацију овде](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel). +- Покушајте да користите различите kernel функције за модел и анализирајте њихове перформансе на скупу података. Корисна документација се налази [овде](https://scikit-learn.org/stable/modules/svm.html#kernel-functions). +- Покушајте да користите различите вредности за `timesteps` како би модел гледао уназад приликом предвиђања. + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и самостално учење + +Ова лекција је била увод у примену SVR-а за прогнозирање временских серија. За више информација о SVR-у, можете погледати [овај блог](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/). Ова [документација на scikit-learn](https://scikit-learn.org/stable/modules/svm.html) пружа свеобухватније објашњење о SVM-овима уопште, [SVR-овима](https://scikit-learn.org/stable/modules/svm.html#regression) и такође другим детаљима имплементације као што су различите [kernel функције](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) које се могу користити и њихови параметри. + +## Задатак + +[Нови SVR модел](assignment.md) + +## Захвалнице + +[^1]: Текст, код и излаз у овом одељку допринео је [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD) +[^2]: Текст, код и излаз у овом одељку преузет је из [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/7-TimeSeries/3-SVR/assignment.md b/translations/sr/7-TimeSeries/3-SVR/assignment.md new file mode 100644 index 00000000..0d42062e --- /dev/null +++ b/translations/sr/7-TimeSeries/3-SVR/assignment.md @@ -0,0 +1,27 @@ + +# Нови SVR модел + +## Упутства [^1] + +Сада када сте направили SVR модел, направите нови користећи свеже податке (пробајте један од [ових скупова података са Дјука](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Бележите свој рад у свесци, визуализујте податке и свој модел, и тестирајте његову тачност користећи одговарајуће графиконе и MAPE. Такође, пробајте да подесите различите хиперпараметре и користите различите вредности за временске кораке. + +## Рубрика [^1] + +| Критеријум | Изузетно | Задовољавајуће | Потребно побољшање | +| ---------- | ---------------------------------------------------------- | ------------------------------------------------------- | -------------------------------- | +| | Свеска је представљена са изграђеним, тестираним и објашњеним SVR моделом, уз визуализације и наведену тачност. | Свеска је представљена, али није аннотована или садржи грешке. | Представљена је непотпуна свеска. | + +[^1]: Текст у овом одељку је заснован на [задатку из ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/7-TimeSeries/README.md b/translations/sr/7-TimeSeries/README.md new file mode 100644 index 00000000..b9917aee --- /dev/null +++ b/translations/sr/7-TimeSeries/README.md @@ -0,0 +1,37 @@ + +# Увод у предвиђање временских серија + +Шта је предвиђање временских серија? Ради се о предвиђању будућих догађаја анализом трендова из прошлости. + +## Регионална тема: светска потрошња електричне енергије ✨ + +У овим двема лекцијама бићете упознати са предвиђањем временских серија, релативно мање познатом облашћу машинског учења која је ипак изузетно вредна за индустријске и пословне примене, као и за друге области. Иако се неуронске мреже могу користити за побољшање корисности ових модела, проучаваћемо их у контексту класичног машинског учења, јер модели помажу у предвиђању будућих резултата на основу прошлости. + +Наш регионални фокус је потрошња електричне енергије у свету, занимљив скуп података за учење о предвиђању будуће потрошње струје на основу образаца из прошлости. Можете видети како ова врста предвиђања може бити изузетно корисна у пословном окружењу. + +![електрична мрежа](../../../7-TimeSeries/images/electric-grid.jpg) + +Фотографија [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) електричних стубова на путу у Раџастану на [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +## Лекције + +1. [Увод у предвиђање временских серија](1-Introduction/README.md) +2. [Изградња ARIMA модела временских серија](2-ARIMA/README.md) +3. [Изградња модела Support Vector Regressor за предвиђање временских серија](3-SVR/README.md) + +## Кредити + +"Увод у предвиђање временских серија" написали су ⚡️ [Francesca Lazzeri](https://twitter.com/frlazzeri) и [Jen Looper](https://twitter.com/jenlooper). Бележнице су први пут објављене онлајн у [Azure "Deep Learning For Time Series" репозиторијуму](https://github.com/Azure/DeepLearningForTimeSeriesForecasting) који је оригинално написала Francesca Lazzeri. Лекцију о SVR моделу написао је [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD). + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/8-Reinforcement/1-QLearning/README.md b/translations/sr/8-Reinforcement/1-QLearning/README.md new file mode 100644 index 00000000..480c9bfd --- /dev/null +++ b/translations/sr/8-Reinforcement/1-QLearning/README.md @@ -0,0 +1,258 @@ + +# Увод у учење појачањем и Q-учење + +![Резиме учења појачањем у машинском учењу у виду скице](../../../../sketchnotes/ml-reinforcement.png) +> Скица од [Tomomi Imura](https://www.twitter.com/girlie_mac) + +Учење појачањем укључује три важна концепта: агента, нека стања и скуп акција за свако стање. Извршавањем акције у одређеном стању, агент добија награду. Замислите поново компјутерску игру Супер Марио. Ви сте Марио, налазите се на нивоу игре, стојите поред ивице литице. Изнад вас је новчић. Ви сте Марио, на нивоу игре, на одређеној позицији ... то је ваше стање. Померање један корак удесно (акција) одвешће вас преко ивице, што би вам донело низак нумерички резултат. Међутим, притиском на дугме за скок добили бисте поен и остали бисте живи. То је позитиван исход и требало би да вам донесе позитиван нумерички резултат. + +Коришћењем учења појачањем и симулатора (игре), можете научити како да играте игру како бисте максимизовали награду, што је у овом случају преживљавање и освајање што више поена. + +[![Увод у учење појачањем](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) + +> 🎥 Кликните на слику изнад да чујете Дмитрија како говори о учењу појачањем + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Предуслови и подешавање + +У овој лекцији ћемо експериментисати са кодом у Пајтону. Требало би да будете у могућности да покренете код из Јупитер бележнице из ове лекције, било на вашем рачунару или негде у облаку. + +Можете отворити [бележницу лекције](https://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), која се користи у коду бележнице. Додајте је у исти директоријум као и бележницу. + +## Увод + +У овој лекцији истражићемо свет **[Петра и вука](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, инспирисан музичком бајком руског композитора [Сергеја Прокофјева](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Користићемо **учење појачањем** како бисмо омогућили Петру да истражује своје окружење, сакупља укусне јабуке и избегава сусрет са вуком. + +**Учење појачањем** (RL) је техника учења која нам омогућава да научимо оптимално понашање **агента** у неком **окружењу** извођењем многих експеримената. Агент у овом окружењу треба да има неки **циљ**, дефинисан **функцијом награде**. + +## Окружење + +Ради једноставности, замислимо Петров свет као квадратну таблу величине `ширина` x `висина`, овако: + +![Петрово окружење](../../../../8-Reinforcement/1-QLearning/images/environment.png) + +Свака ћелија на овој табли може бити: + +* **тло**, по коме Петар и друга створења могу ходати. +* **вода**, по којој очигледно не можете ходати. +* **дрво** или **трава**, место где можете одморити. +* **јабука**, која представља нешто што би Петар радо пронашао како би се нахранио. +* **вук**, који је опасан и треба га избегавати. + +Постоји посебан Пајтон модул, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), који садржи код за рад са овим окружењем. Пошто овај код није важан за разумевање наших концепата, увешћемо модул и користити га за креирање узорка табле (блок кода 1): + +```python +from rlboard import * + +width, height = 8,8 +m = Board(width,height) +m.randomize(seed=13) +m.plot() +``` + +Овај код би требало да испише слику окружења сличну оној изнад. + +## Акције и политика + +У нашем примеру, Петров циљ би био да пронађе јабуку, избегавајући вука и друге препреке. Да би то урадио, он може суштински ходати док не пронађе јабуку. + +Дакле, на било којој позицији, он може изабрати једну од следећих акција: горе, доле, лево и десно. + +Дефинисаћемо те акције као речник и мапирати их на парове одговарајућих промена координата. На пример, померање удесно (`R`) одговарало би пару `(1,0)`. (блок кода 2): + +```python +actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) } +action_idx = { a : i for i,a in enumerate(actions.keys()) } +``` + +Да резимирамо, стратегија и циљ овог сценарија су следећи: + +- **Стратегија** нашег агента (Петра) дефинисана је такозваном **политиком**. Политика је функција која враћа акцију у било ком датом стању. У нашем случају, стање проблема представља табла, укључујући тренутну позицију играча. + +- **Циљ** учења појачањем је да на крају научимо добру политику која ће нам омогућити да ефикасно решимо проблем. Међутим, као основну линију, размотримо најједноставнију политику звану **случајно ходање**. + +## Случајно ходање + +Прво ћемо решити наш проблем имплементацијом стратегије случајног ходања. Са случајним ходањем, насумично ћемо бирати следећу акцију из дозвољених акција, док не стигнемо до јабуке (блок кода 3). + +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 + if start_position: + m.human = start_position + else: + m.random_start() + while True: + if m.at() == Board.Cell.apple: + return n # success! + if m.at() in [Board.Cell.wolf, Board.Cell.water]: + return -1 # eaten by wolf or drowned + 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 + break + n+=1 + + walk(m,random_policy) + ``` + + Позив функције `walk` треба да врати дужину одговарајуће путање, која може варирати од једног покретања до другог. + +1. Покрените експеримент ходања више пута (рецимо, 100) и испишите резултујућу статистику (блок кода 4): + + ```python + def print_statistics(policy): + s,w,n = 0,0,0 + for _ in range(100): + z = walk(m,policy) + if z<0: + w+=1 + else: + s += z + n += 1 + print(f"Average path length = {s/n}, eaten by wolf: {w} times") + + print_statistics(random_policy) + ``` + + Приметите да је просечна дужина путање око 30-40 корака, што је прилично много, с обзиром на то да је просечна удаљеност до најближе јабуке око 5-6 корака. + + Такође можете видети како изгледа Петрово кретање током случајног ходања: + + ![Петрово случајно ходање](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) + +## Функција награде + +Да бисмо нашу политику учинили интелигентнијом, морамо разумети који потези су "бољи" од других. Да бисмо то урадили, морамо дефинисати наш циљ. + +Циљ се може дефинисати у смислу **функције награде**, која ће враћати неку вредност резултата за свако стање. Што је број већи, то је боља функција награде. (блок кода 5) + +```python +move_reward = -0.1 +goal_reward = 10 +end_reward = -10 + +def reward(m,pos=None): + pos = pos or m.human + if not m.is_valid(pos): + return end_reward + x = m.at(pos) + if x==Board.Cell.water or x == Board.Cell.wolf: + return end_reward + if x==Board.Cell.apple: + return goal_reward + return move_reward +``` + +Интересантна ствар код функција награде је да у већини случајева *добијамо значајну награду тек на крају игре*. То значи да наш алгоритам треба некако да запамти "добре" кораке који воде до позитивне награде на крају и повећа њихов значај. Слично томе, сви потези који воде до лоших резултата треба да буду обесхрабрени. + +## Q-учење + +Алгоритам који ћемо овде размотрити зове се **Q-учење**. У овом алгоритму, политика је дефинисана функцијом (или структуром података) која се зове **Q-табела**. Она бележи "квалитет" сваке од акција у датом стању. + +Зове се Q-табела јер је често згодно представити је као табелу или вишедимензионални низ. Пошто наша табла има димензије `ширина` x `висина`, можемо представити Q-табелу користећи numpy низ облика `ширина` x `висина` x `len(actions)`: (блок кода 6) + +```python +Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) +``` + +Приметите да иницијализујемо све вредности Q-табеле једнаком вредношћу, у нашем случају - 0.25. Ово одговара политици "случајног ходања", јер су сви потези у сваком стању подједнако добри. Можемо проследити Q-табелу функцији `plot` како бисмо визуализовали табелу на табли: `m.plot(Q)`. + +![Петрово окружење](../../../../8-Reinforcement/1-QLearning/images/env_init.png) + +У центру сваке ћелије налази се "стрелица" која указује на пожељан правац кретања. Пошто су сви правци једнаки, приказује се тачка. + +Сада треба да покренемо симулацију, истражимо наше окружење и научимо бољу расподелу вредности Q-табеле, што ће нам омогућити да много брже пронађемо пут до јабуке. + +## Суштина Q-учења: Белманова једначина + +Када почнемо да се крећемо, свака акција ће имати одговарајућу награду, тј. теоретски можемо изабрати следећу акцију на основу највише непосредне награде. Међутим, у већини стања, потез неће постићи наш циљ достизања јабуке, и стога не можемо одмах одлучити који је правац бољи. + +> Запамтите да није битан непосредан резултат, већ коначни резултат, који ћемо добити на крају симулације. + +Да бисмо узели у обзир ову одложену награду, морамо користити принципе **[динамичког програмирања](https://en.wikipedia.org/wiki/Dynamic_programming)**, који нам омогућавају да размишљамо о проблему рекурзивно. + +Претпоставимо да се сада налазимо у стању *s*, и желимо да пређемо у следеће стање *s'*. Тиме ћемо добити непосредну награду *r(s,a)*, дефинисану функцијом награде, плус неку будућу награду. Ако претпоставимо да наша Q-табела тачно одражава "атрактивност" сваке акције, онда ћемо у стању *s'* изабрати акцију *a* која одговара максималној вредности *Q(s',a')*. Тако ће најбоља могућа будућа награда коју бисмо могли добити у стању *s* бити дефинисана као `max` *Q(s',a')* (максимум се овде рачуна преко свих могућих акција *a'* у стању *s'*). + +Ово нам даје **Белманову формулу** за израчунавање вредности Q-табеле у стању *s*, за дату акцију *a*: + +## Провера политике + +Пошто 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) +``` + +> Ако пробате код изнад неколико пута, можда ћете приметити да понекад "заглави", и мораћете да притиснете дугме STOP у бележници да бисте га прекинули. Ово се дешава јер могу постојати ситуације када два стања "упућују" једно на друго у смислу оптималне 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-табели прилагођавамо само малим износом). + +Уопштено, важно је запамтити да успех и квалитет процеса учења значајно зависе од параметара, као што су стопа учења, опадање стопе учења и фактор дисконтовања. Ови параметри се често називају **хиперпараметри**, како би се разликовали од **параметара**, које оптимизујемо током тренинга (на пример, коефицијенти у Q-табели). Процес проналажења најбољих вредности хиперпараметара назива се **оптимизација хиперпараметара**, и заслужује посебну тему. + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Задатак +[Реалнији свет](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/8-Reinforcement/1-QLearning/assignment.md b/translations/sr/8-Reinforcement/1-QLearning/assignment.md new file mode 100644 index 00000000..47fb8808 --- /dev/null +++ b/translations/sr/8-Reinforcement/1-QLearning/assignment.md @@ -0,0 +1,41 @@ + +# Реалистичнији свет + +У нашој ситуацији, Петар је могао да се креће готово без умора или глади. У реалистичнијем свету, морао би с времена на време да седне и одмори се, као и да се нахрани. Хајде да учинимо наш свет реалистичнијим, применом следећих правила: + +1. Крећући се са једног места на друго, Петар губи **енергију** и добија **умор**. +2. Петар може да поврати енергију једући јабуке. +3. Петар може да се ослободи умора одмарајући се испод дрвета или на трави (тј. уласком на поље са дрветом или травом - зелено поље). +4. Петар мора да пронађе и убије вука. +5. Да би убио вука, Петар мора да има одређене нивое енергије и умора, у супротном губи битку. + +## Упутства + +Користите оригинални [notebook.ipynb](../../../../8-Reinforcement/1-QLearning/notebook.ipynb) као почетну тачку за ваше решење. + +Измените функцију награде у складу са правилима игре, покрените алгоритам за учење појачањем како бисте научили најбољу стратегију за победу у игри, и упоредите резултате случајног кретања са вашим алгоритмом у смислу броја добијених и изгубљених игара. + +> **Напомена**: У вашем новом свету, стање је сложеније и, поред позиције човека, укључује и нивое умора и енергије. Можете изабрати да представите стање као тројку (табла, енергија, умор), или да дефинишете класу за стање (можете је чак и наследити из `Board`), или чак да измените оригиналну класу `Board` унутар [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py). + +У вашем решењу, молимо вас да задржите код одговоран за стратегију случајног кретања и упоредите резултате вашег алгоритма са случајним кретањем на крају. + +> **Напомена**: Можда ћете морати да прилагодите хиперпараметре како би све функционисало, посебно број епоха. Пошто је успех у игри (борба са вуком) редак догађај, можете очекивати знатно дуже време обуке. + +## Рубрика + +| Критеријум | Изузетно | Задовољавајуће | Потребна побољшања | +| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| | Презентован је нотебук са дефиницијом нових правила света, Q-Learning алгоритмом и текстуалним објашњењима. Q-Learning значајно побољшава резултате у поређењу са случајним кретањем. | Презентован је нотебук, Q-Learning је имплементиран и побољшава резултате у поређењу са случајним кретањем, али не значајно; или је нотебук слабо документован, а код није добро структуриран. | Направљен је покушај редефинисања правила света, али Q-Learning алгоритам не функционише, или функција награде није у потпуности дефинисана. | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/8-Reinforcement/1-QLearning/solution/Julia/README.md b/translations/sr/8-Reinforcement/1-QLearning/solution/Julia/README.md new file mode 100644 index 00000000..acb6d731 --- /dev/null +++ b/translations/sr/8-Reinforcement/1-QLearning/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/8-Reinforcement/1-QLearning/solution/R/README.md b/translations/sr/8-Reinforcement/1-QLearning/solution/R/README.md new file mode 100644 index 00000000..4d636254 --- /dev/null +++ b/translations/sr/8-Reinforcement/1-QLearning/solution/R/README.md @@ -0,0 +1,15 @@ + +ово је привремени чувач места + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/8-Reinforcement/2-Gym/README.md b/translations/sr/8-Reinforcement/2-Gym/README.md new file mode 100644 index 00000000..3b29272e --- /dev/null +++ b/translations/sr/8-Reinforcement/2-Gym/README.md @@ -0,0 +1,351 @@ + +# Проблем са клизањем на шипци + +Проблем који смо решавали у претходној лекцији можда изгледа као играчка, без стварне примене у реалним сценаријима. Међутим, то није случај, јер многи проблеми из стварног живота деле сличан сценарио – укључујући играње шаха или игре Го. Они су слични јер такође имамо таблу са одређеним правилима и **дискретно стање**. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Увод + +У овој лекцији применићемо исте принципе Q-учења на проблем са **континуалним стањем**, односно стањем које је дефинисано једним или више реалних бројева. Бавићемо се следећим проблемом: + +> **Проблем**: Ако Петар жели да побегне од вука, мора бити у стању да се креће брже. Видећемо како Петар може научити да клиза, конкретно, како да одржава равнотежу, користећи Q-учење. + +![Велики бег!](../../../../8-Reinforcement/2-Gym/images/escape.png) + +> Петар и његови пријатељи постају креативни како би побегли од вука! Слика: [Џен Лупер](https://twitter.com/jenlooper) + +Користићемо поједностављену верзију одржавања равнотеже познату као проблем **CartPole**. У свету 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-а можемо креирати различита **окружења**, од симулације CartPole-а до Atari игара. + +> **Напомена**: Остала окружења доступна у OpenAI Gym-у можете видети [овде](https://gym.openai.com/envs/#classic_control). + +Прво, инсталирајмо Gym и увезимо потребне библиотеке (блок кода 1): + +```python +import sys +!{sys.executable} -m pip install gym + +import gym +import matplotlib.pyplot as plt +import numpy as np +import random +``` + +## Вежба – иницијализација окружења CartPole + +Да бисмо радили са проблемом равнотеже шипке, потребно је да иницијализујемо одговарајуће окружење. Свако окружење је повезано са: + +- **Простором посматрања** који дефинише структуру информација које добијамо из окружења. За проблем CartPole-а, добијамо позицију шипке, брзину и неке друге вредности. + +- **Простором акција** који дефинише могуће акције. У нашем случају, простор акција је дискретан и састоји се од две акције – **лево** и **десно**. (блок кода 2) + +1. Да бисмо иницијализовали окружење, укуцајте следећи код: + + ```python + env = gym.make("CartPole-v1") + print(env.action_space) + print(env.observation_space) + print(env.action_space.sample()) + ``` + +Да бисмо видели како окружење функционише, покренимо кратку симулацију од 100 корака. На сваком кораку, задајемо једну од акција које треба предузети – у овој симулацији насумично бирамо акцију из `action_space`. + +1. Покрените код испод и видите шта се дешава. + + ✅ Запамтите да је пожељно покренути овај код на локалној Python инсталацији! (блок кода 3) + + ```python + env.reset() + + for i in range(100): + env.render() + env.step(env.action_space.sample()) + env.close() + ``` + + Требало би да видите нешто слично овој слици: + + ![шипка без равнотеже](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) + +1. Током симулације, потребно је да добијемо посматрања како бисмо одлучили како да делујемо. У ствари, функција `step` враћа тренутна посматрања, функцију награде и заставицу `done` која указује да ли има смисла наставити симулацију или не: (блок кода 4) + + ```python + env.reset() + + done = False + while not done: + env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + print(f"{obs} -> {rew}") + env.close() + ``` + + У излазу у бележници требало би да видите нешто овако: + + ```text + [ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0 + [ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0 + [ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0 + [ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0 + [ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0 + ... + [ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0 + [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0 + ``` + + Вектор посматрања који се враћа на сваком кораку симулације садржи следеће вредности: + - Позиција колица + - Брзина колица + - Угао шипке + - Брзина ротације шипке + +1. Добијте минималну и максималну вредност ових бројева: (блок кода 5) + + ```python + print(env.observation_space.low) + print(env.observation_space.high) + ``` + + Такође можете приметити да је вредност награде на сваком кораку симулације увек 1. То је зато што је наш циљ да преживимо што је дуже могуће, односно да одржимо шипку у разумно вертикалном положају што дуже. + + ✅ У ствари, симулација CartPole-а се сматра решеном ако успемо да добијемо просечну награду од 195 током 100 узастопних покушаја. + +## Дискретизација стања + +У Q-учењу, потребно је изградити Q-табелу која дефинише шта радити у сваком стању. Да бисмо то урадили, стање мора бити **дискретно**, прецизније, мора садржати коначан број дискретних вредности. Због тога је потребно некако **дискретизовати** наша посматрања, мапирајући их на коначан скуп стања. + +Постоји неколико начина да се то уради: + +- **Подела на интервале**. Ако знамо интервал одређене вредности, можемо поделити тај интервал на одређени број **интервала**, а затим заменити вредност бројем интервала коме припада. Ово се може урадити помоћу numpy методе [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html). У овом случају, тачно ћемо знати величину стања, јер ће зависити од броја интервала које изаберемо за дигитализацију. + +✅ Можемо користити линеарну интерполацију да доведемо вредности у неки коначан интервал (рецимо, од -20 до 20), а затим претворити бројеве у целе бројеве заокруживањем. Ово нам даје нешто мању контролу над величином стања, посебно ако не знамо тачне опсеге улазних вредности. На пример, у нашем случају 2 од 4 вредности немају горње/доње границе, што може резултирати бесконачним бројем стања. + +У нашем примеру, користићемо други приступ. Како ћете касније приметити, упркос неодређеним горњим/доњим границама, те вредности ретко прелазе одређене коначне интервале, тако да ће та стања са екстремним вредностима бити веома ретка. + +1. Ево функције која ће узети посматрање из нашег модела и произвести четворку целих бројева: (блок кода 6) + + ```python + def discretize(x): + return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int)) + ``` + +1. Такође истражимо други метод дискретизације користећи интервале: (блок кода 7) + + ```python + def create_bins(i,num): + return np.arange(num+1)*(i[1]-i[0])/num+i[0] + + 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 + 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` и видите да ли постоји разлика. + + ✅ `discretize_bins` враћа број интервала, који почиње од 0. Дакле, за вредности улазне променљиве око 0 враћа број из средине интервала (10). У `discretize`, нисмо се бринули о опсегу излазних вредности, дозвољавајући им да буду негативне, тако да вредности стања нису померене, а 0 одговара 0. (блок кода 8) + + ```python + env.reset() + + done = False + while not done: + #env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + #print(discretize_bins(obs)) + print(discretize(obs)) + env.close() + ``` + + ✅ Раскоментаришите линију која почиње са `env.render` ако желите да видите како се окружење извршава. У супротном, можете га извршити у позадини, што је брже. Ово "невидљиво" извршавање ћемо користити током процеса Q-учења. + +## Структура Q-табеле + +У претходној лекцији, стање је било једноставан пар бројева од 0 до 8, и стога је било згодно представити Q-табелу помоћу numpy тензора облика 8x8x2. Ако користимо дискретизацију интервала, величина нашег векторског стања је такође позната, тако да можемо користити исти приступ и представити стање низом облика 20x20x10x10x2 (овде је 2 димензија простора акција, а прве димензије одговарају броју интервала које смо изабрали за сваку од параметара у простору посматрања). + +Међутим, понекад прецизне димензије простора посматрања нису познате. У случају функције `discretize`, никада не можемо бити сигурни да наше стање остаје унутар одређених граница, јер неке од оригиналних вредности нису ограничене. Због тога ћемо користити мало другачији приступ и представити Q-табелу помоћу речника. + +1. Користите пар *(state, action)* као кључ речника, а вредност би одговарала вредности уноса Q-табеле. (блок кода 9) + + ```python + Q = {} + actions = (0,1) + + def qvalues(state): + return [Q.get((state,a),0) for a in actions] + ``` + + Овде такође дефинишемо функцију `qvalues()`, која враћа листу вредности Q-табеле за дато стање које одговарају свим могућим акцијама. Ако унос није присутан у Q-табели, вратићемо 0 као подразумевану вредност. + +## Почнимо са Q-учењем + +Сада смо спремни да научимо Петра како да одржава равнотежу! + +1. Прво, подесимо неке хиперпараметре: (блок кода 10) + + ```python + # hyperparameters + alpha = 0.3 + gamma = 0.9 + epsilon = 0.90 + ``` + + Овде је `alpha` **стопа учења** која дефинише у којој мери треба да прилагодимо тренутне вредности Q-табеле на сваком кораку. У претходној лекцији почели смо са 1, а затим смањили `alpha` на ниже вредности током тренинга. У овом примеру ћемо га држати константним ради једноставности, а ви можете експериментисати са прилагођавањем вредности `alpha` касније. + + `gamma` је **фактор попуста** који показује у којој мери треба да приоритет дамо будућој награди у односу на тренутну награду. + + `epsilon` је **фактор истраживања/експлоатације** који одређује да ли треба да преферирамо истраживање у односу на експлоатацију или обрнуто. У нашем алгоритму, у `epsilon` проценту случајева изабраћемо следећу акцију према вредностима Q-табеле, а у преосталом броју случајева извршићемо насумичну акцију. Ово ће нам омогућити да истражимо области претраживачког простора које раније нисмо видели. + + ✅ У смислу равнотеже – одабир насумичне акције (истраживање) деловао би као насумичан ударац у погрешном смеру, а шипка би морала да научи како да поврати равнотежу из тих "грешака". + +### Побољшање алгоритма + +Можемо направити два побољшања нашег алгоритма из претходне лекције: + +- **Израчунајте просечну кумулативну награду**, током одређеног броја симулација. Штампаћемо напредак сваких 5000 итерација и просечити нашу кумулативну награду током тог периода. То значи да ако добијемо више од 195 поена – можемо сматрати да је проблем решен, и то са још већим квалитетом него што је потребно. + +- **Израчунајте максимални просечни кумулативни резултат**, `Qmax`, и сачуваћемо Q-табелу која одговара том резултату. Када покренете тренинг, приметићете да понекад просечни кумулативни резултат почиње да опада, и желимо да задржимо вредности Q-табеле које одговарају најбољем моделу посматраном током тренинга. + +1. Сакупите све кумулативне награде у свакој симулацији у вектору `rewards` за даље графичко приказивање. (блок кода 11) + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + + Qmax = 0 + cum_rewards = [] + rewards = [] + for epoch in range(100000): + obs = env.reset() + done = False + cum_reward=0 + # == do the simulation == + while not done: + s = discretize(obs) + if random.random() Qmax: + Qmax = np.average(cum_rewards) + Qbest = Q + cum_rewards=[] + ``` + +Шта можете приметити из ових резултата: + +- **Близу нашег циља**. Веома смо близу постизања циља од 195 кумулативних награда током 100+ узастопних покушаја симулације, или смо га можда већ постигли! Чак и ако добијемо мање бројеве, и даље не знамо, јер просечимо преко 5000 покушаја, а само 100 покушаја је потребно према формалним критеријумима. + +- **Награда почиње да опада**. Понекад награда почиње да опада, што значи да можемо "уништавати" већ научене вредности у Q-табели са онима које погоршавају ситуацију. + +Ово запажање је јасније видљиво ако графички прикажемо напредак тренинга. + +## Графички приказ напретка тренинга + +Током тренинга, сакупили смо вредност кумулативне награде у свакој од итерација у вектору `rewards`. Ево како изгледа када га графички прикажемо у односу на број итерација: + +```python +plt.plot(rewards) +``` + +![необрађен напредак](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png) + +Из овог графика није могуће закључити ништа, јер због природе стохастичког процеса тренинга дужина сесија тренинга варира у великој мери. Да бисмо овај график учинили смисленијим, можемо израчунати **покретни просек** током серије експеримената, рецимо 100. Ово се може згодно урадити помоћу `np.convolve`: (блок кода 12) + +```python +def running_average(x,window): + return np.convolve(x,np.ones(window)/window,mode='valid') + +plt.plot(running_average(rewards,100)) +``` + +![напредак тренинга](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png) + +## Променљиви хиперпараметри + +Да би учење било стабилније, има смисла прилагодити неке од наших хиперпараметара током тренинга. Конкретно: + +- **За стопу учења**, `alpha`, можемо почети са вредностима блиским 1, а затим постепено смањивати параметар. Временом ћемо добијати добре вредности вероватноће у Q-табели, и стога бисмо их требали благо прилагођавати, а не потпуно преписивати новим вредностима. + +- **Повећајте epsilon**. Можда ћ +> **Задатак 1**: Испробајте различите вредности хиперпараметара и проверите да ли можете постићи већи кумулативни наградни резултат. Да ли добијате резултат изнад 195? +> **Задатак 2**: Да бисте формално решили проблем, потребно је да постигнете просечну награду од 195 током 100 узастопних покретања. Мерите то током тренинга и уверите се да сте формално решили проблем! + +## Гледање резултата у пракси + +Било би занимљиво видети како се обучени модел понаша. Покренимо симулацију и пратимо исту стратегију избора акција као током тренинга, узоркујући према расподели вероватноће у Q-табели: (блок кода 13) + +```python +obs = env.reset() +done = False +while not done: + s = discretize(obs) + env.render() + v = probs(np.array(qvalues(s))) + a = random.choices(actions,weights=v)[0] + obs,_,done,_ = env.step(a) +env.close() +``` + +Требало би да видите нешто овако: + +![a balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) + +--- + +## 🚀Изазов + +> **Задатак 3**: Овде смо користили финалну копију Q-табеле, која можда није најбоља. Запамтите да смо сачували најбоље перформантну Q-табелу у променљиву `Qbest`! Пробајте исти пример са најбољом Q-табелом тако што ћете копирати `Qbest` у `Q` и проверите да ли примећујете разлику. + +> **Задатак 4**: Овде нисмо бирали најбољу акцију у сваком кораку, већ смо узорковали према одговарајућој расподели вероватноће. Да ли би имало више смисла увек бирати најбољу акцију, са највишом вредношћу у Q-табели? Ово се може урадити коришћењем функције `np.argmax` да се пронађе број акције који одговара највишој вредности у Q-табели. Имплементирајте ову стратегију и проверите да ли побољшава балансирање. + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Задатак +[Тренирајте Mountain Car](assignment.md) + +## Закључак + +Сада смо научили како да обучимо агенте да постигну добре резултате само пружањем функције награде која дефинише жељено стање игре и давањем могућности да интелигентно истражују простор претраге. Успешно смо применили Q-Learning алгоритам у случајевима дискретних и континуалних окружења, али са дискретним акцијама. + +Важно је такође проучити ситуације у којима је простор акција такође континуалан, као и када је простор посматрања много сложенији, попут слике са екрана Atari игре. У тим проблемима често је потребно користити моћније технике машинског учења, као што су неуронске мреже, како би се постигли добри резултати. Те напредније теме биће предмет нашег наредног, напреднијег курса о вештачкој интелигенцији. + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/8-Reinforcement/2-Gym/assignment.md b/translations/sr/8-Reinforcement/2-Gym/assignment.md new file mode 100644 index 00000000..3b40e815 --- /dev/null +++ b/translations/sr/8-Reinforcement/2-Gym/assignment.md @@ -0,0 +1,55 @@ + +# Тренирање Mountain Car + +[OpenAI Gym](http://gym.openai.com) је дизајниран тако да сви окружења пружају исти API - односно исте методе `reset`, `step` и `render`, као и исте апстракције **простора акција** и **простора опсервација**. Због тога би требало да буде могуће прилагодити исте алгоритме за учење појачања различитим окружењима уз минималне измене кода. + +## Окружење Mountain Car + +[Окружење Mountain Car](https://gym.openai.com/envs/MountainCar-v0/) садржи ауто заглављен у долини: + +Циљ је изаћи из долине и освојити заставицу, извршавајући у сваком кораку једну од следећих акција: + +| Вредност | Значење | +|---|---| +| 0 | Убрзање улево | +| 1 | Без убрзања | +| 2 | Убрзање удесно | + +Главни трик овог проблема је, међутим, то што мотор аута није довољно снажан да пређе планину у једном покушају. Због тога је једини начин да се успе вожња напред-назад ради стицања замаха. + +Простор опсервација се састоји од само две вредности: + +| Бр. | Опсервација | Мин | Макс | +|-----|--------------|-----|-----| +| 0 | Позиција аута | -1.2| 0.6 | +| 1 | Брзина аута | -0.07 | 0.07 | + +Систем награђивања за Mountain Car је прилично сложен: + + * Награда од 0 се додељује ако агент достигне заставицу (позиција = 0.5) на врху планине. + * Награда од -1 се додељује ако је позиција агента мања од 0.5. + +Епизода се завршава ако је позиција аута већа од 0.5, или ако је дужина епизоде већа од 200. +## Упутства + +Прилагодите наш алгоритам за учење појачања да реши проблем Mountain Car. Почните са постојећим [notebook.ipynb](../../../../8-Reinforcement/2-Gym/notebook.ipynb) кодом, замените ново окружење, промените функције за дискретизацију стања и покушајте да постојећи алгоритам обучите уз минималне измене кода. Оптимизујте резултат подешавањем хиперпараметара. + +> **Напомена**: Подешавање хиперпараметара ће вероватно бити потребно да би алгоритам конверговао. +## Рубрика + +| Критеријум | Изузетно | Адекватно | Потребно побољшање | +| -------- | --------- | -------- | ----------------- | +| | Q-Learning алгоритам је успешно прилагођен из примера CartPole, уз минималне измене кода, и у стању је да реши проблем освајања заставице у мање од 200 корака. | Нови Q-Learning алгоритам је преузет са интернета, али је добро документован; или постојећи алгоритам је прилагођен, али не постиже жељене резултате | Студент није успео успешно да прилагоди ниједан алгоритам, али је направио значајне кораке ка решењу (имплементирао дискретизацију стања, структуру података Q-Table, итд.) | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/8-Reinforcement/2-Gym/solution/Julia/README.md b/translations/sr/8-Reinforcement/2-Gym/solution/Julia/README.md new file mode 100644 index 00000000..a412d53e --- /dev/null +++ b/translations/sr/8-Reinforcement/2-Gym/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/8-Reinforcement/2-Gym/solution/R/README.md b/translations/sr/8-Reinforcement/2-Gym/solution/R/README.md new file mode 100644 index 00000000..06c58ec5 --- /dev/null +++ b/translations/sr/8-Reinforcement/2-Gym/solution/R/README.md @@ -0,0 +1,15 @@ + +ово је привремени привремени текст + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/8-Reinforcement/README.md b/translations/sr/8-Reinforcement/README.md new file mode 100644 index 00000000..2b7b95e0 --- /dev/null +++ b/translations/sr/8-Reinforcement/README.md @@ -0,0 +1,67 @@ + +# Увод у учење путем појачања + +Учење путем појачања, RL, сматра се једним од основних парадигми машинског учења, поред надгледаног и ненадгледаног учења. RL се бави доношењем одлука: доношењем исправних одлука или барем учењем из њих. + +Замислите да имате симулирано окружење, као што је берза. Шта се дешава ако уведете одређену регулацију? Да ли она има позитиван или негативан ефекат? Ако се догоди нешто негативно, потребно је да узмете у обзир ту _негативну повратну информацију_, научите из ње и промените курс. Ако је исход позитиван, треба да изградите на тој _позитивној повратној информацији_. + +![Петар и вук](../../../8-Reinforcement/images/peter.png) + +> Петар и његови пријатељи морају побећи од гладног вука! Слика: [Џен Лупер](https://twitter.com/jenlooper) + +## Регионална тема: Петар и вук (Русија) + +[Петар и вук](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) је музичка бајка коју је написао руски композитор [Сергеј Прокофјев](https://en.wikipedia.org/wiki/Sergei_Prokofiev). То је прича о младом пиониру Петру, који храбро излази из своје куће на шумску чистину како би уловио вука. У овом делу ћемо обучити алгоритме машинског учења који ће помоћи Петру: + +- **Истражи** околину и направи оптималну мапу за навигацију +- **Научи** како да користи скејтборд и одржава равнотежу на њему, како би се брже кретао. + +[![Петар и вук](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM) + +> 🎥 Кликните на слику изнад да бисте слушали Петар и вук од Прокофјева + +## Учење путем појачања + +У претходним деловима видели сте два примера проблема машинског учења: + +- **Надгледано учење**, где имамо скупове података који предлажу пример решења за проблем који желимо да решимо. [Класификација](../4-Classification/README.md) и [регресија](../2-Regression/README.md) су задаци надгледаног учења. +- **Ненадгледано учење**, у којем немамо означене податке за обуку. Главни пример ненадгледаног учења је [Кластеровање](../5-Clustering/README.md). + +У овом делу ћемо вас упознати са новом врстом проблема учења који не захтева означене податке за обуку. Постоји неколико врста таквих проблема: + +- **[Полунадгледано учење](https://wikipedia.org/wiki/Semi-supervised_learning)**, где имамо пуно необележених података који се могу користити за претходну обуку модела. +- **[Учење путем појачања](https://wikipedia.org/wiki/Reinforcement_learning)**, у којем агент учи како да се понаша извођењем експеримената у неком симулираном окружењу. + +### Пример - компјутерска игра + +Претпоставимо да желите да научите рачунар да игра игру, као што је шах или [Супер Марио](https://wikipedia.org/wiki/Super_Mario). Да би рачунар играо игру, потребно је да предвиди који потез да направи у свакој ситуацији у игри. Иако ово може изгледати као проблем класификације, није - јер немамо скуп података са стањима и одговарајућим акцијама. Иако можемо имати неке податке, као што су постојеће шаховске партије или снимци играча који играју Супер Марио, вероватно је да ти подаци неће довољно покрити велики број могућих стања. + +Уместо тражења постојећих података о игри, **учење путем појачања** (RL) заснива се на идеји да *натерамо рачунар да игра* више пута и посматрамо резултате. Дакле, за примену учења путем појачања потребно је: + +- **Окружење** и **симулатор** који нам омогућавају да играмо игру више пута. Овај симулатор би дефинисао сва правила игре, као и могућа стања и акције. + +- **Функција награде**, која би нам говорила колико смо добро урадили током сваког потеза или игре. + +Главна разлика између других врста машинског учења и RL-а је у томе што у RL-у обично не знамо да ли побеђујемо или губимо док не завршимо игру. Дакле, не можемо рећи да ли је одређени потез сам по себи добар или не - награду добијамо тек на крају игре. Наш циљ је да дизајнирамо алгоритме који ће нам омогућити да обучимо модел у условима неизвесности. Упознаћемо се са једним RL алгоритмом који се зове **Q-учење**. + +## Лекције + +1. [Увод у учење путем појачања и Q-учење](1-QLearning/README.md) +2. [Коришћење симулационог окружења Gym](2-Gym/README.md) + +## Захвалнице + +"Увод у учење путем појачања" написан је са ♥️ од стране [Дмитрија Сошњикова](http://soshnikov.com) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/9-Real-World/1-Applications/README.md b/translations/sr/9-Real-World/1-Applications/README.md new file mode 100644 index 00000000..5dcebd21 --- /dev/null +++ b/translations/sr/9-Real-World/1-Applications/README.md @@ -0,0 +1,145 @@ + +# Постскриптум: Машинско учење у стварном свету + +![Резиме машинског учења у стварном свету у скици](../../../../sketchnotes/ml-realworld.png) +> Скица од [Tomomi Imura](https://www.twitter.com/girlie_mac) + +У овом курикулуму научили сте многе начине за припрему података за тренирање и креирање модела машинског учења. Направили сте серију класичних модела за регресију, кластеризацију, класификацију, обраду природног језика и временске серије. Честитамо! Сада се можда питате чему све то служи... које су стварне примене ових модела? + +Иако је велики интерес у индустрији усмерен ка вештачкој интелигенцији, која обично користи дубоко учење, и даље постоје вредне примене за класичне моделе машинског учења. Можда чак и данас користите неке од ових примена! У овој лекцији истражићете како осам различитих индустрија и области користе ове типове модела да би њихове апликације биле ефикасније, поузданије, интелигентније и вредније за кориснике. + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +## 💰 Финансије + +Финансијски сектор нуди многе могућности за машинско учење. Многи проблеми у овој области могу се моделирати и решити коришћењем ML. + +### Детекција преваре са кредитним картицама + +Раније у курсу смо научили о [k-means кластеризацији](../../5-Clustering/2-K-Means/README.md), али како се она може користити за решавање проблема везаних за преваре са кредитним картицама? + +K-means кластеризација је корисна у техници детекције превара са кредитним картицама која се зове **детекција одступања**. Одступања, или девијације у посматрањима скупа података, могу нам указати да ли се кредитна картица користи на нормалан начин или се дешава нешто необично. Као што је приказано у раду повезаном испод, можете сортирати податке о кредитним картицама користећи k-means кластеризациони алгоритам и доделити сваку трансакцију кластеру на основу тога колико изгледа као одступање. Затим можете проценити најризичније кластере за преварне у односу на легитимне трансакције. +[Референца](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf) + +### Управљање богатством + +У управљању богатством, појединац или фирма управља инвестицијама у име својих клијената. Њихов задатак је да одрже и повећају богатство на дугорочном нивоу, па је од суштинског значаја одабрати инвестиције које добро функционишу. + +Један од начина да се процени како одређена инвестиција функционише је кроз статистичку регресију. [Линеарна регресија](../../2-Regression/1-Tools/README.md) је вредан алат за разумевање како фонд функционише у односу на неки репер. Такође можемо закључити да ли су резултати регресије статистички значајни, односно колико би утицали на инвестиције клијента. Можете чак и да проширите своју анализу користећи вишеструку регресију, где се могу узети у обзир додатни фактори ризика. За пример како би ово функционисало за одређени фонд, погледајте рад испод о процени перформанси фонда користећи регресију. +[Референца](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/) + +## 🎓 Образовање + +Образовни сектор је такође веома интересантна област где се ML може применити. Постоје занимљиви проблеми које треба решити, као што су откривање варања на тестовима или есејима, или управљање пристрасношћу, намерном или ненамерном, у процесу исправљања. + +### Предвиђање понашања студената + +[Coursera](https://coursera.com), провајдер онлајн курсева, има одличан технолошки блог где дискутују о многим инжењерским одлукама. У овој студији случаја, они су нацртали линију регресије како би истражили било какву корелацију између ниске NPS (Net Promoter Score) оцене и задржавања или напуштања курса. +[Референца](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a) + +### Ублажавање пристрасности + +[Grammarly](https://grammarly.com), асистент за писање који проверава правопис и граматичке грешке, користи софистициране [системе за обраду природног језика](../../6-NLP/README.md) у својим производима. Они су објавили занимљиву студију случаја у свом технолошком блогу о томе како су се носили са родном пристрасношћу у машинском учењу, о чему сте учили у нашој [уводној лекцији о правичности](../../1-Introduction/3-fairness/README.md). +[Референца](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/) + +## 👜 Малопродаја + +Малопродајни сектор дефинитивно може имати користи од употребе ML, од креирања бољег корисничког искуства до оптималног складиштења инвентара. + +### Персонализација корисничког искуства + +У Wayfair-у, компанији која продаје кућне производе као што је намештај, помоћ купцима да пронађу праве производе за свој укус и потребе је од суштинског значаја. У овом чланку, инжењери из компаније описују како користе ML и NLP да "прикажу праве резултате за купце". Посебно, њихов Query Intent Engine је изграђен да користи екстракцију ентитета, тренирање класификатора, екстракцију садржаја и мишљења, и означавање сентимента на рецензијама купаца. Ово је класичан пример како NLP функционише у онлајн малопродаји. +[Референца](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search) + +### Управљање инвентаром + +Иновативне, агилне компаније као што је [StitchFix](https://stitchfix.com), сервис који шаље кутије са одећом потрошачима, у великој мери се ослањају на ML за препоруке и управљање инвентаром. Њихови тимови за стилизовање сарађују са тимовима за мерчандајзинг: "један од наших научника за податке експериментисао је са генетским алгоритмом и применио га на одећу да предвиди шта би био успешан комад одеће који данас не постоји. Донели смо то тиму за мерчандајзинг и сада они могу да користе то као алат." +[Референца](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/) + +## 🏥 Здравство + +Здравствени сектор може користити ML за оптимизацију истраживачких задатака, као и логистичких проблема као што су поновни пријем пацијената или заустављање ширења болести. + +### Управљање клиничким испитивањима + +Токсичност у клиничким испитивањима је велики проблем за произвођаче лекова. Колико токсичности је прихватљиво? У овој студији, анализа различитих метода клиничких испитивања довела је до развоја новог приступа за предвиђање исхода клиничких испитивања. Конкретно, успели су да користе random forest за креирање [класификатора](../../4-Classification/README.md) који може да разликује групе лекова. +[Референца](https://www.sciencedirect.com/science/article/pii/S2451945616302914) + +### Управљање поновним пријемом у болницу + +Болничка нега је скупа, посебно када пацијенти морају поново да буду примљени. Овај рад дискутује о компанији која користи ML за предвиђање потенцијала за поновни пријем користећи [кластеризационе](../../5-Clustering/README.md) алгоритме. Ови кластери помажу аналитичарима да "открију групе поновних пријема који могу делити заједнички узрок". +[Референца](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning) + +### Управљање болестима + +Недавна пандемија је бацила светло на начине на које машинско учење може помоћи у заустављању ширења болести. У овом чланку, препознаћете употребу ARIMA, логистичких кривих, линеарне регресије и SARIMA. "Овај рад је покушај да се израчуна стопа ширења овог вируса и тако предвиде смртни случајеви, опоравци и потврђени случајеви, како би нам помогао да се боље припремимо и преживимо." +[Референца](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/) + +## 🌲 Екологија и зелена технологија + +Природа и екологија се састоје од многих осетљивих система где интеракција између животиња и природе долази у фокус. Важно је бити у стању да тачно измеримо ове системе и реагујемо на одговарајући начин ако се нешто догоди, као што је шумски пожар или пад популације животиња. + +### Управљање шумама + +Научили сте о [учењу путем појачања](../../8-Reinforcement/README.md) у претходним лекцијама. Оно може бити веома корисно када се покушавају предвидети обрасци у природи. Посебно, може се користити за праћење еколошких проблема као што су шумски пожари и ширење инвазивних врста. У Канади, група истраживача је користила учење путем појачања за изградњу модела динамике шумских пожара из сателитских снимака. Користећи иновативни "процес просторног ширења (SSP)", замислили су шумски пожар као "агента на било којој ћелији у пејзажу." "Скуп акција које пожар може предузети са локације у било ком тренутку укључује ширење на север, југ, исток или запад или не ширење. + +Овај приступ обрће уобичајену поставку RL-а, јер је динамика одговарајућег Марковљевог процеса одлучивања (MDP) позната функција за тренутно ширење пожара." Прочитајте више о класичним алгоритмима које је ова група користила на линку испод. +[Референца](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full) + +### Сензори за праћење кретања животиња + +Иако је дубоко учење створило револуцију у визуелном праћењу кретања животиња (можете направити сопствени [трагач за поларне медведе](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) овде), класично ML и даље има своје место у овом задатку. + +Сензори за праћење кретања фармских животиња и IoT користе ову врсту визуелне обраде, али основније технике ML су корисне за претходну обраду података. На пример, у овом раду, положаји оваца су праћени и анализирани користећи различите алгоритме класификатора. Можда ћете препознати ROC криву на страници 335. +[Референца](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf) + +### ⚡️ Управљање енергијом + +У нашим лекцијама о [предвиђању временских серија](../../7-TimeSeries/README.md), позвали смо се на концепт паметних паркинг метара за генерисање прихода за град на основу разумевања понуде и потражње. Овај чланак детаљно дискутује како су кластеризација, регресија и предвиђање временских серија комбиновани да би помогли у предвиђању будуће потрошње енергије у Ирској, на основу паметног мерења. +[Референца](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf) + +## 💼 Осигурање + +Сектор осигурања је још један сектор који користи ML за конструисање и оптимизацију одрживих финансијских и актуарских модела. + +### Управљање волатилношћу + +MetLife, провајдер животног осигурања, отворено говори о начину на који анализирају и ублажавају волатилност у својим финансијским моделима. У овом чланку приметићете визуализације бинарне и ординалне класификације. Такође ћете открити визуализације предвиђања. +[Референца](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf) + +## 🎨 Уметност, култура и књижевност + +У уметности, на пример у новинарству, постоје многи занимљиви проблеми. Откривање лажних вести је велики проблем, јер је доказано да утиче на мишљење људи, па чак и на рушење демократија. Музеји такође могу имати користи од употребе ML у свему, од проналажења веза између артефаката до планирања ресурса. + +### Детекција лажних вести + +Откривање лажних вести постало је игра мачке и миша у данашњим медијима. У овом чланку, истраживачи предлажу систем који комбинује неколико ML техника које смо проучавали и тестирају најбољи модел: "Овај систем се заснива на обради природног језика за екстракцију карактеристика из података, а затим се те карактеристике користе за тренирање класификатора машинског учења као што су Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD) и Logistic Regression (LR)." +[Референца](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf) + +Овај чланак показује како комбиновање различитих ML области може произвести занимљиве резултате који могу помоћи у заустављању ширења лажних вести и стварању стварне штете; у овом случају, импулс је био ширење гласина о COVID третманима које су изазвале насиље. + +### ML у музејима + +Музеји су на прагу AI револуције у којој каталогизација и дигитализација колекција и проналажење веза између артефаката постаје лакше како технологија напредује. Пројекти као што је [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) помажу у откључавању мистерија недоступних колекција као што су Ватикански архиви. Али, пословни аспект музеја има користи од ML модела +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Преглед и Самостално Учење + +Тим за науку о подацима компаније Wayfair има неколико занимљивих видео снимака о томе како користе машинско учење у својој компанији. Вреди [погледати](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)! + +## Задатак + +[Лов на благо у машинском учењу](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/9-Real-World/1-Applications/assignment.md b/translations/sr/9-Real-World/1-Applications/assignment.md new file mode 100644 index 00000000..85c42f2f --- /dev/null +++ b/translations/sr/9-Real-World/1-Applications/assignment.md @@ -0,0 +1,27 @@ + +# Лов на благо у машинском учењу + +## Упутства + +У овој лекцији сте научили о многим стварним примерима који су решени коришћењем класичног машинског учења. Иако употреба дубоког учења, нових техника и алата у вештачкој интелигенцији, као и коришћење неуронских мрежа, доприноси бржем развоју алата за помоћ у овим секторима, класично машинско учење, уз технике из овог курикулума, и даље има велику вредност. + +У овом задатку замислите да учествујете на хакатону. Искористите оно што сте научили у курикулуму да предложите решење користећи класично машинско учење за решавање проблема у једном од сектора о којима је било речи у овој лекцији. Направите презентацију у којој ћете објаснити како ћете имплементирати своју идеју. Додатни поени ако успете да прикупите узорке података и изградите модел машинског учења који подржава ваш концепт! + +## Рубрика + +| Критеријум | Изузетно | Прихватљиво | Потребно побољшање | +| ---------- | ------------------------------------------------------------------ | ------------------------------------------------ | ---------------------- | +| | Презентација у PowerPoint-у је представљена - бонус за изградњу модела | Представљена је основна, неинвентивна презентација | Рад је непотпун | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/9-Real-World/2-Debugging-ML-Models/README.md b/translations/sr/9-Real-World/2-Debugging-ML-Models/README.md new file mode 100644 index 00000000..c0f0e856 --- /dev/null +++ b/translations/sr/9-Real-World/2-Debugging-ML-Models/README.md @@ -0,0 +1,158 @@ + +# Постскриптум: Отклањање грешака у моделима машинског учења помоћу компоненти одговорног AI контролне табле + +## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) + +## Увод + +Машинско учење утиче на наше свакодневне животе. Вештачка интелигенција (AI) налази своје место у неким од најважнијих система који утичу на нас као појединце и на наше друштво, од здравства, финансија, образовања до запошљавања. На пример, системи и модели се користе у задацима доношења одлука, као што су дијагнозе у здравству или откривање превара. Као последица тога, напредак у AI, заједно са убрзаним усвајањем, праћен је еволуирајућим друштвеним очекивањима и све већом регулацијом. Често видимо области у којима AI системи не испуњавају очекивања; откривају нове изазове; а владе почињу да регулишу AI решења. Због тога је важно да се ови модели анализирају како би се обезбедили правични, поуздани, инклузивни, транспарентни и одговорни резултати за све. + +У овом курикулуму ћемо истражити практичне алате који се могу користити за процену да ли модел има проблеме са одговорним AI. Традиционалне технике отклањања грешака у машинском учењу обично се заснивају на квантитативним прорачунима као што су агрегирана тачност или просечан губитак грешке. Замислите шта се може догодити када подаци које користите за изградњу ових модела недостају одређеним демографским групама, као што су раса, пол, политички став, религија, или су непропорционално заступљени. Шта ако се излаз модела тумачи тако да фаворизује неку демографску групу? Ово може довести до претеране или недовољне заступљености ових осетљивих група карактеристика, што резултира проблемима правичности, инклузивности или поузданости модела. Још један фактор је то што се модели машинског учења често сматрају "црним кутијама", што отежава разумевање и објашњење шта покреће предвиђања модела. Сви ови изазови су са којима се суочавају научници података и AI програмери када немају адекватне алате за отклањање грешака и процену правичности или поузданости модела. + +У овој лекцији ћете научити како да отклањате грешке у својим моделима користећи: + +- **Анализу грешака**: идентификацију делова у расподели података где модел има високе стопе грешака. +- **Преглед модела**: спровођење компаративне анализе између различитих кохорти података како би се откриле разлике у метрикама перформанси модела. +- **Анализу података**: истраживање где може постојати претерана или недовољна заступљеност података која може искривити модел да фаворизује једну демографску групу у односу на другу. +- **Важност карактеристика**: разумевање које карактеристике покрећу предвиђања вашег модела на глобалном или локалном нивоу. + +## Предуслов + +Као предуслов, молимо вас да прегледате [алате за одговорни AI за програмере](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) + +> ![Гиф о алатима за одговорни AI](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) + +## Анализа грешака + +Традиционалне метрике перформанси модела које се користе за мерење тачности углавном су прорачуни засновани на исправним и неисправним предвиђањима. На пример, утврђивање да је модел тачан 89% времена са губитком грешке од 0.001 може се сматрати добрим перформансама. Међутим, грешке често нису равномерно распоређене у вашем основном скупу података. Можете добити резултат тачности модела од 89%, али открити да постоје различити региони ваших података у којима модел греши 42% времена. Последице ових образаца грешака у одређеним групама података могу довести до проблема правичности или поузданости. Важно је разумети области у којима модел добро ради или не. Региони података где постоји велики број нетачности у вашем моделу могу се испоставити као важна демографска група података. + +![Анализа и отклањање грешака модела](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-distribution.png) + +Компонента Анализа грешака на RAI контролној табли илуструје како су грешке модела распоређене кроз различите кохорте помоћу визуализације стабла. Ово је корисно за идентификовање карактеристика или области где постоји висока стопа грешака у вашем скупу података. Гледајући где долази већина нетачности модела, можете почети да истражујете основни узрок. Такође можете креирати кохорте података за спровођење анализе. Ове кохорте података помажу у процесу отклањања грешака како би се утврдило зашто је перформанса модела добра у једној кохорти, али погрешна у другој. + +![Анализа грешака](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png) + +Визуелни индикатори на мапи стабла помажу у бржем лоцирању проблематичних области. На пример, тамнија нијанса црвене боје чвора стабла указује на већу стопу грешака. + +Топлотна мапа је још једна функционалност визуализације коју корисници могу користити за истраживање стопе грешака користећи једну или две карактеристике како би пронашли узрок грешака модела у целом скупу података или кохортама. + +![Топлотна мапа анализе грешака](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png) + +Користите анализу грешака када треба да: + +* Добијете дубоко разумевање како су грешке модела распоређене у скупу података и кроз више улазних и димензија карактеристика. +* Разложите агрегатне метрике перформанси како бисте аутоматски открили погрешне кохорте и информисали своје циљане кораке за ублажавање. + +## Преглед модела + +Евалуација перформанси модела машинског учења захтева добијање свеобухватног разумевања његовог понашања. Ово се може постићи прегледом више од једне метрике, као што су стопа грешке, тачност, опозив, прецизност или MAE (просечна апсолутна грешка), како би се пронашле разлике међу метрикама перформанси. Једна метрика перформанси може изгледати одлично, али нетачности могу бити откривене у другој метрици. Поред тога, упоређивање метрика ради откривања разлика у целом скупу података или кохортама помаже у осветљавању области где модел добро ради или не. Ово је посебно важно за уочавање перформанси модела међу осетљивим и неосетљивим карактеристикама (нпр. раса пацијента, пол или старост) како би се открила потенцијална неправичност модела. На пример, откривање да је модел више погрешан у кохорти која има осетљиве карактеристике може указати на потенцијалну неправичност модела. + +Компонента Преглед модела на RAI контролној табли помаже не само у анализи метрика перформанси репрезентације података у кохорти, већ корисницима пружа могућност да упореде понашање модела у различитим кохортама. + +![Кохорте скупа података - преглед модела на RAI контролној табли](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png) + +Функционалност анализе засноване на карактеристикама компоненте омогућава корисницима да сузе подгрупе података унутар одређене карактеристике како би идентификовали аномалије на грануларном нивоу. На пример, контролна табла има уграђену интелигенцију за аутоматско генерисање кохорти за кориснички изабрану карактеристику (нпр. *"time_in_hospital < 3"* или *"time_in_hospital >= 7"*). Ово омогућава кориснику да изолује одређену карактеристику из веће групе података како би видео да ли је она кључни утицајни фактор на погрешне исходе модела. + +![Кохорте карактеристика - преглед модела на RAI контролној табли](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png) + +Компонента Преглед модела подржава две класе метрика разлика: + +**Разлике у перформансама модела**: Ови скупови метрика израчунавају разлику у вредностима изабране метрике перформанси између подгрупа података. Ево неколико примера: + +* Разлика у стопи тачности +* Разлика у стопи грешке +* Разлика у прецизности +* Разлика у опозиву +* Разлика у просечној апсолутној грешци (MAE) + +**Разлике у стопи селекције**: Ова метрика садржи разлику у стопи селекције (пожељно предвиђање) међу подгрупама. Пример овога је разлика у стопама одобрења кредита. Стопа селекције означава фракцију тачака података у свакој класи класификованих као 1 (у бинарној класификацији) или расподелу вредности предвиђања (у регресији). + +## Анализа података + +> "Ако довољно мучите податке, они ће признати било шта" - Роналд Коуз + +Ова изјава звучи екстремно, али је истина да се подаци могу манипулисати како би подржали било који закључак. Таква манипулација понекад може бити ненамерна. Као људи, сви имамо пристрасности, и често је тешко свесно знати када уносите пристрасност у податке. Обезбеђивање правичности у AI и машинском учењу остаје сложен изазов. + +Подаци су велика слепа тачка за традиционалне метрике перформанси модела. Можете имати високе резултате тачности, али то не одражава увек основну пристрасност података која може постојати у вашем скупу података. На пример, ако скуп података запослених има 27% жена на извршним позицијама у компанији и 73% мушкараца на истом нивоу, модел за оглашавање послова обучен на овим подацима може углавном циљати мушку публику за позиције на вишем нивоу. Ова неравнотежа у подацима искривила је предвиђање модела да фаворизује један пол. Ово открива проблем правичности где постоји родна пристрасност у AI моделу. + +Компонента Анализа података на RAI контролној табли помаже у идентификовању области где постоји претерана или недовољна заступљеност у скупу података. Она помаже корисницима да дијагностикују основни узрок грешака и проблема правичности који су уведени због неравнотеже података или недостатка репрезентације одређене групе података. Ово корисницима пружа могућност да визуализују скупове података на основу предвиђених и стварних исхода, група грешака и специфичних карактеристика. Понекад откривање недовољно заступљене групе података такође може открити да модел не учи добро, што доводи до високих нетачности. Модел који има пристрасност у подацима није само проблем правичности већ показује да модел није инклузиван или поуздан. + +![Компонента Анализа података на RAI контролној табли](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png) + +Користите анализу података када треба да: + +* Истражите статистику вашег скупа података одабиром различитих филтера за сегментирање података у различите димензије (познате и као кохорте). +* Разумете расподелу вашег скупа података кроз различите кохорте и групе карактеристика. +* Утврдите да ли су ваша открића у вези са правичношћу, анализом грешака и узрочношћу (изведена из других компоненти контролне табле) резултат расподеле вашег скупа података. +* Одлучите у којим областима треба прикупити више података како бисте ублажили грешке које произилазе из проблема репрезентације, буке у ознакама, буке у карактеристикама, пристрасности у ознакама и сличних фактора. + +## Интерпретабилност модела + +Модели машинског учења често се сматрају "црним кутијама". Разумевање које кључне карактеристике података покрећу предвиђање модела може бити изазовно. Важно је пружити транспарентност у вези са тим зашто модел доноси одређено предвиђање. На пример, ако AI систем предвиђа да је пацијент са дијабетесом у ризику од поновног пријема у болницу у року од мање од 30 дана, требало би да буде у стању да пружи податке који подржавају његово предвиђање. Имање података који подржавају предвиђање доноси транспарентност која помаже клиничарима или болницама да доносе добро информисане одлуке. Поред тога, могућност објашњења зашто је модел донео предвиђање за појединачног пацијента омогућава одговорност у складу са здравственим прописима. Када користите моделе машинског учења на начине који утичу на животе људи, кључно је разумети и објаснити шта утиче на понашање модела. Интерпретабилност и објашњивост модела помажу у одговарању на питања у сценаријима као што су: + +* Отклањање грешака у моделу: Зашто је мој модел направио ову грешку? Како могу побољшати свој модел? +* Сарадња човека и AI: Како могу разумети и веровати одлукама модела? +* Регулаторна усклађеност: Да ли мој модел задовољава законске захтеве? + +Компонента Важност карактеристика на RAI контролној табли помаже вам да отклоните грешке и стекнете свеобухватно разумевање како модел доноси предвиђања. Такође је користан алат за професионалце у машинском учењу и доносиоце одлука да објасне и покажу доказе о карактеристикама које утичу на понашање модела ради регулаторне усклађености. Корисници могу истраживати и глобална и локална објашњења како би потврдили које карактеристике покрећу предвиђања модела. Глобална објашњења наводе најважније карактеристике које су утицале на укуп +- **Превелика или премала заступљеност**. Идеја је да одређена група није заступљена у одређеној професији, а свака услуга или функција која наставља да промовише то доприноси штети. + +### Azure RAI контролна табла + +[Azure RAI контролна табла](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) је изграђена на алатима отвореног кода које су развиле водеће академске институције и организације, укључујући Microsoft, и представљају кључне алате за научнике који се баве подацима и AI програмере да боље разумеју понашање модела, открију и ублаже непожељне проблеме у AI моделима. + +- Сазнајте како да користите различите компоненте тако што ћете погледати [документацију RAI контролне табле.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) + +- Погледајте неке [примере нотебука RAI контролне табле](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) за отклањање проблема у сценаријима одговорног AI у Azure Machine Learning. + +--- +## 🚀 Изазов + +Да бисмо спречили увођење статистичких или податковних пристрасности, требало би: + +- имати разноврсност у позадинама и перспективама међу људима који раде на системима +- улагати у скупове података који одражавају разноврсност нашег друштва +- развијати боље методе за откривање и исправљање пристрасности када се она појави + +Размислите о стварним животним сценаријима где је неправедност очигледна у изградњи и коришћењу модела. Шта још треба узети у обзир? + +## [Квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) +## Преглед и самостално учење + +У овом часу сте научили неке практичне алате за укључивање одговорног AI у машинско учење. + +Погледајте овај радионицу за дубље разумевање тема: + +- Одговорна AI контролна табла: Централно место за оперативну примену RAI у пракси, од Besmira Nushi и Mehrnoosh Sameki + +[![Одговорна AI контролна табла: Централно место за оперативну примену RAI у пракси](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Одговорна AI контролна табла: Централно место за оперативну примену RAI у пракси") + + +> 🎥 Кликните на слику изнад за видео: Одговорна AI контролна табла: Централно место за оперативну примену RAI у пракси, од Besmira Nushi и Mehrnoosh Sameki + +Реферишите следеће материјале да бисте сазнали више о одговорном AI и како изградити поузданије моделе: + +- Microsoft-ови алати RAI контролне табле за отклањање проблема у ML моделима: [Ресурси алата за одговорни AI](https://aka.ms/rai-dashboard) + +- Истражите алатке за одговорни AI: [Github](https://github.com/microsoft/responsible-ai-toolbox) + +- Microsoft-ов центар ресурса за RAI: [Ресурси за одговорни AI – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsoft-ова истраживачка група FATE: [FATE: Праведност, Одговорност, Транспарентност и Етика у AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +## Задатак + +[Истражите RAI контролну таблу](assignment.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/9-Real-World/2-Debugging-ML-Models/assignment.md b/translations/sr/9-Real-World/2-Debugging-ML-Models/assignment.md new file mode 100644 index 00000000..0ee109fe --- /dev/null +++ b/translations/sr/9-Real-World/2-Debugging-ML-Models/assignment.md @@ -0,0 +1,25 @@ + +# Истражите таблу одговорне вештачке интелигенције (RAI) + +## Упутства + +У овој лекцији сте научили о таблу RAI, скупу компоненти изграђених на "отвореним алатима" који помажу научницима података да изврше анализу грешака, истраживање података, процену правичности, тумачење модела, контрафактуалне/шта-ако процене и узрочну анализу на системима вештачке интелигенције. За овај задатак, истражите неке од узорака [бележница](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) табле RAI и изнесите своја запажања у раду или презентацији. + +## Рубрика + +| Критеријум | Изузетно | Задовољавајуће | Потребно побољшање | +| ---------- | -------- | -------------- | ------------------ | +| | Представљен је рад или презентација у PowerPoint-у која дискутује о компонентама табле RAI, бележници која је покренута и закључцима изведеним из њеног покретања | Представљен је рад без закључака | Рад није представљен | + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да превод буде тачан, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/9-Real-World/README.md b/translations/sr/9-Real-World/README.md new file mode 100644 index 00000000..5183fd6f --- /dev/null +++ b/translations/sr/9-Real-World/README.md @@ -0,0 +1,32 @@ + +# Постскриптум: Примена класичног машинског учења у стварном свету + +У овом делу курикулума, упознаћете се са неким примерима примене класичног машинског учења у стварном свету. Истражили смо интернет како бисмо пронашли научне радове и чланке о применама које користе ове стратегије, избегавајући неуронске мреже, дубоко учење и вештачку интелигенцију колико год је то могуће. Сазнајте како се машинско учење користи у пословним системима, еколошким апликацијама, финансијама, уметности и култури, и још много тога. + +![шах](../../../9-Real-World/images/chess.jpg) + +> Фотографија: Алексис Фове на Unsplash + +## Лекција + +1. [Примена машинског учења у стварном свету](1-Applications/README.md) +2. [Отклањање грешака у моделима машинског учења помоћу компоненти Responsible AI контролне табле](2-Debugging-ML-Models/README.md) + +## Аутори + +"Примена у стварном свету" написала је група аутора, укључујући [Џен Лупер](https://twitter.com/jenlooper) и [Орнела Алтуњан](https://twitter.com/ornelladotcom). + +"Отклањање грешака у моделима машинског учења помоћу компоненти Responsible AI контролне табле" написала је [Рут Јакубу](https://twitter.com/ruthieyakubu). + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/CODE_OF_CONDUCT.md b/translations/sr/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..b3605b7f --- /dev/null +++ b/translations/sr/CODE_OF_CONDUCT.md @@ -0,0 +1,23 @@ + +# Microsoft Кодекс понашања за отворени код + +Овај пројекат је усвојио [Microsoft Кодекс понашања за отворени код](https://opensource.microsoft.com/codeofconduct/). + +Ресурси: + +- [Microsoft Кодекс понашања за отворени код](https://opensource.microsoft.com/codeofconduct/) +- [Microsoft Често постављана питања о Кодексу понашања](https://opensource.microsoft.com/codeofconduct/faq/) +- Контактирајте [opencode@microsoft.com](mailto:opencode@microsoft.com) за питања или недоумице + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/CONTRIBUTING.md b/translations/sr/CONTRIBUTING.md new file mode 100644 index 00000000..91107e3b --- /dev/null +++ b/translations/sr/CONTRIBUTING.md @@ -0,0 +1,25 @@ + +# Доприношење + +Овај пројекат поздравља доприносе и предлоге. Већина доприноса захтева да се сагласите са Уговором о лиценци за доприносиоце (CLA), којим изјављујете да имате право да нам дате права за коришћење вашег доприноса, и да то заиста чините. За више детаља, посетите https://cla.microsoft.com. + +> Важно: када преводите текст у овом репозиторијуму, молимо вас да не користите машински превод. Проверићемо преводе преко заједнице, па се пријавите за превођење само на језике које добро познајете. + +Када пошаљете pull request, CLA-бот ће аутоматски утврдити да ли је потребно да обезбедите CLA и одговарајуће означити PR (нпр. етикетом, коментаром). Само пратите упутства која вам бот пружи. Ово ћете морати да урадите само једном за све репозиторијуме који користе наш CLA. + +Овај пројекат је усвојио [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +За више информација погледајте [Често постављана питања о Кодексу понашања](https://opensource.microsoft.com/codeofconduct/faq/) +или контактирајте [opencode@microsoft.com](mailto:opencode@microsoft.com) за додатна питања или коментаре. + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/README.md b/translations/sr/README.md new file mode 100644 index 00000000..9b4a8b4c --- /dev/null +++ b/translations/sr/README.md @@ -0,0 +1,177 @@ + +[![GitHub license](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/) + +### 🌐 Подршка на више језика + +#### Подржано преко GitHub Action-а (Аутоматизовано и увек ажурирано) + +[French](../fr/README.md) | [Spanish](../es/README.md) | [German](../de/README.md) | [Russian](../ru/README.md) | [Arabic](../ar/README.md) | [Persian (Farsi)](../fa/README.md) | [Urdu](../ur/README.md) | [Chinese (Simplified)](../zh/README.md) | [Chinese (Traditional, Macau)](../mo/README.md) | [Chinese (Traditional, Hong Kong)](../hk/README.md) | [Chinese (Traditional, Taiwan)](../tw/README.md) | [Japanese](../ja/README.md) | [Korean](../ko/README.md) | [Hindi](../hi/README.md) | [Bengali](../bn/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Portuguese (Portugal)](../pt/README.md) | [Portuguese (Brazil)](../br/README.md) | [Italian](../it/README.md) | [Polish](../pl/README.md) | [Turkish](../tr/README.md) | [Greek](../el/README.md) | [Thai](../th/README.md) | [Swedish](../sv/README.md) | [Danish](../da/README.md) | [Norwegian](../no/README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](../he/README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](./README.md) | [Croatian](../hr/README.md) | [Slovenian](../sl/README.md) | [Ukrainian](../uk/README.md) | [Burmese (Myanmar)](../my/README.md) + +#### Придружите се заједници + +[![Azure AI Discord](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) + +# Машинско учење за почетнике - Наставни план + +> 🌍 Путујте светом док истражујемо машинско учење кроз културе света 🌍 + +Cloud Advocates у Microsoft-у са задовољством вам представљају наставни план у трајању од 12 недеља и 26 лекција, посвећен **машинском учењу**. У овом курикулуму ћете научити о ономе што се понекад назива **класично машинско учење**, користећи углавном библиотеку Scikit-learn и избегавајући дубоко учење, које је обрађено у нашем [курикулуму за почетнике у вештачкој интелигенцији](https://aka.ms/ai4beginners). Упарите ове лекције са нашим ['Наука о подацима за почетнике' курикулумом](https://aka.ms/ds4beginners), такође! + +Путујте са нама широм света док примењујемо ове класичне технике на податке из различитих делова света. Свака лекција укључује квизове пре и после лекције, писана упутства за завршетак лекције, решење, задатак и још много тога. Наш приступ заснован на пројектима омогућава вам да учите кроз изградњу, што је доказан начин да нове вештине остану у памћењу. + +**✍️ Велико хвала нашим ауторима** Џен Лупер, Стивен Хауел, Франческа Лазери, Томоми Имура, Кеси Бревиу, Дмитриј Сошњиков, Крис Норинг, Анирбан Мукерџи, Орнела Алтуњан, Рут Јакубу и Ејми Бојд + +**🎨 Хвала и нашим илустраторима** Томоми Имура, Дасани Мадипали и Џен Лупер + +**🙏 Посебна захвалност 🙏 нашим Microsoft Student Ambassador ауторима, рецензентима и сарадницима**, посебно Ришиту Даглију, Мухамеду Сакибу Хану Инану, Рохану Рају, Александру Петрескуу, Абишеку Џајсвалу, Наврин Табасум, Јоану Самуили и Снигдхи Агарвал + +**🤩 Додатна захвалност Microsoft Student Ambassador-има Ерику Ванџау, Џаслин Сонди и Видуши Гупти за наше лекције на R језику!** + +# Почетак + +Пратите ове кораке: +1. **Fork репозиторијума**: Кликните на дугме "Fork" у горњем десном углу ове странице. +2. **Клонирајте репозиторијум**: `git clone https://github.com/microsoft/ML-For-Beginners.git` + +> [пронађите све додатне ресурсе за овај курс у нашој Microsoft Learn колекцији](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +**[Студенти](https://aka.ms/student-page)**, да бисте користили овај курикулум, направите fork целог репозиторијума на свој GitHub налог и завршите вежбе сами или у групи: + +- Почните са квизом пре предавања. +- Прочитајте предавање и завршите активности, заустављајући се и размишљајући на сваком провери знања. +- Покушајте да креирате пројекте разумевањем лекција уместо покретања решења; међутим, тај код је доступан у `/solution` фасциклама у свакој лекцији заснованој на пројекту. +- Урадите квиз након предавања. +- Завршите изазов. +- Завршите задатак. +- Након завршетка групе лекција, посетите [таблу за дискусију](https://github.com/microsoft/ML-For-Beginners/discussions) и "учите наглас" попуњавањем одговарајућег PAT рубрика. PAT је алат за процену напретка који попуњавате како бисте унапредили своје учење. Такође можете реаговати на друге PAT-ове како бисмо учили заједно. + +> За даље учење, препоручујемо праћење ових [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott) модула и путања учења. + +**Наставници**, [укључили смо неке предлоге](for-teachers.md) како да користите овај курикулум. + +--- + +## Видео водичи + +Неке лекције су доступне као кратки видео снимци. Све их можете пронаћи унутар лекција или на [ML for Beginners плејлисти на Microsoft Developer YouTube каналу](https://aka.ms/ml-beginners-videos) кликом на слику испод. + +[![ML for beginners banner](../../images/ml-for-beginners-video-banner.png)](https://aka.ms/ml-beginners-videos) + +--- + +## Упознајте тим + +[![Promo video](../../images/ml.gif)](https://youtu.be/Tj1XWrDSYJU) + +**Gif аутор** [Мохит Џаисал](https://linkedin.com/in/mohitjaisal) + +> 🎥 Кликните на слику изнад за видео о пројекту и људима који су га креирали! + +--- + +## Педагошки приступ + +Одабрали смо два педагошка принципа приликом креирања овог курикулума: осигурање да је заснован на **пројектима** и да укључује **честе квизове**. Поред тога, овај курикулум има заједничку **тему** која му даје кохезију. + +Осигуравањем да садржај прати пројекте, процес постаје занимљивији за студенте, а задржавање концепата се повећава. Поред тога, квиз са ниским улозима пре часа поставља намеру студента ка учењу теме, док други квиз након часа осигурава даље задржавање. Овај курикулум је дизајниран да буде флексибилан и забаван и може се узети у целости или делимично. Пројекти почињу са једноставним задацима и постају све сложенији до краја 12-недељног циклуса. Овај курикулум такође укључује додатак о стварним применама машинског учења, који се може користити као додатни задатак или као основа за дискусију. + +> Пронађите наш [Кодекс понашања](CODE_OF_CONDUCT.md), [Упутства за допринос](CONTRIBUTING.md) и [Упутства за превођење](TRANSLATIONS.md). Добродошли сте да нам дате конструктивне повратне информације! + +## Свака лекција укључује + +- опционални скицноте +- опционални додатни видео +- видео водич (само за неке лекције) +- [квиз за загревање пре предавања](https://ff-quizzes.netlify.app/en/ml/) +- писану лекцију +- за лекције засноване на пројектима, корак-по-корак водиче како изградити пројекат +- провере знања +- изазов +- додатно читање +- задатак +- [квиз након предавања](https://ff-quizzes.netlify.app/en/ml/) + +> **Напомена о језицима**: Ове лекције су углавном написане на Python-у, али многе су доступне и на R језику. Да бисте завршили лекцију на R језику, идите у `/solution` фасциклу и потражите R лекције. Оне укључују `.rmd` екстензију која представља **R Markdown** датотеку, која се може једноставно дефинисати као уграђивање `кодних делова` (R или других језика) и `YAML заглавља` (које води како форматирати излазе као што су PDF) у `Markdown документ`. Као таква, она служи као изузетан оквир за ауторство у науци о подацима јер вам омогућава да комбинујете свој код, његов излаз и своје мисли, омогућавајући вам да их запишете у Markdown-у. Штавише, R Markdown документи могу се рендеровати у формате као што су PDF, HTML или Word. + +> **Напомена о квизовима**: Сви квизови се налазе у [Quiz App фасцикли](../../quiz-app), за укупно 52 квиза са по три питања. Они су повезани унутар лекција, али апликација за квиз може се покренути локално; пратите упутства у `quiz-app` фасцикли за локално хостовање или Azure деплој. + +| Број лекције | Тема | Група лекција | Циљеви учења | Повезана лекција | Аутор | +| :-----------: | :------------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: | +| 01 | Увод у машинско учење | [Увод](1-Introduction/README.md) | Научите основне концепте машинског учења | [Лекција](1-Introduction/1-intro-to-ML/README.md) | Мухамед | +| 02 | Историја машинског учења | [Увод](1-Introduction/README.md) | Научите историју ове области | [Лекција](1-Introduction/2-history-of-ML/README.md) | Џен и Ејми | +| 03 | Правичност и машинско учење | [Увод](1-Introduction/README.md) | Која су важна филозофска питања о правичности која студенти треба да размотре приликом изградње и примене ML модела? | [Лекција](1-Introduction/3-fairness/README.md) | Томоми | +| 04 | Технике за машинско учење | [Увод](1-Introduction/README.md) | Које технике истраживачи машинског учења користе за изградњу модела машинског учења? | [Лекција](1-Introduction/4-techniques-of-ML/README.md) | Крис и Џен | +| 05 | Увод у регресију | [Регресија](2-Regression/README.md) | Започните са Python-ом и Scikit-learn-ом за моделе регресије | +
                                • [Python](2-Regression/1-Tools/README.md)
                                • [R](../../2-Regression/1-Tools/solution/R/lesson_1.html)
                                |
                                • Џен
                                • Ерик Ванџау
                                | +| 06 | Цене бундева у Северној Америци 🎃 | [Регресија](2-Regression/README.md) | Визуализујте и очистите податке у припреми за машинско учење |
                                • [Python](2-Regression/2-Data/README.md)
                                • [R](../../2-Regression/2-Data/solution/R/lesson_2.html)
                                |
                                • Џен
                                • Ерик Ванџау
                                | +| 07 | Цене бундева у Северној Америци 🎃 | [Регресија](2-Regression/README.md) | Направите моделе линеарне и полиномске регресије |
                                • [Python](2-Regression/3-Linear/README.md)
                                • [R](../../2-Regression/3-Linear/solution/R/lesson_3.html)
                                |
                                • Џен и Дмитри
                                • Ерик Ванџау
                                | +| 08 | Цене бундева у Северној Америци 🎃 | [Регресија](2-Regression/README.md) | Направите модел логистичке регресије |
                                • [Python](2-Regression/4-Logistic/README.md)
                                • [R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)
                                |
                                • Џен
                                • Ерик Ванџау
                                | +| 09 | Веб апликација 🔌 | [Веб апликација](3-Web-App/README.md) | Направите веб апликацију за коришћење вашег обученог модела | [Python](3-Web-App/1-Web-App/README.md) | Џен | +| 10 | Увод у класификацију | [Класификација](4-Classification/README.md) | Очистите, припремите и визуализујте своје податке; увод у класификацију |
                                • [Python](4-Classification/1-Introduction/README.md)
                                • [R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) |
                                  • Џен и Кеси
                                  • Ерик Ванџау
                                  | +| 11 | Укусна азијска и индијска кухиња 🍜 | [Класификација](4-Classification/README.md) | Увод у класификаторе |
                                  • [Python](4-Classification/2-Classifiers-1/README.md)
                                  • [R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) |
                                    • Џен и Кеси
                                    • Ерик Ванџау
                                    | +| 12 | Укусна азијска и индијска кухиња 🍜 | [Класификација](4-Classification/README.md) | Више класификатора |
                                    • [Python](4-Classification/3-Classifiers-2/README.md)
                                    • [R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) |
                                      • Џен и Кеси
                                      • Ерик Ванџау
                                      | +| 13 | Укусна азијска и индијска кухиња 🍜 | [Класификација](4-Classification/README.md) | Направите веб апликацију препоручивача користећи ваш модел | [Python](4-Classification/4-Applied/README.md) | Џен | +| 14 | Увод у кластерисање | [Кластерисање](5-Clustering/README.md) | Очистите, припремите и визуализујте своје податке; увод у кластерисање |
                                      • [Python](5-Clustering/1-Visualize/README.md)
                                      • [R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) |
                                        • Џен
                                        • Ерик Ванџау
                                        | +| 15 | Истраживање музичких укуса у Нигерији 🎧 | [Кластерисање](5-Clustering/README.md) | Истражите метод кластерисања K-Means |
                                        • [Python](5-Clustering/2-K-Means/README.md)
                                        • [R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) |
                                          • Џен
                                          • Ерик Ванџау
                                          | +| 16 | Увод у обраду природног језика ☕️ | [Обрада природног језика](6-NLP/README.md) | Научите основе обраде природног језика кроз прављење једноставног бота | [Python](6-NLP/1-Introduction-to-NLP/README.md) | Стивен | +| 17 | Уобичајени NLP задаци ☕️ | [Обрада природног језика](6-NLP/README.md) | Продубите своје знање о NLP-у кроз разумевање уобичајених задатака у раду са језичким структурама | [Python](6-NLP/2-Tasks/README.md) | Стивен | +| 18 | Превод и анализа сентимента ♥️ | [Обрада природног језика](6-NLP/README.md) | Превод и анализа сентимента уз Џејн Остин | [Python](6-NLP/3-Translation-Sentiment/README.md) | Стивен | +| 19 | Романтични хотели Европе ♥️ | [Обрада природног језика](6-NLP/README.md) | Анализа сентимента уз рецензије хотела 1 | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | Стивен | +| 20 | Романтични хотели Европе ♥️ | [Обрада природног језика](6-NLP/README.md) | Анализа сентимента уз рецензије хотела 2 | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | Стивен | +| 21 | Увод у прогнозирање временских серија | [Временске серије](7-TimeSeries/README.md) | Увод у прогнозирање временских серија | [Python](7-TimeSeries/1-Introduction/README.md) | Франческа | +| 22 | ⚡️ Светска потрошња енергије ⚡️ - прогнозирање временских серија са ARIMA | [Временске серије](7-TimeSeries/README.md) | Прогнозирање временских серија са ARIMA | [Python](7-TimeSeries/2-ARIMA/README.md) | Франческа | +| 23 | ⚡️ Светска потрошња енергије ⚡️ - прогнозирање временских серија са SVR | [Временске серије](7-TimeSeries/README.md) | Прогнозирање временских серија са регресором подржавајућих вектора | [Python](7-TimeSeries/3-SVR/README.md) | Анирбан | +| 24 | Увод у учење кроз појачање | [Учење кроз појачање](8-Reinforcement/README.md) | Увод у учење кроз појачање са Q-Learning | [Python](8-Reinforcement/1-QLearning/README.md) | Дмитри | +| 25 | Помозите Петру да избегне вука! 🐺 | [Учење кроз појачање](8-Reinforcement/README.md) | Учење кроз појачање уз Gym | [Python](8-Reinforcement/2-Gym/README.md) | Дмитри | +| Постскриптум | Сценарији и апликације машинског учења у стварном свету | [ML у стварном свету](9-Real-World/README.md) | Занимљиве и откривајуће апликације класичног машинског учења | [Лекција](9-Real-World/1-Applications/README.md) | Тим | +| Постскриптум | Дебаговање модела машинског учења уз RAI контролну таблу | [ML у стварном свету](9-Real-World/README.md) | Дебаговање модела машинског учења уз компоненте контролне табле за одговорну вештачку интелигенцију | [Лекција](9-Real-World/2-Debugging-ML-Models/README.md) | Рут Јакубу | + +> [пронађите све додатне ресурсе за овај курс у нашој Microsoft Learn колекцији](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +## Офлајн приступ + +Можете покренути ову документацију офлајн користећи [Docsify](https://docsify.js.org/#/). Форкујте овај репозиторијум, [инсталирајте Docsify](https://docsify.js.org/#/quickstart) на вашем локалном рачунару, а затим у коренском фолдеру овог репозиторијума укуцајте `docsify serve`. Веб сајт ће бити доступан на порту 3000 на вашем локалном серверу: `localhost:3000`. + +## PDF-ови + +Пронађите PDF наставног плана са линковима [овде](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf). + +## 🎒 Остали курсеви + +Наш тим производи и друге курсеве! Погледајте: + +- [Генеративна вештачка интелигенција за почетнике](https://aka.ms/genai-beginners) +- [Генеративна вештачка интелигенција за почетнике .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet) +- [Генеративна вештачка интелигенција са JavaScript-ом](https://github.com/microsoft/generative-ai-with-javascript) +- [Генеративна вештачка интелигенција са Java-ом](https://github.com/microsoft/Generative-AI-for-beginners-java) +- [Вештачка интелигенција за почетнике](https://aka.ms/ai-beginners) +- [Наука о подацима за почетнике](https://aka.ms/datascience-beginners) +- [Машинско учење за почетнике](https://aka.ms/ml-beginners) +- [Сајбер безбедност за почетнике](https://github.com/microsoft/Security-101) +- [Веб развој за почетнике](https://aka.ms/webdev-beginners) +- [Интернет ствари за почетнике](https://aka.ms/iot-beginners) +- [XR развој за почетнике](https://github.com/microsoft/xr-development-for-beginners) +- [Мастеринг GitHub Copilot за парно програмирање](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming) +- [Мастеринг GitHub Copilot за C#/.NET програмере](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers) +- [Изаберите своју Copilot авантуру](https://github.com/microsoft/CopilotAdventures) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да превод буде тачан, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/SECURITY.md b/translations/sr/SECURITY.md new file mode 100644 index 00000000..a86dbaf8 --- /dev/null +++ b/translations/sr/SECURITY.md @@ -0,0 +1,51 @@ + +## Безбедност + +Мајкрософт озбиљно приступа безбедности наших софтверских производа и услуга, што укључује све репозиторијуме изворног кода којима управљамо кроз наше GitHub организације, као што су [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin) и [наше GitHub организације](https://opensource.microsoft.com/). + +Ако верујете да сте пронашли безбедносни пропуст у било ком репозиторијуму који је у власништву Мајкрософта и који испуњава [Мајкрософтову дефиницију безбедносног пропуста](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott), молимо вас да нам га пријавите на начин описан у наставку. + +## Пријављивање безбедносних проблема + +**Молимо вас да не пријављујете безбедносне пропусте путем јавних GitHub проблема.** + +Уместо тога, пријавите их Microsoft Security Response Center (MSRC) на [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). + +Ако више волите да поднесете пријаву без пријављивања, пошаљите е-пошту на [secure@microsoft.com](mailto:secure@microsoft.com). Ако је могуће, шифрујте вашу поруку нашим PGP кључем; преузмите га са [Microsoft Security Response Center PGP Key странице](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). + +Требало би да добијете одговор у року од 24 сата. Ако из неког разлога не добијете одговор, молимо вас да нас контактирате путем е-поште како бисте се уверили да смо примили вашу оригиналну поруку. Додатне информације можете пронаћи на [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Молимо вас да укључите тражене информације наведене у наставку (колико год можете да обезбедите) како бисте нам помогли да боље разумемо природу и обим могућег проблема: + + * Тип проблема (нпр. преливање бафера, SQL инјекција, cross-site scripting, итд.) + * Пуне путање изворних датотека које се односе на манифестацију проблема + * Локација погођеног изворног кода (ознака/грана/комит или директан URL) + * Било која посебна конфигурација потребна за репродукцију проблема + * Упутства корак по корак за репродукцију проблема + * Proof-of-concept или exploit код (ако је могуће) + * Утицај проблема, укључујући начин на који нападач може искористити проблем + +Ове информације ће нам помоћи да брже обрадимо ваш извештај. + +Ако пријављујете за програм награде за багове, потпунији извештаји могу допринети већој награди. Молимо вас да посетите нашу страницу [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) за више детаља о нашим активним програмима. + +## Преферирани језици + +Преферирамо да сва комуникација буде на енглеском језику. + +## Политика + +Мајкрософт следи принцип [Координисаног откривања рањивости](https://www.microsoft.com/en-us/msrc/cvd). + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/SUPPORT.md b/translations/sr/SUPPORT.md new file mode 100644 index 00000000..8bb3ac83 --- /dev/null +++ b/translations/sr/SUPPORT.md @@ -0,0 +1,24 @@ + +# Подршка +## Како пријавити проблеме и добити помоћ + +Овај пројекат користи GitHub Issues за праћење грешака и захтева за нове функције. Молимо вас да претражите постојеће проблеме пре него што пријавите нови, како бисте избегли дуплирање. За нове проблеме, пријавите вашу грешку или захтев за функцију као нови Issue. + +За помоћ и питања у вези са коришћењем овог пројекта, пријавите проблем. + +## Политика подршке компаније Microsoft + +Подршка за овај репозиторијум је ограничена на ресурсе наведене изнад. + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/docs/_sidebar.md b/translations/sr/docs/_sidebar.md new file mode 100644 index 00000000..742a25f2 --- /dev/null +++ b/translations/sr/docs/_sidebar.md @@ -0,0 +1,57 @@ + +- Увод + - [Увод у машинско учење](../1-Introduction/1-intro-to-ML/README.md) + - [Историја машинског учења](../1-Introduction/2-history-of-ML/README.md) + - [Машинско учење и правичност](../1-Introduction/3-fairness/README.md) + - [Технике машинског учења](../1-Introduction/4-techniques-of-ML/README.md) + +- Регресија + - [Алатке за рад](../2-Regression/1-Tools/README.md) + - [Подаци](../2-Regression/2-Data/README.md) + - [Линеарна регресија](../2-Regression/3-Linear/README.md) + - [Логистичка регресија](../2-Regression/4-Logistic/README.md) + +- Изградња веб апликације + - [Веб апликација](../3-Web-App/1-Web-App/README.md) + +- Класификација + - [Увод у класификацију](../4-Classification/1-Introduction/README.md) + - [Класификатори 1](../4-Classification/2-Classifiers-1/README.md) + - [Класификатори 2](../4-Classification/3-Classifiers-2/README.md) + - [Примењено машинско учење](../4-Classification/4-Applied/README.md) + +- Кластерисање + - [Визуализација података](../5-Clustering/1-Visualize/README.md) + - [К-меанс](../5-Clustering/2-K-Means/README.md) + +- Обрада природног језика (NLP) + - [Увод у NLP](../6-NLP/1-Introduction-to-NLP/README.md) + - [Задаци NLP-а](../6-NLP/2-Tasks/README.md) + - [Превод и сентимент](../6-NLP/3-Translation-Sentiment/README.md) + - [Рецензије хотела 1](../6-NLP/4-Hotel-Reviews-1/README.md) + - [Рецензије хотела 2](../6-NLP/5-Hotel-Reviews-2/README.md) + +- Прогноза временских серија + - [Увод у прогнозу временских серија](../7-TimeSeries/1-Introduction/README.md) + - [ARIMA](../7-TimeSeries/2-ARIMA/README.md) + - [SVR](../7-TimeSeries/3-SVR/README.md) + +- Учење кроз појачање + - [Q-Learning](../8-Reinforcement/1-QLearning/README.md) + - [Gym](../8-Reinforcement/2-Gym/README.md) + +- Машинско учење у стварном свету + - [Апликације](../9-Real-World/1-Applications/README.md) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/for-teachers.md b/translations/sr/for-teachers.md new file mode 100644 index 00000000..bea6d8d4 --- /dev/null +++ b/translations/sr/for-teachers.md @@ -0,0 +1,37 @@ + +## За наставнике + +Да ли бисте желели да користите овај наставни план у вашој учионици? Слободно га користите! + +Заправо, можете га користити директно на GitHub-у, уз помоћ GitHub Classroom-а. + +Да бисте то урадили, направите форк овог репозиторијума. Биће потребно да креирате репозиторијум за сваку лекцију, тако да ћете морати да издвојите сваки фолдер у посебан репозиторијум. На тај начин, [GitHub Classroom](https://classroom.github.com/classrooms) може да обради сваку лекцију засебно. + +Ова [потпуна упутства](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) ће вам дати идеју како да поставите вашу учионицу. + +## Коришћење репозиторијума у постојећем облику + +Ако желите да користите овај репозиторијум у његовом тренутном облику, без употребе GitHub Classroom-а, то је такође могуће. Биће потребно да комуницирате са вашим ученицима о томе коју лекцију да заједно обрађујете. + +У онлајн формату (Zoom, Teams или други) можете организовати групне собе за квизове и менторисати ученике како би се припремили за учење. Затим позовите ученике да учествују у квизовима и да предају своје одговоре као 'issues' у одређено време. Исто можете урадити и са задацима, ако желите да ученици раде заједно и отворено. + +Ако више волите приватни формат, замолите ученике да направе форк наставног плана, лекцију по лекцију, у своје приватне GitHub репозиторијуме и да вам дају приступ. На тај начин могу приватно завршити квизове и задатке и предати их вама путем 'issues' на вашем репозиторијуму за учионицу. + +Постоји много начина да ово функционише у онлајн учионици. Обавестите нас шта вам најбоље одговара! + +## Молимо вас да нам дате своје мишљење! + +Желимо да овај наставни план буде користан за вас и ваше ученике. Молимо вас да нам оставите [повратне информације](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u). + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења настала услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/quiz-app/README.md b/translations/sr/quiz-app/README.md new file mode 100644 index 00000000..6810b6b0 --- /dev/null +++ b/translations/sr/quiz-app/README.md @@ -0,0 +1,127 @@ + +# Квизови + +Ови квизови су предавања пре и после лекција за ML наставни план на https://aka.ms/ml-beginners + +## Постављање пројекта + +``` +npm install +``` + +### Компилирање и брзо учитавање за развој + +``` +npm run serve +``` + +### Компилирање и минимизација за продукцију + +``` +npm run build +``` + +### Провера и исправке датотека + +``` +npm run lint +``` + +### Прилагођавање конфигурације + +Погледајте [Референцу конфигурације](https://cli.vuejs.org/config/). + +Заслуге: Захвалност оригиналној верзији ове апликације за квиз: https://github.com/arpan45/simple-quiz-vue + +## Деплојовање на Azure + +Ево корак-по-корак упутства које ће вам помоћи да започнете: + +1. Форкујте GitHub репозиторијум +Уверите се да је ваш код за статичну веб апликацију у вашем GitHub репозиторијуму. Форкујте овај репозиторијум. + +2. Направите Azure статичну веб апликацију +- Направите [Azure налог](http://azure.microsoft.com) +- Идите на [Azure портал](https://portal.azure.com) +- Кликните на „Create a resource“ и потражите „Static Web App“. +- Кликните „Create“. + +3. Конфигуришите статичну веб апликацију +- Основно: + - Претплата: Изаберите вашу Azure претплату. + - Група ресурса: Направите нову групу ресурса или користите постојећу. + - Назив: Унесите назив за вашу статичну веб апликацију. + - Регион: Изаберите регион најближи вашим корисницима. + +- #### Детаљи о деплојовању: + - Извор: Изаберите „GitHub“. + - GitHub налог: Овластите Azure да приступи вашем GitHub налогу. + - Организација: Изаберите вашу GitHub организацију. + - Репозиторијум: Изаберите репозиторијум који садржи вашу статичну веб апликацију. + - Грана: Изаберите грану са које желите да деплојујете. + +- #### Детаљи о изградњи: + - Пресети изградње: Изаберите оквир у коме је ваша апликација направљена (нпр. React, Angular, Vue, итд.). + - Локација апликације: Наведите фасциклу која садржи код ваше апликације (нпр. / ако је у корену). + - Локација API-ја: Ако имате API, наведите његову локацију (опционо). + - Локација излазног фолдера: Наведите фасциклу где се генерише излаз изградње (нпр. build или dist). + +4. Преглед и креирање +Прегледајте своја подешавања и кликните „Create“. Azure ће поставити неопходне ресурсе и креирати GitHub Actions workflow у вашем репозиторијуму. + +5. GitHub Actions Workflow +Azure ће аутоматски креирати GitHub Actions workflow датотеку у вашем репозиторијуму (.github/workflows/azure-static-web-apps-.yml). Овај workflow ће обрађивати процес изградње и деплојовања. + +6. Праћење деплојовања +Идите на картицу „Actions“ у вашем GitHub репозиторијуму. +Требало би да видите workflow који се извршава. Овај workflow ће изградити и деплојовати вашу статичну веб апликацију на Azure. +Када workflow буде завршен, ваша апликација ће бити активна на обезбеђеном Azure URL-у. + +### Пример датотеке workflow-а + +Ево примера како би GitHub Actions workflow датотека могла изгледати: +name: Azure Static Web Apps CI/CD +``` +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - main + +jobs: + build_and_deploy_job: + runs-on: ubuntu-latest + name: Build and Deploy Job + steps: + - uses: actions/checkout@v2 + - name: Build And Deploy + id: builddeploy + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }} + repo_token: ${{ secrets.GITHUB_TOKEN }} + action: "upload" + app_location: "/quiz-app" # App source code path + api_location: ""API source code path optional + output_location: "dist" #Built app content directory - optional +``` + +### Додатни ресурси +- [Документација за Azure статичне веб апликације](https://learn.microsoft.com/azure/static-web-apps/getting-started) +- [Документација за GitHub Actions](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/sketchnotes/LICENSE.md b/translations/sr/sketchnotes/LICENSE.md new file mode 100644 index 00000000..d83f0961 --- /dev/null +++ b/translations/sr/sketchnotes/LICENSE.md @@ -0,0 +1,126 @@ + +Атрибуција-Делити под истим условима 4.0 Међународна + +======================================================================= + +Creative Commons Corporation („Creative Commons“) није адвокатска фирма и не пружа правне услуге или правне савете. Дистрибуција јавних лиценци Creative Commons не ствара однос адвокат-клијент или било који други однос. Creative Commons чини своје лиценце и повезане информације доступним „као што јесу“. Creative Commons не даје гаранције у вези са својим лиценцама, било којим материјалом лиценцираним под њиховим условима и одредбама, или било којим повезаним информацијама. Creative Commons одриче сваку одговорност за штету која произилази из њихове употребе у највећој могућој мери. + +Коришћење јавних лиценци Creative Commons + +Јавне лиценце Creative Commons пружају стандардни сет услова које творци и други носиоци права могу користити за дељење оригиналних ауторских дела и другог материјала који подлеже ауторским правима и одређеним другим правима наведеним у јавној лиценци испод. Следеће напомене су само информативне, нису исцрпне и не чине део наших лиценци. + + Напомене за лиценцоре: Наше јавне лиценце су намењене за употребу од стране оних који су овлашћени да јавности дају дозволу за коришћење материјала на начине који су иначе ограничени ауторским правима и одређеним другим правима. Наше лиценце су неповратне. Лиценцори треба да прочитају и разумеју услове лиценце коју одаберу пре него што је примене. Лиценцори такође треба да обезбеде сва потребна права пре примене наших лиценци како би јавност могла да поново користи материјал како је очекивано. Лиценцори треба јасно да означе сваки материјал који није предмет лиценце. Ово укључује други материјал лиценциран под CC лиценцом или материјал коришћен под изузетком или ограничењем ауторских права. Више напомена за лиценцоре: + wiki.creativecommons.org/Considerations_for_licensors + + Напомене за јавност: Коришћењем једне од наших јавних лиценци, лиценцор даје јавности дозволу да користи лиценцирани материјал под одређеним условима. Ако дозвола лиценцора није потребна из било ког разлога — на пример, због применљивог изузетка или ограничења ауторских права — онда та употреба није регулисана лиценцом. Наше лиценце дају само дозволе под ауторским правима и одређеним другим правима које лиценцор има овлашћење да да. Употреба лиценцираног материјала може и даље бити ограничена из других разлога, укључујући то што други имају ауторска права или друга права на материјал. Лиценцор може поставити посебне захтеве, као што је тражење да се све измене означе или опишу. Иако то није обавезно према нашим лиценцама, препоручује се да поштујете те захтеве где је то разумно. Више напомена за јавност: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Атрибуција-Делити под истим условима 4.0 Међународна јавна лиценца + +Коришћењем Лиценцираних права (дефинисаних испод), прихватате и слажете се да будете обавезани условима Creative Commons Атрибуција-Делити под истим условима 4.0 Међународне јавне лиценце („Јавна лиценца“). У мери у којој се ова Јавна лиценца може тумачити као уговор, добијате Лиценцирана права у замену за прихватање ових услова, а Лиценцор вам даје та права у замену за користи које Лиценцор добија од стављања Лиценцираног материјала на располагање под овим условима. + +Раздел 1 -- Дефиниције. + + а. Прерађени материјал означава материјал који подлеже ауторским правима и сличним правима, а који је изведен из или заснован на Лиценцираном материјалу и у којем је Лиценцирани материјал преведен, измењен, уређен, трансформисан или на други начин модификован на начин који захтева дозволу под ауторским правима и сличним правима која држи Лиценцор. За потребе ове Јавне лиценце, где је Лиценцирани материјал музичко дело, извођење или звучни запис, Прерађени материјал се увек производи када је Лиценцирани материјал синхронизован у временском односу са покретном сликом. + + б. Лиценца адаптера означава лиценцу коју примењујете на ваша ауторска права и слична права у вашим доприносима Прерађеном материјалу у складу са условима ове Јавне лиценце. + + в. Лиценца компатибилна са BY-SA означава лиценцу наведено на creativecommons.org/compatiblelicenses, коју је Creative Commons одобрио као суштински еквивалент овој Јавној лиценци. + + г. Ауторска права и слична права означавају ауторска права и/или слична права блиско повезана са ауторским правима, укључујући, без ограничења, извођење, емитовање, звучни запис и sui generis права на базу података, без обзира на то како су права означена или категорисана. За потребе ове Јавне лиценце, права наведена у Разделу 2(б)(1)-(2) нису ауторска права и слична права. + + д. Ефективне технолошке мере означавају мере које, у одсуству одговарајућег овлашћења, не могу бити заобиђене према законима који испуњавају обавезе према Члану 11 Уговора о ауторским правима WIPO усвојеног 20. децембра 1996. године, и/или сличним међународним споразумима. + + ђ. Изузеци и ограничења означавају праведну употребу, праведно поступање и/или било који други изузетак или ограничење ауторских права и сличних права који се примењују на вашу употребу Лиценцираног материјала. + + е. Елементи лиценце означавају атрибуте лиценце наведене у називу Creative Commons Јавне лиценце. Елементи лиценце ове Јавне лиценце су Атрибуција и Делити под истим условима. + + ж. Лиценцирани материјал означава уметничко или књижевно дело, базу података или други материјал на који је Лиценцор применио ову Јавну лиценцу. + + з. Лиценцирана права означавају права која су вам додељена под условима ове Јавне лиценце, а која су ограничена на сва ауторска права и слична права која се примењују на вашу употребу Лиценцираног материјала и која Лиценцор има овлашћење да лиценцира. + + и. Лиценцор означава појединца или ентитет који додељује права под овом Јавном лиценцом. + + ј. Делити означава пружање материјала јавности било којим средствима или процесом који захтева дозволу под Лиценцираним правима, као што су репродукција, јавно приказивање, јавно извођење, дистрибуција, ширење, комуникација или увоз, и стављање материјала на располагање јавности, укључујући на начине који омогућавају члановима јавности да приступе материјалу са места и у време које сами изаберу. + + к. Sui generis права на базу података означавају права другачија од ауторских права која произилазе из Директиве 96/9/EC Европског парламента и Савета од 11. марта 1996. године о правној заштити база података, како је измењена и/или наследила, као и друга суштински еквивалентна права било где у свету. + + л. Ви означава појединца или ентитет који користи Лиценцирана права под овом Јавном лиценцом. Ваш има одговарајуће значење. + +... +Права, затим база података у којој имате Sui Generis Database права (али не њен појединачни садржај) је адаптирани материјал, + +укључујући за потребе одељка 3(б); и +ц. Морате се придржавати услова из одељка 3(а) ако делите целокупан или значајан део садржаја базе података. + +Ради избегавања сумње, овај одељак 4 допуњује и не замењује ваше обавезе према овој јавној лиценци где лиценцирана права укључују друга ауторска и слична права. + +--- + +Одељак 5 -- Одрицање од гаранција и ограничење одговорности. + +а. ОСИМ АКО ЛИЦЕНЦОДАВАЦ ПОСЕБНО НЕ ПРЕДУЗМЕ ДРУГАЧИЈЕ, У МЕРИ У КОЈОЈ ЈЕ ТО МОГУЋЕ, ЛИЦЕНЦОДАВАЦ НУДИ ЛИЦЕНЦИРАНИ МАТЕРИЈАЛ У СТАЊУ "КАКВО ЈЕ" И "КАКВО ЈЕ ДОСТУПНО", И НЕ ДАЈЕ НИКАКВЕ ИЗЈАВЕ ИЛИ ГАРАНЦИЈЕ БИЛО КОЈЕ ВРСТЕ У ВЕЗИ СА ЛИЦЕНЦИРАНИМ МАТЕРИЈАЛОМ, БИЛО ИЗРИЧИТЕ, ПОДРАЗУМЕВАНЕ, ЗАКОНСКЕ ИЛИ ДРУГЕ. ОВО УКЉУЧУЈЕ, БЕЗ ОГРАНИЧЕЊА, ГАРАНЦИЈЕ ЗА НАСЛОВ, ПРОДАЈНОСТ, ПРИКЛАДНОСТ ЗА ОДРЕЂЕНУ НАМЕНУ, НЕПОВРЕДУ, ОДСУСТВО ЛАТЕНТНИХ ИЛИ ДРУГИХ МАНА, ТАЧНОСТ, ИЛИ ПРИСУСТВО ИЛИ ОДСУСТВО ГРЕШАКА, БИЛО ПОЗНАТИХ ИЛИ ОТКРИВЕНИХ. ГДЕ ОДРИЦАЊЕ ОД ГАРАНЦИЈА НИЈЕ ДОЗВОЉЕНО У ЦЕЛОСТИ ИЛИ ДЕЛИМИЧНО, ОВО ОДРИЦАЊЕ МОЖДА НЕЋЕ ВАЖИТИ ЗА ВАС. + +б. У МЕРИ У КОЈОЈ ЈЕ ТО МОГУЋЕ, ЛИЦЕНЦОДАВАЦ НИ У КОМ СЛУЧАЈУ НЕЋЕ БИТИ ОДГОВОРАН ВАМА ПО БИЛО КОЈОЈ ПРАВНОЈ ТЕОРИЈИ (УКЉУЧУЈУЋИ, БЕЗ ОГРАНИЧЕЊА, НЕПАЖЊУ) ИЛИ НА ДРУГИ НАЧИН ЗА БИЛО КАКВЕ ДИРЕКТНЕ, ПОСЕБНЕ, ИНДИРЕКТНЕ, СЛУЧАЈНЕ, ПОСЛЕДИЧНЕ, КАЗНЕНЕ, ЕГЗЕМПЛАРНЕ ИЛИ ДРУГЕ ГУБИТКЕ, ТРОШКОВЕ, РАСХОДЕ ИЛИ ШТЕТЕ ПРОИЗАШЛЕ ИЗ ОВЕ ЈАВНЕ ЛИЦЕНЦЕ ИЛИ КОРИШЋЕЊА ЛИЦЕНЦИРАНОГ МАТЕРИЈАЛА, ЧАК И АКО ЈЕ ЛИЦЕНЦОДАВАЦ БИО ОБАВЕШТЕН О МОГУЋНОСТИ ТАКВИХ ГУБИТАКА, ТРОШКОВА, РАСХОДА ИЛИ ШТЕТА. ГДЕ ОГРАНИЧЕЊЕ ОДГОВОРНОСТИ НИЈЕ ДОЗВОЉЕНО У ЦЕЛОСТИ ИЛИ ДЕЛИМИЧНО, ОВО ОГРАНИЧЕЊЕ МОЖДА НЕЋЕ ВАЖИТИ ЗА ВАС. + +ц. Одрицање од гаранција и ограничење одговорности наведено изнад тумачиће се на начин који, у мери у којој је то могуће, најближе одговара апсолутном одрицању и одрицању од сваке одговорности. + +--- + +Одељак 6 -- Рок и раскид. + +а. Ова јавна лиценца важи током трајања ауторских и сличних права лиценцираних овде. Међутим, ако не поштујете ову јавну лиценцу, ваша права према овој јавној лиценци аутоматски престају. + +б. Где ваше право на коришћење лиценцираног материјала престане према одељку 6(а), оно се обнавља: + +1. аутоматски од датума када је прекршај исправљен, под условом да је исправљен у року од 30 дана од вашег откривања прекршаја; или +2. уз изричито обнављање од стране лиценцодавца. + +Ради избегавања сумње, овај одељак 6(б) не утиче на било које право које лиценцодавац може имати да тражи правне лекове за ваше прекршаје ове јавне лиценце. + +ц. Ради избегавања сумње, лиценцодавац може такође понудити лиценцирани материјал под одвојеним условима или престати да дистрибуира лиценцирани материјал у било ком тренутку; међутим, то неће раскинути ову јавну лиценцу. + +д. Одељци 1, 5, 6, 7 и 8 остају на снази након раскида ове јавне лиценце. + +--- + +Одељак 7 -- Други услови и одредбе. + +а. Лиценцодавац неће бити обавезан било којим додатним или различитим условима или одредбама које ви комуницирате, осим ако их изричито прихвати. + +б. Било који договори, разумевања или споразуми у вези са лиценцираним материјалом који нису наведени овде су одвојени и независни од услова и одредби ове јавне лиценце. + +--- + +Одељак 8 -- Тумачење. + +а. Ради избегавања сумње, ова јавна лиценца не смањује, ограничава, рестриктивно тумачи или намеће услове на било коју употребу лиценцираног материјала која би се могла законито обавити без дозволе према овој јавној лиценци. + +б. У мери у којој је то могуће, ако се било која одредба ове јавне лиценце сматра неизводљивом, она ће се аутоматски реформисати до минималне мере потребне да би била изводљива. Ако одредба не може бити реформисана, она ће бити издвојена из ове јавне лиценце без утицаја на изводљивост преосталих услова и одредби. + +ц. Ниједан услов или одредба ове јавне лиценце неће бити одбачен и ниједан пропуст у поштовању неће бити прихваћен, осим ако то изричито прихвати лиценцодавац. + +д. Ништа у овој јавној лиценци не представља или се може тумачити као ограничење или одрицање било којих привилегија и имунитета који се примењују на лиценцодавца или вас, укључујући од правних процеса било које јурисдикције или власти. + +--- + +======================================================================= + +Creative Commons није страна у својим јавним лиценцама. Ипак, Creative Commons може изабрати да примени једну од својих јавних лиценци на материјал који објављује и у тим случајевима ће се сматрати „лиценцодавцем“. Текст јавних лиценци Creative Commons посвећен је јавном домену под CC0 Public Domain Dedication. Осим за ограничену сврху указивања да је материјал подељен под јавном лиценцом Creative Commons или како је другачије дозвољено према политикама Creative Commons објављеним на creativecommons.org/policies, Creative Commons не овлашћује употребу жига „Creative Commons“ или било ког другог жига или логотипа Creative Commons без претходне писмене сагласности, укључујући, без ограничења, у вези са било каквим неовлашћеним изменама било које од његових јавних лиценци или било којим другим договорима, разумевањима или споразумима у вези са коришћењем лиценцираног материјала. Ради избегавања сумње, овај пасус није део јавних лиценци. + +Creative Commons можете контактирати на creativecommons.org. + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/sketchnotes/README.md b/translations/sr/sketchnotes/README.md new file mode 100644 index 00000000..a01d27ea --- /dev/null +++ b/translations/sr/sketchnotes/README.md @@ -0,0 +1,21 @@ + +Све скице наставног плана могу се преузети овде. + +🖨 За штампање у високој резолуцији, TIFF верзије су доступне у [овом репозиторијуму](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff). + +🎨 Аутор: [Томоми Имура](https://github.com/girliemac) (Твитер: [@girlie_mac](https://twitter.com/girlie_mac)) + +[![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-sa/4.0/) + +--- + +**Одрицање од одговорности**: +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file diff --git a/translations/uk/1-Introduction/1-intro-to-ML/README.md b/translations/uk/1-Introduction/1-intro-to-ML/README.md new file mode 100644 index 00000000..128e0bcd --- /dev/null +++ b/translations/uk/1-Introduction/1-intro-to-ML/README.md @@ -0,0 +1,159 @@ + +# Вступ до машинного навчання + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML для початківців - Вступ до машинного навчання для початківців](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "ML для початківців - Вступ до машинного навчання для початківців") + +> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео, яке пояснює цей урок. + +Ласкаво просимо до курсу класичного машинного навчання для початківців! Незалежно від того, чи ви абсолютно новачок у цій темі, чи досвідчений практик ML, який хоче освіжити знання, ми раді вас бачити! Ми прагнемо створити дружню стартову платформу для вашого навчання ML і будемо раді оцінити, відповісти та врахувати ваші [відгуки](https://github.com/microsoft/ML-For-Beginners/discussions). + +[![Вступ до ML](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Вступ до ML") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео: Джон Гуттаг з MIT представляє машинне навчання + +--- +## Початок роботи з машинним навчанням + +Перед початком цього курсу вам потрібно налаштувати свій комп'ютер для локального запуску ноутбуків. + +- **Налаштуйте свій комп'ютер за допомогою цих відео**. Використовуйте наступні посилання, щоб дізнатися [як встановити Python](https://youtu.be/CXZYvNRIAKM) на вашій системі та [налаштувати текстовий редактор](https://youtu.be/EU8eayHWoZg) для розробки. +- **Вивчіть Python**. Також рекомендується мати базове розуміння [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), мови програмування, яка корисна для спеціалістів з даних і яку ми використовуємо в цьому курсі. +- **Вивчіть Node.js та JavaScript**. Ми також кілька разів використовуємо JavaScript у цьому курсі для створення веб-додатків, тому вам потрібно мати встановлені [node](https://nodejs.org) і [npm](https://www.npmjs.com/), а також [Visual Studio Code](https://code.visualstudio.com/) для розробки на Python і JavaScript. +- **Створіть обліковий запис GitHub**. Оскільки ви знайшли нас тут на [GitHub](https://github.com), можливо, у вас вже є обліковий запис, але якщо ні, створіть його, а потім форкніть цей курс для власного використання. (Можете також поставити нам зірочку 😊) +- **Ознайомтеся з Scikit-learn**. Ознайомтеся з [Scikit-learn](https://scikit-learn.org/stable/user_guide.html), набором бібліотек ML, які ми використовуємо в цих уроках. + +--- +## Що таке машинне навчання? + +Термін "машинне навчання" є одним із найпопулярніших і найчастіше використовуваних термінів сьогодення. Існує значна ймовірність, що ви чули цей термін хоча б раз, якщо маєте певне знайомство з технологіями, незалежно від того, в якій галузі працюєте. Однак механізми машинного навчання залишаються загадкою для більшості людей. Для початківця в машинному навчанні ця тема іноді може здаватися складною. Тому важливо зрозуміти, що таке машинне навчання, і вивчати його поступово, через практичні приклади. + +--- +## Крива популярності + +![крива популярності ML](../../../../1-Introduction/1-intro-to-ML/images/hype.png) + +> Google Trends показує останню "криву популярності" терміну "машинне навчання" + +--- +## Загадковий всесвіт + +Ми живемо у всесвіті, повному захоплюючих загадок. Великі вчені, такі як Стівен Гокінг, Альберт Ейнштейн та багато інших, присвятили своє життя пошуку значущої інформації, яка розкриває таємниці світу навколо нас. Це людська природа навчання: дитина вчиться новому і рік за роком відкриває структуру свого світу, дорослішаючи. + +--- +## Мозок дитини + +Мозок і органи чуття дитини сприймають факти про навколишнє середовище і поступово вивчають приховані закономірності життя, які допомагають дитині створювати логічні правила для розпізнавання вивчених шаблонів. Процес навчання людського мозку робить людей найскладнішими живими істотами на цій планеті. Постійне навчання через відкриття прихованих закономірностей і подальше вдосконалення цих закономірностей дозволяє нам ставати кращими протягом усього життя. Ця здатність до навчання та еволюції пов'язана з концепцією, яка називається [пластичність мозку](https://www.simplypsychology.org/brain-plasticity.html). Поверхнево ми можемо провести деякі мотиваційні паралелі між процесом навчання людського мозку і концепціями машинного навчання. + +--- +## Людський мозок + +[Людський мозок](https://www.livescience.com/29365-human-brain.html) сприймає речі з реального світу, обробляє отриману інформацію, приймає раціональні рішення і виконує певні дії залежно від обставин. Це те, що ми називаємо розумною поведінкою. Коли ми програмуємо імітацію процесу розумної поведінки для машини, це називається штучним інтелектом (AI). + +--- +## Деяка термінологія + +Хоча терміни можуть плутатися, машинне навчання (ML) є важливим підрозділом штучного інтелекту. **ML займається використанням спеціалізованих алгоритмів для виявлення значущої інформації та пошуку прихованих закономірностей у отриманих даних для підтвердження процесу раціонального прийняття рішень**. + +--- +## AI, ML, глибоке навчання + +![AI, ML, глибоке навчання, наука про дані](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png) + +> Діаграма, що показує взаємозв'язки між AI, ML, глибоким навчанням і наукою про дані. Інфографіка від [Jen Looper](https://twitter.com/jenlooper), натхненна [цією графікою](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining) + +--- +## Концепції, які ми розглянемо + +У цьому курсі ми розглянемо лише основні концепції машинного навчання, які повинен знати початківець. Ми зосередимося на тому, що називаємо "класичним машинним навчанням", використовуючи переважно Scikit-learn, чудову бібліотеку, яку багато студентів використовують для вивчення основ. Щоб зрозуміти ширші концепції штучного інтелекту або глибокого навчання, необхідно мати міцні базові знання машинного навчання, і ми прагнемо надати їх тут. + +--- +## У цьому курсі ви навчитеся: + +- основним концепціям машинного навчання +- історії ML +- ML і справедливості +- технікам регресії в ML +- технікам класифікації в ML +- технікам кластеризації в ML +- обробці природної мови в ML +- прогнозуванню часових рядів у ML +- навчанню з підкріпленням +- реальним застосуванням ML + +--- +## Що ми не будемо розглядати + +- глибоке навчання +- нейронні мережі +- AI + +Для кращого навчального досвіду ми уникатимемо складнощів нейронних мереж, "глибокого навчання" - багатошарового моделювання за допомогою нейронних мереж - і AI, які ми розглянемо в іншому курсі. Ми також запропонуємо майбутній курс з науки про дані, щоб зосередитися на цьому аспекті цієї ширшої галузі. + +--- +## Чому варто вивчати машинне навчання? + +Машинне навчання, з точки зору систем, визначається як створення автоматизованих систем, які можуть вивчати приховані закономірності з даних для допомоги у прийнятті розумних рішень. + +Ця мотивація частково натхненна тим, як людський мозок вчиться певним речам на основі даних, які він отримує з навколишнього світу. + +✅ Подумайте хвилину, чому бізнес може захотіти використовувати стратегії машинного навчання замість створення жорстко закодованого механізму на основі правил. + +--- +## Застосування машинного навчання + +Застосування машинного навчання зараз майже всюди і таке ж поширене, як і дані, які циркулюють у наших суспільствах, створені нашими смартфонами, підключеними пристроями та іншими системами. Враховуючи величезний потенціал сучасних алгоритмів машинного навчання, дослідники досліджують їхню здатність вирішувати багатовимірні та багатопрофільні реальні проблеми з великими позитивними результатами. + +--- +## Приклади застосування ML + +**Машинне навчання можна використовувати багатьма способами**: + +- Для прогнозування ймовірності захворювання на основі медичної історії або звітів пацієнта. +- Для використання даних про погоду для прогнозування погодних явищ. +- Для розуміння настрою тексту. +- Для виявлення фейкових новин, щоб зупинити поширення пропаганди. + +Фінанси, економіка, науки про Землю, космічні дослідження, біомедична інженерія, когнітивні науки і навіть гуманітарні галузі адаптували машинне навчання для вирішення складних проблем, пов'язаних з обробкою даних у їхніх сферах. + +--- +## Висновок + +Машинне навчання автоматизує процес відкриття закономірностей, знаходячи значущі інсайти з реальних або створених даних. Воно довело свою високу цінність у бізнесі, медицині, фінансових додатках та інших сферах. + +У найближчому майбутньому розуміння основ машинного навчання стане необхідністю для людей з будь-якої галузі через його широке впровадження. + +--- +# 🚀 Виклик + +Намалюйте на папері або за допомогою онлайн-додатку, такого як [Excalidraw](https://excalidraw.com/), ваше розуміння відмінностей між AI, ML, глибоким навчанням і наукою про дані. Додайте ідеї проблем, які кожна з цих технік добре вирішує. + +# [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +--- +# Огляд і самостійне навчання + +Щоб дізнатися більше про те, як працювати з алгоритмами ML у хмарі, пройдіть цей [навчальний шлях](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott). + +Пройдіть [навчальний шлях](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) про основи ML. + +--- +# Завдання + +[Почніть роботу](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/1-Introduction/1-intro-to-ML/assignment.md b/translations/uk/1-Introduction/1-intro-to-ML/assignment.md new file mode 100644 index 00000000..bfdb8dda --- /dev/null +++ b/translations/uk/1-Introduction/1-intro-to-ML/assignment.md @@ -0,0 +1,23 @@ + +# Початок роботи + +## Інструкції + +У цьому завданні без оцінювання вам потрібно освіжити знання з Python і налаштувати своє середовище для запуску ноутбуків. + +Пройдіть цей [Шлях навчання Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), а потім налаштуйте свої системи, переглянувши ці вступні відео: + +https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6 + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/1-Introduction/2-history-of-ML/README.md b/translations/uk/1-Introduction/2-history-of-ML/README.md new file mode 100644 index 00000000..0d13823a --- /dev/null +++ b/translations/uk/1-Introduction/2-history-of-ML/README.md @@ -0,0 +1,164 @@ + +# Історія машинного навчання + +![Резюме історії машинного навчання у вигляді скетчноту](../../../../sketchnotes/ml-history.png) +> Скетчнот від [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML для початківців - Історія машинного навчання](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "ML для початківців - Історія машинного навчання") + +> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео, яке пояснює цей урок. + +У цьому уроці ми розглянемо основні віхи в історії машинного навчання та штучного інтелекту. + +Історія штучного інтелекту (ШІ) як галузі тісно переплітається з історією машинного навчання, оскільки алгоритми та обчислювальні досягнення, які лежать в основі ML, сприяли розвитку ШІ. Важливо пам’ятати, що хоча ці галузі як окремі напрямки досліджень почали формуватися у 1950-х роках, важливі [алгоритмічні, статистичні, математичні, обчислювальні та технічні відкриття](https://wikipedia.org/wiki/Timeline_of_machine_learning) передували та перетиналися з цією епохою. Насправді люди розмірковували над цими питаннями [сотні років](https://wikipedia.org/wiki/History_of_artificial_intelligence): ця стаття обговорює історичні інтелектуальні основи ідеї «мислячої машини». + +--- +## Важливі відкриття + +- 1763, 1812 [Теорема Байєса](https://wikipedia.org/wiki/Bayes%27_theorem) та її попередники. Ця теорема та її застосування лежать в основі інференції, описуючи ймовірність події на основі попередніх знань. +- 1805 [Теорія найменших квадратів](https://wikipedia.org/wiki/Least_squares) французького математика Адрієна-Марі Лежандра. Ця теорія, яку ви вивчатимете в нашому модулі про регресію, допомагає у підгонці даних. +- 1913 [Ланцюги Маркова](https://wikipedia.org/wiki/Markov_chain), названі на честь російського математика Андрія Маркова, використовуються для опису послідовності можливих подій на основі попереднього стану. +- 1957 [Перцептрон](https://wikipedia.org/wiki/Perceptron) — це тип лінійного класифікатора, винайдений американським психологом Френком Розенблаттом, який лежить в основі досягнень у глибокому навчанні. + +--- + +- 1967 [Найближчий сусід](https://wikipedia.org/wiki/Nearest_neighbor) — це алгоритм, спочатку розроблений для прокладання маршрутів. У контексті ML він використовується для виявлення шаблонів. +- 1970 [Зворотне поширення](https://wikipedia.org/wiki/Backpropagation) використовується для навчання [нейронних мереж прямого поширення](https://wikipedia.org/wiki/Feedforward_neural_network). +- 1982 [Рекурентні нейронні мережі](https://wikipedia.org/wiki/Recurrent_neural_network) — це штучні нейронні мережі, створені на основі нейронних мереж прямого поширення, які формують часові графи. + +✅ Проведіть невелике дослідження. Які ще дати виділяються як ключові в історії ML та ШІ? + +--- +## 1950: Машини, які думають + +Алан Тюрінг, справді видатна особистість, якого [громадськість у 2019 році](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) визнала найвидатнішим ученим XX століття, вважається тим, хто допоміг закласти основу концепції «машини, яка може думати». Він боровся з критиками та власною потребою в емпіричних доказах цієї концепції, частково створивши [Тест Тюрінга](https://www.bbc.com/news/technology-18475646), який ви досліджуватимете в наших уроках з обробки природної мови. + +--- +## 1956: Літній дослідницький проект у Дартмуті + +"Літній дослідницький проект у Дартмуті з штучного інтелекту став визначною подією для штучного інтелекту як галузі", і саме тут було введено термін "штучний інтелект" ([джерело](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)). + +> Кожен аспект навчання або будь-яка інша особливість інтелекту може бути настільки точно описаний, що машину можна створити для його імітації. + +--- + +Головний дослідник, професор математики Джон Маккарті, сподівався "просуватися на основі припущення, що кожен аспект навчання або будь-яка інша особливість інтелекту може бути настільки точно описаний, що машину можна створити для його імітації". Учасниками були й інші видатні особистості в цій галузі, зокрема Марвін Мінський. + +Ця майстерня вважається такою, що започаткувала та заохотила кілька дискусій, включаючи "підйом символічних методів, систем, орієнтованих на обмежені домени (ранні експертні системи), та дедуктивні системи проти індуктивних систем". ([джерело](https://wikipedia.org/wiki/Dartmouth_workshop)). + +--- +## 1956 - 1974: "Золоті роки" + +З 1950-х до середини 70-х років оптимізм щодо того, що ШІ може вирішити багато проблем, був високим. У 1967 році Марвін Мінський впевнено заявив: "Протягом одного покоління ... проблема створення 'штучного інтелекту' буде суттєво вирішена". (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall) + +Дослідження обробки природної мови процвітали, пошук був удосконалений і став потужнішим, а концепція "мікросвітів" була створена, де прості завдання виконувалися за допомогою інструкцій простою мовою. + +--- + +Дослідження добре фінансувалися урядовими агентствами, досягнення були зроблені в обчисленнях та алгоритмах, і прототипи інтелектуальних машин були створені. Деякі з цих машин включають: + +* [Робот Шейкі](https://wikipedia.org/wiki/Shakey_the_robot), який міг маневрувати та вирішувати, як виконувати завдання "інтелектуально". + + ![Шейкі, інтелектуальний робот](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg) + > Шейкі у 1972 році + +--- + +* Еліза, ранній "чат-бот", могла спілкуватися з людьми та діяти як примітивний "терапевт". Ви дізнаєтеся більше про Елізу в уроках з обробки природної мови. + + ![Еліза, бот](../../../../1-Introduction/2-history-of-ML/images/eliza.png) + > Версія Елізи, чат-бота + +--- + +* "Світ блоків" був прикладом мікросвіту, де блоки можна було складати та сортувати, а експерименти з навчання машин приймати рішення могли бути протестовані. Досягнення, створені за допомогою бібліотек, таких як [SHRDLU](https://wikipedia.org/wiki/SHRDLU), допомогли просунути обробку мови вперед. + + [![Світ блоків з SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "Світ блоків з SHRDLU") + + > 🎥 Натисніть на зображення вище для відео: Світ блоків з SHRDLU + +--- +## 1974 - 1980: "Зима ШІ" + +До середини 1970-х років стало очевидним, що складність створення "інтелектуальних машин" була недооцінена, а її обіцянки, враховуючи доступну обчислювальну потужність, були перебільшені. Фінансування скоротилося, і впевненість у галузі знизилася. Деякі проблеми, які вплинули на впевненість, включають: +--- +- **Обмеження**. Обчислювальна потужність була занадто обмеженою. +- **Комбінаторний вибух**. Кількість параметрів, які потрібно було навчати, зростала експоненціально, коли від комп’ютерів вимагали більше, без паралельної еволюції обчислювальної потужності та можливостей. +- **Недостатність даних**. Недостатність даних заважала процесу тестування, розробки та вдосконалення алгоритмів. +- **Чи ми ставимо правильні запитання?**. Самі запитання, які ставилися, почали ставити під сумнів. Дослідники почали стикатися з критикою своїх підходів: + - Тести Тюрінга були поставлені під сумнів, серед іншого, через теорію "китайської кімнати", яка стверджувала, що "програмування цифрового комп’ютера може створити видимість розуміння мови, але не може створити справжнє розуміння". ([джерело](https://plato.stanford.edu/entries/chinese-room/)) + - Етика введення штучного інтелекту, такого як "терапевт" Еліза, у суспільство була поставлена під сумнів. + +--- + +У той же час почали формуватися різні школи думки ШІ. Було встановлено дихотомію між ["неохайним" і "акуратним ШІ"](https://wikipedia.org/wiki/Neats_and_scruffies). _Неохайні_ лабораторії годинами налаштовували програми, поки не отримували бажаних результатів. _Акуратні_ лабораторії "зосереджувалися на логіці та формальному вирішенні проблем". Еліза та SHRDLU були добре відомими _неохайними_ системами. У 1980-х роках, коли виникла потреба зробити системи ML відтворюваними, _акуратний_ підхід поступово вийшов на передній план, оскільки його результати є більш пояснюваними. + +--- +## Експертні системи 1980-х років + +У міру зростання галузі її користь для бізнесу стала очевиднішою, і в 1980-х роках також відбулося поширення "експертних систем". "Експертні системи були одними з перших справді успішних форм програмного забезпечення штучного інтелекту (ШІ)" ([джерело](https://wikipedia.org/wiki/Expert_system)). + +Цей тип системи фактично є _гібридним_, частково складається з механізму правил, що визначає бізнес-вимоги, і механізму висновків, який використовує систему правил для виведення нових фактів. + +Ця епоха також привернула більше уваги до нейронних мереж. + +--- +## 1987 - 1993: "Охолодження ШІ" + +Поширення спеціалізованого апаратного забезпечення для експертних систем мало невдалий ефект надмірної спеціалізації. Поява персональних комп’ютерів також конкурувала з цими великими, спеціалізованими, централізованими системами. Демократизація обчислень розпочалася, і вона зрештою проклала шлях до сучасного вибуху великих даних. + +--- +## 1993 - 2011 + +Ця епоха ознаменувала нову еру для ML і ШІ, які змогли вирішити деякі проблеми, спричинені раніше через брак даних і обчислювальної потужності. Кількість даних почала швидко зростати та ставати більш доступною, як на краще, так і на гірше, особливо з появою смартфона близько 2007 року. Обчислювальна потужність розширювалася експоненціально, а алгоритми еволюціонували разом із нею. Галузь почала набувати зрілості, оскільки вільні дні минулого почали кристалізуватися в справжню дисципліну. + +--- +## Сьогодні + +Сьогодні машинне навчання та ШІ торкаються майже кожної частини нашого життя. Ця епоха вимагає ретельного розуміння ризиків і потенційних наслідків цих алгоритмів для людського життя. Як заявив Бред Сміт із Microsoft: "Інформаційні технології порушують питання, які стосуються основних захистів прав людини, таких як конфіденційність і свобода вираження думок. Ці питання підвищують відповідальність технологічних компаній, які створюють ці продукти. На нашу думку, вони також вимагають продуманої державної регуляції та розробки норм щодо прийнятного використання" ([джерело](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)). + +--- + +Що чекає на нас у майбутньому, поки невідомо, але важливо розуміти ці комп’ютерні системи, програмне забезпечення та алгоритми, які вони виконують. Ми сподіваємося, що цей навчальний план допоможе вам краще зрозуміти, щоб ви могли вирішити самостійно. + +[![Історія глибокого навчання](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "Історія глибокого навчання") +> 🎥 Натисніть на зображення вище для відео: Янн ЛеКун обговорює історію глибокого навчання в цій лекції + +--- +## 🚀Завдання + +Зануртеся в один із цих історичних моментів і дізнайтеся більше про людей, які стоять за ними. Це захоплюючі особистості, і жодне наукове відкриття ніколи не було створене в культурному вакуумі. Що ви відкриєте? + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +--- +## Огляд і самостійне навчання + +Ось матеріали для перегляду та прослуховування: + +[Цей подкаст, де Емі Бойд обговорює еволюцію ШІ](http://runasradio.com/Shows/Show/739) + +[![Історія ШІ від Емі Бойд](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "Історія ШІ від Емі Бойд") + +--- + +## Завдання + +[Створіть хронологію](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/1-Introduction/2-history-of-ML/assignment.md b/translations/uk/1-Introduction/2-history-of-ML/assignment.md new file mode 100644 index 00000000..7b57bf6c --- /dev/null +++ b/translations/uk/1-Introduction/2-history-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Створіть хронологію + +## Інструкції + +Використовуючи [цей репозиторій](https://github.com/Digital-Humanities-Toolkit/timeline-builder), створіть хронологію певного аспекту історії алгоритмів, математики, статистики, штучного інтелекту або машинного навчання, або їх комбінації. Ви можете зосередитися на одній особі, одній ідеї або тривалому періоді розвитку думки. Обов’язково додайте мультимедійні елементи. + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | ------------------------------------------------- | --------------------------------------- | ---------------------------------------------------------------- | +| | Розгорнута хронологія представлена як сторінка GitHub | Код неповний і не розгорнутий | Хронологія неповна, недостатньо досліджена і не розгорнута | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/1-Introduction/3-fairness/README.md b/translations/uk/1-Introduction/3-fairness/README.md new file mode 100644 index 00000000..58f1fdef --- /dev/null +++ b/translations/uk/1-Introduction/3-fairness/README.md @@ -0,0 +1,149 @@ + +# Створення рішень машинного навчання з відповідальним AI + +![Резюме відповідального AI у машинному навчанні у вигляді скетчноту](../../../../sketchnotes/ml-fairness.png) +> Скетчнот від [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +## Вступ + +У цьому курсі ви почнете досліджувати, як машинне навчання впливає на наше повсякденне життя. Уже зараз системи та моделі беруть участь у щоденних процесах прийняття рішень, таких як діагностика в охороні здоров’я, схвалення кредитів або виявлення шахрайства. Тому важливо, щоб ці моделі працювали добре та забезпечували результати, яким можна довіряти. Як і будь-яке програмне забезпечення, системи AI можуть не відповідати очікуванням або мати небажані наслідки. Саме тому важливо розуміти та пояснювати поведінку моделі AI. + +Уявіть, що може статися, якщо дані, які ви використовуєте для створення цих моделей, не враховують певні демографічні групи, такі як раса, стать, політичні погляди, релігія, або непропорційно представляють ці групи. А що, якщо результати моделі інтерпретуються так, що вони надають перевагу певній демографічній групі? Які наслідки це матиме для застосування? Крім того, що станеться, якщо модель матиме негативний результат і завдасть шкоди людям? Хто несе відповідальність за поведінку систем AI? Це деякі з питань, які ми будемо досліджувати в цьому курсі. + +У цьому уроці ви: + +- Збільшите свою обізнаність про важливість справедливості в машинному навчанні та шкоду, пов’язану з несправедливістю. +- Ознайомитеся з практикою дослідження аномалій і незвичайних сценаріїв для забезпечення надійності та безпеки. +- Зрозумієте необхідність створення інклюзивних систем, які надають можливості всім. +- Дослідите важливість захисту конфіденційності та безпеки даних і людей. +- Побачите важливість прозорого підходу для пояснення поведінки моделей AI. +- Усвідомите, як відповідальність є ключовою для створення довіри до систем AI. + +## Передумови + +Як передумову, пройдіть навчальний курс "Принципи відповідального AI" та перегляньте відео нижче на цю тему: + +Дізнайтеся більше про відповідальний AI, слідуючи цьому [навчальному курсу](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) + +[![Підхід 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) +- **Знецінення**. Несправедливе критичне ставлення або маркування чогось чи когось. Наприклад, технологія розпізнавання зображень помилково позначила зображення людей із темною шкірою як горил. +- **Надмірне або недостатнє представлення**. Ідея полягає в тому, що певна група не представлена в певній професії, і будь-яка послуга чи функція, яка продовжує це просувати, сприяє шкоді. +- **Стереотипізація**. Асоціювання певної групи з наперед визначеними атрибутами. Наприклад, система перекладу між англійською та турецькою мовами може мати неточності через слова зі стереотипними асоціаціями до статі. + +![переклад на турецьку](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png) +> переклад на турецьку + +![переклад назад на англійську](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) +> переклад назад на англійську + +Під час розробки та тестування систем AI ми повинні гарантувати, що AI є справедливим і не запрограмований на прийняття упереджених або дискримінаційних рішень, які також заборонено приймати людям. Гарантування справедливості в AI і машинному навчанні залишається складним соціотехнічним викликом. + +### Надійність і безпека + +Щоб створити довіру, системи AI повинні бути надійними, безпечними та стабільними за нормальних і несподіваних умов. Важливо знати, як системи AI поводитимуться в різних ситуаціях, особливо коли вони є аномаліями. Під час створення рішень AI необхідно приділяти значну увагу тому, як обробляти широкий спектр обставин, з якими можуть зіткнутися ці рішення. Наприклад, самокерований автомобіль повинен ставити безпеку людей на перше місце. Відповідно, AI, який керує автомобілем, має враховувати всі можливі сценарії, з якими автомобіль може зіткнутися, такі як ніч, грози чи хуртовини, діти, які перебігають дорогу, домашні тварини, дорожні роботи тощо. Наскільки добре система AI може надійно та безпечно обробляти широкий спектр умов, відображає рівень передбачення, який врахував розробник даних або AI під час проектування чи тестування системи. + +> [🎥 Натисніть тут для відео: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) + +### Інклюзивність + +Системи AI повинні бути розроблені для залучення та надання можливостей усім. Під час розробки та впровадження систем AI науковці з даних і розробники AI визначають і усувають потенційні бар’єри в системі, які можуть ненавмисно виключати людей. Наприклад, у світі є 1 мільярд людей із інвалідністю. Завдяки розвитку AI вони можуть легше отримувати доступ до широкого спектру інформації та можливостей у своєму повсякденному житті. Усунення бар’єрів створює можливості для інновацій і розробки продуктів AI із кращим досвідом, які приносять користь усім. + +> [🎥 Натисніть тут для відео: інклюзивність у AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v) + +### Безпека та конфіденційність + +Системи AI повинні бути безпечними та поважати конфіденційність людей. Люди менше довіряють системам, які ставлять під загрозу їхню конфіденційність, інформацію чи життя. Під час навчання моделей машинного навчання ми покладаємося на дані для отримання найкращих результатів. При цьому необхідно враховувати походження даних і їхню цілісність. Наприклад, чи були дані надані користувачем чи доступні публічно? Далі, працюючи з даними, важливо розробляти системи AI, які можуть захищати конфіденційну інформацію та протистояти атакам. Оскільки AI стає більш поширеним, захист конфіденційності та забезпечення безпеки важливої особистої та бізнес-інформації стає дедалі критичнішим і складнішим. Питання конфіденційності та безпеки даних потребують особливої уваги для AI, оскільки доступ до даних є важливим для того, щоб системи AI могли робити точні та обґрунтовані прогнози та рішення про людей. + +> [🎥 Натисніть тут для відео: безпека в AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Як галузь ми досягли значного прогресу в питаннях конфіденційності та безпеки, значною мірою завдяки регулюванням, таким як GDPR (Загальний регламент захисту даних). +- Однак із системами AI ми повинні визнати напруженість між потребою в більшій кількості персональних даних для підвищення ефективності систем і конфіденційністю. +- Як і з появою підключених комп’ютерів через Інтернет, ми також спостерігаємо значне зростання кількості проблем безпеки, пов’язаних із AI. +- Водночас ми бачимо, як AI використовується для покращення безпеки. Наприклад, більшість сучасних антивірусних сканерів працюють на основі AI-евристики. +- Ми повинні гарантувати, що наші процеси обробки даних гармонійно поєднуються з найновішими практиками конфіденційності та безпеки. + +### Прозорість + +Системи AI повинні бути зрозумілими. Важливою частиною прозорості є пояснення поведінки систем AI та їхніх компонентів. Покращення розуміння систем AI вимагає, щоб зацікавлені сторони розуміли, як і чому вони функціонують, щоб вони могли визначити потенційні проблеми продуктивності, проблеми безпеки та конфіденційності, упередження, практики виключення або ненавмисні наслідки. Ми також вважаємо, що ті, хто використовує системи AI, повинні бути чесними та відкритими щодо того, коли, чому та як вони вирішують їх впроваджувати, а також щодо обмежень систем, які вони використовують. Наприклад, якщо банк використовує систему AI для підтримки своїх рішень щодо споживчого кредитування, важливо перевірити результати та зрозуміти, які дані впливають на рекомендації системи. Уряди починають регулювати AI у різних галузях, тому науковці з даних і організації повинні пояснювати, чи відповідає система AI нормативним вимогам, особливо коли виникає небажаний результат. + +> [🎥 Натисніть тут для відео: прозорість у AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Оскільки системи AI є дуже складними, важко зрозуміти, як вони працюють і інтерпретувати результати. +- Ця відсутність розуміння впливає на те, як ці системи управляються, впроваджуються та документуються. +- Ця відсутність розуміння, що важливіше, впливає на рішення, прийняті на основі результатів, які ці системи генерують. + +### Відповідальність + +Люди, які розробляють і впроваджують системи AI, повинні нести відповідальність за те, як їхні системи працюють. Потреба у відповідальності особливо важлива для технологій чутливого використання, таких як розпізнавання облич. Останнім часом зростає попит на технологію розпізнавання облич, особливо з боку правоохоронних організацій, які бачать потенціал цієї технології, наприклад, у пошуку зниклих дітей. Однак ці технології можуть бути використані урядом для того, щоб поставити під загрозу основні свободи громадян, наприклад, шляхом постійного спостереження за конкретними особами. Тому науковці з даних і організації повинні бути відповідальними за те, як їхня система AI впливає на окремих осіб або суспільство. + +[![Попередження провідного дослідника AI про масове спостереження через розпізнавання облич](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Підхід Microsoft до відповідального AI") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео: Попередження про масове спостереження через розпізнавання облич + +Зрештою, одне з найбільших питань для нашого покоління, як першого покоління, яке впроваджує AI у суспільство, полягає в тому, як гарантувати, що комп’ютери залишатимуться підзвітними людям, і як гарантувати, що люди, які розробляють комп’ютери, залишатимуться підзвітними всім іншим. + +## Оцінка впливу + +Перед навчанням моделі машинного навчання важливо провести оцінку впливу, щоб зрозуміти мету системи AI; її передбачуване використання; де вона буде впроваджена; і хто буде взаємодіяти із системою. Це корисно для рецензентів або тестувальників, які оцінюють систему, щоб знати, які фактори слід враховувати під час визначення потенційних ризиків і очікуваних наслідків. + +Наступні аспекти є ключовими під час проведення оцінки впливу: + +* **Негативний вплив на окремих осіб**. Усвідомлення будь-яких обмежень або вимог, невідповідного використання чи будь-яких відомих обмежень, які перешкоджають продуктивності системи, є важливим для забезпечення того, щоб система не використовувалася таким чином, який може завдати шкоди окремим особам. +* **Вимоги до даних**. Розуміння того, як і де система буде використовувати дані, дозволяє рецензентам досліджувати будь-які вимоги до даних, які потрібно враховувати (наприклад, регулювання даних GDPR або HIPPA). Крім того, перевірте, чи є джерело або кількість даних достатніми для навчання. +* **Резюме впливу**. Зберіть список потенційної шкоди, яка може виникнути внаслідок використання системи. Протягом життєвого циклу ML перевіряйте, чи вирішені або усунені виявлені проблеми. +* **Відповідні цілі** для кожного з шести основних принципів. Оцініть, чи досягнуті цілі кожного принципу та чи є якісь прогалини. + +## Відлагодження з відповідальним AI + +Подібно до відлагодження програмного забезпечення, відлагодження системи AI є необхідним процесом виявлення та вирішення проблем у системі. Існує багато факторів, які можуть вплинути на те, що модель не працює так, як очікувалося або відповідально. Більшість традиційних метрик продуктивності моделі є кількісними агрегатами продуктивності моделі, які недостатні для аналізу того, як модель порушує принципи відповідального AI. Крім того, модель машинного навчання є "чорною скринькою", що ускладнює розуміння того, що впливає на її результати, або пояснення, коли вона робить +Дивіться цей воркшоп, щоб глибше зануритися в теми: + +- У пошуках відповідального ШІ: Втілення принципів у практику від Бесміри Нуші, Мехрнуш Самекі та Аміта Шарми + +[![Responsible AI Toolbox: Відкрита платформа для створення відповідального ШІ](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Відкрита платформа для створення відповідального ШІ") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео: RAI Toolbox: Відкрита платформа для створення відповідального ШІ від Бесміри Нуші, Мехрнуш Самекі та Аміта Шарми + +Також прочитайте: + +- Центр ресурсів Microsoft з відповідального ШІ: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Дослідницька група Microsoft FATE: [FATE: Справедливість, підзвітність, прозорість та етика в ШІ - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +RAI Toolbox: + +- [Репозиторій Responsible AI Toolbox на GitHub](https://github.com/microsoft/responsible-ai-toolbox) + +Дізнайтеся про інструменти Azure Machine Learning для забезпечення справедливості: + +- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) + +## Завдання + +[Дослідіть RAI Toolbox](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/1-Introduction/3-fairness/assignment.md b/translations/uk/1-Introduction/3-fairness/assignment.md new file mode 100644 index 00000000..2a008b50 --- /dev/null +++ b/translations/uk/1-Introduction/3-fairness/assignment.md @@ -0,0 +1,25 @@ + +# Досліджуйте інструментарій відповідального штучного інтелекту + +## Інструкції + +У цьому уроці ви дізналися про інструментарій відповідального штучного інтелекту, "відкритий, керований спільнотою проєкт, який допомагає науковцям з даних аналізувати та вдосконалювати системи штучного інтелекту". Для цього завдання досліджуйте один із [ноутбуків](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) інструментарію RAI та представте свої висновки у вигляді статті або презентації. + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | -------- | ---------- | ------------------- | +| | Представлено статтю або презентацію PowerPoint, в якій обговорюються системи Fairlearn, ноутбук, який було запущено, та висновки, зроблені на основі його виконання | Представлено статтю без висновків | Стаття не представлена | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/1-Introduction/4-techniques-of-ML/README.md b/translations/uk/1-Introduction/4-techniques-of-ML/README.md new file mode 100644 index 00000000..3f9d568d --- /dev/null +++ b/translations/uk/1-Introduction/4-techniques-of-ML/README.md @@ -0,0 +1,132 @@ + +# Техніки машинного навчання + +Процес створення, використання та підтримки моделей машинного навчання і даних, які вони використовують, значно відрізняється від багатьох інших робочих процесів розробки. У цьому уроці ми розкриємо цей процес і окреслимо основні техніки, які вам потрібно знати. Ви: + +- Зрозумієте процеси, що лежать в основі машинного навчання на високому рівні. +- Дослідите базові концепції, такі як "моделі", "прогнози" та "навчальні дані". + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +[![ML для початківців - Техніки машинного навчання](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML для початківців - Техніки машинного навчання") + +> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео, яке пояснює цей урок. + +## Вступ + +На високому рівні мистецтво створення процесів машинного навчання (ML) складається з кількох етапів: + +1. **Визначте питання**. Більшість процесів ML починаються з постановки питання, яке не можна вирішити за допомогою простих умовних програм або систем на основі правил. Ці питання часто стосуються прогнозів на основі зібраних даних. +2. **Зберіть і підготуйте дані**. Щоб відповісти на ваше питання, вам потрібні дані. Якість і, іноді, кількість ваших даних визначатиме, наскільки добре ви зможете відповісти на початкове питання. Візуалізація даних є важливим аспектом цього етапу. Цей етап також включає розділення даних на навчальну та тестову групи для створення моделі. +3. **Виберіть метод навчання**. Залежно від вашого питання і природи ваших даних, вам потрібно вибрати, як ви хочете навчати модель, щоб вона найкраще відображала ваші дані і робила точні прогнози. Ця частина процесу ML вимагає спеціальних знань і часто значної кількості експериментів. +4. **Навчіть модель**. Використовуючи ваші навчальні дані, ви будете використовувати різні алгоритми для навчання моделі розпізнавати шаблони в даних. Модель може використовувати внутрішні ваги, які можна налаштувати, щоб надавати перевагу певним частинам даних над іншими для створення кращої моделі. +5. **Оцініть модель**. Ви використовуєте дані, які модель раніше не бачила (ваші тестові дані), щоб перевірити, як вона працює. +6. **Налаштування параметрів**. Виходячи з продуктивності вашої моделі, ви можете повторити процес, використовуючи різні параметри або змінні, які контролюють поведінку алгоритмів, що використовуються для навчання моделі. +7. **Прогнозуйте**. Використовуйте нові вхідні дані, щоб перевірити точність вашої моделі. + +## Яке питання ставити + +Комп'ютери особливо добре вміють знаходити приховані шаблони в даних. Ця здатність дуже корисна для дослідників, які мають питання про певну область, на які не можна легко відповісти, створивши систему на основі умовних правил. Наприклад, у задачі актуарного аналізу дата-сайєнтист може створити вручну правила щодо смертності курців і некурців. + +Однак, коли до рівняння додається багато інших змінних, модель ML може виявитися більш ефективною для прогнозування майбутніх показників смертності на основі історії здоров'я. Більш оптимістичний приклад може включати прогнозування погоди на квітень у певному місці на основі даних, які включають широту, довготу, зміни клімату, близькість до океану, шаблони струменевих потоків тощо. + +✅ Ця [презентація](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) про моделі погоди пропонує історичний погляд на використання ML в аналізі погоди. + +## Завдання перед створенням моделі + +Перед тим як почати створювати модель, є кілька завдань, які потрібно виконати. Щоб перевірити ваше питання і сформувати гіпотезу на основі прогнозів моделі, вам потрібно визначити і налаштувати кілька елементів. + +### Дані + +Щоб відповісти на ваше питання з будь-якою впевненістю, вам потрібна достатня кількість даних відповідного типу. На цьому етапі потрібно зробити дві речі: + +- **Зберіть дані**. З огляду на попередній урок про справедливість в аналізі даних, збирайте дані з обережністю. Звертайте увагу на джерела цих даних, будь-які властиві їм упередження і документуйте їх походження. +- **Підготуйте дані**. У процесі підготовки даних є кілька кроків. Можливо, вам доведеться об'єднати дані і нормалізувати їх, якщо вони надходять з різних джерел. Ви можете покращити якість і кількість даних різними методами, такими як перетворення рядків у числа (як ми робимо в [Кластеризації](../../5-Clustering/1-Visualize/README.md)). Ви також можете генерувати нові дані на основі оригінальних (як ми робимо в [Класифікації](../../4-Classification/1-Introduction/README.md)). Ви можете очищати і редагувати дані (як ми будемо робити перед уроком [Веб-додаток](../../3-Web-App/README.md)). Нарешті, можливо, вам доведеться рандомізувати і перемішати їх залежно від ваших технік навчання. + +✅ Після збору і обробки даних, приділіть час, щоб перевірити, чи їх структура дозволить вам вирішити ваше заплановане питання. Можливо, дані не будуть добре працювати у вашій задачі, як ми виявляємо в наших уроках [Кластеризації](../../5-Clustering/1-Visualize/README.md)! + +### Ознаки і ціль + +[Ознака](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) — це вимірювана властивість ваших даних. У багатьох наборах даних вона виражається як заголовок стовпця, наприклад, "дата", "розмір" або "колір". Змінна ознаки, зазвичай представлена як `X` у коді, представляє вхідну змінну, яка буде використовуватися для навчання моделі. + +Ціль — це те, що ви намагаєтеся передбачити. Ціль, зазвичай представлена як `y` у коді, представляє відповідь на питання, яке ви намагаєтеся поставити до ваших даних: у грудні, якого **кольору** гарбузи будуть найдешевшими? У Сан-Франциско, які райони матимуть найкращу **ціну** на нерухомість? Іноді ціль також називають атрибутом мітки. + +### Вибір змінної ознаки + +🎓 **Вибір ознак і витяг ознак** Як зрозуміти, яку змінну вибрати при створенні моделі? Ви, ймовірно, пройдете процес вибору ознак або витягу ознак, щоб вибрати правильні змінні для найкращої моделі. Однак це не одне й те саме: "Витяг ознак створює нові ознаки з функцій оригінальних ознак, тоді як вибір ознак повертає підмножину ознак." ([джерело](https://wikipedia.org/wiki/Feature_selection)) + +### Візуалізація даних + +Важливим аспектом інструментарію дата-сайєнтиста є здатність візуалізувати дані за допомогою кількох чудових бібліотек, таких як Seaborn або MatPlotLib. Візуалізація даних може дозволити вам виявити приховані кореляції, які ви можете використати. Ваші візуалізації також можуть допомогти вам виявити упередження або незбалансовані дані (як ми виявляємо в [Класифікації](../../4-Classification/2-Classifiers-1/README.md)). + +### Розділення набору даних + +Перед навчанням вам потрібно розділити ваш набір даних на дві або більше частини нерівного розміру, які все ще добре представляють дані. + +- **Навчання**. Ця частина набору даних використовується для навчання моделі. Цей набір складає більшість оригінального набору даних. +- **Тестування**. Тестовий набір даних — це незалежна група даних, часто зібрана з оригінальних даних, яку ви використовуєте для підтвердження продуктивності створеної моделі. +- **Валідація**. Набір для валідації — це менша незалежна група прикладів, яку ви використовуєте для налаштування гіперпараметрів або архітектури моделі, щоб покращити її. Залежно від розміру ваших даних і питання, яке ви ставите, вам може не знадобитися створювати цей третій набір (як ми зазначаємо в [Прогнозуванні часових рядів](../../7-TimeSeries/1-Introduction/README.md)). + +## Створення моделі + +Використовуючи ваші навчальні дані, ваша мета — створити модель, або статистичне представлення ваших даних, використовуючи різні алгоритми для її **навчання**. Навчання моделі дозволяє їй робити припущення про виявлені шаблони, перевіряти їх і приймати або відхиляти. + +### Вибір методу навчання + +Залежно від вашого питання і природи ваших даних, ви виберете метод для навчання. Переглядаючи [документацію Scikit-learn](https://scikit-learn.org/stable/user_guide.html) — яку ми використовуємо в цьому курсі — ви можете дослідити багато способів навчання моделі. Залежно від вашого досвіду, вам, можливо, доведеться спробувати кілька різних методів, щоб створити найкращу модель. Ви, ймовірно, пройдете процес, під час якого дата-сайєнтисти оцінюють продуктивність моделі, подаючи їй невідомі дані, перевіряючи точність, упередження та інші проблеми, що знижують якість, і вибираючи найбільш відповідний метод навчання для поставленої задачі. + +### Навчання моделі + +Озброївшись вашими навчальними даними, ви готові "підганяти" їх для створення моделі. Ви помітите, що в багатьох бібліотеках ML ви знайдете код 'model.fit' — саме в цей момент ви передаєте змінну ознаки як масив значень (зазвичай 'X') і змінну цілі (зазвичай 'y'). + +### Оцінка моделі + +Після завершення процесу навчання (для навчання великої моделі може знадобитися багато ітерацій або "епох"), ви зможете оцінити якість моделі, використовуючи тестові дані для оцінки її продуктивності. Ці дані є підмножиною оригінальних даних, які модель раніше не аналізувала. Ви можете вивести таблицю метрик про якість вашої моделі. + +🎓 **Підгонка моделі** + +У контексті машинного навчання підгонка моделі стосується точності функції моделі, коли вона намагається аналізувати дані, з якими вона не знайома. + +🎓 **Недопідгонка** і **перепідгонка** — це поширені проблеми, які знижують якість моделі, коли модель підганяється або недостатньо добре, або занадто добре. Це призводить до того, що модель робить прогнози або занадто тісно пов'язані, або занадто слабо пов'язані з її навчальними даними. Перепідгонка моделі передбачає навчальні дані занадто добре, оскільки вона занадто добре вивчила деталі і шум даних. Недопідгонка моделі є неточною, оскільки вона не може точно аналізувати ні свої навчальні дані, ні дані, які вона ще не "бачила". + +![перепідгонка моделі](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png) +> Інфографіка від [Jen Looper](https://twitter.com/jenlooper) + +## Налаштування параметрів + +Після завершення початкового навчання спостерігайте за якістю моделі і розгляньте можливість її покращення шляхом налаштування її "гіперпараметрів". Дізнайтеся більше про процес [у документації](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott). + +## Прогнозування + +Це момент, коли ви можете використовувати абсолютно нові дані, щоб перевірити точність вашої моделі. У "прикладному" середовищі ML, де ви створюєте веб-ресурси для використання моделі в продакшені, цей процес може включати збір даних від користувача (наприклад, натискання кнопки), щоб встановити змінну і передати її моделі для інференсу або оцінки. + +У цих уроках ви дізнаєтеся, як використовувати ці кроки для підготовки, створення, тестування, оцінки і прогнозування — всі дії дата-сайєнтиста і більше, коли ви просуваєтеся у своїй подорожі, щоб стати "фул-стек" ML-інженером. + +--- + +## 🚀Завдання + +Намалюйте блок-схему, яка відображає кроки практикуючого ML. Де ви бачите себе зараз у процесі? Де, на вашу думку, ви зіткнетеся з труднощами? Що здається вам легким? + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Шукайте в інтернеті інтерв'ю з дата-сайєнтистами, які обговорюють свою щоденну роботу. Ось [одне](https://www.youtube.com/watch?v=Z3IjgbbCEfs). + +## Завдання + +[Інтерв'ю з дата-сайєнтистом](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, звертаємо вашу увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/1-Introduction/4-techniques-of-ML/assignment.md b/translations/uk/1-Introduction/4-techniques-of-ML/assignment.md new file mode 100644 index 00000000..2164f569 --- /dev/null +++ b/translations/uk/1-Introduction/4-techniques-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Інтерв'ю з дата-сайєнтистом + +## Інструкції + +У вашій компанії, у групі користувачів або серед друзів чи однокурсників поговоріть з кимось, хто професійно працює як дата-сайєнтист. Напишіть короткий текст (500 слів) про їхні щоденні обов'язки. Чи є вони спеціалістами, чи працюють у форматі "full stack"? + +## Рубрика + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ---------------------- | +| | Есе відповідної довжини, з зазначеними джерелами, представлене у форматі .doc | Есе погано атрибутоване або коротше за необхідну довжину | Есе не представлено | + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/1-Introduction/README.md b/translations/uk/1-Introduction/README.md new file mode 100644 index 00000000..626ea028 --- /dev/null +++ b/translations/uk/1-Introduction/README.md @@ -0,0 +1,37 @@ + +# Вступ до машинного навчання + +У цьому розділі навчальної програми ви познайомитеся з основними концепціями, які лежать в основі машинного навчання, дізнаєтеся, що це таке, ознайомитеся з його історією та техніками, які використовують дослідники для роботи з ним. Давайте разом досліджувати цей новий світ ML! + +![глобус](../../../1-Introduction/images/globe.jpg) +> Фото Білла Оксфорда на Unsplash + +### Уроки + +1. [Вступ до машинного навчання](1-intro-to-ML/README.md) +1. [Історія машинного навчання та штучного інтелекту](2-history-of-ML/README.md) +1. [Справедливість у машинному навчанні](3-fairness/README.md) +1. [Техніки машинного навчання](4-techniques-of-ML/README.md) + +### Автори + +"Вступ до машинного навчання" написаний з ♥️ командою, до якої входять [Мухаммад Сакіб Хан Інан](https://twitter.com/Sakibinan), [Орнелла Алтунян](https://twitter.com/ornelladotcom) та [Джен Лупер](https://twitter.com/jenlooper) + +"Історія машинного навчання" написана з ♥️ [Джен Лупер](https://twitter.com/jenlooper) та [Емі Бойд](https://twitter.com/AmyKateNicho) + +"Справедливість у машинному навчанні" написана з ♥️ [Томомі Імура](https://twitter.com/girliemac) + +"Техніки машинного навчання" написані з ♥️ [Джен Лупер](https://twitter.com/jenlooper) та [Крісом Норінгом](https://twitter.com/softchris) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/1-Tools/README.md b/translations/uk/2-Regression/1-Tools/README.md new file mode 100644 index 00000000..4133e71f --- /dev/null +++ b/translations/uk/2-Regression/1-Tools/README.md @@ -0,0 +1,238 @@ + +# Початок роботи з Python та Scikit-learn для регресійних моделей + +![Резюме регресій у вигляді скетчноту](../../../../sketchnotes/ml-regression.png) + +> Скетчнот від [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Цей урок доступний у R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) + +## Вступ + +У цих чотирьох уроках ви дізнаєтеся, як створювати регресійні моделі. Ми скоро обговоримо, для чого вони потрібні. Але перед тим, як щось робити, переконайтеся, що у вас є всі необхідні інструменти для початку роботи! + +У цьому уроці ви навчитеся: + +- Налаштовувати комп'ютер для локальних завдань машинного навчання. +- Працювати з Jupyter Notebook. +- Використовувати Scikit-learn, включаючи встановлення. +- Досліджувати лінійну регресію через практичну вправу. + +## Встановлення та налаштування + +[![ML для початківців - Налаштуйте свої інструменти для створення моделей машинного навчання](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML для початківців - Налаштуйте свої інструменти для створення моделей машинного навчання") + +> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео про налаштування комп'ютера для ML. + +1. **Встановіть Python**. Переконайтеся, що [Python](https://www.python.org/downloads/) встановлений на вашому комп'ютері. Ви будете використовувати Python для багатьох завдань у сфері науки про дані та машинного навчання. Більшість комп'ютерних систем вже мають встановлений Python. Також доступні корисні [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott), які спрощують налаштування для деяких користувачів. + + Деякі завдання з використанням Python вимагають однієї версії програмного забезпечення, тоді як інші — іншої. Тому корисно працювати у [віртуальному середовищі](https://docs.python.org/3/library/venv.html). + +2. **Встановіть Visual Studio Code**. Переконайтеся, що Visual Studio Code встановлений на вашому комп'ютері. Дотримуйтесь цих інструкцій для [встановлення Visual Studio Code](https://code.visualstudio.com/) для базової установки. Ви будете використовувати Python у Visual Studio Code у цьому курсі, тому вам може бути корисно ознайомитися з тим, як [налаштувати Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) для розробки на Python. + + > Ознайомтеся з Python, пройшовши цей набір [модулів Learn](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) + > + > [![Налаштування Python у Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Налаштування Python у Visual Studio Code") + > + > 🎥 Натисніть на зображення вище, щоб переглянути відео: використання Python у VS Code. + +3. **Встановіть Scikit-learn**, дотримуючись [цих інструкцій](https://scikit-learn.org/stable/install.html). Оскільки вам потрібно переконатися, що ви використовуєте Python 3, рекомендується використовувати віртуальне середовище. Зверніть увагу, якщо ви встановлюєте цю бібліотеку на Mac з процесором M1, на сторінці за посиланням вище є спеціальні інструкції. + +4. **Встановіть Jupyter Notebook**. Вам потрібно [встановити пакет Jupyter](https://pypi.org/project/jupyter/). + +## Ваше середовище для створення ML + +Ви будете використовувати **ноутбуки** для розробки коду на Python і створення моделей машинного навчання. Цей тип файлу є поширеним інструментом для науковців, які працюють з даними, і його можна ідентифікувати за суфіксом або розширенням `.ipynb`. + +Ноутбуки — це інтерактивне середовище, яке дозволяє розробнику як писати код, так і додавати нотатки та документацію навколо коду, що дуже корисно для експериментальних або дослідницьких проектів. + +[![ML для початківців - Налаштуйте Jupyter Notebook для створення регресійних моделей](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML для початківців - Налаштуйте Jupyter Notebook для створення регресійних моделей") + +> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео про виконання цієї вправи. + +### Вправа - робота з ноутбуком + +У цій папці ви знайдете файл _notebook.ipynb_. + +1. Відкрийте _notebook.ipynb_ у Visual Studio Code. + + Jupyter сервер запуститься з Python 3+. Ви знайдете області ноутбука, які можна `запустити`, тобто блоки коду. Ви можете запустити блок коду, вибравши значок, який виглядає як кнопка відтворення. + +2. Виберіть значок `md` і додайте трохи markdown, а також наступний текст **# Ласкаво просимо до вашого ноутбука**. + + Далі додайте трохи коду на Python. + +3. Введіть **print('hello notebook')** у блоці коду. +4. Виберіть стрілку, щоб запустити код. + + Ви повинні побачити надруковане повідомлення: + + ```output + hello notebook + ``` + +![VS Code з відкритим ноутбуком](../../../../2-Regression/1-Tools/images/notebook.jpg) + +Ви можете чергувати свій код із коментарями, щоб самодокументувати ноутбук. + +✅ Подумайте хвилину, наскільки відрізняється робоче середовище веб-розробника від середовища науковця, який працює з даними. + +## Початок роботи з Scikit-learn + +Тепер, коли Python налаштований у вашому локальному середовищі, і ви комфортно працюєте з Jupyter Notebook, давайте так само комфортно освоїмо 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 — це бібліотека машинного навчання з відкритим кодом, яка підтримує навчання з учителем і без учителя. Вона також надає різні інструменти для підгонки моделей, попередньої обробки даних, вибору моделей та їх оцінки, а також багато інших утиліт." + +У цьому курсі ви будете використовувати Scikit-learn та інші інструменти для створення моделей машинного навчання для виконання того, що ми називаємо "традиційними завданнями машинного навчання". Ми свідомо уникали нейронних мереж і глибокого навчання, оскільки вони краще висвітлюються в нашій майбутній навчальній програмі "AI для початківців". + +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. + +[![ML для початківців - Ваш перший проект лінійної регресії на Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML для початківців - Ваш перший проект лінійної регресії на Python") + +> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео про виконання цієї вправи. + +У файлі _notebook.ipynb_, пов'язаному з цим уроком, очистіть усі комірки, натиснувши значок "сміттєвий бак". + +У цьому розділі ви будете працювати з невеликим набором даних про діабет, який вбудований у Scikit-learn для навчальних цілей. Уявіть, що ви хочете протестувати лікування для пацієнтів із діабетом. Моделі машинного навчання можуть допомогти вам визначити, які пацієнти краще реагуватимуть на лікування, виходячи з комбінацій змінних. Навіть дуже базова регресійна модель, коли її візуалізувати, може показати інформацію про змінні, які допоможуть вам організувати ваші теоретичні клінічні випробування. + +✅ Існує багато типів методів регресії, і який із них ви оберете, залежить від питання, на яке ви хочете отримати відповідь. Якщо ви хочете передбачити ймовірний зріст людини певного віку, вам слід використовувати лінійну регресію, оскільки ви шукаєте **числове значення**. Якщо вас цікавить визначення, чи слід вважати певну кухню веганською чи ні, ви шукаєте **категоріальне призначення**, тому вам слід використовувати логістичну регресію. Ви дізнаєтеся більше про логістичну регресію пізніше. Подумайте трохи про питання, які ви можете поставити даним, і який із цих методів буде більш доречним. + +Давайте розпочнемо виконання цього завдання. + +### Імпорт бібліотек + +Для цього завдання ми імпортуємо деякі бібліотеки: + +- **matplotlib**. Це корисний [інструмент для побудови графіків](https://matplotlib.org/), і ми будемо використовувати його для створення лінійного графіка. +- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) — це корисна бібліотека для роботи з числовими даними в Python. +- **sklearn**. Це [бібліотека Scikit-learn](https://scikit-learn.org/stable/user_guide.html). + +Імпортуйте деякі бібліотеки для виконання завдань. + +1. Додайте імпорти, ввівши наступний код: + + ```python + import matplotlib.pyplot as plt + import numpy as np + from sklearn import datasets, linear_model, model_selection + ``` + + Ви імпортуєте `matplotlib`, `numpy`, а також імпортуєте `datasets`, `linear_model` і `model_selection` з `sklearn`. `model_selection` використовується для розділення даних на навчальні та тестові набори. + +### Набір даних про діабет + +Вбудований [набір даних про діабет](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) містить 442 зразки даних про діабет із 10 змінними, серед яких: + +- age: вік у роках +- bmi: індекс маси тіла +- bp: середній артеріальний тиск +- s1 tc: Т-клітини (тип білих кров'яних клітин) + +✅ Цей набір даних включає концепцію "статі" як змінної, важливої для досліджень діабету. Багато медичних наборів даних включають цей тип бінарної класифікації. Подумайте трохи про те, як такі категоризації можуть виключати певні частини населення з лікування. + +Тепер завантажте дані X та y. + +> 🎓 Пам'ятайте, це навчання з учителем, і нам потрібна цільова змінна 'y'. + +У новій комірці коду завантажте набір даних про діабет, викликавши `load_diabetes()`. Вхідний параметр `return_X_y=True` сигналізує, що `X` буде матрицею даних, а `y` буде цільовою змінною регресії. + +1. Додайте кілька команд print, щоб показати форму матриці даних та її перший елемент: + + ```python + X, y = datasets.load_diabetes(return_X_y=True) + print(X.shape) + print(X[0]) + ``` + + Те, що ви отримуєте у відповідь, — це кортеж. Ви призначаєте два перші значення кортежу відповідно до `X` та `y`. Дізнайтеся більше [про кортежі](https://wikipedia.org/wiki/Tuple). + + Ви можете побачити, що ці дані мають 442 елементи, організовані у масиви з 10 елементів: + + ```text + (442, 10) + [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076 + -0.04340085 -0.00259226 0.01990842 -0.01764613] + ``` + + ✅ Подумайте трохи про взаємозв'язок між даними та цільовою змінною регресії. Лінійна регресія прогнозує взаємозв'язки між змінною X та цільовою змінною y. Чи можете ви знайти [цільову змінну](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) для набору даних про діабет у документації? Що демонструє цей набір даних, враховуючи цільову змінну? + +2. Далі виберіть частину цього набору даних для побудови графіка, вибравши 3-й стовпець набору даних. Ви можете зробити це, використовуючи оператор `:`, щоб вибрати всі рядки, а потім вибрати 3-й стовпець за допомогою індексу (2). Ви також можете змінити форму даних на 2D-масив — як це потрібно для побудови графіка — використовуючи `reshape(n_rows, n_columns)`. Якщо один із параметрів дорівнює -1, відповідний розмір обчислюється автоматично. + + ```python + X = X[:, 2] + X = X.reshape((-1,1)) + ``` + + ✅ У будь-який момент друкуйте дані, щоб перевірити їх форму. + +3. Тепер, коли дані готові до побудови графіка, ви можете перевірити, чи може машина допомогти визначити логічний розподіл між числами в цьому наборі даних. Для цього вам потрібно розділити як дані (X), так і цільову змінну (y) на тестові та навчальні набори. Scikit-learn має простий спосіб зробити це; ви можете розділити ваші тестові дані в заданій точці. + + ```python + X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) + ``` + +4. Тепер ви готові навчити вашу модель! Завантажте модель лінійної регресії та навчіть її за допомогою ваших навчальних наборів X та y, використовуючи `model.fit()`: + + ```python + model = linear_model.LinearRegression() + model.fit(X_train, y_train) + ``` + + ✅ `model.fit()` — це функція, яку ви побачите в багатьох бібліотеках ML, таких як TensorFlow. + +5. Потім створіть прогноз, використовуючи тестові дані, за допомогою функції `predict()`. Це буде використано для побудови лінії між групами даних. + + ```python + y_pred = model.predict(X_test) + ``` + +6. Тепер настав час показати дані на графіку. Matplotlib — дуже корисний інструмент для цього завдання. Створіть діаграму розсіювання для всіх тестових даних X та y, і використовуйте прогноз для побудови лінії в найбільш відповідному місці між групами даних моделі. + + ```python + plt.scatter(X_test, y_test, color='black') + plt.plot(X_test, y_pred, color='blue', linewidth=3) + plt.xlabel('Scaled BMIs') + plt.ylabel('Disease Progression') + plt.title('A Graph Plot Showing Diabetes Progression Against BMI') + plt.show() + ``` + + ![діаграма розсіювання, що показує точки даних про діабет](../../../../2-Regression/1-Tools/images/scatterplot.png) +✅ Подумайте трохи над тим, що тут відбувається. Пряма лінія проходить через багато маленьких точок даних, але що саме вона робить? Чи можете ви побачити, як ця лінія може допомогти передбачити, де нова, невидима точка даних повинна розташуватися відносно осі y графіка? Спробуйте сформулювати практичне застосування цієї моделі. + +Вітаємо, ви створили свою першу модель лінійної регресії, зробили прогноз за її допомогою та відобразили його на графіку! + +--- +## 🚀Завдання + +Побудуйте графік для іншої змінної з цього набору даних. Підказка: змініть цей рядок: `X = X[:,2]`. Враховуючи ціль цього набору даних, що ви можете дізнатися про прогресування діабету як хвороби? +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +У цьому уроці ви працювали з простою лінійною регресією, а не з уніваріантною чи багатофакторною регресією. Почитайте трохи про відмінності між цими методами або перегляньте [це відео](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef). + +Дізнайтеся більше про концепцію регресії та подумайте, які типи питань можна вирішити за допомогою цієї техніки. Пройдіть [цей навчальний курс](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott), щоб поглибити своє розуміння. + +## Завдання + +[Інший набір даних](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/1-Tools/assignment.md b/translations/uk/2-Regression/1-Tools/assignment.md new file mode 100644 index 00000000..95e17686 --- /dev/null +++ b/translations/uk/2-Regression/1-Tools/assignment.md @@ -0,0 +1,27 @@ + +# Регресія з Scikit-learn + +## Інструкції + +Ознайомтеся з [набором даних Linnerud](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) у Scikit-learn. Цей набір даних має кілька [цільових змінних](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): "Він складається з трьох змінних вправ (дані) та трьох фізіологічних змінних (цільові), зібраних у двадцяти чоловіків середнього віку в фітнес-клубі". + +Своїми словами опишіть, як створити модель регресії, яка б показувала взаємозв’язок між обхватом талії та кількістю виконаних присідань. Зробіть те ж саме для інших точок даних у цьому наборі. + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| ------------------------------ | ----------------------------------- | ----------------------------- | -------------------------- | +| Надати описовий абзац | Надано добре написаний абзац | Надано кілька речень | Опис не надано | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/1-Tools/solution/Julia/README.md b/translations/uk/2-Regression/1-Tools/solution/Julia/README.md new file mode 100644 index 00000000..2a40f5ba --- /dev/null +++ b/translations/uk/2-Regression/1-Tools/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/2-Data/README.md b/translations/uk/2-Regression/2-Data/README.md new file mode 100644 index 00000000..64a7f4a4 --- /dev/null +++ b/translations/uk/2-Regression/2-Data/README.md @@ -0,0 +1,226 @@ + +# Побудова регресійної моделі за допомогою Scikit-learn: підготовка та візуалізація даних + +![Інфографіка візуалізації даних](../../../../2-Regression/2-Data/images/data-visualization.png) + +Інфографіка від [Dasani Madipalli](https://twitter.com/dasani_decoded) + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Цей урок доступний мовою R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) + +## Вступ + +Тепер, коли ви налаштували інструменти для створення моделей машинного навчання за допомогою Scikit-learn, ви готові почати ставити запитання до своїх даних. Працюючи з даними та застосовуючи рішення ML, дуже важливо вміти правильно формулювати запитання, щоб максимально розкрити потенціал вашого набору даних. + +У цьому уроці ви дізнаєтесь: + +- Як підготувати дані для створення моделі. +- Як використовувати Matplotlib для візуалізації даних. + +## Як правильно ставити запитання до даних + +Запитання, на яке ви хочете отримати відповідь, визначить, який тип алгоритмів ML ви будете використовувати. А якість отриманої відповіді значною мірою залежатиме від характеру ваших даних. + +Ознайомтеся з [даними](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), наданими для цього уроку. Ви можете відкрити цей файл .csv у VS Code. Швидкий перегляд одразу показує, що є пропуски, а також суміш рядків і числових даних. Є також дивний стовпець під назвою 'Package', де дані містять значення на кшталт 'sacks', 'bins' та інші. Дані, насправді, трохи безладні. + +[![ML для початківців - Як аналізувати та очищати набір даних](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML для початківців - Як аналізувати та очищати набір даних") + +> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео про підготовку даних для цього уроку. + +Насправді, рідко трапляється, щоб набір даних був повністю готовий для створення моделі ML "з коробки". У цьому уроці ви дізнаєтесь, як підготувати сирий набір даних за допомогою стандартних бібліотек Python. Ви також ознайомитеся з різними техніками візуалізації даних. + +## Кейс: "ринок гарбузів" + +У цій папці ви знайдете файл .csv у кореневій папці `data` під назвою [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), який містить 1757 рядків даних про ринок гарбузів, згрупованих за містами. Це сирі дані, отримані з [Звітів про стандартні ринки спеціальних культур](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), які розповсюджуються Міністерством сільського господарства США. + +### Підготовка даних + +Ці дані є у відкритому доступі. Їх можна завантажити у вигляді багатьох окремих файлів для кожного міста з вебсайту USDA. Щоб уникнути надмірної кількості файлів, ми об'єднали всі дані по містах в одну таблицю, таким чином ми вже трохи _підготували_ дані. Тепер давайте уважніше розглянемо ці дані. + +### Дані про гарбузи - попередні висновки + +Що ви помітили про ці дані? Ви вже бачили, що є суміш рядків, чисел, пропусків і дивних значень, які потрібно зрозуміти. + +Яке запитання можна поставити до цих даних, використовуючи регресійний метод? Наприклад: "Передбачити ціну гарбуза, що продається в певному місяці". Знову поглянувши на дані, ви побачите, що потрібно внести деякі зміни, щоб створити структуру даних, необхідну для виконання цього завдання. + +## Вправа - аналіз даних про гарбузи + +Давайте використаємо [Pandas](https://pandas.pydata.org/) (назва походить від `Python Data Analysis`), інструмент, дуже корисний для обробки даних, щоб проаналізувати та підготувати ці дані про гарбузи. + +### Спочатку перевірте наявність відсутніх дат + +Спочатку потрібно виконати кроки для перевірки відсутніх дат: + +1. Перетворіть дати у формат місяця (це дати США, тому формат `MM/DD/YYYY`). +2. Витягніть місяць у новий стовпець. + +Відкрийте файл _notebook.ipynb_ у Visual Studio Code і імпортуйте таблицю в новий датафрейм Pandas. + +1. Використайте функцію `head()`, щоб переглянути перші п'ять рядків. + + ```python + import pandas as pd + pumpkins = pd.read_csv('../data/US-pumpkins.csv') + pumpkins.head() + ``` + + ✅ Яку функцію ви б використали, щоб переглянути останні п'ять рядків? + +1. Перевірте, чи є пропущені дані в поточному датафреймі: + + ```python + pumpkins.isnull().sum() + ``` + + Є пропущені дані, але, можливо, це не матиме значення для виконання завдання. + +1. Щоб зробити ваш датафрейм зручнішим для роботи, виберіть лише потрібні стовпці, використовуючи функцію `loc`, яка витягує з оригінального датафрейму групу рядків (передається як перший параметр) і стовпців (передається як другий параметр). Вираз `:` у наведеному нижче прикладі означає "усі рядки". + + ```python + columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] + pumpkins = pumpkins.loc[:, columns_to_select] + ``` + +### Далі визначте середню ціну гарбуза + +Подумайте, як визначити середню ціну гарбуза в певному місяці. Які стовпці ви б обрали для цього завдання? Підказка: вам знадобляться 3 стовпці. + +Рішення: візьміть середнє значення стовпців `Low Price` і `High Price`, щоб заповнити новий стовпець Price, і перетворіть стовпець Date так, щоб він показував лише місяць. На щастя, згідно з перевіркою вище, немає пропущених даних для дат або цін. + +1. Щоб обчислити середнє значення, додайте наступний код: + + ```python + price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 + + month = pd.DatetimeIndex(pumpkins['Date']).month + + ``` + + ✅ Ви можете вивести будь-які дані для перевірки, використовуючи `print(month)`. + +2. Тепер скопіюйте ваші перетворені дані в новий датафрейм Pandas: + + ```python + new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) + ``` + + Виведення вашого датафрейму покаже вам чистий, впорядкований набір даних, на основі якого ви зможете створити нову регресійну модель. + +### Але зачекайте! Тут є щось дивне + +Якщо подивитися на стовпець `Package`, гарбузи продаються в багатьох різних конфігураціях. Деякі продаються у вимірюваннях '1 1/9 bushel', деякі у '1/2 bushel', деякі за штуку, деякі за фунт, а деякі у великих коробках із різною шириною. + +> Гарбузи, здається, дуже важко зважувати послідовно + +Заглиблюючись в оригінальні дані, цікаво, що все, що має `Unit of Sale`, рівне 'EACH' або 'PER BIN', також має тип `Package` у дюймах, бін або 'each'. Гарбузи, здається, дуже важко зважувати послідовно, тому давайте відфільтруємо їх, вибравши лише гарбузи зі словом 'bushel' у стовпці `Package`. + +1. Додайте фільтр на початку файлу, під початковим імпортом .csv: + + ```python + pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] + ``` + + Якщо ви виведете дані зараз, ви побачите, що отримуєте лише близько 415 рядків даних, які містять гарбузи за бушель. + +### Але зачекайте! Є ще одна річ, яку потрібно зробити + +Чи помітили ви, що кількість бушелів варіюється в кожному рядку? Вам потрібно нормалізувати ціни, щоб показати ціни за бушель, тому виконайте деякі обчислення для стандартизації. + +1. Додайте ці рядки після блоку, що створює датафрейм new_pumpkins: + + ```python + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) + + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) + ``` + +✅ Згідно з [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), вага бушеля залежить від типу продукту, оскільки це об'ємне вимірювання. "Бушель помідорів, наприклад, повинен важити 56 фунтів... Листя та зелень займають більше місця з меншою вагою, тому бушель шпинату важить лише 20 фунтів." Це все досить складно! Давайте не будемо займатися перетворенням бушеля у фунти, а замість цього ціноутворювати за бушель. Усі ці дослідження бушелів гарбузів, однак, показують, наскільки важливо розуміти природу ваших даних! + +Тепер ви можете аналізувати ціни за одиницю на основі їхнього вимірювання в бушелях. Якщо ви ще раз виведете дані, ви побачите, як вони стандартизовані. + +✅ Чи помітили ви, що гарбузи, які продаються за півбушеля, дуже дорогі? Чи можете ви зрозуміти, чому? Підказка: маленькі гарбузи набагато дорожчі за великі, ймовірно, тому що їх набагато більше в одному бушелі, враховуючи невикористаний простір, який займає один великий порожнистий гарбуз для пирога. + +## Стратегії візуалізації + +Частина роботи дата-сайєнтиста полягає в демонстрації якості та характеру даних, з якими він працює. Для цього часто створюють цікаві візуалізації, такі як графіки, діаграми та схеми, які показують різні аспекти даних. Таким чином, вони можуть візуально показати взаємозв'язки та прогалини, які інакше важко виявити. + +[![ML для початківців - Як візуалізувати дані за допомогою Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML для початківців - Як візуалізувати дані за допомогою Matplotlib") + +> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео про візуалізацію даних для цього уроку. + +Візуалізації також можуть допомогти визначити техніку машинного навчання, яка найбільше підходить для даних. Наприклад, діаграма розсіювання, яка здається лінійною, вказує на те, що дані є хорошим кандидатом для вправи з лінійної регресії. + +Одна з бібліотек для візуалізації даних, яка добре працює в Jupyter notebooks, — це [Matplotlib](https://matplotlib.org/) (яку ви також бачили в попередньому уроці). + +> Отримайте більше досвіду з візуалізації даних у [цих навчальних посібниках](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). + +## Вправа - експериментуйте з Matplotlib + +Спробуйте створити базові графіки для відображення нового датафрейму, який ви щойно створили. Що покаже базовий лінійний графік? + +1. Імпортуйте Matplotlib на початку файлу, під імпортом Pandas: + + ```python + import matplotlib.pyplot as plt + ``` + +1. Перезапустіть весь ноутбук, щоб оновити. +1. У нижній частині ноутбука додайте комірку для побудови графіка у вигляді коробки: + + ```python + price = new_pumpkins.Price + month = new_pumpkins.Month + plt.scatter(price, month) + plt.show() + ``` + + ![Діаграма розсіювання, що показує зв'язок між ціною та місяцем](../../../../2-Regression/2-Data/images/scatterplot.png) + + Чи є цей графік корисним? Чи щось у ньому вас здивувало? + + Він не особливо корисний, оскільки лише відображає ваші дані як розкид точок у певному місяці. + +### Зробіть це корисним + +Щоб графіки відображали корисні дані, зазвичай потрібно якось згрупувати дані. Спробуймо створити графік, де вісь y показує місяці, а дані демонструють розподіл. + +1. Додайте комірку для створення згрупованої стовпчастої діаграми: + + ```python + new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') + plt.ylabel("Pumpkin Price") + ``` + + ![Стовпчаста діаграма, що показує зв'язок між ціною та місяцем](../../../../2-Regression/2-Data/images/barchart.png) + + Це більш корисна візуалізація даних! Здається, вона вказує на те, що найвища ціна на гарбузи припадає на вересень і жовтень. Чи відповідає це вашим очікуванням? Чому або чому ні? + +--- + +## 🚀Виклик + +Дослідіть різні типи візуалізацій, які пропонує Matplotlib. Які типи найбільше підходять для задач регресії? + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Ознайомтеся з багатьма способами візуалізації даних. Складіть список різних бібліотек, доступних для цього, і зазначте, які з них найкраще підходять для певних типів завдань, наприклад, для 2D-візуалізацій проти 3D-візуалізацій. Що ви виявите? + +## Завдання + +[Дослідження візуалізації](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/2-Data/assignment.md b/translations/uk/2-Regression/2-Data/assignment.md new file mode 100644 index 00000000..19816da6 --- /dev/null +++ b/translations/uk/2-Regression/2-Data/assignment.md @@ -0,0 +1,22 @@ + +# Дослідження візуалізацій + +Існує кілька різних бібліотек, доступних для візуалізації даних. Створіть кілька візуалізацій, використовуючи дані про гарбузи з цього уроку, за допомогою matplotlib та seaborn у зразковому ноутбуці. Які бібліотеки зручніше використовувати? +## Критерії оцінювання + +| Критерії | Відмінно | Достатньо | Потребує покращення | +| -------- | --------- | -------- | ----------------- | +| | Ноутбук подано з двома дослідженнями/візуалізаціями | Ноутбук подано з одним дослідженням/візуалізацією | Ноутбук не подано | + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/2-Data/solution/Julia/README.md b/translations/uk/2-Regression/2-Data/solution/Julia/README.md new file mode 100644 index 00000000..fa247c16 --- /dev/null +++ b/translations/uk/2-Regression/2-Data/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматизовані переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/3-Linear/README.md b/translations/uk/2-Regression/3-Linear/README.md new file mode 100644 index 00000000..04ed8bfd --- /dev/null +++ b/translations/uk/2-Regression/3-Linear/README.md @@ -0,0 +1,374 @@ + +# Побудова моделі регресії за допомогою Scikit-learn: чотири способи регресії + +![Інфографіка лінійної та поліноміальної регресії](../../../../2-Regression/3-Linear/images/linear-polynomial.png) +> Інфографіка від [Dasani Madipalli](https://twitter.com/dasani_decoded) +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Цей урок доступний у R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html) +### Вступ + +До цього моменту ви дослідили, що таке регресія, використовуючи вибіркові дані з набору даних про ціни на гарбузи, який ми будемо використовувати протягом цього уроку. Ви також візуалізували ці дані за допомогою Matplotlib. + +Тепер ви готові глибше зануритися в регресію для машинного навчання. Хоча візуалізація дозволяє зрозуміти дані, справжня сила машинного навчання полягає у _навчанні моделей_. Моделі навчаються на історичних даних, щоб автоматично захоплювати залежності між даними, і дозволяють прогнозувати результати для нових даних, які модель раніше не бачила. + +У цьому уроці ви дізнаєтеся більше про два типи регресії: _основну лінійну регресію_ та _поліноміальну регресію_, а також про деякі математичні основи цих методів. Ці моделі дозволять нам прогнозувати ціни на гарбузи залежно від різних вхідних даних. + +[![ML для початківців - Розуміння лінійної регресії](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "ML для початківців - Розуміння лінійної регресії") + +> 🎥 Натисніть на зображення вище, щоб переглянути короткий відеоогляд лінійної регресії. + +> Протягом цього курсу ми припускаємо мінімальні знання математики та прагнемо зробити її доступною для студентів з інших галузей, тому звертайте увагу на примітки, 🧮 математичні виклики, діаграми та інші навчальні інструменти для полегшення розуміння. + +### Передумови + +На даний момент ви повинні бути знайомі зі структурою даних про гарбузи, які ми досліджуємо. Ви можете знайти їх попередньо завантаженими та очищеними у файлі _notebook.ipynb_ цього уроку. У файлі ціна гарбуза відображається за бушель у новому фреймі даних. Переконайтеся, що ви можете запускати ці ноутбуки в ядрах Visual Studio Code. + +### Підготовка + +Нагадаємо, ви завантажуєте ці дані, щоб ставити запитання до них. + +- Коли найкращий час для купівлі гарбузів? +- Яку ціну можна очікувати за ящик мініатюрних гарбузів? +- Чи варто купувати їх у кошиках на півбушеля чи в коробках на 1 1/9 бушеля? +Давайте продовжимо досліджувати ці дані. + +У попередньому уроці ви створили фрейм даних Pandas і заповнили його частиною оригінального набору даних, стандартизуючи ціни за бушель. Однак, зробивши це, ви змогли зібрати лише близько 400 точок даних і лише для осінніх місяців. + +Перегляньте дані, які ми попередньо завантажили у супровідному ноутбуці цього уроку. Дані попередньо завантажені, а початковий діаграма розсіювання побудована для відображення даних за місяцями. Можливо, ми зможемо отримати трохи більше деталей про природу даних, якщо очистимо їх більше. + +## Лінія лінійної регресії + +Як ви дізналися в Уроці 1, мета вправи з лінійної регресії полягає в тому, щоб побудувати лінію для: + +- **Показу взаємозв'язків змінних**. Показати взаємозв'язок між змінними. +- **Прогнозування**. Зробити точні прогнози щодо того, де нова точка даних буде розташована відносно цієї лінії. + +Зазвичай для побудови такого типу лінії використовується метод **регресії найменших квадратів**. Термін "найменші квадрати" означає, що всі точки даних навколо лінії регресії підносяться до квадрату, а потім додаються. Ідеально, щоб остаточна сума була якомога меншою, оскільки ми хочемо мати низьку кількість помилок, або `найменші квадрати`. + +Ми робимо це, оскільки хочемо змоделювати лінію, яка має найменшу сумарну відстань від усіх наших точок даних. Ми також підносимо терміни до квадрату перед додаванням, оскільки нас цікавить їх величина, а не напрямок. + +> **🧮 Покажіть мені математику** +> +> Ця лінія, яка називається _лінією найкращого підходу_, може бути виражена [рівнянням](https://en.wikipedia.org/wiki/Simple_linear_regression): +> +> ``` +> Y = a + bX +> ``` +> +> `X` — це "пояснювальна змінна". `Y` — це "залежна змінна". Нахил лінії — це `b`, а `a` — це точка перетину з віссю Y, яка відповідає значенню `Y`, коли `X = 0`. +> +>![обчислення нахилу](../../../../2-Regression/3-Linear/images/slope.png) +> +> Спочатку обчисліть нахил `b`. Інфографіка від [Jen Looper](https://twitter.com/jenlooper) +> +> Іншими словами, звертаючись до початкового питання про дані гарбузів: "прогнозуйте ціну гарбуза за бушель за місяцями", `X` буде означати ціну, а `Y` — місяць продажу. +> +>![завершення рівняння](../../../../2-Regression/3-Linear/images/calculation.png) +> +> Обчисліть значення Y. Якщо ви платите близько $4, це має бути квітень! Інфографіка від [Jen Looper](https://twitter.com/jenlooper) +> +> Математика, яка обчислює лінію, повинна демонструвати нахил лінії, який також залежить від точки перетину, або де `Y` розташований, коли `X = 0`. +> +> Ви можете ознайомитися з методом обчислення цих значень на веб-сайті [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Також відвідайте [цей калькулятор найменших квадратів](https://www.mathsisfun.com/data/least-squares-calculator.html), щоб побачити, як значення чисел впливають на лінію. + +## Кореляція + +Ще один термін, який потрібно зрозуміти, — це **коефіцієнт кореляції** між заданими змінними X і Y. Використовуючи діаграму розсіювання, ви можете швидко візуалізувати цей коефіцієнт. Діаграма з точками даних, розташованими в акуратній лінії, має високу кореляцію, але діаграма з точками даних, розкиданими між X і Y, має низьку кореляцію. + +Хороша модель лінійної регресії буде тією, яка має високий (ближче до 1, ніж до 0) коефіцієнт кореляції, використовуючи метод регресії найменших квадратів із лінією регресії. + +✅ Запустіть ноутбук, що супроводжує цей урок, і подивіться на діаграму розсіювання "Місяць до Ціни". Чи здається, що дані, які асоціюють місяць із ціною продажу гарбузів, мають високу чи низьку кореляцію, згідно з вашим візуальним інтерпретацією діаграми розсіювання? Чи змінюється це, якщо використовувати більш детальний вимір замість `Місяць`, наприклад, *день року* (тобто кількість днів з початку року)? + +У наведеному нижче коді ми припускаємо, що ми очистили дані та отримали фрейм даних під назвою `new_pumpkins`, схожий на наступний: + +ID | Місяць | ДеньРоку | Сорт | Місто | Упаковка | Низька ціна | Висока ціна | Ціна +---|-------|-----------|---------|------|---------|-----------|------------|------- +70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 +71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 +72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 +73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545 +74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 + +> Код для очищення даних доступний у [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb). Ми виконали ті ж кроки очищення, що й у попередньому уроці, і обчислили стовпець `DayOfYear`, використовуючи наступний вираз: + +```python +day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days) +``` + +Тепер, коли ви розумієте математику, що лежить в основі лінійної регресії, давайте створимо модель регресії, щоб перевірити, чи можемо ми передбачити, яка упаковка гарбузів матиме найкращі ціни на гарбузи. Хтось, хто купує гарбузи для святкового гарбузового поля, може захотіти отримати цю інформацію, щоб оптимізувати свої покупки упаковок гарбузів для поля. + +## Пошук кореляції + +[![ML для початківців - Пошук кореляції: ключ до лінійної регресії](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "ML для початківців - Пошук кореляції: ключ до лінійної регресії") + +> 🎥 Натисніть на зображення вище, щоб переглянути короткий відеоогляд кореляції. + +З попереднього уроку ви, мабуть, бачили, що середня ціна за різні місяці виглядає так: + +Середня ціна за місяцями + +Це свідчить про те, що має бути певна кореляція, і ми можемо спробувати навчити модель лінійної регресії, щоб передбачити взаємозв'язок між `Місяць` і `Ціна`, або між `ДеньРоку` і `Ціна`. Ось діаграма розсіювання, яка показує останній взаємозв'язок: + +Діаграма розсіювання Ціна vs День року + +Давайте перевіримо, чи є кореляція, використовуючи функцію `corr`: + +```python +print(new_pumpkins['Month'].corr(new_pumpkins['Price'])) +print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price'])) +``` + +Схоже, що кореляція досить мала, -0.15 за `Місяць` і -0.17 за `ДеньРоку`, але може бути інший важливий взаємозв'язок. Схоже, що є різні кластери цін, які відповідають різним сортам гарбузів. Щоб підтвердити цю гіпотезу, давайте побудуємо кожну категорію гарбузів, використовуючи різний колір. Передаючи параметр `ax` до функції побудови діаграми розсіювання, ми можемо побудувати всі точки на одному графіку: + +```python +ax=None +colors = ['red','blue','green','yellow'] +for i,var in enumerate(new_pumpkins['Variety'].unique()): + df = new_pumpkins[new_pumpkins['Variety']==var] + ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var) +``` + +Діаграма розсіювання Ціна vs День року + +Наше дослідження свідчить про те, що сорт має більший вплив на загальну ціну, ніж фактична дата продажу. Ми можемо побачити це за допомогою стовпчастої діаграми: + +```python +new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar') +``` + +Стовпчаста діаграма ціни за сортами + +Давайте зосередимося на даний момент лише на одному сорті гарбузів, "pie type", і подивимося, який вплив має дата на ціну: + +```python +pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE'] +pie_pumpkins.plot.scatter('DayOfYear','Price') +``` +Діаграма розсіювання Ціна vs День року + +Якщо ми тепер обчислимо кореляцію між `Ціна` і `ДеньРоку`, використовуючи функцію `corr`, ми отримаємо щось близько `-0.27` - що означає, що навчання моделі прогнозування має сенс. + +> Перед навчанням моделі лінійної регресії важливо переконатися, що наші дані очищені. Лінійна регресія не працює добре з відсутніми значеннями, тому має сенс позбутися всіх порожніх клітинок: + +```python +pie_pumpkins.dropna(inplace=True) +pie_pumpkins.info() +``` + +Інший підхід полягатиме в заповненні цих порожніх значень середніми значеннями з відповідного стовпця. + +## Проста лінійна регресія + +[![ML для початківців - Лінійна та поліноміальна регресія за допомогою Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "ML для початківців - Лінійна та поліноміальна регресія за допомогою Scikit-learn") + +> 🎥 Натисніть на зображення вище, щоб переглянути короткий відеоогляд лінійної та поліноміальної регресії. + +Для навчання нашої моделі лінійної регресії ми будемо використовувати бібліотеку **Scikit-learn**. + +```python +from sklearn.linear_model import LinearRegression +from sklearn.metrics import mean_squared_error +from sklearn.model_selection import train_test_split +``` + +Ми починаємо з розділення вхідних значень (особливостей) і очікуваного результату (мітки) на окремі масиви numpy: + +```python +X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1) +y = pie_pumpkins['Price'] +``` + +> Зверніть увагу, що нам довелося виконати `reshape` для вхідних даних, щоб пакет лінійної регресії правильно їх зрозумів. Лінійна регресія очікує 2D-масив як вхідні дані, де кожен рядок масиву відповідає вектору вхідних особливостей. У нашому випадку, оскільки у нас є лише один вхід, нам потрібен масив із формою N×1, де N — це розмір набору даних. + +Потім нам потрібно розділити дані на навчальний і тестовий набори, щоб ми могли перевірити нашу модель після навчання: + +```python +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) +``` + +Нарешті, навчання фактичної моделі лінійної регресії займає лише два рядки коду. Ми визначаємо об'єкт `LinearRegression` і підганяємо його до наших даних, використовуючи метод `fit`: + +```python +lin_reg = LinearRegression() +lin_reg.fit(X_train,y_train) +``` + +Об'єкт `LinearRegression` після підгонки містить усі коефіцієнти регресії, до яких можна отримати доступ за допомогою властивості `.coef_`. У нашому випадку є лише один коефіцієнт, який має бути близько `-0.017`. Це означає, що ціни, здається, трохи падають з часом, але не надто сильно, приблизно на 2 центи на день. Ми також можемо отримати точку перетину регресії з віссю Y, використовуючи `lin_reg.intercept_` - вона буде близько `21` у нашому випадку, що вказує на ціну на початку року. + +Щоб побачити, наскільки точна наша модель, ми можемо прогнозувати ціни на тестовому набор +Наша помилка, здається, зосереджена на 2 пунктах, що становить ~17%. Не надто добре. Ще одним показником якості моделі є **коефіцієнт детермінації**, який можна отримати таким чином: + +```python +score = lin_reg.score(X_train,y_train) +print('Model determination: ', score) +``` +Якщо значення дорівнює 0, це означає, що модель не враховує вхідні дані і діє як *найгірший лінійний прогнозатор*, який просто є середнім значенням результату. Значення 1 означає, що ми можемо ідеально передбачити всі очікувані результати. У нашому випадку коефіцієнт становить близько 0.06, що досить низько. + +Ми також можемо побудувати графік тестових даних разом із лінією регресії, щоб краще побачити, як регресія працює у нашому випадку: + +```python +plt.scatter(X_test,y_test) +plt.plot(X_test,pred) +``` + +Лінійна регресія + +## Поліноміальна регресія + +Іншим типом лінійної регресії є поліноміальна регресія. Хоча іноді існує лінійна залежність між змінними — чим більший об’єм гарбуза, тим вища ціна — іноді ці залежності не можна зобразити у вигляді площини або прямої лінії. + +✅ Ось [кілька прикладів](https://online.stat.psu.edu/stat501/lesson/9/9.8) даних, які можуть використовувати поліноміальну регресію. + +Подивіться ще раз на залежність між датою та ціною. Чи здається цей розкид точок таким, що його обов’язково слід аналізувати прямою лінією? Хіба ціни не можуть коливатися? У цьому випадку можна спробувати поліноміальну регресію. + +✅ Поліноми — це математичні вирази, які можуть складатися з однієї або кількох змінних і коефіцієнтів. + +Поліноміальна регресія створює криву, яка краще підходить для нелінійних даних. У нашому випадку, якщо ми включимо квадратну змінну `DayOfYear` у вхідні дані, ми зможемо підігнати наші дані під параболічну криву, яка матиме мінімум у певний момент протягом року. + +Scikit-learn включає зручний [API для конвеєра](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline), щоб об’єднати різні етапи обробки даних. **Конвеєр** — це ланцюжок **оцінювачів**. У нашому випадку ми створимо конвеєр, який спочатку додає поліноміальні ознаки до нашої моделі, а потім навчає регресію: + +```python +from sklearn.preprocessing import PolynomialFeatures +from sklearn.pipeline import make_pipeline + +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) + +pipeline.fit(X_train,y_train) +``` + +Використання `PolynomialFeatures(2)` означає, що ми включимо всі поліноми другого ступеня з вхідних даних. У нашому випадку це просто означатиме `DayOfYear`2, але якщо є дві вхідні змінні X і Y, це додасть X2, XY і Y2. Ми також можемо використовувати поліноми вищого ступеня, якщо це необхідно. + +Конвеєри можна використовувати так само, як і оригінальний об’єкт `LinearRegression`, тобто ми можемо виконати `fit` для конвеєра, а потім використовувати `predict`, щоб отримати результати прогнозу. Ось графік, який показує тестові дані та криву апроксимації: + +Поліноміальна регресія + +Використовуючи поліноміальну регресію, ми можемо отримати трохи нижчий MSE і вищий коефіцієнт детермінації, але не значно. Нам потрібно врахувати інші ознаки! + +> Ви можете побачити, що мінімальні ціни на гарбузи для пирогів спостерігаються десь навколо Хелловіну. Як ви можете це пояснити? + +🎃 Вітаємо, ви щойно створили модель, яка може допомогти передбачити ціну гарбузів для пирогів. Ви, ймовірно, можете повторити ту саму процедуру для всіх типів гарбузів, але це було б виснажливо. Давайте тепер навчимося враховувати різновиди гарбузів у нашій моделі! + +## Категоріальні ознаки + +У ідеальному світі ми хочемо мати можливість передбачати ціни для різних різновидів гарбузів, використовуючи одну й ту саму модель. Однак стовпець `Variety` дещо відрізняється від таких стовпців, як `Month`, оскільки він містить нечислові значення. Такі стовпці називаються **категоріальними**. + +[![ML для початківців - Прогнозування категоріальних ознак за допомогою лінійної регресії](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML для початківців - Прогнозування категоріальних ознак за допомогою лінійної регресії") + +> 🎥 Натисніть на зображення вище, щоб переглянути короткий відеоогляд використання категоріальних ознак. + +Ось як середня ціна залежить від різновиду: + +Середня ціна за різновидом + +Щоб врахувати різновид, спочатку потрібно перетворити його у числову форму, або **закодувати**. Є кілька способів зробити це: + +* Просте **числове кодування** створить таблицю різних різновидів, а потім замінить назву різновиду на індекс у цій таблиці. Це не найкраща ідея для лінійної регресії, оскільки лінійна регресія бере фактичне числове значення індексу та додає його до результату, множачи на певний коефіцієнт. У нашому випадку залежність між номером індексу та ціною явно нелінійна, навіть якщо ми переконаємося, що індекси впорядковані певним чином. +* **One-hot кодування** замінить стовпець `Variety` на 4 різні стовпці, по одному для кожного різновиду. Кожен стовпець міститиме `1`, якщо відповідний рядок належить до даного різновиду, і `0` в іншому випадку. Це означає, що в лінійній регресії буде чотири коефіцієнти, по одному для кожного різновиду гарбуза, які відповідають за "початкову ціну" (або скоріше "додаткову ціну") для цього конкретного різновиду. + +Код нижче показує, як ми можемо виконати one-hot кодування для різновиду: + +```python +pd.get_dummies(new_pumpkins['Variety']) +``` + + ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE +----|-----------|-----------|--------------------------|---------- +70 | 0 | 0 | 0 | 1 +71 | 0 | 0 | 0 | 1 +... | ... | ... | ... | ... +1738 | 0 | 1 | 0 | 0 +1739 | 0 | 1 | 0 | 0 +1740 | 0 | 1 | 0 | 0 +1741 | 0 | 1 | 0 | 0 +1742 | 0 | 1 | 0 | 0 + +Щоб навчити лінійну регресію, використовуючи one-hot закодований різновид як вхідні дані, нам просто потрібно правильно ініціалізувати дані `X` і `y`: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) +y = new_pumpkins['Price'] +``` + +Решта коду така ж, як і той, що ми використовували вище для навчання лінійної регресії. Якщо ви спробуєте це, то побачите, що середньоквадратична помилка приблизно така ж, але ми отримуємо набагато вищий коефіцієнт детермінації (~77%). Щоб отримати ще точніші прогнози, ми можемо врахувати більше категоріальних ознак, а також числові ознаки, такі як `Month` або `DayOfYear`. Щоб отримати один великий масив ознак, ми можемо використати `join`: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] +``` + +Тут ми також враховуємо `City` і тип `Package`, що дає нам MSE 2.84 (10%) і детермінацію 0.94! + +## Об’єднання всього разом + +Щоб створити найкращу модель, ми можемо використовувати комбіновані (one-hot закодовані категоріальні + числові) дані з наведеного вище прикладу разом із поліноміальною регресією. Ось повний код для вашої зручності: + +```python +# set up training data +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] + +# make train-test split +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + +# setup and train the pipeline +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) +pipeline.fit(X_train,y_train) + +# predict results for test data +pred = pipeline.predict(X_test) + +# calculate MSE and determination +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') + +score = pipeline.score(X_train,y_train) +print('Model determination: ', score) +``` + +Це має дати нам найкращий коефіцієнт детермінації майже 97% і MSE=2.23 (~8% помилки прогнозу). + +| Модель | MSE | Детермінація | +|--------|-----|--------------| +| `DayOfYear` Лінійна | 2.77 (17.2%) | 0.07 | +| `DayOfYear` Поліноміальна | 2.73 (17.0%) | 0.08 | +| `Variety` Лінійна | 5.24 (19.7%) | 0.77 | +| Усі ознаки Лінійна | 2.84 (10.5%) | 0.94 | +| Усі ознаки Поліноміальна | 2.23 (8.25%) | 0.97 | + +🏆 Чудова робота! Ви створили чотири моделі регресії за один урок і покращили якість моделі до 97%. У фінальному розділі про регресію ви дізнаєтеся про логістичну регресію для визначення категорій. + +--- + +## 🚀Завдання + +Перевірте кілька різних змінних у цьому ноутбуці, щоб побачити, як кореляція відповідає точності моделі. + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +У цьому уроці ми дізналися про лінійну регресію. Існують інші важливі типи регресії. Прочитайте про методи Stepwise, Ridge, Lasso і Elasticnet. Хороший курс для вивчення — [курс статистичного навчання Стенфорда](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning). + +## Завдання + +[Створіть модель](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/3-Linear/assignment.md b/translations/uk/2-Regression/3-Linear/assignment.md new file mode 100644 index 00000000..313d11b2 --- /dev/null +++ b/translations/uk/2-Regression/3-Linear/assignment.md @@ -0,0 +1,25 @@ + +# Створення моделі регресії + +## Інструкції + +У цьому уроці вам було показано, як створити модель, використовуючи як лінійну, так і поліноміальну регресію. Використовуючи ці знання, знайдіть набір даних або скористайтеся одним із вбудованих наборів Scikit-learn, щоб створити нову модель. Поясніть у своєму ноутбуці, чому ви обрали саме цей метод, і продемонструйте точність вашої моделі. Якщо модель не є точною, поясніть причини. + +## Рубрика + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | ------------------------------------------------------------ | -------------------------- | ------------------------------- | +| | представлено повний ноутбук із добре задокументованим рішенням | рішення є неповним | рішення має помилки або недоліки | + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/3-Linear/solution/Julia/README.md b/translations/uk/2-Regression/3-Linear/solution/Julia/README.md new file mode 100644 index 00000000..62003720 --- /dev/null +++ b/translations/uk/2-Regression/3-Linear/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/4-Logistic/README.md b/translations/uk/2-Regression/4-Logistic/README.md new file mode 100644 index 00000000..ca641a9a --- /dev/null +++ b/translations/uk/2-Regression/4-Logistic/README.md @@ -0,0 +1,407 @@ + +# Логістична регресія для прогнозування категорій + +![Інфографіка: Логістична vs. Лінійна регресія](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png) + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Цей урок доступний у R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html) + +## Вступ + +У цьому останньому уроці про регресію, одну з базових _класичних_ технік машинного навчання, ми розглянемо логістичну регресію. Цю техніку можна використовувати для виявлення закономірностей і прогнозування бінарних категорій. Чи є ця цукерка шоколадом чи ні? Чи є ця хвороба заразною чи ні? Чи вибере цей клієнт продукт чи ні? + +У цьому уроці ви дізнаєтесь: + +- Нову бібліотеку для візуалізації даних +- Техніки логістичної регресії + +✅ Поглибте своє розуміння роботи з цим типом регресії у [модулі навчання](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott) + +## Передумови + +Працюючи з даними про гарбузи, ми вже достатньо знайомі з ними, щоб зрозуміти, що є одна бінарна категорія, з якою ми можемо працювати: `Color`. + +Давайте побудуємо модель логістичної регресії, щоб прогнозувати, _якого кольору, ймовірно, буде даний гарбуз_ (помаранчевий 🎃 чи білий 👻), враховуючи деякі змінні. + +> Чому ми говоримо про бінарну класифікацію в уроці про регресію? Лише для мовної зручності, оскільки логістична регресія [насправді є методом класифікації](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), хоча й базується на лінійній моделі. Дізнайтеся про інші способи класифікації даних у наступній групі уроків. + +## Визначення питання + +Для наших цілей ми сформулюємо це як бінарне: "Білий" чи "Не білий". У нашому наборі даних також є категорія "смугастий", але випадків її використання мало, тому ми її не враховуватимемо. Вона зникає після видалення нульових значень із набору даних. + +> 🎃 Цікавий факт: ми іноді називаємо білі гарбузи "гарбузами-привидами". Їх не дуже легко вирізати, тому вони не такі популярні, як помаранчеві, але виглядають круто! Тож ми також могли б переформулювати наше питання як: "Привид" чи "Не привид". 👻 + +## Про логістичну регресію + +Логістична регресія відрізняється від лінійної регресії, яку ви вивчали раніше, кількома важливими аспектами. + +[![Машинне навчання для початківців - Розуміння логістичної регресії для класифікації](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "Машинне навчання для початківців - Розуміння логістичної регресії для класифікації") + +> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео про логістичну регресію. + +### Бінарна класифікація + +Логістична регресія не пропонує тих самих функцій, що й лінійна регресія. Перша пропонує прогнозування бінарної категорії ("білий чи не білий"), тоді як друга здатна прогнозувати безперервні значення, наприклад, враховуючи походження гарбуза та час збору врожаю, _наскільки зросте його ціна_. + +![Модель класифікації гарбузів](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png) +> Інфографіка від [Dasani Madipalli](https://twitter.com/dasani_decoded) + +### Інші класифікації + +Існують інші типи логістичної регресії, включаючи мультиноміальну та порядкову: + +- **Мультиноміальна**, яка передбачає наявність більше ніж однієї категорії - "Помаранчевий, Білий і Смугастий". +- **Порядкова**, яка передбачає впорядковані категорії, корисна, якщо ми хочемо впорядкувати результати логічно, наприклад, гарбузи, які впорядковані за обмеженою кількістю розмірів (mini, sm, med, lg, xl, xxl). + +![Мультиноміальна vs порядкова регресія](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png) + +### Змінні НЕ повинні корелювати + +Пам'ятаєте, як лінійна регресія працювала краще з більш корельованими змінними? Логістична регресія є протилежною - змінні не повинні співпадати. Це підходить для даних, які мають слабкі кореляції. + +### Вам потрібні великі обсяги чистих даних + +Логістична регресія дає більш точні результати, якщо використовувати більше даних; наш невеликий набір даних не є оптимальним для цього завдання, тому враховуйте це. + +[![Машинне навчання для початківців - Аналіз і підготовка даних для логістичної регресії](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "Машинне навчання для початківців - Аналіз і підготовка даних для логістичної регресії") + +✅ Подумайте про типи даних, які добре підходять для логістичної регресії + +## Вправа - підготовка даних + +Спочатку трохи очистимо дані, видаливши нульові значення та вибравши лише деякі стовпці: + +1. Додайте наступний код: + + ```python + + columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] + pumpkins = full_pumpkins.loc[:, columns_to_select] + + pumpkins.dropna(inplace=True) + ``` + + Ви завжди можете переглянути ваш новий датафрейм: + + ```python + pumpkins.info + ``` + +### Візуалізація - категоріальний графік + +На даний момент ви завантажили [початковий ноутбук](../../../../2-Regression/4-Logistic/notebook.ipynb) з даними про гарбузи та очистили його, щоб зберегти набір даних, що містить кілька змінних, включаючи `Color`. Давайте візуалізуємо датафрейм у ноутбуці, використовуючи іншу бібліотеку: [Seaborn](https://seaborn.pydata.org/index.html), яка побудована на Matplotlib, яку ми використовували раніше. + +Seaborn пропонує цікаві способи візуалізації ваших даних. Наприклад, ви можете порівняти розподіли даних для кожного `Variety` і `Color` у категоріальному графіку. + +1. Створіть такий графік, використовуючи функцію `catplot`, дані про гарбузи `pumpkins` і вказавши кольорове відображення для кожної категорії гарбузів (помаранчевий або білий): + + ```python + import seaborn as sns + + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + + sns.catplot( + data=pumpkins, y="Variety", hue="Color", kind="count", + palette=palette, + ) + ``` + + ![Сітка візуалізованих даних](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png) + + Спостерігаючи за даними, ви можете побачити, як дані про Color співвідносяться з Variety. + + ✅ Враховуючи цей категоріальний графік, які цікаві дослідження ви можете уявити? + +### Попередня обробка даних: кодування ознак і міток + +Наш набір даних про гарбузи містить текстові значення для всіх своїх стовпців. Робота з категоріальними даними є інтуїтивною для людей, але не для машин. Алгоритми машинного навчання добре працюють із числами. Саме тому кодування є дуже важливим етапом у фазі попередньої обробки даних, оскільки воно дозволяє перетворити категоріальні дані в числові, не втрачаючи жодної інформації. Хороше кодування сприяє створенню хорошої моделі. + +Для кодування ознак існує два основних типи кодерів: + +1. Ordinal encoder: добре підходить для порядкових змінних, які є категоріальними змінними, де їх дані мають логічний порядок, як стовпець `Item Size` у нашому наборі даних. Він створює відображення, так що кожна категорія представлена числом, яке є порядком категорії в стовпці. + + ```python + from sklearn.preprocessing import OrdinalEncoder + + item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']] + ordinal_features = ['Item Size'] + ordinal_encoder = OrdinalEncoder(categories=item_size_categories) + ``` + +2. Categorical encoder: добре підходить для номінальних змінних, які є категоріальними змінними, де їх дані не мають логічного порядку, як усі ознаки, відмінні від `Item Size` у нашому наборі даних. Це кодування "один-гарячий", що означає, що кожна категорія представлена бінарним стовпцем: закодована змінна дорівнює 1, якщо гарбуз належить до цієї Variety, і 0 в іншому випадку. + + ```python + from sklearn.preprocessing import OneHotEncoder + + categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] + categorical_encoder = OneHotEncoder(sparse_output=False) + ``` + +Потім `ColumnTransformer` використовується для об'єднання кількох кодерів в один етап і застосування їх до відповідних стовпців. + +```python + from sklearn.compose import ColumnTransformer + + ct = ColumnTransformer(transformers=[ + ('ord', ordinal_encoder, ordinal_features), + ('cat', categorical_encoder, categorical_features) + ]) + + ct.set_output(transform='pandas') + encoded_features = ct.fit_transform(pumpkins) +``` + +Для кодування мітки ми використовуємо клас `LabelEncoder` з бібліотеки scikit-learn, який є утилітою для нормалізації міток так, щоб вони містили лише значення між 0 і n_classes-1 (тут, 0 і 1). + +```python + from sklearn.preprocessing import LabelEncoder + + label_encoder = LabelEncoder() + encoded_label = label_encoder.fit_transform(pumpkins['Color']) +``` + +Після того, як ми закодували ознаки та мітку, ми можемо об'єднати їх у новий датафрейм `encoded_pumpkins`. + +```python + encoded_pumpkins = encoded_features.assign(Color=encoded_label) +``` + +✅ Які переваги використання порядкового кодера для стовпця `Item Size`? + +### Аналіз взаємозв'язків між змінними + +Тепер, коли ми попередньо обробили наші дані, ми можемо аналізувати взаємозв'язки між ознаками та міткою, щоб зрозуміти, наскільки добре модель зможе прогнозувати мітку, враховуючи ознаки. Найкращий спосіб виконати такий аналіз - це побудова графіків. Ми знову будемо використовувати функцію `catplot` з бібліотеки Seaborn, щоб візуалізувати взаємозв'язки між `Item Size`, `Variety` і `Color` у категоріальному графіку. Для кращої побудови графіка ми будемо використовувати закодований стовпець `Item Size` і незакодований стовпець `Variety`. + +```python + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size'] + + g = sns.catplot( + data=pumpkins, + x="Item Size", y="Color", row='Variety', + kind="box", orient="h", + sharex=False, margin_titles=True, + height=1.8, aspect=4, palette=palette, + ) + g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6)) + g.set_titles(row_template="{row_name}") +``` + +![Категоріальний графік візуалізованих даних](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png) + +### Використання swarm plot + +Оскільки Color є бінарною категорією (Білий чи Не білий), для її візуалізації потрібен '[спеціалізований підхід](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar)'. Існують інші способи візуалізації взаємозв'язку цієї категорії з іншими змінними. + +Ви можете візуалізувати змінні поруч за допомогою графіків Seaborn. + +1. Спробуйте побудувати графік типу 'swarm', щоб показати розподіл значень: + + ```python + palette = { + 0: 'orange', + 1: 'wheat' + } + sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette) + ``` + + ![Swarm графік візуалізованих даних](../../../../2-Regression/4-Logistic/images/swarm_2.png) + +**Зверніть увагу**: код вище може викликати попередження, оскільки Seaborn не може представити таку кількість точок даних у swarm графіку. Можливим рішенням є зменшення розміру маркера, використовуючи параметр 'size'. Однак майте на увазі, що це впливає на читабельність графіка. + +> **🧮 Покажіть мені математику** +> +> Логістична регресія базується на концепції 'максимальної ймовірності', використовуючи [сигмоїдальні функції](https://wikipedia.org/wiki/Sigmoid_function). 'Сигмоїдальна функція' на графіку виглядає як форма 'S'. Вона бере значення і відображає його в діапазоні між 0 і 1. Її крива також називається 'логістичною кривою'. Її формула виглядає так: +> +> ![логістична функція](../../../../2-Regression/4-Logistic/images/sigmoid.png) +> +> де середина сигмоїди знаходиться на точці 0 для x, L - максимальне значення кривої, а k - крутизна кривої. Якщо результат функції більше 0.5, мітка буде віднесена до класу '1' бінарного вибору. Якщо ні, вона буде класифікована як '0'. + +## Побудова моделі + +Побудова моделі для знаходження цих бінарних класифікацій є досить простою у Scikit-learn. + +[![Машинне навчання для початківців - Логістична регресія для класифікації даних](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "Машинне навчання для початківців - Логістична регресія для класифікації даних") + +> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео про побудову моделі лінійної регресії + +1. Виберіть змінні, які ви хочете використовувати у вашій моделі класифікації, і розділіть навчальні та тестові набори, викликавши `train_test_split()`: + + ```python + from sklearn.model_selection import train_test_split + + X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])] + y = encoded_pumpkins['Color'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + + ``` + +2. Тепер ви можете навчити свою модель, викликавши `fit()` з вашими навчальними даними, і вивести її результат: + + ```python + from sklearn.metrics import f1_score, classification_report + from sklearn.linear_model import LogisticRegression + + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('F1-score: ', f1_score(y_test, predictions)) + ``` + + Подивіться на результати вашої моделі. Вони непогані, враховуючи, що у вас є лише близько 1000 рядків даних: + + ```output + precision recall f1-score support + + 0 0.94 0.98 0.96 166 + 1 0.85 0.67 0.75 33 + + accuracy 0.92 199 + macro avg 0.89 0.82 0.85 199 + weighted avg 0.92 0.92 0.92 199 + + Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 0 0 0 1 0 0 0 0 0 0 0 0 1 1] + F1-score: 0.7457627118644068 + ``` + +## Краще розуміння через матрицю плутанини + +Хоча ви можете отримати звіт про результати [терміни](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report), вивівши наведені вище елементи, ви можете краще зрозуміти свою модель, використовуючи [матрицю плутанини](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix), щоб допомогти нам зрозуміти, як модель працює. + +> 🎓 '[Матриця плутанини](https://wikipedia.org/wiki/Confusion_matrix)' (або 'матриця помилок') - це таблиця, яка виражає справжні та хибні позитивні та негативні результати вашої моделі, таким чином оцінюючи точність прогнозів. + +1. Щоб використовувати матрицю плутанини, викличте `confusion_matrix()`: + + ```python + from sklearn.metrics import confusion_matrix + confusion_matrix(y_test, predictions) + ``` + + Подивіться на матрицю плутанини вашої моделі: + + ```output + array([[162, 4], + [ 11, 22]]) + ``` + +У Scikit-learn рядки (вісь 0) представляють фактичні мітки, а стовпці (вісь 1) - прогнозовані мітки. + +| | 0 | 1 | +| :---: | :---: | :---: | +| 0 | TN | FP | +| 1 | FN | TP | + +Що тут відбувається? Припустимо, наша модель має класифікувати гарбузи між двома бінарними категоріями: категорія 'білий' і категорія 'не білий'. + +- Якщо ваша модель прогнозує гарбуз як не білий, і він насправді належить до категорії 'не білий', ми називаємо це справжнім негативом, показаним у верхньому лівому числі. +- Якщо ваша модель прогнозує гарбуз як білий, і він насправді належить до категорії 'не білий', ми називаємо це хибним негативом, показаним у нижньому лівому числі. +- Якщо ваша модель прогнозує гарбуз як не білий, і він насправді належить до категорії 'білий', ми називаємо це хибним позитив +Як пов'язана матриця плутанини з точністю та повнотою? Пам'ятайте, що класифікаційний звіт, наведений вище, показав точність (0.85) і повноту (0.67). + +Точність = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461 + +Повнота = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666 + +✅ Питання: Як, згідно з матрицею плутанини, впорався модель? Відповідь: Непогано; є значна кількість правильних негативних результатів, але також кілька хибно-негативних. + +Давайте ще раз розглянемо терміни, які ми бачили раніше, за допомогою відображення TP/TN і FP/FN у матриці плутанини: + +🎓 Точність: TP/(TP + FP) Частка релевантних прикладів серед отриманих (наприклад, які мітки були правильно позначені). + +🎓 Повнота: TP/(TP + FN) Частка релевантних прикладів, які були отримані, незалежно від того, чи були вони правильно позначені. + +🎓 f1-оцінка: (2 * точність * повнота)/(точність + повнота) Зважене середнє точності та повноти, де найкраще значення — 1, а найгірше — 0. + +🎓 Підтримка: Кількість випадків кожної мітки, що були отримані. + +🎓 Точність (Accuracy): (TP + TN)/(TP + TN + FP + FN) Відсоток міток, які були правильно передбачені для вибірки. + +🎓 Середнє значення (Macro Avg): Розрахунок незваженого середнього значення метрик для кожної мітки, без урахування дисбалансу міток. + +🎓 Зважене середнє (Weighted Avg): Розрахунок середнього значення метрик для кожної мітки з урахуванням дисбалансу міток шляхом зважування їх за підтримкою (кількість правильних випадків для кожної мітки). + +✅ Чи можете ви визначити, на яку метрику слід звертати увагу, якщо ви хочете, щоб ваша модель зменшила кількість хибно-негативних результатів? + +## Візуалізація ROC-кривої цієї моделі + +[![ML для початківців - Аналіз продуктивності логістичної регресії за допомогою ROC-кривих](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML для початківців - Аналіз продуктивності логістичної регресії за допомогою ROC-кривих") + +> 🎥 Натисніть на зображення вище, щоб переглянути короткий відеоогляд ROC-кривих. + +Давайте зробимо ще одну візуалізацію, щоб побачити так звану 'ROC'-криву: + +```python +from sklearn.metrics import roc_curve, roc_auc_score +import matplotlib +import matplotlib.pyplot as plt +%matplotlib inline + +y_scores = model.predict_proba(X_test) +fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1]) + +fig = plt.figure(figsize=(6, 6)) +plt.plot([0, 1], [0, 1], 'k--') +plt.plot(fpr, tpr) +plt.xlabel('False Positive Rate') +plt.ylabel('True Positive Rate') +plt.title('ROC Curve') +plt.show() +``` + +За допомогою Matplotlib побудуйте [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) або ROC-криву моделі. ROC-криві часто використовуються для оцінки результатів класифікатора з точки зору його істинно позитивних і хибно позитивних результатів. "ROC-криві зазвичай мають істинно позитивну частоту на осі Y і хибно позитивну частоту на осі X." Таким чином, важливі крутизна кривої та простір між середньою лінією і кривою: ви хочете, щоб крива швидко піднімалася вгору і відходила від лінії. У нашому випадку є хибно позитивні результати на початку, а потім лінія піднімається вгору і відходить належним чином: + +![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png) + +Нарешті, скористайтеся [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) з бібліотеки Scikit-learn, щоб обчислити фактичну 'Площу під кривою' (AUC): + +```python +auc = roc_auc_score(y_test,y_scores[:,1]) +print(auc) +``` +Результат становить `0.9749908725812341`. Оскільки AUC варіюється від 0 до 1, вам потрібен високий показник, адже модель, яка на 100% правильно передбачає результати, матиме AUC, що дорівнює 1; у цьому випадку модель _доволі хороша_. + +У майбутніх уроках з класифікації ви дізнаєтеся, як ітеративно покращувати показники вашої моделі. Але наразі вітаємо! Ви завершили ці уроки з регресії! + +--- +## 🚀Виклик + +Логістична регресія має ще багато цікавого! Але найкращий спосіб навчитися — це експериментувати. Знайдіть набір даних, який підходить для такого типу аналізу, і створіть модель на його основі. Що ви дізналися? Порада: спробуйте [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) для пошуку цікавих наборів даних. + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Прочитайте перші кілька сторінок [цієї статті зі Стенфорда](https://web.stanford.edu/~jurafsky/slp3/5.pdf) про деякі практичні застосування логістичної регресії. Подумайте про завдання, які краще підходять для одного чи іншого типу регресії, які ми вивчали до цього моменту. Що працюватиме найкраще? + +## Завдання + +[Повторення цієї регресії](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/4-Logistic/assignment.md b/translations/uk/2-Regression/4-Logistic/assignment.md new file mode 100644 index 00000000..880210b2 --- /dev/null +++ b/translations/uk/2-Regression/4-Logistic/assignment.md @@ -0,0 +1,25 @@ + +# Повторна спроба регресії + +## Інструкції + +У цьому уроці ви використовували підмножину даних про гарбузи. Тепер поверніться до оригінальних даних і спробуйте використати всі дані, очищені та стандартизовані, щоб побудувати модель логістичної регресії. + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | ----------------------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | +| | Представлено ноутбук із добре поясненою та ефективною моделлю | Представлено ноутбук із моделлю, яка працює мінімально | Представлено ноутбук із неефективною моделлю або її відсутність | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/4-Logistic/solution/Julia/README.md b/translations/uk/2-Regression/4-Logistic/solution/Julia/README.md new file mode 100644 index 00000000..b1a8c0f9 --- /dev/null +++ b/translations/uk/2-Regression/4-Logistic/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/2-Regression/README.md b/translations/uk/2-Regression/README.md new file mode 100644 index 00000000..42b5ceb7 --- /dev/null +++ b/translations/uk/2-Regression/README.md @@ -0,0 +1,54 @@ + +# Регресійні моделі для машинного навчання +## Регіональна тема: Регресійні моделі для цін на гарбузи в Північній Америці 🎃 + +У Північній Америці гарбузи часто вирізають у вигляді страшних облич для святкування Гелловіну. Давайте дізнаємося більше про ці захоплюючі овочі! + +![jack-o-lanterns](../../../2-Regression/images/jack-o-lanterns.jpg) +> Фото зроблено Beth Teutschmann на Unsplash + +## Що ви дізнаєтесь + +[![Вступ до регресії](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "Відео про вступ до регресії - Натисніть, щоб переглянути!") +> 🎥 Натисніть на зображення вище, щоб переглянути коротке вступне відео до цього уроку + +Уроки в цьому розділі охоплюють типи регресії в контексті машинного навчання. Регресійні моделі допомагають визначити _взаємозв'язок_ між змінними. Цей тип моделі може прогнозувати значення, такі як довжина, температура або вік, розкриваючи взаємозв'язки між змінними під час аналізу даних. + +У цій серії уроків ви дізнаєтесь про відмінності між лінійною та логістичною регресією, а також коли слід віддати перевагу одній з них. + +[![Машинне навчання для початківців - Вступ до регресійних моделей](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "Машинне навчання для початківців - Вступ до регресійних моделей") + +> 🎥 Натисніть на зображення вище, щоб переглянути коротке відео про регресійні моделі. + +У цій групі уроків ви налаштуєте середовище для виконання завдань машинного навчання, зокрема конфігуруєте Visual Studio Code для роботи з ноутбуками, які є поширеним інструментом для науковців з даних. Ви ознайомитеся з бібліотекою Scikit-learn для машинного навчання та створите свої перші моделі, зосереджуючись на регресійних моделях у цьому розділі. + +> Існують корисні інструменти з низьким рівнем кодування, які допоможуть вам вивчити роботу з регресійними моделями. Спробуйте [Azure ML для цього завдання](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +### Уроки + +1. [Інструменти для роботи](1-Tools/README.md) +2. [Управління даними](2-Data/README.md) +3. [Лінійна та поліноміальна регресія](3-Linear/README.md) +4. [Логістична регресія](4-Logistic/README.md) + +--- +### Подяки + +"Машинне навчання з регресією" написано з ♥️ [Jen Looper](https://twitter.com/jenlooper) + +♥️ У створенні вікторин брали участь: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) та [Ornella Altunyan](https://twitter.com/ornelladotcom) + +Набір даних про гарбузи запропонований [цим проєктом на Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices), а його дані отримані з [Спеціалізованих звітів ринків сільськогосподарських культур](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), які розповсюджуються Міністерством сільського господарства США. Ми додали кілька точок щодо кольору залежно від сорту для нормалізації розподілу. Ці дані є у відкритому доступі. + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/3-Web-App/1-Web-App/README.md b/translations/uk/3-Web-App/1-Web-App/README.md new file mode 100644 index 00000000..3502c86a --- /dev/null +++ b/translations/uk/3-Web-App/1-Web-App/README.md @@ -0,0 +1,359 @@ + +# Створення веб-додатку для використання ML моделі + +У цьому уроці ви навчитеся тренувати ML модель на наборі даних, який просто космічний: _спостереження НЛО за останнє століття_, отримані з бази даних NUFORC. + +Ви дізнаєтеся: + +- Як "запакувати" треновану модель +- Як використовувати цю модель у додатку Flask + +Ми продовжимо використовувати ноутбуки для очищення даних і тренування моделі, але ви можете зробити ще один крок вперед, досліджуючи використання моделі "в реальному світі", так би мовити: у веб-додатку. + +Для цього вам потрібно створити веб-додаток за допомогою Flask. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +## Створення додатку + +Існує кілька способів створення веб-додатків для використання моделей машинного навчання. Ваша веб-архітектура може впливати на спосіб тренування моделі. Уявіть, що ви працюєте в компанії, де група з аналізу даних тренувала модель, яку вони хочуть, щоб ви використали у додатку. + +### Міркування + +Є багато питань, які потрібно поставити: + +- **Це веб-додаток чи мобільний додаток?** Якщо ви створюєте мобільний додаток або вам потрібно використовувати модель у контексті IoT, ви можете скористатися [TensorFlow Lite](https://www.tensorflow.org/lite/) і використовувати модель у додатку для Android або iOS. +- **Де буде розташована модель?** У хмарі чи локально? +- **Підтримка офлайн-режиму.** Чи має додаток працювати офлайн? +- **Яка технологія була використана для тренування моделі?** Обрана технологія може впливати на інструменти, які вам потрібно використовувати. + - **Використання TensorFlow.** Якщо ви тренуєте модель за допомогою TensorFlow, наприклад, ця екосистема дозволяє конвертувати модель TensorFlow для використання у веб-додатку за допомогою [TensorFlow.js](https://www.tensorflow.org/js/). + - **Використання PyTorch.** Якщо ви створюєте модель за допомогою бібліотеки, такої як [PyTorch](https://pytorch.org/), у вас є можливість експортувати її у формат [ONNX](https://onnx.ai/) (Open Neural Network Exchange) для використання у веб-додатках на JavaScript, які можуть використовувати [Onnx Runtime](https://www.onnxruntime.ai/). Цей варіант буде розглянуто в майбутньому уроці для моделі, тренованої за допомогою Scikit-learn. + - **Використання Lobe.ai або Azure Custom Vision.** Якщо ви використовуєте ML SaaS (Software as a Service) систему, таку як [Lobe.ai](https://lobe.ai/) або [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) для тренування моделі, цей тип програмного забезпечення надає способи експорту моделі для багатьох платформ, включаючи створення спеціального API для запитів у хмарі вашим онлайн-додатком. + +У вас також є можливість створити повноцінний веб-додаток Flask, який зможе тренувати модель прямо у веб-браузері. Це також можна зробити за допомогою TensorFlow.js у контексті JavaScript. + +Для наших цілей, оскільки ми працювали з ноутбуками на основі Python, давайте розглянемо кроки, які потрібно виконати, щоб експортувати треновану модель з такого ноутбука у формат, який може бути прочитаний веб-додатком, створеним на Python. + +## Інструменти + +Для цього завдання вам потрібні два інструменти: Flask і Pickle, обидва працюють на Python. + +✅ Що таке [Flask](https://palletsprojects.com/p/flask/)? Визначений як "мікро-фреймворк" його творцями, Flask надає базові функції веб-фреймворків, використовуючи Python і механізм шаблонів для створення веб-сторінок. Ознайомтеся з [цим модулем навчання](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott), щоб попрактикуватися у створенні додатків за допомогою Flask. + +✅ Що таке [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 — це модуль Python, який серіалізує та десеріалізує структуру об'єктів Python. Коли ви "запаковуєте" модель, ви серіалізуєте або спрощуєте її структуру для використання у вебі. Будьте обережні: Pickle не є внутрішньо безпечним, тому будьте уважні, якщо вам запропонують "розпакувати" файл. Файл Pickle має суфікс `.pkl`. + +## Вправа - очищення даних + +У цьому уроці ви будете використовувати дані про 80,000 спостережень НЛО, зібрані [NUFORC](https://nuforc.org) (Національний центр повідомлень про НЛО). Ці дані містять цікаві описи спостережень НЛО, наприклад: + +- **Довгий приклад опису.** "Чоловік виходить з променя світла, який освітлює трав'яне поле вночі, і біжить до парковки Texas Instruments". +- **Короткий приклад опису.** "вогні переслідували нас". + +Електронна таблиця [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) містить стовпці про `місто`, `штат` і `країну`, де відбулося спостереження, `форму` об'єкта, а також його `широту` і `довготу`. + +У порожньому [ноутбуці](../../../../3-Web-App/1-Web-App/notebook.ipynb), включеному в цей урок: + +1. імпортуйте `pandas`, `matplotlib` і `numpy`, як ви робили в попередніх уроках, і імпортуйте електронну таблицю ufos. Ви можете переглянути зразок набору даних: + + ```python + import pandas as pd + import numpy as np + + ufos = pd.read_csv('./data/ufos.csv') + ufos.head() + ``` + +1. Перетворіть дані ufos у невеликий датафрейм із новими заголовками. Перевірте унікальні значення в полі `Country`. + + ```python + ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) + + ufos.Country.unique() + ``` + +1. Тепер ви можете зменшити кількість даних, з якими потрібно працювати, видаливши будь-які значення null і імпортувавши лише спостереження тривалістю від 1 до 60 секунд: + + ```python + ufos.dropna(inplace=True) + + ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] + + ufos.info() + ``` + +1. Імпортуйте бібліотеку `LabelEncoder` з Scikit-learn для перетворення текстових значень країн у числа: + + ✅ LabelEncoder кодує дані в алфавітному порядку + + ```python + from sklearn.preprocessing import LabelEncoder + + ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) + + ufos.head() + ``` + + Ваші дані повинні виглядати так: + + ```output + Seconds Country Latitude Longitude + 2 20.0 3 53.200000 -2.916667 + 3 20.0 4 28.978333 -96.645833 + 14 30.0 4 35.823889 -80.253611 + 23 60.0 4 45.582778 -122.352222 + 24 3.0 3 51.783333 -0.783333 + ``` + +## Вправа - створення моделі + +Тепер ви можете підготуватися до тренування моделі, розділивши дані на групи для тренування та тестування. + +1. Виберіть три характеристики, на яких ви хочете тренуватися, як ваш X-вектор, а y-вектор буде `Country`. Ви хочете мати можливість вводити `Seconds`, `Latitude` і `Longitude` і отримувати ідентифікатор країни для повернення. + + ```python + from sklearn.model_selection import train_test_split + + Selected_features = ['Seconds','Latitude','Longitude'] + + X = ufos[Selected_features] + y = ufos['Country'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + ``` + +1. Тренуйте вашу модель, використовуючи логістичну регресію: + + ```python + from sklearn.metrics import accuracy_score, classification_report + from sklearn.linear_model import LogisticRegression + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('Accuracy: ', accuracy_score(y_test, predictions)) + ``` + +Точність непогана **(близько 95%)**, що не дивно, оскільки `Country` і `Latitude/Longitude` корелюють. + +Модель, яку ви створили, не дуже революційна, оскільки ви повинні бути здатні визначити `Country` за її `Latitude` і `Longitude`, але це гарна вправа для тренування на сирих даних, які ви очистили, експортували, а потім використали цю модель у веб-додатку. + +## Вправа - "запакування" моделі + +Тепер настав час _запакувати_ вашу модель! Ви можете зробити це за кілька рядків коду. Після того, як модель буде _запакована_, завантажте її і протестуйте на зразковому масиві даних, що містить значення для секунд, широти і довготи. + +```python +import pickle +model_filename = 'ufo-model.pkl' +pickle.dump(model, open(model_filename,'wb')) + +model = pickle.load(open('ufo-model.pkl','rb')) +print(model.predict([[50,44,-12]])) +``` + +Модель повертає **'3'**, що є кодом країни для Великобританії. Дивовижно! 👽 + +## Вправа - створення додатку Flask + +Тепер ви можете створити додаток Flask, щоб викликати вашу модель і повертати схожі результати, але у більш візуально приємний спосіб. + +1. Почніть зі створення папки **web-app** поруч із файлом _notebook.ipynb_, де знаходиться ваш файл _ufo-model.pkl_. + +1. У цій папці створіть ще три папки: **static**, з папкою **css** всередині, і **templates**. Тепер у вас повинні бути наступні файли та каталоги: + + ```output + web-app/ + static/ + css/ + templates/ + notebook.ipynb + ufo-model.pkl + ``` + + ✅ Зверніться до папки рішення, щоб побачити готовий додаток + +1. Перший файл, який потрібно створити в папці _web-app_, це файл **requirements.txt**. Як _package.json_ у додатку на JavaScript, цей файл містить залежності, необхідні для додатку. У **requirements.txt** додайте рядки: + + ```text + scikit-learn + pandas + numpy + flask + ``` + +1. Тепер запустіть цей файл, перейшовши до _web-app_: + + ```bash + cd web-app + ``` + +1. У вашому терміналі введіть `pip install`, щоб встановити бібліотеки, зазначені в _requirements.txt_: + + ```bash + pip install -r requirements.txt + ``` + +1. Тепер ви готові створити ще три файли, щоб завершити додаток: + + 1. Створіть **app.py** у кореневій папці. + 2. Створіть **index.html** у папці _templates_. + 3. Створіть **styles.css** у папці _static/css_. + +1. Заповніть файл _styles.css_ кількома стилями: + + ```css + body { + width: 100%; + height: 100%; + font-family: 'Helvetica'; + background: black; + color: #fff; + text-align: center; + letter-spacing: 1.4px; + font-size: 30px; + } + + input { + min-width: 150px; + } + + .grid { + width: 300px; + border: 1px solid #2d2d2d; + display: grid; + justify-content: center; + margin: 20px auto; + } + + .box { + color: #fff; + background: #2d2d2d; + padding: 12px; + display: inline-block; + } + ``` + +1. Далі, заповніть файл _index.html_: + + ```html + + + + + 🛸 UFO Appearance Prediction! 👽 + + + + +
                                          + +
                                          + +

                                          According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?

                                          + +
                                          + + + + +
                                          + +

                                          {{ prediction_text }}

                                          + +
                                          + +
                                          + + + + ``` + + Зверніть увагу на шаблонізацію в цьому файлі. Зверніть увагу на синтаксис "вусів" навколо змінних, які будуть надані додатком, наприклад текст прогнозу: `{{}}`. Тут також є форма, яка надсилає прогноз на маршрут `/predict`. + + Нарешті, ви готові створити файл Python, який керує використанням моделі та відображенням прогнозів: + +1. У `app.py` додайте: + + ```python + import numpy as np + from flask import Flask, request, render_template + import pickle + + app = Flask(__name__) + + model = pickle.load(open("./ufo-model.pkl", "rb")) + + + @app.route("/") + def home(): + return render_template("index.html") + + + @app.route("/predict", methods=["POST"]) + def predict(): + + int_features = [int(x) for x in request.form.values()] + final_features = [np.array(int_features)] + prediction = model.predict(final_features) + + output = prediction[0] + + countries = ["Australia", "Canada", "Germany", "UK", "US"] + + return render_template( + "index.html", prediction_text="Likely country: {}".format(countries[output]) + ) + + + if __name__ == "__main__": + app.run(debug=True) + ``` + + > 💡 Порада: коли ви додаєте [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) під час запуску веб-додатку за допомогою Flask, будь-які зміни, які ви вносите у ваш додаток, будуть відображатися негайно без необхідності перезапуску сервера. Будьте обережні! Не вмикайте цей режим у продуктивному додатку. + +Якщо ви запустите `python app.py` або `python3 app.py`, ваш веб-сервер запуститься локально, і ви зможете заповнити коротку форму, щоб отримати відповідь на ваше запитання про те, де були помічені НЛО! + +Перед тим, як це зробити, погляньте на частини `app.py`: + +1. Спочатку завантажуються залежності і запускається додаток. +1. Потім імпортується модель. +1. Потім на домашньому маршруті відображається index.html. + +На маршруті `/predict` відбувається кілька речей, коли форма надсилається: + +1. Змінні форми збираються і перетворюються у масив numpy. Потім вони надсилаються до моделі, і повертається прогноз. +2. Країни, які ми хочемо відобразити, перетворюються у читабельний текст із їхнього передбаченого коду країни, і це значення повертається до index.html для відображення у шаблоні. + +Використовувати модель таким чином, за допомогою Flask і запакованої моделі, досить просто. Найскладніше — зрозуміти, яку форму дані повинні мати, щоб їх можна було надіслати до моделі для отримання прогнозу. Це залежить від того, як модель була тренована. У цьому випадку потрібно ввести три точки даних, щоб отримати прогноз. + +У професійному середовищі ви можете побачити, наскільки важливим є гарна комунікація між людьми, які тренують модель, і тими, хто використовує її у веб- або мобільному додатку. У нашому випадку це лише одна людина — ви! + +--- + +## 🚀 Виклик + +Замість того, щоб працювати у ноутбуці та імпортувати модель у додаток Flask, ви могли б тренувати модель прямо у додатку Flask! Спробуйте перетворити ваш код Python у ноутбуці, можливо, після очищення даних, щоб тренувати модель прямо у додатку на маршруті `train`. Які плюси і мінуси цього методу? + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Існує багато способів створення веб-додатку для використання ML моделей. Складіть список способів, якими ви могли б використовувати JavaScript або Python для створення веб-додатку, що використовує машинне навчання. Розгляньте архітектуру: чи повинна модель залишатися у додатку або жити у хмарі? Якщо останнє, як ви б її отримували? Намалюйте архітектурну модель для прикладного ML веб-рішення. + +## Завдання + +[Спробуйте іншу модель](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/3-Web-App/1-Web-App/assignment.md b/translations/uk/3-Web-App/1-Web-App/assignment.md new file mode 100644 index 00000000..a1f4c2cd --- /dev/null +++ b/translations/uk/3-Web-App/1-Web-App/assignment.md @@ -0,0 +1,25 @@ + +# Спробуйте іншу модель + +## Інструкції + +Тепер, коли ви створили один веб-додаток, використовуючи навчений модель регресії, скористайтеся однією з моделей з попереднього уроку з регресії, щоб переробити цей веб-додаток. Ви можете залишити стиль або оформити його по-іншому, щоб відобразити дані про гарбузи. Будьте уважні, змінюючи вхідні дані, щоб вони відповідали методу навчання вашої моделі. + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| ------------------------- | ------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------ | +| | Веб-додаток працює як очікується і розгорнутий у хмарі | Веб-додаток має недоліки або демонструє неочікувані результати | Веб-додаток не працює належним чином | + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/3-Web-App/README.md b/translations/uk/3-Web-App/README.md new file mode 100644 index 00000000..30feb3ff --- /dev/null +++ b/translations/uk/3-Web-App/README.md @@ -0,0 +1,35 @@ + +# Створення веб-додатку для використання вашої ML-моделі + +У цьому розділі навчальної програми ви познайомитеся з прикладною темою машинного навчання: як зберегти вашу модель Scikit-learn у файл, який можна використовувати для прогнозування у веб-додатку. Після того, як модель буде збережена, ви дізнаєтеся, як використовувати її у веб-додатку, створеному на Flask. Спочатку ви створите модель, використовуючи дані про спостереження НЛО! Потім ви створите веб-додаток, який дозволить вводити кількість секунд разом із значеннями широти та довготи, щоб передбачити, яка країна повідомила про спостереження НЛО. + +![Паркування НЛО](../../../3-Web-App/images/ufo.jpg) + +Фото Майкла Херрена на Unsplash + +## Уроки + +1. [Створення веб-додатку](1-Web-App/README.md) + +## Авторство + +"Створення веб-додатку" написано з ♥️ [Джен Лупер](https://twitter.com/jenlooper). + +♥️ Тести були написані Роханом Раджем. + +Дані взяті з [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings). + +Архітектура веб-додатку частково запропонована у [цій статті](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) та [цьому репозиторії](https://github.com/abhinavsagar/machine-learning-deployment) Абхінава Сагара. + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, звертаємо вашу увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується звертатися до професійного людського перекладу. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/1-Introduction/README.md b/translations/uk/4-Classification/1-Introduction/README.md new file mode 100644 index 00000000..af8bdd09 --- /dev/null +++ b/translations/uk/4-Classification/1-Introduction/README.md @@ -0,0 +1,313 @@ + +# Вступ до класифікації + +У цих чотирьох уроках ви дослідите основний аспект класичного машинного навчання — _класифікацію_. Ми розглянемо використання різних алгоритмів класифікації на основі набору даних про всі чудові кухні Азії та Індії. Сподіваємося, ви голодні! + +![щіпка смаку!](../../../../4-Classification/1-Introduction/images/pinch.png) + +> Святкуйте паназійські кухні в цих уроках! Зображення від [Jen Looper](https://twitter.com/jenlooper) + +Класифікація — це форма [навчання з учителем](https://wikipedia.org/wiki/Supervised_learning), яка має багато спільного з техніками регресії. Якщо машинне навчання полягає у прогнозуванні значень або назв для речей за допомогою наборів даних, то класифікація зазвичай поділяється на дві групи: _бінарна класифікація_ та _багатокласова класифікація_. + +[![Вступ до класифікації](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Вступ до класифікації") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео: Джон Гуттаг з MIT представляє класифікацію + +Запам’ятайте: + +- **Лінійна регресія** допомогла вам передбачити взаємозв’язки між змінними та зробити точні прогнози щодо того, де нова точка даних потрапить у відношенні до цієї лінії. Наприклад, ви могли б передбачити _яка ціна гарбуза буде у вересні проти грудня_. +- **Логістична регресія** допомогла вам виявити "бінарні категорії": за цією ціною _чи цей гарбуз помаранчевий чи не помаранчевий_? + +Класифікація використовує різні алгоритми для визначення інших способів визначення мітки або класу точки даних. Давайте попрацюємо з цими даними про кухні, щоб побачити, чи можемо ми, спостерігаючи за групою інгредієнтів, визначити її кухню походження. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Цей урок доступний у R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html) + +### Вступ + +Класифікація є однією з основних діяльностей дослідника машинного навчання та дата-сайєнтиста. Від базової класифікації бінарного значення ("чи цей електронний лист є спамом чи ні?") до складної класифікації зображень і сегментації за допомогою комп’ютерного зору — завжди корисно мати можливість сортувати дані за класами та ставити їм запитання. + +Якщо висловити процес більш науково, ваш метод класифікації створює прогностичну модель, яка дозволяє вам зіставити взаємозв’язок між вхідними змінними та вихідними змінними. + +![бінарна vs. багатокласова класифікація](../../../../4-Classification/1-Introduction/images/binary-multiclass.png) + +> Бінарні та багатокласові задачі для алгоритмів класифікації. Інфографіка від [Jen Looper](https://twitter.com/jenlooper) + +Перш ніж розпочати процес очищення наших даних, їх візуалізації та підготовки до завдань машинного навчання, давайте трохи дізнаємося про різні способи використання машинного навчання для класифікації даних. + +Походячи з [статистики](https://wikipedia.org/wiki/Statistical_classification), класифікація за допомогою класичного машинного навчання використовує ознаки, такі як `smoker`, `weight` і `age`, щоб визначити _ймовірність розвитку X хвороби_. Як техніка навчання з учителем, схожа на вправи з регресії, які ви виконували раніше, ваші дані мають мітки, і алгоритми машинного навчання використовують ці мітки для класифікації та прогнозування класів (або "ознак") набору даних і призначення їх групі або результату. + +✅ Уявіть собі набір даних про кухні. На які запитання міг би відповісти багатокласовий модель? А бінарний? Що, якщо ви хотіли б визначити, чи ймовірно, що певна кухня використовує пажитник? А якщо ви хотіли б побачити, чи зможете ви, маючи в подарунок пакет із продуктами, що містить зірчастий аніс, артишоки, цвітну капусту та хрін, створити типову індійську страву? + +[![Дивні кошики з інгредієнтами](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Дивні кошики з інгредієнтами") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео. Вся концепція шоу 'Chopped' полягає у "таємничому кошику", де шеф-кухарі повинні приготувати страву з випадкового набору інгредієнтів. Напевно, модель машинного навчання могла б допомогти! + +## Привіт, "класифікатор" + +Запитання, яке ми хочемо поставити до цього набору даних про кухні, насправді є **багатокласовим запитанням**, оскільки у нас є кілька потенційних національних кухонь для роботи. Враховуючи набір інгредієнтів, до якого з цих багатьох класів належатимуть дані? + +Scikit-learn пропонує кілька різних алгоритмів для класифікації даних залежно від типу задачі, яку ви хочете вирішити. У наступних двох уроках ви дізнаєтеся про кілька з цих алгоритмів. + +## Вправа - очистіть і збалансуйте свої дані + +Перше завдання, яке потрібно виконати перед початком цього проекту, — це очистити та **збалансувати** ваші дані, щоб отримати кращі результати. Почніть із порожнього файлу _notebook.ipynb_ у кореневій папці. + +Перше, що потрібно встановити, це [imblearn](https://imbalanced-learn.org/stable/). Це пакет Scikit-learn, який дозволить вам краще збалансувати дані (ви дізнаєтеся більше про це завдання за хвилину). + +1. Щоб встановити `imblearn`, запустіть `pip install`, як показано нижче: + + ```python + pip install imblearn + ``` + +1. Імпортуйте пакети, які вам потрібні для імпорту даних і їх візуалізації, також імпортуйте `SMOTE` з `imblearn`. + + ```python + import pandas as pd + import matplotlib.pyplot as plt + import matplotlib as mpl + import numpy as np + from imblearn.over_sampling import SMOTE + ``` + + Тепер ви готові імпортувати дані. + +1. Наступним завданням буде імпортувати дані: + + ```python + df = pd.read_csv('../data/cuisines.csv') + ``` + + Використання `read_csv()` зчитує вміст csv-файлу _cusines.csv_ і розміщує його у змінній `df`. + +1. Перевірте форму даних: + + ```python + df.head() + ``` + + Перші п’ять рядків виглядають так: + + ```output + | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | + | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | + | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + ``` + +1. Отримайте інформацію про ці дані, викликавши `info()`: + + ```python + df.info() + ``` + + Ваш результат виглядає так: + + ```output + + RangeIndex: 2448 entries, 0 to 2447 + Columns: 385 entries, Unnamed: 0 to zucchini + dtypes: int64(384), object(1) + memory usage: 7.2+ MB + ``` + +## Вправа - вивчення кухонь + +Тепер робота стає цікавішою. Давайте дізнаємося розподіл даних за кухнями. + +1. Побудуйте дані у вигляді стовпців, викликавши `barh()`: + + ```python + df.cuisine.value_counts().plot.barh() + ``` + + ![розподіл даних про кухні](../../../../4-Classification/1-Introduction/images/cuisine-dist.png) + + Існує обмежена кількість кухонь, але розподіл даних нерівномірний. Ви можете це виправити! Перш ніж це зробити, досліджуйте трохи більше. + +1. Дізнайтеся, скільки даних доступно для кожної кухні, і виведіть їх: + + ```python + thai_df = df[(df.cuisine == "thai")] + japanese_df = df[(df.cuisine == "japanese")] + chinese_df = df[(df.cuisine == "chinese")] + indian_df = df[(df.cuisine == "indian")] + korean_df = df[(df.cuisine == "korean")] + + print(f'thai df: {thai_df.shape}') + print(f'japanese df: {japanese_df.shape}') + print(f'chinese df: {chinese_df.shape}') + print(f'indian df: {indian_df.shape}') + print(f'korean df: {korean_df.shape}') + ``` + + результат виглядає так: + + ```output + thai df: (289, 385) + japanese df: (320, 385) + chinese df: (442, 385) + indian df: (598, 385) + korean df: (799, 385) + ``` + +## Вивчення інгредієнтів + +Тепер ви можете глибше зануритися в дані та дізнатися, які типові інгредієнти для кожної кухні. Ви повинні очистити повторювані дані, які створюють плутанину між кухнями, тому давайте дізнаємося про цю проблему. + +1. Створіть функцію `create_ingredient()` у Python, щоб створити датафрейм інгредієнтів. Ця функція почне з видалення непотрібного стовпця та сортування інгредієнтів за їх кількістю: + + ```python + def create_ingredient_df(df): + ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') + ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] + ingredient_df = ingredient_df.sort_values(by='value', ascending=False, + inplace=False) + return ingredient_df + ``` + + Тепер ви можете використовувати цю функцію, щоб отримати уявлення про десять найпопулярніших інгредієнтів для кожної кухні. + +1. Викличте `create_ingredient()` і побудуйте графік, викликавши `barh()`: + + ```python + thai_ingredient_df = create_ingredient_df(thai_df) + thai_ingredient_df.head(10).plot.barh() + ``` + + ![тайська кухня](../../../../4-Classification/1-Introduction/images/thai.png) + +1. Зробіть те ж саме для японських даних: + + ```python + japanese_ingredient_df = create_ingredient_df(japanese_df) + japanese_ingredient_df.head(10).plot.barh() + ``` + + ![японська кухня](../../../../4-Classification/1-Introduction/images/japanese.png) + +1. Тепер для китайських інгредієнтів: + + ```python + chinese_ingredient_df = create_ingredient_df(chinese_df) + chinese_ingredient_df.head(10).plot.barh() + ``` + + ![китайська кухня](../../../../4-Classification/1-Introduction/images/chinese.png) + +1. Побудуйте графік індійських інгредієнтів: + + ```python + indian_ingredient_df = create_ingredient_df(indian_df) + indian_ingredient_df.head(10).plot.barh() + ``` + + ![індійська кухня](../../../../4-Classification/1-Introduction/images/indian.png) + +1. Нарешті, побудуйте графік корейських інгредієнтів: + + ```python + korean_ingredient_df = create_ingredient_df(korean_df) + korean_ingredient_df.head(10).plot.barh() + ``` + + ![корейська кухня](../../../../4-Classification/1-Introduction/images/korean.png) + +1. Тепер видаліть найпоширеніші інгредієнти, які створюють плутанину між різними кухнями, викликавши `drop()`: + + Усі люблять рис, часник і імбир! + + ```python + feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) + labels_df = df.cuisine #.unique() + feature_df.head() + ``` + +## Збалансуйте набір даних + +Тепер, коли ви очистили дані, використовуйте [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) — "Synthetic Minority Over-sampling Technique" — для їх балансування. + +1. Викличте `fit_resample()`, ця стратегія генерує нові зразки шляхом інтерполяції. + + ```python + oversample = SMOTE() + transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df) + ``` + + Балансуючи дані, ви отримаєте кращі результати під час їх класифікації. Подумайте про бінарну класифікацію. Якщо більшість ваших даних належить до одного класу, модель машинного навчання буде частіше прогнозувати цей клас просто тому, що для нього більше даних. Балансування даних усуває цей дисбаланс. + +1. Тепер ви можете перевірити кількість міток на інгредієнт: + + ```python + print(f'new label count: {transformed_label_df.value_counts()}') + print(f'old label count: {df.cuisine.value_counts()}') + ``` + + Ваш результат виглядає так: + + ```output + new label count: korean 799 + chinese 799 + indian 799 + japanese 799 + thai 799 + Name: cuisine, dtype: int64 + old label count: korean 799 + indian 598 + chinese 442 + japanese 320 + thai 289 + Name: cuisine, dtype: int64 + ``` + + Дані чисті, збалансовані та дуже апетитні! + +1. Останній крок — зберегти збалансовані дані, включаючи мітки та ознаки, у новий датафрейм, який можна експортувати у файл: + + ```python + transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer') + ``` + +1. Ви можете ще раз переглянути дані, використовуючи `transformed_df.head()` і `transformed_df.info()`. Збережіть копію цих даних для використання в майбутніх уроках: + + ```python + transformed_df.head() + transformed_df.info() + transformed_df.to_csv("../data/cleaned_cuisines.csv") + ``` + + Цей новий CSV тепер можна знайти в кореневій папці даних. + +--- + +## 🚀Завдання + +Ця навчальна програма містить кілька цікавих наборів даних. Перегляньте папки `data` і подивіться, чи містять вони набори даних, які підходять для бінарної або багатокласової класифікації? Які запитання ви б поставили до цього набору даних? + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Досліджуйте API SMOTE. Для яких випадків використання він найкраще підходить? Які проблеми він вирішує? + +## Завдання + +[Досліджуйте методи класифікації](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/1-Introduction/assignment.md b/translations/uk/4-Classification/1-Introduction/assignment.md new file mode 100644 index 00000000..f47cb51e --- /dev/null +++ b/translations/uk/4-Classification/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Дослідження методів класифікації + +## Інструкції + +У [документації Scikit-learn](https://scikit-learn.org/stable/supervised_learning.html) ви знайдете великий список способів класифікації даних. Проведіть невелике дослідження в цих документах: ваша мета — знайти методи класифікації та підібрати набір даних із цього курсу, питання, яке можна поставити до нього, і техніку класифікації. Створіть електронну таблицю або таблицю у файлі .doc і поясніть, як набір даних буде працювати з алгоритмом класифікації. + +## Критерії оцінювання + +| Критерії | Відмінно | Достатньо | Потребує покращення | +| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| | представлено документ, який містить огляд 5 алгоритмів разом із технікою класифікації. Огляд добре пояснений і детальний. | представлено документ, який містить огляд 3 алгоритмів разом із технікою класифікації. Огляд добре пояснений і детальний. | представлено документ, який містить огляд менше трьох алгоритмів разом із технікою класифікації, і огляд не є добре поясненим або детальним. | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/1-Introduction/solution/Julia/README.md b/translations/uk/4-Classification/1-Introduction/solution/Julia/README.md new file mode 100644 index 00000000..d8e6a27c --- /dev/null +++ b/translations/uk/4-Classification/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/2-Classifiers-1/README.md b/translations/uk/4-Classification/2-Classifiers-1/README.md new file mode 100644 index 00000000..32ff3b77 --- /dev/null +++ b/translations/uk/4-Classification/2-Classifiers-1/README.md @@ -0,0 +1,253 @@ + +# Класифікатори кухонь 1 + +У цьому уроці ви будете використовувати набір даних, який ви зберегли з попереднього уроку, наповнений збалансованими та очищеними даними про кухні. + +Ви будете використовувати цей набір даних із різними класифікаторами, щоб _передбачити національну кухню на основі групи інгредієнтів_. Під час цього ви дізнаєтеся більше про способи використання алгоритмів для задач класифікації. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) +# Підготовка + +Якщо ви завершили [Урок 1](../1-Introduction/README.md), переконайтеся, що файл _cleaned_cuisines.csv_ знаходиться в кореневій папці `/data` для цих чотирьох уроків. + +## Вправа - передбачення національної кухні + +1. Працюючи в папці _notebook.ipynb_ цього уроку, імпортуйте цей файл разом із бібліотекою Pandas: + + ```python + import pandas as pd + cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") + cuisines_df.head() + ``` + + Дані виглядають так: + +| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | +| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + + +1. Тепер імпортуйте ще кілька бібліотек: + + ```python + from sklearn.linear_model import LogisticRegression + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + from sklearn.svm import SVC + import numpy as np + ``` + +1. Розділіть координати X та y на два датафрейми для тренування. `cuisine` може бути датафреймом міток: + + ```python + cuisines_label_df = cuisines_df['cuisine'] + cuisines_label_df.head() + ``` + + Це виглядатиме так: + + ```output + 0 indian + 1 indian + 2 indian + 3 indian + 4 indian + Name: cuisine, dtype: object + ``` + +1. Видаліть стовпці `Unnamed: 0` та `cuisine`, використовуючи `drop()`. Збережіть решту даних як тренувальні ознаки: + + ```python + cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) + cuisines_feature_df.head() + ``` + + Ваші ознаки виглядають так: + +| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | + +Тепер ви готові тренувати вашу модель! + +## Вибір класифікатора + +Тепер, коли ваші дані очищені та готові до тренування, вам потрібно вирішити, який алгоритм використовувати для задачі. + +Scikit-learn групує класифікацію під Навчання з учителем, і в цій категорії ви знайдете багато способів класифікації. [Різноманіття](https://scikit-learn.org/stable/supervised_learning.html) може здатися приголомшливим на перший погляд. Наступні методи включають техніки класифікації: + +- Лінійні моделі +- Машини опорних векторів +- Стохастичний градієнтний спуск +- Найближчі сусіди +- Гауссові процеси +- Дерева рішень +- Ансамблеві методи (голосуючий класифікатор) +- Алгоритми для багатокласових і багатовихідних задач (багатокласова і багатоміткова класифікація, багатокласова-багатовихідна класифікація) + +> Ви також можете використовувати [нейронні мережі для класифікації даних](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification), але це виходить за рамки цього уроку. + +### Який класифікатор обрати? + +Отже, який класифікатор слід обрати? Часто тестування кількох класифікаторів і пошук найкращого результату є способом перевірки. Scikit-learn пропонує [порівняння](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) на створеному наборі даних, порівнюючи KNeighbors, SVC двома способами, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB і QuadraticDiscriminationAnalysis, показуючи результати візуалізованими: + +![порівняння класифікаторів](../../../../4-Classification/2-Classifiers-1/images/comparison.png) +> Графіки, створені на документації Scikit-learn + +> AutoML вирішує цю проблему, виконуючи ці порівняння в хмарі, дозволяючи вам обрати найкращий алгоритм для ваших даних. Спробуйте [тут](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott) + +### Кращий підхід + +Кращий спосіб, ніж просто здогадуватися, — це слідувати ідеям із цього завантажуваного [ML Cheat sheet](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott). Тут ми дізнаємося, що для нашої багатокласової задачі у нас є кілька варіантів: + +![шпаргалка для багатокласових задач](../../../../4-Classification/2-Classifiers-1/images/cheatsheet.png) +> Частина шпаргалки Microsoft Algorithm Cheat Sheet, що описує варіанти багатокласової класифікації + +✅ Завантажте цю шпаргалку, роздрукуйте її та повісьте на стіну! + +### Міркування + +Давайте спробуємо розібратися в різних підходах, враховуючи наші обмеження: + +- **Нейронні мережі занадто важкі**. З огляду на наш очищений, але мінімальний набір даних, і той факт, що ми запускаємо тренування локально через ноутбуки, нейронні мережі занадто важкі для цього завдання. +- **Не використовуємо класифікатор для двох класів**. Ми не використовуємо класифікатор для двох класів, тому це виключає one-vs-all. +- **Дерева рішень або логістична регресія можуть підійти**. Дерева рішень можуть підійти, або логістична регресія для багатокласових даних. +- **Багатокласові Boosted Decision Trees вирішують іншу задачу**. Багатокласове Boosted Decision Tree найбільш підходить для непараметричних задач, наприклад, задач, спрямованих на створення рейтингів, тому це нам не підходить. + +### Використання Scikit-learn + +Ми будемо використовувати Scikit-learn для аналізу наших даних. Однак існує багато способів використання логістичної регресії в Scikit-learn. Ознайомтеся з [параметрами для передачі](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +Фактично, є два важливі параметри - `multi_class` і `solver` - які нам потрібно вказати, коли ми просимо Scikit-learn виконати логістичну регресію. Значення `multi_class` визначає певну поведінку. Значення solver визначає, який алгоритм використовувати. Не всі solvers можна поєднувати з усіма значеннями `multi_class`. + +Згідно з документацією, у випадку багатокласової задачі, алгоритм навчання: + +- **Використовує схему one-vs-rest (OvR)**, якщо параметр `multi_class` встановлено як `ovr` +- **Використовує функцію втрат крос-ентропії**, якщо параметр `multi_class` встановлено як `multinomial`. (На даний момент опція `multinomial` підтримується лише solvers: ‘lbfgs’, ‘sag’, ‘saga’ і ‘newton-cg’.) + +> 🎓 "Схема" тут може бути або 'ovr' (one-vs-rest), або 'multinomial'. Оскільки логістична регресія насправді призначена для підтримки бінарної класифікації, ці схеми дозволяють їй краще справлятися з багатокласовими задачами класифікації. [джерело](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/) + +> 🎓 "Solver" визначається як "алгоритм, який використовується для вирішення задачі оптимізації". [джерело](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +Scikit-learn пропонує цю таблицю, щоб пояснити, як solvers справляються з різними викликами, представленими різними типами структур даних: + +![solvers](../../../../4-Classification/2-Classifiers-1/images/solvers.png) + +## Вправа - розділіть дані + +Ми можемо зосередитися на логістичній регресії для нашого першого тренувального випробування, оскільки ви нещодавно вивчали її на попередньому уроці. +Розділіть ваші дані на тренувальні та тестові групи, викликавши `train_test_split()`: + +```python +X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) +``` + +## Вправа - застосуйте логістичну регресію + +Оскільки ви використовуєте багатокласовий випадок, вам потрібно вибрати, яку _схему_ використовувати і який _solver_ встановити. Використовуйте LogisticRegression із багатокласовим налаштуванням і **liblinear** solver для тренування. + +1. Створіть логістичну регресію з multi_class, встановленим як `ovr`, і solver, встановленим як `liblinear`: + + ```python + lr = LogisticRegression(multi_class='ovr',solver='liblinear') + model = lr.fit(X_train, np.ravel(y_train)) + + accuracy = model.score(X_test, y_test) + print ("Accuracy is {}".format(accuracy)) + ``` + + ✅ Спробуйте інший solver, наприклад `lbfgs`, який часто встановлюється за замовчуванням. +> Зверніть увагу, використовуйте функцію Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) для згладжування ваших даних, коли це необхідно. +Точність становить понад **80%**! + +1. Ви можете побачити, як ця модель працює, протестувавши один рядок даних (#50): + + ```python + print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') + print(f'cuisine: {y_test.iloc[50]}') + ``` + + Результат виводиться: + + ```output + ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') + cuisine: indian + ``` + + ✅ Спробуйте інший номер рядка та перевірте результати. + +1. Заглиблюючись, ви можете перевірити точність цього прогнозу: + + ```python + test= X_test.iloc[50].values.reshape(-1, 1).T + proba = model.predict_proba(test) + classes = model.classes_ + resultdf = pd.DataFrame(data=proba, columns=classes) + + topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) + topPrediction.head() + ``` + + Результат виводиться - індійська кухня є найкращим припущенням моделі з високою ймовірністю: + + | | 0 | + | -------: | -------: | + | indian | 0.715851 | + | chinese | 0.229475 | + | japanese | 0.029763 | + | korean | 0.017277 | + | thai | 0.007634 | + + ✅ Чи можете ви пояснити, чому модель досить впевнена, що це індійська кухня? + +1. Отримайте більше деталей, вивівши звіт про класифікацію, як ви робили в уроках регресії: + + ```python + y_pred = model.predict(X_test) + print(classification_report(y_test,y_pred)) + ``` + + | | precision | recall | f1-score | support | + | ------------ | --------- | ------ | -------- | ------- | + | chinese | 0.73 | 0.71 | 0.72 | 229 | + | indian | 0.91 | 0.93 | 0.92 | 254 | + | japanese | 0.70 | 0.75 | 0.72 | 220 | + | korean | 0.86 | 0.76 | 0.81 | 242 | + | thai | 0.79 | 0.85 | 0.82 | 254 | + | accuracy | 0.80 | 1199 | | | + | macro avg | 0.80 | 0.80 | 0.80 | 1199 | + | weighted avg | 0.80 | 0.80 | 0.80 | 1199 | + +## 🚀Виклик + +У цьому уроці ви використали очищені дані для створення моделі машинного навчання, яка може передбачати національну кухню на основі серії інгредієнтів. Приділіть час, щоб ознайомитися з багатьма варіантами, які Scikit-learn пропонує для класифікації даних. Заглибтеся в концепцію 'solver', щоб зрозуміти, що відбувається за лаштунками. + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Заглибтеся трохи більше в математику логістичної регресії в [цьому уроці](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf) +## Завдання + +[Вивчіть solvers](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/2-Classifiers-1/assignment.md b/translations/uk/4-Classification/2-Classifiers-1/assignment.md new file mode 100644 index 00000000..232cd7c8 --- /dev/null +++ b/translations/uk/4-Classification/2-Classifiers-1/assignment.md @@ -0,0 +1,23 @@ + +# Вивчіть вирішувачі +## Інструкції + +У цьому уроці ви дізналися про різні вирішувачі, які поєднують алгоритми з процесом машинного навчання для створення точної моделі. Ознайомтеся з вирішувачами, переліченими в уроці, і виберіть два. Своїми словами порівняйте та протиставте ці два вирішувачі. Які проблеми вони вирішують? Як вони працюють з різними структурами даних? Чому ви б обрали один замість іншого? +## Критерії оцінювання + +| Критерій | Відмінно | Достатньо | Потребує покращення | +| -------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------- | ---------------------------- | +| | Представлено .doc файл із двома абзацами, кожен про один вирішувач, з продуманим порівнянням. | Представлено .doc файл лише з одним абзацом | Завдання не завершено | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/2-Classifiers-1/solution/Julia/README.md b/translations/uk/4-Classification/2-Classifiers-1/solution/Julia/README.md new file mode 100644 index 00000000..64fe90fd --- /dev/null +++ b/translations/uk/4-Classification/2-Classifiers-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/3-Classifiers-2/README.md b/translations/uk/4-Classification/3-Classifiers-2/README.md new file mode 100644 index 00000000..8d00ef13 --- /dev/null +++ b/translations/uk/4-Classification/3-Classifiers-2/README.md @@ -0,0 +1,249 @@ + +# Класифікатори кухонь 2 + +У цьому другому уроці класифікації ви дослідите більше способів класифікації числових даних. Ви також дізнаєтеся про наслідки вибору одного класифікатора над іншим. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +### Попередні знання + +Ми припускаємо, що ви завершили попередні уроки та маєте очищений набір даних у папці `data`, який називається _cleaned_cuisines.csv_ у кореневій папці цього 4-урочного блоку. + +### Підготовка + +Ми завантажили ваш файл _notebook.ipynb_ з очищеним набором даних і розділили його на X та y датафрейми, готові до процесу побудови моделі. + +## Карта класифікації + +Раніше ви дізналися про різні варіанти класифікації даних, використовуючи шпаргалку Microsoft. Scikit-learn пропонує схожу, але більш детальну шпаргалку, яка може допомогти ще більше звузити вибір оцінювачів (інша назва класифікаторів): + +![Карта ML від Scikit-learn](../../../../4-Classification/3-Classifiers-2/images/map.png) +> Порада: [відвідайте цю карту онлайн](https://scikit-learn.org/stable/tutorial/machine_learning_map/) і натискайте на шляхи, щоб прочитати документацію. + +### План + +Ця карта дуже корисна, коли ви добре розумієте свої дані, оскільки ви можете "пройти" її шляхами до рішення: + +- У нас є >50 зразків +- Ми хочемо передбачити категорію +- У нас є мічені дані +- У нас менше ніж 100К зразків +- ✨ Ми можемо вибрати Linear SVC +- Якщо це не спрацює, оскільки у нас числові дані + - Ми можемо спробувати ✨ KNeighbors Classifier + - Якщо це не спрацює, спробуйте ✨ SVC та ✨ Ensemble Classifiers + +Це дуже корисний шлях для слідування. + +## Вправа - розділіть дані + +Слідуючи цьому шляху, ми повинні почати з імпорту деяких бібліотек для використання. + +1. Імпортуйте необхідні бібліотеки: + + ```python + from sklearn.neighbors import KNeighborsClassifier + from sklearn.linear_model import LogisticRegression + from sklearn.svm import SVC + from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + import numpy as np + ``` + +1. Розділіть ваші дані на тренувальні та тестові: + + ```python + X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) + ``` + +## Класифікатор Linear SVC + +Support-Vector clustering (SVC) є частиною сімейства методів машинного навчання Support-Vector machines (докладніше про них нижче). У цьому методі ви можете вибрати "ядро", щоб вирішити, як кластеризувати мітки. Параметр 'C' стосується "регуляризації", яка регулює вплив параметрів. Ядро може бути одним із [кількох](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); тут ми встановлюємо його як 'linear', щоб використовувати Linear SVC. За замовчуванням ймовірність встановлена як 'false'; тут ми встановлюємо її як 'true', щоб отримати оцінки ймовірності. Ми встановлюємо random state як '0', щоб перемішати дані для отримання ймовірностей. + +### Вправа - застосуйте Linear SVC + +Почніть із створення масиву класифікаторів. Ви будете поступово додавати до цього масиву, тестуючи. + +1. Почніть із Linear SVC: + + ```python + C = 10 + # Create different classifiers. + classifiers = { + 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0) + } + ``` + +2. Навчіть вашу модель, використовуючи Linear SVC, і виведіть звіт: + + ```python + n_classifiers = len(classifiers) + + for index, (name, classifier) in enumerate(classifiers.items()): + classifier.fit(X_train, np.ravel(y_train)) + + y_pred = classifier.predict(X_test) + accuracy = accuracy_score(y_test, y_pred) + print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100)) + print(classification_report(y_test,y_pred)) + ``` + + Результат досить хороший: + + ```output + Accuracy (train) for Linear SVC: 78.6% + precision recall f1-score support + + chinese 0.71 0.67 0.69 242 + indian 0.88 0.86 0.87 234 + japanese 0.79 0.74 0.76 254 + korean 0.85 0.81 0.83 242 + thai 0.71 0.86 0.78 227 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +## Класифікатор K-Neighbors + +K-Neighbors є частиною сімейства методів ML "neighbors", які можуть використовуватися як для контрольованого, так і для неконтрольованого навчання. У цьому методі створюється задана кількість точок, і дані збираються навколо цих точок таким чином, щоб можна було передбачити узагальнені мітки для даних. + +### Вправа - застосуйте класифікатор K-Neighbors + +Попередній класифікатор був хорошим і добре працював із даними, але, можливо, ми можемо отримати кращу точність. Спробуйте класифікатор K-Neighbors. + +1. Додайте рядок до вашого масиву класифікаторів (додайте кому після елемента Linear SVC): + + ```python + 'KNN classifier': KNeighborsClassifier(C), + ``` + + Результат трохи гірший: + + ```output + Accuracy (train) for KNN classifier: 73.8% + precision recall f1-score support + + chinese 0.64 0.67 0.66 242 + indian 0.86 0.78 0.82 234 + japanese 0.66 0.83 0.74 254 + korean 0.94 0.58 0.72 242 + thai 0.71 0.82 0.76 227 + + accuracy 0.74 1199 + macro avg 0.76 0.74 0.74 1199 + weighted avg 0.76 0.74 0.74 1199 + ``` + + ✅ Дізнайтеся більше про [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) + +## Класифікатор Support Vector + +Класифікатори Support-Vector є частиною сімейства методів ML [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine), які використовуються для задач класифікації та регресії. SVM "відображають навчальні приклади в точки в просторі", щоб максимізувати відстань між двома категоріями. Наступні дані відображаються в цьому просторі, щоб можна було передбачити їхню категорію. + +### Вправа - застосуйте класифікатор Support Vector + +Спробуємо отримати трохи кращу точність за допомогою класифікатора Support Vector. + +1. Додайте кому після елемента K-Neighbors, а потім додайте цей рядок: + + ```python + 'SVC': SVC(), + ``` + + Результат досить хороший! + + ```output + Accuracy (train) for SVC: 83.2% + precision recall f1-score support + + chinese 0.79 0.74 0.76 242 + indian 0.88 0.90 0.89 234 + japanese 0.87 0.81 0.84 254 + korean 0.91 0.82 0.86 242 + thai 0.74 0.90 0.81 227 + + accuracy 0.83 1199 + macro avg 0.84 0.83 0.83 1199 + weighted avg 0.84 0.83 0.83 1199 + ``` + + ✅ Дізнайтеся більше про [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm) + +## Ensemble Classifiers + +Давайте пройдемо шлях до самого кінця, навіть якщо попередній тест був досить хорошим. Спробуємо деякі класифікатори 'Ensemble', зокрема Random Forest та AdaBoost: + +```python + 'RFST': RandomForestClassifier(n_estimators=100), + 'ADA': AdaBoostClassifier(n_estimators=100) +``` + +Результат дуже хороший, особливо для Random Forest: + +```output +Accuracy (train) for RFST: 84.5% + precision recall f1-score support + + chinese 0.80 0.77 0.78 242 + indian 0.89 0.92 0.90 234 + japanese 0.86 0.84 0.85 254 + korean 0.88 0.83 0.85 242 + thai 0.80 0.87 0.83 227 + + accuracy 0.84 1199 + macro avg 0.85 0.85 0.84 1199 +weighted avg 0.85 0.84 0.84 1199 + +Accuracy (train) for ADA: 72.4% + precision recall f1-score support + + chinese 0.64 0.49 0.56 242 + indian 0.91 0.83 0.87 234 + japanese 0.68 0.69 0.69 254 + korean 0.73 0.79 0.76 242 + thai 0.67 0.83 0.74 227 + + accuracy 0.72 1199 + macro avg 0.73 0.73 0.72 1199 +weighted avg 0.73 0.72 0.72 1199 +``` + +✅ Дізнайтеся більше про [Ensemble Classifiers](https://scikit-learn.org/stable/modules/ensemble.html) + +Цей метод машинного навчання "об'єднує прогнози кількох базових оцінювачів", щоб покращити якість моделі. У нашому прикладі ми використовували Random Trees та AdaBoost. + +- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), метод усереднення, будує "ліс" із "дерев рішень", наповнених випадковістю, щоб уникнути перенавчання. Параметр n_estimators встановлюється як кількість дерев. + +- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) підбирає класифікатор до набору даних, а потім підбирає копії цього класифікатора до того ж набору даних. Він зосереджується на вагах неправильно класифікованих елементів і коригує підбір для наступного класифікатора, щоб виправити помилки. + +--- + +## 🚀Виклик + +Кожен із цих методів має велику кількість параметрів, які ви можете налаштувати. Дослідіть параметри за замовчуванням кожного методу та подумайте, що означатиме їхнє налаштування для якості моделі. + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд та самостійне навчання + +У цих уроках багато термінології, тому приділіть хвилинку, щоб переглянути [цей список](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) корисних термінів! + +## Завдання + +[Гра з параметрами](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, звертаємо вашу увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/3-Classifiers-2/assignment.md b/translations/uk/4-Classification/3-Classifiers-2/assignment.md new file mode 100644 index 00000000..cf08d6c2 --- /dev/null +++ b/translations/uk/4-Classification/3-Classifiers-2/assignment.md @@ -0,0 +1,25 @@ + +# Гра з параметрами + +## Інструкції + +Існує багато параметрів, які встановлюються за замовчуванням при роботі з цими класифікаторами. Intellisense у VS Code може допомогти вам розібратися в них. Виберіть одну з технік класифікації машинного навчання, представлених у цьому уроці, і перенавчіть моделі, змінюючи різні значення параметрів. Створіть ноутбук, у якому поясніть, чому деякі зміни покращують якість моделі, а інші погіршують її. Будьте детальними у своїй відповіді. + +## Критерії оцінювання + +| Критерій | Відмінно | Достатньо | Потребує покращення | +| -------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ----------------------------- | +| | Представлено ноутбук із повністю побудованим класифікатором, параметри змінено, а зміни пояснено у текстових блоках | Представлено ноутбук частково або пояснення слабкі | Ноутбук містить помилки або недоліки | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, звертаємо вашу увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/3-Classifiers-2/solution/Julia/README.md b/translations/uk/4-Classification/3-Classifiers-2/solution/Julia/README.md new file mode 100644 index 00000000..fe41b878 --- /dev/null +++ b/translations/uk/4-Classification/3-Classifiers-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/4-Applied/README.md b/translations/uk/4-Classification/4-Applied/README.md new file mode 100644 index 00000000..ee0ad337 --- /dev/null +++ b/translations/uk/4-Classification/4-Applied/README.md @@ -0,0 +1,329 @@ + +# Створення веб-додатку для рекомендацій кухні + +У цьому уроці ви створите модель класифікації, використовуючи деякі техніки, які ви вивчили в попередніх уроках, а також смачний набір даних про кухні, який використовувався протягом цієї серії. Крім того, ви створите невеликий веб-додаток для використання збереженої моделі, використовуючи веб-рантайм Onnx. + +Одним із найкорисніших практичних застосувань машинного навчання є створення систем рекомендацій, і сьогодні ви можете зробити перший крок у цьому напрямку! + +[![Презентація цього веб-додатку](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Applied ML") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео: Джен Лупер створює веб-додаток, використовуючи дані класифікованих кухонь + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +У цьому уроці ви дізнаєтеся: + +- Як створити модель та зберегти її у форматі Onnx +- Як використовувати Netron для перевірки моделі +- Як використовувати вашу модель у веб-додатку для інференсу + +## Створення вашої моделі + +Створення прикладних систем машинного навчання є важливою частиною використання цих технологій для ваших бізнес-систем. Ви можете використовувати моделі у своїх веб-додатках (а отже, використовувати їх в офлайн-режимі, якщо це необхідно), використовуючи Onnx. + +У [попередньому уроці](../../3-Web-App/1-Web-App/README.md) ви створили модель регресії про спостереження НЛО, "запакували" її та використали у додатку Flask. Хоча ця архітектура дуже корисна, це повноцінний Python-додаток, і ваші вимоги можуть включати використання JavaScript-додатку. + +У цьому уроці ви можете створити базову систему на основі JavaScript для інференсу. Спочатку, однак, вам потрібно навчити модель і конвертувати її для використання з Onnx. + +## Вправа - навчання моделі класифікації + +Спочатку навчіть модель класифікації, використовуючи очищений набір даних про кухні, який ми використовували. + +1. Почніть з імпорту корисних бібліотек: + + ```python + !pip install skl2onnx + import pandas as pd + ``` + + Вам потрібен '[skl2onnx](https://onnx.ai/sklearn-onnx/)', щоб допомогти конвертувати вашу модель Scikit-learn у формат Onnx. + +1. Потім працюйте з вашими даними так само, як ви робили в попередніх уроках, читаючи CSV-файл за допомогою `read_csv()`: + + ```python + data = pd.read_csv('../data/cleaned_cuisines.csv') + data.head() + ``` + +1. Видаліть перші два непотрібні стовпці та збережіть решту даних як 'X': + + ```python + X = data.iloc[:,2:] + X.head() + ``` + +1. Збережіть мітки як 'y': + + ```python + y = data[['cuisine']] + y.head() + + ``` + +### Початок процедури навчання + +Ми будемо використовувати бібліотеку 'SVC', яка має хорошу точність. + +1. Імпортуйте відповідні бібліотеки з Scikit-learn: + + ```python + from sklearn.model_selection import train_test_split + from sklearn.svm import SVC + from sklearn.model_selection import cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report + ``` + +1. Розділіть дані на навчальний та тестовий набори: + + ```python + X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3) + ``` + +1. Створіть модель класифікації SVC, як ви робили в попередньому уроці: + + ```python + model = SVC(kernel='linear', C=10, probability=True,random_state=0) + model.fit(X_train,y_train.values.ravel()) + ``` + +1. Тепер протестуйте вашу модель, викликавши `predict()`: + + ```python + y_pred = model.predict(X_test) + ``` + +1. Виведіть звіт про класифікацію, щоб перевірити якість моделі: + + ```python + print(classification_report(y_test,y_pred)) + ``` + + Як ми бачили раніше, точність хороша: + + ```output + precision recall f1-score support + + chinese 0.72 0.69 0.70 257 + indian 0.91 0.87 0.89 243 + japanese 0.79 0.77 0.78 239 + korean 0.83 0.79 0.81 236 + thai 0.72 0.84 0.78 224 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +### Конвертуйте вашу модель у формат Onnx + +Переконайтеся, що конвертація виконується з правильним числом тензорів. У цьому наборі даних є 380 інгредієнтів, тому вам потрібно зазначити це число у `FloatTensorType`: + +1. Конвертуйте, використовуючи число тензорів 380. + + ```python + from skl2onnx import convert_sklearn + from skl2onnx.common.data_types import FloatTensorType + + initial_type = [('float_input', FloatTensorType([None, 380]))] + options = {id(model): {'nocl': True, 'zipmap': False}} + ``` + +1. Створіть файл **model.onnx**: + + ```python + onx = convert_sklearn(model, initial_types=initial_type, options=options) + with open("./model.onnx", "wb") as f: + f.write(onx.SerializeToString()) + ``` + + > Зверніть увагу, що ви можете передати [опції](https://onnx.ai/sklearn-onnx/parameterized.html) у вашому скрипті конвертації. У цьому випадку ми передали 'nocl', щоб він був True, і 'zipmap', щоб він був False. Оскільки це модель класифікації, у вас є опція видалити ZipMap, який створює список словників (необов'язково). `nocl` стосується включення інформації про класи у модель. Зменшіть розмір вашої моделі, встановивши `nocl` на 'True'. + +Запуск всього ноутбука тепер створить модель Onnx і збереже її у цій папці. + +## Перегляд вашої моделі + +Моделі Onnx не дуже зручні для перегляду у Visual Studio Code, але є дуже хороше безкоштовне програмне забезпечення, яке багато дослідників використовують для візуалізації моделі, щоб переконатися, що вона правильно побудована. Завантажте [Netron](https://github.com/lutzroeder/Netron) і відкрийте ваш файл model.onnx. Ви можете побачити вашу просту модель, візуалізовану з її 380 входами та класифікатором: + +![Netron visual](../../../../4-Classification/4-Applied/images/netron.png) + +Netron — це корисний інструмент для перегляду ваших моделей. + +Тепер ви готові використовувати цю чудову модель у веб-додатку. Давайте створимо додаток, який стане в нагоді, коли ви заглянете у свій холодильник і спробуєте визначити, яку комбінацію залишків інгредієнтів ви можете використати для приготування певної кухні, як визначено вашою моделлю. + +## Створення веб-додатку для рекомендацій + +Ви можете використовувати вашу модель безпосередньо у веб-додатку. Ця архітектура також дозволяє запускати її локально і навіть офлайн, якщо це необхідно. Почніть зі створення файлу `index.html` у тій самій папці, де ви зберегли ваш файл `model.onnx`. + +1. У цьому файлі _index.html_ додайте наступну розмітку: + + ```html + + +
                                          + Cuisine Matcher +
                                          + + ... + + + ``` + +1. Тепер, працюючи всередині тегів `body`, додайте трохи розмітки, щоб показати список чекбоксів, що відображають деякі інгредієнти: + + ```html +

                                          Check your refrigerator. What can you create?

                                          +
                                          +
                                          + + +
                                          + +
                                          + + +
                                          + +
                                          + + +
                                          + +
                                          + + +
                                          + +
                                          + + +
                                          + +
                                          + + +
                                          + +
                                          + + +
                                          +
                                          +
                                          + +
                                          + ``` + + Зверніть увагу, що кожному чекбоксу присвоєно значення. Це відображає індекс, де інгредієнт знаходиться відповідно до набору даних. Наприклад, яблуко у цьому алфавітному списку займає п'ятий стовпець, тому його значення — '4', оскільки ми починаємо рахувати з 0. Ви можете звернутися до [електронної таблиці інгредієнтів](../../../../4-Classification/data/ingredient_indexes.csv), щоб дізнатися індекс певного інгредієнта. + + Продовжуючи роботу у файлі index.html, додайте блок скрипту, де модель викликається після останнього закриваючого ``. + +1. Спочатку імпортуйте [Onnx Runtime](https://www.onnxruntime.ai/): + + ```html + + ``` + + > Onnx Runtime використовується для запуску ваших моделей Onnx на широкому спектрі апаратних платформ, включаючи оптимізації та API для використання. + +1. Як тільки Runtime встановлено, ви можете викликати його: + + ```html + + ``` + +У цьому коді відбувається кілька речей: + +1. Ви створили масив із 380 можливих значень (1 або 0), які будуть встановлені та відправлені до моделі для інференсу залежно від того, чи вибрано чекбокс. +2. Ви створили масив чекбоксів і спосіб визначити, чи вони були вибрані, у функції `init`, яка викликається при запуску додатку. Коли чекбокс вибрано, масив `ingredients` змінюється, щоб відобразити вибраний інгредієнт. +3. Ви створили функцію `testCheckboxes`, яка перевіряє, чи вибрано будь-який чекбокс. +4. Ви використовуєте функцію `startInference`, коли натискається кнопка, і якщо вибрано будь-який чекбокс, ви починаєте інференс. +5. Рутинна процедура інференсу включає: + 1. Налаштування асинхронного завантаження моделі + 2. Створення структури Tensor для відправки до моделі + 3. Створення 'feeds', які відображають вхідний `float_input`, створений вами при навчанні моделі (ви можете використовувати Netron, щоб перевірити цю назву) + 4. Відправлення цих 'feeds' до моделі та очікування відповіді + +## Тестування вашого додатку + +Відкрийте термінал у Visual Studio Code у папці, де знаходиться ваш файл index.html. Переконайтеся, що у вас встановлено [http-server](https://www.npmjs.com/package/http-server) глобально, і введіть `http-server` у командному рядку. Локальний хост має відкритися, і ви можете переглянути ваш веб-додаток. Перевірте, яку кухню рекомендують на основі різних інгредієнтів: + +![ingredient web app](../../../../4-Classification/4-Applied/images/web-app.png) + +Вітаємо, ви створили веб-додаток для рекомендацій із кількома полями. Приділіть трохи часу, щоб розширити цю систему! + +## 🚀Завдання + +Ваш веб-додаток дуже мінімальний, тому продовжуйте розширювати його, використовуючи інгредієнти та їх індекси з даних [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv). Які комбінації смаків працюють для створення певної національної страви? + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Хоча цей урок лише торкнувся корисності створення системи рекомендацій для інгредієнтів їжі, ця область застосування ML дуже багата на приклади. Прочитайте більше про те, як створюються ці системи: + +- https://www.sciencedirect.com/topics/computer-science/recommendation-engine +- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/ +- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/ + +## Завдання + +[Створіть нову систему рекомендацій](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/4-Applied/assignment.md b/translations/uk/4-Classification/4-Applied/assignment.md new file mode 100644 index 00000000..f9f9cfaf --- /dev/null +++ b/translations/uk/4-Classification/4-Applied/assignment.md @@ -0,0 +1,25 @@ + +# Створіть рекомендаційну систему + +## Інструкції + +Враховуючи ваші вправи в цьому уроці, тепер ви знаєте, як створити веб-додаток на JavaScript, використовуючи Onnx Runtime і перетворену модель Onnx. Спробуйте створити нову рекомендаційну систему, використовуючи дані з цих уроків або знайдені в іншому місці (будь ласка, вказуйте джерело). Ви можете створити рекомендаційну систему для домашніх улюбленців, враховуючи різні характеристики особистості, або систему рекомендацій музичних жанрів, базуючись на настрої людини. Будьте креативними! + +## Критерії оцінювання + +| Критерій | Відмінно | Задовільно | Потребує покращення | +| -------- | ---------------------------------------------------------------------- | ------------------------------------- | --------------------------------- | +| | Представлено веб-додаток і блокнот, обидва добре задокументовані та працюють | Один із них відсутній або має недоліки | Обидва відсутні або мають недоліки | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/4-Classification/README.md b/translations/uk/4-Classification/README.md new file mode 100644 index 00000000..95793789 --- /dev/null +++ b/translations/uk/4-Classification/README.md @@ -0,0 +1,41 @@ + +# Початок роботи з класифікацією + +## Регіональна тема: Смачні азійські та індійські кухні 🍜 + +В Азії та Індії традиції їжі надзвичайно різноманітні та дуже смачні! Давайте розглянемо дані про регіональні кухні, щоб зрозуміти їхні інгредієнти. + +![Продавець тайської їжі](../../../4-Classification/images/thai-food.jpg) +> Фото зроблено Лішенгом Чангом на Unsplash + +## Що ви дізнаєтесь + +У цьому розділі ви продовжите своє попереднє вивчення регресії та ознайомитеся з іншими класифікаторами, які можна використовувати для кращого розуміння даних. + +> Існують корисні інструменти з низьким рівнем кодування, які допоможуть вам навчитися працювати з моделями класифікації. Спробуйте [Azure ML для цього завдання](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Уроки + +1. [Вступ до класифікації](1-Introduction/README.md) +2. [Більше класифікаторів](2-Classifiers-1/README.md) +3. [Ще інші класифікатори](3-Classifiers-2/README.md) +4. [Прикладне машинне навчання: створення веб-додатку](4-Applied/README.md) + +## Автори + +"Початок роботи з класифікацією" написано з ♥️ [Кассі Бревіу](https://www.twitter.com/cassiebreviu) та [Джен Лупер](https://www.twitter.com/jenlooper) + +Набір даних про смачні кухні взято з [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines). + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/5-Clustering/1-Visualize/README.md b/translations/uk/5-Clustering/1-Visualize/README.md new file mode 100644 index 00000000..d97f84ed --- /dev/null +++ b/translations/uk/5-Clustering/1-Visualize/README.md @@ -0,0 +1,347 @@ + +# Вступ до кластеризації + +Кластеризація — це тип [навчання без учителя](https://wikipedia.org/wiki/Unsupervised_learning), який передбачає, що набір даних не має міток або його вхідні дані не пов’язані з визначеними виходами. Вона використовує різні алгоритми для аналізу немаркованих даних і створення груп на основі виявлених у даних закономірностей. + +[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео. Поки ви вивчаєте машинне навчання з кластеризацією, насолоджуйтесь нігерійськими танцювальними треками — це високо оцінена пісня 2014 року від PSquare. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +### Вступ + +[Кластеризація](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) дуже корисна для дослідження даних. Давайте подивимося, чи може вона допомогти виявити тенденції та закономірності у способах споживання музики нігерійською аудиторією. + +✅ Зробіть паузу та подумайте про застосування кластеризації. У реальному житті кластеризація відбувається, коли у вас є купа білизни, і вам потрібно розсортувати одяг членів вашої родини 🧦👕👖🩲. У науці про дані кластеризація відбувається під час аналізу уподобань користувачів або визначення характеристик будь-якого немаркованого набору даних. Кластеризація, певною мірою, допомагає навести лад у хаосі, як у шухляді для шкарпеток. + +[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео: Джон Гуттаг з MIT представляє кластеризацію. + +У професійному середовищі кластеризацію можна використовувати для визначення таких речей, як сегментація ринку, наприклад, визначення, які вікові групи купують які товари. Інше застосування — виявлення аномалій, наприклад, для виявлення шахрайства в наборі даних про транзакції кредитних карток. Або ви можете використовувати кластеризацію для визначення пухлин у партії медичних сканів. + +✅ Подумайте хвилину про те, як ви могли зустрічати кластеризацію «у дикій природі», у банківській, електронній комерції чи бізнес-середовищі. + +> 🎓 Цікаво, що аналіз кластерів виник у галузях антропології та психології у 1930-х роках. Уявляєте, як його могли використовувати? + +Альтернативно, кластеризацію можна використовувати для групування результатів пошуку — наприклад, за посиланнями на покупки, зображеннями чи відгуками. Кластеризація корисна, коли у вас є великий набір даних, який ви хочете зменшити та на якому хочете провести більш детальний аналіз, тому цей метод можна використовувати для вивчення даних перед створенням інших моделей. + +✅ Коли ваші дані організовані в кластери, ви призначаєте їм ідентифікатор кластеру, і ця техніка може бути корисною для збереження конфіденційності набору даних; замість цього ви можете посилатися на точку даних за її ідентифікатором кластеру, а не за більш розкриваючими даними. Чи можете ви придумати інші причини, чому ви б використовували ідентифікатор кластеру, а не інші елементи кластеру для його ідентифікації? + +Поглибте своє розуміння технік кластеризації в цьому [навчальному модулі](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott). + +## Початок роботи з кластеризацією + +[Scikit-learn пропонує широкий вибір](https://scikit-learn.org/stable/modules/clustering.html) методів для виконання кластеризації. Тип, який ви оберете, залежатиме від вашого випадку використання. Згідно з документацією, кожен метод має різні переваги. Ось спрощена таблиця методів, підтримуваних Scikit-learn, і їх відповідних випадків використання: + +| Назва методу | Випадок використання | +| :--------------------------- | :------------------------------------------------------------------- | +| K-Means | загального призначення, індуктивний | +| Affinity propagation | багато, нерівномірні кластери, індуктивний | +| Mean-shift | багато, нерівномірні кластери, індуктивний | +| Spectral clustering | мало, рівномірні кластери, трансдуктивний | +| Ward hierarchical clustering | багато, обмежені кластери, трансдуктивний | +| Agglomerative clustering | багато, обмежені, неевклідові відстані, трансдуктивний | +| DBSCAN | не плоска геометрія, нерівномірні кластери, трансдуктивний | +| OPTICS | не плоска геометрія, нерівномірні кластери зі змінною щільністю, трансдуктивний | +| Gaussian mixtures | плоска геометрія, індуктивний | +| BIRCH | великий набір даних із викидами, індуктивний | + +> 🎓 Як ми створюємо кластери, багато в чому залежить від того, як ми групуємо точки даних у групи. Давайте розберемо деяку термінологію: +> +> 🎓 ['Трансдуктивний' vs. 'індуктивний'](https://wikipedia.org/wiki/Transduction_(machine_learning)) +> +> Трансдуктивний висновок базується на спостережуваних навчальних випадках, які відповідають конкретним тестовим випадкам. Індуктивний висновок базується на навчальних випадках, які відповідають загальним правилам, які лише потім застосовуються до тестових випадків. +> +> Приклад: Уявіть, що у вас є набір даних, який лише частково має мітки. Деякі речі — це «платівки», деякі — «CD», а деякі — порожні. Ваше завдання — надати мітки для порожніх. Якщо ви обираєте індуктивний підхід, ви тренуєте модель, шукаючи «платівки» та «CD», і застосовуєте ці мітки до немаркованих даних. Цей підхід матиме труднощі з класифікацією речей, які насправді є «касетами». Трансдуктивний підхід, з іншого боку, ефективніше працює з невідомими даними, оскільки він групує схожі елементи разом і потім застосовує мітку до групи. У цьому випадку кластери можуть відображати «круглі музичні речі» та «квадратні музичні речі». +> +> 🎓 ['Не плоска' vs. 'плоска' геометрія](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) +> +> Взято з математичної термінології, не плоска vs. плоска геометрія стосується вимірювання відстаней між точками за допомогою «плоских» ([евклідових](https://wikipedia.org/wiki/Euclidean_geometry)) або «не плоских» (неевклідових) геометричних методів. +> +>'Плоска' в цьому контексті стосується евклідової геометрії (частини якої викладаються як «планіметрія»), а не плоска стосується неевклідової геометрії. Що геометрія має спільного з машинним навчанням? Як дві галузі, які базуються на математиці, має бути загальний спосіб вимірювання відстаней між точками в кластерах, і це можна зробити «плоским» або «не плоским» способом, залежно від природи даних. [Евклідові відстані](https://wikipedia.org/wiki/Euclidean_distance) вимірюються як довжина відрізка між двома точками. [Неевклідові відстані](https://wikipedia.org/wiki/Non-Euclidean_geometry) вимірюються вздовж кривої. Якщо ваші дані, візуалізовані, здаються такими, що не існують на площині, вам може знадобитися спеціалізований алгоритм для їх обробки. +> +![Flat vs Nonflat Geometry Infographic](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png) +> Інфографіка від [Dasani Madipalli](https://twitter.com/dasani_decoded) +> +> 🎓 ['Відстані'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) +> +> Кластери визначаються їх матрицею відстаней, тобто відстанями між точками. Ця відстань може вимірюватися кількома способами. Евклідові кластери визначаються середнім значенням точок і містять «центроїд» або центральну точку. Відстані вимірюються від центроїда. Неевклідові відстані стосуються «кластроїдів», точки, найближчої до інших точок. Кластроїди, у свою чергу, можуть визначатися різними способами. +> +> 🎓 ['Обмежені'](https://wikipedia.org/wiki/Constrained_clustering) +> +> [Обмежена кластеризація](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) вводить «напівконтрольоване» навчання в цей метод без учителя. Відносини між точками позначаються як «не можна зв’язати» або «потрібно зв’язати», тому деякі правила накладаються на набір даних. +> +>Приклад: Якщо алгоритм вільно працює з партією немаркованих або частково маркованих даних, кластери, які він створює, можуть бути низької якості. У наведеному вище прикладі кластери можуть групувати «круглі музичні речі», «квадратні музичні речі», «трикутні речі» та «печиво». Якщо надати деякі обмеження або правила, яких слід дотримуватися («елемент має бути виготовлений із пластику», «елемент має бути здатним відтворювати музику»), це може допомогти «обмежити» алгоритм для прийняття кращих рішень. +> +> 🎓 'Щільність' +> +> Дані, які є «шумними», вважаються «щільними». Відстані між точками в кожному з його кластерів можуть виявитися, при перевірці, більш-менш щільними або «переповненими», і тому ці дані потрібно аналізувати за допомогою відповідного методу кластеризації. [Ця стаття](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) демонструє різницю між використанням кластеризації K-Means і алгоритмів HDBSCAN для дослідження шумного набору даних із нерівномірною щільністю кластерів. + +## Алгоритми кластеризації + +Існує понад 100 алгоритмів кластеризації, і їх використання залежить від природи даних. Давайте обговоримо деякі основні: + +- **Ієрархічна кластеризація**. Якщо об’єкт класифікується за його близькістю до сусіднього об’єкта, а не до більш віддаленого, кластери формуються на основі відстані їх членів до інших об’єктів. Ієрархічна кластеризація Scikit-learn є агломеративною. + + ![Hierarchical clustering Infographic](../../../../5-Clustering/1-Visualize/images/hierarchical.png) + > Інфографіка від [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Кластеризація за центроїдом**. Цей популярний алгоритм вимагає вибору «k», або кількості кластерів для формування, після чого алгоритм визначає центральну точку кластеру та збирає дані навколо цієї точки. [Кластеризація K-means](https://wikipedia.org/wiki/K-means_clustering) є популярною версією кластеризації за центроїдом. Центр визначається найближчим середнім значенням, звідси й назва. Квадратна відстань від кластеру мінімізується. + + ![Centroid clustering Infographic](../../../../5-Clustering/1-Visualize/images/centroid.png) + > Інфографіка від [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Кластеризація на основі розподілу**. Заснована на статистичному моделюванні, кластеризація на основі розподілу зосереджена на визначенні ймовірності того, що точка даних належить кластеру, і відповідно її призначення. Методи гаусівської суміші належать до цього типу. + +- **Кластеризація на основі щільності**. Точки даних призначаються кластерам на основі їх щільності або групування навколо одна одної. Точки даних, віддалені від групи, вважаються викидами або шумом. DBSCAN, Mean-shift і OPTICS належать до цього типу кластеризації. + +- **Кластеризація на основі сітки**. Для багатовимірних наборів даних створюється сітка, і дані розподіляються між комірками сітки, створюючи таким чином кластери. + +## Вправа — кластеризуйте свої дані + +Кластеризація як техніка значно полегшується за допомогою належної візуалізації, тому давайте почнемо з візуалізації наших музичних даних. Ця вправа допоможе нам вирішити, який із методів кластеризації найефективніше використовувати для природи цих даних. + +1. Відкрийте файл [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) у цій папці. + +1. Імпортуйте пакет `Seaborn` для якісної візуалізації даних. + + ```python + !pip install seaborn + ``` + +1. Додайте дані про пісні з [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv). Завантажте фрейм даних із деякою інформацією про пісні. Підготуйтеся до дослідження цих даних, імпортувавши бібліотеки та вивівши дані: + + ```python + import matplotlib.pyplot as plt + import pandas as pd + + df = pd.read_csv("../data/nigerian-songs.csv") + df.head() + ``` + + Перевірте перші кілька рядків даних: + + | | name | album | artist | artist_top_genre | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | + | --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ------------ | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- | + | 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 | + | 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 | +| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 | +| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 | +| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 | + +1. Отримайте інформацію про датафрейм, викликавши `info()`: + + ```python + df.info() + ``` + + Вихідні дані виглядають так: + + ```output + + RangeIndex: 530 entries, 0 to 529 + Data columns (total 16 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 name 530 non-null object + 1 album 530 non-null object + 2 artist 530 non-null object + 3 artist_top_genre 530 non-null object + 4 release_date 530 non-null int64 + 5 length 530 non-null int64 + 6 popularity 530 non-null int64 + 7 danceability 530 non-null float64 + 8 acousticness 530 non-null float64 + 9 energy 530 non-null float64 + 10 instrumentalness 530 non-null float64 + 11 liveness 530 non-null float64 + 12 loudness 530 non-null float64 + 13 speechiness 530 non-null float64 + 14 tempo 530 non-null float64 + 15 time_signature 530 non-null int64 + dtypes: float64(8), int64(4), object(4) + memory usage: 66.4+ KB + ``` + +1. Перевірте наявність пропущених значень, викликавши `isnull()` і переконавшись, що сума дорівнює 0: + + ```python + df.isnull().sum() + ``` + + Все добре: + + ```output + name 0 + album 0 + artist 0 + artist_top_genre 0 + release_date 0 + length 0 + popularity 0 + danceability 0 + acousticness 0 + energy 0 + instrumentalness 0 + liveness 0 + loudness 0 + speechiness 0 + tempo 0 + time_signature 0 + dtype: int64 + ``` + +1. Опишіть дані: + + ```python + df.describe() + ``` + + | | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | + | ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- | + | count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | + | mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 | + | std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 | + | min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 | + | 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 | + | 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 | + | 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 | + | max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 | + +> 🤔 Якщо ми працюємо з кластеризацією, методом без нагляду, який не потребує міток даних, чому ми показуємо ці дані з мітками? На етапі дослідження даних вони корисні, але для роботи алгоритмів кластеризації вони не є необхідними. Ви можете просто видалити заголовки стовпців і посилатися на дані за номером стовпця. + +Подивіться на загальні значення даних. Зверніть увагу, що популярність може бути "0", що вказує на пісні без рейтингу. Давайте незабаром видалимо їх. + +1. Використовуйте стовпчасту діаграму, щоб дізнатися найпопулярніші жанри: + + ```python + import seaborn as sns + + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top[:5].index,y=top[:5].values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + ![найпопулярніші](../../../../5-Clustering/1-Visualize/images/popular.png) + +✅ Якщо ви хочете побачити більше топових значень, змініть `[:5]` на більше значення або видаліть його, щоб побачити всі. + +Зверніть увагу, коли топовий жанр описується як "Missing", це означає, що Spotify не класифікував його, тому давайте позбудемося його. + +1. Видаліть відсутні дані, відфільтрувавши їх: + + ```python + df = df[df['artist_top_genre'] != 'Missing'] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + Тепер перевірте жанри ще раз: + + ![усі жанри](../../../../5-Clustering/1-Visualize/images/all-genres.png) + +1. Три найпопулярніші жанри значно домінують у цьому наборі даних. Зосередимося на `afro dancehall`, `afropop` і `nigerian pop`, додатково відфільтруємо набір даних, щоб видалити все з популярністю 0 (тобто те, що не було класифіковано за популярністю в наборі даних і може вважатися шумом для наших цілей): + + ```python + df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] + df = df[(df['popularity'] > 0)] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + +1. Проведіть швидкий тест, щоб перевірити, чи дані мають сильну кореляцію: + + ```python + corrmat = df.corr(numeric_only=True) + f, ax = plt.subplots(figsize=(12, 9)) + sns.heatmap(corrmat, vmax=.8, square=True) + ``` + + ![кореляції](../../../../5-Clustering/1-Visualize/images/correlation.png) + + Єдина сильна кореляція — між `energy` і `loudness`, що не дивно, враховуючи, що гучна музика зазвичай досить енергійна. В іншому випадку кореляції відносно слабкі. Буде цікаво побачити, що алгоритм кластеризації зможе зробити з цими даними. + + > 🎓 Зверніть увагу, що кореляція не означає причинно-наслідковий зв'язок! Ми маємо доказ кореляції, але не маємо доказу причинності. [Цікавий веб-сайт](https://tylervigen.com/spurious-correlations) має візуалізації, які підкреслюють цю думку. + +Чи є в цьому наборі даних зближення навколо сприйнятої популярності пісні та її танцювальності? FacetGrid показує концентричні кола, які вирівнюються незалежно від жанру. Чи може бути так, що смаки в Нігерії сходяться на певному рівні танцювальності для цього жанру? + +✅ Спробуйте різні точки даних (energy, loudness, speechiness) і більше або інші музичні жанри. Що ви можете виявити? Подивіться на таблицю `df.describe()`, щоб побачити загальний розподіл точок даних. + +### Вправа - розподіл даних + +Чи значно відрізняються ці три жанри за сприйняттям їхньої танцювальності на основі популярності? + +1. Дослідіть розподіл даних наших трьох топових жанрів за популярністю та танцювальністю вздовж заданих осей x та y. + + ```python + sns.set_theme(style="ticks") + + g = sns.jointplot( + data=df, + x="popularity", y="danceability", hue="artist_top_genre", + kind="kde", + ) + ``` + + Ви можете побачити концентричні кола навколо загальної точки зближення, що показує розподіл точок. + + > 🎓 Зверніть увагу, що в цьому прикладі використовується графік KDE (Kernel Density Estimate), який представляє дані за допомогою безперервної кривої ймовірності. Це дозволяє інтерпретувати дані при роботі з кількома розподілами. + + Загалом, три жанри приблизно вирівнюються за популярністю та танцювальністю. Визначення кластерів у цих слабо вирівняних даних буде викликом: + + ![розподіл](../../../../5-Clustering/1-Visualize/images/distribution.png) + +1. Створіть діаграму розсіювання: + + ```python + sns.FacetGrid(df, hue="artist_top_genre", height=5) \ + .map(plt.scatter, "popularity", "danceability") \ + .add_legend() + ``` + + Діаграма розсіювання для тих самих осей показує схожу картину зближення. + + ![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png) + +Загалом, для кластеризації ви можете використовувати діаграми розсіювання, щоб показати кластери даних, тому освоєння цього типу візуалізації дуже корисне. У наступному уроці ми візьмемо ці відфільтровані дані та використаємо кластеризацію k-means, щоб виявити групи в цих даних, які, здається, цікаво перекриваються. + +--- + +## 🚀Виклик + +У підготовці до наступного уроку створіть діаграму про різні алгоритми кластеризації, які ви можете виявити та використовувати в робочому середовищі. Які проблеми намагається вирішити кластеризація? + +## [Післялекційний тест](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Перед тим як застосовувати алгоритми кластеризації, як ми дізналися, важливо зрозуміти природу вашого набору даних. Читайте більше на цю тему [тут](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) + +[Ця корисна стаття](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) пояснює різні способи поведінки алгоритмів кластеризації залежно від форми даних. + +## Завдання + +[Дослідіть інші візуалізації для кластеризації](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/5-Clustering/1-Visualize/assignment.md b/translations/uk/5-Clustering/1-Visualize/assignment.md new file mode 100644 index 00000000..bb7f8a7a --- /dev/null +++ b/translations/uk/5-Clustering/1-Visualize/assignment.md @@ -0,0 +1,25 @@ + +# Дослідження інших візуалізацій для кластеризації + +## Інструкції + +У цьому уроці ви працювали з деякими техніками візуалізації, щоб зрозуміти, як побудувати графіки для підготовки до кластеризації. Точкові діаграми, зокрема, є корисними для пошуку груп об'єктів. Дослідіть різні способи та бібліотеки для створення точкових діаграм і задокументуйте вашу роботу в блокноті. Ви можете використовувати дані з цього уроку, інших уроків або дані, які ви знайдете самостійно (обов'язково вкажіть джерело даних у вашому блокноті). Побудуйте кілька графіків за допомогою точкових діаграм і поясніть, що ви виявили. + +## Критерії оцінювання + +| Критерій | Відмінно | Задовільно | Потребує покращення | +| -------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------- | +| | Представлено блокнот із п'ятьма добре задокументованими точковими діаграмами | Представлено блокнот із менш ніж п'ятьма точковими діаграмами, і він менш добре задокументований | Представлено неповний блокнот | + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/5-Clustering/1-Visualize/solution/Julia/README.md b/translations/uk/5-Clustering/1-Visualize/solution/Julia/README.md new file mode 100644 index 00000000..0d1690cc --- /dev/null +++ b/translations/uk/5-Clustering/1-Visualize/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/5-Clustering/2-K-Means/README.md b/translations/uk/5-Clustering/2-K-Means/README.md new file mode 100644 index 00000000..d6643527 --- /dev/null +++ b/translations/uk/5-Clustering/2-K-Means/README.md @@ -0,0 +1,261 @@ + +# Кластеризація методом K-Means + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +У цьому уроці ви навчитеся створювати кластери за допомогою Scikit-learn і набору даних про нігерійську музику, який ви імпортували раніше. Ми розглянемо основи методу K-Means для кластеризації. Пам’ятайте, що, як ви дізналися в попередньому уроці, існує багато способів роботи з кластерами, і метод, який ви використовуєте, залежить від ваших даних. Ми спробуємо K-Means, оскільки це найпоширеніша техніка кластеризації. Почнемо! + +Терміни, які ви вивчите: + +- Оцінка силуету +- Метод ліктя +- Інерція +- Дисперсія + +## Вступ + +[Кластеризація методом K-Means](https://wikipedia.org/wiki/K-means_clustering) — це метод, що походить із галузі обробки сигналів. Він використовується для поділу та групування даних у 'k' кластерів за допомогою серії спостережень. Кожне спостереження працює над тим, щоб згрупувати дану точку даних найближче до її 'середнього', або центральної точки кластера. + +Кластери можна візуалізувати як [діаграми Вороного](https://wikipedia.org/wiki/Voronoi_diagram), які включають точку (або 'насіння') та її відповідну область. + +![діаграма Вороного](../../../../5-Clustering/2-K-Means/images/voronoi.png) + +> Інфографіка від [Jen Looper](https://twitter.com/jenlooper) + +Процес кластеризації методом K-Means [виконується у три етапи](https://scikit-learn.org/stable/modules/clustering.html#k-means): + +1. Алгоритм вибирає k-кількість центральних точок шляхом вибірки з набору даних. Після цього він повторює: + 1. Призначає кожну вибірку до найближчого центроїда. + 2. Створює нові центроїди, обчислюючи середнє значення всіх вибірок, призначених до попередніх центроїдів. + 3. Потім обчислює різницю між новими та старими центроїдами і повторює, поки центроїди не стабілізуються. + +Одним із недоліків використання K-Means є те, що вам потрібно встановити 'k', тобто кількість центроїдів. На щастя, метод 'ліктя' допомагає оцінити гарне початкове значення для 'k'. Ви спробуєте це через хвилину. + +## Передумови + +Ви працюватимете у файлі [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb), який включає імпорт даних і попереднє очищення, яке ви виконали в попередньому уроці. + +## Вправа - підготовка + +Почніть із повторного перегляду даних про пісні. + +1. Створіть boxplot, викликавши `boxplot()` для кожного стовпця: + + ```python + plt.figure(figsize=(20,20), dpi=200) + + plt.subplot(4,3,1) + sns.boxplot(x = 'popularity', data = df) + + plt.subplot(4,3,2) + sns.boxplot(x = 'acousticness', data = df) + + plt.subplot(4,3,3) + sns.boxplot(x = 'energy', data = df) + + plt.subplot(4,3,4) + sns.boxplot(x = 'instrumentalness', data = df) + + plt.subplot(4,3,5) + sns.boxplot(x = 'liveness', data = df) + + plt.subplot(4,3,6) + sns.boxplot(x = 'loudness', data = df) + + plt.subplot(4,3,7) + sns.boxplot(x = 'speechiness', data = df) + + plt.subplot(4,3,8) + sns.boxplot(x = 'tempo', data = df) + + plt.subplot(4,3,9) + sns.boxplot(x = 'time_signature', data = df) + + plt.subplot(4,3,10) + sns.boxplot(x = 'danceability', data = df) + + plt.subplot(4,3,11) + sns.boxplot(x = 'length', data = df) + + plt.subplot(4,3,12) + sns.boxplot(x = 'release_date', data = df) + ``` + + Ці дані трохи шумні: спостерігаючи кожен стовпець як boxplot, ви можете побачити аномалії. + + ![аномалії](../../../../5-Clustering/2-K-Means/images/boxplots.png) + +Ви могли б пройтися по набору даних і видалити ці аномалії, але це зробило б дані досить мінімальними. + +1. На даний момент виберіть, які стовпці ви будете використовувати для вправи кластеризації. Виберіть ті, що мають схожі діапазони, і закодуйте стовпець `artist_top_genre` як числові дані: + + ```python + from sklearn.preprocessing import LabelEncoder + le = LabelEncoder() + + X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')] + + y = df['artist_top_genre'] + + X['artist_top_genre'] = le.fit_transform(X['artist_top_genre']) + + y = le.transform(y) + ``` + +1. Тепер вам потрібно вибрати, скільки кластерів слід націлити. Ви знаєте, що є 3 жанри пісень, які ми виділили з набору даних, тому спробуємо 3: + + ```python + from sklearn.cluster import KMeans + + nclusters = 3 + seed = 0 + + km = KMeans(n_clusters=nclusters, random_state=seed) + km.fit(X) + + # Predict the cluster for each data point + + y_cluster_kmeans = km.predict(X) + y_cluster_kmeans + ``` + +Ви бачите масив із передбаченими кластерами (0, 1 або 2) для кожного рядка фрейму даних. + +1. Використовуйте цей масив для обчислення 'оцінки силуету': + + ```python + from sklearn import metrics + score = metrics.silhouette_score(X, y_cluster_kmeans) + score + ``` + +## Оцінка силуету + +Шукайте оцінку силуету ближче до 1. Ця оцінка варіюється від -1 до 1, і якщо оцінка дорівнює 1, кластер щільний і добре відокремлений від інших кластерів. Значення, близьке до 0, представляє кластер, що перекривається, із вибірками, дуже близькими до межі прийняття рішення сусідніх кластерів. [(Джерело)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam) + +Наша оцінка становить **0.53**, тобто посередині. Це свідчить про те, що наші дані не дуже добре підходять для цього типу кластеризації, але давайте продовжимо. + +### Вправа - створення моделі + +1. Імпортуйте `KMeans` і почніть процес кластеризації. + + ```python + from sklearn.cluster import KMeans + wcss = [] + + for i in range(1, 11): + kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42) + kmeans.fit(X) + wcss.append(kmeans.inertia_) + + ``` + + Тут є кілька частин, які варто пояснити. + + > 🎓 range: Це ітерації процесу кластеризації. + + > 🎓 random_state: "Визначає генерацію випадкових чисел для ініціалізації центроїдів." [Джерело](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans) + + > 🎓 WCSS: "сума квадратів всередині кластерів" вимірює середню квадратну відстань усіх точок у кластері до центроїда кластера. [Джерело](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce). + + > 🎓 Інерція: Алгоритми K-Means намагаються вибрати центроїди, щоб мінімізувати 'інерцію', "показник того, наскільки внутрішньо узгоджені кластери." [Джерело](https://scikit-learn.org/stable/modules/clustering.html). Значення додається до змінної wcss на кожній ітерації. + + > 🎓 k-means++: У [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) ви можете використовувати оптимізацію 'k-means++', яка "ініціалізує центроїди так, щоб вони (зазвичай) були віддалені один від одного, що призводить до ймовірно кращих результатів, ніж випадкова ініціалізація." + +### Метод ліктя + +Раніше ви припустили, що, оскільки ви націлилися на 3 жанри пісень, вам слід вибрати 3 кластери. Але чи так це? + +1. Використовуйте метод 'ліктя', щоб переконатися. + + ```python + plt.figure(figsize=(10,5)) + sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red') + plt.title('Elbow') + plt.xlabel('Number of clusters') + plt.ylabel('WCSS') + plt.show() + ``` + + Використовуйте змінну `wcss`, яку ви створили на попередньому кроці, щоб створити графік, що показує, де знаходиться 'згин' ліктя, який вказує на оптимальну кількість кластерів. Можливо, це **дійсно** 3! + + ![метод ліктя](../../../../5-Clustering/2-K-Means/images/elbow.png) + +## Вправа - відображення кластерів + +1. Спробуйте процес ще раз, цього разу встановивши три кластери, і відобразіть кластери як діаграму розсіювання: + + ```python + from sklearn.cluster import KMeans + kmeans = KMeans(n_clusters = 3) + kmeans.fit(X) + labels = kmeans.predict(X) + plt.scatter(df['popularity'],df['danceability'],c = labels) + plt.xlabel('popularity') + plt.ylabel('danceability') + plt.show() + ``` + +1. Перевірте точність моделі: + + ```python + labels = kmeans.labels_ + + correct_labels = sum(y == labels) + + print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size)) + + print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size))) + ``` + + Точність цієї моделі не дуже висока, і форма кластерів дає вам підказку, чому. + + ![кластери](../../../../5-Clustering/2-K-Means/images/clusters.png) + + Ці дані занадто незбалансовані, недостатньо корельовані, і між значеннями стовпців занадто велика дисперсія, щоб добре кластеризуватися. Насправді кластери, які формуються, ймовірно, сильно впливають або спотворюються трьома категоріями жанрів, які ми визначили вище. Це був процес навчання! + + У документації Scikit-learn ви можете побачити, що модель, як ця, з кластерами, які не дуже добре розмежовані, має проблему 'дисперсії': + + ![проблемні моделі](../../../../5-Clustering/2-K-Means/images/problems.png) + > Інфографіка з Scikit-learn + +## Дисперсія + +Дисперсія визначається як "середнє квадратів різниць від середнього" [(Джерело)](https://www.mathsisfun.com/data/standard-deviation.html). У контексті цієї проблеми кластеризації це стосується даних, де числа нашого набору даних мають тенденцію занадто сильно відхилятися від середнього. + +✅ Це чудовий момент, щоб подумати про всі способи, якими ви могли б виправити цю проблему. Ще трохи налаштувати дані? Використовувати інші стовпці? Використовувати інший алгоритм? Підказка: Спробуйте [масштабувати ваші дані](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/), щоб нормалізувати їх і протестувати інші стовпці. + +> Спробуйте цей '[калькулятор дисперсії](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)', щоб краще зрозуміти концепцію. + +--- + +## 🚀Виклик + +Проведіть деякий час із цим ноутбуком, налаштовуючи параметри. Чи можете ви покращити точність моделі, краще очистивши дані (наприклад, видаливши аномалії)? Ви можете використовувати ваги, щоб надати більшу вагу певним вибіркам даних. Що ще ви можете зробити, щоб створити кращі кластери? + +Підказка: Спробуйте масштабувати ваші дані. У ноутбуці є закоментований код, який додає стандартне масштабування, щоб стовпці даних більше нагадували один одного за діапазоном. Ви побачите, що хоча оцінка силуету знижується, 'згин' на графіку ліктя стає більш плавним. Це тому, що залишення даних без масштабування дозволяє даним із меншою дисперсією мати більшу вагу. Прочитайте трохи більше про цю проблему [тут](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226). + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Ознайомтеся з симулятором K-Means [наприклад, таким](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Ви можете використовувати цей інструмент для візуалізації точок даних і визначення їх центроїдів. Ви можете редагувати випадковість даних, кількість кластерів і кількість центроїдів. Чи допомагає це вам зрозуміти, як дані можуть бути згруповані? + +Також перегляньте [цей матеріал про K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) зі Стенфорда. + +## Завдання + +[Спробуйте різні методи кластеризації](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/5-Clustering/2-K-Means/assignment.md b/translations/uk/5-Clustering/2-K-Means/assignment.md new file mode 100644 index 00000000..030e89b5 --- /dev/null +++ b/translations/uk/5-Clustering/2-K-Means/assignment.md @@ -0,0 +1,25 @@ + +# Спробуйте різні методи кластеризації + +## Інструкції + +У цьому уроці ви дізналися про кластеризацію методом K-Means. Іноді метод K-Means не підходить для ваших даних. Створіть ноутбук, використовуючи дані з цих уроків або з іншого джерела (вкажіть джерело), і продемонструйте інший метод кластеризації, НЕ використовуючи K-Means. Що ви дізналися? + +## Критерії оцінювання + +| Критерії | Зразковий рівень | Достатній рівень | Потребує покращення | +| -------- | -------------------------------------------------------------- | ------------------------------------------------------------------- | ---------------------------- | +| | Представлено ноутбук із добре задокументованою моделлю кластеризації | Представлено ноутбук без належної документації та/або неповний | Подано неповну роботу | + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/5-Clustering/2-K-Means/solution/Julia/README.md b/translations/uk/5-Clustering/2-K-Means/solution/Julia/README.md new file mode 100644 index 00000000..5863bf73 --- /dev/null +++ b/translations/uk/5-Clustering/2-K-Means/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/5-Clustering/README.md b/translations/uk/5-Clustering/README.md new file mode 100644 index 00000000..56e3a6d6 --- /dev/null +++ b/translations/uk/5-Clustering/README.md @@ -0,0 +1,42 @@ + +# Моделі кластеризації для машинного навчання + +Кластеризація — це завдання машинного навчання, яке спрямоване на пошук об'єктів, схожих один на одного, і групування їх у групи, які називаються кластерами. Що відрізняє кластеризацію від інших підходів у машинному навчанні, так це те, що процес відбувається автоматично. Насправді, можна сказати, що це протилежність до навчання з учителем. + +## Регіональна тема: моделі кластеризації для музичних уподобань аудиторії Нігерії 🎧 + +Різноманітна аудиторія Нігерії має різноманітні музичні уподобання. Використовуючи дані, отримані зі Spotify (натхненні [цією статтею](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)), давайте розглянемо деяку популярну музику в Нігерії. Цей набір даних містить інформацію про такі показники пісень, як "танцювальність", "акустичність", гучність, "мовність", популярність і енергійність. Буде цікаво виявити закономірності в цих даних! + +![Програвач](../../../5-Clustering/images/turntable.jpg) + +> Фото від Marcela Laskoski на Unsplash + +У цій серії уроків ви відкриєте нові способи аналізу даних за допомогою технік кластеризації. Кластеризація особливо корисна, коли ваш набір даних не має міток. Якщо мітки є, тоді техніки класифікації, які ви вивчали в попередніх уроках, можуть бути більш корисними. Але в тих випадках, коли ви хочете згрупувати дані без міток, кластеризація — чудовий спосіб виявити закономірності. + +> Існують корисні інструменти з низьким рівнем кодування, які можуть допомогти вам навчитися працювати з моделями кластеризації. Спробуйте [Azure ML для цього завдання](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Уроки + +1. [Вступ до кластеризації](1-Visualize/README.md) +2. [Кластеризація методом K-Means](2-K-Means/README.md) + +## Авторство + +Ці уроки були написані з 🎶 [Jen Looper](https://www.twitter.com/jenlooper) за допомогою корисних рецензій від [Rishit Dagli](https://rishit_dagli) та [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan). + +Набір даних [Nigerian Songs](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) був отриманий з Kaggle, як дані зі Spotify. + +Корисні приклади K-Means, які допомогли створити цей урок, включають [дослідження ірисів](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), [вступний ноутбук](https://www.kaggle.com/prashant111/k-means-clustering-with-python) та [гіпотетичний приклад НГО](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering). + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/1-Introduction-to-NLP/README.md b/translations/uk/6-NLP/1-Introduction-to-NLP/README.md new file mode 100644 index 00000000..dd4b0dee --- /dev/null +++ b/translations/uk/6-NLP/1-Introduction-to-NLP/README.md @@ -0,0 +1,179 @@ + +# Вступ до обробки природної мови + +Цей урок охоплює коротку історію та важливі концепції *обробки природної мови* (NLP), підгалузі *комп'ютерної лінгвістики*. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +## Вступ + +NLP, як її зазвичай називають, є однією з найвідоміших областей, де машинне навчання було застосоване та використовується у виробничому програмному забезпеченні. + +✅ Чи можете ви назвати програмне забезпечення, яке ви використовуєте щодня і яке, ймовірно, має вбудовану обробку природної мови? А як щодо ваших текстових редакторів або мобільних додатків, які ви використовуєте регулярно? + +Ви дізнаєтеся про: + +- **Ідею мов**. Як розвивалися мови та які основні області їх вивчення. +- **Визначення та концепції**. Ви також дізнаєтеся визначення та концепції того, як комп'ютери обробляють текст, включаючи розбір, граматику та визначення іменників і дієслів. У цьому уроці є кілька завдань з програмування, а також вводяться кілька важливих концепцій, які ви навчитеся програмувати в наступних уроках. + +## Комп'ютерна лінгвістика + +Комп'ютерна лінгвістика — це галузь досліджень і розробок, яка протягом багатьох десятиліть вивчає, як комп'ютери можуть працювати з мовами, розуміти їх, перекладати та навіть спілкуватися ними. Обробка природної мови (NLP) — це споріднена галузь, яка зосереджена на тому, як комп'ютери можуть обробляти "природні", тобто людські, мови. + +### Приклад — диктування телефону + +Якщо ви коли-небудь диктували текст своєму телефону замість того, щоб друкувати, або запитували віртуального асистента, ваш голос було перетворено на текстову форму, а потім оброблено або *розібрано* мовою, якою ви говорили. Виявлені ключові слова були оброблені у формат, який телефон або асистент міг зрозуміти та виконати. + +![розуміння](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png) +> Справжнє лінгвістичне розуміння — це складно! Зображення [Джен Лупер](https://twitter.com/jenlooper) + +### Як ця технологія стала можливою? + +Це стало можливим завдяки тому, що хтось написав комп'ютерну програму для цього. Кілька десятиліть тому деякі письменники-фантасти передбачали, що люди здебільшого розмовлятимуть зі своїми комп'ютерами, і комп'ютери завжди розумітимуть, що вони мають на увазі. На жаль, це виявилося складнішою проблемою, ніж багато хто уявляв, і хоча сьогодні ця проблема набагато краще зрозуміла, існують значні труднощі у досягненні "ідеальної" обробки природної мови, особливо коли йдеться про розуміння значення речення. Це особливо складно, коли потрібно зрозуміти гумор або виявити емоції, такі як сарказм, у реченні. + +На цьому етапі ви можете згадати шкільні уроки, де вчитель пояснював частини граматики в реченні. У деяких країнах студентів навчають граматики та лінгвістики як окремого предмета, але в багатьох ці теми включені до вивчення мови: або вашої рідної мови в початковій школі (навчання читанню та письму), або, можливо, другої мови в середній школі. Не хвилюйтеся, якщо ви не є експертом у розрізненні іменників від дієслів або прислівників від прикметників! + +Якщо вам важко розрізняти *простий теперішній час* і *теперішній тривалий час*, ви не самотні. Це складно для багатьох людей, навіть для носіїв мови. Хороша новина полягає в тому, що комп'ютери дуже добре застосовують формальні правила, і ви навчитеся писати код, який може *розбирати* речення так само добре, як і людина. Більший виклик, який ви розглянете пізніше, — це розуміння *значення* та *емоційного забарвлення* речення. + +## Попередні знання + +Для цього уроку основною вимогою є вміння читати та розуміти мову цього уроку. Тут немає математичних задач або рівнянь для розв'язання. Хоча оригінальний автор написав цей урок англійською мовою, він також перекладений іншими мовами, тому ви можете читати переклад. Є приклади, де використовується кілька різних мов (для порівняння різних граматичних правил). Ці приклади *не* перекладаються, але пояснювальний текст перекладено, тому зміст має бути зрозумілим. + +Для завдань з програмування ви будете використовувати Python, а приклади написані для Python 3.8. + +У цьому розділі вам знадобляться: + +- **Розуміння Python 3**. Розуміння програмування мовою Python 3, цей урок використовує введення, цикли, читання файлів, масиви. +- **Visual Studio Code + розширення**. Ми будемо використовувати Visual Studio Code та його розширення для Python. Ви також можете використовувати будь-яке середовище розробки для Python на ваш вибір. +- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) — це спрощена бібліотека для обробки тексту на Python. Дотримуйтесь інструкцій на сайті TextBlob, щоб встановити її на свою систему (встановіть також корпуси, як показано нижче): + + ```bash + pip install -U textblob + python -m textblob.download_corpora + ``` + +> 💡 Порада: Ви можете запускати Python безпосередньо в середовищах VS Code. Ознайомтеся з [документацією](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) для отримання додаткової інформації. + +## Спілкування з машинами + +Історія спроб змусити комп'ютери розуміти людську мову налічує десятиліття, і одним із перших учених, які розглядали обробку природної мови, був *Алан Тюрінг*. + +### Тест Тюрінга + +Коли Тюрінг досліджував *штучний інтелект* у 1950-х роках, він розглядав можливість проведення тесту у вигляді розмови між людиною та комп'ютером (через друковану кореспонденцію), де людина в розмові не була впевнена, чи спілкується вона з іншою людиною чи комп'ютером. + +Якщо після певного часу розмови людина не могла визначити, чи відповіді надходять від комп'ютера чи ні, чи можна тоді сказати, що комп'ютер *мислить*? + +### Натхнення — "гра в імітацію" + +Ідея для цього виникла з вечірньої гри під назвою *Гра в імітацію*, де допитувач знаходиться в кімнаті наодинці і має визначити, хто з двох людей (в іншій кімнаті) є чоловіком, а хто — жінкою. Допитувач може надсилати записки і має намагатися придумати запитання, відповіді на які розкриють стать загадкової особи. Звісно, гравці в іншій кімнаті намагаються заплутати допитувача, відповідаючи так, щоб ввести його в оману, але при цьому створюючи враження чесних відповідей. + +### Розробка Елізи + +У 1960-х роках учений з MIT на ім'я *Джозеф Вайзенбаум* розробив [*Елізу*](https://wikipedia.org/wiki/ELIZA), комп'ютерного "терапевта", який ставив людині запитання і створював враження, що розуміє її відповіді. Однак, хоча Еліза могла розбирати речення і визначати певні граматичні конструкції та ключові слова, щоб дати розумну відповідь, не можна було сказати, що вона *розуміє* речення. Якщо Елізі подавали речення у форматі "**Я є** сумний", вона могла б переставити слова і замінити їх, щоб сформувати відповідь "Як довго **ви були** сумним". + +Це створювало враження, що Еліза розуміє твердження і ставить уточнююче запитання, тоді як насправді вона просто змінювала час і додавала кілька слів. Якщо Еліза не могла визначити ключове слово, на яке у неї була відповідь, вона давала випадкову відповідь, яка могла б підійти до багатьох різних тверджень. Елізу можна було легко обдурити, наприклад, якщо користувач написав "**Ти є** велосипедом", вона могла відповісти "Як довго **я був** велосипедом?", замість більш логічної відповіді. + +[![Розмова з Елізою](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Розмова з Елізою") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео про оригінальну програму ELIZA + +> Примітка: Ви можете прочитати оригінальний опис [Елізи](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract), опублікований у 1966 році, якщо у вас є обліковий запис ACM. Або ж прочитайте про Елізу на [Вікіпедії](https://wikipedia.org/wiki/ELIZA). + +## Вправа — програмування базового розмовного бота + +Розмовний бот, як Еліза, — це програма, яка отримує введення від користувача і створює враження, що розуміє та відповідає розумно. На відміну від Елізи, наш бот не матиме кількох правил, які створюють враження інтелектуальної розмови. Натомість наш бот матиме лише одну здатність — підтримувати розмову випадковими відповідями, які можуть підійти до будь-якої тривіальної розмови. + +### План + +Ваші кроки при створенні розмовного бота: + +1. Вивести інструкції для користувача, як взаємодіяти з ботом +2. Запустити цикл + 1. Прийняти введення від користувача + 2. Якщо користувач попросив вийти, завершити роботу + 3. Обробити введення користувача і визначити відповідь (у цьому випадку відповідь — це випадковий вибір із списку можливих загальних відповідей) + 4. Вивести відповідь +3. Повернутися до кроку 2 + +### Створення бота + +Давайте створимо бота. Почнемо з визначення кількох фраз. + +1. Створіть цього бота самостійно на Python, використовуючи такі випадкові відповіді: + + ```python + random_responses = ["That is quite interesting, please tell me more.", + "I see. Do go on.", + "Why do you say that?", + "Funny weather we've been having, isn't it?", + "Let's change the subject.", + "Did you catch the game last night?"] + ``` + + Ось приклад виводу, який може вас спрямувати (введення користувача починається зі знака `>`): + + ```output + Hello, I am Marvin, the simple robot. + You can end this conversation at any time by typing 'bye' + After typing each answer, press 'enter' + How are you today? + > I am good thanks + That is quite interesting, please tell me more. + > today I went for a walk + Did you catch the game last night? + > I did, but my team lost + Funny weather we've been having, isn't it? + > yes but I hope next week is better + Let's change the subject. + > ok, lets talk about music + Why do you say that? + > because I like music! + Why do you say that? + > bye + It was nice talking to you, goodbye! + ``` + + Один із можливих розв'язків завдання знаходиться [тут](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py) + + ✅ Зупиніться і подумайте + + 1. Чи вважаєте ви, що випадкові відповіді могли б "обдурити" когось, змусивши думати, що бот дійсно розуміє їх? + 2. Які функції потрібні боту, щоб бути ефективнішим? + 3. Якщо бот дійсно міг би "розуміти" значення речення, чи потрібно йому було б "запам'ятовувати" значення попередніх речень у розмові? + +--- + +## 🚀 Виклик + +Виберіть один із пунктів "зупиніться і подумайте", наведених вище, і спробуйте реалізувати його в коді або напишіть рішення на папері у вигляді псевдокоду. + +У наступному уроці ви дізнаєтеся про низку інших підходів до розбору природної мови та машинного навчання. + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Ознайомтеся з наведеними нижче посиланнями для подальшого читання. + +### Джерела + +1. Шуберт, Ленгарт, "Комп'ютерна лінгвістика", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = . +2. Принстонський університет "Про WordNet." [WordNet](https://wordnet.princeton.edu/). Принстонський університет. 2010. + +## Завдання + +[Знайдіть бота](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/1-Introduction-to-NLP/assignment.md b/translations/uk/6-NLP/1-Introduction-to-NLP/assignment.md new file mode 100644 index 00000000..ac8007ea --- /dev/null +++ b/translations/uk/6-NLP/1-Introduction-to-NLP/assignment.md @@ -0,0 +1,25 @@ + +# Пошук бота + +## Інструкції + +Боти є всюди. Ваше завдання: знайти одного та "всиновити" його! Ви можете знайти їх на вебсайтах, у банківських додатках і навіть по телефону, наприклад, коли телефонуєте до фінансових компаній за консультацією або для отримання інформації про рахунок. Проаналізуйте бота і спробуйте його заплутати. Якщо вам вдалося це зробити, як ви думаєте, чому це сталося? Напишіть короткий звіт про свій досвід. + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | --------------------- | +| | Написано повну сторінку, яка пояснює передбачувану архітектуру бота та описує ваш досвід взаємодії з ним | Робота неповна або недостатньо досліджена | Робота не подана | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, звертаємо вашу увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/2-Tasks/README.md b/translations/uk/6-NLP/2-Tasks/README.md new file mode 100644 index 00000000..9e734107 --- /dev/null +++ b/translations/uk/6-NLP/2-Tasks/README.md @@ -0,0 +1,224 @@ + +# Загальні завдання та техніки обробки природної мови + +Для більшості завдань з *обробки природної мови* текст, який потрібно обробити, необхідно розбити, проаналізувати, а результати зберегти або звірити з правилами та наборами даних. Ці завдання дозволяють програмісту визначити _значення_, _намір_ або лише _частоту_ термінів і слів у тексті. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +Давайте розглянемо загальні техніки, які використовуються для обробки тексту. У поєднанні з машинним навчанням ці техніки допомагають ефективно аналізувати великі обсяги тексту. Однак перед тим, як застосовувати ML до цих завдань, давайте зрозуміємо проблеми, з якими стикається спеціаліст з NLP. + +## Загальні завдання NLP + +Існують різні способи аналізу тексту, з яким ви працюєте. Є завдання, які ви можете виконувати, і через ці завдання ви зможете краще зрозуміти текст і зробити висновки. Зазвичай ці завдання виконуються послідовно. + +### Токенізація + +Мабуть, перше, що повинні зробити більшість алгоритмів NLP, — це розбити текст на токени або слова. Хоча це звучить просто, врахування пунктуації та розділових знаків у різних мовах може ускладнити процес. Можливо, вам доведеться використовувати різні методи для визначення меж. + +![токенізація](../../../../6-NLP/2-Tasks/images/tokenization.png) +> Токенізація речення з **Гордості і упередження**. Інфографіка від [Jen Looper](https://twitter.com/jenlooper) + +### Вбудовування слів + +[Вбудовування слів](https://wikipedia.org/wiki/Word_embedding) — це спосіб числового представлення текстових даних. Вбудовування виконується так, щоб слова зі схожим значенням або ті, що часто використовуються разом, групувалися поруч. + +![вбудовування слів](../../../../6-NLP/2-Tasks/images/embedding.png) +> "Я маю найвищу повагу до ваших нервів, вони мої старі друзі." - Вбудовування слів для речення з **Гордості і упередження**. Інфографіка від [Jen Looper](https://twitter.com/jenlooper) + +✅ Спробуйте [цей цікавий інструмент](https://projector.tensorflow.org/) для експериментів із вбудовуванням слів. Натискання на одне слово показує групи схожих слів: 'іграшка' групується з 'дисней', 'лего', 'плейстейшн' і 'консоль'. + +### Розбір і визначення частин мови + +Кожне слово, яке було токенізоване, може бути позначене як частина мови — іменник, дієслово або прикметник. Наприклад, речення `швидка червона лисиця перестрибнула через ледачого коричневого собаку` може бути позначене як лисиця = іменник, перестрибнула = дієслово. + +![розбір](../../../../6-NLP/2-Tasks/images/parse.png) + +> Розбір речення з **Гордості і упередження**. Інфографіка від [Jen Looper](https://twitter.com/jenlooper) + +Розбір — це визначення, які слова пов'язані між собою в реченні. Наприклад, `швидка червона лисиця перестрибнула` — це послідовність прикметник-іменник-дієслово, яка відокремлена від послідовності `ледачий коричневий собака`. + +### Частота слів і фраз + +Корисною процедурою при аналізі великого тексту є створення словника всіх слів або фраз, що вас цікавлять, і підрахунок, як часто вони зустрічаються. Наприклад, у фразі `швидка червона лисиця перестрибнула через ледачого коричневого собаку` слово "the" зустрічається 2 рази. + +Розглянемо приклад тексту, де ми рахуємо частоту слів. У вірші Редьярда Кіплінга "Переможці" є такий уривок: + +```output +What the moral? Who rides may read. +When the night is thick and the tracks are blind +A friend at a pinch is a friend, indeed, +But a fool to wait for the laggard behind. +Down to Gehenna or up to the Throne, +He travels the fastest who travels alone. +``` + +Оскільки частота фраз може бути чутливою або нечутливою до регістру, фраза `a friend` має частоту 2, `the` — 6, а `travels` — 2. + +### N-грами + +Текст можна розбити на послідовності слів заданої довжини: одне слово (уніграм), два слова (біграми), три слова (триграми) або будь-яку кількість слів (n-грам). + +Наприклад, `швидка червона лисиця перестрибнула через ледачого коричневого собаку` з n-грамами довжини 2 дає такі n-грами: + +1. швидка червона +2. червона лисиця +3. лисиця перестрибнула +4. перестрибнула через +5. через ледачого +6. ледачого коричневого +7. коричневого собаку + +Це можна уявити як ковзне вікно по реченню. Ось приклад для n-грамів із 3 слів, де n-грам виділено жирним у кожному реченні: + +1. **швидка червона лисиця** перестрибнула через ледачого коричневого собаку +2. швидка **червона лисиця перестрибнула** через ледачого коричневого собаку +3. швидка червона **лисиця перестрибнула через** ледачого коричневого собаку +4. швидка червона лисиця **перестрибнула через ледачого** коричневого собаку +5. швидка червона лисиця перестрибнула **через ледачого коричневого** собаку +6. швидка червона лисиця перестрибнула через **ледачого коричневого собаку** + +![ковзне вікно n-грамів](../../../../6-NLP/2-Tasks/images/n-grams.gif) + +> Значення n-граму = 3: Інфографіка від [Jen Looper](https://twitter.com/jenlooper) + +### Витяг іменних фраз + +У більшості речень є іменник, який є підметом або додатком речення. В англійській мові його часто можна визначити за словами 'a', 'an' або 'the', які передують йому. Визначення підмета або додатка речення шляхом "витягу іменної фрази" є поширеним завданням NLP для розуміння значення речення. + +✅ У реченні "Я не можу визначити годину, місце, погляд чи слова, які заклали основу. Це було занадто давно. Я був у середині, перш ніж зрозумів, що почав." чи можете ви визначити іменні фрази? + +У реченні `швидка червона лисиця перестрибнула через ледачого коричневого собаку` є 2 іменні фрази: **швидка червона лисиця** і **ледачий коричневий собака**. + +### Аналіз настроїв + +Речення або текст можна проаналізувати на настрій, тобто наскільки він *позитивний* чи *негативний*. Настрій вимірюється за *полярністю* та *об'єктивністю/суб'єктивністю*. Полярність вимірюється від -1.0 до 1.0 (негативний до позитивного), а об'єктивність — від 0.0 до 1.0 (найбільш об'єктивний до найбільш суб'єктивного). + +✅ Пізніше ви дізнаєтеся, що існують різні способи визначення настрою за допомогою машинного навчання, але один із способів — це мати список слів і фраз, які класифіковані як позитивні чи негативні експертом, і застосовувати цю модель до тексту для розрахунку полярності. Чи можете ви уявити, як це працює в одних випадках і менш ефективно в інших? + +### Інфлексія + +Інфлексія дозволяє взяти слово та отримати його однину або множину. + +### Лематизація + +*Лема* — це корінь або основне слово для набору слів, наприклад, *летів*, *літає*, *літаючий* мають лему дієслова *літати*. + +Також існують корисні бази даних для дослідників NLP, зокрема: + +### WordNet + +[WordNet](https://wordnet.princeton.edu/) — це база даних слів, синонімів, антонімів та багатьох інших деталей для кожного слова багатьма мовами. Вона надзвичайно корисна для створення перекладів, перевірки орфографії або будь-яких мовних інструментів. + +## Бібліотеки NLP + +На щастя, вам не потрібно створювати всі ці техніки самостійно, оскільки існують чудові бібліотеки Python, які роблять їх набагато доступнішими для розробників, які не спеціалізуються на обробці природної мови чи машинному навчанні. У наступних уроках буде більше прикладів, але тут ви дізнаєтеся кілька корисних прикладів, які допоможуть вам із наступним завданням. + +### Вправа - використання бібліотеки `TextBlob` + +Давайте використаємо бібліотеку TextBlob, оскільки вона містить корисні API для вирішення таких завдань. TextBlob "побудована на основі [NLTK](https://nltk.org) та [pattern](https://github.com/clips/pattern) і добре працює з обома." Вона має значну кількість ML, вбудованого в її API. + +> Примітка: Корисний [швидкий старт](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) доступний для TextBlob і рекомендується для досвідчених розробників Python. + +Коли ви намагаєтеся визначити *іменні фрази*, TextBlob пропонує кілька варіантів екстракторів для їх пошуку. + +1. Ознайомтеся з `ConllExtractor`. + + ```python + from textblob import TextBlob + from textblob.np_extractors import ConllExtractor + # import and create a Conll extractor to use later + extractor = ConllExtractor() + + # later when you need a noun phrase extractor: + user_input = input("> ") + user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified + np = user_input_blob.noun_phrases + ``` + + > Що тут відбувається? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) — це "екстрактор іменних фраз, який використовує розбір на основі моделі, навченої на корпусі ConLL-2000." ConLL-2000 стосується Конференції з обчислювального навчання природної мови 2000 року. Кожного року конференція проводила семінар для вирішення складної проблеми NLP, і в 2000 році це було виділення іменних фраз. Модель була навчена на текстах Wall Street Journal, використовуючи "розділи 15-18 як навчальні дані (211727 токенів) і розділ 20 як тестові дані (47377 токенів)". Ви можете ознайомитися з процедурами [тут](https://www.clips.uantwerpen.be/conll2000/chunking/) і [результатами](https://ifarm.nl/erikt/research/np-chunking.html). + +### Завдання - покращення вашого бота за допомогою NLP + +У попередньому уроці ви створили дуже простого бота для запитань і відповідей. Тепер ви зробите Марвіна трохи більш співчутливим, аналізуючи ваш ввід на настрій і друкуючи відповідь, яка відповідає настрою. Вам також потрібно буде визначити `noun_phrase` і запитати про неї. + +Ваші кроки для створення кращого розмовного бота: + +1. Надрукуйте інструкції, які пояснюють користувачеві, як взаємодіяти з ботом. +2. Почніть цикл: + 1. Прийміть ввід користувача. + 2. Якщо користувач попросив вийти, завершіть роботу. + 3. Обробіть ввід користувача та визначте відповідь, яка відповідає настрою. + 4. Якщо в настрої виявлено іменну фразу, зробіть її множиною та запитайте більше про цю тему. + 5. Надрукуйте відповідь. +3. Поверніться до кроку 2. + +Ось фрагмент коду для визначення настрою за допомогою TextBlob. Зверніть увагу, що є лише чотири *градації* відповіді на настрій (ви можете додати більше, якщо хочете): + +```python +if user_input_blob.polarity <= -0.5: + response = "Oh dear, that sounds bad. " +elif user_input_blob.polarity <= 0: + response = "Hmm, that's not great. " +elif user_input_blob.polarity <= 0.5: + response = "Well, that sounds positive. " +elif user_input_blob.polarity <= 1: + response = "Wow, that sounds great. " +``` + +Ось приклад виводу, який може вас спрямувати (ввід користувача позначено рядками, що починаються з >): + +```output +Hello, I am Marvin, the friendly robot. +You can end this conversation at any time by typing 'bye' +After typing each answer, press 'enter' +How are you today? +> I am ok +Well, that sounds positive. Can you tell me more? +> I went for a walk and saw a lovely cat +Well, that sounds positive. Can you tell me more about lovely cats? +> cats are the best. But I also have a cool dog +Wow, that sounds great. Can you tell me more about cool dogs? +> I have an old hounddog but he is sick +Hmm, that's not great. Can you tell me more about old hounddogs? +> bye +It was nice talking to you, goodbye! +``` + +Можливе рішення завдання доступне [тут](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py). + +✅ Перевірка знань + +1. Чи вважаєте ви, що співчутливі відповіді можуть "обдурити" когось, змусивши думати, що бот дійсно їх розуміє? +2. Чи робить визначення іменної фрази бота більш "переконливим"? +3. Чому витяг іменної фрази з речення є корисним завданням? + +--- + +Реалізуйте бота з попередньої перевірки знань і протестуйте його на другові. Чи може він їх обдурити? Чи можете ви зробити вашого бота більш "переконливим"? + +## 🚀Виклик + +Візьміть завдання з попередньої перевірки знань і спробуйте його реалізувати. Протестуйте бота на другові. Чи може він їх обдурити? Чи можете ви зробити вашого бота більш "переконливим"? + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +У наступних уроках ви дізнаєтеся більше про аналіз настроїв. Досліджуйте цю цікаву техніку в таких статтях, як ці на [KDNuggets](https://www.kdnuggets.com/tag/nlp). + +## Завдання + +[Зробіть бота, який відповідає](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/2-Tasks/assignment.md b/translations/uk/6-NLP/2-Tasks/assignment.md new file mode 100644 index 00000000..d8dd751b --- /dev/null +++ b/translations/uk/6-NLP/2-Tasks/assignment.md @@ -0,0 +1,25 @@ + +# Зробіть бота, який відповідає + +## Інструкції + +У попередніх уроках ви запрограмували базового бота для спілкування. Цей бот дає випадкові відповіді, поки ви не скажете 'прощавай'. Чи можете ви зробити відповіді трохи менш випадковими і налаштувати їх так, щоб вони спрацьовували, якщо ви скажете щось конкретне, наприклад, 'чому' або 'як'? Подумайте, як машинне навчання може зробити цей тип роботи менш ручним, коли ви розширюєте функціонал вашого бота. Ви можете використовувати бібліотеки NLTK або TextBlob, щоб полегшити виконання завдань. + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | --------------------------------------------- | ------------------------------------------------ | ----------------------- | +| | Представлено новий файл bot.py з документацією | Представлено новий файл бота, але він містить помилки | Файл не представлено | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/3-Translation-Sentiment/README.md b/translations/uk/6-NLP/3-Translation-Sentiment/README.md new file mode 100644 index 00000000..c36a0596 --- /dev/null +++ b/translations/uk/6-NLP/3-Translation-Sentiment/README.md @@ -0,0 +1,200 @@ + +# Переклад та аналіз настрою за допомогою ML + +У попередніх уроках ви дізналися, як створити базового бота, використовуючи `TextBlob`, бібліотеку, яка використовує машинне навчання для виконання основних завдань обробки природної мови, таких як вилучення іменних фраз. Ще одним важливим викликом у комп'ютерній лінгвістиці є точний _переклад_ речення з однієї мови на іншу. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +Переклад — це дуже складна задача, ускладнена тим, що існують тисячі мов, кожна з яких має дуже різні граматичні правила. Один із підходів полягає в тому, щоб перетворити формальні граматичні правила однієї мови, наприклад англійської, у структуру, яка не залежить від мови, а потім перекласти її, перетворивши назад на іншу мову. Цей підхід передбачає виконання наступних кроків: + +1. **Ідентифікація**. Визначити або позначити слова в мові введення як іменники, дієслова тощо. +2. **Створення перекладу**. Зробити прямий переклад кожного слова у формат цільової мови. + +### Приклад речення, англійська до ірландської + +В англійській мові речення _I feel happy_ складається з трьох слів у такому порядку: + +- **підмет** (I) +- **дієслово** (feel) +- **прикметник** (happy) + +Однак в ірландській мові те саме речення має зовсім іншу граматичну структуру — емоції, такі як "*happy*" або "*sad*", виражаються як такі, що *перебувають на вас*. + +Англійська фраза `I feel happy` в ірландській буде `Tá athas orm`. *Буквальний* переклад буде `Happy is upon me`. + +Ірландський мовник, перекладаючи на англійську, скаже `I feel happy`, а не `Happy is upon me`, тому що він розуміє значення речення, навіть якщо слова та структура речення різні. + +Формальний порядок речення в ірландській: + +- **дієслово** (Tá або is) +- **прикметник** (athas, або happy) +- **підмет** (orm, або upon me) + +## Переклад + +Наївна програма перекладу може перекладати лише слова, ігноруючи структуру речення. + +✅ Якщо ви вивчали другу (або третю чи більше) мову як дорослий, ви могли почати з того, що думали своєю рідною мовою, перекладали концепцію слово за словом у своїй голові на другу мову, а потім озвучували свій переклад. Це схоже на те, що роблять наївні комп’ютерні програми перекладу. Важливо пройти цей етап, щоб досягти рівня вільного володіння мовою! + +Наївний переклад призводить до поганих (а іноді й смішних) помилок перекладу: `I feel happy` буквально перекладається як `Mise bhraitheann athas` в ірландській. Це означає (буквально) `me feel happy` і не є правильним ірландським реченням. Незважаючи на те, що англійська та ірландська — це мови, якими розмовляють на двох сусідніх островах, вони дуже різні з точки зору граматичних структур. + +> Ви можете переглянути деякі відео про ірландські лінгвістичні традиції, наприклад [це](https://www.youtube.com/watch?v=mRIaLSdRMMs) + +### Підходи машинного навчання + +Досі ви дізналися про підхід формальних правил до обробки природної мови. Інший підхід полягає в тому, щоб ігнорувати значення слів і _замість цього використовувати машинне навчання для виявлення шаблонів_. Це може працювати для перекладу, якщо у вас є багато текстів (*корпус*) або текстів (*корпуси*) як у вихідній, так і в цільовій мовах. + +Наприклад, розглянемо випадок *Гордість і упередження*, відомого англійського роману, написаного Джейн Остін у 1813 році. Якщо ви звернетеся до книги англійською мовою та людського перекладу книги французькою мовою, ви зможете виявити фрази в одній, які _ідіоматично_ перекладені в іншу. Ви зробите це за хвилину. + +Наприклад, коли англійська фраза `I have no money` буквально перекладається французькою, вона може стати `Je n'ai pas de monnaie`. "Monnaie" — це складний французький "хибний когнат", оскільки "money" і "monnaie" не є синонімами. Кращий переклад, який може зробити людина, буде `Je n'ai pas d'argent`, оскільки він краще передає значення того, що у вас немає грошей (а не "дрібних монет", що є значенням "monnaie"). + +![monnaie](../../../../6-NLP/3-Translation-Sentiment/images/monnaie.png) + +> Зображення від [Jen Looper](https://twitter.com/jenlooper) + +Якщо модель ML має достатньо людських перекладів для побудови моделі, вона може покращити точність перекладів, визначаючи загальні шаблони в текстах, які раніше перекладали експерти, які володіють обома мовами. + +### Вправа - переклад + +Ви можете використовувати `TextBlob` для перекладу речень. Спробуйте відому першу фразу з **Гордості та упередження**: + +```python +from textblob import TextBlob + +blob = TextBlob( + "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!" +) +print(blob.translate(to="fr")) + +``` + +`TextBlob` досить добре справляється з перекладом: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!". + +Можна стверджувати, що переклад TextBlob набагато точніший, ніж французький переклад книги 1932 року, виконаний В. Леконтом і Ш. Пресуаром: + +"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles." + +У цьому випадку переклад, заснований на ML, справляється краще, ніж людський перекладач, який зайво додає слова в текст оригінального автора для "ясності". + +> Що тут відбувається? І чому TextBlob так добре справляється з перекладом? Справа в тому, що за лаштунками він використовує Google Translate, складний AI, здатний аналізувати мільйони фраз, щоб передбачити найкращі рядки для виконання завдання. Тут немає нічого ручного, і вам потрібне підключення до Інтернету, щоб використовувати `blob.translate`. + +✅ Спробуйте ще кілька речень. Що краще, ML чи людський переклад? У яких випадках? + +## Аналіз настрою + +Ще одна область, де машинне навчання може працювати дуже добре, — це аналіз настрою. Нелінійний підхід до настрою полягає в тому, щоб визначити слова та фрази, які є "позитивними" та "негативними". Потім, маючи новий текст, обчислити загальне значення позитивних, негативних і нейтральних слів, щоб визначити загальний настрій. + +Цей підхід легко обдурити, як ви могли бачити в завданні з Марвіном — речення `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` є саркастичним, негативним реченням, але простий алгоритм виявляє "great", "wonderful", "glad" як позитивні та "waste", "lost" і "dark" як негативні. Загальний настрій коливається через ці суперечливі слова. + +✅ Зупиніться на секунду і подумайте, як ми передаємо сарказм як людські мовники. Інтонація відіграє велику роль. Спробуйте сказати фразу "Well, that film was awesome" різними способами, щоб зрозуміти, як ваш голос передає значення. + +### Підходи ML + +Підхід ML полягатиме в тому, щоб вручну зібрати негативні та позитивні тексти — твіти, або огляди фільмів, або будь-що, де людина дала оцінку *і* написала думку. Потім можна застосувати техніки NLP до думок і оцінок, щоб виявити шаблони (наприклад, позитивні огляди фільмів частіше містять фразу "Oscar worthy", ніж негативні огляди фільмів, або позитивні огляди ресторанів частіше містять "gourmet", ніж "disgusting"). + +> ⚖️ **Приклад**: Якщо ви працювали в офісі політика і обговорювався новий закон, виборці могли писати до офісу електронні листи на підтримку або проти конкретного нового закону. Припустимо, вам доручено читати ці електронні листи та сортувати їх у 2 купи, *за* і *проти*. Якщо було багато електронних листів, ви могли б бути перевантажені, намагаючись прочитати їх усі. Хіба не було б чудово, якби бот міг прочитати їх усі за вас, зрозуміти їх і сказати, до якої купи належить кожен лист? +> +> Один із способів досягти цього — використати машинне навчання. Ви б тренували модель на частині електронних листів *проти* і частині електронних листів *за*. Модель схилялася б до асоціації фраз і слів із стороною "проти" та стороною "за", *але вона не розуміла б жодного змісту*, лише те, що певні слова та шаблони частіше з’являються в електронному листі *проти* або *за*. Ви могли б протестувати її на деяких електронних листах, які ви не використовували для навчання моделі, і перевірити, чи дійшла вона до того ж висновку, що й ви. Потім, коли ви були б задоволені точністю моделі, ви могли б обробляти майбутні електронні листи, не читаючи кожен. + +✅ Чи звучить цей процес як процеси, які ви використовували в попередніх уроках? + +## Вправа - сентиментальні речення + +Настрій вимірюється за допомогою *полярності* від -1 до 1, де -1 — це найбільш негативний настрій, а 1 — найбільш позитивний. Настрій також вимірюється за шкалою від 0 до 1 для об’єктивності (0) і суб’єктивності (1). + +Ще раз погляньте на *Гордість і упередження* Джейн Остін. Текст доступний тут: [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm). Наведений нижче приклад показує коротку програму, яка аналізує настрій першого та останнього речень книги та відображає його полярність настрою та оцінку суб’єктивності/об’єктивності. + +Ви повинні використовувати бібліотеку `TextBlob` (описану вище), щоб визначити `sentiment` (вам не потрібно писати власний калькулятор настрою) у наступному завданні. + +```python +from textblob import TextBlob + +quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.""" + +quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them.""" + +sentiment1 = TextBlob(quote1).sentiment +sentiment2 = TextBlob(quote2).sentiment + +print(quote1 + " has a sentiment of " + str(sentiment1)) +print(quote2 + " has a sentiment of " + str(sentiment2)) +``` + +Ви бачите наступний результат: + +```output +It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146) + +Darcy, as well as Elizabeth, really loved them; and they were + both ever sensible of the warmest gratitude towards the persons + who, by bringing her into Derbyshire, had been the means of + uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8) +``` + +## Завдання - перевірка полярності настрою + +Ваше завдання — визначити, використовуючи полярність настрою, чи має *Гордість і упередження* більше абсолютно позитивних речень, ніж абсолютно негативних. Для цього завдання ви можете припустити, що оцінка полярності 1 або -1 є абсолютно позитивною або негативною відповідно. + +**Кроки:** + +1. Завантажте [копію Гордість і упередження](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) з Project Gutenberg як .txt файл. Видаліть метадані на початку та в кінці файлу, залишивши лише оригінальний текст. +2. Відкрийте файл у Python і витягніть вміст як рядок. +3. Створіть TextBlob, використовуючи рядок книги. +4. Аналізуйте кожне речення в книзі в циклі. + 1. Якщо полярність дорівнює 1 або -1, збережіть речення в масиві або списку позитивних або негативних повідомлень. +5. Наприкінці виведіть усі позитивні речення та негативні речення (окремо) і їх кількість. + +Ось приклад [розв’язку](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb). + +✅ Перевірка знань + +1. Настрій базується на словах, використаних у реченні, але чи *розуміє* код ці слова? +2. Чи вважаєте ви, що полярність настрою точна, іншими словами, чи ви *згодні* з оцінками? + 1. Зокрема, чи погоджуєтеся ви чи не погоджуєтеся з абсолютною **позитивною** полярністю наступних речень? + * “What an excellent father you have, girls!” said she, when the door was shut. + * “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect. + * How wonderfully these sort of things occur! + * I have the greatest dislike in the world to that sort of thing. + * Charlotte is an excellent manager, I dare say. + * “This is delightful indeed! + * I am so happy! + * Your idea of the ponies is delightful. + 2. Наступні 3 речення були оцінені як абсолютно позитивні, але при уважному читанні вони не є позитивними. Чому аналіз настрою вважав їх позитивними реченнями? + * Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power. + * If I could but see you as happy! + * Our distress, my dear Lizzy, is very great. + 3. Чи погоджуєтеся ви чи не погоджуєтеся з абсолютною **негативною** полярністю наступних речень? + - Everybody is disgusted with his pride. + - “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful. + - The pause was to Elizabeth’s feelings dreadful. + - It would be dreadful! + +✅ Будь-який шанувальник Джейн Остін зрозуміє, що вона часто використовує свої книги для критики більш абсурдних аспектів англійського суспільства епохи Регентства. Елізабет Беннет, головна героїня *Гордості та упередження*, є уважним соціальним спостерігачем (як і авторка), і її мова часто сильно нюансована. Навіть містер Дарсі (коханий у цій історії) зазначає грайливе та дражливе використання мови Елізабет: "I have had the pleasure of your acquaintance long enough to know that you find great enjoyment in occasionally professing opinions which in fact are not your own." + +--- + +## 🚀Завдання + +Чи можете ви зробити Марвіна ще кращим, витягуючи інші особливості з введення користувача? + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання +Існує багато способів визначення настрою тексту. Подумайте про бізнес-додатки, які можуть використовувати цю техніку. Замисліться над тим, як вона може працювати неправильно. Дізнайтеся більше про складні системи корпоративного рівня, які аналізують настрій, такі як [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott). Перевірте деякі речення з "Гордості та упередження", наведені вище, і подивіться, чи зможе система виявити нюанси. + +## Завдання + +[Поетична ліцензія](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, звертаємо вашу увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/3-Translation-Sentiment/assignment.md b/translations/uk/6-NLP/3-Translation-Sentiment/assignment.md new file mode 100644 index 00000000..9361f2e5 --- /dev/null +++ b/translations/uk/6-NLP/3-Translation-Sentiment/assignment.md @@ -0,0 +1,25 @@ + +# Поетична ліцензія + +## Інструкції + +У [цьому ноутбуці](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) ви знайдете понад 500 віршів Емілі Дікінсон, які раніше були проаналізовані на емоційність за допомогою сервісу Azure Text Analytics. Використовуючи цей набір даних, проаналізуйте його за допомогою технік, описаних у уроці. Чи відповідає запропонована емоційність вірша рішенню більш досконалого сервісу Azure? Чому або чому ні, на вашу думку? Чи щось вас здивувало? + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | ------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------ | +| | Ноутбук представлений із ґрунтовним аналізом зразка творчості автора | Ноутбук неповний або не виконує аналіз | Ноутбук не представлений | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/3-Translation-Sentiment/solution/Julia/README.md b/translations/uk/6-NLP/3-Translation-Sentiment/solution/Julia/README.md new file mode 100644 index 00000000..6c62e5d2 --- /dev/null +++ b/translations/uk/6-NLP/3-Translation-Sentiment/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/3-Translation-Sentiment/solution/R/README.md b/translations/uk/6-NLP/3-Translation-Sentiment/solution/R/README.md new file mode 100644 index 00000000..eb489d90 --- /dev/null +++ b/translations/uk/6-NLP/3-Translation-Sentiment/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/4-Hotel-Reviews-1/README.md b/translations/uk/6-NLP/4-Hotel-Reviews-1/README.md new file mode 100644 index 00000000..01ed294b --- /dev/null +++ b/translations/uk/6-NLP/4-Hotel-Reviews-1/README.md @@ -0,0 +1,417 @@ + +# Аналіз настроїв за відгуками про готелі - обробка даних + +У цьому розділі ви використаєте техніки з попередніх уроків для проведення дослідницького аналізу великого набору даних. Після того, як ви добре зрозумієте корисність різних колонок, ви навчитеся: + +- як видаляти непотрібні колонки +- як обчислювати нові дані на основі існуючих колонок +- як зберігати отриманий набір даних для використання у фінальному завданні + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +### Вступ + +До цього моменту ви дізналися, що текстові дані значно відрізняються від числових типів даних. Якщо це текст, написаний або сказаний людиною, його можна аналізувати для пошуку шаблонів, частот, настроїв і значень. Цей урок знайомить вас із реальним набором даних і реальним завданням: **[515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)**, який має [ліцензію CC0: Public Domain](https://creativecommons.org/publicdomain/zero/1.0/). Дані були зібрані з Booking.com із публічних джерел. Автором набору даних є Jiashen Liu. + +### Підготовка + +Вам знадобиться: + +* Можливість запускати .ipynb ноутбуки з використанням Python 3 +* pandas +* NLTK, [який слід встановити локально](https://www.nltk.org/install.html) +* Набір даних, доступний на Kaggle [515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe). Розмір файлу після розпакування становить близько 230 МБ. Завантажте його в кореневу папку `/data`, пов’язану з цими уроками NLP. + +## Дослідницький аналіз даних + +Це завдання передбачає, що ви створюєте бота для рекомендацій готелів, використовуючи аналіз настроїв і оцінки гостей. Набір даних, який ви будете використовувати, включає відгуки про 1493 різні готелі в 6 містах. + +Використовуючи Python, набір даних відгуків про готелі та аналіз настроїв NLTK, ви можете дізнатися: + +* Які слова та фрази найчастіше використовуються у відгуках? +* Чи корелюють офіційні *теги*, що описують готель, з оцінками відгуків (наприклад, чи є більше негативних відгуків для певного готелю від *Сімей з маленькими дітьми*, ніж від *Соло-мандрівників*, можливо, це вказує на те, що готель більше підходить для *Соло-мандрівників*)? +* Чи збігаються оцінки настроїв NLTK з числовою оцінкою рецензента? + +#### Набір даних + +Давайте дослідимо набір даних, який ви завантажили та зберегли локально. Відкрийте файл у редакторі, наприклад, VS Code або навіть Excel. + +Заголовки в наборі даних такі: + +*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng* + +Ось вони згруповані таким чином, щоб їх було легше аналізувати: +##### Колонки готелів + +* `Hotel_Name`, `Hotel_Address`, `lat` (широта), `lng` (довгота) + * Використовуючи *lat* і *lng*, ви можете побудувати карту за допомогою Python, яка показує розташування готелів (можливо, з кольоровим кодуванням для негативних і позитивних відгуків) + * Hotel_Address не є очевидно корисним для нас, і ми, ймовірно, замінимо його на країну для зручнішого сортування та пошуку + +**Колонки мета-відгуків готелів** + +* `Average_Score` + * За словами автора набору даних, ця колонка містить *Середню оцінку готелю, розраховану на основі останнього коментаря за останній рік*. Це здається незвичайним способом розрахунку оцінки, але це дані, які були зібрані, тому ми можемо прийняти їх за основу на даний момент. + + ✅ Виходячи з інших колонок у цьому наборі даних, чи можете ви придумати інший спосіб розрахунку середньої оцінки? + +* `Total_Number_of_Reviews` + * Загальна кількість відгуків, які отримав цей готель - не зрозуміло (без написання коду), чи стосується це відгуків у наборі даних. +* `Additional_Number_of_Scoring` + * Це означає, що оцінка була надана, але позитивний або негативний відгук не був написаний рецензентом + +**Колонки відгуків** + +- `Reviewer_Score` + - Це числове значення з максимумом 1 десятковим знаком між мінімальним і максимальним значеннями 2.5 і 10 + - Не пояснюється, чому найнижча можлива оцінка становить 2.5 +- `Negative_Review` + - Якщо рецензент нічого не написав, це поле матиме "**No Negative**" + - Зверніть увагу, що рецензент може написати позитивний відгук у колонці Negative review (наприклад, "немає нічого поганого в цьому готелі") +- `Review_Total_Negative_Word_Counts` + - Більша кількість негативних слів вказує на нижчу оцінку (без перевірки настрою) +- `Positive_Review` + - Якщо рецензент нічого не написав, це поле матиме "**No Positive**" + - Зверніть увагу, що рецензент може написати негативний відгук у колонці Positive review (наприклад, "у цьому готелі немає нічого хорошого") +- `Review_Total_Positive_Word_Counts` + - Більша кількість позитивних слів вказує на вищу оцінку (без перевірки настрою) +- `Review_Date` і `days_since_review` + - Можна застосувати міру свіжості або застарілості до відгуку (старіші відгуки можуть бути менш точними, ніж новіші, оскільки управління готелем змінилося, були проведені ремонти або додано басейн тощо) +- `Tags` + - Це короткі дескриптори, які рецензент може вибрати для опису типу гостя (наприклад, соло або сім'я), типу кімнати, тривалості перебування та способу подання відгуку. + - На жаль, використання цих тегів є проблематичним, див. розділ нижче, який обговорює їх корисність + +**Колонки рецензентів** + +- `Total_Number_of_Reviews_Reviewer_Has_Given` + - Це може бути фактором у моделі рекомендацій, наприклад, якщо ви можете визначити, що більш продуктивні рецензенти з сотнями відгуків частіше були негативними, ніж позитивними. Однак рецензент будь-якого конкретного відгуку не ідентифікується за унікальним кодом, і тому його не можна пов’язати з набором відгуків. Є 30 рецензентів із 100 або більше відгуками, але важко зрозуміти, як це може допомогти моделі рекомендацій. +- `Reviewer_Nationality` + - Дехто може думати, що певні національності частіше дають позитивні або негативні відгуки через національну схильність. Будьте обережні, будуючи такі анекдотичні погляди у своїх моделях. Це національні (а іноді й расові) стереотипи, і кожен рецензент був індивідуальним, який написав відгук на основі свого досвіду. Він міг бути відфільтрований через багато лінз, таких як їхні попередні перебування в готелях, пройдена відстань і їхній особистий темперамент. Вважати, що їхня національність була причиною оцінки відгуку, важко виправдати. + +##### Приклади + +| Середня оцінка | Загальна кількість відгуків | Оцінка рецензента | Негативний
                                          відгук | Позитивний відгук | Теги | +| -------------- | -------------------------- | ----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- | +| 7.8 | 1945 | 2.5 | Це зараз не готель, а будівельний майданчик. Мене тероризували з раннього ранку і весь день неприйнятним будівельним шумом, поки я відпочивав після довгої подорожі та працював у кімнаті. Люди працювали весь день, тобто з відбійними молотками в сусідніх кімнатах. Я попросив змінити кімнату, але тихої кімнати не було. Щоб погіршити ситуацію, мене переплатили. Я виїхав увечері, оскільки мав дуже ранній рейс, і отримав відповідний рахунок. Через день готель зробив ще один платіж без моєї згоди, перевищивши заброньовану ціну. Це жахливе місце. Не карайте себе, бронюючи тут. | Нічого. Жахливе місце. Тримайтеся подалі | Ділова поїздка Пара Стандартний двомісний номер Перебування 2 ночі | + +Як бачите, цей гість не мав щасливого перебування в цьому готелі. Готель має хорошу середню оцінку 7.8 і 1945 відгуків, але цей рецензент дав йому 2.5 і написав 115 слів про те, наскільки негативним було його перебування. Якщо вони нічого не написали в колонці Positive_Review, можна припустити, що нічого позитивного не було, але вони написали 7 слів попередження. Якщо ми просто рахували слова, а не їхнє значення чи настрій, ми могли б отримати спотворене уявлення про наміри рецензента. Дивно, що їхня оцінка 2.5 збиває з пантелику, адже якщо перебування в готелі було настільки поганим, чому взагалі давати якісь бали? Досліджуючи набір даних уважно, ви побачите, що найнижча можлива оцінка становить 2.5, а не 0. Найвища можлива оцінка — 10. + +##### Теги + +Як згадувалося вище, на перший погляд, ідея використання `Tags` для категоризації даних здається логічною. На жаль, ці теги не стандартизовані, що означає, що в одному готелі варіанти можуть бути *Single room*, *Twin room* і *Double room*, а в іншому готелі — *Deluxe Single Room*, *Classic Queen Room* і *Executive King Room*. Це можуть бути ті самі речі, але існує так багато варіацій, що вибір стає: + +1. Спроба змінити всі терміни на єдиний стандарт, що дуже складно, оскільки не зрозуміло, яким буде шлях конверсії в кожному випадку (наприклад, *Classic single room* відповідає *Single room*, але *Superior Queen Room with Courtyard Garden or City View* набагато складніше зіставити) + +1. Ми можемо застосувати підхід NLP і виміряти частоту певних термінів, таких як *Solo*, *Business Traveller* або *Family with young kids*, як вони застосовуються до кожного готелю, і врахувати це в рекомендації + +Теги зазвичай (але не завжди) є одним полем, що містить список із 5-6 значень, розділених комами, які відповідають *Типу подорожі*, *Типу гостей*, *Типу кімнати*, *Кількості ночей* і *Типу пристрою, на якому був поданий відгук*. Однак через те, що деякі рецензенти не заповнюють кожне поле (вони можуть залишити одне порожнім), значення не завжди знаходяться в тому самому порядку. + +Наприклад, візьмемо *Тип групи*. У цьому полі в колонці `Tags` є 1025 унікальних можливостей, і, на жаль, лише деякі з них стосуються групи (деякі стосуються типу кімнати тощо). Якщо ви відфільтруєте лише ті, що згадують сім’ю, результати містять багато результатів типу *Family room*. Якщо ви включите термін *with*, тобто врахуєте значення *Family with*, результати будуть кращими, з понад 80,000 із 515,000 результатів, що містять фразу "Family with young children" або "Family with older children". + +Це означає, що колонка тегів не є повністю марною для нас, але її потрібно доопрацювати, щоб зробити корисною. + +##### Середня оцінка готелю + +У наборі даних є кілька дивностей або розбіжностей, які я не можу зрозуміти, але вони ілюструються тут, щоб ви знали про них під час створення своїх моделей. Якщо ви розберетеся, будь ласка, повідомте нам у розділі обговорення! + +Набір даних має такі колонки, що стосуються середньої оцінки та кількості відгуків: + +1. Hotel_Name +2. Additional_Number_of_Scoring +3. Average_Score +4. Total_Number_of_Reviews +5. Reviewer_Score + +Готель із найбільшою кількістю відгуків у цьому наборі даних — *Britannia International Hotel Canary Wharf* із 4789 відгуками з 515,000. Але якщо ми подивимося на значення `Total_Number_of_Reviews` для цього готелю, воно становить 9086. Можна припустити, що є набагато більше оцінок без відгуків, тому, можливо, нам слід додати значення колонки `Additional_Number_of_Scoring`. Це значення становить 2682, і додавання його до 4789 дає нам 7471, що все ще на 1615 менше, ніж `Total_Number_of_Reviews`. + +Якщо взяти колонку `Average_Score`, можна припустити, що це середнє значення відгуків у наборі даних, але опис із Kaggle говорить: "*Середня оцінка готелю, розрахована на основі останнього коментаря за останній рік*". Це здається не дуже корисним, але ми можемо розрахувати власне середнє значення на основі оцінок відгуків у наборі даних. Використовуючи той самий готель як приклад, середня оцінка готелю становить 7.1, але розрахована оцінка (середня оцінка рецензента *у* наборі даних) становить 6.8. Це близько, але не те саме значення, і ми можемо лише припустити, що оцінки, наведені в `Additional_Number_of_Scoring`, збільшили середнє значення до 7.1. На жаль, без можливості перевірити або довести це твердження важко використовувати або довіряти `Average_Score`, `Additional_Number_of_Scoring` і `Total_Number_of_Reviews`, коли вони базуються на даних, яких у нас немає. + +Щоб ускладнити ситуацію, готель із другою найбільшою кількістю відгуків має розраховану середню оцінку 8.12, а `Average_Score` у наборі даних становить 8.1. Чи є ця правильна оцінка збігом, чи перший готель є розбіжністю? + +На можливість того, що ці готелі можуть бути винятками, і що, можливо, більшість значень збігаються (але деякі з якихось причин не збігаються), ми напишемо коротку програму, щоб дослідити значення в наборі даних і визначити правильне використання (або невикористання) значень. +> 🚨 Зауваження щодо обережності +> +> Працюючи з цим набором даних, ви будете писати код, який обчислює щось на основі тексту, не читаючи або аналізуючи сам текст. Це суть обробки природної мови (NLP) — інтерпретувати значення або настрій без участі людини. Однак можливо, що ви натрапите на деякі негативні відгуки. Я закликаю вас цього не робити, тому що в цьому немає необхідності. Деякі з них є безглуздими або неактуальними негативними відгуками про готелі, наприклад: "Погода була не дуже гарною", що знаходиться поза контролем готелю або будь-кого взагалі. Але є й темна сторона деяких відгуків. Іноді негативні відгуки містять расизм, сексизм або ейджизм. Це прикро, але очікувано для набору даних, зібраного з публічного вебсайту. Деякі рецензенти залишають відгуки, які можуть здатися вам неприємними, дискомфортними або такими, що засмучують. Краще дозволити коду оцінити настрій, ніж читати їх самостійно і засмучуватися. Тим не менш, це меншість, яка пише такі речі, але вони все ж існують. +## Вправа - Дослідження даних +### Завантаження даних + +Досить візуально оглядати дані, тепер ви напишете код і отримаєте відповіді! У цьому розділі використовується бібліотека pandas. Ваше перше завдання — переконатися, що ви можете завантажити та прочитати дані CSV. Бібліотека pandas має швидкий завантажувач CSV, і результат розміщується у dataframe, як у попередніх уроках. CSV, який ми завантажуємо, містить понад півмільйона рядків, але лише 17 стовпців. Pandas надає багато потужних способів взаємодії з dataframe, включаючи можливість виконувати операції над кожним рядком. + +Далі в цьому уроці будуть фрагменти коду, пояснення до коду та обговорення того, що означають результати. Використовуйте включений _notebook.ipynb_ для вашого коду. + +Почнемо із завантаження файлу даних, який ви будете використовувати: + +```python +# Load the hotel reviews from CSV +import pandas as pd +import time +# importing time so the start and end time can be used to calculate file loading time +print("Loading data file now, this could take a while depending on file size") +start = time.time() +# df is 'DataFrame' - make sure you downloaded the file to the data folder +df = pd.read_csv('../../data/Hotel_Reviews.csv') +end = time.time() +print("Loading took " + str(round(end - start, 2)) + " seconds") +``` + +Тепер, коли дані завантажено, ми можемо виконувати деякі операції над ними. Залиште цей код у верхній частині вашої програми для наступної частини. + +## Дослідження даних + +У цьому випадку дані вже *чисті*, тобто вони готові до роботи і не містять символів іншими мовами, які можуть завадити алгоритмам, що очікують лише англійські символи. + +✅ Можливо, вам доведеться працювати з даними, які потребують початкової обробки для форматування перед застосуванням технік NLP, але не цього разу. Як би ви обробляли символи іншими мовами, якщо б це було необхідно? + +Переконайтеся, що після завантаження даних ви можете досліджувати їх за допомогою коду. Дуже легко захотіти зосередитися на стовпцях `Negative_Review` і `Positive_Review`. Вони заповнені природним текстом для обробки вашими алгоритмами NLP. Але зачекайте! Перш ніж переходити до NLP і аналізу настроїв, слід виконати код нижче, щоб переконатися, що значення, наведені в наборі даних, відповідають значенням, які ви обчислюєте за допомогою pandas. + +## Операції з dataframe + +Перше завдання в цьому уроці — перевірити, чи правильні наступні твердження, написавши код, який досліджує dataframe (без його зміни). + +> Як і багато завдань програмування, є кілька способів виконати це, але хороша порада — робити це найпростішим і найзручнішим способом, особливо якщо це буде легше зрозуміти, коли ви повернетеся до цього коду в майбутньому. У dataframe є всеосяжний API, який часто має спосіб зробити те, що вам потрібно, ефективно. + +Розглядайте наступні питання як завдання з програмування та спробуйте відповісти на них, не дивлячись на рішення. + +1. Виведіть *форму* dataframe, який ви щойно завантажили (форма — це кількість рядків і стовпців). +2. Обчисліть частоту для національностей рецензентів: + 1. Скільки унікальних значень є у стовпці `Reviewer_Nationality` і які вони? + 2. Яка національність рецензента є найпоширенішою в наборі даних (виведіть країну та кількість рецензій)? + 3. Які наступні 10 найчастіше зустрічаються національності та їх частота? +3. Який готель отримав найбільше рецензій для кожної з 10 найпоширеніших національностей рецензентів? +4. Скільки рецензій є на кожен готель (частота рецензій на готель) у наборі даних? +5. Хоча в наборі даних є стовпець `Average_Score` для кожного готелю, ви також можете обчислити середній бал (отримавши середнє значення всіх оцінок рецензентів у наборі даних для кожного готелю). Додайте новий стовпець до вашого dataframe із заголовком стовпця `Calc_Average_Score`, який містить цей обчислений середній бал. +6. Чи є готелі, які мають однакові (округлені до 1 десяткового знака) значення `Average_Score` і `Calc_Average_Score`? + 1. Спробуйте написати функцію Python, яка приймає Series (рядок) як аргумент і порівнює значення, виводячи повідомлення, коли значення не рівні. Потім використовуйте метод `.apply()` для обробки кожного рядка за допомогою функції. +7. Обчисліть і виведіть кількість рядків, у яких значення стовпця `Negative_Review` дорівнює "No Negative". +8. Обчисліть і виведіть кількість рядків, у яких значення стовпця `Positive_Review` дорівнює "No Positive". +9. Обчисліть і виведіть кількість рядків, у яких значення стовпця `Positive_Review` дорівнює "No Positive" **і** значення стовпця `Negative_Review` дорівнює "No Negative". + +### Відповіді у коді + +1. Виведіть *форму* dataframe, який ви щойно завантажили (форма — це кількість рядків і стовпців). + + ```python + print("The shape of the data (rows, cols) is " + str(df.shape)) + > The shape of the data (rows, cols) is (515738, 17) + ``` + +2. Обчисліть частоту для національностей рецензентів: + + 1. Скільки унікальних значень є у стовпці `Reviewer_Nationality` і які вони? + 2. Яка національність рецензента є найпоширенішою в наборі даних (виведіть країну та кількість рецензій)? + + ```python + # value_counts() creates a Series object that has index and values in this case, the country and the frequency they occur in reviewer nationality + nationality_freq = df["Reviewer_Nationality"].value_counts() + print("There are " + str(nationality_freq.size) + " different nationalities") + # print first and last rows of the Series. Change to nationality_freq.to_string() to print all of the data + print(nationality_freq) + + There are 227 different nationalities + United Kingdom 245246 + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + ... + Comoros 1 + Palau 1 + Northern Mariana Islands 1 + Cape Verde 1 + Guinea 1 + Name: Reviewer_Nationality, Length: 227, dtype: int64 + ``` + + 3. Які наступні 10 найчастіше зустрічаються національності та їх частота? + + ```python + print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.") + # Notice there is a leading space on the values, strip() removes that for printing + # What is the top 10 most common nationalities and their frequencies? + print("The next 10 highest frequency reviewer nationalities are:") + print(nationality_freq[1:11].to_string()) + + The highest frequency reviewer nationality is United Kingdom with 245246 reviews. + The next 10 highest frequency reviewer nationalities are: + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + Saudi Arabia 8951 + Netherlands 8772 + Switzerland 8678 + Germany 7941 + Canada 7894 + France 7296 + ``` + +3. Який готель отримав найбільше рецензій для кожної з 10 найпоширеніших національностей рецензентів? + + ```python + # What was the most frequently reviewed hotel for the top 10 nationalities + # Normally with pandas you will avoid an explicit loop, but wanted to show creating a new dataframe using criteria (don't do this with large amounts of data because it could be very slow) + for nat in nationality_freq[:10].index: + # First, extract all the rows that match the criteria into a new dataframe + nat_df = df[df["Reviewer_Nationality"] == nat] + # Now get the hotel freq + freq = nat_df["Hotel_Name"].value_counts() + print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.") + + The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews. + The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews. + The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews. + The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews. + The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews. + The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews. + The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews. + The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews. + The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews. + The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews. + ``` + +4. Скільки рецензій є на кожен готель (частота рецензій на готель) у наборі даних? + + ```python + # First create a new dataframe based on the old one, removing the uneeded columns + hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1) + + # Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found + hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count') + + # Get rid of all the duplicated rows + hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"]) + display(hotel_freq_df) + ``` + | Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found | + | :----------------------------------------: | :---------------------: | :-----------------: | + | Britannia International Hotel Canary Wharf | 9086 | 4789 | + | Park Plaza Westminster Bridge London | 12158 | 4169 | + | Copthorne Tara Hotel London Kensington | 7105 | 3578 | + | ... | ... | ... | + | Mercure Paris Porte d Orleans | 110 | 10 | + | Hotel Wagner | 135 | 10 | + | Hotel Gallitzinberg | 173 | 8 | + + Ви можете помітити, що результати *підраховані в наборі даних* не відповідають значенню в `Total_Number_of_Reviews`. Незрозуміло, чи це значення в наборі даних представляє загальну кількість рецензій, які мав готель, але не всі були зібрані, чи це якесь інше обчислення. `Total_Number_of_Reviews` не використовується в моделі через цю неясність. + +5. Хоча в наборі даних є стовпець `Average_Score` для кожного готелю, ви також можете обчислити середній бал (отримавши середнє значення всіх оцінок рецензентів у наборі даних для кожного готелю). Додайте новий стовпець до вашого dataframe із заголовком стовпця `Calc_Average_Score`, який містить цей обчислений середній бал. Виведіть стовпці `Hotel_Name`, `Average_Score` і `Calc_Average_Score`. + + ```python + # define a function that takes a row and performs some calculation with it + def get_difference_review_avg(row): + return row["Average_Score"] - row["Calc_Average_Score"] + + # 'mean' is mathematical word for 'average' + df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + + # Add a new column with the difference between the two average scores + df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1) + + # Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel) + review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"]) + + # Sort the dataframe to find the lowest and highest average score difference + review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"]) + + display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]]) + ``` + + Ви також можете задатися питанням про значення `Average_Score` і чому воно іноді відрізняється від обчисленого середнього балу. Оскільки ми не можемо знати, чому деякі значення збігаються, а інші мають різницю, найкраще в цьому випадку використовувати оцінки рецензентів, які ми маємо, щоб обчислити середнє самостійно. Тим не менш, різниця зазвичай дуже мала, ось готелі з найбільшим відхиленням між середнім балом із набору даних і обчисленим середнім балом: + + | Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Name | + | :----------------------: | :-----------: | :----------------: | ------------------------------------------: | + | -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria | + | -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery | + | -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans | + | -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel | + | -0.5 | 7.0 | 7.5 | Hotel Royal Elys es | + | ... | ... | ... | ... | + | 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre | + | 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur | + | 0.9 | 6.8 | 5.9 | Villa Eugenie | + | 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux | + | 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar | + + Лише 1 готель має різницю в оцінці більше 1, це означає, що ми, ймовірно, можемо ігнорувати різницю та використовувати обчислений середній бал. + +6. Обчисліть і виведіть кількість рядків, у яких значення стовпця `Negative_Review` дорівнює "No Negative". + +7. Обчисліть і виведіть кількість рядків, у яких значення стовпця `Positive_Review` дорівнює "No Positive". + +8. Обчисліть і виведіть кількість рядків, у яких значення стовпця `Positive_Review` дорівнює "No Positive" **і** значення стовпця `Negative_Review` дорівнює "No Negative". + + ```python + # with lambdas: + start = time.time() + no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1) + print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index))) + + no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index))) + + both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index))) + end = time.time() + print("Lambdas took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Lambdas took 9.64 seconds + ``` + +## Інший спосіб + +Інший спосіб підрахувати елементи без Lambdas і використовувати sum для підрахунку рядків: + + ```python + # without lambdas (using a mixture of notations to show you can use both) + start = time.time() + no_negative_reviews = sum(df.Negative_Review == "No Negative") + print("Number of No Negative reviews: " + str(no_negative_reviews)) + + no_positive_reviews = sum(df["Positive_Review"] == "No Positive") + print("Number of No Positive reviews: " + str(no_positive_reviews)) + + both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive")) + print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews)) + + end = time.time() + print("Sum took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Sum took 0.19 seconds + ``` + + Ви могли помітити, що є 127 рядків, які мають значення "No Negative" і "No Positive" для стовпців `Negative_Review` і `Positive_Review` відповідно. Це означає, що рецензент дав готелю числову оцінку, але відмовився писати як позитивний, так і негативний відгук. На щастя, це невелика кількість рядків (127 із 515738, або 0,02%), тому це, ймовірно, не вплине на нашу модель чи результати в будь-якому конкретному напрямку, але ви могли не очікувати, що набір даних рецензій міститиме рядки без рецензій, тому варто дослідити дані, щоб виявити такі рядки. + +Тепер, коли ви дослідили набір даних, у наступному уроці ви відфільтруєте дані та додасте аналіз настроїв. + +--- +## 🚀Виклик + +Цей урок демонструє, як ми бачили в попередніх уроках, наскільки важливо розуміти ваші дані та їх особливості перед виконанням операцій над ними. Текстові дані, зокрема, потребують ретельного аналізу. Перегляньте різні набори даних із великою кількістю тексту та спробуйте виявити області, які можуть вводити упередженість або спотворений настрій у модель. + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Пройдіть [цей навчальний шлях з NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott), щоб дізнатися про інструменти, які можна спробувати під час створення моделей для роботи з текстом і мовою. + +## Завдання + +[NLTK](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/4-Hotel-Reviews-1/assignment.md b/translations/uk/6-NLP/4-Hotel-Reviews-1/assignment.md new file mode 100644 index 00000000..abd3a566 --- /dev/null +++ b/translations/uk/6-NLP/4-Hotel-Reviews-1/assignment.md @@ -0,0 +1,19 @@ + +# NLTK + +## Інструкції + +NLTK — це відома бібліотека для використання в обчислювальній лінгвістиці та обробці природної мови. Скористайтеся цією можливістю, щоб ознайомитися з '[книгою NLTK](https://www.nltk.org/book/)' і спробувати виконати її вправи. У цьому завданні без оцінювання ви зможете глибше ознайомитися з цією бібліотекою. + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md b/translations/uk/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md new file mode 100644 index 00000000..9dcaeca6 --- /dev/null +++ b/translations/uk/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/4-Hotel-Reviews-1/solution/R/README.md b/translations/uk/6-NLP/4-Hotel-Reviews-1/solution/R/README.md new file mode 100644 index 00000000..45236615 --- /dev/null +++ b/translations/uk/6-NLP/4-Hotel-Reviews-1/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/5-Hotel-Reviews-2/README.md b/translations/uk/6-NLP/5-Hotel-Reviews-2/README.md new file mode 100644 index 00000000..791732c7 --- /dev/null +++ b/translations/uk/6-NLP/5-Hotel-Reviews-2/README.md @@ -0,0 +1,389 @@ + +# Аналіз настроїв за відгуками про готелі + +Тепер, коли ви детально дослідили набір даних, настав час відфільтрувати стовпці та застосувати техніки обробки природної мови (NLP) до набору даних, щоб отримати нові інсайти про готелі. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +### Операції фільтрації та аналізу настроїв + +Як ви, мабуть, помітили, набір даних має кілька проблем. Деякі стовпці заповнені непотрібною інформацією, інші здаються некоректними. Якщо вони правильні, незрозуміло, як вони були розраховані, і відповіді неможливо перевірити самостійними обчисленнями. + +## Вправа: трохи більше обробки даних + +Очистіть дані ще трохи. Додайте стовпці, які будуть корисними пізніше, змініть значення в інших стовпцях і повністю видаліть певні стовпці. + +1. Початкова обробка стовпців + + 1. Видаліть `lat` і `lng` + + 2. Замініть значення `Hotel_Address` на наступні (якщо адреса містить назву міста та країни, змініть її на просто місто та країну). + + Ось єдині міста та країни в наборі даних: + + Амстердам, Нідерланди + + Барселона, Іспанія + + Лондон, Сполучене Королівство + + Мілан, Італія + + Париж, Франція + + Відень, Австрія + + ```python + def replace_address(row): + if "Netherlands" in row["Hotel_Address"]: + return "Amsterdam, Netherlands" + elif "Barcelona" in row["Hotel_Address"]: + return "Barcelona, Spain" + elif "United Kingdom" in row["Hotel_Address"]: + return "London, United Kingdom" + elif "Milan" in row["Hotel_Address"]: + return "Milan, Italy" + elif "France" in row["Hotel_Address"]: + return "Paris, France" + elif "Vienna" in row["Hotel_Address"]: + return "Vienna, Austria" + + # Replace all the addresses with a shortened, more useful form + df["Hotel_Address"] = df.apply(replace_address, axis = 1) + # The sum of the value_counts() should add up to the total number of reviews + print(df["Hotel_Address"].value_counts()) + ``` + + Тепер ви можете запитувати дані на рівні країни: + + ```python + display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"})) + ``` + + | Hotel_Address | Hotel_Name | + | :--------------------- | :--------: | + | Amsterdam, Netherlands | 105 | + | Barcelona, Spain | 211 | + | London, United Kingdom | 400 | + | Milan, Italy | 162 | + | Paris, France | 458 | + | Vienna, Austria | 158 | + +2. Обробка стовпців мета-відгуків про готелі + + 1. Видаліть `Additional_Number_of_Scoring` + + 1. Замініть `Total_Number_of_Reviews` на загальну кількість відгуків для цього готелю, які фактично є в наборі даних + + 1. Замініть `Average_Score` на власний розрахований бал + + ```python + # Drop `Additional_Number_of_Scoring` + df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True) + # Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values + df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count') + df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + ``` + +3. Обробка стовпців відгуків + + 1. Видаліть `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` і `days_since_review` + + 2. Залиште `Reviewer_Score`, `Negative_Review` і `Positive_Review` без змін, + + 3. Залиште `Tags` поки що + + - Ми будемо виконувати додаткові операції фільтрації на тегах у наступному розділі, а потім теги будуть видалені + +4. Обробка стовпців рецензентів + + 1. Видаліть `Total_Number_of_Reviews_Reviewer_Has_Given` + + 2. Залиште `Reviewer_Nationality` + +### Стовпці тегів + +Стовпець `Tag` є проблематичним, оскільки він містить список (у текстовій формі), збережений у стовпці. На жаль, порядок і кількість підрозділів у цьому стовпці не завжди однакові. Людині важко визначити правильні фрази, які можуть бути цікавими, тому що є 515,000 рядків і 1427 готелів, і кожен має трохи різні варіанти, які рецензент міг вибрати. Тут стає корисним NLP. Ви можете сканувати текст і знаходити найпоширеніші фрази, а також рахувати їх. + +На жаль, нас не цікавлять окремі слова, а багатослівні фрази (наприклад, *Ділова поїздка*). Запуск алгоритму частотного розподілу багатослівних фраз на такій кількості даних (6762646 слів) може зайняти надзвичайно багато часу, але без перегляду даних здається, що це необхідна витрата. Тут стає корисним дослідницький аналіз даних, оскільки ви бачили зразок тегів, таких як `[' Ділова поїздка ', ' Самостійний мандрівник ', ' Одномісний номер ', ' Перебування 5 ночей ', ' Надіслано з мобільного пристрою ']`, ви можете почати запитувати, чи можливо значно скоротити обробку, яку вам потрібно виконати. На щастя, це можливо - але спочатку потрібно виконати кілька кроків, щоб визначити цікаві теги. + +### Фільтрація тегів + +Пам’ятайте, що мета набору даних — додати настрої та стовпці, які допоможуть вам вибрати найкращий готель (для себе або, можливо, для клієнта, який доручив вам створити бота для рекомендацій готелів). Вам потрібно запитати себе, чи є теги корисними чи ні в остаточному наборі даних. Ось одне з тлумачень (якщо вам потрібен набір даних для інших цілей, різні теги можуть залишитися/вийти з вибору): + +1. Тип поїздки є важливим, і він має залишитися +2. Тип групи гостей є важливим, і він має залишитися +3. Тип кімнати, люксу чи студії, в якій зупинявся гість, не має значення (усі готелі мають приблизно однакові кімнати) +4. Пристрій, на якому був надісланий відгук, не має значення +5. Кількість ночей, протягом яких рецензент залишався, *може* бути важливою, якщо ви пов’язуєте довші перебування з тим, що їм більше подобається готель, але це сумнівно і, ймовірно, не має значення + +Підсумовуючи, **залиште 2 типи тегів і видаліть інші**. + +Спочатку ви не хочете рахувати теги, поки вони не будуть у кращому форматі, а це означає видалення квадратних дужок і лапок. Ви можете зробити це кількома способами, але вам потрібен найшвидший, оскільки це може зайняти багато часу для обробки великої кількості даних. На щастя, pandas має простий спосіб виконати кожен із цих кроків. + +```Python +# Remove opening and closing brackets +df.Tags = df.Tags.str.strip("[']") +# remove all quotes too +df.Tags = df.Tags.str.replace(" ', '", ",", regex = False) +``` + +Кожен тег стає таким: `Ділова поїздка, Самостійний мандрівник, Одномісний номер, Перебування 5 ночей, Надіслано з мобільного пристрою`. + +Далі ми стикаємося з проблемою. Деякі відгуки або рядки мають 5 стовпців, деякі 3, деякі 6. Це результат того, як був створений набір даних, і важко виправити. Ви хочете отримати частотний підрахунок кожної фрази, але вони знаходяться в різному порядку в кожному відгуку, тому підрахунок може бути неправильним, і готель може не отримати тег, який він заслуговував. + +Натомість ви використаєте різний порядок на свою користь, оскільки кожен тег є багатослівним, але також розділений комою! Найпростіший спосіб зробити це — створити 6 тимчасових стовпців, у кожен з яких вставити тег відповідно до його порядку в тегах. Потім ви можете об’єднати 6 стовпців в один великий стовпець і запустити метод `value_counts()` для отриманого стовпця. Надрукувавши це, ви побачите, що було 2428 унікальних тегів. Ось невеликий зразок: + +| Tag | Count | +| ------------------------------ | ------ | +| Leisure trip | 417778 | +| Submitted from a mobile device | 307640 | +| Couple | 252294 | +| Stayed 1 night | 193645 | +| Stayed 2 nights | 133937 | +| Solo traveler | 108545 | +| Stayed 3 nights | 95821 | +| Business trip | 82939 | +| Group | 65392 | +| Family with young children | 61015 | +| Stayed 4 nights | 47817 | +| Double Room | 35207 | +| Standard Double Room | 32248 | +| Superior Double Room | 31393 | +| Family with older children | 26349 | +| Deluxe Double Room | 24823 | +| Double or Twin Room | 22393 | +| Stayed 5 nights | 20845 | +| Standard Double or Twin Room | 17483 | +| Classic Double Room | 16989 | +| Superior Double or Twin Room | 13570 | +| 2 rooms | 12393 | + +Деякі з поширених тегів, таких як `Надіслано з мобільного пристрою`, нам не потрібні, тому може бути розумним видалити їх перед підрахунком частоти фраз, але це така швидка операція, що ви можете залишити їх і просто ігнорувати. + +### Видалення тегів тривалості перебування + +Видалення цих тегів — це перший крок, він трохи зменшує загальну кількість тегів, які потрібно враховувати. Зверніть увагу, що ви не видаляєте їх із набору даних, а просто вирішуєте видалити їх із розгляду як значення для підрахунку/збереження в наборі даних відгуків. + +| Length of stay | Count | +| ---------------- | ------ | +| Stayed 1 night | 193645 | +| Stayed 2 nights | 133937 | +| Stayed 3 nights | 95821 | +| Stayed 4 nights | 47817 | +| Stayed 5 nights | 20845 | +| Stayed 6 nights | 9776 | +| Stayed 7 nights | 7399 | +| Stayed 8 nights | 2502 | +| Stayed 9 nights | 1293 | +| ... | ... | + +Існує величезна різноманітність кімнат, люксів, студій, апартаментів тощо. Всі вони означають приблизно одне й те саме і не мають значення для вас, тому видаліть їх із розгляду. + +| Type of room | Count | +| ----------------------------- | ----- | +| Double Room | 35207 | +| Standard Double Room | 32248 | +| Superior Double Room | 31393 | +| Deluxe Double Room | 24823 | +| Double or Twin Room | 22393 | +| Standard Double or Twin Room | 17483 | +| Classic Double Room | 16989 | +| Superior Double or Twin Room | 13570 | + +Нарешті, і це чудово (оскільки це не потребувало багато обробки), ви залишитеся з наступними *корисними* тегами: + +| Tag | Count | +| --------------------------------------------- | ------ | +| Leisure trip | 417778 | +| Couple | 252294 | +| Solo traveler | 108545 | +| Business trip | 82939 | +| Group (combined with Travellers with friends) | 67535 | +| Family with young children | 61015 | +| Family with older children | 26349 | +| With a pet | 1405 | + +Можна стверджувати, що `Мандрівники з друзями` — це те саме, що й `Група`, і було б справедливо об’єднати ці два, як показано вище. Код для визначення правильних тегів знаходиться в [ноутбуці Tags](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb). + +Останній крок — створити нові стовпці для кожного з цих тегів. Потім для кожного рядка відгуків, якщо стовпець `Tag` відповідає одному з нових стовпців, додайте 1, якщо ні, додайте 0. Кінцевим результатом буде підрахунок того, скільки рецензентів вибрали цей готель (у сукупності) для, наприклад, бізнесу чи відпочинку, або щоб привезти домашнього улюбленця, і це корисна інформація при рекомендації готелю. + +```python +# Process the Tags into new columns +# The file Hotel_Reviews_Tags.py, identifies the most important tags +# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends, +# Family with young children, Family with older children, With a pet +df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0) +df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0) +df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0) +df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0) +df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0) +df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0) +df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0) +df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0) + +``` + +### Збережіть ваш файл + +Нарешті, збережіть набір даних у його поточному вигляді з новою назвою. + +```python +df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True) + +# Saving new data file with calculated columns +print("Saving results to Hotel_Reviews_Filtered.csv") +df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False) +``` + +## Операції аналізу настроїв + +У цьому останньому розділі ви застосуєте аналіз настроїв до стовпців відгуків і збережете результати в наборі даних. + +## Вправа: завантаження та збереження відфільтрованих даних + +Зверніть увагу, що тепер ви завантажуєте відфільтрований набір даних, який був збережений у попередньому розділі, **а не** оригінальний набір даних. + +```python +import time +import pandas as pd +import nltk as nltk +from nltk.corpus import stopwords +from nltk.sentiment.vader import SentimentIntensityAnalyzer +nltk.download('vader_lexicon') + +# Load the filtered hotel reviews from CSV +df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv') + +# You code will be added here + + +# Finally remember to save the hotel reviews with new NLP data added +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False) +``` + +### Видалення стоп-слів + +Якщо ви запустите аналіз настроїв для стовпців негативних і позитивних відгуків, це може зайняти багато часу. Тест на потужному ноутбуці з швидким процесором зайняв 12–14 хвилин залежно від того, яка бібліотека настроїв використовувалася. Це (відносно) довгий час, тому варто дослідити, чи можна його прискорити. + +Видалення стоп-слів, або поширених англійських слів, які не змінюють настрій речення, є першим кроком. Видаляючи їх, аналіз настроїв має працювати швидше, але не менш точно (оскільки стоп-слова не впливають на настрій, але вони уповільнюють аналіз). + +Найдовший негативний відгук складав 395 слів, але після видалення стоп-слів він становить 195 слів. + +Видалення стоп-слів також є швидкою операцією, видалення стоп-слів із 2 стовпців відгуків у 515,000 рядках зайняло 3.3 секунди на тестовому пристрої. Це може зайняти трохи більше або менше часу залежно від швидкості процесора вашого пристрою, оперативної пам’яті, наявності SSD тощо. Відносна короткість операції означає, що якщо вона покращує час аналізу настроїв, то її варто виконати. + +```python +from nltk.corpus import stopwords + +# Load the hotel reviews from CSV +df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv") + +# Remove stop words - can be slow for a lot of text! +# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches +# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends +start = time.time() +cache = set(stopwords.words("english")) +def remove_stopwords(review): + text = " ".join([word for word in review.split() if word not in cache]) + return text + +# Remove the stop words from both columns +df.Negative_Review = df.Negative_Review.apply(remove_stopwords) +df.Positive_Review = df.Positive_Review.apply(remove_stopwords) +``` + +### Виконання аналізу настроїв + +Тепер вам слід розрахувати аналіз настроїв для стовпців негативних і позитивних відгуків і зберегти результат у 2 нових стовпцях. Тест настрою буде порівнювати його з оцінкою рецензента для того ж відгуку. Наприклад, якщо аналіз настроїв вважає, що негативний відгук має настрій 1 (надзвичайно позитивний настрій) і позитивний настрій 1, але рецензент дав готелю найнижчу оцінку, то або текст відгуку не відповідає оцінці, або аналізатор настроїв не зміг правильно розпізнати настрій. Ви повинні очікувати, що деякі оцінки настроїв будуть абсолютно неправильними, і часто це буде пояснювано, наприклад, відгук може бути надзвичайно саркастичним: "Звісно, я ОБОЖНЮВАВ спати в кімнаті без опалення", і аналізатор настроїв вважає, що це позитивний настрій, хоча людина, яка читає це, зрозуміє, що це сарказм. +NLTK пропонує різні аналізатори настрою для навчання, і ви можете замінювати їх, щоб перевірити, чи аналіз настрою є більш точним або менш точним. Тут використовується аналіз настрою VADER. + +> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014. + +```python +from nltk.sentiment.vader import SentimentIntensityAnalyzer + +# Create the vader sentiment analyser (there are others in NLTK you can try too) +vader_sentiment = SentimentIntensityAnalyzer() +# Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014. + +# There are 3 possibilities of input for a review: +# It could be "No Negative", in which case, return 0 +# It could be "No Positive", in which case, return 0 +# It could be a review, in which case calculate the sentiment +def calc_sentiment(review): + if review == "No Negative" or review == "No Positive": + return 0 + return vader_sentiment.polarity_scores(review)["compound"] +``` + +Пізніше у вашій програмі, коли ви будете готові до розрахунку настрою, ви можете застосувати його до кожного відгуку наступним чином: + +```python +# Add a negative sentiment and positive sentiment column +print("Calculating sentiment columns for both positive and negative reviews") +start = time.time() +df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment) +df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment) +end = time.time() +print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds") +``` + +Це займає приблизно 120 секунд на моєму комп'ютері, але час може варіюватися залежно від комп'ютера. Якщо ви хочете вивести результати і перевірити, чи відповідає настрій відгуку: + +```python +df = df.sort_values(by=["Negative_Sentiment"], ascending=True) +print(df[["Negative_Review", "Negative_Sentiment"]]) +df = df.sort_values(by=["Positive_Sentiment"], ascending=True) +print(df[["Positive_Review", "Positive_Sentiment"]]) +``` + +Останнє, що потрібно зробити з файлом перед використанням його у завданні, — це зберегти його! Також варто розглянути можливість упорядкування всіх нових колонок, щоб ними було зручно користуватися (для людини це косметична зміна). + +```python +# Reorder the columns (This is cosmetic, but to make it easier to explore the data later) +df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1) + +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False) +``` + +Ви повинні запустити весь код для [ноутбука аналізу](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (після того, як ви запустили [ноутбук фільтрації](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb), щоб створити файл Hotel_Reviews_Filtered.csv). + +Для перегляду, кроки такі: + +1. Оригінальний файл набору даних **Hotel_Reviews.csv** досліджується у попередньому уроці за допомогою [ноутбука дослідження](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb) +2. Hotel_Reviews.csv фільтрується за допомогою [ноутбука фільтрації](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb), що призводить до створення **Hotel_Reviews_Filtered.csv** +3. Hotel_Reviews_Filtered.csv обробляється за допомогою [ноутбука аналізу настрою](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb), що призводить до створення **Hotel_Reviews_NLP.csv** +4. Використовуйте Hotel_Reviews_NLP.csv у виклику NLP нижче + +### Висновок + +Коли ви починали, у вас був набір даних із колонками та даними, але не всі з них могли бути перевірені або використані. Ви дослідили дані, відфільтрували те, що вам не потрібно, перетворили теги у щось корисне, розрахували власні середні значення, додали кілька колонок настрою і, сподіваємося, дізналися щось цікаве про обробку природного тексту. + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Виклик + +Тепер, коли ваш набір даних проаналізовано на настрій, спробуйте використати стратегії, які ви вивчили у цьому курсі (можливо, кластеризацію?), щоб визначити шаблони навколо настрою. + +## Огляд і самостійне навчання + +Пройдіть [цей модуль Learn](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott), щоб дізнатися більше і використовувати різні інструменти для дослідження настрою в тексті. + +## Завдання + +[Спробуйте інший набір даних](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/5-Hotel-Reviews-2/assignment.md b/translations/uk/6-NLP/5-Hotel-Reviews-2/assignment.md new file mode 100644 index 00000000..d6077097 --- /dev/null +++ b/translations/uk/6-NLP/5-Hotel-Reviews-2/assignment.md @@ -0,0 +1,25 @@ + +# Спробуйте інший набір даних + +## Інструкції + +Тепер, коли ви дізналися, як використовувати NLTK для визначення настрою тексту, спробуйте інший набір даних. Ймовірно, вам доведеться виконати певну обробку даних, тому створіть ноутбук і задокументуйте свій хід думок. Що ви виявите? + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ---------------------- | +| | Представлено повний ноутбук і набір даних із добре задокументованими комірками, які пояснюють, як визначається настрій | У ноутбуці бракує якісних пояснень | У ноутбуці є недоліки | + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md b/translations/uk/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md new file mode 100644 index 00000000..b023e12d --- /dev/null +++ b/translations/uk/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/5-Hotel-Reviews-2/solution/R/README.md b/translations/uk/6-NLP/5-Hotel-Reviews-2/solution/R/README.md new file mode 100644 index 00000000..799ad6c8 --- /dev/null +++ b/translations/uk/6-NLP/5-Hotel-Reviews-2/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/README.md b/translations/uk/6-NLP/README.md new file mode 100644 index 00000000..ad49c101 --- /dev/null +++ b/translations/uk/6-NLP/README.md @@ -0,0 +1,38 @@ + +# Початок роботи з обробкою природної мови + +Обробка природної мови (NLP) — це здатність комп'ютерної програми розуміти людську мову такою, якою вона є в усній та письмовій формі, — тобто природною мовою. Це складова частина штучного інтелекту (AI). NLP існує вже понад 50 років і має коріння в галузі лінгвістики. Уся ця сфера спрямована на те, щоб допомогти машинам розуміти та обробляти людську мову. Це може бути використано для виконання таких завдань, як перевірка орфографії або машинний переклад. NLP має безліч реальних застосувань у різних галузях, включаючи медичні дослідження, пошукові системи та бізнес-аналітику. + +## Регіональна тема: Європейські мови, література та романтичні готелі Європи ❤️ + +У цьому розділі навчальної програми ви познайомитеся з одним із найпоширеніших застосувань машинного навчання: обробкою природної мови (NLP). Походячи з обчислювальної лінгвістики, ця категорія штучного інтелекту є мостом між людьми та машинами через голосове або текстове спілкування. + +У цих уроках ми вивчимо основи NLP, створюючи невеликі розмовні боти, щоб зрозуміти, як машинне навчання допомагає робити ці розмови дедалі більш "розумними". Ви здійсните подорож у часі, спілкуючись з Елізабет Беннет і містером Дарсі з класичного роману Джейн Остін **"Гордість і упередження"**, опублікованого в 1813 році. Потім ви поглибите свої знання, вивчаючи аналіз настроїв через відгуки про готелі в Європі. + +![Книга "Гордість і упередження" та чай](../../../6-NLP/images/p&p.jpg) +> Фото Elaine Howlin на Unsplash + +## Уроки + +1. [Вступ до обробки природної мови](1-Introduction-to-NLP/README.md) +2. [Поширені завдання та техніки NLP](2-Tasks/README.md) +3. [Переклад і аналіз настроїв за допомогою машинного навчання](3-Translation-Sentiment/README.md) +4. [Підготовка ваших даних](4-Hotel-Reviews-1/README.md) +5. [NLTK для аналізу настроїв](5-Hotel-Reviews-2/README.md) + +## Подяки + +Ці уроки з обробки природної мови були написані з ☕ [Стівеном Говеллом](https://twitter.com/Howell_MSFT) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/6-NLP/data/README.md b/translations/uk/6-NLP/data/README.md new file mode 100644 index 00000000..700f2980 --- /dev/null +++ b/translations/uk/6-NLP/data/README.md @@ -0,0 +1,15 @@ + +Завантажте дані відгуків про готель до цієї папки. + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/7-TimeSeries/1-Introduction/README.md b/translations/uk/7-TimeSeries/1-Introduction/README.md new file mode 100644 index 00000000..b37044cf --- /dev/null +++ b/translations/uk/7-TimeSeries/1-Introduction/README.md @@ -0,0 +1,199 @@ + +# Вступ до прогнозування часових рядів + +![Резюме часових рядів у вигляді скетчноту](../../../../sketchnotes/ml-timeseries.png) + +> Скетчнот від [Tomomi Imura](https://www.twitter.com/girlie_mac) + +У цьому уроці та наступному ви дізнаєтеся трохи про прогнозування часових рядів — цікавий і цінний аспект роботи науковця з машинного навчання, який менш відомий, ніж інші теми. Прогнозування часових рядів — це свого роду "кришталева куля": на основі минулих показників змінної, наприклад ціни, можна передбачити її потенційну майбутню вартість. + +[![Вступ до прогнозування часових рядів](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "Вступ до прогнозування часових рядів") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео про прогнозування часових рядів + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +Це корисна і цікава галузь, яка має реальну цінність для бізнесу завдяки її прямому застосуванню до проблем ціноутворення, інвентаризації та питань ланцюга постачання. Хоча методи глибокого навчання почали використовуватися для отримання більш точних прогнозів, прогнозування часових рядів залишається галуззю, значною мірою заснованою на класичних методах машинного навчання. + +> Корисний навчальний матеріал з часових рядів від Penn State можна знайти [тут](https://online.stat.psu.edu/stat510/lesson/1) + +## Вступ + +Уявіть, що ви керуєте масивом розумних паркувальних лічильників, які надають дані про те, як часто і як довго вони використовуються з часом. + +> Що, якщо ви могли б передбачити, на основі минулих показників лічильника, його майбутню вартість відповідно до законів попиту і пропозиції? + +Точно передбачити, коли діяти для досягнення вашої мети — це виклик, який можна вирішити за допомогою прогнозування часових рядів. Це може не сподобатися людям, якщо їх будуть більше стягувати в години пік, коли вони шукають місце для паркування, але це буде ефективним способом отримання доходу для очищення вулиць! + +Давайте розглянемо деякі типи алгоритмів часових рядів і почнемо роботу з блокнотом для очищення та підготовки даних. Дані, які ви будете аналізувати, взяті з конкурсу прогнозування GEFCom2014. Вони містять 3 роки годинних значень електричного навантаження та температури між 2012 і 2014 роками. Враховуючи історичні закономірності електричного навантаження та температури, ви можете передбачити майбутні значення електричного навантаження. + +У цьому прикладі ви навчитеся прогнозувати один крок вперед, використовуючи лише історичні дані навантаження. Однак перед початком корисно зрозуміти, що відбувається "за лаштунками". + +## Деякі визначення + +Коли ви стикаєтеся з терміном "часовий ряд", важливо розуміти його використання в різних контекстах. + +🎓 **Часовий ряд** + +У математиці "часовий ряд — це серія точок даних, упорядкованих (або перерахованих чи нанесених на графік) у часовому порядку. Найчастіше часовий ряд — це послідовність, взята в рівновіддалених точках часу." Прикладом часових рядів є щоденна закриваюча вартість [Dow Jones Industrial Average](https://wikipedia.org/wiki/Time_series). Використання графіків часових рядів і статистичного моделювання часто зустрічається в обробці сигналів, прогнозуванні погоди, передбаченні землетрусів та інших галузях, де події відбуваються і точки даних можуть бути нанесені на графік з часом. + +🎓 **Аналіз часових рядів** + +Аналіз часових рядів — це аналіз згаданих вище даних часових рядів. Дані часових рядів можуть мати різні форми, включаючи "перервані часові ряди", які виявляють закономірності в еволюції часових рядів до і після перериваючої події. Тип аналізу, необхідний для часових рядів, залежить від природи даних. Дані часових рядів можуть бути представлені у вигляді серій чисел або символів. + +Аналіз, який буде виконаний, використовує різноманітні методи, включаючи частотну і часову області, лінійні і нелінійні методи тощо. [Дізнайтеся більше](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) про численні способи аналізу цього типу даних. + +🎓 **Прогнозування часових рядів** + +Прогнозування часових рядів — це використання моделі для передбачення майбутніх значень на основі закономірностей, які демонструють раніше зібрані дані, як вони відбувалися в минулому. Хоча можна використовувати регресійні моделі для дослідження даних часових рядів, з часовими індексами як змінними x на графіку, такі дані найкраще аналізувати за допомогою спеціальних типів моделей. + +Дані часових рядів — це список упорядкованих спостережень, на відміну від даних, які можна аналізувати за допомогою лінійної регресії. Найпоширенішою моделлю є ARIMA, акронім, що означає "Автокореляційна Інтегрована Середня". + +[Моделі ARIMA](https://online.stat.psu.edu/stat510/lesson/1/1.1) "пов'язують поточне значення серії з минулими значеннями і минулими помилками прогнозу." Вони найбільш підходять для аналізу даних у часовій області, де дані упорядковані за часом. + +> Існує кілька типів моделей ARIMA, про які ви можете дізнатися [тут](https://people.duke.edu/~rnau/411arim.htm) і які ви розглянете в наступному уроці. + +У наступному уроці ви створите модель ARIMA, використовуючи [Уніваріантні часові ряди](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm), які зосереджуються на одній змінній, що змінює своє значення з часом. Прикладом такого типу даних є [цей набір даних](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm), який записує щомісячну концентрацію CO2 на обсерваторії Мауна-Лоа: + +| CO2 | YearMonth | Year | Month | +| :----: | :-------: | :---: | :---: | +| 330.62 | 1975.04 | 1975 | 1 | +| 331.40 | 1975.13 | 1975 | 2 | +| 331.87 | 1975.21 | 1975 | 3 | +| 333.18 | 1975.29 | 1975 | 4 | +| 333.92 | 1975.38 | 1975 | 5 | +| 333.43 | 1975.46 | 1975 | 6 | +| 331.85 | 1975.54 | 1975 | 7 | +| 330.01 | 1975.63 | 1975 | 8 | +| 328.51 | 1975.71 | 1975 | 9 | +| 328.41 | 1975.79 | 1975 | 10 | +| 329.25 | 1975.88 | 1975 | 11 | +| 330.97 | 1975.96 | 1975 | 12 | + +✅ Визначте змінну, яка змінюється з часом у цьому наборі даних + +## Характеристики даних часових рядів, які слід враховувати + +Коли ви дивитеся на дані часових рядів, ви можете помітити, що вони мають [певні характеристики](https://online.stat.psu.edu/stat510/lesson/1/1.1), які потрібно враховувати і зменшувати, щоб краще зрозуміти їх закономірності. Якщо ви розглядаєте дані часових рядів як потенційний "сигнал", який ви хочете аналізувати, ці характеристики можна вважати "шумом". Вам часто доведеться зменшувати цей "шум", компенсуючи деякі з цих характеристик за допомогою статистичних методів. + +Ось деякі поняття, які вам слід знати, щоб працювати з часовими рядами: + +🎓 **Тренди** + +Тренди визначаються як вимірювані збільшення і зменшення з часом. [Дізнайтеся більше](https://machinelearningmastery.com/time-series-trends-in-python). У контексті часових рядів це про те, як використовувати і, якщо необхідно, видаляти тренди з ваших часових рядів. + +🎓 **[Сезонність](https://machinelearningmastery.com/time-series-seasonality-with-python/)** + +Сезонність визначається як періодичні коливання, наприклад, святкові сплески, які можуть впливати на продажі. [Подивіться](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm), як різні типи графіків демонструють сезонність у даних. + +🎓 **Викиди** + +Викиди — це точки даних, які значно відхиляються від стандартної варіації даних. + +🎓 **Довгостроковий цикл** + +Незалежно від сезонності, дані можуть демонструвати довгостроковий цикл, наприклад, економічний спад, який триває більше року. + +🎓 **Постійна варіація** + +З часом деякі дані демонструють постійні коливання, наприклад, використання енергії вдень і вночі. + +🎓 **Різкі зміни** + +Дані можуть демонструвати різку зміну, яка потребує додаткового аналізу. Наприклад, різке закриття бізнесів через COVID спричинило зміни в даних. + +✅ Ось [зразок графіка часових рядів](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python), що показує щоденні витрати на внутрішньоігрову валюту протягом кількох років. Чи можете ви визначити будь-які з характеристик, зазначених вище, у цих даних? + +![Витрати на внутрішньоігрову валюту](../../../../7-TimeSeries/1-Introduction/images/currency.png) + +## Вправа — початок роботи з даними про використання електроенергії + +Давайте почнемо створювати модель часових рядів для прогнозування майбутнього використання електроенергії на основі минулих даних. + +> Дані в цьому прикладі взяті з конкурсу прогнозування GEFCom2014. Вони містять 3 роки годинних значень електричного навантаження та температури між 2012 і 2014 роками. +> +> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli і Rob J. Hyndman, "Ймовірнісне прогнозування енергії: Глобальний конкурс прогнозування енергії 2014 і далі", International Journal of Forecasting, vol.32, no.3, pp 896-913, липень-вересень, 2016. + +1. У папці `working` цього уроку відкрийте файл _notebook.ipynb_. Почніть з додавання бібліотек, які допоможуть вам завантажувати та візуалізувати дані: + + ```python + import os + import matplotlib.pyplot as plt + from common.utils import load_data + %matplotlib inline + ``` + + Зверніть увагу, що ви використовуєте файли з включеної папки `common`, які налаштовують ваше середовище і обробляють завантаження даних. + +2. Далі, досліджуйте дані як датафрейм, викликаючи `load_data()` і `head()`: + + ```python + data_dir = './data' + energy = load_data(data_dir)[['load']] + energy.head() + ``` + + Ви можете побачити, що є два стовпці, які представляють дату і навантаження: + + | | load | + | :-----------------: | :----: | + | 2012-01-01 00:00:00 | 2698.0 | + | 2012-01-01 01:00:00 | 2558.0 | + | 2012-01-01 02:00:00 | 2444.0 | + | 2012-01-01 03:00:00 | 2402.0 | + | 2012-01-01 04:00:00 | 2403.0 | + +3. Тепер побудуйте графік даних, викликаючи `plot()`: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![графік енергії](../../../../7-TimeSeries/1-Introduction/images/energy-plot.png) + +4. Тепер побудуйте графік першого тижня липня 2014 року, надавши його як вхідні дані до `energy` у форматі `[від дати]: [до дати]`: + + ```python + energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![липень](../../../../7-TimeSeries/1-Introduction/images/july-2014.png) + + Чудовий графік! Подивіться на ці графіки і спробуйте визначити будь-які з характеристик, зазначених вище. Що ми можемо припустити, візуалізуючи дані? + +У наступному уроці ви створите модель ARIMA для створення прогнозів. + +--- + +## 🚀Виклик + +Складіть список усіх галузей і сфер досліджень, які, на вашу думку, могли б отримати користь від прогнозування часових рядів. Чи можете ви придумати застосування цих методів у мистецтві? У економетриці? Екології? Роздрібній торгівлі? Промисловості? Фінансах? Де ще? + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Хоча ми не будемо розглядати їх тут, нейронні мережі іноді використовуються для покращення класичних методів прогнозування часових рядів. Дізнайтеся більше про них [у цій статті](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412) + +## Завдання + +[Візуалізуйте ще кілька часових рядів](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/7-TimeSeries/1-Introduction/assignment.md b/translations/uk/7-TimeSeries/1-Introduction/assignment.md new file mode 100644 index 00000000..5abb1335 --- /dev/null +++ b/translations/uk/7-TimeSeries/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Візуалізація додаткових часових рядів + +## Інструкції + +Ви почали вивчати прогнозування часових рядів, розглядаючи тип даних, які потребують цього спеціального моделювання. Ви вже візуалізували деякі дані, пов’язані з енергетикою. Тепер знайдіть інші дані, які могли б отримати користь від прогнозування часових рядів. Знайдіть три приклади (спробуйте [Kaggle](https://kaggle.com) і [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)) і створіть ноутбук для їх візуалізації. Занотуйте будь-які особливі характеристики цих даних (сезонність, різкі зміни чи інші тренди) у ноутбуці. + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | ----------------------------------------------------- | --------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| | Три набори даних візуалізовані та пояснені у ноутбуці | Два набори даних візуалізовані та пояснені у ноутбуці | Мало наборів даних візуалізовано або пояснено у ноутбуці, або представлені дані є недостатніми | + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/7-TimeSeries/1-Introduction/solution/Julia/README.md b/translations/uk/7-TimeSeries/1-Introduction/solution/Julia/README.md new file mode 100644 index 00000000..8466560c --- /dev/null +++ b/translations/uk/7-TimeSeries/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/7-TimeSeries/1-Introduction/solution/R/README.md b/translations/uk/7-TimeSeries/1-Introduction/solution/R/README.md new file mode 100644 index 00000000..9891e904 --- /dev/null +++ b/translations/uk/7-TimeSeries/1-Introduction/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/7-TimeSeries/2-ARIMA/README.md b/translations/uk/7-TimeSeries/2-ARIMA/README.md new file mode 100644 index 00000000..7789d98a --- /dev/null +++ b/translations/uk/7-TimeSeries/2-ARIMA/README.md @@ -0,0 +1,407 @@ + +# Прогнозування часових рядів за допомогою ARIMA + +У попередньому уроці ви дізналися трохи про прогнозування часових рядів і завантажили набір даних, що показує коливання електричного навантаження за певний період часу. + +[![Вступ до ARIMA](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Вступ до ARIMA") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео: Короткий вступ до моделей ARIMA. Приклад виконаний у R, але концепції є універсальними. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +## Вступ + +У цьому уроці ви дізнаєтеся про конкретний спосіб створення моделей за допомогою [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average). Моделі ARIMA особливо добре підходять для аналізу даних, які демонструють [нестаціонарність](https://wikipedia.org/wiki/Stationary_process). + +## Загальні концепції + +Щоб працювати з ARIMA, необхідно знати кілька ключових понять: + +- 🎓 **Стаціонарність**. У статистичному контексті стаціонарність означає дані, розподіл яких не змінюється при зсуві в часі. Нестаціонарні дані, навпаки, демонструють коливання через тренди, які потрібно трансформувати для аналізу. Наприклад, сезонність може викликати коливання в даних, які можна усунути шляхом "сезонного диференціювання". + +- 🎓 **[Диференціювання](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. Диференціювання даних у статистичному контексті означає процес трансформації нестаціонарних даних для перетворення їх у стаціонарні шляхом усунення неконстантного тренду. "Диференціювання усуває зміни рівня часових рядів, ліквідуючи тренд і сезонність, тим самим стабілізуючи середнє значення часових рядів." [Стаття Шіксіонга та ін.](https://arxiv.org/abs/1904.07632) + +## ARIMA у контексті часових рядів + +Розглянемо складові ARIMA, щоб краще зрозуміти, як вона допомагає моделювати часові ряди та робити прогнози. + +- **AR - Автокореляція**. Автокореляційні моделі, як випливає з назви, аналізують попередні значення ваших даних, щоб зробити припущення про них. Ці попередні значення називаються "лагами". Наприклад, дані, що показують щомісячні продажі олівців. Загальна кількість продажів кожного місяця буде вважатися "змінною, що еволюціонує" в наборі даних. Ця модель будується як "змінна, що еволюціонує, регресується на своїх власних лагових (тобто попередніх) значеннях." [wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) + +- **I - Інтеграція**. На відміну від схожих моделей 'ARMA', 'I' в ARIMA означає її *[інтегровану](https://wikipedia.org/wiki/Order_of_integration)* складову. Дані стають "інтегрованими", коли застосовуються кроки диференціювання для усунення нестаціонарності. + +- **MA - Змінне середнє**. Складова [змінного середнього](https://wikipedia.org/wiki/Moving-average_model) цієї моделі стосується вихідної змінної, яка визначається шляхом спостереження за поточними та минулими значеннями лагів. + +Суть: ARIMA використовується для того, щоб модель максимально точно відповідала особливій формі даних часових рядів. + +## Вправа - створення моделі ARIMA + +Відкрийте папку [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) у цьому уроці та знайдіть файл [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb). + +1. Запустіть ноутбук, щоб завантажити бібліотеку Python `statsmodels`; вона знадобиться для моделей ARIMA. + +1. Завантажте необхідні бібліотеки. + +1. Тепер завантажте кілька додаткових бібліотек, корисних для побудови графіків: + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from pandas.plotting import autocorrelation_plot + from statsmodels.tsa.statespace.sarimax import SARIMAX + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + from IPython.display import Image + + %matplotlib inline + pd.options.display.float_format = '{:,.2f}'.format + np.set_printoptions(precision=2) + warnings.filterwarnings("ignore") # specify to ignore warning messages + ``` + +1. Завантажте дані з файлу `/data/energy.csv` у Pandas DataFrame і перегляньте їх: + + ```python + energy = load_data('./data')[['load']] + energy.head(10) + ``` + +1. Побудуйте графік усіх доступних даних про енергію з січня 2012 року по грудень 2014 року. Ніяких сюрпризів не буде, оскільки ми бачили ці дані в попередньому уроці: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + Тепер давайте створимо модель! + +### Створення навчальних і тестових наборів даних + +Тепер ваші дані завантажені, і ви можете розділити їх на навчальний і тестовий набори. Ви будете тренувати свою модель на навчальному наборі. Як завжди, після завершення навчання моделі ви оціните її точність за допомогою тестового набору. Ви повинні переконатися, що тестовий набір охоплює більш пізній період часу, ніж навчальний, щоб модель не отримала інформацію з майбутніх періодів часу. + +1. Виділіть двомісячний період з 1 вересня по 31 жовтня 2014 року для навчального набору. Тестовий набір включатиме двомісячний період з 1 листопада по 31 грудня 2014 року: + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + + Оскільки ці дані відображають щоденне споживання енергії, існує сильна сезонна закономірність, але споживання найбільш схоже на споживання в більш недавні дні. + +1. Візуалізуйте відмінності: + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![навчальні та тестові дані](../../../../7-TimeSeries/2-ARIMA/images/train-test.png) + + Таким чином, використання відносно невеликого періоду часу для навчання даних має бути достатнім. + + > Примітка: Оскільки функція, яку ми використовуємо для підгонки моделі ARIMA, використовує внутрішньовибіркову валідацію під час підгонки, ми пропустимо дані для валідації. + +### Підготовка даних до навчання + +Тепер вам потрібно підготувати дані до навчання, виконавши фільтрацію та масштабування даних. Відфільтруйте ваш набір даних, щоб включити лише потрібні періоди часу та стовпці, а також масштабування, щоб дані були представлені в інтервалі 0,1. + +1. Відфільтруйте оригінальний набір даних, щоб включити лише зазначені періоди часу для кожного набору та лише потрібний стовпець 'load' плюс дату: + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + Ви можете побачити форму даних: + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +1. Масштабуйте дані, щоб вони були в діапазоні (0, 1). + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + train.head(10) + ``` + +1. Візуалізуйте оригінальні та масштабовані дані: + + ```python + energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12) + train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12) + plt.show() + ``` + + ![оригінальні](../../../../7-TimeSeries/2-ARIMA/images/original.png) + + > Оригінальні дані + + ![масштабовані](../../../../7-TimeSeries/2-ARIMA/images/scaled.png) + + > Масштабовані дані + +1. Тепер, коли ви відкалібрували масштабовані дані, ви можете масштабувати тестові дані: + + ```python + test['load'] = scaler.transform(test) + test.head() + ``` + +### Реалізація ARIMA + +Настав час реалізувати ARIMA! Тепер ви будете використовувати бібліотеку `statsmodels`, яку ви встановили раніше. + +Тепер вам потрібно виконати кілька кроків: + + 1. Визначте модель, викликавши `SARIMAX()` і передавши параметри моделі: параметри p, d і q, а також параметри P, D і Q. + 2. Підготуйте модель для навчальних даних, викликавши функцію fit(). + 3. Зробіть прогнози, викликавши функцію `forecast()` і вказавши кількість кроків (горизонт), які потрібно прогнозувати. + +> 🎓 Що означають всі ці параметри? У моделі ARIMA є 3 параметри, які використовуються для моделювання основних аспектів часових рядів: сезонності, тренду та шуму. Ці параметри: + +`p`: параметр, пов'язаний з автокореляційною складовою моделі, яка враховує *попередні* значення. +`d`: параметр, пов'язаний з інтегрованою частиною моделі, який впливає на кількість *диференціювань* (🎓 пам'ятаєте диференціювання 👆?) для застосування до часових рядів. +`q`: параметр, пов'язаний із складовою змінного середнього моделі. + +> Примітка: Якщо ваші дані мають сезонний аспект - як у цьому випадку - , ми використовуємо сезонну модель ARIMA (SARIMA). У цьому випадку потрібно використовувати інший набір параметрів: `P`, `D` і `Q`, які описують ті ж асоціації, що й `p`, `d` і `q`, але відповідають сезонним компонентам моделі. + +1. Почніть із встановлення бажаного значення горизонту. Спробуємо 3 години: + + ```python + # Specify the number of steps to forecast ahead + HORIZON = 3 + print('Forecasting horizon:', HORIZON, 'hours') + ``` + + Вибір найкращих значень для параметрів моделі ARIMA може бути складним, оскільки це дещо суб'єктивно і потребує часу. Ви можете розглянути можливість використання функції `auto_arima()` з бібліотеки [`pyramid`](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html). + +1. Поки що спробуйте кілька ручних варіантів, щоб знайти хорошу модель. + + ```python + order = (4, 1, 0) + seasonal_order = (1, 1, 0, 24) + + model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order) + results = model.fit() + + print(results.summary()) + ``` + + Виводиться таблиця результатів. + +Ви створили свою першу модель! Тепер нам потрібно знайти спосіб її оцінити. + +### Оцінка вашої моделі + +Щоб оцінити вашу модель, ви можете виконати так звану валідацію `walk forward`. На практиці моделі часових рядів перенавчаються кожного разу, коли стають доступними нові дані. Це дозволяє моделі робити найкращий прогноз на кожному кроці часу. + +Починаючи з початку часових рядів, використовуючи цю техніку, навчіть модель на навчальному наборі даних. Потім зробіть прогноз на наступний крок часу. Прогноз оцінюється порівняно з відомим значенням. Навчальний набір потім розширюється, щоб включити відоме значення, і процес повторюється. + +> Примітка: Ви повинні зберігати фіксоване вікно навчального набору для більш ефективного навчання, щоб кожного разу, коли ви додаєте нове спостереження до навчального набору, ви видаляли спостереження з початку набору. + +Цей процес забезпечує більш надійну оцінку того, як модель буде працювати на практиці. Однак це має обчислювальну вартість створення такої кількості моделей. Це прийнятно, якщо дані невеликі або модель проста, але може бути проблемою в масштабі. + +Валідація `walk forward` є золотим стандартом оцінки моделей часових рядів і рекомендується для ваших власних проєктів. + +1. Спочатку створіть тестову точку даних для кожного кроку HORIZON. + + ```python + test_shifted = test.copy() + + for t in range(1, HORIZON+1): + test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H') + + test_shifted = test_shifted.dropna(how='any') + test_shifted.head(5) + ``` + + | | | load | load+1 | load+2 | + | ---------- | -------- | ---- | ------ | ------ | + | 2014-12-30 | 00:00:00 | 0.33 | 0.29 | 0.27 | + | 2014-12-30 | 01:00:00 | 0.29 | 0.27 | 0.27 | + | 2014-12-30 | 02:00:00 | 0.27 | 0.27 | 0.30 | + | 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 | + | 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 | + + Дані зміщуються горизонтально відповідно до їхньої точки горизонту. + +1. Зробіть прогнози для ваших тестових даних, використовуючи цей підхід ковзного вікна в циклі розміром довжини тестових даних: + + ```python + %%time + training_window = 720 # dedicate 30 days (720 hours) for training + + train_ts = train['load'] + test_ts = test_shifted + + history = [x for x in train_ts] + history = history[(-training_window):] + + predictions = list() + + order = (2, 1, 0) + seasonal_order = (1, 1, 0, 24) + + for t in range(test_ts.shape[0]): + model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order) + model_fit = model.fit() + yhat = model_fit.forecast(steps = HORIZON) + predictions.append(yhat) + obs = list(test_ts.iloc[t]) + # move the training window + history.append(obs[0]) + history.pop(0) + print(test_ts.index[t]) + print(t+1, ': predicted =', yhat, 'expected =', obs) + ``` + + Ви можете спостерігати за процесом навчання: + + ```output + 2014-12-30 00:00:00 + 1 : predicted = [0.32 0.29 0.28] expected = [0.32945389435989236, 0.2900626678603402, 0.2739480752014323] + + 2014-12-30 01:00:00 + 2 : predicted = [0.3 0.29 0.3 ] expected = [0.2900626678603402, 0.2739480752014323, 0.26812891674127126] + + 2014-12-30 02:00:00 + 3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795] + ``` + +1. Порівняйте прогнози з фактичним навантаженням: + + ```python + eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)]) + eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1] + eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h') + eval_df['actual'] = np.array(np.transpose(test_ts)).ravel() + eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']]) + eval_df.head() + ``` + + Вивід + | | | timestamp | h | prediction | actual | + | --- | ---------- | --------- | --- | ---------- | -------- | + | 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 | + | 1 | 2014-12-30 | 01:00:00 | t+1 | 2,955.53 | 2,935.00 | + | 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 | + | 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 | + | 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 | + + Спостерігайте за прогнозом даних за годину, порівняно з фактичним навантаженням. Наскільки це точно? + +### Перевірка точності моделі + +Перевірте точність вашої моделі, протестувавши її середню абсолютну процентну помилку (MAPE) для всіх прогнозів. +> **🧮 Покажіть мені математику** +> +> ![MAPE](../../../../7-TimeSeries/2-ARIMA/images/mape.png) +> +> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) використовується для демонстрації точності прогнозу як співвідношення, визначеного за формулою вище. Різниця між фактичним і прогнозованим значенням ділиться на фактичне. +> +> "Абсолютне значення в цьому розрахунку підсумовується для кожної прогнозованої точки в часі і ділиться на кількість точок n." [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error) +1. Виразіть рівняння у коді: + + ```python + if(HORIZON > 1): + eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual'] + print(eval_df.groupby('h')['APE'].mean()) + ``` + +1. Розрахуйте MAPE для одного кроку: + + ```python + print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%') + ``` + + MAPE прогнозу на один крок: 0.5570581332313952 % + +1. Виведіть MAPE для багатокрокового прогнозу: + + ```python + print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%') + ``` + + ```output + Multi-step forecast MAPE: 1.1460048657704118 % + ``` + + Найкраще, коли число низьке: врахуйте, що прогноз із MAPE 10 має похибку в 10%. + +1. Але, як завжди, легше оцінити точність візуально, тому давайте побудуємо графік: + + ```python + if(HORIZON == 1): + ## Plotting single step forecast + eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8)) + + else: + ## Plotting multi step forecast + plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']] + for t in range(1, HORIZON+1): + plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values + + fig = plt.figure(figsize=(15, 8)) + ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0) + ax = fig.add_subplot(111) + for t in range(1, HORIZON+1): + x = plot_df['timestamp'][(t-1):] + y = plot_df['t+'+str(t)][0:len(x)] + ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t)) + + ax.legend(loc='best') + + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![модель часових рядів](../../../../7-TimeSeries/2-ARIMA/images/accuracy.png) + +🏆 Дуже гарний графік, який демонструє модель з хорошою точністю. Чудова робота! + +--- + +## 🚀Виклик + +Досліджуйте способи перевірки точності моделі часових рядів. У цьому уроці ми торкаємося MAPE, але чи є інші методи, які ви могли б використати? Дослідіть їх і додайте коментарі. Корисний документ можна знайти [тут](https://otexts.com/fpp2/accuracy.html) + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +У цьому уроці ми розглядаємо лише основи прогнозування часових рядів за допомогою ARIMA. Приділіть час для поглиблення знань, дослідивши [цей репозиторій](https://microsoft.github.io/forecasting/) і його різні типи моделей, щоб дізнатися інші способи створення моделей часових рядів. + +## Завдання + +[Нова модель ARIMA](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/7-TimeSeries/2-ARIMA/assignment.md b/translations/uk/7-TimeSeries/2-ARIMA/assignment.md new file mode 100644 index 00000000..58d9cef7 --- /dev/null +++ b/translations/uk/7-TimeSeries/2-ARIMA/assignment.md @@ -0,0 +1,25 @@ + +# Новий ARIMA-модель + +## Інструкції + +Тепер, коли ви створили ARIMA-модель, створіть нову з новими даними (спробуйте один із [цих наборів даних від Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Додайте коментарі до своєї роботи в ноутбуці, візуалізуйте дані та вашу модель, а також перевірте її точність за допомогою MAPE. + +## Рубрика + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ----------------------------------- | +| | Представлено ноутбук із новою ARIMA-моделлю, протестованою та поясненою з візуалізаціями і зазначеною точністю. | Представлений ноутбук не містить коментарів або має помилки | Представлено неповний ноутбук | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/7-TimeSeries/2-ARIMA/solution/Julia/README.md b/translations/uk/7-TimeSeries/2-ARIMA/solution/Julia/README.md new file mode 100644 index 00000000..6267050a --- /dev/null +++ b/translations/uk/7-TimeSeries/2-ARIMA/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/7-TimeSeries/2-ARIMA/solution/R/README.md b/translations/uk/7-TimeSeries/2-ARIMA/solution/R/README.md new file mode 100644 index 00000000..e40896cf --- /dev/null +++ b/translations/uk/7-TimeSeries/2-ARIMA/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/7-TimeSeries/3-SVR/README.md b/translations/uk/7-TimeSeries/3-SVR/README.md new file mode 100644 index 00000000..d3f82d30 --- /dev/null +++ b/translations/uk/7-TimeSeries/3-SVR/README.md @@ -0,0 +1,393 @@ + +# Прогнозування часових рядів за допомогою регресора опорних векторів + +У попередньому уроці ви дізналися, як використовувати модель ARIMA для прогнозування часових рядів. Тепер ви ознайомитеся з моделлю регресора опорних векторів (Support Vector Regressor), яка використовується для прогнозування безперервних даних. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +## Вступ + +У цьому уроці ви дізнаєтеся, як створювати моделі за допомогою [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) для регресії, або **SVR: Support Vector Regressor**. + +### SVR у контексті часових рядів [^1] + +Перед тим як зрозуміти важливість SVR у прогнозуванні часових рядів, ось кілька важливих концепцій, які вам потрібно знати: + +- **Регресія:** Техніка навчання з учителем для прогнозування безперервних значень на основі заданого набору вхідних даних. Ідея полягає у побудові кривої (або лінії) у просторі ознак, яка має максимальну кількість точок даних. [Натисніть тут](https://en.wikipedia.org/wiki/Regression_analysis) для отримання додаткової інформації. +- **Машина опорних векторів (SVM):** Тип моделі машинного навчання з учителем, яка використовується для класифікації, регресії та виявлення аномалій. Модель є гіперплощиною у просторі ознак, яка у випадку класифікації виступає як межа, а у випадку регресії — як лінія найкращого підходу. У SVM зазвичай використовується функція ядра для перетворення набору даних у простір з більшою кількістю вимірів, щоб вони могли бути легко розділені. [Натисніть тут](https://en.wikipedia.org/wiki/Support-vector_machine) для отримання додаткової інформації про SVM. +- **Регресор опорних векторів (SVR):** Тип SVM, який знаходить лінію найкращого підходу (яка у випадку SVM є гіперплощиною) з максимальною кількістю точок даних. + +### Чому SVR? [^1] + +У попередньому уроці ви дізналися про ARIMA, яка є дуже успішним статистичним лінійним методом для прогнозування даних часових рядів. Однак у багатьох випадках дані часових рядів мають *нелінійність*, яку неможливо відобразити за допомогою лінійних моделей. У таких випадках здатність SVM враховувати нелінійність даних для задач регресії робить SVR успішним у прогнозуванні часових рядів. + +## Вправа - створення моделі SVR + +Перші кілька кроків підготовки даних такі ж, як у попередньому уроці про [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA). + +Відкрийте папку [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) у цьому уроці та знайдіть файл [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb). [^2] + +1. Запустіть ноутбук та імпортуйте необхідні бібліотеки: [^2] + + ```python + import sys + sys.path.append('../../') + ``` + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from sklearn.svm import SVR + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + ``` + +2. Завантажте дані з файлу `/data/energy.csv` у Pandas DataFrame та перегляньте їх: [^2] + + ```python + energy = load_data('../../data')[['load']] + ``` + +3. Побудуйте графік усіх доступних даних про енергію з січня 2012 року до грудня 2014 року: [^2] + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![повні дані](../../../../7-TimeSeries/3-SVR/images/full-data.png) + + Тепер давайте створимо нашу модель SVR. + +### Створення навчальних і тестових наборів даних + +Тепер ваші дані завантажені, тому ви можете розділити їх на навчальний і тестовий набори. Потім ви переформатуєте дані, щоб створити набір даних на основі часових кроків, який буде потрібен для SVR. Ви навчите свою модель на навчальному наборі. Після завершення навчання моделі ви оціните її точність на навчальному наборі, тестовому наборі, а потім на повному наборі даних, щоб побачити загальну продуктивність. Ви повинні переконатися, що тестовий набір охоплює більш пізній період часу, ніж навчальний набір, щоб гарантувати, що модель не отримує інформацію з майбутніх періодів часу [^2] (ситуація, відома як *перенавчання*). + +1. Виділіть двомісячний період з 1 вересня по 31 жовтня 2014 року для навчального набору. Тестовий набір включатиме двомісячний період з 1 листопада по 31 грудня 2014 року: [^2] + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + +2. Візуалізуйте відмінності: [^2] + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![навчальні та тестові дані](../../../../7-TimeSeries/3-SVR/images/train-test.png) + +### Підготовка даних для навчання + +Тепер вам потрібно підготувати дані для навчання, виконавши фільтрацію та масштабування даних. Відфільтруйте ваш набір даних, щоб включити лише потрібні періоди часу та стовпці, а також виконайте масштабування, щоб дані були представлені в інтервалі 0,1. + +1. Відфільтруйте оригінальний набір даних, щоб включити лише зазначені періоди часу для кожного набору та лише потрібний стовпець 'load' плюс дату: [^2] + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +2. Масштабуйте навчальні дані до діапазону (0, 1): [^2] + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + ``` + +4. Тепер масштабуйте тестові дані: [^2] + + ```python + test['load'] = scaler.transform(test) + ``` + +### Створення даних із часовими кроками [^1] + +Для SVR ви перетворюєте вхідні дані у форму `[batch, timesteps]`. Тобто ви переформатуєте існуючі `train_data` та `test_data`, щоб додати новий вимір, який відповідає часовим крокам. + +```python +# Converting to numpy arrays +train_data = train.values +test_data = test.values +``` + +Для цього прикладу ми беремо `timesteps = 5`. Отже, вхідні дані для моделі — це дані за перші 4 часові кроки, а вихідні — дані за 5-й часовий крок. + +```python +timesteps=5 +``` + +Перетворення навчальних даних у 2D-тензор за допомогою вкладеного спискового розуміння: + +```python +train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0] +train_data_timesteps.shape +``` + +```output +(1412, 5) +``` + +Перетворення тестових даних у 2D-тензор: + +```python +test_data_timesteps=np.array([[j for j in test_data[i:i+timesteps]] for i in range(0,len(test_data)-timesteps+1)])[:,:,0] +test_data_timesteps.shape +``` + +```output +(44, 5) +``` + +Вибір вхідних і вихідних даних із навчальних і тестових даних: + +```python +x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]] +x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]] + +print(x_train.shape, y_train.shape) +print(x_test.shape, y_test.shape) +``` + +```output +(1412, 4) (1412, 1) +(44, 4) (44, 1) +``` + +### Реалізація SVR [^1] + +Тепер настав час реалізувати SVR. Щоб дізнатися більше про цю реалізацію, ви можете звернутися до [цієї документації](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html). Для нашої реалізації ми дотримуємося таких кроків: + + 1. Визначте модель, викликавши `SVR()` і передавши гіперпараметри моделі: kernel, gamma, c та epsilon + 2. Підготуйте модель для навчальних даних, викликавши функцію `fit()` + 3. Зробіть прогнози, викликавши функцію `predict()` + +Тепер ми створюємо модель SVR. Тут ми використовуємо [RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) і встановлюємо гіперпараметри gamma, C та epsilon як 0.5, 10 та 0.05 відповідно. + +```python +model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05) +``` + +#### Навчання моделі на навчальних даних [^1] + +```python +model.fit(x_train, y_train[:,0]) +``` + +```output +SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5, + kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False) +``` + +#### Прогнозування за допомогою моделі [^1] + +```python +y_train_pred = model.predict(x_train).reshape(-1,1) +y_test_pred = model.predict(x_test).reshape(-1,1) + +print(y_train_pred.shape, y_test_pred.shape) +``` + +```output +(1412, 1) (44, 1) +``` + +Ви створили SVR! Тепер потрібно оцінити його. + +### Оцінка вашої моделі [^1] + +Для оцінки спочатку ми повернемо дані до оригінального масштабу. Потім, щоб перевірити продуктивність, ми побудуємо графік оригінальних і прогнозованих часових рядів, а також виведемо результат MAPE. + +Масштабування прогнозованих і оригінальних вихідних даних: + +```python +# Scaling the predictions +y_train_pred = scaler.inverse_transform(y_train_pred) +y_test_pred = scaler.inverse_transform(y_test_pred) + +print(len(y_train_pred), len(y_test_pred)) +``` + +```python +# Scaling the original values +y_train = scaler.inverse_transform(y_train) +y_test = scaler.inverse_transform(y_test) + +print(len(y_train), len(y_test)) +``` + +#### Перевірка продуктивності моделі на навчальних і тестових даних [^1] + +Ми витягуємо часові мітки з набору даних, щоб показати їх на осі x нашого графіка. Зверніть увагу, що ми використовуємо перші ```timesteps-1``` значення як вхідні дані для першого вихідного значення, тому часові мітки для вихідних даних почнуться після цього. + +```python +train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:] +test_timestamps = energy[test_start_dt:].index[timesteps-1:] + +print(len(train_timestamps), len(test_timestamps)) +``` + +```output +1412 44 +``` + +Побудова графіка прогнозів для навчальних даних: + +```python +plt.figure(figsize=(25,6)) +plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.title("Training data prediction") +plt.show() +``` + +![прогноз навчальних даних](../../../../7-TimeSeries/3-SVR/images/train-data-predict.png) + +Виведення MAPE для навчальних даних + +```python +print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%') +``` + +```output +MAPE for training data: 1.7195710200875551 % +``` + +Побудова графіка прогнозів для тестових даних + +```python +plt.figure(figsize=(10,3)) +plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![прогноз тестових даних](../../../../7-TimeSeries/3-SVR/images/test-data-predict.png) + +Виведення MAPE для тестових даних + +```python +print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%') +``` + +```output +MAPE for testing data: 1.2623790187854018 % +``` + +🏆 Ви отримали дуже хороший результат на тестовому наборі даних! + +### Перевірка продуктивності моделі на повному наборі даних [^1] + +```python +# Extracting load values as numpy array +data = energy.copy().values + +# Scaling +data = scaler.transform(data) + +# Transforming to 2D tensor as per model input requirement +data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0] +print("Tensor shape: ", data_timesteps.shape) + +# Selecting inputs and outputs from data +X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]] +print("X shape: ", X.shape,"\nY shape: ", Y.shape) +``` + +```output +Tensor shape: (26300, 5) +X shape: (26300, 4) +Y shape: (26300, 1) +``` + +```python +# Make model predictions +Y_pred = model.predict(X).reshape(-1,1) + +# Inverse scale and reshape +Y_pred = scaler.inverse_transform(Y_pred) +Y = scaler.inverse_transform(Y) +``` + +```python +plt.figure(figsize=(30,8)) +plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(Y_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![прогноз повних даних](../../../../7-TimeSeries/3-SVR/images/full-data-predict.png) + +```python +print('MAPE: ', mape(Y_pred, Y)*100, '%') +``` + +```output +MAPE: 2.0572089029888656 % +``` + +🏆 Дуже гарні графіки, які показують модель з хорошою точністю. Чудова робота! + +--- + +## 🚀Виклик + +- Спробуйте змінити гіперпараметри (gamma, C, epsilon) під час створення моделі та оцінити дані, щоб побачити, який набір гіперпараметрів дає найкращі результати на тестових даних. Щоб дізнатися більше про ці гіперпараметри, ви можете звернутися до документа [тут](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel). +- Спробуйте використовувати різні функції ядра для моделі та аналізувати їх продуктивність на наборі даних. Корисний документ можна знайти [тут](https://scikit-learn.org/stable/modules/svm.html#kernel-functions). +- Спробуйте використовувати різні значення для `timesteps`, щоб модель могла дивитися назад для прогнозування. + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Цей урок був присвячений застосуванню SVR для прогнозування часових рядів. Щоб дізнатися більше про SVR, ви можете звернутися до [цього блогу](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/). Ця [документація scikit-learn](https://scikit-learn.org/stable/modules/svm.html) надає більш детальне пояснення про SVM загалом, [SVR](https://scikit-learn.org/stable/modules/svm.html#regression), а також інші деталі реалізації, такі як різні [функції ядра](https://scikit-learn.org/stable/modules/svm.html#kernel-functions), які можна використовувати, та їх параметри. + +## Завдання + +[Нова модель SVR](assignment.md) + +## Подяки + +[^1]: Текст, код і результати в цьому розділі були надані [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD) +[^2]: Текст, код і результати в цьому розділі були взяті з [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/7-TimeSeries/3-SVR/assignment.md b/translations/uk/7-TimeSeries/3-SVR/assignment.md new file mode 100644 index 00000000..14c4d133 --- /dev/null +++ b/translations/uk/7-TimeSeries/3-SVR/assignment.md @@ -0,0 +1,29 @@ + +# Нова модель SVR + +## Інструкції [^1] + +Тепер, коли ви створили модель SVR, створіть нову, використовуючи свіжі дані (спробуйте один із [цих наборів даних від Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Додайте коментарі до своєї роботи в ноутбуці, візуалізуйте дані та вашу модель, а також протестуйте її точність за допомогою відповідних графіків і MAPE. Спробуйте також змінити різні гіперпараметри та використати різні значення для часових кроків. + +## Критерії оцінювання [^1] + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | ----------------------------------------------------------- | ------------------------------------------------------- | --------------------------------- | +| | Представлено ноутбук із побудованою, протестованою та поясненою моделлю SVR, з візуалізаціями та зазначеною точністю. | Представлено ноутбук без коментарів або з помилками. | Представлено неповний ноутбук. | + + + +[^1]:Текст у цьому розділі базується на [завданні з ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/7-TimeSeries/README.md b/translations/uk/7-TimeSeries/README.md new file mode 100644 index 00000000..b812c5b7 --- /dev/null +++ b/translations/uk/7-TimeSeries/README.md @@ -0,0 +1,37 @@ + +# Вступ до прогнозування часових рядів + +Що таке прогнозування часових рядів? Це процес передбачення майбутніх подій шляхом аналізу тенденцій минулого. + +## Регіональна тема: світове споживання електроенергії ✨ + +У цих двох уроках ви познайомитеся з прогнозуванням часових рядів — менш відомою, але надзвичайно корисною галуззю машинного навчання, яка має велике значення для промислових і бізнесових застосувань, а також інших сфер. Хоча нейронні мережі можуть бути використані для підвищення ефективності цих моделей, ми вивчатимемо їх у контексті класичного машинного навчання, оскільки моделі допомагають прогнозувати майбутню продуктивність на основі минулого. + +Наш регіональний фокус — споживання електроенергії у світі, цікавий набір даних для вивчення прогнозування майбутнього використання електроенергії на основі моделей минулого навантаження. Ви можете побачити, наскільки корисним може бути таке прогнозування в бізнес-середовищі. + +![електрична мережа](../../../7-TimeSeries/images/electric-grid.jpg) + +Фото [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) електричних веж на дорозі в Раджастані на [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +## Уроки + +1. [Вступ до прогнозування часових рядів](1-Introduction/README.md) +2. [Створення моделей ARIMA для часових рядів](2-ARIMA/README.md) +3. [Створення регресора на основі опорних векторів для прогнозування часових рядів](3-SVR/README.md) + +## Автори + +"Вступ до прогнозування часових рядів" написано з ⚡️ [Francesca Lazzeri](https://twitter.com/frlazzeri) та [Jen Looper](https://twitter.com/jenlooper). Ноутбуки вперше з'явилися онлайн у [репозиторії Azure "Deep Learning For Time Series"](https://github.com/Azure/DeepLearningForTimeSeriesForecasting), який спочатку був написаний Francesca Lazzeri. Урок про SVR написаний [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD). + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/8-Reinforcement/1-QLearning/README.md b/translations/uk/8-Reinforcement/1-QLearning/README.md new file mode 100644 index 00000000..1887f22d --- /dev/null +++ b/translations/uk/8-Reinforcement/1-QLearning/README.md @@ -0,0 +1,258 @@ + +# Вступ до навчання з підкріпленням та Q-Learning + +![Резюме навчання з підкріпленням у машинному навчанні у вигляді скетчноту](../../../../sketchnotes/ml-reinforcement.png) +> Скетчнот від [Tomomi Imura](https://www.twitter.com/girlie_mac) + +Навчання з підкріпленням включає три важливі концепції: агент, деякі стани та набір дій для кожного стану. Виконуючи дію в заданому стані, агент отримує винагороду. Уявіть комп'ютерну гру Super Mario. Ви — Маріо, знаходитеся на рівні гри, стоїте поруч із краєм обриву. Над вами монета. Ви, як Маріо, на рівні гри, у певній позиції — це ваш стан. Переміщення на один крок вправо (дія) призведе до падіння з обриву, і це дасть вам низький числовий бал. Однак натискання кнопки стрибка дозволить вам отримати очко і залишитися живим. Це позитивний результат, і він повинен нагородити вас позитивним числовим балом. + +Використовуючи навчання з підкріпленням і симулятор (гру), ви можете навчитися грати в гру, щоб максимізувати винагороду, тобто залишатися живим і набирати якомога більше очок. + +[![Вступ до навчання з підкріпленням](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) + +> 🎥 Натисніть на зображення вище, щоб почути Дмитра, який розповідає про навчання з підкріпленням + +## [Квіз перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +## Передумови та налаштування + +У цьому уроці ми будемо експериментувати з кодом на Python. Ви повинні мати можливість виконувати код Jupyter Notebook з цього уроку, або на вашому комп'ютері, або десь у хмарі. + +Ви можете відкрити [ноутбук уроку](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), який використовується в коді ноутбука. Додайте його до тієї ж директорії, що й ноутбук. + +## Вступ + +У цьому уроці ми дослідимо світ **[Петрика і вовка](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, натхненний музичною казкою російського композитора [Сергія Прокоф'єва](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Ми використаємо **навчання з підкріпленням**, щоб дозволити Петрику досліджувати своє середовище, збирати смачні яблука і уникати зустрічі з вовком. + +**Навчання з підкріпленням** (RL) — це техніка навчання, яка дозволяє нам навчитися оптимальній поведінці **агента** в певному **середовищі**, проводячи багато експериментів. Агент у цьому середовищі повинен мати **мету**, визначену **функцією винагороди**. + +## Середовище + +Для простоти уявімо світ Петрика як квадратну дошку розміром `width` x `height`, як на цьому зображенні: + +![Середовище Петрика](../../../../8-Reinforcement/1-QLearning/images/environment.png) + +Кожна клітинка на цій дошці може бути: + +* **землею**, по якій Петрик та інші створіння можуть ходити. +* **водою**, по якій, очевидно, ходити не можна. +* **деревом** або **травою**, місцем, де можна відпочити. +* **яблуком**, яке Петрик буде радий знайти, щоб нагодувати себе. +* **вовком**, який небезпечний і якого слід уникати. + +Існує окремий модуль Python, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), який містить код для роботи з цим середовищем. Оскільки цей код не важливий для розуміння наших концепцій, ми імпортуємо модуль і використовуємо його для створення зразкової дошки (блок коду 1): + +```python +from rlboard import * + +width, height = 8,8 +m = Board(width,height) +m.randomize(seed=13) +m.plot() +``` + +Цей код повинен надрукувати зображення середовища, схоже на наведене вище. + +## Дії та політика + +У нашому прикладі мета Петрика — знайти яблуко, уникаючи вовка та інших перешкод. Для цього він може просто ходити, поки не знайде яблуко. + +Таким чином, у будь-якій позиції він може вибрати одну з наступних дій: вгору, вниз, вліво і вправо. + +Ми визначимо ці дії як словник і зіставимо їх із парами відповідних змін координат. Наприклад, рух вправо (`R`) буде відповідати парі `(1,0)`. (блок коду 2): + +```python +actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) } +action_idx = { a : i for i,a in enumerate(actions.keys()) } +``` + +Підсумовуючи, стратегія та мета цього сценарію такі: + +- **Стратегія** нашого агента (Петрика) визначається так званою **політикою**. Політика — це функція, яка повертає дію в будь-якому заданому стані. У нашому випадку стан проблеми представлений дошкою, включаючи поточну позицію гравця. + +- **Мета** навчання з підкріпленням — зрештою навчитися хорошій політиці, яка дозволить нам ефективно вирішувати проблему. Однак, як базовий варіант, розглянемо найпростішу політику, яку називають **випадковою прогулянкою**. + +## Випадкова прогулянка + +Спочатку вирішимо нашу проблему, реалізувавши стратегію випадкової прогулянки. У випадковій прогулянці ми будемо випадково вибирати наступну дію з дозволених дій, поки не досягнемо яблука (блок коду 3). + +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 + if start_position: + m.human = start_position + else: + m.random_start() + while True: + if m.at() == Board.Cell.apple: + return n # success! + if m.at() in [Board.Cell.wolf, Board.Cell.water]: + return -1 # eaten by wolf or drowned + 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 + break + n+=1 + + walk(m,random_policy) + ``` + + Виклик `walk` повинен повернути довжину відповідного шляху, яка може змінюватися від одного запуску до іншого. + +1. Запустіть експеримент прогулянки кілька разів (скажімо, 100) і надрукуйте отриману статистику (блок коду 4): + + ```python + def print_statistics(policy): + s,w,n = 0,0,0 + for _ in range(100): + z = walk(m,policy) + if z<0: + w+=1 + else: + s += z + n += 1 + print(f"Average path length = {s/n}, eaten by wolf: {w} times") + + print_statistics(random_policy) + ``` + + Зверніть увагу, що середня довжина шляху становить близько 30-40 кроків, що досить багато, враховуючи той факт, що середня відстань до найближчого яблука становить близько 5-6 кроків. + + Ви також можете побачити, як виглядає рух Петрика під час випадкової прогулянки: + + ![Випадкова прогулянка Петрика](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) + +## Функція винагороди + +Щоб зробити нашу політику більш розумною, нам потрібно зрозуміти, які кроки є "кращими" за інші. Для цього нам потрібно визначити нашу мету. + +Мета може бути визначена у вигляді **функції винагороди**, яка повертає певне значення оцінки для кожного стану. Чим більше число, тим краща функція винагороди. (блок коду 5) + +```python +move_reward = -0.1 +goal_reward = 10 +end_reward = -10 + +def reward(m,pos=None): + pos = pos or m.human + if not m.is_valid(pos): + return end_reward + x = m.at(pos) + if x==Board.Cell.water or x == Board.Cell.wolf: + return end_reward + if x==Board.Cell.apple: + return goal_reward + return move_reward +``` + +Цікаво, що у більшості випадків *ми отримуємо значну винагороду лише наприкінці гри*. Це означає, що наш алгоритм повинен якось запам’ятовувати "хороші" кроки, які призводять до позитивної винагороди в кінці, і збільшувати їх важливість. Аналогічно, всі кроки, які призводять до поганих результатів, слід знеохочувати. + +## Q-Learning + +Алгоритм, який ми тут обговоримо, називається **Q-Learning**. У цьому алгоритмі політика визначається функцією (або структурою даних), яка називається **Q-таблиця**. Вона записує "корисність" кожної дії в даному стані. + +Вона називається Q-таблицею, тому що її часто зручно представляти у вигляді таблиці або багатовимірного масиву. Оскільки наша дошка має розміри `width` x `height`, ми можемо представити Q-таблицю за допомогою масиву numpy з формою `width` x `height` x `len(actions)`: (блок коду 6) + +```python +Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) +``` + +Зверніть увагу, що ми ініціалізуємо всі значення Q-таблиці однаковим значенням, у нашому випадку — 0.25. Це відповідає політиці "випадкової прогулянки", оскільки всі кроки в кожному стані однаково хороші. Ми можемо передати Q-таблицю до функції `plot`, щоб візуалізувати таблицю на дошці: `m.plot(Q)`. + +![Середовище Петрика](../../../../8-Reinforcement/1-QLearning/images/env_init.png) + +У центрі кожної клітинки є "стрілка", яка вказує на бажаний напрямок руху. Оскільки всі напрямки рівні, відображається точка. + +Тепер нам потрібно запустити симуляцію, дослідити наше середовище та навчитися кращому розподілу значень Q-таблиці, що дозволить нам набагато швидше знайти шлях до яблука. + +## Суть Q-Learning: рівняння Беллмана + +Як тільки ми починаємо рухатися, кожна дія матиме відповідну винагороду, тобто теоретично ми можемо вибрати наступну дію на основі найвищої миттєвої винагороди. Однак у більшості станів цей крок не досягне нашої мети — досягти яблука, і тому ми не можемо одразу вирішити, який напрямок кращий. + +> Пам’ятайте, що важливий не миттєвий результат, а кінцевий результат, який ми отримаємо наприкінці симуляції. + +Щоб врахувати цю відкладену винагороду, нам потрібно використовувати принципи **[динамічного програмування](https://en.wikipedia.org/wiki/Dynamic_programming)**, які дозволяють мислити про нашу проблему рекурсивно. + +Припустимо, що зараз ми знаходимося в стані *s*, і хочемо перейти до наступного стану *s'*. Роблячи це, ми отримаємо миттєву винагороду *r(s,a)*, визначену функцією винагороди, плюс певну майбутню винагороду. Якщо припустити, що наша Q-таблиця правильно відображає "привабливість" кожної дії, то в стані *s'* ми виберемо дію *a*, яка відповідає максимальному значенню *Q(s',a')*. Таким чином, найкраща можлива майбутня винагорода, яку ми могли б отримати в стані *s*, буде визначена як `max` *Q(s',a')* (максимум тут обчислюється для всіх можливих дій *a'* у стані *s'*). + +Це дає **формулу Беллмана** для обчислення значення Q-таблиці в стані *s*, враховуючи дію *a*: + +## Перевірка політики + +Оскільки Q-Table містить "привабливість" кожної дії в кожному стані, її досить легко використовувати для визначення ефективної навігації у нашому світі. У найпростішому випадку ми можемо вибрати дію, що відповідає найвищому значенню в Q-Table: (блок коду 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) +``` + +> Якщо ви спробуєте код вище кілька разів, то можете помітити, що іноді він "зависає", і вам потрібно натиснути кнопку STOP у ноутбуці, щоб перервати виконання. Це відбувається через те, що можуть виникати ситуації, коли два стани "вказують" один на одного з точки зору оптимального Q-Value, у результаті чого агент безкінечно переміщується між цими станами. + +## 🚀Виклик + +> **Завдання 1:** Змініть функцію `walk`, щоб обмежити максимальну довжину шляху певною кількістю кроків (наприклад, 100), і подивіться, як код вище час від часу повертає це значення. + +> **Завдання 2:** Змініть функцію `walk` так, щоб вона не поверталася до місць, де вже була раніше. Це запобігатиме зацикленню `walk`, однак агент все одно може опинитися "заблокованим" у місці, з якого не може вибратися. + +## Навігація + +Кращою політикою навігації буде та, яку ми використовували під час навчання, що поєднує експлуатацію та дослідження. У цій політиці ми будемо вибирати кожну дію з певною ймовірністю, пропорційною значенням у Q-Table. Ця стратегія все ще може призводити до того, що агент повертається до вже досліджених позицій, але, як видно з коду нижче, вона забезпечує дуже короткий середній шлях до бажаного місця (пам'ятайте, що `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-Table, перезаписавши їх новими значеннями. Це ідеально слід мінімізувати, зменшуючи швидкість навчання (наприклад, ближче до кінця навчання ми лише трохи коригуємо значення Q-Table). + +Загалом, важливо пам'ятати, що успіх і якість процесу навчання значною мірою залежать від параметрів, таких як швидкість навчання, зменшення швидкості навчання та коефіцієнт дисконтування. Їх часто називають **гіперпараметрами**, щоб відрізнити їх від **параметрів**, які ми оптимізуємо під час навчання (наприклад, коефіцієнти Q-Table). Процес пошуку найкращих значень гіперпараметрів називається **оптимізацією гіперпараметрів**, і це заслуговує окремої теми. + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Завдання +[Більш реалістичний світ](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/8-Reinforcement/1-QLearning/assignment.md b/translations/uk/8-Reinforcement/1-QLearning/assignment.md new file mode 100644 index 00000000..0cdb7387 --- /dev/null +++ b/translations/uk/8-Reinforcement/1-QLearning/assignment.md @@ -0,0 +1,41 @@ + +# Більш реалістичний світ + +У нашій ситуації Пітер міг пересуватися майже без втоми чи голоду. У більш реалістичному світі йому потрібно час від часу сідати та відпочивати, а також харчуватися. Давайте зробимо наш світ більш реалістичним, впровадивши наступні правила: + +1. Пересуваючись з одного місця в інше, Пітер втрачає **енергію** і набирає **втому**. +2. Пітер може відновлювати енергію, з'їдаючи яблука. +3. Пітер може позбавлятися втоми, відпочиваючи під деревом або на траві (тобто заходячи на клітинку з деревом або травою — зелене поле). +4. Пітер повинен знайти і вбити вовка. +5. Щоб перемогти вовка, Пітер повинен мати певний рівень енергії та втоми, інакше він програє битву. + +## Інструкції + +Використовуйте оригінальний блокнот [notebook.ipynb](../../../../8-Reinforcement/1-QLearning/notebook.ipynb) як відправну точку для вашого рішення. + +Модифікуйте функцію винагороди відповідно до правил гри, запустіть алгоритм навчання з підкріпленням, щоб знайти найкращу стратегію для перемоги в грі, і порівняйте результати випадкових ходів із вашим алгоритмом за кількістю виграних і програних ігор. + +> **Note**: У вашому новому світі стан є більш складним і, окрім позиції людини, також включає рівні втоми та енергії. Ви можете представити стан у вигляді кортежу (Board, energy, fatigue), або визначити клас для стану (ви також можете успадкувати його від `Board`), або навіть модифікувати оригінальний клас `Board` у файлі [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py). + +У вашому рішенні, будь ласка, збережіть код, відповідальний за стратегію випадкових ходів, і порівняйте результати вашого алгоритму з випадковими ходами наприкінці. + +> **Note**: Можливо, вам доведеться налаштувати гіперпараметри, щоб усе працювало, особливо кількість епох. Оскільки успіх у грі (битва з вовком) є рідкісною подією, ви можете очікувати значно тривалішого часу навчання. + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| | Блокнот представлений із визначенням нових правил світу, алгоритмом Q-Learning і текстовими поясненнями. Q-Learning значно покращує результати порівняно з випадковими ходами. | Блокнот представлений, Q-Learning реалізований і покращує результати порівняно з випадковими ходами, але незначно; або блокнот погано документований, а код не має чіткої структури. | Зроблено спробу переосмислити правила світу, але алгоритм Q-Learning не працює, або функція винагороди не повністю визначена. | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/8-Reinforcement/1-QLearning/solution/Julia/README.md b/translations/uk/8-Reinforcement/1-QLearning/solution/Julia/README.md new file mode 100644 index 00000000..35768bbc --- /dev/null +++ b/translations/uk/8-Reinforcement/1-QLearning/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/8-Reinforcement/1-QLearning/solution/R/README.md b/translations/uk/8-Reinforcement/1-QLearning/solution/R/README.md new file mode 100644 index 00000000..ad8b3ba2 --- /dev/null +++ b/translations/uk/8-Reinforcement/1-QLearning/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/8-Reinforcement/2-Gym/README.md b/translations/uk/8-Reinforcement/2-Gym/README.md new file mode 100644 index 00000000..9b9e04f4 --- /dev/null +++ b/translations/uk/8-Reinforcement/2-Gym/README.md @@ -0,0 +1,351 @@ + +# CartPole Катання + +Задача, яку ми вирішували в попередньому уроці, може здатися іграшковою, не дуже застосовною до реальних сценаріїв. Але це не так, адже багато реальних проблем мають схожі характеристики — наприклад, гра в шахи чи Ґо. Вони схожі тим, що також мають дошку з певними правилами та **дискретний стан**. + +## [Передлекційна вікторина](https://ff-quizzes.netlify.app/en/ml/) + +## Вступ + +У цьому уроці ми застосуємо ті ж принципи Q-навчання до задачі з **неперервним станом**, тобто станом, який визначається одним або кількома дійсними числами. Ми розглянемо наступну задачу: + +> **Задача**: Якщо Петро хоче втекти від вовка, йому потрібно навчитися рухатися швидше. Ми побачимо, як Петро може навчитися кататися на ковзанах, зокрема тримати рівновагу, використовуючи Q-навчання. + +![Велика втеча!](../../../../8-Reinforcement/2-Gym/images/escape.png) + +> Петро та його друзі проявляють креативність, щоб втекти від вовка! Зображення від [Jen Looper](https://twitter.com/jenlooper) + +Ми використаємо спрощену версію задачі збереження рівноваги, відому як задача **CartPole**. У світі 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, ми можемо створювати різні **середовища** — від симуляції CartPole до ігор Atari. + +> **Примітка**: Інші середовища, доступні в OpenAI Gym, можна переглянути [тут](https://gym.openai.com/envs/#classic_control). + +Спочатку встановимо Gym і імпортуємо необхідні бібліотеки (блок коду 1): + +```python +import sys +!{sys.executable} -m pip install gym + +import gym +import matplotlib.pyplot as plt +import numpy as np +import random +``` + +## Вправа — ініціалізація середовища CartPole + +Щоб працювати із задачею балансування CartPole, потрібно ініціалізувати відповідне середовище. Кожне середовище має: + +- **Observation space** (простір спостережень), який визначає структуру інформації, яку ми отримуємо від середовища. Для задачі CartPole ми отримуємо положення стовпа, швидкість та інші значення. + +- **Action space** (простір дій), який визначає можливі дії. У нашому випадку простір дій дискретний і складається з двох дій — **вліво** та **вправо**. (блок коду 2) + +1. Для ініціалізації введіть наступний код: + + ```python + env = gym.make("CartPole-v1") + print(env.action_space) + print(env.observation_space) + print(env.action_space.sample()) + ``` + +Щоб побачити, як працює середовище, запустимо коротку симуляцію на 100 кроків. На кожному кроці ми надаємо одну з дій для виконання — у цій симуляції ми просто випадково вибираємо дію з `action_space`. + +1. Запустіть код нижче і подивіться, до чого це призведе. + + ✅ Пам’ятайте, що бажано запускати цей код на локальній установці Python! (блок коду 3) + + ```python + env.reset() + + for i in range(100): + env.render() + env.step(env.action_space.sample()) + env.close() + ``` + + Ви повинні побачити щось подібне до цього зображення: + + ![CartPole без балансу](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) + +1. Під час симуляції нам потрібно отримувати спостереження, щоб вирішити, як діяти. Насправді функція `step` повертає поточні спостереження, функцію винагороди та прапорець `done`, який вказує, чи має сенс продовжувати симуляцію: (блок коду 4) + + ```python + env.reset() + + done = False + while not done: + env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + print(f"{obs} -> {rew}") + env.close() + ``` + + Ви побачите щось подібне до цього у виводі блокнота: + + ```text + [ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0 + [ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0 + [ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0 + [ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0 + [ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0 + ... + [ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0 + [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0 + ``` + + Вектор спостережень, який повертається на кожному кроці симуляції, містить наступні значення: + - Положення візка + - Швидкість візка + - Кут нахилу стовпа + - Швидкість обертання стовпа + +1. Отримайте мінімальне та максимальне значення цих чисел: (блок коду 5) + + ```python + print(env.observation_space.low) + print(env.observation_space.high) + ``` + + Ви також можете помітити, що значення винагороди на кожному кроці симуляції завжди дорівнює 1. Це тому, що наша мета — вижити якомога довше, тобто утримувати стовп у відносно вертикальному положенні максимально довгий час. + + ✅ Насправді симуляція CartPole вважається вирішеною, якщо ми зможемо отримати середню винагороду 195 за 100 послідовних спроб. + +## Дискретизація стану + +У Q-навчанні нам потрібно створити Q-таблицю, яка визначає, що робити в кожному стані. Щоб це зробити, стан має бути **дискретним**, точніше, він повинен містити кінцеву кількість дискретних значень. Таким чином, нам потрібно якось **дискретизувати** наші спостереження, відображаючи їх у кінцевий набір станів. + +Є кілька способів це зробити: + +- **Розділення на інтервали**. Якщо ми знаємо діапазон певного значення, ми можемо розділити цей діапазон на кілька **інтервалів** і замінити значення номером інтервалу, до якого воно належить. Це можна зробити за допомогою методу numpy [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html). У цьому випадку ми точно знатимемо розмір стану, оскільки він залежатиме від кількості інтервалів, які ми виберемо для дискретизації. + +✅ Ми можемо використовувати лінійну інтерполяцію, щоб привести значення до певного кінцевого діапазону (наприклад, від -20 до 20), а потім перетворити числа на цілі, округливши їх. Це дає нам трохи менше контролю над розміром стану, особливо якщо ми не знаємо точних діапазонів вхідних значень. Наприклад, у нашому випадку 2 із 4 значень не мають верхніх/нижніх меж, що може призвести до нескінченної кількості станів. + +У нашому прикладі ми використаємо другий підхід. Як ви помітите пізніше, незважаючи на невизначені верхні/нижні межі, ці значення рідко виходять за певні кінцеві інтервали, тому стани з екстремальними значеннями будуть дуже рідкісними. + +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) + + ```python + def create_bins(i,num): + return np.arange(num+1)*(i[1]-i[0])/num+i[0] + + 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 + 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` і подивіться, чи є різниця. + + ✅ `discretize_bins` повертає номер інтервалу, який починається з 0. Таким чином, для значень вхідної змінної близько 0 він повертає число з середини інтервалу (10). У `discretize` ми не враховували діапазон вихідних значень, дозволяючи їм бути від’ємними, тому значення стану не зміщені, і 0 відповідає 0. (блок коду 8) + + ```python + env.reset() + + done = False + while not done: + #env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + #print(discretize_bins(obs)) + print(discretize(obs)) + env.close() + ``` + + ✅ Розкоментуйте рядок, який починається з `env.render`, якщо хочете побачити, як виконується середовище. В іншому випадку ви можете виконувати його у фоновому режимі, що швидше. Ми будемо використовувати це "невидиме" виконання під час процесу Q-навчання. + +## Структура Q-таблиці + +У попередньому уроці стан був простою парою чисел від 0 до 8, тому було зручно представляти Q-таблицю за допомогою тензора numpy з формою 8x8x2. Якщо ми використовуємо дискретизацію за інтервалами, розмір нашого вектора стану також відомий, тому ми можемо використовувати той самий підхід і представляти стан у вигляді масиву форми 20x20x10x10x2 (тут 2 — це розмірність простору дій, а перші розміри відповідають кількості інтервалів, які ми вибрали для кожного з параметрів у просторі спостережень). + +Однак іноді точні розміри простору спостережень невідомі. У випадку функції `discretize` ми ніколи не можемо бути впевнені, що наш стан залишається в певних межах, оскільки деякі з початкових значень не обмежені. Тому ми використаємо трохи інший підхід і представимо Q-таблицю у вигляді словника. + +1. Використовуйте пару *(state, action)* як ключ словника, а значення відповідатиме значенню запису в Q-таблиці. (блок коду 9) + + ```python + Q = {} + actions = (0,1) + + def qvalues(state): + return [Q.get((state,a),0) for a in actions] + ``` + + Тут ми також визначаємо функцію `qvalues()`, яка повертає список значень Q-таблиці для заданого стану, що відповідає всім можливим діям. Якщо запис відсутній у Q-таблиці, ми повернемо 0 за замовчуванням. + +## Починаємо Q-навчання + +Тепер ми готові навчити Петра балансувати! + +1. Спочатку встановимо деякі гіперпараметри: (блок коду 10) + + ```python + # hyperparameters + alpha = 0.3 + gamma = 0.9 + epsilon = 0.90 + ``` + + Тут `alpha` — це **швидкість навчання**, яка визначає, наскільки ми повинні коригувати поточні значення Q-таблиці на кожному кроці. У попередньому уроці ми починали з 1, а потім зменшували `alpha` до нижчих значень під час навчання. У цьому прикладі ми залишимо її сталою для простоти, і ви можете експериментувати з налаштуванням значень `alpha` пізніше. + + `gamma` — це **коефіцієнт дисконтування**, який показує, наскільки ми повинні віддавати перевагу майбутній винагороді над поточною. + + `epsilon` — це **фактор дослідження/експлуатації**, який визначає, чи повинні ми віддавати перевагу дослідженню чи експлуатації. У нашому алгоритмі ми в `epsilon` відсотках випадків вибиратимемо наступну дію відповідно до значень Q-таблиці, а в решті випадків виконуватимемо випадкову дію. Це дозволить нам досліджувати області простору пошуку, які ми раніше не бачили. + + ✅ У контексті балансування — вибір випадкової дії (дослідження) діятиме як випадковий поштовх у неправильному напрямку, і стовп повинен буде навчитися відновлювати рівновагу після цих "помилок". + +### Покращення алгоритму + +Ми також можемо зробити два покращення до нашого алгоритму з попереднього уроку: + +- **Обчислення середньої кумулятивної винагороди** за кілька симуляцій. Ми будемо виводити прогрес кожні 5000 ітерацій і усереднювати нашу кумулятивну винагороду за цей період часу. Це означає, що якщо ми отримаємо більше 195 балів — ми можемо вважати задачу вирішеною, навіть із вищою якістю, ніж потрібно. + +- **Обчислення максимальної середньої кумулятивної винагороди**, `Qmax`, і ми збережемо Q-таблицю, що відповідає цьому результату. Коли ви запустите навчання, ви помітите, що іноді середня кумулятивна винагорода починає знижуватися, і ми хочемо зберегти значення Q-таблиці, які відповідають найкращій моделі, спостереженій під час навчання. + +1. Збирайте всі кумулятивні винагороди на кожній симуляції у вектор `rewards` для подальшого побудови графіків. (блок коду 11) + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + + Qmax = 0 + cum_rewards = [] + rewards = [] + for epoch in range(100000): + obs = env.reset() + done = False + cum_reward=0 + # == do the simulation == + while not done: + s = discretize(obs) + if random.random() Qmax: + Qmax = np.average(cum_rewards) + Qbest = Q + cum_rewards=[] + ``` + +Що ви можете помітити з цих результатів: + +- **Близько до нашої мети**. Ми дуже близькі до досягнення мети отримання 195 кумулятивних винагород за 100+ послідовних запусків симуляції, або ми вже досягли її! Навіть якщо ми отримуємо менші числа, ми все одно не знаємо, тому що усереднюємо за 5000 запусків, а формальний критерій вимагає лише 100 запусків. + +- **Винагорода починає знижуватися**. Іноді винагорода починає знижуватися, що означає, що ми можемо "зруйнувати" вже вивчені значення в Q-таблиці, замінивши їх тими, які погіршують ситуацію. + +Це спостереження стає більш очевидним, якщо ми побудуємо графік прогресу навчання. + +## Побудова графіка прогресу навчання + +Під час навчання ми збирали значення кумулятивної винагороди на кожній ітерації у вектор `rewards`. Ось як це виглядає, якщо побудувати графік залежності від номера ітерації: + +```python +plt.plot(rewards) +``` + +![Сирий прогрес](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png) + +З цього графіка неможливо нічого сказати, оскільки через природу стохастичного процесу навчання тривалість навчальних сесій сильно варіюється. Щоб надати більше сенсу цьому графіку, ми можемо обчислити **ковзне середнє** за серією експериментів, наприклад, 100. Це можна зручно зробити за допомогою `np.convolve`: (блок коду 12) + +```python +def running_average(x,window): + return np.convolve(x,np.ones(window)/window,mode='valid') + +plt.plot(running_average(rewards,100)) +``` + +![Прогрес навчання](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png) + +## Зміна гіперпараметрів + +Щоб зробити навчання більш стабільним, має сенс налаштувати деякі з наших гіперпараметрів під час навчання. Зокрема: + +- **Для швидкості навчання**, `alpha`, ми можемо почати зі значень, близьких до 1, а потім поступово зменшувати цей параметр. З часом ми будемо отримувати хороші ймовірнісні значення в Q-таблиці, і тому слід коригувати їх незначно, а не повністю перезаписувати новими значеннями. + +- **Збільшення epsilon**. Ми можемо поступово збільшувати `epsilon`, щоб менше досліджувати і більше експлуатувати. Ймовірно, має сенс почати з нижчого значення `epsilon` і поступово збільшувати його до майже 1. +> **Завдання 1**: Спробуйте змінити значення гіперпараметрів і подивіться, чи зможете ви досягти більшої сукупної винагороди. Чи отримуєте ви більше 195? +> **Завдання 2**: Щоб формально вирішити проблему, необхідно досягти середньої винагороди 195 протягом 100 послідовних запусків. Виміряйте це під час навчання і переконайтеся, що ви формально вирішили проблему! + +## Перегляд результату в дії + +Було б цікаво побачити, як поводиться навчена модель. Давайте запустимо симуляцію і будемо дотримуватися тієї ж стратегії вибору дій, що й під час навчання, вибираючи дії відповідно до розподілу ймовірностей у Q-таблиці: (блок коду 13) + +```python +obs = env.reset() +done = False +while not done: + s = discretize(obs) + env.render() + v = probs(np.array(qvalues(s))) + a = random.choices(actions,weights=v)[0] + obs,_,done,_ = env.step(a) +env.close() +``` + +Ви повинні побачити щось подібне: + +![балансуючий CartPole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) + +--- + +## 🚀Виклик + +> **Завдання 3**: Тут ми використовували фінальну копію Q-таблиці, яка може бути не найкращою. Пам’ятайте, що ми зберегли найкращу Q-таблицю у змінній `Qbest`! Спробуйте той самий приклад із найкращою Q-таблицею, скопіювавши `Qbest` у `Q`, і подивіться, чи помітите різницю. + +> **Завдання 4**: Тут ми не вибирали найкращу дію на кожному кроці, а натомість вибирали дії відповідно до розподілу ймовірностей. Чи було б логічніше завжди вибирати найкращу дію з найвищим значенням у Q-таблиці? Це можна зробити за допомогою функції `np.argmax`, щоб визначити номер дії, що відповідає найвищому значенню Q-таблиці. Реалізуйте цю стратегію і подивіться, чи покращиться балансування. + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +## Завдання +[Навчіть Mountain Car](assignment.md) + +## Висновок + +Ми тепер знаємо, як навчати агентів досягати хороших результатів, просто надаючи їм функцію винагороди, яка визначає бажаний стан гри, і даючи їм можливість розумно досліджувати простір пошуку. Ми успішно застосували алгоритм Q-Learning у випадках дискретних і безперервних середовищ, але з дискретними діями. + +Важливо також вивчати ситуації, коли стан дій також є безперервним, а простір спостережень набагато складніший, наприклад, зображення з екрану гри Atari. У таких задачах часто потрібно використовувати більш потужні методи машинного навчання, такі як нейронні мережі, щоб досягти хороших результатів. Ці більш складні теми є предметом нашого майбутнього курсу з просунутого штучного інтелекту. + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/8-Reinforcement/2-Gym/assignment.md b/translations/uk/8-Reinforcement/2-Gym/assignment.md new file mode 100644 index 00000000..c80ba1fe --- /dev/null +++ b/translations/uk/8-Reinforcement/2-Gym/assignment.md @@ -0,0 +1,57 @@ + +# Тренування Mountain Car + +[OpenAI Gym](http://gym.openai.com) створений таким чином, що всі середовища мають однаковий API - тобто однакові методи `reset`, `step` і `render`, а також однакові абстракції **простору дій** і **простору спостережень**. Таким чином, можна адаптувати одні й ті ж алгоритми навчання з підкріпленням до різних середовищ із мінімальними змінами в коді. + +## Середовище Mountain Car + +[Середовище Mountain Car](https://gym.openai.com/envs/MountainCar-v0/) містить автомобіль, який застряг у долині: + +Мета полягає в тому, щоб вибратися з долини та захопити прапор, виконуючи на кожному кроці одну з наступних дій: + +| Значення | Значення дії | +|---|---| +| 0 | Прискорення вліво | +| 1 | Не прискорюватися | +| 2 | Прискорення вправо | + +Основна складність цієї задачі полягає в тому, що двигун автомобіля недостатньо потужний, щоб піднятися на гору за один раз. Тому єдиний спосіб досягти успіху — це розгойдуватися вперед-назад, щоб набрати імпульс. + +Простір спостережень складається лише з двох значень: + +| № | Спостереження | Мін | Макс | +|-----|--------------|-----|-----| +| 0 | Позиція автомобіля | -1.2| 0.6 | +| 1 | Швидкість автомобіля | -0.07 | 0.07 | + +Система винагород для Mountain Car досить складна: + + * Винагорода 0 надається, якщо агент досяг прапора (позиція = 0.5) на вершині гори. + * Винагорода -1 надається, якщо позиція агента менша за 0.5. + +Епізод завершується, якщо позиція автомобіля перевищує 0.5, або якщо довжина епізоду перевищує 200. + +## Інструкції + +Адаптуйте наш алгоритм навчання з підкріпленням для вирішення задачі Mountain Car. Почніть із наявного коду [notebook.ipynb](../../../../8-Reinforcement/2-Gym/notebook.ipynb), замініть середовище, змініть функції дискретизації станів і спробуйте змусити існуючий алгоритм навчатися з мінімальними змінами в коді. Оптимізуйте результат, налаштовуючи гіперпараметри. + +> **Примітка**: Для досягнення збіжності алгоритму, ймовірно, знадобиться налаштування гіперпараметрів. + +## Критерії оцінювання + +| Критерій | Відмінно | Задовільно | Потребує покращення | +| -------- | --------- | -------- | ----------------- | +| | Алгоритм Q-Learning успішно адаптований із прикладу CartPole з мінімальними змінами в коді, і здатний вирішити задачу захоплення прапора менш ніж за 200 кроків. | Новий алгоритм Q-Learning взято з Інтернету, але добре задокументований; або існуючий алгоритм адаптований, але не досягає бажаних результатів. | Студент не зміг успішно адаптувати жоден алгоритм, але зробив значні кроки до вирішення (реалізував дискретизацію станів, структуру даних Q-Table тощо). | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/8-Reinforcement/2-Gym/solution/Julia/README.md b/translations/uk/8-Reinforcement/2-Gym/solution/Julia/README.md new file mode 100644 index 00000000..92786182 --- /dev/null +++ b/translations/uk/8-Reinforcement/2-Gym/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/8-Reinforcement/2-Gym/solution/R/README.md b/translations/uk/8-Reinforcement/2-Gym/solution/R/README.md new file mode 100644 index 00000000..de15b865 --- /dev/null +++ b/translations/uk/8-Reinforcement/2-Gym/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/8-Reinforcement/README.md b/translations/uk/8-Reinforcement/README.md new file mode 100644 index 00000000..0798c6ed --- /dev/null +++ b/translations/uk/8-Reinforcement/README.md @@ -0,0 +1,67 @@ + +# Вступ до навчання з підкріпленням + +Навчання з підкріпленням (RL) вважається одним із основних парадигм машинного навчання поряд із навчанням з учителем та без учителя. RL стосується прийняття рішень: ухвалення правильних рішень або, принаймні, навчання на їх основі. + +Уявіть, що у вас є симульоване середовище, наприклад, фондовий ринок. Що станеться, якщо ви введете певне регулювання? Чи матиме це позитивний чи негативний ефект? Якщо відбувається щось негативне, потрібно взяти це _негативне підкріплення_, навчитися на ньому та змінити курс. Якщо результат позитивний, потрібно будувати на основі цього _позитивного підкріплення_. + +![петрик і вовк](../../../8-Reinforcement/images/peter.png) + +> Петрик і його друзі мають втекти від голодного вовка! Зображення [Jen Looper](https://twitter.com/jenlooper) + +## Регіональна тема: Петрик і вовк (Росія) + +[Петрик і вовк](https://uk.wikipedia.org/wiki/Петрик_і_вовк) — це музична казка, написана російським композитором [Сергієм Прокоф'євим](https://uk.wikipedia.org/wiki/Сергій_Прокоф%27єв). Це історія про юного піонера Петрика, який сміливо виходить із дому на лісову галявину, щоб переслідувати вовка. У цьому розділі ми будемо тренувати алгоритми машинного навчання, які допоможуть Петрику: + +- **Досліджувати** навколишню територію та створити оптимальну карту навігації. +- **Навчитися** користуватися скейтбордом і тримати рівновагу, щоб швидше пересуватися. + +[![Петрик і вовк](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM) + +> 🎥 Натисніть на зображення вище, щоб послухати "Петрик і вовк" Прокоф'єва + +## Навчання з підкріпленням + +У попередніх розділах ви бачили два приклади задач машинного навчання: + +- **З учителем**, де у нас є набори даних, які пропонують зразкові рішення задачі, яку ми хочемо вирішити. [Класифікація](../4-Classification/README.md) та [регресія](../2-Regression/README.md) є задачами навчання з учителем. +- **Без учителя**, де у нас немає мічених навчальних даних. Основним прикладом навчання без учителя є [кластеризація](../5-Clustering/README.md). + +У цьому розділі ми познайомимо вас із новим типом задач навчання, який не потребує мічених навчальних даних. Існує кілька типів таких задач: + +- **[Напівнавчання з учителем](https://uk.wikipedia.org/wiki/Напівнавчання_з_учителем)**, де у нас є багато немічених даних, які можна використовувати для попереднього тренування моделі. +- **[Навчання з підкріпленням](https://uk.wikipedia.org/wiki/Навчання_з_підкріпленням)**, у якому агент навчається поводитися, проводячи експерименти в певному симульованому середовищі. + +### Приклад - комп'ютерна гра + +Припустимо, ви хочете навчити комп'ютер грати в гру, наприклад, шахи або [Super Mario](https://uk.wikipedia.org/wiki/Super_Mario). Щоб комп'ютер міг грати в гру, нам потрібно, щоб він передбачав, який хід зробити в кожному стані гри. Хоча це може здатися задачею класифікації, це не так — тому що у нас немає набору даних зі станами та відповідними діями. Хоча ми можемо мати деякі дані, як-от існуючі шахові партії або записи гравців, які грають у Super Mario, ймовірно, ці дані не будуть достатньо охоплювати велику кількість можливих станів. + +Замість того, щоб шукати існуючі дані гри, **навчання з підкріпленням** (RL) базується на ідеї *змусити комп'ютер грати* багато разів і спостерігати за результатом. Отже, для застосування навчання з підкріпленням нам потрібні дві речі: + +- **Середовище** та **симулятор**, які дозволяють нам грати в гру багато разів. Цей симулятор визначатиме всі правила гри, а також можливі стани та дії. + +- **Функція винагороди**, яка повідомлятиме нам, наскільки добре ми виконали кожен хід або гру. + +Основна відмінність між іншими типами машинного навчання та RL полягає в тому, що в RL ми зазвичай не знаємо, чи виграємо ми, чи програємо, поки не закінчимо гру. Таким чином, ми не можемо сказати, чи певний хід сам по собі є хорошим чи ні — ми отримуємо винагороду лише наприкінці гри. І наша мета — розробити алгоритми, які дозволять нам тренувати модель в умовах невизначеності. Ми дізнаємося про один алгоритм RL, який називається **Q-навчання**. + +## Уроки + +1. [Вступ до навчання з підкріпленням та Q-навчання](1-QLearning/README.md) +2. [Використання симуляційного середовища Gym](2-Gym/README.md) + +## Авторство + +"Вступ до навчання з підкріпленням" написано з ♥️ [Дмитром Сошниковим](http://soshnikov.com) + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/9-Real-World/1-Applications/README.md b/translations/uk/9-Real-World/1-Applications/README.md new file mode 100644 index 00000000..b41a7aa4 --- /dev/null +++ b/translations/uk/9-Real-World/1-Applications/README.md @@ -0,0 +1,153 @@ + +# Постскриптум: Машинне навчання у реальному світі + +![Скетчноут про машинне навчання у реальному світі](../../../../sketchnotes/ml-realworld.png) +> Скетчноут від [Tomomi Imura](https://www.twitter.com/girlie_mac) + +У цьому курсі ви дізналися багато способів підготовки даних для навчання та створення моделей машинного навчання. Ви побудували серію класичних моделей регресії, кластеризації, класифікації, обробки природної мови та аналізу часових рядів. Вітаємо! Тепер ви, можливо, замислюєтеся, для чого це все... які реальні застосування цих моделей? + +Хоча в індустрії багато уваги приділяється штучному інтелекту, який зазвичай використовує глибоке навчання, класичні моделі машинного навчання також мають цінні застосування. Ви навіть можете використовувати деякі з них уже сьогодні! У цьому уроці ви дізнаєтеся, як вісім різних галузей та предметних сфер використовують ці моделі, щоб зробити свої додатки більш ефективними, надійними, інтелектуальними та корисними для користувачів. + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +## 💰 Фінанси + +Фінансовий сектор пропонує багато можливостей для машинного навчання. Багато задач у цій галузі можна моделювати та вирішувати за допомогою ML. + +### Виявлення шахрайства з кредитними картками + +Ми вивчали [кластеризацію методом k-середніх](../../5-Clustering/2-K-Means/README.md) раніше в курсі, але як її можна використовувати для вирішення проблем, пов'язаних із шахрайством з кредитними картками? + +Метод k-середніх корисний у техніці виявлення шахрайства, яка називається **виявленням аномалій**. Аномалії, або відхилення в спостереженнях за набором даних, можуть показати, чи використовується кредитна картка у звичайному режимі, чи відбувається щось незвичайне. Як показано в статті за посиланням нижче, ви можете сортувати дані кредитних карток за допомогою алгоритму кластеризації k-середніх і призначати кожну транзакцію до кластера залежно від того, наскільки вона є аномальною. Потім можна оцінити найбільш ризиковані кластери для визначення шахрайських або легітимних транзакцій. +[Джерело](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf) + +### Управління капіталом + +Управління капіталом передбачає, що особа або компанія керує інвестиціями від імені своїх клієнтів. Їхнє завдання — зберігати та примножувати капітал у довгостроковій перспективі, тому важливо обирати інвестиції, які добре себе проявляють. + +Один зі способів оцінити ефективність інвестиції — це статистична регресія. [Лінійна регресія](../../2-Regression/1-Tools/README.md) є цінним інструментом для розуміння того, як фонд працює відносно певного еталону. Ми також можемо визначити, чи є результати регресії статистично значущими, або наскільки вони вплинуть на інвестиції клієнта. Ви навіть можете розширити аналіз за допомогою множинної регресії, враховуючи додаткові фактори ризику. Для прикладу того, як це працює для конкретного фонду, ознайомтеся зі статтею нижче про оцінку ефективності фонду за допомогою регресії. +[Джерело](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/) + +## 🎓 Освіта + +Освітній сектор також є дуже цікавим напрямком для застосування ML. Тут можна вирішувати цікаві задачі, такі як виявлення шахрайства під час тестів або есе, а також управління упередженнями, свідомими чи несвідомими, у процесі оцінювання. + +### Прогнозування поведінки студентів + +[Coursera](https://coursera.com), провайдер онлайн-курсів, має чудовий технічний блог, де вони обговорюють багато інженерних рішень. У цьому кейсі вони побудували лінію регресії, щоб дослідити кореляцію між низьким рейтингом NPS (Net Promoter Score) і утриманням студентів або їх відсівом. +[Джерело](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a) + +### Зменшення упереджень + +[Grammarly](https://grammarly.com), помічник для перевірки правопису та граматики, використовує складні [системи обробки природної мови](../../6-NLP/README.md) у своїх продуктах. У своєму технічному блозі вони опублікували цікавий кейс про те, як вони боролися з гендерними упередженнями в машинному навчанні, про що ви дізналися у нашому [вступному уроці про справедливість](../../1-Introduction/3-fairness/README.md). +[Джерело](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/) + +## 👜 Роздрібна торгівля + +Роздрібна торгівля може значно виграти від використання ML, починаючи від створення кращого клієнтського досвіду до оптимального управління запасами. + +### Персоналізація клієнтського шляху + +У Wayfair, компанії, що продає товари для дому, допомога клієнтам у пошуку відповідних продуктів є пріоритетом. У цій статті інженери компанії описують, як вони використовують ML і NLP для "підбору правильних результатів для клієнтів". Зокрема, їхній Query Intent Engine використовує вилучення сутностей, навчання класифікаторів, вилучення активів і думок, а також тегування настроїв у відгуках клієнтів. Це класичний приклад використання NLP в онлайн-роздрібній торгівлі. +[Джерело](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search) + +### Управління запасами + +Інноваційні компанії, такі як [StitchFix](https://stitchfix.com), сервіс коробкових поставок одягу, значною мірою покладаються на ML для рекомендацій і управління запасами. Їхні стилісти співпрацюють із командами мерчандайзингу: "один із наших дата-сайєнтистів експериментував із генетичним алгоритмом і застосував його до одягу, щоб передбачити, який одяг буде успішним, хоча ще не існує. Ми передали це команді мерчандайзингу, і тепер вони можуть використовувати це як інструмент". +[Джерело](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/) + +## 🏥 Охорона здоров'я + +Сектор охорони здоров'я може використовувати ML для оптимізації дослідницьких завдань, а також для вирішення логістичних проблем, таких як повторна госпіталізація пацієнтів або зупинка поширення хвороб. + +### Управління клінічними випробуваннями + +Токсичність у клінічних випробуваннях є серйозною проблемою для виробників ліків. Скільки токсичності є допустимим? У цьому дослідженні аналіз різних методів клінічних випробувань привів до розробки нового підходу для прогнозування результатів клінічних випробувань. Зокрема, вони змогли використати random forest для створення [класифікатора](../../4-Classification/README.md), який розрізняє групи ліків. +[Джерело](https://www.sciencedirect.com/science/article/pii/S2451945616302914) + +### Управління повторними госпіталізаціями + +Госпіталізація є дорогою, особливо коли пацієнтів доводиться госпіталізувати повторно. У цій статті обговорюється компанія, яка використовує ML для прогнозування ймовірності повторної госпіталізації за допомогою [кластеризації](../../5-Clustering/README.md). Ці кластери допомагають аналітикам "виявляти групи повторних госпіталізацій, які можуть мати спільну причину". +[Джерело](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning) + +### Управління хворобами + +Нещодавня пандемія яскраво продемонструвала, як машинне навчання може допомогти зупинити поширення хвороб. У цій статті ви побачите використання ARIMA, логістичних кривих, лінійної регресії та SARIMA. "Ця робота є спробою розрахувати темпи поширення цього вірусу та, таким чином, передбачити кількість смертей, одужань і підтверджених випадків, щоб допомогти нам краще підготуватися та вижити". +[Джерело](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/) + +## 🌲 Екологія та зелена енергетика + +Природа та екологія складаються з багатьох чутливих систем, де взаємодія між тваринами та природою виходить на перший план. Важливо точно вимірювати ці системи та діяти відповідно, якщо щось трапляється, наприклад, лісова пожежа або зменшення популяції тварин. + +### Управління лісами + +Ви вивчали [підкріплювальне навчання](../../8-Reinforcement/README.md) у попередніх уроках. Воно може бути дуже корисним для прогнозування природних явищ. Зокрема, його можна використовувати для відстеження екологічних проблем, таких як лісові пожежі та поширення інвазивних видів. У Канаді група дослідників використала підкріплювальне навчання для створення моделей динаміки лісових пожеж на основі супутникових знімків. Використовуючи інноваційний "процес просторового поширення (SSP)", вони уявили лісову пожежу як "агента в будь-якій клітинці ландшафту". +[Джерело](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full) + +### Відстеження руху тварин + +Хоча глибоке навчання створило революцію у візуальному відстеженні руху тварин (ви можете створити власний [трекер полярних ведмедів](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) тут), класичне ML все ще має своє місце в цьому завданні. + +Датчики для відстеження руху сільськогосподарських тварин та IoT використовують цей тип візуальної обробки, але більш базові техніки ML корисні для попередньої обробки даних. Наприклад, у цій статті аналізувалися пози вівців за допомогою різних алгоритмів класифікації. Ви можете впізнати ROC-криву на сторінці 335. +[Джерело](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf) + +### ⚡️ Управління енергетикою + +У наших уроках про [прогнозування часових рядів](../../7-TimeSeries/README.md) ми розглядали концепцію розумних паркувальних лічильників для генерації доходу для міста на основі розуміння попиту та пропозиції. У цій статті детально обговорюється, як кластеризація, регресія та прогнозування часових рядів допомогли передбачити майбутнє споживання енергії в Ірландії на основі даних розумних лічильників. +[Джерело](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf) + +## 💼 Страхування + +Сектор страхування також використовує ML для створення та оптимізації фінансових і актуарних моделей. + +### Управління волатильністю + +MetLife, постачальник страхування життя, відкрито розповідає про те, як вони аналізують і зменшують волатильність у своїх фінансових моделях. У цій статті ви побачите візуалізації бінарної та порядкової класифікації, а також прогнозування. +[Джерело](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf) + +## 🎨 Мистецтво, культура та література + +У мистецтві, наприклад у журналістиці, існує багато цікавих задач. Виявлення фейкових новин є великою проблемою, оскільки доведено, що вони впливають на думку людей і навіть можуть підривати демократії. Музеї також можуть отримати користь від використання ML у всьому, від пошуку зв'язків між артефактами до планування ресурсів. + +### Виявлення фейкових новин + +Виявлення фейкових новин стало грою в кішки-мишки в сучасних медіа. У цій статті дослідники пропонують систему, яка поєднує кілька технік ML, які ми вивчали, і дозволяє тестувати та впроваджувати найкращу модель: "Ця система базується на обробці природної мови для вилучення ознак із даних, а потім ці ознаки використовуються для навчання класифікаторів машинного навчання, таких як Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD) і Logistic Regression (LR)". +[Джерело](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf) + +Ця стаття показує, як поєднання різних доменів ML може дати цікаві результати, які допоможуть зупинити поширення фейкових новин і запобігти реальній шкоді; у цьому випадку імпульсом стало поширення чуток про лікування COVID, що спричинило насильство. + +### ML у музеях + +Музеї перебувають на порозі революції штучного інтелекту, у якій каталогізація та оцифрування колекцій, а також пошук зв'язків між артефактами стають простішими завдяки розвитку технологій. Проєкти, такі як [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.), допомагають розкрити таємниці недоступних колекцій, таких як Ватиканські архіви. Але бізнес-аспект музеїв також отримує вигоду від моделей ML. + +Наприклад, Інститут мистецтв Чикаго створив моделі для прогнозування інтересів аудиторії та часу відвідування виставок. Мета — створити індивідуалізований і оптимізований досвід для кожного відвідувача музею. "Протягом 2017 фінансового року модель передбачила відвідуваність і доходи з точністю до 1%, каже Ендрю Сімнік, старший віцепрезидент Інституту мистецтв". +[Джерело](https://www.chicagobusiness.com/article/20180518/ISSUE01/180519840/art-institute-of-chicago-uses-data-to-make-exhibit-choices) + +## 🏷 Маркетинг + +### Сегментація клієнтів + +Найефективніші маркетингові стратегії орієнтуються на клієнтів по-різному залежно від різних груп. У цій статті обговорюється використання алгоритмів кластеризації для підтримки диференційованого маркетингу. Диференційований маркетинг допомагає компаніям покращити впізнаваність бренду, охопити більше клієнтів і заробити більше грошей. +[Джерело](https://ai.inqline.com +## [Післялекційна вікторина](https://ff-quizzes.netlify.app/en/ml/) + +## Огляд і самостійне навчання + +Команда з науки про дані Wayfair має кілька цікавих відео про те, як вони використовують машинне навчання у своїй компанії. Варто [переглянути](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)! + +## Завдання + +[Полювання за скарбами з машинного навчання](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають у результаті використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/9-Real-World/1-Applications/assignment.md b/translations/uk/9-Real-World/1-Applications/assignment.md new file mode 100644 index 00000000..457d235f --- /dev/null +++ b/translations/uk/9-Real-World/1-Applications/assignment.md @@ -0,0 +1,27 @@ + +# Полювання на машинне навчання + +## Інструкції + +У цьому уроці ви дізналися про багато реальних випадків використання, які були вирішені за допомогою класичного машинного навчання. Хоча використання глибокого навчання, нових технік і інструментів в штучному інтелекті, а також застосування нейронних мереж допомогли прискорити створення інструментів для допомоги в цих секторах, класичне машинне навчання, використовуючи техніки з цієї програми, все ще має велике значення. + +У цьому завданні уявіть, що ви берете участь у хакатоні. Використайте те, що ви дізналися в програмі, щоб запропонувати рішення за допомогою класичного машинного навчання для вирішення проблеми в одному з секторів, обговорених у цьому уроці. Створіть презентацію, де ви розповісте, як ви реалізуєте свою ідею. Додаткові бали, якщо ви зможете зібрати зразки даних і побудувати модель машинного навчання для підтримки своєї концепції! + +## Критерії оцінювання + +| Критерій | Відмінно | Задовільно | Потребує покращення | +| -------- | ------------------------------------------------------------------ | ----------------------------------------------- | ---------------------- | +| | Представлено презентацію PowerPoint - додатково за створення моделі | Представлено просту, неінноваційну презентацію | Робота незавершена | + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/9-Real-World/2-Debugging-ML-Models/README.md b/translations/uk/9-Real-World/2-Debugging-ML-Models/README.md new file mode 100644 index 00000000..9271c03c --- /dev/null +++ b/translations/uk/9-Real-World/2-Debugging-ML-Models/README.md @@ -0,0 +1,164 @@ + +# Постскриптум: Налагодження моделей машинного навчання за допомогою компонентів панелі відповідального AI + +## [Тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) + +## Вступ + +Машинне навчання впливає на наше повсякденне життя. Штучний інтелект проникає в найважливіші системи, які впливають на нас як особистостей і на суспільство загалом — від охорони здоров’я, фінансів, освіти до працевлаштування. Наприклад, системи та моделі залучені до щоденних процесів прийняття рішень, таких як діагностика в медицині або виявлення шахрайства. У результаті, розвиток штучного інтелекту та його швидке впровадження супроводжуються зростаючими суспільними очікуваннями та регулюванням. Ми постійно бачимо випадки, коли системи штучного інтелекту не відповідають очікуванням, створюють нові виклики, а уряди починають регулювати AI-рішення. Тому важливо аналізувати ці моделі, щоб забезпечити справедливі, надійні, інклюзивні, прозорі та відповідальні результати для всіх. + +У цьому курсі ми розглянемо практичні інструменти, які можна використовувати для оцінки наявності проблем відповідального AI у моделі. Традиційні методи налагодження машинного навчання зазвичай базуються на кількісних розрахунках, таких як загальна точність або середня втрата помилки. Уявіть, що може статися, якщо дані, які ви використовуєте для створення моделей, не містять певних демографічних груп, таких як раса, стать, політичні погляди, релігія, або непропорційно представляють ці групи. Або якщо результати моделі інтерпретуються так, що вони надають перевагу одній демографічній групі над іншою. Це може призвести до надмірного або недостатнього представлення чутливих груп ознак, що викликає проблеми справедливості, інклюзивності або надійності моделі. Ще один фактор — моделі машинного навчання часто вважаються "чорними ящиками", що ускладнює розуміння та пояснення того, що впливає на їхні прогнози. Усі ці виклики постають перед дата-сайєнтистами та розробниками AI, коли вони не мають достатніх інструментів для налагодження та оцінки справедливості чи надійності моделі. + +У цьому уроці ви дізнаєтеся, як налагоджувати свої моделі за допомогою: + +- **Аналізу помилок**: визначення областей у розподілі даних, де модель має високі показники помилок. +- **Огляд моделі**: порівняльний аналіз різних когорт даних для виявлення розбіжностей у метриках продуктивності моделі. +- **Аналізу даних**: дослідження областей, де може бути надмірне або недостатнє представлення даних, що може вплинути на упередженість моделі. +- **Важливості ознак**: розуміння, які ознаки впливають на прогнози моделі на глобальному або локальному рівні. + +## Передумови + +Як передумову, перегляньте [Інструменти відповідального AI для розробників](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) + +> ![Gif про інструменти відповідального AI](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) + +## Аналіз помилок + +Традиційні метрики продуктивності моделі, які використовуються для вимірювання точності, здебільшого базуються на розрахунках правильних і неправильних прогнозів. Наприклад, визначення того, що модель є точною на 89% із втратою помилки 0.001, може вважатися хорошим результатом. Однак помилки часто не розподіляються рівномірно в базовому наборі даних. Ви можете отримати оцінку точності моделі 89%, але виявити, що в різних областях даних модель помиляється 42% часу. Наслідки таких шаблонів помилок для певних груп даних можуть призвести до проблем справедливості або надійності. Важливо розуміти області, де модель працює добре або погано. Області даних, де є велика кількість неточностей моделі, можуть виявитися важливими демографічними даними. + +![Аналіз і налагодження помилок моделі](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-distribution.png) + +Компонент "Аналіз помилок" на панелі RAI показує, як помилки моделі розподіляються серед різних когорт за допомогою візуалізації дерева. Це корисно для визначення ознак або областей, де є високий рівень помилок у вашому наборі даних. Побачивши, звідки походить більшість неточностей моделі, ви можете почати досліджувати причину. Ви також можете створювати когорти даних для аналізу. Ці когорти даних допомагають у процесі налагодження, щоб визначити, чому продуктивність моделі хороша в одній когорті, але помилкова в іншій. + +![Аналіз помилок](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png) + +Візуальні індикатори на карті дерева допомагають швидше знаходити проблемні області. Наприклад, чим темніший червоний колір вузла дерева, тим вищий рівень помилок. + +Теплова карта — це ще одна функція візуалізації, яку користувачі можуть використовувати для дослідження рівня помилок за допомогою однієї або двох ознак, щоб знайти фактори, що сприяють помилкам моделі в усьому наборі даних або когорті. + +![Теплова карта аналізу помилок](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png) + +Використовуйте аналіз помилок, коли вам потрібно: + +* Глибоко зрозуміти, як помилки моделі розподіляються в наборі даних і серед кількох вхідних і ознакових вимірів. +* Розбити агреговані метрики продуктивності, щоб автоматично виявити помилкові когорти для інформування про ваші цільові кроки з пом’якшення. + +## Огляд моделі + +Оцінка продуктивності моделі машинного навчання вимагає отримання цілісного розуміння її поведінки. Це можна досягти, переглянувши більше ніж одну метрику, таку як рівень помилок, точність, відгук, точність або MAE (середня абсолютна помилка), щоб знайти розбіжності серед метрик продуктивності. Одна метрика продуктивності може виглядати чудово, але неточності можуть бути виявлені в іншій метриці. Крім того, порівняння метрик для розбіжностей у всьому наборі даних або когорті допомагає пролити світло на те, де модель працює добре або погано. Це особливо важливо для оцінки продуктивності моделі серед чутливих і нечутливих ознак (наприклад, раса пацієнта, стать або вік), щоб виявити потенційну несправедливість моделі. Наприклад, виявлення того, що модель є більш помилковою в когорті з чутливими ознаками, може виявити потенційну несправедливість моделі. + +Компонент "Огляд моделі" на панелі RAI допомагає не лише аналізувати метрики продуктивності представлення даних у когорті, але й дає користувачам можливість порівнювати поведінку моделі серед різних когорт. + +![Когорти набору даних — огляд моделі на панелі RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png) + +Функціональність аналізу на основі ознак компонента дозволяє користувачам звужувати підгрупи даних у межах певної ознаки, щоб виявляти аномалії на детальному рівні. Наприклад, панель має вбудований інтелект для автоматичного створення когорт для ознаки, вибраної користувачем (наприклад, *"time_in_hospital < 3"* або *"time_in_hospital >= 7"*). Це дозволяє користувачеві ізолювати певну ознаку з більшої групи даних, щоб побачити, чи є вона ключовим фактором помилкових результатів моделі. + +![Когорти ознак — огляд моделі на панелі RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png) + +Компонент "Огляд моделі" підтримує два класи метрик розбіжностей: + +**Розбіжність у продуктивності моделі**: Ці набори метрик обчислюють розбіжність (різницю) у значеннях вибраної метрики продуктивності серед підгруп даних. Ось кілька прикладів: + +* Розбіжність у рівні точності +* Розбіжність у рівні помилок +* Розбіжність у точності +* Розбіжність у відгуку +* Розбіжність у середній абсолютній помилці (MAE) + +**Розбіжність у рівні вибору**: Ця метрика містить різницю в рівні вибору (сприятливий прогноз) серед підгруп. Наприклад, розбіжність у рівнях схвалення кредитів. Рівень вибору означає частку точок даних у кожному класі, класифікованих як 1 (у бінарній класифікації) або розподіл значень прогнозу (у регресії). + +## Аналіз даних + +> "Якщо достатньо довго катувати дані, вони зізнаються у всьому" — Рональд Коуз + +Це твердження звучить радикально, але правда в тому, що дані можна маніпулювати для підтримки будь-якого висновку. Така маніпуляція іноді може відбуватися ненавмисно. Як люди, ми всі маємо упередження, і часто важко свідомо усвідомлювати, коли ви вводите упередження в дані. Гарантування справедливості в AI і машинному навчанні залишається складним завданням. + +Дані є великою "сліпою зоною" для традиційних метрик продуктивності моделі. Ви можете мати високі показники точності, але це не завжди відображає базове упередження даних, яке може бути у вашому наборі даних. Наприклад, якщо набір даних співробітників містить 27% жінок на керівних посадах у компанії та 73% чоловіків на тому ж рівні, модель AI для реклами вакансій, навчена на цих даних, може орієнтуватися переважно на чоловічу аудиторію для вакансій високого рівня. Ця диспропорція в даних вплинула на прогноз моделі, надаючи перевагу одній статі. Це виявляє проблему справедливості, де є гендерне упередження в моделі AI. + +Компонент "Аналіз даних" на панелі RAI допомагає визначити області, де є надмірне або недостатнє представлення в наборі даних. Він допомагає користувачам діагностувати причину помилок і проблем справедливості, спричинених дисбалансом даних або відсутністю представлення певної групи даних. Це дає користувачам можливість візуалізувати набори даних на основі прогнозованих і фактичних результатів, груп помилок і конкретних ознак. Іноді виявлення недостатньо представленої групи даних також може показати, що модель не навчається належним чином, що призводить до високих неточностей. Модель із упередженістю даних — це не лише проблема справедливості, але й показник того, що модель не є інклюзивною чи надійною. + +![Компонент "Аналіз даних" на панелі RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png) + +Використовуйте аналіз даних, коли вам потрібно: + +* Досліджувати статистику вашого набору даних, вибираючи різні фільтри для розбиття даних на різні виміри (також відомі як когорти). +* Зрозуміти розподіл вашого набору даних серед різних когорт і груп ознак. +* Визначити, чи є ваші висновки, пов’язані зі справедливістю, аналізом помилок і причинністю (отримані з інших компонентів панелі), результатом розподілу вашого набору даних. +* Вирішити, в яких областях потрібно зібрати більше даних, щоб зменшити помилки, спричинені проблемами представлення, шумом міток, шумом ознак, упередженням міток та іншими факторами. + +## Інтерпретація моделі + +Моделі машинного навчання часто вважаються "чорними ящиками". Розуміння того, які ключові ознаки даних впливають на прогноз моделі, може бути складним завданням. Важливо забезпечити прозорість того, чому модель робить певний прогноз. Наприклад, якщо система AI прогнозує, що пацієнт із діабетом має ризик повторної госпіталізації протягом менше ніж 30 днів, вона повинна надати підтверджуючі дані, які привели до цього прогнозу. Наявність підтверджуючих даних забезпечує прозорість, допомагаючи лікарям або лікарням приймати обґрунтовані рішення. Крім того, можливість пояснити, чому модель зробила прогноз для окремого пацієнта, забезпечує відповідність медичним регуляціям. Коли ви використовуєте моделі машинного навчання в способах, які впливають на життя людей, важливо розуміти та пояснювати, що впливає на поведінку моделі. Інтерпретація та пояснення моделі допомагають відповісти на запитання в таких сценаріях: + +* Налагодження моделі: Чому моя модель зробила цю помилку? Як я можу покращити свою модель? +* Співпраця людини та AI: Як я можу зрозуміти та довіряти рішенням моделі? +* Відповідність регуляціям: Чи відповідає моя модель юридичним вимогам? + +Компонент "Важливість ознак" на панелі RAI допомагає налагоджувати та отримувати всебічне розуміння того, як модель робить прогнози. Це також корисний інструмент для професіоналів машинного навчання та осіб, які приймають рішення, щоб пояснити та показати докази впливу ознак на поведінку моделі для відповідності регуляціям. Далі користувачі можуть досліджувати як глобальні, так і локальні пояснення, щоб перевірити, які ознаки впливають на прогнози моделі. Глобальні пояснення показують основні ознаки, які вплинули на загальний прогноз моделі. Локальні пояснення показують, які ознаки привели до прогнозу моделі для окремого випадку. Можливість оцінювати локальні пояснення також корисна для налагодження або аудиту конкретного випадку, щоб краще зрозуміти та інтерпретувати, чому модель зробила точний або неточний прогноз. + +![Компонент "Важливість ознак" на панелі RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/9-feature-importance.png) + +* Глобальні пояснення: Наприклад, які ознаки впливають на загальну поведінку моделі повторної госпіталізації пацієнтів із діабетом? +* Локальні пояснення: Наприклад, чому пацієнт із діабетом старше 60 років із попередніми госпіталізаціями був прогнозований як повторно госпіталізований або не госпіталізований протягом 30 днів? + +У процесі налагодження продуктивності моделі серед різних когорт "Важливість ознак" показує, який рівень впливу має ознака серед когорт. Це допомагає виявляти аномалії при порівнянні рівня впливу ознаки на помилкові прогнози моделі. Компонент "Важливість ознак" може показати, які значення в ознаці позитивно або негативно вплинули на результат моделі. Наприклад, якщо модель зробила неточний прогноз, компонент дає змогу деталізувати та визначити, які ознаки або значення ознак вплинули на прогноз. Такий рівень деталізації допомагає не лише в налагодженні, але й забезпечує прозорість і +- **Надмірне або недостатнє представлення**. Ідея полягає в тому, що певна група не представлена в певній професії, і будь-яка послуга чи функція, яка продовжує це підтримувати, сприяє завданню шкоди. + +### Панель інструментів Azure RAI + +[Панель інструментів Azure RAI](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) побудована на основі інструментів з відкритим кодом, розроблених провідними академічними установами та організаціями, включаючи Microsoft. Вона є важливим інструментом для науковців з даних та розробників штучного інтелекту, щоб краще розуміти поведінку моделей, виявляти та усувати небажані проблеми в моделях штучного інтелекту. + +- Дізнайтеся, як використовувати різні компоненти, переглянувши [документацію панелі інструментів RAI.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) + +- Ознайомтеся з [зразковими блокнотами панелі інструментів RAI](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) для налагодження більш відповідальних сценаріїв штучного інтелекту в Azure Machine Learning. + +--- +## 🚀 Виклик + +Щоб запобігти введенню статистичних або даних упереджень, ми повинні: + +- забезпечити різноманітність досвіду та перспектив серед людей, які працюють над системами +- інвестувати в набори даних, які відображають різноманітність нашого суспільства +- розробляти кращі методи для виявлення та виправлення упереджень, коли вони виникають + +Подумайте про реальні сценарії, де несправедливість очевидна у створенні та використанні моделей. Що ще ми повинні врахувати? + +## [Тест після лекції](https://ff-quizzes.netlify.app/en/ml/) +## Огляд і самостійне навчання + +У цьому уроці ви дізналися про деякі практичні інструменти для впровадження відповідального штучного інтелекту в машинне навчання. + +Перегляньте цей семінар, щоб глибше зануритися в тему: + +- Панель інструментів відповідального штучного інтелекту: універсальне рішення для впровадження RAI на практиці від Бесміри Нуші та Мехрнуш Самекі + +[![Панель інструментів відповідального штучного інтелекту: універсальне рішення для впровадження RAI на практиці](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Панель інструментів відповідального штучного інтелекту: універсальне рішення для впровадження RAI на практиці") + +> 🎥 Натисніть на зображення вище, щоб переглянути відео: Панель інструментів відповідального штучного інтелекту: універсальне рішення для впровадження RAI на практиці від Бесміри Нуші та Мехрнуш Самекі + +Ознайомтеся з наступними матеріалами, щоб дізнатися більше про відповідальний штучний інтелект і як створювати більш надійні моделі: + +- Інструменти панелі інструментів Microsoft RAI для налагодження моделей машинного навчання: [Ресурси інструментів відповідального штучного інтелекту](https://aka.ms/rai-dashboard) + +- Досліджуйте набір інструментів відповідального штучного інтелекту: [Github](https://github.com/microsoft/responsible-ai-toolbox) + +- Центр ресурсів Microsoft RAI: [Ресурси відповідального штучного інтелекту – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Дослідницька група Microsoft FATE: [FATE: Справедливість, підзвітність, прозорість та етика в штучному інтелекті - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +## Завдання + +[Ознайомтеся з панеллю інструментів RAI](assignment.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/9-Real-World/2-Debugging-ML-Models/assignment.md b/translations/uk/9-Real-World/2-Debugging-ML-Models/assignment.md new file mode 100644 index 00000000..8c058d19 --- /dev/null +++ b/translations/uk/9-Real-World/2-Debugging-ML-Models/assignment.md @@ -0,0 +1,25 @@ + +# Дослідження панелі відповідального штучного інтелекту (RAI) + +## Інструкції + +У цьому уроці ви дізналися про панель RAI — набір компонентів, створених на основі "відкритих інструментів", які допомагають науковцям з даних виконувати аналіз помилок, дослідження даних, оцінку справедливості, інтерпретацію моделей, оцінку контрафактів/гіпотетичних сценаріїв та причинний аналіз у системах штучного інтелекту. Для цього завдання ознайомтеся з деякими зразками [ноутбуків](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) панелі RAI та представте свої висновки у вигляді статті або презентації. + +## Критерії оцінювання + +| Критерії | Відмінно | Задовільно | Потребує покращення | +| -------- | -------- | ---------- | ------------------- | +| | Представлено статтю або презентацію PowerPoint, в якій обговорюються компоненти панелі RAI, ноутбук, який був запущений, та висновки, зроблені на основі його виконання | Представлено статтю без висновків | Стаття не представлена | + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/9-Real-World/README.md b/translations/uk/9-Real-World/README.md new file mode 100644 index 00000000..c1cb2ba1 --- /dev/null +++ b/translations/uk/9-Real-World/README.md @@ -0,0 +1,32 @@ + +# Постскриптум: Реальні застосування класичного машинного навчання + +У цьому розділі навчальної програми ви познайомитеся з деякими реальними прикладами використання класичного машинного навчання. Ми ретельно дослідили інтернет, щоб знайти наукові статті та матеріали про застосування цих стратегій, уникаючи нейронних мереж, глибокого навчання та штучного інтелекту наскільки це можливо. Дізнайтеся, як машинне навчання використовується в бізнес-системах, екологічних проектах, фінансах, мистецтві та культурі, і не тільки. + +![chess](../../../9-Real-World/images/chess.jpg) + +> Фото Alexis Fauvet на Unsplash + +## Урок + +1. [Реальні застосування машинного навчання](1-Applications/README.md) +2. [Налагодження моделей машинного навчання за допомогою компонентів панелі Responsible AI](2-Debugging-ML-Models/README.md) + +## Автори + +"Реальні застосування" написані командою, до якої входять [Jen Looper](https://twitter.com/jenlooper) та [Ornella Altunyan](https://twitter.com/ornelladotcom). + +"Налагодження моделей машинного навчання за допомогою компонентів панелі Responsible AI" написано [Ruth Yakubu](https://twitter.com/ruthieyakubu). + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/CODE_OF_CONDUCT.md b/translations/uk/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..05f7b269 --- /dev/null +++ b/translations/uk/CODE_OF_CONDUCT.md @@ -0,0 +1,23 @@ + +# Кодекс поведінки для відкритого коду Microsoft + +Цей проєкт прийняв [Кодекс поведінки для відкритого коду Microsoft](https://opensource.microsoft.com/codeofconduct/). + +Ресурси: + +- [Кодекс поведінки для відкритого коду Microsoft](https://opensource.microsoft.com/codeofconduct/) +- [Часті запитання щодо Кодексу поведінки](https://opensource.microsoft.com/codeofconduct/faq/) +- Звертайтеся за адресою [opencode@microsoft.com](mailto:opencode@microsoft.com) з питаннями або занепокоєннями + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний переклад людиною. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/CONTRIBUTING.md b/translations/uk/CONTRIBUTING.md new file mode 100644 index 00000000..becafe9f --- /dev/null +++ b/translations/uk/CONTRIBUTING.md @@ -0,0 +1,30 @@ + +# Участь у проекті + +Цей проєкт вітає внески та пропозиції. Більшість внесків вимагають від вас +погодитися з Угодою про ліцензування внесків (Contributor License Agreement, CLA), яка підтверджує, що ви маєте право, +а також дійсно надаєте нам права на використання вашого внеску. Для деталей відвідайте +https://cla.microsoft.com. + +> Важливо: перекладаючи текст у цьому репозиторії, будь ласка, переконайтеся, що ви не використовуєте машинний переклад. Ми перевірятимемо переклади через спільноту, тому долучайтеся до перекладу лише мовами, якими ви володієте на високому рівні. + +Коли ви надсилаєте pull request, бот CLA автоматично визначить, чи потрібно вам +надати CLA, і відповідно позначить PR (наприклад, міткою, коментарем). Просто дотримуйтесь +інструкцій, наданих ботом. Вам потрібно буде зробити це лише один раз для всіх репозиторіїв, які використовують нашу CLA. + +Цей проєкт прийняв [Кодекс поведінки з відкритим кодом Microsoft](https://opensource.microsoft.com/codeofconduct/). +Для отримання додаткової інформації перегляньте [FAQ щодо Кодексу поведінки](https://opensource.microsoft.com/codeofconduct/faq/) +або зверніться за адресою [opencode@microsoft.com](mailto:opencode@microsoft.com) з будь-якими додатковими питаннями чи коментарями. + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/README.md b/translations/uk/README.md new file mode 100644 index 00000000..ba749d0e --- /dev/null +++ b/translations/uk/README.md @@ -0,0 +1,178 @@ + +[![GitHub license](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/) + +### 🌐 Підтримка багатомовності + +#### Підтримується через GitHub Action (автоматично та завжди актуально) + +[French](../fr/README.md) | [Spanish](../es/README.md) | [German](../de/README.md) | [Russian](../ru/README.md) | [Arabic](../ar/README.md) | [Persian (Farsi)](../fa/README.md) | [Urdu](../ur/README.md) | [Chinese (Simplified)](../zh/README.md) | [Chinese (Traditional, Macau)](../mo/README.md) | [Chinese (Traditional, Hong Kong)](../hk/README.md) | [Chinese (Traditional, Taiwan)](../tw/README.md) | [Japanese](../ja/README.md) | [Korean](../ko/README.md) | [Hindi](../hi/README.md) | [Bengali](../bn/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Portuguese (Portugal)](../pt/README.md) | [Portuguese (Brazil)](../br/README.md) | [Italian](../it/README.md) | [Polish](../pl/README.md) | [Turkish](../tr/README.md) | [Greek](../el/README.md) | [Thai](../th/README.md) | [Swedish](../sv/README.md) | [Danish](../da/README.md) | [Norwegian](../no/README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](../he/README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Croatian](../hr/README.md) | [Slovenian](../sl/README.md) | [Ukrainian](./README.md) | [Burmese (Myanmar)](../my/README.md) + +#### Приєднуйтесь до спільноти + +[![Azure AI Discord](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) + +# Машинне навчання для початківців - навчальна програма + +> 🌍 Подорожуйте світом, досліджуючи машинне навчання через культури світу 🌍 + +Команда Cloud Advocates у Microsoft рада запропонувати 12-тижневу навчальну програму з 26 уроків, присвячену **машинному навчанню**. У цій програмі ви дізнаєтеся про те, що іноді називають **класичним машинним навчанням**, використовуючи переважно бібліотеку Scikit-learn і уникаючи глибокого навчання, яке охоплюється в нашій [навчальній програмі "AI для початківців"](https://aka.ms/ai4beginners). Поєднуйте ці уроки з нашою [навчальною програмою "Data Science для початківців"](https://aka.ms/ds4beginners), також! + +Подорожуйте з нами світом, застосовуючи ці класичні техніки до даних з різних куточків світу. Кожен урок включає тести до і після уроку, письмові інструкції для виконання завдання, рішення, завдання та багато іншого. Наш підхід, заснований на проектах, дозволяє навчатися, створюючи, що є перевіреним способом закріплення нових навичок. + +**✍️ Щира подяка нашим авторам** Джен Лупер, Стівену Ховеллу, Франчесці Лаццері, Томомі Імурі, Кассі Бревіу, Дмитру Сошникову, Крісу Норінгу, Анірбану Мукерджі, Орнеллі Алтунян, Рут Якобу та Емі Бойд + +**🎨 Дякуємо також нашим ілюстраторам** Томомі Імурі, Дасані Мадіпаллі та Джен Лупер + +**🙏 Особлива подяка 🙏 нашим авторам, рецензентам та контриб'юторам з числа студентів-амбасадорів Microsoft**, зокрема Рішиту Даглі, Мухаммаду Сакібу Хану Інану, Рохану Раджу, Александру Петреску, Абхішеку Джайсвалу, Наврін Табассум, Іоану Самуїлі та Снігдхі Агарвал + +**🤩 Окрема вдячність студентам-амбасадорам Microsoft Еріку Ванджау, Джаслін Сонді та Відуші Гупті за уроки з R!** + +# Початок роботи + +Виконайте наступні кроки: +1. **Зробіть форк репозиторію**: Натисніть кнопку "Fork" у верхньому правому куті цієї сторінки. +2. **Клонуйте репозиторій**: `git clone https://github.com/microsoft/ML-For-Beginners.git` + +> [знайдіть усі додаткові ресурси для цього курсу в нашій колекції Microsoft Learn](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +**[Студенти](https://aka.ms/student-page)**, щоб використовувати цю навчальну програму, зробіть форк усього репозиторію у свій власний обліковий запис GitHub і виконуйте вправи самостійно або в групі: + +- Почніть із тесту перед лекцією. +- Прочитайте лекцію та виконайте завдання, зупиняючись і розмірковуючи на кожному етапі перевірки знань. +- Спробуйте створити проекти, розуміючи уроки, а не просто запускаючи код рішення; однак цей код доступний у папках `/solution` у кожному проектно-орієнтованому уроці. +- Пройдіть тест після лекції. +- Виконайте завдання. +- Виконайте домашнє завдання. +- Після завершення групи уроків відвідайте [Дошку обговорень](https://github.com/microsoft/ML-For-Beginners/discussions) і "навчайтеся вголос", заповнюючи відповідний рубрикатор PAT. PAT — це інструмент оцінки прогресу, який ви заповнюєте для подальшого навчання. Ви також можете реагувати на інші PAT, щоб ми могли навчатися разом. + +> Для подальшого навчання ми рекомендуємо пройти ці [модулі та навчальні шляхи Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott). + +**Викладачі**, ми [додали кілька пропозицій](for-teachers.md) щодо використання цієї навчальної програми. + +--- + +## Відео-огляди + +Деякі уроки доступні у вигляді коротких відео. Ви можете знайти їх у самих уроках або на [плейлисті ML для початківців на YouTube-каналі Microsoft Developer](https://aka.ms/ml-beginners-videos), натиснувши на зображення нижче. + +[![Банер ML для початківців](../../images/ml-for-beginners-video-banner.png)](https://aka.ms/ml-beginners-videos) + +--- + +## Знайомство з командою + +[![Промо-відео](../../images/ml.gif)](https://youtu.be/Tj1XWrDSYJU) + +**Gif створено** [Мохітом Джайсалом](https://linkedin.com/in/mohitjaisal) + +> 🎥 Натисніть на зображення вище, щоб переглянути відео про проєкт і людей, які його створили! + +--- + +## Педагогіка + +Ми обрали два педагогічні принципи під час створення цієї навчальної програми: забезпечення її практичності через **проектний підхід** та включення **частих тестів**. Крім того, ця програма має спільну **тему**, яка надає їй цілісності. + +Забезпечуючи відповідність контенту проектам, процес стає більш захоплюючим для студентів, а засвоєння концепцій буде посилено. Крім того, тест перед заняттям з низькими ставками налаштовує студента на вивчення теми, а другий тест після заняття забезпечує подальше закріплення знань. Ця навчальна програма була розроблена як гнучка та цікава і може бути використана повністю або частково. Проекти починаються з простих і стають дедалі складнішими до кінця 12-тижневого циклу. Ця програма також включає постскриптум про реальні застосування ML, який може бути використаний як додатковий матеріал або як основа для обговорення. + +> Знайдіть наш [Кодекс поведінки](CODE_OF_CONDUCT.md), [Рекомендації щодо внесення змін](CONTRIBUTING.md) та [Рекомендації щодо перекладу](TRANSLATIONS.md). Ми вітаємо ваші конструктивні відгуки! + +## Кожен урок включає + +- необов'язковий скетчноут +- необов'язкове додаткове відео +- відео-огляд (лише для деяких уроків) +- [тест перед лекцією](https://ff-quizzes.netlify.app/en/ml/) +- письмовий урок +- для проектно-орієнтованих уроків, покрокові інструкції щодо створення проекту +- перевірки знань +- виклик +- додаткове читання +- домашнє завдання +- [тест після лекції](https://ff-quizzes.netlify.app/en/ml/) + +> **Примітка про мови**: Ці уроки переважно написані на Python, але багато з них також доступні на R. Щоб виконати урок на R, перейдіть до папки `/solution` і знайдіть уроки на R. Вони включають розширення .rmd, яке представляє **R Markdown** файл, що може бути просто визначений як вбудовування `кодових блоків` (на R або інших мовах) та `YAML-заголовка` (який визначає, як форматувати вихідні дані, такі як PDF) у `Markdown-документ`. Таким чином, це служить зразковою авторською платформою для науки про дані, оскільки дозволяє комбінувати ваш код, його вихідні дані та ваші думки, записуючи їх у Markdown. Крім того, документи R Markdown можуть бути перетворені у вихідні формати, такі як PDF, HTML або Word. + +> **Примітка про тести**: Усі тести містяться в [папці Quiz App](../../quiz-app), всього 52 тести по три питання кожен. Вони пов'язані з уроками, але додаток для тестів можна запустити локально; дотримуйтесь інструкцій у папці `quiz-app`, щоб локально розмістити або розгорнути на Azure. + +| Номер уроку | Тема | Групування уроків | Навчальні цілі | Пов'язаний урок | Автор | +| :-----------: | :------------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: | +| 01 | Вступ до машинного навчання | [Вступ](1-Introduction/README.md) | Дізнайтеся основні концепції машинного навчання | [Урок](1-Introduction/1-intro-to-ML/README.md) | Мухаммад | +| 02 | Історія машинного навчання | [Вступ](1-Introduction/README.md) | Дізнайтеся історію, що лежить в основі цієї галузі | [Урок](1-Introduction/2-history-of-ML/README.md) | Джен та Емі | +| 03 | Справедливість у машинному навчанні | [Вступ](1-Introduction/README.md) | Які важливі філософські питання щодо справедливості повинні враховувати студенти при створенні та застосуванні моделей ML? | [Урок](1-Introduction/3-fairness/README.md) | Томомі | +| 04 | Техніки машинного навчання | [Вступ](1-Introduction/README.md) | Які техніки використовують дослідники ML для створення моделей машинного навчання? | [Урок](1-Introduction/4-techniques-of-ML/README.md) | Кріс і Джен | +| 05 | Вступ до регресії | [Регресія](2-Regression/README.md) | Почніть роботу з Python і Scikit-learn для моделей регресії | +
                                          • [Python](2-Regression/1-Tools/README.md)
                                          • [R](../../2-Regression/1-Tools/solution/R/lesson_1.html)
                                          |
                                          • Джен
                                          • Ерік Ванджау
                                          | +| 06 | Ціни на гарбузи в Північній Америці 🎃 | [Регресія](2-Regression/README.md) | Візуалізуйте та очистіть дані для підготовки до ML |
                                          • [Python](2-Regression/2-Data/README.md)
                                          • [R](../../2-Regression/2-Data/solution/R/lesson_2.html)
                                          |
                                          • Джен
                                          • Ерік Ванджау
                                          | +| 07 | Ціни на гарбузи в Північній Америці 🎃 | [Регресія](2-Regression/README.md) | Створіть моделі лінійної та поліноміальної регресії |
                                          • [Python](2-Regression/3-Linear/README.md)
                                          • [R](../../2-Regression/3-Linear/solution/R/lesson_3.html)
                                          |
                                          • Джен і Дмитро
                                          • Ерік Ванджау
                                          | +| 08 | Ціни на гарбузи в Північній Америці 🎃 | [Регресія](2-Regression/README.md) | Створіть модель логістичної регресії |
                                          • [Python](2-Regression/4-Logistic/README.md)
                                          • [R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)
                                          |
                                          • Джен
                                          • Ерік Ванджау
                                          | +| 09 | Веб-додаток 🔌 | [Веб-додаток](3-Web-App/README.md) | Створіть веб-додаток для використання вашої навченої моделі | [Python](3-Web-App/1-Web-App/README.md) | Джен | +| 10 | Вступ до класифікації | [Класифікація](4-Classification/README.md) | Очистіть, підготуйте та візуалізуйте дані; вступ до класифікації |
                                          • [Python](4-Classification/1-Introduction/README.md)
                                          • [R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) |
                                            • Джен і Кессі
                                            • Ерік Ванджау
                                            | +| 11 | Смачні азійські та індійські страви 🍜 | [Класифікація](4-Classification/README.md) | Вступ до класифікаторів |
                                            • [Python](4-Classification/2-Classifiers-1/README.md)
                                            • [R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) |
                                              • Джен і Кессі
                                              • Ерік Ванджау
                                              | +| 12 | Смачні азійські та індійські страви 🍜 | [Класифікація](4-Classification/README.md) | Більше класифікаторів |
                                              • [Python](4-Classification/3-Classifiers-2/README.md)
                                              • [R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) |
                                                • Джен і Кессі
                                                • Ерік Ванджау
                                                | +| 13 | Смачні азійські та індійські страви 🍜 | [Класифікація](4-Classification/README.md) | Створіть веб-додаток рекомендацій, використовуючи вашу модель | [Python](4-Classification/4-Applied/README.md) | Джен | +| 14 | Вступ до кластеризації | [Кластеризація](5-Clustering/README.md) | Очистіть, підготуйте та візуалізуйте дані; вступ до кластеризації |
                                                • [Python](5-Clustering/1-Visualize/README.md)
                                                • [R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) |
                                                  • Джен
                                                  • Ерік Ванджау
                                                  | +| 15 | Дослідження музичних уподобань Нігерії 🎧 | [Кластеризація](5-Clustering/README.md) | Дослідження методу кластеризації K-Means |
                                                  • [Python](5-Clustering/2-K-Means/README.md)
                                                  • [R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) |
                                                    • Джен
                                                    • Ерік Ванджау
                                                    | +| 16 | Вступ до обробки природної мови ☕️ | [Обробка природної мови](6-NLP/README.md) | Вивчіть основи NLP, створивши простого бота | [Python](6-NLP/1-Introduction-to-NLP/README.md) | Стівен | +| 17 | Загальні завдання NLP ☕️ | [Обробка природної мови](6-NLP/README.md) | Поглибте знання NLP, зрозумівши загальні завдання, пов'язані зі структурою мови | [Python](6-NLP/2-Tasks/README.md) | Стівен | +| 18 | Переклад і аналіз настроїв ♥️ | [Обробка природної мови](6-NLP/README.md) | Переклад і аналіз настроїв за творами Джейн Остін | [Python](6-NLP/3-Translation-Sentiment/README.md) | Стівен | +| 19 | Романтичні готелі Європи ♥️ | [Обробка природної мови](6-NLP/README.md) | Аналіз настроїв за відгуками про готелі 1 | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | Стівен | +| 20 | Романтичні готелі Європи ♥️ | [Обробка природної мови](6-NLP/README.md) | Аналіз настроїв за відгуками про готелі 2 | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | Стівен | +| 21 | Вступ до прогнозування часових рядів | [Часові ряди](7-TimeSeries/README.md) | Вступ до прогнозування часових рядів | [Python](7-TimeSeries/1-Introduction/README.md) | Франческа | +| 22 | ⚡️ Використання електроенергії у світі ⚡️ - прогнозування з ARIMA | [Часові ряди](7-TimeSeries/README.md) | Прогнозування часових рядів за допомогою ARIMA | [Python](7-TimeSeries/2-ARIMA/README.md) | Франческа | +| 23 | ⚡️ Використання електроенергії у світі ⚡️ - прогнозування з SVR | [Часові ряди](7-TimeSeries/README.md) | Прогнозування часових рядів за допомогою Support Vector Regressor | [Python](7-TimeSeries/3-SVR/README.md) | Анірбан | +| 24 | Вступ до навчання з підкріпленням | [Навчання з підкріпленням](8-Reinforcement/README.md)| Вступ до навчання з підкріпленням за допомогою Q-Learning | [Python](8-Reinforcement/1-QLearning/README.md) | Дмитро | +| 25 | Допоможіть Пітеру уникнути вовка! 🐺 | [Навчання з підкріпленням](8-Reinforcement/README.md)| Навчання з підкріпленням у Gym | [Python](8-Reinforcement/2-Gym/README.md) | Дмитро | +| Постскриптум | Реальні сценарії та застосування ML | [ML у реальному світі](9-Real-World/README.md) | Цікаві та показові реальні застосування класичного ML | [Урок](9-Real-World/1-Applications/README.md) | Команда | +| Постскриптум | Налагодження моделей ML за допомогою панелі RAI | [ML у реальному світі](9-Real-World/README.md) | Налагодження моделей машинного навчання за допомогою компонентів панелі Responsible AI | [Урок](9-Real-World/2-Debugging-ML-Models/README.md) | Рут Якубу | + +> [знайдіть усі додаткові ресурси для цього курсу в нашій колекції Microsoft Learn](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +## Офлайн-доступ + +Ви можете запустити цю документацію офлайн, використовуючи [Docsify](https://docsify.js.org/#/). Форкніть цей репозиторій, [встановіть Docsify](https://docsify.js.org/#/quickstart) на вашому локальному комп'ютері, а потім у кореневій папці цього репозиторію введіть `docsify serve`. Вебсайт буде доступний на порту 3000 вашого localhost: `localhost:3000`. + +## PDF-файли + +Знайдіть PDF-версію навчальної програми з посиланнями [тут](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf). + + +## 🎒 Інші курси + +Наша команда створює інші курси! Ознайомтеся з: + +- [Generative AI для початківців](https://aka.ms/genai-beginners) +- [Generative AI для початківців .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet) +- [Generative AI з JavaScript](https://github.com/microsoft/generative-ai-with-javascript) +- [Generative AI з Java](https://github.com/microsoft/Generative-AI-for-beginners-java) +- [AI для початківців](https://aka.ms/ai-beginners) +- [Data Science для початківців](https://aka.ms/datascience-beginners) +- [ML для початківців](https://aka.ms/ml-beginners) +- [Кібербезпека для початківців](https://github.com/microsoft/Security-101) +- [Веб-розробка для початківців](https://aka.ms/webdev-beginners) +- [IoT для початківців](https://aka.ms/iot-beginners) +- [Розробка XR для початківців](https://github.com/microsoft/xr-development-for-beginners) +- [Опанування GitHub Copilot для парного програмування](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming) +- [Опанування GitHub Copilot для розробників C#/.NET](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers) +- [Виберіть свою пригоду з Copilot](https://github.com/microsoft/CopilotAdventures) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/SECURITY.md b/translations/uk/SECURITY.md new file mode 100644 index 00000000..182684f6 --- /dev/null +++ b/translations/uk/SECURITY.md @@ -0,0 +1,51 @@ + +## Безпека + +Microsoft серйозно ставиться до безпеки наших програмних продуктів і послуг, включаючи всі репозиторії вихідного коду, які управляються через наші організації на GitHub, такі як [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin) та [наші організації на GitHub](https://opensource.microsoft.com/). + +Якщо ви вважаєте, що знайшли вразливість у безпеці в будь-якому репозиторії, що належить Microsoft, яка відповідає [визначенню вразливості в безпеці Microsoft](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott), будь ласка, повідомте нам про це, як описано нижче. + +## Повідомлення про проблеми безпеки + +**Будь ласка, не повідомляйте про вразливості в безпеці через публічні питання на GitHub.** + +Натомість повідомте про них до Центру реагування на безпеку Microsoft (MSRC) за адресою [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). + +Якщо ви віддаєте перевагу надсилати повідомлення без входу в систему, надішліть електронний лист на [secure@microsoft.com](mailto:secure@microsoft.com). Якщо можливо, зашифруйте ваше повідомлення за допомогою нашого PGP-ключа; завантажте його зі сторінки [Microsoft Security Response Center PGP Key](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). + +Ви повинні отримати відповідь протягом 24 годин. Якщо з якоїсь причини ви її не отримали, будь ласка, надішліть повторний електронний лист, щоб переконатися, що ми отримали ваше початкове повідомлення. Додаткову інформацію можна знайти на [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Будь ласка, включіть запитану інформацію, зазначену нижче (наскільки це можливо), щоб допомогти нам краще зрозуміти природу та масштаб можливої проблеми: + + * Тип проблеми (наприклад, переповнення буфера, SQL-ін'єкція, міжсайтовий скриптинг тощо) + * Повні шляхи до файлів вихідного коду, пов'язаних із проявом проблеми + * Місце розташування ураженого вихідного коду (тег/гілка/коміт або прямий URL) + * Будь-яка спеціальна конфігурація, необхідна для відтворення проблеми + * Покрокові інструкції для відтворення проблеми + * Код доказу концепції або експлойт (якщо можливо) + * Вплив проблеми, включаючи те, як зловмисник може використати проблему + +Ця інформація допоможе нам швидше обробити ваш звіт. + +Якщо ви повідомляєте про проблему в рамках програми винагороди за помилки, більш повні звіти можуть сприяти отриманню більшої винагороди. Будь ласка, відвідайте сторінку [Програма винагороди за помилки Microsoft](https://microsoft.com/msrc/bounty) для отримання додаткової інформації про наші активні програми. + +## Перевага мов + +Ми віддаємо перевагу спілкуванню англійською мовою. + +## Політика + +Microsoft дотримується принципу [Координованого розкриття вразливостей](https://www.microsoft.com/en-us/msrc/cvd). + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/SUPPORT.md b/translations/uk/SUPPORT.md new file mode 100644 index 00000000..ec8d72eb --- /dev/null +++ b/translations/uk/SUPPORT.md @@ -0,0 +1,26 @@ + +# Підтримка +## Як повідомити про проблеми та отримати допомогу + +Цей проєкт використовує GitHub Issues для відстеження помилок і запитів на нові функції. Будь ласка, перегляньте існуючі +записи перед тим, як створювати нові, щоб уникнути дублювання. Для нових проблем створіть запис про помилку або +запит на функцію як новий Issue. + +Для отримання допомоги та запитань щодо використання цього проєкту створіть запис у Issues. + +## Політика підтримки Microsoft + +Підтримка цього репозиторію обмежується ресурсами, зазначеними вище. + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/docs/_sidebar.md b/translations/uk/docs/_sidebar.md new file mode 100644 index 00000000..9171222f --- /dev/null +++ b/translations/uk/docs/_sidebar.md @@ -0,0 +1,57 @@ + +- Вступ + - [Вступ до машинного навчання](../1-Introduction/1-intro-to-ML/README.md) + - [Історія машинного навчання](../1-Introduction/2-history-of-ML/README.md) + - [Машинне навчання та справедливість](../1-Introduction/3-fairness/README.md) + - [Техніки машинного навчання](../1-Introduction/4-techniques-of-ML/README.md) + +- Регресія + - [Інструменти для роботи](../2-Regression/1-Tools/README.md) + - [Дані](../2-Regression/2-Data/README.md) + - [Лінійна регресія](../2-Regression/3-Linear/README.md) + - [Логістична регресія](../2-Regression/4-Logistic/README.md) + +- Створення веб-додатку + - [Веб-додаток](../3-Web-App/1-Web-App/README.md) + +- Класифікація + - [Вступ до класифікації](../4-Classification/1-Introduction/README.md) + - [Класифікатори 1](../4-Classification/2-Classifiers-1/README.md) + - [Класифікатори 2](../4-Classification/3-Classifiers-2/README.md) + - [Прикладне машинне навчання](../4-Classification/4-Applied/README.md) + +- Кластеризація + - [Візуалізація даних](../5-Clustering/1-Visualize/README.md) + - [Метод K-середніх](../5-Clustering/2-K-Means/README.md) + +- Обробка природної мови (NLP) + - [Вступ до NLP](../6-NLP/1-Introduction-to-NLP/README.md) + - [Завдання NLP](../6-NLP/2-Tasks/README.md) + - [Переклад та аналіз настроїв](../6-NLP/3-Translation-Sentiment/README.md) + - [Огляд готелів 1](../6-NLP/4-Hotel-Reviews-1/README.md) + - [Огляд готелів 2](../6-NLP/5-Hotel-Reviews-2/README.md) + +- Прогнозування часових рядів + - [Вступ до прогнозування часових рядів](../7-TimeSeries/1-Introduction/README.md) + - [ARIMA](../7-TimeSeries/2-ARIMA/README.md) + - [SVR](../7-TimeSeries/3-SVR/README.md) + +- Навчання з підкріпленням + - [Q-Learning](../8-Reinforcement/1-QLearning/README.md) + - [Gym](../8-Reinforcement/2-Gym/README.md) + +- Машинне навчання у реальному світі + - [Застосування](../9-Real-World/1-Applications/README.md) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/for-teachers.md b/translations/uk/for-teachers.md new file mode 100644 index 00000000..917c3b54 --- /dev/null +++ b/translations/uk/for-teachers.md @@ -0,0 +1,37 @@ + +## Для викладачів + +Хочете використовувати цей навчальний матеріал у своєму класі? Будь ласка, не соромтеся! + +Насправді, ви можете використовувати його прямо на GitHub, скориставшись GitHub Classroom. + +Для цього зробіть форк цього репозиторію. Вам потрібно буде створити окремий репозиторій для кожного уроку, тому необхідно витягнути кожну папку в окремий репозиторій. Таким чином, [GitHub Classroom](https://classroom.github.com/classrooms) зможе окремо обробляти кожен урок. + +Ці [повні інструкції](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) допоможуть вам зрозуміти, як налаштувати ваш клас. + +## Використання репозиторію як є + +Якщо ви хочете використовувати цей репозиторій у його поточному вигляді, без використання GitHub Classroom, це також можливо. Вам потрібно буде повідомити своїм студентам, над яким уроком працювати разом. + +У форматі онлайн (Zoom, Teams або іншому) ви можете створити кімнати для обговорення тестів і допомагати студентам підготуватися до навчання. Потім запросіть студентів пройти тести та надіслати свої відповіді як 'issues' у певний час. Ви можете зробити те саме із завданнями, якщо хочете, щоб студенти працювали спільно у відкритому форматі. + +Якщо ви віддаєте перевагу більш приватному формату, попросіть студентів зробити форк навчального матеріалу, урок за уроком, у свої власні приватні репозиторії на GitHub і надати вам доступ. Тоді вони зможуть проходити тести та виконувати завдання приватно, надсилаючи їх вам через issues у вашому класному репозиторії. + +Існує багато способів організувати це в онлайн-класі. Будь ласка, повідомте нам, що працює найкраще для вас! + +## Будь ласка, поділіться своїми думками! + +Ми хочемо зробити цей навчальний матеріал корисним для вас і ваших студентів. Будь ласка, залиште нам [відгук](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u). + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/quiz-app/README.md b/translations/uk/quiz-app/README.md new file mode 100644 index 00000000..08586bfa --- /dev/null +++ b/translations/uk/quiz-app/README.md @@ -0,0 +1,127 @@ + +# Вікторини + +Ці вікторини є попередніми та підсумковими тестами для курсу машинного навчання за адресою https://aka.ms/ml-beginners + +## Налаштування проєкту + +``` +npm install +``` + +### Компіляція та автоматичне оновлення для розробки + +``` +npm run serve +``` + +### Компіляція та мінімізація для продакшну + +``` +npm run build +``` + +### Перевірка та виправлення файлів + +``` +npm run lint +``` + +### Налаштування конфігурації + +Дивіться [Довідник конфігурації](https://cli.vuejs.org/config/). + +Подяка: Дякуємо за оригінальну версію цього додатку для вікторин: https://github.com/arpan45/simple-quiz-vue + +## Розгортання на Azure + +Ось покрокова інструкція, яка допоможе вам розпочати: + +1. Форкніть GitHub репозиторій +Переконайтеся, що код вашого статичного веб-додатку знаходиться у вашому GitHub репозиторії. Форкніть цей репозиторій. + +2. Створіть статичний веб-додаток на Azure +- Створіть [обліковий запис Azure](http://azure.microsoft.com) +- Перейдіть до [порталу Azure](https://portal.azure.com) +- Натисніть "Створити ресурс" і знайдіть "Static Web App". +- Натисніть "Створити". + +3. Налаштуйте статичний веб-додаток +- Основне: + - Підписка: Виберіть вашу підписку Azure. + - Група ресурсів: Створіть нову групу ресурсів або використайте існуючу. + - Назва: Вкажіть назву для вашого статичного веб-додатку. + - Регіон: Виберіть регіон, найближчий до ваших користувачів. + +- #### Деталі розгортання: + - Джерело: Виберіть "GitHub". + - Обліковий запис GitHub: Авторизуйте Azure для доступу до вашого облікового запису GitHub. + - Організація: Виберіть вашу GitHub організацію. + - Репозиторій: Виберіть репозиторій, що містить ваш статичний веб-додаток. + - Гілка: Виберіть гілку, з якої ви хочете розгортати. + +- #### Деталі збірки: + - Пресети збірки: Виберіть фреймворк, на якому побудовано ваш додаток (наприклад, React, Angular, Vue тощо). + - Розташування додатку: Вкажіть папку, що містить код вашого додатку (наприклад, /, якщо він знаходиться в корені). + - Розташування API: Якщо у вас є API, вкажіть його розташування (опціонально). + - Розташування вихідних даних: Вкажіть папку, де генерується вихідний код збірки (наприклад, build або dist). + +4. Перевірте та створіть +Перевірте ваші налаштування та натисніть "Створити". Azure налаштує необхідні ресурси та створить GitHub Actions workflow у вашому репозиторії. + +5. GitHub Actions Workflow +Azure автоматично створить файл GitHub Actions workflow у вашому репозиторії (.github/workflows/azure-static-web-apps-.yml). Цей workflow буде обробляти процес збірки та розгортання. + +6. Моніторинг розгортання +Перейдіть до вкладки "Actions" у вашому GitHub репозиторії. +Ви повинні побачити запущений workflow. Цей workflow збере та розгорне ваш статичний веб-додаток на Azure. +Після завершення workflow ваш додаток буде доступний за наданою URL-адресою Azure. + +### Приклад файлу Workflow + +Ось приклад того, як може виглядати файл GitHub Actions workflow: +name: Azure Static Web Apps CI/CD +``` +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - main + +jobs: + build_and_deploy_job: + runs-on: ubuntu-latest + name: Build and Deploy Job + steps: + - uses: actions/checkout@v2 + - name: Build And Deploy + id: builddeploy + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }} + repo_token: ${{ secrets.GITHUB_TOKEN }} + action: "upload" + app_location: "/quiz-app" # App source code path + api_location: ""API source code path optional + output_location: "dist" #Built app content directory - optional +``` + +### Додаткові ресурси +- [Документація Azure Static Web Apps](https://learn.microsoft.com/azure/static-web-apps/getting-started) +- [Документація GitHub Actions](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app) + +--- + +**Відмова від відповідальності**: +Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/sketchnotes/LICENSE.md b/translations/uk/sketchnotes/LICENSE.md new file mode 100644 index 00000000..308383f0 --- /dev/null +++ b/translations/uk/sketchnotes/LICENSE.md @@ -0,0 +1,124 @@ + +Поширення на тих самих умовах 4.0 Міжнародна + +======================================================================= + +Корпорація Creative Commons ("Creative Commons") не є юридичною фірмою і не надає юридичних послуг або консультацій. Розповсюдження публічних ліцензій Creative Commons не створює відносин адвокат-клієнт або інших подібних відносин. Creative Commons надає свої ліцензії та пов’язану інформацію "як є". Creative Commons не надає жодних гарантій щодо своїх ліцензій, будь-яких матеріалів, ліцензованих відповідно до їхніх умов, або будь-якої пов’язаної інформації. Creative Commons відмовляється від будь-якої відповідальності за збитки, що виникають у результаті їх використання, наскільки це можливо за законом. + +Використання публічних ліцензій Creative Commons + +Публічні ліцензії Creative Commons забезпечують стандартний набір умов, які автори та інші правовласники можуть використовувати для поширення оригінальних творів і матеріалів, що підпадають під дію авторського права та певних інших прав, зазначених у публічній ліцензії нижче. Наступні зауваження надаються лише для інформаційних цілей, не є вичерпними і не є частиною наших ліцензій. + + Зауваження для ліцензіарів: Наші публічні ліцензії призначені для використання тими, хто має право надати публіці дозвіл на використання матеріалів у спосіб, який інакше обмежується авторським правом та іншими правами. Наші ліцензії є безвідкличними. Ліцензіари повинні ознайомитися з умовами ліцензії, яку вони обирають, перед її застосуванням. Ліцензіари також повинні забезпечити наявність усіх необхідних прав перед застосуванням наших ліцензій, щоб публіка могла використовувати матеріали відповідно до очікувань. Ліцензіари повинні чітко позначати будь-які матеріали, які не підпадають під дію ліцензії. Це включає інші матеріали, ліцензовані за CC, або матеріали, використані відповідно до винятків чи обмежень авторського права. Більше зауважень для ліцензіарів: + wiki.creativecommons.org/Considerations_for_licensors + + Зауваження для публіки: Використовуючи одну з наших публічних ліцензій, ліцензіар надає публіці дозвіл використовувати ліцензовані матеріали на умовах, зазначених у ліцензії. Якщо дозвіл ліцензіара не потрібен з будь-якої причини — наприклад, через застосування винятків чи обмежень авторського права — тоді таке використання не регулюється ліцензією. Наші ліцензії надають лише дозволи в межах авторського права та певних інших прав, які ліцензіар має право надавати. Використання ліцензованих матеріалів може бути обмежене з інших причин, включаючи права інших осіб на матеріали. Ліцензіар може робити спеціальні запити, наприклад, просити позначати або описувати всі зміни. Хоча це не є обов’язковим за нашими ліцензіями, ми рекомендуємо поважати такі запити, якщо це розумно. Більше зауважень для публіки: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Публічна ліцензія Creative Commons Attribution-ShareAlike 4.0 International + +Використовуючи Ліцензовані Права (визначені нижче), Ви приймаєте і погоджуєтеся дотримуватися умов цієї Публічної ліцензії Creative Commons Attribution-ShareAlike 4.0 International ("Публічна ліцензія"). У тій мірі, в якій ця Публічна ліцензія може бути інтерпретована як договір, Ви отримуєте Ліцензовані Права в обмін на прийняття цих умов, а Ліцензіар надає Вам такі права в обмін на вигоди, які Ліцензіар отримує від надання Ліцензованого Матеріалу на цих умовах. + +Розділ 1 — Визначення. + + a. Адаптований Матеріал означає матеріал, що підпадає під дію авторського права та подібних прав, який створений на основі Ліцензованого Матеріалу або є його похідним, і в якому Ліцензований Матеріал перекладено, змінено, упорядковано, трансформовано або іншим чином модифіковано у спосіб, що вимагає дозволу відповідно до авторського права та подібних прав, які належать Ліцензіару. Для цілей цієї Публічної ліцензії, якщо Ліцензований Матеріал є музичним твором, виконанням або звуковим записом, Адаптований Матеріал завжди створюється, коли Ліцензований Матеріал синхронізується у часовому зв’язку з рухомим зображенням. + + b. Ліцензія Адаптера означає ліцензію, яку Ви застосовуєте до своїх авторських прав та подібних прав у Ваших внесках до Адаптованого Матеріалу відповідно до умов цієї Публічної ліцензії. + + c. Сумісна ліцензія BY-SA означає ліцензію, зазначену на creativecommons.org/compatiblelicenses, затверджену Creative Commons як еквівалентну цій Публічній ліцензії. + + d. Авторське право та подібні права означають авторське право та/або подібні права, тісно пов’язані з авторським правом, включаючи, але не обмежуючись, права на виконання, трансляцію, звуковий запис та sui generis права на бази даних, незалежно від того, як ці права позначені чи класифіковані. Для цілей цієї Публічної ліцензії права, зазначені в Розділі 2(b)(1)-(2), не є Авторським правом та подібними правами. + + e. Ефективні технологічні заходи означають ті заходи, які, за відсутності належного дозволу, не можуть бути обійдені відповідно до законів, що виконують зобов’язання за статтею 11 Договору ВОІВ про авторське право, прийнятого 20 грудня 1996 року, та/або подібних міжнародних угод. + + f. Винятки та обмеження означають добросовісне використання, добросовісну практику та/або будь-які інші винятки чи обмеження авторського права та подібних прав, які застосовуються до Вашого використання Ліцензованого Матеріалу. + + g. Елементи ліцензії означають атрибути ліцензії, зазначені в назві Публічної ліцензії Creative Commons. Елементи ліцензії цієї Публічної ліцензії — це Атрибуція та Поширення на тих самих умовах. + + h. Ліцензований Матеріал означає художній або літературний твір, базу даних або інший матеріал, до якого Ліцензіар застосував цю Публічну ліцензію. + + i. Ліцензовані Права означають права, надані Вам відповідно до умов цієї Публічної ліцензії, які обмежуються всіма Авторськими правами та подібними правами, що застосовуються до Вашого використання Ліцензованого Матеріалу і які Ліцензіар має право ліцензувати. + + j. Ліцензіар означає фізичну(их) або юридичну(их) особу(осіб), яка надає права за цією Публічною ліцензією. + + k. Поширювати означає надавати матеріал публіці будь-яким способом або процесом, що вимагає дозволу відповідно до Ліцензованих Прав, таких як відтворення, публічний показ, публічне виконання, розповсюдження, передача, комунікація або імпорт, а також робити матеріал доступним для публіки, включаючи способи, за допомогою яких члени публіки можуть отримати доступ до матеріалу з обраного ними місця та в обраний час. + + l. Sui Generis права на бази даних означають права, відмінні від авторського права, що виникають у результаті Директиви 96/9/ЄС Європейського парламенту та Ради від 11 березня 1996 року про правовий захист баз даних, з поправками та/або наступними змінами, а також інші еквівалентні права в будь-якій точці світу. + + m. Ви означає фізичну або юридичну особу, яка використовує Ліцензовані Права за цією Публічною ліцензією. Ваш має відповідне значення. +Права, а також база даних, у якій Ви маєте права sui generis на базу даних (але не на її окремі елементи), є адаптованим матеріалом, + +включаючи для цілей Розділу 3(b); і +c. Ви повинні дотримуватися умов Розділу 3(a), якщо Ви поширюєте всю або значну частину вмісту бази даних. + +Для уникнення непорозумінь, цей Розділ 4 доповнює і не замінює Ваші зобов’язання за цією Публічною Ліцензією, якщо Ліцензовані Права включають інші авторські права та подібні права. + +--- + +Розділ 5 — Відмова від гарантій та обмеження відповідальності. + +a. ЯКЩО ІНШЕ НЕ ПЕРЕДБАЧЕНО ЛІЦЕНЗІАРОМ ОКРЕМО, НАСКІЛЬКИ ЦЕ МОЖЛИВО, ЛІЦЕНЗІАР НАДАЄ ЛІЦЕНЗОВАНИЙ МАТЕРІАЛ "ЯК Є" І "ЯК ДОСТУПНО", І НЕ НАДАЄ ЖОДНИХ ЗАЯВ АБО ГАРАНТІЙ ЩОДО ЛІЦЕНЗОВАНОГО МАТЕРІАЛУ, ЧИ ТО ЯВНИХ, ЧИ ТО НЕЯВНИХ, СТАТУТНИХ АБО ІНШИХ. ЦЕ ВКЛЮЧАЄ, БЕЗ ОБМЕЖЕНЬ, ГАРАНТІЇ ПРАВА ВЛАСНОСТІ, ПРИДАТНОСТІ ДЛЯ ПРОДАЖУ, ПРИДАТНОСТІ ДЛЯ ПЕВНОЇ МЕТИ, ВІДСУТНОСТІ ПОРУШЕНЬ, ВІДСУТНОСТІ ПРИХОВАНИХ АБО ІНШИХ ДЕФЕКТІВ, ТОЧНОСТІ АБО НАЯВНОСТІ ЧИ ВІДСУТНОСТІ ПОМИЛОК, НЕЗАЛЕЖНО ВІД ТОГО, ЧИ ВІДОМІ ВОНИ АБО МОЖУТЬ БУТИ ВИЯВЛЕНІ. ДЕ ВІДМОВА ВІД ГАРАНТІЙ НЕ ДОЗВОЛЕНА ПОВНІСТЮ АБО ЧАСТКОВО, ЦЯ ВІДМОВА МОЖЕ НЕ ЗАСТОСОВУВАТИСЯ ДО ВАС. + +b. НАСКІЛЬКИ ЦЕ МОЖЛИВО, ЛІЦЕНЗІАР НІ ЗА ЯКИХ ОБСТАВИН НЕ НЕСЕ ВІДПОВІДАЛЬНОСТІ ПЕРЕД ВАМИ ЗА ЖОДНОЮ ЮРИДИЧНОЮ ТЕОРІЄЮ (ВКЛЮЧАЮЧИ, БЕЗ ОБМЕЖЕНЬ, НЕДБАЛІСТЬ) АБО ІНШИМИ ЗА БУДЬ-ЯКІ ПРЯМІ, ОСОБЛИВІ, НЕПРЯМІ, ВИПАДКОВІ, ПОБІЧНІ, ШТРАФНІ, ПРИКЛАДНІ АБО ІНШІ ЗБИТКИ, ВИТРАТИ, ВИТРАТИ АБО ШКОДУ, ЩО ВИНИКАЮТЬ У ЗВ’ЯЗКУ З ЦІЄЮ ПУБЛІЧНОЮ ЛІЦЕНЗІЄЮ АБО ВИКОРИСТАННЯМ ЛІЦЕНЗОВАНОГО МАТЕРІАЛУ, НАВІТЬ ЯКЩО ЛІЦЕНЗІАР БУВ ПОПЕРЕДЖЕНИЙ ПРО МОЖЛИВІСТЬ ТАКИХ ЗБИТКІВ, ВИТРАТ, ВИТРАТ АБО ШКОДИ. ДЕ ОБМЕЖЕННЯ ВІДПОВІДАЛЬНОСТІ НЕ ДОЗВОЛЕНЕ ПОВНІСТЮ АБО ЧАСТКОВО, ЦЕ ОБМЕЖЕННЯ МОЖЕ НЕ ЗАСТОСОВУВАТИСЯ ДО ВАС. + +c. Відмова від гарантій та обмеження відповідальності, зазначені вище, повинні тлумачитися таким чином, щоб, наскільки це можливо, максимально наближатися до абсолютної відмови та відмови від усієї відповідальності. + +--- + +Розділ 6 — Термін дії та припинення. + +a. Ця Публічна Ліцензія діє протягом терміну дії авторських прав та подібних прав, ліцензованих тут. Однак, якщо Ви не дотримуєтеся цієї Публічної Ліцензії, Ваші права за цією Публічною Ліцензією автоматично припиняються. + +b. Якщо Ваше право використовувати Ліцензований Матеріал було припинено відповідно до Розділу 6(a), воно відновлюється: + +1. автоматично з дати усунення порушення, за умови, що це порушення усунуто протягом 30 днів з моменту його виявлення; або +2. за явним відновленням Ліцензіаром. + +Для уникнення непорозумінь, цей Розділ 6(b) не впливає на будь-яке право Ліцензіара вимагати відшкодування за Ваші порушення цієї Публічної Ліцензії. + +c. Для уникнення непорозумінь, Ліцензіар також може пропонувати Ліцензований Матеріал на інших умовах або припинити його розповсюдження в будь-який час; однак це не припиняє дію цієї Публічної Ліцензії. + +d. Розділи 1, 5, 6, 7 і 8 залишаються чинними після припинення дії цієї Публічної Ліцензії. + +--- + +Розділ 7 — Інші умови. + +a. Ліцензіар не зобов’язаний дотримуватися будь-яких додаткових або відмінних умов, повідомлених Вами, якщо вони не були явно погоджені. + +b. Будь-які домовленості, розуміння або угоди щодо Ліцензованого Матеріалу, не зазначені тут, є окремими та незалежними від умов цієї Публічної Ліцензії. + +--- + +Розділ 8 — Тлумачення. + +a. Для уникнення непорозумінь, ця Публічна Ліцензія не зменшує, не обмежує, не накладає умов або не накладає обмежень на будь-яке використання Ліцензованого Матеріалу, яке може бути законно здійснене без дозволу за цією Публічною Ліцензією. + +b. Наскільки це можливо, якщо будь-яке положення цієї Публічної Ліцензії вважається таким, що не може бути виконаним, воно автоматично реформується до мінімального ступеня, необхідного для його виконання. Якщо положення не може бути реформоване, воно відокремлюється від цієї Публічної Ліцензії без впливу на виконання інших умов. + +c. Жодна умова цієї Публічної Ліцензії не буде відмовлена, і жодне недотримання не буде погоджене, якщо це не було явно погоджено Ліцензіаром. + +d. Ніщо в цій Публічній Ліцензії не становить або не може бути витлумачено як обмеження або відмова від будь-яких привілеїв та імунітетів, які застосовуються до Ліцензіара або Вас, включаючи юридичні процеси будь-якої юрисдикції або органу. + +--- + +======================================================================= + +Creative Commons не є стороною своїх публічних ліцензій. Незважаючи на це, Creative Commons може обрати застосування однієї зі своїх публічних ліцензій до матеріалу, який вона публікує, і в таких випадках буде вважатися "Ліцензіаром". Текст публічних ліцензій Creative Commons присвячений суспільному надбанню відповідно до CC0 Public Domain Dedication. За винятком обмеженої мети вказівки на те, що матеріал поширюється за публічною ліцензією Creative Commons або як це дозволено політиками Creative Commons, опублікованими на creativecommons.org/policies, Creative Commons не дозволяє використання торгової марки "Creative Commons" або будь-якої іншої торгової марки чи логотипу Creative Commons без попередньої письмової згоди, включаючи, без обмежень, у зв’язку з будь-якими несанкціонованими змінами до будь-якої з її публічних ліцензій або будь-якими іншими домовленостями, розуміннями або угодами щодо використання ліцензованого матеріалу. Для уникнення непорозумінь, цей абзац не є частиною публічних ліцензій. + +Creative Commons можна зв’язатися за адресою creativecommons.org. + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/sketchnotes/README.md b/translations/uk/sketchnotes/README.md new file mode 100644 index 00000000..26b86aba --- /dev/null +++ b/translations/uk/sketchnotes/README.md @@ -0,0 +1,21 @@ + +Усі скетчноти навчальної програми можна завантажити тут. + +🖨 Для друку у високій роздільній здатності доступні версії у форматі TIFF у [цьому репозиторії](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff). + +🎨 Створено: [Томомі Імура](https://github.com/girliemac) (Twitter: [@girlie_mac](https://twitter.com/girlie_mac)) + +[![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-sa/4.0/) + +--- + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file