美文网首页
机器学习函数库——Scikit-learn

机器学习函数库——Scikit-learn

作者: 冰度猎魂 | 来源:发表于2018-12-04 22:42 被阅读0次

    Scikit-learn的数据集

    基本的自带数据集:

    序号 数据集名称 主要调用方式 数据描述
    1 鸢尾花数据集 Load_iris() 用于多分类任务的数据集
    2 波士顿房价数据集 Load_boston() 经典的用于回归任务的数据集
    3 糖尿病数据集 Load_diabetes() 经典的用于回归任务的数据集
    4 手写数字数据集 Load_digits() 用于多分类任务的数据集
    5 乳腺癌数据集 Load_breast_cancer() 简单经典的用于二分类任务的数据集
    6 体能训练数据集 Load_linnerud() 经典的用于多变量回归任务的数据集

    以鸢尾花数据集为例,鸢尾花数据集采集的是鸢尾花的测量数据及其所属的类别。测量数据包括萼片长度、萼片宽度、花瓣长度、花瓣宽度。类别共分为3类:Iris Setosa,Iris Versicolour, Iris Virginica。该数据集可用于多分类问题。

    from sklearn.datasets import load_iris
    iris = load_iris()
    print(iris.data)
    
    运行结果
    print(iris.target)  # 输出真实标签
    print(len(iris.target))  # 150个样本 每个样本4个特征
    print(iris.data.shape)
    print(iris.target_names)  # 输出数据标签的名字
    
    运行结果

    Scikit-learn 的数据集的划分

    在模型训练时,一般会把数据集划分成训练集、验证集合测试集,其中训练集用来估计模型,验证集用来确定网络结构或控制模型复杂程度的参数,而测试集则检验最终选择最优模型的性能如何。

    (1)使用train_test_split对数据集进行划分

    Scikit-learn库对数据集进行划分需要使用sklearn.model_selection函数,该函数的train_test_split是交叉验证中常用的函数,功能是从样本中随机按比例选取train_data和test_data,形式为:

    X_train, X_test, y_train, y_test = 
    train_test_split(train_data, train_target, test_size=0.4, random_state=0)
    

    其中常用参数如下:

    1. train_data:所要划分的样本特征集。
    2. train_target:所要划分的样本结果。
    3. test_size:样本占比,如果是整数就是样本的数量。
    4. tandom_state:是随机数的种子。(随机数种子其实就是该组随机数的编号,在需要重复试验时,保证得到一组一样的随机数。例如,每次都填1,在其他参数一样的情况下得到的随机数组是一样的。但填0或不填,每次都会不一样。随机数的产生取决于种子,随机数和种子之间的关系遵从两个规则,即种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。)
    5. X_train:是生成的训练集的特征。
    6. X_text:是生成的测试集的特征。
    7. y_train:是生成的训练集的标签。
    8. y_test:是生成的测试集的标签。

    下面就通过一个简单的实例来看一下如何使用这个函数。这个函数将数据集快速打乱,形成训练集和测试集。代码如下:

    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.datasets import load_iris
    from sklearn import svm
    
    iris = load_iris()
    iris.data.shape, iris.target.shape
    X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=.4, random_state=0)
    X_train.shape, y_train.shape
    X_test.shape, y_test.shape
    iris.data[:5]
    X_train[:5]
    
    运行结果

    可以发现数据集已经打乱。

    (2)对数据集进行指定次数的交叉验证并为每次验证效果进行测评。

    使用cross_val_score对数据集进行制定次数的交叉验证并为每次验证效果进行评测。代码如下:

    from sklearn.model_selection import cross_val_score
    clf = svm.SVC(kernel='linear', C=1)
    scores = cross_val_score(clf, iris.data, iris.target, cv=5)
    scores
    scores.mean()
    

    这个代码使用SVM模型进行验证,如果要使用其他模型,只需替换模型名称,在cross_val_score中当cv指定为int类型时,默认使用KFold或StratifiedKFold进行数据集打乱。
    本例中cv=5表示进行5折交叉验证,程序运行结果如下所示:


    运行结果

    上面代码使用过程中,除使用默认交叉验证方式外,可以对交叉验证方式进行指定,如验证次数,训练集测试集划分比例等。例如:

    from sklearn.model_selection import ShuffleSplit
    n_samples = iris.data.shape[0]
    cv = ShuffleSplit(n_splits=3, test_size=.3, random_state=0)
    cross_val_score(clf, iris.data, iris.target, cv=cv)
    

    上面代码中,使用ShuffleSplit将数据集打乱,n_splits表示将数据集分三次,每次训练集大小占原数据集的70%。

    (3)K折交叉验证

    K折交叉验证是将数据集分成K份的官方给定方案,所谓K折就是讲数据集通过K次分割,使所有数据既在训练集出现过,又在测试集出现过,当然,每次分割中不会有重叠。相当于无放回抽样。

    from sklearn.model_selection import KFold
    X = ['a', 'b', 'c', 'd', 'e', 'f']
    kf = KFold(n_splits=2)
    for train, test in kf.split(X):
        print(train, test)
        print(np.array(X)[train], np.array(X)[test])
        print('\n')
    

    上面这段代码首先引入KFold函数,然后指定参数n_splits=2,即2折交叉验证,最后显示数据查分的结果,如下图所示。


    运行结果
    (4)LeaveOneOut验证

    LeaveOneOut其实就是KFold的一个特例,也称留一法。一般用于数据集数目较少时。例如,N个样本采用LeaveOneOut验证法,就是将样本打乱,然后均匀分成N份,轮流选择其中N-1份训练,剩余的一份做验证,计算预测误差平方和,最后把N次的预测误差平方和做平均作为选择最优模型结构的依据。

    from sklearn.model_selection import LeaveOneOut
    X = ['a', 'b', 'c', 'd', 'e', 'f']
    loo = LeaveOneOut()
    for train, test in loo.split(X):
        print(train, test)
        print(np.array(X)[train], np.array(X)[test])
    

    上面代码的运行结果如下所示,可以看出数据集个数为6个,每次训练集为5个数据,验证集只有1个数据,反复拆分5次。


    运行结果

    相关文章

      网友评论

          本文标题:机器学习函数库——Scikit-learn

          本文链接:https://www.haomeiwen.com/subject/xsivcqtx.html