機器學習——模型的簡單優化

在訓練模型時我們可能會遇到模型不滿足于預期需要進行改善的環節,這些情況通常包括以下幾種常見問題和對應的解決方案:

數據質量不足

  • 數據量過少:當訓練樣本不足時,模型難以學習到有效的特征表示。建議通過數據增強(如圖像旋轉、加噪等)或收集更多數據來解決
  • 數據不平衡:某些類別樣本遠多于其他類別時,可以采用過采樣(如SMOTE)、欠采樣或類別加權等方法
  • 數據質量問題:需要檢查并處理缺失值、異常值和標注錯誤

模型欠擬合

  • 表現為訓練集和驗證集上表現都不佳
  • 可能原因:模型結構過于簡單、特征工程不足或正則化過度
  • 解決方案:增加模型復雜度、優化特征選擇、減少正則化強度模型過擬合

模型過擬合

  • 表現為訓練集表現很好但驗證集表現差
  • 可能原因:模型過于復雜、訓練數據不足或訓練輪次過多
  • 解決方案:增加dropout層、使用早停(early stopping)、添加L1/L2正則化、數據增強

一、數據集改善

1、數據集拆分

1. 核心功能??

train_test_split是 scikit-learn 中用于將數據集隨機劃分為訓練集和測試集的函數,主要作用包括:

  • ??防止過擬合??:通過分離訓練和測試數據,評估模型在未見數據上的泛化能力。

  • ??靈活劃分比例??:支持自定義測試集或訓練集的比例(如 80% 訓練 + 20% 測試)。

  • ??分層抽樣??:處理類別不均衡數據時,保持訓練集和測試集的類別分布一致。


??2. 參數詳解??

??參數??

??說明??

??示例值??

*arrays

待劃分的數據(如特征?X和標簽?y),支持多個數組同時劃分

X, y

test_size

測試集比例(0.0-1.0)或樣本數。默認 0.25

0.2(20% 測試集)

train_size

訓練集比例,若未設置則自動補全?1 - test_size

0.8(80% 訓練集)

random_state

隨機種子,保證劃分結果可復現

42

shuffle

是否打亂數據(默認?True),時間序列數據需設為?False

True

stratify

按標簽分層抽樣,保持類別比例一致

y(標簽數組)

3.示例

from sklearn.model_selection import train_test_split
import numpy as npX = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 1, 0, 1])# 80% 訓練集,20% 測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("訓練集:", X_train)  # 輸出示例:[[3 4], [1 2], [7 8]]
print("測試集:", X_test)   # 輸出示例:[[5 6]][1,5]

2.樣本歸一化

樣本歸一化是指對數據集中的??每個樣本(行)??進行縮放,使其滿足特定范數(如L1、L2或最大值范數),從而消除樣本間量綱差異。與特征歸一化(按列處理)不同,樣本歸一化適用于樣本向量需整體比較的場景,如文本分類、聚類分析等。

??1.核心公式??

  • ??L2歸一化(默認)??:

    使每個樣本的歐幾里得范數為1。

  • ??L1歸一化??:

    使樣本的絕對值和為1。

  • ??最大值歸一化(Max)??:

    將樣本最大值縮放到1。


??2. 適用場景??

  1. ??文本數據處理??

    如TF-IDF向量或詞頻向量,歸一化后可比性更強。
  2. ??基于距離的算法??

    KNN、SVM等需計算樣本間距離的模型,歸一化避免大數值特征主導結果。
  3. ??神經網絡輸入??

    歸一化到統一范圍(如[0,1])可加速梯度下降收斂。
  4. ??圖像處理??

    像素值歸一化后更適應卷積神經網絡的輸入要求。

??3. 方法對比與選擇??

??方法??

??特點??

??適用場景??

??L2歸一化??

保留樣本向量的方向信息,對異常值敏感度較低

文本分類、聚類分析

??L1歸一化??

生成稀疏解,適合特征選擇

高維稀疏數據(如詞袋模型)

??Max歸一化??

快速縮放至[-1,1],但對極端值敏感

圖像像素值處理

??注意事項??:

  • 若樣本中存在異常值,建議使用L2歸一化或RobustScaler(基于中位數和四分位數)。

  • 歸一化會改變原始數據分布,但保留相對大小關系

?代碼實現(Python)

使用Scikit-learn的Normalizer?

