自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

八種數值變量的特征工程技術:利用Sklearn、Numpy和Python將數值轉化為預測模型的有效特征

人工智能 機器學習
特征工程是機器學習流程中的關鍵步驟,在此過程中,原始數據被轉換為更具意義的特征,以增強模型對數據關系的理解能力。

特征工程是機器學習流程中的關鍵步驟,在此過程中,原始數據被轉換為更具意義的特征,以增強模型對數據關系的理解能力。

特征工程通常涉及對現有數據應用轉換,以生成或修改數據,這些轉換后的數據在機器學習和數據科學的語境下用于訓練模型,從而提高模型性能。

本文主要介紹處理數值變量特征工程,將探討使用Python的Scikit-Learn庫、Numpy等工具處理數值的高級特征工程技術,旨在提升機器學習模型的效能。

圖片

特征優(yōu)化是提升機器學習模型質量的核心要素,尤其在分析復雜數據集時。有針對性地應用特征工程技術可帶來以下優(yōu)勢:

  1. 揭示數據中的潛在模式:此技術能夠發(fā)現初步觀察中不易察覺的隱藏關系和結構。
  2. 優(yōu)化變量表示:此過程將原始數據轉換為更適合機器學習的格式。
  3. 應對數據分布和內在特性相關的挑戰(zhàn):此方法解決了諸如偏度、異常值和變量可擴展性等問題。

精確實施這些特征優(yōu)化技術可顯著提升機器學習模型的性能。

這些改進體現在模型性能的多個方面,從預測能力到可解釋性。高質量特征使模型能夠捕捉到數據中可能被忽視的細微差別和復雜模式。

特征優(yōu)化還有助于增強模型的穩(wěn)健性和泛化能力,這對于實際應用至關重要,同時降低了過擬合的風險。

接下來,我們將介紹一些實用的特征工程技術。

1、歸一化

歸一化(也稱為縮放)可能是數據科學家學習的第一個數值特征工程技術。這種方法通過減去平均值并除以標準差來調整變量。

執(zhí)行此轉換后,結果變量將具有0均值和1的標準差及方差。

在機器學習中,特別是深度學習領域,將變量限制在特定范圍內(如僅在0和1之間)有助于模型更快地收斂到最優(yōu)解。這是一種學習型轉換 - 我們使用訓練數據來推導正確的均值和標準差值,然后在應用于新數據時使用這些值進行轉換。

需要注意的是,這種轉換不會改變分布,而是重新縮放了值。

我們將使用Sklearn的葡萄酒數據集進行分類任務。我們將比較使用和不使用混淆矩陣歸一化的性能,使用Sklearn實現。

