返回 导航

Python / AI

hangge.com

Python - 机器学习算法库Scikit-Leran使用详解9(神经网络分类算法)

作者:hangge | 2022-09-20 08:30

十、神经网络分类算法

1,基本介绍

(1)神经网络算法是目前最知名、应用最为广泛的机器学习算法,而深度学习的本质就是神经网络算法(深度学习是神经网络算法的一个分支)。

(2)神经网络算法是一种具有网络结构的算法模型,这决定了它具有非常好的延展性,通过调节神经网络中各个节点的权值参数使得分类效果明显提升。
提示:简单来说,如果一个层既不是输入层也不是输出层,那么就可以称其为隐藏层。一个神经网络可以只包含一个隐藏层,也可以有很多个隐藏层。

(3)传统的机器学习算法相比,要想训练一个优秀的神经网络模型,往往需要更多的数据,并且要耗费更多的计算机资源。神经网络的优缺点分别如下:
  • 优点:网络结构延展性好,能够拟合复杂的数据分布,比如非线性函数,通过调节权值参数来获取泛化能力较强的模型。
  • 缺点:最广为人知的缺点是“黑箱”性质,这意味着我们不知道神经网络如何以及为何会得出一定的输出。并且可解释性差,调参依赖于经验,可能会陷入局部最优解,或者梯度消失、梯度爆炸等问题。

(4)神经网络中最基本的成分是神经元,有更多神经元的神经网络可以表达更复杂的函数。然而这既是优势也是不足,优势是可以分类更复杂的数据,不足是可能造成对训练数据的过拟合。
过拟合说明:
  • 过拟合(Overfitting)是网络对数据中的噪声有很强的拟合能力,而没有重视数据间(假设)的潜在基本关系。
  • 反过来,如果数据不是足够复杂,似乎小一点的网络更好,可以防止过拟合。然而并非如此,防止神经网络的过拟合有很多方法(L2 正则化,dropout 和输入噪音等)。在实践中,使用这些方法来控制过拟合比减少网络神经元数目要好得多。

2,使用样例

(1)下面我们以 sklearn 库中自带的神经网络分类算法解决鸢尾花的分类问题。
(1)Python 机器学习 Sklearn 库提供了多层感知器算法(Multilayer Perceptron,即 MLP),也就是我们所说的神经网络算法,它被封装在 sklearn.neural_network 包中,该包提供了三个神经网络算法 API,分别是:
  • neural_network.BernoulliRBM:伯努利受限玻尔兹曼机算法,无监督学习算法;
  • neural_network.MLPClassifier:神经网络分类算法,用于解决分类问题;
  • neural_network.MLPRgression:神经网络回归算法,用于解决回归问题。
(2)本文样例使用的是 MLPClassifier 神经网络分类算法,它的参数如下:
  • hidden_layer_sizes:元组或列表参数,序列内元素的数量表示有多少个隐藏层,每个元素的数值表示该层有多少个神经元节点,比如 (10,10),表示两个隐藏层,每层10 个神经元节点。
  • activation:隐藏层激活函数,参数值有 identitylogistictanhrelu,默认为 'relu' 即线性整流函数(校正非线性)
  • solver:权重优化算法,lbfgssgdadam,其中 lbfg 鲁棒性较好,但在大型模型或者大型数据集上花费的调优时间会较长,adam 大多数效果都不错,但对数据的缩放相当敏感,sgd 则不常用
  • alphaL2 正则项参数,比如 alpha = 0.0001(弱正则化)
  • learning_rate:学习率,参数值 constantinvscalingadaptive
  • learning_rate_init:初始学习率,只有当 solversgdadam 时才使用。
  • max_iter:最大迭代次数
  • shuffle:是否在每次迭代时对样本进行清洗,当 solver 参数值为 sgdadam 时才使用该参数值
  • random_state:随机数种子
  • tol:优化算法中止的条件,当迭代先后的函数差值小于等于 tol 时就中止
#导入 sklearn 提供的鸢尾花数据
from sklearn.datasets import load_iris
#导入 skleran 提供的MLPClassifier神经网络分类器
from sklearn.neural_network import MLPClassifier
#导入skleran 提供的分割数据集的方法
from sklearn.model_selection import train_test_split
#导入pandas
import pandas as pd
    
#加载数据集
iris = load_iris()
#分割数据集训练集,测试集
x_train,x_test,y_train,y_test=train_test_split(iris['data'],iris['target'],random_state=0)
# 创建神经网络分类器
model = MLPClassifier(solver='lbfgs', activation='logistic')
#训练模型
model.fit(x_train,y_train)
#训练后用测试集对模型进行评分
print("模型评分:",model.score(x_test,y_test))
print('-----------------------------------------------------')
    
print('测试集前5条数据特征值:')
print(pd.DataFrame(x_test).head(5))
print('-----------------------------------------------------')
print('测试集前5条数据目标值:')
print(pd.DataFrame(y_test).head(5))
print('-----------------------------------------------------')
#使用模型预测
y_predict=model.predict(x_test)
print('使用模型预测测试集前5条数据的目标值:')
print(pd.DataFrame(y_predict).head(5))

(2)运行结果如下:
评论

全部评论(0)

回到顶部