Sklearn工具包

一、Sklearn工具包介绍

  scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包。它通过NumPy, SciPy和Matplotlib等python数值计算的库实现高效的算法应用,并且涵盖了几乎所有主流机器学习算法。

  官网:https://scikit-learn.org/stable/index.html

1、常用模块

  Sklearn中常用模块:分类(Classification)、回归(Regression)、聚类(Clustering)、降维(Dimensionality reduction)、模型选择(Model selection)、数据预处理(Preprocessing)。

  分类:识别某个对象属于哪个类别,常用的算法有:SVM(支持向量机)、nearest neighbors(最近邻)、random forest(随机森林),常见的应用有:垃圾邮件识别、图像识别。

  回归:预测与对象相关联的连续值属性,常见的算法有:SVR(支持向量机)、 ridge regression(岭回归)、Lasso,常见的应用有:药物反应,预测股价。

  聚类:将相似对象自动分组,常用的算法有:k-Means、 spectral clustering、mean-shift,常见的应用有:客户细分,分组实验结果。

  降维:减少要考虑的随机变量的数量,常见的算法有:PCA(主成分分析)、feature selection(特征选择)、non-negative matrix factorization(非负矩阵分解),常见的应用有:可视化,提高效率。

  模型选择:比较,验证,选择参数和模型,常用的模块有:grid search(网格搜索)、cross validation(交叉验证)、 metrics(度量)。它的目标是通过参数调整提高精度。

  预处理:特征提取和归一化,常用的模块有:preprocessing,feature extraction,常见的应用有:把输入数据(如文本)转换为机器学习算法可用的数据。

二、SciKit-Learn数据集

  sklearn.datasets 模块 包含加载数据集的实用程序,包括加载和获取流行引用数据集的方法。它还具有一些人工数据生成器。

  更多细节查看: Dataset loading utilities

1、加载数据集

  数据科学的第一步通常是加载数据,首先需要学会如何使用SciKit-Learn来加载数据集。

  数据集的来源通常是自己准备或第三方处获取。非研究人员,通常是从第三方获取数据。可以下载获取数据集的网站:

  SciKit-Learn库中,也有自带一些数据集可以尝试加载。

  datasets模块中也包含了获取其他流行数据集的方法,例如datasets.fetch_openml可以从openml存储库获取数据集。

  在sklearn的0.2版本中,fetch_mldata函数已经被fetch_openml函数取代,例如加载MNIST数据集。

def get_data():
    """
    Get MNIST data ready to learn with.
    :return:
    """
    # 在sklearn的0.2版本中,fetch_mldata函数已经被fetch_openml函数取代
    from sklearn.datasets import fetch_openml     # 通过名称或数据集ID从openml获取数据集

    # 查询到我电脑上的scikit data home目录
    from sklearn.datasets.base import get_data_home
    print(get_data_home())             # C:\Users\hqs\scikit_learn_data

    # Mnist 数据是图像数据:(28,28,1)的灰度图
    mnist = fetch_openml('mnist_784')
    # print(mnist)

    X, y = mnist["data"], mnist["target"]
    X.shape    # (70000, 784)
    y.shape    # (70000,)

2、数据集切分

  将数据集切分为训练集、测试集。

def get_data():
    """
    Get MNIST data ready to learn with.
    :return:
    """
    # 在sklearn的0.2版本中,fetch_mldata函数已经被fetch_openml函数取代
    from sklearn.datasets import fetch_openml     # 通过名称或数据集ID从openml获取数据集

    # 查询到我电脑上的scikit data home目录
    from sklearn.datasets.base import get_data_home
    print(get_data_home())             # C:\Users\hqs\scikit_learn_data

    # Mnist 数据是图像数据:(28,28,1)的灰度图
    mnist = fetch_openml('mnist_784')
    # print(mnist)

    X, y = mnist["data"], mnist["target"]
    X.shape    # (70000, 784)
    y.shape    # (70000,)

    # 切分为训练集和测试集
    X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]

    # 洗牌操作,打乱当前数据集顺序
    shuffle_index = np.random.permutation(60000)
    X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]   # 索引值回传相当于洗牌操作

    print(X_train, y_train)
    """
    [[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.]] ['7' '3' '8' ... '0' '0' '4']
    """

