1. 程式人生 > >資料科學和人工智慧技術筆記 七、特徵工程

資料科學和人工智慧技術筆記 七、特徵工程

七、特徵工程

作者:Chris Albon

譯者:飛龍

協議:CC BY-NC-SA 4.0

稀疏特徵矩陣上的降維

# 載入庫
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import TruncatedSVD
from scipy.sparse import csr_matrix
from sklearn import datasets
import numpy as np

# 載入資料
digits = datasets.load_digits(
) # 標準化特徵矩陣 X = StandardScaler().fit_transform(digits.data) # 生成稀疏矩陣 X_sparse = csr_matrix(X) # 建立 TSVD tsvd = TruncatedSVD(n_components=10) # 在稀疏矩陣上使用 TSVD X_sparse_tsvd = tsvd.fit(X_sparse).transform(X_sparse) # 展示結果 print('Original number of features:', X_sparse.shape[1]) print('Reduced number of features:'
, X_sparse_tsvd.shape[1]) ''' Original number of features: 64 Reduced number of features: 10 ''' # 前三個主成分的解釋方差比之和 tsvd.explained_variance_ratio_[0:3].sum() # 0.30039385372588506

核 PCA 降維

# 載入庫
from sklearn.decomposition import PCA, KernelPCA
from sklearn.datasets import make_circles

# 建立線性不可分的資料
X, _ = make_circles(n_samples=1000, random_state=1, noise=0.1, factor=0.1) # 應用帶有徑向基函式(RBF)核的核 PCA kpca = KernelPCA(kernel="rbf", gamma=15, n_components=1) X_kpca = kpca.fit_transform(X) print('Original number of features:', X.shape[1]) print('Reduced number of features:', X_kpca.shape[1]) ''' Original number of features: 2 Reduced number of features: 1 '''

使用 PCA 的降維

# 載入庫
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn import datasets

# 載入資料
digits = datasets.load_digits()

# 標準化特徵矩陣
X = StandardScaler().fit_transform(digits.data)

# 建立保留 99% 方差的 PCA
pca = PCA(n_components=0.99, whiten=True)

# 使用 PCA
X_pca = pca.fit_transform(X)

# 展示結果
print('Original number of features:', X.shape[1])
print('Reduced number of features:', X_pca.shape[1])

'''
Original number of features: 64
Reduced number of features: 54 
'''

PCA 特徵提取

主成分分析(PCA)是資料科學中常見的特徵提取方法。 從技術上講,PCA 找到具有最高特徵值的協方差矩陣的特徵向量,然後使用這些特徵向量將資料投影到相等或更小維度的新子空間。 實際上,PCA 將 n 個特徵矩陣轉換為(可能)小於 n 個特徵的新資料集。 也就是說,它通過構造新的較少變數來減少特徵的數量,這些變數捕獲原始特徵中找到的資訊的重要部分。 但是,本教程的目的不是要解釋 PCA 的概念,這在其他地方做得非常好,而是用於演示 PCA 的實際應用。

# 匯入庫
import numpy as np
from sklearn import decomposition, datasets
from sklearn.preprocessing import StandardScaler

# 載入乳腺癌資料集
dataset = datasets.load_breast_cancer()

# 載入特徵
X = dataset.data

請注意,原始資料包含 569 個觀測和 30 個特徵。

# 檢視資料集的形狀
X.shape

# (569, 30) 

這裡是資料的樣子

# 檢視資料
X

'''
array([[  1.79900000e+01,   1.03800000e+01,   1.22800000e+02, ...,
          2.65400000e-01,   4.60100000e-01,   1.18900000e-01],
       [  2.05700000e+01,   1.77700000e+01,   1.32900000e+02, ...,
          1.86000000e-01,   2.75000000e-01,   8.90200000e-02],
       [  1.96900000e+01,   2.12500000e+01,   1.30000000e+02, ...,
          2.43000000e-01,   3.61300000e-01,   8.75800000e-02],
       ..., 
       [  1.66000000e+01,   2.80800000e+01,   1.08300000e+02, ...,
          1.41800000e-01,   2.21800000e-01,   7.82000000e-02],
       [  2.06000000e+01,   2.93300000e+01,   1.40100000e+02, ...,
          2.65000000e-01,   4.08700000e-01,   1.24000000e-01],
       [  7.76000000e+00,   2.45400000e+01,   4.79200000e+01, ...,
          0.00000000e+00,   2.87100000e-01,   7.03900000e-02]]) 
'''

# 建立縮放器物件
sc = StandardScaler()

# 使縮放器擬合特徵並轉換
X_std = sc.fit_transform(X)

請注意,PCA 包含一個引數,即成分數。 這是輸出特徵的數量,需要進行調整。

# 建立 PCA 物件,使用兩個成分作為引數
pca = decomposition.PCA(n_components=2)

# 擬合 PCA 並轉換資料
X_std_pca = pca.fit_transform(X_std)

