機器學習第三課之邏輯回歸(三)LogisticRegression

目錄

簡介

?1.下采樣

2.過采樣?


簡介

????????接上兩篇篇博客最后,我們使用了K折交叉驗證去尋找最合適的C值,提升模型召回率,對于選取C的最優值,我們就要把不同C值放到模型里面訓練,然后用驗證集去驗證得到結果進行比較發現最后模型得到很大的提升 ,但是相對與召回率還是差了很多

機器學習第二課之邏輯回歸(一)LogisticRegression

機器學習第二課之邏輯回歸(一)LogisticRegression

????????我們可以清楚的發現我們雖然有28萬條數據集,但是相對于標簽為1的數據集卻只有四百多條,數據集分布及其不均勻,想要對于暫時學習的模型進行進一步提升沒有太大的效果,只能對數據集進行一些處理,使得模型的效果得到提升,使用今天我來介紹兩種對于數據集分布不均勻的優化處理。

?1.下采樣

????????我們要想用這樣的數據去建模顯然是存在問題的。尤其是在我們更關心少數類的問題的時候數據分類不均衡會更加的突出,例如,信用卡詐騙、病例分析等。在這樣的數據分布的情況下,運用機器學習算法的預測模型可能會無法做出準確的預測,最后的模型顯然是趨向于預測多數集的,少數集可能會被當做噪點或被忽視,相比多數集,少數集被錯分的可能性很大。從本質上講,機器學習算法就是從大量的數據集中通過計算得到某些經驗,進而判定某些數據的正常與否。但是,不均衡數據集,顯然少數類的數量太少,模型會更傾向于多數集。

針對多樣本的類篩選一部分樣本參與訓練。?下采樣的具體流程就是下圖所示

?代碼分析:

1.導入庫、數據標準化、劃分數據集。(跟前面都一樣)

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.model_selection import cross_val_scoredata = pd.read_csv("creditcard.csv")# 數據預處理
scaler = StandardScaler()
data["Amount"] = scaler.fit_transform(data[["Amount"]])
data = data.drop(["Time"], axis=1)  # 移除時間列# 劃分特征和標簽
x = data.iloc[:, :-1]  # 特征
y = data.iloc[:, -1]   # 標簽# 拆分訓練集和測試集
x_train_w, x_test_w, y_train_w, y_test_w = train_test_split(x, y, test_size=0.2, random_state=1000)

2.?數據準備

data_train_temp = x_train_w.copy()
data_train_temp['Class'] = y_train_w
  • 首先復制特征數據x_train_wdata_train_temp
  • 然后將標簽數據y_train_w作為新列Class添加到data_train_temp
  • 這樣就創建了一個包含特征和對應標簽的完整數據集

3.分離正負樣本

positive_eg = data_train_temp[data_train_temp['Class'] == 0]  # 正常樣本
negative_eg = data_train_temp[data_train_temp['Class'] == 1]  # 欺詐樣本
  • Class=0表示正常樣本(positive_eg)
  • Class=1表示欺詐樣本(negative_eg)

4.?下采樣處理

positive_eg = positive_eg.sample(len(negative_eg))
  • 這是下采樣的核心操作
  • 從正常樣本中隨機抽樣,抽樣數量等于欺詐樣本的數量
  • 這樣處理后,正常樣本和欺詐樣本的數量將保持一致

5.組合數據集

data_c = pd.concat([positive_eg, negative_eg])
  • 將下采樣后的正常樣本和原始欺詐樣本組合起來
  • 得到一個類別平衡的新數據集

6.拆分特征和標簽

x_new = data_c.drop('Class', axis=1)
y_new = data_c.Class
  • 從平衡后的數據集data_c中拆分出新的特征集x_new和標簽集y_new
  • 這些新數據可以用于后續的模型訓練

?7.交叉驗證、訓練、驗證、得到結果

scores = []
c_param_range = [0.01, 0.1, 1, 10, 100]
for i in c_param_range:lr = LogisticRegression(C=i, penalty="l2", solver='lbfgs', max_iter=10000)# 使用平衡后的數據集進行交叉驗證score = cross_val_score(lr,x_new, y_new, cv=5, scoring="recall")score_mean = sum(score) / len(score)scores.append(score_mean)print(f"C等于{i}的召回率為{score_mean}")best_c = c_param_range[np.argmax(scores)]
print("最好的C是:", best_c)# 使用最佳參數構建模型并訓練
estimator = LogisticRegression(C=best_c, max_iter=100)
estimator.fit(x_new,y_new )  # 使用原始訓練特征(不含額外添加的Class列)# 在測試集上進行預測和評估
test_predicted = estimator.predict(x_test_w)
print("訓練集準確率:", estimator.score(x_train_w, y_train_w))
print(metrics.classification_report(y_test_w, test_predicted))

