做网站到底能不能赚钱,网站优化建设苏州,天元建设集团有限公司邮编,上海摄影网站建设目录
1#xff09;数据预处理
2#xff09;Scikit-learn支持向量机
3#xff09;决策边界比较
4#xff09;非线性SVM
5#xff09;最优超参数
6#xff09;垃圾邮件过滤器 在本练习中#xff0c;我们将使用支持向量机#xff08;SVM#xff09;来构建垃圾邮件分…目录
1数据预处理
2Scikit-learn支持向量机
3决策边界比较
4非线性SVM
5最优超参数
6垃圾邮件过滤器 在本练习中我们将使用支持向量机SVM来构建垃圾邮件分类器。 我们将从一些简单的2D数据集开始使用SVM来查看它们的工作原理。 然后我们将对一组原始电子邮件进行一些预处理工作并使用SVM在处理的电子邮件上构建分类器以确定它们是否为垃圾邮件。
我们要做的第一件事是看一个简单的二维数据集看看线性SVM如何对数据集进行不同的C值类似于线性/逻辑回归中的正则化项。
1数据预处理
同样的我们还是先看看我们的数据长什么样子
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
from scipy.io import loadmatraw_data loadmat(ex6data1.mat)
raw_data
我们将其用散点图表示其中类标签由符号表示表示正类o表示负类。
data pd.DataFrame(raw_data[X], columns[X1, X2])
data[y] raw_data[y]positive data[data[y].isin([1])]
negative data[data[y].isin([0])]fig, ax plt.subplots(figsize(12,8))
ax.scatter(positive[X1], positive[X2], s50, markerx, labelPositive)
ax.scatter(negative[X1], negative[X2], s50, markero, labelNegative)
ax.legend()
plt.show() 2Scikit-learn支持向量机
from sklearn import svm
svc svm.LinearSVC(C1, losshinge, max_iter1000)
svc
首先我们使用 C1 看下结果如何。
svc.fit(data[[X1, X2]], data[y])
svc.score(data[[X1, X2]], data[y])0.9803921568627451
其次让我们看看如果C的值越大会发生什么。
svc2 svm.LinearSVC(C100, losshinge, max_iter1000)
svc2.fit(data[[X1, X2]], data[y])
svc2.score(data[[X1, X2]], data[y])1.0
3决策边界比较
这次我们得到了训练数据的完美分类但是通过增加C的值我们创建了一个不再适合数据的决策边界。 我们可以通过查看每个类别预测的置信水平来看出这一点这是该点与超平面距离的函数。
data[SVM 1 Confidence] svc.decision_function(data[[X1, X2]])fig, ax plt.subplots(figsize(12,8))
ax.scatter(data[X1], data[X2], s50, cdata[SVM 1 Confidence], cmapseismic)
ax.set_title(SVM (C1) Decision Confidence)
plt.show()
data[SVM 2 Confidence] svc2.decision_function(data[[X1, X2]])fig, ax plt.subplots(figsize(12,8))
ax.scatter(data[X1], data[X2], s50, cdata[SVM 2 Confidence], cmapseismic)
ax.set_title(SVM (C100) Decision Confidence)
plt.show() 4非线性SVM
现在我们将从线性SVM转移到能够使用内核进行非线性分类的SVM。 我们首先负责实现一个高斯核函数。 虽然scikit-learn具有内置的高斯内核但为了实现更清楚我们将从头开始实现。
def gaussian_kernel(x1, x2, sigma):return np.exp(-(np.sum((x1 - x2) ** 2) / (2 * (sigma ** 2))))
接下来我们将检查另一个数据集这次用非线性决策边界。
raw_data loadmat(ex6data2.mat)data pd.DataFrame(raw_data[X], columns[X1, X2])
data[y] raw_data[y]positive data[data[y].isin([1])]
negative data[data[y].isin([0])]fig, ax plt.subplots(figsize(12,8))
ax.scatter(positive[X1], positive[X2], s30, markerx, labelPositive)
ax.scatter(negative[X1], negative[X2], s30, markero, labelNegative)
ax.legend()
plt.show() 为了可视化决策边界这一次我们将根据实例具有负类标签的预测概率来对点做阴影。 从结果可以看出它们大部分是正确的。
svc svm.SVC(C100, gamma10, probabilityTrue)
svcdata[Probability] svc.predict_proba(data[[X1, X2]])[:,0]fig, ax plt.subplots(figsize(12,8))
ax.scatter(data[X1], data[X2], s30, cdata[Probability], cmapReds)
plt.show() 5最优超参数
对于第三个数据集我们给出了训练和验证集并且任务是基于验证集表现为SVM模型找到最优超参数。 虽然我们可以使用scikit-learn的内置网格搜索来做到这一点但是本着遵循练习的目的我们将从头开始实现一个简单的网格搜索。
raw_data loadmat(ex6data3.mat)X raw_data[X]
Xval raw_data[Xval]
y raw_data[y].ravel()
yval raw_data[yval].ravel()C_values [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]
gamma_values [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]best_score 0
best_params {C: None, gamma: None}for C in C_values:for gamma in gamma_values:svc svm.SVC(CC, gammagamma)svc.fit(X, y)score svc.score(Xval, yval)if score best_score:best_score scorebest_params[C] Cbest_params[gamma] gammabest_score, best_params(0.965, {C: 0.3, gamma: 100})
6垃圾邮件过滤器
在这一部分中我们的目标是使用SVM来构建垃圾邮件过滤器。 在练习文本中有一个任务涉及一些文本预处理以获得适合SVM处理的格式的数据。 然而这个任务很简单将字词映射到为练习提供的字典中的ID而其余的预处理步骤如HTML删除词干标准化等已经完成。
spam_train loadmat(spamTrain.mat)
spam_test loadmat(spamTest.mat)spam_trainX spam_train[X]
Xtest spam_test[Xtest]
y spam_train[y].ravel()
ytest spam_test[ytest].ravel()X.shape, y.shape, Xtest.shape, ytest.shape
每个文档已经转换为一个向量其中1,899个维对应于词汇表中的1,899个单词。 它们的值为二进制表示文档中是否存在单词。 在这一点上训练评估是用一个分类器拟合测试数据的问题。
svc svm.SVC()
svc.fit(X, y)
print(Training accuracy {0}%.format(np.round(svc.score(X, y) * 100, 2)))Training accuracy 94.4%
print(Test accuracy {0}%.format(np.round(svc.score(Xtest, ytest) * 100, 2)))Test accuracy 95.3%