-
Notifications
You must be signed in to change notification settings - Fork 18
/
05_iris_prework_solutions.py
124 lines (91 loc) · 3.16 KB
/
05_iris_prework_solutions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
'''
EXERCISE: "Human Learning" with iris data
'''
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
# load the famous iris data
iris = load_iris()
# what do you think these attributes represent?
iris.data
iris.data.shape
iris.feature_names
iris.target
iris.target_names
# intro to numpy
type(iris.data)
## PART 1: Read data into pandas and explore
iris.feature_names
# the feature_names are a bit messy, let's
# clean them up. remove the (cm)
# at the end and replace any spaces with an underscore
# create a list called "features" that
# holds the cleaned column names
features = [i.replace(' ','_')[:-5] for i in iris.feature_names]
# read the iris data into pandas, with our refined column names
df = pd.DataFrame(iris.data, columns=features)
# create a list of species (should be 150 elements)
# using iris.target and iris.target_names
# resulting list should only have the words "setosa", "versicolor", and "virginica"
'''
species ==
['setosa',
'setosa',
'setosa',
'setosa',
...
...
'virginica',
'virginica']
Hint: use the iris.target_names and iris.target arrays
'''
species = [iris.target_names[i] for i in iris.target]
# add the species list as a new DataFrame column
df['species'] = species
# explore data numerically, looking for differences between species
# try grouping by species and check out the different predictors
# explore data numerically, looking for differences between species
df.describe()
df.groupby('species').sepal_length.mean()
df.groupby('species')['sepal_length', 'sepal_width', 'petal_length', 'petal_width'].mean()
df.groupby('species').agg(np.mean)
df.groupby('species').agg([np.min, np.max])
df.groupby('species').describe()
'''
agg is a new function we haven't seen yet. It will
aggregate each column using specified lists of functions.
We have been using some of its shortcuts but using
agg allows us to put in many functions at a time
df.groupby('species').agg(np.mean)
==
df.groupby('species').mean()
BUT
df.groupby('species').agg([np.min, np.max])
doesn't have a short form
'''
# explore data by sorting, looking for differences between species
df.sort_index(by='sepal_length').values
df.sort_index(by='sepal_width').values
df.sort_index(by='petal_length').values
df.sort_index(by='petal_width').values
# I used values in order to see all of the data at once
# without .values, a dataframe is returned
## PART 2: Write a function to predict the species for each observation
# create a dictionary so we can reference columns by name
# the key of the dictionary should be the species name
# the values should be the the strings index in the columns
# col_ix['sepal_length'] == 0
# col_ix['species'] == 4
col_ix = {col:index for index, col in enumerate(df.columns)}
# define function that takes in a row of data and returns a predicted species
def classify_iris(data):
if data[col_ix['petal_length']] < 3:
return 'setosa'
elif data[col_ix['petal_width']] < 1.8:
return 'versicolor'
else:
return 'virginica'
# make predictions and store as numpy array
preds = np.array([classify_iris(row) for row in df.values])
# calculate the accuracy of the predictions
np.mean(preds == df.species.values)