8.結果

????????可以發現我們的召回率到達92%,效果得到很大的提升 ,對于準確率有些稍微下降,但是對于銀行來說是可以接受的,之前也說過最主要的是看召回率的高低。

2.過采樣?

針對少樣本類生成新的數據樣本參與訓練。

那我們依據什么擬合增加那么多數據呢 ?這就使用到了SMOTE 算法

????????SMOTE 算法是一種用于解決分類問題中數據類別不平衡問題的技術。在很多實際的分類場景中,比如欺詐檢測、疾病診斷等,少數類樣本(如欺詐交易、患病樣本)的數量往往遠少于多數類樣本(如正常交易、健康樣本)。這種不平衡的數據分布會導致模型在訓練時偏向于多數類,而對少數類的預測效果不佳。

????????SMOTE 算法的核心思想是通過對少數類樣本進行分析,然后人工合成新的少數類樣本并添加到數據集中,從而增加少數類樣本的數量,使數據分布更加平衡。具體來說,SMOTE 算法會為每個少數類樣本找到其在特征空間中的 k 個最近鄰,然后在這些最近鄰之間隨機插值,生成新的合成樣本。這些合成樣本具有與原始少數類樣本相似的特征分布,從而可以幫助模型更好地學習少數類的特征,提高對少數類樣本的分類準確率。

SMOTE 算法:

  1. 對于少數類中每一個樣本x,以歐氏距離為標準計算它到少數類樣本集S_{min}中所有樣本的距離,得到其k近鄰。
  2. 根據樣本不平衡比例設置一個采樣比例以確定采樣倍率N,對于每一個少數類樣本x,從其k近鄰中隨機選擇若干個樣本,假設選擇的近鄰為xn。
  3. 對于每一個隨機選出的近鄰xn,分別與原樣本按照如下的公式構建新的樣本

?X_{new}=x+rand(0,1)*\left | x-xn \right |

?新生成的這些數據點都是在這些線上

?代碼分析:

1.導入 SMOTE 類

from imblearn.over_sampling import SMOTE

imblearn庫的過采樣模塊中導入SMOTE類,該類實現了合成少數類過采樣技術。

2.初始化 SMOTE 對象?

oversampler = SMOTE(random_state=0)

?創建一個 SMOTE 過采樣器實例,random_state=0設置隨機種子,確保結果的可重復性。

3.執行過采樣?

os_x_train, os_y_train = oversampler.fit_resample(x_train_w, y_train_w)
  • fit_resample方法是 SMOTE 的核心操作,它會對少數類樣本進行分析并合成新樣本
  • x_train_w是原始訓練特征數據,y_train_w是對應的標簽
  • 處理后返回os_x_train(過采樣后的特征數據)和os_y_train(過采樣后的標簽)
  • 此時的數據集已經通過合成少數類樣本達到了類別平衡

4.劃分訓練集和測試集?

經過過采樣后得到的數據比較多,我們可以再一次進行數據集劃分。

os_x_train_w, os_x_test_w, os_y_train_w, os_y_test_w = train_test_split(os_x_train, os_y_train, test_size=0.2, random_state=0
)
  • 使用train_test_split將過采樣后的數據集劃分為新的訓練集和測試集
  • test_size=0.2表示將 20% 的數據作為測試集,80% 作為訓練集
  • random_state=0保證劃分結果的可重復性
  • 返回四個變量分別為:過采樣后的訓練特征、過采樣后的測試特征、過采樣后的訓練標簽、過采樣后的測試標簽

完整代碼:

只有中間部分跟下采樣有所不同,其他步驟都是相同的

