標准化和缺失值的處理
標准化 :
特點 : 通過對原始數據進行變換把數據變換到均值為0, 標准差為1的范圍內.
## 對於歸一化來說:如果出現異常點,影響了大值和小值,那么結果顯然會發生改變 對於標准化來說:如果出現異常點,由於具有一定數據量,少量的異常點對於平均值的影響並不大,從 而方差改變較小。在已有樣本足夠多的情況下比較穩定,適合現代嘈雜的大數據場景。 ##
標准化API :
API : sklearn.preprocessing.StandarScaler
StandardScaler()
處理之后每列所有數據都聚集在均值為0標准差為1附近
StandarScaler.fit_transform(x)
x:numpy array格式的數據(n_samples,n_features)
返回值:轉換后的形狀相同的array
StandarScaler.mean_
原始數據中每列的平均值中位數
StandarScaler.std_
原始主句每列特征的方差
步驟
實例化 StandarScaler
通過 fit_transform 轉換
案例 :案例 :案例 :案例 :
import numpy as np from sklearn.preprocessing import StandardScaler ss = StandardScaler() # 實例化 data = np.array([[5000,2,10,40],[6000,3,15,45],[50000,5,15,40]]) # 數據 res = ss.fit_transform(data) print(res)
缺失值的處理方法 :
刪除 : 如果每列或者行數據達到一定比例, 建議放棄整行或整列 .
插補 : 可以通過缺失值每行或每列的平均值/中位數來填充.
缺失值處理API :
sklearn缺失值接口 : sklearn.impute.SimpleImputer SimpleImputer(missing_values='NaN',strategy='mean',axis=0) 完成缺失值插補 SimpleImputer.fit_transform(x) x:numpy array格式的數據 返回值:轉換后形狀相同也即是的array 步驟 初始化SimpleImputer,指定缺失值,指定填補策略,指定行或列。 注:缺失值也可以是別的指定要替換的值 調用 fit_transform
案例:案例:案例:案例:
import numpy as np from sklearn.impute import SimpleImputer data = np.array([[1,2],[np.NaN,3],[7,6]]) si = SimpleImputer() # si = SimpleImputer(missing_values=6,strategy='most_frequent') # missing_values : 指定值填充,默認為NaN. # strategy : 填充數值計算方法 ['mean', 'median', 'most_frequent', 'constant'] res = si.fit_transform(data) print(res)
## 👉 列avg,不包含NaN,不計算NaN行 ##
數據降維
數據降維 :這里的維度指定是特征數量,這里的降維是指減少特征的數量。
數據降維有2種,分別是特征選擇 和 主成分分析.
特征選擇 :
特征選擇的原因 :
冗余 : 部分特征的相關度搞,容易消化計算性能.
噪聲 : 部分特征對預測結果有影響.
概念 :
特征選擇就是指 單純的從提取到的所有特征選擇部分特征作為訓練集特征, 特征在選擇前和選擇后可以改變值,也可以不改變值.但是選擇后的特征維數肯定比選擇前小,畢竟我們只選擇了其中的一部分.
主要方法:
Filter(過濾式): VarianceThreshold
Embedded(嵌入式): 正則化 , 決策樹
特征選擇API (降維):
類:sklearn.feature_selection.VarianceThreshold VarianceThreshold(threshold=0.0) 刪除所有低方差特征 Variance.fit_transform(x) x:numpy array格式的數據 返回值:刪除方差低於threshold的特征之后的數據集 默認值是保留所有非零方差特征,即刪除所有樣本中具有相同值的特征 流程 初始化VarianceThreshold,指定閾值方差 調用 fit_transform
案例:案例:案例:案例:
# 案例演示 import numpy as np from sklearn.feature_selection import VarianceThreshold data = np.array([[0,2,0,3],[0,1,4,3],[0,1,2,3]]) print('降維前:',data) vt = VarianceThreshold(threshold=0.0) #過濾方差為0 , 數據不變 res = vt.fit_transform(data) # 少部分數據 print('降維后:',res)
主成分分析 :
本質 : PCA是一種分析,簡化數據集的技術.
目的 : 是數據維度壓縮,盡可能降低原數據的維數(復雜度),盡可能的減少損失信息
作用 : 可以消減回歸分析或者聚類分析中特征的數量
使用場景 : 特征數量達到上百的時候,考慮數據的簡化.
主成分分析API(降維) :
類 sklearn.decompositon.PCA
PCA(n_componets=None) 將數據分解為較低維數據 PCA.fit_transform(x) x:numpy array格式 返回值:轉換后降低維度的array n_componets參數: 小數:表示將信息保存到原信息的百分比,例如0.95表示降維后信息量是原來的95%。一般制定到0.9-0.95 整數:較少到的特征數量,一般不使用 流程 實例化 PCA 調用 fit_transform
案例:案例:案例:案例:
from sklearn.decomposition import PCA pca = PCA(n_components=0.95) data = np.array([[2,8,4,5],[6,3,0,8],[5,4,9,1]]) print('主成分分析降維前:\n',data) res = pca.fit_transform(data) print('主成分分析降維后:\n',res) # 維度下降,不損失信息
真實案例演示 :
案例代碼 :
# 代碼 import pandas as pd from sklearn.decomposition import PCA # 讀取四張表的數據 prior = pd.read_csv(r'D:\dataanalysis\Felix\week7\instacart\order_products__prior.csv') # 沒有數據,只有代碼..... product = pd.read_csv(r'D:\dataanalysis\Felix\week7\instacart\products.csv') orders = pd.read_csv(r'D:\dataanalysis\Felix\week7\instacart\orders.csv') aisles = pd.read_csv(r'D:\dataanalysis\Felix\week7\instacart\aisles.csv') # 合並四張表到一張表,(用戶-物品類別) data = pd.merge(prior, product, on='product_id') data = pd.merge(data, orders, on='order_id' ) data = pd.merge(data, aisles, on='aisle_id') # 建立一個以用戶為行,產品為列的表 # 即用戶和產品進行交叉 table = pd.crosstab(data['user_id'], data['aisle']) # 數據結構為(206209, 134),需要做主成分分析,進行降維 pca = PCA(n_components=0.9) res = pca.fit_transform(table)
# 最后降維成: (206209, 27)
API總結 :
1. fit_transform() : 輸入數據直接轉換
2. fit() : 輸入數據,計算一些中間值,但是不能轉換
3. transform() : 進行數據轉換
4. fit_transform() = fit() + transform()