熟悉一个新的平台或者一个新的工具最好的方式就是从头到尾踏实的完成一个机器学习项目
这里以 PimaIndiansdiabetes.csv 数据集为例。
Download Data SetPimaIndiansdiabetes.csv 数据集介绍
- 1、该数据集最初来自国家糖尿病 / 消化 / 肾脏疾病研究所。数据集的目标是基于数据集中包含的某些诊断测量来诊断性的预测 患者是否患有糖尿病。
- 2、从较大的数据库中选择这些实例有几个约束条件。尤其是,这里的所有患者都是 Pima 印第安至少 21 岁的女性。
- 3、数据集由多个医学预测变量和一个目标变量组成 Outcome。预测变量包括患者的怀孕次数、BMI、胰岛素水平、年龄等。
- 4、数据集的内容是皮马人的医疗记录,以及过去 5 年内是否有糖尿病。所有的数据都是数字,问题是(是否有糖尿病是 1 或 0),是二分类问题。数据有 8 个属性,1 个类别:
- 【1】Pregnancies:怀孕次数
- 【2】Glucose:葡萄糖
- 【3】BloodPressure:血压 (mm Hg)
- 【4】SkinThickness:皮层厚度 (mm)
- 【5】Insulin:胰岛素 2 小时血清胰岛素(mu U /ml )
- 【6】BMI:体重指数 (体重 / 身高)^2 )
- 【7】DiabetesPedigreeFunction:糖尿病谱系功能
- 【8】Age:年龄 (岁)
- 【9】Outcome:类标变量 (0 或 1)
数据可视化了解数据集的结构
现在是时候看一下我们的数据集了。当前步骤中我们从不同的角度观察数据。
加载数据集
首先 import pandas 模块调用 read_csv 方法加载数据集。
from pandas import read_csv |
显示数据实例个数、属性个数
使用 pandas 中的 shape 方法查看数据集的维度特征,显示数据实例个数 (行)、属性个数(列)。
# 显示数据实例个数、属性个数 |
看到有 768 个实例,9 个属性。
前 10 个样本情况
使用 head 方法观察数据前 10 行。实际地仔细观察数据向来都是好办法。
# 前10个样本情况 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
0 | 6 | 148 | 72 | 35 | 0 | 33.6 | 0.627 | 50 | 1 |
1 | 1 | 85 | 66 | 29 | 0 | 26.6 | 0.351 | 31 | 0 |
2 | 8 | 183 | 64 | 0 | 0 | 23.3 | 0.672 | 32 | 1 |
3 | 1 | 89 | 66 | 23 | 94 | 28.1 | 0.167 | 21 | 0 |
4 | 0 | 137 | 40 | 35 | 168 | 43.1 | 2.288 | 33 | 1 |
5 | 5 | 116 | 74 | 0 | 0 | 25.6 | 0.201 | 30 | 0 |
6 | 3 | 78 | 50 | 32 | 88 | 31.0 | 0.248 | 26 | 1 |
7 | 10 | 115 | 0 | 0 | 0 | 35.3 | 0.134 | 29 | 0 |
8 | 2 | 197 | 70 | 45 | 543 | 30.5 | 0.158 | 53 | 1 |
9 | 8 | 125 | 96 | 0 | 0 | 0.0 | 0.232 | 54 | 1 |
显示每个属性的统计概要
看一下每个属性的统计概要。
这里包括总数,均值,std,最小值,最大值以及一些百分比。
# 显示每个属性的统计概要(包括总数,均值,最小值,最大值以及一些百分比) |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|---|
count | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 |
mean | 3.845052 | 120.894531 | 69.105469 | 20.536458 | 79.799479 | 31.992578 | 0.471876 | 33.240885 | 0.348958 |
std | 3.369578 | 31.972618 | 19.355807 | 15.952218 | 115.244002 | 7.884160 | 0.331329 | 11.760232 | 0.476951 |
min | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.078000 | 21.000000 | 0.000000 |
25% | 1.000000 | 99.000000 | 62.000000 | 0.000000 | 0.000000 | 27.300000 | 0.243750 | 24.000000 | 0.000000 |
50% | 3.000000 | 117.000000 | 72.000000 | 23.000000 | 30.500000 | 32.000000 | 0.372500 | 29.000000 | 0.000000 |
75% | 6.000000 | 140.250000 | 80.000000 | 32.000000 | 127.250000 | 36.600000 | 0.626250 | 41.000000 | 1.000000 |
max | 17.000000 | 199.000000 | 122.000000 | 99.000000 | 846.000000 | 67.100000 | 2.420000 | 81.000000 | 1.000000 |
箱线盒图
导入 matplotlib,绘制每一个输入变量的箱线图。这能让我们更清晰的了解输入属性的分布情况。
from matplotlib import pyplot |
柱状图
# 柱状图 |
看起来输入变量中有 3 个可能符合高斯分布。这个现象值得注意,我们可以使用基于这个假设的算法。
多变量散点图
看一下变量之间的相互关系,所有属性两两一组互相对比的散点图。这种图有助于我们定位输入变量间的结构性关系。
# 多变量散点图 |
注意下图中某些属性两两比对时延对角线出现的分组现象。这其实表明高度的相关性和可预测关系。
交叉验证
交叉验证的基本思想是把在某种意义下将原始数据进行分组,一部分做为训练集,另一部分做为验证集,首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型,以此来做为评价分类器的性能指标。
用交叉验证的目的是为了得到可靠稳定的模型。
对数据进行 3、5、7 交叉验证,比较结果。
十折交叉验证
# MLP for Pima Indians Dataset with 10-fold cross validation via sklearn |
3 交叉验证
# 3 交叉验证 |
5 交叉验证
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=seed) |
7 交叉验证
# 7 交叉验证 |
改变神经网络结构
加深,加宽,看看什么结构对模型性能有较大影响。
加深
# 改变神经网络结构,(加深,加宽),看看什么结构对模型性能有较大影响。 |
加宽
# 改变神经网络结构,(加深,加宽),看看什么结构对模型性能有较大影响。 |
加深加宽
# 改变神经网络结构,(加深,加宽),看看什么结构对模型性能有较大影响。 |
结果
操作 | Resault |
---|---|
加深 | 0.7096354166666666 |
加宽 | 0.7057291666666666 |
加深加宽 | 0.7174479166666666 |
更深的模型,意味着更好的非线性表达能力,可以学习更加复杂的变换,从而可以拟合更加复杂的特征输入。
网络更深,每一层要做的事情也更加简单了。
上面就是网络加深带来的两个主要好处,更强大的表达能力和逐层的特征学习。
而宽度就起到了另外一个作用,那就是让每一层学习到更加丰富的特征,比如不同方向,不同频率的纹理特征。
可视化训练过程
# 可视化训练过程(损失函数关系图,精确度关系图) |