作者:夏海彬
单位:中国移动智慧家庭运营中心
Labs 导读
ChatGPT的火爆,让机器学习再一次走进大家的视野。目前机器学习已经在各行各业得到了广泛的应用,如电商行业的广告,搜索,推荐,医疗行业的临床数据分析,金融行业的股票预测等。本文将介绍机器学习基本概念,工作流程,机器学习算法模型,模型评价指标,机器学习的模型调参,以及如何使用python进行机器学习。
1、机器学习概述
1.1什么是机器学习
机器学习是指机器通过统计学算法,对大量历史数据进行学习,进而利用生成的经验模型指导业务。
机器学习和人类大脑学习过程比较相似,人类通过归纳总结历史经验来预测未来,而电脑通过历史数据的训练,来预测未知属性。
1.2机器学习的问题分类
机器学习基于学习方法可以主要可分为监督学习和无监督学习两类。监督学习通常是指用来训练数据集有输入也有标记的结果,算法根据这些训练数据的输入和结果之间的关联来建立模型,然后用来预测,常见的任务类型有回归,分类。
回归任务主要是预测结果是连续的数值,比如预测股票价格,预测天气温度;分类指的是预测结果是个离散的数值,比如明天是否下雨,根据图片识别属于哪种花(桃花,菊花,梅花)。
回归预测和分类预测看起来大不同,但是其实他们使用的算法高重叠,大部分回归算法可用于分类,分类算法也有相应回归的实现。
1.3机器学习的工作流程
机器学习的主要流程分层3个部分,一个是数据处理,模型训练,数据预测。
数据处理是机器学习的前提,他的主要目的是把收集到的原始数据处理成模型可处理的数据。如补充缺失的数据,特征提取,特征选择,特征转换,归一化等,特征处理是个比较复杂的工程。处理完成之后,一般会随机按比例把的数据拆分成3个集合用来训练,验证,测试模型。
模型训练,通过输入数据不断的训练模型,找到模型的最优解。在这个过程中需要不断评估模型,调整模型的参数,直到找到模型的最优解。
预测,就是用训练出来的模型,来计算新的输入并输出结果。
2、机器学习的算法模型
机器学习算法模型是机器学习的核心,常用的机器学习模型有:线性回归,逻辑回归,XGBoost,LGBM,CatBoost,GBDT,ANN,SVM,TabNet,KNN,K-measn。他们的算法原理非常复杂,每个模型都可以单独写一篇概述,本文只做几个简单模型介绍,不具体展开阐述。
2.1线性回归 Linear Regression
线性回归是最简单的回归模型。一元线性回归可以理解为在二维平面上找到一条直线,使得平面上的点尽可能的在这条直线上。多元线性回归就是找到一个最佳曲线,最佳平面,最佳超平面。
2.2逻辑回归 Logistic Regression
逻辑回归可以理解为在线性回归后加了一个sigmoid函数。将线性回归变成一个0~1输出的分类问题,当然逻辑回归也是能解决回归问题。
2.3支持向量机SVM
SVM线性模型的原理是,在一个平面上找到一条直线,将不同类别的样本分开,并且使得这条两边样本的支持向量到该直线的距离最大,三维模型就是寻找平面,多维寻找超平面。
SVM有个重要的概念就是核函数Kernel ,他的主要作用是,把低维向量映射到高维空间。
实际情况中二维平面上很难找到线性分割,这时候我需要通过核函数将样本映射到三维空间。
SVM算法不仅可以应用于分类任务,也可以用于回归预测。
2.4决策树 Decision Tree
用分类任务去理解决策树非常容易明白,树中每个节点表示某个特征,而每个分叉路径则代表某个特征可能的属性值,而每个叶节点则对应从根节点到该叶节点所经历的路径所表示的对象的值。
决策树仅有单一输出,通常该算法用于解决分类问题,但是回归决策树,也能解决的预测连续数值型的回归任务。
2.5聚类算法K-means
K-means是一种无监督算法,不需要输入标记。主要思想是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。
3、机器学习的模型评估
评价指标就是,评价机器学习模型预测结果的好坏。针对回归,分类不同的问题,需采用不同的模型评估指标。
3.1回归模型评估指标
3.1.1决定系数(R2)
R2是最常见,使用最多的评价回归模型的指标。R2值越大越好,最大值为1表示预测结果和实际值完全一致,通常R2小于0.5表示该模型预测结果不太好。
3.1.2平均绝对误差(MAE)
平均绝对误差是指,每个样本的实际值减去预测值的绝对值之和,再求平均。当预测值与真实值完全吻合时等于0,即完美模型;MAE值越大,表示模型效果越差。
3.1.3均方误差(MSE)
均方误差指的是:每个样本的实际值和预测值之差的平方,再求平均。MSE越小越好,为0表示,预测结果和实际值一样。
3.1.4平均绝对百分比误差(MAPE)
MAPE 为0%表示完美模型,MAPE 大于100%则表示劣质模型。MAPE 的值越小,说明预测模型拥有更好的精确。
3.2分类模型评估指标
3.2.1准确率(Accuracy)
准确率是分类器正确分类的样本数与总样本数之比。公式定义如下:
简单理解,正确识别的样本数量除以样本总量。本来这应该是衡量模型最好的指标,但是因为样本分布不均,比如样本中99%是0,1%是1,那么我一个算法识别所有的样本都为0,那他的准确率就有99%,显然是不合理的。为了解决这个问题,就引入了精确率,召回率。
3.2.2召回率(Recall)
召回率反映了总正例中被模型正确判定正例的比重,定义如下:
召回率是指的某个分类的召回率,整个模型的召回率需要对所有分类的召回率求平均或者加权平均。个人觉得对于正样本和负样本大家其实有点迷糊,如果是多分类情况你如何解释正负样本。所以简单理解是,分类A召回率:正确预测A分类的数量除以样本里A分类的总数。所以召回率越高越好最高为100%。
3.3.3精确率(Precision)
精确率反映了模型判定的正例中真正正例的比重。公式定义如下:
精确率和召回率一样,也是指的某个分类的精确率。简单理解是,分类A精准率:正确预测A分类的数量除以预测为A分类的数量。精确率也是越高越好,最高也是100%。
4、机器学习的模型调参
调参是机器学习最重要的步骤,参数的取值直接决定了模型的好坏。那么该如何调整机器学习的模型参数呢?常用的有三种调参方法:
4.1贪心调参
采用贪心算法选取局部最优的思想,每次选择一个参数调至最优(暴露枚举),再选下一个参数进行调参,直到所有的参数调整完毕。该方法实现最简单,容易理解,容易实现,但是局部最优不一定是全局最优,所以结果不一定特别好。
4.2网格调参
采用暴力枚举的思想,通过遍历枚举所有参数可能的组合,返回一组评价指标得分最高的参数组合。很明显由于参数遍历的组合较多,所以该方法适用于小数据集,一旦数据量大了该方法很难在有效的时间能返回计算结果。
4.3 贝叶斯调参
贝叶斯优化机器学习调参,他考虑之前的模型参数信息,从而更好的调整当前的参数。具体的思想是,给定优化的目标函数(广义的函数,只需指定输入和输出即可,无需知道内部结构以及数学性质),通过不断地添加样本点来更新目标函数的后验分布(高斯过程,直到后验分布基本贴合于真实分布。
贝叶斯调参采用高斯过程,记录上次迭代参数相比网格调参,迭代次数少,速度快。
网格调参遍历枚举参数组合,计算速度非常慢,但在小数据集能结果表现较好。
5、使用python进行机器学习
目前Python是机器学习领域中最受欢迎的编程语言,它提供了丰富的机器学习库,比如常用的库Pandas、NumPy、SciPy、scikit-learn等,安装简单方便。有了这些开源库的支持,面对复杂的机器学习模型,使用者也只需要注重模型调参即可
5.1数据处理
数据处理的代码这边就不复制了,该模块主要功能主要就是数据处理,把数据拆成2个部分,训练集和测试集,数据量大的情况可以多加一个验证集。
5.2模型训练
###数据处理
x_train,y_train,x_test,y_test = input.getInput();
#####模型训练
model = LGBMRegressor()
#model = LinearRegression() 线性回归
#model = XGBRegressor() XGB
#model = SVR() 支持向量回归
#model = CatBoostRegressor() CatBoost
#model = DecisionTreeRegressor() 回归决策树
#model = MLPRegressor() 人工神经网络
model.fit(x_train, y_train)
# 结果预测
test_result = model.predict(x_test);
# 评价指标
print(eval.reg_calculate(y_test, test_result))
预测结果:
{'mse': 56.128250007456955, 'mae': 5.632787018738792, 'r2': 0.4205655889847897, 'mape': 38.814961015661694}
上述结果是LGBMRegressor模型,默认参数预测得到的结果R2为0.42,预测效果不是特别好,所以需要进行参数设置调参。
5.3 模型调参
###目标函数
def rf_cv(num_leaves, max_depth, subsample, min_child_samples, colsample_bytree):
model = LGBMRegressor(objective='regression_l1',
num_leaves=int(num_leaves),
max_depth=int(max_depth),
subsample=subsample,
min_child_samples=int(min_child_samples),
colsample_bytree=colsample_bytree, );
model.fit(x_train, y_train);
test_result = model.predict(x_test);
return r2_score(y_test, test_result);
##########贝叶斯调参,指定参数区间
rf_bo = BayesianOptimization( rf_cv,
{
'num_leaves': (2, 100),
'max_depth': (2, 100),
'subsample': (0.1, 1),
'min_child_samples': (2, 100),
'colsample_bytree': (0.6, 1.0),
},)
###迭代100次
rf_bo.maximize(n_iter=100)
贝叶斯调参会基于上次参数的结果,朝着rf_cv函数值最大的方向不断调整参数,直到最大迭代次数就停止,最后会返回最优的参数值。
调参结果:
{'mse':42.16270682540545,'mae':5.072407413364107,'r2':0.5647374861510903,'mape':36.96550403458417}
从上面可以清晰看到,通过简单的调参,就可以把R2从,0.42提升到0.56。
5.4预测结果
python提供了非常丰富的可视化的工具,用来展示机器学习的预测结果。
预测结果
上图展示的是结果值和预测值之间对比,可以看到预测结果的基本走向趋势和真实值基本上是一致的。
特征影响shap
SHAP是机器学习模型解释可视化工具,上图展示每个特征对于结果的影响。是所有的特征都视为“贡献者”。对于每个预测样本,模型都产生一个预测值,SHAP value就是该样本中每个特征所分配到的数值。
参考文献
[1] https://proceedings.neurips.cc/paper_files/paper/2012/file/05311655a15b75fab86956663e1819cd-Paper.pdf.
[2] https://www.quora.com/How-does-Bayesian-optimization-work.
[3] https://www.jianshu.com/p/c69e73dc4181.
[4] https://zhuanlan.zhihu.com/p/33794257.
[5] https://mp.weixin.qq.com/s?__biz=MzI1MjQ2OTQ3Ng==&mid=2247574498&idx=1&sn=dfebb57ded1a8efe3b59a879ee193679.
[6] https://blog.csdn.net/dfly_zx/article/details/123142984.