sklearn常见算法简介
Logistic Regression
Background
Maximum Likelihood Logistic Function Normal Distribution Regularization Overfitting
算法
将原本输出结果范围可以非常大的θTX 通过sigmoid函数映射到(0,1),从而完成概率的估测。而直观地在二维空间理解逻辑回归,是sigmoid函数的特性,使得判定的阈值能够映射为平面的一条判定边界,随着特征的复杂化,判定边界可能是多种多样的,但是它能够较好地把两类样本点分隔开,解决分类问题。
代价函数是所有模型误差的平方和,也就是损失函数的总和的平均。
正则化是为了解决过拟合的情况,
参数详解
class sklearn.linear_model.LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='liblinear', max_iter=100, multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)
参数名 | 取值 | 作用 |
penalty | str, ‘l1’ or ‘l2’ | penalty参数可选择的值为"l1"和"l2",分别对应L1的正则化和L2的正则化,默认是L2的正则化。如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。会影响sover函数的选择,当L1时,solver只能为liblinear。 |
dual | bool | Dual只适用于正则化相为l2 liblinear的情况,通常样本数大于特征数的情况下,默认为False |
tol | float, optional | 迭代终止判据的误差范围。
|
C | float,default 1.0 | 正则化系数的倒数,越小对应越强的正则化。 |
class_weight | dict or ‘balanced’, default: None | class_weight参数用于标示分类模型中各种类型的权重,不输入,即所有类型的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重。 第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。 第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。 可以选择balanced,让类库自动提高非法用户样本的权重。
|
random_state | int, RandomState instance or None, optional, default: None | 对正则化算法为sag, liblinear时有用 |
solver | {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’} | a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。 b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。 c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。 d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,SAG是一种线性收敛算法,这个速度远比SGD快。 newton-cg, lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear则既可以用L1正则化也可以用L2正则化。同时,sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择。但是sag不能用于L1正则化。 |
multi_class (把二分问题扩展为多分问题) | str, {‘ovr’, ‘multinomial’}, default: ‘ovr’ | OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。选择ovr,则4种损失函数的优化方法liblinear,newton-cg,lbfgs和sag都可以选择。选择multinomial,则只能选择newton-cg, lbfgs和sag。 |
n_job | int, default: 1 | 如果multi_class ='ovr'“,并行数等于CPU内核数量。当“solver”设置为“liblinear”时,无论是否指定“multi_class”,该参数将被忽略。如果给定值-1,则使用所有内核。 |
max_iter | int,optional | 仅在正则化优化算法为newton-cg, sag和lbfgs 才有用,算法收敛的最大迭代次数。 |
Suport Vector Machine
BackGround
Convex quadratic programming Duality kernel method
算法原理
https://blog.csdn.net/u012990623/article/details/40272619
核函数
解决原始空间的线性不可分,把数据映射到高维空间,使得数据在高维空间内线性可分,低维计算,高维分类。
数据处理时需要进行归一化(加快收敛速度,使支持向量变多,分类更加准确)
核函数:计算两个向量在隐式映射过后的空间中的内积的函数
主要有线性核,主要用于线性可分的情况,我们可以看到特征空间到输入空间的维度是一样的,其参数少速度快,对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类。
多项式核,多项式核函数可以实现将低维的输入空间映射到高纬的特征空间,但是多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算。
高斯核,高斯核函数是一种局部性强的核函数,其可以将一个样本映射到一个更高维的空间内,该核函数是应用最广的一个,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少,因此大多数情况下在不知道用什么核函数的时候,优先使用高斯核函数。
sigmoid核,采用sigmoid核函数,支持向量机实现的就是一种多层神经网络。
如果特征的数量大到和样本数量差不多,则选用LR或者线性核的SVM。
如果特征的数量小,样本的数量正常,则选用SVM+高斯核函数。
SVM分类库
参数 | LinearSVC | SVC | NuSVC |
惩罚系数C | 即为我们第二节中SVM分类模型原型形式和对偶形式中的惩罚系数C,默认为1,一般需要通过交叉验证来选择一个合适的C。一般来说,如果噪音点较多时,C需要小一些。 | NuSVC没有这个参数, 它通过另一个参数nu来控制训练集训练的错误率,等价于选择了一个C,让训练集训练后满足一个确定的错误率 | |
nu | LinearSVC 和SVC没有这个参数,LinearSVC 和SVC使用惩罚系数C来控制惩罚力度。 | nu代表训练集训练的错误率的上限,或者说支持向量的百分比下限,取值范围为(0,1],默认是0.5.它和惩罚系数C类似,都可以控制惩罚的力度。 | |
核函数 kernel | LinearSVC没有这个参数,LinearSVC限制了只能使用线性核函数 | 核函数有四种内置选择,第三节已经讲到:‘linear’即线性核函数, ‘poly’即多项式核函数, ‘rbf’即高斯核函数, ‘sigmoid’即sigmoid核函数。如果选择了这些核函数, 对应的核函数参数在后面有单独的参数需要调。默认是高斯核'rbf'。 还有一种选择为"precomputed",即我们预先计算出所有的训练集和测试集的样本对应的Gram矩阵,这样K(x,z)K(x,z)直接在对应的Gram矩阵中找对应的位置的值。 当然我们也可以自定义核函数, 由于我没有用过自定义核函数,这里就不多讲了。 | |
正则化参数penalty | 仅仅对线性拟合有意义,可以选择‘l1’即L1正则化 或者 ‘l2’即L2正则化。默认是L2正则化,如果我们需要产生稀疏话的系数的时候,可以选L1正则化,这和线性回归里面的Lasso回归类似。 | SVC和NuSVC没有这个参数 | |
是否用对偶形式优化dual | 这是一个布尔变量,控制是否使用对偶形式来优化算法,默认是True,即采用上面第二节的分类算法对偶形式来优化算法。如果我们的样本量比特征数多,此时采用对偶形式计算量较大,推荐dual设置为False,即采用原始形式优化 | SVC和NuSVC没有这个参数 | |
核函数参数degree | LinearSVC没有这个参数,LinearSVC限制了只能使用线性核函数 | 如果我们在kernel参数使用了多项式核函数 'poly',那么我们就需要对这个参数进行调参。这个参数对应K(x,z)=(γx∙z+r)dK(x,z)=(γx∙z+r)d中的dd。默认是3。一般需要通过交叉验证选择一组合适的γ,r,dγ,r,d | |
核函数参数gamma | LinearSVC没有这个参数,LinearSVC限制了只能使用线性核函数 | 如果我们在kernel参数使用了多项式核函数 'poly',高斯核函数‘rbf’, 或者sigmoid核函数,那么我们就需要对这个参数进行调参。 多项式核函数中这个参数对应K(x,z)=(γx∙z+r)dK(x,z)=(γx∙z+r)d中的γγ。一般需要通过交叉验证选择一组合适的γ,r,dγ,r,d 高斯核函数中这个参数对应K(x,z)=exp(−γ||x−z||2)K(x,z)=exp(−γ||x−z||2)中的γγ。一般需要通过交叉验证选择合适的γγ sigmoid核函数中这个参数对应K(x,z)=tanh(γx∙z+r)K(x,z)=tanh(γx∙z+r)中的γγ。一般需要通过交叉验证选择一组合适的γ,rγ,r γγ默认为'auto',即1特征维度1特征维度 | |
核函数参数coef0 | LinearSVC没有这个参数,LinearSVC限制了只能使用线性核函数 | 如果我们在kernel参数使用了多项式核函数 'poly',或者sigmoid核函数,那么我们就需要对这个参数进行调参。 多项式核函数中这个参数对应K(x,z)=(γx∙z+r)dK(x,z)=(γx∙z+r)d中的rr。一般需要通过交叉验证选择一组合适的γ,r,dγ,r,d sigmoid核函数中这个参数对应K(x,z)=tanh(γx∙z+r)K(x,z)=tanh(γx∙z+r)中的rr。一般需要通过交叉验证选择一组合适的γ,rγ,r coef0默认为0
| |
样本权重class_weight | 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None" | ||
分类决策decision_function_shape | LinearSVC没有这个参数,使用multi_class参数替代。 | 可以选择'ovo'或者‘ovo’.目前0.18版本默认是'ovo'.0.19版本将是'ovr' OvR(one ve rest)的思想很简单,无论你是多少元分类,我们都可以看做二元分类。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元分类,得到第K类的分类模型。其他类的分类模型获得以此类推。 OvO(one-vs-one)则是每次每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元分类,得到模型参数。我们一共需要T(T-1)/2次分类。 从上面的描述可以看出OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而OvO分类相对精确,但是分类速度没有OvR快。一般建议使用OvO以达到较好的分类效果。 | |
分类决策multi_class | 可以选择 ‘ovr’ 或者 ‘crammer_singer’ ‘ovr’和SVC和nuSVC中的decision_function_shape对应的‘ovr’类似。 'crammer_singer'是一种改良版的'ovr',说是改良,但是没有比’ovr‘好,一般在应用中都不建议使用。 | SVC和nuSVC没有这个参数,使用decision_function_shape参数替代。 | |
缓存大小cache_size | LinearSVC计算量不大,因此不需要这个参数 | 在大样本的时候,缓存大小会影响训练速度,因此如果机器内存大,推荐用500MB甚至1000MB。默认是200,即200MB. |
SVM回归算法库参数
参数 | LinearSVR | SVR | nuSVR |
惩罚系数C | 即为我们第二节中SVM分类模型原型形式和对偶形式中的惩罚系数C,默认为1,一般需要通过交叉验证来选择一个合适的C。一般来说,如果噪音点较多时,C需要小一些。大家可能注意到在分类模型里面,nuSVC使用了nu这个等价的参数控制错误率,就没有使用C,为什么我们nuSVR仍然有这个参数呢,不是重复了吗?这里的原因在回归模型里面,我们除了惩罚系数C还有还有一个距离误差ϵϵ来控制损失度量,因此仅仅一个nu不能等同于C.也就是说回归错误率是惩罚系数C和距离误差ϵϵ共同作用的结果。后面我们可以看到nuSVR中nu的作用。 | ||
nu | LinearSVR 和SVR没有这个参数,用ϵϵ控制错误率 | nu代表训练集训练的错误率的上限,或者说支持向量的百分比下限,取值范围为(0,1],默认是0.5.通过选择不同的错误率可以得到不同的距离误差ϵϵ。也就是说这里的nu的使用和LinearSVR 和SVR的ϵϵ参数等价。 | |
距离误差epsilon | 即我们第二节回归模型中的ϵϵ,训练集中的样本需满足−ϵ−ξ∨i≤yi−w∙ϕ(xi)−b≤ϵ+ξ∧i−ϵ−ξi∨≤yi−w∙ϕ(xi)−b≤ϵ+ξi∧ | nuSVR没有这个参数,用nu控制错误率 | |
是否用对偶形式优化dual | 和SVC类似,可参考上一节的dual描述 | SVR和NuSVR没有这个参数 | |
正则化参数penalty | 和SVC类似,可参考上一节的penalty 描述 | SVR和NuSVR没有这个参数 | |
核函数 kernel | LinearSVR没有这个参数,LinearSVR限制了只能使用线性核函数 | 和SVC, nuSVC类似,可参考上一节的kernel描述 | |
核函数参数degree, gamma 和coef0 | LinearSVR没有这些参数,LinearSVR限制了只能使用线性核函数 | 和SVC, nuSVC类似,可参考上一节的kernel参数描述 | |
损失函数度量loss | 可以选择为‘epsilon_insensitive’ 和 ‘squared_epsilon_insensitive’ ,如果选择‘epsilon_insensitive’ ,则损失度量满足−ϵ−ξ∨i≤yi−w∙ϕ(xi)−b≤ϵ+ξ∧i−ϵ−ξi∨≤yi−w∙ϕ(xi)−b≤ϵ+ξi∧,即和第二节的损失度量一样。是默认的SVM回归的损失度量标准形式。 如果选择为 ‘squared_epsilon_insensitive’ , 则损失度量满足(yi−w∙ϕ(xi)−b)2≤ϵ+ξi(yi−w∙ϕ(xi)−b)2≤ϵ+ξi,此时可见会少一个松弛系数。其优化过程我们在SVM原理系列里没有讲,但是目标函数优化过程是完全相似的。 一般用默认的‘epsilon_insensitive’就足够了。 | SVR和NuSVR没有这个参数 | |
缓存大小cache_size | LinearSVC计算量不大,因此不需要这个参数 | 在大样本的时候,缓存大小会影响训练速度,因此如果机器内存大,和SVC,nuSVC一样,推荐用500MB甚至1000MB。默认是200,即200MB. |
LR与SVM的异同
同
- 都是监督的分类算法
- 都是线性分类方法
- 都是判别模型,判别模型和生成模型是两个相对应的模型。 判别模型是直接生成一个表示P(Y|X)或者Y=f(X)的判别函数(或预测模型) 。生成模型是先计算联合概率分布P(Y,X)然后通过贝叶斯公式转化为条件概率。 SVM和LR,KNN,决策树都是判别模型,而朴素贝叶斯,隐马尔可夫模型是生成模型。 生成算法尝试去找到底这个数据是怎么生成的(产生的),然后再对一个信号进行分类。基于你的生成假设,那么那个类别最有可能产生这个信号,这个信号就属于那个类别。判别模型不关心数据是怎么生成的,它只关心信号之间的差别,然后用差别来简单对给定的一个信号进行分类。
异
- 本质上是其loss function不同。
- 支持向量机只考虑局部的边界线附近的点,而逻辑回归考虑全局(远离的点对边界线的确定也起作用)。
- 在解决非线性问题时,支持向量机采用核函数的机制,而LR通常不采用核函数的方法。
- 线性SVM依赖数据表达的距离测度,所以需要对数据先做normalization,LR不受其影响。
- SVM的损失函数就自带正则(损失函数中的1/2||w||^2项),这就是为什么SVM是结构风险最小化算法的原因,而LR必须另外在损失函数上添加正则项
Decision Tree
Background
决策树的构建过程
决策树属于白盒模型,如果一个情况被观察到,使用逻辑判断容易表示这种规则。决策树有一个根节点,多个内部结点和多个叶子结点,根节点包含样本的全集,叶子结点对应策略结果,其他的每一个结点对应一个属性测试,从根结点到每一个叶子结点的路径对应了一个判定测试序列。
采用分治策略,递归生成树,三种返回情况:1. 当前的结点包含的样本属于同一种类别 2.当前属性集为空或者取值相同(把当前的结点设置为叶子结点,类别为当前结点所含样本最多的类别,利用当前结点的后验概率) 3.当前结点包含的样本集合为空,不能被划分(把当前结点设置为叶子结点,将其类别设置为父节点所含样本最多的类别,把父节点的样本分布作为当前结点的先验分布)。
划分算法
ID3决策树学习算法以信息增益为准则来选择划分属性,信息增益最大的被选为划分属性。
C4.5使用增益率选择最优划分属性,先选择信息增益高于平均水平的属性,再从中选择出增益率最高的。
GINI指数从数据集中随机选择两个样本,标记不一样的概率,因此Gini指数越小,数据集的纯度越高,则选择划分后基尼指数最小的属性作为最优划分属性。
剪枝处理(解决过拟合问题):
预剪枝(在结点划分前,判断如果这个划分不能提升决策树的泛化性,则停止划分并标记结点为叶子结点)降低了过拟合的风险,减少了决策树的训练时间和测试时间的开销,但是有欠拟合的风险;
后剪枝(先从训练集中生成一个决策树,再自底向上对非叶子结点进行考察,若将该结点对于的子树替换为叶子结点能提升决策树泛化性)时间开销非常大。
连续值,基础划分算法为二分法(C4.5),在二分法的划分中,对于相邻的两个属性,取均值对属性进行划分。与离散属性不同,连续属性还可以在子类中作为属性划分点。
缺失值,在划分时对每个样本赋予一个权重,再调整信息增益公式。
参数详解
class sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2,min_samples_leaf =1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None,class_weight=None, presort=False)
参数名 | 取值 | DecisionTreeClassifier | DecisionTreeRegressor |
criterion | string,默认gini | 可以使用"gini"或者"entropy",前者代表基尼系数,后者代表信息增益。一般来说使用默认值基尼系数"gini"就可以了,即CART算法。 | 可以使用"mse"或者"mae",前者是均方误差,后者是和均值之差的绝对值之和。推荐使用默认值"mse"。一般来说"mse"比"mae"更加精确。 |
splitter | string,默认 best | 一种用来在节点中选择分类的策略。支持的策略有"best",选择最好的分类,"random"选择最好的随机分类。 | |
max_features | int,float,string or None 可选(默认为None) | 在进行分类时需要考虑的特征数。 1.如果是int,在每次分类是都要考虑max_features个特征。 2.如果是float,那么max_features是一个百分率并且分类时需要考虑的特征数是int(max_features*n_features,其中n_features是训练完成时发特征数)。 3.如果是auto,max_features=sqrt(n_features) 4.如果是sqrt,max_features=sqrt(n_features) 5.如果是log2,max_features=log2(n_features) 6.如果是None,max_features=n_features 注意:至少找到一个样本点有效的被分类时,搜索分类才会停止。 | |
max_depth | int or None,可选(默认为"None") | 表示树的最大深度。如果是"None",则节点会一直扩展直到所有的叶子都是纯的或者所有的叶子节点都包含少于min_samples_split个样本点。忽视max_leaf_nodes是不是为None。 | |
min_samples_split | int,float,可选(默认为2) | 区分一个内部节点需要的最少的样本数。 1.如果是int,将其最为最小的样本数。 2.如果是float,min_samples_split是一个百分率并且ceil(min_samples_split*n_samples)是每个分类需要的样本数。ceil是取大于或等于指定表达式的最小整数。 | |
min_samples_leaf | int,float,可选(默认为1) | 一个叶节点所需要的最小样本数:
| |
class_weight | dict,list of dicts,"Banlanced" or None,可选(默认为None) | 表示在表{class_label:weight}中的类的关联权值。如果没有指定,所有类的权值都为1。对于多输出问题,一列字典的顺序可以与一列y的次序相同。 "balanced"模型使用y的值去自动适应权值,并且是以输入数据中类的频率的反比例。如:n_samples/(n_classes*np.bincount(y))。对于多输出,每列y的权值都会想乘。 如果sample_weight已经指定了,这些权值将于samples以合适的方法相乘。 | 不适用于回归树 |
random_state | int,RandomState instance or None | 如果是int,random_state 是随机数字发生器的种子;如果是RandomState,random_state是随机数字发生器,如果是None,随机数字发生器是np.random使用的RandomState instance. | |
persort | bool,可选(默认为False) | 是否预分类数据以加速训练时最好分类的查找。在有大数据集的决策树中,如果设为true可能会减慢训练的过程。当使用一个小数据集或者一个深度受限的决策树中,可以减速训练的过程。 |
Naive Bayes
Background
算法
假设各个特征之间相互独立。
先验概率+数据=后验概率
对数据集进行训练获得类别概率,选取概率大的作为该类别的结果。
类名 | 参数 | 特点 | 测试方法 |
GuassionNB (先验概率为高斯分布) | 先验概率priors,对应Y的各个类别的先验概率P(Y=Ck)。这个值默认不给出,如果不给出此时P(Y=Ck)=mk/m。其中m为训练集样本总数量,mk为输出为第k类别的训练集样本数。如果给出的话就以priors 为准。 | partial_fit()方法,这个方法一般用在如果训练集数据量非常大,一次不能全部载入内存的时候,我们可以把训练集分成若干等分,重复调用partial_fit()方法来一步步的学习训练。 | fit拟合后有三种预测方式: predict()直接给出测试集的预测类别输出。 predict_proba()给出测试集样本在各个类别上预测的概率。predict_log_proba()给出测试集样本在各个类别上预测的概率的对数。
|
MultinomialNB (先验概率为多项式分布) | 参数alpha即为上面的常数λ,如果没有特别的需要,用默认值1即可;如果发现拟合得不好,需要调优时,可以选择稍大于1或者稍小于1的数。布尔参数fit_prior表示是否要考虑先验概率,如果是false,则所有的样本类别输出都有相同的类别先验概率,否则可以用第三个参数class_prior输入先验概率,也可以不输入第三个参数class_prior,而是让MultinomialNB类自己从训练集样本中计算先验概率,此时的先验概率即为,其中m是训练集样本总数,是输出为第k个类别的训练集样本数 |
| 同上 |
BernoulliNB (先验概率为二元伯努利分布) | 4个参数,其中3个参数的名称和意义与MultinomialNB类完全相同,唯一不同的是增加了binarize参数,这个参数主要是用来帮助BernoulliNB类处理二项分布的,可以是数值或者不输入。如果不输入,则BernoulliNB类认为每个数据特征都已经是二元的;否则,小于binarize的数值归为一类,大于binarize的数值归为另外一类。 |
| 同上 |
K-means
Background
划分算法
对于一个样本空间,先给定一个K来对样本进行划分,选择K个初始化类别中心,对于每个样本,将其类别归到距离最近的样本中心的类别下,再更新各个类别中心为其类别下所有样本的均值,迭代重复直到到达终止条件。
算法初值敏感,因此在初始簇中心的选择上需要进行考量。
终止条件
1.迭代次数 2.最小平方误差 3.簇中心点的变化率
sklearn库中的K-Means
参数 | KMeans | MiniBatch Kmeans |
n_clusters | K值,需要多测试一些来获得好的结果 | 同 |
max_iter | 最大迭代次数,数据集为凸时无需设置 | 同 |
n_init | 用不同的初始化质心运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,默认是10,一般不需要改。如果你的k值较大,则可以适当增大这个值。 | MiniBatchKMeans类的n_init则是每次用不一样的采样数据集来跑不同的初始化质心运行算法。 |
init | 即初始值选择的方式,可以为完全随机选择'random',优化过的'k-means++'或者自己指定初始化的k个质心。一般建议使用默认的'k-means++' | 同 |
algorithm | 有“auto”, “full” or “elkan”三种选择。"full"就是我们传统的K-Means算法, “elkan”是我们原理篇讲的elkan K-Means算法。默认的"auto"则会根据数据值是否是稀疏的,来决定如何选择"full"和“elkan”。一般数据是稠密的,那么就是 “elkan”,否则就是"full"。一般来说建议直接用默认的"auto" |
|
batch_size |
| 即用来跑Mini Batch KMeans算法的采样集的大小,默认是100.如果发现数据集的类别较多或者噪音点较多,需要增加这个值以达到较好的聚类效果。 |
reassignment_ ratio |
| 某个类别质心被重新赋值的最大次数比例,这个和max_iter一样是为了控制算法运行时间的。这个比例是占样本总数的比例,乘以样本总数就得到了每个类别质心可以重新赋值的次数。如果取值较高的话算法收敛时间可能会增加,尤其是那些暂时拥有样本数较少的质心。默认是0.01。如果数据量不是超大的话,比如1w以下,建议使用默认值。如果数据量超过1w,类别又比较多,可能需要适当减少这个比例值。具体要根据训练集来决定。 |
max_no_improvement |
| 即连续多少个Mini Batch没有改善聚类效果的话,就停止算法, 和reassignment_ratio, max_iter一样是为了控制算法运行时间的。默认是10.一般用默认值就足够了。 |
init_size |
| 用来做质心初始值候选的样本个数,默认是batch_size的3倍,一般用默认值就可以了。 |
常见算法比较
算法 | 属性 | sklearn 库 | 性能指标 | 优点 | 缺点 |
Logistic Regression | 二分类/ 监督式/ 判别式/
| LogisticRegression (每次需要指定正则化系数)LogisticRegressionCV (使用交叉验证来选择正则化系数)Logistic_regression_ path (拟合数据后,不能直接来做预测,只能为拟合数据选择合适逻辑回归的系数和正则化系数。主要是用在模型选择) | 混淆矩阵, Accuracy, precision, Recall, F1-Score, ROC Curve AUC | 实现简单,广泛的应用于工业问题上; 速度快,适合二分类; 简单易于理解,直接看到各个特征的权重; 更容易更新模型吸收新数据; 对逻辑回归而言,多重共线性并不是问题,它可以结合L2正则化来解决该问题; | 对数据和场景的适应能力有局限性,不如决策树算法适应性那么强; 特征空间很大时,逻辑回归的性能不是很好; 容易欠拟合,一般准确度不太高; 不能很好地处理大量多类特征或变量; 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分,对于非线性特征,需要进行转换; 使用前提: 自变量与因变量是线性关系。 只是广义线性模型,不是真正的非线性方法 |
SVM | 二分类/ 回归/ 有监督/ 判别式 | 分类算法库:SVC,NuSVC,LinearSVC 回归算法库:SVR,NuSVR,Line arSVR | 同上 | 支持向量机能对非线性决策边界建模,又有许多可选的核函数。在面对过拟合时,支持向量机有着极强的稳健性,尤其是在高维空间中。可以解决小样本情况下的机器学习问题。 可以提高泛化性能。 可以避免神经网络结构选择和局部极小点问题。
| 支持向量机是内存密集型算法,选择正确的核函数就需要相当的技巧,不太适用较大的数据集。 对缺失数据敏感。 |
Decision Tree | 分类/ 回归/ 有监督/ 判别式 | 调优过的CART树算法,既可以做分类,又可以做回归。 分类决策树:DecisionTreeClassifier回归决策树:DecisionTreeRegressor | 同上 | 简单易懂,原理清晰,决策树可以实现可视化 数据准备简单。其他的方法需要实现数据归一化,创建虚拟变量,删除空白变量。(注意:这个模块不支持缺失值) 使用决策树的代价是数据点的对数级别。 能够处理数值和分类数据 能够处理多路输出问题 使用白盒子模型(内部结构可以直接观测的模型)。一个给定的情况是可以观测的,那么就可以用布尔逻辑解释这个结果。相反,如果在一个黑盒模型(ANN),结果可能很难解释 可以通过统计学检验验证模型。这也使得模型的可靠性计算变得可能 即使模型假设违反产生数据的真实模型,表现性能依旧很好。
| 过拟合。为避免这个问题,剪枝、设置叶节点的最小样本数量、设置决策树的最大深度有时候是必要的。 决策树有时候是不稳定的,因为数据微小的变动,可能生成完全不同的决策树。 可以通过总体平均(ensemble)减缓这个问题。 学习最优决策树是一个NP完全问题。所以,实际决策树学习算法是基于试探性算法,例如在每个节点实现局部最优值的贪心算法。这样的算法是无法保证返回一个全局最优的决策树。可以通过随机选择特征和样本训练多个决策树来缓解这个问题。 有些问题学习起来非常难,因为决策树很难表达。如:异或问题、奇偶校验或多路复用器问题 如果有些因素占据支配地位,决策树是有偏的。因此建议在拟合决策树之前先平衡数据的影响因子。
|
Naive Bayes | 分类/ 有监督/生成式 | GaussianNB(高斯朴素贝叶斯) MultinomialNB(多项式朴素贝叶斯) BernoulliNB(伯努利朴素贝叶斯) 如果样本特征的分布大部分是连续值,则使用GaussianNB会比较好;如果样本特征的分布大部分是多元离散值,则使用MultinomialNB比较合适; 如果样本特征是二元离散值或者很稀疏的多元离散值,则应该使用BernoulliNB。 | 同上 | 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。对缺失数据不太敏感,算法也比较简单,常用于文本分类。 空间开销小
| 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。 对输入数据的表达形式很敏感。
|
K-means | 聚类/ 无监督/ 生成式 | 初始化优化k-Means++ 大数据情况下优化的Mini Batch K-Means | 簇间相似度 外部指标:将聚类结果与给定的参考对象进行比较 内部指标:直接对聚类结果进行考察 均一性 完整性 V-measure | 容易实现 K值为用户给定,不同的K得到的结果不一样 初值敏感 不适合发现差别较大或者凹形的簇 特殊值对模型的影响较大 | 缺点是可能收敛到局部最小值,在大规模数据集上收敛较慢。它适用的数据类型是数值型数据。 |
工业运用与开源框架
DT:从商业角度看,常用于基于规则的信用评估、赛马结果预测等。
SVM:SVM(包括适当调整过的)解决的一些特大的问题有:广告、人类基因剪接位点识别、基于图片的性别检测、大规模图片分类,适用于新闻分类、手写识别等应用。
NB:现实生活中的应用例子:电子邮件垃圾副过滤、判定文章属性分类、分析文字表达的内容含义和人脸识别、情感分析、消费者分类。
LR:回归在现实生活中的用途如下:信用评估、测量市场营销的成功度、预测某个产品的收益、特定的某天是否会发生地震,路面交通流量分析、邮件过滤。
K-Means:1.文档分类器 2.物品传输优化 3.识别犯罪地点 4.客户画像 5.球队状态分析 6.保险欺诈检测 7.乘车数据分析。
开源工具 |
|
Accord.NET | 用C#编写的ML框架,专为构建生产级计算机视觉、计算机试听、信号处理和统计应用程序而设计。它是一个文档记录良好的ML框架,可以轻松实现音频和图像处理。 |
MLlib | Apache 开源项目 Spark 针对一些常用的分类、回归、推荐、聚类、生存分析等多种的机器学习算法,同时也包括了相关的测试程序和数据生成器。 专为处理大规模数据而设计的,所以此强大的库具有许多算法和实用工具,如分类、回归和聚类。该工具在Python和R库中与NumPy交互操作。它可以轻松插入到Hadoop工作流程中。易用(天生兼容 Spark 框架的 API 接口和 Python、Java、Scala 等多种语言)、高性能(依靠 Spark 的数据管理能力,运行迭代和逻辑回归算法时比 Hadoop 框架快 100 倍)和易于部署(可以直接在现有的 Hadoop 数据集群上运行)。 |
面向数据科学家的现代云平台。它可以用于在云中开发ML模型。 借助广泛的建模选项和算法,Azure非常适合构建较大的ML模型。此服务为每个帐户提供10GB的存储空间。它可以与R和Python程序一起使用。 | |
ML服务,提供用于创建ML模型的工具和向导。借助可视化辅助功能和易用的分析功能,AML旨在让开发人员更方便地使用ML。AML可以连接到存储在Amazon S3、Redshift或RDS中的数据。 | |
H2O | 开源的,分布式的,基于内存的,可扩展的机器学习和预测分析框架,适合在企业环境中构建大规模机器学习模型。核心代码使用Java编写,数据和模型通过分布式 Key/Value 存储在各个集群节点的内存中。H2O的算法使用Map/Reduce框架实现,并使用了Java Fork/Join框架来实现多线程。 目前支持的机器学习算法有DRF,GBM,GLM,GLRM,Kmeans,NB,PCA,Deep Learning |