[Day 54] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

大綱

  1. 簡介

    • 什麼是特徵工程
    • 為什麼特徵工程在機器學習中如此重要
  2. 特徵工程的基本步驟

    • 特徵選擇
    • 特徵創建
    • 特徵轉換
    • 特徵縮放
  3. 特徵選擇技術

    • 過濾法(Filter Methods)
    • 包裝法(Wrapper Methods)
    • 嵌入法(Embedded Methods)
  4. 特徵創建技術

    • 組合特徵
    • 交互特徵
    • 基於領域知識的特徵創建
  5. 特徵轉換技術

    • 數據編碼
    • 數據分箱
    • 數據歸一化和標準化
  6. 特徵縮放技術

    • Min-Max Scaler
    • Standard Scaler
    • Robust Scaler
  7. 特徵工程中的常見挑戰

    • 過擬合的風險
    • 特徵相關性與冗餘
    • 特徵選擇與模型性能之間的權衡
  8. 實際應用與案例分析

    • 一個真實數據集的案例:特徵工程過程的實踐
    • 代碼示例與詳細解釋

1. 簡介

特徵工程是指在機器學習模型訓練之前,從原始數據中提取並創建適當的特徵的過程。特徵工程被認為是數據科學中最重要的步驟之一,因為它能夠顯著影響模型的預測性能。無論是經驗豐富的數據科學家還是初學者,都必須掌握特徵工程的技術,以便在多樣的數據集中提高模型的表現。

機器學習模型的輸入數據通常是以特徵向量的形式存在,這些特徵向量由多個特徵組成,而這些特徵通常源自原始數據中的變量。這些變量可能是數值型的、類別型的、日期型的,甚至是文本型的。如何從這些原始變量中提取有用的特徵並轉換成適合模型訓練的數據格式,是特徵工程的核心任務。

2. 特徵工程的基本步驟

在進行特徵工程時,通常會按照以下步驟來處理數據:

  1. 特徵選擇:從原始數據中選擇出對模型預測最有價值的特徵。
  2. 特徵創建:基於現有的數據創建新的特徵。
  3. 特徵轉換:將特徵轉換成適合模型輸入的格式。
  4. 特徵縮放:調整特徵的尺度,使其更適合機器學習模型。
2.1 特徵選擇

特徵選擇是指從大量的候選特徵中選擇出對模型最有幫助的特徵。這個過程可以顯著減少模型的計算負擔,並且可以提高模型的準確性。常見的特徵選擇技術包括過濾法、包裝法和嵌入法。

代碼示例

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel

# 加載數據集
iris = load_iris()
X = iris.data
y = iris.target

# 訓練隨機森林分類器
clf = RandomForestClassifier(n_estimators=100)
clf = clf.fit(X, y)

# 根據特徵的重要性選擇特徵
model = SelectFromModel(clf, prefit=True)
X_new = model.transform(X)

print("原始特徵數量:", X.shape[1])
print("選擇後的特徵數量:", X_new.shape[1])

解釋

在這個例子中,我們使用了RandomForestClassifier來評估特徵的重要性,然後使用SelectFromModel來選擇出最重要的特徵。SelectFromModel通過設置預先訓練的模型來選擇對預測影響最大的特徵。這樣可以減少特徵數量,同時保留對模型性能有利的特徵。

2.2 特徵創建

特徵創建是從現有的數據中創建新的特徵,使模型能夠更好地捕捉數據中的模式。例如,從日期型數據中創建月、週、或日等特徵,或者通過數據的變換來創建交互特徵。

代碼示例

import pandas as pd
import numpy as np

# 創建樣本數據集
data = pd.DataFrame({
    'Date': pd.date_range(start='2022-01-01', periods=100, freq='D'),
    'Sales': np.random.randint(100, 200, size=100)
})

# 創建新的特徵:月、週、日
data['Month'] = data['Date'].dt.month
data['Week'] = data['Date'].dt.week
data['Day'] = data['Date'].dt.day

# 創建一個滯後特徵
data['Lag1_Sales'] = data['Sales'].shift(1)

print(data.head())

解釋

這段代碼展示了如何從日期型數據中提取時間相關的特徵,如月、週和日。此外,還創建了一個滯後特徵Lag1_Sales,它表示前一天的銷售數據。這種滯後特徵在時間序列預測中非常有用,因為它能捕捉到數據的時間依賴性。

2.3 特徵轉換

特徵轉換是將特徵轉換為適合機器學習模型輸入的格式的過程。常見的轉換包括數據編碼、分箱、歸一化和標準化。

代碼示例

from sklearn.preprocessing import OneHotEncoder

# 創建樣本數據集
data = pd.DataFrame({
    'Color': ['Red', 'Blue', 'Green', 'Blue', 'Red'],
    'Size': ['S', 'M', 'L', 'M', 'S']
})

# 使用OneHotEncoder進行編碼
encoder = OneHotEncoder(sparse=False)
encoded_data = encoder.fit_transform(data)

print(encoded_data)

解釋

