Python数据科学:神经网络

图片


(Artificial Neural Network,ANN)人工神经网络模型,以数学和物理的方法对人脑神经网络进行简化、抽象和模拟。算法


本次只是一个简单的神经网络入门,涉及神经元模型和BP神经网络。网络


这里简单了解一下机器学习的三要素,分别是模型、策略与算法。dom


模型包括非随机效应部分(被解释变量和解释变量之间的关系,多为函数关系)和随机效应部分(扰动项)。机器学习


策略是指如何设定最优化的目标函数,常见的目标函数有线性回归的残差平方和、逻辑回归的似然函数、SVM中的合页函数等。ide


算法是对目标函数求参的方法,好比经过求导的方法计算,或者使用数值计算领域的算法求解。函数


其中神经网络就是采用数值算法求解参数,这就意味着每次计算获得的模型参数都会是不一样的。学习



/ 01 / 神经网络测试


01 神经元模型优化


神经网络中最基本的成分是神经元模型。spa


每一个神经元都是一个多输入单输出的信息处理单元,输入信号经过带权重的链接传递,和阈值对比后获得总输入值,再经过激活函数的处理产生单个输出


神经元的输出,是对激活函数套用输入加权和的结果。


神经元的激活函数使得神经元具备不一样的信息处理特性,反映了神经元输出与其激活状态之间的关系。


本次涉及到的激活函数有阈值函数(阶跃函数)、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多个用户数据。


image.png


使用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)


神经网络须要对数据进行极值标准化


须要对连续变量进行极值标准化,分类变量须要转变为虚拟变量。


其中多分类名义变量必须转变为虚拟变量,而等级变量和二分类变量则能够选择不转变,当作连续变量处理便可。


本次数据中,教育等级和套餐类型是等级变量,性别等变量为二分类变量,这些均可以做为连续变量进行处理。


这也就意味着本次的数据集中不存在多分类名义变量,均可做为连续变量进行处理。


 
 

# 极值标准化处理
scaler = MinMaxScaler()
scaler.fit(train_data)

scaled_train_data = scaler.transform(train_data)
scaler_test_data = scaler.transform(test_data)


创建多层感知器模型。


 
 

# 设置多层感知器对应的模型
mlp = MLPClassifier(hidden_layer_sizes=(10,), activation='logistic', alpha=0.1, max_iter=1000)
# 对训练集进行模型训练
mlp.fit(scaled_train_data, train_target)
# 输出神经网络模型信息
print(mlp)


输出模型信息以下。


image.png


接下来使用通过训练集训练的模型,对训练集及测试集进行预测。


 
 

# 使用模型进行预测
train_predict = mlp.predict(scaled_train_data)
test_predict = mlp.predict(scaler_test_data)


输出预测几率,用户流失的几率。


 
 

# 输出模型预测几率(为1的状况)
train_proba = mlp.predict_proba(scaled_train_data)[:, 1]
test_proba = mlp.predict_proba(scaler_test_data)[:, 1]


对模型进行评估,输出评估数据。


 
 

# 根据预测信息输出模型评估结果
print(metrics.confusion_matrix(test_target, test_predict, labels=[01]))
print(metrics.classification_report(test_target, test_predict))


输出以下。


image.png


模型对流失用户的f1-score(精确率和召回率的调和平均数)值为0.81,效果不错。


此外对流失用户的灵敏度recall为0.83,模型能识别出83%的流失用户,说明模型识别流失用户的能力还能够。


输出模型预测的平均准确度。


 
 

# 使用指定数据集输出模型预测的平均准确度
print(mlp.score(scaler_test_data, test_target))
# 输出值为0.8282828282828283


平均准确度值为0.8282。


计算模型的ROC下面积。


 
 

# 绘制ROC曲线
fpr_test, tpr_test, th_test = metrics.roc_curve(test_target, test_proba)
fpr_train, tpr_train, th_train = metrics.roc_curve(train_target, train_proba)
plt.figure(figsize=[33])
plt.plot(fpr_test, tpr_test, 'b--')
plt.plot(fpr_train, tpr_train, 'r-')
plt.title('ROC curve')
plt.show()

# 计算AUC值
print(metrics.roc_auc_score(test_target, test_proba))
# 输出值为0.9149632415075206


ROC曲线图以下。


image.png


训练集和测试集的曲线很接近,没有过拟合现象。


AUC值为0.9149,说明模型效果很是好。


对模型进行最优参数搜索,而且对最优参数下的模型进行训练。


 
 

# 使用GridSearchCV进行最优参数搜索
param_grid = {
    # 模型隐层数量
    'hidden_layer_sizes': [(10, ), (15, ), (20, ), (55)],
    # 激活函数
    'activation': ['logistic''tanh''relu'],
    # 正则化系数
    'alpha': [0.0010.010.10.20.4110]
}

mlp = MLPClassifier(max_iter=1000)
# 选择roc_auc做为评判标准,4折交叉验证,n_jobs=-1使用多核CPU的所有线程
gcv = GridSearchCV(estimator=mlp, param_grid=param_grid,
                   scoring='roc_auc', cv=4, n_jobs=-1)
gcv.fit(scaled_train_data, train_target)


输出最优参数的模型的状况。


 
 

# 输出最优参数下模型的得分
print(gcv.best_score_)
# 输出值为0.9258018987136855

# 输出最优参数下模型的参数
print(gcv.best_params_)
# 输出参数值为{'alpha': 0.01, 'activation': 'tanh', 'hidden_layer_sizes': (5, 5)}

# 使用指定数据集输出最优模型预测的平均准确度
print(gcv.score(scaler_test_data, test_target))
# 输出值为0.9169384823390232


模型的roc_auc最高得分为0.92,即该模型下的ROC曲线下面积为0.92。


较以前的0.9149,提升了一点点。


模型的最优参数,激活函数为relu类型,alpha为0.01,隐藏层节点数为15个。


模型的预测平均准确率为0.9169,较以前的0.8282,提升了很多。


相关资料获取,请点击阅读原文。





···  END  ···


image.png

相关文章
相关标签/搜索