import matplotlib.pyplot as plt  
 import seaborn as sns  
 from sklearn.datasets import load_wine  
 from sklearn.model_selection import train_test_split  
 from sklearn.preprocessing import StandardScaler  
 from sklearn.neighbors import KNeighborsClassifier  
 from sklearn.metrics import confusion_matrix  
 import numpy as np  
   
 X, y = load_wine(return_X_y=True)  
   
 # 將數據劃分為訓練集和測試集  
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=42)  
   
 # 定義訓練模型并獲取混淆矩陣的函數  
 def get_confusion_matrix(X_train, X_test, y_train, y_test):  
     model = KNeighborsClassifier(n_neighbors=5)  
     model.fit(X_train, y_train)  
     y_pred = model.predict(X_test)  
     return confusion_matrix(y_test, y_pred)  
   
 # 獲取未歸一化的混淆矩陣  
 cm_without_norm = get_confusion_matrix(X_train, X_test, y_train, y_test)  
   
 # 歸一化數據  
 scaler = StandardScaler()  
 X_train_scaled = scaler.fit_transform(X_train)  
 X_test_scaled = scaler.transform(X_test)  
   
 # 獲取歸一化后的混淆矩陣  
 cm_with_norm = get_confusion_matrix(X_train_scaled, X_test_scaled, y_train, y_test)  
   
 # 創(chuàng)建兩個并列的子圖  
 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 8))  
   
 # 定義繪制熱圖的函數  
 def plot_heatmap(ax, cm, title):  
     sns.heatmap(cm, annot=True, fmt='d', cmap='viridis', ax=ax, cbar=False)  
     ax.set_title(title, fontsize=16, pad=20)  
     ax.set_xlabel(''Predicted', fontsize=12, labelpad=10)  
     ax.set_ylabel('Actual', fontsize=12, labelpad=10)  
   
 # 繪制熱圖  
 plot_heatmap(ax1, cm_without_norm, 'Confusion Matrix\nWithout Normalization')  
 plot_heatmap(ax2, cm_with_norm, 'Confusion Matrix\nWith Normalization')  
   
 # 添加共用的顏色條  
 cbar_ax = fig.add_axes([0.92, 0.15, 0.02, 0.7])  
 sm = plt.cm.ScalarMappable(cmap='viridis', norm=plt.Normalize(vmin=0, vmax=np.max([cm_without_norm, cm_with_norm])))  
 fig.colorbar(sm, cax=cbar_ax)  
   
 # 調整布局并顯示圖表  
 plt.tight_layout(rect=[0, 0, 0.9, 1])  
 plt.show()

圖片

性能提升約為30% - 對某些算法而言,歸一化的影響如此顯著,以至于不正確地應用它可能導致數據科學家犯嚴重錯誤。

歸一化還有一些變體。在Sklearn中,這些變體被稱為RobustScalerMinMaxScaler

Sklearn示例中提供了一個更復雜的圖表,展示了歸一化和未歸一化的KNNClassifier模型的分類邊界對比

圖片

2、多項式特征

多項式特征是一種在線性模型中引入非線性的有效方法。Scikit-Learn的PolynomialFeatures類能夠生成多項式特征和變量間的交互項。

常見的多項式特征包括:

  • x 2 (平方項)
  • x 3 (立方項)
  • x ? (四次方項)
  • 更高次項

對于具有多個特征的模型(x_1, x_2, …, x_n),還可以創(chuàng)建交互項:

  • _x__ 1 × _x__ 2 (一階交互項)
  • _x__ 12 × _x__ 2 (二階交互項)
  • _x__ 1 × _x__ 22 (二階交互項)
  • 更高階交互項

多項式特征的主要目標是使線性模型能夠學習數據中的非線性關系,而無需改變底層算法。

圖片

多項式特征的主要優(yōu)勢在于顯著增加了模型的靈活性,使線性模型能夠捕捉數據中的非線性關系。具體表現為:

  • 能夠在特征空間中建模復雜的曲線和曲面
  • 對本質上非線性的數據可能產生積極的性能貢獻
  • 模型在捕捉非線性關系的同時保持線性的基礎結構。這允許使用熟悉的分析工具,并且比復雜的非線性模型更容易解釋系數,盡管這種簡單性隨著多項式次數的增加而降低。

另一個關鍵優(yōu)勢是能夠揭示變量之間隱藏的交互。在物理學或經濟學等領域,關系通常是非線性的,這個特性尤為有價值。

但是多項式特征也存在一些缺點:

  1. 它迅速增加了數據集的維度,為每個輸入特征創(chuàng)建額外的列
  2. 過度使用可能導致過擬合
  3. 由于需要處理更多的特征,計算資源需求增加

從實際角度來看,多項式特征的實現相對簡單,這要歸功于Python中的Sklearn庫。下面我們將展示如何實現它。

PolynomialFeatures是Scikit-learn中用于生成多項式特征的類,位于sklearn.preprocessing模塊中。

該類將一維輸入數組轉換為包含所有多項式項(直至指定次數)的新數組。例如,如果原始特征是[a, b],次數為2,則結果特征將是[1, a, b, a2, ab, b2]。

該類的主要參數如下:

  • degree (int, 默認=2):多項式的次數。  確定生成的多項式項的最高次數。
  • interaction_only (bool, 默認=False):如果為True,則僅生成交互項。不產生單個特征的冪。
  • include_bias (bool, 默認=True):如果為True,包括一列1(偏置項)。在使用沒有單獨截距項的模型時有用。
  • order (C或F, 默認=C):確定特征的輸出順序。C表示C風格順序(最后的特征變化最快),'F'表示Fortran風格順序。

以下是在Sklearn中實現該類的示例:

from sklearn.preprocessing import PolynomialFeatures  
 import numpy as np  
   
 X = np.array([[1, 2], [3, 4]])  
 poly = PolynomialFeatures(degree=2, include_bias=False)  
 X_poly = poly.fit_transform(X)  
   
 print(X_poly)  
 # 輸出: [[1. 2. 1. 2. 4.]  
 #       [3. 4. 9. 12. 16.]]  
   
 print(poly.get_feature_names(['x1', 'x2']))  
 # 輸出: ['x1', 'x2', 'x1^2', 'x1 x2', 'x2^2']

這些生成的特征可以為機器學習模型提供額外的信息,潛在地提高其性能。

3、FunctionTransformer

FunctionTransformer是Scikit-learn中的一個多功能工具,允許將自定義函數集成到數據轉換過程中。它能夠將任意函數應用于數據,作為預處理或特征工程管道的一部分。它將Python函數轉換為與Scikit-learn API兼容的"轉換器"對象(這里的Transformer不同于深度學習模型,而是指Sklearn中的轉換器概念)。

FunctionTransformer以Python函數為主要輸入,創(chuàng)建一個轉換器對象。當應用于數據時,這個對象執(zhí)行指定的函數。它可以與其他轉換器結合使用,或在Scikit-learn管道中使用。

一個具體的應用例子是將該對象應用于時間序列以提取三角函數特征。

import matplotlib.pyplot as plt  
   
 fig, ax = plt.subplots(figsize=(12, 4))  
 average_week_demand = df.groupby(["weekday", "hour"])["count"].mean()  
 average_week_demand.plot(ax=ax)  
 _ = ax.set(  
     title="Average hourly bike demand during the week",  
     xticks=[i * 24 for i in range(7)],  
     xticklabels=["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],  
     xlabel="Time of the week"
 )

圖片

FunctionTransformer的典型應用包括:

  • 創(chuàng)建復雜或領域特定的特征
  • 對數據應用非標準數學運算
  • 將現有的預處理邏輯集成到Scikit-learn管道中

FunctionTransformer充當了自定義Python函數和Scikit-learn函數之間的橋梁,為數據預處理和特征工程提供了靈活性。

以下代碼展示了如何應用函數來創(chuàng)建上述時間序列的三角函數轉換:

import numpy as np  
 import pandas as pd  
   
 from sklearn.preprocessing import FunctionTransformer  
   
 import matplotlib.pyplot as plt  
 
 def sin_transformer(period):  
     return FunctionTransformer(lambda x: np.sin(x / period * 2 * np.pi))  
 
 def cos_transformer(period):  
     return FunctionTransformer(lambda x: np.cos(x / period * 2 * np.pi))  
   
 hour_df = pd.DataFrame(  
     np.arange(26).reshape(-1, 1),  
     columns=["hour"],  
 )  
 hour_df["hour_sin"] = sin_transformer(24).fit_transform(hour_df)["hour"]  
 hour_df["hour_cos"] = cos_transformer(24).fit_transform(hour_df)["hour"]  
 hour_df.plot(x="hour")  
 _ = plt.title("Trigonometric encoding of the 'hour' feature")

圖片

FunctionTransformer在時間序列分析中有廣泛的應用。

4、KBinsDiscretizer

KBinsDiscretizer是Scikit-learn中的一個預處理類,設計用于將連續(xù)特征轉換為離散分類特征。這個過程被稱為離散化、量化或分箱。某些具有連續(xù)特征的數據集可能會從離散化中受益,因為它可以將具有連續(xù)屬性的數據集轉換為僅具有名義屬性的數據集。

其主要目標是將連續(xù)變量的范圍劃分為特定數量的區(qū)間(或箱)。每個原始值都被替換為它所屬的箱的標簽。

該算法的工作原理如下:

  1. 分析連續(xù)特征的分布
  2. 基于這個分布創(chuàng)建預定義數量的箱
  3. 將每個原始值分配到適當的箱中
  4. 用箱標簽或箱的獨熱編碼替換原始值

關鍵參數:

n_bins:要創(chuàng)建的箱數。可以是整數或整數數組,用于每個特征的不同箱數。

encode:編碼箱的方法(onehot、ordinal或onehot-dense)。

  • onehot:使用獨熱編碼對轉換后的結果進行編碼,并返回稀疏矩陣。被忽略的特征總是堆疊在右側。
  • onehot-dense:使用獨熱編碼對轉換后的結果進行編碼,并返回"密集"數組(即非稀疏格式)。
  • ordinal:返回編碼為整數值的箱。

strategy:定義箱邊界的策略(uniform、quantile或kmeans)。

  • uniform:創(chuàng)建等寬的箱。
  • quantile:為每個特征創(chuàng)建包含相同數量點的箱。
  • kmeans:使用k-means聚類定義箱。

需要考慮的因素:

  • 箱數和策略的選擇會顯著影響結果。
  • 可能導致信息損失,尤其是在箱數很少的情況下(類似于使用很少的組繪制直方圖時)。
  • 對于對非正態(tài)分布或非線性關系敏感的算法特別有用。

我們將通過觀察線性回歸和決策樹在學習連續(xù)模式與離散化模式時的性能來展示應用。創(chuàng)建一個隨機但半線性數字的模擬數據集,將模型應用于連續(xù)數據,然后將相同的數據集應用于離散化特征。

import matplotlib.pyplot as plt  
 import numpy as np  
 from sklearn.linear_model import LinearRegression  
 from sklearn.preprocessing import KBinsDiscretizer  
 from sklearn.tree import DecisionTreeRegressor  
   
 # 設置隨機數生成器以確??芍貜托? 
 rnd = np.random.RandomState(42)  
   
 # 創(chuàng)建數據集  
 X = rnd.uniform(-3, 3, size=100)  # 在-3和3之間的100個點  
 y = np.sin(X) + rnd.normal(size=len(X)) / 3  # 正弦函數加噪聲  
 X = X.reshape(-1, 1)  # 重塑為sklearn所需的正確格式  
   
 # 應用KBinsDiscretizer  
 discretizer = KBinsDiscretizer(n_bins=10, encode="onehot")  
 X_binned = discretizer.fit_transform(X)  
   
 # 準備可視化  
 fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True, figsize=(12, 5))  
 line = np.linspace(-3, 3, 1000).reshape(-1, 1)  # 用于繪圖的點  
   
 # 訓練和繪制模型的函數  
 def train_and_plot(X_train, X_plot, ax, title):  
     # 線性回歸  
     linear_reg = LinearRegression().fit(X_train, y)  
     ax.plot(line, linear_reg.predict(X_plot), linewidth=2, color="green", label="Linear Regression")  
       
     # 決策樹  
     tree_reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X_train, y)  
     ax.plot(line, tree_reg.predict(X_plot), linewidth=2, color="red", label="Decision Tree")  
       
     # 原始數據  
     ax.plot(X[:, 0], y, "o", c="k", alpha=0.5)  
     ax.legend(loc="best")  
     ax.set_xlabel("Input Feature")  
     ax.set_title(title)  
   
 # 繪制原始數據的圖  
 train_and_plot(X, line, ax1, "Results Before Discretization")  
 ax1.set_ylabel("Regression Output")  
   
 # 繪制離散化數據的圖  
 line_binned = discretizer.transform(line)  
 train_and_plot(X_binned, line_binned, ax2, "Results After Discretization")  
   
 plt.tight_layout()  
 plt.show()

