
特徵工程就是一個把原始數據轉變成特徵的過程,這些特徵可以很好的描述這些數據,並且利用它們建立的模型在未知數據上的表現性能可以達到最優(或者接近最佳性能)。
一般來說,機器學習專案的優化有兩個角度:「更厲害的模型」跟「更好用的資料」。所謂的特徵工程就是從「更好用的資料」作為目的進行資料處理。
資料跟特徵決定模型的上限,模型跟算法只是逼近這個上限。
# 可使用目錄功能快速確認要閱覽的主題
特徵工程的常見手法
特徵工程是機器學習中非常重要的一個步驟,它是指對原始數據進行轉換和處理,以提取出對機器學習模型有意義的特徵,常見的方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。
上述特徵工程方法的使用目的
- 異常值檢測: 識別和處理異常數據點,提高數據質量和模型穩定性。
- 特徵轉換: 通過數學變換改善特徵的分佈和表現力。
- 特徵縮放: 將特徵數據縮放到統一範圍,保持特徵平衡,提升模型性能。
- 特徵表示: 將原始數據轉換為數值形式,使模型能夠理解和處理。
- 特徵選擇: 篩選重要特徵,減少冗餘,提升模型解釋性和效率。
- 特徵提取: 從原始數據中提取出能夠最好地描述數據變異性的特徵。
什麼時候要使用特徵工程?
1. 異常值檢測
- 什麼時候使用:在初步探索數據時,檢查數據是否存在異常值(即極端值或不符合預期的數據點)。
- 為什麼使用:異常值可能會對模型性能產生負面影響,例如導致模型過度擬合或誤導模型訓練。
2. 特徵轉換
- 什麼時候使用:當數據分佈不符合模型的假設或當數據有偏態時(例如偏態較大的數據)。
- 為什麼使用:通過轉換數據分佈,可以提高模型的表現,使數據更符合模型的要求。
3. 特徵縮放
- 什麼時候使用:在使用依賴距離的算法(如 K-means、SVM、線性回歸等)時,需要對數值型變數進行縮放。
- 為什麼使用:不同尺度的數據會導致模型偏向於更大或更小的數值範圍,因此縮放能夠平衡不同特徵的影響。
4. 特徵表示
- 什麼時候使用:當數據中存在類別型變數或非數值型數據(如文本數據)時,需要進行特徵表示。
- 為什麼使用:特徵表示可以將非數值型數據轉換為模型可以理解的數字形式。
5. 特徵選擇
- 什麼時候使用:當數據集中的特徵過多,且並非所有特徵都對目標變數有顯著影響時。
- 為什麼使用:特徵選擇可以減少模型的複雜度,提升模型的訓練速度,並防止過度擬合。
6. 特徵提取
- 什麼時候使用:當你希望從原始數據中創造出更具代表性或更簡潔的特徵時,特別是在數據維度很高的情況下。
- 為什麼使用:特徵提取可以減少數據的維度,同時保留重要的數據信息,提高模型的性能。
資料專案特徵工程應用流程建議
- 1. 數據探索和預處理:
- 檢查異常值:先檢查數據中是否存在異常值,並決定是否需要處理它們。
- 處理缺失值:處理數據中的缺失值。
- 2. 數據轉換:
- 進行特徵轉換:根據數據分佈情況決定是否需要進行轉換。
- 3. 數據縮放:
- 進行特徵縮放:根據模型需求決定是否需要進行縮放,尤其是在使用依賴距離的算法時。
- 4. 特徵表示:
- 進行特徵表示:將類別型和文本數據進行合適的表示轉換。
- 5. 特徵選擇和提取:
- 進行特徵選擇或提取:根據模型需求和數據特性選擇合適的方法進行特徵選擇或提取。
異常值檢測
在特徵工程中,異常值(outliers)的檢測是非常重要的一步。異常值可能會影響模型的表現,因此在建模前對異常值進行識別和處理是必要的。下面介紹幾種常見的異常值檢測方法,並展示如何使用 Python 來實現這些方法。
方法選擇重點
- Z-Score :適合單變數數據的異常值檢測,適合正態分佈的數據。
- IQR :適合單變數數據的異常值檢測,適合非正態分佈的數據。
- Isolation Forest :多變數和大規模數據異常值檢測的有力工具,特別適合非正態分佈數據,但需要選擇合適的參數。
- 可視化工具:理解數據的有力輔助方法,適合初步分析和小規模數據集。
1. 基於統計的方法檢測異常值
1.1 Z-Score (標準分數)
Z-Score 用於衡量一個數據點與均值的距離,通常在±3以外的數據被認為是異常值。
import numpy as np
import pandas as pd
# 假設有一個數據集 df
df = pd.DataFrame({
'feature1': [1, 2, 3, 4, 5, 6, 7, 100, 9, 10, 11, 12]
})
# 計算Z-Score
df['z_score'] = (df['feature1'] - df['feature1'].mean()) / df['feature1'].std()
# 找到異常值
outliers = df[df['z_score'].abs() > 3]
print(outliers)
"""
feature1 z_score
7 100 3.148021
"""
Z-Score 詳細介紹:
- Z-Score 適用場合:
- 數據服從正態分佈時效果最佳。
- 適合數值型變數,且異常值較少。
- Z-Score 優點:
- 簡單易用,計算效率高。
- 能夠直接量化異常程度。
- Z-Score 缺點:
- 對數據分佈要求較高,若數據偏離正態分佈,效果會大打折扣。
- 對極端異常值敏感,容易受到極端值的影響。
1.2 IQR (四分位距)
IQR 是 Q3(75%分位數)與 Q1(25%分位數)之間的距離,通常定義超過1.5倍IQR的數據為異常值。
import numpy as np
import pandas as pd
# 假設有一個數據集 df
df = pd.DataFrame({
'feature1': [1, 2, 3, 4, 5, 6, 7, 100, 9, 10, 11, 12]
})
# 計算Q1和Q3
Q1 = df['feature1'].quantile(0.25)
Q3 = df['feature1'].quantile(0.75)
IQR = Q3 - Q1
# 找到異常值
outliers = df[(df['feature1'] < (Q1 - 1.5 * IQR)) | (df['feature1'] > (Q3 + 1.5 * IQR))]
print(outliers)
"""
feature1
7 100
"""
- IQR 適用場合:
- 適用於中位數或四分位數較穩定的數據集。
- 適合檢測單變數的異常值。
- IQR 優點:
- 對於非正態分佈的數據也有效。
- 對極端異常值不敏感,較為穩定。
- IQR 缺點:
- 不適合多變數數據的異常值檢測。
- 計算過程中只考慮數據的 50%,可能會忽略一些信息。
2. 基於模型的方法檢測異常值
2.1 Isolation Forest
Isolation Forest 是一種基於樹模型的異常值檢測方法,通過將異常值隔離來進行檢測。
from sklearn.ensemble import IsolationForest
import numpy as np
import pandas as pd
# 假設有一個數據集 df
df = pd.DataFrame({
'feature1': [1, 2, 3, 4, 5, 6, 7, 100, 9, 10]
})
# 創建模型
iso = IsolationForest(contamination=0.1, random_state=42) # contamination表示預期異常值的比例
# 訓練模型
df['anomaly'] = iso.fit_predict(df[['feature1']])
# 找到異常值
outliers = df[df['anomaly'] == -1]
print(outliers)
"""
feature1 anomaly
7 100 -1
"""
contamination
:這個參數指定了數據集中異常值的大約比例。在這裡設置為0.1
,即預期有 10% 的數據是異常值。根據你的數據集的性質,你可以調整這個值。random_state
:為了確保結果的可重複性,可以設置一個隨機種子。predict
:這個方法對每個數據點進行分類,異常值標記為-1
,正常值標記為1
。
Isolation Forest 的基本原理是異常點(離群點)比正常點更容易被隔離。具體來說,它的工作方式如下:
- 隨機選擇一個特徵:在數據集的多個特徵中,隨機選擇一個特徵。
- 隨機選擇一個分割點:在所選特徵的取值範圍內,隨機選擇一個分割點,將數據集劃分為兩個部分。
- 重複步驟 1 和 2:對每個子集繼續執行隨機分割操作,直到所有數據點被單獨隔離或達到預定的停止條件。
- 構建多棵隨機樹:重複以上步驟多次,構建一個森林(多棵隨機樹)。在這些樹中,異常點通常會在樹的頂部被隔離(因為它們更容易被分離)。
- 計算異常分數:每個數據點的異常分數是它在多棵樹中被隔離的平均深度。深度越淺(即越容易被隔離),異常分數越高,該點越有可能是異常點。
- Isolation Forest適用場合:
- 適用於大規模、高維度數據集。
- 適合多變數數據的異常值檢測。
- Isolation Forest優點:
- 不依賴數據分佈,對非正態分佈數據有效。
- 能夠處理高維度數據,擴展性好。
- 對異常值檢測的效果通常優於基於距離的算法。
- Isolation Forest缺點:
- 訓練時間相對較長,對於大規模數據可能比較耗時。
- 參數(如樹的數量和深度)的選擇對結果有較大影響。
3. 基於可視化工具檢測異常值
使用可視化工具,如箱型圖(Box Plot)或小提琴圖,可以直觀地查看數據的分布及其異常值。
import seaborn as sns
import matplotlib.pyplot as plt
# 創建一個包含潛在異常值的數據集
df = pd.DataFrame({
'feature1': [1, 2, 3, 4, 5, 6, 7, 100, 9, 10] # 100 是潛在異常值
})
# 繪製箱型圖
sns.boxplot(x=df['feature1'])
plt.show()