from sklearn.preprocessing import Normalizer
import numpy as np# 示例數據(每行一個樣本)
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# L2歸一化(默認)
normalizer = Normalizer(norm='l2')
X_l2 = normalizer.fit_transform(X)
print("L2歸一化結果:\n", X_l2)#[0.267, 0.534, 0.801]# L1歸一化
normalizer = Normalizer(norm='l1')
X_l1 = normalizer.fit_transform(X)
print("L1歸一化結果:\n", X_l1)

?3.樣本標準化

樣本標準化(也稱為數據標準化或特征縮放)是將不同尺度的數據轉換為統一尺度的過程,使不同特征具有可比性。

常見的標準化方法

  1. ??Z-score標準化(標準差標準化)??

    • 公式:z = (x - μ) / σ

    • 其中μ是均值,σ是標準差

    • 處理后數據均值為0,標準差為1

  2. ??Min-Max標準化??

    • 公式:x' = (x - min) / (max - min)

    • 將數據線性變換到[0,1]區間

  3. ??Max標準化??

    • 公式:x' = x / max

    • 將數據按最大值縮放

  4. ??小數縮放??

    • 公式:x' = x / 10^j

    • j為使最大絕對值小于1的最小整數

標準化的作用

  • 消除不同特征間的量綱影響

  • 提高模型收斂速度(特別是梯度下降算法)

  • 提高模型精度

  • 使不同特征對模型有相近的貢獻度

應用場景

  • 基于距離的算法(如KNN、K-means)

  • 使用梯度下降的模型(如神經網絡)

  • 主成分分析(PCA)等降維方法

  • 正則化模型(如Lasso、Ridge回歸)

Z-score標準化

import numpy as np
from sklearn.preprocessing import StandardScaler# 原始數據
data = np.array([[1, 2], [3, 4], [5, 6]])# 使用sklearn
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
print("Z-score標準化結果:\n", scaled_data)# 手動計算
mean = np.mean(data, axis=0)
std = np.std(data, axis=0)
manual_scaled = (data - mean) / std
print("手動計算結果:\n", manual_scaled)

?Min-Max標準化

from sklearn.preprocessing import MinMaxScaler# 使用sklearn
minmax_scaler = MinMaxScaler()
minmax_scaled = minmax_scaler.fit_transform(data)
print("Min-Max標準化結果:\n", minmax_scaled)# 手動計算
data_min = np.min(data, axis=0)
data_max = np.max(data, axis=0)
manual_minmax = (data - data_min) / (data_max - data_min)
print("手動計算結果:\n", manual_minmax)

4.上采樣和下采樣

上采樣和下采樣是處理數據不平衡問題的兩種常用技術,主要用于解決分類任務中類別分布不均的情況。

下采樣(Downsampling)

基本概念

  • 也稱為欠采樣(Undersampling)

  • 減少多數類樣本數量,使其與少數類樣本數量接近或相同

  • 適用于多數類樣本數量遠大于少數類的情況

常用方法

  1. ??隨機下采樣??

    • 從多數類中隨機刪除樣本

    from sklearn.utils import resample# 假設df是DataFrame,'class'是目標列
    majority_class = df[df['class'] == 0]
    minority_class = df[df['class'] == 1]# 隨機下采樣多數類
    majority_downsampled = resample(majority_class,replace=False,n_samples=len(minority_class),random_state=42)# 合并下采樣后的數據
    df_downsampled = pd.concat([majority_downsampled, minority_class])
    
  2. ??Tomek Links??

    • 移除邊界附近造成分類困難的多數類樣本

    from imblearn.under_sampling import TomekLinkstl = TomekLinks()
    X_res, y_res = tl.fit_resample(X, y)
  3. ??Cluster Centroids??

    • 使用聚類方法減少多數類樣本

from imblearn.under_sampling import ClusterCentroidscc = ClusterCentroids(random_state=42)
X_res, y_res = cc.fit_resample(X, y)

優缺點

??優點??:

  • 減少訓練數據量,加快訓練速度

  • 解決類別不平衡問題

??缺點??:

  • 可能丟失重要信息

  • 可能導致模型欠擬合

上采樣(Upsampling)

基本概念

  • 也稱為過采樣(Oversampling)

  • 增加少數類樣本數量,使其與多數類樣本數量接近或相同

  • 適用于少數類樣本數量不足的情況

常用方法

  1. ??隨機上采樣??

    • 隨機復制少數類樣本

