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

終于把機(jī)器學(xué)習(xí)中的特征選擇搞懂了!??!

人工智能 機(jī)器學(xué)習(xí)
特征選擇是機(jī)器學(xué)習(xí)中的重要步驟,其目的是從高維特征空間中選擇對模型性能最有價值的特征。通過減少冗余和無關(guān)的特征,特征選擇可以提高模型的訓(xùn)練效率、減少過擬合并提升模型的泛化性能。

今天給大家分享機(jī)器學(xué)習(xí)中的一個關(guān)鍵概念:特征選擇。

特征選擇是機(jī)器學(xué)習(xí)中的重要步驟,其目的是從高維特征空間中選擇對模型性能最有價值的特征。

通過減少冗余和無關(guān)的特征,特征選擇可以提高模型的訓(xùn)練效率、減少過擬合并提升模型的泛化性能。

特征選擇的重要性

  1. 提高模型性能:通過去除冗余或無關(guān)的特征,可以減少噪聲,提高模型的準(zhǔn)確性和穩(wěn)定性。
  2. 減少計算成本:較少的特征意味著更低的計算復(fù)雜度,加快訓(xùn)練和預(yù)測速度。
  3. 防止過擬合:去除不相關(guān)特征有助于減少模型的復(fù)雜度,降低過擬合風(fēng)險。
  4. 提高模型可解釋性:更少的特征使得模型更容易理解和解釋,有助于發(fā)現(xiàn)數(shù)據(jù)中的關(guān)鍵因素。

特征選擇的方法

特征選擇通常分為三種主要方法:

  • 過濾法
  • 包裹法
  • 嵌入法

過濾法

過濾法基于統(tǒng)計指標(biāo)對特征進(jìn)行評分,并根據(jù)評分選擇特征。

這類方法與具體的機(jī)器學(xué)習(xí)算法無關(guān),通常作為預(yù)處理步驟。

常見技術(shù)

  • 相關(guān)系數(shù),衡量每個特征與目標(biāo)變量之間的線性相關(guān)性。例如,皮爾遜相關(guān)系數(shù)。
  • 卡方檢驗,適用于分類問題,評估特征與目標(biāo)變量的獨立性。
  • 信息增益,基于信息理論,衡量特征提供的信息量。
  • 互信息,衡量特征與目標(biāo)變量之間的非線性依賴關(guān)系。
  • 方差選擇法,去除方差低于某一閾值的特征,認(rèn)為這些特征變化較小,信息量不足。

優(yōu)缺點

  • 優(yōu)點:計算速度快,適用于高維數(shù)據(jù)。
  • 缺點:忽略特征之間的相關(guān)性,可能無法捕捉到特征與目標(biāo)變量之間的復(fù)雜關(guān)系。

包裝法

包裝法將特征選擇視為一個搜索問題,通過訓(xùn)練模型評估特征子集的性能,選擇最優(yōu)子集。這類方法與具體的機(jī)器學(xué)習(xí)算法緊密相關(guān)。

常見技術(shù)

  • 遞歸特征消除
    遞歸地訓(xùn)練模型,移除最不重要的特征,直到達(dá)到預(yù)定的特征數(shù)量。
  • 前向選擇
    從空特征集開始,逐步添加對模型性能提升最大的特征。
  • 后向消除
    從所有特征開始,逐步移除對模型性能影響最小的特征。

優(yōu)缺點

  • 優(yōu)點:能夠考慮特征之間的相互作用,通常能獲得更好的模型性能。
  • 缺點:計算成本高,尤其在高維數(shù)據(jù)中,可能不適用。

嵌入法

嵌入法在模型訓(xùn)練過程中進(jìn)行特征選擇,將特征選擇嵌入到模型的訓(xùn)練過程中。

這類方法結(jié)合了過濾法和包裝法的優(yōu)點。

常見技術(shù)

  • Lasso回歸:通過 L1 正則化,將不重要的特征系數(shù)壓縮為零,實現(xiàn)特征選擇。
  • 決策樹及其集成方法:例如,隨機(jī)森林和梯度提升樹可以基于特征重要性進(jìn)行特征選擇。
  • 彈性網(wǎng)絡(luò):結(jié)合 L1 和 L2 正則化,兼具 Lasso和嶺回歸的優(yōu)點。

優(yōu)缺點

  • 優(yōu)點:與模型訓(xùn)練相結(jié)合,能夠自動選擇重要特征,計算效率較高。
  • 缺點:依賴于具體的模型選擇。

