🌐 Update translations via Co-op Translator

pull/860/head
leestott 3 months ago committed by GitHub
parent c180b80902
commit 507fbd0fad

@ -0,0 +1,159 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "69389392fa6346e0dfa30f664b7b6fec",
"translation_date": "2025-09-05T21:43:11+00:00",
"source_file": "1-Introduction/1-intro-to-ML/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "4c4698044bb8af52cfb6388a4ee0e53b",
"translation_date": "2025-09-05T21:43:45+00:00",
"source_file": "1-Introduction/1-intro-to-ML/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,164 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "6a05fec147e734c3e6bfa54505648e2b",
"translation_date": "2025-09-05T21:45:17+00:00",
"source_file": "1-Introduction/2-history-of-ML/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "eb6e4d5afd1b21a57d2b9e6d0aac3969",
"translation_date": "2025-09-05T21:46:00+00:00",
"source_file": "1-Introduction/2-history-of-ML/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,171 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9a6b702d1437c0467e3c5c28d763dac2",
"translation_date": "2025-09-05T21:39:15+00:00",
"source_file": "1-Introduction/3-fairness/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "dbda60e7b1fe5f18974e7858eff0004e",
"translation_date": "2025-09-05T21:40:15+00:00",
"source_file": "1-Introduction/3-fairness/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,132 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9d91f3af3758fdd4569fb410575995ef",
"translation_date": "2025-09-05T21:41:24+00:00",
"source_file": "1-Introduction/4-techniques-of-ML/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "70d65aeddc06170bc1aed5b27805f930",
"translation_date": "2025-09-05T21:42:07+00:00",
"source_file": "1-Introduction/4-techniques-of-ML/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,36 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "cf8ecc83f28e5b98051d2179eca08e08",
"translation_date": "2025-09-05T21:37:38+00:00",
"source_file": "1-Introduction/README.md",
"language_code": "no"
}
-->
# 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 <a href="https://unsplash.com/@bill_oxford?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Bill Oxford</a> pÄ <a href="https://unsplash.com/s/photos/globe?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
### 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.

@ -0,0 +1,238 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "fa81d226c71d5af7a2cade31c1c92b88",
"translation_date": "2025-09-05T21:13:58+00:00",
"source_file": "2-Regression/1-Tools/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "74a5cf83e4ebc302afbcbc4f418afd0a",
"translation_date": "2025-09-05T21:15:00+00:00",
"source_file": "2-Regression/1-Tools/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T21:15:14+00:00",
"source_file": "2-Regression/1-Tools/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,226 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "7c077988328ebfe33b24d07945f16eca",
"translation_date": "2025-09-05T21:16:31+00:00",
"source_file": "2-Regression/2-Data/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "4485a1ed4dd1b5647365e3d87456515d",
"translation_date": "2025-09-05T21:17:12+00:00",
"source_file": "2-Regression/2-Data/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T21:17:24+00:00",
"source_file": "2-Regression/2-Data/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,380 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "40e64f004f3cb50aa1d8661672d3cd92",
"translation_date": "2025-09-05T21:07:11+00:00",
"source_file": "2-Regression/3-Linear/README.md",
"language_code": "no"
}
-->
# 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:
<img alt="Gjennomsnittspris per mÄned" src="../2-Data/images/barchart.png" width="50%"/>
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:
<img alt="Spredningsdiagram av pris vs. dag i Äret" src="images/scatter-dayofyear.png" width="50%" />
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)
```
<img alt="Spredningsdiagram av pris vs. dag i Äret" src="images/scatter-dayofyear-color.png" width="50%" />
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')
```
<img alt="Stolpediagram av pris vs. sort" src="images/price-by-variety.png" width="50%" />
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')
```
<img alt="Spredningsdiagram av pris vs. dag i Äret" src="images/pie-pumpkins-scatter.png" width="50%" />
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)
```
<img alt="LineĂŠr regresjon" src="images/linear-results.png" width="50%" />
## 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`<sup>2</sup>, men gitt to inputvariabler X og Y, vil dette legge til X<sup>2</sup>, XY og Y<sup>2</sup>. 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:
<img alt="Polynomisk regresjon" src="images/poly-results.png" width="50%" />
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:
<img alt="Gjennomsnittspris etter sort" src="images/price-by-variety.png" width="50%" />
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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "cc471fa89c293bc735dd3a9a0fb79b1b",
"translation_date": "2025-09-05T21:08:34+00:00",
"source_file": "2-Regression/3-Linear/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T21:08:45+00:00",
"source_file": "2-Regression/3-Linear/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,408 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "abf86d845c84330bce205a46b382ec88",
"translation_date": "2025-09-05T21:11:16+00:00",
"source_file": "2-Regression/4-Logistic/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "8af40209a41494068c1f42b14c0b450d",
"translation_date": "2025-09-05T21:12:13+00:00",
"source_file": "2-Regression/4-Logistic/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T21:12:24+00:00",
"source_file": "2-Regression/4-Logistic/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,54 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "508582278dbb8edd2a8a80ac96ef416c",
"translation_date": "2025-09-05T21:05:04+00:00",
"source_file": "2-Regression/README.md",
"language_code": "no"
}
-->
# 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 <a href="https://unsplash.com/@teutschmann?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Beth Teutschmann</a> pÄ <a href="https://unsplash.com/s/photos/jack-o-lanterns?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## 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.

