特征預處理:
什么是特征預處理?
通過一些轉換函數將特征數據轉換成更加適合算法模型的特征數據過程。
我們需要用到一些方法進行無量綱化,使不同規格的數據轉換到同一規格
為什么我們要進行歸一化/標准化?
- 特征的單位或者大小相差較大,或者某特征的方差相比其他的特征要大出幾個數量級,容易影響(支配)目標結果,使得一些算法無法學習到其它的特征
歸一化
1 定義
通過對原始數據進行變換把數據映射到(默認為[0,1])之間
2 公式
作用於每一列,max為一列的最大值,min為一列的最小值,那么X’’為最終結果,mx,mi分別為指定區間值默認mx為1,mi為0
那么怎么理解這個過程呢?我們通過一個例子
樣例計算:
3 API
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… ) MinMaxScalar.fit_transform(X) X:numpy array格式的數據[n_samples,n_features] 返回值:轉換后的形狀相同的array
4 數據計算
數據樣例:
#歸一化演示
def minmax_demo():
"""
歸一化演示
:return: None
"""
data = pd.read_csv("dating.txt")
#只要前三列
data=data.iloc[:,:3]
print(data)
# 1、實例化一個轉換器類
transfer = MinMaxScaler(feature_range=(2, 3))#參數是設定歸一化的范圍
# 2、調用fit_transform
data1 = transfer.fit_transform(data)
#data[['milage','Liters','Consumtime']]這樣也是去那些列
print("最小值最大值歸一化處理的結果:\n", data1)
return None
if __name__=="__main__":
minmax_demo()
歸一化總結
注意最大值最小值是變化的,另外,最大值與最小值非常容易受異常點影響(也包括缺省值等等),所以這種方法魯棒性較差(健壯性較差),只適合傳統精確小數據場景。
標准化(比較好)
1 定義
通過對原始數據進行變換把數據變換到均值為0,標准差為1范圍內
2 公式
作用於每一列,mean為平均值,σ為標准差
所以回到剛才異常點的地方,我們再來看看標准化
- 對於歸一化來說:如果出現異常點,影響了最大值和最小值,那么結果顯然會發生改變
- 對於標准化來說:如果出現異常點,由於具有一定數據量,少量的異常點對於平均值的影響並不大,從而方差改變較小。
3 API
sklearn.preprocessing.StandardScaler( )
處理之后每列來說所有數據都聚集在均值0附近標准差差為1
StandardScaler.fit_transform(X)
X:numpy array格式的數據[n_samples,n_features]
返回值:轉換后的形狀相同的array
4 數據計算
#標准化演示 def stand_demo(): """ 標准化演示 :return: None """ data = pd.read_csv("dating.txt") # 只要前三列data = data.iloc[:, :3]和后邊data[['milage','Liters','Consumtime']]和效果一樣 print(data) # 1、實例化一個轉換器類 transfer = StandardScaler() # 2、調用fit_transform data = transfer.fit_transform(data[['milage','Liters','Consumtime']]) print("標准化的結果:\n", data) print("每一列特征的平均值:\n", transfer.mean_) print("每一列特征的方差:\n", transfer.var_) return None if __name__=="__main__": stand_demo()
5 標准化總結
在已有樣本足夠多的情況下比較穩定,適合現代嘈雜大數據場景。
特征降維:
(在這里降維是將二維數組進行處理。降的是特征的個數)
降維是指在某些限定條件下,降低隨機變量(特征)個數,得到一組“不相關”主變量的過程
- 降低隨機變量的個數
- 相關特征(correlated feature)
- 相對濕度與降雨量之間的相關
- 等等
正是因為在進行訓練的時候,我們都是使用特征進行學習。如果特征本身存在問題或者特征之間相關性較強,對於算法學習預測會影響較大
降維的兩種方式
- 特征選擇
- 主成分分析(可以理解一種特征提取的方式)
什么是特征選擇
1 定義
數據中包含冗余或無關變量(或稱特征、屬性、指標等),旨在從原有特征中找出主要特征。
2 方法
- Filter(過濾式):主要探究特征本身特點、特征與特征和目標值之間關聯
- 方差選擇法:低方差特征過濾
- 相關系數
- Embedded (嵌入式):算法自動選擇特征(特征與目標值之間的關聯)
- 決策樹:信息熵、信息增益
- 正則化:L1、L2
- 深度學習:卷積等
對於Embedded方式,只能在講解算法的時候在進行介紹,更好的去理解
過濾式
低方差特征過濾
刪除低方差的一些特征,前面講過方差的意義。再結合方差的大小來考慮這個方式的角度。
- 特征方差小:某個特征大多樣本的值比較相近
- 特征方差大:某個特征很多樣本的值都有差別
- 難點:在於掌握閾值的大小,來進行合理的控制低方差的過濾
API
sklearn.feature_selection.VarianceThreshold(threshold = 0.0) 刪除所有低方差特征 Variance.fit_transform(X) X:numpy array格式的數據[n_samples,n_features] 返回值:訓練集差異低於threshold的特征將被刪除。默認值是保留所有非零方差特征,即刪除所有樣本中具有相同值的特征。
4 數據計算
#刪除低方差特征——特征選擇 def variance_demo(): """ 刪除低方差特征——特征選擇 :return: None """ data = pd.read_csv("factor_returns.csv") print(data) # 1、實例化一個轉換器類 transfer = VarianceThreshold(threshold=1) # 2、調用fit_transform data = transfer.fit_transform(data.iloc[:, 1:10])#先說行再說列用逗號分隔 print("刪除低方差特征的結果:\n", data) print("形狀:\n", data.shape)#多少行多少列 return None if __name__=="__main__": variance_demo()
相關系數(衡量不同變量之間相關性是不是很強)
- 皮爾遜相關系數(Pearson Correlation Coefficient)
- 反映變量之間相關關系密切程度的統計指標
特點
相關系數的值介於–1與+1之間,即–1≤ r ≤+1。其性質如下:
- 當r>0時,表示兩變量正相關,r<0時,兩變量為負相關
- 當|r|=1時,表示兩變量為完全相關,當r=0時,表示兩變量間無相關關系
- 當0<|r|<1時,表示兩變量存在一定程度的相關。且|r|越接近1,兩變量間線性關系越密切;|r|越接近於0,表示兩變量的線性相關越弱
- 一般可按三級划分:|r|<0.4為低度相關;0.4≤|r|<0.7為顯著性相關;0.7≤|r|<1為高度線性相關
這個符號:|r|為r的絕對值, |-5| = 5
API
from scipy.stats import pearsonr x : (N,) array_like y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)
案例:股票的財務指標相關性計算
#相關系數計算 def pearsonr_demo(): """ 相關系數計算 :return: None """ data = pd.read_csv("factor_returns.csv") factor = ['pe_ratio', 'pb_ratio', 'market_cap', 'return_on_asset_net_profit', 'du_return_on_equity', 'ev', 'earnings_per_share', 'revenue', 'total_expense'] for i in range(len(factor)): for j in range(i, len(factor) - 1): print("指標%s與指標%s之間的相關性大小為%f" % (factor[i], factor[j + 1], pearsonr(data[factor[i]], data[factor[j + 1]])[0])) plt.figure(figsize=(20, 8), dpi=100) plt.scatter(data['revenue'], data['total_expense']) plt.show() return None if __name__=="__main__": pearsonr_demo()
主成分分析:
什么是主成分分析(PCA)
-
定義:高維數據轉化為低維數據的過程,在此過程中可能會舍棄原有數據、創造新的變量
-
作用:是數據維數壓縮,盡可能降低原數據的維數(復雜度),損失少量信息。
- 應用:回歸分析或者聚類分析當中
對於信息一詞,在決策樹中會進行介紹
API
sklearn.decomposition.PCA(n_components=None)
將數據分解為較低維數空間
n_components:
小數:表示保留百分之多少的信息
整數:減少到多少特征
PCA.fit_transform(X) X:numpy array格式的數據[n_samples,n_features]
返回值:轉換后指定維度的array
數據計算
#對數據進行PCA降維 def pca_demo(): """ 對數據進行PCA降維 :return: None """ data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]] # 1、實例化PCA, 小數——保留多少信息。 transfer = PCA(n_components=0.9) # 2、調用fit_transform data1 = transfer.fit_transform(data) print("保留90%的信息,降維結果為:\n", data1) # 1、實例化PCA, 整數——指定降維到的維數 transfer2 = PCA(n_components=3) # 2、調用fit_transform data2 = transfer2.fit_transform(data) print("降維到3維的結果:\n", data2) return None if __name__=="__main__": pca_demo()