案例分享

下面我將通過 Python 代碼展示如何在機(jī)器學(xué)習(xí)中應(yīng)用不同的特征選擇方法,包括過濾法、包裝法和嵌入法。

這里,我們以經(jīng)典的乳腺癌數(shù)據(jù)集為例進(jìn)行說明。

數(shù)據(jù)加載與預(yù)處理

首先,我們導(dǎo)入相關(guān)的庫,并加載數(shù)據(jù)集。

# 導(dǎo)入必要的庫
import pandas as pd
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns

# 加載乳腺癌數(shù)據(jù)集
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.Series(data.target)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

過濾法

過濾法基于統(tǒng)計指標(biāo)對特征進(jìn)行評分和選擇。

這里我們使用 SelectKBest 結(jié)合卡方檢驗和互信息兩種方法。

使用卡方檢驗選擇特征

from sklearn.feature_selection import SelectKBest, chi2
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 由于卡方檢驗要求非負(fù)特征,我們確保數(shù)據(jù)為非負(fù)
X_train_chi2 = X_train_scaled - X_train_scaled.min()
X_test_chi2 = X_test_scaled - X_train_scaled.min()

# 選擇k個最佳特征
k = 2
selector = SelectKBest(score_func=chi2, k=k)
X_train_selected = selector.fit_transform(X_train_chi2, y_train)
X_test_selected = selector.transform(X_test_chi2)

# 查看選擇的特征
selected_features = X.columns[selector.get_support()]
print(f"選擇的特征(卡方檢驗): {list(selected_features)}")

# 使用邏輯回歸進(jìn)行訓(xùn)練和評估
model = LogisticRegression(max_iter=200)
model.fit(X_train_selected, y_train)
y_pred = model.predict(X_test_selected)
accuracy = accuracy_score(y_test, y_pred)
print(f"過濾法(卡方檢驗)后的準(zhǔn)確率: {accuracy:.4f}")

#選擇的特征(卡方檢驗): ['mean concave points', 'worst concave points']
#過濾法(卡方檢驗)后的準(zhǔn)確率: 0.9386

使用互信息選擇前10個特征

from sklearn.feature_selection import mutual_info_classif

# 選擇前10個互信息最高的特征
selector_mi = SelectKBest(score_func=mutual_info_classif, k=10)
X_train_mi_selected = selector_mi.fit_transform(X_train_scaled, y_train)
X_test_mi_selected = selector_mi.transform(X_test_scaled)

# 查看選擇的特征
selected_features_mi = X.columns[selector_mi.get_support()]
print("互信息選擇的特征:\n", selected_features_mi)

# 訓(xùn)練模型
model.fit(X_train_mi_selected, y_train)
y_pred = model.predict(X_test_mi_selected)

# 評估模型
accuracy = accuracy_score(y_test, y_pred)
print("互信息后的模型準(zhǔn)確率:", accuracy)

#互信息后的模型準(zhǔn)確率: 0.9824561403508771

包裝法

包裝法將特征選擇視為一個搜索問題。

這里我們使用遞歸特征消除(RFE)方法。

from sklearn.feature_selection import RFE

# 使用邏輯回歸作為基模型
model = LogisticRegression(max_iter=200)
# 選擇k個特征
k = 2
rfe = RFE(estimator=model, n_features_to_select=k)
rfe.fit(X_train_scaled, y_train)

# 查看選擇的特征
selected_features = X.columns[rfe.support_]
print(f"選擇的特征(RFE): {list(selected_features)}")

# 訓(xùn)練并評估模型
X_train_rfe = rfe.transform(X_train_scaled)
X_test_rfe = rfe.transform(X_test_scaled)

model.fit(X_train_rfe, y_train)
y_pred = model.predict(X_test_rfe)
accuracy = accuracy_score(y_test, y_pred)
print(f"包裝法(RFE)后的準(zhǔn)確率: {accuracy:.4f}")

#選擇的特征(RFE): ['worst area', 'worst concave points']
#包裝法(RFE)后的準(zhǔn)確率: 0.9561

嵌入法

嵌入法在模型訓(xùn)練過程中進(jìn)行特征選擇,常見的方法包括Lasso回歸和基于樹的特征重要性。

使用 Lasso 回歸進(jìn)行特征選擇

from sklearn.linear_model import LassoCV

# 使用Lasso進(jìn)行特征選擇
lasso = LassoCV(cv=5, random_state=42)
lasso.fit(X_train_scaled, y_train)

