以下内容笔记出自‘跟着迪哥学python数据分析与机器学习实战’,外加个人整理添加,仅供个人复习使用。
神经网络(neural_network)模块重要的有两个类,MLPClassifier(分类)和MLPRegressor(回归)。多层感知器(MLP)是一种监督学习算法,前馈神经网络模型。两类都适用参数alpha作为正则化(L2正则化)系数。
skalern中的神经网络,在数据规模较大时,不适用!
MLPClassifier的训练使用BP算法,使用交叉熵损失函数(Cross-Entropy loss function)
1. MLPClassifier类,多层感知机分类
1.1 花类别预测
from sklearn import neural_network
from sklearn.datasets import load_iris
import numpy as np
import sys
import warnings
warnings.filterwarnings('ignore')
iris=load_iris()
mlp=neural_network.MLPClassifier(hidden_layer_sizes=(10), #隐藏层
#(10,20)指的是隐藏层层数+每层单元数
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, #迭代次数
tol=1e-4)
mlp.fit(iris.data,iris.target)
print(mlp.predict([[1,2,3,4]])) #预测结果
print('类别数:\n',mlp.n_outputs_) #输出类别数
print('所有类别:\n',mlp.classes_) #所有类别
print('损失函数损失值:\n',mlp.loss_) #损失函数的损失值
print('偏移量:\n',mlp.intercepts_) #偏移量
print('权重:\n',mlp.coefs_)
print('迭代轮数:\n',mlp.n_iter_)
print('网络层次:\n',mlp.n_layers_) #只有一层隐藏层时 =3
print('输出层的激活函数名称:\n',mlp.out_activation_)
1.2 参数说明
- hidden_layer_size : 元组,同时指定隐藏层层数+每层单元数
- activation : 隐藏层激活函数,可选{'identity','logistic','tanh','relu'},对应f(x)=x / 1/(1+exp(-x)) / tanh(x) / max(0,x)
- slver=adam 参数的优化算法,{'lbfgs', 'sgd', 'adam'},分别对应{拟牛顿法,随机梯度下降,基于随机梯度下降的自适应}的具体实现算法
- alpha=0.0001:L2正则化参数
- batch_size='auto':对于随机优化器来说是可选的,批大小,设为auto时为min(200,n_SAMPLES)
- learning_rate="constant":参数更新时的学习率,只在solver='sgd'时有效,可选为{'constant', 'invscaling', 'adaptive'},分别对应{常数即=初始学习率,逐渐降低,自适应}
- learning_rate_init=0.001:初始学习率,只在solver='sgd' 或'adam'起作用
- power_t=0.5:影响learning_rate=" invscaling "时的学习率降低(有个计算公式effective_learning_rate = learning_rate_init / pow(t, power_t),t表示时间步)
- max_iter=200:最大迭代轮数
- tol=1e-4:损失值容忍阈值,小于该值时停止训练
神经网络根据在一轮神经网络的训练过程中所用到的训练样本数量不同,可分为:
- 标准BP算法:每次网络训练值针对单个训练样本,一次训练就输入一个训练样本,更新一次网络参数;
- 累计BP算法:每次网格训练只针对所有训练样本,一次将所有训练样本输入,更新一次网格输入;
参考链接:https://www.jianshu.com/p/72c427ec9c80
MLPClassifier通过应用Softmax作为输出函数来支持多分类softmax回归本质上是将原先常见的二元分类人物神经网络的输出层采用的sigmoid激活函数换成softmax回归。做指数化,再归一化。
若有k个类别,当某个训练样本为第i类时,其目标值应该是[0,0,…,1,…,0],只在向量的第i个位置标为1,其他位置都为0.
#用训练集预测数据(练习)
predictions=mlp.predict(iris.data)
from sklearn.metrics import classification_report,confusion_matrix
print(confusion_matrix(iris.target,predictions))
[[50 0 0]
[ 0 13 37]
[ 0 1 49]]
print(classification_report(iris.target,predictions))
2. MLPRegressor做连续值预测
本来输出的就是连续值,用来做分类要加上softmax层,这里只是去掉该层
from sklearn import neural_network
import matplotlib.pyplot as plt
import numpy as np
import sys
mlp=neural_network.MLPRegressor(hidden_layer_sizes=(10),
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,tol=1e-4)
x=np.arange(-3,3,0.1)
y=np.exp(x)
mlp.fit(np.asarray(x).reshape([-1,1]),y)