sklearn中各种分类器回归器都适用于什么样的数据呢?

作者:匿名用户
链接:https://www.zhihu.com/question/52992079/answer/156294774
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

(sklearn官方指南:Choosing the right estimator


0)选择合适的机器学习算法

All models are wrong, but some models are useful. — George Box (Box and Draper 1987)

根据No free lunch theorem,在机器学习中,不存在一个在各方面都最好的模型/算法,因为每一个模型都或多或少地对数据分布有先验的统计假设。取所有可能的数据分布的平均,每个模型的表现都一样好(或者一样糟糕)。因此,我们需要针对具体的问题,找到最好的机器学习算法。


1)数据分析(Exploratory Data Analysis)

在选择具体的算法之前,最好对数据中每一个特征的模式和产生原理有一定的了解:

  • 特征是连续的(real-valued)还是离散的(discrete)?
  • 如果特征是连续的,它的直方图(histogram)长什么样?它的mean和variance是如何分布的?
  • 如果特征是离散的,不同的特征值之间是否存在某种顺序关系?例如,豆瓣上从1星到5星的打分,虽然是离散数据,但有一个从低到高的顺序。如果某个特征是“地址”,则不太可能存在一个明确的顺序。
  • 特征数据是如何被采集的?

2)特征工程(Feature Engineering)

特征工程(根据现有的特征,制造出新的、有价值的特征)决定了机器学习能力的上限,各种算法不过是在逼近这个上限而已。不同的机器学习算法一般会有其对应的不同的特征工程。在实践中,特征工程、调整算法参数这两个步骤常常往复进行。


3)由简至繁:具体算法的选择

sklearn包括了众多机器学习算法。为了简化问题,在此只讨论几大类常见的分类器、回归器。至于算法的原理,sklearn的文档中往往有每个算法的参考文献,机器学习的课本也都有所涉及。

3.1)General Linear Models

最开始建立模型时,我个人一般会选择high bias, low variance的线性模型。线性模型的优点包括计算量小、速度快、不太占内存、不容易过拟合。

常用线性回归器的有Ridge(含有L2正则化的线性回归)和Lasso(含有L1正则化的线性回归,自带特征选择,可以获得sparse coefficients)。同时,如果对于超参数没有什么特别细致的要求,那么可以使用sklearn提供的RidgeCV和LassoCV,自动通过高效的交叉验证来确定超参数的值。

假如针对同一个数据集X(m samples * n features),需要预测的y值不止一个(m samples * n targets),则可以使用multitask的模型。

线性分类器中,最好用的是LogisticRegression和相应的LogisticRegressionCV。

SGDClassifier和SGDRegressor可以用于极大的数据集。然而,如果数据集过大的话,最好从数据中取样,然后和小数据一样分析建模,未必一开始就要在整个数据集上跑算法。


3.2)Ensemble Methods

ensemble能够极大提升各种算法,尤其是决策树的表现。在实际应用中,单独决策树几乎不会被使用。Bagging(如RandomForest)通过在数据的不同部分训练一群high variance算法来降低算法们整体的variance;boosting通过依次建立high bias算法来提升整体的variance。

最常用的ensemble算法是RandomForest和GradientBoosting。不过,在sklearn之外还有更优秀的gradient boosting算法库:XGBoost和LightGBM。

BaggingClassifier和VotingClassifier可以作为第二层的meta classifier/regressor,将第一层的算法(如xgboost)作为base estimator,进一步做成bagging或者stacking。

我个人比较倾向于使用这一类模型。


3.3)支持向量机(SVM)

SVM相关的知识可以参考Andrew Ng教授在Coursera上的CS229(有能力的可以去看youtube或者网易公开课上的原版CS229)。svm的API文档很完善,当一个调包侠也没有太大困难。不过在大多数的数据挖掘竞赛(如kaggle)中,SVM的表现往往不如xgboost。


3.4)神经网络(Neural Network)

相比业内顶尖的神经网络库(如TensorFlow和Theano),sklearn的神经网络显得比较简单。个人而言,如果要使用神经网络进行分类/回归,我一般会使用keras或者pytorch。

 

作者:NightyNight
链接:https://www.zhihu.com/question/52992079/answer/132946166
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

更新…题中问得是sklearn怎么用,我答案里的确没提到具体的sklearn…机器学习用什么语言用什么包不是关键。
平时也是sklearn党,方法也就是这些。建议你自己写一个函数,调用不同分类方法用默认参数去做cross-validation,然后print一下score输出或者画一下ROC曲线啥的。见识的数据集多了,经验丰富了,概率统计学的好点,水平也就上去了…我也是还在练级的过程中。
————————————————
以下是原答案:
谢邀。近期有两个比赛,比较忙,所以只大致讲一下,为题主更深入研究提供一点方向。
选择分类/回归器是基于数据特征的。
举个例子,比如,在预测某种商品是否被某位顾客购买时,预测的target是该顾客是否购买某种商品, 也就是true or false(也就可以用1和0表示),二分类。
然后,能够用来分析的训练集信息,除开targets之外,还有对应顾客的年龄、性别、是否有陪伴者、顾客的衣着样式、商品的价格、商品的种类、商品的品牌等等。
我们观察这些特征,年龄是一些整数,并且这些整数之间的间隔是有意义的——而对于顾客的衣着样式,如果它也是一些整数,像0,1,2,3,4…这样的。
不同整数表示不同的样式,那么这些整数之间的间隔,则缺乏一个实际意义的解释,因为,这些顺序不过是对于"衣着样式"中像"西式正装"、"休闲"这样的词的一个确定方式的排序。你想啊,对于两个样本,在其他特征一致的情况下,年龄值上存在一点小差异,我们推测这两个样本还是很可能有相同的表现(target);
但是,如果在衣着样式的值上有一点小差异,我感觉时髦的年轻人喜欢高裤脚,那如果高裤脚是30,而高裤腰带是31,你觉得这两者的target能一样吗?
而对于几个特征张成的欧式空间,有些算法倾向于将它切割成几块,每一块具有相似的性质,但是高裤腰带和高裤脚显然是相似不了的。
像SVM这样的,基于分割空间的方法,遇到上述“衣着样式”这种连续性非常不好的特征,它的误差就可能很大,因为有异常点(相互靠近的样本表现差异大)。
而像基于树模型的方法,决策时并不关心函数(从特征张成的空间到target取值的数集{0,1}的函数,为方便记为F)的连续性,而考虑的是如何在每个特征上做合适的划分,这样一来,就会有效地规避分割空间带来的误差(虽然实际上,它也分割了空间,但它的理论基础不是这个)。
同时,对于特征主次分明的情况,树模型也通常带来良好的效益。
如果非要用线性模型来分类,可以将导致F不连续的特征进行哑编码,哑编码可以将一些非线性的特征变得“更线性”,代价是带来了稀疏性,这在自然语言处理中很常见。
上面只是分析特征并进行分类器选择的部分过程。题主可以看一下,应该会有启发。
再扯一点人生的经验:
1.稀疏的大规模数据:SGD和逻辑回归。
2.归一化的实数数据:SVM
3.预处理做的不好的数据,弱分类器集成。
4.明显的概率分布问题:贝叶斯(用的少,但在有大语料库的文本处理问题中比较有效)。
5.神经网络relu, relu, relu←_←
posted @ 2018-03-30 00:31  jingsupo  阅读(3653)  评论(0编辑  收藏  举报

欢迎光临