scikit-learn开始使用scikit-learn


备注

scikit-learn是一个用python编写的数据分析的通用开源库。它基于其他python库:NumPy,SciPy和matplotlib

scikit-learn包含许多针对不同流行的机器学习算法的实现。

安装scikit-learn

目前稳定版的scikit-learn 需要

  • Python(> = 2.6或> = 3.3),
  • NumPy(> = 1.6.1),
  • SciPy(> = 0.9)。

对于大多数安装pip python包管理器可以安装python及其所有依赖项:

pip install scikit-learn
 

但是对于Linux系统,建议使用conda 包管理器来避免可能的构建过程

conda install scikit-learn
 

要检查你是否有scikit-learn ,请在shell中执行:

python -c 'import sklearn; print(sklearn.__version__)'
 

Windows和Mac OSX安装:

除了用于Windows的大量科学python库,Mac OSX(也与Linux相关)之外, CanopyAnaconda都提供了最新版本的scikit-learn

创建管道

在数据中查找模式通常在数据处理步骤链中进行,例如,特征选择,标准化和分类。在sklearn ,使用了一个阶段的管道。

例如,以下代码显示了由两个阶段组成的管道。第一个是对要素进行缩放,第二个是对得到的增广数据集进行分类:

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

pipeline = make_pipeline(StandardScaler(), KNeighborsClassifier(n_neighbors=4))
 

创建管道后,您可以像常规阶段一样使用它(具体取决于其具体步骤)。例如,这里的管道就像一个分类器。因此,我们可以使用它如下:

# fitting a classifier
pipeline.fit(X_train, y_train)
# getting predictions for the new data sample
pipeline.predict_proba(X_test)
 

接口和约定:

使用特殊类完成对数据的不同操作。

大多数类属于以下组之一:

  • 分类算法(源自sklearn.base.ClassifierMixin )解决分类问题
  • 回归算法(源自sklearn.base.RegressorMixin )解决连续变量重构问题(回归问题)
  • 数据转换(从sklearn.base.TransformerMixin 派生),用于预处理数据

数据被存储在numpy.array 秒(但像其他阵列状物体pandas.DataFrame 如果这些是可以改变为s被接受numpy.array S)

数据中的每个对象都由一组特征描述,一般惯例是数据样本用数组表示,其中第一维是数据样本id,第二维是特征id。

import numpy
data = numpy.arange(10).reshape(5, 2)
print(data)

Output:
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
 

sklearn 约定中,上面的数据集包含5个对象,每个对象由2个特征描述。

样本数据集

为便于测试, sklearnsklearn.datasets 模块中提供了一些内置数据集。例如,让我们加载Fisher的虹膜数据集:

import sklearn.datasets
iris_dataset = sklearn.datasets.load_iris()
iris_dataset.keys()
['target_names', 'data', 'target', 'DESCR', 'feature_names']
 

您可以阅读完整描述,功能名称和类名称( target_names )。那些存储为字符串。

我们对存储在datatarget 字段中的数据和类感兴趣。按照惯例,它们表示为Xy

X, y = iris_dataset['data'], iris_dataset['target']
X.shape, y.shape
((150, 4), (150,))
 
numpy.unique(y)
array([0, 1, 2])
 

Xy 形状表示有150个样本具有4个特征。每个样本属于以下类别之一:0,1或2。

现在,通过调用分类器的fit() 方法,可以将Xy 用于训练分类器。


以下是sklearn.datasets 模块提供的完整数据集列表及其大小和用途:

加载描述尺寸用法
load_boston() 波士顿房价数据集 506 回归
load_breast_cancer() 乳腺癌威斯康星州数据集 569 分类(二进制)
load_diabetes() 糖尿病数据集 442 回归
load_digits(n_class) 数字数据集 1797 分类
load_iris() 虹膜数据集 150 分类(多级)
load_linnerud() Linnerud数据集 20 多元回归

请注意(来源: http//scikit-learn.org/stable/datasets/)

这些数据集可用于快速说明scikit中实现的各种算法的行为。然而,它们通常太小而无法代表现实世界的机器学习任务。

除了这些内置的玩具样本数据集, sklearn.datasets 还提供了用于加载外部数据集的实用程序功能:

  • load_mlcomp 用于从mlcomp.org存储库加载样本数据集(请注意,之前需要下载数据集)。 是一个使用示例。
  • fetch_lfw_pairsfetch_lfw_people 用于加载来自http://vis-www.cs.umass.edu/lfw/的野外Labeled Faces(LFW)数据集,用于面部验证(分别面部识别)。此数据集大于200 MB。 是一个使用示例。

训练具有交叉验证的分类器

使用iris数据集:

import sklearn.datasets
iris_dataset = sklearn.datasets.load_iris()
X, y = iris_dataset['data'], iris_dataset['target']
 

数据分为训练集和测试集。为此,我们使用train_test_split 实用程序函数随机分割Xy (数据和目标向量),选项train_size=0.75 (训练集包含75%的数据)。

训练数据集被馈送到k-最近邻分类器 。分类器的方法fit 将使模型适合数据。

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.75) 
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_train, y_train)
 

最后预测测试样品的质量:

clf.score(X_test, y_test) # Output: 0.94736842105263153
 

通过使用一对列车和测试集,由于数据分割的任意选择,我们可能得到分类器质量的偏差估计。通过使用交叉验证,我们可以将分类器拟合到数据的不同列车/测试子集上,并对所有准确度结果进行平均。函数cross_val_score 使用交叉验证使分类cross_val_score 适合输入数据。它可以将要使用的不同分割(折叠)的数量作为输入(在下面的示例中为5)。

from sklearn.cross_validation import cross_val_score
scores = cross_val_score(clf, X, y, cv=5)
print(scores)
# Output: array([ 0.96666667,  0.96666667,  0.93333333,  0.96666667,  1.        ])
print "Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() / 2)
# Output: Accuracy: 0.97 (+/- 0.03)