Classificatietechnieken zijn een essentieel onderdeel van machine learning en data mining. Ongeveer 70% van de datascienceproblemen zijn classificatieproblemen. Er zijn veel classificatieproblemen, maar logistic regression komt vaak voor en is een nuttige regressiemethode om binaire classificatieproblemen op te lossen. Een andere categorie is multinomiale classificatie, die gevallen aanpakt waarbij meerdere klassen in de doelvariabele voorkomen. Zo is de IRIS-dataset een bekend voorbeeld van multiclass-classificatie. Andere voorbeelden zijn het classificeren van categorieën van artikelen/blogs/documenten.
Logistic regression kan voor uiteenlopende classificatieproblemen worden gebruikt, zoals spamdetectie. Andere voorbeelden zijn: het voorspellen van diabetes, of een klant een bepaald product zal kopen, of een klant zal afhaken (churn), of een gebruiker op een advertentielink zal klikken, en nog veel meer.
Logistic Regression is een van de eenvoudigste en meest gebruikte machinelearningalgoritmen voor tweeklassenclassificatie. Het is makkelijk te implementeren en kan dienen als baseline voor elk binair classificatieprobleem. De basisconcepten zijn bovendien nuttig in deep learning. Logistic regression beschrijft en schat de relatie tussen één afhankelijke binaire variabele en onafhankelijke variabelen.
Wil je alle voorbeeldcode in deze tutorial eenvoudig zelf draaien? Maak dan gratis een DataLab-werkboek aan met vooraf geïnstalleerde Python en alle codevoorbeelden. Wil je meer oefenen met logistic regression? Bekijk dan de oefeningen in onze cursus Credit Risk Modeling in R, met volop realistische voorbeelden.
Wat is Logistic Regression?
Logistic regression is een statistische methode om binaire klassen te voorspellen. De uitkomst- of doelvariabele is dichotoom van aard. Dichotoom betekent dat er slechts twee mogelijke klassen zijn. Je kunt het bijvoorbeeld gebruiken voor kankerdetectie. Het berekent de kans dat een gebeurtenis optreedt.
Het is een bijzonder geval van lineaire regressie waarbij de doelvariabele categorisch is. Het gebruikt de logaritme van odds als afhankelijke variabele. Logistic regression voorspelt de kans op het optreden van een binaire gebeurtenis met behulp van een logitfunctie.
Vergelijking lineaire regressie:
![]()
Waar y de afhankelijke variabele is en x1, x2 ... en Xn de verklarende variabelen.
Sigmoidfunctie:

Sigmoidfunctie toepassen op lineaire regressie:

Eigenschappen van logistic regression:
- De afhankelijke variabele in logistic regression volgt een Bernoulli-verdeling.
- De schatting gebeurt via maximum likelihood.
- Geen R-kwadraat; modelgeschiktheid wordt berekend met Concordance, KS-statistieken.
Lineaire regressie versus logistic regression
Lineaire regressie geeft een continue output, maar logistic regression levert een discrete output. Een voorbeeld van continue output is huizenprijs of aandelenkoers. Voorbeelden van discrete output zijn voorspellen of een patiënt kanker heeft of niet, en of een klant zal afhaken. Logistic regression wordt geschat met de maximum likelihood estimation (MLE), terwijl lineaire regressie doorgaans wordt geschat met ordinary least squares (OLS), wat ook als een speciaal geval van MLE kan worden beschouwd wanneer de fouten in het model normaal verdeeld zijn.