在這個例子中,OneHotEncoder用於將類別型數據轉換為二進制特徵矩陣。這種編碼方法能夠將類別型變量轉換成數字特徵,使其可以被機器學習模型理解。

2.4 特徵縮放

特徵縮放是將不同尺度的特徵調整到相同尺度的過程,以避免某些特徵因取值範圍過大而主導模型訓練。常見的方法包括最小-最大縮放和標準化。

代碼示例

from sklearn.preprocessing import StandardScaler

# 創建樣本數據
data = pd.DataFrame({
    'Height': [150, 160, 170, 180, 190],
    'Weight': [50, 60, 70, 80, 90]
})

# 使用StandardScaler進行標準化
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

print(scaled_data)

解釋

在這裡,StandardScaler用於將特徵數據標準化。標準化的結果是特徵將具有零均值和單位方差,這在許多機器學習算法中可以提高模型的訓練效率和準確性。

3. 特徵選擇技術

特徵選擇技術的目的是在眾多特徵中挑選出對預測目標影響最大的特徵。這些技術包括過濾法、包裝法和嵌入法。

3.1 過濾法

過濾法是指根據統計特性或其他相關指標對特徵進行篩選的方法,如卡方檢驗、皮爾森相關係數等。

代碼示例

from sklearn.feature_selection import chi2
from sklearn.feature_selection import SelectKBest

# 創建樣本數據
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 2, 3])

# 使用卡方檢驗選擇特徵
chi2_selector = SelectKBest(chi2, k=2)
X_kbest = chi2_selector.fit_transform(X, y)

print(X_kbest)

解釋

這段代碼展示了如何使用卡方檢驗進行特徵選擇。SelectKBest用於根據統計指標選擇最具代表性的特徵。

3.2 包裝法

包裝法通過反覆訓練模型並評估模型性能來選擇最佳特徵。這種方法通常計算開銷較大,但選出的特徵通常對模型有較大貢獻。

代碼示例

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

# 創建樣本數據
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])

# 使用遞歸特徵消除法進行特徵選擇
model = LogisticRegression()
rfe = RFE(model, n_features_to_select=2)
X_rfe = rfe.fit_transform(X, y)

print(X_rfe)

解釋

在這裡,我們使用了遞歸特徵消除法(RFE)來進行特徵選擇。該方法逐步消除不重要的特徵,直到剩下對模型最有用的特徵。

4. 特徵創建技術

特徵創建的目的在於通過對現有數據進行轉換或結合來創建新的特徵,使得模型能夠更好地識別數據中的模式。

4.1 組合特徵

組合特徵是將現有特徵通過數學運算結合起來,創建出新的特徵。例如,可以將兩個數值特徵相加或相乘來創建新特徵。

代碼示例

# 創建樣本數據
data = pd.DataFrame({
    'Height': [150, 160, 170, 180, 190],
    'Weight': [50, 60, 70, 80, 90]
})

# 創建組合特徵
data['BMI'] = data['Weight'] / (data['Height']/100)**2

print(data)

解釋

這段代碼展示了如何創建一個BMI(體重指數)特徵,該特徵是根據身高和體重計算出來的。BMI是一個常用的組合特徵,能夠幫助模型更好地理解個體的健康狀況。

4.2 交互特徵

交互特徵是指通過兩個或多個特徵的交互來創建新的特徵。例如,將某兩個特徵相乘、相加或其他運算方式來創建交互特徵。

代碼示例

# 創建樣本數據
data = pd.DataFrame({
    'Age': [23, 45, 34, 25, 42],
    'Income': [50000, 60000, 55000, 48000, 62000]
})

# 創建交互特徵
data['Age_Income'] = data['Age'] * data['Income']

print(data)

解釋

在這個例子中,創建了一個Age_Income的交互特徵,這個特徵表示年齡與收入的乘積。這樣的交互特徵能夠捕捉變量之間的複雜關係,從而提高模型的表現。

5. 特徵轉換技術

特徵轉換技術涉及將原始數據轉換為更適合機器學習模型處理的形式。這包括對數據進行編碼、分箱、歸一化和標準化等處理。

5.1 數據編碼

數據編碼是將類別型變量轉換為數值型變量的過程。最常見的方法是One-Hot編碼,它將每個類別型變量轉換為多個二進制特徵。

代碼示例

from sklearn.preprocessing import LabelEncoder

# 創建樣本數據
data = pd.DataFrame({
    'Category': ['A', 'B', 'A', 'C', 'B']
})

# 使用LabelEncoder進行編碼
encoder = LabelEncoder()
data['Category_Encoded'] = encoder.fit_transform(data['Category'])

print(data)

解釋

這段代碼使用LabelEncoder將類別型變量Category轉換為數值型變量。這種編碼方式適用於具有順序性的類別特徵,但對於無順序性的類別特徵,One-Hot編碼可能會更適合。

5.2 數據分箱

數據分箱是將連續數據分割成多個區間,並將每個區間的數據分配給一個新的類別。這種方法在處理連續變量時特別有用。

代碼示例

