機器學習——過采樣(OverSampling),解決類別不平衡問題,案例:邏輯回歸 信用卡欺詐檢測

下采樣:機器學習——下采樣(UnderSampling),解決類別不平衡問題,案例:邏輯回歸 信用卡欺詐檢測-CSDN博客

(完整代碼在底部)


解決樣本不平衡問題:SMOTE 過采樣實戰講解

在實際的機器學習任務中,數據集往往存在類別不平衡問題,尤其是在信用卡欺詐檢測、疾病預測等場景中,正樣本極其稀少。若不處理這一問題,模型更傾向于預測多數類,導致 recall 值(召回率)偏低。

SMOTE 的核心思想是:不是復制已有少數類樣本,而是通過“插值”方式生成新的樣本點,使少數類樣本在特征空間中更豐富、分布更自然。

說白了就是在每兩個同類別的點之間插入新點,也同樣是此類別

工作步驟如下:

  1. 找鄰居
    對于每一個少數類樣本,SMOTE 會在該類中找到若干個(如 5 個)“最近鄰”樣本。

  2. 隨機選擇鄰居
    從這幾個鄰居中,隨機選一個作為“參考點”。

  3. 插值生成新樣本
    在原樣本和參考點之間,以一定比例隨機插值,生成一個“新的樣本點”。
    也就是說,這個新樣本不是原樣本的復制,也不是鄰居樣本的復制,而是它們之間的“連線上的點”。

    數學公式如下(對特征向量來說):

    • xi?:原始少數類樣本

    • xn?:其某個鄰居

    • λ:0~1之間的隨機數,決定插值比例

  4. 重復以上過程,直到少數類樣本數量和多數類一樣多,達到“類別平衡”。

本篇文章將通過信用卡欺詐檢測數據集(creditcard.csv),演示如何使用 SMOTE 方法對訓練集進行過采樣,并對比模型在過采樣前后的性能表現差異。


一、引入所需模塊

import numpy as np
import pandas as pd
from sklearn import metrics
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# from imblearn.over_sampling import SMOTE # 過采樣

二、數據預處理

信用卡欺詐檢測數據集?creditcard.csv

  • 數據來源信用卡欺詐檢測實戰數據集_數據集-阿里云天池https://tianchi.aliyun.com/dataset/101562?accounttraceid=c1258603818f44d6a57fe125248cc969rkgu

  • 樣本總數:284,807 條

  • 特征數:30(28個匿名特征 + 金額 Amount + 時間 Time

  • 目標變量Class(0=正常交易,1=欺詐交易)

??? ?

讀取數據并標準化金額列

# 讀取信用卡欺詐數據集
data = pd.read_csv('creditcard.csv')# 對“Amount”金額列進行標準化(均值為0,標準差為1)
scaler = StandardScaler()
data['Amount'] = scaler.fit_transform(data[['Amount']])# 刪除無關的“Time”列
data = data.drop("Time", axis=1)

特征與標簽劃分

# 分離特征和目標變量
X = data.drop("Class", axis=1)  # 特征變量
y = data.Class                  # 目標變量(是否欺詐)

劃分訓練集與測試集

# 將數據劃分為訓練集和測試集,比例為7:3
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=100)

三、原始數據模型訓練與評估

# 使用原始訓練數據訓練邏輯回歸模型
model = LogisticRegression()
model.fit(X_train, y_train)

查看原始類別分布

# 查看原始數據中正負樣本(欺詐/正常交易)的數量
labels_count = pd.value_counts(data['Class'])
print("原數據組成:\n", labels_count)

結果:

在原始測試集上評估模型

# 在原始測試集上評估原始模型的性能
print("‘原數據訓練得到的模型’ 對 ‘原數據的測試集’ 的測試:")
predictions_test = model.predict(X_test)
print(metrics.classification_report(y_test, predictions_test))

這種情況下,模型可能在類別為“1”(欺詐)的召回率較低,常見表現為:

  • precision 較高,但 recall 偏低

  • 模型傾向于預測為正常交易


四、使用 SMOTE 進行過采樣

進行訓練集過采樣

