4. 机器学习基础回顾:监督学习、无监督学习与模型评估
各位同学,咱们今天聊点实在的。机器学习在材料科学里到底怎么用?说白了,就是让计算机从数据里找规律。我刚开始接触这个领域时,也觉得这东西玄乎,后来做了几个项目才明白——其实没那么复杂。
今天这一章,我带你快速过一遍机器学习的核心概念。别怕,咱们不搞数学推导,只讲你用得上的东西。
4.1 监督学习:回归与分类
监督学习,说白了就是“有老师带着学”。你给计算机一堆输入和对应的正确答案,让它自己琢磨出映射关系。材料科学里最常见的就是两类任务:回归和分类。
4.1.1 回归:预测连续值
回归任务,就是预测一个连续的数值。比如预测合金的屈服强度、预测电池的循环寿命、预测材料的带隙能量。这些都是回归问题。
我记得有一次做高熵合金项目,要预测不同成分组合的硬度。我们收集了200多组实验数据,用随机森林回归模型训练。结果还不错,预测误差控制在5%以内。嗯,这里有个坑——数据量太少时,复杂模型容易翻车。
- 线性回归(简单快速,但只能捕捉线性关系)
- 决策树回归(能处理非线性,但容易过拟合)
- 随机森林回归(集成方法,稳定性好,我常用这个)
- 支持向量回归(SVR,适合小样本数据)
- 神经网络回归(数据量大时效果好,但调参麻烦)
# 一个简单的随机森林回归示例
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
# 假设 X 是特征(成分、工艺参数等),y 是目标(强度)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = RandomForestRegressor(n_estimators=100, max_depth=10)
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
print(f"R²分数: {model.score(X_test, y_test):.3f}")
4.1.2 分类:预测离散类别
分类任务,就是判断样本属于哪一类。比如判断一种材料是导体、半导体还是绝缘体,或者判断某个工艺参数组合是否会导致材料失效。
我个人习惯,做分类任务时先看数据是否平衡。如果正负样本比例悬殊,模型会偷懒——全预测成多数类,准确率还挺高,但实际没用。
| 算法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 逻辑回归 | 二分类,概率输出 | 可解释性强 | 线性决策边界 |
| K近邻(KNN) | 小样本,低维数据 | 无需训练 | 计算量大 |
| 支持向量机(SVM) | 高维数据,小样本 | 泛化能力强 | 调参复杂 |
| 随机森林 | 多分类,高维数据 | 鲁棒性好 | 模型较大 |
4.2 无监督学习:聚类与降维
无监督学习,就是“没有老师,自己找规律”。你只给计算机输入数据,不给标签,让它自己发现数据中的结构。这在材料科学里特别有用——比如发现新的材料类别、识别异常数据。
4.2.1 聚类:发现数据中的群组
聚类就是把相似的数据点归到一起。比如你有1000种材料的成分数据,想看看它们天然分成几类。K-means是最常用的方法,但有个问题——你得事先指定类别数K。
我建议用肘部法则来确定K值。画一条曲线,横轴是K值,纵轴是误差平方和。曲线拐弯的地方,就是合适的K。你想想看,这就像选衣服尺码——太小了不舒服,太大了不合身。
- 发现新的材料家族(比如新型高温合金)
- 识别实验中的异常数据(可能是测量误差)
- 对材料性能进行分级(比如强度等级)
4.2.2 降维:简化数据,保留关键信息
降维,就是把高维数据压缩到低维,同时尽量保留原始信息。为什么需要降维?因为材料数据往往特征很多——成分、工艺参数、微观结构特征,加起来几十上百维。直接分析,眼睛都看花了。
主成分分析(PCA)是我最常用的降维方法。它找到数据中方差最大的方向,把数据投影上去。说白了,就是找到最重要的几个“综合特征”。
# PCA降维示例
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 假设 X 是1000种材料的50维特征
pca = PCA(n_components=2) # 降到2维
X_reduced = pca.fit_transform(X)
# 看看前两个主成分解释了多大比例的信息
print(f"解释方差比例: {pca.explained_variance_ratio_}")
print(f"累计解释方差: {sum(pca.explained_variance_ratio_):.3f}")
# 可视化
plt.scatter(X_reduced[:, 0], X_reduced[:, 1])
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')
plt.show()
4.3 模型评估与交叉验证
模型建好了,怎么知道它好不好?不能只看训练集上的表现——那叫“自欺欺人”。我见过太多人,模型在训练集上得分99%,一上测试集就掉到60%。
4.3.1 评估指标
不同任务用不同指标。回归任务看均方误差(MSE)和R²分数。分类任务看准确率、精确率、召回率和F1分数。
我个人习惯,回归任务先看R²,它告诉你模型解释了多大比例的方差。R²接近1说明好,接近0说明模型还不如直接猜平均值。
| 任务类型 | 常用指标 | 说明 |
|---|---|---|
| 回归 | MSE, RMSE, MAE, R² | MSE对异常值敏感,MAE更稳健 |
| 分类 | 准确率, 精确率, 召回率, F1 | 数据不平衡时别只看准确率 |
| 聚类 | 轮廓系数, 戴维森堡丁指数 | 没有真实标签时的评估方法 |
4.3.2 交叉验证
交叉验证,就是把数据分成几份,轮流做训练和测试。最常用的是K折交叉验证(K=5或10)。
为什么要这么做?因为单次划分可能运气好或运气差。交叉验证能给你一个更稳定的性能估计。我曾经做过一个项目,单次划分测试集得分0.85,但5折交叉验证的平均分只有0.72——差距很大。
# 5折交叉验证示例
from sklearn.model_selection import cross_val_score
model = RandomForestRegressor(n_estimators=100)
scores = cross_val_score(model, X, y, cv=5, scoring='r2')
print(f"每折得分: {scores}")
print(f"平均得分: {scores.mean():.3f} ± {scores.std():.3f}")
4.4 过拟合与正则化
过拟合,就是模型把训练数据背下来了,但遇到新数据就懵了。你想想看,这就像学生只背了考试原题,题目一换就不会了。
怎么判断过拟合?训练集得分远高于测试集得分,就是典型信号。我见过最夸张的一次,训练集R²=0.99,测试集R²=0.12——模型基本废了。
4.4.1 防止过拟合的方法
- 增加数据量: 最直接的方法,但材料实验数据往往很贵
- 简化模型: 减少特征数量,降低模型复杂度
- 正则化: 给损失函数加惩罚项,让模型参数不要太大
- 早停法: 训练过程中监控验证集性能,一旦开始下降就停止
- Dropout: 神经网络中随机丢弃一些神经元,防止共适应
4.4.2 正则化详解
正则化,说白了就是给模型“上枷锁”。L1正则化(Lasso)会让一些特征系数变成0,相当于自动做特征选择。L2正则化(Ridge)会让系数变小但不为0。
我建议,如果你特征很多但大部分没用,用L1正则化。如果所有特征都有用但需要控制模型复杂度,用L2正则化。当然,也可以两者结合——弹性网络(Elastic Net)。
# L2正则化(岭回归)示例
from sklearn.linear_model import Ridge
# alpha是正则化强度,越大惩罚越重
model = Ridge(alpha=1.0)
model.fit(X_train, y_train)
print(f"训练集R²: {model.score(X_train, y_train):.3f}")
print(f"测试集R²: {model.score(X_test, y_test):.3f}")
知识体系总览
下面这张图,把今天讲的内容串起来了。你可以把它当作一个快速参考——做项目时忘了哪个概念,回来瞄一眼就行。
好了,这一章的内容就到这里。机器学习的基础概念,说白了就是这些——监督学习、无监督学习、模型评估、过拟合处理。你把这些搞明白了,后面讲材料设计的具体应用时,就不会觉得云里雾里。
记住,做材料科学中的机器学习项目,数据质量比模型复杂度更重要。我见过太多人花大量时间调模型参数,却忽略了数据本身的问题。先把数据搞清楚,模型自然就work了。