前言(~廢話)
為了建立一個(gè)好的機(jī)器學(xué)習(xí)模型蓄诽,對(duì)數(shù)據(jù)進(jìn)行一定的處理是十分有必要的睛低,接下來簡(jiǎn)單介紹幾種初級(jí)的處理方法淘邻,后續(xù)將補(bǔ)充其他的數(shù)據(jù)處理的操作
線性回歸之多項(xiàng)式轉(zhuǎn)換
先來看一張圖:
對(duì)于很多場(chǎng)景下扑庞,對(duì)樣本直接進(jìn)行線性回歸可能并不能達(dá)到很好的效果兵琳,比如圖1
可能你已經(jīng)想到可以對(duì)數(shù)據(jù)集進(jìn)行多項(xiàng)式轉(zhuǎn)換,圖1中硕噩,我們的數(shù)學(xué)模型為:
多項(xiàng)式轉(zhuǎn)換后我們的數(shù)學(xué)模型可以為m次方程:
通過多項(xiàng)式轉(zhuǎn)換假残,我們便可以對(duì)圖1的數(shù)據(jù)進(jìn)行擬合從而得到一個(gè)相對(duì)直接進(jìn)行線性回歸好很多的數(shù)學(xué)模型
#簡(jiǎn)單的多項(xiàng)式轉(zhuǎn)換demo如下
import numpy as np
from sklearn.preprocessingimport PolynomialFeatures #多項(xiàng)式轉(zhuǎn)換模塊
X = np.arange(6).reshape(3,2)
poly1 = PolynomialFeatures(2) #進(jìn)行2元多項(xiàng)式轉(zhuǎn)換
poly1.fit(X)
poly1.transform(X)
多項(xiàng)式轉(zhuǎn)化后對(duì)數(shù)據(jù)擬合后的效果根據(jù)函數(shù)的次數(shù)達(dá)到不同的效果:
數(shù)據(jù)的缺失值處理
樣本中存在缺失值是很常見的情況,對(duì)于缺失值的處理常見的有一下幾種方法:
1)樣本確實(shí)嚴(yán)重情況下直接drop含有缺失值的樣本
2)采用上一個(gè)樣本或者后一個(gè)樣本的的對(duì)應(yīng)值來進(jìn)行填充
3)使用數(shù)據(jù)集中該屬性的平均值炉擅,眾數(shù)進(jìn)行填充
4)新增一個(gè)判斷是否含有‘‘該屬性缺失’’的屬性
5)用一個(gè)固定的數(shù)(經(jīng)驗(yàn)值)進(jìn)行填充
6)根據(jù)結(jié)果分組辉懒,不同組采用各自組的均值或者眾數(shù)進(jìn)行填充
7)把缺失值作為新的label,建立模型得到預(yù)測(cè)值谍失,然后進(jìn)行填充眶俩。
One-Hot編碼
在很多的數(shù)據(jù)集當(dāng)中,某一屬性的不同類別可能采用數(shù)字來表示快鱼,但并沒有數(shù)字的意義颠印,比如性別屬性(男:0,女:1)抹竹,但是沒有了0<1這樣的意義线罕,但是建立模型去擬合這樣的數(shù)據(jù)可能效果會(huì)很糟糕。這是One-Hot便有了用武之地柒莉。
大部分算法是基于向量空間中的度量來進(jìn)行計(jì)算的闻坚,為了使非偏序關(guān)系的變量取值不具有偏序性,并且到圓點(diǎn)是等距的兢孝。使用one-hot編碼窿凤,將離散特征的取值擴(kuò)展到了歐式空間,離散特征的某個(gè)取值就對(duì)應(yīng)歐式空間的某個(gè)點(diǎn)跨蟹。將離散型特征使用one-hot編碼雳殊,會(huì)讓特征之間的距離計(jì)算更加合理。離散特征進(jìn)行one-hot編碼后窗轩,編碼后的特征夯秃,其實(shí)每一維度的特征都可以看做是連續(xù)的特征。
#一個(gè)簡(jiǎn)單的demo
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2],[1,1,1]])
enc.transform([[0, 1, 3]]).toarray()
LabelEncoder
利用LabelEncoder() 將轉(zhuǎn)換成連續(xù)的數(shù)值型變量。即是對(duì)不連續(xù)的數(shù)字或者文本進(jìn)行編號(hào)例如仓洼,比如性別特征中(“男”介陶,“女”),需要使用LabelEncoder將它們轉(zhuǎn)換成數(shù)值型
#一個(gè)簡(jiǎn)單的demo
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit([1,5,67,100])
le.transform([1,1,100,67,5])
二值化
顧名思義色建,設(shè)置一個(gè)閾值將數(shù)據(jù)分為兩部分(大于這個(gè)值的哺呜,小于這個(gè)值的)
#一個(gè)簡(jiǎn)單的demo
import numpy as np
from sklearn.preprocessing import Binarizer
arr = np.array([
[1.5, 1.3, 1.9],
[0.5, 0.5, 1.6],
[1.1, 2.1, 0.2]
])
binarizer = Binarizer(threshold=1.0).fit_transform(arr) #設(shè)置閾值,大于的編碼為1箕戳,小于的編碼為0
標(biāo)準(zhǔn)化
去均值和方差歸一化某残。且是針對(duì)每一個(gè)特征維度來做的,而不是針對(duì)樣本陵吸。
其公式為:(x - x.mean() ) / x.std()
注意:
1)本方法要求原始數(shù)據(jù)的分布可以近似為高斯分布玻墅,否則歸一化的效果會(huì)變得很糟糕
*2)應(yīng)用場(chǎng)景:在分類、聚類算法中壮虫,需要使用距離來度量相似性的時(shí)候澳厢、或者使用PCA技術(shù)進(jìn)行降維的時(shí)候 *
3) 并不是所有的標(biāo)準(zhǔn)化都能給模型帶來好處
作用:
評(píng)價(jià)指標(biāo)(即特征向量中的不同特征就是所述的不同評(píng)價(jià)指標(biāo))往往具有不同的量綱和量綱單位,這樣的情況會(huì)影響到數(shù)據(jù)分析的結(jié)果旨指,為了消除指標(biāo)之間的量綱影響赏酥,需要進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化處理,以解決數(shù)據(jù)指標(biāo)之間的可比性谆构。原始數(shù)據(jù)經(jīng)過數(shù)據(jù)標(biāo)準(zhǔn)化處理后,各指標(biāo)處于同一數(shù)量級(jí)框都,適合進(jìn)行綜合對(duì)比評(píng)價(jià)搬素。
#一個(gè)簡(jiǎn)單的demo
from sklearn.preprocessing import StandardScaler
X = [
[1, 2, 3, 2],
[7, 8, 9, 2.01],
[4, 8, 2, 2.01],
[9, 5, 2, 1.99],
[7, 5, 3, 1.99],
[1, 4, 9, 2]
]
ss = StandardScaler(with_mean=True, with_std=True)
ss.fit(X)
ss.transform(X)
區(qū)間縮放法
計(jì)算公式:X - X.mean() / ( X.max() - X.min() )
1)適用比較適用在數(shù)值比較集中的情況
2)缺陷:如果max和min不穩(wěn)定,很容易使得歸一化結(jié)果不穩(wěn)定魏保,使得后續(xù)使用效果也不穩(wěn)定熬尺。實(shí)際使用中可以用經(jīng)驗(yàn)常量來替代max和min。
3)應(yīng)用場(chǎng)景:在不涉及距離度量谓罗、協(xié)方差計(jì)算粱哼、數(shù)據(jù)不符合正太分布的時(shí)候,可以使用第一種方法或其他歸一化方法(不包括Z-score方法)檩咱。比如圖像處理中揭措,將RGB圖像轉(zhuǎn)換為灰度圖像后將其值限定在[0 255]的范圍
#一個(gè)簡(jiǎn)單的demo
import numpy as np
from sklearn.preprocessing import MinMaxScaler
X = np.array([
[1, -1, 2, 3],
[2, 0, 0, 3],
[0, 1, -1, 3]
], dtype=np.float64)
scaler = MinMaxScaler(feature_range=(1,5)) #每一列數(shù)據(jù)都在在1-5直接之間進(jìn)行縮放
scaler.fit(X)
#查看參數(shù)縮放后MinMaxScaler的屬性
print (scaler.data_max_)
print (scaler.data_min_)
print (scaler.data_range_)
特征選擇
選擇方法1:移除方差較低的特征
導(dǎo)入特征選擇庫(kù)中的VarianceThreshold用于通過方差選擇特征。方差為0的特征會(huì)被自動(dòng)移除刻蚯。剩下的特征按設(shè)定的方差的閾值進(jìn)行選擇绊含。
選擇方法2:?jiǎn)巫兞刻卣鬟x擇-卡方檢驗(yàn)
#一個(gè)簡(jiǎn)單的demo
import numpy as np
from sklearn.feature_selection import VarianceThreshold
X = np.array([
[0, 2, 0, 3],
[0, 1, 4, 3],
[0.1, 1, 1, 3]
], dtype=np.float64)
Y = np.array([1,2,1])
print(X.std(axis=0))
#方差篩選
variance = VarianceThreshold(threshold=0.1) ##設(shè)置方差的閾值為0.1
print (variance)
variance.fit(X)
print (variance.transform(X)) #選擇方差大于0.1的特征
#相關(guān)性篩選
from sklearn.feature_selection import chi2,SelectKBest
sk2 = SelectKBest(chi2, k=2) #選擇相關(guān)性最高的前2個(gè)特征
sk2.fit(X, Y)
print (sk2)
print (sk2.scores_)
print (sk2.transform(X))