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標...