机器学习在材料预测方面的应用

发布于:2024-06-29 ⋅ 阅读:(13) ⋅ 点赞:(0)

1.机器学习的基本流程
实验数据集
特征选择与提取
机器学习模型
预测性能评价
  • 实验数据集:材料数据( M 1 . . . M n M_{1}...M_{n} M1...Mn)、性能( P 1 . . . P n P_{1}...P_{n} P1...Pn)
  • 特征选择与提取:描述符( F 1 . . . F n F_{1}...F_{n} F1...Fn)
    指纹型描述符:
    1.化学计量属性,包括元素的重量百分比和原子百分比等。
    2.元素性质,包括电负性、原子半径、有效电荷、范德华半径、共价半径、元素周期表中的行数、嵌段数、气态原子形成焓、电离能和价数等。
    3.化合物描述符,包括分子量、密度、体积、配位数和原子序数等。
    4.电子结构属性,来自所有现有元素之间的s,p,d和f价壳的电子的平均分数。
  • 机器学习模型:逻辑回归、支持向量机、随机森林、卷积神经网络、深度学习、神经网络
  • 预测性能评价:Hold-Out(量化评价 R 2 R^{2} R2)、K折交叉验证(量化评价 RMSE)、单样本交叉验证(量化评价 MAE)、
2.常见的材料性能
  • 电子性能:形成能(Formation energy)、压电性(Piezoelectric properties)、带隙(Band gap)、绝对能(Absolute energy)、 自由能(Free energy)、缺陷能(Defect energetics)、费米能(Fermi energy)、电容率(Dielectric constant)。
  • 力学性能:体积模量(Bulk moduli)、剪切模量(Shear moduli)、弹性模量(Elastic moduli)、泊松比(Poisson ratio)。
  • 物理化学性能:密度(Density)、最近邻距离(Nearest neighbor distance)、生成焓(Formation enthalpy)、熔点(Melting temperature)、热导率(Thermal conductivities)、催化活性(Catalytic activities)、耐辐照性(Radiation resistance)、超导材料临界温度(Critical temperature)。
