对于机器学习的实际运用。光停留在知道了解的层面还不够,我们须要对实际中easy遇到的一些问题进行深入的挖掘理解。我打算将一些琐碎的知识点做一个整理。
1 数据不平衡问题
这个问题是经常遇到的。
就拿有监督的学习的二分类问题来说吧。我们须要正例和负例样本的标注。假设我们拿到的训练数据正例非常少负例非常多,那么直接拿来做分类肯定是不行的。
通常须要做下面方案处理:
1.1 数据集角度
通过调整数据集中正负样本的比例来解决数据不平衡,方法有:
1.1.1 添加正样本数量
正样本本来就少,怎么添加呢?方法是直接复制已有的正样本丢进训练集。这样能够略微缓解正样本缺失的困境。可是easy带来一个问题,就是过拟合的潜在危急。由于这样粗暴的引入正样本并没有添加数据集的样本多样性。怎样设计复制哪些正样本有一些技巧,比方选择有特定意义的代表性的那些。
1.1.2 降低负样本的数量
首先这是一个通用的合理的方法,可是负样本的降低必定导致数据多样性的损失。有一种方法能够缓解这个问题。那就是相似于随机森林方法,每次正样本数量不变,随机选择等量的不同的负样本进行模型训练,重复几次,训练多个模型。最后全部的模型投票决定终于的分类结果。
1.2 损失函数的角度
能够又一次改动模型训练的损失函数,使得错分正样本的损失变大。错分负样本的损失变小。
这样训练出来的模型就会对正负样本有一个合理的推断。
很多其他于此话题相关内容请移步:
2 异常值处理问题
说到异常值。首先得说一下数据量的问题。异常值不是缺失值,更不是错误值,相同是真实情况的表现,之所以觉得一个数据异常,是由于我们能够用到的数据量不够大,无法准确地代表整个此类数据的分布。假设把异常值放在海量数据的大背景下,那么这个异常值也就不那么异常了。
下载摘自某大牛博客一段话:
异常值并不是错误值,而相同是真实情况的表现,我们之所以觉得异常。仅仅是由于我们的数据量不足够大而已。可是从实际的工业界来看。考虑到实际的计算能力以及效果,大多数公司都会对大数据做“去噪”,那么在去噪的过程中去除的不仅仅是噪音,也包含“异常点”,而这些“异常点”,恰恰把大数据的广覆盖度给降低了,于是利用大数据反而比小数据更easy产生趋同的现象。尤其对于推荐系统来说,这些“异常点”的观察事实上才是“个性化”的极致。
既然说到大数据,相同是这位大牛的一段话:
说得学术一些,我们最好还是觉得大数据是频率学派对于贝叶斯学派一次强有力的逆袭。
那么既然讲到这个份上了,我们最好还是思考一下,我们是不是有希望在回归贝叶斯学派。利用先验信息+小数据完毕对大数据的反击呢?
某些机器学习算法对异常值非常敏感,比方:K-means聚类。AdaBoost。使用此类算法必须处理异常值。
某些算法拥有对异常值不敏感的特性,比方:KNN,随机森林。
怎样处理异常值?最简单的方法就是直接丢掉。其他方法我后面会继续研究。
3 过拟合问题
过拟合可要命了。好不easy训练一个模型。来一些測试数据,分类结果非常的差。过拟合产生的原因:
- 训练数据太少
- 模型太复杂
- 训练数据中存在噪声点(就算训练数据足够多)
差点儿全部的机器学习算法都会easy遇到过拟合的问题。
所以先说一些解决过拟合的通用办法。当然,首先得保证训练数据不要太少。
3.1 正则化
正则化就是在模型的优化目标上再添加一个惩处因子。这样模型的优化策略就从经验风险最小化变为结构风险最小化。
- 线性回归正则化就是岭回归和lasso回归,分别相应L2,L1罚项。
- 决策树正则化就是剪枝。通常把子节点个数作为罚项。
3.2 交叉验证
在数据量足够的情况下,能够採用交叉验证的方式避免过拟合。甚至能够在正则化之后再做一次交叉验证。
其他具体研究请点击:
4 特征project问题
有句话必须得放在前面:数据和特征决定了机器学习的上限,而模型和算法仅仅是逼近这个上限而已。
由此可见,特征project尤其是特征选择在机器学习中占有相当重要的地位。
4.1 什么是特征project
首先拽一段英文定义:
Feature engineering is the process of transforming raw data into features that better represent the underlying problem to the predictive models, resulting in improved model accuracy on unseen data.
in a word, feature engineering is manually designing what the input x’s should be.
4.2 为什么要进行特征降维和特征选择
主要是出于例如以下考虑:
1. 特征维数越高。模型越easy过拟合。此时更复杂的模型就不好用。
2. 相互独立的特征维数越高,在模型不变的情况下。在測试集上达到相同的效果表现所须要的训练样本的数目就越大。
3. 特征数量添加带来的训练、測试以及存储的开销都会增大。
4. 在某些模型中。比如基于距离计算的模型KMeans,KNN等模型。在进行距离计算时。维度过高会影响精度和性能。
5. 可视化分析的须要。
在低维的情况下,比如二维,三维,我们能够把数据绘制出来,可视化地看到数据。当维度增高时,就难以绘制出来了。
在机器学习中。有一个非常经典的维度灾难的概念。用来描写叙述当空间维度添加时,分析和组织高维空间,因体积指数添加而遇到各种问题场景。比如,100个平均分布的点能把一个单位区间以每一个点距离不超过0.01採样;而当维度添加到10后。假设以相邻点距离不超过0.01小方格採样单位超一单位超正方体。则须要10^20 个採样点。
正是由于高维特征有如上描写叙述的各种各样的问题,所以我们须要进行特征降维和特征选择等工作。
4.3 特征提取
对于高维特征(成百上千维)。比方图像,文本,声音的特征,特征的每一维没有显著意义的,最好要对特征先进行降维。也就是从初始数据中提取实用的信息。通过降维。将高维空间中的数据集映射到低维空间数据。同一时候尽可能少地丢失信息。或者降维后的数据点尽可能地easy被区分。
这样,能够提取出显著特征。避免维度灾难,还能够避免特征之间的线性相关性。
特征降维经常使用的算法有PCA,LDA等。
PCA算法通过协方差矩阵的特征值分解能够得到数据的主成分,以二维特征为例。两个特征之间可能存在线性关系(比如运动的时速和秒速度)。这样就造成了第二维信息是冗余的。PCA的目标是发现这样的特征之间的线性关系。并去除。
LDA算法考虑label,降维后的数据点尽可能地easy被区分。
4.4 特征选择
通常遇到的情况是:特征不够用。。在这样的情况下,我们就要在设计算法之前,好好地挖掘一下特征。
对于逻辑斯蒂回归和决策树。每一维的特征是有确切意义的。我们就要从各个方面,抽取与目标相关的全部可用信息作为特征。
这个过程可能会比較痛苦。。
然后。是不是特征越多越好?事实上也不是。盗一张图过来例如以下:
能够发现,刚開始模型的准确率随着特征数量的添加而添加,当添加到一定程度便趋于稳定了。假设还要强行添加如此多的特征,反而画蛇添足,easy过拟合。
然后。假设出现特征过多出现过拟合的情况,就要适当地进行參数缩减。
对于逻辑斯蒂回归。某一维特征相应的參数假设接近为零,说明这个特征影响不大,就能够去掉。因此,我们的特征选择过程一般例如以下:
- 选取尽可能多的特征,必要时先进行降维
- 对特征进行选择。保留最具有代表性的特征
这个过程的进行要同一时候观察模型准确率的变化。
最后,特征选择有哪些算法呢?
- 过滤方法:将全部特征进行打分评价,选择最有效的一些特征。比方:卡法检验。信息增益,相关系数打分。
- 包装方法:将特征组合的选择看做是一个在特征空间中的搜索问题。比方:随机爬山法。启示式的搜索方法等。
- 嵌入方法:将特征选择的过程嵌入到模型训练的过程中,事实上也就是正则化的方法。
比方lasso回归。岭回归,弹性网络(Elastic Net)等。
具体其他细节,以后补充。
推荐一篇美团网的技术报告:
另一篇參考:
最后一篇特征选择的好文: