linear regression(线性回归) --- 论文实战

一、论文介绍

        镁 (Mg) 合金具有重量轻和生物相容性强的特点,可广泛应用于运输、航空航天和生物医学领域。然而,由于高化学活性,它们通常会受到严重的电偶腐蚀。在这项工作中,采用主动学习来发现 可以抑制 Mg 合金腐蚀阴极反应的金属间化合物。氢吸附能是阴极析氢反应 (HER) 速率的描述符,由机器学习模型使用 H 原子的 Voronoi 邻居的几何和化学特征进行预测。经过五次主动学习迭代后,在训练集大小小于 1% 未知数据集的情况下,强/弱吸附配置的 H 吸附能量预测误差为 0.196 eV (MAE)。此外,我们发现具有强 H 吸附的表面比弱 H 吸附表面向 H 吸附原子转移的电子更多。最后,根据二元 Mg 金属间化合物的表面稳定性和预测的 H 吸附能对二元 Mg 金属间化合物抑制 HER 的能力进行排序。这项工作通过主动学习和密度泛函理论 (DFT) 模拟提出了可以极大地抑制腐蚀阴极反应的二元 Mg 金属间化合物,有望加速耐腐蚀 Mg 合金的设计。

图片来自 https://doi.org/10.1016/j.actamat.2023.119063

(a) 原始数据集(b)有效特征提取(c) ML(Machine Learning)模型训练。(d)提取结构特征(未被计算过的结构)(e)ML 模型预测的有效结果(f) 根据预测的有效结构进行 DFT 计算,得到 数据添加到数据集中。不断循环此过程,模型越来越强大。

二、数据集

其初始数据为690*27(690个结构,27个特征),通过 Pearson 相关系数 (PCC) 考虑特征的相关性后,由于与其他特征的高线性关系,排除了 2 个特征。即690*25的数据经过5次上述主动学习迭代过程得到最后数据集最后数据集(890*25)

 三、模型训练

3.1  导入Python库

'''====================导入Python库===================='''
import pandas as pd               #python科学计算库
import numpy as np                #Python的一个开源数据分析处理库。#
import matplotlib.pyplot as plt   #常用Python画图工具
import seaborn as sns             #基于 Matplotlib 的 Python 数据可视化库,专注于绘制各种统计图形,提供高级接口和美观的默认主题。
import mglearn     #用于辅助机器学习和数据分析的工具包。它提供了一些方便的函数和工具,帮助用户更好地理解和应用机器学习算法。mglearn的目标是简化机器学习的学习曲线,让初学者更容易上手。
from sklearn.linear_model import LinearRegression  # 线性回归模型
from sklearn.model_selection import train_test_split # 数据划分模块
from sklearn.preprocessing import StandardScaler   # 标准化模块
from sklearn.metrics import mean_squared_error,r2_score   #误差函数MSE,误差函数R^2,

首先,导入一些常用的Python库

pandas:  Pandas是Python的一个开源数据分析处理库。它提供了高性能易用的数据结构和数据分析工具,用于进行数据的读取、清洗、过滤、聚合、视觉化等操作。

numpy:  python科学计算库,提供了矩阵,线性代数,傅立叶变换等等的解决方案, 最常用的是它的N维数组对象。

scikit-learn: 是基于 Python 语言的机器学习工具。有六大任务模块:分别是分类、回归、聚类、降维、模型选择和预处理。

3.2  导入数据 

'''========================导入数据========================'''
data = pd.read_excel('D:/复现/trainset_loop6.xlsx')  #读取xlsx格式数据
# date = pd.read_csv('D:/复现/trainset_loop6.csv')   #读取csv格式数据
print(data.isnull().sum())   #检查数据中是否存在缺失值
print(data.shape)   #检查维度
print(data.columns) #数据的标签
data = data.drop(["PN","AN"], axis = 1) #axis = 1表示对列进行处理,0表示对行
Y, X = data['Eads'] , data.drop(['Eads'] , axis = 1) #对Y、X分别赋值

 3.3  分析数据分布