圖片

線性回歸在離散化后顯著改善,更好地捕捉了非線性。決策樹顯示的變化較小,因為它本身就能處理非線性。這個例子說明了離散化如何幫助線性模型捕捉非線性關系,在某些情況下可能會提高性能。

5、對數變換

對數變換的主要優(yōu)勢在于其壓縮值范圍的能力,這對于具有高可變性或異常值的數據特別有用。

  • 范圍壓縮:對數變換減少了最大值之間的距離,同時保持較小值相對不變。有助于規(guī)范化偏斜分布,使右尾分布更對稱,更接近正態(tài)分布。
  • 線性化:它可以將非線性關系線性化。它將指數關系轉換為線性關系,簡化了分析并提高了假設變量之間線性關系的模型的性能。
  • 處理異常值:該變換有效地管理極端數據,允許處理異常值而無需刪除,從而保留潛在的重要信息。
  • 數學定義:最常見的對數變換使用自然對數(以e為底),定義為 y =ln(x),其中 x 是原始值,y 是變換后的值。請注意,這種變換僅對正值的 x 定義,如果存在零或負值,可能需要添加常數。
  • 特征縮放:它可以用作特征縮放技術,補充或替代標準化或最小-最大規(guī)范化等方法??梢蕴岣呔€性回歸等模型的性能,這些模型受益于具有更對稱分布的特征。

