logo
Loading...

如何處理不平衡資料 - 【教材專區】學習AI有困難? 讓Cupoy助教來幫你! - Cupoy

目錄 何謂「不平衡資料」? 不平衡資料對模型訓練、預測有何影響? 如何處理表格資料中不平衡資料的現象? 如何處理影像資料中不平衡資料的現象? 何謂「不平衡資料」? 簡介:當資料中某類別變數的類別...

目錄 何謂「不平衡資料」? 不平衡資料對模型訓練、預測有何影響? 如何處理表格資料中不平衡資料的現象? 如何處理影像資料中不平衡資料的現象? 何謂「不平衡資料」? 簡介:當資料中某類別變數的類別比例差異大,造成某類別特別多或特別少,就稱為「不平衡資料」 實際案例 想預測成骨不全症(俗稱:玻璃娃娃)等罕見疾病 想預測某個人信用卡信用風險 不平衡資料對模型訓練、預測有何影響? 對模型訓練的影響 對評估的影響 如使用 Accuracy:會得到很高的準確度,但並沒有達到模型本身的意義 實際案例顯示問題:假設有 100 筆資料以預測是否不信任某信用卡用戶,其中 5 筆為不信任、其餘 95 筆為信任,如使用 Accuracy ,光直接猜測全部用戶皆為「信任」也有 95% 的準確度,但並不符合模型建立的初衷,因此應針對少量類別的預測準確狀況評估模型好壞。 如何處理表格資料中不平衡資料的現象? Undersampling 將多類別資料以取後不放回的隨機抽樣、分層隨機抽樣或配對抽樣等方式抽出近似於少類別數量的資料 程式碼實現 import numpy as np import pandas as pd from IPython.display import display from imblearn.under_sampling import RandomUnderSampler from imblearn.over_sampling import RandomOverSampler, SMOTE from sklearn.model_selection import train_test_split # Step1. Load Data # OneHot Encoding and Label Encoding row_data = pd.read_csv("dataset.csv") print(row_data.info()) # Step2. EDA and preprocessing work_type_dict = { class_name: [0 if i != class_index else 1 for i in range(row_data["work_type"].unique().tolist().__len__())]\ for class_index, class_name in enumerate(row_data["work_type"].unique()) } smoking_status_dict = { class_name: [0 if i != class_index else 1 for i in range(row_data["smoking_status"].unique().tolist().__len__())]\ for class_index, class_name in enumerate(row_data["smoking_status"].unique()) } row_data["gender"] = row_data["gender"].apply(lambda x: 0 if x == "Female" else 1) row_data["ever_married"] = row_data["ever_married"].apply(lambda x: 0 if x == "No" else 1) row_data["Residence_type"] = row_data["Residence_type"].apply(lambda x: 0 if x == "Rural" else 1) row_data = pd.concat([ row_data.drop(columns = ["work_type", "smoking_status"]), pd.DataFrame(np.array( [work_type_dict[i] for i in row_data["work_type"]] ), columns = [f"work_type_{class_name}" for class_name in work_type_dict.keys()]), pd.DataFrame(np.array( [smoking_status_dict[i] for i in row_data["smoking_status"]] ), columns = [f"smoking_status_{class_name}" for class_name in smoking_status_dict.keys()]) ], axis = 1) # Missing value row_data = row_data.dropna() print(display(row_data["stroke"].value_counts())) # Step3. Define Input and Outcome Data xdata, ydata = row_data.drop(columns = ["id", "stroke"]), row_data["stroke"] # Step4. Split data into xtrain, xtest, ytrain, ytest xtrain, xtest, ytrain, ytest = train_test_split(xdata, ydata, test_size = 0.2) # Step5. Balanced train data undersample = RandomUnderSampler() xtrain_undersample, ytrain_undersample = undersample.fit_resample(xtrain, ytrain) print(display(ytrain_undersample.value_counts())) Oversampling 將少類別資料以取後放回的隨機抽樣、分層隨機抽樣或配對抽樣等方式抽至近似於多類別數量的資料 程式碼實現# Step5. Balanced train data oversample = RandomOverSampler() xtrain_oversample, ytrain_oversample = oversample.fit_resample(xtrain, ytrain) print(display(ytrain_oversample.value_counts())) Synthetic Minority Oversampling Technique (SMOTE) SMOTE 是依照少類別數量資料的特質生成出近似於少類別數量資料的方法 程式碼實現# Step5. Balanced train data smote = SMOTE() xtrain_smote, ytrain_smote = smote.fit_resample(xtrain, ytrain) print(display(ytrain_smote.value_counts())) 如何處理影像資料中不平衡資料的現象? Rotation Flip Crop Reference Tan, J. (2020). How to deal with imbalanced data in Python. (https://towardsdatascience.com/how-to-deal-with-imbalanced-data-in-python-f9b71aba53eb)Liu, Tianyu; Fan, Wenhui; Wu, Cheng (2019), “Data for A hybrid machine learning approach to cerebral stroke prediction based on imbalanced medical-datasets”, Mendeley Data, V1, doi: 10.17632/x8ygrw87jw.1