在以下数据框中,只有两个可能的标签:
localStorage.setItem('expirationdate',tokenexpiration)
我已经编写了一个代码来按“名称”列对数据进行分组并将结果转换为一个numpy数组,因此每一行都是特定组的所有样本的集合,而Lables是另一个numpy数组:
数据:
name f1 f2 label
0 A 8 9 1
1 A 5 3 1
2 B 8 9 0
3 C 9 2 0
4 C 8 1 0
5 C 9 1 0
6 D 2 1 0
7 D 9 7 0
8 D 3 1 0
9 E 5 1 1
10 E 3 6 1
11 E 7 1 1
标签:
[[8 9] [5 3] [0 0]] # A lable = 1
[[8 9] [0 0] [0 0]] # B lable = 0
[[9 2] [8 1] [9 1]] # C lable = 0
[[2 1] [9 7] [3 1]] # D lable = 0
[[5 1] [3 6] [7 1]] # E lable = 1
代码:
[[1]
[0]
[0]
[0]
[1]]
我想从过度代表的类中重新采样并删除实例。
即
import pandas as pd
import numpy as np
def prepare_data(group_name):
df = pd.read_csv("../data/tmp.csv")
group_index = df.groupby(group_name).cumcount()
data = (df.set_index([group_name, group_index])
.unstack(fill_value=0).stack())
target = np.array(data['label'].groupby(level=0).apply(lambda x: [x.values[0]]).tolist())
data = data.loc[:, data.columns != 'label']
data = np.array(data.groupby(level=0).apply(lambda x: x.values.tolist()).tolist())
print(data)
print(target)
prepare_data('name')
将是一个可以接受的解决方案,因为删除D(标记为“ 0”)将得到2 *标签“ 1”和2 *标签“ 0”的平衡数据集。
答案 0 :(得分:2)
假设每个name
都被一个label
恰好标记(例如,所有A
都是1
),则可以使用以下代码:
name
将label
分组,并检查哪个标签多余(就唯一名称而言)。代码如下:
labels = df.groupby('label').name.unique()
# Sort the over-represented class to the head.
labels = labels[labels.apply(len).sort_values(ascending=False).index]
excess = len(labels.iloc[0]) - len(labels.iloc[1])
remove = np.random.choice(labels.iloc[0], excess, replace=False)
df2 = df[~df.name.isin(remove)]
答案 1 :(得分:2)
使用imblearn(pip install imblearn
),这很简单:
from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(sampling_strategy='not minority', random_state=1)
df_balanced, balanced_labels = rus.fit_resample(df, df['label'])
除了RandomUnderSampler
以外,还有许多其他方法,因此建议您阅读文档。
答案 2 :(得分:0)
非常简单的方法。取自sklearn文档和Kaggle。
from sklearn.utils import resample
df_majority = df[df.label==0]
df_minority = df[df.label==1]
# Upsample minority class
df_minority_upsampled = resample(df_minority,
replace=True, # sample with replacement
n_samples=20, # to match majority class
random_state=42) # reproducible results
# Combine majority class with upsampled minority class
df_upsampled = pd.concat([df_majority, df_minority_upsampled])
# Display new class counts
df_upsampled.label.value_counts()
答案 3 :(得分:0)
您可以使用分组表示形式进行重采样。
def balance_df(frame: pd.DataFrame, col: str, upsample_minority: bool):
grouped = frame.groupby(col)
n_samp = {
True: grouped.size().max(),
False: grouped.size().min(),
}[upsample_minority]
fun = lambda x: x.sample(n_samp, replace=upsample_minority)
balanced = grouped.apply(fun)
balanced = balanced.reset_index(drop=True)
return balanced