資料預處理和特徵工程

2021-10-23 01:11:21 字數 4642 閱讀 2130

1.無量綱化:

當資料量綱不一致時需要進行歸一化處理,有兩種方法:

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

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

**實現:

#最值歸一化

import numpy as np

# 建立100個隨機數

x = np.random.randint(0,100,size=100)

# 最值歸一化(向量)

# 最值歸一化公式,對映到0,1之間

(x - np.min(x)) / (np.max(x) - np.min(x))

# 最值歸一化(矩陣)

# 0~100範圍內的50*2的矩陣

x = np.random.randint(0,100,(50,2))

# 將矩陣改為浮點型

x = np.array(x, dtype=float)

# 最值歸一化公式,對於每乙個維度(列方向)進行歸一化。

# x[:,0]第一列,第乙個特徵

x[:,0] = (x[:,0] - np.min(x[:,0])) / (np.max(x[:,0]) - np.min(x[:,0]))

# x[:,1]第二列,第二個特徵

x[:,1] = (x[:,1] - np.min(x[:,1])) / (np.max(x[:,1]) - np.min(x[:,1]))

# 如果有n個特徵,可以寫個迴圈:

for i in range(0,2):

x[:,i] = (x[:,i]-np.min(x[:,i])) / (np.max(x[:,i] - np.min(x[:,i])))

import matplotlib.pyplot as plt

plt.scatter(x[:,0],x[:,1])

plt.show()

#均值方差歸一化實現

x2 = np.array(np.random.randint(0,100,(50,2)),dtype=float)

# 套用公式,對每一列做均值方差歸一化

for i in range(0,2):

x2[:,i]=(x2[:,i]-np.mean(x2[:,i])) / np.std(x2[:,i])

plt.scatter(x2[:,0],x2[:,1])

plt.show()

np.mean(x2[:,0])

np.std(x2[:,1])

#sklearn中的歸一化

在sklearn中用來資料歸一化的方法:standardscaler。

#載入鳶尾花資料集

import numpy as np

from sklearn import datasets

from sklearn.model_selection import train_test_split

iris = datasets.load_iris()

x = iris.data

y = iris.target

x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=666)

#資料歸一化

from sklearn.preprocessing import standardscaler

standardscaler = standardscaler()

# 歸一化的過程跟訓練模型一樣

standardscaler.fit(x_train)

standardscaler.mean_

standardscaler.scale_ # 表述資料分布範圍的變數,替代std_

# 使用transform

x_train_standard = standardscaler.transform(x_train)

x_test_standard = standardscaler.transform(x_test)

注意:在建模時要將資料集劃分為訓練資料集&測試資料集,訓練資料集進行歸一化處理,需要計算出訓練資料集的均值mean_train和方差std_train,在對測試資料集進行歸一化時,仍然要使用訓練資料集的均值train_mean和方差std_train。

2.缺失值處理

遇到資料缺失的情況一般是進行填補:可以用均值和眾數中位數等進行填補

用pandas和numpy進行填補

import pandas as pd

data = pd.read_csv(r"...data.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

3.處理分型別特徵

在機器學習中,大多數演算法,譬如邏輯回歸,支援向量機svm,k近鄰演算法等都只能夠處理數值型資料,不能處理文字,在sklearn當中,除了專用來處理文字的演算法,其他演算法在fit的時候全部要求輸入陣列或矩陣,也不能夠匯入文字型資料,這是需要將數字型資料轉換成數值型。

#preprocessing.labelencoder:標籤專用,能夠將分類轉換為分類數值

from sklearn.preprocessing import labelencoder

​y = data.iloc[:,-1] #要輸入的是標籤,不是特徵矩陣,所以允許一維

​le = labelencoder() #例項化

le = le.fit(y) #匯入資料

label = le.transform(y) #transform介面調取結果

​le.classes_ #屬性.classes_檢視標籤中究竟有多少類別

label #檢視獲取的結果label

​le.fit_transform(y) #也可以直接fit_transform一步到位

​le.inverse_transform(label) #使用inverse_transform可以逆轉

​data.iloc[:,-1] = label #讓標籤等於我們執行出來的結果

​data.head()

​或from sklearn.preprocessing import labelencoder

data.iloc[:,-1] = labelencoder().fit_transform(data.iloc[:,-1])

#preprocessing.ordinalencoder:特徵專用,能夠將分類特徵轉換為分類數值

from sklearn.preprocessing import ordinalencoder

​#介面categories_對應labelencoder的介面classes_,一模一樣的功能

data_ = data.copy()

​data_.head()

​ordinalencoder().fit(data_.iloc[:,1:-1]).categories_

​data_.iloc[:,1:-1] = ordinalencoder().fit_transform(data_.iloc[:,1:-1])

​data_.head()

4.處理連續型特徵

#二值化

sklearn.preprocessing.binarizer

根據閾值將資料二值化(將特徵值設定為0或1),用於處理連續型變數。大於閾值的值對映為1,而小於或等於閾值的值對映為0。預設閾值為0時,特徵中所有的正值都對映到1。

data_2 = data.copy()

​from sklearn.preprocessing import binarizer

x = data_2.iloc[:,0].values.reshape(-1,1) #類為特徵專用,所以不能使用一維陣列

transformer = binarizer(threshold=30).fit_transform(x)

​transformer

參考:

特徵工程與資料預處理

通常而言,特徵選擇是指選擇獲得相應模型和演算法最好效能的特徵集。資料和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上限而已。從這個概念可以看出,特徵工程其實是乙個如何展示和表現資料的問題,在實際工作中需要把資料以一種 良好 的方式展示出來,使得能夠使用各種各樣的機器學習模型來得到更好的效果。...

特徵工程之特徵預處理

概念 特徵預處理是什麼呢?特徵預處理是通過統計方法 數學方法 將資料轉換成演算法要求的資料,所以特徵預處理也叫做資料預處理。下面是幾種資料預處理的方法 1 數值型資料 標準縮放 1 歸一化2 標準化 2 類別型資料 one hot編碼 3 時間類別 時間的劃分 下面介紹歸一化和標準化歸一化 歸一化 ...

特徵工程之特徵預處理

在前面我們分別討論了特徵工程中的特徵選擇與特徵表達,本文我們來討論特徵預處理的相關問題。主要包括特徵的歸一化和標準化,異常特徵樣本清洗與樣本資料不平衡問題的處理。由於標準化和歸一化這兩個詞經常混用,所以本文不再區別標準化和歸一化,而通過具體的標準化和歸一化方法來區別具體的預處理操作。z score標...