day 18進行聚類,進而推斷出每個簇的實際含義

@浙大疏錦行

對聚類的結果根據具體的特征進行解釋,進而推斷出每個簇的實際含義

兩種思路:

  1. 你最開始聚類的時候,就選擇了你想最后用來確定簇含義的特征,

  2. 最開始用全部特征來聚類,把其余特征作為 x,聚類得到的簇類別作為標簽構建監督模型,進而根據重要性篩選特征,來確定要根據哪些特征賦予含義。

下面使用第二種方法,先計算再分析

先分析出和聚類有關的幾個重要特征

再根據不同的簇對應的特征與簇的大小進行分析,從而最后將結果進行總結

進行聚類

# 先運行之前預處理好的代碼
import pandas as pd
import pandas as pd    #用于數據處理和分析,可處理表格數據。
import numpy as np     #用于數值計算,提供了高效的數組操作。
import matplotlib.pyplot as plt    #用于繪制各種類型的圖表
import seaborn as sns   #基于matplotlib的高級繪圖庫,能繪制更美觀的統計圖形。
import warnings
warnings.filterwarnings("ignore")# 設置中文字體(解決中文顯示問題)
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系統常用黑體字體
plt.rcParams['axes.unicode_minus'] = False    # 正常顯示負號
data = pd.read_csv('data.csv')    #讀取數據# 先篩選字符串變量 
discrete_features = data.select_dtypes(include=['object']).columns.tolist()
# Home Ownership 標簽編碼
home_ownership_mapping = {'Own Home': 1,'Rent': 2,'Have Mortgage': 3,'Home Mortgage': 4
}
data['Home Ownership'] = data['Home Ownership'].map(home_ownership_mapping)# Years in current job 標簽編碼
years_in_job_mapping = {'< 1 year': 1,'1 year': 2,'2 years': 3,'3 years': 4,'4 years': 5,'5 years': 6,'6 years': 7,'7 years': 8,'8 years': 9,'9 years': 10,'10+ years': 11
}
data['Years in current job'] = data['Years in current job'].map(years_in_job_mapping)# Purpose 獨熱編碼,記得需要將bool類型轉換為數值
data = pd.get_dummies(data, columns=['Purpose'])
data2 = pd.read_csv("data.csv") # 重新讀取數據,用來做列名對比
list_final = [] # 新建一個空列表,用于存放獨熱編碼后新增的特征名
for i in data.columns:if i not in data2.columns:list_final.append(i) # 這里打印出來的就是獨熱編碼后的特征名
for i in list_final:data[i] = data[i].astype(int) # 這里的i就是獨熱編碼后的特征名# Term 0 - 1 映射
term_mapping = {'Short Term': 0,'Long Term': 1
}
data['Term'] = data['Term'].map(term_mapping)
data.rename(columns={'Term': 'Long Term'}, inplace=True) # 重命名列
continuous_features = data.select_dtypes(include=['int64', 'float64']).columns.tolist()  #把篩選出來的列名轉換成列表# 連續特征用中位數補全
for feature in continuous_features:     mode_value = data[feature].mode()[0]            #獲取該列的眾數。data[feature].fillna(mode_value, inplace=True)          #用眾數填充該列的缺失值,inplace=True表示直接在原數據上修改。# 最開始也說了 很多調參函數自帶交叉驗證,甚至是必選的參數,你如果想要不交叉反而實現起來會麻煩很多
# 所以這里我們還是只劃分一次數據集
from sklearn.model_selection import train_test_split
X = data.drop(['Credit Default'], axis=1)  # 特征,axis=1表示按列刪除
y = data['Credit Default'] # 標簽
# # 按照8:2劃分訓練集和測試集
# X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # 80%訓練集,20%測試集
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import seaborn as sns# 標準化數據(聚類前通常需要標準化)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# X_scaled
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score, calinski_harabasz_score, davies_bouldin_score
import matplotlib.pyplot as plt
import seaborn as sns# 評估不同 k 值下的指標
k_range = range(2, 11)  # 測試 k 從 2 到 10
inertia_values = []
silhouette_scores = []
ch_scores = []
db_scores = []for k in k_range:kmeans = KMeans(n_clusters=k, random_state=42)kmeans_labels = kmeans.fit_predict(X_scaled)inertia_values.append(kmeans.inertia_)  # 慣性(肘部法則)silhouette = silhouette_score(X_scaled, kmeans_labels)  # 輪廓系數silhouette_scores.append(silhouette)ch = calinski_harabasz_score(X_scaled, kmeans_labels)  # CH 指數ch_scores.append(ch)db = davies_bouldin_score(X_scaled, kmeans_labels)  # DB 指數db_scores.append(db)print(f"k={k}, 慣性: {kmeans.inertia_:.2f}, 輪廓系數: {silhouette:.3f}, CH 指數: {ch:.2f}, DB 指數: {db:.3f}")# # 繪制評估指標圖
# plt.figure(figsize=(15, 10))# # 肘部法則圖(Inertia)
# plt.subplot(2, 2, 1)
# plt.plot(k_range, inertia_values, marker='o')
# plt.title('肘部法則確定最優聚類數 k(慣性,越小越好)')
# plt.xlabel('聚類數 (k)')
# plt.ylabel('慣性')
# plt.grid(True)# # 輪廓系數圖
# plt.subplot(2, 2, 2)
# plt.plot(k_range, silhouette_scores, marker='o', color='orange')
# plt.title('輪廓系數確定最優聚類數 k(越大越好)')
# plt.xlabel('聚類數 (k)')
# plt.ylabel('輪廓系數')
# plt.grid(True)# # CH 指數圖
# plt.subplot(2, 2, 3)
# plt.plot(k_range, ch_scores, marker='o', color='green')
# plt.title('Calinski-Harabasz 指數確定最優聚類數 k(越大越好)')
# plt.xlabel('聚類數 (k)')
# plt.ylabel('CH 指數')
# plt.grid(True)# # DB 指數圖
# plt.subplot(2, 2, 4)
# plt.plot(k_range, db_scores, marker='o', color='red')
# plt.title('Davies-Bouldin 指數確定最優聚類數 k(越小越好)')
# plt.xlabel('聚類數 (k)')
# plt.ylabel('DB 指數')
# plt.grid(True)# plt.tight_layout()
# plt.show()# 提示用戶選擇 k 值
selected_k = 3 # 這里選擇3后面好分析,也可以根據圖選擇最佳的k值# 使用選擇的 k 值進行 KMeans 聚類
kmeans = KMeans(n_clusters=selected_k, random_state=42)
kmeans_labels = kmeans.fit_predict(X_scaled)
X['KMeans_Cluster'] = kmeans_labels# 使用 PCA 降維到 2D 進行可視化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)# KMeans 聚類結果可視化
plt.figure(figsize=(6, 5))
sns.scatterplot(x=X_pca[:, 0], y=X_pca[:, 1], hue=kmeans_labels, palette='viridis')
plt.title(f'KMeans Clustering with k={selected_k} (PCA Visualization)')
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.show()# 打印 KMeans 聚類標簽的前幾行
print(f"KMeans Cluster labels (k={selected_k}) added to X:")
print(X[['KMeans_Cluster']].value_counts())