在機器學習中,當想要規(guī)范化一個不是自然分布的分布時,通常會使用對數變換。

例如,一個眾所周知的不正態(tài)分布的變量是年收入 —— 你經常想要對這個變量建模以提供價值預測,但使用這種分布工作并不方便,特別是如果你使用不能正確建模非線性數據的算法。

通過對數變換,使用numpy,可以趨向正態(tài)分布,使變量更容易預測。

import numpy as np  
 import pandas as pd  
 import matplotlib.pyplot as plt  
   
 # 創(chuàng)建一個具有正偏度值的示例數據集  
 np.random.seed(42)  
 data = {  
     'Income': np.random.exponential(scale=50000, size=1000)  # 指數分布以模擬偏度  
 }  
 df = pd.DataFrame(data)  
   
 # 創(chuàng)建一個具有兩個并排子圖的圖形  
 fig, axes = plt.subplots(1, 2, figsize=(15, 5))  
   
 # 原始分布的圖  
 axes[0].hist(df['Income'], bins=50, color='blue', alpha=0.7)  
 axes[0].set_title('Original Income Distribution')  
 axes[0].set_xlabel('Income')  
 axes[0].set_ylabel('Frequency')  
   
 # 應用對數變換  
 df['Log_Income'] = np.log1p(df['Income'])  # log1p相當于log(x + 1)  
   
 # 變換后分布的圖  
 axes[1].hist(df['Log_Income'], bins=50, color='green', alpha=0.7)  
 axes[1].set_title('Log-transformed Income Distribution')  
 axes[1].set_xlabel('Log_Income')  
 axes[1].set_ylabel('Frequency')  
   
 # 顯示圖形  
 plt.tight_layout()  
 plt.show()