from sklearn.utils import resampleminority_upsampled = resample(minority_class,replace=True,n_samples=len(majority_class),random_state=42)df_upsampled = pd.concat([majority_class, minority_upsampled])
  1. ??SMOTE(Synthetic Minority Oversampling Technique)??

    • 合成新的少數類樣本

from imblearn.over_sampling import SMOTEsmote = SMOTE(random_state=42)
X_res, y_res = smote.fit_resample(X, y)
  1. ??ADASYN(Adaptive Synthetic Sampling)??

    • 基于數據分布的自適應上采樣

from imblearn.over_sampling import ADASYNadasyn = ADASYN(random_state=42)
X_res, y_res = adasyn.fit_resample(X, y)

優缺點

??優點??:

  • 不丟失原始信息

  • 可以改善模型對少數類的識別能力

??缺點??:

  • 可能導致過擬合

  • 增加計算負擔

二、交叉驗證

交叉驗證是評估機器學習模型性能和選擇超參數的重要技術,它通過將數據集分成多個子集來減少評估結果的方差。

常見交叉驗證方法

1. K折交叉驗證(K-Fold CV)

??原理??:將數據集隨機分成K個大小相似的互斥子集(稱為"折"),每次用K-1折訓練,剩下1折驗證,重復K次。

from sklearn.model_selection import KFold, cross_val_score
from sklearn.linear_model import LogisticRegressionkfold = KFold(n_splits=5, shuffle=True, random_state=42)
model = LogisticRegression()
scores = cross_val_score(model, X, y, cv=kfold)
print("平均準確率:", scores.mean())

2. 分層K折交叉驗證(Stratified K-Fold)

??特點??:保持每個折中類別比例與原始數據集一致,適用于分類問題,特別是類別不平衡時。

from sklearn.model_selection import StratifiedKFoldskf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=skf)

3. 留一法交叉驗證(Leave-One-Out, LOO)

??原理??:每次留一個樣本作為驗證集,其余作為訓練集,重復N次(N為樣本數)。

from sklearn.model_selection import LeaveOneOutloo = LeaveOneOut()
scores = cross_val_score(model, X, y, cv=loo)
print("LOO平均準確率:", scores.mean())

4. 留P法交叉驗證(Leave-P-Out)

??原理??:每次留P個樣本作為驗證集。

from sklearn.model_selection import LeavePOutlpo = LeavePOut(p=2)
scores = cross_val_score(model, X, y, cv=lpo)  # 注意:計算量很大

5. 時間序列交叉驗證(Time Series CV)

??特點??:考慮數據的時間順序,防止未來信息泄露。

from sklearn.model_selection import TimeSeriesSplittscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]

交叉驗證的最佳實踐

  1. ??數據預處理??:應在交叉驗證循環內進行,防止數據泄露

    from sklearn.pipeline import make_pipeline
    from sklearn.preprocessing import StandardScalerpipeline = make_pipeline(StandardScaler(), LogisticRegression())
    scores = cross_val_score(pipeline, X, y, cv=5)
  2. ??類別不平衡處理??:使用分層抽樣或自定義采樣策略

    from sklearn.model_selection import StratifiedKFoldskf = StratifiedKFold(n_splits=5)
  3. ??隨機性控制??:設置random_state確保結果可復現

  4. ??折數選擇??:

    • 小數據集:5-10折

    • 大數據集:3-5折(減少計算量)

    • 超參數調優:可使用更多折數

  5. ??性能指標選擇??:根據問題類型選擇合適的評估指標

    from sklearn.metrics import make_scorer, f1_scorescorer = make_scorer(f1_score, average='macro')
    scores = cross_val_score(model, X, y, cv=5, scoring=scorer)

交叉驗證的局限性

  1. 計算成本高,特別是大數據集或復雜模型

  2. 對數據順序敏感的數據集(如時間序列)需要特殊處理

  3. 極端不平衡數據可能需要分層抽樣或其他采樣技術

交叉驗證是機器學習工作流中不可或缺的部分,合理使用可以有效評估模型泛化能力并防止過擬合。

三、數據結果

混淆矩陣

混淆矩陣是評估分類模型性能的重要工具,它以矩陣形式直觀展示模型的預測結果與真實標簽的對比情況。

基本結構

對于二分類問題,混淆矩陣為2×2矩陣:

  • ??TP(True Positive)??:真正例,實際為陽性且預測為陽性

  • ??FN(False Negative)??:假反例,實際為陽性但預測為陰性

  • ??FP(False Positive)??:假正例,實際為陰性但預測為陽性

  • ??TN(True Negative)??:真反例,實際為陰性且預測為陰性

