From 6d6da8b5744caafa2557ec9105ebaf9f98a535e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9F=A9=E9=9F=AC?= Date: Tue, 11 Jun 2019 15:25:02 +0100 Subject: [PATCH 01/13] conflict --- notebook/static/notebook/less/renderedhtml.less | 2 +- notebook/templates/notebook.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/notebook/static/notebook/less/renderedhtml.less b/notebook/static/notebook/less/renderedhtml.less index e254c8d067..5ad967dc4a 100644 --- a/notebook/static/notebook/less/renderedhtml.less +++ b/notebook/static/notebook/less/renderedhtml.less @@ -58,7 +58,7 @@ //issue #4010 change from #eff01f to #d4d4d4 code { - background-color: #d4d4d4; + background-color: #757474; } p code { diff --git a/notebook/templates/notebook.html b/notebook/templates/notebook.html index e4c3b912a6..3e79de781f 100644 --- a/notebook/templates/notebook.html +++ b/notebook/templates/notebook.html @@ -77,7 +77,7 @@ @@ -100,7 +100,7 @@
- -
+ +
From 49eb0e8ce30fc96098b227d3baeadd91f53c2c3b Mon Sep 17 00:00:00 2001 From: Tao HAN <45403704+taohan16@users.noreply.github.com> Date: Thu, 20 Jun 2019 17:00:51 +0100 Subject: [PATCH 10/13] Update package.json --- package.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/package.json b/package.json index 3c5f1c7b89..a8ffdab592 100644 --- a/package.json +++ b/package.json @@ -18,11 +18,4 @@ "less": "~2", "requirejs": "^2.1.17", "po2json": "^0.4.5" - }, -<<<<<<< HEAD - "dependencies": { } -======= - "dependencies": {} ->>>>>>> d7cf9b75341d784870e6f8ad42c88a518214577e -} From afa10070ce55eecbd56fcf9a0a532c5839226702 Mon Sep 17 00:00:00 2001 From: Joshua Zeltser Date: Thu, 20 Jun 2019 17:01:21 +0100 Subject: [PATCH 11/13] Delete settings.json --- .vscode/settings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 2f6ec8443f..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "python.pythonPath": "/usr/local/Cellar/python/3.7.3/bin/python3" -} \ No newline at end of file From cbafd54b9299374dbba6e63752b50a9d399e16be Mon Sep 17 00:00:00 2001 From: Joshua Zeltser Date: Thu, 20 Jun 2019 17:01:33 +0100 Subject: [PATCH 12/13] Delete Create and Deploy an Azure ML Web Service.ipynb --- ...e and Deploy an Azure ML Web Service.ipynb | 546 ------------------ 1 file changed, 546 deletions(-) delete mode 100644 Create and Deploy an Azure ML Web Service.ipynb diff --git a/Create and Deploy an Azure ML Web Service.ipynb b/Create and Deploy an Azure ML Web Service.ipynb deleted file mode 100644 index bce3245e32..0000000000 --- a/Create and Deploy an Azure ML Web Service.ipynb +++ /dev/null @@ -1,546 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# # Create and deploy an Azure Machine Learning web service\n", - "\n", - "Although web services can be created directly within [Azure ML Studio](https://studio.azureml.net), in some cases it may be more straightforward to develop and deploy a web service entirely within a Python notebook. Python notebooks allow rapid prototyping and allow developers to include commentary in Markdown. This tutorial demonstrates how the [`azureml`](https://github.com/Azure/Azure-MachineLearning-ClientLibrary-Python) package can be used to deploy Azure ML web services directly from within a Python notebook (or other Python environment).\n", - "\n", - "> **Note**: the `azureml` package presently works only with Python 2; be sure to set the notebook's kernel appropriately.\n", - "\n", - "In this notebook:\n", - "- [Prerequisites](#Prerequisites)\n", - " - [Credentials needed to connect to your workspace](#Credentials-needed-to-connect-to-your-workspace)\n", - "- [Explore beaver fever](#explore-beaver-fever)\n", - " - [Loading and exploring the dataset](#Loading-and-exploring-the-dataset)\n", - " - [Transferring data to and from Azure ML Studio](#Transferring-data-to-and-from-Azure-ML-Studio)\n", - "- [Creating the predictive model](#Creating-the-predictive-model)\n", - "- [Deploying the model as a web service](#Deploying-the-model-as-a-web-service)\n", - "- [Consuming the web service](#Consuming-the-web-service)\n", - "\n", - "Refer to the [azureml GitHub repository](https://github.com/Azure/Azure-MachineLearning-ClientLibrary-Python) for more information on its capabilities.\n", - "\n", - "## Prerequisites\n", - "\n", - "This walkthrough assumes that you're familiar with Python and [Azure ML Studio](https://studio.azureml.net). You also need a workspace in Azure ML Studio and its credentials, which is described in the next section.\n", - "\n", - "Your environment also requires the `azureml` package, which is installed by default with Azure Notebooks.\n", - "\n", - "### Create and connect to an Azure ML Studio workspace\n", - "\n", - "The `azureml` package uses your workspace ID and authorization token to connect to the workspace, provide that you're the owner of the workspace (authorized users who are not owners need to ask an owner for these details):\n", - "\n", - "1. Open [Azure ML Studio](https://studio.azureml.net) in a browser and sign in with a Microsoft Account. Azure ML Studio is free and doesn't require an Azure subscription. Once signed in, you're in your \"workspace.\"\n", - "\n", - "1. Select the **Settings** button on the left pane:\n", - "\n", - " ![Settings button](https://github.com/Microsoft/AzureNotebooks/blob/master/Samples/images/azure-ml-studio-settings.png?raw=true)

