17. sklearn 中的支持向量机

sklearn 中的支持向量机

在此部分,你将使用支持向量机拟合给定样本数据集。

在此之前,我们先了解下构建此模型所需的工具。

对于支持向量机模型,你将使用 scikit-learn 的 SVC 类。该类提供了定义模型并将模型与数据进行拟合的函数。

>>> from sklearn.svm import SVC
>>> model = SVC()
>>> model.fit(x_values, y_values)

在上述示例中, model 变量是一个拟合到数据 x_values y_values 的支持向量机模型。拟合模型是指寻找拟合训练数据的最佳界线。我们使用模型的 predict() 函数进行两项预测。

>>> print(model.predict([ [0.2, 0.8], [0.5, 0.4] ]))
[[ 0., 1.]]

该模型返回了一个预测结果数组,每个输入数组一个预测结果。第一个输入 [0.2, 0.8] 的预测结果为 0. 。第二个输入 [0.5, 0.4] 的预测结果为 1.

超参数

当我们定义模型时,可以指定超参数。正如在此部分中看到的,最常见的超参数包括:

  • C :C 参数。
  • kernel :内核。最常见的内核为 'linear'、'poly' 和 'rbf'。
  • degree :如果内核是多项式,则此参数为内核中的最大单项式次数。
  • gamma :如果内核是径向基函数,则此参数为 γ 参数。

例如,下面我们定义了一个次数为4、C 参数为 0.1 的多项式内核模型。

>>> model = SVC(kernel='poly', degree=4, C=0.1)

支持向量机练习

在这道练习中,你将处理以下样本数据集,目标是定义一个准确率达到 100% 的模型。

你可以在以下练习的“data.csv”标签页中找到数据文件。它包含三列,前两列由数据点的坐标组成,第三列为标签。

我们将为你加载数据并将数据拆分为特征 X 和标签 y

你需要完成以下步骤:

1. 构建支持向量机模型
*使用 scikit-learn 的 SVC 创建支持向量机分类模型并将其赋值给变量 model

2. 将模型与数据进行拟合

  • 如果有必要的话,指定一些超参数。目标是在数据集中获得 100% 的准确率。
    提示:并非所有内核都合适。

3. 使用模型进行预测

  • 预测训练集的标签,并将此列表赋值给变量 y_pred

4. 计算模型的准确率
*为此,使用 sklearn 函数 accuracy_score

点击 测试答案 (Test Run) 后,你将能够看到模型的边界区域,这些边界区域可以帮助你调整并获得正确的参数(如果需要的话)。

注意: 这道练习要求在训练集上的准确率达到 100%。当然,要小心过拟合!如果参数选择非常大的值,你将很好地拟合训练集,但是可能并不是最好的模型。尝试寻找能够完成任务的最小可能参数,这样过拟合的几率就更小,虽然我们不会对此进行评分。

Start Quiz:

# Import statements 
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np

# Read the data.
data = np.asarray(pd.read_csv('data.csv', header=None))
# Assign the features to the variable X, and the labels to the variable y. 
X = data[:,0:2]
y = data[:,2]

# TODO: Create the model and assign it to the variable model.
# Find the right parameters for this model to achieve 100% accuracy on the dataset.
model = None

# TODO: Fit the model.

# TODO: Make predictions. Store them in the variable y_pred.
y_pred = None

# TODO: Calculate the accuracy and assign it to the variable acc.
acc = None
0.24539,0.81725,0
0.21774,0.76462,0
0.20161,0.69737,0
0.20161,0.58041,0
0.2477,0.49561,0
0.32834,0.44883,0
0.39516,0.48099,0
0.39286,0.57164,0
0.33525,0.62135,0
0.33986,0.71199,0
0.34447,0.81433,0
0.28226,0.82602,0
0.26613,0.75,0
0.26613,0.63596,0
0.32604,0.54825,0
0.28917,0.65643,0
0.80069,0.71491,0
0.80069,0.64181,0
0.80069,0.50146,0
0.79839,0.36988,0
0.73157,0.25,0
0.63249,0.18275,0
0.60023,0.27047,0
0.66014,0.34649,0
0.70161,0.42251,0
0.70853,0.53947,0
0.71544,0.63304,0
0.74309,0.72076,0
0.75,0.63596,0
0.75,0.46345,0
0.72235,0.35526,0
0.66935,0.28509,0
0.20622,0.94298,1
0.26613,0.8962,1
0.38134,0.8962,1
0.42051,0.94591,1
0.49885,0.86404,1
0.31452,0.93421,1
0.53111,0.72076,1
0.45276,0.74415,1
0.53571,0.6038,1
0.60484,0.71491,1
0.60945,0.58333,1
0.51267,0.47807,1
0.50806,0.59211,1
0.46198,0.30556,1
0.5288,0.41082,1
0.38594,0.35819,1
0.31682,0.31433,1
0.29608,0.20906,1
0.36982,0.27632,1
0.42972,0.18275,1
0.51498,0.10965,1
0.53111,0.20906,1
0.59793,0.095029,1
0.73848,0.086257,1
0.83065,0.18275,1
0.8629,0.10965,1
0.88364,0.27924,1
0.93433,0.30848,1
0.93433,0.19444,1
0.92512,0.43421,1
0.87903,0.43421,1
0.87903,0.58626,1
0.9182,0.71491,1
0.85138,0.8348,1
0.85599,0.94006,1
0.70853,0.94298,1
0.70853,0.87281,1
0.59793,0.93129,1
0.61175,0.83187,1
0.78226,0.82895,1
0.78917,0.8962,1
0.90668,0.89912,1
0.14862,0.92251,1
0.15092,0.85819,1
0.097926,0.85819,1
0.079493,0.91374,1
0.079493,0.77632,1
0.10945,0.79678,1
0.12327,0.67982,1
0.077189,0.6886,1
0.081797,0.58626,1
0.14862,0.58041,1
0.14862,0.5307,1
0.14171,0.41959,1
0.08871,0.49269,1
0.095622,0.36696,1
0.24539,0.3962,1
0.1947,0.29678,1
0.16935,0.22368,1
0.15553,0.13596,1
0.23848,0.12427,1
0.33065,0.12427,1
0.095622,0.2617,1
0.091014,0.20322,1
# Import statements 
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np

# Read the data.
data = np.asarray(pd.read_csv('data.csv', header=None))
# Assign the features to the variable X, and the labels to the variable y. 
X = data[:,0:2]
y = data[:,2]

# TODO: Create the model and assign it to the variable model.
# Find the right parameters for this model to achieve 100% accuracy on the dataset.
model = SVC(kernel='rbf', gamma=27)

# TODO: Fit the model.
model.fit(X,y)

# TODO: Make predictions. Store them in the variable y_pred.
y_pred = model.predict(X)

# TODO: Calculate the accuracy and assign it to the variable acc.
acc = accuracy_score(y, y_pred)