Maximum likelihood estimation versus kleinste-kwadratenmethode
MLE is een methode om de "waarschijnlijkheid" te maximaliseren, terwijl OLS een benadering is die de afstand minimaliseert. Door de likelihoodfunctie te maximaliseren bepaal je de parameters die het meest waarschijnlijk de geobserveerde data opleveren. Statistisch gezien zet MLE het gemiddelde en de variantie als parameters om specifieke parametrische waarden voor een model te bepalen. Deze parameterset kan worden gebruikt om data te voorspellen die in een normale verdeling nodig zijn.
Ordinary least squares-schattingen worden berekend door een regressielijn te fitten op de gegeven datapunten met de minimale som van de gekwadrateerde afwijkingen (least square error). Beide worden gebruikt om de parameters van een lineair regressiemodel te schatten. MLE veronderstelt een gezamenlijke kansmassa- of dichtheidsfunctie, terwijl OLS geen stochastische aannames vereist om de afstand te minimaliseren.
Sigmoidfunctie
De sigmoidfunctie, ook wel logistic function genoemd, geeft een S-vormige curve die elk reëel getal afbeeldt op een waarde tussen 0 en 1. Als de curve naar positieve oneindig gaat, wordt de voorspelde y gelijk aan 1, en als de curve naar negatieve oneindig gaat, wordt de voorspelde y gelijk aan 0. Als de output van de sigmoidfunctie groter is dan 0,5, kunnen we de uitkomst als 1 of JA classificeren, en als deze kleiner is dan 0,5, als 0 of NEE. Als de output bijvoorbeeld 0,75 is, kunnen we in termen van kans zeggen dat er 75 procent kans is dat een patiënt aan kanker zal lijden.


Soorten logistic regression
Soorten logistic regression:
- Binaire logistic regression: de doelvariabele heeft slechts twee mogelijke uitkomsten, zoals Spam of Geen spam, Kanker of Geen kanker.
- Multinomiale logistic regression: de doelvariabele heeft drie of meer nominale categorieën, zoals het voorspellen van het type wijn.
- Ordinale logistic regression: de doelvariabele heeft drie of meer ordinale categorieën, zoals een restaurant- of productbeoordeling van 1 tot en met 5.
Modelbouw in Scikit-learn
Laten we het diabetesvoorspellingsmodel bouwen met een logisticeregressie-classifier.
We laden eerst de benodigde Pima Indian Diabetes-dataset met de CSV-leesfunctie van pandas. Je kunt de data downloaden via de volgende link: https://www.kaggle.com/uciml/pima-indians-diabetes-database of een dataset selecteren van DataCamp: https://www.datacamp.com/datalab/datasets. Met de kant-en-klare dataset kun je het model trainen op DataLab, DataCamps gratis Jupyter-notebook in de cloud.
Data laden
We vereenvoudigen de kolommen door col_names mee te geven aan de pandas-functie read_csv().
#import pandas
import pandas as pd
col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
# load dataset
pima = pd.read_csv("pima-indians-diabetes.csv", header=None, names=col_names)
pima.head()
Features selecteren
Hier moet je de gegeven kolommen opdelen in twee soorten variabelen: afhankelijke (of doelvariabele) en onafhankelijke variabelen (of feature-variabelen).
#split dataset in features and target variable
feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable
Data splitsen
Om de modelprestatie te begrijpen, is het een goede strategie om de dataset op te splitsen in een trainings- en een testset.
Laten we de dataset splitsen met de functie train_test_split(). Je geeft 3 parameters mee: features, target en de grootte van de test_set. Daarnaast kun je random_state gebruiken om willekeurig records te selecteren.
# split X and y into training and testing sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=16)
Hier wordt de dataset in twee delen gesplitst in een verhouding van 75:25. Dat betekent dat 75% van de data wordt gebruikt om het model te trainen en 25% om het model te testen.
Modelontwikkeling en voorspelling
Importeer eerst de module LogisticRegression en maak een logisticeregressie-classifierobject met de functie LogisticRegression() en random_state voor reproduceerbaarheid.
Fit vervolgens je model op de trainingsset met fit() en voer voorspellingen uit op de testset met predict().
# import the class
from sklearn.linear_model import LogisticRegression
# instantiate the model (using the default parameters)
logreg = LogisticRegression(random_state=16)
# fit the model with data
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)
Modelevaluatie met een confusion matrix
Een confusion matrix is een tabel die wordt gebruikt om de prestaties van een classificatiemodel te evalueren. Je kunt hiermee de prestaties van een algoritme ook visualiseren. Het kernonderdeel van een confusion matrix is het aantal correcte en foutieve voorspellingen per klasse.
# import the metrics class
from sklearn import metrics
cnf_matrix = metrics.confusion_matrix(y_test, y_pred)
cnf_matrix
array([[115, 8],
[ 30, 39]])
Hier zie je de confusion matrix als array-object. De dimensie van deze matrix is 2×2 omdat dit model binaire classificatie is. Je hebt twee klassen, 0 en 1. Diagonale waarden staan voor correcte voorspellingen, terwijl niet-diagonale elementen foutieve voorspellingen zijn. In de output zijn 115 en 39 correcte voorspellingen en 30 en 8 foutieve voorspellingen.
Confusion matrix visualiseren met een heatmap
Laten we de resultaten van het model visualiseren als een confusion matrix met matplotlib en seaborn.
Hier visualiseer je de confusion matrix met een heatmap.
# import required modules
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
class_names=[0,1] # name of classes
fig, ax = plt.subplots()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names)
plt.yticks(tick_marks, class_names)
# create heatmap
sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, cmap="YlGnBu" ,fmt='g')
ax.xaxis.set_label_position("top")
plt.tight_layout()
plt.title('Confusion matrix', y=1.1)
plt.ylabel('Actual label')
plt.xlabel('Predicted label')
Text(0.5,257.44,'Predicted label');
Evaluatiemetrics voor de confusion matrix
Laten we het model evalueren met classification_report voor accuracy, precision en recall.
from sklearn.metrics import classification_report
target_names = ['without diabetes', 'with diabetes']
print(classification_report(y_test, y_pred, target_names=target_names))
precision recall f1-score support
without diabetes 0.79 0.93 0.86 123
with diabetes 0.83 0.57 0.67 69
accuracy 0.80 192
macro avg 0.81 0.75 0.77 192
weighted avg 0.81 0.80 0.79 192
Je behaalde een classificatiescore van 80%, wat als een goede nauwkeurigheid wordt beschouwd.
Precision: precision gaat om precisie, oftewel hoe accuraat je model is. Met andere woorden: als een model een voorspelling doet, hoe vaak is die dan correct? In jouw geval, wanneer je logisticeregressiemodel voorspelde dat patiënten diabetes zouden krijgen, klopte dat 73% van de tijd.
Recall: als er patiënten met diabetes in de testset zitten, kan je logisticeregressiemodel dat in 57% van de gevallen identificeren.
ROC-curve
De Receiver Operating Characteristic (ROC)-curve is een plot van de true positive rate tegen de false positive rate. Hij laat de trade-off zien tussen sensitiviteit en specificiteit.
y_pred_proba = logreg.predict_proba(X_test)[::,1]
fpr, tpr, _ = metrics.roc_curve(y_test, y_pred_proba)
auc = metrics.roc_auc_score(y_test, y_pred_proba)
plt.plot(fpr,tpr,label="data 1, auc="+str(auc))
plt.legend(loc=4)
plt.show()

