1 2 def split_data(data, prob): 3 """分割數據 4 split data into fractions [prob, 1 - prob]""" 5 results = [], [] 6 for row in data: 7 """ 8 這里對數據的迭代是有序的 9 但是數據被放在測試集和訓練集的可能性是隨機的 10 """ 11 results[0 if random.random() < prob else 1].append(row) 12 """ 13 用random.random()產生隨機數字然后與分割的概率比較大小 這樣就保證了數據是被隨機的分配到不同的set中的。 14 results 是有兩個列表組成的,當random.random() 的結果小於 分割概率時,就為results[0]添加元素。否則就為results[1]添加元素。 15 16 這樣的寫法真是巧妙, 17 使用random.random()首先保證了隨機分配, 18 與0或1比較大小來進行分配十分方便, 19 而同時0或1 又可以直接當做results 的索引來為不同的集合添加元素。 20 21 可謂是一舉多得。Nice!!! 22 """ 23 return results 24 25 def train_test_split(x,y,test_pct): 26 data = zip(x,y) # 使用zip()函數將傳入的x,y數據合成為一組成對的數據 27 """【x,y】 x,y本身就是列表所以data 為[[x_ele],[y_ele]] """ 28 train,test = split_data(data,1 - test_pct) # 然后調用分割函數 進行隨機分割 29 """對data進行分割,分割后的數據與data是相同形狀的""" 30 x_train, y_train = zip(*train) # 魔法般的解壓技巧 31 """ 使用zip()函數對上一步的數據進行解壓,再次分割為x,y數據集""" 32 x_test, y_test = zip(*test) 33 return x_train,x_test,y_train,y_test #最后返回x,y的測試集和訓練集 共四個組數據 34