1. 程式人生 > >建模前處理:多種方法分測試集訓練集

建模前處理:多種方法分測試集訓練集

1、自編函式簡單隨機抽取

#!/usr/bin/python
# 載入包
import numpy as np 
import pandas as pd

def split_train_test(data, test_ratio,seed = 1234):
    np.random.seed(seed)  # 使得生成的測試訓練集具有可重複性
    index = np.random.permutation(len(data))  # 亂序
    t_size = int(len(data) * test_ratio)
    test_index = index[: t_size]
    train_index = index[t_size :]
    return
data.iloc[train_index], data.iloc[test_index] # interge

該方法可以保證每次生成的資料集相同
但當資料重新整理時,該方法又失效。
使用唯一ID 對資料進行分組才是保證更新資料後也照樣和之前分的相同,僅加入了新增的資料

2、ID的雜湊值抽取

#!/usr/bin/python
import hashlib 

def test_set_check(identifier, test_ratio, hash = hashlib.md5):
    """
    對雜湊值加密後用二進位制表示,提取最後一個位元組
    對最後一個位元組按照 256(一個位元組大小) * test_ratio 劃分成兩類
    :param identifier: 需要處理成hashlib.md5 的ID編碼
    :param test_ratio: 提取測試集的佔比
    :return: 布林值
    """
return hash(np.int64(identifier)).digest()[-1] < 256 * test_ratio # 加密後的結果用二進位制表示 def split_train_test_by_id(data, test_ratio, id_column, hash=hashlib.md5): ids = data[id_column] in_test_set = ids.apply(lambda id_ : test_set_check(id_, test_ratio, hash)) return data.loc[~in_test_set], data.loc[in_test_set]

3、sklearn函式隨機抽取

# 從model_selection中載入分測試集訓練集函式
from sklearn.model_selection import train_test_split

train_set, test_set = train_test_split(data, test_size = 0.2, random_state = 42)

4、sklearn函式分層抽取

from sklearn.model_selection import StratifiedShuffleSplit

split = StratifiedShuffleSplit(n_splits= 1, test_size= 0.2, random_state=42)

for train_index, test_index in split.split(data, data['income_cat']):
    strat_train_set = data.loc[train_index]
    strat_test_set = data.loc[test_index]

分層取樣的比例幾乎和原資料集一樣 優於 隨機抽樣

兩者資料抽樣比例比較如下:

# 原資料
a = data['income_cat'].value_counts()/len(data)

# 分層抽樣
ftr = strat_train_set['income_cat'].value_counts()/len(strat_train_set)
fte = strat_test_set['income_cat'].value_counts()/len(strat_test_set)

# 隨機抽樣
train_set, test_set = train_test_split(data, test_size = 0.2, random_state = 42)
sjtr = train_set['income_cat'].value_counts()/len(train_set)
sjte = test_set['income_cat'].value_counts()/len(test_set)

# 檢視標準差
np.std(ftr - a), np.std(fte - a), np.std(sjtr - a), np.std(sjtr - a)

某一資料比較結果如下:

(2.1667325363377233e-05, 8.666930145347169e-05, 0.001571964081795336, 0.001571964081795336)

顯然分層抽樣效果更佳