Python用偏最小二乘回归Partial Least Squares,PLS分析桃子近红外光谱数据可视化

码林珊瑚
• 阅读 364

全文链接:https://tecdat.cn/?p=34376

原文出处:拓端数据部落公众号

PLS,即偏最小二乘(Partial Least Squares),是一种广泛使用的回归技术,用于帮助客户分析近红外光谱数据。如果您对近红外光谱学有所了解,您肯定知道近红外光谱是一种次级方法,需要将近红外数据校准到所要测量的参数的主要参考数据上。这个校准只需在第一次进行。一旦校准完成且稳健,就可以继续使用近红外数据预测感兴趣参数的值。

PCR只是使用通过PCA得到的若干主成分构建的回归模型。显然,这并不是最佳选择,而PLS就是解决这个问题的方法。

在本文中,我将向您展示如何使用Python构建一个简单的PLS回归模型。以下是我们将要做的概述。

  1. 展示PLS的基本代码
  2. 讨论我们要分析的数据及所需的预处理。我们将使用新鲜桃子水果的近红外光谱,其关联的Brix值与PCR相同。这是我们要校准的量。
  3. 我们将使用交叉验证方法构建我们的模型

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) # 计算均方误差

为了检查我们的校准效果如何,我们使用通常的指标来衡量。我们通过将交叉验证结果y_cv与已知响应进行比较来评估这些指标。为了优化我们的PLS回归参数(例如预处理步骤和成分数量),我们将跟踪这些指标,最常见的是均方差(MSE)。

还有一件事。在实际代码中,各种数组X, y等通常是从电子表格中读取的numpy数组。因此,您可能需要导入numpy(当然),pandas和其他一些库,我们将在下面看到。

这是Python中PLS回归的基本代码块。看一下数据导入和预处理了。

近红外数据导入和预处理

from sys import stdout

 ......
from sklearn.metrics import mean_squared_error, r2_score

接下来,让我们导入数据,这些数据保存在一个csv文件中。该数据由50个新鲜桃子的近红外光谱组成。每个光谱都有对应的Brix值(响应变量)。最后,每个光谱在1100 nm到2300 nm之间取600个波长点,步长为2 nm。

data = pd.read_csv('./datavalues.csv')

# 获取参考值

y = data[......
lues

# 获取光谱

X = data......
axis=1).values

# 获取波长

wl = np.a......
0,2300,2)

Python用偏最小二乘回归Partial Least Squares,PLS分析桃子近红外光谱数据可视化

如果需要,数据可以通过主成分分析进行排序,并使用乘法散射校正进行校正,然而,一个简单但有效的去除基线和线性变化的方法是对数据进行二阶导数。让我们这样做并检查结果。


# 计算二阶导数

X2 = savgol_fi
......
order = 2,deriv=2)

 

# 绘制二阶导数图像

plt.figure(fi......
(8,4.5))

with plt.style.context(('ggplot')):
......


    plt.show()
    

Python用偏最小二乘回归Partial Least Squares,PLS分析桃子近红外光谱数据可视化

偏移已经消失,数据看起来更加紧密。

偏最小二乘回归

现在是时候优化偏最小二乘回归了。如上所述,我们想要运行一个具有可变组分数的偏最小二乘回归,并在交叉验证中测试其性能。实际上,我们想要找到最小化均方误差的组件数。让我们为此编写一个函数。

def optimisls_cv(X, ......
=True):

 

    '''运行包括可变组件数量的偏最小二乘回归,最多到n_comp,并计算均方误差'''

 

    mse = []
......

    for i in component:

        pls = PLSR......


        # 交叉验证

        y_cv = cross_v......

 

        comp = 100*(i+1)/n_comp

        # 在同一行上更新状态的技巧

        stdout.write("\r%
......


 

    # 计算并打印均方误差最小值的位置

    msemin = np......


    stdout.write("\n")

 

    if plot_components is True:

        ......


          
            plt.title('PLS')

            plt.xlim(left=-1)

 

        plt.show()

 

    # 使用最佳组件数定义PLS对象

    pls_opt = PLSRe......


    # 对整个数据集进行拟合

    pls_opt.......
t.predict(X)

 

    # 交叉验证

    y_cv = cros......
 cv=10)

 

    # 计算校准和交叉验证的得分

    score_c = r2......
e(y, y_cv)

 

    # 计算校准和交叉验证的均方误差

    mse_c = mean_......
y, y_cv)

 

 

    # 绘制回归图和评估指标

    rangey = m......
- min(y_c)

 

    # 将交叉验证和响应拟合为一条直线

    z = np.poly......
'red', edgecolors='k')

        # 绘制最佳拟合线

        ax.plot(np.p......
, linewidth=1)

        # 绘制理想的1:1线

        ax.plot(y, ......
idth=1)

     

 

        plt.show()

 

    return

这个函数首先运行了一个循环,通过偏最小二乘回归的组件数计算预测的均方误差。其次,它找到最小化均方误差的组件数,并使用该值再次运行偏最小二乘回归。在第二次计算中,计算了一堆指标并将其打印出来。

让我们通过将最大组件数设置为40来运行此函数。

optimise......
, plot_components=True) 

第一个图表是均方误差作为组件数的函数。建议最小化均方误差的组件数在该图中突出显示。

Python用偏最小二乘回归Partial Least Squares,PLS分析桃子近红外光谱数据可视化

第二个图表是实际的回归图,包括预测指标。

Python用偏最小二乘回归Partial Least Squares,PLS分析桃子近红外光谱数据可视化

同时,在屏幕上会打印出以下信息。

Python用偏最小二乘回归Partial Least Squares,PLS分析桃子近红外光谱数据可视化

该模型在校准数据上似乎表现良好,但在验证集上的表现则不尽如人意。这是机器学习中所谓的过拟合的经典例子。

Python用偏最小二乘回归Partial Least Squares,PLS分析桃子近红外光谱数据可视化

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
4年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
4年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这