如何在scikit中进行抽样学习?

Gau*_*til 9 python dataset sampling python-2.7 scikit-learn

我们有一个视网膜数据集,其中患病的眼睛信息占信息的70%,而非患病的眼睛构成剩余的30%.我们想要一个数据集,其中患病的和非患病的样本应该在数量上相等.是否有任何功能可以帮助我们做同样的事情?

Ric*_*ren 15

我会选择用这样做熊猫DataFramenumpy.random.choice.通过这种方式,可以很容易地进行随机抽样以生成大小相同的数据集.一个例子:

import pandas as pd
import numpy as np

data = pd.DataFrame(np.random.randn(7, 4))
data['Healthy'] = [1, 1, 0, 0, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)

该数据有两个非健康和五个健康样本.要从健康人群中随机挑选两个样本,您可以:

healthy_indices = data[data.Healthy == 1].index
random_indices = np.random.choice(healthy_indices, 2, replace=False)
healthy_sample = data.loc[random_indices]
Run Code Online (Sandbox Code Playgroud)

要自动选择与非健康组相同大小的子样本,您可以执行以下操作:

sample_size = sum(data.Healthy == 0)  # Equivalent to len(data[data.Healthy == 0])
random_indices = np.random.choice(healthy_indices, sample_size, replace=False)
Run Code Online (Sandbox Code Playgroud)


Fom*_*aut 2

作为一种变体,您可以使用随机方法。假设您有一个包含data大量元组的数据集(X, Y),其中Y有患病的眼睛信息(0 或 1)。您可以为数据集准备一个包装器,它以 0.3 / 0.7 的概率传递所有未患病的眼睛并传递患病的眼睛(您只需要数据集中 30% 的患病眼睛)。

from random import random


def wrapper(data):
    prob = 0.3 / 0.7

    for X, Y in data:
        if Y == 0:
            yield X, Y
        else:
            if random() < prob:
                yield X, Y


# now you can use the wrapper to extract needed information
for X, Y in wrapper(your_dataset):
    print X, Y
Run Code Online (Sandbox Code Playgroud)

请注意,如果您需要多次使用此包装器作为生成器并希望获得相同的结果,则必须在使用该函数之前设置固定的随机种子random()。更多信息: https: //docs.python.org/2/library/random.html