我的数据存在不平衡,如下所示,每次尝试使用ADASYN时都会显示错误,是否需要为此提供任何参数?有时它会运行很长时间,但即使代码运行了40分钟后也没有响应。
counts percentageEnquiry Assigned 91284 75.902382Test Drive Provided 25274 21.015258Test Drive Arranged 3434 2.855361Booked 266 0.221178Test Ride Provided 7 0.005820
请建议我们如何使用Python代码来解决这个问题。根据他人的推荐,我听说过以下几种方法:
- 可以一次对两个层次进行采样,然后在此基础上进行迭代
- 对占75%的数据进行下采样可能会有帮助?
- 或者使用skmultilearn的任何解决方案?
代码:
def makeOverSamplesADASYN(X,y): #X →独立变量在DataFrame中 #y →依赖变量在Pandas DataFrame格式中 from imblearn.over_sampling import ADASYN sm = ADASYN(sampling_strategy='all', random_state=None, n_neighbors=5, n_jobs=1, ratio=None) X_adassin, y_adassin = sm.fit_resample(X, y) makeOverSamplesADASYN(X,data_dummyvar['Sales Stage']) print(X_adassin.shape) print(y_adassin.shape)'''
输出===> 这需要运行很长时间且之后没有结果,请建议
回答:
我使用下面的代码对顶部条目进行了一次下采样。
### " data_dummyvar " 是我的DataFrame,形状为 (120265, 894)df_majority=data_dummyvar[data_dummyvar['Sales Stage']=='Enquiry Assigned']df_majority.shapefrom sklearn.utils import resample# 下采样多数类df_majority_downsampled = resample(df_majority,replace=False,n_samples=25289,random_state=123) #replace: 不替换抽样# n_samples: 匹配少数类#random_state: 可重现结果df_majority_downsampled.shapedf_minority=data_dummyvar[data_dummyvar['Sales Stage'] !='Enquiry Assigned']df_minority['Sales Stage'].value_counts()df_first_scaling = pd.concat([df_majority_downsampled,df_minority],ignore_index=True)g = df_first_scaling['Sales Stage']df = pd.concat([g.value_counts(), g.value_counts(normalize=True).mul(100)],axis=1, keys=('counts','percentage'))print (df)
上述代码将给出如下结果:输出 ===>>
counts percentageEnquiry Assigned 25289 46.598489Test Drive Provided 25281 46.583748Test Drive Arranged 3434 6.327621Booked 266 0.490142
这里的’Enquiry Assigned’条目已被下采样。
现在我们需要对我们的数据”df_first_scaling”运行两次SMOTE/ADASYN类似的算法,因为我们还有以下三个条目
def makeOverSamplesADASYN(X,y): #输入DataFrame #X →独立变量在DataFrame中 #y →依赖变量在Pandas DataFrame格式中 from imblearn.over_sampling import ADASYN sm = ADASYN(sampling_strategy='minority', random_state=None, n_neighbors=5, n_jobs=1, ratio=None) global X_adassin_1 global y_adassin_1 X_adassin_1, y_adassin_1 = sm.fit_resample(X, y)makeOverSamplesADASYN(X,df_first_scaling['Sales Stage']) # 函数调用print(X_adassin_1.shape)print(y_adassin_1.shape)
这给出的输出形状为==>
(79334, 893)(79334,)
在对更新后的数据集再次运行相同的代码后,我们可以得到形状为(101229, 893) & (101229,)的样本DataFrame