特征工程是將原始數據轉換為有意義的特征,以供機器學習算法使用并進行準確預測的過程。它涉及選擇、提取和轉換特征,以增強模型的性能。良好的特征工程可以極大地提高模型的準確性,而糟糕的特征工程則可能導致性能不佳。
Fig.1 — Feature Engineering
在本指南中,我們將介紹一系列常用的特征工程技術。我們將從特征選擇和提取開始,這涉及識別數據中最重要的特征。然后,我們將轉向編碼分類變量,這是處理非數字數據時的重要步驟。我們還將涵蓋縮放和歸一化、創建新特征、處理不平衡數據、處理偏斜和峰度、處理稀有類別、處理時間序列數據、特征變換、獨熱編碼、計數和頻率編碼、分箱、分組和文本預處理等內容。
通過本指南,您將全面了解特征工程技術及其如何用于提高機器學習模型的性能。讓我們開始吧!
目錄
1.特征選擇和提取
2.編碼分類變量
3.縮放和歸一化
4.創建新特征
5.處理不平衡數據
6.處理偏斜和峰度
7.處理稀有類別
8.處理時間序列數據
9.文本預處理
特征選擇和提取
特征選擇和提取是機器學習中必不可少的部分,它涉及從數據集中選擇最相關的特征,以提高模型的準確性和效率。在這里,我們將討論一些流行的特征選擇和提取方法,并提供 Python 代碼片段。
** 1.主成分分析(PCA)** :PCA 是一種降維技術,通過找到一個能夠捕獲數據中最大方差的新特征集,從而減少數據集中的特征數量。新特征稱為主成分,它們彼此正交并可用于重構原始數據集。
讓我們看看如何使用 scikit-learn 對數據集執行 PCA:
from sklearn.decomposition import PCA
# create a PCA object
pca = PCA(n_components=2)
# fit and transform the data
X_pca = pca.fit_transform(X)
# calculate the explained variance ratio
print("Explained variance ratio:", pca.explained_variance_ratio_)
在這里,我們創建一個 PCA 對象并指定要提取的主成分數量。然后,我們擬合和轉換數據以獲得新的特征集。最后,我們計算解釋的方差比率以確定每個主成分捕獲了多少數據中的方差。
** 2.線性判別分析(LDA)** :LDA 是一種用于分類問題中的特征提取的監督學習技術。它通過找到一個新的特征集,最大化數據中類別之間的分離程度。
讓我們看看如何使用 scikit-learn 在數據集上執行 LDA:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# create an LDA object
lda = LinearDiscriminantAnalysis(n_components=1)
# fit and transform the data
X_lda = lda.fit_transform(X, y)
在這里,我們創建一個 LDA 對象并指定要提取的主成分數量。然后,我們擬合和轉換數據以獲得新的特征集。
3.相關分析 :相關分析用于識別數據集中特征之間的相關性。高度相關的特征可以從數據集中刪除,因為它們提供了冗余信息。
讓我們看看如何使用 pandas 在數據集上執行相關分析:
import pandas as pd
# calculate the correlation matrix
corr_matrix = df.corr()
# select highly correlated features
high_corr = corr_matrix[abs(corr_matrix) > 0.8]
# drop highly correlated features
df = df.drop(high_corr.columns, axis=1)
在這里,我們使用 pandas 計算相關矩陣并選擇高度相關的特征。然后,我們使用 drop 方法從數據集中刪除高度相關的特征。
Fig.2 — Feature Selection Measures
** 4. 遞歸特征消除(RFE)** :RFE 是一種通過逐步考慮越來越小的特征子集來選擇特征的方法。在每次迭代中,模型使用剩余的特征進行訓練,并對每個特征的重要性進行排名。然后消除最不重要的特征,并重復該過程,直到獲得所需數量的特征為止。
以下是使用 RFE 進行特征選擇的示例:
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
data = load_boston()
X, y = data.data, data.target
model = LinearRegression()
rfe = RFE(model, n_features_to_select=5)
rfe.fit(X, y)
selected_features = data.feature_names[rfe.support_]
print(selected_features)
** 5.基于樹的方法** :決策樹和隨機森林是用于這個目的的流行的基于樹的方法。在這些方法中,基于最重要的特征來預測目標變量創建了一個樹結構。每個特征的重要性是通過基于該特征拆分數據導致的不純度減少來計算的。
在決策樹中,選擇信息增益最高的特征作為根節點,并基于該特征拆分數據。這個過程遞歸重復,直到滿足停止標準,例如最大樹深度或每個葉子節點的最小樣本數。
在隨機森林中,使用特征和數據的隨機子集來建立多個決策樹。每個特征的重要性是通過在所有樹中平均減少不純度來計算的。這有助于降低模型的方差并提高其可推廣性。
from sklearn.ensemble import RandomForestRegressor
# Load the data
X, y = load_data()
# Create a random forest regressor
rf = RandomForestRegressor(n_estimators=100, random_state=42)
# Fit the model
rf.fit(X, y)
# Get feature importances
importances = rf.feature_importances_
# Print feature importances
for feature, importance in zip(X.columns, importances):
print(feature, importance)
基于樹的方法也可以用于特征提取。在這種情況下,我們可以基于樹的決策邊界提取新的特征。例如,我們可以使用決策樹的葉節點作為新的二元特征,指示數據點是否落在特征空間的該區域內。
** 6.包裝方法** :這是一種特征選擇方法,其中模型在不同的特征子集上進行訓練和評估。對于每個特征子集,模型的性能進行測量,并選擇基于模型性能的最佳特征子集。
下面是一個使用遞歸特征消除(RFE)和支持向量機(SVM)分類器在 scikit-learn 中實現包裝方法的示例:
from sklearn.svm import SVC
from sklearn.feature_selection import RFE
from sklearn.datasets import load_iris
# load the iris dataset
data = load_iris()
X = data.data
y = data.target
# create an SVM classifier
svm = SVC(kernel='linear')
# create a feature selector using RFE with SVM
selector = RFE(svm, n_features_to_select=2)
# fit the selector to the data
selector.fit(X, y)
# print the selected features
print(selector.support_)
print(selector.ranking_)
在這個例子中,我們首先加載鳶尾花數據集,并將其分為特征(X)和目標(y)。然后我們使用線性核創建一個 SVM 分類器。然后,我們使用 RFE 和 SVM 創建一個特征選擇器,并將其擬合到數據。最后,我們使用選擇器的 support_ 和 ranking_ 屬性打印所選特征。
** 前向選擇:** 前向選擇是一種包裝方法,它涉及迭代地將一個特征添加到模型中,直到模型的性能停止提高。以下是它在 Python 中的工作方式:
from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.linear_model import LinearRegression
# Load the dataset
X, y = load_dataset()
# Initialize the feature selector
selector = SequentialFeatureSelector(LinearRegression(), n_features_to_select=5, direction='forward')
# Fit the feature selector
selector.fit(X, y)
# Print the selected features
print(selector.support_)
在上面的代碼中,我們首先加載數據集,然后使用線性回歸模型和一個指定要選擇的特征數量的參數 n_features_to_select 來初始化 SequentialFeatureSelector 對象。然后,我們在數據集上擬合選擇器并打印所選特征。
后向消除: 后向消除是一種包裝方法,它涉及迭代地將一個特征從模型中逐步刪除,直到模型的性能停止提高。以下是它在 Python 中的工作方式:
from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.linear_model import LinearRegression
# Load the dataset
X, y = load_dataset()
# Initialize the feature selector
selector = SequentialFeatureSelector(LinearRegression(), n_features_to_select=5, direction='backward')
# Fit the feature selector
selector.fit(X, y)
# Print the selected features
print(selector.support_)
在上面的代碼中,我們使用線性回歸模型和一個參數 direction='backward' 來初始化 SequentialFeatureSelector 對象,以執行后向消除。然后,我們在數據集上擬合選擇器并打印所選特征。
窮盡搜索: 窮盡搜索是一種過濾方法,它涉及評估所有可能的特征子集,并根據評分標準選擇最佳的特征子集。以下是它在 Python 中的工作方式:
from itertools import combinations
from sklearn.metrics import r2_score
from sklearn.linear_model import LinearRegression
# Load the dataset
X, y = load_dataset()
# Initialize variables
best_score = -float('inf')
best_features = None
# Loop over all possible subsets of features
for k in range(1, len(X.columns) + 1):
for subset in combinations(X.columns, k):
# Train a linear regression model
X_subset = X[list(subset)]
model = LinearRegression().fit(X_subset, y)
# Compute the R2 score
score = r2_score(y, model.predict(X_subset))
# Update the best subset of features
if score > best_score:
best_score = score
best_features = subset
# Print the best subset of features
print(best_features)
在上面的代碼中,我們首先加載數據集,然后使用 itertools.combinations 函數循環遍歷所有可能的特征子集。對于每個子集,我們訓練一個線性回歸模型并計算 R2 分數。然后,根據最高的 R2 分數更新最佳特征子集,并打印所選特征。
** 7.嵌入方法** :這些方法涉及在模型訓練過程中選擇特征。例如,Lasso 回歸和 Ridge 回歸會向損失函數添加懲罰項以鼓勵稀疏特征選擇。
Lasso 回歸 : Lasso 回歸也會向損失函數添加懲罰項,但它使用的是模型系數的絕對值而不是平方。這導致了一種更加激進的特征選擇過程,因為一些系數可以被設置為精確的零。Lasso 回歸在處理高維數據時特別有用,因為它可以有效地減少模型使用的特征數量。
from sklearn.linear_model import Lasso
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
data = load_boston()
X = data.data
y = data.target
# Standardize the features
scaler = StandardScaler()
X = scaler.fit_transform(X)
# Fit the Lasso model
lasso = Lasso(alpha=0.1)
lasso.fit(X, y)
# Get the coefficients
coefficients = lasso.coef_
Ridge 回歸:Ridge 回歸向損失函數添加懲罰項,這鼓勵模型選擇一組更重要的特征來預測目標變量。懲罰項與模型系數的大小的平方成正比,因此它傾向于將系數縮小到零,而不是將它們精確地設置為零。
from sklearn.linear_model import Ridge
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
data = load_boston()
X = data.data
y = data.target
# Standardize the features
scaler = StandardScaler()
X = scaler.fit_transform(X)
# Fit the Ridge model
ridge = Ridge(alpha=0.1)
ridge.fit(X, y)
# Get the coefficients
coefficients = ridge.coef_
在這兩種情況下,正則化參數 alpha 控制懲罰項的強度。alpha 值越高,特征選擇越稀疏。
編碼分類變量
編碼分類變量是特征工程中的一個關鍵步驟,它涉及將分類變量轉換為機器學習算法可以理解的數字形式。以下是用于編碼分類變量的一些常見技術:
1.獨熱編碼:
獨熱編碼是一種將分類變量轉換為一組二進制特征的技術,其中每個特征對應于原始變量中的一個唯一類別。在這種技術中,為每個類別創建一個新的二進制列,如果存在該類別,則將值設置為1,否則設置為0。
以下是使用 pandas 庫的示例:
import pandas as pd
# create a sample dataframe
df = pd.DataFrame({
'color': ['red', 'blue', 'green', 'red', 'yellow', 'blue']
})
# apply one-hot encoding
one_hot_encoded = pd.get_dummies(df['color'])
print(one_hot_encoded)
2.標簽編碼:
標簽編碼是一種將原始變量中的每個類別分配一個唯一數字值的技術。在這種技術中,每個類別被賦予一個數字標簽,其中標簽的分配基于變量中類別的順序。
以下是使用 scikit-learn 庫的示例:
from sklearn.preprocessing import LabelEncoder
# create a sample dataframe
df = pd.DataFrame({
'color': ['red', 'blue', 'green', 'red', 'yellow', 'blue']
})
# apply label encoding
label_encoder = LabelEncoder()
df['color_encoded'] = label_encoder.fit_transform(df['color'])
print(df)
Fig.3 — Encoding Data
3.序數編碼:
序數編碼是一種根據類別的順序或排名為原始變量中的每個類別分配一個數字值的技術。在這種技術中,類別根據特定標準排序,然后根據它們在排序中的位置分配數字值。
以下是使用 category_encoders 庫的示例:
import category_encoders as ce
# create a sample dataframe
df = pd.DataFrame({
'size': ['S', 'M', 'L', 'XL', 'M', 'S']
})
# apply ordinal encoding
ordinal_encoder = ce.OrdinalEncoder(cols=['size'], order=['S', 'M', 'L', 'XL'])
df = ordinal_encoder.fit_transform(df)
print(df)
-
編碼
+關注
關注
6文章
957瀏覽量
54950 -
機器學習
+關注
關注
66文章
8438瀏覽量
133080 -
預處理
+關注
關注
0文章
33瀏覽量
10514
發布評論請先 登錄
相關推薦
評論