精华内容
下载资源
问答
  • 交叉检验python
    2022-04-03 00:16:04

    介绍:

    交叉验证_百度百科

    时序算法模型的交叉验证:

    需求:我们在进行机器学习算法,为了保能够得到可靠稳定的模型,通常需要用到交叉验证法来对模型进行验证。常见的交叉验证形式有Holdout验证,K-fold验证,留一验证等。

    与其他机器学习算法不同,时序算法由于数据具有前后关系,因此使用KFold方法无法满足要求,本文将介绍一种利用sklearn库中的TimeSeriesSplit方法,以下是以LSTM模型预测股票数据为例子,采用交叉验证法的具体代码实现。

    交叉验证法:

    import pandas as pd
    import numpy as np 
    import matplotlib.pyplot as plt
    from sklearn.preprocessing import MinMaxScaler
    from keras.models import Sequential
    from keras.layers import LSTM,Dense,Dropout,Bidirectional,Activation
    from keras.optimizers import Adam
    
    
    stock = pd.DataFrame(pd.read_csv('stock2.csv'))
    # 完整的数据集,
    # 交叉验证我们需要先根据股票数据根据time_stamp,得到全部的数据集;
    # 这里的做法和你上面的基本类似
    scaler = MinMaxScaler(feature_range=(0, 1))  
    scaled_data = scaler.fit_transform(stock)
    X, Y = [], []
    print(scaled_data)
    # 训练集
    #print(scaled_data.shape)
    #print(scaled_data[1, 3])
    for i in range(time_stamp, len(stock)):
        X.append(scaled_data[i - time_stamp:i])
        Y.append(scaled_data[i,3])
    
    X, Y = np.array(X), np.array(Y)
    
    # 每一个数据集需要有一个单独的模型去训练,因此定义一个产生lstm模型的函数
    def build_model(epochs = 50,batch_size = 16):
        # 超参数
        # LSTM 参数: return_sequences=True LSTM输出为一个序列。默认为False,输出一个值。
        # input_dim:输入单个样本特征值的维度
        # input_length:输入的时间点长度
        model = Sequential()
        model.add(Bidirectional(LSTM(units=100, return_sequences=True, input_dim=x_train.shape[-1],input_length=x_train.shape[1])))
        model.add(Dropout(0.5))
    
        model.add(LSTM(units=80))
        model.add(Dropout(0.5))
    
        model.add(Dense(50))
        #model.add(Activation('tanh'))
        model.add(Dense(1))
    
        # model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(0.01))
        model.compile(loss='mean_squared_error', optimizer=Adam(lr = 0.1))
        return model
    
    # 导入sklearn库中用于时序模型K折扣交叉验证的TimeSeriesSplit
    from sklearn.model_selection import KFold
    from sklearn.model_selection import TimeSeriesSplit
    
    
    tscv=TimeSeriesSplit(gap=0, max_train_size=None, n_splits=5, test_size=None)
    
    rmse_list=[]  # 勇于保存每次的测试误差
    
    # 遍历,每一次取出对应的训练和测试集的index
    for kfold, (train_index, train_index) in enumerate(tscv.split(X)):
        print('train_index', train_index, 'test_index', test_index)
        # 根据索引得到对应的训练集和测试集
        train_X, train_y = X[train_index], Y[train_index]
        test_X, test_y = X[test_index], Y[test_index]
        # 建立模型并训练
        model=build_model(epochs = 5,batch_size = 128)
        history = model.fit(train_X, train_y, epochs=epochs, batch_size=batch_size,validation_split=0.1,verbose=2)
        # 计算测试集误差
        test_pred = model.predict(test_X)
        scaler.fit_transform(pd.DataFrame(test['Close'].values))
        test_pred = scaler.inverse_transform(test_pred)
        test_y = scaler.inverse_transform([test_y])
        rmse = np.sqrt(np.mean(np.power((test_y - test_pred), 2)))
        rmse_list.append(rmse)
        print('rmse of %d fold=%.4f'%(kfold,rmse))
    
    # 总的误差为每次误差的均值
    print('average rmse:',np.mean(rmse_list))

    以下是sklearn官方给的一个例子:

    >>> import numpy as np
    >>> from sklearn.model_selection import TimeSeriesSplit
    >>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
    >>> y = np.array([1, 2, 3, 4, 5, 6])
    >>> tscv = TimeSeriesSplit()
    >>> print(tscv)
    TimeSeriesSplit(gap=0, max_train_size=None, n_splits=5, test_size=None)
    >>> for train_index, test_index in tscv.split(X):
    ...     print("TRAIN:", train_index, "TEST:", test_index)
    ...     X_train, X_test = X[train_index], X[test_index]
    ...     y_train, y_test = y[train_index], y[test_index]
    TRAIN: [0] TEST: [1]
    TRAIN: [0 1] TEST: [2]
    TRAIN: [0 1 2] TEST: [3]
    TRAIN: [0 1 2 3] TEST: [4]
    TRAIN: [0 1 2 3 4] TEST: [5]
    >>> # Fix test_size to 2 with 12 samples
    >>> X = np.random.randn(12, 2)
    >>> y = np.random.randint(0, 2, 12)
    >>> tscv = TimeSeriesSplit(n_splits=3, test_size=2)
    >>> for train_index, test_index in tscv.split(X):
    ...    print("TRAIN:", train_index, "TEST:", test_index)
    ...    X_train, X_test = X[train_index], X[test_index]
    ...    y_train, y_test = y[train_index], y[test_index]
    TRAIN: [0 1 2 3 4 5] TEST: [6 7]
    TRAIN: [0 1 2 3 4 5 6 7] TEST: [8 9]
    TRAIN: [0 1 2 3 4 5 6 7 8 9] TEST: [10 11]
    >>> # Add in a 2 period gap
    >>> tscv = TimeSeriesSplit(n_splits=3, test_size=2, gap=2)
    >>> for train_index, test_index in tscv.split(X):
    ...    print("TRAIN:", train_index, "TEST:", test_index)
    ...    X_train, X_test = X[train_index], X[test_index]
    ...    y_train, y_test = y[train_index], y[test_index]
    TRAIN: [0 1 2 3] TEST: [6 7]
    TRAIN: [0 1 2 3 4 5] TEST: [8 9]
    TRAIN: [0 1 2 3 4 5 6 7] TEST: [10 11]

    更多相关内容
  • python实现交叉验证

    2020-07-11 11:01:24
    实现数据的交叉验证划分。 对于带标签的所有数据data.csv,其中最后一列为标签,将该数据划分为训练集train_i.csv和测试集test_i.csv。其中i表示的是第i折数据。
  • Python实现K折交叉验证

    千次阅读 2022-05-09 23:17:32
    训练集 ​  训练集(Training ...n_splits = 5,表示进行5折交叉验证,分别计算每一次的准确率,最后求得平均准确率 参考自:训练集、验证集、测试集(附:分割方法+交叉验证) - 云+社区 - 腾讯云 (tencent.com)

    训练集

    ​  训练集(Training Dataset)是用来训练模型使用的,在机器学习的7个步骤中,训练集主要在训练阶段使用。

    OJLhb6.png

    验证集

      当我们的模型训练好之后,我们并不知道模型表现的怎么样,这个时候就可以使用验证集(Validation Dataset)来看看模型在新数据(验证集和测试集是不用的数据)上的表现如何。同时通过调整超参数,让模型处于最好的状态。

      验证集有2个主要的作用:

        ①评估模型效果,为了调整超参数而服务

        ②调整超参数,使得模型在验证集上的效果最好

      验证集不像训练集和测试集,它是非必需的。如果不需要调整超参数,就可以不使用验证集,直接用测试集来评估效果。验证集评估出来的效果并非模型的最终效果,主要是用来调整超参数的,模型最终的效果以测试集的评估结果为准。

    OJOBQA.png

    测试集

      我们通过测试集(Test Dataset)来做最终的评估。通过测试集的评估,我们会得到一些最终的评估指标:准确率、精确率、召回率、F1值等。

      三种数据集之间的关系好比:训练集相当于上课学知识;验证集相当于课后的练习题,用来纠正和强化学到的知识;测试集相当于期末考试,用来最终评估学习效果的。

    数据划分

    1. 对于小规模样本集(几万量级),常用的分配比例是 60% 训练集、20% 验证集、20% 测试集
    2. 对于大规模样本集(百万级以上),只要验证集和测试集的数量足够即可,例如有 100w 条数据,那么留 1w 验证集,1w 测试集即可。1000w 的数据,同样留 1w 验证集和 1w 测试集
    3. 超参数越少,或者超参数很容易调整,那么可以减少验证集的比例,更多的分配给训练集

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

      静态的“留出法”对数据的划分方式比较敏感,有可能不同的划分方式得到了不同的模型。“k 折交叉验证”是一种动态验证的方式,这种方式可以降低数据划分带来的影响。具体步骤如下:

    • 将数据集分为训练集和测试集,将测试集放在一边
    • 将训练集分为 k 份
    • 每次使用 k 份中的 1 份作为验证集,其他全部作为训练集
    • 通过 k 次训练后,我们得到了 k 个不同的模型
    • 评估 k 个模型的效果,从中挑选效果最好的超参数
    • 使用最优的超参数,然后将 k 份数据全部作为训练集重新训练模型,得到最终模型

    OJvEqI.png

    代码

    from sklearn.model_selection import KFold
    
    kf = KFold(n_splits = 5, shuffle=True, random_state=0)
    for train_index, test_index in kf.split(data):
        clt = model.fit(data[train_index], four_label[train_index])
        curr_score = curr_score + clt.score(data[test_index], four_label[test_index])
        print(clt.score(data[test_index], four_label[test_index]))
    
    avg_score = curr_score / 5
    print("平均准确率为:", avg_score)
    

    其中data为训练集数据,four_label为标签。n_splits = 5,表示进行5折交叉验证,分别计算每一次的准确率,最后求得平均准确率

    参考自:训练集、验证集、测试集(附:分割方法+交叉验证) - 云+社区 - 腾讯云 (tencent.com)

    展开全文
  • python基础)交叉验证

    千次阅读 2021-08-02 22:37:58
    这块主要有三种方式:简单交叉验证(HoldOut检验)、k折交叉验证(k-fold交叉验证)、自助法。 简单交叉验证 方法:将原始数据集随机划分成训练集和验证集两部分。比如说,将样本按照70%~30%的比例分成两部分,...

    K折验证交叉验证

    总的来说,交叉验证既可以解决数据集的数据量不够大问题,也可以解决参数调优的问题。这块主要有三种方式:简单交叉验证(HoldOut检验)、k折交叉验证(k-fold交叉验证)、自助法。

    简单交叉验证

    方法:将原始数据集随机划分成训练集和验证集两部分。比如说,将样本按照70%~30%的比例分成两部分,70%的样本用于训练模型;30%的样本用于模型验证。
    缺点:(1)数据都只被所用了一次,没有被充分利用
               (2)在验证集上计算出来的最后的评估指标与原始分组有很大关系。

    k折交叉验证

    为了解决简单交叉验证的不足,提出k-fold交叉验证。

    1、首先,将全部样本划分成k个大小相等的样本子集;
    2、依次遍历这k个子集,每次把当前子集作为验证集,其余所有样本作为训练集,进行模型的训练和评估;
    3、最后把k次评估指标的平均值作为最终的评估指标。在实际实验中,k通常取10.

    举个例子:这里取k=10,如下图所示:
    (1)先将原数据集分成10份
    (2)每一将其中的一份作为测试集,剩下的9个(k-1)个作为训练集
    此时训练集就变成了k * D(D表示每一份中包含的数据样本数)

    (3)最后计算k次求得的分类率的平均值,作为该模型或者假设函数的真实分类率

    自助法

    自助法是基于自助采样法的检验方法。对于总数为n的样本合集,进行n次有放回的随机抽样,得到大小为n的训练集。
    n次采样过程中,有的样本会被重复采样,有的样本没有被抽出过,将这些没有被抽出的样本作为验证集,进行模型验证。




    API

    cross_val_score 参数设置

    sklearn.model_selection.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: 交叉验证最重要的就是他的验证方式,选择不同的评价方法,会产生不同的评价结果。具体可用哪些评价指标,官方已给出详细解释,链接:https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter
    • cv: 交叉验证折数或可迭代的次数
    • n_jobs: 同时工作的cpu个数(-1代表全部)
    • verbose: 详细程度
    • fit_params: 传递给估计器(验证算法)的拟合方法的参数
    • pre_dispatch: 控制并行执行期间调度的作业数量。减少这个数量对于避免在CPU发送更多作业时CPU内存消耗的扩大是有用的。该参数可以是:

    没有,在这种情况下,所有的工作立即创建并产生。将其用于轻量级和快速运行的作业,以避免由于按需产生作业而导致延迟

    一个int,给出所产生的总工作的确切数量

    一个字符串,给出一个表达式作为n_jobs的函数,如’2 * n_jobs

    • error_score: 如果在估计器拟合中发生错误,要分配给该分数的值(一般不需要指定)

    cross_validate(参考:sklearn之交叉验证 - 知乎 (zhihu.com)

    KFold及StratifiedKFold主要区别及函数参数

    KFold交叉采样

    将训练/测试数据集划分n_splits个互斥子集,每次只用其中一个子集当做测试集,剩下的(n_splits-1)作为训练集,进行n_splits次实验并得到n_splits个结果。
    注:对于不能均等分的数据集,前n_samples%n_spllits子集拥有n_samples//n_spllits+1个样本,其余子集都只有n_samples//n_spllits个样本。(例10行数据分3份,只有一份可分4行,其他均为3行)

    sklearn.model_selection.KFold(n_splits=3,shuffle=False,random_state=None)
    
    
    • n_splits:表示将数据划分几等份
    • shuffle:在每次划分时,是否进行洗牌

    若为False,其效果相当于random_state为整数(含零),每次划分的结果相同

    若为True,每次划分的结果不一样,表示经过洗牌,随机取样的

    • random_state:随机种子数,当设定值(一般为0)后可方便调参,因为每次生成的数据集相同
    • StratifiedKFold分层采样,用于交叉验证:与KFold最大的差异在于,StratifiedKFold方法是根据标签中不同类别占比来进行拆分数据的。

    注:RepeatedKFold会重复KFold n次。

    StratifiedKFold

    分层采样,用于交叉验证:与KFold最大的差异在于,StratifiedKFold方法是根据标签中不同类别占比来进行拆分数据的,确保训练集,测试集中各类别样本的比例与原始数据集中相同。

    用法类似Kfold。

    sklearn.model_selection.StratifiedKFold(n_splits=3,shuffle=False,random_state=None)
    
    

    注:RepeatedStratifiedKFold也是重复Stratified K-Fold n次,每次用不同的随机数

    展开全文
  • K-fold交叉验证(python版)

    千次阅读 2020-11-01 15:40:16
    k-fold交叉验证 sklearn可以实现训练集交叉验证划分训练集和验证集 这里提供一个原创版本。 class My_cv_iterator(): # 自写交叉验证 def __init__(self,data,label,cv_num): ''' data :输入特征 label : 输入...

    k-fold交叉验证

    sklearn可以实现训练集交叉验证划分训练集和验证集
    这里提供一个原创版本。

    class My_cv_iterator(): # 自写交叉验证
        def __init__(self,data,label,cv_num):
            '''
            data :输入特征
            label : 输入标签
            cv_num : k-fold 折数
    
            return
            返回k-fold的iterator 包括step, traindata, validdata
    
            e.g
            for step, train, valid in My_cv_iterator()
            '''
            self.data = data
            self.label = label
            self.cv_num = cv_num
            train = np.hstack((self.data, self.label.reshape(-1,1)))
            m,n = train.shape
            ratio = 1/self.cv_num
            every_fold_num = int(m*ratio)
            self.train_fold = []
            self.valid_fold = []
            for i in range(self.cv_num):
                valid_data = train[every_fold_num*i:every_fold_num*(i+1)]
                aset = set([tuple(x) for x in train])
                bset = set([tuple(x) for x in valid_data])
                train_data = np.array([x for x in aset-bset])
                self.valid_fold.append(valid_data)
                self.train_fold.append(train_data)     
            self.cur = 0 # 迭代器当前迭代次数
        def __iter__(self):
            return self
        def __next__(self):
            if self.cur >= len(self.train_fold):
                raise StopIteration
            cur_train_data = self.train_fold[self.cur]
            cur_valid_data = self.valid_fold[self.cur]
            self.cur += 1
            return self.cur, cur_train_data,cur_valid_data
    
    
    展开全文
  • 什么是卡方检验卡方检验是一种用途很广的基于卡方分布的假设检验方法,其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题。其主要应用于分类变量,根据样本数据推断总体分布与期望分布是否有显著...
  • 主要介绍了详解python实现交叉验证法与留出法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 这篇文章介绍的内容是关交叉验证以及python代码实现 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下模型选择的两种方法:正则化(典型方法)、交叉验证。这里介绍交叉验证及其python代码实现。交叉...
  • 文章目录前言一、XGBoost.cv源码二、sklearn...中本文将会介绍基于XGBoost自带的交叉验证方法和通过sklearn的划分数据集的交叉验证方法。 一、XGBoost.cv源码 XGBoost.cv,其中cv是cross validtion的缩写,即交叉验证。
  • 深度盘点:8000字详细介绍 Python 中的 7 种交叉验证方法
  • 本文需要用到的Python库:PandasScipy.statsStatsmodels在《用Python统计推断——交叉表篇(上:crosstab与热图)》中,我们介绍了如何构建交叉表并对其可视化。本文,我们将介绍如何检验交叉表的两个分类变量,是...
  • python数据分析 - 卡方检验

    千次阅读 2022-04-20 14:21:23
    独立性卡方检验与一致性卡方检验2.1 独立性卡方检验2.1.1 python独立性卡方检验2.2 一致性卡方检验3.正态分布卡方检验3.1 python正态分布卡方检验 1.卡方检验 卡方检验也属于假设检验的一种即可以分析一个变量的拟合...
  • 交叉验证之留一交叉验证python代码

    千次阅读 2021-05-25 15:03:33
    从csv文件中读取数据,由于样本量只有30,因此选择采用留一交叉验证方法,实验了一圈,发现一些问题在网上没有找到很好地解决办法,特记录如下,方便其他人使用。 主要代码如下:使用LeaveOneOut()将数据的索引分成...
  • Python 卡方检验

    2020-12-01 14:15:35
    卡方检验是一种用途很广的计数...(更多参考:卡方检验、卡方分布)不讲过多理论,主要使用 python 实现卡方验证。之前对于元素/特征/属性 异常值的选择情况,可以使用直方图、箱型图、Z分数法等筛选。如 Python 探索...
  • 常用交叉验证法包括K折叠交叉验证法(K-fold cross validation)、随机拆分交叉验证法(shuffle-split cross validation)、挨个儿试试法(leave-one-out)。 K折叠交叉验证法(K-fold cross validation) K折叠交叉...
  • 五折交叉验证/K折交叉验证, python代码到底怎么写

    万次阅读 多人点赞 2021-04-28 19:30:35
    五折交叉验证: 把数据平均分成5等份,每次实验拿一份做测试,其余用做训练。实验5次求平均值。如上图,第一次实验拿第一份做测试集,其余作为训练集。第二次实验拿第二份做测试集,其余做训练集。依此类推~ 但是,...
  • python 机器学习 交叉验证
  • 医药统计项目QQ:231469242分类变量检验方法卡方分布绘图如果多个符合正态分布的独立随机变量z1,z2,z3.....zk,z1+z2+z3+....z_k呈现卡方分布,自由度k.有几个正态分布相加,就有几个自由度# -*- coding: utf-8 -*-#...
  • 看了网上的很多k-fold的程序,发现都是机器学习方面的数据操作,而非文件操作(一位不愿意透露姓名的资深大冤种本着“能花钱就不动脑”的原则还付费了几个程序,全是bug,我真的会谢)。 然后自己写了一个k-fold...
  • 1. 读取数据集defload_data(filename,dataType):return np.loadtxt(filename,delimiter=",",dtype =dataType)defread_data():data= load_data("data2.txt",np.float64)X= data[:,0:-1]y= data[:,-1]return X,y2....
  • K折交叉验证法原理及python实现

    千次阅读 2021-03-03 15:40:56
    本文为原创文章,转载请注明出处!在训练数据的过程或者...1 变形前的K折在遇到K折交叉验证之前,往往使用的是简单交叉验证(hold -out cross validation),也就是从全部的训练数据 D中随机选择 d的样例作为训练集 t...
  • 这是卡方检验独立性有用的地方。Chi-Square检验我们将在1994年查看人口普查数据。具体来说,我们对“性别和“每周工作时间”之间的关系感兴趣。在我们的案例中,每个人只能有一个“性别”,且只有一个工作时间类别。...
  • python实现K折交叉检验实例

    千次阅读 2020-10-20 13:04:22
    最常见的方法就是K折交叉检验。 写一个住房数据案例 # 先把数据分成k个部分,把其中一个部分用作测试集,把其余部分用作训练集以拟合模型 # 模型拟合好之后,使用测试集进行 测试,并计算误差。不断重复这个过程,...
  • 交叉分析是属性间的数据分析。本次实验中我们主要分析离职率(“left”)与各部门(“depar”)之间的关系,各部门之间的离职率是否有明显的差异,使用到的是独立t检验方法。 本篇文章中需要用到的库如下: import ...
  • 介绍模型表现差异很大的...交叉验证的几种常用方法验证集方法留一法交叉验证(LOOCV)k折交叉验证分层k折交叉验证对抗验证时间序列的交叉验证自定义交叉验证技术如何测量模型的偏差方差?为什么模型会失去稳定性?让...
  • 通过手写五折交叉验证+调库,分别用SVM,KNN,RFC实现手写数字书别
  • python使用t检验和F检验验证模型好坏

    千次阅读 2020-09-06 17:24:21
    要在某个指标上对比两个模型的好坏,我们可以直接进行比较,同时为了使比较结果更具说服力,我们可以使用统计检验的方法,即将两个模型分别跑k次,使用t检验比较这两组k个样本的均值、使用F检验比较这两组k个样本的...
  • 下面列出了这些技术方法: HoldOut 交叉验证 K-Fold 交叉验证 分层 K-Fold交叉验证 Leave P Out 交叉验证 留一交叉验证 蒙特卡洛 (Shuffle-Split) 时间序列(滚动交叉验证) 1、HoldOut 交叉验证 在这种交叉验证...
  • 我正在使用交叉验证来评估估算器并避免过度拟合模型.我将数据分成两部分.训练数据和测试数据.这是代码:import numpy as npfrom sklearn import cross_validationfrom sklearn import datasetsfrom sklearn import ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,620
精华内容 3,048
关键字:

交叉检验python