在 PCA 之後,新資料已降到了兩個特徵,其行數與原始特徵相同。

# 檢視新特徵資料的形狀
X_std_pca.shape

# (569, 2) 

# 檢視新特徵資料
X_std_pca

'''
array([[  9.19283683,   1.94858307],
       [  2.3878018 ,  -3.76817174],
       [  5.73389628,  -1.0751738 ],
       ..., 
       [  1.25617928,  -1.90229671],
       [ 10.37479406,   1.67201011],
       [ -5.4752433 ,  -0.67063679]]) 
'''

使用 KMeans 聚類對觀測分組

# 載入庫
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import pandas as pd

# 製作模擬特徵矩陣
X, _ = make_blobs(n_samples = 50,
                  n_features = 2,
                  centers = 3,
                  random_state = 1)

# 建立 DataFrame
df = pd.DataFrame(X, columns=['feature_1','feature_2'])

# 建立 KMeans 聚類器
clusterer = KMeans(3, random_state=1)

# 擬合聚類器
clusterer.fit(X)

'''
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
    n_clusters=3, n_init=10, n_jobs=1, precompute_distances='auto',
    random_state=1, tol=0.0001, verbose=0) 
'''

# 預測值
df['group'] = clusterer.predict(X)

# 前幾個觀測
df.head(5)
feature_1 feature_2 group
0 -9.877554 -3.336145 0
1 -7.287210 -8.353986 2
2 -6.943061 -7.023744 2
3 -7.440167 -8.791959 2
4 -6.641388 -8.075888 2

為 LDA 選擇最佳數量的成分

在 scikit-learn 中,LDA 是使用LinearDiscriminantAnalysis實現的,包含一個引數n_components,表示我們想要返回的特徵數。 為了找出用於n_components的引數值(例如,要保留多少引數),我們可以利用一個事實,explain_variance_ratio_告訴我們每個輸出特徵的解釋方差並且是有序陣列。

具體來說,我們可以執行Linear_iscriminantAnalysis,將n_components設定為None來返回由每個特徵成分的解釋方差比,然後計算需要多少成分才能超過解釋方差的閾值(通常為 0.95 或 0.99)。

# 載入庫
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 載入鳶尾花資料集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 建立並執行 LDA
lda = LinearDiscriminantAnalysis(n_components=None)
X_lda = lda.fit(X, y)

# 建立解釋方差比的陣列
lda_var_ratios = lda.explained_variance_ratio_

# 建立函式
def select_n_components(var_ratio, goal_var: float) -> int:
    # 設定目前為止的初始解釋方差
    total_variance = 0.0

    # 設定初始特徵數
    n_components = 0

    # 對於每個特徵的解釋方差
    for explained_variance in var_ratio:

        # 將解釋方差新增到總體
        total_variance += explained_variance

        # 成分數加一
        n_components += 1

        # 如果我們達到了我們的解釋方差目標
        if total_variance >= goal_var:
            # 結束迴圈
            break

    # 返回成分數量
    return n_components

# 執行函式
select_n_components(lda_var_ratios, 0.95)

# 1 

為 TSVD 選擇最佳數量的成分

# 載入庫
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import TruncatedSVD
from scipy.sparse import csr_matrix
from sklearn import datasets
import numpy as np

# 載入資料
digits = datasets.load_digits()

# Standardize the feature matrix
X = StandardScaler().fit_transform(digits.data)

# 製作係數矩陣
X_sparse = csr_matrix(X)

# 建立並使用特徵數減一執行 TSVD
tsvd = TruncatedSVD(n_components=X_sparse.shape[1]-1)
X_tsvd = tsvd.fit(X)

# 解釋方差的列表
tsvd_var_ratios = tsvd.explained_variance_ratio_

# 建立函式
def select_n_components(var_ratio, goal_var: float) -> int:
    # 設定目前為止的初始解釋方差
    total_variance = 0.0

    # 設定初始特徵數
    n_components = 0

    # 對於每個特徵的解釋方差
    for explained_variance in var_ratio:

        # 將解釋方差新增到總體
        total_variance += explained_variance

        # 成分數加一
        n_components += 1

        # 如果我們達到了我們的解釋方差目標
        if total_variance >= goal_var:
            # 結束迴圈
            break

    # 返回成分數量
    return n_components

# 執行函式
select_n_components(tsvd_var_ratios, 0.95)

# 40 

將 LDA 用於降維

# 載入庫
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 載入鳶尾花資料集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 建立 LDA,它將資料降維到 1 個特徵
lda = LinearDiscriminantAnalysis(n_components=1)

# 執行 LDA 並使用它轉換特徵
X_lda = lda.fit(X, y).transform(X)

# 列印特徵數
print('Original number of features:', X.shape[1])
print('Reduced number of features:', X_lda.shape[1])

'''
Original number of features: 4
Reduced number of features: 1 
'''

## 檢視解釋方差比
lda.explained_variance_ratio_

# array([ 0.99147248])