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:隐藏层激活函数,参数值有 identity、logistic、tanh、relu,默认为 'relu' 即线性整流函数(校正非线性)
- solver:权重优化算法,lbfgs、sgd、adam,其中 lbfg 鲁棒性较好,但在大型模型或者大型数据集上花费的调优时间会较长,adam 大多数效果都不错,但对数据的缩放相当敏感,sgd 则不常用
- alpha:L2 正则项参数,比如 alpha = 0.0001(弱正则化)
- learning_rate:学习率,参数值 constant、invscaling、adaptive
- learning_rate_init:初始学习率,只有当 solver 为 sgd 或 adam 时才使用。
- max_iter:最大迭代次数
- shuffle:是否在每次迭代时对样本进行清洗,当 solver 参数值为 sgd 或 adam 时才使用该参数值
- 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)