传统的机器学习的监督学习分类分类和回归,分类是争对离散的数据,而回归是争对连续的数据,在数据预处理好的基础上要对数据进行预测,通常采用CV交叉验证来进行模型评价和选择。这篇文章通过连续的数据结合sklearn库对各种回归器做一比较:
1.linear regression
缺点:顾名思义,linear regression是假设数据服从线性分布的,这一假设前提也限制了该模型的准确率,因为现实中由于噪声等的存在很少有数据是严格服从线性的。
优点:基于这种假设,linear regression可以通过normal equation求闭合解的方式求得y_predict
2.logistic regression
缺点:从线性回归衍生而来,将线性的值域通过sigmoid函数压缩在(0,1)范围内,缺点同linear regression,且也是要求数据是无缺失的
优点:有两种方式求解,精确的解析解和SGD算法估计,在要求准确性时使用解析解,在要求时间效率时使用SGD 迭代
3.SVM(支持向量机 )
缺点:计算代价比较大,SVM是将低维无序杂乱的数据通过核函数(RBF,poly,linear,sigmoid)映射到高维空间,通过超平面将其分开
优点:SVM是通过支撑面做分类的,也就是说不需要计算所有的样本,高维数据中只需去少量的样本,节省了内存
在sklearn默认配置中三种核函数的准确率大概是:RBF>poly>linear
4.Naive Bayes
缺点:这一模型适合用在文本样本上,采用了朴素贝叶斯原理假设样本间是相互独立的,因此在关联比较强的样本上效果很差
优点:也是基于其独立的假设,概率计算大大简化,节省内存和时间
5.K近邻
缺点:k需要人为设定,且该算法的复杂度很高
优点:“近朱者赤,近墨者黑”KNN是无参数训练的模型
6.决策树(DT)
缺点:在训练数据上比较耗时
优点:对数据要求度最低的模型,数据可以缺失,可以是非线性的,可以是不同的类型,,最接近人类逻辑思维的模型,可解释性好
7.集成模型(众志成城模型)
random forest:随机抽取样本形成多个分类器,通过vote,少数服从多数的方式决定最终属于多数的分类器结果,分类器之间是相互去之间关联的
gradient boost:弱弱变强,最典型的代表是adaboost(三个臭皮匠,顶个诸葛亮),弱分类器按照一定的计算方式组合形成强的分类器,分类器之间存在关联,最终分类是多个分类器组合的结果
一般地,GB>RF>DT
但是集成模型缺点在于受概率的影响,具有不确定性
以上是常用的回归分类器的比较,在知道各种分类器的优缺点之后就可以使用正确的分类器完成自己的数据处理,如下表是通过计算各类分类器的残差来对比同一任务不同分类器之间的好坏,可以看出来在sklearn默认参数的前提下,准确率排序是:集成模型>DT>SVM>KNN>Linear
分类回归器 | 导入python库命令 | 导入函数命令 | 残差(%) |
linear regression | from sklearn.linear_model import LinearRegressor | lr = LinearRegressor() | 5.223 |
SGD regression penalty L2 | from sklearn.linear_model import SGDRegressor | SGDR = SGDRegressor("penalty = l2") | 5.780 |
SGD regression penalty L1 | SGDR = SGDRegressor("penalty = l1") | 5.765 | |
SVR(rbf kernel) | from sklearn .svm import SVR (Penalty parameter :C,Kernel coefficient :gamma) |
SVR = SVR(kernel="rbf") | 0.627 |
SVR(sigmoid kernel) | SVR = SVR(kernel="sigmoid ") | 82.507 | |
SVR(poly kernel) | SVR = SVR(kernel="poly") | 20.862 | |
SVR(linear kernel) | SVR = SVR(kernel="linear") | 6.451 | |
KNN(n=5,weights=uniform) | from sklearn.neighbors import KNeighborsRegressor | knn = KNeighborsRegressor(n=5,weights="uniform") | 0.731 |
KNN(n=5,weights=distance) | knn = KNeighborsRegressor(n=5,weights="distance") | 1.087 | |
DT | from sklearn.tree import DecisionTreeRegressor | DT = DecisionTreeRegressor() | 0.447 |
Random forest | from sklearn.ensemble import RandomForestRegressor | RF = RandomForestRegressor() | 0.270 |
Extra Trees | from sklearn.ensemble import ExtraTreesRegressor | ET = ExtraTreesRegressor() | 0.246 |
Gradient Boosting | from sklearn.ensemble import GradientBoostingRegressor | GB = GradientBoostingRegressor() | 0.284 |