├── .gitignore ├── LICENSE ├── aml_config ├── conda_dependencies.yml ├── docker-python.runconfig ├── docker-spark.runconfig ├── docker.compute ├── local.compute ├── local.runconfig └── spark_dependencies.yml ├── docs └── iris.png ├── iris.csv ├── iris.dprep ├── iris.dprep.user ├── iris.dsource ├── iris.dsource.user ├── iris.ipynb ├── iris_sklearn.py ├── iris_sklearn_shared_folder.py ├── iris_spark.py ├── plot_graphs.py ├── readme.md ├── run.py └── score_iris.py /.gitignore: -------------------------------------------------------------------------------- 1 | .azuremlhistory_git 2 | .ipynb_checkpoints 3 | azureml-logs 4 | __pycache__ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /aml_config/conda_dependencies.yml: -------------------------------------------------------------------------------- 1 | # Conda environment specification. The dependencies defined in this file will be 2 | # automatically provisioned for runs against docker, VM, and HDI cluster targets. 3 | 4 | # Details about the Conda environment file format: 5 | # https://conda.io/docs/using/envs.html#create-environment-file-by-hand 6 | 7 | # For Spark packages and configuration, see spark_dependencies.yml. 8 | 9 | name: project_environment 10 | dependencies: 11 | - python=3.5.2 12 | - scikit-learn 13 | - pip: 14 | - notebook 15 | - matplotlib 16 | 17 | # The API for Azure Machine Learning Model Management Service. 18 | - azure-ml-api-sdk==0.1.0a11 19 | 20 | # Library for collecting data from operationalized models 21 | - azureml-model-management-sdk==1.0.1b6 22 | -------------------------------------------------------------------------------- /aml_config/docker-python.runconfig: -------------------------------------------------------------------------------- 1 | ArgumentVector: 2 | - "$file" 3 | Target: "docker" 4 | EnvironmentVariables: 5 | "EXAMPLE_ENV_VAR": "Example Value" 6 | Framework: "Python" 7 | CondaDependenciesFile: "aml_config/conda_dependencies.yml" 8 | SparkDependenciesFile: "aml_config/spark_dependencies.yml" 9 | PrepareEnvironment: true 10 | TrackedRun: true 11 | -------------------------------------------------------------------------------- /aml_config/docker-spark.runconfig: -------------------------------------------------------------------------------- 1 | ArgumentVector: 2 | - "$file" 3 | Target: "docker" 4 | EnvironmentVariables: 5 | "EXAMPLE_ENV_VAR": "Example Value" 6 | Framework: "PySpark" 7 | CondaDependenciesFile: "aml_config/conda_dependencies.yml" 8 | SparkDependenciesFile: "aml_config/spark_dependencies.yml" 9 | PrepareEnvironment: true 10 | TrackedRun: true 11 | -------------------------------------------------------------------------------- /aml_config/docker.compute: -------------------------------------------------------------------------------- 1 | type: "localdocker" 2 | baseDockerImage: "microsoft/mmlspark:plus-0.9.9" 3 | #nativeSharedDirectory: "~/.azureml/share/" 4 | #sharedVolumes: true 5 | -------------------------------------------------------------------------------- /aml_config/local.compute: -------------------------------------------------------------------------------- 1 | type: "local" 2 | pythonLocation: "python" 3 | sparkSubmitLocation: "spark-submit" 4 | nativeSharedDirectory: "~/.azureml/share/" -------------------------------------------------------------------------------- /aml_config/local.runconfig: -------------------------------------------------------------------------------- 1 | ArgumentVector: 2 | - "$file" 3 | Target: "local" 4 | EnvironmentVariables: 5 | "EXAMPLE_ENV_VAR": "Example Value" 6 | Framework: "Python" 7 | CondaDependenciesFile: "aml_config/conda_dependencies.yml" 8 | SparkDependenciesFile: "aml_config/spark_dependencies.yml" 9 | PrepareEnvironment: true 10 | TrackedRun: true 11 | -------------------------------------------------------------------------------- /aml_config/spark_dependencies.yml: -------------------------------------------------------------------------------- 1 | # Spark configuration and packages specification. The dependencies defined in 2 | # this file will be automatically provisioned for each run that uses Spark. 3 | 4 | # For third-party python libraries, see conda_dependencies.yml. 5 | configuration: 6 | "spark.app.name": "Classifying Iris" 7 | "spark.yarn.maxAppAttempts": 1 8 | repositories: 9 | - "https://mmlspark.azureedge.net/maven" 10 | packages: 11 | # Microsoft Machine Learning for Apache Spark provides a number of deep 12 | # learning and data science tools, including seamless integration of Spark 13 | # Machine Learning pipelines with Microsoft Cognitive Toolkit (CNTK) and 14 | # OpenCV, enabling you to quickly create powerful, highly-scalable 15 | # predictive and analytical models for large image and text datasets. 16 | # Details: https://github.com/Azure/mmlspark 17 | - group: "com.microsoft.ml.spark" 18 | artifact: "mmlspark_2.11" 19 | version: "0.7.91" 20 | 21 | # Required for SQL Server data sources. 22 | - group: "com.microsoft.sqlserver" 23 | artifact: "mssql-jdbc" 24 | version: "6.2.1.jre8" 25 | -------------------------------------------------------------------------------- /docs/iris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/MachineLearningSamples-Iris/efcb8e34c2d7c6038c831d17aa8f771d7faf4470/docs/iris.png -------------------------------------------------------------------------------- /iris.csv: -------------------------------------------------------------------------------- 1 | 5.1,3.5,1.4,0.2,Iris-setosa 2 | 4.9,3.0,1.4,0.2,Iris-setosa 3 | 4.7,3.2,1.3,0.2,Iris-setosa 4 | 4.6,3.1,1.5,0.2,Iris-setosa 5 | 5.0,3.6,1.4,0.2,Iris-setosa 6 | 5.4,3.9,1.7,0.4,Iris-setosa 7 | 4.6,3.4,1.4,0.3,Iris-setosa 8 | 5.0,3.4,1.5,0.2,Iris-setosa 9 | 4.4,2.9,1.4,0.2,Iris-setosa 10 | 4.9,3.1,1.5,0.1,Iris-setosa 11 | 5.4,3.7,1.5,0.2,Iris-setosa 12 | 4.8,3.4,1.6,0.2,Iris-setosa 13 | 4.8,3.0,1.4,0.1,Iris-setosa 14 | 4.3,3.0,1.1,0.1,Iris-setosa 15 | 5.8,4.0,1.2,0.2,Iris-setosa 16 | 5.7,4.4,1.5,0.4,Iris-setosa 17 | 5.4,3.9,1.3,0.4,Iris-setosa 18 | 5.1,3.5,1.4,0.3,Iris-setosa 19 | 5.7,3.8,1.7,0.3,Iris-setosa 20 | 5.1,3.8,1.5,0.3,Iris-setosa 21 | 5.4,3.4,1.7,0.2,Iris-setosa 22 | 5.1,3.7,1.5,0.4,Iris-setosa 23 | 4.6,3.6,1.0,0.2,Iris-setosa 24 | 5.1,3.3,1.7,0.5,Iris-setosa 25 | 4.8,3.4,1.9,0.2,Iris-setosa 26 | 5.0,3.0,1.6,0.2,Iris-setosa 27 | 5.0,3.4,1.6,0.4,Iris-setosa 28 | 5.2,3.5,1.5,0.2,Iris-setosa 29 | 5.2,3.4,1.4,0.2,Iris-setosa 30 | 4.7,3.2,1.6,0.2,Iris-setosa 31 | 4.8,3.1,1.6,0.2,Iris-setosa 32 | 5.4,3.4,1.5,0.4,Iris-setosa 33 | 5.2,4.1,1.5,0.1,Iris-setosa 34 | 5.5,4.2,1.4,0.2,Iris-setosa 35 | 4.9,3.1,1.5,0.1,Iris-setosa 36 | 5.0,3.2,1.2,0.2,Iris-setosa 37 | 5.5,3.5,1.3,0.2,Iris-setosa 38 | 4.9,3.1,1.5,0.1,Iris-setosa 39 | 4.4,3.0,1.3,0.2,Iris-setosa 40 | 5.1,3.4,1.5,0.2,Iris-setosa 41 | 5.0,3.5,1.3,0.3,Iris-setosa 42 | 4.5,2.3,1.3,0.3,Iris-setosa 43 | 4.4,3.2,1.3,0.2,Iris-setosa 44 | 5.0,3.5,1.6,0.6,Iris-setosa 45 | 5.1,3.8,1.9,0.4,Iris-setosa 46 | 4.8,3.0,1.4,0.3,Iris-setosa 47 | 5.1,3.8,1.6,0.2,Iris-setosa 48 | 4.6,3.2,1.4,0.2,Iris-setosa 49 | 5.3,3.7,1.5,0.2,Iris-setosa 50 | 5.0,3.3,1.4,0.2,Iris-setosa 51 | 7.0,3.2,4.7,1.4,Iris-versicolor 52 | 6.4,3.2,4.5,1.5,Iris-versicolor 53 | 6.9,3.1,4.9,1.5,Iris-versicolor 54 | 5.5,2.3,4.0,1.3,Iris-versicolor 55 | 6.5,2.8,4.6,1.5,Iris-versicolor 56 | 5.7,2.8,4.5,1.3,Iris-versicolor 57 | 6.3,3.3,4.7,1.6,Iris-versicolor 58 | 4.9,2.4,3.3,1.0,Iris-versicolor 59 | 6.6,2.9,4.6,1.3,Iris-versicolor 60 | 5.2,2.7,3.9,1.4,Iris-versicolor 61 | 5.0,2.0,3.5,1.0,Iris-versicolor 62 | 5.9,3.0,4.2,1.5,Iris-versicolor 63 | 6.0,2.2,4.0,1.0,Iris-versicolor 64 | 6.1,2.9,4.7,1.4,Iris-versicolor 65 | 5.6,2.9,3.6,1.3,Iris-versicolor 66 | 6.7,3.1,4.4,1.4,Iris-versicolor 67 | 5.6,3.0,4.5,1.5,Iris-versicolor 68 | 5.8,2.7,4.1,1.0,Iris-versicolor 69 | 6.2,2.2,4.5,1.5,Iris-versicolor 70 | 5.6,2.5,3.9,1.1,Iris-versicolor 71 | 5.9,3.2,4.8,1.8,Iris-versicolor 72 | 6.1,2.8,4.0,1.3,Iris-versicolor 73 | 6.3,2.5,4.9,1.5,Iris-versicolor 74 | 6.1,2.8,4.7,1.2,Iris-versicolor 75 | 6.4,2.9,4.3,1.3,Iris-versicolor 76 | 6.6,3.0,4.4,1.4,Iris-versicolor 77 | 6.8,2.8,4.8,1.4,Iris-versicolor 78 | 6.7,3.0,5.0,1.7,Iris-versicolor 79 | 6.0,2.9,4.5,1.5,Iris-versicolor 80 | 5.7,2.6,3.5,1.0,Iris-versicolor 81 | 5.5,2.4,3.8,1.1,Iris-versicolor 82 | 5.5,2.4,3.7,1.0,Iris-versicolor 83 | 5.8,2.7,3.9,1.2,Iris-versicolor 84 | 6.0,2.7,5.1,1.6,Iris-versicolor 85 | 5.4,3.0,4.5,1.5,Iris-versicolor 86 | 6.0,3.4,4.5,1.6,Iris-versicolor 87 | 6.7,3.1,4.7,1.5,Iris-versicolor 88 | 6.3,2.3,4.4,1.3,Iris-versicolor 89 | 5.6,3.0,4.1,1.3,Iris-versicolor 90 | 5.5,2.5,4.0,1.3,Iris-versicolor 91 | 5.5,2.6,4.4,1.2,Iris-versicolor 92 | 6.1,3.0,4.6,1.4,Iris-versicolor 93 | 5.8,2.6,4.0,1.2,Iris-versicolor 94 | 5.0,2.3,3.3,1.0,Iris-versicolor 95 | 5.6,2.7,4.2,1.3,Iris-versicolor 96 | 5.7,3.0,4.2,1.2,Iris-versicolor 97 | 5.7,2.9,4.2,1.3,Iris-versicolor 98 | 6.2,2.9,4.3,1.3,Iris-versicolor 99 | 5.1,2.5,3.0,1.1,Iris-versicolor 100 | 5.7,2.8,4.1,1.3,Iris-versicolor 101 | 6.3,3.3,6.0,2.5,Iris-virginica 102 | 5.8,2.7,5.1,1.9,Iris-virginica 103 | 7.1,3.0,5.9,2.1,Iris-virginica 104 | 6.3,2.9,5.6,1.8,Iris-virginica 105 | 6.5,3.0,5.8,2.2,Iris-virginica 106 | 7.6,3.0,6.6,2.1,Iris-virginica 107 | 4.9,2.5,4.5,1.7,Iris-virginica 108 | 7.3,2.9,6.3,1.8,Iris-virginica 109 | 6.7,2.5,5.8,1.8,Iris-virginica 110 | 7.2,3.6,6.1,2.5,Iris-virginica 111 | 6.5,3.2,5.1,2.0,Iris-virginica 112 | 6.4,2.7,5.3,1.9,Iris-virginica 113 | 6.8,3.0,5.5,2.1,Iris-virginica 114 | 5.7,2.5,5.0,2.0,Iris-virginica 115 | 5.8,2.8,5.1,2.4,Iris-virginica 116 | 6.4,3.2,5.3,2.3,Iris-virginica 117 | 6.5,3.0,5.5,1.8,Iris-virginica 118 | 7.7,3.8,6.7,2.2,Iris-virginica 119 | 7.7,2.6,6.9,2.3,Iris-virginica 120 | 6.0,2.2,5.0,1.5,Iris-virginica 121 | 6.9,3.2,5.7,2.3,Iris-virginica 122 | 5.6,2.8,4.9,2.0,Iris-virginica 123 | 7.7,2.8,6.7,2.0,Iris-virginica 124 | 6.3,2.7,4.9,1.8,Iris-virginica 125 | 6.7,3.3,5.7,2.1,Iris-virginica 126 | 7.2,3.2,6.0,1.8,Iris-virginica 127 | 6.2,2.8,4.8,1.8,Iris-virginica 128 | 6.1,3.0,4.9,1.8,Iris-virginica 129 | 6.4,2.8,5.6,2.1,Iris-virginica 130 | 7.2,3.0,5.8,1.6,Iris-virginica 131 | 7.4,2.8,6.1,1.9,Iris-virginica 132 | 7.9,3.8,6.4,2.0,Iris-virginica 133 | 6.4,2.8,5.6,2.2,Iris-virginica 134 | 6.3,2.8,5.1,1.5,Iris-virginica 135 | 6.1,2.6,5.6,1.4,Iris-virginica 136 | 7.7,3.0,6.1,2.3,Iris-virginica 137 | 6.3,3.4,5.6,2.4,Iris-virginica 138 | 6.4,3.1,5.5,1.8,Iris-virginica 139 | 6.0,3.0,4.8,1.8,Iris-virginica 140 | 6.9,3.1,5.4,2.1,Iris-virginica 141 | 6.7,3.1,5.6,2.4,Iris-virginica 142 | 6.9,3.1,5.1,2.3,Iris-virginica 143 | 5.8,2.7,5.1,1.9,Iris-virginica 144 | 6.8,3.2,5.9,2.3,Iris-virginica 145 | 6.7,3.3,5.7,2.5,Iris-virginica 146 | 6.7,3.0,5.2,2.3,Iris-virginica 147 | 6.3,2.5,5.0,1.9,Iris-virginica 148 | 6.5,3.0,5.2,2.0,Iris-virginica 149 | 6.2,3.4,5.4,2.3,Iris-virginica 150 | 5.9,3.0,5.1,1.8,Iris-virginica 151 | 152 | -------------------------------------------------------------------------------- /iris.dprep: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 38, 3 | "id": "03618a33-6c1b-42ae-85a5-c6c59736fae0", 4 | "activities": [ 5 | { 6 | "id": "56b8ff53-ec51-455e-a9fb-f36e6ea56fe3", 7 | "name": "iris", 8 | "blocks": [ 9 | { 10 | "id": "a674be18-cdb9-4464-a9b4-5e6a88a27917", 11 | "type": "Microsoft.DPrep.ReferenceActivityBlock", 12 | "arguments": { 13 | "reference": { 14 | "referenceType": 1, 15 | "referenceContainerPath": "./iris.dsource", 16 | "referencedActivityId": "c9a638c6-7714-4e0d-89e9-7f7447af0f8c", 17 | "referencedBranchId": null, 18 | "referencedStep": null, 19 | "anonymousSteps": null 20 | } 21 | } 22 | }, 23 | { 24 | "id": "2bc1c98a-7f9d-475c-8580-0272a7867e42", 25 | "type": "Microsoft.DPrep.ColumnRenameBlock", 26 | "arguments": { 27 | "newColumnId": "Sepal Length", 28 | "columnId": "Column1" 29 | } 30 | }, 31 | { 32 | "id": "9b862343-4863-4852-b4ae-7ce4c9cf4d39", 33 | "type": "Microsoft.DPrep.ColumnRenameBlock", 34 | "arguments": { 35 | "newColumnId": "Sepal Width", 36 | "columnId": "Column2" 37 | } 38 | }, 39 | { 40 | "id": "b2816db6-d4b3-4c75-9e23-e44e4051105c", 41 | "type": "Microsoft.DPrep.ColumnRenameBlock", 42 | "arguments": { 43 | "newColumnId": "Petal Length", 44 | "columnId": "Column3" 45 | } 46 | }, 47 | { 48 | "id": "0e31d922-0e30-47af-bb8b-7052f17cea1a", 49 | "type": "Microsoft.DPrep.ColumnRenameBlock", 50 | "arguments": { 51 | "newColumnId": "Petal Width", 52 | "columnId": "Column4" 53 | } 54 | }, 55 | { 56 | "id": "ef892400-a105-4dd4-aa2d-14b651f64920", 57 | "type": "Microsoft.DPrep.ColumnRenameBlock", 58 | "arguments": { 59 | "newColumnId": "Species", 60 | "columnId": "Column5" 61 | } 62 | }, 63 | { 64 | "id": "a1d1e978-824e-4311-9cb5-c3a10ff929ee", 65 | "type": "Microsoft.DPrep.FilterStringColumnBlock", 66 | "arguments": { 67 | "columnId": "Species", 68 | "filterResult": 1, 69 | "clauseRelationship": 1, 70 | "clauses": [ 71 | { 72 | "operator": 2 73 | } 74 | ] 75 | } 76 | } 77 | ], 78 | "inspectors": [ 79 | { 80 | "id": "af118d72-c777-4562-87d8-60184c1a0d55", 81 | "type": "Microsoft.DPrep.DataQualityInspector", 82 | "arguments": {}, 83 | "reference": { 84 | "referenceType": 0, 85 | "referenceContainerPath": null, 86 | "referencedActivityId": "56b8ff53-ec51-455e-a9fb-f36e6ea56fe3", 87 | "referencedBranchId": null, 88 | "referencedStep": { 89 | "stepReferenceType": 1, 90 | "referencedStepId": null, 91 | "fallback": 1 92 | }, 93 | "anonymousSteps": null 94 | }, 95 | "isBackground": true 96 | }, 97 | { 98 | "id": "66378cca-9d5f-4d22-9b24-20ffd4db722b", 99 | "type": "Microsoft.DPrep.ValueCountInspector", 100 | "arguments": { 101 | "columnId": "Species", 102 | "numberOfTopValues": 6, 103 | "descending": true, 104 | "includeNulls": true, 105 | "haloEffect": true 106 | }, 107 | "reference": { 108 | "referenceType": 0, 109 | "referenceContainerPath": null, 110 | "referencedActivityId": "56b8ff53-ec51-455e-a9fb-f36e6ea56fe3", 111 | "referencedBranchId": null, 112 | "referencedStep": { 113 | "stepReferenceType": 1, 114 | "referencedStepId": null, 115 | "fallback": 1 116 | }, 117 | "anonymousSteps": null 118 | }, 119 | "isBackground": true 120 | } 121 | ] 122 | } 123 | ], 124 | "runConfigurations": [] 125 | } -------------------------------------------------------------------------------- /iris.dprep.user: -------------------------------------------------------------------------------- 1 | "{\"project\":{\"activitiesPaneSize\":200,\"isActivitiesPaneCollapsed\":true,\"activeActivityId\":\"56b8ff53-ec51-455e-a9fb-f36e6ea56fe3\"},\"grid.56b8ff53-ec51-455e-a9fb-f36e6ea56fe3\":{\"topRow\":20},\"activeInspector:56b8ff53-ec51-455e-a9fb-f36e6ea56fe3\":-1,\"inspectorOrder:56b8ff53-ec51-455e-a9fb-f36e6ea56fe3\":[\"66378cca-9d5f-4d22-9b24-20ffd4db722b\"],\"activity.56b8ff53-ec51-455e-a9fb-f36e6ea56fe3\":{\"isHistoryPaneCollapsed\":false,\"inspectorWellSize\":300,\"isInspectorWellCollapsed\":false}}" -------------------------------------------------------------------------------- /iris.dsource: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 38, 3 | "id": "07b9aef7-d8d1-4640-925d-44037509a5ec", 4 | "activities": [ 5 | { 6 | "id": "c9a638c6-7714-4e0d-89e9-7f7447af0f8c", 7 | "name": "iris", 8 | "blocks": [ 9 | { 10 | "id": "daf61e90-349d-4d29-a0b0-2eede1cdbca5", 11 | "type": "Microsoft.DPrep.DataSourceBlock", 12 | "arguments": { 13 | "path": { 14 | "target": 0, 15 | "resourceDetails": [ 16 | { 17 | "path": "./iris.csv" 18 | } 19 | ] 20 | } 21 | } 22 | }, 23 | { 24 | "id": "dba6fb06-4976-4955-af30-3fa554a4eae7", 25 | "type": "Microsoft.DPrep.ParseDelimitedBlock", 26 | "arguments": { 27 | "preview": false, 28 | "columnHeadersMode": 0, 29 | "separator": ",", 30 | "fileEncoding": 0, 31 | "skipRowsMode": 0, 32 | "handleQuotedLineBreaks": false 33 | } 34 | }, 35 | { 36 | "id": "04e03849-2d87-4e7c-b7b6-a03730cf9f05", 37 | "type": "Microsoft.DPrep.SetColumnTypesBlock", 38 | "arguments": { 39 | "columnConversion": [ 40 | { 41 | "columnId": "Column1", 42 | "typeProperty": 3, 43 | "typeArguments": {} 44 | }, 45 | { 46 | "columnId": "Column3", 47 | "typeProperty": 3, 48 | "typeArguments": {} 49 | }, 50 | { 51 | "columnId": "Column2", 52 | "typeProperty": 3, 53 | "typeArguments": {} 54 | }, 55 | { 56 | "columnId": "Column4", 57 | "typeProperty": 3, 58 | "typeArguments": {} 59 | } 60 | ] 61 | } 62 | }, 63 | { 64 | "id": "f21cfc50-6f3d-4d73-9331-68f7cea180f0", 65 | "type": "Microsoft.DPrep.SampleBlock", 66 | "arguments": { 67 | "samples": [ 68 | { 69 | "sampleId": "ea27c911-024f-4a9a-9fe8-2436829e58d8", 70 | "sampleRevision": "5c05e9f5-1d97-4be2-a7a0-ea5faafc79c4", 71 | "sampleName": "Top 10000", 72 | "sampleRunner": { 73 | "id": null, 74 | "type": 0 75 | }, 76 | "remoteGeneratorProperties": {}, 77 | "sampleStrategy": 0, 78 | "topArguments": { 79 | "sampleCount": 10000 80 | }, 81 | "randomNArguments": { 82 | "sampleCount": 10000 83 | }, 84 | "randomPercentArguments": { 85 | "probability": 0.1 86 | }, 87 | "allowAutoGen": true, 88 | "isDisabled": false 89 | } 90 | ], 91 | "activeSample": "ea27c911-024f-4a9a-9fe8-2436829e58d8" 92 | } 93 | }, 94 | { 95 | "id": "24709640-bbf6-4954-80fc-3f1d21f52e4d", 96 | "type": "Microsoft.DPrep.HandlePathColumnBlock", 97 | "arguments": { 98 | "pathColumnOperation": 0 99 | } 100 | } 101 | ], 102 | "inspectors": [ 103 | { 104 | "id": "87b84983-d487-4391-8d90-4a5d664901eb", 105 | "type": "Microsoft.DPrep.DataQualityInspector", 106 | "arguments": {}, 107 | "reference": { 108 | "referenceType": 0, 109 | "referenceContainerPath": null, 110 | "referencedActivityId": "c9a638c6-7714-4e0d-89e9-7f7447af0f8c", 111 | "referencedBranchId": null, 112 | "referencedStep": { 113 | "stepReferenceType": 1, 114 | "referencedStepId": null, 115 | "fallback": 1 116 | }, 117 | "anonymousSteps": null 118 | }, 119 | "isBackground": true 120 | } 121 | ] 122 | } 123 | ], 124 | "runConfigurations": [] 125 | } -------------------------------------------------------------------------------- /iris.dsource.user: -------------------------------------------------------------------------------- 1 | "{\"project\":{\"activitiesPaneSize\":200,\"isActivitiesPaneCollapsed\":true,\"activeActivityId\":\"c9a638c6-7714-4e0d-89e9-7f7447af0f8c\"}}" -------------------------------------------------------------------------------- /iris.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Classifying Iris Notebook\n", 8 | "\n", 9 | "Please make sure you have **matplotlib** installed in the compute context you choose as kernel. \n", 10 | "\n", 11 | "- For local or remote **Docker kernels**, please ensure **notebook** and **matplotlib** are listed in your **conda_dependencies.yml** file under **aml_config** folder.\n", 12 | "```\n", 13 | "name: project_environment\n", 14 | "dependencies:\n", 15 | " - python=3.5.2\n", 16 | " - scikit-learn\n", 17 | " - pip:\n", 18 | " - notebook\n", 19 | " - matplotlib\n", 20 | "```" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 8, 26 | "metadata": {}, 27 | "outputs": [ 28 | { 29 | "name": "stdout", 30 | "output_type": "stream", 31 | "text": [ 32 | "History logging disabled\n" 33 | ] 34 | } 35 | ], 36 | "source": [ 37 | "%matplotlib inline\n", 38 | "%azureml history off" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 20, 44 | "metadata": {}, 45 | "outputs": [], 46 | "source": [ 47 | "import pickle\n", 48 | "import sys\n", 49 | "import os\n", 50 | "import numpy as np\n", 51 | "import matplotlib.pyplot as plt\n", 52 | "from mpl_toolkits.mplot3d import Axes3D\n", 53 | "\n", 54 | "from sklearn import decomposition\n", 55 | "from sklearn import datasets\n", 56 | "from sklearn import preprocessing\n", 57 | "\n", 58 | "from sklearn.datasets import load_iris\n", 59 | "from sklearn.linear_model import LogisticRegression\n", 60 | "from sklearn.metrics import precision_recall_curve\n", 61 | "\n", 62 | "from azureml.logging import get_azureml_logger\n", 63 | "from azureml.dataprep import package" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 10, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "name": "stdout", 73 | "output_type": "stream", 74 | "text": [ 75 | "Python version: 3.5.2 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:52:12) \n", 76 | "[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)]\n", 77 | "\n" 78 | ] 79 | } 80 | ], 81 | "source": [ 82 | "logger = get_azureml_logger()\n", 83 | "print ('Python version: {}'.format(sys.version))\n", 84 | "print ()" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 11, 90 | "metadata": {}, 91 | "outputs": [ 92 | { 93 | "name": "stdout", 94 | "output_type": "stream", 95 | "text": [ 96 | "History logging enabled\n" 97 | ] 98 | } 99 | ], 100 | "source": [ 101 | "%azureml history on" 102 | ] 103 | }, 104 | { 105 | "cell_type": "code", 106 | "execution_count": 12, 107 | "metadata": {}, 108 | "outputs": [ 109 | { 110 | "name": "stdout", 111 | "output_type": "stream", 112 | "text": [ 113 | "Iris dataset shape: (150, 5)\n" 114 | ] 115 | } 116 | ], 117 | "source": [ 118 | "#load Iris dataset from a DataPrep package\n", 119 | "iris = package.run('iris.dprep', dataflow_idx=0, spark=False)\n", 120 | "\n", 121 | "# load features and labels\n", 122 | "X, Y = iris[['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width']].values, iris['Species'].values\n", 123 | "\n", 124 | "# tag this cell to measure duration\n", 125 | "logger.log(\"Cell\",\"Load Data\")\n", 126 | "logger.log(\"Rows\",iris.shape[0])\n", 127 | "\n", 128 | "print ('Iris dataset shape: {}'.format(iris.shape))" 129 | ] 130 | }, 131 | { 132 | "cell_type": "code", 133 | "execution_count": 13, 134 | "metadata": {}, 135 | "outputs": [ 136 | { 137 | "name": "stdout", 138 | "output_type": "stream", 139 | "text": [ 140 | "Regularization rate is 0.01\n", 141 | "LogisticRegression(C=100.0, class_weight=None, dual=False, fit_intercept=True,\n", 142 | " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", 143 | " penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n", 144 | " verbose=0, warm_start=False)\n", 145 | "Accuracy is 0.98\n" 146 | ] 147 | } 148 | ], 149 | "source": [ 150 | "logger.log(\"Cell\", \"Training\")\n", 151 | "\n", 152 | "# change regularization rate and you will likely get a different accuracy.\n", 153 | "reg = 0.01\n", 154 | "\n", 155 | "print(\"Regularization rate is {}\".format(reg))\n", 156 | "logger.log('Regularization Rate', reg)\n", 157 | "\n", 158 | "# train a logistic regression model\n", 159 | "clf = LogisticRegression(C=1/reg).fit(X, Y)\n", 160 | "print (clf)\n", 161 | "\n", 162 | "# Log curves for label value 'Iris-versicolor'\n", 163 | "y_scores = clf.predict_proba(X)\n", 164 | "precision, recall, thresholds = precision_recall_curve(Y, y_scores[:,1],pos_label='Iris-versicolor')\n", 165 | "logger.log(\"Precision\",precision)\n", 166 | "logger.log(\"Recall\",recall)\n", 167 | "logger.log(\"Thresholds\",thresholds)\n", 168 | "\n", 169 | "accuracy = clf.score(X, Y)\n", 170 | "logger.log('Accuracy', accuracy)\n", 171 | "print (\"Accuracy is {}\".format(accuracy))" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 15, 177 | "metadata": { 178 | "scrolled": true 179 | }, 180 | "outputs": [ 181 | { 182 | "name": "stdout", 183 | "output_type": "stream", 184 | "text": [ 185 | "New sample: [[3.0, 3.6, 1.3, 0.25]]\n", 186 | "Predicted class is ['Iris-setosa']\n" 187 | ] 188 | } 189 | ], 190 | "source": [ 191 | "logger.log(\"Cell\", \"Scoring\")\n", 192 | "\n", 193 | "# predict a new sample\n", 194 | "X_new = [[3.0, 3.6, 1.3, 0.25]]\n", 195 | "print ('New sample: {}'.format(X_new))\n", 196 | "pred = clf.predict(X_new)\n", 197 | "logger.log('Prediction', pred.tolist())\n", 198 | "\n", 199 | "print('Predicted class is {}'.format(pred))" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 18, 205 | "metadata": {}, 206 | "outputs": [ 207 | { 208 | "name": "stdout", 209 | "output_type": "stream", 210 | "text": [ 211 | "History logging disabled\n" 212 | ] 213 | } 214 | ], 215 | "source": [ 216 | "%azureml history off" 217 | ] 218 | }, 219 | { 220 | "cell_type": "code", 221 | "execution_count": 21, 222 | "metadata": {}, 223 | "outputs": [ 224 | { 225 | "data": { 226 | "image/png": "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\n", 227 | "text/plain": [ 228 | "" 229 | ] 230 | }, 231 | "metadata": {}, 232 | "output_type": "display_data" 233 | } 234 | ], 235 | "source": [ 236 | "# Plot Iris data in 3D\n", 237 | "centers = [[1, 1], [-1, -1], [1, -1]]\n", 238 | "\n", 239 | "fig = plt.figure(1, figsize=(8, 6))\n", 240 | "plt.clf()\n", 241 | "ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)\n", 242 | "\n", 243 | "plt.cla()\n", 244 | "# decompose 4 feature columns into 3 components for 3D plotting\n", 245 | "pca = decomposition.PCA(n_components=3)\n", 246 | "pca.fit(X)\n", 247 | "X = pca.transform(X)\n", 248 | "\n", 249 | "le = preprocessing.LabelEncoder()\n", 250 | "le.fit(Y)\n", 251 | "Y = le.transform(Y)\n", 252 | "\n", 253 | "for name, label in [('Setosa', 0), ('Versicolour', 1), ('Virginica', 2)]:\n", 254 | " ax.text3D(X[Y == label, 0].mean(),\n", 255 | " X[Y == label, 1].mean() + 1.5,\n", 256 | " X[Y == label, 2].mean(), name,\n", 257 | " horizontalalignment='center',\n", 258 | " bbox=dict(alpha=.5, edgecolor='w', facecolor='w'))\n", 259 | "# Reorder the labels to have colors matching the cluster results\n", 260 | "y = np.choose(Y, [1, 2, 0]).astype(np.float)\n", 261 | "ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=Y, cmap=plt.cm.spectral)\n", 262 | "\n", 263 | "ax.w_xaxis.set_ticklabels([])\n", 264 | "ax.w_yaxis.set_ticklabels([])\n", 265 | "ax.w_zaxis.set_ticklabels([])\n", 266 | "\n", 267 | "plt.show()" 268 | ] 269 | }, 270 | { 271 | "cell_type": "code", 272 | "execution_count": null, 273 | "metadata": { 274 | "collapsed": true 275 | }, 276 | "outputs": [], 277 | "source": [] 278 | } 279 | ], 280 | "metadata": { 281 | "language_info": { 282 | "codemirror_mode": { 283 | "name": "ipython", 284 | "version": 3 285 | }, 286 | "file_extension": ".py", 287 | "mimetype": "text/x-python", 288 | "name": "python", 289 | "nbconvert_exporter": "python", 290 | "pygments_lexer": "ipython3", 291 | "version": "3.5.2" 292 | } 293 | }, 294 | "nbformat": 4, 295 | "nbformat_minor": 2 296 | } 297 | -------------------------------------------------------------------------------- /iris_sklearn.py: -------------------------------------------------------------------------------- 1 | # Please make sure scikit-learn is included the conda_dependencies.yml file. 2 | import pickle 3 | import sys 4 | import os 5 | 6 | import numpy as np 7 | from sklearn.metrics import confusion_matrix 8 | 9 | from sklearn.linear_model import LogisticRegression 10 | from sklearn.model_selection import train_test_split 11 | from sklearn.metrics import precision_recall_curve 12 | 13 | from azureml.logging import get_azureml_logger 14 | from azureml.dataprep.package import run 15 | 16 | from plot_graphs import plot_iris 17 | 18 | # initialize the logger 19 | run_logger = get_azureml_logger() 20 | 21 | # create the outputs folder 22 | os.makedirs('./outputs', exist_ok=True) 23 | 24 | print('Python version: {}'.format(sys.version)) 25 | print() 26 | 27 | # load Iris dataset from a DataPrep package as a pandas DataFrame 28 | iris = run('iris.dprep', dataflow_idx=0, spark=False) 29 | print ('Iris dataset shape: {}'.format(iris.shape)) 30 | 31 | # load features and labels 32 | X, Y = iris[['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width']].values, iris['Species'].values 33 | 34 | # add n more random features to make the problem harder to solve 35 | # number of new random features to add 36 | n = 40 37 | random_state = np.random.RandomState(0) 38 | n_samples, n_features = X.shape 39 | X = np.c_[X, random_state.randn(n_samples, n)] 40 | 41 | # split data 65%-35% into training set and test set 42 | X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.35, random_state=0) 43 | 44 | # change regularization rate and you will likely get a different accuracy. 45 | reg = 0.01 46 | # load regularization rate from argument if present 47 | if len(sys.argv) > 1: 48 | reg = float(sys.argv[1]) 49 | 50 | print("Regularization rate is {}".format(reg)) 51 | 52 | # log the regularization rate 53 | run_logger.log("Regularization Rate", reg) 54 | 55 | # train a logistic regression model on the training set 56 | clf1 = LogisticRegression(C=1/reg).fit(X_train, Y_train) 57 | print (clf1) 58 | 59 | # evaluate the test set 60 | accuracy = clf1.score(X_test, Y_test) 61 | print ("Accuracy is {}".format(accuracy)) 62 | 63 | # log accuracy which is a single numerical value 64 | run_logger.log("Accuracy", accuracy) 65 | 66 | # calculate and log precision, recall, and thresholds, which are list of numerical values 67 | y_scores = clf1.predict_proba(X_test) 68 | precision, recall, thresholds = precision_recall_curve(Y_test, y_scores[:,1],pos_label='Iris-versicolor') 69 | run_logger.log("Precision", precision) 70 | run_logger.log("Recall", recall) 71 | run_logger.log("Thresholds", thresholds) 72 | 73 | print("") 74 | print("==========================================") 75 | print("Serialize and deserialize using the outputs folder.") 76 | print("") 77 | 78 | # serialize the model on disk in the special 'outputs' folder 79 | print ("Export the model to model.pkl") 80 | f = open('./outputs/model.pkl', 'wb') 81 | pickle.dump(clf1, f) 82 | f.close() 83 | 84 | # load the model back from the 'outputs' folder into memory 85 | print("Import the model from model.pkl") 86 | f2 = open('./outputs/model.pkl', 'rb') 87 | clf2 = pickle.load(f2) 88 | 89 | # predict on a new sample 90 | X_new = [[3.0, 3.6, 1.3, 0.25]] 91 | print ('New sample: {}'.format(X_new)) 92 | 93 | # add random features to match the training data 94 | X_new_with_random_features = np.c_[X_new, random_state.randn(1, n)] 95 | 96 | # score on the new sample 97 | pred = clf2.predict(X_new_with_random_features) 98 | print('Predicted class is {}'.format(pred)) 99 | 100 | try: 101 | import matplotlib 102 | # plot confusion matrix and ROC curve 103 | plot_iris(clf1, X, Y) 104 | print("Confusion matrix and ROC curve plotted. See them in Run History details page.") 105 | except ImportError: 106 | print("matplotlib not found so no plots produced.") 107 | print("Please install it from command-line window by typing \"pip install matplotlib\".") 108 | 109 | -------------------------------------------------------------------------------- /iris_sklearn_shared_folder.py: -------------------------------------------------------------------------------- 1 | # Please make sure scikit-learn is included the conda_dependencies.yml file. 2 | 3 | import pickle 4 | import sys 5 | import os 6 | 7 | from sklearn.datasets import load_iris 8 | from sklearn.linear_model import LogisticRegression 9 | from azureml.logging import get_azureml_logger 10 | 11 | # initialize the logger 12 | run_logger = get_azureml_logger() 13 | 14 | # create the outputs folder 15 | os.makedirs('./outputs', exist_ok=True) 16 | 17 | print ('Python version: {}'.format(sys.version)) 18 | print () 19 | 20 | # load Iris dataset 21 | iris = load_iris() 22 | print ('Iris dataset shape: {}'.format(iris.data.shape)) 23 | 24 | # load features and labels 25 | X, Y = iris.data, iris.target 26 | 27 | # change regularization rate and you will likely get a different accuracy. 28 | reg = 0.01 29 | # load regularization rate from argument if present 30 | if len(sys.argv) > 1: 31 | reg = float(sys.argv[1]) 32 | 33 | print("Regularization rate is {}".format(reg)) 34 | 35 | # log the regularization rate 36 | run_logger.log("Regularization Rate", reg) 37 | 38 | # train a logistic regression model 39 | clf1 = LogisticRegression(C=1/reg).fit(X, Y) 40 | print (clf1) 41 | 42 | accuracy = clf1.score(X, Y) 43 | print ("Accuracy is {}".format(accuracy)) 44 | 45 | # log accuracy 46 | run_logger.log("Accuracy", accuracy) 47 | 48 | print("") 49 | print("==========================================") 50 | print("Serialize and deserialize using the native share folder: {0}".format(os.environ['AZUREML_NATIVE_SHARE_DIRECTORY'])) 51 | print("") 52 | 53 | # serialize the model on disk in the private share folder. 54 | # note this folder is NOT tracked by run history, but it survives across runs on the same compute context. 55 | print ("Export the model to model.pkl in the native shared folder") 56 | f = open(os.environ['AZUREML_NATIVE_SHARE_DIRECTORY'] + 'model.pkl', 'wb') 57 | pickle.dump(clf1, f) 58 | f.close() 59 | 60 | # load the model back from the private share folder into memory 61 | print("Import the model from model.pkl in the native shared folder") 62 | f2 = open(os.environ['AZUREML_NATIVE_SHARE_DIRECTORY'] + 'model.pkl', 'rb') 63 | clf2 = pickle.load(f2) 64 | 65 | # predict a new sample 66 | X_new = [[3.0, 3.6, 1.3, 0.25]] 67 | print ('New sample: {}'.format(X_new)) 68 | pred = clf2.predict(X_new) 69 | print('Predicted class is {}'.format(pred)) 70 | -------------------------------------------------------------------------------- /iris_spark.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | import pyspark 4 | import os 5 | import urllib 6 | import sys 7 | 8 | from pyspark.sql.functions import * 9 | from pyspark.ml.classification import * 10 | from pyspark.ml.evaluation import * 11 | from pyspark.ml.feature import * 12 | 13 | from azureml.logging import get_azureml_logger 14 | 15 | # initialize logger 16 | run_logger = get_azureml_logger() 17 | 18 | # start Spark session 19 | spark = pyspark.sql.SparkSession.builder.appName('Iris').getOrCreate() 20 | 21 | # print runtime versions 22 | print ('****************') 23 | print ('Python version: {}'.format(sys.version)) 24 | print ('Spark version: {}'.format(spark.version)) 25 | print ('****************') 26 | 27 | # load iris.csv into Spark dataframe 28 | data = spark.createDataFrame(pd.read_csv('iris.csv', header=None, names=['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class'])) 29 | print("First 10 rows of Iris dataset:") 30 | data.show(10) 31 | 32 | # vectorize all numerical columns into a single feature column 33 | feature_cols = data.columns[:-1] 34 | assembler = pyspark.ml.feature.VectorAssembler(inputCols=feature_cols, outputCol='features') 35 | data = assembler.transform(data) 36 | 37 | # convert text labels into indices 38 | data = data.select(['features', 'class']) 39 | label_indexer = pyspark.ml.feature.StringIndexer(inputCol='class', outputCol='label').fit(data) 40 | data = label_indexer.transform(data) 41 | 42 | # only select the features and label column 43 | data = data.select(['features', 'label']) 44 | print("Reading for machine learning") 45 | data.show(10) 46 | 47 | # change regularization rate and you will likely get a different accuracy. 48 | reg = 0.01 49 | # load regularization rate from argument if present 50 | if len(sys.argv) > 1: 51 | reg = float(sys.argv[1]) 52 | 53 | # log regularization rate 54 | run_logger.log("Regularization Rate", reg) 55 | 56 | # use Logistic Regression to train on the training set 57 | train, test = data.randomSplit([0.70, 0.30]) 58 | lr = pyspark.ml.classification.LogisticRegression(regParam=reg) 59 | model = lr.fit(train) 60 | 61 | # predict on the test set 62 | prediction = model.transform(test) 63 | print("Prediction") 64 | prediction.show(10) 65 | 66 | # evaluate the accuracy of the model using the test set 67 | evaluator = pyspark.ml.evaluation.MulticlassClassificationEvaluator(metricName='accuracy') 68 | accuracy = evaluator.evaluate(prediction) 69 | 70 | print() 71 | print('#####################################') 72 | print('Regularization rate is {}'.format(reg)) 73 | print("Accuracy is {}".format(accuracy)) 74 | print('#####################################') 75 | print() 76 | 77 | # log accuracy 78 | run_logger.log('Accuracy', accuracy) 79 | -------------------------------------------------------------------------------- /plot_graphs.py: -------------------------------------------------------------------------------- 1 | try: 2 | import matplotlib 3 | matplotlib.use('agg') 4 | import matplotlib.pyplot as plt 5 | from scipy import interp 6 | from itertools import cycle 7 | import numpy as np 8 | 9 | from sklearn.metrics import roc_curve, auc 10 | from sklearn.metrics import confusion_matrix 11 | from sklearn.preprocessing import label_binarize 12 | except ImportError: 13 | print("Library (matplotlib or sklearn) missing. Can't plot.") 14 | 15 | 16 | # note this is alphabetically ordered. 17 | labels = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'] 18 | 19 | def plot_iris(clf, X, Y): 20 | plot_confusion_matrix(clf, X, Y) 21 | plot_roc(clf, X, Y) 22 | 23 | def plot_confusion_matrix(clf, iris_X, iris_Y): 24 | print("Plotting confusion matrix...") 25 | # score the entire test set 26 | Y_hat = clf.predict(iris_X) 27 | 28 | # create a confusion matrix 29 | cm = confusion_matrix(iris_Y, Y_hat, labels) 30 | 31 | # plot the confusion matrix 32 | print("Confusion matrix in text:") 33 | print(cm) 34 | 35 | fig = plt.figure(figsize=(6, 4), dpi=75) 36 | plt.imshow(cm, interpolation="nearest", cmap=plt.cm.Greens) 37 | plt.colorbar() 38 | tick_marks = np.arange(len(labels)) 39 | plt.xticks(tick_marks, labels, rotation=45) 40 | plt.yticks(tick_marks, labels) 41 | plt.xlabel("Predicted Species") 42 | plt.ylabel("True Species") 43 | fig.savefig('./outputs/cm.png', bbox_inches='tight') 44 | 45 | print("Confusion matrix plotted.") 46 | 47 | def plot_roc(clf, iris_X, iris_Y): 48 | print("Plotting ROC curve....") 49 | n_classes = len(set(iris_Y)) 50 | Y_score = clf.decision_function(iris_X) 51 | Y_onehot = label_binarize(iris_Y, classes = labels) 52 | 53 | fpr = dict() 54 | tpr = dict() 55 | roc_auc = dict() 56 | 57 | for i in range(n_classes): 58 | fpr[i], tpr[i], _ = roc_curve(Y_onehot[:,i], Y_score[:,i]) 59 | roc_auc[i] = auc(fpr[i], tpr[i]) 60 | fpr["micro"], tpr["micro"], _ = roc_curve(Y_onehot.ravel(), Y_score.ravel()) 61 | roc_auc["micro"] = auc(fpr["micro"], tpr["micro"]) 62 | 63 | # Compute macro-average ROC curve and ROC area 64 | 65 | # First aggregate all false positive rates 66 | all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)])) 67 | 68 | # Then interpolate all ROC curves at this points 69 | mean_tpr = np.zeros_like(all_fpr) 70 | for i in range(n_classes): 71 | mean_tpr += interp(all_fpr, fpr[i], tpr[i]) 72 | 73 | # Finally average it and compute AUC 74 | mean_tpr /= n_classes 75 | 76 | fpr["macro"] = all_fpr 77 | tpr["macro"] = mean_tpr 78 | roc_auc["macro"] = auc(fpr["macro"], tpr["macro"]) 79 | 80 | # Plot all ROC curves 81 | fig = plt.figure(figsize=(6, 5), dpi=75) 82 | # set lineweight 83 | lw = 2 84 | 85 | # plot micro average 86 | plt.plot(fpr["micro"], tpr["micro"], 87 | label='micro-average ROC curve (area = {0:0.2f})' 88 | ''.format(roc_auc["micro"]), 89 | color='deeppink', linestyle=':', linewidth=4) 90 | 91 | # plot macro average 92 | plt.plot(fpr["macro"], tpr["macro"], 93 | label='macro-average ROC curve (area = {0:0.2f})' 94 | ''.format(roc_auc["macro"]), 95 | color='navy', linestyle=':', linewidth=4) 96 | 97 | # plot ROC for each class 98 | colors = cycle(['aqua', 'darkorange', 'cornflowerblue']) 99 | for i, color in zip(range(n_classes), colors): 100 | plt.plot(fpr[i], tpr[i], color=color, lw=lw, 101 | label='ROC curve of class {0} (area = {1:0.2f})' 102 | ''.format(labels[i], roc_auc[i])) 103 | 104 | # plot diagnal line 105 | plt.plot([0, 1], [0, 1], 'k--', lw=lw) 106 | 107 | plt.xlim([0.0, 1.0]) 108 | plt.ylim([0.0, 1.05]) 109 | plt.xlabel('False Positive Rate') 110 | plt.ylabel('True Positive Rate') 111 | plt.title('Iris multi-class ROC') 112 | plt.legend(loc="lower right") 113 | fig.savefig("./outputs/roc.png", bbox_inches='tight') 114 | 115 | print("ROC curve plotted.") 116 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Classifying Iris 2 | 3 | > **NOTE** This content is no longer maintained. Visit the [Azure Machine Learning Notebook](https://github.com/Azure/MachineLearningNotebooks) project for sample Jupyter notebooks for ML and deep learning with Azure Machine Learning. 4 | 5 | This is a companion sample project of the Azure Machine Learning [QuickStart](https://docs.microsoft.com/azure/machine-learning/preview/quickstart-installation) and [Tutorials](https://docs.microsoft.com/azure/machine-learning/preview/tutorial-classifying-iris-part-1). Using the timeless [Iris flower dataset](https://en.wikipedia.org/wiki/Iris_flower_data_set), it walks you through the basics of preparing dataset, creating a model and deploying it as a web service. 6 | 7 | ![cover](./docs/iris.png) 8 | 9 | ## QuickStart 10 | Select `local` as the execution environment, and `iris_sklearn.py` as the script, and click **Run** button. You can also set the _Regularization Rate_ by entering `0.01` in the **Arguments** control. Changing the _Regularization Rate_ has an impact on the accuracy of the model, giving interesting results to explore. 11 | 12 | ## Exploring results 13 | After running, you can check out the results in **Run History**. Exploring the **Run History** will allow you to see the correlation between the parameters you entered and the accuracy of the models. You can get individual run details by clicking a run in the **Run History** report or clicking the name of the run on the Jobs Panel to the right. In this sample you will have richer results if you have `matplotlib` installed. 14 | 15 | ## Quick CLI references 16 | If you want to try exercising the Iris sample from the command line, here are some things to try: 17 | 18 | First, launch the Command Prompt or Powershell from the **File** menu. Then enter the following commands: 19 | 20 | ``` 21 | # first let's install matplotlib locally 22 | $ pip install matplotlib 23 | 24 | # log in to Azure if you haven't done so 25 | $ az login 26 | 27 | # kick off many local runs sequentially 28 | $ python run.py 29 | ``` 30 | 31 | Run `iris_sklearn.py` Python script in local Python environment. 32 | ``` 33 | $ az ml experiment submit -c local iris_sklearn.py 34 | ``` 35 | 36 | Run `iris_sklearn.py` Python script in a local Docker container. 37 | ``` 38 | $ az ml experiment submit -c docker-python iris_sklearn.py 39 | ``` 40 | 41 | Run `iris_spark.py` PySpark script in a local Docker container. 42 | ``` 43 | $ az ml experiment submit -c docker-spark iris_spark.py 44 | ``` 45 | 46 | Create `myvm` run configuration to point to a Docker container on a remote VM 47 | ``` 48 | $ az ml computetarget attach remotedocker --name myvm --address --username --password 49 | 50 | # prepare the environment 51 | $ az ml experiment prepare -c myvm 52 | ``` 53 | 54 | Run `iris_spark.py` PySpark script in a Docker container (with Spark) in a remote VM: 55 | ``` 56 | $ az ml experiment submit -c myvm iris_spark.py 57 | ``` 58 | 59 | Create `myhdi` run configuration to point to an HDI cluster 60 | ``` 61 | $ az ml computetarget attach cluster --name myhdi --address --username --password 62 | 63 | # prepare the environment 64 | $ az ml experiment prepare -c myhdi 65 | ``` 66 | 67 | Run in a remote HDInsight cluster: 68 | ``` 69 | $ az ml experiment submit -c myhdi iris_spark.py 70 | ``` 71 | -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | # run iris_sklearn.py with descending regularization rates 2 | # run this with just "python run.py". It will fail if you run using az ml execute. 3 | 4 | import os 5 | 6 | # set regularization rate as an argument 7 | reg = 10 8 | while reg > 0.005: 9 | os.system('az ml experiment submit -c local ./iris_sklearn.py {}'.format(reg)) 10 | # cut regularization rate to half 11 | reg = reg / 2 12 | 13 | -------------------------------------------------------------------------------- /score_iris.py: -------------------------------------------------------------------------------- 1 | # This script generates the scoring and schema files 2 | # Creates the schema, and holds the init and run functions needed to 3 | # operationalize the Iris Classification sample 4 | 5 | # Import data collection library. Only supported for docker mode. 6 | # Functionality will be ignored when package isn't found 7 | try: 8 | from azureml.datacollector import ModelDataCollector 9 | except ImportError: 10 | print("Data collection is currently only supported in docker mode. May be disabled for local mode.") 11 | # Mocking out model data collector functionality 12 | class ModelDataCollector(object): 13 | def nop(*args, **kw): pass 14 | def __getattr__(self, _): return self.nop 15 | def __init__(self, *args, **kw): return None 16 | pass 17 | 18 | import os 19 | 20 | # Prepare the web service definition by authoring 21 | # init() and run() functions. Test the functions 22 | # before deploying the web service. 23 | def init(): 24 | global inputs_dc, prediction_dc 25 | from sklearn.externals import joblib 26 | 27 | # load the model from file into a global object 28 | global model 29 | model = joblib.load('model.pkl') 30 | 31 | inputs_dc = ModelDataCollector("model.pkl", identifier="inputs") 32 | prediction_dc = ModelDataCollector("model.pkl", identifier="prediction") 33 | 34 | def run(input_df): 35 | import json 36 | 37 | # append 40 random features just like the training script does it. 38 | import numpy as np 39 | n = 40 40 | random_state = np.random.RandomState(0) 41 | n_samples, n_features = input_df.shape 42 | input_df = np.c_[input_df, random_state.randn(n_samples, n)] 43 | inputs_dc.collect(input_df) 44 | 45 | # make prediction using the model 46 | pred = model.predict(input_df) 47 | prediction_dc.collect(pred) 48 | 49 | # return all predictions 50 | # return json.dumps(pred.tolist()) 51 | 52 | # return just the first prediction 53 | return json.dumps(str(pred[0])) 54 | 55 | def main(): 56 | from azureml.api.schema.dataTypes import DataTypes 57 | from azureml.api.schema.sampleDefinition import SampleDefinition 58 | from azureml.api.realtime.services import generate_schema 59 | import pandas 60 | 61 | df = pandas.DataFrame(data=[[3.0, 3.6, 1.3, 0.25]], columns=['sepal length', 'sepal width','petal length','petal width']) 62 | 63 | # Turn on data collection debug mode to view output in stdout 64 | os.environ["AML_MODEL_DC_DEBUG"] = 'true' 65 | 66 | # Test the output of the functions 67 | init() 68 | input1 = pandas.DataFrame([[3.0, 3.6, 1.3, 0.25]]) 69 | print("Result: " + run(input1)) 70 | 71 | inputs = {"input_df": SampleDefinition(DataTypes.PANDAS, df)} 72 | 73 | #Genereate the schema 74 | generate_schema(run_func=run, inputs=inputs, filepath='./outputs/service_schema.json') 75 | print("Schema generated") 76 | 77 | if __name__ == "__main__": 78 | main() 79 | --------------------------------------------------------------------------------