\n", - "\n", - "1. On the **Name** tab, the **Workspace ID** field contains your workspace ID. Copy that ID into the `workspace_id` value in the code cell that follows.\n", - "\n", - " ![Location of workspace ID](https://github.com/Microsoft/AzureNotebooks/blob/master/Samples/images/azure-ml-studio-workspace-id.png?raw=true)

\n", - "\n", - "1. Select the **Authorization Tokens** tab and copy either token into the `authorization_token` value in the code cell that follows.\n", - "\n", - " ![Location of authorization token](https://github.com/Microsoft/AzureNotebooks/blob/master/Samples/images/azure-ml-studio-tokens.png?raw=true)

\n", - "\n", - "1. Run the code cell; if it runs without error, you're ready to continue." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - " " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml import Workspace\n", - "\n", - "# Replace the values with those from your own Azure ML Studio instance; see Prerequisites\n", - "# The workspace_id is a string of hexadecimal characters; the toke is a long string of random characters.\n", - "workspace_id = 'your_workspace_id'\n", - "authorization_token = 'your_auth_token'\n", - "\n", - "ws = Workspace(workspace_id, authorization_token)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Explore beaver fever\n", - "\n", - "Reynolds (1994) collected data on the body temperatures of female beavers living in Wisconsin. We use this dataset to train a decision tree model which predicts a beaver's body temperature. Then we create a web service based on this model that can be used to predict body temperatures for other beavers.\n", - "\n", - "> P. S. Reynolds (1994). \"Time-series analyses of beaver body temperatures.\" Chapter 11 of Lange, N., Ryan, L., Billard, L., Brillinger, D., Conquest, L. and Greenhouse, J. eds (1994) *Case Studies in Biometry*. New York: John Wiley and Sons.\n", - "\n", - "## Loading and exploring the dataset\n", - "\n", - "Our dataset contains the following features:\n", - "\n", - "- `time`: The time of day on which the recording was made\n", - "- `activ`: Binary indicator of whether activity is occurring outside of the beaver lodge\n", - "- `beaver`: The beaver being measured\n", - "- `temp`: The recorded body temperature" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Install the dataset\n", - "!pip install pydataset --disable-pip-version-check -q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Load the dataset and plot each of these features on the same axes to see whether any patterns may be present:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "from pydataset import data\n", - "\n", - "df = data('beav1')\n", - "df['beaver'] = 1\n", - "df = pd.concat([df, data('beav2')], sort=True)\n", - "df.loc[df['beaver'].isnull(), 'beaver'] = 2\n", - "df.drop('day', 1, inplace=True)\n", - "\n", - "%matplotlib inline\n", - "from ggplot import *\n", - "ggplot(aes(x='time', y='temp', color='beaver'), data=df) + geom_point()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting the data reveals some conspicuous patterns. Beavers tend to be warmer when there is activity nearby, which tends to be in the afternoon and evening hours:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ggplot(aes(x='time', y='temp', color='activ'), data=df) + geom_point()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It also appears that all else being equal, Beaver 2 is warmer than Beaver 1.\n", - "\n", - "Notice that some trends seem to apply to a subset of the data. For example, if the measurement is from Beaver 2 *and* the beaver was active, then the body temperature is likely to be above 37.5; otherwise, the temperature is likely below 37.5. When trends apply to observation subsets that can be clearly defined using thresholding, decision tree models are good candidates. We therefore implement a decision tree model in the next section of the tutorial.\n", - "\n", - "### Transferring data to and from Azure ML Studio\n", - "\n", - "In this section, you create a predictive model entirely in Azure Notebooks. (You can also use the `azureml` Python program to transfer the data over to Azure ML Studio to create your model there.)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# This code is repeated from the Prerequisites section\n", - "\n", - "from azureml import Workspace\n", - "\n", - "# Replace the values with those from your own Azure ML Studio instance; see Prerequisites\n", - "# The workspace_id is a string of hexadecimal characters; the toke is a long string of random characters.\n", - "workspace_id = 'your_workspace_id'\n", - "authorization_token = 'your_auth_token'\n", - "\n", - "ws = Workspace(workspace_id, authorization_token)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml import DataTypeIds\n", - "\n", - "dataset = ws.datasets.add_from_dataframe(\n", - " dataframe=df,\n", - " data_type_id=DataTypeIds.GenericCSV,\n", - " name='Beaver Body Temperature Data',\n", - " description='From Reynolds 1994 via pydataset'\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After running the code above, you can see the dataset listed in the **Datasets** section of the workspace (you may need to refresh the page):\n", - "\n", - "![Dataset shown in Azure ML Studio](https://github.com/Microsoft/AzureNotebooks/blob/master/Samples/images/azure-ml-studio-dataset.png?raw=true)
\n", - "\n", - "It is also straightforward to list the datasets available in the workspace and transfer datasets from the workspace to the notebook:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Beaver Body Temperature Data\n" - ] - } - ], - "source": [ - "print('\\n'.join([i.name for i in ws.datasets if not i.is_example])) # only list user-created datasets" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Beaver Body Temperature Data\n", - "From Reynolds 1994 via pydataset\n", - "abe2e90f1544425999981e5e637982ea\n", - "GenericCSV\n", - "2018-11-27 17:18:36.802000\n", - "3579\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
activbeavertemptime
001.036.33840
101.036.34850
201.036.35900
301.036.42910
401.036.55920
\n", - "
" - ], - "text/plain": [ - " activ beaver temp time\n", - "0 0 1.0 36.33 840\n", - "1 0 1.0 36.34 850\n", - "2 0 1.0 36.35 900\n", - "3 0 1.0 36.42 910\n", - "4 0 1.0 36.55 920" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Read some more of the metadata\n", - "ds = ws.datasets['Beaver Body Temperature Data']\n", - "print(ds.name)\n", - "print(ds.description)\n", - "print(ds.family_id)\n", - "print(ds.data_type_id)\n", - "print(ds.created_date)\n", - "print(ds.size)\n", - "\n", - "# Read the contents\n", - "df2 = ds.to_dataframe()\n", - "df2.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Creating the predictive model\n", - "\n", - "To assess overfitting, train your decision tree using only a subset of the available data. You can then assess performance using the withheld observation. Below, `sklearn`'s `train_test_split()` function is used to select 70% of the data points for training and 30% for validation." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import train_test_split\n", - "\n", - "X_train, X_test, y_train, y_test = train_test_split(\n", - " df[['activ', 'beaver', 'time']],\n", - " df['temp'],\n", - " test_size=0.3,\n", - " random_state=42\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Fit `scikit-learn`'s `DecisionTreeRegressor` model using the training data, then make predictions about the withheld body temperature measurements:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "R^2 for true vs. predicted test set temperature measurements: 0.94\n" - ] - } - ], - "source": [ - "from sklearn.tree import DecisionTreeRegressor\n", - "from sklearn.metrics import r2_score\n", - "\n", - "regressor = DecisionTreeRegressor(random_state=42)\n", - "regressor.fit(X_train, y_train)\n", - "y_test_predictions = regressor.predict(X_test)\n", - "print('R^2 for true vs. predicted test set temperature measurements: {:0.2f}'.format(r2_score(y_test, y_test_predictions)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It seems like this is a reasonably accurate model!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Deploying the model as a web service\n", - "\n", - "To deploy your model as a predictive web service, create a wrapper function that takes input data as an argument and calls `predict()` with your trained model and this input data, returning the results." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml import services\n", - "\n", - "@services.publish(workspace_id, authorization_token)\n", - "@services.types(activ=int, beaver=float, time=int)\n", - "@services.returns(float)\n", - "\n", - "# The name of your web service is set to this function's name\n", - "def beaver_body_temp_predictor(activ, beaver, time):\n", - " return regressor.predict([activ, beaver, time])\n", - "\n", - "# Hold onto information about your web service so you can call it within the notebook later\n", - "service_url = beaver_body_temp_predictor.service.url \n", - "api_key = beaver_body_temp_predictor.service.api_key\n", - "help_url = beaver_body_temp_predictor.service.help_url\n", - "service_id = beaver_body_temp_predictor.service.service_id" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Consuming the web service\n", - "\n", - "While you are in the notebook session in which the web service was created, you can call the predictor directly:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "36.78" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - " beaver_body_temp_predictor.service(0, 1, 1200)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At any later time, you can use the stored API key and service URL to call the service:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# import urllib2\n", - "import json\n", - "\n", - "data = {\"Inputs\": { \n", - " \"input1\": {\n", - " \"ColumnNames\": [ \"beaver\", \"activ\", \"time\"],\n", - " \"Values\": [[\"1\", \"0\", \"1200\"]] \n", - " }\n", - " }, # specified feature values\n", - " \n", - " \"GlobalParameters\": {}\n", - " }\n", - "\n", - "body = json.dumps(data)\n", - "headers = {'Content-Type':'application/json', 'Authorization':('Bearer '+ api_key)}\n", - "req = urllib2.Request(service_url, body, headers) \n", - "\n", - "try:\n", - " response = urllib2.urlopen(req)\n", - " result = json.loads(response.read()) # load json-formatted string response as dictionary\n", - " print(result['Results']['output1']['value']['Values'][0][0]) # get the returned prediction\n", - " \n", - "except urllib2.HTTPError, error:\n", - " print(\"The request failed with status code: \" + str(error.code))\n", - " print(error.info())\n", - " print(json.loads(error.read())) " - ] - } - ], - "metadata": { - "celltoolbar": "Attachments", - "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.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} From 3d89a8ec69b1ad2cd6c1b031fbef4ce71dc37c43 Mon Sep 17 00:00:00 2001 From: Joshua Zeltser Date: Thu, 20 Jun 2019 17:05:55 +0100 Subject: [PATCH 13/13] Update package.json --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index a8ffdab592..062978e8a7 100644 --- a/package.json +++ b/package.json @@ -18,4 +18,6 @@ "less": "~2", "requirejs": "^2.1.17", "po2json": "^0.4.5" - } + }, + "dependencies": {} +}