圖片

6、PowerTransformer

PowerTransformer是Sklearn preprocessing模塊中的一個類,包含用于使數據更接近高斯分布的邏輯。這對于建模與異方差(即非恒定方差)相關的問題或其他需要正態(tài)性的情況很有用。

PowerTransformer支持Box-Cox和Yeo-Johnson變換。使用最大似然(對數似然)估計最優(yōu)參數以穩(wěn)定方差并最小化偏度。

Box-Cox要求輸入數據嚴格為正,而Yeo-Johnson支持正負數據。

在機器學習的背景下,這些變換解決了幾個常見挑戰(zhàn):

  • 數據規(guī)范化: 許多機器學習算法,如線性回歸、神經網絡和一些聚類方法,假設數據遵循正態(tài)分布。PowerTransformer可以將偏斜或重尾分布轉換為更接近高斯分布的形狀,這可以提高這些模型的性能。
  • 方差穩(wěn)定化: 在真實數據集中,特征的方差通常隨其幅度變化,這種現象稱為異方差。這可能會影響許多算法的有效性。PowerTransformer有助于穩(wěn)定方差,使其在特征值的不同范圍內更加一致。
  • 關系線性化: 一些算法,如線性回歸,假設變量之間存在線性關系。PowerTransformer可以將非線性關系線性化,擴大這些模型在更復雜數據集上的適用性。

