
MLPClassifier是一个监督学习算法,下图是只有1个隐藏层的MLP模型 ,左侧是输入层,右侧是输出层。
上图的整体结构可以简单的理解为下图所示:
MLP又名多层感知机,也叫人工神经网络(ANN,Artificial Neural Network),除了输入输出层,它中间可以有多个隐藏层,如果没有隐藏层即可解决线性可划分的数据问题。最简单的MLP模型只包含一个隐藏层,即三层的结构,如上图。
从上图可以看到,多层感知机的层与层之间是全连接的(全连接的意思就是:上一层的任何一个神经元与下一层的所有神经元都有连接)。多层感知机最底层是输入层,中间是隐藏层,最后是输出层。
输入层没什么好说,你输入什么就是什么,比如输入是一个n维向量,就有n个神经元。
隐藏层的神经元怎么得来?首先它与输入层是全连接的,假设输入层用向量X表示,则隐藏层的输出就是
f(W1X+b1),W1是权重(也叫连接系数),b1是偏置,函数f 可以是常用的sigmoid函数或者tanh函数:
最后就是输出层,输出层与隐藏层是什么关系?其实隐藏层到输出层可以看成是一个多类别的逻辑回归,也即softmax回归,所以输出层的输出就是softmax(W2X1+b2),X1表示隐藏层的输出f(W1X+b1)。
MLP整个模型就是这样子的,上面说的这个三层的MLP用公式总结起来就是,函数G是softmax
因此,MLP所有的参数就是各个层之间的连接权重以及偏置,包括W1、b1、W2、b2。对于一个具体的问题,怎么确定这些参数?求解最佳的参数是一个最优化问题,解决最优化问题,最简单的就是梯度下降法了(sgd):首先随机初始化所有参数,然后迭代地训练,不断地计算梯度和更新参数,直到满足某个条件为止(比如误差足够小、迭代次数足够多时)。这个过程涉及到代价函数、规则化(Regularization)、学习速率(learning rate)、梯度计算等。
下面写了一个超级简单的实例,训练和测试数据是mnist手写识别数据集:
from sklearnneural_network import MLPClassifier
import gzip
import pickle
with gzipopen('/mnistpklgz') as f_gz:
train_data,valid_data,test_data = pickleload(f_gz)
clf = MLPClassifier(solver='sgd',activation = 'identity',max_iter = 10,alpha = 1e-5,hidden_layer_sizes = (100,50),random_state = 1,verbose = True)
clffit(train_data[0][:10000],train_data[1][:10000])
print clfpredict(test_data[0][:10])
print(clfscore(test_data[0][:100],test_data[1][:100]))
print(clfpredict_proba(test_data[0][:10]))
参数说明:
参数说明:
1 hidden_layer_sizes :例如hidden_layer_sizes=(50, 50),表示有两层隐藏层,第一层隐藏层有50个神经元,第二层也有50个神经元。
2 activation :激活函数,{‘identity’, ‘logistic’, ‘tanh’, ‘relu’}, 默认relu
- identity:f(x) = x
- logistic:其实就是sigmod,f(x) = 1 / (1 + exp(-x))
- tanh:f(x) = tanh(x)
- relu:f(x) = max(0, x)
3 solver: {‘lbfgs’, ‘sgd’, ‘adam’}, 默认adam,用来优化权重
- lbfgs:quasi-Newton方法的优化器
- sgd:随机梯度下降
- adam: Kingma, Diederik, and Jimmy Ba提出的机遇随机梯度的优化器
注意:默认solver ‘adam’在相对较大的数据集上效果比较好(几千个样本或者更多),对小数据集来说,lbfgs收敛更快效果也更好。
4 alpha :float,可选的,默认00001,正则化项参数
5 batch_size : int , 可选的,默认’auto’,随机优化的minibatches的大小batch_size=min(200,n_samples),如果solver是’lbfgs’,分类器将不使用minibatch
6 learning_rate :学习率,用于权重更新,只有当solver为’sgd’时使用,{‘constant’,’invscaling’, ‘adaptive’},默认constant
- ‘constant’: 有’learning_rate_init’给定的恒定学习率
- ‘incscaling’:随着时间t使用’power_t’的逆标度指数不断降低学习率learning_rate_ ,effective_learning_rate = learning_rate_init / pow(t, power_t)
- ‘adaptive’:只要训练损耗在下降,就保持学习率为’learning_rate_init’不变,当连续两次不能降低训练损耗或验证分数停止升高至少tol时,将当前学习率除以5
7 power_t: double, 可选, default 05,只有solver=’sgd’时使用,是逆扩展学习率的指数当learning_rate=’invscaling’,用来更新有效学习率。
8 max_iter: int,可选,默认200,最大迭代次数。
9 random_state:int 或RandomState,可选,默认None,随机数生成器的状态或种子。
10 shuffle: bool,可选,默认True,只有当solver=’sgd’或者‘adam’时使用,判断是否在每次迭代时对样本进行清洗。
11 tol:float, 可选,默认1e-4,优化的容忍度
12 learning_rate_int:double,可选,默认0001,初始学习率,控制更新权重的补偿,只有当solver=’sgd’ 或’adam’时使用。
14 verbose : bool, 可选, 默认False,是否将过程打印到stdout
15 warm_start : bool, 可选, 默认False,当设置成True,使用之前的解决方法作为初始拟合,否则释放之前的解决方法。
16 momentum : float, 默认 09,动量梯度下降更新,设置的范围应该00-10 只有solver=’sgd’时使用
17 nesterovs_momentum : boolean, 默认True, Whether to use Nesterov’s momentum 只有solver=’sgd’并且momentum > 0使用
18 early_stopping : bool, 默认False,只有solver=’sgd’或者’adam’时有效,判断当验证效果不再改善的时候是否终止训练,当为True时,自动选出10%的训练数据用于验证并在两步连续迭代改善,低于tol时终止训练。
19 validation_fraction : float, 可选, 默认 01,用作早期停止验证的预留训练数据集的比例,早0-1之间,只当early_stopping=True有用
20 beta_1 : float, 可选, 默认09,只有solver=’adam’时使用,估计一阶矩向量的指数衰减速率,[0,1)之间
21 beta_2 : float, 可选, 默认0999,只有solver=’adam’时使用估计二阶矩向量的指数衰减速率[0,1)之间
22 epsilon : float, 可选, 默认1e-8,只有solver=’adam’时使用数值稳定值。
属性说明:
- classes_:每个输出的类标签
- loss_:损失函数计算出来的当前损失值
- coefs_:列表中的第i个元素表示i层的权重矩阵
- intercepts_:列表中第i个元素代表i+1层的偏差向量
- n_iter_ :迭代次数
- n_layers_:层数
- n_outputs_:输出的个数
- out_activation_:输出激活函数的名称。
方法说明:
- fit(X,y):拟合
- get_params([deep]):获取参数
- predict(X):使用MLP进行预测
- predic_log_proba(X):返回对数概率估计
- predic_proba(X):概率估计
- score(X,y[,sample_weight]):返回给定测试数据和标签上的平均准确度
-set_params(params):设置参数。
11 维度
对于数组和series来说,维度就是shape返回的结果,shape中返回几个数字就是几维。对图像来说,维度就是图像中特征向量的数量。降维算法中的”降维“,指的是降低特征矩阵中特征的数量。
12 sklearn中的降维算法
sklearn中的降维算法在模块decomposition中,这个模块的本质是一个矩阵分解模块。矩阵分解可以用在降维,深度学习,聚类分析,数据预处理,低纬度特征学习,推荐系统,大数据分析等领域。 SVD和主成分分析PCA都是通过分解特征矩阵来进行降维的 。
13 PCA
在降维的过程中,将会减少特征的数量,这意味着删除部分数据,数据量变少则表示模型可获取的信息变少了,模型的表现可能会因此受到影响。同时,在高维数据中,必然也有一些特征是不带有效信息的(噪音),或是有一些特征带有的信息和其他一些特征是重复的(一些特征之间可能会线性相关)。我们希望在降维的过程中,既能减少特征的数量又保留大部分有效信息,那就将带有重复信息的特征合并,并删除那些带有无效信息的特征,创建出一个能携带大部分信息,特征更少的特征矩阵。
在降维中,PCA使用的信息量衡量指标是样本方差,又称可解释性方差,方差越大,特征携带的信息量越多。
var代表一个特征的方差,n代表样本量,xi代表一个特征中每个样本的取值,xhat代表这一列样本的均值。
14 降维的实现
步骤3中,我们用来找出n个新特征向量,让数据能够被压缩到少数特征上并且中信息量不损失太多的技术就是矩阵分解,PCA与SVD是两种不同的降维算法,但是都遵从上面的过程来降维,只是两种算法的矩阵分解的方法不同,信息量的衡量指标不同。PCA使用方差作为信息量的衡量指标,并且使用特征值分解来找出空间V。降维时,它会产生协方差矩阵 将特征矩阵分解为以下三个矩阵,其中Q和 是辅助的矩阵, 是一个对角矩阵(除对角线上有值,其他位置都是0的矩阵),其对角线上的元素就是方差,降维完成之后,PCA找到的每个新特征向量就叫做“主成分”,而被丢弃的特征向量被认为信息量很少,这些信息很可能就是噪音。
SVD使用奇异值分解来找出空间V,其中Σ也是一个对角矩阵,不过它对角线上的元素是奇异值,这也是SVD中用来衡量特征上的信息量的指标。U和V^{T}分别是左奇异矩阵和右奇异矩阵,也都是辅助矩阵。
在数学原理中,无论是PCA还是SVD都需要遍历所有的特征和样本来计算信息量指标,并且在矩阵分解的过程中,会产生比原来更大的矩阵,比如原数据的结构是(m,n),在矩阵分解中为了找出最佳新特征空间V,可能需要产生(n,n),(m,m)大小的矩阵,还需要产生协方差矩阵去计算更多的信息,因此,降维算法的计算量很大,运行比较缓慢。
PAC数据特征创造并不属于特征选择,特征选择只是从已经存在的特征中选取携带信息量最多的,选完之后特征依然具有可解释性,仍然能解释改特征在原数据集上的含义。而PCA是将已经存在的特征进行压缩,降维后的特征不是原特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征。在新的特征矩阵生成之前,我们无法得知PCA是建立在怎么样的新特征向量上,所以新特征矩阵生成之后不再具有可读性,我们无法判断新特征矩阵的特征是从原数据中的什么特征组合而来,新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义了。PCA一般不适用于探索特征和标签之间的关系的模型(如线性回归),因为无法解释的新特征和标签之间的关系不具有意义。
15 sklearndecompositionPCA
class sklearndecompositionPCA (n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=00,iterated_power=’auto’, random_state=None)
n_components就是降维后需要保留的特征数量,即降维流程中第二步里面需要确认的k值,一般输入[0,min(Xshape)]范围中的整数,k的值会影响到模型的表现,如果k值太大,留下的特征太多,达不到降维的效果,如果k值太小,留下的特征太少,那新特征向量可能无法容纳原始数据集中的大部分信息。n_components取值如何选呢?
a 选择最好的n_components:累积可解释方差贡献率曲线。
当参数n_components中不填写任何值,则默认返回min(Xshape)个特征,一般来说,样本量都会大于特征数目,所以什么都不填就相当于转换了新特征空间,但没有减少特征的个数。一般来说,不会使用这种输入方式。但我们却可以使用这种输入方式来画出累计可解释方差贡献率曲线,以此选择最好的n_components的整数取值。累计可解释方差贡献率曲线是一天以降维后保留的特征个数为横坐标,降维后新特征捕捉到的可解释方差贡献率为纵坐标的曲线,能帮助我们决定n_components的最好取值
b最大似然估计自选超参数
PCA用最大似然估计(maximum likelihoodestimation)自选超参数的方法,输入“mle”作为n_components的参数输入,就可以调用这种方法。
c按信息量占比选超参数
输入[0,1]之间的浮点数,并且让参数svd_solver =='full',表示希望降维后的总解释性方差占比大于n_components指定的百分比,即是说,希望保留百分之多少的信息量。比如说,如果我们希望保留97%的信息量,就可以输入n_components = 097,PCA会自动选出能够让保留的信息量超过97%的特征数量
svd_solver是奇异值分解器的意思,PCA中为什么会有关奇异值分解的参数呢?SVD有一个惊人的数学性质,它能跳过数学神秘宇宙,不计算协方差矩阵,直接找出一个新特征向量组成的n维空间,而这个n维空间就是奇异值分解后的右矩阵 (就是降维过程中所说的生成新特征向量组成的空间V,并非巧合,而特指奇异值分解中的矩阵 )
右奇异矩阵 有着如下性质:
k就是n_compoents,是我们降维后希望得到的维度。若X为(m,n)的特征矩阵, 就是结构为(n,n)的矩阵,取这个矩阵的前k行(进行切片),即将V转化为结构是(k,n)的矩阵。而 与原矩阵X相乘,即可得到降维后的特征矩阵X_dr, 这是说,奇异值分解可以不计算协方差矩阵等等结构复杂计算冗长的矩阵,就直接求出新特征空间和降维后的特征矩阵。
简而言之,SVD在矩阵分解中的过程比PCA简单快速,但是遗憾的是,SVD的信息量衡量指标比较复杂,要理解”奇异值“远不如理解”方差“来得容易,因此,sklearn将降维流程拆分为了两部分,一部分是计算特征空间的V,由奇异值分解完成,另一部分是映射数据和求解新特征矩阵,由主成分分析完成,实现了用SVD的性质减少计算量,却让信息量的评估指标是方差,具体的流程如下图:
16 重要参数 svd_solver与random_state
参数svd_solver是在降维过程中,用来控制矩阵分解的一些细节的参数。有四种模式可选:"auto", "full", "arpack","randomized",默认”auto"。
1'auto':基于Xshape和n_compoents的默认策略来选择分解器,如果输入数据的尺寸大于500X500且要提取的特征小于数据最小维度的min(Xshape)的80%,就用效果更高的‘randomized’方法,否则就精确完整的SVD将被计算,截断将会在矩阵被分解完成后有选择的发生。
2‘full’:从scipylinalgsvd中调用标准的LAPACK分解器来生成精确完整的SVD,适合数据量比较适中,计算时间充足的情况,生成的精确完整的SVD的结构为:
3‘arpack’:从scipysparselinalgsvds调用ARPACK分解器来运行截断奇异值分解(SVD truncated),分解时就将特征数量降到n_components中输入的数值k,可以加快运算速度,适合特征矩阵很大的时候,但一般用于特征矩阵为稀疏矩阵的情况,此过程包含一定的随机性。截断后的SVD分解出的结构为:
4‘randomized’:通过Halko等人的随机方法进行随机SVD。在"full"方法中,分解器会根据原始数据和输入的n_components值去计算和寻找符合需求的新特征向量,但是在"randomized"方法中,分解器会先生成多个随机向量,然后一一去检测这些随机向量中是否有任何一个符合我们的分解需求,如果符合,就保留这个随机向量,并基于这个随机向量来构建后续的向量空间。这个方法已经被Halko等人证明,比"full"模式下计算快很多,并且还能够保证模型运行效果。适合特征矩阵巨大,计算量庞大的情况。
而参数random_state在参数svd_solver的值为"arpack" or "randomized"的时候生效,可以控制这两种SVD模式中的随机模式。通常我们就选用”auto“,不必对这个参数纠结太多。
自己在hsi_svm3dpy中实现过scikit-learn svm库用于高光谱图像分类任务
参数小结1
C:C-SVC的惩罚参数C默认值是10
C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
0 – 线性:u'v
1 – 多项式:(gamma u' v + coef0)^degree
2 – RBF函数:exp(-gamma|u-v|^2)
3 –sigmoid:tanh(gamma u' v + coef0)
degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
probability :是否采用概率估计?默认为False
shrinking :是否采用shrinking heuristic方法,默认为true
tol :停止训练的误差值大小,默认为1e-3
cache_size :核函数cache缓存大小,默认为200
class_weight :类别的权重,字典形式传递。设置第几类的参数C为weightC(C-SVC中的C)
verbose :允许冗余输出?
max_iter :最大迭代次数。-1为无限制。
decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3
random_state :数据洗牌时的种子值,int值
主要调节的参数有:C、kernel、degree、gamma、coef0。
参数小结2
参数选择:
1、使用sklearn 中的gridsearchcv方法,通过列出参数空间,让程序自己去遍历每一种超参数组合,找到最优的一组。
在svm中使用过,确实不错,但其对于无法满足的超参数(比如Nusvm中的nu)没有解决方案,会直接崩。
参见笔记 网格追踪寻找最优超参数组合Parameter estimation using grid search with cross-validation
2、注意类别不平衡的情况下使用 class_weight='balanced'
使用技巧:
1、数据预处理和一些函数的详细说明在 API 参考手册 >
pipeline可以用于把多个estimators级联成一个estimator,这么 做的原因是考虑了数据处理过程中一系列前后相继的固定流程,比如feature selection->normalization->classification
pipeline提供了两种服务:
Convenience:只需要调用一次fit和predict就可以在数据集上训练一组estimators
Joint parameter selection可以把grid search 用在pipeline中所有的estimators参数的参数组合上面
如果最后一个estimator是个分类器,则整个pipeline就可以作为分类器使用,如果最后一个estimator是个聚类器,则整个pipeline就可以作为聚类器使用。
在pipeline中estimator的参数通过使用<estimator>__<parameter>语法来获取
既然有参数的存在,就可以使用网格搜索方法来调节参数
单个阶段(step)可以用参数替换,而且非最后阶段还可以将其设置为None来忽略:
函数make_pipeline是一个构造pipeline的简短工具,他接受可变数量的estimators并返回一个pipeline,每个estimator的名称自动填充。
二、FeatureUnion 的用法
与pipeline类似,feature union也有一种比较简单的构造方法:make_union,不需要显示的给每个estimator指定名称。
Featu热Union设置参数
另外一篇讲pipleline不错的文章: >
以上就是关于sklearn 神经网络 MLPClassifier简单应用与参数说明全部的内容,包括:sklearn 神经网络 MLPClassifier简单应用与参数说明、sklearn的PCA、scikit-learn svm库使用小结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)