機器學習技巧 拆分訓練集測試集 高階 和下取樣

2021-09-24 01:37:55 字數 3340 閱讀 7004

筆者比較推薦分層抽樣,進行拆分資料,這樣訓練和測試集的比例就會保持一致。

所以以下的變形都是基於分層抽樣的。

直接用的是sklearn.model_selection.stratifiedshufflesplit。經常會用這個方式拆分資料進行交叉驗證,由於這裡僅僅用作二拆分,所以僅需要一次拆分(即設定n_splits= 1

from sklearn.model_selection import stratifiedshufflesplit

deftrain_test_sp

(data, target, test_size =

0.2)

:"""

簡單分層抽樣

基於 sklearn.model_selection.stratifiedshufflesplit

param data: 資料集

param target: 分層拆分比例依據

param test_size: 測試集比例 float

"""splitned = stratifiedshufflesplit(n_splits=

1, test_size = test_size, random_state =42)

for train_index, test_index in splitned.split(data, data[target]):

strat_train_set = data.loc[train_index]

strat_test_set = data.loc[test_index]

return strat_train_set, strat_test_set

當正負樣本存在比例不平衡的時候,用分層抽樣的方式進行下取樣。

再用簡單分層抽樣拆分訓練集測試集。

from sklearn.cluster import kmeans

from sklearn.model_selection import stratifiedshufflesplit

defkclust_sample

(data, target, n_clusters=

10, out_size =

0.3, neg_***=

0, seed=42)

:"""

負樣本聚類分層欠取樣\n

author: scc_hy

:param data: pandas dataframe

:param target: str 目標變數

:param n_clusters: k_means聚類個數

:param out_size: 需要負樣本的比例 (下取樣抽取多少)

:param neg_***: 負樣本型別標識 str/int

:param seed: 隨機因子

例:kclust_sample(new_dt, 'is_ls', n_clusters=10, out_size = 0.3, neg_***=0, seed=42)

"""## 拆分正負樣本

pos_*** =

[i for i in

set(data[target]

.unique())

-set

([neg_***, neg_***])]

[0]

neg_dt = data[data[target]

== neg_***]

.copy(deep =

true

) neg_dt.reset_index(drop =

true

, inplace =

true

) pos_dt = data[data[target]

== pos_***]

.copy(deep =

true

) pos_dt.reset_index(drop =

true

, inplace =

true

)## 聚類

kclust = kmeans(n_clusters = n_clusters)

kclust.fit(neg_dt)

neg_dt[

'kclust'

]= kclust.predict(neg_dt)

print

('***************==== 負樣本聚類完成 ***************==='

) split = stratifiedshufflesplit(n_splits=

10, test_size = out_size, random_state = seed)

## 用聚類結果進行分組抽樣

need_lst =

[i for i in split.split(neg_dt.drop(

'kclust'

, axis =1)

, neg_dt[

'kclust'])

]## 生成10對 1- out_size : out_size 的子集索引對

indecis = np.random.permutation(

len(need_lst)

) neg_ot = neg_dt.drop(

'kclust'

, axis =1)

.loc[

list

(need_lst[indecis[0]

][1]

),:]

# 從中隨機抽取一組中的 少數樣本(out_size * len(data))

out_dt = pd.concat(

[neg_ot ,pos_dt]

, axis =0)

out_dt.reset_index(drop =

true

, inplace =

true

)return out_dt

### 先下取樣再進行分層抽樣分訓練集測試集

out_dt = kclust_sample(new_dt,

'is_ls'

, n_clusters=

10, out_size =

0.3, neg_***=

0, seed=42)

tr_set, te_set = train_test_sp(out_dt,

'is_ls'

, test_size =

0.2)

以上僅僅是再實際操作中筆者一般用到的方法,希望對大家有幫助,後續可能還會補充

機器學習 訓練集 驗證集 測試集

為什麼要將資料集分為訓練集 驗證集 測試集三部分?對於很多機器學習的初學者來說,這個問題常常令人很迷惑,特別是對於驗證集和測試集的區別更讓人摸不到頭腦。下面,我談一下這三個資料集的作用,及必要性 訓練集 顯然,每個模型都需要訓練集,訓練集的作用很明顯,就是直接參與模型的訓練過程。測試集 測試集完全不...

機器學習的訓練集 驗證集和測試集

在機器學習中,最佳的資料分類情況是把資料集分為三部分,分別為 訓練集 train set 驗證集 validation set 和測試集 test set 訓練集很好理解就是訓練我們的模型。那麼驗證集和測試集有什麼作用?首先需要了解的是在乙個機器學習模型中,模型的引數分為普通引數和超引數,普通引數比...

機器學習中的訓練集 驗證集 測試集

訓練集用來訓練模型,即確定模型的權重和偏置這些引數,通常我們稱這些引數為學習引數。而驗證集用於模型的選擇,更具體地來說,驗證集並不參與學習引數的確定,也就是驗證集並沒有參與梯度下降的過程。驗證集只是為了選擇超引數,比如網路層數 網路節點數 迭代次數 學習率這些都叫超引數。比如在k nn演算法中,k值...