In [25]:
import matplotlib.pyplot as plt
import numpy as np
import torch
import pandas as pd
import tqdm
import sklearn.utils
import sklearn.datasets
from typing import cast
import math
import scipy.optimize
In [26]:
sklearn_iris = cast(sklearn.utils.Bunch, sklearn.datasets.load_iris())

iris = pd.DataFrame()

iris["sepal_length"] = sklearn_iris.data[:, 0]
iris["sepal_width"] = sklearn_iris.data[:, 1]
iris["petal_length"] = sklearn_iris.data[:, 2]
iris["petal_width"] = sklearn_iris.data[:, 3]

iris["is_setosa"] = (sklearn_iris.target == 0).astype(np.float32)
iris["is_versicolor"] = (sklearn_iris.target == 1).astype(np.float32)
iris["is_virginica"] = (sklearn_iris.target == 2).astype(np.float32)

iris
Out [26]:
sepal_length sepal_width petal_length petal_width is_setosa is_versicolor is_virginica
0 5.1 3.5 1.4 0.2 1.0 0.0 0.0
1 4.9 3.0 1.4 0.2 1.0 0.0 0.0
2 4.7 3.2 1.3 0.2 1.0 0.0 0.0
3 4.6 3.1 1.5 0.2 1.0 0.0 0.0
4 5.0 3.6 1.4 0.2 1.0 0.0 0.0
... ... ... ... ... ... ... ...
145 6.7 3.0 5.2 2.3 0.0 0.0 1.0
146 6.3 2.5 5.0 1.9 0.0 0.0 1.0
147 6.5 3.0 5.2 2.0 0.0 0.0 1.0
148 6.2 3.4 5.4 2.3 0.0 0.0 1.0
149 5.9 3.0 5.1 1.8 0.0 0.0 1.0

150 rows × 7 columns

In [27]:
FEATURES = ["sepal_length", "sepal_width", "petal_length", "petal_width"]
TARGETS = ["is_setosa", "is_versicolor", "is_virginica"]
In [28]:
# Let's scale the data
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

iris[FEATURES] = scaler.fit_transform(iris[FEATURES])

iris
Out [28]:
sepal_length sepal_width petal_length petal_width is_setosa is_versicolor is_virginica
0 -0.900681 1.019004 -1.340227 -1.315444 1.0 0.0 0.0
1 -1.143017 -0.131979 -1.340227 -1.315444 1.0 0.0 0.0
2 -1.385353 0.328414 -1.397064 -1.315444 1.0 0.0 0.0
3 -1.506521 0.098217 -1.283389 -1.315444 1.0 0.0 0.0
4 -1.021849 1.249201 -1.340227 -1.315444 1.0 0.0 0.0
... ... ... ... ... ... ... ...
145 1.038005 -0.131979 0.819596 1.448832 0.0 0.0 1.0
146 0.553333 -1.282963 0.705921 0.922303 0.0 0.0 1.0
147 0.795669 -0.131979 0.819596 1.053935 0.0 0.0 1.0
148 0.432165 0.788808 0.933271 1.448832 0.0 0.0 1.0
149 0.068662 -0.131979 0.762758 0.790671 0.0 0.0 1.0

150 rows × 7 columns

In [29]:
# Drop class
iris_orig = iris.copy()

iris = iris.drop(TARGETS, axis=1)

iris
Out [29]:
sepal_length sepal_width petal_length petal_width
0 -0.900681 1.019004 -1.340227 -1.315444
1 -1.143017 -0.131979 -1.340227 -1.315444
2 -1.385353 0.328414 -1.397064 -1.315444
3 -1.506521 0.098217 -1.283389 -1.315444
4 -1.021849 1.249201 -1.340227 -1.315444
... ... ... ... ...
145 1.038005 -0.131979 0.819596 1.448832
146 0.553333 -1.282963 0.705921 0.922303
147 0.795669 -0.131979 0.819596 1.053935
148 0.432165 0.788808 0.933271 1.448832
149 0.068662 -0.131979 0.762758 0.790671

150 rows × 4 columns