3.1.1 克利夫兰心脏病数据集的二元目标
克利夫兰心脏病(Cleveland,1988)数据集包含303名受试者的患者数据。数据集中的某些列包含有缺失值,我们也会处理这样的问题。数据集包含13列,包括胆固醇和年龄。
任务目标是检测某个患者对象是否有心脏病,因此这是二元目标。我们要解决的数据处理问题是,对数据使用0到4的值进行编码,其中0表示没有心脏病,1到4的范围表示某种类型的心脏病。
我们将使用数据集中标识为Cleveland的部分,数据可以使用此链接下载:https://archive.ics.uci.edu/ml/machine-learning-databases/heartdisease/processed.cleveland.data。
数据集的具体属性如下:
让我们按照下面的步骤将数据集读入pandas DataFrame并清理数据:
1)在谷歌Colab中,将首先使用如下wget命令下载数据:
这样,就可以将processing.cleveland.data文件下载到Colab的默认目录中,并且可以通过检查Colab左侧的Files选项卡进行验证。请注意,前面的指令都是一行,不幸的是,这个指令非常长。
2)接下来,我们使用pandas加载数据集,以验证数据集是否为可读和可访问的。
Pandas是一个非常受数据科学家和机器学习科学家欢迎的Python库。它简化了加载和保存数据集、替换缺失的值、检索数据的基本统计属性,甚至执行转换。Pandas就像是一个救星,现在大多数其他机器学习库都接受Pandas作为有效的输入格式。
在Colab中执行如下命令加载和显示部分数据:
read_csv()函数的作用是:加载一个以逗号分隔值(CSV)格式化的文件。我们使用参数header=None告诉pandas数据没有任何实际的头文件。如果省略,pandas将使用数据的第一行作为每个列的名称,但在本例中我们不希望这样做。
加载的数据存储在一个名为df的变量中。虽然df可以是任何名称,但我认为df很容易记住,因为pandas是将数据存储在DataFrame对象中。因此,对于数据来说,df似乎是一个合适、简短且容易记住的名称。然而,如果使用多个DataFrame,那么用一个描述它们所包含数据的名称来对所有DataFrame分别进行不同的命名会更加方便。
在DataFrame上操作的head()方法类似于unix命令,用于检索文件的前几行。在DataFrame中,head()方法返回前五行数据。如果希望检索更多或更少的数据行,那么可以指定一个整数作为该方法的参数。例如,如果你想要检索前三行,那么你可以执行df.head(3)。
运行上述代码的结果如下所示:
下面是一些需要注意和记住的要点,以备将来参考:
·在左边,有一个未命名的列,竖列是连续的数字,0,1,…,4。这些是pandas分配给数据集中每一行的索引,是唯一的数字。有些数据集有唯一的标识符,例如图像的文件名。
·在顶部,有一横行是0,1,…,13。这些是列的标识符,它们也是唯一的,并且可以设置。
·在每一行和每一列的交点,我们的值要么是浮点小数,要么是整数。除了列13之外,整个数据集包含十进制数,列13是目标输出,该列包含的是整数。
3)因为我们将使用这个数据集处理二元分类问题,所以我们现在需要更改最后一列,使其只包含二元值:0和1。我们将保留0的原始含义,即没有心脏病,任何大于或等于1的都将映射到1,表示对某种类型心脏病的诊断。可以运行下列指令:
df[13]指令查看DataFrame并检索索引为13的列的所有行。然后,在第13列的所有行上使用set()方法创建列中所有不同元素的集合。这样,我们就可以知道有多少个不同的值,以便替换它们。输出结果如下:
由此,我们知道0表示没有心脏病,1表示有心脏病。然而,我们需要将2、3和4映射为1,因为它们也表示心脏病阳性。我们可以通过执行以下命令来实现这个改变:
这里,replace()函数在DataFrame上工作,替换特定的值。在我们的例子中,它有三个参数:
·to_replace=[2,3,4]表示要搜索的项列表,以便替换它们。
·value=1表示将替换每个匹配项的值。
·inplace=True向pandas表明想要对该列进行更改。
在某些情况下,pandas DataFrame的行为就像一个不可变的对象,此时就需要使用inplace=True参数。否则,就得这么做:
df[13]=df[13].replace(to_replace=[2,3,4],value=1),这对有经验的pandas用户来说不成问题。这意味着你应该都熟悉这两种方式。
pandas初学者面临的主要问题是,它的行为并不总是像一个不可变对象。因此,应该将所有的pandas文档放在身边:https://pandas.pydata.org/pandas-docs/stable/index.html。
执行该命令的输出结果如下:
首先,请注意,当我们打印前5行时,第13列的值现在只包含0或1。可以将它们与原始数据进行比较,以验证加粗显示的数字是否确实发生了变化。我们还使用set(df[13])验证了该列的所有唯一值的集合现在只有{0,1},这是期望的目标。
有了这些变化,我们可以使用数据集来训练深度学习模型,可能会改进现有的记录性能(Detrano,R.,et al.,1989)。
可以应用同样的方法,使得在集合中的任何其他列具有二元值。作为练习,让我们将著名的MNIST数据集用作另外一个示例。