'''===================data数据结构可视化==================='''
#scatter_matrix函数,它会绘制出每个数值属性相对于其他数值属性的相关值。
pd.plotting.scatter_matrix(data.iloc[:,0:5],    # pandas.dataframe对象,这里导入了data的前5列进行分析。
                           alpha = 0.5 ,        #图像透明度,一般取(0, 1]
                           figsize = (10,10),   #以英寸为单位的图像大小,一般以元组(width, height)
                           diagonal = 'hist',   #’hist’表示直方图(Histogramplot), ’kde’表示核密度估计;该参数是scatter_matrix函数的关键参数
                           hist_kwds = {'bins': 10},#与hist相关的字典参数
                           marker = 'o',            #Matplotlib可用的标记类型,如’.’,’, ’,’o’等
                           c = Y ,                #颜色参考标准
                           cmap = mglearn.cm2)    #两特征的颜色分布
# 将图保存为*.jpg图
plt.savefig('./data_Distribute.jpg',dpi = 1200)  #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()

 3.4  Pearson 相关性分析

'''===================Pearson 相关性分析==================='''
# 计算相关系数矩阵,包含了任意两个data特征的相关系数
print(data.corr())
# 绘制相关性热力图
plt.subplots()  # 设置画面大小,如:figsize = (8, 8)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
sns.heatmap(data.corr(),        #要分析的数据,这里放入了data的特征的相关系数
            annot=False,        # 显示相关系数
            center=0.5,         # 居中
            fmt='.2f',          # 只显示一位小数
            linewidth=0.5,      # 设置每个单元格的距离
            linecolor='black',  # 设置间距线的颜色
            vmin=0, vmax=1,     # 设置数值最小值和最大值
            xticklabels=True, yticklabels=True,  # 显示x轴和y轴
            square=True,        # 每个方格都是正方形
            cbar=True,          # 绘制颜色条
            cmap='coolwarm',    # 设置热力图颜色
            )
plt.title('相关性热力图')     #图的标题
# 将图保存为*.jpg图
plt.savefig('./Pearson_Picture.jpg',dpi = 1200) #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()

 作者去除相关性大的 "PN" 和 "AN" 特征

data = data.drop(['PN', 'AN'],axis = 1) #axis = 1表示对列进行处理,0表示对行

3.5  标准化

'''=========================标准化========================'''
#利用StandardScaler函数对X进行标准化处理
scaler = StandardScaler()
X = scaler.fit_transform(X)

'''====================划分训练集与测试集==================='''
X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size=0.2,random_state=42)

3.6  模型训练与评估

'''=====================模型训练与评估======================'''
#模型训练
model = LinearRegression()   # LinearRegression模型实例化
model.fit(X_train,y_train)   # 利用训练集进行模型训练
#模型预测
y_pred_train=model.predict(X_train)   # 利用训练集进行模型预测
y_pred_test=model.predict(X_test)     # 利用预测集进行模型预测
#评估
mse_train=mean_squared_error(y_train,y_pred_train)  #均方误差越小模型越好
mse_test=mean_squared_error(y_test,y_pred_test)     #R2 表示模型对因变量的解释能力,取值范围从 0 ~ 1,越接近 1 表示模型对数据的拟合程度越好。
r2_train=r2_score(y_train,y_pred_train)
r2_test=r2_score(y_test,y_pred_test)
print(f'MSE(Train):{mse_train:.2f}')  #保留2位小数
print(f'MSE(Test):{mse_test:.2f}')
print(f'R^2(Train):{r2_train:.2f}')
print(f'R^2(Test):{r2_test:.2f}')


'''=====================特征权重Wi图======================'''
plt.bar(columns, model.coef_)   # X轴columns特征名;Y轴model.coef_模型输出的Wi
plt.title('Linear Regression 预测的各特征权重W$_i$')
plt.savefig('./LR_Wi.jpg',dpi = 1200)  #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()

 MSE与R^{2}结果:

MSE(Train):0.10
MSE(Test):0.09
R^2(Train):0.53
R^2(Test):0.49

3.7  可视化

