• 机器学习算法三之Python机器学习库sklearn简介


    sklearn简介

    scikit-learn是基于Python语言的机器学习库,具有:

    简单高效的数据分析工具
    可在多种环境中重复使用
    建立在Numpy,Scipy以及matplotlib等数据科学库之上
    开源且可商用的-基于BSD许可

    1.目录

    在这里插入图片描述

    2.安装

    Scikit-learn 要求:

    Python (>= 3.5),
    NumPy (>= 1.11.0),
    SciPy (>= 0.17.0),
    joblib (>=0.11).
    Scikit-learn绘图功能(即,函数以“plot_”开头,需要Matplotlib(>= 1.5.1)。一些scikit-learn示例可能需要一个或多个额外依赖项:scikit-image(>= 0.12.3)、panda(>= 0.18.0)。

    如果你已经有一个合适的 numpy 和 scipy版本,安装 scikit-learn 最简单的方法是使用 pip

    pip install -U scikit-learn
    
    • 1

    或者 conda

    conda install scikit-learn
    
    • 1

    升级与卸载

    conda update scikit-learn
    ***
    conda remove scikit-learn
    
    • 1
    • 2
    • 3

    3.快速入门机器学习

    一般来说,一个学习问题通常会考虑一系列 n 个 样本 数据,然后尝试预测未知数据的属性。 如果每个样本是 多个属性的数据(比如说是一个多维记录),就说它有许多“属性”,或称 features(特征) 。

    可以将机器学习分为几大类:

    监督学习无监督学习
    分类、回归聚类、密度估计

    训练集和测试集

    机器学习是从数据的属性中学习,并将它们应用到新数据的过程。 这就是为什么机器学习中评估算法的普遍实践是把数据分割成 训练集(我们从中学习数据的属性)和 测试集 (我们测试这些性质)。

    3.1 加载示例数据集

    scikit-learn 提供了一些标准数据集,例如 用于分类的 irisdigits 数据集 和 波士顿房价回归数据集

    $python
    from sklearn import datasets
    iris=datasets.load_iris()
    digits=datasets.load_digits()
    
    • 1
    • 2
    • 3
    • 4

    加载数据集并查看

    print(digits.data)
    [[  0.   0.   5. ...,   0.   0.   0.]
     [  0.   0.   0. ...,  10.   0.   0.]
     [  0.   0.   0. ...,  16.   9.   0.]
     ...,
     [  0.   0.   1. ...,   6.   0.   0.]
     [  0.   0.   2. ...,  12.   0.   0.]
     [  0.   0.  10. ...,  12.   1.   0.]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    并且 digits.target 表示了数据集内每个数字的真实类别,也就是我们期望从每个手写数字图像中学得的相应的数字标记:

    digits.target
    array([0, 1, 2, ..., 8, 9, 8])
    
    • 1
    • 2

    3.2 学习和预测

    在数字数据集的情况下,任务是给出图像来预测其表示的数字。 我们给出了 10 个可能类(数字 0 到 9)中的每一个的样本,我们在这些类上 拟合 一个 估计器 ,以便能够 预测 未知的样本所属的类。

    在 scikit-learn 中,分类的估计器是一个 Python 对象,它实现了 fit(X, y) 和 predict(T) 等方法。

    估计器的一个示例类 sklearn.svm.SVC ,实现了 支持向量分类 。 估计器的构造函数以相应模型的参数为参数,但目前我们将把估计器视为黑箱即可:

    from sklearn import svm
    clf = svm.SVC(gamma=0.001, C=100.)
    
    • 1
    • 2

    将用于分类的估计器实例命名为 clf
    用 [:-1] Python 语法选择这个训练集,它产生一个包含 digits.data 中除最后一个条目(entry)之外的所有条目的新数组进行训练(学习)

    clf.fit(digits.data[:-1], digits.target[:-1])  
    SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0,
     decision_function_shape='ovr', degree=3, gamma=0.001, kernel='rbf',
     max_iter=-1, probability=False, random_state=None, shrinking=True,
     tol=0.001, verbose=False)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    现在你可以预测新的值

    clf.predict(digits.data[-1:])
    array([8])
    
    • 1
    • 2

    在这里插入图片描述

    3.3 模型持久化

    通过使用 Python 的内置持久化模块(即 pickle )将模型保存:

    from sklearn import svm
    from sklearn import datasets
    clf = svm.SVC()
    iris = datasets.load_iris()
    X, y = iris.data, iris.target
    clf.fit(X, y)  
    SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
     decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
     max_iter=-1, probability=False, random_state=None, shrinking=True,
     tol=0.001, verbose=False)
    
    *****************************保存**********************************************
    import pickle
    s = pickle.dumps(clf)
    clf2 = pickle.loads(s)
    clf2.predict(X[0:1])
    array([0])
    >>> y[0]
    0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在scikit的具体情况下,使用 joblib 替换 pickle( joblib.dump & joblib.load )可能会更有趣,这对大数据更有效,但只能序列化 (pickle) 到磁盘而不是字符串变量:

    from joblib import dump, load
    dump(clf, 'filename.joblib')
    
    ***
    clf=load('filename.joblib')
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.4 类型转换

    除非特别指定,输入将被转换为 float64

    >>> import numpy as np
    >>> from sklearn import random_projection
    
    >>> rng = np.random.RandomState(0)
    >>> X = rng.rand(10, 2000)
    >>> X = np.array(X, dtype='float32')
    >>> X.dtype
    dtype('float32')
    
    >>> transformer = random_projection.GaussianRandomProjection()
    >>> X_new = transformer.fit_transform(X)
    >>> X_new.dtype
    dtype('float64')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.5 再次训练和更新参数

    估计器的超参数可以通过 sklearn.pipeline.Pipeline.set_params 方法在实例化之后进行更新。 调用 fit() 多次将覆盖以前的 fit() 所学到的参数:

    >>> import numpy as np
    >>> from sklearn.datasets import load_iris
    >>> from sklearn.svm import SVC
    >>> X, y = load_iris(return_X_y=True)
    
    >>> clf = SVC()
    >>> clf.set_params(kernel='linear').fit(X, y)  
    SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
      decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
      kernel='linear', max_iter=-1, probability=False, random_state=None,
      shrinking=True, tol=0.001, verbose=False)
    >>> clf.predict(X[:5])
    array([0, 0, 0, 0, 0])
    
    >>> clf.set_params(kernel='rbf', gamma='scale').fit(X, y)  
    SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
      decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',
      max_iter=-1, probability=False, random_state=None, shrinking=True,
      tol=0.001, verbose=False)
    >>> clf.predict(X[:5])
    array([0, 0, 0, 0, 0])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里,估计器被 SVC() 构造之后,默认内核 rbf 首先被改变到 linear ,然后改回到 rbf 重新训练估计器并进行第二次预测。

    3.6 多分类与多标签拟合

    当使用 多类分类器 时,执行的学习和预测任务取决于参与训练的目标数据的格式:

    >>> from sklearn.svm import SVC
    >>> from sklearn.multiclass import OneVsRestClassifier
    >>> from sklearn.preprocessing import LabelBinarizer
    
    >>> X = [[1, 2], [2, 4], [4, 5], [3, 2], [3, 1]]
    >>> y = [0, 0, 1, 1, 2]
    
    >>> classif = OneVsRestClassifier(estimator=SVC(random_state=0))
    >>> classif.fit(X, y).predict(X)
    array([0, 0, 1, 1, 2])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在上述情况下,分类器使用含有多个标签的一维数组训练模型,由于每个样本只对应一个类别标签,因此 predict() 方法可提供相应的多标签预测。分类器也可以通过标签二值化后的二维数组来训练:

    >>> y = LabelBinarizer().fit_transform(y)
    >>> classif.fit(X, y).predict(X)  #0,1,2最多有3类,预测结果就给每个x对应每个类一个预测结果
    array([[1, 0, 0],
           [1, 0, 0],
           [0, 1, 0],
           [0, 0, 0],
           [0, 0, 0]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里, 分类器 fit() 方法在 y 的二维二元标签表示上执行, 每个样本可同时属于两种类别,同时具有两个种类的标签, 所以要使用 LabelBinarizer 将目标向量 y 转化成二值化后的二维数组。在这种情况下, predict() 返回一个多标签预测相应的 二维 数组。

    请注意,第四个和第五个实例返回全零向量,表明它们不能匹配用来训练中的目标标签中的任意一个。使用多标签输出,类似地可以为一个实例分配多个标签:

    >> from sklearn.preprocessing import MultiLabelBinarizer
    >> y = [[0, 1], [0, 2], [1, 3], [0, 2, 3], [2, 4]]
    >> y = MultiLabelBinarizer().fit_transform(y)
    >> classif.fit(X, y).predict(X)  #0,1,2,3,4 最多有5类
    array([[1, 1, 0, 0, 0],
           [1, 0, 1, 0, 0],
           [0, 1, 0, 1, 0],
           [1, 0, 1, 1, 0],
           [0, 0, 1, 0, 1]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这种情况下,用来训练分类器的多个向量被赋予多个标记, MultiLabelBinarizer 用来二值化多个标签产生二维数组并用来训练。 predict() 函数返回带有多个标签的二维数组作为每个实例的结果。

  • 相关阅读:
    php+vue+Elementui大学生心理健康测评网站
    【岛上书店】读后感
    基于信通院 Serverless 工具链模型的实践:Serverless Devs
    从0到1搭建ES集群
    代码随想录算法训练营day22||二叉树part08、● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
    聚已内酯偶联小鼠血清白蛋白/小麦麦清白蛋白;PCL-MSA/RSA(试用说明)
    [Python人工智能] 四十二.命名实体识别 (3)基于Bert+BiLSTM-CRF的中文实体识别万字详解(异常解决中)
    广州蓝景分享—「web前端素材」使用CSS动画效果(上)
    NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065
    大模型部署手记(2)baichuan2+Windows GPU
  • 原文地址:https://blog.csdn.net/yohnyang/article/details/126197221