转自http://www.douban.com/note/413022836/
看到一篇文章,是将在机器学习模型中经常遇到的一些错误,反省一下自己,也看到身边的很多同事也在犯同样的错误,于是就写下来,自省也提醒大家。原文链接:
http://ml.posthaven.com/machine-learning-done-wrong
机器学习很大程度上就像软件工程一样,比如我现在要实现一个key-value的数据库,那么有很多种模式都可以实现,但是他们最终所达到的效果却是千差万别的。同样,在机器学习领域,如果我想实现一个分类器,也有很多种算法,但是每种算法都对数据做了不同的前提假设。
曾经当我们处理少量数据的时候,我们往往可以先设计若干种算法,然后每种都测试一下,选择一种最优的方法,但是当面对大数据时,我们就需要转变一下思路,首先对数据进行分析,然后选择一种模型对数据进行处理。
在过去,我们经常会发现,很多人都沉迷于某一种模型,无论遇到任何问题他们都会选择同样的模型来解决问题,而原因仅仅是他们擅长这个模型,而不是数据适合这个模型。在这篇文章中,主要会来陈述下在机器学习时常见的几种错误。
1. 使用模型默认的损失函数
损失函数是一个机器学习算法的核心,损失函数决定了最终优化后得到的参数以及模型本身。在不同的业务场景下,优化的目标应该是不同的。例如我在珍爱网做付费用户预测时,由于付费用户本身数量级就不大,所以我宁可误判十个,也不能错过一个。所以这个时候我们就需要去修改分类器模型的损失函数。
2. 无根据地选择线性模型
这个同样是我很常遇到的同事会犯的错误。遇到一个分类问题,二话不说就上逻辑回归,其实原因很简单,就是因为逻辑回归效率高,实现容易。但是大家往往都忽略了一点,逻辑回归本身就是一个线性模型,但是真实数据是否线性可分却是我们未知的情况。其实我个人认为,由于高维数据下判断数据是否线性可分几乎是一个不现实的任务,所以我个人的经验往往是先使用逻辑回归做一次分类,但是同时也会采用决策树,或者SVM等非线性模型来对该数据进行重新的分类比对。(我不知道是否有更好的方法)
话说在大数据情况下,很多人都来和我讲现在都提倡海量数据+线性模型,但是我个人认为这句话是有误的,线性模型的成立并非建立在海量数据的基础上,而是建立在海量特征的基础上,说的更恰当些,应该是建立在更好的特征工程的基础之上。
3. 忽视异常值的意义
异常值是个很有趣的事情,让你又爱又恨。我记得之前在统计之都上看过一篇文章对我启发很大,说曾经我们都愿意把异常值直接给丢掉,但是我们却忘记了异常值并非错误值,而同样是真实情况的表现,我们之所以认为异常,只是因为我们的数据量不足够大而已。文中还举了一个例子,说我们用计算机来模拟高斯分布,也一样会模拟出一些数据点落在N个标准差之外,而我们并不能说这是异常点,因为如果我们把这些点删除掉,这就不是一个高斯分布了。所以异常值很多情况下非但不能丢掉,还需要引起我们的足够重视和分析,例如网站的收入突然增长。
但是我们又要注意这个异常值是否是错误值,如果是错误值,这个时候我们就应该想办法把这些错误值去掉,因为这些错误往往会影响我们实际的模型效果。如果当训练数据中包含一些异常值的时候,我们就需要考虑模型的敏感性了,例如AdaBoost, Kmeans这种就属于对异常值很敏感的机器学习模型。
4. 不考虑n和p的关系
n: 训练数据的数量。p: 特征的数量。SVM核函数的一个关键概念就是维度提升,如果当n << p的时候,还依然采用SVM来选定模型,那么就必然会导致p进一步增加,于是导致特征的参数中自由变量增加,必然会对分类的效果产生很大的影响。
5. L1 / L2 正则化之前并没有对特征进行标准化
这个道理很简单,如果你的每个特征是处在不同的区间时,你是没办法去做L1/L2的正则化的,举个例子,x1 代表年龄,x2 代表收入,如果我采用一个广义的线性模型,比如 Y = f(ax1 + bx2),然后x1大小范围是10-50,x2大小范围是5000 - 100000,a和b根本就没办法在一个量级上,这时正则化一定是有问题的。
6. 变量之间的共线性问题
当特征变量之间产生共线性时,产生最大的问题就是让线性模型的参数是无法解释的,正常来说线性模型的参数权重基本就代表了该特征变量的重要性,但是如果共线性,那么这个意义就失效了。但是我也并不知道这个有什么特别好的解决方法,因为当特征增加时,特征之间的共线性(或者说相关性吧,这样更泛一些)几乎是不可避免的。
机器学习很大程度上就像软件工程一样,比如我现在要实现一个key-value的数据库,那么有很多种模式都可以实现,但是他们最终所达到的效果却是千差万别的。同样,在机器学习领域,如果我想实现一个分类器,也有很多种算法,但是每种算法都对数据做了不同的前提假设。
曾经当我们处理少量数据的时候,我们往往可以先设计若干种算法,然后每种都测试一下,选择一种最优的方法,但是当面对大数据时,我们就需要转变一下思路,首先对数据进行分析,然后选择一种模型对数据进行处理。
在过去,我们经常会发现,很多人都沉迷于某一种模型,无论遇到任何问题他们都会选择同样的模型来解决问题,而原因仅仅是他们擅长这个模型,而不是数据适合这个模型。在这篇文章中,主要会来陈述下在机器学习时常见的几种错误。
1. 使用模型默认的损失函数
损失函数是一个机器学习算法的核心,损失函数决定了最终优化后得到的参数以及模型本身。在不同的业务场景下,优化的目标应该是不同的。例如我在珍爱网做付费用户预测时,由于付费用户本身数量级就不大,所以我宁可误判十个,也不能错过一个。所以这个时候我们就需要去修改分类器模型的损失函数。
2. 无根据地选择线性模型
这个同样是我很常遇到的同事会犯的错误。遇到一个分类问题,二话不说就上逻辑回归,其实原因很简单,就是因为逻辑回归效率高,实现容易。但是大家往往都忽略了一点,逻辑回归本身就是一个线性模型,但是真实数据是否线性可分却是我们未知的情况。其实我个人认为,由于高维数据下判断数据是否线性可分几乎是一个不现实的任务,所以我个人的经验往往是先使用逻辑回归做一次分类,但是同时也会采用决策树,或者SVM等非线性模型来对该数据进行重新的分类比对。(我不知道是否有更好的方法)
话说在大数据情况下,很多人都来和我讲现在都提倡海量数据+线性模型,但是我个人认为这句话是有误的,线性模型的成立并非建立在海量数据的基础上,而是建立在海量特征的基础上,说的更恰当些,应该是建立在更好的特征工程的基础之上。
3. 忽视异常值的意义
异常值是个很有趣的事情,让你又爱又恨。我记得之前在统计之都上看过一篇文章对我启发很大,说曾经我们都愿意把异常值直接给丢掉,但是我们却忘记了异常值并非错误值,而同样是真实情况的表现,我们之所以认为异常,只是因为我们的数据量不足够大而已。文中还举了一个例子,说我们用计算机来模拟高斯分布,也一样会模拟出一些数据点落在N个标准差之外,而我们并不能说这是异常点,因为如果我们把这些点删除掉,这就不是一个高斯分布了。所以异常值很多情况下非但不能丢掉,还需要引起我们的足够重视和分析,例如网站的收入突然增长。
但是我们又要注意这个异常值是否是错误值,如果是错误值,这个时候我们就应该想办法把这些错误值去掉,因为这些错误往往会影响我们实际的模型效果。如果当训练数据中包含一些异常值的时候,我们就需要考虑模型的敏感性了,例如AdaBoost, Kmeans这种就属于对异常值很敏感的机器学习模型。
4. 不考虑n和p的关系
n: 训练数据的数量。p: 特征的数量。SVM核函数的一个关键概念就是维度提升,如果当n << p的时候,还依然采用SVM来选定模型,那么就必然会导致p进一步增加,于是导致特征的参数中自由变量增加,必然会对分类的效果产生很大的影响。
5. L1 / L2 正则化之前并没有对特征进行标准化
这个道理很简单,如果你的每个特征是处在不同的区间时,你是没办法去做L1/L2的正则化的,举个例子,x1 代表年龄,x2 代表收入,如果我采用一个广义的线性模型,比如 Y = f(ax1 + bx2),然后x1大小范围是10-50,x2大小范围是5000 - 100000,a和b根本就没办法在一个量级上,这时正则化一定是有问题的。
6. 变量之间的共线性问题
当特征变量之间产生共线性时,产生最大的问题就是让线性模型的参数是无法解释的,正常来说线性模型的参数权重基本就代表了该特征变量的重要性,但是如果共线性,那么这个意义就失效了。但是我也并不知道这个有什么特别好的解决方法,因为当特征增加时,特征之间的共线性(或者说相关性吧,这样更泛一些)几乎是不可避免的。