@ -0,0 +1,359 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "e0b75f73e4a90d45181dc5581fe2ef5c",
"translation_date": "2025-09-05T21:47:31+00:00",
"source_file": "3-Web-App/1-Web-App/README.md",
"language_code": "no"
}
-->
# 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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>🛾 UFO Appearance Prediction! đŸ‘œ</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
</head>
<body>
<div class="grid">
<div class="box">
<p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p>
<form action="{{ url_for('predict')}}" method="post">
<input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" />
<input type="text" name="latitude" placeholder="Latitude" required="required" />
<input type="text" name="longitude" placeholder="Longitude" required="required" />
<button type="submit" class="btn">Predict country where the UFO is seen</button>
</form>
<p>{{ prediction_text }}</p>
</div>
</div>
</body>
</html>
```
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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a8e8ae10be335cbc745b75ee552317ff",
"translation_date": "2025-09-05T21:48:15+00:00",
"source_file": "3-Web-App/1-Web-App/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,35 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9836ff53cfef716ddfd70e06c5f43436",
"translation_date": "2025-09-05T21:46:21+00:00",
"source_file": "3-Web-App/README.md",
"language_code": "no"
}
-->
# 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 <a href="https://unsplash.com/@mdherren?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Michael Herren</a> pÄ <a href="https://unsplash.com/s/photos/ufo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## 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.

@ -0,0 +1,313 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "aaf391d922bd6de5efba871d514c6d47",
"translation_date": "2025-09-05T21:55:45+00:00",
"source_file": "4-Classification/1-Introduction/README.md",
"language_code": "no"
}
-->
# 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
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2448 entries, 0 to 2447
Columns: 385 entries, Unnamed: 0 to zucchini
dtypes: int64(384), object(1)
memory usage: 7.2+ MB
```
## Ø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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b2a01912beb24cfb0007f83594dba801",
"translation_date": "2025-09-05T21:56:25+00:00",
"source_file": "4-Classification/1-Introduction/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T21:56:38+00:00",
"source_file": "4-Classification/1-Introduction/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,253 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1a6e9e46b34a2e559fbbfc1f95397c7b",
"translation_date": "2025-09-05T21:50:40+00:00",
"source_file": "4-Classification/2-Classifiers-1/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "de6025f96841498b0577e9d1aee18d1f",
"translation_date": "2025-09-05T21:51:31+00:00",
"source_file": "4-Classification/2-Classifiers-1/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T21:51:43+00:00",
"source_file": "4-Classification/2-Classifiers-1/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,249 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "49047911108adc49d605cddfb455749c",
"translation_date": "2025-09-05T21:54:02+00:00",
"source_file": "4-Classification/3-Classifiers-2/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "58dfdaf79fb73f7d34b22bdbacf57329",
"translation_date": "2025-09-05T21:54:33+00:00",
"source_file": "4-Classification/3-Classifiers-2/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T21:54:45+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,329 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "61bdec27ed2da8b098cd9065405d9bb0",
"translation_date": "2025-09-05T21:52:38+00:00",
"source_file": "4-Classification/4-Applied/README.md",
"language_code": "no"
}
-->
# 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
<!DOCTYPE html>
<html>
<header>
<title>Cuisine Matcher</title>
</header>
<body>
...
</body>
</html>
```
1. NĂ„, arbeid innenfor `body`-taggene, og legg til litt markup for Ă„ vise en liste med avkrysningsbokser som reflekterer noen ingredienser:
```html
<h1>Check your refrigerator. What can you create?</h1>
<div id="wrapper">
<div class="boxCont">
<input type="checkbox" value="4" class="checkbox">
<label>apple</label>
</div>
<div class="boxCont">
<input type="checkbox" value="247" class="checkbox">
<label>pear</label>
</div>
<div class="boxCont">
<input type="checkbox" value="77" class="checkbox">
<label>cherry</label>
</div>
<div class="boxCont">
<input type="checkbox" value="126" class="checkbox">
<label>fenugreek</label>
</div>
<div class="boxCont">
<input type="checkbox" value="302" class="checkbox">
<label>sake</label>
</div>
<div class="boxCont">
<input type="checkbox" value="327" class="checkbox">
<label>soy sauce</label>
</div>
<div class="boxCont">
<input type="checkbox" value="112" class="checkbox">
<label>cumin</label>
</div>
</div>
<div style="padding-top:10px">
<button onClick="startInference()">What kind of cuisine can you make?</button>
</div>
```
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 `</div>`.
1. FĂžrst, importer [Onnx Runtime](https://www.onnxruntime.ai/):
```html
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.9.0/dist/ort.min.js"></script>
```
> Onnx Runtime 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
<script>
const ingredients = Array(380).fill(0);
const checks = [...document.querySelectorAll('.checkbox')];
checks.forEach(check => {
check.addEventListener('change', function() {
// toggle the state of the ingredient
// based on the checkbox's value (1 or 0)
ingredients[check.value] = check.checked ? 1 : 0;
});
});
function testCheckboxes() {
// validate if at least one checkbox is checked
return checks.some(check => check.checked);
}
async function startInference() {
let atLeastOneChecked = testCheckboxes()
if (!atLeastOneChecked) {
alert('Please select at least one ingredient.');
return;
}
try {
// create a new session and load the model.
const session = await ort.InferenceSession.create('./model.onnx');
const input = new ort.Tensor(new Float32Array(ingredients), [1, 380]);
const feeds = { float_input: input };
// feed inputs and run
const results = await session.run(feeds);
// read from results
alert('You can enjoy ' + results.label.data[0] + ' cuisine today!')
} catch (e) {
console.log(`failed to inference ONNX model`);
console.error(e);
}
}
</script>
```
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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "799ed651e2af0a7cad17c6268db11578",
"translation_date": "2025-09-05T21:53:13+00:00",
"source_file": "4-Classification/4-Applied/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,41 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "74e809ffd1e613a1058bbc3e9600859e",
"translation_date": "2025-09-05T21:49:12+00:00",
"source_file": "4-Classification/README.md",
"language_code": "no"
}
-->
# 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 <a href="https://unsplash.com/@changlisheng?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Lisheng Chang</a> pÄ <a href="https://unsplash.com/s/photos/asian-food?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## 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.

