import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
df = pd.read_csv('Chabuhou.csv')

# 劃分特征和目標變量
X = df.drop(['Electrical_cardioversion'], axis=1)
y = df['Electrical_cardioversion']
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42, stratify=df['Electrical_cardioversion'])
df.head()

讀取數據,將其分為特征(X)和目標變量(y),然后將數據集按80%訓練集和20%測試集進行劃分,使用的是一個心臟電復律的數據集包含46個特征變量一個目標變量為二分類任務。

Boruta算法特征選擇

from sklearn.ensemble import RandomForestClassifier
from boruta import BorutaPy

# 初始化隨機森林模型
rf = RandomForestClassifier(n_jobs=-1, class_weight='balanced', max_depth=5)

# 初始化Boruta特征選擇器
boruta_selector = BorutaPy(rf, n_estimators='auto', verbose=2, random_state=42)

# 對訓練數據進行特征選擇
boruta_selector.fit(X_train.values, y_train.values)

# 檢查選中的特征
selected_features = X_train.columns[boruta_selector.support_].to_list()

# 打印被選擇的特征
print("Selected Features: ", selected_features)

# 打印被剔除的特征
rejected_features = X_train.columns[~boruta_selector.support_].to_list()
print("Rejected Features: ", rejected_features)

# 打印有待定性的特征
tentative_features = X_train.columns[boruta_selector.support_weak_].to_list()
print("Tentative Features: ", tentative_features)

初始化隨機森林分類器模型用于評估特征重要性,并通過Boruta特征選擇器與影子特征進行對比,確定哪些特征是重要的,隨后對訓練數據應用Boruta算法,以篩選出對模型預測最有用的特征,Boruta算法默認在內部迭代100次,如需更改迭代次數,可通過添加參數max_iter進行調整。

# 獲取特征排名
feature_ranks = boruta_selector.ranking_
# 將特征名稱和排名結合成一個DataFrame
feature_importance_df = pd.DataFrame({
'Feature': X_train.columns,
'Rank': feature_ranks
})
feature_importance_df

使用boruta_selector.ranking_獲取每個特征的排名,這個排名表示了特征的重要性,數值越小代表特征越重要,這里只展示部分特征,最后確定重要的特征為[‘Type_of_atrial_fibrillation’, ‘BMI’, ‘Left_atrial_diameter’, ‘Systolic_blood_pressure’, ‘NtproBNP’]。

多次運行Boruta算法以評估特征排名穩定性

# 初始化隨機森林模型
rf = RandomForestClassifier(n_jobs=-1, class_weight='balanced', max_depth=5)

# 初始化存儲特征排名的 DataFrame
ranking_df = pd.DataFrame(index=range(1, 21), columns=X_train.columns)

# 運行 Boruta 20 次
for i in range(20):
print(f"Iteration {i+1}")

# 初始化Boruta特征選擇器
boruta_selector = BorutaPy(rf, n_estimators='auto', verbose=2, random_state=i, max_iter=50)

# 對訓練數據進行特征選擇
boruta_selector.fit(X_train.values, y_train.values)

# 獲取特征排名
feature_ranks = boruta_selector.ranking_

# 將特征排名保存到 DataFrame 中
ranking_df.loc[i+1] = feature_ranks
ranking_df

多次運行Boruta算法,以不同的隨機種子生成特征排名,并將每次的排名結果保存到一個DataFrame中,用于分析特征排名的一致性,并且指定max_iter=50不在是默認的100,提高運行速度。

可視化排名穩定性

# 確保數據集中只有數值列
numeric_ranking_df = ranking_df.apply(pd.to_numeric, errors='coerce')

# 計算每個特征的中位數
median_values = numeric_ranking_df.median()

# 根據中位數對列進行排序
sorted_columns = median_values.sort_values().index

# 設置繪圖風格
plt.figure(figsize=(15, 8))
sns.set(style="whitegrid")

# 繪制箱線圖
sns.boxplot(data=numeric_ranking_df[sorted_columns], palette="Greens")

plt.xticks(rotation=90)
plt.title("Sorted Feature Ranking Distribution by Boruta", fontsize=16)
plt.xlabel("Attributes", fontsize=14)
plt.ylabel("Importance", fontsize=14)
plt.tight_layout()
plt.show()

從圖表中可以看出,最左側的特征(Type_of_atrial_fibrillation、BMI等)在多次迭代中排名較高,表明它們是模型中較為重要的特征,而最右側的特征(如COPD、Amiodarone等)則在多次迭代中排名較低,說明它們在模型中被認為不太重要,與前面單次運行Boruta算法的結果一致,但是相比于單次運行,通過這個可視化可以發現某些特征在個別迭代中的重要性排名與大多數迭代結果不同,從而判斷這些特征的重要性是否穩定,圖中位于須線外的點正是代表了這些異常的排名結果,如果過多這種情況出現作者認為需要著重去考慮這種特征。

文章轉自微信公眾號@Python機器學習AI

上一篇:

特征選擇:Lasso和Boruta算法的結合應用

下一篇:

精確度與參數的完美融合:用可視化解讀模型優化過程

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費