Pages

Friday, November 24, 2017

SVM on Iris Data - Part 1

iris_svm_1
In [49]:
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline 
import seaborn as sns
import numpy as np
import pandas as pd

iris = sns.load_dataset("iris")
In [50]:
iris = sns.load_dataset("iris")
print(iris.head())
   sepal_length  sepal_width  petal_length  petal_width species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  setosa
In [51]:
features = iris[['sepal_length',  'sepal_width',  'petal_length',  'petal_width']]
print (features.head(5))
target = iris['species']
print (target.head(5))
   sepal_length  sepal_width  petal_length  petal_width
0           5.1          3.5           1.4          0.2
1           4.9          3.0           1.4          0.2
2           4.7          3.2           1.3          0.2
3           4.6          3.1           1.5          0.2
4           5.0          3.6           1.4          0.2
0    setosa
1    setosa
2    setosa
3    setosa
4    setosa
Name: species, dtype: object
In [52]:
# we are traning our model wth 75% data and leaving rest 25% for testing
from sklearn.model_selection import train_test_split
features_train, features_test,target_train, target_test = train_test_split(features,target, test_size=0.25, stratify=target)
In [53]:
# we are importng svm model and fitting the model with training data
from sklearn import svm
clf = svm.SVC()
clf.fit(features_train,target_train)
Out[53]:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
In [54]:
# Making predictions on test data
expected = clf.predict(features_test)
print(expected)
['versicolor' 'virginica' 'setosa' 'versicolor' 'versicolor' 'versicolor'
 'setosa' 'virginica' 'versicolor' 'setosa' 'virginica' 'virginica'
 'virginica' 'versicolor' 'setosa' 'setosa' 'setosa' 'virginica'
 'versicolor' 'virginica' 'setosa' 'virginica' 'setosa' 'virginica'
 'virginica' 'virginica' 'versicolor' 'virginica' 'virginica' 'setosa'
 'setosa' 'setosa' 'versicolor' 'versicolor' 'setosa' 'setosa' 'versicolor'
 'virginica']
In [55]:
# actual labels of test data
actual = target_test.as_matrix()
print(actual)
['versicolor' 'virginica' 'setosa' 'versicolor' 'versicolor' 'versicolor'
 'setosa' 'virginica' 'versicolor' 'setosa' 'virginica' 'virginica'
 'virginica' 'versicolor' 'setosa' 'setosa' 'setosa' 'virginica'
 'versicolor' 'virginica' 'setosa' 'versicolor' 'setosa' 'virginica'
 'virginica' 'virginica' 'versicolor' 'virginica' 'virginica' 'setosa'
 'setosa' 'setosa' 'versicolor' 'versicolor' 'setosa' 'setosa' 'versicolor'
 'virginica']
In [56]:
# comparing expected and actual data
df_results = pd.DataFrame({'actual':actual, 'expected':expected})
df_results['Test_Result'] = np.where(df_results['actual'] == df_results['expected'], 'Pass', 'Fail')
print(df_results)
        actual    expected Test_Result
0   versicolor  versicolor        Pass
1    virginica   virginica        Pass
2       setosa      setosa        Pass
3   versicolor  versicolor        Pass
4   versicolor  versicolor        Pass
5   versicolor  versicolor        Pass
6       setosa      setosa        Pass
7    virginica   virginica        Pass
8   versicolor  versicolor        Pass
9       setosa      setosa        Pass
10   virginica   virginica        Pass
11   virginica   virginica        Pass
12   virginica   virginica        Pass
13  versicolor  versicolor        Pass
14      setosa      setosa        Pass
15      setosa      setosa        Pass
16      setosa      setosa        Pass
17   virginica   virginica        Pass
18  versicolor  versicolor        Pass
19   virginica   virginica        Pass
20      setosa      setosa        Pass
21  versicolor   virginica        Fail
22      setosa      setosa        Pass
23   virginica   virginica        Pass
24   virginica   virginica        Pass
25   virginica   virginica        Pass
26  versicolor  versicolor        Pass
27   virginica   virginica        Pass
28   virginica   virginica        Pass
29      setosa      setosa        Pass
30      setosa      setosa        Pass
31      setosa      setosa        Pass
32  versicolor  versicolor        Pass
33  versicolor  versicolor        Pass
34      setosa      setosa        Pass
35      setosa      setosa        Pass
36  versicolor  versicolor        Pass
37   virginica   virginica        Pass
In [57]:
from sklearn.metrics import accuracy_score
accuracy_score(actual, expected)
Out[57]:
0.97368421052631582

This means our SVM classifer predicted 97.36% of test data accurately after being trained on training samples.

In [58]:
plt.figure(figsize=(10,6))
plt.legend(bbox_to_anchor=(1, 1), loc=2)
g= sns.swarmplot(x="actual", y=df_results.index, hue="Test_Result",data=df_results)

Our model failed to predict just one sample where actual value was versicolor but predicted value was virginica.

SVM on Iris Data - Part 1

iris_svm_1 In [49]: import matplotlib import matplotlib.pyplot as plt % matplot...