shap分析特征

x1= X.drop('KMeans_Cluster',axis=1) # 刪除聚類標簽列
y1 = X['KMeans_Cluster']
# 構建隨機森林,用shap重要性來篩選重要性
import shap
import numpy as np
from sklearn.ensemble import RandomForestClassifier  # 隨機森林分類器
model = RandomForestClassifier(n_estimators=100, random_state=42)  # 隨機森林模型
model.fit(x1, y1)  # 訓練模型,此時無需在意準確率 直接全部數據用來訓練了
shap.initjs()
# 初始化 SHAP 解釋器
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(x1) # 這個計算耗時
shap_values.shape # 第一維是樣本數,第二維是特征數,第三維是類別數
# --- 1. SHAP 特征重要性條形圖 (Summary Plot - Bar) ---
print("--- 1. SHAP 特征重要性條形圖 ---")
shap.summary_plot(shap_values[:, :, 0], x1, plot_type="bar",show=False)  #  這里的show=False表示不直接顯示圖形,這樣可以繼續用plt來修改元素,不然就直接輸出了
plt.title("SHAP Feature Importance (Bar Plot)")
plt.show()

在這里插入圖片描述

繪制總樣本中的前四個重要性的特征分布圖

# X["Purpose_debt consolidation"].value_counts() # 統計每個唯一值的出現次數
import matplotlib.pyplot as plt# 總樣本中的前四個重要性的特征分布圖
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
axes = axes.flatten()for i, feature in enumerate(selected_features):axes[i].hist(X[feature], bins=20)axes[i].set_title(f'Histogram of {feature}')axes[i].set_xlabel(feature)axes[i].set_ylabel('Frequency')plt.tight_layout()
plt.show()