@ -0,0 +1,347 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "730225ea274c9174fe688b21d421539d",
"translation_date": "2025-09-05T21:27:24+00:00",
"source_file": "5-Clustering/1-Visualize/README.md",
"language_code": "no"
}
-->
# 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
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 530 entries, 0 to 529
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 530 non-null object
1 album 530 non-null object
2 artist 530 non-null object
3 artist_top_genre 530 non-null object
4 release_date 530 non-null int64
5 length 530 non-null int64
6 popularity 530 non-null int64
7 danceability 530 non-null float64
8 acousticness 530 non-null float64
9 energy 530 non-null float64
10 instrumentalness 530 non-null float64
11 liveness 530 non-null float64
12 loudness 530 non-null float64
13 speechiness 530 non-null float64
14 tempo 530 non-null float64
15 time_signature 530 non-null int64
dtypes: float64(8), int64(4), object(4)
memory usage: 66.4+ KB
```
1. 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "589fa015a5e7d9e67bd629f7d47b53de",
"translation_date": "2025-09-05T21:28:34+00:00",
"source_file": "5-Clustering/1-Visualize/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T21:28:47+00:00",
"source_file": "5-Clustering/1-Visualize/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,261 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "7cdd17338d9bbd7e2171c2cd462eb081",
"translation_date": "2025-09-05T21:29:46+00:00",
"source_file": "5-Clustering/2-K-Means/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b8e17eff34ad1680eba2a5d3cf9ffc41",
"translation_date": "2025-09-05T21:30:25+00:00",
"source_file": "5-Clustering/2-K-Means/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T21:30:37+00:00",
"source_file": "5-Clustering/2-K-Means/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,42 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b28a3a4911584062772c537b653ebbc7",
"translation_date": "2025-09-05T21:25:20+00:00",
"source_file": "5-Clustering/README.md",
"language_code": "no"
}
-->
# 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 <a href="https://unsplash.com/@marcelalaskoski?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Marcela Laskoski</a> pÄ <a href="https://unsplash.com/s/photos/nigerian-music?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
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.

@ -0,0 +1,179 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1c2ec40cf55c98a028a359c27ef7e45a",
"translation_date": "2025-09-05T22:22:25+00:00",
"source_file": "6-NLP/1-Introduction-to-NLP/README.md",
"language_code": "no"
}
-->
# 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** <u>trist</u>", kunne den omorganisere og erstatte ord i setningen for Ä danne svaret "Hvor lenge har **du vÊrt** <u>trist</u>".
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 <u>sykkel</u>", kunne den svare med "Hvor lenge har **jeg vÊrt** en <u>sykkel</u>?", 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 = <https://plato.stanford.edu/archives/spr2020/entries/computational-linguistics/>.
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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1d7583e8046dacbb0c056d5ba0a71b16",
"translation_date": "2025-09-05T22:23:09+00:00",
"source_file": "6-NLP/1-Introduction-to-NLP/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,228 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "5f3cb462e3122e1afe7ab0050ccf2bd3",
"translation_date": "2025-09-05T22:13:58+00:00",
"source_file": "6-NLP/2-Tasks/README.md",
"language_code": "no"
}
-->
# 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. <u>**the quick red**</u> fox jumped over the lazy brown dog
2. the **<u>quick red fox</u>** jumped over the lazy brown dog
3. the quick **<u>red fox jumped</u>** over the lazy brown dog
4. the quick red **<u>fox jumped over</u>** the lazy brown dog
5. the quick red fox **<u>jumped over the</u>** lazy brown dog
6. the quick red fox jumped **<u>over the lazy</u>** brown dog
7. the quick red fox jumped over <u>**the lazy brown**</u> dog
8. the quick red fox jumped over the **<u>lazy brown dog</u>**
![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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "2efc4c2aba5ed06c780c05539c492ae3",
"translation_date": "2025-09-05T22:15:09+00:00",
"source_file": "6-NLP/2-Tasks/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,200 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "be03c8182982b87ced155e4e9d1438e8",
"translation_date": "2025-09-05T22:24:54+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9d2a734deb904caff310d1a999c6bd7a",
"translation_date": "2025-09-05T22:25:55+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T22:26:29+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T22:26:16+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/solution/R/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,417 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "8d32dadeda93c6fb5c43619854882ab1",
"translation_date": "2025-09-05T22:18:22+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/README.md",
"language_code": "no"
}
-->
# 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 <br />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.

@ -0,0 +1,19 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "bf39bceb833cd628f224941dca8041df",
"translation_date": "2025-09-05T22:20:12+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T22:20:34+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T22:20:25+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/R/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,389 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "2c742993fe95d5bcbb2846eda3d442a1",
"translation_date": "2025-09-05T22:28:31+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "daf144daa552da6a7d442aff6f3e77d8",
"translation_date": "2025-09-05T22:29:33+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T22:30:03+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T22:29:48+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/R/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,38 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1eb379dc2d0c9940b320732d16083778",
"translation_date": "2025-09-05T22:12:17+00:00",
"source_file": "6-NLP/README.md",
"language_code": "no"
}
-->
# 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 <a href="https://unsplash.com/@elaineh?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Elaine Howlin</a> pÄ <a href="https://unsplash.com/s/photos/pride-and-prejudice?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "ee0670655c89e4719319764afb113624",
"translation_date": "2025-09-05T22:20:47+00:00",
"source_file": "6-NLP/data/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,199 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "662b509c39eee205687726636d0a8455",
"translation_date": "2025-09-05T21:21:53+00:00",
"source_file": "7-TimeSeries/1-Introduction/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "d1781b0b92568ea1d119d0a198b576b4",
"translation_date": "2025-09-05T21:22:37+00:00",
"source_file": "7-TimeSeries/1-Introduction/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T21:23:00+00:00",
"source_file": "7-TimeSeries/1-Introduction/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T21:22:51+00:00",
"source_file": "7-TimeSeries/1-Introduction/solution/R/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,407 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "917dbf890db71a322f306050cb284749",
"translation_date": "2025-09-05T21:19:25+00:00",
"source_file": "7-TimeSeries/2-ARIMA/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1c814013e10866dfd92cdb32caaae3ac",
"translation_date": "2025-09-05T21:20:16+00:00",
"source_file": "7-TimeSeries/2-ARIMA/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T21:20:39+00:00",
"source_file": "7-TimeSeries/2-ARIMA/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T21:20:29+00:00",
"source_file": "7-TimeSeries/2-ARIMA/solution/R/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,393 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "482bccabe1df958496ea71a3667995cd",
"translation_date": "2025-09-05T21:24:09+00:00",
"source_file": "7-TimeSeries/3-SVR/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "94aa2fc6154252ae30a3f3740299707a",
"translation_date": "2025-09-05T21:24:51+00:00",
"source_file": "7-TimeSeries/3-SVR/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,37 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "61342603bad8acadbc6b2e4e3aab3f66",
"translation_date": "2025-09-05T21:17:47+00:00",
"source_file": "7-TimeSeries/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,256 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "911efd5e595089000cb3c16fce1beab8",
"translation_date": "2025-09-05T22:05:43+00:00",
"source_file": "8-Reinforcement/1-QLearning/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,41 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "68394b2102d3503882e5e914bd0ff5c1",
"translation_date": "2025-09-05T22:07:28+00:00",
"source_file": "8-Reinforcement/1-QLearning/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T22:07:59+00:00",
"source_file": "8-Reinforcement/1-QLearning/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T22:07:50+00:00",
"source_file": "8-Reinforcement/1-QLearning/solution/R/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,333 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "107d5bb29da8a562e7ae72262d251a75",
"translation_date": "2025-09-05T22:09:29+00:00",
"source_file": "8-Reinforcement/2-Gym/README.md",
"language_code": "no"
}
-->
## 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()<epsilon:
# exploitation - chose the action according to Q-Table probabilities
v = probs(np.array(qvalues(s)))
a = random.choices(actions,weights=v)[0]
else:
# exploration - randomly chose the action
a = np.random.randint(env.action_space.n)
obs, rew, done, info = env.step(a)
cum_reward+=rew
ns = discretize(obs)
Q[(s,a)] = (1 - alpha) * Q.get((s,a),0) + alpha * (rew + gamma * max(qvalues(ns)))
cum_rewards.append(cum_reward)
rewards.append(cum_reward)
# == Periodically print results and calculate average reward ==
if epoch%5000==0:
print(f"{epoch}: {np.average(cum_rewards)}, alpha={alpha}, epsilon={epsilon}")
if np.average(cum_rewards) > Qmax:
Qmax = np.average(cum_rewards)
Qbest = Q
cum_rewards=[]
```
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.

