文章目录
一、交叉验证
交叉验证
交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。
k折交叉验证
K折交叉验证,初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10折交叉验证是最常用的。
总的来说,交叉验证既可以解决数据集的数据量不够大问题,也可以解决参数调优的问题。这块主要有三种方式:简单交叉验证(HoldOut检验)、k折交叉验证(k-fold交叉验证)、自助法。该文仅针对k折交叉验证做详解。
1.1 简单交叉验证
方法:将原始数据集随机划分成训练集和验证集两部分。比如说,将样本按照70%~30%的比例分成两部分,70%的样本用于训练模型;30%的样本用于模型验证。
缺点:
(1)数据都只被所用了一次,没有被充分利用
(2)在验证集上计算出来的最后的评估指标与原始分组有很大关系。
1.2 简单交叉验证
为了解决简单交叉验证的不足,提出k-fold交叉验证。
1、首先,将全部样本划分成k个大小相等的样本子集;
2、依次遍历这k个子集,每次把当前子集作为验证集,其余所有样本作为训练集,进行模型的训练和评估;
3、最后把k次评估指标的平均值作为最终的评估指标。在实际实验中,k通常取10.
举个例子:这里取k=10,如下图所示:
(1)先将原数据集分成10份
(2)每一次将其中的一份作为测试集,剩下的9个(k-1)个作为训练集
此时训练集就变成了k * D(D表示每一份中包含的数据样本数)
(3)最后计算k次求得的分类率的平均值,作为该模型或者假设函数的真实分类率
交叉验证的方式,要简单于数学理解,而且具有说服性。需要谨记一点,当样本总数过大,若使用留一法时间开销极大。
1.3 自助法
自助法是基于自助采样法的检验方法。对于总数为n的样本合集,进行n次有放回的随机抽样,得到大小为n的训练集。
n次采样过程中,有的样本会被重复采样,有的样本没有被抽出过,将这些没有被抽出的样本作为验证集,进行模型验证。
cross_val_score参数设置
from sklearn.model_selection import cross_val_score
cross_val_score(estimator, X, y=None, groups=None, scoring=None,
cv='warn', n_jobs=None, verbose=0, fit_params=None, pre_dispatch='2*n_jobs',
error_score='raise-deprecating')
参数 | 解释 |
---|---|
estimator | 需要使用交叉验证的算法 |
X | 输入样本数据 |
y | 样本标签 |
groups | 将数据集分割为训练/测试集时使用的样本的组标签(一般用不到) |
scoring | 交叉验证最重要的就是他的验证方式,选择不同的评价方法,会产生不同的评价结果 |
cv | 交叉验证折数或可迭代的次数 |
n_jobs | 同时工作的cpu个数(-1代表全部) |
verbose | 详细程度 |
fit_params | 传递给估计器(验证算法)的拟合方法的参数 |
pre_dispatch | 控制并行执行期间调度的作业数量。减少这个数量对于避免在CPU发送更多作业时CPU内存消耗的扩大是有用的(该参数可以是:没有,在这种情况下,所有的工作立即创建并产生。将其用于轻量级和快速运行的作业,以避免由于按需产生作业而导致延迟:一个int,给出所产生的总工作的确切数量;一个字符串,给出一个表达式作为n_jobs的函数,如’2 * n_jobs) |
error_score | 如果在估计器拟合中发生错误,要分配给该分数的值(一般不需要指定) |
二、交叉验证用到的函数说明
2.1 StratifiedKFold参数
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=2019)#shuffle:是否在每次分割之前打乱顺序
n_splits:折叠次数,默认为3,至少为2。
shuffle:是否在每次分割之前打乱顺序。
random_state:随机种子,在shuffle==True时使用,默认使用np.random。
StratifiedKFold用法类似Kfold,但是它是分层采样,确保训练集,验证集中各类别样本的比例与原始数据集中相同。因此一般使用StratifiedKFold。
2.2 split(X, y)函数参数
split(x, y)
X:array-like,shape(n_sample,n_features),训练数据集。
y:array-like,shape(n_sample),标签。
返回值:训练集数据的index与验证集数据的index。
2.3 concat()数据合并参数
concat方法相当于数据库中的全连接(UNION ALL),可以指定按某个轴进行连接,也可以指定连接的方式join(outer,inner 只有这两种)。与数据库不同的是concat不会去重,要达到去重的效果可以使用drop_duplicates方法
#pd.concat([train, test], axis=0, ignore_index=True)
concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None,
names=None, verify_integrity=False, copy=True)
参数 | 说明 |
---|---|
objs | Series,DataFrame或Panel对象的序列或映射。 |
axis | 需要合并链接的轴,0是行,1是列 |
join | ‘inner’,‘outer’,默认为“outer”。如何处理其他轴上的索引。outer为并集,inner为交集 |
ignore_index | boolean,default False。如果为True,请不要使用并置轴上的索引值。结果轴将被标记为0,…,n-1。如果要连接其中并置轴没有有意义的索引信息的对象,这将非常有用。注意,其他轴上的索引值在连接中仍然受到尊重。 |
join_axes | Index对象列表。用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑 |
keys | 序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引,应该使用元组。 |
levels | 序列列表,默认值无。用于构建MultiIndex的特定级别(唯一值)。否则,它们将从键推断。 |
names | list,default无。结果层次索引中的级别的名称。 |
verify_integrity | boolean,default False。检查新连接的轴是否包含重复项。这相对于实际的数据串联可能是非常昂贵的。 |
copy | boolean,default True。如果为False,请勿不必要地复制数据。 |
2.4 iloc()函数,通过行号来取行数据
import numpy as np
import pandas as pd
#创建一个Dataframe
data1=pd.DataFrame(np.arange(16).reshape(4,4),columns=list('ABCD'))
print(data1)
print(data1.iloc[0])# 按索引index取行值
print(data1.loc[:,'A'])# loc按属性值取值
print(data1.iloc[:,[0]])#按索引index取列值
2.5 argmax 预测类别
np.argmax(a, axis=None)
a是一个矩阵,当axis=None时,返回的是矩阵中最大的,当axis=0时,返回的是矩阵中各竖列的最大,当axis=1时,返回的是矩阵中个横排的最大,注意返回的是index,不是那个值。
在模型预测中,当类别是从0开始的序号,分类器返回的结果为各个类别的概率,使用argmax函数结果即是预测的类别。
2.6 f1_score 评价函数
f1_score(y_ture,y_pred,average = 'weighted')
y_ture:一维数组或标签,表示正确的标签
y_pred:分类器返回的估计标签
average:
多分类需要此标签,如果设为None,将返回各个类的分数,否者对数据进行平均,默认参 数为binary’,仅当target是二进制时才适用。
多标签时:‘weighted’,按加权(每个标签的真实实例数)平均,这可以解决标签不平衡问题,可能导致f1分数不在precision于recall之间。‘micro’,总体计算f1值,及不分类计算。‘macro’:计算每个标签的f1值,取未加权平均值,不考虑标签不平衡。
三、StratifiedKFold 交叉验证代码
from sklearn.model_selection import StratifiedKFold
from datetime import datetime
import lightgbm as lgb
from sklearn.metrics import f1_score
from sklearn.model_selection import train_test_split
from imblearn.un