器學(xué)習(xí)加速ODS合金設(shè)計:從數(shù)據(jù)到模型的實戰(zhàn)指南)
簡介這份PDF文獻(xiàn)面向材料科學(xué)與核能工程領(lǐng)域的研究生、科研人員及合金設(shè)計從業(yè)者聚焦如何借助機(jī)器學(xué)習(xí)方法解決高強(qiáng)度氧化物彌散強(qiáng)化ODS合金的成分優(yōu)化難題。文中基于200至300組ODS合金的成分、工藝與力學(xué)性能數(shù)據(jù)建立關(guān)鍵成分與拉伸性能的關(guān)聯(lián)模型發(fā)現(xiàn)Cr、Y2O3、W和Ti含量均存在對應(yīng)抗拉強(qiáng)度極值的最優(yōu)值而添加Al對強(qiáng)度提升作用不明顯并給出多種室溫抗拉強(qiáng)度預(yù)測超過1400 MPa的成分配比可為快堆結(jié)構(gòu)材料用ODS合金的優(yōu)化設(shè)計提供參考。資源包為單個PDF文件約853KB內(nèi)容完整、便于檢索與引用適合作為機(jī)器學(xué)習(xí)輔助材料設(shè)計的參考文獻(xiàn)與專業(yè)指導(dǎo)材料。目前已有150人學(xué)習(xí)下載可供讀者快速把握數(shù)據(jù)驅(qū)動合金成分設(shè)計的建模思路與關(guān)鍵結(jié)論。1. 從一張成分表到一爐合格合金機(jī)器學(xué)習(xí)怎么把 ODS 合金設(shè)計周期砍掉一半做核材料或者高溫結(jié)構(gòu)材料的人大概率都碰過 ODS 合金——氧化物彌散強(qiáng)化合金。它的核心思路是在鐵基或鎳基基體里彌散分布納米級 Y?O?、Al?O? 這類氧化物顆??款w粒釘扎位錯和晶界把高溫蠕變強(qiáng)度拉到一個常規(guī)合金夠不著的高度。問題在于成分空間太大了Fe-Cr-Al-Y-O 五元起步加上 Ti、Zr、Mo、W 的微調(diào)再疊加機(jī)械合金化、熱等靜壓、退火這一串工藝參數(shù)靠傳統(tǒng)「炒菜式」試錯一輪實驗周期動輒幾個月燒掉的粉料和工時夠一個博士生畢業(yè)。機(jī)器學(xué)習(xí)在這里的價值不是趕時髦而是把「成分—工藝—性能」這個高維映射用數(shù)據(jù)驅(qū)動的方式先篩一遍把實驗候選從幾百個壓到十幾個。這篇筆記面向的是想用機(jī)器學(xué)習(xí)做 ODS 合金成分設(shè)計的材料方向研究生和工程師尤其是那些已經(jīng)有一批實驗數(shù)據(jù)、但不知道怎么把它變成預(yù)測模型的人。我會按「數(shù)據(jù)怎么整 → 特征怎么選 → 模型怎么搭 → 結(jié)果怎么驗」的順序把每一步的參數(shù)和坑講清楚。2. 數(shù)據(jù)從哪來實驗數(shù)據(jù)、文獻(xiàn)數(shù)據(jù)與數(shù)據(jù)庫的三條路2.1 先搞清楚你的目標(biāo)變量是什么ODS 合金設(shè)計里機(jī)器學(xué)習(xí)要預(yù)測的目標(biāo)通常不是單一值。常見的預(yù)測目標(biāo)有三類室溫/高溫屈服強(qiáng)度、蠕變斷裂壽命、以及氧化物顆粒的平均尺寸和數(shù)密度。這三類目標(biāo)的建模難度完全不同。屈服強(qiáng)度數(shù)據(jù)最多文獻(xiàn)里一抓一大把但不同測試溫度、不同應(yīng)變速率下的值混在一起直接建模就是災(zāi)難。蠕變壽命數(shù)據(jù)最少而且分散性極大同一個成分不同爐次能差一個數(shù)量級。顆粒尺寸數(shù)據(jù)介于兩者之間但依賴 TEM 表征測量誤差本身就不小。我的建議是第一版模型只做屈服強(qiáng)度而且限定在一個溫度區(qū)間內(nèi)比如 600–700°C。先把流程跑通再擴(kuò)展到蠕變。一上來就做蠕變壽命預(yù)測數(shù)據(jù)量不夠模型學(xué)到的全是噪聲。2.2 實驗數(shù)據(jù)、文獻(xiàn)數(shù)據(jù)、數(shù)據(jù)庫的取舍數(shù)據(jù)來源無非三條路。第一條是自己實驗室的歷史數(shù)據(jù)優(yōu)點是工藝一致、測試標(biāo)準(zhǔn)統(tǒng)一缺點是量少通常幾十條到一兩百條。第二條是文獻(xiàn)挖掘從已發(fā)表論文的表格和圖里提取成分和性能量能到幾百上千條但不同課題組的工藝差異巨大機(jī)械合金化時間從 10 小時到 40 小時都有熱等靜壓溫度從 1000°C 到 1150°C 不等這些差異會直接污染特征空間。第三條是材料數(shù)據(jù)庫比如 NIMS 的蠕變數(shù)據(jù)庫但 ODS 合金的專門數(shù)據(jù)庫很少多數(shù)時候還是得靠前兩條路。實際操作中我一般會以自己實驗室數(shù)據(jù)為基底用文獻(xiàn)數(shù)據(jù)做擴(kuò)充但必須加一個「數(shù)據(jù)來源」的標(biāo)記特征讓模型有機(jī)會學(xué)到來源帶來的系統(tǒng)偏差。如果某個來源的數(shù)據(jù)在交叉驗證中表現(xiàn)異常就單獨拎出來檢查。2.3 數(shù)據(jù)清洗的四個硬動作拿到原始數(shù)據(jù)后別急著喂給模型。先做四件事第一統(tǒng)一單位。Cr 含量有的用 wt.% 有的用 at.%Y?O? 有的用 wt.% 有的用 vol.%必須全部轉(zhuǎn)成同一套。我一般統(tǒng)一用 wt.%因為實驗配方通常按 wt.% 稱粉。第二處理缺失值。成分?jǐn)?shù)據(jù)通常不缺但工藝參數(shù)經(jīng)常缺比如退火時間沒寫、球磨轉(zhuǎn)速沒記錄。缺失比例低于 5% 的用中位數(shù)填充并加一個缺失標(biāo)記高于 20% 的直接放棄這個特征。第三異常值檢測。用箱線圖或者 IQR 方法先篩一遍但別急著刪。ODS 合金里有些「異?!蛊鋵嵤钦鎸嵉母咝阅茳c比如某個成分的屈服強(qiáng)度特別高可能是氧化物分布特別均勻。先標(biāo)記再結(jié)合金相或 TEM 結(jié)果判斷。第四數(shù)據(jù)增強(qiáng)。如果數(shù)據(jù)量實在少低于 100 條可以考慮用高斯噪聲擾動或者 SMOTE 做增強(qiáng)但材料數(shù)據(jù)里 SMOTE 要慎用因為成分空間不是歐氏空間線性插值出來的「虛擬成分」可能根本沒法制備。import pandas as pd import numpy as np # 讀取原始數(shù)據(jù) df pd.read_excel(ods_alloy_raw.xlsx) # 統(tǒng)一單位at.% 轉(zhuǎn) wt.%以 Fe-Cr-Al-Y2O3 為例 def at_to_wt(df, elements): 將原子百分比轉(zhuǎn)換為質(zhì)量百分比 atomic_mass {Fe: 55.85, Cr: 52.00, Al: 26.98, Y: 88.91, O: 16.00, Ti: 47.87, Zr: 91.22} total_mass sum(df[f{el}_at] * atomic_mass[el] for el in elements) for el in elements: df[f{el}_wt] df[f{el}_at] * atomic_mass[el] / total_mass * 100 return df elements [Fe, Cr, Al, Y, O] df at_to_wt(df, elements) # 缺失值處理中位數(shù)填充 缺失標(biāo)記 for col in [MA_time, HIP_temp, anneal_temp]: if col in df.columns: df[f{col}_missing] df[col].isna().astype(int) df[col].fillna(df[col].median(), inplaceTrue) # IQR 異常值標(biāo)記不刪除只標(biāo)記 def mark_outliers(df, col, factor1.5): q1, q3 df[col].quantile([0.25, 0.75]) iqr q3 - q1 lower, upper q1 - factor * iqr, q3 factor * iqr df[f{col}_outlier] ((df[col] lower) | (df[col] upper)).astype(int) return df df mark_outliers(df, yield_strength) df.to_csv(ods_alloy_clean.csv, indexFalse)這段代碼做了三件事單位轉(zhuǎn)換、缺失值填充加標(biāo)記、異常值標(biāo)記。注意at_to_wt函數(shù)里我用了各元素的原子量實際使用時要把你的元素列表補(bǔ)全。缺失值填充用中位數(shù)而不是均值是因為工藝參數(shù)往往有偏分布均值容易被極端值拉偏。異常值只標(biāo)記不刪除是因為材料數(shù)據(jù)里「異?!箍赡苁钦鎸嵉母咝阅軜颖緞h了可惜。3. 特征工程把成分和工藝翻譯成模型能吃的數(shù)字3.1 成分特征不只是百分比直接把元素百分比扔給模型是最省事的做法但效果往往一般。原因是元素對性能的影響不是線性的Cr 含量從 12% 到 14% 可能影響不大但從 14% 到 16% 可能因為形成 σ 相導(dǎo)致性能驟降。所以需要構(gòu)造一些衍生特征。常用的衍生特征包括原子半徑差、電負(fù)性差、混合焓、價電子濃度。這些特征在高熵合金設(shè)計里用得多ODS 合金里同樣適用。比如 Y 和 O 的原子半徑差很大這個差值可以間接反映 Y?O? 形成的驅(qū)動力。再比如 Cr 和 Al 的電負(fù)性差可以反映 Al?O? 和 Cr?O? 競爭形成的傾向。另外Y?O? 的加入量通常很小0.3–0.5 wt.%直接作為特征時數(shù)值范圍和其他元素差兩個數(shù)量級需要做標(biāo)準(zhǔn)化。我一般會對所有成分特征做 Z-score 標(biāo)準(zhǔn)化但保留原始值用于后續(xù)的物理可解釋性分析。3.2 工藝特征球磨、熱等靜壓、退火工藝參數(shù)對 ODS 合金性能的影響不比成分小。機(jī)械合金化時間決定了氧化物是否被打碎并均勻分散時間不夠氧化物粗大時間過長可能引入污染。熱等靜壓溫度決定了致密度和晶粒尺寸溫度低了致密度不夠溫度高了晶粒粗化。退火溫度則影響殘余應(yīng)力和位錯密度。這些參數(shù)里球磨時間、球磨轉(zhuǎn)速、球料比、HIP 溫度、HIP 壓力、退火溫度、退火時間都是常見的特征。但要注意有些參數(shù)之間存在強(qiáng)共線性比如球磨時間和球磨轉(zhuǎn)速往往同步調(diào)整這時候需要用方差膨脹因子VIF篩一遍VIF 大于 10 的特征考慮刪掉或者做 PCA。3.3 特征選擇的實操遞歸特征消除與物理判斷特征不是越多越好。我一般先用遞歸特征消除RFE跑一遍看哪些特征被保留然后結(jié)合物理判斷做最終決定。比如 RFE 可能告訴你退火時間不重要但你知道退火時間影響殘余應(yīng)力而殘余應(yīng)力影響屈服強(qiáng)度這時候就要保留。from sklearn.preprocessing import StandardScaler from sklearn.feature_selection import RFECV from sklearn.linear_model import Ridge from sklearn.model_selection import KFold # 選擇特征列 feature_cols [Cr_wt, Al_wt, Y_wt, O_wt, Ti_wt, MA_time, MA_speed, HIP_temp, HIP_pressure, anneal_temp, anneal_time] X df[feature_cols].values y df[yield_strength].values # 標(biāo)準(zhǔn)化 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 遞歸特征消除 交叉驗證 estimator Ridge(alpha1.0) selector RFECV(estimator, step1, cvKFold(5, shuffleTrue, random_state42), scoringneg_mean_absolute_error) selector.fit(X_scaled, y) # 輸出保留的特征 selected [feature_cols[i] for i in range(len(feature_cols)) if selector.support_[i]] print(保留特征, selected) print(最優(yōu)特征數(shù), selector.n_features_)這段代碼用 Ridge 回歸作為基模型做 RFECV。Ridge 比線性回歸穩(wěn)因為成分特征之間多少有些共線性。step1表示每次刪一個特征雖然慢但更精細(xì)。scoring用負(fù)平均絕對誤差而不是 R2是因為材料數(shù)據(jù)里 R2 容易被幾個極端值拉高M(jìn)AE 更直觀。跑完之后selector.support_是一個布爾數(shù)組告訴你哪些特征被保留了。注意RFECV 的結(jié)果依賴隨機(jī)種子建議換幾個種子跑幾遍取交集作為最終特征集。如果某個特征在多數(shù)種子下都被保留那它大概率是重要的。4. 模型選型與訓(xùn)練從線性回歸到梯度提升樹4.1 為什么我首選梯度提升樹而不是神經(jīng)網(wǎng)絡(luò)材料數(shù)據(jù)通常是小樣本幾十到幾百條特征維度也不高十幾到幾十維。這種場景下梯度提升樹如 XGBoost、LightGBM往往比神經(jīng)網(wǎng)絡(luò)表現(xiàn)更好因為樹模型對特征縮放不敏感、能自動處理非線性、對小樣本過擬合的控制也更容易。神經(jīng)網(wǎng)絡(luò)在數(shù)據(jù)量上千之后才開始有優(yōu)勢而且調(diào)參成本高得多。我一般會先跑一個 Ridge 回歸作為基線然后跑 XGBoost 或 LightGBM最后如果數(shù)據(jù)量夠再試一個簡單的多層感知機(jī)。多數(shù)情況下XGBoost 會比 Ridge 好一截而神經(jīng)網(wǎng)絡(luò)和 XGBoost 的差距在統(tǒng)計上不顯著。4.2 超參數(shù)怎么調(diào)以 XGBoost 為例XGBoost 的關(guān)鍵超參數(shù)有n_estimators樹的數(shù)量、max_depth樹深度、learning_rate學(xué)習(xí)率、subsample行采樣比例、colsample_bytree列采樣比例、reg_alpha和reg_lambda正則化項。小樣本場景下我的經(jīng)驗是max_depth控制在 3–5再深就容易過擬合n_estimators配合learning_rate調(diào)學(xué)習(xí)率 0.05 時樹的數(shù)量可以到 500–1000subsample和colsample_bytree設(shè)在 0.7–0.9 之間增加隨機(jī)性來提升泛化。正則化項reg_alpha和reg_lambda從小值開始試比如 0.1 和 1.0。調(diào)參方法用貝葉斯優(yōu)化比網(wǎng)格搜索效率高scikit-optimize或者optuna都可以。但小樣本下交叉驗證的折數(shù)不要太多5 折足夠折數(shù)多了每折的訓(xùn)練集太小評估結(jié)果反而不可靠。import xgboost as xgb from sklearn.model_selection import cross_val_score, KFold from skopt import BayesSearchCV from skopt.space import Real, Integer # 定義搜索空間 search_space { n_estimators: Integer(200, 1000), max_depth: Integer(3, 6), learning_rate: Real(0.01, 0.2, priorlog-uniform), subsample: Real(0.6, 1.0), colsample_bytree: Real(0.6, 1.0), reg_alpha: Real(1e-3, 10.0, priorlog-uniform), reg_lambda: Real(1e-3, 10.0, priorlog-uniform), } # 貝葉斯優(yōu)化 opt BayesSearchCV( xgb.XGBRegressor(objectivereg:squarederror, random_state42), search_space, n_iter50, cvKFold(5, shuffleTrue, random_state42), scoringneg_mean_absolute_error, random_state42, n_jobs-1, ) opt.fit(X_scaled, y) print(最優(yōu)參數(shù), opt.best_params_) print(最優(yōu) MAE, -opt.best_score_)這段代碼用skopt的BayesSearchCV做超參數(shù)搜索。n_iter50表示搜索 50 組參數(shù)小樣本下這個次數(shù)夠了。priorlog-uniform用于學(xué)習(xí)率和正則化項因為這些參數(shù)在數(shù)量級上變化。scoring同樣用負(fù) MAE。跑完之后opt.best_params_給出最優(yōu)參數(shù)組合opt.best_score_給出對應(yīng)的交叉驗證 MAE。注意貝葉斯優(yōu)化本身也有隨機(jī)性建議換幾個random_state跑幾遍看最優(yōu)參數(shù)是否穩(wěn)定。如果幾遍下來最優(yōu)參數(shù)差異很大說明數(shù)據(jù)量太少模型本身就不穩(wěn)定這時候應(yīng)該回頭考慮擴(kuò)充數(shù)據(jù)或者簡化模型。4.3 模型評估別只看 R2材料數(shù)據(jù)里R2 很容易被幾個極端值拉高。比如你的數(shù)據(jù)里有一個屈服強(qiáng)度 1500 MPa 的樣本模型只要把它預(yù)測準(zhǔn)了R2 就能上去但其他樣本可能預(yù)測得一塌糊涂。所以我一般同時看三個指標(biāo)MAE、RMSE 和 R2并且畫預(yù)測值 vs 真實值的散點圖看誤差是否均勻分布。另外一定要做外部驗證。如果數(shù)據(jù)來自多個來源留出一個來源的數(shù)據(jù)作為測試集而不是隨機(jī)劃分。隨機(jī)劃分會讓同一個來源的數(shù)據(jù)同時出現(xiàn)在訓(xùn)練集和測試集里導(dǎo)致評估結(jié)果過于樂觀。from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score import matplotlib.pyplot as plt # 用最優(yōu)模型做預(yù)測 best_model opt.best_estimator_ y_pred best_model.predict(X_scaled) # 計算指標(biāo) mae mean_absolute_error(y, y_pred) rmse np.sqrt(mean_squared_error(y, y_pred)) r2 r2_score(y, y_pred) print(fMAE: {mae:.2f} MPa) print(fRMSE: {rmse:.2f} MPa) print(fR2: {r2:.3f}) # 畫散點圖 plt.figure(figsize(6, 6)) plt.scatter(y, y_pred, alpha0.7, edgecolorsk) plt.plot([y.min(), y.max()], [y.min(), y.max()], r--, lw2) plt.xlabel(實驗值 (MPa)) plt.ylabel(預(yù)測值 (MPa)) plt.title(屈服強(qiáng)度預(yù)測 vs 實驗) plt.tight_layout() plt.savefig(parity_plot.png, dpi300)這段代碼計算三個指標(biāo)并畫 parity plot。y是實驗值y_pred是預(yù)測值。散點越靠近對角線預(yù)測越準(zhǔn)。如果散點在對角線附近但分布很寬說明模型整體趨勢對但精度不夠如果散點偏離對角線說明模型有系統(tǒng)偏差可能需要檢查特征或數(shù)據(jù)。5. 避坑與排查ODS 合金機(jī)器學(xué)習(xí)設(shè)計里的五個血淚教訓(xùn)5.1 現(xiàn)象交叉驗證 R2 很高但新實驗數(shù)據(jù)預(yù)測全錯原因數(shù)據(jù)泄漏。最常見的情況是同一個成分的不同熱處理條件被隨機(jī)分到了訓(xùn)練集和測試集模型學(xué)到了「這個成分對應(yīng)這個性能」而不是「這個成分加這個工藝對應(yīng)這個性能」。另一個常見原因是在特征工程階段用了全量數(shù)據(jù)做標(biāo)準(zhǔn)化測試集的均值和方差信息泄漏到了訓(xùn)練集。解決按成分分組做交叉驗證確保同一成分的所有樣本要么全在訓(xùn)練集要么全在測試集。標(biāo)準(zhǔn)化只在訓(xùn)練集上 fit然后 transform 測試集。用GroupKFold代替KFold。5.2 現(xiàn)象模型在訓(xùn)練集上 MAE 只有 20 MPa測試集上 200 MPa原因過擬合。小樣本 高維特征 復(fù)雜模型三個條件湊齊了必然過擬合。有時候特征里還有強(qiáng)共線性樹模型雖然能處理但也會加劇過擬合。解決先降特征維度用 RFECV 或者 VIF 篩一遍。然后降低模型復(fù)雜度max_depth降到 3n_estimators減少加正則化。如果還不行考慮用 Ridge 或者 ElasticNet 這類線性模型犧牲一點擬合能力換泛化。5.3 現(xiàn)象Y?O? 含量這個特征在模型里重要性排最后原因Y?O? 含量通常只有 0.3–0.5 wt.%數(shù)值范圍和其他元素差兩個數(shù)量級樹模型在分裂時很少選它因為分裂增益小。但這不代表它不重要而是它的影響可能被其他特征掩蓋了。解決對 Y?O? 含量做單獨處理比如取對數(shù)或者放大 100 倍讓它和其他特征在同一量級?;蛘邩?gòu)造衍生特征比如 Y/O 比、Y?O? 的體積分?jǐn)?shù)。另外可以用 SHAP 值分析看 Y?O? 含量在局部樣本上的貢獻(xiàn)而不是只看全局重要性。5.4 現(xiàn)象蠕變壽命預(yù)測的誤差比屈服強(qiáng)度大一個數(shù)量級原因蠕變壽命本身分散性就大同一個成分不同爐次能差一個數(shù)量級。而且蠕變數(shù)據(jù)通常更少模型學(xué)到的模式有限。另外蠕變壽命和屈服強(qiáng)度的關(guān)系不是線性的用預(yù)測屈服強(qiáng)度的模型去預(yù)測蠕變壽命效果肯定差。解決如果一定要做蠕變壽命預(yù)測先對壽命取對數(shù)把數(shù)量級差異壓平。然后單獨建模不要和屈服強(qiáng)度混在一起。數(shù)據(jù)量不夠的話考慮用遷移學(xué)習(xí)先在屈服強(qiáng)度數(shù)據(jù)上預(yù)訓(xùn)練再在蠕變數(shù)據(jù)上微調(diào)。5.5 現(xiàn)象模型推薦的新成分實驗做出來性能還不如基線原因模型只在訓(xùn)練數(shù)據(jù)覆蓋的成分空間內(nèi)可靠推薦的新成分如果超出了這個空間預(yù)測就是外推不可信。另外模型沒有考慮可制備性比如推薦了一個 Y?O? 含量 2 wt.% 的成分實際上這個含量根本球磨不均勻。解決在推薦新成分時加一個「適用域」檢查用馬氏距離或者核密度估計判斷新成分是否在訓(xùn)練數(shù)據(jù)的分布范圍內(nèi)。超出范圍的標(biāo)記為「外推需謹(jǐn)慎」。同時把可制備性約束加進(jìn)去比如 Y?O? 含量不超過 1 wt.%球磨時間不超過 40 小時。6. 進(jìn)階技巧用 SHAP 值反推物理機(jī)制與主動學(xué)習(xí)閉環(huán)6.1 SHAP 值不只是解釋模型還能幫你找新特征SHAP 值的好處是它能給出每個特征對每個樣本預(yù)測值的貢獻(xiàn)。對于 ODS 合金你可以看 Cr 含量在低 Cr 和高 Cr 樣本上的貢獻(xiàn)是否不同如果不同說明 Cr 的影響是非線性的可以考慮加一個 Cr 的平方項或者分段特征。再比如如果 SHAP 顯示 HIP 溫度和退火溫度的交互作用很強(qiáng)可以構(gòu)造一個「HIP_temp × anneal_temp」的交互特征重新訓(xùn)練模型。import shap # 用訓(xùn)練好的 XGBoost 模型做 SHAP 分析 explainer shap.TreeExplainer(best_model) shap_values explainer.shap_values(X_scaled) # 全局重要性 shap.summary_plot(shap_values, X_scaled, feature_namesselected, showFalse) plt.tight_layout() plt.savefig(shap_summary.png, dpi300) # 單樣本解釋 shap.force_plot(explainer.expected_value, shap_values[0, :], X_scaled[0, :], feature_namesselected, matplotlibTrue, showFalse) plt.tight_layout() plt.savefig(shap_force.png, dpi300)這段代碼用shap.TreeExplainer計算 SHAP 值。summary_plot給出全局特征重要性每個點是一個樣本橫軸是 SHAP 值顏色是特征值大小。force_plot給出單個樣本的預(yù)測解釋紅色推高預(yù)測值藍(lán)色拉低。跑完這兩個圖你就能知道哪些特征在全局重要哪些在局部重要。6.2 主動學(xué)習(xí)讓模型告訴你下一步做哪個實驗主動學(xué)習(xí)的核心思想是不是隨機(jī)選下一個實驗點而是選模型最不確定的那個點。對于 ODS 合金這意味著模型會推薦一個它「最沒把握」的成分你做出來之后無論結(jié)果如何都能最大程度地提升模型。具體流程是先用現(xiàn)有數(shù)據(jù)訓(xùn)練一個模型然后用模型預(yù)測大量候選成分的性能同時計算預(yù)測的不確定性比如用 XGBoost 的預(yù)測方差或者用高斯過程回歸的方差。選不確定性最大的幾個成分做實驗把結(jié)果加入訓(xùn)練集重新訓(xùn)練。循環(huán)幾輪模型精度會快速提升。# 用高斯過程回歸做主動學(xué)習(xí)適合小樣本 from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, ConstantKernel, WhiteKernel # 定義核函數(shù) kernel ConstantKernel(1.0) * RBF(length_scale1.0) WhiteKernel(noise_level0.1) gpr GaussianProcessRegressor(kernelkernel, n_restarts_optimizer10, random_state42) gpr.fit(X_scaled, y) # 生成候選成分在訓(xùn)練數(shù)據(jù)范圍內(nèi)隨機(jī)采樣 np.random.seed(42) candidates np.random.uniform(X_scaled.min(axis0), X_scaled.max(axis0), size(1000, X_scaled.shape[1])) # 預(yù)測均值和方差 y_mean, y_std gpr.predict(candidates, return_stdTrue) # 選不確定性最大的 5 個 top_idx np.argsort(y_std)[-5:] print(推薦實驗候選標(biāo)準(zhǔn)化后的特征) print(candidates[top_idx])這段代碼用高斯過程回歸做主動學(xué)習(xí)。kernel是 RBF 核加白噪聲核RBF 捕捉平滑變化白噪聲處理測量誤差。n_restarts_optimizer10表示優(yōu)化核參數(shù)時重啟 10 次避免局部最優(yōu)。candidates是在訓(xùn)練數(shù)據(jù)范圍內(nèi)隨機(jī)生成的候選成分實際使用時應(yīng)該用你的成分范圍生成。y_std是預(yù)測標(biāo)準(zhǔn)差越大表示模型越不確定。選y_std最大的幾個做實驗就是主動學(xué)習(xí)的核心。注意高斯過程回歸的計算復(fù)雜度是 O(n3)樣本量超過幾百條就會很慢。如果數(shù)據(jù)量大可以用 XGBoost 的預(yù)測方差或者集成模型的方差來代替。6.3 一個我踩過的坑最后說一個我自己的教訓(xùn)。早期做 ODS 合金成分設(shè)計時我花了大量時間調(diào)模型把交叉驗證 MAE 從 80 MPa 壓到了 50 MPa覺得差不多了就推薦了幾個新成分去做實驗。結(jié)果做出來三個成分兩個性能不如基線一個勉強(qiáng)持平?;仡^分析才發(fā)現(xiàn)我的訓(xùn)練數(shù)據(jù)里 Cr 含量集中在 12–14%但我推薦的成分 Cr 到了 16%超出了適用域。模型在 16% Cr 上的預(yù)測完全是外推不可信。后來我養(yǎng)成了一個習(xí)慣每次推薦新成分之前先算一下這個成分到訓(xùn)練集最近鄰的馬氏距離超過閾值的直接標(biāo)記為「外推需謹(jǐn)慎」。這個習(xí)慣幫我省了不少實驗成本。另外主動學(xué)習(xí)不要一次推薦太多一輪做 3–5 個就夠了做完馬上更新模型再推薦下一輪。貪多嚼不爛實驗資源有限每一步都要走得穩(wěn)。希望幫到你。本文還有配套的精品資源點擊獲取