筆記—數(shù)據(jù)預(yù)處理

前言(~廢話)

為了建立一個好的機(jī)器學(xué)習(xí)模型,對數(shù)據(jù)進(jìn)行一定的處理是十分有必要的,接下來簡單介紹幾種初級的處理方法,后續(xù)將補(bǔ)充其他的數(shù)據(jù)處理的操作

線性回歸之多項式轉(zhuǎn)換

先來看一張圖:

image

對于很多場景下,對樣本直接進(jìn)行線性回歸可能并不能達(dá)到很好的效果,比如圖1

可能你已經(jīng)想到可以對數(shù)據(jù)集進(jìn)行多項式轉(zhuǎn)換,圖1中,我們的數(shù)學(xué)模型為:

image

多項式轉(zhuǎn)換后我們的數(shù)學(xué)模型可以為m次方程:

image

通過多項式轉(zhuǎn)換,我們便可以對圖1的數(shù)據(jù)進(jìn)行擬合從而得到一個相對直接進(jìn)行線性回歸好很多的數(shù)學(xué)模型


#簡單的多項式轉(zhuǎn)換demo如下

import numpy as np

from sklearn.preprocessingimport PolynomialFeatures    #多項式轉(zhuǎn)換模塊

X = np.arange(6).reshape(3,2)

poly1 = PolynomialFeatures(2)    #進(jìn)行2元多項式轉(zhuǎn)換

poly1.fit(X)

poly1.transform(X)

多項式轉(zhuǎn)化后對數(shù)據(jù)擬合后的效果根據(jù)函數(shù)的次數(shù)達(dá)到不同的效果:

image

數(shù)據(jù)的缺失值處理

樣本中存在缺失值是很常見的情況,對于缺失值的處理常見的有一下幾種方法:

1)樣本確實(shí)嚴(yán)重情況下直接drop含有缺失值的樣本

2)采用上一個樣本或者后一個樣本的的對應(yīng)值來進(jìn)行填充

3)使用數(shù)據(jù)集中該屬性的平均值,眾數(shù)進(jìn)行填充

4)新增一個判斷是否含有‘‘該屬性缺失’’的屬性

5)用一個固定的數(shù)(經(jīng)驗值)進(jìn)行填充

6)根據(jù)結(jié)果分組,不同組采用各自組的均值或者眾數(shù)進(jìn)行填充

7)把缺失值作為新的label,建立模型得到預(yù)測值,然后進(jìn)行填充。


One-Hot編碼

在很多的數(shù)據(jù)集當(dāng)中,某一屬性的不同類別可能采用數(shù)字來表示,但并沒有數(shù)字的意義,比如性別屬性(男:0,女:1),但是沒有了0<1這樣的意義,但是建立模型去擬合這樣的數(shù)據(jù)可能效果會很糟糕。這是One-Hot便有了用武之地。

大部分算法是基于向量空間中的度量來進(jìn)行計算的,為了使非偏序關(guān)系的變量取值不具有偏序性,并且到圓點(diǎn)是等距的。使用one-hot編碼,將離散特征的取值擴(kuò)展到了歐式空間,離散特征的某個取值就對應(yīng)歐式空間的某個點(diǎn)。將離散型特征使用one-hot編碼,會讓特征之間的距離計算更加合理。離散特征進(jìn)行one-hot編碼后,編碼后的特征,其實(shí)每一維度的特征都可以看做是連續(xù)的特征。


#一個簡單的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ù)值型變量。即是對不連續(xù)的數(shù)字或者文本進(jìn)行編號例如,比如性別特征中(“男”,“女”),需要使用LabelEncoder將它們轉(zhuǎn)換成數(shù)值型


#一個簡單的demo

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()

le.fit([1,5,67,100])

le.transform([1,1,100,67,5])


二值化

顧名思義,設(shè)置一個閾值將數(shù)據(jù)分為兩部分(大于這個值的,小于這個值的)


#一個簡單的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)化

去均值和方差歸一化。且是針對每一個特征維度來做的,而不是針對樣本。

其公式為:(x - x.mean() ) / x.std()

注意:

1)本方法要求原始數(shù)據(jù)的分布可以近似為高斯分布,否則歸一化的效果會變得很糟糕

*2)應(yīng)用場景:在分類、聚類算法中,需要使用距離來度量相似性的時候、或者使用PCA技術(shù)進(jìn)行降維的時候 *

3) 并不是所有的標(biāo)準(zhǔn)化都能給模型帶來好處

作用:

評價指標(biāo)(即特征向量中的不同特征就是所述的不同評價指標(biāo))往往具有不同的量綱和量綱單位,這樣的情況會影響到數(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ì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ū)間縮放法

計算公式:X - X.mean() / ( X.max() - X.min() )

1)適用比較適用在數(shù)值比較集中的情況

2)缺陷:如果max和min不穩(wěn)定,很容易使得歸一化結(jié)果不穩(wěn)定,使得后續(xù)使用效果也不穩(wěn)定。實(shí)際使用中可以用經(jīng)驗常量來替代max和min。

3)應(yīng)用場景:在不涉及距離度量、協(xié)方差計算、數(shù)據(jù)不符合正太分布的時候,可以使用第一種方法或其他歸一化方法(不包括Z-score方法)。比如圖像處理中,將RGB圖像轉(zhuǎn)換為灰度圖像后將其值限定在[0 255]的范圍


#一個簡單的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)入特征選擇庫中的VarianceThreshold用于通過方差選擇特征。方差為0的特征會被自動移除。剩下的特征按設(shè)定的方差的閾值進(jìn)行選擇。

選擇方法2:單變量特征選擇-卡方檢驗


#一個簡單的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個特征

sk2.fit(X, Y)

print (sk2)

print (sk2.scores_)

print (sk2.transform(X))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容