在這里插入圖片描述

繪制出每個簇對應的這四個特征的分布圖

在這里插入圖片描述

在這里插入圖片描述

根據繪制的圖進行解釋

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86289.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86289.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86289.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java并發編程實戰 Day 11:并發設計模式

【Java并發編程實戰 Day 11】并發設計模式 開篇 這是"Java并發編程實戰"系列的第11天&#xff0c;今天我們聚焦于并發設計模式。并發設計模式是解決多線程環境下常見問題的經典解決方案&#xff0c;它們不僅提供了優雅的設計思路&#xff0c;還能顯著提升系統的性能…

iview組件庫:當后臺返回到的數據與使用官網組件指定的字段不匹配時,進行修改某個屬性名再將response數據渲染到頁面上的處理

1、需求導入 當存在前端需要的數據的字段渲染到表格或者是一些公共的表格組件展示數據時的某個字段名與后臺返回的字段不一致時&#xff0c;那么需要前端進行稍加處理&#xff0c;而不能直接this.list res.data;這樣數據是渲染不出來的。 2、后臺返回的數據類型 Datalist(pn) …

Ubuntu下有關UDP網絡通信的指令

1、查看防火墻狀態&#xff1a; sudo ufw status # Ubuntu 2、 檢查系統全局廣播設置 # 查看是否忽略廣播包&#xff08;0表示接收&#xff0c;1表示忽略&#xff09; sysctl net.ipv4.icmp_echo_ignore_broadcasts# 查看是否允許廣播轉發&#xff08;1表示允許&#xff09…

vue3:十六、個人中心-修改密碼

一、頁面效果 頁面展示當前用戶名(只讀),展示需要輸入的當前密碼,輸入新的密碼以及確認密碼的提交表單 二、初始建立 1、建立密碼修改頁面 在個人中心文件夾中寫入新頁面UpdatepwdView.vue 2、新建路由 在路由頁面中寫入修改密碼頁面 3、新建菜單 在菜單布局菜單頁面中寫…

GitFlow 工作模式(詳解)

今天再學項目的過程中遇到使用gitflow模式管理代碼&#xff0c;因此進行學習并且發布關于gitflow的一些思考 Git與GitFlow模式 我們在寫代碼的時候通常會進行網上保存&#xff0c;無論是github還是gittee&#xff0c;都是一種基于git去保存代碼的形式&#xff0c;這樣保存代碼…

【Vue3】(三)vue3中的pinia狀態管理、組件通信

目錄 一、vue3的pinia 二、【props】傳參 三、【自定義事件】傳參 四、【mitt】傳參 五、【v-model】傳參&#xff08;平常基本不寫&#xff09; 六、【$attrs】傳參 七、【$refs和$parent】傳參 八、provide和inject 一、vue3的pinia 1、什么是pinia&#xff1f; pinia …

【DAY43】復習日

內容來自浙大疏錦行python打卡訓練營 浙大疏錦行 作業&#xff1a; kaggle找到一個圖像數據集&#xff0c;用cnn網絡進行訓練并且用grad-cam做可視化 進階&#xff1a;并拆分成多個文件

xtp+ctp 交易系統接口簡介

CTP&#xff08;上海期貨交易所綜合交易平臺&#xff09;和 XTP&#xff08;中泰證券極速交易平臺&#xff09;是中國金融市場中兩個重要的證券期貨交易系統&#xff0c;它們在定位、架構和應用場景上有顯著區別&#xff1a; 1. 開發主體與服務領域 維度CTPXTP開發公司上海期貨…

阿里云Alibaba Cloud安裝Docker與Docker compose【圖文教程】

個人記錄 進入控制臺&#xff0c;找到定時與自動化任務 進入‘安裝/卸載擴展程序’ 點擊‘安裝擴展程序’ 選擇docker社區版&#xff0c;點擊下一步與確定&#xff0c;等待一會 安裝成功 查詢版本 查詢docker sudo docker version查詢docker compose sudo docker compo…

非Root用戶啟動SSH服務經驗小結