3.常见的材料数据库
数据库名称 材料数据种类 网址
无机材料晶体结构库(Inorganic Crystal Structure Database,ICSD) 该库提供除了金属和合金以外,不含C-H键的所有无机化合物晶体结构信息,包括化学名和化学式、矿物名和相名称、晶胞参数、空间群、原子坐标、热参数、位置占位度、R因子及有关文献等各种信息。 https://icsd.fiz-karlsruhe.de/
剑桥晶体结构数据库(Cambridge Structural Database,CSD) 数据库含有875000多个有机及金属有机化合物的X射线和中子射线衍射的分析数据。它只负责收集并提供具有C-H键的所有晶体结构,包括有机化合物、金属有机化合物、配位化合物的晶体结构数据。 http://www.ccdc.cam.ac.uk/
开放晶体结构数据库(Crystallography open database,COD) COD是储存晶体学数据、原子坐标参数以及详细的化学内容和参考文献的数据库。它对所收集的大量分子结构数据进行了全面、广泛的整理、核对和质量评价,因此它所提供的数据要比原始文献更为准确。可以方便地检索、筛选和进行系统的分析,还可对数据进行加工并绘成各种规格的图形。 http://www.crystallography.net/cod/
沸石结构数据库(the database of zeolite structures,DZS) DZS提供了所有沸石骨架类型材料的结构信息,包括每个框架式的说明和图纸、晶体学数据和代表性材料模拟粉末衍射图案、建筑模型的详细说明、无序沸石结构的描述等。 http://www.iza-structure.org/databases/
Paulingfile 数据库(Paulingfile database) 一个集相图、晶体结构和物理性质的无机化合物数据库。 https://mpds.io/
材料计划(Materials project) 该库专门用于搜索查找各种材料的性质,以较高的标准衡量是否将计算机预测的材料纳入数据库。例如:锂电池相关(约15000个结构);沸石、金属有机骨架MOF(约13万种)。 http://next-gen.materialsproject.org
材料云项目(Materials cloud project) 该库主要以石墨烯等二维材料为主,初步预测产生1500种可能的二维结构。 http://www.materialscloud.org
NIMS材料数据库(NIMS materials database) 世界上最大的聚合物、陶瓷、合金、超导材料、复合材料和扩散材料数据库之一。 https://mits.nims.go.jp/
AFLOWlib数据库(Automatic-FLOW for materials discovery,Aflowlib) AFLOWlib是目前最大的材料数据库,主要是金属合金,该库拥有超过一百万的不同材料和一亿左右的性能属性。 http://www.aflowlib.org
开放量子材料数据库(Open quantum materials database,OQMD) 该库主要以钙钛矿数据居多,用户可以下载整个数据库而不仅仅是单个搜索结果。 http://oqmd.org
4.机器学习模型及应用
机器学习模型 特色或应用案例
支持向量机(Support vector machine,SVM) 无需依赖整个数据,能够处理非线性特征的相互作用,可以提高泛化能力,解决高维问题,但若样本过多时,由于数据敏感度的缺失而导致效率不是很高
线性回归(Linear regression,LR) 适用于简单的回归问题,用梯度下降法对最小二乘法形式的误差函数进行优化,计算简单、训练速度快,但不能拟合非线性数据。
逻辑回归(Logistic regression,LR) 进行分类问题时,计算速度快,可结合正则化模型来解决问题
K最近邻算法(K-Nearest neighbor,KNN) 既可做回归问题,也可做分类问题,可用于非线性的分类问题,但当样本不平衡时,可能会导致结果不准确
决策树(Decision tree,DT) 适合处理含有缺少属性的样本,短时间内能够对大数据源做出较好的结果,但容易发生过拟合,忽略数据间的相关性
随机森林(Random forests,RF) 基于Bagging的集成学习方法,可以用来做分类、回归等问题,因为随机性的引入,使得有较好的抗噪声能力且不易过拟合,训练速度快,有极高的准确率,但训练时需较大的空间和时间
深度神经网络(Deep neural networks,DNN) 适合非线性函数拟合特征提取
卷积神经网络(Convolutional neural network,CNN) 特别适合于图像模式识别,计算机视觉等领域,应用于描述基于X射线衍射的空间群预测
循环或递归神经网络(Recusive or recurrent neural network,RNN) 深度学习主要框架之一,主要是将上一次迭代的输出作为当前迭代的输入,从而实现循环,可用于建立结构和材料性质之间的函数关系
(经典)人工神经网络(Artifical neural network,ANN) 用于探索大量的晶体结构和可视化的结构-性能关系,应用于预测小分子力场的电子性质
自动编码器(Auto-encoder,AE) 主要是通过逐层的无监督学习先将输入数据进行表征的压缩,然后通过网络进行有监督的学习
核岭回归(Kernel ridge regression,KRR) 经常用于材料性能的回归分析预测,如带隙和合成焓(能)预测
压缩感知(Compressive sensing,CS) 基于压缩感知的特征选择方法,被用于建立一个定量预测二元化合物半导体晶体结构的物理模型
5.数据预处理过程
导入所需的库
导入数据集
处理丢失数据
解析分类数据
拆分数据集为测试集合和训练集合
特征缩放
  • 导入所需的库:NumPy和Pandas。NumPy包含数学计算函数,Pandas用于导入和管理数据集。
  • 导入数据集:数据集通常是.csv格式。csv文件以文本形式保存表格数据。文件的每一行是一条数据记录。使用Pandas的read_csv方法读取本地csv文件为一个数据帧。然后,从数据帧中制作自变量和因变量的矩阵和向量。
  • 处理丢失数据:得到的数据很少是完整的。数据可能因为各种原因丢失,为了不降低机器学习模型的性能,需要处理数据。我们可以用整列的平均值或中间值替换丢失的数据。用sklearn.preprocessing库中的Imputer类完成此项任务。
  • 解析分类数据:分类数据指的是含有标签值而不是数字值的变量。取值范围通常是固定的。例如“Yes”和“No”不能用于模型的数学计算,所有需要解析成数字。为实现这一功能,从sklearn.preprocessing库导入LabelEncoder类。
  • 拆分数据集为测试集合和训练集合:把数据集拆分为两个:一个用来训练模型的训练集合,另一个用来验证模型的测试集合。两者比例一般为80:20。导入sklearn.crossvalidation库中的train_test_split()方法。
  • 特征缩放:大部分模型算法使用两点间的欧式距离表示,但此特征在幅度、单位和范围姿态问题上变化很大。在距离计算中,高幅度的特征比低幅度特征权重更大。可用特征标准化或Z值归一化解决。导入sklearn.preprocessing库的StandardScalar类。
6.常用的机器学习模型
1.线性回归
  • 简单线性回归:使用单一特征来预测因变量。若两个变量是线性相关的,寻找一种根据特征或自变量X的线性函数来精准预测因变量Y。
  • 如何找到最佳的拟合线:通过最小化预测值Y与实际值y之间的长度来寻找最佳拟合线。
  • 代码示例
    import pandas as pd                                                                           # 导入基本库
    import numpy as np 
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LinearRegression
    
    dataset = pd.read_csv('studentscores.csv')                                                    # 数据提取
    X = dataset.iloc[ : ,   : 1 ].values                                                          # 数据处理
    Y = dataset.iloc[ : , 1 ].values
    X_train, X_test, Y_train, Y_test = train_test_split( X, Y, test_size = 1/4, random_state = 0)#分为训练集与测试集
    
    regressor = LinearRegression()                                                               # 线性回归模型
    regressor = regressor.fit(X_train, Y_train)
    
    Y_pred = regressor.predict(X_test)                                                          # 结果预测
    
    plt.scatter(X_train , Y_train, color = 'red')                                         # 训练结果可视化
    plt.plot(X_train , regressor.predict(X_train), color ='blue')
    
    plt.scatter(X_test , Y_test, color = 'red')                                           # 测试结果可视化
    plt.plot(X_test , regressor.predict(X_test), color ='blue')
    plt.show()
    