import numpy as np
import pandas as pd
from  sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metricsfrom sklearn.model_selection import cross_val_scoredata=pd.read_csv("creditcard.csv")scaler=StandardScaler()
data["Amount"]=scaler.fit_transform(data[["Amount"]])
data=data.drop(["Time"],axis=1)x=data.iloc[:, :-1]
y=data.iloc[:, -1]x_train_w,x_test_w,y_train_w,y_test_w=train_test_split(x,y,test_size=0.2,random_state=0)from imblearn.over_sampling import SMOTE
oversampler=SMOTE(random_state=0)
os_x_train,os_y_train=oversampler.fit_resample(x_train_w,y_train_w)
os_x_train_w,os_x_test_w,os_y_train_w,os_y_test_w=train_test_split(os_x_train,os_y_train,test_size=0.2,random_state=0)scores = []
c_param_range = [0.01, 0.1, 1, 10, 100]
for i in c_param_range:lr = LogisticRegression(C=i, penalty="l2", solver='lbfgs', max_iter=10000)# 使用平衡后的數據集進行交叉驗證score = cross_val_score(lr,os_x_train_w, os_y_train_w, cv=8, scoring="recall")score_mean = sum(score) / len(score)scores.append(score_mean)print(f"C等于{i}的召回率為{score_mean}")best_c=c_param_range[np.argmax(scores)]
print("最好的c是:",best_c)estimator=LogisticRegression(C=best_c)
estimator.fit(os_x_train_w,os_y_train_w)
test_predicted=estimator.predict(x_test_w)print(metrics.classification_report(y_test_w,test_predicted))

?結果:

?可以發現我們的召回率到達94%,效果又得到很大的提升 ,

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

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

相關文章

1.Java語言有什么特點

1.Java語言有什么特點 1.面向對象編程,擁有封裝,繼承和多態的特性,所有可以很好的設計出低耦合的項目工程。 2.很好的可移植性,在Java中有java虛擬機(JVM)的支持,每寫一個類都是.Class文件。J…

部署 Kibana 8.2.2 可視化管理 Elasticsearch 8.2.2 集群

? 適用版本:Elasticsearch 8.2.2 Kibana 8.2.2 一、環境準備 組件版本示例地址Elasticsearch8.2.2192.168.130.61:9200, 192.168.130.62:9200, 192.168.130.65:9200Kibana8.2.2部署在 192.168.130.651操作系統CentOS 7?? 嚴格版本匹配:Kibana 8.2.2…

7.2 I/O接口 (答案見原書 P305)

第7章 輸入/輸出系統 7.1 I/O系統基本概念 (答案見原書 P301) & 7.2 I/O接口 (答案見原書 P305) 01. 在統一編址的方式下,區分存儲單元和I/O設備是靠( A )。 題目原文 在統一編址的方式下,區分存儲單元和I/O設備是靠( )。 A. 不同的地址碼 B. 不同的地址線 C. 不同…

并發編程常用工具類(上):CountDownLatch 與 Semaphore 的協作應用

在 Java 并發編程領域,JDK 提供的工具類是簡化多線程協作的重要武器。這些工具類基于 AQS(AbstractQueuedSynchronizer)框架實現,封裝了復雜的同步邏輯,讓開發者無需深入底層即可實現高效的線程協作。本文作為并發工具…

Go 工程化全景:從目錄結構到生命周期的完整服務框架

今天天氣很好, 正好手頭有個小項目, 整理了一下中小項目標準化的痛點問題, 如下, 希望可以幫到大家. 一個成熟的 Go 項目不僅需要清晰的代碼組織,還需要完善的生命周期管理。本文將詳細講解生產級 Go 服務的目錄設計(包含 model 等核心目錄)、…

【C++】2. 類和對象(上)

文章目錄一、類的定義1、類定義格式2、訪問限定符3、類域二、實例化1、實例化概念2、對象??三、this指針四、C和C語?實現Stack對?一、類的定義 1、類定義格式 class為定義類的關鍵字,Stack為類的名字,{ }中為類的主體,注意類定義結束時…

UnityURP 扭曲屏幕效果實現

UnityURP 扭曲屏幕效果實現前言項目下載URPGrabPass空間扭曲著色器實現添加可視化控制創建材質球并設置補充粒子使用步驟CustomData映射移動設備優化鳴謝前言 在Unity的Universal Render Pipeline (URP) 中,傳統的GrabPass功能被移除,借助URPGrabPass工…

(三)軟件架構設計

2024年博主考軟考高級系統架構師沒通過,于是決定集中精力認真學習系統架構的每一個環節,并在2025年軟考中取得了不錯的成績,雖然做信息安全的考架構師很難,但找對方法,問題就不大! 本文主要是博主在學習過程…

切記使用mt19937構造隨機數

在做 Kazaee CodeForces - 1746F 這個問題的時候,最初的時候使用了ran(),然后一直WA,遂改成mt19937,順利通過本道題。 mt19937 Rand(time(0)); 調用隨機數時候,使用: Rand() & 1 注意看&#xff0…

