0/为什么要归一化
<1>在梯度下降法中,可以更加快速得求得损失函数的最优解
如下图所示,蓝色的圈圈代表的是2个特征的等高线。
在左图中,2个特征的值域相差非常大,x1的值域是[0,2000],x2的值域是[1,5],所以其等高线非常尖。
当使用梯度下降法寻求最优解的时候,很有可能是走‘之字形’路线,从而导致需要迭代很多次才能收敛。
右图中,对2个特征进行了数据归一化,其对应的等高线明显变得很圆润了,
这样在梯度下降法最优解的求解中就可以较快的收敛。
因此,如果在机器学习中需要梯度下降法寻求最优解,那么归一化就非常有必要了,否则很难收敛或者无法收敛。
<2>归一化可以提高精度
在机器学习中,有些分类器在训练的时候,需要计算2个样本之间的距离(如欧氏距离),例如KNN算法。
如果一个特征的值域范围非常大,那么在计算欧式距离的时候,就很大程度上取决于这个特征,
也就是说,这个特征的权重太大了(原则上所有特征都是同等重要的,权重一样)。
所以,这种情况下,我们需要对数据进行归一化。
1)最大最小值归一化
这种归一化比较适合在特征值比较集中的情况。
这种方法有个缺陷:如果有新数据加入,则max和min就会发生变化,从而导致归一化的结果也会随之发生变化。
在实际使用中,可以根据经验用常量来代替max和min。
2)标准化
把特征处理成均值为0,方差为1。
3)非线形归一化
这种方法常常被用在数据分化比较大的情况(及数据不集中),有些数据很大,有些数据很小。
然后通过一些数据函数,把原始数据进行映射。
比如log函数,指数函数等。
具体需要根据数据实际的分布情况来选择合适的映射函数。
2/什么时候需要特征归一化?
- 需要: 基于参数的模型或基于距离的模型,都是要进行特征的归一化。
- 不需要:基于树的模型是不需要进行特征的归一化,例如随机森林,bagging 和 boosting等。
3/什么时候需要one hot编码
- 用:独热编码用来解决类别特征的离散值问题,
- 不用:将离散型特征进行one-hot编码的作用,是为了让距离计算更合理,但如果特征是离散的,并且不用one-hot编码就可以很合理的计算出距离,那么就没必要进行one-hot编码。 有些基于树的算法在处理变量时,并不是基于向量空间度量,数值只是个类别符号,即没有偏序关系,所以不用进行独热编码。 Tree Model不太需要one-hot编码: 对于决策树来说,one-hot的本质是增加树的深度。
总的来说,要是one hot encoding的类别数目不太多,建议优先考虑。
4/分类问题的评价指标
分类问题的评价指标大多是基于`混淆矩阵`计算来的。
True:识别正确的
False:识别错误的
Positive:正例
Negative:负例
<1>正确率(Accuracy):识别对了的正例(TP) + 识别对了的负例(TN)
公式: A = ( TP + TN ) / S
缺点:当正负样本分布不均匀的时候,该指标就不合适了
<2>精确率(Precision):识别对了的正例 / 识别出的正例
其中:识别出的正例包括识别对的正例和识别错误的负例
P = TP / (TP+FP)
<3>召回率(Recall):识别对了的正例 / 实际总的正例数
公式:R = TP / (TP + FN)
<4>F-score:是精确率和召回率的加权调和平均。
因为精确率和召回率之间具有此消彼长的矛盾。
所以引入了alpha系数,计算求得F-score这个综合的评价指标。
<5>ROC曲线:受试者工作特征曲线,是一条曲线,不是一个值。
以真正率(TPR,true positive rate)为y轴,
以假正率(FPR,false positive rate)为x轴。
roc曲线下方的面积就是auc
面积越大,代表模型的分类性能越好。
<6>AUC:是指ROC曲线下方的面积。
AUC(Area Under Curve)被定义为ROC曲线下与坐标轴围成的面积,显然这个面积的数值不会大于1。
因为x轴和y轴的取值范围都是[0,1],及真正率和假正率的取值范围都是[0,1]
又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。
AUC越接近1,检测方法真实性越高;
等于0.5时,则真实性最低,无应用价值。
5/回归问题的评价指标
<1>mae: mean absolute error ,绝对误差的平均值
可以更好的反应真实值与预测值之间的diff.
缺点:梯度都是一样的,不会发生变化,不会随着误差的减小而变化。
<2>mbe: 不仅考虑大小,还考虑方向
<3>mse: mean square error 均方差。对误差计算平方,然后累加起来,最后计算均值。
缺点:会放大误差,对异常点比较敏感。
优点:方便计算导数。梯度随着误差的减小而减小。
<4>rmse: root mean square error 相比于mse,就是开根号
衡量预测值与真实值之间的偏差。
常用来作为机器学习模型的预测结果衡量的标准。受异常点的影响很大。
<5>r-square(R方):分母是原始数据的离散程度,
分子是真实值和预测值之间的误差。
二者相除,可以消除原始数据离散程度的影响。
6/如何在二分类模型中解决多分类问题
<1>一对一:把多个类别两两配对,一共会产生n(n-1)/2 个二分类任务。
我们需要训练n*(n-1)/2 个二分类的分类器。
最后对新的数据进行预测的时候,每种情况我们都需要尽性预测,最后采用投票的机制。
缺点:如果类型比较多的话,需要训练的二分类的模型的个数就很多了,n*(n-1)/2个
<2>一对多:每一次把一个类别当成一类,其他的当成另外一类。这样会产生n个分类器。
缺点:可能会产生模糊区域。就是某2个类别的投票数一样多
7/LR逻辑回归
逻辑不复杂,实现比较简单,计算量也不大,速度很快,需要的存储资源不多。
是一种在线学习算法,可以实时接收新的数据进行训练,更新每个特征的系数。
缺点: 由于模型比较简单,所有容易欠拟合。
只能解决二分类问题。
8/SVM、LR、决策树的对比?
SVM既可以用于分类问题,也可以用于回归问题,并且可以通过核函数快速的计算。
LR实现简单,训练速度非常快,但是模型较为简单,容易欠拟合。
决策树容易过拟合,需要进行剪枝等。
从优化函数上看,soft margin的SVM用的是hinge loss,而带L2正则化的LR对应的是cross entropy loss,另外adaboost对应的是exponential loss。
LR不仅可以给出预测的类别,还可以给出具体的概率,但是svm只能给出类别,不能给出概率。
SVM对异常值不太敏感,因为只关心support vector(支持向量),
SVM可以将特征映射到无穷维空间,但是LR不可以,一般小数据中SVM比LR更优一点
SVM依赖于数据测度,需要先做归一化,LR一般不需要,对于大量的数据LR使用更加广泛,LR向多分类的扩展更加直接,对于类别不平衡SVM一般用权重解决,即目标函数中对正负样本代价函数不同,LR可以用一般的方法,也可以直接对最后结果调整(通过阈值),一般小数据下样本维度比较高的时候SVM效果要更优一些。
9/GBDT 和 随机森林的区别?
随机森林采用的是bagging集成学习思想,bagging又称为bootstrap aggreagation
通过在训练数据集中进行有放回的采样得到多个不同的采样集,基于每个采样集训练出一个弱学习器,
再将弱学习器结合。
随机森林在对决策树进行bagging的基础上,在决策树的训练过程中引入了随机属性选择。
传统决策树在选择划分特征的时候是在当前节点属性集合中选择最优特征,而随机森林则是对结点先随机选择包含k个特征的子集,再选择最优属性,k作为一个参数控制了随机性的引入程度。
如果每棵决策树选择的特征都一样,那么决策树之间就没有区别了,随机森林也就失去意义了。
如果选择的特征太少了,则可能导致欠拟合。
另外,GBDT训练是基于Boosting思想,每一迭代中根据错误更新样本权重,因此是串行生成的序列化方法,而随机森林是bagging的思想,因此是并行化方法。
10/什么是数据不均衡
所谓的不均衡数据集指的是数据集各个类别的样本量极不均衡。
以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下2个类别的比例大于100:1这种情况下的数据称为不平衡数据。
不平衡数据的学习即需要在分布不均匀的数据集中学习到有用的信息。
不平衡数据集的处理方法主要分为两个方面:
1、从数据的角度出发,主要方法为采样,分为欠采样和过采样以及对应的一些改进方法。
2、从算法的角度出发,考虑不同误分类情况代价的差异性对算法进行优化,主要是基于代价敏感学习算法(Cost-Sensitive Learning),代表的算法有adacost;
11/过采样 && 欠采样
当训练数据中正负样本分布不均衡的时候,比如在肿瘤诊断的时候,正样本(患有肿瘤)的数量往往比较少,
负样本(没有患肿瘤)比较多。
解决的办法;
<1>对训练数据少的类别进行过采样
<2>对训练数据多的类别进行欠采样
<3>直接对原始的训练数据进行训练,在预测的时候再改变阈值。
过采样:一般是对数量少的类别进行插值产生额外的训练数据。
欠采样: 把数量多的类别的数据划分为几个不同的集合供不同的弱学习器使用。
<1>随机过采样(上采样)
从少数类的样本中进行随机采样来增加新的样本,对应Python库中函数为RandomOverSampler:
from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_sample(X, y)
<2>随机欠采样(下采样)
与过采样相反,欠采样是从多数类样本中随机选择少量样本,再合并原有少数类样本作为新的训练数据集。
欠采样有两种类型分别为有放回和无放回两种,
无放回欠采样在对多数类某样本被采样后不会再被重复采样,有放回采样则有可能。
对应Python库中函数为RandomUnderSampler,
通过设置RandomUnderSampler中的replacement=True参数, 可以实现自助法(boostrap)抽样。
<3>随机过/欠采样的优缺点
随机采样最大的优点是简单,但缺点也很明显。
过采样后的数据集中会反复出现一些样本,训练出来的模型会有一定的过拟合;
而欠采样的缺点显而易见,那就是最终的训练集丢失了数据,模型只学到了总体模式的一部分。
过采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点。
为了解决这一问题,可以在每次生成新数据点时加入轻微的随机扰动,经验表明这种做法非常有效,但是这一方式会加重过拟合。
12/为什么会产生过拟合,有哪些方法可以预防或克服过拟合?
一般在机器学习中,训练数据在模型中产生的误差是训练误差,新样本在模型中产生的的误差称为泛化误差。
显然我们希望得到泛化误差小,及泛化能力强的学习器。
但是我们事先并不知道新样本,因此实际上往往努力使训练误差尽量小。
然而,当学习器将训练样本学的太好的时候,往往可能把训练样本自身的特点当做了潜在样本具有的一般性质。
这样就会导致泛化性能下降,称之为过拟合。
相反,欠拟合一般指对训练样本的一般性质尚未学习好,在训练集上仍然有较大的误差。
欠拟合:一般来说欠拟合更容易解决一些,例如增加模型的复杂度,增加决策树中的分支,增加神经网络中的训练次数等等。
过拟合:一般认为过拟合是无法彻底避免的,因为机器学习面临的问题一般是np-hard,
但是一个有效的解一定要在多项式内可以工作,所以会牺牲一些泛化能力。
过拟合的解决方案一般有增加样本数量,对样本进行降维,降低模型复杂度,利用先验知识(L1,L2正则化),利用cross-validation,early stopping等等。
总结:解决过拟合的办法?
增加训练数据