Pandas或Scikit-learn中是否有内置函数用于根据指定策略进行重采样?我想根据分类变量重新采样我的数据。例如,如果我的数据有75%的男性和25%的女性,但我想在50%男性和50%女性身上训练我的模型。 (我也想能够推广到不是50/50的情况)scikit-learn和/或熊猫重采样
我需要的是根据指定的比例重新采样我的数据的东西。
Pandas或Scikit-learn中是否有内置函数用于根据指定策略进行重采样?我想根据分类变量重新采样我的数据。例如,如果我的数据有75%的男性和25%的女性,但我想在50%男性和50%女性身上训练我的模型。 (我也想能够推广到不是50/50的情况)scikit-learn和/或熊猫重采样
我需要的是根据指定的比例重新采样我的数据的东西。
分层抽样意味着类分布被保留。如果你正在寻找这个,你仍然可以使用StratifiedKFold
和StratifiedShuffleSplit
,只要你有一个分类变量,你想确保在每个折叠中有相同的分布。只需使用变量而不是目标变量。例如,如果你有一个分类变量在i
柱,
skf = cross_validation.StratifiedKFold(X[:,i])
然而,如果我理解正确,要重新取样到的类别特征的一个特定目标分布(例如50/50)。我想你必须拿出你自己的方法来获得这样一个样本(将数据集按可变值分割,然后从每个分割中获取相同数量的随机样本)。如果你的主要动机是平衡一个分类器的训练集,一个技巧可能是调整sample_weights
。您可以设置权重,因此,他们根据所需的变量平衡训练集:
sample_weights = sklearn.preprocessing.balance_weights(X[:,i])
clf = svm.SVC()
clf_weights.fit(X, y, sample_weight=sample_weights)
对于非均匀分布的目标,你就必须相应地调整sample_weights。
我的刺伤功能做我想要的东西在下面。希望这对别人有帮助。
X
和y
分别假定为Pandas DataFrame和Series。
def resample(X, y, sample_type=None, sample_size=None, class_weights=None, seed=None):
# Nothing to do if sample_type is 'abs' or not set. sample_size should then be int
# If sample type is 'min' or 'max' then sample_size should be float
if sample_type == 'min':
sample_size_ = np.round(sample_size * y.value_counts().min()).astype(int)
elif sample_type == 'max':
sample_size_ = np.round(sample_size * y.value_counts().max()).astype(int)
else:
sample_size_ = max(int(sample_size), 1)
if seed is not None:
np.random.seed(seed)
if class_weights is None:
class_weights = dict()
X_resampled = pd.DataFrame()
for yi in y.unique():
size = np.round(sample_size_ * class_weights.get(yi, 1.)).astype(int)
X_yi = X[y == yi]
sample_index = np.random.choice(X_yi.index, size=size)
X_resampled = X_resampled.append(X_yi.reindex(sample_index))
return X_resampled
[StratifiedKFold](http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.StratifiedKFold.html) – EdChum
以及[StratifiedShuffleSplit](HTTP:// scikit学习。组织/稳定/模块/生成/ sklearn.cross_validation.StratifiedShuffleSplit.html) – lanenok