Box-Cox變換

Box-Cox變換是一系列冪變換,可以穩(wěn)定方差并使數據更接近正態(tài)分布。它在數學上定義為:

  • y(λ) = (y λ — 1) / λ 如果 y ≠ 0
  • y(λ) = log(y) 如果 y = 0

其中:

  • x 是原始值,
  • y 是變換后的值,
  • λ 是變換參數

Box-Cox變換應用于正數據,并要求從數據中估計參數λ,以找到使數據正態(tài)化的最佳變換。

PowerTransformer的行為類似于Sklearn估計器,支持.fit().transform()方法。

Yeo-Johnson變換基于Box-Cox變換,但允許負值。本文不會詳細介紹Yeo-Johnson變換。

如前所述,Yeo-Johnson變換基于Box-Cox變換,但lambda可以取的值可能會改變。這使得這些變換本質上不同,因為它們可能給出不同的結果。

在Python中,只需將其中一種變換方法作為字符串傳遞給PowerTransformer對象

import numpy as np  
 import matplotlib.pyplot as plt  
 from sklearn.preprocessing import PowerTransformer  
   
 # 生成包含正值和負值的數據  
 np.random.seed(42)  
 data_positive = np.random.exponential(scale=2, size=1000)  # 正值  
 data_negative = -np.random.exponential(scale=0.5, size=200)  # 負值  
 data = np.concatenate([data_positive, data_negative])  # 合并正值和負值數據  
   
 # 創(chuàng)建兩個PowerTransformer實例:一個用于Yeo-Johnson,一個用于Box-Cox進行比較  
 pt_yj = PowerTransformer(method='yeo-johnson', standardize=False)  # Yeo-Johnson變換  
 pt_bc = PowerTransformer(method='box-cox', standardize=False)  # Box-Cox變換  
   
 # 應用變換  
 data_yj = pt_yj.fit_transform(data.reshape(-1, 1))  # 應用Yeo-Johnson變換  
   
 # Box-Cox需要正數據,所以我們添加一個偏移量使所有值為正  
 data_offset = data - np.min(data) + 1e-6  # 偏移量以確保所有值為正  
 data_bc = pt_bc.fit_transform(data_offset.reshape(-1, 1))  # 應用Box-Cox變換  
   
 # 可視化結果  
 fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(18, 5))  
   
 # 原始數據的直方圖  
 ax1.hist(data, bins=50, edgecolor='black')  
 ax1.set_title("Original Data")  
 ax1.set_xlabel("Value")  
 ax1.set_ylabel("Frequency")  
   
 # Yeo-Johnson變換后數據的直方圖  
 ax2.histax2.hist(data_yj, bins=50, edgecolor='black')  
 ax2.set_title("Yeo-Johnson")  
 ax2.set_xlabel("Value")  
   
 # Box-Cox變換后數據的直方圖  
 ax3.hist(data_bc, bins=50, edgecolor='black')  
 ax3.set_title("Box-Cox")  
 ax3.set_xlabel("Value")  
   
 plt.tight_layout()  
 plt.show()

圖片

7、QuantileTransformer

分位數變換將一個變量的分布映射到另一個目標分布。使用Sklearn的QuantileTransformer類,可以將非正態(tài)分布轉換為所需的分布。

考慮任何事件分布 —— 這個分布中的每個事件都會有一個與之相關的發(fā)生概率。這種行為由累積分布函數(CDF)定義,每種分布的CDF都不同。

分位數函數是CDF的逆:而CDF是一個返回值等于或小于給定值的概率的函數,PPF(百分位點函數)是這個函數的逆,返回等于或小于給定概率的值。

異常值檢測的背景下,QuantileTransformer可用于轉換數據以使其更加可見。通過將數據轉換為均勻分布,異常值將被映射到分布的極端,使它們與內部點更容易區(qū)分。

