用 Matplotlib 绘制 SVM?

Posted

技术标签:

【中文标题】用 Matplotlib 绘制 SVM?【英文标题】:Plot SVM with Matplotlib? 【发布时间】:2017-09-03 05:35:44 【问题描述】:

我有一些有趣的用户数据。它提供了有关用户被要求执行的某些任务的及时性的一些信息。我试图找出,如果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))

我现在正在尝试了解如何绘制决策边界。我的目标是使用 Actual EndPlanned End 绘制 2 路散点图。自然地,我检查了文档(参见例如here)。但我无法绕过它。这是如何工作的?

【问题讨论】:

一方面,您链接的文档页面中的决策边界图基于两个数字列(sepal.width,sepal.length)绘制预测和真实类。您的 X 中有很多列。您希望将哪两个用于决策边界图中的 x、y 轴?如果您有第三个分类变量,则可以通过为(第三个)分类变量的每个级别绘制前两个变量的单独决策边界图,将其包含在可视化中。 抱歉,错过了什么。我想绘制一个基于Planned EndActual End 的二维散点图。我将编辑问题!谢谢! 【参考方案1】:

作为对未来的提醒,如果您在尝试的绘图代码中提供公开可用的数据集,您通常会得到更快(更好)的响应,因为我们没有“April.csv”。您还可以省略“April.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)

【讨论】:

感谢您的提醒和出色的回答! mlextend 似乎适用于较小的数据集。我有大约 500 个条目(也不算太多),但 python 以退出代码结束。我想知道为什么? 如果您更新此问题或发布另一个(并在此处链接)并为您当前的错误提供可重现的代码示例,我可以尝试提供帮助。否则我真的猜不出发生了什么。 老实说,我无法真正重现它。我刚刚制作了一个包含 5000 个条目的随机数据集——一切正常。我真的不知道问题是什么。 mlextend 工作得很好!只是不在我的数据集上。

以上是关于用 Matplotlib 绘制 SVM?的主要内容,如果未能解决你的问题,请参考以下文章

使用 matplotlib 创建自己的颜色图并绘制颜色比例

tkinter内嵌Matplotlib系列之解读官网教材

Mac下面 matplotlib 中文无法显示解决

从线性 SVM 绘制 3D 决策边界

python使用matplotlib绘制水平条形图并在条形图上添加实际数值标签实战

如何在 sklearn Python 中绘制 SVM 决策边界?