美文网首页sklearn
sklearn-用sklearn.model_selection

sklearn-用sklearn.model_selection

作者: 花讽院_和狆 | 来源:发表于2020-03-11 15:41 被阅读0次

    通常来说区分样本的训练集和测试集,也是比较简单的,训练集:测试集为7:3或者8:2都可以,当存在交叉验证集的时候(通常样本比较多的时候可以考虑分为三层,避免出现用测试集优化模型之后得到的结果有倾向的情况发生),可以是6:2:2。

    这样的话,我们得到一个DataFrame之后,给定一定范围内的随机数,用索引去匹配,即可得到随机打乱的DataFrame,举个栗子:

    import pandas as pd
    import random
    import math
    
    df :pd.DataFrame = pd.read_excel(r"model.xls", header=0)
    
    list1 = random.sample(df.index.tolist(), math.floor(len(df)*0.8))#取总样本数的0.8为训练集,random.sample可以随机从list中取不同个数的值
    ran_se = pd.Series(list1, name='ran_se', index=list1)#让索引和列同值,方便合并
    
    train
    _x = pd.merge(df, ran_se, left_index=True, right_index=True)#用索引匹配进行合并
    #训练集剩下的就是测试集
    test_x = df.drop(index=train_x.index)
    test_x  
    
    
    

    可以看到,这样的情况下是可以按照一定的比例把数值分开的(上面的代码里忘记加种子了),但是也有一点点麻烦,毕竟都要手动处理。

    那么在sklearn里面,有一个函数可以解决这个问题,自动选出训练集,训练标签,测试集,测试标签。
    sklearn.model_selection.train_test_split

    看一下这个函数的官方文档:
    作用:将数组或矩阵拆分为随机训练子和测试子集

    参数
    *array:具有相同长度的,带索引的序列,可以是lists, numpy arrays, scipy-sparse matrices 和dataframes ,代表要划分的矩阵(第一个是特征矩阵,第二个是标签矩阵)

    test_size(default=None):当是float类型时,代表测试集的比例,是int类型时,代表测试集的个数,是None时,取1-训练集的比例(总数-训练集的个数),训练集参数也为None时,默认为0.25

    train_size(default=None):同上,不过这个代表的是训练集,不要弄混了!

    random_state(default=None):如果为int类型,则是一个随机种子,如果是RandomState 实例,则random_state就是随机数生成器,如果为None,则生成器取np.random。

    shuffle(default=False):是否要在拆分数据前随机排列数据,如果这个参数是False,则stratify 参数必须是None。

    stratify(default=None):如果不是None,则数据以分层方式拆分,使用此作为类标签。

    随机种子的概念比较重要,简而言之,可以看作一个给随机数的ID,如果调用了这个ID的随机数,无论怎么运行,结果都是一样的。(可以保证不同时刻运行的随机数是同一序列)

    返回值
    返回的是拆分之后的序列,是一个list,长度是原有数据的二倍。
    可以直接赋值来取得训练集和测试集,顺序分别是train_x, test_x, train_y, test_y,不要记混了。

    得到的训练集和测试集直接拿来用就好了,都是DataFrame或者Series。

    写一个简单的代码如下:

    import pandas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split
    
    df1 = pd.read_excel(r"model.xls", header=0)
    
    # print(df1[df1.isnull().T.any()])#列出为空的行
    train_df = df1[['电量趋势下降指标','线损指标','告警类指标']]
    test_df = df1['是否窃漏电']
    
    train_x, test_x, train_y, test_y = train_test_split(train_df, test_df, test_size = 0.2, random_state = 0)#自动分为测试集和训练集,注意返回值的顺序
    print(train_x)
    
    

    需要注意的是写进参数的是两个DataFrame,一个是特征,一个是标签,这个在拆分之前就是要分开的。

    这种方法明显比手动去拆分要方便一些,sklearn库中有不少简便的函数,拿来直接用的确能提升不少效率。

    相关文章

      网友评论

        本文标题:sklearn-用sklearn.model_selection

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