使用 scikit-learn 进行神经网络机器学习
介绍
神经网络用于解决许多具有挑战性的人工智能问题。它们通常优于传统的机器学习模型,因为它们具有非线性、变量交互和可定制性的优势。在本指南中,我们将学习如何使用 scikit-learn 构建神经网络机器学习模型。但在开始之前,最好对神经网络有一个基本的了解。
神经网络
创建神经网络的过程始于感知器。简单来说,感知器接收输入,将其乘以一些权重,然后将其传递到激活函数(例如 logistic、relu、tanh、identity)以产生输出。
神经网络是通过将这些感知器的各层相加而创建的,这被称为多层感知器模型。神经网络有三层 - 输入层、隐藏层和输出层。输入层直接接收数据,而输出层则创建所需的输出。中间的层称为隐藏层,中间计算就在这里进行。
神经网络算法既可用于分类问题,也可用于回归问题。在开始构建模型之前,我们将了解问题陈述和数据。
问题陈述
本指南的目的是建立一个分类模型来检测糖尿病。我们将使用包含 768 个观测值和 9 个变量的糖尿病数据集,如下所述:
- 怀孕 - 怀孕的次数。
- 葡萄糖——血浆葡萄糖浓度。
- 舒张压 - 舒张压(毫米汞柱)。
- 三头肌-皮褶厚度(毫米)。
- 胰岛素 - 小时血清胰岛素(mu U/ml)。
- bmi——基础代谢率(体重(千克)/身高(米)。
- dpf-糖尿病谱系功能。
- 年龄——年龄(岁)。
- 糖尿病 - “1” 表示患有糖尿病,而“0” 表示没有患糖尿病。这是目标变量。
评估指标
我们将使用准确度来评估模型的性能,准确度表示正确分类的案例的百分比。
从数学上来说,对于二元分类器,它表示为准确率 = (TP+TN)/(TP+TN+FP+FN),其中:
- 真正例 (TP) 是指带有正标签的案例,且被正确归类为正例。
- 真阴性(TN)是指带有阴性标签的案例,但被正确归类为阴性。
- 假阳性(FP)是指带有负标签的案例被错误地归类为阳性。
- 假阴性(FN)是指具有正标签但被错误地归类为负标签的案例。
步骤
在本指南中,我们将遵循以下步骤:
步骤 1——加载所需的库和模块。
第 2 步——读取数据并执行基本数据检查。
步骤 3-为特征和响应变量创建数组。
步骤4-创建训练和测试数据集。
步骤5-建立、预测和评估神经网络模型。
以下部分将介绍这些步骤。
步骤 1 - 加载所需的库和模块
# Import required libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import sklearn
from sklearn.neural_network import MLPClassifier
from sklearn.neural_network import MLPRegressor
# Import necessary modules
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from math import sqrt
from sklearn.metrics import r2_score
第 2 步 - 读取数据并执行基本数据检查
第一行代码将数据读入为 pandas 数据框,而第二行打印形状 - 9 个变量的 768 个观测值。第三行给出变量的转置汇总统计数据。
查看“糖尿病”变量的摘要,我们发现平均值为 0.35,这意味着数据集中约 35% 的观察值患有糖尿病。因此,基线准确率为 65%,我们的神经网络模型绝对应该超过这个基线基准。
df = pd.read_csv('diabetes.csv')
print(df.shape)
df.describe().transpose()
输出:
(768, 9)
| | count | mean | std | min | 25% | 50% | 75% | max |
|-------------|-------|------------|------------|--------|----------|----------|-----------|--------|
| pregnancies | 768.0 | 3.845052 | 3.369578 | 0.000 | 1.00000 | 3.0000 | 6.00000 | 17.00 |
| glucose | 768.0 | 120.894531 | 31.972618 | 0.000 | 99.00000 | 117.0000 | 140.25000 | 199.00 |
| diastolic | 768.0 | 69.105469 | 19.355807 | 0.000 | 62.00000 | 72.0000 | 80.00000 | 122.00 |
| triceps | 768.0 | 20.536458 | 15.952218 | 0.000 | 0.00000 | 23.0000 | 32.00000 | 99.00 |
| insulin | 768.0 | 79.799479 | 115.244002 | 0.000 | 0.00000 | 30.5000 | 127.25000 | 846.00 |
| bmi | 768.0 | 31.992578 | 7.884160 | 0.000 | 27.30000 | 32.0000 | 36.60000 | 67.10 |
| dpf | 768.0 | 0.471876 | 0.331329 | 0.078 | 0.24375 | 0.3725 | 0.62625 | 2.42 |
| age | 768.0 | 33.240885 | 11.760232 | 21.000 | 24.00000 | 29.0000 | 41.00000 | 81.00 |
| diabetes | 768.0 | 0.348958 | 0.476951 | 0.000 | 0.00000 | 0.0000 | 1.00000 | 1.00 |
步骤 3 - 为特征和响应变量创建数组
第一行代码创建了一个名为“target_column”的目标变量对象。第二行给出了除目标变量“unemploy”之外的所有特征的列表,而第三行则对预测变量进行了规范化。
第四行显示标准化数据的摘要。我们可以看到,所有独立变量现在都已在 0 到 1 之间缩放。目标变量保持不变。
target_column = ['diabetes']
predictors = list(set(list(df.columns))-set(target_column))
df[predictors] = df[predictors]/df[predictors].max()
df.describe().transpose()
输出:
| | count | mean | std | min | 25% | 50% | 75% | max |
|-------------|-------|----------|----------|----------|----------|----------|----------|-----|
| pregnancies | 768.0 | 0.226180 | 0.198210 | 0.000000 | 0.058824 | 0.176471 | 0.352941 | 1.0 |
| glucose | 768.0 | 0.607510 | 0.160666 | 0.000000 | 0.497487 | 0.587940 | 0.704774 | 1.0 |
| diastolic | 768.0 | 0.566438 | 0.158654 | 0.000000 | 0.508197 | 0.590164 | 0.655738 | 1.0 |
| triceps | 768.0 | 0.207439 | 0.161134 | 0.000000 | 0.000000 | 0.232323 | 0.323232 | 1.0 |
| insulin | 768.0 | 0.094326 | 0.136222 | 0.000000 | 0.000000 | 0.036052 | 0.150414 | 1.0 |
| bmi | 768.0 | 0.476790 | 0.117499 | 0.000000 | 0.406855 | 0.476900 | 0.545455 | 1.0 |
| dpf | 768.0 | 0.194990 | 0.136913 | 0.032231 | 0.100723 | 0.153926 | 0.258781 | 1.0 |
| age | 768.0 | 0.410381 | 0.145188 | 0.259259 | 0.296296 | 0.358025 | 0.506173 | 1.0 |
| diabetes | 768.0 | 0.348958 | 0.476951 | 0.000000 | 0.000000 | 0.000000 | 1.000000 | 1.0 |
步骤 4 - 创建训练和测试数据集
下面前几行代码分别创建独立变量(X)和因变量(y)的数组。第三行将数据分为训练数据集和测试数据集,第四行打印训练和测试数据的形状。
X = df[predictors].values
y = df[target_column].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=40)
print(X_train.shape); print(X_test.shape)
输出:
(537, 8)
(231, 8)
第 5 步 - 建立、预测和评估神经网络模型
在此步骤中,我们将使用 scikit-learn 库的估计器对象“多层感知器分类器”构建神经网络模型。第一行代码(如下所示)导入“MLPClassifier”。
第二行实例化模型,并将“hidden_layer_sizes”参数设置为三层,其神经元数量与数据集中的特征数量相同。我们还将选择“relu”作为激活函数,选择“adam”作为权重优化的求解器。要了解有关“relu”和“adam”的更多信息,请参阅使用 Keras 进行深度学习指南,其链接在本指南的末尾给出。
第三行代码将模型与训练数据进行拟合,第四行和第五行分别使用训练后的模型对训练和测试数据集进行预测。
from sklearn.neural_network import MLPClassifier
mlp = MLPClassifier(hidden_layer_sizes=(8,8,8), activation='relu', solver='adam', max_iter=500)
mlp.fit(X_train,y_train)
predict_train = mlp.predict(X_train)
predict_test = mlp.predict(X_test)
一旦生成预测,我们就可以评估模型的性能。作为分类算法,我们将首先导入所需的模块,这在下面的第一行代码中完成。第二行和第三行代码在训练数据上打印混淆矩阵和混淆报告结果。
from sklearn.metrics import classification_report,confusion_matrix
print(confusion_matrix(y_train,predict_train))
print(classification_report(y_train,predict_train))
输出:
[319 39]
[ 78 101]]
precision recall f1-score support
0 0.80 0.89 0.85 358
1 0.72 0.56 0.63 179
avg / total 0.78 0.78 0.77 537
上面的输出显示了模型在训练数据上的表现。准确率和 F1 分数分别约为 0.78 和 0.77。理想情况下,完美的模型在这两个指标上的值都是 1,但这在现实世界中几乎是不可能的。
下一步是评估模型在测试数据上的性能,使用下面的代码行完成。
print(confusion_matrix(y_test,predict_test))
print(classification_report(y_test,predict_test))
输出:
[123 19]
[ 38 51]]
precision recall f1-score support
0 0.76 0.87 0.81 142
1 0.73 0.57 0.64 89
avg / total 0.75 0.75 0.75 231
上面的输出显示了模型在测试数据上的性能。准确率和 F1 分数都在 0.75 左右。
结论
在本指南中,您学习了如何使用 scikit-learn 构建神经网络模型。该指南使用糖尿病数据集并构建分类器算法来预测糖尿病的检测。
我们的模型在训练和测试数据上分别实现了 78% 和 75% 的准确率。我们观察到模型准确率高于 66% 的基线准确率。可以通过进行交叉验证、特征工程或更改神经网络估计器中的参数来进一步改进模型。
请注意,我们在本指南中构建了一个分类模型。但是,构建回归模型也遵循相同的结构,但有一些调整。第一个调整是,我们将实例化估算器“MLPRegressor”,而不是使用估算器“MLPClassifier”。第二个调整是,我们将使用 RMSE 或 R 平方值进行模型评估,而不是使用准确率作为评估指标。
要了解有关使用scikit-learn构建机器学习模型的更多信息,请参阅以下指南:
要了解有关使用keras构建深度学习模型的更多信息,请参阅以下指南:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~