中文

材料科学中的特征工程:从实验数据到ML就绪数据

真正的瓶颈

大多数材料ML教程从一个干净的CSV直接跳到模型拟合。现实中,你的数据分散在实验本、仪器导出文件和合并单元格的Excel表格里。特征工程——将原始观测转化为结构化的特征矩阵——是80%工作量的所在。


import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler, OneHotEncoder

从原始数据到特征矩阵


df = pd.DataFrame({
    "纤维直径_nm": [45, 52, 48, 55, 50, 47],
    "取向标准差_deg": [12, 22, 8, 18, 15, 20],
    "交联密度_pct": [2.5, 1.8, 3.2, 2.0, 4.1, 1.5],
    "处理": ["甲醇", "乙醇", "甲醇", "水", "甲醇", "乙醇"],
    "杨氏模量_GPa": [2.8, 1.9, 3.5, 2.3, 4.0, 1.7],
})

分类变量编码


encoder = OneHotEncoder(sparse_output=False, drop="first")
encoded = encoder.fit_transform(df[["处理"]])
cols = encoder.get_feature_names_out(["处理"])
df_enc = pd.concat([df.drop("处理", axis=1), pd.DataFrame(encoded, columns=cols)], axis=1)

域知识驱动的交互特征


def engineer_materials_features(df):
    df = df.copy()
    df["crosslink_x_diameter"] = df["交联密度_pct"] * df["纤维直径_nm"]
    df["orient_diameter_ratio"] = df["取向标准差_deg"] / (df["纤维直径_nm"] + 1e-6)
    for col in ["交联密度_pct", "纤维直径_nm"]:
        if col in df.columns: df[f"log_{col}"] = np.log1p(df[col])
    return df

缺失值处理

小样本数据不要盲目用均值填充:


def smart_impute(df, group_col="处理"):
    df = df.copy()
    for col in df.select_dtypes(include=np.number).columns:
        if df[col].isna().sum() == 0: continue
        if group_col in df.columns:
            df[col] = df.groupby(group_col)[col].transform(lambda x: x.fillna(x.median()))
        df[col] = df[col].fillna(df[col].median())
    return df

小样本特征选择

当样本少于100时,避免自动化特征选择。改用:

  1. 相关性分析:去除|r|>0.95的特征
  2. 方差阈值:去除近常数特征
  3. 域知识筛选:只保留物理上合理的特征

检查清单

  • 所有特征已数值化
  • 没有特征泄漏目标变量
  • 缺失值已处理
  • 分类变量已编码
  • 交互特征有物理依据

参考文献

  • Kuhn, M. & Johnson, K. (2019). Feature Engineering and Selection. CRC Press.
  • Ramprasad, R. et al. (2017). Machine learning in materials informatics. npj Computational Materials, 3, 54.

💬 Questions or Feedback?

This blog is actively maintained by a PhD researcher. Reach out on GitHub for collaborations or corrections.

View on GitHub