@ -0,0 +1,55 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1f2b7441745eb52e25745423b247016b",
"translation_date": "2025-09-05T22:11:06+00:00",
"source_file": "8-Reinforcement/2-Gym/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T22:11:33+00:00",
"source_file": "8-Reinforcement/2-Gym/solution/Julia/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T22:11:24+00:00",
"source_file": "8-Reinforcement/2-Gym/solution/R/README.md",
"language_code": "no"
}
-->
---
**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.

@ -0,0 +1,67 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "20ca019012b1725de956681d036d8b18",
"translation_date": "2025-09-05T22:01:42+00:00",
"source_file": "8-Reinforcement/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,159 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "83320d6b6994909e35d830cebf214039",
"translation_date": "2025-09-05T21:33:30+00:00",
"source_file": "9-Real-World/1-Applications/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "fdebfcd0a3f12c9e2b436ded1aa79885",
"translation_date": "2025-09-05T21:34:24+00:00",
"source_file": "9-Real-World/1-Applications/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,183 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "df2b538e8fbb3e91cf0419ae2f858675",
"translation_date": "2025-09-05T21:36:12+00:00",
"source_file": "9-Real-World/2-Debugging-ML-Models/README.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "91c6a180ef08e20cc15acfd2d6d6e164",
"translation_date": "2025-09-05T21:37:15+00:00",
"source_file": "9-Real-World/2-Debugging-ML-Models/assignment.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,32 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "5e069a0ac02a9606a69946c2b3c574a9",
"translation_date": "2025-09-05T21:31:41+00:00",
"source_file": "9-Real-World/README.md",
"language_code": "no"
}
-->
# 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 <a href="https://unsplash.com/@childeye?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Alexis Fauvet</a> pÄ <a href="https://unsplash.com/s/photos/artificial-intelligence?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## 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.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "c06b12caf3c901eb3156e3dd5b0aea56",
"translation_date": "2025-09-05T21:04:33+00:00",
"source_file": "CODE_OF_CONDUCT.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,30 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "977ec5266dfd78ad1ce2bd8d46fccbda",
"translation_date": "2025-09-05T21:03:17+00:00",
"source_file": "CONTRIBUTING.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,177 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "612aef7a03204260e940131b09691977",
"translation_date": "2025-09-05T21:01:50+00:00",
"source_file": "README.md",
"language_code": "no"
}
-->
[![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 |
<ul><li>[Python](2-Regression/1-Tools/README.md)</li><li>[R](../../2-Regression/1-Tools/solution/R/lesson_1.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 06 | Nordamerikanske gresskarpriser 🎃 | [Regresjon](2-Regression/README.md) | Visualiser og rengjþr data som forberedelse til ML | <ul><li>[Python](2-Regression/2-Data/README.md)</li><li>[R](../../2-Regression/2-Data/solution/R/lesson_2.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 07 | Nordamerikanske gresskarpriser 🎃 | [Regresjon](2-Regression/README.md) | Bygg lineére og polynomiske regresjonsmodeller | <ul><li>[Python](2-Regression/3-Linear/README.md)</li><li>[R](../../2-Regression/3-Linear/solution/R/lesson_3.html)</li></ul> | <ul><li>Jen og Dmitry</li><li>Eric Wanjau</li></ul> |
| 08 | Nordamerikanske gresskarpriser 🎃 | [Regresjon](2-Regression/README.md) | Bygg en logistisk regresjonsmodell | <ul><li>[Python](2-Regression/4-Logistic/README.md) </li><li>[R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)</li></ul> | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 09 | 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 | <ul><li> [Python](4-Classification/1-Introduction/README.md) </li><li>[R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) | <ul><li>Jen og Cassie</li><li>Eric Wanjau</li></ul> |
| 11 | Deilige asiatiske og indiske retter 🍜 | [Klassifisering](4-Classification/README.md) | Introduksjon til klassifikatorer | <ul><li> [Python](4-Classification/2-Classifiers-1/README.md)</li><li>[R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) | <ul><li>Jen og Cassie</li><li>Eric Wanjau</li></ul> |
| 12 | Deilige asiatiske og indiske retter 🍜 | [Klassifisering](4-Classification/README.md) | Flere klassifikatorer | <ul><li> [Python](4-Classification/3-Classifiers-2/README.md)</li><li>[R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) | <ul><li>Jen og Cassie</li><li>Eric Wanjau</li></ul> |
| 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 | <ul><li> [Python](5-Clustering/1-Visualize/README.md)</li><li>[R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 15 | Utforsking av nigerianske musikksmaker 🎧 | [Klynging](5-Clustering/README.md) | Utforsk K-Means klyngemetoden | <ul><li> [Python](5-Clustering/2-K-Means/README.md)</li><li>[R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) | <ul><li>Jen</li><li>Eric Wanjau</li></ul> |
| 16 | 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.

@ -0,0 +1,51 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "5e1b8da31aae9cca3d53ad243fa3365a",
"translation_date": "2025-09-05T21:03:45+00:00",
"source_file": "SECURITY.md",
"language_code": "no"
}
-->
## 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.

@ -0,0 +1,26 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "872be8bc1b93ef1dd9ac3d6e8f99f6ab",
"translation_date": "2025-09-05T21:02:59+00:00",
"source_file": "SUPPORT.md",
"language_code": "no"
}
-->
# 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.

@ -0,0 +1,57 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "68dd06c685f6ce840e0acfa313352e7c",
"translation_date": "2025-09-05T21:31:12+00:00",
"source_file": "docs/_sidebar.md",
"language_code": "no"
}
-->
- 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.

@ -0,0 +1,37 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b37de02054fa6c0438ede6fabe1fdfb8",
"translation_date": "2025-09-05T21:04:15+00:00",
"source_file": "for-teachers.md",
"language_code": "no"
}
-->
## 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.

@ -0,0 +1,126 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "6d130dffca5db70d7e615f926cb1ad4c",
"translation_date": "2025-09-05T21:48:45+00:00",
"source_file": "quiz-app/README.md",
"language_code": "no"
}
-->
# 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-<name>.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.

