深入理解非獨立同分布

一、基礎概念

非獨立同分布,英文簡稱Non-identically Distributed(NID), 實際上就是指不是獨立同分布的概率分布函數。

簡單來說,如果一個數據集中的每一個元素都是從同一個概率分布中隨機抽取的,則稱這個數據集的分布為獨立同分布(i.i.d.),通常在機器學習中假設訓練樣本和測試樣本都是獨立同分布的。

而非獨立同分布則相反,指數據集中的元素的分布不同。比如,人們接受教育受益程度的分布、家庭收入的分布、招聘時面試者能力的分布等等,都可能會出現非獨立同分布的情況。

二、影響因素

那麼,為什麼會產生非獨立同分布呢?其實原因非常多,可以從以下幾個角度去考慮。

1.選取數據的方式

一方面,數據的抽取方式可能與樣本的真實分布不同,比如對某些特定樣本情況的過/欠採樣;另一方面,若樣本不是所有情況下都大量而隨機採樣,而是針對特定情況精選的,也會導致樣本的分布偏差。

2.系統固定因素

與數據採集方式無關的因素,比如觀測器、機器、人、不同的學科背景和思維方式等,可能會對數據採集產生非獨立同分布的問題。

3.根本性問題

除了上述外部因素,還有一些根本性的問題會導致非獨立同分布的產生,比如一些假設模型本身就不是適用於偏態分布的數據,或是對數據的預處理和清洗不充分等等。

三、解決方案

非獨立同分布對於機器學習的影響是無法避免的,我們應該想辦法盡量減小它對機器學習模型的影響。

1.數據增強(Data augmentation)

通過數據增強方式擴充數據集,使得數據分布更加均衡。比如說,對於被欠採樣的數據,我們可以使用SMOTE等生成對抗網路GAN實現樣本增強。

2.特徵工程(Feature engineering)

通過對特徵的選擇、提取和創造來提高特徵表達的能力。從而能夠在數據集數量不一致的情況下,讓模型運用更多地信息來正確地做出決策。

3.領域適應(Domain adaptation)

領域適應是一種方法,可以基於數據的標籤進行遷移式學習,用源域數據來幫助訓練目標域數據。用於緩解目標域數據佔比較少時遇到的問題。

四、代碼示例

# 數據增強
from imblearn.over_sampling import SMOTE

X_resampled, y_resampled = SMOTE().fit_resample(X, y)


# 特徵工程
from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer()
X_vectorized = vectorizer.fit_transform(X_text)


# 領域適應
from sklearn.cross_decomposition import PLSCanonical
from sklearn.metrics import make_scorer
from sklearn.model_selection import GridSearchCV

param_grid = {'n_components':[2,4,8,16,32]}

plsca = PLSCanonical(scale=False)
grid_search = GridSearchCV(plsca, cv=5, param_grid=param_grid, scoring=make_scorer(mean_squared_error))
grid_search.fit(X_source, y_source)
plsca = grid_search.best_estimator_
plsca.fit(X_target)

原創文章,作者:DTYT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/135869.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
DTYT的頭像DTYT
上一篇 2024-10-04 00:15
下一篇 2024-10-04 00:15

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟體,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱「存儲程序控制原理」,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的匯流排來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入理解Python字元串r

    一、r字元串的基本概念 r字元串(raw字元串)是指在Python中,以字母r為前綴的字元串。r字元串中的反斜杠(\)不會被轉義,而是被當作普通字元處理,這使得r字元串可以非常方便…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25

發表回復

登錄後才能評論