基于N32G45x+RTT驅動框架的定時器外部計數

時鐘選擇 高級控制定時器的內部時鐘:CK_INT: 兩種外部時鐘模式: 外部輸入引腳 外部觸發輸入 ETR 內部觸發輸入(ITRx):一個定時器用作另一個定時器的預分頻器 外部時鐘原理 通過配置 TIMx_SMCTRL.SMSEL=111 選擇該模式。 計數器可以配置為在所選輸入的時鐘上升沿或下降沿 …

[特殊字符] Ubuntu 下 MySQL 離線部署教學(含手動步驟與一鍵腳本)

適用于 Ubuntu 20.04 / 22.04 無網絡環境部署 MySQL。 建議初學者先按手動方式部署一遍理解原理,再使用自動化腳本完成批量部署。📁 一、準備工作 ? 1. 虛擬機環境 系統:Ubuntu 22.04(或兼容版本)環境:無網…

系統一個小時多次Full GC,導致系統線程停止運行,影響系統的性能,可靠性

背景: 某一天系統出現了請求超時,然后通過日志查看,程序執行到某一個位置,直接停下來來了,或者說所有的線程的執行都停下來了。而且是該時間段,請求處理變慢。排查相關的服務,并沒有出現死鎖&am…

使用OMV+NextCloud搭建私有云

原文地址:使用OMVNextCloud搭建私有云 – 無敵牛 歡迎參觀我的網站:無敵牛 – 技術/著作/典籍/分享等 OpenMediaVault(簡稱OMV)是一款基于Debian的開源網絡存儲(NAS)操作系統,提供Web管理界面&…

Codeforces Round 1008 (Div. 2)

A. Final Verdict 題目大意 給你一個數組a,每次把他拆分為等長的k個子序列,然后用子序列的平均數替換掉這個子序列,問最后能不能讓數組只剩下一個數字x 解題思路 無論怎么劃分,最后的總值是不變的,所以只需要看總和…

python轉移安裝目錄到D盤

遷移python安裝路徑第一步:移動目錄第二步:修改環境變量之前沒有設置之前設置過第一步:移動目錄 源路徑: C:\Users\Emma.ZRF\AppData\Local\Programs\Python\Python38 原環境變量 C:\Users\Emma.ZRF\AppData\Local\Programs\Pyth…

C#垃圾回收機制:原理與實踐

C#垃圾回收機制:原理與實踐 一、垃圾回收:C#內存管理的“幕后功臣”? 二、GC的核心引擎:基于代的優化策略 三、Demo展示 1. 簡單對象的垃圾回收示例 2. 基于代的回收示例 四、常用方法 五、推薦使用的場景 六、注意事項 管住手:避免濫用 GC.Collect() 析構函數:保持輕量 …

基于SpringBoot+MyBatis+MySQL+VUE實現的名城小區物業管理系統(附源碼+數據庫+畢業論文+開題報告+部署教程+配套軟件)

摘要 當下,正處于信息化的時代,許多行業順應時代的變化,結合使用計算機技術向數字化、信息化建設邁進。以前相關行業對于物業信息的管理和控制,采用人工登記的方式保存相關數據,這種以人力為主的管理模式已然落后。本人…

3DXML 轉換為 UG 的技術指南及迪威模型網在線轉換推薦

一、3DXML 轉換為 UG 的必要性 (一)軟件功能利用需求 3DXML 格式由達索系統開發,主要用于在其相關產品(如 CATIA、SOLIDWORKS 和 3DEXPERIENCE 等)中進行 3D 數據交換與輕量化可視化。它雖然能夠很好地在達索生態內實…

無人機光伏巡檢缺陷檢出率↑32%:陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析,引用來源標注 “陌訊技術白皮書”,禁止未經授權的轉載與改編。摘要在無人機光伏巡檢場景中,邊緣計算優化與復雜場景魯棒性是提升檢測效率的核心挑戰。本文解析陌訊多模態融合算法在光伏板熱斑、隱裂等缺陷檢測中的…

倉庫管理系統-15-前端之管理員管理和用戶管理

文章目錄 1 后臺查詢用戶列表 1.1 null和空字符串的檢查 1.2 UserController.java 2 管理員管理 2.1 傳遞參數roleId=1 2.2 admin/AdminManage.vue 3 用戶管理 3.1 傳遞參數roleId=2 3.2 user/UserManage.vue 管理員管理和用戶管理,與之前的Main.vue的內容基本一致,無非是管理…