| 机器学习术语 | 材料科学含义 | 示例 |
|---|---|---|
| 样本 | 一组材料记录 | 某成分合金的一次实验 |
| 特征 | 可用于建模的变量 | C、Cr、Ni、热处理温度 |
| 标签 | 要预测的目标 | 抗拉强度、硬度、相类别 |
| 模型 | 输入到输出的映射 | 随机森林、支持向量机 |
| 损失 | 预测偏差度量 | MSE、交叉熵 |
正确定义样本、特征和标签,是建模的第一步。
目标:预测合金屈服强度。
σ^y=f(wC,wCr,wNi,Taging,taging,⋯)
其中:
输出是连续变量,因此属于回归问题。
目标:预测凝固后主要相类别。
c^=f(wCr,wNi,wMo,R,G,⋯)
可能类别:
输出是离散类别,因此属于分类问题。
目标:在没有明确标签时发现材料样本之间的结构。
材料机器学习建模通常包括:
建模流程比单个算法更重要。
一般划分方式:
D=Dtrain∪Dval∪Dtest
并要求:
Dtrain∩Dtest=∅
测试集必须模拟“未来未知材料”的预测场景。
训练模型需要定义“预测错了多少”。
回归常用均方误差:
MSE=n1i=1∑n(yi−y^i)2
分类常用交叉熵:
L=−n1i=1∑nk=1∑Kyiklog(p^ik)
损失函数决定模型训练时“惩罚什么”。
模型在训练集上误差小,不代表在未知材料上表现好。
机器学习模型可以学习统计规律,但不自动等同于物理机理。
可靠的材料 AI 应同时尊重数据证据与物理约束。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
df = pd.read_csv("materials_strength.csv")
X = df[["C", "Cr", "Ni", "aging_T", "aging_t"]]
y = df["yield_strength"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=0
)
model = RandomForestRegressor(random_state=0)
model.fit(X_train, y_train)
pred = model.predict(X_test)
print(mean_absolute_error(y_test, pred))
下一节进入核心问题:如何把材料对象转化为机器可以学习的特征?
特征决定模型能看到什么,模型决定如何利用这些信息。
机器学习模型通常不能直接理解“Fe-18Cr-8Ni”或显微组织图像。
需要将材料对象转化为数值向量:
Material→x=[x1,x2,…,xp]
特征工程的目标:
| 描述符类型 | 来源 | 示例 | 适用任务 |
|---|---|---|---|
| 成分描述符 | 化学式或质量分数 | 平均原子序数、混合熵 | 性能预测、相预测 |
| 工艺描述符 | 制备与热处理 | 温度、时间、冷却速率 | 工艺优化 |
| 组织描述符 | 显微组织 | 晶粒尺寸、相分数 | 强度、韧性预测 |
| 结构描述符 | 晶体结构 | 晶格常数、配位数 | DFT数据建模 |
| 谱图描述符 | XRD/EDS/EBSD | 峰位、峰强、纹理 | 相识别、缺陷识别 |
对于多元合金,设第 e 个元素的摩尔分数为 xe,可构造:
Zˉ=e∑xeZe
ΔZ=e∑xe(Ze−Zˉ)2
其中:
这种思路也可用于原子半径、电负性、价电子数等元素属性。
高熵合金中常用构型混合熵描述成分复杂性:
ΔSmix=−Re=1∑mxelnxe
其中:
若等摩尔成分满足 xe=1/m,则:
ΔSmix=Rlnm
工艺变量常具有强烈的非线性影响。
常见工艺描述符包括:
显微组织可转化为统计特征:
组织描述符通常比原始图像更可解释,但可能损失空间信息。
同一物理量在不同文献中可能使用不同单位。
| 变量 | 常见单位 | 统一建议 |
|---|---|---|
| 强度 | MPa、GPa | MPa |
| 硬度 | HV、HRC、GPa | 明确量纲并避免混用 |
| 温度 | K、℃ | K 或 ℃,全表一致 |
| 时间 | s、min、h | s 或 h,记录换算 |
| 腐蚀速率 | mm/y、A/cm² | 按任务统一 |
单位不统一会造成模型学习到错误规律。
材料数据中常有非数值变量:
常用编码方式:
不能随意把“铸造=1,轧制=2,增材=3”当作有序数值。
标准化将特征变换为均值为 0、标准差为 1 的尺度:
z=sx−μ
其中 μ 和 s 只能由训练集计算。
适合标准化的模型:
随机森林和决策树通常对单调缩放不敏感,但统一预处理仍有助于流程管理。
Min-Max 归一化将特征缩放到指定区间:
x′=xmax−xminx−xmin
常见范围为 [0,1]。
注意:
材料性能常由多个变量共同控制,而非单个变量独立决定。
可构造交互项:
xCrNi=wCrwNi
xGT=G⋅Rcool
示例:
交互特征应有物理意义,不能无限制扩展。
特征过多会带来问题:
特征选择策略:
Pearson 相关系数用于衡量线性相关:
rxy=∑i=1n(xi−xˉ)2
解释:
相关系数只能识别线性关系,不能证明因果性。
材料描述符常高度相关。例如:
共线性后果:
处理方法:
数据泄漏是指模型在训练时使用了预测时不可获得的信息。
常见错误:
正确做法:所有预处理参数都应只从训练集学习。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
pipe = Pipeline([
("scaler", StandardScaler()),
("model", Ridge(alpha=1.0))
])
scores = cross_val_score(
pipe, X, y, cv=5, scoring="neg_mean_absolute_error"
)
print(-scores.mean())
Pipeline 会在每个交叉验证折内独立执行标准化和训练。
matminer 是材料信息学中常用的 Python 工具之一,可从成分、结构、能带和态密度等数据生成描述符。
示例思路:
from matminer.featurizers.composition import ElementProperty
from pymatgen.core import Composition
comp = Composition("Fe0.7Ni0.3")
featurizer = ElementProperty.from_preset("magpie")
features = featurizer.featurize(comp)
自动描述符生成可以提高效率,但仍需进行物理审查与特征筛选。
下一节讨论如何利用这些特征建立回归模型。
回归模型回答:材料性能数值是多少?
回归任务预测连续变量:
y^=f(x)
材料案例:
关键问题:如何在有限样本下获得稳定且可解释的预测?
线性回归假设目标值是特征的线性组合:
y^=w0+j=1∑pwjxj
向量形式:
y^=Xw
模型优点:
缺点:难以表达强非线性关系。
普通最小二乘通过最小化残差平方和确定参数:
wmini=1∑n(yi−xiTw)2
矩阵形式的闭式解为:
w^=(XTX)−1XTy
条件:XTX 可逆。
当特征强相关或特征数接近样本数时,普通最小二乘容易不稳定。
假设:
σ^y=w0+w1wC+w2wCr+w3Taging
若 w1>0,可解释为在其他变量不变时,C 含量提高与强度提高相关。
注意:
岭回归在最小二乘基础上惩罚大系数:
wmin[i=1∑n(yi−xiTw)2+αj=1∑pwj2]
其中 α 控制正则化强度。
作用:
α 太大可能导致欠拟合。
from sklearn.linear_model import Ridge
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
pipe = Pipeline([
("scaler", StandardScaler()),
("ridge", Ridge())
])
param_grid = {"ridge__alpha": [0.01, 0.1, 1, 10, 100]}
search = GridSearchCV(pipe, param_grid, cv=5, scoring="neg_mean_absolute_error")
search.fit(X_train, y_train)
print(search.best_params_)
模型误差可概念性分解为:
Error=Bias2+Variance+Noise
解释:
材料数据中噪声常来自:实验误差、批次差异、文献条件不一致。
随机森林由多棵决策树组成,通过集成降低方差:
y^=B1b=1∑BTb(x)
其中:
优点:
决策树把特征空间不断切分为子区域。
每个叶节点输出该区域样本均值:
y^Rm=∣Rm∣1xi∈Rm∑yi
切分目标:让子区域内部性能值尽量一致。
材料解释示例:
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error, r2_score
rf = RandomForestRegressor(
n_estimators=300,
max_depth=None,
min_samples_leaf=2,
random_state=0
)
rf.fit(X_train, y_train)
pred = rf.predict(X_test)
print("MAE:", mean_absolute_error(y_test, pred))
print("R2:", r2_score(y_test, pred))
随机森林可评估特征对预测的贡献。
常见做法:
注意:
对材料问题,应把特征重要性看作提出机理假设的线索,而非最终结论。
SVR 的核心思想:允许误差落在 ε 管内而不惩罚。
损失函数可表示为:
Lε(y,y^)=max(0,∣y−y^∣−ε)
特点:
核函数将原始空间中的非线性问题转化为高维空间中的线性问题。
常用 RBF 核:
K(xi,xj)=exp(−γ∥xi−xj∥2)
参数含义:
C 和 γ 过大时容易过拟合。
from sklearn.svm import SVR
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
pipe = Pipeline([
("scaler", StandardScaler()),
("svr", SVR(kernel="rbf"))
])
param_grid = {
"svr__C": [1, 10, 100],
"svr__gamma": [0.01, 0.1, 1],
"svr__epsilon": [0.01, 0.1]
}
search = GridSearchCV(pipe, param_grid, cv=5, scoring="neg_mean_absolute_error")
search.fit(X_train, y_train)
| 模型 | 优点 | 局限 | 材料应用建议 |
|---|---|---|---|
| 线性回归 | 简单可解释 | 难表征非线性 | 基准模型 |
| 岭回归 | 稳定、抗共线性 | 仍主要线性 | 小样本、多特征 |
| 随机森林 | 非线性、鲁棒 | 外推能力有限 | 性能预测常用 |
| SVR | 适合中小样本 | 调参敏感 | 小样本非线性问题 |
假设强度预测 MAE 为 35 MPa。
需要判断:
数学误差需要转化为材料工程意义,才有实际价值。
机器学习论文中最常见的问题不是算法不够复杂,而是评估不够严格。
下一节讨论离散类别预测:分类模型。
分类模型回答:材料属于哪一类?
分类任务预测离散类别:
c^=f(x),c∈{1,2,…,K}
材料分类案例:
二分类:
y∈{0,1}
例如:材料是否发生点蚀、样品是否达标。
多分类:
y∈{1,2,…,K}
例如:相类别为铁素体、奥氏体、马氏体或混合组织。
分类问题不仅要给出类别,还应尽量给出置信度或概率。
逻辑回归首先计算线性得分:
z=w0+wTx
再通过 Sigmoid 函数转化为概率:
p(y=1∣x)=1+exp(−z)1
决策规则:
y^={1,0,p≥0.5p<0.5
示例:预测不锈钢是否以奥氏体为主。
输入特征:
模型输出:
pγ=p(y=γ∣x)
解释:pγ=0.82 表示模型认为奥氏体主导的概率较高,但仍需结合相图和实验验证。
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report
pipe = Pipeline([
("scaler", StandardScaler()),
("clf", LogisticRegression(max_iter=1000))
])
pipe.fit(X_train, y_train)
pred = pipe.predict(X_test)
print(classification_report(y_test, pred))
二分类混淆矩阵:
| 实际/预测 | 预测正类 | 预测负类 |
|---|---|---|
| 实际正类 | TP | FN |
| 实际负类 | FP | TN |
材料案例:预测“是否耐蚀合格”。
准确率:
Accuracy=TP+TN+FP+FNTP+TN
精确率:
Precision=TP+FPTP
召回率:
Recall=TP+FNTP
F1 值:
F1=Precision+Recall2⋅Precision⋅Recall
如果任务是筛选高可靠材料:
不同应用偏好不同:
指标选择应服务于实际工程风险。
决策树通过一系列规则划分样本:
常用划分准则:
G=1−k=1∑Kpk2
其中 G 为 Gini 不纯度,pk 为节点中第 k 类比例。
节点信息熵为:
H=−k=1∑Kpklog2pk
解释:
熵可以看作类别混杂程度的度量。
优点:
风险:
改进:
线性 SVM 寻找最大间隔分类超平面:
wTx+b=0
优化思想:
w,bmin21∥w∥2
并使样本尽可能满足正确分类约束。
最大间隔有助于提升泛化能力,适合中小样本分类。
实际材料数据可能不可完全线性分离,引入松弛变量:
w,b,ξmin21∥w∥2+Ci=1∑nξi
其中:
C 大:训练集拟合更强,但可能过拟合。
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
pipe = Pipeline([
("scaler", StandardScaler()),
("svc", SVC(kernel="rbf", probability=True))
])
param_grid = {
"svc__C": [0.1, 1, 10, 100],
"svc__gamma": [0.01, 0.1, 1]
}
search = GridSearchCV(pipe, param_grid, cv=5, scoring="f1_macro")
search.fit(X_train, y_train)
材料数据中常出现类别不平衡:
问题:
处理:重采样、类别权重、改用 F1 或 AUC 指标。
| 模型 | 优点 | 局限 | 材料应用建议 |
|---|---|---|---|
| 逻辑回归 | 可解释,输出概率 | 决策边界简单 | 基准分类模型 |
| 决策树 | 规则直观 | 易过拟合 | 解释工艺阈值 |
| 随机森林 | 稳定、非线性 | 外推弱 | 多变量分类 |
| SVM | 中小样本有效 | 需要标准化和调参 | 相分类、缺陷分类 |
下一节讨论无标签数据中的结构发现:聚类、降维与关联规则。
无监督学习帮助我们先看清数据,再建立模型。
无监督学习不依赖目标标签 y,只分析输入数据 X。
主要目标:
在材料数据稀缺时,无监督分析常用于形成后续研究假设。
K-means 将样本划分为 K 个簇,使簇内平方距离最小:
C1,…,CKmink=1∑Kxi∈Ck∑∥xi−μk∥2
其中 μk 为第 k 个簇的中心。
材料应用:
K-means 的假设较强:
材料数据注意:
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
pipe = Pipeline([
("scaler", StandardScaler()),
("kmeans", KMeans(n_clusters=3, random_state=0, n_init="auto"))
])
cluster_id = pipe.fit_predict(X)
df["cluster"] = cluster_id
print(df.groupby("cluster").mean(numeric_only=True))
聚类编号本身没有物理意义,物理意义来自簇内样本的共同特征。
PCA 寻找最大方差方向,将高维数据投影到低维空间。
协方差矩阵:
S=n−11XTX
特征值分解:
Svj=λjvj
其中 vj 为第 j 个主成分方向,λj 表示该方向方差大小。
PCA 可以帮助回答:
注意:
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import pandas as pd
X_scaled = StandardScaler().fit_transform(X)
pca = PCA(n_components=2)
Z = pca.fit_transform(X_scaled)
print("Explained ratio:", pca.explained_variance_ratio_)
pc_df = pd.DataFrame(Z, columns=["PC1", "PC2"])
pc_df["property"] = y.values
降维常用于二维或三维可视化。
常见图形:
降维图不能直接证明机理,但可辅助发现样本分布、材料族群和异常记录。
关联规则描述变量组合之间的共现关系。
规则形式:
A⇒B
支持度:
support(A⇒B)=P(A∩B)
置信度:
confidence(A⇒B)=P(B∣A)
提升度:
lift(A⇒B)=P(A)P(B)P(A∩B)
规则示例:
{wCr>12%, wNi>8%}⇒{high corrosion resistance}
解释时需要注意:
无监督学习适合“探索”,不适合单独作为最终证据。
下一节进入机器学习建模最关键环节:模型评估。
没有可靠评估的模型,不应进入材料设计决策。
材料机器学习中常见样本量有限,模型容易“看起来很好”。
评估要回答:
模型性能必须在严格未见数据上评估。
平均绝对误差:
MAE=n1i=1∑n∣yi−y^i∣
特点:
示例:强度预测 MAE 为 30 MPa,可直接与实验误差或工程容差比较。
均方根误差:
RMSE=n1i=1∑n(yi−y^i)2
特点:
若 RMSE 远大于 MAE,说明可能存在少数大误差样本。
决定系数:
R2=1−∑i=1n(yi−yˉ)2∑i=1n(yi−y^i)2
解释:
R2 受目标变量分布影响,应与 MAE、RMSE 一起报告。
分类评估应根据任务风险选择指标。
| 指标 | 适用场景 | 风险关注 |
|---|---|---|
| Accuracy | 类别较均衡 | 总体正确率 |
| Precision | 误报代价高 | 减少 FP |
| Recall | 漏报代价高 | 减少 FN |
| F1 | 类别不平衡 | 平衡 Precision 与 Recall |
| ROC-AUC | 二分类排序能力 | 阈值变化下表现 |
将数据划分为训练集和测试集:
D=Dtrain∪Dtest
优点:
缺点:
材料小样本任务通常需要交叉验证。
K 折交叉验证将数据划分为 K 个子集。
每次使用一个子集测试,其余子集训练:
CV=K1k=1∑KMk
其中 Mk 为第 k 折的评价指标。
优点:
from sklearn.model_selection import KFold, cross_validate
from sklearn.ensemble import RandomForestRegressor
cv = KFold(n_splits=5, shuffle=True, random_state=0)
model = RandomForestRegressor(random_state=0)
result = cross_validate(
model, X, y, cv=cv,
scoring=["neg_mean_absolute_error", "r2"],
return_train_score=True
)
print(-result["test_neg_mean_absolute_error"].mean())
print(result["test_r2"].mean())
普通随机 K 折可能不适合所有材料数据。
应考虑:
可使用 GroupKFold:
from sklearn.model_selection import GroupKFold
cv = GroupKFold(n_splits=5)
分组交叉验证更接近真实外推场景。
超参数不是由模型直接训练得到,而是由研究者设定。
示例:
调参方法:
调参必须在训练集或交叉验证内部完成,不能使用测试集调参。
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestRegressor
param_grid = {
"n_estimators": [100, 300, 500],
"max_depth": [None, 5, 10],
"min_samples_leaf": [1, 2, 5]
}
search = GridSearchCV(
RandomForestRegressor(random_state=0),
param_grid=param_grid,
cv=5,
scoring="neg_mean_absolute_error"
)
search.fit(X_train, y_train)
print(search.best_params_)
学习曲线观察训练样本数对误差的影响。
典型判断:
材料小样本研究应报告模型对样本量的敏感性。
残差定义为:
ei=yi−y^i
残差分析关注:
残差图常比单一平均误差更能揭示模型问题。
材料设计常要求预测训练数据之外的成分或工艺。
外推风险来源:
判断方式:
点预测不足以支撑材料决策。
更合理的表达形式:
y^±u
其中 u 表示预测不确定性。
不确定性来源:
在材料筛选中,高预测值但高不确定性的候选样本应谨慎处理。
一份基本合格的材料机器学习评估报告应包含:
应避免:
建议改写:
下一节把这些方法用于具体材料性能预测案例。
案例不是展示算法,而是训练完整建模思维。
任务:预测合金屈服强度或抗拉强度。
输入特征:
输出:
σ^y=f(x)
评价:MAE、RMSE、R2,并检查高强度区域残差。
可能有效的材料描述符:
Hall-Petch 关系提示:
σy=σ0+kd−1/2
因此可加入 d−1/2 作为特征。
features = [
"C", "Cr", "Ni", "Mo", "aging_T", "aging_t",
"grain_size", "phase_fraction"
]
X = df[features].copy()
X["grain_size_inv_sqrt"] = 1.0 / (X["grain_size"] ** 0.5)
y = df["yield_strength"]
model = RandomForestRegressor(
n_estimators=300, min_samples_leaf=2, random_state=0
)
model.fit(X_train, y_train)
将机理启发特征加入机器学习流程,可提高模型可解释性。
任务:预测材料硬度。
输入可能包括:
注意:
硬度数据的可靠建模要求记录:
| 项目 | 需要记录的内容 |
|---|---|
| 硬度类型 | HV、HRC、HB、纳米硬度 |
| 载荷 | 例如 HV0.2、HV1、HV10 |
| 测试位置 | 基体、焊缝、热影响区 |
| 样品状态 | 铸态、轧制态、时效态 |
| 重复次数 | 平均值与标准差 |
如果测试条件混杂,模型误差可能来自数据定义不一致。
任务:预测材料最终相类别或相分数。
类别预测:
c^∈{α,γ,M,mixed}
相分数预测:
f^γ=f(x),0≤f^γ≤1
输入特征:成分、冷却速率、温度梯度、热处理路径。
类别模型适合粗略判断,相分数回归更适合定量组织预测。
相组成预测不能脱离相图和热力学约束。
可加入:
热力学计算结果可作为机器学习特征,而不是只依赖原始成分。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import confusion_matrix, classification_report
X = df[["Cr_eq", "Ni_eq", "cooling_rate", "G", "V"]]
y = df["phase_class"]
pipe = Pipeline([
("scaler", StandardScaler()),
("svc", SVC(kernel="rbf", class_weight="balanced"))
])
pipe.fit(X_train, y_train)
pred = pipe.predict(X_test)
print(confusion_matrix(y_test, pred))
腐蚀性能建模有两类目标:
回归目标:
分类目标:
腐蚀性能强烈依赖环境条件:
若使用电化学腐蚀电流密度,可通过经验公式换算腐蚀速率:
vcorr=KρicorrEW
其中:
建模前必须确认目标变量定义一致,否则不同来源数据不可直接合并。
以材料强度预测为例:
from sklearn.model_selection import train_test_split, cross_validate
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
features = ["C", "Cr", "Ni", "Mo", "aging_T", "aging_t", "grain_size"]
X = df[features]
y = df["yield_strength"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
model = RandomForestRegressor(n_estimators=300, random_state=42)
model.fit(X_train, y_train)
建议按以下结构解释模型结果:
机器学习与材料性能预测的逻辑链条:
Data→Descriptor→Model→Validation→Decision
对应材料科学过程:
Composition→Processing→Microstructure→Property
可靠模型不是只会预测,而是能说明数据来源、适用边界和误差风险。
请用“数据范围—模型假设—误差来源—材料机理”的逻辑回答。
要求:
import numpy as np
import pandas as pd
from sklearn.model_selection import cross_validate, KFold
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
from sklearn.ensemble import RandomForestRegressor
rng = np.random.default_rng(0)
n = 120
df = pd.DataFrame({
"C": rng.uniform(0.05, 0.8, n),
"Cr": rng.uniform(0.0, 18.0, n),
"Ni": rng.uniform(0.0, 12.0, n),
"aging_T": rng.uniform(450, 750, n),
"aging_t": rng.uniform(0.5, 20.0, n)
})
df["strength"] = 300 + 250*df["C"] + 5*df["Cr"] + 3*df["Ni"] \
+ 0.15*df["aging_T"] - 0.8*df["aging_t"] + rng.normal(0, 25, n)
X = df[["C", "Cr", "Ni", "aging_T", "aging_t"]]
y = df["strength"]
cv = KFold(n_splits=5, shuffle=True, random_state=0)
models = {
"Ridge": Pipeline([
("scaler", StandardScaler()),
("model", Ridge(alpha=1.0))
]),
"RandomForest": RandomForestRegressor(
n_estimators=300, min_samples_leaf=2, random_state=0
)
}
for name, model in models.items():
res = cross_validate(model, X, y, cv=cv,
scoring=["neg_mean_absolute_error", "r2"])
print(name, -res["test_neg_mean_absolute_error"].mean(),
res["test_r2"].mean())
推荐学习顺序:先掌握数据划分和评估,再学习更复杂模型。