- 数据集每个样本包含561种身体信号特征
- 使用5种身体分类模型将样本分类到6个类:
{Laying, Standing, Sitting, Walking, Walking_upstairs, Walking_downstairs}
- 比较并分析5种模型的分类性能:
- 普通神经网络
- A*超参数搜索算法优化后的神经网络(pytorch)
- 输入样本经过特殊处理的Bert模型
- GridSearch优化后的,sklearn实现的SVM
- sklearn实现的DecisionTree
- sklearn实现的RandomForest
- 其中,我们主要想研究的,就是
A*超参数搜索算法优化后的神经网络
- 实验设备:NVIDIA Qura P4000
- 我们的最终目标是设计和实现一个A*算法,能够使用元启发搜索从各种不同的【隐藏层数,隐单元数,激活函数种类(sigmoid, relu, tanh)】组合中,找到一个最佳组合,使得应用这个组合下的神经网络的分类性能可以达到并超越SVM在相同任务上的最佳性能。
- 对于每种超参数
[layer_num, hidden_size, activation_type]
, 我都在它的左右两个方向进行了邻居搜索,遍历每个没有评估过的组合。 - 我们根据一个节点总分函数
f(n) = c(n) + h(n)
来选择邻居集合中的某一个邻居, 选中以后,再迭代寻找它周围的所有邻居。 - 真实代价函数
c(n)
, 和启发式函数h(n)
的设计,请参考文档后半部分,或报告。 - A*算法的停止条件:
is_goal()
函数判定NN的性能是否达到SVM的最佳性能,如果达到就停止。
- 我们将原始的561维浮点数特征通过在两两浮点数之间加上
[SEP]
token, 以及在第一个浮点数前加上[CLS]
token, 在最后一个浮点数后面加上[SEP]
token, 实现了把561维浮点特征的样本转为了一个单一字符串样本。 - 也就是说,我们将原始的分类问题转为了一个
文本分类
问题。让bert把每个样本分到6个类。
- 存放位置
- activity_classification_sklearn.py 中存放的是SVM
- activity_classification_torch.py 中存放的是Neural Network
- 其中包含了A*优化算法,以及相关模块
- activity_classification_transformer.py 中存放的是基于transformers包的Bert模型,用于text分类
- activity_classification_decisionTree.py 中存放的是决策树模型
- 所有的模型会合并到一个runner.py文件中。
具体细节可以查看 实验报告.pdf
conda create --name 环境名字 python=3.8
conda activate 你的环境名
torch
scikit-learn
transformers
numpy
pandas
matplotlib
seaborn
- 模型已经完工。
- 我们比较了 accuracy, recall, precision, f1, roc, auc 这几个指标,然后就是交叉验证的平均loss
- main分支几乎不会更改了,但会修复bug
- cd到项目目录
pip install -r requirements.txt
-
把项目代码打包解压到本地后, 打开runner.py文件
-
运行即可
-
如果你只想看单个模型的表现的话,注释掉其他模型对应的代码即可
-
我们的第一个目标是将测试数据集(test.cv)中的每个样本分类为6个类别之一(Laying,Standing,Sitting,Walking,Walking_upstairs,Walking_downstairs),使用5种不同的机器学习模型(神经网络,SVM,随机森林,Bert,A*优化神经网络)来实现这一目标。
-
为此,我们首先需要训练我们的分类器,训练集存储在“train.csv”文件中,每行包含563列,其中前561列称为样本特征,最后一列“Activity”(第563列)是类别标签,它存储了一个样本所属的类别名称(例如Standing)。
-
我们的第二个目标是使用matplotlib获取不同模型的性能图 (准确率、训练损失、交叉验证损失、精确率、召回率、f1得分、auc),以折线图、条形图、ROC曲线、混淆矩阵和分类报告表的形式展现。
-
我们的第三个目标是比较这5个模型之间的所有性能指标,并分析指标背后的原因。
-
我们的第四个目标是查看Bert模型是否可以应用于多浮点数特征样本的分类任务【其中涉及到将多浮点数样本转为单一的文本样本】,并获得类似的性能。
-
我们的最终目标是设计和实现一个A*算法,能够使用元启发搜索从各种不同的【隐藏层数,隐单元数,激活函数种类(sigmoid, relu, tanh)】组合中,找到一个最佳组合,使得应用这个组合下的神经网络的分类性能可以达到并超越SVM在相同任务上的最佳性能。
- 我们选出了两种性能最好的模型,分别是GridSearch优化后的SVM,以及A*优化后的神经网络(自定义TorchModel)。
- 可以看出,A*优化后的NN比没有优化过的NN,在所有指标上,都高出了%2~%4。
- 但是即使有A*的加持,SVM依然比优化后的NN高出2%左右。