器學(xué)習(xí):新生兒敗血癥ICU住院時(shí)長(zhǎng)影響因素分析)
1. 項(xiàng)目背景與核心問題拆解新生兒重癥監(jiān)護(hù)室里每一個(gè)小時(shí)都牽動(dòng)著整個(gè)家庭的神經(jīng)。敗血癥在新生兒群體中并不罕見尤其是早產(chǎn)兒和低出生體重兒免疫系統(tǒng)尚未發(fā)育成熟一旦發(fā)生感染病情進(jìn)展可能非常迅速。臨床醫(yī)生需要在極短的時(shí)間內(nèi)判斷這個(gè)孩子的生命體征組合到底意味著什么他大概需要在ICU里待多久哪些指標(biāo)是真正影響住院時(shí)長(zhǎng)的關(guān)鍵因素這個(gè)項(xiàng)目要解決的就是上述問題。它用K-Means聚類算法對(duì)新生兒敗血癥患兒的生命體征做“畫像”分析再結(jié)合機(jī)器學(xué)習(xí)方法研究ICU住院時(shí)長(zhǎng)的影響因素。說得直白一點(diǎn)就是把一群小患者的體溫、心率、呼吸頻率、血壓、血氧飽和度、白細(xì)胞計(jì)數(shù)等指標(biāo)扔給算法讓算法自己去找出“哪些孩子的情況比較像”然后進(jìn)一步分析“為什么有些孩子住得久、有些住得短”。我第一次接觸這個(gè)方向的時(shí)候心里其實(shí)是有疑問的聚類分析在臨床上到底有沒有實(shí)際價(jià)值后來跟幾位做新生兒科的醫(yī)生聊過之后才明白臨床上的“分型”很多時(shí)候依賴醫(yī)生的個(gè)人經(jīng)驗(yàn)和有限的指南而數(shù)據(jù)驅(qū)動(dòng)的聚類可以提供一個(gè)更客觀的視角。比如同樣是敗血癥有的孩子主要表現(xiàn)為呼吸系統(tǒng)癥狀有的則以循環(huán)系統(tǒng)不穩(wěn)定為主還有的可能先出現(xiàn)體溫波動(dòng)。這些不同的表現(xiàn)模式如果能夠被算法識(shí)別出來對(duì)后續(xù)的個(gè)體化治療和資源分配都有參考意義。這個(gè)項(xiàng)目適合誰來看如果你是對(duì)機(jī)器學(xué)習(xí)在醫(yī)療領(lǐng)域應(yīng)用感興趣的學(xué)生或開發(fā)者這個(gè)項(xiàng)目可以給你一個(gè)完整的實(shí)戰(zhàn)案例如果你是臨床研究人員想了解如何用數(shù)據(jù)方法輔助分析這里面的思路和踩坑經(jīng)驗(yàn)也有參考價(jià)值如果你只是對(duì)“聚類到底能干什么”感到好奇那這篇文章會(huì)從數(shù)據(jù)預(yù)處理一直講到結(jié)果解讀盡量把每一步都講清楚。注意本文涉及的所有數(shù)據(jù)均為模擬數(shù)據(jù)不包含任何真實(shí)患者信息。項(xiàng)目中的代碼和參數(shù)設(shè)置基于常見實(shí)踐進(jìn)行合理補(bǔ)全實(shí)際應(yīng)用時(shí)需要根據(jù)具體數(shù)據(jù)集進(jìn)行調(diào)整。2. 數(shù)據(jù)準(zhǔn)備與特征工程從原始指標(biāo)到可用的分析素材2.1 數(shù)據(jù)來源與字段說明做任何機(jī)器學(xué)習(xí)項(xiàng)目數(shù)據(jù)都是第一位的。這個(gè)項(xiàng)目的數(shù)據(jù)通常來自醫(yī)院的電子病歷系統(tǒng)或ICU監(jiān)護(hù)設(shè)備導(dǎo)出的生命體征記錄。一個(gè)典型的數(shù)據(jù)集可能包含以下字段字段名稱含義數(shù)據(jù)類型備注patient_id患者編號(hào)字符串脫敏后的唯一標(biāo)識(shí)gestational_age胎齡周數(shù)值影響敗血癥風(fēng)險(xiǎn)的重要因素birth_weight出生體重克數(shù)值低體重兒風(fēng)險(xiǎn)更高temperature體溫?cái)z氏度數(shù)值可能波動(dòng)較大heart_rate心率次/分?jǐn)?shù)值新生兒正常范圍與成人差異大respiratory_rate呼吸頻率次/分?jǐn)?shù)值敗血癥時(shí)可能增快systolic_bp收縮壓mmHg數(shù)值循環(huán)系統(tǒng)指標(biāo)diastolic_bp舒張壓mmHg數(shù)值循環(huán)系統(tǒng)指標(biāo)spo2血氧飽和度%數(shù)值呼吸功能指標(biāo)wbc白細(xì)胞計(jì)數(shù)數(shù)值感染指標(biāo)crpC反應(yīng)蛋白數(shù)值炎癥指標(biāo)platelet血小板計(jì)數(shù)數(shù)值可能影響凝血功能icu_losICU住院時(shí)長(zhǎng)天數(shù)值回歸任務(wù)的目標(biāo)變量sepsis_type敗血癥類型分類早發(fā)型/晚發(fā)型這些字段里生命體征類指標(biāo)體溫、心率、呼吸頻率、血壓、血氧是聚類分析的主要輸入而實(shí)驗(yàn)室指標(biāo)白細(xì)胞、CRP、血小板和人口學(xué)特征胎齡、出生體重既可以作為聚類的輔助特征也可以作為后續(xù)影響因素分析的候選變量。2.2 數(shù)據(jù)清洗那些你必須處理的“臟數(shù)據(jù)”真實(shí)世界的數(shù)據(jù)從來不會(huì)干干凈凈地等著你。我在處理這類數(shù)據(jù)時(shí)遇到過以下幾種典型問題缺失值處理。生命體征數(shù)據(jù)通常是連續(xù)監(jiān)測(cè)的但導(dǎo)出時(shí)可能出現(xiàn)某個(gè)時(shí)間段沒有記錄的情況。如果某個(gè)患者的缺失比例超過30%我一般會(huì)考慮直接剔除該樣本如果缺失比例較低可以用該患者其他時(shí)間點(diǎn)的均值或中位數(shù)填充。對(duì)于實(shí)驗(yàn)室指標(biāo)由于不是每天檢測(cè)缺失可能更多這時(shí)候需要根據(jù)臨床意義決定是填充還是保留為缺失。異常值識(shí)別。新生兒的心率正常范圍大約在120-160次/分但監(jiān)護(hù)設(shè)備偶爾會(huì)記錄到明顯偏離的數(shù)值比如心率突然變成0或者300。這些往往是設(shè)備誤差或?qū)?lián)脫落導(dǎo)致的。我的做法是先用箱線圖或3σ原則標(biāo)記可疑值然后結(jié)合臨床知識(shí)判斷如果某個(gè)值在生理上完全不可能就直接刪除如果只是極端但可能的值就保留但做縮尾處理。時(shí)間窗口對(duì)齊。不同指標(biāo)的記錄頻率不一樣生命體征可能是每小時(shí)甚至每分鐘記錄一次而實(shí)驗(yàn)室指標(biāo)可能每天只測(cè)一次。做聚類時(shí)通常需要把數(shù)據(jù)聚合到患者層面比如取每個(gè)患者入住ICU后前24小時(shí)的生命體征均值、最大值、最小值等統(tǒng)計(jì)量作為特征。import pandas as pd import numpy as np # 假設(shè)原始數(shù)據(jù)已經(jīng)加載為df # 計(jì)算每個(gè)患者前24小時(shí)的統(tǒng)計(jì)特征 def extract_features(group): return pd.Series({ temp_mean: group[temperature].mean(), temp_max: group[temperature].max(), temp_min: group[temperature].min(), hr_mean: group[heart_rate].mean(), hr_max: group[heart_rate].max(), hr_min: group[heart_rate].min(), rr_mean: group[respiratory_rate].mean(), sbp_mean: group[systolic_bp].mean(), spo2_mean: group[spo2].mean(), wbc_mean: group[wbc].mean(), crp_mean: group[crp].mean(), platelet_mean: group[platelet].mean(), gestational_age: group[gestational_age].iloc[0], birth_weight: group[birth_weight].iloc[0], icu_los: group[icu_los].iloc[0] }) features_df df.groupby(patient_id).apply(extract_features).reset_index()2.3 特征標(biāo)準(zhǔn)化為什么這一步不能省K-Means是基于距離的算法它計(jì)算樣本之間的歐氏距離。如果某個(gè)特征的數(shù)值范圍遠(yuǎn)大于其他特征比如白細(xì)胞計(jì)數(shù)可能是5-30而體溫只有36-39那么白細(xì)胞對(duì)距離的影響就會(huì)遠(yuǎn)遠(yuǎn)超過體溫。這顯然不合理因?yàn)閺呐R床角度看體溫變化0.5度可能比白細(xì)胞變化5個(gè)單位更有意義。所以標(biāo)準(zhǔn)化是必須的。常用的方法有兩種Z-score標(biāo)準(zhǔn)化和Min-Max歸一化。我一般傾向于Z-score因?yàn)樗鼘?duì)異常值的魯棒性稍好一些而且保留了數(shù)據(jù)的分布形態(tài)。from sklearn.preprocessing import StandardScaler feature_cols [temp_mean, temp_max, temp_min, hr_mean, hr_max, hr_min, rr_mean, sbp_mean, spo2_mean, wbc_mean, crp_mean, platelet_mean, gestational_age, birth_weight] scaler StandardScaler() X_scaled scaler.fit_transform(features_df[feature_cols])實(shí)操心得標(biāo)準(zhǔn)化之后建議再檢查一下每個(gè)特征的均值和標(biāo)準(zhǔn)差確保均值接近0、標(biāo)準(zhǔn)差接近1。如果某個(gè)特征標(biāo)準(zhǔn)化后仍然偏離很大可能是原始數(shù)據(jù)中存在極端異常值需要回頭處理。3. K-Means聚類如何給新生兒敗血癥“畫像”3.1 為什么選擇K-Means而不是其他聚類算法聚類算法有很多種DBSCAN、層次聚類、高斯混合模型各有優(yōu)劣。這個(gè)項(xiàng)目選擇K-Means主要有幾個(gè)考慮第一K-Means的計(jì)算效率高對(duì)于幾千到幾萬條記錄的數(shù)據(jù)集跑一次聚類通常只需要幾秒到幾分鐘適合快速迭代。第二K-Means的結(jié)果解釋性相對(duì)直觀每個(gè)簇可以用中心點(diǎn)來代表醫(yī)生更容易理解“這個(gè)簇的孩子平均體溫偏高、心率偏快”這樣的描述。第三K-Means對(duì)球形簇的假設(shè)在生命體征數(shù)據(jù)上通常不會(huì)太離譜因?yàn)榻?jīng)過標(biāo)準(zhǔn)化后各維度尺度一致簇的形狀往往比較接近球形。當(dāng)然K-Means也有明顯的局限。它需要預(yù)先指定簇的數(shù)量K對(duì)初始中心點(diǎn)敏感而且對(duì)異常值不夠魯棒。所以在實(shí)際項(xiàng)目中我通常會(huì)配合肘部法則和輪廓系數(shù)來確定K并用多次隨機(jī)初始化來降低局部最優(yōu)的風(fēng)險(xiǎn)。3.2 確定最佳簇?cái)?shù)肘部法則與輪廓系數(shù)雙驗(yàn)證確定K值是K-Means最關(guān)鍵的步驟之一。K太小簇內(nèi)差異大畫像不夠精細(xì)K太大簇太多臨床解釋困難。我的做法是同時(shí)看兩個(gè)指標(biāo)肘部法則。計(jì)算不同K值下的簇內(nèi)平方和WCSS然后畫出WCSS隨K變化的曲線。通常曲線會(huì)在某個(gè)點(diǎn)出現(xiàn)明顯的“拐彎”那個(gè)點(diǎn)就是比較合適的K。輪廓系數(shù)。它衡量每個(gè)樣本與自身簇內(nèi)其他樣本的相似度以及與最近簇樣本的差異度。輪廓系數(shù)越接近1聚類效果越好。from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import matplotlib.pyplot as plt wcss [] sil_scores [] K_range range(2, 11) for k in K_range: kmeans KMeans(n_clustersk, initk-means, n_init10, random_state42) labels kmeans.fit_predict(X_scaled) wcss.append(kmeans.inertia_) sil_scores.append(silhouette_score(X_scaled, labels)) # 繪制肘部法則圖 plt.figure(figsize(12, 5)) plt.subplot(1, 2, 1) plt.plot(K_range, wcss, bo-) plt.xlabel(K值) plt.ylabel(簇內(nèi)平方和) plt.title(肘部法則) plt.subplot(1, 2, 2) plt.plot(K_range, sil_scores, ro-) plt.xlabel(K值) plt.ylabel(輪廓系數(shù)) plt.title(輪廓系數(shù)) plt.tight_layout() plt.show()在實(shí)際運(yùn)行中我通常會(huì)看到K3或K4時(shí)輪廓系數(shù)出現(xiàn)峰值而肘部法則的拐點(diǎn)也大致在這個(gè)范圍。結(jié)合臨床可解釋性最終選擇K4的情況比較多——四個(gè)簇分別對(duì)應(yīng)“相對(duì)穩(wěn)定型”“呼吸受累型”“循環(huán)不穩(wěn)定型”和“炎癥反應(yīng)強(qiáng)烈型”。3.3 聚類結(jié)果解讀每個(gè)簇到底代表什么聚類跑完之后最重要的一步是解讀每個(gè)簇的臨床含義。我一般會(huì)計(jì)算每個(gè)簇在各特征上的均值然后跟整體均值做對(duì)比找出每個(gè)簇的“特征標(biāo)簽”。簇編號(hào)體溫心率呼吸頻率收縮壓血氧白細(xì)胞CRP臨床畫像0正常正常正常正常正常正常正常相對(duì)穩(wěn)定型1偏高偏快明顯偏快正常偏低偏高偏高呼吸受累型2偏低偏快偏快偏低偏低偏高明顯偏高循環(huán)不穩(wěn)定型3波動(dòng)大明顯偏快偏快偏低偏低明顯偏高明顯偏高炎癥反應(yīng)強(qiáng)烈型這個(gè)表格是我根據(jù)常見數(shù)據(jù)模式整理的實(shí)際項(xiàng)目中每個(gè)簇的特征需要根據(jù)數(shù)據(jù)具體計(jì)算。解讀的時(shí)候一定要結(jié)合臨床知識(shí)不能只看數(shù)字。比如心率偏快在新生兒中可能是疼痛、發(fā)熱、血容量不足等多種原因?qū)е碌牟荒芎?jiǎn)單歸因于敗血癥本身。注意事項(xiàng)聚類結(jié)果的可解釋性依賴于特征的選擇和標(biāo)準(zhǔn)化方式。如果發(fā)現(xiàn)某個(gè)簇很難用臨床邏輯解釋可能需要回頭檢查特征工程是否有問題或者考慮增加/減少特征。4. ICU時(shí)長(zhǎng)影響因素研究從聚類標(biāo)簽到回歸分析4.1 把聚類標(biāo)簽作為新特征聚類分析本身只是第一步。更有價(jià)值的是把聚類得到的簇標(biāo)簽作為一個(gè)新的類別特征加入到后續(xù)的回歸模型中看看不同“畫像”的患者在ICU住院時(shí)長(zhǎng)上是否有顯著差異。這個(gè)思路的邏輯是聚類捕捉了生命體征之間的復(fù)雜交互模式這些模式可能比單個(gè)指標(biāo)更能反映病情的整體嚴(yán)重程度。比如一個(gè)患者可能體溫只是輕微偏高心率也只是輕微偏快但兩者同時(shí)出現(xiàn)且伴隨血氧下降這種組合模式可能比單獨(dú)看任何一個(gè)指標(biāo)都更有預(yù)測(cè)力。# 將聚類標(biāo)簽合并回原始特征數(shù)據(jù) features_df[cluster] labels # 查看不同簇的ICU住院時(shí)長(zhǎng)分布 los_by_cluster features_df.groupby(cluster)[icu_los].describe() print(los_by_cluster)從常見的數(shù)據(jù)模式來看相對(duì)穩(wěn)定型的患者ICU時(shí)長(zhǎng)通常最短中位數(shù)可能在5-7天呼吸受累型可能稍長(zhǎng)7-10天循環(huán)不穩(wěn)定型和炎癥反應(yīng)強(qiáng)烈型往往最長(zhǎng)可能超過10天甚至更久。當(dāng)然這只是一個(gè)大致趨勢(shì)具體數(shù)值取決于數(shù)據(jù)集和臨床實(shí)踐。4.2 回歸模型的選擇與比較研究影響因素回歸分析是常用工具。這個(gè)項(xiàng)目里目標(biāo)變量是ICU住院時(shí)長(zhǎng)連續(xù)數(shù)值所以可以用線性回歸、嶺回歸、Lasso回歸、隨機(jī)森林回歸、梯度提升回歸等。我一般會(huì)先跑一個(gè)線性回歸作為基線然后嘗試樹模型看看是否有非線性關(guān)系。from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor from sklearn.model_selection import cross_val_score from sklearn.metrics import mean_absolute_error, r2_score # 準(zhǔn)備特征和目標(biāo)變量 X features_df[feature_cols [cluster]] y features_df[icu_los] # 對(duì)類別特征cluster做獨(dú)熱編碼 X pd.get_dummies(X, columns[cluster], drop_firstTrue) # 定義模型列表 models { 線性回歸: LinearRegression(), 嶺回歸: Ridge(alpha1.0), Lasso回歸: Lasso(alpha0.1), 隨機(jī)森林: RandomForestRegressor(n_estimators100, random_state42), 梯度提升: GradientBoostingRegressor(n_estimators100, random_state42) } # 交叉驗(yàn)證比較 for name, model in models.items(): scores cross_val_score(model, X, y, cv5, scoringr2) print(f{name}: R2均值{scores.mean():.3f}, 標(biāo)準(zhǔn)差{scores.std():.3f})根據(jù)我的經(jīng)驗(yàn)樹模型在這類數(shù)據(jù)上通常表現(xiàn)更好因?yàn)樯w征與住院時(shí)長(zhǎng)之間的關(guān)系往往是非線性的。比如體溫與住院時(shí)長(zhǎng)的關(guān)系可能是U型的——體溫過低和過高都可能導(dǎo)致住院時(shí)間延長(zhǎng)而正常體溫對(duì)應(yīng)最短時(shí)長(zhǎng)。線性回歸很難捕捉這種模式。4.3 特征重要性分析哪些因素真正影響ICU時(shí)長(zhǎng)如果樹模型表現(xiàn)更好可以用特征重要性來識(shí)別關(guān)鍵影響因素。隨機(jī)森林和梯度提升都可以輸出特征重要性通常以“不純度減少”或“排列重要性”來衡量。# 以隨機(jī)森林為例 rf RandomForestRegressor(n_estimators100, random_state42) rf.fit(X, y) # 特征重要性 importance_df pd.DataFrame({ feature: X.columns, importance: rf.feature_importances_ }).sort_values(importance, ascendingFalse) print(importance_df.head(15))從常見結(jié)果來看出生體重、胎齡、CRP峰值、血小板最低值、血氧最低值等往往是排名靠前的特征。聚類標(biāo)簽的重要性通常也能排進(jìn)前幾位說明生命體征的組合模式確實(shí)攜帶了獨(dú)立于單個(gè)指標(biāo)的信息。實(shí)操心得特征重要性只能說明“這個(gè)特征對(duì)預(yù)測(cè)有用”不能直接推斷因果關(guān)系。比如出生體重低與ICU時(shí)長(zhǎng)長(zhǎng)相關(guān)可能是因?yàn)榈腕w重兒本身發(fā)育不成熟而不是低體重“導(dǎo)致”了住院時(shí)間長(zhǎng)。解讀時(shí)要保持謹(jǐn)慎。5. 常見問題與排查技巧實(shí)錄5.1 聚類結(jié)果不穩(wěn)定怎么辦K-Means對(duì)初始中心點(diǎn)敏感不同隨機(jī)種子可能得到不同的聚類結(jié)果。如果你發(fā)現(xiàn)每次跑出來的簇標(biāo)簽都不一樣可以嘗試以下方法增加n_init參數(shù)的值讓算法用更多組初始中心點(diǎn)選擇最優(yōu)的那一組。scikit-learn默認(rèn)是10可以調(diào)到20或30。使用k-means初始化方法它比隨機(jī)初始化更穩(wěn)定。如果數(shù)據(jù)量不大可以考慮用層次聚類先確定大致的簇結(jié)構(gòu)再用K-Means細(xì)化。5.2 某個(gè)簇的樣本量特別少怎么辦有時(shí)候聚類結(jié)果會(huì)出現(xiàn)一個(gè)簇只有幾個(gè)樣本的情況。這通常意味著這個(gè)簇可能是異常值組成的或者K值選得太大。我的處理方式是先檢查這些樣本的原始數(shù)據(jù)看看是不是記錄錯(cuò)誤如果數(shù)據(jù)沒問題可以考慮把這個(gè)簇合并到最近的簇或者重新選擇K值。5.3 回歸模型R2很低怎么排查如果回歸模型的R2只有0.2-0.3不要急著換模型。先檢查以下幾點(diǎn)特征是否足夠ICU時(shí)長(zhǎng)受很多因素影響包括感染類型、抗生素使用、并發(fā)癥等如果特征里只有生命體征R2低是正常的。目標(biāo)變量是否需要變換ICU時(shí)長(zhǎng)通常呈右偏分布取對(duì)數(shù)后可能更接近正態(tài)回歸效果會(huì)更好。是否存在非線性關(guān)系可以嘗試加入特征的平方項(xiàng)或交互項(xiàng)或者直接用樹模型。5.4 臨床解讀時(shí)容易犯的錯(cuò)誤最后說幾個(gè)我在跟臨床醫(yī)生交流時(shí)發(fā)現(xiàn)的常見誤解把聚類簇當(dāng)成診斷分型。聚類只是數(shù)據(jù)驅(qū)動(dòng)的分組不等于臨床診斷。一個(gè)患者可能同時(shí)符合多個(gè)簇的特征。忽略時(shí)間維度。生命體征是動(dòng)態(tài)變化的用均值做聚類會(huì)丟失很多信息。如果數(shù)據(jù)允許可以考慮用時(shí)間序列聚類方法。過度解讀特征重要性。特征重要性高不代表這個(gè)因素就是“原因”可能只是相關(guān)。6. 項(xiàng)目擴(kuò)展與個(gè)人經(jīng)驗(yàn)分享這個(gè)項(xiàng)目做完之后我覺得還有幾個(gè)方向可以繼續(xù)挖。一是把時(shí)間序列信息利用起來比如用LSTM或Transformer對(duì)生命體征的時(shí)間序列做建??赡軙?huì)比簡(jiǎn)單的統(tǒng)計(jì)特征效果更好。二是引入更多臨床變量比如抗生素使用天數(shù)、機(jī)械通氣時(shí)長(zhǎng)、并發(fā)癥情況等這些對(duì)ICU時(shí)長(zhǎng)的預(yù)測(cè)價(jià)值可能更高。三是做外部驗(yàn)證用不同醫(yī)院或不同時(shí)間段的數(shù)據(jù)來檢驗(yàn)?zāi)P偷姆夯芰ΑN覀€(gè)人在實(shí)際操作中的體會(huì)是醫(yī)療數(shù)據(jù)分析項(xiàng)目最難的不是算法而是對(duì)數(shù)據(jù)的理解和臨床知識(shí)的積累。同樣的特征在不同臨床背景下可能有完全不同的含義。比如新生兒心率偏快可能是感染也可能是疼痛或發(fā)熱如果不了解這些很容易得出錯(cuò)誤的結(jié)論。所以做這類項(xiàng)目一定要多跟臨床人員溝通不要自己悶頭調(diào)參。另外代碼的可復(fù)現(xiàn)性很重要。我習(xí)慣把數(shù)據(jù)預(yù)處理、特征工程、建模、評(píng)估的每一步都寫成函數(shù)或類這樣換一個(gè)數(shù)據(jù)集時(shí)只需要改數(shù)據(jù)加載部分其他邏輯可以復(fù)用。這個(gè)項(xiàng)目里我把特征提取和標(biāo)準(zhǔn)化封裝成了一個(gè)Pipeline用起來很方便。from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans pipeline Pipeline([ (scaler, StandardScaler()), (kmeans, KMeans(n_clusters4, initk-means, n_init20, random_state42)) ]) pipeline.fit(features_df[feature_cols]) features_df[cluster] pipeline.predict(features_df[feature_cols])最后再分享一個(gè)小技巧在做聚類之前可以先對(duì)特征做相關(guān)性分析把高度相關(guān)的特征合并或剔除。比如收縮壓和舒張壓通常高度相關(guān)可以只保留平均動(dòng)脈壓。這樣既能減少維度又能避免某些特征被重復(fù)計(jì)算權(quán)重。