从概率论的角度说,机器学习模型是一个概率分布 P θ ( X ) P_{\theta }(X) Pθ(X) (这里以概率密度函数来代表概率分布)
机器学习的任务就是求最优参数 θ t \theta_{t} θt ,使得概率分布 P θ ( X ) P_{\theta }(X) Pθ(X) 最大(即已发生的事实,其对应的概率理应最大)。
θ t = a r g m a x θ P θ X \theta_{t} =\underset{\theta}{argmax}P_{\theta }X θt=θargmaxPθX
其中 argmax 函数代表的是取参数使得数据的概率密度最大。
求解最优参数 θ t \theta_{t} θt的过程,我们称之为模型的训练过程( Training ),用来训练这个模型的数据集称之为训练集X( Training Set ),由此得到的模型就可以用来做相应的预测。
我们可以把训练集X拆成单条数据的集合X=(X_{1}…X_{n})。每个X的子集为迷你批次。假设单条数据互相独立,上式改写的单条数据乘积可以转为概率对数的求和:
θ t = a r g m a x θ ∏ i P θ X i = a r g m a x θ ∑ i l o g P θ X i \theta_{t}=\underset{\theta}{argmax}\prod_{i} P_{\theta }X_{i}=\underset{\theta}{argmax}\sum_{i}log P_{\theta }X_{i} θt=θargmaxi∏PθXi=θargmaxi∑logPθXi
极大似然估计MLE(Maximum Linklihood Estimation):整体求解上式最优参数 θ t \theta_{t} θt的过程。
解方程求解的缺点:
为了提高复杂关系的拟合能力,往往会把一维离散特征两两组合,构成高维组合特征。比如用在推荐系统里面。
1.9 文本表示有哪些模型?
θ t = a r g m a x θ ∑ i l o g P θ X i = a r g m a x θ ∑ i l o g 1 2 π σ e ( f θ ( X i ) − Y i ) 2 2 σ 2 \theta_{t}=\underset{\theta}{argmax}\sum_{i}log P_{\theta }X_{i}=\underset{\theta}{argmax}\sum_{i}log \frac{1}{\sqrt{2\pi }\sigma }e^{\frac{(f_{\theta }(X_{i})-Y_{i})^{2}}{2\sigma ^{2}}} θt=θargmaxi∑logPθXi=θargmaxi∑log2πσ1e2σ2(fθ(Xi)−Yi)2
θ t = a r g m i n θ ∑ i l o g ( f θ ( X i ) − Y i ) 2 \theta_{t}=\underset{\theta}{argmin}\sum_{i}log (f_{\theta }(X_{i})-Y_{i})^{2} θt=θargmini∑log(fθ(Xi)−Yi)2
上面argmin中的函数 ,称之为MSE损失函数或者L2模损失函数。
参考《机器学习常用损失函数小结》
MSE损失函数:
蓝色:损失函数
红色:损失函数导数
绿色:似然估计
MSE 和 MAE的区别:
Huber Loss是一种将 MSE 与 MAE 结合起来,取两者优点的损失函数,也被称作 Smooth Mean Absolute Error Loss 。其原理很简单,就是在误差接近 0 时使用 MSE,误差较大时使用 MAE,公式为:
Huber Loss 结合了 MSE和MAE损失,在误差接近0时使用MSE,使损失函数可导并且梯度更加稳定;在误差较大时使用 MAE 可以降低 outlier 的影响,使训练对 outlier 更加健壮。缺点是需要额外地设置一个 δ \delta δ超参数(比如取值为1)。
分位数回归 Quantile Regression 是一类在实际应用中非常有用的回归算法,通常的回归算法是拟合目标值的期望或者中位数,而分位数回归可以通过给定不同的分位点,拟合目标值的不同分位数。例如我们可以分别拟合出多个分位点,得到一个置信区间,如下图所示(图片来自笔者的一个分位数回归代码 demo Quantile Regression Demo)
其余略
略,具体看上面链接文章。
噪声对模型的影响:
冗余对模型的影响:
正则化主要是为了抑制模型的复杂度,防止过拟合,防止w数值过大模型过硬。如果是平滑任务可以使用正则项,根据经验和数据量调整正则化系数。非平滑任务,是否适用机器学习都需要商酌。
训练中,模型分布会逐渐趋向训练集分布。如果没有限制参数的范围,loss会一直减少,模型会不断拟合训练集中所有的点,产生过拟合。
假设参数的选择服从正态分布,可以得到:
θ t = a r g m a x θ ∑ i l o g P θ ( X i ∣ θ ) P ( θ ) = a r g m i n ∑ i l o g ( f θ ( X i ) − Y i ) 2 + α 2 ∣ ∣ θ ∣ ∣ 2 \theta _{t}=\underset{\theta}{argmax}\sum_{i}log P_{\theta }(X_{i}|\theta)P(\theta)=argmin\sum_{i}log (f_{\theta }(X_{i})-Y_{i})^{2}+\frac{\alpha }{2}||\theta ||^{2} θt=θargmaxi∑logPθ(Xi∣θ)P(θ)=argmini∑log(fθ(Xi)−Yi)2+2α∣∣θ∣∣2
后一项为L2正则化系数,是所有参数的平方和乘以系数 α \alpha α(参数向量的L2范数,对应欧氏距离)。其中, α = σ 2 σ 1 2 \alpha =\frac{\sigma ^{2}}{\sigma _{1}^{2}} α=σ12σ2。正则化系数越大,正则化效果越强,模型更偏向欠拟合区域。反之偏向过拟合区域。调节正则化系数就可以调节模型的过拟合情况。
假设参数的选择服从拉普拉斯分布,最后会得到L1正则化项(参数向量的L1范数,对应曼哈顿距离),即所有参数绝对值之和。
θ t = a r g m a x θ ∑ i l o g P θ ( X i ∣ θ ) P ( θ ) = a r g m i n ∑ i l o g ( f θ ( X i ) − Y i ) 2 + α ∣ ∣ θ ∣ ∣ 1 \theta _{t}=\underset{\theta}{argmax}\sum_{i}log P_{\theta }(X_{i}|\theta)P(\theta)=argmin\sum_{i}log (f_{\theta }(X_{i})-Y_{i})^{2}+{\alpha }||\theta ||_{1} θt=θargmaxi∑logPθ(Xi∣θ)P(θ)=argmini∑log(fθ(Xi)−Yi)2+α∣∣θ∣∣1
归根结底一句话,训练集数据分布无法完全代表真实数据的分布,所以需要进行调整。正则化项中不包含 w 0 w_{0} w0,因为对输入x不产生影响。使用L2正则化的逻辑回归称为岭回归。
防止过拟合的其它方法:
信息论的核心思想是量化数据中的信息内容。
在信息论中,该数值被称为分布 P P P的熵(entropy)。可以通过以下方程得到:
H [ P ] = ∑ j − P ( j ) log P ( j ) . H[P] = \sum_j - P(j) \log P(j). H[P]=j∑−P(j)logP(j).
信息论的基本定理之一指出,为了对从分布 p p p中随机抽取的数据进行编码,我们至少需要 H [ P ] H[P] H[P]“纳特(nat)”对其进行编码。“纳特”相当于比特(bit),但是对数底为 e e e而不是2。因此,一个纳特是 1 log ( 2 ) ≈ 1.44 \frac{1}{\log(2)} \approx 1.44 log(2)1≈1.44比特。
压缩与预测有什么关系呢?想象一下,我们有一个要压缩的数据流。如果我们很容易预测下一个数据,那么这个数据就很容易压缩。
为什么呢?
举一个极端的例子,假如数据流中的每个数据完全相同,这会是一个非常无聊的数据流。由于它们总是相同的,我们总是知道下一个数据是什么。所以,为了传递数据流的内容,我们不必传输任何信息。也就是说,“下一个数据是xx”这个事件毫无信息量。
但是,如果我们不能完全预测每一个事件,那么我们有时可能会感到"惊异"。克劳德·香农决定用信息量 log 1 P ( j ) = − log P ( j ) \log \frac{1}{P(j)} = -\log P(j) logP(j)1=−logP(j)来量化这种惊异程度。在观察一个事件 j j j时,并赋予它(主观)概率 P ( j ) P(j) P(j)。当我们赋予一个事件较低的概率时,我们的惊异会更大,该事件的信息量也就更大。
在 3.1.1中定义的熵,是当分配的概率真正匹配数据生成过程时的信息量的期望。
重新审视交叉熵
如果把熵 H ( P ) H(P) H(P)想象为“知道真实概率的人所经历的惊异程度” ,那么什么是交叉熵?
交叉熵从 P P P到 Q Q Q,记为 H ( P , Q ) H(P, Q) H(P,Q)。你可以把交叉熵想象为“主观概率为 Q Q Q的观察者在看到根据概率 P P P生成的数据时的预期惊异”。
当 P = Q P=Q P=Q时,交叉熵达到最低。在这种情况下,从 P P P到 Q Q Q的交叉熵是 H ( P , P ) = H ( P ) H(P, P)= H(P) H(P,P)=H(P)。
简而言之,我们可以从两方面来考虑交叉熵分类目标:
见文章《为什么用交叉熵做损失函数》
相对熵又称KL散度,如果对于同一个随机变量x 有两个单独的概率分布p(x)和 q(x),可以使用相对熵来衡量这两个分布的差异:
注: D K L D_{KL} DKL越小,表示p(x)和q(x)的分布越近。
在机器学习中,往往用p(x)用来描述真实分布,q(x)用来描述模型预测的分布。计算损失,理应使用相对熵来计算概率分布的差异,然而由相对熵推导出的结果看:
相 对 熵 = 交 叉 熵 − 信 息 熵 相对熵=交叉熵−信息熵 相对熵=交叉熵−信息熵
由于信息熵描述的是消除 p (即真实分布) 的不确定性所需信息量的度量,所以其值应该是最小的、固定的。那么:优化减小相对熵也就是优化交叉熵,所以在机器学习中使用交叉熵就可以了。
考虑y=0和y=1的情况,最终: L o s s = − 1 n ∑ i = 1 n y i l o g ( f i ) + ( 1 − y i ) l o g ( 1 − f i ) Loss=\frac{-1}{n}\sum_{i=1}^{n}y_{i}log(f_{i})+(1-y_{i})log(1-f_{i}) Loss=n−1i=1∑nyilog(fi)+(1−yi)log(1−fi)
上式中的大写L就是代表损失函数,最大化似然函数也就是最小化损失函数。 LR的损失函数为: 负的对数损失函数
正负样本差异过大时,比如负样本数远大于正样本数,会造成:
为了解决样本不平衡的影响,可以采用上采样或下采样:
实际中采用上采样,保证数据多样性。下采样抛弃部分负样本,数据量减少。正负样本差别特别大的时候,可以两个一起使用
逻辑函数是从正态分布和贝叶斯公式导出来的。则可以取男性为正样本y=1,女性为负样本y=0。输入一个身高170,如何判断性别。
增加特征维度,对特征进行扩充。线性可分的情况下,loss没有极小值,可以一直减小(所以会加正则项)。线性不可分的情况下,loss是一个抛物线,存在极小值。(所以逻辑回归的loss都有极小值)
参考:如何理解AUC?
混淆矩阵中有着Positive、Negative、True、False的概念,其意义如下:称预测类别为1的为Positive(阳性),预测类别为0的为Negative(阴性)。预测正确的为True(真),预测错误的为False(伪)。对上述概念进行组合,就产生了如下的混淆矩阵:
名称 | 公式 | 意义 |
---|---|---|
准确率(正确率) | a c c u r a c y = ( T P + T N ) ( T P + T N + F P + F N ) \mathbf{accuracy=\frac{(TP+TN)}{(TP+TN+FP+FN)}} accuracy=(TP+TN+FP+FN)(TP+TN) | 所有样本预测对的比例 |
精准率-查准率PPV | P r e c i s i o n = T P ( T P + F P ) \mathbf{Precision=\frac{TP}{(TP+FP)}} Precision=(TP+FP)TP | 所有被预测为1的样本中正样本的概率 |
召回率-真阳率-查全率-TPR | R e c a l l = T P ( T P + F N ) \mathbf {Recall= \frac{TP}{(TP+FN)}} Recall=(TP+FN)TP | 正样本中被预为1的概率(正样本预测对的比例) |
特异度-真阴率 | T N R = T N ( T N + F P ) \mathbf {TNR= \frac{TN}{(TN+FP)}} TNR=(TN+FP)TN | 负样本中被预为0的概率(负样本预测对的比例) |
假阳率 | F P R = T P ( T N + F P ) = 1 − 特 异 度 \mathbf {FPR=\frac{TP}{(TN+FP)}=1-特异度} FPR=(TN+FP)TP=1−特异度 | 负样本中预测为1的概率 |
f1-score | 2 1 / P r e c i s i o n + 1 / R e c a l l = 2 × P r e c i s i o n × R e a c l l P r e c i s i o n + R e c a l l \mathbf {\frac{2}{1/Precision+1/Recall}=2\times \frac{Precision\times Reacll}{Precision+Recall}} 1/Precision+1/Recall2=2×Precision+RecallPrecision×Reacll | 精准率和召回率的平衡点 |
P-R曲线 | 横轴召回率(真阳率),纵轴精准率 | 刻画精准率和召回率之间的关系 |
ROC | 横轴假阳率,纵轴真阳率,遍历所有阈值点得到的曲线 | |
AUC | Area Under ROC Curve,也就是ROC曲线下面的面积 | 同时考虑分类器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器作出合理的评价。 |
精准率和召回率是一对矛盾的度量,阈值升高,精准率升高,召回率降低。电商场景中希望把更多商品推送给用户,召回率会提高;金融风险中,银行判断违规客户要求精准度高。P-R曲线刻画精准率和召回率之间的关系,
以精准率为y轴,以召回率为x轴,可以画出下面的P-R曲线。两者的关系可以用一个P-R图来展示:
如何理解P-R(查准率-查全率)这条曲线?
拿逻辑回归举例,逻辑回归的输出是一个0到1之间的概率数字。对于阈值为0.5的情况下,我们可以得到相应的一对查准率和查全率。遍历0到1之间所有的阈值,而每个阈值下都对应着一对查准率和查全率,从而我们就得到了这条曲线。
如何找到最好的阈值点呢?这两个指标是一对矛盾体,无法做到双高。图中明显看到,如果其中一个非常高,另一个肯定会非常低。选取合适的阈值点要根据实际需求,比如我们想要高的查全率,那么我们就会牺牲一些查准率,在保证查全率最高的情况下,查准率也不那么低。
通常情况下,精确率和召回率会随着阈值的变化而变化,且互相矛盾。如果想要找到二者之间的一个平衡点,我们就需要一个新的指标:F1分数。F1分数同时考虑了查准率和查全率,让二者同时达到最高。通过选取最高的F1来确定分类阈值,F1公式如下:
1 F 1 = 1 P r e c i s i o n + 1 R e c a l l \frac{1}{F1}=\frac{1}{Precision}+\frac{1}{Recall} F11=Precision1+Recall1
AUC 的全称是 Area Under ROC Curve,也就是ROC曲线下面的面积。
ROC曲线的横轴是FPR,即False Positive(伪阳率),;纵轴是TPRate,即True Positive Rate(真阳率)。不同的阈值会影响得到的TPRate,FPRate,如果阈值取0.5,那么我们就得到了与之前一样的混淆矩阵。
遍历不同的阈值描点得到整条ROC曲线:依次使用所有预测值作为阈值,得到一系列TPRate,FPRate,描点。然后求面积,即可得到AUC。
当二者相等时,即y=x,如下图:
表示的意义是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的。和抛硬币没什么区别。AUC的最小值为0.5
而我们希望分类器达到的效果是:分类器预测正样本为1的概率,要大负样本被预测为1的概率,即真阳率大于假阳率,y>x。因此大部分的ROC曲线长成下面这个样子:
最理想的情况下,既没有真实类别为1而错分为0的样本——TPRate一直为1,也没有真实类别为0而错分为1的样本——FP rate一直为0,AUC为1,这便是AUC的极大值。(在图上是连接(1,1)这个点的正方形)
举个简单的例子。首先对于硬分类器(例如SVM,NB),预测类别为离散标签,对于8个样本的预测情况如下:
得到混淆矩阵如下:
进而算得TPRate=3/4,FPRate=2/4,连接(0,0)(0.5,0.75)和(1,1)三点得到ROC曲线:
最终得到AUC为0.625。取另一个阈值得到新ROC上的点,可以再次连起来得到新的AUC。
对于LR等预测类别为概率的分类器,依然用上述例子,假设预测结果如下:
这时,需要设置阈值来得到混淆矩阵,遍历不同的阈值描点得到整条ROC曲线,,然后求得AUC。
AUC的计算方法同时考虑了分类器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器作出合理的评价。
例如在反欺诈场景,设欺诈类样本为正例,正例占比很少(假设0.1%),如果使用准确率评估,把所有的样本预测为负例,便可以获得99.9%的准确率。但是如果使用AUC,把所有样本预测为负例,TPRate和FPRate同时为0(没有Positive),与(0,0) (1,1)连接,得出AUC仅为0.5,成功规避了样本不均匀带来的问题。
AUC其实也可以这样理解:随机从正样本和负样本中各选一个,分类器对于该正样本打分大于该负样本打分的概率。
假设数据集一共有M个正样本,N个负样本,预测值也就是M+N个。我们将所有样本按照预测值进行从小到大排序,并排序编号由1到M+N。
二分类
def binary_class_auc(X, y, model):
param X: 特征
param y: 标签
param model: 训练好的模型
return: roc曲线图
'''
from sklearn import metrics
y_score = model.predict_proba(X)
fpr, tpr, threshold = metrics.roc_curve(y, y_score[:,1])
roc_auc = metrics.auc(fpr, tpr)
plt.plot(fpr, tpr, label='AUC = %0.3f' % roc_auc)
plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', alpha=.8)
plt.legend(loc='lower right')
plt.show()
binary_class_auc(x_test, y_test, model)
多分类
def mul_class_auc(X, y, model, class_number):
param X: 特征
param y: 标签
param model: 训练好的模型
param class_number: 分类数
return: roc曲线图
'''
from sklearn import metrics
y_score = model.predict_proba(X)
y_one_hot = label_binarize(y, np.arange(class_number))
fpr, tpr, threshold = metrics.roc_curve(y_one_hot.ravel(), y_score.ravel())
roc_auc = metrics.auc(fpr, tpr)
plt.plot(fpr, tpr, label='AUC = %0.3f' % roc_auc)
plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', alpha=.8)
plt.legend(loc='lower right')
plt.show()
mul_class_auc(x_test, y_test, model, 3)
模块包括评分函数、性能指标和成对度量和距离计算。
导入:from sklearn import metrics
分类指标
accuracy_score(y_true, y_pre)#精度
log_loss(y_true, y_pred, eps=1e-15, normalize=True, sample_weight=None, labels=None)交叉熵损失函数
auc(x, y, reorder=False)
ROC曲线下的面积;较大的AUC代表了较好的performance。
AUC:roc_auc_score(y_true, y_score, average=‘macro’, sample_weight=None)
f1_score(y_true, y_pred, labels=None, pos_label=1, average=‘binary’, sample_weight=None) F1值
precision_score(y_true, y_pred, labels=None, pos_label=1, average=‘binary’,) 查准率
recall_score(y_true, y_pred, labels=None, pos_label=1, average=‘binary’, sample_weight=None) 查全率
roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)
计算ROC曲线的横纵坐标值,TPR,FPR
TPR = TP/(TP+FN) = recall(真正例率,敏感度)
FPR = FP/(FP+TN)(假正例率,1-特异性)
classification_report(y_true, y_pred)#分类结果分析汇总
回归指标
explained_variance_score(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’)
回归方差(反应自变量与因变量之间的相关程度)
mean_absolute_error(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’)
平均绝对误差MAE
mean_squared_error(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’) #均方差MSE
median_absolute_error(y_true, y_pred)
中值绝对误差
r2_score(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’) #R平方值