diff --git a/src/lecture5.ipynb b/src/lecture5.ipynb new file mode 100644 index 0000000..6ae848b --- /dev/null +++ b/src/lecture5.ipynb @@ -0,0 +1,1285 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "# Lecture 5\n", + "## Model Selection and Problems in High Dimensions\n", + "\n", + "Run the following cell with `Shift + Enter` to watch the video." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IRdisplay::display_html('')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "Let us generate the data set with 1000 normally distributed predictors and a\n", + "response that is independent of the predictors." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "set.seed(932)\n", + "data <- data.frame(matrix(rnorm(50*1000), 50, 1000))\n", + "data$Y <- rnorm(50)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "We will use again the function `regsubsets` with `method = \"forward\"` and at\n", + "most `nvmax = 30` coefficients (including the intercept). To use the adjusted\n", + "R^2 or the BIC criterion we will fit on all the training data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "library(leaps)\n", + "regfit.fwd <- regsubsets(Y ~ ., data, method = \"forward\", nvmax = 30)\n", + "regfit.fwd.summary <- summary(regfit.fwd)\n", + "# plot\n", + "plot(regfit.fwd.summary$adjr2, type = \"l\", xlim = c(1,30),\n", + " xlab = \"Number of Variables\", ylab = \"adjusted R^2\")\n", + "adjr2.max <- which.max(regfit.fwd.summary$adjr2)\n", + "points(adjr2.max, regfit.fwd.summary$adjr2[adjr2.max], col = \"red\", cex = 2, pch = 20)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "plot(regfit.fwd.summary$bic, type = \"l\", xlim = c(1,30),\n", + " xlab = \"Number of Variables\", ylab = \"BIC\")\n", + "bic.min <- which.min(regfit.fwd.summary$bic)\n", + "points(bic.min, regfit.fwd.summary$bic[bic.min], col = \"red\", cex = 2, pch = 20)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "In both cases we see that the data generating model was not identified.\n", + "\n", + "Next, we perform cross-validation the wrong way, in that we use the whole data\n", + "to perform subset selection. We will make use of the functions\n", + "`predict.regsubsets` and `evaluate` that are similar to the ones we defined last week." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "library(tidymodels)\n", + "predict.regsubsets <- function(object, newdata, id, form = as.formula(object$call[[2]])) {\n", + " mat = model.matrix(form, newdata)\n", + " coefi = coef(object, id=id)\n", + " xvars = names(coefi)\n", + " mat[,xvars]%*%coefi\n", + "}\n", + "evaluate <- function(fold, fit, formula = Y ~ .) {\n", + " valid.set <- assessment(fold)\n", + " sapply(seq(1, fit$nvmax - 1),\n", + " function(id) mean((valid.set$Y - predict(fit, valid.set, id, formula))^2))\n", + "}\n", + "validation_data <- vfold_cv(data, v = 5)\n", + "cv.errors.wrong <- sapply(validation_data$splits, evaluate, regfit.fwd) # the mistake happens here, because we use the fit obtained on the full data set.\n", + "mean.cv.errors.wrong <- rowMeans(cv.errors.wrong)\n", + "plot(mean.cv.errors.wrong, type = \"l\", ylim = c(0, 1.3),\n", + " xlab = \"Number of Variables\", ylab = \"5-fold CV wrong\")\n", + "cv.wrong.min = which.min(mean.cv.errors.wrong)\n", + "points(cv.wrong.min, mean.cv.errors.wrong[cv.wrong.min], col = \"red\", cex = 2, pch = 20)\n", + "abline(sd(data$Y), 0, lty = \"dashed\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "Let us do now cross-validation the right way." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "fit_and_evaluate <- function(fold, formula = Y ~ .) {\n", + " fit <- regsubsets(formula, analysis(fold), method = \"forward\", nvmax = 30)\n", + " evaluate(fold, fit)\n", + "}\n", + "cv.errors <- sapply(validation_data$splits, fit_and_evaluate)\n", + "mean.cv.errors <- rowMeans(cv.errors)\n", + "plot(mean.cv.errors, type = \"l\", ylim = c(1, 4),\n", + " xlab = \"Number of Variables\", ylab = \"5-fold CV right\")\n", + "cv.min = which.min(mean.cv.errors)\n", + "points(cv.min, mean.cv.errors[cv.min], col = \"red\", cex = 2, pch = 20)\n", + "abline(sd(data$Y), 0, lty = \"dashed\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "Et voilà, finally we find the expected result.\n", + "\n", + "Running cross-validate Lasso on this data results in the following:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "library(glmnet)\n", + "cv.lasso <- cv.glmnet(as.matrix(data[,1:1000]), data$Y, alpha = 1)\n", + "plot(cv.lasso)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "The lowest mean-squared error is found with 3 predictors (first dashed line) but\n", + "also 0 predictors (second dashed line) have a mean squared error that is within\n", + "one standard error of the minimum. In conclusion, the Lasso does not lead to\n", + "wrong results like the ones we obtained with adjusted R^2 or the BIC criterion,\n", + "but it also doesn't identify the right model as nicely as forward selection\n", + "with cross-validation (done the right way).\n", + "\n", + "## Feature Engineering: Moving Beyond Linearity" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IRdisplay::display_html('')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "Let us load again the life expectancy dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data <- na.omit(read.csv(file.path(\"..\", \"data\", \"life_expectancy.csv\")))\n", + "fit <- lm(LifeExpectancy ~ GDP, data)\n", + "plot(data$GDP, data$LifeExpectancy)\n", + "abline(fit, col = \"red\", lwd = 2)\n", + "summary(fit)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "Let us compare this result with the one obtained with the logarithm of the GDP." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fit <- lm(LifeExpectancy ~ log(GDP), data)\n", + "plot(log(data$GDP), data$LifeExpectancy)\n", + "abline(fit, col = \"red\", lwd = 2)\n", + "summary(fit)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "If we compare the R-squared values of the two results, we can confirm that the\n", + "fit with the logarithm of the GDP as input fits the training data much better\n", + "than the fit on the raw input.\n", + "\n", + "Let us fit a second order polynomial to the following data, as we did already a\n", + "few times in this course." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fit <- lm(LifeExpectancy ~ poly(BMI, 2, raw = T), data)\n", + "summary(fit)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "In the following figure we see that the fit captures the trend in the data.\n", + "The function `fitted.poly` takes a vector of `x` values as input and computes\n", + "the return by multiplying the manually constructed model matrix `matrix(c(rep(1,\n", + "length(x)), x, x^2), ncol = 3)` (with 1s for the intercept and features `x` and\n", + "`x^2`) with the vector of coefficients `coef(fit)`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot(data$BMI, data$LifeExpectancy)\n", + "fitted.poly <- function(x) matrix(c(rep(1, length(x)), x, x^2), ncol = 3) %*% coef(fit)\n", + "curve(fitted.poly, from = 20, to = 32, add = TRUE, col = \"red\", lwd = 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "We could have done the same manually in the following way:\n", + "We set the first feature equal to the raw predictor and the second feature to\n", + "the predictor squared." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "newdata <- data.frame(BMI = data$BMI,\n", + " BMI2 = data$BMI^2,\n", + " LifeExpectancy = data$LifeExpectancy)\n", + "fit <- lm(LifeExpectancy ~ ., newdata)\n", + "summary(fit)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compare the coefficients found with this fit to the coefficients found with the\n", + "fit above where we used the function `poly` to see that the exact same solution\n", + "was found.\n", + "\n", + "This can also be seen by looking at the model matrices of the two fits." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "head(model.matrix(LifeExpectancy ~ poly(BMI, 2, raw = T), data))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "head(model.matrix(LifeExpectancy ~ BMI + BMI2, newdata))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "In the following cell we fit a model with features computed from GDP and BMI,\n", + "including an interaction term." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "newdata <- data.frame(logGDP = log(data$GDP),\n", + " BMI = data$BMI,\n", + " BMI2 = data$BMI^2,\n", + " BMItimeslogGDP = data$BMI * log(data$GDP),\n", + " LifeExpectancy = data$LifeExpectancy)\n", + "summary(lm(LifeExpectancy ~ ., newdata))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "If we compare the fit with these feature representations to the original fit\n", + "with the raw predictors ..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "summary(lm(LifeExpectancy ~ BMI + GDP, data))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "... we see that the fit on our custom feature representation fits the training\n", + "data much better than the fit on the raw data.\n", + "\n", + "Feature engineering can be seen either is an art or as a messy\n", + "trial-and-error search. It is totally up to the engineer to find useful features\n", + "for a given data set. I am not aware of a standard recipe to find the most\n", + "useful features for a given data set.\n", + "\n", + "## One-Hot Coding" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IRdisplay::display_html('')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "Let us load the `ChickWeight` data set here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "data(ChickWeight)\n", + "str(ChickWeight)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that the data set has columns `weight`, `Time`, `Chick` and `Diet`.\n", + "The type of the columns `weight` and `Time` is `num`, indicating that there are\n", + "numbers in these columns. The `Chick` column contains, however, ordered factors\n", + "with 50 levels (`Ord.factor w/ 50 level`) and the column `Diet` factors with 4\n", + "levels (`Factor w/ 4 levels`). This information is used in R to construct\n", + "model matrices with one-hot coding. For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "head(model.matrix(weight ~ Time + Diet - 1, ChickWeight))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "You can see that `Time` is normally encoded, but `Diet` is represented in a one-hot\n", + "code. The `-1` in the above formula is used to exclude the intercept.\n", + "\n", + "One could also include the intercept." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "m <- model.matrix(weight ~ Time + Diet, ChickWeight)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this case, the one-hot code does not include a feature for diet 1, because\n", + "the intercept coefficient can account for the effect of diet 1, as we will see\n", + "in the following." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fit <- lm(weight ~ Time + Diet - 1, ChickWeight)\n", + "summary(fit)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "fit <- lm(weight ~ Time + Diet, ChickWeight)\n", + "summary(fit)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "The coefficient found for the intercept in the second case is equal to the\n", + "coefficient found for feature `Diet1` above. The coefficients found in the\n", + "second fit are relative to the `intercept`, i.e. the intercept coefficient plus\n", + "the `Diet2` coefficient of the second fit are equal to the `Diet2` coefficient\n", + "of the first fit. This becomes obvious, if we look again at the two model\n", + "matrices and see that the intercept column contains 1s for every data point,\n", + "whereas without an intercept the `Diet1` feature is only active for those data\n", + "points that were obtained with diet 1.\n", + "\n", + "Side remark: The R-squared values for regression without intercept are computed\n", + "differently by R. If you are interested, you can find further explanations\n", + "[here](https://stats.stackexchange.com/questions/26176/removal-of-statistically-significant-intercept-term-increases-r2-in-linear-mo/26205#26205).\n", + "\n", + "Let us plot the results as a function of time and diet. We will use the\n", + "`as.factor` function to indicate that diet should be treated as a factor and not\n", + "as a numerical variable. If you want to know more about the function\n", + "`as.factor`, look at it's help `?as.factor` or play with examples like\n", + "`model.matrix(Y ~ X - 1, data.frame(X = c(1, 2, 3, 1), Y = c(1, 2, 3, 4)))` and\n", + "`model.matrix(Y ~ X - 1, data.frame(X = as.factor(c(1, 2, 3, 1)), Y = c(1, 2, 3, 4)))`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "plot(ChickWeight$Time, ChickWeight$weight)\n", + "grid <- seq(0, 21, length = 100)\n", + "colors <- c(\"red\", \"blue\", \"darkgreen\", \"black\")\n", + "for(diet in 1:4) {\n", + " lines(grid,\n", + " predict(fit, data.frame(Time = grid, Diet = as.factor(rep(diet, 100)))),\n", + " col = colors[diet])\n", + "}\n", + "legend(\"topleft\", c(\"Diet 1\", \"Diet 2\", \"Diet 3\", \"Diet 4\"), col = colors, lty = 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "In the fits above the different diets do not affect the slope of the weight as a\n", + "function of time. If we want a model that fits lines with different slopes for\n", + "the different diets, we need to include a `Time * Diet` interaction term." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fit <- lm(weight ~ Time + Diet + Time * Diet, ChickWeight)\n", + "plot(ChickWeight$Time, ChickWeight$weight)\n", + "grid <- seq(0, 21, length = 100)\n", + "colors <- c(\"red\", \"blue\", \"darkgreen\", \"black\")\n", + "for(diet in 1:4) {\n", + " lines(grid,\n", + " predict(fit, data.frame(Time = grid, Diet = as.factor(rep(diet, 100)))),\n", + " col = colors[diet])\n", + "}\n", + "legend(\"topleft\", c(\"Diet 1\", \"Diet 2\", \"Diet 3\", \"Diet 4\"), col = colors, lty = 1)\n", + "summary(fit)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "## Vector Features" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IRdisplay::display_html('')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "In the following cell we generate the data for the XOR problem in the slides.\n", + "The function `mvrnorm` from the `MASS` library generates data from a\n", + "multivariate Gaussian with some mean and covariance matrix. See `?mvrnorm` for\n", + "more information." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "library(MASS)\n", + "x1 <- mvrnorm(30, c(1.5, 1), .2*diag(2))\n", + "x2 <- mvrnorm(30, c(-1, -1), .2*diag(2))\n", + "x3 <- mvrnorm(30, c(-1, .8), .2*diag(2))\n", + "x4 <- mvrnorm(30, c(.9, -1), .2*diag(2))\n", + "data <- data.frame(X = rbind(x1, x2, x3, x4), Y = c(rep(1, 60), rep(0, 60)))\n", + "plot(data$X.1, data$X.2, col = data$Y + 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "Let us fit a logistic regression to the raw data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "fit <- glm(Y ~ ., data, family = \"binomial\")\n", + "ypred <- predict(fit, type = \"response\") > .5\n", + "plot(data$X.1, data$X.2, col = ypred + 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "We can see that it fails to predict correctly the class labels of the training\n", + "points.\n", + "\n", + "Now we construct the feature representation from the slides.\n", + "The `relu` function implements the thresholding mentioned in the video." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "features <- matrix(c(1, -1, 1, -1,\n", + " 1, 1, -1, -1), ncol = 2)\n", + "relu <- function(x) ifelse(x > 0, x, 0)\n", + "newdata <- data.frame(H = relu(as.matrix(data[, c(\"X.1\", \"X.2\")]) %*% t(features)))\n", + "newdata$Y <- data$Y\n", + "head(newdata)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "If we now fit a logistic regression to the feature representation ..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "fit <- glm(Y ~ ., newdata, family = \"binomial\")\n", + "ypred <- predict(fit, type = \"response\") > .5\n", + "plot(data$X.1, data$X.2, col = ypred + 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "... we find, olé olé, that the training data can be classified almost perfectly.\n", + "\n", + "## Splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IRdisplay::display_html('')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "We will use the library `splines` to fit splines.\n", + "The function `bs` is used to construct the feature representation of the input\n", + "data with degree-d polynomials and given knots." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "library(splines)\n", + "data <- na.omit(read.csv(file.path(\"..\", \"data\", \"life_expectancy.csv\")))\n", + "knots <- c(5000, 20000, 50000, 100000)\n", + "m <- model.matrix(LifeExpectancy ~ bs(GDP, degree = 1, knots = knots), data)\n", + "colnames(m) <- NULL # Otherwise the output of the cell looks ugly; The column names are really long.\n", + "head(m)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "We see that the function `bs` constructed a feature representation with `K + d +\n", + "1` coefficients (with K knots, degree-d polynomials and 1 intercept\n", + "coefficient).\n", + "\n", + "In the following cell, you are invited to play with different values for the\n", + "degree to see how the fit changes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "spline.fit = lm(LifeExpectancy ~ bs(GDP, degree = 3, knots = knots), data)\n", + "plot.predictions = function(grid, fit, col = \"blue\") {\n", + " pred <- predict(fit, data.frame(GDP = grid), se = T)\n", + " lines(grid, pred$fit, lwd = 2, col = col)\n", + " lines(grid, pred$fit - 2*pred$se.fit, lty = \"dashed\", col = col)\n", + " lines(grid, pred$fit + 2*pred$se.fit, lty = \"dashed\", col = col)\n", + "}\n", + "plot(data$GDP, data$LifeExpectancy, col = \"gray\", ylim = c(40, 100))\n", + "grid <- seq(0, 150000, length = 10^3)\n", + "plot.predictions(grid, spline.fit)\n", + "for(k in knots) abline(v = k, lty = \"dashed\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "To construct a feature representation for natural splines we can use the\n", + "function `ns`. In contrast to the `bs` function above, the `knots` in the `ns`\n", + "function are actually interior knots and the `ns` function adds automatically\n", + "boundary knots at the lowest and highest input value." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot(data$GDP, data$LifeExpectancy, col = \"gray\", ylim = c(40, 100))\n", + "ns.fit <- lm(LifeExpectancy ~ ns(GDP, knots = knots), data)\n", + "plot.predictions(grid, ns.fit, col <- \"darkgreen\")\n", + "p6.fit <- lm(LifeExpectancy ~ poly(GDP, 6), data)\n", + "plot.predictions(grid, p6.fit, col <- \"black\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Optional: If you are interested in knowing more about how one can construct a\n", + "feature representation for natural splines, you are invited to read more\n", + "[here](https://stats.stackexchange.com/questions/172217/why-are-the-basis-functions-for-natural-cubic-splines-expressed-as-they-are-es)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "## GAMs\n", + "\n", + "In the following we add a natural spline representation of the GDP to a natural\n", + "spline representation of the BMI." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "formula <- LifeExpectancy ~ ns(GDP, knots = c(5000, 10000, 40000, 100000)) +\n", + " ns(BMI, knots = c(20, 25, 28))\n", + "m <- model.matrix(formula, data)\n", + "colnames(m) <- NULL\n", + "head(m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gam.fit <- lm(formula, data)\n", + "summary(gam.fit)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "Let us plot the results with the `plotly` library." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "library(plotly)\n", + "grid <- expand.grid(GDP = seq(1000, 120000, length = 1000), BMI = 20:32)\n", + "pred <- predict(gam.fit, grid)\n", + "plot_ly(x = matrix(grid$GDP, nrow = 1000),\n", + " y = matrix(grid$BMI, nrow = 1000),\n", + " z = matrix(pred, nrow = 1000)) %>%\n", + "add_surface(contours = list(z = list(show = T, project=list(z=TRUE)))) %>%\n", + "add_markers(x = data$GDP, y = data$BMI, z = data$LifeExpectancy,\n", + " marker = list(size = 3), color = data$LifeExpectancy) %>%\n", + "layout(scene = list(xaxis = list(title = \"GDP\"), yaxis = list(title = \"BMI\"),\n", + " zaxis = list(title = \"LifeExpectancy\")))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should be able to use your mouse to look at the plot from different\n", + "perspectives.\n", + "\n", + "In the cell above we used the pipe operator `%>%` several times.\n", + "This operator is very commonly used in modern R code that is written in the\n", + "context of the popular [tidyverse](https://www.tidyverse.org/) and we will see\n", + "it again multiple times in the next weeks. To understand what the pipe operator\n", + "does, let as look at the following example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "f <- function(x) x^2\n", + "g <- function(x, y) x + y\n", + "h <- function(x) 2 * x\n", + "h(g(f(3), 4))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "We are applying `f` to input `3`, use this as first argument of `g` and then\n", + "apply `h`. Note that the verbal description is somewhat reversed relative to how\n", + "we have written it in the cell above.\n", + "\n", + "With the help of the pipe operator this can write this in a way that resembles\n", + "more our verbal description." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "3 %>% f %>% g(4) %>% h" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The pipe operator simply takes the element on the left and uses it as first\n", + "argument of the function on the right.\n", + "\n", + "Before you move on to the last section you should be ready now to solve the\n", + "[quiz](https://moodle.epfl.ch/mod/quiz/view.php?id=1102726).\n", + "\n", + "## Smoothing Splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IRdisplay::display_html('')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "In the following cell we fit a smoothing spline to the life expectancy data set.\n", + "You are invited to play with lambda in the range between 1e-16 and 1e-2." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fit.smooth <- smooth.spline(data$GDP, data$LifeExpectancy, all.knots = T, lambda = 1e-18)\n", + "plot(data$GDP, data$LifeExpectancy)\n", + "lines(fit.smooth, col = \"orange\", lwd = 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "If we do not explicitly set the lambda value, lambda will be picked by\n", + "cross-validation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [], + "source": [ + "fit.smooth.cv <- smooth.spline(data$GDP, data$LifeExpectancy)\n", + "plot(data$GDP, data$LifeExpectancy)\n", + "lines(fit.smooth.cv, col = \"red\", lwd = 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Bias-Variance Decomposition: Revisited with Smoothing Splines\n", + "\n", + "In the second week we saw the decomposition of the test error into bias and\n", + "variance as a function of the flexibility of the method. With smoothing splines\n", + "one can nicely generate such plots.\n", + "\n", + "The idea is to generate artificial data, where we know exactly what the true\n", + "model is. The true model is given by the non-linear function\n", + "`noisefree.generator`. The function `data.generator` creates each time a new\n", + "data set by sampling some `x` values, applying the `noisefree.generator`\n", + "function and adding normal noise with standard deviation 1 to get `y`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "noisefree.generator <- function(x) (-.1*(x-1)^4*(x < 1) - 2*x^3*sin(5*x) + x^2 - 4*x*(x > 0))\n", + "data.generator <- function(n) {\n", + " x = 3*runif(n) - 1.5\n", + " y = noisefree.generator(x) + rnorm(length(x))\n", + " data.frame(X = x, Y = y)\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us plot some data points and some smooth spline fits together with the true\n", + "function in red." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data <- data.generator(200)\n", + "fit.1 <- smooth.spline(data$X, data$Y, lambda = 1e-2)\n", + "fit.2 <- smooth.spline(data$X, data$Y, lambda = 1e-4)\n", + "fit.3 <- smooth.spline(data$X, data$Y, lambda = 1e-8)\n", + "plot(data, col = \"darkgray\")\n", + "lines(fit.1, col = \"purple\")\n", + "lines(fit.2, col = \"darkgreen\")\n", + "lines(fit.3, col = \"blue\")\n", + "plot(noisefree.generator, add = T, xlim = c(-1.5, 1.5), col = \"red\")\n", + "legend(\"bottom\", c(expression(paste(lambda, \"=\", 10^-2)),\n", + " expression(paste(lambda, \"=\", 10^-4)),\n", + " expression(paste(lambda, \"=\", 10^-8)),\n", + " \"noise-free generator\"), lty = 1,\n", + " col = c(\"purple\", \"darkgreen\", \"blue\", \"red\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we create to functions that compute test and training errors for a given\n", + "fit. The test error will be evaluated over $10^5$ new data points." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ms.error <- function(fit, data) mean((predict(fit, data$X)$y - data$Y)^2)\n", + "test.error <- function(fit) ms.error(fit, data.generator(10^5))\n", + "c(test.error(fit.1), test.error(fit.2), test.error(fit.3))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "c(ms.error(fit.1, data), ms.error(fit.2, data), ms.error(fit.3, data))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function `bias.variance` takes as input the hyper-parameter\n", + "`lambda` and the number `k` of repetitions. It then fits `k` times a smoothing\n", + "spline on `k` different training sets from the same population.\n", + "\n", + "The squared bias of the model is then the mean squared difference between the\n", + "average of the `k` smoothing splines and the true function.\n", + "\n", + "The variance is simply the variance of the `k` smoothing splines.\n", + "\n", + "Additionally we return the average test and training error." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "bias.variance <- function(lambda, k = 100) {\n", + " predictions <- matrix(rep(NA, k*100), k, 100)\n", + " train.errors <- rep(NA, k)\n", + " test.errors <- rep(NA, k)\n", + " test.x <- seq(-1.5, 1.5, length = 100)\n", + " for (i in 1:k) {\n", + " data <- data.generator(200) # each time another training set\n", + " fit <- smooth.spline(data$X, data$Y, all.knots = T, lambda = lambda)\n", + " train.errors[i] <- ms.error(fit, data)\n", + " test.errors[i] <- test.error(fit)\n", + " predictions[i,] <- predict(fit, test.x)$y # function values for this fit\n", + " }\n", + " mean.pred <- apply(predictions, 2, mean)\n", + " bias.squared <- mean((mean.pred - noisefree.generator(test.x))^2)\n", + " var <- mean(sweep(predictions, 2, mean.pred)^2)\n", + " c(bias.squared, var, mean(test.errors), mean(train.errors))\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we run this function for different lambdas and plot the\n", + "result. Evaluating this cell takes some time. You can also just look at the\n", + "output from a previous run. We marked the irreducible error with a dashed line." + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAIAAAByhViMAAAACXBIWXMAABJ0AAASdAHeZh94\nAAAgAElEQVR4nOzdd1gUV9sG8HtpC0oRUBYbCLKrqCARK5EFBRXFGHvsibHExGjssSSWaDTW\nKMaemGhiYs1rYsOGCvYWOwrYsYAoKiCdff9AEwtlwdk2e/+u7484c/aZZ/muj+9m5sw5EpVK\nBSIiIiIyfCa6boCIiIiIhMFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQS\nDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFg\nR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZE\nREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RE\nRCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZERERE\nIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQS\nDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFg\nR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZE\nREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RE\nRCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZERERE\nIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQS\nDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFg\nR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSDHZE\nREREIsFgR0RERCQSDHZEREREIsFgR0RERCQSZrpuwDCcPXs2JydH110QERGRXjAzM6tbt66u\n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\nvDH1RWpCdsKj7EfxmfHxWfHHbx9PeZEiV8iNtI2czJ1aW7R2NHd0NHN0MndyNHcUqAvYCg8N\n4N69e4MHDzYwMLhy5YqtrS3bcQDeD8VOyWRk0PXrr/4IhWRsTN2708SJ5O1N7dsTF/PCAf4b\nWyNbWyPbysdwJVLJo+xHCVkJj7IfJWQnHL99/HHO4xfiF8zOjmaOjuaOTuZOzJ/mJs2x2Ipq\nOHny5Mcff9y3b9/du3cLBGjwoBxQ7Bq7ggK6c4diY8v/PHhA2trUrh15eNCYMeThQS4uhFm8\nAPVKk6/Z1qZtW5u2lTcKi4TMdL3E3MS4jLh9V/c9yn5U+TCug6mDg6mDi6WLq5UrzsZVOsyp\nEvPmzfvhhx/U1NTYjgNQUyh2jY5USo8eUUwMRUdTbCzFx5OaGjk5kYcHTZlCHh7UqRMuzwrA\nPkOBIXO5s8obmbYXlxHHzNsLuxH2IONBsbRYnaduY2hTZdJec5PmOLmyESotLZ02bdq+fft2\n7949duxYtuMA1A6KHftkMoqPfzUmd+MGlZSQpSV5eZU3OQ8PwnpJAErhzbZXJi9Lyk16nPM4\nISvhcfbjBxkPjt0+lvoiVa6QGwgMHM0crQysrA2szfXMLQ0sLfQsLPQtrAyszHTNcDyXFc+f\nP//oo48SEhIuXLjQqVMntuMA1BqKHTsyMsprXEwMXbpERUVkaUkeHuTvT/PnU7duWCsYQEXw\n1HgtzVq2NGvZv03/io0SqeRxzuPH2Y+f5DxJz0vPEmXdS7+XnZ+dnpcuLhEz+5jpmpnpmVkZ\nWJnrmVvolbc9a0NrM10zKwMrfS2sWlT3rl27NmrUKH19/WvXrtnY2LAdB+DfQLFraFu30sKF\n5Sc9dOxIXbvSzJnUsSNZWLCdDAAaiiZf083azc3a7c2bxCXiDFFGdn52Zl5mpigzOz87Iy8j\nLiPu1INT2fnZOfk5coWciLT4Whb6Fpb6luZ65hVtz1zP3FLf0lLf0kzPjKeGH+81JRKJ9u/f\nv3Pnzhs3bowYMSIkJERbW5vtUAD/El75Da17d9qyhTw9qUULtqMAQOOjraHtaOboaOZY7a0y\nuSynICdLlJWRl5FTkJOel56Tn5MpyrydcjsrPysjL6OotIiI1DhqZnpm5nrmzEHe8r8Nrc31\nzK0MrCz0LLD8MiM2Nnb79u379u3j8/nDhw8PCQlxc6umbQMoERS7hubmRvi5AQD/DleNy4zJ\n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\nB7vZMgjFTrd0AAAAAElFTkSuQmCC", + "text/plain": [ + "plot without title" + ] + }, + "metadata": { + "image/png": { + "height": 420, + "width": 420 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "lambdas <- 10^seq(-10, -1, length = 25)\n", + "result <- sapply(lambdas, bias.variance)\n", + "plot(log10(lambdas), result[1,], col = \"black\", type = \"l\",\n", + " ylim = c(0, 4),\n", + " xlab = expression(log10(lambda)), ylab = \"error\")\n", + "lines(log10(lambdas), result[2,], col = \"darkgreen\")\n", + "lines(log10(lambdas), result[3,], col = \"red\")\n", + "lines(log10(lambdas), result[4,], col = \"blue\")\n", + "abline(h = 1, lty = \"dashed\")\n", + "legend(\"top\", legend = c(\"bias^2\", \"variance\", \"training error\", \"test error\"),\n", + " col = c(\"black\", \"darkgreen\", \"blue\", \"red\"), lty = 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "### Conceptual\n", + "**Q1.** Suppose we use the feature functions $h_1(X) = X$, $h_2(X) = (X -\n", + "1)^2I(X\\ge 1)$ to fit the linear regression model\n", + "$Y = \\beta_0 + \\beta_1h_1(X) + \\beta_2h_2(X) + \\varepsilon,$\n", + "and obtain coefficient estimates $\\hat{\\beta}_0 = 1$, $\\hat{\\beta}_1 = 1$, $\\hat{\\beta}_2 = -2$.\n", + "Sketch the estimated curve between $X = -2$ and $X = 2$.\n", + "\n", + "**Q2.** Suppose that a curve $\\hat{g}$ is computed to smoothly fit a set of $n$ points using the following formula\n", + "$\\hat{g} = \\arg\\min_g\\Biggl(\\sum_{i=1}^n(y_i - g(x_i))^2 +\n", + "\\lambda\\int[g^{(m)}(x)]^2dx\\biggr),$\n", + "where $g^{(m)}$ represents the mth derivative of $g$ (and $g^{(0)} = g$). Provide example sketches of $\\hat{g}$ in each of the following scenarios.\n", + "\n", + "(a) $\\lambda = \\infty$, $m = 0$.\n", + "\n", + "(b) $\\lambda = \\infty$, $m = 1$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(c) $\\lambda = \\infty$, $m = 2$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(d) $\\lambda = \\infty$, $m = 3$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(e) $\\lambda = 0$, $m = 3$.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Applied\n", + "\n", + "**Q3.** In this exercise, you will analyse the `Wage` data set contained in the\n", + "library ISLR. You can load it with `library(ISLR)` and get information with\n", + "`?Wage`.\n", + "\n", + "(a) Perform polynomial regression to predict `wage` using `age`. Use\n", + "cross-validation to select the optimal degree $d$ for the polynomial. Make a\n", + "plot of the resulting polynomial fit to the data.\n", + "\n", + "(b) Fit a natural spline to predict `wage` using `age` and some hand-picked\n", + "knots.\n", + "\n", + "(c) Instead of providing hand-picked knots, use the `df` argument of the `ns`\n", + "function and let the method pick the knots automatically. Perform\n", + "cross-validation to choose the optimal number of knots (i.e. optimal degree of\n", + "freedom `df`) and make a plot of the fit obtained.\n", + "\n", + "(d) The \"Wage\" data set contains a number of other features, such as marital\n", + "status (\"marit1\"), job class (\"jobclass\"), and others. Explore the relationships\n", + "between some of these other predictors and \"wage\", and design some features in\n", + "order to fit different models to the data.\n", + "Create plots of the results obtained, and write a summary of your findings.\n", + "\n", + "**Q4.** In the video on the vector features we used 4 feature vectors to find a\n", + "solution to the XOR problem.\n", + "\n", + "(a) Try to find a solution to the XOR problem with only 3 feature vectors.\n", + "\n", + "(b) Try to find a solution to the XOR problem with 5 feature vectors." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "R", + "language": "R", + "name": "ir" + }, + "language_info": { + "codemirror_mode": "r", + "file_extension": ".r", + "mimetype": "text/x-r-source", + "name": "R", + "pygments_lexer": "r", + "version": "4.0.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}