diff --git a/translations/no/1-Introduction/1-intro-to-ML/README.md b/translations/no/1-Introduction/1-intro-to-ML/README.md new file mode 100644 index 000000000..818314455 --- /dev/null +++ b/translations/no/1-Introduction/1-intro-to-ML/README.md @@ -0,0 +1,159 @@ + +# Introduksjon til maskinlæring + +## [Quiz før forelesning](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML for nybegynnere - Introduksjon til maskinlæring for nybegynnere](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "ML for nybegynnere - Introduksjon til maskinlæring for nybegynnere") + +> 🎥 Klikk på bildet over for en kort video som går gjennom denne leksjonen. + +Velkommen til dette kurset om klassisk maskinlæring for nybegynnere! Enten du er helt ny på dette temaet, eller en erfaren ML-praktiker som ønsker å friske opp kunnskapen, er vi glade for å ha deg med! Vi ønsker å skape et vennlig startpunkt for din ML-studie og vil gjerne evaluere, svare på og inkludere din [tilbakemelding](https://github.com/microsoft/ML-For-Beginners/discussions). + +[![Introduksjon til ML](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Introduksjon til ML") + +> 🎥 Klikk på bildet over for en video: MITs John Guttag introduserer maskinlæring + +--- +## Komme i gang med maskinlæring + +Før du starter med dette pensumet, må du ha datamaskinen din satt opp og klar til å kjøre notatbøker lokalt. + +- **Konfigurer maskinen din med disse videoene**. Bruk følgende lenker for å lære [hvordan du installerer Python](https://youtu.be/CXZYvNRIAKM) på systemet ditt og [setter opp en teksteditor](https://youtu.be/EU8eayHWoZg) for utvikling. +- **Lær Python**. Det anbefales også å ha en grunnleggende forståelse av [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), et programmeringsspråk som er nyttig for dataforskere og som vi bruker i dette kurset. +- **Lær Node.js og JavaScript**. Vi bruker også JavaScript noen ganger i dette kurset når vi bygger webapplikasjoner, så du må ha [node](https://nodejs.org) og [npm](https://www.npmjs.com/) installert, samt [Visual Studio Code](https://code.visualstudio.com/) tilgjengelig for både Python- og JavaScript-utvikling. +- **Opprett en GitHub-konto**. Siden du fant oss her på [GitHub](https://github.com), har du kanskje allerede en konto, men hvis ikke, opprett en og deretter fork dette pensumet for å bruke det selv. (Gi oss gjerne en stjerne også 😊) +- **Utforsk Scikit-learn**. Gjør deg kjent med [Scikit-learn](https://scikit-learn.org/stable/user_guide.html), et sett med ML-biblioteker som vi refererer til i disse leksjonene. + +--- +## Hva er maskinlæring? + +Begrepet 'maskinlæring' er et av de mest populære og ofte brukte begrepene i dag. Det er en betydelig sannsynlighet for at du har hørt dette begrepet minst én gang hvis du har en viss kjennskap til teknologi, uansett hvilket felt du jobber i. Mekanismene bak maskinlæring er imidlertid en gåte for de fleste. For en nybegynner innen maskinlæring kan emnet noen ganger føles overveldende. Derfor er det viktig å forstå hva maskinlæring faktisk er, og lære om det steg for steg, gjennom praktiske eksempler. + +--- +## Hypekurven + +![ml hype curve](../../../../1-Introduction/1-intro-to-ML/images/hype.png) + +> Google Trends viser den nylige 'hypekurven' for begrepet 'maskinlæring' + +--- +## Et mystisk univers + +Vi lever i et univers fullt av fascinerende mysterier. Store vitenskapsmenn som Stephen Hawking, Albert Einstein og mange flere har viet sine liv til å søke etter meningsfull informasjon som avdekker mysteriene i verden rundt oss. Dette er den menneskelige tilstanden for læring: et menneskebarn lærer nye ting og avdekker strukturen i sin verden år for år mens de vokser opp. + +--- +## Barnets hjerne + +Et barns hjerne og sanser oppfatter fakta fra omgivelsene og lærer gradvis de skjulte mønstrene i livet som hjelper barnet med å lage logiske regler for å identifisere lærte mønstre. Læringsprosessen til den menneskelige hjernen gjør mennesker til de mest sofistikerte levende skapningene i denne verden. Å lære kontinuerlig ved å oppdage skjulte mønstre og deretter innovere på disse mønstrene gjør oss i stand til å forbedre oss selv gjennom hele livet. Denne læringsevnen og utviklingskapasiteten er knyttet til et konsept kalt [hjernens plastisitet](https://www.simplypsychology.org/brain-plasticity.html). Overfladisk kan vi trekke noen motiverende likheter mellom læringsprosessen til den menneskelige hjernen og konseptene for maskinlæring. + +--- +## Den menneskelige hjernen + +Den [menneskelige hjernen](https://www.livescience.com/29365-human-brain.html) oppfatter ting fra den virkelige verden, behandler den oppfattede informasjonen, tar rasjonelle beslutninger og utfører visse handlinger basert på omstendigheter. Dette kaller vi å oppføre seg intelligent. Når vi programmerer en etterligning av den intelligente atferdsprosessen til en maskin, kalles det kunstig intelligens (AI). + +--- +## Noen begreper + +Selv om begrepene kan forveksles, er maskinlæring (ML) en viktig underkategori av kunstig intelligens. **ML handler om å bruke spesialiserte algoritmer for å avdekke meningsfull informasjon og finne skjulte mønstre fra oppfattet data for å støtte den rasjonelle beslutningsprosessen**. + +--- +## AI, ML, Deep Learning + +![AI, ML, deep learning, data science](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png) + +> Et diagram som viser forholdet mellom AI, ML, deep learning og data science. Infografikk av [Jen Looper](https://twitter.com/jenlooper) inspirert av [denne grafikken](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining) + +--- +## Konsepter vi skal dekke + +I dette pensumet skal vi dekke kun kjernebegrepene innen maskinlæring som en nybegynner må kjenne til. Vi dekker det vi kaller 'klassisk maskinlæring' hovedsakelig ved bruk av Scikit-learn, et utmerket bibliotek mange studenter bruker for å lære det grunnleggende. For å forstå bredere konsepter innen kunstig intelligens eller deep learning, er en sterk grunnleggende kunnskap om maskinlæring uunnværlig, og det ønsker vi å tilby her. + +--- +## I dette kurset vil du lære: + +- kjernebegreper innen maskinlæring +- historien til ML +- ML og rettferdighet +- regresjonsteknikker innen ML +- klassifiseringsteknikker innen ML +- klyngingsteknikker innen ML +- naturlig språkbehandlingsteknikker innen ML +- tidsserieprognoseteknikker innen ML +- forsterkende læring +- virkelige applikasjoner for ML + +--- +## Hva vi ikke vil dekke + +- deep learning +- nevrale nettverk +- AI + +For å gi en bedre læringsopplevelse, vil vi unngå kompleksiteten til nevrale nettverk, 'deep learning' - modellbygging med mange lag ved bruk av nevrale nettverk - og AI, som vi vil diskutere i et annet pensum. Vi vil også tilby et kommende pensum om data science for å fokusere på den delen av dette større feltet. + +--- +## Hvorfor studere maskinlæring? + +Maskinlæring, fra et systemperspektiv, defineres som opprettelsen av automatiserte systemer som kan lære skjulte mønstre fra data for å hjelpe til med å ta intelligente beslutninger. + +Denne motivasjonen er løst inspirert av hvordan den menneskelige hjernen lærer visse ting basert på data den oppfatter fra omverdenen. + +✅ Tenk et øyeblikk på hvorfor en bedrift ville ønske å bruke maskinlæringsstrategier i stedet for å lage en hardkodet regelbasert motor. + +--- +## Applikasjoner av maskinlæring + +Applikasjoner av maskinlæring er nå nesten overalt, og er like utbredt som dataene som flyter rundt i våre samfunn, generert av våre smarttelefoner, tilkoblede enheter og andre systemer. Med tanke på det enorme potensialet til moderne maskinlæringsalgoritmer, har forskere utforsket deres evne til å løse multidimensjonale og tverrfaglige virkelige problemer med svært positive resultater. + +--- +## Eksempler på anvendt ML + +**Du kan bruke maskinlæring på mange måter**: + +- For å forutsi sannsynligheten for sykdom basert på en pasients medisinske historie eller rapporter. +- For å utnytte værdata til å forutsi værhendelser. +- For å forstå sentimentet i en tekst. +- For å oppdage falske nyheter for å stoppe spredningen av propaganda. + +Finans, økonomi, geovitenskap, romutforskning, biomedisinsk ingeniørkunst, kognitiv vitenskap og til og med humanistiske fag har tilpasset maskinlæring for å løse de krevende, databehandlingsintensive problemene i deres felt. + +--- +## Konklusjon + +Maskinlæring automatiserer prosessen med mønsteroppdagelse ved å finne meningsfulle innsikter fra virkelige eller genererte data. Det har vist seg å være svært verdifullt i forretnings-, helse- og finansapplikasjoner, blant andre. + +I nær fremtid vil det å forstå det grunnleggende om maskinlæring bli et must for folk fra alle felt på grunn av dens utbredte adopsjon. + +--- +# 🚀 Utfordring + +Skisser, på papir eller ved bruk av en online app som [Excalidraw](https://excalidraw.com/), din forståelse av forskjellene mellom AI, ML, deep learning og data science. Legg til noen ideer om problemer som hver av disse teknikkene er gode til å løse. + +# [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +--- +# Gjennomgang & Selvstudie + +For å lære mer om hvordan du kan jobbe med ML-algoritmer i skyen, følg denne [Læringsstien](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott). + +Ta en [Læringssti](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) om det grunnleggende innen ML. + +--- +# Oppgave + +[Kom i gang](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/1-Introduction/1-intro-to-ML/assignment.md b/translations/no/1-Introduction/1-intro-to-ML/assignment.md new file mode 100644 index 000000000..df81bae7d --- /dev/null +++ b/translations/no/1-Introduction/1-intro-to-ML/assignment.md @@ -0,0 +1,23 @@ + +# Kom i gang + +## Instruksjoner + +I denne oppgaven uten karakter skal du friske opp Python-kunnskapene dine og sette opp miljøet ditt slik at du kan kjøre notebooks. + +Ta denne [Python-læringsstien](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), og sett opp systemene dine ved å gå gjennom disse introduksjonsvideoene: + +https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6 + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/1-Introduction/2-history-of-ML/README.md b/translations/no/1-Introduction/2-history-of-ML/README.md new file mode 100644 index 000000000..8c47c5c39 --- /dev/null +++ b/translations/no/1-Introduction/2-history-of-ML/README.md @@ -0,0 +1,164 @@ + +# Historien om maskinlæring + +![Oppsummering av historien om maskinlæring i en sketchnote](../../../../sketchnotes/ml-history.png) +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Quiz før forelesning](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML for nybegynnere - Historien om maskinlæring](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "ML for nybegynnere - Historien om maskinlæring") + +> 🎥 Klikk på bildet over for en kort video som går gjennom denne leksjonen. + +I denne leksjonen skal vi gå gjennom de viktigste milepælene i historien om maskinlæring og kunstig intelligens. + +Historien om kunstig intelligens (AI) som et fagfelt er nært knyttet til historien om maskinlæring, ettersom algoritmene og de teknologiske fremskrittene som ligger til grunn for ML har bidratt til utviklingen av AI. Det er nyttig å huske at selv om disse feltene som separate forskningsområder begynte å ta form på 1950-tallet, så fantes det viktige [algoritmiske, statistiske, matematiske, teknologiske og tekniske oppdagelser](https://wikipedia.org/wiki/Timeline_of_machine_learning) som både gikk forut for og overlappet denne perioden. Faktisk har mennesker tenkt på disse spørsmålene i [hundrevis av år](https://wikipedia.org/wiki/History_of_artificial_intelligence): denne artikkelen diskuterer de historiske intellektuelle grunnlagene for ideen om en 'tenkende maskin.' + +--- +## Viktige oppdagelser + +- 1763, 1812 [Bayes' teorem](https://wikipedia.org/wiki/Bayes%27_theorem) og dets forgjengere. Dette teoremet og dets anvendelser ligger til grunn for inferens og beskriver sannsynligheten for at en hendelse inntreffer basert på tidligere kunnskap. +- 1805 [Minste kvadraters metode](https://wikipedia.org/wiki/Least_squares) av den franske matematikeren Adrien-Marie Legendre. Denne teorien, som du vil lære om i vår enhet om regresjon, hjelper med datafitting. +- 1913 [Markov-kjeder](https://wikipedia.org/wiki/Markov_chain), oppkalt etter den russiske matematikeren Andrey Markov, brukes til å beskrive en sekvens av mulige hendelser basert på en tidligere tilstand. +- 1957 [Perceptron](https://wikipedia.org/wiki/Perceptron) er en type lineær klassifikator oppfunnet av den amerikanske psykologen Frank Rosenblatt som ligger til grunn for fremskritt innen dyp læring. + +--- + +- 1967 [Nærmeste nabo](https://wikipedia.org/wiki/Nearest_neighbor) er en algoritme opprinnelig designet for å kartlegge ruter. I en ML-kontekst brukes den til å oppdage mønstre. +- 1970 [Backpropagation](https://wikipedia.org/wiki/Backpropagation) brukes til å trene [feedforward-nevrale nettverk](https://wikipedia.org/wiki/Feedforward_neural_network). +- 1982 [Rekurrente nevrale nettverk](https://wikipedia.org/wiki/Recurrent_neural_network) er kunstige nevrale nettverk avledet fra feedforward-nevrale nettverk som skaper temporale grafer. + +✅ Gjør litt research. Hvilke andre datoer skiller seg ut som avgjørende i historien om ML og AI? + +--- +## 1950: Maskiner som tenker + +Alan Turing, en virkelig bemerkelsesverdig person som ble kåret [av publikum i 2019](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) til den største vitenskapsmannen i det 20. århundre, er kreditert for å ha bidratt til å legge grunnlaget for konseptet om en 'maskin som kan tenke.' Han tok opp kampen med skeptikere og sitt eget behov for empirisk bevis for dette konseptet, blant annet ved å skape [Turing-testen](https://www.bbc.com/news/technology-18475646), som du vil utforske i våre NLP-leksjoner. + +--- +## 1956: Dartmouth Summer Research Project + +"Dartmouth Summer Research Project on artificial intelligence var en banebrytende begivenhet for kunstig intelligens som et fagfelt," og det var her begrepet 'kunstig intelligens' ble introdusert ([kilde](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)). + +> Hvert aspekt av læring eller enhver annen egenskap ved intelligens kan i prinsippet beskrives så presist at en maskin kan lages for å simulere det. + +--- + +Lederforskeren, matematikkprofessor John McCarthy, håpet "å gå videre basert på antagelsen om at hvert aspekt av læring eller enhver annen egenskap ved intelligens kan i prinsippet beskrives så presist at en maskin kan lages for å simulere det." Deltakerne inkluderte en annen pioner innen feltet, Marvin Minsky. + +Workshoppen er kreditert for å ha initiert og oppmuntret til flere diskusjoner, inkludert "fremveksten av symbolske metoder, systemer fokusert på begrensede domener (tidlige ekspert-systemer), og deduktive systemer versus induktive systemer." ([kilde](https://wikipedia.org/wiki/Dartmouth_workshop)). + +--- +## 1956 - 1974: "De gylne årene" + +Fra 1950-tallet til midten av 70-tallet var optimismen høy med håp om at AI kunne løse mange problemer. I 1967 uttalte Marvin Minsky selvsikkert at "Innen en generasjon ... vil problemet med å skape 'kunstig intelligens' i stor grad være løst." (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall) + +Forskning på naturlig språkprosessering blomstret, søk ble raffinert og gjort mer kraftfullt, og konseptet med 'mikroverdener' ble skapt, hvor enkle oppgaver ble utført ved hjelp av instruksjoner i vanlig språk. + +--- + +Forskning ble godt finansiert av statlige organer, fremskritt ble gjort innen beregning og algoritmer, og prototyper av intelligente maskiner ble bygget. Noen av disse maskinene inkluderer: + +* [Shakey-roboten](https://wikipedia.org/wiki/Shakey_the_robot), som kunne manøvrere og bestemme hvordan oppgaver skulle utføres 'intelligent'. + + ![Shakey, en intelligent robot](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg) + > Shakey i 1972 + +--- + +* Eliza, en tidlig 'chatterbot', kunne samtale med mennesker og fungere som en primitiv 'terapeut'. Du vil lære mer om Eliza i NLP-leksjonene. + + ![Eliza, en bot](../../../../1-Introduction/2-history-of-ML/images/eliza.png) + > En versjon av Eliza, en chatbot + +--- + +* "Blocks world" var et eksempel på en mikroverden hvor blokker kunne stables og sorteres, og eksperimenter med å lære maskiner å ta beslutninger kunne testes. Fremskritt bygget med biblioteker som [SHRDLU](https://wikipedia.org/wiki/SHRDLU) hjalp til med å drive språkprosessering fremover. + + [![blocks world med SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "blocks world med SHRDLU") + + > 🎥 Klikk på bildet over for en video: Blocks world med SHRDLU + +--- +## 1974 - 1980: "AI-vinter" + +På midten av 1970-tallet ble det klart at kompleksiteten ved å lage 'intelligente maskiner' hadde blitt undervurdert og at løftene, gitt den tilgjengelige beregningskraften, hadde blitt overdrevet. Finansiering tørket opp, og tilliten til feltet avtok. Noen problemer som påvirket tilliten inkluderte: +--- +- **Begrensninger**. Beregningskraften var for begrenset. +- **Kombinatorisk eksplosjon**. Antallet parametere som måtte trenes vokste eksponentielt etter hvert som mer ble forventet av datamaskiner, uten en parallell utvikling av beregningskraft og kapasitet. +- **Mangel på data**. Det var mangel på data som hindret prosessen med å teste, utvikle og forbedre algoritmer. +- **Spør vi de riktige spørsmålene?**. Selve spørsmålene som ble stilt begynte å bli stilt spørsmål ved. Forskere begynte å møte kritikk for sine tilnærminger: + - Turing-tester ble utfordret, blant annet gjennom 'kinesisk rom-teorien' som hevdet at "programmering av en digital datamaskin kan få den til å fremstå som om den forstår språk, men kunne ikke produsere ekte forståelse." ([kilde](https://plato.stanford.edu/entries/chinese-room/)) + - Etikken ved å introdusere kunstige intelligenser som "terapeuten" ELIZA i samfunnet ble utfordret. + +--- + +Samtidig begynte ulike AI-skoler å dannes. En dikotomi ble etablert mellom ["scruffy" vs. "neat AI"](https://wikipedia.org/wiki/Neats_and_scruffies)-praksiser. _Scruffy_-laboratorier justerte programmer i timevis til de oppnådde ønskede resultater. _Neat_-laboratorier "fokuserte på logikk og formell problemløsning". ELIZA og SHRDLU var velkjente _scruffy_-systemer. På 1980-tallet, da etterspørselen etter å gjøre ML-systemer reproduserbare økte, tok _neat_-tilnærmingen gradvis ledelsen ettersom dens resultater er mer forklarbare. + +--- +## 1980-tallet: Ekspertsystemer + +Etter hvert som feltet vokste, ble dets nytte for næringslivet tydeligere, og på 1980-tallet økte også spredningen av 'ekspertsystemer'. "Ekspertsystemer var blant de første virkelig vellykkede formene for kunstig intelligens (AI)-programvare." ([kilde](https://wikipedia.org/wiki/Expert_system)). + +Denne typen system er faktisk _hybrid_, bestående delvis av en regelmotor som definerer forretningskrav, og en inferensmotor som utnyttet reglesystemet for å utlede nye fakta. + +Denne perioden så også økende oppmerksomhet rettet mot nevrale nettverk. + +--- +## 1987 - 1993: AI 'Chill' + +Spredningen av spesialisert maskinvare for ekspertsystemer hadde den uheldige effekten av å bli for spesialisert. Fremveksten av personlige datamaskiner konkurrerte også med disse store, spesialiserte, sentraliserte systemene. Demokratifiseringen av databehandling hadde begynt, og den banet til slutt vei for den moderne eksplosjonen av big data. + +--- +## 1993 - 2011 + +Denne epoken markerte en ny æra for ML og AI, hvor noen av problemene som tidligere hadde vært forårsaket av mangel på data og beregningskraft kunne løses. Mengden data begynte å øke raskt og bli mer tilgjengelig, på godt og vondt, spesielt med introduksjonen av smarttelefonen rundt 2007. Beregningskraften utvidet seg eksponentielt, og algoritmer utviklet seg parallelt. Feltet begynte å modnes etter hvert som de frie og eksperimentelle dagene fra fortiden begynte å krystallisere seg til en ekte disiplin. + +--- +## Nå + +I dag berører maskinlæring og AI nesten alle deler av livene våre. Denne perioden krever nøye forståelse av risikoene og de potensielle effektene av disse algoritmene på menneskeliv. Som Microsofts Brad Smith har uttalt: "Informasjonsteknologi reiser spørsmål som går til kjernen av grunnleggende menneskerettighetsbeskyttelser som personvern og ytringsfrihet. Disse spørsmålene øker ansvaret for teknologiselskaper som skaper disse produktene. Etter vår mening krever de også gjennomtenkt statlig regulering og utvikling av normer rundt akseptabel bruk" ([kilde](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)). + +--- + +Det gjenstår å se hva fremtiden bringer, men det er viktig å forstå disse datasystemene og programvaren og algoritmene de kjører. Vi håper at dette pensumet vil hjelpe deg med å få en bedre forståelse slik at du kan ta dine egne beslutninger. + +[![Historien om dyp læring](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "Historien om dyp læring") +> 🎥 Klikk på bildet over for en video: Yann LeCun diskuterer historien om dyp læring i denne forelesningen + +--- +## 🚀Utfordring + +Fordyp deg i et av disse historiske øyeblikkene og lær mer om menneskene bak dem. Det finnes fascinerende karakterer, og ingen vitenskapelig oppdagelse ble noen gang skapt i et kulturelt vakuum. Hva oppdager du? + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +--- +## Gjennomgang og selvstudium + +Her er ting du kan se og lytte til: + +[Denne podcasten hvor Amy Boyd diskuterer utviklingen av AI](http://runasradio.com/Shows/Show/739) + +[![Historien om AI av Amy Boyd](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "Historien om AI av Amy Boyd") + +--- + +## Oppgave + +[Lag en tidslinje](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/1-Introduction/2-history-of-ML/assignment.md b/translations/no/1-Introduction/2-history-of-ML/assignment.md new file mode 100644 index 000000000..47d322edc --- /dev/null +++ b/translations/no/1-Introduction/2-history-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Lag en tidslinje + +## Instruksjoner + +Ved å bruke [dette repoet](https://github.com/Digital-Humanities-Toolkit/timeline-builder), lag en tidslinje over et aspekt av historien til algoritmer, matematikk, statistikk, AI eller ML, eller en kombinasjon av disse. Du kan fokusere på én person, én idé, eller en lang tidsperiode med tanker. Sørg for å legge til multimedieelementer. + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | ------------------------------------------------- | -------------------------------------- | --------------------------------------------------------------- | +| | En publisert tidslinje presenteres som en GitHub-side | Koden er ufullstendig og ikke publisert | Tidslinjen er ufullstendig, dårlig undersøkt og ikke publisert | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/1-Introduction/3-fairness/README.md b/translations/no/1-Introduction/3-fairness/README.md new file mode 100644 index 000000000..5ca3fd6c8 --- /dev/null +++ b/translations/no/1-Introduction/3-fairness/README.md @@ -0,0 +1,171 @@ + +# Bygge maskinlæringsløsninger med ansvarlig AI + +![Oppsummering av ansvarlig AI i maskinlæring i en sketchnote](../../../../sketchnotes/ml-fairness.png) +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Quiz før forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Introduksjon + +I dette kurset vil du begynne å utforske hvordan maskinlæring påvirker våre daglige liv. Allerede nå er systemer og modeller involvert i beslutningsprosesser som helsevesendiagnoser, lånesøknader eller oppdagelse av svindel. Derfor er det viktig at disse modellene fungerer godt og gir pålitelige resultater. Akkurat som med andre programvareapplikasjoner, kan AI-systemer feile eller gi uønskede utfall. Derfor er det avgjørende å kunne forstå og forklare oppførselen til en AI-modell. + +Tenk på hva som kan skje hvis dataene du bruker til å bygge disse modellene mangler visse demografiske grupper, som rase, kjønn, politisk syn eller religion, eller hvis de overrepresenterer visse grupper. Hva skjer hvis modellens resultater tolkes til å favorisere en bestemt gruppe? Hva er konsekvensene for applikasjonen? Og hva skjer hvis modellen gir et skadelig utfall? Hvem er ansvarlig for oppførselen til AI-systemet? Dette er noen av spørsmålene vi vil utforske i dette kurset. + +I denne leksjonen vil du: + +- Øke bevisstheten om viktigheten av rettferdighet i maskinlæring og skader relatert til urettferdighet. +- Bli kjent med praksisen med å utforske avvik og uvanlige scenarier for å sikre pålitelighet og sikkerhet. +- Forstå behovet for å styrke alle ved å designe inkluderende systemer. +- Utforske hvor viktig det er å beskytte personvern og sikkerhet for data og mennesker. +- Se viktigheten av en "glassboks"-tilnærming for å forklare oppførselen til AI-modeller. +- Være oppmerksom på hvordan ansvarlighet er essensielt for å bygge tillit til AI-systemer. + +## Forutsetninger + +Som en forutsetning, vennligst ta "Ansvarlige AI-prinsipper" læringsstien og se videoen nedenfor om emnet: + +Lær mer om ansvarlig AI ved å følge denne [læringsstien](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) + +[![Microsofts tilnærming til ansvarlig AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsofts tilnærming til ansvarlig AI") + +> 🎥 Klikk på bildet over for en video: Microsofts tilnærming til ansvarlig AI + +## Rettferdighet + +AI-systemer bør behandle alle rettferdig og unngå å påvirke lignende grupper på ulike måter. For eksempel, når AI-systemer gir veiledning om medisinsk behandling, lånesøknader eller ansettelser, bør de gi samme anbefalinger til alle med lignende symptomer, økonomiske forhold eller kvalifikasjoner. Vi mennesker bærer med oss arvede skjevheter som påvirker våre beslutninger og handlinger. Disse skjevhetene kan også være til stede i dataene vi bruker til å trene AI-systemer. Slike skjevheter kan noen ganger oppstå utilsiktet. Det er ofte vanskelig å være bevisst på når man introduserer skjevheter i data. + +**"Urettferdighet"** omfatter negative konsekvenser, eller "skader", for en gruppe mennesker, som definert av rase, kjønn, alder eller funksjonshemming. De viktigste skadene relatert til rettferdighet kan klassifiseres som: + +- **Allokering**, hvis for eksempel et kjønn eller en etnisitet favoriseres over en annen. +- **Kvalitet på tjenesten**. Hvis du trener data for ett spesifikt scenario, men virkeligheten er mye mer kompleks, kan det føre til dårlig ytelse. For eksempel en såpedispenser som ikke klarte å registrere personer med mørk hud. [Referanse](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) +- **Nedvurdering**. Å urettferdig kritisere eller merke noe eller noen. For eksempel ble en bildemerkingsteknologi beryktet for å feilmerke bilder av mørkhudede mennesker som gorillaer. +- **Over- eller underrepresentasjon**. Ideen om at en bestemt gruppe ikke er synlig i et bestemt yrke, og enhver tjeneste eller funksjon som fortsetter å fremme dette, bidrar til skade. +- **Stereotypisering**. Å assosiere en gitt gruppe med forhåndsbestemte egenskaper. For eksempel kan et språkoversettingssystem mellom engelsk og tyrkisk ha unøyaktigheter på grunn av ord med stereotypiske kjønnsassosiasjoner. + +![oversettelse til tyrkisk](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png) +> oversettelse til tyrkisk + +![oversettelse tilbake til engelsk](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) +> oversettelse tilbake til engelsk + +Når vi designer og tester AI-systemer, må vi sørge for at AI er rettferdig og ikke programmert til å ta skjeve eller diskriminerende beslutninger, noe som også er forbudt for mennesker. Å garantere rettferdighet i AI og maskinlæring forblir en kompleks sosioteknisk utfordring. + +### Pålitelighet og sikkerhet + +For å bygge tillit må AI-systemer være pålitelige, sikre og konsistente under normale og uventede forhold. Det er viktig å vite hvordan AI-systemer vil oppføre seg i ulike situasjoner, spesielt når det gjelder avvik. Når vi bygger AI-løsninger, må vi fokusere mye på hvordan vi håndterer et bredt spekter av omstendigheter som AI-løsningene kan møte. For eksempel må en selvkjørende bil prioritere menneskers sikkerhet. Derfor må AI som driver bilen, ta hensyn til alle mulige scenarier bilen kan møte, som natt, tordenvær eller snøstormer, barn som løper over gaten, kjæledyr, veiarbeid osv. Hvor godt et AI-system kan håndtere et bredt spekter av forhold pålitelig og sikkert, reflekterer nivået av forberedelse dataforskeren eller AI-utvikleren har vurdert under design eller testing av systemet. + +> [🎥 Klikk her for en video: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) + +### Inkludering + +AI-systemer bør designes for å engasjere og styrke alle. Når dataforskere og AI-utviklere designer og implementerer AI-systemer, identifiserer og adresserer de potensielle barrierer i systemet som utilsiktet kan ekskludere mennesker. For eksempel finnes det 1 milliard mennesker med funksjonshemminger over hele verden. Med fremskritt innen AI kan de lettere få tilgang til et bredt spekter av informasjon og muligheter i hverdagen. Ved å adressere barrierene skapes det muligheter for å innovere og utvikle AI-produkter med bedre opplevelser som gagner alle. + +> [🎥 Klikk her for en video: inkludering i AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v) + +### Sikkerhet og personvern + +AI-systemer bør være trygge og respektere folks personvern. Folk har mindre tillit til systemer som setter deres personvern, informasjon eller liv i fare. Når vi trener maskinlæringsmodeller, er vi avhengige av data for å oppnå de beste resultatene. I denne prosessen må vi vurdere opprinnelsen til dataene og deres integritet. For eksempel, ble dataene sendt inn av brukere eller var de offentlig tilgjengelige? Videre, mens vi arbeider med dataene, er det avgjørende å utvikle AI-systemer som kan beskytte konfidensiell informasjon og motstå angrep. Etter hvert som AI blir mer utbredt, blir det stadig viktigere og mer komplekst å beskytte personvern og sikre viktig personlig og forretningsmessig informasjon. Personvern og datasikkerhet krever spesielt nøye oppmerksomhet for AI, fordi tilgang til data er essensielt for at AI-systemer skal kunne gi nøyaktige og informerte prediksjoner og beslutninger om mennesker. + +> [🎥 Klikk her for en video: sikkerhet i AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Som bransje har vi gjort betydelige fremskritt innen personvern og sikkerhet, drevet i stor grad av reguleringer som GDPR (General Data Protection Regulation). +- Likevel må vi med AI-systemer erkjenne spenningen mellom behovet for mer personlige data for å gjøre systemer mer personlige og effektive – og personvern. +- Akkurat som med fremveksten av tilkoblede datamaskiner via internett, ser vi også en stor økning i antall sikkerhetsproblemer relatert til AI. +- Samtidig har vi sett AI bli brukt til å forbedre sikkerhet. For eksempel drives de fleste moderne antivirusprogrammer i dag av AI-heuristikk. +- Vi må sørge for at våre dataforskningsprosesser harmonerer med de nyeste praksisene for personvern og sikkerhet. + +### Åpenhet + +AI-systemer bør være forståelige. En viktig del av åpenhet er å forklare oppførselen til AI-systemer og deres komponenter. Forbedring av forståelsen av AI-systemer krever at interessenter forstår hvordan og hvorfor de fungerer, slik at de kan identifisere potensielle ytelsesproblemer, sikkerhets- og personvernhensyn, skjevheter, ekskluderende praksis eller utilsiktede utfall. Vi mener også at de som bruker AI-systemer, bør være ærlige og åpne om når, hvorfor og hvordan de velger å bruke dem, samt begrensningene til systemene de bruker. For eksempel, hvis en bank bruker et AI-system for å støtte sine utlånsbeslutninger, er det viktig å undersøke resultatene og forstå hvilke data som påvirker systemets anbefalinger. Regjeringer begynner å regulere AI på tvers av bransjer, så dataforskere og organisasjoner må forklare om et AI-system oppfyller regulatoriske krav, spesielt når det oppstår et uønsket utfall. + +> [🎥 Klikk her for en video: åpenhet i AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Fordi AI-systemer er så komplekse, er det vanskelig å forstå hvordan de fungerer og tolke resultatene. +- Denne mangelen på forståelse påvirker hvordan disse systemene administreres, operasjonaliseres og dokumenteres. +- Enda viktigere påvirker denne mangelen på forståelse beslutningene som tas basert på resultatene disse systemene produserer. + +### Ansvarlighet + +De som designer og implementerer AI-systemer, må være ansvarlige for hvordan systemene deres fungerer. Behovet for ansvarlighet er spesielt viktig for sensitive teknologier som ansiktsgjenkjenning. Nylig har det vært en økende etterspørsel etter ansiktsgjenkjenningsteknologi, spesielt fra rettshåndhevelsesorganisasjoner som ser potensialet i teknologien for bruk som å finne savnede barn. Imidlertid kan disse teknologiene potensielt brukes av en regjering til å sette borgernes grunnleggende friheter i fare, for eksempel ved å muliggjøre kontinuerlig overvåking av spesifikke individer. Derfor må dataforskere og organisasjoner være ansvarlige for hvordan deres AI-system påvirker enkeltpersoner eller samfunnet. + +[![Ledende AI-forsker advarer om masseovervåking gjennom ansiktsgjenkjenning](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsofts tilnærming til ansvarlig AI") + +> 🎥 Klikk på bildet over for en video: Advarsler om masseovervåking gjennom ansiktsgjenkjenning + +Til syvende og sist er et av de største spørsmålene for vår generasjon, som den første generasjonen som bringer AI til samfunnet, hvordan vi kan sikre at datamaskiner forblir ansvarlige overfor mennesker, og hvordan vi kan sikre at de som designer datamaskiner, forblir ansvarlige overfor alle andre. + +## Konsekvensvurdering + +Før du trener en maskinlæringsmodell, er det viktig å gjennomføre en konsekvensvurdering for å forstå formålet med AI-systemet; hva den tiltenkte bruken er; hvor det vil bli implementert; og hvem som vil samhandle med systemet. Dette er nyttig for vurderere eller testere som evaluerer systemet for å vite hvilke faktorer de skal ta hensyn til når de identifiserer potensielle risikoer og forventede konsekvenser. + +Følgende er fokusområder når du gjennomfører en konsekvensvurdering: + +* **Negative konsekvenser for enkeltpersoner**. Å være klar over eventuelle begrensninger eller krav, ikke-støttet bruk eller kjente begrensninger som hindrer systemets ytelse, er avgjørende for å sikre at systemet ikke brukes på en måte som kan skade enkeltpersoner. +* **Datakrav**. Å forstå hvordan og hvor systemet vil bruke data, gjør det mulig for vurderere å utforske eventuelle datakrav du må være oppmerksom på (f.eks. GDPR eller HIPAA-reguleringer). I tillegg bør du undersøke om kilden eller mengden av data er tilstrekkelig for trening. +* **Oppsummering av konsekvenser**. Samle en liste over potensielle skader som kan oppstå ved bruk av systemet. Gjennom hele ML-livssyklusen bør du vurdere om de identifiserte problemene er adressert eller redusert. +* **Gjeldende mål** for hver av de seks kjerneprinsippene. Vurder om målene fra hvert prinsipp er oppfylt, og om det er noen mangler. + +## Feilsøking med ansvarlig AI + +Akkurat som med feilsøking av en programvareapplikasjon, er feilsøking av et AI-system en nødvendig prosess for å identifisere og løse problemer i systemet. Det er mange faktorer som kan påvirke at en modell ikke presterer som forventet eller ansvarlig. De fleste tradisjonelle modellytelsesmålinger er kvantitative aggregater av en modells ytelse, som ikke er tilstrekkelige for å analysere hvordan en modell bryter med prinsippene for ansvarlig AI. Videre er en maskinlæringsmodell en "svart boks" som gjør det vanskelig å forstå hva som driver dens utfall eller forklare hvorfor den gjør feil. Senere i dette kurset vil vi lære hvordan vi bruker Responsible AI-dashbordet for å hjelpe med feilsøking av AI-systemer. Dashbordet gir et helhetlig verktøy for dataforskere og AI-utviklere til å utføre: + +* **Feilanalyse**. For å identifisere feilfordelingen i modellen som kan påvirke systemets rettferdighet eller pålitelighet. +* **Modelloversikt**. For å oppdage hvor det er ulikheter i modellens ytelse på tvers av datakohorter. +* **Dataanalyse**. For å forstå datadistribusjonen og identifisere potensielle skjevheter i dataene som kan føre til problemer med rettferdighet, inkludering og pålitelighet. +* **Modellfortolkning**. For å forstå hva som påvirker eller driver modellens prediksjoner. Dette hjelper med å forklare modellens oppførsel, som er viktig for åpenhet og ansvarlighet. + +## 🚀 Utfordring + +For å forhindre at skader introduseres i utgangspunktet, bør vi: + +- ha et mangfold av bakgrunner og perspektiver blant de som jobber med systemer +- investere i datasett som reflekterer mangfoldet i samfunnet vårt +- utvikle bedre metoder gjennom hele maskinlæringslivssyklusen for å oppdage og korrigere ansvarlig AI når det oppstår + +Tenk på virkelige scenarier der en modells upålitelighet er tydelig i modellbygging og bruk. Hva annet bør vi vurdere? + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang og selvstudium + +I denne leksjonen har du lært noen grunnleggende konsepter om rettferdighet og urettferdighet i maskinlæring. +Se denne workshopen for å fordype deg i temaene: + +- På jakt etter ansvarlig AI: Fra prinsipper til praksis av Besmira Nushi, Mehrnoosh Sameki og Amit Sharma + +[![Responsible AI Toolbox: En åpen kildekode-rammeverk for å bygge ansvarlig AI](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: En åpen kildekode-rammeverk for å bygge ansvarlig AI") + + +> 🎥 Klikk på bildet over for en video: RAI Toolbox: En åpen kildekode-rammeverk for å bygge ansvarlig AI av Besmira Nushi, Mehrnoosh Sameki og Amit Sharma + +Les også: + +- Microsofts RAI ressursenter: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsofts FATE forskningsgruppe: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +RAI Toolbox: + +- [Responsible AI Toolbox GitHub repository](https://github.com/microsoft/responsible-ai-toolbox) + +Les om Azure Machine Learning sine verktøy for å sikre rettferdighet: + +- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) + +## Oppgave + +[Utforsk RAI Toolbox](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/1-Introduction/3-fairness/assignment.md b/translations/no/1-Introduction/3-fairness/assignment.md new file mode 100644 index 000000000..665e36e24 --- /dev/null +++ b/translations/no/1-Introduction/3-fairness/assignment.md @@ -0,0 +1,25 @@ + +# Utforsk Responsible AI Toolbox + +## Instruksjoner + +I denne leksjonen lærte du om Responsible AI Toolbox, et "åpen kildekode, samfunnsdrevet prosjekt for å hjelpe dataforskere med å analysere og forbedre AI-systemer." For denne oppgaven, utforsk en av RAI Toolbox sine [notebooks](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) og rapporter funnene dine i et papir eller en presentasjon. + +## Vurderingskriterier + +| Kriterier | Fremragende | Tilfredsstillende | Trenger forbedring | +| --------- | ----------- | ----------------- | ------------------ | +| | Et papir eller PowerPoint-presentasjon blir levert som diskuterer Fairlearns systemer, notebooken som ble kjørt, og konklusjonene som ble trukket fra den | Et papir blir levert uten konklusjoner | Ingen papir blir levert | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/1-Introduction/4-techniques-of-ML/README.md b/translations/no/1-Introduction/4-techniques-of-ML/README.md new file mode 100644 index 000000000..bd864d844 --- /dev/null +++ b/translations/no/1-Introduction/4-techniques-of-ML/README.md @@ -0,0 +1,132 @@ + +# Teknikker for maskinlæring + +Prosessen med å bygge, bruke og vedlikeholde maskinlæringsmodeller og dataene de bruker, er svært forskjellig fra mange andre utviklingsarbeidsflyter. I denne leksjonen vil vi avmystifisere prosessen og skissere de viktigste teknikkene du trenger å kjenne til. Du vil: + +- Forstå prosessene som ligger til grunn for maskinlæring på et overordnet nivå. +- Utforske grunnleggende konsepter som 'modeller', 'prediksjoner' og 'treningsdata'. + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +[![ML for nybegynnere - Teknikker for maskinlæring](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML for nybegynnere - Teknikker for maskinlæring") + +> 🎥 Klikk på bildet over for en kort video som går gjennom denne leksjonen. + +## Introduksjon + +På et overordnet nivå består håndverket med å lage maskinlæringsprosesser (ML) av flere steg: + +1. **Bestem spørsmålet**. De fleste ML-prosesser starter med å stille et spørsmål som ikke kan besvares med et enkelt betingelsesbasert program eller regelbasert motor. Disse spørsmålene dreier seg ofte om prediksjoner basert på en samling data. +2. **Samle og forbered data**. For å kunne besvare spørsmålet ditt trenger du data. Kvaliteten og, noen ganger, mengden av dataene dine vil avgjøre hvor godt du kan besvare det opprinnelige spørsmålet. Visualisering av data er en viktig del av denne fasen. Denne fasen inkluderer også å dele dataene inn i en trenings- og testgruppe for å bygge en modell. +3. **Velg en treningsmetode**. Avhengig av spørsmålet ditt og naturen til dataene dine, må du velge hvordan du vil trene en modell for best å reflektere dataene og lage nøyaktige prediksjoner basert på dem. Dette er den delen av ML-prosessen som krever spesifikk ekspertise og ofte en betydelig mengde eksperimentering. +4. **Tren modellen**. Ved hjelp av treningsdataene dine bruker du ulike algoritmer for å trene en modell til å gjenkjenne mønstre i dataene. Modellen kan bruke interne vekter som kan justeres for å prioritere visse deler av dataene over andre for å bygge en bedre modell. +5. **Evaluer modellen**. Du bruker data som modellen aldri har sett før (testdataene dine) fra den innsamlede samlingen for å se hvordan modellen presterer. +6. **Parameterjustering**. Basert på modellens ytelse kan du gjenta prosessen med forskjellige parametere eller variabler som styrer oppførselen til algoritmene som brukes til å trene modellen. +7. **Prediksjon**. Bruk nye input for å teste modellens nøyaktighet. + +## Hvilket spørsmål skal du stille? + +Datamaskiner er spesielt dyktige til å oppdage skjulte mønstre i data. Denne egenskapen er svært nyttig for forskere som har spørsmål om et gitt område som ikke enkelt kan besvares ved å lage en betingelsesbasert regelmotor. Gitt en aktuariell oppgave, for eksempel, kan en dataforsker være i stand til å konstruere håndlagde regler rundt dødeligheten til røykere vs. ikke-røykere. + +Når mange andre variabler tas med i ligningen, kan imidlertid en ML-modell vise seg å være mer effektiv til å forutsi fremtidige dødelighetsrater basert på tidligere helsehistorikk. Et mer oppløftende eksempel kan være å lage værprediksjoner for april måned på et gitt sted basert på data som inkluderer breddegrad, lengdegrad, klimaendringer, nærhet til havet, mønstre i jetstrømmen og mer. + +✅ Denne [presentasjonen](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) om værmodeller gir et historisk perspektiv på bruk av ML i væranalyse. + +## Oppgaver før bygging + +Før du begynner å bygge modellen din, er det flere oppgaver du må fullføre. For å teste spørsmålet ditt og danne en hypotese basert på modellens prediksjoner, må du identifisere og konfigurere flere elementer. + +### Data + +For å kunne besvare spørsmålet ditt med en viss grad av sikkerhet, trenger du en god mengde data av riktig type. Det er to ting du må gjøre på dette tidspunktet: + +- **Samle data**. Med tanke på den forrige leksjonen om rettferdighet i dataanalyse, samle dataene dine med omhu. Vær oppmerksom på kildene til disse dataene, eventuelle iboende skjevheter de kan ha, og dokumenter opprinnelsen. +- **Forbered data**. Det er flere steg i prosessen med databehandling. Du kan trenge å samle data og normalisere dem hvis de kommer fra ulike kilder. Du kan forbedre kvaliteten og mengden av dataene gjennom ulike metoder, som å konvertere strenger til tall (som vi gjør i [Clustering](../../5-Clustering/1-Visualize/README.md)). Du kan også generere nye data basert på de opprinnelige (som vi gjør i [Classification](../../4-Classification/1-Introduction/README.md)). Du kan rense og redigere dataene (som vi gjør før [Web App](../../3-Web-App/README.md)-leksjonen). Til slutt kan det hende du må randomisere og blande dem, avhengig av treningsmetodene dine. + +✅ Etter å ha samlet og behandlet dataene dine, ta et øyeblikk for å se om formen deres vil tillate deg å adressere det tiltenkte spørsmålet. Det kan være at dataene ikke vil fungere godt for den gitte oppgaven, som vi oppdager i våre [Clustering](../../5-Clustering/1-Visualize/README.md)-leksjoner! + +### Funksjoner og mål + +En [funksjon](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) er en målbar egenskap ved dataene dine. I mange datasett uttrykkes det som en kolonneoverskrift som 'dato', 'størrelse' eller 'farge'. Funksjonsvariabelen din, vanligvis representert som `X` i kode, representerer inputvariabelen som vil bli brukt til å trene modellen. + +Et mål er det du prøver å forutsi. Målet, vanligvis representert som `y` i kode, representerer svaret på spørsmålet du prøver å stille til dataene dine: i desember, hvilken **farge** vil gresskar være billigst? I San Francisco, hvilke nabolag vil ha de beste eiendoms**prisene**? Noen ganger refereres målet også til som etikettattributt. + +### Velge funksjonsvariabelen din + +🎓 **Funksjonsvalg og funksjonsekstraksjon** Hvordan vet du hvilken variabel du skal velge når du bygger en modell? Du vil sannsynligvis gå gjennom en prosess med funksjonsvalg eller funksjonsekstraksjon for å velge de riktige variablene for den mest effektive modellen. De er imidlertid ikke det samme: "Funksjonsekstraksjon lager nye funksjoner fra funksjoner av de opprinnelige funksjonene, mens funksjonsvalg returnerer et delsett av funksjonene." ([kilde](https://wikipedia.org/wiki/Feature_selection)) + +### Visualiser dataene dine + +En viktig del av verktøysettet til en dataforsker er evnen til å visualisere data ved hjelp av flere utmerkede biblioteker som Seaborn eller MatPlotLib. Å representere dataene dine visuelt kan hjelpe deg med å avdekke skjulte korrelasjoner som du kan utnytte. Visualiseringene dine kan også hjelpe deg med å avdekke skjevheter eller ubalanserte data (som vi oppdager i [Classification](../../4-Classification/2-Classifiers-1/README.md)). + +### Del opp datasettet ditt + +Før trening må du dele datasettet ditt inn i to eller flere deler av ulik størrelse som fortsatt representerer dataene godt. + +- **Trening**. Denne delen av datasettet tilpasses modellen din for å trene den. Dette settet utgjør majoriteten av det opprinnelige datasettet. +- **Testing**. Et testdatasett er en uavhengig gruppe data, ofte hentet fra de opprinnelige dataene, som du bruker for å bekrefte ytelsen til den bygde modellen. +- **Validering**. Et valideringssett er en mindre uavhengig gruppe eksempler som du bruker for å finjustere modellens hyperparametere eller arkitektur for å forbedre modellen. Avhengig av størrelsen på dataene dine og spørsmålet du stiller, trenger du kanskje ikke å bygge dette tredje settet (som vi bemerker i [Time Series Forecasting](../../7-TimeSeries/1-Introduction/README.md)). + +## Bygge en modell + +Ved hjelp av treningsdataene dine er målet ditt å bygge en modell, eller en statistisk representasjon av dataene dine, ved hjelp av ulike algoritmer for å **trene** den. Å trene en modell eksponerer den for data og lar den gjøre antakelser om oppdagede mønstre, validere dem og akseptere eller avvise dem. + +### Bestem treningsmetoden + +Avhengig av spørsmålet ditt og naturen til dataene dine, vil du velge en metode for å trene dem. Ved å gå gjennom [Scikit-learn's dokumentasjon](https://scikit-learn.org/stable/user_guide.html) - som vi bruker i dette kurset - kan du utforske mange måter å trene en modell på. Avhengig av erfaringen din, kan det hende du må prøve flere forskjellige metoder for å bygge den beste modellen. Du vil sannsynligvis gå gjennom en prosess der dataforskere evaluerer ytelsen til en modell ved å mate den med ukjente data, sjekke for nøyaktighet, skjevhet og andre kvalitetsreduserende problemer, og velge den mest passende treningsmetoden for oppgaven. + +### Tren en modell + +Med treningsdataene dine er du klar til å 'tilpasse' dem for å lage en modell. Du vil legge merke til at i mange ML-biblioteker finner du koden 'model.fit' - det er på dette tidspunktet du sender inn funksjonsvariabelen din som en matrise av verdier (vanligvis 'X') og en målvariabel (vanligvis 'y'). + +### Evaluer modellen + +Når treningsprosessen er fullført (det kan ta mange iterasjoner, eller 'epoker', å trene en stor modell), vil du kunne evaluere modellens kvalitet ved å bruke testdata for å måle ytelsen. Disse dataene er et delsett av de opprinnelige dataene som modellen ikke tidligere har analysert. Du kan skrive ut en tabell med metrikker om modellens kvalitet. + +🎓 **Modelltilpasning** + +I sammenheng med maskinlæring refererer modelltilpasning til nøyaktigheten av modellens underliggende funksjon når den forsøker å analysere data den ikke er kjent med. + +🎓 **Undertilpasning** og **overtilpasning** er vanlige problemer som reduserer modellens kvalitet, ettersom modellen enten tilpasser seg for dårlig eller for godt. Dette fører til at modellen lager prediksjoner som enten er for tett knyttet til eller for løst knyttet til treningsdataene. En overtilpasset modell forutsier treningsdataene for godt fordi den har lært detaljene og støyen i dataene for godt. En undertilpasset modell er ikke nøyaktig, da den verken kan analysere treningsdataene eller data den ikke har 'sett' på en korrekt måte. + +![overtilpasset modell](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png) +> Infografikk av [Jen Looper](https://twitter.com/jenlooper) + +## Parameterjustering + +Når den første treningen er fullført, observer kvaliteten på modellen og vurder å forbedre den ved å justere dens 'hyperparametere'. Les mer om prosessen [i dokumentasjonen](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott). + +## Prediksjon + +Dette er øyeblikket hvor du kan bruke helt nye data for å teste modellens nøyaktighet. I en 'anvendt' ML-setting, der du bygger nettressurser for å bruke modellen i produksjon, kan denne prosessen innebære å samle brukerinput (for eksempel et knappetrykk) for å sette en variabel og sende den til modellen for inferens eller evaluering. + +I disse leksjonene vil du oppdage hvordan du bruker disse stegene til å forberede, bygge, teste, evaluere og forutsi - alle oppgavene til en dataforsker og mer, mens du utvikler deg på reisen til å bli en 'full stack' ML-ingeniør. + +--- + +## 🚀Utfordring + +Lag et flytskjema som reflekterer stegene til en ML-praktiker. Hvor ser du deg selv akkurat nå i prosessen? Hvor tror du at du vil møte vanskeligheter? Hva virker enkelt for deg? + +## [Quiz etter leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang og selvstudium + +Søk på nettet etter intervjuer med dataforskere som diskuterer sitt daglige arbeid. Her er [et](https://www.youtube.com/watch?v=Z3IjgbbCEfs). + +## Oppgave + +[Intervju en dataforsker](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/1-Introduction/4-techniques-of-ML/assignment.md b/translations/no/1-Introduction/4-techniques-of-ML/assignment.md new file mode 100644 index 000000000..37a3fb9fe --- /dev/null +++ b/translations/no/1-Introduction/4-techniques-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Intervju en data scientist + +## Instruksjoner + +I din bedrift, i en brukergruppe, eller blant vennene dine eller medstudenter, snakk med noen som jobber profesjonelt som data scientist. Skriv en kort oppgave (500 ord) om deres daglige arbeidsoppgaver. Er de spesialister, eller jobber de 'full stack'? + +## Vurderingskriterier + +| Kriterier | Fremragende | Tilfredsstillende | Trenger forbedring | +| --------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------ | --------------------- | +| | En oppgave med korrekt lengde, med tilskrevne kilder, presentert som en .doc-fil | Oppgaven er dårlig tilskrevet eller kortere enn den påkrevde lengden | Ingen oppgave er levert | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/1-Introduction/README.md b/translations/no/1-Introduction/README.md new file mode 100644 index 000000000..b1f69c1d5 --- /dev/null +++ b/translations/no/1-Introduction/README.md @@ -0,0 +1,36 @@ + +# Introduksjon til maskinlæring + +I denne delen av læreplanen vil du bli introdusert til de grunnleggende konseptene som ligger til grunn for feltet maskinlæring, hva det er, og lære om historien og teknikkene forskere bruker for å arbeide med det. La oss utforske denne nye verdenen av ML sammen! + +![globe](../../../1-Introduction/images/globe.jpg) +> Foto av Bill OxfordUnsplash + +### Leksjoner + +1. [Introduksjon til maskinlæring](1-intro-to-ML/README.md) +1. [Historien til maskinlæring og AI](2-history-of-ML/README.md) +1. [Rettferdighet og maskinlæring](3-fairness/README.md) +1. [Teknikker innen maskinlæring](4-techniques-of-ML/README.md) +### Krediteringer + +"Introduksjon til maskinlæring" ble skrevet med ♥️ av et team av folk inkludert [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) og [Jen Looper](https://twitter.com/jenlooper) + +"Historien til maskinlæring" ble skrevet med ♥️ av [Jen Looper](https://twitter.com/jenlooper) og [Amy Boyd](https://twitter.com/AmyKateNicho) + +"Rettferdighet og maskinlæring" ble skrevet med ♥️ av [Tomomi Imura](https://twitter.com/girliemac) + +"Teknikker innen maskinlæring" ble skrevet med ♥️ av [Jen Looper](https://twitter.com/jenlooper) og [Chris Noring](https://twitter.com/softchris) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/1-Tools/README.md b/translations/no/2-Regression/1-Tools/README.md new file mode 100644 index 000000000..f5c549de4 --- /dev/null +++ b/translations/no/2-Regression/1-Tools/README.md @@ -0,0 +1,238 @@ + +# Kom i gang med Python og Scikit-learn for regresjonsmodeller + +![Oppsummering av regresjoner i en sketchnote](../../../../sketchnotes/ml-regression.png) + +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Denne leksjonen er også tilgjengelig i R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) + +## Introduksjon + +I disse fire leksjonene vil du lære hvordan du bygger regresjonsmodeller. Vi skal snart diskutere hva disse brukes til. Men før du gjør noe som helst, sørg for at du har de riktige verktøyene på plass for å starte prosessen! + +I denne leksjonen vil du lære å: + +- Konfigurere datamaskinen din for lokale maskinlæringsoppgaver. +- Jobbe med Jupyter-notatbøker. +- Bruke Scikit-learn, inkludert installasjon. +- Utforske lineær regresjon gjennom en praktisk øvelse. + +## Installasjoner og konfigurasjoner + +[![ML for nybegynnere - Sett opp verktøyene dine for å bygge maskinlæringsmodeller](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML for nybegynnere - Sett opp verktøyene dine for å bygge maskinlæringsmodeller") + +> 🎥 Klikk på bildet over for en kort video som viser hvordan du konfigurerer datamaskinen din for maskinlæring. + +1. **Installer Python**. Sørg for at [Python](https://www.python.org/downloads/) er installert på datamaskinen din. Du vil bruke Python til mange oppgaver innen datavitenskap og maskinlæring. De fleste datamaskiner har allerede en Python-installasjon. Det finnes også nyttige [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) som kan gjøre oppsettet enklere for noen brukere. + + Noen bruksområder for Python krever én versjon av programvaren, mens andre krever en annen versjon. Derfor er det nyttig å jobbe i et [virtuelt miljø](https://docs.python.org/3/library/venv.html). + +2. **Installer Visual Studio Code**. Sørg for at Visual Studio Code er installert på datamaskinen din. Følg disse instruksjonene for å [installere Visual Studio Code](https://code.visualstudio.com/) for grunnleggende installasjon. Du skal bruke Python i Visual Studio Code i dette kurset, så det kan være lurt å friske opp hvordan du [konfigurerer Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) for Python-utvikling. + + > Bli komfortabel med Python ved å jobbe gjennom denne samlingen av [Learn-moduler](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) + > + > [![Sett opp Python med Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Sett opp Python med Visual Studio Code") + > + > 🎥 Klikk på bildet over for en video: bruk Python i VS Code. + +3. **Installer Scikit-learn** ved å følge [disse instruksjonene](https://scikit-learn.org/stable/install.html). Siden du må sørge for at du bruker Python 3, anbefales det at du bruker et virtuelt miljø. Merk at hvis du installerer dette biblioteket på en M1 Mac, finnes det spesielle instruksjoner på siden som er lenket over. + +4. **Installer Jupyter Notebook**. Du må [installere Jupyter-pakken](https://pypi.org/project/jupyter/). + +## Ditt ML-utviklingsmiljø + +Du skal bruke **notatbøker** for å utvikle Python-koden din og lage maskinlæringsmodeller. Denne typen filer er et vanlig verktøy for dataforskere, og de kan identifiseres ved suffikset eller filtypen `.ipynb`. + +Notatbøker er et interaktivt miljø som lar utvikleren både kode og legge til notater og skrive dokumentasjon rundt koden, noe som er ganske nyttig for eksperimentelle eller forskningsorienterte prosjekter. + +[![ML for nybegynnere - Sett opp Jupyter-notatbøker for å begynne å bygge regresjonsmodeller](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML for nybegynnere - Sett opp Jupyter-notatbøker for å begynne å bygge regresjonsmodeller") + +> 🎥 Klikk på bildet over for en kort video som viser denne øvelsen. + +### Øvelse - jobb med en notatbok + +I denne mappen finner du filen _notebook.ipynb_. + +1. Åpne _notebook.ipynb_ i Visual Studio Code. + + En Jupyter-server vil starte med Python 3+. Du vil finne områder i notatboken som kan `kjøres`, altså kodeblokker. Du kan kjøre en kodeblokk ved å velge ikonet som ser ut som en avspillingsknapp. + +2. Velg `md`-ikonet og legg til litt markdown, og følgende tekst: **# Velkommen til din notatbok**. + + Deretter legger du til litt Python-kode. + +3. Skriv **print('hello notebook')** i kodeblokken. +4. Velg pilen for å kjøre koden. + + Du bør se den utskrevne meldingen: + + ```output + hello notebook + ``` + +![VS Code med en åpen notatbok](../../../../2-Regression/1-Tools/images/notebook.jpg) + +Du kan blande koden din med kommentarer for å selv-dokumentere notatboken. + +✅ Tenk et øyeblikk på hvor forskjellig arbeidsmiljøet til en webutvikler er sammenlignet med en dataforsker. + +## Kom i gang med Scikit-learn + +Nå som Python er satt opp i ditt lokale miljø, og du er komfortabel med Jupyter-notatbøker, la oss bli like komfortable med Scikit-learn (uttales `sci` som i `science`). Scikit-learn tilbyr en [omfattende API](https://scikit-learn.org/stable/modules/classes.html#api-ref) for å hjelpe deg med å utføre ML-oppgaver. + +Ifølge deres [nettsted](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn er et åpen kildekode-bibliotek for maskinlæring som støtter både overvåket og ikke-overvåket læring. Det tilbyr også ulike verktøy for modelltilpasning, dataprosessering, modellvalg og evaluering, samt mange andre nyttige funksjoner." + +I dette kurset vil du bruke Scikit-learn og andre verktøy for å bygge maskinlæringsmodeller for å utføre det vi kaller 'tradisjonelle maskinlæringsoppgaver'. Vi har bevisst unngått nevrale nettverk og dyp læring, da disse dekkes bedre i vårt kommende 'AI for nybegynnere'-pensum. + +Scikit-learn gjør det enkelt å bygge modeller og evaluere dem for bruk. Det fokuserer primært på bruk av numeriske data og inneholder flere ferdiglagde datasett som kan brukes som læringsverktøy. Det inkluderer også forhåndsbygde modeller som studenter kan prøve. La oss utforske prosessen med å laste inn forhåndspakkede data og bruke en innebygd estimator for å lage vår første ML-modell med Scikit-learn ved hjelp av noen grunnleggende data. + +## Øvelse - din første Scikit-learn-notatbok + +> Denne opplæringen er inspirert av [eksempelet på lineær regresjon](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) på Scikit-learns nettsted. + +[![ML for nybegynnere - Ditt første lineære regresjonsprosjekt i Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML for nybegynnere - Ditt første lineære regresjonsprosjekt i Python") + +> 🎥 Klikk på bildet over for en kort video som viser denne øvelsen. + +I _notebook.ipynb_-filen som er tilknyttet denne leksjonen, tøm alle cellene ved å trykke på 'søppelbøtte'-ikonet. + +I denne delen skal du jobbe med et lite datasett om diabetes som er innebygd i Scikit-learn for læringsformål. Tenk deg at du ønsket å teste en behandling for diabetikere. Maskinlæringsmodeller kan hjelpe deg med å avgjøre hvilke pasienter som vil respondere bedre på behandlingen, basert på kombinasjoner av variabler. Selv en veldig grunnleggende regresjonsmodell, når den visualiseres, kan vise informasjon om variabler som kan hjelpe deg med å organisere dine teoretiske kliniske studier. + +✅ Det finnes mange typer regresjonsmetoder, og hvilken du velger avhenger av spørsmålet du ønsker å besvare. Hvis du vil forutsi sannsynlig høyde for en person med en gitt alder, vil du bruke lineær regresjon, siden du søker en **numerisk verdi**. Hvis du er interessert i å finne ut om en type mat skal anses som vegansk eller ikke, ser du etter en **kategoriinndeling**, og da vil du bruke logistisk regresjon. Du vil lære mer om logistisk regresjon senere. Tenk litt på noen spørsmål du kan stille til data, og hvilken av disse metodene som ville være mest passende. + +La oss komme i gang med denne oppgaven. + +### Importer biblioteker + +For denne oppgaven skal vi importere noen biblioteker: + +- **matplotlib**. Et nyttig [verktøy for grafer](https://matplotlib.org/) som vi skal bruke til å lage en linjediagram. +- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) er et nyttig bibliotek for håndtering av numeriske data i Python. +- **sklearn**. Dette er [Scikit-learn](https://scikit-learn.org/stable/user_guide.html)-biblioteket. + +Importer noen biblioteker for å hjelpe med oppgavene dine. + +1. Legg til imports ved å skrive følgende kode: + + ```python + import matplotlib.pyplot as plt + import numpy as np + from sklearn import datasets, linear_model, model_selection + ``` + + Over importerer du `matplotlib`, `numpy`, og du importerer `datasets`, `linear_model` og `model_selection` fra `sklearn`. `model_selection` brukes til å dele data i trenings- og testsett. + +### Diabetes-datasettet + +Det innebygde [diabetes-datasettet](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) inkluderer 442 datasettprøver om diabetes, med 10 funksjonsvariabler, inkludert: + +- age: alder i år +- bmi: kroppsmasseindeks +- bp: gjennomsnittlig blodtrykk +- s1 tc: T-celler (en type hvite blodceller) + +✅ Dette datasettet inkluderer konseptet 'kjønn' som en funksjonsvariabel viktig for forskning på diabetes. Mange medisinske datasett inkluderer denne typen binær klassifisering. Tenk litt på hvordan slike kategoriseringer kan ekskludere visse deler av befolkningen fra behandlinger. + +Nå, last inn X- og y-dataene. + +> 🎓 Husk, dette er overvåket læring, og vi trenger et navngitt 'y'-mål. + +I en ny kodecelle, last inn diabetes-datasettet ved å kalle `load_diabetes()`. Inputen `return_X_y=True` signaliserer at `X` vil være en datamatrise, og `y` vil være regresjonsmålet. + +1. Legg til noen print-kommandoer for å vise formen på datamatrisen og dens første element: + + ```python + X, y = datasets.load_diabetes(return_X_y=True) + print(X.shape) + print(X[0]) + ``` + + Det du får tilbake som svar, er en tuple. Det du gjør, er å tilordne de to første verdiene i tuplen til henholdsvis `X` og `y`. Lær mer [om tupler](https://wikipedia.org/wiki/Tuple). + + Du kan se at disse dataene har 442 elementer formet i matriser med 10 elementer: + + ```text + (442, 10) + [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076 + -0.04340085 -0.00259226 0.01990842 -0.01764613] + ``` + + ✅ Tenk litt på forholdet mellom dataene og regresjonsmålet. Lineær regresjon forutsier forholdet mellom funksjonen X og målvariabelen y. Kan du finne [målet](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) for diabetes-datasettet i dokumentasjonen? Hva demonstrerer dette datasettet, gitt målet? + +2. Velg deretter en del av dette datasettet for å plotte ved å velge den tredje kolonnen i datasettet. Du kan gjøre dette ved å bruke `:`-operatoren for å velge alle rader, og deretter velge den tredje kolonnen ved hjelp av indeksen (2). Du kan også omforme dataene til å være en 2D-matrise - som kreves for plotting - ved å bruke `reshape(n_rows, n_columns)`. Hvis en av parameterne er -1, beregnes den tilsvarende dimensjonen automatisk. + + ```python + X = X[:, 2] + X = X.reshape((-1,1)) + ``` + + ✅ Når som helst, skriv ut dataene for å sjekke formen. + +3. Nå som du har data klare til å bli plottet, kan du se om en maskin kan hjelpe med å bestemme en logisk inndeling mellom tallene i dette datasettet. For å gjøre dette, må du dele både dataene (X) og målet (y) i test- og treningssett. Scikit-learn har en enkel måte å gjøre dette på; du kan dele testdataene dine på et gitt punkt. + + ```python + X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) + ``` + +4. Nå er du klar til å trene modellen din! Last inn den lineære regresjonsmodellen og tren den med X- og y-treningssettene dine ved å bruke `model.fit()`: + + ```python + model = linear_model.LinearRegression() + model.fit(X_train, y_train) + ``` + + ✅ `model.fit()` er en funksjon du vil se i mange ML-biblioteker som TensorFlow. + +5. Deretter lager du en prediksjon ved hjelp av testdataene, ved å bruke funksjonen `predict()`. Dette vil brukes til å tegne linjen mellom datagruppene. + + ```python + y_pred = model.predict(X_test) + ``` + +6. Nå er det på tide å vise dataene i et diagram. Matplotlib er et veldig nyttig verktøy for denne oppgaven. Lag et spredningsdiagram av alle X- og y-testdataene, og bruk prediksjonen til å tegne en linje på det mest passende stedet mellom modellens datagrupper. + + ```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() + ``` + + ![et spredningsdiagram som viser datapunkter rundt diabetes](../../../../2-Regression/1-Tools/images/scatterplot.png) +✅ Tenk litt over hva som skjer her. En rett linje går gjennom mange små datapunkter, men hva gjør den egentlig? Kan du se hvordan du bør kunne bruke denne linjen til å forutsi hvor et nytt, ukjent datapunkt bør passe i forhold til y-aksen i plottet? Prøv å sette ord på den praktiske bruken av denne modellen. + +Gratulerer, du har bygget din første lineære regresjonsmodell, laget en prediksjon med den, og vist den i et plott! + +--- +## 🚀Utfordring + +Plott en annen variabel fra dette datasettet. Hint: rediger denne linjen: `X = X[:,2]`. Gitt målet for dette datasettet, hva kan du oppdage om utviklingen av diabetes som sykdom? +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang & Selvstudium + +I denne opplæringen jobbet du med enkel lineær regresjon, i stedet for univariat eller multippel lineær regresjon. Les litt om forskjellene mellom disse metodene, eller ta en titt på [denne videoen](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef). + +Les mer om konseptet regresjon og tenk over hvilke typer spørsmål som kan besvares med denne teknikken. Ta denne [opplæringen](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) for å utdype forståelsen din. + +## Oppgave + +[Et annet datasett](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/1-Tools/assignment.md b/translations/no/2-Regression/1-Tools/assignment.md new file mode 100644 index 000000000..6920e8852 --- /dev/null +++ b/translations/no/2-Regression/1-Tools/assignment.md @@ -0,0 +1,27 @@ + +# Regressjon med Scikit-learn + +## Instruksjoner + +Ta en titt på [Linnerud-datasettet](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) i Scikit-learn. Dette datasettet har flere [målvariabler](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): 'Det består av tre treningsvariabler (data) og tre fysiologiske variabler (mål) samlet inn fra tjue middelaldrende menn på et treningssenter'. + +Med egne ord, beskriv hvordan man kan lage en regresjonsmodell som viser sammenhengen mellom midjemål og hvor mange situps som utføres. Gjør det samme for de andre datapunktene i dette datasettet. + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| ----------------------------- | ----------------------------------- | ----------------------------- | -------------------------- | +| Send inn en beskrivende paragraf | En godt skrevet paragraf er sendt inn | Noen få setninger er sendt inn | Ingen beskrivelse er sendt inn | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør betraktes som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/1-Tools/solution/Julia/README.md b/translations/no/2-Regression/1-Tools/solution/Julia/README.md new file mode 100644 index 000000000..f306208e7 --- /dev/null +++ b/translations/no/2-Regression/1-Tools/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/2-Data/README.md b/translations/no/2-Regression/2-Data/README.md new file mode 100644 index 000000000..4e9f9688a --- /dev/null +++ b/translations/no/2-Regression/2-Data/README.md @@ -0,0 +1,226 @@ + +# Bygg en regresjonsmodell med Scikit-learn: forbered og visualiser data + +![Infografikk for datavisualisering](../../../../2-Regression/2-Data/images/data-visualization.png) + +Infografikk av [Dasani Madipalli](https://twitter.com/dasani_decoded) + +## [Quiz før forelesning](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Denne leksjonen er tilgjengelig i R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) + +## Introduksjon + +Nå som du har satt opp verktøyene du trenger for å begynne å bygge maskinlæringsmodeller med Scikit-learn, er du klar til å begynne å stille spørsmål til dataene dine. Når du jobber med data og bruker ML-løsninger, er det svært viktig å forstå hvordan du stiller de riktige spørsmålene for å utnytte potensialet i datasettet ditt. + +I denne leksjonen vil du lære: + +- Hvordan forberede dataene dine for modellbygging. +- Hvordan bruke Matplotlib til datavisualisering. + +## Stille de riktige spørsmålene til dataene dine + +Spørsmålet du ønsker svar på vil avgjøre hvilken type ML-algoritmer du vil bruke. Og kvaliteten på svaret du får tilbake vil være sterkt avhengig av kvaliteten på dataene dine. + +Ta en titt på [dataene](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) som er gitt for denne leksjonen. Du kan åpne denne .csv-filen i VS Code. Et raskt blikk viser umiddelbart at det finnes tomme felter og en blanding av tekst og numeriske data. Det er også en merkelig kolonne kalt 'Package' hvor dataene er en blanding av 'sacks', 'bins' og andre verdier. Dataene er faktisk litt rotete. + +[![ML for nybegynnere - Hvordan analysere og rense et datasett](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML for nybegynnere - Hvordan analysere og rense et datasett") + +> 🎥 Klikk på bildet over for en kort video som viser hvordan du forbereder dataene for denne leksjonen. + +Det er faktisk ikke veldig vanlig å få et datasett som er helt klart til bruk for å lage en ML-modell rett ut av boksen. I denne leksjonen vil du lære hvordan du forbereder et rådatasett ved hjelp av standard Python-biblioteker. Du vil også lære ulike teknikker for å visualisere dataene. + +## Case-studie: 'gresskarmarkedet' + +I denne mappen finner du en .csv-fil i rotmappen `data` kalt [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) som inneholder 1757 linjer med data om markedet for gresskar, sortert i grupper etter by. Dette er rådata hentet fra [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) distribuert av United States Department of Agriculture. + +### Forberede data + +Disse dataene er i det offentlige domene. De kan lastes ned i mange separate filer, per by, fra USDA-nettstedet. For å unngå for mange separate filer har vi slått sammen alle bydataene til ett regneark, så vi har allerede _forberedt_ dataene litt. La oss nå ta en nærmere titt på dataene. + +### Gresskardata - tidlige konklusjoner + +Hva legger du merke til med disse dataene? Du har allerede sett at det er en blanding av tekst, tall, tomme felter og merkelige verdier som du må forstå. + +Hvilket spørsmål kan du stille til disse dataene ved hjelp av en regresjonsteknikk? Hva med "Forutsi prisen på et gresskar som selges i løpet av en gitt måned". Når du ser på dataene igjen, er det noen endringer du må gjøre for å skape den datastrukturen som er nødvendig for oppgaven. + +## Øvelse - analyser gresskardataene + +La oss bruke [Pandas](https://pandas.pydata.org/), (navnet står for `Python Data Analysis`) et verktøy som er svært nyttig for å forme data, til å analysere og forberede disse gresskardataene. + +### Først, sjekk for manglende datoer + +Du må først ta steg for å sjekke for manglende datoer: + +1. Konverter datoene til et månedsformat (disse er amerikanske datoer, så formatet er `MM/DD/YYYY`). +2. Ekstraher måneden til en ny kolonne. + +Åpne _notebook.ipynb_-filen i Visual Studio Code og importer regnearket til en ny Pandas dataframe. + +1. Bruk funksjonen `head()` for å se de første fem radene. + + ```python + import pandas as pd + pumpkins = pd.read_csv('../data/US-pumpkins.csv') + pumpkins.head() + ``` + + ✅ Hvilken funksjon ville du brukt for å se de siste fem radene? + +1. Sjekk om det er manglende data i den nåværende dataframen: + + ```python + pumpkins.isnull().sum() + ``` + + Det er manglende data, men kanskje det ikke vil ha betydning for oppgaven. + +1. For å gjøre dataframen din enklere å jobbe med, velg kun de kolonnene du trenger, ved å bruke funksjonen `loc` som henter ut en gruppe rader (gitt som første parameter) og kolonner (gitt som andre parameter) fra den originale dataframen. Uttrykket `:` i eksempelet nedenfor betyr "alle rader". + + ```python + columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] + pumpkins = pumpkins.loc[:, columns_to_select] + ``` + +### Deretter, bestem gjennomsnittsprisen på gresskar + +Tenk på hvordan du kan bestemme gjennomsnittsprisen på et gresskar i en gitt måned. Hvilke kolonner ville du valgt for denne oppgaven? Hint: du trenger 3 kolonner. + +Løsning: ta gjennomsnittet av kolonnene `Low Price` og `High Price` for å fylle den nye kolonnen Price, og konverter Date-kolonnen til kun å vise måneden. Heldigvis, ifølge sjekken ovenfor, er det ingen manglende data for datoer eller priser. + +1. For å beregne gjennomsnittet, legg til følgende kode: + + ```python + price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 + + month = pd.DatetimeIndex(pumpkins['Date']).month + + ``` + + ✅ Du kan gjerne skrive ut data du ønsker å sjekke ved å bruke `print(month)`. + +2. Kopier deretter de konverterte dataene til en ny Pandas dataframe: + + ```python + new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) + ``` + + Hvis du skriver ut dataframen din, vil du se et rent og ryddig datasett som du kan bruke til å bygge din nye regresjonsmodell. + +### Men vent! Det er noe merkelig her + +Hvis du ser på kolonnen `Package`, blir gresskar solgt i mange forskjellige konfigurasjoner. Noen blir solgt i '1 1/9 bushel'-mål, og noen i '1/2 bushel'-mål, noen per gresskar, noen per pund, og noen i store bokser med varierende bredder. + +> Gresskar virker veldig vanskelig å veie konsekvent + +Når du graver i de originale dataene, er det interessant at alt med `Unit of Sale` lik 'EACH' eller 'PER BIN' også har `Package`-typen per tomme, per bin, eller 'each'. Gresskar virker veldig vanskelig å veie konsekvent, så la oss filtrere dem ved å velge kun gresskar med strengen 'bushel' i kolonnen `Package`. + +1. Legg til et filter øverst i filen, under den opprinnelige .csv-importen: + + ```python + pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] + ``` + + Hvis du skriver ut dataene nå, kan du se at du kun får de 415 eller så radene med data som inneholder gresskar per bushel. + +### Men vent! Det er én ting til å gjøre + +La du merke til at bushel-mengden varierer per rad? Du må normalisere prisingen slik at du viser prisen per bushel, så gjør litt matematikk for å standardisere det. + +1. Legg til disse linjene etter blokken som oppretter new_pumpkins-dataframen: + + ```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) + ``` + +✅ Ifølge [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), avhenger vekten av en bushel av typen produkt, siden det er et volummål. "En bushel med tomater, for eksempel, skal veie 56 pund... Blader og grønnsaker tar opp mer plass med mindre vekt, så en bushel med spinat er bare 20 pund." Det er ganske komplisert! La oss ikke bry oss med å gjøre en bushel-til-pund-konvertering, og i stedet prise per bushel. All denne studien av bushels med gresskar viser imidlertid hvor viktig det er å forstå naturen til dataene dine! + +Nå kan du analysere prisingen per enhet basert på deres bushel-mål. Hvis du skriver ut dataene en gang til, kan du se hvordan det er standardisert. + +✅ La du merke til at gresskar som selges per halv-bushel er veldig dyre? Kan du finne ut hvorfor? Hint: små gresskar er mye dyrere enn store, sannsynligvis fordi det er så mange flere av dem per bushel, gitt det ubrukte rommet som tas opp av ett stort hullete pai-gresskar. + +## Visualiseringsstrategier + +En del av rollen til en dataforsker er å demonstrere kvaliteten og naturen til dataene de jobber med. For å gjøre dette lager de ofte interessante visualiseringer, eller diagrammer, grafer og tabeller, som viser ulike aspekter av dataene. På denne måten kan de visuelt vise relasjoner og mangler som ellers er vanskelig å avdekke. + +[![ML for nybegynnere - Hvordan visualisere data med Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML for nybegynnere - Hvordan visualisere data med Matplotlib") + +> 🎥 Klikk på bildet over for en kort video som viser hvordan du visualiserer dataene for denne leksjonen. + +Visualiseringer kan også hjelpe med å avgjøre hvilken maskinlæringsteknikk som er mest passende for dataene. Et spredningsdiagram som ser ut til å følge en linje, for eksempel, indikerer at dataene er en god kandidat for en lineær regresjonsøvelse. + +Et datavisualiseringsbibliotek som fungerer godt i Jupyter-notebooks er [Matplotlib](https://matplotlib.org/) (som du også så i forrige leksjon). + +> Få mer erfaring med datavisualisering i [disse opplæringene](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). + +## Øvelse - eksperimenter med Matplotlib + +Prøv å lage noen grunnleggende diagrammer for å vise den nye dataframen du nettopp opprettet. Hva ville et grunnleggende linjediagram vise? + +1. Importer Matplotlib øverst i filen, under Pandas-importen: + + ```python + import matplotlib.pyplot as plt + ``` + +1. Kjør hele notebooken på nytt for å oppdatere. +1. Nederst i notebooken, legg til en celle for å plotte dataene som en boks: + + ```python + price = new_pumpkins.Price + month = new_pumpkins.Month + plt.scatter(price, month) + plt.show() + ``` + + ![Et spredningsdiagram som viser pris til måned-forhold](../../../../2-Regression/2-Data/images/scatterplot.png) + + Er dette et nyttig diagram? Overrasker noe ved det deg? + + Det er ikke spesielt nyttig, da alt det gjør er å vise dataene dine som en spredning av punkter i en gitt måned. + +### Gjør det nyttig + +For å få diagrammer til å vise nyttige data, må du vanligvis gruppere dataene på en eller annen måte. La oss prøve å lage et diagram hvor y-aksen viser månedene og dataene demonstrerer distribusjonen av data. + +1. Legg til en celle for å lage et gruppert stolpediagram: + + ```python + new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') + plt.ylabel("Pumpkin Price") + ``` + + ![Et stolpediagram som viser pris til måned-forhold](../../../../2-Regression/2-Data/images/barchart.png) + + Dette er en mer nyttig datavisualisering! Det ser ut til å indikere at den høyeste prisen for gresskar forekommer i september og oktober. Stemmer det med forventningene dine? Hvorfor eller hvorfor ikke? + +--- + +## 🚀Utfordring + +Utforsk de forskjellige typene visualiseringer som Matplotlib tilbyr. Hvilke typer er mest passende for regresjonsproblemer? + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang & Selvstudium + +Ta en titt på de mange måtene å visualisere data på. Lag en liste over de ulike bibliotekene som er tilgjengelige og noter hvilke som er best for gitte typer oppgaver, for eksempel 2D-visualiseringer vs. 3D-visualiseringer. Hva oppdager du? + +## Oppgave + +[Utforsk visualisering](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/2-Data/assignment.md b/translations/no/2-Regression/2-Data/assignment.md new file mode 100644 index 000000000..c0fed87c9 --- /dev/null +++ b/translations/no/2-Regression/2-Data/assignment.md @@ -0,0 +1,23 @@ + +# Utforske Visualiseringer + +Det finnes flere forskjellige biblioteker tilgjengelige for datavisualisering. Lag noen visualiseringer ved hjelp av Gresskar-dataene i denne leksjonen med matplotlib og seaborn i en eksempel-notatbok. Hvilke biblioteker er enklest å jobbe med? + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger Forbedring | +| --------- | ------------ | ----------------- | ------------------- | +| | En notatbok er levert med to utforskninger/visualiseringer | En notatbok er levert med én utforskning/visualisering | En notatbok er ikke levert | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/2-Data/solution/Julia/README.md b/translations/no/2-Regression/2-Data/solution/Julia/README.md new file mode 100644 index 000000000..b9abe3546 --- /dev/null +++ b/translations/no/2-Regression/2-Data/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/3-Linear/README.md b/translations/no/2-Regression/3-Linear/README.md new file mode 100644 index 000000000..7ad70c6e9 --- /dev/null +++ b/translations/no/2-Regression/3-Linear/README.md @@ -0,0 +1,380 @@ + +# Bygg en regresjonsmodell med Scikit-learn: regresjon på fire måter + +![Infografikk for lineær vs. polynomisk regresjon](../../../../2-Regression/3-Linear/images/linear-polynomial.png) +> Infografikk av [Dasani Madipalli](https://twitter.com/dasani_decoded) +## [Quiz før forelesning](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Denne leksjonen er også tilgjengelig i R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html) +### Introduksjon + +Så langt har du utforsket hva regresjon er med eksempeldata hentet fra gresskarpris-datasettet som vi skal bruke gjennom hele denne leksjonen. Du har også visualisert det ved hjelp av Matplotlib. + +Nå er du klar til å dykke dypere inn i regresjon for maskinlæring. Mens visualisering hjelper deg med å forstå data, ligger den virkelige kraften i maskinlæring i _å trene modeller_. Modeller trenes på historiske data for automatisk å fange opp datamønstre, og de lar deg forutsi utfall for nye data som modellen ikke har sett før. + +I denne leksjonen vil du lære mer om to typer regresjon: _grunnleggende lineær regresjon_ og _polynomisk regresjon_, sammen med noe av matematikken som ligger til grunn for disse teknikkene. Disse modellene vil hjelpe oss med å forutsi gresskarpriser basert på ulike inngangsdata. + +[![ML for nybegynnere - Forstå lineær regresjon](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "ML for nybegynnere - Forstå lineær regresjon") + +> 🎥 Klikk på bildet over for en kort videooversikt over lineær regresjon. + +> Gjennom hele dette kurset antar vi minimal kunnskap om matematikk og søker å gjøre det tilgjengelig for studenter fra andre felt. Se etter notater, 🧮 utrop, diagrammer og andre læringsverktøy for å hjelpe med forståelsen. + +### Forutsetninger + +Du bør nå være kjent med strukturen til gresskar-datasettet vi undersøker. Du finner det forhåndslastet og forhåndsrenset i denne leksjonens _notebook.ipynb_-fil. I filen vises gresskarprisen per bushel i en ny data frame. Sørg for at du kan kjøre disse notatbøkene i kjerner i Visual Studio Code. + +### Forberedelse + +Som en påminnelse, du laster inn disse dataene for å stille spørsmål til dem. + +- Når er det best å kjøpe gresskar? +- Hvilken pris kan jeg forvente for en kasse med miniatyrgresskar? +- Bør jeg kjøpe dem i halv-bushelkurver eller i 1 1/9 bushel-esker? +La oss fortsette å grave i disse dataene. + +I forrige leksjon opprettet du en Pandas data frame og fylte den med en del av det opprinnelige datasettet, og standardiserte prisen per bushel. Ved å gjøre det var du imidlertid bare i stand til å samle rundt 400 datapunkter, og kun for høstmånedene. + +Ta en titt på dataene som vi har forhåndslastet i denne leksjonens tilhørende notatbok. Dataene er forhåndslastet, og et første spredningsdiagram er laget for å vise månedsdata. Kanskje vi kan få litt mer innsikt i dataene ved å rense dem ytterligere. + +## En lineær regresjonslinje + +Som du lærte i leksjon 1, er målet med en lineær regresjonsøvelse å kunne tegne en linje for å: + +- **Vise variabelsammenhenger**. Vise forholdet mellom variabler +- **Gjøre forutsigelser**. Gjøre nøyaktige forutsigelser om hvor et nytt datapunkt vil falle i forhold til den linjen. + +Det er typisk for **minste kvadraters regresjon** å tegne denne typen linje. Begrepet 'minste kvadrater' betyr at alle datapunktene rundt regresjonslinjen kvadreres og deretter summeres. Ideelt sett er denne summen så liten som mulig, fordi vi ønsker et lavt antall feil, eller `minste kvadrater`. + +Vi gjør dette fordi vi ønsker å modellere en linje som har minst mulig kumulativ avstand fra alle datapunktene våre. Vi kvadrerer også termene før vi legger dem sammen, siden vi er opptatt av størrelsen snarere enn retningen. + +> **🧮 Vis meg matematikken** +> +> Denne linjen, kalt _linjen for beste tilpasning_, kan uttrykkes ved [en ligning](https://en.wikipedia.org/wiki/Simple_linear_regression): +> +> ``` +> Y = a + bX +> ``` +> +> `X` er den 'forklarende variabelen'. `Y` er den 'avhengige variabelen'. Stigningen på linjen er `b`, og `a` er skjæringspunktet med y-aksen, som refererer til verdien av `Y` når `X = 0`. +> +>![beregn stigningen](../../../../2-Regression/3-Linear/images/slope.png) +> +> Først, beregn stigningen `b`. Infografikk av [Jen Looper](https://twitter.com/jenlooper) +> +> Med andre ord, og med henvisning til det opprinnelige spørsmålet om gresskar-dataene: "forutsi prisen på et gresskar per bushel etter måned", ville `X` referere til prisen og `Y` til salgsdatoen. +> +>![fullfør ligningen](../../../../2-Regression/3-Linear/images/calculation.png) +> +> Beregn verdien av Y. Hvis du betaler rundt $4, må det være april! Infografikk av [Jen Looper](https://twitter.com/jenlooper) +> +> Matematikk som beregner linjen må vise stigningen på linjen, som også avhenger av skjæringspunktet, eller hvor `Y` er plassert når `X = 0`. +> +> Du kan se metoden for beregning av disse verdiene på nettstedet [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Besøk også [denne minste kvadraters kalkulatoren](https://www.mathsisfun.com/data/least-squares-calculator.html) for å se hvordan tallverdiene påvirker linjen. + +## Korrelasjon + +Et annet begrep å forstå er **korrelasjonskoeffisienten** mellom gitte X- og Y-variabler. Ved hjelp av et spredningsdiagram kan du raskt visualisere denne koeffisienten. Et diagram med datapunkter spredt i en ryddig linje har høy korrelasjon, men et diagram med datapunkter spredt overalt mellom X og Y har lav korrelasjon. + +En god lineær regresjonsmodell vil være en som har en høy (nærmere 1 enn 0) korrelasjonskoeffisient ved bruk av minste kvadraters regresjonsmetode med en regresjonslinje. + +✅ Kjør notatboken som følger med denne leksjonen, og se på spredningsdiagrammet for måned til pris. Ser dataene som knytter måned til pris for gresskarsalg ut til å ha høy eller lav korrelasjon, ifølge din visuelle tolkning av spredningsdiagrammet? Endrer det seg hvis du bruker en mer detaljert måling i stedet for `Måned`, for eksempel *dag i året* (dvs. antall dager siden begynnelsen av året)? + +I koden nedenfor antar vi at vi har renset dataene og fått en data frame kalt `new_pumpkins`, som ligner på følgende: + +ID | Måned | DagIÅret | Sort | By | Pakke | Lav pris | Høy pris | Pris +---|-------|----------|------|-----|--------|----------|----------|----- +70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 +71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 +72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 +73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545 +74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 + +> Koden for å rense dataene er tilgjengelig i [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb). Vi har utført de samme rensetrinnene som i forrige leksjon, og har beregnet `DagIÅret`-kolonnen ved hjelp av følgende uttrykk: + +```python +day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days) +``` + +Nå som du har en forståelse av matematikken bak lineær regresjon, la oss lage en regresjonsmodell for å se om vi kan forutsi hvilken pakke med gresskar som vil ha de beste prisene. Noen som kjøper gresskar til en høstfest kan ha nytte av denne informasjonen for å optimalisere kjøpene sine. + +## Lete etter korrelasjon + +[![ML for nybegynnere - Lete etter korrelasjon: Nøkkelen til lineær regresjon](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "ML for nybegynnere - Lete etter korrelasjon: Nøkkelen til lineær regresjon") + +> 🎥 Klikk på bildet over for en kort videooversikt over korrelasjon. + +Fra forrige leksjon har du sannsynligvis sett at gjennomsnittsprisen for ulike måneder ser slik ut: + +Gjennomsnittspris per måned + +Dette antyder at det bør være en viss korrelasjon, og vi kan prøve å trene en lineær regresjonsmodell for å forutsi forholdet mellom `Måned` og `Pris`, eller mellom `DagIÅret` og `Pris`. Her er spredningsdiagrammet som viser det sistnevnte forholdet: + +Spredningsdiagram av pris vs. dag i året + +La oss se om det er en korrelasjon ved hjelp av `corr`-funksjonen: + +```python +print(new_pumpkins['Month'].corr(new_pumpkins['Price'])) +print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price'])) +``` + +Det ser ut til at korrelasjonen er ganske liten, -0.15 for `Måned` og -0.17 for `DagIÅret`, men det kan være et annet viktig forhold. Det ser ut til at det er forskjellige prisgrupper som tilsvarer ulike gresskarsorter. For å bekrefte denne hypotesen, la oss plotte hver gresskarkategori med en annen farge. Ved å sende en `ax`-parameter til `scatter`-plottefunksjonen kan vi plotte alle punkter på samme graf: + +```python +ax=None +colors = ['red','blue','green','yellow'] +for i,var in enumerate(new_pumpkins['Variety'].unique()): + df = new_pumpkins[new_pumpkins['Variety']==var] + ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var) +``` + +Spredningsdiagram av pris vs. dag i året + +Vår undersøkelse antyder at sorten har større effekt på den totale prisen enn selve salgsdatoen. Vi kan se dette med et stolpediagram: + +```python +new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar') +``` + +Stolpediagram av pris vs. sort + +La oss for øyeblikket fokusere kun på én gresskarsort, 'pie type', og se hvilken effekt datoen har på prisen: + +```python +pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE'] +pie_pumpkins.plot.scatter('DayOfYear','Price') +``` +Spredningsdiagram av pris vs. dag i året + +Hvis vi nå beregner korrelasjonen mellom `Pris` og `DagIÅret` ved hjelp av `corr`-funksjonen, vil vi få noe som `-0.27` - noe som betyr at det gir mening å trene en prediktiv modell. + +> Før du trener en lineær regresjonsmodell, er det viktig å sørge for at dataene våre er rene. Lineær regresjon fungerer ikke godt med manglende verdier, så det gir mening å fjerne alle tomme celler: + +```python +pie_pumpkins.dropna(inplace=True) +pie_pumpkins.info() +``` + +En annen tilnærming ville være å fylle de tomme verdiene med gjennomsnittsverdier fra den tilsvarende kolonnen. + +## Enkel lineær regresjon + +[![ML for nybegynnere - Lineær og polynomisk regresjon med Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "ML for nybegynnere - Lineær og polynomisk regresjon med Scikit-learn") + +> 🎥 Klikk på bildet over for en kort videooversikt over lineær og polynomisk regresjon. + +For å trene vår lineære regresjonsmodell, vil vi bruke **Scikit-learn**-biblioteket. + +```python +from sklearn.linear_model import LinearRegression +from sklearn.metrics import mean_squared_error +from sklearn.model_selection import train_test_split +``` + +Vi starter med å skille inngangsverdier (funksjoner) og forventet utgang (etikett) i separate numpy-arrays: + +```python +X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1) +y = pie_pumpkins['Price'] +``` + +> Merk at vi måtte utføre `reshape` på inngangsdataene for at pakken for lineær regresjon skulle forstå dem riktig. Lineær regresjon forventer et 2D-array som inngang, hvor hver rad i arrayet tilsvarer en vektor av inngangsfunksjoner. I vårt tilfelle, siden vi bare har én inngang, trenger vi et array med formen N×1, hvor N er datasettets størrelse. + +Deretter må vi dele dataene inn i trenings- og testdatasett, slik at vi kan validere modellen vår etter trening: + +```python +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) +``` + +Til slutt tar det bare to linjer med kode å trene den faktiske lineære regresjonsmodellen. Vi definerer `LinearRegression`-objektet og tilpasser det til dataene våre ved hjelp av `fit`-metoden: + +```python +lin_reg = LinearRegression() +lin_reg.fit(X_train,y_train) +``` + +`LinearRegression`-objektet inneholder etter `fit`-prosessen alle koeffisientene for regresjonen, som kan nås ved hjelp av `.coef_`-egenskapen. I vårt tilfelle er det bare én koeffisient, som bør være rundt `-0.017`. Dette betyr at prisene ser ut til å synke litt over tid, men ikke mye, rundt 2 cent per dag. Vi kan også få tilgang til skjæringspunktet med Y-aksen ved hjelp av `lin_reg.intercept_` - det vil være rundt `21` i vårt tilfelle, noe som indikerer prisen ved begynnelsen av året. + +For å se hvor nøyaktig modellen vår er, kan vi forutsi priser på et testdatasett og deretter måle hvor nærme forutsigelsene våre er de forventede verdiene. Dette kan gjøres ved hjelp av middelkvadratfeil (MSE)-metrikken, som er gjennomsnittet av alle kvadrerte forskjeller mellom forventet og forutsagt verdi. + +```python +pred = lin_reg.predict(X_test) + +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') +``` +Feilen vår ser ut til å være rundt 2 punkter, som er ~17 %. Ikke så bra. En annen indikator på modellkvalitet er **determinasjonskoeffisienten**, som kan beregnes slik: + +```python +score = lin_reg.score(X_train,y_train) +print('Model determination: ', score) +``` +Hvis verdien er 0, betyr det at modellen ikke tar hensyn til inputdata, og fungerer som den *dårligste lineære prediktoren*, som bare er gjennomsnittsverdien av resultatet. Verdien 1 betyr at vi kan perfekt forutsi alle forventede utfall. I vårt tilfelle er koeffisienten rundt 0,06, som er ganske lav. + +Vi kan også plotte testdata sammen med regresjonslinjen for bedre å se hvordan regresjonen fungerer i vårt tilfelle: + +```python +plt.scatter(X_test,y_test) +plt.plot(X_test,pred) +``` + +Lineær regresjon + +## Polynomisk regresjon + +En annen type lineær regresjon er polynomisk regresjon. Selv om det noen ganger er en lineær sammenheng mellom variabler - jo større gresskaret er i volum, jo høyere pris - kan det noen ganger være slik at disse sammenhengene ikke kan plottes som et plan eller en rett linje. + +✅ Her er [noen flere eksempler](https://online.stat.psu.edu/stat501/lesson/9/9.8) på data som kan bruke polynomisk regresjon. + +Se en gang til på sammenhengen mellom dato og pris. Ser dette spredningsdiagrammet ut som det nødvendigvis bør analyseres med en rett linje? Kan ikke priser svinge? I dette tilfellet kan du prøve polynomisk regresjon. + +✅ Polynomier er matematiske uttrykk som kan bestå av én eller flere variabler og koeffisienter. + +Polynomisk regresjon skaper en kurvet linje for bedre å tilpasse seg ikke-lineære data. I vårt tilfelle, hvis vi inkluderer en kvadrert `DayOfYear`-variabel i inputdataene, bør vi kunne tilpasse dataene våre med en parabolsk kurve, som vil ha et minimum på et bestemt punkt i løpet av året. + +Scikit-learn inkluderer en nyttig [pipeline-API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) for å kombinere ulike trinn i databehandlingen. En **pipeline** er en kjede av **estimators**. I vårt tilfelle vil vi lage en pipeline som først legger til polynomiske funksjoner til modellen vår, og deretter trener regresjonen: + +```python +from sklearn.preprocessing import PolynomialFeatures +from sklearn.pipeline import make_pipeline + +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) + +pipeline.fit(X_train,y_train) +``` + +Ved å bruke `PolynomialFeatures(2)` betyr det at vi vil inkludere alle andregrads polynomier fra inputdataene. I vårt tilfelle vil det bare bety `DayOfYear`2, men gitt to inputvariabler X og Y, vil dette legge til X2, XY og Y2. Vi kan også bruke polynomier av høyere grad hvis vi ønsker. + +Pipelines kan brukes på samme måte som det opprinnelige `LinearRegression`-objektet, dvs. vi kan `fit` pipelinen, og deretter bruke `predict` for å få prediksjonsresultatene. Her er grafen som viser testdataene og tilnærmingskurven: + +Polynomisk regresjon + +Ved å bruke polynomisk regresjon kan vi få litt lavere MSE og høyere determinasjon, men ikke betydelig. Vi må ta hensyn til andre funksjoner! + +> Du kan se at de laveste gresskarprisene observeres et sted rundt Halloween. Hvordan kan du forklare dette? + +🎃 Gratulerer, du har nettopp laget en modell som kan hjelpe med å forutsi prisen på pai-gresskar. Du kan sannsynligvis gjenta samme prosedyre for alle gresskartyper, men det ville være tidkrevende. La oss nå lære hvordan vi kan ta gresskarsort i betraktning i modellen vår! + +## Kategoriske funksjoner + +I en ideell verden ønsker vi å kunne forutsi priser for ulike gresskarsorter ved hjelp av samme modell. Imidlertid er `Variety`-kolonnen litt annerledes enn kolonner som `Month`, fordi den inneholder ikke-numeriske verdier. Slike kolonner kalles **kategoriske**. + +[![ML for nybegynnere - Kategoriske funksjoner med lineær regresjon](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML for nybegynnere - Kategoriske funksjoner med lineær regresjon") + +> 🎥 Klikk på bildet over for en kort videooversikt om bruk av kategoriske funksjoner. + +Her kan du se hvordan gjennomsnittsprisen avhenger av sort: + +Gjennomsnittspris etter sort + +For å ta sort i betraktning, må vi først konvertere den til numerisk form, eller **enkode** den. Det finnes flere måter vi kan gjøre dette på: + +* Enkel **numerisk enkoding** vil bygge en tabell over ulike sorter, og deretter erstatte sortnavnet med en indeks i den tabellen. Dette er ikke den beste ideen for lineær regresjon, fordi lineær regresjon tar den faktiske numeriske verdien av indeksen og legger den til resultatet, multiplisert med en koeffisient. I vårt tilfelle er sammenhengen mellom indeksnummeret og prisen tydelig ikke-lineær, selv om vi sørger for at indeksene er ordnet på en spesifikk måte. +* **One-hot enkoding** vil erstatte `Variety`-kolonnen med 4 forskjellige kolonner, én for hver sort. Hver kolonne vil inneholde `1` hvis den tilsvarende raden er av en gitt sort, og `0` ellers. Dette betyr at det vil være fire koeffisienter i lineær regresjon, én for hver gresskarsort, som er ansvarlig for "startpris" (eller rettere sagt "tilleggspris") for den spesifikke sorten. + +Koden nedenfor viser hvordan vi kan one-hot enkode en sort: + +```python +pd.get_dummies(new_pumpkins['Variety']) +``` + + ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE +----|-----------|-----------|--------------------------|---------- +70 | 0 | 0 | 0 | 1 +71 | 0 | 0 | 0 | 1 +... | ... | ... | ... | ... +1738 | 0 | 1 | 0 | 0 +1739 | 0 | 1 | 0 | 0 +1740 | 0 | 1 | 0 | 0 +1741 | 0 | 1 | 0 | 0 +1742 | 0 | 1 | 0 | 0 + +For å trene lineær regresjon ved bruk av one-hot enkodet sort som input, trenger vi bare å initialisere `X` og `y`-dataene korrekt: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) +y = new_pumpkins['Price'] +``` + +Resten av koden er den samme som vi brukte ovenfor for å trene lineær regresjon. Hvis du prøver det, vil du se at den gjennomsnittlige kvadratiske feilen er omtrent den samme, men vi får en mye høyere determinasjonskoeffisient (~77 %). For å få enda mer nøyaktige prediksjoner kan vi ta flere kategoriske funksjoner i betraktning, samt numeriske funksjoner, som `Month` eller `DayOfYear`. For å få én stor funksjonsmatrise kan vi bruke `join`: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] +``` + +Her tar vi også hensyn til `City` og `Package`-type, som gir oss MSE 2,84 (10 %) og determinasjon 0,94! + +## Alt samlet + +For å lage den beste modellen kan vi bruke kombinerte (one-hot enkodede kategoriske + numeriske) data fra eksempelet ovenfor sammen med polynomisk regresjon. Her er den komplette koden for enkelhets skyld: + +```python +# set up training data +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] + +# make train-test split +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + +# setup and train the pipeline +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) +pipeline.fit(X_train,y_train) + +# predict results for test data +pred = pipeline.predict(X_test) + +# calculate MSE and determination +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') + +score = pipeline.score(X_train,y_train) +print('Model determination: ', score) +``` + +Dette bør gi oss den beste determinasjonskoeffisienten på nesten 97 %, og MSE=2,23 (~8 % prediksjonsfeil). + +| Modell | MSE | Determinasjon | +|--------|-----|---------------| +| `DayOfYear` Lineær | 2,77 (17,2 %) | 0,07 | +| `DayOfYear` Polynomisk | 2,73 (17,0 %) | 0,08 | +| `Variety` Lineær | 5,24 (19,7 %) | 0,77 | +| Alle funksjoner Lineær | 2,84 (10,5 %) | 0,94 | +| Alle funksjoner Polynomisk | 2,23 (8,25 %) | 0,97 | + +🏆 Bra jobbet! Du har laget fire regresjonsmodeller i én leksjon, og forbedret modellkvaliteten til 97 %. I den siste delen om regresjon vil du lære om logistisk regresjon for å bestemme kategorier. + +--- +## 🚀Utfordring + +Test flere forskjellige variabler i denne notatboken for å se hvordan korrelasjon samsvarer med modellens nøyaktighet. + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang og selvstudium + +I denne leksjonen lærte vi om lineær regresjon. Det finnes andre viktige typer regresjon. Les om Stepwise, Ridge, Lasso og Elasticnet-teknikker. Et godt kurs for å lære mer er [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning). + +## Oppgave + +[Bygg en modell](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/3-Linear/assignment.md b/translations/no/2-Regression/3-Linear/assignment.md new file mode 100644 index 000000000..ae3f34641 --- /dev/null +++ b/translations/no/2-Regression/3-Linear/assignment.md @@ -0,0 +1,25 @@ + +# Lag en regresjonsmodell + +## Instruksjoner + +I denne leksjonen lærte du hvordan du bygger en modell ved hjelp av både lineær og polynomisk regresjon. Bruk denne kunnskapen til å finne et datasett eller bruk ett av Scikit-learns innebygde datasett for å lage en ny modell. Forklar i notatboken din hvorfor du valgte teknikken du gjorde, og demonstrer modellens nøyaktighet. Hvis den ikke er nøyaktig, forklar hvorfor. + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | ---------------------------------------------------------- | -------------------------- | ------------------------------ | +| | presenterer en fullstendig notatbok med en godt dokumentert løsning | løsningen er ufullstendig | løsningen er mangelfull eller feilaktig | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/3-Linear/solution/Julia/README.md b/translations/no/2-Regression/3-Linear/solution/Julia/README.md new file mode 100644 index 000000000..524a6cbf3 --- /dev/null +++ b/translations/no/2-Regression/3-Linear/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/4-Logistic/README.md b/translations/no/2-Regression/4-Logistic/README.md new file mode 100644 index 000000000..f2f075119 --- /dev/null +++ b/translations/no/2-Regression/4-Logistic/README.md @@ -0,0 +1,408 @@ + +# Logistisk regresjon for å forutsi kategorier + +![Infografikk om logistisk vs. lineær regresjon](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png) + +## [Quiz før forelesning](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Denne leksjonen er tilgjengelig i R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html) + +## Introduksjon + +I denne siste leksjonen om regresjon, en av de grunnleggende _klassiske_ ML-teknikkene, skal vi se nærmere på logistisk regresjon. Du kan bruke denne teknikken til å oppdage mønstre for å forutsi binære kategorier. Er dette godteri sjokolade eller ikke? Er denne sykdommen smittsom eller ikke? Vil denne kunden velge dette produktet eller ikke? + +I denne leksjonen vil du lære: + +- Et nytt bibliotek for datavisualisering +- Teknikker for logistisk regresjon + +✅ Fordyp deg i å arbeide med denne typen regresjon i dette [Learn-modulet](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott) + +## Forutsetning + +Etter å ha jobbet med gresskar-dataene, er vi nå kjent nok med dem til å innse at det finnes én binær kategori vi kan jobbe med: `Color`. + +La oss bygge en logistisk regresjonsmodell for å forutsi, gitt noen variabler, _hvilken farge et gitt gresskar sannsynligvis har_ (oransje 🎃 eller hvit 👻). + +> Hvorfor snakker vi om binær klassifisering i en leksjon om regresjon? Bare av språklig bekvemmelighet, siden logistisk regresjon [egentlig er en klassifiseringsmetode](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), om enn en lineær-basert en. Lær om andre måter å klassifisere data på i neste leksjonsgruppe. + +## Definer spørsmålet + +For vårt formål vil vi uttrykke dette som en binær: 'Hvit' eller 'Ikke hvit'. Det finnes også en 'stripet' kategori i datasettet vårt, men det er få forekomster av den, så vi vil ikke bruke den. Den forsvinner uansett når vi fjerner nullverdier fra datasettet. + +> 🎃 Fun fact: Vi kaller noen ganger hvite gresskar for 'spøkelsesgresskar'. De er ikke veldig lette å skjære ut, så de er ikke like populære som de oransje, men de ser kule ut! Så vi kunne også formulert spørsmålet vårt som: 'Spøkelse' eller 'Ikke spøkelse'. 👻 + +## Om logistisk regresjon + +Logistisk regresjon skiller seg fra lineær regresjon, som du lærte om tidligere, på noen viktige måter. + +[![ML for nybegynnere - Forstå logistisk regresjon for maskinlæringsklassifisering](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "ML for nybegynnere - Forstå logistisk regresjon for maskinlæringsklassifisering") + +> 🎥 Klikk på bildet ovenfor for en kort videooversikt over logistisk regresjon. + +### Binær klassifisering + +Logistisk regresjon tilbyr ikke de samme funksjonene som lineær regresjon. Den førstnevnte gir en prediksjon om en binær kategori ("hvit eller ikke hvit"), mens den sistnevnte er i stand til å forutsi kontinuerlige verdier, for eksempel gitt opprinnelsen til et gresskar og tidspunktet for innhøstingen, _hvor mye prisen vil stige_. + +![Gresskar klassifiseringsmodell](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png) +> Infografikk av [Dasani Madipalli](https://twitter.com/dasani_decoded) + +### Andre klassifiseringer + +Det finnes andre typer logistisk regresjon, inkludert multinomial og ordinal: + +- **Multinomial**, som innebærer å ha mer enn én kategori - "Oransje, Hvit og Stripet". +- **Ordinal**, som innebærer ordnede kategorier, nyttig hvis vi ønsket å ordne resultatene våre logisk, som våre gresskar som er ordnet etter et begrenset antall størrelser (mini, sm, med, lg, xl, xxl). + +![Multinomial vs ordinal regresjon](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png) + +### Variabler trenger IKKE å korrelere + +Husker du hvordan lineær regresjon fungerte bedre med mer korrelerte variabler? Logistisk regresjon er det motsatte - variablene trenger ikke å samsvare. Dette fungerer for disse dataene som har noe svake korrelasjoner. + +### Du trenger mye rene data + +Logistisk regresjon gir mer nøyaktige resultater hvis du bruker mer data; vårt lille datasett er ikke optimalt for denne oppgaven, så husk det. + +[![ML for nybegynnere - Dataanalyse og forberedelse for logistisk regresjon](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "ML for nybegynnere - Dataanalyse og forberedelse for logistisk regresjon") + +> 🎥 Klikk på bildet ovenfor for en kort videooversikt over forberedelse av data for lineær regresjon + +✅ Tenk på hvilke typer data som egner seg godt for logistisk regresjon + +## Øvelse - rydd opp i dataene + +Først, rydd opp i dataene litt, fjern nullverdier og velg bare noen av kolonnene: + +1. Legg til følgende kode: + + ```python + + columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] + pumpkins = full_pumpkins.loc[:, columns_to_select] + + pumpkins.dropna(inplace=True) + ``` + + Du kan alltid ta en titt på din nye dataframe: + + ```python + pumpkins.info + ``` + +### Visualisering - kategorisk plott + +Nå har du lastet opp [startnotatboken](../../../../2-Regression/4-Logistic/notebook.ipynb) med gresskar-data igjen og ryddet den slik at du har et datasett som inneholder noen få variabler, inkludert `Color`. La oss visualisere dataene i notatboken ved hjelp av et annet bibliotek: [Seaborn](https://seaborn.pydata.org/index.html), som er bygget på Matplotlib som vi brukte tidligere. + +Seaborn tilbyr noen smarte måter å visualisere dataene dine på. For eksempel kan du sammenligne distribusjoner av dataene for hver `Variety` og `Color` i et kategorisk plott. + +1. Lag et slikt plott ved å bruke funksjonen `catplot`, med gresskar-dataene `pumpkins`, og spesifisere en fargekartlegging for hver gresskarkategori (oransje eller hvit): + + ```python + import seaborn as sns + + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + + sns.catplot( + data=pumpkins, y="Variety", hue="Color", kind="count", + palette=palette, + ) + ``` + + ![Et rutenett med visualiserte data](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png) + + Ved å observere dataene kan du se hvordan `Color`-dataene relaterer seg til `Variety`. + + ✅ Gitt dette kategoriske plottet, hvilke interessante utforskninger kan du forestille deg? + +### Datapreprosessering: funksjons- og etikettkoding +Datasettet vårt inneholder strengverdier for alle kolonnene. Å jobbe med kategoriske data er intuitivt for mennesker, men ikke for maskiner. Maskinlæringsalgoritmer fungerer godt med tall. Derfor er koding et veldig viktig steg i datapreprosesseringen, siden det lar oss gjøre kategoriske data om til numeriske data, uten å miste informasjon. God koding fører til å bygge en god modell. + +For funksjonskoding finnes det to hovedtyper av kodere: + +1. Ordinal koder: passer godt for ordinale variabler, som er kategoriske variabler der dataene følger en logisk rekkefølge, som kolonnen `Item Size` i datasettet vårt. Den lager en kartlegging slik at hver kategori representeres av et tall, som er rekkefølgen til kategorien i kolonnen. + + ```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. Kategorisk koder: passer godt for nominelle variabler, som er kategoriske variabler der dataene ikke følger en logisk rekkefølge, som alle funksjonene bortsett fra `Item Size` i datasettet vårt. Det er en one-hot encoding, som betyr at hver kategori representeres av en binær kolonne: den kodede variabelen er lik 1 hvis gresskaret tilhører den `Variety` og 0 ellers. + + ```python + from sklearn.preprocessing import OneHotEncoder + + categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] + categorical_encoder = OneHotEncoder(sparse_output=False) + ``` +Deretter brukes `ColumnTransformer` til å kombinere flere kodere i ett enkelt steg og anvende dem på de riktige kolonnene. + +```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) +``` +For å kode etiketten bruker vi scikit-learn-klassen `LabelEncoder`, som er en hjelpeklasse for å normalisere etiketter slik at de bare inneholder verdier mellom 0 og n_classes-1 (her, 0 og 1). + +```python + from sklearn.preprocessing import LabelEncoder + + label_encoder = LabelEncoder() + encoded_label = label_encoder.fit_transform(pumpkins['Color']) +``` +Når vi har kodet funksjonene og etiketten, kan vi slå dem sammen til en ny dataframe `encoded_pumpkins`. + +```python + encoded_pumpkins = encoded_features.assign(Color=encoded_label) +``` +✅ Hva er fordelene med å bruke en ordinal koder for kolonnen `Item Size`? + +### Analyser forholdet mellom variabler + +Nå som vi har forhåndsprosesserte dataene, kan vi analysere forholdet mellom funksjonene og etiketten for å få en idé om hvor godt modellen vil kunne forutsi etiketten gitt funksjonene. +Den beste måten å utføre denne typen analyse på er å plotte dataene. Vi bruker igjen Seaborn-funksjonen `catplot` for å visualisere forholdet mellom `Item Size`, `Variety` og `Color` i et kategorisk plott. For å bedre plotte dataene bruker vi den kodede kolonnen `Item Size` og den ukodede kolonnen `Variety`. + +```python + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size'] + + g = sns.catplot( + data=pumpkins, + x="Item Size", y="Color", row='Variety', + kind="box", orient="h", + sharex=False, margin_titles=True, + height=1.8, aspect=4, palette=palette, + ) + g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6)) + g.set_titles(row_template="{row_name}") +``` +![Et kategorisk plott av visualiserte data](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png) + +### Bruk et swarm-plott + +Siden `Color` er en binær kategori (Hvit eller Ikke), trenger den 'en [spesialisert tilnærming](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) til visualisering'. Det finnes andre måter å visualisere forholdet mellom denne kategorien og andre variabler. + +Du kan visualisere variabler side om side med Seaborn-plott. + +1. Prøv et 'swarm'-plott for å vise distribusjonen av verdier: + + ```python + palette = { + 0: 'orange', + 1: 'wheat' + } + sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette) + ``` + + ![Et swarm-plott av visualiserte data](../../../../2-Regression/4-Logistic/images/swarm_2.png) + +**Vær oppmerksom**: koden ovenfor kan generere en advarsel, siden Seaborn har problemer med å representere så mange datapunkter i et swarm-plott. En mulig løsning er å redusere størrelsen på markøren ved å bruke parameteren 'size'. Vær imidlertid oppmerksom på at dette påvirker lesbarheten til plottet. + +> **🧮 Vis meg matematikken** +> +> Logistisk regresjon baserer seg på konseptet 'maksimal sannsynlighet' ved bruk av [sigmoid-funksjoner](https://wikipedia.org/wiki/Sigmoid_function). En 'Sigmoid-funksjon' på et plott ser ut som en 'S'-form. Den tar en verdi og kartlegger den til et sted mellom 0 og 1. Kurven kalles også en 'logistisk kurve'. Formelen ser slik ut: +> +> ![logistisk funksjon](../../../../2-Regression/4-Logistic/images/sigmoid.png) +> +> der sigmoids midtpunkt befinner seg ved x's 0-punkt, L er kurvens maksimumsverdi, og k er kurvens bratthet. Hvis resultatet av funksjonen er mer enn 0.5, vil etiketten i spørsmålet bli gitt klassen '1' av det binære valget. Hvis ikke, vil den bli klassifisert som '0'. + +## Bygg modellen din + +Å bygge en modell for å finne disse binære klassifiseringene er overraskende enkelt i Scikit-learn. + +[![ML for nybegynnere - Logistisk regresjon for klassifisering av data](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "ML for nybegynnere - Logistisk regresjon for klassifisering av data") + +> 🎥 Klikk på bildet ovenfor for en kort videooversikt over å bygge en lineær regresjonsmodell + +1. Velg variablene du vil bruke i klassifiseringsmodellen din og del opp trenings- og testsett ved å kalle `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. Nå kan du trene modellen din ved å kalle `fit()` med treningsdataene dine, og skrive ut resultatet: + + ```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)) + ``` + + Ta en titt på modellens resultattavle. Det er ikke dårlig, med tanke på at du bare har rundt 1000 rader med data: + + ```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 + ``` + +## Bedre forståelse via en forvirringsmatrise + +Mens du kan få en resultattavlerapport [termer](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) ved å skrive ut elementene ovenfor, kan du kanskje forstå modellen din bedre ved å bruke en [forvirringsmatrise](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) for å hjelpe oss med å forstå hvordan modellen presterer. + +> 🎓 En '[forvirringsmatrise](https://wikipedia.org/wiki/Confusion_matrix)' (eller 'feilmatrise') er en tabell som uttrykker modellens sanne vs. falske positive og negative, og dermed måler nøyaktigheten av prediksjonene. + +1. For å bruke en forvirringsmatrise, kall `confusion_matrix()`: + + ```python + from sklearn.metrics import confusion_matrix + confusion_matrix(y_test, predictions) + ``` + + Ta en titt på modellens forvirringsmatrise: + + ```output + array([[162, 4], + [ 11, 22]]) + ``` + +I Scikit-learn er rader (akse 0) faktiske etiketter og kolonner (akse 1) predikerte etiketter. + +| | 0 | 1 | +| :---: | :---: | :---: | +| 0 | TN | FP | +| 1 | FN | TP | + +Hva skjer her? La oss si at modellen vår blir bedt om å klassifisere gresskar mellom to binære kategorier, kategori 'hvit' og kategori 'ikke-hvit'. + +- Hvis modellen din forutsier et gresskar som ikke hvitt og det faktisk tilhører kategorien 'ikke-hvit', kaller vi det en sann negativ, vist av det øverste venstre tallet. +- Hvis modellen din forutsier et gresskar som hvitt og det faktisk tilhører kategorien 'ikke-hvit', kaller vi det en falsk negativ, vist av det nederste venstre tallet. +- Hvis modellen din forutsier et gresskar som ikke hvitt og det faktisk tilhører kategorien 'hvit', kaller vi det en falsk positiv, vist av det øverste høyre tallet. +- Hvis modellen din forutsier et gresskar som hvitt og det faktisk tilhører kategorien 'hvit', kaller vi det en sann positiv, vist av det nederste høyre tallet. + +Som du kanskje har gjettet, er det å foretrekke å ha et større antall sanne positive og sanne negative og et lavere antall falske positive og falske negative, noe som innebærer at modellen presterer bedre. +Hvordan henger forvirringsmatrisen sammen med presisjon og tilbakekalling? Husk, klassifiseringsrapporten som ble skrevet ut ovenfor viste presisjon (0.85) og tilbakekalling (0.67). + +Presisjon = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461 + +Tilbakekalling = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666 + +✅ Spørsmål: Ifølge forvirringsmatrisen, hvordan gjorde modellen det? Svar: Ikke dårlig; det er et godt antall sanne negative, men også noen få falske negative. + +La oss gå tilbake til begrepene vi så tidligere ved hjelp av forvirringsmatrisens kartlegging av TP/TN og FP/FN: + +🎓 Presisjon: TP/(TP + FP) Andelen relevante instanser blant de hentede instansene (f.eks. hvilke etiketter som ble godt merket) + +🎓 Tilbakekalling: TP/(TP + FN) Andelen relevante instanser som ble hentet, enten de var godt merket eller ikke + +🎓 f1-score: (2 * presisjon * tilbakekalling)/(presisjon + tilbakekalling) Et vektet gjennomsnitt av presisjon og tilbakekalling, der det beste er 1 og det verste er 0 + +🎓 Støtte: Antall forekomster av hver etikett som ble hentet + +🎓 Nøyaktighet: (TP + TN)/(TP + TN + FP + FN) Prosentandelen av etiketter som ble korrekt forutsagt for et utvalg. + +🎓 Makro Gjennomsnitt: Beregningen av det uvektede gjennomsnittet av metrikker for hver etikett, uten å ta hensyn til ubalanse i etiketter. + +🎓 Vektet Gjennomsnitt: Beregningen av gjennomsnittet av metrikker for hver etikett, som tar hensyn til ubalanse i etiketter ved å vekte dem etter deres støtte (antall sanne instanser for hver etikett). + +✅ Kan du tenke deg hvilken metrikk du bør følge med på hvis du vil at modellen din skal redusere antall falske negative? + +## Visualiser ROC-kurven for denne modellen + +[![ML for nybegynnere - Analyse av logistisk regresjonsytelse med ROC-kurver](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML for nybegynnere - Analyse av logistisk regresjonsytelse med ROC-kurver") + + +> 🎥 Klikk på bildet ovenfor for en kort videooversikt over ROC-kurver + +La oss gjøre én visualisering til for å se den såkalte 'ROC'-kurven: + +```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() +``` + +Ved hjelp av Matplotlib, plott modellens [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) eller ROC. ROC-kurver brukes ofte for å få en oversikt over utdataene fra en klassifiserer i form av sanne vs. falske positive. "ROC-kurver har vanligvis sanne positive på Y-aksen, og falske positive på X-aksen." Dermed er brattheten på kurven og avstanden mellom midtlinjen og kurven viktig: du vil ha en kurve som raskt går opp og over linjen. I vårt tilfelle er det falske positive i starten, og deretter går linjen opp og over riktig: + +![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png) + +Til slutt, bruk Scikit-learns [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) for å beregne den faktiske 'Area Under the Curve' (AUC): + +```python +auc = roc_auc_score(y_test,y_scores[:,1]) +print(auc) +``` +Resultatet er `0.9749908725812341`. Siden AUC varierer fra 0 til 1, ønsker du en høy score, ettersom en modell som er 100 % korrekt i sine prediksjoner vil ha en AUC på 1; i dette tilfellet er modellen _ganske god_. + +I fremtidige leksjoner om klassifiseringer vil du lære hvordan du kan iterere for å forbedre modellens resultater. Men for nå, gratulerer! Du har fullført disse regresjonsleksjonene! + +--- +## 🚀Utfordring + +Det er mye mer å utforske når det gjelder logistisk regresjon! Men den beste måten å lære på er å eksperimentere. Finn et datasett som egner seg til denne typen analyse og bygg en modell med det. Hva lærer du? tips: prøv [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) for interessante datasett. + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang & Selvstudium + +Les de første sidene av [denne artikkelen fra Stanford](https://web.stanford.edu/~jurafsky/slp3/5.pdf) om noen praktiske bruksområder for logistisk regresjon. Tenk på oppgaver som egner seg bedre for den ene eller den andre typen regresjonsoppgaver som vi har studert så langt. Hva ville fungert best? + +## Oppgave + +[Prøv denne regresjonen på nytt](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/4-Logistic/assignment.md b/translations/no/2-Regression/4-Logistic/assignment.md new file mode 100644 index 000000000..ec954c29d --- /dev/null +++ b/translations/no/2-Regression/4-Logistic/assignment.md @@ -0,0 +1,25 @@ + +# Prøve på nytt med regresjon + +## Instruksjoner + +I leksjonen brukte du et utvalg av gresskar-dataene. Nå skal du gå tilbake til de originale dataene og prøve å bruke alt, renset og standardisert, for å bygge en logistisk regresjonsmodell. + +## Vurderingskriterier + +| Kriterier | Fremragende | Tilfredsstillende | Trenger forbedring | +| --------- | ---------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- | +| | En notebook presenteres med en godt forklart og velfungerende modell | En notebook presenteres med en modell som fungerer minimalt | En notebook presenteres med en modell som fungerer dårlig eller ingen modell | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/4-Logistic/solution/Julia/README.md b/translations/no/2-Regression/4-Logistic/solution/Julia/README.md new file mode 100644 index 000000000..d4727769f --- /dev/null +++ b/translations/no/2-Regression/4-Logistic/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/2-Regression/README.md b/translations/no/2-Regression/README.md new file mode 100644 index 000000000..292a6245e --- /dev/null +++ b/translations/no/2-Regression/README.md @@ -0,0 +1,54 @@ + +# Regresjonsmodeller for maskinlæring +## Regionalt tema: Regresjonsmodeller for gresskarpriser i Nord-Amerika 🎃 + +I Nord-Amerika blir gresskar ofte skåret ut til skumle ansikter for Halloween. La oss utforske mer om disse fascinerende grønnsakene! + +![jack-o-lanterns](../../../2-Regression/images/jack-o-lanterns.jpg) +> Foto av Beth TeutschmannUnsplash + +## Hva du vil lære + +[![Introduksjon til regresjon](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "Introduksjonsvideo om regresjon - Klikk for å se!") +> 🎥 Klikk på bildet over for en rask introduksjonsvideo til denne leksjonen + +Leksjonene i denne delen dekker typer regresjon i konteksten av maskinlæring. Regresjonsmodeller kan hjelpe med å bestemme _forholdet_ mellom variabler. Denne typen modell kan forutsi verdier som lengde, temperatur eller alder, og dermed avdekke sammenhenger mellom variabler mens den analyserer datapunkter. + +I denne serien av leksjoner vil du oppdage forskjellene mellom lineær og logistisk regresjon, og når du bør velge den ene fremfor den andre. + +[![ML for nybegynnere - Introduksjon til regresjonsmodeller for maskinlæring](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "ML for nybegynnere - Introduksjon til regresjonsmodeller for maskinlæring") + +> 🎥 Klikk på bildet over for en kort video som introduserer regresjonsmodeller. + +I denne gruppen av leksjoner vil du bli satt opp for å begynne med maskinlæringsoppgaver, inkludert konfigurering av Visual Studio Code for å administrere notebooks, det vanlige miljøet for dataforskere. Du vil oppdage Scikit-learn, et bibliotek for maskinlæring, og du vil bygge dine første modeller, med fokus på regresjonsmodeller i dette kapittelet. + +> Det finnes nyttige lavkodeverktøy som kan hjelpe deg med å lære om arbeid med regresjonsmodeller. Prøv [Azure ML for denne oppgaven](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +### Leksjoner + +1. [Verktøyene du trenger](1-Tools/README.md) +2. [Administrere data](2-Data/README.md) +3. [Lineær og polynomisk regresjon](3-Linear/README.md) +4. [Logistisk regresjon](4-Logistic/README.md) + +--- +### Krediteringer + +"ML med regresjon" ble skrevet med ♥️ av [Jen Looper](https://twitter.com/jenlooper) + +♥️ Quiz-bidragsytere inkluderer: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) og [Ornella Altunyan](https://twitter.com/ornelladotcom) + +Gresskardatasettet er foreslått av [dette prosjektet på Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices), og dets data er hentet fra [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) distribuert av United States Department of Agriculture. Vi har lagt til noen punkter rundt farge basert på variasjon for å normalisere distribusjonen. Disse dataene er i det offentlige domene. + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/3-Web-App/1-Web-App/README.md b/translations/no/3-Web-App/1-Web-App/README.md new file mode 100644 index 000000000..ca4a5b331 --- /dev/null +++ b/translations/no/3-Web-App/1-Web-App/README.md @@ -0,0 +1,359 @@ + +# Bygg en webapplikasjon for å bruke en ML-modell + +I denne leksjonen skal du trene en ML-modell på et datasett som er helt utenomjordisk: _UFO-observasjoner fra det siste århundret_, hentet fra NUFORCs database. + +Du vil lære: + +- Hvordan 'pickle' en trent modell +- Hvordan bruke den modellen i en Flask-applikasjon + +Vi fortsetter å bruke notebooks for å rense data og trene modellen vår, men du kan ta prosessen et steg videre ved å utforske hvordan man bruker en modell "ute i det fri", så å si: i en webapplikasjon. + +For å gjøre dette må du bygge en webapplikasjon ved hjelp av Flask. + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Bygge en applikasjon + +Det finnes flere måter å bygge webapplikasjoner som kan bruke maskinlæringsmodeller. Din webarkitektur kan påvirke hvordan modellen din blir trent. Tenk deg at du jobber i en bedrift der data science-gruppen har trent en modell som de vil at du skal bruke i en applikasjon. + +### Vurderinger + +Det er mange spørsmål du må stille: + +- **Er det en webapplikasjon eller en mobilapplikasjon?** Hvis du bygger en mobilapplikasjon eller trenger å bruke modellen i en IoT-sammenheng, kan du bruke [TensorFlow Lite](https://www.tensorflow.org/lite/) og bruke modellen i en Android- eller iOS-applikasjon. +- **Hvor skal modellen ligge?** I skyen eller lokalt? +- **Støtte for offline bruk.** Må applikasjonen fungere offline? +- **Hvilken teknologi ble brukt til å trene modellen?** Den valgte teknologien kan påvirke verktøyene du må bruke. + - **Bruke TensorFlow.** Hvis du trener en modell med TensorFlow, for eksempel, gir det økosystemet muligheten til å konvertere en TensorFlow-modell for bruk i en webapplikasjon ved hjelp av [TensorFlow.js](https://www.tensorflow.org/js/). + - **Bruke PyTorch.** Hvis du bygger en modell med et bibliotek som [PyTorch](https://pytorch.org/), har du muligheten til å eksportere den i [ONNX](https://onnx.ai/) (Open Neural Network Exchange)-format for bruk i JavaScript-webapplikasjoner som kan bruke [Onnx Runtime](https://www.onnxruntime.ai/). Denne muligheten vil bli utforsket i en fremtidig leksjon for en Scikit-learn-trent modell. + - **Bruke Lobe.ai eller Azure Custom Vision.** Hvis du bruker et ML SaaS (Software as a Service)-system som [Lobe.ai](https://lobe.ai/) eller [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) for å trene en modell, gir denne typen programvare måter å eksportere modellen for mange plattformer, inkludert å bygge en skreddersydd API som kan forespørres i skyen av din online-applikasjon. + +Du har også muligheten til å bygge en hel Flask-webapplikasjon som kan trene modellen selv i en nettleser. Dette kan også gjøres ved hjelp av TensorFlow.js i en JavaScript-sammenheng. + +For vårt formål, siden vi har jobbet med Python-baserte notebooks, la oss utforske trinnene du må ta for å eksportere en trent modell fra en slik notebook til et format som kan leses av en Python-bygget webapplikasjon. + +## Verktøy + +For denne oppgaven trenger du to verktøy: Flask og Pickle, begge som kjører på Python. + +✅ Hva er [Flask](https://palletsprojects.com/p/flask/)? Definert som et 'mikro-rammeverk' av sine skapere, gir Flask de grunnleggende funksjonene til webrammeverk ved bruk av Python og en templatemotor for å bygge nettsider. Ta en titt på [denne læringsmodulen](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) for å øve på å bygge med Flask. + +✅ Hva er [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 er et Python-modul som serialiserer og de-serialiserer en Python-objektstruktur. Når du 'pickler' en modell, serialiserer eller flater du ut strukturen dens for bruk på nettet. Vær forsiktig: pickle er ikke iboende sikkert, så vær forsiktig hvis du blir bedt om å 'un-pickle' en fil. En picklet fil har suffikset `.pkl`. + +## Øvelse - rense dataene dine + +I denne leksjonen skal du bruke data fra 80,000 UFO-observasjoner, samlet av [NUFORC](https://nuforc.org) (The National UFO Reporting Center). Disse dataene har noen interessante beskrivelser av UFO-observasjoner, for eksempel: + +- **Lang beskrivelse.** "En mann kommer ut fra en lysstråle som skinner på en gresslette om natten, og han løper mot Texas Instruments parkeringsplass". +- **Kort beskrivelse.** "lysene jaget oss". + +Regnearket [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) inkluderer kolonner om `city`, `state` og `country` der observasjonen fant sted, objektets `shape` og dets `latitude` og `longitude`. + +I den tomme [notebook](../../../../3-Web-App/1-Web-App/notebook.ipynb) som er inkludert i denne leksjonen: + +1. importer `pandas`, `matplotlib` og `numpy` som du gjorde i tidligere leksjoner, og importer UFO-regnearket. Du kan ta en titt på et eksempel på datasettet: + + ```python + import pandas as pd + import numpy as np + + ufos = pd.read_csv('./data/ufos.csv') + ufos.head() + ``` + +1. Konverter UFO-dataene til en liten dataframe med nye titler. Sjekk de unike verdiene i `Country`-feltet. + + ```python + ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) + + ufos.Country.unique() + ``` + +1. Nå kan du redusere mengden data vi trenger å håndtere ved å fjerne eventuelle nullverdier og kun importere observasjoner mellom 1-60 sekunder: + + ```python + ufos.dropna(inplace=True) + + ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] + + ufos.info() + ``` + +1. Importer Scikit-learns `LabelEncoder`-bibliotek for å konvertere tekstverdier for land til et tall: + + ✅ LabelEncoder koder data alfabetisk + + ```python + from sklearn.preprocessing import LabelEncoder + + ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) + + ufos.head() + ``` + + Dataene dine bør se slik ut: + + ```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 + ``` + +## Øvelse - bygg modellen din + +Nå kan du gjøre deg klar til å trene en modell ved å dele dataene inn i trenings- og testgrupper. + +1. Velg de tre funksjonene du vil trene på som din X-vektor, og y-vektoren vil være `Country`. Du vil kunne legge inn `Seconds`, `Latitude` og `Longitude` og få en land-ID tilbake. + + ```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. Tren modellen din ved hjelp av logistisk regresjon: + + ```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)) + ``` + +Nøyaktigheten er ikke dårlig **(rundt 95%)**, ikke overraskende, siden `Country` og `Latitude/Longitude` korrelerer. + +Modellen du opprettet er ikke veldig revolusjonerende, siden du burde kunne utlede et `Country` fra dets `Latitude` og `Longitude`, men det er en god øvelse å prøve å trene fra rådata som du renset, eksporterte, og deretter bruke denne modellen i en webapplikasjon. + +## Øvelse - 'pickle' modellen din + +Nå er det på tide å _pickle_ modellen din! Du kan gjøre det med noen få linjer kode. Når den er _picklet_, last inn den picklete modellen og test den mot et eksempeldataarray som inneholder verdier for sekunder, breddegrad og lengdegrad. + +```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]])) +``` + +Modellen returnerer **'3'**, som er landkoden for Storbritannia. Utrolig! 👽 + +## Øvelse - bygg en Flask-applikasjon + +Nå kan du bygge en Flask-applikasjon for å kalle modellen din og returnere lignende resultater, men på en mer visuelt tiltalende måte. + +1. Start med å opprette en mappe kalt **web-app** ved siden av _notebook.ipynb_-filen der _ufo-model.pkl_-filen ligger. + +1. I den mappen opprett tre flere mapper: **static**, med en mappe **css** inni, og **templates**. Du bør nå ha følgende filer og kataloger: + + ```output + web-app/ + static/ + css/ + templates/ + notebook.ipynb + ufo-model.pkl + ``` + + ✅ Se løsningsmappen for en visning av den ferdige applikasjonen + +1. Den første filen du oppretter i _web-app_-mappen er **requirements.txt**-filen. Som _package.json_ i en JavaScript-applikasjon, lister denne filen opp avhengigheter som kreves av applikasjonen. I **requirements.txt** legg til linjene: + + ```text + scikit-learn + pandas + numpy + flask + ``` + +1. Nå, kjør denne filen ved å navigere til _web-app_: + + ```bash + cd web-app + ``` + +1. I terminalen din, skriv `pip install` for å installere bibliotekene som er oppført i _requirements.txt_: + + ```bash + pip install -r requirements.txt + ``` + +1. Nå er du klar til å opprette tre flere filer for å fullføre applikasjonen: + + 1. Opprett **app.py** i roten. + 2. Opprett **index.html** i _templates_-katalogen. + 3. Opprett **styles.css** i _static/css_-katalogen. + +1. Bygg ut _styles.css_-filen med noen få stiler: + + ```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. Deretter bygger du ut _index.html_-filen: + + ```html + + + + + 🛸 UFO Appearance Prediction! 👽 + + + + +
+ +
+ +

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

+ +
+ + + + +
+ +

{{ prediction_text }}

+ +
+ +
+ + + + ``` + + Ta en titt på templatingen i denne filen. Legg merke til 'mustache'-syntaksen rundt variabler som vil bli levert av applikasjonen, som prediksjonsteksten: `{{}}`. Det er også et skjema som sender en prediksjon til `/predict`-ruten. + + Til slutt er du klar til å bygge Python-filen som driver forbruket av modellen og visningen av prediksjoner: + +1. I `app.py` legg til: + + ```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) + ``` + + > 💡 Tips: når du legger til [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) mens du kjører webapplikasjonen ved hjelp av Flask, vil eventuelle endringer du gjør i applikasjonen bli reflektert umiddelbart uten behov for å starte serveren på nytt. Vær oppmerksom! Ikke aktiver denne modusen i en produksjonsapplikasjon. + +Hvis du kjører `python app.py` eller `python3 app.py` - starter webserveren din opp lokalt, og du kan fylle ut et kort skjema for å få svar på ditt brennende spørsmål om hvor UFO-er har blitt observert! + +Før du gjør det, ta en titt på delene av `app.py`: + +1. Først lastes avhengighetene og applikasjonen starter. +1. Deretter importeres modellen. +1. Deretter rendres index.html på hjemmeruten. + +På `/predict`-ruten skjer flere ting når skjemaet sendes inn: + +1. Skjemavariablene samles og konverteres til et numpy-array. De sendes deretter til modellen, og en prediksjon returneres. +2. Landene som vi ønsker skal vises, rendres på nytt som lesbar tekst fra deres predikerte landkode, og den verdien sendes tilbake til index.html for å bli rendret i templaten. + +Å bruke en modell på denne måten, med Flask og en picklet modell, er relativt enkelt. Det vanskeligste er å forstå hvilken form dataene må ha for å bli sendt til modellen for å få en prediksjon. Det avhenger helt av hvordan modellen ble trent. Denne har tre datapunkter som må legges inn for å få en prediksjon. + +I en profesjonell setting kan du se hvor viktig god kommunikasjon er mellom de som trener modellen og de som bruker den i en web- eller mobilapplikasjon. I vårt tilfelle er det bare én person, deg! + +--- + +## 🚀 Utfordring + +I stedet for å jobbe i en notebook og importere modellen til Flask-applikasjonen, kan du trene modellen direkte i Flask-applikasjonen! Prøv å konvertere Python-koden din i notebooken, kanskje etter at dataene dine er renset, for å trene modellen fra applikasjonen på en rute kalt `train`. Hva er fordeler og ulemper med å bruke denne metoden? + +## [Quiz etter leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang og selvstudium + +Det finnes mange måter å bygge en webapplikasjon for å bruke ML-modeller. Lag en liste over måtene du kan bruke JavaScript eller Python til å bygge en webapplikasjon som utnytter maskinlæring. Tenk på arkitektur: bør modellen bli værende i applikasjonen eller ligge i skyen? Hvis det siste, hvordan ville du få tilgang til den? Tegn opp en arkitekturmodell for en anvendt ML-webløsning. + +## Oppgave + +[Prøv en annen modell](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/3-Web-App/1-Web-App/assignment.md b/translations/no/3-Web-App/1-Web-App/assignment.md new file mode 100644 index 000000000..7bccb7fe8 --- /dev/null +++ b/translations/no/3-Web-App/1-Web-App/assignment.md @@ -0,0 +1,25 @@ + +# Prøv en annen modell + +## Instruksjoner + +Nå som du har bygget en webapplikasjon ved hjelp av en trent regresjonsmodell, bruk en av modellene fra en tidligere leksjon om regresjon for å lage denne webapplikasjonen på nytt. Du kan beholde stilen eller designe den annerledes for å reflektere gresskar-dataene. Vær nøye med å endre inputene slik at de samsvarer med treningsmetoden til modellen din. + +## Vurderingskriterier + +| Kriterier | Fremragende | Tilfredsstillende | Trenger forbedring | +| -------------------------- | ------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------ | +| | Webapplikasjonen fungerer som forventet og er distribuert i skyen | Webapplikasjonen har feil eller gir uventede resultater | Webapplikasjonen fungerer ikke som den skal | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/3-Web-App/README.md b/translations/no/3-Web-App/README.md new file mode 100644 index 000000000..93d32a75b --- /dev/null +++ b/translations/no/3-Web-App/README.md @@ -0,0 +1,35 @@ + +# Bygg en nettapp for å bruke din ML-modell + +I denne delen av læreplanen vil du bli introdusert til et praktisk ML-tema: hvordan du lagrer din Scikit-learn-modell som en fil som kan brukes til å gjøre prediksjoner i en nettapplikasjon. Når modellen er lagret, vil du lære hvordan du bruker den i en nettapp bygget med Flask. Du vil først lage en modell ved hjelp av data som handler om UFO-observasjoner! Deretter vil du bygge en nettapp som lar deg skrive inn et antall sekunder sammen med en breddegrad og en lengdegrad for å forutsi hvilket land som rapporterte å ha sett en UFO. + +![UFO Parkering](../../../3-Web-App/images/ufo.jpg) + +Foto av Michael HerrenUnsplash + +## Leksjoner + +1. [Bygg en nettapp](1-Web-App/README.md) + +## Krediteringer + +"Bygg en nettapp" ble skrevet med ♥️ av [Jen Looper](https://twitter.com/jenlooper). + +♥️ Quizene ble skrevet av Rohan Raj. + +Datasettet er hentet fra [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings). + +Arkitekturen for nettappen ble delvis foreslått av [denne artikkelen](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) og [denne repoen](https://github.com/abhinavsagar/machine-learning-deployment) av Abhinav Sagar. + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/1-Introduction/README.md b/translations/no/4-Classification/1-Introduction/README.md new file mode 100644 index 000000000..175022823 --- /dev/null +++ b/translations/no/4-Classification/1-Introduction/README.md @@ -0,0 +1,313 @@ + +# Introduksjon til klassifisering + +I disse fire leksjonene skal du utforske et grunnleggende fokusområde innen klassisk maskinlæring - _klassifisering_. Vi skal gå gjennom bruken av ulike klassifiseringsalgoritmer med et datasett om alle de fantastiske kjøkkenene i Asia og India. Håper du er sulten! + +![bare en klype!](../../../../4-Classification/1-Introduction/images/pinch.png) + +> Feir pan-asiatiske kjøkken i disse leksjonene! Bilde av [Jen Looper](https://twitter.com/jenlooper) + +Klassifisering er en form for [supervised learning](https://wikipedia.org/wiki/Supervised_learning) som har mye til felles med regresjonsteknikker. Hvis maskinlæring handler om å forutsi verdier eller navn på ting ved hjelp av datasett, faller klassifisering generelt inn i to grupper: _binær klassifisering_ og _multiklasse klassifisering_. + +[![Introduksjon til klassifisering](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Introduksjon til klassifisering") + +> 🎥 Klikk på bildet over for en video: MITs John Guttag introduserer klassifisering + +Husk: + +- **Lineær regresjon** hjalp deg med å forutsi forholdet mellom variabler og lage nøyaktige spådommer om hvor et nytt datapunkt ville falle i forhold til den linjen. For eksempel kunne du forutsi _hva prisen på et gresskar ville være i september vs. desember_. +- **Logistisk regresjon** hjalp deg med å oppdage "binære kategorier": ved dette prisnivået, _er dette gresskaret oransje eller ikke-oransje_? + +Klassifisering bruker ulike algoritmer for å bestemme andre måter å avgjøre en datapunktopps etikett eller klasse. La oss jobbe med dette matlagingsdatasettet for å se om vi, ved å observere en gruppe ingredienser, kan avgjøre hvilket kjøkken de tilhører. + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Denne leksjonen er tilgjengelig i R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html) + +### Introduksjon + +Klassifisering er en av de grunnleggende aktivitetene for maskinlæringsforskere og dataforskere. Fra enkel klassifisering av en binær verdi ("er denne e-posten spam eller ikke?"), til kompleks bildeklassifisering og segmentering ved hjelp av datamaskinsyn, er det alltid nyttig å kunne sortere data i klasser og stille spørsmål om det. + +For å formulere prosessen på en mer vitenskapelig måte, skaper klassifiseringsmetoden din en prediktiv modell som gjør det mulig å kartlegge forholdet mellom inputvariabler og outputvariabler. + +![binær vs. multiklasse klassifisering](../../../../4-Classification/1-Introduction/images/binary-multiclass.png) + +> Binære vs. multiklasse problemer for klassifiseringsalgoritmer å håndtere. Infografikk av [Jen Looper](https://twitter.com/jenlooper) + +Før vi starter prosessen med å rense dataene våre, visualisere dem og forberede dem for våre ML-oppgaver, la oss lære litt om de ulike måtene maskinlæring kan brukes til å klassifisere data. + +Avledet fra [statistikk](https://wikipedia.org/wiki/Statistical_classification), bruker klassifisering med klassisk maskinlæring funksjoner som `smoker`, `weight` og `age` for å avgjøre _sannsynligheten for å utvikle X sykdom_. Som en supervised learning-teknikk, lik de regresjonsøvelsene du utførte tidligere, er dataene dine merket, og ML-algoritmene bruker disse merkene til å klassifisere og forutsi klasser (eller 'funksjoner') i et datasett og tilordne dem til en gruppe eller et utfall. + +✅ Ta et øyeblikk til å forestille deg et datasett om matretter. Hva ville en multiklassemodell kunne svare på? Hva ville en binær modell kunne svare på? Hva om du ville avgjøre om en gitt matrett sannsynligvis bruker bukkehornkløver? Hva om du ville se om du, gitt en pose med stjerneanis, artisjokker, blomkål og pepperrot, kunne lage en typisk indisk rett? + +[![Gale mysteriekurver](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Gale mysteriekurver") + +> 🎥 Klikk på bildet over for en video. Hele premisset for showet 'Chopped' er 'mystery basket', der kokker må lage en rett ut av et tilfeldig utvalg ingredienser. Sikkert en ML-modell ville ha hjulpet! + +## Hei 'klassifiserer' + +Spørsmålet vi ønsker å stille til dette matlagingsdatasettet er faktisk et **multiklasse-spørsmål**, siden vi har flere potensielle nasjonale kjøkken å jobbe med. Gitt en gruppe ingredienser, hvilken av disse mange klassene passer dataene inn i? + +Scikit-learn tilbyr flere forskjellige algoritmer for å klassifisere data, avhengig av hvilken type problem du vil løse. I de neste to leksjonene skal du lære om flere av disse algoritmene. + +## Øvelse - rens og balanser dataene dine + +Den første oppgaven, før du starter dette prosjektet, er å rense og **balansere** dataene dine for å få bedre resultater. Start med den tomme _notebook.ipynb_-filen i roten av denne mappen. + +Det første du må installere er [imblearn](https://imbalanced-learn.org/stable/). Dette er en Scikit-learn-pakke som lar deg bedre balansere dataene (du vil lære mer om denne oppgaven om et øyeblikk). + +1. For å installere `imblearn`, kjør `pip install`, slik: + + ```python + pip install imblearn + ``` + +1. Importer pakkene du trenger for å importere dataene dine og visualisere dem, og importer også `SMOTE` fra `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 + ``` + + Nå er du klar til å lese og importere dataene. + +1. Den neste oppgaven vil være å importere dataene: + + ```python + df = pd.read_csv('../data/cuisines.csv') + ``` + + Ved å bruke `read_csv()` vil innholdet i csv-filen _cusines.csv_ bli lest og plassert i variabelen `df`. + +1. Sjekk formen på dataene: + + ```python + df.head() + ``` + + De første fem radene ser slik ut: + + ```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. Få informasjon om disse dataene ved å kalle `info()`: + + ```python + df.info() + ``` + + Utdataene dine ligner: + + ```output + + RangeIndex: 2448 entries, 0 to 2447 + Columns: 385 entries, Unnamed: 0 to zucchini + dtypes: int64(384), object(1) + memory usage: 7.2+ MB + ``` + +## Øvelse - lære om matretter + +Nå begynner arbeidet å bli mer interessant. La oss oppdage fordelingen av data per kjøkken. + +1. Plott dataene som stolper ved å kalle `barh()`: + + ```python + df.cuisine.value_counts().plot.barh() + ``` + + ![fordeling av matdata](../../../../4-Classification/1-Introduction/images/cuisine-dist.png) + + Det er et begrenset antall kjøkken, men fordelingen av data er ujevn. Du kan fikse det! Før du gjør det, utforsk litt mer. + +1. Finn ut hvor mye data som er tilgjengelig per kjøkken og skriv det ut: + + ```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}') + ``` + + Utdataene ser slik ut: + + ```output + thai df: (289, 385) + japanese df: (320, 385) + chinese df: (442, 385) + indian df: (598, 385) + korean df: (799, 385) + ``` + +## Oppdage ingredienser + +Nå kan du grave dypere i dataene og lære hva som er de typiske ingrediensene per kjøkken. Du bør rense ut gjentakende data som skaper forvirring mellom kjøkken, så la oss lære om dette problemet. + +1. Lag en funksjon `create_ingredient()` i Python for å lage en ingrediens-datasett. Denne funksjonen vil starte med å fjerne en unyttig kolonne og sortere ingredienser etter antall: + + ```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 + ``` + + Nå kan du bruke den funksjonen til å få en idé om de ti mest populære ingrediensene per kjøkken. + +1. Kall `create_ingredient()` og plott det ved å kalle `barh()`: + + ```python + thai_ingredient_df = create_ingredient_df(thai_df) + thai_ingredient_df.head(10).plot.barh() + ``` + + ![thai](../../../../4-Classification/1-Introduction/images/thai.png) + +1. Gjør det samme for de japanske dataene: + + ```python + japanese_ingredient_df = create_ingredient_df(japanese_df) + japanese_ingredient_df.head(10).plot.barh() + ``` + + ![japansk](../../../../4-Classification/1-Introduction/images/japanese.png) + +1. Nå for de kinesiske ingrediensene: + + ```python + chinese_ingredient_df = create_ingredient_df(chinese_df) + chinese_ingredient_df.head(10).plot.barh() + ``` + + ![kinesisk](../../../../4-Classification/1-Introduction/images/chinese.png) + +1. Plott de indiske ingrediensene: + + ```python + indian_ingredient_df = create_ingredient_df(indian_df) + indian_ingredient_df.head(10).plot.barh() + ``` + + ![indisk](../../../../4-Classification/1-Introduction/images/indian.png) + +1. Til slutt, plott de koreanske ingrediensene: + + ```python + korean_ingredient_df = create_ingredient_df(korean_df) + korean_ingredient_df.head(10).plot.barh() + ``` + + ![koreansk](../../../../4-Classification/1-Introduction/images/korean.png) + +1. Nå, fjern de vanligste ingrediensene som skaper forvirring mellom ulike kjøkken, ved å kalle `drop()`: + + Alle elsker ris, hvitløk og ingefær! + + ```python + feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) + labels_df = df.cuisine #.unique() + feature_df.head() + ``` + +## Balanser datasettet + +Nå som du har renset dataene, bruk [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Synthetic Minority Over-sampling Technique" - for å balansere det. + +1. Kall `fit_resample()`, denne strategien genererer nye prøver ved interpolasjon. + + ```python + oversample = SMOTE() + transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df) + ``` + + Ved å balansere dataene dine, vil du få bedre resultater når du klassifiserer dem. Tenk på en binær klassifisering. Hvis mesteparten av dataene dine er én klasse, vil en ML-modell forutsi den klassen oftere, bare fordi det er mer data for den. Å balansere dataene tar skjeve data og hjelper med å fjerne denne ubalansen. + +1. Nå kan du sjekke antall etiketter per ingrediens: + + ```python + print(f'new label count: {transformed_label_df.value_counts()}') + print(f'old label count: {df.cuisine.value_counts()}') + ``` + + Utdataene dine ser slik ut: + + ```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 + ``` + + Dataene er fine og rene, balanserte og veldig delikate! + +1. Det siste trinnet er å lagre de balanserte dataene, inkludert etiketter og funksjoner, i et nytt datasett som kan eksporteres til en fil: + + ```python + transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer') + ``` + +1. Du kan ta en siste titt på dataene ved å bruke `transformed_df.head()` og `transformed_df.info()`. Lagre en kopi av disse dataene for bruk i fremtidige leksjoner: + + ```python + transformed_df.head() + transformed_df.info() + transformed_df.to_csv("../data/cleaned_cuisines.csv") + ``` + + Denne ferske CSV-filen kan nå finnes i rotdata-mappen. + +--- + +## 🚀Utfordring + +Dette pensumet inneholder flere interessante datasett. Grav gjennom `data`-mappene og se om noen inneholder datasett som ville være passende for binær eller multiklasse klassifisering? Hvilke spørsmål ville du stille til dette datasettet? + +## [Quiz etter leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang og selvstudium + +Utforsk SMOTEs API. Hvilke bruksområder er det best egnet for? Hvilke problemer løser det? + +## Oppgave + +[Utforsk klassifiseringsmetoder](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/1-Introduction/assignment.md b/translations/no/4-Classification/1-Introduction/assignment.md new file mode 100644 index 000000000..5621f050f --- /dev/null +++ b/translations/no/4-Classification/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Utforsk klassifiseringsmetoder + +## Instruksjoner + +I [Scikit-learn dokumentasjonen](https://scikit-learn.org/stable/supervised_learning.html) finner du en omfattende liste over måter å klassifisere data på. Gjør en liten skattejakt i disse dokumentene: målet ditt er å finne klassifiseringsmetoder og matche et datasett fra dette pensumet, et spørsmål du kan stille om det, og en klassifiseringsteknikk. Lag et regneark eller en tabell i en .doc-fil og forklar hvordan datasettet kan fungere med klassifiseringsalgoritmen. + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| | et dokument presenteres som gir en oversikt over 5 algoritmer sammen med en klassifiseringsteknikk. Oversikten er godt forklart og detaljert. | et dokument presenteres som gir en oversikt over 3 algoritmer sammen med en klassifiseringsteknikk. Oversikten er godt forklart og detaljert. | et dokument presenteres som gir en oversikt over færre enn tre algoritmer sammen med en klassifiseringsteknikk, og oversikten er verken godt forklart eller detaljert. | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/1-Introduction/solution/Julia/README.md b/translations/no/4-Classification/1-Introduction/solution/Julia/README.md new file mode 100644 index 000000000..7d4d9eb97 --- /dev/null +++ b/translations/no/4-Classification/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/2-Classifiers-1/README.md b/translations/no/4-Classification/2-Classifiers-1/README.md new file mode 100644 index 000000000..4f7eb8140 --- /dev/null +++ b/translations/no/4-Classification/2-Classifiers-1/README.md @@ -0,0 +1,253 @@ + +# Klassifisering av matretter 1 + +I denne leksjonen skal du bruke datasettet du lagret fra forrige leksjon, som inneholder balanserte og rene data om matretter. + +Du vil bruke dette datasettet med ulike klassifiseringsmetoder for å _forutsi en nasjonal matrett basert på en gruppe ingredienser_. Mens du gjør dette, vil du lære mer om hvordan algoritmer kan brukes til klassifiseringsoppgaver. + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) +# Forberedelse + +Forutsatt at du fullførte [Leksjon 1](../1-Introduction/README.md), sørg for at en _cleaned_cuisines.csv_-fil finnes i rotmappen `/data` for disse fire leksjonene. + +## Øvelse - forutsi en nasjonal matrett + +1. Arbeid i denne leksjonens _notebook.ipynb_-mappe, og importer filen sammen med Pandas-biblioteket: + + ```python + import pandas as pd + cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") + cuisines_df.head() + ``` + + Dataen ser slik ut: + +| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | +| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + + +1. Importer nå flere biblioteker: + + ```python + from sklearn.linear_model import LogisticRegression + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + from sklearn.svm import SVC + import numpy as np + ``` + +1. Del X- og y-koordinatene inn i to dataframes for trening. `cuisine` kan være etikett-datasettet: + + ```python + cuisines_label_df = cuisines_df['cuisine'] + cuisines_label_df.head() + ``` + + Det vil se slik ut: + + ```output + 0 indian + 1 indian + 2 indian + 3 indian + 4 indian + Name: cuisine, dtype: object + ``` + +1. Fjern kolonnen `Unnamed: 0` og kolonnen `cuisine` ved å bruke `drop()`. Lagre resten av dataene som trenbare funksjoner: + + ```python + cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) + cuisines_feature_df.head() + ``` + + Funksjonene dine ser slik ut: + +| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | + +Nå er du klar til å trene modellen din! + +## Velge klassifiseringsmetode + +Nå som dataene dine er rene og klare for trening, må du bestemme hvilken algoritme du skal bruke til oppgaven. + +Scikit-learn grupperer klassifisering under Supervised Learning, og i den kategorien finner du mange måter å klassifisere på. [Utvalget](https://scikit-learn.org/stable/supervised_learning.html) kan virke overveldende ved første øyekast. Følgende metoder inkluderer klassifiseringsteknikker: + +- Lineære modeller +- Support Vector Machines +- Stokastisk gradientnedstigning +- Nærmeste naboer +- Gaussiske prosesser +- Beslutningstrær +- Ensemble-metoder (voting Classifier) +- Multiklasse- og multioutput-algoritmer (multiklasse- og multilabel-klassifisering, multiklasse-multioutput-klassifisering) + +> Du kan også bruke [nevrale nettverk til å klassifisere data](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification), men det er utenfor omfanget av denne leksjonen. + +### Hvilken klassifiseringsmetode skal du velge? + +Så, hvilken klassifiseringsmetode bør du velge? Ofte kan det være nyttig å teste flere metoder og se etter gode resultater. Scikit-learn tilbyr en [side-ved-side-sammenligning](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) på et opprettet datasett, som sammenligner KNeighbors, SVC på to måter, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB og QuadraticDiscriminationAnalysis, og viser resultatene visuelt: + +![sammenligning av klassifiseringsmetoder](../../../../4-Classification/2-Classifiers-1/images/comparison.png) +> Diagrammer generert fra Scikit-learns dokumentasjon + +> AutoML løser dette problemet elegant ved å kjøre disse sammenligningene i skyen, slik at du kan velge den beste algoritmen for dataene dine. Prøv det [her](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott) + +### En bedre tilnærming + +En bedre tilnærming enn å gjette vilkårlig er å følge ideene i dette nedlastbare [ML Cheat Sheet](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott). Her oppdager vi at vi har noen valg for vårt multiklasse-problem: + +![jukselapp for multiklasse-problemer](../../../../4-Classification/2-Classifiers-1/images/cheatsheet.png) +> En del av Microsofts Algorithm Cheat Sheet, som beskriver alternativer for multiklasse-klassifisering + +✅ Last ned denne jukselappen, skriv den ut, og heng den på veggen! + +### Resonnement + +La oss se om vi kan resonnere oss frem til ulike tilnærminger gitt de begrensningene vi har: + +- **Nevrale nettverk er for tunge**. Gitt vårt rene, men minimale datasett, og det faktum at vi kjører trening lokalt via notebooks, er nevrale nettverk for tunge for denne oppgaven. +- **Ingen to-klasse klassifiserer**. Vi bruker ikke en to-klasse klassifiserer, så det utelukker one-vs-all. +- **Beslutningstre eller logistisk regresjon kan fungere**. Et beslutningstre kan fungere, eller logistisk regresjon for multiklasse-data. +- **Multiklasse Boosted Decision Trees løser et annet problem**. Multiklasse Boosted Decision Trees er mest egnet for ikke-parametriske oppgaver, f.eks. oppgaver designet for å bygge rangeringer, så det er ikke nyttig for oss. + +### Bruke Scikit-learn + +Vi skal bruke Scikit-learn til å analysere dataene våre. Det finnes imidlertid mange måter å bruke logistisk regresjon i Scikit-learn. Ta en titt på [parametrene du kan sende](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +I hovedsak er det to viktige parametere - `multi_class` og `solver` - som vi må spesifisere når vi ber Scikit-learn om å utføre en logistisk regresjon. `multi_class`-verdien gir en viss oppførsel. Verdien av solver angir hvilken algoritme som skal brukes. Ikke alle solvers kan kombineres med alle `multi_class`-verdier. + +Ifølge dokumentasjonen, i multiklasse-tilfellet, treningsalgoritmen: + +- **Bruker one-vs-rest (OvR)-skjemaet**, hvis `multi_class`-alternativet er satt til `ovr` +- **Bruker kryssentropitap**, hvis `multi_class`-alternativet er satt til `multinomial`. (For øyeblikket støttes `multinomial`-alternativet kun av solverne ‘lbfgs’, ‘sag’, ‘saga’ og ‘newton-cg’.) + +> 🎓 'Skjemaet' her kan enten være 'ovr' (one-vs-rest) eller 'multinomial'. Siden logistisk regresjon egentlig er designet for å støtte binær klassifisering, lar disse skjemaene den håndtere multiklasse-klassifiseringsoppgaver bedre. [kilde](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/) + +> 🎓 'Solver' er definert som "algoritmen som skal brukes i optimaliseringsproblemet". [kilde](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +Scikit-learn tilbyr denne tabellen for å forklare hvordan solvers håndterer ulike utfordringer presentert av forskjellige typer datastrukturer: + +![solvers](../../../../4-Classification/2-Classifiers-1/images/solvers.png) + +## Øvelse - del dataene + +Vi kan fokusere på logistisk regresjon for vår første treningsrunde siden du nylig lærte om dette i en tidligere leksjon. +Del dataene dine inn i trenings- og testgrupper ved å bruke `train_test_split()`: + +```python +X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) +``` + +## Øvelse - bruk logistisk regresjon + +Siden du bruker multiklasse-tilfellet, må du velge hvilket _skjema_ du skal bruke og hvilken _solver_ du skal sette. Bruk LogisticRegression med en multiklasse-innstilling og **liblinear** solver for å trene. + +1. Opprett en logistisk regresjon med multi_class satt til `ovr` og solver satt til `liblinear`: + + ```python + lr = LogisticRegression(multi_class='ovr',solver='liblinear') + model = lr.fit(X_train, np.ravel(y_train)) + + accuracy = model.score(X_test, y_test) + print ("Accuracy is {}".format(accuracy)) + ``` + + ✅ Prøv en annen solver som `lbfgs`, som ofte er satt som standard +> Merk, bruk Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html)-funksjonen for å flate ut dataene dine når det er nødvendig. +Nøyaktigheten er god på over **80%**! + +1. Du kan se denne modellen i aksjon ved å teste én rad med data (#50): + + ```python + print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') + print(f'cuisine: {y_test.iloc[50]}') + ``` + + Resultatet skrives ut: + + ```output + ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') + cuisine: indian + ``` + + ✅ Prøv et annet radnummer og sjekk resultatene + +1. For å gå dypere, kan du sjekke nøyaktigheten til denne prediksjonen: + + ```python + test= X_test.iloc[50].values.reshape(-1, 1).T + proba = model.predict_proba(test) + classes = model.classes_ + resultdf = pd.DataFrame(data=proba, columns=classes) + + topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) + topPrediction.head() + ``` + + Resultatet skrives ut - indisk mat er modellens beste gjetning, med høy sannsynlighet: + + | | 0 | + | -------: | -------: | + | indian | 0.715851 | + | chinese | 0.229475 | + | japanese | 0.029763 | + | korean | 0.017277 | + | thai | 0.007634 | + + ✅ Kan du forklare hvorfor modellen er ganske sikker på at dette er indisk mat? + +1. Få mer detaljert informasjon ved å skrive ut en klassifikasjonsrapport, slik du gjorde i regresjonsleksjonene: + + ```python + y_pred = model.predict(X_test) + print(classification_report(y_test,y_pred)) + ``` + + | | presisjon | recall | f1-score | støtte | + | ------------ | --------- | ------ | -------- | ------ | + | chinese | 0.73 | 0.71 | 0.72 | 229 | + | indian | 0.91 | 0.93 | 0.92 | 254 | + | japanese | 0.70 | 0.75 | 0.72 | 220 | + | korean | 0.86 | 0.76 | 0.81 | 242 | + | thai | 0.79 | 0.85 | 0.82 | 254 | + | nøyaktighet | 0.80 | 1199 | | | + | makro snitt | 0.80 | 0.80 | 0.80 | 1199 | + | vektet snitt | 0.80 | 0.80 | 0.80 | 1199 | + +## 🚀Utfordring + +I denne leksjonen brukte du de rensede dataene dine til å bygge en maskinlæringsmodell som kan forutsi en nasjonal matrett basert på en rekke ingredienser. Ta deg tid til å lese gjennom de mange alternativene Scikit-learn tilbyr for å klassifisere data. Gå dypere inn i konseptet 'solver' for å forstå hva som skjer i bakgrunnen. + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang & Selvstudium + +Grav litt dypere i matematikken bak logistisk regresjon i [denne leksjonen](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf) +## Oppgave + +[Studer solverne](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/2-Classifiers-1/assignment.md b/translations/no/4-Classification/2-Classifiers-1/assignment.md new file mode 100644 index 000000000..0146f8081 --- /dev/null +++ b/translations/no/4-Classification/2-Classifiers-1/assignment.md @@ -0,0 +1,23 @@ + +# Studer løserne +## Instruksjoner + +I denne leksjonen lærte du om de ulike løserne som kombinerer algoritmer med en maskinlæringsprosess for å skape en nøyaktig modell. Gå gjennom løserne som er oppført i leksjonen og velg to. Med dine egne ord, sammenlign og kontraster disse to løserne. Hvilken type problem adresserer de? Hvordan fungerer de med ulike datastrukturer? Hvorfor ville du valgt den ene fremfor den andre? +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------- | +| | En .doc-fil presenteres med to avsnitt, ett om hver løser, som sammenligner dem gjennomtenkt. | En .doc-fil presenteres med kun ett avsnitt | Oppgaven er ufullstendig | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/2-Classifiers-1/solution/Julia/README.md b/translations/no/4-Classification/2-Classifiers-1/solution/Julia/README.md new file mode 100644 index 000000000..676b1899a --- /dev/null +++ b/translations/no/4-Classification/2-Classifiers-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/3-Classifiers-2/README.md b/translations/no/4-Classification/3-Classifiers-2/README.md new file mode 100644 index 000000000..1597f23ef --- /dev/null +++ b/translations/no/4-Classification/3-Classifiers-2/README.md @@ -0,0 +1,249 @@ + +# Klassifisering av matretter 2 + +I denne andre leksjonen om klassifisering vil du utforske flere måter å klassifisere numeriske data på. Du vil også lære om konsekvensene ved å velge én klassifikator fremfor en annen. + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +### Forutsetninger + +Vi antar at du har fullført de tidligere leksjonene og har et renset datasett i `data`-mappen kalt _cleaned_cuisines.csv_ i roten av denne 4-leksjonsmappen. + +### Forberedelse + +Vi har lastet inn filen din _notebook.ipynb_ med det rensede datasettet og har delt det inn i X- og y-dataframes, klare for modellbyggingsprosessen. + +## Et klassifiseringskart + +Tidligere lærte du om de ulike alternativene du har når du klassifiserer data ved hjelp av Microsofts jukselapp. Scikit-learn tilbyr en lignende, men mer detaljert jukselapp som kan hjelpe deg med å snevre inn valget av estimatoren (et annet ord for klassifikator): + +![ML-kart fra Scikit-learn](../../../../4-Classification/3-Classifiers-2/images/map.png) +> Tips: [besøk dette kartet online](https://scikit-learn.org/stable/tutorial/machine_learning_map/) og klikk langs stien for å lese dokumentasjonen. + +### Planen + +Dette kartet er veldig nyttig når du har en klar forståelse av dataene dine, da du kan 'gå' langs stiene til en beslutning: + +- Vi har >50 prøver +- Vi ønsker å forutsi en kategori +- Vi har merket data +- Vi har færre enn 100K prøver +- ✨ Vi kan velge en Linear SVC +- Hvis det ikke fungerer, siden vi har numeriske data + - Vi kan prøve en ✨ KNeighbors Classifier + - Hvis det ikke fungerer, prøv ✨ SVC og ✨ Ensemble Classifiers + +Dette er en veldig nyttig sti å følge. + +## Øvelse - del opp dataene + +Ved å følge denne stien bør vi starte med å importere noen biblioteker vi skal bruke. + +1. Importer de nødvendige bibliotekene: + + ```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. Del opp trenings- og testdataene: + + ```python + X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) + ``` + +## Linear SVC klassifikator + +Support-Vector clustering (SVC) er en del av Support-Vector-maskiner-familien av ML-teknikker (lær mer om disse nedenfor). I denne metoden kan du velge en 'kernel' for å bestemme hvordan etikettene skal grupperes. Parameteren 'C' refererer til 'regularisering', som regulerer påvirkningen av parametere. Kernel kan være en av [flere](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); her setter vi den til 'linear' for å sikre at vi bruker lineær SVC. Sannsynlighet er som standard satt til 'false'; her setter vi den til 'true' for å samle sannsynlighetsestimater. Vi setter den tilfeldige tilstanden til '0' for å blande dataene for å få sannsynligheter. + +### Øvelse - bruk en lineær SVC + +Start med å lage en array av klassifikatorer. Du vil legge til gradvis i denne arrayen mens vi tester. + +1. Start med en Linear SVC: + + ```python + C = 10 + # Create different classifiers. + classifiers = { + 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0) + } + ``` + +2. Tren modellen din ved hjelp av Linear SVC og skriv ut en rapport: + + ```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)) + ``` + + Resultatet er ganske bra: + + ```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 klassifikator + +K-Neighbors er en del av "neighbors"-familien av ML-metoder, som kan brukes til både overvåket og ikke-overvåket læring. I denne metoden opprettes et forhåndsdefinert antall punkter, og data samles rundt disse punktene slik at generaliserte etiketter kan forutsies for dataene. + +### Øvelse - bruk K-Neighbors klassifikator + +Den forrige klassifikatoren var god og fungerte bra med dataene, men kanskje vi kan få bedre nøyaktighet. Prøv en K-Neighbors klassifikator. + +1. Legg til en linje i klassifikator-arrayen din (legg til en komma etter Linear SVC-elementet): + + ```python + 'KNN classifier': KNeighborsClassifier(C), + ``` + + Resultatet er litt dårligere: + + ```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 + ``` + + ✅ Lær om [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) + +## Support Vector Classifier + +Support-Vector klassifikatorer er en del av [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine)-familien av ML-metoder som brukes til klassifiserings- og regresjonsoppgaver. SVMs "kartlegger treningsprøver til punkter i rommet" for å maksimere avstanden mellom to kategorier. Påfølgende data kartlegges inn i dette rommet slik at deres kategori kan forutsies. + +### Øvelse - bruk en Support Vector Classifier + +La oss prøve å få litt bedre nøyaktighet med en Support Vector Classifier. + +1. Legg til en komma etter K-Neighbors-elementet, og legg deretter til denne linjen: + + ```python + 'SVC': SVC(), + ``` + + Resultatet er ganske bra! + + ```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 + ``` + + ✅ Lær om [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm) + +## Ensemble Classifiers + +La oss følge stien helt til slutten, selv om den forrige testen var ganske bra. La oss prøve noen 'Ensemble Classifiers', spesielt Random Forest og AdaBoost: + +```python + 'RFST': RandomForestClassifier(n_estimators=100), + 'ADA': AdaBoostClassifier(n_estimators=100) +``` + +Resultatet er veldig bra, spesielt for 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 +``` + +✅ Lær om [Ensemble Classifiers](https://scikit-learn.org/stable/modules/ensemble.html) + +Denne metoden for maskinlæring "kombinerer prediksjonene fra flere base-estimatorer" for å forbedre modellens kvalitet. I vårt eksempel brukte vi Random Trees og AdaBoost. + +- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), en gjennomsnittsmetode, bygger en 'skog' av 'beslutningstrær' med innført tilfeldighet for å unngå overtilpasning. Parameteren n_estimators er satt til antall trær. + +- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) tilpasser en klassifikator til et datasett og deretter tilpasser kopier av den klassifikatoren til det samme datasettet. Den fokuserer på vektene til feilklassifiserte elementer og justerer tilpasningen for neste klassifikator for å korrigere. + +--- + +## 🚀Utfordring + +Hver av disse teknikkene har et stort antall parametere som du kan justere. Undersøk standardparametrene for hver av dem og tenk på hva justering av disse parameterne vil bety for modellens kvalitet. + +## [Quiz etter leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang og selvstudium + +Det er mye sjargong i disse leksjonene, så ta et øyeblikk til å gå gjennom [denne listen](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) med nyttig terminologi! + +## Oppgave + +[Parameterlek](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/3-Classifiers-2/assignment.md b/translations/no/4-Classification/3-Classifiers-2/assignment.md new file mode 100644 index 000000000..3994d882b --- /dev/null +++ b/translations/no/4-Classification/3-Classifiers-2/assignment.md @@ -0,0 +1,25 @@ + +# Parameterlek + +## Instruksjoner + +Det finnes mange parametere som er satt som standard når man jobber med disse klassifiseringsmodellene. Intellisense i VS Code kan hjelpe deg med å utforske dem. Velg en av ML-klassifiseringsteknikkene i denne leksjonen og tren modellene på nytt ved å justere ulike parametere. Lag en notebook som forklarer hvorfor noen endringer forbedrer modellkvaliteten, mens andre forverrer den. Vær detaljert i svaret ditt. + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | -------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ---------------------------- | +| | En notebook presenteres med en fullt utviklet klassifiseringsmodell, hvor parametere er justert og endringer forklart i tekstbokser | En notebook er delvis presentert eller dårlig forklart | En notebook er feilaktig eller mangelfull | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/3-Classifiers-2/solution/Julia/README.md b/translations/no/4-Classification/3-Classifiers-2/solution/Julia/README.md new file mode 100644 index 000000000..7358749e8 --- /dev/null +++ b/translations/no/4-Classification/3-Classifiers-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/4-Applied/README.md b/translations/no/4-Classification/4-Applied/README.md new file mode 100644 index 000000000..856f06f76 --- /dev/null +++ b/translations/no/4-Classification/4-Applied/README.md @@ -0,0 +1,329 @@ + +# Bygg en webapp for matanbefalinger + +I denne leksjonen skal du bygge en klassifiseringsmodell ved hjelp av noen av teknikkene du har lært i tidligere leksjoner, samt det deilige matdatasettet som har blitt brukt gjennom denne serien. I tillegg skal du lage en liten webapp for å bruke en lagret modell, ved hjelp av Onnx sin web-runtime. + +En av de mest nyttige praktiske bruksområdene for maskinlæring er å lage anbefalingssystemer, og du kan ta det første steget i den retningen i dag! + +[![Presentere denne webappen](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Applied ML") + +> 🎥 Klikk på bildet over for en video: Jen Looper lager en webapp ved hjelp av klassifisert matdata + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +I denne leksjonen vil du lære: + +- Hvordan bygge en modell og lagre den som en Onnx-modell +- Hvordan bruke Netron for å inspisere modellen +- Hvordan bruke modellen din i en webapp for inferens + +## Bygg modellen din + +Å bygge anvendte ML-systemer er en viktig del av å utnytte disse teknologiene for dine forretningssystemer. Du kan bruke modeller i webapplikasjonene dine (og dermed bruke dem i en offline-kontekst om nødvendig) ved hjelp av Onnx. + +I en [tidligere leksjon](../../3-Web-App/1-Web-App/README.md) bygde du en regresjonsmodell om UFO-observasjoner, "picklet" den, og brukte den i en Flask-app. Selv om denne arkitekturen er veldig nyttig å kjenne til, er det en full-stack Python-app, og kravene dine kan inkludere bruk av en JavaScript-applikasjon. + +I denne leksjonen kan du bygge et grunnleggende JavaScript-basert system for inferens. Først må du imidlertid trene en modell og konvertere den for bruk med Onnx. + +## Øvelse - tren klassifiseringsmodell + +Først, tren en klassifiseringsmodell ved hjelp av det rensede matdatasettet vi brukte. + +1. Start med å importere nyttige biblioteker: + + ```python + !pip install skl2onnx + import pandas as pd + ``` + + Du trenger '[skl2onnx](https://onnx.ai/sklearn-onnx/)' for å hjelpe med å konvertere Scikit-learn-modellen din til Onnx-format. + +1. Deretter, arbeid med dataene dine på samme måte som du gjorde i tidligere leksjoner, ved å lese en CSV-fil med `read_csv()`: + + ```python + data = pd.read_csv('../data/cleaned_cuisines.csv') + data.head() + ``` + +1. Fjern de to første unødvendige kolonnene og lagre de gjenværende dataene som 'X': + + ```python + X = data.iloc[:,2:] + X.head() + ``` + +1. Lagre etikettene som 'y': + + ```python + y = data[['cuisine']] + y.head() + + ``` + +### Start treningsrutinen + +Vi skal bruke 'SVC'-biblioteket som har god nøyaktighet. + +1. Importer de relevante bibliotekene fra 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. Del opp trenings- og testsett: + + ```python + X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3) + ``` + +1. Bygg en SVC-klassifiseringsmodell slik du gjorde i den forrige leksjonen: + + ```python + model = SVC(kernel='linear', C=10, probability=True,random_state=0) + model.fit(X_train,y_train.values.ravel()) + ``` + +1. Test modellen din ved å kalle `predict()`: + + ```python + y_pred = model.predict(X_test) + ``` + +1. Skriv ut en klassifiseringsrapport for å sjekke modellens kvalitet: + + ```python + print(classification_report(y_test,y_pred)) + ``` + + Som vi så tidligere, er nøyaktigheten god: + + ```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 + ``` + +### Konverter modellen din til Onnx + +Sørg for å gjøre konverteringen med riktig Tensor-nummer. Dette datasettet har 380 ingredienser oppført, så du må notere det nummeret i `FloatTensorType`: + +1. Konverter med et tensor-nummer på 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. Lag onx-filen og lagre den som **model.onnx**: + + ```python + onx = convert_sklearn(model, initial_types=initial_type, options=options) + with open("./model.onnx", "wb") as f: + f.write(onx.SerializeToString()) + ``` + + > Merk, du kan sende inn [alternativer](https://onnx.ai/sklearn-onnx/parameterized.html) i konverteringsskriptet ditt. I dette tilfellet sendte vi inn 'nocl' som True og 'zipmap' som False. Siden dette er en klassifiseringsmodell, har du muligheten til å fjerne ZipMap som produserer en liste med ordbøker (ikke nødvendig). `nocl` refererer til klasseinformasjon som inkluderes i modellen. Reduser modellens størrelse ved å sette `nocl` til 'True'. + +Hvis du kjører hele notebooken, vil du nå bygge en Onnx-modell og lagre den i denne mappen. + +## Vis modellen din + +Onnx-modeller er ikke veldig synlige i Visual Studio Code, men det finnes en veldig god gratis programvare som mange forskere bruker for å visualisere modellen og sikre at den er riktig bygget. Last ned [Netron](https://github.com/lutzroeder/Netron) og åpne model.onnx-filen din. Du kan se den enkle modellen visualisert, med sine 380 input og klassifiserer listet opp: + +![Netron visual](../../../../4-Classification/4-Applied/images/netron.png) + +Netron er et nyttig verktøy for å se modellene dine. + +Nå er du klar til å bruke denne flotte modellen i en webapp. La oss bygge en app som vil være nyttig når du ser i kjøleskapet ditt og prøver å finne ut hvilken kombinasjon av ingredienser du kan bruke for å lage en bestemt matrett, som bestemt av modellen din. + +## Bygg en anbefalingswebapplikasjon + +Du kan bruke modellen din direkte i en webapp. Denne arkitekturen lar deg også kjøre den lokalt og til og med offline om nødvendig. Start med å lage en `index.html`-fil i samme mappe der du lagret `model.onnx`-filen. + +1. I denne filen _index.html_, legg til følgende markup: + + ```html + + +
+ Cuisine Matcher +
+ + ... + + + ``` + +1. Nå, arbeid innenfor `body`-taggene, og legg til litt markup for å vise en liste med avkrysningsbokser som reflekterer noen ingredienser: + + ```html +

Check your refrigerator. What can you create?

+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ +
+ ``` + + Legg merke til at hver avkrysningsboks har en verdi. Dette reflekterer indeksen der ingrediensen finnes i henhold til datasettet. Eple, for eksempel, i denne alfabetiske listen, opptar den femte kolonnen, så verdien er '4' siden vi begynner å telle fra 0. Du kan konsultere [ingredients spreadsheet](../../../../4-Classification/data/ingredient_indexes.csv) for å finne en gitt ingrediens sin indeks. + + Fortsett arbeidet ditt i index.html-filen, og legg til en script-blokk der modellen kalles etter den siste lukkende ``. + +1. Først, importer [Onnx Runtime](https://www.onnxruntime.ai/): + + ```html + + ``` + + > Onnx Runtime brukes for å muliggjøre kjøring av Onnx-modeller på tvers av et bredt spekter av maskinvareplattformer, inkludert optimaliseringer og en API for bruk. + +1. Når Runtime er på plass, kan du kalle den: + + ```html + + ``` + +I denne koden skjer det flere ting: + +1. Du opprettet et array med 380 mulige verdier (1 eller 0) som skal settes og sendes til modellen for inferens, avhengig av om en ingrediens avkrysningsboks er krysset av. +2. Du opprettet et array med avkrysningsbokser og en måte å avgjøre om de var krysset av i en `init`-funksjon som kalles når applikasjonen starter. Når en avkrysningsboks er krysset av, endres `ingredients`-arrayet for å reflektere den valgte ingrediensen. +3. Du opprettet en `testCheckboxes`-funksjon som sjekker om noen avkrysningsboks er krysset av. +4. Du bruker `startInference`-funksjonen når knappen trykkes, og hvis noen avkrysningsboks er krysset av, starter du inferens. +5. Inferensrutinen inkluderer: + 1. Oppsett av en asynkron last av modellen + 2. Opprettelse av en Tensor-struktur som skal sendes til modellen + 3. Opprettelse av 'feeds' som reflekterer `float_input`-input som du opprettet da du trente modellen din (du kan bruke Netron for å verifisere det navnet) + 4. Sending av disse 'feeds' til modellen og venter på et svar + +## Test applikasjonen din + +Åpne en terminalsesjon i Visual Studio Code i mappen der index.html-filen din ligger. Sørg for at du har [http-server](https://www.npmjs.com/package/http-server) installert globalt, og skriv `http-server` ved ledeteksten. En localhost skal åpne seg, og du kan se webappen din. Sjekk hvilken matrett som anbefales basert på ulike ingredienser: + +![ingredient web app](../../../../4-Classification/4-Applied/images/web-app.png) + +Gratulerer, du har laget en 'anbefalings'-webapp med noen få felt. Ta deg tid til å bygge ut dette systemet! + +## 🚀Utfordring + +Webappen din er veldig enkel, så fortsett å bygge den ut ved hjelp av ingredienser og deres indekser fra [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv)-data. Hvilke smakskombinasjoner fungerer for å lage en gitt nasjonalrett? + +## [Quiz etter leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang og selvstudium + +Selv om denne leksjonen bare berørte nytten av å lage et anbefalingssystem for matingredienser, er dette området innen ML-applikasjoner veldig rikt på eksempler. Les mer om hvordan disse systemene bygges: + +- 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/ + +## Oppgave + +[Bygg en ny anbefaler](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/4-Applied/assignment.md b/translations/no/4-Classification/4-Applied/assignment.md new file mode 100644 index 000000000..ee4994c01 --- /dev/null +++ b/translations/no/4-Classification/4-Applied/assignment.md @@ -0,0 +1,25 @@ + +# Bygg en anbefalingsmotor + +## Instruksjoner + +Basert på øvelsene i denne leksjonen, vet du nå hvordan du kan bygge en JavaScript-basert webapp ved hjelp av Onnx Runtime og en konvertert Onnx-modell. Eksperimenter med å lage en ny anbefalingsmotor ved å bruke data fra disse leksjonene eller hentet fra andre kilder (husk å gi kreditt). Du kan for eksempel lage en anbefalingsmotor for kjæledyr basert på ulike personlighetstrekk, eller en anbefalingsmotor for musikksjangre basert på en persons humør. Vær kreativ! + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | ---------------------------------------------------------------------- | ------------------------------------- | --------------------------------- | +| | En webapp og notatbok presenteres, begge godt dokumentert og fungerende | En av dem mangler eller har feil | Begge mangler eller har feil | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/4-Classification/README.md b/translations/no/4-Classification/README.md new file mode 100644 index 000000000..b671e5e7d --- /dev/null +++ b/translations/no/4-Classification/README.md @@ -0,0 +1,41 @@ + +# Komme i gang med klassifisering + +## Regionalt tema: Deilige asiatiske og indiske retter 🍜 + +I Asia og India er mattradisjonene svært mangfoldige og utrolig smakfulle! La oss se på data om regionale retter for å prøve å forstå ingrediensene deres. + +![Thai matselger](../../../4-Classification/images/thai-food.jpg) +> Foto av Lisheng ChangUnsplash + +## Hva du vil lære + +I denne delen vil du bygge videre på din tidligere studie av regresjon og lære om andre klassifikatorer som du kan bruke for å forstå dataene bedre. + +> Det finnes nyttige lavkodeverktøy som kan hjelpe deg med å lære om arbeid med klassifiseringsmodeller. Prøv [Azure ML for denne oppgaven](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Leksjoner + +1. [Introduksjon til klassifisering](1-Introduction/README.md) +2. [Flere klassifikatorer](2-Classifiers-1/README.md) +3. [Enda flere klassifikatorer](3-Classifiers-2/README.md) +4. [Anvendt ML: bygg en webapplikasjon](4-Applied/README.md) + +## Krediteringer + +"Komme i gang med klassifisering" ble skrevet med ♥️ av [Cassie Breviu](https://www.twitter.com/cassiebreviu) og [Jen Looper](https://www.twitter.com/jenlooper) + +Datasettet for de deilige rettene ble hentet fra [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines). + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/5-Clustering/1-Visualize/README.md b/translations/no/5-Clustering/1-Visualize/README.md new file mode 100644 index 000000000..38e170865 --- /dev/null +++ b/translations/no/5-Clustering/1-Visualize/README.md @@ -0,0 +1,347 @@ + +# Introduksjon til klynging + +Klynging er en type [Usupervisert læring](https://wikipedia.org/wiki/Unsupervised_learning) som forutsetter at et datasett er umerket eller at dets input ikke er koblet til forhåndsdefinerte output. Det bruker ulike algoritmer for å sortere gjennom umerket data og gi grupperinger basert på mønstre det oppdager i dataen. + +[![No One Like You av PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You av PSquare") + +> 🎥 Klikk på bildet over for en video. Mens du studerer maskinlæring med klynging, nyt noen nigerianske Dance Hall-låter – dette er en høyt rangert sang fra 2014 av PSquare. + +## [Quiz før forelesning](https://ff-quizzes.netlify.app/en/ml/) + +### Introduksjon + +[Klynging](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) er svært nyttig for datautforskning. La oss se om det kan hjelpe med å oppdage trender og mønstre i hvordan nigerianske publikum konsumerer musikk. + +✅ Ta et øyeblikk til å tenke på bruksområdene for klynging. I hverdagen skjer klynging når du har en haug med klesvask og må sortere familiemedlemmenes klær 🧦👕👖🩲. I dataanalyse skjer klynging når man prøver å analysere en brukers preferanser eller bestemme egenskapene til et umerket datasett. Klynging hjelper på en måte med å skape orden i kaos, som en sokkeskuff. + +[![Introduksjon til ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduksjon til klynging") + +> 🎥 Klikk på bildet over for en video: MITs John Guttag introduserer klynging + +I en profesjonell setting kan klynging brukes til å bestemme ting som markedssegmentering, for eksempel å finne ut hvilke aldersgrupper som kjøper hvilke varer. Et annet bruksområde kan være å oppdage avvik, kanskje for å oppdage svindel i et datasett med kredittkorttransaksjoner. Eller du kan bruke klynging til å identifisere svulster i en samling medisinske skanninger. + +✅ Tenk et øyeblikk på hvordan du kan ha støtt på klynging 'i det virkelige liv', i en bank-, e-handels- eller forretningssetting. + +> 🎓 Interessant nok oppsto klyngeanalyse innenfor feltene antropologi og psykologi på 1930-tallet. Kan du forestille deg hvordan det kan ha blitt brukt? + +Alternativt kan du bruke det til å gruppere søkeresultater – for eksempel etter shoppinglenker, bilder eller anmeldelser. Klynging er nyttig når du har et stort datasett som du vil redusere og utføre mer detaljert analyse på, så teknikken kan brukes til å lære om data før andre modeller bygges. + +✅ Når dataen din er organisert i klynger, tildeler du den en klynge-ID, og denne teknikken kan være nyttig for å bevare et datasets personvern; du kan i stedet referere til et datapunkt med klynge-ID-en, i stedet for med mer avslørende identifiserbare data. Kan du tenke på andre grunner til hvorfor du ville referere til en klynge-ID i stedet for andre elementer i klyngen for å identifisere den? + +Fordyp deg i klyngingsteknikker i denne [Learn-modulen](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) + +## Komme i gang med klynging + +[Scikit-learn tilbyr et stort utvalg](https://scikit-learn.org/stable/modules/clustering.html) av metoder for å utføre klynging. Typen du velger vil avhenge av bruksområdet ditt. Ifølge dokumentasjonen har hver metode ulike fordeler. Her er en forenklet tabell over metodene som støttes av Scikit-learn og deres passende bruksområder: + +| Metodenavn | Bruksområde | +| :--------------------------- | :---------------------------------------------------------------------- | +| K-Means | generell bruk, induktiv | +| Affinity propagation | mange, ujevne klynger, induktiv | +| Mean-shift | mange, ujevne klynger, induktiv | +| Spectral clustering | få, jevne klynger, transduktiv | +| Ward hierarchical clustering | mange, begrensede klynger, transduktiv | +| Agglomerative clustering | mange, begrensede, ikke-Euklidiske avstander, transduktiv | +| DBSCAN | ikke-flat geometri, ujevne klynger, transduktiv | +| OPTICS | ikke-flat geometri, ujevne klynger med variabel tetthet, transduktiv | +| Gaussian mixtures | flat geometri, induktiv | +| BIRCH | stort datasett med uteliggere, induktiv | + +> 🎓 Hvordan vi lager klynger har mye å gjøre med hvordan vi samler datapunktene i grupper. La oss pakke ut litt vokabular: +> +> 🎓 ['Transduktiv' vs. 'induktiv'](https://wikipedia.org/wiki/Transduction_(machine_learning)) +> +> Transduktiv inferens er avledet fra observerte treningscaser som kartlegges til spesifikke testcaser. Induktiv inferens er avledet fra treningscaser som kartlegges til generelle regler som deretter brukes på testcaser. +> +> Et eksempel: Tenk deg at du har et datasett som bare delvis er merket. Noen ting er 'plater', noen 'CD-er', og noen er blanke. Din oppgave er å gi etiketter til de blanke. Hvis du velger en induktiv tilnærming, vil du trene en modell som ser etter 'plater' og 'CD-er', og bruke disse etikettene på din umerkede data. Denne tilnærmingen vil ha problemer med å klassifisere ting som faktisk er 'kassetter'. En transduktiv tilnærming, derimot, håndterer denne ukjente dataen mer effektivt ved å jobbe for å gruppere lignende elementer sammen og deretter bruke en etikett på en gruppe. I dette tilfellet kan klynger reflektere 'runde musikalske ting' og 'firkantede musikalske ting'. +> +> 🎓 ['Ikke-flat' vs. 'flat' geometri](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) +> +> Avledet fra matematisk terminologi, refererer ikke-flat vs. flat geometri til målingen av avstander mellom punkter ved enten 'flat' ([Euklidisk](https://wikipedia.org/wiki/Euclidean_geometry)) eller 'ikke-flat' (ikke-Euklidisk) geometriske metoder. +> +>'Flat' i denne sammenhengen refererer til Euklidisk geometri (deler av dette læres som 'plan' geometri), og ikke-flat refererer til ikke-Euklidisk geometri. Hva har geometri med maskinlæring å gjøre? Vel, som to felt som er forankret i matematikk, må det være en felles måte å måle avstander mellom punkter i klynger, og det kan gjøres på en 'flat' eller 'ikke-flat' måte, avhengig av dataens natur. [Euklidiske avstander](https://wikipedia.org/wiki/Euclidean_distance) måles som lengden på en linjesegment mellom to punkter. [Ikke-Euklidiske avstander](https://wikipedia.org/wiki/Non-Euclidean_geometry) måles langs en kurve. Hvis dataen din, visualisert, ser ut til å ikke eksistere på et plan, kan det hende du må bruke en spesialisert algoritme for å håndtere det. +> +![Flat vs Ikke-flat Geometri Infografikk](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png) +> Infografikk av [Dasani Madipalli](https://twitter.com/dasani_decoded) +> +> 🎓 ['Avstander'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) +> +> Klynger defineres av deres avstandsmatrise, f.eks. avstandene mellom punkter. Denne avstanden kan måles på flere måter. Euklidiske klynger defineres av gjennomsnittet av punktverdiene, og inneholder et 'sentroid' eller midtpunkt. Avstander måles dermed ved avstanden til dette sentroidet. Ikke-Euklidiske avstander refererer til 'clustroids', punktet nærmest andre punkter. Clustroids kan på sin side defineres på ulike måter. +> +> 🎓 ['Begrenset'](https://wikipedia.org/wiki/Constrained_clustering) +> +> [Begrenset klynging](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) introduserer 'semi-supervisert' læring i denne usuperviserte metoden. Forholdene mellom punkter flagges som 'kan ikke kobles' eller 'må kobles', slik at noen regler tvinges på datasettet. +> +>Et eksempel: Hvis en algoritme slippes løs på en batch med umerket eller semi-merket data, kan klyngene den produserer være av dårlig kvalitet. I eksemplet ovenfor kan klyngene gruppere 'runde musikalske ting' og 'firkantede musikalske ting' og 'trekantede ting' og 'kjeks'. Hvis algoritmen får noen begrensninger, eller regler å følge ("elementet må være laget av plast", "elementet må kunne produsere musikk"), kan dette hjelpe med å 'begrense' algoritmen til å ta bedre valg. +> +> 🎓 'Tetthet' +> +> Data som er 'støyete' anses å være 'tett'. Avstandene mellom punkter i hver av klyngene kan vise seg, ved undersøkelse, å være mer eller mindre tette, eller 'trange', og dermed må denne dataen analyseres med den passende klyngemetoden. [Denne artikkelen](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) demonstrerer forskjellen mellom å bruke K-Means klynging vs. HDBSCAN-algoritmer for å utforske et støyete datasett med ujevn klyngetetthet. + +## Klyngealgoritmer + +Det finnes over 100 klyngealgoritmer, og deres bruk avhenger av naturen til dataen som skal analyseres. La oss diskutere noen av de viktigste: + +- **Hierarkisk klynging**. Hvis et objekt klassifiseres basert på dets nærhet til et nærliggende objekt, snarere enn til et som er lenger unna, dannes klynger basert på avstanden mellom medlemmene. Scikit-learns agglomerative klynging er hierarkisk. + + ![Hierarkisk klynging Infografikk](../../../../5-Clustering/1-Visualize/images/hierarchical.png) + > Infografikk av [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Sentroid klynging**. Denne populære algoritmen krever valg av 'k', eller antall klynger som skal dannes, hvoretter algoritmen bestemmer midtpunktet for en klynge og samler data rundt dette punktet. [K-means klynging](https://wikipedia.org/wiki/K-means_clustering) er en populær versjon av sentroid klynging. Midtpunktet bestemmes av nærmeste gjennomsnitt, derav navnet. Den kvadrerte avstanden fra klyngen minimeres. + + ![Sentroid klynging Infografikk](../../../../5-Clustering/1-Visualize/images/centroid.png) + > Infografikk av [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Distribusjonsbasert klynging**. Basert på statistisk modellering, fokuserer distribusjonsbasert klynging på å bestemme sannsynligheten for at et datapunkt tilhører en klynge, og tilordner det deretter. Gaussian mixture-metoder tilhører denne typen. + +- **Tetthetsbasert klynging**. Datapunkter tilordnes klynger basert på deres tetthet, eller deres gruppering rundt hverandre. Datapunkter langt fra gruppen anses som uteliggere eller støy. DBSCAN, Mean-shift og OPTICS tilhører denne typen klynging. + +- **Grid-basert klynging**. For multidimensjonale datasett opprettes et rutenett, og dataen deles mellom rutenettets celler, og skaper dermed klynger. + +## Øvelse – klyng dataen din + +Klynging som teknikk støttes sterkt av god visualisering, så la oss komme i gang med å visualisere musikkdataen vår. Denne øvelsen vil hjelpe oss med å avgjøre hvilken av klyngemetodene vi mest effektivt bør bruke for naturen til denne dataen. + +1. Åpne filen [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) i denne mappen. + +1. Importer pakken `Seaborn` for god visualisering av data. + + ```python + !pip install seaborn + ``` + +1. Legg til musikkdataen fra [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv). Last opp en dataframe med noen data om sangene. Gjør deg klar til å utforske denne dataen ved å importere bibliotekene og skrive ut dataen: + + ```python + import matplotlib.pyplot as plt + import pandas as pd + + df = pd.read_csv("../data/nigerian-songs.csv") + df.head() + ``` + + Sjekk de første linjene med data: + + | | navn | album | artist | artist_top_genre | release_date | lengde | popularitet | dansbarhet | akustisitet | energi | instrumentalisme | livlighet | lydstyrke | talbarhet | tempo | taktart | + | --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ---------- | ------------ | ------ | ---------------- | -------- | -------- | --------- | ------- | -------------- | + | 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternativ 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. Få litt informasjon om dataframe, ved å kalle `info()`: + + ```python + df.info() + ``` + + Utdata ser slik ut: + + ```output + + RangeIndex: 530 entries, 0 to 529 + Data columns (total 16 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 name 530 non-null object + 1 album 530 non-null object + 2 artist 530 non-null object + 3 artist_top_genre 530 non-null object + 4 release_date 530 non-null int64 + 5 length 530 non-null int64 + 6 popularity 530 non-null int64 + 7 danceability 530 non-null float64 + 8 acousticness 530 non-null float64 + 9 energy 530 non-null float64 + 10 instrumentalness 530 non-null float64 + 11 liveness 530 non-null float64 + 12 loudness 530 non-null float64 + 13 speechiness 530 non-null float64 + 14 tempo 530 non-null float64 + 15 time_signature 530 non-null int64 + dtypes: float64(8), int64(4), object(4) + memory usage: 66.4+ KB + ``` + +1. Dobbeltsjekk for nullverdier, ved å kalle `isnull()` og verifisere at summen er 0: + + ```python + df.isnull().sum() + ``` + + Ser bra ut: + + ```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. Beskriv dataen: + + ```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 | + +> 🤔 Hvis vi jobber med clustering, en usupervisert metode som ikke krever merket data, hvorfor viser vi denne dataen med etiketter? I utforskningsfasen av dataen er de nyttige, men de er ikke nødvendige for at clustering-algoritmer skal fungere. Du kan like gjerne fjerne kolonneoverskriftene og referere til dataen med kolonnenummer. + +Se på de generelle verdiene i dataen. Merk at popularitet kan være '0', som viser sanger som ikke har noen rangering. La oss fjerne disse snart. + +1. Bruk et stolpediagram for å finne de mest populære sjangrene: + + ```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') + ``` + + ![mest populære](../../../../5-Clustering/1-Visualize/images/popular.png) + +✅ Hvis du vil se flere toppverdier, endre toppen `[:5]` til en større verdi, eller fjern den for å se alt. + +Merk, når toppsjangeren er beskrevet som 'Missing', betyr det at Spotify ikke klassifiserte den, så la oss fjerne den. + +1. Fjern manglende data ved å filtrere det ut + + ```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') + ``` + + Nå sjekk sjangrene på nytt: + + ![mest populære](../../../../5-Clustering/1-Visualize/images/all-genres.png) + +1. De tre toppsjangrene dominerer datasetet. La oss konsentrere oss om `afro dancehall`, `afropop` og `nigerian pop`, og i tillegg filtrere datasetet for å fjerne alt med en popularitetsverdi på 0 (som betyr at det ikke ble klassifisert med en popularitet i datasetet og kan betraktes som støy for våre formål): + + ```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. Gjør en rask test for å se om dataen korrelerer på noen spesielt sterk måte: + + ```python + corrmat = df.corr(numeric_only=True) + f, ax = plt.subplots(figsize=(12, 9)) + sns.heatmap(corrmat, vmax=.8, square=True) + ``` + + ![korrelasjoner](../../../../5-Clustering/1-Visualize/images/correlation.png) + + Den eneste sterke korrelasjonen er mellom `energy` og `loudness`, noe som ikke er så overraskende, gitt at høy musikk vanligvis er ganske energisk. Ellers er korrelasjonene relativt svake. Det vil være interessant å se hva en clustering-algoritme kan gjøre med denne dataen. + + > 🎓 Merk at korrelasjon ikke innebærer årsakssammenheng! Vi har bevis på korrelasjon, men ingen bevis på årsakssammenheng. En [morsom nettside](https://tylervigen.com/spurious-correlations) har noen visuelle eksempler som understreker dette poenget. + +Er det noen konvergens i dette datasetet rundt en sangs opplevde popularitet og dansbarhet? En FacetGrid viser at det er konsentriske sirkler som stemmer overens, uavhengig av sjanger. Kan det være at nigerianske smaker konvergerer på et visst nivå av dansbarhet for denne sjangeren? + +✅ Prøv forskjellige datapunkter (energy, loudness, speechiness) og flere eller forskjellige musikksjangre. Hva kan du oppdage? Ta en titt på `df.describe()`-tabellen for å se den generelle spredningen av datapunktene. + +### Øvelse - datafordeling + +Er disse tre sjangrene betydelig forskjellige i oppfatningen av deres dansbarhet, basert på deres popularitet? + +1. Undersøk datafordelingen for våre tre toppsjangre for popularitet og dansbarhet langs en gitt x- og y-akse. + + ```python + sns.set_theme(style="ticks") + + g = sns.jointplot( + data=df, + x="popularity", y="danceability", hue="artist_top_genre", + kind="kde", + ) + ``` + + Du kan oppdage konsentriske sirkler rundt et generelt konvergenspunkt, som viser fordelingen av punkter. + + > 🎓 Merk at dette eksemplet bruker en KDE (Kernel Density Estimate)-graf som representerer dataen ved hjelp av en kontinuerlig sannsynlighetstetthetskurve. Dette lar oss tolke data når vi jobber med flere fordelinger. + + Generelt sett er de tre sjangrene løst tilpasset når det gjelder deres popularitet og dansbarhet. Å bestemme klynger i denne løst tilpassede dataen vil være en utfordring: + + ![fordeling](../../../../5-Clustering/1-Visualize/images/distribution.png) + +1. Lag et spredningsdiagram: + + ```python + sns.FacetGrid(df, hue="artist_top_genre", height=5) \ + .map(plt.scatter, "popularity", "danceability") \ + .add_legend() + ``` + + Et spredningsdiagram av de samme aksene viser et lignende mønster av konvergens + + ![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png) + +Generelt, for clustering, kan du bruke spredningsdiagrammer for å vise klynger av data, så det å mestre denne typen visualisering er veldig nyttig. I neste leksjon vil vi ta denne filtrerte dataen og bruke k-means clustering for å oppdage grupper i denne dataen som ser ut til å overlappe på interessante måter. + +--- + +## 🚀Utfordring + +Som forberedelse til neste leksjon, lag et diagram over de forskjellige clustering-algoritmene du kan oppdage og bruke i et produksjonsmiljø. Hvilke typer problemer prøver clustering å adressere? + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang & Selvstudium + +Før du bruker clustering-algoritmer, som vi har lært, er det en god idé å forstå naturen til datasetet ditt. Les mer om dette emnet [her](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) + +[Denne nyttige artikkelen](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) gir deg en oversikt over hvordan forskjellige clustering-algoritmer oppfører seg, gitt forskjellige dataformer. + +## Oppgave + +[Undersøk andre visualiseringer for clustering](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/5-Clustering/1-Visualize/assignment.md b/translations/no/5-Clustering/1-Visualize/assignment.md new file mode 100644 index 000000000..6396a22d8 --- /dev/null +++ b/translations/no/5-Clustering/1-Visualize/assignment.md @@ -0,0 +1,25 @@ + +# Utforsk andre visualiseringer for klynging + +## Instruksjoner + +I denne leksjonen har du jobbet med noen visualiseringsteknikker for å få en forståelse av hvordan du kan plotte dataene dine som forberedelse til klynging. Spesielt er spredningsdiagrammer nyttige for å finne grupper av objekter. Undersøk forskjellige måter og ulike biblioteker for å lage spredningsdiagrammer, og dokumenter arbeidet ditt i en notatbok. Du kan bruke data fra denne leksjonen, andre leksjoner, eller data du selv finner (husk å kreditere kilden i notatboken din). Plot noen data ved hjelp av spredningsdiagrammer og forklar hva du oppdager. + +## Vurderingskriterier + +| Kriterier | Fremragende | Tilfredsstillende | Trenger forbedring | +| --------- | ------------------------------------------------------------- | --------------------------------------------------------------------------------------- | ----------------------------------- | +| | En notatbok presenteres med fem godt dokumenterte spredningsdiagrammer | En notatbok presenteres med færre enn fem spredningsdiagrammer og er mindre godt dokumentert | En ufullstendig notatbok presenteres | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/5-Clustering/1-Visualize/solution/Julia/README.md b/translations/no/5-Clustering/1-Visualize/solution/Julia/README.md new file mode 100644 index 000000000..77649d6cb --- /dev/null +++ b/translations/no/5-Clustering/1-Visualize/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/5-Clustering/2-K-Means/README.md b/translations/no/5-Clustering/2-K-Means/README.md new file mode 100644 index 000000000..0afe2c2cb --- /dev/null +++ b/translations/no/5-Clustering/2-K-Means/README.md @@ -0,0 +1,261 @@ + +# K-Means klynging + +## [Pre-forelesningsquiz](https://ff-quizzes.netlify.app/en/ml/) + +I denne leksjonen vil du lære hvordan du lager klynger ved hjelp av Scikit-learn og det nigerianske musikkdatasettet du importerte tidligere. Vi skal dekke det grunnleggende om K-Means for klynging. Husk at, som du lærte i den forrige leksjonen, finnes det mange måter å jobbe med klynger på, og metoden du bruker avhenger av dataene dine. Vi skal prøve K-Means siden det er den mest vanlige klyngemetoden. La oss komme i gang! + +Begreper du vil lære om: + +- Silhuett-score +- Albuemetoden +- Inertia +- Varians + +## Introduksjon + +[K-Means klynging](https://wikipedia.org/wiki/K-means_clustering) er en metode som stammer fra signalbehandling. Den brukes til å dele og gruppere datasett i 'k' klynger basert på en serie observasjoner. Hver observasjon jobber for å gruppere et gitt datapunkt nærmest sin 'gjennomsnittlige verdi', eller midtpunktet i en klynge. + +Klyngene kan visualiseres som [Voronoi-diagrammer](https://wikipedia.org/wiki/Voronoi_diagram), som inkluderer et punkt (eller 'frø') og dets tilhørende område. + +![voronoi diagram](../../../../5-Clustering/2-K-Means/images/voronoi.png) + +> Infografikk av [Jen Looper](https://twitter.com/jenlooper) + +K-Means klyngingsprosessen [utføres i tre trinn](https://scikit-learn.org/stable/modules/clustering.html#k-means): + +1. Algoritmen velger et k-antall midtpunkter ved å ta prøver fra datasettet. Deretter gjentas følgende: + 1. Den tilordner hver prøve til det nærmeste midtpunktet. + 2. Den lager nye midtpunkter ved å ta gjennomsnittsverdien av alle prøvene som er tilordnet de tidligere midtpunktene. + 3. Deretter beregner den forskjellen mellom de nye og gamle midtpunktene og gjentar til midtpunktene stabiliseres. + +En ulempe med å bruke K-Means er at du må bestemme 'k', altså antallet midtpunkter. Heldigvis kan 'albuemetoden' hjelpe med å estimere en god startverdi for 'k'. Du skal prøve det om et øyeblikk. + +## Forutsetninger + +Du vil jobbe i denne leksjonens [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb)-fil, som inkluderer dataimporten og den innledende rengjøringen du gjorde i forrige leksjon. + +## Øvelse - forberedelse + +Start med å ta en ny titt på sangdataene. + +1. Lag et boksplott ved å kalle `boxplot()` for hver kolonne: + + ```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) + ``` + + Disse dataene er litt støyete: ved å observere hver kolonne som et boksplott kan du se uteliggere. + + ![uteliggere](../../../../5-Clustering/2-K-Means/images/boxplots.png) + +Du kunne gått gjennom datasettet og fjernet disse uteliggerne, men det ville gjort dataene ganske minimale. + +1. For nå, velg hvilke kolonner du vil bruke til klyngingsøvelsen. Velg kolonner med lignende verdier og kod `artist_top_genre`-kolonnen som numeriske data: + + ```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. Nå må du velge hvor mange klynger du vil målrette. Du vet at det er 3 sangsjangre som vi har skilt ut fra datasettet, så la oss prøve med 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 + ``` + +Du ser en matrise som skrives ut med forutsagte klynger (0, 1 eller 2) for hver rad i dataframen. + +1. Bruk denne matrisen til å beregne en 'silhuett-score': + + ```python + from sklearn import metrics + score = metrics.silhouette_score(X, y_cluster_kmeans) + score + ``` + +## Silhuett-score + +Se etter en silhuett-score nærmere 1. Denne scoren varierer fra -1 til 1, og hvis scoren er 1, er klyngen tett og godt adskilt fra andre klynger. En verdi nær 0 representerer overlappende klynger med prøver som er veldig nær beslutningsgrensen til naboklyngene. [(Kilde)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam) + +Vår score er **0,53**, altså midt på treet. Dette indikerer at dataene våre ikke er spesielt godt egnet for denne typen klynging, men la oss fortsette. + +### Øvelse - bygg en modell + +1. Importer `KMeans` og start klyngingsprosessen. + + ```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_) + + ``` + + Det er noen deler her som fortjener en forklaring. + + > 🎓 range: Dette er iterasjonene av klyngingsprosessen. + + > 🎓 random_state: "Bestemmer tilfeldig tallgenerering for initialisering av midtpunkter." [Kilde](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans) + + > 🎓 WCSS: "Summen av kvadrerte avstander innenfor klyngen" måler den kvadrerte gjennomsnittsavstanden for alle punktene innenfor en klynge til klyngens midtpunkt. [Kilde](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce). + + > 🎓 Inertia: K-Means-algoritmer forsøker å velge midtpunkter for å minimere 'inertia', "et mål på hvor internt sammenhengende klynger er." [Kilde](https://scikit-learn.org/stable/modules/clustering.html). Verdien legges til variabelen wcss ved hver iterasjon. + + > 🎓 k-means++: I [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) kan du bruke 'k-means++'-optimalisering, som "initialiserer midtpunktene til å være (generelt) langt fra hverandre, noe som gir sannsynligvis bedre resultater enn tilfeldig initialisering." + +### Albuemetoden + +Tidligere antok du at, siden du har målrettet 3 sangsjangre, bør du velge 3 klynger. Men er det tilfelle? + +1. Bruk 'albuemetoden' for å være sikker. + + ```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() + ``` + + Bruk variabelen `wcss` som du bygde i forrige steg til å lage et diagram som viser hvor 'knekkpunktet' i albuen er, som indikerer det optimale antallet klynger. Kanskje det **er** 3! + + ![albuemetoden](../../../../5-Clustering/2-K-Means/images/elbow.png) + +## Øvelse - vis klyngene + +1. Prøv prosessen igjen, denne gangen med tre klynger, og vis klyngene som et spredningsdiagram: + + ```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. Sjekk modellens nøyaktighet: + + ```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))) + ``` + + Denne modellens nøyaktighet er ikke særlig god, og formen på klyngene gir deg et hint om hvorfor. + + ![klynger](../../../../5-Clustering/2-K-Means/images/clusters.png) + + Disse dataene er for ubalanserte, for lite korrelerte, og det er for mye varians mellom kolonneverdiene til å klynge godt. Faktisk er klyngene som dannes sannsynligvis sterkt påvirket eller skjevfordelt av de tre sjangerkategoriene vi definerte ovenfor. Det var en læringsprosess! + + I Scikit-learns dokumentasjon kan du se at en modell som denne, med klynger som ikke er særlig godt avgrenset, har et 'varians'-problem: + + ![problematiske modeller](../../../../5-Clustering/2-K-Means/images/problems.png) + > Infografikk fra Scikit-learn + +## Varians + +Varians er definert som "gjennomsnittet av de kvadrerte forskjellene fra gjennomsnittet" [(Kilde)](https://www.mathsisfun.com/data/standard-deviation.html). I konteksten av dette klyngeproblemet refererer det til data der tallene i datasettet har en tendens til å avvike litt for mye fra gjennomsnittet. + +✅ Dette er et godt tidspunkt å tenke på alle måtene du kan rette opp dette problemet. Justere dataene litt mer? Bruke andre kolonner? Bruke en annen algoritme? Hint: Prøv [å skalere dataene dine](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) for å normalisere dem og teste andre kolonner. + +> Prøv denne '[varianskalkulatoren](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' for å forstå konseptet litt bedre. + +--- + +## 🚀Utfordring + +Bruk litt tid på denne notebooken og juster parametere. Kan du forbedre modellens nøyaktighet ved å rense dataene mer (for eksempel fjerne uteliggere)? Du kan bruke vekter for å gi mer vekt til visse datapunkter. Hva annet kan du gjøre for å lage bedre klynger? + +Hint: Prøv å skalere dataene dine. Det er kommentert kode i notebooken som legger til standard skalering for å få datakolonnene til å ligne hverandre mer når det gjelder verdier. Du vil oppdage at selv om silhuett-scoren går ned, jevner 'knekkpunktet' i albuegrafen seg ut. Dette skyldes at å la dataene være uskalert gjør at data med mindre varians får mer vekt. Les mer om dette problemet [her](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226). + +## [Etter-forelesningsquiz](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang & Selvstudium + +Ta en titt på en K-Means-simulator [som denne](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Du kan bruke dette verktøyet til å visualisere prøvedatapunkter og bestemme midtpunktene deres. Du kan redigere dataens tilfeldighet, antall klynger og antall midtpunkter. Hjelper dette deg med å få en idé om hvordan dataene kan grupperes? + +Ta også en titt på [dette handoutet om K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) fra Stanford. + +## Oppgave + +[Prøv forskjellige klyngemetoder](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/5-Clustering/2-K-Means/assignment.md b/translations/no/5-Clustering/2-K-Means/assignment.md new file mode 100644 index 000000000..2aed54d6f --- /dev/null +++ b/translations/no/5-Clustering/2-K-Means/assignment.md @@ -0,0 +1,25 @@ + +# Prøv forskjellige klyngemetoder + +## Instruksjoner + +I denne leksjonen lærte du om K-Means klynging. Noen ganger er K-Means ikke passende for dine data. Lag en notatbok ved å bruke data enten fra disse leksjonene eller fra et annet sted (krediter kilden din) og vis en annen klyngemetode som IKKE bruker K-Means. Hva lærte du? + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | --------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------- | +| | En notatbok presenteres med en godt dokumentert klyngemodell | En notatbok presenteres uten god dokumentasjon og/eller ufullstendig | Ufullstendig arbeid leveres | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/5-Clustering/2-K-Means/solution/Julia/README.md b/translations/no/5-Clustering/2-K-Means/solution/Julia/README.md new file mode 100644 index 000000000..7f1044fe0 --- /dev/null +++ b/translations/no/5-Clustering/2-K-Means/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/5-Clustering/README.md b/translations/no/5-Clustering/README.md new file mode 100644 index 000000000..ef7101a03 --- /dev/null +++ b/translations/no/5-Clustering/README.md @@ -0,0 +1,42 @@ + +# Klusteringsmodeller for maskinlæring + +Klustering er en oppgave innen maskinlæring hvor man forsøker å finne objekter som ligner på hverandre og gruppere disse i grupper kalt klynger. Det som skiller klustering fra andre tilnærminger i maskinlæring, er at ting skjer automatisk. Faktisk kan man si at det er det motsatte av veiledet læring. + +## Regionalt tema: klusteringsmodeller for en nigeriansk publikums musikksmak 🎧 + +Nigerias mangfoldige publikum har varierte musikksmaker. Ved å bruke data hentet fra Spotify (inspirert av [denne artikkelen](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)), la oss se på noe av musikken som er populær i Nigeria. Dette datasettet inkluderer informasjon om ulike sangers 'dansbarhet'-score, 'akustisitet', lydstyrke, 'taleinnhold', popularitet og energi. Det vil være interessant å oppdage mønstre i disse dataene! + +![En platespiller](../../../5-Clustering/images/turntable.jpg) + +> Foto av Marcela LaskoskiUnsplash + +I denne serien med leksjoner vil du oppdage nye måter å analysere data på ved hjelp av klusteringsteknikker. Klustering er spesielt nyttig når datasettet ditt mangler etiketter. Hvis det har etiketter, kan klassifiseringsteknikker som de du lærte i tidligere leksjoner være mer nyttige. Men i tilfeller der du ønsker å gruppere umerkede data, er klustering en flott måte å oppdage mønstre på. + +> Det finnes nyttige lavkodeverktøy som kan hjelpe deg med å lære å arbeide med klusteringsmodeller. Prøv [Azure ML for denne oppgaven](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Leksjoner + +1. [Introduksjon til klustering](1-Visualize/README.md) +2. [K-Means klustering](2-K-Means/README.md) + +## Krediteringer + +Disse leksjonene ble skrevet med 🎶 av [Jen Looper](https://www.twitter.com/jenlooper) med nyttige vurderinger fra [Rishit Dagli](https://rishit_dagli) og [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan). + +Datasettet [Nigerian Songs](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) ble hentet fra Kaggle som data fra Spotify. + +Nyttige K-Means-eksempler som bidro til å lage denne leksjonen inkluderer denne [iris-utforskningen](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), denne [introduksjonsnotatboken](https://www.kaggle.com/prashant111/k-means-clustering-with-python), og dette [hypotetiske NGO-eksempelet](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering). + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/1-Introduction-to-NLP/README.md b/translations/no/6-NLP/1-Introduction-to-NLP/README.md new file mode 100644 index 000000000..1926b729d --- /dev/null +++ b/translations/no/6-NLP/1-Introduction-to-NLP/README.md @@ -0,0 +1,179 @@ + +# Introduksjon til naturlig språkbehandling + +Denne leksjonen dekker en kort historie og viktige konsepter innen *naturlig språkbehandling*, et underfelt av *datamaskinlingvistikk*. + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Introduksjon + +NLP, som det ofte kalles, er et av de mest kjente områdene hvor maskinlæring har blitt anvendt og brukt i produksjonsprogramvare. + +✅ Kan du tenke på programvare du bruker hver dag som sannsynligvis har noe NLP innebygd? Hva med tekstbehandlingsprogrammer eller mobilapper du bruker regelmessig? + +Du vil lære om: + +- **Ideen om språk**. Hvordan språk utviklet seg og hva de viktigste studieområdene har vært. +- **Definisjon og konsepter**. Du vil også lære definisjoner og konsepter om hvordan datamaskiner behandler tekst, inkludert parsing, grammatikk og identifisering av substantiver og verb. Det er noen kodingsoppgaver i denne leksjonen, og flere viktige konsepter introduseres som du vil lære å kode senere i de neste leksjonene. + +## Datamaskinlingvistikk + +Datamaskinlingvistikk er et forsknings- og utviklingsområde gjennom mange tiår som studerer hvordan datamaskiner kan arbeide med, og til og med forstå, oversette og kommunisere med språk. Naturlig språkbehandling (NLP) er et relatert felt som fokuserer på hvordan datamaskiner kan behandle 'naturlige', eller menneskelige, språk. + +### Eksempel - diktering på telefon + +Hvis du noen gang har diktert til telefonen din i stedet for å skrive eller spurt en virtuell assistent et spørsmål, ble talen din konvertert til tekstform og deretter behandlet eller *parset* fra språket du snakket. De oppdagede nøkkelordene ble deretter behandlet til et format som telefonen eller assistenten kunne forstå og handle på. + +![forståelse](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png) +> Ekte språklig forståelse er vanskelig! Bilde av [Jen Looper](https://twitter.com/jenlooper) + +### Hvordan er denne teknologien mulig? + +Dette er mulig fordi noen har skrevet et dataprogram for å gjøre dette. For noen tiår siden forutså noen science fiction-forfattere at folk stort sett ville snakke med datamaskinene sine, og at datamaskinene alltid ville forstå nøyaktig hva de mente. Dessverre viste det seg å være et vanskeligere problem enn mange forestilte seg, og selv om det er et mye bedre forstått problem i dag, er det betydelige utfordringer med å oppnå 'perfekt' naturlig språkbehandling når det gjelder å forstå meningen med en setning. Dette er spesielt vanskelig når det gjelder å forstå humor eller oppdage følelser som sarkasme i en setning. + +På dette tidspunktet husker du kanskje skoletimer der læreren dekket grammatiske deler av en setning. I noen land blir elever undervist i grammatikk og lingvistikk som et eget fag, men i mange land er disse temaene inkludert som en del av språkopplæringen: enten ditt førstespråk i barneskolen (lære å lese og skrive) og kanskje et andrespråk i ungdomsskolen eller videregående. Ikke bekymre deg hvis du ikke er ekspert på å skille substantiver fra verb eller adverb fra adjektiver! + +Hvis du sliter med forskjellen mellom *presens* og *presens progressiv*, er du ikke alene. Dette er utfordrende for mange mennesker, selv de som har språket som morsmål. Den gode nyheten er at datamaskiner er veldig gode til å anvende formelle regler, og du vil lære å skrive kode som kan *parse* en setning like godt som et menneske. Den større utfordringen du vil undersøke senere er å forstå *meningen* og *følelsen* av en setning. + +## Forutsetninger + +For denne leksjonen er den viktigste forutsetningen at du kan lese og forstå språket i denne leksjonen. Det er ingen matematiske problemer eller ligninger å løse. Selv om den opprinnelige forfatteren skrev denne leksjonen på engelsk, er den også oversatt til andre språk, så du kan lese en oversettelse. Det er eksempler der flere forskjellige språk brukes (for å sammenligne de forskjellige grammatikkreglene for ulike språk). Disse er *ikke* oversatt, men den forklarende teksten er det, så meningen bør være klar. + +For kodingsoppgavene vil du bruke Python, og eksemplene bruker Python 3.8. + +I denne delen vil du trenge og bruke: + +- **Python 3 forståelse**. Forståelse av programmeringsspråket Python 3, denne leksjonen bruker input, løkker, fillesing, arrays. +- **Visual Studio Code + utvidelse**. Vi vil bruke Visual Studio Code og dens Python-utvidelse. Du kan også bruke en Python IDE etter eget valg. +- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) er et forenklet tekstbehandlingsbibliotek for Python. Følg instruksjonene på TextBlob-nettstedet for å installere det på systemet ditt (installer også corpora, som vist nedenfor): + + ```bash + pip install -U textblob + python -m textblob.download_corpora + ``` + +> 💡 Tips: Du kan kjøre Python direkte i VS Code-miljøer. Sjekk [dokumentasjonen](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) for mer informasjon. + +## Å snakke med maskiner + +Historien om å prøve å få datamaskiner til å forstå menneskelig språk går flere tiår tilbake, og en av de tidligste forskerne som vurderte naturlig språkbehandling var *Alan Turing*. + +### 'Turing-testen' + +Da Turing forsket på *kunstig intelligens* på 1950-tallet, vurderte han om en samtaletest kunne gis til et menneske og en datamaskin (via skriftlig korrespondanse) der mennesket i samtalen ikke var sikker på om de kommuniserte med et annet menneske eller en datamaskin. + +Hvis, etter en viss lengde på samtalen, mennesket ikke kunne avgjøre om svarene kom fra en datamaskin eller ikke, kunne datamaskinen da sies å *tenke*? + +### Inspirasjonen - 'imitasjonsspillet' + +Ideen til dette kom fra et selskapslek kalt *Imitasjonsspillet* der en utspørrer er alene i et rom og har som oppgave å avgjøre hvem av to personer (i et annet rom) som er henholdsvis mann og kvinne. Utspørreren kan sende notater og må prøve å tenke på spørsmål der de skriftlige svarene avslører kjønnet til den mystiske personen. Selvfølgelig prøver spillerne i det andre rommet å lure utspørreren ved å svare på spørsmål på en måte som villeder eller forvirrer utspørreren, samtidig som de gir inntrykk av å svare ærlig. + +### Utviklingen av Eliza + +På 1960-tallet utviklet en MIT-forsker ved navn *Joseph Weizenbaum* [*Eliza*](https://wikipedia.org/wiki/ELIZA), en datamaskin-'terapeut' som ville stille mennesket spørsmål og gi inntrykk av å forstå svarene deres. Men selv om Eliza kunne parse en setning og identifisere visse grammatiske konstruksjoner og nøkkelord for å gi et rimelig svar, kunne det ikke sies å *forstå* setningen. Hvis Eliza ble presentert med en setning som følger formatet "**Jeg er** trist", kunne den omorganisere og erstatte ord i setningen for å danne svaret "Hvor lenge har **du vært** trist". + +Dette ga inntrykk av at Eliza forsto utsagnet og stilte et oppfølgingsspørsmål, mens den i virkeligheten endret tid og la til noen ord. Hvis Eliza ikke kunne identifisere et nøkkelord som den hadde et svar for, ville den i stedet gi et tilfeldig svar som kunne være anvendelig for mange forskjellige utsagn. Eliza kunne lett bli lurt, for eksempel hvis en bruker skrev "**Du er** en sykkel", kunne den svare med "Hvor lenge har **jeg vært** en sykkel?", i stedet for et mer fornuftig svar. + +[![Chatte med Eliza](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Chatte med Eliza") + +> 🎥 Klikk på bildet over for en video om det originale ELIZA-programmet + +> Merk: Du kan lese den originale beskrivelsen av [Eliza](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) publisert i 1966 hvis du har en ACM-konto. Alternativt kan du lese om Eliza på [wikipedia](https://wikipedia.org/wiki/ELIZA) + +## Øvelse - kode en enkel samtalebot + +En samtalebot, som Eliza, er et program som henter brukerinput og ser ut til å forstå og svare intelligent. I motsetning til Eliza vil vår bot ikke ha flere regler som gir den inntrykk av å ha en intelligent samtale. I stedet vil vår bot ha én eneste evne, nemlig å holde samtalen i gang med tilfeldige svar som kan fungere i nesten enhver triviell samtale. + +### Planen + +Dine steg når du bygger en samtalebot: + +1. Skriv ut instruksjoner som informerer brukeren om hvordan de skal interagere med boten +2. Start en løkke + 1. Aksepter brukerinput + 2. Hvis brukeren har bedt om å avslutte, avslutt + 3. Behandle brukerinput og bestem svar (i dette tilfellet er svaret et tilfeldig valg fra en liste over mulige generiske svar) + 4. Skriv ut svar +3. Gå tilbake til steg 2 + +### Bygge boten + +La oss lage boten nå. Vi starter med å definere noen fraser. + +1. Lag denne boten selv i Python med følgende tilfeldige svar: + + ```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?"] + ``` + + Her er noen eksempler på output for å veilede deg (brukerinput er på linjene som starter med `>`): + + ```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! + ``` + + En mulig løsning på oppgaven er [her](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py) + + ✅ Stopp og vurder + + 1. Tror du de tilfeldige svarene ville 'lure' noen til å tro at boten faktisk forsto dem? + 2. Hvilke funksjoner ville boten trenge for å være mer effektiv? + 3. Hvis en bot virkelig kunne 'forstå' meningen med en setning, ville den trenge å 'huske' meningen med tidligere setninger i en samtale også? + +--- + +## 🚀Utfordring + +Velg ett av "stopp og vurder"-elementene ovenfor og prøv enten å implementere dem i kode eller skriv en løsning på papir ved hjelp av pseudokode. + +I neste leksjon vil du lære om en rekke andre tilnærminger til parsing av naturlig språk og maskinlæring. + +## [Quiz etter leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang & Selvstudium + +Ta en titt på referansene nedenfor som videre lesemuligheter. + +### Referanser + +1. Schubert, Lenhart, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = . +2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010. + +## Oppgave + +[Søk etter en bot](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/1-Introduction-to-NLP/assignment.md b/translations/no/6-NLP/1-Introduction-to-NLP/assignment.md new file mode 100644 index 000000000..008e6d51a --- /dev/null +++ b/translations/no/6-NLP/1-Introduction-to-NLP/assignment.md @@ -0,0 +1,25 @@ + +# Finn en bot + +## Instruksjoner + +Boter finnes overalt. Din oppgave: finn en og adopter den! Du kan finne dem på nettsider, i bankapplikasjoner og på telefonen, for eksempel når du ringer finansielle tjenester for råd eller kontoinformasjon. Analyser boten og se om du klarer å forvirre den. Hvis du klarer å forvirre boten, hvorfor tror du det skjedde? Skriv en kort rapport om din opplevelse. + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | ----------------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------- | +| | En fullstendig side er skrevet, som forklarer den antatte bot-arkitekturen og beskriver din opplevelse med den | En rapport er ufullstendig eller ikke godt undersøkt | Ingen rapport er levert | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/2-Tasks/README.md b/translations/no/6-NLP/2-Tasks/README.md new file mode 100644 index 000000000..4a5092f37 --- /dev/null +++ b/translations/no/6-NLP/2-Tasks/README.md @@ -0,0 +1,228 @@ + +# Vanlige oppgaver og teknikker innen naturlig språkprosessering + +For de fleste oppgaver innen *naturlig språkprosessering* må teksten som skal behandles brytes ned, analyseres, og resultatene lagres eller kryssrefereres med regler og datasett. Disse oppgavene lar programmereren utlede _meningen_, _intensjonen_ eller bare _frekvensen_ av termer og ord i en tekst. + +## [Quiz før forelesning](https://ff-quizzes.netlify.app/en/ml/) + +La oss utforske vanlige teknikker som brukes i tekstbehandling. Kombinert med maskinlæring hjelper disse teknikkene deg med å analysere store mengder tekst effektivt. Før du bruker ML på disse oppgavene, la oss forstå problemene en NLP-spesialist møter. + +## Vanlige oppgaver innen NLP + +Det finnes ulike måter å analysere en tekst på. Det er oppgaver du kan utføre, og gjennom disse oppgavene kan du få en forståelse av teksten og trekke konklusjoner. Disse oppgavene utføres vanligvis i en sekvens. + +### Tokenisering + +Det første de fleste NLP-algoritmer må gjøre, er sannsynligvis å dele opp teksten i tokens, eller ord. Selv om dette høres enkelt ut, kan det være utfordrende å ta hensyn til tegnsetting og ulike språks ord- og setningsavgrensninger. Du må kanskje bruke ulike metoder for å bestemme hvor grensene går. + +![tokenisering](../../../../6-NLP/2-Tasks/images/tokenization.png) +> Tokenisering av en setning fra **Pride and Prejudice**. Infografikk av [Jen Looper](https://twitter.com/jenlooper) + +### Embeddings + +[Ord-embeddings](https://wikipedia.org/wiki/Word_embedding) er en måte å konvertere tekstdata til numeriske verdier. Embeddings gjøres slik at ord med lignende betydning eller ord som ofte brukes sammen, grupperes sammen. + +![ord-embeddings](../../../../6-NLP/2-Tasks/images/embedding.png) +> "I have the highest respect for your nerves, they are my old friends." - Ord-embeddings for en setning i **Pride and Prejudice**. Infografikk av [Jen Looper](https://twitter.com/jenlooper) + +✅ Prøv [dette interessante verktøyet](https://projector.tensorflow.org/) for å eksperimentere med ord-embeddings. Ved å klikke på ett ord vises klynger av lignende ord: 'toy' grupperes med 'disney', 'lego', 'playstation' og 'console'. + +### Parsing og ordklassemerking + +Hvert ord som er tokenisert, kan merkes som en ordklasse – et substantiv, verb eller adjektiv. Setningen `the quick red fox jumped over the lazy brown dog` kan for eksempel merkes som fox = substantiv, jumped = verb. + +![parsing](../../../../6-NLP/2-Tasks/images/parse.png) + +> Parsing av en setning fra **Pride and Prejudice**. Infografikk av [Jen Looper](https://twitter.com/jenlooper) + +Parsing innebærer å gjenkjenne hvilke ord som er relatert til hverandre i en setning – for eksempel `the quick red fox jumped` er en adjektiv-substantiv-verb-sekvens som er separat fra sekvensen `lazy brown dog`. + +### Ord- og frasefrekvenser + +En nyttig prosedyre når man analyserer en stor tekstmengde, er å bygge en ordbok over hvert ord eller hver frase av interesse og hvor ofte de forekommer. Frasen `the quick red fox jumped over the lazy brown dog` har en ord-frekvens på 2 for "the". + +La oss se på et eksempel der vi teller frekvensen av ord. Rudyard Kiplings dikt "The Winners" inneholder følgende vers: + +```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. +``` + +Siden frasefrekvenser kan være enten store- og småbokstavsfølsomme eller ikke, har frasen `a friend` en frekvens på 2, `the` har en frekvens på 6, og `travels` har en frekvens på 2. + +### N-grammer + +En tekst kan deles opp i sekvenser av ord med en bestemt lengde: ett ord (unigram), to ord (bigram), tre ord (trigram) eller et hvilket som helst antall ord (n-grammer). + +For eksempel gir `the quick red fox jumped over the lazy brown dog` med en n-gram-verdi på 2 følgende n-grammer: + +1. the quick +2. quick red +3. red fox +4. fox jumped +5. jumped over +6. over the +7. the lazy +8. lazy brown +9. brown dog + +Det kan være lettere å visualisere det som en glidende boks over setningen. Her er det for n-grammer med 3 ord, der n-grammet er uthevet i hver setning: + +1. **the quick red** fox jumped over the lazy brown dog +2. the **quick red fox** jumped over the lazy brown dog +3. the quick **red fox jumped** over the lazy brown dog +4. the quick red **fox jumped over** the lazy brown dog +5. the quick red fox **jumped over the** lazy brown dog +6. the quick red fox jumped **over the lazy** brown dog +7. the quick red fox jumped over **the lazy brown** dog +8. the quick red fox jumped over the **lazy brown dog** + +![n-grammer glidende vindu](../../../../6-NLP/2-Tasks/images/n-grams.gif) + +> N-gram-verdi på 3: Infografikk av [Jen Looper](https://twitter.com/jenlooper) + +### Substantivfrase-ekstraksjon + +I de fleste setninger finnes det et substantiv som er subjektet eller objektet i setningen. På engelsk kan det ofte identifiseres ved at det har 'a', 'an' eller 'the' foran seg. Å identifisere subjektet eller objektet i en setning ved å 'ekstrahere substantivfrasen' er en vanlig oppgave i NLP når man forsøker å forstå meningen med en setning. + +✅ I setningen "I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun.", kan du identifisere substantivfrasene? + +I setningen `the quick red fox jumped over the lazy brown dog` er det 2 substantivfraser: **quick red fox** og **lazy brown dog**. + +### Sentimentanalyse + +En setning eller tekst kan analyseres for sentiment, eller hvor *positiv* eller *negativ* den er. Sentiment måles i *polarisering* og *objektivitet/subjektivitet*. Polarisering måles fra -1,0 til 1,0 (negativ til positiv) og 0,0 til 1,0 (mest objektiv til mest subjektiv). + +✅ Senere vil du lære at det finnes ulike måter å bestemme sentiment på ved hjelp av maskinlæring, men én måte er å ha en liste over ord og fraser som er kategorisert som positive eller negative av en menneskelig ekspert, og bruke den modellen på tekst for å beregne en polarisering. Kan du se hvordan dette kan fungere i noen tilfeller og mindre godt i andre? + +### Bøyning + +Bøyning lar deg ta et ord og finne entalls- eller flertallsformen av ordet. + +### Lemmatization + +En *lemma* er roten eller grunnordet for en gruppe ord, for eksempel har *flew*, *flies*, *flying* en lemma av verbet *fly*. + +Det finnes også nyttige databaser tilgjengelige for NLP-forskere, spesielt: + +### WordNet + +[WordNet](https://wordnet.princeton.edu/) er en database over ord, synonymer, antonymer og mange andre detaljer for hvert ord på mange forskjellige språk. Den er utrolig nyttig når man forsøker å bygge oversettelser, stavekontroller eller språklige verktøy av alle slag. + +## NLP-biblioteker + +Heldigvis trenger du ikke bygge alle disse teknikkene selv, da det finnes utmerkede Python-biblioteker som gjør det mye mer tilgjengelig for utviklere som ikke er spesialister på naturlig språkprosessering eller maskinlæring. De neste leksjonene inkluderer flere eksempler på disse, men her vil du lære noen nyttige eksempler som hjelper deg med neste oppgave. + +### Øvelse – bruk av `TextBlob`-biblioteket + +La oss bruke et bibliotek kalt TextBlob, da det inneholder nyttige API-er for å håndtere denne typen oppgaver. TextBlob "står på skuldrene til giganter som [NLTK](https://nltk.org) og [pattern](https://github.com/clips/pattern), og fungerer godt med begge." Det har en betydelig mengde ML innebygd i sitt API. + +> Merk: En nyttig [Quick Start](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart)-guide er tilgjengelig for TextBlob og anbefales for erfarne Python-utviklere. + +Når du forsøker å identifisere *substantivfraser*, tilbyr TextBlob flere alternativer for å finne substantivfraser. + +1. Ta en titt på `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 + ``` + + > Hva skjer her? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) er "En substantivfrase-ekstraktor som bruker chunk parsing trent med ConLL-2000 treningskorpus." ConLL-2000 refererer til 2000-konferansen om Computational Natural Language Learning. Hvert år arrangerte konferansen en workshop for å takle et vanskelig NLP-problem, og i 2000 var det substantivchunking. En modell ble trent på Wall Street Journal, med "seksjoner 15-18 som treningsdata (211727 tokens) og seksjon 20 som testdata (47377 tokens)". Du kan se prosedyrene som ble brukt [her](https://www.clips.uantwerpen.be/conll2000/chunking/) og [resultatene](https://ifarm.nl/erikt/research/np-chunking.html). + +### Utfordring – forbedre boten din med NLP + +I forrige leksjon bygde du en veldig enkel Q&A-bot. Nå skal du gjøre Marvin litt mer sympatisk ved å analysere innspillene dine for sentiment og skrive ut et svar som matcher sentimentet. Du må også identifisere en `noun_phrase` og spørre om den. + +Stegene dine når du bygger en bedre samtalebot: + +1. Skriv ut instruksjoner som forklarer brukeren hvordan de kan samhandle med boten. +2. Start en løkke: + 1. Godta brukerens input. + 2. Hvis brukeren har bedt om å avslutte, avslutt. + 3. Behandle brukerens input og bestem passende sentimentrespons. + 4. Hvis en substantivfrase oppdages i sentimentet, gjør den til flertall og spør om mer input om det emnet. + 5. Skriv ut respons. +3. Gå tilbake til steg 2. + +Her er kodeeksempelet for å bestemme sentiment ved hjelp av TextBlob. Merk at det kun er fire *graderinger* av sentimentrespons (du kan ha flere hvis du ønsker): + +```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. " +``` + +Her er et eksempel på utdata for å veilede deg (brukerinput er på linjer som starter med >): + +```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! +``` + +En mulig løsning på oppgaven finner du [her](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py). + +✅ Kunnskapssjekk + +1. Tror du de sympatiske responsene ville 'lure' noen til å tro at boten faktisk forsto dem? +2. Gjør identifiseringen av substantivfrasen boten mer 'troverdig'? +3. Hvorfor kan det være nyttig å trekke ut en 'substantivfrase' fra en setning? + +--- + +Implementer boten i kunnskapssjekken ovenfor og test den på en venn. Kan den lure dem? Kan du gjøre boten din mer 'troverdig'? + +## 🚀Utfordring + +Ta en oppgave fra kunnskapssjekken ovenfor og prøv å implementere den. Test boten på en venn. Kan den lure dem? Kan du gjøre boten din mer 'troverdig'? + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang og selvstudium + +I de neste leksjonene vil du lære mer om sentimentanalyse. Undersøk denne interessante teknikken i artikler som disse på [KDNuggets](https://www.kdnuggets.com/tag/nlp). + +## Oppgave + +[Få en bot til å svare](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/2-Tasks/assignment.md b/translations/no/6-NLP/2-Tasks/assignment.md new file mode 100644 index 000000000..6b2deeeee --- /dev/null +++ b/translations/no/6-NLP/2-Tasks/assignment.md @@ -0,0 +1,25 @@ + +# Få en bot til å svare tilbake + +## Instruksjoner + +I de siste leksjonene har du programmert en enkel bot som du kan chatte med. Denne boten gir tilfeldige svar helt til du sier 'bye'. Kan du gjøre svarene litt mindre tilfeldige, og få boten til å gi spesifikke svar når du sier bestemte ting, som 'hvorfor' eller 'hvordan'? Tenk litt på hvordan maskinlæring kan gjøre denne typen arbeid mindre manuell når du utvider boten din. Du kan bruke bibliotekene NLTK eller TextBlob for å gjøre oppgavene enklere. + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | --------------------------------------------- | ------------------------------------------------ | ----------------------- | +| | En ny bot.py-fil er presentert og dokumentert | En ny bot-fil er presentert, men inneholder feil | En fil er ikke presentert | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/3-Translation-Sentiment/README.md b/translations/no/6-NLP/3-Translation-Sentiment/README.md new file mode 100644 index 000000000..3c675c3da --- /dev/null +++ b/translations/no/6-NLP/3-Translation-Sentiment/README.md @@ -0,0 +1,200 @@ + +# Oversettelse og sentimentanalyse med maskinlæring + +I de forrige leksjonene lærte du hvordan du bygger en enkel bot ved hjelp av `TextBlob`, et bibliotek som bruker maskinlæring i bakgrunnen for å utføre grunnleggende NLP-oppgaver som å trekke ut substantivfraser. En annen viktig utfordring innen datalingvistikk er nøyaktig _oversettelse_ av en setning fra ett muntlig eller skriftlig språk til et annet. + +## [Quiz før forelesning](https://ff-quizzes.netlify.app/en/ml/) + +Oversettelse er et svært vanskelig problem, forsterket av det faktum at det finnes tusenvis av språk, hver med svært forskjellige grammatikkregler. En tilnærming er å konvertere de formelle grammatikkreglene for ett språk, som engelsk, til en struktur som ikke er språkavhengig, og deretter oversette det ved å konvertere tilbake til et annet språk. Denne tilnærmingen innebærer følgende trinn: + +1. **Identifikasjon**. Identifiser eller merk ordene i inngangsspråket som substantiv, verb osv. +2. **Lag oversettelse**. Produser en direkte oversettelse av hvert ord i målspråkets format. + +### Eksempelsentence, engelsk til irsk + +På 'engelsk' er setningen _I feel happy_ tre ord i rekkefølgen: + +- **subjekt** (I) +- **verb** (feel) +- **adjektiv** (happy) + +Men på 'irsk' har den samme setningen en helt annen grammatisk struktur – følelser som "*happy*" eller "*sad*" uttrykkes som å være *på* deg. + +Den engelske frasen `I feel happy` på irsk ville være `Tá athas orm`. En *bokstavelig* oversettelse ville være `Happy is upon me`. + +En irsktalende som oversetter til engelsk ville si `I feel happy`, ikke `Happy is upon me`, fordi de forstår meningen med setningen, selv om ordene og setningsstrukturen er forskjellige. + +Den formelle rekkefølgen for setningen på irsk er: + +- **verb** (Tá eller is) +- **adjektiv** (athas, eller happy) +- **subjekt** (orm, eller upon me) + +## Oversettelse + +Et naivt oversettelsesprogram kan oversette ord kun, uten å ta hensyn til setningsstrukturen. + +✅ Hvis du har lært et andre (eller tredje eller flere) språk som voksen, har du kanskje startet med å tenke på ditt morsmål, oversette et konsept ord for ord i hodet til det andre språket, og deretter si oversettelsen høyt. Dette ligner på hva naive oversettelsesprogrammer for datamaskiner gjør. Det er viktig å komme forbi denne fasen for å oppnå flyt! + +Naiv oversettelse fører til dårlige (og noen ganger morsomme) feiltolkninger: `I feel happy` oversettes bokstavelig til `Mise bhraitheann athas` på irsk. Det betyr (bokstavelig talt) `me feel happy` og er ikke en gyldig irsk setning. Selv om engelsk og irsk er språk som snakkes på to nærliggende øyer, er de svært forskjellige språk med ulike grammatikkstrukturer. + +> Du kan se noen videoer om irske språktradisjoner, som [denne](https://www.youtube.com/watch?v=mRIaLSdRMMs) + +### Tilnærminger med maskinlæring + +Så langt har du lært om tilnærmingen med formelle regler for naturlig språkbehandling. En annen tilnærming er å ignorere betydningen av ordene og _i stedet bruke maskinlæring til å oppdage mønstre_. Dette kan fungere i oversettelse hvis du har mye tekst (et *korpus*) eller tekster (*korpora*) på både kilde- og målspråket. + +For eksempel, vurder tilfellet med *Pride and Prejudice*, en kjent engelsk roman skrevet av Jane Austen i 1813. Hvis du konsulterer boken på engelsk og en menneskelig oversettelse av boken til *fransk*, kan du oppdage fraser i den ene som er _idiomatisk_ oversatt til den andre. Det skal du gjøre om et øyeblikk. + +For eksempel, når en engelsk frase som `I have no money` oversettes bokstavelig til fransk, kan det bli `Je n'ai pas de monnaie`. "Monnaie" er et vanskelig fransk 'falskt kognat', ettersom 'money' og 'monnaie' ikke er synonyme. En bedre oversettelse som et menneske kan gjøre, ville være `Je n'ai pas d'argent`, fordi det bedre formidler betydningen av at du ikke har penger (i stedet for 'småpenger', som er betydningen av 'monnaie'). + +![monnaie](../../../../6-NLP/3-Translation-Sentiment/images/monnaie.png) + +> Bilde av [Jen Looper](https://twitter.com/jenlooper) + +Hvis en ML-modell har nok menneskelige oversettelser å bygge en modell på, kan den forbedre nøyaktigheten av oversettelser ved å identifisere vanlige mønstre i tekster som tidligere har blitt oversatt av eksperter som snakker begge språk. + +### Øvelse - oversettelse + +Du kan bruke `TextBlob` til å oversette setninger. Prøv den berømte første linjen i **Pride and Prejudice**: + +```python +from textblob import TextBlob + +blob = TextBlob( + "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!" +) +print(blob.translate(to="fr")) + +``` + +`TextBlob` gjør en ganske god jobb med oversettelsen: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!". + +Det kan argumenteres for at TextBlobs oversettelse faktisk er langt mer presis enn den franske oversettelsen fra 1932 av boken av V. Leconte og Ch. Pressoir: + +"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles." + +I dette tilfellet gjør oversettelsen informert av ML en bedre jobb enn den menneskelige oversetteren som unødvendig legger ord i den opprinnelige forfatterens munn for 'klarhet'. + +> Hva skjer her? Og hvorfor er TextBlob så god på oversettelse? Vel, i bakgrunnen bruker den Google Translate, en sofistikert AI som kan analysere millioner av fraser for å forutsi de beste strengene for oppgaven. Det er ingenting manuelt som skjer her, og du trenger en internettforbindelse for å bruke `blob.translate`. + +✅ Prøv noen flere setninger. Hva er bedre, ML eller menneskelig oversettelse? I hvilke tilfeller? + +## Sentimentanalyse + +Et annet område hvor maskinlæring kan fungere svært godt, er sentimentanalyse. En ikke-ML-tilnærming til sentiment er å identifisere ord og fraser som er 'positive' og 'negative'. Deretter, gitt en ny tekst, beregne den totale verdien av de positive, negative og nøytrale ordene for å identifisere den overordnede stemningen. + +Denne tilnærmingen kan lett lures, som du kanskje har sett i Marvin-oppgaven – setningen `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` er en sarkastisk, negativ setning, men den enkle algoritmen oppdager 'great', 'wonderful', 'glad' som positive og 'waste', 'lost' og 'dark' som negative. Den overordnede stemningen påvirkes av disse motstridende ordene. + +✅ Stopp et øyeblikk og tenk på hvordan vi formidler sarkasme som mennesker. Tonefall spiller en stor rolle. Prøv å si frasen "Well, that film was awesome" på forskjellige måter for å oppdage hvordan stemmen din formidler mening. + +### ML-tilnærminger + +ML-tilnærmingen ville være å manuelt samle negative og positive tekstkropper – tweets, eller filmomtaler, eller hva som helst hvor mennesket har gitt en score *og* en skriftlig mening. Deretter kan NLP-teknikker brukes på meninger og scorer, slik at mønstre dukker opp (f.eks. positive filmomtaler har en tendens til å inneholde frasen 'Oscar worthy' mer enn negative filmomtaler, eller positive restaurantomtaler sier 'gourmet' mye mer enn 'disgusting'). + +> ⚖️ **Eksempel**: Hvis du jobbet på kontoret til en politiker og det var en ny lov som ble diskutert, kunne velgere skrive til kontoret med e-poster som støtter eller er imot den aktuelle nye loven. La oss si at du fikk i oppgave å lese e-postene og sortere dem i 2 bunker, *for* og *imot*. Hvis det var mange e-poster, kunne du bli overveldet av å forsøke å lese dem alle. Ville det ikke vært fint om en bot kunne lese dem alle for deg, forstå dem og fortelle deg i hvilken bunke hver e-post hørte hjemme? +> +> En måte å oppnå dette på er å bruke maskinlæring. Du ville trene modellen med en del av *imot*-e-postene og en del av *for*-e-postene. Modellen ville ha en tendens til å assosiere fraser og ord med imot-siden og for-siden, *men den ville ikke forstå noe av innholdet*, bare at visse ord og mønstre var mer sannsynlige å dukke opp i en *imot*- eller en *for*-e-post. Du kunne teste den med noen e-poster som du ikke hadde brukt til å trene modellen, og se om den kom til samme konklusjon som deg. Deretter, når du var fornøyd med modellens nøyaktighet, kunne du behandle fremtidige e-poster uten å måtte lese hver enkelt. + +✅ Høres denne prosessen ut som prosesser du har brukt i tidligere leksjoner? + +## Øvelse - sentimentale setninger + +Sentiment måles med en *polarity* fra -1 til 1, der -1 er den mest negative stemningen, og 1 er den mest positive. Sentiment måles også med en score fra 0 til 1 for objektivitet (0) og subjektivitet (1). + +Ta en ny titt på Jane Austens *Pride and Prejudice*. Teksten er tilgjengelig her på [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm). Eksemplet nedenfor viser et kort program som analyserer sentimentet i første og siste setning fra boken og viser dens sentimentpolarity og subjektivitets-/objektivitets-score. + +Du bør bruke `TextBlob`-biblioteket (beskrevet ovenfor) for å bestemme `sentiment` (du trenger ikke skrive din egen sentimentkalkulator) i følgende oppgave. + +```python +from textblob import TextBlob + +quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.""" + +quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them.""" + +sentiment1 = TextBlob(quote1).sentiment +sentiment2 = TextBlob(quote2).sentiment + +print(quote1 + " has a sentiment of " + str(sentiment1)) +print(quote2 + " has a sentiment of " + str(sentiment2)) +``` + +Du ser følgende utdata: + +```output +It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146) + +Darcy, as well as Elizabeth, really loved them; and they were + both ever sensible of the warmest gratitude towards the persons + who, by bringing her into Derbyshire, had been the means of + uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8) +``` + +## Utfordring - sjekk sentimentpolarity + +Din oppgave er å avgjøre, ved hjelp av sentimentpolarity, om *Pride and Prejudice* har flere absolutt positive setninger enn absolutt negative. For denne oppgaven kan du anta at en polarity-score på 1 eller -1 er henholdsvis absolutt positiv eller negativ. + +**Trinn:** + +1. Last ned en [kopi av Pride and Prejudice](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) fra Project Gutenberg som en .txt-fil. Fjern metadataene i starten og slutten av filen, slik at bare originalteksten gjenstår. +2. Åpne filen i Python og trekk ut innholdet som en streng. +3. Lag en TextBlob ved hjelp av bokstrengen. +4. Analyser hver setning i boken i en løkke. + 1. Hvis polariteten er 1 eller -1, lagre setningen i en liste over positive eller negative meldinger. +5. Til slutt, skriv ut alle de positive og negative setningene (separat) og antallet av hver. + +Her er en [eksempelløsning](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb). + +✅ Kunnskapssjekk + +1. Sentimentet er basert på ordene som brukes i setningen, men forstår koden *ordene*? +2. Synes du sentimentpolarityen er nøyaktig, eller med andre ord, er du *enig* i scorene? + 1. Spesielt, er du enig eller uenig i den absolutte **positive** polariteten til følgende setninger? + * “What an excellent father you have, girls!” said she, when the door was shut. + * “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect. + * How wonderfully these sort of things occur! + * I have the greatest dislike in the world to that sort of thing. + * Charlotte is an excellent manager, I dare say. + * “This is delightful indeed! + * I am so happy! + * Your idea of the ponies is delightful. + 2. De neste 3 setningene ble vurdert med en absolutt positiv sentiment, men ved nærmere lesing er de ikke positive setninger. Hvorfor trodde sentimentanalysen at de var positive setninger? + * Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power. + * If I could but see you as happy! + * Our distress, my dear Lizzy, is very great. + 3. Er du enig eller uenig i den absolutte **negative** polariteten til følgende setninger? + - Everybody is disgusted with his pride. + - “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful. + - The pause was to Elizabeth’s feelings dreadful. + - It would be dreadful! + +✅ Enhver kjenner av Jane Austen vil forstå at hun ofte bruker bøkene sine til å kritisere de mer latterlige aspektene ved det engelske regentsamfunnet. Elizabeth Bennett, hovedpersonen i *Pride and Prejudice*, er en skarp sosial observatør (som forfatteren), og språket hennes er ofte sterkt nyansert. Selv Mr. Darcy (kjærlighetsinteressen i historien) bemerker Elizabeths lekne og ertende bruk av språk: "I have had the pleasure of your acquaintance long enough to know that you find great enjoyment in occasionally professing opinions which in fact are not your own." + +--- + +## 🚀Utfordring + +Kan du gjøre Marvin enda bedre ved å trekke ut andre funksjoner fra brukerens input? + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang og selvstudium +Det finnes mange måter å trekke ut sentiment fra tekst på. Tenk på forretningsapplikasjoner som kan dra nytte av denne teknikken. Tenk også på hvordan det kan gå galt. Les mer om sofistikerte, bedriftsklare systemer som analyserer sentiment, som for eksempel [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott). Test noen av setningene fra Stolthet og fordom ovenfor, og se om det kan oppdage nyanser. + +## Oppgave + +[Poetisk frihet](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/3-Translation-Sentiment/assignment.md b/translations/no/6-NLP/3-Translation-Sentiment/assignment.md new file mode 100644 index 000000000..3eac019db --- /dev/null +++ b/translations/no/6-NLP/3-Translation-Sentiment/assignment.md @@ -0,0 +1,25 @@ + +# Poetisk frihet + +## Instruksjoner + +I [denne notatboken](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) finner du over 500 dikt av Emily Dickinson som tidligere er analysert for sentiment ved hjelp av Azure tekstanalyse. Bruk dette datasettet til å analysere det ved hjelp av teknikkene som er beskrevet i leksjonen. Stemmer det foreslåtte sentimentet i et dikt overens med avgjørelsen til den mer avanserte Azure-tjenesten? Hvorfor eller hvorfor ikke, etter din mening? Er det noe som overrasker deg? + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | ------------------------------------------------------------------------- | ------------------------------------------------------ | ------------------------ | +| | En notatbok presenteres med en grundig analyse av et utvalg fra forfatteren | Notatboken er ufullstendig eller utfører ikke analysen | Ingen notatbok presenteres | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/3-Translation-Sentiment/solution/Julia/README.md b/translations/no/6-NLP/3-Translation-Sentiment/solution/Julia/README.md new file mode 100644 index 000000000..fbf5f2b71 --- /dev/null +++ b/translations/no/6-NLP/3-Translation-Sentiment/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/3-Translation-Sentiment/solution/R/README.md b/translations/no/6-NLP/3-Translation-Sentiment/solution/R/README.md new file mode 100644 index 000000000..172bd8e95 --- /dev/null +++ b/translations/no/6-NLP/3-Translation-Sentiment/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/4-Hotel-Reviews-1/README.md b/translations/no/6-NLP/4-Hotel-Reviews-1/README.md new file mode 100644 index 000000000..479001c08 --- /dev/null +++ b/translations/no/6-NLP/4-Hotel-Reviews-1/README.md @@ -0,0 +1,417 @@ + +# Sentimentanalyse med hotellanmeldelser - bearbeiding av data + +I denne delen vil du bruke teknikkene fra de tidligere leksjonene til å utføre en utforskende dataanalyse av et stort datasett. Når du har fått en god forståelse av nytten av de ulike kolonnene, vil du lære: + +- hvordan du fjerner unødvendige kolonner +- hvordan du beregner ny data basert på eksisterende kolonner +- hvordan du lagrer det resulterende datasettet for bruk i den endelige utfordringen + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +### Introduksjon + +Så langt har du lært hvordan tekstdata er ganske annerledes enn numeriske datatyper. Hvis det er tekst skrevet eller sagt av et menneske, kan det analyseres for å finne mønstre, frekvenser, sentiment og mening. Denne leksjonen tar deg inn i et ekte datasett med en ekte utfordring: **[515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)** som inkluderer en [CC0: Public Domain-lisens](https://creativecommons.org/publicdomain/zero/1.0/). Det ble hentet fra Booking.com fra offentlige kilder. Skaperen av datasettet er Jiashen Liu. + +### Forberedelse + +Du vil trenge: + +* Muligheten til å kjøre .ipynb-notatbøker med Python 3 +* pandas +* NLTK, [som du bør installere lokalt](https://www.nltk.org/install.html) +* Datasettet som er tilgjengelig på Kaggle [515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe). Det er rundt 230 MB ukomprimert. Last det ned til rotmappen `/data` knyttet til disse NLP-leksjonene. + +## Utforskende dataanalyse + +Denne utfordringen antar at du bygger en hotellanbefalingsbot ved hjelp av sentimentanalyse og gjesteanmeldelsesscorer. Datasettet du vil bruke inkluderer anmeldelser av 1493 forskjellige hoteller i 6 byer. + +Ved å bruke Python, et datasett med hotellanmeldelser, og NLTKs sentimentanalyse kan du finne ut: + +* Hva er de mest brukte ordene og frasene i anmeldelsene? +* Korresponderer de offisielle *taggene* som beskriver et hotell med anmeldelsesscorer (f.eks. er det flere negative anmeldelser for et bestemt hotell fra *Familie med små barn* enn fra *Alenereisende*, noe som kanskje indikerer at det er bedre for *Alenereisende*)? +* Stemmer NLTKs sentimentanalyseresultater overens med den numeriske scoren fra hotellanmelderen? + +#### Datasett + +La oss utforske datasettet du har lastet ned og lagret lokalt. Åpne filen i en editor som VS Code eller til og med Excel. + +Overskriftene i datasettet er som følger: + +*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* + +Her er de gruppert på en måte som kan være lettere å undersøke: +##### Hotellkolonner + +* `Hotel_Name`, `Hotel_Address`, `lat` (breddegrad), `lng` (lengdegrad) + * Ved å bruke *lat* og *lng* kan du lage et kart med Python som viser hotellplasseringer (kanskje fargekodet for negative og positive anmeldelser) + * Hotel_Address er ikke åpenbart nyttig for oss, og vi vil sannsynligvis erstatte det med et land for enklere sortering og søking + +**Hotell meta-anmeldelseskolonner** + +* `Average_Score` + * Ifølge datasettets skaper er denne kolonnen *Gjennomsnittsscore for hotellet, beregnet basert på den nyeste kommentaren det siste året*. Dette virker som en uvanlig måte å beregne scoren på, men det er data som er hentet, så vi kan ta det for god fisk for nå. + + ✅ Basert på de andre kolonnene i dette datasettet, kan du tenke på en annen måte å beregne gjennomsnittsscoren på? + +* `Total_Number_of_Reviews` + * Det totale antallet anmeldelser dette hotellet har mottatt - det er ikke klart (uten å skrive litt kode) om dette refererer til anmeldelsene i datasettet. +* `Additional_Number_of_Scoring` + * Dette betyr at en anmeldelsesscore ble gitt, men ingen positiv eller negativ anmeldelse ble skrevet av anmelderen + +**Anmeldelseskolonner** + +- `Reviewer_Score` + - Dette er en numerisk verdi med maksimalt én desimal mellom minimums- og maksimumsverdiene 2.5 og 10 + - Det er ikke forklart hvorfor 2.5 er den laveste mulige scoren +- `Negative_Review` + - Hvis en anmelder ikke skrev noe, vil dette feltet ha "**No Negative**" + - Merk at en anmelder kan skrive en positiv anmeldelse i kolonnen for Negative Review (f.eks. "det er ingenting dårlig med dette hotellet") +- `Review_Total_Negative_Word_Counts` + - Høyere negative ordtellinger indikerer en lavere score (uten å sjekke sentimentet) +- `Positive_Review` + - Hvis en anmelder ikke skrev noe, vil dette feltet ha "**No Positive**" + - Merk at en anmelder kan skrive en negativ anmeldelse i kolonnen for Positive Review (f.eks. "det er ingenting bra med dette hotellet i det hele tatt") +- `Review_Total_Positive_Word_Counts` + - Høyere positive ordtellinger indikerer en høyere score (uten å sjekke sentimentet) +- `Review_Date` og `days_since_review` + - En ferskhets- eller foreldelsesmåling kan brukes på en anmeldelse (eldre anmeldelser er kanskje ikke like nøyaktige som nyere fordi hotellledelsen har endret seg, renoveringer er gjort, eller et basseng er lagt til osv.) +- `Tags` + - Dette er korte beskrivelser som en anmelder kan velge for å beskrive typen gjest de var (f.eks. alene eller familie), typen rom de hadde, lengden på oppholdet og hvordan anmeldelsen ble sendt inn. + - Dessverre er bruken av disse taggene problematisk, se avsnittet nedenfor som diskuterer deres nytteverdi + +**Anmelderkolonner** + +- `Total_Number_of_Reviews_Reviewer_Has_Given` + - Dette kan være en faktor i en anbefalingsmodell, for eksempel hvis du kan fastslå at mer produktive anmeldere med hundrevis av anmeldelser er mer tilbøyelige til å være negative enn positive. Imidlertid er anmelderen av en bestemt anmeldelse ikke identifisert med en unik kode, og kan derfor ikke kobles til et sett med anmeldelser. Det er 30 anmeldere med 100 eller flere anmeldelser, men det er vanskelig å se hvordan dette kan hjelpe anbefalingsmodellen. +- `Reviewer_Nationality` + - Noen kan tro at visse nasjonaliteter er mer tilbøyelige til å gi en positiv eller negativ anmeldelse på grunn av en nasjonal tilbøyelighet. Vær forsiktig med å bygge slike anekdotiske synspunkter inn i modellene dine. Dette er nasjonale (og noen ganger rasemessige) stereotyper, og hver anmelder var en individuell person som skrev en anmeldelse basert på sin opplevelse. Den kan ha blitt filtrert gjennom mange linser som deres tidligere hotellopphold, avstanden de reiste, og deres personlige temperament. Å tro at deres nasjonalitet var årsaken til en anmeldelsesscore er vanskelig å rettferdiggjøre. + +##### Eksempler + +| Gjennomsnittlig Score | Totalt Antall Anmeldelser | Anmelder Score | Negativ
Anmeldelse | Positiv Anmeldelse | Tags | +| ---------------------- | -------------------------- | ---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------- | +| 7.8 | 1945 | 2.5 | Dette er for øyeblikket ikke et hotell, men en byggeplass Jeg ble terrorisert fra tidlig morgen og hele dagen med uakseptabel byggestøy mens jeg hvilte etter en lang reise og jobbet på rommet Folk jobbet hele dagen med f.eks. trykkluftbor i de tilstøtende rommene Jeg ba om å bytte rom, men ingen stille rom var tilgjengelig For å gjøre ting verre ble jeg overbelastet Jeg sjekket ut på kvelden siden jeg måtte dra veldig tidlig fly og mottok en passende regning En dag senere gjorde hotellet en annen belastning uten mitt samtykke som oversteg den bookede prisen Det er et forferdelig sted Ikke straff deg selv ved å booke her | Ingenting Forferdelig sted Hold deg unna | Forretningsreise Par Standard Dobbeltrom Bodde 2 netter | + +Som du kan se, hadde denne gjesten ikke et hyggelig opphold på dette hotellet. Hotellet har en god gjennomsnittsscore på 7.8 og 1945 anmeldelser, men denne anmelderen ga det 2.5 og skrev 115 ord om hvor negativt oppholdet var. Hvis de ikke skrev noe i Positive_Review-kolonnen, kan du anta at det ikke var noe positivt, men de skrev faktisk 7 ord som advarsel. Hvis vi bare teller ord i stedet for betydningen eller sentimentet av ordene, kan vi få et skjevt bilde av anmelderens intensjon. Merkelig nok er deres score på 2.5 forvirrende, fordi hvis hotelloppholdet var så dårlig, hvorfor gi det noen poeng i det hele tatt? Ved å undersøke datasettet nøye, vil du se at den laveste mulige scoren er 2.5, ikke 0. Den høyeste mulige scoren er 10. + +##### Tags + +Som nevnt ovenfor, ved første øyekast virker ideen om å bruke `Tags` til å kategorisere data fornuftig. Dessverre er disse taggene ikke standardiserte, noe som betyr at i et gitt hotell kan alternativene være *Enkeltrom*, *Tomannsrom* og *Dobbeltrom*, men i neste hotell er de *Deluxe Enkeltrom*, *Klassisk Queen-rom* og *Executive King-rom*. Disse kan være de samme tingene, men det er så mange variasjoner at valget blir: + +1. Forsøke å endre alle begrepene til en enkelt standard, noe som er veldig vanskelig, fordi det ikke er klart hva konverteringsbanen vil være i hvert tilfelle (f.eks. *Klassisk enkeltrom* kartlegges til *Enkeltrom*, men *Superior Queen-rom med hage eller byutsikt* er mye vanskeligere å kartlegge) + +1. Vi kan ta en NLP-tilnærming og måle frekvensen av visse begreper som *Alene*, *Forretningsreisende* eller *Familie med små barn* slik de gjelder for hvert hotell, og ta dette med i anbefalingen + +Tags er vanligvis (men ikke alltid) et enkelt felt som inneholder en liste med 5 til 6 kommaseparerte verdier som samsvarer med *Type reise*, *Type gjester*, *Type rom*, *Antall netter* og *Type enhet anmeldelsen ble sendt inn fra*. Imidlertid, fordi noen anmeldere ikke fyller ut hvert felt (de kan la ett være tomt), er verdiene ikke alltid i samme rekkefølge. + +Som et eksempel, ta *Type gruppe*. Det er 1025 unike muligheter i dette feltet i `Tags`-kolonnen, og dessverre refererer bare noen av dem til en gruppe (noen er typen rom osv.). Hvis du filtrerer bare de som nevner familie, inneholder resultatene mange *Familierom*-type resultater. Hvis du inkluderer begrepet *med*, dvs. teller *Familie med*-verdier, er resultatene bedre, med over 80,000 av de 515,000 resultatene som inneholder frasen "Familie med små barn" eller "Familie med eldre barn". + +Dette betyr at tags-kolonnen ikke er helt ubrukelig for oss, men det vil kreve litt arbeid for å gjøre den nyttig. + +##### Gjennomsnittlig hotellscore + +Det er en rekke rariteter eller avvik med datasettet som jeg ikke kan finne ut av, men som er illustrert her slik at du er klar over dem når du bygger modellene dine. Hvis du finner ut av det, gi oss beskjed i diskusjonsseksjonen! + +Datasettet har følgende kolonner relatert til gjennomsnittsscore og antall anmeldelser: + +1. Hotel_Name +2. Additional_Number_of_Scoring +3. Average_Score +4. Total_Number_of_Reviews +5. Reviewer_Score + +Hotellet med flest anmeldelser i dette datasettet er *Britannia International Hotel Canary Wharf* med 4789 anmeldelser av 515,000. Men hvis vi ser på verdien `Total_Number_of_Reviews` for dette hotellet, er det 9086. Du kan anta at det er mange flere scorer uten anmeldelser, så kanskje vi bør legge til verdien i kolonnen `Additional_Number_of_Scoring`. Den verdien er 2682, og å legge den til 4789 gir oss 7471, som fortsatt er 1615 mindre enn `Total_Number_of_Reviews`. + +Hvis du tar kolonnen `Average_Score`, kan du anta at det er gjennomsnittet av anmeldelsene i datasettet, men beskrivelsen fra Kaggle er "*Gjennomsnittsscore for hotellet, beregnet basert på den nyeste kommentaren det siste året*". Det virker ikke så nyttig, men vi kan beregne vårt eget gjennomsnitt basert på anmeldelsesscorene i datasettet. Ved å bruke det samme hotellet som et eksempel, er den gjennomsnittlige hotellscoren gitt som 7.1, men den beregnede scoren (gjennomsnittlig anmelder-score *i* datasettet) er 6.8. Dette er nært, men ikke den samme verdien, og vi kan bare gjette at scorene gitt i `Additional_Number_of_Scoring`-anmeldelsene økte gjennomsnittet til 7.1. Dessverre, uten noen måte å teste eller bevise den påstanden, er det vanskelig å bruke eller stole på `Average_Score`, `Additional_Number_of_Scoring` og `Total_Number_of_Reviews` når de er basert på, eller refererer til, data vi ikke har. + +For å komplisere ting ytterligere, har hotellet med det nest høyeste antallet anmeldelser en beregnet gjennomsnittsscore på 8.12, og datasettets `Average_Score` er 8.1. Er denne korrekte scoren en tilfeldighet, eller er det første hotellet et avvik? + +På muligheten for at disse hotellene kan være uteliggere, og at kanskje de fleste verdiene stemmer (men noen gjør det ikke av en eller annen grunn), vil vi skrive et kort program neste gang for å utforske verdiene i datasettet og bestemme korrekt bruk (eller ikke-bruk) av verdiene. +> 🚨 En advarsel + +> Når du arbeider med dette datasettet, vil du skrive kode som beregner noe ut fra teksten uten å måtte lese eller analysere teksten selv. Dette er essensen av NLP, å tolke mening eller sentiment uten at en menneskelig person trenger å gjøre det. Det er imidlertid mulig at du vil lese noen av de negative anmeldelsene. Jeg vil sterkt oppfordre deg til å la være, fordi du ikke trenger det. Noen av dem er tullete eller irrelevante negative hotellanmeldelser, som for eksempel "Været var ikke bra", noe som er utenfor hotellets, eller noens, kontroll. Men det finnes også en mørk side ved noen anmeldelser. Noen ganger er de negative anmeldelsene rasistiske, sexistiske eller aldersdiskriminerende. Dette er uheldig, men forventet i et datasett hentet fra en offentlig nettside. Noen anmeldere legger igjen anmeldelser som du kan finne smakløse, ubehagelige eller opprørende. Det er bedre å la koden måle sentimentet enn å lese dem selv og bli opprørt. Når det er sagt, er det en minoritet som skriver slike ting, men de finnes likevel. +## Øvelse - Datautforskning +### Last inn dataene + +Det er nok å undersøke dataene visuelt, nå skal du skrive litt kode og få noen svar! Denne delen bruker pandas-biblioteket. Din aller første oppgave er å sørge for at du kan laste inn og lese CSV-dataene. Pandas-biblioteket har en rask CSV-laster, og resultatet plasseres i en dataframe, som i tidligere leksjoner. CSV-filen vi laster inn har over en halv million rader, men bare 17 kolonner. Pandas gir deg mange kraftige måter å samhandle med en dataframe på, inkludert muligheten til å utføre operasjoner på hver rad. + +Fra nå av i denne leksjonen vil det være kodeeksempler, noen forklaringer av koden og diskusjoner om hva resultatene betyr. Bruk den inkluderte _notebook.ipynb_ for koden din. + +La oss starte med å laste inn datafilen du skal bruke: + +```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") +``` + +Nå som dataene er lastet inn, kan vi utføre noen operasjoner på dem. Hold denne koden øverst i programmet ditt for neste del. + +## Utforsk dataene + +I dette tilfellet er dataene allerede *rene*, det betyr at de er klare til å jobbe med og ikke inneholder tegn fra andre språk som kan skape problemer for algoritmer som forventer kun engelske tegn. + +✅ Du kan komme til å jobbe med data som krever en viss forhåndsbehandling for å formatere dem før du bruker NLP-teknikker, men ikke denne gangen. Hvis du måtte, hvordan ville du håndtert ikke-engelske tegn? + +Ta et øyeblikk for å forsikre deg om at når dataene er lastet inn, kan du utforske dem med kode. Det er veldig lett å ville fokusere på kolonnene `Negative_Review` og `Positive_Review`. De er fylt med naturlig tekst som NLP-algoritmene dine kan prosessere. Men vent! Før du hopper inn i NLP og sentimentanalyse, bør du følge koden nedenfor for å fastslå om verdiene som er gitt i datasettet samsvarer med verdiene du beregner med pandas. + +## Dataframe-operasjoner + +Den første oppgaven i denne leksjonen er å sjekke om følgende påstander er korrekte ved å skrive litt kode som undersøker dataframen (uten å endre den). + +> Som med mange programmeringsoppgaver, finnes det flere måter å løse dette på, men et godt råd er å gjøre det på den enkleste og letteste måten, spesielt hvis det vil være lettere å forstå når du kommer tilbake til denne koden i fremtiden. Med dataframes finnes det et omfattende API som ofte vil ha en effektiv måte å gjøre det du ønsker. + +Behandle følgende spørsmål som kodingsoppgaver og prøv å svare på dem uten å se på løsningen. + +1. Skriv ut *formen* til dataframen du nettopp har lastet inn (formen er antall rader og kolonner). +2. Beregn frekvensen for anmeldernasjonaliteter: + 1. Hvor mange distinkte verdier finnes det i kolonnen `Reviewer_Nationality`, og hva er de? + 2. Hvilken anmeldernasjonalitet er den vanligste i datasettet (skriv ut land og antall anmeldelser)? + 3. Hva er de neste 10 mest vanlige nasjonalitetene, og deres frekvens? +3. Hvilket hotell ble anmeldt oftest for hver av de 10 mest vanlige anmeldernasjonalitetene? +4. Hvor mange anmeldelser er det per hotell (frekvensen av anmeldelser per hotell) i datasettet? +5. Selv om det finnes en kolonne `Average_Score` for hvert hotell i datasettet, kan du også beregne en gjennomsnittsscore (ved å ta gjennomsnittet av alle anmelderscorer i datasettet for hvert hotell). Legg til en ny kolonne i dataframen med kolonneoverskriften `Calc_Average_Score` som inneholder den beregnede gjennomsnittsscoren. +6. Har noen hoteller samme (avrundet til én desimal) `Average_Score` og `Calc_Average_Score`? + 1. Prøv å skrive en Python-funksjon som tar en Series (rad) som et argument og sammenligner verdiene, og skriver ut en melding når verdiene ikke er like. Bruk deretter `.apply()`-metoden for å prosessere hver rad med funksjonen. +7. Beregn og skriv ut hvor mange rader som har verdien "No Negative" i kolonnen `Negative_Review`. +8. Beregn og skriv ut hvor mange rader som har verdien "No Positive" i kolonnen `Positive_Review`. +9. Beregn og skriv ut hvor mange rader som har verdien "No Positive" i kolonnen `Positive_Review` **og** verdien "No Negative" i kolonnen `Negative_Review`. + +### Kodesvar + +1. Skriv ut *formen* til dataframen du nettopp har lastet inn (formen er antall rader og kolonner). + + ```python + print("The shape of the data (rows, cols) is " + str(df.shape)) + > The shape of the data (rows, cols) is (515738, 17) + ``` + +2. Beregn frekvensen for anmeldernasjonaliteter: + + 1. Hvor mange distinkte verdier finnes det i kolonnen `Reviewer_Nationality`, og hva er de? + 2. Hvilken anmeldernasjonalitet er den vanligste i datasettet (skriv ut land og antall anmeldelser)? + + ```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. Hva er de neste 10 mest vanlige nasjonalitetene, og deres frekvens? + + ```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. Hvilket hotell ble anmeldt oftest for hver av de 10 mest vanlige anmeldernasjonalitetene? + + ```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. Hvor mange anmeldelser er det per hotell (frekvensen av anmeldelser per hotell) i datasettet? + + ```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 | + + Du vil kanskje legge merke til at resultatene *telt i datasettet* ikke samsvarer med verdien i `Total_Number_of_Reviews`. Det er uklart om denne verdien i datasettet representerer det totale antallet anmeldelser hotellet hadde, men ikke alle ble skrapet, eller om det er en annen beregning. `Total_Number_of_Reviews` brukes ikke i modellen på grunn av denne uklarheten. + +5. Selv om det finnes en kolonne `Average_Score` for hvert hotell i datasettet, kan du også beregne en gjennomsnittsscore (ved å ta gjennomsnittet av alle anmelderscorer i datasettet for hvert hotell). Legg til en ny kolonne i dataframen med kolonneoverskriften `Calc_Average_Score` som inneholder den beregnede gjennomsnittsscoren. Skriv ut kolonnene `Hotel_Name`, `Average_Score` og `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"]]) + ``` + + Du lurer kanskje også på verdien `Average_Score` og hvorfor den noen ganger er forskjellig fra den beregnede gjennomsnittsscoren. Siden vi ikke kan vite hvorfor noen av verdiene samsvarer, men andre har en forskjell, er det tryggest i dette tilfellet å bruke anmelderscorene vi har for å beregne gjennomsnittet selv. Når det er sagt, er forskjellene vanligvis veldig små. Her er hotellene med størst avvik mellom gjennomsnittet i datasettet og det beregnede gjennomsnittet: + + | 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 | + + Med bare 1 hotell som har en forskjell i score større enn 1, betyr det at vi sannsynligvis kan ignorere forskjellen og bruke den beregnede gjennomsnittsscoren. + +6. Beregn og skriv ut hvor mange rader som har verdien "No Negative" i kolonnen `Negative_Review`. + +7. Beregn og skriv ut hvor mange rader som har verdien "No Positive" i kolonnen `Positive_Review`. + +8. Beregn og skriv ut hvor mange rader som har verdien "No Positive" i kolonnen `Positive_Review` **og** verdien "No Negative" i kolonnen `Negative_Review`. + + ```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 + ``` + +## En annen måte + +En annen måte å telle elementer uten Lambdas, og bruke sum for å telle radene: + + ```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 + ``` + + Du har kanskje lagt merke til at det er 127 rader som har både "No Negative" og "No Positive" verdier i kolonnene `Negative_Review` og `Positive_Review` henholdsvis. Det betyr at anmelderen ga hotellet en numerisk score, men unnlot å skrive enten en positiv eller negativ anmeldelse. Heldigvis er dette en liten mengde rader (127 av 515738, eller 0,02 %), så det vil sannsynligvis ikke skjevfordele modellen vår eller resultatene i noen bestemt retning, men du hadde kanskje ikke forventet at et datasett med anmeldelser skulle ha rader uten anmeldelser, så det er verdt å utforske dataene for å oppdage slike rader. + +Nå som du har utforsket datasettet, vil du i neste leksjon filtrere dataene og legge til litt sentimentanalyse. + +--- +## 🚀Utfordring + +Denne leksjonen viser, som vi så i tidligere leksjoner, hvor kritisk viktig det er å forstå dataene dine og deres særegenheter før du utfører operasjoner på dem. Tekstbaserte data krever spesielt nøye gransking. Grav gjennom ulike teksttunge datasett og se om du kan oppdage områder som kan introdusere skjevhet eller skjev sentimentanalyse i en modell. + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang og selvstudium + +Ta [denne læringsstien om NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) for å oppdage verktøy du kan prøve når du bygger tale- og teksttunge modeller. + +## Oppgave + +[NLTK](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/4-Hotel-Reviews-1/assignment.md b/translations/no/6-NLP/4-Hotel-Reviews-1/assignment.md new file mode 100644 index 000000000..2f394cd90 --- /dev/null +++ b/translations/no/6-NLP/4-Hotel-Reviews-1/assignment.md @@ -0,0 +1,19 @@ + +# NLTK + +## Instruksjoner + +NLTK er et velkjent bibliotek for bruk innenfor datalingvistikk og NLP. Benytt denne anledningen til å lese gjennom '[NLTK-boken](https://www.nltk.org/book/)' og prøv ut øvelsene der. I denne ikke-vurderte oppgaven vil du bli bedre kjent med dette biblioteket. + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md b/translations/no/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md new file mode 100644 index 000000000..5241e315f --- /dev/null +++ b/translations/no/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/4-Hotel-Reviews-1/solution/R/README.md b/translations/no/6-NLP/4-Hotel-Reviews-1/solution/R/README.md new file mode 100644 index 000000000..ad3cfa0ea --- /dev/null +++ b/translations/no/6-NLP/4-Hotel-Reviews-1/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/5-Hotel-Reviews-2/README.md b/translations/no/6-NLP/5-Hotel-Reviews-2/README.md new file mode 100644 index 000000000..d35fa99aa --- /dev/null +++ b/translations/no/6-NLP/5-Hotel-Reviews-2/README.md @@ -0,0 +1,389 @@ + +# Sentimentanalyse med hotellanmeldelser + +Nå som du har utforsket datasettet i detalj, er det på tide å filtrere kolonnene og deretter bruke NLP-teknikker på datasettet for å få nye innsikter om hotellene. + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +### Filtrering og sentimentanalyse-operasjoner + +Som du sikkert har lagt merke til, har datasettet noen problemer. Noen kolonner er fylt med unyttig informasjon, andre virker feil. Selv om de er korrekte, er det uklart hvordan de ble beregnet, og svarene kan ikke uavhengig verifiseres med dine egne beregninger. + +## Oppgave: litt mer databehandling + +Rens dataene litt mer. Legg til kolonner som vil være nyttige senere, endre verdiene i andre kolonner, og fjern visse kolonner helt. + +1. Innledende kolonnebehandling + + 1. Fjern `lat` og `lng` + + 2. Erstatt verdiene i `Hotel_Address` med følgende verdier (hvis adressen inneholder navnet på byen og landet, endre det til bare byen og landet). + + Dette er de eneste byene og landene i datasettet: + + Amsterdam, Nederland + + Barcelona, Spania + + London, Storbritannia + + Milano, Italia + + Paris, Frankrike + + Wien, Østerrike + + ```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()) + ``` + + Nå kan du hente data på landsnivå: + + ```python + display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"})) + ``` + + | Hotel_Address | Hotel_Name | + | :--------------------- | :--------: | + | Amsterdam, Nederland | 105 | + | Barcelona, Spania | 211 | + | London, Storbritannia | 400 | + | Milano, Italia | 162 | + | Paris, Frankrike | 458 | + | Wien, Østerrike | 158 | + +2. Behandle hotell-meta-anmeldelseskolonner + + 1. Fjern `Additional_Number_of_Scoring` + + 2. Erstatt `Total_Number_of_Reviews` med det totale antallet anmeldelser for det hotellet som faktisk er i datasettet + + 3. Erstatt `Average_Score` med vår egen beregnede score + + ```python + # Drop `Additional_Number_of_Scoring` + df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True) + # Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values + df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count') + df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + ``` + +3. Behandle anmeldelseskolonner + + 1. Fjern `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` og `days_since_review` + + 2. Behold `Reviewer_Score`, `Negative_Review` og `Positive_Review` som de er + + 3. Behold `Tags` for nå + + - Vi skal gjøre noen ekstra filtreringsoperasjoner på taggene i neste seksjon, og deretter vil taggene bli fjernet + +4. Behandle anmelderkolonner + + 1. Fjern `Total_Number_of_Reviews_Reviewer_Has_Given` + + 2. Behold `Reviewer_Nationality` + +### Tag-kolonner + +`Tag`-kolonnen er problematisk siden den er en liste (i tekstform) lagret i kolonnen. Dessverre er rekkefølgen og antallet underseksjoner i denne kolonnen ikke alltid det samme. Det er vanskelig for et menneske å identifisere de riktige frasene som er interessante, fordi det er 515 000 rader og 1427 hoteller, og hver har litt forskjellige alternativer en anmelder kunne velge. Her kommer NLP til nytte. Du kan skanne teksten og finne de vanligste frasene og telle dem. + +Dessverre er vi ikke interessert i enkeltord, men flervordsfraser (f.eks. *Forretningsreise*). Å kjøre en flervordsfrekvensfordelingsalgoritme på så mye data (6762646 ord) kan ta ekstremt lang tid, men uten å se på dataene, virker det som om det er en nødvendig utgift. Her kommer utforskende dataanalyse til nytte, fordi du har sett et utvalg av taggene som `[' Forretningsreise ', ' Alenereisende ', ' Enkeltrom ', ' Bodde 5 netter ', ' Sendt fra en mobil enhet ']`, kan du begynne å spørre om det er mulig å redusere prosesseringen betydelig. Heldigvis er det det - men først må du følge noen få trinn for å fastslå hvilke tagger som er interessante. + +### Filtrering av tagger + +Husk at målet med datasettet er å legge til sentiment og kolonner som vil hjelpe deg med å velge det beste hotellet (for deg selv eller kanskje en klient som ber deg lage en hotellanbefalingsbot). Du må spørre deg selv om taggene er nyttige eller ikke i det endelige datasettet. Her er en tolkning (hvis du trengte datasettet av andre grunner, kan forskjellige tagger bli inkludert/utelatt): + +1. Typen reise er relevant, og det bør beholdes +2. Typen gjestegruppe er viktig, og det bør beholdes +3. Typen rom, suite eller studio som gjesten bodde i er irrelevant (alle hoteller har stort sett de samme rommene) +4. Enheten anmeldelsen ble sendt fra er irrelevant +5. Antall netter anmelderen bodde *kan* være relevant hvis du tilskriver lengre opphold til at de likte hotellet mer, men det er en svak sammenheng og sannsynligvis irrelevant + +Oppsummert, **behold 2 typer tagger og fjern de andre**. + +Først vil du ikke telle taggene før de er i et bedre format, så det betyr å fjerne firkantede parenteser og anførselstegn. Du kan gjøre dette på flere måter, men du vil ha den raskeste siden det kan ta lang tid å behandle mye data. Heldigvis har pandas en enkel måte å gjøre hvert av disse trinnene på. + +```Python +# Remove opening and closing brackets +df.Tags = df.Tags.str.strip("[']") +# remove all quotes too +df.Tags = df.Tags.str.replace(" ', '", ",", regex = False) +``` + +Hver tag blir noe som: `Forretningsreise, Alenereisende, Enkeltrom, Bodde 5 netter, Sendt fra en mobil enhet`. + +Neste finner vi et problem. Noen anmeldelser, eller rader, har 5 kolonner, noen 3, noen 6. Dette er et resultat av hvordan datasettet ble opprettet, og vanskelig å fikse. Du vil få en frekvenstelling av hver frase, men de er i forskjellig rekkefølge i hver anmeldelse, så tellingen kan være feil, og et hotell kan ikke få en tag tilordnet som det fortjente. + +I stedet vil du bruke den forskjellige rekkefølgen til vår fordel, fordi hver tag er flervords, men også separert med komma! Den enkleste måten å gjøre dette på er å opprette 6 midlertidige kolonner med hver tag satt inn i kolonnen som tilsvarer dens rekkefølge i taggen. Du kan deretter slå sammen de 6 kolonnene til én stor kolonne og kjøre `value_counts()`-metoden på den resulterende kolonnen. Ved å skrive ut dette, vil du se at det var 2428 unike tagger. Her er et lite utvalg: + +| Tag | Count | +| ------------------------------ | ------ | +| Fritidsreise | 417778 | +| Sendt fra en mobil enhet | 307640 | +| Par | 252294 | +| Bodde 1 natt | 193645 | +| Bodde 2 netter | 133937 | +| Alenereisende | 108545 | +| Bodde 3 netter | 95821 | +| Forretningsreise | 82939 | +| Gruppe | 65392 | +| Familie med små barn | 61015 | +| Bodde 4 netter | 47817 | +| Dobbeltrom | 35207 | +| Standard dobbeltrom | 32248 | +| Superior dobbeltrom | 31393 | +| Familie med eldre barn | 26349 | +| Deluxe dobbeltrom | 24823 | +| Dobbelt- eller tomannsrom | 22393 | +| Bodde 5 netter | 20845 | +| Standard dobbelt- eller tomannsrom | 17483 | +| Klassisk dobbeltrom | 16989 | +| Superior dobbelt- eller tomannsrom | 13570 | +| 2 rom | 12393 | + +Noen av de vanlige taggene som `Sendt fra en mobil enhet` er ikke nyttige for oss, så det kan være smart å fjerne dem før du teller fraseforekomst, men det er en så rask operasjon at du kan la dem være og ignorere dem. + +### Fjerne tagger for lengden på oppholdet + +Å fjerne disse taggene er trinn 1, det reduserer det totale antallet tagger som skal vurderes litt. Merk at du ikke fjerner dem fra datasettet, bare velger å fjerne dem fra vurdering som verdier å telle/beholde i anmeldelsesdatasettet. + +| Lengde på opphold | Count | +| ------------------ | ------ | +| Bodde 1 natt | 193645 | +| Bodde 2 netter | 133937 | +| Bodde 3 netter | 95821 | +| Bodde 4 netter | 47817 | +| Bodde 5 netter | 20845 | +| Bodde 6 netter | 9776 | +| Bodde 7 netter | 7399 | +| Bodde 8 netter | 2502 | +| Bodde 9 netter | 1293 | +| ... | ... | + +Det finnes et stort utvalg av rom, suiter, studioer, leiligheter og så videre. De betyr stort sett det samme og er ikke relevante for deg, så fjern dem fra vurdering. + +| Type rom | Count | +| ----------------------------- | ----- | +| Dobbeltrom | 35207 | +| Standard dobbeltrom | 32248 | +| Superior dobbeltrom | 31393 | +| Deluxe dobbeltrom | 24823 | +| Dobbelt- eller tomannsrom | 22393 | +| Standard dobbelt- eller tomannsrom | 17483 | +| Klassisk dobbeltrom | 16989 | +| Superior dobbelt- eller tomannsrom | 13570 | + +Til slutt, og dette er gledelig (fordi det ikke tok mye prosessering i det hele tatt), vil du bli igjen med følgende *nyttige* tagger: + +| Tag | Count | +| --------------------------------------------- | ------ | +| Fritidsreise | 417778 | +| Par | 252294 | +| Alenereisende | 108545 | +| Forretningsreise | 82939 | +| Gruppe (kombinert med Reisende med venner) | 67535 | +| Familie med små barn | 61015 | +| Familie med eldre barn | 26349 | +| Med et kjæledyr | 1405 | + +Du kan argumentere for at `Reisende med venner` er det samme som `Gruppe` mer eller mindre, og det ville være rimelig å kombinere de to som ovenfor. Koden for å identifisere de riktige taggene finnes i [Tags-notatboken](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb). + +Det siste trinnet er å opprette nye kolonner for hver av disse taggene. Deretter, for hver anmeldelsesrad, hvis `Tag`-kolonnen samsvarer med en av de nye kolonnene, legg til en 1, hvis ikke, legg til en 0. Sluttresultatet vil være en telling av hvor mange anmeldere som valgte dette hotellet (i aggregat) for, for eksempel, forretning vs fritid, eller for å ta med et kjæledyr, og dette er nyttig informasjon når du skal anbefale et hotell. + +```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) + +``` + +### Lagre filen + +Til slutt, lagre datasettet slik det er nå med et nytt navn. + +```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) +``` + +## Sentimentanalyse-operasjoner + +I denne siste seksjonen skal du bruke sentimentanalyse på anmeldelseskolonnene og lagre resultatene i et datasett. + +## Oppgave: last inn og lagre de filtrerte dataene + +Merk at du nå laster inn det filtrerte datasettet som ble lagret i forrige seksjon, **ikke** det originale datasettet. + +```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) +``` + +### Fjerne stoppord + +Hvis du skulle kjøre sentimentanalyse på de negative og positive anmeldelseskolonnene, kan det ta lang tid. Testet på en kraftig test-laptop med rask CPU, tok det 12–14 minutter avhengig av hvilken sentimentbibliotek som ble brukt. Det er en (relativt) lang tid, så det er verdt å undersøke om det kan gjøres raskere. + +Å fjerne stoppord, eller vanlige engelske ord som ikke endrer sentimentet i en setning, er det første trinnet. Ved å fjerne dem, bør sentimentanalysen kjøre raskere, men ikke være mindre nøyaktig (siden stoppordene ikke påvirker sentimentet, men de bremser analysen). + +Den lengste negative anmeldelsen var 395 ord, men etter å ha fjernet stoppordene, er den 195 ord. + +Å fjerne stoppordene er også en rask operasjon, å fjerne stoppordene fra 2 anmeldelseskolonner over 515 000 rader tok 3,3 sekunder på test-enheten. Det kan ta litt mer eller mindre tid for deg avhengig av enhetens CPU-hastighet, RAM, om du har SSD eller ikke, og noen andre faktorer. Den relativt korte tiden for operasjonen betyr at hvis det forbedrer sentimentanalysen, er det verdt å gjøre. + +```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) +``` + +### Utføre sentimentanalyse + +Nå bør du beregne sentimentanalysen for både negative og positive anmeldelseskolonner, og lagre resultatet i 2 nye kolonner. Testen av sentimentet vil være å sammenligne det med anmelderens score for samme anmeldelse. For eksempel, hvis sentimentet mener den negative anmeldelsen hadde et sentiment på 1 (ekstremt positivt sentiment) og et positivt anmeldelsessentiment på 1, men anmelderen ga hotellet den laveste scoren mulig, så stemmer enten ikke anmeldelsesteksten med scoren, eller sentimentanalysatoren kunne ikke gjenkjenne sentimentet korrekt. Du bør forvente at noen sentimentresultater er helt feil, og ofte vil det være forklarbart, f.eks. anmeldelsen kan være ekstremt sarkastisk "Selvfølgelig ELSKET jeg å sove i et rom uten oppvarming" og sentimentanalysatoren tror det er positivt sentiment, selv om et menneske som leser det ville vite at det var sarkasme. +NLTK tilbyr forskjellige sentimentanalysatorer som du kan lære med, og du kan bytte dem ut og se om sentimentet blir mer eller mindre nøyaktig. VADER sentimentanalyse brukes her. + +> 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, juni 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"] +``` + +Senere i programmet, når du er klar til å beregne sentiment, kan du bruke det på hver anmeldelse som følger: + +```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") +``` + +Dette tar omtrent 120 sekunder på min datamaskin, men det vil variere fra datamaskin til datamaskin. Hvis du vil skrive ut resultatene og se om sentimentet samsvarer med anmeldelsen: + +```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"]]) +``` + +Det aller siste du må gjøre med filen før du bruker den i utfordringen, er å lagre den! Du bør også vurdere å omorganisere alle de nye kolonnene dine slik at de er enkle å jobbe med (for et menneske er dette en kosmetisk endring). + +```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) +``` + +Du bør kjøre hele koden for [analyse-notatboken](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (etter at du har kjørt [filtrerings-notatboken](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) for å generere Hotel_Reviews_Filtered.csv-filen). + +For å oppsummere, trinnene er: + +1. Den originale datasettfilen **Hotel_Reviews.csv** utforskes i forrige leksjon med [utforsker-notatboken](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb) +2. Hotel_Reviews.csv filtreres av [filtrerings-notatboken](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) og resulterer i **Hotel_Reviews_Filtered.csv** +3. Hotel_Reviews_Filtered.csv behandles av [sentimentanalyse-notatboken](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) og resulterer i **Hotel_Reviews_NLP.csv** +4. Bruk Hotel_Reviews_NLP.csv i NLP-utfordringen nedenfor + +### Konklusjon + +Da du startet, hadde du et datasett med kolonner og data, men ikke alt kunne verifiseres eller brukes. Du har utforsket dataene, filtrert ut det du ikke trenger, konvertert tagger til noe nyttig, beregnet dine egne gjennomsnitt, lagt til noen sentimentkolonner og forhåpentligvis lært noen interessante ting om behandling av naturlig tekst. + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Utfordring + +Nå som du har analysert datasettet for sentiment, se om du kan bruke strategier du har lært i dette kurset (klustering, kanskje?) for å finne mønstre rundt sentiment. + +## Gjennomgang & Selvstudium + +Ta [denne Learn-modulen](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) for å lære mer og bruke forskjellige verktøy for å utforske sentiment i tekst. + +## Oppgave + +[Prøv et annet datasett](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/5-Hotel-Reviews-2/assignment.md b/translations/no/6-NLP/5-Hotel-Reviews-2/assignment.md new file mode 100644 index 000000000..3abc4945d --- /dev/null +++ b/translations/no/6-NLP/5-Hotel-Reviews-2/assignment.md @@ -0,0 +1,25 @@ + +# Prøv et annet datasett + +## Instruksjoner + +Nå som du har lært å bruke NLTK for å tildele sentiment til tekst, prøv et annet datasett. Du vil sannsynligvis måtte gjøre noe databehandling rundt det, så opprett en notatbok og dokumenter tankeprosessen din. Hva oppdager du? + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ---------------------- | +| | En komplett notatbok og datasett presenteres med godt dokumenterte celler som forklarer hvordan sentiment tildeles | Notatboken mangler gode forklaringer | Notatboken har mangler | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md b/translations/no/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md new file mode 100644 index 000000000..6916ad447 --- /dev/null +++ b/translations/no/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, ber vi deg være oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/5-Hotel-Reviews-2/solution/R/README.md b/translations/no/6-NLP/5-Hotel-Reviews-2/solution/R/README.md new file mode 100644 index 000000000..a01c1cb11 --- /dev/null +++ b/translations/no/6-NLP/5-Hotel-Reviews-2/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/README.md b/translations/no/6-NLP/README.md new file mode 100644 index 000000000..018f279e6 --- /dev/null +++ b/translations/no/6-NLP/README.md @@ -0,0 +1,38 @@ + +# Komme i gang med naturlig språkbehandling + +Naturlig språkbehandling (NLP) er evnen til et dataprogram til å forstå menneskelig språk slik det blir snakket og skrevet – referert til som naturlig språk. Det er en komponent av kunstig intelligens (AI). NLP har eksistert i mer enn 50 år og har røtter i lingvistikkens felt. Hele feltet er rettet mot å hjelpe maskiner med å forstå og behandle menneskelig språk. Dette kan deretter brukes til å utføre oppgaver som stavekontroll eller maskinoversettelse. Det har en rekke virkelige anvendelser innen flere felt, inkludert medisinsk forskning, søkemotorer og forretningsanalyse. + +## Regionalt tema: Europeiske språk og litteratur og romantiske hoteller i Europa ❤️ + +I denne delen av læreplanen vil du bli introdusert til en av de mest utbredte bruksområdene for maskinlæring: naturlig språkbehandling (NLP). Avledet fra datalingvistikk, er denne kategorien av kunstig intelligens broen mellom mennesker og maskiner via stemme- eller tekstkommunikasjon. + +I disse leksjonene skal vi lære det grunnleggende om NLP ved å bygge små samtaleboter for å forstå hvordan maskinlæring hjelper til med å gjøre disse samtalene mer og mer 'smarte'. Du vil reise tilbake i tid og chatte med Elizabeth Bennett og Mr. Darcy fra Jane Austens klassiske roman, **Stolthet og fordom**, utgitt i 1813. Deretter vil du utvide kunnskapen din ved å lære om sentimentanalyse via hotellanmeldelser i Europa. + +![Stolthet og fordom bok og te](../../../6-NLP/images/p&p.jpg) +> Foto av Elaine HowlinUnsplash + +## Leksjoner + +1. [Introduksjon til naturlig språkbehandling](1-Introduction-to-NLP/README.md) +2. [Vanlige NLP-oppgaver og teknikker](2-Tasks/README.md) +3. [Oversettelse og sentimentanalyse med maskinlæring](3-Translation-Sentiment/README.md) +4. [Forberedelse av dataene dine](4-Hotel-Reviews-1/README.md) +5. [NLTK for sentimentanalyse](5-Hotel-Reviews-2/README.md) + +## Krediteringer + +Disse leksjonene om naturlig språkbehandling ble skrevet med ☕ av [Stephen Howell](https://twitter.com/Howell_MSFT) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/6-NLP/data/README.md b/translations/no/6-NLP/data/README.md new file mode 100644 index 000000000..a778bfced --- /dev/null +++ b/translations/no/6-NLP/data/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/7-TimeSeries/1-Introduction/README.md b/translations/no/7-TimeSeries/1-Introduction/README.md new file mode 100644 index 000000000..f9bbecdfb --- /dev/null +++ b/translations/no/7-TimeSeries/1-Introduction/README.md @@ -0,0 +1,199 @@ + +# Introduksjon til tidsserieprognoser + +![Oppsummering av tidsserier i en sketchnote](../../../../sketchnotes/ml-timeseries.png) + +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +I denne leksjonen og den neste vil du lære litt om tidsserieprognoser, en interessant og verdifull del av en ML-forskers verktøykasse som er litt mindre kjent enn andre emner. Tidsserieprognoser er som en slags "krystallkule": basert på tidligere ytelse av en variabel, som pris, kan du forutsi dens fremtidige potensielle verdi. + +[![Introduksjon til tidsserieprognoser](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "Introduksjon til tidsserieprognoser") + +> 🎥 Klikk på bildet over for en video om tidsserieprognoser + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +Det er et nyttig og interessant felt med reell verdi for næringslivet, gitt dets direkte anvendelse på problemer som prissetting, lagerstyring og forsyningskjedeutfordringer. Selv om dype læringsteknikker har begynt å bli brukt for å få mer innsikt og bedre forutsi fremtidig ytelse, forblir tidsserieprognoser et felt som i stor grad er informert av klassiske ML-teknikker. + +> Penn States nyttige tidsseriepensum finner du [her](https://online.stat.psu.edu/stat510/lesson/1) + +## Introduksjon + +Anta at du administrerer en rekke smarte parkeringsmålere som gir data om hvor ofte de brukes og hvor lenge over tid. + +> Hva om du kunne forutsi, basert på målerens tidligere ytelse, dens fremtidige verdi i henhold til lovene om tilbud og etterspørsel? + +Å forutsi nøyaktig når man skal handle for å oppnå sitt mål er en utfordring som kan takles med tidsserieprognoser. Det ville ikke gjøre folk glade å bli belastet mer i travle tider når de leter etter en parkeringsplass, men det ville være en sikker måte å generere inntekter for å rengjøre gatene! + +La oss utforske noen av typene tidsseriealgoritmer og starte en notebook for å rense og forberede noen data. Dataene du vil analysere er hentet fra GEFCom2014 prognosekonkurransen. Det består av 3 år med timebaserte verdier for elektrisitetsforbruk og temperatur mellom 2012 og 2014. Gitt de historiske mønstrene for elektrisitetsforbruk og temperatur, kan du forutsi fremtidige verdier for elektrisitetsforbruk. + +I dette eksemplet vil du lære hvordan du forutsier ett tidssteg fremover, ved å bruke kun historiske forbruksdata. Før du starter, er det imidlertid nyttig å forstå hva som skjer bak kulissene. + +## Noen definisjoner + +Når du møter begrepet "tidsserie", må du forstå dets bruk i flere forskjellige sammenhenger. + +🎓 **Tidsserie** + +I matematikk er "en tidsserie en serie med datapunkter indeksert (eller listet eller grafet) i tidsrekkefølge. Oftest er en tidsserie en sekvens tatt ved suksessive, jevnt fordelte punkter i tid." Et eksempel på en tidsserie er den daglige sluttverdien av [Dow Jones Industrial Average](https://wikipedia.org/wiki/Time_series). Bruken av tidsserieplott og statistisk modellering er ofte sett i signalbehandling, værprognoser, jordskjelvforutsigelser og andre felt der hendelser oppstår og datapunkter kan plottes over tid. + +🎓 **Tidsserieanalyse** + +Tidsserieanalyse er analysen av den ovennevnte tidsseriedataen. Tidsseriedata kan ta forskjellige former, inkludert "avbrutte tidsserier" som oppdager mønstre i en tidsseries utvikling før og etter en avbrytende hendelse. Typen analyse som trengs for tidsserien, avhenger av naturen til dataene. Tidsseriedata i seg selv kan ta form av serier med tall eller tegn. + +Analysen som skal utføres, bruker en rekke metoder, inkludert frekvensdomene og tidsdomene, lineære og ikke-lineære, og mer. [Lær mer](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) om de mange måtene å analysere denne typen data. + +🎓 **Tidsserieprognoser** + +Tidsserieprognoser er bruken av en modell for å forutsi fremtidige verdier basert på mønstre vist av tidligere innsamlede data slik de oppstod i fortiden. Selv om det er mulig å bruke regresjonsmodeller for å utforske tidsseriedata, med tidsindekser som x-variabler på et plott, analyseres slike data best ved hjelp av spesielle typer modeller. + +Tidsseriedata er en liste med ordnede observasjoner, i motsetning til data som kan analyseres ved lineær regresjon. Den vanligste modellen er ARIMA, et akronym som står for "Autoregressive Integrated Moving Average". + +[ARIMA-modeller](https://online.stat.psu.edu/stat510/lesson/1/1.1) "relaterer den nåværende verdien av en serie til tidligere verdier og tidligere prediksjonsfeil." De er mest passende for å analysere tidsdomenedata, der data er ordnet over tid. + +> Det finnes flere typer ARIMA-modeller, som du kan lære om [her](https://people.duke.edu/~rnau/411arim.htm) og som du vil berøre i neste leksjon. + +I neste leksjon vil du bygge en ARIMA-modell ved hjelp av [Univariate Time Series](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm), som fokuserer på én variabel som endrer sin verdi over tid. Et eksempel på denne typen data er [dette datasettet](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) som registrerer den månedlige CO2-konsentrasjonen ved Mauna Loa-observatoriet: + +| 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 | + +✅ Identifiser variabelen som endrer seg over tid i dette datasettet + +## Tidsseriedataegenskaper å vurdere + +Når du ser på tidsseriedata, kan du legge merke til at det har [visse egenskaper](https://online.stat.psu.edu/stat510/lesson/1/1.1) som du må ta hensyn til og redusere for bedre å forstå mønstrene. Hvis du ser på tidsseriedata som potensielt gir et "signal" du vil analysere, kan disse egenskapene betraktes som "støy". Du må ofte redusere denne "støyen" ved å kompensere for noen av disse egenskapene ved hjelp av statistiske teknikker. + +Her er noen begreper du bør kjenne til for å kunne jobbe med tidsserier: + +🎓 **Trender** + +Trender er definert som målbare økninger og reduksjoner over tid. [Les mer](https://machinelearningmastery.com/time-series-trends-in-python). I sammenheng med tidsserier handler det om hvordan man bruker og, hvis nødvendig, fjerner trender fra tidsserien. + +🎓 **[Sesongvariasjon](https://machinelearningmastery.com/time-series-seasonality-with-python/)** + +Sesongvariasjon er definert som periodiske svingninger, som for eksempel høytidssalg som kan påvirke salget. [Ta en titt](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) på hvordan forskjellige typer plott viser sesongvariasjon i data. + +🎓 **Avvik** + +Avvik er datapunkter som ligger langt unna den normale variansen i dataene. + +🎓 **Langsiktig syklus** + +Uavhengig av sesongvariasjon kan data vise en langsiktig syklus, som for eksempel en økonomisk nedgang som varer lenger enn ett år. + +🎓 **Konstant varians** + +Over tid viser noen data konstante svingninger, som energiforbruk per dag og natt. + +🎓 **Brå endringer** + +Dataene kan vise en brå endring som kan kreve ytterligere analyse. For eksempel førte den plutselige nedstengningen av virksomheter på grunn av COVID til endringer i dataene. + +✅ Her er et [eksempel på et tidsserieplott](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) som viser daglig bruk av in-game valuta over noen år. Kan du identifisere noen av egenskapene som er nevnt ovenfor i disse dataene? + +![In-game valuta](../../../../7-TimeSeries/1-Introduction/images/currency.png) + +## Øvelse - komme i gang med strømforbruksdata + +La oss komme i gang med å lage en tidsseriemodell for å forutsi fremtidig strømforbruk basert på tidligere forbruk. + +> Dataene i dette eksemplet er hentet fra GEFCom2014 prognosekonkurransen. Det består av 3 år med timebaserte verdier for elektrisitetsforbruk og temperatur mellom 2012 og 2014. +> +> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli og Rob J. Hyndman, "Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond", International Journal of Forecasting, vol.32, no.3, pp 896-913, juli-september, 2016. + +1. I `working`-mappen for denne leksjonen, åpne _notebook.ipynb_-filen. Start med å legge til biblioteker som vil hjelpe deg med å laste inn og visualisere data + + ```python + import os + import matplotlib.pyplot as plt + from common.utils import load_data + %matplotlib inline + ``` + + Merk at du bruker filene fra den inkluderte `common`-mappen som setter opp miljøet ditt og håndterer nedlasting av dataene. + +2. Undersøk deretter dataene som en dataframe ved å kalle `load_data()` og `head()`: + + ```python + data_dir = './data' + energy = load_data(data_dir)[['load']] + energy.head() + ``` + + Du kan se at det er to kolonner som representerer dato og forbruk: + + | | 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. Nå, plott dataene ved å kalle `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() + ``` + + ![energiplott](../../../../7-TimeSeries/1-Introduction/images/energy-plot.png) + +4. Nå, plott den første uken i juli 2014, ved å gi den som input til `energy` i `[fra dato]: [til dato]`-mønsteret: + + ```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() + ``` + + ![juli](../../../../7-TimeSeries/1-Introduction/images/july-2014.png) + + Et vakkert plott! Ta en titt på disse plottene og se om du kan identifisere noen av egenskapene som er nevnt ovenfor. Hva kan vi anta ved å visualisere dataene? + +I neste leksjon vil du lage en ARIMA-modell for å lage noen prognoser. + +--- + +## 🚀Utfordring + +Lag en liste over alle bransjer og forskningsområder du kan tenke deg som vil ha nytte av tidsserieprognoser. Kan du tenke deg en anvendelse av disse teknikkene innen kunst? Innen økonometrikk? Økologi? Detaljhandel? Industri? Finans? Hvor ellers? + +## [Quiz etter leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang & Selvstudium + +Selv om vi ikke dekker dem her, brukes nevrale nettverk noen ganger for å forbedre klassiske metoder for tidsserieprognoser. Les mer om dem [i denne artikkelen](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412) + +## Oppgave + +[Visualiser flere tidsserier](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/7-TimeSeries/1-Introduction/assignment.md b/translations/no/7-TimeSeries/1-Introduction/assignment.md new file mode 100644 index 000000000..def0eccc0 --- /dev/null +++ b/translations/no/7-TimeSeries/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Visualiser noen flere tidsserier + +## Instruksjoner + +Du har begynt å lære om tidsserieprognoser ved å se på typen data som krever denne spesielle modelleringen. Du har visualisert noen data knyttet til energi. Nå, se deg rundt etter andre data som kan dra nytte av tidsserieprognoser. Finn tre eksempler (prøv [Kaggle](https://kaggle.com) og [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)) og lag en notatbok for å visualisere dem. Noter eventuelle spesielle egenskaper de har (sesongvariasjoner, brå endringer eller andre trender) i notatboken. + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | ------------------------------------------------------ | -------------------------------------------------- | --------------------------------------------------------------------------------------- | +| | Tre datasett er plottet og forklart i en notatbok | To datasett er plottet og forklart i en notatbok | Få datasett er plottet eller forklart i en notatbok, eller dataene som presenteres er utilstrekkelige | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/7-TimeSeries/1-Introduction/solution/Julia/README.md b/translations/no/7-TimeSeries/1-Introduction/solution/Julia/README.md new file mode 100644 index 000000000..0cb70787c --- /dev/null +++ b/translations/no/7-TimeSeries/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/7-TimeSeries/1-Introduction/solution/R/README.md b/translations/no/7-TimeSeries/1-Introduction/solution/R/README.md new file mode 100644 index 000000000..6891f865b --- /dev/null +++ b/translations/no/7-TimeSeries/1-Introduction/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/7-TimeSeries/2-ARIMA/README.md b/translations/no/7-TimeSeries/2-ARIMA/README.md new file mode 100644 index 000000000..f84cddec5 --- /dev/null +++ b/translations/no/7-TimeSeries/2-ARIMA/README.md @@ -0,0 +1,407 @@ + +# Tidsserieprognoser med ARIMA + +I forrige leksjon lærte du litt om tidsserieprognoser og lastet inn et datasett som viser svingninger i elektrisk belastning over en tidsperiode. + +[![Introduksjon til ARIMA](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Introduksjon til ARIMA") + +> 🎥 Klikk på bildet ovenfor for en video: En kort introduksjon til ARIMA-modeller. Eksempelet er gjort i R, men konseptene er universelle. + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Introduksjon + +I denne leksjonen vil du oppdage en spesifikk måte å bygge modeller på med [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average). ARIMA-modeller er spesielt godt egnet til å tilpasse data som viser [ikke-stasjonaritet](https://wikipedia.org/wiki/Stationary_process). + +## Generelle konsepter + +For å kunne jobbe med ARIMA, er det noen konsepter du må kjenne til: + +- 🎓 **Stasjonaritet**. Fra et statistisk perspektiv refererer stasjonaritet til data der distribusjonen ikke endres når den forskyves i tid. Ikke-stasjonære data viser derimot svingninger på grunn av trender som må transformeres for å kunne analyseres. Sesongvariasjoner, for eksempel, kan introdusere svingninger i data og kan elimineres ved en prosess kalt 'sesongdifferensiering'. + +- 🎓 **[Differensiering](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. Differensiering av data, igjen fra et statistisk perspektiv, refererer til prosessen med å transformere ikke-stasjonære data for å gjøre dem stasjonære ved å fjerne deres ikke-konstante trend. "Differensiering fjerner endringene i nivået til en tidsserie, eliminerer trend og sesongvariasjoner og stabiliserer dermed gjennomsnittet av tidsserien." [Paper av Shixiong et al](https://arxiv.org/abs/1904.07632) + +## ARIMA i konteksten av tidsserier + +La oss pakke ut delene av ARIMA for bedre å forstå hvordan det hjelper oss med å modellere tidsserier og lage prognoser basert på dem. + +- **AR - for AutoRegressiv**. Autoregressive modeller, som navnet antyder, ser 'tilbake' i tid for å analysere tidligere verdier i dataene dine og gjøre antakelser om dem. Disse tidligere verdiene kalles 'lags'. Et eksempel kan være data som viser månedlige salg av blyanter. Hver måneds salgssum vil bli betraktet som en 'utviklende variabel' i datasettet. Denne modellen bygges ved at "den utviklende variabelen av interesse regresseres på sine egne forsinkede (dvs. tidligere) verdier." [wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) + +- **I - for Integrert**. I motsetning til de lignende 'ARMA'-modellene, refererer 'I' i ARIMA til dens *[integrerte](https://wikipedia.org/wiki/Order_of_integration)* aspekt. Dataene blir 'integrert' når differensieringstrinn brukes for å eliminere ikke-stasjonaritet. + +- **MA - for Glidende Gjennomsnitt**. Det [glidende gjennomsnittet](https://wikipedia.org/wiki/Moving-average_model) i denne modellen refererer til utgangsvariabelen som bestemmes ved å observere nåværende og tidligere verdier av lags. + +Kort oppsummert: ARIMA brukes til å lage en modell som passer så tett som mulig til den spesielle formen for tidsseriedata. + +## Øvelse - bygg en ARIMA-modell + +Åpne [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working)-mappen i denne leksjonen og finn filen [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb). + +1. Kjør notebooken for å laste inn Python-biblioteket `statsmodels`; du trenger dette for ARIMA-modeller. + +1. Last inn nødvendige biblioteker. + +1. Deretter laster du inn flere biblioteker som er nyttige for å plotte data: + + ```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. Last inn data fra `/data/energy.csv`-filen til en Pandas dataframe og ta en titt: + + ```python + energy = load_data('./data')[['load']] + energy.head(10) + ``` + +1. Plot all tilgjengelig energidata fra januar 2012 til desember 2014. Det bør ikke være noen overraskelser, da vi så disse dataene i forrige leksjon: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + Nå, la oss bygge en modell! + +### Opprett trenings- og testdatasett + +Nå er dataene dine lastet inn, så du kan dele dem opp i trenings- og testsett. Du vil trene modellen din på treningssettet. Som vanlig, etter at modellen er ferdig trent, vil du evaluere nøyaktigheten ved hjelp av testsettet. Du må sørge for at testsettet dekker en senere tidsperiode enn treningssettet for å sikre at modellen ikke får informasjon fra fremtidige tidsperioder. + +1. Tildel en to-måneders periode fra 1. september til 31. oktober 2014 til treningssettet. Testsettet vil inkludere to-måneders perioden fra 1. november til 31. desember 2014: + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + + Siden disse dataene reflekterer det daglige energiforbruket, er det et sterkt sesongmønster, men forbruket er mest likt forbruket i mer nylige dager. + +1. Visualiser forskjellene: + + ```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() + ``` + + ![trenings- og testdata](../../../../7-TimeSeries/2-ARIMA/images/train-test.png) + + Derfor bør det være tilstrekkelig å bruke et relativt lite tidsvindu for å trene dataene. + + > Merk: Siden funksjonen vi bruker for å tilpasse ARIMA-modellen bruker in-sample validering under tilpasning, vil vi utelate valideringsdata. + +### Forbered dataene for trening + +Nå må du forberede dataene for trening ved å filtrere og skalere dem. Filtrer datasettet ditt for kun å inkludere de nødvendige tidsperiodene og kolonnene, og skaler dataene for å sikre at de projiseres i intervallet 0,1. + +1. Filtrer det originale datasettet for kun å inkludere de nevnte tidsperiodene per sett og kun inkludere den nødvendige kolonnen 'load' pluss datoen: + + ```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) + ``` + + Du kan se formen på dataene: + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +1. Skaler dataene til å være i området (0, 1). + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + train.head(10) + ``` + +1. Visualiser de originale vs. skalerte dataene: + + ```python + energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12) + train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12) + plt.show() + ``` + + ![original](../../../../7-TimeSeries/2-ARIMA/images/original.png) + + > De originale dataene + + ![skalert](../../../../7-TimeSeries/2-ARIMA/images/scaled.png) + + > De skalerte dataene + +1. Nå som du har kalibrert de skalerte dataene, kan du skalere testdataene: + + ```python + test['load'] = scaler.transform(test) + test.head() + ``` + +### Implementer ARIMA + +Det er på tide å implementere ARIMA! Du vil nå bruke `statsmodels`-biblioteket som du installerte tidligere. + +Nå må du følge flere trinn: + + 1. Definer modellen ved å kalle `SARIMAX()` og sende inn modellparametrene: p, d og q-parametere, samt P, D og Q-parametere. + 2. Forbered modellen for treningsdataene ved å kalle fit()-funksjonen. + 3. Lag prognoser ved å kalle `forecast()`-funksjonen og spesifisere antall steg (horisonten) som skal prognoseres. + +> 🎓 Hva er alle disse parameterne til? I en ARIMA-modell er det 3 parametere som brukes for å modellere de viktigste aspektene ved en tidsserie: sesongvariasjon, trend og støy. Disse parameterne er: + +`p`: parameteren knyttet til den autoregressive delen av modellen, som inkorporerer *tidligere* verdier. +`d`: parameteren knyttet til den integrerte delen av modellen, som påvirker mengden *differensiering* (🎓 husk differensiering 👆?) som skal brukes på en tidsserie. +`q`: parameteren knyttet til den glidende gjennomsnittsdelen av modellen. + +> Merk: Hvis dataene dine har en sesongmessig komponent - som disse dataene har - bruker vi en sesongmessig ARIMA-modell (SARIMA). I så fall må du bruke et annet sett med parametere: `P`, `D` og `Q`, som beskriver de samme assosiasjonene som `p`, `d` og `q`, men tilsvarer de sesongmessige komponentene i modellen. + +1. Start med å sette din foretrukne horisontverdi. La oss prøve 3 timer: + + ```python + # Specify the number of steps to forecast ahead + HORIZON = 3 + print('Forecasting horizon:', HORIZON, 'hours') + ``` + + Å velge de beste verdiene for en ARIMA-modells parametere kan være utfordrende, da det er noe subjektivt og tidkrevende. Du kan vurdere å bruke en `auto_arima()`-funksjon fra [`pyramid`-biblioteket](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html). + +1. For nå, prøv noen manuelle valg for å finne en god modell. + + ```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()) + ``` + + En tabell med resultater blir skrevet ut. + +Du har bygget din første modell! Nå må vi finne en måte å evaluere den på. + +### Evaluer modellen din + +For å evaluere modellen din kan du utføre den såkalte `walk forward`-valideringen. I praksis blir tidsseriemodeller re-trent hver gang nye data blir tilgjengelige. Dette lar modellen lage den beste prognosen ved hvert tidssteg. + +Start ved begynnelsen av tidsserien med denne teknikken, tren modellen på treningsdatasettet. Deretter lager du en prognose for neste tidssteg. Prognosen evalueres mot den kjente verdien. Treningssettet utvides deretter til å inkludere den kjente verdien, og prosessen gjentas. + +> Merk: Du bør holde treningssettets vindu fast for mer effektiv trening, slik at hver gang du legger til en ny observasjon i treningssettet, fjerner du observasjonen fra begynnelsen av settet. + +Denne prosessen gir en mer robust estimering av hvordan modellen vil prestere i praksis. Imidlertid kommer det med beregningskostnaden ved å lage så mange modeller. Dette er akseptabelt hvis dataene er små eller hvis modellen er enkel, men kan være et problem i stor skala. + +Walk-forward validering er gullstandarden for evaluering av tidsseriemodeller og anbefales for dine egne prosjekter. + +1. Først, opprett et testdatapunkt for hvert HORIZON-steg. + + ```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 | + + Dataene forskyves horisontalt i henhold til horisontpunktet. + +1. Lag prognoser for testdataene dine ved hjelp av denne glidende vindustilnærmingen i en løkke på størrelse med testdatasettets lengde: + + ```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) + ``` + + Du kan se treningen foregå: + + ```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. Sammenlign prognosene med den faktiske belastningen: + + ```python + eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)]) + eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1] + eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h') + eval_df['actual'] = np.array(np.transpose(test_ts)).ravel() + eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']]) + eval_df.head() + ``` + + Output + | | | 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 | + + Observer prognosen for timebaserte data sammenlignet med den faktiske belastningen. Hvor nøyaktig er dette? + +### Sjekk modellens nøyaktighet + +Sjekk nøyaktigheten til modellen din ved å teste dens gjennomsnittlige absolutte prosentvise feil (MAPE) over alle prognosene. +> **🧮 Vis meg matematikken** +> +> ![MAPE](../../../../7-TimeSeries/2-ARIMA/images/mape.png) +> +> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) brukes for å vise prediksjonsnøyaktighet som et forhold definert av formelen ovenfor. Forskjellen mellom faktisk og forutsagt deles på det faktiske. +> +> "Den absolutte verdien i denne beregningen summeres for hvert prognosert tidspunkt og deles på antall tilpassede punkter n." [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error) +1. Uttrykk ligningen i kode: + + ```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. Beregn MAPE for ett steg: + + ```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 for ett steg: 0.5570581332313952 % + +1. Skriv ut MAPE for flertrinnsprognosen: + + ```python + print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%') + ``` + + ```output + Multi-step forecast MAPE: 1.1460048657704118 % + ``` + + Et lavt tall er best: husk at en prognose med en MAPE på 10 er feil med 10%. + +1. Men som alltid, det er enklere å se denne typen nøyaktighetsmåling visuelt, så la oss plotte det: + + ```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() + ``` + + ![en tidsseriemodell](../../../../7-TimeSeries/2-ARIMA/images/accuracy.png) + +🏆 Et veldig fint plot som viser en modell med god nøyaktighet. Bra jobbet! + +--- + +## 🚀Utfordring + +Utforsk måter å teste nøyaktigheten til en tidsseriemodell. Vi berører MAPE i denne leksjonen, men finnes det andre metoder du kan bruke? Undersøk dem og kommenter dem. Et nyttig dokument kan finnes [her](https://otexts.com/fpp2/accuracy.html) + +## [Quiz etter leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang & Selvstudium + +Denne leksjonen berører kun det grunnleggende innen tidsserieprognoser med ARIMA. Ta deg tid til å utdype kunnskapen din ved å utforske [dette repositoriet](https://microsoft.github.io/forecasting/) og dets ulike modelltyper for å lære andre måter å bygge tidsseriemodeller på. + +## Oppgave + +[En ny ARIMA-modell](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/7-TimeSeries/2-ARIMA/assignment.md b/translations/no/7-TimeSeries/2-ARIMA/assignment.md new file mode 100644 index 000000000..596fbd1a9 --- /dev/null +++ b/translations/no/7-TimeSeries/2-ARIMA/assignment.md @@ -0,0 +1,25 @@ + +# En ny ARIMA-modell + +## Instruksjoner + +Nå som du har bygget en ARIMA-modell, lag en ny med ferske data (prøv en av [disse datasettene fra Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html). Kommenter arbeidet ditt i en notebook, visualiser dataene og modellen din, og test nøyaktigheten ved hjelp av MAPE. + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------- | +| | En notebook presenteres med en ny ARIMA-modell bygget, testet og forklart med visualiseringer og angitt nøyaktighet. | Notebooken som presenteres er ikke kommentert eller inneholder feil | En ufullstendig notebook presenteres | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/7-TimeSeries/2-ARIMA/solution/Julia/README.md b/translations/no/7-TimeSeries/2-ARIMA/solution/Julia/README.md new file mode 100644 index 000000000..c9e9cafc5 --- /dev/null +++ b/translations/no/7-TimeSeries/2-ARIMA/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/7-TimeSeries/2-ARIMA/solution/R/README.md b/translations/no/7-TimeSeries/2-ARIMA/solution/R/README.md new file mode 100644 index 000000000..83cfabb17 --- /dev/null +++ b/translations/no/7-TimeSeries/2-ARIMA/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/7-TimeSeries/3-SVR/README.md b/translations/no/7-TimeSeries/3-SVR/README.md new file mode 100644 index 000000000..196310431 --- /dev/null +++ b/translations/no/7-TimeSeries/3-SVR/README.md @@ -0,0 +1,393 @@ + +# Tidsserieprognoser med Support Vector Regressor + +I forrige leksjon lærte du hvordan du bruker ARIMA-modellen til å lage tidsserieprediksjoner. Nå skal vi se på Support Vector Regressor-modellen, som er en regresjonsmodell brukt til å forutsi kontinuerlige data. + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Introduksjon + +I denne leksjonen vil du oppdage en spesifikk måte å bygge modeller med [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) for regresjon, eller **SVR: Support Vector Regressor**. + +### SVR i konteksten av tidsserier [^1] + +Før du forstår viktigheten av SVR i tidsserieprediksjon, er det noen viktige konsepter du bør kjenne til: + +- **Regresjon:** En overvåket læringsteknikk for å forutsi kontinuerlige verdier basert på et gitt sett med input. Ideen er å tilpasse en kurve (eller linje) i funksjonsrommet som har flest mulig datapunkter. [Klikk her](https://en.wikipedia.org/wiki/Regression_analysis) for mer informasjon. +- **Support Vector Machine (SVM):** En type overvåket maskinlæringsmodell brukt til klassifisering, regresjon og deteksjon av avvik. Modellen er et hyperplan i funksjonsrommet, som i tilfelle klassifisering fungerer som en grense, og i tilfelle regresjon fungerer som den beste tilpassede linjen. I SVM brukes vanligvis en Kernel-funksjon for å transformere datasettet til et rom med høyere dimensjoner, slik at de blir lettere separerbare. [Klikk her](https://en.wikipedia.org/wiki/Support-vector_machine) for mer informasjon om SVM. +- **Support Vector Regressor (SVR):** En type SVM som finner den beste tilpassede linjen (som i tilfelle SVM er et hyperplan) som har flest mulig datapunkter. + +### Hvorfor SVR? [^1] + +I forrige leksjon lærte du om ARIMA, som er en svært vellykket statistisk lineær metode for å forutsi tidsseriedata. Men i mange tilfeller har tidsseriedata *ikke-linearitet*, som ikke kan modelleres av lineære metoder. I slike tilfeller gjør SVMs evne til å ta hensyn til ikke-linearitet i dataene for regresjonsoppgaver SVR vellykket i tidsserieprognoser. + +## Øvelse - bygg en SVR-modell + +De første stegene for datapreparering er de samme som i forrige leksjon om [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA). + +Åpne [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working)-mappen i denne leksjonen og finn [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb)-filen.[^2] + +1. Kjør notebooken og importer de nødvendige bibliotekene: [^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. Last inn dataene fra `/data/energy.csv`-filen til en Pandas-datastruktur og se på dem: [^2] + + ```python + energy = load_data('../../data')[['load']] + ``` + +3. Plott alle tilgjengelige energidata fra januar 2012 til desember 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() + ``` + + ![full data](../../../../7-TimeSeries/3-SVR/images/full-data.png) + + Nå skal vi bygge vår SVR-modell. + +### Opprett trenings- og testdatasett + +Nå er dataene dine lastet inn, så du kan dele dem opp i trenings- og testsett. Deretter vil du omforme dataene for å lage et tidsstegbasert datasett som vil være nødvendig for SVR. Du vil trene modellen på treningssettet. Etter at modellen er ferdig trent, vil du evaluere dens nøyaktighet på treningssettet, testsettet og deretter hele datasettet for å se den generelle ytelsen. Du må sørge for at testsettet dekker en senere tidsperiode enn treningssettet for å sikre at modellen ikke får informasjon fra fremtidige tidsperioder [^2] (en situasjon kjent som *Overfitting*). + +1. Tildel en to-måneders periode fra 1. september til 31. oktober 2014 til treningssettet. Testsettet vil inkludere to-måneders perioden fra 1. november til 31. desember 2014: [^2] + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + +2. Visualiser forskjellene: [^2] + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![training and testing data](../../../../7-TimeSeries/3-SVR/images/train-test.png) + +### Forbered dataene for trening + +Nå må du forberede dataene for trening ved å filtrere og skalere dataene dine. Filtrer datasettet for kun å inkludere de tidsperiodene og kolonnene du trenger, og skaler for å sikre at dataene projiseres i intervallet 0,1. + +1. Filtrer det originale datasettet for kun å inkludere de nevnte tidsperiodene per sett og kun inkludere den nødvendige kolonnen 'load' pluss datoen: [^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. Skaler treningsdataene til å være i området (0, 1): [^2] + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + ``` + +4. Nå skalerer du testdataene: [^2] + + ```python + test['load'] = scaler.transform(test) + ``` + +### Opprett data med tidssteg [^1] + +For SVR transformerer du inputdataene til formen `[batch, timesteps]`. Så du omformer de eksisterende `train_data` og `test_data` slik at det er en ny dimensjon som refererer til tidsstegene. + +```python +# Converting to numpy arrays +train_data = train.values +test_data = test.values +``` + +For dette eksempelet tar vi `timesteps = 5`. Så input til modellen er dataene for de første 4 tidsstegene, og output vil være dataene for det 5. tidssteget. + +```python +timesteps=5 +``` + +Konverter treningsdata til 2D tensor ved hjelp av nested list comprehension: + +```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) +``` + +Konverter testdata til 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) +``` + +Velg input og output fra trenings- og testdata: + +```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) +``` + +### Implementer SVR [^1] + +Nå er det på tide å implementere SVR. For å lese mer om denne implementeringen, kan du referere til [denne dokumentasjonen](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html). For vår implementering følger vi disse stegene: + + 1. Definer modellen ved å kalle `SVR()` og sende inn modellens hyperparametere: kernel, gamma, c og epsilon + 2. Forbered modellen for treningsdataene ved å kalle funksjonen `fit()` + 3. Lag prediksjoner ved å kalle funksjonen `predict()` + +Nå oppretter vi en SVR-modell. Her bruker vi [RBF-kjernen](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel), og setter hyperparameterne gamma, C og epsilon til henholdsvis 0.5, 10 og 0.05. + +```python +model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05) +``` + +#### Tren modellen på treningsdata [^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) +``` + +#### Lag modellprediksjoner [^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) +``` + +Du har bygget din SVR! Nå må vi evaluere den. + +### Evaluer modellen din [^1] + +For evaluering skal vi først skalere dataene tilbake til vår originale skala. Deretter, for å sjekke ytelsen, skal vi plotte den originale og predikerte tidsserien, og også skrive ut MAPE-resultatet. + +Skaler den predikerte og originale outputen: + +```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)) +``` + +#### Sjekk modellens ytelse på trenings- og testdata [^1] + +Vi henter tidsstemplene fra datasettet for å vise på x-aksen i vårt plot. Merk at vi bruker de første ```timesteps-1``` verdiene som input for den første outputen, så tidsstemplene for outputen vil starte etter det. + +```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 +``` + +Plot prediksjonene for treningsdata: + +```python +plt.figure(figsize=(25,6)) +plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.title("Training data prediction") +plt.show() +``` + +![training data prediction](../../../../7-TimeSeries/3-SVR/images/train-data-predict.png) + +Skriv ut MAPE for treningsdata + +```python +print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%') +``` + +```output +MAPE for training data: 1.7195710200875551 % +``` + +Plot prediksjonene for testdata + +```python +plt.figure(figsize=(10,3)) +plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![testing data prediction](../../../../7-TimeSeries/3-SVR/images/test-data-predict.png) + +Skriv ut MAPE for testdata + +```python +print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%') +``` + +```output +MAPE for testing data: 1.2623790187854018 % +``` + +🏆 Du har et veldig godt resultat på testdatasettet! + +### Sjekk modellens ytelse på hele datasettet [^1] + +```python +# Extracting load values as numpy array +data = energy.copy().values + +# Scaling +data = scaler.transform(data) + +# Transforming to 2D tensor as per model input requirement +data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0] +print("Tensor shape: ", data_timesteps.shape) + +# Selecting inputs and outputs from data +X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]] +print("X shape: ", X.shape,"\nY shape: ", Y.shape) +``` + +```output +Tensor shape: (26300, 5) +X shape: (26300, 4) +Y shape: (26300, 1) +``` + +```python +# Make model predictions +Y_pred = model.predict(X).reshape(-1,1) + +# Inverse scale and reshape +Y_pred = scaler.inverse_transform(Y_pred) +Y = scaler.inverse_transform(Y) +``` + +```python +plt.figure(figsize=(30,8)) +plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(Y_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![full data prediction](../../../../7-TimeSeries/3-SVR/images/full-data-predict.png) + +```python +print('MAPE: ', mape(Y_pred, Y)*100, '%') +``` + +```output +MAPE: 2.0572089029888656 % +``` + +🏆 Veldig fine plott som viser en modell med god nøyaktighet. Bra jobbet! + +--- + +## 🚀Utfordring + +- Prøv å justere hyperparameterne (gamma, C, epsilon) mens du oppretter modellen og evaluer på dataene for å se hvilke sett med hyperparametere som gir de beste resultatene på testdataene. For å lære mer om disse hyperparameterne, kan du referere til dokumentet [her](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel). +- Prøv å bruke forskjellige kjernefunksjoner for modellen og analyser deres ytelse på datasettet. Et nyttig dokument kan finnes [her](https://scikit-learn.org/stable/modules/svm.html#kernel-functions). +- Prøv å bruke forskjellige verdier for `timesteps` for modellen for å se tilbake og lage prediksjoner. + +## [Quiz etter leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang & Selvstudie + +Denne leksjonen var en introduksjon til bruken av SVR for tidsserieprognoser. For å lese mer om SVR, kan du referere til [denne bloggen](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/). Denne [dokumentasjonen på scikit-learn](https://scikit-learn.org/stable/modules/svm.html) gir en mer omfattende forklaring om SVM generelt, [SVR](https://scikit-learn.org/stable/modules/svm.html#regression) og også andre implementeringsdetaljer som de forskjellige [kjernefunksjonene](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) som kan brukes, og deres parametere. + +## Oppgave + +[En ny SVR-modell](assignment.md) + +## Krediteringer + +[^1]: Teksten, koden og outputen i denne seksjonen ble bidratt av [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD) +[^2]: Teksten, koden og outputen i denne seksjonen ble hentet fra [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/7-TimeSeries/3-SVR/assignment.md b/translations/no/7-TimeSeries/3-SVR/assignment.md new file mode 100644 index 000000000..31a6f9902 --- /dev/null +++ b/translations/no/7-TimeSeries/3-SVR/assignment.md @@ -0,0 +1,27 @@ + +# En ny SVR-modell + +## Instruksjoner [^1] + +Nå som du har bygget en SVR-modell, bygg en ny med ferske data (prøv en av [disse datasettene fra Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Kommenter arbeidet ditt i en notebook, visualiser dataene og modellen din, og test nøyaktigheten ved hjelp av passende grafer og MAPE. Prøv også å justere de ulike hyperparameterne og bruke forskjellige verdier for tidsstegene. + +## Vurderingskriterier [^1] + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | ----------------------------------------------------------- | -------------------------------------------------------- | ---------------------------------- | +| | En notebook presenteres med en SVR-modell bygget, testet og forklart med visualiseringer og nøyaktighet angitt. | Notebooken som presenteres er ikke kommentert eller inneholder feil. | En ufullstendig notebook presenteres | + +[^1]:Teksten i denne seksjonen er basert på [oppgaven fra ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/7-TimeSeries/README.md b/translations/no/7-TimeSeries/README.md new file mode 100644 index 000000000..561496c7e --- /dev/null +++ b/translations/no/7-TimeSeries/README.md @@ -0,0 +1,37 @@ + +# Introduksjon til tidsserieprognoser + +Hva er tidsserieprognoser? Det handler om å forutsi fremtidige hendelser ved å analysere trender fra fortiden. + +## Regionalt tema: globalt strømforbruk ✨ + +I disse to leksjonene vil du bli introdusert til tidsserieprognoser, et noe mindre kjent område innen maskinlæring som likevel er svært verdifullt for industri- og forretningsapplikasjoner, blant andre felt. Selv om nevrale nettverk kan brukes for å forbedre nytten av disse modellene, vil vi studere dem i konteksten av klassisk maskinlæring, ettersom modellene hjelper med å forutsi fremtidig ytelse basert på fortiden. + +Vårt regionale fokus er elektrisk forbruk i verden, et interessant datasett for å lære om å forutsi fremtidig strømforbruk basert på mønstre fra tidligere belastning. Du kan se hvordan denne typen prognoser kan være svært nyttig i en forretningssammenheng. + +![elektrisk nett](../../../7-TimeSeries/images/electric-grid.jpg) + +Foto av [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) av elektriske tårn på en vei i Rajasthan på [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +## Leksjoner + +1. [Introduksjon til tidsserieprognoser](1-Introduction/README.md) +2. [Bygge ARIMA-modeller for tidsserier](2-ARIMA/README.md) +3. [Bygge Support Vector Regressor for tidsserieprognoser](3-SVR/README.md) + +## Krediteringer + +"Introduksjon til tidsserieprognoser" ble skrevet med ⚡️ av [Francesca Lazzeri](https://twitter.com/frlazzeri) og [Jen Looper](https://twitter.com/jenlooper). Notatbøkene dukket først opp online i [Azure "Deep Learning For Time Series"-repoet](https://github.com/Azure/DeepLearningForTimeSeriesForecasting) opprinnelig skrevet av Francesca Lazzeri. SVR-leksjonen ble skrevet av [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør betraktes som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/8-Reinforcement/1-QLearning/README.md b/translations/no/8-Reinforcement/1-QLearning/README.md new file mode 100644 index 000000000..5b05f4c37 --- /dev/null +++ b/translations/no/8-Reinforcement/1-QLearning/README.md @@ -0,0 +1,256 @@ + +# Introduksjon til forsterkende læring og Q-Læring + +![Oppsummering av forsterkning i maskinlæring i en sketchnote](../../../../sketchnotes/ml-reinforcement.png) +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +Forsterkende læring involverer tre viktige konsepter: agenten, noen tilstander, og et sett med handlinger per tilstand. Ved å utføre en handling i en spesifisert tilstand, får agenten en belønning. Tenk igjen på dataspillet Super Mario. Du er Mario, du er i et spillnivå, stående ved kanten av en klippe. Over deg er det en mynt. Du som Mario, i et spillnivå, på en spesifikk posisjon ... det er din tilstand. Å ta et steg til høyre (en handling) vil føre deg over kanten, og det vil gi deg en lav numerisk score. Men å trykke på hopp-knappen vil gi deg et poeng og holde deg i live. Det er et positivt utfall og bør gi deg en positiv numerisk score. + +Ved å bruke forsterkende læring og en simulator (spillet), kan du lære hvordan du spiller spillet for å maksimere belønningen, som er å holde seg i live og score så mange poeng som mulig. + +[![Intro til forsterkende læring](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) + +> 🎥 Klikk på bildet over for å høre Dmitry diskutere forsterkende læring + +## [Quiz før forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Forutsetninger og oppsett + +I denne leksjonen skal vi eksperimentere med litt kode i Python. Du bør kunne kjøre Jupyter Notebook-koden fra denne leksjonen, enten på din egen datamaskin eller i skyen. + +Du kan åpne [notatboken for leksjonen](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) og gå gjennom denne leksjonen for å bygge. + +> **Merk:** Hvis du åpner denne koden fra skyen, må du også hente filen [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), som brukes i notatbok-koden. Legg den i samme katalog som notatboken. + +## Introduksjon + +I denne leksjonen skal vi utforske verdenen til **[Peter og ulven](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, inspirert av et musikalsk eventyr av den russiske komponisten [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Vi skal bruke **forsterkende læring** for å la Peter utforske sitt miljø, samle smakfulle epler og unngå å møte ulven. + +**Forsterkende læring** (RL) er en læringsteknikk som lar oss lære optimal oppførsel for en **agent** i et **miljø** ved å kjøre mange eksperimenter. En agent i dette miljøet bør ha et **mål**, definert av en **belønningsfunksjon**. + +## Miljøet + +For enkelhets skyld, la oss anta at Peters verden er et kvadratisk brett med størrelse `bredde` x `høyde`, som dette: + +![Peters miljø](../../../../8-Reinforcement/1-QLearning/images/environment.png) + +Hver celle i dette brettet kan enten være: + +* **bakke**, som Peter og andre skapninger kan gå på. +* **vann**, som man åpenbart ikke kan gå på. +* et **tre** eller **gress**, et sted hvor man kan hvile. +* et **eple**, som representerer noe Peter vil være glad for å finne for å mate seg selv. +* en **ulv**, som er farlig og bør unngås. + +Det finnes et eget Python-modul, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), som inneholder koden for å arbeide med dette miljøet. Fordi denne koden ikke er viktig for å forstå konseptene våre, vil vi importere modulen og bruke den til å lage brettet (kodeblokk 1): + +```python +from rlboard import * + +width, height = 8,8 +m = Board(width,height) +m.randomize(seed=13) +m.plot() +``` + +Denne koden bør skrive ut et bilde av miljøet som ligner på det ovenfor. + +## Handlinger og strategi + +I vårt eksempel vil Peters mål være å finne et eple, mens han unngår ulven og andre hindringer. For å gjøre dette kan han i hovedsak gå rundt til han finner et eple. + +Derfor kan han på enhver posisjon velge mellom en av følgende handlinger: opp, ned, venstre og høyre. + +Vi vil definere disse handlingene som et ordbok, og knytte dem til par av tilsvarende koordinatendringer. For eksempel vil det å bevege seg til høyre (`R`) tilsvare paret `(1,0)`. (kodeblokk 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()) } +``` + +For å oppsummere, strategien og målet for dette scenariet er som følger: + +- **Strategien**, for vår agent (Peter) er definert av en såkalt **policy**. En policy er en funksjon som returnerer handlingen i en gitt tilstand. I vårt tilfelle er tilstanden til problemet representert av brettet, inkludert spillerens nåværende posisjon. + +- **Målet**, med forsterkende læring er å til slutt lære en god policy som lar oss løse problemet effektivt. Men som en baseline, la oss vurdere den enkleste policyen kalt **tilfeldig vandring**. + +## Tilfeldig vandring + +La oss først løse problemet vårt ved å implementere en strategi for tilfeldig vandring. Med tilfeldig vandring vil vi tilfeldig velge neste handling fra de tillatte handlingene, til vi når eplet (kodeblokk 3). + +1. Implementer den tilfeldige vandringen med koden nedenfor: + + ```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) + ``` + + Kallet til `walk` bør returnere lengden på den tilsvarende stien, som kan variere fra en kjøring til en annen. + +1. Kjør vandringseksperimentet et antall ganger (si, 100), og skriv ut de resulterende statistikkene (kodeblokk 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) + ``` + + Merk at gjennomsnittlig lengde på en sti er rundt 30-40 steg, noe som er ganske mye, gitt at gjennomsnittlig avstand til nærmeste eple er rundt 5-6 steg. + + Du kan også se hvordan Peters bevegelser ser ut under den tilfeldige vandringen: + + ![Peters tilfeldige vandring](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) + +## Belønningsfunksjon + +For å gjøre vår policy mer intelligent, må vi forstå hvilke bevegelser som er "bedre" enn andre. For å gjøre dette må vi definere målet vårt. + +Målet kan defineres i form av en **belønningsfunksjon**, som vil returnere en scoreverdi for hver tilstand. Jo høyere tallet er, jo bedre er belønningsfunksjonen. (kodeblokk 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 +``` + +En interessant ting med belønningsfunksjoner er at i de fleste tilfeller *får vi bare en betydelig belønning på slutten av spillet*. Dette betyr at algoritmen vår på en eller annen måte må huske "gode" steg som fører til en positiv belønning til slutt, og øke deres betydning. På samme måte bør alle bevegelser som fører til dårlige resultater avskrekkes. + +## Q-Læring + +En algoritme som vi skal diskutere her kalles **Q-Læring**. I denne algoritmen er policyen definert av en funksjon (eller en datastruktur) kalt en **Q-Tabell**. Den registrerer "godheten" til hver av handlingene i en gitt tilstand. + +Den kalles en Q-Tabell fordi det ofte er praktisk å representere den som en tabell, eller en flerdimensjonal matrise. Siden brettet vårt har dimensjonene `bredde` x `høyde`, kan vi representere Q-Tabellen ved hjelp av en numpy-matrise med formen `bredde` x `høyde` x `len(actions)`: (kodeblokk 6) + +```python +Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) +``` + +Legg merke til at vi initialiserer alle verdiene i Q-Tabellen med en lik verdi, i vårt tilfelle - 0.25. Dette tilsvarer policyen "tilfeldig vandring", fordi alle bevegelser i hver tilstand er like gode. Vi kan sende Q-Tabellen til `plot`-funksjonen for å visualisere tabellen på brettet: `m.plot(Q)`. + +![Peters miljø](../../../../8-Reinforcement/1-QLearning/images/env_init.png) + +I midten av hver celle er det en "pil" som indikerer den foretrukne retningen for bevegelse. Siden alle retninger er like, vises en prikk. + +Nå må vi kjøre simuleringen, utforske miljøet vårt, og lære en bedre fordeling av Q-Tabell-verdier, som vil tillate oss å finne veien til eplet mye raskere. + +## Essensen av Q-Læring: Bellman-likningen + +Når vi begynner å bevege oss, vil hver handling ha en tilsvarende belønning, dvs. vi kan teoretisk velge neste handling basert på den høyeste umiddelbare belønningen. Men i de fleste tilstander vil ikke bevegelsen oppnå målet vårt om å nå eplet, og dermed kan vi ikke umiddelbart avgjøre hvilken retning som er bedre. + +> Husk at det ikke er det umiddelbare resultatet som betyr noe, men heller det endelige resultatet, som vi vil oppnå på slutten av simuleringen. + +For å ta hensyn til denne forsinkede belønningen, må vi bruke prinsippene for **[dynamisk programmering](https://en.wikipedia.org/wiki/Dynamic_programming)**, som lar oss tenke på problemet vårt rekursivt. + +Anta at vi nå er i tilstanden *s*, og vi ønsker å bevege oss til neste tilstand *s'*. Ved å gjøre det vil vi motta den umiddelbare belønningen *r(s,a)*, definert av belønningsfunksjonen, pluss en fremtidig belønning. Hvis vi antar at Q-Tabellen vår korrekt reflekterer "attraktiviteten" til hver handling, vil vi i tilstanden *s'* velge en handling *a* som tilsvarer maksimal verdi av *Q(s',a')*. Dermed vil den beste mulige fremtidige belønningen vi kunne få i tilstanden *s* bli definert som `max` + +## Sjekke policyen + +Siden Q-Tabellen viser "attraktiviteten" til hver handling i hver tilstand, er det ganske enkelt å bruke den til å definere effektiv navigering i vår verden. I det enkleste tilfellet kan vi velge handlingen som tilsvarer den høyeste verdien i Q-Tabellen: (kodeblokk 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) +``` + +> Hvis du prøver koden ovenfor flere ganger, kan du legge merke til at den noen ganger "henger", og du må trykke på STOP-knappen i notatboken for å avbryte den. Dette skjer fordi det kan oppstå situasjoner der to tilstander "peker" på hverandre når det gjelder optimal Q-verdi, i så fall ender agenten opp med å bevege seg mellom disse tilstandene uendelig. + +## 🚀Utfordring + +> **Oppgave 1:** Endre `walk`-funksjonen slik at den begrenser maksimal lengde på stien til et visst antall steg (for eksempel 100), og se koden ovenfor returnere denne verdien fra tid til annen. + +> **Oppgave 2:** Endre `walk`-funksjonen slik at den ikke går tilbake til steder den allerede har vært tidligere. Dette vil forhindre at `walk` går i loop, men agenten kan fortsatt ende opp med å bli "fanget" på et sted den ikke kan unnslippe fra. + +## Navigering + +En bedre navigeringspolicy ville være den vi brukte under trening, som kombinerer utnyttelse og utforskning. I denne policyen vil vi velge hver handling med en viss sannsynlighet, proporsjonal med verdiene i Q-Tabellen. Denne strategien kan fortsatt føre til at agenten returnerer til en posisjon den allerede har utforsket, men som du kan se fra koden nedenfor, resulterer den i en veldig kort gjennomsnittlig sti til ønsket lokasjon (husk at `print_statistics` kjører simuleringen 100 ganger): (kodeblokk 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) +``` + +Etter å ha kjørt denne koden, bør du få en mye kortere gjennomsnittlig stilengde enn før, i området 3-6. + +## Undersøke læringsprosessen + +Som vi har nevnt, er læringsprosessen en balanse mellom utforskning og utnyttelse av opparbeidet kunnskap om problemrommets struktur. Vi har sett at resultatene av læringen (evnen til å hjelpe en agent med å finne en kort sti til målet) har forbedret seg, men det er også interessant å observere hvordan gjennomsnittlig stilengde oppfører seg under læringsprosessen: + +## Oppsummering av læringen: + +- **Gjennomsnittlig stilengde øker**. Det vi ser her er at i starten øker gjennomsnittlig stilengde. Dette skyldes sannsynligvis at når vi ikke vet noe om miljøet, er vi mer sannsynlig å bli fanget i dårlige tilstander, som vann eller ulv. Etter hvert som vi lærer mer og begynner å bruke denne kunnskapen, kan vi utforske miljøet lenger, men vi vet fortsatt ikke veldig godt hvor eplene er. + +- **Stilengden avtar etter hvert som vi lærer mer**. Når vi har lært nok, blir det lettere for agenten å nå målet, og stilengden begynner å avta. Vi er imidlertid fortsatt åpne for utforskning, så vi avviker ofte fra den beste stien og utforsker nye alternativer, noe som gjør stien lengre enn optimal. + +- **Lengden øker brått**. Det vi også observerer på denne grafen er at på et tidspunkt økte lengden brått. Dette indikerer den stokastiske naturen til prosessen, og at vi på et tidspunkt kan "ødelegge" Q-Tabell-koeffisientene ved å overskrive dem med nye verdier. Dette bør ideelt sett minimeres ved å redusere læringsraten (for eksempel mot slutten av treningen justerer vi Q-Tabell-verdiene med en liten verdi). + +Alt i alt er det viktig å huske at suksessen og kvaliteten på læringsprosessen avhenger betydelig av parametere, som læringsrate, læringsrate-avtakelse og diskonteringsfaktor. Disse kalles ofte **hyperparametere**, for å skille dem fra **parametere**, som vi optimaliserer under trening (for eksempel Q-Tabell-koeffisienter). Prosessen med å finne de beste verdiene for hyperparametere kalles **hyperparameteroptimalisering**, og det fortjener et eget tema. + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Oppgave +[En mer realistisk verden](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/8-Reinforcement/1-QLearning/assignment.md b/translations/no/8-Reinforcement/1-QLearning/assignment.md new file mode 100644 index 000000000..4829c2457 --- /dev/null +++ b/translations/no/8-Reinforcement/1-QLearning/assignment.md @@ -0,0 +1,41 @@ + +# En Mer Realistisk Verden + +I vår situasjon kunne Peter bevege seg rundt nesten uten å bli sliten eller sulten. I en mer realistisk verden må han sette seg ned og hvile fra tid til annen, og også spise for å holde seg i live. La oss gjøre vår verden mer realistisk ved å implementere følgende regler: + +1. Ved å bevege seg fra ett sted til et annet, mister Peter **energi** og får noe **utmattelse**. +2. Peter kan få mer energi ved å spise epler. +3. Peter kan kvitte seg med utmattelse ved å hvile under et tre eller på gresset (dvs. gå til en plass på brettet med et tre eller gress - grønt felt). +4. Peter må finne og drepe ulven. +5. For å drepe ulven må Peter ha visse nivåer av energi og utmattelse, ellers taper han kampen. + +## Instruksjoner + +Bruk den originale [notebook.ipynb](../../../../8-Reinforcement/1-QLearning/notebook.ipynb)-notatboken som utgangspunkt for løsningen din. + +Modifiser belønningsfunksjonen ovenfor i henhold til spillreglene, kjør forsterkningslæringsalgoritmen for å lære den beste strategien for å vinne spillet, og sammenlign resultatene av tilfeldig vandring med algoritmen din når det gjelder antall spill vunnet og tapt. + +> **Note**: I din nye verden er tilstanden mer kompleks, og inkluderer i tillegg til menneskets posisjon også nivåer av utmattelse og energi. Du kan velge å representere tilstanden som en tuple (Brett, energi, utmattelse), eller definere en klasse for tilstanden (du kan også velge å avlede den fra `Board`), eller til og med modifisere den originale `Board`-klassen i [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py). + +I løsningen din, vennligst behold koden som er ansvarlig for strategien med tilfeldig vandring, og sammenlign resultatene av algoritmen din med tilfeldig vandring til slutt. + +> **Note**: Du kan trenge å justere hyperparametere for å få det til å fungere, spesielt antall epoker. Fordi suksessen i spillet (å bekjempe ulven) er en sjelden hendelse, kan du forvente mye lengre treningstid. + +## Vurderingskriterier + +| Kriterier | Fremragende | Tilfredsstillende | Trenger Forbedring | +| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| | En notatbok presenteres med definisjonen av nye verdensregler, Q-Learning-algoritme og noen tekstlige forklaringer. Q-Learning er i stand til å forbedre resultatene betydelig sammenlignet med tilfeldig vandring. | Notatbok presenteres, Q-Learning er implementert og forbedrer resultatene sammenlignet med tilfeldig vandring, men ikke betydelig; eller notatboken er dårlig dokumentert og koden er ikke godt strukturert | Noen forsøk på å redefinere verdensreglene er gjort, men Q-Learning-algoritmen fungerer ikke, eller belønningsfunksjonen er ikke fullt definert | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/8-Reinforcement/1-QLearning/solution/Julia/README.md b/translations/no/8-Reinforcement/1-QLearning/solution/Julia/README.md new file mode 100644 index 000000000..817378398 --- /dev/null +++ b/translations/no/8-Reinforcement/1-QLearning/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/8-Reinforcement/1-QLearning/solution/R/README.md b/translations/no/8-Reinforcement/1-QLearning/solution/R/README.md new file mode 100644 index 000000000..9bc837dbc --- /dev/null +++ b/translations/no/8-Reinforcement/1-QLearning/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/8-Reinforcement/2-Gym/README.md b/translations/no/8-Reinforcement/2-Gym/README.md new file mode 100644 index 000000000..9e6c661bb --- /dev/null +++ b/translations/no/8-Reinforcement/2-Gym/README.md @@ -0,0 +1,333 @@ + +## Forutsetninger + +I denne leksjonen skal vi bruke et bibliotek kalt **OpenAI Gym** for å simulere ulike **miljøer**. Du kan kjøre koden fra denne leksjonen lokalt (f.eks. fra Visual Studio Code), i så fall vil simuleringen åpne seg i et nytt vindu. Når du kjører koden online, kan det være nødvendig å gjøre noen justeringer i koden, som beskrevet [her](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7). + +## OpenAI Gym + +I den forrige leksjonen ble reglene for spillet og tilstanden definert av klassen `Board`, som vi laget selv. Her skal vi bruke et spesielt **simuleringsmiljø** som simulerer fysikken bak den balanserende stangen. Et av de mest populære simuleringsmiljøene for trening av forsterkningslæringsalgoritmer kalles [Gym](https://gym.openai.com/), som vedlikeholdes av [OpenAI](https://openai.com/). Ved å bruke dette gymmet kan vi lage ulike **miljøer**, fra en CartPole-simulering til Atari-spill. + +> **Merk**: Du kan se andre tilgjengelige miljøer fra OpenAI Gym [her](https://gym.openai.com/envs/#classic_control). + +Først, la oss installere gym og importere nødvendige biblioteker (kodeblokk 1): + +```python +import sys +!{sys.executable} -m pip install gym + +import gym +import matplotlib.pyplot as plt +import numpy as np +import random +``` + +## Oppgave - initialiser et CartPole-miljø + +For å jobbe med et CartPole-balanseringsproblem må vi initialisere det tilsvarende miljøet. Hvert miljø er knyttet til: + +- **Observasjonsrom** som definerer strukturen til informasjonen vi mottar fra miljøet. For CartPole-problemet mottar vi posisjonen til stangen, hastighet og noen andre verdier. + +- **Handlingsrom** som definerer mulige handlinger. I vårt tilfelle er handlingsrommet diskret og består av to handlinger - **venstre** og **høyre**. (kodeblokk 2) + +1. For å initialisere, skriv følgende kode: + + ```python + env = gym.make("CartPole-v1") + print(env.action_space) + print(env.observation_space) + print(env.action_space.sample()) + ``` + +For å se hvordan miljøet fungerer, la oss kjøre en kort simulering i 100 steg. Ved hvert steg gir vi en av handlingene som skal utføres - i denne simuleringen velger vi bare tilfeldig en handling fra `action_space`. + +1. Kjør koden nedenfor og se hva det fører til. + + ✅ Husk at det er foretrukket å kjøre denne koden på en lokal Python-installasjon! (kodeblokk 3) + + ```python + env.reset() + + for i in range(100): + env.render() + env.step(env.action_space.sample()) + env.close() + ``` + + Du bør se noe som ligner på dette bildet: + + ![ikke-balanserende CartPole](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) + +1. Under simuleringen må vi få observasjoner for å avgjøre hvordan vi skal handle. Faktisk returnerer step-funksjonen nåværende observasjoner, en belønningsfunksjon og en flagg som indikerer om det gir mening å fortsette simuleringen eller ikke: (kodeblokk 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() + ``` + + Du vil ende opp med å se noe som dette i notebook-utgangen: + + ```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 + ``` + + Observasjonsvektoren som returneres ved hvert steg av simuleringen inneholder følgende verdier: + - Posisjon til vognen + - Hastighet til vognen + - Vinkel til stangen + - Rotasjonshastighet til stangen + +1. Finn minimums- og maksimumsverdien av disse tallene: (kodeblokk 5) + + ```python + print(env.observation_space.low) + print(env.observation_space.high) + ``` + + Du vil også legge merke til at belønningsverdien ved hvert simuleringssteg alltid er 1. Dette er fordi målet vårt er å overleve så lenge som mulig, dvs. holde stangen i en rimelig vertikal posisjon i lengst mulig tid. + + ✅ Faktisk anses CartPole-simuleringen som løst hvis vi klarer å oppnå en gjennomsnittlig belønning på 195 over 100 påfølgende forsøk. + +## Diskretisering av tilstand + +I Q-Læring må vi bygge en Q-Tabell som definerer hva vi skal gjøre i hver tilstand. For å kunne gjøre dette må tilstanden være **diskret**, mer presist, den bør inneholde et begrenset antall diskrete verdier. Dermed må vi på en eller annen måte **diskretisere** observasjonene våre, og kartlegge dem til et begrenset sett med tilstander. + +Det finnes noen måter vi kan gjøre dette på: + +- **Del inn i intervaller**. Hvis vi kjenner intervallet til en viss verdi, kan vi dele dette intervallet inn i et antall **intervaller**, og deretter erstatte verdien med nummeret på intervallet den tilhører. Dette kan gjøres ved hjelp av numpy-metoden [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html). I dette tilfellet vil vi nøyaktig vite størrelsen på tilstanden, fordi den vil avhenge av antall intervaller vi velger for digitalisering. + +✅ Vi kan bruke lineær interpolasjon for å bringe verdier til et begrenset intervall (for eksempel fra -20 til 20), og deretter konvertere tallene til heltall ved å runde dem av. Dette gir oss litt mindre kontroll over størrelsen på tilstanden, spesielt hvis vi ikke kjenner de nøyaktige grensene for inngangsverdiene. For eksempel, i vårt tilfelle har 2 av 4 verdier ikke øvre/nedre grenser for verdiene sine, noe som kan resultere i et uendelig antall tilstander. + +I vårt eksempel vil vi gå for den andre tilnærmingen. Som du kanskje legger merke til senere, til tross for udefinerte øvre/nedre grenser, tar disse verdiene sjelden verdier utenfor visse begrensede intervaller, og dermed vil tilstander med ekstreme verdier være svært sjeldne. + +1. Her er funksjonen som vil ta observasjonen fra modellen vår og produsere en tuple med 4 heltallsverdier: (kodeblokk 6) + + ```python + def discretize(x): + return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int)) + ``` + +1. La oss også utforske en annen diskretiseringsmetode ved bruk av intervaller: (kodeblokk 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. La oss nå kjøre en kort simulering og observere disse diskrete miljøverdiene. Prøv gjerne både `discretize` og `discretize_bins` og se om det er noen forskjell. + + ✅ `discretize_bins` returnerer nummeret på intervallet, som er 0-basert. Dermed returnerer den for verdier av inngangsvariabelen rundt 0 nummeret fra midten av intervallet (10). I `discretize` brydde vi oss ikke om området for utgangsverdiene, og tillot dem å være negative, slik at tilstandsverdiene ikke er forskjøvet, og 0 tilsvarer 0. (kodeblokk 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() + ``` + + ✅ Fjern kommentaren på linjen som starter med `env.render` hvis du vil se hvordan miljøet utføres. Ellers kan du utføre det i bakgrunnen, som er raskere. Vi vil bruke denne "usynlige" utførelsen under vår Q-Læringsprosess. + +## Strukturen til Q-Tabellen + +I vår forrige leksjon var tilstanden et enkelt par med tall fra 0 til 8, og dermed var det praktisk å representere Q-Tabellen med en numpy-tensor med formen 8x8x2. Hvis vi bruker intervall-diskretisering, er størrelsen på tilstandsvektoren vår også kjent, så vi kan bruke samme tilnærming og representere tilstanden med en array med formen 20x20x10x10x2 (her er 2 dimensjonen til handlingsrommet, og de første dimensjonene tilsvarer antall intervaller vi har valgt å bruke for hver av parameterne i observasjonsrommet). + +Imidlertid er det noen ganger ikke kjent de nøyaktige dimensjonene til observasjonsrommet. I tilfelle av funksjonen `discretize`, kan vi aldri være sikre på at tilstanden vår holder seg innenfor visse grenser, fordi noen av de opprinnelige verdiene ikke er begrenset. Dermed vil vi bruke en litt annen tilnærming og representere Q-Tabellen med en ordbok. + +1. Bruk paret *(state,action)* som nøkkelen i ordboken, og verdien vil tilsvare verdien i Q-Tabellen. (kodeblokk 9) + + ```python + Q = {} + actions = (0,1) + + def qvalues(state): + return [Q.get((state,a),0) for a in actions] + ``` + + Her definerer vi også en funksjon `qvalues()`, som returnerer en liste med verdier fra Q-Tabellen for en gitt tilstand som tilsvarer alle mulige handlinger. Hvis oppføringen ikke er til stede i Q-Tabellen, vil vi returnere 0 som standard. + +## La oss starte Q-Læring + +Nå er vi klare til å lære Peter å balansere! + +1. Først, la oss sette noen hyperparametere: (kodeblokk 10) + + ```python + # hyperparameters + alpha = 0.3 + gamma = 0.9 + epsilon = 0.90 + ``` + + Her er `alpha` **læringsraten** som definerer i hvilken grad vi skal justere de nåværende verdiene i Q-Tabellen ved hvert steg. I den forrige leksjonen startet vi med 1, og deretter reduserte vi `alpha` til lavere verdier under treningen. I dette eksemplet vil vi holde den konstant bare for enkelhets skyld, og du kan eksperimentere med å justere `alpha`-verdiene senere. + + `gamma` er **diskonteringsfaktoren** som viser i hvilken grad vi skal prioritere fremtidig belønning over nåværende belønning. + + `epsilon` er **utforsknings-/utnyttelsesfaktoren** som avgjør om vi skal foretrekke utforskning fremfor utnyttelse eller omvendt. I algoritmen vår vil vi i `epsilon` prosent av tilfellene velge neste handling i henhold til verdiene i Q-Tabellen, og i de resterende tilfellene vil vi utføre en tilfeldig handling. Dette vil tillate oss å utforske områder av søkeområdet som vi aldri har sett før. + + ✅ Når det gjelder balansering - å velge en tilfeldig handling (utforskning) vil fungere som et tilfeldig dytt i feil retning, og stangen må lære seg å gjenopprette balansen fra disse "feilene". + +### Forbedre algoritmen + +Vi kan også gjøre to forbedringer i algoritmen vår fra forrige leksjon: + +- **Beregn gjennomsnittlig kumulativ belønning** over et antall simuleringer. Vi vil skrive ut fremgangen hver 5000 iterasjoner, og vi vil beregne gjennomsnittet av vår kumulative belønning over den perioden. Det betyr at hvis vi får mer enn 195 poeng - kan vi anse problemet som løst, med enda høyere kvalitet enn nødvendig. + +- **Beregn maksimal gjennomsnittlig kumulativ belønning**, `Qmax`, og vi vil lagre Q-Tabellen som tilsvarer det resultatet. Når du kjører treningen, vil du legge merke til at noen ganger begynner den gjennomsnittlige kumulative belønningen å synke, og vi ønsker å beholde verdiene i Q-Tabellen som tilsvarer den beste modellen observert under treningen. + +1. Samle alle kumulative belønninger ved hver simulering i `rewards`-vektoren for videre plotting. (kodeblokk 11) + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + + Qmax = 0 + cum_rewards = [] + rewards = [] + for epoch in range(100000): + obs = env.reset() + done = False + cum_reward=0 + # == do the simulation == + while not done: + s = discretize(obs) + if random.random() Qmax: + Qmax = np.average(cum_rewards) + Qbest = Q + cum_rewards=[] + ``` + +Hva du kan legge merke til fra disse resultatene: + +- **Nær målet vårt**. Vi er veldig nær å oppnå målet om å få 195 kumulative belønninger over 100+ påfølgende simuleringer, eller vi kan faktisk ha oppnådd det! Selv om vi får mindre tall, vet vi fortsatt ikke, fordi vi beregner gjennomsnittet over 5000 kjøringer, og bare 100 kjøringer er nødvendig i de formelle kriteriene. + +- **Belønningen begynner å synke**. Noen ganger begynner belønningen å synke, noe som betyr at vi kan "ødelegge" allerede lærte verdier i Q-Tabellen med de som gjør situasjonen verre. + +Denne observasjonen er mer tydelig synlig hvis vi plotter treningsfremgangen. + +## Plotting av treningsfremgang + +Under treningen har vi samlet den kumulative belønningsverdien ved hver iterasjon i `rewards`-vektoren. Slik ser det ut når vi plotter det mot iterasjonsnummeret: + +```python +plt.plot(rewards) +``` + +![rå fremgang](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png) + +Fra denne grafen er det ikke mulig å si noe, fordi på grunn av den stokastiske treningsprosessen varierer lengden på treningsøktene sterkt. For å gi mer mening til denne grafen kan vi beregne **glidende gjennomsnitt** over en serie eksperimenter, la oss si 100. Dette kan gjøres praktisk ved hjelp av `np.convolve`: (kodeblokk 12) + +```python +def running_average(x,window): + return np.convolve(x,np.ones(window)/window,mode='valid') + +plt.plot(running_average(rewards,100)) +``` + +![treningsfremgang](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png) + +## Variasjon av hyperparametere + +For å gjøre læringen mer stabil gir det mening å justere noen av hyperparameterne våre under treningen. Spesielt: + +- **For læringsraten**, `alpha`, kan vi starte med verdier nær 1, og deretter fortsette å redusere parameteren. Med tiden vil vi få gode sannsynlighetsverdier i Q-Tabellen, og dermed bør vi justere dem litt, og ikke overskrive dem helt med nye verdier. + +- **Øk epsilon**. Vi kan ønske å øke `epsilon` sakte, for å utforske mindre og utnytte mer. Det gir sannsynligvis mening å starte med en lav verdi av `epsilon`, og bevege seg opp mot nesten 1. +> **Oppgave 1**: Prøv deg frem med verdier for hyperparametere og se om du kan oppnå høyere kumulativ belønning. Får du over 195? +> **Oppgave 2**: For å løse problemet formelt, må du oppnå en gjennomsnittlig belønning på 195 over 100 sammenhengende kjøringer. Mål dette under treningen og sørg for at du har løst problemet formelt! + +## Se resultatet i praksis + +Det kan være interessant å faktisk se hvordan den trente modellen oppfører seg. La oss kjøre simuleringen og følge samme strategi for valg av handlinger som under treningen, ved å prøve ut fra sannsynlighetsfordelingen i Q-Tabellen: (kodeblokk 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() +``` + +Du bør se noe som dette: + +![en balanserende cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) + +--- + +## 🚀Utfordring + +> **Oppgave 3**: Her brukte vi den endelige kopien av Q-Tabellen, som kanskje ikke er den beste. Husk at vi har lagret den best-presterende Q-Tabellen i variabelen `Qbest`! Prøv det samme eksempelet med den best-presterende Q-Tabellen ved å kopiere `Qbest` over til `Q` og se om du merker noen forskjell. + +> **Oppgave 4**: Her valgte vi ikke den beste handlingen på hvert steg, men prøvde heller ut fra den tilsvarende sannsynlighetsfordelingen. Ville det gi mer mening å alltid velge den beste handlingen, med den høyeste verdien i Q-Tabellen? Dette kan gjøres ved å bruke funksjonen `np.argmax` for å finne handlingsnummeret som tilsvarer den høyeste verdien i Q-Tabellen. Implementer denne strategien og se om det forbedrer balansen. + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Oppgave +[Tren en Mountain Car](assignment.md) + +## Konklusjon + +Vi har nå lært hvordan vi kan trene agenter til å oppnå gode resultater bare ved å gi dem en belønningsfunksjon som definerer ønsket tilstand i spillet, og ved å gi dem muligheten til å utforske søkeområdet intelligent. Vi har med suksess anvendt Q-Learning-algoritmen i tilfeller med diskrete og kontinuerlige miljøer, men med diskrete handlinger. + +Det er også viktig å studere situasjoner der handlingsrommet også er kontinuerlig, og når observasjonsrommet er mye mer komplekst, som bildet fra skjermen i et Atari-spill. I slike problemer trenger vi ofte å bruke mer kraftige maskinlæringsteknikker, som nevrale nettverk, for å oppnå gode resultater. Disse mer avanserte temaene er emnet for vårt kommende mer avanserte AI-kurs. + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/8-Reinforcement/2-Gym/assignment.md b/translations/no/8-Reinforcement/2-Gym/assignment.md new file mode 100644 index 000000000..7e77426d1 --- /dev/null +++ b/translations/no/8-Reinforcement/2-Gym/assignment.md @@ -0,0 +1,55 @@ + +# Tren Mountain Car + +[OpenAI Gym](http://gym.openai.com) er designet slik at alle miljøer tilbyr samme API - altså de samme metodene `reset`, `step` og `render`, og de samme abstraksjonene for **handlingsrom** og **observasjonsrom**. Derfor bør det være mulig å tilpasse de samme forsterkningslæringsalgoritmene til forskjellige miljøer med minimale kodeendringer. + +## Et Mountain Car-miljø + +[Mountain Car-miljøet](https://gym.openai.com/envs/MountainCar-v0/) inneholder en bil som sitter fast i en dal: + +Målet er å komme seg ut av dalen og fange flagget, ved å utføre en av følgende handlinger på hvert steg: + +| Verdi | Betydning | +|---|---| +| 0 | Akselerer til venstre | +| 1 | Ikke akselerer | +| 2 | Akselerer til høyre | + +Hovedutfordringen i dette problemet er imidlertid at bilens motor ikke er sterk nok til å klatre opp fjellet i én enkelt passering. Derfor er den eneste måten å lykkes på å kjøre frem og tilbake for å bygge opp nok moment. + +Observasjonsrommet består kun av to verdier: + +| Nr | Observasjon | Min | Maks | +|-----|--------------|-----|-----| +| 0 | Bilens posisjon | -1.2| 0.6 | +| 1 | Bilens hastighet | -0.07 | 0.07 | + +Belønningssystemet for Mountain Car er ganske utfordrende: + + * En belønning på 0 gis hvis agenten når flagget (posisjon = 0.5) på toppen av fjellet. + * En belønning på -1 gis hvis agentens posisjon er mindre enn 0.5. + +Episoden avsluttes hvis bilens posisjon er mer enn 0.5, eller hvis episodens lengde overstiger 200. +## Instruksjoner + +Tilpass vår forsterkningslæringsalgoritme for å løse Mountain Car-problemet. Start med eksisterende [notebook.ipynb](../../../../8-Reinforcement/2-Gym/notebook.ipynb)-kode, bytt ut miljøet, endre funksjonene for diskretisering av tilstander, og prøv å få den eksisterende algoritmen til å trene med minimale kodeendringer. Optimaliser resultatet ved å justere hyperparametere. + +> **Merk**: Justering av hyperparametere vil sannsynligvis være nødvendig for at algoritmen skal konvergere. +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| -------- | --------- | -------- | ----------------- | +| | Q-Learning-algoritmen er vellykket tilpasset fra CartPole-eksempelet, med minimale kodeendringer, og er i stand til å løse problemet med å fange flagget på under 200 steg. | En ny Q-Learning-algoritme er hentet fra Internett, men er godt dokumentert; eller eksisterende algoritme er tilpasset, men oppnår ikke ønskede resultater | Studenten klarte ikke å tilpasse noen algoritme vellykket, men har gjort betydelige fremskritt mot løsningen (implementert tilstands-diskretisering, Q-Tabell datastruktur, osv.) | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/8-Reinforcement/2-Gym/solution/Julia/README.md b/translations/no/8-Reinforcement/2-Gym/solution/Julia/README.md new file mode 100644 index 000000000..b122e3ea1 --- /dev/null +++ b/translations/no/8-Reinforcement/2-Gym/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/8-Reinforcement/2-Gym/solution/R/README.md b/translations/no/8-Reinforcement/2-Gym/solution/R/README.md new file mode 100644 index 000000000..c0a46e9ca --- /dev/null +++ b/translations/no/8-Reinforcement/2-Gym/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/8-Reinforcement/README.md b/translations/no/8-Reinforcement/README.md new file mode 100644 index 000000000..cbc8660e7 --- /dev/null +++ b/translations/no/8-Reinforcement/README.md @@ -0,0 +1,67 @@ + +# Introduksjon til forsterkende læring + +Forsterkende læring, RL, regnes som en av de grunnleggende paradigmer innen maskinlæring, ved siden av veiledet læring og uveiledet læring. RL handler om beslutninger: å ta riktige beslutninger eller i det minste lære av dem. + +Tenk deg at du har et simulert miljø, som aksjemarkedet. Hva skjer hvis du innfører en gitt regulering? Har det en positiv eller negativ effekt? Hvis noe negativt skjer, må du ta denne _negative forsterkningen_, lære av den og endre kurs. Hvis det er et positivt utfall, må du bygge videre på den _positive forsterkningen_. + +![Peter og ulven](../../../8-Reinforcement/images/peter.png) + +> Peter og vennene hans må unnslippe den sultne ulven! Bilde av [Jen Looper](https://twitter.com/jenlooper) + +## Regionalt tema: Peter og ulven (Russland) + +[Peter og ulven](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) er et musikalsk eventyr skrevet av den russiske komponisten [Sergej Prokofjev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Det er en historie om den unge pioneren Peter, som modig går ut av huset sitt til skogkanten for å jage ulven. I denne delen skal vi trene maskinlæringsalgoritmer som vil hjelpe Peter: + +- **Utforske** området rundt og bygge et optimalt navigasjonskart. +- **Lære** å bruke et skateboard og balansere på det, for å bevege seg raskere rundt. + +[![Peter og ulven](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM) + +> 🎥 Klikk på bildet over for å høre Peter og ulven av Prokofjev + +## Forsterkende læring + +I tidligere deler har du sett to eksempler på maskinlæringsproblemer: + +- **Veiledet**, der vi har datasett som foreslår eksempler på løsninger til problemet vi ønsker å løse. [Klassifisering](../4-Classification/README.md) og [regresjon](../2-Regression/README.md) er oppgaver innen veiledet læring. +- **Uveiledet**, der vi ikke har merkede treningsdata. Hovedeksempelet på uveiledet læring er [Clustering](../5-Clustering/README.md). + +I denne delen vil vi introdusere deg for en ny type læringsproblem som ikke krever merkede treningsdata. Det finnes flere typer slike problemer: + +- **[Semi-veiledet læring](https://wikipedia.org/wiki/Semi-supervised_learning)**, der vi har mye umerkede data som kan brukes til å forhåndstrene modellen. +- **[Forsterkende læring](https://wikipedia.org/wiki/Reinforcement_learning)**, der en agent lærer hvordan den skal oppføre seg ved å utføre eksperimenter i et simulert miljø. + +### Eksempel - dataspill + +Anta at du vil lære en datamaskin å spille et spill, som sjakk eller [Super Mario](https://wikipedia.org/wiki/Super_Mario). For at datamaskinen skal spille et spill, må den forutsi hvilken handling den skal ta i hver spilltilstand. Selv om dette kan virke som et klassifiseringsproblem, er det ikke det - fordi vi ikke har et datasett med tilstander og tilsvarende handlinger. Selv om vi kanskje har noen data, som eksisterende sjakkpartier eller opptak av spillere som spiller Super Mario, er det sannsynlig at disse dataene ikke dekker et stort nok antall mulige tilstander. + +I stedet for å lete etter eksisterende spilldata, er **Forsterkende læring** (RL) basert på ideen om *å få datamaskinen til å spille* mange ganger og observere resultatet. For å bruke forsterkende læring trenger vi to ting: + +- **Et miljø** og **en simulator** som lar oss spille et spill mange ganger. Denne simulatoren vil definere alle spillregler samt mulige tilstander og handlinger. + +- **En belønningsfunksjon**, som forteller oss hvor godt vi gjorde det under hver handling eller spill. + +Den største forskjellen mellom andre typer maskinlæring og RL er at i RL vet vi vanligvis ikke om vi vinner eller taper før vi er ferdige med spillet. Dermed kan vi ikke si om en bestemt handling alene er god eller ikke - vi mottar bare en belønning ved slutten av spillet. Målet vårt er å designe algoritmer som lar oss trene en modell under usikre forhold. Vi skal lære om en RL-algoritme kalt **Q-læring**. + +## Leksjoner + +1. [Introduksjon til forsterkende læring og Q-læring](1-QLearning/README.md) +2. [Bruke et gymsimuleringsmiljø](2-Gym/README.md) + +## Kreditering + +"Introduksjon til forsterkende læring" ble skrevet med ♥️ av [Dmitry Soshnikov](http://soshnikov.com) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/9-Real-World/1-Applications/README.md b/translations/no/9-Real-World/1-Applications/README.md new file mode 100644 index 000000000..2a4fa00c4 --- /dev/null +++ b/translations/no/9-Real-World/1-Applications/README.md @@ -0,0 +1,159 @@ + +# Postscript: Maskinlæring i den virkelige verden + +![Oppsummering av maskinlæring i den virkelige verden i en sketchnote](../../../../sketchnotes/ml-realworld.png) +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +I dette kurset har du lært mange måter å forberede data for trening og lage maskinlæringsmodeller. Du har bygget en rekke klassiske regresjons-, klyngings-, klassifiserings-, naturlig språkbehandlings- og tidsseriemodeller. Gratulerer! Nå lurer du kanskje på hva alt dette skal brukes til... hva er de virkelige anvendelsene for disse modellene? + +Selv om AI, som ofte bruker dyp læring, har fått mye oppmerksomhet i industrien, finnes det fortsatt verdifulle bruksområder for klassiske maskinlæringsmodeller. Du bruker kanskje noen av disse anvendelsene allerede i dag! I denne leksjonen skal du utforske hvordan åtte ulike industrier og fagområder bruker disse typene modeller for å gjøre sine applikasjoner mer effektive, pålitelige, intelligente og verdifulle for brukerne. + +## [Quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +## 💰 Finans + +Finanssektoren tilbyr mange muligheter for maskinlæring. Mange problemer i dette området egner seg godt til å bli modellert og løst ved hjelp av ML. + +### Kredittkortsvindel + +Vi lærte om [k-means klynging](../../5-Clustering/2-K-Means/README.md) tidligere i kurset, men hvordan kan det brukes til å løse problemer relatert til kredittkortsvindel? + +K-means klynging er nyttig i en teknikk for kredittkortsvindel kalt **uteliggermåling**. Uteliggere, eller avvik i observasjoner om et datasett, kan fortelle oss om et kredittkort brukes på en normal måte eller om noe uvanlig skjer. Som vist i artikkelen nedenfor, kan du sortere kredittkortdata ved hjelp av en k-means klyngingsalgoritme og tilordne hver transaksjon til en klynge basert på hvor mye den skiller seg ut. Deretter kan du evaluere de mest risikable klyngene for å avgjøre om transaksjonene er svindel eller legitime. +[Referanse](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf) + +### Formuesforvaltning + +I formuesforvaltning håndterer en person eller firma investeringer på vegne av sine klienter. Jobben deres er å opprettholde og øke formuen på lang sikt, så det er viktig å velge investeringer som gir god avkastning. + +En måte å evaluere hvordan en investering presterer på er gjennom statistisk regresjon. [Lineær regresjon](../../2-Regression/1-Tools/README.md) er et verdifullt verktøy for å forstå hvordan et fond presterer i forhold til en referanseindeks. Vi kan også finne ut om resultatene av regresjonen er statistisk signifikante, eller hvor mye de vil påvirke en klients investeringer. Du kan til og med utvide analysen ved hjelp av multippel regresjon, hvor flere risikofaktorer tas med i betraktning. For et eksempel på hvordan dette fungerer for et spesifikt fond, se artikkelen nedenfor om evaluering av fondsprestasjoner ved hjelp av regresjon. +[Referanse](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/) + +## 🎓 Utdanning + +Utdanningssektoren er også et veldig interessant område hvor ML kan brukes. Det finnes spennende problemer å løse, som å oppdage juks på prøver eller essays, eller håndtere skjevheter, enten de er utilsiktede eller ikke, i vurderingsprosessen. + +### Forutsi studentatferd + +[Coursera](https://coursera.com), en leverandør av åpne nettkurs, har en flott teknologiblogg hvor de diskuterer mange ingeniørbeslutninger. I denne casestudien plottet de en regresjonslinje for å utforske en mulig korrelasjon mellom en lav NPS (Net Promoter Score)-vurdering og kursretensjon eller frafall. +[Referanse](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a) + +### Redusere skjevheter + +[Grammarly](https://grammarly.com), en skriveassistent som sjekker for stave- og grammatikkfeil, bruker sofistikerte [naturlig språkbehandlingssystemer](../../6-NLP/README.md) i sine produkter. De publiserte en interessant casestudie i sin teknologiblogg om hvordan de håndterte kjønnsbias i maskinlæring, som du lærte om i vår [introduksjonsleksjon om rettferdighet](../../1-Introduction/3-fairness/README.md). +[Referanse](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/) + +## 👜 Detaljhandel + +Detaljhandelssektoren kan definitivt dra nytte av bruk av ML, med alt fra å skape en bedre kundereise til å optimalisere lagerbeholdning. + +### Personalisere kundereisen + +Hos Wayfair, et selskap som selger hjemmevarer som møbler, er det avgjørende å hjelpe kundene med å finne de riktige produktene for deres smak og behov. I denne artikkelen beskriver ingeniører fra selskapet hvordan de bruker ML og NLP for å "vise de riktige resultatene for kundene". Spesielt har deres Query Intent Engine blitt bygget for å bruke enhetsuttrekking, klassifiseringstrening, uttrekking av eiendeler og meninger, og sentimentmerking på kundeanmeldelser. Dette er et klassisk eksempel på hvordan NLP fungerer i netthandel. +[Referanse](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search) + +### Lagerstyring + +Innovative, smidige selskaper som [StitchFix](https://stitchfix.com), en abonnementstjeneste som sender klær til forbrukere, er sterkt avhengige av ML for anbefalinger og lagerstyring. Deres stylingteam samarbeider med deres innkjøpsteam, faktisk: "en av våre dataforskere eksperimenterte med en genetisk algoritme og brukte den på klær for å forutsi hva som ville være et vellykket klesplagg som ikke eksisterer i dag. Vi presenterte dette for innkjøpsteamet, og nå kan de bruke det som et verktøy." +[Referanse](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/) + +## 🏥 Helsevesen + +Helsevesenet kan bruke ML til å optimalisere forskningsoppgaver og logistiske problemer som å forhindre gjeninnleggelser eller stoppe sykdomsspredning. + +### Administrere kliniske studier + +Toksisitet i kliniske studier er en stor bekymring for legemiddelprodusenter. Hvor mye toksisitet er akseptabelt? I denne studien førte analyser av ulike metoder for kliniske studier til utviklingen av en ny tilnærming for å forutsi sannsynligheten for utfall i kliniske studier. Spesielt var de i stand til å bruke random forest for å lage en [klassifiserer](../../4-Classification/README.md) som kan skille mellom grupper av legemidler. +[Referanse](https://www.sciencedirect.com/science/article/pii/S2451945616302914) + +### Administrere sykehusgjeninnleggelser + +Sykehusbehandling er kostbart, spesielt når pasienter må gjeninnlegges. Denne artikkelen diskuterer et selskap som bruker ML for å forutsi potensialet for gjeninnleggelser ved hjelp av [klynging](../../5-Clustering/README.md)-algoritmer. Disse klyngene hjelper analytikere med å "oppdage grupper av gjeninnleggelser som kan ha en felles årsak". +[Referanse](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning) + +### Sykdomshåndtering + +Den nylige pandemien har kastet lys over hvordan maskinlæring kan bidra til å stoppe spredningen av sykdommer. I denne artikkelen vil du kjenne igjen bruken av ARIMA, logistiske kurver, lineær regresjon og SARIMA. "Dette arbeidet er et forsøk på å beregne spredningshastigheten for dette viruset og dermed forutsi dødsfall, tilfriskninger og bekreftede tilfeller, slik at det kan hjelpe oss med å forberede oss bedre og overleve." +[Referanse](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/) + +## 🌲 Økologi og grønn teknologi + +Natur og økologi består av mange sensitive systemer hvor samspillet mellom dyr og natur kommer i fokus. Det er viktig å kunne måle disse systemene nøyaktig og handle riktig hvis noe skjer, som en skogbrann eller en nedgang i dyrepopulasjonen. + +### Skogforvaltning + +Du lærte om [forsterkende læring](../../8-Reinforcement/README.md) i tidligere leksjoner. Det kan være veldig nyttig når man prøver å forutsi mønstre i naturen. Spesielt kan det brukes til å spore økologiske problemer som skogbranner og spredning av invasive arter. I Canada brukte en gruppe forskere forsterkende læring for å bygge modeller for skogbrannens dynamikk basert på satellittbilder. Ved å bruke en innovativ "spatially spreading process (SSP)" forestilte de seg en skogbrann som "agenten ved enhver celle i landskapet." "Sett med handlinger brannen kan ta fra et sted på et gitt tidspunkt inkluderer å spre seg nord, sør, øst eller vest, eller ikke spre seg." + +Denne tilnærmingen snur den vanlige RL-oppsettet siden dynamikken i den tilsvarende Markov Decision Process (MDP) er en kjent funksjon for umiddelbar spredning av skogbrann." Les mer om de klassiske algoritmene brukt av denne gruppen på lenken nedenfor. +[Referanse](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full) + +### Bevegelsessporing av dyr + +Mens dyp læring har skapt en revolusjon i visuell sporing av dyrebevegelser (du kan bygge din egen [isbjørnsporer](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) her), har klassisk ML fortsatt en plass i denne oppgaven. + +Sensorer for å spore bevegelser hos husdyr og IoT bruker denne typen visuell prosessering, men mer grunnleggende ML-teknikker er nyttige for å forhåndsbehandle data. For eksempel, i denne artikkelen ble sauers kroppsholdninger overvåket og analysert ved hjelp av ulike klassifiseringsalgoritmer. Du vil kanskje kjenne igjen ROC-kurven på side 335. +[Referanse](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf) + +### ⚡️ Energistyring + +I våre leksjoner om [tidsserieprognoser](../../7-TimeSeries/README.md) introduserte vi konseptet med smarte parkeringsmålere for å generere inntekter for en by basert på forståelse av tilbud og etterspørsel. Denne artikkelen diskuterer i detalj hvordan klynging, regresjon og tidsserieprognoser kombineres for å hjelpe med å forutsi fremtidig energibruk i Irland, basert på smarte målere. +[Referanse](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf) + +## 💼 Forsikring + +Forsikringssektoren er en annen sektor som bruker ML for å konstruere og optimalisere levedyktige finansielle og aktuarielle modeller. + +### Volatilitetsstyring + +MetLife, en leverandør av livsforsikring, er åpen om hvordan de analyserer og reduserer volatilitet i sine finansielle modeller. I denne artikkelen vil du legge merke til visualiseringer av binær og ordinal klassifisering. Du vil også oppdage visualiseringer av prognoser. +[Referanse](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf) + +## 🎨 Kunst, kultur og litteratur + +Innen kunst, for eksempel journalistikk, finnes det mange interessante problemer. Å oppdage falske nyheter er et stort problem, da det har vist seg å påvirke folks meninger og til og med undergrave demokratier. Museer kan også dra nytte av bruk av ML i alt fra å finne koblinger mellom artefakter til ressursplanlegging. + +### Oppdage falske nyheter + +Å oppdage falske nyheter har blitt et katt-og-mus-spill i dagens medier. I denne artikkelen foreslår forskere at et system som kombinerer flere av ML-teknikkene vi har studert kan testes, og den beste modellen kan implementeres: "Dette systemet er basert på naturlig språkbehandling for å trekke ut funksjoner fra dataene, og deretter brukes disse funksjonene til opplæring av maskinlæringsklassifiserere som Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD) og Logistic Regression (LR)." +[Referanse](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf) + +Denne artikkelen viser hvordan kombinasjonen av ulike ML-domener kan gi interessante resultater som kan bidra til å stoppe spredningen av falske nyheter og forhindre reell skade; i dette tilfellet var motivasjonen spredningen av rykter om COVID-behandlinger som utløste voldelige opptøyer. + +### Museum ML + +Museer er på terskelen til en AI-revolusjon hvor katalogisering og digitalisering av samlinger og finne koblinger mellom artefakter blir enklere etter hvert som teknologien utvikler seg. Prosjekter som [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) hjelper med å låse opp mysteriene i utilgjengelige samlinger som Vatikanets arkiver. Men, den forretningsmessige siden av museer drar også nytte av ML-modeller. + +For eksempel bygde Art Institute of Chicago modeller for å forutsi hva publikum er interessert i og når de vil besøke utstillinger. Målet er å skape individualiserte og optimaliserte besøksopplevelser hver gang brukeren besøker museet. "I regnskapsåret 2017 forutså modellen besøkstall og inntekter med en nøyaktighet på 1 prosent, sier Andrew Simnick, senior visepresident ved Art Institute." +[Referanse](https://www.chicagobusiness.com/article/20180518/ISSUE01/180519840/art-institute-of-chicago-uses-data-to-make-exhibit-choices) + +## 🏷 Markedsføring + +### Kundesegmentering + +De mest effektive markedsføringsstrategiene retter seg mot kunder på ulike måter basert på forskjellige grupperinger. I denne artikkelen diskuteres bruken av klyngingsalgoritmer for å støtte differensiert markedsføring. Differensiert markedsføring hjelper selskaper med å forbedre merkevaregjenkjenning, nå flere kunder og tjene mer penger. +[Referanse](https://ai.inqline.com/machine-learning-for-marketing-customer-segmentation/) + +## 🚀 Utfordring + +Identifiser en annen sektor som drar nytte av noen av teknikkene du har lært i dette kurset, og oppdag hvordan den bruker ML. +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) + +## Gjennomgang og selvstudium + +Wayfair sitt data science-team har flere interessante videoer om hvordan de bruker ML i selskapet sitt. Det er verdt [å ta en titt](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)! + +## Oppgave + +[En ML skattejakt](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/9-Real-World/1-Applications/assignment.md b/translations/no/9-Real-World/1-Applications/assignment.md new file mode 100644 index 000000000..dae422da1 --- /dev/null +++ b/translations/no/9-Real-World/1-Applications/assignment.md @@ -0,0 +1,27 @@ + +# En ML Skattejakt + +## Instruksjoner + +I denne leksjonen lærte du om mange virkelige brukstilfeller som ble løst ved hjelp av klassisk ML. Selv om bruken av dyp læring, nye teknikker og verktøy innen AI, og utnyttelse av nevrale nettverk har bidratt til å akselerere utviklingen av verktøy for å hjelpe i disse sektorene, har klassisk ML ved bruk av teknikkene i dette pensumet fortsatt stor verdi. + +I denne oppgaven skal du forestille deg at du deltar i en hackathon. Bruk det du har lært i pensumet til å foreslå en løsning ved hjelp av klassisk ML for å løse et problem i en av sektorene som ble diskutert i denne leksjonen. Lag en presentasjon der du diskuterer hvordan du vil implementere ideen din. Ekstrapoeng hvis du kan samle inn eksempeldata og bygge en ML-modell for å støtte konseptet ditt! + +## Vurderingskriterier + +| Kriterier | Eksemplarisk | Tilfredsstillende | Trenger forbedring | +| --------- | ------------------------------------------------------------------- | ------------------------------------------------ | ---------------------- | +| | En PowerPoint-presentasjon blir presentert - bonus for å bygge en modell | En ikke-innovativ, grunnleggende presentasjon blir presentert | Arbeidet er ufullstendig | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/9-Real-World/2-Debugging-ML-Models/README.md b/translations/no/9-Real-World/2-Debugging-ML-Models/README.md new file mode 100644 index 000000000..543d920dd --- /dev/null +++ b/translations/no/9-Real-World/2-Debugging-ML-Models/README.md @@ -0,0 +1,183 @@ + +# Postscript: Modellfeilsøking i maskinlæring ved bruk av komponenter fra Responsible AI-dashboardet + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Introduksjon + +Maskinlæring påvirker våre daglige liv. AI finner veien inn i noen av de viktigste systemene som berører oss som individer og samfunnet vårt, fra helsevesen, finans, utdanning og arbeidsliv. For eksempel er systemer og modeller involvert i daglige beslutningsoppgaver, som helsediagnoser eller deteksjon av svindel. Som en konsekvens blir fremskrittene innen AI og den akselererte adopsjonen møtt med stadig utviklende samfunnsforventninger og økende regulering. Vi ser stadig områder der AI-systemer ikke lever opp til forventningene; de avdekker nye utfordringer; og myndigheter begynner å regulere AI-løsninger. Derfor er det viktig at disse modellene analyseres for å sikre rettferdige, pålitelige, inkluderende, transparente og ansvarlige resultater for alle. + +I dette kurset skal vi se på praktiske verktøy som kan brukes til å vurdere om en modell har problemer knyttet til ansvarlig AI. Tradisjonelle feilsøkingsmetoder for maskinlæring er ofte basert på kvantitative beregninger som aggregert nøyaktighet eller gjennomsnittlig feilrate. Tenk deg hva som kan skje når dataene du bruker til å bygge disse modellene mangler visse demografiske grupper, som rase, kjønn, politisk syn, religion, eller er uforholdsmessig representert. Hva med når modellens output tolkes til å favorisere en demografisk gruppe? Dette kan føre til over- eller underrepresentasjon av sensitive egenskaper, noe som resulterer i rettferdighets-, inkluderings- eller pålitelighetsproblemer fra modellen. En annen faktor er at maskinlæringsmodeller ofte anses som "black boxes", noe som gjør det vanskelig å forstå og forklare hva som driver modellens prediksjoner. Alle disse er utfordringer dataforskere og AI-utviklere står overfor når de ikke har tilstrekkelige verktøy for å feilsøke og vurdere rettferdigheten eller påliteligheten til en modell. + +I denne leksjonen vil du lære om feilsøking av modeller ved bruk av: + +- **Feilanalyse**: Identifisere hvor i datadistribusjonen modellen har høye feilrater. +- **Modelloversikt**: Utføre sammenlignende analyser på tvers av ulike datakohorter for å avdekke forskjeller i modellens ytelsesmetrikker. +- **Dataanalyse**: Undersøke hvor det kan være over- eller underrepresentasjon i dataene som kan skjevfordele modellen til å favorisere én demografisk gruppe fremfor en annen. +- **Funksjonsviktighet**: Forstå hvilke funksjoner som driver modellens prediksjoner på globalt eller lokalt nivå. + +## Forutsetninger + +Som en forutsetning, vennligst gjennomgå [Responsible AI tools for developers](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) + +> ![Gif om Responsible AI Tools](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) + +## Feilanalyse + +Tradisjonelle ytelsesmetrikker for modeller som brukes til å måle nøyaktighet, er ofte beregninger basert på korrekte vs feilaktige prediksjoner. For eksempel kan det å fastslå at en modell er nøyaktig 89 % av tiden med en feilrate på 0,001 anses som god ytelse. Feilene er imidlertid ofte ikke jevnt fordelt i det underliggende datasettet. Du kan få en modellnøyaktighet på 89 %, men oppdage at det er ulike områder i dataene der modellen feiler 42 % av tiden. Konsekvensen av disse feilene i visse datagrupper kan føre til rettferdighets- eller pålitelighetsproblemer. Det er avgjørende å forstå områdene der modellen presterer godt eller ikke. Dataområdene med høy feilrate kan vise seg å være viktige demografiske grupper. + +![Analyser og feilsøk modellfeil](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-distribution.png) + +Feilanalysemodulen på RAI-dashboardet illustrerer hvordan modellfeil er fordelt på ulike kohorter med en trevisualisering. Dette er nyttig for å identifisere funksjoner eller områder der det er høy feilrate i datasettet ditt. Ved å se hvor de fleste av modellens feil oppstår, kan du begynne å undersøke årsaken. Du kan også opprette datakohorter for å utføre analyser. Disse datakohortene hjelper i feilsøkingsprosessen med å avgjøre hvorfor modellens ytelse er god i én kohort, men feilaktig i en annen. + +![Feilanalyse](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png) + +De visuelle indikatorene på trevisualiseringen hjelper deg med å lokalisere problemområdene raskere. For eksempel, jo mørkere rødfargen på en tre-node, desto høyere er feilraten. + +Varmekart er en annen visualiseringsfunksjonalitet som brukere kan bruke til å undersøke feilraten ved hjelp av én eller to funksjoner for å finne bidragsytere til modellfeil på tvers av hele datasettet eller kohorter. + +![Feilanalyse Varmekart](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png) + +Bruk feilanalyse når du trenger å: + +* Få en dyp forståelse av hvordan modellfeil er fordelt på et datasett og på flere input- og funksjonsdimensjoner. +* Bryte ned de samlede ytelsesmetrikker for automatisk å oppdage feilaktige kohorter og informere om målrettede tiltak for å redusere feil. + +## Modelloversikt + +Evaluering av ytelsen til en maskinlæringsmodell krever en helhetlig forståelse av dens oppførsel. Dette kan oppnås ved å gjennomgå mer enn én metrikk, som feilrate, nøyaktighet, tilbakekalling, presisjon eller MAE (Mean Absolute Error), for å finne forskjeller blant ytelsesmetrikker. Én ytelsesmetrikk kan se bra ut, men unøyaktigheter kan avdekkes i en annen metrikk. I tillegg hjelper sammenligning av metrikker for forskjeller på tvers av hele datasettet eller kohorter med å belyse hvor modellen presterer godt eller ikke. Dette er spesielt viktig for å se modellens ytelse blant sensitive vs insensitive funksjoner (f.eks. pasientens rase, kjønn eller alder) for å avdekke potensiell urettferdighet modellen kan ha. For eksempel kan det å oppdage at modellen er mer feilaktig i en kohort med sensitive funksjoner avsløre potensiell urettferdighet. + +Modelloversiktsmodulen på RAI-dashboardet hjelper ikke bare med å analysere ytelsesmetrikker for datarepresentasjon i en kohort, men gir brukere muligheten til å sammenligne modellens oppførsel på tvers av ulike kohorter. + +![Datasettkohorter - modelloversikt i RAI-dashboardet](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png) + +Modulens funksjonsbaserte analysefunksjonalitet lar brukere snevre inn datasubgrupper innenfor en bestemt funksjon for å identifisere avvik på et detaljert nivå. For eksempel har dashboardet innebygd intelligens for automatisk å generere kohorter for en bruker-valgt funksjon (f.eks. *"time_in_hospital < 3"* eller *"time_in_hospital >= 7"*). Dette gjør det mulig for en bruker å isolere en bestemt funksjon fra en større datagruppe for å se om den er en nøkkelpåvirker for modellens feilaktige resultater. + +![Funksjonskohorter - modelloversikt i RAI-dashboardet](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png) + +Modelloversiktsmodulen støtter to klasser av forskjellsmetrikker: + +**Forskjeller i modellens ytelse**: Disse metrikker beregner forskjellen i verdiene til den valgte ytelsesmetrikk på tvers av undergrupper av data. Her er noen eksempler: + +* Forskjell i nøyaktighetsrate +* Forskjell i feilrate +* Forskjell i presisjon +* Forskjell i tilbakekalling +* Forskjell i gjennomsnittlig absolutt feil (MAE) + +**Forskjeller i utvalgsrate**: Denne metrikk inneholder forskjellen i utvalgsrate (gunstig prediksjon) blant undergrupper. Et eksempel på dette er forskjellen i lånegodkjenningsrater. Utvalgsrate betyr andelen datapunkter i hver klasse klassifisert som 1 (i binær klassifisering) eller distribusjonen av prediksjonsverdier (i regresjon). + +## Dataanalyse + +> "Hvis du torturerer dataene lenge nok, vil de tilstå hva som helst" - Ronald Coase + +Denne uttalelsen høres ekstrem ut, men det er sant at data kan manipuleres for å støtte enhver konklusjon. Slik manipulasjon kan noen ganger skje utilsiktet. Som mennesker har vi alle bias, og det er ofte vanskelig å bevisst vite når vi introduserer bias i dataene. Å garantere rettferdighet i AI og maskinlæring forblir en kompleks utfordring. + +Data er et stort blindpunkt for tradisjonelle modellytelsesmetrikker. Du kan ha høye nøyaktighetsscorer, men dette reflekterer ikke alltid den underliggende databiasen som kan være i datasettet ditt. For eksempel, hvis et datasett med ansatte har 27 % kvinner i lederstillinger i et selskap og 73 % menn på samme nivå, kan en AI-modell for jobbannonsering som er trent på disse dataene, målrette seg mot en overvekt av mannlige kandidater for seniorstillinger. Denne ubalansen i dataene skjevfordelte modellens prediksjon til å favorisere ett kjønn. Dette avslører et rettferdighetsproblem der det er kjønnsbias i AI-modellen. + +Dataanalysemodulen på RAI-dashboardet hjelper med å identifisere områder der det er over- og underrepresentasjon i datasettet. Den hjelper brukere med å diagnostisere årsaken til feil og rettferdighetsproblemer som introduseres fra dataubalanser eller mangel på representasjon av en bestemt datagruppe. Dette gir brukere muligheten til å visualisere datasett basert på predikerte og faktiske resultater, feilgrupper og spesifikke funksjoner. Noen ganger kan det å oppdage en underrepresentert datagruppe også avdekke at modellen ikke lærer godt, og dermed har høye unøyaktigheter. En modell med databias er ikke bare et rettferdighetsproblem, men viser også at modellen ikke er inkluderende eller pålitelig. + +![Dataanalysemodulen på RAI-dashboardet](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png) + +Bruk dataanalyse når du trenger å: + +* Utforske statistikken i datasettet ditt ved å velge ulike filtre for å dele opp dataene i ulike dimensjoner (også kjent som kohorter). +* Forstå distribusjonen av datasettet ditt på tvers av ulike kohorter og funksjonsgrupper. +* Bestemme om funnene dine relatert til rettferdighet, feilanalyse og årsakssammenhenger (avledet fra andre dashboardmoduler) er et resultat av distribusjonen i datasettet ditt. +* Avgjøre hvilke områder du bør samle inn mer data for å redusere feil som kommer fra representasjonsproblemer, støy i etiketter, støy i funksjoner, etikettbias og lignende faktorer. + +## Modellfortolkning + +Maskinlæringsmodeller har en tendens til å være "black boxes". Å forstå hvilke nøkkelfunksjoner i dataene som driver en modells prediksjon kan være utfordrende. Det er viktig å gi transparens om hvorfor en modell gjør en bestemt prediksjon. For eksempel, hvis et AI-system forutsier at en diabetiker er i fare for å bli innlagt på sykehus igjen innen 30 dager, bør det kunne gi støttende data som ledet til denne prediksjonen. Å ha støttende dataindikatorer gir transparens som hjelper klinikere eller sykehus med å ta velinformerte beslutninger. I tillegg gjør det å kunne forklare hvorfor en modell gjorde en prediksjon for en individuell pasient det mulig å oppfylle ansvarlighet med helsereguleringer. Når du bruker maskinlæringsmodeller på måter som påvirker menneskers liv, er det avgjørende å forstå og forklare hva som påvirker modellens oppførsel. Modellforklarbarhet og fortolkning hjelper med å svare på spørsmål i scenarier som: + +* Modellfeilsøking: Hvorfor gjorde modellen min denne feilen? Hvordan kan jeg forbedre modellen min? +* Menneske-AI-samarbeid: Hvordan kan jeg forstå og stole på modellens beslutninger? +* Regulatorisk samsvar: Oppfyller modellen min juridiske krav? + +Funksjonsviktighetsmodulen på RAI-dashboardet hjelper deg med å feilsøke og få en omfattende forståelse av hvordan en modell gjør prediksjoner. Det er også et nyttig verktøy for maskinlæringsprofesjonelle og beslutningstakere for å forklare og vise bevis på funksjoner som påvirker modellens oppførsel for regulatorisk samsvar. Videre kan brukere utforske både globale og lokale forklaringer for å validere hvilke funksjoner som driver modellens prediksjon. Globale forklaringer viser de viktigste funksjonene som påvirket modellens samlede prediksjon. Lokale forklaringer viser hvilke funksjoner som ledet til modellens prediksjon for en individuell sak. Muligheten til å evaluere lokale forklaringer er også nyttig i feilsøking eller revisjon av en spesifikk sak for bedre å forstå og tolke hvorfor en modell gjorde en korrekt eller feilaktig prediksjon. + +![Funksjonsviktighetsmodulen på RAI-dashboardet](../../../../9-Real-World/2-Debugging-ML-Models/images/9-feature-importance.png) + +* Globale forklaringer: For eksempel, hvilke funksjoner påvirker den generelle oppførselen til en diabetesmodell for sykehusinnleggelse? +* Lokale forklaringer: For eksempel, hvorfor ble en diabetiker over 60 år med tidligere sykehusinnleggelser forutsagt å bli innlagt eller ikke innlagt igjen innen 30 dager? + +I feilsøkingsprosessen med å undersøke modellens ytelse på tvers av ulike kohorter, viser Funksjonsviktighet hvilken grad av påvirkning en funksjon har på tvers av kohorter. Det hjelper med å avdekke avvik når man sammenligner nivået av innflytelse funksjonen har på å drive modellens feilaktige prediksjoner. Funksjonsviktighetsmodulen kan vise hvilke verdier i en funksjon som positivt eller negativt påvirket modellens resultat. For eksempel, hvis en modell gjorde en feilaktig prediksjon, gir modulen deg muligheten til å bore ned og identifisere hvilke funksjoner eller funksjonsverdier som drev prediksjonen. Dette detaljnivået hjelper ikke bare med feilsøking, men gir transparens og ansvarlighet i revisjonssituasjoner. Til slutt kan modulen hjelpe deg med å identifisere rettferdighetsproblemer. For å illustrere, hvis en sensitiv funksjon som etnisitet eller kjønn har stor innflytelse på modellens prediksjon, kan dette være et tegn på rase- eller kjønnsbias i modellen. + +![Funksjonsviktighet](../../../../9-Real-World/2-Debugging-ML-Models/images/9-features-influence.png) + +Bruk fortolkning når du trenger å: + +* Bestemme hvor pålitelige prediksjonene til AI-systemet ditt er ved å forstå hvilke funksjoner som er viktigst for prediksjonene. +* Tilnærme deg feilsøkingen av modellen din ved først å forstå den og identifisere om modellen bruker sunne funksjoner eller bare falske korrelasjoner. +* Avdekke potensielle kilder til urettferdighet ved å forstå om modellen baserer prediksjoner på sensitive funksjoner eller på funksjoner som er sterkt korrelert med dem. +* Bygge brukertillit til modellens beslutninger ved å generere lokale forklaringer for å illustrere resultatene. +* Fullføre en regulatorisk revisjon av et AI-system for å validere modeller og overvåke effekten av modellens beslutninger på mennesker. + +## Konklusjon + +Alle komponentene i RAI-dashboardet er praktiske verktøy som hjelper deg med å bygge maskinlæringsmodeller som er mindre skadelige og mer pålitelige for samfunnet. Det forbedrer forebyggingen av trusler mot menneskerettigheter; diskriminering eller ekskludering av visse grupper fra livsmuligheter; og risikoen for fysisk eller psykisk skade. Det hjelper også med å bygge tillit til modellens beslutninger ved å generere lokale forklaringer for å illustrere resultatene. Noen av de potensielle skadene kan klassifiseres som: + +- **Allokering**, hvis for eksempel ett kjønn eller en etnisitet favoriseres over en annen. +- **Tjenestekvalitet**. Hvis du trener dataene for ett spesifikt scenario, men virkeligheten er mye mer kompleks, fører det til en dårlig fungerende tjeneste. +- **Stereotypisering**. Å assosiere en gitt gruppe med forhåndsbestemte attributter. +- **Nedvurdering**. Å urettferdig kritisere og merke noe eller noen. +- **Over- eller underrepresentasjon**. Tanken er at en bestemt gruppe ikke er synlig i en viss yrke, og enhver tjeneste eller funksjon som fortsetter å fremme dette bidrar til skade. + +### Azure RAI-dashboard + +[Azure RAI-dashboard](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) er bygget på åpen kildekodeverktøy utviklet av ledende akademiske institusjoner og organisasjoner, inkludert Microsoft, som er avgjørende for datasientister og AI-utviklere for bedre å forstå modellatferd, oppdage og redusere uønskede problemer fra AI-modeller. + +- Lær hvordan du bruker de forskjellige komponentene ved å sjekke ut RAI-dashboard [dokumentasjonen.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) + +- Sjekk ut noen RAI-dashboard [eksempelskript](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) for å feilsøke mer ansvarlige AI-scenarier i Azure Machine Learning. + +--- +## 🚀 Utfordring + +For å forhindre at statistiske eller datamessige skjevheter introduseres i utgangspunktet, bør vi: + +- ha en mangfoldig bakgrunn og ulike perspektiver blant de som jobber med systemene +- investere i datasett som reflekterer mangfoldet i samfunnet vårt +- utvikle bedre metoder for å oppdage og korrigere skjevheter når de oppstår + +Tenk på virkelige situasjoner der urettferdighet er tydelig i modellbygging og bruk. Hva annet bør vi ta hensyn til? + +## [Quiz etter forelesning](https://ff-quizzes.netlify.app/en/ml/) +## Gjennomgang og selvstudium + +I denne leksjonen har du lært noen av de praktiske verktøyene for å integrere ansvarlig AI i maskinlæring. + +Se denne workshoppen for å dykke dypere inn i temaene: + +- Responsible AI Dashboard: En helhetlig løsning for å operationalisere RAI i praksis av Besmira Nushi og Mehrnoosh Sameki + +[![Responsible AI Dashboard: En helhetlig løsning for å operationalisere RAI i praksis](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Responsible AI Dashboard: En helhetlig løsning for å operationalisere RAI i praksis") + +> 🎥 Klikk på bildet over for en video: Responsible AI Dashboard: En helhetlig løsning for å operationalisere RAI i praksis av Besmira Nushi og Mehrnoosh Sameki + +Referer til følgende materialer for å lære mer om ansvarlig AI og hvordan man bygger mer pålitelige modeller: + +- Microsofts RAI-dashboardverktøy for feilsøking av ML-modeller: [Ressurser for ansvarlige AI-verktøy](https://aka.ms/rai-dashboard) + +- Utforsk Responsible AI-verktøysettet: [Github](https://github.com/microsoft/responsible-ai-toolbox) + +- Microsofts RAI-ressurssenter: [Ressurser for ansvarlig AI – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsofts FATE-forskningsgruppe: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +## Oppgave + +[Utforsk RAI-dashboard](assignment.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/9-Real-World/2-Debugging-ML-Models/assignment.md b/translations/no/9-Real-World/2-Debugging-ML-Models/assignment.md new file mode 100644 index 000000000..9fdb962a7 --- /dev/null +++ b/translations/no/9-Real-World/2-Debugging-ML-Models/assignment.md @@ -0,0 +1,25 @@ + +# Utforsk Responsible AI (RAI) dashboard + +## Instruksjoner + +I denne leksjonen lærte du om RAI dashboard, en samling av komponenter bygget på "open-source"-verktøy for å hjelpe dataforskere med feilanalyse, datautforskning, vurdering av rettferdighet, modellfortolkning, kontrafaktiske/hva-hvis-vurderinger og kausalanalyse på AI-systemer. For denne oppgaven, utforsk noen av RAI dashboard sine eksempler [notebooks](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) og rapporter funnene dine i et papir eller en presentasjon. + +## Vurderingskriterier + +| Kriterier | Fremragende | Tilfredsstillende | Trenger forbedring | +| --------- | ----------- | ----------------- | ------------------ | +| | Et papir eller PowerPoint-presentasjon blir levert som diskuterer RAI dashboard sine komponenter, notebook som ble kjørt, og konklusjonene som ble trukket fra å kjøre den | Et papir blir levert uten konklusjoner | Ingen papir blir levert | + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/9-Real-World/README.md b/translations/no/9-Real-World/README.md new file mode 100644 index 000000000..ad21dc55a --- /dev/null +++ b/translations/no/9-Real-World/README.md @@ -0,0 +1,32 @@ + +# Postscript: Virkelige anvendelser av klassisk maskinlæring + +I denne delen av læreplanen vil du bli introdusert for noen virkelige anvendelser av klassisk ML. Vi har søkt på internett for å finne forskningsartikler og artikler om applikasjoner som har brukt disse strategiene, og unngått nevrale nettverk, dyp læring og AI så mye som mulig. Lær om hvordan ML brukes i forretningssystemer, økologiske applikasjoner, finans, kunst og kultur, og mer. + +![chess](../../../9-Real-World/images/chess.jpg) + +> Foto av Alexis FauvetUnsplash + +## Leksjon + +1. [Virkelige anvendelser for ML](1-Applications/README.md) +2. [Feilsøking av modeller i maskinlæring ved bruk av Responsible AI dashboard-komponenter](2-Debugging-ML-Models/README.md) + +## Kreditering + +"Virkelige anvendelser" ble skrevet av et team av folk, inkludert [Jen Looper](https://twitter.com/jenlooper) og [Ornella Altunyan](https://twitter.com/ornelladotcom). + +"Feilsøking av modeller i maskinlæring ved bruk av Responsible AI dashboard-komponenter" ble skrevet av [Ruth Yakubu](https://twitter.com/ruthieyakubu) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/CODE_OF_CONDUCT.md b/translations/no/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..6af71a60b --- /dev/null +++ b/translations/no/CODE_OF_CONDUCT.md @@ -0,0 +1,23 @@ + +# Microsoft Open Source Code of Conduct + +Dette prosjektet har tatt i bruk [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). + +Ressurser: + +- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) +- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +- Kontakt [opencode@microsoft.com](mailto:opencode@microsoft.com) ved spørsmål eller bekymringer + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/CONTRIBUTING.md b/translations/no/CONTRIBUTING.md new file mode 100644 index 000000000..3c99f637b --- /dev/null +++ b/translations/no/CONTRIBUTING.md @@ -0,0 +1,30 @@ + +# Bidra + +Dette prosjektet ønsker bidrag og forslag velkommen. De fleste bidrag krever at du +godtar en Contributor License Agreement (CLA) som erklærer at du har rett til, +og faktisk gir oss rettighetene til å bruke ditt bidrag. For detaljer, besøk +https://cla.microsoft.com. + +> Viktig: når du oversetter tekst i dette repoet, må du sørge for at du ikke bruker maskinoversettelse. Vi vil verifisere oversettelser via fellesskapet, så vennligst kun bidra med oversettelser til språk du er dyktig i. + +Når du sender inn en pull request, vil en CLA-bot automatisk avgjøre om du trenger +å gi en CLA og dekorere PR-en deretter (f.eks. etikett, kommentar). Følg bare +instruksjonene gitt av boten. Du trenger kun å gjøre dette én gang på tvers av alle repositorier som bruker vår CLA. + +Dette prosjektet har tatt i bruk [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For mer informasjon, se [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +eller kontakt [opencode@microsoft.com](mailto:opencode@microsoft.com) med eventuelle spørsmål eller kommentarer. + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/README.md b/translations/no/README.md new file mode 100644 index 000000000..365b1dc57 --- /dev/null +++ b/translations/no/README.md @@ -0,0 +1,177 @@ + +[![GitHub license](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/) + +### 🌐 Støtte for flere språk + +#### Støttet via GitHub Action (Automatisk og alltid oppdatert) + +[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](./README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](../he/README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Croatian](../hr/README.md) | [Slovenian](../sl/README.md) | [Ukrainian](../uk/README.md) | [Burmese (Myanmar)](../my/README.md) + +#### Bli med i fellesskapet + +[![Azure AI Discord](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) + +# Maskinlæring for nybegynnere - Et pensum + +> 🌍 Reis rundt i verden mens vi utforsker maskinlæring gjennom verdens kulturer 🌍 + +Cloud Advocates hos Microsoft er glade for å tilby et 12-ukers, 26-leksjons pensum om **maskinlæring**. I dette pensumet vil du lære om det som noen ganger kalles **klassisk maskinlæring**, hovedsakelig ved bruk av Scikit-learn som bibliotek og unngå dyp læring, som dekkes i vårt [AI for Beginners-pensum](https://aka.ms/ai4beginners). Kombiner disse leksjonene med vårt ['Data Science for Beginners'-pensum](https://aka.ms/ds4beginners), også! + +Reis med oss rundt i verden mens vi bruker disse klassiske teknikkene på data fra mange områder av verden. Hver leksjon inkluderer quiz før og etter leksjonen, skriftlige instruksjoner for å fullføre leksjonen, en løsning, en oppgave og mer. Vår prosjektbaserte pedagogikk lar deg lære mens du bygger, en bevist måte å få nye ferdigheter til å sitte. + +**✍️ Stor takk til våre forfattere** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Anirban Mukherjee, Ornella Altunyan, Ruth Yakubu og Amy Boyd + +**🎨 Takk også til våre illustratører** Tomomi Imura, Dasani Madipalli og Jen Looper + +**🙏 Spesiell takk 🙏 til våre Microsoft Student Ambassador-forfattere, anmeldere og innholdsbidragsytere**, spesielt Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila og Snigdha Agarwal + +**🤩 Ekstra takknemlighet til Microsoft Student Ambassadors Eric Wanjau, Jasleen Sondhi og Vidushi Gupta for våre R-leksjoner!** + +# Kom i gang + +Følg disse trinnene: +1. **Fork repoet**: Klikk på "Fork"-knappen øverst til høyre på denne siden. +2. **Klon repoet**: `git clone https://github.com/microsoft/ML-For-Beginners.git` + +> [finn alle tilleggsmaterialer for dette kurset i vår Microsoft Learn-samling](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +**[Studenter](https://aka.ms/student-page)**, for å bruke dette pensumet, fork hele repoet til din egen GitHub-konto og fullfør oppgavene alene eller med en gruppe: + +- Start med en quiz før leksjonen. +- Les leksjonen og fullfør aktivitetene, ta pauser og reflekter ved hver kunnskapssjekk. +- Prøv å lage prosjektene ved å forstå leksjonene i stedet for å kjøre løsningskoden; men den koden er tilgjengelig i `/solution`-mappene i hver prosjektorienterte leksjon. +- Ta quiz etter leksjonen. +- Fullfør utfordringen. +- Fullfør oppgaven. +- Etter å ha fullført en leksjonsgruppe, besøk [Diskusjonsforumet](https://github.com/microsoft/ML-For-Beginners/discussions) og "lær høyt" ved å fylle ut den passende PAT-rubrikken. En 'PAT' er et Progress Assessment Tool som er en rubrikk du fyller ut for å fremme læringen din. Du kan også reagere på andre PAT-er slik at vi kan lære sammen. + +> For videre studier anbefaler vi å følge disse [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott)-modulene og læringsstiene. + +**Lærere**, vi har [inkludert noen forslag](for-teachers.md) om hvordan du kan bruke dette pensumet. + +--- + +## Videogjennomganger + +Noen av leksjonene er tilgjengelige som korte videoer. Du finner alle disse i leksjonene, eller på [ML for Beginners-spillelisten på Microsoft Developer YouTube-kanalen](https://aka.ms/ml-beginners-videos) ved å klikke på bildet nedenfor. + +[![ML for beginners banner](../../images/ml-for-beginners-video-banner.png)](https://aka.ms/ml-beginners-videos) + +--- + +## Møt teamet + +[![Promo video](../../images/ml.gif)](https://youtu.be/Tj1XWrDSYJU) + +**Gif av** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal) + +> 🎥 Klikk på bildet ovenfor for en video om prosjektet og folkene som skapte det! + +--- + +## Pedagogikk + +Vi har valgt to pedagogiske prinsipper mens vi bygde dette pensumet: å sikre at det er praktisk **prosjektbasert** og at det inkluderer **hyppige quizer**. I tillegg har dette pensumet et felles **tema** for å gi det sammenheng. + +Ved å sikre at innholdet er knyttet til prosjekter, blir prosessen mer engasjerende for studenter, og begrepsforståelsen vil bli styrket. I tillegg setter en lavterskelquiz før en klasse studentens intensjon mot å lære et emne, mens en andre quiz etter klassen sikrer ytterligere forståelse. Dette pensumet ble designet for å være fleksibelt og morsomt og kan tas i sin helhet eller delvis. Prosjektene starter små og blir stadig mer komplekse mot slutten av den 12-ukers syklusen. Dette pensumet inkluderer også et tillegg om virkelige applikasjoner av ML, som kan brukes som ekstra kreditt eller som grunnlag for diskusjon. + +> Finn vår [Code of Conduct](CODE_OF_CONDUCT.md), [Contributing](CONTRIBUTING.md), og [Translation](TRANSLATIONS.md)-retningslinjer. Vi ønsker din konstruktive tilbakemelding velkommen! + +## Hver leksjon inkluderer + +- valgfri sketchnote +- valgfri tilleggsvideo +- videogjennomgang (noen leksjoner) +- [quiz før leksjonen](https://ff-quizzes.netlify.app/en/ml/) +- skriftlig leksjon +- for prosjektbaserte leksjoner, trinnvise guider for hvordan du bygger prosjektet +- kunnskapssjekker +- en utfordring +- tilleggslesing +- oppgave +- [quiz etter leksjonen](https://ff-quizzes.netlify.app/en/ml/) + +> **En merknad om språk**: Disse leksjonene er hovedsakelig skrevet i Python, men mange er også tilgjengelige i R. For å fullføre en R-leksjon, gå til `/solution`-mappen og se etter R-leksjoner. De inkluderer en .rmd-utvidelse som representerer en **R Markdown**-fil som enkelt kan defineres som en innbygging av `kodeblokker` (av R eller andre språk) og en `YAML-header` (som styrer hvordan utdata formateres, som PDF) i et `Markdown-dokument`. Som sådan fungerer det som et eksemplarisk forfatterrammeverk for datavitenskap siden det lar deg kombinere koden din, dens utdata og tankene dine ved å skrive dem ned i Markdown. Dessuten kan R Markdown-dokumenter gjengis til utdataformater som PDF, HTML eller Word. + +> **En merknad om quizer**: Alle quizer er inneholdt i [Quiz App-mappen](../../quiz-app), for totalt 52 quizer med tre spørsmål hver. De er lenket fra leksjonene, men quiz-appen kan kjøres lokalt; følg instruksjonene i `quiz-app`-mappen for å være vert lokalt eller distribuere til Azure. + +| Leksjonsnummer | Emne | Leksjonsgruppe | Læringsmål | Lenket leksjon | Forfatter | +| :-----------: | :------------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: | +| 01 | Introduksjon til maskinlæring | [Introduksjon](1-Introduction/README.md) | Lær de grunnleggende konseptene bak maskinlæring | [Leksjon](1-Introduction/1-intro-to-ML/README.md) | Muhammad | +| 02 | Historien til maskinlæring | [Introduksjon](1-Introduction/README.md) | Lær historien bak dette feltet | [Leksjon](1-Introduction/2-history-of-ML/README.md) | Jen og Amy | +| 03 | Rettferdighet og maskinlæring | [Introduksjon](1-Introduction/README.md) | Hva er de viktige filosofiske spørsmålene rundt rettferdighet som studenter bør vurdere når de bygger og bruker ML-modeller? | [Leksjon](1-Introduction/3-fairness/README.md) | Tomomi | +| 04 | Teknikker for maskinlæring | [Introduksjon](1-Introduction/README.md) | Hvilke teknikker bruker ML-forskere for å bygge ML-modeller? | [Leksjon](1-Introduction/4-techniques-of-ML/README.md) | Chris og Jen | +| 05 | Introduksjon til regresjon | [Regresjon](2-Regression/README.md) | Kom i gang med Python og Scikit-learn for regresjonsmodeller | +
  • [Python](2-Regression/1-Tools/README.md)
  • [R](../../2-Regression/1-Tools/solution/R/lesson_1.html)
|
  • Jen
  • Eric Wanjau
| +| 06 | Nordamerikanske gresskarpriser 🎃 | [Regresjon](2-Regression/README.md) | Visualiser og rengjør data som forberedelse til ML |
  • [Python](2-Regression/2-Data/README.md)
  • [R](../../2-Regression/2-Data/solution/R/lesson_2.html)
|
  • Jen
  • Eric Wanjau
| +| 07 | Nordamerikanske gresskarpriser 🎃 | [Regresjon](2-Regression/README.md) | Bygg lineære og polynomiske regresjonsmodeller |
  • [Python](2-Regression/3-Linear/README.md)
  • [R](../../2-Regression/3-Linear/solution/R/lesson_3.html)
|
  • Jen og Dmitry
  • Eric Wanjau
| +| 08 | Nordamerikanske gresskarpriser 🎃 | [Regresjon](2-Regression/README.md) | Bygg en logistisk regresjonsmodell |
  • [Python](2-Regression/4-Logistic/README.md)
  • [R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)
|
  • Jen
  • Eric Wanjau
| +| 09 | En webapp 🔌 | [Webapp](3-Web-App/README.md) | Bygg en webapp for å bruke din trente modell | [Python](3-Web-App/1-Web-App/README.md) | Jen | +| 10 | Introduksjon til klassifisering | [Klassifisering](4-Classification/README.md) | Rengjør, forbered og visualiser dataene dine; introduksjon til klassifisering |
  • [Python](4-Classification/1-Introduction/README.md)
  • [R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) |
    • Jen og Cassie
    • Eric Wanjau
    | +| 11 | Deilige asiatiske og indiske retter 🍜 | [Klassifisering](4-Classification/README.md) | Introduksjon til klassifikatorer |
    • [Python](4-Classification/2-Classifiers-1/README.md)
    • [R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) |
      • Jen og Cassie
      • Eric Wanjau
      | +| 12 | Deilige asiatiske og indiske retter 🍜 | [Klassifisering](4-Classification/README.md) | Flere klassifikatorer |
      • [Python](4-Classification/3-Classifiers-2/README.md)
      • [R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) |
        • Jen og Cassie
        • Eric Wanjau
        | +| 13 | Deilige asiatiske og indiske retter 🍜 | [Klassifisering](4-Classification/README.md) | Bygg en anbefalingswebapp ved hjelp av modellen din | [Python](4-Classification/4-Applied/README.md) | Jen | +| 14 | Introduksjon til klynging | [Klynging](5-Clustering/README.md) | Rengjør, forbered og visualiser dataene dine; introduksjon til klynging |
        • [Python](5-Clustering/1-Visualize/README.md)
        • [R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) |
          • Jen
          • Eric Wanjau
          | +| 15 | Utforsking av nigerianske musikksmaker 🎧 | [Klynging](5-Clustering/README.md) | Utforsk K-Means klyngemetoden |
          • [Python](5-Clustering/2-K-Means/README.md)
          • [R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) |
            • Jen
            • Eric Wanjau
            | +| 16 | Introduksjon til naturlig språkbehandling ☕️ | [Naturlig språkbehandling](6-NLP/README.md) | Lær det grunnleggende om NLP ved å bygge en enkel bot | [Python](6-NLP/1-Introduction-to-NLP/README.md) | Stephen | +| 17 | Vanlige NLP-oppgaver ☕️ | [Naturlig språkbehandling](6-NLP/README.md) | Fordyp deg i NLP ved å forstå vanlige oppgaver knyttet til språkstrukturer | [Python](6-NLP/2-Tasks/README.md) | Stephen | +| 18 | Oversettelse og sentimentanalyse ♥️ | [Naturlig språkbehandling](6-NLP/README.md) | Oversettelse og sentimentanalyse med Jane Austen | [Python](6-NLP/3-Translation-Sentiment/README.md) | Stephen | +| 19 | Romantiske hoteller i Europa ♥️ | [Naturlig språkbehandling](6-NLP/README.md) | Sentimentanalyse med hotellanmeldelser 1 | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | Stephen | +| 20 | Romantiske hoteller i Europa ♥️ | [Naturlig språkbehandling](6-NLP/README.md) | Sentimentanalyse med hotellanmeldelser 2 | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | Stephen | +| 21 | Introduksjon til tidsserieprognoser | [Tidsserier](7-TimeSeries/README.md) | Introduksjon til tidsserieprognoser | [Python](7-TimeSeries/1-Introduction/README.md) | Francesca | +| 22 | ⚡️ Verdens strømforbruk ⚡️ - tidsserieprognoser med ARIMA | [Tidsserier](7-TimeSeries/README.md) | Tidsserieprognoser med ARIMA | [Python](7-TimeSeries/2-ARIMA/README.md) | Francesca | +| 23 | ⚡️ Verdens strømforbruk ⚡️ - tidsserieprognoser med SVR | [Tidsserier](7-TimeSeries/README.md) | Tidsserieprognoser med Support Vector Regressor | [Python](7-TimeSeries/3-SVR/README.md) | Anirban | +| 24 | Introduksjon til forsterkende læring | [Forsterkende læring](8-Reinforcement/README.md) | Introduksjon til forsterkende læring med Q-Learning | [Python](8-Reinforcement/1-QLearning/README.md) | Dmitry | +| 25 | Hjelp Peter å unngå ulven! 🐺 | [Forsterkende læring](8-Reinforcement/README.md) | Forsterkende læring med Gym | [Python](8-Reinforcement/2-Gym/README.md) | Dmitry | +| Postscript | Virkelige ML-scenarier og applikasjoner | [ML i praksis](9-Real-World/README.md) | Interessante og avslørende virkelige applikasjoner av klassisk ML | [Leksjon](9-Real-World/1-Applications/README.md) | Team | +| Postscript | Modellfeilsøking i ML med RAI-dashboard | [ML i praksis](9-Real-World/README.md) | Modellfeilsøking i maskinlæring ved bruk av Responsible AI-dashboardkomponenter | [Leksjon](9-Real-World/2-Debugging-ML-Models/README.md) | Ruth Yakubu | + +> [finn alle tilleggsmaterialer for dette kurset i vår Microsoft Learn-samling](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +## Offline tilgang + +Du kan kjøre denne dokumentasjonen offline ved å bruke [Docsify](https://docsify.js.org/#/). Fork dette repoet, [installer Docsify](https://docsify.js.org/#/quickstart) på din lokale maskin, og deretter i rotmappen av dette repoet, skriv `docsify serve`. Nettstedet vil bli servert på port 3000 på din localhost: `localhost:3000`. + +## PDF-er + +Finn en PDF av pensum med lenker [her](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf). + +## 🎒 Andre kurs + +Teamet vårt produserer andre kurs! Sjekk ut: + +- [Generativ AI for nybegynnere](https://aka.ms/genai-beginners) +- [Generativ AI for nybegynnere .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet) +- [Generativ AI med JavaScript](https://github.com/microsoft/generative-ai-with-javascript) +- [Generativ AI med Java](https://github.com/microsoft/Generative-AI-for-beginners-java) +- [AI for nybegynnere](https://aka.ms/ai-beginners) +- [Data Science for nybegynnere](https://aka.ms/datascience-beginners) +- [ML for nybegynnere](https://aka.ms/ml-beginners) +- [Cybersikkerhet for nybegynnere](https://github.com/microsoft/Security-101) +- [Webutvikling for nybegynnere](https://aka.ms/webdev-beginners) +- [IoT for nybegynnere](https://aka.ms/iot-beginners) +- [XR-utvikling for nybegynnere](https://github.com/microsoft/xr-development-for-beginners) +- [Mestre GitHub Copilot for parprogrammering](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming) +- [Mestre GitHub Copilot for C#/.NET-utviklere](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers) +- [Velg ditt eget Copilot-eventyr](https://github.com/microsoft/CopilotAdventures) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/SECURITY.md b/translations/no/SECURITY.md new file mode 100644 index 000000000..924c18728 --- /dev/null +++ b/translations/no/SECURITY.md @@ -0,0 +1,51 @@ + +## Sikkerhet + +Microsoft tar sikkerheten til våre programvareprodukter og tjenester på alvor, inkludert alle kildekoderepositorier som administreres gjennom våre GitHub-organisasjoner, som inkluderer [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), og [våre GitHub-organisasjoner](https://opensource.microsoft.com/). + +Hvis du mener at du har funnet en sikkerhetssårbarhet i et Microsoft-eid repositorium som oppfyller [Microsofts definisjon av en sikkerhetssårbarhet](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott), vennligst rapporter det til oss som beskrevet nedenfor. + +## Rapportering av sikkerhetsproblemer + +**Vennligst ikke rapporter sikkerhetssårbarheter gjennom offentlige GitHub-issues.** + +Rapporter dem i stedet til Microsoft Security Response Center (MSRC) på [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). + +Hvis du foretrekker å sende inn uten å logge inn, kan du sende e-post til [secure@microsoft.com](mailto:secure@microsoft.com). Hvis mulig, krypter meldingen din med vår PGP-nøkkel; du kan laste den ned fra [Microsoft Security Response Center PGP Key-siden](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). + +Du bør motta et svar innen 24 timer. Hvis du av en eller annen grunn ikke gjør det, vennligst følg opp via e-post for å sikre at vi mottok din opprinnelige melding. Tilleggsinformasjon finner du på [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Vennligst inkluder den forespurte informasjonen nedenfor (så mye du kan gi) for å hjelpe oss med å forstå naturen og omfanget av det mulige problemet: + + * Type problem (f.eks. buffer overflow, SQL-injeksjon, cross-site scripting, etc.) + * Fullstendige stier til kildefil(er) relatert til manifestasjonen av problemet + * Plasseringen av den berørte kildekoden (tag/branch/commit eller direkte URL) + * Eventuell spesiell konfigurasjon som kreves for å gjenskape problemet + * Trinnvise instruksjoner for å gjenskape problemet + * Proof-of-concept eller utnyttelseskode (hvis mulig) + * Innvirkning av problemet, inkludert hvordan en angriper kan utnytte det + +Denne informasjonen vil hjelpe oss med å prioritere rapporten din raskere. + +Hvis du rapporterer for en bug bounty, kan mer komplette rapporter bidra til en høyere belønning. Besøk vår [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty)-side for mer informasjon om våre aktive programmer. + +## Foretrukne språk + +Vi foretrekker all kommunikasjon på engelsk. + +## Retningslinjer + +Microsoft følger prinsippet om [Koordinert sårbarhetsavsløring](https://www.microsoft.com/en-us/msrc/cvd). + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/SUPPORT.md b/translations/no/SUPPORT.md new file mode 100644 index 000000000..6a4e5f977 --- /dev/null +++ b/translations/no/SUPPORT.md @@ -0,0 +1,26 @@ + +# Støtte +## Hvordan rapportere problemer og få hjelp + +Dette prosjektet bruker GitHub Issues for å spore feil og funksjonsforespørsler. Vennligst søk blant eksisterende +problemer før du rapporterer nye for å unngå duplikater. For nye problemer, rapporter feilen eller +funksjonsforespørselen som en ny Issue. + +For hjelp og spørsmål om bruk av dette prosjektet, opprett en Issue. + +## Microsofts støttepolicy + +Støtte for dette arkivet er begrenset til ressursene som er oppført ovenfor. + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/docs/_sidebar.md b/translations/no/docs/_sidebar.md new file mode 100644 index 000000000..39be138e1 --- /dev/null +++ b/translations/no/docs/_sidebar.md @@ -0,0 +1,57 @@ + +- Introduksjon + - [Introduksjon til maskinlæring](../1-Introduction/1-intro-to-ML/README.md) + - [Historien om maskinlæring](../1-Introduction/2-history-of-ML/README.md) + - [Maskinlæring og rettferdighet](../1-Introduction/3-fairness/README.md) + - [Teknikker innen maskinlæring](../1-Introduction/4-techniques-of-ML/README.md) + +- Regresjon + - [Verktøyene i faget](../2-Regression/1-Tools/README.md) + - [Data](../2-Regression/2-Data/README.md) + - [Lineær regresjon](../2-Regression/3-Linear/README.md) + - [Logistisk regresjon](../2-Regression/4-Logistic/README.md) + +- Bygg en webapp + - [Webapp](../3-Web-App/1-Web-App/README.md) + +- Klassifisering + - [Introduksjon til klassifisering](../4-Classification/1-Introduction/README.md) + - [Klassifikatorer 1](../4-Classification/2-Classifiers-1/README.md) + - [Klassifikatorer 2](../4-Classification/3-Classifiers-2/README.md) + - [Anvendt maskinlæring](../4-Classification/4-Applied/README.md) + +- Klynging + - [Visualiser dataene dine](../5-Clustering/1-Visualize/README.md) + - [K-Means](../5-Clustering/2-K-Means/README.md) + +- NLP + - [Introduksjon til NLP](../6-NLP/1-Introduction-to-NLP/README.md) + - [NLP-oppgaver](../6-NLP/2-Tasks/README.md) + - [Oversettelse og sentimentanalyse](../6-NLP/3-Translation-Sentiment/README.md) + - [Hotellanmeldelser 1](../6-NLP/4-Hotel-Reviews-1/README.md) + - [Hotellanmeldelser 2](../6-NLP/5-Hotel-Reviews-2/README.md) + +- Tidsserieprognoser + - [Introduksjon til tidsserieprognoser](../7-TimeSeries/1-Introduction/README.md) + - [ARIMA](../7-TimeSeries/2-ARIMA/README.md) + - [SVR](../7-TimeSeries/3-SVR/README.md) + +- Forsterkende læring + - [Q-Læring](../8-Reinforcement/1-QLearning/README.md) + - [Gym](../8-Reinforcement/2-Gym/README.md) + +- Maskinlæring i den virkelige verden + - [Applikasjoner](../9-Real-World/1-Applications/README.md) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/for-teachers.md b/translations/no/for-teachers.md new file mode 100644 index 000000000..4d7e87fc8 --- /dev/null +++ b/translations/no/for-teachers.md @@ -0,0 +1,37 @@ + +## For lærere + +Ønsker du å bruke dette pensumet i klasserommet ditt? Vær så god! + +Faktisk kan du bruke det direkte på GitHub ved å bruke GitHub Classroom. + +For å gjøre det, må du forkere dette repoet. Du må opprette et repo for hver leksjon, så du må trekke ut hver mappe til et eget repo. På den måten kan [GitHub Classroom](https://classroom.github.com/classrooms) hente hver leksjon separat. + +Disse [fullstendige instruksjonene](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) gir deg en idé om hvordan du kan sette opp klasserommet ditt. + +## Bruke repoet som det er + +Hvis du ønsker å bruke dette repoet slik det står nå, uten å bruke GitHub Classroom, kan det også gjøres. Du må kommunisere med studentene dine om hvilken leksjon dere skal jobbe med sammen. + +I et online format (Zoom, Teams eller andre) kan du opprette grupperom for quizene og veilede studentene for å hjelpe dem med å forberede seg på læring. Deretter kan du invitere studentene til quizene og be dem sende inn svarene som 'issues' på et bestemt tidspunkt. Du kan gjøre det samme med oppgaver, hvis du ønsker at studentene skal jobbe sammen i det åpne. + +Hvis du foretrekker et mer privat format, kan du be studentene dine om å forkere pensumet, leksjon for leksjon, til sine egne private GitHub-repoer og gi deg tilgang. Deretter kan de fullføre quizene og oppgavene privat og sende dem til deg via issues på ditt klasseromsrepo. + +Det finnes mange måter å få dette til å fungere i et online klasseromsformat. Gi oss gjerne beskjed om hva som fungerer best for deg! + +## Gi oss dine tanker! + +Vi ønsker å gjøre dette pensumet nyttig for deg og dine studenter. Gi oss gjerne [tilbakemelding](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u). + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/quiz-app/README.md b/translations/no/quiz-app/README.md new file mode 100644 index 000000000..18e179b98 --- /dev/null +++ b/translations/no/quiz-app/README.md @@ -0,0 +1,126 @@ + +# Quizer + +Disse quizene er forhånds- og etterforelesningsquizene for ML-læreplanen på https://aka.ms/ml-beginners + +## Prosjektoppsett + +``` +npm install +``` + +### Kompilerer og oppdaterer automatisk for utvikling + +``` +npm run serve +``` + +### Kompilerer og minimerer for produksjon + +``` +npm run build +``` + +### Linter og fikser filer + +``` +npm run lint +``` + +### Tilpass konfigurasjon + +Se [Konfigurasjonsreferanse](https://cli.vuejs.org/config/). + +Kreditering: Takk til den originale versjonen av denne quiz-appen: https://github.com/arpan45/simple-quiz-vue + +## Distribuere til Azure + +Her er en steg-for-steg guide for å komme i gang: + +1. Fork en GitHub-repositorium +Sørg for at koden til din statiske webapp er i ditt GitHub-repositorium. Fork dette repositoriet. + +2. Opprett en Azure Static Web App +- Opprett en [Azure-konto](http://azure.microsoft.com) +- Gå til [Azure-portalen](https://portal.azure.com) +- Klikk på "Opprett en ressurs" og søk etter "Static Web App". +- Klikk "Opprett". + +3. Konfigurer den statiske webappen +- Grunnleggende: Abonnement: Velg ditt Azure-abonnement. +- Ressursgruppe: Opprett en ny ressursgruppe eller bruk en eksisterende. +- Navn: Gi et navn til din statiske webapp. +- Region: Velg regionen nærmest brukerne dine. + +- #### Distribusjonsdetaljer: +- Kilde: Velg "GitHub". +- GitHub-konto: Autoriser Azure til å få tilgang til din GitHub-konto. +- Organisasjon: Velg din GitHub-organisasjon. +- Repositorium: Velg repositoriet som inneholder din statiske webapp. +- Gren: Velg grenen du vil distribuere fra. + +- #### Byggdetaljer: +- Byggforhåndsinnstillinger: Velg rammeverket appen din er bygget med (f.eks. React, Angular, Vue, osv.). +- App-plassering: Angi mappen som inneholder koden til appen din (f.eks. / hvis den er i roten). +- API-plassering: Hvis du har en API, spesifiser dens plassering (valgfritt). +- Utdata-plassering: Angi mappen der byggeutdataene genereres (f.eks. build eller dist). + +4. Gjennomgå og opprett +Gjennomgå innstillingene dine og klikk "Opprett". Azure vil sette opp nødvendige ressurser og opprette en GitHub Actions-arbeidsflyt i ditt repositorium. + +5. GitHub Actions-arbeidsflyt +Azure vil automatisk opprette en GitHub Actions-arbeidsflytfil i ditt repositorium (.github/workflows/azure-static-web-apps-.yml). Denne arbeidsflyten vil håndtere bygge- og distribusjonsprosessen. + +6. Overvåk distribusjonen +Gå til "Actions"-fanen i ditt GitHub-repositorium. +Du bør se en arbeidsflyt som kjører. Denne arbeidsflyten vil bygge og distribuere din statiske webapp til Azure. +Når arbeidsflyten er fullført, vil appen din være live på den oppgitte Azure-URL-en. + +### Eksempel på arbeidsflytfil + +Her er et eksempel på hvordan GitHub Actions-arbeidsflytfilen kan se ut: +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 +``` + +### Tilleggsressurser +- [Azure Static Web Apps Dokumentasjon](https://learn.microsoft.com/azure/static-web-apps/getting-started) +- [GitHub Actions Dokumentasjon](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/sketchnotes/LICENSE.md b/translations/no/sketchnotes/LICENSE.md new file mode 100644 index 000000000..617e125c2 --- /dev/null +++ b/translations/no/sketchnotes/LICENSE.md @@ -0,0 +1,368 @@ + +Attribution-ShareAlike 4.0 Internasjonal + +======================================================================= + +Creative Commons Corporation ("Creative Commons") er ikke et advokatfirma og gir ikke juridiske tjenester eller juridisk rådgivning. Distribusjon av Creative Commons offentlige lisenser skaper ikke et advokat-klient-forhold eller andre relasjoner. Creative Commons gjør sine lisenser og tilhørende informasjon tilgjengelig "som den er". Creative Commons gir ingen garantier angående sine lisenser, noe materiale lisensiert under deres vilkår og betingelser, eller tilhørende informasjon. Creative Commons fraskriver seg alt ansvar for skader som følge av deres bruk i den grad det er mulig. + +Bruk av Creative Commons offentlige lisenser + +Creative Commons offentlige lisenser gir et standard sett med vilkår og betingelser som skapere og andre rettighetshavere kan bruke for å dele originale verk og annet materiale som er underlagt opphavsrett og visse andre rettigheter spesifisert i den offentlige lisensen nedenfor. Følgende betraktninger er kun for informasjonsformål, er ikke uttømmende, og utgjør ikke en del av våre lisenser. + + Betraktninger for lisensgivere: Våre offentlige lisenser er + ment for bruk av de som er autorisert til å gi offentligheten + tillatelse til å bruke materiale på måter som ellers er + begrenset av opphavsrett og visse andre rettigheter. Våre + lisenser er uoppsigelige. Lisensgivere bør lese og forstå + vilkårene og betingelsene for lisensen de velger før de + anvender den. Lisensgivere bør også sikre alle nødvendige + rettigheter før de anvender våre lisenser slik at offentligheten + kan gjenbruke materialet som forventet. Lisensgivere bør tydelig + merke materiale som ikke er underlagt lisensen. Dette inkluderer + annet CC-lisensiert materiale, eller materiale brukt under et + unntak eller begrensning til opphavsrett. Flere betraktninger + for lisensgivere: + wiki.creativecommons.org/Considerations_for_licensors + + Betraktninger for offentligheten: Ved å bruke en av våre + offentlige lisenser, gir en lisensgiver offentligheten tillatelse + til å bruke det lisensierte materialet under spesifiserte vilkår + og betingelser. Hvis lisensgiverens tillatelse ikke er nødvendig + av en eller annen grunn – for eksempel på grunn av et gjeldende + unntak eller begrensning til opphavsrett – reguleres ikke den + bruken av lisensen. Våre lisenser gir kun tillatelser under + opphavsrett og visse andre rettigheter som en lisensgiver har + myndighet til å gi. Bruk av det lisensierte materialet kan + fortsatt være begrenset av andre grunner, inkludert fordi andre + har opphavsrett eller andre rettigheter i materialet. En + lisensgiver kan komme med spesielle forespørsler, som å be om at + alle endringer merkes eller beskrives. Selv om det ikke er + påkrevd av våre lisenser, oppfordres du til å respektere slike + forespørsler der det er rimelig. Flere betraktninger for + offentligheten: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 Internasjonal Offentlig Lisens + +Ved å utøve de lisensierte rettighetene (definert nedenfor), aksepterer og samtykker du til å være bundet av vilkårene og betingelsene i denne Creative Commons Attribution-ShareAlike 4.0 Internasjonal Offentlig Lisens ("Offentlig Lisens"). I den grad denne Offentlige Lisensen kan tolkes som en kontrakt, gis du de lisensierte rettighetene som en motytelse for din aksept av disse vilkårene og betingelsene, og lisensgiveren gir deg slike rettigheter som en motytelse for fordeler lisensgiveren mottar ved å gjøre det lisensierte materialet tilgjengelig under disse vilkårene og betingelsene. + +Seksjon 1 – Definisjoner. + + a. Bearbeidet materiale betyr materiale underlagt opphavsrett og + lignende rettigheter som er avledet fra eller basert på det + lisensierte materialet og der det lisensierte materialet er + oversatt, endret, arrangert, transformert eller på annen måte + modifisert på en måte som krever tillatelse under opphavsrett og + lignende rettigheter holdt av lisensgiveren. For formålene med + denne Offentlige Lisensen, der det lisensierte materialet er et + musikalsk verk, fremføring eller lydopptak, produseres alltid + bearbeidet materiale der det lisensierte materialet synkroniseres + i tidsrelasjon med et bevegelig bilde. + + b. Adapterens lisens betyr lisensen du anvender på dine opphavsrett + og lignende rettigheter i dine bidrag til bearbeidet materiale i + samsvar med vilkårene og betingelsene i denne Offentlige Lisensen. + + c. BY-SA kompatibel lisens betyr en lisens oppført på + creativecommons.org/compatiblelicenses, godkjent av Creative + Commons som i hovedsak tilsvarende denne Offentlige Lisensen. + + d. Opphavsrett og lignende rettigheter betyr opphavsrett og/eller + lignende rettigheter nært knyttet til opphavsrett, inkludert, men + ikke begrenset til, fremføring, kringkasting, lydopptak og sui + generis database rettigheter, uten hensyn til hvordan rettighetene + er merket eller kategorisert. For formålene med denne Offentlige + Lisensen, er rettighetene spesifisert i Seksjon 2(b)(1)-(2) ikke + opphavsrett og lignende rettigheter. + + e. Effektive teknologiske tiltak betyr de tiltakene som, i fravær av + riktig myndighet, ikke kan omgås under lover som oppfyller + forpliktelser under artikkel 11 i WIPO Copyright Treaty vedtatt + 20. desember 1996, og/eller lignende internasjonale avtaler. + + f. Unntak og begrensninger betyr rimelig bruk, rimelig behandling, + og/eller andre unntak eller begrensninger til opphavsrett og + lignende rettigheter som gjelder for din bruk av det lisensierte + materialet. + + g. Lisenselementer betyr lisensattributtene oppført i navnet på en + Creative Commons Offentlig Lisens. Lisenselementene i denne + Offentlige Lisensen er Attribution og ShareAlike. + + h. Lisensiert materiale betyr det kunstneriske eller litterære verket, + databasen eller annet materiale som lisensgiveren har anvendt + denne Offentlige Lisensen på. + + i. Lisensierte rettigheter betyr rettighetene som gis til deg under + vilkårene og betingelsene i denne Offentlige Lisensen, som er + begrenset til alle opphavsrett og lignende rettigheter som gjelder + for din bruk av det lisensierte materialet og som lisensgiveren + har myndighet til å lisensiere. + + j. Lisensgiver betyr den eller de individene eller enhetene som gir + rettigheter under denne Offentlige Lisensen. + + k. Dele betyr å gi materiale til offentligheten på en hvilken som + helst måte eller prosess som krever tillatelse under de lisensierte + rettighetene, slik som reproduksjon, offentlig visning, offentlig + fremføring, distribusjon, spredning, kommunikasjon eller + importering, og å gjøre materialet tilgjengelig for offentligheten + inkludert på måter som medlemmer av offentligheten kan få tilgang + til materialet fra et sted og på et tidspunkt individuelt valgt av + dem. + + l. Sui generis database rettigheter betyr rettigheter andre enn + opphavsrett som følger av direktiv 96/9/EC fra Europaparlamentet + og Rådet av 11. mars 1996 om juridisk beskyttelse av databaser, + som endret og/eller etterfulgt, samt andre i hovedsak tilsvarende + rettigheter hvor som helst i verden. + + m. Du betyr den eller de individene eller enhetene som utøver de + lisensierte rettighetene under denne Offentlige Lisensen. Din har + en tilsvarende betydning. + +Seksjon 2 – Omfang. + + a. Lisensgivning. + + 1. Underlagt vilkårene og betingelsene i denne Offentlige + Lisensen, gir lisensgiveren deg herved en verdensomspennende, + royaltyfri, ikke-underlisensierbar, ikke-eksklusiv, + uoppsigelig lisens til å utøve de lisensierte rettighetene i + det lisensierte materialet til: + + a. reprodusere og dele det lisensierte materialet, helt + eller delvis; og + + b. produsere, reprodusere og dele bearbeidet materiale. + + 2. Unntak og begrensninger. For å unngå tvil, der unntak og + begrensninger gjelder for din bruk, gjelder ikke denne + Offentlige Lisensen, og du trenger ikke å overholde dens + vilkår og betingelser. + + 3. Varighet. Varigheten av denne Offentlige Lisensen er + spesifisert i Seksjon 6(a). + + 4. Medier og formater; tekniske modifikasjoner tillatt. + Lisensgiveren autoriserer deg til å utøve de lisensierte + rettighetene i alle medier og formater, enten kjent nå eller + opprettet senere, og til å gjøre tekniske modifikasjoner som + er nødvendige for å gjøre det. Lisensgiveren fraskriver seg + og/eller samtykker i å ikke hevde noen rett eller myndighet + til å forby deg fra å gjøre tekniske modifikasjoner som er + nødvendige for å utøve de lisensierte rettighetene, inkludert + tekniske modifikasjoner som er nødvendige for å omgå + effektive teknologiske tiltak. For formålene med denne + Offentlige Lisensen, produserer det å gjøre modifikasjoner + autorisert av denne Seksjon 2(a)(4) aldri bearbeidet + materiale. + + 5. Mottakere nedstrøms. + + a. Tilbud fra lisensgiveren – Lisensiert materiale. Hver + mottaker av det lisensierte materialet mottar + automatisk et tilbud fra lisensgiveren om å utøve de + lisensierte rettighetene under vilkårene og betingelsene + i denne Offentlige Lisensen. + + b. Ekstra tilbud fra lisensgiveren – Bearbeidet materiale. + Hver mottaker av bearbeidet materiale fra deg mottar + automatisk et tilbud fra lisensgiveren om å utøve de + lisensierte rettighetene i det bearbeidede materialet + under betingelsene i adapterens lisens du anvender. + + c. Ingen restriksjoner nedstrøms. Du kan ikke tilby eller + pålegge noen ekstra eller forskjellige vilkår eller + betingelser på, eller anvende noen effektive + teknologiske tiltak på, det lisensierte materialet hvis + det begrenser utøvelsen av de lisensierte rettighetene + av noen mottaker av det lisensierte materialet. + + 6. Ingen godkjenning. Ingenting i denne Offentlige Lisensen + utgjør eller kan tolkes som tillatelse til å hevde eller + antyde at du er, eller at din bruk av det lisensierte + materialet er, tilknyttet, sponset, godkjent eller gitt + offisiell status av lisensgiveren eller andre utpekt til å + motta attribusjon som angitt i Seksjon 3(a)(1)(A)(i). + + b. Andre rettigheter. + + 1. Ideelle rettigheter, som retten til integritet, er ikke + lisensiert under denne Offentlige Lisensen, heller ikke + publisitet, personvern og/eller andre lignende + personlighetsrettigheter; imidlertid, i den grad det er + mulig, fraskriver lisensgiveren seg og/eller samtykker i å + ikke hevde slike rettigheter holdt av lisensgiveren i den + begrensede grad som er nødvendig for å tillate deg å utøve + de lisensierte rettighetene, men ikke utover det. + + 2. Patent- og varemerkerettigheter er ikke lisensiert under + denne Offentlige Lisensen. + + 3. I den grad det er mulig, fraskriver lisensgiveren seg enhver + rett til å samle inn royalties fra deg for utøvelsen av de + lisensierte rettighetene, enten direkte eller gjennom en + innsamlerorganisasjon under en frivillig eller fraskrivbar + lovbestemt eller obligatorisk lisensordning. I alle andre + tilfeller forbeholder lisensgiveren seg uttrykkelig enhver + rett til å samle inn slike royalties. + +Seksjon 3 – Lisensbetingelser. + +Din utøvelse av de lisensierte rettighetene er uttrykkelig underlagt +følgende betingelser. + + a. Attribusjon. + + 1. Hvis du deler det lisensierte materialet (inkludert i + modifisert form), må du: + + a. beholde følgende hvis det er levert av lisensgiveren + med det lisensierte materialet: + + i. identifikasjon av skaperen(e) av det lisensierte + materialet og andre utpekt til å motta + attribusjon, på en rimelig måte forespurt av + lisensgiveren (inkludert ved pseudonym hvis + utpekt); + + ii. en opphavsrettsmerknad; + + iii. en merknad som refererer til denne Offentlige + Lisensen; + + iv. en merknad som refererer til ansvarsfraskrivelsen + for garantier; + + v. en URI eller hyperlink til det lisensierte + materialet i den grad det er rimelig praktisk; + + b. indikere hvis du har modifisert det lisensierte + materialet og beholde en indikasjon på eventuelle + tidligere modifikasjoner; og + + c. indikere at det lisensierte materialet er lisensiert + under denne Offentlige Lisensen, og inkludere teksten + til, eller URI eller hyperlink til, denne Offentlige + Lisensen. + + 2. Du kan oppfylle betingelsene i Seksjon 3(a)(1) på en hvilken + som helst rimelig måte basert på mediet, midlene og + konteksten der du deler det lisensierte materialet. For + eksempel kan det være rimelig å oppfylle betingelsene ved å + gi en URI eller hyperlink til en ressurs som inkluderer den + nødvendige informasjonen. + + 3. Hvis lisensgiveren ber om det, må du fjerne noe av + informasjonen som kreves av Seksjon 3(a)(1)(A) i den grad det + er rimelig praktisk. + + b. ShareAlike. + + I tillegg til betingelsene i Seksjon 3(a), hvis du deler bearbeidet + materiale du produserer, gjelder følgende betingelser også. + + 1. Adapterens lisens du anvender må være en Creative Commons + lisens med de samme lisenselementene, denne versjonen eller + senere, eller en BY-SA kompatibel lisens. + + 2. Du må inkludere teksten til, eller URI eller hyperlink til, + adapterens lisens du anvender. Du kan oppfylle denne + betingelsen på en hvilken som helst rimelig måte basert på + mediet, midlene og konteksten der du deler bearbeidet + materiale. + + 3. Du kan ikke tilby eller pålegge noen ekstra eller forskjellige + vilkår eller betingelser på, eller anvende noen effektive + teknologiske tiltak på, bearbeidet materiale som begrenser + utøvelsen av rettighetene gitt under adapterens lisens du + anvender. + +Seksjon 4 – Sui generis database rettigheter. + +Der de lisensierte rettighetene inkluderer sui generis database +rettigheter som gjelder for din bruk av det lisensierte materialet: + + a. for å unngå tvil, gir Seksjon 2(a)(1) deg retten til å trekke ut, + gjenbruke, reprodusere og dele hele eller en vesentlig del av + innholdet i databasen; + + b. hvis du inkluderer hele eller en vesentlig del av databaseinnholdet + i en database der du har sui generis database... +Rettigheter, der databasen som du har Sui Generis Database Rights i (men ikke dens individuelle innhold) er tilpasset materiale, + +inkludert for formålene i seksjon 3(b); og +c. Du må overholde betingelsene i seksjon 3(a) hvis du deler hele eller en vesentlig del av innholdet i databasen. + +For å unngå tvil, supplerer denne seksjonen 4 og erstatter ikke dine forpliktelser under denne offentlige lisensen der lisensierte rettigheter inkluderer andre opphavsrettigheter og lignende rettigheter. + +--- + +Seksjon 5 -- Ansvarsfraskrivelse og begrensning av ansvar. + +a. MED MINDRE ANNET ER SEPARAT AVTALT AV LISENSGIVEREN, I DEN GRAD DET ER MULIG, TILBYR LISENSGIVEREN DET LISENSIERTE MATERIALET SOM DET ER OG SOM TILGJENGELIG, OG GIR INGEN REPRESENTASJONER ELLER GARANTIER AV NOE SLAG ANGÅENDE DET LISENSIERTE MATERIALET, ENTEN UTTRYKT, IMPLISERT, LOVBESTEMT ELLER ANNET. DETTE INKLUDERER, UTEN BEGRENSNING, GARANTIER FOR EIENDOMSRETT, SALGBARHET, EGNETHET FOR ET SPESIFIKT FORMÅL, IKKE-KRENKELSE, FRAVÆR AV SKJULTE ELLER ANDRE DEFEKTER, NØYAKTIGHET, ELLER TILSTEDEVÆRELSE ELLER FRAVÆR AV FEIL, ENTEN KJENT ELLER OPPDAGBAR. DER ANSVARSFRASKRIVELSER AV GARANTIER IKKE ER TILLATT FULLSTENDIG ELLER DELVIS, KAN DENNE ANSVARSFRASKRIVELSEN IKKE GJELDE FOR DEG. + +b. I DEN GRAD DET ER MULIG, VIL LISENSGIVEREN UNDER INGEN OMSTENDIGHETER VÆRE ANSVARLIG OVERFOR DEG UNDER NOEN JURIDISK TEORI (INKLUDERT, UTEN BEGRENSNING, UAKTSOMHET) ELLER ANNET FOR NOEN DIREKTE, SPESIELLE, INDIREKTE, TILFELDIGE, FØLGESKADER, STRAFFENDE, EKSEMPLARISKE ELLER ANDRE TAP, KOSTNADER, UTGIFTER ELLER SKADER SOM OPPSTÅR FRA DENNE OFFENTLIGE LISENSEN ELLER BRUKEN AV DET LISENSIERTE MATERIALET, SELV OM LISENSGIVEREN HAR BLITT INFORMERT OM MULIGHETEN FOR SLIKE TAP, KOSTNADER, UTGIFTER ELLER SKADER. DER BEGRENSNING AV ANSVAR IKKE ER TILLATT FULLSTENDIG ELLER DELVIS, KAN DENNE BEGRENSNINGEN IKKE GJELDE FOR DEG. + +c. Ansvarsfraskrivelsen og begrensningen av ansvar som er gitt ovenfor skal tolkes på en måte som, i den grad det er mulig, mest mulig ligner en absolutt ansvarsfraskrivelse og fraskrivelse av alt ansvar. + +--- + +Seksjon 6 -- Varighet og opphør. + +a. Denne offentlige lisensen gjelder for varigheten av opphavsretten og lignende rettigheter som er lisensiert her. Imidlertid, hvis du ikke overholder denne offentlige lisensen, opphører dine rettigheter under denne offentlige lisensen automatisk. + +b. Der din rett til å bruke det lisensierte materialet har opphørt under seksjon 6(a), gjenopprettes den: + +1. automatisk fra datoen bruddet er rettet, forutsatt at det rettes innen 30 dager etter at du oppdaget bruddet; eller +2. ved uttrykkelig gjenoppretting av lisensgiveren. + +For å unngå tvil, påvirker ikke denne seksjonen 6(b) noen rett lisensgiveren kan ha til å søke rettsmidler for dine brudd på denne offentlige lisensen. + +c. For å unngå tvil, kan lisensgiveren også tilby det lisensierte materialet under separate vilkår eller betingelser eller slutte å distribuere det lisensierte materialet når som helst; imidlertid vil dette ikke avslutte denne offentlige lisensen. + +d. Seksjonene 1, 5, 6, 7 og 8 overlever opphør av denne offentlige lisensen. + +--- + +Seksjon 7 -- Andre vilkår og betingelser. + +a. Lisensgiveren skal ikke være bundet av noen tilleggsvilkår eller betingelser kommunisert av deg med mindre det er uttrykkelig avtalt. + +b. Eventuelle ordninger, forståelser eller avtaler angående det lisensierte materialet som ikke er angitt her, er separate fra og uavhengige av vilkårene og betingelsene i denne offentlige lisensen. + +--- + +Seksjon 8 -- Tolkning. + +a. For å unngå tvil, reduserer, begrenser, begrenser eller pålegger ikke denne offentlige lisensen noen betingelser for bruk av det lisensierte materialet som lovlig kan gjøres uten tillatelse under denne offentlige lisensen. + +b. I den grad det er mulig, hvis noen bestemmelse i denne offentlige lisensen anses som ikke håndhevbar, skal den automatisk reformeres til det minimum som er nødvendig for å gjøre den håndhevbar. Hvis bestemmelsen ikke kan reformeres, skal den skilles fra denne offentlige lisensen uten å påvirke håndhevelsen av de gjenværende vilkårene og betingelsene. + +c. Ingen vilkår eller betingelser i denne offentlige lisensen vil bli frafalt, og ingen unnlatelse av å overholde vil bli samtykket til med mindre det uttrykkelig er avtalt av lisensgiveren. + +d. Ingenting i denne offentlige lisensen utgjør eller kan tolkes som en begrensning på, eller fraskrivelse av, noen privilegier og immuniteter som gjelder for lisensgiveren eller deg, inkludert fra de juridiske prosessene til enhver jurisdiksjon eller myndighet. + +--- + +======================================================================= + +Creative Commons er ikke en part i sine offentlige lisenser. Uavhengig av dette kan Creative Commons velge å anvende en av sine offentlige lisenser på materiale det publiserer, og i de tilfellene vil det bli ansett som "lisensgiveren." Teksten til Creative Commons offentlige lisenser er dedikert til allmennheten under CC0 Public Domain Dedication. Bortsett fra det begrensede formålet med å indikere at materiale deles under en Creative Commons offentlig lisens eller som ellers tillatt av Creative Commons' retningslinjer publisert på creativecommons.org/policies, autoriserer ikke Creative Commons bruken av varemerket "Creative Commons" eller noe annet varemerke eller logo tilhørende Creative Commons uten forhåndsskriftlig samtykke, inkludert, uten begrensning, i forbindelse med uautoriserte modifikasjoner av noen av sine offentlige lisenser eller andre ordninger, forståelser eller avtaler angående bruk av lisensiert materiale. For å unngå tvil, utgjør ikke dette avsnittet en del av de offentlige lisensene. + +Creative Commons kan kontaktes på creativecommons.org. + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/sketchnotes/README.md b/translations/no/sketchnotes/README.md new file mode 100644 index 000000000..d997255f4 --- /dev/null +++ b/translations/no/sketchnotes/README.md @@ -0,0 +1,21 @@ + +Alle sketchnotes for pensum kan lastes ned her. + +🖨 For utskrift i høy oppløsning er TIFF-versjonene tilgjengelige på [dette repoet](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff). + +🎨 Laget av: [Tomomi Imura](https://github.com/girliemac) (Twitter: [@girlie_mac](https://twitter.com/girlie_mac)) + +[![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-sa/4.0/) + +--- + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/sv/1-Introduction/1-intro-to-ML/README.md b/translations/sv/1-Introduction/1-intro-to-ML/README.md new file mode 100644 index 000000000..cadde5704 --- /dev/null +++ b/translations/sv/1-Introduction/1-intro-to-ML/README.md @@ -0,0 +1,159 @@ + +# Introduktion till maskininlärning + +## [Quiz före föreläsning](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML för nybörjare - Introduktion till maskininlärning för nybörjare](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "ML för nybörjare - Introduktion till maskininlärning för nybörjare") + +> 🎥 Klicka på bilden ovan för en kort video som går igenom denna lektion. + +Välkommen till denna kurs om klassisk maskininlärning för nybörjare! Oavsett om du är helt ny inom detta ämne eller en erfaren ML-praktiker som vill fräscha upp dina kunskaper, är vi glada att ha dig med! Vi vill skapa en vänlig startpunkt för dina studier i maskininlärning och välkomnar gärna din [feedback](https://github.com/microsoft/ML-For-Beginners/discussions). + +[![Introduktion till ML](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Introduktion till ML") + +> 🎥 Klicka på bilden ovan för en video: MIT:s John Guttag introducerar maskininlärning + +--- +## Komma igång med maskininlärning + +Innan du börjar med detta kursmaterial behöver du ha din dator konfigurerad och redo att köra notebooks lokalt. + +- **Konfigurera din dator med dessa videor**. Använd följande länkar för att lära dig [hur du installerar Python](https://youtu.be/CXZYvNRIAKM) på ditt system och [ställer in en textredigerare](https://youtu.be/EU8eayHWoZg) för utveckling. +- **Lär dig Python**. Det rekommenderas också att ha en grundläggande förståelse för [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), ett programmeringsspråk som är användbart för dataforskare och som vi använder i denna kurs. +- **Lär dig Node.js och JavaScript**. Vi använder också JavaScript några gånger i denna kurs när vi bygger webbappar, så du behöver ha [node](https://nodejs.org) och [npm](https://www.npmjs.com/) installerade, samt [Visual Studio Code](https://code.visualstudio.com/) tillgängligt för både Python- och JavaScript-utveckling. +- **Skapa ett GitHub-konto**. Eftersom du hittade oss här på [GitHub](https://github.com), har du kanske redan ett konto, men om inte, skapa ett och fork:a sedan detta kursmaterial för att använda det själv. (Ge oss gärna en stjärna också 😊) +- **Utforska Scikit-learn**. Bekanta dig med [Scikit-learn](https://scikit-learn.org/stable/user_guide.html), en uppsättning ML-bibliotek som vi refererar till i dessa lektioner. + +--- +## Vad är maskininlärning? + +Begreppet 'maskininlärning' är ett av de mest populära och frekvent använda termerna idag. Det är inte osannolikt att du har hört detta begrepp åtminstone en gång om du har någon form av bekantskap med teknik, oavsett vilket område du arbetar inom. Mekaniken bakom maskininlärning är dock ett mysterium för de flesta. För en nybörjare inom maskininlärning kan ämnet ibland kännas överväldigande. Därför är det viktigt att förstå vad maskininlärning faktiskt är och att lära sig om det steg för steg, genom praktiska exempel. + +--- +## Hypekurvan + +![ml hype curve](../../../../1-Introduction/1-intro-to-ML/images/hype.png) + +> Google Trends visar den senaste 'hypekurvan' för termen 'maskininlärning' + +--- +## Ett mystiskt universum + +Vi lever i ett universum fullt av fascinerande mysterier. Stora vetenskapsmän som Stephen Hawking, Albert Einstein och många fler har ägnat sina liv åt att söka meningsfull information som avslöjar mysterierna i världen omkring oss. Detta är människans lärandevillkor: ett barn lär sig nya saker och upptäcker strukturen i sin värld år för år när det växer upp. + +--- +## Barnets hjärna + +Ett barns hjärna och sinnen uppfattar fakta från sin omgivning och lär sig gradvis de dolda mönstren i livet, vilket hjälper barnet att skapa logiska regler för att identifiera inlärda mönster. Den mänskliga hjärnans inlärningsprocess gör människor till världens mest sofistikerade levande varelse. Att kontinuerligt lära sig genom att upptäcka dolda mönster och sedan innovera på dessa mönster gör att vi kan bli bättre och bättre under hela vår livstid. Denna inlärningsförmåga och utvecklingskapacitet är relaterad till ett koncept som kallas [hjärnplasticitet](https://www.simplypsychology.org/brain-plasticity.html). Ytligt sett kan vi dra vissa motiverande likheter mellan den mänskliga hjärnans inlärningsprocess och koncepten inom maskininlärning. + +--- +## Den mänskliga hjärnan + +Den [mänskliga hjärnan](https://www.livescience.com/29365-human-brain.html) uppfattar saker från den verkliga världen, bearbetar den uppfattade informationen, fattar rationella beslut och utför vissa handlingar baserat på omständigheterna. Detta är vad vi kallar att bete sig intelligent. När vi programmerar en kopia av den intelligenta beteendeprocessen till en maskin kallas det artificiell intelligens (AI). + +--- +## Några termer + +Även om termerna kan förväxlas är maskininlärning (ML) en viktig delmängd av artificiell intelligens. **ML handlar om att använda specialiserade algoritmer för att upptäcka meningsfull information och hitta dolda mönster från uppfattad data för att stödja den rationella beslutsprocessen**. + +--- +## AI, ML, djupinlärning + +![AI, ML, deep learning, data science](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png) + +> En diagram som visar relationerna mellan AI, ML, djupinlärning och data science. Infografik av [Jen Looper](https://twitter.com/jenlooper) inspirerad av [denna grafik](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining) + +--- +## Koncept att täcka + +I detta kursmaterial kommer vi att täcka endast kärnkoncepten inom maskininlärning som en nybörjare måste känna till. Vi täcker det vi kallar 'klassisk maskininlärning' främst med hjälp av Scikit-learn, ett utmärkt bibliotek som många studenter använder för att lära sig grunderna. För att förstå bredare koncept inom artificiell intelligens eller djupinlärning är en stark grundläggande kunskap om maskininlärning oumbärlig, och därför vill vi erbjuda det här. + +--- +## I denna kurs kommer du att lära dig: + +- kärnkoncept inom maskininlärning +- maskininlärningens historia +- ML och rättvisa +- regressionstekniker inom ML +- klassificeringstekniker inom ML +- klustringstekniker inom ML +- tekniker för naturlig språkbehandling inom ML +- tekniker för tidsserieprognoser inom ML +- förstärkningsinlärning +- verkliga tillämpningar av ML + +--- +## Vad vi inte kommer att täcka + +- djupinlärning +- neurala nätverk +- AI + +För att skapa en bättre inlärningsupplevelse kommer vi att undvika komplexiteten i neurala nätverk, 'djupinlärning' - flerskiktad modellbyggnad med neurala nätverk - och AI, som vi kommer att diskutera i ett annat kursmaterial. Vi kommer också att erbjuda ett kommande kursmaterial om data science för att fokusera på den aspekten av detta större område. + +--- +## Varför studera maskininlärning? + +Maskininlärning, ur ett systemperspektiv, definieras som skapandet av automatiserade system som kan lära sig dolda mönster från data för att hjälpa till att fatta intelligenta beslut. + +Denna motivation är löst inspirerad av hur den mänskliga hjärnan lär sig vissa saker baserat på data den uppfattar från omvärlden. + +✅ Fundera en stund på varför ett företag skulle vilja använda strategier för maskininlärning istället för att skapa en hårdkodad regelbaserad motor. + +--- +## Tillämpningar av maskininlärning + +Tillämpningar av maskininlärning finns nu nästan överallt och är lika allestädes närvarande som den data som flödar runt i våra samhällen, genererad av våra smartphones, uppkopplade enheter och andra system. Med tanke på den enorma potentialen hos moderna maskininlärningsalgoritmer har forskare utforskat deras förmåga att lösa multidimensionella och tvärvetenskapliga verkliga problem med stora positiva resultat. + +--- +## Exempel på tillämpad ML + +**Du kan använda maskininlärning på många sätt**: + +- För att förutsäga sannolikheten för sjukdom utifrån en patients medicinska historia eller rapporter. +- För att använda väderdata för att förutsäga väderhändelser. +- För att förstå känslan i en text. +- För att upptäcka falska nyheter och stoppa spridningen av propaganda. + +Finans, ekonomi, geovetenskap, rymdforskning, biomedicinsk teknik, kognitiv vetenskap och till och med humaniora har anpassat maskininlärning för att lösa de arbetskrävande, databehandlingsintensiva problemen inom sina områden. + +--- +## Slutsats + +Maskininlärning automatiserar processen att upptäcka mönster genom att hitta meningsfulla insikter från verklig eller genererad data. Det har visat sig vara mycket värdefullt inom affärs-, hälso- och finansiella tillämpningar, bland andra. + +I en nära framtid kommer förståelsen av grunderna i maskininlärning att bli ett måste för människor inom alla områden på grund av dess utbredda användning. + +--- +# 🚀 Utmaning + +Skissa, på papper eller med hjälp av en onlineapp som [Excalidraw](https://excalidraw.com/), din förståelse av skillnaderna mellan AI, ML, djupinlärning och data science. Lägg till några idéer om problem som var och en av dessa tekniker är bra på att lösa. + +# [Quiz efter föreläsning](https://ff-quizzes.netlify.app/en/ml/) + +--- +# Granskning & Självstudier + +För att lära dig mer om hur du kan arbeta med ML-algoritmer i molnet, följ denna [Lärväg](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott). + +Ta en [Lärväg](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) om grunderna i ML. + +--- +# Uppgift + +[Kom igång](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/1-Introduction/1-intro-to-ML/assignment.md b/translations/sv/1-Introduction/1-intro-to-ML/assignment.md new file mode 100644 index 000000000..94272ca8a --- /dev/null +++ b/translations/sv/1-Introduction/1-intro-to-ML/assignment.md @@ -0,0 +1,23 @@ + +# Kom igång + +## Instruktioner + +I denna uppgift utan betyg ska du fräscha upp dina kunskaper i Python och få din miljö igång så att du kan köra notebooks. + +Ta denna [Python Learning Path](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), och sätt sedan upp dina system genom att gå igenom dessa introduktionsvideor: + +https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6 + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/1-Introduction/2-history-of-ML/README.md b/translations/sv/1-Introduction/2-history-of-ML/README.md new file mode 100644 index 000000000..1b92449d3 --- /dev/null +++ b/translations/sv/1-Introduction/2-history-of-ML/README.md @@ -0,0 +1,164 @@ + +# Historien om maskininlärning + +![Sammanfattning av historien om maskininlärning i en sketchnote](../../../../sketchnotes/ml-history.png) +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML för nybörjare - Historien om maskininlärning](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "ML för nybörjare - Historien om maskininlärning") + +> 🎥 Klicka på bilden ovan för en kort video som går igenom denna lektion. + +I denna lektion kommer vi att gå igenom de viktigaste milstolparna i historien om maskininlärning och artificiell intelligens. + +Historien om artificiell intelligens (AI) som forskningsområde är nära sammanflätad med historien om maskininlärning, eftersom de algoritmer och tekniska framsteg som ligger till grund för ML bidrog till utvecklingen av AI. Det är bra att komma ihåg att även om dessa områden som separata forskningsfält började ta form på 1950-talet, föregicks och överlappades denna era av viktiga [algoritmiska, statistiska, matematiska, beräkningsmässiga och tekniska upptäckter](https://wikipedia.org/wiki/Timeline_of_machine_learning). Faktum är att människor har funderat på dessa frågor i [hundratals år](https://wikipedia.org/wiki/History_of_artificial_intelligence): denna artikel diskuterar de historiska intellektuella grunderna för idén om en "tänkande maskin." + +--- +## Viktiga upptäckter + +- 1763, 1812 [Bayes sats](https://wikipedia.org/wiki/Bayes%27_theorem) och dess föregångare. Denna sats och dess tillämpningar ligger till grund för inferens och beskriver sannolikheten för att en händelse inträffar baserat på tidigare kunskap. +- 1805 [Minsta kvadratmetoden](https://wikipedia.org/wiki/Least_squares) av den franske matematikern Adrien-Marie Legendre. Denna teori, som du kommer att lära dig om i vår Regression-enhet, hjälper till med dataanpassning. +- 1913 [Markovkedjor](https://wikipedia.org/wiki/Markov_chain), uppkallad efter den ryske matematikern Andrey Markov, används för att beskriva en sekvens av möjliga händelser baserat på ett tidigare tillstånd. +- 1957 [Perceptron](https://wikipedia.org/wiki/Perceptron) är en typ av linjär klassificerare uppfunnen av den amerikanske psykologen Frank Rosenblatt som ligger till grund för framsteg inom djupinlärning. + +--- + +- 1967 [Närmaste granne](https://wikipedia.org/wiki/Nearest_neighbor) är en algoritm som ursprungligen designades för att kartlägga rutter. Inom ML används den för att upptäcka mönster. +- 1970 [Backpropagation](https://wikipedia.org/wiki/Backpropagation) används för att träna [feedforward-nätverk](https://wikipedia.org/wiki/Feedforward_neural_network). +- 1982 [Recurrent Neural Networks](https://wikipedia.org/wiki/Recurrent_neural_network) är artificiella neurala nätverk som härstammar från feedforward-nätverk och skapar temporala grafer. + +✅ Gör lite research. Vilka andra datum sticker ut som avgörande i historien om ML och AI? + +--- +## 1950: Maskiner som tänker + +Alan Turing, en verkligen enastående person som [av allmänheten 2019](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) röstades fram som 1900-talets största vetenskapsman, anses ha hjälpt till att lägga grunden för konceptet "en maskin som kan tänka." Han brottades med skeptiker och sitt eget behov av empiriska bevis för detta koncept, bland annat genom att skapa [Turingtestet](https://www.bbc.com/news/technology-18475646), som du kommer att utforska i våra NLP-lektioner. + +--- +## 1956: Dartmouth Summer Research Project + +"Dartmouth Summer Research Project on artificial intelligence var en avgörande händelse för artificiell intelligens som forskningsområde," och det var här termen "artificiell intelligens" myntades ([källa](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)). + +> Varje aspekt av lärande eller någon annan egenskap hos intelligens kan i princip beskrivas så exakt att en maskin kan göras för att simulera den. + +--- + +Huvudforskaren, matematikprofessorn John McCarthy, hoppades "att gå vidare på grundval av hypotesen att varje aspekt av lärande eller någon annan egenskap hos intelligens i princip kan beskrivas så exakt att en maskin kan göras för att simulera den." Deltagarna inkluderade en annan framstående person inom området, Marvin Minsky. + +Workshoppen anses ha initierat och uppmuntrat flera diskussioner, inklusive "framväxten av symboliska metoder, system fokuserade på begränsade domäner (tidiga expertsystem) och deduktiva system kontra induktiva system." ([källa](https://wikipedia.org/wiki/Dartmouth_workshop)). + +--- +## 1956 - 1974: "De gyllene åren" + +Från 1950-talet till mitten av 70-talet var optimismen hög kring hoppet att AI kunde lösa många problem. 1967 uttalade Marvin Minsky självsäkert att "Inom en generation ... kommer problemet med att skapa 'artificiell intelligens' i stort sett att vara löst." (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall) + +Forskning inom naturlig språkbehandling blomstrade, sökning förfinades och blev mer kraftfull, och konceptet "mikrovärldar" skapades, där enkla uppgifter utfördes med hjälp av instruktioner på vanligt språk. + +--- + +Forskningen finansierades väl av statliga organ, framsteg gjordes inom beräkning och algoritmer, och prototyper av intelligenta maskiner byggdes. Några av dessa maskiner inkluderar: + +* [Shakey the robot](https://wikipedia.org/wiki/Shakey_the_robot), som kunde manövrera och besluta hur uppgifter skulle utföras "intelligent". + + ![Shakey, en intelligent robot](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg) + > Shakey år 1972 + +--- + +* Eliza, en tidig "chatterbot", kunde samtala med människor och fungera som en primitiv "terapeut". Du kommer att lära dig mer om Eliza i NLP-lektionerna. + + ![Eliza, en bot](../../../../1-Introduction/2-history-of-ML/images/eliza.png) + > En version av Eliza, en chatbot + +--- + +* "Blocks world" var ett exempel på en mikrovärld där block kunde staplas och sorteras, och experiment i att lära maskiner att fatta beslut kunde testas. Framsteg byggda med bibliotek som [SHRDLU](https://wikipedia.org/wiki/SHRDLU) hjälpte till att driva språkbehandling framåt. + + [![blocks world med SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "blocks world med SHRDLU") + + > 🎥 Klicka på bilden ovan för en video: Blocks world med SHRDLU + +--- +## 1974 - 1980: "AI-vintern" + +I mitten av 1970-talet blev det uppenbart att komplexiteten i att skapa "intelligenta maskiner" hade underskattats och att dess löften, givet den tillgängliga beräkningskraften, hade överdrivits. Finansieringen torkade upp och förtroendet för området minskade. Några problem som påverkade förtroendet inkluderade: +--- +- **Begränsningar**. Beräkningskraften var för begränsad. +- **Kombinatorisk explosion**. Antalet parametrar som behövde tränas växte exponentiellt när mer krävdes av datorer, utan en parallell utveckling av beräkningskraft och kapacitet. +- **Brist på data**. Det fanns en brist på data som hindrade processen att testa, utveckla och förfina algoritmer. +- **Ställer vi rätt frågor?**. Själva frågorna som ställdes började ifrågasättas. Forskare började möta kritik kring sina tillvägagångssätt: + - Turingtestet ifrågasattes bland annat genom teorin om "den kinesiska rummet", som hävdade att "programmering av en digital dator kan få den att verka förstå språk men kan inte producera verklig förståelse." ([källa](https://plato.stanford.edu/entries/chinese-room/)) + - Etiken kring att introducera artificiella intelligenser som "terapeuten" ELIZA i samhället utmanades. + +--- + +Samtidigt började olika AI-skolor bildas. En dikotomi etablerades mellan ["scruffy" vs. "neat AI"](https://wikipedia.org/wiki/Neats_and_scruffies) metoder. _Scruffy_-labb justerade program i timmar tills de fick önskade resultat. _Neat_-labb "fokuserade på logik och formell problemlösning". ELIZA och SHRDLU var välkända _scruffy_-system. På 1980-talet, när efterfrågan på att göra ML-system reproducerbara ökade, tog _neat_-metoden gradvis ledningen eftersom dess resultat är mer förklarbara. + +--- +## 1980-talets expertsystem + +När området växte blev dess nytta för företag tydligare, och på 1980-talet ökade också spridningen av "expertsystem". "Expertsystem var bland de första verkligt framgångsrika formerna av artificiell intelligens (AI)-programvara." ([källa](https://wikipedia.org/wiki/Expert_system)). + +Denna typ av system är faktiskt _hybrid_, bestående delvis av en regelmotor som definierar affärskrav och en inferensmotor som utnyttjar regelsystemet för att härleda nya fakta. + +Denna era såg också ökat fokus på neurala nätverk. + +--- +## 1987 - 1993: AI "kyla" + +Spridningen av specialiserad hårdvara för expertsystem hade den olyckliga effekten att bli för specialiserad. Framväxten av persondatorer konkurrerade också med dessa stora, specialiserade, centraliserade system. Demokratiseringen av databehandling hade börjat, och den banade så småningom väg för den moderna explosionen av big data. + +--- +## 1993 - 2011 + +Denna epok såg en ny era för ML och AI att kunna lösa några av de problem som tidigare orsakats av bristen på data och beräkningskraft. Mängden data började snabbt öka och bli mer tillgänglig, på gott och ont, särskilt med framväxten av smarttelefonen runt 2007. Beräkningskraften expanderade exponentiellt, och algoritmer utvecklades parallellt. Fältet började mogna när de fria dagarna från det förflutna började kristalliseras till en verklig disciplin. + +--- +## Nu + +Idag berör maskininlärning och AI nästan alla delar av våra liv. Denna era kräver noggrann förståelse för riskerna och de potentiella effekterna av dessa algoritmer på människors liv. Som Microsofts Brad Smith har sagt, "Informationsteknologi väcker frågor som går till kärnan av grundläggande mänskliga rättigheter som integritet och yttrandefrihet. Dessa frågor ökar ansvaret för teknikföretag som skapar dessa produkter. Enligt vår uppfattning kräver de också genomtänkt statlig reglering och utveckling av normer kring acceptabla användningar" ([källa](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)). + +--- + +Det återstår att se vad framtiden har att erbjuda, men det är viktigt att förstå dessa datorsystem och den programvara och de algoritmer de kör. Vi hoppas att denna kursplan hjälper dig att få en bättre förståelse så att du kan bestämma själv. + +[![Historien om djupinlärning](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "Historien om djupinlärning") +> 🎥 Klicka på bilden ovan för en video: Yann LeCun diskuterar historien om djupinlärning i denna föreläsning + +--- +## 🚀Utmaning + +Gräv djupare i ett av dessa historiska ögonblick och lär dig mer om personerna bakom dem. Det finns fascinerande karaktärer, och ingen vetenskaplig upptäckt har någonsin skapats i ett kulturellt vakuum. Vad upptäcker du? + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +--- +## Granskning & Självstudier + +Här är saker att titta på och lyssna på: + +[Denna podcast där Amy Boyd diskuterar AI:s utveckling](http://runasradio.com/Shows/Show/739) + +[![Historien om AI av Amy Boyd](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "Historien om AI av Amy Boyd") + +--- + +## Uppgift + +[Skapa en tidslinje](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/1-Introduction/2-history-of-ML/assignment.md b/translations/sv/1-Introduction/2-history-of-ML/assignment.md new file mode 100644 index 000000000..2996916c4 --- /dev/null +++ b/translations/sv/1-Introduction/2-history-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Skapa en tidslinje + +## Instruktioner + +Använd [detta repo](https://github.com/Digital-Humanities-Toolkit/timeline-builder) för att skapa en tidslinje över någon aspekt av algoritmers, matematikens, statistikens, AI:s eller ML:s historia, eller en kombination av dessa. Du kan fokusera på en person, en idé eller en lång tidsperiod av tankar. Se till att inkludera multimediaelement. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ------------------------------------------------- | -------------------------------------- | --------------------------------------------------------------- | +| | En publicerad tidslinje presenteras som en GitHub-sida | Koden är ofullständig och inte publicerad | Tidslinjen är ofullständig, inte väl undersökt och inte publicerad | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/1-Introduction/3-fairness/README.md b/translations/sv/1-Introduction/3-fairness/README.md new file mode 100644 index 000000000..27b21a88e --- /dev/null +++ b/translations/sv/1-Introduction/3-fairness/README.md @@ -0,0 +1,171 @@ + +# Bygga maskininlärningslösningar med ansvarsfull AI + +![Sammanfattning av ansvarsfull AI i maskininlärning i en sketchnote](../../../../sketchnotes/ml-fairness.png) +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Introduktion + +I denna kursplan kommer du att börja upptäcka hur maskininlärning kan och redan påverkar våra dagliga liv. Redan nu är system och modeller involverade i dagliga beslutsprocesser, som exempelvis hälsovårdsdiagnoser, låneansökningar eller att upptäcka bedrägerier. Därför är det viktigt att dessa modeller fungerar väl för att ge resultat som är pålitliga. Precis som med vilken mjukvaruapplikation som helst kommer AI-system att missa förväntningar eller ge oönskade resultat. Det är därför avgörande att kunna förstå och förklara beteendet hos en AI-modell. + +Föreställ dig vad som kan hända när data som används för att bygga dessa modeller saknar vissa demografiska grupper, som exempelvis ras, kön, politiska åsikter eller religion, eller när dessa grupper är oproportionerligt representerade. Vad händer om modellens resultat tolkas som att gynna vissa grupper? Vilka blir konsekvenserna för applikationen? Dessutom, vad händer när modellen ger ett negativt resultat som skadar människor? Vem är ansvarig för AI-systemets beteende? Dessa är några av de frågor vi kommer att utforska i denna kursplan. + +I denna lektion kommer du att: + +- Öka din medvetenhet om vikten av rättvisa i maskininlärning och skador relaterade till orättvisa. +- Bli bekant med att utforska avvikelser och ovanliga scenarier för att säkerställa tillförlitlighet och säkerhet. +- Få förståelse för behovet av att stärka alla genom att designa inkluderande system. +- Utforska hur viktigt det är att skydda integritet och säkerhet för data och människor. +- Se vikten av att ha en "glaslåda"-metod för att förklara AI-modellers beteende. +- Vara medveten om hur ansvarstagande är avgörande för att bygga förtroende för AI-system. + +## Förkunskaper + +Som förkunskap, vänligen ta "Principer för ansvarsfull AI" på Learn Path och titta på videon nedan om ämnet: + +Lär dig mer om ansvarsfull AI genom att följa denna [Learning Path](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) + +[![Microsofts syn på ansvarsfull AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsofts syn på ansvarsfull AI") + +> 🎥 Klicka på bilden ovan för en video: Microsofts syn på ansvarsfull AI + +## Rättvisa + +AI-system bör behandla alla rättvist och undvika att påverka liknande grupper av människor på olika sätt. Till exempel, när AI-system ger vägledning om medicinsk behandling, låneansökningar eller anställning, bör de ge samma rekommendationer till alla med liknande symptom, ekonomiska förhållanden eller yrkeskvalifikationer. Vi människor bär alla på ärvda fördomar som påverkar våra beslut och handlingar. Dessa fördomar kan också återspeglas i data som används för att träna AI-system. Sådan manipulation kan ibland ske oavsiktligt. Det är ofta svårt att medvetet veta när man introducerar fördomar i data. + +**"Orättvisa"** omfattar negativa effekter, eller "skador", för en grupp människor, såsom de definierade utifrån ras, kön, ålder eller funktionsnedsättning. De huvudsakliga skadorna relaterade till rättvisa kan klassificeras som: + +- **Allokering**, om exempelvis ett kön eller en etnicitet gynnas över en annan. +- **Kvalitet på tjänsten**. Om du tränar data för ett specifikt scenario men verkligheten är mycket mer komplex, leder det till en dåligt fungerande tjänst. Till exempel en tvålautomat som inte kunde känna av personer med mörk hud. [Referens](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) +- **Nedvärdering**. Att orättvist kritisera och märka något eller någon. Till exempel, en bildmärkningsteknik som ökändes för att felaktigt märka bilder av mörkhyade personer som gorillor. +- **Över- eller underrepresentation**. Idén att en viss grupp inte syns i ett visst yrke, och att alla tjänster eller funktioner som fortsätter att främja detta bidrar till skada. +- **Stereotyper**. Att associera en viss grupp med förutbestämda attribut. Till exempel kan ett språköversättningssystem mellan engelska och turkiska ha felaktigheter på grund av ord med stereotypa kopplingar till kön. + +![översättning till turkiska](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png) +> översättning till turkiska + +![översättning tillbaka till engelska](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) +> översättning tillbaka till engelska + +När vi designar och testar AI-system måste vi säkerställa att AI är rättvis och inte programmerad att fatta partiska eller diskriminerande beslut, vilket även människor är förbjudna att göra. Att garantera rättvisa i AI och maskininlärning förblir en komplex socio-teknisk utmaning. + +### Tillförlitlighet och säkerhet + +För att bygga förtroende måste AI-system vara tillförlitliga, säkra och konsekventa under normala och oväntade förhållanden. Det är viktigt att veta hur AI-system beter sig i olika situationer, särskilt när de är avvikande. När vi bygger AI-lösningar måste vi lägga stor vikt vid hur vi hanterar en mängd olika omständigheter som AI-lösningarna kan stöta på. Till exempel måste en självkörande bil prioritera människors säkerhet. Därför måste AI som driver bilen ta hänsyn till alla möjliga scenarier som bilen kan stöta på, såsom natt, åskväder eller snöstormar, barn som springer över gatan, husdjur, vägarbeten etc. Hur väl ett AI-system kan hantera en mängd olika förhållanden på ett tillförlitligt och säkert sätt återspeglar graden av förutseende som dataforskaren eller AI-utvecklaren hade under systemets design eller testning. + +> [🎥 Klicka här för en video: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) + +### Inkludering + +AI-system bör designas för att engagera och stärka alla. När dataforskare och AI-utvecklare designar och implementerar AI-system identifierar och adresserar de potentiella hinder i systemet som oavsiktligt kan exkludera människor. Till exempel finns det 1 miljard människor med funktionsnedsättningar världen över. Med AI:s framsteg kan de få tillgång till en mängd information och möjligheter enklare i sina dagliga liv. Genom att adressera dessa hinder skapas möjligheter att innovera och utveckla AI-produkter med bättre upplevelser som gynnar alla. + +> [🎥 Klicka här för en video: inkludering i AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v) + +### Säkerhet och integritet + +AI-system bör vara säkra och respektera människors integritet. Människor har mindre förtroende för system som äventyrar deras integritet, information eller liv. När vi tränar maskininlärningsmodeller förlitar vi oss på data för att producera de bästa resultaten. I detta arbete måste vi överväga datans ursprung och integritet. Till exempel, var datan användargenererad eller offentligt tillgänglig? Vidare, när vi arbetar med data, är det avgörande att utveckla AI-system som kan skydda konfidentiell information och motstå attacker. När AI blir allt vanligare blir det allt viktigare och mer komplext att skydda integritet och säkra viktig personlig och affärsmässig information. Integritets- och datasäkerhetsfrågor kräver särskilt noggrann uppmärksamhet för AI eftersom tillgång till data är avgörande för att AI-system ska kunna göra korrekta och informerade förutsägelser och beslut om människor. + +> [🎥 Klicka här för en video: säkerhet i AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Som bransch har vi gjort betydande framsteg inom integritet och säkerhet, mycket tack vare regleringar som GDPR (General Data Protection Regulation). +- Med AI-system måste vi dock erkänna spänningen mellan behovet av mer personlig data för att göra systemen mer personliga och effektiva – och integritet. +- Precis som med internets födelse ser vi också en stor ökning av säkerhetsproblem relaterade till AI. +- Samtidigt har vi sett AI användas för att förbättra säkerheten. Till exempel drivs de flesta moderna antivirusprogram idag av AI-heuristik. +- Vi måste säkerställa att våra dataforskningsprocesser harmoniserar med de senaste integritets- och säkerhetspraxis. + +### Transparens + +AI-system bör vara förståeliga. En viktig del av transparens är att förklara AI-systemens beteende och deras komponenter. Att förbättra förståelsen av AI-system kräver att intressenter förstår hur och varför de fungerar så att de kan identifiera potentiella prestandaproblem, säkerhets- och integritetsproblem, fördomar, exkluderande praxis eller oavsiktliga resultat. Vi tror också att de som använder AI-system bör vara ärliga och öppna om när, varför och hur de väljer att använda dem, samt om systemens begränsningar. Till exempel, om en bank använder ett AI-system för att stödja sina beslut om konsumentlån, är det viktigt att granska resultaten och förstå vilken data som påverkar systemets rekommendationer. Regeringar börjar reglera AI inom olika branscher, så dataforskare och organisationer måste förklara om ett AI-system uppfyller regulatoriska krav, särskilt när det finns ett oönskat resultat. + +> [🎥 Klicka här för en video: transparens i AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- Eftersom AI-system är så komplexa är det svårt att förstå hur de fungerar och tolka resultaten. +- Denna brist på förståelse påverkar hur dessa system hanteras, operationaliseras och dokumenteras. +- Denna brist på förståelse påverkar ännu viktigare de beslut som fattas baserat på resultaten dessa system producerar. + +### Ansvarstagande + +De personer som designar och implementerar AI-system måste vara ansvariga för hur deras system fungerar. Behovet av ansvarstagande är särskilt viktigt med känsliga teknologier som ansiktsigenkänning. På senare tid har efterfrågan på ansiktsigenkänningsteknik ökat, särskilt från brottsbekämpande organisationer som ser potentialen i tekniken för användning som att hitta försvunna barn. Dessa teknologier kan dock potentiellt användas av en regering för att äventyra medborgarnas grundläggande friheter, exempelvis genom att möjliggöra kontinuerlig övervakning av specifika individer. Därför måste dataforskare och organisationer vara ansvariga för hur deras AI-system påverkar individer eller samhället. + +[![Ledande AI-forskare varnar för massövervakning genom ansiktsigenkänning](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsofts syn på ansvarsfull AI") + +> 🎥 Klicka på bilden ovan för en video: Varningar om massövervakning genom ansiktsigenkänning + +Slutligen är en av de största frågorna för vår generation, som den första generationen som introducerar AI i samhället, hur vi säkerställer att datorer förblir ansvariga inför människor och hur vi säkerställer att de som designar datorer förblir ansvariga inför alla andra. + +## Konsekvensbedömning + +Innan du tränar en maskininlärningsmodell är det viktigt att genomföra en konsekvensbedömning för att förstå syftet med AI-systemet; vad den avsedda användningen är; var det kommer att implementeras; och vem som kommer att interagera med systemet. Dessa är hjälpsamma för granskare eller testare som utvärderar systemet för att veta vilka faktorer som ska beaktas vid identifiering av potentiella risker och förväntade konsekvenser. + +Följande är fokusområden vid genomförande av en konsekvensbedömning: + +* **Negativ påverkan på individer**. Att vara medveten om eventuella restriktioner eller krav, otillåten användning eller kända begränsningar som hindrar systemets prestanda är avgörande för att säkerställa att systemet inte används på ett sätt som kan skada individer. +* **Datakrav**. Att förstå hur och var systemet kommer att använda data gör det möjligt för granskare att utforska eventuella datakrav som du måste vara medveten om (t.ex. GDPR eller HIPPA-regler). Dessutom, undersök om datakällan eller mängden data är tillräcklig för träning. +* **Sammanfattning av påverkan**. Samla en lista över potentiella skador som kan uppstå vid användning av systemet. Under hela ML-livscykeln, granska om de identifierade problemen har åtgärdats eller hanterats. +* **Tillämpliga mål** för var och en av de sex kärnprinciperna. Bedöm om målen från varje princip uppfylls och om det finns några luckor. + +## Felsökning med ansvarsfull AI + +Precis som att felsöka en mjukvaruapplikation är felsökning av ett AI-system en nödvändig process för att identifiera och lösa problem i systemet. Det finns många faktorer som kan påverka att en modell inte presterar som förväntat eller ansvarsfullt. De flesta traditionella modellprestandamått är kvantitativa sammanställningar av en modells prestanda, vilket inte är tillräckligt för att analysera hur en modell bryter mot principerna för ansvarsfull AI. Dessutom är en maskininlärningsmodell en "svart låda" som gör det svårt att förstå vad som driver dess resultat eller att ge en förklaring när den gör ett misstag. Senare i denna kurs kommer vi att lära oss hur man använder Responsible AI-dashboarden för att hjälpa till att felsöka AI-system. Dashboarden erbjuder ett holistiskt verktyg för dataforskare och AI-utvecklare att utföra: + +* **Felsökningsanalys**. För att identifiera felens fördelning i modellen som kan påverka systemets rättvisa eller tillförlitlighet. +* **Modellöversikt**. För att upptäcka var det finns skillnader i modellens prestanda över olika datakohorter. +* **Dataanalys**. För att förstå datadistributionen och identifiera eventuella fördomar i data som kan leda till problem med rättvisa, inkludering och tillförlitlighet. +* **Modelltolkning**. För att förstå vad som påverkar eller styr modellens förutsägelser. Detta hjälper till att förklara modellens beteende, vilket är viktigt för transparens och ansvarstagande. + +## 🚀 Utmaning + +För att förhindra att skador introduceras från början bör vi: + +- ha en mångfald av bakgrunder och perspektiv bland de personer som arbetar med systemen +- investera i dataset som speglar mångfalden i vårt samhälle +- utveckla bättre metoder under hela maskininlärningslivscykeln för att upptäcka och korrigera ansvarsfull AI när det inträffar + +Tänk på verkliga scenarier där en modells opålitlighet är uppenbar i modellbyggande och användning. Vad mer bör vi överväga? + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning och självstudier + +I denna lektion har du lärt dig några grunder om begreppen rättvisa och orättvisa i maskininlärning. +Titta på denna workshop för att fördjupa dig i ämnena: + +- I jakten på ansvarsfull AI: Att omsätta principer i praktiken av Besmira Nushi, Mehrnoosh Sameki och Amit Sharma + +[![Responsible AI Toolbox: En öppen källkodsram för att bygga ansvarsfull AI](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: En öppen källkodsram för att bygga ansvarsfull AI") + + +> 🎥 Klicka på bilden ovan för en video: RAI Toolbox: En öppen källkodsram för att bygga ansvarsfull AI av Besmira Nushi, Mehrnoosh Sameki och Amit Sharma + +Läs också: + +- Microsofts RAI-resurscenter: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsofts FATE-forskningsgrupp: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +RAI Toolbox: + +- [Responsible AI Toolbox GitHub-repository](https://github.com/microsoft/responsible-ai-toolbox) + +Läs om Azure Machine Learnings verktyg för att säkerställa rättvisa: + +- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) + +## Uppgift + +[Utforska RAI Toolbox](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/1-Introduction/3-fairness/assignment.md b/translations/sv/1-Introduction/3-fairness/assignment.md new file mode 100644 index 000000000..c0e8de0fd --- /dev/null +++ b/translations/sv/1-Introduction/3-fairness/assignment.md @@ -0,0 +1,25 @@ + +# Utforska Responsible AI Toolbox + +## Instruktioner + +I den här lektionen lärde du dig om Responsible AI Toolbox, ett "öppen källkod, community-drivet projekt för att hjälpa dataforskare att analysera och förbättra AI-system." För denna uppgift, utforska en av RAI Toolbox's [notebooks](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) och rapportera dina resultat i en uppsats eller presentation. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ------------ | ------------ | ------------------ | +| | En uppsats eller PowerPoint-presentation presenteras som diskuterar Fairlearns system, den notebook som kördes, och de slutsatser som drogs från att köra den | En uppsats presenteras utan slutsatser | Ingen uppsats presenteras | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som kan uppstå vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/1-Introduction/4-techniques-of-ML/README.md b/translations/sv/1-Introduction/4-techniques-of-ML/README.md new file mode 100644 index 000000000..a8a7bb296 --- /dev/null +++ b/translations/sv/1-Introduction/4-techniques-of-ML/README.md @@ -0,0 +1,132 @@ + +# Tekniker för maskininlärning + +Processen att bygga, använda och underhålla modeller för maskininlärning och den data de använder skiljer sig avsevärt från många andra utvecklingsarbetsflöden. I denna lektion kommer vi att avmystifiera processen och beskriva de huvudsakliga tekniker du behöver känna till. Du kommer att: + +- Förstå de processer som ligger till grund för maskininlärning på en övergripande nivå. +- Utforska grundläggande begrepp som "modeller", "prediktioner" och "träningsdata". + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +[![ML för nybörjare - Tekniker för maskininlärning](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML för nybörjare - Tekniker för maskininlärning") + +> 🎥 Klicka på bilden ovan för en kort video som går igenom denna lektion. + +## Introduktion + +På en övergripande nivå består hantverket att skapa processer för maskininlärning (ML) av flera steg: + +1. **Bestäm frågan**. De flesta ML-processer börjar med att ställa en fråga som inte kan besvaras med ett enkelt villkorsprogram eller en regelbaserad motor. Dessa frågor handlar ofta om att göra prediktioner baserade på en samling data. +2. **Samla in och förbered data**. För att kunna besvara din fråga behöver du data. Kvaliteten och ibland mängden av din data kommer att avgöra hur väl du kan besvara din ursprungliga fråga. Att visualisera data är en viktig del av denna fas. Denna fas inkluderar också att dela upp data i en tränings- och testgrupp för att bygga en modell. +3. **Välj en träningsmetod**. Beroende på din fråga och datans natur behöver du välja hur du vill träna en modell för att bäst reflektera din data och göra korrekta prediktioner baserat på den. Detta är den del av din ML-process som kräver specifik expertis och ofta en betydande mängd experimenterande. +4. **Träna modellen**. Med hjälp av din träningsdata använder du olika algoritmer för att träna en modell att känna igen mönster i datan. Modellen kan använda interna vikter som kan justeras för att prioritera vissa delar av datan över andra för att bygga en bättre modell. +5. **Utvärdera modellen**. Du använder data som modellen aldrig tidigare sett (din testdata) från din insamlade uppsättning för att se hur modellen presterar. +6. **Justera parametrar**. Baserat på modellens prestanda kan du göra om processen med olika parametrar eller variabler som styr beteendet hos de algoritmer som används för att träna modellen. +7. **Prediktera**. Använd nya indata för att testa modellens noggrannhet. + +## Vilken fråga ska ställas? + +Datorer är särskilt skickliga på att upptäcka dolda mönster i data. Denna förmåga är mycket användbar för forskare som har frågor om ett visst område som inte enkelt kan besvaras genom att skapa en regelbaserad motor. Givet en aktuarieuppgift, till exempel, kan en dataforskare skapa handgjorda regler kring dödligheten hos rökare jämfört med icke-rökare. + +När många andra variabler tas med i ekvationen kan dock en ML-modell visa sig vara mer effektiv för att förutsäga framtida dödlighetsnivåer baserat på tidigare hälsodata. Ett mer positivt exempel kan vara att göra väderprognoser för april månad på en viss plats baserat på data som inkluderar latitud, longitud, klimatförändringar, närhet till havet, jetströmmens mönster och mer. + +✅ Denna [presentation](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) om vädermodeller ger ett historiskt perspektiv på att använda ML i väderanalys. + +## Förberedande uppgifter + +Innan du börjar bygga din modell finns det flera uppgifter du behöver slutföra. För att testa din fråga och formulera en hypotes baserad på modellens prediktioner behöver du identifiera och konfigurera flera element. + +### Data + +För att kunna besvara din fråga med någon form av säkerhet behöver du en tillräcklig mängd data av rätt typ. Det finns två saker du behöver göra vid denna punkt: + +- **Samla in data**. Med tanke på den tidigare lektionen om rättvisa i dataanalys, samla in din data med omsorg. Var medveten om källorna till denna data, eventuella inneboende fördomar den kan ha, och dokumentera dess ursprung. +- **Förbered data**. Det finns flera steg i processen att förbereda data. Du kan behöva sammanställa data och normalisera den om den kommer från olika källor. Du kan förbättra datans kvalitet och kvantitet genom olika metoder, såsom att konvertera strängar till siffror (som vi gör i [Klustring](../../5-Clustering/1-Visualize/README.md)). Du kan också generera ny data baserat på den ursprungliga (som vi gör i [Klassificering](../../4-Classification/1-Introduction/README.md)). Du kan rensa och redigera datan (som vi gör inför [Webbapplikationslektionen](../../3-Web-App/README.md)). Slutligen kan du behöva slumpa och blanda datan, beroende på dina träningsmetoder. + +✅ Efter att ha samlat in och bearbetat din data, ta en stund för att se om dess struktur tillåter dig att adressera din avsedda fråga. Det kan vara så att datan inte presterar väl i din givna uppgift, som vi upptäcker i våra [Klustringslektioner](../../5-Clustering/1-Visualize/README.md)! + +### Funktioner och mål + +En [funktion](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) är en mätbar egenskap hos din data. I många dataset uttrycks det som en kolumnrubrik som "datum", "storlek" eller "färg". Din funktionsvariabel, vanligtvis representerad som `X` i kod, representerar indata som kommer att användas för att träna modellen. + +Ett mål är det du försöker förutsäga. Målet, vanligtvis representerat som `y` i kod, representerar svaret på den fråga du försöker ställa till din data: i december, vilken **färg** på pumpor kommer att vara billigast? I San Francisco, vilka områden kommer att ha det bästa fastighets**priset**? Ibland kallas målet också för etikettattribut. + +### Välja din funktionsvariabel + +🎓 **Funktionsval och funktionsutvinning** Hur vet du vilken variabel du ska välja när du bygger en modell? Du kommer förmodligen att gå igenom en process av funktionsval eller funktionsutvinning för att välja rätt variabler för den mest presterande modellen. De är dock inte samma sak: "Funktionsutvinning skapar nya funktioner från funktioner av de ursprungliga funktionerna, medan funktionsval returnerar en delmängd av funktionerna." ([källa](https://wikipedia.org/wiki/Feature_selection)) + +### Visualisera din data + +En viktig aspekt av dataforskarens verktygslåda är förmågan att visualisera data med hjälp av flera utmärkta bibliotek som Seaborn eller MatPlotLib. Att representera din data visuellt kan hjälpa dig att upptäcka dolda korrelationer som du kan utnyttja. Dina visualiseringar kan också hjälpa dig att upptäcka fördomar eller obalanserad data (som vi upptäcker i [Klassificering](../../4-Classification/2-Classifiers-1/README.md)). + +### Dela upp din dataset + +Innan träning behöver du dela upp din dataset i två eller fler delar av olika storlek som fortfarande representerar datan väl. + +- **Träning**. Denna del av datasetet används för att träna din modell. Denna uppsättning utgör majoriteten av den ursprungliga datasetet. +- **Testning**. En testdataset är en oberoende grupp av data, ofta hämtad från den ursprungliga datan, som du använder för att bekräfta prestandan hos den byggda modellen. +- **Validering**. En valideringsuppsättning är en mindre oberoende grupp av exempel som du använder för att justera modellens hyperparametrar eller arkitektur för att förbättra modellen. Beroende på storleken på din data och frågan du ställer kanske du inte behöver bygga denna tredje uppsättning (som vi noterar i [Tidsserieprognoser](../../7-TimeSeries/1-Introduction/README.md)). + +## Bygga en modell + +Med hjälp av din träningsdata är ditt mål att bygga en modell, eller en statistisk representation av din data, med hjälp av olika algoritmer för att **träna** den. Att träna en modell exponerar den för data och låter den göra antaganden om uppfattade mönster den upptäcker, validerar och accepterar eller förkastar. + +### Bestäm en träningsmetod + +Beroende på din fråga och datans natur kommer du att välja en metod för att träna den. Genom att gå igenom [Scikit-learns dokumentation](https://scikit-learn.org/stable/user_guide.html) - som vi använder i denna kurs - kan du utforska många sätt att träna en modell. Beroende på din erfarenhet kan du behöva prova flera olika metoder för att bygga den bästa modellen. Du kommer sannolikt att gå igenom en process där dataforskare utvärderar modellens prestanda genom att mata in data den inte har sett tidigare, kontrollera noggrannhet, fördomar och andra kvalitetsförsämrande problem, och välja den mest lämpliga träningsmetoden för den aktuella uppgiften. + +### Träna en modell + +Med din träningsdata redo är du redo att "anpassa" den för att skapa en modell. Du kommer att märka att i många ML-bibliotek hittar du koden 'model.fit' - det är vid denna tidpunkt som du skickar in din funktionsvariabel som en array av värden (vanligtvis 'X') och en målvariabel (vanligtvis 'y'). + +### Utvärdera modellen + +När träningsprocessen är klar (det kan ta många iterationer, eller "epoker", att träna en stor modell) kommer du att kunna utvärdera modellens kvalitet genom att använda testdata för att bedöma dess prestanda. Denna data är en delmängd av den ursprungliga datan som modellen inte tidigare har analyserat. Du kan skriva ut en tabell med mätvärden om modellens kvalitet. + +🎓 **Modellanpassning** + +I maskininlärningens kontext hänvisar modellanpassning till modellens noggrannhet när den försöker analysera data som den inte är bekant med. + +🎓 **Underanpassning** och **överanpassning** är vanliga problem som försämrar modellens kvalitet, eftersom modellen anpassar sig antingen inte tillräckligt bra eller för bra. Detta gör att modellen gör prediktioner som antingen är för nära eller för löst kopplade till dess träningsdata. En överanpassad modell förutsäger träningsdata för bra eftersom den har lärt sig datans detaljer och brus för bra. En underanpassad modell är inte noggrann eftersom den varken kan analysera sin träningsdata eller data den inte har "sett" korrekt. + +![överanpassad modell](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png) +> Infografik av [Jen Looper](https://twitter.com/jenlooper) + +## Justera parametrar + +När din initiala träning är klar, observera modellens kvalitet och överväg att förbättra den genom att justera dess "hyperparametrar". Läs mer om processen [i dokumentationen](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott). + +## Prediktion + +Detta är ögonblicket då du kan använda helt ny data för att testa modellens noggrannhet. I en "tillämpad" ML-miljö, där du bygger webbapplikationer för att använda modellen i produktion, kan denna process innebära att samla in användarinmatning (till exempel ett knapptryck) för att ställa in en variabel och skicka den till modellen för inferens eller utvärdering. + +I dessa lektioner kommer du att upptäcka hur du använder dessa steg för att förbereda, bygga, testa, utvärdera och prediktera - alla gester av en dataforskare och mer, när du utvecklas i din resa att bli en "fullstack"-ML-ingenjör. + +--- + +## 🚀Utmaning + +Rita ett flödesschema som reflekterar stegen för en ML-praktiker. Var befinner du dig just nu i processen? Var tror du att du kommer att stöta på svårigheter? Vad verkar enkelt för dig? + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Sök online efter intervjuer med dataforskare som diskuterar sitt dagliga arbete. Här är [en](https://www.youtube.com/watch?v=Z3IjgbbCEfs). + +## Uppgift + +[Intervjua en dataforskare](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/1-Introduction/4-techniques-of-ML/assignment.md b/translations/sv/1-Introduction/4-techniques-of-ML/assignment.md new file mode 100644 index 000000000..62f01a3ee --- /dev/null +++ b/translations/sv/1-Introduction/4-techniques-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# Intervjua en data scientist + +## Instruktioner + +I ditt företag, i en användargrupp, eller bland dina vänner eller studiekamrater, prata med någon som arbetar professionellt som data scientist. Skriv en kort uppsats (500 ord) om deras dagliga arbetsuppgifter. Är de specialister, eller arbetar de 'full stack'? + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------ | --------------------- | +| | En uppsats med korrekt längd, med angivna källor, presenteras som en .doc-fil | Uppsatsen har bristande källhänvisningar eller är kortare än den angivna längden | Ingen uppsats presenteras | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/1-Introduction/README.md b/translations/sv/1-Introduction/README.md new file mode 100644 index 000000000..55103dba7 --- /dev/null +++ b/translations/sv/1-Introduction/README.md @@ -0,0 +1,37 @@ + +# Introduktion till maskininlärning + +I den här delen av kursplanen kommer du att introduceras till de grundläggande koncepten inom området maskininlärning, vad det är, och lära dig om dess historia och de tekniker forskare använder för att arbeta med det. Låt oss utforska denna nya värld av ML tillsammans! + +![jordglob](../../../1-Introduction/images/globe.jpg) +> Foto av Bill OxfordUnsplash + +### Lektioner + +1. [Introduktion till maskininlärning](1-intro-to-ML/README.md) +1. [Maskininlärningens och AI:s historia](2-history-of-ML/README.md) +1. [Rättvisa och maskininlärning](3-fairness/README.md) +1. [Tekniker inom maskininlärning](4-techniques-of-ML/README.md) + +### Krediter + +"Introduktion till maskininlärning" skrevs med ♥️ av ett team som inkluderar [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) och [Jen Looper](https://twitter.com/jenlooper) + +"Maskininlärningens historia" skrevs med ♥️ av [Jen Looper](https://twitter.com/jenlooper) och [Amy Boyd](https://twitter.com/AmyKateNicho) + +"Rättvisa och maskininlärning" skrevs med ♥️ av [Tomomi Imura](https://twitter.com/girliemac) + +"Tekniker inom maskininlärning" skrevs med ♥️ av [Jen Looper](https://twitter.com/jenlooper) och [Chris Noring](https://twitter.com/softchris) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiska översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/1-Tools/README.md b/translations/sv/2-Regression/1-Tools/README.md new file mode 100644 index 000000000..04a55719b --- /dev/null +++ b/translations/sv/2-Regression/1-Tools/README.md @@ -0,0 +1,238 @@ + +# Kom igång med Python och Scikit-learn för regressionsmodeller + +![Sammanfattning av regressioner i en sketchnote](../../../../sketchnotes/ml-regression.png) + +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Den här lektionen finns tillgänglig i R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) + +## Introduktion + +I dessa fyra lektioner kommer du att lära dig hur man bygger regressionsmodeller. Vi kommer snart att diskutera vad dessa används till. Men innan du gör något, se till att du har rätt verktyg på plats för att starta processen! + +I den här lektionen kommer du att lära dig att: + +- Konfigurera din dator för lokala maskininlärningsuppgifter. +- Arbeta med Jupyter-notebooks. +- Använda Scikit-learn, inklusive installation. +- Utforska linjär regression med en praktisk övning. + +## Installationer och konfigurationer + +[![ML för nybörjare - Ställ in dina verktyg för att bygga maskininlärningsmodeller](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML för nybörjare - Ställ in dina verktyg för att bygga maskininlärningsmodeller") + +> 🎥 Klicka på bilden ovan för en kort video om att konfigurera din dator för ML. + +1. **Installera Python**. Se till att [Python](https://www.python.org/downloads/) är installerat på din dator. Du kommer att använda Python för många data science- och maskininlärningsuppgifter. De flesta datorsystem har redan en Python-installation. Det finns användbara [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) som kan underlätta installationen för vissa användare. + + Vissa användningsområden för Python kräver dock en viss version av programvaran, medan andra kräver en annan version. Därför är det användbart att arbeta inom en [virtuell miljö](https://docs.python.org/3/library/venv.html). + +2. **Installera Visual Studio Code**. Se till att du har Visual Studio Code installerat på din dator. Följ dessa instruktioner för att [installera Visual Studio Code](https://code.visualstudio.com/) för grundläggande installation. Du kommer att använda Python i Visual Studio Code i den här kursen, så det kan vara bra att fräscha upp hur man [konfigurerar Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) för Python-utveckling. + + > Bli bekväm med Python genom att arbeta igenom denna samling av [Learn-moduler](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) + > + > [![Ställ in Python med Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Ställ in Python med Visual Studio Code") + > + > 🎥 Klicka på bilden ovan för en video: använda Python i VS Code. + +3. **Installera Scikit-learn**, genom att följa [dessa instruktioner](https://scikit-learn.org/stable/install.html). Eftersom du behöver använda Python 3 rekommenderas det att du använder en virtuell miljö. Observera att om du installerar detta bibliotek på en M1 Mac finns det särskilda instruktioner på sidan som är länkad ovan. + +4. **Installera Jupyter Notebook**. Du behöver [installera Jupyter-paketet](https://pypi.org/project/jupyter/). + +## Din ML-utvecklingsmiljö + +Du kommer att använda **notebooks** för att utveckla din Python-kod och skapa maskininlärningsmodeller. Denna typ av fil är ett vanligt verktyg för dataforskare och kan identifieras genom deras suffix eller filändelse `.ipynb`. + +Notebooks är en interaktiv miljö som gör det möjligt för utvecklaren att både koda och lägga till anteckningar samt skriva dokumentation kring koden, vilket är mycket användbart för experimentella eller forskningsorienterade projekt. + +[![ML för nybörjare - Ställ in Jupyter Notebooks för att börja bygga regressionsmodeller](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML för nybörjare - Ställ in Jupyter Notebooks för att börja bygga regressionsmodeller") + +> 🎥 Klicka på bilden ovan för en kort video som går igenom denna övning. + +### Övning - arbeta med en notebook + +I den här mappen hittar du filen _notebook.ipynb_. + +1. Öppna _notebook.ipynb_ i Visual Studio Code. + + En Jupyter-server kommer att starta med Python 3+. Du kommer att hitta områden i notebooken som kan `köras`, kodstycken. Du kan köra en kodblock genom att välja ikonen som ser ut som en play-knapp. + +2. Välj `md`-ikonen och lägg till lite markdown, och följande text **# Välkommen till din notebook**. + + Lägg sedan till lite Python-kod. + +3. Skriv **print('hello notebook')** i kodblocket. +4. Välj pilen för att köra koden. + + Du bör se det utskrivna meddelandet: + + ```output + hello notebook + ``` + +![VS Code med en notebook öppen](../../../../2-Regression/1-Tools/images/notebook.jpg) + +Du kan blanda din kod med kommentarer för att själv dokumentera notebooken. + +✅ Fundera en stund på hur annorlunda en webbutvecklares arbetsmiljö är jämfört med en dataforskares. + +## Kom igång med Scikit-learn + +Nu när Python är inställt i din lokala miljö och du är bekväm med Jupyter-notebooks, låt oss bli lika bekväma med Scikit-learn (uttalas `sci` som i `science`). Scikit-learn erbjuder ett [omfattande API](https://scikit-learn.org/stable/modules/classes.html#api-ref) för att hjälpa dig utföra ML-uppgifter. + +Enligt deras [webbplats](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn är ett open source-maskininlärningsbibliotek som stödjer övervakad och oövervakad inlärning. Det erbjuder också olika verktyg för modellanpassning, datapreprocessering, modellval och utvärdering, samt många andra verktyg." + +I den här kursen kommer du att använda Scikit-learn och andra verktyg för att bygga maskininlärningsmodeller för att utföra det vi kallar 'traditionella maskininlärningsuppgifter'. Vi har medvetet undvikit neurala nätverk och djupinlärning, eftersom de täcks bättre i vår kommande 'AI för nybörjare'-kursplan. + +Scikit-learn gör det enkelt att bygga modeller och utvärdera dem för användning. Det är främst fokuserat på att använda numerisk data och innehåller flera färdiga dataset för användning som inlärningsverktyg. Det inkluderar också förbyggda modeller för studenter att prova. Låt oss utforska processen att ladda förpackad data och använda en inbyggd estimator för att skapa den första ML-modellen med Scikit-learn med lite grundläggande data. + +## Övning - din första Scikit-learn notebook + +> Den här handledningen inspirerades av [exemplet på linjär regression](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) på Scikit-learns webbplats. + +[![ML för nybörjare - Ditt första linjära regressionsprojekt i Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML för nybörjare - Ditt första linjära regressionsprojekt i Python") + +> 🎥 Klicka på bilden ovan för en kort video som går igenom denna övning. + +I filen _notebook.ipynb_ som är kopplad till denna lektion, rensa alla celler genom att trycka på 'papperskorgsikonen'. + +I detta avsnitt kommer du att arbeta med ett litet dataset om diabetes som är inbyggt i Scikit-learn för inlärningsändamål. Föreställ dig att du ville testa en behandling för diabetiker. Maskininlärningsmodeller kan hjälpa dig att avgöra vilka patienter som skulle svara bättre på behandlingen, baserat på kombinationer av variabler. Även en mycket grundläggande regressionsmodell, när den visualiseras, kan visa information om variabler som skulle hjälpa dig att organisera dina teoretiska kliniska prövningar. + +✅ Det finns många typer av regressionsmetoder, och vilken du väljer beror på svaret du söker. Om du vill förutsäga den sannolika längden för en person i en viss ålder skulle du använda linjär regression, eftersom du söker ett **numeriskt värde**. Om du är intresserad av att avgöra om en typ av mat ska betraktas som vegansk eller inte, söker du en **kategoriindelning**, så du skulle använda logistisk regression. Du kommer att lära dig mer om logistisk regression senare. Fundera lite på några frågor du kan ställa till data och vilken av dessa metoder som skulle vara mer lämplig. + +Låt oss komma igång med denna uppgift. + +### Importera bibliotek + +För denna uppgift kommer vi att importera några bibliotek: + +- **matplotlib**. Det är ett användbart [grafverktyg](https://matplotlib.org/) och vi kommer att använda det för att skapa ett linjediagram. +- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) är ett användbart bibliotek för att hantera numerisk data i Python. +- **sklearn**. Detta är [Scikit-learn](https://scikit-learn.org/stable/user_guide.html)-biblioteket. + +Importera några bibliotek för att hjälpa till med dina uppgifter. + +1. Lägg till imports genom att skriva följande kod: + + ```python + import matplotlib.pyplot as plt + import numpy as np + from sklearn import datasets, linear_model, model_selection + ``` + + Ovan importerar du `matplotlib`, `numpy` och du importerar `datasets`, `linear_model` och `model_selection` från `sklearn`. `model_selection` används för att dela upp data i tränings- och testuppsättningar. + +### Diabetes-datasetet + +Det inbyggda [diabetes-datasetet](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) innehåller 442 dataprover om diabetes, med 10 funktionsvariabler, några av dessa inkluderar: + +- age: ålder i år +- bmi: kroppsmassaindex +- bp: genomsnittligt blodtryck +- s1 tc: T-celler (en typ av vita blodkroppar) + +✅ Detta dataset inkluderar konceptet 'kön' som en funktionsvariabel som är viktig för forskning kring diabetes. Många medicinska dataset inkluderar denna typ av binär klassificering. Fundera lite på hur kategoriseringar som denna kan utesluta vissa delar av befolkningen från behandlingar. + +Nu, ladda upp X- och y-datan. + +> 🎓 Kom ihåg, detta är övervakad inlärning, och vi behöver ett namngivet 'y'-mål. + +I en ny kodcell, ladda diabetes-datasetet genom att kalla `load_diabetes()`. Inputen `return_X_y=True` signalerar att `X` kommer att vara en datamatriser, och `y` kommer att vara regressionsmålet. + +1. Lägg till några print-kommandon för att visa formen på datamatriserna och dess första element: + + ```python + X, y = datasets.load_diabetes(return_X_y=True) + print(X.shape) + print(X[0]) + ``` + + Det du får tillbaka som svar är en tuple. Det du gör är att tilldela de två första värdena i tuplen till `X` och `y` respektive. Läs mer [om tuples](https://wikipedia.org/wiki/Tuple). + + Du kan se att denna data har 442 objekt formade i arrayer med 10 element: + + ```text + (442, 10) + [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076 + -0.04340085 -0.00259226 0.01990842 -0.01764613] + ``` + + ✅ Fundera lite på relationen mellan datan och regressionsmålet. Linjär regression förutsäger relationer mellan funktion X och målvariabel y. Kan du hitta [målet](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) för diabetes-datasetet i dokumentationen? Vad demonstrerar detta dataset, givet målet? + +2. Välj sedan en del av detta dataset att plotta genom att välja den tredje kolumnen i datasetet. Du kan göra detta genom att använda `:`-operatorn för att välja alla rader och sedan välja den tredje kolumnen med hjälp av index (2). Du kan också omforma datan till att vara en 2D-array - som krävs för att plotta - genom att använda `reshape(n_rows, n_columns)`. Om en av parametrarna är -1 beräknas motsvarande dimension automatiskt. + + ```python + X = X[:, 2] + X = X.reshape((-1,1)) + ``` + + ✅ När som helst, skriv ut datan för att kontrollera dess form. + +3. Nu när du har data redo att plottas kan du se om en maskin kan hjälpa till att bestämma en logisk uppdelning mellan siffrorna i detta dataset. För att göra detta behöver du dela både datan (X) och målet (y) i test- och träningsuppsättningar. Scikit-learn har ett enkelt sätt att göra detta; du kan dela din testdata vid en given punkt. + + ```python + X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) + ``` + +4. Nu är du redo att träna din modell! Ladda upp den linjära regressionsmodellen och träna den med dina X- och y-träningsuppsättningar med hjälp av `model.fit()`: + + ```python + model = linear_model.LinearRegression() + model.fit(X_train, y_train) + ``` + + ✅ `model.fit()` är en funktion du kommer att se i många ML-bibliotek som TensorFlow. + +5. Skapa sedan en förutsägelse med testdata, med hjälp av funktionen `predict()`. Detta kommer att användas för att dra linjen mellan datagrupperna. + + ```python + y_pred = model.predict(X_test) + ``` + +6. Nu är det dags att visa datan i ett diagram. Matplotlib är ett mycket användbart verktyg för denna uppgift. Skapa ett spridningsdiagram av all X- och y-testdata och använd förutsägelsen för att dra en linje på den mest lämpliga platsen mellan modellens datagrupperingar. + + ```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() + ``` + + ![ett spridningsdiagram som visar datapunkter kring diabetes](../../../../2-Regression/1-Tools/images/scatterplot.png) +✅ Fundera lite på vad som händer här. En rak linje går genom många små datapunkter, men vad gör den egentligen? Kan du se hur du borde kunna använda denna linje för att förutsäga var en ny, osedd datapunkt borde passa in i förhållande till diagrammets y-axel? Försök att formulera den praktiska användningen av denna modell. + +Grattis, du har byggt din första linjära regressionsmodell, skapat en förutsägelse med den och visat den i ett diagram! + +--- +## 🚀Utmaning + +Plotta en annan variabel från denna dataset. Tips: redigera denna rad: `X = X[:,2]`. Givet målet för denna dataset, vad kan du upptäcka om utvecklingen av diabetes som sjukdom? +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +I denna handledning arbetade du med enkel linjär regression, snarare än univariat eller multipel linjär regression. Läs lite om skillnaderna mellan dessa metoder, eller titta på [denna video](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef). + +Läs mer om konceptet regression och fundera på vilka typer av frågor som kan besvaras med denna teknik. Ta denna [handledning](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) för att fördjupa din förståelse. + +## Uppgift + +[Ett annat dataset](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/1-Tools/assignment.md b/translations/sv/2-Regression/1-Tools/assignment.md new file mode 100644 index 000000000..38fc4e28a --- /dev/null +++ b/translations/sv/2-Regression/1-Tools/assignment.md @@ -0,0 +1,27 @@ + +# Regression med Scikit-learn + +## Instruktioner + +Ta en titt på [Linnerud-datasetet](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) i Scikit-learn. Detta dataset har flera [målvariabler](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): 'Det består av tre träningsvariabler (data) och tre fysiologiska variabler (mål) som samlats in från tjugo medelålders män på en träningsklubb'. + +Beskriv med egna ord hur man skapar en regressionsmodell som kan visa sambandet mellan midjemått och hur många situps som utförs. Gör samma sak för de andra datapunkterna i detta dataset. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| ----------------------------- | ----------------------------------- | ----------------------------- | -------------------------- | +| Skicka in en beskrivande text | En välskriven text skickas in | Några meningar skickas in | Ingen beskrivning skickas in | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/1-Tools/solution/Julia/README.md b/translations/sv/2-Regression/1-Tools/solution/Julia/README.md new file mode 100644 index 000000000..e31b4414a --- /dev/null +++ b/translations/sv/2-Regression/1-Tools/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/2-Data/README.md b/translations/sv/2-Regression/2-Data/README.md new file mode 100644 index 000000000..f1dd19efe --- /dev/null +++ b/translations/sv/2-Regression/2-Data/README.md @@ -0,0 +1,226 @@ + +# Bygg en regressionsmodell med Scikit-learn: förbered och visualisera data + +![Infografik för datavisualisering](../../../../2-Regression/2-Data/images/data-visualization.png) + +Infografik av [Dasani Madipalli](https://twitter.com/dasani_decoded) + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Den här lektionen finns tillgänglig i R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) + +## Introduktion + +Nu när du har verktygen du behöver för att börja bygga maskininlärningsmodeller med Scikit-learn, är du redo att börja ställa frågor till din data. När du arbetar med data och tillämpar ML-lösningar är det mycket viktigt att förstå hur man ställer rätt frågor för att verkligen utnyttja potentialen i din dataset. + +I den här lektionen kommer du att lära dig: + +- Hur du förbereder din data för modellbyggande. +- Hur du använder Matplotlib för datavisualisering. + +## Ställa rätt frågor till din data + +Frågan du vill ha svar på avgör vilken typ av ML-algoritmer du kommer att använda. Och kvaliteten på svaret du får tillbaka beror starkt på datans natur. + +Ta en titt på [datan](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) som tillhandahålls för den här lektionen. Du kan öppna denna .csv-fil i VS Code. En snabb överblick visar direkt att det finns tomma fält och en blandning av strängar och numerisk data. Det finns också en märklig kolumn som heter 'Package' där datan är en blandning av 'sacks', 'bins' och andra värden. Datan är faktiskt lite rörig. + +[![ML för nybörjare - Hur man analyserar och rensar en dataset](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML för nybörjare - Hur man analyserar och rensar en dataset") + +> 🎥 Klicka på bilden ovan för en kort video om hur man förbereder datan för den här lektionen. + +Det är faktiskt inte särskilt vanligt att få en dataset som är helt redo att användas för att skapa en ML-modell direkt. I den här lektionen kommer du att lära dig hur man förbereder en rå dataset med hjälp av standardbibliotek i Python. Du kommer också att lära dig olika tekniker för att visualisera data. + +## Fallstudie: 'pumpamarknaden' + +I den här mappen hittar du en .csv-fil i rotmappen `data` som heter [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) som innehåller 1757 rader med data om marknaden för pumpor, sorterade i grupperingar efter stad. Detta är rådata som hämtats från [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) som distribueras av United States Department of Agriculture. + +### Förbereda data + +Denna data är offentlig. Den kan laddas ner i många separata filer, per stad, från USDA:s webbplats. För att undvika för många separata filer har vi sammanfogat all stadsdata till ett kalkylblad, så vi har redan _förberett_ datan lite. Låt oss nu ta en närmare titt på datan. + +### Pumpadatan - tidiga slutsatser + +Vad märker du om denna data? Du såg redan att det finns en blandning av strängar, siffror, tomma fält och märkliga värden som du behöver förstå. + +Vilken fråga kan du ställa till denna data med hjälp av en regressionsmetod? Vad sägs om "Förutsäg priset på en pumpa som säljs under en viss månad". När du tittar på datan igen, finns det några ändringar du behöver göra för att skapa den datastruktur som krävs för uppgiften. + +## Övning - analysera pumpadatan + +Låt oss använda [Pandas](https://pandas.pydata.org/) (namnet står för `Python Data Analysis`), ett verktyg som är mycket användbart för att forma data, för att analysera och förbereda denna pumpadata. + +### Först, kontrollera om det saknas datum + +Du måste först ta steg för att kontrollera om det saknas datum: + +1. Konvertera datumen till ett månadsformat (dessa är amerikanska datum, så formatet är `MM/DD/YYYY`). +2. Extrahera månaden till en ny kolumn. + +Öppna _notebook.ipynb_-filen i Visual Studio Code och importera kalkylbladet till en ny Pandas-dataram. + +1. Använd funktionen `head()` för att visa de första fem raderna. + + ```python + import pandas as pd + pumpkins = pd.read_csv('../data/US-pumpkins.csv') + pumpkins.head() + ``` + + ✅ Vilken funktion skulle du använda för att visa de sista fem raderna? + +1. Kontrollera om det finns saknad data i den aktuella dataramen: + + ```python + pumpkins.isnull().sum() + ``` + + Det finns saknad data, men kanske spelar det ingen roll för den aktuella uppgiften. + +1. För att göra din dataram enklare att arbeta med, välj endast de kolumner du behöver med hjälp av funktionen `loc`, som extraherar en grupp rader (angivna som första parameter) och kolumner (angivna som andra parameter) från den ursprungliga dataramen. Uttrycket `:` i fallet nedan betyder "alla rader". + + ```python + columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] + pumpkins = pumpkins.loc[:, columns_to_select] + ``` + +### För det andra, bestäm genomsnittligt pris på pumpor + +Fundera på hur du kan bestämma det genomsnittliga priset på en pumpa under en viss månad. Vilka kolumner skulle du välja för denna uppgift? Tips: du behöver 3 kolumner. + +Lösning: ta genomsnittet av kolumnerna `Low Price` och `High Price` för att fylla den nya kolumnen Price, och konvertera kolumnen Date till att endast visa månaden. Lyckligtvis, enligt kontrollen ovan, finns det ingen saknad data för datum eller priser. + +1. För att beräkna genomsnittet, lägg till följande kod: + + ```python + price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 + + month = pd.DatetimeIndex(pumpkins['Date']).month + + ``` + + ✅ Känn dig fri att skriva ut vilken data du vill kontrollera med hjälp av `print(month)`. + +2. Kopiera nu din konverterade data till en ny Pandas-dataram: + + ```python + new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) + ``` + + Om du skriver ut din dataram kommer du att se en ren och snygg dataset som du kan använda för att bygga din nya regressionsmodell. + +### Men vänta! Det är något konstigt här + +Om du tittar på kolumnen `Package`, säljs pumpor i många olika konfigurationer. Vissa säljs i mått som '1 1/9 bushel', andra i '1/2 bushel', vissa per pumpa, vissa per pound, och vissa i stora lådor med varierande bredd. + +> Pumpor verkar vara väldigt svåra att väga konsekvent + +När man gräver i den ursprungliga datan är det intressant att allt med `Unit of Sale` som är lika med 'EACH' eller 'PER BIN' också har `Package`-typen per tum, per bin eller 'each'. Pumpor verkar vara väldigt svåra att väga konsekvent, så låt oss filtrera dem genom att välja endast pumpor med strängen 'bushel' i deras `Package`-kolumn. + +1. Lägg till ett filter högst upp i filen, under den initiala .csv-importen: + + ```python + pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] + ``` + + Om du skriver ut datan nu kan du se att du endast får de cirka 415 rader med data som innehåller pumpor per bushel. + +### Men vänta! Det är en sak till att göra + +Märkte du att bushel-mängden varierar per rad? Du behöver normalisera prissättningen så att du visar prissättningen per bushel, så gör lite matematik för att standardisera det. + +1. Lägg till dessa rader efter blocket som skapar dataramen 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) + ``` + +✅ Enligt [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) beror en bushels vikt på typen av produkt, eftersom det är ett volymmått. "En bushel tomater, till exempel, ska väga 56 pounds... Blad och gröna tar upp mer plats med mindre vikt, så en bushel spenat är bara 20 pounds." Det är allt ganska komplicerat! Låt oss inte bry oss om att göra en bushel-till-pound-konvertering, och istället prissätta per bushel. All denna studie av bushels av pumpor visar dock hur viktigt det är att förstå naturen av din data! + +Nu kan du analysera prissättningen per enhet baserat på deras bushel-mått. Om du skriver ut datan en gång till kan du se hur den är standardiserad. + +✅ Märkte du att pumpor som säljs per halv-bushel är väldigt dyra? Kan du lista ut varför? Tips: små pumpor är mycket dyrare än stora, förmodligen eftersom det finns så många fler av dem per bushel, med tanke på det oanvända utrymmet som tas upp av en stor ihålig pajpumpa. + +## Visualiseringsstrategier + +En del av en dataspecialists roll är att demonstrera kvaliteten och naturen av datan de arbetar med. För att göra detta skapar de ofta intressanta visualiseringar, som diagram, grafer och tabeller, som visar olika aspekter av datan. På så sätt kan de visuellt visa relationer och luckor som annars är svåra att upptäcka. + +[![ML för nybörjare - Hur man visualiserar data med Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML för nybörjare - Hur man visualiserar data med Matplotlib") + +> 🎥 Klicka på bilden ovan för en kort video om hur man visualiserar datan för den här lektionen. + +Visualiseringar kan också hjälpa till att avgöra vilken maskininlärningsteknik som är mest lämplig för datan. Ett spridningsdiagram som verkar följa en linje, till exempel, indikerar att datan är en bra kandidat för en linjär regressionsövning. + +Ett datavisualiseringsbibliotek som fungerar bra i Jupyter notebooks är [Matplotlib](https://matplotlib.org/) (som du också såg i den föregående lektionen). + +> Få mer erfarenhet av datavisualisering i [dessa tutorials](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). + +## Övning - experimentera med Matplotlib + +Försök att skapa några grundläggande diagram för att visa den nya dataramen du just skapade. Vad skulle ett grundläggande linjediagram visa? + +1. Importera Matplotlib högst upp i filen, under Pandas-importen: + + ```python + import matplotlib.pyplot as plt + ``` + +1. Kör om hela notebooken för att uppdatera. +1. Lägg till en cell längst ner i notebooken för att plotta datan som en box: + + ```python + price = new_pumpkins.Price + month = new_pumpkins.Month + plt.scatter(price, month) + plt.show() + ``` + + ![Ett spridningsdiagram som visar pris-till-månad-relationen](../../../../2-Regression/2-Data/images/scatterplot.png) + + Är detta ett användbart diagram? Överraskar något dig? + + Det är inte särskilt användbart eftersom allt det gör är att visa din data som en spridning av punkter under en viss månad. + +### Gör det användbart + +För att få diagram att visa användbar data behöver du vanligtvis gruppera datan på något sätt. Låt oss försöka skapa ett diagram där y-axeln visar månaderna och datan demonstrerar fördelningen av data. + +1. Lägg till en cell för att skapa ett grupperat stapeldiagram: + + ```python + new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') + plt.ylabel("Pumpkin Price") + ``` + + ![Ett stapeldiagram som visar pris-till-månad-relationen](../../../../2-Regression/2-Data/images/barchart.png) + + Detta är en mer användbar datavisualisering! Det verkar indikera att det högsta priset för pumpor inträffar i september och oktober. Motsvarar det dina förväntningar? Varför eller varför inte? + +--- + +## 🚀Utmaning + +Utforska de olika typerna av visualiseringar som Matplotlib erbjuder. Vilka typer är mest lämpliga för regressionsproblem? + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Ta en titt på de många sätten att visualisera data. Gör en lista över de olika biblioteken som finns tillgängliga och notera vilka som är bäst för olika typer av uppgifter, till exempel 2D-visualiseringar kontra 3D-visualiseringar. Vad upptäcker du? + +## Uppgift + +[Utforska visualisering](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/2-Data/assignment.md b/translations/sv/2-Regression/2-Data/assignment.md new file mode 100644 index 000000000..b5fca92d1 --- /dev/null +++ b/translations/sv/2-Regression/2-Data/assignment.md @@ -0,0 +1,23 @@ + +# Utforska Visualiseringar + +Det finns flera olika bibliotek som är tillgängliga för datavisualisering. Skapa några visualiseringar med hjälp av Pumpa-datan i denna lektion med matplotlib och seaborn i en exempelanteckningsbok. Vilka bibliotek är enklare att arbeta med? + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver Förbättras | +| --------- | ------------ | ------------ | ------------------- | +| | En anteckningsbok lämnas in med två utforskningar/visualiseringar | En anteckningsbok lämnas in med en utforskning/visualisering | En anteckningsbok lämnas inte in | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/2-Data/solution/Julia/README.md b/translations/sv/2-Regression/2-Data/solution/Julia/README.md new file mode 100644 index 000000000..c496279b7 --- /dev/null +++ b/translations/sv/2-Regression/2-Data/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/3-Linear/README.md b/translations/sv/2-Regression/3-Linear/README.md new file mode 100644 index 000000000..a2b56ff39 --- /dev/null +++ b/translations/sv/2-Regression/3-Linear/README.md @@ -0,0 +1,380 @@ + +# Bygg en regressionsmodell med Scikit-learn: regression på fyra sätt + +![Infografik om linjär vs polynomisk regression](../../../../2-Regression/3-Linear/images/linear-polynomial.png) +> Infografik av [Dasani Madipalli](https://twitter.com/dasani_decoded) +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Den här lektionen finns tillgänglig i R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html) +### Introduktion + +Hittills har du utforskat vad regression är med exempeldata från pumpaprisdatamängden som vi kommer att använda genom hela denna lektion. Du har också visualiserat den med hjälp av Matplotlib. + +Nu är du redo att fördjupa dig i regression för maskininlärning. Medan visualisering hjälper dig att förstå data, ligger den verkliga styrkan i maskininlärning i _att träna modeller_. Modeller tränas på historisk data för att automatiskt fånga datadependenser, och de gör det möjligt att förutsäga resultat för ny data som modellen inte har sett tidigare. + +I denna lektion kommer du att lära dig mer om två typer av regression: _grundläggande linjär regression_ och _polynomisk regression_, tillsammans med lite av matematiken bakom dessa tekniker. Dessa modeller kommer att hjälpa oss att förutsäga pumpapriser baserat på olika indata. + +[![ML för nybörjare - Förstå linjär regression](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "ML för nybörjare - Förstå linjär regression") + +> 🎥 Klicka på bilden ovan för en kort videogenomgång av linjär regression. + +> Genom hela detta läroplan antar vi minimal kunskap om matematik och strävar efter att göra det tillgängligt för studenter från andra områden, så håll utkik efter anteckningar, 🧮 matematiska inslag, diagram och andra lärverktyg för att underlätta förståelsen. + +### Förkunskaper + +Du bör nu vara bekant med strukturen för pumpadatan som vi undersöker. Du hittar den förladdad och förberedd i denna lektions _notebook.ipynb_-fil. I filen visas pumpapriset per skäppa i en ny dataram. Se till att du kan köra dessa notebooks i kärnor i Visual Studio Code. + +### Förberedelse + +Som en påminnelse laddar du denna data för att kunna ställa frågor om den. + +- När är det bästa tillfället att köpa pumpor? +- Vilket pris kan jag förvänta mig för en låda med miniatyrpumpor? +- Ska jag köpa dem i halvskäppakorgar eller i lådor med 1 1/9 skäppa? +Låt oss fortsätta att gräva i denna data. + +I den föregående lektionen skapade du en Pandas-dataram och fyllde den med en del av den ursprungliga datamängden, standardiserade prissättningen per skäppa. Genom att göra det kunde du dock bara samla in cirka 400 datapunkter och endast för höstmånaderna. + +Ta en titt på datan som vi har förladdat i denna lektions medföljande notebook. Datan är förladdad och ett initialt spridningsdiagram är skapat för att visa månatlig data. Kanske kan vi få lite mer detaljer om datans natur genom att rengöra den ytterligare. + +## En linjär regressionslinje + +Som du lärde dig i Lektion 1 är målet med en linjär regressionsövning att kunna rita en linje för att: + +- **Visa variabelrelationer**. Visa relationen mellan variabler +- **Göra förutsägelser**. Göra korrekta förutsägelser om var en ny datapunkt skulle hamna i förhållande till den linjen. + +Det är typiskt för **Least-Squares Regression** att dra denna typ av linje. Termen 'least-squares' betyder att alla datapunkter runt regressionslinjen kvadreras och sedan adderas. Idealiskt sett är den slutliga summan så liten som möjligt, eftersom vi vill ha ett lågt antal fel, eller `least-squares`. + +Vi gör detta eftersom vi vill modellera en linje som har den minsta kumulativa avståndet från alla våra datapunkter. Vi kvadrerar också termerna innan vi adderar dem eftersom vi är intresserade av dess storlek snarare än dess riktning. + +> **🧮 Visa mig matematiken** +> +> Denna linje, kallad _linjen för bästa passform_, kan uttryckas med [en ekvation](https://en.wikipedia.org/wiki/Simple_linear_regression): +> +> ``` +> Y = a + bX +> ``` +> +> `X` är den 'förklarande variabeln'. `Y` är den 'beroende variabeln'. Lutningen på linjen är `b` och `a` är y-interceptet, vilket hänvisar till värdet på `Y` när `X = 0`. +> +>![beräkna lutningen](../../../../2-Regression/3-Linear/images/slope.png) +> +> Först, beräkna lutningen `b`. Infografik av [Jen Looper](https://twitter.com/jenlooper) +> +> Med andra ord, och med hänvisning till vår ursprungliga fråga om pumpadata: "förutsäg priset på en pumpa per skäppa efter månad", skulle `X` hänvisa till priset och `Y` hänvisa till försäljningsmånaden. +> +>![slutför ekvationen](../../../../2-Regression/3-Linear/images/calculation.png) +> +> Beräkna värdet på Y. Om du betalar runt $4, måste det vara april! Infografik av [Jen Looper](https://twitter.com/jenlooper) +> +> Matematiken som beräknar linjen måste visa lutningen på linjen, vilket också beror på interceptet, eller var `Y` är placerad när `X = 0`. +> +> Du kan observera metoden för beräkning av dessa värden på [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) webbplatsen. Besök också [denna Least-squares kalkylator](https://www.mathsisfun.com/data/least-squares-calculator.html) för att se hur värdena påverkar linjen. + +## Korrelation + +Ett annat begrepp att förstå är **korrelationskoefficienten** mellan givna X- och Y-variabler. Med ett spridningsdiagram kan du snabbt visualisera denna koefficient. Ett diagram med datapunkter som är snyggt uppradade har hög korrelation, men ett diagram med datapunkter spridda överallt mellan X och Y har låg korrelation. + +En bra linjär regressionsmodell är en som har en hög (närmare 1 än 0) korrelationskoefficient med hjälp av Least-Squares Regression-metoden med en regressionslinje. + +✅ Kör notebooken som följer med denna lektion och titta på spridningsdiagrammet för månad till pris. Verkar datan som associerar månad till pris för pumpaförsäljning ha hög eller låg korrelation, enligt din visuella tolkning av spridningsdiagrammet? Förändras det om du använder en mer detaljerad mätning istället för `Månad`, t.ex. *dag på året* (dvs. antal dagar sedan årets början)? + +I koden nedan antar vi att vi har rengjort datan och fått en dataram kallad `new_pumpkins`, liknande följande: + +ID | Månad | DagPåÅret | Sort | Stad | Förpackning | Lägsta Pris | Högsta Pris | Pris +---|-------|-----------|------|------|-------------|-------------|-------------|----- +70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 skäppakartonger | 15.0 | 15.0 | 13.636364 +71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 skäppakartonger | 18.0 | 18.0 | 16.363636 +72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 skäppakartonger | 18.0 | 18.0 | 16.363636 +73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 skäppakartonger | 17.0 | 17.0 | 15.454545 +74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 skäppakartonger | 15.0 | 15.0 | 13.636364 + +> Koden för att rengöra datan finns i [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb). Vi har utfört samma rengöringssteg som i föregående lektion och har beräknat kolumnen `DagPåÅret` med hjälp av följande uttryck: + +```python +day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days) +``` + +Nu när du har en förståelse för matematiken bakom linjär regression, låt oss skapa en regressionsmodell för att se om vi kan förutsäga vilken pumpaförpackning som kommer att ha de bästa pumpapriserna. Någon som köper pumpor för en högtidspumpaplats kanske vill ha denna information för att optimera sina inköp av pumpaförpackningar för platsen. + +## Söka efter korrelation + +[![ML för nybörjare - Söka efter korrelation: Nyckeln till linjär regression](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "ML för nybörjare - Söka efter korrelation: Nyckeln till linjär regression") + +> 🎥 Klicka på bilden ovan för en kort videogenomgång av korrelation. + +Från föregående lektion har du förmodligen sett att det genomsnittliga priset för olika månader ser ut så här: + +Genomsnittligt pris per månad + +Detta antyder att det borde finnas någon korrelation, och vi kan försöka träna en linjär regressionsmodell för att förutsäga relationen mellan `Månad` och `Pris`, eller mellan `DagPåÅret` och `Pris`. Här är spridningsdiagrammet som visar den senare relationen: + +Spridningsdiagram av Pris vs. Dag på året + +Låt oss se om det finns en korrelation med hjälp av funktionen `corr`: + +```python +print(new_pumpkins['Month'].corr(new_pumpkins['Price'])) +print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price'])) +``` + +Det verkar som att korrelationen är ganska liten, -0.15 för `Månad` och -0.17 för `DagPåÅret`, men det kan finnas en annan viktig relation. Det verkar som att det finns olika kluster av priser som motsvarar olika pumpasorter. För att bekräfta denna hypotes, låt oss plotta varje pumpakategori med en annan färg. Genom att skicka en `ax`-parameter till spridningsplotfunktionen kan vi plotta alla punkter på samma diagram: + +```python +ax=None +colors = ['red','blue','green','yellow'] +for i,var in enumerate(new_pumpkins['Variety'].unique()): + df = new_pumpkins[new_pumpkins['Variety']==var] + ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var) +``` + +Spridningsdiagram av Pris vs. Dag på året + +Vår undersökning antyder att sorten har större effekt på det övergripande priset än det faktiska försäljningsdatumet. Vi kan se detta med ett stapeldiagram: + +```python +new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar') +``` + +Stapeldiagram av pris vs sort + +Låt oss för tillfället fokusera endast på en pumpasort, 'pie type', och se vilken effekt datumet har på priset: + +```python +pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE'] +pie_pumpkins.plot.scatter('DayOfYear','Price') +``` +Spridningsdiagram av Pris vs. Dag på året + +Om vi nu beräknar korrelationen mellan `Pris` och `DagPåÅret` med hjälp av funktionen `corr`, kommer vi att få något som `-0.27` - vilket betyder att det är meningsfullt att träna en prediktiv modell. + +> Innan du tränar en linjär regressionsmodell är det viktigt att se till att vår data är ren. Linjär regression fungerar inte bra med saknade värden, så det är vettigt att ta bort alla tomma celler: + +```python +pie_pumpkins.dropna(inplace=True) +pie_pumpkins.info() +``` + +Ett annat tillvägagångssätt skulle vara att fylla dessa tomma värden med medelvärden från motsvarande kolumn. + +## Enkel linjär regression + +[![ML för nybörjare - Linjär och polynomisk regression med Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "ML för nybörjare - Linjär och polynomisk regression med Scikit-learn") + +> 🎥 Klicka på bilden ovan för en kort videogenomgång av linjär och polynomisk regression. + +För att träna vår linjära regressionsmodell kommer vi att använda biblioteket **Scikit-learn**. + +```python +from sklearn.linear_model import LinearRegression +from sklearn.metrics import mean_squared_error +from sklearn.model_selection import train_test_split +``` + +Vi börjar med att separera indata (funktioner) och det förväntade resultatet (etikett) i separata numpy-arrayer: + +```python +X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1) +y = pie_pumpkins['Price'] +``` + +> Observera att vi var tvungna att utföra `reshape` på indata för att linjär regressionspaketet skulle förstå det korrekt. Linjär regression förväntar sig en 2D-array som indata, där varje rad i arrayen motsvarar en vektor av indatafunktioner. I vårt fall, eftersom vi bara har en indata - behöver vi en array med formen N×1, där N är datamängdens storlek. + +Sedan behöver vi dela upp datan i tränings- och testdatamängder, så att vi kan validera vår modell efter träning: + +```python +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) +``` + +Slutligen tar det bara två rader kod att träna den faktiska linjära regressionsmodellen. Vi definierar `LinearRegression`-objektet och anpassar det till vår data med hjälp av metoden `fit`: + +```python +lin_reg = LinearRegression() +lin_reg.fit(X_train,y_train) +``` + +`LinearRegression`-objektet efter att ha anpassats innehåller alla koefficienter för regressionen, som kan nås med egenskapen `.coef_`. I vårt fall finns det bara en koefficient, som bör vara runt `-0.017`. Det betyder att priser verkar sjunka lite med tiden, men inte mycket, runt 2 cent per dag. Vi kan också nå skärningspunkten för regressionen med Y-axeln med `lin_reg.intercept_` - det kommer att vara runt `21` i vårt fall, vilket indikerar priset i början av året. + +För att se hur exakt vår modell är kan vi förutsäga priser på en testdatamängd och sedan mäta hur nära våra förutsägelser är de förväntade värdena. Detta kan göras med hjälp av metrik för medelkvadratfel (MSE), vilket är medelvärdet av alla kvadrerade skillnader mellan förväntat och förutspått värde. + +```python +pred = lin_reg.predict(X_test) + +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') +``` +Vårt fel verkar ligga runt 2 punkter, vilket är ~17 %. Inte så bra. En annan indikator på modellkvalitet är **determinationskoefficienten**, som kan erhållas så här: + +```python +score = lin_reg.score(X_train,y_train) +print('Model determination: ', score) +``` +Om värdet är 0 betyder det att modellen inte tar hänsyn till indata och fungerar som den *sämsta linjära prediktorn*, vilket helt enkelt är medelvärdet av resultatet. Värdet 1 betyder att vi kan förutsäga alla förväntade utdata perfekt. I vårt fall är koefficienten runt 0,06, vilket är ganska lågt. + +Vi kan också plotta testdata tillsammans med regressionslinjen för att bättre se hur regression fungerar i vårt fall: + +```python +plt.scatter(X_test,y_test) +plt.plot(X_test,pred) +``` + +Linjär regression + +## Polynomregression + +En annan typ av linjär regression är polynomregression. Även om det ibland finns ett linjärt samband mellan variabler - ju större pumpan är i volym, desto högre pris - kan dessa samband ibland inte plottas som ett plan eller en rak linje. + +✅ Här är [några fler exempel](https://online.stat.psu.edu/stat501/lesson/9/9.8) på data som kan använda polynomregression. + +Titta en gång till på sambandet mellan datum och pris. Ser detta spridningsdiagram ut som om det nödvändigtvis borde analyseras med en rak linje? Kan inte priser fluktuera? I detta fall kan du prova polynomregression. + +✅ Polynom är matematiska uttryck som kan bestå av en eller flera variabler och koefficienter. + +Polynomregression skapar en kurvad linje för att bättre passa icke-linjär data. I vårt fall, om vi inkluderar en kvadrerad `DayOfYear`-variabel i indata, bör vi kunna passa vår data med en parabolisk kurva, som kommer att ha ett minimum vid en viss punkt under året. + +Scikit-learn inkluderar ett användbart [pipeline-API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) för att kombinera olika steg i databehandlingen. En **pipeline** är en kedja av **estimators**. I vårt fall kommer vi att skapa en pipeline som först lägger till polynomfunktioner till vår modell och sedan tränar regressionen: + +```python +from sklearn.preprocessing import PolynomialFeatures +from sklearn.pipeline import make_pipeline + +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) + +pipeline.fit(X_train,y_train) +``` + +Att använda `PolynomialFeatures(2)` betyder att vi kommer att inkludera alla andragradspolynom från indata. I vårt fall innebär det bara `DayOfYear`2, men med två indata X och Y kommer detta att lägga till X2, XY och Y2. Vi kan också använda polynom av högre grad om vi vill. + +Pipelines kan användas på samma sätt som det ursprungliga `LinearRegression`-objektet, dvs. vi kan `fit`-a pipelinen och sedan använda `predict` för att få prediktionsresultaten. Här är grafen som visar testdata och approximationskurvan: + +Polynomregression + +Med polynomregression kan vi få något lägre MSE och högre determination, men inte signifikant. Vi behöver ta hänsyn till andra funktioner! + +> Du kan se att de lägsta pumpapriserna observeras någonstans runt Halloween. Hur kan du förklara detta? + +🎃 Grattis, du har just skapat en modell som kan hjälpa till att förutsäga priset på pajpumpor. Du kan förmodligen upprepa samma procedur för alla pumpatyper, men det skulle vara tidskrävande. Låt oss nu lära oss hur man tar pumpasort i beaktande i vår modell! + +## Kategoriska funktioner + +I den ideala världen vill vi kunna förutsäga priser för olika pumpasorter med samma modell. Kolumnen `Variety` är dock något annorlunda än kolumner som `Month`, eftersom den innehåller icke-numeriska värden. Sådana kolumner kallas **kategoriska**. + +[![ML för nybörjare - Kategoriska funktioner med linjär regression](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML för nybörjare - Kategoriska funktioner med linjär regression") + +> 🎥 Klicka på bilden ovan för en kort videoöversikt om att använda kategoriska funktioner. + +Här kan du se hur medelpriset beror på sort: + +Medelpris per sort + +För att ta sort i beaktande måste vi först konvertera den till numerisk form, eller **koda** den. Det finns flera sätt att göra detta: + +* Enkel **numerisk kodning** bygger en tabell över olika sorter och ersätter sedan sortnamnet med ett index i den tabellen. Detta är inte den bästa idén för linjär regression, eftersom linjär regression tar det faktiska numeriska värdet av indexet och lägger till det i resultatet, multiplicerat med någon koefficient. I vårt fall är sambandet mellan indexnummer och pris klart icke-linjärt, även om vi ser till att indexen är ordnade på något specifikt sätt. +* **One-hot-kodning** ersätter kolumnen `Variety` med 4 olika kolumner, en för varje sort. Varje kolumn innehåller `1` om den motsvarande raden är av en given sort och `0` annars. Detta innebär att det kommer att finnas fyra koefficienter i linjär regression, en för varje pumpasort, som ansvarar för "startpris" (eller snarare "tilläggspris") för den specifika sorten. + +Koden nedan visar hur vi kan one-hot-koda en sort: + +```python +pd.get_dummies(new_pumpkins['Variety']) +``` + + ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE +----|-----------|-----------|--------------------------|---------- +70 | 0 | 0 | 0 | 1 +71 | 0 | 0 | 0 | 1 +... | ... | ... | ... | ... +1738 | 0 | 1 | 0 | 0 +1739 | 0 | 1 | 0 | 0 +1740 | 0 | 1 | 0 | 0 +1741 | 0 | 1 | 0 | 0 +1742 | 0 | 1 | 0 | 0 + +För att träna linjär regression med one-hot-kodad sort som indata behöver vi bara initiera `X` och `y`-data korrekt: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) +y = new_pumpkins['Price'] +``` + +Resten av koden är densamma som den vi använde ovan för att träna linjär regression. Om du provar det kommer du att se att medelkvadratfelet är ungefär detsamma, men vi får mycket högre determinationskoefficient (~77 %). För att få ännu mer exakta förutsägelser kan vi ta fler kategoriska funktioner i beaktande, samt numeriska funktioner, såsom `Month` eller `DayOfYear`. För att få en stor array av funktioner kan vi använda `join`: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] +``` + +Här tar vi också hänsyn till `City` och `Package`-typ, vilket ger oss MSE 2,84 (10 %) och determination 0,94! + +## Sätta ihop allt + +För att skapa den bästa modellen kan vi använda kombinerad (one-hot-kodad kategorisk + numerisk) data från exemplet ovan tillsammans med polynomregression. Här är den kompletta koden för din bekvämlighet: + +```python +# set up training data +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] + +# make train-test split +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + +# setup and train the pipeline +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) +pipeline.fit(X_train,y_train) + +# predict results for test data +pred = pipeline.predict(X_test) + +# calculate MSE and determination +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') + +score = pipeline.score(X_train,y_train) +print('Model determination: ', score) +``` + +Detta bör ge oss den bästa determinationskoefficienten på nästan 97 % och MSE=2,23 (~8 % prediktionsfel). + +| Modell | MSE | Determination | +|--------|-----|---------------| +| `DayOfYear` Linjär | 2,77 (17,2 %) | 0,07 | +| `DayOfYear` Polynom | 2,73 (17,0 %) | 0,08 | +| `Variety` Linjär | 5,24 (19,7 %) | 0,77 | +| Alla funktioner Linjär | 2,84 (10,5 %) | 0,94 | +| Alla funktioner Polynom | 2,23 (8,25 %) | 0,97 | + +🏆 Bra jobbat! Du skapade fyra regressionsmodeller i en lektion och förbättrade modellkvaliteten till 97 %. I det sista avsnittet om regression kommer du att lära dig om logistisk regression för att bestämma kategorier. + +--- +## 🚀Utmaning + +Testa flera olika variabler i denna notebook för att se hur korrelationen motsvarar modellens noggrannhet. + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +I denna lektion lärde vi oss om linjär regression. Det finns andra viktiga typer av regression. Läs om Stepwise, Ridge, Lasso och Elasticnet-tekniker. En bra kurs att studera för att lära sig mer är [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning). + +## Uppgift + +[Bygg en modell](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/3-Linear/assignment.md b/translations/sv/2-Regression/3-Linear/assignment.md new file mode 100644 index 000000000..11d3a323a --- /dev/null +++ b/translations/sv/2-Regression/3-Linear/assignment.md @@ -0,0 +1,25 @@ + +# Skapa en regressionsmodell + +## Instruktioner + +I den här lektionen visades du hur man bygger en modell med både linjär och polynomregression. Använd denna kunskap för att hitta en dataset eller använd en av Scikit-learns inbyggda dataset för att skapa en ny modell. Förklara i din notebook varför du valde den teknik du gjorde och demonstrera modellens noggrannhet. Om den inte är noggrann, förklara varför. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ----------------------------------------------------------- | -------------------------- | ------------------------------ | +| | presenterar en komplett notebook med en väl dokumenterad lösning | lösningen är ofullständig | lösningen är bristfällig eller innehåller buggar | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiska översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/3-Linear/solution/Julia/README.md b/translations/sv/2-Regression/3-Linear/solution/Julia/README.md new file mode 100644 index 000000000..bb610ce0e --- /dev/null +++ b/translations/sv/2-Regression/3-Linear/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/4-Logistic/README.md b/translations/sv/2-Regression/4-Logistic/README.md new file mode 100644 index 000000000..92e6e6f69 --- /dev/null +++ b/translations/sv/2-Regression/4-Logistic/README.md @@ -0,0 +1,407 @@ + +# Logistisk regression för att förutsäga kategorier + +![Infografik om logistisk vs. linjär regression](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png) + +## [Quiz före föreläsning](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Denna lektion finns tillgänglig i R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html) + +## Introduktion + +I denna sista lektion om regression, en av de grundläggande _klassiska_ ML-teknikerna, ska vi titta på logistisk regression. Du kan använda denna teknik för att upptäcka mönster och förutsäga binära kategorier. Är detta godis choklad eller inte? Är denna sjukdom smittsam eller inte? Kommer denna kund att välja denna produkt eller inte? + +I denna lektion kommer du att lära dig: + +- Ett nytt bibliotek för datavisualisering +- Tekniker för logistisk regression + +✅ Fördjupa din förståelse för att arbeta med denna typ av regression i detta [Learn-modul](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott) + +## Förkunskaper + +Efter att ha arbetat med pumpadatan är vi nu tillräckligt bekanta med den för att inse att det finns en binär kategori vi kan arbeta med: `Color`. + +Låt oss bygga en modell för logistisk regression för att förutsäga vilken färg en given pumpa sannolikt har (orange 🎃 eller vit 👻), baserat på vissa variabler. + +> Varför pratar vi om binär klassificering i en lektion om regression? Endast av språklig bekvämlighet, eftersom logistisk regression [egentligen är en klassificeringsmetod](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), även om den är linjärbaserad. Lär dig om andra sätt att klassificera data i nästa lektionsgrupp. + +## Definiera frågan + +För våra ändamål kommer vi att uttrycka detta som en binär: 'Vit' eller 'Inte vit'. Det finns också en 'randig' kategori i vår dataset, men det finns få instanser av den, så vi kommer inte att använda den. Den försvinner ändå när vi tar bort nullvärden från datasetet. + +> 🎃 Rolig fakta: vi kallar ibland vita pumpor för 'spökpumpor'. De är inte särskilt lätta att skära, så de är inte lika populära som de orangea, men de ser coola ut! Så vi kan också formulera om vår fråga som: 'Spöke' eller 'Inte spöke'. 👻 + +## Om logistisk regression + +Logistisk regression skiljer sig från linjär regression, som du lärde dig om tidigare, på några viktiga sätt. + +[![ML för nybörjare - Förstå logistisk regression för maskininlärningsklassificering](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "ML för nybörjare - Förstå logistisk regression för maskininlärningsklassificering") + +> 🎥 Klicka på bilden ovan för en kort videoöversikt av logistisk regression. + +### Binär klassificering + +Logistisk regression erbjuder inte samma funktioner som linjär regression. Den förstnämnda ger en förutsägelse om en binär kategori ("vit eller inte vit"), medan den senare kan förutsäga kontinuerliga värden, till exempel givet ursprunget av en pumpa och skördetiden, _hur mycket dess pris kommer att stiga_. + +![Pumpaklassificeringsmodell](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png) +> Infografik av [Dasani Madipalli](https://twitter.com/dasani_decoded) + +### Andra klassificeringar + +Det finns andra typer av logistisk regression, inklusive multinomial och ordinal: + +- **Multinomial**, som innebär att ha mer än en kategori - "Orange, Vit och Randig". +- **Ordinal**, som innebär ordnade kategorier, användbart om vi vill ordna våra resultat logiskt, som våra pumpor som är ordnade efter ett begränsat antal storlekar (mini, sm, med, lg, xl, xxl). + +![Multinomial vs ordinal regression](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png) + +### Variabler BEHÖVER INTE korrelera + +Kommer du ihåg hur linjär regression fungerade bättre med mer korrelerade variabler? Logistisk regression är motsatsen - variablerna behöver inte stämma överens. Det fungerar för denna data som har något svaga korrelationer. + +### Du behöver mycket ren data + +Logistisk regression ger mer exakta resultat om du använder mer data; vårt lilla dataset är inte optimalt för denna uppgift, så ha det i åtanke. + +[![ML för nybörjare - Dataanalys och förberedelse för logistisk regression](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "ML för nybörjare - Dataanalys och förberedelse för logistisk regression") + +> 🎥 Klicka på bilden ovan för en kort videoöversikt av att förbereda data för linjär regression + +✅ Fundera på vilka typer av data som skulle passa bra för logistisk regression + +## Övning - städa datan + +Först, städa datan lite, ta bort nullvärden och välj endast några av kolumnerna: + +1. Lägg till följande kod: + + ```python + + columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] + pumpkins = full_pumpkins.loc[:, columns_to_select] + + pumpkins.dropna(inplace=True) + ``` + + Du kan alltid ta en titt på din nya dataframe: + + ```python + pumpkins.info + ``` + +### Visualisering - kategoriskt diagram + +Vid det här laget har du laddat upp [startnotebooken](../../../../2-Regression/4-Logistic/notebook.ipynb) med pumpadatan igen och städat den för att bevara ett dataset som innehåller några variabler, inklusive `Color`. Låt oss visualisera dataframe i notebooken med ett annat bibliotek: [Seaborn](https://seaborn.pydata.org/index.html), som är byggt på Matplotlib som vi använde tidigare. + +Seaborn erbjuder några smarta sätt att visualisera din data. Till exempel kan du jämföra distributioner av datan för varje `Variety` och `Color` i ett kategoriskt diagram. + +1. Skapa ett sådant diagram genom att använda funktionen `catplot`, med vår pumpadata `pumpkins`, och specificera en färgkartläggning för varje pumpakategori (orange eller vit): + + ```python + import seaborn as sns + + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + + sns.catplot( + data=pumpkins, y="Variety", hue="Color", kind="count", + palette=palette, + ) + ``` + + ![Ett rutnät av visualiserad data](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png) + + Genom att observera datan kan du se hur färgdata relaterar till sort. + + ✅ Givet detta kategoriska diagram, vilka intressanta undersökningar kan du föreställa dig? + +### Datapreparation: kodning av funktioner och etiketter +Vårt pumpadataset innehåller strängvärden för alla dess kolumner. Att arbeta med kategorisk data är intuitivt för människor men inte för maskiner. Maskininlärningsalgoritmer fungerar bra med siffror. Därför är kodning ett mycket viktigt steg i datapreparationsfasen, eftersom det gör det möjligt för oss att omvandla kategorisk data till numerisk data utan att förlora någon information. Bra kodning leder till att bygga en bra modell. + +För kodning av funktioner finns det två huvudtyper av kodare: + +1. Ordinal kodare: passar bra för ordnade variabler, som är kategoriska variabler där deras data följer en logisk ordning, som kolumnen `Item Size` i vårt dataset. Den skapar en kartläggning så att varje kategori representeras av ett nummer, vilket är ordningen på kategorin i kolumnen. + + ```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. Kategorisk kodare: passar bra för nominella variabler, som är kategoriska variabler där deras data inte följer en logisk ordning, som alla funktioner utom `Item Size` i vårt dataset. Det är en one-hot-kodning, vilket innebär att varje kategori representeras av en binär kolumn: den kodade variabeln är lika med 1 om pumpan tillhör den sorten och 0 annars. + + ```python + from sklearn.preprocessing import OneHotEncoder + + categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] + categorical_encoder = OneHotEncoder(sparse_output=False) + ``` +Sedan används `ColumnTransformer` för att kombinera flera kodare i ett enda steg och tillämpa dem på de lämpliga kolumnerna. + +```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) +``` +Å andra sidan, för att koda etiketten, använder vi scikit-learn-klassen `LabelEncoder`, som är en hjälpsklass för att normalisera etiketter så att de endast innehåller värden mellan 0 och n_classes-1 (här, 0 och 1). + +```python + from sklearn.preprocessing import LabelEncoder + + label_encoder = LabelEncoder() + encoded_label = label_encoder.fit_transform(pumpkins['Color']) +``` +När vi har kodat funktionerna och etiketten kan vi slå samman dem till en ny dataframe `encoded_pumpkins`. + +```python + encoded_pumpkins = encoded_features.assign(Color=encoded_label) +``` +✅ Vilka är fördelarna med att använda en ordinal kodare för kolumnen `Item Size`? + +### Analysera relationer mellan variabler + +Nu när vi har förberett vår data kan vi analysera relationerna mellan funktionerna och etiketten för att få en uppfattning om hur väl modellen kommer att kunna förutsäga etiketten baserat på funktionerna. +Det bästa sättet att utföra denna typ av analys är att plotta datan. Vi kommer att använda Seaborns funktion `catplot` igen för att visualisera relationerna mellan `Item Size`, `Variety` och `Color` i ett kategoriskt diagram. För att bättre plotta datan kommer vi att använda den kodade kolumnen `Item Size` och den okodade kolumnen `Variety`. + +```python + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size'] + + g = sns.catplot( + data=pumpkins, + x="Item Size", y="Color", row='Variety', + kind="box", orient="h", + sharex=False, margin_titles=True, + height=1.8, aspect=4, palette=palette, + ) + g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6)) + g.set_titles(row_template="{row_name}") +``` +![Ett kategoriskt diagram av visualiserad data](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png) + +### Använd ett swarm-diagram + +Eftersom Color är en binär kategori (Vit eller Inte), behöver den 'en [specialiserad metod](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) för visualisering'. Det finns andra sätt att visualisera relationen mellan denna kategori och andra variabler. + +Du kan visualisera variabler sida vid sida med Seaborn-diagram. + +1. Prova ett 'swarm'-diagram för att visa distributionen av värden: + + ```python + palette = { + 0: 'orange', + 1: 'wheat' + } + sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette) + ``` + + ![Ett swarm-diagram av visualiserad data](../../../../2-Regression/4-Logistic/images/swarm_2.png) + +**Observera**: koden ovan kan generera en varning, eftersom Seaborn misslyckas med att representera en sådan mängd datapunkter i ett swarm-diagram. En möjlig lösning är att minska storleken på markören genom att använda parametern 'size'. Men var medveten om att detta påverkar läsbarheten av diagrammet. + +> **🧮 Visa mig matematiken** +> +> Logistisk regression bygger på konceptet 'maximum likelihood' med hjälp av [sigmoidfunktioner](https://wikipedia.org/wiki/Sigmoid_function). En 'Sigmoidfunktion' på ett diagram ser ut som en 'S'-form. Den tar ett värde och kartlägger det till någonstans mellan 0 och 1. Dess kurva kallas också för en 'logistisk kurva'. Dess formel ser ut så här: +> +> ![logistisk funktion](../../../../2-Regression/4-Logistic/images/sigmoid.png) +> +> där sigmoids mittpunkt befinner sig vid x:s 0-punkt, L är kurvans maximala värde, och k är kurvans branthet. Om resultatet av funktionen är mer än 0.5, kommer etiketten i fråga att ges klassen '1' av det binära valet. Om inte, kommer den att klassificeras som '0'. + +## Bygg din modell + +Att bygga en modell för att hitta dessa binära klassificeringar är förvånansvärt enkelt i Scikit-learn. + +[![ML för nybörjare - Logistisk regression för klassificering av data](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "ML för nybörjare - Logistisk regression för klassificering av data") + +> 🎥 Klicka på bilden ovan för en kort videoöversikt av att bygga en linjär regressionsmodell + +1. Välj de variabler du vill använda i din klassificeringsmodell och dela upp tränings- och testuppsättningarna genom att kalla på `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. Nu kan du träna din modell genom att kalla på `fit()` med din träningsdata och skriva ut dess resultat: + + ```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)) + ``` + + Ta en titt på din modells poängrapport. Den är inte dålig, med tanke på att du bara har cirka 1000 rader data: + + ```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 + ``` + +## Bättre förståelse via en förvirringsmatris + +Även om du kan få en poängrapport [termer](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) genom att skriva ut ovanstående, kan du kanske förstå din modell lättare genom att använda en [förvirringsmatris](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) för att hjälpa oss att förstå hur modellen presterar. + +> 🎓 En '[förvirringsmatris](https://wikipedia.org/wiki/Confusion_matrix)' (eller 'felmatris') är en tabell som uttrycker din modells verkliga vs. falska positiva och negativa, och därmed mäter noggrannheten i förutsägelserna. + +1. För att använda en förvirringsmatris, kalla på `confusion_matrix()`: + + ```python + from sklearn.metrics import confusion_matrix + confusion_matrix(y_test, predictions) + ``` + + Ta en titt på din modells förvirringsmatris: + + ```output + array([[162, 4], + [ 11, 22]]) + ``` + +I Scikit-learn är rader (axel 0) faktiska etiketter och kolumner (axel 1) förutsagda etiketter. + +| | 0 | 1 | +| :---: | :---: | :---: | +| 0 | TN | FP | +| 1 | FN | TP | + +Vad händer här? Låt oss säga att vår modell ombeds att klassificera pumpor mellan två binära kategorier, kategori 'vit' och kategori 'inte-vit'. + +- Om din modell förutspår en pumpa som inte vit och den tillhör kategorin 'inte-vit' i verkligheten kallar vi det en sann negativ, visat av det övre vänstra numret. +- Om din modell förutspår en pumpa som vit och den tillhör kategorin 'inte-vit' i verkligheten kallar vi det en falsk negativ, visat av det nedre vänstra numret. +- Om din modell förutspår en pumpa som inte vit och den tillhör kategorin 'vit' i verkligheten kallar vi det en falsk positiv, visat av det övre högra numret. +- Om din modell förutspår en pumpa som vit och den tillhör kategorin 'vit' i verkligheten kallar vi det en sann positiv, visat av det nedre högra numret. + +Som du kanske har gissat är det att föredra att ha ett större antal sanna positiva och sanna negativa och ett lägre antal falska positiva och falska negativa, vilket innebär att modellen presterar bättre. +Hur relaterar förvirringsmatrisen till precision och återkallning? Kom ihåg att klassificeringsrapporten som skrivits ut ovan visade precision (0,85) och återkallning (0,67). + +Precision = tp / (tp + fp) = 22 / (22 + 4) = 0,8461538461538461 + +Återkallning = tp / (tp + fn) = 22 / (22 + 11) = 0,6666666666666666 + +✅ F: Enligt förvirringsmatrisen, hur presterade modellen? S: Inte dåligt; det finns ett bra antal sanna negativa men också några falska negativa. + +Låt oss återbesöka de termer vi såg tidigare med hjälp av förvirringsmatrisens kartläggning av TP/TN och FP/FN: + +🎓 Precision: TP/(TP + FP) Andelen relevanta instanser bland de hämtade instanserna (t.ex. vilka etiketter som var korrekt märkta) + +🎓 Återkallning: TP/(TP + FN) Andelen relevanta instanser som hämtades, oavsett om de var korrekt märkta eller inte + +🎓 f1-score: (2 * precision * återkallning)/(precision + återkallning) Ett viktat genomsnitt av precision och återkallning, där bästa är 1 och sämsta är 0 + +🎓 Support: Antalet förekomster av varje etikett som hämtats + +🎓 Noggrannhet: (TP + TN)/(TP + TN + FP + FN) Procentandelen etiketter som förutsades korrekt för ett urval. + +🎓 Makro-genomsnitt: Beräkningen av de oviktade genomsnittliga måtten för varje etikett, utan att ta hänsyn till obalans mellan etiketter. + +🎓 Viktat genomsnitt: Beräkningen av de genomsnittliga måtten för varje etikett, med hänsyn till obalans mellan etiketter genom att väga dem efter deras support (antalet sanna instanser för varje etikett). + +✅ Kan du tänka dig vilken metrisk du bör fokusera på om du vill att din modell ska minska antalet falska negativa? + +## Visualisera ROC-kurvan för denna modell + +[![ML för nybörjare - Analysera logistisk regressionsprestanda med ROC-kurvor](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML för nybörjare - Analysera logistisk regressionsprestanda med ROC-kurvor") + +> 🎥 Klicka på bilden ovan för en kort videogenomgång av ROC-kurvor + +Låt oss göra en visualisering till för att se den så kallade 'ROC'-kurvan: + +```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() +``` + +Använd Matplotlib för att plotta modellens [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) eller ROC. ROC-kurvor används ofta för att få en överblick över en klassificerares resultat i termer av dess sanna respektive falska positiva. "ROC-kurvor har vanligtvis den sanna positiva frekvensen på Y-axeln och den falska positiva frekvensen på X-axeln." Därför spelar kurvans branthet och utrymmet mellan mittlinjen och kurvan roll: du vill ha en kurva som snabbt går upp och över linjen. I vårt fall finns det falska positiva i början, och sedan går linjen upp och över korrekt: + +![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png) + +Använd slutligen Scikit-learns [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) för att beräkna det faktiska 'Area Under the Curve' (AUC): + +```python +auc = roc_auc_score(y_test,y_scores[:,1]) +print(auc) +``` +Resultatet är `0.9749908725812341`. Eftersom AUC sträcker sig från 0 till 1 vill du ha ett högt värde, eftersom en modell som är 100 % korrekt i sina förutsägelser kommer att ha en AUC på 1; i detta fall är modellen _ganska bra_. + +I framtida lektioner om klassificeringar kommer du att lära dig hur du itererar för att förbättra modellens resultat. Men för nu, grattis! Du har avslutat dessa regressionslektioner! + +--- +## 🚀Utmaning + +Det finns mycket mer att utforska kring logistisk regression! Men det bästa sättet att lära sig är att experimentera. Hitta en dataset som lämpar sig för denna typ av analys och bygg en modell med den. Vad lär du dig? tips: prova [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) för intressanta dataset. + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Läs de första sidorna av [denna artikel från Stanford](https://web.stanford.edu/~jurafsky/slp3/5.pdf) om några praktiska användningar för logistisk regression. Fundera på uppgifter som är bättre lämpade för den ena eller andra typen av regressionsuppgifter som vi har studerat hittills. Vad skulle fungera bäst? + +## Uppgift + +[Försök denna regression igen](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/4-Logistic/assignment.md b/translations/sv/2-Regression/4-Logistic/assignment.md new file mode 100644 index 000000000..3bb13732e --- /dev/null +++ b/translations/sv/2-Regression/4-Logistic/assignment.md @@ -0,0 +1,25 @@ + +# Försöker med lite Regression + +## Instruktioner + +I lektionen använde du en delmängd av pumpadatan. Gå nu tillbaka till den ursprungliga datan och försök använda hela, rengjord och standardiserad, för att bygga en logistisk regressionsmodell. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ------------------------------------------------------------------------ | ------------------------------------------------------------- | ----------------------------------------------------------- | +| | En notebook presenteras med en välförklarad och välpresterande modell | En notebook presenteras med en modell som presterar minimalt | En notebook presenteras med en underpresterande modell eller ingen | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/4-Logistic/solution/Julia/README.md b/translations/sv/2-Regression/4-Logistic/solution/Julia/README.md new file mode 100644 index 000000000..0bf2c9a6f --- /dev/null +++ b/translations/sv/2-Regression/4-Logistic/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/2-Regression/README.md b/translations/sv/2-Regression/README.md new file mode 100644 index 000000000..e0feeaeda --- /dev/null +++ b/translations/sv/2-Regression/README.md @@ -0,0 +1,54 @@ + +# Regressionsmodeller för maskininlärning +## Regionalt ämne: Regressionsmodeller för pumpapriser i Nordamerika 🎃 + +I Nordamerika skärs pumpor ofta ut till skrämmande ansikten inför Halloween. Låt oss upptäcka mer om dessa fascinerande grönsaker! + +![jack-o-lanterns](../../../2-Regression/images/jack-o-lanterns.jpg) +> Foto av Beth TeutschmannUnsplash + +## Vad du kommer att lära dig + +[![Introduktion till regression](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "Introduktionsvideo om regression - Klicka för att titta!") +> 🎥 Klicka på bilden ovan för en snabb introduktionsvideo till denna lektion + +Lektionerna i detta avsnitt täcker olika typer av regression inom maskininlärning. Regressionsmodeller kan hjälpa till att fastställa _relationen_ mellan variabler. Denna typ av modell kan förutsäga värden som längd, temperatur eller ålder och därmed avslöja samband mellan variabler när den analyserar datapunkter. + +I denna serie av lektioner kommer du att upptäcka skillnaderna mellan linjär och logistisk regression, och när du bör föredra den ena framför den andra. + +[![ML för nybörjare - Introduktion till regressionsmodeller för maskininlärning](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "ML för nybörjare - Introduktion till regressionsmodeller för maskininlärning") + +> 🎥 Klicka på bilden ovan för en kort video som introducerar regressionsmodeller. + +I denna grupp av lektioner kommer du att förbereda dig för att börja med maskininlärningsuppgifter, inklusive att konfigurera Visual Studio Code för att hantera notebooks, den vanliga miljön för dataforskare. Du kommer att upptäcka Scikit-learn, ett bibliotek för maskininlärning, och du kommer att bygga dina första modeller, med fokus på regressionsmodeller i detta kapitel. + +> Det finns användbara verktyg med låg kod som kan hjälpa dig att lära dig att arbeta med regressionsmodeller. Prova [Azure ML för denna uppgift](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +### Lektioner + +1. [Verktyg för arbetet](1-Tools/README.md) +2. [Hantering av data](2-Data/README.md) +3. [Linjär och polynomisk regression](3-Linear/README.md) +4. [Logistisk regression](4-Logistic/README.md) + +--- +### Krediter + +"ML med regression" skrevs med ♥️ av [Jen Looper](https://twitter.com/jenlooper) + +♥️ Bidrag till quiz inkluderar: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) och [Ornella Altunyan](https://twitter.com/ornelladotcom) + +Pumpadatasetet föreslås av [detta projekt på Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices) och dess data kommer från [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) som distribueras av United States Department of Agriculture. Vi har lagt till några punkter kring färg baserat på sort för att normalisera distributionen. Denna data är i public domain. + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/3-Web-App/1-Web-App/README.md b/translations/sv/3-Web-App/1-Web-App/README.md new file mode 100644 index 000000000..cf874c746 --- /dev/null +++ b/translations/sv/3-Web-App/1-Web-App/README.md @@ -0,0 +1,359 @@ + +# Bygg en webbapp för att använda en ML-modell + +I denna lektion kommer du att träna en ML-modell på en dataset som är utomjordisk: _UFO-observationer under det senaste århundradet_, hämtad från NUFORC:s databas. + +Du kommer att lära dig: + +- Hur man 'picklar' en tränad modell +- Hur man använder den modellen i en Flask-app + +Vi kommer att fortsätta använda notebooks för att rensa data och träna vår modell, men du kan ta processen ett steg längre genom att utforska hur man använder en modell "i det vilda", så att säga: i en webbapp. + +För att göra detta behöver du bygga en webbapp med Flask. + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Bygga en app + +Det finns flera sätt att bygga webbappar för att använda maskininlärningsmodeller. Din webbarkitektur kan påverka hur din modell tränas. Föreställ dig att du arbetar i ett företag där dataanalysgruppen har tränat en modell som de vill att du ska använda i en app. + +### Överväganden + +Det finns många frågor du behöver ställa: + +- **Är det en webbapp eller en mobilapp?** Om du bygger en mobilapp eller behöver använda modellen i ett IoT-sammanhang kan du använda [TensorFlow Lite](https://www.tensorflow.org/lite/) och använda modellen i en Android- eller iOS-app. +- **Var kommer modellen att finnas?** I molnet eller lokalt? +- **Offline-stöd.** Måste appen fungera offline? +- **Vilken teknik användes för att träna modellen?** Den valda tekniken kan påverka vilka verktyg du behöver använda. + - **Använda TensorFlow.** Om du tränar en modell med TensorFlow, till exempel, erbjuder det ekosystemet möjligheten att konvertera en TensorFlow-modell för användning i en webbapp med [TensorFlow.js](https://www.tensorflow.org/js/). + - **Använda PyTorch.** Om du bygger en modell med ett bibliotek som [PyTorch](https://pytorch.org/) har du möjlighet att exportera den i [ONNX](https://onnx.ai/) (Open Neural Network Exchange)-format för användning i JavaScript-webbappar som kan använda [Onnx Runtime](https://www.onnxruntime.ai/). Detta alternativ kommer att utforskas i en framtida lektion för en Scikit-learn-tränad modell. + - **Använda Lobe.ai eller Azure Custom Vision.** Om du använder ett ML SaaS-system (Software as a Service) som [Lobe.ai](https://lobe.ai/) eller [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) för att träna en modell, erbjuder denna typ av mjukvara sätt att exportera modellen för många plattformar, inklusive att bygga ett skräddarsytt API som kan frågas i molnet av din onlineapplikation. + +Du har också möjlighet att bygga en hel Flask-webbapp som kan träna modellen direkt i en webbläsare. Detta kan också göras med TensorFlow.js i en JavaScript-kontext. + +För våra ändamål, eftersom vi har arbetat med Python-baserade notebooks, låt oss utforska stegen du behöver ta för att exportera en tränad modell från en sådan notebook till ett format som kan läsas av en Python-byggd webbapp. + +## Verktyg + +För denna uppgift behöver du två verktyg: Flask och Pickle, båda körs på Python. + +✅ Vad är [Flask](https://palletsprojects.com/p/flask/)? Flask definieras som ett 'mikroramverk' av sina skapare och erbjuder de grundläggande funktionerna för webbramverk med Python och en mallmotor för att bygga webbsidor. Ta en titt på [denna Learn-modul](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) för att öva på att bygga med Flask. + +✅ Vad är [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 är en Python-modul som serialiserar och deserialiserar en Python-objektstruktur. När du 'picklar' en modell serialiserar eller plattar du ut dess struktur för användning på webben. Var försiktig: pickle är inte intrinsiskt säker, så var försiktig om du blir ombedd att 'un-pickla' en fil. En picklad fil har suffixet `.pkl`. + +## Övning - rensa din data + +I denna lektion kommer du att använda data från 80 000 UFO-observationer, insamlade av [NUFORC](https://nuforc.org) (The National UFO Reporting Center). Denna data har några intressanta beskrivningar av UFO-observationer, till exempel: + +- **Lång exempelbeskrivning.** "En man kommer ut från en ljusstråle som lyser på en gräsbevuxen fält på natten och han springer mot Texas Instruments parkeringsplats". +- **Kort exempelbeskrivning.** "ljusen jagade oss". + +Kalkylbladet [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) innehåller kolumner om `city`, `state` och `country` där observationen inträffade, objektets `shape` samt dess `latitude` och `longitude`. + +I den tomma [notebook](../../../../3-Web-App/1-Web-App/notebook.ipynb) som ingår i denna lektion: + +1. importera `pandas`, `matplotlib` och `numpy` som du gjorde i tidigare lektioner och importera UFO-kalkylbladet. Du kan ta en titt på ett exempeldata: + + ```python + import pandas as pd + import numpy as np + + ufos = pd.read_csv('./data/ufos.csv') + ufos.head() + ``` + +1. Konvertera UFO-datan till en liten dataframe med nya titlar. Kontrollera de unika värdena i fältet `Country`. + + ```python + ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) + + ufos.Country.unique() + ``` + +1. Nu kan du minska mängden data vi behöver hantera genom att ta bort eventuella null-värden och endast importera observationer mellan 1-60 sekunder: + + ```python + ufos.dropna(inplace=True) + + ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] + + ufos.info() + ``` + +1. Importera Scikit-learns `LabelEncoder`-bibliotek för att konvertera textvärden för länder till ett nummer: + + ✅ LabelEncoder kodar data alfabetiskt + + ```python + from sklearn.preprocessing import LabelEncoder + + ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) + + ufos.head() + ``` + + Din data bör se ut så här: + + ```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 + ``` + +## Övning - bygg din modell + +Nu kan du förbereda dig för att träna en modell genom att dela upp datan i tränings- och testgrupper. + +1. Välj de tre funktioner du vill träna på som din X-vektor, och y-vektorn kommer att vara `Country`. Du vill kunna mata in `Seconds`, `Latitude` och `Longitude` och få ett land-id som returneras. + + ```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. Träna din modell med logistisk regression: + + ```python + from sklearn.metrics import accuracy_score, classification_report + from sklearn.linear_model import LogisticRegression + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('Accuracy: ', accuracy_score(y_test, predictions)) + ``` + +Noggrannheten är inte dålig **(runt 95%)**, vilket inte är förvånande, eftersom `Country` och `Latitude/Longitude` korrelerar. + +Modellen du skapade är inte särskilt revolutionerande eftersom du borde kunna dra slutsatsen ett `Country` från dess `Latitude` och `Longitude`, men det är en bra övning att försöka träna från rådata som du rensade, exporterade och sedan använda denna modell i en webbapp. + +## Övning - 'pickla' din modell + +Nu är det dags att _pickla_ din modell! Du kan göra det med några rader kod. När den är _picklad_, ladda din picklade modell och testa den mot en exempeldata-array som innehåller värden för sekunder, latitud och longitud, + +```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]])) +``` + +Modellen returnerar **'3'**, vilket är landskoden för Storbritannien. Galet! 👽 + +## Övning - bygg en Flask-app + +Nu kan du bygga en Flask-app för att kalla din modell och returnera liknande resultat, men på ett mer visuellt tilltalande sätt. + +1. Börja med att skapa en mapp som heter **web-app** bredvid filen _notebook.ipynb_ där din _ufo-model.pkl_-fil finns. + +1. I den mappen skapar du tre ytterligare mappar: **static**, med en mapp **css** inuti, och **templates**. Du bör nu ha följande filer och kataloger: + + ```output + web-app/ + static/ + css/ + templates/ + notebook.ipynb + ufo-model.pkl + ``` + + ✅ Se lösningsmappen för en vy av den färdiga appen + +1. Den första filen att skapa i _web-app_-mappen är **requirements.txt**-filen. Precis som _package.json_ i en JavaScript-app listar denna fil beroenden som krävs av appen. I **requirements.txt** lägger du till raderna: + + ```text + scikit-learn + pandas + numpy + flask + ``` + +1. Kör nu denna fil genom att navigera till _web-app_: + + ```bash + cd web-app + ``` + +1. I din terminal skriver du `pip install` för att installera biblioteken som listas i _requirements.txt_: + + ```bash + pip install -r requirements.txt + ``` + +1. Nu är du redo att skapa tre ytterligare filer för att slutföra appen: + + 1. Skapa **app.py** i roten. + 2. Skapa **index.html** i _templates_-katalogen. + 3. Skapa **styles.css** i _static/css_-katalogen. + +1. Bygg ut _styles.css_-filen med några stilar: + + ```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. Nästa steg är att bygga ut _index.html_-filen: + + ```html + + + + + 🛸 UFO Appearance Prediction! 👽 + + + + +
            + +
            + +

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

            + +
            + + + + +
            + +

            {{ prediction_text }}

            + +
            + +
            + + + + ``` + + Titta på mallningen i denna fil. Notera 'mustache'-syntaxen runt variabler som kommer att tillhandahållas av appen, som prediktionstexten: `{{}}`. Det finns också ett formulär som skickar en prediktion till `/predict`-routen. + + Slutligen är du redo att bygga Python-filen som driver konsumtionen av modellen och visningen av prediktioner: + +1. I `app.py` lägger du till: + + ```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) + ``` + + > 💡 Tips: när du lägger till [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) medan du kör webbappen med Flask, kommer alla ändringar du gör i din applikation att återspeglas omedelbart utan att du behöver starta om servern. Var försiktig! Aktivera inte detta läge i en produktionsapp. + +Om du kör `python app.py` eller `python3 app.py` - startar din webbserver lokalt, och du kan fylla i ett kort formulär för att få svar på din brinnande fråga om var UFO:n har observerats! + +Innan du gör det, ta en titt på delarna av `app.py`: + +1. Först laddas beroenden och appen startar. +1. Sedan importeras modellen. +1. Därefter renderas index.html på hemrouten. + +På `/predict`-routen händer flera saker när formuläret skickas: + +1. Formulärvariablerna samlas in och konverteras till en numpy-array. De skickas sedan till modellen och en prediktion returneras. +2. Länderna som vi vill visa renderas om som läsbar text från deras förutsagda landskod, och det värdet skickas tillbaka till index.html för att renderas i mallen. + +Att använda en modell på detta sätt, med Flask och en picklad modell, är relativt enkelt. Det svåraste är att förstå vilken form datan måste ha som skickas till modellen för att få en prediktion. Det beror helt på hur modellen tränades. Denna har tre datapunkter som måste matas in för att få en prediktion. + +I en professionell miljö kan du se hur viktig kommunikation är mellan de som tränar modellen och de som använder den i en webb- eller mobilapp. I vårt fall är det bara en person, du! + +--- + +## 🚀 Utmaning + +Istället för att arbeta i en notebook och importera modellen till Flask-appen, kan du träna modellen direkt i Flask-appen! Försök att konvertera din Python-kod i notebooken, kanske efter att din data har rensats, för att träna modellen direkt i appen på en route som heter `train`. Vilka är för- och nackdelarna med att använda denna metod? + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Det finns många sätt att bygga en webbapp för att använda ML-modeller. Gör en lista över sätt du kan använda JavaScript eller Python för att bygga en webbapp som utnyttjar maskininlärning. Tänk på arkitektur: bör modellen stanna i appen eller finnas i molnet? Om det senare, hur skulle du komma åt den? Rita en arkitekturmodell för en tillämpad ML-webblösning. + +## Uppgift + +[Prova en annan modell](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/3-Web-App/1-Web-App/assignment.md b/translations/sv/3-Web-App/1-Web-App/assignment.md new file mode 100644 index 000000000..93cbdaf33 --- /dev/null +++ b/translations/sv/3-Web-App/1-Web-App/assignment.md @@ -0,0 +1,25 @@ + +# Prova en annan modell + +## Instruktioner + +Nu när du har byggt en webbapp med en tränad regressionsmodell, använd en av modellerna från en tidigare lektion om regression för att göra om denna webbapp. Du kan behålla stilen eller designa den annorlunda för att passa pumpadatan. Var noga med att ändra inmatningarna så att de stämmer överens med din modells träningsmetod. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| -------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------- | +| | Webbappen fungerar som förväntat och är distribuerad i molnet | Webbappen innehåller brister eller ger oväntade resultat | Webbappen fungerar inte korrekt | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/3-Web-App/README.md b/translations/sv/3-Web-App/README.md new file mode 100644 index 000000000..a74d732cb --- /dev/null +++ b/translations/sv/3-Web-App/README.md @@ -0,0 +1,35 @@ + +# Bygg en webbapp för att använda din ML-modell + +I den här delen av kursen kommer du att introduceras till ett tillämpat ML-ämne: hur du sparar din Scikit-learn-modell som en fil som kan användas för att göra förutsägelser i en webbapplikation. När modellen är sparad kommer du att lära dig hur du använder den i en webbapp byggd med Flask. Du kommer först att skapa en modell med hjälp av data som handlar om UFO-observationer! Därefter bygger du en webbapp som låter dig mata in ett antal sekunder tillsammans med en latitud- och longitudvärde för att förutsäga vilket land som rapporterade att de såg ett UFO. + +![UFO Parkering](../../../3-Web-App/images/ufo.jpg) + +Foto av Michael HerrenUnsplash + +## Lektioner + +1. [Bygg en webbapp](1-Web-App/README.md) + +## Krediter + +"Bygg en webbapp" skrevs med ♥️ av [Jen Looper](https://twitter.com/jenlooper). + +♥️ Quizen skrevs av Rohan Raj. + +Datasettet kommer från [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings). + +Webbappens arkitektur föreslogs delvis av [denna artikel](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) och [detta repo](https://github.com/abhinavsagar/machine-learning-deployment) av Abhinav Sagar. + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/1-Introduction/README.md b/translations/sv/4-Classification/1-Introduction/README.md new file mode 100644 index 000000000..892a84a38 --- /dev/null +++ b/translations/sv/4-Classification/1-Introduction/README.md @@ -0,0 +1,313 @@ + +# Introduktion till klassificering + +I dessa fyra lektioner kommer du att utforska ett grundläggande fokus inom klassisk maskininlärning - _klassificering_. Vi kommer att gå igenom användningen av olika klassificeringsalgoritmer med en dataset om alla fantastiska kök från Asien och Indien. Hoppas du är hungrig! + +![bara en nypa!](../../../../4-Classification/1-Introduction/images/pinch.png) + +> Fira pan-asiatiska kök i dessa lektioner! Bild av [Jen Looper](https://twitter.com/jenlooper) + +Klassificering är en form av [övervakad inlärning](https://wikipedia.org/wiki/Supervised_learning) som har mycket gemensamt med regressionstekniker. Om maskininlärning handlar om att förutsäga värden eller namn på saker med hjälp av dataset, så faller klassificering generellt sett in i två grupper: _binär klassificering_ och _multiklassklassificering_. + +[![Introduktion till klassificering](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Introduktion till klassificering") + +> 🎥 Klicka på bilden ovan för en video: MIT:s John Guttag introducerar klassificering + +Kom ihåg: + +- **Linjär regression** hjälpte dig att förutsäga relationer mellan variabler och göra exakta förutsägelser om var en ny datapunkt skulle hamna i förhållande till den linjen. Så, du kunde förutsäga _vad priset på en pumpa skulle vara i september jämfört med december_, till exempel. +- **Logistisk regression** hjälpte dig att upptäcka "binära kategorier": vid denna prisnivå, _är denna pumpa orange eller inte-orange_? + +Klassificering använder olika algoritmer för att bestämma andra sätt att avgöra en datapunkts etikett eller klass. Låt oss arbeta med denna dataset om kök för att se om vi, genom att observera en grupp ingredienser, kan avgöra dess ursprungskök. + +## [Quiz före lektionen](https://ff-quizzes.netlify.app/en/ml/) + +> ### [Denna lektion finns tillgänglig i R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html) + +### Introduktion + +Klassificering är en av de grundläggande aktiviteterna för forskare inom maskininlärning och dataanalytiker. Från grundläggande klassificering av ett binärt värde ("är detta e-postmeddelande skräppost eller inte?") till komplex bildklassificering och segmentering med hjälp av datorseende, är det alltid användbart att kunna sortera data i klasser och ställa frågor om den. + +För att uttrycka processen på ett mer vetenskapligt sätt skapar din klassificeringsmetod en prediktiv modell som gör det möjligt att kartlägga relationen mellan indata och utdata. + +![binär vs. multiklassklassificering](../../../../4-Classification/1-Introduction/images/binary-multiclass.png) + +> Binära vs. multiklassproblem för klassificeringsalgoritmer att hantera. Infografik av [Jen Looper](https://twitter.com/jenlooper) + +Innan vi börjar processen med att rensa vår data, visualisera den och förbereda den för våra ML-uppgifter, låt oss lära oss lite om de olika sätten maskininlärning kan användas för att klassificera data. + +Härledd från [statistik](https://wikipedia.org/wiki/Statistical_classification), klassificering med klassisk maskininlärning använder egenskaper, såsom `smoker`, `weight` och `age` för att avgöra _sannolikheten att utveckla X sjukdom_. Som en övervakad inlärningsteknik liknande de regressionövningar du utförde tidigare, är din data märkt och ML-algoritmerna använder dessa etiketter för att klassificera och förutsäga klasser (eller 'egenskaper') i en dataset och tilldela dem till en grupp eller ett resultat. + +✅ Ta en stund och föreställ dig en dataset om kök. Vad skulle en multiklassmodell kunna svara på? Vad skulle en binär modell kunna svara på? Vad händer om du ville avgöra om ett visst kök sannolikt använder bockhornsklöver? Vad händer om du ville se om du, med en present av en matkasse full av stjärnanis, kronärtskockor, blomkål och pepparrot, kunde skapa en typisk indisk rätt? + +[![Galna mysteriekorgar](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Galna mysteriekorgar") + +> 🎥 Klicka på bilden ovan för en video. Hela premissen för programmet 'Chopped' är 'mysteriekorgen' där kockar måste göra en rätt av ett slumpmässigt val av ingredienser. Visst skulle en ML-modell ha hjälpt! + +## Hej 'klassificerare' + +Frågan vi vill ställa om denna dataset om kök är faktiskt en **multiklassfråga**, eftersom vi har flera potentiella nationella kök att arbeta med. Givet en mängd ingredienser, vilken av dessa många klasser passar datan in i? + +Scikit-learn erbjuder flera olika algoritmer att använda för att klassificera data, beroende på vilken typ av problem du vill lösa. I de kommande två lektionerna kommer du att lära dig om flera av dessa algoritmer. + +## Övning - rensa och balansera din data + +Den första uppgiften, innan vi börjar detta projekt, är att rensa och **balansera** din data för att få bättre resultat. Börja med den tomma filen _notebook.ipynb_ i roten av denna mapp. + +Det första du behöver installera är [imblearn](https://imbalanced-learn.org/stable/). Detta är ett Scikit-learn-paket som gör det möjligt att bättre balansera datan (du kommer att lära dig mer om denna uppgift om en stund). + +1. För att installera `imblearn`, kör `pip install`, så här: + + ```python + pip install imblearn + ``` + +1. Importera de paket du behöver för att importera din data och visualisera den, importera också `SMOTE` från `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 + ``` + + Nu är du redo att importera datan nästa gång. + +1. Nästa uppgift är att importera datan: + + ```python + df = pd.read_csv('../data/cuisines.csv') + ``` + + Genom att använda `read_csv()` kommer innehållet i csv-filen _cusines.csv_ att läsas och placeras i variabeln `df`. + +1. Kontrollera datans form: + + ```python + df.head() + ``` + + De första fem raderna ser ut så här: + + ```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. Få information om denna data genom att kalla på `info()`: + + ```python + df.info() + ``` + + Din utdata liknar: + + ```output + + RangeIndex: 2448 entries, 0 to 2447 + Columns: 385 entries, Unnamed: 0 to zucchini + dtypes: int64(384), object(1) + memory usage: 7.2+ MB + ``` + +## Övning - lära sig om kök + +Nu börjar arbetet bli mer intressant. Låt oss upptäcka fördelningen av data, per kök. + +1. Plotta datan som staplar genom att kalla på `barh()`: + + ```python + df.cuisine.value_counts().plot.barh() + ``` + + ![fördelning av köksdata](../../../../4-Classification/1-Introduction/images/cuisine-dist.png) + + Det finns ett begränsat antal kök, men fördelningen av data är ojämn. Du kan fixa det! Innan du gör det, utforska lite mer. + +1. Ta reda på hur mycket data som finns tillgängligt per kök och skriv ut det: + + ```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}') + ``` + + Utdata ser ut så här: + + ```output + thai df: (289, 385) + japanese df: (320, 385) + chinese df: (442, 385) + indian df: (598, 385) + korean df: (799, 385) + ``` + +## Upptäcka ingredienser + +Nu kan du gräva djupare i datan och lära dig vilka som är de typiska ingredienserna per kök. Du bör rensa bort återkommande data som skapar förvirring mellan kök, så låt oss lära oss om detta problem. + +1. Skapa en funktion `create_ingredient()` i Python för att skapa en ingrediens-dataset. Denna funktion börjar med att ta bort en oanvändbar kolumn och sortera ingredienser efter deras antal: + + ```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 + ``` + + Nu kan du använda den funktionen för att få en idé om de tio mest populära ingredienserna per kök. + +1. Kalla på `create_ingredient()` och plotta det genom att kalla på `barh()`: + + ```python + thai_ingredient_df = create_ingredient_df(thai_df) + thai_ingredient_df.head(10).plot.barh() + ``` + + ![thai](../../../../4-Classification/1-Introduction/images/thai.png) + +1. Gör samma sak för den japanska datan: + + ```python + japanese_ingredient_df = create_ingredient_df(japanese_df) + japanese_ingredient_df.head(10).plot.barh() + ``` + + ![japanska](../../../../4-Classification/1-Introduction/images/japanese.png) + +1. Nu för de kinesiska ingredienserna: + + ```python + chinese_ingredient_df = create_ingredient_df(chinese_df) + chinese_ingredient_df.head(10).plot.barh() + ``` + + ![kinesiska](../../../../4-Classification/1-Introduction/images/chinese.png) + +1. Plotta de indiska ingredienserna: + + ```python + indian_ingredient_df = create_ingredient_df(indian_df) + indian_ingredient_df.head(10).plot.barh() + ``` + + ![indiska](../../../../4-Classification/1-Introduction/images/indian.png) + +1. Slutligen, plotta de koreanska ingredienserna: + + ```python + korean_ingredient_df = create_ingredient_df(korean_df) + korean_ingredient_df.head(10).plot.barh() + ``` + + ![koreanska](../../../../4-Classification/1-Introduction/images/korean.png) + +1. Nu, ta bort de vanligaste ingredienserna som skapar förvirring mellan olika kök, genom att kalla på `drop()`: + + Alla älskar ris, vitlök och ingefära! + + ```python + feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) + labels_df = df.cuisine #.unique() + feature_df.head() + ``` + +## Balansera datasetet + +Nu när du har rensat datan, använd [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Synthetic Minority Over-sampling Technique" - för att balansera den. + +1. Kalla på `fit_resample()`, denna strategi genererar nya prover genom interpolation. + + ```python + oversample = SMOTE() + transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df) + ``` + + Genom att balansera din data får du bättre resultat när du klassificerar den. Tänk på en binär klassificering. Om det mesta av din data är en klass, kommer en ML-modell att förutsäga den klassen oftare, bara för att det finns mer data för den. Att balansera datan tar bort eventuella snedvridningar och hjälper till att eliminera denna obalans. + +1. Nu kan du kontrollera antalet etiketter per ingrediens: + + ```python + print(f'new label count: {transformed_label_df.value_counts()}') + print(f'old label count: {df.cuisine.value_counts()}') + ``` + + Din utdata ser ut så här: + + ```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 + ``` + + Datan är fin och ren, balanserad och mycket läcker! + +1. Det sista steget är att spara din balanserade data, inklusive etiketter och egenskaper, i en ny dataset som kan exporteras till en fil: + + ```python + transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer') + ``` + +1. Du kan ta en sista titt på datan med `transformed_df.head()` och `transformed_df.info()`. Spara en kopia av denna data för användning i framtida lektioner: + + ```python + transformed_df.head() + transformed_df.info() + transformed_df.to_csv("../data/cleaned_cuisines.csv") + ``` + + Denna nya CSV-fil kan nu hittas i rotens datamapp. + +--- + +## 🚀Utmaning + +Detta läroplan innehåller flera intressanta dataset. Gräv igenom `data`-mapparna och se om någon innehåller dataset som skulle vara lämpliga för binär eller multiklassklassificering? Vilka frågor skulle du ställa till denna dataset? + +## [Quiz efter lektionen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Utforska SMOTEs API. Vilka användningsområden är det bäst lämpat för? Vilka problem löser det? + +## Uppgift + +[Utforska klassificeringsmetoder](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/1-Introduction/assignment.md b/translations/sv/4-Classification/1-Introduction/assignment.md new file mode 100644 index 000000000..ca3b31724 --- /dev/null +++ b/translations/sv/4-Classification/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Utforska klassificeringsmetoder + +## Instruktioner + +I [Scikit-learn dokumentationen](https://scikit-learn.org/stable/supervised_learning.html) hittar du en stor lista över sätt att klassificera data. Gör en liten skattjakt i dessa dokument: ditt mål är att leta efter klassificeringsmetoder och matcha en dataset i denna kursplan, en fråga du kan ställa om den, och en klassificeringsteknik. Skapa ett kalkylblad eller en tabell i en .doc-fil och förklara hur datasetet skulle fungera med klassificeringsalgoritmen. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| | ett dokument presenteras som ger en översikt över 5 algoritmer tillsammans med en klassificeringsteknik. Översikten är välförklarad och detaljerad. | ett dokument presenteras som ger en översikt över 3 algoritmer tillsammans med en klassificeringsteknik. Översikten är välförklarad och detaljerad. | ett dokument presenteras som ger en översikt över färre än tre algoritmer tillsammans med en klassificeringsteknik och översikten är varken välförklarad eller detaljerad. | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiska översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/1-Introduction/solution/Julia/README.md b/translations/sv/4-Classification/1-Introduction/solution/Julia/README.md new file mode 100644 index 000000000..60b49a7e5 --- /dev/null +++ b/translations/sv/4-Classification/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/2-Classifiers-1/README.md b/translations/sv/4-Classification/2-Classifiers-1/README.md new file mode 100644 index 000000000..54c3e809f --- /dev/null +++ b/translations/sv/4-Classification/2-Classifiers-1/README.md @@ -0,0 +1,253 @@ + +# Klassificering av kök 1 + +I den här lektionen kommer du att använda datasetet som du sparade från den senaste lektionen, fullt av balanserad och ren data om olika kök. + +Du kommer att använda detta dataset med en mängd olika klassificerare för att _förutsäga ett visst nationellt kök baserat på en grupp ingredienser_. Under tiden kommer du att lära dig mer om hur algoritmer kan användas för klassificeringsuppgifter. + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) +# Förberedelse + +Om du har slutfört [Lektionen 1](../1-Introduction/README.md), se till att en _cleaned_cuisines.csv_-fil finns i rotmappen `/data` för dessa fyra lektioner. + +## Övning - förutsäg ett nationellt kök + +1. Arbeta i den här lektionens _notebook.ipynb_-mapp och importera filen tillsammans med Pandas-biblioteket: + + ```python + import pandas as pd + cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") + cuisines_df.head() + ``` + + Datat ser ut så här: + +| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | +| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + + +1. Importera nu flera andra bibliotek: + + ```python + from sklearn.linear_model import LogisticRegression + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + from sklearn.svm import SVC + import numpy as np + ``` + +1. Dela upp X- och y-koordinaterna i två dataframes för träning. `cuisine` kan vara etikett-databasen: + + ```python + cuisines_label_df = cuisines_df['cuisine'] + cuisines_label_df.head() + ``` + + Det kommer att se ut så här: + + ```output + 0 indian + 1 indian + 2 indian + 3 indian + 4 indian + Name: cuisine, dtype: object + ``` + +1. Ta bort kolumnen `Unnamed: 0` och kolumnen `cuisine` genom att använda `drop()`. Spara resten av datan som träningsbara funktioner: + + ```python + cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) + cuisines_feature_df.head() + ``` + + Dina funktioner ser ut så här: + +| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | + +Nu är du redo att träna din modell! + +## Välja klassificerare + +Nu när din data är ren och redo för träning måste du bestämma vilken algoritm du ska använda för uppgiften. + +Scikit-learn grupperar klassificering under Supervised Learning, och inom den kategorin hittar du många sätt att klassificera. [Variationen](https://scikit-learn.org/stable/supervised_learning.html) kan verka överväldigande vid första anblicken. Följande metoder inkluderar alla klassificeringstekniker: + +- Linjära modeller +- Support Vector Machines +- Stokastisk gradientnedstigning +- Närmaste grannar +- Gaussiska processer +- Beslutsträd +- Ensemblemetoder (röstningsklassificerare) +- Multiklass- och multioutput-algoritmer (multiklass- och multilabel-klassificering, multiklass-multioutput-klassificering) + +> Du kan också använda [neurala nätverk för att klassificera data](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification), men det ligger utanför denna lektions omfattning. + +### Vilken klassificerare ska man välja? + +Så, vilken klassificerare ska du välja? Ofta kan man testa flera och leta efter ett bra resultat. Scikit-learn erbjuder en [jämförelse sida vid sida](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) på ett skapat dataset, där KNeighbors, SVC på två sätt, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB och QuadraticDiscriminationAnalysis jämförs och resultaten visualiseras: + +![jämförelse av klassificerare](../../../../4-Classification/2-Classifiers-1/images/comparison.png) +> Diagram genererade från Scikit-learns dokumentation + +> AutoML löser detta problem smidigt genom att köra dessa jämförelser i molnet, vilket gör att du kan välja den bästa algoritmen för din data. Prova det [här](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott) + +### En bättre metod + +En bättre metod än att gissa vilt är att följa idéerna i detta nedladdningsbara [ML Cheat Sheet](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott). Här upptäcker vi att vi för vårt multiklassproblem har några alternativ: + +![fusklapp för multiklassproblem](../../../../4-Classification/2-Classifiers-1/images/cheatsheet.png) +> En del av Microsofts Algorithm Cheat Sheet, som beskriver alternativ för multiklassklassificering + +✅ Ladda ner denna fusklapp, skriv ut den och häng upp den på väggen! + +### Resonemang + +Låt oss se om vi kan resonera oss fram till olika metoder med tanke på de begränsningar vi har: + +- **Neurala nätverk är för tunga**. Med tanke på vårt rena men minimala dataset och det faktum att vi kör träning lokalt via notebooks, är neurala nätverk för resurskrävande för denna uppgift. +- **Ingen tvåklassklassificerare**. Vi använder inte en tvåklassklassificerare, så det utesluter one-vs-all. +- **Beslutsträd eller logistisk regression kan fungera**. Ett beslutsträd kan fungera, eller logistisk regression för multiklassdata. +- **Multiklass Boosted Decision Trees löser ett annat problem**. Multiklass Boosted Decision Tree är mest lämplig för icke-parametriska uppgifter, t.ex. uppgifter som är utformade för att skapa rankningar, så det är inte användbart för oss. + +### Använda Scikit-learn + +Vi kommer att använda Scikit-learn för att analysera vår data. Det finns dock många sätt att använda logistisk regression i Scikit-learn. Ta en titt på [parametrarna att skicka](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +I huvudsak finns det två viktiga parametrar - `multi_class` och `solver` - som vi behöver specificera när vi ber Scikit-learn att utföra en logistisk regression. Värdet på `multi_class` tillämpar ett visst beteende. Värdet på solver är vilken algoritm som ska användas. Inte alla solvers kan kombineras med alla `multi_class`-värden. + +Enligt dokumentationen, i multiklassfallet, träningsalgoritmen: + +- **Använder one-vs-rest (OvR)-schemat**, om `multi_class`-alternativet är inställt på `ovr` +- **Använder korsentropiförlust**, om `multi_class`-alternativet är inställt på `multinomial`. (För närvarande stöds `multinomial`-alternativet endast av solvers ‘lbfgs’, ‘sag’, ‘saga’ och ‘newton-cg’.) + +> 🎓 'Schemat' här kan antingen vara 'ovr' (one-vs-rest) eller 'multinomial'. Eftersom logistisk regression egentligen är utformad för att stödja binär klassificering, tillåter dessa scheman den att bättre hantera multiklassklassificeringsuppgifter. [källa](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/) + +> 🎓 'Solver' definieras som "algoritmen som ska användas i optimeringsproblemet". [källa](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +Scikit-learn erbjuder denna tabell för att förklara hur solvers hanterar olika utmaningar som presenteras av olika typer av datastrukturer: + +![solvers](../../../../4-Classification/2-Classifiers-1/images/solvers.png) + +## Övning - dela upp datan + +Vi kan fokusera på logistisk regression för vår första träningsförsök eftersom du nyligen lärde dig om den i en tidigare lektion. +Dela upp din data i tränings- och testgrupper genom att kalla på `train_test_split()`: + +```python +X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) +``` + +## Övning - tillämpa logistisk regression + +Eftersom du använder multiklassfallet behöver du välja vilket _schema_ du ska använda och vilken _solver_ du ska ställa in. Använd LogisticRegression med en multiklassinställning och **liblinear**-solver för att träna. + +1. Skapa en logistisk regression med multi_class inställd på `ovr` och solver inställd på `liblinear`: + + ```python + lr = LogisticRegression(multi_class='ovr',solver='liblinear') + model = lr.fit(X_train, np.ravel(y_train)) + + accuracy = model.score(X_test, y_test) + print ("Accuracy is {}".format(accuracy)) + ``` + + ✅ Prova en annan solver som `lbfgs`, som ofta är inställd som standard +> Observera, använd Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html)-funktionen för att platta ut dina data vid behov. +Noggrannheten är bra på över **80%**! + +1. Du kan se denna modell i aktion genom att testa en rad data (#50): + + ```python + print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') + print(f'cuisine: {y_test.iloc[50]}') + ``` + + Resultatet skrivs ut: + + ```output + ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') + cuisine: indian + ``` + + ✅ Prova ett annat radnummer och kontrollera resultaten + +1. För att gå djupare kan du kontrollera noggrannheten för denna förutsägelse: + + ```python + test= X_test.iloc[50].values.reshape(-1, 1).T + proba = model.predict_proba(test) + classes = model.classes_ + resultdf = pd.DataFrame(data=proba, columns=classes) + + topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) + topPrediction.head() + ``` + + Resultatet skrivs ut - indisk mat är dess bästa gissning, med hög sannolikhet: + + | | 0 | + | -------: | -------: | + | indian | 0.715851 | + | chinese | 0.229475 | + | japanese | 0.029763 | + | korean | 0.017277 | + | thai | 0.007634 | + + ✅ Kan du förklara varför modellen är ganska säker på att detta är indisk mat? + +1. Få mer detaljer genom att skriva ut en klassificeringsrapport, precis som du gjorde i regression-lektionerna: + + ```python + y_pred = model.predict(X_test) + print(classification_report(y_test,y_pred)) + ``` + + | | precision | recall | f1-score | support | + | ------------ | --------- | ------ | -------- | ------- | + | chinese | 0.73 | 0.71 | 0.72 | 229 | + | indian | 0.91 | 0.93 | 0.92 | 254 | + | japanese | 0.70 | 0.75 | 0.72 | 220 | + | korean | 0.86 | 0.76 | 0.81 | 242 | + | thai | 0.79 | 0.85 | 0.82 | 254 | + | accuracy | 0.80 | 1199 | | | + | macro avg | 0.80 | 0.80 | 0.80 | 1199 | + | weighted avg | 0.80 | 0.80 | 0.80 | 1199 | + +## 🚀Utmaning + +I denna lektion använde du dina rensade data för att bygga en maskininlärningsmodell som kan förutsäga ett nationellt kök baserat på en serie ingredienser. Ta lite tid att läsa igenom de många alternativ som Scikit-learn erbjuder för att klassificera data. Gå djupare in i konceptet 'solver' för att förstå vad som händer bakom kulisserna. + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Gräv lite djupare i matematiken bakom logistisk regression i [denna lektion](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf) +## Uppgift + +[Studera lösningsmetoderna](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/2-Classifiers-1/assignment.md b/translations/sv/4-Classification/2-Classifiers-1/assignment.md new file mode 100644 index 000000000..c4f7b1675 --- /dev/null +++ b/translations/sv/4-Classification/2-Classifiers-1/assignment.md @@ -0,0 +1,23 @@ + +# Studera lösarna +## Instruktioner + +I den här lektionen lärde du dig om olika lösare som kombinerar algoritmer med en maskininlärningsprocess för att skapa en exakt modell. Gå igenom de lösare som nämns i lektionen och välj två. Med dina egna ord, jämför och kontrastera dessa två lösare. Vilken typ av problem löser de? Hur fungerar de med olika datastrukturer? Varför skulle du välja den ena framför den andra? +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------ | ----------------------------- | +| | En .doc-fil presenteras med två stycken, ett om varje lösare, som jämför dem genomtänkt. | En .doc-fil presenteras med endast ett stycke | Uppgiften är ofullständig | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/2-Classifiers-1/solution/Julia/README.md b/translations/sv/4-Classification/2-Classifiers-1/solution/Julia/README.md new file mode 100644 index 000000000..722d5fffc --- /dev/null +++ b/translations/sv/4-Classification/2-Classifiers-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/3-Classifiers-2/README.md b/translations/sv/4-Classification/3-Classifiers-2/README.md new file mode 100644 index 000000000..c6b07d5a3 --- /dev/null +++ b/translations/sv/4-Classification/3-Classifiers-2/README.md @@ -0,0 +1,249 @@ + +# Klassificerare för matlagning 2 + +I den här andra lektionen om klassificering kommer du att utforska fler sätt att klassificera numerisk data. Du kommer också att lära dig om konsekvenserna av att välja en klassificerare framför en annan. + +## [Förtest-quiz](https://ff-quizzes.netlify.app/en/ml/) + +### Förkunskaper + +Vi antar att du har slutfört de tidigare lektionerna och har en städad dataset i din `data`-mapp som heter _cleaned_cuisines.csv_ i roten av denna 4-lektionsmapp. + +### Förberedelse + +Vi har laddat din _notebook.ipynb_-fil med den städade datasetet och har delat upp den i X- och y-dataframes, redo för modellbyggnadsprocessen. + +## En klassificeringskarta + +Tidigare lärde du dig om de olika alternativen du har när du klassificerar data med hjälp av Microsofts fusklapp. Scikit-learn erbjuder en liknande, men mer detaljerad fusklapp som kan hjälpa dig att ytterligare begränsa dina estimatorer (en annan term för klassificerare): + +![ML-karta från Scikit-learn](../../../../4-Classification/3-Classifiers-2/images/map.png) +> Tips: [besök denna karta online](https://scikit-learn.org/stable/tutorial/machine_learning_map/) och klicka längs vägen för att läsa dokumentationen. + +### Planen + +Den här kartan är mycket användbar när du har en tydlig förståelse för din data, eftersom du kan "vandra" längs dess vägar till ett beslut: + +- Vi har >50 prover +- Vi vill förutsäga en kategori +- Vi har märkt data +- Vi har färre än 100K prover +- ✨ Vi kan välja en Linear SVC +- Om det inte fungerar, eftersom vi har numerisk data + - Kan vi prova en ✨ KNeighbors Classifier + - Om det inte fungerar, prova ✨ SVC och ✨ Ensemble Classifiers + +Detta är en mycket användbar väg att följa. + +## Övning - dela upp datan + +Följande denna väg bör vi börja med att importera några bibliotek att använda. + +1. Importera de nödvändiga biblioteken: + + ```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. Dela upp din tränings- och testdata: + + ```python + X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) + ``` + +## Linear SVC-klassificerare + +Support-Vector Clustering (SVC) är en del av Support-Vector Machines-familjen av ML-tekniker (lär dig mer om dessa nedan). I denna metod kan du välja en 'kernel' för att bestämma hur etiketterna ska klustras. Parametern 'C' hänvisar till 'regularisering' som reglerar påverkan av parametrar. Kerneln kan vara en av [flera](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); här ställer vi in den på 'linear' för att säkerställa att vi använder Linear SVC. Sannolikhet är som standard inställd på 'false'; här ställer vi in den på 'true' för att samla sannolikhetsuppskattningar. Vi ställer in random state på '0' för att blanda datan och få sannolikheter. + +### Övning - tillämpa en Linear SVC + +Börja med att skapa en array av klassificerare. Du kommer att lägga till successivt i denna array när vi testar. + +1. Börja med en Linear SVC: + + ```python + C = 10 + # Create different classifiers. + classifiers = { + 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0) + } + ``` + +2. Träna din modell med Linear SVC och skriv ut en rapport: + + ```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)) + ``` + + Resultatet är ganska bra: + + ```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-klassificerare + +K-Neighbors är en del av "neighbors"-familjen av ML-metoder, som kan användas för både övervakad och oövervakad inlärning. I denna metod skapas ett fördefinierat antal punkter och data samlas runt dessa punkter så att generaliserade etiketter kan förutsägas för datan. + +### Övning - tillämpa K-Neighbors-klassificeraren + +Den tidigare klassificeraren var bra och fungerade väl med datan, men kanske kan vi få bättre noggrannhet. Prova en K-Neighbors-klassificerare. + +1. Lägg till en rad i din klassificerar-array (lägg till ett kommatecken efter Linear SVC-posten): + + ```python + 'KNN classifier': KNeighborsClassifier(C), + ``` + + Resultatet är lite sämre: + + ```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 + ``` + + ✅ Läs mer om [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) + +## Support Vector Classifier + +Support-Vector-klassificerare är en del av [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine)-familjen av ML-metoder som används för klassificerings- och regressionsuppgifter. SVMs "kartlägger träningsprover till punkter i rymden" för att maximera avståndet mellan två kategorier. Efterföljande data kartläggs in i detta utrymme så att deras kategori kan förutsägas. + +### Övning - tillämpa en Support Vector Classifier + +Låt oss försöka få lite bättre noggrannhet med en Support Vector Classifier. + +1. Lägg till ett kommatecken efter K-Neighbors-posten och lägg sedan till denna rad: + + ```python + 'SVC': SVC(), + ``` + + Resultatet är riktigt bra! + + ```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 + ``` + + ✅ Läs mer om [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm) + +## Ensemble-klassificerare + +Låt oss följa vägen till slutet, även om det föregående testet var riktigt bra. Låt oss prova några 'Ensemble Classifiers', specifikt Random Forest och AdaBoost: + +```python + 'RFST': RandomForestClassifier(n_estimators=100), + 'ADA': AdaBoostClassifier(n_estimators=100) +``` + +Resultatet är mycket bra, särskilt för 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 +``` + +✅ Läs mer om [Ensemble Classifiers](https://scikit-learn.org/stable/modules/ensemble.html) + +Denna metod för maskininlärning "kombinerar förutsägelser från flera basestimatorer" för att förbättra modellens kvalitet. I vårt exempel använde vi Random Trees och AdaBoost. + +- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), en genomsnittsmetod, bygger en 'skog' av 'beslutsträd' med inslag av slumpmässighet för att undvika överanpassning. Parametern n_estimators är inställd på antalet träd. + +- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) anpassar en klassificerare till en dataset och anpassar sedan kopior av den klassificeraren till samma dataset. Den fokuserar på vikterna av felklassificerade objekt och justerar anpassningen för nästa klassificerare för att korrigera. + +--- + +## 🚀Utmaning + +Var och en av dessa tekniker har ett stort antal parametrar som du kan justera. Undersök standardparametrarna för var och en och fundera på vad justering av dessa parametrar skulle innebära för modellens kvalitet. + +## [Eftertest-quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Det finns mycket fackspråk i dessa lektioner, så ta en minut att granska [denna lista](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) med användbar terminologi! + +## Uppgift + +[Parameterlek](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/3-Classifiers-2/assignment.md b/translations/sv/4-Classification/3-Classifiers-2/assignment.md new file mode 100644 index 000000000..c8992a76a --- /dev/null +++ b/translations/sv/4-Classification/3-Classifiers-2/assignment.md @@ -0,0 +1,25 @@ + +# Parameterlek + +## Instruktioner + +Det finns många parametrar som är förinställda när man arbetar med dessa klassificerare. Intellisense i VS Code kan hjälpa dig att utforska dem. Använd en av maskininlärningens klassificeringstekniker från denna lektion och träna om modeller genom att justera olika parametervärden. Skapa en notebook som förklarar varför vissa ändringar förbättrar modellens kvalitet medan andra försämrar den. Var detaljerad i ditt svar. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ----------------------------- | +| | En notebook presenteras med en fullt utvecklad klassificerare där parametrar har justerats och ändringar förklaras i textfält | En notebook presenteras delvis eller är dåligt förklarad | En notebook är buggig eller bristfällig | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som kan uppstå vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/3-Classifiers-2/solution/Julia/README.md b/translations/sv/4-Classification/3-Classifiers-2/solution/Julia/README.md new file mode 100644 index 000000000..85de31050 --- /dev/null +++ b/translations/sv/4-Classification/3-Classifiers-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/4-Applied/README.md b/translations/sv/4-Classification/4-Applied/README.md new file mode 100644 index 000000000..450d23980 --- /dev/null +++ b/translations/sv/4-Classification/4-Applied/README.md @@ -0,0 +1,329 @@ + +# Bygg en webapp för matrekommendationer + +I den här lektionen kommer du att bygga en klassificeringsmodell med hjälp av några av de tekniker du har lärt dig i tidigare lektioner och med det läckra datasetet om mat som används genom hela denna serie. Dessutom kommer du att bygga en liten webapp för att använda en sparad modell, med hjälp av Onnx:s web runtime. + +En av de mest praktiska användningarna av maskininlärning är att bygga rekommendationssystem, och idag kan du ta det första steget i den riktningen! + +[![Presentera denna webapp](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Applied ML") + +> 🎥 Klicka på bilden ovan för en video: Jen Looper bygger en webapp med klassificerad matdata + +## [Quiz före lektionen](https://ff-quizzes.netlify.app/en/ml/) + +I den här lektionen kommer du att lära dig: + +- Hur man bygger en modell och sparar den som en Onnx-modell +- Hur man använder Netron för att inspektera modellen +- Hur man använder din modell i en webapp för inferens + +## Bygg din modell + +Att bygga tillämpade ML-system är en viktig del av att utnyttja dessa teknologier för dina affärssystem. Du kan använda modeller inom dina webbapplikationer (och därmed använda dem offline om det behövs) genom att använda Onnx. + +I en [tidigare lektion](../../3-Web-App/1-Web-App/README.md) byggde du en regressionsmodell om UFO-observationer, "picklade" den och använde den i en Flask-app. Även om denna arkitektur är mycket användbar att känna till, är det en fullstack Python-app, och dina krav kan inkludera användning av en JavaScript-applikation. + +I den här lektionen kan du bygga ett grundläggande JavaScript-baserat system för inferens. Först måste du dock träna en modell och konvertera den för användning med Onnx. + +## Övning - träna klassificeringsmodell + +Först, träna en klassificeringsmodell med det rensade datasetet om mat som vi använde. + +1. Börja med att importera användbara bibliotek: + + ```python + !pip install skl2onnx + import pandas as pd + ``` + + Du behöver '[skl2onnx](https://onnx.ai/sklearn-onnx/)' för att hjälpa till att konvertera din Scikit-learn-modell till Onnx-format. + +1. Arbeta sedan med din data på samma sätt som du gjorde i tidigare lektioner, genom att läsa en CSV-fil med `read_csv()`: + + ```python + data = pd.read_csv('../data/cleaned_cuisines.csv') + data.head() + ``` + +1. Ta bort de två första onödiga kolumnerna och spara den återstående datan som 'X': + + ```python + X = data.iloc[:,2:] + X.head() + ``` + +1. Spara etiketterna som 'y': + + ```python + y = data[['cuisine']] + y.head() + + ``` + +### Starta träningsrutinen + +Vi kommer att använda biblioteket 'SVC' som har bra noggrannhet. + +1. Importera lämpliga bibliotek från 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. Separera tränings- och testuppsättningar: + + ```python + X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3) + ``` + +1. Bygg en SVC-klassificeringsmodell som du gjorde i den tidigare lektionen: + + ```python + model = SVC(kernel='linear', C=10, probability=True,random_state=0) + model.fit(X_train,y_train.values.ravel()) + ``` + +1. Testa nu din modell genom att kalla på `predict()`: + + ```python + y_pred = model.predict(X_test) + ``` + +1. Skriv ut en klassificeringsrapport för att kontrollera modellens kvalitet: + + ```python + print(classification_report(y_test,y_pred)) + ``` + + Som vi såg tidigare är noggrannheten bra: + + ```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 + ``` + +### Konvertera din modell till Onnx + +Se till att göra konverteringen med rätt Tensor-nummer. Detta dataset har 380 ingredienser listade, så du behöver ange det numret i `FloatTensorType`: + +1. Konvertera med ett tensornummer på 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. Skapa onx och spara som en fil **model.onnx**: + + ```python + onx = convert_sklearn(model, initial_types=initial_type, options=options) + with open("./model.onnx", "wb") as f: + f.write(onx.SerializeToString()) + ``` + + > Observera att du kan skicka in [alternativ](https://onnx.ai/sklearn-onnx/parameterized.html) i ditt konverteringsskript. I detta fall skickade vi in 'nocl' som True och 'zipmap' som False. Eftersom detta är en klassificeringsmodell har du möjlighet att ta bort ZipMap som producerar en lista med ordböcker (inte nödvändigt). `nocl` hänvisar till att klassinformation inkluderas i modellen. Minska modellens storlek genom att ställa in `nocl` till 'True'. + +Om du kör hela notebooken kommer du nu att bygga en Onnx-modell och spara den i den här mappen. + +## Visa din modell + +Onnx-modeller är inte särskilt synliga i Visual Studio Code, men det finns en mycket bra gratis programvara som många forskare använder för att visualisera modellen och säkerställa att den är korrekt byggd. Ladda ner [Netron](https://github.com/lutzroeder/Netron) och öppna din model.onnx-fil. Du kan se din enkla modell visualiserad, med dess 380 ingångar och klassificerare listade: + +![Netron visual](../../../../4-Classification/4-Applied/images/netron.png) + +Netron är ett användbart verktyg för att visa dina modeller. + +Nu är du redo att använda denna smarta modell i en webapp. Låt oss bygga en app som kommer till nytta när du tittar i ditt kylskåp och försöker lista ut vilken kombination av dina kvarvarande ingredienser du kan använda för att laga en viss maträtt, som bestäms av din modell. + +## Bygg en webapplikation för rekommendationer + +Du kan använda din modell direkt i en webapp. Denna arkitektur gör det också möjligt att köra den lokalt och till och med offline om det behövs. Börja med att skapa en `index.html`-fil i samma mapp där du sparade din `model.onnx`-fil. + +1. I denna fil _index.html_, lägg till följande markup: + + ```html + + +
            + Cuisine Matcher +
            + + ... + + + ``` + +1. Nu, inom `body`-taggarna, lägg till lite markup för att visa en lista med kryssrutor som representerar några ingredienser: + + ```html +

            Check your refrigerator. What can you create?

            +
            +
            + + +
            + +
            + + +
            + +
            + + +
            + +
            + + +
            + +
            + + +
            + +
            + + +
            + +
            + + +
            +
            +
            + +
            + ``` + + Observera att varje kryssruta har ett värde. Detta representerar indexet där ingrediensen finns enligt datasetet. Äpple, till exempel, i denna alfabetiska lista, upptar den femte kolumnen, så dess värde är '4' eftersom vi börjar räkna från 0. Du kan konsultera [ingredients spreadsheet](../../../../4-Classification/data/ingredient_indexes.csv) för att upptäcka en viss ingrediens index. + + Fortsätt ditt arbete i index.html-filen och lägg till ett skriptblock där modellen anropas efter den sista stängande ``. + +1. Först, importera [Onnx Runtime](https://www.onnxruntime.ai/): + + ```html + + ``` + + > Onnx Runtime används för att möjliggöra körning av dina Onnx-modeller över ett brett spektrum av hårdvaruplattformar, inklusive optimeringar och ett API att använda. + +1. När Runtime är på plats kan du kalla på den: + + ```html + + ``` + +I denna kod händer flera saker: + +1. Du skapade en array med 380 möjliga värden (1 eller 0) som ska ställas in och skickas till modellen för inferens, beroende på om en ingrediens kryssruta är markerad. +2. Du skapade en array med kryssrutor och ett sätt att avgöra om de var markerade i en `init`-funktion som anropas när applikationen startar. När en kryssruta är markerad ändras `ingredients`-arrayen för att återspegla den valda ingrediensen. +3. Du skapade en `testCheckboxes`-funktion som kontrollerar om någon kryssruta var markerad. +4. Du använder `startInference`-funktionen när knappen trycks och, om någon kryssruta är markerad, startar du inferens. +5. Inferensrutinen inkluderar: + 1. Att sätta upp en asynkron laddning av modellen + 2. Skapa en Tensor-struktur att skicka till modellen + 3. Skapa 'feeds' som återspeglar `float_input`-ingången som du skapade när du tränade din modell (du kan använda Netron för att verifiera det namnet) + 4. Skicka dessa 'feeds' till modellen och vänta på ett svar + +## Testa din applikation + +Öppna en terminalsession i Visual Studio Code i mappen där din index.html-fil finns. Se till att du har [http-server](https://www.npmjs.com/package/http-server) installerat globalt och skriv `http-server` vid prompten. En localhost bör öppnas och du kan visa din webapp. Kontrollera vilken maträtt som rekommenderas baserat på olika ingredienser: + +![ingredient web app](../../../../4-Classification/4-Applied/images/web-app.png) + +Grattis, du har skapat en webapp för 'rekommendationer' med några fält. Ta lite tid att bygga ut detta system! + +## 🚀Utmaning + +Din webapp är väldigt minimal, så fortsätt att bygga ut den med ingredienser och deras index från [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv)-datan. Vilka smakkombinationer fungerar för att skapa en viss nationalrätt? + +## [Quiz efter lektionen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Även om denna lektion bara berörde nyttan av att skapa ett rekommendationssystem för matingredienser, är detta område av ML-applikationer mycket rikt på exempel. Läs mer om hur dessa system byggs: + +- 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/ + +## Uppgift + +[Bygg en ny rekommendationsmotor](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/4-Applied/assignment.md b/translations/sv/4-Classification/4-Applied/assignment.md new file mode 100644 index 000000000..1fee685f0 --- /dev/null +++ b/translations/sv/4-Classification/4-Applied/assignment.md @@ -0,0 +1,25 @@ + +# Bygg en rekommendationsmotor + +## Instruktioner + +Med övningarna i denna lektion vet du nu hur man bygger en webbaserad app med JavaScript som använder Onnx Runtime och en konverterad Onnx-modell. Experimentera med att skapa en ny rekommendationsmotor med data från dessa lektioner eller från andra källor (ge gärna kredit). Du kan till exempel skapa en rekommendationsmotor för husdjur baserat på olika personlighetsdrag, eller en rekommendationsmotor för musikgenrer baserat på en persons humör. Var kreativ! + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ---------------------------------------------------------------------- | ------------------------------------- | --------------------------------- | +| | En webapp och en notebook presenteras, båda väl dokumenterade och fungerande | En av dessa två saknas eller har brister | Båda saknas eller har brister | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/4-Classification/README.md b/translations/sv/4-Classification/README.md new file mode 100644 index 000000000..bd305574e --- /dev/null +++ b/translations/sv/4-Classification/README.md @@ -0,0 +1,41 @@ + +# Komma igång med klassificering + +## Regionalt ämne: Utsökta asiatiska och indiska maträtter 🍜 + +I Asien och Indien är mattraditionerna extremt varierande och väldigt goda! Låt oss titta på data om regionala kök för att försöka förstå deras ingredienser. + +![Thailändsk matförsäljare](../../../4-Classification/images/thai-food.jpg) +> Foto av Lisheng ChangUnsplash + +## Vad du kommer att lära dig + +I det här avsnittet kommer du att bygga vidare på din tidigare studie av regression och lära dig om andra klassificerare som du kan använda för att bättre förstå data. + +> Det finns användbara verktyg med låg kod som kan hjälpa dig att lära dig att arbeta med klassificeringsmodeller. Prova [Azure ML för denna uppgift](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Lektioner + +1. [Introduktion till klassificering](1-Introduction/README.md) +2. [Fler klassificerare](2-Classifiers-1/README.md) +3. [Ytterligare klassificerare](3-Classifiers-2/README.md) +4. [Tillämpad ML: bygg en webbapp](4-Applied/README.md) + +## Krediter + +"Komma igång med klassificering" skrevs med ♥️ av [Cassie Breviu](https://www.twitter.com/cassiebreviu) och [Jen Looper](https://www.twitter.com/jenlooper) + +Datasettet med utsökta maträtter hämtades från [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines). + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiska översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/5-Clustering/1-Visualize/README.md b/translations/sv/5-Clustering/1-Visualize/README.md new file mode 100644 index 000000000..361e62f73 --- /dev/null +++ b/translations/sv/5-Clustering/1-Visualize/README.md @@ -0,0 +1,347 @@ + +# Introduktion till klustring + +Klustring är en typ av [Oövervakad inlärning](https://wikipedia.org/wiki/Unsupervised_learning) som förutsätter att en dataset är oetiketterad eller att dess indata inte är kopplade till fördefinierade utdata. Den använder olika algoritmer för att sortera igenom oetiketterad data och skapa grupper baserat på mönster som den identifierar i datan. + +[![No One Like You av PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You av PSquare") + +> 🎥 Klicka på bilden ovan för en video. Medan du studerar maskininlärning med klustring, njut av några nigerianska Dance Hall-låtar - detta är en högt rankad låt från 2014 av PSquare. + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +### Introduktion + +[Klustring](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) är mycket användbart för datautforskning. Låt oss se om det kan hjälpa till att upptäcka trender och mönster i hur nigerianska publikgrupper konsumerar musik. + +✅ Ta en minut och fundera på användningsområden för klustring. I verkliga livet sker klustring när du har en hög med tvätt och behöver sortera ut familjemedlemmarnas kläder 🧦👕👖🩲. Inom datavetenskap sker klustring när man försöker analysera en användares preferenser eller bestämma egenskaperna hos en oetiketterad dataset. Klustring hjälper på sätt och vis att skapa ordning i kaos, som en strumplåda. + +[![Introduktion till ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduktion till klustring") + +> 🎥 Klicka på bilden ovan för en video: MIT:s John Guttag introducerar klustring + +I en professionell miljö kan klustring användas för att bestämma saker som marknadssegmentering, till exempel vilka åldersgrupper som köper vilka produkter. Ett annat användningsområde kan vara att upptäcka avvikelser, kanske för att identifiera bedrägerier i en dataset med kreditkortstransaktioner. Eller så kan du använda klustring för att identifiera tumörer i en samling medicinska skanningar. + +✅ Fundera en minut på hur du kan ha stött på klustring 'i det vilda', inom bank, e-handel eller affärssammanhang. + +> 🎓 Intressant nog har klusteranalys sitt ursprung inom antropologi och psykologi på 1930-talet. Kan du föreställa dig hur det kan ha använts? + +Alternativt kan du använda det för att gruppera sökresultat - till exempel shoppinglänkar, bilder eller recensioner. Klustring är användbart när du har en stor dataset som du vill reducera och analysera mer detaljerat, så tekniken kan användas för att lära sig om data innan andra modeller konstrueras. + +✅ När din data är organiserad i kluster tilldelar du den ett kluster-ID, och denna teknik kan vara användbar för att bevara en datasets integritet; du kan istället referera till en datapunkt med dess kluster-ID, snarare än med mer avslöjande identifierbar data. Kan du tänka dig andra anledningar till varför du skulle referera till ett kluster-ID istället för andra element i klustret för att identifiera det? + +Fördjupa din förståelse av klustringstekniker i denna [Learn-modul](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) + +## Kom igång med klustring + +[Scikit-learn erbjuder ett stort utbud](https://scikit-learn.org/stable/modules/clustering.html) av metoder för att utföra klustring. Vilken typ du väljer beror på ditt användningsområde. Enligt dokumentationen har varje metod olika fördelar. Här är en förenklad tabell över metoderna som stöds av Scikit-learn och deras lämpliga användningsområden: + +| Metodnamn | Användningsområde | +| :---------------------------- | :------------------------------------------------------------------- | +| K-Means | allmänt syfte, induktiv | +| Affinity propagation | många, ojämna kluster, induktiv | +| Mean-shift | många, ojämna kluster, induktiv | +| Spectral clustering | få, jämna kluster, transduktiv | +| Ward hierarchical clustering | många, begränsade kluster, transduktiv | +| Agglomerative clustering | många, begränsade, icke-Euklidiska avstånd, transduktiv | +| DBSCAN | icke-platt geometri, ojämna kluster, transduktiv | +| OPTICS | icke-platt geometri, ojämna kluster med variabel densitet, transduktiv | +| Gaussian mixtures | platt geometri, induktiv | +| BIRCH | stor dataset med avvikelser, induktiv | + +> 🎓 Hur vi skapar kluster har mycket att göra med hur vi samlar datapunkter i grupper. Låt oss packa upp lite terminologi: +> +> 🎓 ['Transduktiv' vs. 'induktiv'](https://wikipedia.org/wiki/Transduction_(machine_learning)) +> +> Transduktiv inferens härleds från observerade träningsfall som kartläggs till specifika testfall. Induktiv inferens härleds från träningsfall som kartläggs till generella regler som sedan tillämpas på testfall. +> +> Ett exempel: Föreställ dig att du har en dataset som bara delvis är etiketterad. Vissa saker är 'skivor', vissa 'cd-skivor', och vissa är tomma. Din uppgift är att tilldela etiketter till de tomma. Om du väljer en induktiv metod skulle du träna en modell som letar efter 'skivor' och 'cd-skivor' och tillämpa dessa etiketter på din oetiketterade data. Denna metod kommer ha svårt att klassificera saker som faktiskt är 'kassetter'. En transduktiv metod, å andra sidan, hanterar denna okända data mer effektivt eftersom den arbetar för att gruppera liknande objekt och sedan tilldelar en etikett till en grupp. I detta fall kan kluster reflektera 'runda musikaliska saker' och 'fyrkantiga musikaliska saker'. +> +> 🎓 ['Icke-platt' vs. 'platt' geometri](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) +> +> Härstammar från matematisk terminologi, icke-platt vs. platt geometri hänvisar till mätningen av avstånd mellan punkter antingen med 'platt' ([Euklidisk](https://wikipedia.org/wiki/Euclidean_geometry)) eller 'icke-platt' (icke-Euklidisk) geometriska metoder. +> +>'Platt' i detta sammanhang hänvisar till Euklidisk geometri (delar av vilken lärs ut som 'plan' geometri), och icke-platt hänvisar till icke-Euklidisk geometri. Vad har geometri med maskininlärning att göra? Som två fält som är rotade i matematik måste det finnas ett gemensamt sätt att mäta avstånd mellan punkter i kluster, och det kan göras på ett 'platt' eller 'icke-platt' sätt, beroende på datans natur. [Euklidiska avstånd](https://wikipedia.org/wiki/Euclidean_distance) mäts som längden på en linjesegment mellan två punkter. [Icke-Euklidiska avstånd](https://wikipedia.org/wiki/Non-Euclidean_geometry) mäts längs en kurva. Om din data, visualiserad, verkar inte existera på en plan, kan du behöva använda en specialiserad algoritm för att hantera den. +> +![Platt vs Icke-platt Geometri Infografik](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png) +> Infografik av [Dasani Madipalli](https://twitter.com/dasani_decoded) +> +> 🎓 ['Avstånd'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) +> +> Kluster definieras av deras avståndsmatris, t.ex. avstånden mellan punkter. Detta avstånd kan mätas på några sätt. Euklidiska kluster definieras av genomsnittet av punktvärdena och innehåller en 'centroid' eller mittpunkt. Avstånd mäts således genom avståndet till den centroiden. Icke-Euklidiska avstånd hänvisar till 'clustroids', punkten närmast andra punkter. Clustroids kan i sin tur definieras på olika sätt. +> +> 🎓 ['Begränsad'](https://wikipedia.org/wiki/Constrained_clustering) +> +> [Begränsad klustring](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) introducerar 'semi-övervakad' inlärning i denna oövervakade metod. Relationerna mellan punkter flaggas som 'kan inte länka' eller 'måste länka' så vissa regler tvingas på datasetet. +> +>Ett exempel: Om en algoritm släpps fri på en samling oetiketterad eller semi-etiketterad data kan klustren den producerar vara av dålig kvalitet. I exemplet ovan kan klustren gruppera 'runda musikaliska saker' och 'fyrkantiga musikaliska saker' och 'triangulära saker' och 'kakor'. Om algoritmen ges vissa begränsningar, eller regler att följa ("objektet måste vara gjort av plast", "objektet måste kunna producera musik") kan detta hjälpa till att 'begränsa' algoritmen att göra bättre val. +> +> 🎓 'Densitet' +> +> Data som är 'brusig' anses vara 'tät'. Avstånden mellan punkter i varje av dess kluster kan vid undersökning visa sig vara mer eller mindre täta, eller 'trånga', och denna data behöver analyseras med lämplig klustringsmetod. [Denna artikel](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) demonstrerar skillnaden mellan att använda K-Means klustring vs. HDBSCAN-algoritmer för att utforska en brusig dataset med ojämn klusterdensitet. + +## Klustringsalgoritmer + +Det finns över 100 klustringsalgoritmer, och deras användning beror på datans natur. Låt oss diskutera några av de viktigaste: + +- **Hierarkisk klustring**. Om ett objekt klassificeras baserat på dess närhet till ett närliggande objekt, snarare än till ett längre bort, bildas kluster baserat på medlemmarnas avstånd till och från andra objekt. Scikit-learns agglomerativa klustring är hierarkisk. + + ![Hierarkisk klustring Infografik](../../../../5-Clustering/1-Visualize/images/hierarchical.png) + > Infografik av [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Centroid-klustring**. Denna populära algoritm kräver valet av 'k', eller antalet kluster som ska bildas, varefter algoritmen bestämmer mittpunkten för ett kluster och samlar data runt den punkten. [K-means klustring](https://wikipedia.org/wiki/K-means_clustering) är en populär version av centroid-klustring. Centroiden bestäms av det närmaste medelvärdet, därav namnet. Det kvadrerade avståndet från klustret minimeras. + + ![Centroid-klustring Infografik](../../../../5-Clustering/1-Visualize/images/centroid.png) + > Infografik av [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **Fördelningsbaserad klustring**. Baserad på statistisk modellering fokuserar fördelningsbaserad klustring på att bestämma sannolikheten att en datapunkt tillhör ett kluster och tilldelar den därefter. Gaussian mixture-metoder tillhör denna typ. + +- **Densitetsbaserad klustring**. Datapunkter tilldelas kluster baserat på deras densitet, eller deras gruppering runt varandra. Datapunkter långt från gruppen anses vara avvikelser eller brus. DBSCAN, Mean-shift och OPTICS tillhör denna typ av klustring. + +- **Rutbaserad klustring**. För multidimensionella datasets skapas ett rutnät och datan delas upp mellan rutnätets celler, vilket skapar kluster. + +## Övning - klustra din data + +Klustring som teknik underlättas mycket av korrekt visualisering, så låt oss börja med att visualisera vår musikdata. Denna övning kommer att hjälpa oss att avgöra vilken av klustringsmetoderna vi mest effektivt bör använda för datans natur. + +1. Öppna filen [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) i denna mapp. + +1. Importera paketet `Seaborn` för bra datavisualisering. + + ```python + !pip install seaborn + ``` + +1. Lägg till musikdatan från [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv). Ladda upp en dataframe med lite data om låtarna. Förbered dig på att utforska denna data genom att importera biblioteken och dumpa ut datan: + + ```python + import matplotlib.pyplot as plt + import pandas as pd + + df = pd.read_csv("../data/nigerian-songs.csv") + df.head() + ``` + + Kontrollera de första raderna av data: + + | | namn | album | artist | artist_top_genre | release_date | längd | popularitet | dansbarhet | akustiskhet | energi | instrumentellhet | livlighet | ljudstyrka | talighet | tempo | taktart | + | --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ---------- | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- | + | 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternativ 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. Få information om dataframe genom att kalla på `info()`: + + ```python + df.info() + ``` + + Utdata ser ut så här: + + ```output + + RangeIndex: 530 entries, 0 to 529 + Data columns (total 16 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 name 530 non-null object + 1 album 530 non-null object + 2 artist 530 non-null object + 3 artist_top_genre 530 non-null object + 4 release_date 530 non-null int64 + 5 length 530 non-null int64 + 6 popularity 530 non-null int64 + 7 danceability 530 non-null float64 + 8 acousticness 530 non-null float64 + 9 energy 530 non-null float64 + 10 instrumentalness 530 non-null float64 + 11 liveness 530 non-null float64 + 12 loudness 530 non-null float64 + 13 speechiness 530 non-null float64 + 14 tempo 530 non-null float64 + 15 time_signature 530 non-null int64 + dtypes: float64(8), int64(4), object(4) + memory usage: 66.4+ KB + ``` + +1. Kontrollera om det finns några null-värden genom att kalla på `isnull()` och verifiera att summan är 0: + + ```python + df.isnull().sum() + ``` + + Ser bra ut: + + ```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. Beskriv datan: + + ```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 | + +> 🤔 Om vi arbetar med klustring, en osuperviserad metod som inte kräver etiketterad data, varför visar vi denna data med etiketter? Under datautforskningsfasen är de användbara, men de är inte nödvändiga för att klustringsalgoritmer ska fungera. Du kan lika gärna ta bort kolumnrubrikerna och hänvisa till datan med kolumnnummer. + +Titta på de generella värdena i datan. Notera att popularitet kan vara '0', vilket visar låtar som inte har någon ranking. Låt oss ta bort dessa snart. + +1. Använd ett stapeldiagram för att ta reda på de mest populära genrerna: + + ```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') + ``` + + ![mest populära](../../../../5-Clustering/1-Visualize/images/popular.png) + +✅ Om du vill se fler toppvärden, ändra topp `[:5]` till ett större värde, eller ta bort det för att se allt. + +Notera, när toppgenren beskrivs som 'Missing', betyder det att Spotify inte klassificerade den, så låt oss ta bort den. + +1. Ta bort saknade data genom att filtrera bort dem + + ```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') + ``` + + Kontrollera nu genrerna igen: + + ![mest populära](../../../../5-Clustering/1-Visualize/images/all-genres.png) + +1. De tre toppgenrerna dominerar datasetet. Låt oss koncentrera oss på `afro dancehall`, `afropop` och `nigerian pop`, och dessutom filtrera datasetet för att ta bort allt med ett popularitetsvärde på 0 (vilket betyder att det inte klassificerades med en popularitet i datasetet och kan betraktas som brus för våra syften): + + ```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. Gör ett snabbt test för att se om datan korrelerar på något särskilt starkt sätt: + + ```python + corrmat = df.corr(numeric_only=True) + f, ax = plt.subplots(figsize=(12, 9)) + sns.heatmap(corrmat, vmax=.8, square=True) + ``` + + ![korrelationer](../../../../5-Clustering/1-Visualize/images/correlation.png) + + Den enda starka korrelationen är mellan `energy` och `loudness`, vilket inte är särskilt förvånande, eftersom hög musik vanligtvis är ganska energisk. Annars är korrelationerna relativt svaga. Det kommer att bli intressant att se vad en klustringsalgoritm kan göra med denna data. + + > 🎓 Notera att korrelation inte innebär kausalitet! Vi har bevis på korrelation men inget bevis på kausalitet. En [underhållande webbplats](https://tylervigen.com/spurious-correlations) har några visuella exempel som betonar denna punkt. + +Finns det någon konvergens i detta dataset kring en låts upplevda popularitet och dansbarhet? En FacetGrid visar att det finns koncentriska cirklar som stämmer överens, oavsett genre. Kan det vara så att nigerianska smaker konvergerar vid en viss nivå av dansbarhet för denna genre? + +✅ Prova olika datapunkter (energy, loudness, speechiness) och fler eller olika musikgenrer. Vad kan du upptäcka? Titta på `df.describe()`-tabellen för att se den generella spridningen av datapunkterna. + +### Övning - dataspridning + +Är dessa tre genrer signifikant olika i uppfattningen av deras dansbarhet, baserat på deras popularitet? + +1. Undersök dataspridningen för våra tre toppgenrer för popularitet och dansbarhet längs en given x- och y-axel. + + ```python + sns.set_theme(style="ticks") + + g = sns.jointplot( + data=df, + x="popularity", y="danceability", hue="artist_top_genre", + kind="kde", + ) + ``` + + Du kan upptäcka koncentriska cirklar runt en generell konvergenspunkt, som visar spridningen av punkter. + + > 🎓 Notera att detta exempel använder ett KDE (Kernel Density Estimate)-diagram som representerar datan med en kontinuerlig sannolikhetstäthetskurva. Detta gör det möjligt att tolka data när man arbetar med flera distributioner. + + Generellt sett är de tre genrerna löst anpassade när det gäller deras popularitet och dansbarhet. Att bestämma kluster i denna löst anpassade data kommer att vara en utmaning: + + ![spridning](../../../../5-Clustering/1-Visualize/images/distribution.png) + +1. Skapa ett spridningsdiagram: + + ```python + sns.FacetGrid(df, hue="artist_top_genre", height=5) \ + .map(plt.scatter, "popularity", "danceability") \ + .add_legend() + ``` + + Ett spridningsdiagram av samma axlar visar ett liknande mönster av konvergens + + ![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png) + +Generellt sett kan du använda spridningsdiagram för att visa kluster av data, så att bemästra denna typ av visualisering är mycket användbart. I nästa lektion kommer vi att ta denna filtrerade data och använda k-means-klustring för att upptäcka grupper i denna data som verkar överlappa på intressanta sätt. + +--- + +## 🚀Utmaning + +Som förberedelse inför nästa lektion, skapa ett diagram över de olika klustringsalgoritmer du kan upptäcka och använda i en produktionsmiljö. Vilka typer av problem försöker klustringen lösa? + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Innan du tillämpar klustringsalgoritmer, som vi har lärt oss, är det en bra idé att förstå naturen av ditt dataset. Läs mer om detta ämne [här](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) + +[Denna hjälpsamma artikel](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) går igenom de olika sätt som olika klustringsalgoritmer beter sig, givet olika datamönster. + +## Uppgift + +[Undersök andra visualiseringar för klustring](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/5-Clustering/1-Visualize/assignment.md b/translations/sv/5-Clustering/1-Visualize/assignment.md new file mode 100644 index 000000000..c3de9d9d7 --- /dev/null +++ b/translations/sv/5-Clustering/1-Visualize/assignment.md @@ -0,0 +1,25 @@ + +# Undersök andra visualiseringar för klustring + +## Instruktioner + +I denna lektion har du arbetat med några visualiseringstekniker för att få en förståelse för hur du kan plotta din data inför klustring. Spridningsdiagram är särskilt användbara för att hitta grupper av objekt. Undersök olika sätt och olika bibliotek för att skapa spridningsdiagram och dokumentera ditt arbete i en anteckningsbok. Du kan använda data från denna lektion, andra lektioner eller data som du själv hittar (kom ihåg att ange källan i din anteckningsbok). Plotta lite data med hjälp av spridningsdiagram och förklara vad du upptäcker. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------- | ----------------------------------- | +| | En anteckningsbok presenteras med fem väl dokumenterade spridningsdiagram | En anteckningsbok presenteras med färre än fem spridningsdiagram och är mindre väl dokumenterad | En ofullständig anteckningsbok presenteras | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/5-Clustering/1-Visualize/solution/Julia/README.md b/translations/sv/5-Clustering/1-Visualize/solution/Julia/README.md new file mode 100644 index 000000000..a16ce72bc --- /dev/null +++ b/translations/sv/5-Clustering/1-Visualize/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/5-Clustering/2-K-Means/README.md b/translations/sv/5-Clustering/2-K-Means/README.md new file mode 100644 index 000000000..0b273ddc5 --- /dev/null +++ b/translations/sv/5-Clustering/2-K-Means/README.md @@ -0,0 +1,261 @@ + +# K-Means klustring + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +I den här lektionen kommer du att lära dig hur man skapar kluster med hjälp av Scikit-learn och den nigerianska musikdatabasen som du importerade tidigare. Vi kommer att gå igenom grunderna i K-Means för klustring. Kom ihåg att, som du lärde dig i den tidigare lektionen, finns det många sätt att arbeta med kluster och metoden du använder beror på din data. Vi kommer att testa K-Means eftersom det är den vanligaste klustringstekniken. Låt oss sätta igång! + +Begrepp du kommer att lära dig om: + +- Silhouettescore +- Elbow-metoden +- Inertia +- Varians + +## Introduktion + +[K-Means klustring](https://wikipedia.org/wiki/K-means_clustering) är en metod som härstammar från signalbehandlingsområdet. Den används för att dela och partitionera grupper av data i 'k' kluster med hjälp av en serie observationer. Varje observation arbetar för att gruppera en given datapunkt närmast dess närmaste 'medelvärde', eller mittpunkten av ett kluster. + +Klustrerna kan visualiseras som [Voronoi-diagram](https://wikipedia.org/wiki/Voronoi_diagram), som inkluderar en punkt (eller 'frö') och dess motsvarande område. + +![voronoi diagram](../../../../5-Clustering/2-K-Means/images/voronoi.png) + +> Infografik av [Jen Looper](https://twitter.com/jenlooper) + +K-Means klustringsprocessen [utförs i tre steg](https://scikit-learn.org/stable/modules/clustering.html#k-means): + +1. Algoritmen väljer k antal mittpunkter genom att ta ett urval från datasetet. Därefter loopar den: + 1. Den tilldelar varje prov till den närmaste mittpunkten. + 2. Den skapar nya mittpunkter genom att ta medelvärdet av alla prover som tilldelats de tidigare mittpunkterna. + 3. Sedan beräknar den skillnaden mellan de nya och gamla mittpunkterna och upprepar tills mittpunkterna stabiliseras. + +En nackdel med att använda K-Means är att du måste fastställa 'k', det vill säga antalet mittpunkter. Lyckligtvis hjälper 'elbow-metoden' till att uppskatta ett bra startvärde för 'k'. Du kommer att testa detta snart. + +## Förutsättningar + +Du kommer att arbeta i den här lektionens [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb)-fil som inkluderar dataimporten och den preliminära datarensningen du gjorde i den förra lektionen. + +## Övning - förberedelse + +Börja med att ta en ny titt på låtdatabasen. + +1. Skapa ett boxplot genom att kalla på `boxplot()` för varje kolumn: + + ```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) + ``` + + Den här datan är lite brusig: genom att observera varje kolumn som ett boxplot kan du se avvikare. + + ![outliers](../../../../5-Clustering/2-K-Means/images/boxplots.png) + +Du skulle kunna gå igenom datasetet och ta bort dessa avvikare, men det skulle göra datan ganska minimal. + +1. För tillfället, välj vilka kolumner du ska använda för din klustringsövning. Välj sådana med liknande intervall och koda kolumnen `artist_top_genre` som numerisk data: + + ```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. Nu behöver du välja hur många kluster du ska rikta in dig på. Du vet att det finns 3 låtgenrer som vi har tagit fram ur datasetet, så låt oss testa med 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 + ``` + +Du ser en array som skrivs ut med förutsagda kluster (0, 1 eller 2) för varje rad i dataramen. + +1. Använd denna array för att beräkna en 'silhouettescore': + + ```python + from sklearn import metrics + score = metrics.silhouette_score(X, y_cluster_kmeans) + score + ``` + +## Silhouettescore + +Sök efter en silhouettescore nära 1. Denna score varierar från -1 till 1, och om scoren är 1 är klustret tätt och väl separerat från andra kluster. Ett värde nära 0 representerar överlappande kluster med prover som ligger mycket nära beslutsgränsen för de närliggande klustren. [(Källa)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam) + +Vår score är **.53**, alltså mitt i mellan. Detta indikerar att vår data inte är särskilt väl lämpad för denna typ av klustring, men låt oss fortsätta. + +### Övning - bygg en modell + +1. Importera `KMeans` och starta klustringsprocessen. + + ```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_) + + ``` + + Det finns några delar här som förtjänar en förklaring. + + > 🎓 range: Detta är iterationerna av klustringsprocessen. + + > 🎓 random_state: "Bestämmer slumpmässig nummergenerering för initialisering av mittpunkter." [Källa](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans) + + > 🎓 WCSS: "within-cluster sums of squares" mäter det kvadrerade genomsnittliga avståndet för alla punkter inom ett kluster till klustrets mittpunkt. [Källa](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce). + + > 🎓 Inertia: K-Means-algoritmer försöker välja mittpunkter för att minimera 'inertia', "ett mått på hur internt sammanhängande kluster är." [Källa](https://scikit-learn.org/stable/modules/clustering.html). Värdet läggs till i wcss-variabeln vid varje iteration. + + > 🎓 k-means++: I [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) kan du använda 'k-means++'-optimering, som "initialiserar mittpunkterna så att de (generellt sett) är långt ifrån varandra, vilket leder till troligen bättre resultat än slumpmässig initialisering." + +### Elbow-metoden + +Tidigare antog du att eftersom du har riktat in dig på 3 låtgenrer, bör du välja 3 kluster. Men är det verkligen så? + +1. Använd 'elbow-metoden' för att vara säker. + + ```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() + ``` + + Använd variabeln `wcss` som du byggde i föregående steg för att skapa ett diagram som visar var 'böjen' i armbågen är, vilket indikerar det optimala antalet kluster. Kanske är det **verkligen** 3! + + ![elbow method](../../../../5-Clustering/2-K-Means/images/elbow.png) + +## Övning - visa klustren + +1. Testa processen igen, den här gången med tre kluster, och visa klustren som ett 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. Kontrollera modellens noggrannhet: + + ```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))) + ``` + + Den här modellens noggrannhet är inte särskilt bra, och formen på klustren ger dig en ledtråd om varför. + + ![clusters](../../../../5-Clustering/2-K-Means/images/clusters.png) + + Den här datan är för obalanserad, för lite korrelerad och det finns för mycket varians mellan kolumnvärdena för att klustras väl. Faktum är att klustren som bildas förmodligen är starkt påverkade eller snedvridna av de tre genrekategorier vi definierade ovan. Det var en lärandeprocess! + + I Scikit-learns dokumentation kan du se att en modell som denna, med kluster som inte är särskilt väl avgränsade, har ett 'varians'-problem: + + ![problem models](../../../../5-Clustering/2-K-Means/images/problems.png) + > Infografik från Scikit-learn + +## Varians + +Varians definieras som "genomsnittet av de kvadrerade skillnaderna från medelvärdet" [(Källa)](https://www.mathsisfun.com/data/standard-deviation.html). I kontexten av detta klustringsproblem hänvisar det till data där siffrorna i vårt dataset tenderar att avvika lite för mycket från medelvärdet. + +✅ Detta är ett bra tillfälle att fundera på alla sätt du kan korrigera detta problem. Justera datan lite mer? Använd andra kolumner? Använd en annan algoritm? Tips: Testa att [skala din data](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) för att normalisera den och testa andra kolumner. + +> Testa denna '[varianskalkylator](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' för att förstå konceptet lite bättre. + +--- + +## 🚀Utmaning + +Tillbringa lite tid med denna notebook och justera parametrar. Kan du förbättra modellens noggrannhet genom att rensa datan mer (till exempel ta bort avvikare)? Du kan använda vikter för att ge mer vikt åt vissa dataprov. Vad mer kan du göra för att skapa bättre kluster? + +Tips: Testa att skala din data. Det finns kommenterad kod i notebooken som lägger till standardisering för att få datakolumnerna att likna varandra mer i termer av intervall. Du kommer att märka att även om silhouettescoren går ner, så jämnas 'böjen' i armbågsdiagrammet ut. Detta beror på att om datan lämnas oskalad tillåts data med mindre varians att väga tyngre. Läs mer om detta problem [här](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/) + +## Granskning & Självstudier + +Ta en titt på en K-Means Simulator [som denna](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Du kan använda detta verktyg för att visualisera exempeldata och bestämma dess mittpunkter. Du kan redigera datans slumpmässighet, antal kluster och antal mittpunkter. Hjälper detta dig att få en idé om hur datan kan grupperas? + +Ta också en titt på [detta handout om K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) från Stanford. + +## Uppgift + +[Testa olika klustringsmetoder](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/5-Clustering/2-K-Means/assignment.md b/translations/sv/5-Clustering/2-K-Means/assignment.md new file mode 100644 index 000000000..4c6e0998c --- /dev/null +++ b/translations/sv/5-Clustering/2-K-Means/assignment.md @@ -0,0 +1,25 @@ + +# Prova olika klustermetoder + +## Instruktioner + +I den här lektionen lärde du dig om K-Means-klustring. Ibland är K-Means inte lämpligt för din data. Skapa en notebook med data antingen från dessa lektioner eller från någon annan källa (ange din källa) och visa en annan klustermetod som INTE använder K-Means. Vad lärde du dig? + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | -------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------- | +| | En notebook presenteras med en väl dokumenterad klustringsmodell | En notebook presenteras utan bra dokumentation och/eller ofullständig | Ofullständigt arbete lämnas in | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/5-Clustering/2-K-Means/solution/Julia/README.md b/translations/sv/5-Clustering/2-K-Means/solution/Julia/README.md new file mode 100644 index 000000000..d6211b52f --- /dev/null +++ b/translations/sv/5-Clustering/2-K-Means/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/5-Clustering/README.md b/translations/sv/5-Clustering/README.md new file mode 100644 index 000000000..a30369d70 --- /dev/null +++ b/translations/sv/5-Clustering/README.md @@ -0,0 +1,42 @@ + +# Klusteringsmodeller för maskininlärning + +Klustring är en maskininlärningsuppgift där man försöker hitta objekt som liknar varandra och gruppera dessa i grupper som kallas kluster. Det som skiljer klustring från andra metoder inom maskininlärning är att processen sker automatiskt. Faktum är att det kan sägas vara motsatsen till övervakad inlärning. + +## Regionalt ämne: klusteringsmodeller för en nigeriansk publik med musiksmak 🎧 + +Nigerias mångsidiga publik har en varierad musiksmak. Med hjälp av data hämtad från Spotify (inspirerad av [denna artikel](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)), ska vi titta på musik som är populär i Nigeria. Denna dataset innehåller information om olika låtars "dansbarhet", "akustik", ljudstyrka, "talighet", popularitet och energi. Det kommer att bli intressant att upptäcka mönster i denna data! + +![En skivspelare](../../../5-Clustering/images/turntable.jpg) + +> Foto av Marcela LaskoskiUnsplash + +I denna serie av lektioner kommer du att upptäcka nya sätt att analysera data med hjälp av klusteringstekniker. Klustring är särskilt användbart när din dataset saknar etiketter. Om den däremot har etiketter kan klassificeringstekniker, som de du lärde dig i tidigare lektioner, vara mer användbara. Men i fall där du vill gruppera oetiketterad data är klustring ett utmärkt sätt att upptäcka mönster. + +> Det finns användbara verktyg med låg kod som kan hjälpa dig att arbeta med klusteringsmodeller. Prova [Azure ML för denna uppgift](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## Lektioner + +1. [Introduktion till klustring](1-Visualize/README.md) +2. [K-Means klustring](2-K-Means/README.md) + +## Krediter + +Dessa lektioner skrevs med 🎶 av [Jen Looper](https://www.twitter.com/jenlooper) med hjälpsamma recensioner av [Rishit Dagli](https://rishit_dagli) och [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan). + +Datasetet [Nigerian Songs](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) hämtades från Kaggle och är baserat på data från Spotify. + +Användbara K-Means-exempel som hjälpte till att skapa denna lektion inkluderar denna [iris-analys](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), denna [introduktionsnotebook](https://www.kaggle.com/prashant111/k-means-clustering-with-python), och detta [hypotetiska NGO-exempel](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering). + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/1-Introduction-to-NLP/README.md b/translations/sv/6-NLP/1-Introduction-to-NLP/README.md new file mode 100644 index 000000000..09f4d3fd9 --- /dev/null +++ b/translations/sv/6-NLP/1-Introduction-to-NLP/README.md @@ -0,0 +1,179 @@ + +# Introduktion till naturlig språkbehandling + +Den här lektionen täcker en kort historik och viktiga koncept inom *naturlig språkbehandling*, ett delområde inom *datorlingvistik*. + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Introduktion + +NLP, som det ofta kallas, är ett av de mest kända områdena där maskininlärning har tillämpats och används i produktionsprogramvara. + +✅ Kan du komma på programvara som du använder dagligen som troligen har någon NLP inbyggd? Vad sägs om dina ordbehandlingsprogram eller mobilappar som du använder regelbundet? + +Du kommer att lära dig om: + +- **Idén om språk**. Hur språk utvecklades och vilka de stora studieområdena har varit. +- **Definition och koncept**. Du kommer också att lära dig definitioner och koncept om hur datorer bearbetar text, inklusive parsning, grammatik och identifiering av substantiv och verb. Det finns några kodningsuppgifter i den här lektionen, och flera viktiga koncept introduceras som du kommer att lära dig att koda senare i de kommande lektionerna. + +## Datorlingvistik + +Datorlingvistik är ett forsknings- och utvecklingsområde som har pågått i många decennier och studerar hur datorer kan arbeta med, och till och med förstå, översätta och kommunicera med språk. Naturlig språkbehandling (NLP) är ett relaterat område som fokuserar på hur datorer kan bearbeta "naturliga", eller mänskliga, språk. + +### Exempel - telefonens diktering + +Om du någonsin har dikterat till din telefon istället för att skriva eller ställt en fråga till en virtuell assistent, har ditt tal konverterats till textform och sedan bearbetats eller *parsats* från det språk du talade. De upptäckta nyckelorden bearbetades sedan till ett format som telefonen eller assistenten kunde förstå och agera på. + +![förståelse](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png) +> Riktig språklig förståelse är svårt! Bild av [Jen Looper](https://twitter.com/jenlooper) + +### Hur är denna teknik möjlig? + +Detta är möjligt eftersom någon har skrivit ett datorprogram för att göra detta. För några decennier sedan förutspådde vissa science fiction-författare att människor mestadels skulle prata med sina datorer och att datorerna alltid skulle förstå exakt vad de menade. Tyvärr visade det sig vara ett svårare problem än många föreställde sig, och även om det är ett mycket bättre förstått problem idag, finns det betydande utmaningar med att uppnå "perfekt" naturlig språkbehandling när det gäller att förstå innebörden av en mening. Detta är särskilt svårt när det gäller att förstå humor eller att upptäcka känslor som sarkasm i en mening. + +Vid det här laget kanske du minns skollektioner där läraren gick igenom grammatikens delar i en mening. I vissa länder lärs grammatik och lingvistik ut som ett dedikerat ämne, men i många ingår dessa ämnen som en del av att lära sig ett språk: antingen ditt första språk i grundskolan (att lära sig läsa och skriva) och kanske ett andra språk i högstadiet eller gymnasiet. Oroa dig inte om du inte är expert på att skilja substantiv från verb eller adverb från adjektiv! + +Om du har svårt med skillnaden mellan *simple present* och *present progressive*, är du inte ensam. Detta är en utmaning för många människor, även modersmålstalare av ett språk. Den goda nyheten är att datorer är riktigt bra på att tillämpa formella regler, och du kommer att lära dig att skriva kod som kan *parsa* en mening lika bra som en människa. Den större utmaningen som du kommer att undersöka senare är att förstå *innebörden* och *känslan* av en mening. + +## Förkunskaper + +För den här lektionen är den huvudsakliga förkunskapen att kunna läsa och förstå språket i den här lektionen. Det finns inga matematiska problem eller ekvationer att lösa. Även om den ursprungliga författaren skrev den här lektionen på engelska, är den också översatt till andra språk, så du kan läsa en översättning. Det finns exempel där ett antal olika språk används (för att jämföra de olika grammatiska reglerna för olika språk). Dessa är *inte* översatta, men den förklarande texten är det, så innebörden bör vara tydlig. + +För kodningsuppgifterna kommer du att använda Python och exemplen använder Python 3.8. + +I det här avsnittet kommer du att behöva och använda: + +- **Python 3 förståelse**. Förståelse för programmeringsspråket Python 3, den här lektionen använder input, loopar, filinläsning, arrayer. +- **Visual Studio Code + tillägg**. Vi kommer att använda Visual Studio Code och dess Python-tillägg. Du kan också använda en Python IDE som du föredrar. +- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) är ett förenklat textbearbetningsbibliotek för Python. Följ instruktionerna på TextBlob-webbplatsen för att installera det på ditt system (installera även corpora, som visas nedan): + + ```bash + pip install -U textblob + python -m textblob.download_corpora + ``` + +> 💡 Tips: Du kan köra Python direkt i VS Code-miljöer. Kolla [dokumentationen](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) för mer information. + +## Att prata med maskiner + +Historien om att försöka få datorer att förstå mänskligt språk går tillbaka flera decennier, och en av de tidigaste forskarna som funderade på naturlig språkbehandling var *Alan Turing*. + +### 'Turingtestet' + +När Turing forskade om *artificiell intelligens* på 1950-talet funderade han på om ett konversationstest kunde ges till en människa och en dator (via skriftlig korrespondens) där människan i konversationen inte var säker på om de samtalade med en annan människa eller en dator. + +Om människan efter en viss längd av konversation inte kunde avgöra om svaren kom från en dator eller inte, kunde datorn då sägas *tänka*? + +### Inspirationen - 'imitationsspelet' + +Idén till detta kom från ett sällskapsspel som kallades *Imitationsspelet* där en förhörsledare är ensam i ett rum och har i uppgift att avgöra vilka av två personer (i ett annat rum) som är man respektive kvinna. Förhörsledaren kan skicka lappar och måste försöka komma på frågor där de skriftliga svaren avslöjar könet på den mystiska personen. Naturligtvis försöker spelarna i det andra rummet lura förhörsledaren genom att svara på frågor på ett sätt som vilseleder eller förvirrar förhörsledaren, samtidigt som de ger intryck av att svara ärligt. + +### Utvecklingen av Eliza + +På 1960-talet utvecklade en MIT-forskare vid namn *Joseph Weizenbaum* [*Eliza*](https://wikipedia.org/wiki/ELIZA), en dator "terapeut" som skulle ställa frågor till människan och ge intryck av att förstå deras svar. Men även om Eliza kunde parsa en mening och identifiera vissa grammatiska konstruktioner och nyckelord för att ge ett rimligt svar, kunde den inte sägas *förstå* meningen. Om Eliza presenterades med en mening som följde formatet "**Jag är** ledsen" kunde den omarrangera och ersätta ord i meningen för att bilda svaret "Hur länge har **du varit** ledsen". + +Detta gav intrycket att Eliza förstod uttalandet och ställde en följdfråga, medan den i verkligheten ändrade tempus och lade till några ord. Om Eliza inte kunde identifiera ett nyckelord som den hade ett svar för, skulle den istället ge ett slumpmässigt svar som kunde vara tillämpligt på många olika uttalanden. Eliza kunde lätt luras, till exempel om en användare skrev "**Du är** en cykel" kunde den svara med "Hur länge har **jag varit** en cykel?", istället för ett mer genomtänkt svar. + +[![Prata med Eliza](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Prata med Eliza") + +> 🎥 Klicka på bilden ovan för en video om det ursprungliga ELIZA-programmet + +> Obs: Du kan läsa den ursprungliga beskrivningen av [Eliza](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) publicerad 1966 om du har ett ACM-konto. Alternativt kan du läsa om Eliza på [wikipedia](https://wikipedia.org/wiki/ELIZA) + +## Övning - koda en enkel konversationsbot + +En konversationsbot, som Eliza, är ett program som tar emot användarinmatning och verkar förstå och svara intelligent. Till skillnad från Eliza kommer vår bot inte att ha flera regler som ger den intrycket av att ha en intelligent konversation. Istället kommer vår bot att ha en enda förmåga, att hålla konversationen igång med slumpmässiga svar som kan fungera i nästan vilken trivial konversation som helst. + +### Planen + +Dina steg när du bygger en konversationsbot: + +1. Skriv ut instruktioner som informerar användaren om hur man interagerar med boten +2. Starta en loop + 1. Ta emot användarinmatning + 2. Om användaren har bett om att avsluta, avsluta + 3. Bearbeta användarinmatning och bestäm svar (i detta fall är svaret ett slumpmässigt val från en lista med möjliga generiska svar) + 4. Skriv ut svar +3. Gå tillbaka till steg 2 + +### Bygga boten + +Låt oss skapa boten nu. Vi börjar med att definiera några fraser. + +1. Skapa den här boten själv i Python med följande slumpmässiga svar: + + ```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?"] + ``` + + Här är ett exempel på utdata för att vägleda dig (användarinmatning är på rader som börjar med `>`): + + ```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! + ``` + + En möjlig lösning på uppgiften finns [här](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py) + + ✅ Stanna upp och fundera + + 1. Tror du att de slumpmässiga svaren skulle "lura" någon att tro att boten faktiskt förstod dem? + 2. Vilka funktioner skulle boten behöva för att vara mer effektiv? + 3. Om en bot verkligen kunde "förstå" innebörden av en mening, skulle den behöva "komma ihåg" innebörden av tidigare meningar i en konversation också? + +--- + +## 🚀Utmaning + +Välj ett av elementen ovan under "stanna upp och fundera" och försök antingen implementera det i kod eller skriv en lösning på papper med pseudokod. + +I nästa lektion kommer du att lära dig om ett antal andra metoder för att parsa naturligt språk och maskininlärning. + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Ta en titt på referenserna nedan som ytterligare läsmöjligheter. + +### Referenser + +1. Schubert, Lenhart, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = . +2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010. + +## Uppgift + +[Sök efter en bot](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/1-Introduction-to-NLP/assignment.md b/translations/sv/6-NLP/1-Introduction-to-NLP/assignment.md new file mode 100644 index 000000000..aaad9aa50 --- /dev/null +++ b/translations/sv/6-NLP/1-Introduction-to-NLP/assignment.md @@ -0,0 +1,25 @@ + +# Sök efter en bot + +## Instruktioner + +Botar finns överallt. Din uppgift: hitta en och adoptera den! Du kan hitta dem på webbplatser, i bankapplikationer och via telefon, till exempel när du ringer finansiella tjänsteföretag för rådgivning eller kontoinformation. Analysera boten och se om du kan förvirra den. Om du lyckas förvirra boten, varför tror du att det hände? Skriv en kort uppsats om din upplevelse. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ----------------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------- | +| | En hel sida är skriven, som förklarar den förmodade botarkitekturen och beskriver din upplevelse med den | En uppsats är ofullständig eller inte väl underbyggd | Ingen uppsats lämnas in | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiska översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/2-Tasks/README.md b/translations/sv/6-NLP/2-Tasks/README.md new file mode 100644 index 000000000..66added8c --- /dev/null +++ b/translations/sv/6-NLP/2-Tasks/README.md @@ -0,0 +1,228 @@ + +# Vanliga uppgifter och tekniker inom naturlig språkbehandling + +För de flesta *uppgifter inom naturlig språkbehandling* måste texten som ska bearbetas brytas ner, analyseras och resultaten lagras eller jämföras med regler och dataset. Dessa uppgifter gör det möjligt för programmeraren att härleda _meningen_ eller _avsikten_ eller bara _frekvensen_ av termer och ord i en text. + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +Låt oss utforska vanliga tekniker som används för att bearbeta text. Kombinerat med maskininlärning hjälper dessa tekniker dig att analysera stora mängder text effektivt. Innan du tillämpar ML på dessa uppgifter, låt oss förstå de problem som en NLP-specialist stöter på. + +## Vanliga uppgifter inom NLP + +Det finns olika sätt att analysera en text du arbetar med. Det finns uppgifter du kan utföra, och genom dessa uppgifter kan du få en förståelse för texten och dra slutsatser. Du utför vanligtvis dessa uppgifter i en sekvens. + +### Tokenisering + +Förmodligen det första de flesta NLP-algoritmer måste göra är att dela upp texten i tokens, eller ord. Även om detta låter enkelt kan det bli knepigt att ta hänsyn till skiljetecken och olika språks ord- och meningsavgränsare. Du kan behöva använda olika metoder för att bestämma avgränsningar. + +![tokenisering](../../../../6-NLP/2-Tasks/images/tokenization.png) +> Tokenisering av en mening från **Stolthet och fördom**. Infografik av [Jen Looper](https://twitter.com/jenlooper) + +### Embeddingar + +[Word embeddings](https://wikipedia.org/wiki/Word_embedding) är ett sätt att konvertera din textdata till numeriska värden. Embeddingar görs på ett sätt så att ord med liknande betydelse eller ord som används tillsammans grupperas. + +![word embeddings](../../../../6-NLP/2-Tasks/images/embedding.png) +> "Jag har den största respekt för dina nerver, de är mina gamla vänner." - Word embeddings för en mening i **Stolthet och fördom**. Infografik av [Jen Looper](https://twitter.com/jenlooper) + +✅ Prova [detta intressanta verktyg](https://projector.tensorflow.org/) för att experimentera med word embeddings. Genom att klicka på ett ord visas kluster av liknande ord: 'leksak' grupperas med 'disney', 'lego', 'playstation' och 'konsol'. + +### Parsing & Part-of-speech Tagging + +Varje ord som har tokeniserats kan taggas som en del av talet - ett substantiv, verb eller adjektiv. Meningen `den snabba röda räven hoppade över den lata bruna hunden` kan POS-taggas som räv = substantiv, hoppade = verb. + +![parsing](../../../../6-NLP/2-Tasks/images/parse.png) + +> Parsing av en mening från **Stolthet och fördom**. Infografik av [Jen Looper](https://twitter.com/jenlooper) + +Parsing innebär att känna igen vilka ord som är relaterade till varandra i en mening - till exempel `den snabba röda räven hoppade` är en adjektiv-substantiv-verb-sekvens som är separat från sekvensen `den lata bruna hunden`. + +### Ord- och frasfrekvenser + +En användbar procedur vid analys av en stor textmassa är att bygga en ordlista över varje ord eller fras av intresse och hur ofta det förekommer. Frasen `den snabba röda räven hoppade över den lata bruna hunden` har en ordfrekvens på 2 för ordet "den". + +Låt oss titta på ett exempel där vi räknar frekvensen av ord. Rudyard Kiplings dikt "The Winners" innehåller följande vers: + +```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. +``` + +Eftersom frasfrekvenser kan vara skiftlägeskänsliga eller skiftlägesokänsliga efter behov, har frasen `en vän` en frekvens på 2 och `den` har en frekvens på 6, och `reser` är 2. + +### N-grams + +En text kan delas upp i sekvenser av ord med en viss längd, ett enda ord (unigram), två ord (bigram), tre ord (trigram) eller valfritt antal ord (n-grams). + +Till exempel `den snabba röda räven hoppade över den lata bruna hunden` med ett n-gram-värde på 2 producerar följande n-grams: + +1. den snabba +2. snabba röda +3. röda räven +4. räven hoppade +5. hoppade över +6. över den +7. den lata +8. lata bruna +9. bruna hunden + +Det kan vara lättare att visualisera det som en glidande ruta över meningen. Här är det för n-grams med 3 ord, n-grammet är fetstil i varje mening: + +1. **den snabba röda** räven hoppade över den lata bruna hunden +2. den **snabba röda räven** hoppade över den lata bruna hunden +3. den snabba **röda räven hoppade** över den lata bruna hunden +4. den snabba röda **räven hoppade över** den lata bruna hunden +5. den snabba röda räven **hoppade över den** lata bruna hunden +6. den snabba röda räven hoppade **över den lata** bruna hunden +7. den snabba röda räven hoppade över **den lata bruna** hunden +8. den snabba röda räven hoppade över den **lata bruna hunden** + +![n-grams glidande ruta](../../../../6-NLP/2-Tasks/images/n-grams.gif) + +> N-gram-värde på 3: Infografik av [Jen Looper](https://twitter.com/jenlooper) + +### Substantivfrasextraktion + +I de flesta meningar finns det ett substantiv som är subjekt eller objekt i meningen. På engelska kan det ofta identifieras genom att det föregås av 'a', 'an' eller 'the'. Att identifiera subjektet eller objektet i en mening genom att 'extrahera substantivfrasen' är en vanlig uppgift inom NLP när man försöker förstå meningen i en mening. + +✅ I meningen "Jag kan inte bestämma mig för timmen, eller platsen, eller utseendet eller orden, som lade grunden. Det är för länge sedan. Jag var mitt i det innan jag visste att jag hade börjat.", kan du identifiera substantivfraserna? + +I meningen `den snabba röda räven hoppade över den lata bruna hunden` finns det 2 substantivfraser: **snabba röda räven** och **lata bruna hunden**. + +### Sentimentanalys + +En mening eller text kan analyseras för sentiment, eller hur *positiv* eller *negativ* den är. Sentiment mäts i *polaritet* och *objektivitet/subjektivitet*. Polaritet mäts från -1,0 till 1,0 (negativ till positiv) och 0,0 till 1,0 (mest objektiv till mest subjektiv). + +✅ Senare kommer du att lära dig att det finns olika sätt att bestämma sentiment med hjälp av maskininlärning, men ett sätt är att ha en lista med ord och fraser som kategoriseras som positiva eller negativa av en mänsklig expert och tillämpa den modellen på text för att beräkna ett polaritetsvärde. Kan du se hur detta skulle fungera i vissa fall och mindre bra i andra? + +### Böjning + +Böjning gör det möjligt att ta ett ord och få dess singular eller plural. + +### Lemmatization + +En *lemma* är grundformen eller huvudordet för en uppsättning ord, till exempel *flög*, *flyger*, *flygande* har en lemma av verbet *flyga*. + +Det finns också användbara databaser tillgängliga för NLP-forskare, särskilt: + +### WordNet + +[WordNet](https://wordnet.princeton.edu/) är en databas med ord, synonymer, antonymer och många andra detaljer för varje ord på många olika språk. Det är otroligt användbart när man försöker bygga översättningar, stavningskontroller eller språkliga verktyg av alla slag. + +## NLP-bibliotek + +Som tur är behöver du inte bygga alla dessa tekniker själv, eftersom det finns utmärkta Python-bibliotek som gör det mycket mer tillgängligt för utvecklare som inte är specialiserade på naturlig språkbehandling eller maskininlärning. De kommande lektionerna innehåller fler exempel på dessa, men här kommer du att lära dig några användbara exempel för att hjälpa dig med nästa uppgift. + +### Övning - använda biblioteket `TextBlob` + +Låt oss använda ett bibliotek som heter TextBlob eftersom det innehåller användbara API:er för att hantera dessa typer av uppgifter. TextBlob "står på de gigantiska axlarna av [NLTK](https://nltk.org) och [pattern](https://github.com/clips/pattern), och fungerar bra med båda." Det har en betydande mängd ML inbäddad i sitt API. + +> Obs: En användbar [Quick Start](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) guide är tillgänglig för TextBlob som rekommenderas för erfarna Python-utvecklare. + +När du försöker identifiera *substantivfraser* erbjuder TextBlob flera alternativ för att hitta substantivfraser. + +1. Ta en titt på `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 + ``` + + > Vad händer här? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) är "En substantivfrasextraktor som använder chunk parsing tränad med ConLL-2000 träningskorpus." ConLL-2000 hänvisar till 2000 års konferens om Computational Natural Language Learning. Varje år höll konferensen en workshop för att hantera ett svårt NLP-problem, och 2000 var det substantivchunking. En modell tränades på Wall Street Journal, med "sektionerna 15-18 som träningsdata (211727 tokens) och sektion 20 som testdata (47377 tokens)". Du kan titta på de procedurer som användes [här](https://www.clips.uantwerpen.be/conll2000/chunking/) och [resultaten](https://ifarm.nl/erikt/research/np-chunking.html). + +### Utmaning - förbättra din bot med NLP + +I den föregående lektionen byggde du en mycket enkel Q&A-bot. Nu ska du göra Marvin lite mer sympatisk genom att analysera din input för sentiment och skriva ut ett svar som matchar sentimentet. Du måste också identifiera en `substantivfras` och fråga om den. + +Dina steg när du bygger en bättre konversationsbot: + +1. Skriv instruktioner som informerar användaren om hur man interagerar med boten +2. Starta loop + 1. Acceptera användarens input + 2. Om användaren har bett om att avsluta, avsluta + 3. Bearbeta användarens input och bestäm lämpligt sentiment-svar + 4. Om en substantivfras upptäcks i sentimentet, pluralisera den och fråga om mer input om det ämnet + 5. Skriv ut svar +3. Gå tillbaka till steg 2 + +Här är kodsnutten för att bestämma sentiment med TextBlob. Observera att det bara finns fyra *graderingar* av sentiment-svar (du kan ha fler om du vill): + +```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. " +``` + +Här är ett exempel på output för att guida dig (användarens input är på rader som börjar med >): + +```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! +``` + +En möjlig lösning på uppgiften finns [här](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py) + +✅ Kunskapskontroll + +1. Tror du att de sympatiska svaren skulle 'lura' någon att tro att boten faktiskt förstod dem? +2. Gör identifieringen av substantivfrasen boten mer 'trovärdig'? +3. Varför skulle det vara användbart att extrahera en 'substantivfras' från en mening? + +--- + +Implementera boten i den tidigare kunskapskontrollen och testa den på en vän. Kan den lura dem? Kan du göra din bot mer 'trovärdig'? + +## 🚀Utmaning + +Ta en uppgift från den tidigare kunskapskontrollen och försök implementera den. Testa boten på en vän. Kan den lura dem? Kan du göra din bot mer 'trovärdig'? + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +I de kommande lektionerna kommer du att lära dig mer om sentimentanalys. Undersök denna intressanta teknik i artiklar som dessa på [KDNuggets](https://www.kdnuggets.com/tag/nlp) + +## Uppgift + +[Få en bot att svara](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/2-Tasks/assignment.md b/translations/sv/6-NLP/2-Tasks/assignment.md new file mode 100644 index 000000000..872e24418 --- /dev/null +++ b/translations/sv/6-NLP/2-Tasks/assignment.md @@ -0,0 +1,25 @@ + +# Få en bot att svara tillbaka + +## Instruktioner + +I de senaste lektionerna programmerade du en enkel bot att chatta med. Den här boten ger slumpmässiga svar tills du säger 'hej då'. Kan du göra svaren lite mindre slumpmässiga och trigga specifika svar om du säger saker som 'varför' eller 'hur'? Fundera lite på hur maskininlärning skulle kunna göra detta arbete mindre manuellt när du utvecklar din bot. Du kan använda biblioteken NLTK eller TextBlob för att underlätta dina uppgifter. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | --------------------------------------------- | ------------------------------------------------ | ----------------------- | +| | En ny bot.py-fil presenteras och är dokumenterad | En ny bot-fil presenteras men innehåller buggar | Ingen fil presenteras | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/3-Translation-Sentiment/README.md b/translations/sv/6-NLP/3-Translation-Sentiment/README.md new file mode 100644 index 000000000..a6422f84e --- /dev/null +++ b/translations/sv/6-NLP/3-Translation-Sentiment/README.md @@ -0,0 +1,200 @@ + +# Översättning och sentimentanalys med ML + +I de tidigare lektionerna lärde du dig att bygga en grundläggande bot med hjälp av `TextBlob`, ett bibliotek som använder maskininlärning bakom kulisserna för att utföra grundläggande NLP-uppgifter som att extrahera substantivfraser. En annan viktig utmaning inom datalingvistik är att korrekt _översätta_ en mening från ett talat eller skrivet språk till ett annat. + +## [Förtest](https://ff-quizzes.netlify.app/en/ml/) + +Översättning är ett mycket svårt problem, förvärrat av det faktum att det finns tusentals språk, alla med mycket olika grammatiska regler. En metod är att omvandla de formella grammatiska reglerna för ett språk, som engelska, till en språkoberoende struktur och sedan översätta tillbaka till ett annat språk. Denna metod innebär att du skulle ta följande steg: + +1. **Identifiering**. Identifiera eller tagga orden i ingångsspråket som substantiv, verb etc. +2. **Skapa översättning**. Producera en direkt översättning av varje ord i målformatet för det andra språket. + +### Exempelfras, engelska till iriska + +På 'engelska' är meningen _I feel happy_ tre ord i ordningen: + +- **subjekt** (I) +- **verb** (feel) +- **adjektiv** (happy) + +Men på 'iriska' har samma mening en mycket annorlunda grammatisk struktur – känslor som "*happy*" eller "*sad*" uttrycks som att de är *på* dig. + +Den engelska frasen `I feel happy` skulle på iriska vara `Tá athas orm`. En *bokstavlig* översättning skulle vara `Happy is upon me`. + +En irisktalande som översätter till engelska skulle säga `I feel happy`, inte `Happy is upon me`, eftersom de förstår meningen med meningen, även om orden och meningsstrukturen är olika. + +Den formella ordningen för meningen på iriska är: + +- **verb** (Tá eller is) +- **adjektiv** (athas, eller happy) +- **subjekt** (orm, eller upon me) + +## Översättning + +Ett naivt översättningsprogram kanske bara översätter ord och ignorerar meningsstrukturen. + +✅ Om du har lärt dig ett andra (eller tredje eller fler) språk som vuxen, kanske du började med att tänka på ditt modersmål, översätta ett koncept ord för ord i huvudet till det andra språket och sedan säga din översättning högt. Detta liknar vad naiva översättningsprogram för datorer gör. Det är viktigt att komma förbi denna fas för att uppnå flyt! + +Naiv översättning leder till dåliga (och ibland roliga) felöversättningar: `I feel happy` översätts bokstavligen till `Mise bhraitheann athas` på iriska. Det betyder (bokstavligen) `me feel happy` och är inte en giltig irisk mening. Även om engelska och iriska är språk som talas på två närliggande öar, är de mycket olika språk med olika grammatiska strukturer. + +> Du kan titta på några videor om iriska språktraditioner, som [den här](https://www.youtube.com/watch?v=mRIaLSdRMMs) + +### Maskininlärningsmetoder + +Hittills har du lärt dig om den formella regeltillvägagångssättet för naturlig språkbehandling. Ett annat tillvägagångssätt är att ignorera ordens betydelse och _istället använda maskininlärning för att upptäcka mönster_. Detta kan fungera vid översättning om du har mycket text (en *korpus*) eller texter (*korpora*) på både ursprungs- och målspråket. + +Till exempel, tänk på fallet med *Pride and Prejudice*, en välkänd engelsk roman skriven av Jane Austen 1813. Om du konsulterar boken på engelska och en mänsklig översättning av boken till *franska*, kan du upptäcka fraser i den ena som är _idiomatiskt_ översatta till den andra. Det ska du göra om en stund. + +Till exempel, när en engelsk fras som `I have no money` översätts bokstavligen till franska, kan det bli `Je n'ai pas de monnaie`. "Monnaie" är en knepig fransk 'falsk vän', eftersom 'money' och 'monnaie' inte är synonymer. En bättre översättning som en människa skulle kunna göra är `Je n'ai pas d'argent`, eftersom det bättre förmedlar betydelsen att du inte har några pengar (snarare än 'växel' som är betydelsen av 'monnaie'). + +![monnaie](../../../../6-NLP/3-Translation-Sentiment/images/monnaie.png) + +> Bild av [Jen Looper](https://twitter.com/jenlooper) + +Om en ML-modell har tillräckligt många mänskliga översättningar att bygga en modell på, kan den förbättra översättningens noggrannhet genom att identifiera vanliga mönster i texter som tidigare har översatts av experttalare av båda språken. + +### Övning - översättning + +Du kan använda `TextBlob` för att översätta meningar. Prova den berömda första raden i **Pride and Prejudice**: + +```python +from textblob import TextBlob + +blob = TextBlob( + "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!" +) +print(blob.translate(to="fr")) + +``` + +`TextBlob` gör ett ganska bra jobb med översättningen: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!". + +Det kan hävdas att TextBlobs översättning är mycket mer exakt än den franska översättningen från 1932 av V. Leconte och Ch. Pressoir: + +"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles." + +I detta fall gör den ML-baserade översättningen ett bättre jobb än den mänskliga översättaren, som onödigt lägger ord i den ursprungliga författarens mun för 'tydlighet'. + +> Vad händer här? Och varför är TextBlob så bra på översättning? Jo, bakom kulisserna använder den Google Translate, en sofistikerad AI som kan analysera miljontals fraser för att förutsäga de bästa strängarna för uppgiften. Det finns inget manuellt arbete här, och du behöver en internetanslutning för att använda `blob.translate`. + +✅ Prova några fler meningar. Vilken är bättre, ML eller mänsklig översättning? I vilka fall? + +## Sentimentanalys + +Ett annat område där maskininlärning kan fungera mycket bra är sentimentanalys. Ett icke-ML-tillvägagångssätt för sentiment är att identifiera ord och fraser som är 'positiva' och 'negativa'. Sedan, givet en ny text, beräkna det totala värdet av de positiva, negativa och neutrala orden för att identifiera det övergripande sentimentet. + +Detta tillvägagångssätt är lätt att lura, som du kanske har sett i Marvin-uppgiften – meningen `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` är en sarkastisk, negativ mening, men den enkla algoritmen upptäcker 'great', 'wonderful', 'glad' som positiva och 'waste', 'lost' och 'dark' som negativa. Det övergripande sentimentet påverkas av dessa motstridiga ord. + +✅ Stanna upp en stund och fundera på hur vi som människor förmedlar sarkasm. Tonfallet spelar en stor roll. Försök att säga frasen "Well, that film was awesome" på olika sätt för att upptäcka hur din röst förmedlar betydelse. + +### ML-metoder + +ML-tillvägagångssättet skulle vara att manuellt samla negativa och positiva textkroppar – tweets, filmrecensioner eller något annat där en människa har gett ett betyg *och* en skriftlig åsikt. Sedan kan NLP-tekniker tillämpas på åsikter och betyg, så att mönster framträder (t.ex. positiva filmrecensioner tenderar att innehålla frasen 'Oscar worthy' oftare än negativa filmrecensioner, eller positiva restaurangrecensioner säger 'gourmet' mycket oftare än 'disgusting'). + +> ⚖️ **Exempel**: Om du arbetade på en politikers kontor och det fanns en ny lag som diskuterades, kanske väljare skrev till kontoret med e-post som stödjer eller motsätter sig den nya lagen. Låt oss säga att du fick i uppdrag att läsa e-posten och sortera dem i två högar, *för* och *emot*. Om det fanns många e-postmeddelanden kanske du skulle känna dig överväldigad av att försöka läsa alla. Skulle det inte vara trevligt om en bot kunde läsa dem åt dig, förstå dem och berätta i vilken hög varje e-postmeddelande hörde hemma? +> +> Ett sätt att uppnå detta är att använda maskininlärning. Du skulle träna modellen med en del av *emot*-e-posten och en del av *för*-e-posten. Modellen skulle tendera att associera fraser och ord med emot-sidan och för-sidan, *men den skulle inte förstå något av innehållet*, bara att vissa ord och mönster var mer sannolika att dyka upp i en *emot*- eller en *för*-e-post. Du skulle kunna testa den med några e-postmeddelanden som du inte hade använt för att träna modellen och se om den kom till samma slutsats som du gjorde. Sedan, när du var nöjd med modellens noggrannhet, skulle du kunna bearbeta framtida e-postmeddelanden utan att behöva läsa varje enskilt. + +✅ Låter denna process som processer du har använt i tidigare lektioner? + +## Övning - sentimentala meningar + +Sentiment mäts med en *polaritet* från -1 till 1, där -1 är det mest negativa sentimentet och 1 är det mest positiva. Sentiment mäts också med en 0 - 1-skala för objektivitet (0) och subjektivitet (1). + +Titta igen på Jane Austens *Pride and Prejudice*. Texten finns här på [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm). Exemplet nedan visar ett kort program som analyserar sentimentet i första och sista meningarna från boken och visar dess sentimentpolaritet och subjektivitets-/objektivitetsvärde. + +Du bör använda `TextBlob`-biblioteket (beskrivet ovan) för att bestämma `sentiment` (du behöver inte skriva din egen sentimentkalkylator) i följande uppgift. + +```python +from textblob import TextBlob + +quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.""" + +quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them.""" + +sentiment1 = TextBlob(quote1).sentiment +sentiment2 = TextBlob(quote2).sentiment + +print(quote1 + " has a sentiment of " + str(sentiment1)) +print(quote2 + " has a sentiment of " + str(sentiment2)) +``` + +Du ser följande utdata: + +```output +It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146) + +Darcy, as well as Elizabeth, really loved them; and they were + both ever sensible of the warmest gratitude towards the persons + who, by bringing her into Derbyshire, had been the means of + uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8) +``` + +## Utmaning - kontrollera sentimentpolaritet + +Din uppgift är att avgöra, med hjälp av sentimentpolaritet, om *Pride and Prejudice* har fler absolut positiva meningar än absolut negativa. För denna uppgift kan du anta att ett polaritetsvärde på 1 eller -1 är absolut positivt eller negativt. + +**Steg:** + +1. Ladda ner en [kopia av Pride and Prejudice](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) från Project Gutenberg som en .txt-fil. Ta bort metadata i början och slutet av filen, så att endast originaltexten återstår. +2. Öppna filen i Python och extrahera innehållet som en sträng. +3. Skapa en TextBlob med boksträngen. +4. Analysera varje mening i boken i en loop. + 1. Om polariteten är 1 eller -1, lagra meningen i en array eller lista med positiva eller negativa meddelanden. +5. I slutet, skriv ut alla positiva meningar och negativa meningar (separat) och antalet av varje. + +Här är en [lösning](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb). + +✅ Kunskapskontroll + +1. Sentimentet baseras på ord som används i meningen, men *förstår* koden orden? +2. Tycker du att sentimentpolariteten är korrekt, eller med andra ord, håller du *med* om poängen? + 1. Håller du i synnerhet med eller inte med den absoluta **positiva** polariteten i följande meningar? + * “What an excellent father you have, girls!” said she, when the door was shut. + * “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect. + * How wonderfully these sort of things occur! + * I have the greatest dislike in the world to that sort of thing. + * Charlotte is an excellent manager, I dare say. + * “This is delightful indeed! + * I am so happy! + * Your idea of the ponies is delightful. + 2. De nästa tre meningarna fick en absolut positiv sentiment, men vid närmare granskning är de inte positiva meningar. Varför trodde sentimentanalysen att de var positiva meningar? + * Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power. + * If I could but see you as happy! + * Our distress, my dear Lizzy, is very great. + 3. Håller du med eller inte med den absoluta **negativa** polariteten i följande meningar? + - Everybody is disgusted with his pride. + - “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful. + - The pause was to Elizabeth’s feelings dreadful. + - It would be dreadful! + +✅ Alla som är förtjusta i Jane Austen förstår att hon ofta använder sina böcker för att kritisera de mer löjliga aspekterna av det engelska regentsamhället. Elizabeth Bennett, huvudpersonen i *Pride and Prejudice*, är en skarp social observatör (som författaren) och hennes språk är ofta starkt nyanserat. Till och med Mr. Darcy (kärleksintresset i berättelsen) noterar Elizabeths lekfulla och retfulla användning av språket: "I have had the pleasure of your acquaintance long enough to know that you find great enjoyment in occasionally professing opinions which in fact are not your own." + +--- + +## 🚀Utmaning + +Kan du göra Marvin ännu bättre genom att extrahera andra funktioner från användarinmatningen? + +## [Eftertest](https://ff-quizzes.netlify.app/en/ml/) + +## Recension & Självstudier +Det finns många sätt att extrahera sentiment från text. Tänk på de affärsapplikationer som kan dra nytta av denna teknik. Fundera på hur det kan gå fel. Läs mer om sofistikerade företagsklara system som analyserar sentiment, såsom [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott). Testa några av meningarna från Stolthet och fördom ovan och se om det kan upptäcka nyanser. + +## Uppgift + +[Poetisk frihet](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/3-Translation-Sentiment/assignment.md b/translations/sv/6-NLP/3-Translation-Sentiment/assignment.md new file mode 100644 index 000000000..871d8bf0a --- /dev/null +++ b/translations/sv/6-NLP/3-Translation-Sentiment/assignment.md @@ -0,0 +1,25 @@ + +# Poetisk frihet + +## Instruktioner + +I [denna notebook](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) hittar du över 500 dikter av Emily Dickinson som tidigare har analyserats för sentiment med hjälp av Azure textanalys. Använd detta dataset och analysera det med de tekniker som beskrivs i lektionen. Stämmer det föreslagna sentimentet i en dikt överens med det mer avancerade beslutet från Azure-tjänsten? Varför eller varför inte, enligt din åsikt? Är det något som förvånar dig? + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------ | +| | En notebook presenteras med en gedigen analys av ett författarprov | Notebooken är ofullständig eller utför ingen analys | Ingen notebook presenteras | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/3-Translation-Sentiment/solution/Julia/README.md b/translations/sv/6-NLP/3-Translation-Sentiment/solution/Julia/README.md new file mode 100644 index 000000000..f85b8924e --- /dev/null +++ b/translations/sv/6-NLP/3-Translation-Sentiment/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/3-Translation-Sentiment/solution/R/README.md b/translations/sv/6-NLP/3-Translation-Sentiment/solution/R/README.md new file mode 100644 index 000000000..e679dc9e9 --- /dev/null +++ b/translations/sv/6-NLP/3-Translation-Sentiment/solution/R/README.md @@ -0,0 +1,15 @@ + +detta är en tillfällig platshållare + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/4-Hotel-Reviews-1/README.md b/translations/sv/6-NLP/4-Hotel-Reviews-1/README.md new file mode 100644 index 000000000..4902d0b73 --- /dev/null +++ b/translations/sv/6-NLP/4-Hotel-Reviews-1/README.md @@ -0,0 +1,417 @@ + +# Sentimentanalys med hotellrecensioner - bearbetning av data + +I den här sektionen kommer du att använda tekniker från tidigare lektioner för att utföra en utforskande dataanalys av en stor dataset. När du har fått en bra förståelse för användbarheten av de olika kolumnerna kommer du att lära dig: + +- hur man tar bort onödiga kolumner +- hur man beräknar ny data baserat på befintliga kolumner +- hur man sparar den resulterande datasetet för användning i den slutliga utmaningen + +## [Förtest innan lektionen](https://ff-quizzes.netlify.app/en/ml/) + +### Introduktion + +Hittills har du lärt dig att textdata skiljer sig mycket från numeriska datatyper. Om texten är skriven eller talad av en människa kan den analyseras för att hitta mönster, frekvenser, känslor och betydelser. Den här lektionen tar dig in i en verklig dataset med en verklig utmaning: **[515K hotellrecensioner i Europa](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)** som inkluderar en [CC0: Public Domain-licens](https://creativecommons.org/publicdomain/zero/1.0/). Datasetet har hämtats från Booking.com från offentliga källor. Skaparen av datasetet är Jiashen Liu. + +### Förberedelser + +Du behöver: + +* Möjligheten att köra .ipynb-notebooks med Python 3 +* pandas +* NLTK, [som du bör installera lokalt](https://www.nltk.org/install.html) +* Datasetet som finns tillgängligt på Kaggle [515K hotellrecensioner i Europa](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe). Det är cirka 230 MB när det är uppackat. Ladda ner det till rotmappen `/data` som är kopplad till dessa NLP-lektioner. + +## Utforskande dataanalys + +Den här utmaningen utgår från att du bygger en hotellrekommendationsbot med hjälp av sentimentanalys och gästrecensioner. Datasetet du kommer att använda innehåller recensioner av 1493 olika hotell i 6 städer. + +Med hjälp av Python, ett dataset med hotellrecensioner och NLTK:s sentimentanalys kan du ta reda på: + +* Vilka är de mest frekvent använda orden och fraserna i recensionerna? +* Korrelerar de officiella *taggarna* som beskriver ett hotell med recensionsbetygen (t.ex. är de mer negativa recensionerna för ett visst hotell från *Familj med små barn* än från *Ensamresenär*, vilket kanske indikerar att det är bättre för *Ensamresenärer*)? +* Stämmer NLTK:s sentimentbetyg överens med hotellrecensentens numeriska betyg? + +#### Dataset + +Låt oss utforska datasetet som du har laddat ner och sparat lokalt. Öppna filen i en editor som VS Code eller till och med Excel. + +Rubrikerna i datasetet är följande: + +*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* + +Här är de grupperade på ett sätt som kan vara lättare att granska: +##### Hotellkolumner + +* `Hotel_Name`, `Hotel_Address`, `lat` (latitud), `lng` (longitud) + * Med hjälp av *lat* och *lng* kan du plotta en karta med Python som visar hotellens platser (kanske färgkodade för negativa och positiva recensioner) + * Hotel_Address är inte uppenbart användbar för oss, och vi kommer förmodligen att ersätta den med ett land för enklare sortering och sökning + +**Meta-recensionskolumner för hotell** + +* `Average_Score` + * Enligt datasetets skapare är denna kolumn *Genomsnittsbetyget för hotellet, beräknat baserat på den senaste kommentaren under det senaste året*. Detta verkar vara ett ovanligt sätt att beräkna betyget, men eftersom det är data som hämtats kan vi för tillfället ta det för vad det är. + + ✅ Baserat på de andra kolumnerna i denna data, kan du tänka dig ett annat sätt att beräkna genomsnittsbetyget? + +* `Total_Number_of_Reviews` + * Det totala antalet recensioner som detta hotell har fått - det är inte klart (utan att skriva lite kod) om detta hänvisar till recensionerna i datasetet. +* `Additional_Number_of_Scoring` + * Detta betyder att ett recensionsbetyg gavs men ingen positiv eller negativ recension skrevs av recensenten + +**Recensionskolumner** + +- `Reviewer_Score` + - Detta är ett numeriskt värde med högst 1 decimal mellan min- och maxvärdena 2,5 och 10 + - Det förklaras inte varför 2,5 är det lägsta möjliga betyget +- `Negative_Review` + - Om en recensent inte skrev något kommer detta fält att ha "**No Negative**" + - Observera att en recensent kan skriva en positiv recension i kolumnen för negativa recensioner (t.ex. "there is nothing bad about this hotel") +- `Review_Total_Negative_Word_Counts` + - Högre antal negativa ord indikerar ett lägre betyg (utan att kontrollera sentimentet) +- `Positive_Review` + - Om en recensent inte skrev något kommer detta fält att ha "**No Positive**" + - Observera att en recensent kan skriva en negativ recension i kolumnen för positiva recensioner (t.ex. "there is nothing good about this hotel at all") +- `Review_Total_Positive_Word_Counts` + - Högre antal positiva ord indikerar ett högre betyg (utan att kontrollera sentimentet) +- `Review_Date` och `days_since_review` + - Ett mått på färskhet eller ålder kan tillämpas på en recension (äldre recensioner kanske inte är lika exakta som nyare eftersom hotellledningen kan ha ändrats, renoveringar kan ha gjorts, en pool kan ha lagts till etc.) +- `Tags` + - Dessa är korta beskrivningar som en recensent kan välja för att beskriva vilken typ av gäst de var (t.ex. ensam eller familj), vilken typ av rum de hade, vistelsens längd och hur recensionen skickades in. + - Tyvärr är användningen av dessa taggar problematisk, se avsnittet nedan som diskuterar deras användbarhet + +**Recensentkolumner** + +- `Total_Number_of_Reviews_Reviewer_Has_Given` + - Detta kan vara en faktor i en rekommendationsmodell, till exempel om du kan avgöra att mer produktiva recensenter med hundratals recensioner var mer benägna att vara negativa än positiva. Dock identifieras inte recensenten av en unik kod, och kan därför inte kopplas till en uppsättning recensioner. Det finns 30 recensenter med 100 eller fler recensioner, men det är svårt att se hur detta kan hjälpa rekommendationsmodellen. +- `Reviewer_Nationality` + - Vissa kanske tror att vissa nationaliteter är mer benägna att ge en positiv eller negativ recension på grund av en nationell benägenhet. Var försiktig med att bygga in sådana anekdotiska uppfattningar i dina modeller. Dessa är nationella (och ibland rasliga) stereotyper, och varje recensent var en individ som skrev en recension baserad på sin upplevelse. Den kan ha filtrerats genom många linser som deras tidigare hotellvistelser, avståndet de rest och deras personliga temperament. Att tro att deras nationalitet var orsaken till ett recensionsbetyg är svårt att rättfärdiga. + +##### Exempel + +| Genomsnittligt betyg | Totalt antal recensioner | Recensentens betyg | Negativ
            Recension | Positiv recension | Taggar | +| -------------------- | ------------------------ | ------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- | +| 7.8 | 1945 | 2.5 | Detta är för närvarande inte ett hotell utan en byggarbetsplats Jag blev terroriserad från tidig morgon och hela dagen med oacceptabelt byggbuller medan jag vilade efter en lång resa och arbetade i rummet Folk arbetade hela dagen dvs med tryckluftsborrar i angränsande rum Jag bad om att få byta rum men inget tyst rum var tillgängligt För att göra saken värre blev jag överdebiterad Jag checkade ut på kvällen eftersom jag var tvungen att lämna mycket tidigt och fick en korrekt faktura En dag senare gjorde hotellet en annan debitering utan mitt samtycke över det bokade priset Det är ett hemskt ställe Straffa inte dig själv genom att boka här | Ingenting Hemskt ställe Håll er borta | Affärsresa Par Standard dubbelrum Bodde 2 nätter | + +Som du kan se hade denna gäst inte en trevlig vistelse på detta hotell. Hotellet har ett bra genomsnittligt betyg på 7,8 och 1945 recensioner, men denna recensent gav det 2,5 och skrev 115 ord om hur negativ deras vistelse var. Om de inte skrev något alls i kolumnen för positiva recensioner kan man anta att det inte fanns något positivt, men de skrev trots allt 7 varningsord. Om vi bara räknade ord istället för betydelsen eller sentimentet av orden, skulle vi kunna få en skev bild av recensentens avsikt. Märkligt nog är deras betyg på 2,5 förvirrande, eftersom om hotellvistelsen var så dålig, varför ge några poäng alls? Vid närmare granskning av datasetet ser du att det lägsta möjliga betyget är 2,5, inte 0. Det högsta möjliga betyget är 10. + +##### Taggar + +Som nämnts ovan verkar idén att använda `Tags` för att kategorisera data vid första anblicken vettig. Tyvärr är dessa taggar inte standardiserade, vilket innebär att i ett givet hotell kan alternativen vara *Single room*, *Twin room* och *Double room*, men i nästa hotell är de *Deluxe Single Room*, *Classic Queen Room* och *Executive King Room*. Dessa kan vara samma saker, men det finns så många variationer att valet blir: + +1. Försöka ändra alla termer till en enda standard, vilket är mycket svårt eftersom det inte är klart vad konverteringsvägen skulle vara i varje fall (t.ex. *Classic single room* motsvarar *Single room* men *Superior Queen Room with Courtyard Garden or City View* är mycket svårare att mappa) + +1. Vi kan ta en NLP-ansats och mäta frekvensen av vissa termer som *Solo*, *Business Traveller* eller *Family with young kids* när de gäller varje hotell och inkludera det i rekommendationen + +Taggar är vanligtvis (men inte alltid) ett enda fält som innehåller en lista med 5 till 6 kommaseparerade värden som motsvarar *Typ av resa*, *Typ av gäster*, *Typ av rum*, *Antal nätter* och *Typ av enhet som recensionen skickades in från*. Eftersom vissa recensenter inte fyller i varje fält (de kan lämna ett tomt), är värdena dock inte alltid i samma ordning. + +Som exempel, ta *Typ av grupp*. Det finns 1025 unika möjligheter i detta fält i kolumnen `Tags`, och tyvärr hänvisar endast några av dem till en grupp (vissa är typen av rum etc.). Om du filtrerar endast de som nämner familj, innehåller resultaten många *Family room*-typer av resultat. Om du inkluderar termen *with*, dvs. räknar *Family with*-värdena, blir resultaten bättre, med över 80 000 av de 515 000 resultaten som innehåller frasen "Family with young children" eller "Family with older children". + +Detta innebär att kolumnen taggar inte är helt värdelös för oss, men det kommer att krävas lite arbete för att göra den användbar. + +##### Genomsnittligt hotellbetyg + +Det finns ett antal märkligheter eller avvikelser i datasetet som jag inte kan lista ut, men som illustreras här så att du är medveten om dem när du bygger dina modeller. Om du listar ut det, vänligen meddela oss i diskussionssektionen! + +Datasetet har följande kolumner relaterade till genomsnittligt betyg och antal recensioner: + +1. Hotel_Name +2. Additional_Number_of_Scoring +3. Average_Score +4. Total_Number_of_Reviews +5. Reviewer_Score + +Det hotell med flest recensioner i detta dataset är *Britannia International Hotel Canary Wharf* med 4789 recensioner av 515 000. Men om vi tittar på värdet `Total_Number_of_Reviews` för detta hotell är det 9086. Du kan anta att det finns många fler betyg utan recensioner, så kanske vi bör lägga till värdet i kolumnen `Additional_Number_of_Scoring`. Det värdet är 2682, och att lägga till det till 4789 ger oss 7471, vilket fortfarande är 1615 kort från `Total_Number_of_Reviews`. + +Om du tar kolumnen `Average_Score` kan du anta att det är genomsnittet av recensionerna i datasetet, men beskrivningen från Kaggle är "*Genomsnittsbetyget för hotellet, beräknat baserat på den senaste kommentaren under det senaste året*". Det verkar inte särskilt användbart, men vi kan beräkna vårt eget genomsnitt baserat på recensionsbetygen i datasetet. Med samma hotell som exempel är det genomsnittliga hotellbetyget angivet som 7,1 men det beräknade betyget (genomsnittligt recensionsbetyg *i* datasetet) är 6,8. Detta är nära, men inte samma värde, och vi kan bara gissa att betygen i recensionerna i kolumnen `Additional_Number_of_Scoring` ökade genomsnittet till 7,1. Tyvärr, utan något sätt att testa eller bevisa detta påstående, är det svårt att använda eller lita på `Average_Score`, `Additional_Number_of_Scoring` och `Total_Number_of_Reviews` när de är baserade på, eller hänvisar till, data vi inte har. + +För att komplicera saker ytterligare har hotellet med näst flest recensioner ett beräknat genomsnittligt betyg på 8,12 och datasetets `Average_Score` är 8,1. Är detta korrekta betyg en slump eller är det första hotellet en avvikelse? + +Med möjligheten att dessa hotell kan vara avvikelser, och att kanske de flesta värden stämmer (men vissa gör det inte av någon anledning) kommer vi att skriva ett kort program härnäst för att utforska värdena i datasetet och avgöra korrekt användning (eller icke-användning) av värdena. +> 🚨 En varning + +> När du arbetar med denna dataset kommer du att skriva kod som beräknar något från texten utan att behöva läsa eller analysera texten själv. Detta är kärnan i NLP, att tolka mening eller känslor utan att en människa behöver göra det. Dock är det möjligt att du kommer att läsa några av de negativa recensionerna. Jag skulle starkt rekommendera att du låter bli, eftersom du inte behöver göra det. Vissa av dem är löjliga eller irrelevanta negativa hotellrecensioner, som "Vädret var inte bra", något som ligger utanför hotellets, eller någon annans, kontroll. Men det finns också en mörk sida med vissa recensioner. Ibland är de negativa recensionerna rasistiska, sexistiska eller åldersdiskriminerande. Detta är olyckligt men att förvänta sig i en dataset som hämtats från en offentlig webbplats. Vissa recensenter lämnar omdömen som du kan uppleva som smaklösa, obehagliga eller upprörande. Det är bättre att låta koden mäta känslan än att läsa dem själv och bli upprörd. Med det sagt är det en minoritet som skriver sådana saker, men de finns ändå. +## Övning - Datautforskning +### Ladda data + +Nu har vi tittat på data visuellt, dags att skriva lite kod och få svar! Den här delen använder biblioteket pandas. Din första uppgift är att säkerställa att du kan ladda och läsa CSV-datan. Pandas har en snabb CSV-laddare, och resultatet placeras i en dataframe, precis som i tidigare lektioner. CSV-filen vi laddar har över en halv miljon rader, men bara 17 kolumner. Pandas ger dig många kraftfulla sätt att interagera med en dataframe, inklusive möjligheten att utföra operationer på varje rad. + +Från och med nu i denna lektion kommer det att finnas kodsnuttar, förklaringar av koden och diskussioner om vad resultaten betyder. Använd den medföljande _notebook.ipynb_ för din kod. + +Låt oss börja med att ladda datafilen du ska använda: + +```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") +``` + +Nu när datan är laddad kan vi utföra några operationer på den. Behåll denna kod högst upp i ditt program för nästa del. + +## Utforska data + +I det här fallet är datan redan *ren*, vilket betyder att den är redo att arbeta med och inte innehåller tecken på andra språk som kan orsaka problem för algoritmer som förväntar sig endast engelska tecken. + +✅ Du kan behöva arbeta med data som kräver viss initial bearbetning för att formatera den innan du tillämpar NLP-tekniker, men inte denna gång. Om du var tvungen, hur skulle du hantera tecken på andra språk? + +Ta en stund för att säkerställa att när datan är laddad kan du utforska den med kod. Det är väldigt lätt att vilja fokusera på kolumnerna `Negative_Review` och `Positive_Review`. De är fyllda med naturlig text för dina NLP-algoritmer att bearbeta. Men vänta! Innan du hoppar in i NLP och sentimentanalys bör du följa koden nedan för att kontrollera om värdena i datasetet matchar de värden du beräknar med pandas. + +## Dataframe-operationer + +Den första uppgiften i denna lektion är att kontrollera om följande påståenden är korrekta genom att skriva kod som undersöker dataframen (utan att ändra den). + +> Precis som många programmeringsuppgifter finns det flera sätt att lösa detta, men ett bra råd är att göra det på det enklaste och lättaste sättet du kan, särskilt om det blir lättare att förstå när du återvänder till koden i framtiden. Med dataframes finns det en omfattande API som ofta har ett sätt att göra det du vill effektivt. + +Behandla följande frågor som kodningsuppgifter och försök att besvara dem utan att titta på lösningen. + +1. Skriv ut *formen* på dataframen du just laddade (formen är antalet rader och kolumner). +2. Beräkna frekvensräkningen för recensenters nationaliteter: + 1. Hur många distinkta värden finns det för kolumnen `Reviewer_Nationality` och vilka är de? + 2. Vilken recensentnationalitet är den vanligaste i datasetet (skriv ut land och antal recensioner)? + 3. Vilka är de nästa 10 mest frekvent förekommande nationaliteterna och deras frekvensräkning? +3. Vilket var det mest recenserade hotellet för var och en av de 10 mest förekommande recensentnationaliteterna? +4. Hur många recensioner finns det per hotell (frekvensräkning av hotell) i datasetet? +5. Även om det finns en kolumn `Average_Score` för varje hotell i datasetet kan du också beräkna ett genomsnittligt betyg (genom att ta genomsnittet av alla recensenters betyg i datasetet för varje hotell). Lägg till en ny kolumn i din dataframe med kolumnrubriken `Calc_Average_Score` som innehåller det beräknade genomsnittet. +6. Har några hotell samma (avrundat till 1 decimal) `Average_Score` och `Calc_Average_Score`? + 1. Försök att skriva en Python-funktion som tar en Series (rad) som argument och jämför värdena, och skriver ut ett meddelande när värdena inte är lika. Använd sedan `.apply()`-metoden för att bearbeta varje rad med funktionen. +7. Beräkna och skriv ut hur många rader som har kolumnen `Negative_Review` med värdet "No Negative". +8. Beräkna och skriv ut hur många rader som har kolumnen `Positive_Review` med värdet "No Positive". +9. Beräkna och skriv ut hur många rader som har kolumnen `Positive_Review` med värdet "No Positive" **och** `Negative_Review` med värdet "No Negative". + +### Kodlösningar + +1. Skriv ut *formen* på dataframen du just laddade (formen är antalet rader och kolumner). + + ```python + print("The shape of the data (rows, cols) is " + str(df.shape)) + > The shape of the data (rows, cols) is (515738, 17) + ``` + +2. Beräkna frekvensräkningen för recensenters nationaliteter: + + 1. Hur många distinkta värden finns det för kolumnen `Reviewer_Nationality` och vilka är de? + 2. Vilken recensentnationalitet är den vanligaste i datasetet (skriv ut land och antal recensioner)? + + ```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. Vilka är de nästa 10 mest frekvent förekommande nationaliteterna och deras frekvensräkning? + + ```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. Vilket var det mest recenserade hotellet för var och en av de 10 mest förekommande recensentnationaliteterna? + + ```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. Hur många recensioner finns det per hotell (frekvensräkning av hotell) i datasetet? + + ```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_Namn | Totalt_Antal_Recensioner | Totalt_Recensioner_Funna | + | :----------------------------------------: | :-----------------------: | :-----------------------: | + | 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 | + + Du kanske märker att resultaten *räknade i datasetet* inte matchar värdet i `Total_Number_of_Reviews`. Det är oklart om detta värde i datasetet representerade det totala antalet recensioner hotellet hade, men inte alla skrapades, eller någon annan beräkning. `Total_Number_of_Reviews` används inte i modellen på grund av denna oklarhet. + +5. Även om det finns en kolumn `Average_Score` för varje hotell i datasetet kan du också beräkna ett genomsnittligt betyg (genom att ta genomsnittet av alla recensenters betyg i datasetet för varje hotell). Lägg till en ny kolumn i din dataframe med kolumnrubriken `Calc_Average_Score` som innehåller det beräknade genomsnittet. Skriv ut kolumnerna `Hotel_Name`, `Average_Score` och `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"]]) + ``` + + Du kanske också undrar över värdet `Average_Score` och varför det ibland skiljer sig från det beräknade genomsnittliga betyget. Eftersom vi inte kan veta varför vissa värden matchar, men andra har en skillnad, är det säkrast i detta fall att använda de betyg vi har för att beräkna genomsnittet själva. Med det sagt är skillnaderna vanligtvis mycket små, här är hotellen med den största avvikelsen mellan datasetets genomsnitt och det beräknade genomsnittet: + + | Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Namn | + | :----------------------: | :-----------: | :----------------: | ------------------------------------------: | + | -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 | + + Med endast 1 hotell som har en skillnad i betyg större än 1 betyder det att vi förmodligen kan ignorera skillnaden och använda det beräknade genomsnittliga betyget. + +6. Beräkna och skriv ut hur många rader som har kolumnen `Negative_Review` med värdet "No Negative". + +7. Beräkna och skriv ut hur många rader som har kolumnen `Positive_Review` med värdet "No Positive". + +8. Beräkna och skriv ut hur många rader som har kolumnen `Positive_Review` med värdet "No Positive" **och** `Negative_Review` med värdet "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 + ``` + +## Ett annat sätt + +Ett annat sätt att räkna objekt utan Lambdas, och använda sum för att räkna rader: + + ```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 + ``` + + Du kanske har märkt att det finns 127 rader som har både "No Negative" och "No Positive" värden för kolumnerna `Negative_Review` och `Positive_Review` respektive. Det betyder att recensenten gav hotellet ett numeriskt betyg, men avstod från att skriva en positiv eller negativ recension. Lyckligtvis är detta en liten mängd rader (127 av 515738, eller 0,02%), så det kommer förmodligen inte att snedvrida vår modell eller resultat i någon särskild riktning, men du kanske inte har förväntat dig att ett dataset med recensioner skulle ha rader utan recensioner, så det är värt att utforska datan för att upptäcka sådana rader. + +Nu när du har utforskat datasetet kommer du i nästa lektion att filtrera datan och lägga till lite sentimentanalys. + +--- +## 🚀Utmaning + +Denna lektion demonstrerar, som vi såg i tidigare lektioner, hur otroligt viktigt det är att förstå din data och dess egenheter innan du utför operationer på den. Textbaserad data, i synnerhet, kräver noggrann granskning. Gräv igenom olika texttunga dataset och se om du kan upptäcka områden som kan introducera bias eller snedvriden sentiment i en modell. + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Ta [denna lärväg om NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) för att upptäcka verktyg att prova när du bygger tal- och texttunga modeller. + +## Uppgift + +[NLTK](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/4-Hotel-Reviews-1/assignment.md b/translations/sv/6-NLP/4-Hotel-Reviews-1/assignment.md new file mode 100644 index 000000000..e1764af33 --- /dev/null +++ b/translations/sv/6-NLP/4-Hotel-Reviews-1/assignment.md @@ -0,0 +1,19 @@ + +# NLTK + +## Instruktioner + +NLTK är ett välkänt bibliotek för användning inom datalingvistik och NLP. Ta tillfället i akt att läsa igenom '[NLTK-boken](https://www.nltk.org/book/)' och prova dess övningar. I denna icke-betygsatta uppgift kommer du att lära känna detta bibliotek mer ingående. + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md b/translations/sv/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md new file mode 100644 index 000000000..d5cd8aaae --- /dev/null +++ b/translations/sv/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som kan uppstå vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/4-Hotel-Reviews-1/solution/R/README.md b/translations/sv/6-NLP/4-Hotel-Reviews-1/solution/R/README.md new file mode 100644 index 000000000..1f90194fc --- /dev/null +++ b/translations/sv/6-NLP/4-Hotel-Reviews-1/solution/R/README.md @@ -0,0 +1,15 @@ + +detta är en tillfällig platshållare + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som kan uppstå vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/5-Hotel-Reviews-2/README.md b/translations/sv/6-NLP/5-Hotel-Reviews-2/README.md new file mode 100644 index 000000000..411ea37ec --- /dev/null +++ b/translations/sv/6-NLP/5-Hotel-Reviews-2/README.md @@ -0,0 +1,389 @@ + +# Sentimentanalys med hotellrecensioner + +Nu när du har utforskat datasetet i detalj är det dags att filtrera kolumnerna och använda NLP-tekniker på datasetet för att få nya insikter om hotellen. + +## [Quiz före föreläsning](https://ff-quizzes.netlify.app/en/ml/) + +### Filtrering och sentimentanalysoperationer + +Som du förmodligen har märkt har datasetet några problem. Vissa kolumner är fyllda med värdelös information, andra verkar felaktiga. Om de är korrekta är det oklart hur de beräknades, och svaren kan inte verifieras självständigt med dina egna beräkningar. + +## Övning: lite mer databehandling + +Rensa data lite mer. Lägg till kolumner som kommer att vara användbara senare, ändra värden i andra kolumner och ta bort vissa kolumner helt. + +1. Inledande kolumnbearbetning + + 1. Ta bort `lat` och `lng` + + 2. Ersätt värdena i `Hotel_Address` med följande värden (om adressen innehåller stadens och landets namn, ändra det till endast stad och land). + + Dessa är de enda städerna och länderna i datasetet: + + Amsterdam, Nederländerna + + Barcelona, Spanien + + London, Storbritannien + + Milano, Italien + + Paris, Frankrike + + Wien, Österrike + + ```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()) + ``` + + Nu kan du göra förfrågningar på landsnivå: + + ```python + display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"})) + ``` + + | Hotel_Address | Hotel_Name | + | :--------------------- | :--------: | + | Amsterdam, Nederländerna | 105 | + | Barcelona, Spanien | 211 | + | London, Storbritannien | 400 | + | Milano, Italien | 162 | + | Paris, Frankrike | 458 | + | Wien, Österrike | 158 | + +2. Bearbeta kolumner för hotellens metarecensioner + + 1. Ta bort `Additional_Number_of_Scoring` + + 2. Ersätt `Total_Number_of_Reviews` med det totala antalet recensioner för det hotellet som faktiskt finns i datasetet + + 3. Ersätt `Average_Score` med vår egen beräknade poäng + + ```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. Bearbeta recensionskolumner + + 1. Ta bort `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` och `days_since_review` + + 2. Behåll `Reviewer_Score`, `Negative_Review` och `Positive_Review` som de är + + 3. Behåll `Tags` för tillfället + + - Vi kommer att göra ytterligare filtreringsoperationer på taggarna i nästa avsnitt och sedan kommer taggarna att tas bort + +4. Bearbeta recensionsskrivarkolumner + + 1. Ta bort `Total_Number_of_Reviews_Reviewer_Has_Given` + + 2. Behåll `Reviewer_Nationality` + +### Taggkolumner + +Kolumnen `Tag` är problematisk eftersom den är en lista (i textform) som lagras i kolumnen. Tyvärr är ordningen och antalet underavsnitt i denna kolumn inte alltid densamma. Det är svårt för en människa att identifiera de korrekta fraserna att fokusera på, eftersom det finns 515 000 rader och 1427 hotell, och varje hotell har något olika alternativ som en recensent kan välja. Här är där NLP är användbart. Du kan skanna texten och hitta de vanligaste fraserna och räkna dem. + +Tyvärr är vi inte intresserade av enskilda ord, utan flerordsfraser (t.ex. *Affärsresa*). Att köra en algoritm för flerordsfrekvensfördelning på så mycket data (6 762 646 ord) kan ta extremt lång tid, men utan att titta på data verkar det vara en nödvändig kostnad. Här är där utforskande dataanalys är användbart, eftersom du har sett ett urval av taggar som `[' Affärsresa ', ' Ensamresenär ', ' Enkelrum ', ' Stannade 5 nätter ', ' Skickad från en mobil enhet ']`, kan du börja fråga dig om det är möjligt att kraftigt minska den bearbetning du måste göra. Lyckligtvis är det möjligt - men först måste du följa några steg för att fastställa vilka taggar som är av intresse. + +### Filtrering av taggar + +Kom ihåg att målet med datasetet är att lägga till sentiment och kolumner som hjälper dig att välja det bästa hotellet (för dig själv eller kanske en klient som ber dig skapa en hotellrekommendationsbot). Du måste fråga dig själv om taggarna är användbara eller inte i det slutliga datasetet. Här är en tolkning (om du behövde datasetet för andra ändamål kan olika taggar inkluderas/uteslutas): + +1. Typen av resa är relevant och bör behållas +2. Typen av gästgrupp är viktig och bör behållas +3. Typen av rum, svit eller studio som gästen bodde i är irrelevant (alla hotell har i princip samma rum) +4. Enheten som recensionen skickades från är irrelevant +5. Antalet nätter som recensenten stannade *kan* vara relevant om du kopplar längre vistelser till att de gillade hotellet mer, men det är tveksamt och förmodligen irrelevant + +Sammanfattningsvis, **behåll 2 typer av taggar och ta bort de andra**. + +Först vill du inte räkna taggarna förrän de är i ett bättre format, vilket innebär att ta bort hakparenteser och citattecken. Du kan göra detta på flera sätt, men du vill ha det snabbaste eftersom det kan ta lång tid att bearbeta mycket data. Lyckligtvis har pandas ett enkelt sätt att utföra varje steg. + +```Python +# Remove opening and closing brackets +df.Tags = df.Tags.str.strip("[']") +# remove all quotes too +df.Tags = df.Tags.str.replace(" ', '", ",", regex = False) +``` + +Varje tagg blir något som: `Affärsresa, Ensamresenär, Enkelrum, Stannade 5 nätter, Skickad från en mobil enhet`. + +Nästa problem är att vissa recensioner, eller rader, har 5 kolumner, vissa 3, vissa 6. Detta är ett resultat av hur datasetet skapades och svårt att åtgärda. Du vill få en frekvensräkning av varje fras, men de är i olika ordning i varje recension, så räkningen kan bli felaktig och ett hotell kanske inte får en tagg tilldelad som det förtjänade. + +Istället kommer du att använda den olika ordningen till vår fördel, eftersom varje tagg är flerordig men också separerad med ett komma! Det enklaste sättet att göra detta är att skapa 6 temporära kolumner med varje tagg insatt i kolumnen som motsvarar dess ordning i taggen. Du kan sedan slå samman de 6 kolumnerna till en stor kolumn och köra metoden `value_counts()` på den resulterande kolumnen. När du skriver ut det ser du att det fanns 2428 unika taggar. Här är ett litet urval: + +| Tagg | Antal | +| ------------------------------ | ------ | +| Fritidsresa | 417778 | +| Skickad från en mobil enhet | 307640 | +| Par | 252294 | +| Stannade 1 natt | 193645 | +| Stannade 2 nätter | 133937 | +| Ensamresenär | 108545 | +| Stannade 3 nätter | 95821 | +| Affärsresa | 82939 | +| Grupp | 65392 | +| Familj med små barn | 61015 | +| Stannade 4 nätter | 47817 | +| Dubbelrum | 35207 | +| Standard dubbelrum | 32248 | +| Superior dubbelrum | 31393 | +| Familj med äldre barn | 26349 | +| Deluxe dubbelrum | 24823 | +| Dubbel- eller tvåbäddsrum | 22393 | +| Stannade 5 nätter | 20845 | +| Standard dubbel- eller tvåbäddsrum | 17483 | +| Klassiskt dubbelrum | 16989 | +| Superior dubbel- eller tvåbäddsrum | 13570 | +| 2 rum | 12393 | + +Vissa av de vanliga taggarna som `Skickad från en mobil enhet` är inte användbara för oss, så det kan vara smart att ta bort dem innan man räknar frasförekomster, men det är en så snabb operation att du kan lämna dem kvar och ignorera dem. + +### Ta bort taggar för vistelselängd + +Att ta bort dessa taggar är steg 1, det minskar det totala antalet taggar som ska beaktas något. Observera att du inte tar bort dem från datasetet, utan bara väljer att inte beakta dem som värden att räkna/behålla i recensionsdatasetet. + +| Vistelselängd | Antal | +| -------------- | ------ | +| Stannade 1 natt | 193645 | +| Stannade 2 nätter | 133937 | +| Stannade 3 nätter | 95821 | +| Stannade 4 nätter | 47817 | +| Stannade 5 nätter | 20845 | +| Stannade 6 nätter | 9776 | +| Stannade 7 nätter | 7399 | +| Stannade 8 nätter | 2502 | +| Stannade 9 nätter | 1293 | +| ... | ... | + +Det finns en stor variation av rum, sviter, studios, lägenheter och så vidare. De betyder alla ungefär samma sak och är inte relevanta för dig, så ta bort dem från övervägande. + +| Rumstyp | Antal | +| --------------------------- | ----- | +| Dubbelrum | 35207 | +| Standard dubbelrum | 32248 | +| Superior dubbelrum | 31393 | +| Deluxe dubbelrum | 24823 | +| Dubbel- eller tvåbäddsrum | 22393 | +| Standard dubbel- eller tvåbäddsrum | 17483 | +| Klassiskt dubbelrum | 16989 | +| Superior dubbel- eller tvåbäddsrum | 13570 | + +Slutligen, och detta är glädjande (eftersom det inte krävde mycket bearbetning alls), kommer du att ha kvar följande *användbara* taggar: + +| Tagg | Antal | +| ------------------------------------------- | ------ | +| Fritidsresa | 417778 | +| Par | 252294 | +| Ensamresenär | 108545 | +| Affärsresa | 82939 | +| Grupp (kombinerad med Resenärer med vänner) | 67535 | +| Familj med små barn | 61015 | +| Familj med äldre barn | 26349 | +| Med ett husdjur | 1405 | + +Man skulle kunna argumentera att `Resenärer med vänner` är samma sak som `Grupp` mer eller mindre, och det skulle vara rimligt att kombinera de två som ovan. Koden för att identifiera de korrekta taggarna finns i [Tags-notebooken](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb). + +Det sista steget är att skapa nya kolumner för var och en av dessa taggar. Sedan, för varje recensionsrad, om kolumnen `Tag` matchar en av de nya kolumnerna, lägg till en 1, om inte, lägg till en 0. Slutresultatet blir en räkning av hur många recensenter som valde detta hotell (i aggregat) för exempelvis affärer kontra fritid, eller för att ta med ett husdjur, och detta är användbar information när man rekommenderar ett hotell. + +```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) + +``` + +### Spara din fil + +Slutligen, spara datasetet som det är nu med ett nytt namn. + +```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) +``` + +## Sentimentanalysoperationer + +I detta sista avsnitt kommer du att tillämpa sentimentanalys på recensionskolumnerna och spara resultaten i ett dataset. + +## Övning: ladda och spara den filtrerade datan + +Observera att du nu laddar det filtrerade datasetet som sparades i föregående avsnitt, **inte** det ursprungliga datasetet. + +```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) +``` + +### Ta bort stoppord + +Om du skulle köra sentimentanalys på kolumnerna för negativa och positiva recensioner kan det ta lång tid. Testat på en kraftfull testdator med snabb CPU tog det 12–14 minuter beroende på vilken sentimentbibliotek som användes. Det är en (relativt) lång tid, så det är värt att undersöka om det kan snabbas upp. + +Att ta bort stoppord, eller vanliga engelska ord som inte förändrar sentimentet i en mening, är det första steget. Genom att ta bort dem bör sentimentanalysen gå snabbare, men inte bli mindre exakt (eftersom stopporden inte påverkar sentimentet, men de saktar ner analysen). + +Den längsta negativa recensionen var 395 ord, men efter att ha tagit bort stopporden är den 195 ord. + +Att ta bort stopporden är också en snabb operation, att ta bort stopporden från 2 recensionskolumner över 515 000 rader tog 3,3 sekunder på testdatorn. Det kan ta något mer eller mindre tid för dig beroende på din dators CPU-hastighet, RAM, om du har en SSD eller inte, och några andra faktorer. Den relativt korta operationen innebär att om den förbättrar sentimentanalystiden, så är det värt att göra. + +```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) +``` + +### Utföra sentimentanalys + +Nu ska du beräkna sentimentanalysen för både negativa och positiva recensionskolumner och lagra resultatet i 2 nya kolumner. Testet av sentimentet kommer att vara att jämföra det med recensentens poäng för samma recension. Till exempel, om sentimentet anser att den negativa recensionen hade ett sentiment på 1 (extremt positivt sentiment) och ett positivt recensionssentiment på 1, men recensenten gav hotellet den lägsta möjliga poängen, då matchar antingen recensionsinnehållet inte poängen, eller så kunde sentimentanalysverktyget inte känna igen sentimentet korrekt. Du bör förvänta dig att vissa sentimentpoäng är helt felaktiga, och ofta kommer det att vara förklarligt, t.ex. recensionen kan vara extremt sarkastisk "Självklart ÄLSKADE jag att sova i ett rum utan värme" och sentimentanalysverktyget tror att det är positivt sentiment, även om en människa som läser det skulle förstå att det var sarkasm. +NLTK tillhandahåller olika sentimentanalysverktyg att lära sig med, och du kan byta ut dem och se om sentimentanalysen blir mer eller mindre exakt. Här används VADER för sentimentanalys. + +> 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, juni 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"] +``` + +Senare i ditt program, när du är redo att beräkna sentiment, kan du tillämpa det på varje recension enligt följande: + +```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") +``` + +Detta tar ungefär 120 sekunder på min dator, men det kan variera beroende på dator. Om du vill skriva ut resultaten och se om sentimentet stämmer överens med recensionen: + +```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"]]) +``` + +Det allra sista du behöver göra med filen innan du använder den i utmaningen är att spara den! Du bör också överväga att omorganisera alla dina nya kolumner så att de blir enkla att arbeta med (för en människa, det är en kosmetisk förändring). + +```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) +``` + +Du bör köra hela koden för [analysnotebooken](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (efter att du har kört [din filtreringsnotebook](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) för att generera filen Hotel_Reviews_Filtered.csv). + +För att sammanfatta, stegen är: + +1. Den ursprungliga datasetfilen **Hotel_Reviews.csv** utforskas i den föregående lektionen med [utforskningsnotebooken](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb) +2. Hotel_Reviews.csv filtreras med hjälp av [filtreringsnotebooken](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) och resulterar i **Hotel_Reviews_Filtered.csv** +3. Hotel_Reviews_Filtered.csv bearbetas med [sentimentanalysnotebooken](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) och resulterar i **Hotel_Reviews_NLP.csv** +4. Använd Hotel_Reviews_NLP.csv i NLP-utmaningen nedan + +### Slutsats + +När du började hade du ett dataset med kolumner och data, men inte allt kunde verifieras eller användas. Du har utforskat datan, filtrerat bort det du inte behöver, konverterat taggar till något användbart, beräknat dina egna medelvärden, lagt till några sentimentkolumner och förhoppningsvis lärt dig några intressanta saker om bearbetning av naturlig text. + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Utmaning + +Nu när du har analyserat ditt dataset för sentiment, se om du kan använda strategier du lärt dig i denna kurs (klustring, kanske?) för att identifiera mönster kring sentiment. + +## Granskning och självstudier + +Ta [denna Learn-modul](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) för att lära dig mer och använda olika verktyg för att utforska sentiment i text. + +## Uppgift + +[Prova ett annat dataset](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/5-Hotel-Reviews-2/assignment.md b/translations/sv/6-NLP/5-Hotel-Reviews-2/assignment.md new file mode 100644 index 000000000..919e39732 --- /dev/null +++ b/translations/sv/6-NLP/5-Hotel-Reviews-2/assignment.md @@ -0,0 +1,25 @@ + +# Prova ett annat dataset + +## Instruktioner + +Nu när du har lärt dig att använda NLTK för att analysera sentiment i text, prova ett annat dataset. Du kommer troligtvis behöva bearbeta datan, så skapa en notebook och dokumentera din tankeprocess. Vad upptäcker du? + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ----------------------- | +| | En komplett notebook och dataset presenteras med väl dokumenterade celler som förklarar hur sentiment analyseras | Notebooken saknar bra förklaringar | Notebooken är bristfällig | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md b/translations/sv/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md new file mode 100644 index 000000000..e5f4c9035 --- /dev/null +++ b/translations/sv/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/5-Hotel-Reviews-2/solution/R/README.md b/translations/sv/6-NLP/5-Hotel-Reviews-2/solution/R/README.md new file mode 100644 index 000000000..11a76fa89 --- /dev/null +++ b/translations/sv/6-NLP/5-Hotel-Reviews-2/solution/R/README.md @@ -0,0 +1,15 @@ + +detta är en tillfällig platshållare + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/README.md b/translations/sv/6-NLP/README.md new file mode 100644 index 000000000..998e6ff3c --- /dev/null +++ b/translations/sv/6-NLP/README.md @@ -0,0 +1,38 @@ + +# Komma igång med naturlig språkbehandling + +Naturlig språkbehandling (NLP) är förmågan hos ett datorprogram att förstå mänskligt språk som det talas och skrivs – det som kallas naturligt språk. Det är en del av artificiell intelligens (AI). NLP har funnits i över 50 år och har sina rötter inom lingvistikens område. Hela området syftar till att hjälpa maskiner att förstå och bearbeta mänskligt språk. Detta kan sedan användas för att utföra uppgifter som stavningskontroll eller maskinöversättning. Det har en mängd verkliga tillämpningar inom flera områden, inklusive medicinsk forskning, sökmotorer och affärsanalys. + +## Regionalt ämne: Europeiska språk och litteratur samt romantiska hotell i Europa ❤️ + +I den här delen av kursplanen kommer du att introduceras till en av de mest utbredda användningarna av maskininlärning: naturlig språkbehandling (NLP). Härstammande från datalingvistik är denna kategori av artificiell intelligens en bro mellan människor och maskiner via röst- eller textkommunikation. + +I dessa lektioner kommer vi att lära oss grunderna i NLP genom att bygga små konversationsrobotar för att förstå hur maskininlärning hjälper till att göra dessa samtal alltmer "smarta". Du kommer att resa tillbaka i tiden och chatta med Elizabeth Bennett och Mr. Darcy från Jane Austens klassiska roman, **Stolthet och fördom**, som publicerades 1813. Därefter kommer du att fördjupa din kunskap genom att lära dig om sentimentanalys via hotellrecensioner i Europa. + +![Stolthet och fördom bok och te](../../../6-NLP/images/p&p.jpg) +> Foto av Elaine HowlinUnsplash + +## Lektioner + +1. [Introduktion till naturlig språkbehandling](1-Introduction-to-NLP/README.md) +2. [Vanliga NLP-uppgifter och tekniker](2-Tasks/README.md) +3. [Översättning och sentimentanalys med maskininlärning](3-Translation-Sentiment/README.md) +4. [Förbereda din data](4-Hotel-Reviews-1/README.md) +5. [NLTK för sentimentanalys](5-Hotel-Reviews-2/README.md) + +## Krediter + +Dessa lektioner om naturlig språkbehandling skrevs med ☕ av [Stephen Howell](https://twitter.com/Howell_MSFT) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/6-NLP/data/README.md b/translations/sv/6-NLP/data/README.md new file mode 100644 index 000000000..a7ec93156 --- /dev/null +++ b/translations/sv/6-NLP/data/README.md @@ -0,0 +1,15 @@ + +Ladda ner hotellrecensionsdata till den här mappen. + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/7-TimeSeries/1-Introduction/README.md b/translations/sv/7-TimeSeries/1-Introduction/README.md new file mode 100644 index 000000000..4bb778d67 --- /dev/null +++ b/translations/sv/7-TimeSeries/1-Introduction/README.md @@ -0,0 +1,199 @@ + +# Introduktion till tidsserieprognostisering + +![Sammanfattning av tidsserier i en sketchnote](../../../../sketchnotes/ml-timeseries.png) + +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +I den här lektionen och nästa kommer du att lära dig lite om tidsserieprognostisering, en intressant och värdefull del av en ML-forskares verktygslåda som är något mindre känd än andra ämnen. Tidsserieprognostisering är som en sorts "kristallkula": baserat på tidigare prestationer av en variabel, som pris, kan du förutsäga dess framtida potentiella värde. + +[![Introduktion till tidsserieprognostisering](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "Introduktion till tidsserieprognostisering") + +> 🎥 Klicka på bilden ovan för en video om tidsserieprognostisering + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +Det är ett användbart och intressant område med verkligt värde för företag, tack vare dess direkta tillämpning på problem som prissättning, lagerhantering och leveranskedjeproblem. Även om djupinlärningstekniker har börjat användas för att få bättre insikter och förbättra prognoser, är tidsserieprognostisering fortfarande ett område som i hög grad bygger på klassiska ML-tekniker. + +> Penn States användbara läroplan för tidsserier finns [här](https://online.stat.psu.edu/stat510/lesson/1) + +## Introduktion + +Anta att du underhåller en uppsättning smarta parkeringsmätare som ger data om hur ofta de används och hur länge över tid. + +> Tänk om du kunde förutsäga, baserat på mätarens tidigare prestationer, dess framtida värde enligt utbud och efterfrågan? + +Att noggrant förutsäga när man ska agera för att uppnå sitt mål är en utmaning som kan hanteras med tidsserieprognostisering. Det skulle kanske inte göra folk glada att behöva betala mer under hektiska tider när de letar efter en parkeringsplats, men det skulle definitivt vara ett sätt att generera intäkter för att hålla gatorna rena! + +Låt oss utforska några typer av algoritmer för tidsserier och börja med en notebook för att rensa och förbereda data. De data du kommer att analysera är hämtade från GEFCom2014-prognostävlingen. Den består av tre års timvisa elförbruknings- och temperaturvärden mellan 2012 och 2014. Givet de historiska mönstren för elförbrukning och temperatur kan du förutsäga framtida värden för elförbrukning. + +I det här exemplet kommer du att lära dig att förutsäga ett steg framåt i tiden, med hjälp av endast historiska förbrukningsdata. Innan vi börjar är det dock bra att förstå vad som händer bakom kulisserna. + +## Några definitioner + +När du stöter på termen "tidsserie" behöver du förstå dess användning i flera olika sammanhang. + +🎓 **Tidsserie** + +Inom matematik är "en tidsserie en serie datapunkter indexerade (eller listade eller plottade) i tidsordning. Vanligtvis är en tidsserie en sekvens som tas vid successiva lika avstånd i tid." Ett exempel på en tidsserie är det dagliga slutvärdet för [Dow Jones Industrial Average](https://wikipedia.org/wiki/Time_series). Användningen av tidsserieplottar och statistisk modellering är vanligt förekommande inom signalbehandling, väderprognoser, jordbävningsförutsägelser och andra områden där händelser inträffar och datapunkter kan plottas över tid. + +🎓 **Tidsserieanalys** + +Tidsserieanalys är analysen av ovan nämnda tidsseriedata. Tidsseriedata kan ta olika former, inklusive "avbrutna tidsserier" som upptäcker mönster i en tidsseries utveckling före och efter en avbrytande händelse. Typen av analys som behövs för tidsserien beror på datans natur. Tidsseriedata kan i sig ta formen av serier av siffror eller tecken. + +Analysen som ska utföras använder en mängd olika metoder, inklusive frekvensdomän och tidsdomän, linjära och icke-linjära metoder och mer. [Läs mer](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) om de många sätten att analysera denna typ av data. + +🎓 **Tidsserieprognostisering** + +Tidsserieprognostisering är användningen av en modell för att förutsäga framtida värden baserat på mönster som visas av tidigare insamlade data. Även om det är möjligt att använda regressionsmodeller för att utforska tidsseriedata, med tidsindex som x-variabler i ett diagram, analyseras sådan data bäst med hjälp av speciella typer av modeller. + +Tidsseriedata är en lista över ordnade observationer, till skillnad från data som kan analyseras med linjär regression. Den vanligaste modellen är ARIMA, en akronym för "Autoregressive Integrated Moving Average". + +[ARIMA-modeller](https://online.stat.psu.edu/stat510/lesson/1/1.1) "relaterar det nuvarande värdet av en serie till tidigare värden och tidigare prognosfel." De är mest lämpliga för att analysera tidsdomänsdata, där data är ordnade över tid. + +> Det finns flera typer av ARIMA-modeller, som du kan lära dig om [här](https://people.duke.edu/~rnau/411arim.htm) och som du kommer att beröra i nästa lektion. + +I nästa lektion kommer du att bygga en ARIMA-modell med hjälp av [Univariate Time Series](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm), som fokuserar på en variabel som ändrar sitt värde över tid. Ett exempel på denna typ av data är [denna dataset](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) som registrerar den månatliga CO2-koncentrationen vid Mauna Loa-observatoriet: + +| 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 | + +✅ Identifiera variabeln som ändras över tid i denna dataset + +## Egenskaper hos tidsseriedata att beakta + +När du tittar på tidsseriedata kan du märka att den har [vissa egenskaper](https://online.stat.psu.edu/stat510/lesson/1/1.1) som du behöver ta hänsyn till och hantera för att bättre förstå dess mönster. Om du betraktar tidsseriedata som potentiellt tillhandahållande av en "signal" som du vill analysera, kan dessa egenskaper betraktas som "brus". Du kommer ofta att behöva minska detta "brus" genom att hantera vissa av dessa egenskaper med statistiska tekniker. + +Här är några begrepp du bör känna till för att kunna arbeta med tidsserier: + +🎓 **Trender** + +Trender definieras som mätbara ökningar och minskningar över tid. [Läs mer](https://machinelearningmastery.com/time-series-trends-in-python). I samband med tidsserier handlar det om hur man använder och, om nödvändigt, tar bort trender från din tidsserie. + +🎓 **[Säsongsvariationer](https://machinelearningmastery.com/time-series-seasonality-with-python/)** + +Säsongsvariationer definieras som periodiska fluktuationer, som exempelvis försäljningsökningar under helger. [Ta en titt](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) på hur olika typer av diagram visar säsongsvariationer i data. + +🎓 **Avvikare** + +Avvikare är datapunkter som ligger långt ifrån den normala datavariationen. + +🎓 **Långsiktiga cykler** + +Oberoende av säsongsvariationer kan data visa en långsiktig cykel, som en ekonomisk nedgång som varar längre än ett år. + +🎓 **Konstant varians** + +Över tid kan vissa data visa konstanta fluktuationer, som energianvändning dag och natt. + +🎓 **Plötsliga förändringar** + +Data kan visa en plötslig förändring som kan behöva ytterligare analys. Den plötsliga stängningen av företag på grund av COVID, till exempel, orsakade förändringar i data. + +✅ Här är ett [exempel på ett tidsseriediagram](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) som visar dagliga utgifter för spelvaluta över några år. Kan du identifiera några av de egenskaper som listas ovan i denna data? + +![Utgifter för spelvaluta](../../../../7-TimeSeries/1-Introduction/images/currency.png) + +## Övning - Kom igång med data om elförbrukning + +Låt oss börja skapa en tidsseriemodell för att förutsäga framtida elförbrukning baserat på tidigare förbrukning. + +> Datan i detta exempel är hämtad från GEFCom2014-prognostävlingen. Den består av tre års timvisa elförbruknings- och temperaturvärden mellan 2012 och 2014. +> +> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli och Rob J. Hyndman, "Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond", International Journal of Forecasting, vol.32, no.3, pp 896-913, juli-september, 2016. + +1. I mappen `working` för denna lektion, öppna filen _notebook.ipynb_. Börja med att lägga till bibliotek som hjälper dig att ladda och visualisera data: + + ```python + import os + import matplotlib.pyplot as plt + from common.utils import load_data + %matplotlib inline + ``` + + Observera att du använder filerna från den inkluderade mappen `common` som ställer in din miljö och hanterar nedladdning av data. + +2. Undersök sedan datan som en dataframe genom att anropa `load_data()` och `head()`: + + ```python + data_dir = './data' + energy = load_data(data_dir)[['load']] + energy.head() + ``` + + Du kan se att det finns två kolumner som representerar datum och förbrukning: + + | | 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. Nu, plotta datan genom att anropa `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() + ``` + + ![energiplott](../../../../7-TimeSeries/1-Introduction/images/energy-plot.png) + +4. Plotta nu den första veckan i juli 2014 genom att ange den som input till `energy` i mönstret `[från datum]: [till datum]`: + + ```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() + ``` + + ![juli](../../../../7-TimeSeries/1-Introduction/images/july-2014.png) + + Ett vackert diagram! Titta på dessa diagram och se om du kan identifiera några av de egenskaper som listas ovan. Vad kan vi dra för slutsatser genom att visualisera datan? + +I nästa lektion kommer du att skapa en ARIMA-modell för att göra några prognoser. + +--- + +## 🚀Utmaning + +Gör en lista över alla branscher och forskningsområden du kan tänka dig som skulle dra nytta av tidsserieprognostisering. Kan du tänka dig en tillämpning av dessa tekniker inom konst? Inom ekonometrik? Ekologi? Detaljhandel? Industri? Finans? Var annars? + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Även om vi inte kommer att täcka dem här, används ibland neurala nätverk för att förbättra klassiska metoder för tidsserieprognostisering. Läs mer om dem [i denna artikel](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412) + +## Uppgift + +[Visualisera fler tidsserier](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/7-TimeSeries/1-Introduction/assignment.md b/translations/sv/7-TimeSeries/1-Introduction/assignment.md new file mode 100644 index 000000000..3b3739143 --- /dev/null +++ b/translations/sv/7-TimeSeries/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# Visualisera fler tidsserier + +## Instruktioner + +Du har börjat lära dig om prognostisering av tidsserier genom att titta på vilken typ av data som kräver denna speciella modellering. Du har visualiserat viss data kring energi. Nu, leta efter annan data som skulle dra nytta av prognostisering av tidsserier. Hitta tre exempel (prova [Kaggle](https://kaggle.com) och [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)) och skapa en notebook för att visualisera dem. Notera eventuella speciella egenskaper de har (säsongsvariationer, plötsliga förändringar eller andra trender) i notebooken. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ----------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------------------------------------------- | +| | Tre dataset är plottade och förklarade i en notebook | Två dataset är plottade och förklarade i en notebook | Få dataset är plottade eller förklarade i en notebook eller den presenterade datan är otillräcklig | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/7-TimeSeries/1-Introduction/solution/Julia/README.md b/translations/sv/7-TimeSeries/1-Introduction/solution/Julia/README.md new file mode 100644 index 000000000..0426e458f --- /dev/null +++ b/translations/sv/7-TimeSeries/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/7-TimeSeries/1-Introduction/solution/R/README.md b/translations/sv/7-TimeSeries/1-Introduction/solution/R/README.md new file mode 100644 index 000000000..161c7818d --- /dev/null +++ b/translations/sv/7-TimeSeries/1-Introduction/solution/R/README.md @@ -0,0 +1,15 @@ + +detta är en tillfällig platshållare + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/7-TimeSeries/2-ARIMA/README.md b/translations/sv/7-TimeSeries/2-ARIMA/README.md new file mode 100644 index 000000000..1d4359c14 --- /dev/null +++ b/translations/sv/7-TimeSeries/2-ARIMA/README.md @@ -0,0 +1,407 @@ + +# Tidsserieprognoser med ARIMA + +I den föregående lektionen lärde du dig lite om tidsserieprognoser och laddade en dataset som visar variationer i elektrisk belastning över en tidsperiod. + +[![Introduktion till ARIMA](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Introduktion till ARIMA") + +> 🎥 Klicka på bilden ovan för en video: En kort introduktion till ARIMA-modeller. Exemplet görs i R, men koncepten är universella. + +## [Quiz före lektionen](https://ff-quizzes.netlify.app/en/ml/) + +## Introduktion + +I denna lektion kommer du att upptäcka ett specifikt sätt att bygga modeller med [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average). ARIMA-modeller är särskilt lämpade för att passa data som visar [icke-stationaritet](https://wikipedia.org/wiki/Stationary_process). + +## Grundläggande koncept + +För att kunna arbeta med ARIMA finns det några begrepp du behöver känna till: + +- 🎓 **Stationaritet**. Ur ett statistiskt perspektiv hänvisar stationaritet till data vars fördelning inte förändras när den förskjuts i tid. Icke-stationär data visar däremot variationer på grund av trender som måste transformeras för att kunna analyseras. Säsongsvariationer, till exempel, kan introducera fluktuationer i data och kan elimineras genom en process som kallas 'säsongsdifferensiering'. + +- 🎓 **[Differensiering](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. Differensiering av data, återigen ur ett statistiskt perspektiv, hänvisar till processen att transformera icke-stationär data för att göra den stationär genom att ta bort dess icke-konstanta trend. "Differensiering tar bort förändringar i nivån på en tidsserie, eliminerar trend och säsongsvariationer och stabiliserar därmed medelvärdet för tidsserien." [Artikel av Shixiong et al](https://arxiv.org/abs/1904.07632) + +## ARIMA i kontexten av tidsserier + +Låt oss bryta ner delarna av ARIMA för att bättre förstå hur det hjälper oss att modellera tidsserier och göra prognoser baserat på dem. + +- **AR - för AutoRegressiv**. Autoregressiva modeller, som namnet antyder, tittar 'bakåt' i tiden för att analysera tidigare värden i din data och göra antaganden om dem. Dessa tidigare värden kallas 'lags'. Ett exempel skulle vara data som visar månatlig försäljning av pennor. Varje månads försäljningssiffra skulle betraktas som en 'utvecklande variabel' i datasetet. Denna modell byggs som "den utvecklande variabeln av intresse regresseras på sina egna fördröjda (dvs. tidigare) värden." [wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) + +- **I - för Integrerad**. Till skillnad från liknande 'ARMA'-modeller hänvisar 'I' i ARIMA till dess *[integrerade](https://wikipedia.org/wiki/Order_of_integration)* aspekt. Data är 'integrerad' när differensieringssteg tillämpas för att eliminera icke-stationaritet. + +- **MA - för Glidande Medelvärde**. Den [glidande medelvärdes](https://wikipedia.org/wiki/Moving-average_model)-aspekten av denna modell hänvisar till utgångsvariabeln som bestäms genom att observera de aktuella och tidigare värdena av lags. + +Slutsats: ARIMA används för att skapa en modell som passar den speciella formen av tidsseriedata så nära som möjligt. + +## Övning - bygg en ARIMA-modell + +Öppna mappen [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) i denna lektion och hitta filen [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb). + +1. Kör notebooken för att ladda Python-biblioteket `statsmodels`; du kommer att behöva detta för ARIMA-modeller. + +1. Ladda nödvändiga bibliotek. + +1. Ladda nu upp flera fler bibliotek som är användbara för att plotta data: + + ```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. Ladda data från filen `/data/energy.csv` till en Pandas-dataram och ta en titt: + + ```python + energy = load_data('./data')[['load']] + energy.head(10) + ``` + +1. Plotta all tillgänglig energidata från januari 2012 till december 2014. Det borde inte vara några överraskningar eftersom vi såg denna data i den senaste lektionen: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + Nu ska vi bygga en modell! + +### Skapa tränings- och testdatamängder + +Nu är din data laddad, så du kan dela upp den i tränings- och testmängder. Du kommer att träna din modell på träningsmängden. Som vanligt, efter att modellen har avslutat träningen, kommer du att utvärdera dess noggrannhet med hjälp av testmängden. Du måste säkerställa att testmängden täcker en senare tidsperiod än träningsmängden för att säkerställa att modellen inte får information från framtida tidsperioder. + +1. Tilldela en tvåmånadersperiod från 1 september till 31 oktober 2014 till träningsmängden. Testmängden kommer att inkludera tvåmånadersperioden från 1 november till 31 december 2014: + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + + Eftersom denna data reflekterar den dagliga energiförbrukningen finns det ett starkt säsongsmönster, men förbrukningen är mest lik förbrukningen under mer nyliga dagar. + +1. Visualisera skillnaderna: + + ```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() + ``` + + ![tränings- och testdata](../../../../7-TimeSeries/2-ARIMA/images/train-test.png) + + Därför bör det vara tillräckligt att använda ett relativt litet tidsfönster för att träna datan. + + > Obs: Eftersom funktionen vi använder för att passa ARIMA-modellen använder in-sample validering under passningen, kommer vi att utelämna valideringsdata. + +### Förbered datan för träning + +Nu behöver du förbereda datan för träning genom att filtrera och skala din data. Filtrera din dataset för att endast inkludera de tidsperioder och kolumner du behöver, och skala för att säkerställa att datan projiceras inom intervallet 0,1. + +1. Filtrera den ursprungliga datasetet för att endast inkludera de nämnda tidsperioderna per mängd och endast inkludera den behövda kolumnen 'load' plus datumet: + + ```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) + ``` + + Du kan se formen på datan: + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +1. Skala datan till att vara inom intervallet (0, 1). + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + train.head(10) + ``` + +1. Visualisera den ursprungliga vs. skalade datan: + + ```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() + ``` + + ![ursprunglig](../../../../7-TimeSeries/2-ARIMA/images/original.png) + + > Den ursprungliga datan + + ![skalad](../../../../7-TimeSeries/2-ARIMA/images/scaled.png) + + > Den skalade datan + +1. Nu när du har kalibrerat den skalade datan kan du skala testdatan: + + ```python + test['load'] = scaler.transform(test) + test.head() + ``` + +### Implementera ARIMA + +Det är dags att implementera ARIMA! Du kommer nu att använda `statsmodels`-biblioteket som du installerade tidigare. + +Nu behöver du följa flera steg: + + 1. Definiera modellen genom att kalla på `SARIMAX()` och skicka in modellparametrarna: p, d och q-parametrar, samt P, D och Q-parametrar. + 2. Förbered modellen för träningsdatan genom att kalla på funktionen `fit()`. + 3. Gör prognoser genom att kalla på funktionen `forecast()` och specificera antalet steg (prognoshorisonten) att förutsäga. + +> 🎓 Vad är alla dessa parametrar till för? I en ARIMA-modell finns det 3 parametrar som används för att hjälpa till att modellera de huvudsakliga aspekterna av en tidsserie: säsongsvariation, trend och brus. Dessa parametrar är: + +`p`: parametern som är associerad med den autoregressiva aspekten av modellen, som inkorporerar *tidigare* värden. +`d`: parametern som är associerad med den integrerade delen av modellen, som påverkar mängden *differensiering* (🎓 kom ihåg differensiering 👆?) som ska tillämpas på en tidsserie. +`q`: parametern som är associerad med den glidande medelvärdesdelen av modellen. + +> Obs: Om din data har en säsongsaspekt - vilket denna har - använder vi en säsongs-ARIMA-modell (SARIMA). I så fall behöver du använda en annan uppsättning parametrar: `P`, `D` och `Q` som beskriver samma associationer som `p`, `d` och `q`, men motsvarar de säsongsbetonade komponenterna i modellen. + +1. Börja med att ställa in din föredragna horisontvärde. Låt oss prova 3 timmar: + + ```python + # Specify the number of steps to forecast ahead + HORIZON = 3 + print('Forecasting horizon:', HORIZON, 'hours') + ``` + + Att välja de bästa värdena för en ARIMA-modells parametrar kan vara utmanande eftersom det är något subjektivt och tidskrävande. Du kan överväga att använda en `auto_arima()`-funktion från [`pyramid`-biblioteket](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html). + +1. För tillfället, prova några manuella val för att hitta en bra modell. + + ```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()) + ``` + + En tabell med resultat skrivs ut. + +Du har byggt din första modell! Nu behöver vi hitta ett sätt att utvärdera den. + +### Utvärdera din modell + +För att utvärdera din modell kan du utföra den så kallade `walk forward`-valideringen. I praktiken tränas tidsseriemodeller om varje gång ny data blir tillgänglig. Detta gör att modellen kan göra den bästa prognosen vid varje tidssteg. + +Börja vid början av tidsserien med denna teknik, träna modellen på träningsdatamängden. Gör sedan en prognos för nästa tidssteg. Prognosen utvärderas mot det kända värdet. Träningsmängden utökas sedan för att inkludera det kända värdet och processen upprepas. + +> Obs: Du bör hålla träningsmängdens fönster fast för mer effektiv träning så att varje gång du lägger till en ny observation till träningsmängden, tar du bort observationen från början av mängden. + +Denna process ger en mer robust uppskattning av hur modellen kommer att prestera i praktiken. Dock kommer det till kostnaden av att skapa så många modeller. Detta är acceptabelt om datan är liten eller om modellen är enkel, men kan vara ett problem i större skala. + +Walk-forward-validering är guldstandarden för utvärdering av tidsseriemodeller och rekommenderas för dina egna projekt. + +1. Först, skapa en testdatapunkt för varje HORIZON-steg. + + ```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 | + + Datan förskjuts horisontellt enligt dess horisontpunkt. + +1. Gör prognoser på din testdata med denna glidande fönsteransats i en loop av testdatans längd: + + ```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) + ``` + + Du kan se träningen ske: + + ```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. Jämför prognoserna med den faktiska belastningen: + + ```python + eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)]) + eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1] + eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h') + eval_df['actual'] = np.array(np.transpose(test_ts)).ravel() + eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']]) + eval_df.head() + ``` + + Output + | | | 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 | + + Observera prognosen för timdata jämfört med den faktiska belastningen. Hur noggrann är den? + +### Kontrollera modellens noggrannhet + +Kontrollera noggrannheten för din modell genom att testa dess medelabsoluta procentuella fel (MAPE) över alla prognoser. +> **🧮 Visa mig matematiken** +> +> ![MAPE](../../../../7-TimeSeries/2-ARIMA/images/mape.png) +> +> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) används för att visa prognosnoggrannhet som en kvot definierad av formeln ovan. Skillnaden mellan verkligt och förutspått delas med det verkliga. +> +> "Det absoluta värdet i denna beräkning summeras för varje prognostiserad tidpunkt och delas med antalet anpassade punkter n." [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error) +1. Uttryck ekvationen i kod: + + ```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. Beräkna MAPE för ett steg: + + ```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 för ett steg: 0.5570581332313952 % + +1. Skriv ut MAPE för fler steg: + + ```python + print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%') + ``` + + ```output + Multi-step forecast MAPE: 1.1460048657704118 % + ``` + + Ett lågt värde är bäst: tänk på att en prognos med en MAPE på 10 innebär att den avviker med 10%. + +1. Men som alltid är det enklare att se denna typ av noggrannhetsmätning visuellt, så låt oss plotta det: + + ```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() + ``` + + ![en tidsseriemodell](../../../../7-TimeSeries/2-ARIMA/images/accuracy.png) + +🏆 En mycket fin graf som visar en modell med god noggrannhet. Bra jobbat! + +--- + +## 🚀Utmaning + +Utforska olika sätt att testa noggrannheten hos en tidsseriemodell. Vi berör MAPE i denna lektion, men finns det andra metoder du kan använda? Undersök dem och kommentera dem. Ett användbart dokument finns [här](https://otexts.com/fpp2/accuracy.html) + +## [Quiz efter lektionen](https://ff-quizzes.netlify.app/en/ml/) + +## Repetition & Självstudier + +Denna lektion täcker endast grunderna i tidsserieprognoser med ARIMA. Ta dig tid att fördjupa dina kunskaper genom att utforska [detta repository](https://microsoft.github.io/forecasting/) och dess olika modelltyper för att lära dig andra sätt att bygga tidsseriemodeller. + +## Uppgift + +[En ny ARIMA-modell](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/7-TimeSeries/2-ARIMA/assignment.md b/translations/sv/7-TimeSeries/2-ARIMA/assignment.md new file mode 100644 index 000000000..f1cb7641b --- /dev/null +++ b/translations/sv/7-TimeSeries/2-ARIMA/assignment.md @@ -0,0 +1,25 @@ + +# En ny ARIMA-modell + +## Instruktioner + +Nu när du har byggt en ARIMA-modell, bygg en ny med färska data (prova en av [dessa dataset från Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Kommentera ditt arbete i en notebook, visualisera data och din modell, och testa dess noggrannhet med hjälp av MAPE. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------- | +| | En notebook presenteras med en ny ARIMA-modell som är byggd, testad och förklarad med visualiseringar och angiven noggrannhet. | Den presenterade notebooken är inte kommenterad eller innehåller fel | En ofullständig notebook presenteras | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/7-TimeSeries/2-ARIMA/solution/Julia/README.md b/translations/sv/7-TimeSeries/2-ARIMA/solution/Julia/README.md new file mode 100644 index 000000000..e31b12cb7 --- /dev/null +++ b/translations/sv/7-TimeSeries/2-ARIMA/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/7-TimeSeries/2-ARIMA/solution/R/README.md b/translations/sv/7-TimeSeries/2-ARIMA/solution/R/README.md new file mode 100644 index 000000000..4ffdd40d0 --- /dev/null +++ b/translations/sv/7-TimeSeries/2-ARIMA/solution/R/README.md @@ -0,0 +1,15 @@ + +detta är en tillfällig platshållare + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/7-TimeSeries/3-SVR/README.md b/translations/sv/7-TimeSeries/3-SVR/README.md new file mode 100644 index 000000000..a7aa35861 --- /dev/null +++ b/translations/sv/7-TimeSeries/3-SVR/README.md @@ -0,0 +1,393 @@ + +# Tidsserieprognoser med Support Vector Regressor + +I den föregående lektionen lärde du dig hur man använder ARIMA-modellen för att göra tidsserieprognoser. Nu ska vi titta på Support Vector Regressor-modellen, som är en regressionsmodell som används för att förutsäga kontinuerliga data. + +## [Quiz före lektionen](https://ff-quizzes.netlify.app/en/ml/) + +## Introduktion + +I denna lektion kommer du att upptäcka ett specifikt sätt att bygga modeller med [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) för regression, eller **SVR: Support Vector Regressor**. + +### SVR i kontexten av tidsserier [^1] + +Innan vi förstår vikten av SVR för tidsserieprognoser, är här några viktiga begrepp du behöver känna till: + +- **Regression:** En teknik för övervakad inlärning som används för att förutsäga kontinuerliga värden från en given uppsättning indata. Idén är att passa en kurva (eller linje) i funktionsutrymmet som har maximalt antal datapunkter. [Klicka här](https://en.wikipedia.org/wiki/Regression_analysis) för mer information. +- **Support Vector Machine (SVM):** En typ av övervakad maskininlärningsmodell som används för klassificering, regression och detektering av avvikelser. Modellen är ett hyperplan i funktionsutrymmet, som i fallet med klassificering fungerar som en gräns, och i fallet med regression fungerar som den bästa anpassade linjen. I SVM används vanligtvis en kärnfunktion för att transformera datasetet till ett utrymme med högre dimensioner, så att de kan separeras enklare. [Klicka här](https://en.wikipedia.org/wiki/Support-vector_machine) för mer information om SVM. +- **Support Vector Regressor (SVR):** En typ av SVM som används för att hitta den bästa anpassade linjen (som i fallet med SVM är ett hyperplan) som har maximalt antal datapunkter. + +### Varför SVR? [^1] + +I den senaste lektionen lärde du dig om ARIMA, som är en mycket framgångsrik statistisk linjär metod för att förutsäga tidsseriedata. Men i många fall har tidsseriedata *icke-linjäritet*, vilket inte kan modelleras av linjära metoder. I sådana fall gör SVM:s förmåga att hantera icke-linjäritet i data för regressionsuppgifter SVR framgångsrik för tidsserieprognoser. + +## Övning - bygg en SVR-modell + +De första stegen för databeredning är desamma som i den föregående lektionen om [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA). + +Öppna mappen [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) i denna lektion och hitta filen [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb). [^2] + +1. Kör notebooken och importera de nödvändiga biblioteken: [^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. Ladda data från filen `/data/energy.csv` till en Pandas-dataram och granska den: [^2] + + ```python + energy = load_data('../../data')[['load']] + ``` + +3. Plotta all tillgänglig energidata från januari 2012 till december 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() + ``` + + ![full data](../../../../7-TimeSeries/3-SVR/images/full-data.png) + + Nu ska vi bygga vår SVR-modell. + +### Skapa tränings- och testdataset + +Nu är din data laddad, så du kan dela upp den i tränings- och testdataset. Därefter omformar du datan för att skapa ett dataset baserat på tidssteg, vilket kommer att behövas för SVR. Du tränar din modell på träningsdatasetet. När modellen har tränats klart utvärderar du dess noggrannhet på träningsdatasetet, testdatasetet och sedan hela datasetet för att se den övergripande prestandan. Du måste säkerställa att testdatasetet täcker en senare tidsperiod än träningsdatasetet för att säkerställa att modellen inte får information från framtida tidsperioder [^2] (en situation som kallas *överanpassning*). + +1. Tilldela en tvåmånadersperiod från 1 september till 31 oktober 2014 till träningsdatasetet. Testdatasetet kommer att inkludera tvåmånadersperioden från 1 november till 31 december 2014: [^2] + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + +2. Visualisera skillnaderna: [^2] + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![training and testing data](../../../../7-TimeSeries/3-SVR/images/train-test.png) + +### Förbered data för träning + +Nu behöver du förbereda data för träning genom att filtrera och skala din data. Filtrera ditt dataset för att endast inkludera de tidsperioder och kolumner du behöver, och skala för att säkerställa att datan projiceras inom intervallet 0,1. + +1. Filtrera det ursprungliga datasetet för att endast inkludera de nämnda tidsperioderna per set och endast inkludera den nödvändiga kolumnen '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. Skala träningsdatan till intervallet (0, 1): [^2] + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + ``` + +4. Skala nu testdatan: [^2] + + ```python + test['load'] = scaler.transform(test) + ``` + +### Skapa data med tidssteg [^1] + +För SVR omvandlar du indata till formen `[batch, timesteps]`. Så du omformar den befintliga `train_data` och `test_data` så att det finns en ny dimension som hänvisar till tidsstegen. + +```python +# Converting to numpy arrays +train_data = train.values +test_data = test.values +``` + +För detta exempel tar vi `timesteps = 5`. Så indata till modellen är datan för de första 4 tidsstegen, och utdata kommer att vara datan för det 5:e tidssteget. + +```python +timesteps=5 +``` + +Omvandla träningsdata till en 2D-tensor med hjälp av nästlad listkomprimering: + +```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) +``` + +Omvandla testdata till en 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) +``` + +Välja indata och utdata från tränings- och testdata: + +```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) +``` + +### Implementera SVR [^1] + +Nu är det dags att implementera SVR. För att läsa mer om denna implementering kan du referera till [denna dokumentation](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html). För vår implementering följer vi dessa steg: + + 1. Definiera modellen genom att kalla på `SVR()` och skicka in modellens hyperparametrar: kernel, gamma, c och epsilon + 2. Förbered modellen för träningsdata genom att kalla på funktionen `fit()` + 3. Gör förutsägelser genom att kalla på funktionen `predict()` + +Nu skapar vi en SVR-modell. Här använder vi [RBF-kärnan](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel), och ställer in hyperparametrarna gamma, C och epsilon till 0.5, 10 och 0.05 respektive. + +```python +model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05) +``` + +#### Träna modellen på träningsdata [^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) +``` + +#### Gör modellförutsägelser [^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) +``` + +Du har byggt din SVR! Nu behöver vi utvärdera den. + +### Utvärdera din modell [^1] + +För utvärdering kommer vi först att skala tillbaka datan till vår ursprungliga skala. Sedan, för att kontrollera prestandan, kommer vi att plotta den ursprungliga och förutsagda tidsserieplotten, och även skriva ut MAPE-resultatet. + +Skala tillbaka den förutsagda och ursprungliga utdata: + +```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)) +``` + +#### Kontrollera modellens prestanda på tränings- och testdata [^1] + +Vi extraherar tidsstämplarna från datasetet för att visa på x-axeln i vår plot. Observera att vi använder de första ```timesteps-1``` värdena som indata för den första utdata, så tidsstämplarna för utdata börjar efter det. + +```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 +``` + +Plotta förutsägelser för träningsdata: + +```python +plt.figure(figsize=(25,6)) +plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.title("Training data prediction") +plt.show() +``` + +![training data prediction](../../../../7-TimeSeries/3-SVR/images/train-data-predict.png) + +Skriv ut MAPE för träningsdata + +```python +print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%') +``` + +```output +MAPE for training data: 1.7195710200875551 % +``` + +Plotta förutsägelser för testdata + +```python +plt.figure(figsize=(10,3)) +plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![testing data prediction](../../../../7-TimeSeries/3-SVR/images/test-data-predict.png) + +Skriv ut MAPE för testdata + +```python +print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%') +``` + +```output +MAPE for testing data: 1.2623790187854018 % +``` + +🏆 Du har ett mycket bra resultat på testdatasetet! + +### Kontrollera modellens prestanda på hela datasetet [^1] + +```python +# Extracting load values as numpy array +data = energy.copy().values + +# Scaling +data = scaler.transform(data) + +# Transforming to 2D tensor as per model input requirement +data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0] +print("Tensor shape: ", data_timesteps.shape) + +# Selecting inputs and outputs from data +X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]] +print("X shape: ", X.shape,"\nY shape: ", Y.shape) +``` + +```output +Tensor shape: (26300, 5) +X shape: (26300, 4) +Y shape: (26300, 1) +``` + +```python +# Make model predictions +Y_pred = model.predict(X).reshape(-1,1) + +# Inverse scale and reshape +Y_pred = scaler.inverse_transform(Y_pred) +Y = scaler.inverse_transform(Y) +``` + +```python +plt.figure(figsize=(30,8)) +plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(Y_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![full data prediction](../../../../7-TimeSeries/3-SVR/images/full-data-predict.png) + +```python +print('MAPE: ', mape(Y_pred, Y)*100, '%') +``` + +```output +MAPE: 2.0572089029888656 % +``` + +🏆 Mycket fina plottar som visar en modell med god noggrannhet. Bra jobbat! + +--- + +## 🚀Utmaning + +- Försök att justera hyperparametrarna (gamma, C, epsilon) när du skapar modellen och utvärdera på datan för att se vilka uppsättningar av hyperparametrar som ger de bästa resultaten på testdatan. För att veta mer om dessa hyperparametrar kan du referera till dokumentet [här](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel). +- Försök att använda olika kärnfunktioner för modellen och analysera deras prestanda på datasetet. Ett hjälpsamt dokument kan hittas [här](https://scikit-learn.org/stable/modules/svm.html#kernel-functions). +- Försök att använda olika värden för `timesteps` för modellen att titta tillbaka för att göra förutsägelser. + +## [Quiz efter lektionen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Denna lektion introducerade tillämpningen av SVR för tidsserieprognoser. För att läsa mer om SVR kan du referera till [denna blogg](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/). Denna [dokumentation om scikit-learn](https://scikit-learn.org/stable/modules/svm.html) ger en mer omfattande förklaring om SVM i allmänhet, [SVR](https://scikit-learn.org/stable/modules/svm.html#regression) och även andra implementeringsdetaljer såsom de olika [kärnfunktionerna](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) som kan användas, och deras parametrar. + +## Uppgift + +[En ny SVR-modell](assignment.md) + +## Krediter + +[^1]: Text, kod och resultat i denna sektion bidrog av [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD) +[^2]: Text, kod och resultat i denna sektion togs från [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/7-TimeSeries/3-SVR/assignment.md b/translations/sv/7-TimeSeries/3-SVR/assignment.md new file mode 100644 index 000000000..d8558ffd2 --- /dev/null +++ b/translations/sv/7-TimeSeries/3-SVR/assignment.md @@ -0,0 +1,27 @@ + +# En ny SVR-modell + +## Instruktioner [^1] + +Nu när du har byggt en SVR-modell, skapa en ny med färska data (prova en av [dessa dataset från Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Kommentera ditt arbete i en notebook, visualisera data och din modell, och testa dess noggrannhet med lämpliga diagram och MAPE. Prova också att justera de olika hyperparametrarna och använda olika värden för tidsstegen. + +## Bedömningskriterier [^1] + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ----------------------------------------------------------- | --------------------------------------------------------- | ----------------------------------- | +| | En notebook presenteras med en SVR-modell som är byggd, testad och förklarad med visualiseringar och angiven noggrannhet. | Den presenterade notebooken är inte kommenterad eller innehåller fel. | En ofullständig notebook presenteras | + +[^1]:Texten i denna sektion baserades på [uppgiften från ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/7-TimeSeries/README.md b/translations/sv/7-TimeSeries/README.md new file mode 100644 index 000000000..42370275d --- /dev/null +++ b/translations/sv/7-TimeSeries/README.md @@ -0,0 +1,37 @@ + +# Introduktion till tidsserieprognostisering + +Vad är tidsserieprognostisering? Det handlar om att förutsäga framtida händelser genom att analysera trender från det förflutna. + +## Regionalt ämne: global elförbrukning ✨ + +I dessa två lektioner kommer du att introduceras till tidsserieprognostisering, ett något mindre känt område inom maskininlärning som ändå är oerhört värdefullt för industri- och affärsapplikationer, bland andra områden. Även om neurala nätverk kan användas för att förbättra nyttan av dessa modeller, kommer vi att studera dem i kontexten av klassisk maskininlärning, eftersom modeller hjälper till att förutsäga framtida prestanda baserat på det förflutna. + +Vårt regionala fokus är elförbrukning i världen, ett intressant dataset för att lära sig att prognostisera framtida elförbrukning baserat på mönster från tidigare belastning. Du kan se hur denna typ av prognostisering kan vara oerhört användbar i en affärsmiljö. + +![el-nät](../../../7-TimeSeries/images/electric-grid.jpg) + +Foto av [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) av elstolpar på en väg i Rajasthan på [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +## Lektioner + +1. [Introduktion till tidsserieprognostisering](1-Introduction/README.md) +2. [Bygga ARIMA-modeller för tidsserier](2-ARIMA/README.md) +3. [Bygga Support Vector Regressor för tidsserieprognostisering](3-SVR/README.md) + +## Krediter + +"Introduktion till tidsserieprognostisering" skrevs med ⚡️ av [Francesca Lazzeri](https://twitter.com/frlazzeri) och [Jen Looper](https://twitter.com/jenlooper). Anteckningsböckerna publicerades först online i [Azure "Deep Learning For Time Series"-repo](https://github.com/Azure/DeepLearningForTimeSeriesForecasting) ursprungligen skrivet av Francesca Lazzeri. Lektionen om SVR skrevs av [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD). + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/8-Reinforcement/1-QLearning/README.md b/translations/sv/8-Reinforcement/1-QLearning/README.md new file mode 100644 index 000000000..1581571df --- /dev/null +++ b/translations/sv/8-Reinforcement/1-QLearning/README.md @@ -0,0 +1,256 @@ + +# Introduktion till förstärkningsinlärning och Q-Learning + +![Sammanfattning av förstärkning inom maskininlärning i en sketchnote](../../../../sketchnotes/ml-reinforcement.png) +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +Förstärkningsinlärning involverar tre viktiga koncept: agenten, några tillstånd och en uppsättning av handlingar per tillstånd. Genom att utföra en handling i ett specifikt tillstånd får agenten en belöning. Tänk dig datorspelet Super Mario. Du är Mario, du befinner dig på en nivå i spelet, stående vid kanten av en klippa. Ovanför dig finns ett mynt. Du som Mario, på en nivå i spelet, på en specifik position ... det är ditt tillstånd. Om du tar ett steg åt höger (en handling) faller du över kanten, vilket ger dig en låg numerisk poäng. Men om du trycker på hoppknappen får du en poäng och förblir vid liv. Det är ett positivt resultat och bör ge dig en positiv numerisk poäng. + +Genom att använda förstärkningsinlärning och en simulator (spelet) kan du lära dig att spela spelet för att maximera belöningen, vilket innebär att hålla dig vid liv och samla så många poäng som möjligt. + +[![Introduktion till förstärkningsinlärning](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) + +> 🎥 Klicka på bilden ovan för att höra Dmitry diskutera förstärkningsinlärning + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Förutsättningar och inställning + +I denna lektion kommer vi att experimentera med kod i Python. Du bör kunna köra Jupyter Notebook-koden från denna lektion, antingen på din dator eller i molnet. + +Du kan öppna [lektionens notebook](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) och följa med i lektionen för att bygga. + +> **Obs:** Om du öppnar denna kod från molnet behöver du också hämta filen [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), som används i notebook-koden. Lägg den i samma katalog som notebook-filen. + +## Introduktion + +I denna lektion kommer vi att utforska världen av **[Peter och vargen](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, inspirerad av en musikalisk saga av den ryske kompositören [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Vi kommer att använda **förstärkningsinlärning** för att låta Peter utforska sin miljö, samla goda äpplen och undvika att möta vargen. + +**Förstärkningsinlärning** (RL) är en inlärningsteknik som gör det möjligt för oss att lära oss ett optimalt beteende hos en **agent** i en viss **miljö** genom att köra många experiment. En agent i denna miljö bör ha ett **mål**, definierat av en **belöningsfunktion**. + +## Miljön + +För enkelhetens skull kan vi tänka oss Peters värld som en kvadratisk spelbräda med storleken `width` x `height`, som denna: + +![Peters miljö](../../../../8-Reinforcement/1-QLearning/images/environment.png) + +Varje cell på denna bräda kan vara: + +* **mark**, där Peter och andra varelser kan gå. +* **vatten**, där man uppenbarligen inte kan gå. +* ett **träd** eller **gräs**, en plats där man kan vila. +* ett **äpple**, som representerar något Peter gärna vill hitta för att äta. +* en **varg**, som är farlig och bör undvikas. + +Det finns en separat Python-modul, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), som innehåller koden för att arbeta med denna miljö. Eftersom denna kod inte är viktig för att förstå våra koncept, kommer vi att importera modulen och använda den för att skapa spelbrädan (kodblock 1): + +```python +from rlboard import * + +width, height = 8,8 +m = Board(width,height) +m.randomize(seed=13) +m.plot() +``` + +Denna kod bör skriva ut en bild av miljön som liknar den ovan. + +## Handlingar och strategi + +I vårt exempel skulle Peters mål vara att hitta ett äpple, samtidigt som han undviker vargen och andra hinder. För att göra detta kan han i princip gå runt tills han hittar ett äpple. + +Därför kan han vid varje position välja mellan följande handlingar: upp, ner, vänster och höger. + +Vi kommer att definiera dessa handlingar som en ordbok och koppla dem till par av motsvarande koordinatförändringar. Till exempel skulle rörelse åt höger (`R`) motsvara paret `(1,0)`. (kodblock 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()) } +``` + +Sammanfattningsvis är strategin och målet för detta scenario följande: + +- **Strategin**, för vår agent (Peter) definieras av en så kallad **policy**. En policy är en funktion som returnerar handlingen vid ett givet tillstånd. I vårt fall representeras problemet av spelbrädan, inklusive spelarens aktuella position. + +- **Målet**, med förstärkningsinlärning är att så småningom lära sig en bra policy som gör det möjligt för oss att lösa problemet effektivt. Men som en grundläggande utgångspunkt kan vi överväga den enklaste policyn som kallas **slumpvandring**. + +## Slumpvandring + +Låt oss först lösa vårt problem genom att implementera en slumpvandring-strategi. Med slumpvandring kommer vi slumpmässigt att välja nästa handling från de tillåtna handlingarna tills vi når äpplet (kodblock 3). + +1. Implementera slumpvandringen med koden nedan: + + ```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) + ``` + + Anropet till `walk` bör returnera längden på den motsvarande vägen, som kan variera från en körning till en annan. + +1. Kör experimentet med slumpvandring ett antal gånger (säg 100) och skriv ut de resulterande statistiken (kodblock 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) + ``` + + Observera att den genomsnittliga längden på en väg är cirka 30-40 steg, vilket är ganska mycket, med tanke på att det genomsnittliga avståndet till närmaste äpple är cirka 5-6 steg. + + Du kan också se hur Peters rörelse ser ut under slumpvandringen: + + ![Peters slumpvandring](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) + +## Belöningsfunktion + +För att göra vår policy mer intelligent behöver vi förstå vilka rörelser som är "bättre" än andra. För att göra detta måste vi definiera vårt mål. + +Målet kan definieras i termer av en **belöningsfunktion**, som returnerar ett poängvärde för varje tillstånd. Ju högre nummer, desto bättre belöningsfunktion. (kodblock 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 +``` + +En intressant sak med belöningsfunktioner är att i de flesta fall *får vi bara en betydande belöning i slutet av spelet*. Detta innebär att vår algoritm på något sätt måste komma ihåg "bra" steg som leder till en positiv belöning i slutet och öka deras betydelse. På samma sätt bör alla rörelser som leder till dåliga resultat avskräckas. + +## Q-Learning + +En algoritm som vi kommer att diskutera här kallas **Q-Learning**. I denna algoritm definieras policyn av en funktion (eller en datastruktur) som kallas en **Q-Tabell**. Den registrerar "kvaliteten" på varje handling i ett givet tillstånd. + +Den kallas en Q-Tabell eftersom det ofta är bekvämt att representera den som en tabell eller en multidimensionell array. Eftersom vår bräda har dimensionerna `width` x `height`, kan vi representera Q-Tabellen med en numpy-array med formen `width` x `height` x `len(actions)`: (kodblock 6) + +```python +Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) +``` + +Observera att vi initialiserar alla värden i Q-Tabellen med ett lika värde, i vårt fall - 0.25. Detta motsvarar policyn "slumpvandring", eftersom alla rörelser i varje tillstånd är lika bra. Vi kan skicka Q-Tabellen till funktionen `plot` för att visualisera tabellen på brädan: `m.plot(Q)`. + +![Peters miljö](../../../../8-Reinforcement/1-QLearning/images/env_init.png) + +I mitten av varje cell finns en "pil" som indikerar den föredragna rörelseriktningen. Eftersom alla riktningar är lika visas en punkt. + +Nu behöver vi köra simuleringen, utforska vår miljö och lära oss en bättre fördelning av Q-Tabellvärden, vilket gör att vi kan hitta vägen till äpplet mycket snabbare. + +## Kärnan i Q-Learning: Bellman-ekvationen + +När vi börjar röra oss kommer varje handling att ha en motsvarande belöning, dvs. vi kan teoretiskt välja nästa handling baserat på den högsta omedelbara belöningen. Men i de flesta tillstånd kommer rörelsen inte att uppnå vårt mål att nå äpplet, och vi kan därför inte omedelbart avgöra vilken riktning som är bättre. + +> Kom ihåg att det inte är det omedelbara resultatet som spelar roll, utan snarare det slutliga resultatet, som vi kommer att få i slutet av simuleringen. + +För att ta hänsyn till denna fördröjda belöning måste vi använda principerna för **[dynamisk programmering](https://en.wikipedia.org/wiki/Dynamic_programming)**, som gör det möjligt för oss att tänka på vårt problem rekursivt. + +Anta att vi nu är i tillståndet *s*, och vi vill gå vidare till nästa tillstånd *s'*. Genom att göra det kommer vi att få den omedelbara belöningen *r(s,a)*, definierad av belöningsfunktionen, plus någon framtida belöning. Om vi antar att vår Q-Tabell korrekt återspeglar "attraktiviteten" hos varje handling, kommer vi vid tillståndet *s'* att välja en handling *a* som motsvarar det maximala värdet av *Q(s',a')*. Således definieras den bästa möjliga framtida belöningen vi kan få vid tillståndet *s* som `max` + +## Kontrollera policyn + +Eftersom Q-Tabellen listar "attraktiviteten" för varje handling i varje tillstånd, är det ganska enkelt att använda den för att definiera effektiv navigering i vår värld. I det enklaste fallet kan vi välja den handling som motsvarar det högsta värdet i Q-Tabellen: (kodblock 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) +``` + +> Om du testar koden ovan flera gånger kan du märka att den ibland "fastnar", och du måste trycka på STOP-knappen i notebooken för att avbryta den. Detta händer eftersom det kan finnas situationer där två tillstånd "pekar" på varandra i termer av optimalt Q-värde, vilket gör att agenten hamnar i en oändlig rörelse mellan dessa tillstånd. + +## 🚀Utmaning + +> **Uppgift 1:** Modifiera funktionen `walk` för att begränsa den maximala längden på vägen till ett visst antal steg (t.ex. 100), och se hur koden ovan returnerar detta värde då och då. + +> **Uppgift 2:** Modifiera funktionen `walk` så att den inte går tillbaka till platser där den redan har varit tidigare. Detta kommer att förhindra att `walk` hamnar i en loop, men agenten kan fortfarande bli "fast" på en plats som den inte kan ta sig ifrån. + +## Navigering + +En bättre navigeringspolicy skulle vara den vi använde under träningen, som kombinerar exploatering och utforskning. I denna policy kommer vi att välja varje handling med en viss sannolikhet, proportionell mot värdena i Q-Tabellen. Denna strategi kan fortfarande leda till att agenten återvänder till en position den redan har utforskat, men som du kan se från koden nedan resulterar den i en mycket kortare genomsnittlig väg till den önskade platsen (kom ihåg att `print_statistics` kör simuleringen 100 gånger): (kodblock 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) +``` + +Efter att ha kört denna kod bör du få en mycket mindre genomsnittlig väg än tidigare, i intervallet 3-6. + +## Undersöka inlärningsprocessen + +Som vi har nämnt är inlärningsprocessen en balans mellan utforskning och utnyttjande av den kunskap vi har fått om problemområdets struktur. Vi har sett att resultaten av inlärningen (förmågan att hjälpa en agent att hitta en kort väg till målet) har förbättrats, men det är också intressant att observera hur den genomsnittliga väglängden beter sig under inlärningsprocessen: + +## Sammanfattning av lärdomarna: + +- **Genomsnittlig väglängd ökar**. Det vi ser här är att i början ökar den genomsnittliga väglängden. Detta beror troligen på att när vi inte vet något om miljön är vi mer benägna att fastna i dåliga tillstånd, som vatten eller varg. När vi lär oss mer och börjar använda denna kunskap kan vi utforska miljön längre, men vi vet fortfarande inte var äpplena finns särskilt väl. + +- **Väglängden minskar när vi lär oss mer**. När vi har lärt oss tillräckligt blir det lättare för agenten att nå målet, och väglängden börjar minska. Vi är dock fortfarande öppna för utforskning, så vi avviker ofta från den bästa vägen och utforskar nya alternativ, vilket gör vägen längre än optimal. + +- **Längden ökar plötsligt**. Det vi också observerar på denna graf är att vid någon punkt ökade längden plötsligt. Detta indikerar den stokastiska naturen hos processen, och att vi vid något tillfälle kan "förstöra" Q-Tabellens koefficienter genom att skriva över dem med nya värden. Detta bör idealt minimeras genom att minska inlärningshastigheten (till exempel mot slutet av träningen justerar vi endast Q-Tabellens värden med ett litet värde). + +Sammanfattningsvis är det viktigt att komma ihåg att framgången och kvaliteten på inlärningsprocessen beror avsevärt på parametrar som inlärningshastighet, inlärningshastighetsminskning och diskonteringsfaktor. Dessa kallas ofta **hyperparametrar**, för att skilja dem från **parametrar**, som vi optimerar under träningen (till exempel Q-Tabellens koefficienter). Processen att hitta de bästa värdena för hyperparametrar kallas **hyperparameteroptimering**, och det förtjänar ett eget ämne. + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Uppgift +[En mer realistisk värld](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/8-Reinforcement/1-QLearning/assignment.md b/translations/sv/8-Reinforcement/1-QLearning/assignment.md new file mode 100644 index 000000000..66ae633e1 --- /dev/null +++ b/translations/sv/8-Reinforcement/1-QLearning/assignment.md @@ -0,0 +1,41 @@ + +# En Mer Realistisk Värld + +I vår situation kunde Peter röra sig nästan utan att bli trött eller hungrig. I en mer realistisk värld måste han sätta sig ner och vila då och då, och även äta för att hålla sig mätt. Låt oss göra vår värld mer realistisk genom att implementera följande regler: + +1. När Peter rör sig från en plats till en annan förlorar han **energi** och får **trötthet**. +2. Peter kan få mer energi genom att äta äpplen. +3. Peter kan bli av med trötthet genom att vila under trädet eller på gräset (dvs. gå till en plats på spelplanen med ett träd eller gräs - grönt fält). +4. Peter måste hitta och döda vargen. +5. För att döda vargen måste Peter ha vissa nivåer av energi och trötthet, annars förlorar han striden. + +## Instruktioner + +Använd den ursprungliga [notebook.ipynb](../../../../8-Reinforcement/1-QLearning/notebook.ipynb) som utgångspunkt för din lösning. + +Modifiera belöningsfunktionen ovan enligt spelets regler, kör förstärkningsinlärningsalgoritmen för att lära dig den bästa strategin för att vinna spelet, och jämför resultaten av slumpmässig gång med din algoritm i termer av antal vunna och förlorade spel. + +> **Note**: I din nya värld är tillståndet mer komplext och inkluderar, förutom människans position, även nivåer av trötthet och energi. Du kan välja att representera tillståndet som en tuple (Board,energy,fatigue), eller definiera en klass för tillståndet (du kan också vilja härleda den från `Board`), eller till och med modifiera den ursprungliga `Board`-klassen i [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py). + +I din lösning, behåll koden som ansvarar för strategin med slumpmässig gång och jämför resultaten av din algoritm med slumpmässig gång i slutet. + +> **Note**: Du kan behöva justera hyperparametrar för att få det att fungera, särskilt antalet epoker. Eftersom spelets framgång (att slåss mot vargen) är en sällsynt händelse kan du förvänta dig mycket längre träningstid. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver Förbättras | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| | En notebook presenteras med definitionen av nya världens regler, Q-Learning-algoritmen och några textförklaringar. Q-Learning kan avsevärt förbättra resultaten jämfört med slumpmässig gång. | Notebook presenteras, Q-Learning är implementerad och förbättrar resultaten jämfört med slumpmässig gång, men inte avsevärt; eller notebook är dåligt dokumenterad och koden är inte välstrukturerad | Några försök att omdefiniera världens regler görs, men Q-Learning-algoritmen fungerar inte, eller belöningsfunktionen är inte fullt definierad | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/8-Reinforcement/1-QLearning/solution/Julia/README.md b/translations/sv/8-Reinforcement/1-QLearning/solution/Julia/README.md new file mode 100644 index 000000000..fd09c4543 --- /dev/null +++ b/translations/sv/8-Reinforcement/1-QLearning/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiska översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/8-Reinforcement/1-QLearning/solution/R/README.md b/translations/sv/8-Reinforcement/1-QLearning/solution/R/README.md new file mode 100644 index 000000000..f52eb4db7 --- /dev/null +++ b/translations/sv/8-Reinforcement/1-QLearning/solution/R/README.md @@ -0,0 +1,15 @@ + +detta är en tillfällig platshållare + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som kan uppstå vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/8-Reinforcement/2-Gym/README.md b/translations/sv/8-Reinforcement/2-Gym/README.md new file mode 100644 index 000000000..e9a6215a7 --- /dev/null +++ b/translations/sv/8-Reinforcement/2-Gym/README.md @@ -0,0 +1,333 @@ + +## Förkunskaper + +I denna lektion kommer vi att använda ett bibliotek som heter **OpenAI Gym** för att simulera olika **miljöer**. Du kan köra kod från denna lektion lokalt (t.ex. från Visual Studio Code), i vilket fall simuleringen öppnas i ett nytt fönster. Om du kör koden online kan du behöva göra vissa justeringar, som beskrivs [här](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7). + +## OpenAI Gym + +I den föregående lektionen definierades spelets regler och tillstånd av klassen `Board` som vi skapade själva. Här kommer vi att använda en speciell **simuleringsmiljö** som simulerar fysiken bakom den balanserande stången. En av de mest populära simuleringsmiljöerna för att träna förstärkningsinlärningsalgoritmer kallas [Gym](https://gym.openai.com/), som underhålls av [OpenAI](https://openai.com/). Med hjälp av Gym kan vi skapa olika **miljöer**, från cartpole-simuleringar till Atari-spel. + +> **Note**: Du kan se andra miljöer som finns tillgängliga från OpenAI Gym [här](https://gym.openai.com/envs/#classic_control). + +Först installerar vi Gym och importerar nödvändiga bibliotek (kodblock 1): + +```python +import sys +!{sys.executable} -m pip install gym + +import gym +import matplotlib.pyplot as plt +import numpy as np +import random +``` + +## Övning - initiera en cartpole-miljö + +För att arbeta med problemet att balansera en cartpole behöver vi initiera motsvarande miljö. Varje miljö är associerad med: + +- **Observationsutrymme** som definierar strukturen för den information vi får från miljön. För cartpole-problemet får vi positionen av stången, hastighet och några andra värden. + +- **Handlingsutrymme** som definierar möjliga handlingar. I vårt fall är handlingsutrymmet diskret och består av två handlingar - **vänster** och **höger**. (kodblock 2) + +1. För att initiera, skriv följande kod: + + ```python + env = gym.make("CartPole-v1") + print(env.action_space) + print(env.observation_space) + print(env.action_space.sample()) + ``` + +För att se hur miljön fungerar, låt oss köra en kort simulering i 100 steg. Vid varje steg tillhandahåller vi en av handlingarna som ska utföras - i denna simulering väljer vi bara slumpmässigt en handling från `action_space`. + +1. Kör koden nedan och se vad det leder till. + + ✅ Kom ihåg att det är att föredra att köra denna kod på en lokal Python-installation! (kodblock 3) + + ```python + env.reset() + + for i in range(100): + env.render() + env.step(env.action_space.sample()) + env.close() + ``` + + Du bör se något liknande denna bild: + + ![icke-balanserande cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) + +1. Under simuleringen behöver vi få observationer för att kunna bestämma hur vi ska agera. Faktum är att funktionen `step` returnerar aktuella observationer, en belöningsfunktion och flaggan `done` som indikerar om det är meningsfullt att fortsätta simuleringen eller inte: (kodblock 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() + ``` + + Du kommer att se något liknande detta i notebookens output: + + ```text + [ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0 + [ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0 + [ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0 + [ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0 + [ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0 + ... + [ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0 + [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0 + ``` + + Observationsvektorn som returneras vid varje steg av simuleringen innehåller följande värden: + - Vagnens position + - Vagnens hastighet + - Stångens vinkel + - Stångens rotationshastighet + +1. Hämta min- och maxvärden för dessa nummer: (kodblock 5) + + ```python + print(env.observation_space.low) + print(env.observation_space.high) + ``` + + Du kanske också märker att belöningsvärdet vid varje simuleringssteg alltid är 1. Detta beror på att vårt mål är att överleva så länge som möjligt, dvs. hålla stången i en rimligt vertikal position under längst möjliga tid. + + ✅ Faktum är att CartPole-simuleringen anses vara löst om vi lyckas få ett genomsnittligt belöningsvärde på 195 över 100 på varandra följande försök. + +## Diskretisering av tillstånd + +I Q-Learning behöver vi bygga en Q-Tabell som definierar vad vi ska göra vid varje tillstånd. För att kunna göra detta måste tillståndet vara **diskret**, mer specifikt, det bör innehålla ett ändligt antal diskreta värden. Därför måste vi på något sätt **diskretisera** våra observationer och mappa dem till en ändlig uppsättning tillstånd. + +Det finns några sätt vi kan göra detta på: + +- **Dela upp i intervall**. Om vi känner till intervallet för ett visst värde kan vi dela detta intervall i ett antal **intervall**, och sedan ersätta värdet med det intervallnummer det tillhör. Detta kan göras med hjälp av numpy-metoden [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html). I detta fall kommer vi att veta exakt storleken på tillståndet, eftersom det beror på antalet intervall vi väljer för digitalisering. + +✅ Vi kan använda linjär interpolation för att föra värden till ett ändligt intervall (säg, från -20 till 20), och sedan konvertera siffror till heltal genom avrundning. Detta ger oss lite mindre kontroll över storleken på tillståndet, särskilt om vi inte känner till de exakta intervallen för ingångsvärdena. Till exempel, i vårt fall har 2 av 4 värden inga övre/nedre gränser för sina värden, vilket kan resultera i ett oändligt antal tillstånd. + +I vårt exempel kommer vi att använda det andra tillvägagångssättet. Som du kanske märker senare, trots obestämda övre/nedre gränser, tar dessa värden sällan värden utanför vissa ändliga intervall, vilket gör att tillstånd med extrema värden blir mycket sällsynta. + +1. Här är funktionen som tar observationen från vår modell och producerar en tuple med 4 heltalsvärden: (kodblock 6) + + ```python + def discretize(x): + return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int)) + ``` + +1. Låt oss också utforska en annan diskretiseringsmetod med hjälp av intervall: (kodblock 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. Låt oss nu köra en kort simulering och observera dessa diskreta miljövärden. Testa gärna både `discretize` och `discretize_bins` och se om det finns någon skillnad. + + ✅ `discretize_bins` returnerar intervallnumret, som är 0-baserat. För värden på ingångsvariabeln runt 0 returnerar det numret från mitten av intervallet (10). I `discretize` brydde vi oss inte om intervallet för utgångsvärdena, vilket tillåter dem att vara negativa, så tillståndsvärdena är inte förskjutna och 0 motsvarar 0. (kodblock 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() + ``` + + ✅ Avkommentera raden som börjar med `env.render` om du vill se hur miljön exekveras. Annars kan du köra den i bakgrunden, vilket är snabbare. Vi kommer att använda denna "osynliga" exekvering under vår Q-Learning-process. + +## Q-Tabellens struktur + +I vår föregående lektion var tillståndet ett enkelt par av siffror från 0 till 8, och det var därför bekvämt att representera Q-Tabellen med en numpy-tensor med formen 8x8x2. Om vi använder intervall-diskretisering är storleken på vår tillståndsvektor också känd, så vi kan använda samma tillvägagångssätt och representera tillståndet med en array med formen 20x20x10x10x2 (här är 2 dimensionen för handlingsutrymmet, och de första dimensionerna motsvarar antalet intervall vi har valt att använda för varje parameter i observationsutrymmet). + +Men ibland är de exakta dimensionerna för observationsutrymmet inte kända. I fallet med funktionen `discretize` kan vi aldrig vara säkra på att vårt tillstånd håller sig inom vissa gränser, eftersom vissa av de ursprungliga värdena inte är begränsade. Därför kommer vi att använda ett något annorlunda tillvägagångssätt och representera Q-Tabellen med en ordbok. + +1. Använd paret *(state,action)* som nyckel i ordboken, och värdet skulle motsvara värdet i Q-Tabellen. (kodblock 9) + + ```python + Q = {} + actions = (0,1) + + def qvalues(state): + return [Q.get((state,a),0) for a in actions] + ``` + + Här definierar vi också en funktion `qvalues()`, som returnerar en lista med värden från Q-Tabellen för ett givet tillstånd som motsvarar alla möjliga handlingar. Om posten inte finns i Q-Tabellen kommer vi att returnera 0 som standard. + +## Låt oss börja med Q-Learning + +Nu är vi redo att lära Peter att balansera! + +1. Först, låt oss ställa in några hyperparametrar: (kodblock 10) + + ```python + # hyperparameters + alpha = 0.3 + gamma = 0.9 + epsilon = 0.90 + ``` + + Här är `alpha` **inlärningshastigheten** som definierar i vilken utsträckning vi ska justera de aktuella värdena i Q-Tabellen vid varje steg. I den föregående lektionen började vi med 1 och minskade sedan `alpha` till lägre värden under träningen. I detta exempel kommer vi att hålla den konstant för enkelhetens skull, och du kan experimentera med att justera `alpha`-värden senare. + + `gamma` är **diskonteringsfaktorn** som visar i vilken utsträckning vi ska prioritera framtida belöningar över nuvarande belöningar. + + `epsilon` är **utforsknings-/utnyttjandefaktorn** som avgör om vi ska föredra utforskning framför utnyttjande eller vice versa. I vår algoritm kommer vi i `epsilon` procent av fallen att välja nästa handling enligt Q-Tabellens värden, och i resterande antal fall kommer vi att utföra en slumpmässig handling. Detta gör att vi kan utforska områden i sökutrymmet som vi aldrig har sett tidigare. + + ✅ När det gäller balansering - att välja slumpmässig handling (utforskning) skulle fungera som ett slumpmässigt slag i fel riktning, och stången skulle behöva lära sig att återfå balansen från dessa "misstag". + +### Förbättra algoritmen + +Vi kan också göra två förbättringar av vår algoritm från den föregående lektionen: + +- **Beräkna genomsnittlig kumulativ belöning** över ett antal simuleringar. Vi kommer att skriva ut framstegen var 5000:e iteration och vi kommer att ta genomsnittet av vår kumulativa belöning under den tidsperioden. Det betyder att om vi får mer än 195 poäng kan vi anse problemet löst, med ännu högre kvalitet än vad som krävs. + +- **Beräkna maximal genomsnittlig kumulativ belöning**, `Qmax`, och vi kommer att lagra Q-Tabellen som motsvarar det resultatet. När du kör träningen kommer du att märka att ibland börjar det genomsnittliga kumulativa resultatet sjunka, och vi vill behålla värdena i Q-Tabellen som motsvarar den bästa modellen som observerats under träningen. + +1. Samla alla kumulativa belöningar vid varje simulering i vektorn `rewards` för vidare plottning. (kodblock 11) + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + + Qmax = 0 + cum_rewards = [] + rewards = [] + for epoch in range(100000): + obs = env.reset() + done = False + cum_reward=0 + # == do the simulation == + while not done: + s = discretize(obs) + if random.random() Qmax: + Qmax = np.average(cum_rewards) + Qbest = Q + cum_rewards=[] + ``` + +Vad du kan märka från dessa resultat: + +- **Nära vårt mål**. Vi är mycket nära att uppnå målet att få 195 kumulativa belöningar över 100+ på varandra följande körningar av simuleringen, eller så har vi faktiskt uppnått det! Även om vi får mindre siffror vet vi fortfarande inte, eftersom vi tar genomsnittet över 5000 körningar, och endast 100 körningar krävs enligt de formella kriterierna. + +- **Belöningen börjar sjunka**. Ibland börjar belöningen sjunka, vilket betyder att vi kan "förstöra" redan inlärda värden i Q-Tabellen med de som gör situationen sämre. + +Denna observation blir tydligare om vi plottar träningsframstegen. + +## Plotta träningsframsteg + +Under träningen har vi samlat det kumulativa belöningsvärdet vid varje iteration i vektorn `rewards`. Så här ser det ut när vi plottar det mot iterationsnumret: + +```python +plt.plot(rewards) +``` + +![råa framsteg](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png) + +Från denna graf är det inte möjligt att säga något, eftersom längden på träningssessionerna varierar kraftigt på grund av den stokastiska träningsprocessens natur. För att göra grafen mer meningsfull kan vi beräkna **rullande medelvärde** över en serie experiment, låt säga 100. Detta kan göras bekvämt med `np.convolve`: (kodblock 12) + +```python +def running_average(x,window): + return np.convolve(x,np.ones(window)/window,mode='valid') + +plt.plot(running_average(rewards,100)) +``` + +![träningsframsteg](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png) + +## Variera hyperparametrar + +För att göra inlärningen mer stabil kan det vara vettigt att justera några av våra hyperparametrar under träningen. I synnerhet: + +- **För inlärningshastigheten**, `alpha`, kan vi börja med värden nära 1 och sedan fortsätta att minska parametern. Med tiden kommer vi att få bra sannolikhetsvärden i Q-Tabellen, och därför bör vi justera dem försiktigt och inte helt skriva över med nya värden. + +- **Öka epsilon**. Vi kanske vill öka `epsilon` långsamt för att utforska mindre och utnyttja mer. Det kan vara vettigt att börja med ett lägre värde för `epsilon` och sedan öka det till nästan 1. +> **Uppgift 1**: Testa att ändra hyperparametervärden och se om du kan uppnå högre kumulativ belöning. Kommer du över 195? +> **Uppgift 2**: För att formellt lösa problemet behöver du uppnå ett genomsnittligt belöningsvärde på 195 över 100 på varandra följande körningar. Mät detta under träningen och säkerställ att du formellt har löst problemet! + +## Se resultatet i praktiken + +Det skulle vara intressant att faktiskt se hur den tränade modellen beter sig. Låt oss köra simuleringen och följa samma strategi för val av handlingar som under träningen, där vi samplar enligt sannolikhetsfördelningen i Q-Tabellen: (kodblock 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() +``` + +Du bör se något liknande detta: + +![en balanserande cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) + +--- + +## 🚀Utmaning + +> **Uppgift 3**: Här använde vi den slutgiltiga versionen av Q-Tabellen, som kanske inte är den bästa. Kom ihåg att vi har sparat den bäst presterande Q-Tabellen i variabeln `Qbest`! Testa samma exempel med den bäst presterande Q-Tabellen genom att kopiera `Qbest` till `Q` och se om du märker någon skillnad. + +> **Uppgift 4**: Här valde vi inte den bästa handlingen vid varje steg, utan samplade istället enligt motsvarande sannolikhetsfördelning. Skulle det vara mer logiskt att alltid välja den bästa handlingen, med det högsta värdet i Q-Tabellen? Detta kan göras genom att använda funktionen `np.argmax` för att hitta handlingsnumret som motsvarar det högsta värdet i Q-Tabellen. Implementera denna strategi och se om det förbättrar balansen. + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Uppgift +[Träna en Mountain Car](assignment.md) + +## Slutsats + +Vi har nu lärt oss hur man tränar agenter för att uppnå bra resultat genom att bara tillhandahålla en belöningsfunktion som definierar önskat tillstånd i spelet, och genom att ge dem möjlighet att intelligent utforska sökutrymmet. Vi har framgångsrikt tillämpat Q-Learning-algoritmen i fall med diskreta och kontinuerliga miljöer, men med diskreta handlingar. + +Det är också viktigt att studera situationer där handlingsutrymmet också är kontinuerligt, och när observationsutrymmet är mycket mer komplext, som en bild från skärmen i ett Atari-spel. I dessa problem behöver vi ofta använda mer kraftfulla maskininlärningstekniker, såsom neurala nätverk, för att uppnå bra resultat. Dessa mer avancerade ämnen är föremål för vår kommande mer avancerade AI-kurs. + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell human översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/8-Reinforcement/2-Gym/assignment.md b/translations/sv/8-Reinforcement/2-Gym/assignment.md new file mode 100644 index 000000000..3fb797ae4 --- /dev/null +++ b/translations/sv/8-Reinforcement/2-Gym/assignment.md @@ -0,0 +1,55 @@ + +# Träna Mountain Car + +[OpenAI Gym](http://gym.openai.com) är utformat på ett sätt som gör att alla miljöer tillhandahåller samma API - dvs. samma metoder `reset`, `step` och `render`, samt samma abstraktioner för **aktionsutrymme** och **observationsutrymme**. Därför bör det vara möjligt att anpassa samma förstärkningsinlärningsalgoritmer till olika miljöer med minimala kodändringar. + +## En Mountain Car-miljö + +[Mountain Car-miljön](https://gym.openai.com/envs/MountainCar-v0/) innehåller en bil som sitter fast i en dal: + +Målet är att ta sig ur dalen och fånga flaggan genom att vid varje steg utföra en av följande handlingar: + +| Värde | Betydelse | +|---|---| +| 0 | Accelerera åt vänster | +| 1 | Ingen acceleration | +| 2 | Accelerera åt höger | + +Huvudknepet med detta problem är dock att bilens motor inte är tillräckligt stark för att klättra uppför berget i ett enda försök. Därför är det enda sättet att lyckas att köra fram och tillbaka för att bygga upp fart. + +Observationsutrymmet består av endast två värden: + +| Nr | Observation | Min | Max | +|-----|--------------|-----|-----| +| 0 | Bilens position | -1.2| 0.6 | +| 1 | Bilens hastighet | -0.07 | 0.07 | + +Belöningssystemet för Mountain Car är ganska knepigt: + + * En belöning på 0 ges om agenten når flaggan (position = 0.5) på toppen av berget. + * En belöning på -1 ges om agentens position är mindre än 0.5. + +Episoden avslutas om bilens position är mer än 0.5, eller om episodens längd överstiger 200. +## Instruktioner + +Anpassa vår förstärkningsinlärningsalgoritm för att lösa Mountain Car-problemet. Börja med befintlig kod i [notebook.ipynb](../../../../8-Reinforcement/2-Gym/notebook.ipynb), ersätt med den nya miljön, ändra funktionerna för diskretisering av tillstånd, och försök få den befintliga algoritmen att träna med minimala kodändringar. Optimera resultatet genom att justera hyperparametrar. + +> **Obs**: Justering av hyperparametrar kommer sannolikt att behövas för att få algoritmen att konvergera. +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| -------- | --------- | -------- | ----------------- | +| | Q-Learning-algoritmen har framgångsrikt anpassats från CartPole-exemplet med minimala kodändringar och kan lösa problemet med att fånga flaggan på under 200 steg. | En ny Q-Learning-algoritm har hämtats från internet, men är väl dokumenterad; eller befintlig algoritm har anpassats men når inte önskade resultat. | Studenten har inte lyckats anpassa någon algoritm framgångsrikt, men har gjort betydande framsteg mot en lösning (implementerat tillståndsdiskretisering, Q-Tabell-datastruktur, etc.) | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/8-Reinforcement/2-Gym/solution/Julia/README.md b/translations/sv/8-Reinforcement/2-Gym/solution/Julia/README.md new file mode 100644 index 000000000..fe4060195 --- /dev/null +++ b/translations/sv/8-Reinforcement/2-Gym/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/8-Reinforcement/2-Gym/solution/R/README.md b/translations/sv/8-Reinforcement/2-Gym/solution/R/README.md new file mode 100644 index 000000000..ef86c9e88 --- /dev/null +++ b/translations/sv/8-Reinforcement/2-Gym/solution/R/README.md @@ -0,0 +1,15 @@ + +detta är en tillfällig platshållare + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiska översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/8-Reinforcement/README.md b/translations/sv/8-Reinforcement/README.md new file mode 100644 index 000000000..f56845570 --- /dev/null +++ b/translations/sv/8-Reinforcement/README.md @@ -0,0 +1,67 @@ + +# Introduktion till förstärkningsinlärning + +Förstärkningsinlärning, RL, ses som ett av de grundläggande paradigmen inom maskininlärning, vid sidan av övervakad inlärning och oövervakad inlärning. RL handlar om beslut: att fatta rätt beslut eller åtminstone lära sig av dem. + +Föreställ dig att du har en simulerad miljö, som aktiemarknaden. Vad händer om du inför en viss reglering? Har det en positiv eller negativ effekt? Om något negativt inträffar måste du ta detta _negativa förstärkning_, lära dig av det och ändra kurs. Om det är ett positivt resultat måste du bygga vidare på den _positiva förstärkningen_. + +![peter och vargen](../../../8-Reinforcement/images/peter.png) + +> Peter och hans vänner måste fly från den hungriga vargen! Bild av [Jen Looper](https://twitter.com/jenlooper) + +## Regionalt ämne: Peter och Vargen (Ryssland) + +[Peter och Vargen](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) är en musikalisk saga skriven av den ryske kompositören [Sergej Prokofjev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Det är en berättelse om den unge pionjären Peter, som modigt lämnar sitt hus och går ut på skogsgläntan för att jaga vargen. I detta avsnitt kommer vi att träna maskininlärningsalgoritmer som hjälper Peter att: + +- **Utforska** området runt omkring och bygga en optimal navigeringskarta. +- **Lära sig** att använda en skateboard och balansera på den för att kunna röra sig snabbare. + +[![Peter och Vargen](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM) + +> 🎥 Klicka på bilden ovan för att lyssna på Peter och Vargen av Prokofjev + +## Förstärkningsinlärning + +I tidigare avsnitt har du sett två exempel på maskininlärningsproblem: + +- **Övervakad**, där vi har dataset som föreslår exempel på lösningar till problemet vi vill lösa. [Klassificering](../4-Classification/README.md) och [regression](../2-Regression/README.md) är uppgifter inom övervakad inlärning. +- **Oövervakad**, där vi inte har märkta träningsdata. Det främsta exemplet på oövervakad inlärning är [klustring](../5-Clustering/README.md). + +I detta avsnitt kommer vi att introducera dig till en ny typ av inlärningsproblem som inte kräver märkta träningsdata. Det finns flera typer av sådana problem: + +- **[Semiövervakad inlärning](https://wikipedia.org/wiki/Semi-supervised_learning)**, där vi har mycket omärkta data som kan användas för att förträna modellen. +- **[Förstärkningsinlärning](https://wikipedia.org/wiki/Reinforcement_learning)**, där en agent lär sig hur den ska bete sig genom att utföra experiment i en simulerad miljö. + +### Exempel - datorspel + +Anta att du vill lära en dator att spela ett spel, som schack eller [Super Mario](https://wikipedia.org/wiki/Super_Mario). För att datorn ska kunna spela ett spel behöver vi att den förutspår vilket drag den ska göra i varje spelstadium. Även om detta kan verka som ett klassificeringsproblem är det inte det – eftersom vi inte har ett dataset med tillstånd och motsvarande åtgärder. Även om vi kanske har viss data, som befintliga schackmatcher eller inspelningar av spelare som spelar Super Mario, är det troligt att dessa data inte täcker ett tillräckligt stort antal möjliga tillstånd. + +Istället för att leta efter befintlig speldata bygger **Förstärkningsinlärning** (RL) på idén att *låta datorn spela* många gånger och observera resultatet. För att tillämpa förstärkningsinlärning behöver vi två saker: + +- **En miljö** och **en simulator** som låter oss spela spelet många gånger. Denna simulator skulle definiera alla spelregler samt möjliga tillstånd och åtgärder. + +- **En belöningsfunktion**, som berättar hur bra vi presterade under varje drag eller spel. + +Den största skillnaden mellan andra typer av maskininlärning och RL är att vi i RL vanligtvis inte vet om vi vinner eller förlorar förrän vi avslutar spelet. Därför kan vi inte säga om ett visst drag i sig är bra eller inte – vi får bara en belöning i slutet av spelet. Vårt mål är att designa algoritmer som gör det möjligt för oss att träna en modell under osäkra förhållanden. Vi kommer att lära oss om en RL-algoritm som kallas **Q-learning**. + +## Lektioner + +1. [Introduktion till förstärkningsinlärning och Q-Learning](1-QLearning/README.md) +2. [Använda en gym-simuleringsmiljö](2-Gym/README.md) + +## Krediter + +"Introduktion till Förstärkningsinlärning" skrevs med ♥️ av [Dmitry Soshnikov](http://soshnikov.com) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiska översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/9-Real-World/1-Applications/README.md b/translations/sv/9-Real-World/1-Applications/README.md new file mode 100644 index 000000000..53cd8c2a9 --- /dev/null +++ b/translations/sv/9-Real-World/1-Applications/README.md @@ -0,0 +1,159 @@ + +# Postscript: Maskininlärning i verkligheten + +![Sammanfattning av maskininlärning i verkligheten i en sketchnote](../../../../sketchnotes/ml-realworld.png) +> Sketchnote av [Tomomi Imura](https://www.twitter.com/girlie_mac) + +I den här kursen har du lärt dig många sätt att förbereda data för träning och skapa maskininlärningsmodeller. Du har byggt en serie klassiska modeller för regression, klustring, klassificering, naturlig språkbehandling och tidsserier. Grattis! Nu kanske du undrar vad allt detta ska användas till... vilka är de verkliga tillämpningarna för dessa modeller? + +Även om AI, som ofta använder sig av djupinlärning, har fått mycket uppmärksamhet inom industrin, finns det fortfarande värdefulla tillämpningar för klassiska maskininlärningsmodeller. Du kanske till och med använder några av dessa tillämpningar idag! I den här lektionen kommer du att utforska hur åtta olika industrier och ämnesområden använder dessa typer av modeller för att göra sina applikationer mer effektiva, pålitliga, intelligenta och värdefulla för användarna. + +## [Quiz före föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## 💰 Finans + +Finanssektorn erbjuder många möjligheter för maskininlärning. Många problem inom detta område lämpar sig väl för att modelleras och lösas med hjälp av ML. + +### Upptäckt av kreditkortsbedrägerier + +Vi lärde oss om [k-means klustring](../../5-Clustering/2-K-Means/README.md) tidigare i kursen, men hur kan det användas för att lösa problem relaterade till kreditkortsbedrägerier? + +K-means klustring är användbart vid en teknik för att upptäcka kreditkortsbedrägerier som kallas **outlier detection**. Avvikelser, eller avvikande observationer i en datamängd, kan indikera om ett kreditkort används normalt eller om något ovanligt pågår. Som visas i den länkade artikeln nedan kan du sortera kreditkortsdata med en k-means klustringsalgoritm och tilldela varje transaktion till en kluster baserat på hur mycket avvikande den verkar vara. Därefter kan du utvärdera de mest riskfyllda klustren för att avgöra om transaktionerna är bedrägliga eller legitima. +[Referens](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf) + +### Förmögenhetsförvaltning + +Inom förmögenhetsförvaltning hanterar en individ eller firma investeringar för sina klienter. Deras uppgift är att långsiktigt bevara och öka förmögenheten, vilket gör det avgörande att välja investeringar som presterar väl. + +Ett sätt att utvärdera hur en specifik investering presterar är genom statistisk regression. [Linjär regression](../../2-Regression/1-Tools/README.md) är ett värdefullt verktyg för att förstå hur en fond presterar i förhållande till en benchmark. Vi kan också avgöra om resultaten av regressionen är statistiskt signifikanta, eller hur mycket de skulle påverka en klients investeringar. Du kan till och med utöka din analys med multipel regression, där ytterligare riskfaktorer tas med i beräkningen. För ett exempel på hur detta skulle fungera för en specifik fond, kolla in artikeln nedan om att utvärdera fondprestanda med regression. +[Referens](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/) + +## 🎓 Utbildning + +Utbildningssektorn är också ett mycket intressant område där ML kan tillämpas. Det finns spännande problem att lösa, såsom att upptäcka fusk på prov eller uppsatser, eller hantera bias, medveten eller omedveten, i rättningsprocessen. + +### Förutsäga studentbeteende + +[Coursera](https://coursera.com), en leverantör av öppna onlinekurser, har en fantastisk teknisk blogg där de diskuterar många ingenjörsbeslut. I denna fallstudie plottade de en regressionslinje för att undersöka om det finns någon korrelation mellan ett lågt NPS (Net Promoter Score) och kursretention eller avhopp. +[Referens](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a) + +### Minska bias + +[Grammarly](https://grammarly.com), en skrivassistent som kontrollerar stavning och grammatikfel, använder sofistikerade [system för naturlig språkbehandling](../../6-NLP/README.md) i sina produkter. De publicerade en intressant fallstudie i sin tekniska blogg om hur de hanterade könsbias i maskininlärning, vilket du lärde dig om i vår [introduktionslektion om rättvisa](../../1-Introduction/3-fairness/README.md). +[Referens](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/) + +## 👜 Detaljhandel + +Detaljhandelssektorn kan definitivt dra nytta av användningen av ML, med allt från att skapa en bättre kundresa till att optimera lagerhantering. + +### Personalisera kundresan + +På Wayfair, ett företag som säljer heminredning som möbler, är det avgörande att hjälpa kunder att hitta rätt produkter för deras smak och behov. I denna artikel beskriver ingenjörer från företaget hur de använder ML och NLP för att "visa rätt resultat för kunder". Deras Query Intent Engine har byggts för att använda entitetsutvinning, klassificeringsträning, utvinning av tillgångar och åsikter, samt sentimenttaggning på kundrecensioner. Detta är ett klassiskt användningsfall för hur NLP fungerar inom online-detaljhandel. +[Referens](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search) + +### Lagerhantering + +Innovativa, flexibla företag som [StitchFix](https://stitchfix.com), en boxservice som skickar kläder till konsumenter, förlitar sig starkt på ML för rekommendationer och lagerhantering. Deras stylingteam samarbetar med deras merchandisingteam: "en av våra dataforskare experimenterade med en genetisk algoritm och tillämpade den på kläder för att förutsäga vad som skulle vara en framgångsrik klädesplagg som inte existerar idag. Vi presenterade detta för merchandisingteamet, och nu kan de använda det som ett verktyg." +[Referens](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/) + +## 🏥 Hälso- och sjukvård + +Hälso- och sjukvårdssektorn kan använda ML för att optimera forskningsuppgifter och logistiska problem som att återinlägga patienter eller stoppa spridningen av sjukdomar. + +### Hantering av kliniska prövningar + +Toxicitet i kliniska prövningar är en stor oro för läkemedelsföretag. Hur mycket toxicitet är tolerabelt? I denna studie ledde analysen av olika metoder för kliniska prövningar till utvecklingen av en ny metod för att förutsäga oddsen för kliniska prövningsresultat. Specifikt kunde de använda random forest för att skapa en [klassificerare](../../4-Classification/README.md) som kan skilja mellan grupper av läkemedel. +[Referens](https://www.sciencedirect.com/science/article/pii/S2451945616302914) + +### Hantering av återinläggningar på sjukhus + +Sjukhusvård är kostsam, särskilt när patienter måste återinläggas. Denna artikel diskuterar ett företag som använder ML för att förutsäga potentialen för återinläggning med hjälp av [klustringsalgoritmer](../../5-Clustering/README.md). Dessa kluster hjälper analytiker att "upptäcka grupper av återinläggningar som kan ha en gemensam orsak". +[Referens](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning) + +### Hantering av sjukdomar + +Den senaste pandemin har belyst hur maskininlärning kan hjälpa till att stoppa spridningen av sjukdomar. I denna artikel kommer du att känna igen användningen av ARIMA, logistiska kurvor, linjär regression och SARIMA. "Detta arbete är ett försök att beräkna spridningshastigheten för detta virus och därmed förutsäga dödsfall, återhämtningar och bekräftade fall, så att vi kan förbereda oss bättre och överleva." +[Referens](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/) + +## 🌲 Ekologi och grön teknik + +Natur och ekologi består av många känsliga system där samspelet mellan djur och natur står i fokus. Det är viktigt att kunna mäta dessa system noggrant och agera lämpligt om något händer, som en skogsbrand eller en minskning av djurpopulationen. + +### Skogsförvaltning + +Du lärde dig om [Reinforcement Learning](../../8-Reinforcement/README.md) i tidigare lektioner. Det kan vara mycket användbart när man försöker förutsäga mönster i naturen. Särskilt kan det användas för att spåra ekologiska problem som skogsbränder och spridningen av invasiva arter. I Kanada använde en grupp forskare Reinforcement Learning för att bygga modeller för skogsbrandsdynamik från satellitbilder. Med hjälp av en innovativ "spatially spreading process (SSP)" föreställde de sig en skogsbrand som "agenten vid vilken cell som helst i landskapet." "Uppsättningen av åtgärder som branden kan vidta från en plats vid vilken tidpunkt som helst inkluderar att sprida sig norrut, söderut, österut eller västerut eller att inte sprida sig." + +Denna metod inverterar den vanliga RL-uppsättningen eftersom dynamiken i den motsvarande Markov Decision Process (MDP) är en känd funktion för omedelbar spridning av skogsbranden." Läs mer om de klassiska algoritmer som användes av denna grupp på länken nedan. +[Referens](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full) + +### Rörelsesensorer för djur + +Även om djupinlärning har skapat en revolution i att visuellt spåra djurrörelser (du kan bygga din egen [isbjörnspårare](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) här), har klassisk ML fortfarande en plats i denna uppgift. + +Sensorer för att spåra rörelser hos gårdsdjur och IoT använder denna typ av visuell bearbetning, men mer grundläggande ML-tekniker är användbara för att förbehandla data. Till exempel övervakades och analyserades fårs kroppshållningar med olika klassificeringsalgoritmer i denna artikel. Du kanske känner igen ROC-kurvan på sida 335. +[Referens](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf) + +### ⚡️ Energihantering + +I våra lektioner om [tidsserieprognoser](../../7-TimeSeries/README.md) tog vi upp konceptet med smarta parkeringsmätare för att generera intäkter för en stad baserat på att förstå utbud och efterfrågan. Denna artikel diskuterar i detalj hur klustring, regression och tidsserieprognoser kombinerades för att hjälpa till att förutsäga framtida energianvändning i Irland, baserat på smarta mätare. +[Referens](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf) + +## 💼 Försäkring + +Försäkringssektorn är ytterligare en sektor som använder ML för att konstruera och optimera hållbara finansiella och aktuariska modeller. + +### Hantering av volatilitet + +MetLife, en leverantör av livförsäkringar, är öppen med hur de analyserar och minskar volatilitet i sina finansiella modeller. I denna artikel kommer du att märka visualiseringar av binär och ordinal klassificering. Du kommer också att upptäcka visualiseringar för prognoser. +[Referens](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf) + +## 🎨 Konst, kultur och litteratur + +Inom konsten, till exempel journalistik, finns det många intressanta problem. Att upptäcka falska nyheter är ett stort problem eftersom det har visat sig påverka människors åsikter och till och med kunna störta demokratier. Museer kan också dra nytta av att använda ML i allt från att hitta länkar mellan artefakter till resursplanering. + +### Upptäckt av falska nyheter + +Att upptäcka falska nyheter har blivit en katt-och-råtta-lek i dagens media. I denna artikel föreslår forskare att ett system som kombinerar flera av de ML-tekniker vi har studerat kan testas och den bästa modellen implementeras: "Detta system är baserat på naturlig språkbehandling för att extrahera funktioner från data och sedan används dessa funktioner för att träna maskininlärningsklassificerare såsom Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD) och Logistic Regression (LR)." +[Referens](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf) + +Denna artikel visar hur kombinationen av olika ML-områden kan producera intressanta resultat som kan hjälpa till att stoppa spridningen av falska nyheter och skapa verklig skada; i detta fall var drivkraften spridningen av rykten om COVID-behandlingar som ledde till våldsamma upplopp. + +### Museum ML + +Museer står på tröskeln till en AI-revolution där katalogisering och digitalisering av samlingar samt att hitta länkar mellan artefakter blir enklare i takt med att tekniken utvecklas. Projekt som [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) hjälper till att låsa upp mysterierna i otillgängliga samlingar som Vatikanens arkiv. Men den affärsmässiga aspekten av museer drar också nytta av ML-modeller. + +Till exempel byggde Art Institute of Chicago modeller för att förutsäga vad publiken är intresserad av och när de kommer att besöka utställningar. Målet är att skapa individuella och optimerade besöksupplevelser varje gång användaren besöker museet. "Under räkenskapsåret 2017 förutsade modellen besöksantal och intäkter med en noggrannhet på 1 procent, säger Andrew Simnick, senior vice president på Art Institute." +[Referens](https://www.chicagobusiness.com/article/20180518/ISSUE01/180519840/art-institute-of-chicago-uses-data-to-make-exhibit-choices) + +## 🏷 Marknadsföring + +### Kundsegmentering + +De mest effektiva marknadsföringsstrategierna riktar sig till kunder på olika sätt baserat på olika grupperingar. I denna artikel diskuteras användningen av klustringsalgoritmer för att stödja differentierad marknadsföring. Differentierad marknadsföring hjälper företag att förbättra varumärkesigenkänning, nå fler kunder och tjäna mer pengar. +[Referens](https://ai.inqline.com/machine-learning-for-marketing-customer-segmentation/) + +## 🚀 Utmaning + +Identifiera en annan sektor som drar nytta av några av de tekniker du lärt dig i denna kurs och upptäck hur den använder ML. +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) + +## Granskning & Självstudier + +Wayfairs data science-team har flera intressanta videor om hur de använder ML på sitt företag. Det är värt att [kolla in dem](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)! + +## Uppgift + +[En ML-skattjakt](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/9-Real-World/1-Applications/assignment.md b/translations/sv/9-Real-World/1-Applications/assignment.md new file mode 100644 index 000000000..3ca0e40bc --- /dev/null +++ b/translations/sv/9-Real-World/1-Applications/assignment.md @@ -0,0 +1,27 @@ + +# En ML-skattjakt + +## Instruktioner + +I den här lektionen lärde du dig om många verkliga användningsområden som har lösts med klassisk ML. Även om användningen av djupinlärning, nya tekniker och verktyg inom AI, samt utnyttjandet av neurala nätverk har hjälpt till att påskynda utvecklingen av verktyg inom dessa sektorer, har klassisk ML med hjälp av teknikerna i denna kurs fortfarande stort värde. + +I denna uppgift ska du föreställa dig att du deltar i en hackathon. Använd det du har lärt dig i kursen för att föreslå en lösning med klassisk ML för att lösa ett problem inom en av de sektorer som diskuterades i denna lektion. Skapa en presentation där du diskuterar hur du kommer att implementera din idé. Bonuspoäng om du kan samla in exempeldata och bygga en ML-modell för att stödja ditt koncept! + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ------------------------------------------------------------------- | ------------------------------------------------ | ---------------------- | +| | En PowerPoint-presentation presenteras - bonus för att bygga en modell | En icke-innovativ, grundläggande presentation presenteras | Arbetet är ofullständigt | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/9-Real-World/2-Debugging-ML-Models/README.md b/translations/sv/9-Real-World/2-Debugging-ML-Models/README.md new file mode 100644 index 000000000..4048c7e47 --- /dev/null +++ b/translations/sv/9-Real-World/2-Debugging-ML-Models/README.md @@ -0,0 +1,184 @@ + +# Postscript: Modellfelsökning i maskininlärning med komponenter från Responsible AI-dashboarden + +## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/) + +## Introduktion + +Maskininlärning påverkar våra dagliga liv. AI hittar sin väg in i några av de mest betydelsefulla systemen som påverkar oss som individer och vårt samhälle, från sjukvård, finans, utbildning och anställning. Till exempel används system och modeller i dagliga beslutsprocesser, såsom diagnoser inom sjukvården eller att upptäcka bedrägerier. Följaktligen möts framstegen inom AI och dess snabba adoption av förändrade samhällsförväntningar och ökande regleringar. Vi ser ständigt områden där AI-system inte lever upp till förväntningarna; de avslöjar nya utmaningar, och regeringar börjar reglera AI-lösningar. Därför är det viktigt att dessa modeller analyseras för att säkerställa rättvisa, pålitliga, inkluderande, transparenta och ansvarsfulla resultat för alla. + +I denna kurs kommer vi att titta på praktiska verktyg som kan användas för att bedöma om en modell har problem med ansvarsfull AI. Traditionella felsökningstekniker inom maskininlärning tenderar att baseras på kvantitativa beräkningar, såsom aggregerad noggrannhet eller genomsnittlig felkostnad. Föreställ dig vad som kan hända när datan du använder för att bygga dessa modeller saknar vissa demografiska grupper, såsom ras, kön, politiska åsikter, religion, eller oproportionerligt representerar sådana grupper. Vad händer när modellens resultat tolkas som att gynna vissa demografiska grupper? Detta kan leda till över- eller underrepresentation av dessa känsliga egenskapsgrupper, vilket resulterar i rättvise-, inkluderings- eller tillförlitlighetsproblem från modellen. En annan faktor är att maskininlärningsmodeller ofta betraktas som "svarta lådor", vilket gör det svårt att förstå och förklara vad som driver modellens förutsägelser. Alla dessa är utmaningar som dataforskare och AI-utvecklare står inför när de saknar tillräckliga verktyg för att felsöka och bedöma rättvisan eller tillförlitligheten hos en modell. + +I denna lektion kommer du att lära dig att felsöka dina modeller med hjälp av: + +- **Felsanalys**: identifiera var i din datadistribution modellen har höga felfrekvenser. +- **Modellöversikt**: utför jämförande analyser mellan olika datakohorter för att upptäcka skillnader i modellens prestationsmått. +- **Dataanalys**: undersök var det kan finnas över- eller underrepresentation i din data som kan snedvrida modellen till att gynna en demografisk grupp framför en annan. +- **Egenskapsbetydelse**: förstå vilka egenskaper som driver modellens förutsägelser på en global eller lokal nivå. + +## Förkunskaper + +Som förkunskap, vänligen granska [Responsible AI tools for developers](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) + +> ![Gif om Responsible AI Tools](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) + +## Felsanalys + +Traditionella prestationsmått för modeller som används för att mäta noggrannhet är oftast beräkningar baserade på korrekta kontra felaktiga förutsägelser. Till exempel kan det anses vara en bra prestation att fastställa att en modell är korrekt 89 % av tiden med en felkostnad på 0,001. Fel är dock ofta inte jämnt fördelade i din underliggande dataset. Du kan få en modellnoggrannhet på 89 %, men upptäcka att det finns olika områden i din data där modellen misslyckas 42 % av tiden. Konsekvensen av dessa felmönster med vissa datagrupper kan leda till rättvise- eller tillförlitlighetsproblem. Det är avgörande att förstå områden där modellen presterar bra eller inte. De dataområden där det finns ett högt antal felaktigheter i din modell kan visa sig vara en viktig demografisk grupp. + +![Analysera och felsök modellfel](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-distribution.png) + +Felsanalyskomponenten på RAI-dashboarden illustrerar hur modellfel är fördelade över olika kohorter med en trädvisualisering. Detta är användbart för att identifiera egenskaper eller områden där det finns en hög felfrekvens i din dataset. Genom att se var de flesta av modellens felaktigheter kommer ifrån kan du börja undersöka grundorsaken. Du kan också skapa datakohorter för att utföra analyser. Dessa datakohorter hjälper i felsökningsprocessen för att avgöra varför modellens prestation är bra i en kohort men felaktig i en annan. + +![Felsanalys](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png) + +De visuella indikatorerna på trädkartan hjälper till att snabbare lokalisera problemområden. Till exempel, ju mörkare röd färg en trädnod har, desto högre är felfrekvensen. + +Värmekarta är en annan visualiseringsfunktion som användare kan använda för att undersöka felfrekvensen med hjälp av en eller två egenskaper för att hitta bidragande faktorer till modellfel över hela datasetet eller kohorter. + +![Felsanalys Värmekarta](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png) + +Använd felsanalys när du behöver: + +* Få en djup förståelse för hur modellfel är fördelade över en dataset och över flera indata- och egenskapsdimensioner. +* Bryta ner de aggregerade prestationsmåtten för att automatiskt upptäcka felaktiga kohorter och informera om dina riktade åtgärdssteg. + +## Modellöversikt + +Att utvärdera en maskininlärningsmodells prestation kräver en holistisk förståelse av dess beteende. Detta kan uppnås genom att granska mer än ett mått, såsom felfrekvens, noggrannhet, återkallelse, precision eller MAE (Mean Absolute Error) för att hitta skillnader bland prestationsmått. Ett prestationsmått kan se bra ut, men felaktigheter kan avslöjas i ett annat mått. Dessutom hjälper jämförelse av måtten för skillnader över hela datasetet eller kohorter till att belysa var modellen presterar bra eller inte. Detta är särskilt viktigt för att se modellens prestation bland känsliga kontra okänsliga egenskaper (t.ex. patientens ras, kön eller ålder) för att upptäcka potentiell orättvisa modellen kan ha. Till exempel kan upptäckten att modellen är mer felaktig i en kohort med känsliga egenskaper avslöja potentiell orättvisa modellen kan ha. + +Modellöversiktskomponenten på RAI-dashboarden hjälper inte bara till att analysera prestationsmåtten för datarepresentationen i en kohort, utan ger användare möjlighet att jämföra modellens beteende över olika kohorter. + +![Datasetkohorter - modellöversikt i RAI-dashboarden](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png) + +Komponentens egenskapsbaserade analysfunktion gör det möjligt för användare att begränsa datasubgrupper inom en viss egenskap för att identifiera avvikelser på en detaljerad nivå. Till exempel har dashboarden inbyggd intelligens för att automatiskt generera kohorter för en användarvald egenskap (t.ex. *"time_in_hospital < 3"* eller *"time_in_hospital >= 7"*). Detta gör det möjligt för en användare att isolera en viss egenskap från en större datagrupp för att se om den är en nyckelpåverkare av modellens felaktiga resultat. + +![Egenskapskohorter - modellöversikt i RAI-dashboarden](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png) + +Modellöversiktskomponenten stödjer två klasser av skillnadsmått: + +**Skillnad i modellprestation**: Dessa mått beräknar skillnaden i värdena för det valda prestationsmåttet över datagrupper. Här är några exempel: + +* Skillnad i noggrannhetsgrad +* Skillnad i felfrekvens +* Skillnad i precision +* Skillnad i återkallelse +* Skillnad i medelfel (MAE) + +**Skillnad i urvalsfrekvens**: Detta mått innehåller skillnaden i urvalsfrekvens (gynnsam förutsägelse) bland datagrupper. Ett exempel på detta är skillnaden i lånegodkännandefrekvens. Urvalsfrekvens betyder andelen datapunkter i varje klass som klassificeras som 1 (i binär klassificering) eller fördelningen av förutsägelsevärden (i regression). + +## Dataanalys + +> "Om du torterar datan tillräckligt länge kommer den att erkänna vad som helst" - Ronald Coase + +Detta uttalande låter extremt, men det är sant att data kan manipuleras för att stödja vilken slutsats som helst. Sådan manipulation kan ibland ske oavsiktligt. Som människor har vi alla fördomar, och det är ofta svårt att medvetet veta när man introducerar fördomar i data. Att garantera rättvisa inom AI och maskininlärning förblir en komplex utmaning. + +Data är en stor blind fläck för traditionella prestationsmått för modeller. Du kan ha höga noggrannhetspoäng, men detta återspeglar inte alltid den underliggande databias som kan finnas i din dataset. Till exempel, om en dataset med anställda har 27 % kvinnor i ledande positioner i ett företag och 73 % män på samma nivå, kan en AI-modell för jobbannonsering som tränats på denna data främst rikta sig mot en manlig publik för seniora jobbtjänster. Denna obalans i data snedvrider modellens förutsägelse till att gynna ett kön. Detta avslöjar ett rättviseproblem där det finns en könsbias i AI-modellen. + +Dataanalyskomponenten på RAI-dashboarden hjälper till att identifiera områden där det finns över- och underrepresentation i datasetet. Den hjälper användare att diagnostisera grundorsaken till fel och rättviseproblem som introducerats från dataobalanser eller brist på representation av en viss datagrupp. Detta ger användare möjlighet att visualisera dataset baserat på förutsagda och faktiska resultat, felgrupper och specifika egenskaper. Ibland kan upptäckten av en underrepresenterad datagrupp också avslöja att modellen inte lär sig väl, vilket leder till höga felaktigheter. Att ha en modell med databias är inte bara ett rättviseproblem utan visar att modellen inte är inkluderande eller pålitlig. + +![Dataanalyskomponent på RAI-dashboarden](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png) + +Använd dataanalys när du behöver: + +* Utforska din datasets statistik genom att välja olika filter för att dela upp din data i olika dimensioner (även kallade kohorter). +* Förstå fördelningen av din dataset över olika kohorter och egenskapsgrupper. +* Avgöra om dina upptäckter relaterade till rättvisa, felsanalys och kausalitet (härledda från andra dashboardkomponenter) är ett resultat av din datasets fördelning. +* Besluta i vilka områden du ska samla in mer data för att minska fel som kommer från representationsproblem, etikettbrus, egenskapsbrus, etikettbias och liknande faktorer. + +## Modelltolkning + +Maskininlärningsmodeller tenderar att vara "svarta lådor". Att förstå vilka nyckeldataegenskaper som driver en modells förutsägelse kan vara utmanande. Det är viktigt att ge transparens kring varför en modell gör en viss förutsägelse. Till exempel, om ett AI-system förutspår att en diabetiker riskerar att bli återinlagd på sjukhus inom mindre än 30 dagar, bör det kunna ge stödjande data som ledde till dess förutsägelse. Att ha stödjande dataindikatorer ger transparens för att hjälpa kliniker eller sjukhus att kunna fatta välgrundade beslut. Dessutom gör det möjligt att förklara varför en modell gjorde en förutsägelse för en enskild patient att ansvarstagande med hälsoregleringar. När du använder maskininlärningsmodeller på sätt som påverkar människors liv är det avgörande att förstå och förklara vad som påverkar en modells beteende. Modellförklarbarhet och tolkning hjälper till att besvara frågor i scenarier såsom: + +* Modellfelsökning: Varför gjorde min modell detta misstag? Hur kan jag förbättra min modell? +* Människa-AI-samarbete: Hur kan jag förstå och lita på modellens beslut? +* Regelöverensstämmelse: Uppfyller min modell juridiska krav? + +Egenskapsbetydelsekomponenten på RAI-dashboarden hjälper dig att felsöka och få en omfattande förståelse för hur en modell gör förutsägelser. Det är också ett användbart verktyg för maskininlärningsproffs och beslutsfattare att förklara och visa bevis på egenskaper som påverkar modellens beteende för regelöverensstämmelse. Nästa steg är att användare kan utforska både globala och lokala förklaringar för att validera vilka egenskaper som driver en modells förutsägelse. Globala förklaringar listar de viktigaste egenskaperna som påverkat modellens övergripande förutsägelse. Lokala förklaringar visar vilka egenskaper som ledde till en modells förutsägelse för ett enskilt fall. Möjligheten att utvärdera lokala förklaringar är också användbar vid felsökning eller granskning av ett specifikt fall för att bättre förstå och tolka varför en modell gjorde en korrekt eller felaktig förutsägelse. + +![Egenskapsbetydelsekomponent på RAI-dashboarden](../../../../9-Real-World/2-Debugging-ML-Models/images/9-feature-importance.png) + +* Globala förklaringar: Till exempel, vilka egenskaper påverkar det övergripande beteendet hos en diabetesmodell för sjukhusåterinläggning? +* Lokala förklaringar: Till exempel, varför förutspåddes en diabetiker över 60 år med tidigare sjukhusvistelser att bli återinlagd eller inte återinlagd inom 30 dagar på ett sjukhus? + +I felsökningsprocessen för att undersöka en modells prestation över olika kohorter visar Egenskapsbetydelse vilken nivå av påverkan en egenskap har över kohorterna. Den hjälper till att avslöja avvikelser när man jämför nivån av påverkan egenskapen har på att driva modellens felaktiga förutsägelser. Egenskapsbetydelsekomponenten kan visa vilka värden i en egenskap som positivt eller negativt påverkat modellens resultat. Till exempel, om en modell gjorde en felaktig förutsägelse, ger komponenten dig möjlighet att borra ner och identifiera vilka egenskaper eller egenskapsvärden som drev förutsägelsen. Denna detaljnivå hjälper inte bara vid felsökning utan ger transparens och ansvarstagande vid granskningssituationer. Slutligen kan komponenten hjälpa dig att identifiera rättviseproblem. För att illustrera, om en känslig egenskap såsom etnicitet eller kön är mycket inflytelserik i att driva en modells förutsägelse, kan detta vara ett tecken på ras- eller könsbias i modellen. + +![Egenskapsbetydelse](../../../../9-Real-World/2-Debugging-ML-Models/images/9-features-influence.png) + +Använd tolkning när du behöver: + +* Avgöra hur pålitliga din AI-systems förutsägelser är genom att förstå vilka egenskaper som är viktigast för förutsägelserna. +* Närma dig felsökningen av din modell genom att först förstå den och identifiera om modellen använder sunda egenskaper eller bara falska korrelationer. +* Avslöja potentiella källor till orättvisa genom att förstå om modellen baserar förutsägelser på känsliga egenskaper eller på egenskaper som är starkt korrelerade med dem. +* Bygga användarförtroende för modellens beslut genom att generera lokala förklaringar för att illustrera deras resultat. +* Slutföra en regelgranskning av ett AI-system för att validera modeller och övervaka effekten av modellens beslut på människor. + +## Slutsats + +Alla komponenter i RAI-dashboarden är praktiska verktyg för att hjälpa dig bygga maskininlärningsmodeller som är mindre skadliga och mer pålitliga för samhället. De förbättrar förebyggandet av hot mot mänskliga rättigheter; diskriminering eller uteslutning av vissa grupper från livsmöjligheter; och risken för fysisk eller psykologisk skada. De hjälper också till att bygga förtroende för modellens beslut genom att generera lokala förklaringar för att illustrera deras resultat. Några av de potentiella skadorna kan klassificeras som: + +- **Tilldelning**, om ett kön eller en etnicitet till exempel gynnas framför en annan. +- **Kvalitet på tjänsten**. Om du tränar data för ett specifikt scenario men verkligheten är mycket mer komplex, leder det till en dåligt presterande tjänst. +- **Stereotypisering**. Att associera en viss grupp med förutbestämda attribut. +- **Nedvärdering**. Att orättvist kritisera och ge negativa etiketter till något eller någon. +- **Över- eller underrepresentation**. Tanken är att en viss grupp inte syns inom ett visst yrke, och att varje tjänst eller funktion som fortsätter att främja detta bidrar till skada. + +### Azure RAI-dashboard + +[Azure RAI-dashboard](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) är byggd på öppen källkod utvecklad av ledande akademiska institutioner och organisationer, inklusive Microsoft, och är avgörande för dataforskare och AI-utvecklare för att bättre förstå modellbeteende, upptäcka och åtgärda oönskade problem från AI-modeller. + +- Lär dig hur du använder de olika komponenterna genom att kolla in RAI-dashboardens [dokumentation.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) + +- Kolla in några exempel på RAI-dashboardens [notebooks](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) för att felsöka mer ansvarsfulla AI-scenarier i Azure Machine Learning. + +--- +## 🚀 Utmaning + +För att förhindra att statistiska eller datamässiga fördomar introduceras från början bör vi: + +- ha en mångfald av bakgrunder och perspektiv bland de personer som arbetar med systemen +- investera i dataset som speglar mångfalden i vårt samhälle +- utveckla bättre metoder för att upptäcka och korrigera fördomar när de uppstår + +Fundera på verkliga scenarier där orättvisa är tydlig i modellbyggande och användning. Vad mer bör vi ta hänsyn till? + +## [Quiz efter föreläsningen](https://ff-quizzes.netlify.app/en/ml/) +## Granskning & Självstudier + +I denna lektion har du lärt dig några praktiska verktyg för att integrera ansvarsfull AI i maskininlärning. + +Titta på denna workshop för att fördjupa dig i ämnena: + +- Responsible AI Dashboard: En helhetslösning för att operationalisera RAI i praktiken av Besmira Nushi och Mehrnoosh Sameki + +[![Responsible AI Dashboard: En helhetslösning för att operationalisera RAI i praktiken](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Responsible AI Dashboard: En helhetslösning för att operationalisera RAI i praktiken") + + +> 🎥 Klicka på bilden ovan för en video: Responsible AI Dashboard: En helhetslösning för att operationalisera RAI i praktiken av Besmira Nushi och Mehrnoosh Sameki + +Referera till följande material för att lära dig mer om ansvarsfull AI och hur man bygger mer pålitliga modeller: + +- Microsofts RAI-dashboardverktyg för att felsöka ML-modeller: [Resurser för Responsible AI-verktyg](https://aka.ms/rai-dashboard) + +- Utforska Responsible AI-verktygslådan: [Github](https://github.com/microsoft/responsible-ai-toolbox) + +- Microsofts RAI-resurscenter: [Resurser för Responsible AI – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- Microsofts FATE-forskningsgrupp: [FATE: Rättvisa, Ansvar, Transparens och Etik inom AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +## Uppgift + +[Utforska RAI-dashboarden](assignment.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/9-Real-World/2-Debugging-ML-Models/assignment.md b/translations/sv/9-Real-World/2-Debugging-ML-Models/assignment.md new file mode 100644 index 000000000..af66b0dc2 --- /dev/null +++ b/translations/sv/9-Real-World/2-Debugging-ML-Models/assignment.md @@ -0,0 +1,25 @@ + +# Utforska Responsible AI (RAI) dashboard + +## Instruktioner + +I denna lektion lärde du dig om RAI-dashboarden, en uppsättning komponenter byggda på "öppen källkod" för att hjälpa dataforskare att utföra felanalys, datautforskning, rättvisebedömning, modelltolkning, kontrafaktiska/vad-händer-om-bedömningar och kausal analys på AI-system. För denna uppgift, utforska några av RAI-dashboardens exempel [notebooks](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) och rapportera dina resultat i en uppsats eller presentation. + +## Bedömningskriterier + +| Kriterier | Exemplariskt | Tillräckligt | Behöver förbättras | +| --------- | ------------ | ------------ | ------------------ | +| | En uppsats eller PowerPoint-presentation presenteras som diskuterar RAI-dashboardens komponenter, den notebook som kördes och de slutsatser som drogs från att köra den | En uppsats presenteras utan slutsatser | Ingen uppsats presenteras | + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/9-Real-World/README.md b/translations/sv/9-Real-World/README.md new file mode 100644 index 000000000..ed0b08072 --- /dev/null +++ b/translations/sv/9-Real-World/README.md @@ -0,0 +1,32 @@ + +# Postscript: Verkliga tillämpningar av klassisk maskininlärning + +I den här delen av kursplanen kommer du att introduceras till några verkliga tillämpningar av klassisk ML. Vi har letat på internet efter forskningsartiklar och artiklar om tillämpningar som har använt dessa strategier, och undvikit neurala nätverk, djupinlärning och AI så mycket som möjligt. Lär dig om hur ML används i affärssystem, ekologiska tillämpningar, finans, konst och kultur, och mycket mer. + +![chess](../../../9-Real-World/images/chess.jpg) + +> Foto av Alexis FauvetUnsplash + +## Lektion + +1. [Verkliga tillämpningar av ML](1-Applications/README.md) +2. [Modellfelsökning i maskininlärning med hjälp av komponenter från Responsible AI-dashboarden](2-Debugging-ML-Models/README.md) + +## Krediter + +"Verkliga tillämpningar" skrevs av ett team av personer, inklusive [Jen Looper](https://twitter.com/jenlooper) och [Ornella Altunyan](https://twitter.com/ornelladotcom). + +"Modellfelsökning i maskininlärning med hjälp av komponenter från Responsible AI-dashboarden" skrevs av [Ruth Yakubu](https://twitter.com/ruthieyakubu) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/CODE_OF_CONDUCT.md b/translations/sv/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..c9d66c357 --- /dev/null +++ b/translations/sv/CODE_OF_CONDUCT.md @@ -0,0 +1,23 @@ + +# Microsoft Open Source Uppförandekod + +Det här projektet har antagit [Microsoft Open Source Uppförandekod](https://opensource.microsoft.com/codeofconduct/). + +Resurser: + +- [Microsoft Open Source Uppförandekod](https://opensource.microsoft.com/codeofconduct/) +- [Microsoft Uppförandekod FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +- Kontakta [opencode@microsoft.com](mailto:opencode@microsoft.com) vid frågor eller funderingar + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/CONTRIBUTING.md b/translations/sv/CONTRIBUTING.md new file mode 100644 index 000000000..7322853cd --- /dev/null +++ b/translations/sv/CONTRIBUTING.md @@ -0,0 +1,30 @@ + +# Bidra + +Det här projektet välkomnar bidrag och förslag. De flesta bidrag kräver att du +godkänner ett Contributor License Agreement (CLA) som intygar att du har rätt att, +och faktiskt gör, ge oss rättigheter att använda ditt bidrag. För mer information, besök +https://cla.microsoft.com. + +> Viktigt: när du översätter text i detta repo, se till att du inte använder maskinöversättning. Vi kommer att verifiera översättningar via communityn, så vänligen erbjud dig endast att översätta till språk där du är kunnig. + +När du skickar in en pull request kommer en CLA-bot automatiskt att avgöra om du behöver +tillhandahålla en CLA och märka PR:n på lämpligt sätt (t.ex. etikett, kommentar). Följ bara +instruktionerna som tillhandahålls av boten. Du behöver bara göra detta en gång för alla repositories som använder vår CLA. + +Det här projektet har antagit [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +För mer information, se [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +eller kontakta [opencode@microsoft.com](mailto:opencode@microsoft.com) med eventuella ytterligare frågor eller kommentarer. + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/README.md b/translations/sv/README.md new file mode 100644 index 000000000..f8c196f24 --- /dev/null +++ b/translations/sv/README.md @@ -0,0 +1,178 @@ + +[![GitHub license](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/) + +### 🌐 Stöd för flera språk + +#### Stöds via GitHub Action (Automatiserat & Alltid Uppdaterat) + +[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](./README.md) | [Danish](../da/README.md) | [Norwegian](../no/README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](../he/README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Croatian](../hr/README.md) | [Slovenian](../sl/README.md) | [Ukrainian](../uk/README.md) | [Burmese (Myanmar)](../my/README.md) + +#### Gå med i gemenskapen + +[![Azure AI Discord](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) + +# Maskininlärning för nybörjare - En kursplan + +> 🌍 Res runt i världen medan vi utforskar maskininlärning genom världens kulturer 🌍 + +Cloud Advocates på Microsoft är glada att erbjuda en 12-veckors kursplan med 26 lektioner om **maskininlärning**. I denna kursplan kommer du att lära dig om det som ibland kallas **klassisk maskininlärning**, främst med hjälp av Scikit-learn som bibliotek och undvika djupinlärning, vilket täcks i vår [AI för nybörjare-kursplan](https://aka.ms/ai4beginners). Kombinera dessa lektioner med vår ['Data Science för nybörjare-kursplan'](https://aka.ms/ds4beginners), också! + +Res med oss runt i världen när vi tillämpar dessa klassiska tekniker på data från många olika delar av världen. Varje lektion innehåller quiz före och efter lektionen, skriftliga instruktioner för att slutföra lektionen, en lösning, en uppgift och mer. Vår projektbaserade pedagogik låter dig lära dig genom att bygga, en beprövad metod för att få nya färdigheter att fastna. + +**✍️ Stort tack till våra författare** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Anirban Mukherjee, Ornella Altunyan, Ruth Yakubu och Amy Boyd + +**🎨 Tack också till våra illustratörer** Tomomi Imura, Dasani Madipalli och Jen Looper + +**🙏 Speciellt tack 🙏 till våra Microsoft Student Ambassador-författare, granskare och innehållsbidragare**, särskilt Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila och Snigdha Agarwal + +**🤩 Extra tacksamhet till Microsoft Student Ambassadors Eric Wanjau, Jasleen Sondhi och Vidushi Gupta för våra R-lektioner!** + +# Kom igång + +Följ dessa steg: +1. **Forka repot**: Klicka på "Fork"-knappen längst upp till höger på denna sida. +2. **Klona repot**: `git clone https://github.com/microsoft/ML-For-Beginners.git` + +> [hitta alla ytterligare resurser för denna kurs i vår Microsoft Learn-samling](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +**[Studenter](https://aka.ms/student-page)**, för att använda denna kursplan, forka hela repot till ditt eget GitHub-konto och slutför övningarna själv eller med en grupp: + +- Börja med ett quiz före lektionen. +- Läs lektionen och slutför aktiviteterna, pausa och reflektera vid varje kunskapskontroll. +- Försök att skapa projekten genom att förstå lektionerna snarare än att köra lösningskoden; dock finns den koden tillgänglig i `/solution`-mapparna i varje projektorienterad lektion. +- Ta quizet efter lektionen. +- Slutför utmaningen. +- Slutför uppgiften. +- Efter att ha slutfört en lektionsgrupp, besök [Diskussionsforumet](https://github.com/microsoft/ML-For-Beginners/discussions) och "lär högt" genom att fylla i den relevanta PAT-mallen. En 'PAT' är ett Progress Assessment Tool som är en mall du fyller i för att fördjupa ditt lärande. Du kan också reagera på andra PATs så att vi kan lära oss tillsammans. + +> För vidare studier rekommenderar vi att följa dessa [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott) moduler och lärvägar. + +**Lärare**, vi har [inkluderat några förslag](for-teachers.md) på hur man använder denna kursplan. + +--- + +## Videogenomgångar + +Vissa av lektionerna finns tillgängliga som korta videor. Du hittar alla dessa in-line i lektionerna, eller på [ML för nybörjare-spellistan på Microsoft Developer YouTube-kanalen](https://aka.ms/ml-beginners-videos) genom att klicka på bilden nedan. + +[![ML för nybörjare banner](../../images/ml-for-beginners-video-banner.png)](https://aka.ms/ml-beginners-videos) + +--- + +## Möt teamet + +[![Promo video](../../images/ml.gif)](https://youtu.be/Tj1XWrDSYJU) + +**Gif av** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal) + +> 🎥 Klicka på bilden ovan för en video om projektet och personerna som skapade det! + +--- + +## Pedagogik + +Vi har valt två pedagogiska principer när vi byggde denna kursplan: att säkerställa att den är praktisk **projektbaserad** och att den innehåller **frekventa quiz**. Dessutom har denna kursplan ett gemensamt **tema** för att ge den sammanhållning. + +Genom att säkerställa att innehållet är kopplat till projekt görs processen mer engagerande för studenter och koncepten blir lättare att komma ihåg. Dessutom sätter ett quiz med låg insats före en klass studentens intention mot att lära sig ett ämne, medan ett andra quiz efter klassen säkerställer ytterligare retention. Denna kursplan är designad för att vara flexibel och rolig och kan tas i sin helhet eller delvis. Projekten börjar små och blir alltmer komplexa i slutet av den 12-veckors cykeln. Kursplanen inkluderar också ett efterord om verkliga tillämpningar av ML, som kan användas som extra kredit eller som grund för diskussion. + +> Hitta vår [Uppförandekod](CODE_OF_CONDUCT.md), [Bidragsriktlinjer](CONTRIBUTING.md) och [Översättningsriktlinjer](TRANSLATIONS.md). Vi välkomnar din konstruktiva feedback! + +## Varje lektion innehåller + +- valfri sketchnote +- valfri kompletterande video +- videogenomgång (endast vissa lektioner) +- [quiz före lektionen](https://ff-quizzes.netlify.app/en/ml/) +- skriftlig lektion +- för projektbaserade lektioner, steg-för-steg-guider om hur man bygger projektet +- kunskapskontroller +- en utmaning +- kompletterande läsning +- uppgift +- [quiz efter lektionen](https://ff-quizzes.netlify.app/en/ml/) + +> **En notering om språk**: Dessa lektioner är främst skrivna i Python, men många är också tillgängliga i R. För att slutföra en R-lektion, gå till `/solution`-mappen och leta efter R-lektioner. De inkluderar en .rmd-fil som representerar en **R Markdown**-fil som enkelt kan definieras som en inbäddning av `kodblock` (av R eller andra språk) och en `YAML-header` (som styr hur man formaterar utdata som PDF) i ett `Markdown-dokument`. Som sådan fungerar det som en exemplifierande författarram för datavetenskap eftersom det låter dig kombinera din kod, dess utdata och dina tankar genom att låta dig skriva ner dem i Markdown. Dessutom kan R Markdown-dokument renderas till utdataformat som PDF, HTML eller Word. + +> **En notering om quiz**: Alla quiz finns i [Quiz App-mappen](../../quiz-app), totalt 52 quiz med tre frågor vardera. De är länkade från lektionerna, men quiz-appen kan köras lokalt; följ instruktionerna i `quiz-app`-mappen för att köra lokalt eller distribuera till Azure. + +| Lektionsnummer | Ämne | Lektionsgruppering | Lärandemål | Länkad lektion | Författare | +| :-----------: | :------------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: | +| 01 | Introduktion till maskininlärning | [Introduktion](1-Introduction/README.md) | Lär dig de grundläggande koncepten bakom maskininlärning | [Lektion](1-Introduction/1-intro-to-ML/README.md) | Muhammad | +| 02 | Historien om maskininlärning | [Introduktion](1-Introduction/README.md) | Lär dig historien bakom detta område | [Lektion](1-Introduction/2-history-of-ML/README.md) | Jen och Amy | +| 03 | Rättvisa och maskininlärning | [Introduktion](1-Introduction/README.md) | Vilka är de viktiga filosofiska frågorna kring rättvisa som studenter bör överväga när de bygger och tillämpar ML-modeller? | [Lektion](1-Introduction/3-fairness/README.md) | Tomomi | +| 04 | Tekniker för maskininlärning | [Introduction](1-Introduction/README.md) | Vilka tekniker använder ML-forskare för att bygga ML-modeller? | [Lesson](1-Introduction/4-techniques-of-ML/README.md) | Chris och Jen | +| 05 | Introduktion till regression | [Regression](2-Regression/README.md) | Kom igång med Python och Scikit-learn för regressionsmodeller | +
            • [Python](2-Regression/1-Tools/README.md)
            • [R](../../2-Regression/1-Tools/solution/R/lesson_1.html)
            |
            • Jen
            • Eric Wanjau
            | +| 06 | Nordamerikanska pumpapriser 🎃 | [Regression](2-Regression/README.md) | Visualisera och rengör data som förberedelse för ML |
            • [Python](2-Regression/2-Data/README.md)
            • [R](../../2-Regression/2-Data/solution/R/lesson_2.html)
            |
            • Jen
            • Eric Wanjau
            | +| 07 | Nordamerikanska pumpapriser 🎃 | [Regression](2-Regression/README.md) | Bygg linjära och polynomiska regressionsmodeller |
            • [Python](2-Regression/3-Linear/README.md)
            • [R](../../2-Regression/3-Linear/solution/R/lesson_3.html)
            |
            • Jen och Dmitry
            • Eric Wanjau
            | +| 08 | Nordamerikanska pumpapriser 🎃 | [Regression](2-Regression/README.md) | Bygg en logistisk regressionsmodell |
            • [Python](2-Regression/4-Logistic/README.md)
            • [R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)
            |
            • Jen
            • Eric Wanjau
            | +| 09 | En webbapp 🔌 | [Web App](3-Web-App/README.md) | Bygg en webbapp för att använda din tränade modell | [Python](3-Web-App/1-Web-App/README.md) | Jen | +| 10 | Introduktion till klassificering | [Classification](4-Classification/README.md) | Rengör, förbered och visualisera din data; introduktion till klassificering |
            • [Python](4-Classification/1-Introduction/README.md)
            • [R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) |
              • Jen och Cassie
              • Eric Wanjau
              | +| 11 | Utsökta asiatiska och indiska rätter 🍜 | [Classification](4-Classification/README.md) | Introduktion till klassificerare |
              • [Python](4-Classification/2-Classifiers-1/README.md)
              • [R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) |
                • Jen och Cassie
                • Eric Wanjau
                | +| 12 | Utsökta asiatiska och indiska rätter 🍜 | [Classification](4-Classification/README.md) | Fler klassificerare |
                • [Python](4-Classification/3-Classifiers-2/README.md)
                • [R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) |
                  • Jen och Cassie
                  • Eric Wanjau
                  | +| 13 | Utsökta asiatiska och indiska rätter 🍜 | [Classification](4-Classification/README.md) | Bygg en rekommendationswebbapp med din modell | [Python](4-Classification/4-Applied/README.md) | Jen | +| 14 | Introduktion till klustring | [Clustering](5-Clustering/README.md) | Rengör, förbered och visualisera din data; introduktion till klustring |
                  • [Python](5-Clustering/1-Visualize/README.md)
                  • [R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) |
                    • Jen
                    • Eric Wanjau
                    | +| 15 | Utforska nigerianska musiksmaker 🎧 | [Clustering](5-Clustering/README.md) | Utforska K-Means klustringsmetod |
                    • [Python](5-Clustering/2-K-Means/README.md)
                    • [R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) |
                      • Jen
                      • Eric Wanjau
                      | +| 16 | Introduktion till naturlig språkbehandling ☕️ | [Natural language processing](6-NLP/README.md) | Lär dig grunderna i NLP genom att bygga en enkel bot | [Python](6-NLP/1-Introduction-to-NLP/README.md) | Stephen | +| 17 | Vanliga NLP-uppgifter ☕️ | [Natural language processing](6-NLP/README.md) | Fördjupa dina NLP-kunskaper genom att förstå vanliga uppgifter vid arbete med språkstrukturer | [Python](6-NLP/2-Tasks/README.md) | Stephen | +| 18 | Översättning och sentimentanalys ♥️ | [Natural language processing](6-NLP/README.md) | Översättning och sentimentanalys med Jane Austen | [Python](6-NLP/3-Translation-Sentiment/README.md) | Stephen | +| 19 | Romantiska hotell i Europa ♥️ | [Natural language processing](6-NLP/README.md) | Sentimentanalys med hotellrecensioner 1 | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | Stephen | +| 20 | Romantiska hotell i Europa ♥️ | [Natural language processing](6-NLP/README.md) | Sentimentanalys med hotellrecensioner 2 | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | Stephen | +| 21 | Introduktion till tidsserieprognoser | [Time series](7-TimeSeries/README.md) | Introduktion till tidsserieprognoser | [Python](7-TimeSeries/1-Introduction/README.md) | Francesca | +| 22 | ⚡️ Världens energiförbrukning ⚡️ - tidsserieprognoser med ARIMA | [Time series](7-TimeSeries/README.md) | Tidsserieprognoser med ARIMA | [Python](7-TimeSeries/2-ARIMA/README.md) | Francesca | +| 23 | ⚡️ Världens energiförbrukning ⚡️ - tidsserieprognoser med SVR | [Time series](7-TimeSeries/README.md) | Tidsserieprognoser med Support Vector Regressor | [Python](7-TimeSeries/3-SVR/README.md) | Anirban | +| 24 | Introduktion till förstärkningsinlärning | [Reinforcement learning](8-Reinforcement/README.md) | Introduktion till förstärkningsinlärning med Q-Learning | [Python](8-Reinforcement/1-QLearning/README.md) | Dmitry | +| 25 | Hjälp Peter undvika vargen! 🐺 | [Reinforcement learning](8-Reinforcement/README.md) | Förstärkningsinlärning med Gym | [Python](8-Reinforcement/2-Gym/README.md) | Dmitry | +| Postscript | Verkliga ML-scenarier och applikationer | [ML in the Wild](9-Real-World/README.md) | Intressanta och avslöjande verkliga applikationer av klassisk ML | [Lesson](9-Real-World/1-Applications/README.md) | Team | +| Postscript | Modellfelsökning i ML med RAI-dashboard | [ML in the Wild](9-Real-World/README.md) | Modellfelsökning i maskininlärning med komponenter från Responsible AI-dashboard | [Lesson](9-Real-World/2-Debugging-ML-Models/README.md) | Ruth Yakubu | + +> [hitta alla ytterligare resurser för denna kurs i vår Microsoft Learn-samling](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +## Offlineåtkomst + +Du kan köra denna dokumentation offline med hjälp av [Docsify](https://docsify.js.org/#/). Forka detta repo, [installera Docsify](https://docsify.js.org/#/quickstart) på din lokala maskin, och skriv sedan `docsify serve` i root-mappen av detta repo. Webbplatsen kommer att serveras på port 3000 på din localhost: `localhost:3000`. + +## PDF:er + +Hitta en pdf av läroplanen med länkar [här](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf). + + +## 🎒 Andra kurser + +Vårt team producerar andra kurser! Kolla in: + +- [Generativ AI för nybörjare](https://aka.ms/genai-beginners) +- [Generativ AI för nybörjare .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet) +- [Generativ AI med JavaScript](https://github.com/microsoft/generative-ai-with-javascript) +- [Generativ AI med Java](https://github.com/microsoft/Generative-AI-for-beginners-java) +- [AI för nybörjare](https://aka.ms/ai-beginners) +- [Data Science för nybörjare](https://aka.ms/datascience-beginners) +- [ML för nybörjare](https://aka.ms/ml-beginners) +- [Cybersäkerhet för nybörjare](https://github.com/microsoft/Security-101) +- [Webbutveckling för nybörjare](https://aka.ms/webdev-beginners) +- [IoT för nybörjare](https://aka.ms/iot-beginners) +- [XR-utveckling för nybörjare](https://github.com/microsoft/xr-development-for-beginners) +- [Bemästra GitHub Copilot för parprogrammering](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming) +- [Bemästra GitHub Copilot för C#/.NET-utvecklare](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers) +- [Välj ditt eget Copilot-äventyr](https://github.com/microsoft/CopilotAdventures) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/SECURITY.md b/translations/sv/SECURITY.md new file mode 100644 index 000000000..db9ba8e75 --- /dev/null +++ b/translations/sv/SECURITY.md @@ -0,0 +1,51 @@ + +## Säkerhet + +Microsoft tar säkerheten för våra mjukvaruprodukter och tjänster på största allvar, vilket inkluderar alla källkodsförråd som hanteras via våra GitHub-organisationer, såsom [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) och [våra GitHub-organisationer](https://opensource.microsoft.com/). + +Om du tror att du har hittat en säkerhetsbrist i något Microsoft-ägt förråd som uppfyller [Microsofts definition av en säkerhetsbrist](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott), vänligen rapportera det till oss enligt beskrivningen nedan. + +## Rapportering av säkerhetsproblem + +**Rapportera inte säkerhetsbrister via offentliga GitHub-ärenden.** + +Rapportera dem istället till Microsoft Security Response Center (MSRC) på [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). + +Om du föredrar att skicka in utan att logga in, skicka ett e-postmeddelande till [secure@microsoft.com](mailto:secure@microsoft.com). Om möjligt, kryptera ditt meddelande med vår PGP-nyckel; ladda ner den från [Microsoft Security Response Center PGP Key-sidan](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). + +Du bör få ett svar inom 24 timmar. Om du av någon anledning inte gör det, följ upp via e-post för att säkerställa att vi mottog ditt ursprungliga meddelande. Ytterligare information finns på [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Vänligen inkludera den begärda informationen som anges nedan (så mycket du kan tillhandahålla) för att hjälpa oss att bättre förstå naturen och omfattningen av det möjliga problemet: + + * Typ av problem (t.ex. buffertöverflöd, SQL-injektion, cross-site scripting, etc.) + * Fullständiga sökvägar till källfiler relaterade till problemet + * Platsen för den drabbade källkoden (tag/branch/commit eller direkt URL) + * Eventuell särskild konfiguration som krävs för att återskapa problemet + * Steg-för-steg-instruktioner för att återskapa problemet + * Proof-of-concept eller exploateringskod (om möjligt) + * Påverkan av problemet, inklusive hur en angripare kan utnyttja det + +Denna information hjälper oss att snabbare prioritera din rapport. + +Om du rapporterar för en bug bounty kan mer kompletta rapporter bidra till en högre belöning. Besök vår [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty)-sida för mer information om våra aktiva program. + +## Föredragna språk + +Vi föredrar att all kommunikation sker på engelska. + +## Policy + +Microsoft följer principen om [Samordnad sårbarhetsrapportering](https://www.microsoft.com/en-us/msrc/cvd). + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/SUPPORT.md b/translations/sv/SUPPORT.md new file mode 100644 index 000000000..7ef497c43 --- /dev/null +++ b/translations/sv/SUPPORT.md @@ -0,0 +1,26 @@ + +# Support +## Hur man rapporterar problem och får hjälp + +Det här projektet använder GitHub Issues för att spåra buggar och funktionsförfrågningar. Sök bland befintliga +ärenden innan du skapar nya för att undvika duplicering. För nya ärenden, rapportera din bugg eller +funktionsförfrågan som ett nytt ärende. + +För hjälp och frågor om hur man använder detta projekt, skapa ett ärende. + +## Microsofts supportpolicy + +Support för detta arkiv är begränsad till de resurser som anges ovan. + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/docs/_sidebar.md b/translations/sv/docs/_sidebar.md new file mode 100644 index 000000000..bf08d8be4 --- /dev/null +++ b/translations/sv/docs/_sidebar.md @@ -0,0 +1,57 @@ + +- Introduktion + - [Introduktion till maskininlärning](../1-Introduction/1-intro-to-ML/README.md) + - [Maskininlärningens historia](../1-Introduction/2-history-of-ML/README.md) + - [ML och rättvisa](../1-Introduction/3-fairness/README.md) + - [Tekniker inom ML](../1-Introduction/4-techniques-of-ML/README.md) + +- Regression + - [Verktyg för arbetet](../2-Regression/1-Tools/README.md) + - [Data](../2-Regression/2-Data/README.md) + - [Linjär regression](../2-Regression/3-Linear/README.md) + - [Logistisk regression](../2-Regression/4-Logistic/README.md) + +- Bygg en webbapp + - [Webbapp](../3-Web-App/1-Web-App/README.md) + +- Klassificering + - [Introduktion till klassificering](../4-Classification/1-Introduction/README.md) + - [Klassificerare 1](../4-Classification/2-Classifiers-1/README.md) + - [Klassificerare 2](../4-Classification/3-Classifiers-2/README.md) + - [Tillämpad ML](../4-Classification/4-Applied/README.md) + +- Klustring + - [Visualisera din data](../5-Clustering/1-Visualize/README.md) + - [K-Means](../5-Clustering/2-K-Means/README.md) + +- NLP + - [Introduktion till NLP](../6-NLP/1-Introduction-to-NLP/README.md) + - [NLP-uppgifter](../6-NLP/2-Tasks/README.md) + - [Översättning och sentiment](../6-NLP/3-Translation-Sentiment/README.md) + - [Hotellrecensioner 1](../6-NLP/4-Hotel-Reviews-1/README.md) + - [Hotellrecensioner 2](../6-NLP/5-Hotel-Reviews-2/README.md) + +- Tidsserieprognoser + - [Introduktion till tidsserieprognoser](../7-TimeSeries/1-Introduction/README.md) + - [ARIMA](../7-TimeSeries/2-ARIMA/README.md) + - [SVR](../7-TimeSeries/3-SVR/README.md) + +- Förstärkningsinlärning + - [Q-Learning](../8-Reinforcement/1-QLearning/README.md) + - [Gym](../8-Reinforcement/2-Gym/README.md) + +- Maskininlärning i verkligheten + - [Applikationer](../9-Real-World/1-Applications/README.md) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/for-teachers.md b/translations/sv/for-teachers.md new file mode 100644 index 000000000..2432eb2b6 --- /dev/null +++ b/translations/sv/for-teachers.md @@ -0,0 +1,37 @@ + +## För lärare + +Vill du använda denna läroplan i ditt klassrum? Varsågod! + +Faktum är att du kan använda den direkt på GitHub genom att använda GitHub Classroom. + +För att göra det, gör en fork av detta repo. Du kommer behöva skapa ett repo för varje lektion, så du måste extrahera varje mapp till ett separat repo. På så sätt kan [GitHub Classroom](https://classroom.github.com/classrooms) hantera varje lektion separat. + +Dessa [fullständiga instruktioner](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) ger dig en idé om hur du kan sätta upp ditt klassrum. + +## Använda repot som det är + +Om du vill använda detta repo som det är, utan att använda GitHub Classroom, går det också bra. Du behöver kommunicera med dina elever om vilken lektion ni ska arbeta med tillsammans. + +I ett onlineformat (Zoom, Teams eller annat) kan du skapa grupprum för frågesporterna och handleda eleverna för att hjälpa dem att förbereda sig för att lära. Sedan kan du bjuda in eleverna att delta i frågesporterna och skicka in sina svar som "issues" vid en viss tidpunkt. Du kan göra samma sak med uppgifter, om du vill att eleverna ska arbeta tillsammans öppet. + +Om du föredrar ett mer privat format, be dina elever att göra en fork av läroplanen, lektion för lektion, till sina egna privata GitHub-repos och ge dig åtkomst. Då kan de slutföra frågesporter och uppgifter privat och skicka in dem till dig via issues på ditt klassrumsrepo. + +Det finns många sätt att få detta att fungera i ett onlineklassrum. Berätta gärna för oss vad som fungerar bäst för dig! + +## Ge oss gärna dina tankar! + +Vi vill att denna läroplan ska fungera för dig och dina elever. Ge oss gärna [feedback](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u). + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på sitt originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/quiz-app/README.md b/translations/sv/quiz-app/README.md new file mode 100644 index 000000000..1a8333c65 --- /dev/null +++ b/translations/sv/quiz-app/README.md @@ -0,0 +1,127 @@ + +# Quizzer + +Dessa quizzer är för- och efterföreläsningsquizzer för ML-kursplanen på https://aka.ms/ml-beginners + +## Projektinställning + +``` +npm install +``` + +### Kompilerar och laddar om för utveckling + +``` +npm run serve +``` + +### Kompilerar och minimerar för produktion + +``` +npm run build +``` + +### Lintar och fixar filer + +``` +npm run lint +``` + +### Anpassa konfiguration + +Se [Konfigurationsreferens](https://cli.vuejs.org/config/). + +Krediter: Tack till den ursprungliga versionen av denna quizapp: https://github.com/arpan45/simple-quiz-vue + +## Distribuera till Azure + +Här är en steg-för-steg-guide för att hjälpa dig komma igång: + +1. Forka ett GitHub-repository +Se till att din statiska webbappkod finns i ditt GitHub-repository. Forka detta repository. + +2. Skapa en Azure Static Web App +- Skapa ett [Azure-konto](http://azure.microsoft.com) +- Gå till [Azure-portalen](https://portal.azure.com) +- Klicka på "Skapa en resurs" och sök efter "Static Web App". +- Klicka på "Skapa". + +3. Konfigurera den statiska webbappen +- Grundläggande: + - Prenumeration: Välj din Azure-prenumeration. + - Resursgrupp: Skapa en ny resursgrupp eller använd en befintlig. + - Namn: Ange ett namn för din statiska webbapp. + - Region: Välj den region som är närmast dina användare. + +- #### Distributionsdetaljer: + - Källa: Välj "GitHub". + - GitHub-konto: Auktorisera Azure att få åtkomst till ditt GitHub-konto. + - Organisation: Välj din GitHub-organisation. + - Repository: Välj det repository som innehåller din statiska webbapp. + - Gren: Välj den gren du vill distribuera från. + +- #### Byggdetaljer: + - Byggförinställningar: Välj det ramverk din app är byggd med (t.ex. React, Angular, Vue, etc.). + - Appens plats: Ange mappen som innehåller din appkod (t.ex. / om den är i roten). + - API-plats: Om du har ett API, ange dess plats (valfritt). + - Utdata-plats: Ange mappen där byggutdata genereras (t.ex. build eller dist). + +4. Granska och skapa +Granska dina inställningar och klicka på "Skapa". Azure kommer att ställa in de nödvändiga resurserna och skapa ett GitHub Actions-arbetsflöde i ditt repository. + +5. GitHub Actions-arbetsflöde +Azure kommer automatiskt att skapa en GitHub Actions-arbetsflödesfil i ditt repository (.github/workflows/azure-static-web-apps-.yml). Detta arbetsflöde hanterar bygg- och distributionsprocessen. + +6. Övervaka distributionen +Gå till fliken "Actions" i ditt GitHub-repository. +Du bör se ett arbetsflöde som körs. Detta arbetsflöde kommer att bygga och distribuera din statiska webbapp till Azure. +När arbetsflödet är klart kommer din app att vara live på den angivna Azure-URL:en. + +### Exempel på arbetsflödesfil + +Här är ett exempel på hur GitHub Actions-arbetsflödesfilen kan se ut: +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 +``` + +### Ytterligare resurser +- [Azure Static Web Apps-dokumentation](https://learn.microsoft.com/azure/static-web-apps/getting-started) +- [GitHub Actions-dokumentation](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/sketchnotes/LICENSE.md b/translations/sv/sketchnotes/LICENSE.md new file mode 100644 index 000000000..c9b9fa87a --- /dev/null +++ b/translations/sv/sketchnotes/LICENSE.md @@ -0,0 +1,149 @@ + +Attribution-ShareAlike 4.0 Internationell + +======================================================================= + +Creative Commons Corporation ("Creative Commons") är inte en advokatbyrå och tillhandahåller inte juridiska tjänster eller juridisk rådgivning. Distribution av Creative Commons offentliga licenser skapar inte en advokat-klientrelation eller någon annan relation. Creative Commons tillhandahåller sina licenser och relaterad information "i befintligt skick". Creative Commons ger inga garantier gällande sina licenser, något material som licensierats enligt deras villkor, eller någon relaterad information. Creative Commons avsäger sig allt ansvar för skador som uppstår vid användning av dessa, i den utsträckning som lagen tillåter. + +Användning av Creative Commons offentliga licenser + +Creative Commons offentliga licenser tillhandahåller en standarduppsättning av villkor som skapare och andra rättighetsinnehavare kan använda för att dela originalverk och annat material som omfattas av upphovsrätt och vissa andra rättigheter som anges i den offentliga licensen nedan. Följande överväganden är endast för informationssyften, är inte uttömmande och utgör inte en del av våra licenser. + + Överväganden för licensgivare: Våra offentliga licenser är + avsedda att användas av dem som har rätt att ge allmänheten + tillstånd att använda material på sätt som annars är begränsade + av upphovsrätt och vissa andra rättigheter. Våra licenser är + oåterkalleliga. Licensgivare bör läsa och förstå villkoren + för den licens de väljer innan de tillämpar den. Licensgivare + bör också säkerställa att de har alla nödvändiga rättigheter + innan de tillämpar våra licenser så att allmänheten kan återanvända + materialet som förväntat. Licensgivare bör tydligt markera + material som inte omfattas av licensen. Detta inkluderar annat + CC-licensierat material eller material som används enligt ett + undantag eller begränsning av upphovsrätten. Fler överväganden + för licensgivare: + wiki.creativecommons.org/Considerations_for_licensors + + Överväganden för allmänheten: Genom att använda en av våra + offentliga licenser ger en licensgivare allmänheten tillstånd + att använda det licensierade materialet enligt angivna villkor. + Om licensgivarens tillstånd inte är nödvändigt av någon anledning + – till exempel på grund av ett tillämpligt undantag eller en + begränsning av upphovsrätten – regleras inte den användningen + av licensen. Våra licenser ger endast tillstånd enligt + upphovsrätten och vissa andra rättigheter som licensgivaren har + befogenhet att ge. Användning av det licensierade materialet kan + fortfarande vara begränsad av andra skäl, inklusive att andra + har upphovsrätt eller andra rättigheter i materialet. En + licensgivare kan göra särskilda förfrågningar, såsom att be om + att alla ändringar markeras eller beskrivs. Även om detta inte + krävs enligt våra licenser, uppmuntras du att respektera sådana + förfrågningar där det är rimligt. Fler överväganden för + allmänheten: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 Internationell offentlig licens + +Genom att utöva de licensierade rättigheterna (definierade nedan) accepterar och samtycker du till att vara bunden av villkoren i denna Creative Commons Attribution-ShareAlike 4.0 Internationella offentliga licens ("Offentlig licens"). I den mån denna offentliga licens kan tolkas som ett avtal, beviljas du de licensierade rättigheterna i utbyte mot att du accepterar dessa villkor, och licensgivaren beviljar dig sådana rättigheter i utbyte mot de fördelar licensgivaren får genom att göra det licensierade materialet tillgängligt enligt dessa villkor. + +Avsnitt 1 – Definitioner. + + a. Anpassat material avser material som omfattas av upphovsrätt och liknande rättigheter och som är härlett från eller baserat på det licensierade materialet och där det licensierade materialet översätts, ändras, arrangeras, transformeras eller på annat sätt modifieras på ett sätt som kräver tillstånd enligt upphovsrätten och liknande rättigheter som innehas av licensgivaren. För syftet med denna offentliga licens, där det licensierade materialet är ett musikaliskt verk, en prestation eller en ljudinspelning, produceras alltid anpassat material där det licensierade materialet synkroniseras i tidsrelation med en rörlig bild. + + b. Adapterlicens avser den licens du tillämpar på dina upphovsrättsliga och liknande rättigheter i dina bidrag till anpassat material i enlighet med villkoren i denna offentliga licens. + + c. BY-SA-kompatibel licens avser en licens som listas på creativecommons.org/compatiblelicenses, godkänd av Creative Commons som i huvudsak motsvarande denna offentliga licens. + + d. Upphovsrätt och liknande rättigheter avser upphovsrätt och/eller liknande rättigheter som är nära relaterade till upphovsrätten, inklusive, utan begränsning, prestation, sändning, ljudinspelning och sui generis databasrättigheter, oavsett hur rättigheterna är märkta eller kategoriserade. För syftet med denna offentliga licens är de rättigheter som anges i avsnitt 2(b)(1)-(2) inte upphovsrätt och liknande rättigheter. + + e. Effektiva tekniska åtgärder avser sådana åtgärder som, i avsaknad av korrekt auktoritet, inte kan kringgås enligt lagar som uppfyller skyldigheter enligt artikel 11 i WIPO Copyright Treaty antagen den 20 december 1996, och/eller liknande internationella avtal. + + f. Undantag och begränsningar avser rättvis användning, rättvis hantering och/eller andra undantag eller begränsningar av upphovsrätten och liknande rättigheter som gäller för din användning av det licensierade materialet. + + g. Licenselement avser licensattributen som listas i namnet på en Creative Commons offentlig licens. Licenselementen i denna offentliga licens är Attribution och ShareAlike. + + h. Licensierat material avser det konstnärliga eller litterära verket, databasen eller annat material som licensgivaren har tillämpat denna offentliga licens på. + + i. Licensierade rättigheter avser de rättigheter som beviljas dig enligt villkoren i denna offentliga licens, vilka är begränsade till alla upphovsrättsliga och liknande rättigheter som gäller för din användning av det licensierade materialet och som licensgivaren har befogenhet att licensiera. + + j. Licensgivare avser den eller de individer eller enheter som beviljar rättigheter enligt denna offentliga licens. + + k. Dela avser att tillhandahålla material till allmänheten genom någon metod eller process som kräver tillstånd enligt de licensierade rättigheterna, såsom reproduktion, offentlig visning, offentlig framförande, distribution, spridning, kommunikation eller import, och att göra material tillgängligt för allmänheten, inklusive på sätt som gör att medlemmar av allmänheten kan få tillgång till materialet från en plats och vid en tidpunkt som de själva väljer. + + l. Sui generis databasrättigheter avser rättigheter som inte är upphovsrätt och som härrör från direktiv 96/9/EG från Europaparlamentet och rådet den 11 mars 1996 om rättsligt skydd för databaser, med ändringar och/eller efterföljande, samt andra i huvudsak motsvarande rättigheter var som helst i världen. + + m. Du avser den individ eller enhet som utövar de licensierade rättigheterna enligt denna offentliga licens. Din har en motsvarande betydelse. +Rättigheter, då databasen i vilken du har Sui Generis-databasrättigheter (men inte dess individuella innehåll) är Anpassat Material, + +inklusive för ändamålen i Avsnitt 3(b); och +c. Du måste följa villkoren i Avsnitt 3(a) om du delar hela eller en väsentlig del av innehållet i databasen. + +För att undvika missförstånd, kompletterar detta Avsnitt 4 och ersätter inte dina skyldigheter enligt denna offentliga licens där de licensierade rättigheterna inkluderar andra upphovsrättigheter och liknande rättigheter. + +--- + +### Avsnitt 5 – Ansvarsfriskrivning och ansvarsbegränsning. + +a. OM INTE ANNAT UTTRYCKLIGEN HAR ANGIVITS AV LICENSGIVAREN, I DEN UTSTRÄCKNING DET ÄR MÖJLIGT, TILLHANDAHÅLLER LICENSGIVAREN DET LICENSIERADE MATERIALET I BEFINTLIGT SKICK OCH SOM TILLGÄNGLIGT, OCH LÄMNAR INGA UTFÄSTELSER ELLER GARANTIER AV NÅGOT SLAG AVSEENDE DET LICENSIERADE MATERIALET, VARE SIG UTTRYCKLIGA, UNDERFÖRSTÅDDA, LAGSTADGADE ELLER ANNAT. DETTA INKLUDERAR, UTAN BEGRÄNSNING, GARANTIER OM ÄGANDERÄTT, SÄLJBARHET, LÄMPLIGHET FÖR ETT VISST ÄNDAMÅL, ICKE-INTRÅNG, AVSAKNAD AV DOLDA ELLER ANDRA DEFEKTER, NOGGRANNHET, ELLER FÖREKOMST ELLER AVSAKNAD AV FEL, VARE SIG KÄNDA ELLER UPPTÄCKBARA. DÄR ANSVARSFRISKRIVNINGAR INTE ÄR TILLÅTNA HELT ELLER DELVIS, KANSKE DENNA FRISKRIVNING INTE GÄLLER DIG. + +b. I DEN UTSTRÄCKNING DET ÄR MÖJLIGT, KOMMER LICENSGIVAREN UNDER INGA OMSTÄNDIGHETER ATT VARA ANSVARIG GENTEMOT DIG ENLIGT NÅGON JURIDISK TEORI (INKLUSIVE, UTAN BEGRÄNSNING, VÅRDSLÖSHET) ELLER ANNAT FÖR NÅGRA DIREKTA, SÄRSKILDA, INDIREKTA, TILLFÄLLIGA, FÖLJDSKADOR, STRAFFSKADESTÅND, EXEMPLARISKA ELLER ANDRA FÖRLUSTER, KOSTNADER, UTGIFTER ELLER SKADOR SOM UPPSTÅR UR DENNA OFFENTLIGA LICENS ELLER ANVÄNDNINGEN AV DET LICENSIERADE MATERIALET, ÄVEN OM LICENSGIVAREN HAR INFORMERATS OM MÖJLIGHETEN AV SÅDANA FÖRLUSTER, KOSTNADER, UTGIFTER ELLER SKADOR. DÄR EN ANSVARSBEGRÄNSNING INTE ÄR TILLÅTEN HELT ELLER DELVIS, KANSKE DENNA BEGRÄNSNING INTE GÄLLER DIG. + +c. Ansvarsfriskrivningen och ansvarsbegränsningen som anges ovan ska tolkas på ett sätt som, i den utsträckning det är möjligt, mest liknar en absolut friskrivning och avsägelse av allt ansvar. + +--- + +### Avsnitt 6 – Giltighetstid och upphörande. + +a. Denna offentliga licens gäller under upphovsrättens och liknande rättigheters giltighetstid som licensieras här. Om du emellertid inte följer denna offentliga licens, upphör dina rättigheter enligt denna offentliga licens automatiskt. + +b. Om din rätt att använda det licensierade materialet har upphört enligt Avsnitt 6(a), återställs den: + +1. automatiskt från och med det datum då överträdelsen åtgärdas, förutsatt att den åtgärdas inom 30 dagar från det att du upptäckte överträdelsen; eller +2. genom uttrycklig återställning av licensgivaren. + +För att undvika missförstånd påverkar inte detta Avsnitt 6(b) någon rätt som licensgivaren kan ha att söka rättsliga åtgärder för dina överträdelser av denna offentliga licens. + +c. För att undvika missförstånd kan licensgivaren också erbjuda det licensierade materialet enligt separata villkor eller sluta distribuera det licensierade materialet när som helst; dock kommer detta inte att avsluta denna offentliga licens. + +d. Avsnitten 1, 5, 6, 7 och 8 överlever upphörandet av denna offentliga licens. + +--- + +### Avsnitt 7 – Andra villkor och förhållanden. + +a. Licensgivaren är inte bunden av några ytterligare eller annorlunda villkor som kommuniceras av dig om inte uttryckligen överenskommet. + +b. Eventuella arrangemang, överenskommelser eller avtal angående det licensierade materialet som inte anges här är separata från och oberoende av villkoren i denna offentliga licens. + +--- + +### Avsnitt 8 – Tolkning. + +a. För att undvika missförstånd, begränsar, inskränker eller villkorar inte denna offentliga licens någon användning av det licensierade materialet som lagligen kan göras utan tillstånd enligt denna offentliga licens. + +b. I den utsträckning det är möjligt, om någon bestämmelse i denna offentliga licens anses vara ogenomförbar, ska den automatiskt omformas till den minsta utsträckning som krävs för att göra den genomförbar. Om bestämmelsen inte kan omformas, ska den avskiljas från denna offentliga licens utan att påverka genomförbarheten av de återstående villkoren. + +c. Ingen bestämmelse i denna offentliga licens kommer att avstås från och inget underlåtenhet att följa kommer att godkännas om inte uttryckligen överenskommet av licensgivaren. + +d. Ingenting i denna offentliga licens utgör eller kan tolkas som en begränsning av, eller avsägelse av, några privilegier och immuniteter som gäller för licensgivaren eller dig, inklusive från rättsliga processer i någon jurisdiktion eller myndighet. + +--- + +Creative Commons är inte part i sina offentliga licenser. Trots detta kan Creative Commons välja att tillämpa en av sina offentliga licenser på material som det publicerar och i dessa fall betraktas som "Licensgivaren." Texten i Creative Commons offentliga licenser är tillägnad allmänheten under CC0 Public Domain Dedication. Förutom för det begränsade syftet att indikera att material delas under en Creative Commons offentlig licens eller som annars tillåts enligt Creative Commons policyer som publiceras på creativecommons.org/policies, godkänner inte Creative Commons användningen av varumärket "Creative Commons" eller något annat varumärke eller logotyp från Creative Commons utan dess föregående skriftliga medgivande, inklusive, utan begränsning, i samband med obehöriga ändringar av någon av dess offentliga licenser eller andra arrangemang, överenskommelser eller avtal angående användning av licensierat material. För att undvika missförstånd utgör inte denna paragraf en del av de offentliga licenserna. + +Creative Commons kan kontaktas på creativecommons.org. + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/sv/sketchnotes/README.md b/translations/sv/sketchnotes/README.md new file mode 100644 index 000000000..eaeeaedce --- /dev/null +++ b/translations/sv/sketchnotes/README.md @@ -0,0 +1,21 @@ + +Alla sketchnotes för läroplanen kan laddas ner här. + +🖨 För utskrift i hög upplösning finns TIFF-versionerna tillgängliga på [detta repo](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff). + +🎨 Skapad av: [Tomomi Imura](https://github.com/girliemac) (Twitter: [@girlie_mac](https://twitter.com/girlie_mac)) + +[![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-sa/4.0/) + +--- + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiska översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file diff --git a/translations/th/1-Introduction/1-intro-to-ML/README.md b/translations/th/1-Introduction/1-intro-to-ML/README.md new file mode 100644 index 000000000..d15770a4c --- /dev/null +++ b/translations/th/1-Introduction/1-intro-to-ML/README.md @@ -0,0 +1,159 @@ + +# บทนำสู่การเรียนรู้ของเครื่อง + +## [แบบทดสอบก่อนเริ่มบทเรียน](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML for beginners - Introduction to Machine Learning for Beginners](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "ML for beginners - Introduction to Machine Learning for Beginners") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับบทเรียนนี้ + +ยินดีต้อนรับสู่คอร์สเรียนรู้ของเครื่องแบบคลาสสิกสำหรับผู้เริ่มต้น! ไม่ว่าคุณจะเป็นมือใหม่ในหัวข้อนี้ หรือเป็นผู้เชี่ยวชาญด้าน ML ที่ต้องการทบทวนความรู้ เราดีใจที่คุณมาร่วมกับเรา! เราต้องการสร้างจุดเริ่มต้นที่เป็นมิตรสำหรับการศึกษาด้าน ML ของคุณ และยินดีที่จะประเมิน ตอบสนอง และนำ [ความคิดเห็น](https://github.com/microsoft/ML-For-Beginners/discussions) ของคุณมาปรับปรุง + +[![Introduction to ML](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Introduction to ML") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: John Guttag จาก MIT แนะนำการเรียนรู้ของเครื่อง + +--- +## เริ่มต้นกับการเรียนรู้ของเครื่อง + +ก่อนเริ่มต้นกับหลักสูตรนี้ คุณจำเป็นต้องตั้งค่าคอมพิวเตอร์ของคุณให้พร้อมสำหรับการใช้งานโน้ตบุ๊กในเครื่อง + +- **ตั้งค่าคอมพิวเตอร์ของคุณด้วยวิดีโอเหล่านี้** ใช้ลิงก์ต่อไปนี้เพื่อเรียนรู้ [วิธีติดตั้ง Python](https://youtu.be/CXZYvNRIAKM) ในระบบของคุณ และ [ตั้งค่าตัวแก้ไขข้อความ](https://youtu.be/EU8eayHWoZg) สำหรับการพัฒนา +- **เรียนรู้ Python** ขอแนะนำให้มีความเข้าใจพื้นฐานเกี่ยวกับ [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott) ซึ่งเป็นภาษาการเขียนโปรแกรมที่มีประโยชน์สำหรับนักวิทยาศาสตร์ข้อมูลที่เราใช้ในคอร์สนี้ +- **เรียนรู้ Node.js และ JavaScript** เราใช้ JavaScript ในบางครั้งในคอร์สนี้เมื่อสร้างเว็บแอป ดังนั้นคุณจะต้องมี [node](https://nodejs.org) และ [npm](https://www.npmjs.com/) ติดตั้ง รวมถึง [Visual Studio Code](https://code.visualstudio.com/) สำหรับการพัฒนา Python และ JavaScript +- **สร้างบัญชี GitHub** เนื่องจากคุณพบเราใน [GitHub](https://github.com) คุณอาจมีบัญชีอยู่แล้ว แต่ถ้ายังไม่มี ให้สร้างบัญชีและ fork หลักสูตรนี้เพื่อใช้งานเอง (อย่าลืมให้ดาวเราด้วย 😊) +- **สำรวจ Scikit-learn** ทำความคุ้นเคยกับ [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) ซึ่งเป็นชุดไลบรารี ML ที่เราอ้างอิงในบทเรียนเหล่านี้ + +--- +## การเรียนรู้ของเครื่องคืออะไร? + +คำว่า 'การเรียนรู้ของเครื่อง' เป็นหนึ่งในคำที่ได้รับความนิยมและถูกใช้งานบ่อยที่สุดในปัจจุบัน มีความเป็นไปได้สูงที่คุณจะเคยได้ยินคำนี้อย่างน้อยหนึ่งครั้ง หากคุณมีความคุ้นเคยกับเทคโนโลยี ไม่ว่าคุณจะทำงานในสาขาใดก็ตาม อย่างไรก็ตาม กลไกของการเรียนรู้ของเครื่องยังคงเป็นปริศนาสำหรับคนส่วนใหญ่ สำหรับผู้เริ่มต้น การเรียนรู้ของเครื่องอาจดูเหมือนเป็นเรื่องที่ซับซ้อน ดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องเข้าใจว่าการเรียนรู้ของเครื่องคืออะไร และเรียนรู้เกี่ยวกับมันทีละขั้นตอนผ่านตัวอย่างที่เป็นรูปธรรม + +--- +## เส้นโค้งความนิยม + +![ml hype curve](../../../../1-Introduction/1-intro-to-ML/images/hype.png) + +> Google Trends แสดง 'เส้นโค้งความนิยม' ล่าสุดของคำว่า 'การเรียนรู้ของเครื่อง' + +--- +## จักรวาลที่ลึกลับ + +เราอาศัยอยู่ในจักรวาลที่เต็มไปด้วยความลึกลับที่น่าหลงใหล นักวิทยาศาสตร์ผู้ยิ่งใหญ่ เช่น Stephen Hawking, Albert Einstein และอีกมากมาย ได้อุทิศชีวิตของพวกเขาเพื่อค้นหาข้อมูลที่มีความหมายซึ่งเปิดเผยความลึกลับของโลกที่อยู่รอบตัวเรา นี่คือสภาพของมนุษย์ในการเรียนรู้: เด็กมนุษย์เรียนรู้สิ่งใหม่ ๆ และค้นพบโครงสร้างของโลกของพวกเขาปีต่อปีเมื่อพวกเขาเติบโตเป็นผู้ใหญ่ + +--- +## สมองของเด็ก + +สมองและประสาทสัมผัสของเด็กรับรู้ข้อเท็จจริงของสิ่งแวดล้อม และค่อย ๆ เรียนรู้รูปแบบที่ซ่อนอยู่ของชีวิต ซึ่งช่วยให้เด็กสร้างกฎเกณฑ์เชิงตรรกะเพื่อระบุรูปแบบที่เรียนรู้ได้ กระบวนการเรียนรู้ของสมองมนุษย์ทำให้มนุษย์เป็นสิ่งมีชีวิตที่ซับซ้อนที่สุดในโลกนี้ การเรียนรู้อย่างต่อเนื่องโดยการค้นพบรูปแบบที่ซ่อนอยู่และนวัตกรรมบนรูปแบบเหล่านั้นช่วยให้เราพัฒนาตนเองให้ดีขึ้นเรื่อย ๆ ตลอดชีวิต ความสามารถในการเรียนรู้และพัฒนานี้เกี่ยวข้องกับแนวคิดที่เรียกว่า [brain plasticity](https://www.simplypsychology.org/brain-plasticity.html) ในเชิงพื้นฐาน เราสามารถดึงแรงบันดาลใจบางอย่างจากกระบวนการเรียนรู้ของสมองมนุษย์และแนวคิดของการเรียนรู้ของเครื่อง + +--- +## สมองมนุษย์ + +[สมองมนุษย์](https://www.livescience.com/29365-human-brain.html) รับรู้สิ่งต่าง ๆ จากโลกจริง ประมวลผลข้อมูลที่รับรู้ ทำการตัดสินใจอย่างมีเหตุผล และดำเนินการบางอย่างตามสถานการณ์ นี่คือสิ่งที่เราเรียกว่าการประพฤติอย่างชาญฉลาด เมื่อเราสร้างโปรแกรมที่เลียนแบบกระบวนการพฤติกรรมที่ชาญฉลาดให้กับเครื่องจักร เราเรียกมันว่า ปัญญาประดิษฐ์ (AI) + +--- +## คำศัพท์บางคำ + +แม้ว่าคำศัพท์เหล่านี้อาจสร้างความสับสน แต่การเรียนรู้ของเครื่อง (ML) เป็นส่วนสำคัญของปัญญาประดิษฐ์ **ML เกี่ยวข้องกับการใช้อัลกอริทึมเฉพาะทางเพื่อค้นหาข้อมูลที่มีความหมายและค้นหารูปแบบที่ซ่อนอยู่จากข้อมูลที่รับรู้เพื่อสนับสนุนกระบวนการตัดสินใจอย่างมีเหตุผล** + +--- +## AI, ML, Deep Learning + +![AI, ML, deep learning, data science](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png) + +> แผนภาพแสดงความสัมพันธ์ระหว่าง AI, ML, deep learning และ data science อินโฟกราฟิกโดย [Jen Looper](https://twitter.com/jenlooper) ได้แรงบันดาลใจจาก [กราฟิกนี้](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining) + +--- +## แนวคิดที่ครอบคลุม + +ในหลักสูตรนี้ เราจะครอบคลุมเฉพาะแนวคิดหลักของการเรียนรู้ของเครื่องที่ผู้เริ่มต้นต้องรู้ เราจะเน้นที่ 'การเรียนรู้ของเครื่องแบบคลาสสิก' โดยใช้ Scikit-learn ซึ่งเป็นไลบรารีที่ยอดเยี่ยมที่นักเรียนหลายคนใช้เพื่อเรียนรู้พื้นฐาน เพื่อให้เข้าใจแนวคิดที่กว้างขึ้นของปัญญาประดิษฐ์หรือ deep learning ความรู้พื้นฐานที่แข็งแกร่งเกี่ยวกับการเรียนรู้ของเครื่องเป็นสิ่งสำคัญ และเราต้องการนำเสนอสิ่งนี้ที่นี่ + +--- +## ในคอร์สนี้คุณจะได้เรียนรู้: + +- แนวคิดหลักของการเรียนรู้ของเครื่อง +- ประวัติศาสตร์ของ ML +- ML และความเป็นธรรม +- เทคนิคการถดถอยใน ML +- เทคนิคการจำแนกประเภทใน ML +- เทคนิคการจัดกลุ่มใน ML +- เทคนิคการประมวลผลภาษาธรรมชาติใน ML +- เทคนิคการพยากรณ์อนุกรมเวลาใน ML +- การเรียนรู้แบบเสริมกำลัง +- การประยุกต์ใช้ ML ในโลกจริง + +--- +## สิ่งที่เราจะไม่ครอบคลุม + +- deep learning +- neural networks +- AI + +เพื่อให้การเรียนรู้มีประสิทธิภาพมากขึ้น เราจะหลีกเลี่ยงความซับซ้อนของ neural networks, 'deep learning' - การสร้างโมเดลหลายชั้นโดยใช้ neural networks - และ AI ซึ่งเราจะพูดถึงในหลักสูตรอื่น นอกจากนี้เรายังจะนำเสนอหลักสูตรวิทยาศาสตร์ข้อมูลในอนาคตเพื่อมุ่งเน้นด้านนี้ของสาขาที่กว้างขึ้น + +--- +## ทำไมต้องศึกษาการเรียนรู้ของเครื่อง? + +การเรียนรู้ของเครื่องในมุมมองของระบบ ถูกกำหนดให้เป็นการสร้างระบบอัตโนมัติที่สามารถเรียนรู้รูปแบบที่ซ่อนอยู่จากข้อมูลเพื่อช่วยในการตัดสินใจอย่างชาญฉลาด + +แรงบันดาลใจนี้ได้รับแรงบันดาลใจอย่างหลวม ๆ จากวิธีที่สมองมนุษย์เรียนรู้สิ่งต่าง ๆ ตามข้อมูลที่รับรู้จากโลกภายนอก + +✅ ลองคิดสักครู่ว่าทำไมธุรกิจถึงต้องการใช้กลยุทธ์การเรียนรู้ของเครื่องแทนการสร้างระบบที่ใช้กฎที่เขียนโค้ดไว้ล่วงหน้า + +--- +## การประยุกต์ใช้การเรียนรู้ของเครื่อง + +การประยุกต์ใช้การเรียนรู้ของเครื่องมีอยู่แทบทุกที่ และแพร่หลายเหมือนกับข้อมูลที่ไหลเวียนอยู่ในสังคมของเรา ซึ่งเกิดจากสมาร์ทโฟน อุปกรณ์ที่เชื่อมต่อ และระบบอื่น ๆ เมื่อพิจารณาถึงศักยภาพอันมหาศาลของอัลกอริทึมการเรียนรู้ของเครื่องที่ล้ำสมัย นักวิจัยได้สำรวจความสามารถของมันในการแก้ปัญหาชีวิตจริงที่มีหลายมิติและหลายสาขาด้วยผลลัพธ์ที่ดีเยี่ยม + +--- +## ตัวอย่างการใช้ ML + +**คุณสามารถใช้การเรียนรู้ของเครื่องในหลายวิธี**: + +- เพื่อทำนายความเป็นไปได้ของโรคจากประวัติทางการแพทย์หรือรายงานของผู้ป่วย +- เพื่อใช้ข้อมูลสภาพอากาศในการทำนายเหตุการณ์ทางสภาพอากาศ +- เพื่อทำความเข้าใจความรู้สึกของข้อความ +- เพื่อตรวจจับข่าวปลอมเพื่อหยุดการแพร่กระจายของโฆษณาชวนเชื่อ + +การเงิน เศรษฐศาสตร์ วิทยาศาสตร์โลก การสำรวจอวกาศ วิศวกรรมชีวการแพทย์ วิทยาศาสตร์การรับรู้ และแม้แต่สาขามนุษยศาสตร์ได้ปรับใช้การเรียนรู้ของเครื่องเพื่อแก้ปัญหาที่หนักหน่วงและต้องการการประมวลผลข้อมูลในสาขาของพวกเขา + +--- +## สรุป + +การเรียนรู้ของเครื่องทำให้กระบวนการค้นหารูปแบบเป็นไปโดยอัตโนมัติ โดยการค้นหาข้อมูลเชิงลึกที่มีความหมายจากข้อมูลจริงหรือข้อมูลที่สร้างขึ้น มันได้พิสูจน์ตัวเองว่าเป็นสิ่งที่มีคุณค่ามากในธุรกิจ สุขภาพ และการเงิน รวมถึงการประยุกต์ใช้ในด้านอื่น ๆ + +ในอนาคตอันใกล้ การเข้าใจพื้นฐานของการเรียนรู้ของเครื่องจะกลายเป็นสิ่งจำเป็นสำหรับผู้คนในทุกสาขา เนื่องจากการนำไปใช้ที่แพร่หลาย + +--- +# 🚀 ความท้าทาย + +วาดภาพบนกระดาษหรือใช้แอปออนไลน์ เช่น [Excalidraw](https://excalidraw.com/) เพื่อแสดงความเข้าใจของคุณเกี่ยวกับความแตกต่างระหว่าง AI, ML, deep learning และ data science เพิ่มแนวคิดเกี่ยวกับปัญหาที่แต่ละเทคนิคเหล่านี้เหมาะสมในการแก้ไข + +# [แบบทดสอบหลังบทเรียน](https://ff-quizzes.netlify.app/en/ml/) + +--- +# ทบทวนและศึกษาด้วยตนเอง + +เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับวิธีที่คุณสามารถทำงานกับอัลกอริทึม ML ในคลาวด์ ให้ติดตาม [Learning Path](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott) นี้ + +เข้าร่วม [Learning Path](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) เกี่ยวกับพื้นฐานของ ML + +--- +# งานที่ได้รับมอบหมาย + +[เริ่มต้นใช้งาน](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่มีความเชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/1-Introduction/1-intro-to-ML/assignment.md b/translations/th/1-Introduction/1-intro-to-ML/assignment.md new file mode 100644 index 000000000..c6c0f1cbe --- /dev/null +++ b/translations/th/1-Introduction/1-intro-to-ML/assignment.md @@ -0,0 +1,23 @@ + +# เริ่มต้นใช้งาน + +## คำแนะนำ + +ในงานที่ไม่ได้รับการประเมินนี้ คุณควรทบทวน Python และตั้งค่าระบบของคุณให้พร้อมใช้งานและสามารถรันโน้ตบุ๊กได้ + +ลองทำตาม [เส้นทางการเรียนรู้ Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott) และตั้งค่าระบบของคุณโดยดูวิดีโอแนะนำเหล่านี้: + +https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6 + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/1-Introduction/2-history-of-ML/README.md b/translations/th/1-Introduction/2-history-of-ML/README.md new file mode 100644 index 000000000..d8c98d437 --- /dev/null +++ b/translations/th/1-Introduction/2-history-of-ML/README.md @@ -0,0 +1,164 @@ + +# ประวัติศาสตร์ของการเรียนรู้ของเครื่อง + +![สรุปประวัติศาสตร์ของการเรียนรู้ของเครื่องในรูปแบบสเก็ตโน้ต](../../../../sketchnotes/ml-history.png) +> สเก็ตโน้ตโดย [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +--- + +[![ML for beginners - History of Machine Learning](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "ML for beginners - History of Machine Learning") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับบทเรียนนี้ + +ในบทเรียนนี้ เราจะสำรวจเหตุการณ์สำคัญในประวัติศาสตร์ของการเรียนรู้ของเครื่องและปัญญาประดิษฐ์ + +ประวัติศาสตร์ของปัญญาประดิษฐ์ (AI) ในฐานะสาขาวิชามีความเชื่อมโยงกับประวัติศาสตร์ของการเรียนรู้ของเครื่อง เนื่องจากอัลกอริทึมและความก้าวหน้าทางคอมพิวเตอร์ที่เป็นรากฐานของ ML ได้สนับสนุนการพัฒนา AI สิ่งสำคัญคือต้องจำไว้ว่า แม้ว่าสาขาเหล่านี้จะเริ่มเป็นรูปเป็นร่างในช่วงปี 1950 แต่ [การค้นพบทางอัลกอริทึม สถิติ คณิตศาสตร์ คอมพิวเตอร์ และเทคนิคที่สำคัญ](https://wikipedia.org/wiki/Timeline_of_machine_learning) ได้เกิดขึ้นก่อนและทับซ้อนกับยุคนี้ ในความเป็นจริง มนุษย์ได้คิดเกี่ยวกับคำถามเหล่านี้มานาน [หลายร้อยปี](https://wikipedia.org/wiki/History_of_artificial_intelligence): บทความนี้กล่าวถึงรากฐานทางปัญญาในประวัติศาสตร์ของแนวคิดเกี่ยวกับ 'เครื่องจักรที่คิดได้' + +--- +## การค้นพบที่สำคัญ + +- 1763, 1812 [ทฤษฎีของเบย์](https://wikipedia.org/wiki/Bayes%27_theorem) และแนวคิดก่อนหน้า ทฤษฎีนี้และการประยุกต์ใช้เป็นพื้นฐานของการอนุมาน โดยอธิบายความน่าจะเป็นของเหตุการณ์ที่เกิดขึ้นโดยอิงจากความรู้ก่อนหน้า +- 1805 [ทฤษฎีการถดถอยกำลังสองน้อยที่สุด](https://wikipedia.org/wiki/Least_squares) โดยนักคณิตศาสตร์ชาวฝรั่งเศส Adrien-Marie Legendre ทฤษฎีนี้ซึ่งคุณจะได้เรียนรู้ในหน่วยการถดถอย ช่วยในการปรับข้อมูลให้เหมาะสม +- 1913 [โซ่ของมาร์คอฟ](https://wikipedia.org/wiki/Markov_chain) ตั้งชื่อตามนักคณิตศาสตร์ชาวรัสเซีย Andrey Markov ใช้เพื่ออธิบายลำดับของเหตุการณ์ที่เป็นไปได้โดยอิงจากสถานะก่อนหน้า +- 1957 [เพอร์เซปตรอน](https://wikipedia.org/wiki/Perceptron) เป็นตัวจำแนกเชิงเส้นชนิดหนึ่งที่คิดค้นโดยนักจิตวิทยาชาวอเมริกัน Frank Rosenblatt ซึ่งเป็นพื้นฐานของความก้าวหน้าใน Deep Learning + +--- + +- 1967 [อัลกอริทึมเพื่อนบ้านที่ใกล้ที่สุด](https://wikipedia.org/wiki/Nearest_neighbor) เดิมออกแบบมาเพื่อวางแผนเส้นทาง ในบริบทของ ML ใช้ในการตรวจจับรูปแบบ +- 1970 [Backpropagation](https://wikipedia.org/wiki/Backpropagation) ใช้ในการฝึก [โครงข่ายประสาทเทียมแบบฟีดฟอร์เวิร์ด](https://wikipedia.org/wiki/Feedforward_neural_network) +- 1982 [โครงข่ายประสาทเทียมแบบวนซ้ำ](https://wikipedia.org/wiki/Recurrent_neural_network) เป็นโครงข่ายประสาทเทียมที่พัฒนามาจากโครงข่ายแบบฟีดฟอร์เวิร์ดที่สร้างกราฟเชิงเวลา + +✅ ลองค้นคว้าเพิ่มเติม มีวันที่อื่นใดที่โดดเด่นในประวัติศาสตร์ของ ML และ AI หรือไม่? + +--- +## 1950: เครื่องจักรที่คิดได้ + +Alan Turing บุคคลที่น่าทึ่งซึ่งได้รับการโหวต [จากสาธารณชนในปี 2019](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) ให้เป็นนักวิทยาศาสตร์ที่ยิ่งใหญ่ที่สุดแห่งศตวรรษที่ 20 ได้รับเครดิตว่าเป็นผู้วางรากฐานสำหรับแนวคิดของ 'เครื่องจักรที่สามารถคิดได้' เขาเผชิญหน้ากับผู้ที่ไม่เห็นด้วยและความต้องการหลักฐานเชิงประจักษ์ของเขาเองเกี่ยวกับแนวคิดนี้ โดยการสร้าง [การทดสอบของทัวริง](https://www.bbc.com/news/technology-18475646) ซึ่งคุณจะได้สำรวจในบทเรียน NLP ของเรา + +--- +## 1956: โครงการวิจัยฤดูร้อนที่ดาร์ตมัธ + +"โครงการวิจัยฤดูร้อนที่ดาร์ตมัธเกี่ยวกับปัญญาประดิษฐ์เป็นเหตุการณ์สำคัญสำหรับปัญญาประดิษฐ์ในฐานะสาขาวิชา" และที่นี่เองที่คำว่า 'ปัญญาประดิษฐ์' ถูกบัญญัติขึ้น ([แหล่งที่มา](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)) + +> ทุกแง่มุมของการเรียนรู้หรือคุณลักษณะอื่นใดของปัญญาสามารถอธิบายได้อย่างแม่นยำจนเครื่องจักรสามารถจำลองมันได้ + +--- + +นักวิจัยหลัก ศาสตราจารย์คณิตศาสตร์ John McCarthy หวังว่า "จะดำเนินการบนพื้นฐานของสมมติฐานที่ว่าทุกแง่มุมของการเรียนรู้หรือคุณลักษณะอื่นใดของปัญญาสามารถอธิบายได้อย่างแม่นยำจนเครื่องจักรสามารถจำลองมันได้" ผู้เข้าร่วมรวมถึงบุคคลสำคัญอีกคนในสาขานี้ Marvin Minsky + +การประชุมเชิงปฏิบัติการนี้ได้รับเครดิตว่าได้เริ่มต้นและสนับสนุนการอภิปรายหลายประเด็น รวมถึง "การเพิ่มขึ้นของวิธีการเชิงสัญลักษณ์ ระบบที่มุ่งเน้นไปที่โดเมนที่จำกัด (ระบบผู้เชี่ยวชาญยุคแรก) และระบบนิรนัยเทียบกับระบบอุปนัย" ([แหล่งที่มา](https://wikipedia.org/wiki/Dartmouth_workshop)) + +--- +## 1956 - 1974: "ยุคทอง" + +ตั้งแต่ปี 1950 ถึงกลางปี 1970 ความหวังสูงว่าปัญญาประดิษฐ์จะสามารถแก้ปัญหาต่าง ๆ ได้ ในปี 1967 Marvin Minsky กล่าวอย่างมั่นใจว่า "ภายในหนึ่งชั่วอายุคน ... ปัญหาของการสร้าง 'ปัญญาประดิษฐ์' จะได้รับการแก้ไขอย่างมีนัยสำคัญ" (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall) + +การวิจัยเกี่ยวกับการประมวลผลภาษาธรรมชาติเติบโตขึ้น การค้นหาถูกปรับปรุงให้ทรงพลังยิ่งขึ้น และแนวคิดของ 'โลกจุลภาค' ถูกสร้างขึ้น ซึ่งงานง่าย ๆ ถูกทำให้สำเร็จโดยใช้คำสั่งภาษาธรรมดา + +--- + +การวิจัยได้รับการสนับสนุนอย่างดีจากหน่วยงานรัฐบาล มีความก้าวหน้าในด้านการคำนวณและอัลกอริทึม และมีการสร้างต้นแบบของเครื่องจักรอัจฉริยะ เครื่องจักรบางส่วนเหล่านี้รวมถึง: + +* [Shakey the robot](https://wikipedia.org/wiki/Shakey_the_robot) ซึ่งสามารถเคลื่อนที่และตัดสินใจว่าจะทำงานอย่าง 'ชาญฉลาด' ได้ + + ![Shakey, an intelligent robot](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg) + > Shakey ในปี 1972 + +--- + +* Eliza บอทสนทนาในยุคแรก ๆ สามารถพูดคุยกับผู้คนและทำหน้าที่เป็น 'นักบำบัด' แบบพื้นฐาน คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับ Eliza ในบทเรียน NLP + + ![Eliza, a bot](../../../../1-Introduction/2-history-of-ML/images/eliza.png) + > เวอร์ชันหนึ่งของ Eliza, บอทสนทนา + +--- + +* "Blocks world" เป็นตัวอย่างของโลกจุลภาคที่บล็อกสามารถซ้อนและจัดเรียงได้ และการทดลองในการสอนเครื่องจักรให้ตัดสินใจสามารถทดสอบได้ ความก้าวหน้าที่สร้างขึ้นด้วยไลบรารี เช่น [SHRDLU](https://wikipedia.org/wiki/SHRDLU) ช่วยผลักดันการประมวลผลภาษาก้าวไปข้างหน้า + + [![blocks world with SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "blocks world with SHRDLU") + + > 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: Blocks world with SHRDLU + +--- +## 1974 - 1980: "ฤดูหนาวของ AI" + +ในช่วงกลางปี 1970 ได้ปรากฏชัดว่าความซับซ้อนของการสร้าง 'เครื่องจักรอัจฉริยะ' ถูกประเมินต่ำเกินไป และคำมั่นสัญญาของมันเมื่อเทียบกับพลังการคำนวณที่มีอยู่ถูกพูดเกินจริง การสนับสนุนทางการเงินลดลงและความมั่นใจในสาขานี้ชะลอตัว ปัญหาบางประการที่ส่งผลต่อความมั่นใจ ได้แก่: +--- +- **ข้อจำกัด** พลังการคำนวณมีจำกัดเกินไป +- **การระเบิดเชิงผสมผสาน** จำนวนพารามิเตอร์ที่ต้องฝึกเพิ่มขึ้นแบบทวีคูณเมื่อมีการร้องขอให้คอมพิวเตอร์ทำงานมากขึ้น โดยไม่มีการพัฒนาคู่ขนานของพลังและความสามารถในการคำนวณ +- **การขาดแคลนข้อมูล** การขาดแคลนข้อมูลขัดขวางกระบวนการทดสอบ พัฒนา และปรับปรุงอัลกอริทึม +- **เรากำลังถามคำถามที่ถูกต้องหรือไม่?** คำถามที่ถูกถามเริ่มถูกตั้งคำถาม นักวิจัยเริ่มเผชิญกับคำวิจารณ์เกี่ยวกับแนวทางของพวกเขา: + - การทดสอบของทัวริงถูกตั้งคำถามผ่านแนวคิดต่าง ๆ เช่น 'ทฤษฎีห้องจีน' ซึ่งเสนอว่า "การเขียนโปรแกรมคอมพิวเตอร์ดิจิทัลอาจทำให้ดูเหมือนเข้าใจภาษา แต่ไม่สามารถสร้างความเข้าใจที่แท้จริงได้" ([แหล่งที่มา](https://plato.stanford.edu/entries/chinese-room/)) + - จริยธรรมของการแนะนำปัญญาประดิษฐ์ เช่น "นักบำบัด" ELIZA เข้าสู่สังคมถูกท้าทาย + +--- + +ในเวลาเดียวกัน โรงเรียนความคิดเกี่ยวกับ AI ต่าง ๆ เริ่มก่อตัวขึ้น ความแตกต่างระหว่างแนวทาง ["scruffy" กับ "neat AI"](https://wikipedia.org/wiki/Neats_and_scruffies) ถูกกำหนดขึ้น ห้องปฏิบัติการ _scruffy_ ปรับแต่งโปรแกรมจนกว่าจะได้ผลลัพธ์ที่ต้องการ ในขณะที่ห้องปฏิบัติการ _neat_ "มุ่งเน้นไปที่ตรรกะและการแก้ปัญหาอย่างเป็นทางการ" ระบบ ELIZA และ SHRDLU เป็นที่รู้จักในฐานะระบบ _scruffy_ ในช่วงปี 1980 เมื่อความต้องการที่จะทำให้ระบบ ML สามารถทำซ้ำได้เพิ่มขึ้น แนวทาง _neat_ ค่อย ๆ ก้าวขึ้นมาเป็นแนวหน้าเนื่องจากผลลัพธ์ของมันสามารถอธิบายได้มากกว่า + +--- +## ระบบผู้เชี่ยวชาญในยุค 1980 + +เมื่อสาขานี้เติบโตขึ้น ประโยชน์ต่อธุรกิจก็ชัดเจนขึ้น และในยุค 1980 ระบบ 'ผู้เชี่ยวชาญ' ก็เริ่มแพร่หลาย "ระบบผู้เชี่ยวชาญเป็นหนึ่งในรูปแบบซอฟต์แวร์ปัญญาประดิษฐ์ (AI) ที่ประสบความสำเร็จอย่างแท้จริงในยุคแรก ๆ" ([แหล่งที่มา](https://wikipedia.org/wiki/Expert_system)) + +ระบบประเภทนี้เป็นระบบ _ไฮบริด_ ซึ่งประกอบด้วยเครื่องมือกฎที่กำหนดข้อกำหนดทางธุรกิจ และเครื่องมืออนุมานที่ใช้ระบบกฎเพื่อสรุปข้อเท็จจริงใหม่ + +ยุคนี้ยังเห็นความสนใจที่เพิ่มขึ้นในโครงข่ายประสาทเทียม + +--- +## 1987 - 1993: AI 'Chill' + +การแพร่หลายของฮาร์ดแวร์ระบบผู้เชี่ยวชาญเฉพาะทางมีผลกระทบที่โชคร้ายคือการกลายเป็นเฉพาะทางเกินไป การเพิ่มขึ้นของคอมพิวเตอร์ส่วนบุคคลยังแข่งขันกับระบบขนาดใหญ่ที่มีความเชี่ยวชาญและรวมศูนย์เหล่านี้ การทำให้การคำนวณเป็นประชาธิปไตยได้เริ่มต้นขึ้น และในที่สุดก็ปูทางไปสู่การระเบิดของข้อมูลขนาดใหญ่ในยุคปัจจุบัน + +--- +## 1993 - 2011 + +ยุคนี้เป็นยุคใหม่สำหรับ ML และ AI ในการแก้ปัญหาบางประการที่เกิดขึ้นก่อนหน้านี้จากการขาดข้อมูลและพลังการคำนวณ ปริมาณข้อมูลเริ่มเพิ่มขึ้นอย่างรวดเร็วและเข้าถึงได้มากขึ้น ทั้งในด้านดีและด้านเสีย โดยเฉพาะอย่างยิ่งกับการมาของสมาร์ทโฟนในปี 2007 พลังการคำนวณขยายตัวอย่างทวีคูณ และอัลกอริทึมก็พัฒนาควบคู่กันไป สาขานี้เริ่มมีความเป็นผู้ใหญ่มากขึ้นเมื่อวันเวลาแห่งการทดลองในอดีตเริ่มตกผลึกเป็นวินัยที่แท้จริง + +--- +## ปัจจุบัน + +ทุกวันนี้ การเรียนรู้ของเครื่องและ AI มีบทบาทในเกือบทุกส่วนของชีวิตเรา ยุคนี้เรียกร้องให้มีความเข้าใจอย่างรอบคอบเกี่ยวกับความเสี่ยงและผลกระทบที่อาจเกิดขึ้นจากอัลกอริทึมเหล่านี้ต่อชีวิตมนุษย์ Brad Smith จาก Microsoft ได้กล่าวไว้ว่า "เทคโนโลยีสารสนเทศสร้างประเด็นที่เกี่ยวข้องกับการคุ้มครองสิทธิมนุษยชนขั้นพื้นฐาน เช่น ความเป็นส่วนตัวและเสรีภาพในการแสดงออก ประเด็นเหล่านี้เพิ่มความรับผิดชอบให้กับบริษัทเทคโนโลยีที่สร้างผลิตภัณฑ์เหล่านี้ ในมุมมองของเรา พวกเขายังเรียกร้องให้มีการกำกับดูแลของรัฐบาลที่รอบคอบและการพัฒนาบรรทัดฐานเกี่ยวกับการใช้งานที่ยอมรับได้" ([แหล่งที่มา](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)) + +--- + +ยังคงต้องรอดูว่าอนาคตจะเป็นอย่างไร แต่สิ่งสำคัญคือต้องเข้าใจระบบคอมพิวเตอร์เหล่านี้ รวมถึงซอฟต์แวร์และอัลกอริทึมที่พวกมันใช้งาน เราหวังว่าหลักสูตรนี้จะช่วยให้คุณเข้าใจได้ดีขึ้น เพื่อที่คุณจะได้ตัดสินใจด้วยตัวเอง + +[![The history of deep learning](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "The history of deep learning") +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: Yann LeCun กล่าวถึงประวัติศาสตร์ของ Deep Learning ในการบรรยายนี้ + +--- +## 🚀ความท้าทาย + +เจาะลึกหนึ่งในช่วงเวลาประวัติศาสตร์เหล่านี้และเรียนรู้เพิ่มเติมเกี่ยวกับบุคคลที่อยู่เบื้องหลัง มีตัวละครที่น่าสนใจ และไม่มีการค้นพบทางวิทยาศาสตร์ใดที่เกิดขึ้นในสุญญากาศทางวัฒนธรรม คุณค้นพบอะไรบ้าง? + +## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) + +--- +## ทบทวนและศึกษาด้วยตนเอง + +นี่คือรายการที่ควรดูและฟัง: + +[พอดแคสต์นี้ที่ Amy Boyd กล่าวถึงวิวัฒนาการของ AI](http://runasradio.com/Shows/Show/739) + +[![The history of AI by Amy Boyd](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "The history of AI by Amy Boyd") + +--- + +## การบ้าน + +[สร้างไทม์ไลน์](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/1-Introduction/2-history-of-ML/assignment.md b/translations/th/1-Introduction/2-history-of-ML/assignment.md new file mode 100644 index 000000000..0ff29f4bd --- /dev/null +++ b/translations/th/1-Introduction/2-history-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# สร้างไทม์ไลน์ + +## คำแนะนำ + +ใช้ [repo นี้](https://github.com/Digital-Humanities-Toolkit/timeline-builder) เพื่อสร้างไทม์ไลน์เกี่ยวกับประวัติศาสตร์ของอัลกอริทึม คณิตศาสตร์ สถิติ AI หรือ ML หรือการผสมผสานของหัวข้อเหล่านี้ คุณสามารถเลือกเน้นที่บุคคลหนึ่ง ความคิดหนึ่ง หรือช่วงเวลายาวนานของการพัฒนาแนวคิด อย่าลืมเพิ่มองค์ประกอบมัลติมีเดียเข้าไปด้วย + +## รูบริก + +| เกณฑ์ | ยอดเยี่ยม | พอใช้ | ต้องปรับปรุง | +| ------ | ------------------------------------------------- | ------------------------------------- | ----------------------------------------------------------- | +| | ไทม์ไลน์ที่ถูกพัฒนาถูกนำเสนอเป็นหน้า GitHub | โค้ดไม่สมบูรณ์และยังไม่ได้เผยแพร่ | ไทม์ไลน์ไม่สมบูรณ์ ไม่มีการค้นคว้าอย่างดี และยังไม่ได้เผยแพร่ | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/1-Introduction/3-fairness/README.md b/translations/th/1-Introduction/3-fairness/README.md new file mode 100644 index 000000000..42d7690e6 --- /dev/null +++ b/translations/th/1-Introduction/3-fairness/README.md @@ -0,0 +1,149 @@ + +# การสร้างโซลูชัน Machine Learning ด้วย AI ที่มีความรับผิดชอบ + +![ภาพสรุปเกี่ยวกับ AI ที่มีความรับผิดชอบใน Machine Learning](../../../../sketchnotes/ml-fairness.png) +> ภาพวาดโดย [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## บทนำ + +ในหลักสูตรนี้ คุณจะเริ่มค้นพบว่า Machine Learning มีผลกระทบต่อชีวิตประจำวันของเราอย่างไร แม้ในปัจจุบัน ระบบและโมเดลต่าง ๆ มีบทบาทในงานตัดสินใจประจำวัน เช่น การวินิจฉัยทางการแพทย์ การอนุมัติสินเชื่อ หรือการตรวจจับการฉ้อโกง ดังนั้นจึงเป็นสิ่งสำคัญที่โมเดลเหล่านี้จะต้องทำงานได้ดีเพื่อให้ผลลัพธ์ที่น่าเชื่อถือ เช่นเดียวกับแอปพลิเคชันซอฟต์แวร์ใด ๆ ระบบ AI อาจไม่เป็นไปตามความคาดหวังหรือมีผลลัพธ์ที่ไม่พึงประสงค์ นั่นคือเหตุผลที่เราต้องสามารถเข้าใจและอธิบายพฤติกรรมของโมเดล AI ได้ + +ลองจินตนาการถึงสิ่งที่อาจเกิดขึ้นเมื่อข้อมูลที่คุณใช้สร้างโมเดลเหล่านี้ขาดแคลนกลุ่มประชากรบางกลุ่ม เช่น เชื้อชาติ เพศ มุมมองทางการเมือง ศาสนา หรือมีการแสดงกลุ่มประชากรเหล่านี้อย่างไม่สมดุล หรือเมื่อผลลัพธ์ของโมเดลถูกตีความว่าให้ความสำคัญกับกลุ่มประชากรบางกลุ่ม ผลกระทบต่อแอปพลิเคชันจะเป็นอย่างไร? นอกจากนี้ หากโมเดลมีผลลัพธ์ที่เป็นอันตรายต่อผู้คน ใครจะเป็นผู้รับผิดชอบต่อพฤติกรรมของระบบ AI? นี่คือคำถามบางส่วนที่เราจะสำรวจในหลักสูตรนี้ + +ในบทเรียนนี้ คุณจะ: + +- ตระหนักถึงความสำคัญของความเป็นธรรมใน Machine Learning และผลกระทบที่เกี่ยวข้องกับความไม่เป็นธรรม +- เรียนรู้การสำรวจค่าผิดปกติและสถานการณ์ที่ไม่ปกติเพื่อให้มั่นใจในความน่าเชื่อถือและความปลอดภัย +- เข้าใจถึงความจำเป็นในการออกแบบระบบที่ครอบคลุมเพื่อให้ทุกคนมีส่วนร่วม +- สำรวจความสำคัญของการปกป้องความเป็นส่วนตัวและความปลอดภัยของข้อมูลและผู้คน +- เห็นความสำคัญของการมีแนวทางแบบ "กล่องแก้ว" เพื่ออธิบายพฤติกรรมของโมเดล AI +- ตระหนักถึงความสำคัญของความรับผิดชอบในการสร้างความไว้วางใจในระบบ AI + +## ความรู้พื้นฐานที่จำเป็น + +ก่อนเริ่มต้นบทเรียนนี้ โปรดเรียนรู้เกี่ยวกับ "หลักการ AI ที่มีความรับผิดชอบ" และดูวิดีโอด้านล่างในหัวข้อที่เกี่ยวข้อง: + +เรียนรู้เพิ่มเติมเกี่ยวกับ AI ที่มีความรับผิดชอบได้ที่ [Learning Path](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) + +[![Microsoft's Approach to Responsible AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoft's Approach to Responsible AI") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: Microsoft's Approach to Responsible AI + +## ความเป็นธรรม + +ระบบ AI ควรปฏิบัติต่อทุกคนอย่างเป็นธรรมและหลีกเลี่ยงการส่งผลกระทบต่อกลุ่มคนที่คล้ายกันในรูปแบบที่แตกต่างกัน ตัวอย่างเช่น เมื่อระบบ AI ให้คำแนะนำเกี่ยวกับการรักษาทางการแพทย์ การสมัครสินเชื่อ หรือการจ้างงาน ระบบควรให้คำแนะนำเดียวกันแก่ทุกคนที่มีอาการคล้ายกัน สถานการณ์ทางการเงิน หรือคุณสมบัติทางวิชาชีพที่คล้ายกัน มนุษย์ทุกคนมีอคติที่สืบทอดมาซึ่งส่งผลต่อการตัดสินใจและการกระทำของเรา อคติเหล่านี้อาจปรากฏในข้อมูลที่เราใช้ฝึกระบบ AI ซึ่งบางครั้งอาจเกิดขึ้นโดยไม่ตั้งใจ และมักเป็นเรื่องยากที่จะรู้ตัวเมื่อคุณกำลังนำอคติเข้าสู่ข้อมูล + +**“ความไม่เป็นธรรม”** หมายถึงผลกระทบเชิงลบ หรือ “อันตราย” ต่อกลุ่มคน เช่น กลุ่มที่กำหนดโดยเชื้อชาติ เพศ อายุ หรือสถานะความพิการ ผลกระทบที่เกี่ยวข้องกับความไม่เป็นธรรมสามารถแบ่งออกเป็น: + +- **การจัดสรร** เช่น การให้ความสำคัญกับเพศหรือเชื้อชาติหนึ่งมากกว่าอีกกลุ่มหนึ่ง +- **คุณภาพของบริการ** หากคุณฝึกข้อมูลสำหรับสถานการณ์เฉพาะ แต่ความเป็นจริงมีความซับซ้อนมากกว่า จะนำไปสู่บริการที่มีประสิทธิภาพต่ำ ตัวอย่างเช่น เครื่องจ่ายสบู่ที่ไม่สามารถตรวจจับคนที่มีผิวสีเข้มได้ [อ้างอิง](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773) +- **การวิจารณ์เชิงลบ** เช่น การวิจารณ์หรือการติดป้ายกำกับอย่างไม่เป็นธรรม ตัวอย่างเช่น เทคโนโลยีการติดป้ายภาพเคยติดป้ายภาพของคนผิวสีว่าเป็นกอริลลา +- **การแสดงผลมากเกินไปหรือน้อยเกินไป** เช่น การที่กลุ่มหนึ่งไม่ปรากฏในอาชีพบางประเภท และบริการหรือฟังก์ชันใด ๆ ที่ส่งเสริมสิ่งนั้นถือเป็นการสร้างอันตราย +- **การเหมารวม** เช่น การเชื่อมโยงกลุ่มหนึ่งกับคุณลักษณะที่กำหนดไว้ล่วงหน้า ตัวอย่างเช่น ระบบแปลภาษาระหว่างภาษาอังกฤษและตุรกีอาจมีความไม่ถูกต้องเนื่องจากคำที่มีการเชื่อมโยงกับเพศในเชิงเหมารวม + +![การแปลเป็นภาษาตุรกี](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png) +> การแปลเป็นภาษาตุรกี + +![การแปลกลับเป็นภาษาอังกฤษ](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png) +> การแปลกลับเป็นภาษาอังกฤษ + +เมื่อออกแบบและทดสอบระบบ AI เราต้องมั่นใจว่า AI มีความเป็นธรรมและไม่ได้ถูกตั้งโปรแกรมให้ตัดสินใจที่มีอคติหรือเลือกปฏิบัติ ซึ่งมนุษย์เองก็ถูกห้ามไม่ให้ทำ การรับประกันความเป็นธรรมใน AI และ Machine Learning ยังคงเป็นความท้าทายที่ซับซ้อนทั้งในด้านสังคมและเทคนิค + +### ความน่าเชื่อถือและความปลอดภัย + +เพื่อสร้างความไว้วางใจ ระบบ AI จำเป็นต้องมีความน่าเชื่อถือ ปลอดภัย และสม่ำเสมอภายใต้เงื่อนไขปกติและไม่ปกติ สิ่งสำคัญคือต้องรู้ว่าระบบ AI จะมีพฤติกรรมอย่างไรในสถานการณ์ต่าง ๆ โดยเฉพาะเมื่อเป็นค่าผิดปกติ เมื่อสร้างโซลูชัน AI จำเป็นต้องให้ความสำคัญอย่างมากกับการจัดการสถานการณ์ที่หลากหลายที่ระบบ AI อาจเผชิญ ตัวอย่างเช่น รถยนต์ที่ขับเคลื่อนด้วยตัวเองต้องให้ความสำคัญกับความปลอดภัยของผู้คนเป็นอันดับแรก ดังนั้น AI ที่ขับเคลื่อนรถยนต์ต้องพิจารณาสถานการณ์ที่เป็นไปได้ทั้งหมดที่รถอาจพบ เช่น กลางคืน พายุฝนฟ้าคะนอง หรือพายุหิมะ เด็กวิ่งข้ามถนน สัตว์เลี้ยง การก่อสร้างถนน เป็นต้น ความสามารถของระบบ AI ในการจัดการเงื่อนไขที่หลากหลายอย่างน่าเชื่อถือและปลอดภัยสะท้อนถึงระดับการคาดการณ์ที่นักวิทยาศาสตร์ข้อมูลหรือผู้พัฒนา AI พิจารณาในระหว่างการออกแบบหรือทดสอบระบบ + +> [🎥 คลิกที่นี่เพื่อดูวิดีโอ: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl) + +### การมีส่วนร่วม + +ระบบ AI ควรได้รับการออกแบบเพื่อให้ทุกคนมีส่วนร่วมและได้รับการสนับสนุน เมื่อออกแบบและใช้งานระบบ AI นักวิทยาศาสตร์ข้อมูลและผู้พัฒนา AI จะต้องระบุและแก้ไขอุปสรรคที่อาจทำให้ผู้คนถูกกีดกันโดยไม่ตั้งใจ ตัวอย่างเช่น มีผู้คน 1 พันล้านคนทั่วโลกที่มีความพิการ ด้วยความก้าวหน้าของ AI พวกเขาสามารถเข้าถึงข้อมูลและโอกาสได้ง่ายขึ้นในชีวิตประจำวัน การแก้ไขอุปสรรคเหล่านี้ช่วยสร้างโอกาสในการสร้างนวัตกรรมและพัฒนาผลิตภัณฑ์ AI ที่มีประสบการณ์ที่ดีขึ้นซึ่งเป็นประโยชน์ต่อทุกคน + +> [🎥 คลิกที่นี่เพื่อดูวิดีโอ: การมีส่วนร่วมใน AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v) + +### ความปลอดภัยและความเป็นส่วนตัว + +ระบบ AI ควรมีความปลอดภัยและเคารพความเป็นส่วนตัวของผู้คน ผู้คนมีความไว้วางใจน้อยลงในระบบที่ทำให้ความเป็นส่วนตัว ข้อมูล หรือชีวิตของพวกเขาตกอยู่ในความเสี่ยง เมื่อฝึกโมเดล Machine Learning เราอาศัยข้อมูลเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด ในการทำเช่นนั้น แหล่งที่มาของข้อมูลและความสมบูรณ์ของข้อมูลต้องได้รับการพิจารณา ตัวอย่างเช่น ข้อมูลนั้นถูกส่งโดยผู้ใช้หรือเป็นข้อมูลสาธารณะ? นอกจากนี้ ในขณะที่ทำงานกับข้อมูล จำเป็นต้องพัฒนาระบบ AI ที่สามารถปกป้องข้อมูลที่เป็นความลับและต้านทานการโจมตีได้ เมื่อ AI มีบทบาทมากขึ้น การปกป้องความเป็นส่วนตัวและการรักษาความปลอดภัยของข้อมูลส่วนบุคคลและข้อมูลธุรกิจที่สำคัญจึงมีความสำคัญและซับซ้อนมากขึ้น ปัญหาความเป็นส่วนตัวและความปลอดภัยของข้อมูลต้องได้รับการดูแลเป็นพิเศษสำหรับ AI เนื่องจากการเข้าถึงข้อมูลเป็นสิ่งสำคัญสำหรับระบบ AI ในการคาดการณ์และตัดสินใจเกี่ยวกับผู้คนอย่างแม่นยำและมีข้อมูลครบถ้วน + +> [🎥 คลิกที่นี่เพื่อดูวิดีโอ: ความปลอดภัยใน AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- ในอุตสาหกรรม เราได้มีความก้าวหน้าอย่างมากในด้านความเป็นส่วนตัวและความปลอดภัย ซึ่งได้รับแรงผลักดันอย่างมากจากกฎระเบียบ เช่น GDPR (General Data Protection Regulation) +- อย่างไรก็ตาม สำหรับระบบ AI เราต้องยอมรับความตึงเครียดระหว่างความต้องการข้อมูลส่วนบุคคลเพิ่มเติมเพื่อทำให้ระบบมีความเป็นส่วนตัวและมีประสิทธิภาพมากขึ้น กับความเป็นส่วนตัว +- เช่นเดียวกับการเกิดขึ้นของคอมพิวเตอร์ที่เชื่อมต่อกับอินเทอร์เน็ต เรากำลังเห็นการเพิ่มขึ้นอย่างมากในจำนวนปัญหาด้านความปลอดภัยที่เกี่ยวข้องกับ AI +- ในขณะเดียวกัน เราได้เห็น AI ถูกนำมาใช้เพื่อปรับปรุงความปลอดภัย ตัวอย่างเช่น โปรแกรมสแกนไวรัสสมัยใหม่ส่วนใหญ่ขับเคลื่อนโดย AI heuristics +- เราต้องมั่นใจว่ากระบวนการ Data Science ของเราผสมผสานอย่างกลมกลืนกับแนวปฏิบัติด้านความเป็นส่วนตัวและความปลอดภัยล่าสุด + +### ความโปร่งใส + +ระบบ AI ควรสามารถเข้าใจได้ ส่วนสำคัญของความโปร่งใสคือการอธิบายพฤติกรรมของระบบ AI และส่วนประกอบของมัน การปรับปรุงความเข้าใจในระบบ AI ต้องการให้ผู้มีส่วนได้ส่วนเสียเข้าใจว่าระบบทำงานอย่างไรและทำไม เพื่อให้สามารถระบุปัญหาด้านประสิทธิภาพ ความปลอดภัยและความเป็นส่วนตัว อคติ การปฏิบัติที่กีดกัน หรือผลลัพธ์ที่ไม่ตั้งใจได้ นอกจากนี้ เราเชื่อว่าผู้ที่ใช้ระบบ AI ควรมีความซื่อสัตย์และเปิดเผยเกี่ยวกับเวลา เหตุผล และวิธีที่พวกเขาเลือกใช้ระบบ AI รวมถึงข้อจำกัดของระบบที่พวกเขาใช้ ตัวอย่างเช่น หากธนาคารใช้ระบบ AI เพื่อสนับสนุนการตัดสินใจให้สินเชื่อแก่ผู้บริโภค สิ่งสำคัญคือต้องตรวจสอบผลลัพธ์และเข้าใจว่าข้อมูลใดมีอิทธิพลต่อคำแนะนำของระบบ รัฐบาลเริ่มควบคุม AI ในอุตสาหกรรมต่าง ๆ ดังนั้นนักวิทยาศาสตร์ข้อมูลและองค์กรต้องอธิบายว่าระบบ AI ตรงตามข้อกำหนดด้านกฎระเบียบหรือไม่ โดยเฉพาะเมื่อมีผลลัพธ์ที่ไม่พึงประสงค์ + +> [🎥 คลิกที่นี่เพื่อดูวิดีโอ: ความโปร่งใสใน AI](https://www.microsoft.com/videoplayer/embed/RE4voJF) + +- เนื่องจากระบบ AI มีความซับซ้อนมาก จึงยากที่จะเข้าใจว่าระบบทำงานอย่างไรและตีความผลลัพธ์ +- ความไม่เข้าใจนี้ส่งผลต่อวิธีการจัดการ การดำเนินงาน และการบันทึกของระบบเหล่านี้ +- ความไม่เข้าใจนี้ส่งผลสำคัญต่อการตัดสินใจที่ใช้ผลลัพธ์ที่ระบบเหล่านี้สร้างขึ้น + +### ความรับผิดชอบ + +ผู้ที่ออกแบบและใช้งานระบบ AI ต้องรับผิดชอบต่อการทำงานของระบบ ความจำเป็นในการรับผิดชอบมีความสำคัญอย่างยิ่งในเทคโนโลยีที่มีการใช้งานที่ละเอียดอ่อน เช่น การจดจำใบหน้า เมื่อเร็ว ๆ นี้ มีความต้องการเพิ่มขึ้นสำหรับเทคโนโลยีการจดจำใบหน้า โดยเฉพาะจากองค์กรบังคับใช้กฎหมายที่เห็นศักยภาพของเทคโนโลยีในการใช้งาน เช่น การค้นหาเด็กที่หายไป อย่างไรก็ตาม เทคโนโลยีเหล่านี้อาจถูกใช้โดยรัฐบาลเพื่อทำให้เสรีภาพพื้นฐานของพลเมืองตกอยู่ในความเสี่ยง เช่น การเฝ้าระวังบุคคลเฉพาะอย่างต่อเนื่อง ดังนั้นนักวิทยาศาสตร์ข้อมูลและองค์กรต้องรับผิดชอบต่อผลกระทบของระบบ AI ที่มีต่อบุคคลหรือสังคม + +[![นักวิจัย AI ชั้นนำเตือนเกี่ยวกับการเฝ้าระวังมวลชนผ่านการจดจำใบหน้า](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoft's Approach to Responsible AI") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: การเตือนเกี่ยวกับการเฝ้าระวังมวลชนผ่านการจดจำใบหน้า + +ในท้ายที่สุด หนึ่งในคำถามที่ใหญ่ที่สุดสำหรับคนรุ่นเรา ในฐานะคนรุ่นแรกที่นำ AI เข้าสู่สังคม คือวิธีการทำให้คอมพิวเตอร์ยังคงมีความรับผิดชอบต่อผู้คน และวิธีการทำให้ผู้ที่ออกแบบคอมพิวเตอร์มีความรับผิดชอบต่อทุกคน + +## การประเมินผลกระทบ + +ก่อนการฝึกโมเดล Machine Learning สิ่งสำคัญคือต้องทำการประเมินผลกระทบเพื่อทำความเข้าใจวัตถุประสงค์ของระบบ AI การใช้งานที่ตั้งใจไว้ สถานที่ที่จะนำไปใช้ และผู้ที่จะมีปฏิสัมพันธ์กับระบบ สิ่งเหล่านี้มีประโยชน์สำหรับผู้ตรวจสอบหรือผู้ทดสอบในการประเมินระบบเพื่อทราบว่าปัจจัยใดที่ควรพิจารณาเมื่อระบุความเสี่ยงที่อาจเกิดขึ้นและผลกระทบที่คาดหวัง + +พื้นที่ที่ควรให้ความสำคัญเมื่อทำการประเมินผลกระทบ ได้แก่: + +* **ผลกระทบเชิงลบต่อบุคคล** การตระหนักถึงข้อจำกัดหรือข้อกำหนด การใช้งานที่ไม่รองรับ หรือข้อจำกัดที่ทราบซึ่งขัดขวางประสิทธิภาพของระบบเป็นสิ่งสำคัญเพื่อให้มั่นใจว่าระบบจะไม่ถูกใช้งานในลักษณะที่อาจก่อให้เกิดอันตรายต่อบุคคล +* **ข้อกำหนดด้านข้อมูล** การทำความเข้าใจว่าระบบจะใช้ข้อมูลอย่างไรและที่ไหนช่วยให้ผู้ตรวจสอบสามารถสำรวจข้อกำหนดด้านข้อมูลที่คุณต้องคำนึงถึง (เช่น ข้อบังคับ GDPR หรือ HIPPA) นอกจากนี้ ตรวจสอบว่าแหล่งที่มาหรือปริมาณข้อมูลมีความเพียงพอสำหรับการฝึกฝนหรือไม่ +* **สรุปผลกระทบ** รวบรวมรายการอันตรายที่อาจเกิดขึ้นจากการใช้ระบบ ในระหว่างวงจรชีวิต ML ตรวจสอบว่าปัญหาที่ระบุได้รับการแก้ไขหรือบรรเทาหรือไม่ +* **เป้าหมายที่เกี่ยวข้อง** สำหรับหลักการหลักทั้งหกข้อ ประเมินว่าเป้าหมายจากแต่ละหลักการได้รับการตอบสนองหรือไม่ และมีช่องว่างใด ๆ หรือไม่ + +## การดีบักด้วย AI ที่มีความรับผิดชอบ + +เช่นเดียวกับการดีบักแอปพลิเคชันซอฟต์แวร์ การดีบักระบบ AI เป็นกระบวนการที่จำเป็นในการระบุและ +ดูเวิร์กช็อปนี้เพื่อเจาะลึกหัวข้อเพิ่มเติม: + +- การแสวงหา AI ที่รับผิดชอบ: นำหลักการไปสู่การปฏิบัติ โดย Besmira Nushi, Mehrnoosh Sameki และ Amit Sharma + +[![Responsible AI Toolbox: กรอบงานโอเพ่นซอร์สสำหรับการสร้าง AI ที่รับผิดชอบ](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: กรอบงานโอเพ่นซอร์สสำหรับการสร้าง AI ที่รับผิดชอบ") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: RAI Toolbox: กรอบงานโอเพ่นซอร์สสำหรับการสร้าง AI ที่รับผิดชอบ โดย Besmira Nushi, Mehrnoosh Sameki และ Amit Sharma + +นอกจากนี้ อ่านเพิ่มเติม: + +- ศูนย์ทรัพยากร RAI ของ Microsoft: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- กลุ่มวิจัย FATE ของ Microsoft: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +RAI Toolbox: + +- [ที่เก็บ GitHub ของ Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox) + +อ่านเกี่ยวกับเครื่องมือของ Azure Machine Learning เพื่อรับรองความเป็นธรรม: + +- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott) + +## งานที่ได้รับมอบหมาย + +[สำรวจ RAI Toolbox](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/1-Introduction/3-fairness/assignment.md b/translations/th/1-Introduction/3-fairness/assignment.md new file mode 100644 index 000000000..a630bc31d --- /dev/null +++ b/translations/th/1-Introduction/3-fairness/assignment.md @@ -0,0 +1,25 @@ + +# สำรวจเครื่องมือ Responsible AI Toolbox + +## คำแนะนำ + +ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับ Responsible AI Toolbox ซึ่งเป็น "โครงการโอเพ่นซอร์สที่ขับเคลื่อนโดยชุมชน เพื่อช่วยนักวิทยาศาสตร์ข้อมูลวิเคราะห์และปรับปรุงระบบ AI" สำหรับงานนี้ ให้สำรวจหนึ่งใน [notebooks](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) ของ RAI Toolbox และรายงานผลการค้นพบของคุณในรูปแบบเอกสารหรือการนำเสนอ + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| -------- | --------- | -------- | ----------------- | +| | มีการนำเสนอเอกสารหรือสไลด์ที่พูดถึงระบบของ Fairlearn, notebook ที่ถูกใช้งาน และข้อสรุปที่ได้จากการใช้งาน | มีการนำเสนอเอกสารแต่ไม่มีข้อสรุป | ไม่มีการนำเสนอเอกสาร | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/1-Introduction/4-techniques-of-ML/README.md b/translations/th/1-Introduction/4-techniques-of-ML/README.md new file mode 100644 index 000000000..4c8b61bce --- /dev/null +++ b/translations/th/1-Introduction/4-techniques-of-ML/README.md @@ -0,0 +1,132 @@ + +# เทคนิคการเรียนรู้ของเครื่อง + +กระบวนการสร้าง ใช้งาน และดูแลรักษาโมเดลการเรียนรู้ของเครื่องและข้อมูลที่ใช้ เป็นกระบวนการที่แตกต่างจากเวิร์กโฟลว์การพัฒนาหลายประเภท ในบทเรียนนี้ เราจะทำให้กระบวนการนี้เข้าใจง่ายขึ้น และสรุปเทคนิคหลักที่คุณจำเป็นต้องรู้ คุณจะได้: + +- เข้าใจกระบวนการพื้นฐานของการเรียนรู้ของเครื่องในระดับสูง +- สำรวจแนวคิดพื้นฐาน เช่น 'โมเดล', 'การทำนาย', และ 'ข้อมูลการฝึก' + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +[![ML for beginners - Techniques of Machine Learning](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML for beginners - Techniques of Machine Learning") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับบทเรียนนี้ + +## บทนำ + +ในระดับสูง งานสร้างกระบวนการเรียนรู้ของเครื่อง (ML) ประกอบด้วยหลายขั้นตอน: + +1. **กำหนดคำถาม**. กระบวนการ ML ส่วนใหญ่เริ่มต้นด้วยการตั้งคำถามที่ไม่สามารถตอบได้ด้วยโปรแกรมเงื่อนไขง่าย ๆ หรือเครื่องมือที่ใช้กฎ คำถามเหล่านี้มักเกี่ยวข้องกับการทำนายโดยอิงจากชุดข้อมูล +2. **รวบรวมและเตรียมข้อมูล**. เพื่อที่จะตอบคำถามของคุณ คุณต้องมีข้อมูล คุณภาพและบางครั้งปริมาณของข้อมูลจะกำหนดว่าคุณสามารถตอบคำถามเริ่มต้นได้ดีแค่ไหน การแสดงภาพข้อมูลเป็นส่วนสำคัญในขั้นตอนนี้ ขั้นตอนนี้ยังรวมถึงการแบ่งข้อมูลออกเป็นกลุ่มสำหรับการฝึกและการทดสอบเพื่อสร้างโมเดล +3. **เลือกวิธีการฝึก**. ขึ้นอยู่กับคำถามและลักษณะของข้อมูล คุณต้องเลือกวิธีการฝึกโมเดลเพื่อให้สะท้อนข้อมูลได้ดีที่สุดและทำการทำนายที่แม่นยำ +4. **ฝึกโมเดล**. โดยใช้ข้อมูลการฝึก คุณจะใช้อัลกอริทึมต่าง ๆ เพื่อฝึกโมเดลให้รู้จักรูปแบบในข้อมูล โมเดลอาจใช้น้ำหนักภายในที่สามารถปรับเปลี่ยนได้เพื่อให้ความสำคัญกับบางส่วนของข้อมูลมากกว่าส่วนอื่น ๆ เพื่อสร้างโมเดลที่ดีกว่า +5. **ประเมินโมเดล**. คุณใช้ข้อมูลที่ไม่เคยเห็นมาก่อน (ข้อมูลการทดสอบ) จากชุดข้อมูลที่รวบรวมมาเพื่อดูว่าโมเดลทำงานได้ดีแค่ไหน +6. **ปรับแต่งพารามิเตอร์**. จากประสิทธิภาพของโมเดล คุณสามารถทำกระบวนการใหม่โดยใช้พารามิเตอร์หรือตัวแปรที่แตกต่างกันซึ่งควบคุมพฤติกรรมของอัลกอริทึมที่ใช้ฝึกโมเดล +7. **ทำนาย**. ใช้ข้อมูลใหม่เพื่อทดสอบความแม่นยำของโมเดล + +## คำถามที่ควรถาม + +คอมพิวเตอร์มีความสามารถพิเศษในการค้นหารูปแบบที่ซ่อนอยู่ในข้อมูล ความสามารถนี้มีประโยชน์มากสำหรับนักวิจัยที่มีคำถามเกี่ยวกับโดเมนที่ไม่สามารถตอบได้ง่าย ๆ ด้วยการสร้างเครื่องมือที่ใช้กฎเงื่อนไข ตัวอย่างเช่น ในงานด้านประกันภัย นักวิทยาศาสตร์ข้อมูลอาจสร้างกฎที่กำหนดเองเกี่ยวกับอัตราการเสียชีวิตของผู้สูบบุหรี่เทียบกับผู้ไม่สูบบุหรี่ + +เมื่อมีตัวแปรอื่น ๆ เข้ามาในสมการ โมเดล ML อาจมีประสิทธิภาพมากกว่าในการทำนายอัตราการเสียชีวิตในอนาคตโดยอิงจากประวัติสุขภาพที่ผ่านมา ตัวอย่างที่น่าสนใจมากขึ้นอาจเป็นการทำนายสภาพอากาศสำหรับเดือนเมษายนในสถานที่หนึ่งโดยอิงจากข้อมูลที่รวมถึงละติจูด ลองจิจูด การเปลี่ยนแปลงสภาพภูมิอากาศ ความใกล้ชิดกับมหาสมุทร รูปแบบของกระแสลม และอื่น ๆ + +✅ [สไลด์นี้](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) เกี่ยวกับโมเดลสภาพอากาศให้มุมมองทางประวัติศาสตร์เกี่ยวกับการใช้ ML ในการวิเคราะห์สภาพอากาศ + +## งานก่อนการสร้างโมเดล + +ก่อนเริ่มสร้างโมเดลของคุณ มีหลายงานที่คุณต้องทำ เพื่อทดสอบคำถามของคุณและสร้างสมมติฐานโดยอิงจากการทำนายของโมเดล คุณต้องระบุและกำหนดองค์ประกอบหลายอย่าง + +### ข้อมูล + +เพื่อที่จะตอบคำถามของคุณด้วยความมั่นใจ คุณต้องมีข้อมูลที่ดีในปริมาณที่เหมาะสม มีสองสิ่งที่คุณต้องทำในขั้นตอนนี้: + +- **รวบรวมข้อมูล**. โดยคำนึงถึงบทเรียนก่อนหน้านี้เกี่ยวกับความยุติธรรมในการวิเคราะห์ข้อมูล รวบรวมข้อมูลของคุณอย่างระมัดระวัง ระวังแหล่งที่มาของข้อมูลนี้ อคติที่อาจมี และบันทึกที่มาของข้อมูล +- **เตรียมข้อมูล**. มีหลายขั้นตอนในกระบวนการเตรียมข้อมูล คุณอาจต้องรวบรวมข้อมูลและปรับให้เป็นมาตรฐานหากมาจากแหล่งที่หลากหลาย คุณสามารถปรับปรุงคุณภาพและปริมาณของข้อมูลผ่านวิธีการต่าง ๆ เช่น การแปลงข้อความเป็นตัวเลข (ดังที่เราทำใน [Clustering](../../5-Clustering/1-Visualize/README.md)) คุณอาจสร้างข้อมูลใหม่โดยอิงจากข้อมูลเดิม (ดังที่เราทำใน [Classification](../../4-Classification/1-Introduction/README.md)) คุณสามารถทำความสะอาดและแก้ไขข้อมูล (ดังที่เราจะทำก่อนบทเรียน [Web App](../../3-Web-App/README.md)) สุดท้าย คุณอาจต้องสุ่มและสับข้อมูล ขึ้นอยู่กับเทคนิคการฝึกของคุณ + +✅ หลังจากรวบรวมและประมวลผลข้อมูลของคุณ ใช้เวลาสักครู่เพื่อดูว่ารูปร่างของข้อมูลจะช่วยให้คุณตอบคำถามที่ตั้งใจไว้ได้หรือไม่ อาจเป็นไปได้ว่าข้อมูลจะไม่ทำงานได้ดีในงานที่คุณตั้งใจไว้ ดังที่เราค้นพบในบทเรียน [Clustering](../../5-Clustering/1-Visualize/README.md)! + +### คุณลักษณะและเป้าหมาย + +[คุณลักษณะ](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) คือคุณสมบัติที่สามารถวัดได้ของข้อมูล ในชุดข้อมูลหลายชุดจะแสดงเป็นหัวข้อคอลัมน์ เช่น 'วันที่' 'ขนาด' หรือ 'สี' ตัวแปรคุณลักษณะของคุณ ซึ่งมักแสดงเป็น `X` ในโค้ด แสดงถึงตัวแปรอินพุตที่จะใช้ฝึกโมเดล + +เป้าหมายคือสิ่งที่คุณพยายามทำนาย เป้าหมายซึ่งมักแสดงเป็น `y` ในโค้ด แสดงถึงคำตอบของคำถามที่คุณพยายามถามจากข้อมูล: ในเดือนธันวาคม ฟักทอง **สีอะไร** จะมีราคาถูกที่สุด? ในซานฟรานซิสโก ย่านไหนจะมี **ราคาที่ดิน** ดีที่สุด? บางครั้งเป้าหมายยังถูกเรียกว่าแอตทริบิวต์ป้ายกำกับ + +### การเลือกตัวแปรคุณลักษณะ + +🎓 **การเลือกคุณลักษณะและการสกัดคุณลักษณะ** คุณจะรู้ได้อย่างไรว่าควรเลือกตัวแปรใดเมื่อสร้างโมเดล? คุณอาจต้องผ่านกระบวนการเลือกคุณลักษณะหรือการสกัดคุณลักษณะเพื่อเลือกตัวแปรที่เหมาะสมที่สุดสำหรับโมเดลที่มีประสิทธิภาพสูงสุด อย่างไรก็ตาม ทั้งสองกระบวนการไม่เหมือนกัน: "การสกัดคุณลักษณะสร้างคุณลักษณะใหม่จากฟังก์ชันของคุณลักษณะเดิม ในขณะที่การเลือกคุณลักษณะจะคืนชุดย่อยของคุณลักษณะ" ([แหล่งข้อมูล](https://wikipedia.org/wiki/Feature_selection)) + +### การแสดงภาพข้อมูล + +ส่วนสำคัญของเครื่องมือของนักวิทยาศาสตร์ข้อมูลคือพลังในการแสดงภาพข้อมูลโดยใช้ไลบรารีที่ยอดเยี่ยมหลายตัว เช่น Seaborn หรือ MatPlotLib การแสดงข้อมูลของคุณในรูปแบบภาพอาจช่วยให้คุณค้นพบความสัมพันธ์ที่ซ่อนอยู่ซึ่งคุณสามารถใช้ประโยชน์ได้ การแสดงภาพของคุณอาจช่วยให้คุณค้นพบอคติหรือข้อมูลที่ไม่สมดุล (ดังที่เราค้นพบใน [Classification](../../4-Classification/2-Classifiers-1/README.md)) + +### การแบ่งชุดข้อมูล + +ก่อนการฝึก คุณต้องแบ่งชุดข้อมูลของคุณออกเป็นสองส่วนหรือมากกว่าที่มีขนาดไม่เท่ากันแต่ยังคงแสดงข้อมูลได้ดี + +- **การฝึก**. ส่วนนี้ของชุดข้อมูลจะถูกใช้เพื่อฝึกโมเดลของคุณ ชุดนี้ประกอบด้วยส่วนใหญ่ของชุดข้อมูลเดิม +- **การทดสอบ**. ชุดข้อมูลทดสอบเป็นกลุ่มข้อมูลอิสระที่มักรวบรวมจากข้อมูลเดิม ซึ่งคุณใช้เพื่อยืนยันประสิทธิภาพของโมเดลที่สร้างขึ้น +- **การตรวจสอบ**. ชุดตรวจสอบเป็นกลุ่มตัวอย่างอิสระขนาดเล็กที่คุณใช้ปรับแต่งพารามิเตอร์ไฮเปอร์ หรือโครงสร้างของโมเดลเพื่อปรับปรุงโมเดล ขึ้นอยู่กับขนาดของข้อมูลและคำถามที่คุณถาม คุณอาจไม่จำเป็นต้องสร้างชุดที่สามนี้ (ดังที่เราสังเกตใน [Time Series Forecasting](../../7-TimeSeries/1-Introduction/README.md)) + +## การสร้างโมเดล + +โดยใช้ข้อมูลการฝึก เป้าหมายของคุณคือการสร้างโมเดล หรือการแสดงทางสถิติของข้อมูลของคุณ โดยใช้อัลกอริทึมต่าง ๆ เพื่อ **ฝึก** โมเดล การฝึกโมเดลจะเปิดโอกาสให้โมเดลได้สัมผัสกับข้อมูลและทำการสันนิษฐานเกี่ยวกับรูปแบบที่ค้นพบ ตรวจสอบ และยอมรับหรือปฏิเสธ + +### การตัดสินใจเลือกวิธีการฝึก + +ขึ้นอยู่กับคำถามและลักษณะของข้อมูล คุณจะเลือกวิธีการฝึก โดยการสำรวจ [เอกสารของ Scikit-learn](https://scikit-learn.org/stable/user_guide.html) - ซึ่งเราใช้ในหลักสูตรนี้ - คุณสามารถสำรวจวิธีการฝึกโมเดลได้หลายวิธี ขึ้นอยู่กับประสบการณ์ของคุณ คุณอาจต้องลองหลายวิธีเพื่อสร้างโมเดลที่ดีที่สุด คุณอาจต้องผ่านกระบวนการที่นักวิทยาศาสตร์ข้อมูลประเมินประสิทธิภาพของโมเดลโดยป้อนข้อมูลที่ไม่เคยเห็นมาก่อน ตรวจสอบความแม่นยำ อคติ และปัญหาที่ลดคุณภาพ และเลือกวิธีการฝึกที่เหมาะสมที่สุดสำหรับงานที่ทำอยู่ + +### การฝึกโมเดล + +เมื่อมีข้อมูลการฝึก คุณพร้อมที่จะ 'fit' เพื่อสร้างโมเดล คุณจะสังเกตเห็นว่าในไลบรารี ML หลายตัว คุณจะพบโค้ด 'model.fit' - ในเวลานี้คุณจะส่งตัวแปรคุณลักษณะของคุณเป็นอาร์เรย์ของค่า (มักเป็น 'X') และตัวแปรเป้าหมาย (มักเป็น 'y') + +### การประเมินโมเดล + +เมื่อกระบวนการฝึกเสร็จสิ้น (อาจใช้หลายรอบ หรือ 'epochs' ในการฝึกโมเดลขนาดใหญ่) คุณจะสามารถประเมินคุณภาพของโมเดลได้โดยใช้ข้อมูลทดสอบเพื่อวัดประสิทธิภาพของมัน ข้อมูลนี้เป็นชุดย่อยของข้อมูลเดิมที่โมเดลยังไม่เคยวิเคราะห์มาก่อน คุณสามารถพิมพ์ตารางเมตริกเกี่ยวกับคุณภาพของโมเดลได้ + +🎓 **การปรับโมเดล** + +ในบริบทของการเรียนรู้ของเครื่อง การปรับโมเดลหมายถึงความแม่นยำของฟังก์ชันพื้นฐานของโมเดลเมื่อพยายามวิเคราะห์ข้อมูลที่ไม่คุ้นเคย + +🎓 **การปรับไม่ดี** และ **การปรับมากเกินไป** เป็นปัญหาทั่วไปที่ลดคุณภาพของโมเดล เนื่องจากโมเดลปรับตัวไม่ดีพอหรือดีเกินไป สิ่งนี้ทำให้โมเดลทำการทำนายที่สอดคล้องกับข้อมูลการฝึกมากเกินไปหรือหลวมเกินไป โมเดลที่ปรับมากเกินไปจะทำนายข้อมูลการฝึกได้ดีเกินไปเพราะมันเรียนรู้รายละเอียดและเสียงรบกวนของข้อมูลมากเกินไป โมเดลที่ปรับไม่ดีจะไม่แม่นยำเพราะไม่สามารถวิเคราะห์ข้อมูลการฝึกหรือข้อมูลที่ยังไม่เคยเห็นได้อย่างถูกต้อง + +![overfitting model](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png) +> อินโฟกราฟิกโดย [Jen Looper](https://twitter.com/jenlooper) + +## การปรับแต่งพารามิเตอร์ + +เมื่อการฝึกครั้งแรกเสร็จสิ้น สังเกตคุณภาพของโมเดลและพิจารณาปรับปรุงโดยการปรับ 'พารามิเตอร์ไฮเปอร์' อ่านเพิ่มเติมเกี่ยวกับกระบวนการนี้ [ในเอกสาร](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott) + +## การทำนาย + +นี่คือช่วงเวลาที่คุณสามารถใช้ข้อมูลใหม่ทั้งหมดเพื่อทดสอบความแม่นยำของโมเดล ในการตั้งค่า ML ที่ 'นำไปใช้' ซึ่งคุณกำลังสร้างสินทรัพย์เว็บเพื่อใช้โมเดลในระบบผลิต การทำนายอาจเกี่ยวข้องกับการรวบรวมข้อมูลจากผู้ใช้ (เช่น การกดปุ่ม) เพื่อกำหนดตัวแปรและส่งไปยังโมเดลเพื่อการอนุมานหรือการประเมินผล + +ในบทเรียนเหล่านี้ คุณจะค้นพบวิธีใช้ขั้นตอนเหล่านี้เพื่อเตรียม สร้าง ทดสอบ ประเมิน และทำนาย - ทุกขั้นตอนของนักวิทยาศาสตร์ข้อมูลและอื่น ๆ ในขณะที่คุณก้าวหน้าในเส้นทางสู่การเป็นวิศวกร ML 'เต็มรูปแบบ' + +--- + +## 🚀ความท้าทาย + +วาดแผนภาพแสดงขั้นตอนของนักปฏิบัติ ML ตอนนี้คุณอยู่ในขั้นตอนใดในกระบวนการ? คุณคาดว่าจะพบความยากลำบากที่ไหน? อะไรที่ดูเหมือนง่ายสำหรับคุณ? + +## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +ค้นหาสัมภาษณ์ออนไลน์กับนักวิทยาศาสตร์ข้อมูลที่พูดคุยเกี่ยวกับงานประจำวันของพวกเขา นี่คือ [หนึ่งตัวอย่าง](https://www.youtube.com/watch?v=Z3IjgbbCEfs) + +## งานที่ได้รับมอบหมาย + +[สัมภาษณ์นักวิทยาศาสตร์ข้อมูล](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์มืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/1-Introduction/4-techniques-of-ML/assignment.md b/translations/th/1-Introduction/4-techniques-of-ML/assignment.md new file mode 100644 index 000000000..367c2853e --- /dev/null +++ b/translations/th/1-Introduction/4-techniques-of-ML/assignment.md @@ -0,0 +1,25 @@ + +# สัมภาษณ์นักวิทยาศาสตร์ข้อมูล + +## คำแนะนำ + +ในบริษัทของคุณ ในกลุ่มผู้ใช้งาน หรือในหมู่เพื่อนหรือเพื่อนร่วมชั้น ลองพูดคุยกับใครสักคนที่ทำงานเป็นนักวิทยาศาสตร์ข้อมูลมืออาชีพ เขียนเรียงความสั้น ๆ (500 คำ) เกี่ยวกับงานประจำวันของพวกเขา พวกเขาเป็นผู้เชี่ยวชาญเฉพาะด้าน หรือทำงานแบบ 'full stack'? + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | พอใช้ | ต้องปรับปรุง | +| ------ | ---------------------------------------------------------------------------------- | ------------------------------------------------------------- | --------------------- | +| | เรียงความมีความยาวที่ถูกต้อง พร้อมแหล่งอ้างอิงที่ชัดเจน และนำเสนอในรูปแบบไฟล์ .doc | เรียงความมีแหล่งอ้างอิงที่ไม่ชัดเจนหรือสั้นกว่าความยาวที่กำหนด | ไม่มีการนำเสนอเรียงความ | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/1-Introduction/README.md b/translations/th/1-Introduction/README.md new file mode 100644 index 000000000..2321a7fc5 --- /dev/null +++ b/translations/th/1-Introduction/README.md @@ -0,0 +1,37 @@ + +# การแนะนำเกี่ยวกับการเรียนรู้ของเครื่อง + +ในส่วนนี้ของหลักสูตร คุณจะได้เรียนรู้แนวคิดพื้นฐานที่เกี่ยวข้องกับการเรียนรู้ของเครื่องว่ามันคืออะไร รวมถึงประวัติศาสตร์และเทคนิคที่นักวิจัยใช้ในการทำงานกับมัน มาสำรวจโลกใหม่ของ ML ไปด้วยกัน! + +![globe](../../../1-Introduction/images/globe.jpg) +> ภาพถ่ายโดย Bill Oxford บน Unsplash + +### บทเรียน + +1. [การแนะนำเกี่ยวกับการเรียนรู้ของเครื่อง](1-intro-to-ML/README.md) +1. [ประวัติศาสตร์ของการเรียนรู้ของเครื่องและ AI](2-history-of-ML/README.md) +1. [ความยุติธรรมและการเรียนรู้ของเครื่อง](3-fairness/README.md) +1. [เทคนิคของการเรียนรู้ของเครื่อง](4-techniques-of-ML/README.md) + +### เครดิต + +"การแนะนำเกี่ยวกับการเรียนรู้ของเครื่อง" ถูกเขียนขึ้นด้วย ♥️ โดยทีมงานที่รวมถึง [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) และ [Jen Looper](https://twitter.com/jenlooper) + +"ประวัติศาสตร์ของการเรียนรู้ของเครื่อง" ถูกเขียนขึ้นด้วย ♥️ โดย [Jen Looper](https://twitter.com/jenlooper) และ [Amy Boyd](https://twitter.com/AmyKateNicho) + +"ความยุติธรรมและการเรียนรู้ของเครื่อง" ถูกเขียนขึ้นด้วย ♥️ โดย [Tomomi Imura](https://twitter.com/girliemac) + +"เทคนิคของการเรียนรู้ของเครื่อง" ถูกเขียนขึ้นด้วย ♥️ โดย [Jen Looper](https://twitter.com/jenlooper) และ [Chris Noring](https://twitter.com/softchris) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/1-Tools/README.md b/translations/th/2-Regression/1-Tools/README.md new file mode 100644 index 000000000..c7a64dae6 --- /dev/null +++ b/translations/th/2-Regression/1-Tools/README.md @@ -0,0 +1,241 @@ + +# เริ่มต้นกับ Python และ Scikit-learn สำหรับโมเดลการถดถอย + +![สรุปเกี่ยวกับการถดถอยในรูปแบบสเก็ตโน้ต](../../../../sketchnotes/ml-regression.png) + +> สเก็ตโน้ตโดย [Tomomi Imura](https://www.twitter.com/girlie_mac) + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +> ### [บทเรียนนี้มีในภาษา R ด้วย!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html) + +## บทนำ + +ในบทเรียนทั้งสี่นี้ คุณจะได้เรียนรู้วิธีสร้างโมเดลการถดถอย เราจะพูดถึงว่ามันมีไว้เพื่ออะไรในไม่ช้า แต่ก่อนที่คุณจะเริ่มต้น อย่าลืมเตรียมเครื่องมือที่เหมาะสมให้พร้อมสำหรับการเริ่มต้นกระบวนการนี้! + +ในบทเรียนนี้ คุณจะได้เรียนรู้วิธี: + +- ตั้งค่าคอมพิวเตอร์ของคุณสำหรับงานการเรียนรู้ของเครื่องในเครื่อง +- ทำงานกับ Jupyter notebooks +- ใช้ Scikit-learn รวมถึงการติดตั้ง +- สำรวจการถดถอยเชิงเส้นผ่านการฝึกปฏิบัติ + +## การติดตั้งและการตั้งค่า + +[![ML สำหรับผู้เริ่มต้น - ตั้งค่าเครื่องมือของคุณให้พร้อมสำหรับการสร้างโมเดล Machine Learning](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML สำหรับผู้เริ่มต้น - ตั้งค่าเครื่องมือของคุณให้พร้อมสำหรับการสร้างโมเดล Machine Learning") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการตั้งค่าคอมพิวเตอร์ของคุณสำหรับ ML + +1. **ติดตั้ง Python** ตรวจสอบให้แน่ใจว่า [Python](https://www.python.org/downloads/) ได้รับการติดตั้งในคอมพิวเตอร์ของคุณแล้ว คุณจะใช้ Python สำหรับงานด้านวิทยาศาสตร์ข้อมูลและการเรียนรู้ของเครื่องหลายอย่าง ระบบคอมพิวเตอร์ส่วนใหญ่มีการติดตั้ง Python อยู่แล้ว นอกจากนี้ยังมี [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) ที่เป็นประโยชน์เพื่อช่วยให้การตั้งค่าสำหรับผู้ใช้บางคนง่ายขึ้น + + อย่างไรก็ตาม การใช้งาน Python บางอย่างอาจต้องการเวอร์ชันที่แตกต่างกัน ดังนั้นจึงเป็นประโยชน์ที่จะทำงานใน [virtual environment](https://docs.python.org/3/library/venv.html) + +2. **ติดตั้ง Visual Studio Code** ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Visual Studio Code ในคอมพิวเตอร์ของคุณแล้ว ทำตามคำแนะนำเหล่านี้เพื่อ [ติดตั้ง Visual Studio Code](https://code.visualstudio.com/) สำหรับการติดตั้งพื้นฐาน คุณจะใช้ Python ใน Visual Studio Code ในคอร์สนี้ ดังนั้นคุณอาจต้องการทบทวนวิธี [ตั้งค่า Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) สำหรับการพัฒนา Python + + > ทำความคุ้นเคยกับ Python โดยทำตามคอลเลกชันของ [Learn modules](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) + > + > [![ตั้งค่า Python กับ Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "ตั้งค่า Python กับ Visual Studio Code") + > + > 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: การใช้ Python ใน VS Code + +3. **ติดตั้ง Scikit-learn** โดยทำตาม [คำแนะนำเหล่านี้](https://scikit-learn.org/stable/install.html) เนื่องจากคุณต้องใช้ Python 3 จึงแนะนำให้ใช้ virtual environment โปรดทราบว่าหากคุณกำลังติดตั้งไลบรารีนี้บน Mac ที่ใช้ M1 มีคำแนะนำพิเศษในหน้าที่ลิงก์ไว้ข้างต้น + +4. **ติดตั้ง Jupyter Notebook** คุณจะต้อง [ติดตั้งแพ็กเกจ Jupyter](https://pypi.org/project/jupyter/) + +## สภาพแวดล้อมการเขียน ML ของคุณ + +คุณจะใช้ **notebooks** เพื่อพัฒนาโค้ด Python และสร้างโมเดลการเรียนรู้ของเครื่อง ไฟล์ประเภทนี้เป็นเครื่องมือทั่วไปสำหรับนักวิทยาศาสตร์ข้อมูล และสามารถระบุได้ด้วยนามสกุล `.ipynb` + +Notebooks เป็นสภาพแวดล้อมแบบโต้ตอบที่ช่วยให้นักพัฒนาสามารถเขียนโค้ด เพิ่มบันทึก และเขียนเอกสารประกอบรอบ ๆ โค้ด ซึ่งมีประโยชน์มากสำหรับโครงการที่เน้นการทดลองหรือการวิจัย + +[![ML สำหรับผู้เริ่มต้น - ตั้งค่า Jupyter Notebooks เพื่อเริ่มสร้างโมเดลการถดถอย](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML สำหรับผู้เริ่มต้น - ตั้งค่า Jupyter Notebooks เพื่อเริ่มสร้างโมเดลการถดถอย") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการฝึกปฏิบัตินี้ + +### การฝึกปฏิบัติ - ทำงานกับ notebook + +ในโฟลเดอร์นี้ คุณจะพบไฟล์ _notebook.ipynb_ + +1. เปิด _notebook.ipynb_ ใน Visual Studio Code + + Jupyter server จะเริ่มต้นพร้อมกับ Python 3+ คุณจะพบพื้นที่ใน notebook ที่สามารถ `run` ได้ ซึ่งเป็นส่วนของโค้ด คุณสามารถรันโค้ดบล็อกได้โดยเลือกไอคอนที่มีลักษณะเหมือนปุ่มเล่น + +2. เลือกไอคอน `md` และเพิ่มข้อความ markdown ต่อไปนี้ **# ยินดีต้อนรับสู่ notebook ของคุณ** + + จากนั้นเพิ่มโค้ด Python + +3. พิมพ์ **print('hello notebook')** ในโค้ดบล็อก +4. เลือกลูกศรเพื่อรันโค้ด + + คุณควรเห็นข้อความที่พิมพ์ออกมา: + + ```output + hello notebook + ``` + +![VS Code พร้อม notebook ที่เปิดอยู่](../../../../2-Regression/1-Tools/images/notebook.jpg) + +คุณสามารถสลับโค้ดกับคอมเมนต์เพื่อเขียนเอกสารประกอบใน notebook ได้ด้วยตัวเอง + +✅ ลองคิดดูสักนิดว่าสภาพแวดล้อมการทำงานของนักพัฒนาเว็บแตกต่างจากของนักวิทยาศาสตร์ข้อมูลอย่างไร + +## เริ่มต้นใช้งาน Scikit-learn + +ตอนนี้ Python ได้รับการตั้งค่าในสภาพแวดล้อมของคุณแล้ว และคุณคุ้นเคยกับ Jupyter notebooks แล้ว มาทำความคุ้นเคยกับ Scikit-learn กันเถอะ (ออกเสียงว่า `sci` เหมือน `science`) Scikit-learn มี [API ที่ครอบคลุม](https://scikit-learn.org/stable/modules/classes.html#api-ref) เพื่อช่วยคุณทำงาน ML + +ตามที่ระบุใน [เว็บไซต์ของพวกเขา](https://scikit-learn.org/stable/getting_started.html) "Scikit-learn เป็นไลบรารีการเรียนรู้ของเครื่องแบบโอเพ่นซอร์สที่รองรับการเรียนรู้แบบมีผู้สอนและไม่มีผู้สอน นอกจากนี้ยังมีเครื่องมือต่าง ๆ สำหรับการฟิตโมเดล การเตรียมข้อมูล การเลือกโมเดล และการประเมินผล รวมถึงเครื่องมืออื่น ๆ อีกมากมาย" + +ในคอร์สนี้ คุณจะใช้ Scikit-learn และเครื่องมืออื่น ๆ เพื่อสร้างโมเดลการเรียนรู้ของเครื่องสำหรับงานที่เรียกว่า 'การเรียนรู้ของเครื่องแบบดั้งเดิม' เราได้หลีกเลี่ยงการใช้โครงข่ายประสาทเทียมและการเรียนรู้เชิงลึกโดยเจตนา เนื่องจากหัวข้อเหล่านี้จะครอบคลุมในหลักสูตร 'AI for Beginners' ที่กำลังจะมาถึง + +Scikit-learn ทำให้การสร้างโมเดลและการประเมินผลใช้งานง่ายขึ้น โดยเน้นที่การใช้ข้อมูลเชิงตัวเลขเป็นหลัก และมีชุดข้อมูลที่พร้อมใช้งานหลายชุดสำหรับการเรียนรู้ นอกจากนี้ยังมีโมเดลที่สร้างไว้ล่วงหน้าให้นักเรียนได้ลองใช้งาน มาสำรวจขั้นตอนการโหลดข้อมูลที่เตรียมไว้ล่วงหน้าและการใช้ตัวประมาณค่าในโมเดล ML แรกของคุณด้วย Scikit-learn กับข้อมูลพื้นฐานกันเถอะ + +## การฝึกปฏิบัติ - notebook Scikit-learn แรกของคุณ + +> บทแนะนำนี้ได้รับแรงบันดาลใจจาก [ตัวอย่างการถดถอยเชิงเส้น](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) บนเว็บไซต์ของ Scikit-learn + +[![ML สำหรับผู้เริ่มต้น - โปรเจกต์การถดถอยเชิงเส้นแรกของคุณใน Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML สำหรับผู้เริ่มต้น - โปรเจกต์การถดถอยเชิงเส้นแรกของคุณใน Python") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการฝึกปฏิบัตินี้ + +ในไฟล์ _notebook.ipynb_ ที่เกี่ยวข้องกับบทเรียนนี้ ให้ล้างเซลล์ทั้งหมดโดยกดไอคอน 'ถังขยะ' + +ในส่วนนี้ คุณจะทำงานกับชุดข้อมูลขนาดเล็กเกี่ยวกับโรคเบาหวานที่มีอยู่ใน Scikit-learn เพื่อการเรียนรู้ ลองจินตนาการว่าคุณต้องการทดสอบการรักษาสำหรับผู้ป่วยเบาหวาน โมเดลการเรียนรู้ของเครื่องอาจช่วยคุณกำหนดว่าผู้ป่วยรายใดจะตอบสนองต่อการรักษาได้ดีกว่า โดยพิจารณาจากการรวมกันของตัวแปรต่าง ๆ แม้แต่โมเดลการถดถอยพื้นฐาน เมื่อแสดงผลในรูปแบบภาพ อาจแสดงข้อมูลเกี่ยวกับตัวแปรที่ช่วยให้คุณจัดระเบียบการทดลองทางคลินิกเชิงทฤษฎีของคุณได้ + +✅ มีวิธีการถดถอยหลายประเภท และการเลือกใช้วิธีใดขึ้นอยู่กับคำตอบที่คุณกำลังมองหา หากคุณต้องการทำนายความสูงที่เป็นไปได้ของบุคคลในช่วงอายุหนึ่ง คุณจะใช้การถดถอยเชิงเส้น เนื่องจากคุณกำลังมองหาค่าเชิงตัวเลข หากคุณสนใจที่จะค้นหาว่าประเภทของอาหารควรจัดเป็นมังสวิรัติหรือไม่ คุณกำลังมองหาการกำหนดหมวดหมู่ ดังนั้นคุณจะใช้การถดถอยโลจิสติก คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับการถดถอยโลจิสติกในภายหลัง ลองคิดดูสักนิดเกี่ยวกับคำถามที่คุณสามารถถามข้อมูล และวิธีการใดที่เหมาะสมกว่า + +มาเริ่มต้นงานนี้กันเถอะ + +### นำเข้าไลบรารี + +สำหรับงานนี้ เราจะนำเข้าไลบรารีบางตัว: + +- **matplotlib** เป็น [เครื่องมือสร้างกราฟ](https://matplotlib.org/) ที่มีประโยชน์ และเราจะใช้มันเพื่อสร้างกราฟเส้น +- **numpy** [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) เป็นไลบรารีที่มีประโยชน์สำหรับการจัดการข้อมูลเชิงตัวเลขใน Python +- **sklearn** นี่คือไลบรารี [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) + +นำเข้าไลบรารีบางตัวเพื่อช่วยในงานของคุณ + +1. เพิ่มการนำเข้าโดยพิมพ์โค้ดต่อไปนี้: + + ```python + import matplotlib.pyplot as plt + import numpy as np + from sklearn import datasets, linear_model, model_selection + ``` + + ด้านบนคุณกำลังนำเข้า `matplotlib`, `numpy` และคุณกำลังนำเข้า `datasets`, `linear_model` และ `model_selection` จาก `sklearn` โดย `model_selection` ใช้สำหรับการแบ่งข้อมูลเป็นชุดฝึกอบรมและชุดทดสอบ + +### ชุดข้อมูลเบาหวาน + +ชุดข้อมูล [เบาหวาน](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) ที่มีอยู่ในตัวประกอบด้วยตัวอย่างข้อมูล 442 ชุดเกี่ยวกับเบาหวาน โดยมีตัวแปรคุณลักษณะ 10 ตัว ซึ่งบางตัวได้แก่: + +- age: อายุในปี +- bmi: ดัชนีมวลกาย +- bp: ความดันโลหิตเฉลี่ย +- s1 tc: T-Cells (ชนิดของเซลล์เม็ดเลือดขาว) + +✅ ชุดข้อมูลนี้รวมถึงแนวคิดของ 'เพศ' เป็นตัวแปรคุณลักษณะที่สำคัญต่อการวิจัยเกี่ยวกับเบาหวาน ชุดข้อมูลทางการแพทย์หลายชุดรวมการจัดประเภทแบบไบนารีประเภทนี้ ลองคิดดูว่าการจัดประเภทดังกล่าวอาจกีดกันบางส่วนของประชากรจากการรักษาได้อย่างไร + +ตอนนี้ โหลดข้อมูล X และ y + +> 🎓 จำไว้ว่า นี่คือการเรียนรู้แบบมีผู้สอน และเราต้องการเป้าหมาย 'y' ที่มีชื่อกำกับ + +ในเซลล์โค้ดใหม่ ให้โหลดชุดข้อมูลเบาหวานโดยเรียกใช้ `load_diabetes()` อินพุต `return_X_y=True` บ่งชี้ว่า `X` จะเป็นเมทริกซ์ข้อมูล และ `y` จะเป็นเป้าหมายการถดถอย + +1. เพิ่มคำสั่ง print บางคำสั่งเพื่อแสดงรูปร่างของเมทริกซ์ข้อมูลและองค์ประกอบแรก: + + ```python + X, y = datasets.load_diabetes(return_X_y=True) + print(X.shape) + print(X[0]) + ``` + + สิ่งที่คุณได้รับกลับมาเป็นผลลัพธ์คือ tuple สิ่งที่คุณทำคือกำหนดค่าสองค่ + +แรกของ tuple ให้กับ `X` และ `y` ตามลำดับ เรียนรู้เพิ่มเติมเกี่ยวกับ [tuple](https://wikipedia.org/wiki/Tuple) + + คุณสามารถเห็นว่าข้อมูลนี้มี 442 รายการที่จัดอยู่ในอาร์เรย์ที่มี 10 องค์ประกอบ: + + ```text + (442, 10) + [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076 + -0.04340085 -0.00259226 0.01990842 -0.01764613] + ``` + + ✅ ลองคิดดูสักนิดเกี่ยวกับความสัมพันธ์ระหว่างข้อมูลและเป้าหมายการถดถอย การถดถอยเชิงเส้นทำนายความสัมพันธ์ระหว่างคุณลักษณะ X และตัวแปรเป้าหมาย y คุณสามารถค้นหา [เป้าหมาย](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) สำหรับชุดข้อมูลเบาหวานในเอกสารประกอบได้หรือไม่? ชุดข้อมูลนี้แสดงอะไรให้เห็นเมื่อพิจารณาเป้าหมาย? + +2. ต่อไป เลือกส่วนหนึ่งของชุดข้อมูลนี้เพื่อพล็อตโดยเลือกคอลัมน์ที่ 3 ของชุดข้อมูล คุณสามารถทำได้โดยใช้ตัวดำเนินการ `:` เพื่อเลือกทุกแถว จากนั้นเลือกคอลัมน์ที่ 3 โดยใช้ดัชนี (2) คุณยังสามารถปรับรูปร่างข้อมูลให้เป็นอาร์เรย์ 2D ตามที่ต้องการสำหรับการพล็อต โดยใช้ `reshape(n_rows, n_columns)` หากพารามิเตอร์ตัวใดตัวหนึ่งเป็น -1 มิติที่สอดคล้องกันจะถูกคำนวณโดยอัตโนมัติ + + ```python + X = X[:, 2] + X = X.reshape((-1,1)) + ``` + + ✅ คุณสามารถพิมพ์ข้อมูลออกมาเพื่อตรวจสอบรูปร่างได้ตลอดเวลา + +3. ตอนนี้คุณมีข้อมูลพร้อมสำหรับการพล็อตแล้ว คุณสามารถดูได้ว่าคอมพิวเตอร์สามารถช่วยกำหนดการแบ่งที่เหมาะสมระหว่างตัวเลขในชุดข้อมูลนี้ได้หรือไม่ ในการทำเช่นนี้ คุณต้องแบ่งข้อมูล (X) และเป้าหมาย (y) ออกเป็นชุดทดสอบและชุดฝึกอบรม Scikit-learn มีวิธีที่ตรงไปตรงมาสำหรับการทำเช่นนี้ คุณสามารถแบ่งข้อมูลทดสอบของคุณที่จุดที่กำหนด + + ```python + X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33) + ``` + +4. ตอนนี้คุณพร้อมที่จะฝึกโมเดลของคุณแล้ว! โหลดโมเดลการถดถอยเชิงเส้นและฝึกด้วยชุดฝึกอบรม X และ y ของคุณโดยใช้ `model.fit()`: + + ```python + model = linear_model.LinearRegression() + model.fit(X_train, y_train) + ``` + + ✅ `model.fit()` เป็นฟังก์ชันที่คุณจะเห็นในไลบรารี ML หลายตัว เช่น TensorFlow + +5. จากนั้น สร้างการพยากรณ์โดยใช้ข้อมูลทดสอบ โดยใช้ฟังก์ชัน `predict()` สิ่งนี้จะใช้เพื่อวาดเส้นระหว่างกลุ่มข้อมูล + + ```python + y_pred = model.predict(X_test) + ``` + +6. ตอนนี้ถึงเวลาที่จะแสดงข้อมูลในกราฟแล้ว Matplotlib เป็นเครื่องมือที่มีประโยชน์มากสำหรับงานนี้ สร้าง scatterplot ของข้อมูลทดสอบ X และ y ทั้งหมด และใช้การพยากรณ์เพื่อวาดเส้นในตำแหน่งที่เหมาะสมที่สุด ระหว่างกลุ่มข้อมูลของโมเดล + + ```python + plt.scatter(X_test, y_test, color='black') + plt.plot(X_test, y_pred, color='blue', linewidth=3) + plt.xlabel('Scaled BMIs') + plt.ylabel('Disease Progression') + plt.title('A Graph Plot Showing Diabetes Progression Against BMI') + plt.show() + ``` + + ![scatterplot ที่แสดงจุดข้อมูลเกี่ยวกับเบาหวาน](../../../../2-Regression/1-Tools/images/scatterplot.png) +✅ ลองคิดดูว่าเกิดอะไรขึ้นที่นี่ เส้นตรงกำลังวิ่งผ่านจุดข้อมูลเล็กๆ หลายจุด แต่จริงๆ แล้วมันกำลังทำอะไรอยู่? คุณสามารถมองเห็นได้ไหมว่าคุณควรจะใช้เส้นนี้เพื่อทำนายตำแหน่งของจุดข้อมูลใหม่ที่ยังไม่เคยเห็นมาก่อนในความสัมพันธ์กับแกน y ของกราฟได้อย่างไร? ลองอธิบายการใช้งานจริงของโมเดลนี้ออกมาเป็นคำพูด + +ยินดีด้วย! คุณสร้างโมเดลการถดถอยเชิงเส้นตัวแรกของคุณ สร้างการทำนายด้วยมัน และแสดงผลในกราฟ! + +--- +## 🚀ความท้าทาย + +ลองพล็อตตัวแปรอื่นจากชุดข้อมูลนี้ คำใบ้: แก้ไขบรรทัดนี้: `X = X[:,2]` จากเป้าหมายของชุดข้อมูลนี้ คุณสามารถค้นพบอะไรเกี่ยวกับการพัฒนาของโรคเบาหวานในฐานะโรค? + +## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตัวเอง + +ในบทเรียนนี้ คุณได้ทำงานกับการถดถอยเชิงเส้นแบบง่าย แทนที่จะเป็นการถดถอยเชิงเส้นแบบตัวแปรเดียวหรือแบบหลายตัวแปร ลองอ่านเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างวิธีการเหล่านี้ หรือดู [วิดีโอนี้](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef) + +อ่านเพิ่มเติมเกี่ยวกับแนวคิดของการถดถอย และลองคิดดูว่าคำถามประเภทใดที่สามารถตอบได้ด้วยเทคนิคนี้ ลองทำ [บทเรียนนี้](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) เพื่อเพิ่มความเข้าใจของคุณ + +## งานที่ได้รับมอบหมาย + +[ชุดข้อมูลอื่น](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/1-Tools/assignment.md b/translations/th/2-Regression/1-Tools/assignment.md new file mode 100644 index 000000000..da76a64dd --- /dev/null +++ b/translations/th/2-Regression/1-Tools/assignment.md @@ -0,0 +1,27 @@ + +# การวิเคราะห์ถดถอยด้วย Scikit-learn + +## คำแนะนำ + +ลองดู [ชุดข้อมูล Linnerud](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) ใน Scikit-learn ชุดข้อมูลนี้มี [เป้าหมายหลายตัว](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): 'ประกอบด้วยตัวแปรการออกกำลังกายสามตัว (ข้อมูล) และตัวแปรทางสรีรวิทยาสามตัว (เป้าหมาย) ที่รวบรวมจากชายวัยกลางคนยี่สิบคนในฟิตเนสคลับ' + +ในคำพูดของคุณเอง อธิบายวิธีการสร้างโมเดลการวิเคราะห์ถดถอยที่สามารถแสดงความสัมพันธ์ระหว่างรอบเอวและจำนวนครั้งที่สามารถทำซิทอัพได้ ทำเช่นเดียวกันสำหรับจุดข้อมูลอื่น ๆ ในชุดข้อมูลนี้ + +## เกณฑ์การประเมิน + +| เกณฑ์ | ดีเยี่ยม | พอใช้ | ต้องปรับปรุง | +| ------------------------------ | ----------------------------------- | ----------------------------- | -------------------------- | +| ส่งย่อหน้าอธิบาย | ส่งย่อหน้าที่เขียนได้ดี | ส่งเพียงไม่กี่ประโยค | ไม่มีคำอธิบายที่ส่งมา | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/1-Tools/solution/Julia/README.md b/translations/th/2-Regression/1-Tools/solution/Julia/README.md new file mode 100644 index 000000000..4cbd13e78 --- /dev/null +++ b/translations/th/2-Regression/1-Tools/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามอย่างเต็มที่เพื่อให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/2-Data/README.md b/translations/th/2-Regression/2-Data/README.md new file mode 100644 index 000000000..4d67dc014 --- /dev/null +++ b/translations/th/2-Regression/2-Data/README.md @@ -0,0 +1,226 @@ + +# สร้างโมเดลการถดถอยด้วย Scikit-learn: เตรียมและแสดงข้อมูล + +![อินโฟกราฟิกการแสดงข้อมูล](../../../../2-Regression/2-Data/images/data-visualization.png) + +อินโฟกราฟิกโดย [Dasani Madipalli](https://twitter.com/dasani_decoded) + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +> ### [บทเรียนนี้มีในภาษา R ด้วย!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) + +## บทนำ + +เมื่อคุณมีเครื่องมือที่จำเป็นสำหรับการเริ่มต้นสร้างโมเดลการเรียนรู้ของเครื่องด้วย Scikit-learn แล้ว คุณก็พร้อมที่จะเริ่มตั้งคำถามกับข้อมูลของคุณ การทำงานกับข้อมูลและการใช้โซลูชัน ML นั้น สิ่งสำคัญคือการเข้าใจวิธีตั้งคำถามที่ถูกต้องเพื่อปลดล็อกศักยภาพของชุดข้อมูลของคุณอย่างเหมาะสม + +ในบทเรียนนี้ คุณจะได้เรียนรู้: + +- วิธีเตรียมข้อมูลของคุณสำหรับการสร้างโมเดล +- วิธีใช้ Matplotlib สำหรับการแสดงข้อมูล + +## การตั้งคำถามที่ถูกต้องกับข้อมูลของคุณ + +คำถามที่คุณต้องการคำตอบจะกำหนดประเภทของอัลกอริทึม ML ที่คุณจะใช้ และคุณภาพของคำตอบที่คุณได้รับจะขึ้นอยู่กับลักษณะของข้อมูลของคุณอย่างมาก + +ลองดู [ข้อมูล](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) ที่ให้มาในบทเรียนนี้ คุณสามารถเปิดไฟล์ .csv นี้ใน VS Code การดูอย่างรวดเร็วจะเห็นได้ทันทีว่ามีช่องว่างและการผสมผสานระหว่างข้อมูลตัวอักษรและตัวเลข นอกจากนี้ยังมีคอลัมน์แปลก ๆ ที่เรียกว่า 'Package' ซึ่งข้อมูลเป็นการผสมระหว่าง 'sacks', 'bins' และค่าอื่น ๆ ข้อมูลนี้ค่อนข้างยุ่งเหยิง + +[![ML สำหรับผู้เริ่มต้น - วิธีวิเคราะห์และทำความสะอาดชุดข้อมูล](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML สำหรับผู้เริ่มต้น - วิธีวิเคราะห์และทำความสะอาดชุดข้อมูล") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการเตรียมข้อมูลสำหรับบทเรียนนี้ + +ในความเป็นจริง ไม่บ่อยนักที่คุณจะได้รับชุดข้อมูลที่พร้อมใช้งานสำหรับการสร้างโมเดล ML ทันที ในบทเรียนนี้ คุณจะได้เรียนรู้วิธีเตรียมชุดข้อมูลดิบโดยใช้ไลบรารี Python มาตรฐาน นอกจากนี้คุณยังจะได้เรียนรู้เทคนิคต่าง ๆ ในการแสดงข้อมูล + +## กรณีศึกษา: 'ตลาดฟักทอง' + +ในโฟลเดอร์นี้ คุณจะพบไฟล์ .csv ในโฟลเดอร์ `data` ชื่อ [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) ซึ่งมีข้อมูล 1757 บรรทัดเกี่ยวกับตลาดฟักทอง โดยจัดกลุ่มตามเมือง นี่คือข้อมูลดิบที่ดึงมาจาก [รายงานมาตรฐานตลาดพืชผลเฉพาะทาง](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) ที่เผยแพร่โดยกระทรวงเกษตรของสหรัฐอเมริกา + +### การเตรียมข้อมูล + +ข้อมูลนี้เป็นข้อมูลสาธารณะ สามารถดาวน์โหลดได้ในหลายไฟล์แยกกันตามเมืองจากเว็บไซต์ USDA เพื่อหลีกเลี่ยงการมีไฟล์แยกกันมากเกินไป เราได้รวมข้อมูลจากทุกเมืองไว้ในสเปรดชีตเดียว ดังนั้นเราจึงได้ _เตรียม_ ข้อมูลไว้บ้างแล้ว ต่อไป มาดูข้อมูลนี้อย่างใกล้ชิดกัน + +### ข้อมูลฟักทอง - ข้อสรุปเบื้องต้น + +คุณสังเกตเห็นอะไรเกี่ยวกับข้อมูลนี้? คุณอาจเห็นแล้วว่ามีการผสมผสานระหว่างตัวอักษร ตัวเลข ช่องว่าง และค่าที่แปลก ๆ ที่คุณต้องทำความเข้าใจ + +คำถามอะไรที่คุณสามารถถามข้อมูลนี้โดยใช้เทคนิคการถดถอย? เช่น "ทำนายราคาฟักทองที่ขายในแต่ละเดือน" เมื่อดูข้อมูลอีกครั้ง มีการเปลี่ยนแปลงบางอย่างที่คุณต้องทำเพื่อสร้างโครงสร้างข้อมูลที่จำเป็นสำหรับงานนี้ + +## แบบฝึกหัด - วิเคราะห์ข้อมูลฟักทอง + +ลองใช้ [Pandas](https://pandas.pydata.org/) (ชื่อย่อมาจาก `Python Data Analysis`) ซึ่งเป็นเครื่องมือที่มีประโยชน์มากสำหรับการจัดรูปแบบข้อมูล เพื่อวิเคราะห์และเตรียมข้อมูลฟักทองนี้ + +### ขั้นแรก ตรวจสอบวันที่ที่ขาดหายไป + +คุณจะต้องดำเนินการตรวจสอบวันที่ที่ขาดหายไป: + +1. แปลงวันที่เป็นรูปแบบเดือน (วันที่ในสหรัฐฯ มีรูปแบบ `MM/DD/YYYY`) +2. ดึงเดือนออกมาใส่ในคอลัมน์ใหม่ + +เปิดไฟล์ _notebook.ipynb_ ใน Visual Studio Code และนำเข้าสเปรดชีตไปยัง Pandas dataframe ใหม่ + +1. ใช้ฟังก์ชัน `head()` เพื่อดู 5 แถวแรก + + ```python + import pandas as pd + pumpkins = pd.read_csv('../data/US-pumpkins.csv') + pumpkins.head() + ``` + + ✅ ฟังก์ชันใดที่คุณจะใช้เพื่อดู 5 แถวสุดท้าย? + +1. ตรวจสอบว่ามีข้อมูลที่ขาดหายไปใน dataframe ปัจจุบันหรือไม่: + + ```python + pumpkins.isnull().sum() + ``` + + มีข้อมูลที่ขาดหายไป แต่บางทีอาจจะไม่สำคัญสำหรับงานนี้ + +1. เพื่อให้ง่ายต่อการทำงานกับ dataframe ของคุณ ให้เลือกเฉพาะคอลัมน์ที่คุณต้องการ โดยใช้ฟังก์ชัน `loc` ซึ่งดึงกลุ่มแถว (พารามิเตอร์แรก) และคอลัมน์ (พารามิเตอร์ที่สอง) จาก dataframe ดั้งเดิม การใช้ `:` ในกรณีนี้หมายถึง "ทุกแถว" + + ```python + columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] + pumpkins = pumpkins.loc[:, columns_to_select] + ``` + +### ขั้นที่สอง คำนวณราคาฟักทองเฉลี่ย + +ลองคิดดูว่าจะคำนวณราคาฟักทองเฉลี่ยในแต่ละเดือนได้อย่างไร คอลัมน์ใดที่คุณจะเลือกสำหรับงานนี้? คำใบ้: คุณจะต้องใช้ 3 คอลัมน์ + +วิธีแก้ปัญหา: คำนวณค่าเฉลี่ยของคอลัมน์ `Low Price` และ `High Price` เพื่อเติมคอลัมน์ Price ใหม่ และแปลงคอลัมน์ Date ให้แสดงเฉพาะเดือน โชคดีที่จากการตรวจสอบข้างต้น ไม่มีข้อมูลที่ขาดหายไปสำหรับวันที่หรือราคา + +1. เพื่อคำนวณค่าเฉลี่ย ให้เพิ่มโค้ดต่อไปนี้: + + ```python + price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 + + month = pd.DatetimeIndex(pumpkins['Date']).month + + ``` + + ✅ คุณสามารถพิมพ์ข้อมูลใด ๆ ที่คุณต้องการตรวจสอบโดยใช้ `print(month)` + +2. ตอนนี้ คัดลอกข้อมูลที่แปลงแล้วไปยัง Pandas dataframe ใหม่: + + ```python + new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) + ``` + + การพิมพ์ dataframe ของคุณจะแสดงชุดข้อมูลที่สะอาดและเป็นระเบียบ ซึ่งคุณสามารถใช้สร้างโมเดลการถดถอยใหม่ได้ + +### แต่เดี๋ยวก่อน! มีบางอย่างแปลก ๆ + +หากคุณดูที่คอลัมน์ `Package` ฟักทองถูกขายในรูปแบบที่หลากหลาย บางรายการขายในหน่วย '1 1/9 bushel' บางรายการใน '1/2 bushel' บางรายการต่อฟักทอง บางรายการต่อปอนด์ และบางรายการในกล่องใหญ่ที่มีความกว้างต่างกัน + +> ฟักทองดูเหมือนจะยากต่อการชั่งน้ำหนักอย่างสม่ำเสมอ + +เมื่อเจาะลึกลงไปในข้อมูลดั้งเดิม จะพบว่าสิ่งที่มี `Unit of Sale` เท่ากับ 'EACH' หรือ 'PER BIN' ก็มีประเภท `Package` เป็นต่อนิ้ว ต่อถัง หรือ 'each' ฟักทองดูเหมือนจะยากต่อการชั่งน้ำหนักอย่างสม่ำเสมอ ดังนั้นให้กรองโดยเลือกเฉพาะฟักทองที่มีคำว่า 'bushel' ในคอลัมน์ `Package` + +1. เพิ่มตัวกรองที่ด้านบนของไฟล์ ใต้การนำเข้า .csv เริ่มต้น: + + ```python + pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] + ``` + + หากคุณพิมพ์ข้อมูลตอนนี้ คุณจะเห็นว่าคุณได้รับเพียงประมาณ 415 แถวของข้อมูลที่มีฟักทองตาม bushel + +### แต่เดี๋ยวก่อน! ยังมีอีกสิ่งที่ต้องทำ + +คุณสังเกตเห็นหรือไม่ว่าปริมาณ bushel แตกต่างกันในแต่ละแถว? คุณต้องปรับราคามาตรฐานเพื่อแสดงราคาต่อ bushel ดังนั้นให้ทำการคำนวณเพื่อทำให้เป็นมาตรฐาน + +1. เพิ่มบรรทัดเหล่านี้หลังบล็อกที่สร้าง dataframe `new_pumpkins`: + + ```python + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) + + new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) + ``` + +✅ ตามที่ [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) ระบุ น้ำหนักของ bushel ขึ้นอยู่กับประเภทของผลผลิต เนื่องจากเป็นการวัดปริมาตร "bushel ของมะเขือเทศ ตัวอย่างเช่น ควรมีน้ำหนัก 56 ปอนด์... ใบและผักใบเขียวใช้พื้นที่มากกว่าแต่น้ำหนักน้อยกว่า ดังนั้น bushel ของผักโขมจึงมีน้ำหนักเพียง 20 ปอนด์" มันค่อนข้างซับซ้อน! เราจะไม่ยุ่งกับการแปลง bushel เป็นปอนด์ และแทนที่จะใช้ราคาต่อ bushel การศึกษาทั้งหมดนี้เกี่ยวกับ bushel ของฟักทองแสดงให้เห็นว่าการเข้าใจลักษณะของข้อมูลของคุณมีความสำคัญเพียงใด! + +ตอนนี้ คุณสามารถวิเคราะห์ราคาต่อหน่วยตามการวัด bushel ได้ หากคุณพิมพ์ข้อมูลอีกครั้ง คุณจะเห็นว่ามันถูกปรับมาตรฐานแล้ว + +✅ คุณสังเกตเห็นหรือไม่ว่าฟักทองที่ขายเป็นครึ่ง bushel มีราคาแพงมาก? คุณสามารถหาสาเหตุได้หรือไม่? คำใบ้: ฟักทองลูกเล็กมีราคาแพงกว่าลูกใหญ่มาก อาจเป็นเพราะมีจำนวนมากกว่าต่อลูก bushel เนื่องจากพื้นที่ว่างที่ไม่ได้ใช้ที่เกิดจากฟักทองพายลูกใหญ่ที่กลวง + +## กลยุทธ์การแสดงข้อมูล + +ส่วนหนึ่งของบทบาทของนักวิทยาศาสตร์ข้อมูลคือการแสดงคุณภาพและลักษณะของข้อมูลที่พวกเขากำลังทำงานด้วย เพื่อทำสิ่งนี้ พวกเขามักจะสร้างการแสดงผลที่น่าสนใจ เช่น แผนภาพ กราฟ และแผนภูมิที่แสดงแง่มุมต่าง ๆ ของข้อมูล ด้วยวิธีนี้ พวกเขาสามารถแสดงความสัมพันธ์และช่องว่างที่ยากจะค้นพบได้ด้วยสายตา + +[![ML สำหรับผู้เริ่มต้น - วิธีแสดงข้อมูลด้วย Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML สำหรับผู้เริ่มต้น - วิธีแสดงข้อมูลด้วย Matplotlib") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการแสดงข้อมูลสำหรับบทเรียนนี้ + +การแสดงผลยังสามารถช่วยกำหนดเทคนิคการเรียนรู้ของเครื่องที่เหมาะสมที่สุดสำหรับข้อมูลได้อีกด้วย ตัวอย่างเช่น scatterplot ที่ดูเหมือนจะเป็นเส้นตรง อาจบ่งชี้ว่าข้อมูลเหมาะสำหรับการฝึกการถดถอยเชิงเส้น + +ไลบรารีการแสดงข้อมูลที่ทำงานได้ดีใน Jupyter notebooks คือ [Matplotlib](https://matplotlib.org/) (ซึ่งคุณเคยเห็นในบทเรียนก่อนหน้า) + +> รับประสบการณ์เพิ่มเติมเกี่ยวกับการแสดงข้อมูลใน [บทเรียนเหล่านี้](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott) + +## แบบฝึกหัด - ทดลองใช้ Matplotlib + +ลองสร้างแผนภาพพื้นฐานเพื่อแสดง dataframe ใหม่ที่คุณเพิ่งสร้างขึ้น แผนภาพเส้นพื้นฐานจะแสดงอะไร? + +1. นำเข้า Matplotlib ที่ด้านบนของไฟล์ ใต้การนำเข้า Pandas: + + ```python + import matplotlib.pyplot as plt + ``` + +1. รัน notebook ทั้งหมดอีกครั้งเพื่อรีเฟรช +1. ที่ด้านล่างของ notebook เพิ่มเซลล์เพื่อสร้างแผนภาพแบบกล่อง: + + ```python + price = new_pumpkins.Price + month = new_pumpkins.Month + plt.scatter(price, month) + plt.show() + ``` + + ![scatterplot แสดงความสัมพันธ์ระหว่างราคาและเดือน](../../../../2-Regression/2-Data/images/scatterplot.png) + + นี่เป็นแผนภาพที่มีประโยชน์หรือไม่? มีอะไรที่ทำให้คุณประหลาดใจหรือไม่? + + มันไม่ค่อยมีประโยชน์นัก เนื่องจากมันแสดงเพียงการกระจายของจุดข้อมูลในแต่ละเดือน + +### ทำให้มันมีประโยชน์ + +เพื่อให้แผนภูมิแสดงข้อมูลที่มีประโยชน์ คุณมักจะต้องจัดกลุ่มข้อมูลในบางลักษณะ ลองสร้างแผนภูมิที่แกน y แสดงเดือน และข้อมูลแสดงการกระจายของข้อมูล + +1. เพิ่มเซลล์เพื่อสร้างแผนภูมิแท่งแบบกลุ่ม: + + ```python + new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') + plt.ylabel("Pumpkin Price") + ``` + + ![แผนภูมิแท่งแสดงความสัมพันธ์ระหว่างราคาและเดือน](../../../../2-Regression/2-Data/images/barchart.png) + + นี่เป็นการแสดงข้อมูลที่มีประโยชน์มากขึ้น! ดูเหมือนว่าราคาสูงสุดของฟักทองจะเกิดขึ้นในเดือนกันยายนและตุลาคม ตรงกับความคาดหวังของคุณหรือไม่? เพราะอะไร? + +--- + +## 🚀ความท้าทาย + +สำรวจประเภทต่าง ๆ ของการแสดงผลที่ Matplotlib มีให้ ประเภทใดที่เหมาะสมที่สุดสำหรับปัญหาการถดถอย? + +## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +ลองดูวิธีการแสดงข้อมูลที่หลากหลาย ทำรายการไลบรารีต่าง ๆ ที่มีอยู่และบันทึกว่าไลบรารีใดเหมาะสมที่สุดสำหรับงานประเภทใด เช่น การแสดงผล 2D เทียบกับ 3D คุณค้นพบอะไรบ้าง? + +## การบ้าน + +[สำรวจการแสดงผล](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/2-Data/assignment.md b/translations/th/2-Regression/2-Data/assignment.md new file mode 100644 index 000000000..b045f3e70 --- /dev/null +++ b/translations/th/2-Regression/2-Data/assignment.md @@ -0,0 +1,23 @@ + +# การสำรวจการสร้างภาพข้อมูล + +มีไลบรารีหลายตัวที่สามารถใช้สำหรับการสร้างภาพข้อมูล ลองสร้างภาพข้อมูลโดยใช้ข้อมูล Pumpkin ในบทเรียนนี้ด้วย matplotlib และ seaborn ในตัวอย่างโน้ตบุ๊ก ไลบรารีใดที่ใช้งานง่ายกว่า? + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| -------- | --------- | -------- | ----------------- | +| | ส่งโน้ตบุ๊กที่มีการสำรวจ/การสร้างภาพข้อมูลสองแบบ | ส่งโน้ตบุ๊กที่มีการสำรวจ/การสร้างภาพข้อมูลหนึ่งแบบ | ไม่ได้ส่งโน้ตบุ๊ก | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/2-Data/solution/Julia/README.md b/translations/th/2-Regression/2-Data/solution/Julia/README.md new file mode 100644 index 000000000..9810b90a6 --- /dev/null +++ b/translations/th/2-Regression/2-Data/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/3-Linear/README.md b/translations/th/2-Regression/3-Linear/README.md new file mode 100644 index 000000000..62481f4bb --- /dev/null +++ b/translations/th/2-Regression/3-Linear/README.md @@ -0,0 +1,381 @@ + +# สร้างโมเดลการถดถอยด้วย Scikit-learn: การถดถอย 4 วิธี + +![อินโฟกราฟิกการถดถอยเชิงเส้นและพหุนาม](../../../../2-Regression/3-Linear/images/linear-polynomial.png) +> อินโฟกราฟิกโดย [Dasani Madipalli](https://twitter.com/dasani_decoded) +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +> ### [บทเรียนนี้มีในภาษา R ด้วย!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html) +### บทนำ + +จนถึงตอนนี้ คุณได้สำรวจว่าการถดถอยคืออะไรโดยใช้ตัวอย่างข้อมูลจากชุดข้อมูลราคาฟักทองที่เราจะใช้ตลอดบทเรียนนี้ คุณยังได้สร้างภาพข้อมูลด้วย Matplotlib แล้ว + +ตอนนี้คุณพร้อมที่จะเจาะลึกเกี่ยวกับการถดถอยสำหรับการเรียนรู้ของเครื่อง (ML) การสร้างภาพช่วยให้คุณเข้าใจข้อมูล แต่พลังที่แท้จริงของการเรียนรู้ของเครื่องมาจาก _การฝึกโมเดล_ โมเดลถูกฝึกด้วยข้อมูลในอดีตเพื่อจับความสัมพันธ์ของข้อมูลโดยอัตโนมัติ และช่วยให้คุณคาดการณ์ผลลัพธ์สำหรับข้อมูลใหม่ที่โมเดลไม่เคยเห็นมาก่อน + +ในบทเรียนนี้ คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับการถดถอยสองประเภท: _การถดถอยเชิงเส้นพื้นฐาน_ และ _การถดถอยพหุนาม_ พร้อมกับคณิตศาสตร์บางส่วนที่อยู่เบื้องหลังเทคนิคเหล่านี้ โมเดลเหล่านี้จะช่วยให้เราคาดการณ์ราคาฟักทองตามข้อมูลอินพุตที่แตกต่างกัน + +[![ML สำหรับผู้เริ่มต้น - เข้าใจการถดถอยเชิงเส้น](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "ML สำหรับผู้เริ่มต้น - เข้าใจการถดถอยเชิงเส้น") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการถดถอยเชิงเส้น + +> ตลอดหลักสูตรนี้ เราสมมติว่าคุณมีความรู้ทางคณิตศาสตร์เพียงเล็กน้อย และพยายามทำให้เข้าใจง่ายสำหรับนักเรียนที่มาจากสาขาอื่น ดังนั้นโปรดสังเกตบันทึก 🧮 คำอธิบายภาพ และเครื่องมือการเรียนรู้อื่น ๆ เพื่อช่วยในการทำความเข้าใจ + +### ความรู้พื้นฐานที่ควรมี + +ตอนนี้คุณควรคุ้นเคยกับโครงสร้างของข้อมูลฟักทองที่เรากำลังตรวจสอบ คุณสามารถค้นหาข้อมูลนี้ที่โหลดไว้ล่วงหน้าและทำความสะอาดไว้ในไฟล์ _notebook.ipynb_ ของบทเรียนนี้ ในไฟล์นี้ ราคาฟักทองจะแสดงต่อบุชเชลใน DataFrame ใหม่ ตรวจสอบให้แน่ใจว่าคุณสามารถรันโน้ตบุ๊กเหล่านี้ในเคอร์เนลของ Visual Studio Code ได้ + +### การเตรียมตัว + +เพื่อเป็นการทบทวน คุณกำลังโหลดข้อมูลนี้เพื่อถามคำถามเกี่ยวกับข้อมูล เช่น: + +- ช่วงเวลาใดที่ดีที่สุดในการซื้อฟักทอง? +- ราคาที่คาดหวังสำหรับฟักทองขนาดเล็กหนึ่งกล่องคือเท่าไร? +- ควรซื้อฟักทองในตะกร้าครึ่งบุชเชลหรือในกล่องขนาด 1 1/9 บุชเชล? + +มาดำดิ่งลงไปในข้อมูลนี้กันต่อ + +ในบทเรียนก่อน คุณได้สร้าง Pandas DataFrame และเติมข้อมูลบางส่วนจากชุดข้อมูลต้นฉบับ โดยการปรับมาตรฐานราคาต่อบุชเชล อย่างไรก็ตาม คุณสามารถรวบรวมข้อมูลได้เพียงประมาณ 400 จุดข้อมูล และเฉพาะในช่วงฤดูใบไม้ร่วงเท่านั้น + +ลองดูข้อมูลที่โหลดไว้ล่วงหน้าในโน้ตบุ๊กที่มาพร้อมกับบทเรียนนี้ ข้อมูลถูกโหลดไว้ล่วงหน้าและมีการสร้างกราฟกระจายเบื้องต้นเพื่อแสดงข้อมูลตามเดือน บางทีเราอาจได้รายละเอียดเพิ่มเติมเกี่ยวกับลักษณะของข้อมูลโดยการทำความสะอาดข้อมูลเพิ่มเติม + +## เส้นการถดถอยเชิงเส้น + +ตามที่คุณได้เรียนรู้ในบทเรียนที่ 1 เป้าหมายของการถดถอยเชิงเส้นคือการวาดเส้นเพื่อ: + +- **แสดงความสัมพันธ์ของตัวแปร** แสดงความสัมพันธ์ระหว่างตัวแปร +- **ทำการคาดการณ์** คาดการณ์ตำแหน่งของจุดข้อมูลใหม่ในความสัมพันธ์กับเส้นนั้นอย่างแม่นยำ + +โดยทั่วไป **Least-Squares Regression** จะใช้ในการวาดเส้นประเภทนี้ คำว่า 'least-squares' หมายถึงการนำจุดข้อมูลทั้งหมดรอบเส้นการถดถอยมายกกำลังสองและรวมเข้าด้วยกัน โดยอุดมคติแล้ว ผลรวมสุดท้ายควรมีค่าน้อยที่สุด เพราะเราต้องการข้อผิดพลาดที่น้อยที่สุด หรือ `least-squares` + +เราทำเช่นนี้เพราะเราต้องการสร้างโมเดลเส้นที่มีระยะทางสะสมจากจุดข้อมูลทั้งหมดน้อยที่สุด นอกจากนี้ เรายังยกกำลังสองก่อนรวมกันเพราะเราสนใจขนาดของค่ามากกว่าทิศทาง + +> **🧮 แสดงคณิตศาสตร์ให้ฉันดู** +> +> เส้นนี้เรียกว่า _เส้นที่เหมาะสมที่สุด_ สามารถแสดงได้ด้วย [สมการ](https://en.wikipedia.org/wiki/Simple_linear_regression): +> +> ``` +> Y = a + bX +> ``` +> +> `X` คือ 'ตัวแปรอธิบาย' `Y` คือ 'ตัวแปรตาม' ความชันของเส้นคือ `b` และ `a` คือจุดตัดแกน Y ซึ่งหมายถึงค่าของ `Y` เมื่อ `X = 0` +> +>![คำนวณความชัน](../../../../2-Regression/3-Linear/images/slope.png) +> +> ขั้นแรก คำนวณความชัน `b` อินโฟกราฟิกโดย [Jen Looper](https://twitter.com/jenlooper) +> +> กล่าวอีกนัยหนึ่ง และอ้างอิงจากคำถามดั้งเดิมของข้อมูลฟักทอง: "คาดการณ์ราคาฟักทองต่อบุชเชลตามเดือน" `X` จะหมายถึงราคา และ `Y` จะหมายถึงเดือนที่ขาย +> +>![สมการที่สมบูรณ์](../../../../2-Regression/3-Linear/images/calculation.png) +> +> คำนวณค่าของ Y ถ้าคุณจ่ายประมาณ $4 นั่นอาจเป็นเดือนเมษายน! อินโฟกราฟิกโดย [Jen Looper](https://twitter.com/jenlooper) +> +> คณิตศาสตร์ที่คำนวณเส้นต้องแสดงความชันของเส้น ซึ่งขึ้นอยู่กับจุดตัดแกนด้วย หรือค่าที่ `Y` อยู่เมื่อ `X = 0` +> +> คุณสามารถดูวิธีการคำนวณค่าต่าง ๆ เหล่านี้ได้ที่เว็บไซต์ [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) และเยี่ยมชม [เครื่องคำนวณ Least-squares](https://www.mathsisfun.com/data/least-squares-calculator.html) เพื่อดูว่าค่าต่าง ๆ ส่งผลต่อเส้นอย่างไร + +## ความสัมพันธ์ + +อีกคำหนึ่งที่ควรเข้าใจคือ **ค่าสัมประสิทธิ์ความสัมพันธ์** ระหว่างตัวแปร X และ Y ที่กำหนด การใช้กราฟกระจาย คุณสามารถมองเห็นค่าสัมประสิทธิ์นี้ได้อย่างรวดเร็ว กราฟที่มีจุดข้อมูลกระจายเป็นเส้นเรียบมีความสัมพันธ์สูง แต่กราฟที่มีจุดข้อมูลกระจายไปทั่วระหว่าง X และ Y มีความสัมพันธ์ต่ำ + +โมเดลการถดถอยเชิงเส้นที่ดีจะเป็นโมเดลที่มีค่าสัมประสิทธิ์ความสัมพันธ์สูง (ใกล้ 1 มากกว่า 0) โดยใช้วิธี Least-Squares Regression พร้อมเส้นการถดถอย + +✅ รันโน้ตบุ๊กที่มาพร้อมกับบทเรียนนี้และดูกราฟกระจายของข้อมูลเดือนกับราคา ข้อมูลที่เชื่อมโยงเดือนกับราคาสำหรับการขายฟักทองดูเหมือนจะมีความสัมพันธ์สูงหรือต่ำตามการตีความด้วยสายตาของคุณ? ความสัมพันธ์นั้นเปลี่ยนไปหรือไม่หากคุณใช้มาตรการที่ละเอียดกว่า เช่น *วันในปี* (เช่น จำนวนวันตั้งแต่ต้นปี)? + +ในโค้ดด้านล่าง เราจะสมมติว่าเราได้ทำความสะอาดข้อมูลแล้ว และได้ DataFrame ที่เรียกว่า `new_pumpkins` ซึ่งมีลักษณะดังนี้: + +ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price +---|-------|-----------|---------|------|---------|-----------|------------|------- +70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 +71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 +72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636 +73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545 +74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364 + +> โค้ดสำหรับทำความสะอาดข้อมูลมีอยู่ใน [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb) เราได้ทำตามขั้นตอนการทำความสะอาดเดียวกับในบทเรียนก่อน และได้คำนวณคอลัมน์ `DayOfYear` โดยใช้สูตรต่อไปนี้: + +```python +day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days) +``` + +เมื่อคุณเข้าใจคณิตศาสตร์เบื้องหลังการถดถอยเชิงเส้นแล้ว มาสร้างโมเดลการถดถอยเพื่อดูว่าเราสามารถคาดการณ์ได้หรือไม่ว่าชุดฟักทองใดจะมีราคาที่ดีที่สุดสำหรับฟักทอง ผู้ที่ซื้อฟักทองสำหรับแปลงฟักทองในวันหยุดอาจต้องการข้อมูลนี้เพื่อเพิ่มประสิทธิภาพการซื้อชุดฟักทองสำหรับแปลง + +## การมองหาความสัมพันธ์ + +[![ML สำหรับผู้เริ่มต้น - การมองหาความสัมพันธ์: กุญแจสู่การถดถอยเชิงเส้น](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "ML สำหรับผู้เริ่มต้น - การมองหาความสัมพันธ์: กุญแจสู่การถดถอยเชิงเส้น") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับความสัมพันธ์ + +จากบทเรียนก่อน คุณอาจเห็นว่าราคาเฉลี่ยสำหรับแต่ละเดือนมีลักษณะดังนี้: + +ราคาเฉลี่ยตามเดือน + +สิ่งนี้ชี้ให้เห็นว่าควรมีความสัมพันธ์บางอย่าง และเราสามารถลองฝึกโมเดลการถดถอยเชิงเส้นเพื่อคาดการณ์ความสัมพันธ์ระหว่าง `Month` และ `Price` หรือระหว่าง `DayOfYear` และ `Price` นี่คือกราฟกระจายที่แสดงความสัมพันธ์หลัง: + +กราฟกระจายของราคาเทียบกับวันในปี + +มาดูกันว่ามีความสัมพันธ์หรือไม่โดยใช้ฟังก์ชัน `corr`: + +```python +print(new_pumpkins['Month'].corr(new_pumpkins['Price'])) +print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price'])) +``` + +ดูเหมือนว่าความสัมพันธ์จะค่อนข้างต่ำ -0.15 โดย `Month` และ -0.17 โดย `DayOfMonth` แต่ก็อาจมีความสัมพันธ์ที่สำคัญอื่น ๆ ดูเหมือนว่าจะมีคลัสเตอร์ราคาที่แตกต่างกันซึ่งสอดคล้องกับพันธุ์ฟักทองที่แตกต่างกัน เพื่อยืนยันสมมติฐานนี้ ลองพล็อตแต่ละหมวดหมู่ฟักทองโดยใช้สีที่แตกต่างกัน โดยการส่งพารามิเตอร์ `ax` ไปยังฟังก์ชัน `scatter` เราสามารถพล็อตจุดทั้งหมดในกราฟเดียวกัน: + +```python +ax=None +colors = ['red','blue','green','yellow'] +for i,var in enumerate(new_pumpkins['Variety'].unique()): + df = new_pumpkins[new_pumpkins['Variety']==var] + ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var) +``` + +กราฟกระจายของราคาเทียบกับวันในปี + +การตรวจสอบของเราชี้ให้เห็นว่าพันธุ์มีผลต่อราคามากกว่าวันที่ขาย เราสามารถเห็นสิ่งนี้ได้จากกราฟแท่ง: + +```python +new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar') +``` + +กราฟแท่งของราคาเทียบกับพันธุ์ + +ให้เรามุ่งเน้นไปที่พันธุ์ฟักทองชนิดเดียวคือ 'pie type' และดูว่าผลของวันที่มีต่อราคาเป็นอย่างไร: + +```python +pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE'] +pie_pumpkins.plot.scatter('DayOfYear','Price') +``` +กราฟกระจายของราคาเทียบกับวันในปี + +หากเราคำนวณความสัมพันธ์ระหว่าง `Price` และ `DayOfYear` โดยใช้ฟังก์ชัน `corr` ตอนนี้ เราจะได้ค่าประมาณ `-0.27` - ซึ่งหมายความว่าการฝึกโมเดลการคาดการณ์มีเหตุผล + +> ก่อนการฝึกโมเดลการถดถอยเชิงเส้น สิ่งสำคัญคือต้องแน่ใจว่าข้อมูลของเราสะอาด การถดถอยเชิงเส้นไม่ทำงานได้ดีนักกับค่าที่ขาดหายไป ดังนั้นจึงสมควรที่จะลบเซลล์ว่างทั้งหมด: + +```python +pie_pumpkins.dropna(inplace=True) +pie_pumpkins.info() +``` + +อีกวิธีหนึ่งคือเติมค่าที่ว่างเปล่าด้วยค่ามeanจากคอลัมน์ที่เกี่ยวข้อง + +## การถดถอยเชิงเส้นแบบง่าย + +[![ML สำหรับผู้เริ่มต้น - การถดถอยเชิงเส้นและพหุนามด้วย Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "ML สำหรับผู้เริ่มต้น - การถดถอยเชิงเส้นและพหุนามด้วย Scikit-learn") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการถดถอยเชิงเส้นและพหุนาม + +ในการฝึกโมเดลการถดถอยเชิงเส้น เราจะใช้ไลบรารี **Scikit-learn** + +```python +from sklearn.linear_model import LinearRegression +from sklearn.metrics import mean_squared_error +from sklearn.model_selection import train_test_split +``` + +เริ่มต้นด้วยการแยกค่าข้อมูลอินพุต (features) และผลลัพธ์ที่คาดหวัง (label) ออกเป็นอาเรย์ numpy แยกกัน: + +```python +X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1) +y = pie_pumpkins['Price'] +``` + +> โปรดทราบว่าเราต้องใช้ `reshape` กับข้อมูลอินพุตเพื่อให้แพ็กเกจ Linear Regression เข้าใจได้อย่างถูกต้อง Linear Regression คาดหวังอาเรย์ 2 มิติเป็นอินพุต โดยที่แต่ละแถวของอาเรย์สอดคล้องกับเวกเตอร์ของฟีเจอร์อินพุต ในกรณีของเรา เนื่องจากเรามีอินพุตเพียงหนึ่งตัว - เราต้องการอาเรย์ที่มีรูปร่าง N×1 โดยที่ N คือขนาดของชุดข้อมูล + +จากนั้น เราต้องแบ่งข้อมูลออกเป็นชุดข้อมูลการฝึกและการทดสอบ เพื่อให้เราสามารถตรวจสอบความถูกต้องของโมเดลหลังการฝึกได้: + +```python +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) +``` + +สุดท้าย การฝึกโมเดลการถดถอยเชิงเส้นจริงใช้เพียงสองบรรทัดโค้ด เรากำหนดออบเจ็กต์ `LinearRegression` และปรับให้เข้ากับข้อมูลของเราโดยใช้เมธอด `fit`: + +```python +lin_reg = LinearRegression() +lin_reg.fit(X_train,y_train) +``` + +ออบเจ็กต์ `LinearRegression` หลังจาก `fit` จะมีสัมประสิทธิ์ทั้งหมดของการถดถอย ซึ่งสามารถเข้าถึงได้โดยใช้คุณสมบัติ `.coef_` ในกรณีของเรา มีเพียงสัมประสิทธิ์เดียว ซึ่งควรอยู่ที่ประมาณ `-0.017` ซึ่งหมายความว่าราคาดูเหมือนจะลดลงเล็กน้อยตามเวลา แต่ไม่มากนัก ประมาณ 2 เซนต์ต่อวัน นอกจากนี้เรายังสามารถเข้าถึงจุดตัดแกน Y ของการถดถอยได้โดยใช้ `lin_reg.intercept_` - ซึ่งจะอยู่ที่ประมาณ `21` ในกรณีของเรา ซึ่งบ่งชี้ถึงราคาต้นปี + +เพื่อดูว่าโมเดลของเรามีความแม่นยำเพียงใด เราสามารถคาดการณ์ราคาบนชุดข้อมูลทดสอบ และวัดว่าการคาดการณ์ของเราใกล้เคียงกับค่าที่คาดหวังเพียงใด สิ่งนี้สามารถทำได้โดยใช้เมตริก Mean Square Error (MSE) ซึ่งเป็นค่าเฉลี่ยของผลต่างกำลังสองทั้งหมดระหว่างค่าที่คาดหวังและค่าที่คาดการณ์ + +```python +pred = lin_reg.predict(X_test) + +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') +``` +ข้อผิดพลาดของเราดูเหมือนจะอยู่ที่ประมาณ 2 จุด ซึ่งคิดเป็น ~17% ไม่ค่อยดีนัก ตัวบ่งชี้อีกตัวหนึ่งของคุณภาพโมเดลคือ **ค่าสัมประสิทธิ์การกำหนด** ซึ่งสามารถหาได้ดังนี้: + +```python +score = lin_reg.score(X_train,y_train) +print('Model determination: ', score) +``` +หากค่ามีค่าเท่ากับ 0 หมายความว่าโมเดลไม่ได้คำนึงถึงข้อมูลนำเข้า และทำหน้าที่เป็น *ตัวทำนายเชิงเส้นที่แย่ที่สุด* ซึ่งเป็นเพียงค่าเฉลี่ยของผลลัพธ์เท่านั้น ค่าที่เท่ากับ 1 หมายความว่าเราสามารถทำนายผลลัพธ์ที่คาดหวังได้อย่างสมบูรณ์แบบ ในกรณีของเรา ค่าสัมประสิทธิ์อยู่ที่ประมาณ 0.06 ซึ่งค่อนข้างต่ำ + +เรายังสามารถสร้างกราฟข้อมูลทดสอบพร้อมกับเส้นการถดถอยเพื่อดูว่าการถดถอยทำงานอย่างไรในกรณีของเรา: + +```python +plt.scatter(X_test,y_test) +plt.plot(X_test,pred) +``` + +Linear regression + +## การถดถอยเชิงพหุนาม + +อีกประเภทหนึ่งของการถดถอยเชิงเส้นคือการถดถอยเชิงพหุนาม บางครั้งความสัมพันธ์ระหว่างตัวแปรอาจเป็นเชิงเส้น เช่น ยิ่งฟักทองมีปริมาตรมาก ราคาก็ยิ่งสูงขึ้น แต่บางครั้งความสัมพันธ์เหล่านี้ไม่สามารถวาดเป็นระนาบหรือเส้นตรงได้ + +✅ [ตัวอย่างเพิ่มเติม](https://online.stat.psu.edu/stat501/lesson/9/9.8) ของข้อมูลที่สามารถใช้การถดถอยเชิงพหุนาม + +ลองดูความสัมพันธ์ระหว่างวันที่และราคาอีกครั้ง กราฟกระจายนี้ดูเหมือนควรจะวิเคราะห์ด้วยเส้นตรงหรือไม่? ราคาสามารถผันผวนได้หรือไม่? ในกรณีนี้ คุณสามารถลองใช้การถดถอยเชิงพหุนาม + +✅ พหุนามเป็นนิพจน์ทางคณิตศาสตร์ที่อาจประกอบด้วยตัวแปรและสัมประสิทธิ์หนึ่งตัวหรือมากกว่า + +การถดถอยเชิงพหุนามสร้างเส้นโค้งเพื่อให้เหมาะสมกับข้อมูลที่ไม่เป็นเชิงเส้นได้ดียิ่งขึ้น ในกรณีของเรา หากเรารวมตัวแปร `DayOfYear` กำลังสองเข้าไปในข้อมูลนำเข้า เราควรจะสามารถปรับข้อมูลของเราให้เข้ากับเส้นโค้งพาราโบลา ซึ่งจะมีค่าต่ำสุดในช่วงเวลาหนึ่งของปี + +Scikit-learn มี [API pipeline](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) ที่มีประโยชน์สำหรับการรวมขั้นตอนต่างๆ ของการประมวลผลข้อมูลเข้าด้วยกัน **Pipeline** คือชุดของ **estimators** ในกรณีของเรา เราจะสร้าง pipeline ที่เพิ่มคุณสมบัติพหุนามให้กับโมเดลของเรา และฝึกการถดถอย: + +```python +from sklearn.preprocessing import PolynomialFeatures +from sklearn.pipeline import make_pipeline + +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) + +pipeline.fit(X_train,y_train) +``` + +การใช้ `PolynomialFeatures(2)` หมายความว่าเราจะรวมพหุนามระดับสองทั้งหมดจากข้อมูลนำเข้า ในกรณีของเราจะหมายถึงเพียง `DayOfYear`2 แต่หากมีตัวแปรนำเข้าสองตัว X และ Y จะเพิ่ม X2, XY และ Y2 เราอาจใช้พหุนามระดับสูงกว่านี้หากต้องการ + +Pipeline สามารถใช้งานได้ในลักษณะเดียวกับวัตถุ `LinearRegression` ดั้งเดิม เช่น เราสามารถ `fit` pipeline และใช้ `predict` เพื่อรับผลการทำนาย นี่คือกราฟที่แสดงข้อมูลทดสอบและเส้นโค้งประมาณค่า: + +Polynomial regression + +การใช้การถดถอยเชิงพหุนาม เราสามารถลดค่า MSE และเพิ่มค่าสัมประสิทธิ์การกำหนดได้เล็กน้อย แต่ไม่มากนัก เราจำเป็นต้องพิจารณาคุณสมบัติอื่นๆ ด้วย! + +> คุณจะเห็นว่าราคาฟักทองต่ำสุดจะอยู่ประมาณวันฮาโลวีน คุณจะอธิบายเรื่องนี้ได้อย่างไร? + +🎃 ยินดีด้วย คุณเพิ่งสร้างโมเดลที่สามารถช่วยทำนายราคาฟักทองสำหรับทำพาย คุณอาจทำขั้นตอนเดียวกันนี้ซ้ำสำหรับฟักทองทุกประเภท แต่จะค่อนข้างน่าเบื่อ มาเรียนรู้วิธีนำประเภทฟักทองมาพิจารณาในโมเดลของเรากันเถอะ! + +## คุณสมบัติประเภทหมวดหมู่ + +ในโลกอุดมคติ เราต้องการสามารถทำนายราคาสำหรับฟักทองหลากหลายประเภทโดยใช้โมเดลเดียว อย่างไรก็ตาม คอลัมน์ `Variety` นั้นแตกต่างจากคอลัมน์อย่าง `Month` เพราะมันมีค่าที่ไม่ใช่ตัวเลข คอลัมน์เหล่านี้เรียกว่า **หมวดหมู่** + +[![ML for beginners - Categorical Feature Predictions with Linear Regression](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้นๆ เกี่ยวกับการใช้คุณสมบัติประเภทหมวดหมู่ + +นี่คือกราฟที่แสดงให้เห็นว่าราคาเฉลี่ยขึ้นอยู่กับประเภทฟักทองอย่างไร: + +Average price by variety + +เพื่อพิจารณาประเภทฟักทอง เราต้องแปลงมันเป็นรูปแบบตัวเลขก่อน หรือ **เข้ารหัส** มีหลายวิธีที่เราสามารถทำได้: + +* การเข้ารหัสตัวเลขแบบง่ายจะสร้างตารางของประเภทฟักทองต่างๆ และแทนที่ชื่อประเภทฟักทองด้วยดัชนีในตารางนั้น วิธีนี้ไม่เหมาะสำหรับการถดถอยเชิงเส้น เพราะการถดถอยเชิงเส้นจะใช้ค่าตัวเลขของดัชนีจริงๆ และเพิ่มเข้าไปในผลลัพธ์โดยการคูณด้วยสัมประสิทธิ์ ในกรณีของเรา ความสัมพันธ์ระหว่างหมายเลขดัชนีและราคานั้นชัดเจนว่าไม่เป็นเชิงเส้น แม้ว่าเราจะจัดลำดับดัชนีในลักษณะเฉพาะก็ตาม +* **การเข้ารหัสแบบ one-hot** จะเปลี่ยนคอลัมน์ `Variety` เป็น 4 คอลัมน์ที่แตกต่างกัน หนึ่งคอลัมน์สำหรับแต่ละประเภทฟักทอง แต่ละคอลัมน์จะมีค่า `1` หากแถวที่เกี่ยวข้องเป็นประเภทฟักทองนั้น และ `0` หากไม่ใช่ นั่นหมายความว่าจะมีสัมประสิทธิ์สี่ตัวในการถดถอยเชิงเส้น หนึ่งตัวสำหรับแต่ละประเภทฟักทอง ซึ่งรับผิดชอบ "ราคาเริ่มต้น" (หรือ "ราคาที่เพิ่มขึ้น") สำหรับประเภทนั้นๆ + +โค้ดด้านล่างแสดงวิธีการเข้ารหัสแบบ one-hot สำหรับประเภทฟักทอง: + +```python +pd.get_dummies(new_pumpkins['Variety']) +``` + + ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE +----|-----------|-----------|--------------------------|---------- +70 | 0 | 0 | 0 | 1 +71 | 0 | 0 | 0 | 1 +... | ... | ... | ... | ... +1738 | 0 | 1 | 0 | 0 +1739 | 0 | 1 | 0 | 0 +1740 | 0 | 1 | 0 | 0 +1741 | 0 | 1 | 0 | 0 +1742 | 0 | 1 | 0 | 0 + +เพื่อฝึกการถดถอยเชิงเส้นโดยใช้ประเภทฟักทองที่เข้ารหัสแบบ one-hot เป็นข้อมูลนำเข้า เราเพียงแค่ต้องกำหนดข้อมูล `X` และ `y` ให้ถูกต้อง: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) +y = new_pumpkins['Price'] +``` + +โค้ดที่เหลือเหมือนกับที่เราใช้ด้านบนเพื่อฝึกการถดถอยเชิงเส้น หากคุณลอง คุณจะเห็นว่าค่า MSE ใกล้เคียงกัน แต่เราจะได้ค่าสัมประสิทธิ์การกำหนดที่สูงขึ้น (~77%) เพื่อให้การทำนายแม่นยำยิ่งขึ้น เราสามารถนำคุณสมบัติประเภทหมวดหมู่อื่นๆ มาพิจารณา รวมถึงคุณสมบัติตัวเลข เช่น `Month` หรือ `DayOfYear` เพื่อสร้างชุดข้อมูลคุณสมบัติขนาดใหญ่ เราสามารถใช้ `join`: + +```python +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] +``` + +ที่นี่เรายังพิจารณา `City` และประเภท `Package` ซึ่งให้ค่า MSE 2.84 (10%) และค่าสัมประสิทธิ์การกำหนด 0.94! + +## รวมทุกอย่างเข้าด้วยกัน + +เพื่อสร้างโมเดลที่ดีที่สุด เราสามารถใช้ข้อมูลที่รวมกัน (ประเภทหมวดหมู่ที่เข้ารหัสแบบ one-hot + ตัวเลข) จากตัวอย่างด้านบนร่วมกับการถดถอยเชิงพหุนาม นี่คือโค้ดทั้งหมดเพื่อความสะดวกของคุณ: + +```python +# set up training data +X = pd.get_dummies(new_pumpkins['Variety']) \ + .join(new_pumpkins['Month']) \ + .join(pd.get_dummies(new_pumpkins['City'])) \ + .join(pd.get_dummies(new_pumpkins['Package'])) +y = new_pumpkins['Price'] + +# make train-test split +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + +# setup and train the pipeline +pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) +pipeline.fit(X_train,y_train) + +# predict results for test data +pred = pipeline.predict(X_test) + +# calculate MSE and determination +mse = np.sqrt(mean_squared_error(y_test,pred)) +print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)') + +score = pipeline.score(X_train,y_train) +print('Model determination: ', score) +``` + +สิ่งนี้ควรให้ค่าสัมประสิทธิ์การกำหนดที่ดีที่สุดเกือบ 97% และ MSE=2.23 (~8% ข้อผิดพลาดในการทำนาย) + +| โมเดล | MSE | ค่าสัมประสิทธิ์การกำหนด | +|-------|-----|---------------------------| +| `DayOfYear` Linear | 2.77 (17.2%) | 0.07 | +| `DayOfYear` Polynomial | 2.73 (17.0%) | 0.08 | +| `Variety` Linear | 5.24 (19.7%) | 0.77 | +| All features Linear | 2.84 (10.5%) | 0.94 | +| All features Polynomial | 2.23 (8.25%) | 0.97 | + +🏆 ยอดเยี่ยม! คุณสร้างโมเดลการถดถอย 4 โมเดลในบทเรียนเดียว และปรับปรุงคุณภาพโมเดลได้ถึง 97% ในส่วนสุดท้ายเกี่ยวกับการถดถอย คุณจะได้เรียนรู้เกี่ยวกับการถดถอยโลจิสติกเพื่อกำหนดหมวดหมู่ + +--- +## 🚀ความท้าทาย + +ทดสอบตัวแปรต่างๆ ในโน้ตบุ๊กนี้เพื่อดูว่าความสัมพันธ์สอดคล้องกับความแม่นยำของโมเดลอย่างไร + +## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +ในบทเรียนนี้เราได้เรียนรู้เกี่ยวกับการถดถอยเชิงเส้น ยังมีประเภทการถดถอยที่สำคัญอื่นๆ อ่านเกี่ยวกับเทคนิค Stepwise, Ridge, Lasso และ Elasticnet หลักสูตรที่ดีในการศึกษาเพิ่มเติมคือ [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning) + +## งานที่ได้รับมอบหมาย + +[สร้างโมเดล](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/3-Linear/assignment.md b/translations/th/2-Regression/3-Linear/assignment.md new file mode 100644 index 000000000..66797848e --- /dev/null +++ b/translations/th/2-Regression/3-Linear/assignment.md @@ -0,0 +1,25 @@ + +# สร้างโมเดลการถดถอย + +## คำแนะนำ + +ในบทเรียนนี้ คุณได้เรียนรู้วิธีสร้างโมเดลโดยใช้ทั้งการถดถอยเชิงเส้นและการถดถอยเชิงพหุนาม ใช้ความรู้นี้เพื่อค้นหาชุดข้อมูลหรือใช้ชุดข้อมูลที่มีอยู่ใน Scikit-learn เพื่อสร้างโมเดลใหม่ อธิบายในโน้ตบุ๊กของคุณว่าทำไมคุณถึงเลือกเทคนิคที่ใช้ และแสดงความแม่นยำของโมเดล หากโมเดลไม่แม่นยำ ให้ชี้แจงเหตุผล + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| ------ | ----------------------------------------------------------- | -------------------------- | ------------------------------ | +| | นำเสนอโน้ตบุ๊กที่สมบูรณ์พร้อมคำอธิบายที่ชัดเจน | คำตอบไม่สมบูรณ์ | คำตอบมีข้อผิดพลาดหรือบั๊ก | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์มืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/3-Linear/solution/Julia/README.md b/translations/th/2-Regression/3-Linear/solution/Julia/README.md new file mode 100644 index 000000000..7decc3b1c --- /dev/null +++ b/translations/th/2-Regression/3-Linear/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/4-Logistic/README.md b/translations/th/2-Regression/4-Logistic/README.md new file mode 100644 index 000000000..d8b57d688 --- /dev/null +++ b/translations/th/2-Regression/4-Logistic/README.md @@ -0,0 +1,400 @@ + +# การถดถอยโลจิสติกเพื่อทำนายหมวดหมู่ + +![ภาพเปรียบเทียบการถดถอยเชิงเส้นและโลจิสติก](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png) + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +> ### [บทเรียนนี้มีในภาษา R ด้วย!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html) + +## บทนำ + +ในบทเรียนสุดท้ายเกี่ยวกับการถดถอย ซึ่งเป็นหนึ่งในเทคนิคพื้นฐานของ Machine Learning แบบคลาสสิก เราจะมาดูการถดถอยโลจิสติก คุณสามารถใช้เทคนิคนี้เพื่อค้นหารูปแบบในการทำนายหมวดหมู่แบบทวิภาค เช่น ขนมนี้เป็นช็อกโกแลตหรือไม่? โรคนี้ติดต่อหรือไม่? ลูกค้าคนนี้จะเลือกสินค้านี้หรือไม่? + +ในบทเรียนนี้ คุณจะได้เรียนรู้: + +- ไลบรารีใหม่สำหรับการแสดงผลข้อมูล +- เทคนิคสำหรับการถดถอยโลจิสติก + +✅ เพิ่มความเข้าใจเกี่ยวกับการทำงานกับการถดถอยประเภทนี้ใน [โมดูลการเรียนรู้](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott) + +## ความรู้พื้นฐานที่ควรมี + +หลังจากที่เราได้ทำงานกับข้อมูลฟักทองมาแล้ว เราคุ้นเคยพอที่จะสังเกตเห็นว่ามีหมวดหมู่แบบทวิภาคหนึ่งที่เราสามารถทำงานด้วยได้: `Color` + +เรามาสร้างโมเดลการถดถอยโลจิสติกเพื่อทำนายว่า _ฟักทองที่กำหนดมีแนวโน้มที่จะมีสีอะไร_ (สีส้ม 🎃 หรือสีขาว 👻) + +> ทำไมเราถึงพูดถึงการจัดหมวดหมู่แบบทวิภาคในบทเรียนเกี่ยวกับการถดถอย? เพื่อความสะดวกทางภาษา เนื่องจากการถดถอยโลจิสติก [จริง ๆ แล้วเป็นวิธีการจัดหมวดหมู่](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression) แม้ว่าจะเป็นวิธีที่อิงกับเส้นตรง เรียนรู้วิธีอื่น ๆ ในการจัดหมวดหมู่ข้อมูลในกลุ่มบทเรียนถัดไป + +## กำหนดคำถาม + +สำหรับจุดประสงค์ของเรา เราจะกำหนดคำถามนี้เป็นแบบทวิภาค: 'สีขาว' หรือ 'ไม่ใช่สีขาว' ในชุดข้อมูลของเรายังมีหมวดหมู่ 'ลาย' แต่มีตัวอย่างน้อยมาก ดังนั้นเราจะไม่ใช้มัน และมันจะหายไปเมื่อเราลบค่าที่เป็น null ออกจากชุดข้อมูลอยู่แล้ว + +> 🎃 ข้อเท็จจริงสนุก ๆ บางครั้งเราเรียกฟักทองสีขาวว่า 'ฟักทองผี' พวกมันแกะสลักได้ยาก ดังนั้นจึงไม่ได้รับความนิยมเท่าฟักทองสีส้ม แต่ก็ดูเท่ดี! ดังนั้นเราสามารถปรับคำถามของเราใหม่ได้ว่า: 'ฟักทองผี' หรือ 'ไม่ใช่ฟักทองผี' 👻 + +## เกี่ยวกับการถดถอยโลจิสติก + +การถดถอยโลจิสติกแตกต่างจากการถดถอยเชิงเส้นที่คุณได้เรียนรู้มาก่อนหน้านี้ในหลาย ๆ ด้านที่สำคัญ + +[![ML สำหรับผู้เริ่มต้น - ทำความเข้าใจการถดถอยโลจิสติกสำหรับการจัดหมวดหมู่ใน Machine Learning](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "ML สำหรับผู้เริ่มต้น - ทำความเข้าใจการถดถอยโลจิสติกสำหรับการจัดหมวดหมู่ใน Machine Learning") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการถดถอยโลจิสติก + +### การจัดหมวดหมู่แบบทวิภาค + +การถดถอยโลจิสติกไม่ได้ให้คุณสมบัติเช่นเดียวกับการถดถอยเชิงเส้น อันแรกให้การทำนายเกี่ยวกับหมวดหมู่แบบทวิภาค ("สีขาวหรือไม่ใช่สีขาว") ในขณะที่อันหลังสามารถทำนายค่าต่อเนื่องได้ เช่น จากแหล่งที่มาของฟักทองและเวลาการเก็บเกี่ยว _ราคาจะเพิ่มขึ้นเท่าใด_ + +![โมเดลการจัดหมวดหมู่ฟักทอง](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png) +> อินโฟกราฟิกโดย [Dasani Madipalli](https://twitter.com/dasani_decoded) + +### การจัดหมวดหมู่อื่น ๆ + +ยังมีการถดถอยโลจิสติกประเภทอื่น ๆ เช่น มัลติโนเมียลและออร์ดินัล: + +- **มัลติโนเมียล** ซึ่งเกี่ยวข้องกับการมีมากกว่าหนึ่งหมวดหมู่ - "สีส้ม สีขาว และลาย" +- **ออร์ดินัล** ซึ่งเกี่ยวข้องกับหมวดหมู่ที่มีลำดับ เช่น ฟักทองที่เรียงตามขนาดที่มีจำนวนจำกัด (เล็ก, กลาง, ใหญ่, ใหญ่มาก) + +![มัลติโนเมียล vs ออร์ดินัล](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png) + +### ตัวแปรไม่จำเป็นต้องมีความสัมพันธ์กัน + +จำได้ไหมว่าการถดถอยเชิงเส้นทำงานได้ดีกว่ากับตัวแปรที่มีความสัมพันธ์กัน? การถดถอยโลจิสติกตรงกันข้าม - ตัวแปรไม่จำเป็นต้องสอดคล้องกัน ซึ่งเหมาะกับข้อมูลนี้ที่มีความสัมพันธ์ค่อนข้างอ่อน + +### คุณต้องการข้อมูลที่สะอาดและมากพอ + +การถดถอยโลจิสติกจะให้ผลลัพธ์ที่แม่นยำมากขึ้นหากคุณใช้ข้อมูลมากขึ้น ชุดข้อมูลขนาดเล็กของเราไม่เหมาะสมที่สุดสำหรับงานนี้ ดังนั้นโปรดคำนึงถึงข้อนี้ + +[![ML สำหรับผู้เริ่มต้น - การวิเคราะห์และเตรียมข้อมูลสำหรับการถดถอยโลจิสติก](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "ML สำหรับผู้เริ่มต้น - การวิเคราะห์และเตรียมข้อมูลสำหรับการถดถอยโลจิสติก") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการเตรียมข้อมูลสำหรับการถดถอยเชิงเส้น + +✅ คิดเกี่ยวกับประเภทของข้อมูลที่เหมาะสมกับการถดถอยโลจิสติก + +## แบบฝึกหัด - ทำความสะอาดข้อมูล + +ก่อนอื่น ทำความสะอาดข้อมูลเล็กน้อยโดยลบค่าที่เป็น null และเลือกเฉพาะบางคอลัมน์: + +1. เพิ่มโค้ดต่อไปนี้: + + ```python + + columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] + pumpkins = full_pumpkins.loc[:, columns_to_select] + + pumpkins.dropna(inplace=True) + ``` + + คุณสามารถดู dataframe ใหม่ของคุณได้เสมอ: + + ```python + pumpkins.info + ``` + +### การแสดงผล - แผนภูมิหมวดหมู่ + +ตอนนี้คุณได้โหลด [สมุดบันทึกเริ่มต้น](../../../../2-Regression/4-Logistic/notebook.ipynb) พร้อมข้อมูลฟักทองอีกครั้งและทำความสะอาดเพื่อรักษาชุดข้อมูลที่มีตัวแปรบางตัว รวมถึง `Color` ลองแสดง dataframe ในสมุดบันทึกโดยใช้ไลบรารีที่แตกต่าง: [Seaborn](https://seaborn.pydata.org/index.html) ซึ่งสร้างขึ้นบน Matplotlib ที่เราใช้ก่อนหน้านี้ + +Seaborn มีวิธีที่น่าสนใจในการแสดงผลข้อมูลของคุณ ตัวอย่างเช่น คุณสามารถเปรียบเทียบการกระจายของข้อมูลสำหรับแต่ละ `Variety` และ `Color` ในแผนภูมิหมวดหมู่ + +1. สร้างแผนภูมิแบบนี้โดยใช้ฟังก์ชัน `catplot` กับข้อมูลฟักทอง `pumpkins` และระบุการจับคู่สีสำหรับแต่ละหมวดหมู่ของฟักทอง (สีส้มหรือสีขาว): + + ```python + import seaborn as sns + + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + + sns.catplot( + data=pumpkins, y="Variety", hue="Color", kind="count", + palette=palette, + ) + ``` + + ![กริดของข้อมูลที่แสดงผล](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png) + + โดยการสังเกตข้อมูล คุณสามารถเห็นได้ว่าข้อมูล `Color` เกี่ยวข้องกับ `Variety` อย่างไร + + ✅ จากแผนภูมิหมวดหมู่นี้ คุณสามารถจินตนาการถึงการสำรวจที่น่าสนใจอะไรบ้าง? + +### การเตรียมข้อมูล: การเข้ารหัสฟีเจอร์และป้ายกำกับ +ชุดข้อมูลฟักทองของเรามีค่าที่เป็นสตริงสำหรับทุกคอลัมน์ การทำงานกับข้อมูลหมวดหมู่เป็นเรื่องง่ายสำหรับมนุษย์ แต่ไม่ใช่สำหรับเครื่องจักร อัลกอริธึม Machine Learning ทำงานได้ดีกับตัวเลข นั่นคือเหตุผลที่การเข้ารหัสเป็นขั้นตอนที่สำคัญมากในกระบวนการเตรียมข้อมูล เนื่องจากช่วยให้เราสามารถเปลี่ยนข้อมูลหมวดหมู่ให้เป็นข้อมูลเชิงตัวเลขโดยไม่สูญเสียข้อมูลใด ๆ การเข้ารหัสที่ดีนำไปสู่การสร้างโมเดลที่ดี + +สำหรับการเข้ารหัสฟีเจอร์ มีตัวเข้ารหัสหลักสองประเภท: + +1. ตัวเข้ารหัสแบบลำดับ: เหมาะสำหรับตัวแปรลำดับ ซึ่งเป็นตัวแปรหมวดหมู่ที่ข้อมูลของพวกมันมีลำดับเชิงตรรกะ เช่น คอลัมน์ `Item Size` ในชุดข้อมูลของเรา มันสร้างการจับคู่ที่แต่ละหมวดหมู่แสดงด้วยตัวเลขซึ่งเป็นลำดับของหมวดหมู่ในคอลัมน์ + + ```python + from sklearn.preprocessing import OrdinalEncoder + + item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']] + ordinal_features = ['Item Size'] + ordinal_encoder = OrdinalEncoder(categories=item_size_categories) + ``` + +2. ตัวเข้ารหัสหมวดหมู่: เหมาะสำหรับตัวแปรที่ไม่มีลำดับ ซึ่งเป็นตัวแปรหมวดหมู่ที่ข้อมูลของพวกมันไม่มีลำดับเชิงตรรกะ เช่น ฟีเจอร์ทั้งหมดที่แตกต่างจาก `Item Size` ในชุดข้อมูลของเรา มันเป็นการเข้ารหัสแบบ one-hot ซึ่งหมายความว่าแต่ละหมวดหมู่แสดงด้วยคอลัมน์ไบนารี: ตัวแปรที่เข้ารหัสจะเท่ากับ 1 หากฟักทองเป็นของ `Variety` นั้น และ 0 หากไม่ใช่ + + ```python + from sklearn.preprocessing import OneHotEncoder + + categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] + categorical_encoder = OneHotEncoder(sparse_output=False) + ``` +จากนั้น `ColumnTransformer` ถูกใช้เพื่อรวมตัวเข้ารหัสหลายตัวในขั้นตอนเดียวและนำไปใช้กับคอลัมน์ที่เหมาะสม + +```python + from sklearn.compose import ColumnTransformer + + ct = ColumnTransformer(transformers=[ + ('ord', ordinal_encoder, ordinal_features), + ('cat', categorical_encoder, categorical_features) + ]) + + ct.set_output(transform='pandas') + encoded_features = ct.fit_transform(pumpkins) +``` +ในทางกลับกัน สำหรับการเข้ารหัสป้ายกำกับ เราใช้คลาส `LabelEncoder` ของ scikit-learn ซึ่งเป็นคลาสยูทิลิตี้ที่ช่วยทำให้ป้ายกำกับเป็นปกติ โดยที่ป้ายกำกับมีค่าเฉพาะระหว่าง 0 และ n_classes-1 (ที่นี่คือ 0 และ 1) + +```python + from sklearn.preprocessing import LabelEncoder + + label_encoder = LabelEncoder() + encoded_label = label_encoder.fit_transform(pumpkins['Color']) +``` +เมื่อเราเข้ารหัสฟีเจอร์และป้ายกำกับแล้ว เราสามารถรวมพวกมันเข้าด้วยกันใน dataframe ใหม่ `encoded_pumpkins` + +```python + encoded_pumpkins = encoded_features.assign(Color=encoded_label) +``` +✅ ข้อดีของการใช้ตัวเข้ารหัสแบบลำดับสำหรับคอลัมน์ `Item Size` คืออะไร? + +### วิเคราะห์ความสัมพันธ์ระหว่างตัวแปร + +ตอนนี้เราได้เตรียมข้อมูลของเราแล้ว เราสามารถวิเคราะห์ความสัมพันธ์ระหว่างฟีเจอร์และป้ายกำกับเพื่อให้เข้าใจว่าโมเดลจะสามารถทำนายป้ายกำกับได้ดีเพียงใดจากฟีเจอร์ +วิธีที่ดีที่สุดในการทำการวิเคราะห์ประเภทนี้คือการแสดงผลข้อมูล เราจะใช้ฟังก์ชัน `catplot` ของ Seaborn อีกครั้งเพื่อแสดงความสัมพันธ์ระหว่าง `Item Size`, `Variety` และ `Color` ในแผนภูมิหมวดหมู่ เพื่อแสดงผลข้อมูลได้ดียิ่งขึ้น เราจะใช้คอลัมน์ `Item Size` ที่เข้ารหัสและคอลัมน์ `Variety` ที่ไม่ได้เข้ารหัส + +```python + palette = { + 'ORANGE': 'orange', + 'WHITE': 'wheat', + } + pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size'] + + g = sns.catplot( + data=pumpkins, + x="Item Size", y="Color", row='Variety', + kind="box", orient="h", + sharex=False, margin_titles=True, + height=1.8, aspect=4, palette=palette, + ) + g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6)) + g.set_titles(row_template="{row_name}") +``` +![แผนภูมิหมวดหมู่ของข้อมูลที่แสดงผล](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png) + +### ใช้แผนภูมิแบบฝูง + +เนื่องจาก `Color` เป็นหมวดหมู่แบบทวิภาค (สีขาวหรือไม่ใช่) มันต้องการ 'วิธีการเฉพาะ [specialized approach](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) ในการแสดงผล' ยังมีวิธีอื่น ๆ ในการแสดงความสัมพันธ์ของหมวดหมู่นี้กับตัวแปรอื่น ๆ + +คุณสามารถแสดงตัวแปรเคียงข้างกันด้วยแผนภูมิ Seaborn + +1. ลองใช้แผนภูมิแบบ 'swarm' เพื่อแสดงการกระจายของค่า: + + ```python + palette = { + 0: 'orange', + 1: 'wheat' + } + sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette) + ``` + + ![แผนภูมิแบบฝูงของข้อมูลที่แสดงผล](../../../../2-Regression/4-Logistic/images/swarm_2.png) + +**ระวัง**: โค้ดด้านบนอาจสร้างคำเตือน เนื่องจาก Seaborn ไม่สามารถแสดงจุดข้อมูลจำนวนมากในแผนภูมิแบบฝูงได้ วิธีแก้ปัญหาที่เป็นไปได้คือการลดขนาดของเครื่องหมายโดยใช้พารามิเตอร์ 'size' อย่างไรก็ตาม โปรดทราบว่าสิ่งนี้อาจส่งผลต่อความสามารถในการอ่านแผนภูมิ + +> **🧮 คณิตศาสตร์เบื้องหลัง** +> +> การถดถอยโลจิสติกอาศัยแนวคิดของ 'ความน่าจะเป็นสูงสุด' โดยใช้ [ฟังก์ชันซิกมอยด์](https://wikipedia.org/wiki/Sigmoid_function) ฟังก์ชันซิกมอยด์บนกราฟมีลักษณะเหมือนรูปตัว 'S' มันรับค่าและแมปไปยังค่าระหว่าง 0 และ 1 เส้นโค้งของมันยังเรียกว่า 'เส้นโค้งโลจิสติก' สูตรของมันมีลักษณะดังนี้: +> +> ![ฟังก์ชันโลจิสติก](../../../../2-Regression/4-Logistic/images/sigmoid.png) +> +> โดยที่จุดกึ่งกลางของซิกมอยด์อยู่ที่จุด 0 ของ x, L คือค่ามากสุดของเส้นโค้ง และ k คือความชันของเส้นโค้ง หากผลลัพธ์ของฟังก์ชันมากกว่า 0.5 ป้ายกำกับจะถูกกำหนดให้เป็นคลาส '1' ของตัวเลือกแบบทวิภาค หากไม่ใช่ จะถูกจัดเป็น '0' + +## สร้างโมเดลของคุณ + +การสร้างโมเดลเพื่อค้นหาการจัดหมวดหมู่แบบทวิภาคนั้นง่ายอย่างน่าประหลาดใจใน Scikit-learn + +[![ML สำหรับผู้เริ่มต้น - การถดถอยโลจิสติกสำหรับการจัดหมวดหมู่ข้อมูล](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "ML สำหรับผู้เริ่มต้น - การถดถอยโลจิสติกสำหรับการจัดหมวดหมู่ข้อมูล") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ เกี่ยวกับการสร้างโมเดลการถดถอยเชิงเส้น + +1. เลือกตัวแปรที่คุณต้องการใช้ในโมเดลการจัดหมวดหมู่ของคุณและแบ่งชุดข้อมูลการฝึกอบรมและการทดสอบโดยเรียกใช้ `train_test_split()`: + + ```python + from sklearn.model_selection import train_test_split + + X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])] + y = encoded_pumpkins['Color'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + + ``` + +2. ตอนนี้คุณสามารถฝึกโมเดลของคุณได้โดยเรียกใช้ `fit()` พร้อมข้อมูลการฝึกอบรมของคุณ และพิมพ์ผลลัพธ์ออกมา: + + ```python + from sklearn.metrics import f1_score, classification_report + from sklearn.linear_model import LogisticRegression + + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('F1-score: ', f1_score(y_test, predictions)) + ``` + + ดูคะแนนของโมเดลของคุณ มันไม่ได้แย่เลยเมื่อพิจารณาว่าคุณมีข้อมูลเพียงประมาณ 1000 แถว: + + ```output + precision recall f1-score support + + 0 0.94 0.98 0.96 166 + 1 0.85 0.67 0.75 33 + + accuracy 0.92 199 + macro avg 0.89 0.82 0.85 199 + weighted avg 0.92 0.92 0.92 199 + + Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 + 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 + 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 0 0 0 1 0 0 0 0 0 0 0 0 1 1] + F1-score: 0.7457627118644068 + ``` + +## เข้าใจได้ดีขึ้นด้วยเมทริกซ์ความสับสน + +แม้ว่าคุณจะสามารถรับรายงานคะแนน [คำศัพท์](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) โดยการพิมพ์รายการด้านบน คุณอาจเข้าใจโมเดลของคุณได้ง่ายขึ้นโดยใช้ [เมทริกซ์ความสับสน](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) เพื่อช่วยให้เราเข้าใจว่าโมเดลทำงานอย่างไร + +> 🎓 '[เมทริกซ์ความสับสน](https://wikipedia.org/wiki/Confusion_matrix)' (หรือ 'เมทริกซ์ข้อผิดพลาด') เป็นตารางที่แสดงค่าจริงและค่าที่โมเดลทำนายไว้ในรูปแบบของค่าบวกและค่าลบที่ถูกต้องและผิดพลาด ซึ่งช่วยวัดความแม่นยำของการทำนาย + +1. ในการใช้เมทริกซ์ความสับสน ให้เรียกใช้ `confusion_matrix()`: + + ```python + from sklearn.metrics import confusion_matrix + confusion_matrix(y_test, predictions) + ``` + + ดูเมทริกซ์ความสับสนของโมเดลของคุณ: + + ```output + array([[162, 4], + [ 11, 22]]) + ``` + +ใน Scikit-learn เมทริกซ์ความสับสนมีแถว (แกน 0) เป็นป้ายกำกับจริง และคอลัมน์ (แกน 1) เป็นป้ายกำกับที่ทำนาย + +| | 0 | 1 | +| :---: | :---: | :---: | +| 0 | TN | FP | +| 1 | FN | TP | + +เกิดอะไรขึ้นที่นี่? สมมติว่าโมเดลของเราถูกขอให้จัดหมวดหมู่ฟักทองระหว่างสองหมวดหมู่แบบทวิภาค คือ หมวดหมู่ 'สีขาว' และหมวดหมู่ 'ไม่ใช +ความสัมพันธ์ระหว่าง Confusion Matrix กับ Precision และ Recall คืออะไร? จำไว้ว่า Classification Report ที่แสดงไว้ข้างต้นแสดงค่า Precision (0.85) และ Recall (0.67) + +Precision = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461 + +Recall = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666 + +✅ ถาม: จาก Confusion Matrix โมเดลทำงานเป็นอย่างไร? ตอบ: ไม่เลวเลย; มีจำนวน True Negatives ที่ดี แต่ก็มี False Negatives อยู่บ้าง + +มาทบทวนคำศัพท์ที่เราเคยเห็นก่อนหน้านี้โดยใช้การแมป TP/TN และ FP/FN จาก Confusion Matrix: + +🎓 Precision: TP/(TP + FP) สัดส่วนของตัวอย่างที่เกี่ยวข้องในตัวอย่างที่ถูกดึงมา (เช่น ฉลากที่ถูกระบุได้ดี) + +🎓 Recall: TP/(TP + FN) สัดส่วนของตัวอย่างที่เกี่ยวข้องที่ถูกดึงมา ไม่ว่าจะระบุได้ดีหรือไม่ + +🎓 f1-score: (2 * precision * recall)/(precision + recall) ค่าเฉลี่ยแบบถ่วงน้ำหนักระหว่าง Precision และ Recall โดยค่าที่ดีที่สุดคือ 1 และแย่ที่สุดคือ 0 + +🎓 Support: จำนวนครั้งที่ฉลากแต่ละตัวถูกดึงมา + +🎓 Accuracy: (TP + TN)/(TP + TN + FP + FN) เปอร์เซ็นต์ของฉลากที่ถูกทำนายได้อย่างถูกต้องในตัวอย่าง + +🎓 Macro Avg: การคำนวณค่าเฉลี่ยแบบไม่ถ่วงน้ำหนักสำหรับแต่ละฉลาก โดยไม่คำนึงถึงความไม่สมดุลของฉลาก + +🎓 Weighted Avg: การคำนวณค่าเฉลี่ยสำหรับแต่ละฉลาก โดยคำนึงถึงความไม่สมดุลของฉลากด้วยการถ่วงน้ำหนักตาม Support (จำนวนตัวอย่างจริงสำหรับแต่ละฉลาก) + +✅ คุณคิดว่าคุณควรดู Metric ใดหากคุณต้องการลดจำนวน False Negatives ของโมเดล? + +## การแสดงผล ROC Curve ของโมเดลนี้ + +[![ML for beginners - การวิเคราะห์ประสิทธิภาพ Logistic Regression ด้วย ROC Curves](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML for beginners - การวิเคราะห์ประสิทธิภาพ Logistic Regression ด้วย ROC Curves") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้นเกี่ยวกับ ROC Curves + +มาทำการแสดงผลอีกครั้งเพื่อดู 'ROC' Curve: + +```python +from sklearn.metrics import roc_curve, roc_auc_score +import matplotlib +import matplotlib.pyplot as plt +%matplotlib inline + +y_scores = model.predict_proba(X_test) +fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1]) + +fig = plt.figure(figsize=(6, 6)) +plt.plot([0, 1], [0, 1], 'k--') +plt.plot(fpr, tpr) +plt.xlabel('False Positive Rate') +plt.ylabel('True Positive Rate') +plt.title('ROC Curve') +plt.show() +``` + +ใช้ Matplotlib เพื่อแสดงผล [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) หรือ ROC ROC Curves มักถูกใช้เพื่อดูผลลัพธ์ของตัวจำแนกในแง่ของ True Positives เทียบกับ False Positives "ROC Curves มักมีแกน Y เป็น True Positive Rate และแกน X เป็น False Positive Rate" ดังนั้น ความชันของกราฟและพื้นที่ระหว่างเส้นกลางกับกราฟจึงสำคัญ: คุณต้องการกราฟที่พุ่งขึ้นและข้ามเส้นอย่างรวดเร็ว ในกรณีของเรา มี False Positives ในช่วงเริ่มต้น และจากนั้นกราฟก็พุ่งขึ้นและข้ามเส้นได้อย่างเหมาะสม: + +![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png) + +สุดท้าย ใช้ [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) ของ Scikit-learn เพื่อคำนวณ 'Area Under the Curve' (AUC) จริง: + +```python +auc = roc_auc_score(y_test,y_scores[:,1]) +print(auc) +``` +ผลลัพธ์คือ `0.9749908725812341` เนื่องจาก AUC มีค่าตั้งแต่ 0 ถึง 1 คุณต้องการคะแนนที่สูง เพราะโมเดลที่ทำนายได้ถูกต้อง 100% จะมี AUC เท่ากับ 1; ในกรณีนี้ โมเดลถือว่า _ดีมาก_ + +ในบทเรียนเกี่ยวกับการจำแนกประเภทในอนาคต คุณจะได้เรียนรู้วิธีปรับปรุงคะแนนของโมเดล แต่สำหรับตอนนี้ ขอแสดงความยินดี! คุณได้เรียนจบบทเรียนเกี่ยวกับ Regression แล้ว! + +--- +## 🚀ความท้าทาย + +ยังมีอีกมากมายเกี่ยวกับ Logistic Regression ที่ต้องเรียนรู้! แต่วิธีที่ดีที่สุดในการเรียนรู้คือการทดลอง ค้นหาชุดข้อมูลที่เหมาะสมกับการวิเคราะห์ประเภทนี้และสร้างโมเดลด้วยชุดข้อมูลนั้น คุณได้เรียนรู้อะไร? เคล็ดลับ: ลองดู [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) สำหรับชุดข้อมูลที่น่าสนใจ + +## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +อ่านหน้าแรก ๆ ของ [เอกสารนี้จาก Stanford](https://web.stanford.edu/~jurafsky/slp3/5.pdf) เกี่ยวกับการใช้งาน Logistic Regression ในทางปฏิบัติ ลองคิดถึงงานที่เหมาะสมกับการใช้ Regression ประเภทต่าง ๆ ที่เราได้ศึกษาไปจนถึงตอนนี้ งานประเภทใดที่เหมาะสมที่สุด? + +## งานที่ได้รับมอบหมาย + +[ลองทำ Regression นี้อีกครั้ง](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/4-Logistic/assignment.md b/translations/th/2-Regression/4-Logistic/assignment.md new file mode 100644 index 000000000..84b94d983 --- /dev/null +++ b/translations/th/2-Regression/4-Logistic/assignment.md @@ -0,0 +1,25 @@ + +# การลองทำ Regression ซ้ำ + +## คำแนะนำ + +ในบทเรียน คุณได้ใช้ข้อมูลฟักทองเพียงบางส่วน ตอนนี้ให้กลับไปที่ข้อมูลต้นฉบับและลองใช้ข้อมูลทั้งหมด โดยที่ผ่านการทำความสะอาดและปรับมาตรฐานแล้ว เพื่อสร้างโมเดล Logistic Regression + +## เกณฑ์การประเมิน + +| เกณฑ์ | ดีเยี่ยม | พอใช้ | ต้องปรับปรุง | +| ------ | ------------------------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | +| | มีโน้ตบุ๊กที่นำเสนอโมเดลที่อธิบายได้ดีและมีประสิทธิภาพสูง | มีโน้ตบุ๊กที่นำเสนอโมเดลที่มีประสิทธิภาพขั้นต่ำ | มีโน้ตบุ๊กที่นำเสนอโมเดลที่มีประสิทธิภาพต่ำหรือไม่มีเลย | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/4-Logistic/solution/Julia/README.md b/translations/th/2-Regression/4-Logistic/solution/Julia/README.md new file mode 100644 index 000000000..a66bda6b6 --- /dev/null +++ b/translations/th/2-Regression/4-Logistic/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/2-Regression/README.md b/translations/th/2-Regression/README.md new file mode 100644 index 000000000..1b0061e9e --- /dev/null +++ b/translations/th/2-Regression/README.md @@ -0,0 +1,54 @@ + +# โมเดลการถดถอยสำหรับการเรียนรู้ของเครื่อง +## หัวข้อภูมิภาค: โมเดลการถดถอยสำหรับราคาฟักทองในอเมริกาเหนือ 🎃 + +ในอเมริกาเหนือ ฟักทองมักถูกแกะสลักเป็นหน้าตาน่ากลัวสำหรับวันฮาโลวีน มาค้นพบเพิ่มเติมเกี่ยวกับผักที่น่าสนใจเหล่านี้กันเถอะ! + +![jack-o-lanterns](../../../2-Regression/images/jack-o-lanterns.jpg) +> ภาพถ่ายโดย Beth Teutschmann บน Unsplash + +## สิ่งที่คุณจะได้เรียนรู้ + +[![Introduction to Regression](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "Regression Introduction video - Click to Watch!") +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอแนะนำบทเรียนนี้อย่างรวดเร็ว + +บทเรียนในส่วนนี้ครอบคลุมประเภทของการถดถอยในบริบทของการเรียนรู้ของเครื่อง โมเดลการถดถอยสามารถช่วยกำหนด _ความสัมพันธ์_ ระหว่างตัวแปรต่าง ๆ โมเดลประเภทนี้สามารถทำนายค่าต่าง ๆ เช่น ความยาว อุณหภูมิ หรืออายุ และช่วยเปิดเผยความสัมพันธ์ระหว่างตัวแปรในขณะที่วิเคราะห์จุดข้อมูล + +ในชุดบทเรียนนี้ คุณจะค้นพบความแตกต่างระหว่างการถดถอยเชิงเส้นและการถดถอยแบบลอจิสติก และเรียนรู้ว่าเมื่อใดควรเลือกใช้แบบใด + +[![ML for beginners - Introduction to Regression models for Machine Learning](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "ML for beginners - Introduction to Regression models for Machine Learning") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอสั้น ๆ แนะนำโมเดลการถดถอย + +ในกลุ่มบทเรียนนี้ คุณจะได้เตรียมตัวเริ่มต้นงานการเรียนรู้ของเครื่อง รวมถึงการตั้งค่า Visual Studio Code เพื่อจัดการโน้ตบุ๊ก ซึ่งเป็นสภาพแวดล้อมทั่วไปสำหรับนักวิทยาศาสตร์ข้อมูล คุณจะได้ค้นพบ Scikit-learn ซึ่งเป็นไลบรารีสำหรับการเรียนรู้ของเครื่อง และคุณจะสร้างโมเดลแรกของคุณ โดยเน้นไปที่โมเดลการถดถอยในบทนี้ + +> มีเครื่องมือที่ใช้โค้ดน้อยที่มีประโยชน์ซึ่งสามารถช่วยให้คุณเรียนรู้เกี่ยวกับการทำงานกับโมเดลการถดถอย ลองใช้ [Azure ML สำหรับงานนี้](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +### บทเรียน + +1. [เครื่องมือที่ใช้ในงาน](1-Tools/README.md) +2. [การจัดการข้อมูล](2-Data/README.md) +3. [การถดถอยเชิงเส้นและพหุนาม](3-Linear/README.md) +4. [การถดถอยแบบลอจิสติก](4-Logistic/README.md) + +--- +### เครดิต + +"ML with regression" เขียนด้วย ♥️ โดย [Jen Looper](https://twitter.com/jenlooper) + +♥️ ผู้ร่วมสร้างแบบทดสอบ ได้แก่: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) และ [Ornella Altunyan](https://twitter.com/ornelladotcom) + +ชุดข้อมูลฟักทองแนะนำโดย [โปรเจกต์นี้บน Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices) และข้อมูลมาจาก [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) ที่เผยแพร่โดยกระทรวงเกษตรของสหรัฐอเมริกา เราได้เพิ่มจุดข้อมูลเกี่ยวกับสีตามชนิดเพื่อปรับการกระจายให้เป็นมาตรฐาน ข้อมูลนี้อยู่ในโดเมนสาธารณะ + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/3-Web-App/1-Web-App/README.md b/translations/th/3-Web-App/1-Web-App/README.md new file mode 100644 index 000000000..389ea9b28 --- /dev/null +++ b/translations/th/3-Web-App/1-Web-App/README.md @@ -0,0 +1,359 @@ + +# สร้างเว็บแอปเพื่อใช้งานโมเดล ML + +ในบทเรียนนี้ คุณจะฝึกโมเดล ML บนชุดข้อมูลที่น่าสนใจมาก: _การพบเห็น UFO ในช่วงศตวรรษที่ผ่านมา_ ซึ่งมาจากฐานข้อมูลของ NUFORC + +คุณจะได้เรียนรู้: + +- วิธี 'pickle' โมเดลที่ฝึกแล้ว +- วิธีใช้โมเดลนั้นในแอป Flask + +เราจะใช้โน้ตบุ๊กเพื่อทำความสะอาดข้อมูลและฝึกโมเดลของเรา แต่คุณสามารถนำกระบวนการนี้ไปอีกขั้นโดยการสำรวจการใช้งานโมเดลในโลกจริง เช่น ในเว็บแอป + +เพื่อทำสิ่งนี้ คุณจำเป็นต้องสร้างเว็บแอปโดยใช้ Flask + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## การสร้างแอป + +มีหลายวิธีในการสร้างเว็บแอปเพื่อใช้งานโมเดล Machine Learning สถาปัตยกรรมเว็บของคุณอาจมีผลต่อวิธีการฝึกโมเดล ลองจินตนาการว่าคุณกำลังทำงานในองค์กรที่กลุ่ม Data Science ได้ฝึกโมเดลที่พวกเขาต้องการให้คุณใช้งานในแอป + +### สิ่งที่ต้องพิจารณา + +มีคำถามหลายข้อที่คุณต้องถาม: + +- **เป็นเว็บแอปหรือแอปมือถือ?** หากคุณกำลังสร้างแอปมือถือหรือจำเป็นต้องใช้โมเดลในบริบท IoT คุณสามารถใช้ [TensorFlow Lite](https://www.tensorflow.org/lite/) และใช้โมเดลในแอป Android หรือ iOS +- **โมเดลจะอยู่ที่ไหน?** บนคลาวด์หรือในเครื่อง? +- **การรองรับแบบออฟไลน์** แอปจำเป็นต้องทำงานแบบออฟไลน์หรือไม่? +- **เทคโนโลยีที่ใช้ฝึกโมเดลคืออะไร?** เทคโนโลยีที่เลือกอาจมีผลต่อเครื่องมือที่คุณต้องใช้ + - **การใช้ TensorFlow** หากคุณฝึกโมเดลโดยใช้ TensorFlow ตัวระบบนี้มีความสามารถในการแปลงโมเดล TensorFlow เพื่อใช้งานในเว็บแอปโดยใช้ [TensorFlow.js](https://www.tensorflow.org/js/) + - **การใช้ PyTorch** หากคุณสร้างโมเดลโดยใช้ไลบรารี เช่น [PyTorch](https://pytorch.org/) คุณมีตัวเลือกในการส่งออกโมเดลในรูปแบบ [ONNX](https://onnx.ai/) (Open Neural Network Exchange) เพื่อใช้งานในเว็บแอป JavaScript ที่สามารถใช้ [Onnx Runtime](https://www.onnxruntime.ai/) ตัวเลือกนี้จะถูกสำรวจในบทเรียนอนาคตสำหรับโมเดลที่ฝึกด้วย Scikit-learn + - **การใช้ Lobe.ai หรือ Azure Custom Vision** หากคุณใช้ระบบ ML SaaS (Software as a Service) เช่น [Lobe.ai](https://lobe.ai/) หรือ [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) เพื่อฝึกโมเดล ซอฟต์แวร์ประเภทนี้มีวิธีการส่งออกโมเดลสำหรับหลายแพลตฟอร์ม รวมถึงการสร้าง API เฉพาะเพื่อเรียกใช้งานในคลาวด์โดยแอปออนไลน์ของคุณ + +คุณยังมีโอกาสสร้างเว็บแอป Flask ทั้งหมดที่สามารถฝึกโมเดลได้เองในเว็บเบราว์เซอร์ สิ่งนี้สามารถทำได้โดยใช้ TensorFlow.js ในบริบทของ JavaScript + +สำหรับวัตถุประสงค์ของเรา เนื่องจากเราได้ทำงานกับโน้ตบุ๊กที่ใช้ Python ลองสำรวจขั้นตอนที่คุณต้องทำเพื่อส่งออกโมเดลที่ฝึกแล้วจากโน้ตบุ๊กไปยังรูปแบบที่เว็บแอปที่สร้างด้วย Python สามารถอ่านได้ + +## เครื่องมือ + +สำหรับงานนี้ คุณต้องใช้เครื่องมือสองอย่าง: Flask และ Pickle ซึ่งทั้งสองทำงานบน Python + +✅ [Flask](https://palletsprojects.com/p/flask/) คืออะไร? Flask ถูกนิยามว่าเป็น 'micro-framework' โดยผู้สร้างของมัน Flask ให้ฟีเจอร์พื้นฐานของเว็บเฟรมเวิร์กโดยใช้ Python และเครื่องมือสร้างเทมเพลตเพื่อสร้างหน้าเว็บ ลองดู [โมดูลการเรียนรู้นี้](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) เพื่อฝึกสร้างด้วย Flask + +✅ [Pickle](https://docs.python.org/3/library/pickle.html) คืออะไร? Pickle 🥒 เป็นโมดูล Python ที่ใช้ในการ serialize และ de-serialize โครงสร้างวัตถุ Python เมื่อคุณ 'pickle' โมเดล คุณจะ serialize หรือ flatten โครงสร้างของมันเพื่อใช้งานบนเว็บ ระวัง: pickle ไม่ปลอดภัยโดยธรรมชาติ ดังนั้นควรระวังหากถูกขอให้ 'un-pickle' ไฟล์ ไฟล์ที่ถูก pickle จะมีนามสกุล `.pkl` + +## แบบฝึกหัด - ทำความสะอาดข้อมูลของคุณ + +ในบทเรียนนี้ คุณจะใช้ข้อมูลจากการพบเห็น UFO จำนวน 80,000 ครั้ง ซึ่งรวบรวมโดย [NUFORC](https://nuforc.org) (ศูนย์รายงาน UFO แห่งชาติ) ข้อมูลนี้มีคำอธิบายที่น่าสนใจเกี่ยวกับการพบเห็น UFO เช่น: + +- **คำอธิบายตัวอย่างแบบยาว** "ชายคนหนึ่งปรากฏตัวจากลำแสงที่ส่องลงบนทุ่งหญ้าในเวลากลางคืน และเขาวิ่งไปยังลานจอดรถของ Texas Instruments" +- **คำอธิบายตัวอย่างแบบสั้น** "แสงไล่ตามเรา" + +สเปรดชีต [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) มีคอลัมน์เกี่ยวกับ `city`, `state` และ `country` ที่การพบเห็นเกิดขึ้น รูปร่างของวัตถุ (`shape`) และ `latitude` และ `longitude` + +ใน [notebook](../../../../3-Web-App/1-Web-App/notebook.ipynb) ที่ว่างเปล่าที่รวมอยู่ในบทเรียนนี้: + +1. import `pandas`, `matplotlib`, และ `numpy` เหมือนที่คุณทำในบทเรียนก่อนหน้า และ import สเปรดชีต ufos คุณสามารถดูตัวอย่างชุดข้อมูล: + + ```python + import pandas as pd + import numpy as np + + ufos = pd.read_csv('./data/ufos.csv') + ufos.head() + ``` + +1. แปลงข้อมูล ufos เป็น dataframe ขนาดเล็กพร้อมชื่อใหม่ ตรวจสอบค่าที่ไม่ซ้ำกันในฟิลด์ `Country` + + ```python + ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) + + ufos.Country.unique() + ``` + +1. ตอนนี้ คุณสามารถลดปริมาณข้อมูลที่เราต้องจัดการโดยการลบค่าที่เป็น null และนำเข้าการพบเห็นที่มีระยะเวลา 1-60 วินาทีเท่านั้น: + + ```python + ufos.dropna(inplace=True) + + ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] + + ufos.info() + ``` + +1. Import ไลบรารี `LabelEncoder` ของ Scikit-learn เพื่อแปลงค่าข้อความสำหรับประเทศให้เป็นตัวเลข: + + ✅ LabelEncoder เข้ารหัสข้อมูลตามลำดับตัวอักษร + + ```python + from sklearn.preprocessing import LabelEncoder + + ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) + + ufos.head() + ``` + + ข้อมูลของคุณควรมีลักษณะดังนี้: + + ```output + Seconds Country Latitude Longitude + 2 20.0 3 53.200000 -2.916667 + 3 20.0 4 28.978333 -96.645833 + 14 30.0 4 35.823889 -80.253611 + 23 60.0 4 45.582778 -122.352222 + 24 3.0 3 51.783333 -0.783333 + ``` + +## แบบฝึกหัด - สร้างโมเดลของคุณ + +ตอนนี้คุณสามารถเตรียมพร้อมที่จะฝึกโมเดลโดยแบ่งข้อมูลออกเป็นกลุ่มการฝึกและการทดสอบ + +1. เลือกสามฟีเจอร์ที่คุณต้องการฝึกเป็นเวกเตอร์ X ของคุณ และเวกเตอร์ y จะเป็น `Country` คุณต้องการสามารถป้อน `Seconds`, `Latitude` และ `Longitude` และรับรหัสประเทศกลับมา + + ```python + from sklearn.model_selection import train_test_split + + Selected_features = ['Seconds','Latitude','Longitude'] + + X = ufos[Selected_features] + y = ufos['Country'] + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) + ``` + +1. ฝึกโมเดลของคุณโดยใช้ logistic regression: + + ```python + from sklearn.metrics import accuracy_score, classification_report + from sklearn.linear_model import LogisticRegression + model = LogisticRegression() + model.fit(X_train, y_train) + predictions = model.predict(X_test) + + print(classification_report(y_test, predictions)) + print('Predicted labels: ', predictions) + print('Accuracy: ', accuracy_score(y_test, predictions)) + ``` + +ความแม่นยำไม่เลวเลย **(ประมาณ 95%)** ซึ่งไม่น่าแปลกใจ เนื่องจาก `Country` และ `Latitude/Longitude` มีความสัมพันธ์กัน + +โมเดลที่คุณสร้างไม่ได้ปฏิวัติอะไรมากนัก เนื่องจากคุณควรสามารถอนุมาน `Country` จาก `Latitude` และ `Longitude` ได้ แต่เป็นการฝึกที่ดีในการลองฝึกจากข้อมูลดิบที่คุณทำความสะอาด ส่งออก และใช้โมเดลนี้ในเว็บแอป + +## แบบฝึกหัด - 'pickle' โมเดลของคุณ + +ตอนนี้ถึงเวลาที่จะ _pickle_ โมเดลของคุณ! คุณสามารถทำได้ในไม่กี่บรรทัดโค้ด เมื่อมันถูก _pickled_ แล้ว ให้โหลดโมเดลที่ถูก pickle และทดสอบกับตัวอย่างข้อมูลอาร์เรย์ที่มีค่าของ seconds, latitude และ longitude + +```python +import pickle +model_filename = 'ufo-model.pkl' +pickle.dump(model, open(model_filename,'wb')) + +model = pickle.load(open('ufo-model.pkl','rb')) +print(model.predict([[50,44,-12]])) +``` + +โมเดลคืนค่า **'3'** ซึ่งเป็นรหัสประเทศสำหรับ UK น่าทึ่งมาก! 👽 + +## แบบฝึกหัด - สร้างแอป Flask + +ตอนนี้คุณสามารถสร้างแอป Flask เพื่อเรียกโมเดลของคุณและคืนผลลัพธ์ที่คล้ายกัน แต่ในรูปแบบที่ดูดีขึ้น + +1. เริ่มต้นด้วยการสร้างโฟลเดอร์ชื่อ **web-app** ข้างไฟล์ _notebook.ipynb_ ที่ไฟล์ _ufo-model.pkl_ ของคุณอยู่ + +1. ในโฟลเดอร์นั้น สร้างอีกสามโฟลเดอร์: **static** โดยมีโฟลเดอร์ **css** อยู่ข้างใน และ **templates** คุณควรมีไฟล์และไดเรกทอรีดังนี้: + + ```output + web-app/ + static/ + css/ + templates/ + notebook.ipynb + ufo-model.pkl + ``` + + ✅ ดูโฟลเดอร์ solution เพื่อดูแอปที่เสร็จสมบูรณ์ + +1. ไฟล์แรกที่สร้างในโฟลเดอร์ _web-app_ คือไฟล์ **requirements.txt** เหมือน _package.json_ ในแอป JavaScript ไฟล์นี้แสดงรายการ dependencies ที่แอปต้องการ ใน **requirements.txt** เพิ่มบรรทัด: + + ```text + scikit-learn + pandas + numpy + flask + ``` + +1. ตอนนี้ รันไฟล์นี้โดยไปที่ _web-app_: + + ```bash + cd web-app + ``` + +1. ใน terminal ของคุณ พิมพ์ `pip install` เพื่อ install ไลบรารีที่ระบุใน _requirements.txt_: + + ```bash + pip install -r requirements.txt + ``` + +1. ตอนนี้ คุณพร้อมที่จะสร้างไฟล์อีกสามไฟล์เพื่อจบแอป: + + 1. สร้าง **app.py** ใน root + 2. สร้าง **index.html** ในไดเรกทอรี _templates_ + 3. สร้าง **styles.css** ในไดเรกทอรี _static/css_ + +1. สร้างไฟล์ _styles.css_ ด้วยสไตล์เล็กน้อย: + + ```css + body { + width: 100%; + height: 100%; + font-family: 'Helvetica'; + background: black; + color: #fff; + text-align: center; + letter-spacing: 1.4px; + font-size: 30px; + } + + input { + min-width: 150px; + } + + .grid { + width: 300px; + border: 1px solid #2d2d2d; + display: grid; + justify-content: center; + margin: 20px auto; + } + + .box { + color: #fff; + background: #2d2d2d; + padding: 12px; + display: inline-block; + } + ``` + +1. ต่อไป สร้างไฟล์ _index.html_: + + ```html + + + + + 🛸 UFO Appearance Prediction! 👽 + + + + +
                      + +
                      + +

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

                      + +
                      + + + + +
                      + +

                      {{ prediction_text }}

                      + +
                      + +
                      + + + + ``` + + ลองดูการสร้างเทมเพลตในไฟล์นี้ สังเกตไวยากรณ์ 'mustache' รอบตัวแปรที่จะถูกส่งโดยแอป เช่น ข้อความการทำนาย: `{{}}` นอกจากนี้ยังมีฟอร์มที่โพสต์การทำนายไปยัง route `/predict` + + สุดท้าย คุณพร้อมที่จะสร้างไฟล์ python ที่ขับเคลื่อนการใช้งานโมเดลและการแสดงผลการทำนาย: + +1. ใน `app.py` เพิ่ม: + + ```python + import numpy as np + from flask import Flask, request, render_template + import pickle + + app = Flask(__name__) + + model = pickle.load(open("./ufo-model.pkl", "rb")) + + + @app.route("/") + def home(): + return render_template("index.html") + + + @app.route("/predict", methods=["POST"]) + def predict(): + + int_features = [int(x) for x in request.form.values()] + final_features = [np.array(int_features)] + prediction = model.predict(final_features) + + output = prediction[0] + + countries = ["Australia", "Canada", "Germany", "UK", "US"] + + return render_template( + "index.html", prediction_text="Likely country: {}".format(countries[output]) + ) + + + if __name__ == "__main__": + app.run(debug=True) + ``` + + > 💡 เคล็ดลับ: เมื่อคุณเพิ่ม [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) ขณะรันเว็บแอปโดยใช้ Flask การเปลี่ยนแปลงใดๆ ที่คุณทำกับแอปพลิเคชันของคุณจะสะท้อนทันทีโดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์ ระวัง! อย่าเปิดใช้งานโหมดนี้ในแอปที่ใช้งานจริง + +หากคุณรัน `python app.py` หรือ `python3 app.py` - เซิร์ฟเวอร์เว็บของคุณจะเริ่มต้นขึ้นในเครื่อง และคุณสามารถกรอกฟอร์มสั้นๆ เพื่อรับคำตอบสำหรับคำถามที่คุณสงสัยเกี่ยวกับสถานที่ที่มีการพบเห็น UFO! + +ก่อนทำสิ่งนั้น ลองดูส่วนต่างๆ ของ `app.py`: + +1. ขั้นแรก dependencies ถูกโหลดและแอปเริ่มต้น +1. จากนั้น โมเดลถูก import +1. จากนั้น index.html ถูก render บน home route + +บน route `/predict` มีหลายสิ่งเกิดขึ้นเมื่อฟอร์มถูกโพสต์: + +1. ตัวแปรในฟอร์มถูกรวบรวมและแปลงเป็น numpy array จากนั้นส่งไปยังโมเดลและผลการทำนายจะถูกคืนค่า +2. ประเทศที่เราต้องการแสดงผลถูก render ใหม่เป็นข้อความที่อ่านได้จากรหัสประเทศที่ถูกทำนาย และค่านั้นถูกส่งกลับไปยัง index.html เพื่อ render ในเทมเพลต + +การใช้โมเดลในลักษณะนี้ ด้วย Flask และโมเดลที่ถูก pickle นั้นค่อนข้างตรงไปตรงมา สิ่งที่ยากที่สุดคือการเข้าใจว่าข้อมูลที่ต้องส่งไปยังโมเดลเพื่อให้ได้ผลการทำนายมีรูปแบบอย่างไร ทั้งหมดนี้ขึ้นอยู่กับวิธีที่โมเดลถูกฝึก โมเดลนี้มีจุดข้อมูลสามจุดที่ต้องป้อนเพื่อให้ได้ผลการทำนาย + +ในสภาพแวดล้อมการทำงาน คุณจะเห็นว่าการสื่อสารที่ดีมีความจำเป็นระหว่างผู้ที่ฝึกโมเดลและผู้ที่ใช้งานโมเดลในเว็บหรือแอปมือถือ ในกรณีของเรา มีเพียงคนเดียว นั่นคือคุณ! + +--- + +## 🚀 ความท้าทาย + +แทนที่จะทำงานในโน้ตบุ๊กและ import โมเดลไปยังแอป Flask คุณสามารถฝึกโมเดลได้ภายในแอป Flask! ลองแปลงโค้ด Python ของคุณในโน้ตบุ๊ก อาจหลังจากที่คุณทำความสะอาดข้อมูล เพื่อฝึกโมเดลจากภายในแอปบน route ที่เรียกว่า `train` ข้อดีและข้อเสียของการใช้วิธีนี้คืออะไร? + +## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +มีหลายวิธีในการสร้างเว็บแอปเพื่อใช้งานโมเดล ML ลองทำรายการวิธีที่คุณสามารถใช้ JavaScript หรือ Python เพื่อสร้างเว็บแอปที่ใช้ Machine Learning พิจารณาสถาปัตยกรรม: โมเดลควรอยู่ในแอปหรืออยู่ในคลาวด์? หากเป็นแบบหลัง คุณจะเข้าถึงมันได้อย่างไร? ลองวาดโมเดลสถาปัตยกรรมสำหรับโซลูชัน ML เว็บที่ใช้งานจริง + +## งานที่ได้รับมอบหมาย + +[ลองใช้โมเดลอื่น](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/3-Web-App/1-Web-App/assignment.md b/translations/th/3-Web-App/1-Web-App/assignment.md new file mode 100644 index 000000000..c00a699b5 --- /dev/null +++ b/translations/th/3-Web-App/1-Web-App/assignment.md @@ -0,0 +1,25 @@ + +# ลองใช้โมเดลอื่น + +## คำแนะนำ + +หลังจากที่คุณสร้างเว็บแอปโดยใช้โมเดล Regression ที่ผ่านการฝึกฝนแล้ว ลองใช้หนึ่งในโมเดลจากบทเรียน Regression ก่อนหน้านี้เพื่อสร้างเว็บแอปใหม่ คุณสามารถคงรูปแบบเดิมหรือออกแบบใหม่เพื่อสะท้อนข้อมูลเกี่ยวกับฟักทองได้ อย่าลืมปรับเปลี่ยนอินพุตให้สอดคล้องกับวิธีการฝึกฝนของโมเดลของคุณ + +## เกณฑ์การประเมิน + +| เกณฑ์ | ดีเยี่ยม | พอใช้ | ต้องปรับปรุง | +| -------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------- | +| | เว็บแอปทำงานได้ตามที่คาดหวังและถูกนำไปใช้งานบนคลาวด์ | เว็บแอปมีข้อบกพร่องหรือแสดงผลลัพธ์ที่ไม่คาดคิด | เว็บแอปไม่ทำงานอย่างถูกต้อง | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/3-Web-App/README.md b/translations/th/3-Web-App/README.md new file mode 100644 index 000000000..34eebf04f --- /dev/null +++ b/translations/th/3-Web-App/README.md @@ -0,0 +1,35 @@ + +# สร้างเว็บแอปเพื่อใช้งานโมเดล ML ของคุณ + +ในส่วนนี้ของหลักสูตร คุณจะได้เรียนรู้หัวข้อการประยุกต์ใช้ ML: วิธีการบันทึกโมเดล Scikit-learn เป็นไฟล์ที่สามารถนำไปใช้ในการทำนายภายในเว็บแอปพลิเคชัน เมื่อโมเดลถูกบันทึกแล้ว คุณจะได้เรียนรู้วิธีการใช้งานโมเดลในเว็บแอปที่สร้างด้วย Flask คุณจะเริ่มต้นด้วยการสร้างโมเดลโดยใช้ข้อมูลเกี่ยวกับการพบเห็น UFO! จากนั้น คุณจะสร้างเว็บแอปที่ช่วยให้คุณสามารถป้อนจำนวนวินาที พร้อมกับค่าละติจูดและลองจิจูด เพื่อทำนายว่าประเทศใดรายงานการพบเห็น UFO + +![UFO Parking](../../../3-Web-App/images/ufo.jpg) + +ภาพถ่ายโดย Michael Herren บน Unsplash + +## บทเรียน + +1. [สร้างเว็บแอป](1-Web-App/README.md) + +## เครดิต + +"สร้างเว็บแอป" เขียนด้วย ♥️ โดย [Jen Looper](https://twitter.com/jenlooper) + +♥️ แบบทดสอบเขียนโดย Rohan Raj + +ชุดข้อมูลมาจาก [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings) + +สถาปัตยกรรมเว็บแอปได้รับการแนะนำบางส่วนจาก [บทความนี้](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) และ [repo นี้](https://github.com/abhinavsagar/machine-learning-deployment) โดย Abhinav Sagar + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/1-Introduction/README.md b/translations/th/4-Classification/1-Introduction/README.md new file mode 100644 index 000000000..aba2e5451 --- /dev/null +++ b/translations/th/4-Classification/1-Introduction/README.md @@ -0,0 +1,313 @@ + +# บทนำสู่การจำแนกประเภท + +ในบทเรียนทั้งสี่นี้ คุณจะได้สำรวจหัวข้อพื้นฐานของการเรียนรู้ด้วยเครื่องแบบคลาสสิก - _การจำแนกประเภท_ เราจะเดินผ่านการใช้หลากหลายอัลกอริทึมการจำแนกประเภทกับชุดข้อมูลเกี่ยวกับอาหารที่ยอดเยี่ยมของเอเชียและอินเดีย หวังว่าคุณจะหิวแล้ว! + +![แค่หยิบเล็กน้อย!](../../../../4-Classification/1-Introduction/images/pinch.png) + +> ฉลองอาหารเอเชียในบทเรียนเหล่านี้! ภาพโดย [Jen Looper](https://twitter.com/jenlooper) + +การจำแนกประเภทเป็นรูปแบบหนึ่งของ [การเรียนรู้แบบมีผู้สอน](https://wikipedia.org/wiki/Supervised_learning) ที่มีความคล้ายคลึงกับเทคนิคการถดถอย หากการเรียนรู้ด้วยเครื่องเกี่ยวกับการทำนายค่าหรือชื่อของสิ่งต่าง ๆ โดยใช้ชุดข้อมูล การจำแนกประเภทมักแบ่งออกเป็นสองกลุ่ม: _การจำแนกประเภทแบบไบนารี_ และ _การจำแนกประเภทแบบหลายคลาส_ + +[![บทนำสู่การจำแนกประเภท](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "บทนำสู่การจำแนกประเภท") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: John Guttag จาก MIT แนะนำการจำแนกประเภท + +จำไว้ว่า: + +- **การถดถอยเชิงเส้น** ช่วยให้คุณทำนายความสัมพันธ์ระหว่างตัวแปรและทำการทำนายที่แม่นยำเกี่ยวกับตำแหน่งที่จุดข้อมูลใหม่จะตกอยู่ในความสัมพันธ์กับเส้นนั้น ตัวอย่างเช่น คุณสามารถทำนาย _ราคาของฟักทองในเดือนกันยายนเทียบกับเดือนธันวาคม_ +- **การถดถอยโลจิสติก** ช่วยให้คุณค้นพบ "หมวดหมู่ไบนารี": ที่จุดราคานี้ _ฟักทองนี้เป็นสีส้มหรือไม่เป็นสีส้ม_? + +การจำแนกประเภทใช้หลากหลายอัลกอริทึมเพื่อกำหนดวิธีอื่นในการกำหนดป้ายหรือคลาสของจุดข้อมูล ลองทำงานกับข้อมูลอาหารนี้เพื่อดูว่า โดยการสังเกตกลุ่มของส่วนผสม เราสามารถกำหนดแหล่งกำเนิดของอาหารได้หรือไม่ + +## [แบบทดสอบก่อนบทเรียน](https://ff-quizzes.netlify.app/en/ml/) + +> ### [บทเรียนนี้มีให้ใน R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html) + +### บทนำ + +การจำแนกประเภทเป็นหนึ่งในกิจกรรมพื้นฐานของนักวิจัยการเรียนรู้ด้วยเครื่องและนักวิทยาศาสตร์ข้อมูล ตั้งแต่การจำแนกค่าของไบนารีพื้นฐาน ("อีเมลนี้เป็นสแปมหรือไม่?") ไปจนถึงการจำแนกภาพและการแบ่งส่วนที่ซับซ้อนโดยใช้การมองเห็นด้วยคอมพิวเตอร์ การสามารถจัดเรียงข้อมูลเป็นคลาสและตั้งคำถามกับมันเป็นสิ่งที่มีประโยชน์เสมอ + +หากจะกล่าวถึงกระบวนการในเชิงวิทยาศาสตร์ วิธีการจำแนกประเภทของคุณจะสร้างแบบจำลองการทำนายที่ช่วยให้คุณสามารถจับคู่ความสัมพันธ์ระหว่างตัวแปรอินพุตกับตัวแปรเอาต์พุตได้ + +![การจำแนกประเภทแบบไบนารี vs. หลายคลาส](../../../../4-Classification/1-Introduction/images/binary-multiclass.png) + +> ปัญหาแบบไบนารี vs. หลายคลาสสำหรับอัลกอริทึมการจำแนกประเภท อินโฟกราฟิกโดย [Jen Looper](https://twitter.com/jenlooper) + +ก่อนเริ่มกระบวนการทำความสะอาดข้อมูลของเรา การแสดงภาพ และการเตรียมข้อมูลสำหรับงาน ML ของเรา ลองเรียนรู้เล็กน้อยเกี่ยวกับวิธีต่าง ๆ ที่การเรียนรู้ด้วยเครื่องสามารถนำมาใช้เพื่อจำแนกข้อมูลได้ + +การจำแนกประเภทที่ได้มาจาก [สถิติ](https://wikipedia.org/wiki/Statistical_classification) โดยใช้การเรียนรู้ด้วยเครื่องแบบคลาสสิกใช้คุณสมบัติต่าง ๆ เช่น `smoker`, `weight`, และ `age` เพื่อกำหนด _ความน่าจะเป็นของการพัฒนาโรค X_ ในฐานะเทคนิคการเรียนรู้แบบมีผู้สอนที่คล้ายกับการฝึกถดถอยที่คุณทำมาก่อนหน้านี้ ข้อมูลของคุณจะถูกติดป้ายกำกับ และอัลกอริทึม ML จะใช้ป้ายกำกับเหล่านั้นเพื่อจำแนกและทำนายคลาส (หรือ 'คุณสมบัติ') ของชุดข้อมูลและกำหนดให้กับกลุ่มหรือผลลัพธ์ + +✅ ลองจินตนาการถึงชุดข้อมูลเกี่ยวกับอาหาร คุณคิดว่าโมเดลแบบหลายคลาสจะสามารถตอบคำถามอะไรได้บ้าง? โมเดลแบบไบนารีจะตอบคำถามอะไรได้บ้าง? ถ้าคุณต้องการกำหนดว่าอาหารที่กำหนดมีแนวโน้มที่จะใช้เมล็ดฟีนูกรีกหรือไม่? หรือถ้าคุณต้องการดูว่า หากคุณได้รับของขวัญเป็นถุงช้อปปิ้งที่เต็มไปด้วยโป๊ยกั๊ก อาร์ติโชก กะหล่ำดอก และฮอร์สแรดิช คุณจะสามารถสร้างอาหารอินเดียทั่วไปได้หรือไม่? + +[![ตะกร้าปริศนาแสนบ้าคลั่ง](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "ตะกร้าปริศนาแสนบ้าคลั่ง") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ รายการ 'Chopped' มีแนวคิดเกี่ยวกับ 'ตะกร้าปริศนา' ที่เชฟต้องทำอาหารจากส่วนผสมที่สุ่มเลือก แน่นอนว่าโมเดล ML น่าจะช่วยได้! + +## สวัสดี 'ตัวจำแนก' + +คำถามที่เราต้องการถามจากชุดข้อมูลอาหารนี้เป็นคำถามแบบ **หลายคลาส** เนื่องจากเรามีอาหารประจำชาติหลายประเภทที่สามารถทำงานได้ จากชุดของส่วนผสม อาหารเหล่านี้จะเข้ากับคลาสใด? + +Scikit-learn มีอัลกอริทึมหลากหลายให้เลือกใช้เพื่อจำแนกข้อมูล ขึ้นอยู่กับประเภทของปัญหาที่คุณต้องการแก้ไข ในสองบทเรียนถัดไป คุณจะได้เรียนรู้เกี่ยวกับอัลกอริทึมเหล่านี้ + +## แบบฝึกหัด - ทำความสะอาดและปรับสมดุลข้อมูลของคุณ + +งานแรกที่ต้องทำก่อนเริ่มโครงการนี้คือการทำความสะอาดและ **ปรับสมดุล** ข้อมูลของคุณเพื่อให้ได้ผลลัพธ์ที่ดีขึ้น เริ่มต้นด้วยไฟล์ _notebook.ipynb_ ที่ว่างเปล่าในโฟลเดอร์รากนี้ + +สิ่งแรกที่ต้องติดตั้งคือ [imblearn](https://imbalanced-learn.org/stable/) ซึ่งเป็นแพ็กเกจ Scikit-learn ที่จะช่วยให้คุณปรับสมดุลข้อมูลได้ดีขึ้น (คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับงานนี้ในอีกสักครู่) + +1. เพื่อติดตั้ง `imblearn` ให้รัน `pip install` ดังนี้: + + ```python + pip install imblearn + ``` + +1. นำเข้าแพ็กเกจที่คุณต้องการเพื่อดึงข้อมูลและแสดงภาพ นอกจากนี้ให้นำเข้า `SMOTE` จาก `imblearn` + + ```python + import pandas as pd + import matplotlib.pyplot as plt + import matplotlib as mpl + import numpy as np + from imblearn.over_sampling import SMOTE + ``` + + ตอนนี้คุณพร้อมที่จะนำเข้าข้อมูลในขั้นตอนถัดไปแล้ว + +1. งานถัดไปคือการนำเข้าข้อมูล: + + ```python + df = pd.read_csv('../data/cuisines.csv') + ``` + + การใช้ `read_csv()` จะอ่านเนื้อหาของไฟล์ csv _cusines.csv_ และวางไว้ในตัวแปร `df` + +1. ตรวจสอบรูปร่างของข้อมูล: + + ```python + df.head() + ``` + + ห้าบรรทัดแรกมีลักษณะดังนี้: + + ```output + | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | + | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | + | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | + | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + ``` + +1. รับข้อมูลเกี่ยวกับข้อมูลนี้โดยเรียก `info()`: + + ```python + df.info() + ``` + + ผลลัพธ์ของคุณจะคล้ายกับ: + + ```output + + RangeIndex: 2448 entries, 0 to 2447 + Columns: 385 entries, Unnamed: 0 to zucchini + dtypes: int64(384), object(1) + memory usage: 7.2+ MB + ``` + +## แบบฝึกหัด - เรียนรู้เกี่ยวกับอาหาร + +ตอนนี้งานเริ่มน่าสนใจมากขึ้น ลองค้นพบการกระจายของข้อมูลต่ออาหาร + +1. แสดงข้อมูลเป็นแถบโดยเรียก `barh()`: + + ```python + df.cuisine.value_counts().plot.barh() + ``` + + ![การกระจายข้อมูลอาหาร](../../../../4-Classification/1-Introduction/images/cuisine-dist.png) + + มีจำนวนอาหารที่จำกัด แต่การกระจายข้อมูลไม่เท่ากัน คุณสามารถแก้ไขได้! ก่อนทำเช่นนั้น ลองสำรวจเพิ่มเติมเล็กน้อย + +1. ค้นหาว่ามีข้อมูลเท่าใดต่ออาหารและพิมพ์ออกมา: + + ```python + thai_df = df[(df.cuisine == "thai")] + japanese_df = df[(df.cuisine == "japanese")] + chinese_df = df[(df.cuisine == "chinese")] + indian_df = df[(df.cuisine == "indian")] + korean_df = df[(df.cuisine == "korean")] + + print(f'thai df: {thai_df.shape}') + print(f'japanese df: {japanese_df.shape}') + print(f'chinese df: {chinese_df.shape}') + print(f'indian df: {indian_df.shape}') + print(f'korean df: {korean_df.shape}') + ``` + + ผลลัพธ์มีลักษณะดังนี้: + + ```output + thai df: (289, 385) + japanese df: (320, 385) + chinese df: (442, 385) + indian df: (598, 385) + korean df: (799, 385) + ``` + +## ค้นพบส่วนผสม + +ตอนนี้คุณสามารถเจาะลึกลงไปในข้อมูลและเรียนรู้ว่าส่วนผสมทั่วไปต่ออาหารคืออะไร คุณควรลบข้อมูลที่เกิดซ้ำซึ่งสร้างความสับสนระหว่างอาหาร ดังนั้นลองเรียนรู้เกี่ยวกับปัญหานี้ + +1. สร้างฟังก์ชัน `create_ingredient()` ใน Python เพื่อสร้าง dataframe ของส่วนผสม ฟังก์ชันนี้จะเริ่มต้นด้วยการลบคอลัมน์ที่ไม่เป็นประโยชน์และจัดเรียงส่วนผสมตามจำนวน: + + ```python + def create_ingredient_df(df): + ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') + ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] + ingredient_df = ingredient_df.sort_values(by='value', ascending=False, + inplace=False) + return ingredient_df + ``` + + ตอนนี้คุณสามารถใช้ฟังก์ชันนั้นเพื่อดูแนวคิดเกี่ยวกับส่วนผสมยอดนิยมสิบอันดับแรกต่ออาหาร + +1. เรียก `create_ingredient()` และแสดงภาพโดยเรียก `barh()`: + + ```python + thai_ingredient_df = create_ingredient_df(thai_df) + thai_ingredient_df.head(10).plot.barh() + ``` + + ![ไทย](../../../../4-Classification/1-Introduction/images/thai.png) + +1. ทำเช่นเดียวกันสำหรับข้อมูลญี่ปุ่น: + + ```python + japanese_ingredient_df = create_ingredient_df(japanese_df) + japanese_ingredient_df.head(10).plot.barh() + ``` + + ![ญี่ปุ่น](../../../../4-Classification/1-Introduction/images/japanese.png) + +1. ตอนนี้สำหรับส่วนผสมของจีน: + + ```python + chinese_ingredient_df = create_ingredient_df(chinese_df) + chinese_ingredient_df.head(10).plot.barh() + ``` + + ![จีน](../../../../4-Classification/1-Introduction/images/chinese.png) + +1. แสดงภาพส่วนผสมของอินเดีย: + + ```python + indian_ingredient_df = create_ingredient_df(indian_df) + indian_ingredient_df.head(10).plot.barh() + ``` + + ![อินเดีย](../../../../4-Classification/1-Introduction/images/indian.png) + +1. สุดท้าย แสดงภาพส่วนผสมของเกาหลี: + + ```python + korean_ingredient_df = create_ingredient_df(korean_df) + korean_ingredient_df.head(10).plot.barh() + ``` + + ![เกาหลี](../../../../4-Classification/1-Introduction/images/korean.png) + +1. ตอนนี้ ลบส่วนผสมที่พบมากที่สุดที่สร้างความสับสนระหว่างอาหารที่แตกต่างกัน โดยเรียก `drop()`: + + ทุกคนชอบข้าว กระเทียม และขิง! + + ```python + feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) + labels_df = df.cuisine #.unique() + feature_df.head() + ``` + +## ปรับสมดุลชุดข้อมูล + +ตอนนี้คุณได้ทำความสะอาดข้อมูลแล้ว ใช้ [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "เทคนิคการสุ่มตัวอย่างชนกลุ่มน้อยแบบสังเคราะห์" - เพื่อปรับสมดุลข้อมูล + +1. เรียก `fit_resample()` กลยุทธ์นี้สร้างตัวอย่างใหม่โดยการแทรกแซง + + ```python + oversample = SMOTE() + transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df) + ``` + + โดยการปรับสมดุลข้อมูล คุณจะได้ผลลัพธ์ที่ดีขึ้นเมื่อจำแนกข้อมูล ลองคิดถึงการจำแนกประเภทแบบไบนารี หากข้อมูลส่วนใหญ่ของคุณเป็นคลาสเดียว โมเดล ML จะทำนายคลาสนั้นบ่อยขึ้น เพียงเพราะมีข้อมูลสำหรับมันมากกว่า การปรับสมดุลข้อมูลจะช่วยลบความไม่สมดุลนี้ + +1. ตอนนี้คุณสามารถตรวจสอบจำนวนป้ายกำกับต่อส่วนผสม: + + ```python + print(f'new label count: {transformed_label_df.value_counts()}') + print(f'old label count: {df.cuisine.value_counts()}') + ``` + + ผลลัพธ์ของคุณมีลักษณะดังนี้: + + ```output + new label count: korean 799 + chinese 799 + indian 799 + japanese 799 + thai 799 + Name: cuisine, dtype: int64 + old label count: korean 799 + indian 598 + chinese 442 + japanese 320 + thai 289 + Name: cuisine, dtype: int64 + ``` + + ข้อมูลสะอาด สมดุล และน่ากินมาก! + +1. ขั้นตอนสุดท้ายคือการบันทึกข้อมูลที่สมดุลของคุณ รวมถึงป้ายกำกับและคุณสมบัติ ลงใน dataframe ใหม่ที่สามารถส่งออกไปยังไฟล์: + + ```python + transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer') + ``` + +1. คุณสามารถดูข้อมูลอีกครั้งโดยใช้ `transformed_df.head()` และ `transformed_df.info()` บันทึกสำเนาของข้อมูลนี้เพื่อใช้ในบทเรียนในอนาคต: + + ```python + transformed_df.head() + transformed_df.info() + transformed_df.to_csv("../data/cleaned_cuisines.csv") + ``` + + CSV ใหม่ที่สดนี้สามารถพบได้ในโฟลเดอร์ข้อมูลราก + +--- + +## 🚀ความท้าทาย + +หลักสูตรนี้มีชุดข้อมูลที่น่าสนใจหลายชุด ลองค้นหาในโฟลเดอร์ `data` และดูว่ามีชุดข้อมูลใดที่เหมาะสมสำหรับการจำแนกประเภทแบบไบนารีหรือหลายคลาส? คุณจะถามคำถามอะไรจากชุดข้อมูลนี้? + +## [แบบทดสอบหลังบทเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +สำรวจ API ของ SMOTE กรณีการใช้งานใดที่เหมาะสมที่สุดสำหรับมัน? ปัญหาใดที่มันแก้ไข? + +## งานที่ได้รับมอบหมาย + +[สำรวจวิธีการจำแนกประเภท](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/1-Introduction/assignment.md b/translations/th/4-Classification/1-Introduction/assignment.md new file mode 100644 index 000000000..50e5b4ce6 --- /dev/null +++ b/translations/th/4-Classification/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# สำรวจวิธีการจำแนกประเภท + +## คำแนะนำ + +ใน [เอกสาร Scikit-learn](https://scikit-learn.org/stable/supervised_learning.html) คุณจะพบรายการวิธีการจำแนกประเภทข้อมูลมากมาย ลองค้นหาในเอกสารเหล่านี้: เป้าหมายของคุณคือการค้นหาวิธีการจำแนกประเภทและจับคู่กับชุดข้อมูลในหลักสูตรนี้ คำถามที่คุณสามารถถามเกี่ยวกับมัน และเทคนิคการจำแนกประเภท สร้างสเปรดชีตหรือตารางในไฟล์ .doc และอธิบายว่าชุดข้อมูลจะทำงานร่วมกับอัลกอริทึมการจำแนกประเภทอย่างไร + +## รูบริก + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| | เอกสารที่นำเสนอมีภาพรวมของอัลกอริทึม 5 รายการพร้อมเทคนิคการจำแนกประเภท ภาพรวมมีการอธิบายอย่างดีและละเอียด | เอกสารที่นำเสนอมีภาพรวมของอัลกอริทึม 3 รายการพร้อมเทคนิคการจำแนกประเภท ภาพรวมมีการอธิบายอย่างดีและละเอียด | เอกสารที่นำเสนอมีภาพรวมของอัลกอริทึมน้อยกว่า 3 รายการพร้อมเทคนิคการจำแนกประเภท และภาพรวมไม่มีการอธิบายอย่างดีหรือละเอียด | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/1-Introduction/solution/Julia/README.md b/translations/th/4-Classification/1-Introduction/solution/Julia/README.md new file mode 100644 index 000000000..33eb186fd --- /dev/null +++ b/translations/th/4-Classification/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/2-Classifiers-1/README.md b/translations/th/4-Classification/2-Classifiers-1/README.md new file mode 100644 index 000000000..9f9390733 --- /dev/null +++ b/translations/th/4-Classification/2-Classifiers-1/README.md @@ -0,0 +1,253 @@ + +# ตัวจำแนกประเภทอาหาร 1 + +ในบทเรียนนี้ คุณจะใช้ชุดข้อมูลที่คุณบันทึกไว้จากบทเรียนก่อน ซึ่งเต็มไปด้วยข้อมูลที่สมดุลและสะอาดเกี่ยวกับอาหารหลากหลายประเภท + +คุณจะใช้ชุดข้อมูลนี้ร่วมกับตัวจำแนกประเภทหลากหลายชนิดเพื่อ _ทำนายประเภทอาหารของชาติใดชาติหนึ่งจากกลุ่มของส่วนผสม_ ในขณะที่ทำเช่นนั้น คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับวิธีการที่อัลกอริทึมสามารถนำมาใช้ในงานการจำแนกประเภท + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) +# การเตรียมตัว + +สมมติว่าคุณได้ทำ [บทเรียนที่ 1](../1-Introduction/README.md) เสร็จแล้ว ตรวจสอบให้แน่ใจว่าไฟล์ _cleaned_cuisines.csv_ มีอยู่ในโฟลเดอร์ `/data` หลักสำหรับบทเรียนทั้งสี่นี้ + +## แบบฝึกหัด - ทำนายประเภทอาหารของชาติ + +1. ทำงานในโฟลเดอร์ _notebook.ipynb_ ของบทเรียนนี้ นำเข้าไฟล์นั้นพร้อมกับไลบรารี Pandas: + + ```python + import pandas as pd + cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") + cuisines_df.head() + ``` + + ข้อมูลจะมีลักษณะดังนี้: + +| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | +| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | + + +1. ตอนนี้นำเข้าไลบรารีเพิ่มเติม: + + ```python + from sklearn.linear_model import LogisticRegression + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + from sklearn.svm import SVC + import numpy as np + ``` + +1. แบ่งพิกัด X และ y ออกเป็นสอง DataFrame สำหรับการฝึก `cuisine` สามารถเป็น DataFrame ของป้ายกำกับ: + + ```python + cuisines_label_df = cuisines_df['cuisine'] + cuisines_label_df.head() + ``` + + จะมีลักษณะดังนี้: + + ```output + 0 indian + 1 indian + 2 indian + 3 indian + 4 indian + Name: cuisine, dtype: object + ``` + +1. ลบคอลัมน์ `Unnamed: 0` และคอลัมน์ `cuisine` โดยใช้ `drop()` และบันทึกข้อมูลที่เหลือเป็นคุณสมบัติที่สามารถฝึกได้: + + ```python + cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) + cuisines_feature_df.head() + ``` + + คุณสมบัติของคุณจะมีลักษณะดังนี้: + +| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | +| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | + +ตอนนี้คุณพร้อมที่จะฝึกโมเดลของคุณแล้ว! + +## การเลือกตัวจำแนกประเภท + +เมื่อข้อมูลของคุณสะอาดและพร้อมสำหรับการฝึก คุณต้องตัดสินใจว่าจะใช้อัลกอริทึมใดสำหรับงานนี้ + +Scikit-learn จัดกลุ่มการจำแนกประเภทไว้ในหมวดการเรียนรู้แบบมีผู้สอน และในหมวดหมู่นี้คุณจะพบวิธีการจำแนกประเภทมากมาย [ความหลากหลาย](https://scikit-learn.org/stable/supervised_learning.html) อาจดูน่าตกใจในตอนแรก วิธีการต่อไปนี้ล้วนมีเทคนิคการจำแนกประเภท: + +- โมเดลเชิงเส้น +- Support Vector Machines +- Stochastic Gradient Descent +- Nearest Neighbors +- Gaussian Processes +- Decision Trees +- Ensemble methods (voting Classifier) +- อัลกอริทึมแบบหลายคลาสและหลายผลลัพธ์ (multiclass และ multilabel classification, multiclass-multioutput classification) + +> คุณสามารถใช้ [neural networks เพื่อจำแนกข้อมูล](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification) ได้เช่นกัน แต่สิ่งนี้อยู่นอกขอบเขตของบทเรียนนี้ + +### จะเลือกตัวจำแนกประเภทใด? + +แล้วคุณควรเลือกตัวจำแนกประเภทใด? บ่อยครั้ง การลองใช้หลายตัวและมองหาผลลัพธ์ที่ดีเป็นวิธีการทดสอบ Scikit-learn มี [การเปรียบเทียบแบบเคียงข้างกัน](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) บนชุดข้อมูลที่สร้างขึ้น โดยเปรียบเทียบ KNeighbors, SVC สองวิธี, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB และ QuadraticDiscrinationAnalysis พร้อมแสดงผลลัพธ์ในรูปแบบภาพ: + +![การเปรียบเทียบตัวจำแนกประเภท](../../../../4-Classification/2-Classifiers-1/images/comparison.png) +> กราฟที่สร้างขึ้นจากเอกสารของ Scikit-learn + +> AutoML แก้ปัญหานี้ได้อย่างง่ายดายโดยการรันการเปรียบเทียบเหล่านี้ในคลาวด์ ทำให้คุณสามารถเลือกอัลกอริทึมที่ดีที่สุดสำหรับข้อมูลของคุณ ลองใช้ [ที่นี่](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott) + +### วิธีที่ดีกว่า + +วิธีที่ดีกว่าการเดาแบบสุ่มคือการปฏิบัติตามแนวคิดใน [ML Cheat sheet](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott) ที่สามารถดาวน์โหลดได้ ที่นี่เราพบว่า สำหรับปัญหาแบบหลายคลาส เรามีตัวเลือกบางอย่าง: + +![cheatsheet สำหรับปัญหาแบบหลายคลาส](../../../../4-Classification/2-Classifiers-1/images/cheatsheet.png) +> ส่วนหนึ่งของ Algorithm Cheat Sheet ของ Microsoft ที่แสดงตัวเลือกการจำแนกประเภทแบบหลายคลาส + +✅ ดาวน์โหลด cheat sheet นี้ พิมพ์ออกมา และติดไว้บนผนังของคุณ! + +### การใช้เหตุผล + +ลองดูว่าเราสามารถใช้เหตุผลเพื่อเลือกวิธีการต่าง ๆ ได้หรือไม่ โดยพิจารณาจากข้อจำกัดที่เรามี: + +- **Neural networks หนักเกินไป** เนื่องจากชุดข้อมูลของเราสะอาดแต่มีขนาดเล็ก และเรากำลังฝึกโมเดลในเครื่องผ่านโน้ตบุ๊ก Neural networks จึงหนักเกินไปสำหรับงานนี้ +- **ไม่ใช้ตัวจำแนกประเภทแบบสองคลาส** เราไม่ใช้ตัวจำแนกประเภทแบบสองคลาส ดังนั้นจึงไม่ใช้ one-vs-all +- **Decision tree หรือ logistic regression อาจใช้ได้** Decision tree อาจใช้ได้ หรือ logistic regression สำหรับข้อมูลแบบหลายคลาส +- **Multiclass Boosted Decision Trees แก้ปัญหาอื่น** Multiclass Boosted Decision Tree เหมาะสมที่สุดสำหรับงานที่ไม่ใช่พารามิเตอร์ เช่น งานที่ออกแบบมาเพื่อสร้างการจัดอันดับ ดังนั้นจึงไม่เหมาะสำหรับเรา + +### การใช้ Scikit-learn + +เราจะใช้ Scikit-learn เพื่อวิเคราะห์ข้อมูลของเรา อย่างไรก็ตาม มีหลายวิธีในการใช้ logistic regression ใน Scikit-learn ลองดู [พารามิเตอร์ที่ต้องส่ง](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression) + +โดยพื้นฐานแล้วมีสองพารามิเตอร์สำคัญ - `multi_class` และ `solver` - ที่เราต้องระบุเมื่อเราขอให้ Scikit-learn ทำ logistic regression ค่า `multi_class` จะกำหนดพฤติกรรมบางอย่าง ส่วนค่าของ solver คืออัลกอริทึมที่จะใช้ ไม่ใช่ทุก solver ที่สามารถจับคู่กับค่าของ `multi_class` ได้ + +ตามเอกสาร ในกรณีแบบหลายคลาส อัลกอริทึมการฝึก: + +- **ใช้ one-vs-rest (OvR)** หากตัวเลือก `multi_class` ถูกตั้งค่าเป็น `ovr` +- **ใช้ cross-entropy loss** หากตัวเลือก `multi_class` ถูกตั้งค่าเป็น `multinomial` (ปัจจุบันตัวเลือก `multinomial` รองรับเฉพาะ solver ‘lbfgs’, ‘sag’, ‘saga’ และ ‘newton-cg’) + +> 🎓 'scheme' ในที่นี้สามารถเป็น 'ovr' (one-vs-rest) หรือ 'multinomial' เนื่องจาก logistic regression ถูกออกแบบมาเพื่อรองรับการจำแนกประเภทแบบไบนารี scheme เหล่านี้ช่วยให้มันจัดการงานการจำแนกประเภทแบบหลายคลาสได้ดีขึ้น [source](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/) + +> 🎓 'solver' ถูกกำหนดว่าเป็น "อัลกอริทึมที่จะใช้ในปัญหาการเพิ่มประสิทธิภาพ" [source](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression). + +Scikit-learn มีตารางนี้เพื่ออธิบายว่า solver จัดการกับความท้าทายต่าง ๆ ที่เกิดจากโครงสร้างข้อมูลประเภทต่าง ๆ อย่างไร: + +![solvers](../../../../4-Classification/2-Classifiers-1/images/solvers.png) + +## แบบฝึกหัด - แบ่งข้อมูล + +เราสามารถมุ่งเน้นไปที่ logistic regression สำหรับการทดลองฝึกครั้งแรกของเรา เนื่องจากคุณเพิ่งเรียนรู้เกี่ยวกับเรื่องนี้ในบทเรียนก่อนหน้า +แบ่งข้อมูลของคุณออกเป็นกลุ่มการฝึกและการทดสอบโดยเรียกใช้ `train_test_split()`: + +```python +X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) +``` + +## แบบฝึกหัด - ใช้ logistic regression + +เนื่องจากคุณกำลังใช้กรณีแบบหลายคลาส คุณจำเป็นต้องเลือกว่าจะใช้ _scheme_ ใดและตั้งค่า _solver_ อย่างไร ใช้ LogisticRegression พร้อมการตั้งค่าแบบหลายคลาสและ solver **liblinear** เพื่อฝึก + +1. สร้าง logistic regression โดยตั้งค่า multi_class เป็น `ovr` และ solver เป็น `liblinear`: + + ```python + lr = LogisticRegression(multi_class='ovr',solver='liblinear') + model = lr.fit(X_train, np.ravel(y_train)) + + accuracy = model.score(X_test, y_test) + print ("Accuracy is {}".format(accuracy)) + ``` + + ✅ ลองใช้ solver อื่น เช่น `lbfgs` ซึ่งมักถูกตั้งค่าเป็นค่าเริ่มต้น +> หมายเหตุ ใช้ฟังก์ชัน Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) เพื่อแปลงข้อมูลของคุณให้อยู่ในรูปแบบแบนเมื่อจำเป็น +ความแม่นยำดีเกินกว่า **80%**! + +1. คุณสามารถดูการทำงานของโมเดลนี้ได้โดยการทดสอบข้อมูลหนึ่งแถว (#50): + + ```python + print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') + print(f'cuisine: {y_test.iloc[50]}') + ``` + + ผลลัพธ์จะถูกพิมพ์ออกมา: + + ```output + ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') + cuisine: indian + ``` + + ✅ ลองใช้หมายเลขแถวอื่นและตรวจสอบผลลัพธ์ + +1. เจาะลึกลงไปอีก คุณสามารถตรวจสอบความแม่นยำของการทำนายนี้ได้: + + ```python + test= X_test.iloc[50].values.reshape(-1, 1).T + proba = model.predict_proba(test) + classes = model.classes_ + resultdf = pd.DataFrame(data=proba, columns=classes) + + topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) + topPrediction.head() + ``` + + ผลลัพธ์จะถูกพิมพ์ออกมา - อาหารอินเดียเป็นการคาดเดาที่ดีที่สุด พร้อมความน่าจะเป็นที่ดี: + + | | 0 | + | -------: | -------: | + | indian | 0.715851 | + | chinese | 0.229475 | + | japanese | 0.029763 | + | korean | 0.017277 | + | thai | 0.007634 | + + ✅ คุณสามารถอธิบายได้ไหมว่าทำไมโมเดลถึงมั่นใจว่านี่คืออาหารอินเดีย? + +1. ดูรายละเอียดเพิ่มเติมโดยการพิมพ์รายงานการจำแนกประเภท เช่นเดียวกับที่คุณทำในบทเรียนการถดถอย: + + ```python + y_pred = model.predict(X_test) + print(classification_report(y_test,y_pred)) + ``` + + | | precision | recall | f1-score | support | + | ------------ | --------- | ------ | -------- | ------- | + | chinese | 0.73 | 0.71 | 0.72 | 229 | + | indian | 0.91 | 0.93 | 0.92 | 254 | + | japanese | 0.70 | 0.75 | 0.72 | 220 | + | korean | 0.86 | 0.76 | 0.81 | 242 | + | thai | 0.79 | 0.85 | 0.82 | 254 | + | accuracy | 0.80 | 1199 | | | + | macro avg | 0.80 | 0.80 | 0.80 | 1199 | + | weighted avg | 0.80 | 0.80 | 0.80 | 1199 | + +## 🚀ความท้าทาย + +ในบทเรียนนี้ คุณใช้ข้อมูลที่ทำความสะอาดแล้วเพื่อสร้างโมเดลการเรียนรู้ของเครื่องที่สามารถทำนายอาหารประจำชาติได้จากชุดของส่วนผสม ใช้เวลาสักครู่เพื่ออ่านตัวเลือกมากมายที่ Scikit-learn มีให้สำหรับการจำแนกข้อมูล เจาะลึกลงไปในแนวคิดของ 'solver' เพื่อทำความเข้าใจสิ่งที่เกิดขึ้นเบื้องหลัง + +## [แบบทดสอบหลังบทเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +เจาะลึกลงไปอีกในคณิตศาสตร์เบื้องหลังการถดถอยโลจิสติกใน [บทเรียนนี้](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf) +## งานที่ได้รับมอบหมาย + +[ศึกษาตัวแก้ปัญหา](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/2-Classifiers-1/assignment.md b/translations/th/4-Classification/2-Classifiers-1/assignment.md new file mode 100644 index 000000000..a5434c488 --- /dev/null +++ b/translations/th/4-Classification/2-Classifiers-1/assignment.md @@ -0,0 +1,24 @@ + +# ศึกษาตัวแก้ปัญหา +## คำแนะนำ + +ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับตัวแก้ปัญหาต่าง ๆ ที่จับคู่กับอัลกอริทึมและกระบวนการเรียนรู้ของเครื่องเพื่อสร้างโมเดลที่แม่นยำ เดินผ่านตัวแก้ปัญหาที่ระบุไว้ในบทเรียนและเลือกสองตัว ในคำพูดของคุณเอง เปรียบเทียบและเปรียบต่างตัวแก้ปัญหาทั้งสองนี้ พวกเขาแก้ปัญหาแบบไหน? พวกเขาทำงานกับโครงสร้างข้อมูลต่าง ๆ อย่างไร? ทำไมคุณถึงเลือกตัวหนึ่งมากกว่าอีกตัวหนึ่ง? + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| ------ | ---------------------------------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------- | +| | ไฟล์ .doc ถูกนำเสนอพร้อมสองย่อหน้า โดยแต่ละย่อหน้าเปรียบเทียบตัวแก้ปัญหาอย่างรอบคอบ | ไฟล์ .doc ถูกนำเสนอพร้อมเพียงหนึ่งย่อหน้า | งานที่ส่งมายังไม่สมบูรณ์ | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/2-Classifiers-1/solution/Julia/README.md b/translations/th/4-Classification/2-Classifiers-1/solution/Julia/README.md new file mode 100644 index 000000000..d4edb8527 --- /dev/null +++ b/translations/th/4-Classification/2-Classifiers-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/3-Classifiers-2/README.md b/translations/th/4-Classification/3-Classifiers-2/README.md new file mode 100644 index 000000000..df32b6857 --- /dev/null +++ b/translations/th/4-Classification/3-Classifiers-2/README.md @@ -0,0 +1,249 @@ + +# ตัวจำแนกประเภทอาหาร 2 + +ในบทเรียนการจำแนกประเภทครั้งที่สองนี้ คุณจะได้สำรวจวิธีการเพิ่มเติมในการจำแนกข้อมูลเชิงตัวเลข นอกจากนี้คุณยังจะได้เรียนรู้ผลกระทบจากการเลือกตัวจำแนกประเภทหนึ่งเหนืออีกประเภทหนึ่ง + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +### ความรู้พื้นฐานที่ต้องมี + +เราสมมติว่าคุณได้เรียนบทเรียนก่อนหน้านี้แล้ว และมีชุดข้อมูลที่ทำความสะอาดแล้วในโฟลเดอร์ `data` ซึ่งมีชื่อว่า _cleaned_cuisines.csv_ อยู่ในโฟลเดอร์รากของบทเรียน 4 บทนี้ + +### การเตรียมตัว + +เราได้โหลดไฟล์ _notebook.ipynb_ ของคุณพร้อมกับชุดข้อมูลที่ทำความสะอาดแล้ว และได้แบ่งข้อมูลออกเป็น dataframe X และ y ซึ่งพร้อมสำหรับกระบวนการสร้างโมเดล + +## แผนที่การจำแนกประเภท + +ก่อนหน้านี้ คุณได้เรียนรู้เกี่ยวกับตัวเลือกต่าง ๆ ที่คุณมีเมื่อจำแนกข้อมูลโดยใช้แผ่นโกงของ Microsoft Scikit-learn มีแผ่นโกงที่คล้ายกันแต่ละเอียดกว่า ซึ่งสามารถช่วยจำกัดตัวเลือกของคุณให้แคบลงได้ (อีกคำหนึ่งสำหรับตัวจำแนกประเภท): + +![แผนที่ ML จาก Scikit-learn](../../../../4-Classification/3-Classifiers-2/images/map.png) +> เคล็ดลับ: [เยี่ยมชมแผนที่นี้ออนไลน์](https://scikit-learn.org/stable/tutorial/machine_learning_map/) และคลิกตามเส้นทางเพื่ออ่านเอกสารประกอบ + +### แผนการดำเนินการ + +แผนที่นี้มีประโยชน์มากเมื่อคุณเข้าใจข้อมูลของคุณอย่างชัดเจน เพราะคุณสามารถ 'เดิน' ตามเส้นทางเพื่อไปสู่การตัดสินใจ: + +- เรามีตัวอย่าง >50 ตัวอย่าง +- เราต้องการทำนายหมวดหมู่ +- เรามีข้อมูลที่มีป้ายกำกับ +- เรามีตัวอย่างน้อยกว่า 100K ตัวอย่าง +- ✨ เราสามารถเลือก Linear SVC +- หากไม่ได้ผล เนื่องจากเรามีข้อมูลเชิงตัวเลข + - เราสามารถลองใช้ ✨ KNeighbors Classifier + - หากไม่ได้ผล ลองใช้ ✨ SVC และ ✨ Ensemble Classifiers + +นี่เป็นเส้นทางที่มีประโยชน์มากในการติดตาม + +## แบบฝึกหัด - แบ่งข้อมูล + +ตามเส้นทางนี้ เราควรเริ่มต้นด้วยการนำเข้าบางไลบรารีที่จำเป็นต้องใช้ + +1. นำเข้าไลบรารีที่จำเป็น: + + ```python + from sklearn.neighbors import KNeighborsClassifier + from sklearn.linear_model import LogisticRegression + from sklearn.svm import SVC + from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier + from sklearn.model_selection import train_test_split, cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve + import numpy as np + ``` + +1. แบ่งข้อมูลการฝึกอบรมและการทดสอบของคุณ: + + ```python + X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3) + ``` + +## ตัวจำแนก Linear SVC + +Support-Vector clustering (SVC) เป็นส่วนหนึ่งของกลุ่มเทคนิค ML ในตระกูล Support-Vector machines (เรียนรู้เพิ่มเติมเกี่ยวกับสิ่งเหล่านี้ด้านล่าง) ในวิธีนี้ คุณสามารถเลือก 'kernel' เพื่อกำหนดวิธีการจัดกลุ่มป้ายกำกับ พารามิเตอร์ 'C' หมายถึง 'regularization' ซึ่งควบคุมอิทธิพลของพารามิเตอร์ Kernel สามารถเป็นหนึ่งใน [หลายตัวเลือก](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); ที่นี่เราตั้งค่าเป็น 'linear' เพื่อให้แน่ใจว่าเราใช้ Linear SVC ค่า Probability จะตั้งค่าเริ่มต้นเป็น 'false'; ที่นี่เราตั้งค่าเป็น 'true' เพื่อรวบรวมการประมาณความน่าจะเป็น เราตั้งค่า random state เป็น '0' เพื่อสับเปลี่ยนข้อมูลเพื่อรับความน่าจะเป็น + +### แบบฝึกหัด - ใช้ Linear SVC + +เริ่มต้นด้วยการสร้างอาร์เรย์ของตัวจำแนกประเภท คุณจะเพิ่มไปยังอาร์เรย์นี้ทีละขั้นตอนเมื่อเราทดสอบ + +1. เริ่มต้นด้วย Linear SVC: + + ```python + C = 10 + # Create different classifiers. + classifiers = { + 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0) + } + ``` + +2. ฝึกโมเดลของคุณโดยใช้ Linear SVC และพิมพ์รายงานออกมา: + + ```python + n_classifiers = len(classifiers) + + for index, (name, classifier) in enumerate(classifiers.items()): + classifier.fit(X_train, np.ravel(y_train)) + + y_pred = classifier.predict(X_test) + accuracy = accuracy_score(y_test, y_pred) + print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100)) + print(classification_report(y_test,y_pred)) + ``` + + ผลลัพธ์ค่อนข้างดี: + + ```output + Accuracy (train) for Linear SVC: 78.6% + precision recall f1-score support + + chinese 0.71 0.67 0.69 242 + indian 0.88 0.86 0.87 234 + japanese 0.79 0.74 0.76 254 + korean 0.85 0.81 0.83 242 + thai 0.71 0.86 0.78 227 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +## ตัวจำแนก K-Neighbors + +K-Neighbors เป็นส่วนหนึ่งของกลุ่มวิธี ML ในตระกูล "neighbors" ซึ่งสามารถใช้ได้ทั้งการเรียนรู้แบบมีผู้สอนและไม่มีผู้สอน ในวิธีนี้ จะมีการสร้างจุดที่กำหนดไว้ล่วงหน้า และรวบรวมข้อมูลรอบ ๆ จุดเหล่านี้เพื่อให้สามารถทำนายป้ายกำกับทั่วไปสำหรับข้อมูลได้ + +### แบบฝึกหัด - ใช้ตัวจำแนก K-Neighbors + +ตัวจำแนกประเภทก่อนหน้านี้ดีและทำงานได้ดีกับข้อมูล แต่บางทีเราอาจได้ความแม่นยำที่ดีกว่า ลองใช้ตัวจำแนก K-Neighbors + +1. เพิ่มบรรทัดในอาร์เรย์ตัวจำแนกประเภทของคุณ (เพิ่มเครื่องหมายจุลภาคหลังรายการ Linear SVC): + + ```python + 'KNN classifier': KNeighborsClassifier(C), + ``` + + ผลลัพธ์แย่ลงเล็กน้อย: + + ```output + Accuracy (train) for KNN classifier: 73.8% + precision recall f1-score support + + chinese 0.64 0.67 0.66 242 + indian 0.86 0.78 0.82 234 + japanese 0.66 0.83 0.74 254 + korean 0.94 0.58 0.72 242 + thai 0.71 0.82 0.76 227 + + accuracy 0.74 1199 + macro avg 0.76 0.74 0.74 1199 + weighted avg 0.76 0.74 0.74 1199 + ``` + + ✅ เรียนรู้เกี่ยวกับ [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) + +## ตัวจำแนก Support Vector + +ตัวจำแนก Support-Vector เป็นส่วนหนึ่งของกลุ่ม [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) ในวิธี ML ที่ใช้สำหรับงานการจำแนกประเภทและการถดถอย SVMs "แมปตัวอย่างการฝึกอบรมไปยังจุดในพื้นที่" เพื่อเพิ่มระยะห่างระหว่างสองหมวดหมู่ ข้อมูลที่ตามมาจะถูกแมปเข้าสู่พื้นที่นี้เพื่อให้สามารถทำนายหมวดหมู่ของข้อมูลได้ + +### แบบฝึกหัด - ใช้ตัวจำแนก Support Vector + +ลองหาความแม่นยำที่ดีกว่าด้วยตัวจำแนก Support Vector + +1. เพิ่มเครื่องหมายจุลภาคหลังรายการ K-Neighbors และเพิ่มบรรทัดนี้: + + ```python + 'SVC': SVC(), + ``` + + ผลลัพธ์ค่อนข้างดี! + + ```output + Accuracy (train) for SVC: 83.2% + precision recall f1-score support + + chinese 0.79 0.74 0.76 242 + indian 0.88 0.90 0.89 234 + japanese 0.87 0.81 0.84 254 + korean 0.91 0.82 0.86 242 + thai 0.74 0.90 0.81 227 + + accuracy 0.83 1199 + macro avg 0.84 0.83 0.83 1199 + weighted avg 0.84 0.83 0.83 1199 + ``` + + ✅ เรียนรู้เกี่ยวกับ [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm) + +## ตัวจำแนก Ensemble + +ลองติดตามเส้นทางจนถึงจุดสิ้นสุด แม้ว่าการทดสอบก่อนหน้านี้จะค่อนข้างดี ลองใช้ 'Ensemble Classifiers' โดยเฉพาะ Random Forest และ AdaBoost: + +```python + 'RFST': RandomForestClassifier(n_estimators=100), + 'ADA': AdaBoostClassifier(n_estimators=100) +``` + +ผลลัพธ์ดีมาก โดยเฉพาะสำหรับ Random Forest: + +```output +Accuracy (train) for RFST: 84.5% + precision recall f1-score support + + chinese 0.80 0.77 0.78 242 + indian 0.89 0.92 0.90 234 + japanese 0.86 0.84 0.85 254 + korean 0.88 0.83 0.85 242 + thai 0.80 0.87 0.83 227 + + accuracy 0.84 1199 + macro avg 0.85 0.85 0.84 1199 +weighted avg 0.85 0.84 0.84 1199 + +Accuracy (train) for ADA: 72.4% + precision recall f1-score support + + chinese 0.64 0.49 0.56 242 + indian 0.91 0.83 0.87 234 + japanese 0.68 0.69 0.69 254 + korean 0.73 0.79 0.76 242 + thai 0.67 0.83 0.74 227 + + accuracy 0.72 1199 + macro avg 0.73 0.73 0.72 1199 +weighted avg 0.73 0.72 0.72 1199 +``` + +✅ เรียนรู้เกี่ยวกับ [Ensemble Classifiers](https://scikit-learn.org/stable/modules/ensemble.html) + +วิธีการ Machine Learning นี้ "รวมการทำนายของตัวประมาณฐานหลายตัว" เพื่อปรับปรุงคุณภาพของโมเดล ในตัวอย่างของเรา เราใช้ Random Trees และ AdaBoost + +- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest) ซึ่งเป็นวิธีการเฉลี่ย สร้าง 'ป่า' ของ 'ต้นไม้ตัดสินใจ' ที่มีการสุ่มเพื่อหลีกเลี่ยงการ overfitting พารามิเตอร์ n_estimators ถูกตั้งค่าเป็นจำนวนต้นไม้ + +- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) ปรับตัวจำแนกประเภทให้เข้ากับชุดข้อมูล และปรับตัวจำแนกประเภทสำเนาให้เข้ากับชุดข้อมูลเดียวกัน โดยมุ่งเน้นไปที่น้ำหนักของรายการที่จำแนกผิด และปรับการฟิตสำหรับตัวจำแนกประเภทถัดไปเพื่อแก้ไข + +--- + +## 🚀ความท้าทาย + +เทคนิคแต่ละอย่างมีพารามิเตอร์จำนวนมากที่คุณสามารถปรับแต่งได้ ศึกษาพารามิเตอร์เริ่มต้นของแต่ละเทคนิค และคิดเกี่ยวกับผลกระทบของการปรับแต่งพารามิเตอร์เหล่านี้ต่อคุณภาพของโมเดล + +## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +มีคำศัพท์เฉพาะทางมากมายในบทเรียนเหล่านี้ ดังนั้นใช้เวลาสักครู่เพื่อทบทวน [รายการนี้](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) ของคำศัพท์ที่มีประโยชน์! + +## งานที่ได้รับมอบหมาย + +[Parameter play](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/3-Classifiers-2/assignment.md b/translations/th/4-Classification/3-Classifiers-2/assignment.md new file mode 100644 index 000000000..8e10e39c6 --- /dev/null +++ b/translations/th/4-Classification/3-Classifiers-2/assignment.md @@ -0,0 +1,25 @@ + +# การเล่นกับพารามิเตอร์ + +## คำแนะนำ + +มีพารามิเตอร์มากมายที่ถูกตั้งค่าไว้โดยค่าเริ่มต้นเมื่อทำงานกับตัวจำแนกประเภทเหล่านี้ Intellisense ใน VS Code สามารถช่วยคุณสำรวจพารามิเตอร์เหล่านั้น เลือกหนึ่งในเทคนิคการจำแนกประเภทของ ML ในบทเรียนนี้และฝึกโมเดลใหม่โดยปรับค่าพารามิเตอร์ต่างๆ สร้างโน้ตบุ๊กที่อธิบายว่าทำไมการเปลี่ยนแปลงบางอย่างถึงช่วยเพิ่มคุณภาพของโมเดล ในขณะที่บางอย่างกลับทำให้คุณภาพลดลง ให้คำตอบของคุณมีรายละเอียด + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| ------ | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | -------------------------- | +| | มีโน้ตบุ๊กที่นำเสนอพร้อมตัวจำแนกประเภทที่สร้างขึ้นอย่างสมบูรณ์และมีการปรับค่าพารามิเตอร์ พร้อมคำอธิบายในกล่องข้อความ | มีโน้ตบุ๊กที่นำเสนอเพียงบางส่วนหรืออธิบายไม่ชัดเจน | มีโน้ตบุ๊กที่มีข้อบกพร่องหรือผิดพลาด | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/3-Classifiers-2/solution/Julia/README.md b/translations/th/4-Classification/3-Classifiers-2/solution/Julia/README.md new file mode 100644 index 000000000..a52b126ed --- /dev/null +++ b/translations/th/4-Classification/3-Classifiers-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาที่เป็นต้นฉบับควรถือว่าเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/4-Applied/README.md b/translations/th/4-Classification/4-Applied/README.md new file mode 100644 index 000000000..26a838b6e --- /dev/null +++ b/translations/th/4-Classification/4-Applied/README.md @@ -0,0 +1,329 @@ + +# สร้างเว็บแอปแนะนำเมนูอาหาร + +ในบทเรียนนี้ คุณจะสร้างโมเดลการจำแนกประเภทโดยใช้เทคนิคที่คุณได้เรียนรู้ในบทเรียนก่อนหน้า พร้อมกับชุดข้อมูลเมนูอาหารที่น่ารับประทานซึ่งใช้ตลอดซีรีส์นี้ นอกจากนี้ คุณจะสร้างเว็บแอปเล็กๆ เพื่อใช้งานโมเดลที่บันทึกไว้ โดยใช้ Onnx Web Runtime + +หนึ่งในประโยชน์ที่สำคัญของการเรียนรู้ด้วยเครื่องคือการสร้างระบบแนะนำ และวันนี้คุณสามารถเริ่มต้นในเส้นทางนั้นได้! + +[![นำเสนอเว็บแอปนี้](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Applied ML") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: Jen Looper สร้างเว็บแอปโดยใช้ข้อมูลเมนูอาหารที่จำแนกไว้ + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +ในบทเรียนนี้คุณจะได้เรียนรู้: + +- วิธีสร้างโมเดลและบันทึกเป็นโมเดล Onnx +- วิธีใช้ Netron เพื่อตรวจสอบโมเดล +- วิธีใช้โมเดลในเว็บแอปเพื่อการคาดการณ์ + +## สร้างโมเดลของคุณ + +การสร้างระบบ ML ที่ใช้งานได้จริงเป็นส่วนสำคัญในการนำเทคโนโลยีเหล่านี้มาใช้ในระบบธุรกิจของคุณ คุณสามารถใช้โมเดลในแอปพลิเคชันเว็บของคุณ (และใช้งานในบริบทออฟไลน์หากจำเป็น) โดยใช้ Onnx + +ใน [บทเรียนก่อนหน้า](../../3-Web-App/1-Web-App/README.md) คุณได้สร้างโมเดล Regression เกี่ยวกับการพบเห็น UFO และ "pickled" โมเดลนั้นเพื่อใช้งานในแอป Flask แม้ว่าโครงสร้างนี้จะมีประโยชน์มาก แต่เป็นแอป Python แบบเต็มรูปแบบ และความต้องการของคุณอาจรวมถึงการใช้แอปพลิเคชัน JavaScript + +ในบทเรียนนี้ คุณสามารถสร้างระบบพื้นฐานที่ใช้ JavaScript สำหรับการคาดการณ์ได้ แต่ก่อนอื่น คุณต้องฝึกโมเดลและแปลงมันเพื่อใช้งานกับ Onnx + +## แบบฝึกหัด - ฝึกโมเดลการจำแนกประเภท + +เริ่มต้นด้วยการฝึกโมเดลการจำแนกประเภทโดยใช้ชุดข้อมูลเมนูอาหารที่ทำความสะอาดแล้วที่เราใช้ก่อนหน้านี้ + +1. เริ่มต้นด้วยการนำเข้าห้องสมุดที่มีประโยชน์: + + ```python + !pip install skl2onnx + import pandas as pd + ``` + + คุณต้องใช้ '[skl2onnx](https://onnx.ai/sklearn-onnx/)' เพื่อช่วยแปลงโมเดล Scikit-learn ของคุณเป็นรูปแบบ Onnx + +1. จากนั้นทำงานกับข้อมูลในลักษณะเดียวกับที่คุณทำในบทเรียนก่อนหน้า โดยการอ่านไฟล์ CSV ด้วย `read_csv()`: + + ```python + data = pd.read_csv('../data/cleaned_cuisines.csv') + data.head() + ``` + +1. ลบสองคอลัมน์แรกที่ไม่จำเป็นออก และบันทึกข้อมูลที่เหลือเป็น 'X': + + ```python + X = data.iloc[:,2:] + X.head() + ``` + +1. บันทึกป้ายกำกับเป็น 'y': + + ```python + y = data[['cuisine']] + y.head() + + ``` + +### เริ่มต้นกระบวนการฝึกโมเดล + +เราจะใช้ห้องสมุด 'SVC' ซึ่งมีความแม่นยำดี + +1. นำเข้าห้องสมุดที่เหมาะสมจาก Scikit-learn: + + ```python + from sklearn.model_selection import train_test_split + from sklearn.svm import SVC + from sklearn.model_selection import cross_val_score + from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report + ``` + +1. แยกชุดข้อมูลการฝึกและการทดสอบ: + + ```python + X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3) + ``` + +1. สร้างโมเดลการจำแนกประเภท SVC เหมือนที่คุณทำในบทเรียนก่อนหน้า: + + ```python + model = SVC(kernel='linear', C=10, probability=True,random_state=0) + model.fit(X_train,y_train.values.ravel()) + ``` + +1. ทดสอบโมเดลของคุณโดยเรียกใช้ `predict()`: + + ```python + y_pred = model.predict(X_test) + ``` + +1. พิมพ์รายงานการจำแนกประเภทเพื่อตรวจสอบคุณภาพของโมเดล: + + ```python + print(classification_report(y_test,y_pred)) + ``` + + ดังที่เราเห็นก่อนหน้านี้ ความแม่นยำดี: + + ```output + precision recall f1-score support + + chinese 0.72 0.69 0.70 257 + indian 0.91 0.87 0.89 243 + japanese 0.79 0.77 0.78 239 + korean 0.83 0.79 0.81 236 + thai 0.72 0.84 0.78 224 + + accuracy 0.79 1199 + macro avg 0.79 0.79 0.79 1199 + weighted avg 0.79 0.79 0.79 1199 + ``` + +### แปลงโมเดลของคุณเป็น Onnx + +ตรวจสอบให้แน่ใจว่าการแปลงใช้จำนวน Tensor ที่เหมาะสม ชุดข้อมูลนี้มีส่วนผสม 380 รายการ ดังนั้นคุณต้องระบุจำนวนดังกล่าวใน `FloatTensorType`: + +1. แปลงโดยใช้จำนวน Tensor เท่ากับ 380: + + ```python + from skl2onnx import convert_sklearn + from skl2onnx.common.data_types import FloatTensorType + + initial_type = [('float_input', FloatTensorType([None, 380]))] + options = {id(model): {'nocl': True, 'zipmap': False}} + ``` + +1. สร้างไฟล์ onx และบันทึกเป็น **model.onnx**: + + ```python + onx = convert_sklearn(model, initial_types=initial_type, options=options) + with open("./model.onnx", "wb") as f: + f.write(onx.SerializeToString()) + ``` + + > หมายเหตุ คุณสามารถส่ง [options](https://onnx.ai/sklearn-onnx/parameterized.html) ในสคริปต์การแปลงของคุณได้ ในกรณีนี้ เราได้ตั้งค่า 'nocl' เป็น True และ 'zipmap' เป็น False เนื่องจากนี่เป็นโมเดลการจำแนกประเภท คุณมีตัวเลือกในการลบ ZipMap ซึ่งสร้างรายการของ dictionary (ไม่จำเป็น) `nocl` หมายถึงข้อมูลคลาสที่รวมอยู่ในโมเดล ลดขนาดโมเดลของคุณโดยตั้งค่า `nocl` เป็น 'True' + +การรันโน้ตบุ๊กทั้งหมดจะสร้างโมเดล Onnx และบันทึกไว้ในโฟลเดอร์นี้ + +## ดูโมเดลของคุณ + +โมเดล Onnx ไม่สามารถมองเห็นได้ชัดเจนใน Visual Studio Code แต่มีซอฟต์แวร์ฟรีที่ดีมากที่นักวิจัยหลายคนใช้เพื่อดูโมเดลเพื่อให้แน่ใจว่าสร้างขึ้นอย่างถูกต้อง ดาวน์โหลด [Netron](https://github.com/lutzroeder/Netron) และเปิดไฟล์ model.onnx ของคุณ คุณจะเห็นโมเดลง่ายๆ ของคุณที่มี 380 อินพุตและตัวจำแนกประเภท: + +![Netron visual](../../../../4-Classification/4-Applied/images/netron.png) + +Netron เป็นเครื่องมือที่มีประโยชน์ในการดูโมเดลของคุณ + +ตอนนี้คุณพร้อมที่จะใช้โมเดลที่น่าสนใจนี้ในเว็บแอปแล้ว มาสร้างแอปที่มีประโยชน์เมื่อคุณมองเข้าไปในตู้เย็นและพยายามหาว่าส่วนผสมที่เหลืออยู่สามารถใช้ทำอาหารประเภทใดได้บ้างตามที่โมเดลของคุณกำหนด + +## สร้างเว็บแอปแนะนำเมนูอาหาร + +คุณสามารถใช้โมเดลของคุณโดยตรงในเว็บแอป โครงสร้างนี้ยังช่วยให้คุณรันมันในเครื่องและแม้กระทั่งออฟไลน์หากจำเป็น เริ่มต้นด้วยการสร้างไฟล์ `index.html` ในโฟลเดอร์เดียวกับที่คุณบันทึกไฟล์ `model.onnx` + +1. ในไฟล์นี้ _index.html_ เพิ่มมาร์กอัปต่อไปนี้: + + ```html + + +
                      + Cuisine Matcher +
                      + + ... + + + ``` + +1. ตอนนี้ ทำงานภายในแท็ก `body` เพิ่มมาร์กอัปเล็กน้อยเพื่อแสดงรายการของกล่องเลือกที่สะท้อนถึงส่วนผสมบางอย่าง: + + ```html +

                      Check your refrigerator. What can you create?

                      +
                      +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      +
                      +
                      + +
                      + ``` + + สังเกตว่ากล่องเลือกแต่ละกล่องมีค่า ซึ่งสะท้อนถึงดัชนีที่ส่วนผสมอยู่ตามชุดข้อมูล ตัวอย่างเช่น แอปเปิ้ลในรายการตัวอักษรนี้อยู่ในคอลัมน์ที่ห้า ดังนั้นค่าของมันคือ '4' เนื่องจากเราเริ่มนับจาก 0 คุณสามารถดู [สเปรดชีตส่วนผสม](../../../../4-Classification/data/ingredient_indexes.csv) เพื่อค้นหาดัชนีของส่วนผสมที่กำหนด + + ดำเนินการต่อในไฟล์ index.html เพิ่มบล็อกสคริปต์ที่เรียกโมเดลหลังจากปิดแท็ก `` สุดท้าย + +1. ก่อนอื่น นำเข้า [Onnx Runtime](https://www.onnxruntime.ai/): + + ```html + + ``` + + > Onnx Runtime ใช้เพื่อช่วยให้สามารถรันโมเดล Onnx ของคุณบนแพลตฟอร์มฮาร์ดแวร์ที่หลากหลาย รวมถึงการปรับแต่งและ API เพื่อใช้งาน + +1. เมื่อ Runtime อยู่ในที่แล้ว คุณสามารถเรียกใช้งานได้: + + ```html + + ``` + +ในโค้ดนี้ มีหลายสิ่งที่เกิดขึ้น: + +1. คุณสร้างอาร์เรย์ที่มีค่า 380 ค่า (1 หรือ 0) เพื่อกำหนดและส่งไปยังโมเดลเพื่อการคาดการณ์ ขึ้นอยู่กับว่ากล่องเลือกส่วนผสมถูกเลือกหรือไม่ +2. คุณสร้างอาร์เรย์ของกล่องเลือกและวิธีการตรวจสอบว่ากล่องเลือกถูกเลือกในฟังก์ชัน `init` ที่ถูกเรียกเมื่อแอปพลิเคชันเริ่มต้น เมื่อกล่องเลือกถูกเลือก อาร์เรย์ `ingredients` จะถูกเปลี่ยนแปลงเพื่อสะท้อนส่วนผสมที่เลือก +3. คุณสร้างฟังก์ชัน `testCheckboxes` ที่ตรวจสอบว่ามีกล่องเลือกใดถูกเลือกหรือไม่ +4. คุณใช้ฟังก์ชัน `startInference` เมื่อปุ่มถูกกด และหากมีกล่องเลือกใดถูกเลือก คุณจะเริ่มการคาดการณ์ +5. รูทีนการคาดการณ์รวมถึง: + 1. การตั้งค่าการโหลดแบบอะซิงโครนัสของโมเดล + 2. การสร้างโครงสร้าง Tensor เพื่อส่งไปยังโมเดล + 3. การสร้าง 'feeds' ที่สะท้อนถึงอินพุต `float_input` ที่คุณสร้างเมื่อฝึกโมเดลของคุณ (คุณสามารถใช้ Netron เพื่อตรวจสอบชื่อนั้น) + 4. การส่ง 'feeds' เหล่านี้ไปยังโมเดลและรอการตอบกลับ + +## ทดสอบแอปพลิเคชันของคุณ + +เปิดเซสชันเทอร์มินัลใน Visual Studio Code ในโฟลเดอร์ที่ไฟล์ index.html ของคุณอยู่ ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง [http-server](https://www.npmjs.com/package/http-server) ไว้ทั่วโลก และพิมพ์ `http-server` ที่พรอมต์ localhost จะเปิดขึ้นและคุณสามารถดูเว็บแอปของคุณได้ ตรวจสอบว่าเมนูอาหารใดที่แนะนำตามส่วนผสมต่างๆ: + +![ingredient web app](../../../../4-Classification/4-Applied/images/web-app.png) + +ยินดีด้วย คุณได้สร้างเว็บแอป 'แนะนำ' พร้อมฟิลด์ไม่กี่ฟิลด์ ใช้เวลาสร้างระบบนี้เพิ่มเติม! + +## 🚀ความท้าทาย + +เว็บแอปของคุณยังค่อนข้างเรียบง่าย ดังนั้นให้สร้างมันต่อโดยใช้ส่วนผสมและดัชนีของมันจากข้อมูล [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv) รสชาติแบบไหนที่เหมาะสมในการสร้างอาหารประจำชาติ? + +## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +แม้ว่าบทเรียนนี้จะกล่าวถึงประโยชน์ของการสร้างระบบแนะนำสำหรับส่วนผสมอาหารเพียงเล็กน้อย แต่พื้นที่ของแอปพลิเคชัน ML นี้มีตัวอย่างที่หลากหลาย อ่านเพิ่มเติมเกี่ยวกับวิธีการสร้างระบบเหล่านี้: + +- https://www.sciencedirect.com/topics/computer-science/recommendation-engine +- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/ +- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/ + +## งานที่ได้รับมอบหมาย + +[สร้างระบบแนะนำใหม่](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/4-Applied/assignment.md b/translations/th/4-Classification/4-Applied/assignment.md new file mode 100644 index 000000000..77d906c86 --- /dev/null +++ b/translations/th/4-Classification/4-Applied/assignment.md @@ -0,0 +1,25 @@ + +# สร้างระบบแนะนำ + +## คำแนะนำ + +จากแบบฝึกหัดในบทเรียนนี้ คุณได้เรียนรู้วิธีสร้างเว็บแอปพลิเคชันด้วย JavaScript โดยใช้ Onnx Runtime และโมเดล Onnx ที่ถูกแปลงแล้ว ลองทดลองสร้างระบบแนะนำใหม่โดยใช้ข้อมูลจากบทเรียนนี้หรือแหล่งข้อมูลอื่น (อย่าลืมให้เครดิตด้วย) คุณอาจสร้างระบบแนะนำสัตว์เลี้ยงโดยพิจารณาจากลักษณะนิสัยต่างๆ หรือระบบแนะนำแนวเพลงตามอารมณ์ของผู้ใช้งาน ใช้ความคิดสร้างสรรค์ให้เต็มที่! + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | พอใช้ | ต้องปรับปรุง | +| -------- | ---------------------------------------------------------------------- | ------------------------------------- | --------------------------------- | +| | มีเว็บแอปพลิเคชันและสมุดบันทึกที่นำเสนอ ทั้งสองส่วนมีการอธิบายอย่างดีและสามารถทำงานได้ | ขาดหนึ่งในสองส่วนหรือมีข้อบกพร่อง | ทั้งสองส่วนขาดหายหรือมีข้อบกพร่อง | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยระบบอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/4-Classification/README.md b/translations/th/4-Classification/README.md new file mode 100644 index 000000000..f1e7d0bf8 --- /dev/null +++ b/translations/th/4-Classification/README.md @@ -0,0 +1,41 @@ + +# เริ่มต้นกับการจำแนกประเภท + +## หัวข้อภูมิภาค: อาหารเอเชียและอินเดียแสนอร่อย 🍜 + +ในเอเชียและอินเดีย ประเพณีการกินอาหารมีความหลากหลายและอร่อยมาก! มาดูข้อมูลเกี่ยวกับอาหารประจำภูมิภาคเพื่อทำความเข้าใจเกี่ยวกับส่วนผสมของพวกเขากันเถอะ + +![ผู้ขายอาหารไทย](../../../4-Classification/images/thai-food.jpg) +> ภาพถ่ายโดย Lisheng Chang บน Unsplash + +## สิ่งที่คุณจะได้เรียนรู้ + +ในส่วนนี้ คุณจะต่อยอดจากการศึกษาการถดถอย (Regression) และเรียนรู้เกี่ยวกับตัวจำแนกประเภทอื่นๆ ที่คุณสามารถใช้เพื่อทำความเข้าใจข้อมูลได้ดียิ่งขึ้น + +> มีเครื่องมือที่ใช้งานง่ายซึ่งสามารถช่วยคุณเรียนรู้เกี่ยวกับการทำงานกับโมเดลการจำแนกประเภท ลองใช้ [Azure ML สำหรับงานนี้](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## บทเรียน + +1. [แนะนำการจำแนกประเภท](1-Introduction/README.md) +2. [ตัวจำแนกประเภทเพิ่มเติม](2-Classifiers-1/README.md) +3. [ตัวจำแนกประเภทอื่นๆ](3-Classifiers-2/README.md) +4. [การประยุกต์ใช้ ML: สร้างเว็บแอป](4-Applied/README.md) + +## เครดิต + +"เริ่มต้นกับการจำแนกประเภท" เขียนด้วย ♥️ โดย [Cassie Breviu](https://www.twitter.com/cassiebreviu) และ [Jen Looper](https://www.twitter.com/jenlooper) + +ชุดข้อมูลอาหารแสนอร่อยนำมาจาก [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/5-Clustering/1-Visualize/README.md b/translations/th/5-Clustering/1-Visualize/README.md new file mode 100644 index 000000000..604eca750 --- /dev/null +++ b/translations/th/5-Clustering/1-Visualize/README.md @@ -0,0 +1,347 @@ + +# บทนำเกี่ยวกับการจัดกลุ่มข้อมูล + +การจัดกลุ่มข้อมูล (Clustering) เป็นรูปแบบหนึ่งของ [การเรียนรู้แบบไม่มีผู้สอน](https://wikipedia.org/wiki/Unsupervised_learning) ซึ่งสมมติว่าชุดข้อมูลไม่มีการติดป้ายกำกับ หรือข้อมูลนำเข้าไม่ได้จับคู่กับผลลัพธ์ที่กำหนดไว้ล่วงหน้า โดยใช้หลากหลายอัลกอริทึมเพื่อจัดเรียงข้อมูลที่ไม่มีการติดป้ายกำกับ และสร้างกลุ่มตามรูปแบบที่พบในข้อมูล + +[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ ขณะคุณกำลังศึกษาเรื่องการเรียนรู้ของเครื่องด้วยการจัดกลุ่มข้อมูล ลองฟังเพลงแนว Dance Hall ของไนจีเรีย - นี่คือเพลงที่ได้รับความนิยมสูงในปี 2014 โดย PSquare + +## [แบบทดสอบก่อนการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +### บทนำ + +[การจัดกลุ่มข้อมูล](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) มีประโยชน์มากสำหรับการสำรวจข้อมูล ลองมาดูกันว่ามันสามารถช่วยค้นพบแนวโน้มและรูปแบบในวิธีที่ผู้ชมชาวไนจีเรียบริโภคเพลงได้หรือไม่ + +✅ ลองใช้เวลาสักครู่คิดถึงการใช้งานของการจัดกลุ่มข้อมูล ในชีวิตจริง การจัดกลุ่มเกิดขึ้นเมื่อคุณมีกองผ้าซักและต้องแยกเสื้อผ้าของสมาชิกในครอบครัว 🧦👕👖🩲 ในวิทยาศาสตร์ข้อมูล การจัดกลุ่มเกิดขึ้นเมื่อพยายามวิเคราะห์ความชอบของผู้ใช้ หรือกำหนดลักษณะของชุดข้อมูลที่ไม่มีการติดป้ายกำกับ การจัดกลุ่มช่วยทำให้ความยุ่งเหยิงมีความหมาย เช่น ลิ้นชักถุงเท้า + +[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: John Guttag จาก MIT แนะนำเรื่องการจัดกลุ่มข้อมูล + +ในสภาพแวดล้อมการทำงาน การจัดกลุ่มสามารถใช้เพื่อกำหนดสิ่งต่าง ๆ เช่น การแบ่งส่วนตลาด หรือการระบุว่ากลุ่มอายุใดซื้อสินค้าอะไร ตัวอย่างอื่น ๆ คือการตรวจจับความผิดปกติ เช่น การตรวจจับการฉ้อโกงจากชุดข้อมูลธุรกรรมบัตรเครดิต หรือการใช้การจัดกลุ่มเพื่อระบุเนื้องอกจากชุดภาพสแกนทางการแพทย์ + +✅ ลองคิดสักครู่เกี่ยวกับวิธีที่คุณอาจเคยพบการจัดกลุ่มข้อมูลในชีวิตจริง เช่น ในธนาคาร อีคอมเมิร์ซ หรือธุรกิจ + +> 🎓 น่าสนใจที่การวิเคราะห์การจัดกลุ่มมีต้นกำเนิดในสาขามานุษยวิทยาและจิตวิทยาในช่วงปี 1930 คุณจินตนาการได้ไหมว่ามันถูกใช้อย่างไรในตอนนั้น? + +อีกทางหนึ่ง คุณสามารถใช้มันเพื่อจัดกลุ่มผลการค้นหา - เช่น ลิงก์การช็อปปิ้ง รูปภาพ หรือรีวิว การจัดกลุ่มมีประโยชน์เมื่อคุณมีชุดข้อมูลขนาดใหญ่ที่ต้องการลดขนาดลง และต้องการวิเคราะห์ในเชิงลึกมากขึ้น ดังนั้นเทคนิคนี้สามารถใช้เพื่อเรียนรู้เกี่ยวกับข้อมูลก่อนที่จะสร้างโมเดลอื่น ๆ + +✅ เมื่อข้อมูลของคุณถูกจัดกลุ่มแล้ว คุณสามารถกำหนดรหัสกลุ่มให้กับมัน เทคนิคนี้มีประโยชน์เมื่อคุณต้องการรักษาความเป็นส่วนตัวของชุดข้อมูล คุณสามารถอ้างถึงจุดข้อมูลโดยใช้รหัสกลุ่มแทนที่จะใช้ข้อมูลที่สามารถระบุตัวตนได้ คุณคิดเหตุผลอื่น ๆ ได้ไหมว่าทำไมคุณถึงเลือกใช้รหัสกลุ่มแทนที่จะใช้ข้อมูลอื่น ๆ ในกลุ่มเพื่อระบุข้อมูล? + +เพิ่มพูนความเข้าใจของคุณเกี่ยวกับเทคนิคการจัดกลุ่มใน [โมดูลการเรียนรู้](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) + +## เริ่มต้นกับการจัดกลุ่มข้อมูล + +[Scikit-learn มีวิธีการมากมาย](https://scikit-learn.org/stable/modules/clustering.html) สำหรับการจัดกลุ่มข้อมูล ประเภทที่คุณเลือกจะขึ้นอยู่กับกรณีการใช้งานของคุณ ตามเอกสารประกอบ แต่ละวิธีมีประโยชน์ที่แตกต่างกัน นี่คือตารางที่เรียบง่ายของวิธีการที่ Scikit-learn รองรับและกรณีการใช้งานที่เหมาะสม: + +| ชื่อวิธีการ | กรณีการใช้งาน | +| :--------------------------- | :--------------------------------------------------------------------- | +| K-Means | ใช้งานทั่วไป, แบบ inductive | +| Affinity propagation | กลุ่มจำนวนมาก, ไม่เท่ากัน, แบบ inductive | +| Mean-shift | กลุ่มจำนวนมาก, ไม่เท่ากัน, แบบ inductive | +| Spectral clustering | กลุ่มจำนวนน้อย, เท่ากัน, แบบ transductive | +| Ward hierarchical clustering | กลุ่มจำนวนมาก, ถูกจำกัด, แบบ transductive | +| Agglomerative clustering | กลุ่มจำนวนมาก, ถูกจำกัด, ระยะทางแบบ non-Euclidean, แบบ transductive | +| DBSCAN | รูปทรงเรขาคณิตแบบ non-flat, กลุ่มไม่เท่ากัน, แบบ transductive | +| OPTICS | รูปทรงเรขาคณิตแบบ non-flat, กลุ่มไม่เท่ากันที่มีความหนาแน่นแปรผัน, แบบ transductive | +| Gaussian mixtures | รูปทรงเรขาคณิตแบบ flat, แบบ inductive | +| BIRCH | ชุดข้อมูลขนาดใหญ่ที่มีค่าผิดปกติ, แบบ inductive | + +> 🎓 วิธีที่เราสร้างกลุ่มข้อมูลมีความเกี่ยวข้องกับวิธีที่เรารวบรวมจุดข้อมูลเข้าด้วยกัน ลองมาทำความเข้าใจคำศัพท์บางคำ: +> +> 🎓 ['Transductive' vs. 'inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning)) +> +> การอนุมานแบบ transductive มาจากกรณีการฝึกอบรมที่สังเกตได้ซึ่งจับคู่กับกรณีทดสอบเฉพาะ การอนุมานแบบ inductive มาจากกรณีการฝึกอบรมที่จับคู่กับกฎทั่วไปซึ่งจะถูกนำไปใช้กับกรณีทดสอบในภายหลัง +> +> ตัวอย่าง: สมมติว่าคุณมีชุดข้อมูลที่มีการติดป้ายกำกับบางส่วน บางรายการเป็น 'records', บางรายการเป็น 'cds', และบางรายการไม่มีป้ายกำกับ งานของคุณคือการให้ป้ายกำกับกับข้อมูลที่ไม่มีป้ายกำกับ หากคุณเลือกวิธี inductive คุณจะฝึกโมเดลเพื่อค้นหา 'records' และ 'cds' และนำป้ายกำกับเหล่านั้นไปใช้กับข้อมูลที่ไม่มีป้ายกำกับ วิธีนี้อาจมีปัญหาในการจัดประเภทสิ่งที่เป็น 'cassettes' ในทางกลับกัน วิธี transductive จะจัดการกับข้อมูลที่ไม่รู้จักได้อย่างมีประสิทธิภาพมากกว่า โดยทำงานเพื่อจัดกลุ่มสิ่งที่คล้ายกันเข้าด้วยกันแล้วนำป้ายกำกับไปใช้กับกลุ่ม ในกรณีนี้ กลุ่มอาจสะท้อนถึง 'สิ่งดนตรีทรงกลม' และ 'สิ่งดนตรีทรงสี่เหลี่ยม' +> +> 🎓 ['Non-flat' vs. 'flat' geometry](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) +> +> มาจากคำศัพท์ทางคณิตศาสตร์ 'non-flat' vs. 'flat' geometry หมายถึงการวัดระยะทางระหว่างจุดโดยใช้วิธีการเรขาคณิตแบบ 'flat' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) หรือ 'non-flat' (non-Euclidean) +> +>'Flat' ในบริบทนี้หมายถึงเรขาคณิตแบบ Euclidean (บางส่วนของมันถูกสอนเป็นเรขาคณิต 'plane') และ non-flat หมายถึงเรขาคณิตแบบ non-Euclidean เรขาคณิตเกี่ยวข้องกับการเรียนรู้ของเครื่องอย่างไร? เนื่องจากทั้งสองสาขามีรากฐานมาจากคณิตศาสตร์ จึงต้องมีวิธีการทั่วไปในการวัดระยะทางระหว่างจุดในกลุ่ม ซึ่งสามารถทำได้ในแบบ 'flat' หรือ 'non-flat' ขึ้นอยู่กับลักษณะของข้อมูล [ระยะทางแบบ Euclidean](https://wikipedia.org/wiki/Euclidean_distance) ถูกวัดเป็นความยาวของเส้นตรงระหว่างสองจุด [ระยะทางแบบ non-Euclidean](https://wikipedia.org/wiki/Non-Euclidean_geometry) ถูกวัดตามเส้นโค้ง หากข้อมูลของคุณเมื่อแสดงภาพดูเหมือนจะไม่อยู่บนระนาบ คุณอาจต้องใช้อัลกอริทึมเฉพาะเพื่อจัดการกับมัน +> +![Flat vs Nonflat Geometry Infographic](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png) +> Infographic โดย [Dasani Madipalli](https://twitter.com/dasani_decoded) +> +> 🎓 ['Distances'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) +> +> กลุ่มข้อมูลถูกกำหนดโดยเมทริกซ์ระยะทาง เช่น ระยะทางระหว่างจุดต่าง ๆ ระยะทางนี้สามารถวัดได้หลายวิธี กลุ่มแบบ Euclidean ถูกกำหนดโดยค่าเฉลี่ยของค่าจุด และมี 'centroid' หรือจุดศูนย์กลาง ระยะทางจึงถูกวัดโดยระยะทางไปยังจุดศูนย์กลางนั้น ระยะทางแบบ non-Euclidean หมายถึง 'clustroids' ซึ่งเป็นจุดที่ใกล้ที่สุดกับจุดอื่น ๆ Clustroids สามารถกำหนดได้หลายวิธี +> +> 🎓 ['Constrained'](https://wikipedia.org/wiki/Constrained_clustering) +> +> [การจัดกลุ่มแบบมีข้อจำกัด](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) แนะนำการเรียนรู้แบบ 'semi-supervised' ในวิธีการแบบไม่มีผู้สอน ความสัมพันธ์ระหว่างจุดถูกกำหนดเป็น 'cannot link' หรือ 'must-link' ดังนั้นจึงมีการบังคับใช้กฎบางอย่างในชุดข้อมูล +> +>ตัวอย่าง: หากอัลกอริทึมถูกปล่อยให้ทำงานกับชุดข้อมูลที่ไม่มีการติดป้ายกำกับหรือมีการติดป้ายกำกับบางส่วน กลุ่มที่มันสร้างขึ้นอาจมีคุณภาพต่ำ ในตัวอย่างข้างต้น กลุ่มอาจจัดกลุ่ม 'สิ่งดนตรีทรงกลม' และ 'สิ่งดนตรีทรงสี่เหลี่ยม' และ 'สิ่งทรงสามเหลี่ยม' และ 'คุกกี้' หากมีการให้ข้อจำกัด หรือกฎบางอย่าง ("สิ่งนั้นต้องทำจากพลาสติก", "สิ่งนั้นต้องสามารถผลิตเสียงดนตรีได้") สิ่งนี้สามารถช่วย 'จำกัด' อัลกอริทึมให้เลือกได้ดีขึ้น +> +> 🎓 'Density' +> +> ข้อมูลที่ 'มีเสียงรบกวน' ถือว่าเป็นข้อมูลที่ 'หนาแน่น' ระยะทางระหว่างจุดในแต่ละกลุ่มของมันอาจพิสูจน์ได้ว่ามีความหนาแน่นมากหรือน้อย และข้อมูลนี้จำเป็นต้องได้รับการวิเคราะห์ด้วยวิธีการจัดกลุ่มที่เหมาะสม [บทความนี้](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) แสดงให้เห็นถึงความแตกต่างระหว่างการใช้ K-Means clustering กับ HDBSCAN เพื่อสำรวจชุดข้อมูลที่มีเสียงรบกวนและความหนาแน่นของกลุ่มที่ไม่เท่ากัน + +## อัลกอริทึมการจัดกลุ่มข้อมูล + +มีอัลกอริทึมการจัดกลุ่มข้อมูลมากกว่า 100 แบบ และการใช้งานขึ้นอยู่กับลักษณะของข้อมูลที่มีอยู่ ลองมาพูดถึงบางอันที่สำคัญ: + +- **การจัดกลุ่มแบบลำดับชั้น** หากวัตถุถูกจัดประเภทโดยความใกล้ชิดกับวัตถุใกล้เคียงมากกว่ากับวัตถุที่อยู่ไกลออกไป กลุ่มจะถูกสร้างขึ้นตามระยะทางของสมาชิกไปยังวัตถุอื่น ๆ การจัดกลุ่มแบบ agglomerative ของ Scikit-learn เป็นแบบลำดับชั้น + + ![Hierarchical clustering Infographic](../../../../5-Clustering/1-Visualize/images/hierarchical.png) + > Infographic โดย [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **การจัดกลุ่มแบบจุดศูนย์กลาง** อัลกอริทึมยอดนิยมนี้ต้องการการเลือก 'k' หรือจำนวนกลุ่มที่จะสร้าง หลังจากนั้นอัลกอริทึมจะกำหนดจุดศูนย์กลางของกลุ่มและรวบรวมข้อมูลรอบจุดนั้น [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) เป็นรูปแบบยอดนิยมของการจัดกลุ่มแบบจุดศูนย์กลาง จุดศูนย์กลางถูกกำหนดโดยค่าเฉลี่ยที่ใกล้ที่สุด จึงเป็นที่มาของชื่อ ระยะทางที่กำลังวัดจากกลุ่มจะถูกลดลง + + ![Centroid clustering Infographic](../../../../5-Clustering/1-Visualize/images/centroid.png) + > Infographic โดย [Dasani Madipalli](https://twitter.com/dasani_decoded) + +- **การจัดกลุ่มแบบอิงการกระจาย** อิงจากการสร้างแบบจำลองทางสถิติ การจัดกลุ่มแบบอิงการกระจายมุ่งเน้นไปที่การกำหนดความน่าจะเป็นที่จุดข้อมูลจะอยู่ในกลุ่ม และกำหนดให้ตามนั้น วิธี Gaussian mixture เป็นส่วนหนึ่งของประเภทนี้ + +- **การจัดกลุ่มแบบอิงความหนาแน่น** จุดข้อมูลจะถูกกำหนดให้กับกลุ่มตามความหนาแน่น หรือการรวมตัวกันรอบ ๆ กัน จุดข้อมูลที่อยู่ไกลจากกลุ่มจะถือว่าเป็นค่าผิดปกติหรือเสียงรบกวน DBSCAN, Mean-shift และ OPTICS เป็นส่วนหนึ่งของประเภทนี้ + +- **การจัดกลุ่มแบบอิงกริด** สำหรับชุดข้อมูลหลายมิติ จะมีการสร้างกริดและข้อมูลจะถูกแบ่งออกเป็นเซลล์ของกริดนั้น ซึ่งจะสร้างกลุ่มขึ้นมา + +## แบบฝึกหัด - จัดกลุ่มข้อมูลของคุณ + +การจัดกลุ่มข้อมูลเป็นเทคนิคที่ได้รับการสนับสนุนอย่างมากจากการแสดงภาพที่เหมาะสม ดังนั้นเรามาเริ่มต้นด้วยการแสดงภาพข้อมูลเพลงของเรา แบบฝึกหัดนี้จะช่วยให้เราตัดสินใจได้ว่าวิธีการจัดกลุ่มข้อมูลแบบใดที่ควรใช้ให้เหมาะสมที่สุดกับลักษณะของข้อมูลนี้ + +1. เปิดไฟล์ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) ในโฟลเดอร์นี้ + +1. นำเข้าแพ็กเกจ `Seaborn` เพื่อการแสดงภาพข้อมูลที่ดี + + ```python + !pip install seaborn + ``` + +1. เพิ่มข้อมูลเพลงจาก [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv) โหลด dataframe พร้อมข้อมูลเกี่ยวกับเพลง เตรียมพร้อมสำรวจข้อมูลนี้โดยการนำเข้าห้องสมุดและแสดงข้อมูลออกมา: + + ```python + import matplotlib.pyplot as plt + import pandas as pd + + df = pd.read_csv("../data/nigerian-songs.csv") + df.head() + ``` + + ตรวจสอบบรรทัดแรกของข้อมูล: + + | | name | album | artist | artist_top_genre | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | + | --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ------------ | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- | + | 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 | + | 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 | +| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 | +| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 | +| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 | + +1. เรียก `info()` เพื่อดูข้อมูลเกี่ยวกับ dataframe: + + ```python + df.info() + ``` + + ผลลัพธ์จะมีลักษณะดังนี้: + + ```output + + RangeIndex: 530 entries, 0 to 529 + Data columns (total 16 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 name 530 non-null object + 1 album 530 non-null object + 2 artist 530 non-null object + 3 artist_top_genre 530 non-null object + 4 release_date 530 non-null int64 + 5 length 530 non-null int64 + 6 popularity 530 non-null int64 + 7 danceability 530 non-null float64 + 8 acousticness 530 non-null float64 + 9 energy 530 non-null float64 + 10 instrumentalness 530 non-null float64 + 11 liveness 530 non-null float64 + 12 loudness 530 non-null float64 + 13 speechiness 530 non-null float64 + 14 tempo 530 non-null float64 + 15 time_signature 530 non-null int64 + dtypes: float64(8), int64(4), object(4) + memory usage: 66.4+ KB + ``` + +1. ตรวจสอบค่า null โดยเรียก `isnull()` และตรวจสอบผลรวมว่ามีค่าเป็น 0: + + ```python + df.isnull().sum() + ``` + + ดูดี: + + ```output + name 0 + album 0 + artist 0 + artist_top_genre 0 + release_date 0 + length 0 + popularity 0 + danceability 0 + acousticness 0 + energy 0 + instrumentalness 0 + liveness 0 + loudness 0 + speechiness 0 + tempo 0 + time_signature 0 + dtype: int64 + ``` + +1. อธิบายข้อมูล: + + ```python + df.describe() + ``` + + | | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | + | ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- | + | count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | + | mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 | + | std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 | + | min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 | + | 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 | + | 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 | + | 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 | + | max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 | + +> 🤔 หากเรากำลังทำงานกับการจัดกลุ่ม ซึ่งเป็นวิธีการแบบไม่มีการกำกับดูแลที่ไม่ต้องใช้ข้อมูลที่มีการติดป้ายกำกับ ทำไมเราถึงแสดงข้อมูลนี้พร้อมป้ายกำกับ? ในขั้นตอนการสำรวจข้อมูล ป้ายกำกับมีประโยชน์ แต่ไม่ได้จำเป็นสำหรับการทำงานของอัลกอริทึมการจัดกลุ่ม คุณสามารถลบหัวคอลัมน์ออกและอ้างอิงข้อมูลโดยหมายเลขคอลัมน์แทนได้ + +ดูค่าทั่วไปของข้อมูล สังเกตว่าความนิยมสามารถมีค่าเป็น '0' ซึ่งแสดงเพลงที่ไม่มีการจัดอันดับ เราจะลบข้อมูลเหล่านั้นในไม่ช้า + +1. ใช้ barplot เพื่อค้นหาแนวเพลงที่ได้รับความนิยมมากที่สุด: + + ```python + import seaborn as sns + + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top[:5].index,y=top[:5].values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + ![most popular](../../../../5-Clustering/1-Visualize/images/popular.png) + +✅ หากคุณต้องการดูค่าที่สูงกว่า ให้เปลี่ยน `[:5]` เป็นค่าที่ใหญ่ขึ้น หรือเอาออกเพื่อดูทั้งหมด + +สังเกตว่าเมื่อแนวเพลงที่ได้รับความนิยมสูงสุดถูกอธิบายว่า 'Missing' หมายความว่า Spotify ไม่ได้จัดประเภทแนวเพลงนั้น ดังนั้นเรามาลบข้อมูลเหล่านั้นออก + +1. ลบข้อมูลที่หายไปโดยการกรองออก + + ```python + df = df[df['artist_top_genre'] != 'Missing'] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + + ตอนนี้ตรวจสอบแนวเพลงอีกครั้ง: + + ![most popular](../../../../5-Clustering/1-Visualize/images/all-genres.png) + +1. แนวเพลงสามอันดับแรกมีอิทธิพลต่อชุดข้อมูลนี้อย่างมาก เรามาเน้นที่ `afro dancehall`, `afropop`, และ `nigerian pop` และกรองชุดข้อมูลเพิ่มเติมเพื่อลบข้อมูลที่มีค่า popularity เป็น 0 (หมายความว่าไม่ได้ถูกจัดประเภทด้วยความนิยมในชุดข้อมูลและสามารถถือว่าเป็นเสียงรบกวนสำหรับวัตถุประสงค์ของเรา): + + ```python + df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] + df = df[(df['popularity'] > 0)] + top = df['artist_top_genre'].value_counts() + plt.figure(figsize=(10,7)) + sns.barplot(x=top.index,y=top.values) + plt.xticks(rotation=45) + plt.title('Top genres',color = 'blue') + ``` + +1. ทดสอบอย่างรวดเร็วเพื่อดูว่าข้อมูลมีความสัมพันธ์กันในลักษณะที่แข็งแกร่งหรือไม่: + + ```python + corrmat = df.corr(numeric_only=True) + f, ax = plt.subplots(figsize=(12, 9)) + sns.heatmap(corrmat, vmax=.8, square=True) + ``` + + ![correlations](../../../../5-Clustering/1-Visualize/images/correlation.png) + + ความสัมพันธ์ที่แข็งแกร่งเพียงอย่างเดียวคือระหว่าง `energy` และ `loudness` ซึ่งไม่น่าแปลกใจนัก เนื่องจากเพลงที่ดังมักจะมีพลังงานสูง อย่างไรก็ตาม ความสัมพันธ์อื่นๆ ค่อนข้างอ่อน จะน่าสนใจที่จะดูว่าอัลกอริทึมการจัดกลุ่มสามารถทำอะไรกับข้อมูลนี้ได้บ้าง + + > 🎓 โปรดทราบว่าความสัมพันธ์ไม่ได้หมายถึงสาเหตุ! เรามีหลักฐานของความสัมพันธ์ แต่ไม่มีหลักฐานของสาเหตุ เว็บไซต์ [ที่น่าสนใจ](https://tylervigen.com/spurious-correlations) มีภาพที่เน้นประเด็นนี้ + +มีการรวมตัวกันในชุดข้อมูลนี้เกี่ยวกับความนิยมและความสามารถในการเต้นของเพลงหรือไม่? FacetGrid แสดงให้เห็นว่ามีวงกลมที่รวมตัวกันโดยไม่คำนึงถึงแนวเพลง อาจเป็นไปได้ว่ารสนิยมของชาวไนจีเรียรวมตัวกันในระดับความสามารถในการเต้นที่แนวเพลงนี้หรือไม่? + +✅ ลองใช้จุดข้อมูลอื่นๆ (energy, loudness, speechiness) และแนวเพลงที่หลากหลายหรือเพิ่มเติม คุณสามารถค้นพบอะไรได้บ้าง? ดูตาราง `df.describe()` เพื่อดูการกระจายทั่วไปของจุดข้อมูล + +### แบบฝึกหัด - การกระจายข้อมูล + +แนวเพลงทั้งสามนี้แตกต่างกันอย่างมีนัยสำคัญในเรื่องการรับรู้ความสามารถในการเต้นของเพลงตามความนิยมของพวกเขาหรือไม่? + +1. ตรวจสอบการกระจายข้อมูลของแนวเพลงสามอันดับแรกในเรื่องความนิยมและความสามารถในการเต้นตามแกน x และ y ที่กำหนด + + ```python + sns.set_theme(style="ticks") + + g = sns.jointplot( + data=df, + x="popularity", y="danceability", hue="artist_top_genre", + kind="kde", + ) + ``` + + คุณสามารถค้นพบวงกลมที่รวมตัวกันรอบจุดรวมทั่วไป ซึ่งแสดงการกระจายของจุดข้อมูล + + > 🎓 โปรดทราบว่าตัวอย่างนี้ใช้กราฟ KDE (Kernel Density Estimate) ซึ่งแสดงข้อมูลโดยใช้เส้นโค้งความหนาแน่นความน่าจะเป็นแบบต่อเนื่อง สิ่งนี้ช่วยให้เราตีความข้อมูลเมื่อทำงานกับการกระจายหลายแบบ + + โดยทั่วไป แนวเพลงทั้งสามมีการจัดเรียงที่หลวมๆ ในเรื่องความนิยมและความสามารถในการเต้น การกำหนดกลุ่มในข้อมูลที่จัดเรียงหลวมๆ นี้จะเป็นความท้าทาย: + + ![distribution](../../../../5-Clustering/1-Visualize/images/distribution.png) + +1. สร้าง scatter plot: + + ```python + sns.FacetGrid(df, hue="artist_top_genre", height=5) \ + .map(plt.scatter, "popularity", "danceability") \ + .add_legend() + ``` + + scatterplot ของแกนเดียวกันแสดงรูปแบบการรวมตัวที่คล้ายกัน + + ![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png) + +โดยทั่วไป สำหรับการจัดกลุ่ม คุณสามารถใช้ scatterplot เพื่อแสดงกลุ่มของข้อมูล ดังนั้นการเชี่ยวชาญการแสดงภาพประเภทนี้จึงมีประโยชน์มาก ในบทเรียนถัดไป เราจะนำข้อมูลที่กรองแล้วนี้ไปใช้กับการจัดกลุ่มแบบ k-means เพื่อค้นหากลุ่มในข้อมูลนี้ที่ดูเหมือนจะทับซ้อนกันในลักษณะที่น่าสนใจ + +--- + +## 🚀ความท้าทาย + +เพื่อเตรียมพร้อมสำหรับบทเรียนถัดไป สร้างแผนภูมิเกี่ยวกับอัลกอริทึมการจัดกลุ่มต่างๆ ที่คุณอาจค้นพบและใช้ในสภาพแวดล้อมการผลิต อัลกอริทึมการจัดกลุ่มพยายามแก้ปัญหาแบบใด? + +## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +ก่อนที่คุณจะใช้อัลกอริทึมการจัดกลุ่ม ตามที่เราได้เรียนรู้ เป็นความคิดที่ดีที่จะเข้าใจลักษณะของชุดข้อมูลของคุณ อ่านเพิ่มเติมเกี่ยวกับหัวข้อนี้ [ที่นี่](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) + +[บทความที่มีประโยชน์นี้](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) จะพาคุณผ่านวิธีการต่างๆ ที่อัลกอริทึมการจัดกลุ่มต่างๆ ทำงาน โดยพิจารณาจากรูปร่างของข้อมูลที่แตกต่างกัน + +## งานที่ได้รับมอบหมาย + +[ค้นคว้าการแสดงภาพอื่นๆ สำหรับการจัดกลุ่ม](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/5-Clustering/1-Visualize/assignment.md b/translations/th/5-Clustering/1-Visualize/assignment.md new file mode 100644 index 000000000..856ea23a9 --- /dev/null +++ b/translations/th/5-Clustering/1-Visualize/assignment.md @@ -0,0 +1,25 @@ + +# วิจัยการแสดงผลอื่น ๆ สำหรับการจัดกลุ่ม + +## คำแนะนำ + +ในบทเรียนนี้ คุณได้เรียนรู้เทคนิคการแสดงผลบางอย่างเพื่อทำความเข้าใจการวางแผนข้อมูลของคุณเพื่อเตรียมการจัดกลุ่ม โดยเฉพาะอย่างยิ่ง scatterplots มีประโยชน์ในการค้นหากลุ่มของวัตถุ ค้นคว้าวิธีการและไลบรารีต่าง ๆ ในการสร้าง scatterplots และบันทึกงานของคุณในสมุดบันทึก คุณสามารถใช้ข้อมูลจากบทเรียนนี้ บทเรียนอื่น ๆ หรือข้อมูลที่คุณหาเอง (โปรดให้เครดิตแหล่งที่มาของข้อมูลในสมุดบันทึกของคุณด้วย) วางแผนข้อมูลบางส่วนโดยใช้ scatterplots และอธิบายสิ่งที่คุณค้นพบ + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| ------ | -------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------- | +| | มีการนำเสนอสมุดบันทึกที่มี scatterplots ห้ารูปแบบพร้อมคำอธิบายที่ดี | มีการนำเสนอสมุดบันทึกที่มี scatterplots น้อยกว่าห้ารูปแบบและมีคำอธิบายน้อยกว่า | มีการนำเสนอสมุดบันทึกที่ไม่สมบูรณ์ | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/5-Clustering/1-Visualize/solution/Julia/README.md b/translations/th/5-Clustering/1-Visualize/solution/Julia/README.md new file mode 100644 index 000000000..bcc8cec96 --- /dev/null +++ b/translations/th/5-Clustering/1-Visualize/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/5-Clustering/2-K-Means/README.md b/translations/th/5-Clustering/2-K-Means/README.md new file mode 100644 index 000000000..092aeb80d --- /dev/null +++ b/translations/th/5-Clustering/2-K-Means/README.md @@ -0,0 +1,261 @@ + +# การจัดกลุ่มด้วย K-Means + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +ในบทเรียนนี้ คุณจะได้เรียนรู้วิธีการสร้างกลุ่มโดยใช้ Scikit-learn และชุดข้อมูลเพลงไนจีเรียที่คุณนำเข้าไว้ก่อนหน้านี้ เราจะครอบคลุมพื้นฐานของ K-Means สำหรับการจัดกลุ่ม โปรดจำไว้ว่า ตามที่คุณได้เรียนรู้ในบทเรียนก่อนหน้า มีหลายวิธีในการทำงานกับการจัดกลุ่ม และวิธีที่คุณใช้ขึ้นอยู่กับข้อมูลของคุณ เราจะลองใช้ K-Means เนื่องจากเป็นเทคนิคการจัดกลุ่มที่พบได้บ่อยที่สุด มาเริ่มกันเลย! + +คำศัพท์ที่คุณจะได้เรียนรู้: + +- คะแนน Silhouette +- วิธี Elbow +- Inertia +- Variance + +## บทนำ + +[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering) เป็นวิธีที่มาจากสาขาการประมวลผลสัญญาณ ใช้ในการแบ่งและจัดกลุ่มข้อมูลออกเป็น 'k' กลุ่มโดยใช้ชุดของการสังเกตการณ์ การสังเกตการณ์แต่ละครั้งจะทำงานเพื่อจัดกลุ่มจุดข้อมูลที่ใกล้ที่สุดกับ 'ค่าเฉลี่ย' หรือจุดศูนย์กลางของกลุ่มนั้น + +กลุ่มเหล่านี้สามารถแสดงผลเป็น [แผนภาพ Voronoi](https://wikipedia.org/wiki/Voronoi_diagram) ซึ่งรวมถึงจุด (หรือ 'seed') และพื้นที่ที่เกี่ยวข้อง + +![voronoi diagram](../../../../5-Clustering/2-K-Means/images/voronoi.png) + +> อินโฟกราฟิกโดย [Jen Looper](https://twitter.com/jenlooper) + +กระบวนการจัดกลุ่มด้วย K-Means [ดำเนินการในสามขั้นตอน](https://scikit-learn.org/stable/modules/clustering.html#k-means): + +1. อัลกอริทึมเลือกจุดศูนย์กลางจำนวน k โดยสุ่มจากชุดข้อมูล หลังจากนั้นจะวนซ้ำ: + 1. กำหนดตัวอย่างแต่ละตัวให้กับจุดศูนย์กลางที่ใกล้ที่สุด + 2. สร้างจุดศูนย์กลางใหม่โดยการคำนวณค่าเฉลี่ยของตัวอย่างทั้งหมดที่ถูกกำหนดให้กับจุดศูนย์กลางก่อนหน้า + 3. จากนั้นคำนวณความแตกต่างระหว่างจุดศูนย์กลางใหม่และเก่า และทำซ้ำจนกว่าจุดศูนย์กลางจะคงที่ + +ข้อเสียของการใช้ K-Means คือคุณต้องกำหนด 'k' ซึ่งเป็นจำนวนจุดศูนย์กลาง โชคดีที่ 'วิธี Elbow' ช่วยประมาณค่าที่ดีสำหรับ 'k' คุณจะได้ลองในอีกสักครู่ + +## สิ่งที่ต้องเตรียม + +คุณจะทำงานในไฟล์ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) ของบทเรียนนี้ ซึ่งรวมถึงการนำเข้าข้อมูลและการทำความสะอาดเบื้องต้นที่คุณทำในบทเรียนก่อนหน้า + +## แบบฝึกหัด - การเตรียมตัว + +เริ่มต้นด้วยการดูข้อมูลเพลงอีกครั้ง + +1. สร้าง boxplot โดยเรียกใช้ `boxplot()` สำหรับแต่ละคอลัมน์: + + ```python + plt.figure(figsize=(20,20), dpi=200) + + plt.subplot(4,3,1) + sns.boxplot(x = 'popularity', data = df) + + plt.subplot(4,3,2) + sns.boxplot(x = 'acousticness', data = df) + + plt.subplot(4,3,3) + sns.boxplot(x = 'energy', data = df) + + plt.subplot(4,3,4) + sns.boxplot(x = 'instrumentalness', data = df) + + plt.subplot(4,3,5) + sns.boxplot(x = 'liveness', data = df) + + plt.subplot(4,3,6) + sns.boxplot(x = 'loudness', data = df) + + plt.subplot(4,3,7) + sns.boxplot(x = 'speechiness', data = df) + + plt.subplot(4,3,8) + sns.boxplot(x = 'tempo', data = df) + + plt.subplot(4,3,9) + sns.boxplot(x = 'time_signature', data = df) + + plt.subplot(4,3,10) + sns.boxplot(x = 'danceability', data = df) + + plt.subplot(4,3,11) + sns.boxplot(x = 'length', data = df) + + plt.subplot(4,3,12) + sns.boxplot(x = 'release_date', data = df) + ``` + + ข้อมูลนี้ค่อนข้างมีเสียงรบกวน: โดยการสังเกตแต่ละคอลัมน์ในรูปแบบ boxplot คุณจะเห็นค่าผิดปกติ + + ![outliers](../../../../5-Clustering/2-K-Means/images/boxplots.png) + +คุณสามารถตรวจสอบชุดข้อมูลและลบค่าผิดปกติเหล่านี้ออกได้ แต่จะทำให้ข้อมูลลดลงไปมาก + +1. สำหรับตอนนี้ เลือกคอลัมน์ที่คุณจะใช้สำหรับการจัดกลุ่ม เลือกคอลัมน์ที่มีช่วงค่าคล้ายกันและเข้ารหัสคอลัมน์ `artist_top_genre` เป็นข้อมูลตัวเลข: + + ```python + from sklearn.preprocessing import LabelEncoder + le = LabelEncoder() + + X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')] + + y = df['artist_top_genre'] + + X['artist_top_genre'] = le.fit_transform(X['artist_top_genre']) + + y = le.transform(y) + ``` + +1. ตอนนี้คุณต้องเลือกจำนวนกลุ่มที่จะกำหนดเป้าหมาย คุณทราบว่ามี 3 ประเภทเพลงที่เราสกัดออกมาจากชุดข้อมูล ดังนั้นลองใช้ 3: + + ```python + from sklearn.cluster import KMeans + + nclusters = 3 + seed = 0 + + km = KMeans(n_clusters=nclusters, random_state=seed) + km.fit(X) + + # Predict the cluster for each data point + + y_cluster_kmeans = km.predict(X) + y_cluster_kmeans + ``` + +คุณจะเห็นอาร์เรย์ที่พิมพ์ออกมาพร้อมกลุ่มที่คาดการณ์ไว้ (0, 1 หรือ 2) สำหรับแต่ละแถวของ dataframe + +1. ใช้อาร์เรย์นี้เพื่อคำนวณ 'คะแนน Silhouette': + + ```python + from sklearn import metrics + score = metrics.silhouette_score(X, y_cluster_kmeans) + score + ``` + +## คะแนน Silhouette + +มองหาคะแนน Silhouette ที่ใกล้เคียงกับ 1 คะแนนนี้มีค่าตั้งแต่ -1 ถึง 1 และหากคะแนนเป็น 1 กลุ่มจะมีความหนาแน่นและแยกออกจากกลุ่มอื่นได้ดี ค่าใกล้ 0 แสดงถึงกลุ่มที่ทับซ้อนกันโดยมีตัวอย่างที่อยู่ใกล้กับขอบเขตการตัดสินใจของกลุ่มที่อยู่ใกล้เคียง [(แหล่งข้อมูล)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam) + +คะแนนของเราคือ **.53** ซึ่งอยู่ตรงกลาง แสดงว่าข้อมูลของเราไม่เหมาะสมกับการจัดกลุ่มประเภทนี้มากนัก แต่ลองดำเนินการต่อไป + +### แบบฝึกหัด - สร้างโมเดล + +1. นำเข้า `KMeans` และเริ่มกระบวนการจัดกลุ่ม + + ```python + from sklearn.cluster import KMeans + wcss = [] + + for i in range(1, 11): + kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42) + kmeans.fit(X) + wcss.append(kmeans.inertia_) + + ``` + + มีบางส่วนที่ควรอธิบายเพิ่มเติม + + > 🎓 range: นี่คือจำนวนครั้งของกระบวนการจัดกลุ่ม + + > 🎓 random_state: "กำหนดการสร้างตัวเลขสุ่มสำหรับการเริ่มต้นจุดศูนย์กลาง" [แหล่งข้อมูล](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans) + + > 🎓 WCSS: "ผลรวมของกำลังสองภายในกลุ่ม" วัดระยะทางเฉลี่ยกำลังสองของจุดทั้งหมดภายในกลุ่มไปยังจุดศูนย์กลางของกลุ่ม [แหล่งข้อมูล](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce) + + > 🎓 Inertia: อัลกอริทึม K-Means พยายามเลือกจุดศูนย์กลางเพื่อลด 'Inertia' ซึ่งเป็น "การวัดความสอดคล้องภายในของกลุ่ม" [แหล่งข้อมูล](https://scikit-learn.org/stable/modules/clustering.html) ค่านี้จะถูกเพิ่มเข้าไปในตัวแปร wcss ในแต่ละครั้ง + + > 🎓 k-means++: ใน [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) คุณสามารถใช้การปรับแต่ง 'k-means++' ซึ่ง "เริ่มต้นจุดศูนย์กลางให้ห่างกัน (โดยทั่วไป) ซึ่งนำไปสู่ผลลัพธ์ที่ดีกว่าการเริ่มต้นแบบสุ่ม" + +### วิธี Elbow + +ก่อนหน้านี้ คุณคาดการณ์ว่า เนื่องจากคุณกำหนดเป้าหมาย 3 ประเภทเพลง คุณควรเลือก 3 กลุ่ม แต่เป็นเช่นนั้นจริงหรือ? + +1. ใช้วิธี 'Elbow' เพื่อให้แน่ใจ + + ```python + plt.figure(figsize=(10,5)) + sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red') + plt.title('Elbow') + plt.xlabel('Number of clusters') + plt.ylabel('WCSS') + plt.show() + ``` + + ใช้ตัวแปร `wcss` ที่คุณสร้างในขั้นตอนก่อนหน้าเพื่อสร้างแผนภูมิที่แสดงจุด 'โค้ง' ในกราฟ Elbow ซึ่งบ่งชี้จำนวนกลุ่มที่เหมาะสมที่สุด อาจจะเป็น **3** จริงๆ! + + ![elbow method](../../../../5-Clustering/2-K-Means/images/elbow.png) + +## แบบฝึกหัด - แสดงกลุ่ม + +1. ลองกระบวนการอีกครั้ง คราวนี้ตั้งค่ากลุ่มเป็นสามกลุ่ม และแสดงกลุ่มในรูปแบบ scatterplot: + + ```python + from sklearn.cluster import KMeans + kmeans = KMeans(n_clusters = 3) + kmeans.fit(X) + labels = kmeans.predict(X) + plt.scatter(df['popularity'],df['danceability'],c = labels) + plt.xlabel('popularity') + plt.ylabel('danceability') + plt.show() + ``` + +1. ตรวจสอบความแม่นยำของโมเดล: + + ```python + labels = kmeans.labels_ + + correct_labels = sum(y == labels) + + print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size)) + + print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size))) + ``` + + ความแม่นยำของโมเดลนี้ไม่ค่อยดีนัก และรูปร่างของกลุ่มให้คำใบ้ว่าเหตุใด + + ![clusters](../../../../5-Clustering/2-K-Means/images/clusters.png) + + ข้อมูลนี้ไม่สมดุลกันมากเกินไป มีความสัมพันธ์น้อยเกินไป และมีความแปรปรวนระหว่างค่าคอลัมน์มากเกินไปที่จะจัดกลุ่มได้ดี ในความเป็นจริง กลุ่มที่เกิดขึ้นอาจได้รับอิทธิพลหรือเบี่ยงเบนอย่างมากจากสามประเภทเพลงที่เรากำหนดไว้ข้างต้น นี่เป็นกระบวนการเรียนรู้! + + ในเอกสารของ Scikit-learn คุณสามารถเห็นว่าโมเดลแบบนี้ ที่กลุ่มไม่ได้ถูกแบ่งแยกอย่างชัดเจน มีปัญหา 'Variance': + + ![problem models](../../../../5-Clustering/2-K-Means/images/problems.png) + > อินโฟกราฟิกจาก Scikit-learn + +## Variance + +Variance ถูกนิยามว่าเป็น "ค่าเฉลี่ยของผลต่างกำลังสองจากค่าเฉลี่ย" [(แหล่งข้อมูล)](https://www.mathsisfun.com/data/standard-deviation.html) ในบริบทของปัญหาการจัดกลุ่มนี้ หมายถึงข้อมูลที่ตัวเลขในชุดข้อมูลมีแนวโน้มที่จะเบี่ยงเบนจากค่าเฉลี่ยมากเกินไป + +✅ นี่เป็นช่วงเวลาที่ดีในการคิดถึงวิธีต่างๆ ที่คุณสามารถแก้ไขปัญหานี้ได้ ปรับข้อมูลเพิ่มเติม? ใช้คอลัมน์อื่น? ใช้อัลกอริทึมอื่น? คำใบ้: ลอง [ปรับขนาดข้อมูลของคุณ](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) เพื่อทำให้ข้อมูลเป็นปกติและทดสอบคอลัมน์อื่นๆ + +> ลองใช้ '[เครื่องคำนวณ Variance](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' เพื่อทำความเข้าใจแนวคิดนี้เพิ่มเติม + +--- + +## 🚀ความท้าทาย + +ใช้เวลาสักครู่กับ notebook นี้ ปรับพารามิเตอร์ คุณสามารถปรับปรุงความแม่นยำของโมเดลได้โดยการทำความสะอาดข้อมูลเพิ่มเติม (เช่น ลบค่าผิดปกติ)? คุณสามารถใช้น้ำหนักเพื่อให้น้ำหนักมากขึ้นกับตัวอย่างข้อมูลบางตัว คุณสามารถทำอะไรอีกเพื่อสร้างกลุ่มที่ดีกว่า? + +คำใบ้: ลองปรับขนาดข้อมูลของคุณ มีโค้ดที่ถูกคอมเมนต์ไว้ใน notebook ที่เพิ่มการปรับขนาดมาตรฐานเพื่อทำให้คอลัมน์ข้อมูลมีลักษณะคล้ายกันมากขึ้นในแง่ของช่วงค่า คุณจะพบว่าในขณะที่คะแนน Silhouette ลดลง กราฟ Elbow จะราบเรียบขึ้น นี่เป็นเพราะการปล่อยข้อมูลที่ไม่ได้ปรับขนาดทำให้ข้อมูลที่มีความแปรปรวนน้อยมีน้ำหนักมากขึ้น อ่านเพิ่มเติมเกี่ยวกับปัญหานี้ [ที่นี่](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226) + +## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +ลองดูตัวจำลอง K-Means [เช่นนี้](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/) คุณสามารถใช้เครื่องมือนี้เพื่อแสดงจุดข้อมูลตัวอย่างและกำหนดจุดศูนย์กลาง คุณสามารถแก้ไขความสุ่มของข้อมูล จำนวนกลุ่ม และจำนวนจุดศูนย์กลาง สิ่งนี้ช่วยให้คุณเข้าใจวิธีการจัดกลุ่มข้อมูลได้หรือไม่? + +นอกจากนี้ ลองดู [เอกสารประกอบเกี่ยวกับ K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) จาก Stanford + +## งานที่ได้รับมอบหมาย + +[ลองใช้วิธีการจัดกลุ่มแบบต่างๆ](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/5-Clustering/2-K-Means/assignment.md b/translations/th/5-Clustering/2-K-Means/assignment.md new file mode 100644 index 000000000..a02941bcc --- /dev/null +++ b/translations/th/5-Clustering/2-K-Means/assignment.md @@ -0,0 +1,25 @@ + +# ลองใช้วิธีการจัดกลุ่มแบบต่างๆ + +## คำแนะนำ + +ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับการจัดกลุ่มแบบ K-Means บางครั้ง K-Means อาจไม่เหมาะสมกับข้อมูลของคุณ สร้างโน้ตบุ๊กโดยใช้ข้อมูลจากบทเรียนนี้หรือจากแหล่งอื่น (ให้เครดิตแหล่งข้อมูลของคุณ) และแสดงวิธีการจัดกลุ่มแบบอื่นที่ไม่ใช่ K-Means คุณได้เรียนรู้อะไรบ้าง? + +## เกณฑ์การประเมิน + +| เกณฑ์ | ดีเยี่ยม | พอใช้ | ต้องปรับปรุง | +| ------------- | --------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------- | +| | มีการนำเสนอโน้ตบุ๊กพร้อมโมเดลการจัดกลุ่มที่มีการอธิบายอย่างดี | มีการนำเสนอโน้ตบุ๊กแต่ขาดการอธิบายที่ดีและ/หรือไม่สมบูรณ์ | ส่งงานที่ไม่สมบูรณ์ | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/5-Clustering/2-K-Means/solution/Julia/README.md b/translations/th/5-Clustering/2-K-Means/solution/Julia/README.md new file mode 100644 index 000000000..148cf44af --- /dev/null +++ b/translations/th/5-Clustering/2-K-Means/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/5-Clustering/README.md b/translations/th/5-Clustering/README.md new file mode 100644 index 000000000..b00faa365 --- /dev/null +++ b/translations/th/5-Clustering/README.md @@ -0,0 +1,42 @@ + +# โมเดลการจัดกลุ่มสำหรับการเรียนรู้ของเครื่อง + +การจัดกลุ่มเป็นงานในด้านการเรียนรู้ของเครื่องที่มุ่งค้นหาวัตถุที่มีความคล้ายคลึงกันและจัดกลุ่มเหล่านี้ให้อยู่ในกลุ่มที่เรียกว่า "คลัสเตอร์" สิ่งที่แตกต่างระหว่างการจัดกลุ่มกับวิธีการอื่นในด้านการเรียนรู้ของเครื่องคือกระบวนการเกิดขึ้นโดยอัตโนมัติ ในความเป็นจริง อาจกล่าวได้ว่ามันตรงกันข้ามกับการเรียนรู้แบบมีผู้สอน + +## หัวข้อเฉพาะภูมิภาค: โมเดลการจัดกลุ่มสำหรับรสนิยมทางดนตรีของผู้ฟังชาวไนจีเรีย 🎧 + +ผู้ฟังชาวไนจีเรียมีรสนิยมทางดนตรีที่หลากหลาย การใช้ข้อมูลที่ดึงมาจาก Spotify (ได้รับแรงบันดาลใจจาก [บทความนี้](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)) เรามาดูเพลงที่ได้รับความนิยมในไนจีเรียกัน ชุดข้อมูลนี้ประกอบด้วยข้อมูลเกี่ยวกับคะแนน 'danceability', 'acousticness', ความดัง, 'speechiness', ความนิยม และพลังงานของเพลงต่าง ๆ จะน่าสนใจมากหากเราสามารถค้นพบรูปแบบในข้อมูลนี้! + +![เครื่องเล่นแผ่นเสียง](../../../5-Clustering/images/turntable.jpg) + +> ภาพถ่ายโดย Marcela Laskoski บน Unsplash + +ในบทเรียนชุดนี้ คุณจะได้ค้นพบวิธีใหม่ ๆ ในการวิเคราะห์ข้อมูลโดยใช้เทคนิคการจัดกลุ่ม การจัดกลุ่มมีประโยชน์อย่างยิ่งเมื่อชุดข้อมูลของคุณไม่มีป้ายกำกับ หากมีป้ายกำกับ การใช้เทคนิคการจำแนกประเภท เช่นที่คุณได้เรียนรู้ในบทเรียนก่อนหน้า อาจมีประโยชน์มากกว่า แต่ในกรณีที่คุณต้องการจัดกลุ่มข้อมูลที่ไม่มีป้ายกำกับ การจัดกลุ่มเป็นวิธีที่ยอดเยี่ยมในการค้นหารูปแบบ + +> มีเครื่องมือแบบ low-code ที่มีประโยชน์ซึ่งสามารถช่วยคุณเรียนรู้เกี่ยวกับการทำงานกับโมเดลการจัดกลุ่ม ลองใช้ [Azure ML สำหรับงานนี้](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) + +## บทเรียน + +1. [แนะนำการจัดกลุ่ม](1-Visualize/README.md) +2. [การจัดกลุ่มแบบ K-Means](2-K-Means/README.md) + +## เครดิต + +บทเรียนเหล่านี้เขียนขึ้นด้วย 🎶 โดย [Jen Looper](https://www.twitter.com/jenlooper) พร้อมการตรวจสอบที่เป็นประโยชน์จาก [Rishit Dagli](https://rishit_dagli) และ [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) + +ชุดข้อมูล [Nigerian Songs](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) ได้มาจาก Kaggle โดยดึงข้อมูลจาก Spotify + +ตัวอย่าง K-Means ที่มีประโยชน์ซึ่งช่วยในการสร้างบทเรียนนี้ ได้แก่ [การสำรวจดอกไอริส](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), [สมุดบันทึกเบื้องต้น](https://www.kaggle.com/prashant111/k-means-clustering-with-python), และ [ตัวอย่าง NGO สมมติ](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/1-Introduction-to-NLP/README.md b/translations/th/6-NLP/1-Introduction-to-NLP/README.md new file mode 100644 index 000000000..56b84896d --- /dev/null +++ b/translations/th/6-NLP/1-Introduction-to-NLP/README.md @@ -0,0 +1,179 @@ + +# บทนำสู่การประมวลผลภาษาธรรมชาติ + +บทเรียนนี้ครอบคลุมประวัติย่อและแนวคิดสำคัญของ *การประมวลผลภาษาธรรมชาติ* ซึ่งเป็นสาขาย่อยของ *ภาษาศาสตร์เชิงคำนวณ* + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## บทนำ + +NLP หรือที่รู้จักกันทั่วไป เป็นหนึ่งในพื้นที่ที่มีชื่อเสียงที่สุดที่การเรียนรู้ของเครื่องถูกนำมาใช้และใช้งานในซอฟต์แวร์การผลิต + +✅ คุณสามารถนึกถึงซอฟต์แวร์ที่คุณใช้ทุกวันซึ่งอาจมี NLP ฝังอยู่ได้หรือไม่? เช่น โปรแกรมประมวลผลคำหรือแอปพลิเคชันมือถือที่คุณใช้เป็นประจำ? + +คุณจะได้เรียนรู้เกี่ยวกับ: + +- **แนวคิดของภาษา** วิธีที่ภาษาพัฒนาและพื้นที่การศึกษาหลัก ๆ +- **คำจำกัดความและแนวคิด** คุณจะได้เรียนรู้คำจำกัดความและแนวคิดเกี่ยวกับวิธีที่คอมพิวเตอร์ประมวลผลข้อความ รวมถึงการวิเคราะห์ไวยากรณ์และการระบุคำนามและคำกริยา บทเรียนนี้มีงานเขียนโค้ดบางส่วน และมีการแนะนำแนวคิดสำคัญหลายประการที่คุณจะได้เรียนรู้การเขียนโค้ดในบทเรียนถัดไป + +## ภาษาศาสตร์เชิงคำนวณ + +ภาษาศาสตร์เชิงคำนวณเป็นพื้นที่การวิจัยและพัฒนาที่มีมานานหลายทศวรรษ ซึ่งศึกษาว่าคอมพิวเตอร์สามารถทำงานกับภาษา และแม้กระทั่งเข้าใจ แปล และสื่อสารกับภาษาได้อย่างไร การประมวลผลภาษาธรรมชาติ (NLP) เป็นสาขาที่เกี่ยวข้องซึ่งมุ่งเน้นไปที่วิธีที่คอมพิวเตอร์สามารถประมวลผลภาษา 'ธรรมชาติ' หรือภาษามนุษย์ + +### ตัวอย่าง - การพิมพ์ด้วยเสียงในโทรศัพท์ + +หากคุณเคยพูดแทนการพิมพ์ในโทรศัพท์ หรือถามคำถามกับผู้ช่วยเสมือน คำพูดของคุณจะถูกแปลงเป็นข้อความและประมวลผลหรือ *วิเคราะห์* จากภาษาที่คุณพูด คำสำคัญที่ตรวจพบจะถูกประมวลผลในรูปแบบที่โทรศัพท์หรือผู้ช่วยสามารถเข้าใจและดำเนินการได้ + +![comprehension](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png) +> การทำความเข้าใจภาษาจริงเป็นเรื่องยาก! ภาพโดย [Jen Looper](https://twitter.com/jenlooper) + +### เทคโนโลยีนี้เกิดขึ้นได้อย่างไร? + +สิ่งนี้เกิดขึ้นได้เพราะมีคนเขียนโปรแกรมคอมพิวเตอร์เพื่อทำสิ่งนี้ หลายสิบปีก่อน นักเขียนนิยายวิทยาศาสตร์บางคนคาดการณ์ว่าผู้คนจะพูดกับคอมพิวเตอร์เป็นหลัก และคอมพิวเตอร์จะเข้าใจสิ่งที่พวกเขาหมายถึงอย่างสมบูรณ์แบบ อย่างไรก็ตาม ปัญหานี้กลับยากกว่าที่หลายคนจินตนาการไว้ และแม้ว่าปัจจุบันจะเข้าใจปัญหาได้ดีขึ้นมาก แต่ก็ยังมีความท้าทายสำคัญในการบรรลุการประมวลผลภาษาธรรมชาติที่ 'สมบูรณ์แบบ' โดยเฉพาะอย่างยิ่งเมื่อพูดถึงการเข้าใจความหมายของประโยค เช่น อารมณ์ขันหรือการตรวจจับอารมณ์ เช่น การประชดประชันในประโยค + +ในตอนนี้ คุณอาจจะนึกถึงชั้นเรียนในโรงเรียนที่ครูสอนเกี่ยวกับส่วนต่าง ๆ ของไวยากรณ์ในประโยค ในบางประเทศ นักเรียนจะได้รับการสอนไวยากรณ์และภาษาศาสตร์เป็นวิชาเฉพาะ แต่ในหลายประเทศ หัวข้อเหล่านี้จะรวมอยู่ในส่วนของการเรียนรู้ภาษา: ไม่ว่าจะเป็นภาษาแรกของคุณในโรงเรียนประถม (การเรียนรู้การอ่านและเขียน) และอาจเป็นภาษาที่สองในระดับมัธยมศึกษา หรือมัธยมปลาย ไม่ต้องกังวลหากคุณไม่เชี่ยวชาญในการแยกแยะคำนามจากคำกริยาหรือคำวิเศษณ์จากคำคุณศัพท์! + +หากคุณมีปัญหาในการแยกแยะระหว่าง *ปัจจุบันธรรมดา* และ *ปัจจุบันต่อเนื่อง* คุณไม่ได้อยู่คนเดียว นี่เป็นสิ่งที่ท้าทายสำหรับหลายคน แม้แต่ผู้พูดภาษาแม่ ข่าวดีก็คือคอมพิวเตอร์เก่งมากในการใช้กฎอย่างเป็นทางการ และคุณจะได้เรียนรู้การเขียนโค้ดที่สามารถ *วิเคราะห์* ประโยคได้ดีเท่ากับมนุษย์ ความท้าทายที่ยิ่งใหญ่กว่าที่คุณจะตรวจสอบในภายหลังคือการเข้าใจ *ความหมาย* และ *อารมณ์* ของประโยค + +## ความต้องการเบื้องต้น + +สำหรับบทเรียนนี้ ความต้องการเบื้องต้นหลักคือการสามารถอ่านและเข้าใจภาษาของบทเรียนนี้ ไม่มีปัญหาคณิตศาสตร์หรือสมการให้แก้ไข แม้ว่าผู้เขียนต้นฉบับจะเขียนบทเรียนนี้เป็นภาษาอังกฤษ แต่ก็มีการแปลเป็นภาษาอื่น ๆ ดังนั้นคุณอาจกำลังอ่านฉบับแปลอยู่ มีตัวอย่างที่ใช้ภาษาต่าง ๆ หลายภาษา (เพื่อเปรียบเทียบกฎไวยากรณ์ของภาษาต่าง ๆ) ซึ่ง *ไม่ได้* แปล แต่ข้อความอธิบายจะถูกแปล ดังนั้นความหมายควรชัดเจน + +สำหรับงานเขียนโค้ด คุณจะใช้ Python และตัวอย่างจะใช้ Python 3.8 + +ในส่วนนี้ คุณจะต้องใช้: + +- **ความเข้าใจ Python 3** ความเข้าใจภาษาโปรแกรมใน Python 3 บทเรียนนี้ใช้การป้อนข้อมูล วนลูป การอ่านไฟล์ และอาร์เรย์ +- **Visual Studio Code + ส่วนขยาย** เราจะใช้ Visual Studio Code และส่วนขยาย Python คุณสามารถใช้ IDE Python ที่คุณเลือกได้เช่นกัน +- **TextBlob** [TextBlob](https://github.com/sloria/TextBlob) เป็นไลบรารีการประมวลผลข้อความที่ง่ายสำหรับ Python ทำตามคำแนะนำในเว็บไซต์ TextBlob เพื่อติดตั้งบนระบบของคุณ (ติดตั้ง corpora ด้วย ตามที่แสดงด้านล่าง): + + ```bash + pip install -U textblob + python -m textblob.download_corpora + ``` + +> 💡 เคล็ดลับ: คุณสามารถรัน Python ได้โดยตรงในสภาพแวดล้อม VS Code ดู [เอกสาร](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) สำหรับข้อมูลเพิ่มเติม + +## การพูดคุยกับเครื่องจักร + +ประวัติศาสตร์ของการพยายามทำให้คอมพิวเตอร์เข้าใจภาษามนุษย์มีมานานหลายทศวรรษ และหนึ่งในนักวิทยาศาสตร์ยุคแรกที่พิจารณาการประมวลผลภาษาธรรมชาติคือ *Alan Turing* + +### การทดสอบของ Turing + +เมื่อ Turing กำลังวิจัย *ปัญญาประดิษฐ์* ในปี 1950 เขาได้พิจารณาว่าการทดสอบการสนทนาอาจถูกมอบให้กับมนุษย์และคอมพิวเตอร์ (ผ่านการสนทนาแบบพิมพ์) โดยที่มนุษย์ในบทสนทนาไม่แน่ใจว่ากำลังสนทนากับมนุษย์อีกคนหรือคอมพิวเตอร์ + +หากหลังจากการสนทนาในระยะเวลาหนึ่ง มนุษย์ไม่สามารถระบุได้ว่าคำตอบมาจากคอมพิวเตอร์หรือไม่ คอมพิวเตอร์นั้นจะถือว่า *คิด* ได้หรือไม่? + +### แรงบันดาลใจ - 'เกมเลียนแบบ' + +แนวคิดนี้มาจากเกมปาร์ตี้ที่เรียกว่า *เกมเลียนแบบ* ซึ่งผู้สอบสวนอยู่คนเดียวในห้องและมีหน้าที่กำหนดว่าคนสองคน (ในอีกห้องหนึ่ง) เป็นชายและหญิงตามลำดับ ผู้สอบสวนสามารถส่งโน้ตและต้องพยายามคิดคำถามที่คำตอบที่เขียนเผยให้เห็นเพศของบุคคลลึกลับ แน่นอนว่าผู้เล่นในอีกห้องหนึ่งพยายามหลอกผู้สอบสวนโดยตอบคำถามในลักษณะที่ทำให้เข้าใจผิดหรือสับสน ในขณะเดียวกันก็ให้ความรู้สึกเหมือนตอบอย่างตรงไปตรงมา + +### การพัฒนา Eliza + +ในปี 1960 นักวิทยาศาสตร์ MIT ชื่อ *Joseph Weizenbaum* ได้พัฒนา [*Eliza*](https://wikipedia.org/wiki/ELIZA) ซึ่งเป็น 'นักบำบัด' คอมพิวเตอร์ที่ถามคำถามมนุษย์และให้ความรู้สึกว่าเข้าใจคำตอบ อย่างไรก็ตาม แม้ว่า Eliza จะสามารถวิเคราะห์ประโยคและระบุโครงสร้างไวยากรณ์และคำสำคัญบางคำเพื่อให้คำตอบที่สมเหตุสมผล แต่ก็ไม่สามารถกล่าวได้ว่า *เข้าใจ* ประโยค หาก Eliza ถูกนำเสนอด้วยประโยคในรูปแบบ "**ฉันรู้สึก** เศร้า" มันอาจจัดเรียงและแทนที่คำในประโยคเพื่อสร้างคำตอบ "คุณรู้สึก เศร้า มานานแค่ไหน" + +สิ่งนี้ทำให้ดูเหมือนว่า Eliza เข้าใจคำกล่าวและกำลังถามคำถามต่อเนื่อง ในขณะที่ในความเป็นจริง มันกำลังเปลี่ยนกาลเวลาและเพิ่มคำบางคำ หาก Eliza ไม่สามารถระบุคำสำคัญที่มีคำตอบได้ มันจะให้คำตอบแบบสุ่มที่สามารถใช้ได้กับคำกล่าวต่าง ๆ มากมาย Eliza สามารถถูกหลอกได้ง่าย เช่น หากผู้ใช้เขียน "**คุณเป็น** จักรยาน" มันอาจตอบว่า "ฉันเป็น จักรยาน มานานแค่ไหน?" แทนที่จะตอบอย่างมีเหตุผลมากกว่า + +[![Chatting with Eliza](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Chatting with Eliza") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอเกี่ยวกับโปรแกรม ELIZA ดั้งเดิม + +> หมายเหตุ: คุณสามารถอ่านคำอธิบายต้นฉบับของ [Eliza](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) ที่เผยแพร่ในปี 1966 หากคุณมีบัญชี ACM หรืออ่านเกี่ยวกับ Eliza บน [wikipedia](https://wikipedia.org/wiki/ELIZA) + +## แบบฝึกหัด - การเขียนโค้ดบอทสนทนาเบื้องต้น + +บอทสนทนา เช่น Eliza เป็นโปรแกรมที่ดึงข้อมูลจากผู้ใช้และดูเหมือนจะเข้าใจและตอบสนองอย่างชาญฉลาด ต่างจาก Eliza บอทของเราจะไม่มีกฎหลายข้อที่ทำให้ดูเหมือนมีการสนทนาอย่างชาญฉลาด แต่บอทของเราจะมีความสามารถเพียงอย่างเดียว คือการทำให้การสนทนาดำเนินต่อไปด้วยคำตอบแบบสุ่มที่อาจใช้ได้ในเกือบทุกการสนทนาเล็กน้อย + +### แผนการ + +ขั้นตอนของคุณเมื่อสร้างบอทสนทนา: + +1. พิมพ์คำแนะนำเพื่อแนะนำผู้ใช้วิธีการโต้ตอบกับบอท +2. เริ่มลูป + 1. รับข้อมูลจากผู้ใช้ + 2. หากผู้ใช้ขอออก ให้หยุด + 3. ประมวลผลข้อมูลจากผู้ใช้และกำหนดคำตอบ (ในกรณีนี้ คำตอบเป็นการเลือกแบบสุ่มจากรายการคำตอบทั่วไปที่เป็นไปได้) + 4. พิมพ์คำตอบ +3. กลับไปที่ขั้นตอนที่ 2 + +### การสร้างบอท + +มาสร้างบอทกันต่อไป เราจะเริ่มต้นด้วยการกำหนดวลีบางส่วน + +1. สร้างบอทนี้ด้วยตัวคุณเองใน Python โดยใช้คำตอบแบบสุ่มต่อไปนี้: + + ```python + random_responses = ["That is quite interesting, please tell me more.", + "I see. Do go on.", + "Why do you say that?", + "Funny weather we've been having, isn't it?", + "Let's change the subject.", + "Did you catch the game last night?"] + ``` + + นี่คือตัวอย่างผลลัพธ์เพื่อเป็นแนวทาง (ข้อมูลจากผู้ใช้จะอยู่ในบรรทัดที่ขึ้นต้นด้วย `>`): + + ```output + Hello, I am Marvin, the simple robot. + You can end this conversation at any time by typing 'bye' + After typing each answer, press 'enter' + How are you today? + > I am good thanks + That is quite interesting, please tell me more. + > today I went for a walk + Did you catch the game last night? + > I did, but my team lost + Funny weather we've been having, isn't it? + > yes but I hope next week is better + Let's change the subject. + > ok, lets talk about music + Why do you say that? + > because I like music! + Why do you say that? + > bye + It was nice talking to you, goodbye! + ``` + + หนึ่งในวิธีแก้ปัญหาที่เป็นไปได้สำหรับงานนี้อยู่ [ที่นี่](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py) + + ✅ หยุดและพิจารณา + + 1. คุณคิดว่าคำตอบแบบสุ่มจะ 'หลอก' ใครบางคนให้คิดว่าบอทเข้าใจพวกเขาจริง ๆ หรือไม่? + 2. บอทต้องมีคุณสมบัติอะไรบ้างเพื่อให้มีประสิทธิภาพมากขึ้น? + 3. หากบอทสามารถ 'เข้าใจ' ความหมายของประโยคได้จริง ๆ มันจะต้อง 'จดจำ' ความหมายของประโยคก่อนหน้าในบทสนทนาด้วยหรือไม่? + +--- + +## 🚀ความท้าทาย + +เลือกหนึ่งในองค์ประกอบ "หยุดและพิจารณา" ด้านบนและลองนำไปใช้ในโค้ดหรือเขียนวิธีแก้ปัญหาบนกระดาษโดยใช้ pseudocode + +ในบทเรียนถัดไป คุณจะได้เรียนรู้เกี่ยวกับวิธีการอื่น ๆ ในการวิเคราะห์ภาษาธรรมชาติและการเรียนรู้ของเครื่อง + +## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +ดูข้อมูลอ้างอิงด้านล่างเพื่อโอกาสในการอ่านเพิ่มเติม + +### ข้อมูลอ้างอิง + +1. Schubert, Lenhart, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = . +2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010. + +## งานที่ได้รับมอบหมาย + +[ค้นหาบอท](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/1-Introduction-to-NLP/assignment.md b/translations/th/6-NLP/1-Introduction-to-NLP/assignment.md new file mode 100644 index 000000000..68dca7c66 --- /dev/null +++ b/translations/th/6-NLP/1-Introduction-to-NLP/assignment.md @@ -0,0 +1,25 @@ + +# ค้นหาบอท + +## คำแนะนำ + +บอทมีอยู่ทุกที่ งานของคุณคือ: ค้นหาบอทและนำมาใช้งาน! คุณสามารถพบพวกมันได้ในเว็บไซต์, แอปพลิเคชันธนาคาร, หรือแม้กระทั่งทางโทรศัพท์ เช่น เมื่อคุณโทรหาบริษัทบริการทางการเงินเพื่อขอคำแนะนำหรือข้อมูลบัญชี วิเคราะห์บอทนั้นและลองดูว่าคุณสามารถทำให้มันสับสนได้หรือไม่ ถ้าคุณทำให้บอทสับสนได้ คุณคิดว่าเกิดจากอะไร? เขียนรายงานสั้น ๆ เกี่ยวกับประสบการณ์ของคุณ + +## เกณฑ์การประเมิน + +| เกณฑ์ | ดีเยี่ยม | พอใช้ | ต้องปรับปรุง | +| ------ | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | --------------------- | +| | เขียนรายงานเต็มหน้า อธิบายโครงสร้างของบอทที่คาดการณ์ไว้และสรุปประสบการณ์ของคุณกับมัน | รายงานไม่สมบูรณ์หรือไม่ได้ทำการวิจัยอย่างดี | ไม่มีการส่งรายงาน | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษาอัตโนมัติ [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/2-Tasks/README.md b/translations/th/6-NLP/2-Tasks/README.md new file mode 100644 index 000000000..344e123af --- /dev/null +++ b/translations/th/6-NLP/2-Tasks/README.md @@ -0,0 +1,228 @@ + +# งานและเทคนิคทั่วไปในด้านการประมวลผลภาษาธรรมชาติ + +สำหรับงาน *การประมวลผลภาษาธรรมชาติ* ส่วนใหญ่ ข้อความที่ต้องการประมวลผลจะต้องถูกแยกส่วน ตรวจสอบ และจัดเก็บผลลัพธ์ หรืออ้างอิงกับกฎและชุดข้อมูล งานเหล่านี้ช่วยให้โปรแกรมเมอร์สามารถสกัด _ความหมาย_ หรือ _เจตนา_ หรือเพียงแค่ _ความถี่_ ของคำและคำศัพท์ในข้อความได้ + +## [แบบทดสอบก่อนการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +มาสำรวจเทคนิคทั่วไปที่ใช้ในการประมวลผลข้อความกัน เทคนิคเหล่านี้เมื่อรวมกับการเรียนรู้ของเครื่องจะช่วยให้คุณวิเคราะห์ข้อความจำนวนมากได้อย่างมีประสิทธิภาพ อย่างไรก็ตาม ก่อนที่จะนำ ML ไปใช้กับงานเหล่านี้ เรามาทำความเข้าใจปัญหาที่ผู้เชี่ยวชาญ NLP มักพบเจอกันก่อน + +## งานทั่วไปใน NLP + +มีวิธีการวิเคราะห์ข้อความที่คุณกำลังทำงานอยู่หลายวิธี มีงานที่คุณสามารถทำได้ และผ่านงานเหล่านี้คุณจะสามารถเข้าใจข้อความและสรุปผลได้ โดยปกติคุณจะดำเนินการงานเหล่านี้ตามลำดับ + +### Tokenization + +สิ่งแรกที่อัลกอริทึม NLP ส่วนใหญ่ต้องทำคือการแบ่งข้อความออกเป็นโทเค็นหรือคำ แม้ว่าจะฟังดูง่าย แต่การต้องคำนึงถึงเครื่องหมายวรรคตอนและตัวแบ่งคำและประโยคในภาษาต่าง ๆ อาจทำให้ซับซ้อนได้ คุณอาจต้องใช้วิธีการต่าง ๆ เพื่อกำหนดจุดแบ่ง + +![tokenization](../../../../6-NLP/2-Tasks/images/tokenization.png) +> การแบ่งประโยคจาก **Pride and Prejudice** อินโฟกราฟิกโดย [Jen Looper](https://twitter.com/jenlooper) + +### Embeddings + +[Word embeddings](https://wikipedia.org/wiki/Word_embedding) เป็นวิธีการแปลงข้อมูลข้อความของคุณให้อยู่ในรูปแบบตัวเลข โดยการทำ embeddings จะทำในลักษณะที่คำที่มีความหมายคล้ายกันหรือคำที่ใช้ร่วมกันจะจัดกลุ่มอยู่ใกล้กัน + +![word embeddings](../../../../6-NLP/2-Tasks/images/embedding.png) +> "I have the highest respect for your nerves, they are my old friends." - Word embeddings สำหรับประโยคใน **Pride and Prejudice** อินโฟกราฟิกโดย [Jen Looper](https://twitter.com/jenlooper) + +✅ ลองใช้ [เครื่องมือที่น่าสนใจนี้](https://projector.tensorflow.org/) เพื่อทดลองกับ word embeddings การคลิกที่คำหนึ่งจะแสดงกลุ่มคำที่คล้ายกัน เช่น 'toy' จะอยู่ในกลุ่มเดียวกับ 'disney', 'lego', 'playstation', และ 'console' + +### Parsing & Part-of-speech Tagging + +ทุกคำที่ถูกแบ่งเป็นโทเค็นสามารถถูกแท็กเป็นส่วนของคำพูด เช่น คำนาม คำกริยา หรือคำคุณศัพท์ ประโยค `the quick red fox jumped over the lazy brown dog` อาจถูกแท็ก POS เป็น fox = noun, jumped = verb + +![parsing](../../../../6-NLP/2-Tasks/images/parse.png) + +> การวิเคราะห์ประโยคจาก **Pride and Prejudice** อินโฟกราฟิกโดย [Jen Looper](https://twitter.com/jenlooper) + +การวิเคราะห์โครงสร้างประโยคคือการระบุว่าคำใดเกี่ยวข้องกันในประโยค เช่น `the quick red fox jumped` เป็นลำดับคำคุณศัพท์-คำนาม-คำกริยา ที่แยกออกจากลำดับ `lazy brown dog` + +### Word and Phrase Frequencies + +กระบวนการที่มีประโยชน์เมื่อวิเคราะห์ข้อความจำนวนมากคือการสร้างพจนานุกรมของทุกคำหรือวลีที่สนใจและความถี่ที่ปรากฏ วลี `the quick red fox jumped over the lazy brown dog` มีความถี่ของคำว่า the เท่ากับ 2 + +มาดูตัวอย่างข้อความที่เรานับความถี่ของคำกัน บทกวี The Winners ของ Rudyard Kipling มีบทดังนี้: + +```output +What the moral? Who rides may read. +When the night is thick and the tracks are blind +A friend at a pinch is a friend, indeed, +But a fool to wait for the laggard behind. +Down to Gehenna or up to the Throne, +He travels the fastest who travels alone. +``` + +เนื่องจากความถี่ของวลีสามารถไม่คำนึงถึงตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กได้ตามต้องการ วลี `a friend` มีความถี่เท่ากับ 2 และ `the` มีความถี่เท่ากับ 6 และ `travels` มีความถี่เท่ากับ 2 + +### N-grams + +ข้อความสามารถถูกแบ่งออกเป็นลำดับของคำที่มีความยาวกำหนด เช่น คำเดียว (unigram), สองคำ (bigrams), สามคำ (trigrams) หรือจำนวนคำใด ๆ (n-grams) + +ตัวอย่างเช่น `the quick red fox jumped over the lazy brown dog` ด้วยคะแนน n-gram เท่ากับ 2 จะได้ n-grams ดังนี้: + +1. the quick +2. quick red +3. red fox +4. fox jumped +5. jumped over +6. over the +7. the lazy +8. lazy brown +9. brown dog + +อาจจะง่ายขึ้นถ้าจินตนาการว่าเป็นกล่องเลื่อนผ่านประโยค นี่คือตัวอย่างสำหรับ n-grams ที่มี 3 คำ โดย n-gram จะถูกเน้นในแต่ละประโยค: + +1. **the quick red** fox jumped over the lazy brown dog +2. the **quick red fox** jumped over the lazy brown dog +3. the quick **red fox jumped** over the lazy brown dog +4. the quick red **fox jumped over** the lazy brown dog +5. the quick red fox **jumped over the** lazy brown dog +6. the quick red fox jumped **over the lazy** brown dog +7. the quick red fox jumped over **the lazy brown** dog +8. the quick red fox jumped over the **lazy brown dog** + +![n-grams sliding window](../../../../6-NLP/2-Tasks/images/n-grams.gif) + +> ค่า n-gram เท่ากับ 3: อินโฟกราฟิกโดย [Jen Looper](https://twitter.com/jenlooper) + +### Noun phrase Extraction + +ในประโยคส่วนใหญ่จะมีคำนามที่เป็นประธานหรือกรรมของประโยค ในภาษาอังกฤษมักจะสามารถระบุได้จากการมี 'a' หรือ 'an' หรือ 'the' นำหน้า การระบุประธานหรือกรรมของประโยคโดยการ 'สกัดวลีคำนาม' เป็นงานทั่วไปใน NLP เมื่อพยายามทำความเข้าใจความหมายของประโยค + +✅ ในประโยค "I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun." คุณสามารถระบุวลีคำนามได้หรือไม่? + +ในประโยค `the quick red fox jumped over the lazy brown dog` มีวลีคำนาม 2 วลี: **quick red fox** และ **lazy brown dog** + +### Sentiment analysis + +ประโยคหรือข้อความสามารถถูกวิเคราะห์เพื่อดูอารมณ์ หรือว่า *เป็นบวก* หรือ *เป็นลบ* อารมณ์ถูกวัดในรูปแบบ *polarity* และ *objectivity/subjectivity* โดย polarity วัดจาก -1.0 ถึง 1.0 (ลบถึงบวก) และ 0.0 ถึง 1.0 (วัตถุประสงค์ที่สุดถึงอัตวิสัยที่สุด) + +✅ ในภายหลังคุณจะได้เรียนรู้ว่ามีวิธีการต่าง ๆ ในการกำหนดอารมณ์โดยใช้การเรียนรู้ของเครื่อง แต่หนึ่งในวิธีคือการมีรายการคำและวลีที่ถูกจัดหมวดหมู่เป็นบวกหรือลบโดยผู้เชี่ยวชาญ และนำโมเดลนั้นไปใช้กับข้อความเพื่อคำนวณคะแนน polarity คุณเห็นไหมว่าวิธีนี้สามารถทำงานได้ในบางสถานการณ์และไม่ดีในบางสถานการณ์? + +### Inflection + +Inflection ช่วยให้คุณสามารถนำคำมาเปลี่ยนเป็นรูปเอกพจน์หรือพหูพจน์ได้ + +### Lemmatization + +*Lemma* คือรากหรือคำหลักสำหรับชุดคำ เช่น *flew*, *flies*, *flying* มี lemma เป็นคำกริยา *fly* + +ยังมีฐานข้อมูลที่มีประโยชน์สำหรับนักวิจัย NLP โดยเฉพาะ: + +### WordNet + +[WordNet](https://wordnet.princeton.edu/) เป็นฐานข้อมูลของคำ คำพ้อง คำตรงข้าม และรายละเอียดอื่น ๆ สำหรับทุกคำในหลายภาษา เป็นเครื่องมือที่มีประโยชน์มากเมื่อพยายามสร้างการแปล ตัวตรวจสอบการสะกด หรือเครื่องมือภาษาทุกประเภท + +## ไลบรารี NLP + +โชคดีที่คุณไม่จำเป็นต้องสร้างเทคนิคเหล่านี้ด้วยตัวเอง เพราะมีไลบรารี Python ที่ยอดเยี่ยมที่ทำให้การพัฒนาสำหรับผู้ที่ไม่ได้เชี่ยวชาญใน NLP หรือการเรียนรู้ของเครื่องง่ายขึ้นมาก ในบทเรียนถัดไปจะมีตัวอย่างเพิ่มเติม แต่ที่นี่คุณจะได้เรียนรู้ตัวอย่างที่มีประโยชน์เพื่อช่วยคุณในงานถัดไป + +### การฝึกฝน - ใช้ไลบรารี `TextBlob` + +มาลองใช้ไลบรารีที่ชื่อว่า TextBlob ซึ่งมี API ที่มีประโยชน์สำหรับจัดการงานประเภทนี้ TextBlob "สร้างขึ้นบนพื้นฐานของ [NLTK](https://nltk.org) และ [pattern](https://github.com/clips/pattern) และทำงานร่วมกันได้ดี" + +> หมายเหตุ: มี [Quick Start](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) ที่มีประโยชน์สำหรับ TextBlob ซึ่งแนะนำสำหรับนักพัฒนา Python ที่มีประสบการณ์ + +เมื่อพยายามระบุ *noun phrases* TextBlob มีตัวเลือกหลายตัวสำหรับการสกัดวลีคำนาม + +1. ลองดูที่ `ConllExtractor` + + ```python + from textblob import TextBlob + from textblob.np_extractors import ConllExtractor + # import and create a Conll extractor to use later + extractor = ConllExtractor() + + # later when you need a noun phrase extractor: + user_input = input("> ") + user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified + np = user_input_blob.noun_phrases + ``` + + > เกิดอะไรขึ้นที่นี่? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) คือ "ตัวสกัดวลีคำนามที่ใช้ chunk parsing ที่ฝึกด้วยชุดข้อมูล ConLL-2000" ConLL-2000 หมายถึงการประชุมปี 2000 เกี่ยวกับ Computational Natural Language Learning ซึ่งในปีนั้นมีการจัด workshop เพื่อแก้ปัญหา NLP ที่ยากลำบาก และในปี 2000 คือ noun chunking โมเดลถูกฝึกด้วย Wall Street Journal โดยใช้ "sections 15-18 เป็นข้อมูลการฝึก (211727 tokens) และ section 20 เป็นข้อมูลทดสอบ (47377 tokens)" คุณสามารถดูขั้นตอนที่ใช้ [ที่นี่](https://www.clips.uantwerpen.be/conll2000/chunking/) และ [ผลลัพธ์](https://ifarm.nl/erikt/research/np-chunking.html) + +### ความท้าทาย - ปรับปรุงบอทของคุณด้วย NLP + +ในบทเรียนก่อนหน้านี้คุณได้สร้างบอท Q&A แบบง่าย ๆ ตอนนี้คุณจะทำให้ Marvin มีความเห็นอกเห็นใจมากขึ้นโดยการวิเคราะห์ข้อความที่คุณป้อนเพื่อดูอารมณ์และพิมพ์คำตอบที่เหมาะสมกับอารมณ์นั้น คุณยังต้องระบุ `noun_phrase` และถามเกี่ยวกับหัวข้อนั้นด้วย + +ขั้นตอนของคุณเมื่อสร้างบอทสนทนาที่ดีขึ้น: + +1. พิมพ์คำแนะนำเพื่อแนะนำผู้ใช้วิธีการโต้ตอบกับบอท +2. เริ่มลูป + 1. รับข้อมูลจากผู้ใช้ + 2. หากผู้ใช้ขอออก ให้หยุด + 3. ประมวลผลข้อมูลผู้ใช้และกำหนดคำตอบที่เหมาะสมกับอารมณ์ + 4. หากตรวจพบ noun phrase ในอารมณ์ ให้เปลี่ยนเป็นรูปพหูพจน์และถามข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนั้น + 5. พิมพ์คำตอบ +3. กลับไปที่ขั้นตอน 2 + +นี่คือตัวอย่างโค้ดสำหรับการกำหนดอารมณ์โดยใช้ TextBlob สังเกตว่ามีเพียงสี่ *ระดับ* ของการตอบสนองต่ออารมณ์ (คุณสามารถเพิ่มได้หากต้องการ): + +```python +if user_input_blob.polarity <= -0.5: + response = "Oh dear, that sounds bad. " +elif user_input_blob.polarity <= 0: + response = "Hmm, that's not great. " +elif user_input_blob.polarity <= 0.5: + response = "Well, that sounds positive. " +elif user_input_blob.polarity <= 1: + response = "Wow, that sounds great. " +``` + +นี่คือตัวอย่างผลลัพธ์เพื่อเป็นแนวทาง (ข้อมูลผู้ใช้เริ่มต้นด้วย >): + +```output +Hello, I am Marvin, the friendly robot. +You can end this conversation at any time by typing 'bye' +After typing each answer, press 'enter' +How are you today? +> I am ok +Well, that sounds positive. Can you tell me more? +> I went for a walk and saw a lovely cat +Well, that sounds positive. Can you tell me more about lovely cats? +> cats are the best. But I also have a cool dog +Wow, that sounds great. Can you tell me more about cool dogs? +> I have an old hounddog but he is sick +Hmm, that's not great. Can you tell me more about old hounddogs? +> bye +It was nice talking to you, goodbye! +``` + +หนึ่งในวิธีแก้ปัญหาที่เป็นไปได้สำหรับงานนี้คือ [ที่นี่](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py) + +✅ ตรวจสอบความรู้ + +1. คุณคิดว่าการตอบสนองที่เห็นอกเห็นใจจะ 'หลอก' ให้คนคิดว่าบอทเข้าใจพวกเขาจริง ๆ ได้หรือไม่? +2. การระบุ noun phrase ทำให้บอทดู 'น่าเชื่อถือ' มากขึ้นหรือไม่? +3. ทำไมการสกัด 'noun phrase' จากประโยคถึงเป็นสิ่งที่มีประโยชน์? + +--- + +ลองสร้างบอทในแบบตรวจสอบความรู้ข้างต้นและทดสอบกับเพื่อนของคุณ มันสามารถหลอกพวกเขาได้หรือไม่? คุณสามารถทำให้บอทของคุณดู 'น่าเชื่อถือ' มากขึ้นได้หรือไม่? + +## 🚀ความท้าทาย + +ลองทำงานในแบบตรวจสอบความรู้ข้างต้นและพยายามนำไปใช้ ทดสอบบอทกับเพื่อนของคุณ มันสามารถหลอกพวกเขาได้หรือไม่? คุณสามารถทำให้บอทของคุณดู 'น่าเชื่อถือ' มากขึ้นได้หรือไม่? + +## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +ในบทเรียนถัดไปคุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับการวิเคราะห์อารมณ์ ค้นคว้าเทคนิคที่น่าสนใจนี้ในบทความ เช่น บทความใน [KDNuggets](https://www.kdnuggets.com/tag/nlp) + +## งานที่ได้รับมอบหมาย + +[ทำให้บอทตอบกลับ](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/2-Tasks/assignment.md b/translations/th/6-NLP/2-Tasks/assignment.md new file mode 100644 index 000000000..3249b3bb9 --- /dev/null +++ b/translations/th/6-NLP/2-Tasks/assignment.md @@ -0,0 +1,25 @@ + +# ทำให้บอทตอบกลับ + +## คำแนะนำ + +ในบทเรียนที่ผ่านมา คุณได้เขียนโปรแกรมบอทพื้นฐานที่สามารถพูดคุยได้ บอทนี้จะให้คำตอบแบบสุ่มจนกว่าคุณจะพูดว่า 'bye' คุณสามารถทำให้คำตอบของบอทมีความเฉพาะเจาะจงมากขึ้นได้หรือไม่ โดยให้บอทตอบกลับเมื่อคุณพูดบางคำ เช่น 'ทำไม' หรือ 'อย่างไร'? ลองคิดดูว่าการเรียนรู้ของเครื่อง (Machine Learning) อาจช่วยลดความยุ่งยากในงานประเภทนี้ได้อย่างไรเมื่อคุณพัฒนาบอทของคุณ คุณสามารถใช้ไลบรารี NLTK หรือ TextBlob เพื่อช่วยให้งานของคุณง่ายขึ้น + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | พอใช้ | ต้องปรับปรุง | +| ------ | ------------------------------------------- | ------------------------------------------------ | ----------------------- | +| | มีไฟล์ bot.py ใหม่ที่นำเสนอและมีการอธิบาย | มีไฟล์บอทใหม่ที่นำเสนอแต่มีข้อผิดพลาด | ไม่มีการนำเสนอไฟล์ | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/3-Translation-Sentiment/README.md b/translations/th/6-NLP/3-Translation-Sentiment/README.md new file mode 100644 index 000000000..14498d52e --- /dev/null +++ b/translations/th/6-NLP/3-Translation-Sentiment/README.md @@ -0,0 +1,200 @@ + +# การแปลและการวิเคราะห์ความรู้สึกด้วย ML + +ในบทเรียนก่อนหน้านี้ คุณได้เรียนรู้วิธีสร้างบอทพื้นฐานโดยใช้ `TextBlob` ซึ่งเป็นไลบรารีที่มี ML อยู่เบื้องหลังเพื่อทำงาน NLP พื้นฐาน เช่น การดึงวลีคำนาม อีกหนึ่งความท้าทายสำคัญในภาษาศาสตร์เชิงคอมพิวเตอร์คือการแปลประโยคจากภาษาพูดหรือภาษาเขียนหนึ่งไปยังอีกภาษาอย่างแม่นยำ + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +การแปลเป็นปัญหาที่ยากมาก เนื่องจากมีภาษาหลายพันภาษา และแต่ละภาษามีกฎไวยากรณ์ที่แตกต่างกันอย่างมาก วิธีหนึ่งคือการแปลงกฎไวยากรณ์อย่างเป็นทางการของภาษา เช่น ภาษาอังกฤษ ให้เป็นโครงสร้างที่ไม่ขึ้นกับภาษา และจากนั้นแปลงกลับไปเป็นอีกภาษา วิธีนี้หมายความว่าคุณจะต้องทำตามขั้นตอนดังนี้: + +1. **การระบุ** ระบุหรือแท็กคำในภาษาต้นทาง เช่น คำนาม คำกริยา เป็นต้น +2. **สร้างการแปล** สร้างการแปลโดยตรงของแต่ละคำในรูปแบบภาษาปลายทาง + +### ตัวอย่างประโยค ภาษาอังกฤษเป็นภาษาไอริช + +ในภาษา 'อังกฤษ' ประโยค _I feel happy_ มีสามคำในลำดับ: + +- **ประธาน** (I) +- **กริยา** (feel) +- **คำคุณศัพท์** (happy) + +อย่างไรก็ตาม ในภาษา 'ไอริช' ประโยคเดียวกันมีโครงสร้างไวยากรณ์ที่แตกต่างกันมาก - อารมณ์เช่น "*happy*" หรือ "*sad*" ถูกแสดงออกว่าเป็น *สิ่งที่อยู่บนตัวคุณ* + +วลีภาษาอังกฤษ `I feel happy` ในภาษาไอริชจะเป็น `Tá athas orm` การแปลแบบ *ตรงตัว* จะเป็น `Happy is upon me` + +ผู้พูดภาษาไอริชที่แปลเป็นภาษาอังกฤษจะพูดว่า `I feel happy` ไม่ใช่ `Happy is upon me` เพราะพวกเขาเข้าใจความหมายของประโยค แม้ว่าคำและโครงสร้างประโยคจะแตกต่างกัน + +ลำดับอย่างเป็นทางการสำหรับประโยคในภาษาไอริชคือ: + +- **กริยา** (Tá หรือ is) +- **คำคุณศัพท์** (athas หรือ happy) +- **ประธาน** (orm หรือ upon me) + +## การแปล + +โปรแกรมแปลแบบง่ายอาจแปลคำเท่านั้น โดยไม่สนใจโครงสร้างประโยค + +✅ หากคุณเคยเรียนภาษาที่สอง (หรือสามหรือมากกว่า) ในวัยผู้ใหญ่ คุณอาจเริ่มต้นด้วยการคิดในภาษาของคุณเอง แปลแนวคิดคำต่อคำในหัวของคุณเป็นภาษาที่สอง และจากนั้นพูดการแปลออกมา นี่คล้ายกับสิ่งที่โปรแกรมแปลคอมพิวเตอร์แบบง่ายกำลังทำอยู่ สิ่งสำคัญคือต้องก้าวข้ามขั้นตอนนี้เพื่อให้ได้ความคล่องแคล่ว! + +การแปลแบบง่ายนำไปสู่การแปลที่ไม่ดี (และบางครั้งก็ตลก) เช่น `I feel happy` แปลตรงตัวเป็น `Mise bhraitheann athas` ในภาษาไอริช ซึ่งหมายถึง (ตรงตัว) `me feel happy` และไม่ใช่ประโยคภาษาไอริชที่ถูกต้อง แม้ว่าภาษาอังกฤษและภาษาไอริชจะเป็นภาษาที่พูดบนเกาะที่อยู่ใกล้กันมาก แต่ก็เป็นภาษาที่แตกต่างกันมากโดยมีกฎไวยากรณ์ที่แตกต่างกัน + +> คุณสามารถดูวิดีโอเกี่ยวกับประเพณีภาษาศาสตร์ของไอริช เช่น [วิดีโอนี้](https://www.youtube.com/watch?v=mRIaLSdRMMs) + +### วิธีการใช้ Machine Learning + +จนถึงตอนนี้ คุณได้เรียนรู้เกี่ยวกับวิธีการใช้กฎอย่างเป็นทางการใน NLP อีกวิธีหนึ่งคือการละเลยความหมายของคำ และ _ใช้ Machine Learning เพื่อค้นหารูปแบบแทน_ วิธีนี้สามารถใช้ได้ในงานแปลหากคุณมีข้อความจำนวนมาก (*corpus*) หรือข้อความ (*corpora*) ในทั้งภาษาต้นทางและภาษาปลายทาง + +ตัวอย่างเช่น ลองพิจารณากรณีของ *Pride and Prejudice* นวนิยายภาษาอังกฤษที่มีชื่อเสียงซึ่งเขียนโดย Jane Austen ในปี 1813 หากคุณดูหนังสือในภาษาอังกฤษและการแปลหนังสือเป็นภาษาฝรั่งเศสโดยมนุษย์ คุณสามารถตรวจจับวลีในหนึ่งภาษาที่ถูกแปล _ตามสำนวน_ เป็นอีกภาษาได้ คุณจะทำสิ่งนี้ในอีกสักครู่ + +ตัวอย่างเช่น เมื่อวลีภาษาอังกฤษ `I have no money` ถูกแปลตรงตัวเป็นภาษาฝรั่งเศส อาจกลายเป็น `Je n'ai pas de monnaie` "Monnaie" เป็นคำฝรั่งเศสที่หลอกลวง เนื่องจาก 'money' และ 'monnaie' ไม่ใช่คำพ้องความหมาย การแปลที่ดีกว่าที่มนุษย์อาจทำคือ `Je n'ai pas d'argent` เพราะมันสื่อความหมายได้ดีกว่าที่คุณไม่มีเงิน (แทนที่จะเป็น 'เศษเหรียญ' ซึ่งเป็นความหมายของ 'monnaie') + +![monnaie](../../../../6-NLP/3-Translation-Sentiment/images/monnaie.png) + +> ภาพโดย [Jen Looper](https://twitter.com/jenlooper) + +หากโมเดล ML มีการแปลโดยมนุษย์เพียงพอที่จะสร้างโมเดลขึ้นมาได้ มันสามารถปรับปรุงความแม่นยำของการแปลโดยการระบุรูปแบบทั่วไปในข้อความที่เคยถูกแปลโดยผู้เชี่ยวชาญที่พูดทั้งสองภาษา + +### แบบฝึกหัด - การแปล + +คุณสามารถใช้ `TextBlob` เพื่อแปลประโยค ลองใช้ประโยคแรกที่มีชื่อเสียงของ **Pride and Prejudice**: + +```python +from textblob import TextBlob + +blob = TextBlob( + "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!" +) +print(blob.translate(to="fr")) + +``` + +`TextBlob` ทำงานได้ดีในการแปล: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!". + +สามารถกล่าวได้ว่าการแปลของ TextBlob นั้นแม่นยำกว่าการแปลภาษาฝรั่งเศสในปี 1932 โดย V. Leconte และ Ch. Pressoir: + +"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles." + +ในกรณีนี้ การแปลที่ได้รับการสนับสนุนจาก ML ทำงานได้ดีกว่าผู้แปลที่ใส่คำในปากของผู้เขียนต้นฉบับโดยไม่จำเป็นเพื่อความชัดเจน + +> เกิดอะไรขึ้นที่นี่? และทำไม TextBlob ถึงเก่งเรื่องการแปล? เบื้องหลัง มันใช้ Google Translate ซึ่งเป็น AI ที่ซับซ้อนสามารถวิเคราะห์วลีหลายล้านวลีเพื่อทำนายสตริงที่ดีที่สุดสำหรับงานที่กำลังทำ ไม่มีอะไรที่เป็นการทำงานแบบแมนนวลที่นี่ และคุณต้องมีการเชื่อมต่ออินเทอร์เน็ตเพื่อใช้ `blob.translate` + +✅ ลองประโยคอื่น ๆ อีก คุณคิดว่า ML หรือการแปลโดยมนุษย์ดีกว่ากัน? ในกรณีใด? + +## การวิเคราะห์ความรู้สึก + +อีกหนึ่งพื้นที่ที่ Machine Learning สามารถทำงานได้ดีมากคือการวิเคราะห์ความรู้สึก วิธีที่ไม่ใช้ ML ในการวิเคราะห์ความรู้สึกคือการระบุคำและวลีที่ 'บวก' และ 'ลบ' จากนั้น เมื่อมีข้อความใหม่ ให้คำนวณค่ารวมของคำบวก ลบ และเป็นกลางเพื่อระบุความรู้สึกโดยรวม + +วิธีนี้ถูกหลอกได้ง่ายอย่างที่คุณอาจเห็นในงาน Marvin - ประโยค `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` เป็นประโยคที่มีความรู้สึกเชิงลบแบบประชดประชัน แต่ขั้นตอนวิธีง่าย ๆ ตรวจพบคำว่า 'great', 'wonderful', 'glad' เป็นบวก และ 'waste', 'lost' และ 'dark' เป็นลบ ความรู้สึกโดยรวมถูกโน้มน้าวโดยคำที่ขัดแย้งกันเหล่านี้ + +✅ หยุดสักครู่และคิดเกี่ยวกับวิธีที่เราสื่อประชดประชันในฐานะผู้พูดมนุษย์ น้ำเสียงมีบทบาทสำคัญ ลองพูดวลี "Well, that film was awesome" ในวิธีต่าง ๆ เพื่อค้นพบว่าน้ำเสียงของคุณสื่อความหมายอย่างไร + +### วิธีการใช้ ML + +วิธีการ ML คือการรวบรวมข้อความเชิงลบและบวกด้วยมือ - ทวีต หรือรีวิวภาพยนตร์ หรืออะไรก็ตามที่มนุษย์ให้คะแนน *และ* ความคิดเห็นเป็นลายลักษณ์อักษร จากนั้นสามารถใช้เทคนิค NLP กับความคิดเห็นและคะแนน เพื่อให้รูปแบบปรากฏขึ้น (เช่น รีวิวภาพยนตร์เชิงบวกมักมีวลี 'Oscar worthy' มากกว่าที่รีวิวภาพยนตร์เชิงลบ หรือรีวิวร้านอาหารเชิงบวกพูดว่า 'gourmet' มากกว่า 'disgusting') + +> ⚖️ **ตัวอย่าง**: หากคุณทำงานในสำนักงานของนักการเมือง และมีการอภิปรายกฎหมายใหม่ ผู้มีสิทธิเลือกตั้งอาจเขียนอีเมลถึงสำนักงานเพื่อสนับสนุนหรือคัดค้านกฎหมายใหม่ คุณได้รับมอบหมายให้อ่านอีเมลและจัดเรียงเป็น 2 กอง *สนับสนุน* และ *คัดค้าน* หากมีอีเมลจำนวนมาก คุณอาจรู้สึกหนักใจในการอ่านทั้งหมด จะดีแค่ไหนถ้าบอทสามารถอ่านทั้งหมดให้คุณ เข้าใจ และบอกคุณว่าอีเมลแต่ละฉบับอยู่ในกองไหน? +> +> วิธีหนึ่งที่จะทำให้สิ่งนี้สำเร็จคือการใช้ Machine Learning คุณจะฝึกโมเดลด้วยส่วนหนึ่งของอีเมล *คัดค้าน* และส่วนหนึ่งของอีเมล *สนับสนุน* โมเดลจะมีแนวโน้มที่จะเชื่อมโยงวลีและคำกับฝั่งคัดค้านและฝั่งสนับสนุน *แต่จะไม่เข้าใจเนื้อหาใด ๆ* เพียงแค่คำบางคำและรูปแบบมีแนวโน้มที่จะปรากฏในอีเมล *คัดค้าน* หรือ *สนับสนุน* คุณสามารถทดสอบมันด้วยอีเมลบางฉบับที่คุณไม่ได้ใช้ในการฝึกโมเดล และดูว่ามันมาถึงข้อสรุปเดียวกับคุณหรือไม่ จากนั้น เมื่อคุณพอใจกับความแม่นยำของโมเดล คุณสามารถประมวลผลอีเมลในอนาคตโดยไม่ต้องอ่านแต่ละฉบับ + +✅ กระบวนการนี้ฟังดูเหมือนกระบวนการที่คุณเคยใช้ในบทเรียนก่อนหน้านี้หรือไม่? + +## แบบฝึกหัด - ประโยคที่มีความรู้สึก + +ความรู้สึกถูกวัดด้วย *ความเป็นขั้ว* ตั้งแต่ -1 ถึง 1 หมายถึง -1 คือความรู้สึกเชิงลบที่สุด และ 1 คือความรู้สึกเชิงบวกที่สุด ความรู้สึกยังถูกวัดด้วยคะแนน 0 - 1 สำหรับความเป็นวัตถุ (0) และความเป็นอัตวิสัย (1) + +ลองดูอีกครั้งที่ *Pride and Prejudice* ของ Jane Austen ข้อความมีอยู่ที่นี่ที่ [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) ตัวอย่างด้านล่างแสดงโปรแกรมสั้น ๆ ที่วิเคราะห์ความรู้สึกของประโยคแรกและประโยคสุดท้ายจากหนังสือและแสดงคะแนนความเป็นขั้วและคะแนนความเป็นวัตถุ/อัตวิสัย + +คุณควรใช้ไลบรารี `TextBlob` (ที่อธิบายไว้ข้างต้น) เพื่อกำหนด `sentiment` (คุณไม่จำเป็นต้องเขียนเครื่องคำนวณความรู้สึกของคุณเอง) ในงานต่อไปนี้ + +```python +from textblob import TextBlob + +quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.""" + +quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them.""" + +sentiment1 = TextBlob(quote1).sentiment +sentiment2 = TextBlob(quote2).sentiment + +print(quote1 + " has a sentiment of " + str(sentiment1)) +print(quote2 + " has a sentiment of " + str(sentiment2)) +``` + +คุณจะเห็นผลลัพธ์ดังนี้: + +```output +It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146) + +Darcy, as well as Elizabeth, really loved them; and they were + both ever sensible of the warmest gratitude towards the persons + who, by bringing her into Derbyshire, had been the means of + uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8) +``` + +## ความท้าทาย - ตรวจสอบความเป็นขั้วของความรู้สึก + +งานของคุณคือการกำหนด โดยใช้ความเป็นขั้วของความรู้สึกว่า *Pride and Prejudice* มีประโยคที่เป็นบวกอย่างแน่นอนมากกว่าประโยคที่เป็นลบอย่างแน่นอนหรือไม่ สำหรับงานนี้ คุณสามารถสมมติว่าคะแนนความเป็นขั้ว 1 หรือ -1 เป็นบวกหรือเป็นลบอย่างแน่นอนตามลำดับ + +**ขั้นตอน:** + +1. ดาวน์โหลด [สำเนา Pride and Prejudice](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) จาก Project Gutenberg เป็นไฟล์ .txt ลบข้อมูลเมตาที่จุดเริ่มต้นและจุดสิ้นสุดของไฟล์ เหลือเพียงข้อความต้นฉบับ +2. เปิดไฟล์ใน Python และดึงเนื้อหาเป็นสตริง +3. สร้าง TextBlob โดยใช้สตริงของหนังสือ +4. วิเคราะห์แต่ละประโยคในหนังสือในลูป + 1. หากความเป็นขั้วคือ 1 หรือ -1 ให้เก็บประโยคไว้ในอาร์เรย์หรือรายการของข้อความบวกหรือลบ +5. ในตอนท้าย พิมพ์ประโยคบวกและประโยคลบทั้งหมด (แยกกัน) และจำนวนของแต่ละประเภท + +นี่คือตัวอย่าง [วิธีแก้ปัญหา](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb) + +✅ ตรวจสอบความรู้ + +1. ความรู้สึกขึ้นอยู่กับคำที่ใช้ในประโยค แต่โค้ด *เข้าใจ* คำหรือไม่? +2. คุณคิดว่าความเป็นขั้วของความรู้สึกนั้นแม่นยำหรือไม่ หรือพูดอีกอย่าง คุณ *เห็นด้วย* กับคะแนนหรือไม่? + 1. โดยเฉพาะ คุณเห็นด้วยหรือไม่เห็นด้วยกับความเป็นขั้ว **บวก** อย่างแน่นอนของประโยคต่อไปนี้: + * “What an excellent father you have, girls!” said she, when the door was shut. + * “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect. + * How wonderfully these sort of things occur! + * I have the greatest dislike in the world to that sort of thing. + * Charlotte is an excellent manager, I dare say. + * “This is delightful indeed! + * I am so happy! + * Your idea of the ponies is delightful. + 2. ประโยค 3 ประโยคถัดไปถูกให้คะแนนด้วยความเป็นขั้วบวกอย่างแน่นอน แต่เมื่ออ่านอย่างละเอียด พวกมันไม่ใช่ประโยคบวก ทำไมการวิเคราะห์ความรู้สึกถึงคิดว่าพวกมันเป็นประโยคบวก? + * Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power. + * If I could but see you as happy! + * Our distress, my dear Lizzy, is very great. + 3. คุณเห็นด้วยหรือไม่เห็นด้วยกับความเป็นขั้ว **ลบ** อย่างแน่นอนของประโยคต่อไปนี้? + - Everybody is disgusted with his pride. + - “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful. + - The pause was to Elizabeth’s feelings dreadful. + - It would be dreadful! + +✅ ผู้ที่ชื่นชอบ Jane Austen จะเข้าใจว่าเธอมักใช้หนังสือของเธอเพื่อวิจารณ์แง่มุมที่ไร้สาระของสังคมยุครีเจนซี่ของอังกฤษ Elizabeth Bennett ตัวละครหลักใน *Pride and Prejudice* เป็นผู้สังเกตการณ์ทางสังคมที่เฉียบแหลม (เหมือนผู้เขียน) และภาษาของเธอมักมีความหมายที่ลึกซึ้ง แม้แต่ Mr. Darcy (ตัวละครที่เป็นคู่รักในเรื่อง) ยังสังเกตเห็นการใช้ภาษาที่ขี้เล่นและล้อเลียนของ Elizabeth: "I have had the pleasure of your acquaintance long enough to know that you find great enjoyment in occasionally professing opinions which in fact are not your own." + +--- + +## 🚀ความท้าทาย + +คุณสามารถทำให้ Marvin ดียิ่งขึ้นได้โดยการดึงคุณสมบัติอื่น ๆ จากข้อมูลที่ผู้ใช้ป้อนหรือไม่? + +## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง +มีหลายวิธีในการวิเคราะห์อารมณ์จากข้อความ ลองคิดถึงการใช้งานในธุรกิจที่อาจนำเทคนิคนี้ไปใช้ และลองคิดถึงวิธีที่มันอาจผิดพลาดได้ อ่านเพิ่มเติมเกี่ยวกับระบบวิเคราะห์อารมณ์ที่ซับซ้อนและพร้อมใช้งานในองค์กร เช่น [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott) ทดสอบประโยคจากเรื่อง Pride and Prejudice ด้านบนและดูว่ามันสามารถตรวจจับความละเอียดอ่อนของอารมณ์ได้หรือไม่ + +## งานที่ได้รับมอบหมาย + +[Poetic license](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/3-Translation-Sentiment/assignment.md b/translations/th/6-NLP/3-Translation-Sentiment/assignment.md new file mode 100644 index 000000000..ac1459056 --- /dev/null +++ b/translations/th/6-NLP/3-Translation-Sentiment/assignment.md @@ -0,0 +1,25 @@ + +# ใบอนุญาตเชิงกวี + +## คำแนะนำ + +ใน [สมุดบันทึกนี้](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) คุณจะพบบทกวีของ Emily Dickinson กว่า 500 บทที่เคยถูกวิเคราะห์ความรู้สึกด้วย Azure text analytics มาก่อนแล้ว ใช้ชุดข้อมูลนี้เพื่อวิเคราะห์โดยใช้เทคนิคที่อธิบายไว้ในบทเรียน ความรู้สึกที่แนะนำในบทกวีตรงกับการตัดสินใจของบริการ Azure ที่ซับซ้อนกว่าหรือไม่? เพราะเหตุใดในความคิดเห็นของคุณ? มีสิ่งใดที่ทำให้คุณประหลาดใจหรือไม่? + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| ------ | -------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------ | +| | มีการนำเสนอสมุดบันทึกพร้อมการวิเคราะห์ที่มั่นคงจากตัวอย่างผลงานของผู้เขียน | สมุดบันทึกไม่สมบูรณ์หรือไม่ได้ทำการวิเคราะห์ | ไม่มีการนำเสนอสมุดบันทึก | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/3-Translation-Sentiment/solution/Julia/README.md b/translations/th/6-NLP/3-Translation-Sentiment/solution/Julia/README.md new file mode 100644 index 000000000..ad9778371 --- /dev/null +++ b/translations/th/6-NLP/3-Translation-Sentiment/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/3-Translation-Sentiment/solution/R/README.md b/translations/th/6-NLP/3-Translation-Sentiment/solution/R/README.md new file mode 100644 index 000000000..54073a947 --- /dev/null +++ b/translations/th/6-NLP/3-Translation-Sentiment/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามอย่างเต็มที่เพื่อให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่มีความสำคัญ แนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/4-Hotel-Reviews-1/README.md b/translations/th/6-NLP/4-Hotel-Reviews-1/README.md new file mode 100644 index 000000000..8cd871926 --- /dev/null +++ b/translations/th/6-NLP/4-Hotel-Reviews-1/README.md @@ -0,0 +1,417 @@ + +# การวิเคราะห์ความรู้สึกด้วยรีวิวโรงแรม - การประมวลผลข้อมูล + +ในส่วนนี้ คุณจะใช้เทคนิคที่เรียนรู้ในบทเรียนก่อนหน้าเพื่อทำการวิเคราะห์ข้อมูลเบื้องต้นในชุดข้อมูลขนาดใหญ่ เมื่อคุณเข้าใจถึงความมีประโยชน์ของคอลัมน์ต่าง ๆ แล้ว คุณจะได้เรียนรู้: + +- วิธีลบคอลัมน์ที่ไม่จำเป็น +- วิธีคำนวณข้อมูลใหม่จากคอลัมน์ที่มีอยู่ +- วิธีบันทึกชุดข้อมูลที่ได้เพื่อใช้ในความท้าทายสุดท้าย + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +### บทนำ + +จนถึงตอนนี้ คุณได้เรียนรู้ว่าข้อมูลข้อความนั้นแตกต่างจากข้อมูลประเภทตัวเลขอย่างมาก หากข้อความนั้นถูกเขียนหรือพูดโดยมนุษย์ ข้อมูลนั้นสามารถถูกวิเคราะห์เพื่อค้นหารูปแบบ ความถี่ ความรู้สึก และความหมาย บทเรียนนี้จะนำคุณเข้าสู่ชุดข้อมูลจริงพร้อมความท้าทายจริง: **[515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)** ซึ่งมี [CC0: Public Domain license](https://creativecommons.org/publicdomain/zero/1.0/) ข้อมูลนี้ถูกดึงมาจาก Booking.com จากแหล่งข้อมูลสาธารณะ ผู้สร้างชุดข้อมูลคือ Jiashen Liu + +### การเตรียมตัว + +สิ่งที่คุณต้องมี: + +* ความสามารถในการรันไฟล์ .ipynb โดยใช้ Python 3 +* pandas +* NLTK, [ซึ่งคุณควรติดตั้งในเครื่อง](https://www.nltk.org/install.html) +* ชุดข้อมูลที่มีอยู่ใน Kaggle [515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe) ขนาดประมาณ 230 MB เมื่อคลายซิปแล้ว ดาวน์โหลดไปยังโฟลเดอร์ `/data` ที่เกี่ยวข้องกับบทเรียน NLP เหล่านี้ + +## การวิเคราะห์ข้อมูลเบื้องต้น + +ความท้าทายนี้สมมติว่าคุณกำลังสร้างบอทแนะนำโรงแรมโดยใช้การวิเคราะห์ความรู้สึกและคะแนนรีวิวของผู้เข้าพัก ชุดข้อมูลที่คุณจะใช้ประกอบด้วยรีวิวของโรงแรม 1493 แห่งใน 6 เมือง + +โดยใช้ Python, ชุดข้อมูลรีวิวโรงแรม และการวิเคราะห์ความรู้สึกของ NLTK คุณสามารถค้นหา: + +* คำและวลีที่ถูกใช้บ่อยที่สุดในรีวิวคืออะไร? +* *แท็ก* อย่างเป็นทางการที่อธิบายโรงแรมมีความสัมพันธ์กับคะแนนรีวิวหรือไม่ (เช่น รีวิวที่เป็นลบมากขึ้นสำหรับโรงแรมที่ระบุว่าเหมาะสำหรับ *ครอบครัวที่มีเด็กเล็ก* มากกว่า *นักเดินทางคนเดียว* อาจบ่งบอกว่าโรงแรมเหมาะสำหรับ *นักเดินทางคนเดียว* มากกว่า) +* คะแนนความรู้สึกของ NLTK 'สอดคล้อง' กับคะแนนตัวเลขของผู้รีวิวหรือไม่? + +#### ชุดข้อมูล + +มาสำรวจชุดข้อมูลที่คุณดาวน์โหลดและบันทึกไว้ในเครื่อง เปิดไฟล์ในโปรแกรมแก้ไข เช่น VS Code หรือแม้แต่ Excel + +หัวข้อในชุดข้อมูลมีดังนี้: + +*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng* + +นี่คือการจัดกลุ่มในรูปแบบที่อาจง่ายต่อการตรวจสอบ: +##### คอลัมน์โรงแรม + +* `Hotel_Name`, `Hotel_Address`, `lat` (ละติจูด), `lng` (ลองจิจูด) + * โดยใช้ *lat* และ *lng* คุณสามารถสร้างแผนที่ด้วย Python เพื่อแสดงตำแหน่งโรงแรม (อาจใช้สีเพื่อแสดงรีวิวที่เป็นลบและบวก) + * Hotel_Address อาจไม่เป็นประโยชน์ต่อเรา และเราน่าจะเปลี่ยนเป็นประเทศเพื่อให้ง่ายต่อการจัดเรียงและค้นหา + +**คอลัมน์เมตารีวิวของโรงแรม** + +* `Average_Score` + * ตามที่ผู้สร้างชุดข้อมูลระบุ คอลัมน์นี้คือ *คะแนนเฉลี่ยของโรงแรมที่คำนวณจากความคิดเห็นล่าสุดในปีที่ผ่านมา* วิธีการคำนวณคะแนนนี้ดูแปลก แต่เนื่องจากเป็นข้อมูลที่ดึงมา เราอาจยอมรับตามนั้นในตอนนี้ + + ✅ จากคอลัมน์อื่น ๆ ในข้อมูลนี้ คุณคิดวิธีอื่นในการคำนวณคะแนนเฉลี่ยได้หรือไม่? + +* `Total_Number_of_Reviews` + * จำนวนรีวิวทั้งหมดที่โรงแรมนี้ได้รับ - ไม่ชัดเจน (โดยไม่เขียนโค้ด) ว่าหมายถึงรีวิวในชุดข้อมูลหรือไม่ +* `Additional_Number_of_Scoring` + * หมายถึงมีการให้คะแนนรีวิว แต่ไม่มีการเขียนรีวิวที่เป็นบวกหรือเป็นลบโดยผู้รีวิว + +**คอลัมน์รีวิว** + +- `Reviewer_Score` + - เป็นค่าตัวเลขที่มีทศนิยมไม่เกิน 1 ตำแหน่ง ระหว่างค่าต่ำสุดและสูงสุด 2.5 และ 10 + - ไม่ได้อธิบายว่าทำไมคะแนนต่ำสุดที่เป็นไปได้คือ 2.5 +- `Negative_Review` + - หากผู้รีวิวไม่ได้เขียนอะไร คอลัมน์นี้จะมี "**No Negative**" + - โปรดทราบว่าผู้รีวิวอาจเขียนรีวิวที่เป็นบวกในคอลัมน์ Negative review (เช่น "ไม่มีอะไรแย่เกี่ยวกับโรงแรมนี้") +- `Review_Total_Negative_Word_Counts` + - จำนวนคำที่เป็นลบสูงขึ้นบ่งชี้คะแนนที่ต่ำลง (โดยไม่ตรวจสอบความรู้สึก) +- `Positive_Review` + - หากผู้รีวิวไม่ได้เขียนอะไร คอลัมน์นี้จะมี "**No Positive**" + - โปรดทราบว่าผู้รีวิวอาจเขียนรีวิวที่เป็นลบในคอลัมน์ Positive review (เช่น "ไม่มีอะไรดีเกี่ยวกับโรงแรมนี้เลย") +- `Review_Total_Positive_Word_Counts` + - จำนวนคำที่เป็นบวกสูงขึ้นบ่งชี้คะแนนที่สูงขึ้น (โดยไม่ตรวจสอบความรู้สึก) +- `Review_Date` และ `days_since_review` + - อาจมีการใช้มาตรการความสดใหม่หรือความเก่าของรีวิว (รีวิวที่เก่าอาจไม่แม่นยำเท่ากับรีวิวใหม่ เนื่องจากการเปลี่ยนแปลงการบริหารโรงแรม การปรับปรุง หรือการเพิ่มสิ่งอำนวยความสะดวก เช่น สระว่ายน้ำ) +- `Tags` + - เป็นคำอธิบายสั้น ๆ ที่ผู้รีวิวอาจเลือกเพื่ออธิบายประเภทของแขกที่พวกเขาเป็น (เช่น เดินทางคนเดียวหรือครอบครัว) ประเภทของห้องที่พวกเขาเข้าพัก ระยะเวลาการเข้าพัก และวิธีการส่งรีวิว + - น่าเสียดายที่การใช้แท็กเหล่านี้มีปัญหา ดูส่วนด้านล่างที่กล่าวถึงความมีประโยชน์ของแท็กเหล่านี้ + +**คอลัมน์ผู้รีวิว** + +- `Total_Number_of_Reviews_Reviewer_Has_Given` + - อาจเป็นปัจจัยในโมเดลแนะนำ เช่น หากคุณสามารถกำหนดได้ว่าผู้รีวิวที่มีรีวิวหลายร้อยรายการมีแนวโน้มที่จะเป็นลบมากกว่าบวก อย่างไรก็ตาม ผู้รีวิวของรีวิวใด ๆ ไม่ได้ถูกระบุด้วยรหัสเฉพาะ และดังนั้นจึงไม่สามารถเชื่อมโยงกับชุดรีวิวได้ มีผู้รีวิว 30 คนที่มีรีวิว 100 รายการขึ้นไป แต่ยากที่จะเห็นว่าข้อมูลนี้จะช่วยโมเดลแนะนำได้อย่างไร +- `Reviewer_Nationality` + - บางคนอาจคิดว่าชาติบางชาติมีแนวโน้มที่จะให้รีวิวที่เป็นบวกหรือลบมากกว่าเนื่องจากลักษณะประจำชาติ โปรดระวังการสร้างมุมมองเชิงเล่าเรื่องแบบนี้ในโมเดลของคุณ สิ่งเหล่านี้เป็นภาพลักษณ์ประจำชาติ (และบางครั้งก็เป็นภาพลักษณ์เชิงเชื้อชาติ) และผู้รีวิวแต่ละคนเป็นบุคคลที่เขียนรีวิวตามประสบการณ์ของพวกเขา อาจถูกกรองผ่านเลนส์หลายแบบ เช่น การเข้าพักโรงแรมครั้งก่อน ระยะทางที่เดินทาง และอารมณ์ส่วนตัว การคิดว่าชาติของพวกเขาเป็นเหตุผลสำหรับคะแนนรีวิวเป็นเรื่องยากที่จะพิสูจน์ + +##### ตัวอย่าง + +| Average Score | Total Number Reviews | Reviewer Score | Negative
                      Review | Positive Review | Tags | +| -------------- | ---------------------- | ---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- | +| 7.8 | 1945 | 2.5 | ขณะนี้ไม่ใช่โรงแรมแต่เป็นไซต์ก่อสร้าง ฉันถูกรบกวนตั้งแต่เช้าตรู่และตลอดทั้งวันด้วยเสียงก่อสร้างที่ไม่สามารถยอมรับได้ขณะพักผ่อนหลังจากการเดินทางไกลและทำงานในห้อง คนงานทำงานตลอดทั้งวัน เช่น ใช้เครื่องเจาะในห้องข้างเคียง ฉันขอเปลี่ยนห้องแต่ไม่มีห้องเงียบให้ เพื่อให้แย่ลงไปอีก ฉันถูกเรียกเก็บเงินเกินราคา ฉันเช็คเอาท์ในตอนเย็นเนื่องจากต้องออกเดินทางแต่เช้าตรู่และได้รับใบเรียกเก็บเงินที่เหมาะสม วันต่อมาโรงแรมเรียกเก็บเงินอีกครั้งโดยไม่ได้รับความยินยอมในราคาที่เกินกว่าที่จองไว้ เป็นสถานที่ที่แย่มาก อย่าทำร้ายตัวเองด้วยการจองที่นี่ | ไม่มีอะไร สถานที่แย่มาก หลีกเลี่ยง | ทริปธุรกิจ คู่รัก ห้องมาตรฐานเตียงคู่ พัก 2 คืน | + +ดังที่คุณเห็น แขกคนนี้ไม่ได้มีความสุขกับการเข้าพักที่โรงแรมนี้ โรงแรมมีคะแนนเฉลี่ยที่ดีที่ 7.8 และรีวิว 1945 รายการ แต่ผู้รีวิวนี้ให้คะแนน 2.5 และเขียน 115 คำเกี่ยวกับความลบของการเข้าพัก หากพวกเขาไม่ได้เขียนอะไรเลยในคอลัมน์ Positive_Review คุณอาจสันนิษฐานว่าไม่มีอะไรเป็นบวก แต่พวกเขาเขียนคำเตือน 7 คำ หากเรานับคำแทนที่จะดูความหมายหรือความรู้สึกของคำ เราอาจมีมุมมองที่ผิดเพี้ยนเกี่ยวกับเจตนาของผู้รีวิว แปลกที่คะแนน 2.5 ของพวกเขานั้นน่าสับสน เพราะหากการเข้าพักโรงแรมแย่มาก ทำไมถึงให้คะแนนใด ๆ เลย? การตรวจสอบชุดข้อมูลอย่างใกล้ชิด คุณจะเห็นว่าคะแนนต่ำสุดที่เป็นไปได้คือ 2.5 ไม่ใช่ 0 คะแนนสูงสุดที่เป็นไปได้คือ 10 + +##### แท็ก + +ดังที่กล่าวไว้ข้างต้น ในแวบแรก แนวคิดในการใช้ `Tags` เพื่อจัดหมวดหมู่ข้อมูลดูเหมือนสมเหตุสมผล น่าเสียดายที่แท็กเหล่านี้ไม่ได้มาตรฐาน ซึ่งหมายความว่าในโรงแรมหนึ่ง ตัวเลือกอาจเป็น *Single room*, *Twin room*, และ *Double room* แต่ในโรงแรมถัดไป ตัวเลือกอาจเป็น *Deluxe Single Room*, *Classic Queen Room*, และ *Executive King Room* สิ่งเหล่านี้อาจเป็นสิ่งเดียวกัน แต่มีความหลากหลายมากจนตัวเลือกกลายเป็น: + +1. พยายามเปลี่ยนคำศัพท์ทั้งหมดให้เป็นมาตรฐานเดียว ซึ่งยากมาก เพราะไม่ชัดเจนว่าเส้นทางการแปลงจะเป็นอย่างไรในแต่ละกรณี (เช่น *Classic single room* แปลงเป็น *Single room* แต่ *Superior Queen Room with Courtyard Garden or City View* ยากที่จะแปลง) + +1. เราสามารถใช้วิธี NLP และวัดความถี่ของคำบางคำ เช่น *Solo*, *Business Traveller*, หรือ *Family with young kids* ที่ใช้กับแต่ละโรงแรม และนำมาพิจารณาในโมเดลแนะนำ + +แท็กมักจะ (แต่ไม่เสมอไป) เป็นฟิลด์เดียวที่มีรายการค่าคั่นด้วยเครื่องหมายจุลภาค 5 ถึง 6 ค่า ซึ่งสอดคล้องกับ *ประเภทของการเดินทาง*, *ประเภทของแขก*, *ประเภทของห้อง*, *จำนวนคืน*, และ *ประเภทของอุปกรณ์ที่ใช้ส่งรีวิว* อย่างไรก็ตาม เนื่องจากผู้รีวิวบางคนไม่ได้กรอกแต่ละฟิลด์ (อาจปล่อยว่างไว้หนึ่งฟิลด์) ค่าจึงไม่ได้อยู่ในลำดับเดียวกันเสมอไป + +ตัวอย่างเช่น *ประเภทของกลุ่ม* มีความเป็นไปได้ที่ไม่ซ้ำกัน 1025 รายการในฟิลด์นี้ในคอลัมน์ `Tags` และน่าเสียดายที่มีเพียงบางส่วนเท่านั้นที่อ้างถึงกลุ่ม (บางส่วนเป็นประเภทของห้อง ฯลฯ) หากคุณกรองเฉพาะค่าที่กล่าวถึงครอบครัว ผลลัพธ์จะมีค่าประเภท *Family room* จำนวนมาก หากคุณรวมคำว่า *with* เช่น นับค่าที่มี *Family with* ผลลัพธ์จะดีกว่า โดยมีมากกว่า 80,000 จาก 515,000 ผลลัพธ์ที่มีวลี "Family with young children" หรือ "Family with older children" + +นี่หมายความว่าคอลัมน์แท็กไม่ได้ไร้ประโยชน์ต่อเรา แต่จะต้องใช้ความพยายามในการทำให้มีประโยชน์ + +##### คะแนนเฉลี่ยของโรงแรม + +มีความแปลกหรือความไม่สอดคล้องกันในชุดข้อมูลที่ฉันไม่สามารถหาคำตอบได้ แต่ได้แสดงไว้ที่นี่เพื่อให้คุณทราบเมื่อสร้างโมเดลของคุณ หากคุณหาคำตอบได้ โปรดแจ้งให้เราทราบในส่วนการอภิปราย! + +ชุดข้อมูลมีคอลัมน์ต่อไปนี้ที่เกี่ยวข้องกับคะแนนเฉลี่ยและจำนวนรีวิว: + +1. Hotel_Name +2. Additional_Number_of_Scoring +3. Average_Score +4. Total_Number_of_Reviews +5. Reviewer_Score + +โรงแรมเดียวที่มีรีวิวมากที่สุดในชุดข้อมูลนี้คือ *Britannia International Hotel Canary Wharf* โดยมีรีวิว 4789 รายการจาก 515,000 รายการ แต่หากเราดูค่าของ `Total_Number_of_Reviews` สำหรับโรงแรมนี้ จะเป็น 9086 คุณอาจสันนิษฐานว่ามีคะแนนมากกว่าที่ไม่มีรีวิว ดังนั้นเราอาจเพิ่มค่าคอลัมน์ `Additional_Number_of_Scoring` ค่านั้นคือ 2682 และเมื่อเพิ่มเข้าไปใน 4789 จะได้ 7471 ซึ่งยังคงขาดไป 1615 จาก `Total_Number_of_Reviews` + +หากคุณใช้คอลัมน์ `Average_Score` คุณอาจสันนิษฐานว่ามันคือค่าเฉลี่ยของรีวิวในชุดข้อมูล แต่คำอธิบายจาก Kaggle คือ "*คะแนนเฉลี่ยของโรงแรมที่คำนวณจากความคิดเห็นล่าสุดในปีที่ผ่านมา*" ซึ่งดูเหมือนจะไม่เป็นประโยชน์นัก แต่เราสามารถคำนวณค่าเฉลี่ยของเราเองจากคะแนนรีวิวในชุดข้อมูล โดยใช้โรงแรมเดียวกันเป็นตัวอย่าง คะแนนเฉลี่ยของโรงแรมที่ให้ไว้คือ 7.1 แต่คะแนนที่คำนวณได้ (คะแนนเฉลี่ยของผู้รีวิว *ใน* ชุดข้อมูล) คือ 6.8 ซึ่งใกล้เคียงกัน แต่ไม่ใช่ค่าเดียวกัน และเราสามารถเดาได้ว่าคะแนนที่ให้ไว้ในรีวิว `Additional_Number_of_Scoring` เพิ่มค่าเฉลี่ยเป็น 7.1 น่าเสียดายที่ไม่มีวิธีทดสอบหรือพิสูจน์ข้อสันนิษฐานนี้ จึงยากที่จะใช้หรือเชื่อถือ `Average_Score`, `Additional_Number_of_Scoring` และ `Total_Number_of_Reviews` เมื่อพวกมันอ้างอิงถึงข้อมูลที่เราไม่มี + +เพื่อทำให้เรื่องซับซ้อนขึ้น โรงแรมที่มีจำนวนรีวิวมากที่สุดอันดับสองมีคะแนนเฉลี่ยที่คำนวณได้คือ 8.12 และคะแนน `Average_Score` ในชุดข้อมูลคือ 8.1 นี่เป็นคะแนนที่ถูกต้องโดยบังเอิญหรือโรงแรมแรกเป็นความไม่สอดคล้องกัน? + +ในความเป็นไปได้ที่โรงแรมเหล่านี้อาจเป็นค่าผิดปกติ และอาจเป็นไปได้ว่าค่าที่เหลือส่วนใหญ่สอดคล้องกัน (แต่บางค่าที่ไม่สอดคล้องกันด้วยเหตุผลบางประการ) เราจะเขียนโปรแกรมสั้น ๆ ต่อไปเพื่อสำรวจค่าต่าง ๆ ในชุดข้อมูลและกำหนดการใช้งานที่ถูกต้อง (หรือไม่ใช้งาน) ของค่าต่าง ๆ +> 🚨 หมายเหตุสำคัญ +> +> เมื่อทำงานกับชุดข้อมูลนี้ คุณจะเขียนโค้ดที่คำนวณบางสิ่งจากข้อความโดยไม่จำเป็นต้องอ่านหรือวิเคราะห์ข้อความด้วยตัวเอง นี่คือแก่นแท้ของ NLP ซึ่งคือการตีความความหมายหรืออารมณ์โดยไม่ต้องให้มนุษย์ทำเอง อย่างไรก็ตาม มีความเป็นไปได้ที่คุณจะอ่านรีวิวเชิงลบบางส่วน ขอแนะนำว่าอย่าทำ เพราะคุณไม่จำเป็นต้องอ่าน บางรีวิวอาจดูไร้สาระ หรือเป็นรีวิวเชิงลบที่ไม่เกี่ยวข้องกับโรงแรม เช่น "อากาศไม่ดี" ซึ่งเป็นสิ่งที่อยู่นอกเหนือการควบคุมของโรงแรม หรือแม้แต่ใครก็ตาม แต่ก็มีด้านมืดของรีวิวบางส่วนเช่นกัน บางครั้งรีวิวเชิงลบอาจมีเนื้อหาเหยียดเชื้อชาติ เหยียดเพศ หรือเหยียดอายุ ซึ่งเป็นเรื่องน่าเสียดายแต่ก็เป็นสิ่งที่คาดการณ์ได้ในชุดข้อมูลที่ดึงมาจากเว็บไซต์สาธารณะ บางคนเขียนรีวิวที่คุณอาจรู้สึกไม่พอใจ ไม่สบายใจ หรือสะเทือนใจ ดังนั้นควรปล่อยให้โค้ดวัดอารมณ์แทนที่จะอ่านด้วยตัวเองและรู้สึกไม่ดี อย่างไรก็ตาม มีเพียงส่วนน้อยที่เขียนสิ่งเหล่านี้ แต่ก็ยังมีอยู่ +## แบบฝึกหัด - การสำรวจข้อมูล +### โหลดข้อมูล + +พอแล้วกับการตรวจสอบข้อมูลด้วยสายตา ตอนนี้คุณจะเขียนโค้ดเพื่อหาคำตอบ! ส่วนนี้จะใช้ไลบรารี pandas งานแรกของคุณคือการตรวจสอบว่าคุณสามารถโหลดและอ่านข้อมูล CSV ได้หรือไม่ ไลบรารี pandas มีตัวโหลด CSV ที่รวดเร็ว และผลลัพธ์จะถูกเก็บไว้ใน dataframe เช่นเดียวกับบทเรียนก่อนหน้า ไฟล์ CSV ที่เรากำลังโหลดมีมากกว่าครึ่งล้านแถว แต่มีเพียง 17 คอลัมน์เท่านั้น Pandas มีวิธีการที่ทรงพลังมากมายในการโต้ตอบกับ dataframe รวมถึงความสามารถในการดำเนินการกับทุกแถว + +จากนี้ไปในบทเรียนนี้ จะมีตัวอย่างโค้ดและคำอธิบายบางส่วนเกี่ยวกับโค้ด รวมถึงการอภิปรายเกี่ยวกับความหมายของผลลัพธ์ ใช้ _notebook.ipynb_ ที่ให้มาเพื่อเขียนโค้ดของคุณ + +เริ่มต้นด้วยการโหลดไฟล์ข้อมูลที่คุณจะใช้: + +```python +# Load the hotel reviews from CSV +import pandas as pd +import time +# importing time so the start and end time can be used to calculate file loading time +print("Loading data file now, this could take a while depending on file size") +start = time.time() +# df is 'DataFrame' - make sure you downloaded the file to the data folder +df = pd.read_csv('../../data/Hotel_Reviews.csv') +end = time.time() +print("Loading took " + str(round(end - start, 2)) + " seconds") +``` + +เมื่อข้อมูลถูกโหลดแล้ว เราสามารถดำเนินการบางอย่างกับมันได้ เก็บโค้ดนี้ไว้ที่ด้านบนของโปรแกรมสำหรับส่วนถัดไป + +## สำรวจข้อมูล + +ในกรณีนี้ ข้อมูลได้รับการ *ทำความสะอาด* แล้ว หมายความว่าพร้อมใช้งานและไม่มีตัวอักษรในภาษาอื่นที่อาจทำให้อัลกอริทึมที่คาดหวังเฉพาะตัวอักษรภาษาอังกฤษเกิดปัญหา + +✅ คุณอาจต้องทำงานกับข้อมูลที่ต้องการการประมวลผลเบื้องต้นเพื่อจัดรูปแบบก่อนที่จะใช้เทคนิค NLP แต่ไม่ใช่ในครั้งนี้ หากคุณต้องจัดการกับตัวอักษรที่ไม่ใช่ภาษาอังกฤษ คุณจะจัดการอย่างไร? + +ใช้เวลาสักครู่เพื่อให้แน่ใจว่าเมื่อข้อมูลถูกโหลดแล้ว คุณสามารถสำรวจข้อมูลด้วยโค้ดได้ เป็นเรื่องง่ายที่จะมุ่งเน้นไปที่คอลัมน์ `Negative_Review` และ `Positive_Review` ซึ่งเต็มไปด้วยข้อความธรรมชาติสำหรับอัลกอริทึม NLP ของคุณในการประมวลผล แต่เดี๋ยวก่อน! ก่อนที่คุณจะกระโดดเข้าสู่ NLP และการวิเคราะห์ความรู้สึก คุณควรทำตามโค้ดด้านล่างเพื่อยืนยันว่าค่าที่ให้มาในชุดข้อมูลตรงกับค่าที่คุณคำนวณด้วย pandas หรือไม่ + +## การดำเนินการกับ Dataframe + +งานแรกในบทเรียนนี้คือการตรวจสอบว่าข้อความต่อไปนี้ถูกต้องหรือไม่โดยการเขียนโค้ดเพื่อตรวจสอบ dataframe (โดยไม่เปลี่ยนแปลงมัน) + +> เช่นเดียวกับงานโปรแกรมมิ่งหลายๆ อย่าง มีหลายวิธีในการทำสิ่งนี้ให้สำเร็จ แต่คำแนะนำที่ดีคือทำในวิธีที่ง่ายที่สุดและเข้าใจง่ายที่สุด โดยเฉพาะอย่างยิ่งถ้ามันจะง่ายต่อการเข้าใจเมื่อคุณกลับมาดูโค้ดนี้ในอนาคต ด้วย dataframe มี API ที่ครอบคลุมซึ่งมักจะมีวิธีการทำสิ่งที่คุณต้องการอย่างมีประสิทธิภาพ + +ปฏิบัติต่อคำถามต่อไปนี้เป็นงานเขียนโค้ดและพยายามตอบโดยไม่ดูคำตอบ + +1. พิมพ์ *shape* ของ dataframe ที่คุณเพิ่งโหลด (shape คือจำนวนแถวและคอลัมน์) +2. คำนวณจำนวนครั้งที่ปรากฏของสัญชาติผู้รีวิว: + 1. มีค่าที่แตกต่างกันกี่ค่าในคอลัมน์ `Reviewer_Nationality` และมีค่าอะไรบ้าง? + 2. สัญชาติผู้รีวิวใดที่พบมากที่สุดในชุดข้อมูล (พิมพ์ชื่อประเทศและจำนวนรีวิว)? + 3. สัญชาติที่พบมากที่สุด 10 อันดับถัดไปและจำนวนครั้งที่พบคืออะไร? +3. โรงแรมที่ถูกรีวิวมากที่สุดสำหรับแต่ละสัญชาติผู้รีวิว 10 อันดับแรกคืออะไร? +4. มีรีวิวกี่รายการต่อโรงแรม (จำนวนครั้งที่โรงแรมถูกรีวิว) ในชุดข้อมูล? +5. แม้ว่าจะมีคอลัมน์ `Average_Score` สำหรับแต่ละโรงแรมในชุดข้อมูล คุณยังสามารถคำนวณคะแนนเฉลี่ย (โดยการหาค่าเฉลี่ยของคะแนนผู้รีวิวทั้งหมดในชุดข้อมูลสำหรับแต่ละโรงแรม) เพิ่มคอลัมน์ใหม่ใน dataframe ของคุณโดยใช้ชื่อคอลัมน์ `Calc_Average_Score` ที่มีค่าเฉลี่ยที่คำนวณได้ +6. มีโรงแรมใดบ้างที่มีค่า `Average_Score` และ `Calc_Average_Score` เท่ากัน (ปัดเศษทศนิยม 1 ตำแหน่ง)? + 1. ลองเขียนฟังก์ชัน Python ที่รับ Series (แถว) เป็นอาร์กิวเมนต์และเปรียบเทียบค่า โดยพิมพ์ข้อความเมื่อค่าต่างกัน จากนั้นใช้เมธอด `.apply()` เพื่อประมวลผลทุกแถวด้วยฟังก์ชัน +7. คำนวณและพิมพ์จำนวนแถวที่มีค่าคอลัมน์ `Negative_Review` เป็น "No Negative" +8. คำนวณและพิมพ์จำนวนแถวที่มีค่าคอลัมน์ `Positive_Review` เป็น "No Positive" +9. คำนวณและพิมพ์จำนวนแถวที่มีค่าคอลัมน์ `Positive_Review` เป็น "No Positive" **และ** `Negative_Review` เป็น "No Negative" + +### คำตอบโค้ด + +1. พิมพ์ *shape* ของ dataframe ที่คุณเพิ่งโหลด (shape คือจำนวนแถวและคอลัมน์) + + ```python + print("The shape of the data (rows, cols) is " + str(df.shape)) + > The shape of the data (rows, cols) is (515738, 17) + ``` + +2. คำนวณจำนวนครั้งที่ปรากฏของสัญชาติผู้รีวิว: + + 1. มีค่าที่แตกต่างกันกี่ค่าในคอลัมน์ `Reviewer_Nationality` และมีค่าอะไรบ้าง? + 2. สัญชาติผู้รีวิวใดที่พบมากที่สุดในชุดข้อมูล (พิมพ์ชื่อประเทศและจำนวนรีวิว)? + + ```python + # value_counts() creates a Series object that has index and values in this case, the country and the frequency they occur in reviewer nationality + nationality_freq = df["Reviewer_Nationality"].value_counts() + print("There are " + str(nationality_freq.size) + " different nationalities") + # print first and last rows of the Series. Change to nationality_freq.to_string() to print all of the data + print(nationality_freq) + + There are 227 different nationalities + United Kingdom 245246 + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + ... + Comoros 1 + Palau 1 + Northern Mariana Islands 1 + Cape Verde 1 + Guinea 1 + Name: Reviewer_Nationality, Length: 227, dtype: int64 + ``` + + 3. สัญชาติที่พบมากที่สุด 10 อันดับถัดไปและจำนวนครั้งที่พบคืออะไร? + + ```python + print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.") + # Notice there is a leading space on the values, strip() removes that for printing + # What is the top 10 most common nationalities and their frequencies? + print("The next 10 highest frequency reviewer nationalities are:") + print(nationality_freq[1:11].to_string()) + + The highest frequency reviewer nationality is United Kingdom with 245246 reviews. + The next 10 highest frequency reviewer nationalities are: + United States of America 35437 + Australia 21686 + Ireland 14827 + United Arab Emirates 10235 + Saudi Arabia 8951 + Netherlands 8772 + Switzerland 8678 + Germany 7941 + Canada 7894 + France 7296 + ``` + +3. โรงแรมที่ถูกรีวิวมากที่สุดสำหรับแต่ละสัญชาติผู้รีวิว 10 อันดับแรกคืออะไร? + + ```python + # What was the most frequently reviewed hotel for the top 10 nationalities + # Normally with pandas you will avoid an explicit loop, but wanted to show creating a new dataframe using criteria (don't do this with large amounts of data because it could be very slow) + for nat in nationality_freq[:10].index: + # First, extract all the rows that match the criteria into a new dataframe + nat_df = df[df["Reviewer_Nationality"] == nat] + # Now get the hotel freq + freq = nat_df["Hotel_Name"].value_counts() + print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.") + + The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews. + The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews. + The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews. + The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews. + The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews. + The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews. + The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews. + The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews. + The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews. + The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews. + ``` + +4. มีรีวิวกี่รายการต่อโรงแรม (จำนวนครั้งที่โรงแรมถูกรีวิว) ในชุดข้อมูล? + + ```python + # First create a new dataframe based on the old one, removing the uneeded columns + hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1) + + # Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found + hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count') + + # Get rid of all the duplicated rows + hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"]) + display(hotel_freq_df) + ``` + | Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found | + | :----------------------------------------: | :---------------------: | :-----------------: | + | Britannia International Hotel Canary Wharf | 9086 | 4789 | + | Park Plaza Westminster Bridge London | 12158 | 4169 | + | Copthorne Tara Hotel London Kensington | 7105 | 3578 | + | ... | ... | ... | + | Mercure Paris Porte d Orleans | 110 | 10 | + | Hotel Wagner | 135 | 10 | + | Hotel Gallitzinberg | 173 | 8 | + + คุณอาจสังเกตเห็นว่าผลลัพธ์ *ที่นับในชุดข้อมูล* ไม่ตรงกับค่าที่อยู่ใน `Total_Number_of_Reviews` ไม่ชัดเจนว่าค่านี้ในชุดข้อมูลแสดงถึงจำนวนรีวิวทั้งหมดที่โรงแรมมี แต่ไม่ได้ถูกดึงข้อมูลทั้งหมด หรือเป็นการคำนวณอื่น `Total_Number_of_Reviews` ไม่ได้ถูกใช้ในโมเดลเนื่องจากความไม่ชัดเจนนี้ + +5. แม้ว่าจะมีคอลัมน์ `Average_Score` สำหรับแต่ละโรงแรมในชุดข้อมูล คุณยังสามารถคำนวณคะแนนเฉลี่ย (โดยการหาค่าเฉลี่ยของคะแนนผู้รีวิวทั้งหมดในชุดข้อมูลสำหรับแต่ละโรงแรม) เพิ่มคอลัมน์ใหม่ใน dataframe ของคุณโดยใช้ชื่อคอลัมน์ `Calc_Average_Score` ที่มีค่าเฉลี่ยที่คำนวณได้ พิมพ์คอลัมน์ `Hotel_Name`, `Average_Score` และ `Calc_Average_Score` + + ```python + # define a function that takes a row and performs some calculation with it + def get_difference_review_avg(row): + return row["Average_Score"] - row["Calc_Average_Score"] + + # 'mean' is mathematical word for 'average' + df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + + # Add a new column with the difference between the two average scores + df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1) + + # Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel) + review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"]) + + # Sort the dataframe to find the lowest and highest average score difference + review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"]) + + display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]]) + ``` + + คุณอาจสงสัยเกี่ยวกับค่าของ `Average_Score` และเหตุใดจึงแตกต่างจากคะแนนเฉลี่ยที่คำนวณได้ในบางครั้ง เนื่องจากเราไม่สามารถทราบได้ว่าทำไมบางค่าจึงตรงกัน แต่บางค่ามีความแตกต่าง ในกรณีนี้ปลอดภัยที่สุดที่จะใช้คะแนนรีวิวที่เรามีเพื่อคำนวณค่าเฉลี่ยด้วยตัวเอง อย่างไรก็ตาม ความแตกต่างมักจะเล็กน้อย นี่คือโรงแรมที่มีความแตกต่างมากที่สุดระหว่างค่าเฉลี่ยในชุดข้อมูลและค่าเฉลี่ยที่คำนวณได้: + + | Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Name | + | :----------------------: | :-----------: | :----------------: | ------------------------------------------: | + | -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria | + | -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery | + | -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans | + | -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel | + | -0.5 | 7.0 | 7.5 | Hotel Royal Elys es | + | ... | ... | ... | ... | + | 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre | + | 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur | + | 0.9 | 6.8 | 5.9 | Villa Eugenie | + | 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux | + | 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar | + + มีเพียงโรงแรมเดียวที่มีความแตกต่างของคะแนนมากกว่า 1 หมายความว่าเราสามารถมองข้ามความแตกต่างนี้และใช้คะแนนเฉลี่ยที่คำนวณได้ + +6. คำนวณและพิมพ์จำนวนแถวที่มีค่าคอลัมน์ `Negative_Review` เป็น "No Negative" + +7. คำนวณและพิมพ์จำนวนแถวที่มีค่าคอลัมน์ `Positive_Review` เป็น "No Positive" + +8. คำนวณและพิมพ์จำนวนแถวที่มีค่าคอลัมน์ `Positive_Review` เป็น "No Positive" **และ** `Negative_Review` เป็น "No Negative" + + ```python + # with lambdas: + start = time.time() + no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1) + print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index))) + + no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index))) + + both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1) + print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index))) + end = time.time() + print("Lambdas took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Lambdas took 9.64 seconds + ``` + +## อีกวิธีหนึ่ง + +อีกวิธีหนึ่งในการนับรายการโดยไม่ใช้ Lambda และใช้ sum เพื่อคำนวณจำนวนแถว: + + ```python + # without lambdas (using a mixture of notations to show you can use both) + start = time.time() + no_negative_reviews = sum(df.Negative_Review == "No Negative") + print("Number of No Negative reviews: " + str(no_negative_reviews)) + + no_positive_reviews = sum(df["Positive_Review"] == "No Positive") + print("Number of No Positive reviews: " + str(no_positive_reviews)) + + both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive")) + print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews)) + + end = time.time() + print("Sum took " + str(round(end - start, 2)) + " seconds") + + Number of No Negative reviews: 127890 + Number of No Positive reviews: 35946 + Number of both No Negative and No Positive reviews: 127 + Sum took 0.19 seconds + ``` + + คุณอาจสังเกตเห็นว่ามี 127 แถวที่มีค่า "No Negative" และ "No Positive" สำหรับคอลัมน์ `Negative_Review` และ `Positive_Review` ตามลำดับ นั่นหมายความว่าผู้รีวิวให้คะแนนตัวเลขแก่โรงแรม แต่ปฏิเสธที่จะเขียนรีวิวเชิงบวกหรือเชิงลบ โชคดีที่นี่เป็นจำนวนแถวที่น้อยมาก (127 จาก 515738 หรือ 0.02%) ดังนั้นจึงไม่น่าจะทำให้โมเดลหรือผลลัพธ์ของเราผิดเพี้ยนไปในทิศทางใด แต่คุณอาจไม่คาดคิดว่าชุดข้อมูลรีวิวจะมีแถวที่ไม่มีรีวิวเลย ดังนั้นจึงควรสำรวจข้อมูลเพื่อค้นหาแถวแบบนี้ + +ตอนนี้คุณได้สำรวจชุดข้อมูลแล้ว ในบทเรียนถัดไปคุณจะกรองข้อมูลและเพิ่มการวิเคราะห์ความรู้สึก + +--- +## 🚀ความท้าทาย + +บทเรียนนี้แสดงให้เห็นว่า เช่นเดียวกับที่เราเห็นในบทเรียนก่อนหน้า การทำความเข้าใจข้อมูลและข้อบกพร่องของมันมีความสำคัญอย่างยิ่งก่อนที่จะดำเนินการใดๆ กับมัน ข้อมูลที่เป็นข้อความโดยเฉพาะต้องได้รับการตรวจสอบอย่างละเอียด ลองสำรวจชุดข้อมูลที่มีข้อความจำนวนมากและดูว่าคุณสามารถค้นพบพื้นที่ที่อาจแนะนำอคติหรือความรู้สึกที่ผิดเพี้ยนในโมเดลได้หรือไม่ + +## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +ลอง [เส้นทางการเรียนรู้เกี่ยวกับ NLP นี้](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) เพื่อค้นหาเครื่องมือที่คุณสามารถลองใช้เมื่อสร้างโมเดลที่เน้นข้อความและเสียงพูด + +## การบ้าน + +[NLTK](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/4-Hotel-Reviews-1/assignment.md b/translations/th/6-NLP/4-Hotel-Reviews-1/assignment.md new file mode 100644 index 000000000..c3cbd384a --- /dev/null +++ b/translations/th/6-NLP/4-Hotel-Reviews-1/assignment.md @@ -0,0 +1,19 @@ + +# NLTK + +## คำแนะนำ + +NLTK เป็นไลบรารีที่มีชื่อเสียงสำหรับการใช้งานในภาษาศาสตร์เชิงคำนวณและการประมวลผลภาษาธรรมชาติ ใช้โอกาสนี้ในการอ่าน '[NLTK book](https://www.nltk.org/book/)' และลองทำแบบฝึกหัดต่าง ๆ ในการบ้านที่ไม่มีการให้คะแนนนี้ คุณจะได้รู้จักไลบรารีนี้อย่างลึกซึ้งมากขึ้น + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md b/translations/th/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md new file mode 100644 index 000000000..e682e3b54 --- /dev/null +++ b/translations/th/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/4-Hotel-Reviews-1/solution/R/README.md b/translations/th/6-NLP/4-Hotel-Reviews-1/solution/R/README.md new file mode 100644 index 000000000..62d34811b --- /dev/null +++ b/translations/th/6-NLP/4-Hotel-Reviews-1/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/5-Hotel-Reviews-2/README.md b/translations/th/6-NLP/5-Hotel-Reviews-2/README.md new file mode 100644 index 000000000..1b9a2f3f4 --- /dev/null +++ b/translations/th/6-NLP/5-Hotel-Reviews-2/README.md @@ -0,0 +1,389 @@ + +# การวิเคราะห์ความรู้สึกด้วยรีวิวโรงแรม + +หลังจากที่คุณได้สำรวจชุดข้อมูลอย่างละเอียดแล้ว ถึงเวลาในการกรองคอลัมน์และใช้เทคนิค NLP กับชุดข้อมูลเพื่อค้นหาแนวคิดใหม่เกี่ยวกับโรงแรม + +## [แบบทดสอบก่อนการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +### การกรองข้อมูลและการดำเนินการวิเคราะห์ความรู้สึก + +คุณอาจสังเกตเห็นว่าชุดข้อมูลมีปัญหาบางอย่าง เช่น คอลัมน์บางคอลัมน์มีข้อมูลที่ไม่มีประโยชน์ บางคอลัมน์ดูเหมือนจะไม่ถูกต้อง หรือหากถูกต้อง ก็ไม่ชัดเจนว่าคำนวณมาอย่างไร และคำตอบไม่สามารถตรวจสอบได้ด้วยการคำนวณของคุณเอง + +## แบบฝึกหัด: การประมวลผลข้อมูลเพิ่มเติมเล็กน้อย + +ทำความสะอาดข้อมูลเพิ่มเติมอีกเล็กน้อย เพิ่มคอลัมน์ที่มีประโยชน์ในภายหลัง เปลี่ยนค่าของคอลัมน์อื่น และลบคอลัมน์บางส่วนออกไป + +1. การประมวลผลคอลัมน์เบื้องต้น + + 1. ลบ `lat` และ `lng` + + 2. แทนที่ค่าของ `Hotel_Address` ด้วยค่าต่อไปนี้ (หากที่อยู่มีชื่อเมืองและประเทศเดียวกัน ให้เปลี่ยนเป็นแค่ชื่อเมืองและประเทศ) + + เมืองและประเทศในชุดข้อมูลมีดังนี้: + + Amsterdam, Netherlands + + Barcelona, Spain + + London, United Kingdom + + Milan, Italy + + Paris, France + + Vienna, Austria + + ```python + def replace_address(row): + if "Netherlands" in row["Hotel_Address"]: + return "Amsterdam, Netherlands" + elif "Barcelona" in row["Hotel_Address"]: + return "Barcelona, Spain" + elif "United Kingdom" in row["Hotel_Address"]: + return "London, United Kingdom" + elif "Milan" in row["Hotel_Address"]: + return "Milan, Italy" + elif "France" in row["Hotel_Address"]: + return "Paris, France" + elif "Vienna" in row["Hotel_Address"]: + return "Vienna, Austria" + + # Replace all the addresses with a shortened, more useful form + df["Hotel_Address"] = df.apply(replace_address, axis = 1) + # The sum of the value_counts() should add up to the total number of reviews + print(df["Hotel_Address"].value_counts()) + ``` + + ตอนนี้คุณสามารถเรียกดูข้อมูลระดับประเทศได้: + + ```python + display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"})) + ``` + + | Hotel_Address | Hotel_Name | + | :--------------------- | :--------: | + | Amsterdam, Netherlands | 105 | + | Barcelona, Spain | 211 | + | London, United Kingdom | 400 | + | Milan, Italy | 162 | + | Paris, France | 458 | + | Vienna, Austria | 158 | + +2. การประมวลผลคอลัมน์รีวิวเมตาของโรงแรม + + 1. ลบ `Additional_Number_of_Scoring` + + 1. แทนที่ `Total_Number_of_Reviews` ด้วยจำนวนรีวิวทั้งหมดของโรงแรมที่มีอยู่จริงในชุดข้อมูล + + 1. แทนที่ `Average_Score` ด้วยคะแนนที่คำนวณขึ้นเอง + + ```python + # Drop `Additional_Number_of_Scoring` + df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True) + # Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values + df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count') + df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1) + ``` + +3. การประมวลผลคอลัมน์รีวิว + + 1. ลบ `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` และ `days_since_review` + + 2. เก็บ `Reviewer_Score`, `Negative_Review` และ `Positive_Review` ไว้ตามเดิม + + 3. เก็บ `Tags` ไว้ชั่วคราว + + - เราจะทำการกรองเพิ่มเติมในส่วนของแท็กในส่วนถัดไป และจากนั้นจะลบแท็กออก + +4. การประมวลผลคอลัมน์ผู้รีวิว + + 1. ลบ `Total_Number_of_Reviews_Reviewer_Has_Given` + + 2. เก็บ `Reviewer_Nationality` ไว้ + +### คอลัมน์แท็ก + +คอลัมน์ `Tag` มีปัญหาเนื่องจากเป็นรายการ (ในรูปแบบข้อความ) ที่ถูกเก็บไว้ในคอลัมน์ น่าเสียดายที่ลำดับและจำนวนส่วนย่อยในคอลัมน์นี้ไม่เหมือนกันเสมอไป การระบุวลีที่น่าสนใจอาจเป็นเรื่องยากสำหรับมนุษย์ เนื่องจากมีแถว 515,000 แถว และโรงแรม 1427 แห่ง และแต่ละแห่งมีตัวเลือกที่แตกต่างกันเล็กน้อยที่ผู้รีวิวสามารถเลือกได้ นี่คือจุดที่ NLP มีประโยชน์ คุณสามารถสแกนข้อความและค้นหาวลีที่พบบ่อยที่สุดและนับจำนวนได้ + +น่าเสียดายที่เราไม่ได้สนใจคำเดี่ยว แต่สนใจวลีที่มีหลายคำ (เช่น *Business trip*) การรันอัลกอริธึมการแจกแจงความถี่ของวลีหลายคำในข้อมูลจำนวนมาก (6762646 คำ) อาจใช้เวลานานมาก แต่หากไม่ดูข้อมูล อาจดูเหมือนว่าเป็นสิ่งจำเป็น นี่คือจุดที่การวิเคราะห์ข้อมูลเชิงสำรวจมีประโยชน์ เพราะคุณได้เห็นตัวอย่างของแท็ก เช่น `[' Business trip ', ' Solo traveler ', ' Single Room ', ' Stayed 5 nights ', ' Submitted from a mobile device ']` คุณสามารถเริ่มถามได้ว่ามันเป็นไปได้ที่จะลดการประมวลผลที่คุณต้องทำหรือไม่ โชคดีที่เป็นไปได้ แต่ก่อนอื่นคุณต้องทำตามขั้นตอนบางอย่างเพื่อระบุแท็กที่น่าสนใจ + +### การกรองแท็ก + +จำไว้ว่าเป้าหมายของชุดข้อมูลคือการเพิ่มความรู้สึกและคอลัมน์ที่จะช่วยให้คุณเลือกโรงแรมที่ดีที่สุด (สำหรับตัวคุณเองหรืออาจเป็นงานที่ลูกค้าขอให้คุณสร้างบอทแนะนำโรงแรม) คุณต้องถามตัวเองว่าแท็กมีประโยชน์หรือไม่ในชุดข้อมูลสุดท้าย นี่คือการตีความหนึ่ง (หากคุณต้องการชุดข้อมูลด้วยเหตุผลอื่น แท็กที่เลือกอาจแตกต่างออกไป): + +1. ประเภทของการเดินทางมีความเกี่ยวข้อง และควรเก็บไว้ +2. ประเภทของกลุ่มผู้เข้าพักมีความสำคัญ และควรเก็บไว้ +3. ประเภทของห้อง สวีท หรือสตูดิโอที่ผู้เข้าพักพักอยู่ไม่มีความเกี่ยวข้อง (โรงแรมทั้งหมดมีห้องพื้นฐานเหมือนกัน) +4. อุปกรณ์ที่ใช้ส่งรีวิวไม่มีความเกี่ยวข้อง +5. จำนวนคืนที่ผู้รีวิวพัก *อาจ* มีความเกี่ยวข้องหากคุณเชื่อมโยงการพักนานขึ้นกับการชอบโรงแรมมากขึ้น แต่ก็เป็นการคาดเดา และอาจไม่มีความเกี่ยวข้อง + +สรุปคือ **เก็บแท็ก 2 ประเภทและลบประเภทอื่นออก** + +ก่อนอื่น คุณไม่ต้องการนับแท็กจนกว่าพวกมันจะอยู่ในรูปแบบที่ดีกว่า ซึ่งหมายถึงการลบวงเล็บเหลี่ยมและเครื่องหมายคำพูด คุณสามารถทำได้หลายวิธี แต่คุณต้องการวิธีที่เร็วที่สุดเนื่องจากอาจใช้เวลานานในการประมวลผลข้อมูลจำนวนมาก โชคดีที่ pandas มีวิธีง่าย ๆ ในการทำแต่ละขั้นตอนเหล่านี้ + +```Python +# Remove opening and closing brackets +df.Tags = df.Tags.str.strip("[']") +# remove all quotes too +df.Tags = df.Tags.str.replace(" ', '", ",", regex = False) +``` + +แต่ละแท็กจะกลายเป็นบางอย่างเช่น: `Business trip, Solo traveler, Single Room, Stayed 5 nights, Submitted from a mobile device`. + +จากนั้นเราพบปัญหา บางรีวิวหรือแถวมี 5 คอลัมน์ บางแถวมี 3 คอลัมน์ บางแถวมี 6 คอลัมน์ นี่เป็นผลมาจากวิธีการสร้างชุดข้อมูล และแก้ไขได้ยาก คุณต้องการนับความถี่ของแต่ละวลี แต่พวกมันอยู่ในลำดับที่แตกต่างกันในแต่ละรีวิว ดังนั้นการนับอาจผิดพลาด และโรงแรมอาจไม่ได้รับแท็กที่สมควรได้รับ + +แทนที่จะใช้ลำดับที่แตกต่างกันให้เป็นประโยชน์ เพราะแต่ละแท็กมีหลายคำแต่ก็แยกกันด้วยเครื่องหมายจุลภาค! วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการสร้างคอลัมน์ชั่วคราว 6 คอลัมน์ โดยแต่ละแท็กจะถูกแทรกลงในคอลัมน์ที่ตรงกับลำดับของมัน จากนั้นคุณสามารถรวมคอลัมน์ทั้ง 6 เข้าด้วยกันเป็นคอลัมน์ใหญ่หนึ่งคอลัมน์และรันเมธอด `value_counts()` บนคอลัมน์ที่ได้ ผลลัพธ์ที่พิมพ์ออกมาจะแสดงว่ามีแท็กที่ไม่ซ้ำกัน 2428 รายการ นี่คือตัวอย่างเล็ก ๆ: + +| Tag | Count | +| ------------------------------ | ------ | +| Leisure trip | 417778 | +| Submitted from a mobile device | 307640 | +| Couple | 252294 | +| Stayed 1 night | 193645 | +| Stayed 2 nights | 133937 | +| Solo traveler | 108545 | +| Stayed 3 nights | 95821 | +| Business trip | 82939 | +| Group | 65392 | +| Family with young children | 61015 | +| Stayed 4 nights | 47817 | +| Double Room | 35207 | +| Standard Double Room | 32248 | +| Superior Double Room | 31393 | +| Family with older children | 26349 | +| Deluxe Double Room | 24823 | +| Double or Twin Room | 22393 | +| Stayed 5 nights | 20845 | +| Standard Double or Twin Room | 17483 | +| Classic Double Room | 16989 | +| Superior Double or Twin Room | 13570 | +| 2 rooms | 12393 | + +แท็กทั่วไปบางอย่าง เช่น `Submitted from a mobile device` ไม่มีประโยชน์สำหรับเรา ดังนั้นอาจเป็นความคิดที่ดีที่จะลบออกก่อนนับการเกิดของวลี แต่เนื่องจากเป็นการดำเนินการที่รวดเร็ว คุณสามารถปล่อยไว้และเพิกเฉยได้ + +### การลบแท็กที่เกี่ยวกับระยะเวลาการเข้าพัก + +การลบแท็กเหล่านี้เป็นขั้นตอนแรก ซึ่งช่วยลดจำนวนแท็กที่ต้องพิจารณาลงเล็กน้อย โปรดทราบว่าคุณไม่ได้ลบแท็กเหล่านี้ออกจากชุดข้อมูล เพียงแค่เลือกที่จะไม่พิจารณาเป็นค่าที่จะนับ/เก็บไว้ในชุดข้อมูลรีวิว + +| Length of stay | Count | +| ---------------- | ------ | +| Stayed 1 night | 193645 | +| Stayed 2 nights | 133937 | +| Stayed 3 nights | 95821 | +| Stayed 4 nights | 47817 | +| Stayed 5 nights | 20845 | +| Stayed 6 nights | 9776 | +| Stayed 7 nights | 7399 | +| Stayed 8 nights | 2502 | +| Stayed 9 nights | 1293 | +| ... | ... | + +มีความหลากหลายของห้อง สวีท สตูดิโอ อพาร์ตเมนต์ และอื่น ๆ มากมาย ทั้งหมดนี้มีความหมายคล้ายกันและไม่มีความเกี่ยวข้องกับคุณ ดังนั้นให้ลบออกจากการพิจารณา + +| Type of room | Count | +| ----------------------------- | ----- | +| Double Room | 35207 | +| Standard Double Room | 32248 | +| Superior Double Room | 31393 | +| Deluxe Double Room | 24823 | +| Double or Twin Room | 22393 | +| Standard Double or Twin Room | 17483 | +| Classic Double Room | 16989 | +| Superior Double or Twin Room | 13570 | + +สุดท้าย และนี่เป็นเรื่องน่ายินดี (เพราะไม่ต้องใช้การประมวลผลมากนัก) คุณจะเหลือแท็กที่ *มีประโยชน์* ดังนี้: + +| Tag | Count | +| --------------------------------------------- | ------ | +| Leisure trip | 417778 | +| Couple | 252294 | +| Solo traveler | 108545 | +| Business trip | 82939 | +| Group (combined with Travellers with friends) | 67535 | +| Family with young children | 61015 | +| Family with older children | 26349 | +| With a pet | 1405 | + +คุณอาจโต้แย้งว่า `Travellers with friends` เหมือนกับ `Group` มากหรือน้อย และนั่นจะเป็นการรวมทั้งสองเข้าด้วยกันตามที่แสดงไว้ด้านบน โค้ดสำหรับการระบุแท็กที่ถูกต้องอยู่ใน [Tags notebook](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) + +ขั้นตอนสุดท้ายคือการสร้างคอลัมน์ใหม่สำหรับแต่ละแท็กเหล่านี้ จากนั้นสำหรับทุกแถวรีวิว หากคอลัมน์ `Tag` ตรงกับหนึ่งในคอลัมน์ใหม่ ให้เพิ่มค่า 1 หากไม่ตรง ให้เพิ่มค่า 0 ผลลัพธ์สุดท้ายจะเป็นจำนวนผู้รีวิวที่เลือกโรงแรมนี้ (ในภาพรวม) สำหรับการเดินทางเพื่อธุรกิจหรือพักผ่อน หรือเพื่อพาสัตว์เลี้ยงมาด้วย และนี่เป็นข้อมูลที่มีประโยชน์เมื่อแนะนำโรงแรม + +```python +# Process the Tags into new columns +# The file Hotel_Reviews_Tags.py, identifies the most important tags +# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends, +# Family with young children, Family with older children, With a pet +df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0) +df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0) +df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0) +df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0) +df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0) +df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0) +df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0) +df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0) + +``` + +### บันทึกไฟล์ของคุณ + +สุดท้าย บันทึกชุดข้อมูลในรูปแบบปัจจุบันด้วยชื่อใหม่ + +```python +df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True) + +# Saving new data file with calculated columns +print("Saving results to Hotel_Reviews_Filtered.csv") +df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False) +``` + +## การดำเนินการวิเคราะห์ความรู้สึก + +ในส่วนสุดท้ายนี้ คุณจะใช้การวิเคราะห์ความรู้สึกกับคอลัมน์รีวิวและบันทึกผลลัพธ์ในชุดข้อมูล + +## แบบฝึกหัด: โหลดและบันทึกข้อมูลที่กรองแล้ว + +โปรดทราบว่าตอนนี้คุณกำลังโหลดชุดข้อมูลที่กรองแล้วซึ่งถูกบันทึกไว้ในส่วนก่อนหน้า **ไม่ใช่** ชุดข้อมูลต้นฉบับ + +```python +import time +import pandas as pd +import nltk as nltk +from nltk.corpus import stopwords +from nltk.sentiment.vader import SentimentIntensityAnalyzer +nltk.download('vader_lexicon') + +# Load the filtered hotel reviews from CSV +df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv') + +# You code will be added here + + +# Finally remember to save the hotel reviews with new NLP data added +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False) +``` + +### การลบคำหยุด + +หากคุณรันการวิเคราะห์ความรู้สึกในคอลัมน์รีวิวเชิงลบและเชิงบวก อาจใช้เวลานาน ทดสอบบนแล็ปท็อปที่มี CPU เร็ว ใช้เวลา 12 - 14 นาที ขึ้นอยู่กับไลบรารีการวิเคราะห์ความรู้สึกที่ใช้ นั่นเป็นเวลาที่ค่อนข้างนาน ดังนั้นจึงควรตรวจสอบว่ามีวิธีเร่งความเร็วหรือไม่ + +การลบคำหยุด หรือคำภาษาอังกฤษทั่วไปที่ไม่เปลี่ยนแปลงความรู้สึกของประโยค เป็นขั้นตอนแรก โดยการลบคำเหล่านี้ การวิเคราะห์ความรู้สึกควรทำงานเร็วขึ้น แต่ไม่ลดความแม่นยำ (เนื่องจากคำหยุดไม่ส่งผลต่อความรู้สึก แต่ทำให้การวิเคราะห์ช้าลง) + +รีวิวเชิงลบที่ยาวที่สุดมี 395 คำ แต่หลังจากลบคำหยุดแล้ว เหลือ 195 คำ + +การลบคำหยุดเป็นการดำเนินการที่รวดเร็ว การลบคำหยุดจาก 2 คอลัมน์รีวิวใน 515,000 แถวใช้เวลา 3.3 วินาทีบนอุปกรณ์ทดสอบ อาจใช้เวลามากหรือน้อยกว่านี้เล็กน้อยขึ้นอยู่กับความเร็ว CPU ของอุปกรณ์ RAM ว่ามี SSD หรือไม่ และปัจจัยอื่น ๆ ความสั้นของการดำเนินการนี้หมายความว่าหากมันช่วยปรับปรุงเวลาการวิเคราะห์ความรู้สึก ก็ถือว่าคุ้มค่าที่จะทำ + +```python +from nltk.corpus import stopwords + +# Load the hotel reviews from CSV +df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv") + +# Remove stop words - can be slow for a lot of text! +# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches +# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends +start = time.time() +cache = set(stopwords.words("english")) +def remove_stopwords(review): + text = " ".join([word for word in review.split() if word not in cache]) + return text + +# Remove the stop words from both columns +df.Negative_Review = df.Negative_Review.apply(remove_stopwords) +df.Positive_Review = df.Positive_Review.apply(remove_stopwords) +``` + +### การดำเนินการวิเคราะห์ความรู้สึก + +ตอนนี้คุณควรคำนวณการวิเคราะห์ความรู้สึกสำหรับทั้งคอลัมน์รีวิวเชิงลบและเชิงบวก และเก็บผลลัพธ์ไว้ในคอลัมน์ใหม่ 2 คอลัมน์ การทดสอบความรู้สึกจะเปรียบเทียบกับคะแนนของผู้รีวิวสำหรับรีวิวเดียวกัน ตัวอย่างเช่น หากการวิเคราะห์ความรู้สึกคิดว่าความรู้สึกของรีวิวเชิงลบมีค่า 1 (ความรู้สึกเชิงบวกอย่างมาก) และความรู้สึกของรีวิวเชิงบวกมีค่า 1 แต่ผู้รีวิวให้คะแนนโรงแรมต่ำที่สุดเท่าที่จะเป็นไปได้ นั่นหมายความว่าข้อความรีวิวไม่ตรงกับคะแนน หรือเครื่องมือวิเคราะห์ความรู้สึกไม่สามารถรับรู้ความรู้สึกได้อย่างถูกต้อง คุณควรคาดหวังว่าคะแนนความรู้สึกบางส่วนจะผิดพลาดอย่างสิ้นเชิง และมักจะสามารถอธิบายได้ เช่น รีวิวอาจมีการประชดประชันอย่างมาก "แน่นอนว่าฉันชอบนอนในห้องที่ไม่มีเครื่องทำความร้อน" และเครื่องมือวิเคราะห์ความรู้สึกคิดว่านั่นเป็นความรู้สึกเชิงบวก แม้ว่ามนุษย์ที่อ่านจะรู้ว่ามันเป็นการประชดประชัน +NLTK มีตัววิเคราะห์ความรู้สึกหลายแบบให้เลือกใช้ และคุณสามารถเปลี่ยนไปใช้ตัวอื่นเพื่อดูว่าการวิเคราะห์ความรู้สึกนั้นแม่นยำมากขึ้นหรือน้อยลง ตัววิเคราะห์ความรู้สึก VADER ถูกนำมาใช้ในที่นี้ + +> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014. + +```python +from nltk.sentiment.vader import SentimentIntensityAnalyzer + +# Create the vader sentiment analyser (there are others in NLTK you can try too) +vader_sentiment = SentimentIntensityAnalyzer() +# Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014. + +# There are 3 possibilities of input for a review: +# It could be "No Negative", in which case, return 0 +# It could be "No Positive", in which case, return 0 +# It could be a review, in which case calculate the sentiment +def calc_sentiment(review): + if review == "No Negative" or review == "No Positive": + return 0 + return vader_sentiment.polarity_scores(review)["compound"] +``` + +ในโปรแกรมของคุณ เมื่อคุณพร้อมที่จะคำนวณความรู้สึก คุณสามารถนำไปใช้กับแต่ละรีวิวได้ดังนี้: + +```python +# Add a negative sentiment and positive sentiment column +print("Calculating sentiment columns for both positive and negative reviews") +start = time.time() +df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment) +df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment) +end = time.time() +print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds") +``` + +กระบวนการนี้ใช้เวลาประมาณ 120 วินาทีบนคอมพิวเตอร์ของฉัน แต่เวลาที่ใช้จะขึ้นอยู่กับแต่ละเครื่อง หากคุณต้องการพิมพ์ผลลัพธ์ออกมาและดูว่าความรู้สึกตรงกับรีวิวหรือไม่: + +```python +df = df.sort_values(by=["Negative_Sentiment"], ascending=True) +print(df[["Negative_Review", "Negative_Sentiment"]]) +df = df.sort_values(by=["Positive_Sentiment"], ascending=True) +print(df[["Positive_Review", "Positive_Sentiment"]]) +``` + +สิ่งสุดท้ายที่ต้องทำกับไฟล์ก่อนนำไปใช้ในความท้าทายคือการบันทึกไฟล์! คุณควรพิจารณาจัดเรียงคอลัมน์ใหม่ทั้งหมดเพื่อให้ง่ายต่อการใช้งาน (สำหรับมนุษย์ มันเป็นการเปลี่ยนแปลงเชิงความสวยงาม) + +```python +# Reorder the columns (This is cosmetic, but to make it easier to explore the data later) +df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1) + +print("Saving results to Hotel_Reviews_NLP.csv") +df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False) +``` + +คุณควรเรียกใช้โค้ดทั้งหมดใน [notebook การวิเคราะห์](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (หลังจากที่คุณเรียกใช้ [notebook การกรอง](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) เพื่อสร้างไฟล์ Hotel_Reviews_Filtered.csv) + +เพื่อสรุป ขั้นตอนคือ: + +1. ไฟล์ชุดข้อมูลต้นฉบับ **Hotel_Reviews.csv** ถูกสำรวจในบทเรียนก่อนหน้าด้วย [notebook การสำรวจ](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb) +2. Hotel_Reviews.csv ถูกกรองโดย [notebook การกรอง](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) และได้ผลลัพธ์เป็น **Hotel_Reviews_Filtered.csv** +3. Hotel_Reviews_Filtered.csv ถูกประมวลผลโดย [notebook การวิเคราะห์ความรู้สึก](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) และได้ผลลัพธ์เป็น **Hotel_Reviews_NLP.csv** +4. ใช้ Hotel_Reviews_NLP.csv ในความท้าทาย NLP ด้านล่าง + +### สรุป + +เมื่อคุณเริ่มต้น คุณมีชุดข้อมูลที่มีคอลัมน์และข้อมูล แต่ไม่ใช่ทั้งหมดที่สามารถตรวจสอบหรือใช้งานได้ คุณได้สำรวจข้อมูล กรองสิ่งที่ไม่จำเป็น เปลี่ยนแท็กให้เป็นสิ่งที่มีประโยชน์ คำนวณค่าเฉลี่ยของคุณเอง เพิ่มคอลัมน์ความรู้สึก และหวังว่าคุณจะได้เรียนรู้สิ่งที่น่าสนใจเกี่ยวกับการประมวลผลข้อความธรรมชาติ + +## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +## ความท้าทาย + +ตอนนี้คุณได้วิเคราะห์ชุดข้อมูลเพื่อความรู้สึกแล้ว ลองใช้กลยุทธ์ที่คุณได้เรียนรู้ในหลักสูตรนี้ (เช่น การจัดกลุ่ม) เพื่อค้นหารูปแบบเกี่ยวกับความรู้สึก + +## ทบทวนและศึกษาด้วยตนเอง + +ลองเรียน [โมดูลนี้](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) เพื่อเรียนรู้เพิ่มเติมและใช้เครื่องมือที่แตกต่างกันในการสำรวจความรู้สึกในข้อความ + +## งานที่ได้รับมอบหมาย + +[ลองใช้ชุดข้อมูลอื่น](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/5-Hotel-Reviews-2/assignment.md b/translations/th/6-NLP/5-Hotel-Reviews-2/assignment.md new file mode 100644 index 000000000..163946b98 --- /dev/null +++ b/translations/th/6-NLP/5-Hotel-Reviews-2/assignment.md @@ -0,0 +1,25 @@ + +# ลองใช้ชุดข้อมูลอื่น + +## คำแนะนำ + +ตอนนี้คุณได้เรียนรู้เกี่ยวกับการใช้ NLTK เพื่อวิเคราะห์อารมณ์ในข้อความแล้ว ลองใช้ชุดข้อมูลอื่นดู คุณอาจต้องทำการประมวลผลข้อมูลบางส่วน ดังนั้นให้สร้างโน้ตบุ๊กและบันทึกกระบวนการคิดของคุณ คุณค้นพบอะไรบ้าง? + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | พอใช้ | ต้องปรับปรุง | +| ---------- | ------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | ---------------------- | +| | มีโน้ตบุ๊กและชุดข้อมูลที่สมบูรณ์ พร้อมเซลล์ที่อธิบายกระบวนการวิเคราะห์อารมณ์ไว้อย่างชัดเจน | โน้ตบุ๊กขาดคำอธิบายที่ดี | โน้ตบุ๊กมีข้อบกพร่อง | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md b/translations/th/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md new file mode 100644 index 000000000..717372a0b --- /dev/null +++ b/translations/th/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์มืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/5-Hotel-Reviews-2/solution/R/README.md b/translations/th/6-NLP/5-Hotel-Reviews-2/solution/R/README.md new file mode 100644 index 000000000..70347bab2 --- /dev/null +++ b/translations/th/6-NLP/5-Hotel-Reviews-2/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/README.md b/translations/th/6-NLP/README.md new file mode 100644 index 000000000..c966dd375 --- /dev/null +++ b/translations/th/6-NLP/README.md @@ -0,0 +1,38 @@ + +# เริ่มต้นกับการประมวลผลภาษาธรรมชาติ + +การประมวลผลภาษาธรรมชาติ (NLP) คือความสามารถของโปรแกรมคอมพิวเตอร์ในการเข้าใจภาษามนุษย์ทั้งที่พูดและเขียน ซึ่งเรียกว่าภาษาธรรมชาติ เป็นส่วนหนึ่งของปัญญาประดิษฐ์ (AI) NLP มีมานานกว่า 50 ปีและมีรากฐานมาจากสาขาภาษาศาสตร์ ทั้งหมดนี้มุ่งเน้นไปที่การช่วยให้เครื่องจักรเข้าใจและประมวลผลภาษามนุษย์ ซึ่งสามารถนำไปใช้ทำงานต่าง ๆ เช่น การตรวจสอบการสะกดคำหรือการแปลภาษาโดยเครื่องจักร มีการใช้งานในโลกจริงหลากหลายในหลายสาขา เช่น การวิจัยทางการแพทย์ เครื่องมือค้นหา และการวิเคราะห์ข้อมูลธุรกิจ + +## หัวข้อภูมิภาค: ภาษาและวรรณกรรมยุโรป และโรงแรมโรแมนติกในยุโรป ❤️ + +ในส่วนนี้ของหลักสูตร คุณจะได้เรียนรู้หนึ่งในวิธีการใช้งานที่แพร่หลายที่สุดของการเรียนรู้ของเครื่อง: การประมวลผลภาษาธรรมชาติ (NLP) ซึ่งมีต้นกำเนิดมาจากภาษาศาสตร์เชิงคำนวณ หมวดหมู่นี้ของปัญญาประดิษฐ์เป็นสะพานเชื่อมระหว่างมนุษย์และเครื่องจักรผ่านการสื่อสารด้วยเสียงหรือข้อความ + +ในบทเรียนเหล่านี้ เราจะเรียนรู้พื้นฐานของ NLP โดยการสร้างบอทสนทนาเล็ก ๆ เพื่อเรียนรู้ว่าการเรียนรู้ของเครื่องช่วยทำให้การสนทนาเหล่านี้ฉลาดขึ้นเรื่อย ๆ ได้อย่างไร คุณจะย้อนเวลากลับไปพูดคุยกับเอลิซาเบธ เบนเน็ตต์ และมิสเตอร์ดาร์ซีจากนวนิยายคลาสสิกของเจน ออสเตน **Pride and Prejudice** ที่ตีพิมพ์ในปี 1813 จากนั้นคุณจะเพิ่มพูนความรู้โดยการเรียนรู้เกี่ยวกับการวิเคราะห์ความรู้สึกผ่านรีวิวโรงแรมในยุโรป + +![หนังสือ Pride and Prejudice และชา](../../../6-NLP/images/p&p.jpg) +> ภาพถ่ายโดย Elaine Howlin บน Unsplash + +## บทเรียน + +1. [แนะนำการประมวลผลภาษาธรรมชาติ](1-Introduction-to-NLP/README.md) +2. [งานและเทคนิคทั่วไปใน NLP](2-Tasks/README.md) +3. [การแปลและการวิเคราะห์ความรู้สึกด้วยการเรียนรู้ของเครื่อง](3-Translation-Sentiment/README.md) +4. [การเตรียมข้อมูลของคุณ](4-Hotel-Reviews-1/README.md) +5. [NLTK สำหรับการวิเคราะห์ความรู้สึก](5-Hotel-Reviews-2/README.md) + +## เครดิต + +บทเรียนการประมวลผลภาษาธรรมชาติเหล่านี้เขียนขึ้นด้วย ☕ โดย [Stephen Howell](https://twitter.com/Howell_MSFT) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/6-NLP/data/README.md b/translations/th/6-NLP/data/README.md new file mode 100644 index 000000000..cc6a0f9ff --- /dev/null +++ b/translations/th/6-NLP/data/README.md @@ -0,0 +1,15 @@ + +ดาวน์โหลดข้อมูลรีวิวโรงแรมไปยังโฟลเดอร์นี้ + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาที่เป็นต้นฉบับควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/7-TimeSeries/1-Introduction/README.md b/translations/th/7-TimeSeries/1-Introduction/README.md new file mode 100644 index 000000000..bb45c938b --- /dev/null +++ b/translations/th/7-TimeSeries/1-Introduction/README.md @@ -0,0 +1,199 @@ + +# บทนำสู่การพยากรณ์ข้อมูลอนุกรมเวลา + +![สรุปข้อมูลอนุกรมเวลาในรูปแบบสเก็ตโน้ต](../../../../sketchnotes/ml-timeseries.png) + +> สเก็ตโน้ตโดย [Tomomi Imura](https://www.twitter.com/girlie_mac) + +ในบทเรียนนี้และบทเรียนถัดไป คุณจะได้เรียนรู้เกี่ยวกับการพยากรณ์ข้อมูลอนุกรมเวลา ซึ่งเป็นส่วนที่น่าสนใจและมีคุณค่าของเครื่องมือในคลังของนักวิทยาศาสตร์ ML แม้ว่าจะไม่เป็นที่รู้จักเท่าหัวข้ออื่น ๆ การพยากรณ์ข้อมูลอนุกรมเวลาเปรียบเสมือน 'ลูกแก้ววิเศษ': โดยอ้างอิงจากข้อมูลในอดีต เช่น ราคา คุณสามารถคาดการณ์มูลค่าในอนาคตได้ + +[![บทนำสู่การพยากรณ์ข้อมูลอนุกรมเวลา](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "บทนำสู่การพยากรณ์ข้อมูลอนุกรมเวลา") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอเกี่ยวกับการพยากรณ์ข้อมูลอนุกรมเวลา + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +นี่เป็นสาขาที่มีประโยชน์และน่าสนใจซึ่งมีคุณค่าต่อธุรกิจ เนื่องจากสามารถนำไปใช้แก้ปัญหาเกี่ยวกับการตั้งราคา การจัดการสินค้าคงคลัง และปัญหาในห่วงโซ่อุปทาน แม้ว่าจะมีการนำเทคนิคการเรียนรู้เชิงลึกมาใช้เพื่อให้ได้ข้อมูลเชิงลึกมากขึ้นในการพยากรณ์ประสิทธิภาพในอนาคต แต่การพยากรณ์ข้อมูลอนุกรมเวลายังคงเป็นสาขาที่ได้รับอิทธิพลอย่างมากจากเทคนิค ML แบบคลาสสิก + +> หลักสูตรเกี่ยวกับข้อมูลอนุกรมเวลาที่มีประโยชน์จาก Penn State สามารถดูได้ [ที่นี่](https://online.stat.psu.edu/stat510/lesson/1) + +## บทนำ + +สมมติว่าคุณดูแลระบบมิเตอร์จอดรถอัจฉริยะที่ให้ข้อมูลเกี่ยวกับความถี่และระยะเวลาการใช้งานในช่วงเวลาต่าง ๆ + +> จะเป็นอย่างไรถ้าคุณสามารถคาดการณ์มูลค่าในอนาคตของมิเตอร์ตามกฎของอุปสงค์และอุปทาน โดยอ้างอิงจากประสิทธิภาพในอดีต? + +การคาดการณ์ช่วงเวลาที่เหมาะสมในการดำเนินการเพื่อให้บรรลุเป้าหมายเป็นความท้าทายที่สามารถแก้ไขได้ด้วยการพยากรณ์ข้อมูลอนุกรมเวลา แม้ว่าการคิดค่าบริการเพิ่มขึ้นในช่วงเวลาที่มีความต้องการสูงอาจไม่ทำให้ผู้คนพอใจ แต่ก็เป็นวิธีที่แน่นอนในการสร้างรายได้เพื่อทำความสะอาดถนน! + +มาสำรวจประเภทของอัลกอริทึมข้อมูลอนุกรมเวลาและเริ่มต้นสร้างโน้ตบุ๊กเพื่อทำความสะอาดและเตรียมข้อมูลกัน ข้อมูลที่คุณจะวิเคราะห์นำมาจากการแข่งขันการพยากรณ์ GEFCom2014 ซึ่งประกอบด้วยข้อมูลการใช้ไฟฟ้ารายชั่วโมงและอุณหภูมิระหว่างปี 2012 ถึง 2014 โดยอ้างอิงจากรูปแบบในอดีตของการใช้ไฟฟ้าและอุณหภูมิ คุณสามารถคาดการณ์ค่าการใช้ไฟฟ้าในอนาคตได้ + +ในตัวอย่างนี้ คุณจะได้เรียนรู้วิธีการพยากรณ์ล่วงหน้า 1 ขั้นตอน โดยใช้ข้อมูลการใช้ไฟฟ้าในอดีตเท่านั้น อย่างไรก็ตาม ก่อนเริ่มต้น จะเป็นประโยชน์ที่จะเข้าใจสิ่งที่เกิดขึ้นเบื้องหลัง + +## คำจำกัดความบางประการ + +เมื่อพบคำว่า 'ข้อมูลอนุกรมเวลา' คุณจำเป็นต้องเข้าใจการใช้งานในบริบทต่าง ๆ + +🎓 **ข้อมูลอนุกรมเวลา** + +ในทางคณิตศาสตร์ "ข้อมูลอนุกรมเวลา คือชุดของจุดข้อมูลที่จัดเรียงตามลำดับเวลา โดยทั่วไปข้อมูลอนุกรมเวลาคือชุดข้อมูลที่เก็บรวบรวมในช่วงเวลาที่มีระยะห่างเท่ากัน" ตัวอย่างของข้อมูลอนุกรมเวลาคือค่าปิดตลาดรายวันของ [Dow Jones Industrial Average](https://wikipedia.org/wiki/Time_series) การใช้กราฟข้อมูลอนุกรมเวลาและการสร้างแบบจำลองทางสถิติมักพบในงานประมวลผลสัญญาณ การพยากรณ์อากาศ การคาดการณ์แผ่นดินไหว และสาขาอื่น ๆ ที่เหตุการณ์เกิดขึ้นและจุดข้อมูลสามารถวางกราฟตามเวลาได้ + +🎓 **การวิเคราะห์ข้อมูลอนุกรมเวลา** + +การวิเคราะห์ข้อมูลอนุกรมเวลา คือการวิเคราะห์ข้อมูลอนุกรมเวลาที่กล่าวถึงข้างต้น ข้อมูลอนุกรมเวลาอาจมีรูปแบบที่แตกต่างกัน รวมถึง 'ข้อมูลอนุกรมเวลาที่ถูกขัดจังหวะ' ซึ่งตรวจจับรูปแบบในวิวัฒนาการของข้อมูลอนุกรมเวลาก่อนและหลังเหตุการณ์ที่ขัดจังหวะ ประเภทของการวิเคราะห์ที่จำเป็นสำหรับข้อมูลอนุกรมเวลาขึ้นอยู่กับลักษณะของข้อมูล ข้อมูลอนุกรมเวลาเองอาจอยู่ในรูปแบบของชุดตัวเลขหรืออักขระ + +การวิเคราะห์ที่ดำเนินการใช้วิธีการหลากหลาย รวมถึงการวิเคราะห์ในโดเมนความถี่และโดเมนเวลา แบบเชิงเส้นและไม่เชิงเส้น และอื่น ๆ [เรียนรู้เพิ่มเติม](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) เกี่ยวกับวิธีการวิเคราะห์ข้อมูลประเภทนี้ + +🎓 **การพยากรณ์ข้อมูลอนุกรมเวลา** + +การพยากรณ์ข้อมูลอนุกรมเวลา คือการใช้แบบจำลองเพื่อคาดการณ์ค่าที่จะเกิดขึ้นในอนาคต โดยอ้างอิงจากรูปแบบที่แสดงโดยข้อมูลที่รวบรวมไว้ในอดีต แม้ว่าจะสามารถใช้แบบจำลองการถดถอยเพื่อสำรวจข้อมูลอนุกรมเวลา โดยใช้ดัชนีเวลาเป็นตัวแปร x บนกราฟ แต่ข้อมูลดังกล่าวเหมาะสมที่สุดที่จะวิเคราะห์โดยใช้แบบจำลองเฉพาะประเภท + +ข้อมูลอนุกรมเวลาเป็นรายการของการสังเกตที่จัดเรียงตามลำดับ ซึ่งแตกต่างจากข้อมูลที่สามารถวิเคราะห์ได้ด้วยการถดถอยเชิงเส้น แบบจำลองที่พบมากที่สุดคือ ARIMA ซึ่งเป็นคำย่อของ "Autoregressive Integrated Moving Average" + +[แบบจำลอง ARIMA](https://online.stat.psu.edu/stat510/lesson/1/1.1) "เชื่อมโยงค่าปัจจุบันของชุดข้อมูลกับค่าที่ผ่านมาและข้อผิดพลาดในการพยากรณ์ที่ผ่านมา" แบบจำลองเหล่านี้เหมาะสมที่สุดสำหรับการวิเคราะห์ข้อมูลในโดเมนเวลา ซึ่งข้อมูลถูกจัดเรียงตามเวลา + +> มีหลายประเภทของแบบจำลอง ARIMA ซึ่งคุณสามารถเรียนรู้เพิ่มเติม [ที่นี่](https://people.duke.edu/~rnau/411arim.htm) และคุณจะได้สัมผัสในบทเรียนถัดไป + +ในบทเรียนถัดไป คุณจะสร้างแบบจำลอง ARIMA โดยใช้ [ข้อมูลอนุกรมเวลาแบบตัวแปรเดียว](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm) ซึ่งเน้นที่ตัวแปรเดียวที่เปลี่ยนแปลงค่าตามเวลา ตัวอย่างของข้อมูลประเภทนี้คือ [ชุดข้อมูลนี้](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) ที่บันทึกความเข้มข้นของ CO2 รายเดือนที่หอดูดาว 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 | + +✅ ระบุตัวแปรที่เปลี่ยนแปลงตามเวลาในชุดข้อมูลนี้ + +## ลักษณะของข้อมูลอนุกรมเวลาที่ควรพิจารณา + +เมื่อดูข้อมูลอนุกรมเวลา คุณอาจสังเกตเห็นว่ามันมี [ลักษณะบางประการ](https://online.stat.psu.edu/stat510/lesson/1/1.1) ที่คุณต้องคำนึงถึงและลดผลกระทบเพื่อทำความเข้าใจรูปแบบของมันได้ดีขึ้น หากคุณพิจารณาข้อมูลอนุกรมเวลาเป็น 'สัญญาณ' ที่คุณต้องการวิเคราะห์ ลักษณะเหล่านี้สามารถถือเป็น 'เสียงรบกวน' คุณมักจะต้องลด 'เสียงรบกวน' นี้โดยใช้เทคนิคทางสถิติเพื่อชดเชยลักษณะบางประการเหล่านี้ + +นี่คือแนวคิดบางประการที่คุณควรรู้เพื่อทำงานกับข้อมูลอนุกรมเวลา: + +🎓 **แนวโน้ม** + +แนวโน้มหมายถึงการเพิ่มขึ้นและลดลงที่สามารถวัดได้ตามเวลา [อ่านเพิ่มเติม](https://machinelearningmastery.com/time-series-trends-in-python) ในบริบทของข้อมูลอนุกรมเวลาเกี่ยวกับวิธีการใช้และหากจำเป็นต้องลบแนวโน้มออกจากข้อมูลอนุกรมเวลา + +🎓 **[ฤดูกาล](https://machinelearningmastery.com/time-series-seasonality-with-python/)** + +ฤดูกาลหมายถึงความผันผวนที่เกิดขึ้นเป็นระยะ เช่น ช่วงเทศกาลที่อาจส่งผลต่อยอดขาย [ดูเพิ่มเติม](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) เกี่ยวกับวิธีการแสดงฤดูกาลในข้อมูลด้วยกราฟประเภทต่าง ๆ + +🎓 **ค่าผิดปกติ** + +ค่าผิดปกติคือค่าที่อยู่ห่างจากความแปรปรวนของข้อมูลมาตรฐาน + +🎓 **วัฏจักรระยะยาว** + +นอกเหนือจากฤดูกาล ข้อมูลอาจแสดงวัฏจักรระยะยาว เช่น ภาวะเศรษฐกิจตกต่ำที่กินเวลานานกว่าหนึ่งปี + +🎓 **ความแปรปรวนคงที่** + +ในช่วงเวลา ข้อมูลบางอย่างแสดงความผันผวนคงที่ เช่น การใช้พลังงานในช่วงกลางวันและกลางคืน + +🎓 **การเปลี่ยนแปลงอย่างฉับพลัน** + +ข้อมูลอาจแสดงการเปลี่ยนแปลงอย่างฉับพลันที่อาจต้องการการวิเคราะห์เพิ่มเติม เช่น การปิดกิจการอย่างฉับพลันเนื่องจาก COVID ซึ่งทำให้ข้อมูลเปลี่ยนแปลง + +✅ นี่คือตัวอย่างกราฟข้อมูลอนุกรมเวลา [กราฟนี้](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) แสดงการใช้เงินในเกมรายวันในช่วงหลายปี คุณสามารถระบุลักษณะใด ๆ ที่กล่าวถึงข้างต้นในข้อมูลนี้ได้หรือไม่? + +![การใช้เงินในเกม](../../../../7-TimeSeries/1-Introduction/images/currency.png) + +## แบบฝึกหัด - เริ่มต้นกับข้อมูลการใช้พลังงาน + +มาเริ่มต้นสร้างแบบจำลองข้อมูลอนุกรมเวลาเพื่อคาดการณ์การใช้พลังงานในอนาคตโดยอ้างอิงจากการใช้ในอดีตกัน + +> ข้อมูลในตัวอย่างนี้นำมาจากการแข่งขันการพยากรณ์ GEFCom2014 ซึ่งประกอบด้วยข้อมูลการใช้ไฟฟ้ารายชั่วโมงและอุณหภูมิระหว่างปี 2012 ถึง 2014 +> +> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli และ Rob J. Hyndman, "การพยากรณ์พลังงานเชิงความน่าจะเป็น: การแข่งขันการพยากรณ์พลังงานระดับโลก 2014 และอื่น ๆ", International Journal of Forecasting, vol.32, no.3, pp 896-913, กรกฎาคม-กันยายน, 2016. + +1. ในโฟลเดอร์ `working` ของบทเรียนนี้ เปิดไฟล์ _notebook.ipynb_ เริ่มต้นโดยเพิ่มไลบรารีที่ช่วยให้คุณโหลดและแสดงผลข้อมูล + + ```python + import os + import matplotlib.pyplot as plt + from common.utils import load_data + %matplotlib inline + ``` + + หมายเหตุ คุณกำลังใช้ไฟล์จากโฟลเดอร์ `common` ที่รวมอยู่ซึ่งตั้งค่าสภาพแวดล้อมของคุณและจัดการการดาวน์โหลดข้อมูล + +2. จากนั้น ตรวจสอบข้อมูลในรูปแบบ dataframe โดยเรียกใช้ `load_data()` และ `head()`: + + ```python + data_dir = './data' + energy = load_data(data_dir)[['load']] + energy.head() + ``` + + คุณจะเห็นว่ามีสองคอลัมน์ที่แสดงวันที่และการใช้พลังงาน: + + | | load | + | :-----------------: | :----: | + | 2012-01-01 00:00:00 | 2698.0 | + | 2012-01-01 01:00:00 | 2558.0 | + | 2012-01-01 02:00:00 | 2444.0 | + | 2012-01-01 03:00:00 | 2402.0 | + | 2012-01-01 04:00:00 | 2403.0 | + +3. ตอนนี้ ลองสร้างกราฟข้อมูลโดยเรียกใช้ `plot()`: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![กราฟพลังงาน](../../../../7-TimeSeries/1-Introduction/images/energy-plot.png) + +4. จากนั้น ลองสร้างกราฟสำหรับสัปดาห์แรกของเดือนกรกฎาคม 2014 โดยระบุช่วงเวลาในรูปแบบ `[จากวันที่]: [ถึงวันที่]`: + + ```python + energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![กรกฎาคม](../../../../7-TimeSeries/1-Introduction/images/july-2014.png) + + กราฟที่สวยงาม! ลองดูกราฟเหล่านี้และดูว่าคุณสามารถระบุลักษณะใด ๆ ที่กล่าวถึงข้างต้นได้หรือไม่ เราสามารถสรุปอะไรได้จากการแสดงผลข้อมูลนี้? + +ในบทเรียนถัดไป คุณจะสร้างแบบจำลอง ARIMA เพื่อสร้างการพยากรณ์ + +--- + +## 🚀ความท้าทาย + +ลองทำรายการอุตสาหกรรมและสาขาการศึกษาทั้งหมดที่คุณคิดว่าสามารถได้รับประโยชน์จากการพยากรณ์ข้อมูลอนุกรมเวลา คุณสามารถคิดถึงการประยุกต์ใช้เทคนิคเหล่านี้ในศิลปะ เศรษฐมิติ นิเวศวิทยา การค้าปลีก อุตสาหกรรม การเงิน หรือที่อื่น ๆ ได้หรือไม่? + +## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +แม้ว่าเราจะไม่ได้กล่าวถึงในที่นี้ แต่บางครั้งเครือข่ายประสาทเทียมถูกนำมาใช้เพื่อเพิ่มประสิทธิภาพวิธีการคลาสสิกของการพยากรณ์ข้อมูลอนุกรมเวลา อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ [ในบทความนี้](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412) + +## งานที่ได้รับมอบหมาย + +[ลองแสดงผลข้อมูลอนุกรมเวลาเพิ่มเติม](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/7-TimeSeries/1-Introduction/assignment.md b/translations/th/7-TimeSeries/1-Introduction/assignment.md new file mode 100644 index 000000000..24da78a4d --- /dev/null +++ b/translations/th/7-TimeSeries/1-Introduction/assignment.md @@ -0,0 +1,25 @@ + +# การแสดงผลข้อมูล Time Series เพิ่มเติม + +## คำแนะนำ + +คุณได้เริ่มเรียนรู้เกี่ยวกับการพยากรณ์ Time Series โดยการดูประเภทของข้อมูลที่ต้องใช้การสร้างแบบจำลองพิเศษนี้ คุณได้แสดงผลข้อมูลบางส่วนเกี่ยวกับพลังงานแล้ว ตอนนี้ลองมองหาข้อมูลอื่น ๆ ที่จะได้รับประโยชน์จากการพยากรณ์ Time Series ค้นหาตัวอย่างสามตัวอย่าง (ลองดูที่ [Kaggle](https://kaggle.com) และ [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)) และสร้างโน้ตบุ๊กเพื่อแสดงผลข้อมูลเหล่านั้น ระบุลักษณะพิเศษใด ๆ ที่ข้อมูลมี (เช่น ฤดูกาล การเปลี่ยนแปลงอย่างฉับพลัน หรือแนวโน้มอื่น ๆ) ในโน้ตบุ๊ก + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| ------ | ------------------------------------------------------ | -------------------------------------------------- | ----------------------------------------------------------------------------------- | +| | มีการแสดงผลและอธิบายข้อมูลสามชุดในโน้ตบุ๊ก | มีการแสดงผลและอธิบายข้อมูลสองชุดในโน้ตบุ๊ก | มีการแสดงผลข้อมูลน้อยหรืออธิบายไม่ครบถ้วน หรือข้อมูลที่นำเสนอไม่เพียงพอ | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/7-TimeSeries/1-Introduction/solution/Julia/README.md b/translations/th/7-TimeSeries/1-Introduction/solution/Julia/README.md new file mode 100644 index 000000000..47c769bbf --- /dev/null +++ b/translations/th/7-TimeSeries/1-Introduction/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/7-TimeSeries/1-Introduction/solution/R/README.md b/translations/th/7-TimeSeries/1-Introduction/solution/R/README.md new file mode 100644 index 000000000..dbb6f8c12 --- /dev/null +++ b/translations/th/7-TimeSeries/1-Introduction/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/7-TimeSeries/2-ARIMA/README.md b/translations/th/7-TimeSeries/2-ARIMA/README.md new file mode 100644 index 000000000..7c77955bd --- /dev/null +++ b/translations/th/7-TimeSeries/2-ARIMA/README.md @@ -0,0 +1,407 @@ + +# การพยากรณ์อนุกรมเวลาโดยใช้ ARIMA + +ในบทเรียนก่อนหน้านี้ คุณได้เรียนรู้เกี่ยวกับการพยากรณ์อนุกรมเวลาและโหลดชุดข้อมูลที่แสดงการเปลี่ยนแปลงของโหลดไฟฟ้าในช่วงเวลาหนึ่ง + +[![Introduction to ARIMA](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Introduction to ARIMA") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: บทนำสั้น ๆ เกี่ยวกับโมเดล ARIMA ตัวอย่างในวิดีโอใช้ R แต่แนวคิดสามารถนำไปใช้ได้ทั่วไป + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## บทนำ + +ในบทเรียนนี้ คุณจะได้เรียนรู้วิธีเฉพาะในการสร้างโมเดลด้วย [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) โมเดล ARIMA เหมาะอย่างยิ่งสำหรับการปรับข้อมูลที่แสดง [non-stationarity](https://wikipedia.org/wiki/Stationary_process) + +## แนวคิดทั่วไป + +เพื่อที่จะทำงานกับ ARIMA มีแนวคิดบางอย่างที่คุณจำเป็นต้องรู้: + +- 🎓 **Stationarity**. ในบริบททางสถิติ Stationarity หมายถึงข้อมูลที่การแจกแจงไม่เปลี่ยนแปลงเมื่อเลื่อนเวลา ข้อมูลที่ไม่เป็น Stationary จะแสดงการเปลี่ยนแปลงเนื่องจากแนวโน้มที่ต้องแปลงเพื่อวิเคราะห์ ตัวอย่างเช่น Seasonality สามารถทำให้เกิดการเปลี่ยนแปลงในข้อมูลและสามารถกำจัดได้โดยกระบวนการ 'seasonal-differencing' + +- 🎓 **[Differencing](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. การ Differencing ข้อมูลในบริบททางสถิติ หมายถึงกระบวนการแปลงข้อมูลที่ไม่เป็น Stationary ให้เป็น Stationary โดยการลบแนวโน้มที่ไม่คงที่ "Differencing ช่วยลบการเปลี่ยนแปลงในระดับของอนุกรมเวลา กำจัดแนวโน้มและ Seasonality และทำให้ค่าเฉลี่ยของอนุกรมเวลามีเสถียรภาพ" [บทความโดย Shixiong et al](https://arxiv.org/abs/1904.07632) + +## ARIMA ในบริบทของอนุกรมเวลา + +มาทำความเข้าใจส่วนต่าง ๆ ของ ARIMA เพื่อให้เข้าใจว่าโมเดลนี้ช่วยเราในการสร้างแบบจำลองอนุกรมเวลาและช่วยในการพยากรณ์ได้อย่างไร + +- **AR - AutoRegressive**. โมเดล AutoRegressive ตามชื่อ หมายถึงการมองย้อนกลับไปในเวลาเพื่อวิเคราะห์ค่าก่อนหน้าในข้อมูลของคุณและทำการสันนิษฐานเกี่ยวกับค่าเหล่านั้น ค่าก่อนหน้าเหล่านี้เรียกว่า 'lags' ตัวอย่างเช่น ข้อมูลที่แสดงยอดขายดินสอรายเดือน ยอดขายรวมของแต่ละเดือนจะถือว่าเป็น 'ตัวแปรที่เปลี่ยนแปลง' ในชุดข้อมูล โมเดลนี้ถูกสร้างขึ้นโดย "ตัวแปรที่เปลี่ยนแปลงที่สนใจถูกวิเคราะห์กับค่าก่อนหน้าของตัวเอง" [wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) + +- **I - Integrated**. แตกต่างจากโมเดล 'ARMA' ที่คล้ายกัน 'I' ใน ARIMA หมายถึงลักษณะ *[integrated](https://wikipedia.org/wiki/Order_of_integration)* ข้อมูลจะถูก 'integrated' เมื่อมีการใช้ขั้นตอน Differencing เพื่อกำจัด non-stationarity + +- **MA - Moving Average**. ลักษณะ [moving-average](https://wikipedia.org/wiki/Moving-average_model) ของโมเดลนี้หมายถึงตัวแปรผลลัพธ์ที่ถูกกำหนดโดยการสังเกตค่าปัจจุบันและค่าก่อนหน้าของ lags + +สรุป: ARIMA ถูกใช้เพื่อสร้างโมเดลที่ปรับให้เข้ากับรูปแบบพิเศษของข้อมูลอนุกรมเวลาให้ใกล้เคียงที่สุด + +## แบบฝึกหัด - สร้างโมเดล ARIMA + +เปิดโฟลเดอร์ [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) ในบทเรียนนี้และค้นหาไฟล์ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb) + +1. รัน notebook เพื่อโหลดไลบรารี Python `statsmodels`; คุณจะต้องใช้ไลบรารีนี้สำหรับโมเดล ARIMA + +1. โหลดไลบรารีที่จำเป็น + +1. ตอนนี้โหลดไลบรารีเพิ่มเติมที่มีประโยชน์สำหรับการสร้างกราฟข้อมูล: + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from pandas.plotting import autocorrelation_plot + from statsmodels.tsa.statespace.sarimax import SARIMAX + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + from IPython.display import Image + + %matplotlib inline + pd.options.display.float_format = '{:,.2f}'.format + np.set_printoptions(precision=2) + warnings.filterwarnings("ignore") # specify to ignore warning messages + ``` + +1. โหลดข้อมูลจากไฟล์ `/data/energy.csv` ลงใน Pandas dataframe และดูข้อมูล: + + ```python + energy = load_data('./data')[['load']] + energy.head(10) + ``` + +1. สร้างกราฟข้อมูลพลังงานทั้งหมดที่มีตั้งแต่เดือนมกราคม 2012 ถึงเดือนธันวาคม 2014 ไม่มีอะไรน่าประหลาดใจเพราะเราเห็นข้อมูลนี้ในบทเรียนที่แล้ว: + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ตอนนี้มาสร้างโมเดลกัน! + +### สร้างชุดข้อมูลสำหรับการฝึกและการทดสอบ + +ตอนนี้ข้อมูลของคุณถูกโหลดแล้ว คุณสามารถแยกมันออกเป็นชุดข้อมูลสำหรับการฝึกและการทดสอบ คุณจะฝึกโมเดลของคุณด้วยชุดข้อมูลสำหรับการฝึก และหลังจากโมเดลฝึกเสร็จแล้ว คุณจะประเมินความแม่นยำของมันโดยใช้ชุดข้อมูลสำหรับการทดสอบ คุณต้องมั่นใจว่าชุดข้อมูลสำหรับการทดสอบครอบคลุมช่วงเวลาที่เกิดขึ้นหลังจากชุดข้อมูลสำหรับการฝึกเพื่อให้มั่นใจว่าโมเดลไม่ได้รับข้อมูลจากช่วงเวลาที่จะเกิดขึ้นในอนาคต + +1. กำหนดช่วงเวลาสองเดือนตั้งแต่วันที่ 1 กันยายนถึง 31 ตุลาคม 2014 ให้เป็นชุดข้อมูลสำหรับการฝึก ชุดข้อมูลสำหรับการทดสอบจะรวมช่วงเวลาสองเดือนตั้งแต่วันที่ 1 พฤศจิกายนถึง 31 ธันวาคม 2014: + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + + เนื่องจากข้อมูลนี้สะท้อนการบริโภคพลังงานรายวัน มีรูปแบบตามฤดูกาลที่ชัดเจน แต่การบริโภคมีความคล้ายคลึงกับการบริโภคในวันล่าสุดมากที่สุด + +1. สร้างกราฟเปรียบเทียบ: + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![training and testing data](../../../../7-TimeSeries/2-ARIMA/images/train-test.png) + + ดังนั้น การใช้ช่วงเวลาที่ค่อนข้างเล็กสำหรับการฝึกข้อมูลควรเพียงพอ + + > หมายเหตุ: เนื่องจากฟังก์ชันที่เราใช้ในการปรับโมเดล ARIMA ใช้การตรวจสอบภายในตัวอย่างระหว่างการปรับ เราจะละเว้นข้อมูลการตรวจสอบ + +### เตรียมข้อมูลสำหรับการฝึก + +ตอนนี้คุณต้องเตรียมข้อมูลสำหรับการฝึกโดยการกรองและปรับขนาดข้อมูล กรองชุดข้อมูลของคุณเพื่อรวมเฉพาะช่วงเวลาที่ต้องการและคอลัมน์ที่จำเป็น และปรับขนาดเพื่อให้แน่ใจว่าข้อมูลถูกฉายลงในช่วง 0,1 + +1. กรองชุดข้อมูลต้นฉบับเพื่อรวมเฉพาะช่วงเวลาที่กล่าวถึงต่อชุดและรวมเฉพาะคอลัมน์ 'load' และวันที่ที่จำเป็น: + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + คุณสามารถดูรูปร่างของข้อมูล: + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +1. ปรับขนาดข้อมูลให้อยู่ในช่วง (0, 1) + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + train.head(10) + ``` + +1. สร้างกราฟเปรียบเทียบข้อมูลต้นฉบับกับข้อมูลที่ปรับขนาด: + + ```python + energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12) + train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12) + plt.show() + ``` + + ![original](../../../../7-TimeSeries/2-ARIMA/images/original.png) + + > ข้อมูลต้นฉบับ + + ![scaled](../../../../7-TimeSeries/2-ARIMA/images/scaled.png) + + > ข้อมูลที่ปรับขนาด + +1. ตอนนี้คุณได้ปรับเทียบข้อมูลที่ปรับขนาดแล้ว คุณสามารถปรับขนาดข้อมูลสำหรับการทดสอบ: + + ```python + test['load'] = scaler.transform(test) + test.head() + ``` + +### ใช้ ARIMA + +ถึงเวลาที่จะใช้ ARIMA! ตอนนี้คุณจะใช้ไลบรารี `statsmodels` ที่คุณติดตั้งไว้ก่อนหน้านี้ + +ตอนนี้คุณต้องทำตามขั้นตอนหลายขั้นตอน + + 1. กำหนดโมเดลโดยเรียก `SARIMAX()` และส่งพารามิเตอร์ของโมเดล: พารามิเตอร์ p, d, และ q และพารามิเตอร์ P, D, และ Q + 2. เตรียมโมเดลสำหรับข้อมูลการฝึกโดยเรียกฟังก์ชัน fit() + 3. ทำการพยากรณ์โดยเรียกฟังก์ชัน `forecast()` และระบุจำนวนขั้นตอน (หรือ `horizon`) ที่ต้องการพยากรณ์ + +> 🎓 พารามิเตอร์เหล่านี้มีไว้เพื่ออะไร? ในโมเดล ARIMA มี 3 พารามิเตอร์ที่ใช้ช่วยสร้างแบบจำลองลักษณะสำคัญของอนุกรมเวลา: seasonality, trend, และ noise พารามิเตอร์เหล่านี้คือ: + +`p`: พารามิเตอร์ที่เกี่ยวข้องกับลักษณะ auto-regressive ของโมเดล ซึ่งรวมค่าที่ผ่านมา +`d`: พารามิเตอร์ที่เกี่ยวข้องกับส่วน integrated ของโมเดล ซึ่งมีผลต่อจำนวน *differencing* (🎓 จำ differencing ได้ไหม 👆?) ที่จะใช้กับอนุกรมเวลา +`q`: พารามิเตอร์ที่เกี่ยวข้องกับส่วน moving-average ของโมเดล + +> หมายเหตุ: หากข้อมูลของคุณมีลักษณะตามฤดูกาล - ซึ่งข้อมูลนี้มี - เราใช้โมเดล ARIMA ตามฤดูกาล (SARIMA) ในกรณีนี้คุณต้องใช้ชุดพารามิเตอร์อีกชุดหนึ่ง: `P`, `D`, และ `Q` ซึ่งอธิบายความสัมพันธ์เดียวกันกับ `p`, `d`, และ `q` แต่สอดคล้องกับส่วนตามฤดูกาลของโมเดล + +1. เริ่มต้นโดยตั้งค่าค่าของ horizon ที่คุณต้องการ ลองใช้ 3 ชั่วโมง: + + ```python + # Specify the number of steps to forecast ahead + HORIZON = 3 + print('Forecasting horizon:', HORIZON, 'hours') + ``` + + การเลือกค่าที่ดีที่สุดสำหรับพารามิเตอร์ของโมเดล ARIMA อาจเป็นเรื่องท้าทายเนื่องจากเป็นเรื่องที่ค่อนข้างอัตวิสัยและใช้เวลามาก คุณอาจพิจารณาใช้ฟังก์ชัน `auto_arima()` จากไลบรารี [`pyramid`](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html) + +1. สำหรับตอนนี้ลองเลือกค่าด้วยตนเองเพื่อค้นหาโมเดลที่ดี + + ```python + order = (4, 1, 0) + seasonal_order = (1, 1, 0, 24) + + model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order) + results = model.fit() + + print(results.summary()) + ``` + + ตารางผลลัพธ์จะถูกพิมพ์ออกมา + +คุณได้สร้างโมเดลแรกของคุณแล้ว! ตอนนี้เราต้องหาวิธีประเมินมัน + +### ประเมินโมเดลของคุณ + +เพื่อประเมินโมเดลของคุณ คุณสามารถใช้การตรวจสอบที่เรียกว่า `walk forward` validation ในทางปฏิบัติ โมเดลอนุกรมเวลาจะถูกฝึกใหม่ทุกครั้งที่มีข้อมูลใหม่เข้ามา สิ่งนี้ช่วยให้โมเดลสามารถทำการพยากรณ์ที่ดีที่สุดในแต่ละขั้นตอนเวลา + +เริ่มต้นที่จุดเริ่มต้นของอนุกรมเวลาโดยใช้เทคนิคนี้ ฝึกโมเดลด้วยชุดข้อมูลสำหรับการฝึก จากนั้นทำการพยากรณ์ในขั้นตอนเวลาถัดไป การพยากรณ์จะถูกประเมินเทียบกับค่าที่ทราบ ชุดข้อมูลสำหรับการฝึกจะถูกขยายเพื่อรวมค่าที่ทราบและกระบวนการจะถูกทำซ้ำ + +> หมายเหตุ: คุณควรรักษาหน้าต่างชุดข้อมูลสำหรับการฝึกให้คงที่เพื่อการฝึกที่มีประสิทธิภาพมากขึ้น เพื่อให้ทุกครั้งที่คุณเพิ่มการสังเกตใหม่ลงในชุดข้อมูลสำหรับการฝึก คุณจะลบการสังเกตจากจุดเริ่มต้นของชุดข้อมูล + +กระบวนการนี้ให้การประมาณที่แข็งแกร่งขึ้นเกี่ยวกับวิธีที่โมเดลจะทำงานในทางปฏิบัติ อย่างไรก็ตาม มันมาพร้อมกับต้นทุนการคำนวณในการสร้างโมเดลจำนวนมาก สิ่งนี้เป็นที่ยอมรับได้หากข้อมูลมีขนาดเล็กหรือโมเดลมีความเรียบง่าย แต่สามารถเป็นปัญหาในระดับใหญ่ + +การตรวจสอบแบบ walk-forward เป็นมาตรฐานทองคำของการประเมินโมเดลอนุกรมเวลาและแนะนำสำหรับโครงการของคุณเอง + +1. ก่อนอื่น สร้างจุดข้อมูลการทดสอบสำหรับแต่ละขั้นตอน HORIZON + + ```python + test_shifted = test.copy() + + for t in range(1, HORIZON+1): + test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H') + + test_shifted = test_shifted.dropna(how='any') + test_shifted.head(5) + ``` + + | | | load | load+1 | load+2 | + | ---------- | -------- | ---- | ------ | ------ | + | 2014-12-30 | 00:00:00 | 0.33 | 0.29 | 0.27 | + | 2014-12-30 | 01:00:00 | 0.29 | 0.27 | 0.27 | + | 2014-12-30 | 02:00:00 | 0.27 | 0.27 | 0.30 | + | 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 | + | 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 | + + ข้อมูลจะถูกเลื่อนในแนวนอนตามจุด horizon + +1. ทำการพยากรณ์ในข้อมูลการทดสอบของคุณโดยใช้วิธี sliding window ในลูปที่มีขนาดเท่ากับความยาวของข้อมูลการทดสอบ: + + ```python + %%time + training_window = 720 # dedicate 30 days (720 hours) for training + + train_ts = train['load'] + test_ts = test_shifted + + history = [x for x in train_ts] + history = history[(-training_window):] + + predictions = list() + + order = (2, 1, 0) + seasonal_order = (1, 1, 0, 24) + + for t in range(test_ts.shape[0]): + model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order) + model_fit = model.fit() + yhat = model_fit.forecast(steps = HORIZON) + predictions.append(yhat) + obs = list(test_ts.iloc[t]) + # move the training window + history.append(obs[0]) + history.pop(0) + print(test_ts.index[t]) + print(t+1, ': predicted =', yhat, 'expected =', obs) + ``` + + คุณสามารถดูการฝึกที่เกิดขึ้น: + + ```output + 2014-12-30 00:00:00 + 1 : predicted = [0.32 0.29 0.28] expected = [0.32945389435989236, 0.2900626678603402, 0.2739480752014323] + + 2014-12-30 01:00:00 + 2 : predicted = [0.3 0.29 0.3 ] expected = [0.2900626678603402, 0.2739480752014323, 0.26812891674127126] + + 2014-12-30 02:00:00 + 3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795] + ``` + +1. เปรียบเทียบการพยากรณ์กับโหลดจริง: + + ```python + eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)]) + eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1] + eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h') + eval_df['actual'] = np.array(np.transpose(test_ts)).ravel() + eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']]) + eval_df.head() + ``` + + ผลลัพธ์ + | | | timestamp | h | prediction | actual | + | --- | ---------- | --------- | --- | ---------- | -------- | + | 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 | + | 1 | 2014-12-30 | 01:00:00 | t+1 | 2,955.53 | 2,935.00 | + | 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 | + | 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 | + | 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 | + + สังเกตการพยากรณ์ข้อมูลรายชั่วโมง เทียบกับโหลดจริง ความแม่นยำเป็นอย่างไร? + +### ตรวจสอบความแม่นยำของโมเดล + +ตรวจสอบความแม่นยำของโมเดลของคุณโดยทดสอบค่า mean absolute percentage error (MAPE) จากการพยากรณ์ทั้งหมด +> **🧮 แสดงคณิตศาสตร์** +> +> ![MAPE](../../../../7-TimeSeries/2-ARIMA/images/mape.png) +> +> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) ใช้เพื่อแสดงความแม่นยำของการพยากรณ์ในรูปแบบอัตราส่วนที่กำหนดโดยสูตรด้านบน ความแตกต่างระหว่างค่าจริงและค่าที่พยากรณ์ +ถูกหารด้วยค่าจริง +"ค่าที่เป็นบวกในสูตรนี้จะถูกนำมารวมกันสำหรับทุกจุดที่พยากรณ์ในช่วงเวลา และหารด้วยจำนวนจุดที่พอดี n" [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error) +1. แสดงสมการในโค้ด: + + ```python + if(HORIZON > 1): + eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual'] + print(eval_df.groupby('h')['APE'].mean()) + ``` + +1. คำนวณ MAPE ของการพยากรณ์หนึ่งขั้น: + + ```python + print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%') + ``` + + MAPE ของการพยากรณ์หนึ่งขั้น: 0.5570581332313952 % + +1. แสดงผล MAPE ของการพยากรณ์หลายขั้น: + + ```python + print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%') + ``` + + ```output + Multi-step forecast MAPE: 1.1460048657704118 % + ``` + + ตัวเลขที่ต่ำถือว่าดี: พิจารณาว่าการพยากรณ์ที่มี MAPE เท่ากับ 10 หมายถึงค่าที่พยากรณ์ผิดไป 10% + +1. แต่เช่นเคย การวัดความแม่นยำแบบนี้จะเห็นได้ง่ายขึ้นเมื่อดูภาพ ดังนั้นมาลองพล็อตกราฟกัน: + + ```python + if(HORIZON == 1): + ## Plotting single step forecast + eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8)) + + else: + ## Plotting multi step forecast + plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']] + for t in range(1, HORIZON+1): + plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values + + fig = plt.figure(figsize=(15, 8)) + ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0) + ax = fig.add_subplot(111) + for t in range(1, HORIZON+1): + x = plot_df['timestamp'][(t-1):] + y = plot_df['t+'+str(t)][0:len(x)] + ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t)) + + ax.legend(loc='best') + + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![โมเดลซีรีส์เวลา](../../../../7-TimeSeries/2-ARIMA/images/accuracy.png) + +🏆 กราฟที่ดูดีมาก แสดงให้เห็นว่าโมเดลมีความแม่นยำสูง ยอดเยี่ยมมาก! + +--- + +## 🚀ความท้าทาย + +สำรวจวิธีการทดสอบความแม่นยำของโมเดลซีรีส์เวลา ในบทเรียนนี้เราได้พูดถึง MAPE แต่มีวิธีอื่นที่คุณสามารถใช้ได้หรือไม่? ลองค้นคว้าและอธิบายเพิ่มเติม เอกสารที่เป็นประโยชน์สามารถดูได้ [ที่นี่](https://otexts.com/fpp2/accuracy.html) + +## [แบบทดสอบหลังบทเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตัวเอง + +บทเรียนนี้ครอบคลุมเพียงพื้นฐานของการพยากรณ์ซีรีส์เวลาด้วย ARIMA ใช้เวลาเพิ่มเติมเพื่อเพิ่มพูนความรู้ของคุณโดยสำรวจ [repository นี้](https://microsoft.github.io/forecasting/) และโมเดลประเภทต่าง ๆ เพื่อเรียนรู้วิธีอื่น ๆ ในการสร้างโมเดลซีรีส์เวลา + +## งานที่ได้รับมอบหมาย + +[โมเดล ARIMA ใหม่](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามอย่างเต็มที่เพื่อให้การแปลมีความถูกต้อง โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์มืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/7-TimeSeries/2-ARIMA/assignment.md b/translations/th/7-TimeSeries/2-ARIMA/assignment.md new file mode 100644 index 000000000..ef86e995d --- /dev/null +++ b/translations/th/7-TimeSeries/2-ARIMA/assignment.md @@ -0,0 +1,25 @@ + +# โมเดล ARIMA ใหม่ + +## คำแนะนำ + +หลังจากที่คุณได้สร้างโมเดล ARIMA แล้ว ให้สร้างโมเดลใหม่โดยใช้ข้อมูลใหม่ (ลองใช้หนึ่งใน [ชุดข้อมูลเหล่านี้จาก Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)) อธิบายงานของคุณในโน้ตบุ๊ก แสดงภาพข้อมูลและโมเดลของคุณ และทดสอบความแม่นยำโดยใช้ MAPE + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | พอใช้ | ต้องปรับปรุง | +| -------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------- | +| | มีการนำเสนอโน้ตบุ๊กที่สร้าง ทดสอบ และอธิบายโมเดล ARIMA ใหม่ พร้อมด้วยการแสดงภาพและระบุความแม่นยำ | โน้ตบุ๊กที่นำเสนอไม่มีคำอธิบายหรือมีข้อผิดพลาด | มีการนำเสนอโน้ตบุ๊กที่ไม่สมบูรณ์ | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/7-TimeSeries/2-ARIMA/solution/Julia/README.md b/translations/th/7-TimeSeries/2-ARIMA/solution/Julia/README.md new file mode 100644 index 000000000..c02495038 --- /dev/null +++ b/translations/th/7-TimeSeries/2-ARIMA/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/7-TimeSeries/2-ARIMA/solution/R/README.md b/translations/th/7-TimeSeries/2-ARIMA/solution/R/README.md new file mode 100644 index 000000000..f46fc4d91 --- /dev/null +++ b/translations/th/7-TimeSeries/2-ARIMA/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์มืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/7-TimeSeries/3-SVR/README.md b/translations/th/7-TimeSeries/3-SVR/README.md new file mode 100644 index 000000000..c21b7cb12 --- /dev/null +++ b/translations/th/7-TimeSeries/3-SVR/README.md @@ -0,0 +1,393 @@ + +# การพยากรณ์ข้อมูลอนุกรมเวลาด้วย Support Vector Regressor + +ในบทเรียนก่อนหน้านี้ คุณได้เรียนรู้วิธีใช้โมเดล ARIMA เพื่อทำการพยากรณ์ข้อมูลอนุกรมเวลา ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับโมเดล Support Vector Regressor ซึ่งเป็นโมเดลสำหรับการพยากรณ์ข้อมูลแบบต่อเนื่อง + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## บทนำ + +ในบทเรียนนี้ คุณจะได้ค้นพบวิธีการสร้างโมเดลด้วย [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) สำหรับการพยากรณ์ หรือที่เรียกว่า **SVR: Support Vector Regressor** + +### SVR ในบริบทของข้อมูลอนุกรมเวลา [^1] + +ก่อนที่จะเข้าใจความสำคัญของ SVR ในการพยากรณ์ข้อมูลอนุกรมเวลา ต่อไปนี้คือแนวคิดสำคัญที่คุณควรรู้: + +- **Regression:** เทคนิคการเรียนรู้แบบมีผู้สอนที่ใช้ในการพยากรณ์ค่าต่อเนื่องจากชุดข้อมูลที่กำหนด แนวคิดคือการหาค่าที่เหมาะสมที่สุดในพื้นที่ฟีเจอร์ที่มีจุดข้อมูลมากที่สุด [คลิกที่นี่](https://en.wikipedia.org/wiki/Regression_analysis) เพื่อดูข้อมูลเพิ่มเติม +- **Support Vector Machine (SVM):** โมเดลการเรียนรู้แบบมีผู้สอนที่ใช้สำหรับการจัดประเภท การพยากรณ์ และการตรวจจับค่าผิดปกติ โมเดลนี้จะสร้างไฮเปอร์เพลนในพื้นที่ฟีเจอร์ ซึ่งในกรณีของการจัดประเภทจะทำหน้าที่เป็นเส้นแบ่ง และในกรณีของการพยากรณ์จะทำหน้าที่เป็นเส้นที่เหมาะสมที่สุด โดยทั่วไป SVM จะใช้ฟังก์ชัน Kernel เพื่อแปลงชุดข้อมูลไปยังพื้นที่ที่มีมิติสูงขึ้นเพื่อให้สามารถแยกได้ง่ายขึ้น [คลิกที่นี่](https://en.wikipedia.org/wiki/Support-vector_machine) เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับ SVM +- **Support Vector Regressor (SVR):** เป็นประเภทหนึ่งของ SVM ที่ใช้ในการหาค่าที่เหมาะสมที่สุด (ซึ่งในกรณีของ SVM คือไฮเปอร์เพลน) ที่มีจุดข้อมูลมากที่สุด + +### ทำไมต้องใช้ SVR? [^1] + +ในบทเรียนก่อนหน้านี้ คุณได้เรียนรู้เกี่ยวกับ ARIMA ซึ่งเป็นวิธีการทางสถิติที่ประสบความสำเร็จในการพยากรณ์ข้อมูลอนุกรมเวลาแบบเชิงเส้น อย่างไรก็ตาม ในหลายกรณี ข้อมูลอนุกรมเวลามีความ *ไม่เชิงเส้น* ซึ่งไม่สามารถจับคู่ได้ด้วยโมเดลเชิงเส้น ในกรณีเช่นนี้ ความสามารถของ SVM ในการพิจารณาความไม่เชิงเส้นในข้อมูลสำหรับงานพยากรณ์ทำให้ SVR ประสบความสำเร็จในการพยากรณ์ข้อมูลอนุกรมเวลา + +## แบบฝึกหัด - สร้างโมเดล SVR + +ขั้นตอนแรกสำหรับการเตรียมข้อมูลเหมือนกับบทเรียนก่อนหน้านี้เกี่ยวกับ [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) + +เปิดโฟลเดอร์ [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) ในบทเรียนนี้และค้นหาไฟล์ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb) [^2] + +1. รันโน้ตบุ๊กและนำเข้าไลบรารีที่จำเป็น: [^2] + + ```python + import sys + sys.path.append('../../') + ``` + + ```python + import os + import warnings + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import datetime as dt + import math + + from sklearn.svm import SVR + from sklearn.preprocessing import MinMaxScaler + from common.utils import load_data, mape + ``` + +2. โหลดข้อมูลจากไฟล์ `/data/energy.csv` ลงใน Pandas dataframe และดูข้อมูล: [^2] + + ```python + energy = load_data('../../data')[['load']] + ``` + +3. สร้างกราฟข้อมูลพลังงานทั้งหมดที่มีตั้งแต่เดือนมกราคม 2012 ถึงธันวาคม 2014: [^2] + + ```python + energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![full data](../../../../7-TimeSeries/3-SVR/images/full-data.png) + + ตอนนี้เรามาสร้างโมเดล SVR กัน + +### สร้างชุดข้อมูลสำหรับการฝึกและการทดสอบ + +เมื่อข้อมูลของคุณถูกโหลดแล้ว คุณสามารถแยกข้อมูลออกเป็นชุดฝึกและชุดทดสอบ จากนั้นคุณจะปรับรูปร่างข้อมูลเพื่อสร้างชุดข้อมูลตามลำดับเวลา ซึ่งจำเป็นสำหรับ SVR คุณจะฝึกโมเดลของคุณบนชุดฝึก หลังจากที่โมเดลฝึกเสร็จแล้ว คุณจะประเมินความแม่นยำของมันบนชุดฝึก ชุดทดสอบ และชุดข้อมูลทั้งหมดเพื่อดูประสิทธิภาพโดยรวม คุณต้องมั่นใจว่าชุดทดสอบครอบคลุมช่วงเวลาที่เกิดขึ้นหลังจากชุดฝึกเพื่อให้แน่ใจว่าโมเดลไม่ได้รับข้อมูลจากช่วงเวลาในอนาคต [^2] (สถานการณ์นี้เรียกว่า *Overfitting*) + +1. กำหนดช่วงเวลาสองเดือนตั้งแต่วันที่ 1 กันยายนถึง 31 ตุลาคม 2014 ให้เป็นชุดฝึก ชุดทดสอบจะครอบคลุมช่วงเวลาสองเดือนตั้งแต่วันที่ 1 พฤศจิกายนถึง 31 ธันวาคม 2014: [^2] + + ```python + train_start_dt = '2014-11-01 00:00:00' + test_start_dt = '2014-12-30 00:00:00' + ``` + +2. แสดงความแตกต่างด้วยกราฟ: [^2] + + ```python + energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \ + .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \ + .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12) + plt.xlabel('timestamp', fontsize=12) + plt.ylabel('load', fontsize=12) + plt.show() + ``` + + ![training and testing data](../../../../7-TimeSeries/3-SVR/images/train-test.png) + +### เตรียมข้อมูลสำหรับการฝึก + +ตอนนี้คุณต้องเตรียมข้อมูลสำหรับการฝึกโดยการกรองและปรับขนาดข้อมูล กรองชุดข้อมูลของคุณเพื่อรวมเฉพาะช่วงเวลาและคอลัมน์ที่คุณต้องการ และปรับขนาดเพื่อให้ข้อมูลอยู่ในช่วง 0,1 + +1. กรองชุดข้อมูลต้นฉบับเพื่อรวมเฉพาะช่วงเวลาที่กล่าวถึงข้างต้นต่อชุด และรวมเฉพาะคอลัมน์ 'load' และวันที่: [^2] + + ```python + train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']] + test = energy.copy()[energy.index >= test_start_dt][['load']] + + print('Training data shape: ', train.shape) + print('Test data shape: ', test.shape) + ``` + + ```output + Training data shape: (1416, 1) + Test data shape: (48, 1) + ``` + +2. ปรับขนาดข้อมูลชุดฝึกให้อยู่ในช่วง (0, 1): [^2] + + ```python + scaler = MinMaxScaler() + train['load'] = scaler.fit_transform(train) + ``` + +4. ตอนนี้ปรับขนาดข้อมูลชุดทดสอบ: [^2] + + ```python + test['load'] = scaler.transform(test) + ``` + +### สร้างข้อมูลด้วยลำดับเวลา [^1] + +สำหรับ SVR คุณต้องแปลงข้อมูลอินพุตให้อยู่ในรูปแบบ `[batch, timesteps]` ดังนั้น คุณจะปรับรูปร่าง `train_data` และ `test_data` ที่มีอยู่เพื่อให้มีมิติใหม่ที่อ้างถึงลำดับเวลา + +```python +# Converting to numpy arrays +train_data = train.values +test_data = test.values +``` + +สำหรับตัวอย่างนี้ เรากำหนด `timesteps = 5` ดังนั้น อินพุตของโมเดลคือข้อมูลสำหรับ 4 ลำดับเวลาแรก และเอาต์พุตจะเป็นข้อมูลสำหรับลำดับเวลาที่ 5 + +```python +timesteps=5 +``` + +แปลงข้อมูลชุดฝึกเป็น 2D tensor โดยใช้ nested list comprehension: + +```python +train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0] +train_data_timesteps.shape +``` + +```output +(1412, 5) +``` + +แปลงข้อมูลชุดทดสอบเป็น 2D 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) +``` + +เลือกอินพุตและเอาต์พุตจากข้อมูลชุดฝึกและชุดทดสอบ: + +```python +x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]] +x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]] + +print(x_train.shape, y_train.shape) +print(x_test.shape, y_test.shape) +``` + +```output +(1412, 4) (1412, 1) +(44, 4) (44, 1) +``` + +### ใช้ SVR [^1] + +ตอนนี้ถึงเวลาที่จะใช้ SVR หากต้องการอ่านเพิ่มเติมเกี่ยวกับการใช้งานนี้ คุณสามารถดูได้ที่ [เอกสารนี้](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html) สำหรับการใช้งานของเรา เราจะทำตามขั้นตอนดังนี้: + +1. กำหนดโมเดลโดยเรียก `SVR()` และส่งผ่านไฮเปอร์พารามิเตอร์ของโมเดล: kernel, gamma, c และ epsilon +2. เตรียมโมเดลสำหรับข้อมูลชุดฝึกโดยเรียกฟังก์ชัน `fit()` +3. ทำการพยากรณ์โดยเรียกฟังก์ชัน `predict()` + +ตอนนี้เราจะสร้างโมเดล SVR โดยใช้ [RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) และตั้งค่าไฮเปอร์พารามิเตอร์ gamma, C และ epsilon เป็น 0.5, 10 และ 0.05 ตามลำดับ + +```python +model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05) +``` + +#### ฝึกโมเดลบนข้อมูลชุดฝึก [^1] + +```python +model.fit(x_train, y_train[:,0]) +``` + +```output +SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5, + kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False) +``` + +#### ทำการพยากรณ์ด้วยโมเดล [^1] + +```python +y_train_pred = model.predict(x_train).reshape(-1,1) +y_test_pred = model.predict(x_test).reshape(-1,1) + +print(y_train_pred.shape, y_test_pred.shape) +``` + +```output +(1412, 1) (44, 1) +``` + +คุณได้สร้าง SVR ของคุณแล้ว! ตอนนี้เราต้องประเมินผลลัพธ์ + +### ประเมินโมเดลของคุณ [^1] + +สำหรับการประเมินผล ขั้นแรกเราจะปรับขนาดข้อมูลกลับไปยังสเกลเดิม จากนั้นเพื่อเช็คประสิทธิภาพ เราจะสร้างกราฟเปรียบเทียบข้อมูลจริงและข้อมูลที่พยากรณ์ และพิมพ์ผลลัพธ์ MAPE + +ปรับขนาดข้อมูลที่พยากรณ์และข้อมูลจริงกลับ: + +```python +# Scaling the predictions +y_train_pred = scaler.inverse_transform(y_train_pred) +y_test_pred = scaler.inverse_transform(y_test_pred) + +print(len(y_train_pred), len(y_test_pred)) +``` + +```python +# Scaling the original values +y_train = scaler.inverse_transform(y_train) +y_test = scaler.inverse_transform(y_test) + +print(len(y_train), len(y_test)) +``` + +#### ตรวจสอบประสิทธิภาพโมเดลบนข้อมูลชุดฝึกและชุดทดสอบ [^1] + +เราจะดึง timestamps จากชุดข้อมูลเพื่อแสดงในแกน x ของกราฟ โปรดทราบว่าเราใช้ ```timesteps-1``` ค่าแรกเป็นอินพุตสำหรับเอาต์พุตแรก ดังนั้น timestamps สำหรับเอาต์พุตจะเริ่มหลังจากนั้น + +```python +train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:] +test_timestamps = energy[test_start_dt:].index[timesteps-1:] + +print(len(train_timestamps), len(test_timestamps)) +``` + +```output +1412 44 +``` + +สร้างกราฟการพยากรณ์สำหรับข้อมูลชุดฝึก: + +```python +plt.figure(figsize=(25,6)) +plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.title("Training data prediction") +plt.show() +``` + +![training data prediction](../../../../7-TimeSeries/3-SVR/images/train-data-predict.png) + +พิมพ์ค่า MAPE สำหรับข้อมูลชุดฝึก + +```python +print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%') +``` + +```output +MAPE for training data: 1.7195710200875551 % +``` + +สร้างกราฟการพยากรณ์สำหรับข้อมูลชุดทดสอบ + +```python +plt.figure(figsize=(10,3)) +plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![testing data prediction](../../../../7-TimeSeries/3-SVR/images/test-data-predict.png) + +พิมพ์ค่า MAPE สำหรับข้อมูลชุดทดสอบ + +```python +print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%') +``` + +```output +MAPE for testing data: 1.2623790187854018 % +``` + +🏆 คุณได้ผลลัพธ์ที่ดีมากบนชุดข้อมูลทดสอบ! + +### ตรวจสอบประสิทธิภาพโมเดลบนชุดข้อมูลทั้งหมด [^1] + +```python +# Extracting load values as numpy array +data = energy.copy().values + +# Scaling +data = scaler.transform(data) + +# Transforming to 2D tensor as per model input requirement +data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0] +print("Tensor shape: ", data_timesteps.shape) + +# Selecting inputs and outputs from data +X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]] +print("X shape: ", X.shape,"\nY shape: ", Y.shape) +``` + +```output +Tensor shape: (26300, 5) +X shape: (26300, 4) +Y shape: (26300, 1) +``` + +```python +# Make model predictions +Y_pred = model.predict(X).reshape(-1,1) + +# Inverse scale and reshape +Y_pred = scaler.inverse_transform(Y_pred) +Y = scaler.inverse_transform(Y) +``` + +```python +plt.figure(figsize=(30,8)) +plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6) +plt.plot(Y_pred, color = 'blue', linewidth=0.8) +plt.legend(['Actual','Predicted']) +plt.xlabel('Timestamp') +plt.show() +``` + +![full data prediction](../../../../7-TimeSeries/3-SVR/images/full-data-predict.png) + +```python +print('MAPE: ', mape(Y_pred, Y)*100, '%') +``` + +```output +MAPE: 2.0572089029888656 % +``` + +🏆 กราฟที่สวยงามมาก แสดงให้เห็นว่าโมเดลมีความแม่นยำที่ดี ยอดเยี่ยมมาก! + +--- + +## 🚀ความท้าทาย + +- ลองปรับไฮเปอร์พารามิเตอร์ (gamma, C, epsilon) ขณะสร้างโมเดลและประเมินผลบนข้อมูลเพื่อดูว่าชุดไฮเปอร์พารามิเตอร์ใดให้ผลลัพธ์ที่ดีที่สุดบนข้อมูลชุดทดสอบ หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับไฮเปอร์พารามิเตอร์เหล่านี้ คุณสามารถดูเอกสาร [ที่นี่](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) +- ลองใช้ฟังก์ชัน kernel แบบต่างๆ สำหรับโมเดลและวิเคราะห์ประสิทธิภาพของพวกมันบนชุดข้อมูล เอกสารที่เป็นประโยชน์สามารถดูได้ [ที่นี่](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) +- ลองใช้ค่าที่แตกต่างกันสำหรับ `timesteps` เพื่อให้โมเดลย้อนกลับไปดูข้อมูลเพื่อทำการพยากรณ์ + +## [แบบทดสอบหลังเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ทบทวนและศึกษาด้วยตนเอง + +บทเรียนนี้เป็นการแนะนำการใช้ SVR สำหรับการพยากรณ์ข้อมูลอนุกรมเวลา หากต้องการอ่านเพิ่มเติมเกี่ยวกับ SVR คุณสามารถดูได้ที่ [บล็อกนี้](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/) เอกสารนี้ [scikit-learn documentation](https://scikit-learn.org/stable/modules/svm.html) ให้คำอธิบายที่ครอบคลุมมากขึ้นเกี่ยวกับ SVM โดยทั่วไป [SVRs](https://scikit-learn.org/stable/modules/svm.html#regression) และรายละเอียดการใช้งานอื่นๆ เช่น [ฟังก์ชัน kernel](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) ที่สามารถใช้ได้และพารามิเตอร์ของพวกมัน + +## งานที่ได้รับมอบหมาย + +[โมเดล SVR ใหม่](assignment.md) + +## เครดิต + +[^1]: ข้อความ โค้ด และผลลัพธ์ในส่วนนี้ได้รับการสนับสนุนโดย [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD) +[^2]: ข้อความ โค้ด และผลลัพธ์ในส่วนนี้นำมาจาก [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/7-TimeSeries/3-SVR/assignment.md b/translations/th/7-TimeSeries/3-SVR/assignment.md new file mode 100644 index 000000000..681a738f0 --- /dev/null +++ b/translations/th/7-TimeSeries/3-SVR/assignment.md @@ -0,0 +1,29 @@ + +# โมเดล SVR ใหม่ + +## คำแนะนำ [^1] + +หลังจากที่คุณสร้างโมเดล SVR แล้ว ให้สร้างโมเดลใหม่โดยใช้ข้อมูลใหม่ (ลองใช้หนึ่งใน [ชุดข้อมูลเหล่านี้จาก Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)) เพิ่มคำอธิบายในโน้ตบุ๊กของคุณ แสดงภาพข้อมูลและโมเดลของคุณ และทดสอบความแม่นยำโดยใช้กราฟที่เหมาะสมและ MAPE นอกจากนี้ ลองปรับค่าพารามิเตอร์ต่าง ๆ และลองใช้ค่าที่แตกต่างกันสำหรับ timesteps ด้วย + +## รูบริก [^1] + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| -------- | ------------------------------------------------------------ | --------------------------------------------------------- | ----------------------------------- | +| | มีโน้ตบุ๊กที่นำเสนอโมเดล SVR ที่สร้าง ทดสอบ และอธิบายด้วยการแสดงภาพ พร้อมระบุความแม่นยำ | โน้ตบุ๊กที่นำเสนอไม่มีคำอธิบายหรือมีข้อผิดพลาด | โน้ตบุ๊กที่นำเสนอไม่สมบูรณ์ | + + + +[^1]:ข้อความในส่วนนี้อ้างอิงจาก [งานมอบหมายจาก ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/7-TimeSeries/README.md b/translations/th/7-TimeSeries/README.md new file mode 100644 index 000000000..83b660ec2 --- /dev/null +++ b/translations/th/7-TimeSeries/README.md @@ -0,0 +1,37 @@ + +# การแนะนำการพยากรณ์อนุกรมเวลา + +การพยากรณ์อนุกรมเวลาคืออะไร? มันคือการคาดการณ์เหตุการณ์ในอนาคตโดยการวิเคราะห์แนวโน้มในอดีต + +## หัวข้อภูมิภาค: การใช้ไฟฟ้าทั่วโลก ✨ + +ในสองบทเรียนนี้ คุณจะได้เรียนรู้เกี่ยวกับการพยากรณ์อนุกรมเวลา ซึ่งเป็นพื้นที่ที่ค่อนข้างไม่ค่อยมีคนรู้จักในด้านการเรียนรู้ของเครื่อง แต่มีคุณค่ามากสำหรับการใช้งานในอุตสาหกรรมและธุรกิจ รวมถึงสาขาอื่นๆ แม้ว่าเครือข่ายประสาทเทียมสามารถนำมาใช้เพื่อเพิ่มประสิทธิภาพของโมเดลเหล่านี้ได้ แต่เราจะศึกษาในบริบทของการเรียนรู้ของเครื่องแบบดั้งเดิม เนื่องจากโมเดลช่วยคาดการณ์ประสิทธิภาพในอนาคตโดยอ้างอิงจากข้อมูลในอดีต + +หัวข้อภูมิภาคของเราคือการใช้ไฟฟ้าทั่วโลก ซึ่งเป็นชุดข้อมูลที่น่าสนใจสำหรับการเรียนรู้เกี่ยวกับการพยากรณ์การใช้พลังงานในอนาคตโดยอ้างอิงจากรูปแบบการใช้ในอดีต คุณจะเห็นว่าการพยากรณ์ประเภทนี้สามารถเป็นประโยชน์อย่างมากในสภาพแวดล้อมทางธุรกิจ + +![electric grid](../../../7-TimeSeries/images/electric-grid.jpg) + +ภาพถ่ายโดย [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) ของเสาไฟฟ้าบนถนนในรัฐราชสถานบน [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +## บทเรียน + +1. [การแนะนำการพยากรณ์อนุกรมเวลา](1-Introduction/README.md) +2. [การสร้างโมเดล ARIMA สำหรับอนุกรมเวลา](2-ARIMA/README.md) +3. [การสร้าง Support Vector Regressor สำหรับการพยากรณ์อนุกรมเวลา](3-SVR/README.md) + +## เครดิต + +"การแนะนำการพยากรณ์อนุกรมเวลา" เขียนด้วย ⚡️ โดย [Francesca Lazzeri](https://twitter.com/frlazzeri) และ [Jen Looper](https://twitter.com/jenlooper) โน้ตบุ๊กปรากฏออนไลน์ครั้งแรกใน [Azure "Deep Learning For Time Series" repo](https://github.com/Azure/DeepLearningForTimeSeriesForecasting) ซึ่งเขียนโดย Francesca Lazzeri บทเรียน SVR เขียนโดย [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/8-Reinforcement/1-QLearning/README.md b/translations/th/8-Reinforcement/1-QLearning/README.md new file mode 100644 index 000000000..ba0ae7606 --- /dev/null +++ b/translations/th/8-Reinforcement/1-QLearning/README.md @@ -0,0 +1,256 @@ + +# การแนะนำเกี่ยวกับ Reinforcement Learning และ Q-Learning + +![สรุปเกี่ยวกับ reinforcement ใน machine learning ในรูปแบบ sketchnote](../../../../sketchnotes/ml-reinforcement.png) +> Sketchnote โดย [Tomomi Imura](https://www.twitter.com/girlie_mac) + +Reinforcement learning เกี่ยวข้องกับแนวคิดสำคัญสามประการ: ตัวแทน (agent), สถานะ (state) และชุดของการกระทำ (action) ต่อสถานะหนึ่งๆ โดยการดำเนินการกระทำในสถานะที่กำหนด ตัวแทนจะได้รับรางวัล ลองจินตนาการถึงเกมคอมพิวเตอร์ Super Mario คุณคือ Mario คุณอยู่ในด่านเกม ยืนอยู่ข้างหน้าผา ด้านบนคุณมีเหรียญ คุณในฐานะ Mario อยู่ในด่านเกม ณ ตำแหน่งที่เฉพาะเจาะจง ... นั่นคือสถานะของคุณ การก้าวไปทางขวาหนึ่งก้าว (การกระทำ) จะทำให้คุณตกหน้าผา และนั่นจะทำให้คุณได้คะแนนต่ำ อย่างไรก็ตาม การกดปุ่มกระโดดจะทำให้คุณได้คะแนนและยังมีชีวิตอยู่ นั่นคือผลลัพธ์ที่ดีและควรให้คะแนนเชิงบวกแก่คุณ + +โดยการใช้ reinforcement learning และตัวจำลอง (simulator) เช่นเกม คุณสามารถเรียนรู้วิธีการเล่นเกมเพื่อเพิ่มรางวัลให้ได้มากที่สุด ซึ่งก็คือการมีชีวิตรอดและทำคะแนนให้ได้มากที่สุด + +[![แนะนำเกี่ยวกับ Reinforcement Learning](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo) + +> 🎥 คลิกที่ภาพด้านบนเพื่อฟัง Dmitry อธิบายเกี่ยวกับ Reinforcement Learning + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## ความต้องการเบื้องต้นและการตั้งค่า + +ในบทเรียนนี้ เราจะทดลองกับโค้ดใน Python คุณควรสามารถรันโค้ดใน Jupyter Notebook จากบทเรียนนี้ได้ ไม่ว่าจะบนคอมพิวเตอร์ของคุณหรือในระบบคลาวด์ + +คุณสามารถเปิด [สมุดบันทึกบทเรียน](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) และทำตามบทเรียนนี้เพื่อสร้างโปรเจกต์ + +> **หมายเหตุ:** หากคุณเปิดโค้ดนี้จากระบบคลาวด์ คุณจะต้องดึงไฟล์ [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py) ซึ่งใช้ในโค้ดของสมุดบันทึกนี้ด้วย ให้วางไฟล์นี้ในไดเรกทอรีเดียวกับสมุดบันทึก + +## บทนำ + +ในบทเรียนนี้ เราจะสำรวจโลกของ **[Peter and the Wolf](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)** ซึ่งได้รับแรงบันดาลใจจากนิทานดนตรีโดยนักประพันธ์ชาวรัสเซีย [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev) เราจะใช้ **Reinforcement Learning** เพื่อให้ Peter สำรวจสภาพแวดล้อม เก็บแอปเปิ้ลอร่อยๆ และหลีกเลี่ยงการพบกับหมาป่า + +**Reinforcement Learning** (RL) เป็นเทคนิคการเรียนรู้ที่ช่วยให้เราสามารถเรียนรู้พฤติกรรมที่เหมาะสมที่สุดของ **agent** ใน **environment** โดยการทดลองหลายๆ ครั้ง ตัวแทนในสภาพแวดล้อมนี้ควรมี **เป้าหมาย** ซึ่งกำหนดโดย **reward function** + +## สภาพแวดล้อม + +เพื่อความง่าย ลองพิจารณาโลกของ Peter เป็นกระดานสี่เหลี่ยมขนาด `width` x `height` ดังนี้: + +![สภาพแวดล้อมของ Peter](../../../../8-Reinforcement/1-QLearning/images/environment.png) + +แต่ละช่องในกระดานนี้สามารถเป็นได้: + +* **พื้นดิน** ซึ่ง Peter และสิ่งมีชีวิตอื่นๆ สามารถเดินได้ +* **น้ำ** ซึ่งแน่นอนว่าไม่สามารถเดินได้ +* **ต้นไม้** หรือ **หญ้า** ซึ่งเป็นที่ที่คุณสามารถพักผ่อนได้ +* **แอปเปิ้ล** ซึ่งเป็นสิ่งที่ Peter ยินดีที่จะหาเพื่อเลี้ยงตัวเอง +* **หมาป่า** ซึ่งเป็นอันตรายและควรหลีกเลี่ยง + +มีโมดูล Python แยกต่างหาก [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py) ซึ่งมีโค้ดสำหรับทำงานกับสภาพแวดล้อมนี้ เนื่องจากโค้ดนี้ไม่สำคัญต่อการทำความเข้าใจแนวคิดของเรา เราจะนำเข้าโมดูลและใช้มันเพื่อสร้างกระดานตัวอย่าง (code block 1): + +```python +from rlboard import * + +width, height = 8,8 +m = Board(width,height) +m.randomize(seed=13) +m.plot() +``` + +โค้ดนี้ควรพิมพ์ภาพของสภาพแวดล้อมที่คล้ายกับภาพด้านบน + +## การกระทำและนโยบาย + +ในตัวอย่างของเรา เป้าหมายของ Peter คือการหาแอปเปิ้ล ในขณะที่หลีกเลี่ยงหมาป่าและสิ่งกีดขวางอื่นๆ เพื่อทำเช่นนี้ เขาสามารถเดินไปรอบๆ ได้จนกว่าจะพบแอปเปิ้ล + +ดังนั้น ในตำแหน่งใดๆ เขาสามารถเลือกหนึ่งในสี่การกระทำต่อไปนี้: ขึ้น, ลง, ซ้าย และขวา + +เราจะกำหนดการกระทำเหล่านี้เป็นพจนานุกรม และจับคู่กับคู่ของการเปลี่ยนแปลงพิกัดที่สอดคล้องกัน ตัวอย่างเช่น การเคลื่อนไปทางขวา (`R`) จะสอดคล้องกับคู่ `(1,0)` (code block 2): + +```python +actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) } +action_idx = { a : i for i,a in enumerate(actions.keys()) } +``` + +สรุปแล้ว กลยุทธ์และเป้าหมายของสถานการณ์นี้คือ: + +- **กลยุทธ์** ของตัวแทนของเรา (Peter) ถูกกำหนดโดยสิ่งที่เรียกว่า **policy** นโยบายคือฟังก์ชันที่ส่งคืนการกระทำในสถานะที่กำหนด ในกรณีของเรา สถานะของปัญหาถูกแสดงโดยกระดาน รวมถึงตำแหน่งปัจจุบันของผู้เล่น + +- **เป้าหมาย** ของ reinforcement learning คือการเรียนรู้นโยบายที่ดีที่จะช่วยให้เราสามารถแก้ปัญหาได้อย่างมีประสิทธิภาพ อย่างไรก็ตาม ในฐานะพื้นฐาน ลองพิจารณานโยบายที่ง่ายที่สุดที่เรียกว่า **random walk** + +## Random walk + +ลองแก้ปัญหาของเราด้วยการใช้กลยุทธ์ random walk ก่อน ด้วย random walk เราจะสุ่มเลือกการกระทำถัดไปจากการกระทำที่อนุญาต จนกว่าจะถึงแอปเปิ้ล (code block 3) + +1. ใช้ random walk ด้วยโค้ดด้านล่าง: + + ```python + def random_policy(m): + return random.choice(list(actions)) + + def walk(m,policy,start_position=None): + n = 0 # number of steps + # set initial position + if start_position: + m.human = start_position + else: + m.random_start() + while True: + if m.at() == Board.Cell.apple: + return n # success! + if m.at() in [Board.Cell.wolf, Board.Cell.water]: + return -1 # eaten by wolf or drowned + while True: + a = actions[policy(m)] + new_pos = m.move_pos(m.human,a) + if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water: + m.move(a) # do the actual move + break + n+=1 + + walk(m,random_policy) + ``` + + การเรียก `walk` ควรส่งคืนความยาวของเส้นทางที่สอดคล้องกัน ซึ่งอาจแตกต่างกันไปในแต่ละรอบ + +1. รันการทดลองเดินหลายครั้ง (เช่น 100 ครั้ง) และพิมพ์สถิติที่ได้ (code block 4): + + ```python + def print_statistics(policy): + s,w,n = 0,0,0 + for _ in range(100): + z = walk(m,policy) + if z<0: + w+=1 + else: + s += z + n += 1 + print(f"Average path length = {s/n}, eaten by wolf: {w} times") + + print_statistics(random_policy) + ``` + + สังเกตว่าความยาวเฉลี่ยของเส้นทางอยู่ที่ประมาณ 30-40 ก้าว ซึ่งค่อนข้างมาก เมื่อพิจารณาจากระยะทางเฉลี่ยไปยังแอปเปิ้ลที่ใกล้ที่สุดซึ่งอยู่ที่ประมาณ 5-6 ก้าว + + คุณยังสามารถดูการเคลื่อนไหวของ Peter ระหว่าง random walk ได้: + + ![การเดินแบบสุ่มของ Peter](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif) + +## Reward function + +เพื่อทำให้นโยบายของเราฉลาดขึ้น เราจำเป็นต้องเข้าใจว่าการเคลื่อนไหวใด "ดีกว่า" การเคลื่อนไหวอื่นๆ เพื่อทำเช่นนี้ เราจำเป็นต้องกำหนดเป้าหมายของเรา + +เป้าหมายสามารถกำหนดในแง่ของ **reward function** ซึ่งจะส่งคืนค่าคะแนนสำหรับแต่ละสถานะ ยิ่งตัวเลขสูง ยิ่งได้รางวัลที่ดี (code block 5) + +```python +move_reward = -0.1 +goal_reward = 10 +end_reward = -10 + +def reward(m,pos=None): + pos = pos or m.human + if not m.is_valid(pos): + return end_reward + x = m.at(pos) + if x==Board.Cell.water or x == Board.Cell.wolf: + return end_reward + if x==Board.Cell.apple: + return goal_reward + return move_reward +``` + +สิ่งที่น่าสนใจเกี่ยวกับ reward function คือในกรณีส่วนใหญ่ *เราจะได้รับรางวัลที่สำคัญเมื่อสิ้นสุดเกมเท่านั้น* ซึ่งหมายความว่าอัลกอริทึมของเราควรจำ "ก้าวที่ดี" ที่นำไปสู่รางวัลเชิงบวกในตอนท้าย และเพิ่มความสำคัญของมัน ในทำนองเดียวกัน การเคลื่อนไหวทั้งหมดที่นำไปสู่ผลลัพธ์ที่ไม่ดีควรถูกลดความสำคัญลง + +## Q-Learning + +อัลกอริทึมที่เราจะพูดถึงที่นี่เรียกว่า **Q-Learning** ในอัลกอริทึมนี้ นโยบายถูกกำหนดโดยฟังก์ชัน (หรือโครงสร้างข้อมูล) ที่เรียกว่า **Q-Table** ซึ่งบันทึก "ความดี" ของแต่ละการกระทำในสถานะที่กำหนด + +มันถูกเรียกว่า Q-Table เพราะมักจะสะดวกที่จะแสดงมันเป็นตาราง หรืออาร์เรย์หลายมิติ เนื่องจากกระดานของเรามีมิติ `width` x `height` เราสามารถแสดง Q-Table โดยใช้อาร์เรย์ numpy ที่มีรูปร่าง `width` x `height` x `len(actions)`: (code block 6) + +```python +Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions) +``` + +สังเกตว่าเราเริ่มต้นค่าทั้งหมดใน Q-Table ด้วยค่าที่เท่ากัน ในกรณีของเรา - 0.25 ซึ่งสอดคล้องกับนโยบาย "random walk" เพราะการเคลื่อนไหวทั้งหมดในแต่ละสถานะมีค่าเท่ากัน เราสามารถส่ง Q-Table ไปยังฟังก์ชัน `plot` เพื่อแสดงภาพตารางบนกระดาน: `m.plot(Q)` + +![สภาพแวดล้อมของ Peter](../../../../8-Reinforcement/1-QLearning/images/env_init.png) + +ในแต่ละช่องจะมี "ลูกศร" ที่ระบุทิศทางการเคลื่อนไหวที่ต้องการ เนื่องจากทุกทิศทางเท่ากัน จึงแสดงเป็นจุด + +ตอนนี้เราจำเป็นต้องรันการจำลอง สำรวจสภาพแวดล้อมของเรา และเรียนรู้การแจกแจงค่าของ Q-Table ที่ดีกว่า ซึ่งจะช่วยให้เราหาเส้นทางไปยังแอปเปิ้ลได้เร็วขึ้นมาก + +## แก่นของ Q-Learning: สมการ Bellman + +เมื่อเราเริ่มเคลื่อนไหว การกระทำแต่ละครั้งจะมีรางวัลที่สอดคล้องกัน กล่าวคือ เราสามารถเลือกการกระทำถัดไปตามรางวัลที่ได้รับทันที อย่างไรก็ตาม ในสถานะส่วนใหญ่ การเคลื่อนไหวจะไม่บรรลุเป้าหมายของเราในการไปถึงแอปเปิ้ล และดังนั้นเราจึงไม่สามารถตัดสินใจได้ทันทีว่าทิศทางใดดีกว่า + +> จำไว้ว่าสิ่งที่สำคัญไม่ใช่ผลลัพธ์ทันที แต่เป็นผลลัพธ์สุดท้ายที่เราจะได้รับเมื่อสิ้นสุดการจำลอง + +เพื่อพิจารณารางวัลที่ล่าช้า เราจำเป็นต้องใช้หลักการของ **[dynamic programming](https://en.wikipedia.org/wiki/Dynamic_programming)** ซึ่งช่วยให้เราคิดเกี่ยวกับปัญหาในเชิงเวียนกลับ + +สมมติว่าเรากำลังอยู่ในสถานะ *s* และเราต้องการเคลื่อนไปยังสถานะถัดไป *s'* โดยการทำเช่นนี้ เราจะได้รับรางวัลทันที *r(s,a)* ซึ่งกำหนดโดย reward function บวกกับรางวัลในอนาคตบางส่วน หากเราสมมติว่า Q-Table ของเราสะท้อนถึง "ความน่าสนใจ" ของแต่ละการกระทำอย่างถูกต้องแล้ว ในสถานะ *s'* เราจะเลือกการกระทำ *a'* ที่สอดคล้องกับค่ามากที่สุดของ *Q(s',a')* ดังนั้น รางวัลในอนาคตที่ดีที่สุดที่เราสามารถได้รับในสถานะ *s* จะถูกกำหนดเป็น `max` + +## การตรวจสอบนโยบาย + +เนื่องจาก Q-Table แสดง "ความน่าสนใจ" ของแต่ละการกระทำในแต่ละสถานะ การใช้งานเพื่อกำหนดการนำทางที่มีประสิทธิภาพในโลกของเราจึงค่อนข้างง่าย ในกรณีที่ง่ายที่สุด เราสามารถเลือกการกระทำที่มีค่าที่สูงที่สุดใน Q-Table: (code block 9) + +```python +def qpolicy_strict(m): + x,y = m.human + v = probs(Q[x,y]) + a = list(actions)[np.argmax(v)] + return a + +walk(m,qpolicy_strict) +``` + +> หากคุณลองรันโค้ดด้านบนหลายครั้ง คุณอาจสังเกตเห็นว่าบางครั้งมัน "ค้าง" และคุณต้องกดปุ่ม STOP ในโน้ตบุ๊กเพื่อหยุดการทำงาน สาเหตุเกิดจากสถานการณ์ที่สองสถานะ "ชี้" ไปยังอีกสถานะหนึ่งในแง่ของค่าที่เหมาะสมที่สุดใน Q-Value ซึ่งทำให้ตัวแทนเคลื่อนที่วนเวียนระหว่างสถานะเหล่านั้นอย่างไม่สิ้นสุด + +## 🚀ความท้าทาย + +> **งานที่ 1:** ปรับฟังก์ชัน `walk` เพื่อจำกัดความยาวสูงสุดของเส้นทางโดยจำนวนก้าวที่กำหนด (เช่น 100) และดูว่าโค้ดด้านบนคืนค่านี้เป็นครั้งคราว + +> **งานที่ 2:** ปรับฟังก์ชัน `walk` เพื่อไม่ให้กลับไปยังสถานที่ที่เคยไปมาก่อนแล้ว วิธีนี้จะป้องกันไม่ให้ `walk` วนซ้ำ อย่างไรก็ตาม ตัวแทนอาจยังคงติดอยู่ในตำแหน่งที่ไม่สามารถหลบหนีได้ + +## การนำทาง + +นโยบายการนำทางที่ดีกว่าคือแบบที่เราใช้ระหว่างการฝึก ซึ่งรวมการใช้ประโยชน์จากข้อมูลที่มีอยู่และการสำรวจ ในนโยบายนี้ เราจะเลือกแต่ละการกระทำด้วยความน่าจะเป็นที่สัมพันธ์กับค่าที่อยู่ใน Q-Table กลยุทธ์นี้อาจยังทำให้ตัวแทนกลับไปยังตำแหน่งที่เคยสำรวจแล้ว แต่ดังที่คุณเห็นจากโค้ดด้านล่าง มันส่งผลให้เส้นทางเฉลี่ยสั้นลงมากไปยังตำแหน่งที่ต้องการ (จำไว้ว่า `print_statistics` รันการจำลอง 100 ครั้ง): (code block 10) + +```python +def qpolicy(m): + x,y = m.human + v = probs(Q[x,y]) + a = random.choices(list(actions),weights=v)[0] + return a + +print_statistics(qpolicy) +``` + +หลังจากรันโค้ดนี้ คุณควรได้ความยาวเส้นทางเฉลี่ยที่สั้นลงมากกว่าเดิม อยู่ในช่วงประมาณ 3-6 + +## การตรวจสอบกระบวนการเรียนรู้ + +ดังที่เราได้กล่าวไว้ กระบวนการเรียนรู้เป็นการสร้างสมดุลระหว่างการสำรวจและการใช้ความรู้ที่ได้รับเกี่ยวกับโครงสร้างของพื้นที่ปัญหา เราได้เห็นว่าผลลัพธ์ของการเรียนรู้ (ความสามารถในการช่วยตัวแทนค้นหาเส้นทางสั้นไปยังเป้าหมาย) ดีขึ้น แต่สิ่งที่น่าสนใจคือการสังเกตว่าความยาวเส้นทางเฉลี่ยเปลี่ยนแปลงอย่างไรระหว่างกระบวนการเรียนรู้: + +## สรุปการเรียนรู้ + +- **ความยาวเส้นทางเฉลี่ยเพิ่มขึ้น**: สิ่งที่เราเห็นคือในตอนแรก ความยาวเส้นทางเฉลี่ยเพิ่มขึ้น สาเหตุอาจเกิดจากเมื่อเราไม่รู้อะไรเกี่ยวกับสภาพแวดล้อม เรามักจะติดอยู่ในสถานะที่ไม่ดี เช่น น้ำหรือหมาป่า เมื่อเราเรียนรู้มากขึ้นและเริ่มใช้ความรู้นี้ เราสามารถสำรวจสภาพแวดล้อมได้นานขึ้น แต่เรายังไม่รู้ตำแหน่งของแอปเปิ้ลดีนัก + +- **ความยาวเส้นทางลดลงเมื่อเรียนรู้มากขึ้น**: เมื่อเราเรียนรู้มากพอ มันจะง่ายขึ้นสำหรับตัวแทนในการบรรลุเป้าหมาย และความยาวเส้นทางเริ่มลดลง อย่างไรก็ตาม เรายังเปิดโอกาสให้สำรวจ ดังนั้นเรามักจะเบี่ยงเบนออกจากเส้นทางที่ดีที่สุด และสำรวจตัวเลือกใหม่ ๆ ทำให้เส้นทางยาวกว่าที่ควรจะเป็น + +- **ความยาวเพิ่มขึ้นอย่างฉับพลัน**: สิ่งที่เราสังเกตเห็นในกราฟคือในบางจุด ความยาวเพิ่มขึ้นอย่างฉับพลัน สิ่งนี้บ่งชี้ถึงลักษณะสุ่มของกระบวนการ และในบางครั้งเราอาจ "ทำลาย" ค่าสัมประสิทธิ์ใน Q-Table โดยการเขียนทับด้วยค่าที่ใหม่ สิ่งนี้ควรลดลงโดยการลดอัตราการเรียนรู้ (เช่น ในช่วงท้ายของการฝึก เราปรับค่าของ Q-Table เพียงเล็กน้อย) + +โดยรวมแล้ว สิ่งสำคัญคือต้องจำไว้ว่าความสำเร็จและคุณภาพของกระบวนการเรียนรู้ขึ้นอยู่กับพารามิเตอร์ เช่น อัตราการเรียนรู้ การลดอัตราการเรียนรู้ และตัวคูณลดค่า พารามิเตอร์เหล่านี้มักถูกเรียกว่า **hyperparameters** เพื่อแยกความแตกต่างจาก **parameters** ซึ่งเราปรับแต่งระหว่างการฝึก (เช่น ค่าสัมประสิทธิ์ใน Q-Table) กระบวนการค้นหาค่าที่ดีที่สุดสำหรับ hyperparameters เรียกว่า **hyperparameter optimization** และมันสมควรได้รับการพูดถึงในหัวข้อแยกต่างหาก + +## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +## งานที่ได้รับมอบหมาย +[โลกที่สมจริงยิ่งขึ้น](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/8-Reinforcement/1-QLearning/assignment.md b/translations/th/8-Reinforcement/1-QLearning/assignment.md new file mode 100644 index 000000000..de080f1c2 --- /dev/null +++ b/translations/th/8-Reinforcement/1-QLearning/assignment.md @@ -0,0 +1,41 @@ + +# โลกที่สมจริงยิ่งขึ้น + +ในสถานการณ์ของเรา ปีเตอร์สามารถเคลื่อนที่ไปมาได้แทบจะโดยไม่รู้สึกเหนื่อยหรือหิวเลย ในโลกที่สมจริงยิ่งขึ้น เขาจะต้องนั่งพักเป็นครั้งคราว และต้องหาอาหารเพื่อเลี้ยงตัวเอง มาทำให้โลกของเราสมจริงยิ่งขึ้นโดยการเพิ่มกฎดังต่อไปนี้: + +1. เมื่อปีเตอร์เคลื่อนที่จากที่หนึ่งไปยังอีกที่หนึ่ง เขาจะสูญเสีย **พลังงาน** และได้รับ **ความเหนื่อยล้า** เพิ่มขึ้น +2. ปีเตอร์สามารถเพิ่มพลังงานได้โดยการกินแอปเปิ้ล +3. ปีเตอร์สามารถลดความเหนื่อยล้าได้โดยการพักผ่อนใต้ต้นไม้หรือบนหญ้า (เช่น เดินไปยังตำแหน่งบนกระดานที่มีต้นไม้หรือหญ้า - พื้นที่สีเขียว) +4. ปีเตอร์ต้องค้นหาและฆ่าหมาป่า +5. เพื่อที่จะฆ่าหมาป่า ปีเตอร์ต้องมีระดับพลังงานและความเหนื่อยล้าในระดับที่เหมาะสม มิฉะนั้นเขาจะพ่ายแพ้ในการต่อสู้ + +## คำแนะนำ + +ใช้ [notebook.ipynb](../../../../8-Reinforcement/1-QLearning/notebook.ipynb) ดั้งเดิมเป็นจุดเริ่มต้นสำหรับการแก้ปัญหาของคุณ + +ปรับฟังก์ชันรางวัลตามกฎของเกมที่กำหนดไว้ด้านบน รันอัลกอริทึมการเรียนรู้แบบเสริมกำลัง (Reinforcement Learning) เพื่อเรียนรู้กลยุทธ์ที่ดีที่สุดในการชนะเกม และเปรียบเทียบผลลัพธ์ของการเดินแบบสุ่มกับอัลกอริทึมของคุณในแง่ของจำนวนเกมที่ชนะและแพ้ + +> **Note**: ในโลกใหม่ของคุณ สถานะจะซับซ้อนมากขึ้น และนอกจากตำแหน่งของมนุษย์แล้วยังรวมถึงระดับความเหนื่อยล้าและพลังงาน คุณสามารถเลือกที่จะแสดงสถานะเป็นทูเพิล (Board, energy, fatigue) หรือกำหนดคลาสสำหรับสถานะ (คุณอาจต้องการสืบทอดจาก `Board`) หรือแม้กระทั่งปรับเปลี่ยนคลาส `Board` ดั้งเดิมใน [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py) + +ในคำตอบของคุณ กรุณาเก็บโค้ดที่รับผิดชอบกลยุทธ์การเดินแบบสุ่มไว้ และเปรียบเทียบผลลัพธ์ของอัลกอริทึมของคุณกับการเดินแบบสุ่มในตอนท้าย + +> **Note**: คุณอาจต้องปรับพารามิเตอร์ไฮเปอร์เพื่อให้มันทำงานได้ โดยเฉพาะจำนวนรอบการฝึก (epochs) เนื่องจากความสำเร็จของเกม (การต่อสู้กับหมาป่า) เป็นเหตุการณ์ที่เกิดขึ้นได้ยาก คุณสามารถคาดหวังเวลาฝึกที่นานขึ้น + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| | มีการนำเสนอสมุดบันทึกที่มีการกำหนดกฎของโลกใหม่ อัลกอริทึม Q-Learning และคำอธิบายข้อความบางส่วน Q-Learning สามารถปรับปรุงผลลัพธ์ได้อย่างมีนัยสำคัญเมื่อเปรียบเทียบกับการเดินแบบสุ่ม | มีการนำเสนอสมุดบันทึก อัลกอริทึม Q-Learning ถูกนำไปใช้และปรับปรุงผลลัพธ์เมื่อเปรียบเทียบกับการเดินแบบสุ่ม แต่ไม่มากนัก หรือสมุดบันทึกมีการอธิบายไม่ดีและโค้ดไม่มีโครงสร้างที่ดี | มีความพยายามในการกำหนดกฎของโลกใหม่ แต่ไม่สามารถทำให้อัลกอริทึม Q-Learning ทำงานได้ หรือฟังก์ชันรางวัลไม่ได้ถูกกำหนดอย่างสมบูรณ์ | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/8-Reinforcement/1-QLearning/solution/Julia/README.md b/translations/th/8-Reinforcement/1-QLearning/solution/Julia/README.md new file mode 100644 index 000000000..3c5921cd0 --- /dev/null +++ b/translations/th/8-Reinforcement/1-QLearning/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/8-Reinforcement/1-QLearning/solution/R/README.md b/translations/th/8-Reinforcement/1-QLearning/solution/R/README.md new file mode 100644 index 000000000..41664e924 --- /dev/null +++ b/translations/th/8-Reinforcement/1-QLearning/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/8-Reinforcement/2-Gym/README.md b/translations/th/8-Reinforcement/2-Gym/README.md new file mode 100644 index 000000000..0b23e0dee --- /dev/null +++ b/translations/th/8-Reinforcement/2-Gym/README.md @@ -0,0 +1,333 @@ + +## ข้อกำหนดเบื้องต้น + +ในบทเรียนนี้ เราจะใช้ไลบรารีที่เรียกว่า **OpenAI Gym** เพื่อจำลอง **สภาพแวดล้อม** ต่างๆ คุณสามารถรันโค้ดของบทเรียนนี้ในเครื่องของคุณเอง (เช่น จาก Visual Studio Code) ซึ่งการจำลองจะเปิดในหน้าต่างใหม่ หากคุณรันโค้ดออนไลน์ คุณอาจต้องปรับแต่งโค้ดเล็กน้อยตามที่อธิบายไว้ [ที่นี่](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7) + +## OpenAI Gym + +ในบทเรียนก่อน กฎของเกมและสถานะถูกกำหนดโดยคลาส `Board` ซึ่งเราได้สร้างขึ้นเอง ในที่นี้เราจะใช้ **สภาพแวดล้อมจำลอง** พิเศษ ซึ่งจะจำลองฟิสิกส์ของการทรงตัวของเสา หนึ่งในสภาพแวดล้อมจำลองที่ได้รับความนิยมมากที่สุดสำหรับการฝึกอัลกอริทึมการเรียนรู้แบบเสริมกำลังคือ [Gym](https://gym.openai.com/) ซึ่งได้รับการดูแลโดย [OpenAI](https://openai.com/) โดยการใช้ Gym นี้ เราสามารถสร้าง **สภาพแวดล้อม** ต่างๆ ตั้งแต่การจำลอง CartPole ไปจนถึงเกม Atari + +> **หมายเหตุ**: คุณสามารถดูสภาพแวดล้อมอื่นๆ ที่มีใน OpenAI Gym [ที่นี่](https://gym.openai.com/envs/#classic_control) + +ก่อนอื่น มาติดตั้ง Gym และนำเข้าไลบรารีที่จำเป็น (code block 1): + +```python +import sys +!{sys.executable} -m pip install gym + +import gym +import matplotlib.pyplot as plt +import numpy as np +import random +``` + +## แบบฝึกหัด - การเริ่มต้นสภาพแวดล้อม CartPole + +ในการทำงานกับปัญหาการทรงตัวของ CartPole เราจำเป็นต้องเริ่มต้นสภาพแวดล้อมที่เกี่ยวข้อง สภาพแวดล้อมแต่ละแห่งจะมี: + +- **Observation space** ที่กำหนดโครงสร้างของข้อมูลที่เราได้รับจากสภาพแวดล้อม สำหรับปัญหา CartPole เราจะได้รับตำแหน่งของเสา ความเร็ว และค่าบางอย่างอื่นๆ + +- **Action space** ที่กำหนดการกระทำที่เป็นไปได้ ในกรณีของเรา Action space เป็นแบบไม่ต่อเนื่อง และประกอบด้วยสองการกระทำ - **ซ้าย** และ **ขวา** (code block 2) + +1. ในการเริ่มต้น ให้พิมพ์โค้ดต่อไปนี้: + + ```python + env = gym.make("CartPole-v1") + print(env.action_space) + print(env.observation_space) + print(env.action_space.sample()) + ``` + +เพื่อดูว่าสภาพแวดล้อมทำงานอย่างไร ลองรันการจำลองสั้นๆ เป็นเวลา 100 ขั้นตอน ในแต่ละขั้นตอน เราจะให้การกระทำหนึ่งอย่างที่ต้องทำ - ในการจำลองนี้ เราเพียงแค่สุ่มเลือกการกระทำจาก `action_space` + +1. รันโค้ดด้านล่างและดูผลลัพธ์ที่ได้ + + ✅ จำไว้ว่าควรรันโค้ดนี้ในเครื่อง Python ที่ติดตั้งในเครื่องของคุณ! (code block 3) + + ```python + env.reset() + + for i in range(100): + env.render() + env.step(env.action_space.sample()) + env.close() + ``` + + คุณควรเห็นภาพที่คล้ายกับภาพนี้: + + ![non-balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif) + +1. ระหว่างการจำลอง เราจำเป็นต้องได้รับข้อมูลการสังเกตเพื่อที่จะตัดสินใจว่าจะทำอะไรต่อไป ในความเป็นจริง ฟังก์ชัน step จะคืนค่าการสังเกตปัจจุบัน ฟังก์ชันรางวัล และธง done ที่ระบุว่าควรดำเนินการจำลองต่อไปหรือไม่: (code block 4) + + ```python + env.reset() + + done = False + while not done: + env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + print(f"{obs} -> {rew}") + env.close() + ``` + + คุณจะเห็นผลลัพธ์ที่คล้ายกับนี้ในผลลัพธ์ของโน้ตบุ๊ก: + + ```text + [ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0 + [ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0 + [ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0 + [ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0 + [ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0 + ... + [ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0 + [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0 + ``` + + เวกเตอร์การสังเกตที่คืนค่ามาในแต่ละขั้นตอนของการจำลองประกอบด้วยค่าต่อไปนี้: + - ตำแหน่งของรถเข็น + - ความเร็วของรถเข็น + - มุมของเสา + - อัตราการหมุนของเสา + +1. รับค่าต่ำสุดและค่าสูงสุดของตัวเลขเหล่านั้น: (code block 5) + + ```python + print(env.observation_space.low) + print(env.observation_space.high) + ``` + + คุณอาจสังเกตเห็นว่าค่ารางวัลในแต่ละขั้นตอนของการจำลองมีค่าเท่ากับ 1 เสมอ นั่นเป็นเพราะเป้าหมายของเราคือการอยู่รอดให้นานที่สุดเท่าที่จะเป็นไปได้ กล่าวคือ รักษาเสาให้อยู่ในตำแหน่งแนวตั้งในระดับที่เหมาะสมให้นานที่สุด + + ✅ ในความเป็นจริง การจำลอง CartPole ถือว่าแก้ปัญหาได้หากเราสามารถรับรางวัลเฉลี่ย 195 ในการทดลองต่อเนื่อง 100 ครั้ง + +## การทำสถานะให้เป็นแบบไม่ต่อเนื่อง + +ใน Q-Learning เราจำเป็นต้องสร้าง Q-Table ที่กำหนดว่าจะทำอะไรในแต่ละสถานะ เพื่อที่จะทำสิ่งนี้ได้ เราจำเป็นต้องให้สถานะเป็นแบบ **ไม่ต่อเนื่อง** กล่าวคือ ควรมีจำนวนค่าที่ไม่ต่อเนื่องที่จำกัด ดังนั้นเราจำเป็นต้อง **ทำสถานะให้เป็นแบบไม่ต่อเนื่อง** โดยการแมปค่าการสังเกตไปยังชุดสถานะที่จำกัด + +มีวิธีการบางอย่างที่เราสามารถทำได้: + +- **แบ่งเป็นช่วง** หากเรารู้ช่วงของค่าบางค่า เราสามารถแบ่งช่วงนี้ออกเป็นจำนวน **ช่วง** และแทนค่าด้วยหมายเลขช่วงที่มันอยู่ วิธีนี้สามารถทำได้โดยใช้เมธอด [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) ของ numpy ในกรณีนี้ เราจะทราบขนาดของสถานะอย่างแม่นยำ เพราะมันจะขึ้นอยู่กับจำนวนช่วงที่เราเลือกสำหรับการทำให้เป็นแบบดิจิทัล + +✅ เราสามารถใช้การแทรกเชิงเส้นเพื่อปรับค่ามาอยู่ในช่วงที่จำกัด (เช่น จาก -20 ถึง 20) และจากนั้นแปลงตัวเลขเป็นจำนวนเต็มโดยการปัดเศษ วิธีนี้จะให้การควบคุมขนาดของสถานะน้อยลง โดยเฉพาะอย่างยิ่งหากเราไม่ทราบช่วงที่แน่นอนของค่าขาเข้า ตัวอย่างเช่น ในกรณีของเรา 2 ใน 4 ค่าจะไม่มีขอบเขตบน/ล่าง ซึ่งอาจส่งผลให้มีจำนวนสถานะที่ไม่มีที่สิ้นสุด + +ในตัวอย่างของเรา เราจะใช้วิธีที่สอง ตามที่คุณอาจสังเกตเห็นในภายหลัง แม้จะไม่มีขอบเขตบน/ล่าง ค่าดังกล่าวมักจะไม่ค่อยมีค่าที่อยู่นอกช่วงที่จำกัด ดังนั้นสถานะที่มีค่าที่สุดขั้วจะเกิดขึ้นได้ยาก + +1. นี่คือฟังก์ชันที่จะรับค่าการสังเกตจากโมเดลของเราและสร้างทูเพิลของค่าจำนวนเต็ม 4 ค่า: (code block 6) + + ```python + def discretize(x): + return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int)) + ``` + +1. ลองสำรวจวิธีการทำให้เป็นแบบไม่ต่อเนื่องด้วยช่วงอีกวิธีหนึ่ง: (code block 7) + + ```python + def create_bins(i,num): + return np.arange(num+1)*(i[1]-i[0])/num+i[0] + + print("Sample bins for interval (-5,5) with 10 bins\n",create_bins((-5,5),10)) + + ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # intervals of values for each parameter + nbins = [20,20,10,10] # number of bins for each parameter + bins = [create_bins(ints[i],nbins[i]) for i in range(4)] + + def discretize_bins(x): + return tuple(np.digitize(x[i],bins[i]) for i in range(4)) + ``` + +1. ตอนนี้ลองรันการจำลองสั้นๆ และสังเกตค่าของสภาพแวดล้อมที่ไม่ต่อเนื่อง ลองใช้ทั้ง `discretize` และ `discretize_bins` และดูว่ามีความแตกต่างหรือไม่ + + ✅ `discretize_bins` คืนหมายเลขช่วง ซึ่งเริ่มต้นที่ 0 ดังนั้นสำหรับค่าของตัวแปรขาเข้าที่อยู่รอบๆ 0 จะคืนค่าจากกลางช่วง (10) ใน `discretize` เราไม่ได้สนใจช่วงของค่าผลลัพธ์ ทำให้ค่าของสถานะไม่ถูกเลื่อน และ 0 ตรงกับ 0 (code block 8) + + ```python + env.reset() + + done = False + while not done: + #env.render() + obs, rew, done, info = env.step(env.action_space.sample()) + #print(discretize_bins(obs)) + print(discretize(obs)) + env.close() + ``` + + ✅ ยกเลิกการคอมเมนต์บรรทัดที่เริ่มต้นด้วย env.render หากคุณต้องการดูว่าสภาพแวดล้อมทำงานอย่างไร มิฉะนั้นคุณสามารถรันมันในพื้นหลัง ซึ่งจะเร็วกว่า เราจะใช้การรันแบบ "มองไม่เห็น" นี้ในระหว่างกระบวนการ Q-Learning ของเรา + +## โครงสร้างของ Q-Table + +ในบทเรียนก่อน สถานะเป็นคู่ของตัวเลขง่ายๆ จาก 0 ถึง 8 และดังนั้นจึงสะดวกที่จะแสดง Q-Table ด้วยเทนเซอร์ numpy ที่มีรูปร่าง 8x8x2 หากเราใช้การทำให้เป็นแบบไม่ต่อเนื่องด้วยช่วง ขนาดของเวกเตอร์สถานะของเราก็จะทราบเช่นกัน ดังนั้นเราสามารถใช้วิธีเดียวกันและแสดงสถานะด้วยอาร์เรย์ที่มีรูปร่าง 20x20x10x10x2 (ที่นี่ 2 คือมิติของ Action space และมิติแรกสอดคล้องกับจำนวนช่วงที่เราเลือกใช้สำหรับแต่ละพารามิเตอร์ใน Observation space) + +อย่างไรก็ตาม บางครั้งขนาดที่แน่นอนของ Observation space อาจไม่ทราบ ในกรณีของฟังก์ชัน `discretize` เราอาจไม่สามารถมั่นใจได้ว่าสถานะของเราจะอยู่ในขอบเขตที่แน่นอน เพราะค่าบางค่าของต้นฉบับไม่มีขอบเขต ดังนั้นเราจะใช้วิธีที่แตกต่างออกไปเล็กน้อยและแสดง Q-Table ด้วยดิกชันนารี + +1. ใช้คู่ *(state,action)* เป็นคีย์ของดิกชันนารี และค่าจะสอดคล้องกับค่าของ Q-Table (code block 9) + + ```python + Q = {} + actions = (0,1) + + def qvalues(state): + return [Q.get((state,a),0) for a in actions] + ``` + + ที่นี่เรายังได้กำหนดฟังก์ชัน `qvalues()` ซึ่งคืนค่ารายการ Q-Table สำหรับสถานะที่กำหนดซึ่งสอดคล้องกับการกระทำที่เป็นไปได้ทั้งหมด หากไม่มีรายการใน Q-Table เราจะคืนค่า 0 เป็นค่าเริ่มต้น + +## มาเริ่ม Q-Learning กันเถอะ + +ตอนนี้เราพร้อมที่จะสอน Peter ให้ทรงตัวแล้ว! + +1. ก่อนอื่น มาตั้งค่าพารามิเตอร์ไฮเปอร์บางตัว: (code block 10) + + ```python + # hyperparameters + alpha = 0.3 + gamma = 0.9 + epsilon = 0.90 + ``` + + ที่นี่ `alpha` คือ **learning rate** ที่กำหนดว่าเราควรปรับค่าปัจจุบันของ Q-Table ในแต่ละขั้นตอนมากน้อยเพียงใด ในบทเรียนก่อนเราเริ่มต้นด้วย 1 และจากนั้นลด `alpha` ลงในระหว่างการฝึก ในตัวอย่างนี้เราจะคงค่าคงที่ไว้เพื่อความเรียบง่าย และคุณสามารถทดลองปรับค่าของ `alpha` ได้ในภายหลัง + + `gamma` คือ **discount factor** ที่แสดงว่าเราควรให้ความสำคัญกับรางวัลในอนาคตมากกว่ารางวัลปัจจุบันมากน้อยเพียงใด + + `epsilon` คือ **exploration/exploitation factor** ที่กำหนดว่าเราควรเลือกการสำรวจมากกว่าการใช้ประโยชน์หรือไม่ ในอัลกอริทึมของเรา เราจะเลือกการกระทำถัดไปตามค่าของ Q-Table ในเปอร์เซ็นต์ของกรณีที่กำหนดโดย `epsilon` และในจำนวนที่เหลือเราจะดำเนินการแบบสุ่ม สิ่งนี้จะช่วยให้เราสำรวจพื้นที่การค้นหาที่เราไม่เคยเห็นมาก่อน + + ✅ ในแง่ของการทรงตัว - การเลือกการกระทำแบบสุ่ม (การสำรวจ) จะทำหน้าที่เป็นการผลักแบบสุ่มในทิศทางที่ผิด และเสาจะต้องเรียนรู้วิธีการฟื้นฟูสมดุลจาก "ข้อผิดพลาด" เหล่านั้น + +### ปรับปรุงอัลกอริทึม + +เรายังสามารถปรับปรุงอัลกอริทึมของเราจากบทเรียนก่อน: + +- **คำนวณรางวัลสะสมเฉลี่ย** ในการจำลองจำนวนหนึ่ง เราจะพิมพ์ความคืบหน้าทุกๆ 5000 รอบ และเราจะเฉลี่ยรางวัลสะสมในช่วงเวลานั้น หมายความว่าหากเราได้คะแนนมากกว่า 195 เราสามารถถือว่าปัญหาได้รับการแก้ไขแล้ว ด้วยคุณภาพที่สูงกว่าที่กำหนด + +- **คำนวณผลลัพธ์สะสมเฉลี่ยสูงสุด** `Qmax` และเราจะเก็บ Q-Table ที่สอดคล้องกับผลลัพธ์นั้น เมื่อคุณรันการฝึก คุณจะสังเกตเห็นว่าบางครั้งผลลัพธ์สะสมเฉลี่ยเริ่มลดลง และเราต้องการเก็บค่าของ Q-Table ที่สอดคล้องกับโมเดลที่ดีที่สุดที่สังเกตได้ระหว่างการฝึก + +1. เก็บรางวัลสะสมทั้งหมดในแต่ละการจำลองไว้ในเวกเตอร์ `rewards` เพื่อการพล็อตในภายหลัง (code block 11) + + ```python + def probs(v,eps=1e-4): + v = v-v.min()+eps + v = v/v.sum() + return v + + Qmax = 0 + cum_rewards = [] + rewards = [] + for epoch in range(100000): + obs = env.reset() + done = False + cum_reward=0 + # == do the simulation == + while not done: + s = discretize(obs) + if random.random() Qmax: + Qmax = np.average(cum_rewards) + Qbest = Q + cum_rewards=[] + ``` + +สิ่งที่คุณอาจสังเกตเห็นจากผลลัพธ์เหล่านั้น: + +- **ใกล้เป้าหมายของเรา** เราใกล้จะบรรลุเป้าหมายในการได้รับรางวัลสะสม 195 ในการรันการจำลองต่อเนื่อง 100+ ครั้ง หรือเราอาจบรรลุเป้าหมายแล้ว! แม้ว่าเราจะได้ตัวเลขที่น้อยกว่า เราก็ยังไม่ทราบ เพราะเราเฉลี่ยมากกว่า 5000 รอบ และมีเพียง 100 รอบที่จำเป็นในเกณฑ์อย่างเป็นทางการ + +- **รางวัลเริ่มลดลง** บางครั้งรางวัลเริ่มลดลง ซึ่งหมายความว่าเราอาจ "ทำลาย" ค่าที่เรียนรู้แล้วใน Q-Table ด้วยค่าที่ทำให้สถานการณ์แย่ลง + +การสังเกตนี้จะเห็นได้ชัดเจนขึ้นหากเราพล็อตความคืบหน้าการฝึก + +## การพล็อตความคืบหน้าการฝึก + +ระหว่างการฝึก เราได้เก็บค่ารางวัลสะสมในแต่ละรอบไว้ในเวกเตอร์ `rewards` นี่คือสิ่งที่มันดูเหมือนเมื่อเราพล็อตมันกับหมายเลขรอบ: + +```python +plt.plot(rewards) +``` + +![raw progress](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png) + +จากกราฟนี้ ไม่สามารถบอกอะไรได้ เพราะลักษณะของกระบวนการฝึกแบบสุ่มทำให้ความยาวของเซสชันการฝึกแตกต่างกันมาก เพื่อให้กราฟนี้มีความหมายมากขึ้น เราสามารถคำนวณ **ค่าเฉลี่ยเคลื่อนที่** ในการทดลองชุดหนึ่ง เช่น 100 สิ่งนี้สามารถทำได้อย่างสะดวกโดยใช้ `np.convolve`: (code block 12) + +```python +def running_average(x,window): + return np.convolve(x,np.ones(window)/window,mode='valid') + +plt.plot(running_average(rewards,100)) +``` + +![training progress](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png) + +## การปรับพารามิเตอร์ไฮเปอร์ + +เพื่อให้การเรียนรู้มีเสถียรภาพมากขึ้น มีเหตุผลที่จะปรับพารามิเตอร์ไฮเปอร์บางตัวระหว่างการฝึก โดยเฉพาะ: + +- **สำหรับ learning rate** `alpha` เราอาจเริ่มต้นด้วยค่าที่ใกล้เคียงกับ 1 และจากนั้นลดค่าพารามิเตอร์ลงเรื่อยๆ เมื่อเวลาผ่านไป เราจะได้รับค่าความน่าจะเป็นที่ดีใน Q-Table และดังนั้นเราควรปรับค่าพวกนั้นเล็กน้อย และไม่เขียนทับด้วยค่าที่ใหม่ทั้งหมด + +- **เพิ่ม epsilon** เราอาจต้องการเพิ่ม `epsilon` อย่างช้าๆ เพื่อสำรวจน้อยลงและใช้ประโยชน์มากขึ้น อาจมีเหตุผลที่จะเริ่มต้นด้วยค่าที่ต่ำของ `epsilon` และเพิ่มขึ้นจนเกือบถึง 1 +> **งานที่ 1**: ลองปรับค่าพารามิเตอร์ต่าง ๆ และดูว่าคุณสามารถทำให้ผลตอบแทนรวมสูงขึ้นได้หรือไม่ คุณได้คะแนนเกิน 195 หรือยัง? +> **งานที่ 2**: เพื่อแก้ปัญหาอย่างเป็นทางการ คุณจำเป็นต้องได้ค่าเฉลี่ยรางวัล 195 ในการทดลอง 100 ครั้งติดต่อกัน วัดผลระหว่างการฝึกและตรวจสอบให้แน่ใจว่าคุณได้แก้ปัญหาอย่างเป็นทางการแล้ว! + +## ดูผลลัพธ์ในทางปฏิบัติ + +มันน่าสนใจที่จะเห็นว่ารูปแบบที่ฝึกมาแล้วทำงานอย่างไร ลองรันการจำลองและใช้กลยุทธ์การเลือกการกระทำแบบเดียวกับที่ใช้ระหว่างการฝึก โดยสุ่มตามการแจกแจงความน่าจะเป็นใน Q-Table: (code block 13) + +```python +obs = env.reset() +done = False +while not done: + s = discretize(obs) + env.render() + v = probs(np.array(qvalues(s))) + a = random.choices(actions,weights=v)[0] + obs,_,done,_ = env.step(a) +env.close() +``` + +คุณควรเห็นบางสิ่งที่คล้ายกับนี้: + +![a balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif) + +--- + +## 🚀ความท้าทาย + +> **งานที่ 3**: ในที่นี้ เราใช้สำเนาสุดท้ายของ Q-Table ซึ่งอาจไม่ใช่ตัวที่ดีที่สุด อย่าลืมว่าเราได้บันทึก Q-Table ที่มีประสิทธิภาพดีที่สุดไว้ในตัวแปร `Qbest`! ลองใช้ตัวอย่างเดียวกันกับ Q-Table ที่มีประสิทธิภาพดีที่สุดโดยคัดลอก `Qbest` ไปยัง `Q` และดูว่าคุณสังเกตเห็นความแตกต่างหรือไม่ + +> **งานที่ 4**: ในที่นี้ เราไม่ได้เลือกการกระทำที่ดีที่สุดในแต่ละขั้นตอน แต่สุ่มตามการแจกแจงความน่าจะเป็นที่เกี่ยวข้อง จะสมเหตุสมผลกว่าหรือไม่ถ้าเลือกการกระทำที่ดีที่สุดเสมอ ซึ่งมีค่าที่สูงที่สุดใน Q-Table? สิ่งนี้สามารถทำได้โดยใช้ฟังก์ชัน `np.argmax` เพื่อค้นหาหมายเลขการกระทำที่สอดคล้องกับค่าที่สูงที่สุดใน Q-Table ลองใช้กลยุทธ์นี้และดูว่ามันช่วยปรับปรุงการทรงตัวหรือไม่ + +## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +## งานที่ได้รับมอบหมาย +[ฝึก Mountain Car](assignment.md) + +## สรุป + +ตอนนี้เราได้เรียนรู้วิธีการฝึกตัวแทนเพื่อให้ได้ผลลัพธ์ที่ดีเพียงแค่ให้ฟังก์ชันรางวัลที่กำหนดสถานะที่ต้องการของเกม และให้โอกาสพวกเขาสำรวจพื้นที่ค้นหาอย่างชาญฉลาด เราได้ใช้ Q-Learning algorithm สำเร็จในกรณีของสภาพแวดล้อมแบบไม่ต่อเนื่องและต่อเนื่อง แต่มีการกระทำแบบไม่ต่อเนื่อง + +สิ่งสำคัญคือต้องศึกษาสถานการณ์ที่สถานะการกระทำเป็นแบบต่อเนื่อง และเมื่อพื้นที่การสังเกตมีความซับซ้อนมากขึ้น เช่น ภาพจากหน้าจอเกม Atari ในปัญหาเหล่านี้เรามักต้องใช้เทคนิคการเรียนรู้ของเครื่องที่ทรงพลังมากขึ้น เช่น neural networks เพื่อให้ได้ผลลัพธ์ที่ดี หัวข้อที่ก้าวหน้ากว่านี้จะเป็นเนื้อหาในหลักสูตร AI ขั้นสูงของเราในอนาคต + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/8-Reinforcement/2-Gym/assignment.md b/translations/th/8-Reinforcement/2-Gym/assignment.md new file mode 100644 index 000000000..fdded980d --- /dev/null +++ b/translations/th/8-Reinforcement/2-Gym/assignment.md @@ -0,0 +1,57 @@ + +# ฝึก Mountain Car + +[OpenAI Gym](http://gym.openai.com) ถูกออกแบบมาให้ทุกสภาพแวดล้อมมี API เดียวกัน นั่นคือมีเมธอด `reset`, `step` และ `render` เหมือนกัน รวมถึงมีการจัดการ **action space** และ **observation space** ในรูปแบบเดียวกัน ดังนั้นจึงควรสามารถปรับอัลกอริทึม reinforcement learning เดียวกันให้เข้ากับสภาพแวดล้อมต่าง ๆ ได้โดยมีการเปลี่ยนแปลงโค้ดเพียงเล็กน้อย + +## สภาพแวดล้อม Mountain Car + +[Mountain Car environment](https://gym.openai.com/envs/MountainCar-v0/) มีรถที่ติดอยู่ในหุบเขา: + +เป้าหมายคือการออกจากหุบเขาและจับธง โดยในแต่ละขั้นตอนสามารถทำหนึ่งในสามการกระทำต่อไปนี้: + +| ค่า | ความหมาย | +|---|---| +| 0 | เร่งไปทางซ้าย | +| 1 | ไม่เร่ง | +| 2 | เร่งไปทางขวา | + +อย่างไรก็ตาม เคล็ดลับสำคัญของปัญหานี้คือเครื่องยนต์ของรถไม่แรงพอที่จะขึ้นภูเขาในครั้งเดียว ดังนั้นวิธีเดียวที่จะสำเร็จคือการขับรถไปมาเพื่อสร้างแรงเฉื่อย + +**Observation space** ประกอบด้วยค่าทั้งหมดสองค่า: + +| หมายเลข | การสังเกตการณ์ | ต่ำสุด | สูงสุด | +|-----|--------------|-----|-----| +| 0 | ตำแหน่งของรถ | -1.2| 0.6 | +| 1 | ความเร็วของรถ | -0.07 | 0.07 | + +ระบบรางวัลสำหรับ Mountain Car ค่อนข้างซับซ้อน: + + * รางวัล 0 จะได้รับเมื่อ agent ไปถึงธง (ตำแหน่ง = 0.5) บนยอดภูเขา + * รางวัล -1 จะได้รับเมื่อ agent มีตำแหน่งน้อยกว่า 0.5 + +**Episode** จะสิ้นสุดลงเมื่อรถมีตำแหน่งมากกว่า 0.5 หรือความยาวของ episode มากกว่า 200 + +## คำแนะนำ + +ปรับอัลกอริทึม reinforcement learning ของเราเพื่อแก้ปัญหา Mountain Car เริ่มต้นด้วยโค้ดใน [notebook.ipynb](../../../../8-Reinforcement/2-Gym/notebook.ipynb) เปลี่ยนสภาพแวดล้อมใหม่ ปรับฟังก์ชันการแยกสถานะ และพยายามทำให้อัลกอริทึมที่มีอยู่สามารถฝึกได้โดยมีการเปลี่ยนแปลงโค้ดน้อยที่สุด ปรับผลลัพธ์ให้เหมาะสมโดยการปรับ hyperparameters + +> **Note**: อาจจำเป็นต้องปรับ hyperparameters เพื่อให้อัลกอริทึมสามารถบรรลุผลสำเร็จได้ + +## เกณฑ์การประเมิน + +| เกณฑ์ | ดีเยี่ยม | พอใช้ | ต้องปรับปรุง | +| -------- | --------- | -------- | ----------------- | +| | อัลกอริทึม Q-Learning ถูกปรับจากตัวอย่าง CartPole ได้สำเร็จ โดยมีการเปลี่ยนแปลงโค้ดน้อยที่สุด และสามารถแก้ปัญหาการจับธงได้ภายใน 200 ขั้นตอน | อัลกอริทึม Q-Learning ใหม่ถูกนำมาใช้จากอินเทอร์เน็ต แต่มีการอธิบายอย่างดี; หรืออัลกอริทึมที่มีอยู่ถูกนำมาใช้ แต่ไม่สามารถบรรลุผลตามที่ต้องการ | นักเรียนไม่สามารถนำอัลกอริทึมใด ๆ มาใช้ได้สำเร็จ แต่ได้ทำขั้นตอนสำคัญไปสู่การแก้ปัญหา (เช่น การแยกสถานะ, โครงสร้างข้อมูล Q-Table ฯลฯ) | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/8-Reinforcement/2-Gym/solution/Julia/README.md b/translations/th/8-Reinforcement/2-Gym/solution/Julia/README.md new file mode 100644 index 000000000..182c22601 --- /dev/null +++ b/translations/th/8-Reinforcement/2-Gym/solution/Julia/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/8-Reinforcement/2-Gym/solution/R/README.md b/translations/th/8-Reinforcement/2-Gym/solution/R/README.md new file mode 100644 index 000000000..95632fbd2 --- /dev/null +++ b/translations/th/8-Reinforcement/2-Gym/solution/R/README.md @@ -0,0 +1,15 @@ + + + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/8-Reinforcement/README.md b/translations/th/8-Reinforcement/README.md new file mode 100644 index 000000000..016d4ac01 --- /dev/null +++ b/translations/th/8-Reinforcement/README.md @@ -0,0 +1,67 @@ + +# การแนะนำการเรียนรู้แบบเสริมกำลัง + +การเรียนรู้แบบเสริมกำลัง (Reinforcement Learning หรือ RL) ถือเป็นหนึ่งในรูปแบบพื้นฐานของการเรียนรู้ของเครื่อง (Machine Learning) ควบคู่ไปกับการเรียนรู้แบบมีผู้สอน (Supervised Learning) และการเรียนรู้แบบไม่มีผู้สอน (Unsupervised Learning) RL เกี่ยวข้องกับการตัดสินใจ: การตัดสินใจที่ถูกต้อง หรืออย่างน้อยก็เรียนรู้จากการตัดสินใจนั้น + +ลองจินตนาการว่าคุณมีสภาพแวดล้อมจำลอง เช่น ตลาดหุ้น หากคุณกำหนดกฎระเบียบบางอย่าง ผลลัพธ์จะเป็นบวกหรือเป็นลบ? หากเกิดผลลบ คุณต้องรับรู้ถึง _การเสริมกำลังเชิงลบ_ เรียนรู้จากมัน และปรับเปลี่ยนแนวทาง หากผลลัพธ์เป็นบวก คุณต้องสร้างต่อยอดจาก _การเสริมกำลังเชิงบวก_ นั้น + +![peter and the wolf](../../../8-Reinforcement/images/peter.png) + +> ปีเตอร์และเพื่อนๆ ต้องหนีจากหมาป่าที่หิวโหย! ภาพโดย [Jen Looper](https://twitter.com/jenlooper) + +## หัวข้อภูมิภาค: ปีเตอร์กับหมาป่า (รัสเซีย) + +[ปีเตอร์กับหมาป่า](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) เป็นนิทานดนตรีที่เขียนโดยนักประพันธ์ชาวรัสเซีย [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev) เป็นเรื่องราวของปีเตอร์ เด็กชายผู้กล้าหาญที่ออกจากบ้านไปยังป่าลึกเพื่อไล่ล่าหมาป่า ในส่วนนี้ เราจะฝึกอัลกอริทึมการเรียนรู้ของเครื่องเพื่อช่วยปีเตอร์: + +- **สำรวจ** พื้นที่โดยรอบและสร้างแผนที่การนำทางที่เหมาะสมที่สุด +- **เรียนรู้** วิธีใช้สเก็ตบอร์ดและทรงตัวบนมัน เพื่อให้เคลื่อนที่ได้เร็วขึ้น + +[![ปีเตอร์กับหมาป่า](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM) + +> 🎥 คลิกที่ภาพด้านบนเพื่อฟังเพลงปีเตอร์กับหมาป่าโดย Prokofiev + +## การเรียนรู้แบบเสริมกำลัง + +ในส่วนก่อนหน้านี้ คุณได้เห็นตัวอย่างของปัญหาการเรียนรู้ของเครื่องสองประเภท: + +- **แบบมีผู้สอน** ซึ่งเรามีชุดข้อมูลที่แนะนำวิธีแก้ปัญหาตัวอย่างที่เราต้องการแก้ไข [การจำแนกประเภท](../4-Classification/README.md) และ [การถดถอย](../2-Regression/README.md) เป็นงานการเรียนรู้แบบมีผู้สอน +- **แบบไม่มีผู้สอน** ซึ่งเราไม่มีข้อมูลการฝึกที่มีการติดป้ายกำกับ ตัวอย่างหลักของการเรียนรู้แบบไม่มีผู้สอนคือ [การจัดกลุ่ม](../5-Clustering/README.md) + +ในส่วนนี้ เราจะนำเสนอปัญหาการเรียนรู้รูปแบบใหม่ที่ไม่ต้องการข้อมูลการฝึกที่มีการติดป้ายกำกับ มีหลายประเภทของปัญหาเหล่านี้: + +- **[การเรียนรู้แบบกึ่งมีผู้สอน](https://wikipedia.org/wiki/Semi-supervised_learning)** ซึ่งเรามีข้อมูลที่ไม่มีการติดป้ายกำกับจำนวนมากที่สามารถใช้ในการฝึกโมเดลเบื้องต้น +- **[การเรียนรู้แบบเสริมกำลัง](https://wikipedia.org/wiki/Reinforcement_learning)** ซึ่งตัวแทน (Agent) เรียนรู้วิธีการทำงานโดยการทดลองในสภาพแวดล้อมจำลอง + +### ตัวอย่าง - เกมคอมพิวเตอร์ + +สมมติว่าคุณต้องการสอนคอมพิวเตอร์ให้เล่นเกม เช่น หมากรุก หรือ [Super Mario](https://wikipedia.org/wiki/Super_Mario) เพื่อให้คอมพิวเตอร์เล่นเกม เราต้องให้มันคาดการณ์ว่าจะเคลื่อนไหวอย่างไรในแต่ละสถานะของเกม แม้ว่าสิ่งนี้อาจดูเหมือนเป็นปัญหาการจำแนกประเภท แต่จริงๆ แล้วไม่ใช่ เพราะเราไม่มีชุดข้อมูลที่มีสถานะและการกระทำที่สอดคล้องกัน แม้ว่าเราอาจมีข้อมูลบางอย่าง เช่น เกมหมากรุกที่มีอยู่ หรือการบันทึกผู้เล่นที่เล่น Super Mario แต่ข้อมูลนั้นอาจไม่ครอบคลุมสถานะที่เป็นไปได้จำนวนมากพอ + +แทนที่จะค้นหาข้อมูลเกมที่มีอยู่ **การเรียนรู้แบบเสริมกำลัง** (RL) อิงตามแนวคิดของ *การทำให้คอมพิวเตอร์เล่น* หลายครั้งและสังเกตผลลัพธ์ ดังนั้น เพื่อใช้การเรียนรู้แบบเสริมกำลัง เราต้องมีสองสิ่ง: + +- **สภาพแวดล้อม** และ **ตัวจำลอง** ที่ช่วยให้เราเล่นเกมได้หลายครั้ง ตัวจำลองนี้จะกำหนดกฎของเกมทั้งหมด รวมถึงสถานะและการกระทำที่เป็นไปได้ + +- **ฟังก์ชันรางวัล** ซึ่งจะบอกเราว่าเราทำได้ดีแค่ไหนในแต่ละการเคลื่อนไหวหรือเกม + +ความแตกต่างหลักระหว่างการเรียนรู้ของเครื่องประเภทอื่นๆ และ RL คือใน RL เรามักไม่รู้ว่าเราชนะหรือแพ้จนกว่าเกมจะจบ ดังนั้น เราไม่สามารถบอกได้ว่าการเคลื่อนไหวบางอย่างเพียงอย่างเดียวดีหรือไม่ - เราจะได้รับรางวัลเมื่อจบเกมเท่านั้น และเป้าหมายของเราคือการออกแบบอัลกอริทึมที่ช่วยให้เราฝึกโมเดลภายใต้เงื่อนไขที่ไม่แน่นอน เราจะเรียนรู้เกี่ยวกับอัลกอริทึม RL ที่เรียกว่า **Q-learning** + +## บทเรียน + +1. [การแนะนำการเรียนรู้แบบเสริมกำลังและ Q-Learning](1-QLearning/README.md) +2. [การใช้สภาพแวดล้อมจำลองใน Gym](2-Gym/README.md) + +## เครดิต + +"การแนะนำการเรียนรู้แบบเสริมกำลัง" เขียนด้วย ♥️ โดย [Dmitry Soshnikov](http://soshnikov.com) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/9-Real-World/1-Applications/README.md b/translations/th/9-Real-World/1-Applications/README.md new file mode 100644 index 000000000..b9c4b5fd7 --- /dev/null +++ b/translations/th/9-Real-World/1-Applications/README.md @@ -0,0 +1,145 @@ + +# ปัจฉิมลิขิต: การเรียนรู้ของเครื่องในโลกแห่งความจริง + +![สรุปการเรียนรู้ของเครื่องในโลกแห่งความจริงในรูปแบบสเก็ตโน้ต](../../../../sketchnotes/ml-realworld.png) +> สเก็ตโน้ตโดย [Tomomi Imura](https://www.twitter.com/girlie_mac) + +ในหลักสูตรนี้ คุณได้เรียนรู้วิธีการเตรียมข้อมูลสำหรับการฝึกอบรมและสร้างโมเดลการเรียนรู้ของเครื่อง คุณได้สร้างชุดโมเดลคลาสสิก เช่น การถดถอย การจัดกลุ่ม การจำแนก การประมวลผลภาษาธรรมชาติ และโมเดลอนุกรมเวลา ยินดีด้วย! ตอนนี้คุณอาจสงสัยว่าสิ่งเหล่านี้มีประโยชน์อย่างไรในโลกแห่งความจริง... โมเดลเหล่านี้มีการนำไปใช้จริงในด้านใดบ้าง? + +แม้ว่าความสนใจในอุตสาหกรรมจะมุ่งไปที่ AI ซึ่งมักใช้การเรียนรู้เชิงลึก แต่โมเดลการเรียนรู้ของเครื่องแบบคลาสสิกยังคงมีการนำไปใช้ที่มีคุณค่า คุณอาจเคยใช้บางแอปพลิเคชันเหล่านี้ในชีวิตประจำวัน! ในบทเรียนนี้ คุณจะได้สำรวจว่าอุตสาหกรรมและโดเมนความรู้ 8 ประเภทใช้โมเดลเหล่านี้อย่างไรเพื่อทำให้แอปพลิเคชันมีประสิทธิภาพ เชื่อถือได้ ฉลาด และมีคุณค่าต่อผู้ใช้งานมากขึ้น + +## [แบบทดสอบก่อนเรียน](https://ff-quizzes.netlify.app/en/ml/) + +## 💰 การเงิน + +ภาคการเงินมีโอกาสมากมายสำหรับการเรียนรู้ของเครื่อง ปัญหาหลายอย่างในด้านนี้สามารถสร้างแบบจำลองและแก้ไขได้โดยใช้ ML + +### การตรวจจับการฉ้อโกงบัตรเครดิต + +เราได้เรียนรู้เกี่ยวกับ [k-means clustering](../../5-Clustering/2-K-Means/README.md) ในหลักสูตรก่อนหน้านี้ แต่จะนำไปใช้แก้ปัญหาการฉ้อโกงบัตรเครดิตได้อย่างไร? + +k-means clustering มีประโยชน์ในเทคนิคการตรวจจับการฉ้อโกงบัตรเครดิตที่เรียกว่า **การตรวจจับค่าผิดปกติ** ค่าผิดปกติ หรือการเบี่ยงเบนในข้อมูล สามารถบอกเราได้ว่าบัตรเครดิตถูกใช้งานในลักษณะปกติหรือมีสิ่งผิดปกติเกิดขึ้น ตามที่แสดงในเอกสารที่ลิงก์ด้านล่าง คุณสามารถจัดเรียงข้อมูลบัตรเครดิตโดยใช้ k-means clustering และจัดกลุ่มแต่ละธุรกรรมตามระดับความผิดปกติ จากนั้นคุณสามารถประเมินกลุ่มที่มีความเสี่ยงสูงที่สุดเพื่อแยกแยะธุรกรรมที่เป็นการฉ้อโกงหรือถูกต้อง +[อ้างอิง](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf) + +### การบริหารความมั่งคั่ง + +ในด้านการบริหารความมั่งคั่ง บุคคลหรือบริษัทจะจัดการการลงทุนในนามของลูกค้า งานของพวกเขาคือการรักษาและเพิ่มความมั่งคั่งในระยะยาว ดังนั้นจึงจำเป็นต้องเลือกการลงทุนที่มีผลการดำเนินงานดี + +วิธีหนึ่งในการประเมินผลการดำเนินงานของการลงทุนคือการใช้การถดถอยทางสถิติ [การถดถอยเชิงเส้น](../../2-Regression/1-Tools/README.md) เป็นเครื่องมือที่มีคุณค่าสำหรับการทำความเข้าใจว่ากองทุนมีผลการดำเนินงานอย่างไรเมื่อเทียบกับเกณฑ์มาตรฐาน นอกจากนี้เรายังสามารถสรุปได้ว่าผลลัพธ์ของการถดถอยมีนัยสำคัญทางสถิติหรือไม่ หรือมีผลกระทบต่อการลงทุนของลูกค้าอย่างไร คุณยังสามารถขยายการวิเคราะห์เพิ่มเติมโดยใช้การถดถอยพหุ ซึ่งสามารถนำปัจจัยเสี่ยงเพิ่มเติมมาพิจารณาได้ สำหรับตัวอย่างวิธีการทำงานนี้กับกองทุนเฉพาะ ลองดูเอกสารด้านล่างเกี่ยวกับการประเมินผลการดำเนินงานของกองทุนโดยใช้การถดถอย +[อ้างอิง](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/) + +## 🎓 การศึกษา + +ภาคการศึกษาก็เป็นอีกพื้นที่ที่น่าสนใจที่ ML สามารถนำไปใช้ได้ มีปัญหาที่น่าสนใจที่ต้องแก้ไข เช่น การตรวจจับการโกงในการสอบหรือเรียงความ หรือการจัดการอคติที่ตั้งใจหรือไม่ตั้งใจในกระบวนการตรวจแก้ + +### การทำนายพฤติกรรมของนักเรียน + +[Coursera](https://coursera.com) ผู้ให้บริการหลักสูตรออนไลน์แบบเปิด มีบล็อกเทคโนโลยีที่ยอดเยี่ยมซึ่งพวกเขาได้พูดถึงการตัดสินใจทางวิศวกรรมหลายอย่าง ในกรณีศึกษานี้ พวกเขาได้วางเส้นการถดถอยเพื่อสำรวจความสัมพันธ์ระหว่างคะแนน NPS (Net Promoter Score) ต่ำกับการคงอยู่หรือการถอนตัวจากหลักสูตร +[อ้างอิง](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a) + +### การลดอคติ + +[Grammarly](https://grammarly.com) ผู้ช่วยเขียนที่ตรวจสอบข้อผิดพลาดในการสะกดและไวยากรณ์ ใช้ระบบ [การประมวลผลภาษาธรรมชาติ](../../6-NLP/README.md) ที่ซับซ้อนในผลิตภัณฑ์ของพวกเขา พวกเขาได้เผยแพร่กรณีศึกษาที่น่าสนใจในบล็อกเทคโนโลยีเกี่ยวกับวิธีการจัดการกับอคติทางเพศใน ML ซึ่งคุณได้เรียนรู้ใน [บทเรียนความยุติธรรมเบื้องต้น](../../1-Introduction/3-fairness/README.md) +[อ้างอิง](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/) + +## 👜 การค้าปลีก + +ภาคการค้าปลีกสามารถได้รับประโยชน์จากการใช้ ML อย่างแน่นอน ตั้งแต่การสร้างประสบการณ์ลูกค้าที่ดีขึ้นไปจนถึงการจัดการสินค้าคงคลังอย่างเหมาะสม + +### การปรับแต่งประสบการณ์ลูกค้า + +ที่ Wayfair บริษัทที่ขายสินค้าภายในบ้าน เช่น เฟอร์นิเจอร์ การช่วยลูกค้าค้นหาสินค้าที่เหมาะกับรสนิยมและความต้องการเป็นสิ่งสำคัญ ในบทความนี้ วิศวกรจากบริษัทได้อธิบายว่าพวกเขาใช้ ML และ NLP เพื่อ "แสดงผลลัพธ์ที่เหมาะสมสำหรับลูกค้า" โดยเฉพาะอย่างยิ่ง Query Intent Engine ของพวกเขาได้รับการออกแบบมาเพื่อใช้การดึงข้อมูลเอนทิตี การฝึกอบรมตัวจำแนก การดึงข้อมูลสินทรัพย์และความคิดเห็น และการติดแท็กความรู้สึกในรีวิวของลูกค้า นี่เป็นกรณีการใช้งานคลาสสิกของ NLP ในการค้าปลีกออนไลน์ +[อ้างอิง](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search) + +### การจัดการสินค้าคงคลัง + +บริษัทที่มีนวัตกรรมและคล่องตัว เช่น [StitchFix](https://stitchfix.com) บริการกล่องที่จัดส่งเสื้อผ้าให้ผู้บริโภค พึ่งพา ML อย่างมากสำหรับการแนะนำสินค้าและการจัดการสินค้าคงคลัง ทีมสไตลิสต์ของพวกเขาทำงานร่วมกับทีมจัดซื้อสินค้า โดยที่ "นักวิทยาศาสตร์ข้อมูลคนหนึ่งของเราได้ทดลองใช้อัลกอริทึมทางพันธุกรรมและนำไปใช้กับเสื้อผ้าเพื่อทำนายว่าเสื้อผ้าชิ้นใดจะประสบความสำเร็จแม้จะยังไม่มีอยู่ในปัจจุบัน เราได้นำสิ่งนั้นไปให้ทีมจัดซื้อสินค้า และตอนนี้พวกเขาสามารถใช้สิ่งนั้นเป็นเครื่องมือได้" +[อ้างอิง](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/) + +## 🏥 การดูแลสุขภาพ + +ภาคการดูแลสุขภาพสามารถใช้ ML เพื่อเพิ่มประสิทธิภาพงานวิจัยและแก้ปัญหาด้านโลจิสติกส์ เช่น การรับผู้ป่วยกลับเข้ารักษาในโรงพยาบาลหรือการหยุดการแพร่กระจายของโรค + +### การจัดการการทดลองทางคลินิก + +ความเป็นพิษในการทดลองทางคลินิกเป็นปัญหาใหญ่สำหรับผู้ผลิตยา ความเป็นพิษที่ยอมรับได้มีมากน้อยแค่ไหน? ในการศึกษานี้ การวิเคราะห์วิธีการทดลองทางคลินิกต่างๆ นำไปสู่การพัฒนาแนวทางใหม่ในการทำนายผลลัพธ์ของการทดลองทางคลินิก โดยเฉพาะอย่างยิ่ง พวกเขาสามารถใช้ random forest เพื่อสร้าง [ตัวจำแนก](../../4-Classification/README.md) ที่สามารถแยกแยะระหว่างกลุ่มยาต่างๆ ได้ +[อ้างอิง](https://www.sciencedirect.com/science/article/pii/S2451945616302914) + +### การจัดการการรับผู้ป่วยกลับเข้ารักษาในโรงพยาบาล + +การดูแลในโรงพยาบาลมีค่าใช้จ่ายสูง โดยเฉพาะเมื่อผู้ป่วยต้องกลับเข้ารักษาในโรงพยาบาลอีกครั้ง เอกสารนี้พูดถึงบริษัทที่ใช้ ML เพื่อทำนายความเป็นไปได้ในการรับผู้ป่วยกลับเข้ารักษาโดยใช้ [การจัดกลุ่ม](../../5-Clustering/README.md) อัลกอริทึมเหล่านี้ช่วยให้นักวิเคราะห์ "ค้นพบกลุ่มการรับผู้ป่วยกลับเข้ารักษาที่อาจมีสาเหตุร่วมกัน" +[อ้างอิง](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning) + +### การจัดการโรค + +การระบาดใหญ่เมื่อเร็วๆ นี้ได้แสดงให้เห็นถึงวิธีที่ ML สามารถช่วยหยุดการแพร่กระจายของโรค ในบทความนี้ คุณจะเห็นการใช้ ARIMA เส้นโค้งลอจิสติก การถดถอยเชิงเส้น และ SARIMA "งานนี้เป็นความพยายามในการคำนวณอัตราการแพร่กระจายของไวรัสนี้ และทำนายจำนวนผู้เสียชีวิต ผู้ที่หายป่วย และผู้ติดเชื้อ เพื่อช่วยให้เราวางแผนและเตรียมตัวได้ดีขึ้น" +[อ้างอิง](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/) + +## 🌲 นิเวศวิทยาและเทคโนโลยีสีเขียว + +ธรรมชาติและนิเวศวิทยาประกอบด้วยระบบที่ละเอียดอ่อนมากมาย ซึ่งการปฏิสัมพันธ์ระหว่างสัตว์และธรรมชาติมีความสำคัญ การวัดระบบเหล่านี้อย่างแม่นยำและการดำเนินการอย่างเหมาะสมเมื่อเกิดเหตุการณ์ เช่น ไฟป่า หรือการลดลงของประชากรสัตว์ เป็นสิ่งสำคัญ + +### การจัดการป่าไม้ + +คุณได้เรียนรู้เกี่ยวกับ [Reinforcement Learning](../../8-Reinforcement/README.md) ในบทเรียนก่อนหน้านี้ ซึ่งสามารถนำไปใช้ได้ดีเมื่อพยายามทำนายรูปแบบในธรรมชาติ โดยเฉพาะอย่างยิ่ง สามารถใช้ติดตามปัญหานิเวศวิทยา เช่น ไฟป่าและการแพร่กระจายของสายพันธุ์รุกราน ในแคนาดา กลุ่มนักวิจัยใช้ Reinforcement Learning เพื่อสร้างแบบจำลองพลวัตของไฟป่าจากภาพถ่ายดาวเทียม โดยใช้กระบวนการ "spatially spreading process (SSP)" ที่สร้างสรรค์ พวกเขาได้จินตนาการถึงไฟป่าเป็น "ตัวแทนที่ตำแหน่งใดๆ ในภูมิประเทศ" "ชุดของการกระทำที่ไฟสามารถทำได้จากตำแหน่งใดๆ ในเวลาใดๆ รวมถึงการแพร่กระจายไปทางเหนือ ใต้ ตะวันออก หรือตะวันตก หรือไม่แพร่กระจาย" + +วิธีการนี้กลับด้านการตั้งค่า RL ปกติ เนื่องจากพลวัตของกระบวนการตัดสินใจของมาร์คอฟ (MDP) ที่เกี่ยวข้องเป็นฟังก์ชันที่ทราบสำหรับการแพร่กระจายของไฟป่าในทันที อ่านเพิ่มเติมเกี่ยวกับอัลกอริทึมคลาสสิกที่ใช้โดยกลุ่มนี้ได้ที่ลิงก์ด้านล่าง +[อ้างอิง](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full) + +### การตรวจจับการเคลื่อนไหวของสัตว์ + +แม้ว่าการเรียนรู้เชิงลึกจะสร้างการปฏิวัติในการติดตามการเคลื่อนไหวของสัตว์ด้วยภาพ (คุณสามารถสร้าง [ตัวติดตามหมีขั้วโลก](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) ของคุณเองได้ที่นี่) ML แบบคลาสสิกยังคงมีบทบาทในงานนี้ + +เซ็นเซอร์ที่ใช้ติดตามการเคลื่อนไหวของสัตว์ในฟาร์มและ IoT ใช้การประมวลผลภาพประเภทนี้ แต่เทคนิค ML พื้นฐานมีประโยชน์ในการเตรียมข้อมูลเบื้องต้น ตัวอย่างเช่น ในเอกสารนี้ ท่าทางของแกะถูกตรวจสอบและวิเคราะห์โดยใช้อัลกอริทึมตัวจำแนกต่างๆ คุณอาจจำเส้นโค้ง ROC ในหน้า 335 ได้ +[อ้างอิง](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf) + +### ⚡️ การจัดการพลังงาน + +ในบทเรียนของเราเกี่ยวกับ [การพยากรณ์อนุกรมเวลา](../../7-TimeSeries/README.md) เราได้กล่าวถึงแนวคิดของมิเตอร์จอดรถอัจฉริยะเพื่อสร้างรายได้ให้กับเมืองโดยอิงจากการทำความเข้าใจอุปสงค์และอุปทาน บทความนี้พูดถึงรายละเอียดเกี่ยวกับวิธีการรวมการจัดกลุ่ม การถดถอย และการพยากรณ์อนุกรมเวลาเพื่อช่วยทำนายการใช้พลังงานในอนาคตในไอร์แลนด์ โดยอิงจากการใช้มิเตอร์อัจฉริยะ +[อ้างอิง](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf) + +## 💼 การประกันภัย + +ภาคการประกันภัยเป็นอีกภาคส่วนหนึ่งที่ใช้ ML เพื่อสร้างและเพิ่มประสิทธิภาพโมเดลทางการเงินและคณิตศาสตร์ประกันภัยที่ใช้งานได้ + +### การจัดการความผันผวน + +MetLife ผู้ให้บริการประกันชีวิต เปิดเผยวิธีที่พวกเขาวิเคราะห์และลดความผันผวนในโมเดลทางการเงินของพวกเขา ในบทความนี้ คุณจะเห็นภาพการจำแนกแบบไบนารีและแบบลำดับ รวมถึงภาพการพยากรณ์ +[อ้างอิง](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf) + +## 🎨 ศิลปะ วัฒนธรรม และวรรณกรรม + +ในด้านศิลปะ เช่น วารสารศาสตร์ มีปัญหาที่น่าสนใจมากมาย การตรวจจับข่าวปลอมเป็นปัญหาใหญ่ เนื่องจากได้รับการพิสูจน์แล้วว่ามีอิทธิพลต่อความคิดเห็นของผู้คนและแม้กระทั่งทำลายประชาธิปไตย พิพิธภัณฑ์ยังสามารถได้รับประโยชน์จากการใช้ ML ตั้งแต่การค้นหาความเชื่อมโยงระหว่างสิ่งประดิษฐ์ไปจนถึงการวางแผนทรัพยากร + +### การตรวจจับข่าวปลอม + +การตรวจจับข่าวปลอมกลายเป็นเกมแมวไล่จับหนูในสื่อปัจจุบัน ในบทความนี้ นักวิจัยแนะนำว่าระบบที่รวมเทคนิค ML หลายประเภทที่เราได้ศึกษาสามารถนำมาทดสอบและเลือกโมเดลที่ดีที่สุดเพื่อใช้งาน: "ระบบนี้ใช้การประมวลผลภาษาธรรมชาติเพื่อดึงคุณลักษณะจากข้อมูล และคุณลักษณะเหล่านี้จะถูกใช้ในการฝึกอบรมตัวจำแนก ML เช่น Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD), และ Logistic Regression (LR)" +[อ้างอิง](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf) + +บทความนี้แสดงให้เห็นว่าการรวมโดเมน ML ต่างๆ สามารถสร้างผลลัพธ์ที่น่าสนใจที่ช่วยหยุดการแพร่กระจายของข่าวปลอมและสร้างความเสียหายได้ ในกรณีนี้ แรงจูงใจคือการแพร่กระจายข่าวลือเกี่ยวกับการรักษา COVID ที่กระตุ้นความรุนแรงในสังคม + +### ML ในพิพิธภัณฑ์ + +พิพิธภัณฑ์อยู่ในจุดเริ่มต้นของการปฏิวัติ AI ซึ่งการจัดหมวดหมู่และการแปลงคอลเลกชันเป็นดิจิทัล รวมถึงการค้นหาค +## แบบทดสอบหลังการบรรยาย + +## ทบทวนและศึกษาด้วยตนเอง + +ทีมวิทยาศาสตร์ข้อมูลของ Wayfair มีวิดีโอที่น่าสนใจหลายรายการเกี่ยวกับวิธีที่พวกเขาใช้ ML ในบริษัทของพวกเขา คุ้มค่าที่จะ [ลองดู](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)! + +## งานที่ได้รับมอบหมาย + +[การล่าขุมทรัพย์ ML](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/9-Real-World/1-Applications/assignment.md b/translations/th/9-Real-World/1-Applications/assignment.md new file mode 100644 index 000000000..3a36c6503 --- /dev/null +++ b/translations/th/9-Real-World/1-Applications/assignment.md @@ -0,0 +1,27 @@ + +# การล่าขุมทรัพย์ ML + +## คำแนะนำ + +ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับกรณีการใช้งานจริงหลายกรณีที่ถูกแก้ไขด้วยการใช้ ML แบบคลาสสิก แม้ว่าการใช้ Deep Learning เทคนิคและเครื่องมือใหม่ใน AI รวมถึงการใช้ Neural Networks จะช่วยเร่งการพัฒนาเครื่องมือในภาคส่วนเหล่านี้ แต่ ML แบบคลาสสิกที่ใช้เทคนิคในหลักสูตรนี้ยังคงมีคุณค่าอย่างมาก + +ในงานนี้ ลองจินตนาการว่าคุณกำลังเข้าร่วม Hackathon ใช้สิ่งที่คุณเรียนรู้ในหลักสูตรเพื่อเสนอวิธีแก้ปัญหาโดยใช้ ML แบบคลาสสิกเพื่อแก้ไขปัญหาในหนึ่งในภาคส่วนที่กล่าวถึงในบทเรียนนี้ สร้างการนำเสนอที่คุณพูดถึงวิธีที่คุณจะนำแนวคิดของคุณไปใช้ คะแนนพิเศษหากคุณสามารถรวบรวมข้อมูลตัวอย่างและสร้างโมเดล ML เพื่อสนับสนุนแนวคิดของคุณ! + +## เกณฑ์การประเมิน + +| เกณฑ์ | ยอดเยี่ยม | เพียงพอ | ต้องปรับปรุง | +| ------ | ------------------------------------------------------------------ | ------------------------------------------------ | ---------------------- | +| | มีการนำเสนอ PowerPoint - คะแนนพิเศษสำหรับการสร้างโมเดล | มีการนำเสนอพื้นฐานที่ไม่สร้างสรรค์ | งานยังไม่สมบูรณ์ | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์มืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/9-Real-World/2-Debugging-ML-Models/README.md b/translations/th/9-Real-World/2-Debugging-ML-Models/README.md new file mode 100644 index 000000000..ef97861a3 --- /dev/null +++ b/translations/th/9-Real-World/2-Debugging-ML-Models/README.md @@ -0,0 +1,162 @@ + +# ภาคผนวก: การดีบักโมเดลใน Machine Learning ด้วยส่วนประกอบของ Responsible AI Dashboard + +## [แบบทดสอบก่อนการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +## บทนำ + +Machine learning มีผลกระทบต่อชีวิตประจำวันของเรา AI กำลังเข้ามามีบทบาทในระบบที่สำคัญที่สุดที่ส่งผลต่อเราในฐานะบุคคลและสังคม เช่น ด้านสุขภาพ การเงิน การศึกษา และการจ้างงาน ตัวอย่างเช่น ระบบและโมเดลถูกนำมาใช้ในงานตัดสินใจประจำวัน เช่น การวินิจฉัยโรคหรือการตรวจจับการฉ้อโกง ด้วยเหตุนี้ ความก้าวหน้าของ AI พร้อมกับการนำไปใช้ที่รวดเร็วขึ้นจึงถูกตอบสนองด้วยความคาดหวังของสังคมที่เปลี่ยนแปลงไปและกฎระเบียบที่เพิ่มขึ้น เรามักเห็นกรณีที่ระบบ AI ไม่สามารถตอบสนองความคาดหวังได้ เปิดเผยความท้าทายใหม่ ๆ และรัฐบาลเริ่มควบคุมโซลูชัน AI ดังนั้นจึงเป็นสิ่งสำคัญที่ต้องวิเคราะห์โมเดลเหล่านี้เพื่อให้ได้ผลลัพธ์ที่ยุติธรรม เชื่อถือได้ ครอบคลุม โปร่งใส และมีความรับผิดชอบสำหรับทุกคน + +ในหลักสูตรนี้ เราจะศึกษาวิธีการและเครื่องมือที่สามารถใช้ในการประเมินว่าโมเดลมีปัญหาเกี่ยวกับ Responsible AI หรือไม่ เทคนิคการดีบักโมเดลแบบดั้งเดิมมักอิงกับการคำนวณเชิงปริมาณ เช่น ความแม่นยำรวม หรือค่าเฉลี่ยของการสูญเสียข้อผิดพลาด ลองจินตนาการถึงสิ่งที่อาจเกิดขึ้นเมื่อข้อมูลที่คุณใช้สร้างโมเดลเหล่านี้ขาดกลุ่มประชากรบางประเภท เช่น เชื้อชาติ เพศ มุมมองทางการเมือง ศาสนา หรือมีการแสดงกลุ่มประชากรเหล่านี้อย่างไม่สมดุล หรือเมื่อผลลัพธ์ของโมเดลถูกตีความว่าให้ความสำคัญกับกลุ่มประชากรบางกลุ่ม สิ่งนี้อาจนำไปสู่การแสดงผลที่มากเกินไปหรือน้อยเกินไปของกลุ่มคุณลักษณะที่ละเอียดอ่อน ส่งผลให้เกิดปัญหาด้านความยุติธรรม ความครอบคลุม หรือความน่าเชื่อถือจากโมเดล อีกปัจจัยหนึ่งคือ โมเดล Machine Learning มักถูกมองว่าเป็นกล่องดำ ซึ่งทำให้ยากต่อการเข้าใจและอธิบายว่าอะไรเป็นตัวขับเคลื่อนการคาดการณ์ของโมเดล ทั้งหมดนี้เป็นความท้าทายที่นักวิทยาศาสตร์ข้อมูลและนักพัฒนา AI เผชิญเมื่อไม่มีเครื่องมือที่เพียงพอในการดีบักและประเมินความยุติธรรมหรือความน่าเชื่อถือของโมเดล + +ในบทเรียนนี้ คุณจะได้เรียนรู้เกี่ยวกับการดีบักโมเดลของคุณโดยใช้: + +- **Error Analysis**: ระบุว่าบริเวณใดในการกระจายข้อมูลที่โมเดลมีอัตราความผิดพลาดสูง +- **Model Overview**: วิเคราะห์เปรียบเทียบระหว่างกลุ่มข้อมูลต่าง ๆ เพื่อค้นหาความแตกต่างในเมตริกประสิทธิภาพของโมเดล +- **Data Analysis**: ตรวจสอบว่ามีการแสดงข้อมูลมากเกินไปหรือน้อยเกินไปที่อาจทำให้โมเดลของคุณเอนเอียงไปยังกลุ่มประชากรหนึ่งมากกว่ากลุ่มอื่น +- **Feature Importance**: เข้าใจว่าคุณลักษณะใดเป็นตัวขับเคลื่อนการคาดการณ์ของโมเดลในระดับโลกหรือระดับเฉพาะกรณี + +## ความต้องการเบื้องต้น + +ก่อนเริ่มต้น โปรดทบทวน [เครื่องมือ Responsible AI สำหรับนักพัฒนา](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) + +> ![Gif เกี่ยวกับเครื่องมือ Responsible AI](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif) + +## การวิเคราะห์ข้อผิดพลาด (Error Analysis) + +เมตริกประสิทธิภาพของโมเดลแบบดั้งเดิมที่ใช้วัดความแม่นยำมักเป็นการคำนวณที่อิงกับการคาดการณ์ที่ถูกต้องและผิดพลาด ตัวอย่างเช่น การพิจารณาว่าโมเดลมีความแม่นยำ 89% และมีการสูญเสียข้อผิดพลาด 0.001 อาจถือว่าเป็นประสิทธิภาพที่ดี อย่างไรก็ตาม ข้อผิดพลาดมักไม่ได้กระจายอย่างสม่ำเสมอในชุดข้อมูลพื้นฐาน คุณอาจได้คะแนนความแม่นยำของโมเดล 89% แต่พบว่ามีบางส่วนของข้อมูลที่โมเดลล้มเหลวถึง 42% ผลกระทบของรูปแบบความล้มเหลวเหล่านี้ในกลุ่มข้อมูลบางกลุ่มอาจนำไปสู่ปัญหาด้านความยุติธรรมหรือความน่าเชื่อถือ การเข้าใจพื้นที่ที่โมเดลทำงานได้ดีหรือไม่ดีจึงเป็นสิ่งสำคัญ บริเวณข้อมูลที่มีความไม่ถูกต้องสูงในโมเดลของคุณอาจกลายเป็นกลุ่มประชากรข้อมูลที่สำคัญ + +![วิเคราะห์และดีบักข้อผิดพลาดของโมเดล](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-distribution.png) + +ส่วนประกอบ Error Analysis บน RAI Dashboard แสดงให้เห็นว่าความล้มเหลวของโมเดลกระจายอยู่ในกลุ่มต่าง ๆ อย่างไรผ่านการแสดงผลแบบต้นไม้ สิ่งนี้มีประโยชน์ในการระบุคุณลักษณะหรือพื้นที่ที่มีอัตราความผิดพลาดสูงในชุดข้อมูลของคุณ โดยการดูว่าความไม่ถูกต้องของโมเดลส่วนใหญ่มาจากที่ใด คุณสามารถเริ่มต้นการตรวจสอบสาเหตุที่แท้จริงได้ คุณยังสามารถสร้างกลุ่มข้อมูลเพื่อทำการวิเคราะห์ได้ กลุ่มข้อมูลเหล่านี้ช่วยในกระบวนการดีบักเพื่อพิจารณาว่าทำไมประสิทธิภาพของโมเดลจึงดีในกลุ่มหนึ่ง แต่ผิดพลาดในอีกกลุ่มหนึ่ง + +![Error Analysis](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png) + +ตัวบ่งชี้ภาพบนแผนที่ต้นไม้ช่วยให้ค้นหาพื้นที่ปัญหาได้เร็วขึ้น ตัวอย่างเช่น โหนดต้นไม้ที่มีสีแดงเข้มแสดงถึงอัตราความผิดพลาดที่สูงขึ้น + +Heat map เป็นอีกหนึ่งฟังก์ชันการแสดงผลที่ผู้ใช้สามารถใช้ในการตรวจสอบอัตราความผิดพลาดโดยใช้หนึ่งหรือสองคุณลักษณะเพื่อค้นหาปัจจัยที่ส่งผลต่อข้อผิดพลาดของโมเดลในชุดข้อมูลทั้งหมดหรือกลุ่มข้อมูล + +![Error Analysis Heatmap](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png) + +ใช้การวิเคราะห์ข้อผิดพลาดเมื่อคุณต้องการ: + +* เข้าใจอย่างลึกซึ้งว่าความล้มเหลวของโมเดลกระจายอยู่ในชุดข้อมูลและมิติของคุณลักษณะต่าง ๆ อย่างไร +* แยกเมตริกประสิทธิภาพรวมเพื่อค้นพบกลุ่มข้อมูลที่มีข้อผิดพลาดโดยอัตโนมัติเพื่อแจ้งขั้นตอนการแก้ไขเป้าหมายของคุณ + +## ภาพรวมของโมเดล (Model Overview) + +การประเมินประสิทธิภาพของโมเดล Machine Learning ต้องการความเข้าใจที่ครอบคลุมเกี่ยวกับพฤติกรรมของมัน สิ่งนี้สามารถทำได้โดยการตรวจสอบเมตริกมากกว่าหนึ่งตัว เช่น อัตราความผิดพลาด ความแม่นยำ การเรียกคืน ความแม่นยำ หรือ MAE (Mean Absolute Error) เพื่อค้นหาความแตกต่างระหว่างเมตริกประสิทธิภาพ เมตริกประสิทธิภาพหนึ่งอาจดูดี แต่ความไม่ถูกต้องอาจถูกเปิดเผยในเมตริกอื่น นอกจากนี้ การเปรียบเทียบเมตริกเพื่อค้นหาความแตกต่างในชุดข้อมูลทั้งหมดหรือกลุ่มข้อมูลช่วยให้เห็นว่าโมเดลทำงานได้ดีหรือไม่ดีในพื้นที่ใด สิ่งนี้มีความสำคัญอย่างยิ่งในการดูประสิทธิภาพของโมเดลในคุณลักษณะที่ละเอียดอ่อนเทียบกับคุณลักษณะที่ไม่ละเอียดอ่อน (เช่น เชื้อชาติ เพศ หรืออายุของผู้ป่วย) เพื่อเปิดเผยความไม่ยุติธรรมที่โมเดลอาจมี ตัวอย่างเช่น การค้นพบว่าโมเดลมีข้อผิดพลาดมากกว่าในกลุ่มที่มีคุณลักษณะละเอียดอ่อนสามารถเปิดเผยความไม่ยุติธรรมที่โมเดลอาจมี + +ส่วนประกอบ Model Overview บน RAI Dashboard ช่วยไม่เพียงแต่ในการวิเคราะห์เมตริกประสิทธิภาพของการแสดงข้อมูลในกลุ่ม แต่ยังให้ความสามารถแก่ผู้ใช้ในการเปรียบเทียบพฤติกรรมของโมเดลในกลุ่มต่าง ๆ + +![กลุ่มข้อมูล - ภาพรวมโมเดลใน RAI Dashboard](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png) + +ฟังก์ชันการวิเคราะห์ตามคุณลักษณะของส่วนประกอบช่วยให้ผู้ใช้สามารถเจาะลึกกลุ่มข้อมูลย่อยภายในคุณลักษณะเฉพาะเพื่อระบุความผิดปกติในระดับละเอียด ตัวอย่างเช่น Dashboard มีความฉลาดในตัวเพื่อสร้างกลุ่มข้อมูลโดยอัตโนมัติสำหรับคุณลักษณะที่ผู้ใช้เลือก (เช่น *"time_in_hospital < 3"* หรือ *"time_in_hospital >= 7"*) สิ่งนี้ช่วยให้ผู้ใช้สามารถแยกคุณลักษณะเฉพาะออกจากกลุ่มข้อมูลขนาดใหญ่เพื่อดูว่ามันเป็นตัวขับเคลื่อนสำคัญของผลลัพธ์ที่ผิดพลาดของโมเดลหรือไม่ + +![กลุ่มคุณลักษณะ - ภาพรวมโมเดลใน RAI Dashboard](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png) + +ส่วนประกอบ Model Overview รองรับเมตริกความแตกต่างสองประเภท: + +**ความแตกต่างในประสิทธิภาพของโมเดล**: เมตริกเหล่านี้คำนวณความแตกต่าง (difference) ในค่าของเมตริกประสิทธิภาพที่เลือกในกลุ่มข้อมูลย่อย ตัวอย่างเช่น: + +* ความแตกต่างในอัตราความแม่นยำ +* ความแตกต่างในอัตราความผิดพลาด +* ความแตกต่างในความแม่นยำ +* ความแตกต่างในการเรียกคืน +* ความแตกต่างในค่า MAE (Mean Absolute Error) + +**ความแตกต่างในอัตราการเลือก**: เมตริกนี้แสดงความแตกต่างในอัตราการเลือก (การคาดการณ์ที่เป็นผลดี) ในกลุ่มข้อมูลย่อย ตัวอย่างเช่น ความแตกต่างในอัตราการอนุมัติสินเชื่อ อัตราการเลือกหมายถึงเศษส่วนของจุดข้อมูลในแต่ละคลาสที่ถูกจัดประเภทเป็น 1 (ในการจัดประเภทแบบไบนารี) หรือการกระจายค่าการคาดการณ์ (ในการถดถอย) + +## การวิเคราะห์ข้อมูล (Data Analysis) + +> "ถ้าคุณทรมานข้อมูลนานพอ มันจะสารภาพทุกอย่าง" - Ronald Coase + +คำกล่าวนี้อาจฟังดูรุนแรง แต่เป็นความจริงที่ว่าข้อมูลสามารถถูกจัดการเพื่อสนับสนุนข้อสรุปใด ๆ การจัดการดังกล่าวบางครั้งอาจเกิดขึ้นโดยไม่ตั้งใจ ในฐานะมนุษย์ เราทุกคนมีอคติ และมักยากที่จะรู้ตัวเมื่อเราแนะนำอคติในข้อมูล การรับประกันความยุติธรรมใน AI และ Machine Learning ยังคงเป็นความท้าทายที่ซับซ้อน + +ข้อมูลเป็นจุดบอดขนาดใหญ่สำหรับเมตริกประสิทธิภาพของโมเดลแบบดั้งเดิม คุณอาจมีคะแนนความแม่นยำสูง แต่สิ่งนี้ไม่ได้สะท้อนถึงอคติในข้อมูลพื้นฐานที่อาจอยู่ในชุดข้อมูลของคุณ ตัวอย่างเช่น หากชุดข้อมูลของพนักงานมีผู้หญิง 27% ในตำแหน่งผู้บริหารในบริษัท และผู้ชาย 73% ในระดับเดียวกัน โมเดล AI ที่โฆษณางานซึ่งถูกฝึกด้วยข้อมูลนี้อาจมุ่งเป้าหมายไปยังผู้ชายเป็นส่วนใหญ่สำหรับตำแหน่งงานระดับสูง การมีความไม่สมดุลในข้อมูลนี้ทำให้การคาดการณ์ของโมเดลเอนเอียงไปยังเพศหนึ่งมากกว่าอีกเพศหนึ่ง สิ่งนี้เผยให้เห็นปัญหาความยุติธรรมที่มีอคติทางเพศในโมเดล AI + +ส่วนประกอบ Data Analysis บน RAI Dashboard ช่วยระบุพื้นที่ที่มีการแสดงข้อมูลมากเกินไปหรือน้อยเกินไปในชุดข้อมูล มันช่วยให้ผู้ใช้วินิจฉัยสาเหตุของข้อผิดพลาดและปัญหาความยุติธรรมที่เกิดจากความไม่สมดุลของข้อมูลหรือการขาดการแสดงผลของกลุ่มข้อมูลเฉพาะ สิ่งนี้ช่วยให้ผู้ใช้สามารถแสดงภาพชุดข้อมูลตามผลลัพธ์ที่คาดการณ์และผลลัพธ์จริง กลุ่มข้อผิดพลาด และคุณลักษณะเฉพาะ บางครั้งการค้นพบกลุ่มข้อมูลที่มีการแสดงผลน้อยเกินไปยังสามารถเปิดเผยว่าโมเดลไม่ได้เรียนรู้ได้ดี ส่งผลให้เกิดความไม่ถูกต้องสูง การมีโมเดลที่มีอคติในข้อมูลไม่เพียงแต่เป็นปัญหาความยุติธรรม แต่ยังแสดงว่าโมเดลไม่ครอบคลุมหรือเชื่อถือได้ + +![ส่วนประกอบ Data Analysis บน RAI Dashboard](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png) + +ใช้การวิเคราะห์ข้อมูลเมื่อคุณต้องการ: + +* สำรวจสถิติของชุดข้อมูลของคุณโดยเลือกตัวกรองต่าง ๆ เพื่อแบ่งข้อมูลของคุณออกเป็นมิติที่แตกต่างกัน (หรือที่เรียกว่ากลุ่มข้อมูล) +* เข้าใจการกระจายของชุดข้อมูลของคุณในกลุ่มข้อมูลและกลุ่มคุณลักษณะต่าง ๆ +* พิจารณาว่าการค้นพบของคุณที่เกี่ยวข้องกับความยุติธรรม การวิเคราะห์ข้อผิดพลาด และความเป็นเหตุเป็นผล (ที่ได้จากส่วนประกอบอื่น ๆ ของ Dashboard) เป็นผลมาจากการกระจายของชุดข้อมูลของคุณหรือไม่ +* ตัดสินใจว่าจะรวบรวมข้อมูลเพิ่มเติมในพื้นที่ใดเพื่อแก้ไขข้อผิดพลาดที่เกิดจากปัญหาการแสดงผล การรบกวนของป้ายกำกับ การรบกวนของคุณลักษณะ อคติของป้ายกำกับ และปัจจัยที่คล้ายกัน + +## การตีความโมเดล (Model Interpretability) + +โมเดล Machine Learning มักถูกมองว่าเป็นกล่องดำ การเข้าใจว่าคุณลักษณะข้อมูลสำคัญใดเป็นตัวขับเคลื่อนการคาดการณ์ของโมเดลอาจเป็นเรื่องท้าทาย สิ่งสำคัญคือต้องให้ความโปร่งใสว่าเหตุใดโมเดลจึงทำการคาดการณ์บางอย่าง ตัวอย่างเช่น หากระบบ AI คาดการณ์ว่าผู้ป่วยเบาหวานมีความเสี่ยงที่จะกลับเข้ารักษาในโรงพยาบาลภายใน 30 วัน ควรสามารถให้ข้อมูลสนับสนุนที่นำไปสู่การคาดการณ์นั้นได้ การมีตัวบ่งชี้ข้อมูลสนับสนุนช่วยให้เกิดความโปร่งใสเพื่อช่วยให้แพทย์หรือโรงพยาบาลสามารถตัดสินใจได้อย่างมีข้อมูล นอกจากนี้ การสามารถอธิบายว่าเหตุใดโมเดลจึงทำการคาดการณ์สำหรับผู้ป่วยรายบุคคลช่วยให้เกิดความรับผิดชอบต่อกฎระเบียบด้านสุขภาพ เมื่อคุณใช้โมเดล Machine Learning ในวิธีที่ส่งผลต่อชีวิตของผู้คน การเข้าใจและอธิบายว่าอะไรเป็นตัวขับเคลื่อนพฤติกรรมของโมเดลจึงเป็นสิ่งสำคัญ การอธิบายและตีความโมเดลช่วยตอบคำถามในสถานการณ์ เช่น: + +* การดีบักโมเดล: ทำไมโมเดลของฉันถึงทำผิดพลาด? ฉันจะปรับปรุงโมเดลของฉันได้อย่างไร? +* การทำงานร่วมกันระหว่างมนุษย์และ AI: ฉันจะเข้าใจและเชื่อมั่นในการตัดสินใจของโมเดลได้อย่างไร? +* การปฏิบัติตามกฎระเบียบ: โมเดลของฉันเป็นไปตามข้อกำหนดทางกฎหมายหรือไม่? + +ส่วนประกอบ Feature Importance บน RAI Dashboard ช่วยให้คุณดีบักและเข้าใจอย่างครอบคลุมว่าโมเดลทำการคาดการณ์อย่างไร นอกจากนี้ยังเป็นเครื่องมือที่มีประโยชน์สำหรับมืออาชีพด้าน Machine Learning และผู้ตัดสินใจในการอธิบายและแสดงหลักฐานของคุณลักษณะที่มีอิทธิพลต่อพฤติกรรมของโมเดลเพื่อการปฏิบัติตามกฎระเบียบ ผู้ใช้สามารถสำรวจคำอธิบายทั้งในระดับโลกและระดับเฉพาะกรณีเพื่อยืนยันว่าคุณลักษณะใดเป็นตัวขับเคลื่อนการคาดการณ์ของโมเดล คำอธิบายระดับโลกแสดงรายการคุณลักษณะสำคัญที่ส่งผลต่อการคาดการณ์โดยรวมของโมเดล คำอธิบายระดับเฉพาะกรณีแสดงว่าคุณลักษณะใดนำไปสู่การคาดการณ์ของโมเดลสำหรับกรณีเฉพาะ ความสามารถในการประเมินคำอธิบายระดับเฉพาะกรณีมีประโยชน์ในการดีบักหรือการตรวจสอบกรณีเฉพาะเพื่อเข้าใจและตีความว่าเหตุใดโมเดลจึงทำการคาดการณ์ที่ถูกต้องหรือผิดพลาด + +![ส่วนประกอบ Feature Importance บน RAI Dashboard](../../../../9-Real-World/2-Debugging-ML-Models/images/9-feature-importance.png) + +* คำอธิบายระดับโลก: ตัวอย่างเช่น คุณลักษณะใดส่งผลต่อพฤติกรรมโดยรวมของโมเดลการกลับเข้ารักษาในโรงพยาบาลของผู้ป่วยเบาหวาน? +* คำอ +- **การแสดงผลที่มากเกินไปหรือน้อยเกินไป** แนวคิดคือกลุ่มคนบางกลุ่มไม่ได้รับการมองเห็นในอาชีพบางประเภท และบริการหรือฟังก์ชันใด ๆ ที่ยังคงส่งเสริมสิ่งนี้ถือเป็นการสร้างความเสียหาย + +### Azure RAI dashboard + +[Azure RAI dashboard](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) ถูกสร้างขึ้นจากเครื่องมือโอเพ่นซอร์สที่พัฒนาโดยสถาบันการศึกษาและองค์กรชั้นนำ รวมถึง Microsoft ซึ่งมีบทบาทสำคัญสำหรับนักวิทยาศาสตร์ข้อมูลและนักพัฒนา AI ในการทำความเข้าใจพฤติกรรมของโมเดล ค้นหาและลดปัญหาที่ไม่พึงประสงค์จากโมเดล AI + +- เรียนรู้วิธีการใช้ส่วนประกอบต่าง ๆ โดยดูเอกสารของ RAI dashboard [docs.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) + +- ดูตัวอย่างโน้ตบุ๊กของ RAI dashboard [sample notebooks](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) สำหรับการแก้ไขปัญหา AI ที่มีความรับผิดชอบมากขึ้นใน Azure Machine Learning + +--- +## 🚀 ความท้าทาย + +เพื่อป้องกันไม่ให้เกิดอคติทางสถิติหรือข้อมูลตั้งแต่แรก เราควร: + +- มีความหลากหลายของพื้นหลังและมุมมองในกลุ่มคนที่ทำงานเกี่ยวกับระบบ +- ลงทุนในชุดข้อมูลที่สะท้อนถึงความหลากหลายของสังคมเรา +- พัฒนาวิธีการที่ดีกว่าในการตรวจจับและแก้ไขอคติเมื่อมันเกิดขึ้น + +ลองคิดถึงสถานการณ์ในชีวิตจริงที่ความไม่เป็นธรรมปรากฏชัดในกระบวนการสร้างและใช้งานโมเดล เราควรพิจารณาอะไรเพิ่มเติมอีก? + +## [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) +## ทบทวนและศึกษาด้วยตนเอง + +ในบทเรียนนี้ คุณได้เรียนรู้เครื่องมือที่ใช้งานได้จริงบางส่วนในการนำ AI ที่มีความรับผิดชอบมารวมเข้ากับการเรียนรู้ของเครื่อง + +ดูเวิร์กช็อปนี้เพื่อเจาะลึกในหัวข้อเพิ่มเติม: + +- Responsible AI Dashboard: ศูนย์รวมสำหรับการนำ RAI ไปใช้ในทางปฏิบัติ โดย Besmira Nushi และ Mehrnoosh Sameki + +[![Responsible AI Dashboard: ศูนย์รวมสำหรับการนำ RAI ไปใช้ในทางปฏิบัติ](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "Responsible AI Dashboard: ศูนย์รวมสำหรับการนำ RAI ไปใช้ในทางปฏิบัติ") + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอ: Responsible AI Dashboard: ศูนย์รวมสำหรับการนำ RAI ไปใช้ในทางปฏิบัติ โดย Besmira Nushi และ Mehrnoosh Sameki + +อ้างอิงเอกสารต่อไปนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ AI ที่มีความรับผิดชอบและวิธีสร้างโมเดลที่น่าเชื่อถือมากขึ้น: + +- เครื่องมือ RAI dashboard ของ Microsoft สำหรับการแก้ไขข้อบกพร่องในโมเดล ML: [Responsible AI tools resources](https://aka.ms/rai-dashboard) + +- สำรวจชุดเครื่องมือ Responsible AI: [Github](https://github.com/microsoft/responsible-ai-toolbox) + +- ศูนย์ทรัพยากร RAI ของ Microsoft: [Responsible AI Resources – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4) + +- กลุ่มวิจัย FATE ของ Microsoft: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/) + +## งานที่ได้รับมอบหมาย + +[สำรวจ RAI dashboard](assignment.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/9-Real-World/2-Debugging-ML-Models/assignment.md b/translations/th/9-Real-World/2-Debugging-ML-Models/assignment.md new file mode 100644 index 000000000..33d9cd5e6 --- /dev/null +++ b/translations/th/9-Real-World/2-Debugging-ML-Models/assignment.md @@ -0,0 +1,25 @@ + +# สำรวจแดชบอร์ด Responsible AI (RAI) + +## คำแนะนำ + +ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับแดชบอร์ด RAI ซึ่งเป็นชุดของส่วนประกอบที่สร้างขึ้นจากเครื่องมือ "โอเพ่นซอร์ส" เพื่อช่วยนักวิทยาศาสตร์ข้อมูลในการวิเคราะห์ข้อผิดพลาด สำรวจข้อมูล ประเมินความเป็นธรรม ทำความเข้าใจโมเดล วิเคราะห์สถานการณ์สมมติ/การประเมินแบบ "ถ้าเป็นอย่างนี้จะเป็นอย่างไร" และการวิเคราะห์เชิงสาเหตุในระบบ AI สำหรับงานนี้ ให้คุณสำรวจตัวอย่าง [notebooks](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) ของแดชบอร์ด RAI และรายงานผลการค้นพบในรูปแบบเอกสารหรือการนำเสนอ + +## เกณฑ์การประเมิน + +| เกณฑ์ | ดีเยี่ยม | พอใช้ | ต้องปรับปรุง | +| -------- | --------- | -------- | ----------------- | +| | มีการนำเสนอเอกสารหรือสไลด์ที่พูดถึงส่วนประกอบของแดชบอร์ด RAI, notebook ที่ได้ทดลองใช้งาน และข้อสรุปที่ได้จากการทดลองใช้งาน | มีการนำเสนอเอกสารแต่ไม่มีข้อสรุป | ไม่มีการนำเสนอเอกสาร | + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/9-Real-World/README.md b/translations/th/9-Real-World/README.md new file mode 100644 index 000000000..9148c54ad --- /dev/null +++ b/translations/th/9-Real-World/README.md @@ -0,0 +1,32 @@ + +# ปัจฉิมบท: การประยุกต์ใช้การเรียนรู้ของเครื่องแบบคลาสสิกในโลกจริง + +ในส่วนนี้ของหลักสูตร คุณจะได้เรียนรู้เกี่ยวกับการประยุกต์ใช้การเรียนรู้ของเครื่องแบบคลาสสิกในโลกจริง เราได้ค้นคว้าจากอินเทอร์เน็ตเพื่อหาเอกสารวิชาการและบทความเกี่ยวกับการใช้งานที่ใช้กลยุทธ์เหล่านี้ โดยหลีกเลี่ยงการใช้เครือข่ายประสาทเทียม การเรียนรู้เชิงลึก และ AI ให้มากที่สุด เรียนรู้เกี่ยวกับการใช้ ML ในระบบธุรกิจ การประยุกต์ใช้ในด้านนิเวศวิทยา การเงิน ศิลปะและวัฒนธรรม และอื่น ๆ อีกมากมาย + +![chess](../../../9-Real-World/images/chess.jpg) + +> ภาพถ่ายโดย Alexis Fauvet บน Unsplash + +## บทเรียน + +1. [การประยุกต์ใช้ ML ในโลกจริง](1-Applications/README.md) +2. [การแก้ไขข้อผิดพลาดของโมเดลใน Machine Learning ด้วยส่วนประกอบของ Responsible AI dashboard](2-Debugging-ML-Models/README.md) + +## เครดิต + +"การประยุกต์ใช้ในโลกจริง" เขียนโดยทีมงานหลายคน รวมถึง [Jen Looper](https://twitter.com/jenlooper) และ [Ornella Altunyan](https://twitter.com/ornelladotcom) + +"การแก้ไขข้อผิดพลาดของโมเดลใน Machine Learning ด้วยส่วนประกอบของ Responsible AI dashboard" เขียนโดย [Ruth Yakubu](https://twitter.com/ruthieyakubu) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/CODE_OF_CONDUCT.md b/translations/th/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..73c0b3a9d --- /dev/null +++ b/translations/th/CODE_OF_CONDUCT.md @@ -0,0 +1,23 @@ + +# หลักจรรยาบรรณของโค้ดโอเพ่นซอร์สของ Microsoft + +โครงการนี้ได้นำ [หลักจรรยาบรรณของโค้ดโอเพ่นซอร์สของ Microsoft](https://opensource.microsoft.com/codeofconduct/) มาใช้ + +แหล่งข้อมูล: + +- [หลักจรรยาบรรณของโค้ดโอเพ่นซอร์สของ Microsoft](https://opensource.microsoft.com/codeofconduct/) +- [คำถามที่พบบ่อยเกี่ยวกับหลักจรรยาบรรณ](https://opensource.microsoft.com/codeofconduct/faq/) +- ติดต่อ [opencode@microsoft.com](mailto:opencode@microsoft.com) หากมีคำถามหรือข้อกังวล + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/CONTRIBUTING.md b/translations/th/CONTRIBUTING.md new file mode 100644 index 000000000..9d5d7becb --- /dev/null +++ b/translations/th/CONTRIBUTING.md @@ -0,0 +1,30 @@ + +# การมีส่วนร่วม + +โครงการนี้ยินดีต้อนรับการมีส่วนร่วมและข้อเสนอแนะ การมีส่วนร่วมส่วนใหญ่ต้องการให้คุณ +ยอมรับข้อตกลงใบอนุญาตผู้มีส่วนร่วม (CLA) ซึ่งระบุว่าคุณมีสิทธิ์และ +ได้มอบสิทธิ์ให้เราใช้การมีส่วนร่วมของคุณ สำหรับรายละเอียดเพิ่มเติม โปรดเยี่ยมชม +https://cla.microsoft.com + +> สำคัญ: เมื่อแปลข้อความในที่เก็บนี้ โปรดตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้การแปลด้วยเครื่อง เราจะตรวจสอบการแปลผ่านชุมชน ดังนั้นโปรดอาสาแปลเฉพาะในภาษาที่คุณมีความชำนาญเท่านั้น + +เมื่อคุณส่งคำขอ pull request CLA-bot จะตรวจสอบโดยอัตโนมัติว่าคุณจำเป็นต้อง +ให้ CLA หรือไม่ และจะตกแต่ง PR ให้เหมาะสม (เช่น เพิ่มป้ายกำกับหรือความคิดเห็น) เพียงแค่ทำตาม +คำแนะนำที่บอทให้ไว้ คุณจะต้องทำสิ่งนี้เพียงครั้งเดียวสำหรับที่เก็บทั้งหมดที่ใช้ CLA ของเรา + +โครงการนี้ได้นำ [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) มาใช้ +สำหรับข้อมูลเพิ่มเติม โปรดดูที่ [คำถามที่พบบ่อยเกี่ยวกับจรรยาบรรณ](https://opensource.microsoft.com/codeofconduct/faq/) +หรือ ติดต่อ [opencode@microsoft.com](mailto:opencode@microsoft.com) หากมีคำถามหรือความคิดเห็นเพิ่มเติม + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/README.md b/translations/th/README.md new file mode 100644 index 000000000..8f45b7168 --- /dev/null +++ b/translations/th/README.md @@ -0,0 +1,178 @@ + +[![GitHub license](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/) + +### 🌐 รองรับหลายภาษา + +#### รองรับผ่าน GitHub Action (อัตโนมัติและอัปเดตเสมอ) + +[French](../fr/README.md) | [Spanish](../es/README.md) | [German](../de/README.md) | [Russian](../ru/README.md) | [Arabic](../ar/README.md) | [Persian (Farsi)](../fa/README.md) | [Urdu](../ur/README.md) | [Chinese (Simplified)](../zh/README.md) | [Chinese (Traditional, Macau)](../mo/README.md) | [Chinese (Traditional, Hong Kong)](../hk/README.md) | [Chinese (Traditional, Taiwan)](../tw/README.md) | [Japanese](../ja/README.md) | [Korean](../ko/README.md) | [Hindi](../hi/README.md) | [Bengali](../bn/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Portuguese (Portugal)](../pt/README.md) | [Portuguese (Brazil)](../br/README.md) | [Italian](../it/README.md) | [Polish](../pl/README.md) | [Turkish](../tr/README.md) | [Greek](../el/README.md) | [Thai](./README.md) | [Swedish](../sv/README.md) | [Danish](../da/README.md) | [Norwegian](../no/README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](../he/README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Croatian](../hr/README.md) | [Slovenian](../sl/README.md) | [Ukrainian](../uk/README.md) | [Burmese (Myanmar)](../my/README.md) + +#### เข้าร่วมชุมชน + +[![Azure AI Discord](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) + +# การเรียนรู้ Machine Learning สำหรับผู้เริ่มต้น - หลักสูตร + +> 🌍 เดินทางรอบโลกพร้อมสำรวจการเรียนรู้ของเครื่องผ่านวัฒนธรรมโลก 🌍 + +ทีม Cloud Advocates จาก Microsoft ยินดีนำเสนอหลักสูตร 12 สัปดาห์ 26 บทเรียนเกี่ยวกับ **Machine Learning** ในหลักสูตรนี้ คุณจะได้เรียนรู้เกี่ยวกับสิ่งที่บางครั้งเรียกว่า **การเรียนรู้ของเครื่องแบบคลาสสิก** โดยใช้ Scikit-learn เป็นไลบรารีหลัก และหลีกเลี่ยงการเรียนรู้เชิงลึก ซึ่งครอบคลุมใน [หลักสูตร AI สำหรับผู้เริ่มต้น](https://aka.ms/ai4beginners) นอกจากนี้ยังสามารถจับคู่บทเรียนเหล่านี้กับ [หลักสูตร Data Science สำหรับผู้เริ่มต้น](https://aka.ms/ds4beginners) ได้อีกด้วย! + +เดินทางไปกับเราทั่วโลกในขณะที่เรานำเทคนิคแบบคลาสสิกเหล่านี้ไปใช้กับข้อมูลจากหลายพื้นที่ทั่วโลก แต่ละบทเรียนประกอบด้วยแบบทดสอบก่อนและหลังบทเรียน คำแนะนำที่เขียนไว้สำหรับการทำบทเรียน โซลูชัน งานมอบหมาย และอื่น ๆ วิธีการเรียนรู้แบบเน้นโครงการช่วยให้คุณเรียนรู้ในขณะที่สร้าง ซึ่งเป็นวิธีที่พิสูจน์แล้วว่าทักษะใหม่จะคงอยู่ + +**✍️ ขอขอบคุณผู้เขียนของเรา** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Anirban Mukherjee, Ornella Altunyan, Ruth Yakubu และ Amy Boyd + +**🎨 ขอบคุณนักวาดภาพประกอบของเรา** Tomomi Imura, Dasani Madipalli และ Jen Looper + +**🙏 ขอขอบคุณพิเศษ 🙏 นักศึกษาทูตของ Microsoft ที่เป็นผู้เขียน ผู้ตรวจสอบ และผู้สนับสนุนเนื้อหา** โดยเฉพาะ Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila และ Snigdha Agarwal + +**🤩 ขอขอบคุณเพิ่มเติมนักศึกษาทูตของ Microsoft Eric Wanjau, Jasleen Sondhi และ Vidushi Gupta สำหรับบทเรียน R ของเรา!** + +# เริ่มต้นใช้งาน + +ทำตามขั้นตอนเหล่านี้: +1. **Fork Repository**: คลิกที่ปุ่ม "Fork" ที่มุมขวาบนของหน้านี้ +2. **Clone Repository**: `git clone https://github.com/microsoft/ML-For-Beginners.git` + +> [ค้นหาทรัพยากรเพิ่มเติมสำหรับหลักสูตรนี้ในคอลเลกชัน Microsoft Learn ของเรา](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +**[นักเรียน](https://aka.ms/student-page)** เพื่อใช้หลักสูตรนี้ ให้ fork repo ทั้งหมดไปยังบัญชี GitHub ของคุณเองและทำแบบฝึกหัดด้วยตัวเองหรือกับกลุ่ม: + +- เริ่มต้นด้วยแบบทดสอบก่อนการบรรยาย +- อ่านบทเรียนและทำกิจกรรม หยุดและสะท้อนที่แต่ละจุดตรวจสอบความรู้ +- พยายามสร้างโครงการโดยทำความเข้าใจบทเรียนแทนที่จะรันโค้ดโซลูชัน อย่างไรก็ตาม โค้ดนั้นมีอยู่ในโฟลเดอร์ `/solution` ในแต่ละบทเรียนที่เน้นโครงการ +- ทำแบบทดสอบหลังการบรรยาย +- ทำแบบท้าทาย +- ทำงานมอบหมาย +- หลังจากจบบทเรียนกลุ่ม ให้ไปที่ [กระดานสนทนา](https://github.com/microsoft/ML-For-Beginners/discussions) และ "เรียนรู้แบบเปิดเผย" โดยกรอก PAT rubric ที่เหมาะสม PAT คือเครื่องมือประเมินความก้าวหน้าที่เป็น rubric ที่คุณกรอกเพื่อพัฒนาการเรียนรู้ของคุณ คุณยังสามารถตอบสนองต่อ PAT อื่น ๆ เพื่อให้เราเรียนรู้ร่วมกัน + +> สำหรับการศึกษาเพิ่มเติม เราแนะนำให้ติดตาม [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott) โมดูลและเส้นทางการเรียนรู้ + +**ครู** เราได้ [รวมคำแนะนำบางส่วน](for-teachers.md) เกี่ยวกับวิธีการใช้หลักสูตรนี้ + +--- + +## วิดีโอแนะนำ + +บทเรียนบางส่วนมีวิดีโอสั้น ๆ คุณสามารถค้นหาวิดีโอเหล่านี้ในบทเรียน หรือใน [เพลย์ลิสต์ ML สำหรับผู้เริ่มต้นในช่อง YouTube ของ Microsoft Developer](https://aka.ms/ml-beginners-videos) โดยคลิกที่ภาพด้านล่าง + +[![ML for beginners banner](../../images/ml-for-beginners-video-banner.png)](https://aka.ms/ml-beginners-videos) + +--- + +## พบกับทีมงาน + +[![Promo video](../../images/ml.gif)](https://youtu.be/Tj1XWrDSYJU) + +**Gif โดย** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal) + +> 🎥 คลิกที่ภาพด้านบนเพื่อดูวิดีโอเกี่ยวกับโครงการและผู้ที่สร้างมันขึ้นมา! + +--- + +## วิธีการสอน + +เราเลือกหลักการสอนสองข้อในขณะที่สร้างหลักสูตรนี้: การทำให้เป็น **โครงการที่เน้นการลงมือทำ** และการรวม **แบบทดสอบบ่อยครั้ง** นอกจากนี้ หลักสูตรนี้ยังมี **ธีมร่วม** เพื่อให้มีความสอดคล้องกัน + +โดยการทำให้เนื้อหาสอดคล้องกับโครงการ กระบวนการจะมีความน่าสนใจมากขึ้นสำหรับนักเรียน และการจดจำแนวคิดจะเพิ่มขึ้น นอกจากนี้ แบบทดสอบที่มีความเสี่ยงต่ำก่อนคลาสจะตั้งเจตนาของนักเรียนในการเรียนรู้หัวข้อ ในขณะที่แบบทดสอบที่สองหลังคลาสจะช่วยเพิ่มการจดจำเพิ่มเติม หลักสูตรนี้ได้รับการออกแบบให้ยืดหยุ่นและสนุกสนาน และสามารถเรียนได้ทั้งหมดหรือบางส่วน โครงการเริ่มต้นเล็ก ๆ และมีความซับซ้อนมากขึ้นเรื่อย ๆ จนถึงสิ้นสุดรอบ 12 สัปดาห์ หลักสูตรนี้ยังรวมถึงบทส่งท้ายเกี่ยวกับการประยุกต์ใช้ ML ในโลกจริง ซึ่งสามารถใช้เป็นเครดิตเพิ่มเติมหรือเป็นพื้นฐานสำหรับการอภิปราย + +> ค้นหา [Code of Conduct](CODE_OF_CONDUCT.md), [Contributing](CONTRIBUTING.md), และ [Translation](TRANSLATIONS.md) แนวทาง เราขอต้อนรับความคิดเห็นที่สร้างสรรค์ของคุณ! + +## แต่ละบทเรียนประกอบด้วย + +- sketchnote (ตัวเลือก) +- วิดีโอเสริม (ตัวเลือก) +- วิดีโอแนะนำ (บางบทเรียนเท่านั้น) +- [แบบทดสอบอุ่นเครื่องก่อนการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) +- บทเรียนที่เขียนไว้ +- สำหรับบทเรียนที่เน้นโครงการ คู่มือทีละขั้นตอนเกี่ยวกับวิธีการสร้างโครงการ +- การตรวจสอบความรู้ +- แบบท้าทาย +- การอ่านเสริม +- งานมอบหมาย +- [แบบทดสอบหลังการบรรยาย](https://ff-quizzes.netlify.app/en/ml/) + +> **หมายเหตุเกี่ยวกับภาษา**: บทเรียนเหล่านี้เขียนใน Python เป็นหลัก แต่หลายบทเรียนก็มีใน R ด้วย หากต้องการทำบทเรียน R ให้ไปที่โฟลเดอร์ `/solution` และมองหาบทเรียน R ซึ่งมีนามสกุล .rmd ที่แสดงถึงไฟล์ **R Markdown** ซึ่งสามารถกำหนดได้ง่าย ๆ ว่าเป็นการฝัง `code chunks` (ของ R หรือภาษาอื่น ๆ) และ `YAML header` (ที่แนะนำวิธีการจัดรูปแบบผลลัพธ์ เช่น PDF) ในเอกสาร `Markdown` ดังนั้นจึงเป็นกรอบการเขียนที่เป็นตัวอย่างสำหรับวิทยาศาสตร์ข้อมูล เนื่องจากช่วยให้คุณรวมโค้ด ผลลัพธ์ และความคิดของคุณโดยเขียนลงใน Markdown นอกจากนี้ เอกสาร R Markdown สามารถแสดงผลในรูปแบบผลลัพธ์ เช่น PDF, HTML หรือ Word + +> **หมายเหตุเกี่ยวกับแบบทดสอบ**: แบบทดสอบทั้งหมดอยู่ใน [โฟลเดอร์ Quiz App](../../quiz-app) รวมทั้งหมด 52 แบบทดสอบ แต่ละแบบมีสามคำถาม แบบทดสอบเหล่านี้เชื่อมโยงจากในบทเรียน แต่แอปแบบทดสอบสามารถรันได้ในเครื่อง ให้ทำตามคำแนะนำในโฟลเดอร์ `quiz-app` เพื่อโฮสต์ในเครื่องหรือปรับใช้ใน Azure + +| หมายเลขบทเรียน | หัวข้อ | กลุ่มบทเรียน | วัตถุประสงค์การเรียนรู้ | บทเรียนที่เชื่อมโยง | ผู้เขียน | +| :-----------: | :------------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: | +| 01 | บทนำเกี่ยวกับการเรียนรู้ของเครื่อง | [Introduction](1-Introduction/README.md) | เรียนรู้แนวคิดพื้นฐานเกี่ยวกับการเรียนรู้ของเครื่อง | [บทเรียน](1-Introduction/1-intro-to-ML/README.md) | Muhammad | +| 02 | ประวัติศาสตร์ของการเรียนรู้ของเครื่อง | [Introduction](1-Introduction/README.md) | เรียนรู้ประวัติศาสตร์ที่อยู่เบื้องหลังสาขานี้ | [บทเรียน](1-Introduction/2-history-of-ML/README.md) | Jen และ Amy | +| 03 | ความยุติธรรมและการเรียนรู้ของเครื่อง | [Introduction](1-Introduction/README.md) | ประเด็นปรัชญาที่สำคัญเกี่ยวกับความยุติธรรมที่นักเรียนควรพิจารณาเมื่อสร้างและใช้โมเดล ML คืออะไร? | [บทเรียน](1-Introduction/3-fairness/README.md) | Tomomi | +| 04 | เทคนิคสำหรับการเรียนรู้ของเครื่อง | [Introduction](1-Introduction/README.md) | นักวิจัย ML ใช้เทคนิคอะไรในการสร้างโมเดล ML? | [Lesson](1-Introduction/4-techniques-of-ML/README.md) | Chris และ Jen | +| 05 | บทนำสู่การถดถอย | [Regression](2-Regression/README.md) | เริ่มต้นใช้งาน Python และ Scikit-learn สำหรับโมเดลการถดถอย | +
                      • [Python](2-Regression/1-Tools/README.md)
                      • [R](../../2-Regression/1-Tools/solution/R/lesson_1.html)
                      |
                      • Jen
                      • Eric Wanjau
                      | +| 06 | ราคาฟักทองในอเมริกาเหนือ 🎃 | [Regression](2-Regression/README.md) | การแสดงผลและทำความสะอาดข้อมูลเพื่อเตรียมพร้อมสำหรับ ML |
                      • [Python](2-Regression/2-Data/README.md)
                      • [R](../../2-Regression/2-Data/solution/R/lesson_2.html)
                      |
                      • Jen
                      • Eric Wanjau
                      | +| 07 | ราคาฟักทองในอเมริกาเหนือ 🎃 | [Regression](2-Regression/README.md) | สร้างโมเดลการถดถอยเชิงเส้นและพหุนาม |
                      • [Python](2-Regression/3-Linear/README.md)
                      • [R](../../2-Regression/3-Linear/solution/R/lesson_3.html)
                      |
                      • Jen และ Dmitry
                      • Eric Wanjau
                      | +| 08 | ราคาฟักทองในอเมริกาเหนือ 🎃 | [Regression](2-Regression/README.md) | สร้างโมเดลการถดถอยโลจิสติก |
                      • [Python](2-Regression/4-Logistic/README.md)
                      • [R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)
                      |
                      • Jen
                      • Eric Wanjau
                      | +| 09 | แอปพลิเคชันเว็บ 🔌 | [Web App](3-Web-App/README.md) | สร้างแอปพลิเคชันเว็บเพื่อใช้งานโมเดลที่คุณฝึกมาแล้ว | [Python](3-Web-App/1-Web-App/README.md) | Jen | +| 10 | บทนำสู่การจัดประเภท | [Classification](4-Classification/README.md) | ทำความสะอาด เตรียมข้อมูล และแสดงผลข้อมูล; บทนำสู่การจัดประเภท |
                      • [Python](4-Classification/1-Introduction/README.md)
                      • [R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) |
                        • Jen และ Cassie
                        • Eric Wanjau
                        | +| 11 | อาหารเอเชียและอินเดียแสนอร่อย 🍜 | [Classification](4-Classification/README.md) | บทนำสู่ตัวจัดประเภท |
                        • [Python](4-Classification/2-Classifiers-1/README.md)
                        • [R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) |
                          • Jen และ Cassie
                          • Eric Wanjau
                          | +| 12 | อาหารเอเชียและอินเดียแสนอร่อย 🍜 | [Classification](4-Classification/README.md) | ตัวจัดประเภทเพิ่มเติม |
                          • [Python](4-Classification/3-Classifiers-2/README.md)
                          • [R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) |
                            • Jen และ Cassie
                            • Eric Wanjau
                            | +| 13 | อาหารเอเชียและอินเดียแสนอร่อย 🍜 | [Classification](4-Classification/README.md) | สร้างแอปพลิเคชันเว็บแนะนำโดยใช้โมเดลของคุณ | [Python](4-Classification/4-Applied/README.md) | Jen | +| 14 | บทนำสู่การจัดกลุ่ม | [Clustering](5-Clustering/README.md) | ทำความสะอาด เตรียมข้อมูล และแสดงผลข้อมูล; บทนำสู่การจัดกลุ่ม |
                            • [Python](5-Clustering/1-Visualize/README.md)
                            • [R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) |
                              • Jen
                              • Eric Wanjau
                              | +| 15 | สำรวจรสนิยมดนตรีของไนจีเรีย 🎧 | [Clustering](5-Clustering/README.md) | สำรวจวิธีการจัดกลุ่มแบบ K-Means |
                              • [Python](5-Clustering/2-K-Means/README.md)
                              • [R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) |
                                • Jen
                                • Eric Wanjau
                                | +| 16 | บทนำสู่การประมวลผลภาษาธรรมชาติ ☕️ | [Natural language processing](6-NLP/README.md) | เรียนรู้พื้นฐานเกี่ยวกับ NLP โดยการสร้างบอทง่ายๆ | [Python](6-NLP/1-Introduction-to-NLP/README.md) | Stephen | +| 17 | งาน NLP ทั่วไป ☕️ | [Natural language processing](6-NLP/README.md) | เพิ่มพูนความรู้เกี่ยวกับ NLP โดยทำความเข้าใจงานทั่วไปที่เกี่ยวข้องกับโครงสร้างภาษา | [Python](6-NLP/2-Tasks/README.md) | Stephen | +| 18 | การแปลและการวิเคราะห์ความรู้สึก ♥️ | [Natural language processing](6-NLP/README.md) | การแปลและการวิเคราะห์ความรู้สึกด้วยงานของ Jane Austen | [Python](6-NLP/3-Translation-Sentiment/README.md) | Stephen | +| 19 | โรงแรมโรแมนติกในยุโรป ♥️ | [Natural language processing](6-NLP/README.md) | การวิเคราะห์ความรู้สึกด้วยรีวิวโรงแรม 1 | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | Stephen | +| 20 | โรงแรมโรแมนติกในยุโรป ♥️ | [Natural language processing](6-NLP/README.md) | การวิเคราะห์ความรู้สึกด้วยรีวิวโรงแรม 2 | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | Stephen | +| 21 | บทนำสู่การพยากรณ์อนุกรมเวลา | [Time series](7-TimeSeries/README.md) | บทนำสู่การพยากรณ์อนุกรมเวลา | [Python](7-TimeSeries/1-Introduction/README.md) | Francesca | +| 22 | ⚡️ การใช้พลังงานโลก ⚡️ - การพยากรณ์อนุกรมเวลาด้วย ARIMA | [Time series](7-TimeSeries/README.md) | การพยากรณ์อนุกรมเวลาด้วย ARIMA | [Python](7-TimeSeries/2-ARIMA/README.md) | Francesca | +| 23 | ⚡️ การใช้พลังงานโลก ⚡️ - การพยากรณ์อนุกรมเวลาด้วย SVR | [Time series](7-TimeSeries/README.md) | การพยากรณ์อนุกรมเวลาด้วย Support Vector Regressor | [Python](7-TimeSeries/3-SVR/README.md) | Anirban | +| 24 | บทนำสู่การเรียนรู้เสริมกำลัง | [Reinforcement learning](8-Reinforcement/README.md) | บทนำสู่การเรียนรู้เสริมกำลังด้วย Q-Learning | [Python](8-Reinforcement/1-QLearning/README.md) | Dmitry | +| 25 | ช่วยปีเตอร์หลบหมาป่า! 🐺 | [Reinforcement learning](8-Reinforcement/README.md) | การเรียนรู้เสริมกำลังใน Gym | [Python](8-Reinforcement/2-Gym/README.md) | Dmitry | +| Postscript | สถานการณ์และการประยุกต์ใช้ ML ในโลกจริง | [ML in the Wild](9-Real-World/README.md) | การประยุกต์ใช้ ML แบบคลาสสิกในโลกจริงที่น่าสนใจและเปิดเผย | [Lesson](9-Real-World/1-Applications/README.md) | Team | +| Postscript | การดีบักโมเดลใน ML ด้วยแดชบอร์ด RAI | [ML in the Wild](9-Real-World/README.md) | การดีบักโมเดลใน Machine Learning ด้วยส่วนประกอบแดชบอร์ด Responsible AI | [Lesson](9-Real-World/2-Debugging-ML-Models/README.md) | Ruth Yakubu | + +> [ค้นหาทรัพยากรเพิ่มเติมสำหรับคอร์สนี้ใน Microsoft Learn collection ของเรา](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum) + +## การเข้าถึงแบบออฟไลน์ + +คุณสามารถเรียกใช้เอกสารนี้แบบออฟไลน์ได้โดยใช้ [Docsify](https://docsify.js.org/#/). Fork repo นี้, [ติดตั้ง Docsify](https://docsify.js.org/#/quickstart) บนเครื่องของคุณ, และในโฟลเดอร์ root ของ repo นี้, พิมพ์ `docsify serve`. เว็บไซต์จะถูกให้บริการบนพอร์ต 3000 บน localhost ของคุณ: `localhost:3000`. + +## PDFs + +ค้นหาไฟล์ pdf ของหลักสูตรพร้อมลิงก์ [ที่นี่](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf). + + +## 🎒 คอร์สอื่นๆ + +ทีมของเราผลิตคอร์สอื่นๆ! ลองดู: + +- [Generative AI for Beginners](https://aka.ms/genai-beginners) +- [Generative AI for Beginners .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet) +- [Generative AI with JavaScript](https://github.com/microsoft/generative-ai-with-javascript) +- [Generative AI with Java](https://github.com/microsoft/Generative-AI-for-beginners-java) +- [AI for Beginners](https://aka.ms/ai-beginners) +- [Data Science for Beginners](https://aka.ms/datascience-beginners) +- [ML for Beginners](https://aka.ms/ml-beginners) +- [Cybersecurity for Beginners](https://github.com/microsoft/Security-101) +- [Web Dev for Beginners](https://aka.ms/webdev-beginners) +- [IoT for Beginners](https://aka.ms/iot-beginners) +- [XR Development for Beginners](https://github.com/microsoft/xr-development-for-beginners) +- [Mastering GitHub Copilot for Paired Programming](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming) +- [Mastering GitHub Copilot for C#/.NET Developers](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers) +- [Choose Your Own Copilot Adventure](https://github.com/microsoft/CopilotAdventures) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/SECURITY.md b/translations/th/SECURITY.md new file mode 100644 index 000000000..60350fe54 --- /dev/null +++ b/translations/th/SECURITY.md @@ -0,0 +1,51 @@ + +## ความปลอดภัย + +Microsoft ให้ความสำคัญกับความปลอดภัยของผลิตภัณฑ์ซอฟต์แวร์และบริการของเราอย่างจริงจัง ซึ่งรวมถึงที่เก็บซอร์สโค้ดทั้งหมดที่จัดการผ่านองค์กร GitHub ของเรา เช่น [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin) และ [องค์กร GitHub ของเรา](https://opensource.microsoft.com/) + +หากคุณเชื่อว่าคุณพบช่องโหว่ด้านความปลอดภัยในที่เก็บใด ๆ ที่ Microsoft เป็นเจ้าของ ซึ่งตรงตาม [คำจำกัดความของช่องโหว่ด้านความปลอดภัยของ Microsoft](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott) โปรดรายงานให้เราทราบตามที่อธิบายไว้ด้านล่าง + +## การรายงานปัญหาด้านความปลอดภัย + +**โปรดอย่ารายงานช่องโหว่ด้านความปลอดภัยผ่านปัญหาสาธารณะใน GitHub** + +ให้รายงานไปยัง Microsoft Security Response Center (MSRC) ที่ [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report) + +หากคุณต้องการส่งรายงานโดยไม่ต้องเข้าสู่ระบบ สามารถส่งอีเมลไปที่ [secure@microsoft.com](mailto:secure@microsoft.com) หากเป็นไปได้ โปรดเข้ารหัสข้อความของคุณด้วยกุญแจ PGP ของเรา โดยสามารถดาวน์โหลดได้จาก [หน้ากุญแจ PGP ของ Microsoft Security Response Center](https://www.microsoft.com/en-us/msrc/pgp-key-msrc) + +คุณควรได้รับการตอบกลับภายใน 24 ชั่วโมง หากไม่ได้รับการตอบกลับ โปรดติดตามผลทางอีเมลเพื่อยืนยันว่าเราได้รับข้อความของคุณแล้ว ข้อมูลเพิ่มเติมสามารถดูได้ที่ [microsoft.com/msrc](https://www.microsoft.com/msrc) + +โปรดระบุข้อมูลที่ร้องขอด้านล่าง (เท่าที่คุณสามารถให้ได้) เพื่อช่วยให้เราเข้าใจลักษณะและขอบเขตของปัญหาได้ดียิ่งขึ้น: + + * ประเภทของปัญหา (เช่น buffer overflow, SQL injection, cross-site scripting เป็นต้น) + * เส้นทางเต็มของไฟล์ซอร์สที่เกี่ยวข้องกับการเกิดปัญหา + * ตำแหน่งของซอร์สโค้ดที่ได้รับผลกระทบ (tag/branch/commit หรือ URL โดยตรง) + * การตั้งค่าพิเศษที่จำเป็นในการทำให้ปัญหาเกิดขึ้น + * คำแนะนำทีละขั้นตอนในการทำให้ปัญหาเกิดขึ้น + * โค้ดตัวอย่างหรือโค้ดโจมตี (ถ้าเป็นไปได้) + * ผลกระทบของปัญหา รวมถึงวิธีที่ผู้โจมตีอาจใช้ประโยชน์จากปัญหา + +ข้อมูลเหล่านี้จะช่วยให้เราประเมินรายงานของคุณได้รวดเร็วยิ่งขึ้น + +หากคุณรายงานเพื่อรับรางวัลจากโปรแกรม Bug Bounty รายงานที่สมบูรณ์มากขึ้นอาจช่วยให้คุณได้รับรางวัลที่สูงขึ้น โปรดเยี่ยมชมหน้า [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับโปรแกรมที่กำลังดำเนินการอยู่ + +## ภาษาที่แนะนำ + +เราขอแนะนำให้สื่อสารทั้งหมดเป็นภาษาอังกฤษ + +## นโยบาย + +Microsoft ปฏิบัติตามหลักการของ [การเปิดเผยช่องโหว่แบบประสานงาน](https://www.microsoft.com/en-us/msrc/cvd) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/SUPPORT.md b/translations/th/SUPPORT.md new file mode 100644 index 000000000..35533815a --- /dev/null +++ b/translations/th/SUPPORT.md @@ -0,0 +1,24 @@ + +# การสนับสนุน +## วิธีรายงานปัญหาและขอความช่วยเหลือ + +โครงการนี้ใช้ GitHub Issues ในการติดตามข้อบกพร่องและคำขอฟีเจอร์ โปรดค้นหาปัญหาที่มีอยู่ก่อนที่จะรายงานปัญหาใหม่เพื่อหลีกเลี่ยงการซ้ำซ้อน สำหรับปัญหาใหม่ ให้รายงานข้อบกพร่องหรือคำขอฟีเจอร์ของคุณเป็น Issue ใหม่ + +สำหรับความช่วยเหลือและคำถามเกี่ยวกับการใช้งานโครงการนี้ ให้รายงานเป็น Issue + +## นโยบายการสนับสนุนของ Microsoft + +การสนับสนุนสำหรับที่เก็บนี้จำกัดอยู่เฉพาะทรัพยากรที่ระบุไว้ข้างต้น + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/docs/_sidebar.md b/translations/th/docs/_sidebar.md new file mode 100644 index 000000000..3671cdb8f --- /dev/null +++ b/translations/th/docs/_sidebar.md @@ -0,0 +1,57 @@ + +- บทนำ + - [บทนำสู่การเรียนรู้ของเครื่อง](../1-Introduction/1-intro-to-ML/README.md) + - [ประวัติศาสตร์ของการเรียนรู้ของเครื่อง](../1-Introduction/2-history-of-ML/README.md) + - [การเรียนรู้ของเครื่องและความเป็นธรรม](../1-Introduction/3-fairness/README.md) + - [เทคนิคของการเรียนรู้ของเครื่อง](../1-Introduction/4-techniques-of-ML/README.md) + +- การถดถอย + - [เครื่องมือที่ใช้ในงาน](../2-Regression/1-Tools/README.md) + - [ข้อมูล](../2-Regression/2-Data/README.md) + - [การถดถอยเชิงเส้น](../2-Regression/3-Linear/README.md) + - [การถดถอยโลจิสติก](../2-Regression/4-Logistic/README.md) + +- สร้างแอปพลิเคชันเว็บ + - [แอปพลิเคชันเว็บ](../3-Web-App/1-Web-App/README.md) + +- การจัดประเภท + - [บทนำสู่การจัดประเภท](../4-Classification/1-Introduction/README.md) + - [ตัวจัดประเภท 1](../4-Classification/2-Classifiers-1/README.md) + - [ตัวจัดประเภท 2](../4-Classification/3-Classifiers-2/README.md) + - [การประยุกต์ใช้การเรียนรู้ของเครื่อง](../4-Classification/4-Applied/README.md) + +- การจัดกลุ่ม + - [การแสดงผลข้อมูลของคุณ](../5-Clustering/1-Visualize/README.md) + - [K-Means](../5-Clustering/2-K-Means/README.md) + +- การประมวลผลภาษาธรรมชาติ (NLP) + - [บทนำสู่การประมวลผลภาษาธรรมชาติ](../6-NLP/1-Introduction-to-NLP/README.md) + - [งานใน NLP](../6-NLP/2-Tasks/README.md) + - [การแปลและการวิเคราะห์ความรู้สึก](../6-NLP/3-Translation-Sentiment/README.md) + - [รีวิวโรงแรม 1](../6-NLP/4-Hotel-Reviews-1/README.md) + - [รีวิวโรงแรม 2](../6-NLP/5-Hotel-Reviews-2/README.md) + +- การพยากรณ์อนุกรมเวลา + - [บทนำสู่การพยากรณ์อนุกรมเวลา](../7-TimeSeries/1-Introduction/README.md) + - [ARIMA](../7-TimeSeries/2-ARIMA/README.md) + - [SVR](../7-TimeSeries/3-SVR/README.md) + +- การเรียนรู้แบบเสริมกำลัง + - [Q-Learning](../8-Reinforcement/1-QLearning/README.md) + - [Gym](../8-Reinforcement/2-Gym/README.md) + +- การเรียนรู้ของเครื่องในโลกจริง + - [การประยุกต์ใช้งาน](../9-Real-World/1-Applications/README.md) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/for-teachers.md b/translations/th/for-teachers.md new file mode 100644 index 000000000..052a92c05 --- /dev/null +++ b/translations/th/for-teachers.md @@ -0,0 +1,37 @@ + +## สำหรับครูผู้สอน + +คุณต้องการใช้หลักสูตรนี้ในห้องเรียนของคุณหรือไม่? ใช้ได้เลย! + +จริง ๆ แล้ว คุณสามารถใช้มันผ่าน GitHub โดยใช้ GitHub Classroom ได้เช่นกัน + +วิธีการคือ ให้คุณ fork repo นี้ คุณจะต้องสร้าง repo สำหรับแต่ละบทเรียน ดังนั้นคุณจะต้องแยกแต่ละโฟลเดอร์ออกมาเป็น repo แยกต่างหาก ด้วยวิธีนี้ [GitHub Classroom](https://classroom.github.com/classrooms) จะสามารถจัดการแต่ละบทเรียนแยกกันได้ + +คำแนะนำ [ฉบับเต็ม](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) นี้จะช่วยให้คุณเข้าใจวิธีการตั้งค่าห้องเรียนของคุณ + +## การใช้ repo ในรูปแบบปัจจุบัน + +หากคุณต้องการใช้ repo นี้ในรูปแบบที่เป็นอยู่ โดยไม่ใช้ GitHub Classroom ก็สามารถทำได้เช่นกัน คุณจะต้องสื่อสารกับนักเรียนว่าควรทำงานในบทเรียนใดร่วมกัน + +ในรูปแบบออนไลน์ (Zoom, Teams หรืออื่น ๆ) คุณอาจสร้างห้องย่อยสำหรับการทำแบบทดสอบ และช่วยแนะนำนักเรียนเพื่อเตรียมตัวเรียนรู้ จากนั้นเชิญนักเรียนเข้าร่วมทำแบบทดสอบและส่งคำตอบในรูปแบบ 'issues' ในเวลาที่กำหนด คุณอาจใช้วิธีเดียวกันกับงานที่มอบหมาย หากคุณต้องการให้นักเรียนทำงานร่วมกันในที่เปิดเผย + +หากคุณต้องการรูปแบบที่เป็นส่วนตัวมากขึ้น ให้ขอให้นักเรียน fork หลักสูตรนี้ บทเรียนต่อบทเรียน ไปยัง repo GitHub ของพวกเขาเองในรูปแบบ private repo และให้สิทธิ์การเข้าถึงแก่คุณ จากนั้นพวกเขาสามารถทำแบบทดสอบและงานที่มอบหมายในรูปแบบส่วนตัว และส่งให้คุณผ่าน issues ใน repo ห้องเรียนของคุณ + +มีหลายวิธีที่จะทำให้การเรียนการสอนในรูปแบบออนไลน์นี้ได้ผล กรุณาแจ้งให้เราทราบว่าวิธีใดที่เหมาะสมที่สุดสำหรับคุณ! + +## กรุณาแสดงความคิดเห็นของคุณ! + +เราต้องการให้หลักสูตรนี้เหมาะสมกับคุณและนักเรียนของคุณ กรุณาให้ [ความคิดเห็น](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u) ของคุณแก่เรา + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/quiz-app/README.md b/translations/th/quiz-app/README.md new file mode 100644 index 000000000..7df1039b7 --- /dev/null +++ b/translations/th/quiz-app/README.md @@ -0,0 +1,127 @@ + +# แบบทดสอบ + +แบบทดสอบเหล่านี้เป็นแบบทดสอบก่อนและหลังการบรรยายสำหรับหลักสูตร ML ที่ https://aka.ms/ml-beginners + +## การตั้งค่าโปรเจกต์ + +``` +npm install +``` + +### คอมไพล์และรีโหลดแบบสดสำหรับการพัฒนา + +``` +npm run serve +``` + +### คอมไพล์และย่อขนาดสำหรับการผลิต + +``` +npm run build +``` + +### ตรวจสอบและแก้ไขไฟล์ + +``` +npm run lint +``` + +### ปรับแต่งการตั้งค่า + +ดู [การอ้างอิงการตั้งค่า](https://cli.vuejs.org/config/). + +เครดิต: ขอบคุณเวอร์ชันต้นฉบับของแอปแบบทดสอบนี้: https://github.com/arpan45/simple-quiz-vue + +## การปรับใช้บน Azure + +นี่คือคำแนะนำทีละขั้นตอนเพื่อช่วยให้คุณเริ่มต้นได้: + +1. Fork GitHub Repository +ตรวจสอบให้แน่ใจว่าโค้ดเว็บแอปแบบสแตติกของคุณอยู่ใน GitHub repository ของคุณ Fork repository นี้ + +2. สร้าง Azure Static Web App +- สร้าง [บัญชี Azure](http://azure.microsoft.com) +- ไปที่ [Azure portal](https://portal.azure.com) +- คลิกที่ “Create a resource” และค้นหา “Static Web App” +- คลิก “Create” + +3. ตั้งค่า Static Web App +- พื้นฐาน: + - Subscription: เลือกการสมัครใช้งาน Azure ของคุณ + - Resource Group: สร้าง resource group ใหม่หรือใช้ resource group ที่มีอยู่ + - Name: ตั้งชื่อสำหรับเว็บแอปแบบสแตติกของคุณ + - Region: เลือกภูมิภาคที่ใกล้กับผู้ใช้ของคุณ + +- #### รายละเอียดการปรับใช้: + - Source: เลือก “GitHub” + - GitHub Account: อนุญาตให้ Azure เข้าถึงบัญชี GitHub ของคุณ + - Organization: เลือกองค์กร GitHub ของคุณ + - Repository: เลือก repository ที่มีเว็บแอปแบบสแตติกของคุณ + - Branch: เลือก branch ที่คุณต้องการปรับใช้ + +- #### รายละเอียดการสร้าง: + - Build Presets: เลือก framework ที่แอปของคุณสร้างขึ้น (เช่น React, Angular, Vue เป็นต้น) + - App Location: ระบุโฟลเดอร์ที่มีโค้ดแอปของคุณ (เช่น / หากอยู่ใน root) + - API Location: หากคุณมี API ให้ระบุตำแหน่ง (ไม่บังคับ) + - Output Location: ระบุโฟลเดอร์ที่สร้างผลลัพธ์การ build (เช่น build หรือ dist) + +4. ตรวจสอบและสร้าง +ตรวจสอบการตั้งค่าของคุณและคลิก “Create” Azure จะตั้งค่าทรัพยากรที่จำเป็นและสร้าง GitHub Actions workflow ใน repository ของคุณ + +5. GitHub Actions Workflow +Azure จะสร้างไฟล์ GitHub Actions workflow ใน repository ของคุณโดยอัตโนมัติ (.github/workflows/azure-static-web-apps-.yml) ไฟล์ workflow นี้จะจัดการกระบวนการ build และปรับใช้ + +6. ตรวจสอบการปรับใช้ +ไปที่แท็บ “Actions” ใน GitHub repository ของคุณ +คุณควรเห็น workflow กำลังทำงาน Workflow นี้จะ build และปรับใช้เว็บแอปแบบสแตติกของคุณไปยัง Azure +เมื่อ workflow เสร็จสิ้น แอปของคุณจะใช้งานได้บน URL ที่ Azure ให้มา + +### ตัวอย่างไฟล์ Workflow + +นี่คือตัวอย่างไฟล์ GitHub Actions workflow: +name: Azure Static Web Apps CI/CD +``` +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - main + +jobs: + build_and_deploy_job: + runs-on: ubuntu-latest + name: Build and Deploy Job + steps: + - uses: actions/checkout@v2 + - name: Build And Deploy + id: builddeploy + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }} + repo_token: ${{ secrets.GITHUB_TOKEN }} + action: "upload" + app_location: "/quiz-app" # App source code path + api_location: ""API source code path optional + output_location: "dist" #Built app content directory - optional +``` + +### แหล่งข้อมูลเพิ่มเติม +- [เอกสาร Azure Static Web Apps](https://learn.microsoft.com/azure/static-web-apps/getting-started) +- [เอกสาร GitHub Actions](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/sketchnotes/LICENSE.md b/translations/th/sketchnotes/LICENSE.md new file mode 100644 index 000000000..509dd5c32 --- /dev/null +++ b/translations/th/sketchnotes/LICENSE.md @@ -0,0 +1,119 @@ + +สิทธิ์, คุณต้องอนุญาตให้ผู้อื่นใช้ฐานข้อมูลนั้นภายใต้เงื่อนไขเดียวกันกับที่ระบุในใบอนุญาตนี้; และ + + c. คุณต้องปฏิบัติตามเงื่อนไขในส่วนที่ 3(a) และ 3(b) หากคุณแบ่งปันเนื้อหาของฐานข้อมูลทั้งหมดหรือบางส่วน + +ส่วนที่ 5 -- การรับประกันและการปฏิเสธความรับผิดชอบ + + a. เว้นแต่จะระบุไว้เป็นอย่างอื่นโดยชัดแจ้ง Licensor ไม่ให้การรับประกันใด ๆ เกี่ยวกับ Licensed Material รวมถึงแต่ไม่จำกัดเพียงการรับประกันเกี่ยวกับความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ความสามารถในการขาย ความถูกต้อง หรือการไม่ละเมิดสิทธิ์ + + b. Licensor ปฏิเสธความรับผิดชอบทั้งหมดสำหรับการสูญเสีย ความเสียหาย หรือความรับผิดใด ๆ ที่เกิดขึ้นจากการใช้ Licensed Material ในขอบเขตสูงสุดที่กฎหมายอนุญาต + +ส่วนที่ 6 -- ระยะเวลาและการยกเลิก + + a. ระยะเวลา + + 1. ใบอนุญาตนี้มีผลบังคับใช้ตราบเท่าที่สิทธิ์ในลิขสิทธิ์และสิทธิ์ที่คล้ายคลึงกันใน Licensed Material ยังคงมีอยู่ + + 2. หากคุณละเมิดเงื่อนไขของใบอนุญาตนี้ ใบอนุญาตของคุณจะถูกยกเลิกโดยอัตโนมัติ + + b. การคืนสิทธิ์ + + หากใบอนุญาตของคุณถูกยกเลิก คุณสามารถคืนสิทธิ์ได้โดยอัตโนมัติหากคุณแก้ไขการละเมิดของคุณภายใน 30 วัน + + c. การยกเลิกโดย Licensor + + Licensor ขอสงวนสิทธิ์ในการยกเลิกใบอนุญาตนี้ในกรณีที่มีการละเมิดเงื่อนไขที่สำคัญ + + d. ผลของการยกเลิก + + การยกเลิกใบอนุญาตนี้ไม่ส่งผลต่อสิทธิ์ที่ได้รับจากผู้รับก่อนการยกเลิก + + e. การอยู่รอดของเงื่อนไข + + เงื่อนไขในส่วนที่ 1, 5, 6, 7 และ 8 ยังคงมีผลบังคับใช้หลังจากการยกเลิกใบอนุญาตนี้ + +ส่วนที่ 7 -- เงื่อนไขอื่น ๆ + + a. ใบอนุญาตนี้ไม่ลดทอนหรือจำกัดสิทธิ์ใด ๆ ที่คุณอาจมีภายใต้กฎหมายที่บังคับใช้ + + b. หากเงื่อนไขใด ๆ ของใบอนุญาตนี้ถือว่าไม่สามารถบังคับใช้ได้ เงื่อนไขที่เหลือจะยังคงมีผลบังคับใช้ + + c. ไม่มีเงื่อนไขใดในใบอนุญาตนี้ที่ถือว่าเป็นการสละสิทธิ์ใด ๆ เว้นแต่จะระบุไว้เป็นลายลักษณ์อักษรและลงนามโดย Licensor + +ส่วนที่ 8 -- การตีความ + + a. ใบอนุญาตนี้จะถูกตีความตามเงื่อนไขที่ระบุไว้ในเอกสารนี้และไม่ขึ้นอยู่กับเงื่อนไขอื่นใด + + b. หากมีข้อสงสัยเกี่ยวกับการตีความใบอนุญาตนี้ ให้ใช้เวอร์ชันที่เผยแพร่โดย Creative Commons เป็นมาตรฐาน + +Creative Commons Corporation ("Creative Commons") ไม่ใช่สำนักงานกฎหมายและไม่ได้ให้บริการหรือคำแนะนำทางกฎหมาย การแจกจ่ายใบอนุญาตสาธารณะของ Creative Commons ไม่ได้สร้างความสัมพันธ์ระหว่างทนายความและลูกค้า หรือความสัมพันธ์อื่นใด Creative Commons ทำให้ใบอนุญาตและข้อมูลที่เกี่ยวข้องพร้อมใช้งานในลักษณะ "ตามสภาพ" Creative Commons ไม่รับประกันเกี่ยวกับใบอนุญาต วัสดุที่ได้รับอนุญาตภายใต้เงื่อนไขและข้อกำหนด หรือข้อมูลที่เกี่ยวข้อง Creative Commons ปฏิเสธความรับผิดทั้งหมดสำหรับความเสียหายที่เกิดจากการใช้งานในขอบเขตสูงสุดที่กฎหมายอนุญาต +สิทธิ์ในฐานข้อมูลที่คุณมีสิทธิ์ในฐานข้อมูล Sui Generis Database Rights (แต่ไม่รวมถึงเนื้อหาแต่ละรายการ) ถือเป็นวัสดุที่ดัดแปลง + +รวมถึงเพื่อวัตถุประสงค์ในมาตรา 3(b); และ +c. คุณต้องปฏิบัติตามเงื่อนไขในมาตรา 3(a) หากคุณแบ่งปันเนื้อหาทั้งหมดหรือส่วนสำคัญของฐานข้อมูล + +เพื่อหลีกเลี่ยงความเข้าใจผิด มาตรา 4 นี้เป็นการเพิ่มเติมและไม่ได้แทนที่ภาระผูกพันของคุณภายใต้ใบอนุญาตสาธารณะนี้เมื่อสิทธิ์ที่ได้รับอนุญาตรวมถึงลิขสิทธิ์และสิทธิ์ที่คล้ายคลึงกันอื่น ๆ + + +มาตรา 5 -- การปฏิเสธการรับประกันและการจำกัดความรับผิด + +a. เว้นแต่ผู้อนุญาตจะได้ดำเนินการแยกต่างหากในลักษณะอื่น ในขอบเขตที่เป็นไปได้ ผู้อนุญาตเสนอวัสดุที่ได้รับอนุญาตในสภาพที่เป็นอยู่และตามที่มีอยู่ และไม่ได้ให้การรับรองหรือการรับประกันใด ๆ เกี่ยวกับวัสดุที่ได้รับอนุญาต ไม่ว่าจะเป็นการรับรองโดยชัดแจ้ง โดยนัย ตามกฎหมาย หรืออื่น ๆ ซึ่งรวมถึงแต่ไม่จำกัดเพียง การรับประกันเกี่ยวกับกรรมสิทธิ์ ความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ การไม่ละเมิด การไม่มีข้อบกพร่องแฝงหรือข้อบกพร่องอื่น ๆ ความถูกต้อง หรือการมีหรือไม่มีข้อผิดพลาด ไม่ว่าจะทราบหรือค้นพบได้หรือไม่ ในกรณีที่การปฏิเสธการรับประกันไม่ได้รับอนุญาตทั้งหมดหรือบางส่วน การปฏิเสธนี้อาจไม่สามารถใช้กับคุณได้ + +b. ในขอบเขตที่เป็นไปได้ ผู้อนุญาตจะไม่รับผิดชอบต่อคุณในทางทฤษฎีกฎหมายใด ๆ (รวมถึงแต่ไม่จำกัดเพียง ความประมาทเลินเล่อ) หรืออื่น ๆ สำหรับความสูญเสีย ค่าใช้จ่าย ค่าเสียหาย หรือความเสียหายใด ๆ ที่เกิดขึ้นโดยตรง พิเศษ โดยอ้อม โดยบังเอิญ เป็นผลสืบเนื่อง เป็นการลงโทษ เป็นตัวอย่าง หรืออื่น ๆ ที่เกิดขึ้นจากใบอนุญาตสาธารณะนี้หรือการใช้วัสดุที่ได้รับอนุญาต แม้ว่าผู้อนุญาตจะได้รับการแจ้งเตือนถึงความเป็นไปได้ของความสูญเสีย ค่าใช้จ่าย หรือความเสียหายดังกล่าว ในกรณีที่การจำกัดความรับผิดไม่ได้รับอนุญาตทั้งหมดหรือบางส่วน การจำกัดนี้อาจไม่สามารถใช้กับคุณได้ + +c. การปฏิเสธการรับประกันและการจำกัดความรับผิดที่ระบุไว้ข้างต้นจะถูกตีความในลักษณะที่ใกล้เคียงที่สุดกับการปฏิเสธและการสละสิทธิ์ความรับผิดทั้งหมดในขอบเขตที่เป็นไปได้ + + +มาตรา 6 -- ระยะเวลาและการสิ้นสุด + +a. ใบอนุญาตสาธารณะนี้มีผลบังคับใช้ตลอดระยะเวลาของลิขสิทธิ์และสิทธิ์ที่คล้ายคลึงกันที่ได้รับอนุญาต อย่างไรก็ตาม หากคุณไม่ปฏิบัติตามใบอนุญาตสาธารณะนี้ สิทธิ์ของคุณภายใต้ใบอนุญาตสาธารณะนี้จะสิ้นสุดโดยอัตโนมัติ + +b. เมื่อสิทธิ์ของคุณในการใช้วัสดุที่ได้รับอนุญาตสิ้นสุดลงภายใต้มาตรา 6(a) สิทธิ์นั้นจะกลับคืนมา: + +1. โดยอัตโนมัติ ณ วันที่การละเมิดได้รับการแก้ไข โดยมีเงื่อนไขว่าการแก้ไขนั้นเกิดขึ้นภายใน 30 วันหลังจากที่คุณทราบถึงการละเมิด; หรือ +2. โดยการคืนสิทธิ์อย่างชัดเจนจากผู้อนุญาต + +เพื่อหลีกเลี่ยงความเข้าใจผิด มาตรา 6(b) นี้ไม่ได้ส่งผลกระทบต่อสิทธิ์ใด ๆ ที่ผู้อนุญาตอาจมีในการเรียกร้องการเยียวยาสำหรับการละเมิดใบอนุญาตสาธารณะนี้ของคุณ + +c. เพื่อหลีกเลี่ยงความเข้าใจผิด ผู้อนุญาตอาจเสนอวัสดุที่ได้รับอนุญาตภายใต้เงื่อนไขหรือข้อกำหนดแยกต่างหาก หรือหยุดแจกจ่ายวัสดุที่ได้รับอนุญาตได้ทุกเมื่อ อย่างไรก็ตาม การกระทำดังกล่าวจะไม่ทำให้ใบอนุญาตสาธารณะนี้สิ้นสุดลง + +d. มาตรา 1, 5, 6, 7 และ 8 ยังคงมีผลบังคับใช้หลังจากการสิ้นสุดใบอนุญาตสาธารณะนี้ + + +มาตรา 7 -- ข้อกำหนดและเงื่อนไขอื่น ๆ + +a. ผู้อนุญาตจะไม่ถูกผูกมัดโดยข้อกำหนดหรือเงื่อนไขเพิ่มเติมหรือแตกต่างที่คุณสื่อสาร เว้นแต่จะได้รับการตกลงอย่างชัดเจน + +b. การจัดการ ความเข้าใจ หรือข้อตกลงใด ๆ เกี่ยวกับวัสดุที่ได้รับอนุญาตที่ไม่ได้ระบุไว้ในที่นี้ถือเป็นเรื่องแยกต่างหากและเป็นอิสระจากข้อกำหนดและเงื่อนไขของใบอนุญาตสาธารณะนี้ + + +มาตรา 8 -- การตีความ + +a. เพื่อหลีกเลี่ยงความเข้าใจผิด ใบอนุญาตสาธารณะนี้ไม่ได้ลด จำกัด จำกัด หรือกำหนดเงื่อนไขใด ๆ ในการใช้วัสดุที่ได้รับอนุญาตที่สามารถทำได้โดยชอบด้วยกฎหมายโดยไม่ต้องได้รับอนุญาตภายใต้ใบอนุญาตสาธารณะนี้ + +b. ในขอบเขตที่เป็นไปได้ หากข้อกำหนดใด ๆ ของใบอนุญาตสาธารณะนี้ถูกพิจารณาว่าไม่สามารถบังคับใช้ได้ ข้อกำหนดนั้นจะถูกปรับเปลี่ยนโดยอัตโนมัติในขอบเขตขั้นต่ำที่จำเป็นเพื่อให้สามารถบังคับใช้ได้ หากข้อกำหนดนั้นไม่สามารถปรับเปลี่ยนได้ ข้อกำหนดนั้นจะถูกแยกออกจากใบอนุญาตสาธารณะนี้โดยไม่ส่งผลกระทบต่อการบังคับใช้ข้อกำหนดและเงื่อนไขที่เหลืออยู่ + +c. ไม่มีข้อกำหนดหรือเงื่อนไขใด ๆ ของใบอนุญาตสาธารณะนี้ที่จะถูกสละสิทธิ์ และไม่มีการยินยอมให้ไม่ปฏิบัติตาม เว้นแต่จะได้รับการตกลงอย่างชัดเจนจากผู้อนุญาต + +d. ไม่มีสิ่งใดในใบอนุญาตสาธารณะนี้ที่ถือเป็นหรืออาจตีความว่าเป็นการจำกัดหรือการสละสิทธิ์สิทธิพิเศษและภูมิคุ้มกันใด ๆ ที่ใช้กับผู้อนุญาตหรือคุณ รวมถึงจากกระบวนการทางกฎหมายของเขตอำนาจศาลหรือหน่วยงานใด ๆ + + +======================================================================= + +Creative Commons ไม่ใช่คู่สัญญาในใบอนุญาตสาธารณะของตน อย่างไรก็ตาม Creative Commons อาจเลือกใช้ใบอนุญาตสาธารณะของตนกับวัสดุที่เผยแพร่ และในกรณีดังกล่าวจะถือว่าเป็น “ผู้อนุญาต” ข้อความของใบอนุญาตสาธารณะของ Creative Commons ได้รับการอุทิศให้กับสาธารณสมบัติภายใต้การอุทิศ CC0 Public Domain ยกเว้นเพื่อวัตถุประสงค์ที่จำกัดในการระบุว่าวัสดุถูกแบ่งปันภายใต้ใบอนุญาตสาธารณะของ Creative Commons หรือได้รับอนุญาตตามนโยบายของ Creative Commons ที่เผยแพร่ที่ creativecommons.org/policies Creative Commons ไม่อนุญาตให้ใช้เครื่องหมายการค้า "Creative Commons" หรือเครื่องหมายการค้าอื่น ๆ หรือโลโก้ของ Creative Commons โดยไม่ได้รับความยินยอมเป็นลายลักษณ์อักษรล่วงหน้า รวมถึงแต่ไม่จำกัดเพียง การใช้ในกรณีที่มีการแก้ไขใบอนุญาตสาธารณะของตนโดยไม่ได้รับอนุญาต หรือการจัดการ ความเข้าใจ หรือข้อตกลงอื่น ๆ เกี่ยวกับการใช้วัสดุที่ได้รับอนุญาต เพื่อหลีกเลี่ยงความเข้าใจผิด วรรคนี้ไม่ได้เป็นส่วนหนึ่งของใบอนุญาตสาธารณะ + +คุณสามารถติดต่อ Creative Commons ได้ที่ creativecommons.org + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/sketchnotes/README.md b/translations/th/sketchnotes/README.md new file mode 100644 index 000000000..3e7da8563 --- /dev/null +++ b/translations/th/sketchnotes/README.md @@ -0,0 +1,21 @@ + +สามารถดาวน์โหลดสเก็ตโน้ตทั้งหมดของหลักสูตรได้ที่นี่ + +🖨 สำหรับการพิมพ์ในความละเอียดสูง สามารถดาวน์โหลดไฟล์ TIFF ได้ที่ [repo นี้](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff) + +🎨 สร้างโดย: [Tomomi Imura](https://github.com/girliemac) (Twitter: [@girlie_mac](https://twitter.com/girlie_mac)) + +[![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-sa/4.0/) + +--- + +**ข้อจำกัดความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file