[Machine Learning] 使用sklearn搭建多层感知机神经网络模型实现葡萄酒分类
内容实现概述
本文主要讲述使用sklearn库内置的神经网络模型,实现葡萄酒分类。 具体实现过程如下:
- 导入所需库:预先导入sklearn库
- 导入数据:调用库内置的加载葡萄酒数据的方法load_wine(),导入数据
- 数据预处理:对wine数据进行预处理,获得特征数据与目标数据;对特征数据进行归一化处理
- 数据分割:使用sklearn库的数据分割方法对步骤3中的数据进行比例分割,得到训练集和测试集数据
- 构建模型:调用sklearn库的多层感知机模型类MLPClassifier构建模型
- 训练模型:调用sklearn库的fit()方法对训练集数据进行训练
- 预测模型:调用sklearn库的predict()方法对测试集数据进行预测
- 评估模型:由于该模型是分类模型,所以调用sklearn库的准确率评估方法accuracy_score()进行评估
注:
- 在Python中使用(导入)scikit-learn库时,需要先安装,本实现使用的是pip命令安装 pip install -U scikit-learn
- Scikit-Learn官方教程
代码实现
注:源代码地址
# 当前任务:利用多层反馈神经网络学习算法,通过分析红酒中化学成分的含量(共计13个特征)对红酒进行分类
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score
## 获取(导入)葡萄酒wine数据集
wine = load_wine()
X = wine.data
y = wine.target
## 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
## 数据预处理(如,归一化)
# 特征数据归一化(指将所有特征值映射到[0,1]内),对样本的不同特征做一些预处理。结果:模型性能得到极大提升
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# 使用标准缩放器,来计算特征矩阵的平均值和标准差,用于以后的缩放
scaler.fit(X_train)
X_train = scaler.transform(X_train)
# X_train = scaler.fit_transform(X_train) # 该行代码可替换上两行代码
X_test = scaler.transform(X_test)
## 构造(导入)多层感知机分类器模型,即构造多层神经网络
# 第一个参数是solver,其含义为“解题者”,表示的是某种快速找到解的优化算法,包含有'lbfgs'、'sgd'、'adam'。
# 第二个参数是hidden_layer_sizes,它决定着神经网络的拓扑结构。hidden_layer_sizes=(100,),它表示隐含层有一层,该层有100个神经元
# 输入层和输出层神经元的数量取决于特性和目标的数量。比如,针对当前判定红酒品类的例子,
# 我们要依据13个特征来判定,那么输入层就要设置13个神经元。
# 而输出的是某红酒的品类,因此输出层神经元的个数为1即可
mlp_model = MLPClassifier(solver='lbfgs', hidden_layer_sizes=(100,))
# 调参,当查看到模型的性能水平不好时需要进行调参
# 尝试用两层隐含层,每层设置10个神经元,其他地方不变
# mlp_model = MLPClassifier(solver='lbfgs', hidden_layer_sizes=(10,10))
## 训练模型与预测数据
mlp_model.fit(X_train, y_train)
y_pred_on_train = mlp_model.predict(X_train)
y_pred_on_test = mlp_model.predict(X_test)
## 评估模型并查看模型参数,包括权重和偏置
print("训练集的准确率为: {:.2f}%".format(100 * accuracy_score(y_train, y_pred_on_train)))
print("测试集的准确率为: {:.2f}%".format(100 * accuracy_score(y_test, y_pred_on_test)))
# print("模型的偏置参数权重为: {}\n模型的特征参数权重为: {}".format(mlp_model.coefs_[0], mlp_model.coefs_[1]))