三、交叉验证(cross validation)

1、交叉验证定义

  Sklearn工具包

  交叉验证是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(data set)进行分组,一部分做为训练集(training set),另一部分做为测试集(validation set),首先用训练集对分类器进行训练,在利用测试集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。

2、三种实现方法

(1)留出法(holdout cross validation)

  将原始数据集分为三部分:训练集、验证集和测试集。训练集用于训练模型,验证集用于模型的参数选择配置,测试集对于模型来说是未知数据,用于评估模型的泛化能力。

  优点:操作简单
  缺点:样本数比例,模型对数据划分敏感,分成三部分使得训练数据变少。

(2)k折交叉验证(k-fold cross validation)

  将数据集无替换的随机分为k份,k-1份用来训练模型,剩下一份用来模型性能评估。重复k次,得到k个模型和性能评估结果。得到k个性能评估后,取平均求出最终性能评估。即:

  第一步:不重复抽样将原始数据随机分为k份。
  第二步:每一次挑选其中 1 份作为测试集,剩余k-1份作为训练集用于模型训练。
  第三步:重复第二步k次,每个子集都有一次作为测试集,其余子集作为训练集。在每个训练集上训练后得到一个模型,用这个模型在相应测试集上测试,计算并保存模型的评估指标。
  第四步:计算k组测试结果的平均值作为模型精度的估计,并作为当前k折交叉验证下模型的性能指标。

  优点:分组后取平均减少方差,使得模型对数据划分不敏感。
  缺点:k取值需要尝试。

  分成五份,示例如下所示:

  Sklearn工具包

(3)留一法(leave one out cross validation)

  当k折交叉验证法的k=m,m为样本总数时,称为留一法,即每次的测试集都只有一个样本,要进行m次训练和预测。

  优点:适合数据缺乏时使用
  缺点:计算繁琐,训练复杂度增加。

3、模型评估: 量化预测的质量

  有 3 种不同的 API 用于评估模型预测的质量:

  • Estimator score method(估计器得分的方法): Estimators(估计器)有一个 score(得分) 方法,为其解决的问题提供了默认的 evaluation criterion (评估标准)。 在这个页面上没有相关讨论,但是在每个 estimator (估计器)的文档中会有相关的讨论。
  • Scoring parameter(评分参数): Model-evaluation tools (模型评估工具)使用 cross-validation (如 model_selection.cross_val_score 和 model_selection.GridSearchCV) 依靠 internal scoring strategy (内部 scoring(得分) 策略)。这在 scoring 参数: 定义模型评估规则 部分讨论。
  • Metric functions(指标函数)metrics 模块实现了针对特定目的评估预测误差的函数。这些指标在以下部分部分详细介绍 分类指标多标签排名指标回归指标 和 聚类指标 。

(1)cross_val_score函数

  使用交叉检验最简单的方法是在估计器上调用cross_val_score函数。该函数可返回交叉验证每次运行的评分数组。

def cross_val_score(estimator, X, y=None, *, groups=None, scoring=None,
                    cv=None, n_jobs=None, verbose=0, fit_params=None,
                    pre_dispatch='2*n_jobs', error_score=np.nan):

  参数:

  • estimator:数据对象
  • X:数据
  • y:预测数据
  • scoring:定义模型评估规则
  • cv:交叉验证生成器或可迭代的次数
  • n_jobs:同时工作的cpu个数(-1代表全部)
  • verbose:详细程度
  • fit_params:传递给估计器的拟合方法的参数
  • pre_dispatch:控制并行执行期间调度的作业数量。减少这个数量对于避免在CPU发送更多作业时CPU内存消耗的扩大是有用的。该参数可以是:
  • 没有,在这种情况下,所有的工作立即创建并产生。将其用于轻量级和快速运行的作业,以避免由于按需产生作业而导致延迟
  • 一个int,给出所产生的总工作的确切数量
  • 一个字符串,给出一个表达式作为n_jobs的函数,如'2 * n_jobs'

  参数介绍详见:https://blog.****.net/marsjhao/article/details/78678276

 

 

3、SciKit-learn代码实现