{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Feature engineering and feature learning in a linear system\n",
"\n",
"The [bivariate linear regression tutorial](LinearRegressionBivariate.html) ([Notebook](LinearRegressionBivariate.ipynb)), has provided the tools to perform linear regression on multiple variables. \n",
"\n",
"In the [bivariate Keras linear regression tutorial](LinearRegressionBivariate-Keras.html) ([Notebook](LinearRegressionBivariate-Keras.ipynb)), most of the plumbing of the optimization was delegated to Keras.\n",
"\n",
"In this tutorial, we will use the [Galton dataset of people height](https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/T0HSJ1). Starting from a simple regression using parents' heights to estimate the child's height, the model will be improved to take into account for the child's sex. Eventually, we will try to get the model to learn the feature through a two level neural net based on Keras.\n",
"\n",
"An introductory article about this notebook has been [published on Medium](https://medium.com/analytics-vidhya/machine-learning-from-feature-engineering-to-feature-learning-1d81fbf2dc23)\n",
"\n",
"\n",
"### Learning goals:\n",
"- [Feature engineering](https://en.wikipedia.org/wiki/Feature_engineering) to manually improve the model\n",
"- Observe the extraction and combination of features by a neural net, that's called [feature learning](https://en.wikipedia.org/wiki/Feature_learning)\n",
"- Prescale training data and adjust scaling on predictions"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from tensorflow import keras # TF 2.0 required\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from sklearn import metrics, linear_model, model_selection, preprocessing\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"usingTensorBoard = False"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Helpers"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def twinPlot(features, series, legend):\n",
" \"\"\" Plot subplots horizontally \"\"\"\n",
" numPlots = len(features.columns)\n",
" fig, axs = plt.subplots(1, numPlots, sharey=True, figsize=(16, 6))\n",
" if numPlots == 1:\n",
" t, v = features.iteritems()[0]\n",
" for y in series:\n",
" axs.scatter(v, y)\n",
" # axs[i].set_aspect('equal')\n",
" axs.set_xlabel(t)\n",
" axs.legend(legend)\n",
" axs.set_title('Height [inch]')\n",
" else:\n",
" for i, c in enumerate(features.iteritems()):\n",
" for y in series:\n",
" axs[i].scatter(c[1], y)\n",
" # axs[i].set_aspect('equal')\n",
" axs[i].set_xlabel(c[0])\n",
" axs[0].legend(legend)\n",
" axs[0].set_title('Height [inch]')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reading data\n",
"\n",
"The choosen data model is the Galton dataset of human heights with parents' heights. It also contains the gender of each kid, that's the feature will attempt to automatically process."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Family
\n",
"
Father
\n",
"
Mother
\n",
"
Gender
\n",
"
Height
\n",
"
Kids
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
78.5
\n",
"
67.0
\n",
"
M
\n",
"
73.2
\n",
"
4
\n",
"
\n",
"
\n",
"
1
\n",
"
1
\n",
"
78.5
\n",
"
67.0
\n",
"
F
\n",
"
69.2
\n",
"
4
\n",
"
\n",
"
\n",
"
2
\n",
"
1
\n",
"
78.5
\n",
"
67.0
\n",
"
F
\n",
"
69.0
\n",
"
4
\n",
"
\n",
"
\n",
"
3
\n",
"
1
\n",
"
78.5
\n",
"
67.0
\n",
"
F
\n",
"
69.0
\n",
"
4
\n",
"
\n",
"
\n",
"
4
\n",
"
2
\n",
"
75.5
\n",
"
66.5
\n",
"
M
\n",
"
73.5
\n",
"
4
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Family Father Mother Gender Height Kids\n",
"0 1 78.5 67.0 M 73.2 4\n",
"1 1 78.5 67.0 F 69.2 4\n",
"2 1 78.5 67.0 F 69.0 4\n",
"3 1 78.5 67.0 F 69.0 4\n",
"4 2 75.5 66.5 M 73.5 4"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('Galton.txt', sep=\"\\t\") # http://www.randomservices.org/random/data/Galton.txt \n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Splitting train (80%) and test (20%)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"(df_train, df_test) = model_selection.train_test_split(df, test_size=0.2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Data Preparation\n",
"\n",
"We will first normalize the data before fitting the linear regression, in order to compare with the linear regression with neural net afterward.\n",
"\n",
"Normalization is, for each feature, removing the mean and scaling the variance to 1. It is important in order to get equivalent convergence speeds on all features and proper regularization.\n",
"\n",
"Inverse transformation will be necessary after prediction on train or test data.\n",
"\n",
"Two scalers are used to handle separately the features (X) and the labels (Y)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"scalerX = preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True)\n",
"scalerX.fit(df_train[['Mother', 'Father']])\n",
"trainX_scaled = scalerX.transform(df_train[['Mother', 'Father']])\n",
"testX_scaled = scalerX.transform(df_test[['Mother', 'Father']])\n",
"\n",
"scalerY = preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True)\n",
"scalerY.fit(df_train[['Height']])\n",
"trainY_scaled = scalerY.transform(df_train[['Height']])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Linear regression on the parents' heights"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Linear regression with 2 features, intercept = 0.000, weights = 0.167, 0.252\n"
]
}
],
"source": [
"model1 = linear_model.LinearRegression()\n",
"\n",
"model1.fit(trainX_scaled, trainY_scaled)\n",
"b1 = model1.intercept_\n",
"w1 = model1.coef_.reshape(-1)\n",
"\n",
"print('Linear regression with 2 features, intercept = %.3f, weights = %.3f, %.3f' % (b1, w1[0], w1[1]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Model evaluation"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean squared error for global model : 11.440\n"
]
},
{
"data": {
"image/png": "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Tbz+F5q15Ck1rGkK9P1nzpyppqaD77l06VKdeuqpmjp1qm68sTCD4rOf/axee+01zZs3T3feeafeffddfepTn9Kpp56q6dOn6+GHC7njfvzjH+viiy/WBRdcoPPOO6/k+23evFknnniirr76ap100kk677zz1NraKkn605/+pHPOOUfve9/7dMopp2jjxo0l3wcAAGQHHU8AiEnDmiYtenCdmppbZSU1Nbdq0YPrAut85vN5Pfnkk5o3b54k6YknntCGDRv0/PPP68UXX9Tq1av1m9/8Rt/97nc1ZswYPf300/rSl76kr3/96zr77LP1hz/8QU8//bQWLlyod999V5L07LPP6p577tFTTz1V8v0kacOGDfrc5z6nl19+WbW1tfr5z38uSVqwYIE+97nP6Y9//KN+//vf6+ijj+73fQAAQDa4Si4EAAje0sfXq7Ut36OstS2vpY+vV/30sWW/b2trq6ZNm6bNmzdrxowZOvfccyUVOp5PPPGEpk+fLknas2ePNmzYoA984AM9Xv/EE0/okUce0e233y6pkKl369atkqRzzz1XI0eO7Pf9JkyYoIkTJ2ratGmSpBkzZmjz5s1655131NTUpAsvvFBSYW1OL/UCAADpRccTQKAa1jRp6ePrtaO5VWNqa7RwzmRfnags29Hc6qncreIcz5aWFs2dO1ff/va39cUvflHWWi1atEjXXnttv6+31urnP/+5Jk+e3KN81apVOuSQQ3o8z+n9Nm/erCFDhnQ9zuVyam1tlbW25Pbc1AsAQJxFejHUFkBgwh46mjVjams8lXs1YsQILVu2TLfffrva2to0Z84c/fCHP9SePXskSU1NTXrrrbf6vG7OnDn613/9166O4po1axzf3+37FR122GEaN26cGhoaJEn79+/X3r17Pb8PAFQq4izSjI4ngMD0N3QUfS2cM1k11bkeZTXVOS2cM7nEK7ybPn263ve+9+n+++/Xeeedp8suu0wzZ87UlClT9PGPf1zvvPNOn9d87WtfU1tbm6ZOnaqTTz5ZX/va1xzf2+37dfeTn/xEy5Yt09SpU/X+979fb7zxRlnvAwCViDiLNDOlhj6Foa6uzjY2Nka2PQDRmnj9L+TUohhJm5acH3V1YvHKK6/oxBNPdP18hky553RsjTGrrbV1MVUpE4jNQHoQZ5EGpWIzczwBBGZMbY2aHOYn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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"height_est1_scaled = model1.predict(testX_scaled)\n",
"height_est1 = scalerY.inverse_transform(height_est1_scaled)\n",
"\n",
"mse1 = metrics.mean_squared_error(df_test['Height'], height_est1)\n",
"twinPlot(df_test[['Mother', 'Father']], [ df_test['Height'], height_est1], ['Reference', 'Estimated'])\n",
"print(\"Mean squared error for global model : %.3f\" % mse1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We may guess or check on the residus that we are missing some fundamental information : the sex of the kid.\n",
"Let's redo the linear regression with separate models for boys and girls."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Linear regression on the parents' heights with gendered models\n",
"\n",
"Let's create a specific linear regression for each sex and combine the results\n",
"\n",
"Note: the scalers fitted on the full dataset are used for both models, in order to align with what is done for neural nets. It implies that intercepts might not be null."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"girls_train = df_train['Gender'] == 'F'\n",
"girls_test = df_test['Gender'] == 'F'\n",
"\n",
"trainX_girls_scaled = scalerX.transform(df_train[['Mother', 'Father']][girls_train])\n",
"trainY_girls_scaled = scalerY.transform(df_train[['Height']][girls_train])\n",
"\n",
"model2_girl = linear_model.LinearRegression()\n",
"\n",
"model2_girl.fit(trainX_girls_scaled, trainY_girls_scaled)\n",
"b2_girl = model2_girl.intercept_\n",
"w2_girl = model2_girl.coef_.reshape(-1)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"boys_train = df_train['Gender'] == 'M'\n",
"boys_test = df_test['Gender'] == 'M'\n",
"\n",
"trainX_boys_scaled = scalerX.transform(df_train[['Mother', 'Father']][boys_train])\n",
"trainY_boys_scaled = scalerY.transform(df_train[['Height']][boys_train])\n",
"\n",
"model2_boy = linear_model.LinearRegression()\n",
"\n",
"model2_boy.fit(trainX_boys_scaled, trainY_boys_scaled)\n",
"b2_boy = model2_boy.intercept_\n",
"w2_boy = model2_boy.coef_.reshape(-1)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Linear regression with 2 features, fitting girls, intercept = -0.773, weights = 0.207, 0.283\n",
"Linear regression with 2 features, fitting boys, intercept = 0.710, weights = 0.209, 0.268\n"
]
}
],
"source": [
"print('Linear regression with 2 features, fitting girls, intercept = %.3f, weights = %.3f, %.3f' % (b2_girl, w2_girl[0], w2_girl[1]))\n",
"print('Linear regression with 2 features, fitting boys, intercept = %.3f, weights = %.3f, %.3f' % (b2_boy, w2_boy[0], w2_boy[1]))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean squared error for split boy/girl model : 5.123\n"
]
}
],
"source": [
"testX_girls_scaled = scalerX.transform(df_test[['Mother', 'Father']][girls_test])\n",
"testX_boys_scaled = scalerX.transform(df_test[['Mother', 'Father']][boys_test])\n",
"\n",
"# Predict\n",
"height_est2_boy_scaled = model2_boy.predict(testX_boys_scaled)\n",
"height_est2_girl_scaled = model2_girl.predict(testX_girls_scaled)\n",
"# Inverse scale\n",
"height_est2_boy = scalerY.inverse_transform(height_est2_boy_scaled).reshape(-1)\n",
"height_est2_girl = scalerY.inverse_transform(height_est2_girl_scaled).reshape(-1)\n",
"\n",
"mse2 = 1 / len(df_test) * (np.sum((df_test['Height'][boys_test] - height_est2_boy)**2) +\n",
" np.sum((df_test['Height'][girls_test] - height_est2_girl)**2))\n",
"\n",
"print(\"Mean squared error for split boy/girl model : %.3f\" % mse2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We observe a significant change in the coefficients, and a sharp decrease of the MSE"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Baseline model with Keras\n",
"\n",
"Let's build the equivalent gradient descent version of the _model1_, in order to perform a fair and verified comparison between the methods: inversion and gradient descent."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Scaled intercept = -0.011, Weights = [0.1839134 0.21746412]\n"
]
}
],
"source": [
"# Number of epochs\n",
"nEpoch3 = 512\n",
"nBatch3 = 128 # 32 is default\n",
"nFeatures3 = 2\n",
"\n",
"# Model\n",
"model3 = keras.models.Sequential([\n",
" keras.layers.Dense(1, activation='linear', input_shape=[nFeatures3],\n",
" kernel_regularizer=keras.regularizers.l1(0.001))\n",
"])\n",
"model3.compile(optimizer='adam',\n",
" loss=keras.losses.mean_squared_error,\n",
" metrics=['mse'])\n",
"\n",
"# Tensor board\n",
"callbacks = []\n",
"if usingTensorBoard:\n",
" ks = keras.callbacks.TensorBoard(log_dir=\"./logs/\", \n",
" histogram_freq=1, write_graph=True, write_grads=True, batch_size=1)\n",
" callbacks = [ks]\n",
" \n",
"# Fit\n",
"hist3 = model3.fit(trainX_scaled, trainY_scaled, \n",
" epochs=nEpoch3, batch_size=nBatch3, validation_split = 0.2, verbose=0, callbacks=callbacks)\n",
"\n",
"w3, b3 = model3.get_weights()\n",
"print('Scaled intercept = %.3f, Weights = ' % b3[0], w3.reshape(-1))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Verification, the intercepts and weights computed by the gradient descent are equal to the ones compted by Scikit Learn's linear regression. "
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Predict\n",
"height_est3_scaled = model3.predict(testX_scaled)\n",
"# Inverse scale\n",
"height_est3 = scalerY.inverse_transform(height_est3_scaled)\n",
"\n",
"mse3 = metrics.mean_squared_error(df_test['Height'], height_est3)\n",
"\n",
"twinPlot(df_test[['Mother', 'Father']], [df_test['Height'], height_est3], ['Reference', 'Estimated'])\n",
"print(\"Mean squared error for Keras baseline model : %.3f, original mse: %.3f\" % (mse3, mse1))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The MSE on the test set is similar to the one of linear regression.\n",
"\n",
"Keras baseline model and method are validated."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Model with gender in Keras\n",
"\n",
"Let's add the gender into the Keras model. In order to get symetrical handling of both sexes, we are first encoding the sex with a one hot encoder that is going to create two binary features corresponding to the sex:\n",
"\n",
"|sex|enc1 = \"Is a girl?\"|enc2 = \"Is a boy ?\"|\n",
"|---|----|----|\n",
"| F | 1 | 0 |\n",
"| M | 0 | 1 |"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([['F', 1.0, 0.0],\n",
" ['M', 0.0, 1.0],\n",
" ['M', 0.0, 1.0]], dtype=object)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"genderEncoder = preprocessing.OneHotEncoder(sparse=False)\n",
"genderEncoder.fit(df_train[['Gender']])\n",
"np.concatenate((df_train['Gender'].to_numpy().reshape(-1,1), \n",
" genderEncoder.transform(df_train[['Gender']])), axis=1)[:3]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"# Number of epochs\n",
"nEpoch4 = 1024\n",
"nBatch4 = 128 # 32 is default\n",
"nFeatures4 = 4\n",
"\n",
"# Model\n",
"model4 = keras.models.Sequential([\n",
" keras.layers.Dense(2, activation='linear', input_shape=[nFeatures4],\n",
" kernel_regularizer=keras.regularizers.l1(0.05)),\n",
" keras.layers.Dense(1, activation='linear', input_shape=[nFeatures4],\n",
" kernel_regularizer=keras.regularizers.l1(0.05))\n",
"])\n",
"model4.compile(optimizer='adam',\n",
" loss=keras.losses.mean_squared_error,\n",
" metrics=['mse'])\n",
"\n",
"# Tensor board\n",
"callbacks = []\n",
"if usingTensorBoard:\n",
" ks = keras.callbacks.TensorBoard(log_dir=\"./logs/\", \n",
" histogram_freq=1, write_graph=True, write_grads=True, batch_size=1)\n",
" callbacks = [ks]\n",
" \n",
"# Fit\n",
"xTrain4 = np.concatenate((trainX_scaled, \n",
" genderEncoder.transform(df_train[['Gender']])), axis=1)\n",
"hist4 = model4.fit(xTrain4, trainY_scaled,\n",
" epochs=nEpoch4, batch_size=nBatch4, validation_split = 0.2, verbose=0, callbacks=callbacks)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: \"sequential_1\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"dense_1 (Dense) (None, 2) 10 \n",
"_________________________________________________________________\n",
"dense_2 (Dense) (None, 1) 3 \n",
"=================================================================\n",
"Total params: 13\n",
"Trainable params: 13\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"model4.summary()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"[array([[ 1.3161868e-01, -1.1788163e-04],\n",
" [ 1.9276769e-01, -6.0178681e-06],\n",
" [-4.5193085e-01, 4.2015861e-05],\n",
" [ 6.8445295e-01, 2.8250279e-04]], dtype=float32),\n",
" array([-0.08908255, -0.01057821], dtype=float32),\n",
" array([[1.2722054e+00],\n",
" [4.7708898e-05]], dtype=float32),\n",
" array([-0.07207449], dtype=float32)]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"weights4 = model4.get_weights()\n",
"weights4"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(15,4))\n",
"plt.subplot(1,3,1)\n",
"plt.semilogy(hist4.history['loss'])\n",
"plt.semilogy(hist4.history['val_loss'])\n",
"plt.grid()\n",
"plt.legend(('train', 'validation'))\n",
"plt.title('Loss (MSE + reg)');\n",
"plt.subplot(1,3,2)\n",
"plt.semilogy(hist4.history['mse'])\n",
"plt.semilogy(hist4.history['val_mse'])\n",
"plt.grid()\n",
"plt.legend(('train', 'validation'))\n",
"plt.title('MSE');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Beware that this MSE results are on scaled data, thus lower than if on original data"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean squared error for Keras model with genre : 5.167, original MSE : 5.123\n"
]
},
{
"data": {
"image/png": "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X65pG62trcnfRERERNSODU8iIgdVbq3FmPINGDBzLcaUb0Dl1lpL13/JJZegtvbUOisqKjB69GgMHz4c990XGUHx85//HJ9++ilKSkrw0EMP4auvvsLPfvYzjB49GkVFRXj55UjuuKeeego/+tGPcOWVV2LChAmq69u7dy/OP/98TJ8+Hd/4xjcwYcIEhEIhAMAnn3yCyy+/HN/85jcxcuRI7N69W3U9RERElDnY8CQickjl1lrMemkHautDkABq60OY9dIOyxqf4XAYb775JkpKSgAA69evx65du/D+++9j27ZtqK6uxj/+8Q/85S9/QX5+Pt566y3ceeedeOCBB3DZZZdh8+bNeOutt1BWVoavvvoKAPDOO+/g6aefxoYNG1TXBwC7du3C7bffjg8//BB5eXl48cUXAQBTp07F7bffjn//+9/417/+hXPOOSfheoiIiCgzaEouRERE1qtYtxOhlnBMWagljIp1O1FaVGB4vaFQCCNGjMDevXsxatQojB8/HkCk4bl+/XoUFRUBAE6cOIFdu3bh29/+dszy69evx5o1a/Dggw8CiGTq3b9/PwBg/Pjx6NmzZ8L1nXvuuRgwYABGjBgBABg1ahT27t2L48ePo7a2FldddRWAyNyceupFRERE6YsNTyKyVOXWWlSs24mD9SHk5wVRNnGIqUZUJjtYH9JVrlV0jGdDQwMmTZqERx55BDNmzICUErNmzcKtt96acHkpJV588UUMGTIkpvy9995D9+7dY96ntL69e/ciJyen47Xf70coFIKUUnV7WupFRESMs5S+2NWWiCxjd9fRTJOfF9RVrlePHj2wePFiPPjgg2hpacHEiRPx5JNP4sSJEwCA2tpaHD58uMtyEydOxJ///OeOhuLWrVsV1691fVFnnHEGCgsLUVlZCQA4efIkGhsbda+HiMirGGcpnbHhSUSWSdR1lLoqmzgEwYA/piwY8KNs4hCVJfQrKirCN7/5TTz33HOYMGECpkyZgksuuQTDhg3DNddcg+PHj3dZ5re//S1aWlowfPhwDB06FL/97W8V1611fZ397W9/w+LFizF8+HB861vfwqFDhwyth4jIixhnKZ0Jta5PdiguLpZVVVUp2x4RpdaAmWuhdEYRAPaUX5Hq6jji448/xvnnn6/5/ewypZ3SsRVCVEspix2qUkZgbCZKH4yzlA7UYjPH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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"testX_scaled4 = np.concatenate((scalerX.transform(df_test[['Mother', 'Father']]), \n",
" genderEncoder.transform(df_test[['Gender']])), axis=1)\n",
"height_est_scaled4 = model4.predict(testX_scaled4)\n",
"\n",
"height_est4 = scalerY.inverse_transform(height_est_scaled4)\n",
"mse4 = metrics.mean_squared_error(df_test['Height'], height_est4)\n",
"\n",
"twinPlot(df_test[['Mother', 'Father']], [df_test['Height'], height_est4], ['Reference', 'Estimated'])\n",
"print(\"Mean squared error for Keras model with genre : %.3f, original MSE : %.3f\" % (mse4, mse2))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Comparison of the two gendered models\n",
"\n",
"The mode2 in which prediction is using either girl or boy regression model is equivalent as a two layer network : \n",
"1. compute the predictions using both the girl and boy regression models, weigh each of the outputs with the one hot encoded value of actual gender\n",
"2. sum the two contributions\n",
"\n",
"Using this topology, we may compare model2 and model4 in following tables.\n",
"\n",
"__NOTE:__ actual values of the coefficients will change if gradient based optimization is ran again. It comes from the fact the Keras is randomly initializing the coefficients on the neurons.\n",
"\n",
"### Stage 1 : two neurons \n",
"\n",
"\n",
"| Neuron 1 | Mother | Father | Is a girl | Is a boy | Intercept |\n",
"|----------------------------|--------|--------|-----------|----------|-----------|\n",
"| Linear regressions combined| 0.212 | 0.293 | 1.0 | 0.0 | -0.734 |\n",
"| Auto trained neural net | 0.131 | 0.193 | -0.452 | 0.684 | -0.0891 |\n",
"\n",
"| Neuron 2 | Mother | Father | Is a girl | Is a boy | Intercept |\n",
"|----------------------------|--------|--------|-----------|----------|-----------|\n",
"| Linear regressions combined| 0.230 | 0.299 | 0.0 | 1.0 | 0.715 |\n",
"| Auto trained neural net | -1.18e-04 | -6.02e-06 | 4.20e-05 | 2.83e-04 | -1.05e-02 |\n",
"\n",
"\n",
"### Stage 2 : combiner\n",
"\n",
"| Neuron 3 | In1 | In2 | Intercept |\n",
"|----------------------------|--------|--------|-----------|\n",
"| Linear regressions combined| 1 | 1 | 0.0 |\n",
"| Auto trained neural net | 1.27 | 4.77e-05 | -7.21e-02 |\n",
"\n",
"\n",
"The figures are quite different in magnitude and in sign!\n",
"\n",
"With the neural net, the 2nd neuron has very small coefficients, it acts like a correction on the estimate of the 1st neuron."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Step by step example on the first person\n",
"\n",
"#### With \"2 stage\" gendered linear regression"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Family
\n",
"
Father
\n",
"
Mother
\n",
"
Gender
\n",
"
Height
\n",
"
Kids
\n",
"
\n",
" \n",
" \n",
"
\n",
"
269
\n",
"
69
\n",
"
70.0
\n",
"
65.0
\n",
"
M
\n",
"
73.0
\n",
"
8
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Family Father Mother Gender Height Kids\n",
"269 69 70.0 65.0 M 73.0 8"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s1 = df_test.head(1)\n",
"s1"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.39927185, 0.27232284]])"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s1_scaled = scalerX.transform(s1[['Mother', 'Father']])\n",
"s1_scaled"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1st Stage outputs = -0.613 * 0, 0.867 * 1\n"
]
}
],
"source": [
"s1_encoded = genderEncoder.transform(s1[['Gender']]).reshape(-1)\n",
"p2_out1_girl = model2_girl.predict(s1_scaled).reshape(-1)[0]\n",
"p2_out1_boy = model2_boy.predict(s1_scaled).reshape(-1)[0]\n",
"print(\"1st Stage outputs = %.3f * %d, %.3f * %d\" % (p2_out1_girl, s1_encoded[0], p2_out1_boy, s1_encoded[1]))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Prediction with combined linear regressors = 69.896 inch\n"
]
}
],
"source": [
"p2_out = np.sum(np.matmul([p2_out1_girl, p2_out1_boy], s1_encoded))\n",
"# Inverse scaling\n",
"p2_out_unscaled = scalerY.inverse_transform([p2_out]).reshape(-1)[0]\n",
"print(\"Prediction with combined linear regressors = %.3f inch\" % p2_out_unscaled)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### With the 2 layer neural net"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.39927185, 0.27232284, 0. , 1. ]])"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s1_in = np.concatenate((s1_scaled, s1_encoded.reshape(1,-1)), axis=1)\n",
"s1_in"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.70041708, -0.01034441]])"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"p4_out1 = np.matmul(s1_in, weights4[0]) + weights4[1]\n",
"p4_out1"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.8189993828432794"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"p4_out2 = (np.matmul(p4_out1, weights4[2]) + weights4[3]).reshape(-1)[0]\n",
"p4_out2"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Prediction with 2 stage neural net = 69.726 inch\n"
]
}
],
"source": [
"p4_out_unscaled = scalerY.inverse_transform([p4_out2]).reshape(-1)[0]\n",
"print(\"Prediction with 2 stage neural net = %.3f inch\" % p4_out_unscaled)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Almost the same prediction is made but following rather different paths, showing that the gradient descent optimization's result is not unique."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Conclusion\n",
"\n",
"Using a little feature engineering (one hot encoding) and feature learning capabilities of the neural net, we have been able to learn a model taking into acount for the gender of the target child.\n",
"\n",
"This simple example is extended in the large classification frameworks like AlexNet, VGG or GoogLeNet: they are able to combine features extracted from images to eventually classify objects and animals.\n",
"\n",
"The drawbacks are :\n",
"- More complex models : the provided model has 2 layers and 13 parameters, whereas the manually engineered model has 2*3=6 parameters\n",
"- Complex and tricky optimizations : the gradient descent on multi-layer neural networks requires attention and skills to get a repeatable and generalizable results\n",
"\n",
"### Where to go from here :\n",
"\n",
"Compare with the [two feature binary classification using logistic regression using Keras](../classification/ClassificationContinuous2Features-Keras.html) ([Notebook](../classification/ClassificationContinuous2Features-Keras.ipynb]))\n",
"\n",
"[Multi-class classification with Keras](../classification/ClassificationMulti2Features-Keras.html) ([Notebook](../classification/ClassificationMulti2Features-Keras.ipynb))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}