<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Teknisk Tirsdag
Step1:  Efter at have hentet vores rensede data, hvor vi minder os selv om at vi har
Step2:  Hvad vi ser her, er en korrelationsmatrix. Jo mørkere farver, des højere korrelation, rød for positiv- og blå for negativ-korrelation. <br>
Vi ser altså at der er høj korrelation, i vores nedre højre hjørne; Dette er spilpositionerne. Vi ser også et stort blåt kryds, som er målmandsdata. Disse har meget negativ korrelation med resten af vores datasæt. (Dobbeltklik evt. på plottet, hvis det er meget svært at læse teksten)<br>
Derudover kan vi se, at ID kolonnen slet ikke korrelere. Man kan derfor vælge at tage den ud.
Vi tilføjer nu vores "kendte" labels til vores data. (Hvis man spiller for en af vores topklubber, får man et 1-tal, og ellers får man et 0) <br>
Vi deler også vores træningssæt op i en X matrix med alle vores numeriske features, og en y vektor med alle vores labels.
Step3:  Vi kan kigge lidt overordnet på tallene mellem de 2 klasser.
Step4:  Observationer
Alderen siger ikke rigtig noget om, hvorvidt du spiller for en topklub eller ej
Topklubsspillere er i gennemsnittet en faktor 10 mere værd end ikke-topklub spillere
Topklubsspillere er i gennemsnittet generelt ca. 10+ på alt i forhold til ikke-topklub spillere
Vi er nu klar til at gå i gang med vores første Machine Learning algoritme.
På forhånd ved vi, at der i vores træningssæt er {{y.where(y==1).count()}} som spiller i topklubber, og {{y.where(y==0).count()}} der ikke gør. <br>
Der er en 50/50 chance for at ramme rigtigt, hvis man bare gætte tilfældigt. Vi håber derfor, at algoritmen kan slå den 50% svarrate.
Logistisk regression
Step5:  Vi fitter nu en logistic regression classifier til vores data, og fitter en model, så den kan genkende om man spiller for en topklub eller ej, og evaluere resultatet
Step6:  Altså har vores model ret i 
{{'{
Step7:  Og vi er nu klar til at prøve igen!
Logistisk regression 2.0
Igen fitter vi en logistisk regression til vores træningsdata, og danner en model, men denne gang uden at bruge testdatasættet.
Step8:  Modellen matcher nu 
{{'{
Step9:  Det ser jo ret fornuftigt ud.<br>
For at sige noget om vores nye model, kan vi også lave en "confusion_matrix"
<img src='http
Step10:  Resultatet fortæller os, at vi har {{confusion_matrix[0,0]}}+{{confusion_matrix[1,1]}} = {{confusion_matrix[0,0]+confusion_matrix[1,1]}} korrekte forudsigelser og {{confusion_matrix[0,1]}}+{{confusion_matrix[1,0]}} = {{confusion_matrix[0,1]+confusion_matrix[1,0]}} ukorrekte
Man kan også bede classifieren om en rapport
Step11:  Logistisk regression med krydsvalidering
Vi er egentlig meget tilfredse med vores model, men ofte kan det være en god idé at teste på flere små testsæt, og holde dem op mod hinanden. <br>
Her laver vi en 10-folds krydsvalidering og får altså 10 scorer ud
Step12:  Her preformer modellen altså i gennemsnit 
{{'{
Step13:  Modellen har fundet {{np.bincount(dansker_pred)[0]}} nuller og {{np.bincount(dansker_pred)[1]}} ét-taller
Hvis du satte top_klub_ratio til 75 i Opgave 1 i Data Cleaning, skulle der være omkring 27-28 ét-taller. <br>
top_klub_ratio blev sat til
Step14:  Og sortere listen, så de bedste danske spillere står øvers, og tilføjer et index, så vi kan få et bedre overblik
Step15:  Efter flot hattrick mod Irland, kan man vidst ikke være i tvivl om Kong Christian tager pladsen på tronen
<img src='kongen.png',
    align="center"
    width="40%"
    alt="kongen">
Men hvilke danske spillere spiller egentlig for topklubber, og hvordan er de rangeret i forhold til vores model?
Step16:  Man kan undre sig over hvad Jacob Larsen laver hos stopklubben Borussia Dortmund, men en hurtig googling viser, at han simpelthen blev headhuntet til klubben som 16-årig.
Og så er der jo nok nogen, der vil spørger - Hvad med Bendtner?
Så han skal da også lige have en plads i vores analyse
Step17:  Opgave
Step18:  Ekstra lege/analyse opgaver
Danske Rezan Corlu som ellers ligger ret lavt selv på potentiale har alligevel sikret sig en plads hos A.S. Roma i en alder af 20 år.
Men hvordan var det egentlig med de topklub spillere? Hvor langt ned kan man gå i potentiale, og stadig spille for en topklub?
Step19:  Vi kan altså se, at der bliver satset på ungdommen, hvor deres kommende potentiale nok taler for deres plads i en storklub.<br>
Men hvad så med ikke-topklubsspillere og deres performance?
Step20:  Måske er de 22 klubber, vi har udvalgt ikke helt nok til at beskrive topklubber
<ASSISTANT_TASK:>
Python Code:
# Run the datacleaning notebook to get all the variables
%run 'Teknisk Tirsdag - Data Cleaning.ipynb'
Explanation: Teknisk Tirsdag: Supervised Learning
I denne opgave skal vi bruge Logistisk Regression til at forudsige hvilke danske fodboldspillere der egentlig kunne spille for en storklub.
End of explanation
corr = overall_set.corr()
fig = plt.figure(figsize=(20, 16))
ax = sb.heatmap(corr, xticklabels=corr.columns.values,
                yticklabels=corr.columns.values,
                linewidths=0.25, vmax=1.0, square=True,
                linecolor='black', annot=False
               )
plt.show()
Explanation: Efter at have hentet vores rensede data, hvor vi minder os selv om at vi har: <br>
* dansker_set
* topklub_set
* ikke_topklub_set
* overall_set 
Det første, vi gerne vil kigge lidt på, er, om vi var grundige nok i vores foranalyse. Derfor laver vi et heatmap, der skal fortælle os hvor stor sammenhængen er (korrelation) mellem kolonnerne i forhold til hinanden.
End of explanation
overall_set['label'] = overall_set['Club'].isin(topklub_set.Club).astype(int)
y = overall_set['label']
X = overall_set.iloc[:,0:-1].select_dtypes(include=['float64', 'int64'])
Explanation: Hvad vi ser her, er en korrelationsmatrix. Jo mørkere farver, des højere korrelation, rød for positiv- og blå for negativ-korrelation. <br>
Vi ser altså at der er høj korrelation, i vores nedre højre hjørne; Dette er spilpositionerne. Vi ser også et stort blåt kryds, som er målmandsdata. Disse har meget negativ korrelation med resten af vores datasæt. (Dobbeltklik evt. på plottet, hvis det er meget svært at læse teksten)<br>
Derudover kan vi se, at ID kolonnen slet ikke korrelere. Man kan derfor vælge at tage den ud.
Vi tilføjer nu vores "kendte" labels til vores data. (Hvis man spiller for en af vores topklubber, får man et 1-tal, og ellers får man et 0) <br>
Vi deler også vores træningssæt op i en X matrix med alle vores numeriske features, og en y vektor med alle vores labels.
End of explanation
overall_set.groupby('label').mean()
Explanation: Vi kan kigge lidt overordnet på tallene mellem de 2 klasser.
End of explanation
# hent nødvendige pakker fra Scikit Learn biblioteket (generelt super hvis man vil lave data science)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
Explanation: Observationer
Alderen siger ikke rigtig noget om, hvorvidt du spiller for en topklub eller ej
Topklubsspillere er i gennemsnittet en faktor 10 mere værd end ikke-topklub spillere
Topklubsspillere er i gennemsnittet generelt ca. 10+ på alt i forhold til ikke-topklub spillere
Vi er nu klar til at gå i gang med vores første Machine Learning algoritme.
På forhånd ved vi, at der i vores træningssæt er {{y.where(y==1).count()}} som spiller i topklubber, og {{y.where(y==0).count()}} der ikke gør. <br>
Der er en 50/50 chance for at ramme rigtigt, hvis man bare gætte tilfældigt. Vi håber derfor, at algoritmen kan slå den 50% svarrate.
Logistisk regression
End of explanation
model = LogisticRegression()
model = model.fit(X,y)
model.score(X,y)
Explanation: Vi fitter nu en logistic regression classifier til vores data, og fitter en model, så den kan genkende om man spiller for en topklub eller ej, og evaluere resultatet:
End of explanation
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
print('Træningsæt størrelse: {} - Testsæt størrelse: {}'.format(len(X_train), len(X_test)))
Explanation: Altså har vores model ret i 
{{'{:.0f}'.format(100*model.score(X, y))}}% af tiden i træningssættet. <br>
Pretty good!! Den har altså fundet nogle mønstre der kan mappe data til labels, og gætter ikke bare.
Men vi kan ikke vide, om den har overfittet, og derved har tilpasset sig for godt til sit kendte data, så nyt data vil blive fejlmappet. <br>
Hvad vi kan prøve, er at splitte vores træningssæt op i et trænings- og testsæt. På den måde kan vi først fitte og derefter evaluere på "nyt" kendt data, om den stadig performer som forventet.
End of explanation
model2 = LogisticRegression()
model2 = model2.fit(X_train, y_train)
model2.score(X_train, y_train)
Explanation: Og vi er nu klar til at prøve igen!
Logistisk regression 2.0
Igen fitter vi en logistisk regression til vores træningsdata, og danner en model, men denne gang uden at bruge testdatasættet.
End of explanation
y_pred = model2.predict(X_test)
y_probs = model2.predict_proba(X_test)
# Evalueringsmålinger
from sklearn import metrics
print('Nøjagtigheden af vores logistiske regressions models prediction på testsættet er {:.0f}'.format(100*metrics.accuracy_score(y_test, y_pred))+'%', '\n')
print('Arealet under vores ROC AUC kurve er {:.0f}'.format(100*metrics.roc_auc_score(y_test, y_probs[:, 1]))+'%')
Explanation: Modellen matcher nu 
{{'{:.0f}'.format(100*model2.score(X, y))}}% af tiden i træningssættet. <br> 
Men har den overfittet?
Evaluering af modellen
Vi genererer derfor vores y forudsigelse og også sandsynlighederne for vores testsæt, da disse bruges til at evaluere modellen.
End of explanation
confusion_matrix = metrics.confusion_matrix(y_test, y_pred)
print(confusion_matrix)
Explanation: Det ser jo ret fornuftigt ud.<br>
For at sige noget om vores nye model, kan vi også lave en "confusion_matrix"
<img src='http://revolution-computing.typepad.com/.a/6a010534b1db25970b01bb08c97955970d-pi',
    align="center"
    width="40%"
    alt="confusion matrix">
T og F står for henholdsvist True og False<br>
P og N står for henholdsvist Positive og Negative
End of explanation
print(metrics.classification_report(y_test, y_pred))
Explanation: Resultatet fortæller os, at vi har {{confusion_matrix[0,0]}}+{{confusion_matrix[1,1]}} = {{confusion_matrix[0,0]+confusion_matrix[1,1]}} korrekte forudsigelser og {{confusion_matrix[0,1]}}+{{confusion_matrix[1,0]}} = {{confusion_matrix[0,1]+confusion_matrix[1,0]}} ukorrekte
Man kan også bede classifieren om en rapport:
End of explanation
# 10-folds cross-validation
from sklearn.model_selection import cross_val_score
scores = cross_val_score(LogisticRegression(), X, y, scoring='accuracy', cv=10)
print(scores,'\n')
print(scores.mean())
Explanation: Logistisk regression med krydsvalidering
Vi er egentlig meget tilfredse med vores model, men ofte kan det være en god idé at teste på flere små testsæt, og holde dem op mod hinanden. <br>
Her laver vi en 10-folds krydsvalidering og får altså 10 scorer ud:
End of explanation
dansker_pred = None ### Fjern NONE og UDFYLD MIG ###
dansker_probs = None ### Fjern NONE og UDFYLD MIG ###
Explanation: Her preformer modellen altså i gennemsnit 
{{'{:.0f}'.format(100*scores.mean())}}%. 
Det lyder meget lovende, men vi holder os til vores model2 og kan nu prøve modellen af på det rigtige datasæt
Danskersættet
Vi skal nu prøve vores model på vores danske spillere<br>
Opgave:
Vi skal lave prediction og probability på vores danske spillere, ligesom vi gjorde tidligere for testsættet. (Lige under Evaluering af modellen)<br>
Husk din dataframe kun må indeholder numeriske værdier, når vi bruger modellen.<br>
Fx. "df.select_dtypes(include=['float64', 'int64'])"
End of explanation
dansker_set_df = dansker_set.copy()
dansker_set_df[['prob1','prob2']] = pd.DataFrame(dansker_probs, index=dansker_set.index)
dansker_set_df['Probabilities [0,1]'] = dansker_set_df[['prob1','prob2']].values.tolist()
dansker_set_df['Prediction'] = pd.Series(dansker_pred, index=dansker_set.index)
del dansker_set_df['prob1'], dansker_set_df['prob2'] 
# dansker_set_df.head()
Explanation: Modellen har fundet {{np.bincount(dansker_pred)[0]}} nuller og {{np.bincount(dansker_pred)[1]}} ét-taller
Hvis du satte top_klub_ratio til 75 i Opgave 1 i Data Cleaning, skulle der være omkring 27-28 ét-taller. <br>
top_klub_ratio blev sat til: {{top_klub_ratio}}
Vi tilføjer disse kolonner til vores dataframe.
End of explanation
dansker_set_df.loc[:,'pred=1'] = dansker_set_df['Probabilities [0,1]'].map(lambda x: x[1]).sort_values(ascending=False)
dansker_sorted = dansker_set_df.sort_values('pred=1', ascending=False)
dansker_sorted = dansker_sorted[['Name', 'Club', 'Overall', 'Potential', 'Probabilities [0,1]', 'Prediction']]
dansker_sorted.loc[:,'in'] = np.arange(1, len(dansker_set_df)+1)
dansker_sorted.set_index('in')
Explanation: Og sortere listen, så de bedste danske spillere står øvers, og tilføjer et index, så vi kan få et bedre overblik
End of explanation
dansker_sorted[dansker_sorted['Club'].isin(top_clubs)].set_index('in')
Explanation: Efter flot hattrick mod Irland, kan man vidst ikke være i tvivl om Kong Christian tager pladsen på tronen
<img src='kongen.png',
    align="center"
    width="40%"
    alt="kongen">
Men hvilke danske spillere spiller egentlig for topklubber, og hvordan er de rangeret i forhold til vores model?
End of explanation
dansker_sorted.loc[dansker_sorted.Name == 'N. Bendtner'].set_index('in')
Explanation: Man kan undre sig over hvad Jacob Larsen laver hos stopklubben Borussia Dortmund, men en hurtig googling viser, at han simpelthen blev headhuntet til klubben som 16-årig.
Og så er der jo nok nogen, der vil spørger - Hvad med Bendtner?
Så han skal da også lige have en plads i vores analyse:
End of explanation
df.loc[df.Name == 'N. Bendtner']
Explanation: Opgave:
Vi kan også kigge på ham i det store billede. Prøv evt. at lege lidt rundt med forskellige spillere eller andre features.<br>
Er der noget specielt, der kunne være sjovt at kigge på?
End of explanation
top_df = df[df.Club.isin(top_clubs)]
top_df[top_df.Overall < 70].sort_values('Overall', ascending=True)
Explanation: Ekstra lege/analyse opgaver
Danske Rezan Corlu som ellers ligger ret lavt selv på potentiale har alligevel sikret sig en plads hos A.S. Roma i en alder af 20 år.
Men hvordan var det egentlig med de topklub spillere? Hvor langt ned kan man gå i potentiale, og stadig spille for en topklub?
End of explanation
bund_df = df[~df.Club.isin(top_clubs)]
bund_df[bund_df.Overall > 70]
Explanation: Vi kan altså se, at der bliver satset på ungdommen, hvor deres kommende potentiale nok taler for deres plads i en storklub.<br>
Men hvad så med ikke-topklubsspillere og deres performance?
End of explanation
top_clubs
Explanation: Måske er de 22 klubber, vi har udvalgt ikke helt nok til at beskrive topklubber
End of explanation
<END_TASK>