Oppgave 6: Din egen prediksjon (frivillig oppgave) som kjører på tusenvis av individer

Filnavn: DELTAKERNAVN.py

Denne oppgaven er helt frivillig, og skal ikke leveres i Devilry. For å få til å kjøre koden på så mange individer på en enkel måte, er vi nødt til å ta i bruk noen av konseptene som blir gjennomgått i løpet av de neste ukene. Dette blir derfor en smakebit på noe av det som kommer, og man trenger ikke å være bekymret om man ikke får til dette eller ikke skjønner hva som skjer her.

Endre prosedyren til å være en funksjon som tar parametere

Til nå har vi skrevet prosedyrer som henter input fra brukeren ved hjelp av input. Dette krever interaksjon med den som kjører programmet (via kommandolinjen), noe som er tungvindt hvis man skal skrive større programmer eller programmer der input-en kommer fra andre kilder enn fra kommandolinjen (f. eks hvis input er et resultat fra andre prosedyrer eller blir generert av andre deler av programmet).

Denne uken har vi sett at funksjoner løser dette problemet. En funksjon er enkelt forklart en prosedyre som kan ta input via parametere, og returnere en verdi (vi fikk en smakebit på returverdier i Fredagsfordypnings-oppgaven fra uke 3).

Følgende kode definerer en funksjon min_prediksjon som tar en rekke parametere, som blir tilgjengelig inne i funksjonen. I stedet for å måtte oppgi disse parameterene via kommandolinjen, kan vi kalle funksjonen med parameterene (se linjen etter funksjonen):

def min_prediksjon(alder, kjønn, sivilstatus, gjeld, betalingshistorikk, utdanningsnivå):

    # if alder < 28 and gjeld < 10000 ... osv
    
    return "vil ikke betale"
    
resultat = min_prediksjon(50, "mann", "singel", 100000, ["betalt", "ikke betalt", "betalt"], "høyskole")
print("Resultatet er:", resultat)

Viktig: Vi må gjøre en endring i koden fra oppgaven i uke 4, og bruke "ikke betalt" i stedet for "ikke_betalt" (slik at det stemmer med tekstfilen vi skal bruke senere i oppgaven)

Ta utgangspunkt i koden over og fyll inn funksjonen slik at den fungerer på samme måte som koden du skrev i oppgave 4 (men ikke bruk input). Merk at funksjonen nå tar inn en liste betalingshistorikk som vi forventer er laget på utsiden av funksjonen. Du trenger derfor ikke å opprette denne listen inne i funksjonen.

Kjør prediksjonen på 1000 personer

Senere i faget skal vi lære hvordan vi kan kjøre kode mange ganger ved hjelp av løkker. Det er for eksempel veldig praktisk å kunne gjøre hvis man skal predikere hvorvidt 1000 personer vil betale eller ikke, og ikke bare én person (slik vi har gjort til nå).

Nå kan du bruke koden under for å evaulere din egen prediksjon. Lag en fil DELTAKERNAVN.py der du bytter ut DELTAKERNAVN med et valgfritt navn du vil bruke i konkurransen (dette kan være brukernavnet ditt, eller noe helt annet om du ønsker å være anonym). Kopier følgende kode inn i filen DELTAKERNAVN.py.

Denne koden leser 1000 individer fra fil og kjører din funksjon for hvert individ og sjekker om det du predikerer er rett eller ikke. Du trenger ikke å sette deg inn i denne koden eller forstå hvordan den fungerer.


# Her er din funksjon med din egen prediksjon
def min_prediksjon(alder, kjønn, sivilstatus, gjeld, betalingshistorikk, utdanningsnivå):
    # ...

# Dette limer du inn under
def test_min_prediksjon():

    antall_predikert = 0
    antall_riktig_predikert = 0
    true_positive = 0
    true_negative = 0
    false_positive = 0
    false_negative = 0

    filnavn = "individer1000.txt"
    fil = open(filnavn)
    for linje in fil:
        data = linje.strip().split(",")
        alder = int(data[1])
        kjønn = data[2]
        sivilstatus = data[3]
        gjeld = int(data[4])
        betalingshistorikk = []
        for i in range(0, 3):
            betalingshistorikk.append(data[5+i])

        utdanningsnivå = data[8].replace("oe", "ø")
        fasit = data[9]

        prediksjon = min_prediksjon(alder, kjønn, sivilstatus, gjeld, betalingshistorikk, utdanningsnivå)

        if prediksjon == fasit:
            antall_riktig_predikert += 1

        if fasit == "vil betale":
            if prediksjon == fasit:
                true_positive += 1
            else:
                false_negative += 1
        else:
            if prediksjon == fasit:
                true_negative += 1
            else:
                false_positive += 1

        antall_predikert += 1

    precision = true_positive / (true_positive + false_positive)
    recall = true_positive / (true_positive + false_negative)
    f1_score = 2 * (precision*recall) / (precision + recall)

    print(antall_riktig_predikert, "av", antall_predikert, "ble riktig predikert")
    print("Recall:", recall)
    print("Precision:", precision)
    print("F1 score:", f1_score)

Du må i tillegg laste ned denne filen, og lagre den som individer1000.txt i samme mappe som du skriver programmet ditt.

Hvis du har gjort alt rett og kjører dette programmet, vil det til slutt printes hvor mange riktig predikeringer du har på 1000 individer. Når du leverer obligen vil programmet ditt bli kjørt på 30 000 individer. Vinner blir kåret basert på hvem som har høyest F1 score på 30 000 individer. Du "trener" altså programmet ditt på et mindre antall individer enn det programmet vil bli brukt på senere.

Ekstra informasjon

Du kan implementere din egen prediksjon akkurat slik du vil. Du kan ha nytte av denne informasjonen når du skal implementere dine egne regler. Disse tallene gjelder for datasettet du vil bli vurdert på til slutt: