任何机器学习模型,均可用以下公式进行解释:假设函数+损失函数+优化函数。其中假设函数是模型的计算形态,也即把x映射到y的f(x);损失函数是指残差等学习方向;优化函数是指GD, SGD, mini-batch-GD, adam, 牛顿法等优化方法。
1. 机器学习中的生成模型和判别模型?
通俗的来讲,生成模型是求联合概率,而判别模型是求条件概率。
判别模型,又可以称为条件模型,或条件概率模型,估计的是条件概率分布,主要关心模型的边缘分布,其目标函数主要对应于分类准确率。常见的主要有:logistic regression,SVM, 最近邻等。判别模型分类边界较灵活,在聚类、视角变化、部分遮挡、尺度改变等方面效果较好,但它不能反映训练数据本身的特性,且缺少先验结构。
生成模型,又称为产生式模型,估计的是联合概率分布,用于随机生成的观察值建模,特别是在给定某些隐藏参数情况下,也可用于对数据建模,或作为生成条件概率密度函数的中间步骤。生成模型与判别模型最大的不同:生成模型添加了先验概率p(class, context) = p(class|context) * p(context) 。常见的主要有:高斯,朴素贝叶斯,HMMs, Sigmoid belief networks, Bayesian networks, Markov random fields。
2. 损失函数的种类?
在学习过程中最小化每个训练样例的误差,这是使用梯度下降等优化策略完成的,而这个误差来自于损失函数。
2.1 回归损失函数
(1) 平方损失函数MSE:
MSE损失函数通过平方误差来惩罚模型犯的大错误,但对异常值的健壮性降低,当数据容易出现较多的异常值时,不应采用此损失函数。
(2)绝对误差损失MAE:
MAE对异常值更加健壮。
(3)Huber损失
结合了MSE和MAE的最佳特性,对于较小的误差,它是二次的,否则是线性的,不仅可以保持损失函数具有连续的导数,同时可以利用mse梯度随误差减小的特性来得到更精细的最小值,对异常值具有更好的鲁棒性。
2.2 二分类损失函数
(1) 二元交叉熵损失(logistic)
主要用于逻辑回归,类别标签为0或1
(2) Hinge损失
主要用于带有标签{1,-1}的支持向量机,Hinge损失不仅会惩罚错误的预测,还会惩罚不自信的正确预测,且不鼓励分类器过度自信,让某个可以正确分类的样本距离分割线的距离超过1并不会有任何奖励。从而使得分类器可以更专注整体的分类误差。
在实际应用中,预测值y并不总属于{1,-1},很多时候希望训练的是两个元素之间的相似关系。其中y是正确预测的得分,y′是错误预测的得分,两者的差值可用来表示两种预测结果的相似关系,margin是一个由自己指定的安全系数。我们希望正确预测的得分高于错误预测的得分,且高出一个边界值 margin,换句话说,y越高越好,y′ 越低越好,(y–y′)越大越好,(y′–y)越小越好,但二者得分之差最多为margin就足够了,差距更大并不会有任何奖励。这样设计的目的在于,对单个样本正确分类只要有margin的把握就足够了,更大的把握则不必要,过分注重单个样本的分类效果反而有可能使整体的分类效果变坏。分类器应该更加专注于整体的分类误差。
广义Hinge损失函数2.3 多分类损失函数
(1)多分类交叉熵损失
多分类交叉熵损失是二元交叉熵损失函数的推广,输入向量Xi和相应的one-hot编码目标Yi的损失是:,其中Yi是one-hot编码向量,,当第i个元素属于类别j时,y_ij=1,否则为0.
(2)KL散度
衡量两个概率分布的匹配程度的指标,两个分布差异越大,KL散度越大。 其中,p(x)是目标分布,q(x)是去匹配的分布,如果两个分布完全匹配,则
3. 模型评估?
3.1 评估方法
在模型评估中,我们经常要对数据集进行训练集和测试集的划分,数据集划分通常要保证两个条件:①训练集和测试集的分布要与样本真实分布一致,即训练集和测试集都要保证是从样本真实分布中独立同分布采样而得;②训练集和测试集要互斥,即两个子集之间没有交集。
离线评估方法:K-Fold, Hold-out, boostrap自助法等。自助法在统计学上是一种有放回的抽样方法,不同于留出法和交叉验证无放回的抽样方式,在做数据集分类时,对整体样本n进行n次有放回抽样得到n个样本,然后把抽到的n个样本作为训练集,其中会出现部分样本重复,同时有一部分样本一次也没被抽到,这部分作为测试集。
在线评估方法:AB test等。A/B测试在产品优化中的应用方法是:在产品正式迭代发版之前,为同一个目标制定两个(或以上)方案,将用户流量对应分成几组,在保证每组用户特征相同的前提下,让用户分别看到不同的方案设计,根据几组用户的真实数据反馈,科学的帮助产品进行决策。A/B测试的应用方式决定了它的三大特性:①先验性: A/B测试其实是一种“先验”的试验体系,属于预测型结论,与“后验”的归纳性结论差别巨大。②并行性: A/B测试是将两个或以上的方案同时在线试验,这样做的好处在于保证了每个版本所处环境的一致性,便于更加科学客观地对比优劣。同时,也节省了验证的时间,无需在验证完一个版本之后再测试另一个。③科学性: 这里强调的是流量分配的科学性。A/B 测试的正确做法,是将相似特征的用户均匀的分配到试验组中,确保每个组别的用户特征的相似性,从而避免出现数据偏差,使得试验的结果更有代表性。
3.2 评估准则
(1)混淆矩阵
混淆矩阵定义(2)准确率、精确率、召回率、F1-Score、Roc曲线
准确率:accuracy=(TP+TN)/(TP+FN+TN+FP)
精确率:precision=TP/(TP+FP),表示在被预测为正类中真正是正类的比例。
召回率:recall=TP/(TP+FN),表示在所有正类样本中被正确识别的比例。
F1-score是综合precision和recall两个指标的判断指标,,F1-score=2*precision*recall/(precision+recall),取值在[0,1]之间,越大越好。
ROC曲线是根据一系列不同的二分类方式(分界值或决定域),以TPR为纵坐标,FPR为横坐标绘制的曲线,实际上ROC曲线是对一系列的TPR和FPR的值所构成点的连线绘制,而其中每一个点都代表一个概率分界值,即把大于分界值的部分分为正类,小于分界值的分为父类。对于模型而言,我们计算出每个样本属于正类的概率,然后对其概率值进行排序,计算每个概率作为分界点的TPR和FPR,然后绘制曲线,就构成了ROC曲线。在样本有限的情况下,ROC曲线通常不是一条平滑的曲线,而是锯齿形的,数据较多的情况下,曲线会接近平滑。同时我们也可以计算AUC(Area Under roc Curve)来作为评价指标。
(3)线性回归评价指标
①MSE, RMSE, MAE,MAPE, SMAPE
测试数据集中的点,距离模型的平均距离越小,该模型越精确。
均方误差MSE=
均方根误差RMSE=
平均绝对误差MAE=
平均绝对百分比误差MAPE=
对称平均绝对百分比误差SMAPE=
②R-squared
分子表示使用我们的模型预测产生的错误,分子表示使用产生的错误,自己的模型预测产生的错误/基础模型预测产生的错误,表示自己的模型没有拟合住的数据,因此可以理解为,自己的模型拟合住的数据。
在模型中增加多个变量,即使是事实上无关的变量,也会小幅度调低R^2,也即不断添加变量能让模型的效果提升,而利用adjusted r square,能对添加的非显著变量给出惩罚,也就是说随意添加一个变量并不一定能让模型拟合度上升。
(4)多分类评估指标
①宏平均:Macro-average
针对每个不同的类别算出其准确率,再将所有类别的准确率做平均。
②微平均:Micro-average
所有分类正确的样本/总样本数
两个评估指标的对比:a. 如果每个class的样本数量差不多,那么宏平均和微平均没有太大差异;b.如果每个class的样本数量差异很大,则有:更注重样本量多的class,使用微平均;更注重样本量少的class,使用宏平均。c.如果微平均大大低于宏平均,检查样本量多的class。d. 如果宏平均大大低于微平均,检查样本量少的class。
4. 数据清洗?
数据清洗路径(1)预处理阶段
主要有两件事情:①将数据导入处理工具。②看数据:a.看元数据,包括字段解释、数据来源、代码表等一切描述数据的信息;b. 抽取一部分数据,使用人工查看方式,对数据本身有一个直观的了解,并初步发现一些问题,为之后的处理做准备。
(2)第一步:缺失值清洗
①确定缺失值范围:对每个字段都计算其缺失值比例,然后按照缺失比例和字段重要性,分别制定策略。
②去除不需要的字段;
③填充缺失内容:a.以业务知识或经验推测填充缺失值;b.以同一指标的计算结果(均值,中位数,众数等)填充;c.以不同指标的计算结果填充;d.ffill, fillna, bfill等填充方法。
主要使用的方法有插补法与建模法:
a. 插补法:随机插补法(从总体中随机抽取某几个样本代替缺失样本)、多重插补法(通过变量之间的关系对缺失值进行预测,利用蒙特卡洛方法生成多个完整的数据集,在对这些数据集进行分析,最后对分析结果进行汇总处理)、热平台插补法(在非缺失数据集中找到一个与缺失值所在样本相似的样本,利用其中的观测值对缺失值进行插补;当数据量较大时,可以按某些变量对数据进行分层,在层中对缺失值使用均值插补)、拉格朗日插值法和牛顿插值法。
b.建模法:利用回归、贝叶斯、随机森林、决策树等模型对缺失数据进行预测。
④重新取数:如果某些指标非常重要又缺失率高,那就需要和取数人员或业务人员沟通,是否有其他渠道可以取到相关数据。
(3)异常值处理
①判断异常值:
a.可视化分析(箱线图);b.简单统计分析,利用pandas的describe方法实现,通过观察数据描述性统计,判断是否存在不合理值;c. 基于正态分布(原则);d.基于模型检测,建立一个模型,异常是那些同模型不能完美拟合的对象;e.基于距离,通过在对象间定义临近性度量,异常对象是那些远离其他对象的对象;f.基于密度,当一个点的局部密度显著低于它的大部分近邻时,才将其分类为离群点; g.基于聚类,当一个对象不属于任何簇时,判断其为离群点;
②处理异常值:
a.删除异常值-明显看出是异常且数量较少;
b.不处理-如果算法对异常值不敏感则不处理;若敏感,则避免使用基于距离的一些算法。
c.平均值替代-损失信息小,简单高效
d.视为缺失值-可以按照缺失值的方法来处理
(4)第二步:格式内容清洗
可能存在的情况:①时间、日期、数值、全半角等显示格式不一致;②内容中有不该存在的字符,比如空格等;③内容与该字段内容不符,比如列错位等。
(5)第三步:逻辑错误清洗
包括去重(去重需要关注的点很多,可能有些虽然名字重复但实际上并非重复值的现象)、去除不合理值(年龄200等情况)、修正矛盾内容(比如身份证号和年龄之间存在不一致)。
(6)第四步:非需求数据清洗
删除不需要的字段要慎之又慎,记得备份。。。
(7)第五步:关联性验证
如果数据有多个来源,那么就有必要进行关联性验证。关联数据变动在数据库模型中就应该涉及,多个来源的数据整合是非常复杂的工作,一定要注意数据之间的关联性,尽量在分析过程中不要出现数据之间互相矛盾,而你却毫无察觉的情况。
5. 特征工程?
数据和特征决定了机器学习的上线,而模型和算法只是逼近这个上限而已。
特征工程(1)一些数据预处理包
from sklearn.preprocessing import StandardScaler #标准化
from sklearn.preprocessing import MinMaxScaler #min-max标准化
from sklearn.preprocessing import Normalizer #对数据的行进行归一化
from sklearn.preprocessing import Binarizer #对定量特征二值化
from sklearn.preprocessing import OneHotEncoder #对定性特征哑编码
from sklearn.preprocessing import Imputer #对数据进行缺失值计算
from sklearn.preprocessing import PolynomialFeatures #对数据多项式转换
from sklearn.preprocessing import FunctionTransformer #对数据进行指定函数转换
(2)特征选择
from sklearn.feature_selection import VarianceThreshold #filter的方差选择法,选择方差大于阈值的特征
from sklearn.feature_selection import SelectKBest;
from scipy.stats import pearsonr #filter的相关系数法,选择K个最好的特征,返回选择特征后的数据
from sklearn.feature_selection import chi2 #卡方检验(定性自变量对定性因变量的相关性)
SelectKBest(chi2,k=2).fit_transform(iris.data, iris.target) #示例
from sklearn.feature_selection import RFE; from sklearn.linear_model import LogisticRegression; RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transfrom(iris.data, iris.target) #递归特征消除法:使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。
from sklearn.feature_selection import SelectFromModel;from sklearn.ensemble import GradientBoostingClassifier;SelectFromModel (GradientBoostingClassifier()).fit_transform(iris.data,iris.target) #基于树模型进行特征选择。
(3)降维
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
网友评论