title: How to draw decision boundary in SVM sklearn data in python?
body: <p>I am reading email data from training set and creating train_matrix, train_labels and test_labels. Now how do I display decision boundary using matplot in python. I am using svm of sklearn. There are online example for pre given data sets through iris. But plot fails on custom data. Here is my code</p>
  
  <p>Error :</p>
  
  <pre><code>Traceback (most recent call last):
    File "classifier-plot.py", line 115, in &lt;module&gt;
      Z = Z.reshape(xx.shape)
  ValueError: cannot reshape array of size 260 into shape (150,1750)
  </code></pre>
  
  <p>Code:</p>
  
  <pre><code>import os
  import numpy as np
  from collections import Counter
  from sklearn import svm
  import matplotlib
  import matplotlib.pyplot as plt
  from sklearn.metrics import accuracy_score
  
  
  def make_Dictionary(root_dir):
      all_words = []
      emails = [os.path.join(root_dir,f) for f in os.listdir(root_dir)]
      for mail in emails:
          with open(mail) as m:
              for line in m:
                  words = line.split()
                  all_words += words
      dictionary = Counter(all_words)
      list_to_remove = dictionary.keys()
  
      for item in list_to_remove:
          if item.isalpha() == False:
              del dictionary[item]
          elif len(item) == 1:
              del dictionary[item]
      dictionary = dictionary.most_common(3000)
  
      return dictionary
  
  
  
  def extract_features(mail_dir):
      files = [os.path.join(mail_dir,fi) for fi in os.listdir(mail_dir)]
      features_matrix = np.zeros((len(files),3000))
      train_labels = np.zeros(len(files))
      count = 0;
      docID = 0;
      for fil in files:
        with open(fil) as fi:
          for i,line in enumerate(fi):
            if i == 2:
              words = line.split()
              for word in words:
                wordID = 0
                for i,d in enumerate(dictionary):
                  if d[0] == word:
                    wordID = i
                    features_matrix[docID,wordID] = words.count(word)
          train_labels[docID] = 0;
          filepathTokens = fil.split('/')
          lastToken = filepathTokens[len(filepathTokens) - 1]
          if lastToken.startswith("spmsg"):
              train_labels[docID] = 1;
              count = count + 1
          docID = docID + 1
      return features_matrix, train_labels
  
  
  
  TRAIN_DIR = "../train-mails"
  TEST_DIR = "../test-mails"
  
  dictionary = make_Dictionary(TRAIN_DIR)
  
  print "reading and processing emails from file."
  features_matrix, labels = extract_features(TRAIN_DIR)
  test_feature_matrix, test_labels = extract_features(TEST_DIR)
  
  
  model = svm.SVC(kernel="rbf", C=10000)
  
  print "Training model."
  features_matrix = features_matrix[:len(features_matrix)/10]
  labels = labels[:len(labels)/10]
  #train model
  model.fit(features_matrix, labels)
  
  predicted_labels = model.predict(test_feature_matrix)
  
  print "FINISHED classifying. accuracy score : "
  print accuracy_score(test_labels, predicted_labels)
  
  
  
  
  
  
  
  ##----------------
  
  h = .02  # step size in the mesh
  
  # we create an instance of SVM and fit out data. We do not scale our
  # data since we want to plot the support vectors
  C = 1.0  # SVM regularization parameter
  X = features_matrix
  y = labels
  svc = model.fit(X, y)
  #svm.SVC(kernel='linear', C=C).fit(X, y)
  
  # create a mesh to plot in
  x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
  y_min, y_max = y[:].min() - 1, y[:].max() + 1
  xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                       np.arange(y_min, y_max, h))
  
  # title for the plots
  titles = ['SVC with linear kernel']
  
  
  
  Z = predicted_labels#svc.predict(np.c_[xx.ravel(), yy.ravel()])
  
  # Put the result into a color plot
  Z = Z.reshape(xx.shape)
  plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)
  
  # Plot also the training points
  plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm)
  plt.xlabel('Sepal length')
  plt.ylabel('Sepal width')
  plt.xlim(xx.min(), xx.max())
  plt.ylim(yy.min(), yy.max())
  plt.xticks(())
  plt.yticks(())
  plt.title(titles[0])
  
  plt.show()
  </code></pre>