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: