Eka
Eka

Reputation: 15000

How to use SVM regression in Iris dataset with pandas

I am learning machine learning in python and using scikit learn package. I have already used R for this purpose and find its dataframe struture very easy. Scikit learn uses numpy array which i find little bit difficult. In python we have pandas which is similar to R dataframe. This code is taken from this website.

R

library(e1071)
library(MASS)
data(iris)

mysvm <- svm(Species ~ ., iris)
mysvm.pred <- predict(mysvm, iris)
table(mysvm.pred,iris$Species)
# mysvm.pred   setosa versicolor virginica
#   setosa     50      0          0
#   versicolor  0     48          2
#   virginica   0      2         48

Python

from sklearn import svm, datasets
from sklearn.metrics import confusion_matrix
iris = datasets.load_iris()

mysvm = svm.SVC().fit(iris.data, iris.target)
mysvm_pred = mysvm.predict(iris.data)
print confusion_matrix(mysvm_pred, iris.target)
# [[50  0  0]
#  [ 0 48  2]
#  [ 0  0 50]]

How can i use above python code with pandas dataframe and use SVM Regression

EDITED

This is what I have done

from sklearn import svm, datasets
from sklearn.metrics import confusion_matrix
import pandas as pd
iris = datasets.load_iris()
X=pd.DataFrame(iris.data,columns=iris.feature_names)
y=pd.DataFrame(iris.target)
X.head()
y.head()
mysvm = svm.SVC().fit(X,y )
mysvm_pred = mysvm.predict(X)
print confusion_matrix(mysvm_pred, y)

But its giving this error

>>> mysvm = svm.SVC().fit(X,y )
/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py:514: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y_ = column_or_1d(y, warn=True)
>>> mysvm_pred = mysvm.predict(X)
>>> print confusion_matrix(mysvm_pred, y)
/usr/local/lib/python2.7/dist-packages/numpy/core/fromnumeric.py:2645: VisibleDeprecationWarning: `rank` is deprecated; use the `ndim` attribute or function instead. To find the rank of a matrix see `numpy.linalg.matrix_rank`.
  VisibleDeprecationWarning)
[[50  0  0]
 [ 0 48  0]
 [ 0  2 50]]

Upvotes: 1

Views: 3978

Answers (2)

SalazarSid
SalazarSid

Reputation: 64

Regarding the error:

>>> print confusion_matrix(mysvm_pred, y)
/usr/local/lib/python2.7/dist-packages/numpy/core/fromnumeric.py:2645: VisibleDeprecationWarning: `rank` is deprecated; use the `ndim` attribute or function instead. To find the rank of a matrix see `numpy.linalg.matrix_rank`.
  VisibleDeprecationWarning)

You can refer this link:

Numpy/scipy deprecation warning for "rank"

Upvotes: 0

Ali
Ali

Reputation: 1635

You can use cross validation like this:

from sklearn import svm, datasets, cross_validation
from sklearn import metrics 
import pandas as pd

clf = svm.SVC()
cv_scores = cross_validation.cross_val_score(clf,iris.data,iris.target,cv=10)
cv_preds = cross_validation.cross_val_predict(clf,iris.data,iris.target,cv =10)

I am not sure what you want to do with pandas, but if you want to load the dataset to a pandas dataframe you can do it like this:

clf.fit(iris.data,iris.target)
preds = clf.predict(iris.data)

df = pd.DataFrame(iris.data)
df['target'] = iris.target
df['preds'] = preds

print(df)
print confusion_matrix(df['target'],df['preds'])

to compute accuracy:

accuracy = metrics.accuracy_score(iris.target, preds)
print(accuracy)

Upvotes: 1

Related Questions