sklearn-4.11逻辑回归,SVM,SGDClassifi
模型选择:
前面说了逻辑回归和SVM的区别和联系,主要是线性是否可分,但是实际二分类中特征向量维数起码数十,成百上千的,虽说降维之后看看特征是否能够线性可分,但再加上数据本身都是参杂各种噪点,单从这个方面做模型选择就有点难。
ng从特征数量n和样本数量m的关系给出了如下推荐:
如果特征数量大到和样本数量差不多,或者特征数量远远大于样本数量,则选用LR或者线性核的SVM;(eg.n=10000,m=10-1000)
如果特征的数量小,样本的数量正常,则选用SVM+高斯核函数;(eg.n=1-1000,m=10-10000)
如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况。
参数选择:
SVM
sklearn的SVM需要调参的参数主要有核函数,惩罚项C,gamma
核函数主要是RBF ,Linear, Poly, Sigmoid。
sklearn默认为RBF,高斯核。ng说这也是非线性一般选用的核。
Linear线性核,Poly为多项式核,Sigmoid是tanh函数,这是神经网络的常用激活函数,也就是说这可以看成一种神经网络。
惩罚项C,即模型的容错能力,C越大对错误项惩罚越大,则训练集的划分效果越好,过了就是过拟合,high variance了,反之,则泛化程度越高,过了就是high bias。
gamma是sklearn自己带的参数,理解是gamma越高,支持向量越少。
LR
sklearn的LR需要调参的参数主要正则化选择:penalty。
有L1,L2,一般为防止过拟合用L2,因为L1用直接使一些特征归零。
但是如果L2正则之后还是过拟合,就可以尝试用L1.
另如果有很多的特征,且其中还有重要特征,也可以用L1将不重要的特征归零。
优化算法选择参数:solver
‘liblinear’:L1,L2
‘newton-cg’, ‘lbfgs’, ‘sag’:L2
‘sag’:随机平均梯度下降,针对大数据mini-batch
说到大数据不得不说另一种线性分类器:
SGDClassifier
我觉得这个分类器跟其他线性分类器差不多,只是它用的是mini-batch来做梯度下降,在处理大数据的情况下收敛更快。
对于特别大的数据还是优先使用SGDClassifier,其他的线性可能很慢或者直接跑不动。
果然官方这样说:Linear classifiers (SVM, logistic regression, a.o.) with SGD training.
通过选择loss来选择不同模型,hinge是SVM,log是LR
sklearn.linear_model.SGDClassifier(loss=’hinge’, penalty=’l2’, alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=None, tol=None, shuffle=True, verbose=0, epsilon=0.1, n_jobs=1, random_state=None, learning_rate=’optimal’, eta0=0.0, power_t=0.5, class_weight=None, warm_start=False, average=False, n_iter=None)
关于loss function
参考:
http://www.stardustsky.net/index.php/post/53.html
https://blog.csdn.net/sun_shengyun/article/details/53811483