我有包含 X 特征和 Y - 二進制類(0 或 1)的資料我的問題是不平衡的,所以我想確保拆分后的 y_test 將包含拆分后分類為 1 的樣本的大約 50%。
我嘗試使用 train_test_split 分層,但我的 0/1 比率低于 50%,不起作用。
有什么建議么?
uj5u.com熱心網友回復:
您不應該因為不平衡而影響訓練測驗拆分。訓練-測驗拆分必須與實際測驗分布相對應。如果您的問題不平衡 - 您的測驗集也應該如此!
您可以更改的是您使用的指標和/或培訓制度,例如:
- 使用平衡的準確性而不是準確性進行評估
- 在訓練期間使用類重加權
從技術上講,這兩者在以同樣重要的方式處理類的效果相同,但您不必以不同的方式“拆分事物”。
如果您真的堅持以這種奇怪的方式拆分資料,只需手動進行
import numpy as np
def odd_split(X, y, minority_class=1, minority_test_size=0.1):
minority_indices = np.where(y==minority_class)[0]
majority_indices = np.where(y!=minority_class)[0]
n = max(1, int(minority_test_size* len(minority_indices)))
selected = np.random.choice(range(len(minority_indices)), n, replace=False)
test_minority_indices = minority_indices[selected]
assert (y[test_minority_indices] == minority_class).all()
selected = np.random.choice(range(len(majority_indices)), n, replace=False)
test_majority_indices = majority_indices[selected]
assert (y[test_majority_indices ] != minority_class).all()
test_indices = np.concatenate((test_minority_indices, test_majority_indices))
train_indices = np.array([i for i in range(len(y)) if i not in set(test_indices)])
return X[train_indices], y[train_indices], X[test_indices], y[test_indices]
from collections import Counter
X = np.random.normal(size=(1000, 2))
y = np.random.choice([0, 1], p=[0.9, 0.1], size=1000)
print('Whole', Counter(y))
X_train, y_train, X_test, y_test = odd_split(X, y)
print('Train', Counter(y_train))
print('Test', Counter(y_test))
這使
Whole Counter({0: 886, 1: 114})
Train Counter({0: 875, 1: 103})
Test Counter({1: 11, 0: 11})
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/491851.html