- 可視化工具適用場合:
- 適合對數據進行初步探索和分析。
- 對於中小規模的數據集非常有效。
- 可視化工具優點:
- 直觀易懂,能夠快速定位異常值。
- 不依賴數據的統計特性,適用範圍廣。
- 能夠幫助理解數據的整體分佈和異常值的具體情況。
- 可視化工具缺點:
- 隨著數據維度的增加,可視化效果會變差,難以觀察多維數據中的異常值。
- 對於大規模數據集,可能難以全面檢測異常值。
特徵轉換
將特徵轉換為另一種形式,通常是為了讓數據更適合模型的假設或使數據更具可解釋性。特徵轉換的主要目的是通過改變數據的分佈形狀、處理非線性關係、或減少數據的偏態和峰態,來提高模型的性能。
方法選擇重點
- 對數轉換 (Log Transformation)
適合處理具有右偏態的數據,尤其是範圍變異性大或存在異常值的數據。它能夠壓縮數據範圍,將極端值的影響降低,特別適合處理大數據集。 - 平方根轉換 (Square Root Transformation)
適合用於處理輕微右偏態的數據,減少數據變異性但不過度壓縮,適合範圍較小且數據點間差異不大的數據。 - Box-Cox 轉換
適合處理偏離正態分佈的數據,尤其在需要將數據轉換為正態分佈或接近正態分佈時使用。這種方法靈活性高,適用於需要優化模型假設的情境,例如線性回歸。 - 標準化 (Standardization)
適合用於特徵尺度不同的情況,尤其是在距離敏感的算法(如KNN、SVM)中。這種方法有助於將特徵統一到相同的尺度上,特別適合數據範圍差異大的情況。 - 多項式特徵 (Polynomial Features)
適合用於擴展模型的非線性擬合能力,尤其是在線性模型無法滿足數據複雜性需求時。這種方法適合用於增強線性回歸等模型的表現。 - 指數轉換 (Exponential Transformation)
適合處理左偏態數據,尤其是需要擴展數據分佈時使用。這種方法特別適合當數據中包含許多接近零的值,且需要增加小值之間區別時。
1. 對數轉換 (Log Transformation)
對數轉換可以將數據的分佈從右偏(右側的長尾)轉換為更接近正態分佈。這有助於模型更好地處理數據,特別是在數據中存在極端值或長尾的情況下。
範例: 假設你有一個房價數據集,其中房價這個特徵的分佈是右偏的:
import numpy as np
import pandas as pd
# 假設有一個房價數據集
df = pd.DataFrame({
'Price': [100000, 150000, 200000, 250000, 300000, 350000, 400000, 450000, 1000000]
})
# 對數轉換
df['LogPrice'] = np.log(df['Price'])
print(df)
"""
Price LogPrice
0 100000 11.512925
1 150000 11.918391
2 200000 12.206073
3 250000 12.429216
4 300000 12.611538
5 350000 12.765688
6 400000 12.899220
7 450000 13.017003
8 1000000 13.815511
"""
結果: 對數轉換後,LogPrice
列的分佈會變得更加均勻,極端值對數據的影響也會減少。
- 對數轉換適用場合:
- 當特徵數據呈現右偏分佈時(數據集中有較多小值而少數大值)。
- 用於處理數據中的異常值,縮小數據範圍,減少數據的偏態。
- 對數轉換優點:
- 可以減少偏態,使數據更接近正態分佈。
- 通常能夠改善模型的穩定性和性能。
- 對數轉換缺點:
- 不能處理非正數數據(必須對數據進行平移以避免負值或零值)。
- 轉換後的解釋性會變差,因為數據變得不直觀。
2. 平方根轉換 (Square Root Transformation)
平方根轉換通常用於減少數據的偏態,尤其適合處理數據中存在零值或小範圍數據的情況。這種轉換可以讓數據分佈更加平滑。
範例: 假設有一個數據集記錄了城市人口數量,並且數據的分佈是右偏的:
# 人口數據集
df = pd.DataFrame({
'Population': [100, 150, 200, 300, 500, 800, 1000, 5000, 10000]
})
# 平方根轉換
df['SqrtPopulation'] = np.sqrt(df['Population'])
print(df)
"""
Population SqrtPopulation
0 100 10.000000
1 150 12.247449
2 200 14.142136
3 300 17.320508
4 500 22.360680
5 800 28.284271
6 1000 31.622777
7 5000 70.710678
8 10000 100.000000
"""
結果: SqrtPopulation
會顯示轉換後的數據,使得分佈更加平衡。
- 平方根轉換適用場合:
- 當特徵數據有輕微的右偏分佈時。
- 用於減少數據的變異性,但效果不如對數轉換明顯。
- 平方根轉換優點:
- 能夠處理正數數據的輕微偏態。
- 轉換後數據仍然保留一定的直觀性。
- 平方根轉換缺點:
- 轉換效果有限,對嚴重偏態的數據作用不大。
- 不能處理負值或零值數據。
3. Box-Cox 轉換
Box-Cox 轉換是一種更靈活的轉換方法,可以自動找到最佳的轉換參數 λ,使數據接近正態分佈。這對於任何類型的偏態分佈數據都有效。
範例:
from scipy import stats
# 假設有一組非正態分佈的數據
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# Box-Cox 轉換
transformed_data, best_lambda = stats.boxcox(data)
print("Transformed Data:", transformed_data)
print("Best Lambda:", best_lambda)
"""
Transformed Data: [0. 0.89952679 1.67649212 2.38322967 3.04195194 3.66477652
4.25925123 4.83048782 5.38215513 5.91700147]
Best Lambda: 0.7219640728650736
"""
結果: Box-Cox 轉換後的數據會更加接近正態分佈,best_lambda
是最佳的轉換參數。
- Box-Cox 適用場合:
- 當需要將數據轉換為正態分佈或接近正態分佈時。
- 可以處理非正態分佈的數據,包括右偏或左偏的數據。
- Box-Cox 優點:
- 提供了靈活的參數化方法,可以自動選擇最優轉換來改善數據分佈。
- 可以處理正數和非正數數據(需要調整)。
- Box-Cox 缺點:
- 計算較為複雜,需要優化參數來選擇最佳的轉換。
- 轉換後的數據直觀性較差,難以直接解釋。
4. 標準化 (Standardization)
將數據縮放到均值為 0,標準差為 1 的範圍。這在需要比較不同量級的特徵時特別有用,例如在使用線性回歸或支持向量機等模型時。
範例:
from sklearn.preprocessing import StandardScaler
# 假設有兩個特徵,量級不同
df = pd.DataFrame({
'Height': [150, 160, 170, 180, 190],
'Weight': [50, 60, 70, 80, 90]
})
# 標準化
scaler = StandardScaler()
df[['Height', 'Weight']] = scaler.fit_transform(df[['Height', 'Weight']])
print(df)
"""
Height Weight
0 -1.414214 -1.414214
1 -0.707107 -0.707107
2 0.000000 0.000000
3 0.707107 0.707107
4 1.414214 1.414214
"""
結果: Height
和 Weight
特徵會被縮放到相同的範圍內,使它們在模型中不會因量級差異而產生偏差。
- 標準化適用場合:
- 當特徵值範圍差異較大時,特別是對依賴距離的算法(如SVM、KNN、線性回歸)很有用。
- 用於將數據轉換為均值為0、標準差為1的正態分佈。
- 標準化優點:
- 可以讓所有特徵在相同的尺度上,避免因尺度不同而影響模型。
- 對於大多數機器學習模型來說,標準化後的數據通常會帶來更好的性能。
- 標準化缺點:
- 對於非正態分佈的數據,標準化可能無法糾正偏態。
- 對於已經正態分佈的數據,標準化的效果可能有限。
5. 多項式特徵 (Polynomial Features)
將現有特徵升高到某一冪次,以捕捉非線性關係。這對於線性模型在處理非線性數據時非常有用。
範例:
from sklearn.preprocessing import PolynomialFeatures
# 假設有一個特徵
X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)
# 生成二次多項式特徵
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
print(X_poly)
"""
[[ 1. 1. 1.]
[ 1. 2. 4.]
[ 1. 3. 9.]
[ 1. 4. 16.]
[ 1. 5. 25.]]
"""
結果: 輸出將包括原始特徵、一階特徵(即原特徵)和二次特徵,這些新特徵可以捕捉到數據中的非線性關係。
- 多項式特徵適用場合:
- 當模型需要更高維度的特徵來捕捉數據中的非線性關係時。
- 增加模型的複雜性來改善模型的表現(如線性回歸中擬合非線性數據)。
- 多項式特徵優點:
- 能夠捕捉數據中的非線性模式,提升模型的表現。
- 可以生成高階特徵來增加模型的靈活性。
- 多項式特徵缺點:
- 可能導致模型過擬合,特別是當階數過高時。
- 增加計算成本,並且生成的特徵數量會迅速增長。
6. 指數轉換 (Exponential Transformation)
用於將數據擴展到更大的範圍,這在數據中存在小數值並希望放大這些數值的影響時非常有用。
# 假設有一組數據
df = pd.DataFrame({
'Value': [1, 2, 3, 4, 5]
})
# 指數轉換
df['ExpValue'] = np.exp(df['Value'])
print(df)
"""
Value ExpValue
0 1 2.718282
1 2 7.389056
2 3 20.085537
3 4 54.598150
4 5 148.413159
"""
結果: ExpValue
將顯示指數轉換後的數據,這些數值將比原始數據增長得更快。
- 指數轉換適用場合:
- 當數據存在左偏分佈(數據集中有較多大值而少數小值)時。
- 用於拉伸數據分佈,使得小值更分散,增加數據的變異性。
- 指數轉換優點:
- 能夠有效擴大小數值的範圍,減少左偏態。
- 可應用於處理左偏數據或當數據集中有許多接近零的值時。
- 指數轉換缺點:
- 可能產生非常大的值,導致數據範圍急劇擴展。
- 同樣會降低數據的解釋性,因為轉換後的數據不直觀。
特徵縮放
特徵縮放是指將數據縮放到一個固定的範圍內,以使所有特徵具有相同的重要性。特徵縮放通常用於需要計算距離的機器學習算法中,例如 k-最近鄰(k-nearest neighbors,KNN)和支持向量機(support vector machine,SVM)。以下是一些常見的特徵縮放方法。
方法選擇重點
- 標準化:適合數據服從正態分佈或近似正態分佈的情況。
- 最小最大縮放:適合需要將數據限制在固定範圍的應用。
- 最大絕對值縮放:適合稀疏數據處理。
- 均值縮放:簡單的中心化方法,適合特徵分佈較均勻時。
- 魯棒縮放:適合於處理含有異常值的數據。
- 取對數:適合數據具有強烈正偏態或數據範圍跨度大的情況,能夠將數據分佈縮小到較小的範圍,減少偏態影響。
- 正規化:適合需要將每個樣本的特徵向量縮放到相同範圍的應用,例如在文本資料或圖像資料處理中保持樣本之間的相對大小關係。
1. 標準化 (Standardization)
標準化適合用於特徵值範圍差異大且模型對特徵的尺度敏感的情況,如支持向量機(SVM)、K最近鄰(KNN)等算法。在線性回歸中,如果特徵範圍不同,標準化有助於提高模型的收斂速度。
- 方法:將數據轉換為均值為0、標準差為1的標準正態分佈。
- 公式:
z = (x - mean) / std
,其中x
是原始數據,mean
是均值,std
是標準差。
範例:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
標準化適用場合:
- 特徵值服從高斯分佈或近似高斯分佈時。
- 適合於線性模型、支援向量機和 k 近鄰等模型。
標準化優點:
- 將特徵轉換為均值為 0、標準差為 1 的正態分佈,對大多數模型更穩定。
- 抗離群值的能力較好,因為標準差可以部分緩解極端值的影響。
標準化缺點:
- 如果特徵值分佈遠離高斯分佈,效果可能不理想。
2. 最小最大縮放 (Min-Max Scaling)
最小最大縮放適合用於需要將數據映射到特定範圍內的情況,如神經網絡中要求數據輸入在特定範圍內。在特徵範圍已知且數據分佈相對均勻的情況下使用。
- 方法:將數據縮放到一個固定範圍內,通常是0到1之間。
- 公式:
x_scaled = (x - min) / (max - min)
,其中min
和max
是特徵的最小值和最大值。
範例:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
最小最大縮放適用場合:
- 當特徵值範圍差異很大時使用,特別是一些無法假設分佈形狀的場景。
- 適合在神經網絡中作為特徵縮放方法。
最小最大縮放優點:
- 將特徵縮放到固定範圍(通常是 [0, 1]),適合對範圍敏感的演算法。
- 簡單直觀,適合無需假設特徵分佈的場景。
最小最大縮放缺點:
- 對於數據中存在極端值的情況,可能會導致縮放後的數據集中於某個狹窄的區間。
3. 最大絕對值縮放 (MaxAbs Scaling)
最大絕對值縮放適合用於稀疏數據(例如有很多0值的數據),如文本數據表示的稀疏矩陣。
- 方法:將數據縮放到 -1 到 1 之間,保留數據的稀疏性,適用於稀疏數據集。
- 公式:
x_scaled = x / max_abs(x)
,其中max_abs(x)
是特徵的最大絕對值。
範例:
from sklearn.preprocessing import MaxAbsScaler
scaler = MaxAbsScaler()
X_scaled = scaler.fit_transform(X)
最大絕對值縮放適用場合:
- 當數據中存在正負值,且需要保留數據的稀疏性時。
- 適用於特徵向量稀疏且具有不同範圍的情況。
最大絕對值縮放優點:
- 保留了數據的稀疏性,對於稀疏數據(如 TF-IDF 向量)特別有用。
- 不會改變數據的方向(即正負號)。
最大絕對值縮放缺點:
- 同樣容易受極端值的影響,極端值將影響所有數據的縮放結果。
4. 均值縮放 (Mean Normalization)
均值縮放適合用於數據分佈不均勻且希望中心化數據時。在進行線性模型建模時,用於平衡特徵值的尺度。
- 方法:將數據縮放到一個以均值為中心的範圍,數據的均值將為0。
- 公式:
x_scaled = (x - mean) / (max - min)
。
範例:
X_scaled = (X - X.mean()) / (X.max() - X.min())
均值縮放適用場合:
- 當希望將數據集中在某個範圍內,且均值置於 0 時。
均值縮放優點:
- 結合了標準化和最小最大縮放的特性,數據中心化且縮放到一定範圍內。
均值縮放缺點:
- 仍然容易受到極端值的影響,特別是在範圍極廣的數據上。
5. 魯棒縮放 (Robust Scaling)
魯棒縮放使用於當數據包含異常值且這些異常值對模型性能有負面影響時。適合於數據中存在大量離群點的情況。
- 方法:使用數據的中位數和四分位距(IQR)來縮放,減少異常值的影響。
- 公式:
x_scaled = (x - median) / IQR
。
範例:
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
X_scaled = scaler.fit_transform(X)
魯棒縮放適用場合:
- 當數據中存在大量極端值或離群點時。
魯棒縮放優點:
- 對離群值不敏感,因為使用中位數和四分位距來進行縮放,能有效減少極端值的影響。
- 特別適合於離群點影響較大的數據集。
魯棒縮放缺點:
- 對於數據呈現出特定分佈時(如正態分佈),效果可能不如標準化。
6. 取對數(Log Transformation)
取對數適合用於數據具有較強右偏態(如收入、價格等),對數轉換能使數據分佈更加對稱,有助於改善模型性能。於處理極值影響較大的數據,取對數可以減少異常值對模型訓練的干擾。
- 方法:將數據的每個值取對數,通常使用自然對數(base e),以壓縮數據範圍,減少偏態,並使數據更加接近正態分佈。
- 公式:
y = log(x)
,其中x
是原始數據,y
是取對數後的數據。
範例:
import numpy as np
import pandas as pd
# 假設有一個數據集 df,包含收入數據
df = pd.DataFrame({
'Income': [1000, 1200, 1500, 3000, 10000]
})
# 對收入數據進行取對數轉換
df['Income_log'] = np.log(df['Income'])
取對數適用場合:
- 當數據分佈具有強烈的正偏態或數據範圍跨度非常大時。
- 適用於數據中有較大離群值的情況。
取對數優點:
- 將數據縮小到較小範圍內,減少偏態。
- 對於正偏態數據,可以使數據接近正態分佈。
取對數缺點:
- 不能應用於負值或零值,需要進行偏移處理(如加 1)。
7. 正規化(Normalization)
正規化通常用於需要保證數據特徵之間的比例一致,特別是使用正規化回歸模型(如Ridge和Lasso回歸)時。適合於數據分佈範圍相差懸殊,且這些範圍差異會影響模型性能的情況。
方法:將數據縮放到一個固定範圍內,通常是 [0, 1] 或 [-1, 1],使不同特徵的值處於相同的範圍內。
公式:
最小-最大正規化(Min-Max Normalization):x_normalized = (x - x_min) / (x_max - x_min)
,其中 x
是原始數據,x_min
是最小值,x_max
是最大值。
範例:
from sklearn.preprocessing import Normalizer
normalizer = Normalizer()
X_normalized = normalizer.fit_transform(X)
正規化適用場合:
- 當需要將每個樣本縮放到相同的範圍內(例如 [0, 1] 或 [-1, 1])時。
- 適合於需要考慮特徵方向的場景,如文本資料或圖像資料。
正規化優點:
- 保證了所有樣本的特徵向量具有相同的量級(即歐氏距離為 1),適合於距離度量模型。
- 保持了樣本之間的相對大小關係。
正規化缺點:
- 對於已經標準化或縮放過的數據,可能不再需要進行正規化。
- 不適合當特徵量值的絕對大小具有重要意義的場合。
所使用的算法
- 需要正規化的算法:一些機器學習算法對特徵的尺度敏感,這些算法通常會受益於正規化處理。
- 距離度量算法:如K近鄰(KNN)、支持向量機(SVM)、K-means聚類。這些算法基於特徵之間的距離進行決策,如果特徵尺度不一致,會導致距離計算不準確。
- 線性模型:如邏輯回歸、線性回歸,這些模型在特徵權重的計算中也會受到特徵尺度的影響。
- 神經網絡:因為特徵尺度會影響梯度下降的收斂速度,正規化有助於加快收斂並提高性能。
- 通常不需要正規化的算法:一些算法本身不對特徵尺度敏感,因此不需要正規化處理。
- 決策樹及其衍生算法:如隨機森林、極端梯度提升(XGBoost)。這些算法基於特徵的分割點進行決策,不依賴於特徵尺度。
特徵表示
在特徵工程中,特徵表示(Feature Representation)是將原始數據轉換成模型可以理解和使用的形式的過程。以下是一些常用的特徵表示方法。
方法選擇重點
- 標籤編碼(Label Encoding): 當需要處理有序的類別型數據且希望保留類別之間的順序關係時,選擇標籤編碼。
- 獨熱編碼(One-Hot Encoding): 當處理無序的類別型數據且類別數量較少時,選擇獨熱編碼。
- 詞袋模型(Bag of Words): 當處理文本數據且需要簡單表示詞語出現頻率時,選擇詞袋模型。
- 詞嵌入(Word Embedding): 當需要捕捉文本中詞語的語義關係以用於NLP任務時,選擇詞嵌入。
- 分箱法(Binning): 當處理連續型數據且希望將其轉換為離散類別來處理非線性關係時,選擇分箱法。
1. 標籤編碼(Label Encoding)
- 概念:標籤編碼將類別型變數轉換為數字型變數。每個類別會被賦予一個唯一的數字標籤。例如,對於顏色這個變數,紅色、藍色、綠色可能會分別被編碼為 0、1、2。
- 應用場景:適用於有序類別數據(Ordinal Data),如「等級」(低、中、高),因為這些數字可以表示某種順序。
範例:
import pandas as pd
from sklearn.preprocessing import LabelEncoder
# 假設有一個滿意度的數據集
data = {'satisfaction': ['low', 'medium', 'high', 'low', 'medium', 'high']}
df = pd.DataFrame(data)
# 使用 LabelEncoder 進行編碼
label_encoder = LabelEncoder()
df['satisfaction_encoded'] = label_encoder.fit_transform(df['satisfaction'])
print(df)
"""
satisfaction satisfaction_encoded
0 low 1
1 medium 2
2 high 0
3 low 1
4 medium 2
5 high 0
"""
- 適用場合:
- 適合用於有序的類別型數據,如排名、等級等。
- 當類別之間有明確的順序且數量較少時,適合使用標籤編碼。
- 優點:
- 簡單易用,佔用較少的記憶體空間。
- 對於有序類別數據,可以保留類別之間的相對大小關係。
- 缺點:
- 對於無序類別數據,編碼後的數值可能會引入虛假的順序關係,影響模型性能。
- 對於大量類別,容易導致數據偏差。
延伸閱讀:
【資料分析】python資料處理-類別欄位轉換基礎操作語法彙整
2. 獨熱編碼(One-Hot Encoding)
- 概念:獨熱編碼將類別型變數轉換為多個二元變數,每個類別生成一個新的變數,該變數為1時表示該類別,否則為0。
- 應用場景:適用於無序類別數據(Nominal Data),如顏色、地區等,因為這些類別之間沒有數值上的大小關係。
範例:
import pandas as pd
data = {'color': ['red', 'blue', 'green', 'blue', 'red']}
df = pd.DataFrame(data)
df_one_hot = pd.get_dummies(df['color'])
print(df_one_hot)
"""
blue green red
0 0 0 1
1 1 0 0
2 0 1 0
3 1 0 0
4 0 0 1
"""
- 適用場合:
- 適合無序類別型數據,如顏色、城市、產品類型等。
- 用於處理數量較少且無序的類別型特徵。
- 優點:
- 避免了類別之間的順序關係,使模型不會誤解類別之間的相對大小。
- 增強模型的靈活性,特別適合對線性模型。
- 缺點:
- 當類別數量較多時,會導致生成大量稀疏特徵,增加計算資源需求。
- 佔用更多的記憶體和存儲空間。
延伸閱讀:
【資料分析】python資料處理-類別欄位轉換基礎操作語法彙整
3. 詞袋模型(Bag of Words)
- 概念:詞袋模型將文本轉換為特徵向量,該向量記錄了文本中每個詞彙的出現次數,不考慮詞序。
- 應用場景:適用於文本數據處理,如情感分析、文本分類等。
範例:
from sklearn.feature_extraction.text import CountVectorizer
documents = ["I love data science", "Data science is awesome", "I love Python"]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)
print(X.toarray())
print(vectorizer.get_feature_names_out())
"""
[[0 1 0 1 0 1]
[1 1 1 0 0 1]
[0 0 0 1 1 0]]
['awesome' 'data' 'is' 'love' 'python' 'science']
"""
- 適用場合:
- 適合處理文本數據,用於文本分類、主題建模等NLP任務。
- 當需要簡單表示文本中詞語的出現頻率時使用。
- 優點:
- 簡單且直觀,容易實現。
- 適合處理大規模文本數據集。
- 缺點:
- 忽略詞語之間的順序和語義關係,導致信息丟失。
- 生成的向量非常稀疏,增加計算複雜度。
4. 詞嵌入(Word Embedding)
- 概念:詞嵌入將詞彙表示為實數向量,這些向量捕捉了詞彙的語義和上下文信息。常見的詞嵌入技術包括 Word2Vec、GloVe 等。
- 應用場景:適用於自然語言處理(NLP)中的深度學習模型,如文本分類、機器翻譯等。
範例:
from gensim.models import Word2Vec
sentences = [["I", "love", "data", "science"], ["Data", "science", "is", "awesome"], ["I", "love", "Python"]]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
word_vector = model.wv['love']
print(word_vector)
"""
[-8.6196875e-03 3.6657380e-03 5.1898835e-03 5.7419371e-03
7.4669169e-03 -6.1676763e-03 1.1056137e-03 6.0472824e-03
-2.8400517e-03 -6.1735227e-03 -4.1022300e-04 -8.3689503e-03
-5.6000138e-03 7.1045374e-03 3.3525396e-03 7.2256685e-03
6.8002464e-03 7.5307419e-03 -3.7891555e-03 -5.6180713e-04
2.3483753e-03 -4.5190332e-03 8.3887316e-03 -9.8581649e-03
6.7646410e-03 2.9144168e-03 -4.9328329e-03 4.3981862e-03
-1.7395759e-03 6.7113829e-03 9.9648498e-03 -4.3624449e-03
-5.9933902e-04 -5.6956387e-03 3.8508223e-03 2.7866268e-03
6.8910765e-03 6.1010956e-03 9.5384959e-03 9.2734173e-03
7.8980681e-03 -6.9895051e-03 -9.1558648e-03 -3.5575390e-04
-3.0998420e-03 7.8943158e-03 5.9385728e-03 -1.5456629e-03
1.5109634e-03 1.7900396e-03 7.8175711e-03 -9.5101884e-03
-2.0553112e-04 3.4691954e-03 -9.3897345e-04 8.3817719e-03
9.0107825e-03 6.5365052e-03 -7.1162224e-04 7.7104042e-03
-8.5343365e-03 3.2071066e-03 -4.6379971e-03 -5.0889566e-03
3.5896183e-03 5.3703380e-03 7.7695129e-03 -5.7665063e-03
7.4333595e-03 6.6254949e-03 -3.7098003e-03 -8.7456414e-03
5.4374672e-03 6.5097548e-03 -7.8755140e-04 -6.7098569e-03
-7.0859264e-03 -2.4970602e-03 5.1432536e-03 -3.6652375e-03
-9.3700597e-03 3.8267397e-03 4.8844791e-03 -6.4285635e-03
1.2085581e-03 -2.0748782e-03 2.4402141e-05 -9.8835090e-03
2.6920033e-03 -4.7501065e-03 1.0876465e-03 -1.5762257e-03
2.1966719e-03 -7.8815771e-03 -2.7171851e-03 2.6631975e-03
5.3466819e-03 -2.3915148e-03 -9.5100952e-03 4.5058774e-03]
"""
- 適用場合:
- 適合用於自然語言處理中的文本數據處理,如文本分類、情感分析和機器翻譯。
- 當需要捕捉詞語之間的語義相似性時使用。
- 優點:
- 能夠捕捉詞語之間的語義相似性,生成稠密的詞向量表示。
- 適合用於多種NLP下游任務,如文本分類、命名實體識別等。
- 缺點:
- 訓練詞嵌入模型需要大量語料和計算資源。
- 嵌入向量的質量依賴於訓練語料的豐富度和質量。
5. 分箱法(Binning)
- 概念:分箱法將連續數據分割成多個區間,這些區間被稱為“箱”,然後將數據點分配到相應的箱中。這種方法可以將連續變數轉換為離散變數。
- 應用場景:適用於將連續變數分組,以簡化模型或應對異常值。如將年齡分為“青年”、“中年”、“老年”。
範例:
import pandas as pd
data = {'age': [22, 25, 47, 51, 62, 70, 80]}
df = pd.DataFrame(data)
bins = [0, 18, 35, 50, 65, 100]
labels = ['child', 'youth', 'adult', 'middle_aged', 'senior']
df['age_group'] = pd.cut(df['age'], bins=bins, labels=labels)
print(df)
"""
age age_group
0 22 youth
1 25 youth
2 47 adult
3 51 middle_aged
4 62 middle_aged
5 70 senior
6 80 senior
"""
- 適用場合:
- 適合處理連續型數據,將其轉換為離散類別數據,例如年齡分段、收入分級等。
- 當數據的非線性關係較強時,使用分箱法可以改善模型效果。
- 優點:
- 減少了數據的噪音和變異性,有助於提升模型的穩定性。
- 通過將數據分箱,可以更好地處理數據的非線性關係。
- 缺點:
- 分箱過程中可能丟失部分數據的信息,導致數據的解釋性下降。
- 分箱的選擇可能會影響最終模型的性能,選擇不當會導致信息丟失或過度簡化。
特徵選擇
特徵選擇是指從原始數據中選擇最具有信息量的特徵,以用於訓練機器學習模型。選擇更好的特徵可以提高模型的準確性,同時降低過擬合和計算成本。以下是一些常見的特徵選擇方法。
方法選擇重點
- 過濾法:適合初步篩選大量特徵,速度快,但忽略了特徵之間的相互作用。
- 包裹法:適合精確選擇特徵,但計算量大,可能過擬合。
- 嵌入法:適合在模型訓練過程中自動選擇特徵,但僅適用於特定模型。
- 穩定性選擇:適合在結果不穩定時使用,能夠識別穩定且可靠的特徵,但計算複雜度高。
- 降維技術:適合高維數據,減少冗餘信息,但特徵的解釋性較差。
1. 過濾法 (Filter Method)
- 描述:根據統計測度來評估每個特徵的重要性,選擇最具代表性的特徵。
- 常見方法:
- 相關係數 (Correlation Coefficient):衡量特徵與目標變量之間的線性相關性。
- 卡方檢驗 (Chi-Square Test):衡量分類問題中特徵與類別標籤的獨立性。
- ANOVA 方差分析:衡量數值型特徵與分類標籤之間的關聯性。
- 互信息 (Mutual Information):衡量特徵與目標變量之間的非線性依賴性。
- 適用場合:快速初步篩選特徵,特別是高維數據集。
範例: 使用卡方檢驗篩選分類問題中的重要特徵
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.datasets import load_iris
import pandas as pd
# 載入數據集
data = load_iris()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.Series(data.target)
# 使用卡方檢驗進行特徵選擇
selector = SelectKBest(score_func=chi2, k=2)
X_new = selector.fit_transform(X, y)
print("原始特徵:", X.columns)
print("選擇的特徵:", X.columns[selector.get_support()])
應用情境: 在分類問題中,如用戶分類、垃圾郵件檢測等,根據卡方檢驗選擇與類別標籤高度相關的特徵。
- 過濾法適用場合:
- 初步篩選大量特徵,特別是高維數據集。
- 不需要考慮特定模型的特徵選擇。
- 過濾法優點:
- 計算速度快,適合處理高維數據。
- 不依賴於特定的機器學習模型。
- 過濾法缺點:
- 忽略了特徵之間的相互影響,僅基於單一特徵與目標變量的相關性進行選擇。
- 可能會選擇到冗餘特徵。
2. 包裝法 (Wrapper Method)
- 描述:通過選擇特徵子集並評估其對模型效果的影響來進行特徵選擇,通常使用遞歸方法來選擇最佳特徵子集。
- 常見方法:
- 遞歸特徵消除 (Recursive Feature Elimination, RFE):反覆地構建模型,並將對模型效果影響最小的特徵逐步移除。
- 前向選擇 (Forward Selection):從空集開始,逐步添加對模型效果提升最大的特徵。
- 後向消除 (Backward Elimination):從完整集開始,逐步移除對模型效果貢獻最小的特徵。
- 適用場合:當特徵數量相對較少時,這些方法效果較好,但計算量較大。
範例: 使用遞歸特徵消除 (RFE) 進行特徵選擇
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
# 載入數據集
data = load_iris()
X = data.data
y = data.target
# 使用 RFE 進行特徵選擇
model = LogisticRegression(max_iter=1000)
rfe = RFE(estimator=model, n_features_to_select=2)
rfe = rfe.fit(X, y)
print("選擇的特徵:", rfe.support_)
print("特徵排名:", rfe.ranking_)
應用情境: 適用於特徵數量較少的情況,例如醫療數據分析中,通過 RFE 方法選擇對診斷結果影響最大的特徵。
- 適用場合:
- 特徵數量較少的情況。
- 需要精確選擇對模型影響最大的特徵。
- 優點:
- 考慮了特徵之間的相互影響,通常能夠選擇出對模型性能最優的特徵組合。
- 缺點:
- 計算量大,對於大規模數據集不太適合。
- 可能會出現過擬合問題,尤其是在數據量較小時。
3. 嵌入法 (Embedded Method)
- 描述:通過算法自身選擇出最有用的特徵,這些方法將特徵選擇過程內置於模型訓練過程中。
- 常見方法:
- L1 正則化 (Lasso Regression):利用 L1 正則化的稀疏性來自動選擇重要特徵,將一些特徵權重縮減為零。
- 決策樹與隨機森林 (Decision Tree/Random Forest):利用決策樹中特徵的重要性分數來進行特徵選擇。
- 梯度提升機 (Gradient Boosting Machines):使用特徵的重要性評分來選擇最佳特徵。
- 適用場合:適合用於需要模型進行特徵篩選的情況,如線性模型或樹模型。
範例: 使用 Lasso 回歸進行特徵選擇
from sklearn.linear_model import Lasso
from sklearn.datasets import load_boston
import numpy as np
# 載入數據集
data = load_boston()
X = data.data
y = data.target
# 使用 Lasso 進行特徵選擇
model = Lasso(alpha=0.1)
model.fit(X, y)
# 顯示每個特徵的係數
print("特徵係數:", model.coef_)
print("選擇的特徵:", np.where(model.coef_ != 0)[0])
應用情境: 在高維度數據集中,如房價預測中,通過 Lasso 回歸選擇出對預測結果影響最大的特徵。
- 適用場合:
- 需要在模型訓練過程中同時進行特徵選擇的情況。
- 適合用於線性模型(如 Lasso)或樹模型(如隨機森林、梯度提升機)。
- 優點:
- 通過模型自身進行特徵選擇,能夠自動考慮特徵之間的相互作用。
- 內置於模型訓練過程中,無需額外步驟。
- 缺點:
- 僅適用於特定模型,無法普遍應用於所有模型。
- 訓練過程可能會比較耗時,尤其是當模型較複雜時。
4. 基於穩定性選擇 (Stability Selection)
- 描述:結合多次採樣與模型訓練,選擇在多次訓練中表現穩定的重要特徵。
- 適用場合:當特徵數量多且模型結果具有不穩定性時,這種方法可以幫助識別穩定且可靠的特徵。
範例: 使用 StabilitySelection 進行特徵選擇
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
import numpy as np
# 載入數據集
data = load_iris()
X = data.data
y = data.target
# 使用 LogisticRegression 進行特徵選擇
model = LogisticRegression(max_iter=1000)
selector = SelectFromModel(model)
selector.fit(X, y)
print("選擇的特徵:", np.array(data.feature_names)[selector.get_support()])
應用情境: 適合用於需要識別穩定且重要特徵的情況,如金融風險管理中選擇穩定影響信用評分的特徵。
- 適用場合:
- 特徵數量多且模型結果具有不穩定性時。
- 需要選擇穩定且可靠的特徵,例如金融風險管理中。
- 優點:
- 能夠識別在不同樣本集上穩定出現的特徵,結果更加可靠。
- 減少了模型選擇過程中的隨機性。
- 缺點:
- 計算複雜度較高,尤其是在大規模數據集上。
- 需要多次訓練模型,耗時較長。
5. 基於降維的特徵選擇 (Dimensionality Reduction)
- 描述:將高維數據投影到低維空間中,同時保留數據的重要信息。
- 常見方法:
- 主成分分析 (PCA, Principal Component Analysis):將數據投影到與數據變異性最大方向對齊的主成分上,選擇前幾個主成分作為新特徵。
- 線性判別分析 (LDA, Linear Discriminant Analysis):在保留類別分離度的基礎上,將數據投影到低維空間。
- 適用場合:當數據中存在多個相關的特徵時,可以使用降維技術來減少冗餘信息。
範例: 使用 PCA 進行降維
from sklearn.decomposition import PCA
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt
# 載入數據集
data = load_digits()
X = data.data
y = data.target
# 使用 PCA 進行降維
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)
# 繪製降維後的結果
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y)
plt.xlabel('主成分 1')
plt.ylabel('主成分 2')
plt.show()
應用情境: 適合處理高維數據的應用,如手寫數字識別中使用 PCA 降維以減少特徵數量,同時保留重要信息。
- 適用場合:
- 處理高維數據集,尤其是特徵之間存在多重共線性或冗餘信息時。
- 在需要進行數據可視化的場合。
- 優點:
- 能夠有效降低數據維度,減少模型計算量。
- 保留數據中最大變異性,減少信息損失。
- 缺點:
- 降維後的特徵不具備明確的物理意義,解釋性較差。
- 降維過程可能會丟失部分有用信息。
特徵提取
特徵提取 (Feature extraction) 是特徵工程中的一個重要步驟,旨在從原始數據中提取出有助於模型學習的特徵。這些提取的特徵通常比原始數據更具代表性,能夠更好地反映數據中的潛在模式。以下是一些常用的特徵提取方法。
方法選擇重點
- 主成分分析 (PCA): 當需要在高維數據中進行降維,保留最大變異性並減少噪音時,選擇PCA。
- 線性判別分析 (LDA): 當處理有標籤的分類問題,並希望通過最大化類間差異來提高分類性能時,選擇LDA。
- 詞嵌入 (Word Embeddings): 當處理文本數據並需要捕捉詞語之間的語義相似性時,選擇詞嵌入。
- T-SNE: 當需要將高維數據進行可視化,並探索其局部結構和群集時,選擇T-SNE。
- 自動編碼器 (Autoencoders): 當需要非監督學習、數據去噪或異常檢測時,選擇自動編碼器。
1. 主成分分析 (PCA, Principal Component Analysis)
- 概念: 一種線性降維技術,將高維數據投影到主成分上,保留數據的最大方差。
- 應用場景: 用於數據降維,減少模型的複雜度,特別是處理高維數據集。
範例:
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
# 加載Iris數據集
data = load_iris()
X = data.data
# PCA降維到2個主成分
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
print("降維後的數據形狀:", X_pca.shape)
- 主成分分析適用場合:
- 適用於高維數據集的降維,例如圖像數據、金融數據或基因數據。
- 用於減少數據的維度,同時保留大部分數據的變異性。
- 主成分分析優點:
- 降低數據的維度,減少計算資源需求。
- 幫助去除噪音和冗餘特徵。
- 在確保大部分數據變異性的同時,維持較高的信息量。
- 主成分分析缺點:
- 假設數據是線性的,對於非線性數據效果不佳。
- 難以解釋生成的主成分,特徵的物理意義可能不明確。
- 如果特徵標度不同,PCA可能會產生偏差,需要先進行標準化處理。
2. 線性判別分析 (LDA, Linear Discriminant Analysis)
- 概念: 一種監督式降維方法,通過最大化類間距離和最小化類內距離來提取特徵。
- 應用場景: 用於分類問題,特別是在有標籤的情況下,有助於提高模型的分類性能。
範例:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.datasets import load_iris
# 加載Iris數據集
data = load_iris()
X = data.data
y = data.target
# LDA降維到2個線性判別組
lda = LDA(n_components=2)
X_lda = lda.fit_transform(X, y)
print("降維後的數據形狀:", X_lda.shape)
- 線性判別分析適用場合:
- 適用於有標籤的分類問題,尤其是在樣本數量較少且特徵數量較多的情況下。
- 用於提高分類模型的性能,特別是在類間差異明顯的情況下。
- 線性判別分析優點:
- 提高分類性能,特別是在數據分佈呈現高斯分佈時效果良好。
- 通過最大化類間距離和最小化類內距離,有助於改善分類結果。
- 線性判別分析缺點:
- 假設數據符合高斯分佈,對非高斯分佈數據效果不佳。
- 對於特徵之間不獨立的數據,效果可能較差。
- 當類別之間的共變異矩陣相似時,LDA的性能可能會降低。
3. 詞嵌入 (Word Embeddings)
- 概念: 在自然語言處理中,將詞語轉換為密集向量,這些向量捕捉語義關係。
- 應用場景: 用於文本數據處理,如詞語相似度計算和文本分類。
範例:
from gensim.models import Word2Vec
# 示例句子
sentences = [['this', 'is', 'a', 'sentence'], ['this', 'is', 'another', 'sentence']]
# 訓練Word2Vec模型
model = Word2Vec(sentences, vector_size=50, min_count=1)
# 獲取詞嵌入
word_vector = model.wv['sentence']
print("詞語'sentence'的嵌入向量:", word_vector)
- 詞嵌入適用場合:
- 適用於自然語言處理(NLP)中的文本數據處理,如文本分類、情感分析和機器翻譯。
- 用於捕捉詞語之間的語義關係,生成稠密的詞向量表示。
- 詞嵌入優點:
- 捕捉詞語之間的語義相似性,使模型能夠理解詞語的語境意義。
- 通常比傳統的詞袋模型(Bag-of-Words)更有效,因為它能夠生成連續且有意義的向量表示。
- 可用於多種下游NLP任務,如文本分類、命名實體識別和機器翻譯。
- 詞嵌入缺點:
- 訓練詞嵌入模型需要大量語料,且計算資源需求高。
- 嵌入向量的維度和語料選擇對最終效果影響較大。
- 難以處理罕見詞或未見過的詞,可能需要進行OOV(Out-Of-Vocabulary)處理。
4. T-SNE (t-Distributed Stochastic Neighbor Embedding)
- 概念: 一種非線性降維技術,通常用於數據可視化,通過在低維空間中保留數據的局部結構來展示高維數據。
- 應用場景: 高維數據的可視化,特別是在圖像和文本數據集上。
範例:
from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
# 加載Digits數據集
data = load_digits()
X = data.data
# T-SNE降維到2維
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)
print("降維後的數據形狀:", X_tsne.shape)
- T-SNE適用場合:
- 適用於高維數據的可視化,例如圖像數據、基因表達數據和文本數據。
- 用於在低維空間中展示高維數據的局部結構,通常用於探索性數據分析。
- T-SNE優點:
- 能夠很好地保留高維數據的局部結構,適合用於數據可視化。
- 在探索性數據分析中,能夠幫助識別數據中的群集和異常點。
- T-SNE缺點:
- 計算複雜度高,特別是當數據量較大時,計算時間較長。
- 超參數(如perplexity)需要仔細調整,對結果有很大影響。
- t-SNE通常僅用於可視化,不適合用作降維前處理步驟,因為它無法保證在新數據上的一致性。
5. 自動編碼器 (Autoencoders)
- 概念: 一種非監督神經網絡,用於學習數據的低維表示(編碼),並從中重建數據(解碼)。
- 應用場景: 適用於高維數據的降維與特徵提取,常用於圖像和聲音數據的處理。
範例:
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from tensorflow.keras.datasets import mnist
# 加載MNIST數據集
(X_train, _), (X_test, _) = mnist.load_data()
X_train = X_train.astype('float32') / 255.
X_test = X_test.astype('float32') / 255.
X_train = X_train.reshape((len(X_train), -1))
X_test = X_test.reshape((len(X_test), -1))
# 自動編碼器模型
input_dim = X_train.shape[1]
encoding_dim = 32
input_layer = Input(shape=(input_dim,))
encoded = Dense(encoding_dim, activation='relu')(input_layer)
decoded = Dense(input_dim, activation='sigmoid')(encoded)
autoencoder = Model(input_layer, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
# 訓練模型
autoencoder.fit(X_train, X_train, epochs=50, batch_size=256, shuffle=True, validation_data=(X_test, X_test))
# 使用編碼部分提取特徵
encoder = Model(input_layer, encoded)
X_train_encoded = encoder.predict(X_train)
print("編碼後的數據形狀:", X_train_encoded.shape)
- 自動編碼器適用場合:
- 適用於非監督學習中的高維數據降維和特徵提取,如圖像、聲音和時間序列數據。
- 用於數據去噪、生成模型和異常檢測。
- 自動編碼器優點:
- 能夠從數據中學習非線性特徵,適合處理複雜的高維數據。
- 具有靈活的結構,可以調整編碼器和解碼器的層數和神經元數量,以適應不同的數據集。
- 可以用於數據重建、生成模型、異常檢測和降維等多種應用。
- 自動編碼器缺點:
- 訓練過程可能需要大量數據和計算資源,尤其是在深層結構的情況下。
- 如果訓練不充分或過度擬合,可能無法有效地提取出有用的特徵。
- 隨著網絡結構的複雜化,模型解釋性降低,難以理解中間表示的物理意義。