2.逻辑回归
  • 逻辑回归:逻辑回归被用来处理不同的分类问题,即预测被研究的对象属于哪个组,通过提供一个离散的二进制输出结果。
  • 如何工作:逻辑回归通过估算概率来预测因变量和一个或者多个自变量之间的关系。这些概率值必须转换为二进制,以便在实践中进行预测。然后使用阈值分类器将(0,1)范围的值转化为0和1的值来表示结果。
  • Sigmoid函数:Sigmoid函数是一个S形曲线,可以实现将任意真实值映射为值域范围为0-1的值。
    3.逻辑回归与线性回归
    逻辑回归给出离散的输出结果,然而线性回归给出的是连续的输出结果。
  • 代码示例:
    import numpy as np                                                                           # 导入基本库
    import matplotlib.pyplot as plt
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import confusion_matrix
    from sklearn.metrics import classification_report
    from matplotlib.colors import ListedColormap
    
    dataset = pd.read_csv('Social_Network_Ads.csv')                                             # 数据提取
    X = dataset.iloc[:, [2, 3]].values                                                          # 数据处理
    y = dataset.iloc[:, 4].values
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)#分为训练集与测试集
    
    sc = StandardScaler()                                                     # 特征标准化处理 (缩放特征)
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)
    
    
    
    classifier = LogisticRegression()                                                     # 逻辑回归模型
    classifier.fit(X_train, y_train)
    
    
    y_pred = classifier.predict(X_test)                                                       # 结果预测
    
    cm = confusion_matrix(y_test, y_pred)                 
    print(cm)                                                                             # 输出混淆矩阵
    print(classification_report(y_test, y_pred))                                          # 输出分类报告
    
    X_set,y_set=X_train,y_train                                           # 训练结果可视化
    X1,X2=np. meshgrid(np. arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01),
                       np. arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01))
    plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),
                 alpha = 0.75, cmap = ListedColormap(('red', 'green')))
    plt.xlim(X1.min(),X1.max())
    plt.ylim(X2.min(),X2.max())
    for i,j in enumerate(np. unique(y_set)):
        plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],
                    c = ListedColormap(('red', 'green'))(i), label=j)
    
    plt.title(' LOGISTIC(Training set)')
    plt.xlabel(' Age')
    plt.ylabel(' Estimated Salary')
    plt.legend()
    plt.show()
    
    X_set,y_set=X_test,y_test                                           # 测试结果可视化
    X1,X2=np. meshgrid(np. arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01),
                       np. arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01))
    
    plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),
                 alpha = 0.75, cmap = ListedColormap(('red', 'green')))
    plt.xlim(X1.min(),X1.max())
    plt.ylim(X2.min(),X2.max())
    for i,j in enumerate(np. unique(y_set)):
        plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],
                   c = ListedColormap(('red', 'green'))(i), label=j)
    
    plt.title(' LOGISTIC(Test set)')
    plt.xlabel(' Age')
    plt.ylabel(' Estimated Salary')
    plt.legend()
    plt.show()
    
