Python数据科学:神经网络
(Artificial Neural Network,ANN)人工神经网络模型,以数学和物理的方法对人脑神经网络进行简化、抽象和模拟。
(Artificial Neural Network,ANN)人工神经网络模型,以数学和物理的方法对人脑神经网络进行简化、抽象和模拟。
本次只是一个简单的神经网络入门,涉及神经元模型和BP神经网络。
这里简单了解一下机器学习的三要素,分别是模型、策略与算法。
模型包括非随机效应部分(被解释变量和解释变量之间的关系,多为函数关系)和随机效应部分(扰动项)。
策略是指如何设定最优化的目标函数,常见的目标函数有线性回归的残差平方和、逻辑回归的似然函数、SVM中的合页函数等。
算法是对目标函数求参的方法,比如通过求导的方法计算,或者使用数值计算领域的算法求解。
其中神经网络就是采用数值算法求解参数,这就意味着每次计算得到的模型参数都会是不同的。
/ 01 / 神经网络
01 神经元模型
神经网络中最基本的成分是神经元模型。
每个神经元都是一个多输入单输出的信息处理单元,输入信号通过带权重的连接传递,和阈值对比后得到总输入值,再通过激活函数的处理产生单个输出。
神经元的输出,是对激活函数套用输入加权和的结果。
神经元的激活函数使得神经元具有不同的信息处理特性,反映了神经元输出与其激活状态之间的关系。
本次涉及到的激活函数有阈值函数(阶跃函数)、sigmoid函数(S型函数)。
02 单层感知器
感知器是一种具有单层计算单元的神经网络,只能用来解决线性可分的二分类问题。
无法运用到多层感知器中,无法确定隐藏层的期望输出。
它的结构类似之前的神经元模型。
激活函数采用单极性(或双极性)阈值函数。
03 BP神经网络
采用误差反向传播算法(有监督学习算法)训练的多层神经网络称为BP神经网络。
属于多层前馈型神经网络,模型的学习过程由信号的正向传播和误差反向传播两个过程组成。
进行正向传播时信号从输入层计算各层加权和,经由各隐层最终传递到输出层,得到输出结果,比较输出结果与期望结果(监督信号),得到输出误差。
误差反向传播是依照梯度下降算法将误差沿着隐藏层到输入层逐层反向传播,将误差分摊给各层的所有单元,从而得到各个单元的误差信号(学习信号),据此修改各单元权值。
这两个信号传播过程不断循环以更新权值,最终根据判定条件判断是否结束循环。
其网络结构普遍为单隐层网络,包括输入层、隐层、输出层。
激活函数多采用sigmoid函数或线性函数,这里隐层和输出层均采用sigmoid函数。
/ 02/ Python实现
神经网络在有明确的训练样本后,网络的输入层结点数(解释变量个数)和输出层结点数(被解释变量的个数)便已确定。
需要考虑的则是隐含层的个数和每个隐含层的结点个数。
下面利用书中的数据进行实战一波,一份移动离网数据。
移动通讯用户消费特征数据,目标字段为是否流失,具有两个分类水平(是与否)。
自变量包含了用户的基本信息、消费的产品信息以及用户的消费特征。
读取数据。
import pandas as pd
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
# 设置最大显示行数
pd.set_option('display.max_rows', 10)
# 设置最大显示列数
pd.set_option('display.max_columns', 10)
# 设置显示宽度为1000,这样就不会在IDE中换行了
pd.set_option('display.width', 1000)
# 读取数据,skipinitialspace:忽略分隔符后的空白
churn = pd.read_csv('telecom_churn.csv', skipinitialspace=True)
print(churn)
输出数据概况,包含3000多个用户数据。
使用scikit-learn中的函数将数据集划分为训练集和测试集。
# 选取自变量数据
data = churn.iloc[:, 2:]
# 选取因变量数据
target = churn['churn']
# 使用scikit-learn将数据集划分为训练集和测试集
train_data, test_data, train_target, test_target = train_test_split(data, target, test_size=0.4, train_size=0.6, random_state=1234)
神经网络需要对数据进行极值标准化。
需要对连续变量进行极值标准化,分类变量需要转变为虚拟变量。
其中多分类名义变量必须转变为虚拟变量,而等级变量和二分类变量则可以选择不转变,当做连续变量处理即可。
本次数据中,教育等级和套餐类型是等级变量,性别等变量为二分类变量,这些都可以作为连续变量进行处理。
这也就意味着本次的数据集中不存在多分类名义变量,都可作为连续变量进行处理。