日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 循环十次_python机器学习——十次交叉验证训练的数据准备算法

發布時間:2023/12/18 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 循环十次_python机器学习——十次交叉验证训练的数据准备算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

攝于 2017年4月21日 臺灣墾丁船帆石海灘

前言

這兩天本來打算開始寫樸素貝葉斯分類器的算法的,由于上一篇博文python實現貝葉斯推斷——垃圾郵件分類在實現時,在數據劃分訓練集和測試集的時候遇到兩個問題,第一是數據量太少,只有50條數據,解決方法就是擴大數據量咯。第二個,也是今天寫這篇博文的目的,就是在訓練的時候,我先把數據文件進行隨機亂序,然后抽取了亂序后前10個數據文件,這個目的實際上就是為了隨機從中抽取10個數據文件作為測試集,剩下的40個數據文件作為訓練集。這種方法在機器學習的數據準備過程中是非常常見的。但是,為了能夠更好的測試模型,盡可能的排除外在因素的干擾,消除偏好,同時獲得最好的精度,所以這里則引入交叉驗證(Cross-Validation),而交叉驗證的次數一般取10次,所以一般也叫十次交叉驗證。從stackoverflow上找到一張圖,一看即明,原圖網站。

算法思路

如果數據量為10的倍數,則分離數據是非常方便的,即直接均分十份,依次輪流存入test和train兩個文件夾中。

但是如果不是10的倍數呢?

思路如下:

1.獲取數據數量,余除10,獲得余數,例如現在有24個數據文件,24%10=4

2.根據余數拆分數據,即將數據拆分成20和4兩份。

3.將拆分數據后能夠整除10的一份均分十份,即將數據量為20的數據量均分為十份,每份包含2個數據文件。

4.將余數拆分成一份一個數據,然后遍歷每一份,依次一份分開加入到第3步已經均分好的數據中,直到余數部分的數據使用完。

沒看懂?

甩圖:

2.png

這樣做的目的是盡可能達到數據均分的效果,讓實驗效果更加。

算法實現

前期準備

數據來源

700條neg電影數據+700條pos電影數據,共1400條數據。下一篇博客樸素貝葉斯分類器將會用到這批數據。完整數據可以在下方的github獲得。

python包

1.fwalker

2.bfile

3.numpy

4.shutil

5.os

fwalker和bfile是不是很陌生?哈哈這是我自己寫的包,傳送門:python3文本讀取與寫入常用代碼、python中import自己寫的.py

當一些代碼(如寫入寫出文本,創建文件夾、統計詞頻)經常需要被使用到時,可以考慮下我這種方法,非常方便,可以大大縮短編寫算法的周期和減少代碼量。

代碼實現

既然我們需要進行十次交叉驗證,因此數據需要復制十份,則需要10個文件夾來進行存放,每個文件夾下又包含test和train數據。

代碼(寫一行代碼打一行注釋,良心啊~)

# -*- coding: utf-8 -*-

# @Date : 2017-05-11 21:24:50

# @Author : Alan Lau (rlalan@outlook.com)

# @Version : Python3.5

from fwalker import fun

from bfile import buildfile as bf

from random import shuffle

import numpy as np

import shutil

import os

def buildfile(output_path):

for i in range(1, 10+1):

# 循環新建編號1-10的文件夾,用于存放train和test文件夾

file_num = bf('%s\\%d' % (output_path, i))

# 在每個編號文件夾下新建train文件夾,用于存放90%的訓練數據

train_file = bf('%s\\train' % file_num)

# 在每個編號文件夾下新建test文件夾,用于存放10%的訓練數據

test_file = bf('%s\\test' % file_num)

print('Data storage has been bulit!')

return output_path

def split_ten(files):

file_len = len(files) # 獲取文件總數

shuffle(files) # 隨機打亂文件路徑列表的順序,即使python的隨機是偽隨機

data_storage = [] # 初始化一個列表,用來接收分劃分好的文件路徑

remainder = file_len % 10 # 判斷文件數量能否直接被10整除

