1. 程式人生 > >資料不平衡:下采樣、上取樣python程式碼實現

資料不平衡:下采樣、上取樣python程式碼實現

一、下采樣

所有資料存在DataFrame物件df中。資料分為兩類:多數類別和少數類別,資料量相差大。資料預處理已將多數類別的Label標記為1,少數類別的Label標記為0。

import numpy as np
import pandas as pd


def lower_sample_data(df, percent=1):
    '''
    percent:多數類別下采樣的數量相對於少數類別樣本數量的比例
    '''
    data1 = df[df['Label'] == 1]  # 將多數類別的樣本放在data1
    data0 = df[df['Label'] == 0]  # 將少數類別的樣本放在data0
    index = np.random.randint(
        len(data1), size=percent * (len(df) - len(data1)))  # 隨機給定下采樣取出樣本的序號
    lower_data1 = data1.iloc[list(index)]  # 下采樣
    return(pd.concat([lower_data1, data0]))

示例:

np.random.seed(28)
arr1 = np.random.randint(6, size=(100, 5))
arr2 = np.random.randint(1000, 1010, size=(10, 5))
columns = ['A', 'B', 'C', 'D', 'E']
df1 = pd.DataFrame(arr1, columns=columns)
df1['Label'] = 1
df2 = pd.DataFrame(arr2, columns=columns)
df2['Label'] = 0
df = pd.concat([df1, df2])
print(lower_sample_data(df))

輸出:

       A     B     C     D     E  Label
37     4     3     0     1     4      1
41     5     5     5     4     4      1
35     5     3     2     2     5      1
69     0     0     1     0     4      1
98     2     4     5     2     0      1
78     3     3     2     4     3      1
52     2     2     1     3     3      1
43     0     0     5     5     4      1
61     5     0     1     0     5      1
86     3     2     0     1     4      1
0   1002  1005  1004  1005  1002      0
1   1007  1009  1005  1000  1003      0
2   1004  1005  1000  1003  1005      0
3   1002  1003  1000  1009  1003      0
4   1000  1002  1005  1009  1006      0
5   1001  1009  1003  1007  1003      0
6   1009  1004  1005  1007  1002      0
7   1008  1006  1009  1009  1009      0
8   1003  1007  1006  1007  1005      0
9   1001  1008  1003  1008  1003      0