如何在有条件的情况下删除y_train数组中值的百分比

时间:2019-04-23 10:27:50

标签: python arrays numpy

我是Python的新手,我有一个问题要删除数组y_train中50%的值,但只删除那些值= 0的值

所以我正在使用train_test_split创建x_test x_train y_test和y_train。在y_train中,值为0的5287倍和值为1的422倍。 我想删除50%的y_train,其中值为0。因此y_train只有5287/2 = 2644乘以值0和422乘以值1。

我要这样做,因为我的数据框很小。我的随机森林模型仅预测0,而不预测1。因此,我希望y_train中的值0较小。问题在于y_train是一个数组而不是一个数据帧。

以“ Schade_tussen_6_18_mnd”作为目标,定义X和Y

Y = np.array(df['Schade_tussen_6_18_mnd'])
X = df.drop('Schade_tussen_6_18_mnd', axis=1)

用于拆分数据:

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, stratify=Y)

我尝试过 Y_train.drop(Y_train.query(' = 0').sample(frac=0.5).index) 但是我得到了错误:numpy.ndarray'对象没有属性'drop

我希望输出为y_train(2644,422)而不是y_train(5287,422)

1 个答案:

答案 0 :(得分:0)

实际上,不要自己做,而要使用imbalanced-learn之类的软件包。

但这是使用numpy进行操作的示例:

c10 = np.polynomial.Chebyshev.fit(x, y,10)
plt.xscale("log")
plt.plot(x, y, '.', x, a(x), '-')
plt.show()

示例:

import numpy as np

def make_fake_y(n_zeros, n_ones):
    y = np.array([0]*n_zeros +  [1]*n_ones)
    np.random.shuffle(y)
    return y 

def find_half_the_zeros(y):
    idx_0 = np.where(y==0)[0]
    np.random.shuffle(idx_0)
    idx_delete = idx_0[:idx_0.shape[0]//2]
    return idx_delete