目录
机器学习与数据挖掘第一次实验报告 1
实现并对比线性分类器与非线性分类器 1
目 1
录 2
一、分类器简述 2
一 、分类器简述 2
1.1 线性分类器 2
1.3 随机梯度下降 3
1.4 梯度推导 4
1.5 基于基函数的非线性分类器 5
1.6 过拟合与正则化 5
二 、分类器实现 5
2.1 线性分类器 5
2.2 非线性分类器 6
三 、数据集描述 7
3.1 Dry Bean 数据集 7
3.2 葡萄酒数据集 7
3.3 肥胖症数据集 7
3.4 数据降维可视化 8
四 、实验结果分析 8
4.1 交叉验证学习率 8
线性分类器: 8
4.1 交叉验证正则化系数 11
线性分类器: 11
4.3 分类器交叉验证 13
4.4 权重可视化与损失函数变化 14
0.4左右。 15
4.5 正确率测试 18
4.6 精准度和召回率测试 20
五 、结论 23
实验结果:
由于 RedWine 数据集的数据集中在 类别 5 6 7,而在类别 1 2 3 8 9 完全没有样本,类别 3 4 的样本非常少,导致精确率和召回率不稳定。
对于线性分类器,类别 3 4 的精确率和召回率都为 0 即该分类器完全无法划分出这些类别的数据, 而使用非线性分类器,对识别这些样本稀缺的类别有好处。例如五阶非线性分类器,在训练集中, 对类别 3 4 就有较高的精确率,即预测为 3 4类别的样本基本是正确的,但召回率还是很低,即还
有大量的类别 3 4 的样本被分到了其他的类别。
类别 3 4 测试集的准确率和召回率为 0,很大程度是因为样本过少。
五 、结论
实验实现了Softmax线性分类器和基于基函数的非线性分类器,对于非线性分类器,我们选择了三阶非 线性和五阶非线性来进行实验,并对三个数据集 DryBean、RedWine、Obesity进行了各个方面的测试,得到以下结论:
1.通过 t-sne 初步处理数据,我们发现在所有数据集中, DryBean 的同类别聚集和不同类别分散的程度最高,RedWine 最低。
2.通过对学习率进行交叉验证,我们发现对于上述数据集,线性分类器学习率在1.5 ~ 2 时,验证机预测正确率最高,效果最好。
3.通过对正则化方法和正则化系数进行交叉验证,我们发现不论是L1正则化还是L2正则化,只有在正 则化系数比较小(1e-4 ~ 1e-5)时,正则化才能可能改善验证集预测正确率,并且改善的幅度比较小。除此之外,本文转载自http://www.biyezuopin.vip/onews.asp?id=16712我们发现L2正则化对正则化系数更加敏感,当学习率为1e-3时,验证集正确率就有 明显的下降。
4.对比线性分类器、不含正则化的三阶非线性分类器、不含正则化的五阶非线性分类器、含L1正则化 的三阶非线性分类器、含L2 正则化的三阶非线性分类器、含L1正则化的五阶非线性分类器、含L2 正则化的五阶非线性分类器:
1.对不同的数据集而言,最佳的模型不同:对于 DryBean 数据集,五阶非线性分类器表现最好;对于 Obesity 数据集,三阶非线性分类器表现最好;对于 RedWine 数据集,线性分类器表现最好;
2.使用L1的正则化效果略优于L2正则化,在正则化系数合适的情况下,使用正则化效果能够提 高分类器的分类效果。
3.通过观察损失函数变化和预测正确率变化,我们发现高阶非线性模型收敛快,但波动大。
5.经过测试,DryBean 数据集的训练准确率和测试准确率都在 90% 以上,使用三阶非线性模型分类器, DryBean 的分类正确率能到达92%,Obesity 数据集的训练准确率和测试准确率都在 80% 左右,RedWine 数据集的训练准确率和测试准确率都在 60% 左右。
6.通过精确率和召回率测试,我们发现分类的效果和大程度上受数据集本身的影响,样本分类不均匀 的数据集,如RedWine,分类效果就偏差。
from test_utils import *
from Classifiers.softmax_classifier import SoftmaxLinearClassifier
from Classifiers.softmax_classifier import SoftmaxNonlinearClassifier
from Classifiers.kernel import *
if __name__ == "__main__":
# 载入数据集
# X, y, attrs, classes = load_red_wine_quality()
# X, y, attrs, classes = load_white_wine_quality()
# X, y, attrs, classes = load_obesity()
X, y, attrs, classes = load_drybean()
# 数据降维可视化
# t_sne(X, y, classes)
# 交叉验证
# learning_rate_cross_validition(X, y, ite_num=2000, batch_size=500)
# normalization_cross_validition(X, y, ite_num=2000, batch_size=500)
# learning_rate_cross_validition(X, y, ite_num=2000, batch_size=500, nonlinear_kernel=x_3_kernel)
# normalization_cross_validition(X, y, ite_num=2000, batch_size=500, nonlinear_kernel=x_3_kernel)
# learning_rate_cross_validition(X, y, ite_num=2000, batch_size=500, nonlinear_kernel=x_5_kernel)
# normalization_cross_validition(X, y, ite_num=2000, batch_size=500, nonlinear_kernel=x_5_kernel)
softmax_validition(X, y, ite_num=2000, batch_size=500, reg_style="L0")
softmax_validition(X, y, ite_num=2000, batch_size=500, reg_style="L1")
softmax_validition(X, y, ite_num=2000, batch_size=500, reg_style="L2")
# 计算生成权重矩阵
# softmax = SoftmaxNonlinearClassifier(x_5_kernel)
# gen_w_loss(X, y, attrs, classes, softmax)
kernel = [None, x_3_kernel, x_5_kernel]
reg_style = ["L0", "L1", "L2"]
# 测试准确率
# for k in kernel:
# for r in reg_style:
# softmax = SoftmaxNonlinearClassifier(kernel_function=k)
# test_acc(X, y, softmax,ite_num=500, reg_style=r, reg_strength=1e-4)
# 测试 Precision、Recall
# for k in kernel:
# softmax = SoftmaxNonlinearClassifier(kernel_function=k)
# test_pre_rec(X, y, attrs, classes, softmax)













