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

网友评论