sklearn-用sklearn.model_selection進行訓練集和測試集區分

一般來講區分樣本的訓練集和測試集,也是比較簡單的,訓練集:測試集爲7:3或者8:2均可以,當存在交叉驗證集的時候(一般樣本比較多的時候能夠考慮分爲三層,避免出現用測試集優化模型以後獲得的結果有傾向的狀況發生),能夠是6:2:2。python

這樣的話,咱們獲得一個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

能夠看到,這樣的狀況下是能夠按照必定的比例把數值分開的(上面的代碼裏忘記加種子了),可是也有一點點麻煩,畢竟都要手動處理。dom

那麼在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.25spa

train_size(default=None):同上,不過這個表明的是訓練集,不要弄混了!excel

random_state(default=None):若是爲int類型,則是一個隨機種子,若是是RandomState 實例,則random_state就是隨機數生成器,若是爲None,則生成器取np.random。code

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庫中有很多簡便的函數,拿來直接用的確能提高很多效率。

相關文章
相關標籤/搜索