如何使用imblearn和SMOTE生成分类合成样本?

时间:2016-11-14 01:18:10

标签: python python-3.x scikit-learn imblearn

我希望使用imblearn的SMOTE为机器学习算法生成合成样本。我有一些分类功能,我使用sklearn preprocessing.LabelEncoder转换为整数。

我遇到的问题是,当我使用smote生成合成数据时,数据点会变成浮点数而不是整数,这是分类数据所需要的。

from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.decomposition import PCA
import numpy as np
from sklearn import preprocessing

if __name__ == '__main__':
    df = pd.read_csv('resample.csv')
    y = df['Result']
    accounts = df['Account Number']
    df.drop('Result',axis=1,inplace=True)
    df.drop('Account Number', axis=1, inplace=True)

    df.fillna(value=0, inplace=True)

    le = preprocessing.LabelEncoder()
    le.fit(df['Distribution Partner'])
    print(le.classes_)
    df['Distribution Partner'] = le.transform(df['Distribution Partner'])
    print('Original dataset shape {}'.format(Counter(y)))
    sm = SMOTE(kind='regular')
    X_resampled, y_resampled = sm.fit_sample(df, y)
    np.savetxt('output.csv', X_resampled, delimiter=",")
    print('New dataset shape {}'.format(Counter(y_resampled)))

无论如何,我可以获得SMOTE来生成合成样本,但只能使用0,1,2等而不是0.5,1.23,2.004的值?

2 个答案:

答案 0 :(得分:0)

不幸的是,imblearn的SMOTE实现仅适用于连续数据。讨论了here

答案 1 :(得分:0)

非常简单:使用SMOTENC代替SMOTE。 SMOTENC可以处理分类和非分类特征。

示例代码:

from imblearn.over_sampling import SMOTENC`
obj = SMOTENC(categorical_features = [1,4])
ovsersampled_features, ovsersampled_target = obj.fit_sample(Features, Target)

[1,4] =数据集类别列的索引。

*索引从0开始。