if remainder == 0: # 如果可以整除,直接將數據切成10組

np_files = np.array(files) # 將文件路徑列表轉換成numpy

data_storage = np_files.reshape(10, -1) # 利用numpy的reshape來將文件路徑切分為10組

# 比如說現在有20個文件路徑

# reshape()后得到的結果為2、2、2、2、2、2、2、2、2、2,即共十份、每份包含2個文件路徑。

return data_storage

else: # 否則,則先切開余數部分的文件

np_files = np.array(files[:-1*remainder]) # 切開余數部分的文件,使文件數量保證能夠被10整除

data_storage_ten = np_files.reshape(10, -1) # 同樣利用上面的方法使用numpy切分10組文件

# 獲取余數部分的文件列表,遍歷列表,盡可能的將多余的文件分散在10組文件中,而不是直接加入到一個文件中

remainder_files = (

np.array(files[-1*remainder:])).reshape(remainder, -1) # 使用reshape切分問一份一組

for i in range(0, len(remainder_files)):

ech_dst = data_storage_ten[i]

ech_rf = remainder_files[i]

# 將取出來的余數內的路徑分別加入到已經均分好的10份的前remainder個數據當中,比如說現在有24份文件,

# 將24拆份拆分成一個能被10整除的數和一個余數,即這里拆分成20和4,我們首先將拆出來的20份文件均分10份,

# 即每份有2個文件路徑,然后,再將剩下后面的4個文件路徑,盡可能的放入到剛剛均分好的10份數據中。

# 因此最終拆分的結果共有十份,每份數量分別為:3、3、3、3、2、2、2、2、2、2。

data_storage.append(np.concatenate((ech_dst, ech_rf)))

for j in range(remainder, len(data_storage_ten)):

# 將將剩下的沒有被余數部分加入的份加入到data_storage中

data_storage.append(data_storage_ten[j])

return np.array(data_storage)

def group_data(data_storage, output_path):

for i in range(0, len(data_storage)):

ech_path = '%s\\%d' % (output_path, i+1) # 構造每一份需要寫入的路徑

ech_train_path = '%s\\train' % ech_path

ech_test_path = '%s\\test' % ech_path

test_paths = data_storage[i]

move_file(test_paths, ech_test_path)

train_paths = np.concatenate(([data_storage[:i], data_storage[i+1:]]))

# 將剩下的訓練部分加入到train_paths中,并且降維

train_paths = np.concatenate((train_paths)) # 再次降維,使其變成1維

move_file(train_paths, ech_train_path)

num = i+1

print('No.%d is over!' % num)

def move_file(old_paths, new_path):

for old_path in old_paths:

shutil.copy2(old_path, new_path)

flag_name = '_'.join(old_path.split('\\')[-2:])

old_name = '%s\\%s' % (new_path, old_path.split('\\')[-1])

new_name = '%s\\%s' % (new_path, flag_name)

os.rename(old_name, new_name)

def main():

file_path = r'..\data\data_of_movie'

# file_path = r'..\data\test'

output_path = r'..\data\tenTimesTraining'

files = fun(file_path)

output_path = buildfile(output_path)

data_storage = split_ten(files)

group_data(data_storage, output_path)

if __name__ == '__main__':

main()

至于實驗的結果,就是把1400條數據隨打亂,輪流存入10個文件夾中,并且其中的10%輪流作為測試集存入test文件中,剩下的90%則存入了train。

由于數據量大,我這里截取一小部分數據展示。

對比沒有劃分數據前的數據名稱會發現,我這里還把類別的標簽加到了每條數據的名稱中。

這個算法可以使用到大多數的機器學習需要劃分的數據當中,前提只需要將不同分類的數據存在以分類命名的文件夾下即可。為了方便識別,算法會提取文件夾的名稱作為標簽名重命名每條數據。重命名格式為:標簽_xxx.txt

所有數據以及完整代碼GITHUB

總結

以上是生活随笔為你收集整理的python 循环十次_python机器学习——十次交叉验证训练的数据准备算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。