重寫交叉驗證,實現多模型簡單的回歸融合演算法

2021-10-05 03:20:07 字數 4006 閱讀 1370

sklean中常見的關於交叉驗證的方法主要有cross_val_predict()和cross_val_score()。在具體回歸場景使用的時候,這兩個函式還是有些不同:

1、cross_val_predict()會返回和樣本數量一致的陣列,如你要交叉驗證的樣本有10個,標籤肯定也是10個,predict交叉驗證返回的就是10個**值;

2、cross_val_score()會根據具體引數scroing的取值返回乙個序列,序列的數量等於cv值,比如scoring=neg_mean_squre_error,且採用的是10折交叉驗證,返回的序列中就有10個值neg_mse的值;

3、cross_val_predict()其實是將資料集劃分cv份之後,每乙份都做一次且只做一次測試樣本,這樣每個樣本都會有且只有乙個**值,放在一起就是cross_val_predict()的返回值;但是cross_val_score()卻不同,它是將資料集劃分cv份之後,每乙份在做且只做一次測試集的時候,對應會產生對應的mse值,因此會有cv個mse值,放在一起就是cross_val_score()的返回值;

4、由於回歸模型一般都使用mse(rmse),所以一般都是取cross_val_score()返回值的平均值作為模型評價的標準,可能考慮到這個平均後的mse是經歷了每一折樣本運算的洗禮,所以比較認可這個mse作為生態效度的評價指標,反觀cross_val_predict(),可能考慮其僅是乙個**的參考,沾染原始資料的先驗資訊較多,所以sklean不推薦使用它作為模型泛化效能的參考。

5、在有些場景下,比如小資料集要進行基於回歸的、基於多模型的決策級融合演算法的時候,由於沒法用到具體交叉驗證中對於每一折運算的詳細情況,就需要重寫交叉驗證了。

1、這個函式功能其實就是得到輸入樣本分成cv份的index字典:

def

get_split_index

(sample_row, cv_num)

: index_pool = np.arange(

0, sample_row,1)

# 這裡的part_number向上取整,當然也可以向下取整

part_number =

int(np.ceil(sample_row / cv_num)

) split_part =

dict

(keys=np.arange(

0, cv_num,1)

)for i in np.arange(

0, cv_num-1,

1): choice_data = np.random.choice(index_pool, size=part_number, replace=

false

) split_part[i]

= choice_data

# 使用這個setdiff1d的方法比np.delete好,因為delete要用到索引

index_pool = np.setdiff1d(index_pool, choice_data)

split_part[cv_num-1]

= index_pool

return split_part

2、np.random.choice的replace引數要設為false,對應不放回抽樣,否則預設是放回抽樣,這樣你挑選的元素就有重複;

3、np.random.choice返回的是隨機挑選後的元素,不是座標。

比如乙個簡單的場景,採用同樣的mlpregressor對來自a和b兩個資料來源的資料進行交叉驗證,對每一折測試集如果a的擬合模型的loss_小,**值就採用a的,否則就使用b的。這樣的場景下,我們就需要在每一折交叉驗證的時候做個具體對比:

def

my_cross_val_predict

(data_x, data_y, cv_num, model_01, model_02)

: split_index = get_split_index(sample_row=data_x.shape[0]

, cv_num=cv_num)

# 需要初始化乙個predict的series,每次融合**的值存在這裡;

predict_value = pd.series(index=np.arange(data_x.shape[0]

), dtype=np.float64)

key_list =

for k, v in split_index.items():

key_list = key_list[1:

]# 這個key的第乙個是個字串'key'的提示

for index in key_list:

test_index = split_index[index]

# 這一輪的測試集合對應的index

remains_index = np.setdiff1d(key_list,

[index]

) train_index = np.array(

).astype(np.int64)

for i in remains_index:

# 得到的就是這一輪的訓練樣本的index

train_index = np.concatenate(

(split_index[i]

, train_index)

)# 獲取得到總的訓練集和樣本集合

data_x_train = data_x.loc[train_index]

data_x_test = data_x.loc[test_index]

data_y_train = data_y.loc[train_index]

# a和b的標註都是一樣的

data_y_test = data_y.loc[test_index]

# a和b的標註都是一樣的

# 獲取得到a和b的訓練集和測試集,其中a和b要換成自己資料集的特徵數

data_x_train_a = data_x_train.iloc[:,

:a] data_x_test_a = data_x_test.iloc[:,

:a] data_x_train_b = data_x_train.iloc[

:, a:a+b]

data_x_test_b = data_x_test.iloc[

:, a:a+b]

model_01 = model_01.fit(data_x_train_a, data_y_train)

model_02 = model_02.fit(data_x_train_b, data_y_train)

lose_01 =

abs(model_01.loss_)

loss_02 =

abs(model_02.loss_)

if lose_01 < loss_02:

selected_model = model_01

predict_value.loc[test_index]

= selected_model.predict(data_x_test_a)

print

('第%d輪選中了a'

% index)

else

: selected_model = model_b

predict_value.loc[test_index]

= selected_model.predict(data_x_test_b)

print

('第%d輪選中了b'

% index)

return predict_value

1、如果要使用交叉驗證的mse值,可以在my_cross_val_score()中的每一折進行計算;如果要使用諸如相關係數等,可以直接使用my_cross_val_score()返回值計算相關係數。

2、重寫corss_val_score()的好處就是可以控制每一折運算的過程,並且如果你使用的是多個指標評價模型,比如mse和pcc(相關係數),可以保證這兩個值產生在同樣的計算過程中,畢竟每一次劃分資料集都是隨機的,對小樣本和模型的擬合結果每次還是不同的。

滑動驗證實現

滑鼠按下 移動 鬆開的之後,通過滑鼠鬆開之後與初始位置的偏移量加上滑動塊的寬度來計算滑動進度的div的寬度,在內層的滑動塊始終向右浮動就行了。滑鼠移動過程中,越界問題處理 移動滑鼠 document.onmousemove function e 滑動過程中,向右越界處理 if objx slideb...

Python資料分析分類演算法交叉驗證實現

在訓練資料的過程或者參加資料比賽的時候,常常會遇到資料量不夠大的情況,想充分利用不多的資料進行有說服力力的驗證,從而選到乙個對分類至關重要的引數,可以採用 k折交叉驗證法 k fold crossvalidation 下面和大家分享一下。在遇到k折交叉驗證之前,往往使用的是簡單交叉驗證 hold o...

MySQL密碼驗證實現原理

這篇文章可以幫助您深入理解mysql是如何進行密碼驗證的。首先,我們知道,使用者密碼是儲存在mysql.user這個表的password列,並且是以hash值的形式加密儲存的。整個驗證過程如下 當客戶端請求連線時,1.伺服器端會隨機生成乙個random string傳送給客戶端 2.客戶端收到ran...