【机器学习】基于sklearn-MLP多层感知机实例

在之前的【【深度学习】DNN神经网络模型】一文中弄清楚MLP基础由来,本次进一步基于sklearn机器学习库来实现该过程。

首先看一下简单的MLP实例:

#首先,我们建议一个简单的二分分类数据集表示XOR,然后用交叉检验分割成训练集和测试集
from sklearn.cross_validation import train_test_split
from sklearn.neural_network import MLPClassifier
import numpy as np
y = [0, 1, 1, 0] * 1000
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]] * 1000)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=3)

'''
然后,我们将MLPClassifier类实例化。用n_hidden设置神经网络架构中隐藏层的层数。我们将隐藏层的层数设置为两层。MLPClassifier类自动创建两个输入单元和一个输出单元。在多元分类问题中分类器会为每一个可能的类型创建一个输出。

选择神经网络架构是很复杂的事情。确定隐藏单元和隐藏层的数量有一些首要原则,但是都没有必然的依据。隐藏单元的数量由样本数量,训练数据的噪声,要被近似的函数复杂性,隐藏单元的激励函数,学习算法和使用的正则化方法决定。实际上,架构的效果只能通过交叉检验得出。
'''
clf = MLPClassifier(hidden_layer_sizes=[1],activation='logistic',solver ='sgd',random_state=3)
#我们通过fit()函数训练模型
clf.fit(X_train, y_train)
#打印估计模型对测试集预测的准确率和一些手工输入的预测结果。预测测试集的结果表明,这个人工神经网络可以完美的近似XOR函数
print('层数:%s,输出单元数量:%s' % (clf.n_layers_, clf.n_outputs_))
predictions = clf.predict(X_test)
print('准确率:%s' % clf.score(X_test, y_test))
for i, p in enumerate(predictions[:10]):
    print('真实值:%s,预测值:%s' % (y_test[i], p))

'''
层数:3,输出单元数量:1
准确率:0.49
真实值:1,预测值:0
真实值:1,预测值:0
真实值:1,预测值:0
真实值:0,预测值:0
真实值:1,预测值:0
真实值:0,预测值:0
真实值:0,预测值:0
真实值:1,预测值:0
真实值:0,预测值:0
真实值:1,预测值:0
'''

下面同样基于手写MNIST数据集来进行MLP实例:

from sklearn.datasets import load_digits
from sklearn.cross_validation import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier

digits = load_digits()
X = digits.data
y = digits.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=3)
cls = MLPClassifier(activation='relu', alpha=1e-05, batch_size='auto', beta_1=0.9,
       beta_2=0.999, early_stopping=False, epsilon=1e-08,
       hidden_layer_sizes=(100, 100), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
       solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False,
       warm_start=False)
print('准确率: %s' % cross_val_score(cls, X, y, cv=5).mean())
#准确率: 0.922184645669

MLP参数众多,以下一一说明:

hidden_layer_sizes :元祖格式,长度=n_layers-2, 默认(100,),第i个元素表示第i个隐藏层的神经元的个数,如(100,100)表示两层,每层100个神经元。

activation :{‘identity’, ‘logistic’, ‘tanh’, ‘relu’}, 默认‘relu
- ‘identity’: no-op activation, useful to implement linear bottleneck,
返回f(x) = x
- ‘logistic’:the logistic sigmoid function, returns f(x) = 1 / (1 + exp(-x)).
- ‘tanh’:the hyperbolic tan function, returns f(x) = tanh(x).
- ‘relu’:the rectified linear unit function, returns f(x) = max(0, x)

solver: {‘lbfgs’, ‘sgd’, ‘adam’}, 默认 ‘adam’,用来优化权重
- lbfgs:quasi-Newton方法的优化器
- sgd:随机梯度下降
- adam: Kingma, Diederik, and Jimmy Ba提出的机遇随机梯度的优化器
注意:默认solver ‘adam’在相对较大的数据集上效果比较好(几千个样本或者更多),对小数据集来说,lbfgs收敛更快效果也更好。

alpha :float,可选的,默认0.0001,正则化项参数

batch_size : int , 可选的,默认‘auto’,随机优化的minibatches的大小,如果solver是‘lbfgs’,分类器将不使用minibatch,当设置成‘auto’,batch_size=min(200,n_samples)

learning_rate :{‘constant’,‘invscaling’, ‘adaptive’},默认‘constant’,用于权重更新,只有当solver为’sgd‘时使用
- ‘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.

max_iter: int,可选,默认200,最大迭代次数。

random_state:int 或RandomState,可选,默认None,随机数生成器的状态或种子。

shuffle: bool,可选,默认True,只有当solver=’sgd’或者‘adam’时使用,判断是否在每次迭代时对样本进行清洗。

tol:float, 可选,默认1e-4,优化的容忍度

learning_rate_int:double,可选,默认0.001,初始学习率,控制更新权重的补偿,只有当solver=’sgd’ 或’adam’时使用。

power_t: double, optional, default 0.5,只有solver=’sgd’时使用,是逆扩展学习率的指数.当learning_rate=’invscaling’,用来更新有效学习率。

verbose : bool, optional, default False,是否将过程打印到stdout

warm_start : bool, optional, default False,当设置成True,使用之前的解决方法作为初始拟合,否则释放之前的解决方法。

momentum : float, default 0.9,Momentum(动量) for gradient descent update. Should be between 0 and 1. Only used when solver=’sgd’.

nesterovs_momentum : boolean, default True, Whether to use Nesterov’s momentum. Only used when solver=’sgd’ and momentum > 0.

early_stopping : bool, default False,Only effective when solver=’sgd’ or ‘adam’,判断当验证效果不再改善的时候是否终止训练,当为True时,自动选出10%的训练数据用于验证并在两步连续爹迭代改善低于tol时终止训练。

validation_fraction : float, optional, default 0.1,用作早期停止验证的预留训练数据集的比例,早0-1之间,只当early_stopping=True有用

beta_1 : float, optional, default 0.9,Only used when solver=’adam’,估计一阶矩向量的指数衰减速率,[0,1)之间

beta_2 : float, optional, default 0.999,Only used when solver=’adam’估计二阶矩向量的指数衰减速率[0,1)之间

epsilon : float, optional, default 1e-8,Only used when 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):设置参数。
  • 14
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值