@ -0,0 +1,368 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "fba3b94d88bfb9b81369b869a1e9a20f",
"translation_date": "2025-09-05T22:00:15+00:00",
"source_file": "sketchnotes/LICENSE.md",
"language_code": "no"
}
-->
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.

@ -0,0 +1,21 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a88d5918c1b9da69a40d917a0840c497",
"translation_date": "2025-09-05T21:56:51+00:00",
"source_file": "sketchnotes/README.md",
"language_code": "no"
}
-->
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.

@ -0,0 +1,159 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "69389392fa6346e0dfa30f664b7b6fec",
"translation_date": "2025-09-05T21:42:42+00:00",
"source_file": "1-Introduction/1-intro-to-ML/README.md",
"language_code": "sv"
}
-->
# 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.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "4c4698044bb8af52cfb6388a4ee0e53b",
"translation_date": "2025-09-05T21:43:40+00:00",
"source_file": "1-Introduction/1-intro-to-ML/assignment.md",
"language_code": "sv"
}
-->
# 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.

@ -0,0 +1,164 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "6a05fec147e734c3e6bfa54505648e2b",
"translation_date": "2025-09-05T21:44:44+00:00",
"source_file": "1-Introduction/2-history-of-ML/README.md",
"language_code": "sv"
}
-->
# 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.

Some files were not shown because too many files have changed in this diff Show More

Loading

Cancel
Save