PLS,即偏最小二乘(Partial Least Squares),是一种广泛使用的回归技术,用于帮助客户分析近红外光谱数据。
如果您对近红外光谱学有所了解,您肯定知道近红外光谱是一种次级方法,需要将近红外数据校准到所要测量的参数的主要参考数据上。
这个校准只需在第一次进行。一旦校准完成且稳健,就可以继续使用近红外数据预测感兴趣参数的值。
可下载资源
PCR只是使用通过PCA得到的若干主成分构建的回归模型。显然,这并不是最佳选择,而PLS就是解决这个问题的方法。
在本文中,我将向您展示如何使用Python构建一个简单的PLS回归模型。以下是我们将要做的概述。
- 展示PLS的基本代码
- 讨论我们要分析的数据及所需的预处理。我们将使用新鲜桃子水果的近红外光谱,其关联的Brix值与PCR帖子相同。这是我们要校准的量。
- 我们将使用交叉验证方法构建我们的模型
PLS Python代码
好的,以下是基于Python 3.5.2的运行PLS交叉验证的基本代码。
# 导入需要的库
from sklearn.metrics import mean_squared_error, r2_score # 导入均方误差和R2得分指标
from sklearn.model_selection import cross_val_predict # 导入交叉验证函数
# 定义PLS对象
pls = PLSReg......
nts=5) # 定义保留5个成分的PLS回归模型
# 拟合数据
pls.f......
Y) # 将数据拟合到PLS模型中
# 交叉验证
y_cv = cros......
y, cv=10) # 用10折交叉验证计算模型性能
# 计算得分
score = r2_score(y,v) # 计算R2得分
mse = mean_squa......
_cv) # 计算均方误差
如您所见,sklearn
已经提供了PLS(偏最小二乘)的包,所以我们可以直接使用,而不需要重新发明轮子。首先,我们定义了在PLS回归中要保留的成分数量。我决定保留5个成分作为示例,但后面将将其作为一个自由参数进行优化。一旦定义了PLS对象,我们就将回归拟合到数据X
(预测变量)和y
(已知响应变量)上。第三步是使用刚刚建立的模型运行一个包含10折交叉验证的交叉验证实验。当我们没有大量谱图时,交叉验证是测试校准预测能力的一种好方法。
为了检查我们的校准效果如何,我们使用通常的指标来衡量。我们通过将交叉验证结果y_cv
与已知响应进行比较来评估这些指标。为了优化我们的PLS回归参数(例如预处理步骤和成分数量),我们将跟踪这些指标,最常见的是均方差(MSE)。
还有一件事。在实际代码中,各种数组X, y
等通常是从电子表格中读取的numpy
数组。因此,您可能需要导入numpy
(当然),pandas
和其他一些库,我们将在下面看到。
这是Python中PLS回归的基本代码块。看一下数据导入和预处理了。
近红外数据导入和预处理
下面是完整的导入列表:
from sys i......
import matplotlib.pyplot as plt
from scipy.sig......
from sklearn.model_selection import cross_val_predict
from sklearn......
score
接下来,让我们导入数据,这些数据保存在一个csv文件中。该数据由50个新鲜桃子的近红外光谱组成。每个光谱都有对应的Brix值(响应变量)。最后,每个光谱在1100 nm到2300 nm之间取600个波长点,步长为2 nm。
data = pd.rea......
alues.csv')
# 获取参考值
y = dat......
'].values
# 获取光谱
X = data.dr......
es
# 获取波长
wl = np.a......
2300,2)
随时关注您喜欢的主题
如果需要,数据可以通过主成分分析进行排序,并使用乘法散射校正进行校正,然而,一个简单但有效的去除基线和线性变化的方法是对数据进行二阶导数。让我们这样做并检查结果。
# 计算二阶导数
X2 = savgol_......
deriv=2)
# 绘制二阶导数图像
plt.figu......
lot')):
plt.plot(wl, X2.T)
......
plt.show()
偏移已经消失,数据看起来更加紧密。
偏最小二乘回归
现在是时候优化偏最小二乘回归了。如上所述,我们想要运行一个具有可变组分数的偏最小二乘回归,并在交叉验证中测试其性能。实际上,我们想要找到最小化均方误差的组件数。让我们为此编写一个函数。
def optim_cv(X, ......
nts=True):
'''运行包括可变组件数量的偏最小二乘回归,最多到n_comp,并计算均方误差'''
mse = []
......
for i in component:
......
# 交叉验证
y_cv = cross......
mse.append(me......
y_cv))
# 在同一行上更新状态的技巧
stdout.flush()
stdout.write("\n")
# 计算并打印均方误差最小值的位置
msemin = np.......
(mse)
print("推荐的组件数: ", msemin+1)
stdout.write("\n")
if plot_components is True:
wit......
plt.plot(component[msemin], np.array(mse)[msemin], 'P', ms=10, mfc='red')
......
plt.title('PLS')
plt.xlim(left=-1)
plt.show()
# 使用最佳组件数定义PLS对象
pls_opt = PLSRs=msemin+1)
# 对整个数据集进行拟合
pls_opt.fit(X, y)......
# 交叉验证
y_cv = cross_v......
cv=10)
# 计算校准和交叉验证的得分
score_c = r2_score(y, y_c)
# 计算校准和交叉验证的均方误差
mse_c = mean_squared_error(y, y_c)
# 绘制回归图和评估指标
rangey = max(y) - min(y)
# 将交叉验证和响应拟合为一条直线
z = np.po(y, y_c, 1)
with plt.st......
'k')
# 绘制最佳拟合线
ax.plot(nplue', linewidth=1)
# 绘制理想的1:1线
ax.plot(y, y, color='green', linewidth=1)
......
plt.show()
return
这个函数首先运行了一个循环,通过偏最小二乘回归的组件数计算预测的均方误差。其次,它找到最小化均方误差的组件数,并使用该值再次运行偏最小二乘回归。在第二次计算中,计算了一堆指标并将其打印出来。
让我们通过将最大组件数设置为40来运行此函数。
optimi_components=True)
第一个图表是均方误差作为组件数的函数。建议最小化均方误差的组件数在该图中突出显示。
第二个图表是实际的回归图,包括预测指标。
同时,在屏幕上会打印出以下信息。
该模型在校准数据上似乎表现良好,但在验证集上的表现则不尽如人意。这是机器学习中所谓的过拟合的经典例子。
可下载资源
关于作者
Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!