2022年认证杯(小美赛)问题C(ICM)对人类活动进行分类-解题思路分析(含代码)

一、题目简析

是一道大数据题,重点考察多分类问题,题目不多,都是围绕着对数据的分类展开。难点在于分的类别很多,数据量很大很大。而且是txt类型的,并不是封装好的csv或者excel文件,很考验数据处理和算法设计能力。

二、逐问分析

1.请设计一套特征和一个有效的算法,以便从这些磨损传感器的数据中分类19种类型的人体行为。

首先我们需要做的就是读取数据,我们看到官方给出的数据集中,原数据按照给定的19种类型分成了19个文件,每个文件对应一种动作类型。

Appendix: File structure

• 19 activities (a)

• 8 subjects (p)

• 60 segments (s)

• 5 units on torso (T), right arm (RA), left arm (LA), right leg (RL), left leg (LL)

• 9 sensors on each unit (x, y, z accelerometers, x, y, z gyroscopes, x, y, z magnetometers)

19

然后每个类型的文件夹打开后发现里面有8个subjects。

8个subjects

• 60 segments (s)

数据集

最终打开的单个数据文件如图所示,是没有行列名称的txt文件,那么就需要指定header=None,从而避免第一行被当成了标题行,用如下代码读取:

import pandas as pd
data = pd.read_csv('s01.txt',header=None) # 获取s01数据

结果中我们注意到,因为没有标题行,结果自动添加了0/1/2...等数字作为名称,如果想要添加标题,可以用如下代码:

import pandas as pd
data = pd.read_csv('s01.txt', names=['col1','col2',.......], header=None) # 获取日期数据

如果想一次性读取data文件内所有数据,可以参考以下代码:

df_1=pd.DataFrame(columns=['col1','col2',.......])#预先写好列名
for root_dir,sub_dir,files in os.walk(r"D:\路径\data"):
    for file in files:
        file_name = os.path.join(root_dir, file)
        df = pd.read_csv(file_name,header=None)
        df_1 = pd.concat([df_1,df],ignore_index=True)

读取完数据后,我们需要检查数据集中是否存在缺失值(空值)。

参考代码:

import pandas as pd
import numpy as np
import os
for root_dir,sub_dir,files in os.walk(r"data"):
    for file in files:
        file_name = os.path.join(root_dir, file)
        df = pd.read_csv(file_name,header=None)
        print(np.any(df.isnull()))

输出值全为False,证明无缺失值。

此外,还可通过采用均值滤波法对数据进行平滑滤波处理,消除数据中的尖峰或者突变干扰,以实现更深层次的数据预处理。

在数据读取和处理之后,需要思考适用于分类的算法来学习特征并识别特征以实现动作类型的区分,不难想到机器学习算法。动作识别的基础是针对数据样本的分类特征识别, 常用的算法有 K-近邻( KNN) 、朴素贝叶斯( NB) 、决策树 ( CART) 、SVM 等。其中,SVM 算法具有较好的泛化性、 唯一的全局最优解和鲁棒性等特点,在解决非线性、有限样本等分类问题中表现出特有的优势,目前已被广泛应用于各种分类识别问题。

此外,SVM参数少,SVM的调包、优化也很方便,因此选用SVM的方法对读取的数据进行学习,输出分类模型。

(1)贴标签:合并数据时需要给不同的动作类型贴上1~19的标签,为排除受试者的影响也可以附加上受试者1~8的标签备用。后续训练时如想排除人为分标签的影响,还可用独热编码的方法实现贴标签。

(2)特征筛选:低方差过滤、卡方检验、随机森林、热力图等方法均可(可多种方法联用)。

相关性热力图

(3)归一化:为排除量纲等影响,训练前需要归一化。标准化与否视情况而定。

(4)svm训练。

(5)调参:pso、蜂群、狼群等优化算法均可。

2.由于数据的高成本,我们需要使模型在有限的数据集下具有良好的泛化能力。我们需要具体地研究和评估这个问题。请设计一种可行的方法来评估您的模型的泛化能力。

(1)模型对比,单个模型的评价是没有说服力的,可以使用决策树、神经网络等模型与之对比,凸显所选模型的优越性。

(2)评价指标对比:除了预测准确率外,还有准确率,召回率,精确率,F1-score,Fβ,ROC曲线,AUC值。

(3)加噪声,我们知道在实际测定中难免会有一些误差的存在,我们不妨给原始数据加上一个噪声,如果在加了噪声之后,模型分类准确度没有显著下降,则说明模型的鲁棒性很好。

3.请研究并克服过拟合问题,使您的分类算法能够广泛应用于人们的动作分类问题。

首先我们要知道过拟合的原因是什么?

过拟合的原因?

1. 数据特征过多,而数据量不足。对于回归类的算法而言,特征越多意味着参数数量越多,模型也就越复杂,而相比之下如果数据量不足会导致过拟合,也就是模型复杂度与数据量不匹配。

2. 训练集和测试集的数据特征、分布不够相似,这一点根本原因也是训练集过小,在总体样本中,训练集和测试集只占很小一部分,这就导致很难保证训练集和测试集与总体的数据分布相似,更难保证训练集与测试集分布相似,这样会导致模型充分学习了训练集的特征而过拟合,这样模型的泛化能力肯定是不够的。

3.训练过度。当模型对训练集训练过度,模型充分学习这个数据集上的所有数据特征,这样会对噪声和离群值异常值过分敏感,从而导致过拟合。

对此,解决的方案如下:

1. 针对第一点,可以删去一些无用特征,这样可以减少模型的参数,降低模型复杂度。

2. 扩充数据集。比如某个训练集的数据全部为正数,而理论上数据集可以取到全体实数,并且正负分布相同,那我们可以对数据集取负,对于计算机视觉常见的手段就是对训练集的图像旋转,放缩,剪切等。

3. Early Stopping。针对第三点,当模型的准确度不发生变化的时候及时停止训练,可以有效防止过度训练。

4. 正则化。正则化相当于对模型的优化添加约束条件,可以看作是一个惩罚项,通过添加不同的正则项可以实现不同的效果。

5. dropout。dropout是一种在神经网络中常用的手段来防止模型过拟合,就是以一定的概率屏蔽到一部分神经元使他们在训练中跳过,从而降低模型复杂度。

而对于我们选用的SVM来说:

在完全线性可分的数据集下,支持向量机没有过拟合问题,因为它的解是唯一的。而在非线性不可分的情况下,虽然SVM的目标函数采用结构风险最小化策略,但是由于允许误分类的存在核引入了核函数,SVM仍会有过拟合的问题:

应用的SVM模型都是核函数+软间隔的支持向量机,那么,有以下原因导致SVM过拟合:

1)选择的核函数过于powerful

2)要求的间隔过大,即在软间隔支持向量机中C的参数过大时,表示比较重视间隔,坚持要数据完全分离,当C趋于无穷大时,相当于硬间隔SVM

那么我们可以重点关注一下参数C,引入松弛变量或者往模型中加强正则化。

完整版思路/参考文献/代码链接2022年认证杯(小美赛)问题C(ICM)对人类活动进行分类-解题思路+完整代码+参考文献 (mbd.pub)

猜你喜欢

转载自blog.csdn.net/lichensun/article/details/128154066