各位看官&#xff0c;小子我先問個問題&#xff1a;是不是經常在容器里想開個SSH&#xff0c;卻發現自己不是root&#xff0c;處處碰壁&#xff1f;這是常態。多數容器鏡像精簡到連SSH服務都沒有&#xff0c;就算有&#xff0c;咱們普通用戶也沒權限啟動它。 今天小子就介紹一…

Windows開機自動啟動中間件

WinSW&#xff08;Windows Service Wrapper 是一個開源的 Windows 服務包裝器&#xff0c;它可以幫助你將應用程序打包成系統服務&#xff0c;并實現開機自啟動的功能。 一、下載 WinSW 下載 WinSW-x64.exe v2.12.0 (?? 更多版本下載) 和 sample-minimal.xml 二、配置 WinS…

【CATIA的二次開發23】抽象對象Document涉及文檔激活控制的方法

在CATIA VBA開發中,Document對象是最核心、最基礎的對象之一。它代表了當前在CATIA會話中打開的一個文檔(文件)。 幾乎所有與文件操作、模型訪問相關的操作都始于獲取一個Document對象。Document對象包含多種方法和屬性,以下介紹Document對象方法和屬性 一、Document對象方…

基于多維視角的大模型提升認知醫療過程層次激勵編程分析

系統架構設計 #mermaid-svg-k3W5lvie1sP3T956 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-k3W5lvie1sP3T956 .error-icon{fill:#552222;}#mermaid-svg-k3W5lvie1sP3T956 .error-text{fill:#552222;stroke:#55222…

【評測】Qwen3-Embedding模型初體驗

回到目錄 【評測】Qwen3-Embedding模型初體驗 模型的介紹頁面 0.6B運行配置&#xff1a;筆記本i5-8265U&#xff0c;16G內存&#xff0c;無GPU核顯運行&#xff0c;win10操作系統 8B運行配置&#xff1a;AMD8700G&#xff0c;64G內存&#xff0c;4090D 24G顯存&#xff0c;ub…

MPLAB X IDE ?軟件安裝與卸載

1、下載MPLAB X IDE V6.25 MPLAB X IDE | Microchip Technology 正常選Windows&#xff0c;點擊Download&#xff0c;等待自動下載完成&#xff1b; MPLAB X IDE 一臺電腦上可以安裝多個版本&#xff1b; 2、安裝MPLAB X IDE V6.25 右鍵以管理員運行&#xff1b;next; 勾選 I a…

PLC入門【2】PLC的接線

02 PLC的接線 PLC 的品牌介紹&#xff0c;PLC的接線 1、PLC 大體分為歐式和日式 2、只要學會三菱的&#xff0c;整個日式的也差不多會了。 3、PLC 分為晶體管輸出和繼電器輸出。 4、PLC 接線都差不多的 我們主要是講這個三菱的 PLC&#xff0c; 三菱和臺達的 PLC&#xff0c;…

Hibernate Validator 數據驗證

Hibernate Validator不僅可以用于Controller層的參數驗證&#xff0c;還可以在Service層、Repository層或任何其他層中使用。 手動驗證 在任何地方都可以通過Validator接口手動觸發驗證&#xff1a; public class ManualValidationExample {public void validateObject(Obje…

【深度學習】表示學習:深度學習的數據解構與重構藝術

作者選擇了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰寫的《Deep Learning》(人工智能領域的經典教程&#xff0c;深度學習領域研究生必讀教材),開始深度學習領域學習&#xff0c;深入全面的理解深度學習的理論知識。 之前的文章參考下面的鏈接&#xf…

如何在PowerBI中使用Analyze in Excel

如何在PowerBI中使用Analyze in Excel 之前分享過如何使用DAXStudio將PowerBI與Excel連接 &#xff0c;今天介紹另外一個工具&#xff0c;也可以實現同樣的功能&#xff0c;Analyze in Excel。 使用Analyze in Excel 第一步&#xff1a; 首先準備好一個PBIX文件&#xff0c…

AI應用工程師面試

技術基礎 簡述人工智能、機器學習和深度學習之間的關系。 人工智能是一個廣泛的概念,旨在讓機器能夠模擬人類的智能行為。機器學習是人工智能的一個子集,它專注于開發算法和模型,讓計算機能夠從數據中學習規律并進行預測。深度學習則是機器學習的一個分支,它利用深度神經網…