我又來(lái)解析代碼了,今天解析的部分是優(yōu)化測(cè)試集。
1、使用每個(gè)實(shí)例的ID來(lái)判定這個(gè)實(shí)例是否應(yīng)該放入測(cè)試集(假設(shè)每個(gè)實(shí)例都有唯一并且不變的ID)
import hashlib #提供字符加密功能,將md5和sha模塊整合到了一起
def test_set_check(identifier,test_ratio,hash):
return hash(np.int64(identifier)).digest()[-1] < 256 * test_ratio #求出ID哈希值最后一個(gè)字節(jié)是否滿足<256*ratio
def split_train_test_by_id(data, test_ratio, id_column, hash=hashlib.md5):
ids = data[id_column] #按索引找出id
in_test_set = ids.apply(lambda id_:test_set_check(id_, test_ratio, hash)) #對(duì)所有數(shù)據(jù)進(jìn)行劃分
return data.loc[~in_test_set], data.loc[in_test_set] #返回滿足條件的劃分為訓(xùn)練集和測(cè)試集
函數(shù)說(shuō)明:
hash.digest() 返回摘要,作為二進(jìn)制數(shù)據(jù)字符串值
np.int64()強(qiáng)轉(zhuǎn)為int64類型,和int不是一個(gè)類型。
apply() 將函數(shù)應(yīng)用到由各列或行形成的數(shù)組上
lambda匿名函數(shù)
loc通過(guò)標(biāo)簽索引行數(shù)據(jù)
2、使用行索引作為ID
housing_with_id = housing.reset_index() #使用行索引做id
housing_with_id["id"] = housing["longitude"] * 1000 + housing["latitude"] #使用經(jīng)度和緯度作為id
train_set, test_set = split_train_test_by_id(housing_with_id, 0.2, "id") #進(jìn)行劃分
3、(另一種劃分方式)使用sk-learn中的函數(shù)劃分
from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(housing, test_size=0.2, random_state=42) #進(jìn)行劃分
函數(shù)解釋:
train_set_split():帶有random_state參數(shù),可以設(shè)定隨機(jī)生成器種子;可以將種子傳遞給多個(gè)行數(shù)相同的數(shù)據(jù)集,可以在相同的索引上分割數(shù)據(jù)集
4、按照中位數(shù)分層劃分
housing["income_cat"] = np.ceil(housing["median_income"] / 1.5) #中位數(shù)處以1.5向上取整
housing["income_cat"].where(housing["income_cat"] < 5, 5.0, inplace=True) #將所有大于5的分類歸入到分類 5
from sklearn.model_selection import StratifiedShuffleSplit
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42) #對(duì)數(shù)據(jù)集進(jìn)行劃分,n_splits是將訓(xùn)練數(shù)據(jù)分成train/test對(duì)的組數(shù),test_size是所占比例,random_state控制是將樣本隨機(jī)打亂
for train_index, test_index in split.split(housing, housing["income_cat"]):#按照劃分器進(jìn)行劃分
strat_train_set = housing.loc[train_index]
strat_test_set = housing.loc[test_index]
print(housing["income_cat"].value_counts() / len(housing))#查看收入分配比例
for set in (strat_train_set, strat_test_set): #刪除income_cat屬性
set.drop(["income_cat"], axis=1, inplace=True)
函數(shù)解釋:
StratifiedShuffleSplit() :對(duì)數(shù)據(jù)集進(jìn)行劃分,n_splits是將訓(xùn)練數(shù)據(jù)分成train/test對(duì)的組數(shù),test_size是所占比例,random_state控制是將樣本隨機(jī)打亂
今天到這里完成了訓(xùn)練集和測(cè)試集的劃分,下次就可以研究訓(xùn)練集了,加油!