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:
- 22% betalte ikke gjelden sin. 24.2% av menn betalte ikke gjelden sin og 20.7 % av kvinner betalte ikke.
- Den h?yeste gjelden var p? 330 000 kr, og den laveste p? 3300 kroner. Gjennomsnittsgjelden er 55 600 kr.
- Blant single menn var det 26% som ikke betalte gjelden sin.
- Blant single menn under 25 ?r var det 65% som ikke betalte gjelden sin
- Blant de som ikke betalte de to forrige m?nedene, var det 50% som endte med ? ikke betalte gjelden sin.