用Matplotlib绘制SVM?

4
我有一些有趣的用户数据,其中包含用户执行某些任务的及时性信息。我正在尝试找出,如果“late”告诉我用户是否按时(0)、稍微晚了一点(1)还是相当晚了(2),它是否可预测/可解释。我从一个给出交通灯信息(绿色=未迟到,红色=超级迟到)的列中生成“late”。
这是我所做的:
  #imports
  import pandas as pd
  import numpy as np
  import matplotlib.pyplot as plt
  from sklearn import preprocessing
  from sklearn import svm
  import sklearn.metrics as sm




  #load user data
  df = pd.read_csv('April.csv', error_bad_lines=False, encoding='iso8859_15', delimiter=';')


  #convert objects to datetime data types
  cols = ['Planned Start', 'Actual Start', 'Planned End', 'Actual End']
  df = df[cols].apply(
  pd.to_datetime, dayfirst=True, errors='ignore'
  ).join(df.drop(cols, 1))

  #convert datetime to numeric data types
  cols = ['Planned Start', 'Actual Start', 'Planned End', 'Actual End']
  df = df[cols].apply(
  pd.to_numeric, errors='ignore'
  ).join(df.drop(cols, 1))


  #add likert scale for green, yellow and red traffic lights
  df['late'] = 0
  df.ix[df['End Time Traffic Light'].isin(['Yellow']), 'late'] = 1
  df.ix[df['End Time Traffic Light'].isin(['Red']), 'late'] = 2

  #Supervised Learning

    #X and y arrays
  # X = np.array(df.drop(['late'], axis=1))
  X = df[['Planned Start', 'Actual Start', 'Planned End', 'Actual End', 'Measure Package', 'Measure' , 'Responsible User']].as_matrix()

  y = np.array(df['late'])

    #preprocessing the data
  X = preprocessing.scale(X)


  #Supper Vector Machine
  clf = svm.SVC(decision_function_shape='ovo')
  clf.fit(X, y) 
  print(clf.score(X, y))

我现在正在尝试理解如何绘制决策边界。我的目标是绘制一个两个维度的散点图,其中包括实际结束时间计划结束时间。自然地,我查看了文档(例如,请参见此处)。但是我无法理解它是如何工作的?


1
首先,在您链接的文档页面中,决策边界图绘制了基于两个数值列(sepal.width、sepal.length)的预测和真实类别。您的X中有许多列。您想使用哪两个作为决策边界图的x、y轴?如果您有第三个分类变量,您可以通过绘制这些前两个变量的单独决策边界图来将其包含在可视化中,对于每个(第三个)分类变量的级别。 - Max Power
抱歉,错过了一个重要部分。我想基于“计划结束时间”和“实际结束时间”绘制一个双向散点图。我会编辑问题的!谢谢! - Rachel
1个回答

12
作为未来的提示,如果您提供了一个可公开获取的数据集与尝试绘图的代码,您通常会获得更快(且更好)的响应,因为我们没有'September.csv'。您也可以省略有关'September.csv'的数据整理代码。话虽如此...

Sebastian Raschka创建了mlxtend包,其中具有非常棒的绘图函数来完成这个任务。它在幕后使用matplotlib。

import numpy as np
import pandas as pd
from sklearn import svm
from mlxtend.plotting import plot_decision_regions
import matplotlib.pyplot as plt


# Create arbitrary dataset for example
df = pd.DataFrame({'Planned_End': np.random.uniform(low=-5, high=5, size=50),
                   'Actual_End':  np.random.uniform(low=-1, high=1, size=50),
                   'Late':        np.random.random_integers(low=0,  high=2, size=50)}
)

# Fit Support Vector Machine Classifier
X = df[['Planned_End', 'Actual_End']]
y = df['Late']

clf = svm.SVC(decision_function_shape='ovo')
clf.fit(X.values, y.values) 

# Plot Decision Region using mlxtend's awesome plotting function
plot_decision_regions(X=X.values, 
                      y=y.values,
                      clf=clf, 
                      legend=2)

# Update plot object with X/Y axis labels and Figure Title
plt.xlabel(X.columns[0], size=14)
plt.ylabel(X.columns[1], size=14)
plt.title('SVM Decision Region Boundary', size=16)

输入图像描述


1
谢谢你的提醒和出色的回答!mlextend 在较小的数据集上似乎表现良好。我大约有500个条目(也不算太多),但Python却以退出代码结束。我想知道为什么? - Rachel
如果您更新此问题或发布另一个带有可重现代码示例的帖子(并在此处链接),我可以尝试提供帮助。否则,我无法猜测发生了什么。 - Max Power
说实话,我真的无法复现它。我只是随机生成了一个包含5000个条目的数据集 - 一切都正常工作。我真的不知道问题出在哪里。mlextend很好用!只是在我的数据集上不行。 - Rachel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接