QuantileTransformer可以將任意分布強制轉換為高斯分布,前提是有足夠的訓練樣本(數千個)。由于它是一種非參數方法,比參數方法(Box-Cox和Yeo-Johnson)更難解釋。

Sklearn再次為我們提供了專用的QuantileTransformer對象,其中一個重要參數是output_distribution,它可以接受"uniform"或"normal"值。這些代表數據被映射到的分布。

import numpy as np  
 from sklearn.preprocessing import QuantileTransformer  
 import matplotlib.pyplot as plt  
   
 # 創(chuàng)建一個具有偏斜分布的樣本數據集  
 np.random.seed(0)  
 data = np.random.exponential(scale=2, size=(1000, 1))  # 指數分布  
   
 # 初始化QuantileTransformer  
 quantile_transformer = QuantileTransformer(n_quantiles=100, output_distribution='normal')  
   
 # 應用變換  
 data_transformed = quantile_transformer.fit_transform(data)  
   
 # 可視化原始和變換后的數據  
 plt.figure(figsize=(12, 6))  
   
 # 原始數據的直方圖  
 plt.subplot(1, 2, 1)  
 plt.hist(data, bins=50, color='blue', edgecolor='black')  
 plt.title("Original Data (Exponential)")  
   
 # 變換后數據的直方圖  
 plt.subplot(1, 2, 2)  
 plt.hist(data_transformed, bins=50, color='green', edgecolor='black')  
 plt.title("Transformed Data (Normal)")  
   
 plt.show()

圖片

變換示例:從特定分布到正態(tài)分布

下面是一個圖形可視化,比較了不同的非正態(tài)分布及其相對變換,通過我們探討的一些技術。

我使用Sklearn文檔中的圖像作為參考,修改了圖表的排序以便于閱讀。

圖片

這張圖突出顯示了某些變換的局限性,但是它們并不總是成功。例如對于雙峰分布,除了分位數變換外,所有嘗試轉換為正態(tài)曲線的努力都失敗了。

8、主成分分析 PCA

主成分分析(PCA)將一組可能相關的變量轉換為一組線性不相關的變量,稱為主成分。這些主成分按順序排列,使得前幾個包含原始變量中存在的大部分方差。

在特征工程的背景下,PCA可以用于減少特征數量,同時保留大部分信息。這可能會減少數據中的噪聲和可能混淆模型的低級相關性。

作為一種降維技術,PCA應該用于壓縮數據集而不是擴展它。PCA可以提取一些潛在特征,這些特征是影響您的數據的隱藏或潛在因素。例如有一個圖像數據集,可以使用PCA來找到代表圖像中對象的形狀、顏色或紋理的特征。這些潛在特征可以幫助您更好地理解數據并改進機器學習模型。

PCA不僅可以應用在表格類數據,它還可以作為特征工程應用是在處理圖像中。

讓我們取Sklearn lfw_people數據集中存在的隨機人臉,可以使用TruncatedSVD(一種與PCA非常相似的壓縮技術)來提取關鍵圖像特征,如邊緣、陰影和主要對象的位置,為機器學習模型提供相關信息進行建模。

這種方法的一個典型應用是規(guī)范化圖像,使系統(tǒng)對光照或其他條件的變化更加穩(wěn)健 —— 這使得減少的人臉成為最終面部識別的基礎。

從Sklearn的開放LFW數據集中隨機選取的圖像。

創(chuàng)建此可視化的Python代碼:

