├── .gitignore
├── artifacts-Markdown-HTML.ipynb
├── AutoML pipeline - to_fix.ipynb
├── AutoML pipeline.ipynb
└── iris.csv
/.gitignore:
--------------------------------------------------------------------------------
1 | venv/
2 | .ipynb_checkpoints/
3 |
--------------------------------------------------------------------------------
/artifacts-Markdown-HTML.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "id": "fb13511f-ebf7-4a87-9795-2792ceb30c01",
7 | "metadata": {},
8 | "outputs": [],
9 | "source": [
10 | "from kfp.v2 import dsl\n",
11 | "from kfp.v2.dsl import (\n",
12 | " component,\n",
13 | " Output,\n",
14 | " ClassificationMetrics,\n",
15 | " Metrics,\n",
16 | " HTML,\n",
17 | " Markdown\n",
18 | ")\n"
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": 6,
24 | "id": "1ba71d6d-b67f-43a1-8751-9caf32e2a672",
25 | "metadata": {},
26 | "outputs": [],
27 | "source": [
28 | "PROJECT_ID = \"kubeflow-demos\" # @param {type:\"string\"}\n",
29 | "PROJECT_NUMBER = \"141610882258\"\n",
30 | "REGION = \"us-central1\" # @param {type: \"string\"}\n",
31 | "BUCKET_NAME = \"test-fast\" # @param {type:\"string\"}\n",
32 | "BUCKET_URI = f\"gs://{BUCKET_NAME}\""
33 | ]
34 | },
35 | {
36 | "cell_type": "code",
37 | "execution_count": 2,
38 | "id": "4da54c91-5883-4a6a-bd23-9d4ff3a2684e",
39 | "metadata": {},
40 | "outputs": [],
41 | "source": [
42 | "\n",
43 | "@component\n",
44 | "def html_visualization(html_artifact: Output[HTML]):\n",
45 | " public_url = 'https://user-images.githubusercontent.com/37026441/140434086-d9e1099b-82c7-4df8-ae25-83fda2929088.png'\n",
46 | " html_content = \\\n",
47 | " '
Global Feature Importance
\\n
'.format(public_url)\n",
48 | " with open(html_artifact.path, 'w') as f:\n",
49 | " f.write(html_content)\n"
50 | ]
51 | },
52 | {
53 | "cell_type": "code",
54 | "execution_count": 3,
55 | "id": "e343ef3d-dfe7-48d6-b26c-f8530012d491",
56 | "metadata": {},
57 | "outputs": [],
58 | "source": [
59 | "@component\n",
60 | "def markdown_visualization(markdown_artifact: Output[Markdown]):\n",
61 | " import urllib.request\n",
62 | "\n",
63 | " with urllib.request.urlopen('https://gist.githubusercontent.com/zijianjoy/a288d582e477f8021a1fcffcfd9a1803/raw/68519f72abb59152d92cf891b4719cd95c40e4b6/table_visualization.md') as table:\n",
64 | " markdown_content = table.read().decode('utf-8')\n",
65 | " with open(markdown_artifact.path, 'w') as f:\n",
66 | " f.write(markdown_content)"
67 | ]
68 | },
69 | {
70 | "cell_type": "code",
71 | "execution_count": 5,
72 | "id": "2272d1e3-151d-4586-84ec-920bebc9f7a3",
73 | "metadata": {},
74 | "outputs": [
75 | {
76 | "name": "stderr",
77 | "output_type": "stream",
78 | "text": [
79 | "/Users/yarkoni/projects/workshop/venv/lib/python3.9/site-packages/kfp/v2/compiler/compiler.py:1278: FutureWarning: APIs imported from the v1 namespace (e.g. kfp.dsl, kfp.components, etc) will not be supported by the v2 compiler since v2.0.0\n",
80 | " warnings.warn(\n"
81 | ]
82 | }
83 | ],
84 | "source": [
85 | "\n",
86 | "from kfp.v2 import dsl, compiler\n",
87 | "@dsl.pipeline(name=f'metrics-visualization-pipeline-1008')\n",
88 | "def metrics_visualization_pipeline():\n",
89 | " html_visualization_op = html_visualization()\n",
90 | " markdown_visualization_op = markdown_visualization()\n",
91 | "\n",
92 | "compiler.Compiler().compile(pipeline_func=metrics_visualization_pipeline, package_path='metrics_visualization_pipeline.json')"
93 | ]
94 | },
95 | {
96 | "cell_type": "code",
97 | "execution_count": 9,
98 | "id": "332e4474-9257-4cd1-9f6f-abb4053b2313",
99 | "metadata": {},
100 | "outputs": [
101 | {
102 | "name": "stdout",
103 | "output_type": "stream",
104 | "text": [
105 | "INFO:root:Resource html-mark not found.\n",
106 | "INFO:root:Creating Resource html-mark\n"
107 | ]
108 | }
109 | ],
110 | "source": [
111 | "import google.cloud.aiplatform as aiplatform\n",
112 | "\n",
113 | "aiplatform.init(\n",
114 | " # your Google Cloud Project ID or number\n",
115 | " # environment default used is not set\n",
116 | " project=PROJECT_ID,\n",
117 | "\n",
118 | " # the Vertex AI region you will use\n",
119 | " # defaults to us-central1\n",
120 | " location=REGION,\n",
121 | "\n",
122 | " # Google Cloud Storage bucket in same region as location\n",
123 | " # used to stage artifacts\n",
124 | " staging_bucket=BUCKET_URI,\n",
125 | "\n",
126 | " # the name of the experiment to use to track\n",
127 | " # logged metrics and parameters\n",
128 | " experiment='html-mark',\n",
129 | "\n",
130 | " # description of the experiment above\n",
131 | " experiment_description='my experiment description'\n",
132 | ")"
133 | ]
134 | },
135 | {
136 | "cell_type": "code",
137 | "execution_count": 10,
138 | "id": "0eec6462-469d-4c28-acff-f7bfae91669b",
139 | "metadata": {},
140 | "outputs": [
141 | {
142 | "name": "stdout",
143 | "output_type": "stream",
144 | "text": [
145 | "INFO:google.cloud.aiplatform.pipeline_jobs:Creating PipelineJob\n",
146 | "INFO:google.cloud.aiplatform.pipeline_jobs:PipelineJob created. Resource name: projects/141610882258/locations/us-central1/pipelineJobs/metrics-visualization-pipeline-1008-20220405162340\n",
147 | "INFO:google.cloud.aiplatform.pipeline_jobs:To use this PipelineJob in another session:\n",
148 | "INFO:google.cloud.aiplatform.pipeline_jobs:pipeline_job = aiplatform.PipelineJob.get('projects/141610882258/locations/us-central1/pipelineJobs/metrics-visualization-pipeline-1008-20220405162340')\n",
149 | "INFO:google.cloud.aiplatform.pipeline_jobs:View Pipeline Job:\n",
150 | "https://console.cloud.google.com/vertex-ai/locations/us-central1/pipelines/runs/metrics-visualization-pipeline-1008-20220405162340?project=141610882258\n",
151 | "INFO:google.cloud.aiplatform.pipeline_jobs:PipelineJob projects/141610882258/locations/us-central1/pipelineJobs/metrics-visualization-pipeline-1008-20220405162340 current state:\n",
152 | "PipelineState.PIPELINE_STATE_RUNNING\n",
153 | "INFO:google.cloud.aiplatform.pipeline_jobs:PipelineJob projects/141610882258/locations/us-central1/pipelineJobs/metrics-visualization-pipeline-1008-20220405162340 current state:\n",
154 | "PipelineState.PIPELINE_STATE_RUNNING\n",
155 | "INFO:google.cloud.aiplatform.pipeline_jobs:PipelineJob projects/141610882258/locations/us-central1/pipelineJobs/metrics-visualization-pipeline-1008-20220405162340 current state:\n",
156 | "PipelineState.PIPELINE_STATE_RUNNING\n",
157 | "INFO:google.cloud.aiplatform.pipeline_jobs:PipelineJob projects/141610882258/locations/us-central1/pipelineJobs/metrics-visualization-pipeline-1008-20220405162340 current state:\n",
158 | "PipelineState.PIPELINE_STATE_RUNNING\n",
159 | "INFO:google.cloud.aiplatform.pipeline_jobs:PipelineJob run completed. Resource name: projects/141610882258/locations/us-central1/pipelineJobs/metrics-visualization-pipeline-1008-20220405162340\n"
160 | ]
161 | }
162 | ],
163 | "source": [
164 | "# Instantiate PipelineJob object\n",
165 | "pl = aiplatform.PipelineJob(\n",
166 | " display_name=\"Mark-Html\",\n",
167 | "\n",
168 | " # Whether or not to enable caching\n",
169 | " # True = always cache pipeline step result\n",
170 | " # False = never cache pipeline step result\n",
171 | " # None = defer to cache option for each pipeline component in the pipeline definition\n",
172 | " enable_caching=True,\n",
173 | "\n",
174 | " # Local or GCS path to a compiled pipeline definition\n",
175 | " template_path='metrics_visualization_pipeline.json',\n",
176 | "\n",
177 | " # Dictionary containing input parameters for your pipeline\n",
178 | " parameter_values={},\n",
179 | "\n",
180 | " # GCS path to act as the pipeline root\n",
181 | " pipeline_root=BUCKET_URI,\n",
182 | ")\n",
183 | "\n",
184 | "# Execute pipeline in Vertex AI and monitor until completion\n",
185 | "pl.run(\n",
186 | " # Email address of service account to use for the pipeline run\n",
187 | " # You must have iam.serviceAccounts.actAs permission on the service account to use it\n",
188 | " #service_account=service_account,\n",
189 | "\n",
190 | " # Whether this function call should be synchronous (wait for pipeline run to finish before terminating)\n",
191 | " # or asynchronous (return immediately)\n",
192 | " sync=False\n",
193 | ")"
194 | ]
195 | },
196 | {
197 | "cell_type": "code",
198 | "execution_count": null,
199 | "id": "87cb7ab3-cab9-44a9-8579-144d79fb3624",
200 | "metadata": {},
201 | "outputs": [],
202 | "source": []
203 | }
204 | ],
205 | "metadata": {
206 | "kernelspec": {
207 | "display_name": "Python 3 (ipykernel)",
208 | "language": "python",
209 | "name": "python3"
210 | },
211 | "language_info": {
212 | "codemirror_mode": {
213 | "name": "ipython",
214 | "version": 3
215 | },
216 | "file_extension": ".py",
217 | "mimetype": "text/x-python",
218 | "name": "python",
219 | "nbconvert_exporter": "python",
220 | "pygments_lexer": "ipython3",
221 | "version": "3.9.4"
222 | }
223 | },
224 | "nbformat": 4,
225 | "nbformat_minor": 5
226 | }
227 |
--------------------------------------------------------------------------------
/AutoML pipeline - to_fix.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 148,
6 | "id": "e55c8fcd-71cd-470d-ada9-bbce0152ac98",
7 | "metadata": {},
8 | "outputs": [
9 | {
10 | "name": "stderr",
11 | "output_type": "stream",
12 | "text": [
13 | "E0405 21:09:24.952613000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n",
14 | "E0405 21:09:26.987338000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n",
15 | "E0405 21:09:28.486340000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n",
16 | "E0405 21:09:31.298611000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n",
17 | "E0405 21:09:32.584272000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n",
18 | "E0405 21:09:34.148631000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n"
19 | ]
20 | }
21 | ],
22 | "source": [
23 | "%%capture\n",
24 | "!pip3 install --upgrade google-cloud-aiplatform\n",
25 | "!pip3 install --upgrade kfp\n",
26 | "!pip3 install --upgrade google-cloud-pipeline-components\n",
27 | "!pip3 install scikit-learn\n",
28 | "!pip3 install pandas\n",
29 | "!pip3 install catboost"
30 | ]
31 | },
32 | {
33 | "cell_type": "markdown",
34 | "id": "a61f61dd-f7f2-4a2a-97dc-3c29d7360c82",
35 | "metadata": {},
36 | "source": [
37 | "### Good resources for custom components\n",
38 | "https://github.com/googleapis/python-aiplatform/tree/main/samples/model-builder\n",
39 | "\n",
40 | "https://github.com/GoogleCloudPlatform/vertex-ai-samples\n",
41 | "\n",
42 | "https://googleapis.dev/python/aiplatform/latest/aiplatform.html"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": null,
48 | "id": "d10e3a35-d9e5-4171-8cf7-d3ecca9cc44e",
49 | "metadata": {},
50 | "outputs": [],
51 | "source": [
52 | "import IPython\n",
53 | "app = IPython.Application.instance()\n",
54 | "app.kernel.do_shutdown(True)"
55 | ]
56 | },
57 | {
58 | "cell_type": "code",
59 | "execution_count": 1,
60 | "id": "b48148fb-0cd6-4d57-b745-d57de9bb6ae9",
61 | "metadata": {},
62 | "outputs": [],
63 | "source": [
64 | "import google.cloud.aiplatform as vertex\n",
65 | "import kfp\n",
66 | "from kfp.v2.dsl import (component, Artifact, Dataset, Input, InputPath, Model, Output, OutputPath, ClassificationMetrics, Metrics)"
67 | ]
68 | },
69 | {
70 | "cell_type": "markdown",
71 | "id": "9dda4133-2220-41f8-ad6f-cb0243887ff1",
72 | "metadata": {},
73 | "source": [
74 | "https://kubeflow-pipelines.readthedocs.io/en/latest/source/kfp.dsl.html\n",
75 | "\n",
76 | "https://pypi.org/project/google-cloud-aiplatform/\n",
77 | "\n",
78 | "https://cloud.google.com/python/docs/reference/aiplatform/latest/google.cloud.aiplatform"
79 | ]
80 | },
81 | {
82 | "cell_type": "code",
83 | "execution_count": 2,
84 | "id": "4043be60-84f5-4aa5-92c3-80bbe2f58759",
85 | "metadata": {},
86 | "outputs": [
87 | {
88 | "name": "stdout",
89 | "output_type": "stream",
90 | "text": [
91 | "Updated property [core/project].\n",
92 | "\n",
93 | "\n",
94 | "Updates are available for some Cloud SDK components. To install them,\n",
95 | "please run:\n",
96 | " $ gcloud components update\n",
97 | "\n",
98 | "\n",
99 | "\n",
100 | "To take a quick anonymous survey, run:\n",
101 | " $ gcloud survey\n",
102 | "\n",
103 | "Creating gs://test-fast/...\n",
104 | "ServiceException: 409 A Cloud Storage bucket named 'test-fast' already exists. Try another name. Bucket names must be globally unique across all Google Cloud projects, including those outside of your organization.\n",
105 | " 1552 2022-03-24T21:14:19Z gs://test-fast/aiplatform-2022-03-24-21:14:19.320-aiplatform_custom_trainer_script-0.1.tar.gz#1648156459408486 metageneration=1\n",
106 | " 1774 2022-03-27T08:32:44Z gs://test-fast/aiplatform-2022-03-27-11:32:43.707-aiplatform_custom_trainer_script-0.1.tar.gz#1648369964419591 metageneration=1\n",
107 | " 60 2021-11-14T15:38:56Z gs://test-fast/batch_test.csv#1636904336323978 metageneration=1\n",
108 | " 52 2021-11-14T16:14:44Z gs://test-fast/batch_test1.csv#1636906484597636 metageneration=1\n",
109 | " 4551 2022-04-05T20:08:54Z gs://test-fast/finalized_model.sav#1649189334168342 metageneration=1\n",
110 | " 2105688 2022-04-05T19:53:51Z gs://test-fast/model#1649188431248263 metageneration=1\n",
111 | " 2105848 2022-04-05T19:40:15Z gs://test-fast/storage-object-name#1649187615058728 metageneration=1\n",
112 | " gs://test-fast/141610882258/\n",
113 | " gs://test-fast/aiplatform-custom-training-2022-03-24-21:14:19.437/\n",
114 | " gs://test-fast/aiplatform-custom-training-2022-03-27-11:32:44.390/\n",
115 | " gs://test-fast/census/\n",
116 | " gs://test-fast/data/\n",
117 | " gs://test-fast/executor_files/\n",
118 | " gs://test-fast/prediction-fast-test-12-2021_11_14T07_54_09_554Z/\n",
119 | " gs://test-fast/prediction-fast-test-12-2021_11_14T08_41_08_653Z/\n",
120 | " gs://test-fast/prediction-fast-test-12-2021_11_14T11_37_18_583Z/\n",
121 | " gs://test-fast/prediction-fast-test-12-2022_02_21T00_25_18_548Z/\n",
122 | "TOTAL: 7 objects, 4219525 bytes (4.02 MiB)\n"
123 | ]
124 | }
125 | ],
126 | "source": [
127 | "PROJECT_ID = \"\" \n",
128 | "PROJECT_NUMBER = \"\" \n",
129 | "REGION = \"us-central1\" \n",
130 | "BUCKET_NAME = \"\" \n",
131 | "BUCKET_URI = f\"gs://{BUCKET_NAME}\"\n",
132 | "\n",
133 | "! gcloud config set project $PROJECT_ID\n",
134 | "\n",
135 | "!gsutil mb -l $REGION $BUCKET_URI\n",
136 | "!gsutil ls -al $BUCKET_URI"
137 | ]
138 | },
139 | {
140 | "cell_type": "code",
141 | "execution_count": 3,
142 | "id": "e34c6144-e2e9-450e-a93c-397aa5228572",
143 | "metadata": {},
144 | "outputs": [],
145 | "source": [
146 | "vertex.init(\n",
147 | " # your Google Cloud Project ID or number\n",
148 | " # environment default used is not set\n",
149 | " project=,\n",
150 | "\n",
151 | " # the Vertex AI region you will use\n",
152 | " # defaults to us-central1\n",
153 | " location=REGION,\n",
154 | "\n",
155 | " # Google Cloud Storage bucket in same region as location\n",
156 | " # used to stage artifacts\n",
157 | " staging_bucket=BUCKET_URI,\n",
158 | "\n",
159 | " # the name of the experiment to use to track\n",
160 | " # logged metrics and parameters\n",
161 | " experiment=,\n",
162 | "\n",
163 | " # description of the experiment above\n",
164 | " experiment_description='my experiment description'\n",
165 | ")"
166 | ]
167 | },
168 | {
169 | "cell_type": "markdown",
170 | "id": "d8a7a6d4-7503-4308-97dc-65db97729a72",
171 | "metadata": {},
172 | "source": [
173 | "https://pypi.org/project/google-cloud-aiplatform/"
174 | ]
175 | },
176 | {
177 | "cell_type": "markdown",
178 | "id": "031d3479-d4ce-4484-baa6-d428d819f6ae",
179 | "metadata": {},
180 | "source": [
181 | "# AutoML training job\n",
182 | "AutoML can be used to automatically train a wide variety of image model types. AutoML automates the following:\n",
183 | "\n",
184 | "* Dataset preprocessing\n",
185 | "* Feature Engineering\n",
186 | "* Data feeding\n",
187 | "* Model Architecture selection\n",
188 | "* Hyperparameter tuning\n",
189 | "* Training the model"
190 | ]
191 | },
192 | {
193 | "cell_type": "code",
194 | "execution_count": 361,
195 | "id": "b469683f-deed-4619-a37c-54ddc3a859ef",
196 | "metadata": {},
197 | "outputs": [
198 | {
199 | "ename": "IndentationError",
200 | "evalue": "expected an indented block (4169501160.py, line 4)",
201 | "output_type": "error",
202 | "traceback": [
203 | "\u001b[0;36m Input \u001b[0;32mIn [361]\u001b[0;36m\u001b[0m\n\u001b[0;31m @component()\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m expected an indented block\n"
204 | ]
205 | }
206 | ],
207 | "source": [
208 | "@component()\n",
209 | "def create_dataset():\n",
210 | " \n",
211 | "@component()\n",
212 | "def train():\n",
213 | " \n",
214 | "@component()\n",
215 | "def evaluate():\n",
216 | " \n",
217 | "@component()\n",
218 | "def deploy():\n",
219 | " "
220 | ]
221 | },
222 | {
223 | "cell_type": "code",
224 | "execution_count": 4,
225 | "id": "6ed640c7-54d3-4a3c-90d9-beaa68cbb78b",
226 | "metadata": {},
227 | "outputs": [],
228 | "source": [
229 | "@component(packages_to_install=[\"google-cloud-aiplatform\"])\n",
230 | "def create_tabular_dataset() -> str:\n",
231 | " \n",
232 | " import google.cloud.aiplatform as vertex\n",
233 | "\n",
234 | " vertex.init(project='kubeflow-demos',\n",
235 | " location='us-central1',\n",
236 | " staging_bucket='gs://test-fast/',\n",
237 | " experiment='my-experiment',\n",
238 | " experiment_description='my experiment description')\n",
239 | " \n",
240 | " bq_source = f'bq://kubeflow-demos.flowers.iris'\n",
241 | " \n",
242 | " #TODO: Missing dataset creation\n",
243 | " \n",
244 | " dataset.wait()\n",
245 | "\n",
246 | " print(f'\\tDataset: \"{dataset.display_name}\"')\n",
247 | " print(f'\\tname: \"{dataset.resource_name}\"')\n",
248 | " \n",
249 | " return dataset.resource_name\n",
250 | "\n",
251 | "@component(packages_to_install=[\"google-cloud-aiplatform\"])\n",
252 | "def train_autoML_tabular(dataset_resource: str) -> str:\n",
253 | " \n",
254 | " import google.cloud.aiplatform as vertex\n",
255 | "\n",
256 | " vertex.init(project='kubeflow-demos',\n",
257 | " location='us-central1',\n",
258 | " staging_bucket='gs://test-fast/',\n",
259 | " experiment='my-experiment',\n",
260 | " experiment_description='my experiment description')\n",
261 | " \n",
262 | " job = vertex.AutoMLTabularTrainingJob(\n",
263 | " display_name=\"flowers\",\n",
264 | " optimization_prediction_type=\"classification\",\n",
265 | " column_specs={\"petal_length\": \"auto\",\n",
266 | " \"petal_width\": \"auto\",\n",
267 | " \"sepal_length\": \"auto\",\n",
268 | " \"sepal_width\": \"auto\",\n",
269 | " \"species\": \"auto\"})\n",
270 | "\n",
271 | " print(job)\n",
272 | "\n",
273 | " #TODO: missing stuff\n",
274 | " flower_dataset = \n",
275 | "\n",
276 | " model = job.run(dataset=flower_dataset,\n",
277 | " target_column=\"species\")\n",
278 | " \n",
279 | " model.wait()\n",
280 | " \n",
281 | " print(model.resource_name)\n",
282 | " \n",
283 | " return model.resource_name\n",
284 | " \n",
285 | "@component(packages_to_install=[\"google-cloud-aiplatform\", \"google-cloud-storage\", \"catboost\", \"sklearn\"])\n",
286 | "def train_catboost():\n",
287 | " print(\"train\")\n",
288 | " import sklearn\n",
289 | " from sklearn import datasets\n",
290 | " iris = sklearn.datasets.load_iris()\n",
291 | "\n",
292 | " import catboost\n",
293 | " \n",
294 | " #TODO: Train catboost model\n",
295 | "\n",
296 | " from google.cloud import storage\n",
297 | "\n",
298 | " \"\"\"Uploads a file to the bucket.\"\"\"\n",
299 | " # The ID of your GCS bucket\n",
300 | " bucket_name = \"test-fast\"\n",
301 | " # The path to your file to upload\n",
302 | " source_file_name = FILE_PATH\n",
303 | " # The ID of your GCS object\n",
304 | " destination_blob_name = FILE_PATH\n",
305 | "\n",
306 | " storage_client = storage.Client()\n",
307 | " bucket = storage_client.bucket(bucket_name)\n",
308 | " blob = bucket.blob(destination_blob_name)\n",
309 | "\n",
310 | " blob.upload_from_filename(source_file_name)\n",
311 | "\n",
312 | " print(\n",
313 | " \"File {} uploaded to {}.\".format(\n",
314 | " source_file_name, \"gs://\" + destination_blob_name\n",
315 | " )\n",
316 | " )\n",
317 | "\n",
318 | "#TODO: missing\n",
319 | "@component()\n",
320 | "def train_scikit():\n",
321 | " print(\"train\")\n",
322 | " import sklearn\n",
323 | " from sklearn.svm import SVC\n",
324 | " from sklearn import datasets\n",
325 | " iris = sklearn.datasets.load_iris()\n",
326 | "\n",
327 | " model = SVC()\n",
328 | " model.fit(iris.data, iris.target)\n",
329 | " \n",
330 | " import pickle\n",
331 | " # save the model to disk\n",
332 | " FILE_PATH = 'finalized_model.sav'\n",
333 | " pickle.dump(model, open(FILE_PATH, 'wb'))\n",
334 | " \n",
335 | " from google.cloud import storage\n",
336 | "\n",
337 | " \"\"\"Uploads a file to the bucket.\"\"\"\n",
338 | " # The ID of your GCS bucket\n",
339 | " bucket_name = \"test-fast\"\n",
340 | " # The path to your file to upload\n",
341 | " source_file_name = FILE_PATH\n",
342 | " # The ID of your GCS object\n",
343 | " destination_blob_name = FILE_PATH\n",
344 | "\n",
345 | " storage_client = storage.Client()\n",
346 | " bucket = storage_client.bucket(bucket_name)\n",
347 | " blob = bucket.blob(destination_blob_name)\n",
348 | "\n",
349 | " blob.upload_from_filename(source_file_name)\n",
350 | "\n",
351 | " print(\n",
352 | " \"File {} uploaded to {}.\".format(\n",
353 | " source_file_name, \"gs://\" + destination_blob_name\n",
354 | " )\n",
355 | " )\n",
356 | "@component(packages_to_install=[\"google-cloud-aiplatform\"])\n",
357 | "def evaluate(model_resource: str) -> str:\n",
358 | " print(\"evaluate\")\n",
359 | " \n",
360 | " import google.cloud.aiplatform as vertex\n",
361 | "\n",
362 | " vertex.init(project='kubeflow-demos',\n",
363 | " location='us-central1',\n",
364 | " staging_bucket='gs://test-fast/',\n",
365 | " experiment='my-experiment',\n",
366 | " experiment_description='my experiment description')\n",
367 | " \n",
368 | " #TODO: get model\n",
369 | " # Get model resource ID\n",
370 | " models = \n",
371 | "\n",
372 | " # Get a reference to the Model Service client\n",
373 | " client_options = {\"api_endpoint\": \"us-central1-aiplatform.googleapis.com\"}\n",
374 | " model_service_client = vertex.gapic.ModelServiceClient(client_options=client_options)\n",
375 | "\n",
376 | " model_evaluations = model_service_client.list_model_evaluations(\n",
377 | " parent=model_resource\n",
378 | " )\n",
379 | " model_evaluation = list(model_evaluations)[0]\n",
380 | " \n",
381 | " print(model_evaluation)\n",
382 | " \n",
383 | " return model_resource\n",
384 | " \n",
385 | "#TODO: missing\n",
386 | "@component(packages_to_install=[\"google-cloud-aiplatform\"])\n",
387 | "def create_endpoint_deploy_model() -> str:\n",
388 | " print(\"Endpoint\")\n",
389 | " \n",
390 | " import google.cloud.aiplatform as vertex\n",
391 | " \n",
392 | " vertex.init(project='kubeflow-demos',\n",
393 | " location='us-central1',\n",
394 | " staging_bucket='gs://test-fast/',\n",
395 | " experiment='my-experiment',\n",
396 | " experiment_description='my experiment description')\n",
397 | " \n",
398 | " endpoint = vertex.Endpoint.create(display_name=\"opti\")\n",
399 | "\n",
400 | " model = vertex.Model(model_resource)\n",
401 | "\n",
402 | " #endpoint.deploy(model=model)\n",
403 | " #endpoint.resource_name\n",
404 | " model.deploy()\n",
405 | " \n",
406 | " return \"test\"\n",
407 | "\n",
408 | "#TODO: missing\n",
409 | "@component(packages_to_install=[\"google-cloud-aiplatform\"])\n",
410 | "def batch_prediction() -> str:\n",
411 | " print(\"Batch Prediction\")\n",
412 | " \n",
413 | " import google.cloud.aiplatform as vertex\n",
414 | " \n",
415 | " vertex.init(project='kubeflow-demos',\n",
416 | " location='us-central1',\n",
417 | " staging_bucket='gs://test-fast/',\n",
418 | " experiment='my-experiment',\n",
419 | " experiment_description='my experiment description')\n",
420 | " \n",
421 | " model = vertex.Model(model_resource)\n",
422 | " #https://cloud.google.com/python/docs/reference/aiplatform/latest/google.cloud.aiplatform.Model\n",
423 | " #https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/official/migration/UJ4%20Vertex%20SDK%20AutoML%20Tabular%20Binary%20Classification.ipynb\n",
424 | " batch_predict_job = model.batch_predict(\n",
425 | " job_display_name=\"opti_\",\n",
426 | " bigquery_source = f'bq://kubeflow-demos.flowers.iris',\n",
427 | " bigquery_destination_prefix = f'bq://kubeflow-demos.flowers',\n",
428 | " sync=True)\n",
429 | "\n",
430 | " print(batch_predict_job)\n",
431 | " \n",
432 | " return \"batch is done\"\n",
433 | "\n",
434 | "@component\n",
435 | "def print_op(message: str):\n",
436 | " \"\"\"Prints a message.\"\"\"\n",
437 | " print(message)\n",
438 | "\n"
439 | ]
440 | },
441 | {
442 | "cell_type": "markdown",
443 | "id": "d9fddb45-d074-4043-8ea1-6cf2f1eb4bee",
444 | "metadata": {},
445 | "source": [
446 | "https://www.kubeflow.org/docs/components/pipelines/sdk-v2/v2-component-io/\n",
447 | "\n",
448 | "https://cloud.google.com/python/docs/reference/aiplatform/latest/google.cloud.aiplatform.AutoMLTabularTrainingJob\n",
449 | "\n",
450 | "https://cloud.google.com/vertex-ai/docs/training/automl-api\n",
451 | "\n",
452 | "https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/official/migration/UJ4%20Vertex%20SDK%20AutoML%20Tabular%20Binary%20Classification.ipynb"
453 | ]
454 | },
455 | {
456 | "cell_type": "code",
457 | "execution_count": 6,
458 | "id": "72e6cfbe-591a-4b6c-87f6-3475de4dd786",
459 | "metadata": {},
460 | "outputs": [],
461 | "source": [
462 | "@kfp.dsl.pipeline(name=\"train-opti\")\n",
463 | "def pipeline(\n",
464 | " project: str = PROJECT_ID,\n",
465 | " bucket: str = BUCKET_URI,\n",
466 | " baseline_accuracy: float = 70.0\n",
467 | "):\n",
468 | " create_tabular_dataset_task = create_tabular_dataset()\n",
469 | " create_tabular_dataset_task.set_caching_options(True)\n",
470 | " \n",
471 | " train_autoML_task = train_autoML_tabular(create_tabular_dataset_task.output)\n",
472 | " train_autoML_task.set_caching_options(True)\n",
473 | " \n",
474 | " train_catboost_task = train_catboost()\n",
475 | " train_catboost_task.set_caching_options(True)\n",
476 | " train_catboost_task.after(create_tabular_dataset_task)\n",
477 | " \n",
478 | " train_scikit_task = train_scikit()\n",
479 | " train_scikit_task.set_caching_options(False)\n",
480 | " train_scikit_task.after(create_tabular_dataset_task)\n",
481 | " \n",
482 | " evaluate_task = evaluate()\n",
483 | " evaluate_task.set_caching_options(True)\n",
484 | " evaluate_task.after(train_scikit_task)\n",
485 | " evaluate_task.after(train_catboost_task)\n",
486 | " \n",
487 | " batch_prediction_task = batch_prediction(evaluate_task.output)"
488 | ]
489 | },
490 | {
491 | "cell_type": "code",
492 | "execution_count": 7,
493 | "id": "e14ac497-112e-44f4-943e-72a9b241bead",
494 | "metadata": {},
495 | "outputs": [
496 | {
497 | "name": "stderr",
498 | "output_type": "stream",
499 | "text": [
500 | "/Users/yarkoni/projects/workshop/venv/lib/python3.9/site-packages/kfp/v2/compiler/compiler.py:1278: FutureWarning: APIs imported from the v1 namespace (e.g. kfp.dsl, kfp.components, etc) will not be supported by the v2 compiler since v2.0.0\n",
501 | " warnings.warn(\n"
502 | ]
503 | }
504 | ],
505 | "source": [
506 | "from kfp.v2 import compiler\n",
507 | "\n",
508 | "compiler.Compiler().compile(pipeline_func=pipeline, package_path=)"
509 | ]
510 | },
511 | {
512 | "cell_type": "code",
513 | "execution_count": 8,
514 | "id": "88e76ae0-3171-4e4d-ae29-220a0f14dad0",
515 | "metadata": {},
516 | "outputs": [
517 | {
518 | "name": "stdout",
519 | "output_type": "stream",
520 | "text": [
521 | "INFO:google.cloud.aiplatform.pipeline_jobs:Creating PipelineJob\n",
522 | "INFO:google.cloud.aiplatform.pipeline_jobs:PipelineJob created. Resource name: projects/141610882258/locations/us-central1/pipelineJobs/train-opti-20220428113336\n",
523 | "INFO:google.cloud.aiplatform.pipeline_jobs:To use this PipelineJob in another session:\n",
524 | "INFO:google.cloud.aiplatform.pipeline_jobs:pipeline_job = aiplatform.PipelineJob.get('projects/141610882258/locations/us-central1/pipelineJobs/train-opti-20220428113336')\n",
525 | "INFO:google.cloud.aiplatform.pipeline_jobs:View Pipeline Job:\n",
526 | "https://console.cloud.google.com/vertex-ai/locations/us-central1/pipelines/runs/train-opti-20220428113336?project=141610882258\n",
527 | "INFO:google.cloud.aiplatform.pipeline_jobs:PipelineJob run completed. Resource name: projects/141610882258/locations/us-central1/pipelineJobs/train-opti-20220428113336\n"
528 | ]
529 | }
530 | ],
531 | "source": [
532 | "# Instantiate PipelineJob object\n",
533 | "vertex_pipeline_job = ai_magic.PipelineJob(\n",
534 | " display_name=\"test-opti\",\n",
535 | "\n",
536 | " # Whether or not to enable caching\n",
537 | " # True = always cache pipeline step result\n",
538 | " # False = never cache pipeline step result\n",
539 | " # None = defer to cache option for each pipeline component in the pipeline definition\n",
540 | " enable_caching=True,\n",
541 | "\n",
542 | " # Local or GCS path to a compiled pipeline definition\n",
543 | " template_path=\"pipeline-dag.json\",\n",
544 | "\n",
545 | " # Dictionary containing input parameters for your pipeline\n",
546 | " parameter_values={\"sdffsdfds\":\"sdfsdf\"},\n",
547 | "\n",
548 | " # GCS path to act as the pipeline root\n",
549 | " pipeline_root=BUCKET_URI,\n",
550 | ")\n",
551 | "\n",
552 | "# Execute pipeline in Vertex AI and monitor until completion\n",
553 | "ai_magic_false.run(\n",
554 | " # Email address of service account to use for the pipeline run\n",
555 | " # You must have iam.serviceAccounts.actAs permission on the service account to use it\n",
556 | " #service_account=service_account,\n",
557 | "\n",
558 | " # Whether this function call should be synchronous (wait for pipeline run to finish before terminating)\n",
559 | " # or asynchronous (return immediately)\n",
560 | " sync=False\n",
561 | ")"
562 | ]
563 | },
564 | {
565 | "cell_type": "code",
566 | "execution_count": 357,
567 | "id": "79bdbf98-57bc-4c17-9671-1d0832e571e7",
568 | "metadata": {},
569 | "outputs": [
570 | {
571 | "name": "stderr",
572 | "output_type": "stream",
573 | "text": [
574 | "E0407 13:49:19.734209000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n"
575 | ]
576 | }
577 | ],
578 | "source": [
579 | "jobs = vertex.PipelineJob.list()"
580 | ]
581 | },
582 | {
583 | "cell_type": "markdown",
584 | "id": "82858c6c-ebd7-4cef-b29a-3ae2665be848",
585 | "metadata": {},
586 | "source": [
587 | "### Or simply use the premade components \n",
588 | "https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/official/pipelines/google_cloud_pipeline_components_automl_images.ipynb\n",
589 | "\n",
590 | "https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/official/pipelines/automl_tabular_classification_beans.ipynb"
591 | ]
592 | },
593 | {
594 | "cell_type": "markdown",
595 | "id": "5b6f47b3-b11c-4855-9a20-638dbed91ff9",
596 | "metadata": {},
597 | "source": [
598 | "### Adding batch capabilities\n",
599 | "https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/community/gapic/automl/showcase_automl_image_classification_batch.ipynb\n"
600 | ]
601 | }
602 | ],
603 | "metadata": {
604 | "kernelspec": {
605 | "display_name": "Python 3 (ipykernel)",
606 | "language": "python",
607 | "name": "python3"
608 | },
609 | "language_info": {
610 | "codemirror_mode": {
611 | "name": "ipython",
612 | "version": 3
613 | },
614 | "file_extension": ".py",
615 | "mimetype": "text/x-python",
616 | "name": "python",
617 | "nbconvert_exporter": "python",
618 | "pygments_lexer": "ipython3",
619 | "version": "3.9.4"
620 | }
621 | },
622 | "nbformat": 4,
623 | "nbformat_minor": 5
624 | }
625 |
--------------------------------------------------------------------------------
/AutoML pipeline.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 148,
6 | "id": "e55c8fcd-71cd-470d-ada9-bbce0152ac98",
7 | "metadata": {},
8 | "outputs": [
9 | {
10 | "name": "stderr",
11 | "output_type": "stream",
12 | "text": [
13 | "E0405 21:09:24.952613000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n",
14 | "E0405 21:09:26.987338000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n",
15 | "E0405 21:09:28.486340000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n",
16 | "E0405 21:09:31.298611000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n",
17 | "E0405 21:09:32.584272000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n",
18 | "E0405 21:09:34.148631000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n"
19 | ]
20 | }
21 | ],
22 | "source": [
23 | "%%capture\n",
24 | "!pip3 install --upgrade google-cloud-aiplatform\n",
25 | "!pip3 install --upgrade kfp\n",
26 | "!pip3 install --upgrade google-cloud-pipeline-components\n",
27 | "!pip3 install scikit-learn\n",
28 | "!pip3 install pandas\n",
29 | "!pip3 install catboost"
30 | ]
31 | },
32 | {
33 | "cell_type": "markdown",
34 | "id": "a61f61dd-f7f2-4a2a-97dc-3c29d7360c82",
35 | "metadata": {},
36 | "source": [
37 | "### Good resources for custom components\n",
38 | "https://github.com/googleapis/python-aiplatform/tree/main/samples/model-builder\n",
39 | "\n",
40 | "https://github.com/GoogleCloudPlatform/vertex-ai-samples\n",
41 | "\n",
42 | "https://googleapis.dev/python/aiplatform/latest/aiplatform.html"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": null,
48 | "id": "d10e3a35-d9e5-4171-8cf7-d3ecca9cc44e",
49 | "metadata": {},
50 | "outputs": [],
51 | "source": [
52 | "import IPython\n",
53 | "app = IPython.Application.instance()\n",
54 | "app.kernel.do_shutdown(True)"
55 | ]
56 | },
57 | {
58 | "cell_type": "code",
59 | "execution_count": 1,
60 | "id": "b48148fb-0cd6-4d57-b745-d57de9bb6ae9",
61 | "metadata": {},
62 | "outputs": [],
63 | "source": [
64 | "import google.cloud.aiplatform as vertex\n",
65 | "import kfp\n",
66 | "from kfp.v2.dsl import (component, Artifact, Dataset, Input, InputPath, Model, Output, OutputPath, ClassificationMetrics, Metrics)"
67 | ]
68 | },
69 | {
70 | "cell_type": "markdown",
71 | "id": "9dda4133-2220-41f8-ad6f-cb0243887ff1",
72 | "metadata": {},
73 | "source": [
74 | "https://kubeflow-pipelines.readthedocs.io/en/latest/source/kfp.dsl.html\n",
75 | "\n",
76 | "https://pypi.org/project/google-cloud-aiplatform/\n",
77 | "\n",
78 | "https://cloud.google.com/python/docs/reference/aiplatform/latest/google.cloud.aiplatform"
79 | ]
80 | },
81 | {
82 | "cell_type": "code",
83 | "execution_count": 2,
84 | "id": "4043be60-84f5-4aa5-92c3-80bbe2f58759",
85 | "metadata": {},
86 | "outputs": [
87 | {
88 | "name": "stdout",
89 | "output_type": "stream",
90 | "text": [
91 | "Updated property [core/project].\n",
92 | "\n",
93 | "\n",
94 | "Updates are available for some Cloud SDK components. To install them,\n",
95 | "please run:\n",
96 | " $ gcloud components update\n",
97 | "\n",
98 | "\n",
99 | "\n",
100 | "To take a quick anonymous survey, run:\n",
101 | " $ gcloud survey\n",
102 | "\n",
103 | "Creating gs://test-fast/...\n",
104 | "ServiceException: 409 A Cloud Storage bucket named 'test-fast' already exists. Try another name. Bucket names must be globally unique across all Google Cloud projects, including those outside of your organization.\n",
105 | " 1552 2022-03-24T21:14:19Z gs://test-fast/aiplatform-2022-03-24-21:14:19.320-aiplatform_custom_trainer_script-0.1.tar.gz#1648156459408486 metageneration=1\n",
106 | " 1774 2022-03-27T08:32:44Z gs://test-fast/aiplatform-2022-03-27-11:32:43.707-aiplatform_custom_trainer_script-0.1.tar.gz#1648369964419591 metageneration=1\n",
107 | " 60 2021-11-14T15:38:56Z gs://test-fast/batch_test.csv#1636904336323978 metageneration=1\n",
108 | " 52 2021-11-14T16:14:44Z gs://test-fast/batch_test1.csv#1636906484597636 metageneration=1\n",
109 | " 4551 2022-04-05T20:08:54Z gs://test-fast/finalized_model.sav#1649189334168342 metageneration=1\n",
110 | " 2105688 2022-04-05T19:53:51Z gs://test-fast/model#1649188431248263 metageneration=1\n",
111 | " 2105848 2022-04-05T19:40:15Z gs://test-fast/storage-object-name#1649187615058728 metageneration=1\n",
112 | " gs://test-fast/141610882258/\n",
113 | " gs://test-fast/aiplatform-custom-training-2022-03-24-21:14:19.437/\n",
114 | " gs://test-fast/aiplatform-custom-training-2022-03-27-11:32:44.390/\n",
115 | " gs://test-fast/census/\n",
116 | " gs://test-fast/data/\n",
117 | " gs://test-fast/executor_files/\n",
118 | " gs://test-fast/prediction-fast-test-12-2021_11_14T07_54_09_554Z/\n",
119 | " gs://test-fast/prediction-fast-test-12-2021_11_14T08_41_08_653Z/\n",
120 | " gs://test-fast/prediction-fast-test-12-2021_11_14T11_37_18_583Z/\n",
121 | " gs://test-fast/prediction-fast-test-12-2022_02_21T00_25_18_548Z/\n",
122 | "TOTAL: 7 objects, 4219525 bytes (4.02 MiB)\n"
123 | ]
124 | }
125 | ],
126 | "source": [
127 | "PROJECT_ID = \"kubeflow-demos\" \n",
128 | "PROJECT_NUMBER = \"141610882258\" \n",
129 | "REGION = \"us-central1\" \n",
130 | "BUCKET_NAME = \"test-fast\" \n",
131 | "BUCKET_URI = f\"gs://{BUCKET_NAME}\"\n",
132 | "\n",
133 | "! gcloud config set project $PROJECT_ID\n",
134 | "\n",
135 | "!gsutil mb -l $REGION $BUCKET_URI\n",
136 | "!gsutil ls -al $BUCKET_URI"
137 | ]
138 | },
139 | {
140 | "cell_type": "code",
141 | "execution_count": 3,
142 | "id": "e34c6144-e2e9-450e-a93c-397aa5228572",
143 | "metadata": {},
144 | "outputs": [],
145 | "source": [
146 | "vertex.init(\n",
147 | " # your Google Cloud Project ID or number\n",
148 | " # environment default used is not set\n",
149 | " project=PROJECT_ID,\n",
150 | "\n",
151 | " # the Vertex AI region you will use\n",
152 | " # defaults to us-central1\n",
153 | " location=REGION,\n",
154 | "\n",
155 | " # Google Cloud Storage bucket in same region as location\n",
156 | " # used to stage artifacts\n",
157 | " staging_bucket=BUCKET_URI,\n",
158 | "\n",
159 | " # the name of the experiment to use to track\n",
160 | " # logged metrics and parameters\n",
161 | " experiment='my-experiment',\n",
162 | "\n",
163 | " # description of the experiment above\n",
164 | " experiment_description='my experiment description'\n",
165 | ")"
166 | ]
167 | },
168 | {
169 | "cell_type": "markdown",
170 | "id": "d8a7a6d4-7503-4308-97dc-65db97729a72",
171 | "metadata": {},
172 | "source": [
173 | "https://pypi.org/project/google-cloud-aiplatform/"
174 | ]
175 | },
176 | {
177 | "cell_type": "markdown",
178 | "id": "031d3479-d4ce-4484-baa6-d428d819f6ae",
179 | "metadata": {},
180 | "source": [
181 | "# AutoML training job\n",
182 | "AutoML can be used to automatically train a wide variety of image model types. AutoML automates the following:\n",
183 | "\n",
184 | "* Dataset preprocessing\n",
185 | "* Feature Engineering\n",
186 | "* Data feeding\n",
187 | "* Model Architecture selection\n",
188 | "* Hyperparameter tuning\n",
189 | "* Training the model"
190 | ]
191 | },
192 | {
193 | "cell_type": "code",
194 | "execution_count": 361,
195 | "id": "b469683f-deed-4619-a37c-54ddc3a859ef",
196 | "metadata": {},
197 | "outputs": [
198 | {
199 | "ename": "IndentationError",
200 | "evalue": "expected an indented block (4169501160.py, line 4)",
201 | "output_type": "error",
202 | "traceback": [
203 | "\u001b[0;36m Input \u001b[0;32mIn [361]\u001b[0;36m\u001b[0m\n\u001b[0;31m @component()\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m expected an indented block\n"
204 | ]
205 | }
206 | ],
207 | "source": [
208 | "@component()\n",
209 | "def create_dataset():\n",
210 | " \n",
211 | "@component()\n",
212 | "def train():\n",
213 | " \n",
214 | "@component()\n",
215 | "def evaluate():\n",
216 | " \n",
217 | "@component()\n",
218 | "def deploy():\n",
219 | " "
220 | ]
221 | },
222 | {
223 | "cell_type": "code",
224 | "execution_count": 4,
225 | "id": "6ed640c7-54d3-4a3c-90d9-beaa68cbb78b",
226 | "metadata": {},
227 | "outputs": [],
228 | "source": [
229 | "@component(packages_to_install=[\"google-cloud-aiplatform\"])\n",
230 | "def create_tabular_dataset() -> str:\n",
231 | " \n",
232 | " import google.cloud.aiplatform as vertex\n",
233 | "\n",
234 | " vertex.init(project='kubeflow-demos',\n",
235 | " location='us-central1',\n",
236 | " staging_bucket='gs://test-fast/',\n",
237 | " experiment='my-experiment',\n",
238 | " experiment_description='my experiment description')\n",
239 | " \n",
240 | " bq_source = f'bq://kubeflow-demos.flowers.iris'\n",
241 | "\n",
242 | " dataset = vertex.TabularDataset.create(display_name='iris', bq_source=bq_source,)\n",
243 | "\n",
244 | " dataset.wait()\n",
245 | "\n",
246 | " print(f'\\tDataset: \"{dataset.display_name}\"')\n",
247 | " print(f'\\tname: \"{dataset.resource_name}\"')\n",
248 | " \n",
249 | " return dataset.resource_name\n",
250 | "\n",
251 | "@component(packages_to_install=[\"google-cloud-aiplatform\"])\n",
252 | "def train_autoML_tabular(dataset_resource: str) -> str:\n",
253 | " \n",
254 | " import google.cloud.aiplatform as vertex\n",
255 | "\n",
256 | " vertex.init(project='kubeflow-demos',\n",
257 | " location='us-central1',\n",
258 | " staging_bucket='gs://test-fast/',\n",
259 | " experiment='my-experiment',\n",
260 | " experiment_description='my experiment description')\n",
261 | " \n",
262 | " job = vertex.AutoMLTabularTrainingJob(\n",
263 | " display_name=\"flowers\",\n",
264 | " optimization_prediction_type=\"classification\",\n",
265 | " column_specs={\"petal_length\": \"auto\",\n",
266 | " \"petal_width\": \"auto\",\n",
267 | " \"sepal_length\": \"auto\",\n",
268 | " \"sepal_width\": \"auto\",\n",
269 | " \"species\": \"auto\"})\n",
270 | "\n",
271 | " print(job)\n",
272 | "\n",
273 | " flower_dataset = vertex.TabularDataset(dataset_resource)\n",
274 | "\n",
275 | " model = job.run(dataset=flower_dataset,\n",
276 | " model_display_name=\"flowers\",\n",
277 | " training_fraction_split=0.8,\n",
278 | " validation_fraction_split=0.1,\n",
279 | " test_fraction_split=0.1,\n",
280 | " budget_milli_node_hours=1000,\n",
281 | " disable_early_stopping=False,\n",
282 | " target_column=\"species\")\n",
283 | " \n",
284 | " model.wait()\n",
285 | " \n",
286 | " print(model.resource_name)\n",
287 | " \n",
288 | " return model.resource_name\n",
289 | " \n",
290 | "@component(packages_to_install=[\"google-cloud-aiplatform\", \"google-cloud-storage\", \"catboost\", \"sklearn\"])\n",
291 | "def train_catboost():\n",
292 | " print(\"train\")\n",
293 | " import sklearn\n",
294 | " from sklearn import datasets\n",
295 | " iris = sklearn.datasets.load_iris()\n",
296 | "\n",
297 | " import catboost\n",
298 | " model = catboost.CatBoostClassifier(loss_function='MultiClass')\n",
299 | "\n",
300 | " model.fit(iris.data, iris.target)\n",
301 | " FILE_PATH = \"model\"\n",
302 | " model.save_model(FILE_PATH)\n",
303 | "\n",
304 | " from_file = catboost.CatBoostClassifier()\n",
305 | "\n",
306 | " from google.cloud import storage\n",
307 | "\n",
308 | " \"\"\"Uploads a file to the bucket.\"\"\"\n",
309 | " # The ID of your GCS bucket\n",
310 | " bucket_name = \"test-fast\"\n",
311 | " # The path to your file to upload\n",
312 | " source_file_name = FILE_PATH\n",
313 | " # The ID of your GCS object\n",
314 | " destination_blob_name = FILE_PATH\n",
315 | "\n",
316 | " storage_client = storage.Client()\n",
317 | " bucket = storage_client.bucket(bucket_name)\n",
318 | " blob = bucket.blob(destination_blob_name)\n",
319 | "\n",
320 | " blob.upload_from_filename(source_file_name)\n",
321 | "\n",
322 | " print(\n",
323 | " \"File {} uploaded to {}.\".format(\n",
324 | " source_file_name, \"gs://\" + destination_blob_name\n",
325 | " )\n",
326 | " )\n",
327 | "\n",
328 | " \n",
329 | "@component(packages_to_install=[\"google-cloud-aiplatform\", \"google-cloud-storage\", \"sklearn\"])\n",
330 | "def train_scikit():\n",
331 | " print(\"train\")\n",
332 | " import sklearn\n",
333 | " from sklearn.svm import SVC\n",
334 | " from sklearn import datasets\n",
335 | " iris = sklearn.datasets.load_iris()\n",
336 | "\n",
337 | " model = SVC()\n",
338 | " model.fit(iris.data, iris.target)\n",
339 | " \n",
340 | " import pickle\n",
341 | " # save the model to disk\n",
342 | " FILE_PATH = 'finalized_model.sav'\n",
343 | " pickle.dump(model, open(FILE_PATH, 'wb'))\n",
344 | " \n",
345 | " from google.cloud import storage\n",
346 | "\n",
347 | " \"\"\"Uploads a file to the bucket.\"\"\"\n",
348 | " # The ID of your GCS bucket\n",
349 | " bucket_name = \"test-fast\"\n",
350 | " # The path to your file to upload\n",
351 | " source_file_name = FILE_PATH\n",
352 | " # The ID of your GCS object\n",
353 | " destination_blob_name = FILE_PATH\n",
354 | "\n",
355 | " storage_client = storage.Client()\n",
356 | " bucket = storage_client.bucket(bucket_name)\n",
357 | " blob = bucket.blob(destination_blob_name)\n",
358 | "\n",
359 | " blob.upload_from_filename(source_file_name)\n",
360 | "\n",
361 | " print(\n",
362 | " \"File {} uploaded to {}.\".format(\n",
363 | " source_file_name, \"gs://\" + destination_blob_name\n",
364 | " )\n",
365 | " )\n",
366 | "@component(packages_to_install=[\"google-cloud-aiplatform\"])\n",
367 | "def evaluate(model_resource: str) -> str:\n",
368 | " print(\"evaluate\")\n",
369 | " \n",
370 | " import google.cloud.aiplatform as vertex\n",
371 | "\n",
372 | " vertex.init(project='kubeflow-demos',\n",
373 | " location='us-central1',\n",
374 | " staging_bucket='gs://test-fast/',\n",
375 | " experiment='my-experiment',\n",
376 | " experiment_description='my experiment description')\n",
377 | " \n",
378 | " # Get model resource ID\n",
379 | " models = vertex.Model(model_resource)\n",
380 | "\n",
381 | " # Get a reference to the Model Service client\n",
382 | " client_options = {\"api_endpoint\": \"us-central1-aiplatform.googleapis.com\"}\n",
383 | " model_service_client = vertex.gapic.ModelServiceClient(client_options=client_options)\n",
384 | "\n",
385 | " model_evaluations = model_service_client.list_model_evaluations(\n",
386 | " parent=model_resource\n",
387 | " )\n",
388 | " model_evaluation = list(model_evaluations)[0]\n",
389 | " \n",
390 | " print(model_evaluation)\n",
391 | " \n",
392 | " return model_resource\n",
393 | " \n",
394 | "@component(packages_to_install=[\"google-cloud-aiplatform\"])\n",
395 | "def create_endpoint_deploy_model(model_resource: str) -> str:\n",
396 | " print(\"Endpoint\")\n",
397 | " \n",
398 | " import google.cloud.aiplatform as vertex\n",
399 | " \n",
400 | " vertex.init(project='kubeflow-demos',\n",
401 | " location='us-central1',\n",
402 | " staging_bucket='gs://test-fast/',\n",
403 | " experiment='my-experiment',\n",
404 | " experiment_description='my experiment description')\n",
405 | " \n",
406 | " endpoint = vertex.Endpoint.create(display_name=\"opti\")\n",
407 | "\n",
408 | " model = vertex.Model(model_resource)\n",
409 | "\n",
410 | " #endpoint.deploy(model=model)\n",
411 | " #endpoint.resource_name\n",
412 | " model.deploy()\n",
413 | " \n",
414 | " return \"test\"\n",
415 | "\n",
416 | "@component(packages_to_install=[\"google-cloud-aiplatform\"])\n",
417 | "def batch_prediction(model_resource: str) -> str:\n",
418 | " print(\"Batch Prediction\")\n",
419 | " \n",
420 | " import google.cloud.aiplatform as vertex\n",
421 | " \n",
422 | " vertex.init(project='kubeflow-demos',\n",
423 | " location='us-central1',\n",
424 | " staging_bucket='gs://test-fast/',\n",
425 | " experiment='my-experiment',\n",
426 | " experiment_description='my experiment description')\n",
427 | " \n",
428 | " model = vertex.Model(model_resource)\n",
429 | " #https://cloud.google.com/python/docs/reference/aiplatform/latest/google.cloud.aiplatform.Model\n",
430 | " #https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/official/migration/UJ4%20Vertex%20SDK%20AutoML%20Tabular%20Binary%20Classification.ipynb\n",
431 | " batch_predict_job = model.batch_predict(\n",
432 | " job_display_name=\"opti_\",\n",
433 | " bigquery_source = f'bq://kubeflow-demos.flowers.iris',\n",
434 | " bigquery_destination_prefix = f'bq://kubeflow-demos.flowers',\n",
435 | " sync=True)\n",
436 | "\n",
437 | " print(batch_predict_job)\n",
438 | " \n",
439 | " return \"batch is done\"\n",
440 | "\n",
441 | "@component\n",
442 | "def print_op(message: str):\n",
443 | " \"\"\"Prints a message.\"\"\"\n",
444 | " print(message)\n",
445 | "\n"
446 | ]
447 | },
448 | {
449 | "cell_type": "markdown",
450 | "id": "d9fddb45-d074-4043-8ea1-6cf2f1eb4bee",
451 | "metadata": {},
452 | "source": [
453 | "https://www.kubeflow.org/docs/components/pipelines/sdk-v2/v2-component-io/\n",
454 | "\n",
455 | "https://cloud.google.com/python/docs/reference/aiplatform/latest/google.cloud.aiplatform.AutoMLTabularTrainingJob\n",
456 | "\n",
457 | "https://cloud.google.com/vertex-ai/docs/training/automl-api\n",
458 | "\n",
459 | "https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/official/migration/UJ4%20Vertex%20SDK%20AutoML%20Tabular%20Binary%20Classification.ipynb"
460 | ]
461 | },
462 | {
463 | "cell_type": "code",
464 | "execution_count": 6,
465 | "id": "72e6cfbe-591a-4b6c-87f6-3475de4dd786",
466 | "metadata": {},
467 | "outputs": [],
468 | "source": [
469 | "@kfp.dsl.pipeline(name=\"train-opti\")\n",
470 | "def pipeline(\n",
471 | " project: str = PROJECT_ID,\n",
472 | " bucket: str = BUCKET_URI,\n",
473 | " baseline_accuracy: float = 70.0\n",
474 | "):\n",
475 | " create_tabular_dataset_task = create_tabular_dataset()\n",
476 | " create_tabular_dataset_task.set_caching_options(True)\n",
477 | " \n",
478 | " train_autoML_task = train_autoML_tabular(create_tabular_dataset_task.output)\n",
479 | " train_autoML_task.set_caching_options(True)\n",
480 | " \n",
481 | " train_catboost_task = train_catboost()\n",
482 | " train_catboost_task.set_caching_options(True)\n",
483 | " train_catboost_task.after(create_tabular_dataset_task)\n",
484 | " \n",
485 | " train_scikit_task = train_scikit()\n",
486 | " train_scikit_task.set_caching_options(False)\n",
487 | " train_scikit_task.after(create_tabular_dataset_task)\n",
488 | " \n",
489 | " evaluate_task = evaluate(train_autoML_task.output)\n",
490 | " evaluate_task.set_caching_options(True)\n",
491 | " evaluate_task.after(train_scikit_task)\n",
492 | " evaluate_task.after(train_catboost_task)\n",
493 | " \n",
494 | " batch_prediction_task = batch_prediction(evaluate_task.output)"
495 | ]
496 | },
497 | {
498 | "cell_type": "code",
499 | "execution_count": 7,
500 | "id": "e14ac497-112e-44f4-943e-72a9b241bead",
501 | "metadata": {},
502 | "outputs": [
503 | {
504 | "name": "stderr",
505 | "output_type": "stream",
506 | "text": [
507 | "/Users/yarkoni/projects/workshop/venv/lib/python3.9/site-packages/kfp/v2/compiler/compiler.py:1278: FutureWarning: APIs imported from the v1 namespace (e.g. kfp.dsl, kfp.components, etc) will not be supported by the v2 compiler since v2.0.0\n",
508 | " warnings.warn(\n"
509 | ]
510 | }
511 | ],
512 | "source": [
513 | "from kfp.v2 import compiler\n",
514 | "\n",
515 | "compiler.Compiler().compile(pipeline_func=pipeline, package_path=\"pipeline-dag.json\")"
516 | ]
517 | },
518 | {
519 | "cell_type": "code",
520 | "execution_count": null,
521 | "id": "88e76ae0-3171-4e4d-ae29-220a0f14dad0",
522 | "metadata": {},
523 | "outputs": [
524 | {
525 | "name": "stdout",
526 | "output_type": "stream",
527 | "text": [
528 | "INFO:google.cloud.aiplatform.pipeline_jobs:Creating PipelineJob\n",
529 | "INFO:google.cloud.aiplatform.pipeline_jobs:PipelineJob created. Resource name: projects/141610882258/locations/us-central1/pipelineJobs/train-opti-20220428113336\n",
530 | "INFO:google.cloud.aiplatform.pipeline_jobs:To use this PipelineJob in another session:\n",
531 | "INFO:google.cloud.aiplatform.pipeline_jobs:pipeline_job = aiplatform.PipelineJob.get('projects/141610882258/locations/us-central1/pipelineJobs/train-opti-20220428113336')\n",
532 | "INFO:google.cloud.aiplatform.pipeline_jobs:View Pipeline Job:\n",
533 | "https://console.cloud.google.com/vertex-ai/locations/us-central1/pipelines/runs/train-opti-20220428113336?project=141610882258\n",
534 | "INFO:google.cloud.aiplatform.pipeline_jobs:PipelineJob run completed. Resource name: projects/141610882258/locations/us-central1/pipelineJobs/train-opti-20220428113336\n"
535 | ]
536 | }
537 | ],
538 | "source": [
539 | "# Instantiate PipelineJob object\n",
540 | "vertex_pipeline_job = vertex.PipelineJob(\n",
541 | " display_name=\"test-opti\",\n",
542 | "\n",
543 | " # Whether or not to enable caching\n",
544 | " # True = always cache pipeline step result\n",
545 | " # False = never cache pipeline step result\n",
546 | " # None = defer to cache option for each pipeline component in the pipeline definition\n",
547 | " enable_caching=True,\n",
548 | "\n",
549 | " # Local or GCS path to a compiled pipeline definition\n",
550 | " template_path=\"pipeline-dag.json\",\n",
551 | "\n",
552 | " # Dictionary containing input parameters for your pipeline\n",
553 | " parameter_values={},\n",
554 | "\n",
555 | " # GCS path to act as the pipeline root\n",
556 | " pipeline_root=BUCKET_URI,\n",
557 | ")\n",
558 | "\n",
559 | "# Execute pipeline in Vertex AI and monitor until completion\n",
560 | "vertex_pipeline_job.run(\n",
561 | " # Email address of service account to use for the pipeline run\n",
562 | " # You must have iam.serviceAccounts.actAs permission on the service account to use it\n",
563 | " #service_account=service_account,\n",
564 | "\n",
565 | " # Whether this function call should be synchronous (wait for pipeline run to finish before terminating)\n",
566 | " # or asynchronous (return immediately)\n",
567 | " sync=False\n",
568 | ")"
569 | ]
570 | },
571 | {
572 | "cell_type": "code",
573 | "execution_count": 357,
574 | "id": "79bdbf98-57bc-4c17-9671-1d0832e571e7",
575 | "metadata": {},
576 | "outputs": [
577 | {
578 | "name": "stderr",
579 | "output_type": "stream",
580 | "text": [
581 | "E0407 13:49:19.734209000 4753593856 fork_posix.cc:76] Other threads are currently calling into gRPC, skipping fork() handlers\n"
582 | ]
583 | }
584 | ],
585 | "source": [
586 | "jobs = vertex.PipelineJob.list()"
587 | ]
588 | },
589 | {
590 | "cell_type": "markdown",
591 | "id": "82858c6c-ebd7-4cef-b29a-3ae2665be848",
592 | "metadata": {},
593 | "source": [
594 | "### Or simply use the premade components \n",
595 | "https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/official/pipelines/google_cloud_pipeline_components_automl_images.ipynb\n",
596 | "\n",
597 | "https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/official/pipelines/automl_tabular_classification_beans.ipynb"
598 | ]
599 | },
600 | {
601 | "cell_type": "markdown",
602 | "id": "5b6f47b3-b11c-4855-9a20-638dbed91ff9",
603 | "metadata": {},
604 | "source": [
605 | "### Adding batch capabilities\n",
606 | "https://github.com/GoogleCloudPlatform/vertex-ai-samples/blob/main/notebooks/community/gapic/automl/showcase_automl_image_classification_batch.ipynb\n"
607 | ]
608 | }
609 | ],
610 | "metadata": {
611 | "kernelspec": {
612 | "display_name": "Python 3 (ipykernel)",
613 | "language": "python",
614 | "name": "python3"
615 | },
616 | "language_info": {
617 | "codemirror_mode": {
618 | "name": "ipython",
619 | "version": 3
620 | },
621 | "file_extension": ".py",
622 | "mimetype": "text/x-python",
623 | "name": "python",
624 | "nbconvert_exporter": "python",
625 | "pygments_lexer": "ipython3",
626 | "version": "3.9.4"
627 | }
628 | },
629 | "nbformat": 4,
630 | "nbformat_minor": 5
631 | }
632 |
--------------------------------------------------------------------------------
/iris.csv:
--------------------------------------------------------------------------------
1 | sepal_length,sepal_width,petal_length,petal_width,species
2 | 5.1,3.5,1.4,0.2,setosa
3 | 4.9,3.0,1.4,0.2,setosa
4 | 4.7,3.2,1.3,0.2,setosa
5 | 4.6,3.1,1.5,0.2,setosa
6 | 5.0,3.6,1.4,0.2,setosa
7 | 5.4,3.9,1.7,0.4,setosa
8 | 4.6,3.4,1.4,0.3,setosa
9 | 5.0,3.4,1.5,0.2,setosa
10 | 4.4,2.9,1.4,0.2,setosa
11 | 4.9,3.1,1.5,0.1,setosa
12 | 5.4,3.7,1.5,0.2,setosa
13 | 4.8,3.4,1.6,0.2,setosa
14 | 4.8,3.0,1.4,0.1,setosa
15 | 4.3,3.0,1.1,0.1,setosa
16 | 5.8,4.0,1.2,0.2,setosa
17 | 5.7,4.4,1.5,0.4,setosa
18 | 5.4,3.9,1.3,0.4,setosa
19 | 5.1,3.5,1.4,0.3,setosa
20 | 5.7,3.8,1.7,0.3,setosa
21 | 5.1,3.8,1.5,0.3,setosa
22 | 5.4,3.4,1.7,0.2,setosa
23 | 5.1,3.7,1.5,0.4,setosa
24 | 4.6,3.6,1.0,0.2,setosa
25 | 5.1,3.3,1.7,0.5,setosa
26 | 4.8,3.4,1.9,0.2,setosa
27 | 5.0,3.0,1.6,0.2,setosa
28 | 5.0,3.4,1.6,0.4,setosa
29 | 5.2,3.5,1.5,0.2,setosa
30 | 5.2,3.4,1.4,0.2,setosa
31 | 4.7,3.2,1.6,0.2,setosa
32 | 4.8,3.1,1.6,0.2,setosa
33 | 5.4,3.4,1.5,0.4,setosa
34 | 5.2,4.1,1.5,0.1,setosa
35 | 5.5,4.2,1.4,0.2,setosa
36 | 4.9,3.1,1.5,0.1,setosa
37 | 5.0,3.2,1.2,0.2,setosa
38 | 5.5,3.5,1.3,0.2,setosa
39 | 4.9,3.1,1.5,0.1,setosa
40 | 4.4,3.0,1.3,0.2,setosa
41 | 5.1,3.4,1.5,0.2,setosa
42 | 5.0,3.5,1.3,0.3,setosa
43 | 4.5,2.3,1.3,0.3,setosa
44 | 4.4,3.2,1.3,0.2,setosa
45 | 5.0,3.5,1.6,0.6,setosa
46 | 5.1,3.8,1.9,0.4,setosa
47 | 4.8,3.0,1.4,0.3,setosa
48 | 5.1,3.8,1.6,0.2,setosa
49 | 4.6,3.2,1.4,0.2,setosa
50 | 5.3,3.7,1.5,0.2,setosa
51 | 5.0,3.3,1.4,0.2,setosa
52 | 7.0,3.2,4.7,1.4,versicolor
53 | 6.4,3.2,4.5,1.5,versicolor
54 | 6.9,3.1,4.9,1.5,versicolor
55 | 5.5,2.3,4.0,1.3,versicolor
56 | 6.5,2.8,4.6,1.5,versicolor
57 | 5.7,2.8,4.5,1.3,versicolor
58 | 6.3,3.3,4.7,1.6,versicolor
59 | 4.9,2.4,3.3,1.0,versicolor
60 | 6.6,2.9,4.6,1.3,versicolor
61 | 5.2,2.7,3.9,1.4,versicolor
62 | 5.0,2.0,3.5,1.0,versicolor
63 | 5.9,3.0,4.2,1.5,versicolor
64 | 6.0,2.2,4.0,1.0,versicolor
65 | 6.1,2.9,4.7,1.4,versicolor
66 | 5.6,2.9,3.6,1.3,versicolor
67 | 6.7,3.1,4.4,1.4,versicolor
68 | 5.6,3.0,4.5,1.5,versicolor
69 | 5.8,2.7,4.1,1.0,versicolor
70 | 6.2,2.2,4.5,1.5,versicolor
71 | 5.6,2.5,3.9,1.1,versicolor
72 | 5.9,3.2,4.8,1.8,versicolor
73 | 6.1,2.8,4.0,1.3,versicolor
74 | 6.3,2.5,4.9,1.5,versicolor
75 | 6.1,2.8,4.7,1.2,versicolor
76 | 6.4,2.9,4.3,1.3,versicolor
77 | 6.6,3.0,4.4,1.4,versicolor
78 | 6.8,2.8,4.8,1.4,versicolor
79 | 6.7,3.0,5.0,1.7,versicolor
80 | 6.0,2.9,4.5,1.5,versicolor
81 | 5.7,2.6,3.5,1.0,versicolor
82 | 5.5,2.4,3.8,1.1,versicolor
83 | 5.5,2.4,3.7,1.0,versicolor
84 | 5.8,2.7,3.9,1.2,versicolor
85 | 6.0,2.7,5.1,1.6,versicolor
86 | 5.4,3.0,4.5,1.5,versicolor
87 | 6.0,3.4,4.5,1.6,versicolor
88 | 6.7,3.1,4.7,1.5,versicolor
89 | 6.3,2.3,4.4,1.3,versicolor
90 | 5.6,3.0,4.1,1.3,versicolor
91 | 5.5,2.5,4.0,1.3,versicolor
92 | 5.5,2.6,4.4,1.2,versicolor
93 | 6.1,3.0,4.6,1.4,versicolor
94 | 5.8,2.6,4.0,1.2,versicolor
95 | 5.0,2.3,3.3,1.0,versicolor
96 | 5.6,2.7,4.2,1.3,versicolor
97 | 5.7,3.0,4.2,1.2,versicolor
98 | 5.7,2.9,4.2,1.3,versicolor
99 | 6.2,2.9,4.3,1.3,versicolor
100 | 5.1,2.5,3.0,1.1,versicolor
101 | 5.7,2.8,4.1,1.3,versicolor
102 | 6.3,3.3,6.0,2.5,virginica
103 | 5.8,2.7,5.1,1.9,virginica
104 | 7.1,3.0,5.9,2.1,virginica
105 | 6.3,2.9,5.6,1.8,virginica
106 | 6.5,3.0,5.8,2.2,virginica
107 | 7.6,3.0,6.6,2.1,virginica
108 | 4.9,2.5,4.5,1.7,virginica
109 | 7.3,2.9,6.3,1.8,virginica
110 | 6.7,2.5,5.8,1.8,virginica
111 | 7.2,3.6,6.1,2.5,virginica
112 | 6.5,3.2,5.1,2.0,virginica
113 | 6.4,2.7,5.3,1.9,virginica
114 | 6.8,3.0,5.5,2.1,virginica
115 | 5.7,2.5,5.0,2.0,virginica
116 | 5.8,2.8,5.1,2.4,virginica
117 | 6.4,3.2,5.3,2.3,virginica
118 | 6.5,3.0,5.5,1.8,virginica
119 | 7.7,3.8,6.7,2.2,virginica
120 | 7.7,2.6,6.9,2.3,virginica
121 | 6.0,2.2,5.0,1.5,virginica
122 | 6.9,3.2,5.7,2.3,virginica
123 | 5.6,2.8,4.9,2.0,virginica
124 | 7.7,2.8,6.7,2.0,virginica
125 | 6.3,2.7,4.9,1.8,virginica
126 | 6.7,3.3,5.7,2.1,virginica
127 | 7.2,3.2,6.0,1.8,virginica
128 | 6.2,2.8,4.8,1.8,virginica
129 | 6.1,3.0,4.9,1.8,virginica
130 | 6.4,2.8,5.6,2.1,virginica
131 | 7.2,3.0,5.8,1.6,virginica
132 | 7.4,2.8,6.1,1.9,virginica
133 | 7.9,3.8,6.4,2.0,virginica
134 | 6.4,2.8,5.6,2.2,virginica
135 | 6.3,2.8,5.1,1.5,virginica
136 | 6.1,2.6,5.6,1.4,virginica
137 | 7.7,3.0,6.1,2.3,virginica
138 | 6.3,3.4,5.6,2.4,virginica
139 | 6.4,3.1,5.5,1.8,virginica
140 | 6.0,3.0,4.8,1.8,virginica
141 | 6.9,3.1,5.4,2.1,virginica
142 | 6.7,3.1,5.6,2.4,virginica
143 | 6.9,3.1,5.1,2.3,virginica
144 | 5.8,2.7,5.1,1.9,virginica
145 | 6.8,3.2,5.9,2.3,virginica
146 | 6.7,3.3,5.7,2.5,virginica
147 | 6.7,3.0,5.2,2.3,virginica
148 | 6.3,2.5,5.0,1.9,virginica
149 | 6.5,3.0,5.2,2.0,virginica
150 | 6.2,3.4,5.4,2.3,virginica
151 | 5.9,3.0,5.1,1.8,virginica
152 | 5.1,3.5,1.4,0.2,setosa
153 | 4.9,3.0,1.4,0.2,setosa
154 | 4.7,3.2,1.3,0.2,setosa
155 | 4.6,3.1,1.5,0.2,setosa
156 | 5.0,3.6,1.4,0.2,setosa
157 | 5.4,3.9,1.7,0.4,setosa
158 | 4.6,3.4,1.4,0.3,setosa
159 | 5.0,3.4,1.5,0.2,setosa
160 | 4.4,2.9,1.4,0.2,setosa
161 | 4.9,3.1,1.5,0.1,setosa
162 | 5.4,3.7,1.5,0.2,setosa
163 | 4.8,3.4,1.6,0.2,setosa
164 | 4.8,3.0,1.4,0.1,setosa
165 | 4.3,3.0,1.1,0.1,setosa
166 | 5.8,4.0,1.2,0.2,setosa
167 | 5.7,4.4,1.5,0.4,setosa
168 | 5.4,3.9,1.3,0.4,setosa
169 | 5.1,3.5,1.4,0.3,setosa
170 | 5.7,3.8,1.7,0.3,setosa
171 | 5.1,3.8,1.5,0.3,setosa
172 | 5.4,3.4,1.7,0.2,setosa
173 | 5.1,3.7,1.5,0.4,setosa
174 | 4.6,3.6,1.0,0.2,setosa
175 | 5.1,3.3,1.7,0.5,setosa
176 | 4.8,3.4,1.9,0.2,setosa
177 | 5.0,3.0,1.6,0.2,setosa
178 | 5.0,3.4,1.6,0.4,setosa
179 | 5.2,3.5,1.5,0.2,setosa
180 | 5.2,3.4,1.4,0.2,setosa
181 | 4.7,3.2,1.6,0.2,setosa
182 | 4.8,3.1,1.6,0.2,setosa
183 | 5.4,3.4,1.5,0.4,setosa
184 | 5.2,4.1,1.5,0.1,setosa
185 | 5.5,4.2,1.4,0.2,setosa
186 | 4.9,3.1,1.5,0.1,setosa
187 | 5.0,3.2,1.2,0.2,setosa
188 | 5.5,3.5,1.3,0.2,setosa
189 | 4.9,3.1,1.5,0.1,setosa
190 | 4.4,3.0,1.3,0.2,setosa
191 | 5.1,3.4,1.5,0.2,setosa
192 | 5.0,3.5,1.3,0.3,setosa
193 | 4.5,2.3,1.3,0.3,setosa
194 | 4.4,3.2,1.3,0.2,setosa
195 | 5.0,3.5,1.6,0.6,setosa
196 | 5.1,3.8,1.9,0.4,setosa
197 | 4.8,3.0,1.4,0.3,setosa
198 | 5.1,3.8,1.6,0.2,setosa
199 | 4.6,3.2,1.4,0.2,setosa
200 | 5.3,3.7,1.5,0.2,setosa
201 | 5.0,3.3,1.4,0.2,setosa
202 | 7.0,3.2,4.7,1.4,versicolor
203 | 6.4,3.2,4.5,1.5,versicolor
204 | 6.9,3.1,4.9,1.5,versicolor
205 | 5.5,2.3,4.0,1.3,versicolor
206 | 6.5,2.8,4.6,1.5,versicolor
207 | 5.7,2.8,4.5,1.3,versicolor
208 | 6.3,3.3,4.7,1.6,versicolor
209 | 4.9,2.4,3.3,1.0,versicolor
210 | 6.6,2.9,4.6,1.3,versicolor
211 | 5.2,2.7,3.9,1.4,versicolor
212 | 5.0,2.0,3.5,1.0,versicolor
213 | 5.9,3.0,4.2,1.5,versicolor
214 | 6.0,2.2,4.0,1.0,versicolor
215 | 6.1,2.9,4.7,1.4,versicolor
216 | 5.6,2.9,3.6,1.3,versicolor
217 | 6.7,3.1,4.4,1.4,versicolor
218 | 5.6,3.0,4.5,1.5,versicolor
219 | 5.8,2.7,4.1,1.0,versicolor
220 | 6.2,2.2,4.5,1.5,versicolor
221 | 5.6,2.5,3.9,1.1,versicolor
222 | 5.9,3.2,4.8,1.8,versicolor
223 | 6.1,2.8,4.0,1.3,versicolor
224 | 6.3,2.5,4.9,1.5,versicolor
225 | 6.1,2.8,4.7,1.2,versicolor
226 | 6.4,2.9,4.3,1.3,versicolor
227 | 6.6,3.0,4.4,1.4,versicolor
228 | 6.8,2.8,4.8,1.4,versicolor
229 | 6.7,3.0,5.0,1.7,versicolor
230 | 6.0,2.9,4.5,1.5,versicolor
231 | 5.7,2.6,3.5,1.0,versicolor
232 | 5.5,2.4,3.8,1.1,versicolor
233 | 5.5,2.4,3.7,1.0,versicolor
234 | 5.8,2.7,3.9,1.2,versicolor
235 | 6.0,2.7,5.1,1.6,versicolor
236 | 5.4,3.0,4.5,1.5,versicolor
237 | 6.0,3.4,4.5,1.6,versicolor
238 | 6.7,3.1,4.7,1.5,versicolor
239 | 6.3,2.3,4.4,1.3,versicolor
240 | 5.6,3.0,4.1,1.3,versicolor
241 | 5.5,2.5,4.0,1.3,versicolor
242 | 5.5,2.6,4.4,1.2,versicolor
243 | 6.1,3.0,4.6,1.4,versicolor
244 | 5.8,2.6,4.0,1.2,versicolor
245 | 5.0,2.3,3.3,1.0,versicolor
246 | 5.6,2.7,4.2,1.3,versicolor
247 | 5.7,3.0,4.2,1.2,versicolor
248 | 5.7,2.9,4.2,1.3,versicolor
249 | 6.2,2.9,4.3,1.3,versicolor
250 | 5.1,2.5,3.0,1.1,versicolor
251 | 5.7,2.8,4.1,1.3,versicolor
252 | 6.3,3.3,6.0,2.5,virginica
253 | 5.8,2.7,5.1,1.9,virginica
254 | 7.1,3.0,5.9,2.1,virginica
255 | 6.3,2.9,5.6,1.8,virginica
256 | 6.5,3.0,5.8,2.2,virginica
257 | 7.6,3.0,6.6,2.1,virginica
258 | 4.9,2.5,4.5,1.7,virginica
259 | 7.3,2.9,6.3,1.8,virginica
260 | 6.7,2.5,5.8,1.8,virginica
261 | 7.2,3.6,6.1,2.5,virginica
262 | 6.5,3.2,5.1,2.0,virginica
263 | 6.4,2.7,5.3,1.9,virginica
264 | 6.8,3.0,5.5,2.1,virginica
265 | 5.7,2.5,5.0,2.0,virginica
266 | 5.8,2.8,5.1,2.4,virginica
267 | 6.4,3.2,5.3,2.3,virginica
268 | 6.5,3.0,5.5,1.8,virginica
269 | 7.7,3.8,6.7,2.2,virginica
270 | 7.7,2.6,6.9,2.3,virginica
271 | 6.0,2.2,5.0,1.5,virginica
272 | 6.9,3.2,5.7,2.3,virginica
273 | 5.6,2.8,4.9,2.0,virginica
274 | 7.7,2.8,6.7,2.0,virginica
275 | 6.3,2.7,4.9,1.8,virginica
276 | 6.7,3.3,5.7,2.1,virginica
277 | 7.2,3.2,6.0,1.8,virginica
278 | 6.2,2.8,4.8,1.8,virginica
279 | 6.1,3.0,4.9,1.8,virginica
280 | 6.4,2.8,5.6,2.1,virginica
281 | 7.2,3.0,5.8,1.6,virginica
282 | 7.4,2.8,6.1,1.9,virginica
283 | 7.9,3.8,6.4,2.0,virginica
284 | 6.4,2.8,5.6,2.2,virginica
285 | 6.3,2.8,5.1,1.5,virginica
286 | 6.1,2.6,5.6,1.4,virginica
287 | 7.7,3.0,6.1,2.3,virginica
288 | 6.3,3.4,5.6,2.4,virginica
289 | 6.4,3.1,5.5,1.8,virginica
290 | 6.0,3.0,4.8,1.8,virginica
291 | 6.9,3.1,5.4,2.1,virginica
292 | 6.7,3.1,5.6,2.4,virginica
293 | 6.9,3.1,5.1,2.3,virginica
294 | 5.8,2.7,5.1,1.9,virginica
295 | 6.8,3.2,5.9,2.3,virginica
296 | 6.7,3.3,5.7,2.5,virginica
297 | 6.7,3.0,5.2,2.3,virginica
298 | 6.3,2.5,5.0,1.9,virginica
299 | 6.5,3.0,5.2,2.0,virginica
300 | 6.2,3.4,5.4,2.3,virginica
301 | 5.9,3.0,5.1,1.8,virginica
302 | 5.1,3.5,1.4,0.2,setosa
303 | 4.9,3.0,1.4,0.2,setosa
304 | 4.7,3.2,1.3,0.2,setosa
305 | 4.6,3.1,1.5,0.2,setosa
306 | 5.0,3.6,1.4,0.2,setosa
307 | 5.4,3.9,1.7,0.4,setosa
308 | 4.6,3.4,1.4,0.3,setosa
309 | 5.0,3.4,1.5,0.2,setosa
310 | 4.4,2.9,1.4,0.2,setosa
311 | 4.9,3.1,1.5,0.1,setosa
312 | 5.4,3.7,1.5,0.2,setosa
313 | 4.8,3.4,1.6,0.2,setosa
314 | 4.8,3.0,1.4,0.1,setosa
315 | 4.3,3.0,1.1,0.1,setosa
316 | 5.8,4.0,1.2,0.2,setosa
317 | 5.7,4.4,1.5,0.4,setosa
318 | 5.4,3.9,1.3,0.4,setosa
319 | 5.1,3.5,1.4,0.3,setosa
320 | 5.7,3.8,1.7,0.3,setosa
321 | 5.1,3.8,1.5,0.3,setosa
322 | 5.4,3.4,1.7,0.2,setosa
323 | 5.1,3.7,1.5,0.4,setosa
324 | 4.6,3.6,1.0,0.2,setosa
325 | 5.1,3.3,1.7,0.5,setosa
326 | 4.8,3.4,1.9,0.2,setosa
327 | 5.0,3.0,1.6,0.2,setosa
328 | 5.0,3.4,1.6,0.4,setosa
329 | 5.2,3.5,1.5,0.2,setosa
330 | 5.2,3.4,1.4,0.2,setosa
331 | 4.7,3.2,1.6,0.2,setosa
332 | 4.8,3.1,1.6,0.2,setosa
333 | 5.4,3.4,1.5,0.4,setosa
334 | 5.2,4.1,1.5,0.1,setosa
335 | 5.5,4.2,1.4,0.2,setosa
336 | 4.9,3.1,1.5,0.1,setosa
337 | 5.0,3.2,1.2,0.2,setosa
338 | 5.5,3.5,1.3,0.2,setosa
339 | 4.9,3.1,1.5,0.1,setosa
340 | 4.4,3.0,1.3,0.2,setosa
341 | 5.1,3.4,1.5,0.2,setosa
342 | 5.0,3.5,1.3,0.3,setosa
343 | 4.5,2.3,1.3,0.3,setosa
344 | 4.4,3.2,1.3,0.2,setosa
345 | 5.0,3.5,1.6,0.6,setosa
346 | 5.1,3.8,1.9,0.4,setosa
347 | 4.8,3.0,1.4,0.3,setosa
348 | 5.1,3.8,1.6,0.2,setosa
349 | 4.6,3.2,1.4,0.2,setosa
350 | 5.3,3.7,1.5,0.2,setosa
351 | 5.0,3.3,1.4,0.2,setosa
352 | 7.0,3.2,4.7,1.4,versicolor
353 | 6.4,3.2,4.5,1.5,versicolor
354 | 6.9,3.1,4.9,1.5,versicolor
355 | 5.5,2.3,4.0,1.3,versicolor
356 | 6.5,2.8,4.6,1.5,versicolor
357 | 5.7,2.8,4.5,1.3,versicolor
358 | 6.3,3.3,4.7,1.6,versicolor
359 | 4.9,2.4,3.3,1.0,versicolor
360 | 6.6,2.9,4.6,1.3,versicolor
361 | 5.2,2.7,3.9,1.4,versicolor
362 | 5.0,2.0,3.5,1.0,versicolor
363 | 5.9,3.0,4.2,1.5,versicolor
364 | 6.0,2.2,4.0,1.0,versicolor
365 | 6.1,2.9,4.7,1.4,versicolor
366 | 5.6,2.9,3.6,1.3,versicolor
367 | 6.7,3.1,4.4,1.4,versicolor
368 | 5.6,3.0,4.5,1.5,versicolor
369 | 5.8,2.7,4.1,1.0,versicolor
370 | 6.2,2.2,4.5,1.5,versicolor
371 | 5.6,2.5,3.9,1.1,versicolor
372 | 5.9,3.2,4.8,1.8,versicolor
373 | 6.1,2.8,4.0,1.3,versicolor
374 | 6.3,2.5,4.9,1.5,versicolor
375 | 6.1,2.8,4.7,1.2,versicolor
376 | 6.4,2.9,4.3,1.3,versicolor
377 | 6.6,3.0,4.4,1.4,versicolor
378 | 6.8,2.8,4.8,1.4,versicolor
379 | 6.7,3.0,5.0,1.7,versicolor
380 | 6.0,2.9,4.5,1.5,versicolor
381 | 5.7,2.6,3.5,1.0,versicolor
382 | 5.5,2.4,3.8,1.1,versicolor
383 | 5.5,2.4,3.7,1.0,versicolor
384 | 5.8,2.7,3.9,1.2,versicolor
385 | 6.0,2.7,5.1,1.6,versicolor
386 | 5.4,3.0,4.5,1.5,versicolor
387 | 6.0,3.4,4.5,1.6,versicolor
388 | 6.7,3.1,4.7,1.5,versicolor
389 | 6.3,2.3,4.4,1.3,versicolor
390 | 5.6,3.0,4.1,1.3,versicolor
391 | 5.5,2.5,4.0,1.3,versicolor
392 | 5.5,2.6,4.4,1.2,versicolor
393 | 6.1,3.0,4.6,1.4,versicolor
394 | 5.8,2.6,4.0,1.2,versicolor
395 | 5.0,2.3,3.3,1.0,versicolor
396 | 5.6,2.7,4.2,1.3,versicolor
397 | 5.7,3.0,4.2,1.2,versicolor
398 | 5.7,2.9,4.2,1.3,versicolor
399 | 6.2,2.9,4.3,1.3,versicolor
400 | 5.1,2.5,3.0,1.1,versicolor
401 | 5.7,2.8,4.1,1.3,versicolor
402 | 6.3,3.3,6.0,2.5,virginica
403 | 5.8,2.7,5.1,1.9,virginica
404 | 7.1,3.0,5.9,2.1,virginica
405 | 6.3,2.9,5.6,1.8,virginica
406 | 6.5,3.0,5.8,2.2,virginica
407 | 7.6,3.0,6.6,2.1,virginica
408 | 4.9,2.5,4.5,1.7,virginica
409 | 7.3,2.9,6.3,1.8,virginica
410 | 6.7,2.5,5.8,1.8,virginica
411 | 7.2,3.6,6.1,2.5,virginica
412 | 6.5,3.2,5.1,2.0,virginica
413 | 6.4,2.7,5.3,1.9,virginica
414 | 6.8,3.0,5.5,2.1,virginica
415 | 5.7,2.5,5.0,2.0,virginica
416 | 5.8,2.8,5.1,2.4,virginica
417 | 6.4,3.2,5.3,2.3,virginica
418 | 6.5,3.0,5.5,1.8,virginica
419 | 7.7,3.8,6.7,2.2,virginica
420 | 7.7,2.6,6.9,2.3,virginica
421 | 6.0,2.2,5.0,1.5,virginica
422 | 6.9,3.2,5.7,2.3,virginica
423 | 5.6,2.8,4.9,2.0,virginica
424 | 7.7,2.8,6.7,2.0,virginica
425 | 6.3,2.7,4.9,1.8,virginica
426 | 6.7,3.3,5.7,2.1,virginica
427 | 7.2,3.2,6.0,1.8,virginica
428 | 6.2,2.8,4.8,1.8,virginica
429 | 6.1,3.0,4.9,1.8,virginica
430 | 6.4,2.8,5.6,2.1,virginica
431 | 7.2,3.0,5.8,1.6,virginica
432 | 7.4,2.8,6.1,1.9,virginica
433 | 7.9,3.8,6.4,2.0,virginica
434 | 6.4,2.8,5.6,2.2,virginica
435 | 6.3,2.8,5.1,1.5,virginica
436 | 6.1,2.6,5.6,1.4,virginica
437 | 7.7,3.0,6.1,2.3,virginica
438 | 6.3,3.4,5.6,2.4,virginica
439 | 6.4,3.1,5.5,1.8,virginica
440 | 6.0,3.0,4.8,1.8,virginica
441 | 6.9,3.1,5.4,2.1,virginica
442 | 6.7,3.1,5.6,2.4,virginica
443 | 6.9,3.1,5.1,2.3,virginica
444 | 5.8,2.7,5.1,1.9,virginica
445 | 6.8,3.2,5.9,2.3,virginica
446 | 6.7,3.3,5.7,2.5,virginica
447 | 6.7,3.0,5.2,2.3,virginica
448 | 6.3,2.5,5.0,1.9,virginica
449 | 6.5,3.0,5.2,2.0,virginica
450 | 6.2,3.4,5.4,2.3,virginica
451 | 5.9,3.0,5.1,1.8,virginica
452 | 5.1,3.5,1.4,0.2,setosa
453 | 4.9,3.0,1.4,0.2,setosa
454 | 4.7,3.2,1.3,0.2,setosa
455 | 4.6,3.1,1.5,0.2,setosa
456 | 5.0,3.6,1.4,0.2,setosa
457 | 5.4,3.9,1.7,0.4,setosa
458 | 4.6,3.4,1.4,0.3,setosa
459 | 5.0,3.4,1.5,0.2,setosa
460 | 4.4,2.9,1.4,0.2,setosa
461 | 4.9,3.1,1.5,0.1,setosa
462 | 5.4,3.7,1.5,0.2,setosa
463 | 4.8,3.4,1.6,0.2,setosa
464 | 4.8,3.0,1.4,0.1,setosa
465 | 4.3,3.0,1.1,0.1,setosa
466 | 5.8,4.0,1.2,0.2,setosa
467 | 5.7,4.4,1.5,0.4,setosa
468 | 5.4,3.9,1.3,0.4,setosa
469 | 5.1,3.5,1.4,0.3,setosa
470 | 5.7,3.8,1.7,0.3,setosa
471 | 5.1,3.8,1.5,0.3,setosa
472 | 5.4,3.4,1.7,0.2,setosa
473 | 5.1,3.7,1.5,0.4,setosa
474 | 4.6,3.6,1.0,0.2,setosa
475 | 5.1,3.3,1.7,0.5,setosa
476 | 4.8,3.4,1.9,0.2,setosa
477 | 5.0,3.0,1.6,0.2,setosa
478 | 5.0,3.4,1.6,0.4,setosa
479 | 5.2,3.5,1.5,0.2,setosa
480 | 5.2,3.4,1.4,0.2,setosa
481 | 4.7,3.2,1.6,0.2,setosa
482 | 4.8,3.1,1.6,0.2,setosa
483 | 5.4,3.4,1.5,0.4,setosa
484 | 5.2,4.1,1.5,0.1,setosa
485 | 5.5,4.2,1.4,0.2,setosa
486 | 4.9,3.1,1.5,0.1,setosa
487 | 5.0,3.2,1.2,0.2,setosa
488 | 5.5,3.5,1.3,0.2,setosa
489 | 4.9,3.1,1.5,0.1,setosa
490 | 4.4,3.0,1.3,0.2,setosa
491 | 5.1,3.4,1.5,0.2,setosa
492 | 5.0,3.5,1.3,0.3,setosa
493 | 4.5,2.3,1.3,0.3,setosa
494 | 4.4,3.2,1.3,0.2,setosa
495 | 5.0,3.5,1.6,0.6,setosa
496 | 5.1,3.8,1.9,0.4,setosa
497 | 4.8,3.0,1.4,0.3,setosa
498 | 5.1,3.8,1.6,0.2,setosa
499 | 4.6,3.2,1.4,0.2,setosa
500 | 5.3,3.7,1.5,0.2,setosa
501 | 5.0,3.3,1.4,0.2,setosa
502 | 7.0,3.2,4.7,1.4,versicolor
503 | 6.4,3.2,4.5,1.5,versicolor
504 | 6.9,3.1,4.9,1.5,versicolor
505 | 5.5,2.3,4.0,1.3,versicolor
506 | 6.5,2.8,4.6,1.5,versicolor
507 | 5.7,2.8,4.5,1.3,versicolor
508 | 6.3,3.3,4.7,1.6,versicolor
509 | 4.9,2.4,3.3,1.0,versicolor
510 | 6.6,2.9,4.6,1.3,versicolor
511 | 5.2,2.7,3.9,1.4,versicolor
512 | 5.0,2.0,3.5,1.0,versicolor
513 | 5.9,3.0,4.2,1.5,versicolor
514 | 6.0,2.2,4.0,1.0,versicolor
515 | 6.1,2.9,4.7,1.4,versicolor
516 | 5.6,2.9,3.6,1.3,versicolor
517 | 6.7,3.1,4.4,1.4,versicolor
518 | 5.6,3.0,4.5,1.5,versicolor
519 | 5.8,2.7,4.1,1.0,versicolor
520 | 6.2,2.2,4.5,1.5,versicolor
521 | 5.6,2.5,3.9,1.1,versicolor
522 | 5.9,3.2,4.8,1.8,versicolor
523 | 6.1,2.8,4.0,1.3,versicolor
524 | 6.3,2.5,4.9,1.5,versicolor
525 | 6.1,2.8,4.7,1.2,versicolor
526 | 6.4,2.9,4.3,1.3,versicolor
527 | 6.6,3.0,4.4,1.4,versicolor
528 | 6.8,2.8,4.8,1.4,versicolor
529 | 6.7,3.0,5.0,1.7,versicolor
530 | 6.0,2.9,4.5,1.5,versicolor
531 | 5.7,2.6,3.5,1.0,versicolor
532 | 5.5,2.4,3.8,1.1,versicolor
533 | 5.5,2.4,3.7,1.0,versicolor
534 | 5.8,2.7,3.9,1.2,versicolor
535 | 6.0,2.7,5.1,1.6,versicolor
536 | 5.4,3.0,4.5,1.5,versicolor
537 | 6.0,3.4,4.5,1.6,versicolor
538 | 6.7,3.1,4.7,1.5,versicolor
539 | 6.3,2.3,4.4,1.3,versicolor
540 | 5.6,3.0,4.1,1.3,versicolor
541 | 5.5,2.5,4.0,1.3,versicolor
542 | 5.5,2.6,4.4,1.2,versicolor
543 | 6.1,3.0,4.6,1.4,versicolor
544 | 5.8,2.6,4.0,1.2,versicolor
545 | 5.0,2.3,3.3,1.0,versicolor
546 | 5.6,2.7,4.2,1.3,versicolor
547 | 5.7,3.0,4.2,1.2,versicolor
548 | 5.7,2.9,4.2,1.3,versicolor
549 | 6.2,2.9,4.3,1.3,versicolor
550 | 5.1,2.5,3.0,1.1,versicolor
551 | 5.7,2.8,4.1,1.3,versicolor
552 | 6.3,3.3,6.0,2.5,virginica
553 | 5.8,2.7,5.1,1.9,virginica
554 | 7.1,3.0,5.9,2.1,virginica
555 | 6.3,2.9,5.6,1.8,virginica
556 | 6.5,3.0,5.8,2.2,virginica
557 | 7.6,3.0,6.6,2.1,virginica
558 | 4.9,2.5,4.5,1.7,virginica
559 | 7.3,2.9,6.3,1.8,virginica
560 | 6.7,2.5,5.8,1.8,virginica
561 | 7.2,3.6,6.1,2.5,virginica
562 | 6.5,3.2,5.1,2.0,virginica
563 | 6.4,2.7,5.3,1.9,virginica
564 | 6.8,3.0,5.5,2.1,virginica
565 | 5.7,2.5,5.0,2.0,virginica
566 | 5.8,2.8,5.1,2.4,virginica
567 | 6.4,3.2,5.3,2.3,virginica
568 | 6.5,3.0,5.5,1.8,virginica
569 | 7.7,3.8,6.7,2.2,virginica
570 | 7.7,2.6,6.9,2.3,virginica
571 | 6.0,2.2,5.0,1.5,virginica
572 | 6.9,3.2,5.7,2.3,virginica
573 | 5.6,2.8,4.9,2.0,virginica
574 | 7.7,2.8,6.7,2.0,virginica
575 | 6.3,2.7,4.9,1.8,virginica
576 | 6.7,3.3,5.7,2.1,virginica
577 | 7.2,3.2,6.0,1.8,virginica
578 | 6.2,2.8,4.8,1.8,virginica
579 | 6.1,3.0,4.9,1.8,virginica
580 | 6.4,2.8,5.6,2.1,virginica
581 | 7.2,3.0,5.8,1.6,virginica
582 | 7.4,2.8,6.1,1.9,virginica
583 | 7.9,3.8,6.4,2.0,virginica
584 | 6.4,2.8,5.6,2.2,virginica
585 | 6.3,2.8,5.1,1.5,virginica
586 | 6.1,2.6,5.6,1.4,virginica
587 | 7.7,3.0,6.1,2.3,virginica
588 | 6.3,3.4,5.6,2.4,virginica
589 | 6.4,3.1,5.5,1.8,virginica
590 | 6.0,3.0,4.8,1.8,virginica
591 | 6.9,3.1,5.4,2.1,virginica
592 | 6.7,3.1,5.6,2.4,virginica
593 | 6.9,3.1,5.1,2.3,virginica
594 | 5.8,2.7,5.1,1.9,virginica
595 | 6.8,3.2,5.9,2.3,virginica
596 | 6.7,3.3,5.7,2.5,virginica
597 | 6.7,3.0,5.2,2.3,virginica
598 | 6.3,2.5,5.0,1.9,virginica
599 | 6.5,3.0,5.2,2.0,virginica
600 | 6.2,3.4,5.4,2.3,virginica
601 | 5.9,3.0,5.1,1.8,virginica
602 | 5.1,3.5,1.4,0.2,setosa
603 | 4.9,3.0,1.4,0.2,setosa
604 | 4.7,3.2,1.3,0.2,setosa
605 | 4.6,3.1,1.5,0.2,setosa
606 | 5.0,3.6,1.4,0.2,setosa
607 | 5.4,3.9,1.7,0.4,setosa
608 | 4.6,3.4,1.4,0.3,setosa
609 | 5.0,3.4,1.5,0.2,setosa
610 | 4.4,2.9,1.4,0.2,setosa
611 | 4.9,3.1,1.5,0.1,setosa
612 | 5.4,3.7,1.5,0.2,setosa
613 | 4.8,3.4,1.6,0.2,setosa
614 | 4.8,3.0,1.4,0.1,setosa
615 | 4.3,3.0,1.1,0.1,setosa
616 | 5.8,4.0,1.2,0.2,setosa
617 | 5.7,4.4,1.5,0.4,setosa
618 | 5.4,3.9,1.3,0.4,setosa
619 | 5.1,3.5,1.4,0.3,setosa
620 | 5.7,3.8,1.7,0.3,setosa
621 | 5.1,3.8,1.5,0.3,setosa
622 | 5.4,3.4,1.7,0.2,setosa
623 | 5.1,3.7,1.5,0.4,setosa
624 | 4.6,3.6,1.0,0.2,setosa
625 | 5.1,3.3,1.7,0.5,setosa
626 | 4.8,3.4,1.9,0.2,setosa
627 | 5.0,3.0,1.6,0.2,setosa
628 | 5.0,3.4,1.6,0.4,setosa
629 | 5.2,3.5,1.5,0.2,setosa
630 | 5.2,3.4,1.4,0.2,setosa
631 | 4.7,3.2,1.6,0.2,setosa
632 | 4.8,3.1,1.6,0.2,setosa
633 | 5.4,3.4,1.5,0.4,setosa
634 | 5.2,4.1,1.5,0.1,setosa
635 | 5.5,4.2,1.4,0.2,setosa
636 | 4.9,3.1,1.5,0.1,setosa
637 | 5.0,3.2,1.2,0.2,setosa
638 | 5.5,3.5,1.3,0.2,setosa
639 | 4.9,3.1,1.5,0.1,setosa
640 | 4.4,3.0,1.3,0.2,setosa
641 | 5.1,3.4,1.5,0.2,setosa
642 | 5.0,3.5,1.3,0.3,setosa
643 | 4.5,2.3,1.3,0.3,setosa
644 | 4.4,3.2,1.3,0.2,setosa
645 | 5.0,3.5,1.6,0.6,setosa
646 | 5.1,3.8,1.9,0.4,setosa
647 | 4.8,3.0,1.4,0.3,setosa
648 | 5.1,3.8,1.6,0.2,setosa
649 | 4.6,3.2,1.4,0.2,setosa
650 | 5.3,3.7,1.5,0.2,setosa
651 | 5.0,3.3,1.4,0.2,setosa
652 | 7.0,3.2,4.7,1.4,versicolor
653 | 6.4,3.2,4.5,1.5,versicolor
654 | 6.9,3.1,4.9,1.5,versicolor
655 | 5.5,2.3,4.0,1.3,versicolor
656 | 6.5,2.8,4.6,1.5,versicolor
657 | 5.7,2.8,4.5,1.3,versicolor
658 | 6.3,3.3,4.7,1.6,versicolor
659 | 4.9,2.4,3.3,1.0,versicolor
660 | 6.6,2.9,4.6,1.3,versicolor
661 | 5.2,2.7,3.9,1.4,versicolor
662 | 5.0,2.0,3.5,1.0,versicolor
663 | 5.9,3.0,4.2,1.5,versicolor
664 | 6.0,2.2,4.0,1.0,versicolor
665 | 6.1,2.9,4.7,1.4,versicolor
666 | 5.6,2.9,3.6,1.3,versicolor
667 | 6.7,3.1,4.4,1.4,versicolor
668 | 5.6,3.0,4.5,1.5,versicolor
669 | 5.8,2.7,4.1,1.0,versicolor
670 | 6.2,2.2,4.5,1.5,versicolor
671 | 5.6,2.5,3.9,1.1,versicolor
672 | 5.9,3.2,4.8,1.8,versicolor
673 | 6.1,2.8,4.0,1.3,versicolor
674 | 6.3,2.5,4.9,1.5,versicolor
675 | 6.1,2.8,4.7,1.2,versicolor
676 | 6.4,2.9,4.3,1.3,versicolor
677 | 6.6,3.0,4.4,1.4,versicolor
678 | 6.8,2.8,4.8,1.4,versicolor
679 | 6.7,3.0,5.0,1.7,versicolor
680 | 6.0,2.9,4.5,1.5,versicolor
681 | 5.7,2.6,3.5,1.0,versicolor
682 | 5.5,2.4,3.8,1.1,versicolor
683 | 5.5,2.4,3.7,1.0,versicolor
684 | 5.8,2.7,3.9,1.2,versicolor
685 | 6.0,2.7,5.1,1.6,versicolor
686 | 5.4,3.0,4.5,1.5,versicolor
687 | 6.0,3.4,4.5,1.6,versicolor
688 | 6.7,3.1,4.7,1.5,versicolor
689 | 6.3,2.3,4.4,1.3,versicolor
690 | 5.6,3.0,4.1,1.3,versicolor
691 | 5.5,2.5,4.0,1.3,versicolor
692 | 5.5,2.6,4.4,1.2,versicolor
693 | 6.1,3.0,4.6,1.4,versicolor
694 | 5.8,2.6,4.0,1.2,versicolor
695 | 5.0,2.3,3.3,1.0,versicolor
696 | 5.6,2.7,4.2,1.3,versicolor
697 | 5.7,3.0,4.2,1.2,versicolor
698 | 5.7,2.9,4.2,1.3,versicolor
699 | 6.2,2.9,4.3,1.3,versicolor
700 | 5.1,2.5,3.0,1.1,versicolor
701 | 5.7,2.8,4.1,1.3,versicolor
702 | 6.3,3.3,6.0,2.5,virginica
703 | 5.8,2.7,5.1,1.9,virginica
704 | 7.1,3.0,5.9,2.1,virginica
705 | 6.3,2.9,5.6,1.8,virginica
706 | 6.5,3.0,5.8,2.2,virginica
707 | 7.6,3.0,6.6,2.1,virginica
708 | 4.9,2.5,4.5,1.7,virginica
709 | 7.3,2.9,6.3,1.8,virginica
710 | 6.7,2.5,5.8,1.8,virginica
711 | 7.2,3.6,6.1,2.5,virginica
712 | 6.5,3.2,5.1,2.0,virginica
713 | 6.4,2.7,5.3,1.9,virginica
714 | 6.8,3.0,5.5,2.1,virginica
715 | 5.7,2.5,5.0,2.0,virginica
716 | 5.8,2.8,5.1,2.4,virginica
717 | 6.4,3.2,5.3,2.3,virginica
718 | 6.5,3.0,5.5,1.8,virginica
719 | 7.7,3.8,6.7,2.2,virginica
720 | 7.7,2.6,6.9,2.3,virginica
721 | 6.0,2.2,5.0,1.5,virginica
722 | 6.9,3.2,5.7,2.3,virginica
723 | 5.6,2.8,4.9,2.0,virginica
724 | 7.7,2.8,6.7,2.0,virginica
725 | 6.3,2.7,4.9,1.8,virginica
726 | 6.7,3.3,5.7,2.1,virginica
727 | 7.2,3.2,6.0,1.8,virginica
728 | 6.2,2.8,4.8,1.8,virginica
729 | 6.1,3.0,4.9,1.8,virginica
730 | 6.4,2.8,5.6,2.1,virginica
731 | 7.2,3.0,5.8,1.6,virginica
732 | 7.4,2.8,6.1,1.9,virginica
733 | 7.9,3.8,6.4,2.0,virginica
734 | 6.4,2.8,5.6,2.2,virginica
735 | 6.3,2.8,5.1,1.5,virginica
736 | 6.1,2.6,5.6,1.4,virginica
737 | 7.7,3.0,6.1,2.3,virginica
738 | 6.3,3.4,5.6,2.4,virginica
739 | 6.4,3.1,5.5,1.8,virginica
740 | 6.0,3.0,4.8,1.8,virginica
741 | 6.9,3.1,5.4,2.1,virginica
742 | 6.7,3.1,5.6,2.4,virginica
743 | 6.9,3.1,5.1,2.3,virginica
744 | 5.8,2.7,5.1,1.9,virginica
745 | 6.8,3.2,5.9,2.3,virginica
746 | 6.7,3.3,5.7,2.5,virginica
747 | 6.7,3.0,5.2,2.3,virginica
748 | 6.3,2.5,5.0,1.9,virginica
749 | 6.5,3.0,5.2,2.0,virginica
750 | 6.2,3.4,5.4,2.3,virginica
751 | 5.9,3.0,5.1,1.8,virginica
752 | 5.1,3.5,1.4,0.2,setosa
753 | 4.9,3.0,1.4,0.2,setosa
754 | 4.7,3.2,1.3,0.2,setosa
755 | 4.6,3.1,1.5,0.2,setosa
756 | 5.0,3.6,1.4,0.2,setosa
757 | 5.4,3.9,1.7,0.4,setosa
758 | 4.6,3.4,1.4,0.3,setosa
759 | 5.0,3.4,1.5,0.2,setosa
760 | 4.4,2.9,1.4,0.2,setosa
761 | 4.9,3.1,1.5,0.1,setosa
762 | 5.4,3.7,1.5,0.2,setosa
763 | 4.8,3.4,1.6,0.2,setosa
764 | 4.8,3.0,1.4,0.1,setosa
765 | 4.3,3.0,1.1,0.1,setosa
766 | 5.8,4.0,1.2,0.2,setosa
767 | 5.7,4.4,1.5,0.4,setosa
768 | 5.4,3.9,1.3,0.4,setosa
769 | 5.1,3.5,1.4,0.3,setosa
770 | 5.7,3.8,1.7,0.3,setosa
771 | 5.1,3.8,1.5,0.3,setosa
772 | 5.4,3.4,1.7,0.2,setosa
773 | 5.1,3.7,1.5,0.4,setosa
774 | 4.6,3.6,1.0,0.2,setosa
775 | 5.1,3.3,1.7,0.5,setosa
776 | 4.8,3.4,1.9,0.2,setosa
777 | 5.0,3.0,1.6,0.2,setosa
778 | 5.0,3.4,1.6,0.4,setosa
779 | 5.2,3.5,1.5,0.2,setosa
780 | 5.2,3.4,1.4,0.2,setosa
781 | 4.7,3.2,1.6,0.2,setosa
782 | 4.8,3.1,1.6,0.2,setosa
783 | 5.4,3.4,1.5,0.4,setosa
784 | 5.2,4.1,1.5,0.1,setosa
785 | 5.5,4.2,1.4,0.2,setosa
786 | 4.9,3.1,1.5,0.1,setosa
787 | 5.0,3.2,1.2,0.2,setosa
788 | 5.5,3.5,1.3,0.2,setosa
789 | 4.9,3.1,1.5,0.1,setosa
790 | 4.4,3.0,1.3,0.2,setosa
791 | 5.1,3.4,1.5,0.2,setosa
792 | 5.0,3.5,1.3,0.3,setosa
793 | 4.5,2.3,1.3,0.3,setosa
794 | 4.4,3.2,1.3,0.2,setosa
795 | 5.0,3.5,1.6,0.6,setosa
796 | 5.1,3.8,1.9,0.4,setosa
797 | 4.8,3.0,1.4,0.3,setosa
798 | 5.1,3.8,1.6,0.2,setosa
799 | 4.6,3.2,1.4,0.2,setosa
800 | 5.3,3.7,1.5,0.2,setosa
801 | 5.0,3.3,1.4,0.2,setosa
802 | 7.0,3.2,4.7,1.4,versicolor
803 | 6.4,3.2,4.5,1.5,versicolor
804 | 6.9,3.1,4.9,1.5,versicolor
805 | 5.5,2.3,4.0,1.3,versicolor
806 | 6.5,2.8,4.6,1.5,versicolor
807 | 5.7,2.8,4.5,1.3,versicolor
808 | 6.3,3.3,4.7,1.6,versicolor
809 | 4.9,2.4,3.3,1.0,versicolor
810 | 6.6,2.9,4.6,1.3,versicolor
811 | 5.2,2.7,3.9,1.4,versicolor
812 | 5.0,2.0,3.5,1.0,versicolor
813 | 5.9,3.0,4.2,1.5,versicolor
814 | 6.0,2.2,4.0,1.0,versicolor
815 | 6.1,2.9,4.7,1.4,versicolor
816 | 5.6,2.9,3.6,1.3,versicolor
817 | 6.7,3.1,4.4,1.4,versicolor
818 | 5.6,3.0,4.5,1.5,versicolor
819 | 5.8,2.7,4.1,1.0,versicolor
820 | 6.2,2.2,4.5,1.5,versicolor
821 | 5.6,2.5,3.9,1.1,versicolor
822 | 5.9,3.2,4.8,1.8,versicolor
823 | 6.1,2.8,4.0,1.3,versicolor
824 | 6.3,2.5,4.9,1.5,versicolor
825 | 6.1,2.8,4.7,1.2,versicolor
826 | 6.4,2.9,4.3,1.3,versicolor
827 | 6.6,3.0,4.4,1.4,versicolor
828 | 6.8,2.8,4.8,1.4,versicolor
829 | 6.7,3.0,5.0,1.7,versicolor
830 | 6.0,2.9,4.5,1.5,versicolor
831 | 5.7,2.6,3.5,1.0,versicolor
832 | 5.5,2.4,3.8,1.1,versicolor
833 | 5.5,2.4,3.7,1.0,versicolor
834 | 5.8,2.7,3.9,1.2,versicolor
835 | 6.0,2.7,5.1,1.6,versicolor
836 | 5.4,3.0,4.5,1.5,versicolor
837 | 6.0,3.4,4.5,1.6,versicolor
838 | 6.7,3.1,4.7,1.5,versicolor
839 | 6.3,2.3,4.4,1.3,versicolor
840 | 5.6,3.0,4.1,1.3,versicolor
841 | 5.5,2.5,4.0,1.3,versicolor
842 | 5.5,2.6,4.4,1.2,versicolor
843 | 6.1,3.0,4.6,1.4,versicolor
844 | 5.8,2.6,4.0,1.2,versicolor
845 | 5.0,2.3,3.3,1.0,versicolor
846 | 5.6,2.7,4.2,1.3,versicolor
847 | 5.7,3.0,4.2,1.2,versicolor
848 | 5.7,2.9,4.2,1.3,versicolor
849 | 6.2,2.9,4.3,1.3,versicolor
850 | 5.1,2.5,3.0,1.1,versicolor
851 | 5.7,2.8,4.1,1.3,versicolor
852 | 6.3,3.3,6.0,2.5,virginica
853 | 5.8,2.7,5.1,1.9,virginica
854 | 7.1,3.0,5.9,2.1,virginica
855 | 6.3,2.9,5.6,1.8,virginica
856 | 6.5,3.0,5.8,2.2,virginica
857 | 7.6,3.0,6.6,2.1,virginica
858 | 4.9,2.5,4.5,1.7,virginica
859 | 7.3,2.9,6.3,1.8,virginica
860 | 6.7,2.5,5.8,1.8,virginica
861 | 7.2,3.6,6.1,2.5,virginica
862 | 6.5,3.2,5.1,2.0,virginica
863 | 6.4,2.7,5.3,1.9,virginica
864 | 6.8,3.0,5.5,2.1,virginica
865 | 5.7,2.5,5.0,2.0,virginica
866 | 5.8,2.8,5.1,2.4,virginica
867 | 6.4,3.2,5.3,2.3,virginica
868 | 6.5,3.0,5.5,1.8,virginica
869 | 7.7,3.8,6.7,2.2,virginica
870 | 7.7,2.6,6.9,2.3,virginica
871 | 6.0,2.2,5.0,1.5,virginica
872 | 6.9,3.2,5.7,2.3,virginica
873 | 5.6,2.8,4.9,2.0,virginica
874 | 7.7,2.8,6.7,2.0,virginica
875 | 6.3,2.7,4.9,1.8,virginica
876 | 6.7,3.3,5.7,2.1,virginica
877 | 7.2,3.2,6.0,1.8,virginica
878 | 6.2,2.8,4.8,1.8,virginica
879 | 6.1,3.0,4.9,1.8,virginica
880 | 6.4,2.8,5.6,2.1,virginica
881 | 7.2,3.0,5.8,1.6,virginica
882 | 7.4,2.8,6.1,1.9,virginica
883 | 7.9,3.8,6.4,2.0,virginica
884 | 6.4,2.8,5.6,2.2,virginica
885 | 6.3,2.8,5.1,1.5,virginica
886 | 6.1,2.6,5.6,1.4,virginica
887 | 7.7,3.0,6.1,2.3,virginica
888 | 6.3,3.4,5.6,2.4,virginica
889 | 6.4,3.1,5.5,1.8,virginica
890 | 6.0,3.0,4.8,1.8,virginica
891 | 6.9,3.1,5.4,2.1,virginica
892 | 6.7,3.1,5.6,2.4,virginica
893 | 6.9,3.1,5.1,2.3,virginica
894 | 5.8,2.7,5.1,1.9,virginica
895 | 6.8,3.2,5.9,2.3,virginica
896 | 6.7,3.3,5.7,2.5,virginica
897 | 6.7,3.0,5.2,2.3,virginica
898 | 6.3,2.5,5.0,1.9,virginica
899 | 6.5,3.0,5.2,2.0,virginica
900 | 6.2,3.4,5.4,2.3,virginica
901 | 5.9,3.0,5.1,1.8,virginica
902 | 5.1,3.5,1.4,0.2,setosa
903 | 4.9,3.0,1.4,0.2,setosa
904 | 4.7,3.2,1.3,0.2,setosa
905 | 4.6,3.1,1.5,0.2,setosa
906 | 5.0,3.6,1.4,0.2,setosa
907 | 5.4,3.9,1.7,0.4,setosa
908 | 4.6,3.4,1.4,0.3,setosa
909 | 5.0,3.4,1.5,0.2,setosa
910 | 4.4,2.9,1.4,0.2,setosa
911 | 4.9,3.1,1.5,0.1,setosa
912 | 5.4,3.7,1.5,0.2,setosa
913 | 4.8,3.4,1.6,0.2,setosa
914 | 4.8,3.0,1.4,0.1,setosa
915 | 4.3,3.0,1.1,0.1,setosa
916 | 5.8,4.0,1.2,0.2,setosa
917 | 5.7,4.4,1.5,0.4,setosa
918 | 5.4,3.9,1.3,0.4,setosa
919 | 5.1,3.5,1.4,0.3,setosa
920 | 5.7,3.8,1.7,0.3,setosa
921 | 5.1,3.8,1.5,0.3,setosa
922 | 5.4,3.4,1.7,0.2,setosa
923 | 5.1,3.7,1.5,0.4,setosa
924 | 4.6,3.6,1.0,0.2,setosa
925 | 5.1,3.3,1.7,0.5,setosa
926 | 4.8,3.4,1.9,0.2,setosa
927 | 5.0,3.0,1.6,0.2,setosa
928 | 5.0,3.4,1.6,0.4,setosa
929 | 5.2,3.5,1.5,0.2,setosa
930 | 5.2,3.4,1.4,0.2,setosa
931 | 4.7,3.2,1.6,0.2,setosa
932 | 4.8,3.1,1.6,0.2,setosa
933 | 5.4,3.4,1.5,0.4,setosa
934 | 5.2,4.1,1.5,0.1,setosa
935 | 5.5,4.2,1.4,0.2,setosa
936 | 4.9,3.1,1.5,0.1,setosa
937 | 5.0,3.2,1.2,0.2,setosa
938 | 5.5,3.5,1.3,0.2,setosa
939 | 4.9,3.1,1.5,0.1,setosa
940 | 4.4,3.0,1.3,0.2,setosa
941 | 5.1,3.4,1.5,0.2,setosa
942 | 5.0,3.5,1.3,0.3,setosa
943 | 4.5,2.3,1.3,0.3,setosa
944 | 4.4,3.2,1.3,0.2,setosa
945 | 5.0,3.5,1.6,0.6,setosa
946 | 5.1,3.8,1.9,0.4,setosa
947 | 4.8,3.0,1.4,0.3,setosa
948 | 5.1,3.8,1.6,0.2,setosa
949 | 4.6,3.2,1.4,0.2,setosa
950 | 5.3,3.7,1.5,0.2,setosa
951 | 5.0,3.3,1.4,0.2,setosa
952 | 7.0,3.2,4.7,1.4,versicolor
953 | 6.4,3.2,4.5,1.5,versicolor
954 | 6.9,3.1,4.9,1.5,versicolor
955 | 5.5,2.3,4.0,1.3,versicolor
956 | 6.5,2.8,4.6,1.5,versicolor
957 | 5.7,2.8,4.5,1.3,versicolor
958 | 6.3,3.3,4.7,1.6,versicolor
959 | 4.9,2.4,3.3,1.0,versicolor
960 | 6.6,2.9,4.6,1.3,versicolor
961 | 5.2,2.7,3.9,1.4,versicolor
962 | 5.0,2.0,3.5,1.0,versicolor
963 | 5.9,3.0,4.2,1.5,versicolor
964 | 6.0,2.2,4.0,1.0,versicolor
965 | 6.1,2.9,4.7,1.4,versicolor
966 | 5.6,2.9,3.6,1.3,versicolor
967 | 6.7,3.1,4.4,1.4,versicolor
968 | 5.6,3.0,4.5,1.5,versicolor
969 | 5.8,2.7,4.1,1.0,versicolor
970 | 6.2,2.2,4.5,1.5,versicolor
971 | 5.6,2.5,3.9,1.1,versicolor
972 | 5.9,3.2,4.8,1.8,versicolor
973 | 6.1,2.8,4.0,1.3,versicolor
974 | 6.3,2.5,4.9,1.5,versicolor
975 | 6.1,2.8,4.7,1.2,versicolor
976 | 6.4,2.9,4.3,1.3,versicolor
977 | 6.6,3.0,4.4,1.4,versicolor
978 | 6.8,2.8,4.8,1.4,versicolor
979 | 6.7,3.0,5.0,1.7,versicolor
980 | 6.0,2.9,4.5,1.5,versicolor
981 | 5.7,2.6,3.5,1.0,versicolor
982 | 5.5,2.4,3.8,1.1,versicolor
983 | 5.5,2.4,3.7,1.0,versicolor
984 | 5.8,2.7,3.9,1.2,versicolor
985 | 6.0,2.7,5.1,1.6,versicolor
986 | 5.4,3.0,4.5,1.5,versicolor
987 | 6.0,3.4,4.5,1.6,versicolor
988 | 6.7,3.1,4.7,1.5,versicolor
989 | 6.3,2.3,4.4,1.3,versicolor
990 | 5.6,3.0,4.1,1.3,versicolor
991 | 5.5,2.5,4.0,1.3,versicolor
992 | 5.5,2.6,4.4,1.2,versicolor
993 | 6.1,3.0,4.6,1.4,versicolor
994 | 5.8,2.6,4.0,1.2,versicolor
995 | 5.0,2.3,3.3,1.0,versicolor
996 | 5.6,2.7,4.2,1.3,versicolor
997 | 5.7,3.0,4.2,1.2,versicolor
998 | 5.7,2.9,4.2,1.3,versicolor
999 | 6.2,2.9,4.3,1.3,versicolor
1000 | 5.1,2.5,3.0,1.1,versicolor
1001 | 5.7,2.8,4.1,1.3,versicolor
1002 | 6.3,3.3,6.0,2.5,virginica
1003 | 5.8,2.7,5.1,1.9,virginica
1004 | 7.1,3.0,5.9,2.1,virginica
1005 | 6.3,2.9,5.6,1.8,virginica
1006 | 6.5,3.0,5.8,2.2,virginica
1007 | 7.6,3.0,6.6,2.1,virginica
1008 | 4.9,2.5,4.5,1.7,virginica
1009 | 7.3,2.9,6.3,1.8,virginica
1010 | 6.7,2.5,5.8,1.8,virginica
1011 | 7.2,3.6,6.1,2.5,virginica
1012 | 6.5,3.2,5.1,2.0,virginica
1013 | 6.4,2.7,5.3,1.9,virginica
1014 | 6.8,3.0,5.5,2.1,virginica
1015 | 5.7,2.5,5.0,2.0,virginica
1016 | 5.8,2.8,5.1,2.4,virginica
1017 | 6.4,3.2,5.3,2.3,virginica
1018 | 6.5,3.0,5.5,1.8,virginica
1019 | 7.7,3.8,6.7,2.2,virginica
1020 | 7.7,2.6,6.9,2.3,virginica
1021 | 6.0,2.2,5.0,1.5,virginica
1022 | 6.9,3.2,5.7,2.3,virginica
1023 | 5.6,2.8,4.9,2.0,virginica
1024 | 7.7,2.8,6.7,2.0,virginica
1025 | 6.3,2.7,4.9,1.8,virginica
1026 | 6.7,3.3,5.7,2.1,virginica
1027 | 7.2,3.2,6.0,1.8,virginica
1028 | 6.2,2.8,4.8,1.8,virginica
1029 | 6.1,3.0,4.9,1.8,virginica
1030 | 6.4,2.8,5.6,2.1,virginica
1031 | 7.2,3.0,5.8,1.6,virginica
1032 | 7.4,2.8,6.1,1.9,virginica
1033 | 7.9,3.8,6.4,2.0,virginica
1034 | 6.4,2.8,5.6,2.2,virginica
1035 | 6.3,2.8,5.1,1.5,virginica
1036 | 6.1,2.6,5.6,1.4,virginica
1037 | 7.7,3.0,6.1,2.3,virginica
1038 | 6.3,3.4,5.6,2.4,virginica
1039 | 6.4,3.1,5.5,1.8,virginica
1040 | 6.0,3.0,4.8,1.8,virginica
1041 | 6.9,3.1,5.4,2.1,virginica
1042 | 6.7,3.1,5.6,2.4,virginica
1043 | 6.9,3.1,5.1,2.3,virginica
1044 | 5.8,2.7,5.1,1.9,virginica
1045 | 6.8,3.2,5.9,2.3,virginica
1046 | 6.7,3.3,5.7,2.5,virginica
1047 | 6.7,3.0,5.2,2.3,virginica
1048 | 6.3,2.5,5.0,1.9,virginica
1049 | 6.5,3.0,5.2,2.0,virginica
1050 | 6.2,3.4,5.4,2.3,virginica
1051 | 5.9,3.0,5.1,1.8,virginica
1052 | 5.1,3.5,1.4,0.2,setosa
1053 | 4.9,3.0,1.4,0.2,setosa
1054 | 4.7,3.2,1.3,0.2,setosa
1055 | 4.6,3.1,1.5,0.2,setosa
1056 | 5.0,3.6,1.4,0.2,setosa
1057 | 5.4,3.9,1.7,0.4,setosa
1058 | 4.6,3.4,1.4,0.3,setosa
1059 | 5.0,3.4,1.5,0.2,setosa
1060 | 4.4,2.9,1.4,0.2,setosa
1061 | 4.9,3.1,1.5,0.1,setosa
1062 | 5.4,3.7,1.5,0.2,setosa
1063 | 4.8,3.4,1.6,0.2,setosa
1064 | 4.8,3.0,1.4,0.1,setosa
1065 | 4.3,3.0,1.1,0.1,setosa
1066 | 5.8,4.0,1.2,0.2,setosa
1067 | 5.7,4.4,1.5,0.4,setosa
1068 | 5.4,3.9,1.3,0.4,setosa
1069 | 5.1,3.5,1.4,0.3,setosa
1070 | 5.7,3.8,1.7,0.3,setosa
1071 | 5.1,3.8,1.5,0.3,setosa
1072 | 5.4,3.4,1.7,0.2,setosa
1073 | 5.1,3.7,1.5,0.4,setosa
1074 | 4.6,3.6,1.0,0.2,setosa
1075 | 5.1,3.3,1.7,0.5,setosa
1076 | 4.8,3.4,1.9,0.2,setosa
1077 | 5.0,3.0,1.6,0.2,setosa
1078 | 5.0,3.4,1.6,0.4,setosa
1079 | 5.2,3.5,1.5,0.2,setosa
1080 | 5.2,3.4,1.4,0.2,setosa
1081 | 4.7,3.2,1.6,0.2,setosa
1082 | 4.8,3.1,1.6,0.2,setosa
1083 | 5.4,3.4,1.5,0.4,setosa
1084 | 5.2,4.1,1.5,0.1,setosa
1085 | 5.5,4.2,1.4,0.2,setosa
1086 | 4.9,3.1,1.5,0.1,setosa
1087 | 5.0,3.2,1.2,0.2,setosa
1088 | 5.5,3.5,1.3,0.2,setosa
1089 | 4.9,3.1,1.5,0.1,setosa
1090 | 4.4,3.0,1.3,0.2,setosa
1091 | 5.1,3.4,1.5,0.2,setosa
1092 | 5.0,3.5,1.3,0.3,setosa
1093 | 4.5,2.3,1.3,0.3,setosa
1094 | 4.4,3.2,1.3,0.2,setosa
1095 | 5.0,3.5,1.6,0.6,setosa
1096 | 5.1,3.8,1.9,0.4,setosa
1097 | 4.8,3.0,1.4,0.3,setosa
1098 | 5.1,3.8,1.6,0.2,setosa
1099 | 4.6,3.2,1.4,0.2,setosa
1100 | 5.3,3.7,1.5,0.2,setosa
1101 | 5.0,3.3,1.4,0.2,setosa
1102 | 7.0,3.2,4.7,1.4,versicolor
1103 | 6.4,3.2,4.5,1.5,versicolor
1104 | 6.9,3.1,4.9,1.5,versicolor
1105 | 5.5,2.3,4.0,1.3,versicolor
1106 | 6.5,2.8,4.6,1.5,versicolor
1107 | 5.7,2.8,4.5,1.3,versicolor
1108 | 6.3,3.3,4.7,1.6,versicolor
1109 | 4.9,2.4,3.3,1.0,versicolor
1110 | 6.6,2.9,4.6,1.3,versicolor
1111 | 5.2,2.7,3.9,1.4,versicolor
1112 | 5.0,2.0,3.5,1.0,versicolor
1113 | 5.9,3.0,4.2,1.5,versicolor
1114 | 6.0,2.2,4.0,1.0,versicolor
1115 | 6.1,2.9,4.7,1.4,versicolor
1116 | 5.6,2.9,3.6,1.3,versicolor
1117 | 6.7,3.1,4.4,1.4,versicolor
1118 | 5.6,3.0,4.5,1.5,versicolor
1119 | 5.8,2.7,4.1,1.0,versicolor
1120 | 6.2,2.2,4.5,1.5,versicolor
1121 | 5.6,2.5,3.9,1.1,versicolor
1122 | 5.9,3.2,4.8,1.8,versicolor
1123 | 6.1,2.8,4.0,1.3,versicolor
1124 | 6.3,2.5,4.9,1.5,versicolor
1125 | 6.1,2.8,4.7,1.2,versicolor
1126 | 6.4,2.9,4.3,1.3,versicolor
1127 | 6.6,3.0,4.4,1.4,versicolor
1128 | 6.8,2.8,4.8,1.4,versicolor
1129 | 6.7,3.0,5.0,1.7,versicolor
1130 | 6.0,2.9,4.5,1.5,versicolor
1131 | 5.7,2.6,3.5,1.0,versicolor
1132 | 5.5,2.4,3.8,1.1,versicolor
1133 | 5.5,2.4,3.7,1.0,versicolor
1134 | 5.8,2.7,3.9,1.2,versicolor
1135 | 6.0,2.7,5.1,1.6,versicolor
1136 | 5.4,3.0,4.5,1.5,versicolor
1137 | 6.0,3.4,4.5,1.6,versicolor
1138 | 6.7,3.1,4.7,1.5,versicolor
1139 | 6.3,2.3,4.4,1.3,versicolor
1140 | 5.6,3.0,4.1,1.3,versicolor
1141 | 5.5,2.5,4.0,1.3,versicolor
1142 | 5.5,2.6,4.4,1.2,versicolor
1143 | 6.1,3.0,4.6,1.4,versicolor
1144 | 5.8,2.6,4.0,1.2,versicolor
1145 | 5.0,2.3,3.3,1.0,versicolor
1146 | 5.6,2.7,4.2,1.3,versicolor
1147 | 5.7,3.0,4.2,1.2,versicolor
1148 | 5.7,2.9,4.2,1.3,versicolor
1149 | 6.2,2.9,4.3,1.3,versicolor
1150 | 5.1,2.5,3.0,1.1,versicolor
1151 | 5.7,2.8,4.1,1.3,versicolor
1152 | 6.3,3.3,6.0,2.5,virginica
1153 | 5.8,2.7,5.1,1.9,virginica
1154 | 7.1,3.0,5.9,2.1,virginica
1155 | 6.3,2.9,5.6,1.8,virginica
1156 | 6.5,3.0,5.8,2.2,virginica
1157 | 7.6,3.0,6.6,2.1,virginica
1158 | 4.9,2.5,4.5,1.7,virginica
1159 | 7.3,2.9,6.3,1.8,virginica
1160 | 6.7,2.5,5.8,1.8,virginica
1161 | 7.2,3.6,6.1,2.5,virginica
1162 | 6.5,3.2,5.1,2.0,virginica
1163 | 6.4,2.7,5.3,1.9,virginica
1164 | 6.8,3.0,5.5,2.1,virginica
1165 | 5.7,2.5,5.0,2.0,virginica
1166 | 5.8,2.8,5.1,2.4,virginica
1167 | 6.4,3.2,5.3,2.3,virginica
1168 | 6.5,3.0,5.5,1.8,virginica
1169 | 7.7,3.8,6.7,2.2,virginica
1170 | 7.7,2.6,6.9,2.3,virginica
1171 | 6.0,2.2,5.0,1.5,virginica
1172 | 6.9,3.2,5.7,2.3,virginica
1173 | 5.6,2.8,4.9,2.0,virginica
1174 | 7.7,2.8,6.7,2.0,virginica
1175 | 6.3,2.7,4.9,1.8,virginica
1176 | 6.7,3.3,5.7,2.1,virginica
1177 | 7.2,3.2,6.0,1.8,virginica
1178 | 6.2,2.8,4.8,1.8,virginica
1179 | 6.1,3.0,4.9,1.8,virginica
1180 | 6.4,2.8,5.6,2.1,virginica
1181 | 7.2,3.0,5.8,1.6,virginica
1182 | 7.4,2.8,6.1,1.9,virginica
1183 | 7.9,3.8,6.4,2.0,virginica
1184 | 6.4,2.8,5.6,2.2,virginica
1185 | 6.3,2.8,5.1,1.5,virginica
1186 | 6.1,2.6,5.6,1.4,virginica
1187 | 7.7,3.0,6.1,2.3,virginica
1188 | 6.3,3.4,5.6,2.4,virginica
1189 | 6.4,3.1,5.5,1.8,virginica
1190 | 6.0,3.0,4.8,1.8,virginica
1191 | 6.9,3.1,5.4,2.1,virginica
1192 | 6.7,3.1,5.6,2.4,virginica
1193 | 6.9,3.1,5.1,2.3,virginica
1194 | 5.8,2.7,5.1,1.9,virginica
1195 | 6.8,3.2,5.9,2.3,virginica
1196 | 6.7,3.3,5.7,2.5,virginica
1197 | 6.7,3.0,5.2,2.3,virginica
1198 | 6.3,2.5,5.0,1.9,virginica
1199 | 6.5,3.0,5.2,2.0,virginica
1200 | 6.2,3.4,5.4,2.3,virginica
1201 | 5.9,3.0,5.1,1.8,virginica
1202 | 5.1,3.5,1.4,0.2,setosa
1203 | 4.9,3.0,1.4,0.2,setosa
1204 | 4.7,3.2,1.3,0.2,setosa
1205 | 4.6,3.1,1.5,0.2,setosa
1206 | 5.0,3.6,1.4,0.2,setosa
1207 | 5.4,3.9,1.7,0.4,setosa
1208 | 4.6,3.4,1.4,0.3,setosa
1209 | 5.0,3.4,1.5,0.2,setosa
1210 | 4.4,2.9,1.4,0.2,setosa
1211 | 4.9,3.1,1.5,0.1,setosa
1212 | 5.4,3.7,1.5,0.2,setosa
1213 | 4.8,3.4,1.6,0.2,setosa
1214 | 4.8,3.0,1.4,0.1,setosa
1215 | 4.3,3.0,1.1,0.1,setosa
1216 | 5.8,4.0,1.2,0.2,setosa
1217 | 5.7,4.4,1.5,0.4,setosa
1218 | 5.4,3.9,1.3,0.4,setosa
1219 | 5.1,3.5,1.4,0.3,setosa
1220 | 5.7,3.8,1.7,0.3,setosa
1221 | 5.1,3.8,1.5,0.3,setosa
1222 | 5.4,3.4,1.7,0.2,setosa
1223 | 5.1,3.7,1.5,0.4,setosa
1224 | 4.6,3.6,1.0,0.2,setosa
1225 | 5.1,3.3,1.7,0.5,setosa
1226 | 4.8,3.4,1.9,0.2,setosa
1227 | 5.0,3.0,1.6,0.2,setosa
1228 | 5.0,3.4,1.6,0.4,setosa
1229 | 5.2,3.5,1.5,0.2,setosa
1230 | 5.2,3.4,1.4,0.2,setosa
1231 | 4.7,3.2,1.6,0.2,setosa
1232 | 4.8,3.1,1.6,0.2,setosa
1233 | 5.4,3.4,1.5,0.4,setosa
1234 | 5.2,4.1,1.5,0.1,setosa
1235 | 5.5,4.2,1.4,0.2,setosa
1236 | 4.9,3.1,1.5,0.1,setosa
1237 | 5.0,3.2,1.2,0.2,setosa
1238 | 5.5,3.5,1.3,0.2,setosa
1239 | 4.9,3.1,1.5,0.1,setosa
1240 | 4.4,3.0,1.3,0.2,setosa
1241 | 5.1,3.4,1.5,0.2,setosa
1242 | 5.0,3.5,1.3,0.3,setosa
1243 | 4.5,2.3,1.3,0.3,setosa
1244 | 4.4,3.2,1.3,0.2,setosa
1245 | 5.0,3.5,1.6,0.6,setosa
1246 | 5.1,3.8,1.9,0.4,setosa
1247 | 4.8,3.0,1.4,0.3,setosa
1248 | 5.1,3.8,1.6,0.2,setosa
1249 | 4.6,3.2,1.4,0.2,setosa
1250 | 5.3,3.7,1.5,0.2,setosa
1251 | 5.0,3.3,1.4,0.2,setosa
1252 | 7.0,3.2,4.7,1.4,versicolor
1253 | 6.4,3.2,4.5,1.5,versicolor
1254 | 6.9,3.1,4.9,1.5,versicolor
1255 | 5.5,2.3,4.0,1.3,versicolor
1256 | 6.5,2.8,4.6,1.5,versicolor
1257 | 5.7,2.8,4.5,1.3,versicolor
1258 | 6.3,3.3,4.7,1.6,versicolor
1259 | 4.9,2.4,3.3,1.0,versicolor
1260 | 6.6,2.9,4.6,1.3,versicolor
1261 | 5.2,2.7,3.9,1.4,versicolor
1262 | 5.0,2.0,3.5,1.0,versicolor
1263 | 5.9,3.0,4.2,1.5,versicolor
1264 | 6.0,2.2,4.0,1.0,versicolor
1265 | 6.1,2.9,4.7,1.4,versicolor
1266 | 5.6,2.9,3.6,1.3,versicolor
1267 | 6.7,3.1,4.4,1.4,versicolor
1268 | 5.6,3.0,4.5,1.5,versicolor
1269 | 5.8,2.7,4.1,1.0,versicolor
1270 | 6.2,2.2,4.5,1.5,versicolor
1271 | 5.6,2.5,3.9,1.1,versicolor
1272 | 5.9,3.2,4.8,1.8,versicolor
1273 | 6.1,2.8,4.0,1.3,versicolor
1274 | 6.3,2.5,4.9,1.5,versicolor
1275 | 6.1,2.8,4.7,1.2,versicolor
1276 | 6.4,2.9,4.3,1.3,versicolor
1277 | 6.6,3.0,4.4,1.4,versicolor
1278 | 6.8,2.8,4.8,1.4,versicolor
1279 | 6.7,3.0,5.0,1.7,versicolor
1280 | 6.0,2.9,4.5,1.5,versicolor
1281 | 5.7,2.6,3.5,1.0,versicolor
1282 | 5.5,2.4,3.8,1.1,versicolor
1283 | 5.5,2.4,3.7,1.0,versicolor
1284 | 5.8,2.7,3.9,1.2,versicolor
1285 | 6.0,2.7,5.1,1.6,versicolor
1286 | 5.4,3.0,4.5,1.5,versicolor
1287 | 6.0,3.4,4.5,1.6,versicolor
1288 | 6.7,3.1,4.7,1.5,versicolor
1289 | 6.3,2.3,4.4,1.3,versicolor
1290 | 5.6,3.0,4.1,1.3,versicolor
1291 | 5.5,2.5,4.0,1.3,versicolor
1292 | 5.5,2.6,4.4,1.2,versicolor
1293 | 6.1,3.0,4.6,1.4,versicolor
1294 | 5.8,2.6,4.0,1.2,versicolor
1295 | 5.0,2.3,3.3,1.0,versicolor
1296 | 5.6,2.7,4.2,1.3,versicolor
1297 | 5.7,3.0,4.2,1.2,versicolor
1298 | 5.7,2.9,4.2,1.3,versicolor
1299 | 6.2,2.9,4.3,1.3,versicolor
1300 | 5.1,2.5,3.0,1.1,versicolor
1301 | 5.7,2.8,4.1,1.3,versicolor
1302 | 6.3,3.3,6.0,2.5,virginica
1303 | 5.8,2.7,5.1,1.9,virginica
1304 | 7.1,3.0,5.9,2.1,virginica
1305 | 6.3,2.9,5.6,1.8,virginica
1306 | 6.5,3.0,5.8,2.2,virginica
1307 | 7.6,3.0,6.6,2.1,virginica
1308 | 4.9,2.5,4.5,1.7,virginica
1309 | 7.3,2.9,6.3,1.8,virginica
1310 | 6.7,2.5,5.8,1.8,virginica
1311 | 7.2,3.6,6.1,2.5,virginica
1312 | 6.5,3.2,5.1,2.0,virginica
1313 | 6.4,2.7,5.3,1.9,virginica
1314 | 6.8,3.0,5.5,2.1,virginica
1315 | 5.7,2.5,5.0,2.0,virginica
1316 | 5.8,2.8,5.1,2.4,virginica
1317 | 6.4,3.2,5.3,2.3,virginica
1318 | 6.5,3.0,5.5,1.8,virginica
1319 | 7.7,3.8,6.7,2.2,virginica
1320 | 7.7,2.6,6.9,2.3,virginica
1321 | 6.0,2.2,5.0,1.5,virginica
1322 | 6.9,3.2,5.7,2.3,virginica
1323 | 5.6,2.8,4.9,2.0,virginica
1324 | 7.7,2.8,6.7,2.0,virginica
1325 | 6.3,2.7,4.9,1.8,virginica
1326 | 6.7,3.3,5.7,2.1,virginica
1327 | 7.2,3.2,6.0,1.8,virginica
1328 | 6.2,2.8,4.8,1.8,virginica
1329 | 6.1,3.0,4.9,1.8,virginica
1330 | 6.4,2.8,5.6,2.1,virginica
1331 | 7.2,3.0,5.8,1.6,virginica
1332 | 7.4,2.8,6.1,1.9,virginica
1333 | 7.9,3.8,6.4,2.0,virginica
1334 | 6.4,2.8,5.6,2.2,virginica
1335 | 6.3,2.8,5.1,1.5,virginica
1336 | 6.1,2.6,5.6,1.4,virginica
1337 | 7.7,3.0,6.1,2.3,virginica
1338 | 6.3,3.4,5.6,2.4,virginica
1339 | 6.4,3.1,5.5,1.8,virginica
1340 | 6.0,3.0,4.8,1.8,virginica
1341 | 6.9,3.1,5.4,2.1,virginica
1342 | 6.7,3.1,5.6,2.4,virginica
1343 | 6.9,3.1,5.1,2.3,virginica
1344 | 5.8,2.7,5.1,1.9,virginica
1345 | 6.8,3.2,5.9,2.3,virginica
1346 | 6.7,3.3,5.7,2.5,virginica
1347 | 6.7,3.0,5.2,2.3,virginica
1348 | 6.3,2.5,5.0,1.9,virginica
1349 | 6.5,3.0,5.2,2.0,virginica
1350 | 6.2,3.4,5.4,2.3,virginica
1351 | 5.9,3.0,5.1,1.8,virginica
1352 |
--------------------------------------------------------------------------------