分別用numpy和pandas劃分數據集以完成交叉驗證

先說個結論:使用numpy和pandas都可方便的使用sklearn的交叉驗證函數cross_validation_score,但是pandas更好,可以用於更多的適應情況,比如自己寫評估函數等。

一、numpy版本

# np.loadtxt讀取label.csv(跳過表頭),作爲tmp_data
tmp_data = np.loadtxt("data.csv", delimiter=',', skiprows=1).astype(float)

如果你想提取一個同等列寬的表頭,可以像下面這樣做,但是我還沒想到這樣能做什麼。所以,看看就好,下面與它無關。

# 提取表頭
headLine = ["Unnamed"]
headLine.extend(pd.read_csv("data.csv", index_col=[0]).columns.tolist())
print(f"headLine:{headLine}")

此時打亂數據集比較隨便,np.random.shuffle、sklearn.utils.shuffle都可以。

# 打亂數據集
from sklearn import utils
tmp_data = utils.shuffle(tmp_data)
print(f"tmp_data:\n{tmp_data}\nlen of tmp_data:{len(tmp_data)}")

k = 4  # k折
k_sample_count = tmp_data.shape[0] // k  # 每折多少行數據(這裏使用整除)

# 根據k折,劃分數據集
for fold in range(k):
    validation_begin = k_sample_count * fold
    validation_end = k_sample_count * (fold + 1)

    validation_data = tmp_data[validation_begin:validation_end]

    # np.vstack 沿着垂直的方向堆疊數據,拼接得到訓練集
    train_data = np.vastack([
        tmp_data[:validation_begin],
        tmp_data[validation_end:]
    ])

二、pandas版本

1、自己手動劃分數據集(好處是可以瞭解過程,以及適合自己寫評估函數等)

(1)讀取數據
# pandas讀取
tmp_data  = pd.read_csv("data.csv", index_col=[0])	# 將data.csv的第一列作爲索引
print(f"len of tmp_data:{len(tmp_data)}")
(2)打亂數據集

此時要 使用sklearn.utils.shuffle打亂數據集,用pandas自帶的sample也可。但不能使用numpy.random.shuffle(),因爲其不能用於處理string類型,但表頭columns含有string類型!

from sklearn import utils
tmp_data = utils.shuffle(tmp_data)
print(f"tmp_data:\n{tmp_data}\nlen of tmp_data:{len(tmp_data)}")
(3)K折劃分(劃分之後比較自由,你既可以選擇使用sklearn庫,也可以自己寫評估函數進行cross_validation)
k = 4  # k折
k_sample_count = tmp_data.shape[0] // k  # 每折多少行數據(這裏使用整除)

# 根據k折,劃分數據集
for fold in range(k):
    validation_begin = k_sample_count * fold
    validation_end = k_sample_count * (fold + 1)
	# 驗證集(或者叫測試集)
    validation_data = tmp_data[validation_begin:validation_end]

    # 訓練集,pd.concat 沿着垂直的方向堆疊數據,拼接得到訓練集
    train_data = pd.concat([
        tmp_data[:validation_begin],
        tmp_data[validation_end:]
    ])
	# 重新索引(這一步可有可不有,看你自己情況,需要索引重新降序排列你就加)
    train_data.index = np.arange(len(train_data))
    validation_data.index = np.arange(len(validation_data))


    print(f"第{fold}折")  # f 代表format
    print(f"train_data:\n{train_data}, \nvalidation_data:\n{validation_data}")
    
	# 繼續你的表演,你可以在這裏寫自己的評估函數
# 或者在這裏使用sklearn.metrics.cross_validation_score處理你上面劃分好的數據集。

2、sklearn.cross_validation.KFold劃分數據集(好處是適合sklearn的cross_validation_score一條龍服務)

(參考鏈接:https://blog.csdn.net/weixin_38536057/article/details/78702564)

# K-fold進行數據分割
from sklearn.model_selection import KFold

kf = KFold(25, n_folds=5, shuffle=False)
# X是大的數據集
kf.split(X)
# print 每個訓練集和測試集的內容
print '{} {:^61} {}'.format('Iteration', 'Training set observations', 'Testing set observations')
for iteration, (train, test) in enumerate(kf, start=1):
    print '{:^9} {} {:^25}'.format(iteration, train, test)
Iteration                   Training set observations                   Testing set observations
    1     [ 5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]        [0 1 2 3 4]       
    2     [ 0  1  2  3  4 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]        [5 6 7 8 9]       
    3     [ 0  1  2  3  4  5  6  7  8  9 15 16 17 18 19 20 21 22 23 24]     [10 11 12 13 14]     
    4     [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 20 21 22 23 24]     [15 16 17 18 19]     
    5     [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]     [20 21 22 23 24]     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章