李宏毅2021 机器学习HW1 | Arrebol 的博客

文章推薦指數: 80 %
投票人數:10人

1. Kaggle 作业地址 ; 3. 改进后的Baseline 性能 ; 4. 总结 ; 5. 完整代码地址. 文章72标签35分类23首页时间轴留言板相册统计关于Kaggle作业地址https://www.kaggle.com/c/ml2021spring-hw1/overview BaseLine的改进特征分析对数据进行了特征分析,最终使用了以下特征 [‘cli’,‘ili’,‘hh_cmnty_cli’,‘nohh_cmnty_cli’,‘tested_positive’,‘cli.1’,‘hh_cmnty_cli.1’,‘nohh_cmnty_cli.1’,‘tested_positive.1’,‘cli.2’,‘hh_cmnty_cli.2’,‘nohh_cmnty_cli.2’] 在COVID19Dataset类中的_init_方法中特征筛选部分做了如下操作: 1234567891011121314151617ifnottarget_only:feats=list(range(93))else:#TODO:Using40states&2tested_positivefeatures(indices=57&75)#仅使用前40个特征和两个tested_positive特征#feats=list(range(40))+[57,75]"""#凭感觉筛选的特征feats=list(range(52))feats.append(57)feats=feats+list(range(58,70))feats.append(75)feats=feats+list(range(76,88))"""feats=list(range(40))+feats_selected 数据打乱在COVID19Dataset类中的_init_方法中读取数据部分做了如下操作: 12345678withopen(path,'r')asfp: data=list(csv.reader(fp))#将读取到的数据转化为list,其中data[0]为表头,data[1]为第一行数据data=np.array(data[1:])[:,1:].astype(float)#将data数据去除第一行表头,同时去除第一列数据,随后转化为np的array形式ifmode!='test':#仅在非测试模式使用index=[iforiinrange(data.shape[0])]#生成样本数的列表random.shuffle(index)#打乱顺序data=data[index]#将训练集数据打乱 归一化Baseline模型的归一化是这样的: 1234Normalizefeatures(youmayremovethisparttoseewhatwillhappen)self.data[:,40:]=\(self.data[:,40:]-self.data[:,40:].mean(dim=0,keepdim=True))\/self.data[:,40:].std(dim=0,keepdim=True) 这样使用是由问题的,因为验证集上和测试集上归一化要与训练集上的归一化一致。

改进如下: 在COVID19Dataset类中的_init_方法中添加如下代码: 12345678ifself.mode=="train":#如果是训练集,均值和方差来自自己的数据self.mu=self.data[:,40:].mean(dim=0,keepdim=True)self.std=self.data[:,40:].std(dim=0,keepdim=True)else:#测试集和开发集,传进来的均值和方差是来自训练集保存,如何保存均值和方差,看数据dataload部分self.mu=muself.std=stdself.data[:,40:]=(self.data[:,40:]-self.mu)/self.std#归一化 在DataLoader部分: 1234567891011defprep_dataloader(path,mode,batch_size,fold_num,n_jobs=0,target_only=False,mu=None,std=None):'''Generatesadataset,thenisputintoadataloader.'''dataset=COVID19Dataset(path,fold_num,mu,std,mode=mode,target_only=target_only)#Constructdataset ifmode=='train':#如果是训练集,把训练集上均值和方差保存下来 mu=dataset.mustd=dataset.stddataloader=DataLoader(dataset,batch_size,shuffle=(mode=='train'),drop_last=False,num_workers=n_jobs,pin_memory=True)#Constructdataloaderreturndataloader,mu,std 在使用pre_dataloader()部分: 12tr_set,tr_mu,tr_std=prep_dataloader(tr_path,'train',config['batch_size'],fold,target_only=target_only)dv_set,_,_=prep_dataloader(tr_path,'dev',config['batch_size'],fold,target_only=target_only,mu=tr_mu,std=tr_std) 模型构建模型结构如下: 123456789self.net=nn.Sequential(nn.Linear(input_dim,256),nn.Dropout(0.5),nn.SiLU(),nn.Linear(256,128),nn.Dropout(0.5),nn.SiLU(),nn.Linear(128,1)) config参数123456789101112131415config={'fold_num':5,'n_epochs':5000,#maximumnumberofepochs'batch_size':200,#mini-batchsizefordataloader'optimizer':'SGD',#optimizationalgorithm(optimizerintorch.optim)'optim_hparas':{#hyper-parametersfortheoptimizer(dependsonwhichoptimizeryouareusing)'lr':0.001,#learningrateofSGD'momentum':0.8,#momentumforSGD'weight_decay':1e-4#'lr':0.003,#learningrateofAdam#'weight_decay':1e-4#momentumforAdam},'early_stop':300,#earlystoppingepochs(thenumberepochssinceyourmodel'slastimprovement)#'save_path':'models/model.pth'#yourmodelwillbesavedhere} k-fold训练本次训练以2:8划分数据集为开发集和训练集,同时进行5折训练,最后对得到的模型进行模型融合。

具体内容查看完整代码 改进后的Baseline性能 PublicScore PrivateSore 0.89393 0.95596 最后的结果还是不怎么样的,改了很久了,就这样吧-- 总结本次作业,总结如下: 特征分析部分和归一化存在问题的发现是参考了别人的方法才知道的,特征分析部分提升真的很大,之后遇到相同的问题也是能够使用上的 由于原来的数据集中的数据按区域存储的,因而将训练集数据打乱,提升了一点点 采用了SiLU()激活函数,同时使用了Dropout方法 k-fold训练与模型融合的方法(平均法) 后续优化: 进行更细的特征分析,选出更有用的特征 使用其他的优化方法,如Adam,Adamax 学习率,权重衰减率等超参数进行调整 完整代码地址GitHub:https://github.com/Arrebol2020/MachineLearning_LGY21Spring/blob/main/hw1/ML2021Spring_HW1.ipynb 文章作者:Arrebol文章链接:https://arrebol2020.com/posts/ec790646/版权声明:本博客所有文章除特别声明外,均采用CCBY-NC-SA4.0许可协议。

转载请注明来自Arrebol的博客!李宏毅2021机器学习打赏微信支付宝上一篇基于EfficientNet的人脸表情识别下一篇项目实战-信用卡数字识别相关推荐2021-05-23LHYMLHW2评论Arrebol少年的肩,应该担起,草长莺飞和清风明月文章72标签35分类23FollowMe目录1.Kaggle作业地址2.BaseLine的改进2.1.特征分析2.2.数据打乱2.3.归一化2.4.模型构建2.5.config参数2.6.k-fold训练3.改进后的Baseline性能4.总结5.完整代码地址最新文章LHYMLHW22021-05-23基于EfficientNet的人脸表情识别2021-05-22李宏毅2021机器学习HW12021-05-20繁本地搜索



請為這篇文章評分?