一、基礎概念
非獨立同分佈,英文簡稱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-hk/n/135869.html