測中的實戰(zhàn):從數(shù)據(jù)預(yù)處理到模型可解釋性)
簡介本資源是一個面向醫(yī)療健康數(shù)據(jù)分析初學者與機器學習實踐者的高血壓及高血糖風險預(yù)測項目聚焦體檢數(shù)據(jù)建模解決慢性病早期識別這一關(guān)鍵臨床輔助需求。壓縮包共7個文件3個文本數(shù)據(jù)文件、3個Python腳本、1個說明文檔總大小僅15KB輕量但結(jié)構(gòu)完整包含脫敏體檢特征數(shù)據(jù)features、標簽映射文件num_label.txt/word_label.txt、核心數(shù)據(jù)預(yù)處理腳本data_process_by_Mongo.py、特征工程模塊team_feature_work.py、主訓練入口main.py及項目說明README.md。已有328人學習下載適合快速復現(xiàn)Xgboost二分類建模全流程——從體檢指標清洗、特征構(gòu)造、模型訓練到評估指標輸出。讀者可直接運行代碼理解如何將年齡、血壓、血糖、腎功能等多維體檢指標轉(zhuǎn)化為疾病風險預(yù)測結(jié)果并掌握醫(yī)療場景下數(shù)據(jù)脫敏合規(guī)性與模型可解釋性兼顧的實踐要點。1. 項目概述當機器學習遇見慢性病風險預(yù)警最近在整理過往的醫(yī)療數(shù)據(jù)分析項目時我重新審視了一個挺有代表性的課題利用Xgboost模型對高血壓和高血糖這兩種常見慢性病進行風險預(yù)測。這聽起來像是一個標準的分類問題但在實際業(yè)務(wù)場景中它遠不止跑通一個模型那么簡單。我們面對的是不均衡的體檢數(shù)據(jù)、充滿噪聲的臨床指標以及一個核心的業(yè)務(wù)訴求——如何在疾病發(fā)生前盡可能早地、準地識別出高風險個體從而為健康干預(yù)爭取時間窗口。這個項目讓我深刻體會到在醫(yī)療健康領(lǐng)域一個好的預(yù)測模型其價值不僅在于算法本身的精度更在于其對業(yè)務(wù)邏輯的貼合度與結(jié)果的可解釋性。簡單來說這個項目的目標就是構(gòu)建一個分類器輸入一個人的一系列生理指標、生活習慣和基礎(chǔ)信息模型輸出其未來一段時間內(nèi)罹患高血壓或高血糖或兩者的風險概率。它非常適合健康管理機構(gòu)、體檢中心、保險公司的核保部門甚至是個人健康管理APP用于進行初步的風險篩查和分層管理。對于數(shù)據(jù)科學從業(yè)者而言這是一個絕佳的練手項目能讓你接觸到特征工程、不均衡數(shù)據(jù)處理、模型可解釋性等經(jīng)典問題。接下來我將拆解整個項目的核心思路、實操細節(jié)以及那些“踩過坑”才得來的經(jīng)驗。2. 核心思路與方案設(shè)計為什么是Xgboost在開始敲代碼之前明確技術(shù)選型背后的邏輯至關(guān)重要。面對慢性病預(yù)測這個問題我們有很多選擇比如邏輯回歸、隨機森林、支持向量機甚至是深度學習。但最終選擇Xgboost作為核心模型是經(jīng)過多方面權(quán)衡的。2.1 模型選型的深度考量首先醫(yī)療數(shù)據(jù)尤其是體檢和問卷數(shù)據(jù)通常具有以下特點特征維度適中幾十到幾百個包含大量類別型特征如職業(yè)、飲食習慣、數(shù)值型特征如年齡、血壓值以及可能存在缺失值。樣本量可能很大但正樣本即確診患者的比例往往較低存在典型的類別不均衡問題。Xgboost在這些方面表現(xiàn)出了強大的綜合優(yōu)勢。其一處理混合類型特征的能力。Xgboost原生支持將類別型特征進行數(shù)值化處理如通過排序或獨熱編碼后的增益計算并能高效處理數(shù)值型特征無需像神經(jīng)網(wǎng)絡(luò)那樣進行復雜的標準化預(yù)處理雖然做了會更好。其二對缺失值的魯棒性。Xgboost在構(gòu)建樹時有內(nèi)置的機制處理缺失值它會學習缺失值數(shù)據(jù)應(yīng)該被劃分到左子樹還是右子樹這比簡單的均值/眾數(shù)填充往往更有效。其三卓越的預(yù)測性能與效率。Xgboost通過梯度提升框架和正則化項在控制過擬合的同時通常能取得比隨機森林更高的精度且訓練速度在樹模型中屬于第一梯隊。其四也是至關(guān)重要的一點可解釋性。雖然Xgboost是一個復雜的集成模型但通過特征重要性Feature Importance和SHAPSHapley Additive exPlanations值等工具我們可以量化每個特征對最終預(yù)測結(jié)果的貢獻度。在醫(yī)療領(lǐng)域告訴醫(yī)生或用戶“為什么模型認為你風險高”遠比單純給出一個風險分數(shù)更有價值。相比之下邏輯回歸雖然可解釋性強但難以捕捉復雜的非線性關(guān)系和特征交互深度學習模型如多層感知機在理論上容量更大但對數(shù)據(jù)量和質(zhì)量要求極高且模型如同“黑箱”解釋成本巨大在當前的醫(yī)療輔助決策場景下接受度有限。因此Xgboost在性能、效率與可解釋性之間取得了最佳平衡。2.2 項目流程的整體架構(gòu)基于以上考量我設(shè)計了如下工作流這個流程具有通用性你可以遷移到其他二分類預(yù)測任務(wù)中數(shù)據(jù)獲取與理解收集包含目標變量是否患高血壓/高血糖及一系列預(yù)測因子如年齡、BMI、血脂、生活習慣等的結(jié)構(gòu)化數(shù)據(jù)集。數(shù)據(jù)預(yù)處理與探索性分析EDA這是奠定模型效果的基石耗時可能占整個項目的40%以上。包括處理缺失值、異常值進行單變量與多變量分析初步觀察特征與目標的關(guān)系。特征工程基于領(lǐng)域知識醫(yī)學常識和EDA發(fā)現(xiàn)構(gòu)造新的特征如“血壓乘積”、“血脂比值”對類別特征進行編碼對數(shù)值特征進行分箱或轉(zhuǎn)換。處理類別不均衡使用過采樣如SMOTE、欠采樣或調(diào)整模型評估指標如使用AUC-PR、F1-score及損失函數(shù)如scale_pos_weight參數(shù)來應(yīng)對正樣本稀少的問題。模型訓練與調(diào)優(yōu)劃分訓練集、驗證集和測試集。使用交叉驗證和網(wǎng)格搜索/貝葉斯優(yōu)化對Xgboost的關(guān)鍵超參數(shù)進行調(diào)優(yōu)。模型評估與解釋不僅看準確率更要關(guān)注精確率、召回率、AUC-ROC、AUC-PR等指標。使用特征重要性和SHAP值深入解讀模型。部署與應(yīng)用將訓練好的模型封裝為API或集成到應(yīng)用系統(tǒng)中實現(xiàn)對新個體數(shù)據(jù)的實時風險評分。這個流程環(huán)環(huán)相扣任何一環(huán)的疏忽都可能導致模型效果大打折扣。下面我將重點深入第2、3、5、6環(huán)節(jié)分享具體的實操要點和避坑指南。3. 數(shù)據(jù)預(yù)處理與特征工程的魔鬼細節(jié)拿到一份醫(yī)療健康數(shù)據(jù)千萬別急著往模型里喂。垃圾進垃圾出在這里體現(xiàn)得淋漓盡致。3.1 數(shù)據(jù)清洗處理缺失與異常醫(yī)療數(shù)據(jù)中“未檢測”或“未填寫”導致的缺失值非常普遍。我的策略是分層處理關(guān)鍵生理指標缺失如收縮壓、空腹血糖值缺失如果比例不高5%可以考慮使用中位數(shù)或基于其他特征的預(yù)測模型進行填充。如果比例高則需要評估該樣本是否可用有時直接刪除是更穩(wěn)妥的選擇。生活習慣類缺失如“是否吸煙”、“飲酒頻率”這類類別型特征可以單獨設(shè)一個“未知”類別這本身可能就包含信息例如不愿透露吸煙史的人可能風險更高。異常值處理對于數(shù)值型特征需要結(jié)合醫(yī)學常識進行截斷。例如成年人的靜息心率在40-100次/分是合理范圍超過這個范圍的數(shù)值需要審查可能是測量錯誤也可能是極特殊的病理情況需要結(jié)合業(yè)務(wù)判斷是修正、設(shè)為缺失還是保留。注意所有在訓練集上進行的填充、轉(zhuǎn)換操作如計算的中位數(shù)、構(gòu)建的分箱區(qū)間都必須保存下來在驗證集、測試集及未來的新數(shù)據(jù)上應(yīng)用完全相同的轉(zhuǎn)換這是保證模型一致性的生命線。3.2 特征構(gòu)造融入領(lǐng)域知識這是提升模型性能的關(guān)鍵一步也是數(shù)據(jù)科學家價值的體現(xiàn)。我們不能只依賴原始特征而要創(chuàng)造對預(yù)測目標更有力的“信號”。衍生指標醫(yī)學上有很多復合指標比單一指標更有意義。例如脈壓 收縮壓 - 舒張壓脈壓增大是動脈硬化的標志之一。BMI 體重(kg) / 身高(m)^2這是基礎(chǔ)但必須算。非高密度脂蛋白膽固醇 總膽固醇 - 高密度脂蛋白膽固醇反映致動脈粥樣硬化脂蛋白的總量。甘油三酯/高密度脂蛋白膽固醇比值與胰島素抵抗密切相關(guān)。交互特征考慮特征之間的相互作用。例如“年齡”與“收縮壓”的交互項可能揭示老年性高血壓的特點“BMI”與“血脂異?!睒酥疚坏慕换タ赡苤赶虼x綜合征。分箱與編碼對年齡進行分箱如30, 30-45, 45-60, 60有時比連續(xù)值更穩(wěn)定。對類別特征在樣本量足夠時嘗試使用目標編碼Target Encoding或CatBoost編碼其效果通常優(yōu)于獨熱編碼且能避免維度爆炸。3.3 應(yīng)對類別不均衡的實戰(zhàn)策略在我們的場景中健康人群負樣本遠多于患者正樣本。如果直接訓練模型會傾向于將所有樣本都預(yù)測為健康準確率看起來很高但完全喪失了識別患者的能力。1. 調(diào)整評估指標第一時間放棄“準確率”作為主要指標。轉(zhuǎn)而使用AUC-ROC反映模型整體排序能力對不均衡相對不敏感但仍需謹慎。精確率-召回率曲線PR Curve及AUC-PR在不均衡數(shù)據(jù)中這是比ROC更可靠的指標它更關(guān)注正樣本患者的識別情況。F1-Score精確率和召回率的調(diào)和平均數(shù)是業(yè)務(wù)中常用的綜合指標。2. 使用Xgboost的內(nèi)置參數(shù)Xgboost的scale_pos_weight參數(shù)是處理不均衡的利器。通常將其設(shè)置為負樣本數(shù) / 正樣本數(shù)。這相當于在損失函數(shù)中給正樣本更高的權(quán)重讓模型更關(guān)注少數(shù)類。3. 采樣技術(shù)過采樣如SMOTE在訓練集中人工合成一些正樣本。實操心得不要在全部數(shù)據(jù)上做SMOTE后再劃分訓練驗證集這會導致數(shù)據(jù)泄露嚴重高估模型性能。正確的做法是僅在訓練集上進行SMOTE驗證集和測試集必須保持原始分布用于評估模型在真實世界不均衡數(shù)據(jù)上的表現(xiàn)。欠采樣隨機丟棄一部分負樣本。這會損失信息僅在數(shù)據(jù)量極大時考慮。我的經(jīng)驗是優(yōu)先使用scale_pos_weight配合AUC-PR進行評估。如果效果仍不理想再嘗試在訓練集內(nèi)謹慎使用SMOTE。4. Xgboost模型訓練、調(diào)優(yōu)與評估實錄數(shù)據(jù)準備妥當后終于可以進入模型環(huán)節(jié)了。這里我以Python的xgboost庫為例展示核心步驟。4.1 關(guān)鍵超參數(shù)解析與調(diào)優(yōu)Xgboost參數(shù)眾多但針對二分類問題重點調(diào)整以下幾個核心參數(shù)即可import xgboost as xgb from sklearn.model_selection import GridSearchCV, train_test_split from sklearn.metrics import classification_report, roc_auc_score, average_precision_score # 假設(shè) X_train, y_train 已經(jīng)準備好 # 劃分訓練集和驗證集測試集應(yīng)早已預(yù)留 X_tr, X_val, y_tr, y_val train_test_split(X_train, y_train, test_size0.2, random_state42, stratifyy_train) # 初始化基礎(chǔ)模型 base_model xgb.XGBClassifier( objectivebinary:logistic, # 二分類邏輯回歸 eval_metriclogloss, # 訓練時評估指標也可用 aucpr seed42, use_label_encoderFalse, n_jobs-1 # 使用所有CPU核心 ) # 定義參數(shù)網(wǎng)格 param_grid { n_estimators: [100, 200, 300], # 樹的數(shù)量 max_depth: [3, 5, 7], # 每棵樹的最大深度控制過擬合 learning_rate: [0.01, 0.05, 0.1], # 學習率越小越慢但可能更精 subsample: [0.7, 0.8, 1.0], # 每棵樹使用的樣本比例 colsample_bytree: [0.7, 0.8, 1.0], # 每棵樹使用的特征比例 gamma: [0, 0.1, 0.3], # 節(jié)點分裂所需的最小損失下降越大越保守 scale_pos_weight: [1, y_tr[y_tr0].count() / y_tr[y_tr1].count()] # 處理不均衡 } # 使用網(wǎng)格搜索數(shù)據(jù)量大時可考慮隨機搜索或貝葉斯優(yōu)化 grid_search GridSearchCV( estimatorbase_model, param_gridparam_grid, scoringaverage_precision, # 使用平均精度AUC-PR作為優(yōu)化目標 cv5, # 5折交叉驗證 verbose1, n_jobs-1 ) grid_search.fit(X_tr, y_tr) print(f最佳參數(shù): {grid_search.best_params_}) print(f最佳交叉驗證分數(shù) (AP): {grid_search.best_score_:.4f})調(diào)參心得max_depth和learning_rate通常需要權(quán)衡。較小的learning_rate配合較多的n_estimators如0.05和500往往能獲得更好的泛化性能但訓練時間更長。subsample和colsample_bytree是引入隨機性、防止過擬合的利器類似隨機森林的思想一般設(shè)置為0.7-0.9。gamma參數(shù)調(diào)優(yōu)效果明顯。適當增加gamma值可以讓模型更簡潔泛化能力更強。務(wù)必使用交叉驗證并在獨立的測試集上進行最終評估避免過擬合到驗證集。4.2 多維度模型評估訓練完成后我們需要一套組合拳來評估模型# 使用最佳模型在驗證集上預(yù)測 best_model grid_search.best_estimator_ y_val_pred_proba best_model.predict_proba(X_val)[:, 1] # 預(yù)測為正類的概率 y_val_pred (y_val_pred_proba 0.5).astype(int) # 按默認0.5閾值分類 # 1. 分類報告 print(驗證集分類報告) print(classification_report(y_val, y_val_pred, target_names[健康, 患病])) # 2. ROC-AUC 和 PR-AUC roc_auc roc_auc_score(y_val, y_val_pred_proba) pr_auc average_precision_score(y_val, y_val_pred_proba) print(fROC-AUC: {roc_auc:.4f}) print(fPR-AUC (平均精度): {pr_auc:.4f}) # 3. 繪制ROC和PR曲線 import matplotlib.pyplot as plt from sklearn.metrics import roc_curve, precision_recall_curve, auc fpr, tpr, _ roc_curve(y_val, y_val_pred_proba) precision, recall, _ precision_recall_curve(y_val, y_val_pred_proba) fig, (ax1, ax2) plt.subplots(1, 2, figsize(12, 5)) ax1.plot(fpr, tpr, labelfROC curve (area {roc_auc:.2f})) ax1.plot([0, 1], [0, 1], k--) ax1.set_xlabel(False Positive Rate) ax1.set_ylabel(True Positive Rate) ax1.set_title(ROC Curve) ax1.legend(loclower right) ax2.plot(recall, precision, labelfPR curve (area {pr_auc:.2f})) ax2.set_xlabel(Recall) ax2.set_ylabel(Precision) ax2.set_title(Precision-Recall Curve) ax2.legend(locupper right) plt.tight_layout() plt.show()業(yè)務(wù)中我們往往需要根據(jù)不同的成本誤診成本 vs. 漏診成本來調(diào)整分類閾值。通過分析PR曲線我們可以選擇一個在精確率和召回率之間達到業(yè)務(wù)平衡的閾值而不是死守0.5。5. 模型解釋從“黑盒”到“白盒”模型性能達標后解釋性工作才剛剛開始。我們需要回答模型依據(jù)什么做出判斷5.1 特征重要性分析Xgboost提供了幾種特征重要性計算方式最常用的是weight特征被用作分裂點的總次數(shù)、gain特征帶來的平均增益和cover特征覆蓋的樣本數(shù)。通常gain更能反映特征的真實預(yù)測能力。import pandas as pd import numpy as np # 獲取特征重要性基于增益 importance_df pd.DataFrame({ feature: X_train.columns, importance_gain: best_model.feature_importances_ }).sort_values(importance_gain, ascendingFalse) print(Top 10 重要特征基于增益) print(importance_df.head(10)) # 可視化 plt.figure(figsize(10, 6)) plt.barh(importance_df.head(20)[feature], importance_df.head(20)[importance_gain]) plt.xlabel(特征重要性 (Gain)) plt.title(Xgboost 特征重要性 Top 20) plt.gca().invert_yaxis() plt.show()5.2 SHAP值深度解讀特征重要性只能告訴我們“哪些特征重要”而SHAP值可以告訴我們“每個特征如何影響每一個具體樣本的預(yù)測”這是質(zhì)的飛躍。import shap # 初始化SHAP解釋器使用TreeExplainer explainer shap.TreeExplainer(best_model) # 計算驗證集樣本的SHAP值可抽樣計算以加快速度 shap_values explainer.shap_values(X_val) # 1. 全局解釋特征總體影響 shap.summary_plot(shap_values, X_val, plot_typebar) # 條形圖顯示平均絕對SHAP值 shap.summary_plot(shap_values, X_val) # 散點圖顯示特征值與SHAP值的關(guān)系 # 2. 局部解釋單個樣本的預(yù)測解釋 # 例如解釋驗證集中第10個樣本高風險個體 sample_idx 10 shap.force_plot(explainer.expected_value, shap_values[sample_idx, :], X_val.iloc[sample_idx, :], matplotlibTrue) # 或者用瀑布圖 shap.plots._waterfall.waterfall_legacy(explainer.expected_value, shap_values[sample_idx], feature_namesX_val.columns, max_display10)通過SHAP圖你可以清晰地看到對于某個高風險個體是“較高的收縮壓”、“偏高的BMI”和“較低的HDL膽固醇”共同將其預(yù)測風險推高。這種解釋能力對于醫(yī)生理解模型、建立信任至關(guān)重要也能幫助我們發(fā)現(xiàn)數(shù)據(jù)中的潛在規(guī)律或錯誤。實操心得SHAP計算可能較慢特別是數(shù)據(jù)量大時??梢韵仍隍炞C集的一個子集如1000個樣本上計算和繪圖這足以反映整體模式。另外確保安裝的shap庫版本與xgboost兼容版本沖突是常見錯誤。6. 部署考量與持續(xù)迭代模型通過驗證后可以考慮部署應(yīng)用。部署形式取決于業(yè)務(wù)需求批量預(yù)測定期對體檢數(shù)據(jù)庫中的新用戶進行風險評分生成報告。實時API封裝為RESTful API供健康管理APP或醫(yī)生工作站調(diào)用。邊緣部署如果對延遲要求高可以考慮使用ONNX格式轉(zhuǎn)換模型在邊緣設(shè)備運行。部署時需要注意特征管道固化將預(yù)處理填充器、分箱器、編碼器和模型一起打包如使用sklearn.pipeline.Pipeline確保線上線下的處理完全一致。監(jiān)控與衰減模型性能會隨時間推移而下降概念漂移。需要監(jiān)控線上預(yù)測結(jié)果的分布變化以及定期用新數(shù)據(jù)評估模型制定重訓練策略。倫理與合規(guī)醫(yī)療預(yù)測模型涉及個人敏感信息必須確保數(shù)據(jù)安全、隱私保護并且模型的建議不能替代專業(yè)醫(yī)生的診斷應(yīng)明確其“輔助篩查”的定位。7. 常見問題與排查技巧實錄在實際操作中你肯定會遇到各種問題。這里記錄了幾個典型場景和我的解決思路。問題現(xiàn)象可能原因排查與解決思路模型在訓練集上AUC很高0.99在驗證/測試集上驟降0.7。嚴重過擬合??赡芤驗閿?shù)據(jù)泄露如將未來信息或目標相關(guān)變量誤作為特征、特征過于復雜max_depth太大、n_estimators太多或訓練數(shù)據(jù)量太少。1.嚴格檢查特征確保沒有使用任何在預(yù)測時不可用的信息如“是否已接受治療”。2.增加正則化調(diào)高gamma、reg_alpha、reg_lambda降低max_depth減少n_estimators。3.使用早停在xgboost訓練時設(shè)置early_stopping_rounds用驗證集監(jiān)控性能防止過度訓練。PR-AUC始終很低如0.3但ROC-AUC尚可如0.8。類別極度不均衡且模型對正樣本的識別能力弱。ROC-AUC在不均衡數(shù)據(jù)下容易虛高。1.確認評估指標以PR-AUC和F1-score為主要優(yōu)化目標。2.調(diào)整scale_pos_weight嘗試更大的權(quán)重值。3.嘗試不同的采樣方法在訓練集內(nèi)謹慎應(yīng)用SMOTEENN結(jié)合過采樣與欠采樣。4.檢查正樣本質(zhì)量正樣本是否標注準確特征是否足以區(qū)分SHAP摘要圖中某個特征的重要性與醫(yī)學常識嚴重不符如“性別”比“血壓”還重要。特征存在數(shù)據(jù)泄露或強相關(guān)性。例如“性別”可能被編碼為與某種性別特定的治療方式相關(guān)聯(lián)而該治療方式泄露了患病信息。1.檢查特征相關(guān)性計算特征間的相關(guān)系數(shù)檢查是否有特征與目標變量存在“未來”或“同義”關(guān)系。2.進行特征消融實驗移除可疑特征后重新訓練觀察模型性能變化。如果移除后性能不變甚至提升說明該特征可能是噪聲或泄露源。3.深入業(yè)務(wù)邏輯與領(lǐng)域?qū)<裔t(yī)生溝通理解特征的真實含義。訓練過程非常慢。數(shù)據(jù)量過大或參數(shù)設(shè)置不當。1.調(diào)整Xgboost參數(shù)設(shè)置tree_methodhist或gpu_hist如果有GPU這能顯著加速。2.降低數(shù)據(jù)精度將float64轉(zhuǎn)換為float32。3.使用子采樣在調(diào)參初期使用數(shù)據(jù)的一個子集如20%進行快速迭代確定大致參數(shù)范圍后再用全數(shù)據(jù)微調(diào)。部署后對新批次數(shù)據(jù)預(yù)測結(jié)果出現(xiàn)大量異常值如全為0或1。線上/線下特征處理不一致。新數(shù)據(jù)的特征值范圍、類別與訓練時不同或預(yù)處理管道未正確應(yīng)用。1.記錄并對比特征統(tǒng)計量對比訓練集和新批次數(shù)據(jù)的特征均值、標準差、唯一值等。2.復核預(yù)處理管道確保線上部署的管道包含了所有訓練時的轉(zhuǎn)換步驟且轉(zhuǎn)換器如標準化器使用的是訓練集擬合的參數(shù)。3.實施數(shù)據(jù)驗證在API入口處加入數(shù)據(jù)合理性檢查攔截明顯異常的特征值。這個項目從數(shù)據(jù)清洗到模型解釋每一步都充滿了細節(jié)和挑戰(zhàn)。我最深的體會是在醫(yī)療健康這樣的領(lǐng)域模型的可靠性和可解釋性與預(yù)測精度同等重要。一個AUC再高但無法解釋的“黑箱”模型很難獲得臨床的信任與應(yīng)用。而Xgboost配合SHAP恰好在這三者之間提供了一個優(yōu)秀的平衡點。最后一個小技巧在項目開始前盡可能多地與領(lǐng)域?qū)<裔t(yī)生、健康管理師溝通他們的先驗知識能幫你省去大量無效的特征工程嘗試直接抓住問題的核心。本文還有配套的精品資源點擊獲取