1101-《Python数据科学手册》读书笔记

本文是《Python数据科学手册》的读书笔记,主要介绍Scikit-Learn机器学习库,包括数据表示、评估器API的使用。以鸢尾花数据集为例,展示了有监督学习的线性回归和分类,以及无监督学习的降维和聚类。此外,还探讨了手写数字识别问题,通过降维和分类算法进行数字识别。
摘要由CSDN通过智能技术生成

1101-《Python数据科学手册》读书笔记

机器学习

Scikit-Learn简介

目前,Python 有不少可以实现各种机器学习算法的程序库。Scikit-Learn(http://scikit-learn.org)是最流行的程序包之一,它为各种常用机器学习算法提供了高效版本。Scikit-Learn不仅因其干净、统一、管道命令式的 API 而独具特色,而且它的在线文档又实用、又完整。这种统一性的好处是,只要你掌握了 Scikit-Learn 一种模型的基本用法和语法,就可以非常平滑地过渡到新的模型或算法上。
首先介绍 Scikit-Learn 的数据表示(data representation),然后介绍评估器 API(Estimator API),最后通过一个有趣的示例演示如何用这些工具探索手写数字图像。

1. Scikit-Learn的数据表示

机器学习是从数据创建模型的学问,因此你首先需要了解怎样表示数据才能让计算机理解。Scikit-Learn 认为数据表示最好的方法就是用数据表的形式。

1.数据表

基本的数据表就是二维网格数据,其中的每一行表示数据集中的每个样本,而列表示构成每个样本的相关特征。例如 Ronald Fisher 在 1936 年对鸢尾花数据集(https://en.wikipedia.org/wiki/Iris_flower_data_set) 的 经 典 分 析。 我 们 用 Seaborn 程 序 库(https://stanford.edu/~mwaskom/software/seaborn/)下载数据并加载到 Pandas 的 DataFrame 中:

In[1]: import seaborn as sns 
 iris = sns.load_dataset('iris') 
 iris.head() 
Out[1]: sepal_length sepal_width petal_length petal_width species 
      0          5.1         3.5          1.4         0.2  setosa 
      1          4.9         3.0          1.4         0.2  setosa 
      2          4.7 		 3.2 		  1.3 		  0.2  setosa 
      3          4.6  		 3.1 		  1.5 	 	  0.2  setosa 
      4 		 5.0 		 3.6 	 	  1.4 	 	  0.2  setosa

其中的每行数据表示每朵被观察的鸢尾花,行数表示数据集中记录的鸢尾花总数。一般情况下,会将这个矩阵的行称为样本(samples),行数记为 n_samples。
同样,每列数据表示每个样本某个特征的量化值。一般情况下,会将矩阵的列称为特征(features),列数记为 n_features。

2. 特征矩阵

这个表格布局通过二维数组或矩阵的形式将信息清晰地表达出来,所以我们通常把这类矩阵称为特征矩阵(features matrix)。特征矩阵通常被简记为变量 X。它是维度为 [n_samples, n_features] 的二维矩阵,通常可以用 NumPy 数组或 Pandas 的DataFrame 来表示,不过 Scikit-Learn 也支持 SciPy 的稀疏矩阵。
样本(即每一行)通常是指数据集中的每个对象。例如,样本可能是一朵花、一个人、一篇文档、一幅图像,或者一首歌、一部影片、一个天体,甚至是任何可以通过一组量化方法进行测量的实体。
特征(即每一列)通常是指每个样本都具有的某种量化观测值。一般情况下,特征都是实数,但有时也可能是布尔类型或者离散值。

3.目标数组

除了特征矩阵 X 之外,我们还需要一个标签或目标数组,通常简记为 y。目标数组一般是一维数组,其长度就是样本总数 n_samples,通常都用一维的 NumPy 数组或 Pandas 的Series 表示。目标数组可以是连续的数值类型,也可以是离散的类型 / 标签。虽然有些Scikit-Learn 的评估器可以处理具有多目标值的二维 [n_samples, n_targets] 目标数组,但此处基本上只涉及常见的一维目标数组问题。
如何区分目标数组的特征与特征矩阵中的特征列,一直是个问题。目标数组的特征通常是我们希望从数据中预测的量化结果;借用统计学的术语,y 就是因变量。以前面的示例数据为例,我们需要通过其他测量值来建立模型,预测花的品种(species),而这里的species 列就可以看成是目标数组。
知道这一列是目标数组之后,就可以用 Seaborn(详情请参见 4.16 节)对数据进行可视化了(如图 5-12 所示):

In[2]: %matplotlib inline 
	   import seaborn as sns; sns.set() 
	   sns.pairplot(iris, hue='species', size=1.5);

在使用 Scikit-Learn 之前,我们需要从 DataFrame 中抽取特征矩阵和目标数组。可以用第 3章介绍的 Pandas DataFrame 基本操作来实现:

In[3]: X_iris = iris.drop('species', axis=1) 
 	   X_iris.shape 
Out[3]: (150, 4) 
In[4]: y_iris = iris['species'] 
 	   y_iris.shape 
Out[4]: (150,)

在这里插入图片描述
图 5-12:鸢尾花数据集的可视化

特征矩阵和目标数组的布局如图 5-13 所示。
在这里插入图片描述
图 5-13:Scikit-Learn 数据表布局

有了适当的数据形式之后,就可以开始学习 Scikit-Learn 的评估器 API 了。

2.Scikit-Learn的评估器API

Scikit-Learn API 主要遵照以下设计原则,Scikit-Learn API 文档也对此有所概述。

  • 统一性
    所有对象使用共同接口连接一组方法和统一的文档。

  • 内省
    所有参数值都是公共属性。

  • 限制对象层级
    只有算法可以用 Python类表示。数据集都用标准数据类型(NumPy 数组、Pandas DataFrame、SciPy 稀疏矩阵)表示,参数名称用标准的Python 字符串。

  • 函数组合
    许多机器学习任务都可以用一串基本算法实现,Scikit-Learn 尽力支持这种可能。

  • 明智的默认值
    当模型需要用户设置参数时,Scikit-Learn 预先定义适当的默认值。

只要你理解了这些设计原则,就会发现 Scikit-Learn 非常容易使用。Scikit-Learn 中的所有机器学习算法都是通过评估器 API 实现的,它为各种机器学习应用提供了统一的接口。

1. API基础知识

Scikit-Learn 评估器 API 的常用步骤如下所示(后面介绍的示例都是按照这些步骤进行的)。
(1) 通过从 Scikit-Learn 中导入适当的评估器类,选择模型类。
(2) 用合适的数值对模型类进行实例化,配置模型超参数(hyperparameter)。
(3) 整理数据,通过前面介绍的方法获取特征矩阵和目标数组。
(4) 调用模型实例的 fit() 方法对数据进行拟合。
(5) 对新数据应用模型:

  • 在有监督学习模型中,通常使用 predict() 方法预测新数据的标签;
  • 在无监督学习模型中,通常使用 transform() 或 predict() 方法转换或推断数据的性质。
2. 有监督学习示例:简单线性回归

让我们来演示一个简单线性回归的建模步骤——最常见的任务就是为散点数据集 (x, y) 拟
合一条直线。我们将使用下面的样本数据来演示这个回归示例(如图 5-14 所示):

In[5]: import matplotlib.pyplot as plt 
	   import numpy as np 
	   
	   rng = np.random.RandomState(42) 
	   x = 10 * rng.rand(50) 
	   y = 2 * x - 1 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值