方差 / 偏差
模型的期望输出与真实标记的差别称为偏差(bias
),即
对于某个测试集,使用不同的训练集D学习会得到不同的预测输出,其方差为,噪声为。(为样本在数据中的标签,为样本的绝对真实标签)泛化误差可以分解为偏差、方差和噪声之和。
- 偏差度量的是学习算法的期望预测与真实结果的偏离程度,即体现学习算法本身的拟合能力;
- 方差度量了同样大小的训练集的变动所导致的学习性能的改变,即体现了数据扰动所造成的影响。
- 噪声反应了当前任务上任何学习算法所能达到的期望泛化误差下届,即刻画了学习问题本身的难度。
- 偏差-方差分解说明泛化误差是由学习算法的能力、数据的充分性和学习任务本身的难度共同决定的。
给定一个学习任务,在训练不足时,学习器拟合能力不足,训练数据的扰动不足以使得学习性能产生显著变化,此时偏差主导了泛化误差率;
随着训练程度加深,学习器拟合能力增强,数据扰动会被学到,方差主导泛化误差率;
训练充足后,学习器拟合能力已经非常强,训练数据发生的轻微扰动都会引起学习器显著变化,如果训练数据自身的、非全局的特性被学到了,就会发生过拟合。
过拟合 / 欠拟合
模型在训练集上的误差称为训练误差,或者经验误差;在新样本上的误差叫做泛化误差。
但我们希望学习获得一个在新样本上表现良好的学习器,为此因该从训练集中学习得到普遍规律。当学习器在训练集上学得太好时,会将训练集中的噪声/自身分布特点作为一般规律,造成在新数据上预测效果差,泛化性能下降。这就是过拟合。欠拟合是指模型在训练集上效果都不好。
导致过拟合的原因是学习能力太过强大,一般是由于模型太复杂、参数量太多引起的。一般可以通过以下方式减缓:
数据方面
- 更多的训练数据。
模型方面
- 简化模型
- 模型设置简化,例如将SVM的核函数从RBF换成线性核);
- 正则化(
L1
,L2
); Dropout
;
Batch Normalization
;- 提前停止训练模型;
- 更优的激活函数(
sigmoid
->relu
); - 更优的优化器(SGD->Adam);
- 集成方法。
- 简化模型
欠拟合一般是指模型太过简单,或者学习不够彻底,可以选用更复杂的模型(例如决策树扩展分支)、训练更久(神经网络增加迭代次数)。
模型评估
Leave one out
对于个样本,每次选择个样本来训练数据,留1个样本来验证模型预测的好坏。
此方法主要用于样本量非常少的情况 ,比如对于普通适中问题,小于50时,一般采用留一交叉验证。
Hold Out
随机的将样本数据分为互斥的两部分(比如: 70%的训练集,30%的测试集),然后用训练集来训练模型,在测试集上验证模型,作为泛化误差的估计。
训练/测试数据集的划分要尽可能保持数据分布的一致性,一般采用分层采样来保持样本的类别比例相似。
单次留出法受划分的是数据集影响很大,一般采用若干次随机划分、重复进行实验评估后取均值作为留出法的评估结果。一般用于简单的数据探索性分析。
问题:我们希望得到在全样本上训练的模型,采用大部分样本作为训练集,则测试集数目太少可能不够稳定;采用太少样本作为训练集,则训练的模型与全样本差距较大,保真性降低。目前没有完美的解决方法,一般是取2/3~4/5用于训练,其余作为测试。
K-Fold Cross-Validation
K折交叉验证会把样本数据随机的分成k个大小相似的互斥子集,,每个子集都尽可能保持数据分布的一致性,可通过分层采样得到。依次选取1份作为测试集,剩下的k-1份做训练集,从而可进行k次训练和测试。返回这k次测试结果的均值。
k值影响较大,一般取值为10。用于深入探究数据规律。
单次划分为k折受划分方式影响较大,为了减小因为样本划分不同引起的差别,一般可以采用不同的划分方式划分p次,最终的评估结果是这p次k折交叉验证结果的均值,即“p次k折交叉验证”。
Bootstrap
对于m个样本(m较小),每次在这m个样本中随机采集一个样本,放入训练集,采样完后把样本放回。这样重复采集m次,得到m个样本组成的训练集。当然,这m个样本中很有可能有重复的样本数据。同时,用没有被采样到的样本做测试集,进行交叉验证。
由于训练集有重复数据,会改变数据的分布,因而训练结果会有估计偏差,因此,此种方法不是很常用,除非数据量真的很少,比如小于20个。
调参 / 模型上线
调参一般采用网格寻优,例如SVM的C和Gamma参数,分别设置每个参数的范围,采用一定的步长去遍历。在深度学习中,一般在范围内取随机数,进行随机搜索。深度学习的调参一般采用随机寻优。
在模型评估和选择时,我们只使用了一部分数据进行训练,在模型评估和选择之后,一般需要将所有样本输入模型重新训练得到最终的模型。
度量指标
分类模型度量指标
- True Positives,TP:预测为正样本,实际也为正样本的样本数
- False Positives,FP:预测为正样本,实际为负样本的样本数
- True Negatives,TN:预测为负样本,实际也为负样本的样本数
- False Negatives,FN:预测为负样本,实际为正样本的样本数
精确率/查准率(Precision)
定义在上图可以看出,是绿色半圆除以红色绿色组成的圆。预测为正样本的样本中,真正为正样本的比例。严格的数学定义如下:
召回率/查全率 (Recall)
定义也在图上能看出,是绿色半圆除以左边的长方形。实际存在的正样本中,被预测为正样本的比例。严格的数学定义如下:
F1-Score
F1值来综合评估精确率和召回率,它是精确率和召回率的调和均值。当精确率和召回率都高时,F1值也会高。严格的数学定义如下:
Fβ-Score
有时候我们对精确率和召回率并不是一视同仁,比如有时候我们更加重视精确率。我们用一个参数β来度量两者之间的关系。如果β>1, 召回率有更大影响,如果β小于1,精确率有更大影响。自然,当β=1的时候,精确率和召回率影响力相同,和F1形式一样。含有度量参数β的F1我们记为Fβ, 严格的数学定义如下:
灵敏度(true positive rate, TPR)
是实际正例中,正确识别的正例比例,它和召回率的表达式没有区别。严格的数学定义:
特异度(false positive rate, FPR)
是实际负例中,错误识别为正例的负例比例。严格的数学定义如下:
ROC & AUC
以TPR为y轴,以FPR为x轴,我们就直接得到了RoC
(Receiver Operating Characteristic)曲线。从FPR和TPR的定义可以理解,TPR越高,FPR越小,我们的模型和算法就越高效。也就是画出来的RoC曲线越靠近左上越好。如下图左图所示。从几何的角度讲,RoC曲线下方的面积越大越大,则模型越优。所以有时候我们用RoC曲线下的面积,即AUC
(Area Under Curve)值来作为算法和模型好坏的标准。
在实际绘制ROC曲线时,由于数据样本有限,一般不能获得平滑的曲线。具体方法为:学习器对样本预测概率,按照预测为正例的概率将其从大到小排序。将分类阈值依次设置为每个样例的预测值,依次将每个样本划为正例,分别计算TPR和FPR,绘制ROC曲线。初始点坐标为(0, 0),假设前一个点坐标为,如果当前正例为真正例,对应标记点为;若为假正例,则标记点为。
以精确率(Precision)为y轴,以召回率(Recall)为x轴,我们就得到了PR曲线。仍然从精确率和召回率的定义可以理解,精确率越高,召回率越高,我们的模型和算法就越高效。也就是画出来的PR曲线越靠近右上越好。如上图右图所示。使用RoC曲线和PR曲线,我们就能很方便的评估我们的模型的分类能力的优劣了。
Kappa系数
其中 为总体精度,即混淆矩阵对角线上元素之和所占的比例, 为分类一致性指数,计算公式为:
kappa = 1
: 两次判断完全一致kappa>=0.75
:比较满意的一致程度kappa<0.4
:不够理想的一致程度
回归模型度量指标
Mean Squared Error (MSE)
Mean Squared Log Error (MSLE)
Mean Absolute Error (MAE)
Median Absolute Error (MedAE)
Root Mean Square Error (RMSE)
$R^2$
Explained Variance Score (EV)
$var(x)$表示 $x$ 的方差。 $EV$ 值越接近1.0表明回归效果越好。
Pearson 相关系数
用欧式距离(向量间的距离)来衡量向量的相似度,但欧式距离无法考虑不同变量间取值的量级差异。在数据标准化( )后,Pearson相关性系数、Cosine相似度、欧式距离的平方可认为是等价的。
皮尔逊相关系数为两组变量X和Y之间的协方差与标准差的比值
输出范围为-1到+1, 0代表无相关性,负值为负相关,正值为正相关。
适用于标准差都不为0,变量间为线性,总体呈正态分布,观测对之间相互独立。
聚类模型度量指标
对于数据集 $D(x_1, x_2, \cdots, x_m)$,假定通过聚类得到的簇划分为$C=\lbrace c_1, c_2,\cdots,c_k \rbrace$,参考模型给出的簇划分为$C=\lbrace c_1^\ast, c_2^\ast,\cdots,c_s^\ast\rbrace $。令$\lambda$和$\lambda^\ast$分别为与$C$和$C^\ast$对应的簇标记向量。
定义$a=|SS|, SS=\lbrace (x_i, x_j)|\lambda_i=\lambda_j, \lambda_i^\ast=\lambda_j^\ast, i< j \rbrace$,
$b=|SD|, SD=\lbrace (x_i, x_j)|\lambda_i=\lambda_j, \lambda_i^\ast\neq\lambda_j^\ast, i< j \rbrace$,
$c=|DS|, DS=\lbrace (x_i, x_j)|\lambda_i\neq\lambda_j, \lambda_i^\ast=\lambda_j^\ast, i< j \rbrace$,
$d=|DD|, DD=\lbrace (x_i, x_j)|\lambda_i\neq\lambda_j, \lambda_i^\ast\neq\lambda_j^\ast, i< j \rbrace$.
因此有$a+c+c+d=\frac{m(m-1)}{2}$
Jaccard Coefficient (JC)
计算公式为$JC=\frac{a}{a+b+c}$,$JC$越大聚类效果越好。
缺点:需要先验的标签数据
Fowlkes and Mallows Index (FMI)
计算公式$FMI=\sqrt{\frac{a}{a+b} \cdot \frac{a}{a+c}}$,$FMI$越大聚类效果越好。
取值范围[0, 1]。
scikit-learn
中的实现API为metrics.fowlkes_mallows_score(labels_true, labels_pred)
。缺点:需要先验的标签数据
Rand Index (RI)
计算公式为$RI=\frac{2(a+d))}{m(m-1)}$,$RI$越大聚类效果越好。
缺点:需要先验的标签数据
Davies-Bouldin Index (DBI)
计算公式: $DBI=\frac{1}{k}\sum_{i=1}^k\max_{i\neq j} (\frac{avg(C_i)+avg(C_j)}{d_{cen}(\mu_i, \mu_j)})$
这里$avg(C_i)$表示簇$C_i$内样本间的平均距离,$d_{cen}(\mu_i, \mu_j)$表示簇$C_i$和$C_j$中心点之间的距离,$\mu_i$为簇$C_i$的中心点。$DBI$越小聚类效果越好。
scikit-learn
中的实现API为metrics.davies_bouldin_score(X, label)
。特点:相比于Silhouette指数,计算更简单;无需参考标签数据。
缺点:对于凸簇??数据而言,DBI指数相对于其他指数会偏高,例如对于DBSCAN的聚类结果;质心距离的使用限制了度量欧氏空间的距离;较高的值并不意味着效果好。
Dunn Index (DI)
计算公式为$DI=\min_{1 \le i \le k}{\min_{j\neq i}(\frac{d_{min}(C_i, C_j)}{max_{i \le l\le k}diam(C_l)})}$
这里$d_{min}(C_i, C_j)$为簇$C_i$和$C_j$最近样本之间的距离,$diam(C_l)$为簇$C_l$内样本间的最远距离。$DI$越大聚类效果越好。
特点:无需参考标签数据
Adjusted Rand index (ARI)
计算公式为$ARI=\frac{RI-E[RI]}{max(RI)-E[RI]}$
取值范围为[-1, 1],值越大聚类效果越好。
scikit-learn
中的实现API为metrics.adjusted_rand_score(labels_true, labels_pred)
。缺点:需要先验的标签数据
Mutual Information (MI)
取值范围[0, 1]
scikit-learn
中的实现API为metrics.mutual_info_score(labels_true, labels_pred)
、metrics.adjusted_mutual_info_score(labels_true, labels_pred)
和metrics.normalized_mutual_info_score(labels_true, labels_pred)
。缺点:需要先验的标签数据
同质性, 完整性 和 V-measure
同质性,意思为一簇中只包含一类样本;完整性意思为同一类样本位于同一簇中。V-measure即为两者均值。
取值范围[0, 1]
scikit-learn
中实现API为metrics.homogeneity_score(labels_true, labels_pred)
、completeness_score(labels_true, labels_pred)
和v_measure_score(labels_true, labels_pred)
,以及一个复合的APIhomogeneity_completeness_v_measure(labels_true, labels_pred)
。缺点:需要先验的标签数据
Silhouette Coefficient
计算公式为$s=\frac{b-a}{max(a, b)}$,这里a表示某个样本和其同簇内其他样本的距离;b表示某个样本和其他临近簇内样本的距离。最后取所有样本$Silhouette$系数的均值作为总的指标。
取值范围[-1, 1]。
scikit-learn
中实现API为metrics.silhouette_score(X, labels, metric='euclidean')
缺点:对于凸簇??数据而言,DBI指数相对于其他指数会偏高,例如对于DBSCAN的聚类结果
优点:无需参考的标签数据
Calinski-Harabaz Index
scikit-learn
中实现API为metrics.calinski_harabaz_score(X, labels)
优点:无需参考标签数据;计算快速
缺点:对于凸簇??数据而言,DBI指数相对于其他指数会偏高,例如对于DBSCAN的聚类结果
因此,综上所述,在没有参考标签的情况下,可用的聚类评价指标有:Davies-Bouldin Index, Dunn Index, Silhouette Coefficient, 和 Calinski-Harabaz Index。
损失函数
0/1 损失函数
平方损失函数
绝对损失函数
交叉熵损失函数
Cross-entropy
,常用于sigmoid函数的损失函数,在神经网络训练中,假设模型的输出值为a,真实值为y,则。
CE特性:非负性;当a和y接近时,CE接近于0;在更新参数时,权重的更新只与误差有关(下式),可以克服平方差损失函数更新权重过慢的问题(sigmoid在激活值很大时导数非常小,导致参数更新非常慢),加速模型训练。
对数似然损失函数
Log-likelihood cost
,对数似然函数常用来作为softmax回归的代价函数,深度学习中更普遍的做法是将softmax作为最后一层,此时常用的是代价函数是log-likelihood cost。其实这两者是一致的,logistic回归用的就是sigmoid函数,softmax回归是logistic回归的多类别推广。log-likelihood代价函数在二类别时就可以化简为交叉熵代价函数的形式。详情:UFLDL教程Softmax回归
相对熵/KL散度
熵的本质是香农信息量()的期望。关于样本集的两个分布p和q,p为真实分布,q为非真实分布。则按p来识别一个样本的期望为。如果用q来表示来自p的期望,则,此为交叉熵。
根据Gibbs’ inequality可知,恒成立,当q与p相等时取等号。定义相对熵,为KL散度
(Kullback-Leibler divergence, KLD)。它表示两个函数或概率分布的距离:差异越大则相对熵越大,差异越小则相对熵越小,特别地,若两者相同则熵为0。相对熵表示用错误分布表示正确分布相对于正确分布表示正确分布的无谓代价。相对熵,不具有对称性。
一般KL散度用于VAE和GAN中判别两个概率分布的相似性。
距离度量
欧式距离
欧氏距离计算默认对于每一个维度给予相同的权重,因此如果不同维度的取值范围差别很大,那么结果很容易被某个维度所决定。解决方法除了对数据进行处理以外,还可以使用加权欧氏距离,不同维度使用不同的权重。
曼哈顿距离
切比雪夫距离
闵科夫斯基距离
$p=1$就是曼哈顿距离,当 $p=2$为欧式距离,当 $p\to \infty $为切比雪夫距离
标准化欧式距离
马氏距离
$V$为 $\vec{x}$和 $\vec{y}$所在数据集的协方差函数。
余弦距离
取值范围为[-1,1]
Jaccard相似系数
Pearson相关系数(协方差/标准差)
同上
数据预处理
数据缺失处理
特征中缺失值较多
一般直接将该特征舍弃,否则会引入更大的噪声。
特征中缺失值较少
缺失值如果低于10%,那么可以考虑:
- 删除存在缺失值的个案/样本。
- 将缺失值(Nan)作为一个特征,假设用0表示。
- 用同类均值/中值填充。
- 用上下附近的数据值填充。
- 线性插值。
- 拟合。利用没有缺失值的属性来预测包含了缺失值的属性的缺失值。
Standardization,Scaling
除以L2范数
准确来说,这属于Normalization的内容。
通常采用 $X = \frac{X}{||X||}$ 的方式来对每一行或者每一列进行标准化。以下公式中, $X_{norm} = \sqrt{\sum_{i=0}^nX_i^2}$。
1 | x_norm = np.linalg.norm(x, axis = 1, keepdims = True) |
标准化
$X = \frac{X-\mu}{\sigma}$,其中$\mu$和$\sigma$分别表示数据的均值和标准差。主要通过scale
和StandardScalar
实现。
1 | from sklearn import preprocessing |
归一化
通过除以减去最小值,除以数据跨度来将数据归一化至某个区间。主要通过minmax_scale
和MinMaxScale
, 以及maxabs_scale
和MaxAbsScaler
来实现。
MinMaxScaler
可接收参数feature_range=(a,b)
,其变换公式为$X = \frac{X-X_{min}}{X_{max}-X_{min}} \cdot (b-a)+a$。
1 | min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1)) |
MaxAbsScaler
通过将数据除以最大值来标准化,适用于均值为0的数据,适用于稀疏数据。公式为$X=\frac{X}{X_{max}}$。
1 | 1., -1., 2.], X_train = np.array([[ |
异常值较多的数据标准化
RobustScaler
robust_scale(X, axis=0, with_centering=True, with_scaling=True, quantile_range=(25.0, 75.0), copy=True)
quantile_range
:计算变换尺度时考虑的数据区间
1 | from sklearn.preprocessing import RobustScaler |
非线性变换
均匀分布变换
quantile_transform(X, axis=0, n_quantiles=1000, output_distribution=’uniform’, ignore_implicit_zeros=False, subsample=100000, random_state=None, copy=False)
n_quantiles
:Number of quantiles to be computed. It corresponds to the number of landmarks used to discretize the cumulative density function.output_distribution
:Marginal distribution for the transformed data. The choices are ‘uniform’ (default) or ‘normal’.ignore_implicit_zeros
:Only applies to sparse matrices. If True, the sparse entries of the matrix are discarded to compute the quantile statistics. If False, these entries are treated as zeros.subsample
:Maximum number of samples used to estimate the quantiles for computational efficiency. Note that the subsampling procedure may differ for value-identical sparse and dense matrices.
QuantileTransformer(n_quantiles=1000, output_distribution=’uniform’, ignore_implicit_zeros=False, subsample=100000, random_state=None, copy=True)
1 | from sklearn.datasets import load_iris |
高斯分布变换
PowerTransformer(method=’yeo-johnson’, standardize=True, copy=True)
method
:可选参数为[‘yeo-johnson’, ‘box-cox’]standardize
:是否标准化输出
1 | 'box-cox', standardize=False) pt = preprocessing.PowerTransformer(method= |
Normalization
Normalizer()
normalize(X, norm='l2', axis=1, copy=True, return_norm=False)
norm
:可选参数有[‘l1’, ‘l2’, ‘max’]。
1 | X_normalized = preprocessing.normalize(X, norm='l2') |
类别编码
Ordinal编码
1 | enc = preprocessing.OrdinalEncoder() |
One-hot 编码
1 | 'ignore') enc = preprocessing.OneHotEncoder(handle_unknown= |
离散化 Discretization
将连续的特征转化为离散的值。
K-Bin
`KBinsDiscretizer(n_bins=5, encode=’onehot’, strategy=’quantile’)
n_bins
:分成多少组encode
:输出数据格式,可选参数 {‘onehot’, ‘onehot-dense’, ‘ordinal’}strategy
:分组方法,可选参数{‘uniform’, ‘quantile’, ‘kmeans’}
1 | -3., 5., 15 ], X = np.array([[ |
二值化
Binarizer(threshold=0.0, copy=True)
threshold
:0/1划分的阈值,大于阈值的为1,否则为0。
类别不平衡情况
(1) 过采样:对类别较少的样本增加采样,使得正负样本的数目大致相等。例如SMOTE(正例插值增加正例数目)
(2) 降采样:从类别较多的样本中随机剔除,使得正负样本数目大致相等。(EasyEnsemble,将负例分成不同的集合供不同的学习器学习)
(3) 阈值移动(移动二类的分割阈值使得预测结果的比例与训练集的样本类别比例大致相等):
一般认为 $\frac{y}{1-y}>1$即可判定为正例,为了考虑正负样本不平衡,通常认为$\frac{y}{1-y}>\frac{m^+}{m^-}$时可以判定为正例,因此在实际时,对$\frac{y’}{1-y’}=\frac{y}{1-y}\cdot \frac{m^-}{m^+}$,称为“再缩放”。
(4) 类别权重:样本数目少的类别权重更大,反之更小。
(4) 集成方法
总结:过采样和降采样都会使得样本的分布失真。
特征选择
特征选择是特征工程里的一个重要问题,其目标是:(1)寻找最优特征子集,提高训练速度;(2)减少噪声特征,提高模型的泛化能力。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。另一方面,选取出真正相关的特征简化模型,协助理解数据产生的过程。特征选择
过滤(filter)特征选择
针对每一个特征$x_i$,分别计算$x_i$相对于类别标签$y$的信息量$S(i)$,得到$n$个结果,将这$n$个结果从大到小排序,输出前$k$个特征。目标是选出与$y$关联最密切的一些特征$x_i$。
Pearson 相关系数
皮尔森相关系数是一种最简单的、能帮助理解特征和响应变量(即因变量,与之对应的自变量又称为解释变量)之间关系的方法。皮尔森相关系数能衡量变量之间的线性相关性,-1表示完全负相关,+1表示完全正相关,0表示不相关。皮尔森相关系数速度快,易于计算,一般第一时间执行。但是有一个明显缺点:只对线性关系敏感,对于非线性关系无法衡量。
1 | scipy.stats.pearsonr(x, y) |
卡方检验
卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有$N$种取值,因变量有$M$种取值,考虑自变量等于$i$且因变量等于$j$的样本频数的观察值与期望的差距,构建统计量:$\chi ^2=\sum \frac{(A-E)^2}{E}$。表征的是自变量对因变量的相关性,可用于特征选择和降维。
具体计算公式为,假设自变量取值有$N$种,因变量有$M$种取值,$E_{ei,ej}$ 表示两个事件(自变量取值为$i$,因变量取值为$j$)独立时,共同出现的概率,取计算公式为$E_{ei, ej}=m\cdot p(i)\cdot p(j)$,$p(i)$为自变量取值为$i$的概率,$p(j)$为因变量取值为$j$的概率。
1 | from sklearn.feature_selection import SelectKBest, chi2 |
互信息和最大信息系数
1 | from minepy import MINE |
距离相关系数
距离相关系数克服了Pearson相关系数的弱点,可以应用于识别非线性关系。当pearson相关系数为0时,不能断定两个变量独立(可能非线性相关);如果距离相关系数为0,那么可以说两个变量是独立的。
方差选择法
1 | from sklearn.feature_selection import VarianceThreshold |
包装(wrapper)特征选择
不断地使用不同的特征组合来测试学习算法进行特征选择。先选定特定算法, 一般会选用普遍效果较好的算法, 例如Random Forest, SVM, kNN等等。
前向搜索
每次增量地从剩余未选中的特征选出一个加入特征集中,待达到阈值或者 $n$时,从所有的 $F$ 中选出错误率最小的。过程如下:
- 初始化特征集 $F$ 为空。
- 扫描 $i$ 从 1 到 $n$,如果第 $i$ 个特征不在 $F$ 中,那么特征 $i$ 和 $F$ 放在一起作为 $F_i$(即 $F_i=F\cup{i}$ )。
在只使用 $F_i$ 中特征的情况下,利用交叉验证来得到 $F_i$ 的错误率。 - 从上步中得到的 $n$ 个 $F_i$ 中选出错误率最小的 $F_i$ ,更新 $F$ 为 $F_i$ 。
- 如果 $F$ 中的特征数达到了 $n$ 或者预定的阈值(如果有的话),那么输出整个搜索过程中最好的 ;若没达到,则转到 2,继续扫描。
后向搜索
既然有增量加,那么也会有增量减,后者称为后向搜索。先将$F$设置为 ${1,2,\cdots ,n}$ ,然后每次删除一个特征,并评价,直到达到阈值或者为空,然后选择最佳的 $F$。
这两种算法都可以工作,但是计算复杂度比较大。时间复杂度为 $O(n+(n-1)+(n-2)+\cdots +1)=O(n^2)$。
递归特征消除法
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。
1 | from sklearn.feature_selection import RFE |
嵌入(embed)特征选择
基于惩罚项的特征选择
通过L1正则项来选择特征:L1正则方法具有稀疏解的特性,因此天然具备特征选择的特性,但是要注意,L1没有选到的特征不代表不重要,原因是两个具有高相关性的特征可能只保留了一个,如果要确定哪个特征重要应再通过L2正则方法交叉检验。
基于学习模型的特征排序
直接使用你要用的机器学习算法,针对每个单独的特征和响应变量建立预测模型。假如某个特征和响应变量之间的关系是非线性的,可以用基于树的方法(决策树、随机森林)、或者扩展的线性模型等。基于树的方法比较易于使用,因为他们对非线性关系的建模比较好,并且不需要太多的调试。但要注意过拟合问题,因此树的深度最好不要太大,再就是运用交叉验证。通过这种训练对特征进行打分获得相关性后再训练最终模型。
多类分类情况
对于一些二分类模型,可以推广到多分类,一般将多分类任务拆解为若干个二分类任务。经典的拆分策略有“OvO”, “OvR”, “MvM”。
OvO:将N个类别两两配对,构建$\frac{N(N-1)}{2}$个任务,例如对于类别$C_i$和$C_j$两类,把样本集D中的类别为$C_i$的样本视为正例,类别为$C_j$的样本视为负例,训练模型。测试阶段,将样本提交给所有分类器,得到$\frac{N(N-1)}{2}$个分类结果,通过投票得到最终的分类结果。
OvR:每次将一个类别视为正例,其余类别视为负例,总计训练N个分类器。在测试时,如果只有一个分类器将其预测为正类,那么对应的类别标记即为最终的结果;如果有多个分类器预测为正类,则挑选概率大的那个类别。
MvM:每次将若干个类别视为正类,若干个其他类视为负类。OvO和OvR是MvM的特例。MvM的正反类需要特殊设计,不能随意选取。常用的MvM方法有ECOC。
OvO在存储开销和测试时间开销通常比OvR大;在类别很多时,OvO的训练时间开销比OvR更小。
模型融合
个人认为机器学习最难的三步:特征工程;调参;模型融合。
模型融合方法,主要包括:Bagging;Boosting;Stacking等。
为了避免Stacking过拟合,必须用K折交叉验证来得到基模型的概率输出特征。
L1和L2
正则化之所以能够降低过拟合的原因在于,正则化是结构风险最小化的一种策略实现。
给loss function加上正则化项,能使得新得到的优化目标函数h = f+normal,需要在f和normal中做一个权衡(trade-off),如果还像原来只优化f的情况下,那可能得到一组解比较复杂,使得正则项normal比较大,那么h就不是最优的,因此可以看出加正则项能让解更加简单,符合奥卡姆剃刀理论,同时也比较符合在偏差和方差(方差表示模型的复杂度)分析中,通过降低模型复杂度,得到更小的泛化误差,降低过拟合程度。
L1正则化就是在loss function后边所加正则项为L1范数,加上L1范数容易得到稀疏解(0比较多)。L2正则化就是loss function后边所加正则项为L2范数的平方,加上L2正则相比于L1正则来说,得到的解比较平滑(不是稀疏),但是同样能够保证解中接近于0(但不是等于0,所以相对平滑)的维度比较多,降低模型的复杂度。
L1为什么可以得到稀疏解?
具体可以参考知乎-l1 相比于 l2 为什么容易获得稀疏解?。
$L_1$和$L_2$ 能不能把参数$\theta$优化为0,取决于原先的损失函数在 $\theta=$0 点处的导数。
如果本来导数不为 0,那么施加 $L_2$ 后导数依然不为 0,最优的 $\theta$ 也不会变成 0。施加 $L_1$时,只要正则项的系数 $\lambda$ 大于原先损失函数在 0 点处的导数的绝对值,$\theta$ = 0 就会变成一个极小值点。
以上只分析了一个参数 $\theta$。事实上 $L_1$ 会使得许多参数的最优值变成 0,这样模型就稀疏了。
更公式的理解:L1正则为什么更容易获得稀疏解?
假设原损失函数$L(\theta)$在$\theta=0$时的导数为$d\theta$。
引入系数为$\lambda$的$L_1$正则项之后,$\frac{\partial{J}}{\partial{\theta}}|_{\theta=0-}=d\theta-\lambda$,$\frac{\partial{J}}{\partial{\theta}}|_{\theta=0+}=d\theta+\lambda$;
引入系数为$\lambda$的$L_2$正则项之后,$\frac{\partial{J}}{\partial{\theta}}|_{\theta=0}=d\theta+\lambda\theta=d\theta$。
可见,引入$L_2$正则时,代价函数在0处的导数仍是$d\theta$,无变化。而引入$L_1$正则后,代价函数在0处的导数有一个突变。从$d\theta+λ$到$d\theta-λ$,若$d\theta+λ$和$d\theta-λ$异号,则在0处会是一个极小值点。因此,优化时,很可能优化到该极小值点上,即$\theta=0$处。
L2为什么会让参数趋于平滑和较小值?
以上公式推导中,可知引入系数为$\lambda$的$L_2$正则项之后,$\frac{\partial {J}}{\partial {\theta}}=d\theta+\lambda\theta$,更新权重时,$\theta^{t+1}=\theta^{t}-\alpha (d\theta + \lambda\theta^t)=(1-\alpha\lambda)\theta^t-\alpha d\theta$。其中$\alpha \lambda$接近于0,假如$\theta$很大,则每次更新会减小较大的值;假如$\theta$很小,则每次减小较小的值,因此L2正则曲线比较平滑。
随着参数$\theta$不断减小,梯度更新也逐渐减小,所以很快会收敛到较小的值但不为0。
从几何角度来分析,L2类似于用圆形去逼近原损失函数的等高线,L1中两个权值倾向于一个较大另一个为0,L2中两个权值倾向于均为非零的较小数。这也就是L1稀疏,L2平滑的效果。
L1优化方法
线性回归/岭回归/Lasso回归/弹性网回归
- 线性回归 + L2 ≈ 岭回归
- 线性回归 + L1 ≈ Lasso回归
- 线性回归 + L1 + L2 ≈ 弹性网回归
生成模型和判别模型
监督学习模型可以分为生成模型和判别模型。
生成模型
生成模型:由数据联合概率分布$P(Y,X)$求出条件概率分布$P(Y|X)$,表示的是给定输入X产生输出Y的生成关系。例如:朴素贝叶斯、高斯混合模型、隐马尔科夫模型。
优点:收敛速度快;能够应付存在隐变量的情况;
缺点:需要更多的样本和计算量;实际情况下效果不如判别模型。
判别模型
判别模型:由数据直接学习决策函数$f(X)$或者条件概率分布$P(Y|X)$,关心的是给定输入X,应该预测什么样的输出Y。例如:K近邻、感知机、决策树、逻辑回归、最大熵、支持向量机、Boosting、条件随机场、CNN等。
优点:节省资源,需要的样本量更少;允许对输入进行抽象(例如降维);准确率更高。
缺点:以上生成模型的优点的反面。
最优化算法
批量梯度下降 (Batch Gradient Descent)
批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新,即 ${\theta}_{i} = {\theta}_{i} - {\alpha} {\sum}_{j=0}^{m}(h_{\theta}(\vec{x}^{(j)})-y_j)x_i^{(j)} $。
随机梯度下降法(Stochastic Gradient Descent)
随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度。对应的更新公式是: $\theta_i = \theta_i - \alpha (h_{\theta}(\vec{x}^{(j)})-y_j)x_i^{(j)} $
随机梯度下降法,和批量梯度下降法是两个极端,一个采用所有数据来梯度下降,一个用一个样本来梯度下降。自然各自的优缺点都非常突出。对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。
小批量随机梯度下降 (Mini-batch Gradient Descent)
小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样子来迭代,1<n<m。一般可以取x=10,当然根据样本的数据,可以调整这个x的值。对应的更新公式是: $\theta_i = \theta_i - \alpha \sum_{j=t}^{t+n-1}(h_{\theta}(\vec{x}^{(j)})-y_j)x_i^{(j)} $
最小二乘法
详细参考最小二乘的本质是什么
以线性回归为例,对于一组观测数据$(\mathbb x, \mathbb y)$,采用$y=ax+b$去拟合观测值,则总误差的平方为$\epsilon =\sum(f(x_i)-y_i)^2=\sum(ax_i+b-y_i)^2$。分别计算$\epsilon$对$a$和$b$的偏导,令其为0,即可使得$\epsilon$取到最小值。对于拟合高次方程、指数等方程均可采用这种方法求得$a$和$b$的近似解。
牛顿法(TODO)
共轭梯度法(TODO)
梯度下降、最小二乘法、牛顿法、拟牛顿法的对比
在机器学习中的无约束优化算法,除了梯度下降以外,还有最小二乘法、牛顿法和拟牛顿法。
梯度下降法和最小二乘法相比,梯度下降法需要选择步长,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是计算解析解。如果样本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有优势,计算速度很快。但是如果样本量很大,用最小二乘法由于需要求一个超级大的逆矩阵,这时就很难或者很慢才能求解解析解了,使用迭代的梯度下降法比较有优势。
梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。
无偏估计/参数估计方法
频率学派和贝叶斯学派
在对事物建模时,用$\theta$表示模型的参数,解决问题的本质就是求解$\theta$。详细参考知乎—最大似然估计和最大后验估计
频率学派
认为模型参数$\theta$是一个定值,希望通过类似解方程组的方式从数据中求得该未知数。这就是频率学派使用的参数估计方法-极大似然估计(MLE),这种方法往往在大数据量的情况下可以很好的还原模型的真实情况。
贝叶斯学派
认为$\theta$是一个随机变量,服从一定的概率分布。在贝叶斯学派里有两大输入和一大输出,输入是先验 (prior)和似然 (likelihood),输出是后验 (posterior)。先验,即$P(\theta)$,指的是在没有观测到任何数据时对$\theta$的预先判断,例如扔硬币时认为大概率是均匀分布;似然,即$P(X|\theta)$,指假设$\theta$已知后观测到的数据应该是什么样子;后验,即$P(\theta|X)$,是最终的参数分布。贝叶斯估计的基础是贝叶斯公式:$P(\theta|X) = \frac{P(X|\theta)·P(\theta)}{P(X)}$。
对于数据的观测方式不同或者假设不同,那么推知的参数也会因此而存在差异。这就是贝叶斯派视角下用来估计参数的常用方法-最大后验概率估计(MAP),这种方法在先验假设比较靠谱的情况下效果显著,随着数据量的增加,先验假设对于模型参数的主导作用会逐渐削弱,相反真实的数据样例会大大占据有利地位。极端情况下,比如把先验假设去掉,或者假设先验满足均匀分布的话,那它和极大似然估计就如出一辙了。
最大似然估计 MLE
最大似然估计(Maximum likelihood estimation, 简称MLE)如何理解极大似然估计?
假设数据$x_1, x_2, \cdots , \cdots x_n$是一组独立同分布的抽样,$X=(x_1, x_2, \cdots , x_n)$。那么MLE对$\theta$的估计方法可以如下推导:
最大后验概率估计 MAP
最大后验概率估计(Maximum a posteriori estimation,简称MAP)
假设数据$x_1, x_2, … , … x_n$是一组独立同分布的抽样,$X=(x_1, x_2, … , x_n)$。那么MAP对$\theta$的估计方法可以如下推导:
第二行到第三行运用了贝叶斯定理;第三行到第四行可以舍去$P(X)$因为其与$θ$无关。而$-\log P(X|θ)$其实就是负对数似然,所以MLE与MAP在优化时的不同在于先验项$-\log P(θ)$。
假定先验是一个高斯分布,即$P(θ)=c·e^{-\frac{θ^2}{2σ^2}}$,取对数有$-\log P(θ)=c + \frac{θ^2}{2σ^2}$。也就是说,在MAP中先验如果是一个高斯分布,等价于在MLE中采用了L2正则化。
EM算法
现实中往往会遇到属性不完整(或者未被观测到,即未观测变量)的训练样本,,这种未观测变量又称为隐变量。令X表示已观测变量集,Z表示因变量集,$\theta$表示模型参数。要对$\theta$作极大似然估计,应最大化对数似然$LL(\theta|X, Z)=ln P(X, Z|\theta)$。然而由于Z是隐变量,上述式子无法求解,此时可以通过对Z计算期望,来最大化已观测数据的对数“边际似然”:$LL(\theta|X)=lnP(X|\theta)=ln\sum_zP(X,Z|\theta)$。
EM算法常用于估计因变量,它是一种迭代式的方法,其基本思想是:若参数$\theta$已知,则可根据训练数据推断出最优因变量Z的值(这一步称为E步);反之,若Z的值已知,则可以方便地对参数$\theta$做极大似然估计(M)。
- E(Expectation)步:以当前参数$\theta^t$推断因变量Z的分布$P(Z|X, \theta^t)$,计算对数似然$LL(\theta|X, Z)$关于Z的期望。
- M步:寻找参数,以最大化期望似然,即$\theta^{t+1}=argmax\ Q(\theta| \theta^t)$。
详细:李航《统计学习方法》p155
无偏估计
详情可参考如何理解无偏估计?
无偏反应的是采样来表征数据特征时,均值的偏移。
因此,有偏/无偏 可以用均值是否相似来近似代替;有效/无效 可以用方差是否大来近似代替; 一致/不一致 可以用随着样本数增多偏差是否降低来近似表征。
常见的核函数
构造出一个具有良好性能的SVM,核函数的选择是关键.核函数的选择包括两部分工作:一是核函数类型的选择,二是确定核函数类型后相关参数的选择。
常见核函数
核函数 | 公式 | 用法 | 调参 |
---|---|---|---|
Linear kernel | 特征数量多从而线性可分时,或样本数量多再补充一些特征时,linear kernel可以是RBF kernel的特殊情况 | ||
Polynomial kernel | $K(x_i,x_j)=(\gamma x_i^Tx_j+r)^d,d>1 $ | 一般用于图像处理,参数比RBF多,取值范围是(0,inf) | -d :多项式核函数的最高次项次数,-g :gamma参数,-r :核函数中的coef0 |
Gaussian radial basis function (RBF) | $K(x_i, x_j)=exp(-\gamma (x_i-x_j)^2) $ | 通用,线性不可分时,特征维数少 样本数量正常时,在没有先验知识时用,取值在[0,1] | -g :gamma参数,默认值是1/k |
Sigmoid kernel | $K(x_i,x_j)=tanh(\alpha x^Ty+c) $ | 生成神经网络,在某些参数下和RBF很像,可能在某些参数下是无效的 | -g :gamma参数,-r:核函数中的coef0 |
Gaussian kernel | $K(x_i,x_j)=exp(-\frac{2(x_i-x_j)^2}{\sigma}) $ | 通用,在没有先验知识时用 | |
Laplace RBF kernel | $K(x_i, x_j)=exp(-\frac{(x_i-x_j)}{\sigma}) $ | 通用,在没有先验知识时用 | |
Hyperbolic tangent kernel | $K(x_i,x_j)=tanh(\kappa x_i·x_j+c) $ | 用于神经网络中 | |
Bessel function of the first kind Kernel | 可消除函数中的交叉项 | ||
ANOVA radial basis kernel | 回归问题 | ||
Linear splines kernel in one-dimension | text categorization,回归问题,处理大型稀疏向量 |
如何选择核函数
在选取核函数解决实际问题时,通常采用的方法有:
- 一是利用专家的先验知识预先选定核函数;
- 二是采用Cross-Validation方法,即在进行核函数选取时,分别试用不同的核函数,归纳误差最小的核函数就是最好的核函数.如针对傅立叶核、RBF核,结合信号处理问题中的函数回归问题,通过仿真实验,对比分析了在相同数据条件下,采用傅立叶核的SVM要比采用RBF核的SVM误差小很多.
- 三是采用由Smits等人提出的混合核函数方法,该方法较之前两者是目前选取核函数的主流方法,也是关于如何构造核函数的又一开创性的工作.将不同的核函数结合起来后会有更好的特性,这是混合核函数方法的基本思想.
按照经验来看:
- 如果特征数很大,样本的数目较多(或一般多),这是往往样本线性可分,可考虑用线性核函数的SVM或LR(如果不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的)。
- 如果特征数较少,样本的数量较多,可以手动添加一些特征,使样本线性可分,再考虑用线性核函数的SVM或LR。
- 如果特征数非常少,样本数目一般,这种情况一般使用RBF。
如何调参
主要要调整的参数为C
(惩罚系数)和gamma
,可通过网格寻优的方式来调参。
- gamma 越大,支持向量越少,gamma 越小,支持向量越多。 而支持向量的个数影响训练和预测的速度。
- C 越高,容易过拟合。C 越小,容易欠拟合。
结束了吗?
以上只是对于机器学习中一些常见概念性问题的解释,除此之外,机器学习还囊括大量的分类、回归、聚类、降维算法,以及目前非常火的深度学习。因此,个人认为,除了以上基础知识,一个好的机器学习算法/数据挖掘 工程师还应该掌握以下知识(可以当作春招秋招复习的大纲):
统计机器学习算法
分类算法
- 逻辑回归(LR)
- 感知机
- 支持向量机(SVM)
- 人工神经网络(ANN)
- 决策树(DT,包括ID3, C4.5, CART)
- 随机森林(RF)
- Adaboost
- GBDT
- XGBoost
- LightGBM
- CatBoost
- 朴素贝叶斯(NB)
- 最近邻(k-NN)
- 最大熵
回归算法
- 线性回归
- 套索回归
- 岭回归
- 弹性网回归
- 支持向量回归(SVR)
- 树回归 (决策树、随机森林、Adaboost、GBDT、XGBoost、LightGBM等以DT为基模型的回归)
聚类算法
- k-Means
- k-Medoids
- BIRCH
- 层次聚类
- DBSCAN
- 均值漂移分割 Meanshift
- 谱聚类
特征选择/降维算法
- 主成分分析(PCA)
- 独立成分分析(ICA)
- 因子分解机(FM)
- 奇异值分解(SVD)
- 非负矩阵分解(NMF)
- 潜在语义分析(LSA)
- 概率潜在语义分析(pLSA)
- 潜在狄利克雷分配(LDA)
- 字典学习
概率图模型
- 隐马尔可夫(HMM)
- 马尔可夫随机场
- 马尔可夫链
- 条件随机场(CRF)
其他算法
- 卡尔曼滤波
- EM算法
- 蚁群算法
- 遗传算法
深度学习及计算机视觉
- Conv, TransposedConv, DilatedConv等卷积曾原理
- Pooling, GlobalPooling, SPP, ASPP等池化层原理
- 各激活函数的优缺点及适用场景
- SGD, PMSProp, Adam等优化算法的原理及特点
- 不同任务选择什么样的损失函数
- AlexNet, VGGNet, GoogLeNet, ResNet, DenseNet等经典分类网络的结构
- FCN, SegNet, U-Net, DeepLabs, RefineNet, PSPNet等语义分割网络的结构
- YOLO, R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN等目标检测网络结构
- GAN,风格迁移,领域适应等
- TensorFlow, Keras, PyTorch等深度学习框架
推荐系统
- 协同过滤
- itemBasedCF
- userBasedCF
- 冷启动
- SVD(各种变形),FM,LFM等
自然语言处理
- Word2Vec
- RNN
- LSTM
- GRU
- TF-IDF
- TextRank
- SimHash
数学
- 高数:泰勒展开,偏导
- 概率论与数理统计
- 线性代数
数据结构
- 数据结构(线性表、链表、队列、堆栈)
- 排序算法
- 查找算法
- 二叉树的遍历
- 图的遍历
- 最短路径算法
其他
- Python/Java/C++等至少精通一门语言
- 网络数据采集(Crawl)
- 数据可视化
- MySQL/MongoDB等数据库
- 刷LeetCode或者牛客网的题,尤其是动态规划和字符串处理
以上我也并非完全掌握,需要不断学习,一起加油:smile::smile::smile:!