AndrewNg 机器学习习题ex6-SVM
线性SVM
1 | #!/usr/bin/python |
高斯核函数
1 | # 核函数 |
非线性决策边界
1 | raw_data = loadmat('data/ex6data2.mat') |
对于该数据集,我们将使用内置的RBF内核构建支持向量机分类器,并检查其对训练数据的准确性。 为了可视化决策边界,这一次我们将根据实例具有负类标签的预测概率来对点做阴影。 从结果可以看出,它们大部分是正确的。
1 | svc = svm.SVC(C=100, gamma=10, probability=True) |
搜索最佳参数
1 | # 搜索最佳参数 |
{‘C’: 0.3, ‘gamma’: 100} 0.965
垃圾邮件过滤
现在,我们将进行第二部分的练习。 在这一部分中,我们的目标是使用SVM来构建垃圾邮件过滤器。 在练习文本中,有一个任务涉及一些文本预处理,以获得适合SVM处理的格式的数据。 然而,这个任务很简单(将字词映射到为练习提供的字典中的ID),而其余的预处理步骤(如HTML删除,词干,标准化等)已经完成。 我将跳过机器学习任务,而不是重现这些预处理步骤,其中包括从预处理过的训练集构建分类器,以及将垃圾邮件和非垃圾邮件转换为单词出现次数的向量的测试数据集。1
2
3
4
5
6
7
8
9
10
11
12
13# 垃圾邮件过滤
mat_tr = loadmat('data/spamTrain.mat')
X, y = mat_tr.get('X'), mat_tr.get('y').ravel()
print(X.shape, y.shape) # ((4000, 1899), (4000,))
mat_test = loadmat('data/spamTest.mat')
test_X, test_y = mat_test.get('Xtest'), mat_test.get('ytest').ravel()
print(test_X.shape, test_y.shape) # ((1000, 1899), (1000,))
svc = svm.SVC()
svc.fit(X, y)
pred = svc.predict(test_X)
print(metrics.classification_report(test_y, pred))
1 | precision recall f1-score support |
这个结果是使用使用默认参数的。 。
然后用逻辑回归来计算后精确的达到了99%1
2
3
4
5# 如果是逻辑回归呢?
logit = LogisticRegression()
logit.fit(X, y)
pred = logit.predict(test_X)
print(metrics.classification_report(test_y, pred))
1 | precision recall f1-score support |
调整参数后也可以达到和逻辑回归一样的精确度1
2
3
4svc = svm.SVC(C=100)
svc.fit(X, y)
pred = svc.predict(test_X)
print(metrics.classification_report(test_y, pred))
1 | precision recall f1-score support |