代码地址
使用线性SVM实现对垃圾邮件分类
(1)问题描述:
编程实现一个垃圾邮件SVM线性分类器,分别在训练集和测试集上计算准确率。其中训练数据文件:task3_train.mat,要求导入数据时输出样本数和特征维度。测试数据文件:task3_test.mat,要求导入数据时输出样本数和特征维度,测试数据标签未给出。(程序运行时间10mins左右)
(2)实现过程:
1.分析数据:
利用给出loadData(),读取数据,并输出维度:
X, y = svmF.loadData('task3_train.mat') shape = np.shape(X) print('训练集样本数:%d,特征维度:%d' % (shape[0], shape[1])) ''' output: 训练集样本数:4000,特征维度:1899 '''
观察输入如下图所示:
可知,这里是已经完成了邮件特征变量的提取的数据。
完成了邮件特征变量的提取之后, 可以利用4000个训练样本和1000个测试样本训练SVM算法, 每个原始的邮件将会被转化为一个 x ∈ R 1900 的向量 (词汇表中有1899个词汇, x 0 = 1会被添加到向量中)。
2.训练模型:
载入数据集之后, 用变量 y = 1 表示 垃圾邮件, 而 y = 0 表示非垃圾邮件可就可以训练SVM算法了。
这里我们使用sklearn的svm,具体实现代码如下所示:
c = 0.1 clf = svm.SVC(c, kernel='linear') clf.fit(X, y)
在训练集上的精度如下:
p = clf.predict(X) print('Training Accuracy: {}'.format(np.mean(p == y) * 100))
尝试高斯核:
c = 1 sigma = 0.1 clf = svm.SVC(c, kernel='rbf', gamma=np.power(sigma, -2)) clf.fit(X, y)
3.输出预测结果:
result = clf.predict(X_t) np.savetxt('result.txt', result, fmt='%d', delimiter='\n')
实验小结:
支持向量机的参数选择
C : C:C:对于C,C越大,可以理解为正则化系数越小,会出现lower bias和high variance的问题就是过拟合;C越小,可以理解为lambda越大,会出现high bias和low variance的问题就是欠拟合。
sigma:对于高斯函数的sigma,sigma越大,特征变化越平滑,会出现high bias和low variance的问题就是欠拟合;sigma越小,特征变化越陡峭,会出现lower bias和high variance的问题就是过拟合。
核函数选择:
当特征数量相对于训练集数量很大时,使用逻辑回归或者是使用线性核函数的支持向量机;
当特征数量很少,训练集数据量一般,使用高斯核函数的支持向量机;
当特征数量很少,训练集数据很大,可以考虑添加更多特征,然后使用逻辑回归或者是使用线性核函数的支持向量机。