# 獲取非零系數(shù)的特征
coef = pd.Series(lasso.coef_, index=X.columns)
selected_features_lasso = coef[coef != 0].index
print("Lasso選擇的特征:\n", selected_features_lasso)

# 訓(xùn)練模型
X_train_lasso_selected = X_train_scaled[:, coef != 0]
X_test_lasso_selected = X_test_scaled[:, coef != 0]
model.fit(X_train_lasso_selected, y_train)
y_pred = model.predict(X_test_lasso_selected)
y_pred = (y_pred > 0.5).astype(int)

# 評估模型
accuracy = accuracy_score(y_test, y_pred)
print("Lasso后的模型準(zhǔn)確率:", accuracy)

#Lasso后的模型準(zhǔn)確率: 0.9824561403508771

使用隨機(jī)森林進(jìn)行特征重要性排序

from sklearn.ensemble import RandomForestClassifier

# 訓(xùn)練隨機(jī)森林模型
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

# 獲取特征重要性
importances = pd.Series(rf.feature_importances_, index=X.columns)
importances_sorted = importances.sort_values(ascending=False)
print("特征重要性排名:\n", importances_sorted)

# 選擇前10個重要特征
selected_features_rf = importances_sorted.head(10).index
print("隨機(jī)森林選擇的特征:\n", selected_features_rf)

# 訓(xùn)練模型
X_train_rf_selected = X_train[selected_features_rf]
X_test_rf_selected = X_test[selected_features_rf]
model.fit(X_train_rf_selected, y_train)
y_pred = model.predict(X_test_rf_selected)

# 評估模型
accuracy = accuracy_score(y_test, y_pred)
print("隨機(jī)森林后的模型準(zhǔn)確率:", accuracy)

# 隨機(jī)森林后的模型準(zhǔn)確率: 0.9912280701754386

# 可視化特征重要性
plt.figure(figsize=(10,6))
sns.barplot(x=importances_sorted.values[:10], y=importances_sorted.index[:10])
plt.title("隨機(jī)森林特征重要性")
plt.xlabel("重要性分?jǐn)?shù)")
plt.ylabel("特征")
plt.show()

圖片圖片

綜合比較

為了比較不同特征選擇方法對模型性能的影響,我們可以匯總各方法的準(zhǔn)確率。

# 匯總準(zhǔn)確率
accuracy_results = {
    "卡方檢驗": 0.9386,
    "互信息": 0.9824561403508771,
    "RFE": 0.9561,
    "Lasso": 0.9824561403508771,
    "隨機(jī)森林": 0.9912280701754386
}

accuracy_df = pd.DataFrame(list(accuracy_results.items()), columns=["特征選擇方法", "模型準(zhǔn)確率"])
print(accuracy_df)

# 可視化比較
plt.figure(figsize=(8,6))
sns.barplot(x="模型準(zhǔn)確率", y="特征選擇方法", data=accuracy_df, palette="viridis")
plt.title("不同特征選擇方法的模型準(zhǔn)確率比較")
plt.xlabel("準(zhǔn)確率")
plt.ylabel("特征選擇方法")
plt.xlim(0.9, 1.0)
plt.show()

圖片圖片


責(zé)任編輯:武曉燕 來源: 程序員學(xué)長
相關(guān)推薦

2025-01-20 09:21:00

2024-10-08 15:09:17

2024-10-08 10:16:22

2024-10-28 15:52:38

機(jī)器學(xué)習(xí)特征工程數(shù)據(jù)集

2024-10-28 00:00:10

機(jī)器學(xué)習(xí)模型程度

2024-11-05 12:56:06

機(jī)器學(xué)習(xí)函數(shù)MSE

2024-08-23 09:06:35

機(jī)器學(xué)習(xí)混淆矩陣預(yù)測

2024-09-18 16:42:58

機(jī)器學(xué)習(xí)評估指標(biāo)模型

2024-10-14 14:02:17

機(jī)器學(xué)習(xí)評估指標(biāo)人工智能

2024-10-30 08:23:07

2025-01-15 11:25:35

2025-01-07 12:55:28

2025-01-20 09:00:00

2024-11-25 08:20:35

2025-02-17 13:09:59

深度學(xué)習(xí)模型壓縮量化

2024-08-01 08:41:08

2024-10-16 07:58:48

2024-12-03 08:16:57

2024-07-17 09:32:19

2024-09-23 09:12:20

點贊
收藏

51CTO技術(shù)棧公眾號