通常來說區(qū)分樣本的訓(xùn)練集和測(cè)試集,也是比較簡單的精算,訓(xùn)練集:測(cè)試集為7:3或者8:2都可以蹬耘,當(dāng)存在交叉驗(yàn)證集的時(shí)候(通常樣本比較多的時(shí)候可以考慮分為三層欺嗤,避免出現(xiàn)用測(cè)試集優(yōu)化模型之后得到的結(jié)果有傾向的情況發(fā)生),可以是6:2:2累驮。
這樣的話酣倾,我們得到一個(gè)DataFrame之后,給定一定范圍內(nèi)的隨機(jī)數(shù)谤专,用索引去匹配躁锡,即可得到隨機(jī)打亂的DataFrame,舉個(gè)栗子:
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))#取總樣本數(shù)的0.8為訓(xùn)練集置侍,random.sample可以隨機(jī)從list中取不同個(gè)數(shù)的值
ran_se = pd.Series(list1, name='ran_se', index=list1)#讓索引和列同值稚铣,方便合并
train
_x = pd.merge(df, ran_se, left_index=True, right_index=True)#用索引匹配進(jìn)行合并
#訓(xùn)練集剩下的就是測(cè)試集
test_x = df.drop(index=train_x.index)
test_x
可以看到,這樣的情況下是可以按照一定的比例把數(shù)值分開的(上面的代碼里忘記加種子了)墅垮,但是也有一點(diǎn)點(diǎn)麻煩,畢竟都要手動(dòng)處理耕漱。
那么在sklearn里面算色,有一個(gè)函數(shù)可以解決這個(gè)問題,自動(dòng)選出訓(xùn)練集螟够,訓(xùn)練標(biāo)簽灾梦,測(cè)試集,測(cè)試標(biāo)簽妓笙。
sklearn.model_selection.train_test_split
看一下這個(gè)函數(shù)的官方文檔:
作用:將數(shù)組或矩陣拆分為隨機(jī)訓(xùn)練子和測(cè)試子集
參數(shù)
*array:具有相同長度的若河,帶索引的序列,可以是lists, numpy arrays, scipy-sparse matrices 和dataframes 寞宫,代表要?jiǎng)澐值木仃嚕ǖ谝粋€(gè)是特征矩陣萧福,第二個(gè)是標(biāo)簽矩陣)
test_size(default=None):當(dāng)是float類型時(shí),代表測(cè)試集的比例辈赋,是int類型時(shí)鲫忍,代表測(cè)試集的個(gè)數(shù)膏燕,是None時(shí),取1-訓(xùn)練集的比例(總數(shù)-訓(xùn)練集的個(gè)數(shù))悟民,訓(xùn)練集參數(shù)也為None時(shí)坝辫,默認(rèn)為0.25
train_size(default=None):同上,不過這個(gè)代表的是訓(xùn)練集射亏,不要弄混了近忙!
random_state(default=None):如果為int類型,則是一個(gè)隨機(jī)種子智润,如果是RandomState 實(shí)例及舍,則random_state就是隨機(jī)數(shù)生成器,如果為None做鹰,則生成器取np.random击纬。
shuffle(default=False):是否要在拆分?jǐn)?shù)據(jù)前隨機(jī)排列數(shù)據(jù),如果這個(gè)參數(shù)是False钾麸,則stratify 參數(shù)必須是None更振。
stratify(default=None):如果不是None,則數(shù)據(jù)以分層方式拆分饭尝,使用此作為類標(biāo)簽肯腕。
隨機(jī)種子的概念比較重要,簡而言之钥平,可以看作一個(gè)給隨機(jī)數(shù)的ID实撒,如果調(diào)用了這個(gè)ID的隨機(jī)數(shù),無論怎么運(yùn)行涉瘾,結(jié)果都是一樣的知态。(可以保證不同時(shí)刻運(yùn)行的隨機(jī)數(shù)是同一序列)
返回值
返回的是拆分之后的序列,是一個(gè)list立叛,長度是原有數(shù)據(jù)的二倍负敏。
可以直接賦值來取得訓(xùn)練集和測(cè)試集,順序分別是train_x, test_x, train_y, test_y秘蛇,不要記混了其做。
得到的訓(xùn)練集和測(cè)試集直接拿來用就好了,都是DataFrame或者Series赁还。
寫一個(gè)簡單的代碼如下:
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[['電量趨勢(shì)下降指標(biāo)','線損指標(biāo)','告警類指標(biāo)']]
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)#自動(dòng)分為測(cè)試集和訓(xùn)練集,注意返回值的順序
print(train_x)
需要注意的是寫進(jìn)參數(shù)的是兩個(gè)DataFrame妖泄,一個(gè)是特征,一個(gè)是標(biāo)簽艘策,這個(gè)在拆分之前就是要分開的蹈胡。
這種方法明顯比手動(dòng)去拆分要方便一些,sklearn庫中有不少簡便的函數(shù),拿來直接用的確能提升不少效率审残。