機器學習小組第三週 簡單的資料預處理和特徵工程

2021-10-03 18:45:09 字數 3987 閱讀 3783

學習目標

● 無量綱化:最值歸一化、均值方差歸一化及sklearn中的scaler

● 缺失值處理

● 處理分型別特徵:編碼與啞變數

● 處理連續型特徵:二值化與分段

學習資料

首先,參考:《機器學習的敲門磚:歸一化與kd樹》及《特徵工程系列:特徵預處理(上)》中相關部分。

其次,其他知識點可參考推薦博文:sklearn中的資料預處理和特徵工程 。

20200311

資料歸一化

在量綱不同的情況下,對於部分演算法不能反映樣本中每乙個特徵的重要程度(但是有些演算法對於是否歸一化不敏感)。

常用的歸一化有以下兩種:

● 最值歸一化(normalization): 把所有資料對映到0-1之間。最值歸一化的使用範圍是特徵的分布具有明顯邊界的(分數0~100分、灰度0~255),受outlier的影響比較大。

x sc

ale=

x−xm

inxm

ax−x

mi

nx_=\frac}-x_}

xscale

​=xm

ax​−

xmin

​x−x

min​

​ ● 均值方差歸一化(standardization): 把所有資料歸一到均值為0方差為1的分布中。適用於資料中沒有明顯的邊界,有可能存在極端資料值的情況。

x sc

ale=

x−xm

in

sx_=\frac}

xscale

​=sx

−xmi

n​​在實際使用歸一化時有乙個小陷阱,訓練資料集進行歸一化處理,需要計算出訓練資料集的均值mean_train和方差std_train。在對測試資料集進行歸一化時,仍然要使用訓練資料集的均值train_mean和方差std_train。這是因為測試資料是模擬的真實環境,真實環境中可能無法得到均值和方差,對資料進行歸一化。

特徵預處理

首先需要明晰,特徵工程是利用資料領域的相關知識來建立能夠使機器學習演算法達到最佳效能的特徵的過程。

特徵工程主要包含以下幾個子問題:

其中資料預處理又包括了資料清洗和特徵預處理等,這裡主要寫資料預處理的相關步驟。

數值型資料無量綱化

from sklearn.preprocessing import standardscaler

# 標準化,返回值為標準化後的資料

standardscaler = standardscaler(

).fit(x_train)

x_train_std = standardscaler.transform(x_train)

standardscaler.mean_                    # 檢視均值的屬性mean_

standardscaler.var_ # 檢視方差的屬性var_

​x_train_std.mean(

)# 匯出的結果是乙個陣列,用mean()檢視均值

x_train_std.std(

)# 用std()檢視方差

​standardscaler.fit_transform(x_train)

# 使用fit_transform()一步達成結果

​standardscaler.inverse_transform(x_train)

# 使用inverse_transform逆轉標準化

from sklearn.preprocessing import minmaxscaler

# 區間縮放,返回值為縮放到[0, 1]區間的資料

minmaxscaler = minmaxscaler(

).fit(x_train)

minmaxscaler.transform(x_train)

對異常值比較敏感,並且新資料可能會引起最大最小值的變化。

from sklearn.preprocessing import normalizer

# 歸一化,返回值為歸一化後的資料

normalizer = normalizer(norm=

'l2'

).fit(x_train)

normalizer.transform(x_train)

在分類、聚類演算法中,需要使用距離來度量相似性的時候(如svm、knn)、或者使用pca技術進行降維的時候,標準化(z-score standardization)表現更好;

在不涉及距離度量、協方差計算、資料不符合正太分布的時候,可以使用第一種方法或其他歸一化方法。

基於樹的方法不需要進行特徵的歸一化,例如隨機森林,bagging與boosting等方法。

如果是基於引數的模型或者基於距離的模型,因為需要對引數或者距離進行計算,都需要進行歸一化。

缺失值處理

from sklearn.impute import ******imputer

imp_mean = ******imputer(

)#例項化,預設均值填補

imp_median = ******imputer(strategy=

"median"

)#用中位數填補

imp_0 = ******imputer(strategy=

"constant"

,fill_value=0)

#用0填補

​imp_mean = imp_mean.fit_transform(age)

#fit_transform一步完成調取結果

imp_median = imp_median.fit_transform(age)

imp_0 = imp_0.fit_transform(age)

​imp_mean[:20

]imp_median[:20

]imp_0[:20

]​#在這裡我們使用中位數填補age

data.loc[:,

"age"

]= imp_median

​data.info()​

#使用眾數填補embarked

embarked = data.loc[:,

"embarked"

].values.reshape(-1

,1)imp_mode = ******imputer(strategy =

"most_frequent"

)data.loc[:,

"embarked"

]= imp_mode.fit_transform(embarked)

import pandas as pd

data = pd.read_csv(r"c:\work\learnbetter\micro-class\week 3 preprocessing\narrativedata.csv"

,index_col=0)

​data.head()​

data.loc[:,

"age"

]= data.loc[:,

"age"

].fillna(data.loc[:,

"age"

].median())

#.fillna 在dataframe裡面直接進行填補

​data.dropna(axis=

0,inplace=

true

)#.dropna(axis=0)刪除所有有缺失值的行,.dropna(axis=1)刪除所有有缺失值的列

#引數inplace,為true表示在原資料集上進行修改,為false表示生成乙個複製物件,不修改原資料,預設false

其他部分後續繼續,會打乙個初級的kaggle比賽來完善預處理的操作~

機器學習第三週

在進行特徵選擇之前,一般會先進行資料無量綱化處理,這樣,表徵不同屬性 單位不同 的各特徵之間才有可比性,如1cm 與 0.1kg 你怎麼比?無量綱處理方法很多,使用不同的方法,對最終的機器學習模型會產生不同的影響。本文將對常用的無量綱化技術進行總結,試圖指出他們的適用場景,並給出在python中的相...

機器學習第三週

應用機器學習的時候,會遇到很多問題。比如模型的選擇,資料的擬合程度,新樣本的泛化程度。這裡記錄 一些相關概念和應對方法。1.將 資料集分成 訓練集,驗證集,測試集。最好是採用隨機方法來取,一般是 60 20 20 要考慮假設函式的擬合程度 也就是模型選擇 以及 新情況的泛化程度,驗證集作用是挑出擬合...

第三週學習總結

這周關於深度學習的內容比較簡單,是對線性代數的簡單回顧,所以我在這裡做乙個簡單的總結。向量與矩陣 矩陣是由m n個數組成的乙個m行n列的矩形 特別地,乙個m 1矩陣也稱為乙個m維列向量 而乙個1 n矩陣 也稱為乙個n維行向量.向量可以用矩陣表示,且有時特殊矩陣就是向量.簡言之就是矩陣包含向量.矩陣加...