De AUC-score in dit geval is 0,88. Een AUC-score van 1 staat voor een perfecte classifier en 0,5 voor een waardeloze classifier.
De broncode is beschikbaar op DataLab: Understanding Logistic Regression in Python.
Voordelen
Door het efficiënte en eenvoudige karakter is er geen hoge rekenkracht nodig, het is makkelijk te implementeren, goed te interpreteren en wordt het veel gebruikt door data-analisten en -scientists. Ook is schalen van features niet vereist. Logistic regression levert een kansscore voor observaties.
Nadelen
Logistic regression kan niet goed overweg met een groot aantal categorische features/variabelen. Het is gevoelig voor overfitting. Daarnaast kan het geen niet-lineaire problemen oplossen, waardoor transformatie van niet-lineaire features nodig is. Logistic regression presteert slecht met onafhankelijke variabelen die niet gecorreleerd zijn met de doelvariabele en die onderling sterk lijken of gecorreleerd zijn.
Conclusie
In deze tutorial heb je veel geleerd over logistic regression. Je weet nu wat logistic regression is, hoe je bijbehorende modellen bouwt, hoe je resultaten visualiseert en kent wat theoretische achtergrond. Ook kwamen basisconcepten aan bod zoals de sigmoidfunctie, maximum likelihood, confusion matrix en de ROC-curve.
Hopelijk kun je nu de techniek van logistic regression toepassen om je eigen datasets te analyseren. Bedankt voor het lezen!
Wil je meer leren over Logistic Regression? Volg dan DataCamps cursus Machine Learning with scikit-learn. Je kunt ook je reis beginnen om machinelearningengineer te worden door je in te schrijven voor de carrièreroute Machine Learning Scientist with Python.


