文章目录
1. 本周学习主要内容
1.1 机器学习的复习
- CART树决策规则与可解释性
- Adaboost、GBDT、XGBoost数学原理及代码实现
- Bagging与Boosting核心思想
- AutoML优化方法:基于贝叶斯、TPE、Hyperopt等
1.2 机器学习模型部署
- 模型+Flask ?
- 模型+ 基于Pyqt5的GUI编程
1.3 数字信号处理
- 信号处理及matlab实现基础
2.本周学习体会与问题
- 机器学习模型的部署一套流程尚未清晰,设计Web后端和软件开发,这些领域需要从头学起
- RNN和LSTM代码复现未成功,是否适合用于脑电之类的数据
- 如果要讲ML模型部署,后端与开发需要学到何种程度?
- 应用领域很广的SVM模型原理未学习清楚
- 深度学习现在应用很广的领域CV,NLP应该学习哪一领域?
- 笔记本跑程序经常宕机,功率过高
3.下周学习内容
- pyqt5 GUI开发
- flask?是否需要简单的学习接口知识就可以实现模型部署
- SVM、RNN、LSTM模型的原理与代码复现
4.本周重点
4.1 AutoML的思想与代码复现
- 4.1.1 超参数优化HPO(HyperParameter Optimization)
每一个机器学习算法都会有超参数,而超参数的设置很大程度上影响了算法实际的使用效果,因此调参是机器学习算法工程师最为基础和重要的任务。现代机器学习与深度学习算法的超参数量众多,不仅实现方法异常灵活、算法性能也受到更多的参数的复合影响,因此当人工智能浪潮来临时,可以自动选择超参数的超参数优化HPO领域也迎来了新一轮爆发。 - 4.1.2 网格搜索的理论极限与缺点
在所有超参数优化的算法当中,枚举网格搜索是最为基础和经典的方法。在搜索开始之前,我们需要人工将每个超参数的备选值一一列出,多个不同超参数的不同取值之间排列组合,最终将组成一个参数空间(parameter space)。枚举网格搜索算法会将这个参数空间当中所有的参数组合带入模型进行训练,最终选出泛化能力最强的组合作为模型的最终超参数。
对网格搜索而言,如果参数空间中的某一个点指向了损失函数真正的最小值,那枚举网格搜索时一定能够捕捉到该最小值以及对应的参数(相对的,假如参数空间中没有任意一点指向损失函数真正的最小值,那网格搜索就一定无法找到最小值对应的参数组合)。
参数空间越大、越密,参数空间中的组合刚好覆盖损失函数最小值点的可能性就会越大。这是说,极端情况下,当参数空间穷尽了所有可能的取值时,网格搜索一定能够找到损失函数的最小值所对应的最优参数组合,且该参数组合的泛化能力一定是强于人工调参的。 - 4.1.3 不同网络搜索方法效果对比
- 4.1.4 对半网格搜索HalvingSearchCV
构建代码简单流程
# 定义参数空间
param_grid_simple = {"criterion": ["squared_error","poisson"]
, 'n_estimators': [*range(20,100,5)]
, 'max_depth': [*range(10,25,2)]
, "max_features": ["log2","sqrt",16,32,64,"auto"]
, "min_impurity_decrease": [*np.arange(0,5,10)]
}
#建立回归器、交叉验证
reg = RFR(random_state=1412,verbose=True,n_jobs=-1)
cv = KFold(n_splits=5,shuffle=True,random_state=1412)
#定义对半搜索
search = HalvingGridSearchCV(estimator=reg
,param_grid=param_grid_simple
,factor=1.5
,min_resources=500
,scoring = "neg_mean_squared_error"
,verbose = True
,random_state=1412
,cv = cv
,n_jobs=-1)
- 4.2.1 贝叶斯优化方法
贝叶斯优化方法是当前超参数优化领域的SOTA手段(State of the Art),可以被认为是当前最为先进的优化框架,它可以被应用于AutoML的各大领域,不止限于超参数搜索HPO的领域,更是可以被用于神经网络架构搜索NAS以及元学习等先进的领域。现代几乎所有在效率和效果上取得优异成果的超参数优化方法都是基于贝叶斯优化的基本理念而形成的,因此贝叶斯优化是整个AutoML中的重点 - Bayes_opt
- Hyperopt
- Optuna
- Skopt
- 一个流程:基于Bayes_opt实现GP优化
1 定义目标函数
def bayesopt_objective(n_estimators,max_depth,max_features,min_impurity_decrease):
#定义评估器
#需要调整的超参数等于目标函数的输入,不需要调整的超参数则直接等于固定值
#默认参数输入一定是浮点数,因此需要套上int函数处理成整数
reg = RFR(n_estimators = int(n_estimators)
,max_depth = int(max_depth)
,max_features = int(max_features)
,min_impurity_decrease = min_impurity_decrease
,random_state=1412
,verbose=False #可自行决定是否开启森林建树的verbose
,n_jobs=-1)
#定义损失的输出,5折交叉验证下的结果,输出负根均方误差(-RMSE)
cv = KFold(n_splits=5,shuffle=True,random_state=1412)
validation_loss = cross_validate(reg,X,y
,scoring="neg_root_mean_squared_error"
,cv=cv
,verbose=False
,n_jobs=-1
,error_score='raise'
#如果交叉验证中的算法执行报错,则告诉我们错误的理由
)
#交叉验证输出的评估指标是负根均方误差,因此本来就是负的损失
#目标函数可直接输出该损失的均值
return np.mean(validation_loss["test_score"])
2.定义参数空间
param_grid_simple = {'n_estimators': (80,100)
, 'max_depth':(10,25)
, "max_features": (10,20)
, "min_impurity_decrease":(0,1)
}
3.定义验证函数
def bayes_opt_validation(params_best):
reg = RFR(n_estimators = int(params_best["n_estimators"])
,max_depth = int(params_best["max_depth"])
,max_features = int(params_best["max_features"])
,min_impurity_decrease = params_best["min_impurity_decrease"]
,random_state=1412
,verbose=False
,n_jobs=-1)
cv = KFold(n_splits=5,shuffle=True,random_state=1412)
validation_loss = cross_validate(reg,X,y
,scoring="neg_root_mean_squared_error"
,cv=cv
,verbose=False
,n_jobs=-1
)
return np.mean(validation_loss["test_score"])
4.执行过程
start = time.time()
params_best, score_best = param_bayes_opt(20,280) #初始看20个观测值,后面迭代280次
print('It takes %s minutes' % ((time.time() - start)/60))
validation_score = bayes_opt_validation(params_best)
print("\n","\n","validation_score: ",validation_score)
5.效果对比
4.2 一个基于flask的简单机器学习模型部署流程(出现bug)
1、基本结构Flask是一个轻量级的Python Web开发框架,它自带了一个轻型服务器,可以部署Python 应用。对于python训练的机器学习模型,通过序列化和反序列化操作可以在Flask中进行部署。它的过程是,线下训练、保存模型,线上加载模型、部署应用。基本结构为
2.实现步骤
s1.安装python环境;
s2.安装flask;
s3.训练机器学习模型并保存;
s4.开发web应用,载入模型;
s5.运行应用,客户端访问。
3.代码实现流程
- 1.训练数据集
- 2.训练、保存模型
- 3.开发web应用,载入模型
- 4.访问测试
复现过程中出现的bug待解决
引用自作者:禺垣
来源:知乎