# ======================== 使用 SMOTE 過采樣 ========================
from imblearn.over_sampling import SMOTE
# 對訓練數據進行過采樣,使正負樣本數量相同
oversampler = SMOTE(random_state=100)
X_train_os, y_train_os = oversampler.fit_resample(X_train, y_train)

? 注意:測試集不要過采樣,保持原始分布才能真實評估模型性能。

查看過采樣后的數據組成

# 查看過采樣后訓練數據中正負樣本的數量
labels_count_under = pd.value_counts(y_train_os)
print("下采樣數據組成:\n", labels_count_under)

示例輸出:199014為284807的%70

原理步驟:

  1. 對每個少數類樣本,找到其最近的 k?個同類鄰居(默認 k=5)

  2. 隨機選取若干鄰居點

  3. 在原樣本和鄰居之間插值生成“合成樣本”(就是在兩兩之間多插入幾個數據

  4. 不是復制已有樣本,而是生成新的樣本點,更豐富、更自然


五、使用過采樣數據訓練模型

# 使用過采樣后的數據重新訓練邏輯回歸模型
model_os = LogisticRegression(C=10, penalty='l2', max_iter=1000)
model_os.fit(X_train_os, y_train_os)

在原始測試集上評估新模型

# 在原始測試集上評估過采樣模型的性能
print("‘過采樣數據訓練得到的模型’ 對 ‘原數據的測試集’ 的測試:")
predictions_test = model_os.predict(X_test)
print(metrics.classification_report(y_test, predictions_test))

評估對比與說明

指標/類別原模型過采樣模型解讀
類別 1 Recall(召回率)0.650.88 ?過采樣顯著提高了識別能力
類別 1 Precision(精準率)0.77 ?0.06 ?誤報大幅增加,很多 0 被錯判為 1(寧殺錯
類別 1 F1-score(平衡指標)0.70 ?0.11 ?整體準確性下降
類別 0 Recall1.00 ?0.98正常交易略受影響
總體 Accuracy1.00 ?0.98正確率略下降
Macro avg Recall0.820.93 ?兩類平均召回提升

六、結果對比分析

指標原始模型SMOTE過采樣模型
Precision(1類)較高較高
Recall(1類)較低明顯提升
F1-score(1類)偏低顯著提升
Accuracy接近1可能略有下降

🎯 結論:SMOTE 有效提高了模型對少數類(欺詐行為)的識別能力,在保持總體準確率的同時顯著改善了 recall 和 F1-score,是處理不平衡問題的有效方法之一。


七、總結與建議

  • SMOTE(Synthetic Minority Over-sampling Technique)通過生成新的少數類樣本來平衡數據分布,是一種優于簡單復制的過采樣方式。

  • 在不平衡數據場景中,評估指標應以 recall/F1-score 為主,而非 accuracy。

  • SMOTE 適合用于訓練集,而不應作用于測試集。

  • 邏輯回歸 + SMOTE 是一種簡單有效的基線方案,可用于模型初步構建與對比。


完整代碼:

import numpy as np
import pandas as pd
from sklearn import metrics
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler# 讀取信用卡欺詐數據集
data = pd.read_csv('creditcard.csv')# 對“Amount”金額列進行標準化(均值為0,標準差為1)
scaler = StandardScaler()
data['Amount'] = scaler.fit_transform(data[['Amount']])# 刪除無關的“Time”列
data = data.drop("Time", axis=1)# 分離特征和目標變量
X = data.drop("Class", axis=1)  # 特征變量
y = data.Class                  # 目標變量(是否欺詐)# 將數據劃分為訓練集和測試集,比例為7:3
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=100)# 使用原始訓練數據訓練邏輯回歸模型
model = LogisticRegression()
model.fit(X_train, y_train)# 查看原始數據中正負樣本(欺詐/正常交易)的數量
labels_count = pd.value_counts(data['Class'])
print("原數據組成:\n", labels_count)# 在原始測試集上評估原始模型的性能
print("‘原數據訓練得到的模型’ 對 ‘原數據的測試集’ 的測試:")
predictions_test = model.predict(X_test)
print(metrics.classification_report(y_test, predictions_test))# ======================== 使用 SMOTE 過采樣 ========================
from imblearn.over_sampling import SMOTE
# 對訓練數據進行過采樣,使正負樣本數量相同
oversampler = SMOTE(random_state=100)
X_train_os, y_train_os = oversampler.fit_resample(X_train, y_train)# 使用過采樣后的數據重新訓練邏輯回歸模型
model_os = LogisticRegression(C=10, penalty='l2', max_iter=1000)
model_os.fit(X_train_os, y_train_os)# 查看過采樣后訓練數據中正負樣本的數量
labels_count_under = pd.value_counts(y_train_os)
print("過采樣數據組成:\n", labels_count_under)# 在原始測試集上評估過采樣模型的性能
print("‘過采樣數據訓練得到的模型’ 對 ‘原數據的測試集’ 的測試:")
predictions_test = model_os.predict(X_test)
print(metrics.classification_report(y_test, predictions_test))

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91874.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91874.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ettus USRP X440 進行“超短波個人衛星信號的偵查與干擾”任務

結合 Ettus USRP X440 進行“超短波個人衛星信號的偵查與干擾”任務,可以構建一個高性能、靈活可編程的電子對抗系統原型平臺。以下是面向科研/工程/軍用驗證場景的構思和技術文案: 🛰? 項目名稱建議(可選)&#xff1…

如何在出售Windows11/10/8/7前徹底清除電腦數據

為了保護您的個人數據,在出售電腦前徹底清除數據是一個明智之舉。然而,僅僅刪除文件是不夠的,因為恢復工具通常可以恢復它們。因此,本指南分享了如何在出售電腦前清除數據,包括 Windows 11/10/8/7,確保您的…

Go語言實戰案例:多協程并發下載網頁內容

本文是《Go語言100個實戰案例 網絡與并發篇》第6篇,實戰演示如何使用 Goroutine 和 Channel,實現多協程并發抓取網頁內容,提升網絡請求效率,為構建爬蟲、內容聚合器、API 批量采集器打下基礎。一、實戰背景在互聯網項目中&#x…

分享鏈接實現狀態共享

有這么一個場景:就是有一些列表頁面,然后上面是有一些篩選項的,我去對這個列表做了一些篩選出來一個結果,然后我想把這個鏈接,或者說把這個篩選結構給分享出去,讓別人在打開這個頁面的時候,也是…

Fay數字人如何使用GPT-SOVITS進行TTS轉換以及遇到的一些問題

一、GPT-SoVITS 簡介 GPT-SoVITS 是一款開源的語音合成(TTS)工具,結合了 GPT 模型的文本理解能力與 SoVITS(Sound of Voice In Text-to-Speech)的聲紋模擬技術,能夠實現高自然度、個性化的語音合成。它支持…

HTML 顏色值

HTML 顏色值 引言 在網頁設計和開發中,顏色是一個重要的元素,它能夠幫助用戶更好地理解內容,提升視覺效果。HTML 顏色值是用于指定網頁中元素顏色的一種標準表示方法。本文將詳細介紹 HTML 顏色值的種類、表示方法以及在實際應用中的使用技巧。 HTML 顏色值種類 HTML 顏…

關于記錄一下“bug”,在做圖片上傳的時候出現的小問題

項目場景:之前的話寫過csdn,最近出現了一些小事情,所以耽誤了好久沒有更新,最近把以前的項目拿出來然后改了下環境就出現了一些問題,該項目使用SpringBoot3.5 SpringMVC Mybatis-Plus3.5.0,然后權限控制采…

數據結構:基礎知識和鏈表①

一、概念程序數據結構算法1.描述數據存儲和操作的結構 2.操作數據對象的方法二、衡量代碼的質量和效率 無論代碼操作數據量多大,希望程序代碼的運行時間保持恒定 隨著數據的增長,程序運行時間緩慢增長隨著數據的增長,程序運…

進階向:自動化天氣查詢工具(API調用)

自動化天氣查詢工具(API調用)完全指南天氣數據是日常生活中經常需要查詢的信息之一。本教程將介紹如何使用Python編寫一個自動化天氣查詢工具,通過調用開放的天氣API獲取實時天氣數據。這個工具適合完全不懂編程的新手學習,將從最…

【ROS2】常用命令

1、目錄結構在 ROS 2 包中,launch、urdf、rviz(通常指 RViz 配置文件)、config 等文件夾應直接放在包的根目錄下(與 robot_arm/ Python 模塊目錄同級)。這是 ROS 2 社區的通用約定,便于工具(如 …

基礎組件(三):mysql連接池

文章目錄一、MySQL連接池設計1. 連接池解決了什么問題?連接池的作用 (好處)為什么不創建多條連接而用連接池2. 同步和異步連接池的區別同步連接池(場景局限,應用服務器啟動時初始化資源)異步連接池&#xf…

FI文件包含漏洞

本地文件包含(LFI)文件包含開發人員將可重復使用的內容寫到單個文件中,使用時直接調用此文件,無需再次編寫,這種調用文件的過程一般被稱為文件包含。這樣編寫代碼能減少代碼冗余,降低代碼后期維護難度&…

rapidocr_web v1.0.0發布了

建立RapidOCRWeb獨立倉庫 終于將web這塊代碼移了出來,成立了獨立倉庫RapidOCRWeb (https://github.com/RapidAI/RapidOCRWeb )。這樣以來,RapidOCR倉庫下的各個衍生項目均有自己的獨立倉庫,可以單獨控制發版和維護。這也算是為RapidOCR減負了…

Arduino IDE離線安裝ESP8266板管理工具

文章目錄概要官網地址開發板管理地址安裝ESP8266開發板支持離線安裝額外記錄NODE啟動服務概要 Arduino IDE離線安裝ESP8266板管理工具&#xff0c;在線安裝因為網絡或者https的問題不能安裝 官網地址 Adruino&#xff1a;https://www.arduino.cc/ ESP8266項目&#xff1a;<…

兩款免費數據恢復軟件介紹,Win/Mac均可用

數據已成為我們生活與工作中不可或缺的重要組成部分。無論是珍貴的家庭照片、關鍵的工作文檔&#xff0c;還是重要的學習資料&#xff0c;都以數據的形式存儲在各類設備中。然而&#xff0c;數據丟失的情況卻時常發生&#xff0c;可能是誤操作刪除&#xff0c;可能是設備意外損…

Java開發中敏感信息加密存儲全解析:筑牢數據安全防線

Java開發中敏感信息加密存儲全解析&#xff1a;筑牢數據安全防線 一、引言 1.1 敏感信息存儲的現狀與挑戰 在數字化時代&#xff0c;數據已然成為企業和組織的核心資產之一&#xff0c;而敏感信息的存儲更是重中之重。從日常的用戶登錄密碼、身份證號碼&#xff0c;到金融領域…

list的使用和模擬

(一)list的了解 (1)簡單了解 list的文檔介紹 list是基于雙向鏈表的序列式容器&#xff0c;支持雙向迭代和任意位置的常數時間插入刪除&#xff0c;相比 array、vector 等容器在這類操作上更高效&#xff0c;但不支持隨機訪問&#xff08;訪問需線性遍歷&#xff09;且因額外…

Docker 初學者需要了解的幾個知識點 (五):建容器需要進一步了解的概念

之前在《Docker 初學者需要了解的幾個知識點》幾篇文章里&#xff0c;我們梳理了 Docker 的核心概念&#xff08;如鏡像、容器、網絡等&#xff09;&#xff0c;但在實際搭建 ThinkPHP 容器環境時&#xff0c;又遇到了一些更具體的術語和配置場景。這些內容和實操結合緊密&…

【數據結構】棧的順序存儲(整型棧、字符棧)

【數據結構】棧的順序存儲&#xff08;整型棧、字符棧&#xff09;一、棧的結構定義二、字符棧的初始化、入棧、出棧、判斷是否棧為空、獲取棧頂元素、獲取棧的當前元素個數等操作三、整型棧的初始化、入棧、出棧、判斷是否棧為空、獲取棧頂元素、獲取棧的當前元素個數等操作一…

【大模型實戰】向量數據庫實戰 - Chroma Milvus

在 RAG&#xff08;檢索增強生成&#xff09;場景中&#xff0c;非結構化數據&#xff08;文本、圖像等&#xff09;的高效檢索是核心需求。傳統關系型數據庫難以勝任&#xff0c;而向量數據庫通過將數據轉化為向量、基于相似度快速匹配&#xff0c;成為 RAG 的關鍵支撐。本文聚…