建模前處理:多種方法分測試集訓練集
阿新 • • 發佈:2019-01-22
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)