Python机器学习之神经网络MLP

引言

MLP算法,也叫前馈神经网络或多层感知器。关于MLP网上有很多,可以参考,比如《神经网络基础-多层感知器(MLP)》

神经网络的参数设置

以MLP分类器为例,使用红酒数据集。

klearn.neural_network.MLPClassifier MLP分类器

函数原型:MLPClassifier( hidden_layer_sizes=(100,), activation="relu", solver='adam',
alpha=0.0001, batch_size='auto', learning_rate="constant", learning_rate_init=0.001, power_t=0.5, max_iter=200, shuffle=True,
random_state=None, tol=1e-4, verbose=False, warm_start=False, momentum=0.9,
nesterovs_momentum=True, early_stopping=False, validation_fraction=0.1,
beta_1=0.9, beta_2=0.999, epsilon=1e-8)

参数解释
hidden_layer_sizes: 例如hidden_layer_sizes=(50, 50),表示有两层隐藏层,第一层隐藏层有50个神经元,第二层也有50个神经元
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)
    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的大小batch_size=min(200,n_samples),如果solver是’lbfgs’,分类器将不使用minibatch
    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.
    power_t: double, 可选, default 0.5,只有solver=’sgd’时使用,是逆扩展学习率的指数.当learning_rate=’invscaling’,用来更新有效学习率。
    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’时使用。
    verbose:bool, 可选, 默认False,是否将过程打印到stdout
    warm_start : bool, 可选, 默认False,当设置成True,使用之前的解决方法作为初始拟合,否则释放之前的解决方法。
    momentum:float, 默认 0.9,动量梯度下降更新,设置的范围应该0.0-1.0. 只有solver=’sgd’时使用.
    nesterovs_momentum: boolean, 默认True, Whether to use Nesterov’s momentum. 只有solver=’sgd’并且momentum > 0使用.
    early_stopping : bool, 默认False,只有solver=’sgd’或者’adam’时有效,判断当验证效果不再改善的时候是否终止训练,当为True时,自动选出10%的训练数据用于验证并在两步连续迭代改善,低于tol时终止训练。
    validation_fraction:float, 可选, 默认 0.1,用作早期停止验证的预留训练数据集的比例,早0-1之间,只当early_stopping=True有用
    beta_1:float, 可选, 默认0.9,只有solver=’adam’时使用,估计一阶矩向量的指数衰减速率,[0,1)之间
    beta_2: float, 可选, 默认0.999,只有solver=’adam’时使用估计二阶矩向量的指数衰减速率[0,1)之间
    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):设置参数。
    参考:《sklearn 神经网络 MLPClassifier简单应用与参数说明》
#神经网络参数设置
from sklearn.datasets import load_wine
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.neural_network import MLPClassifier #导入MLP神经网络
from sklearn.model_selection import train_test_split #切分训练集和测试集

#载入红酒数据
wine = load_wine()

#只选取前两个特征
X = wine.data[:, :2]
y = wine.target

#拆分训练集和数据集
X_train, X_test, y_train, y_test = train_test_split(X, y)

models = (MLPClassifier(solver='lbfgs'),
          MLPClassifier(solver='lbfgs', hidden_layer_sizes=[10]),
          MLPClassifier(solver='lbfgs', hidden_layer_sizes=[10, 10]),
          MLPClassifier(solver='lbfgs', hidden_layer_sizes=[10, 10], activation='tanh'),
          MLPClassifier(solver='lbfgs', hidden_layer_sizes=[10, 10], activation='tanh', alpha=1))
models = (clf.fit(X_train, y_train) for clf in models)

#设置图题
titles = ('MLPClassifier:solver=lbfgs,nodes=100',
          'MLPClassifier:solver=lbfgs,nodes=10',
          'MLPClassifier:2layers',
          'MLPClassifier:2layers with tanh',
          'MLPClassifier:alpha=1')

#使用不同的色块表示不同分类
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
x_min, x_max = X_train[:, 0].min() - 1, X_train[:, 0].max() + 1
y_min, y_max = X_train[:, 1].min() - 1, X_train[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),
                     np.arange(y_min, y_max, .02))

#设定子图形的个数和排列方式
fig, sub = plt.subplots(2, 3, figsize = (10, 3))
plt.subplots_adjust(wspace=0.4, hspace=0.4) #wspace, hspace:子图之间的横向间距、纵向间距分别与子图平均宽度、平均高度的比值。

for clf, title, ax in zip(models, titles, sub.flatten()):
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    ax.pcolormesh(xx, yy, Z, cmap=cmap_light)
    # 将数据特征用散点图表示出来
    ax.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', s=60)
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xlabel('Feature 0')
    ax.set_ylabel('Feature 1')
    ax.set_title(title)
    ax.set_title(title)

plt.show()

分别采用以下参数设置进行结果对比:
1)100个节点的1个隐藏层;
2)10个节点的1个隐藏层;
3)10个节点的10个隐藏层;
4)10个节点的10个隐藏层,activation='tanh';
5)10个节点的10个隐藏层,activation='tanh',alpha=1;

对比结果如下图所示,可以看出增加模型复杂度的方法有4种:
1.调整神经网络每一个隐藏层上的节点数
2.调节神经网络隐藏层的层数
3.调节activation
4.调整alpha 值来改变模型正则化的程度

8.1MLP_wine.png

由于神经网络算法中,样本特征的权重是在模型开始学习之前,就已经随机生成了,而随机生成的权重会导致模型的形态也完全不一样。所以如果不指定radom_state的话,即使模型所有的参数都是一样的,生成的决定边界也不一样,不过。只要模型的复杂度不变,其预测结果的准确率不会受到什么影响。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335