'''======================结果可视化======================='''
plt.figure(figsize=(8,8))
colors = ['b', 'r']  # 设置颜色
markers = ["*","o"]  # 设置点的形状
Y_train_picture = [y_train,y_test]          #可视化图的x轴数据
Y_pred_picture = [y_pred_train,y_pred_test] #可视化图的y轴数据
for i in range(0,2):
    plt.scatter(Y_train_picture[i],
                Y_pred_picture[i],
                s = 20,  # 表示点的大小
                c = colors[i],  # 颜色
                marker = markers[i],  # 点的形状
                edgecolors='b',  # 散点边框颜色
                alpha=0.6)  # 透明度
plt.plot([-1.0,1.0],[-1.0,1.0],'r--')  #可视化图数据范围
plt.xlabel('Actual')     #x轴标签
plt.ylabel('Predicted')  #y轴标签
plt.legend(['train', 'test'], loc='upper right',frameon=False) #图例,位置位于右上方,去掉图例边框
plt.title('Actual vs Predicted',fontsize=15, c='r')
# 将图保存为*.jpg图
plt.savefig('./LR可视化_Picture.jpg',dpi = 1200) #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()

此图表示,数据点越靠近中间红线模型越好。  

四、代码全部注释 

'''====================导入Python库===================='''
import pandas as pd               #python科学计算库
import numpy as np                #Python的一个开源数据分析处理库。#
import matplotlib.pyplot as plt   #常用Python画图工具
import seaborn as sns             #基于 Matplotlib 的 Python 数据可视化库,专注于绘制各种统计图形,提供高级接口和美观的默认主题。
import mglearn     #用于辅助机器学习和数据分析的工具包。它提供了一些方便的函数和工具,帮助用户更好地理解和应用机器学习算法。mglearn的目标是简化机器学习的学习曲线,让初学者更容易上手。
from sklearn.linear_model import LinearRegression  # 线性回归模型
from sklearn.model_selection import train_test_split # 数据划分模块
from sklearn.preprocessing import StandardScaler   # 标准化模块
from sklearn.metrics import mean_squared_error,r2_score   #误差函数MSE,误差函数R^2,


'''========================导入数据========================'''
data = pd.read_excel('D:/复现/trainset_loop6.xlsx')  #读取xlsx格式数据
# date = pd.read_csv('D:/复现/trainset_loop6.csv')   #读取csv格式数据
print(data.isnull().sum())   #检查数据中是否存在缺失值
print(data.shape)   #检查维度
print(data.columns) #数据的标签
data = data.drop(["PN","AN"], axis = 1) #axis = 1表示对列进行处理,0表示对行
Y, X = data['Eads'] , data.drop(['Eads'] , axis = 1) #对Y、X分别赋值
columns = X.columns  #用于后续画特征权重图


'''===================data数据结构可视化==================='''
#scatter_matrix函数,它会绘制出每个数值属性相对于其他数值属性的相关值。
pd.plotting.scatter_matrix(data.iloc[:,0:5],    # pandas.dataframe对象,这里导入了data的前5列进行分析。
                           alpha = 0.5 ,        #图像透明度,一般取(0, 1]
                           figsize = (10,10),   #以英寸为单位的图像大小,一般以元组(width, height)
                           diagonal = 'hist',   #’hist’表示直方图(Histogramplot), ’kde’表示核密度估计;该参数是scatter_matrix函数的关键参数
                           hist_kwds = {'bins': 10},#与hist相关的字典参数
                           marker = 'o',            #Matplotlib可用的标记类型,如’.’,’, ’,’o’等
                           c = Y ,                #颜色参考标准
                           cmap = mglearn.cm2)    #两特征的颜色分布
# 将图保存为*.jpg图
plt.savefig('./data_Distribute.jpg',dpi = 1200)  #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()


