机器学习:使用python生成训练集和测试集的方法实现
注意:所有函數僅針對西瓜數據集,如果需要對其他數據集進行分類,只需找到數據集中目標值(西瓜數據集中目標值為是否是好瓜的"是"和"否")所在的列(西瓜數據集中其在最后一列),然后將需要按照目標值進行運行的代碼替換即可
留出法實現
實現思路:根據留出法的原理,需要將數據集分為互斥的兩個集合,一個作為訓練集,另一個作為測試集,在數據劃分過程中需要分層采樣,為了生成多組數據,需要每次隨機劃分。
首先統計一下數據集中的正例的個數:
然后計算一下需要的訓練集的大小:
# 計算訓練集大小train_set_size = int(percent / 100 * len(data_set)+0.5)其中,percent是訓練集占數據集的百分比,需要人為輸入。
再然后計算一下訓練集中需要的正例個數:
為了每次劃分都隨機且訓練集和測試集互斥,使用sample生成隨機數作為即將采集訓練的下標:
# 每組訓練集和數據集保證隨機劃分index_list = random.sample(range(0, len(data_set)), len(data_set))使用for循環分層訓練集和測試集:
# 劃分訓練集、數據集for j in index_list:if data_set[j][-1] == "是":if positive_count < positive_train_data_size:train_set.append(data_set[j])positive_count += 1else:test_set.append(data_set[j])else:if negative_count < train_set_size - positive_train_data_size:train_set.append(data_set[j])negative_count += 1else:test_set.append(data_set[j])每生成完一組訓練集和測試集就將其存起來
k_train_set.append(train_set) k_test_set.append(test_set)總的程序如下:
def setAside(data_set):'''使用留出法生成數據集'''positive_size = 0# 計算數據集中的正例數for data in data_set:if data[-1] == "是" or data[-1] == "1":positive_size += 1percent = int(input("訓練集占總數據集百分比(1~99):"))# 計算訓練集大小train_set_size = int(percent / 100 * len(data_set)+0.5)# 計算訓練集中需要的正例大小positive_train_data_size = int(train_set_size / len(data_set) * positive_size + 0.5)group_num = int(input("需要多少組? "))k_train_set, k_test_set = [], []# 生成訓練集、測試集for i in range(group_num):# 每組訓練集和數據集保證隨機劃分index_list = random.sample(range(0, len(data_set)), len(data_set))# 存放一組數據集和訓練集train_set, test_set = [], []# 訓練集中正反例計數,為了確定正反例已存夠positive_count, negative_count = 0, 0# 劃分訓練集、數據集for j in index_list:if data_set[j][-1] == "是" or data[-1] == "1":if positive_count < positive_train_data_size:train_set.append(data_set[j])positive_count += 1else:test_set.append(data_set[j])else:if negative_count < train_set_size - positive_train_data_size:train_set.append(data_set[j])negative_count += 1else:test_set.append(data_set[j])k_train_set.append(train_set)k_test_set.append(test_set)# 返回訓練集、數據集組,組數return k_train_set, k_test_set, group_numk折交叉驗證法實現
實現思路:K折交叉驗證法是將數據集劃分為k個互斥子集,取出一個作為測試集,其余作為訓練集,且要分層采樣,如果像留出法那樣計算各個子集需要的各種數據,會導致程序太復雜,所以采用另外一種思路,就是將其按照是否是好瓜進行排序,然后依次存入各個列表。
首先,將數據集排序
然后將排好序的數據集依次存入大小為k的list
# 分層劃分數據集為k份for i in range(len(data_set)):k_list[i % k].append(data_set[i])這樣,數據就被分層分為了互斥的k份
然后將k份數據中的一份作為測試集,其他作為訓練集來分類,每劃分一次就將其結果存下來
總的程序如下:
def crossValidate(data_set):'''使用k折交叉驗證法生成數據集'''# 按照表中最后一個元素來排序,便于分層data_set.sort(key=lambda k: k[-1])k = int(input("輸入折數k(k>1):"))# 生成k個列表放在一個列表中k_list = list([] for i in range(k))k_train_set = list([])k_test_set = list([])# 分層劃分數據集為k份for i in range(len(data_set)):k_list[i % k].append(data_set[i])# 生成k個數據集和k個訓練集for i in range(k):temp_set = []for j in range(k):if j != i:temp_set.extend(k_list[j])else:k_test_set.append(k_list[j])k_train_set.append(temp_set)# 返回訓練集、數據集組,組數return k_train_set, k_test_set, k自助法實現
實現思路:自助法就是從大小的m數據集中隨機采樣(本隨機采樣類似于放回抽樣)m次數據,作為訓練集,其余的作為測試集。
首先得到m的大小
為了可以生成多組訓練集和測試集,所以生成需要的組數組隨機數,每組隨機數的范圍為0~m-1,因為數據集的下標范圍是從0開始到m-1結束
# 生成group組隨機數,每組有m個,隨機數的范圍為0~m-1 ran_lis = list([[random.randint(0, m-1)for i in range(m)] for j in range(group)])然后分出訓練集和測試集
# 生成訓練集,測試集for i in range(group):train_set = []test_set = []# 隨機采樣m個數據放在訓練集中for j in ran_lis[i]:train_set.append(data_set[j])# 余下的數據放在測試集中for data in data_set:if data not in train_set:test_set.append(data)k_train_set.append(train_set)k_test_set.append(test_set) 總的程序如下: def bootstrap(data_set):m = len(data_set)group = int(input("需要多少組? "))# 生成group組隨機數,每組有m個,隨機數的范圍為0~m-1ran_lis = list([[random.randint(0, m-1)for i in range(m)] for j in range(group)])k_train_set = []k_test_set = []# 生成訓練集,測試集for i in range(group):train_set = []test_set = []# 隨機采樣m個數據放在訓練集中for j in ran_lis[i]:train_set.append(data_set[j])# 余下的數據放在測試集中for data in data_set:if data not in train_set:test_set.append(data)k_train_set.append(train_set)k_test_set.append(test_set)# 返回訓練集、數據集組,組數return k_train_set, k_test_set, group其它讀取數據集文件,保存生成的訓練集和測試集到文件中以及調用這三個函數的程序等其他輔助程序不在此贅述,可點擊此鏈接下載全部的文件。
總結
以上是生活随笔為你收集整理的机器学习:使用python生成训练集和测试集的方法实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot+Mybatis-p
- 下一篇: python 自动划分训练集和测试集