#Python實現
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns# 示例數據
y_true = [1, 0, 1, 1, 0, 1, 0, 0]
y_pred = [1, 0, 0, 1, 0, 1, 1, 0]# 計算混淆矩陣
cm = confusion_matrix(y_true, y_pred)
print("混淆矩陣:\n", cm)# 可視化
plt.figure(figsize=(6, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['預測陰性', '預測陽性'],yticklabels=['真實陰性', '真實陽性'])
plt.xlabel('預測值')
plt.ylabel('真實值')
plt.title('混淆矩陣')
plt.show()

分類指標

指標

公式

側重

適用場景

sklearn函數

準確率

(TP+TN)/Total

整體正確率

平衡數據集

accuracy_score

精確率

TP/(TP+FP)

預測陽性準確度

FP代價高

precision_score

召回率

TP/(TP+FN)

陽性樣本識別率

FN代價高

recall_score

F1分數

2(PR)/(P+R)

精確率召回率平衡

不平衡數據

f1_score

AUC

ROC曲線下面積

整體區分能力

閾值無關評估

roc_auc_score

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

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

相關文章

17.MariaDB 數據庫管理

17.MariaDB 數據庫管理 數據庫介紹 數據庫(Database)簡單來說,就是按照一定規則存數據的 “倉庫”。它能高效存大量數據,還能方便地查、增、改、刪數據,是各種信息系統的核心。 核心特點: 結構化存儲:數…

AI搶飯碗,軟件測試該何去何從?

AI 浪潮下,軟件測試路在何方 當某大廠宣布 “AI 測試機器人上崗首日就覆蓋 80% 的功能測試” 時,測試圈炸開了鍋 —— 有人連夜更新簡歷,有人在技術論壇發問:“十年測試經驗,難道真的不如一行 AI 代碼?”AI…

09 ABP Framework 中的 MVC 和 Razor Pages

ABP Framework 中的 MVC 和 Razor Pages 該頁面詳細介紹了 ABP Framework 與 ASP.NET Core MVC 和 Razor Pages 的集成,涵蓋框架組件、項目模板、主題系統和模塊集成模式等內容,提供了 ABP 應用程序中傳統的服務器端 Web UI 選項。 框架集成組件 ABP 提供…

docker 容器內編譯onnxruntime

docker run -itd -p 49142:49142 --gpus "device0" --name cpp_env_20250812 --shm-size"5g" -v /本地路徑/onnxruntime:/onnxruntime nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04進入容器內安裝必要的依賴git clone --branch v1.13.1 --recursive https…

-bash: ll: 未找到命令

“ll” 并不是 Linux 系統的原生命令,而是 “ls -l” 命令的一個常用別名(快捷方式)。提示 “-bash: ll: 未找到命令” 說明你的系統中沒有配置這個別名,只需手動添加即可:步驟:添加 ll 別名編輯當前用戶的…

docker network 與host的區別

所以docker run的時候只需要加入指定的network,就會從該network自動分配對應的ip是嗎 是的,你的理解完全正確! Docker 網絡自動分配 IP 機制 當你使用 docker run 命令并指定網絡時,Docker 會自動從該網絡的子網中分配一個 IP 地址…

GPT-5 現已上線 DigitalOcean Gradient? AI 平臺!

OpenAI 于 8 月 7 日發布其最新人工智能模型 GPT-5。根據 OpenAI 介紹,GPT-5 在編程、數學、寫作、視覺等方面的性能全面領先,幻覺更低,指令更準。新架構整合高速模型與深度推理,可實時切換速答或深思。近日,DigitalOc…

#C語言——學習攻略:自定義類型路線--結構體--結構體類型,結構體變量的創建和初始化,結構體內存對齊,結構體傳參,結構體實現位段

🌟菜鳥主頁:晨非辰的主頁 👀學習專欄:《C語言學習》 💪學習階段:C語言方向初學者 ?名言欣賞:“人理解迭代,神理解遞歸。” 目錄 1. 結構體類型 1.1 舊知識回顧 1.1.1 結構體聲…

機器學習——TF-IDF算法

TF-IDF(Term Frequency-Inverse Document Frequency)是一種廣泛應用于文本挖掘和信息檢索領域的經典加權算法,主要用于評估一個詞語在文檔集合中的重要程度。其核心思想是:一個詞語在文檔中出現的頻率越高,同時在所有文…

區塊鏈技術原理(9)-什么是以太幣

文章目錄前言什么是加密貨幣?什么是以太幣(ETH)鑄造 ETH燃燒 ETHETH 面額傳輸 ETH查詢 ETH以太幣的經濟模型:發行與流通以太幣與其他代幣的區別以太幣的歷史與市場地位總結前言 以太幣(Ether,簡稱 ETH&…

【Oracle APEX開發小技巧16】交互式網格操作內容根據是否啟用進行隱藏/展示

在日常開發中,有想要根據某一狀態或條件去限制/隱藏對應權限或操作按鈕的情況,于是用簡報模板列表進行展示,并提供以下功能:顯示模板基本信息提供啟用/禁用模板的開關提供編輯模板的入口根據模板狀態顯示不同的操作選項效果展示&a…

AIStarter:全網唯一跨平臺桌面AI管理工具,支持Windows、Mac和Linux一鍵部署

AIStarter作為全網唯一支持Windows、Mac和Linux的桌面AI管理平臺,為開發者提供高效的項目管理、模型插件和工作流共享體驗。最近,熊哥發布了4.1.0版本更新視頻,詳細演示了如何在多平臺上安裝、使用和分享AI項目。本文基于視頻內容&#xff0c…

AP模式/ESP32作為TCP服務端,轉發串口接收的數據給網絡調試助手

此代碼為接收STM32的數據然后直接轉發到網絡調試助手,當有設備連接到esp32軟件熱點時會通過串口發送字符’a’給STM32,當有設備斷開連接時會通過串口發送字符’b’,ESP32的TX:GPIO4, RX:GPIO5ESP32作為TCP服務器地址為192.168.4.1 監聽端口為3333#include <string.h> #in…

kafka 中的Broker 是什么?它在集群中起什么作用?

Kafka中的Broker&#xff1a;集群的核心支柱 在分布式消息系統Apache Kafka中&#xff0c;Broker是構成Kafka集群的核心節點或服務器。 簡單來說&#xff0c;每一個Broker就是運行著Kafka服務的一個實例&#xff0c;多臺Broker共同協作&#xff0c;形成了強大的、可擴展的消息處…

【SOA用于噪聲抑制】光纖DFB激光器中弛豫振蕩噪聲抑制

概述&#xff1a;本章記錄了我們在光纖分布式反饋DFB激光器中使用飽和SOA來降低RIN的工作&#xff0c;以用于低頻傳感器應用。結果表明&#xff0c;放大器的增益動力學允許光纖激光器的弛豫振蕩RO噪聲分量減少30dB。 1 背景到目前為止&#xff0c;我研究了將飽和半導體光放大器…

神經網絡的核心組件解析:從理論到實踐

神經網絡作為深度學習的核心技術&#xff0c;其復雜性常常令人望而卻步。然而&#xff0c;盡管神經網絡的結構、參數和計算過程看似繁瑣&#xff0c;但其核心組件卻是相對簡潔且易于理解的。本文將深入探討神經網絡的四大核心組件——層、模型、損失函數與優化器&#xff0c;并…

Spring Boot項目通過Feign調用三方接口的詳細教程

目錄 一、環境準備 二、啟用Feign客戶端 三、定義Feign客戶端接口 四、定義請求/響應DTO 五、調用Feign客戶端 六、高級配置 1. 添加請求頭&#xff08;如認證&#xff09; 2. 超時配置&#xff08;application.yml&#xff09; 3. 日志配置 七、錯誤處理 自定義錯誤…

ubuntu24.04安裝 bpftool 以及生成 vmlinux.h 文件

文章目錄前言一、apt安裝二、源碼安裝三、生成vmlinux.h參考資料前言 $ cat /etc/os-release PRETTY_NAME"Ubuntu 24.04.2 LTS"$ uname -r 6.14.0-27-generic一、apt安裝 安裝bpftool&#xff1a; $ sudo apt install linux-tools-commonThe following NEW packa…

Pytorch FSDP權重分片保存與合并

注&#xff1a;本文章方法只適用Pytorch FSDP1的模型&#xff0c;且切分策略為SHARDED_STATE_DICT場景。 在使用FSDP訓練模型時&#xff0c;為了節省顯存通常會把模型權重也進行切分&#xff0c;在保存權重時為了加速保存通常每個進程各自保存自己持有的部分權重&#xff0c;避…

IDEA自動生成Mapper、XML和實體文件

1. 引入插件 <build><finalName>demo</finalName><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.5</version><depe…