4. 特征工程(上):元素属性特征(电负性、原子半径、价电子数)的提取与组合
各位同学,咱们今天聊聊特征工程。说实话,在材料基因组学这个领域,我见过太多人一上来就扔模型,结果跑出来的结果惨不忍睹。为什么?因为特征没做好。你想想看,模型再厉害,喂进去的是垃圾,出来的只能是更精致的垃圾。
我个人习惯,做任何材料预测项目之前,至少花40%的时间在特征工程上。今天我们先讲最基础、也最核心的一类特征——元素属性特征。
4.1 为什么元素属性这么重要?
材料是由元素组成的。这个道理很简单,但很多人做特征时反而忽略了。我记得有一次,一个学生拿了一堆钙钛矿的数据来问我,说模型准确率死活上不去。我一看他的特征,全是结构参数,元素本身的属性一个都没用。我说你试试把电负性加进去,结果准确率直接提升了15%。
元素属性特征,说白了就是给每个元素贴标签。这些标签包括:
- 电负性:元素吸引电子的能力
- 原子半径:原子的大小
- 价电子数:参与成键的电子数量
- 还有电离能、电子亲和能、原子序数等等
这些属性直接决定了元素之间的相互作用方式。你想想看,一个电负性高的元素和一个电负性低的元素放在一起,会发生什么?电荷转移。这就会影响材料的带隙、导电性、催化活性等等。
4.2 电负性:最被低估的特征
电负性这个概念,Pauling在1932年就提出来了。但直到今天,它仍然是材料特征工程中最有用的特征之一。
我在做高熵合金项目时遇到过一个问题:预测合金的相稳定性。一开始用了很多复杂的特征,效果一般。后来我尝试把组成元素的电负性差异作为一个特征加进去,结果模型的R²从0.72提升到了0.89。
为什么会这样?因为电负性差异直接反映了电荷转移的倾向。电荷转移越强,形成的化学键越稳定,相稳定性就越高。
常用的电负性标度有几种:
| 标度名称 | 提出者 | 特点 |
|---|---|---|
| Pauling标度 | Linus Pauling | 最常用,基于键能数据 |
| Mulliken标度 | Robert Mulliken | 基于电离能和电子亲和能 |
| Allen标度 | Leland Allen | 基于光谱数据,更精确 |
我个人建议,做特征工程时优先用Pauling标度,因为数据最全,几乎所有元素都有。如果精度要求高,可以试试Allen标度。
4.3 原子半径:大小决定一切
原子半径这个特征,很多人觉得太简单了,不就是个大小吗?其实不然。原子半径直接影响材料的很多性质:
- 晶格常数:原子越大,晶格常数越大
- 扩散系数:原子越小,扩散越快
- 固溶度:原子半径差异越大,固溶度越低
- 力学性能:原子半径差异会导致晶格畸变,影响强度
我曾经做过一个项目,预测镁合金的屈服强度。一开始用了很多特征,包括成分、热处理参数等,效果还行。但后来我尝试把原子半径差异作为一个特征,模型的预测误差从±30MPa降到了±15MPa。
这里要注意一个坑:原子半径有多种定义方式。有共价半径、金属半径、离子半径、范德华半径等等。不同定义下数值差异很大。我曾经因为用了离子半径去预测金属间化合物的性质,结果完全不对。后来才意识到,金属间化合物应该用金属半径。
4.4 价电子数:电子决定性能
价电子数,就是元素最外层参与成键的电子数量。这个特征在预测电子相关性质时特别有用,比如:
- 导电性:价电子数越多,自由电子越多,导电性越好
- 磁性:未成对价电子数决定磁矩大小
- 催化活性:d轨道价电子数影响催化性能
我记得有一次做热电材料预测,需要预测Seebeck系数。试了很多特征都不行,后来我想到价电子数这个特征。为什么?因为Seebeck系数和载流子浓度直接相关,而载流子浓度又和价电子数相关。把这个特征加进去后,模型的预测能力提升了一大截。
价电子数的提取其实很简单,看元素周期表就行:
# 一个简单的价电子数提取函数
def get_valence_electrons(element):
# 主族元素:价电子数 = 族数
main_group = {
'H':1, 'Li':1, 'Na':1, 'K':1, 'Rb':1, 'Cs':1,
'Be':2, 'Mg':2, 'Ca':2, 'Sr':2, 'Ba':2,
'B':3, 'Al':3, 'Ga':3, 'In':3, 'Tl':3,
'C':4, 'Si':4, 'Ge':4, 'Sn':4, 'Pb':4,
'N':5, 'P':5, 'As':5, 'Sb':5, 'Bi':5,
'O':6, 'S':6, 'Se':6, 'Te':6, 'Po':6,
'F':7, 'Cl':7, 'Br':7, 'I':7, 'At':7,
'He':2, 'Ne':2, 'Ar':2, 'Kr':2, 'Xe':2
}
# 过渡金属:价电子数 = d电子数 + s电子数
transition_metals = {
'Sc':3, 'Ti':4, 'V':5, 'Cr':6, 'Mn':7,
'Fe':8, 'Co':9, 'Ni':10, 'Cu':11, 'Zn':12
}
if element in main_group:
return main_group[element]
elif element in transition_metals:
return transition_metals[element]
else:
return None
4.5 特征组合:1+1 > 2
单个元素属性特征已经很有用了,但真正厉害的是把它们组合起来。我常用的组合方式有:
- 差值特征:两个元素的属性差值,比如电负性差、半径差
- 比值特征:两个元素的属性比值,比如半径比
- 统计特征:对于多元素材料,计算所有元素属性的均值、方差、最大值、最小值
- 加权平均:按原子分数加权平均各元素的属性
举个例子,对于ABO₃型钙钛矿材料,我们可以这样组合特征:
# 钙钛矿ABO₃的特征组合示例
def perovskite_features(A, B, O):
# 单个元素属性
en_A = get_electronegativity(A)
en_B = get_electronegativity(B)
en_O = get_electronegativity(O)
# 差值特征
en_diff_AO = abs(en_A - en_O)
en_diff_BO = abs(en_B - en_O)
en_diff_AB = abs(en_A - en_B)
# 加权平均
en_avg = (en_A + en_B + 3*en_O) / 5
# 统计特征
en_list = [en_A, en_B, en_O]
en_var = np.var(en_list)
en_max = max(en_list)
en_min = min(en_list)
return {
'en_A': en_A,
'en_B': en_B,
'en_diff_AO': en_diff_AO,
'en_diff_BO': en_diff_BO,
'en_diff_AB': en_diff_AB,
'en_avg': en_avg,
'en_var': en_var,
'en_max': en_max,
'en_min': en_min
}
你看,就电负性这一个属性,通过组合就能衍生出七八个特征。原子半径和价电子数同理。这样组合下来,特征空间一下子就丰富起来了。
4.6 知识体系总览
下面这张图总结了本章的核心逻辑,我画了个SVG方便你理解:
从这张图可以看得很清楚:三个核心元素属性通过不同的提取方式得到原始特征,再经过组合策略衍生出大量新特征,最终应用到各种材料性能预测中。
4.7 实战建议
最后,我给大家几个实战中的建议:
嗯,这里要注意一点:不要盲目堆特征。我见过有人把几十个元素属性全部加进去,结果模型过拟合得一塌糊涂。我的经验是,先根据物理直觉选3-5个核心属性,然后做组合,最后用特征选择方法筛选。
另外,不同材料体系适合的特征不一样。做氧化物时,电负性和离子半径特别重要。做金属时,价电子数和金属半径更关键。做二维材料时,可能还要考虑范德华半径。这个需要你在实践中慢慢积累经验。
好了,今天的内容就到这里。元素属性特征是特征工程的基础,但也是最容易被忽视的。下一节我们会继续讲结构特征和工艺特征的提取,到时候你会看到,这些特征和元素属性特征结合起来,效果会更好。