import numpy as np  
 import matplotlib.pyplot as plt  
 from sklearn.datasets import fetch_lfw_people  
 from sklearn.decomposition import TruncatedSVD  
   
 # 加載Labeled Faces in the Wild數據集  
 lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)  
 X = lfw_people.data  
 n_samples, h, w = lfw_people.images.shape  
   
 print(f"數據集維度:{X.shape}")  
   
 # 用于降維的組件數  
 n_components = 50  
   
 # 應用TruncatedSVD  
 svd = TruncatedSVD(n_components=n_components, random_state=42)  
 X_transformed = svd.fit_transform(X)  
   
 # 重構圖像的函數  
 def reconstruct_image(svd, X_transformed):  
     return np.dot(X_transformed, svd.components_)  
   
 # 重構所有圖像  
 X_reconstructed = reconstruct_image(svd, X_transformed)  
   
 # 顯示原始和降維人臉的函數  
 def plot_transposed_original_and_reduced(X_original, X_reduced, n_faces=5):  
     fig, axes = plt.subplots(2, n_faces, figsize=(3*n_faces, 6))  
     random_indices = np.random.choice(X_original.shape[0], n_faces, replace=False)  
       
     for i, idx in enumerate(random_indices):  
         # 原始人臉  
         axes[0, i].imshow(X_original[idx].reshape(h, w), cmap='gray')  
         axes[0, i].set_title(f'Face {i+1}\nOriginal')  
         axes[0, i].axis('off')  
           
         # 降維人臉  
         axes[1, i].imshow(X_reduced[idx].reshape(h, w), cmap='gray')  
         axes[1, i].set_title(f'Reduced\n({n_components} comp.)')  
         axes[1, i].axis('off')  
       
     plt.tight_layout()  
     plt.show()  
   
 # 顯示原始和降維人臉  
 plot_transposed_original_and_reduced(X, X_reconstructed)  
   
 # 計算并打印平均重構誤差  
 mse = np.mean((X - X_reconstructed) ** 2)  
 print(f"\n平均重構誤差 (MSE):{mse:.4f}")  
   
 # 打印累積解釋方差  
 explained_variance_ratio = svd.explained_variance_ratio_  
 cumulative_variance_ratio = np.cumsum(explained_variance_ratio)  
 print(f"\n{n_components} 個組件的累積解釋方差:{cumulative_variance_ratio[-1]:.4f}")  
   
 # 顯示前幾個組件  
 n_components_show = min(10, n_components)  
 components = svd.components_[:n_components_show].reshape((n_components_show, h, w))  
 fig, axes = plt.subplots(2, 5, figsize=(15, 6))  
 for i, ax in enumerate(axes.flat):  
     if i < n_components_show:  
         ax.imshow(components[i], cmap='gray')  
         ax.set_title(f'Component {i+1}')  
     ax.axis('off')  
 plt.tight_layout()  
 plt.show()

結論

本文探討了幾種用于數值數據的高級特征工程技術,強調了它們在提高機器學習模型性能方面的關鍵作用。討論的方法包括:

  • 歸一化
  • 多項式特征
  • FunctionTransformer
  • KBinsDiscretizer
  • 對數變換
  • PowerTransformer (Box-Cox和Yeo-Johnson)
  • QuantileTransformer
  • PCA

每種技術都提供了特定的優(yōu)勢,適用于特定類型的數據和問題。最合適的變換選擇取決于數據的性質、要解決的問題以及選擇的模型。沒有一種通用的解決方案,這使得實驗和驗證變得至關重要。

責任編輯:華軒 來源: DeepHub IMBA
相關推薦

2024-09-03 11:37:48

2018-07-23 15:35:17

機器學習特征工程技能數據科學

2018-05-31 21:57:13

2022-12-12 16:15:19

圖像數據Python

2013-05-10 09:31:18

大數據人工特征工程線性模型

2011-03-23 18:14:13

業(yè)務分析優(yōu)化洞察力

2023-02-26 18:46:35

機器學習數據集算法

2023-11-23 08:58:45

PythonNumPy

2018-05-05 14:53:11

大數據價值項目

2024-05-21 13:33:49

2021-08-03 09:55:37

Python函數編程語言

2021-07-07 10:59:48

python代碼編程語言

2022-12-07 12:33:22

云計算

2024-12-26 08:34:32

2024-10-28 00:00:10

機器學習模型程度

2010-09-08 20:20:39

2013-05-24 10:22:07

Python默認參數值

2024-04-25 12:55:40

2021-04-01 22:19:54

機器學習模型數據

2020-12-30 06:19:15

編碼分類特征數字特征
點贊
收藏

51CTO技術棧公眾號