{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Encoding causal structure" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Imagine having a process with some causal structure\n", "\n", "The causal structure we assume simply encodes that\n", " - y1 depends on settings x1 and x2\n", " - y2 depends on settings x2 and x3" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import halerium.core as hal\n", "from halerium.core.regression import connect_via_regression\n", "\n", "g = hal.Graph(\"g\")\n", "with g:\n", " hal.Entity(\"settings\")\n", " with settings:\n", " hal.Variable(\"x1\", mean=0., variance=1.)\n", " hal.Variable(\"x2\", mean=0., variance=1.)\n", " hal.Variable(\"x3\", mean=0., variance=1.)\n", " \n", " hal.Graph(\"substructure1\")\n", " with substructure1:\n", " with inputs:\n", " hal.Entity(\"settings\")\n", " with settings:\n", " hal.Variable(\"x1\")\n", " hal.Variable(\"x2\")\n", " \n", " with outputs:\n", " hal.Entity(\"results\")\n", " with results:\n", " hal.Variable(\"y1\", variance=0.1)\n", " \n", " connect_via_regression(name_prefix=\"reg\",\n", " inputs=[inputs.settings.x1, inputs.settings.x2],\n", " outputs=[outputs.results.y1])\n", " \n", " hal.Graph(\"substructure2\")\n", " with substructure2:\n", " with inputs:\n", " hal.Entity(\"settings\")\n", " with settings:\n", " hal.Variable(\"x2\")\n", " hal.Variable(\"x3\")\n", " \n", " with outputs:\n", " hal.Entity(\"results\")\n", " with results:\n", " hal.Variable(\"y2\", variance=0.1)\n", " \n", " connect_via_regression(name_prefix=\"reg\",\n", " inputs=[inputs.settings.x2, inputs.settings.x3],\n", " outputs=[outputs.results.y2])\n", " \n", " hal.link(settings, substructure1.inputs.settings)\n", " hal.link(settings, substructure2.inputs.settings)\n", "\n", "# use the hal.show function to display the graph in the online platform\n", "#hal.show(g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Let us generate artificial data to test this.\n", "\n", "The important thing is that the settings in the past were not chosen randomly,\n", "but they were managed in some manner that did not have a machine learning\n", "use case in mind." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### generate training data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "real_matrix1 = np.array([1., -1])\n", "real_intercept1 = 0.\n", "real_matrix2 = np.array([-1, 1.])\n", "real_intercept2 = 0.\n", "\n", "past_settings = [[-1., -1., -1.]]*10\n", "past_settings += [[0., -1., 0.]]*10\n", "past_settings += [[1., 1., 1.]]*10\n", "past_settings = np.array(past_settings)\n", "\n", "past_results = hal.get_generative_model(g, data={g.settings.x1: past_settings[:, 0],\n", " g.settings.x2: past_settings[:, 1],\n", " g.settings.x3: past_settings[:, 2],\n", " g.substructure1.reg_y1.location.slope: real_matrix1,\n", " g.substructure1.reg_y1.location.intercept: real_intercept1,\n", " g.substructure2.reg_y2.location.slope: real_matrix2,\n", " g.substructure2.reg_y2.location.intercept: real_intercept2}).get_samples(\n", " [g.substructure1.outputs.results.y1, g.substructure2.outputs.results.y2])\n", "past_results = np.array(past_results)[:, 0, :].T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### generate test data" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "future_settings = ([[-1., 0., 0.]]*10 +\n", " [[0.5, 0.5, -1.]]*10)\n", "future_settings = np.array(future_settings)\n", "\n", "future_results = hal.get_generative_model(g, data={g.settings.x1: future_settings[:, 0],\n", " g.settings.x2: future_settings[:, 1],\n", " g.settings.x3: future_settings[:, 2],\n", " g.substructure1.reg_y1.location.slope: real_matrix1,\n", " g.substructure1.reg_y1.location.intercept: real_intercept1,\n", " g.substructure2.reg_y2.location.slope: real_matrix2,\n", " g.substructure2.reg_y2.location.intercept: real_intercept2}).get_samples(\n", " [g.substructure1.outputs.results.y1, g.substructure2.outputs.results.y2])\n", "future_results = np.array(future_results)[:, 0, :].T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### train a black box model and apply it on test data" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import LinearRegression\n", "lr = LinearRegression()\n", "lr.fit(past_settings, past_results)\n", "black_box_prediction_past = lr.predict(past_settings)\n", "black_box_prediction_future = lr.predict(future_settings)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### train the causal model and apply it on test data" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "causal_model = hal.get_posterior_model(g, data={g.settings.x1: past_settings[:, 0],\n", " g.settings.x2: past_settings[:, 1],\n", " g.settings.x3: past_settings[:, 2],\n", " g.substructure1.outputs.results.y1: past_results[:, 0],\n", " g.substructure2.outputs.results.y2: past_results[:, 1]})\n", "trained_causal_graph = causal_model.get_posterior_graph()\n", "\n", "causal_prediction_past = hal.get_generative_model(\n", " trained_causal_graph,\n", " data={g.settings.x1: past_settings[:, 0],\n", " g.settings.x2: past_settings[:, 1],\n", " g.settings.x3: past_settings[:, 2]}).get_means(\n", " [g.substructure1.outputs.results.y1, g.substructure2.outputs.results.y2])\n", "causal_prediction_past = np.array(causal_prediction_past).T\n", "\n", "causal_prediction_future = hal.get_generative_model(\n", " trained_causal_graph,\n", " data={g.settings.x1: future_settings[:, 0],\n", " g.settings.x2: future_settings[:, 1],\n", " g.settings.x3: future_settings[:, 2]}).get_means(\n", " [g.substructure1.outputs.results.y1, g.substructure2.outputs.results.y2])\n", "causal_prediction_future = np.array(causal_prediction_future).T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Compare the performance" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "black box on training data: 0.8700155151258816\n", "causal model on training data: 0.8646083422454567\n", "black box on test data: 0.0830037653624115\n", "causal box on test data: 0.8269131649522296\n" ] } ], "source": [ "norm = np.var(np.append(past_results, future_results))\n", "black_box_performance_past = 1-np.mean((black_box_prediction_past-past_results)**2) / norm\n", "causal_performance_past = 1-np.mean((causal_prediction_past-past_results)**2) / norm\n", "\n", "black_box_performance_future = 1-np.mean((black_box_prediction_future-future_results)**2) / norm\n", "causal_performance_future = 1-np.mean((causal_prediction_future-future_results)**2) / norm\n", "\n", "print(\"black box on training data:\", black_box_performance_past)\n", "print(\"causal model on training data:\", causal_performance_past)\n", "print(\"black box on test data:\", black_box_performance_future)\n", "print(\"causal box on test data:\", causal_performance_future)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### visualization" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from plots import plot_compare_causal_and_black_box\n", "from IPython.display import Image\n", "\n", "Image(plot_compare_causal_and_black_box(black_box_performance_past,\n", " black_box_performance_future,\n", " causal_performance_past,\n", " causal_performance_future))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.9" } }, "nbformat": 4, "nbformat_minor": 4 }