'''===================Pearson 相关性分析==================='''
# 计算相关系数矩阵,包含了任意两个data特征的相关系数
print(data.corr())
# 绘制相关性热力图
plt.subplots()  # 设置画面大小,如:figsize = (8, 8)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
sns.heatmap(data.corr(),        #要分析的数据,这里放入了data的特征的相关系数
            annot=False,        # 显示相关系数
            center=0.5,         # 居中
            fmt='.2f',          # 只显示一位小数
            linewidth=0.5,      # 设置每个单元格的距离
            linecolor='black',  # 设置间距线的颜色
            vmin=0, vmax=1,     # 设置数值最小值和最大值
            xticklabels=True, yticklabels=True,  # 显示x轴和y轴
            square=True,        # 每个方格都是正方形
            cbar=True,          # 绘制颜色条
            cmap='coolwarm',    # 设置热力图颜色
            )
plt.title('相关性热力图')     #图的标题
# 将图保存为*.jpg图
plt.savefig('./Pearson_Picture.jpg',dpi = 1200) #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()


'''=========================标准化========================'''
#利用StandardScaler函数对X进行标准化处理
scaler = StandardScaler()
X = scaler.fit_transform(X)

'''====================划分训练集与测试集==================='''
X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size=0.2,random_state=42)

'''=====================模型训练与评估======================'''
#模型训练
model = LinearRegression()   # LinearRegression模型实例化
model.fit(X_train,y_train)   # 利用训练集进行模型训练
#模型预测
y_pred_train=model.predict(X_train)   # 利用训练集进行模型预测
y_pred_test=model.predict(X_test)     # 利用预测集进行模型预测
#评估
mse_train=mean_squared_error(y_train,y_pred_train)  #均方误差越小模型越好
mse_test=mean_squared_error(y_test,y_pred_test)     #R2 表示模型对因变量的解释能力,取值范围从 0 ~ 1,越接近 1 表示模型对数据的拟合程度越好。
r2_train=r2_score(y_train,y_pred_train)
r2_test=r2_score(y_test,y_pred_test)
print(f'MSE(Train):{mse_train:.2f}')  #保留2位小数
print(f'MSE(Test):{mse_test:.2f}')
print(f'R^2(Train):{r2_train:.2f}')
print(f'R^2(Test):{r2_test:.2f}')


'''=====================特征权重Wi图======================'''
plt.bar(columns, model.coef_)   # X轴columns特征名;Y轴model.coef_模型输出的Wi
plt.title('Linear Regression 预测的各特征权重W$_i$')
plt.savefig('./LR_Wi.jpg',dpi = 1200)  #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()


'''======================结果可视化======================='''
plt.figure(figsize=(8,8))
colors = ['b', 'r']  # 设置颜色
markers = ["*","o"]  # 设置点的形状
Y_train_picture = [y_train,y_test]          #可视化图的x轴数据
Y_pred_picture = [y_pred_train,y_pred_test] #可视化图的y轴数据
for i in range(0,2):
    plt.scatter(Y_train_picture[i],
                Y_pred_picture[i],
                s = 20,  # 表示点的大小
                c = colors[i],  # 颜色
                marker = markers[i],  # 点的形状
                edgecolors='b',  # 散点边框颜色
                alpha=0.6)  # 透明度
plt.plot([-1.0,1.0],[-1.0,1.0],'r--')  #可视化图数据范围
plt.xlabel('Actual')     #x轴标签
plt.ylabel('Predicted')  #y轴标签
plt.legend(['train', 'test'], loc='upper right',frameon=False) #图例,位置位于右上方,去掉图例边框
plt.title('Actual vs Predicted',fontsize=15, c='r')
# 将图保存为*.jpg图
plt.savefig('./LR可视化_Picture.jpg',dpi = 1200) #在当前文件夹下保存jpg格式图,dpi = 1200
plt.show()

其中,有几个点,需要大家注意下~

  1. 数据预处理确保所有特征进行标准化,避免特征值差异过大对模型的影响。

  2. 特征重要性LinearRegression 回归会输出模型各特征的权重,可以查看哪些特征对模型的贡献最大,这也可以帮助我们理解特征的重要性。

  3. 模型评估计算 MSE 和 R² 来评估模型性能,并通过可视化检查预测效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码贾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值