Scikit-Learn简介:使用Python进行机器学习
本课程将涵盖Scikit-Learn的基础知识,Scikit-Learn是一个受欢迎的软件包,其中包含用Python编写的机器学习工具集合。 有关更多信息,请访问http://scikit-learn.org。
大纲
主要目标:介绍机器学习的中心概念,以及如何使用Scikit-learn软件包将其应用在Python中。
机器学习的定义
scikit-learn中的数据表示
Scikit学习API简介
关于Scikit-Learn
Scikit-Learn是一个Python软件包,旨在通过干净,经过深思熟虑的API访问Python代码中的著名机器学习算法。 它由来自世界各地的数百名贡献者构建,并在整个行业和学术界广泛使用。
Scikit-Learn建立在Python的NumPy(数值Python)和SciPy(科学Python)库的基础上,它们可在Python中进行有效的核内数值和科学计算。 因此,尽管在这方面有一些工作,但scikit-learn并不是专门为超大型数据集设计的。
对于这个简短的介绍,我将坚持使用Scikit-learn对中小型数据集进行核心处理的问题。
什么是机器学习?
在本节中,我们将开始探索机器学习的基本原理。 机器学习涉及构建具有可调整参数(通常是浮点值的数组)的程序,这些程序会自动调整,以便通过适应以前看到的数据来改善其行为。
机器学习可以被视为人工智能的一个子领域,因为这些算法可以被视为构建基块,通过某种方式概括化而不是像存储数据库系统那样存储和检索数据项,从而使计算机学习更智能的行为。
在这里,我们将看两个非常简单的机器学习任务。 第一个是分类任务:该图显示了二维数据的集合,这些数据根据两个不同的类标签进行了着色。 可以使用分类算法来绘制两个点簇之间的划分边界:
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn')
# Import the example plot from the figures directory
from fig_code import plot_sgd_separator
plot_sgd_separator()
这看似微不足道,但却是一个非常重要概念的简单版本。 通过画出这条分隔线,我们学会了一个可以推广到新数据的模型:如果将另一个未标记的点放到平面上,该算法现在可以预测它是蓝点还是红点。
如果您想查看用于生成此代码的源代码,则可以在图形目录中打开代码,也可以使用%load magic命令来加载代码:
我们将要看的下一个简单任务是回归任务:一条简单的最适合于一组数据的线:
from fig_code import plot_linear_regression
plot_linear_regression()
同样,这是将模型拟合到数据的示例,以便模型可以对新数据进行概括。 该模型是从训练数据中学到的,可用于预测测试数据的结果:此处,我们可能会得到一个x值,并且该模型将允许我们预测y值。 同样,这似乎是一个琐碎的问题,但这是机器学习任务的基本操作类型的基本示例。
Scikit学习中的数据表示
机器学习就是根据数据创建模型:因此,我们将从讨论如何表示数据以便被计算机理解开始。 与此同时,我们将基于上一节中的matplotlib示例进行构建,并显示一些如何可视化数据的示例。
在scikit-learn中实现的大多数机器学习算法都期望将数据存储在二维数组或矩阵中。 数组可以是numpy数组,或者在某些情况下是scipy.sparse矩阵。 数组的大小预计为[n_samples,n_features]
n_samples:样本数量:每个样本都是要处理(例如分类)的项目。 样本可以是文档,图片,声音,视频,天文物体,数据库或CSV文件中的一行,或者可以用固定的一组定量特征描述的任何内容。
n_features:可以用来定量描述每个项目的特征或不同特征的数量。 特征通常是实值,但在某些情况下可能是布尔值或离散值。
功能数量必须预先确定。 但是,它的尺寸可能非常高(例如,数百万个特征),对于给定的样本,大多数特征为零。 在这种情况下,scipy.sparse矩阵很有用,因为它们比numpy数组具有更高的内存效率。
一个简单的例子:鸢尾花数据集
作为简单数据集的示例,我们将看一下scikit-learn存储的鸢尾花数据。 数据包括对三种不同虹膜种类的测量。 数据集中存在三种虹膜,我们可以在此处进行图片描述:
from IPython.core.display import Image, display
display(Image(filename='images/iris_setosa.jpg'))
print("Iris Setosa\n")
display(Image(filename='images/iris_versicolor.jpg'))
print("Iris Versicolor\n")
display(Image(filename='images/iris_virginica.jpg'))
print("Iris Virginica")
Iris Setosa
Iris Versicolor
Iris Virginica
快速提问:
如果我们想设计一种识别鸢尾花种类的算法,数据可能是什么?
请记住:我们需要一个大小为[n_samples x n_features]的2D数组。
n_samples指的是什么?
n_features可能指的是什么?
请记住,每个样本必须有固定数量的特征,并且每个样本的特征编号i必须是相似数量。
使用Scikit-Learn加载鸢尾花数据
Scikit-learn具有关于这些虹膜种类的非常直接的数据集。 数据包括以下内容:
鸢尾花数据集中的特征:
萼片长度(厘米)
萼片宽度(厘米)
花瓣长度(厘米)
花瓣宽度(厘米)
目标类别以预测:
Iris Setosa
Iris Versicolour
Iris Virginica
scikit-learn嵌入了鸢尾花CSV文件的副本以及一个辅助函数,以将其加载到numpy数组中:
from sklearn.datasets import load_iris
iris = load_iris()
iris.keys()
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
n_samples, n_features = iris.data.shape
print((n_samples, n_features))
print(iris.data[0])
(150, 4)
[5.1 3.5 1.4 0.2]
print(iris.data.shape)
print(iris.target.shape)
(150, 4)
(150,)
print(iris.target)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
print(iris.target_names)
['setosa' 'versicolor' 'virginica']
该数据是四维的,但是我们可以使用一个简单的散点图一次可视化两个维
import numpy as np
import matplotlib.pyplot as plt
x_index = 0
y_index = 1
#此格式化程序将使用正确的目标名称标记颜色栏
formatter = plt.FuncFormatter(lambda i, *args: iris.target_names[int(i)])
plt.scatter(iris.data[:, x_index], iris.data[:, y_index],
c=iris.target, cmap=plt.cm.get_cmap('RdYlBu', 3))
plt.colorbar(ticks=[0, 1, 2], format=formatter)
plt.clim(-0.5, 2.5)
plt.xlabel(iris.feature_names[x_index])
plt.ylabel(iris.feature_names[y_index]);
快速练习:
在上面的脚本中更改x_index和y_index,并找到两个参数的组合,这些参数最大程度地分隔了三个类。
本练习是降维的预览,我们将在后面看到。
Other Available Data
它们有三种口味:
- Packaged Data: 这些小型数据集与scikit-learn安装打包在一起, 并可以使用中的工具下载
sklearn.datasets.load_*
- Downloadable Data: 这些较大的数据集可供下载,而scikit-learn包含了简化这一过程的工具。这些工具可以在
sklearn.datasets.fetch_*
- Generated Data: 有几个数据集是由基于随机种子的模型生成的。这些都可以
sklearn.datasets.make_*
您可以使用IPython的选项卡完成功能来研究可用的数据集加载器、获取器和生成器。从’ ’ sklearn ’ ‘导入’ ‘数据集’ '子模块后,键入
datasets.load_ + TAB
or
datasets.fetch_ + TAB
or
datasets.make_ + TAB
以查看可用函数的列表。