3.支持向量机(SVM)
  • 什么是SVM?:支持向量机(SVM)是一个有监督的机器学习算法,它可用于分类和回归分析,主要用于分类问题中。在此算法中,根据特征值,构建一个n维空间(n为特征数量),将每个数据点投影到此空间中。
  • 数据如何分类?:通过构建一个超平面,将数据区分成两类。在SVM中,最佳超平面是指距离两类数据最远的一个超平面。
  • 代码示例:
    import numpy as np                                                                           # 导入基本库
    import matplotlib.pyplot as plt
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.svm import SVC
    from sklearn.metrics import confusion_matrix
    from sklearn.metrics import classification_report
    from matplotlib.colors import ListedColormap
    
    dataset = pd.read_csv('Social_Network_Ads.csv')                                             # 数据提取
    X = dataset.iloc[:, [2, 3]].values                                                          # 数据处理
    y = dataset.iloc[:, 4].values
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)#分为训练集和测试集
    
    sc = StandardScaler()                                                      # 特征标准化处理 (缩放特征)
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)
    
    classifier = SVC(kernel = 'linear', random_state = 0)                                      # SVM模型
    classifier.fit(X_train, y_train)
    
    y_pred = classifier.predict(X_test)                                                        # 结果预测
    
    cm = confusion_matrix(y_test, y_pred)
    print(cm)                                                                                  # 输出混淆矩阵
    print(classification_report(y_test, y_pred))                                               # 输出分类报告
    
    X_set, y_set = X_train, y_train                                           # 训练结果可视化
    X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                         np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
    plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
                 alpha = 0.75, cmap = ListedColormap(('red', 'green')))
    plt.xlim(X1.min(), X1.max())
    plt.ylim(X2.min(), X2.max())
    for i, j in enumerate(np.unique(y_set)):
        plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                    c = ListedColormap(('red', 'green'))(i), label = j)
    plt.title('SVM (Training set)')
    plt.xlabel('Age')
    plt.ylabel('Estimated Salary')
    plt.legend()
    plt.show()
    
    X_set, y_set = X_test, y_test                                           # 测试结果可视化
    X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                         np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
    plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
                 alpha = 0.75, cmap = ListedColormap(('red', 'green')))
    plt.xlim(X1.min(), X1.max())
    plt.ylim(X2.min(), X2.max())
    for i, j in enumerate(np.unique(y_set)):
        plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                    c = ListedColormap(('red', 'green'))(i), label = j)
    plt.title('SVM (Test set)')
    plt.xlabel('Age')
    plt.ylabel('Estimated Salary')
    plt.legend()
    plt.show()
    
4.随机森林
  • 什么是随机森林:随机森林是有监督的集成学习模型,主要用于分类和回归。集成学习模型复合了多个机器学习模型(指决策树),使整体性能更好。究其逻辑,每个模型的个体在单独使用时效果是薄弱的,但多个模型个体集合在一起的时候,整体的功能会变得强大。在随机森林的情况下,单个决策树做出的决策都是“弱”因素。而大量决策树一起被使用时把它们的结果整合,就会产生“强”合奏。
  • 随机森林的工作原理:随机森林算法分为两步。第一步是创建决策树,第二步是根据第一步中决策树的分类器结果做出预测。随机森林算法与决策树算法之间的区别是,在随机森林中,查找根节点和分割特征节点的过程是随机进行的。
    1.构建:每棵树按如下方式生成:
      1.(数据的随机选取)如果训练集中有N个样本,有放回的随机抽取n个。此样本将是生成决策树的训练集。
      2.(特征的随机选取)对于每个样本,如果有M个输入变量(或特征),指定一个常数m,然后随机地从M个特征中选取m个特征子集,然后将m个特征中最优的分裂特征用来分裂节点。
    2.预测:随机森林的预测分以下三步:
      1.使用每一个随机创建的决策树的规则来预测测试特征的结果(目标)。
      2.计算每个预测目标的票数.
      3.获得票数最多的预测目标视为随机森林算法的最终预测。
  • 代码示例:
    import numpy as np                                                                           # 导入基本库
    import matplotlib.pyplot as plt
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.metrics import confusion_matrix
    from matplotlib.colors import ListedColormap
    
    dataset = pd.read_csv('Social_Network_Ads.csv')                                             # 数据提取
    X = dataset.iloc[:, [2, 3]].values                                                          # 数据处理
    y = dataset.iloc[:, 4].values
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) #分为训练集和测试集
    
    sc = StandardScaler()                                                     # 特征标准化处理 (缩放特征)
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)
    
    classifier = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state = 0)# 随机森林模型
    classifier.fit(X_train, y_train)
    
    y_pred = classifier.predict(X_test)                                                        # 结果预测
    cm = confusion_matrix(y_test, y_pred)                                      # 混淆矩阵和分类报告
    
    
    X_set, y_set = X_train, y_train                                           # 训练结果可视化
    X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                       np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
    plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
               alpha = 0.75, cmap = ListedColormap(('red', 'green')))
    plt.xlim(X1.min(), X1.max())
    plt.ylim(X2.min(), X2.max())
    for i, j in enumerate(np.unique(y_set)):
        plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                    c = ListedColormap(('red', 'green'))(i), label = j)
    plt.title('Random Forest Classification (Training set)')
    plt.xlabel('Age')
    plt.ylabel('Estimated Salary')
    plt.legend()
    plt.show()
    
    X_set, y_set = X_test, y_test                                           # 测试结果可视化
    X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                       np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
    plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
                 alpha = 0.75, cmap = ListedColormap(('red', 'green')))
    plt.xlim(X1.min(), X1.max())
    plt.ylim(X2.min(), X2.max())
    for i, j in enumerate(np.unique(y_set)):
        plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                    c = ListedColormap(('red', 'green'))(i), label = j)
    plt.title('Random Forest Classification (Test set)')
    plt.xlabel('Age')
    plt.ylabel('Estimated Salary')
    plt.legend()
    plt.show()