Merge pull request #857 from microsoft/update-translations
🌐 Update translations via Co-op Translator
pull/858/head
commit
cd6b707404
@ -0,0 +1,159 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "69389392fa6346e0dfa30f664b7b6fec",
|
||||||
|
"translation_date": "2025-09-05T12:47:19+00:00",
|
||||||
|
"source_file": "1-Introduction/1-intro-to-ML/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# Uvod u strojno učenje
|
||||||
|
|
||||||
|
## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[](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).
|
||||||
|
|
||||||
|
[](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
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 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
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 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.
|
@ -0,0 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "4c4698044bb8af52cfb6388a4ee0e53b",
|
||||||
|
"translation_date": "2025-09-05T12:50:27+00:00",
|
||||||
|
"source_file": "1-Introduction/1-intro-to-ML/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,164 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "6a05fec147e734c3e6bfa54505648e2b",
|
||||||
|
"translation_date": "2025-09-05T12:52:20+00:00",
|
||||||
|
"source_file": "1-Introduction/2-history-of-ML/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# Povijest strojnog učenja
|
||||||
|
|
||||||
|

|
||||||
|
> Sketchnote autorice [Tomomi Imura](https://www.twitter.com/girlie_mac)
|
||||||
|
|
||||||
|
## [Kviz prije predavanja](https://ff-quizzes.netlify.app/en/ml/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[](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 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.
|
||||||
|
|
||||||
|

|
||||||
|
> 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.
|
||||||
|
|
||||||
|
[](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.
|
||||||
|
|
||||||
|
[](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)
|
||||||
|
|
||||||
|
[](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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "eb6e4d5afd1b21a57d2b9e6d0aac3969",
|
||||||
|
"translation_date": "2025-09-05T12:55:53+00:00",
|
||||||
|
"source_file": "1-Introduction/2-history-of-ML/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "dbda60e7b1fe5f18974e7858eff0004e",
|
||||||
|
"translation_date": "2025-09-05T12:41:59+00:00",
|
||||||
|
"source_file": "1-Introduction/3-fairness/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,132 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "9d91f3af3758fdd4569fb410575995ef",
|
||||||
|
"translation_date": "2025-09-05T12:43:14+00:00",
|
||||||
|
"source_file": "1-Introduction/4-techniques-of-ML/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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/)
|
||||||
|
|
||||||
|
[](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'.
|
||||||
|
|
||||||
|

|
||||||
|
> 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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "70d65aeddc06170bc1aed5b27805f930",
|
||||||
|
"translation_date": "2025-09-05T12:46:13+00:00",
|
||||||
|
"source_file": "1-Introduction/4-techniques-of-ML/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,37 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "cf8ecc83f28e5b98051d2179eca08e08",
|
||||||
|
"translation_date": "2025-09-05T12:34:58+00:00",
|
||||||
|
"source_file": "1-Introduction/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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!
|
||||||
|
|
||||||
|

|
||||||
|
> Fotografija autora <a href="https://unsplash.com/@bill_oxford?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Bill Oxford</a> na <a href="https://unsplash.com/s/photos/globe?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
|
||||||
|
|
||||||
|
### 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.
|
@ -0,0 +1,238 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "fa81d226c71d5af7a2cade31c1c92b88",
|
||||||
|
"translation_date": "2025-09-05T11:40:33+00:00",
|
||||||
|
"source_file": "2-Regression/1-Tools/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# Početak rada s Pythonom i Scikit-learn za regresijske modele
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 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
|
||||||
|
|
||||||
|
[](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)
|
||||||
|
>
|
||||||
|
> [](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.
|
||||||
|
|
||||||
|
[](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
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
[](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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
✅ 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.
|
@ -0,0 +1,27 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "74a5cf83e4ebc302afbcbc4f418afd0a",
|
||||||
|
"translation_date": "2025-09-05T11:44:06+00:00",
|
||||||
|
"source_file": "2-Regression/1-Tools/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T11:44:43+00:00",
|
||||||
|
"source_file": "2-Regression/1-Tools/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,226 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "7c077988328ebfe33b24d07945f16eca",
|
||||||
|
"translation_date": "2025-09-05T11:45:44+00:00",
|
||||||
|
"source_file": "2-Regression/2-Data/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# Izgradnja regresijskog modela pomoću Scikit-learn: priprema i vizualizacija podataka
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
[](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.
|
||||||
|
|
||||||
|
[](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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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")
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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.
|
@ -0,0 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "4485a1ed4dd1b5647365e3d87456515d",
|
||||||
|
"translation_date": "2025-09-05T11:48:51+00:00",
|
||||||
|
"source_file": "2-Regression/2-Data/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T11:49:20+00:00",
|
||||||
|
"source_file": "2-Regression/2-Data/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "cc471fa89c293bc735dd3a9a0fb79b1b",
|
||||||
|
"translation_date": "2025-09-05T11:32:18+00:00",
|
||||||
|
"source_file": "2-Regression/3-Linear/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T11:32:53+00:00",
|
||||||
|
"source_file": "2-Regression/3-Linear/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,410 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "abf86d845c84330bce205a46b382ec88",
|
||||||
|
"translation_date": "2025-09-05T11:34:39+00:00",
|
||||||
|
"source_file": "2-Regression/4-Logistic/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# Logistička regresija za predviđanje kategorija
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## [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.
|
||||||
|
|
||||||
|
[](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_.
|
||||||
|
|
||||||
|

|
||||||
|
> 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).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 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.
|
||||||
|
|
||||||
|
[](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,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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}")
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 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)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
**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:
|
||||||
|
>
|
||||||
|
> 
|
||||||
|
>
|
||||||
|
> 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.
|
||||||
|
|
||||||
|
[](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
|
||||||
|
|
||||||
|
[](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:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "8af40209a41494068c1f42b14c0b450d",
|
||||||
|
"translation_date": "2025-09-05T11:38:59+00:00",
|
||||||
|
"source_file": "2-Regression/4-Logistic/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T11:39:28+00:00",
|
||||||
|
"source_file": "2-Regression/4-Logistic/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,54 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "508582278dbb8edd2a8a80ac96ef416c",
|
||||||
|
"translation_date": "2025-09-05T11:25:09+00:00",
|
||||||
|
"source_file": "2-Regression/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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!
|
||||||
|
|
||||||
|

|
||||||
|
> Fotografija: <a href="https://unsplash.com/@teutschmann?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Beth Teutschmann</a> na <a href="https://unsplash.com/s/photos/jack-o-lanterns?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
|
||||||
|
|
||||||
|
## Što ćete naučiti
|
||||||
|
|
||||||
|
[](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.
|
||||||
|
|
||||||
|
[](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.
|
@ -0,0 +1,359 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "e0b75f73e4a90d45181dc5581fe2ef5c",
|
||||||
|
"translation_date": "2025-09-05T12:58:07+00:00",
|
||||||
|
"source_file": "3-Web-App/1-Web-App/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>🛸 UFO Appearance Prediction! 👽</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="grid">
|
||||||
|
|
||||||
|
<div class="box">
|
||||||
|
|
||||||
|
<p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p>
|
||||||
|
|
||||||
|
<form action="{{ url_for('predict')}}" method="post">
|
||||||
|
<input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" />
|
||||||
|
<input type="text" name="latitude" placeholder="Latitude" required="required" />
|
||||||
|
<input type="text" name="longitude" placeholder="Longitude" required="required" />
|
||||||
|
<button type="submit" class="btn">Predict country where the UFO is seen</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<p>{{ prediction_text }}</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a8e8ae10be335cbc745b75ee552317ff",
|
||||||
|
"translation_date": "2025-09-05T13:01:12+00:00",
|
||||||
|
"source_file": "3-Web-App/1-Web-App/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,35 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "9836ff53cfef716ddfd70e06c5f43436",
|
||||||
|
"translation_date": "2025-09-05T12:56:35+00:00",
|
||||||
|
"source_file": "3-Web-App/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Fotografija autora <a href="https://unsplash.com/@mdherren?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Michael Herren</a> na <a href="https://unsplash.com/s/photos/ufo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
|
||||||
|
|
||||||
|
## 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.
|
@ -0,0 +1,313 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "aaf391d922bd6de5efba871d514c6d47",
|
||||||
|
"translation_date": "2025-09-05T13:17:37+00:00",
|
||||||
|
"source_file": "4-Classification/1-Introduction/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 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_.
|
||||||
|
|
||||||
|
[](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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 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?
|
||||||
|
|
||||||
|
[](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
|
||||||
|
<class 'pandas.core.frame.DataFrame'>
|
||||||
|
RangeIndex: 2448 entries, 0 to 2447
|
||||||
|
Columns: 385 entries, Unnamed: 0 to zucchini
|
||||||
|
dtypes: int64(384), object(1)
|
||||||
|
memory usage: 7.2+ MB
|
||||||
|
```
|
||||||
|
|
||||||
|
## 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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
1. Učinite isto za japanske podatke:
|
||||||
|
|
||||||
|
```python
|
||||||
|
japanese_ingredient_df = create_ingredient_df(japanese_df)
|
||||||
|
japanese_ingredient_df.head(10).plot.barh()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
1. Sada za kineske sastojke:
|
||||||
|
|
||||||
|
```python
|
||||||
|
chinese_ingredient_df = create_ingredient_df(chinese_df)
|
||||||
|
chinese_ingredient_df.head(10).plot.barh()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
1. Prikažite indijske sastojke:
|
||||||
|
|
||||||
|
```python
|
||||||
|
indian_ingredient_df = create_ingredient_df(indian_df)
|
||||||
|
indian_ingredient_df.head(10).plot.barh()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
1. Na kraju, prikažite korejske sastojke:
|
||||||
|
|
||||||
|
```python
|
||||||
|
korean_ingredient_df = create_ingredient_df(korean_df)
|
||||||
|
korean_ingredient_df.head(10).plot.barh()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "b2a01912beb24cfb0007f83594dba801",
|
||||||
|
"translation_date": "2025-09-05T13:20:29+00:00",
|
||||||
|
"source_file": "4-Classification/1-Introduction/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T13:21:15+00:00",
|
||||||
|
"source_file": "4-Classification/1-Introduction/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "de6025f96841498b0577e9d1aee18d1f",
|
||||||
|
"translation_date": "2025-09-05T13:08:42+00:00",
|
||||||
|
"source_file": "4-Classification/2-Classifiers-1/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T13:09:40+00:00",
|
||||||
|
"source_file": "4-Classification/2-Classifiers-1/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,249 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "49047911108adc49d605cddfb455749c",
|
||||||
|
"translation_date": "2025-09-05T13:14:16+00:00",
|
||||||
|
"source_file": "4-Classification/3-Classifiers-2/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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):
|
||||||
|
|
||||||
|

|
||||||
|
> 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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "58dfdaf79fb73f7d34b22bdbacf57329",
|
||||||
|
"translation_date": "2025-09-05T13:16:02+00:00",
|
||||||
|
"source_file": "4-Classification/3-Classifiers-2/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T13:16:42+00:00",
|
||||||
|
"source_file": "4-Classification/3-Classifiers-2/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,329 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "61bdec27ed2da8b098cd9065405d9bb0",
|
||||||
|
"translation_date": "2025-09-05T13:10:42+00:00",
|
||||||
|
"source_file": "4-Classification/4-Applied/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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!
|
||||||
|
|
||||||
|
[](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 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
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<header>
|
||||||
|
<title>Cuisine Matcher</title>
|
||||||
|
</header>
|
||||||
|
<body>
|
||||||
|
...
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Sada, radeći unutar oznaka `body`, dodajte malo markupa za prikaz popisa checkboxova koji odražavaju neke sastojke:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<h1>Check your refrigerator. What can you create?</h1>
|
||||||
|
<div id="wrapper">
|
||||||
|
<div class="boxCont">
|
||||||
|
<input type="checkbox" value="4" class="checkbox">
|
||||||
|
<label>apple</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="boxCont">
|
||||||
|
<input type="checkbox" value="247" class="checkbox">
|
||||||
|
<label>pear</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="boxCont">
|
||||||
|
<input type="checkbox" value="77" class="checkbox">
|
||||||
|
<label>cherry</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="boxCont">
|
||||||
|
<input type="checkbox" value="126" class="checkbox">
|
||||||
|
<label>fenugreek</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="boxCont">
|
||||||
|
<input type="checkbox" value="302" class="checkbox">
|
||||||
|
<label>sake</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="boxCont">
|
||||||
|
<input type="checkbox" value="327" class="checkbox">
|
||||||
|
<label>soy sauce</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="boxCont">
|
||||||
|
<input type="checkbox" value="112" class="checkbox">
|
||||||
|
<label>cumin</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="padding-top:10px">
|
||||||
|
<button onClick="startInference()">What kind of cuisine can you make?</button>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
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 `</div>`.
|
||||||
|
|
||||||
|
1. Prvo, uvezite [Onnx Runtime](https://www.onnxruntime.ai/):
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.9.0/dist/ort.min.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
> Onnx Runtime 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
|
||||||
|
<script>
|
||||||
|
const ingredients = Array(380).fill(0);
|
||||||
|
|
||||||
|
const checks = [...document.querySelectorAll('.checkbox')];
|
||||||
|
|
||||||
|
checks.forEach(check => {
|
||||||
|
check.addEventListener('change', function() {
|
||||||
|
// toggle the state of the ingredient
|
||||||
|
// based on the checkbox's value (1 or 0)
|
||||||
|
ingredients[check.value] = check.checked ? 1 : 0;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function testCheckboxes() {
|
||||||
|
// validate if at least one checkbox is checked
|
||||||
|
return checks.some(check => check.checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function startInference() {
|
||||||
|
|
||||||
|
let atLeastOneChecked = testCheckboxes()
|
||||||
|
|
||||||
|
if (!atLeastOneChecked) {
|
||||||
|
alert('Please select at least one ingredient.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// create a new session and load the model.
|
||||||
|
|
||||||
|
const session = await ort.InferenceSession.create('./model.onnx');
|
||||||
|
|
||||||
|
const input = new ort.Tensor(new Float32Array(ingredients), [1, 380]);
|
||||||
|
const feeds = { float_input: input };
|
||||||
|
|
||||||
|
// feed inputs and run
|
||||||
|
const results = await session.run(feeds);
|
||||||
|
|
||||||
|
// read from results
|
||||||
|
alert('You can enjoy ' + results.label.data[0] + ' cuisine today!')
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
console.log(`failed to inference ONNX model`);
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Č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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "799ed651e2af0a7cad17c6268db11578",
|
||||||
|
"translation_date": "2025-09-05T13:13:17+00:00",
|
||||||
|
"source_file": "4-Classification/4-Applied/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,41 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "74e809ffd1e613a1058bbc3e9600859e",
|
||||||
|
"translation_date": "2025-09-05T13:03:07+00:00",
|
||||||
|
"source_file": "4-Classification/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
||||||
|
|
||||||
|

|
||||||
|
> Fotografija autora <a href="https://unsplash.com/@changlisheng?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Lisheng Chang</a> na <a href="https://unsplash.com/s/photos/asian-food?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
|
||||||
|
|
||||||
|
## Š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.
|
@ -0,0 +1,347 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "730225ea274c9174fe688b21d421539d",
|
||||||
|
"translation_date": "2025-09-05T12:10:57+00:00",
|
||||||
|
"source_file": "5-Clustering/1-Visualize/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
[](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.
|
||||||
|
|
||||||
|
[](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 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 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 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
|
||||||
|
<class 'pandas.core.frame.DataFrame'>
|
||||||
|
RangeIndex: 530 entries, 0 to 529
|
||||||
|
Data columns (total 16 columns):
|
||||||
|
# Column Non-Null Count Dtype
|
||||||
|
--- ------ -------------- -----
|
||||||
|
0 name 530 non-null object
|
||||||
|
1 album 530 non-null object
|
||||||
|
2 artist 530 non-null object
|
||||||
|
3 artist_top_genre 530 non-null object
|
||||||
|
4 release_date 530 non-null int64
|
||||||
|
5 length 530 non-null int64
|
||||||
|
6 popularity 530 non-null int64
|
||||||
|
7 danceability 530 non-null float64
|
||||||
|
8 acousticness 530 non-null float64
|
||||||
|
9 energy 530 non-null float64
|
||||||
|
10 instrumentalness 530 non-null float64
|
||||||
|
11 liveness 530 non-null float64
|
||||||
|
12 loudness 530 non-null float64
|
||||||
|
13 speechiness 530 non-null float64
|
||||||
|
14 tempo 530 non-null float64
|
||||||
|
15 time_signature 530 non-null int64
|
||||||
|
dtypes: float64(8), int64(4), object(4)
|
||||||
|
memory usage: 66.4+ KB
|
||||||
|
```
|
||||||
|
|
||||||
|
1. 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')
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
✅ 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:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "589fa015a5e7d9e67bd629f7d47b53de",
|
||||||
|
"translation_date": "2025-09-05T12:17:14+00:00",
|
||||||
|
"source_file": "5-Clustering/1-Visualize/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T12:17:52+00:00",
|
||||||
|
"source_file": "5-Clustering/1-Visualize/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,261 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "7cdd17338d9bbd7e2171c2cd462eb081",
|
||||||
|
"translation_date": "2025-09-05T12:18:40+00:00",
|
||||||
|
"source_file": "5-Clustering/2-K-Means/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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':
|
||||||
|
|
||||||
|

|
||||||
|
> 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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "b8e17eff34ad1680eba2a5d3cf9ffc41",
|
||||||
|
"translation_date": "2025-09-05T12:21:04+00:00",
|
||||||
|
"source_file": "5-Clustering/2-K-Means/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T12:21:39+00:00",
|
||||||
|
"source_file": "5-Clustering/2-K-Means/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,42 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "b28a3a4911584062772c537b653ebbc7",
|
||||||
|
"translation_date": "2025-09-05T12:08:35+00:00",
|
||||||
|
"source_file": "5-Clustering/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> Fotografija autora <a href="https://unsplash.com/@marcelalaskoski?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Marcela Laskoski</a> na <a href="https://unsplash.com/s/photos/nigerian-music?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
|
||||||
|
|
||||||
|
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.
|
@ -0,0 +1,179 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "1c2ec40cf55c98a028a359c27ef7e45a",
|
||||||
|
"translation_date": "2025-09-05T14:09:37+00:00",
|
||||||
|
"source_file": "6-NLP/1-Introduction-to-NLP/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
||||||
|
|
||||||
|

|
||||||
|
> 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** <u>tužan</u>", mogla bi preurediti i zamijeniti riječi u rečenici kako bi formirala odgovor "Koliko dugo ste **vi bili** <u>tužni</u>".
|
||||||
|
|
||||||
|
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** <u>bicikl</u>", mogla bi odgovoriti s "Koliko dugo sam **ja bio** <u>bicikl</u>?", umjesto razumnijeg odgovora.
|
||||||
|
|
||||||
|
[](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 = <https://plato.stanford.edu/archives/spr2020/entries/computational-linguistics/>.
|
||||||
|
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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "1d7583e8046dacbb0c056d5ba0a71b16",
|
||||||
|
"translation_date": "2025-09-05T14:12:54+00:00",
|
||||||
|
"source_file": "6-NLP/1-Introduction-to-NLP/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,224 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "5f3cb462e3122e1afe7ab0050ccf2bd3",
|
||||||
|
"translation_date": "2025-09-05T13:54:13+00:00",
|
||||||
|
"source_file": "6-NLP/2-Tasks/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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 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.
|
||||||
|
|
||||||
|

|
||||||
|
> "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 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. <u>**brza crvena lisica**</u> skočila je preko lijenog smeđeg psa
|
||||||
|
2. brza **<u>crvena lisica skočila</u>** je preko lijenog smeđeg psa
|
||||||
|
3. brza crvena **<u>lisica skočila preko</u>** lijenog smeđeg psa
|
||||||
|
4. brza crvena lisica **<u>skočila preko lijenog</u>** smeđeg psa
|
||||||
|
5. brza crvena lisica skočila **<u>preko lijenog smeđeg</u>** psa
|
||||||
|
6. brza crvena lisica skočila preko <u>**lijenog smeđeg psa**</u>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "2efc4c2aba5ed06c780c05539c492ae3",
|
||||||
|
"translation_date": "2025-09-05T13:57:21+00:00",
|
||||||
|
"source_file": "6-NLP/2-Tasks/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "9d2a734deb904caff310d1a999c6bd7a",
|
||||||
|
"translation_date": "2025-09-05T14:17:33+00:00",
|
||||||
|
"source_file": "6-NLP/3-Translation-Sentiment/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T14:18:26+00:00",
|
||||||
|
"source_file": "6-NLP/3-Translation-Sentiment/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||||
|
"translation_date": "2025-09-05T14:18:07+00:00",
|
||||||
|
"source_file": "6-NLP/3-Translation-Sentiment/solution/R/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
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.
|
@ -0,0 +1,417 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "8d32dadeda93c6fb5c43619854882ab1",
|
||||||
|
"translation_date": "2025-09-05T13:59:21+00:00",
|
||||||
|
"source_file": "6-NLP/4-Hotel-Reviews-1/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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 <br />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.
|
@ -0,0 +1,19 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "bf39bceb833cd628f224941dca8041df",
|
||||||
|
"translation_date": "2025-09-05T14:07:31+00:00",
|
||||||
|
"source_file": "6-NLP/4-Hotel-Reviews-1/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T14:08:17+00:00",
|
||||||
|
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||||
|
"translation_date": "2025-09-05T14:07:58+00:00",
|
||||||
|
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/R/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
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.
|
@ -0,0 +1,389 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "2c742993fe95d5bcbb2846eda3d442a1",
|
||||||
|
"translation_date": "2025-09-05T14:19:41+00:00",
|
||||||
|
"source_file": "6-NLP/5-Hotel-Reviews-2/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "daf144daa552da6a7d442aff6f3e77d8",
|
||||||
|
"translation_date": "2025-09-05T14:26:35+00:00",
|
||||||
|
"source_file": "6-NLP/5-Hotel-Reviews-2/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T14:27:29+00:00",
|
||||||
|
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||||
|
"translation_date": "2025-09-05T14:27:07+00:00",
|
||||||
|
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/R/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "ee0670655c89e4719319764afb113624",
|
||||||
|
"translation_date": "2025-09-05T14:08:38+00:00",
|
||||||
|
"source_file": "6-NLP/data/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
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.
|
@ -0,0 +1,199 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "662b509c39eee205687726636d0a8455",
|
||||||
|
"translation_date": "2025-09-05T11:59:10+00:00",
|
||||||
|
"source_file": "7-TimeSeries/1-Introduction/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# Uvod u predviđanje vremenskih serija
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 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.
|
||||||
|
|
||||||
|
[](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?
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "d1781b0b92568ea1d119d0a198b576b4",
|
||||||
|
"translation_date": "2025-09-05T12:02:56+00:00",
|
||||||
|
"source_file": "7-TimeSeries/1-Introduction/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T12:03:51+00:00",
|
||||||
|
"source_file": "7-TimeSeries/1-Introduction/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||||
|
"translation_date": "2025-09-05T12:03:31+00:00",
|
||||||
|
"source_file": "7-TimeSeries/1-Introduction/solution/R/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
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.
|
@ -0,0 +1,405 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "917dbf890db71a322f306050cb284749",
|
||||||
|
"translation_date": "2025-09-05T11:51:52+00:00",
|
||||||
|
"source_file": "7-TimeSeries/2-ARIMA/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
[](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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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 podaci
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 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](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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
🏆 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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "1c814013e10866dfd92cdb32caaae3ac",
|
||||||
|
"translation_date": "2025-09-05T11:57:03+00:00",
|
||||||
|
"source_file": "7-TimeSeries/2-ARIMA/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T11:58:00+00:00",
|
||||||
|
"source_file": "7-TimeSeries/2-ARIMA/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||||
|
"translation_date": "2025-09-05T11:57:41+00:00",
|
||||||
|
"source_file": "7-TimeSeries/2-ARIMA/solution/R/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
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.
|
@ -0,0 +1,393 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "482bccabe1df958496ea71a3667995cd",
|
||||||
|
"translation_date": "2025-09-05T12:04:47+00:00",
|
||||||
|
"source_file": "7-TimeSeries/3-SVR/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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.
|
@ -0,0 +1,27 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "94aa2fc6154252ae30a3f3740299707a",
|
||||||
|
"translation_date": "2025-09-05T12:07:48+00:00",
|
||||||
|
"source_file": "7-TimeSeries/3-SVR/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,37 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "61342603bad8acadbc6b2e4e3aab3f66",
|
||||||
|
"translation_date": "2025-09-05T11:49:50+00:00",
|
||||||
|
"source_file": "7-TimeSeries/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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.
|
@ -0,0 +1,256 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "911efd5e595089000cb3c16fce1beab8",
|
||||||
|
"translation_date": "2025-09-05T13:35:49+00:00",
|
||||||
|
"source_file": "8-Reinforcement/1-QLearning/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# Uvod u učenje pojačanjem i Q-učenje
|
||||||
|
|
||||||
|

|
||||||
|
> 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.
|
||||||
|
|
||||||
|
[](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:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 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)`.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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.
|
@ -0,0 +1,41 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "68394b2102d3503882e5e914bd0ff5c1",
|
||||||
|
"translation_date": "2025-09-05T13:42:18+00:00",
|
||||||
|
"source_file": "8-Reinforcement/1-QLearning/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T13:44:32+00:00",
|
||||||
|
"source_file": "8-Reinforcement/1-QLearning/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||||
|
"translation_date": "2025-09-05T13:44:12+00:00",
|
||||||
|
"source_file": "8-Reinforcement/1-QLearning/solution/R/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
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.
|
@ -0,0 +1,351 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "107d5bb29da8a562e7ae72262d251a75",
|
||||||
|
"translation_date": "2025-09-05T13:45:45+00:00",
|
||||||
|
"source_file": "8-Reinforcement/2-Gym/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 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:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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()<epsilon:
|
||||||
|
# exploitation - chose the action according to Q-Table probabilities
|
||||||
|
v = probs(np.array(qvalues(s)))
|
||||||
|
a = random.choices(actions,weights=v)[0]
|
||||||
|
else:
|
||||||
|
# exploration - randomly chose the action
|
||||||
|
a = np.random.randint(env.action_space.n)
|
||||||
|
|
||||||
|
obs, rew, done, info = env.step(a)
|
||||||
|
cum_reward+=rew
|
||||||
|
ns = discretize(obs)
|
||||||
|
Q[(s,a)] = (1 - alpha) * Q.get((s,a),0) + alpha * (rew + gamma * max(qvalues(ns)))
|
||||||
|
cum_rewards.append(cum_reward)
|
||||||
|
rewards.append(cum_reward)
|
||||||
|
# == Periodically print results and calculate average reward ==
|
||||||
|
if epoch%5000==0:
|
||||||
|
print(f"{epoch}: {np.average(cum_rewards)}, alpha={alpha}, epsilon={epsilon}")
|
||||||
|
if np.average(cum_rewards) > 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)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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))
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 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:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀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.
|
@ -0,0 +1,57 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "1f2b7441745eb52e25745423b247016b",
|
||||||
|
"translation_date": "2025-09-05T13:50:41+00:00",
|
||||||
|
"source_file": "8-Reinforcement/2-Gym/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
|
||||||
|
"translation_date": "2025-09-05T13:52:14+00:00",
|
||||||
|
"source_file": "8-Reinforcement/2-Gym/solution/Julia/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**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.
|
@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
|
||||||
|
"translation_date": "2025-09-05T13:51:54+00:00",
|
||||||
|
"source_file": "8-Reinforcement/2-Gym/solution/R/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
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.
|
@ -0,0 +1,67 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "20ca019012b1725de956681d036d8b18",
|
||||||
|
"translation_date": "2025-09-05T13:31:55+00:00",
|
||||||
|
"source_file": "8-Reinforcement/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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 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.
|
||||||
|
|
||||||
|
[](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.
|
@ -0,0 +1,159 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "83320d6b6994909e35d830cebf214039",
|
||||||
|
"translation_date": "2025-09-05T12:24:30+00:00",
|
||||||
|
"source_file": "9-Real-World/1-Applications/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# Postscript: Strojno učenje u stvarnom svijetu
|
||||||
|
|
||||||
|

|
||||||
|
> 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.
|
@ -0,0 +1,27 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "fdebfcd0a3f12c9e2b436ded1aa79885",
|
||||||
|
"translation_date": "2025-09-05T12:28:37+00:00",
|
||||||
|
"source_file": "9-Real-World/1-Applications/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "91c6a180ef08e20cc15acfd2d6d6e164",
|
||||||
|
"translation_date": "2025-09-05T12:34:17+00:00",
|
||||||
|
"source_file": "9-Real-World/2-Debugging-ML-Models/assignment.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,32 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "5e069a0ac02a9606a69946c2b3c574a9",
|
||||||
|
"translation_date": "2025-09-05T12:23:03+00:00",
|
||||||
|
"source_file": "9-Real-World/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> Fotografija autora <a href="https://unsplash.com/@childeye?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Alexis Fauvet</a> na <a href="https://unsplash.com/s/photos/artificial-intelligence?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
|
||||||
|
|
||||||
|
## 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.
|
@ -0,0 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "c06b12caf3c901eb3156e3dd5b0aea56",
|
||||||
|
"translation_date": "2025-09-05T11:24:25+00:00",
|
||||||
|
"source_file": "CODE_OF_CONDUCT.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "977ec5266dfd78ad1ce2bd8d46fccbda",
|
||||||
|
"translation_date": "2025-09-05T11:21:41+00:00",
|
||||||
|
"source_file": "CONTRIBUTING.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,178 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "612aef7a03204260e940131b09691977",
|
||||||
|
"translation_date": "2025-09-05T11:16:09+00:00",
|
||||||
|
"source_file": "README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
[](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE)
|
||||||
|
[](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/)
|
||||||
|
[](https://GitHub.com/microsoft/ML-For-Beginners/issues/)
|
||||||
|
[](https://GitHub.com/microsoft/ML-For-Beginners/pulls/)
|
||||||
|
[](http://makeapullrequest.com)
|
||||||
|
|
||||||
|
[](https://GitHub.com/microsoft/ML-For-Beginners/watchers/)
|
||||||
|
[](https://GitHub.com/microsoft/ML-For-Beginners/network/)
|
||||||
|
[](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
|
||||||
|
|
||||||
|
[](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.
|
||||||
|
|
||||||
|
[](https://aka.ms/ml-beginners-videos)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Upoznajte tim
|
||||||
|
|
||||||
|
[](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 |
|
||||||
|
<ul><li>[Python](2-Regression/1-Tools/README.md)</li><li>[R](../../2-Regression/1-Tools/solution/R/lesson_1.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
|
||||||
|
| 06 | Cijene bundeva u Sjevernoj Americi 🎃 | [Regresija](2-Regression/README.md) | Vizualizirajte i očistite podatke u pripremi za strojno učenje | <ul><li>[Python](2-Regression/2-Data/README.md)</li><li>[R](../../2-Regression/2-Data/solution/R/lesson_2.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
|
||||||
|
| 07 | Cijene bundeva u Sjevernoj Americi 🎃 | [Regresija](2-Regression/README.md) | Izradite linearne i polinomne regresijske modele | <ul><li>[Python](2-Regression/3-Linear/README.md)</li><li>[R](../../2-Regression/3-Linear/solution/R/lesson_3.html)</li></ul> | <ul><li>Jen i Dmitry</li><li>Eric Wanjau</li></ul> |
|
||||||
|
| 08 | Cijene bundeva u Sjevernoj Americi 🎃 | [Regresija](2-Regression/README.md) | Izradite logistički regresijski model | <ul><li>[Python](2-Regression/4-Logistic/README.md) </li><li>[R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
|
||||||
|
| 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 | <ul><li> [Python](4-Classification/1-Introduction/README.md) </li><li>[R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) | <ul><li>Jen i Cassie</li><li>Eric Wanjau</li></ul> |
|
||||||
|
| 11 | Ukusna azijska i indijska kuhinja 🍜 | [Klasifikacija](4-Classification/README.md) | Uvod u klasifikatore | <ul><li> [Python](4-Classification/2-Classifiers-1/README.md)</li><li>[R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) | <ul><li>Jen i Cassie</li><li>Eric Wanjau</li></ul> |
|
||||||
|
| 12 | Ukusna azijska i indijska kuhinja 🍜 | [Klasifikacija](4-Classification/README.md) | Više klasifikatora | <ul><li> [Python](4-Classification/3-Classifiers-2/README.md)</li><li>[R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) | <ul><li>Jen i Cassie</li><li>Eric Wanjau</li></ul> |
|
||||||
|
| 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 | <ul><li> [Python](5-Clustering/1-Visualize/README.md)</li><li>[R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
|
||||||
|
| 15 | Istraživanje glazbenih ukusa u Nigeriji 🎧 | [Grupiranje](5-Clustering/README.md) | Istražite metodu grupiranja K-Means | <ul><li> [Python](5-Clustering/2-K-Means/README.md)</li><li>[R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
|
||||||
|
| 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.
|
@ -0,0 +1,51 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "5e1b8da31aae9cca3d53ad243fa3365a",
|
||||||
|
"translation_date": "2025-09-05T11:22:26+00:00",
|
||||||
|
"source_file": "SECURITY.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
## 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.
|
@ -0,0 +1,24 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "872be8bc1b93ef1dd9ac3d6e8f99f6ab",
|
||||||
|
"translation_date": "2025-09-05T11:21:06+00:00",
|
||||||
|
"source_file": "SUPPORT.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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.
|
@ -0,0 +1,57 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "68dd06c685f6ce840e0acfa313352e7c",
|
||||||
|
"translation_date": "2025-09-05T12:22:07+00:00",
|
||||||
|
"source_file": "docs/_sidebar.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
- 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.
|
@ -0,0 +1,37 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "b37de02054fa6c0438ede6fabe1fdfb8",
|
||||||
|
"translation_date": "2025-09-05T11:23:33+00:00",
|
||||||
|
"source_file": "for-teachers.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
## 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.
|
@ -0,0 +1,126 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "6d130dffca5db70d7e615f926cb1ad4c",
|
||||||
|
"translation_date": "2025-09-05T13:01:57+00:00",
|
||||||
|
"source_file": "quiz-app/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# 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-<name>.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.
|
@ -0,0 +1,21 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "a88d5918c1b9da69a40d917a0840c497",
|
||||||
|
"translation_date": "2025-09-05T13:21:37+00:00",
|
||||||
|
"source_file": "sketchnotes/README.md",
|
||||||
|
"language_code": "hr"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
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))
|
||||||
|
|
||||||
|
[](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.
|
@ -0,0 +1,159 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "69389392fa6346e0dfa30f664b7b6fec",
|
||||||
|
"translation_date": "2025-09-05T12:49:34+00:00",
|
||||||
|
"source_file": "1-Introduction/1-intro-to-ML/README.md",
|
||||||
|
"language_code": "my"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# စက်ရုပ်သင်ယူမှုအကြောင်းအရာ
|
||||||
|
|
||||||
|
## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[](https://youtu.be/6mSx_KJxcHI "ML for beginners - စက်ရုပ်သင်ယူမှုအကြောင်းအရာ")
|
||||||
|
|
||||||
|
> 🎥 အပေါ်ရှိပုံကိုနှိပ်ပြီး ဒီသင်ခန်းစာကို လိုက်လံလေ့လာပါ။
|
||||||
|
|
||||||
|
စက်ရုပ်သင်ယူမှုအကြောင်းအရာကို စတင်လေ့လာရန် ဒီသင်ခန်းစာကို ကြိုဆိုပါတယ်။ သင်သည် ဒီအကြောင်းအရာကို လုံးဝအသစ်ဖြစ်စေ၊ ML အတွေ့အကြုံရှိသူဖြစ်စေ၊ ကျွန်ုပ်တို့နှင့်အတူ လေ့လာရန် ဝမ်းသာစွာကြိုဆိုပါတယ်။ ML ကို စတင်လေ့လာရန် သင့်အတွက် သက်တောင့်သက်သာရှိသော အခြေခံနေရာတစ်ခု ဖန်တီးရန် ကျွန်ုပ်တို့ရည်ရွယ်ထားပြီး သင်၏ [အကြံပြုချက်](https://github.com/microsoft/ML-For-Beginners/discussions) ကိုလည်း လက်ခံပြီး တုံ့ပြန်ပေးပါမည်။
|
||||||
|
|
||||||
|
[](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
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 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 တို့၏ ဆက်စပ်မှုကို ပြသထားသော 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) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။
|
@ -0,0 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "4c4698044bb8af52cfb6388a4ee0e53b",
|
||||||
|
"translation_date": "2025-09-05T12:50:50+00:00",
|
||||||
|
"source_file": "1-Introduction/1-intro-to-ML/assignment.md",
|
||||||
|
"language_code": "my"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# စတင်ပြီး အလုပ်လုပ်နိုင်ရန်
|
||||||
|
|
||||||
|
## လမ်းညွှန်ချက်များ
|
||||||
|
|
||||||
|
ဒီအမှတ်မပေးတဲ့အလုပ်မှာ 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) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတရ အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်မှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားယူမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။
|
@ -0,0 +1,140 @@
|
|||||||
|
<!--
|
||||||
|
CO_OP_TRANSLATOR_METADATA:
|
||||||
|
{
|
||||||
|
"original_hash": "6a05fec147e734c3e6bfa54505648e2b",
|
||||||
|
"translation_date": "2025-09-05T12:54:49+00:00",
|
||||||
|
"source_file": "1-Introduction/2-history-of-ML/README.md",
|
||||||
|
"language_code": "my"
|
||||||
|
}
|
||||||
|
-->
|
||||||
|
# စက်ရုပ်သင်ယူမှု၏ သမိုင်းကြောင်း
|
||||||
|
|
||||||
|

|
||||||
|
> Sketchnote by [Tomomi Imura](https://www.twitter.com/girlie_mac)
|
||||||
|
|
||||||
|
## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[](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 in 1972
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
* Eliza သည် စောစောပိုင်း 'chatterbot' တစ်ခုဖြစ်ပြီး လူများနှင့် စကားပြောနိုင်သည်။ ၎င်းသည် primitive 'therapist' အဖြစ် လုပ်ဆောင်နိုင်သည်။ Eliza ကို NLP သင်ခန်းစာများတွင် ပိုမိုလေ့လာရမည်။
|
||||||
|
|
||||||
|

|
||||||
|
> Eliza ၏ version တစ်ခု
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
* "Blocks world" သည် blocks များကို စုစည်းခြင်းနှင့် စီမံခြင်းကို ပြုလုပ်နိုင်သော micro-world တစ်ခုဖြစ်ပြီး စက်များကို ဆုံးဖြတ်ချက်ချရန် သင်ကြားမှုများကို စမ်းသပ်နိုင်သည်။ [SHRDLU](https://wikipedia.org/wiki/SHRDLU) ကဲ့သို့သော library များဖြင့် language processing ကို တိုးတက်စေခဲ့သည်။
|
||||||
|
|
||||||
|
[](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) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း၊ အလိုအလျောက်ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်ရန် လိုအပ်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များ၏ ပရော်ဖက်ရှင်နယ်ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပာယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue