在機器學習中,直觀的會認為資料量越大、特徵越多,能獲得更好的預測結果,但實際上資料要判斷是否有離群值(異常值)、是否資料不平衡、是否有雜訊(EX:NA值、誤植、格式不一致)等等;特徵要擔心是否有相依性問題(共線性)、維度災難、過擬合、運算成本等等一堆問題,並不是絕對的「越多越好」。
--離群值 可能導致模型的預測偏差
--資料不平衡 可能導致模型偏向多數類別,影響公正性
--特徵之間可能存在相依性問題,也就是兩個或多個特徵高度相關,EX:身高與體重、房屋面積與價格,模型會很難區分這些特徵的具體影響 或是試圖解釋不存在的關係,都可能導致模型的預測能力降低、模型解釋能力下降(我們試圖解釋這個模型為甚麼這麼預測時,可能會出現類似這兩個特徵高度相關 所以只要在乎其中一個特徵即可,而忽略了常理上會認為重要的特徵 之類的狀況)、過於敏感(因為模型在試圖解釋不存在的關係 所以訓練時 新增資料進去,模型參數可能會波動劇烈)
--維度災難 EX:成百上千維,空間體積提高太快,因此數據變得很稀疏(也就是資料量不夠的概念),EX:一維時 表現10個點 看起來蠻密集的,在提升到二維時,感覺變稀疏了,再提升到三維,感覺空間更空曠了
--過度細節導致模型容易過擬合
BTW 資料處理時 還要注意特徵的類別 是否需要進行編碼、特徵是否稀疏(要挑適合的模型)等
資料有數據清洗的方式,這邊則提供幾個最基礎的特徵選擇 (畢竟重點是考證嘛~)
1.設置變異數門檻:
變異數:一組數據中 各個數值與平均值的偏差程度(一組數據中,每筆資料與此組數據平均值的差異的平方的平均值),也就是一個特徵的變異數越大,代表這個特徵的資料起伏越大;相反 變異數越小,代表此特徵的資料都非常相近
邏輯就是:當一個特徵的變異數較小,代表這個特徵的所有數值都非常接近(也就是同質性很高),也就是這個特徵的訊息量很低、對模型貢獻度很低,所以可以丟掉他 EX:資料中 全部都是男性,那將"性別"這個特徵欄位刪除,對模型基本不會產生影響
但缺點是 可能在某些情況下對目標(Target)預測有影響 EX:是否帶傘跟是否走出建築沒太大關係,有傘沒傘都可以走出建築,但在雨天時是否帶傘 就會對是否走吃出建築有較大關係
from sklearn import feature_selection as fs
fs.VarianceThreshold()
對於連續型(regression、有程度差異)的目標,可以採用f_regression, mutual_info_regression等
對於離散型(classification、無程度差異)的目標,可以採用chi2,mutual_info_classif等
根據每個特徵對目標的重要性,選擇排名前K個特徵 或 前K%的特徵
from sklearn import feature_selection as fs
fs.SelectKBest(fs.mutual_info_regression,percentile=10).fit_transform(X,y)#使用個數挑選、互信息回歸、取前10%的特徵
fs.SelectPercentile(fs.chi2,k=20).fit_transform(X,y)#使用百分比挑選、卡方檢定、取前20個特徵