(ArtificialNeuralNetwork,ANN)人工神经网络模型,用数学和物理的方法对人脑神经网络进行简化、抽象和模拟。这次只是对神经网络的简单介绍,涉及到神经元模型和BP神经网络。这里简单介绍一下机器学习的三要素,即模型、策略和算法。该模型包括非随机效应部分(被解释变量与被解释变量之间的关系,多为函数关系)和随机效应部分(干扰项)。策略是指如何设定最优的目标函数。常见的目标函数有线性回归的残差平方和、逻辑回归的似然函数、SVM中的铰链函数等。算法是一种寻找目标函数参数的方法,例如通过推导进行计算,或者使用数值计算领域的算法来求解。其中,神经网络采用数值算法求解参数,这意味着每次计算得到的模型参数都会不同。1.神经网络01神经元模型神经网络最基本的组成部分就是神经元模型。每个神经元都是一个多输入单输出的信息处理单元。输入信号通过加权连接传递,与阈值比较得到总输入值,然后通过激活函数处理产生单个输出。神经元的输出是将输入加权和应用于激活函数的结果。神经元的激活函数使神经元具有不同的信息处理特性,反映了神经元输出与其激活状态之间的关系。本次涉及的激活函数包括阈值函数(阶跃函数)和sigmoid函数(S型函数)。02单层感知器感知器是具有单层计算单元的神经网络,只能用于解决线性可分的二元分类问题。它不能应用于多层感知器,无法确定隐藏层的期望输出。它的结构类似于之前的神经元模型。激活函数使用单极(或双极)阈值函数。03BP神经网络通过误差反向传播算法(监督学习算法)训练的多层神经网络称为BP神经网络。它属于多层前馈神经网络,模型的学习过程包括两个过程:信号的前向传播和误差的反向传播。进行前向传播时,信号从输入层开始计算每一层的加权和,最后通过各个隐藏层到达输出层得到输出结果,将输出结果与期望结果(监督信号)进行比较,以及得到输出错误。误差反向传播是将误差按照梯度下降算法沿隐含层逐层传播到输入层,并将误差分布到每一层的所有单元,从而得到各单元的误差信号(学习信号),并相应地修改每个单元。单位重量。这两个信号传播过程不断循环更新权值,最后根据判断条件判断是否结束循环。其网络结构一般为单隐层网络,包括输入层、隐层和输出层。激活函数大多使用sigmoid函数或者线性函数,这里隐藏层和输出层都使用sigmoid函数。2.Python实现神经网络。有了明确的训练样本后,网络的输入层节点数(解释变量数)和输出层节点数(解释变量数)就已经确定了。需要考虑的是隐藏层的个数和每个隐藏层的节点个数。下面我们就用书中的数据来进行一波实战,一段移动离网的数据。对于移动通信用户消费特征数据,目标字段为是否流失,有两个分类级别(是或否)。自变量包括用户的基本信息、消费的产品信息和用户的消费特征。读取数据。importpandasaspdfromsklearnimportmetricsimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportMinMaxScalerfromsklearn.neural_networkimportMLPClassifierfromsklearn.model_selectionimportGridSearchCVfromsklearn.model_selectionimporttrain_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)神经网络需要对数据的极值进行标准化。连续变量需要对极值进行标准化处理,分类变量需要转化为虚拟变量。其中,多类别名义变量必须转化为虚拟变量,而等级变量和二元变量可以选择不转化,可以作为连续变量处理。在这个数据中,教育程度和包裹类型是年级变量,性别和其他变量是二分变量,这些可以作为连续变量处理。这意味着这个数据集中没有多类别的名义变量,它们都可以被视为连续变量。#极值归一化处理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)输出模型信息如下。接下来,使用在训练集上训练好的模型对训练集和测试集进行预测。#使用模型预测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=[0,1]))print(metrics.classification_report(test_target,test_predict))输出如下。丢失用户模型的f1分数(精确率和召回率的调和平均值)为0.81,这是一个不错的结果。另外,流失用户的SensitivityRecall为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=[3,3])plt.plot(fpr_test,tpr_test,'b--')plt.plot(fpr_train,tpr_train,'r-')plt.title('ROCcurve')plt.show()#计算AUC值print(metrics.roc_auc_score(test_target,test_proba))#输出值为0.9149632415075206ROC曲线如下。训练集和测试集的曲线非常接近,没有出现过拟合现象。AUC值为0.9149,说明模型运行良好。对模型进行最优参数搜索,训练最优参数下的模型。#使用GridSearchCV进行***参数搜索param_grid={#模型隐藏层数'hidden_??layer_sizes':[(10,),(15,),(20,),(5,5)],#激活函数'activation':['logistic','tanh','relu'],#正则化系数'alpha':[0.001,0.01,0.1,0.2,0.4,1,10]}mlp=MLPClassifier(max_iter=1000)#Selectroc_aucAs一个准则,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)输出***参数的模型。#输出***参数下模型的score(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.9169384823390232roc_auc***得分为0.92,即该模型下ROC曲线下面积为0.92。与之前的0.9149相比,略有改善。模型的最大参数,激活函数为relu类型,alpha为0.01,隐藏层节点数为15。模型的平均预测精度为0.9169,远高于之前的0.8282。
