資料不平衡:下采樣、上取樣python程式碼實現
阿新 • • 發佈:2019-02-15
一、下采樣
所有資料存在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