# 創建樣本數據
data = pd.DataFrame({
    'Age': [23, 45, 34, 25, 42, 51, 60, 72, 30, 22]
})

# 使用pd.cut進行分箱
data['Age_Binned'] = pd.cut(data['Age'], bins=[20, 30, 40, 50, 60, 70, 80], labels=['20s', '30s', '40s', '50s', '60s', '70s'])

print(data)

解釋

在這個例子中,我們使用pd.cut函數將Age列中的數據分箱為不同的年齡段。這種技術能夠將連續數據轉換為離散類別,從而降低數據的複雜性。

5.3 數據歸一化和標準化

數據歸一化和標準化是調整數據尺度的重要技術。歸一化將數據縮放到指定範圍內,而標準化則使數據具有零均值和單位方差。

代碼示例

from sklearn.preprocessing import MinMaxScaler

# 創建樣本數據
data = pd.DataFrame({
    'Income': [50000, 60000, 55000, 48000, 62000]
})

# 使用MinMaxScaler進行歸一化
scaler = MinMaxScaler()
data['Income_Normalized'] = scaler.fit_transform(data[['Income']])

print(data)

解釋

這段代碼使用MinMaxScalerIncome列中的數據歸一化到[0, 1]範圍內。這種歸一化技術在距離度量型模型中(如k-NN)非常有用,因為它可以避免數值較大的特徵主導模型。

6. 特徵縮放技術

特徵縮放是指通過調整特徵的取值範圍來提高模型性能的方法。這些技術包括最小-最大縮放、標準化和魯棒縮放等。

6.1 Min-Max Scaler

Min-Max Scaler是一種將數據按比例縮放到指定區間(通常是[0, 1])的方法。

代碼示例:於5.3部分

解釋

前面已展示如何使用MinMaxScaler進行最小-最大縮放。這種方法對於需要將所有特徵置於同一尺度的算法(如神經網絡)尤為重要。

6.2 Standard Scaler

Standard Scaler是指將數據標準化為均值為0,方差為1的過程。

代碼示例:於2.4部分

解釋

前面也展示了標準化的用法,這在涉及線性回歸和PCA等算法中特別有用。

6.3 Robust Scaler

Robust Scaler是一種基於中位數和四分位距來縮放數據的方法,特別適合於存在異常值的數據集。

代碼示例

from sklearn.preprocessing import RobustScaler

# 創建樣本數據
data = pd.DataFrame({
    'Income': [50000, 60000, 55000, 48000, 62000, 1000000]
})

# 使用RobustScaler進行縮放
scaler = RobustScaler()
data['Income_Robust_Scaled'] = scaler.fit_transform(data[['Income']])

print(data)

解釋

這段代碼展示了RobustScaler的使用,它基於中位數和四分位距進行縮放,使得異常值不會對結果產生過大的影響。這對於含有異常值的數據集來說是一種非常有效的縮放方法。

7. 特徵工程中的常見挑戰

在特徵工程過程中,數據科學家經常面臨一些挑戰,例如:

  1. 過擬合的風險:創建過多或過於複雜的特徵可能導致模型過擬合,從而降低模型在未見數據上的泛化能力。
  2. 特徵相關性與冗餘:選擇高度相關的特徵可能會導致冗餘,從而增加計算負擔並可能影響模型性能。
  3. 特徵選擇與模型性能之間的權衡:在保持模型性能的同時,如何選擇最少的特徵是一項技術性挑戰。

8. 實際應用與案例分析

最後,讓我們來看一個實際案例,演示如何在一個真實的數據集上進行特徵工程。

8.1 數據集介紹

我們將使用一個簡單的房價預測數據集,其中包含房屋的各種特徵(如面積、房齡、房間數量等),以及房屋的最終售價。我們將進行特徵選擇、特徵創建和特徵轉換,並通過這些特徵來預測房屋價格。

8.2 特徵工程流程

代碼示例

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 加載數據集
data = pd.read_csv('house_prices.csv')

# 特徵選擇
selected_features = ['LotArea', 'OverallQual', 'YearBuilt', 'TotalBsmtSF', 'GrLivArea']

# 提取特徵和目標
X = data[selected_features]
y = data['SalePrice']

# 特徵創建:增加年齡特徵
X['HouseAge'] = 2024 - X['YearBuilt']

# 特徵縮放
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 分割訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 訓練模型
model = LinearRegression()
model.fit(X_train, y_train)

# 預測並計算MSE
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)

print("模型的MSE:", mse)

解釋

在這個案例中,我們首先選擇了一些與房價相關的基本特徵,然後創建了一個新特徵HouseAge(房屋年齡),接著對特徵進行了標準化處理。最後,我們訓練了一個線性回歸模型,並在測試集上評估了模型的MSE。

結論

特徵工程在機器學習中扮演著至關重要的角色。通過合理的特徵選擇、創建和轉換,我們能夠顯著提高模型的性能。在本文中,我們探討了特徵工程的基本概念和技術,並通過實際案例展示了如何在真實數據集中應用這些技術。希望這些內容能夠幫助您在未來的機器學習項目中更好地進行特徵工程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值