将R与机器学习Studio配合使用(经典版)

请升级到MicrosoftEdge以使用最新的功能、安全更新和技术支持。

重要

从2021年12月1日开始,你将无法创建新的机器学习工作室(经典)资源。在2024年8月31日之前,可继续使用现有的机器学习工作室(经典)资源。

ML工作室(经典)文档即将停用,将来可能不会更新。

本教程介绍如何使用机器学习工作室(经典版)创建、测试和执行R代码。最后,你将获得完整的预测解决方案。

机器学习Studio(经典版)包含许多功能强大的机器学习和数据操作模块。借助R编程语言,此组合提供可伸缩性和轻松部署机器学习Studio(经典),并具有R的灵活性和深入分析。

在本教程中,你将使用加州乳品生产和定价数据,其中包括有关多个奶制品生产的每月信息以及牛奶脂肪的价格,这是基准商品。

本部分介绍在机器学习Studio(经典)环境中与R编程语言交互的一些基础知识。R语言提供了一个功能强大的工具,用于在机器学习Studio(经典)环境中创建自定义分析和数据操作模块。

如果要开发R代码(例如,使用机器学习Studio(经典版)的Web服务,则绝对应该规划代码如何处理意外的数据输入和异常。为了保持清晰性,在所示的大部分代码示例中,我们并没有以检查或异常处理的方式包含太多内容。继续操作时,我们将使用R的异常处理功能提供多个函数示例。

R代码的执行和机器学习Studio(经典)平台上的输出主要位于output.log中。error.log中提供了一些其他信息。

x<-1.0z<-x+y此代码无法执行,这会导致错误条件。在“属性”窗格中选择“查看错误日志”将生成以下显示。

[Critical]Error:Error0063:ThefollowingerroroccurredduringevaluationofRscript:----------StartoferrormessagefromR----------object'y'notfoundobject'y'notfound-----------EndoferrormessagefromR-----------此错误消息没有意料之外的内容,明确标识了问题所在。

要检查R中的任何对象的值,可以将这些值打印到output.log文件。检查对象的值的规则本质上与交互式R会话中的相同。例如,如果在行中输入变量名称,则对象的值将打印到output.log文件中。

data.set<-data.frame(installed.packages())maml.mapOutputPort("data.set")如果此时不了解此代码的最后一行,请继续阅读。本文的其余部分将广泛讨论在机器学习Studio(经典)环境中使用R。

首先将csdairydata.csv文件加载到机器学习Studio(经典)。

现在,我们已在机器学习Studio(经典)中提供了一些数据,因此我们需要创建一个试验来执行分析。

此时,试验应类似于此示例。

让我们看看已加载到试验中的数据。在试验中,选择cadairydata.csv数据集的输出,然后选择“可视化”。应会看到类似于此摘要的内容。

此视图显示大量有用的信息。可以看到数据集的前几行。如果选择列,“统计信息”部分会显示有关该列的详细信息。例如,“功能类型”行显示分配给列机器学习Studio(经典)的数据类型。在开始执行任何严肃工作之前,请检查此视图。

让我们创建一个简单的第一个R脚本,在机器学习Studio(经典版)中进行试验。我们在RStudio中创建并测试了以下脚本。

##Onlyoneofthefollowingtwolinesshouldbeused##IfrunninginMachineLearningStudio(classic),usethefirstlinewithmaml.mapInputPort()##IfinRStudio,usethesecondlinewithread.csv()cadairydata<-maml.mapInputPort(1)#cadairydata<-read.csv("cadairydata.csv",header=TRUE,stringsAsFactors=FALSE)str(cadairydata)pairs(~Cotagecheese.Prod+Icecream.Prod+Milk.Prod+N.CA.Fat.Price,data=cadairydata)##Thefollowinglineshouldbeexecutedonlywhenrunningin##MachineLearningStudio(classic)maml.mapOutputPort('cadairydata')现在,我们需要将此脚本传输到机器学习Studio(经典)。可以剪切和粘贴,但在这种情况下,可以通过zip文件传输R脚本。

让我们从左到右查看每个输入。将光标置于输入上并阅读工具提示可看到每个输入的名称。

source("src/yourfile.R")#ReadsazippedRscriptload("src/yourData.rdata")#ReadsazippedRdatafile注意

机器学习Studio(经典版)将zip文件中的文件视为src/目录中的文件,因此需要将此目录名称作为前缀。例如,如果zip文件包含文件yourfile.R,并且yourData.rdata位于zip文件的根目录中,则使用时和loadsrc/yourData.rdata使用时source将这些文件src/yourfile.R寻址。

使用Dataset1输入可以将表格数据传递到R代码。在我们的简单脚本中,该maml.mapInputPort(1)函数从端口1读取数据。之后将此数据分配到代码中的数据框变量名。在我们的简单脚本中,第一行代码执行分配。

[ModuleOutput]InputDataStructure[ModuleOutput][ModuleOutput]{[ModuleOutput]"InputName":Dataset1[ModuleOutput]"Rows":228[ModuleOutput]"Cols":9[ModuleOutput]"ColumnTypes":System.Int32,3,System.Double,5,System.String,1[ModuleOutput]}页面更详细地介绍了列的详细信息,类似于以下输出。

[ModuleOutput][1]"Loadingvariableport1..."[ModuleOutput][ModuleOutput]'data.frame':228obs.of9variables:[ModuleOutput][ModuleOutput]$Column0:int12345678910...[ModuleOutput][ModuleOutput]$Year.Month:num19951995199519951995...[ModuleOutput][ModuleOutput]$Month.Number:int12345678910...[ModuleOutput][ModuleOutput]$Year:int1995199519951995199519951995199519951995...[ModuleOutput][ModuleOutput]$Month:chr"Jan""Feb""Mar""Apr"...[ModuleOutput][ModuleOutput]$Cotagecheese.Prod:num4.373.694.544.284.47...[ModuleOutput][ModuleOutput]$Icecream.Prod:num51.656.168.565.773.7...[ModuleOutput][ModuleOutput]$Milk.Prod:num2.111.932.162.132.23...[ModuleOutput][ModuleOutput]$N.CA.Fat.Price:num0.980.8920.8920.8970.897...这些结果大多和预期的一样,数据框中包含228个观测值和9个列。我们可以看到列名称、R数据类型和每个列的示例。

注意

Dataset2的输入行为与Dataset1相同。使用此输入,可以将第二个矩形数据表传递到R代码中。使用具有参数2的函数maml.mapInputPort(2)传递此数据。

可以使用maml.mapOutputPort()函数,通过结果Dataset1端口将R数据框的内容输出为表格。在我们的简单R脚本中,此操作由以下行执行。

maml.mapOutputPort('cadairydata')运行试验后,选择结果Dataset1输出端口,然后选择“可视化”。应会看到类似此示例的内容。

该输出看起来和输入一样,和我们的预期完全相同。

若要查看R设备输出,请选择端口,然后选择“可视化”。我们在此处看到R脚本中的标准输出和标准错误。

向下滚动后,可以看到R脚本的图形输出。

在本部分中,我们将对加州乳品数据执行一些基本数据筛选和转换操作。在本部分结束时,我们将提供适合生成分析模型的格式的数据。

更具体地说,在本部分中,我们将执行几个常见的数据清理和转换任务:类型转换、数据帧筛选、添加新计算列和值转换。此背景知识可帮助你应对遇到的各种实际问题。

当表格数据从外部源读入R时,最好检查列中生成的类型。可能需要类型字符的列,但在许多情况下,该列将显示为因子,反之亦然。在其他情况下,认为应为数字的列由字符数据表示,例如“1.23”而不是1.23作为浮点数。

幸运的是,只要有可能映射,就可以轻松地将一种类型转换为另一种类型。例如,不能将“内华达州”转换为数值,但你可以将其转换为因子(分类变量)。例如,可以将数字1转换为字符“1”或因子。

所有这些转换的语法非常简单:as.datatype()。这些类型转换函数包括以下函数:

查看我们在上一节中输入的列的数据类型,所有列都是数值类型。例外是标记为“Month”的列,该列的类型为字符。让我们将此类型转换为一个因素,并测试结果。

[ModuleOutput][1]"Loadingvariableport1..."[ModuleOutput][ModuleOutput]'data.frame':228obs.of9variables:[ModuleOutput][ModuleOutput]$Column0:int12345678910...[ModuleOutput][ModuleOutput]$Year.Month:num19951995199519951995...[ModuleOutput][ModuleOutput]$Month.Number:int12345678910...[ModuleOutput][ModuleOutput]$Year:int1995199519951995199519951995199519951995...[ModuleOutput][ModuleOutput]$Month:Factorw/14levels"Apr","April",..:6591118731413...[ModuleOutput][ModuleOutput]$Cotagecheese.Prod:num4.373.694.544.284.47...[ModuleOutput][ModuleOutput]$Icecream.Prod:num51.656.168.565.773.7...[ModuleOutput][ModuleOutput]$Milk.Prod:num2.111.932.162.132.23...[ModuleOutput][ModuleOutput]$N.CA.Fat.Price:num0.980.8920.8920.8970.897...[ModuleOutput][ModuleOutput][1]"Savingvariablecadairydata..."[ModuleOutput][ModuleOutput][1]"Savingthefollowingitem(s):.maml.oport1"Month的类型现在应为Factorw/14级别。此类型是一个问题,因为当年只有12个月。还可以检查结果数据集端口可视化中的类型是否为分类。

问题是“月”列尚未系统编码。在某些情况下,一个月称为“四月”,而另一个月则缩写为“四月”。可以通过将字符串剪裁为三个字符来解决此问题。代码行现在如以下示例所示。

##Ensurethecodingisconsistentandconvertcolumntoafactorcadairydata$Month<-as.factor(substr(cadairydata$Month,1,3))重新运行试验并查看输出日志。此处显示了预期结果。

[ModuleOutput][1]"Loadingvariableport1..."[ModuleOutput][ModuleOutput]'data.frame':228obs.of9variables:[ModuleOutput][ModuleOutput]$Column0:int12345678910...[ModuleOutput][ModuleOutput]$Year.Month:num19951995199519951995...[ModuleOutput][ModuleOutput]$Month.Number:int12345678910...[ModuleOutput][ModuleOutput]$Year:int1995199519951995199519951995199519951995...[ModuleOutput][ModuleOutput]$Month:Factorw/12levels"Apr","Aug","Dec",..:548197621211...[ModuleOutput][ModuleOutput]$Cotagecheese.Prod:num4.373.694.544.284.47...[ModuleOutput][ModuleOutput]$Icecream.Prod:num51.656.168.565.773.7...[ModuleOutput][ModuleOutput]$Milk.Prod:num2.111.932.162.132.23...[ModuleOutput][ModuleOutput]$N.CA.Fat.Price:num0.980.8920.8920.8970.897...[ModuleOutput][ModuleOutput][1]"Savingvariablecadairydata..."[ModuleOutput][ModuleOutput][1]"Savingthefollowingitem(s):.maml.oport1"现在因子变量具有所需的12个级别。

我们应该对数据集执行一点筛选。如果查看cadairydata数据帧中的列,你将看到两个不必要的列。第一列包含行号,这并不十分有用。第二列Year.Month包含冗余的信息。使用以下R代码可轻松地排除这两列。

#Removetwocolumnswedonotneedcadairydata<-cadairydata[,c(-1,-2)]在试验中运行此代码,并检查输出日志的结果。此处显示了这些结果。

[ModuleOutput][1]"Loadingvariableport1..."[ModuleOutput][ModuleOutput]'data.frame':228obs.of7variables:[ModuleOutput][ModuleOutput]$Month.Number:int12345678910...[ModuleOutput][ModuleOutput]$Year:int1995199519951995199519951995199519951995...[ModuleOutput][ModuleOutput]$Month:Factorw/12levels"Apr","Aug","Dec",..:548197621211...[ModuleOutput][ModuleOutput]$Cotagecheese.Prod:num4.373.694.544.284.47...[ModuleOutput][ModuleOutput]$Icecream.Prod:num51.656.168.565.773.7...[ModuleOutput][ModuleOutput]$Milk.Prod:num2.111.932.162.132.23...[ModuleOutput][ModuleOutput]$N.CA.Fat.Price:num0.980.8920.8920.8970.897...[ModuleOutput][ModuleOutput][1]"Savingvariablecadairydata..."[ModuleOutput][ModuleOutput][1]"Savingthefollowingitem(s):.maml.oport1"我们现在获得预期的结果。

若要创建时序模型,可以方便地创建包含时序开始以来的月份的列。我们将创建新的列Month.Count。

为了帮助组织代码,我们将创建第一个简单函数。num.month()然后,我们将应用此函数以在数据帧中创建新列。新代码如下所示:

##Createanewcolumnwiththemonthcount##Functiontofindthenumberofmonthsfromthefirst##monthofthetimeseriesnum.month<-function(Year,Month){##Findthestartingyearmin.year<-min(Year)##Computethenumberofmonthsfromthestartofthetimeseries12*(Year-min.year)+Month-1}##Computethenewcolumnforthedataframecadairydata$Month.Count<-num.month(cadairydata$Year,cadairydata$Month.Number)现在运行更新的试验,并使用输出日志查看结果。此处显示了这些结果。

[ModuleOutput][1]"Loadingvariableport1..."[ModuleOutput][ModuleOutput]'data.frame':228obs.of8variables:[ModuleOutput][ModuleOutput]$Month.Number:int12345678910...[ModuleOutput][ModuleOutput]$Year:int1995199519951995199519951995199519951995...[ModuleOutput][ModuleOutput]$Month:Factorw/12levels"Apr","Aug","Dec",..:548197621211...[ModuleOutput][ModuleOutput]$Cotagecheese.Prod:num4.373.694.544.284.47...[ModuleOutput][ModuleOutput]$Icecream.Prod:num51.656.168.565.773.7...[ModuleOutput][ModuleOutput]$Milk.Prod:num2.111.932.162.132.23...[ModuleOutput][ModuleOutput]$N.CA.Fat.Price:num0.980.8920.8920.8970.897...[ModuleOutput][ModuleOutput]$Month.Count:num0123456789...[ModuleOutput][ModuleOutput][1]"Savingvariablecadairydata..."[ModuleOutput][ModuleOutput][1]"Savingthefollowingitem(s):.maml.oport1"看起来一切正常。数据框中包含了具有预期值的新列。

如果查看数据帧摘要中的值,则应在此处看到一些奇怪的内容。加利福尼亚州生产的冰激凌比牛奶还多吗?不,当然不是。问题是单位不同。价格以美元为单位,牛奶单位为100万英镑,冰淇淋单位为1000加仑,平房奶酪单位为1000英镑。假设冰淇淋每加仑重约6.5磅,我们可以轻松地执行乘法来转换这些值,以便它们全部以1,000磅的等单位为单位。

对于预测模型,我们使用乘法模型来调整此数据的趋势和季节性调整。日志转换允许我们使用线性模型来简化此过程。可以在应用乘数的相同函数中应用对数转换。

在以下代码中,我们定义一个新函数,log.transform()并将其应用于包含数值的行。RMap()函数用于将log.transform()函数应用到数据框的所选列。该Map()函数类似于apply(),但它允许函数的多个参数列表。请注意,乘数列表向log.transform()函数提供了另一个参数。该na.omit()函数用作一些清理,以确保数据帧中没有缺失或未定义的值。

如果你不习惯在R中进行防御性编程,则所有这些代码可能都是压倒性的。让我们逐步完成主要步骤:

在试验中执行此R代码,并在output.log文件中查看打印输出。现在,你将看到日志中四列的转换值,如下所示。

[ModuleOutput][1]"Loadingvariableport1..."[ModuleOutput][ModuleOutput]'data.frame':228obs.of8variables:[ModuleOutput][ModuleOutput]$Month.Number:int12345678910...[ModuleOutput][ModuleOutput]$Year:int1995199519951995199519951995199519951995...[ModuleOutput][ModuleOutput]$Month:Factorw/12levels"Apr","Aug","Dec",..:548197621211...[ModuleOutput][ModuleOutput]$Cotagecheese.Prod:num1.471.311.511.451.5...[ModuleOutput][ModuleOutput]$Icecream.Prod:num5.825.96.16.066.17...[ModuleOutput][ModuleOutput]$Milk.Prod:num7.667.577.687.667.71...[ModuleOutput][ModuleOutput]$N.CA.Fat.Price:num6.896.796.796.86.8...[ModuleOutput][ModuleOutput]$Month.Count:num0123456789...[ModuleOutput][ModuleOutput][1]"Savingvariablecadairydata..."[ModuleOutput][ModuleOutput][1]"Savingthefollowingitem(s):.maml.oport1"可以看到值已被转换。牛奶生产现在大大超过了所有其他奶制品生产,回忆说,我们现在正在研究一个日志规模。

正如我们对第一个示例所做的那样,我们将逐步完成示例。在某些时候,我们将在每个步骤中仅显示递增的R代码行。

第一步,读取数据框,并确保得到预期的结果。下面的代码可执行此作业。

#CommentthefollowingifusingRStudiocadairydata<-maml.mapInputPort(1)str(cadairydata)#Checktheresults现在,运行试验。新的执行R脚本形状的日志应如以下示例所示。

[ModuleOutput][1]"Loadingvariableport1..."[ModuleOutput][ModuleOutput]'data.frame':228obs.of8variables:[ModuleOutput][ModuleOutput]$Month.Number:int12345678910...[ModuleOutput][ModuleOutput]$Year:int1995199519951995199519951995199519951995...[ModuleOutput][ModuleOutput]$Month:Factorw/12levels"Apr","Aug","Dec",..:548197621211...[ModuleOutput][ModuleOutput]$Cotagecheese.Prod:num1.471.311.511.451.5...[ModuleOutput][ModuleOutput]$Icecream.Prod:num5.825.96.16.066.17...[ModuleOutput][ModuleOutput]$Milk.Prod:num7.667.577.687.667.71...[ModuleOutput][ModuleOutput]$N.CA.Fat.Price:num6.896.796.796.86.8...[ModuleOutput][ModuleOutput]$Month.Count:num0123456789...此数据具有预期的类型和格式。现在,Month列的类型为因子,并且具有预期的级别数。

我们需要向数据框中添加一个时序对象。将当前代码替换为以下代码,这将添加新的POSIXct类列。

#CommentthefollowingifusingRStudiocadairydata<-maml.mapInputPort(1)##CreateanewcolumnasaPOSIXctobjectSys.setenv(TZ="PST8PDT")cadairydata$Time<-as.POSIXct(strptime(paste(as.character(cadairydata$Year),"-",as.character(cadairydata$Month.Number),"-0100:00:00",sep=""),"%Y-%m-%d%H:%M:%S"))str(cadairydata)#Checktheresults现在,检查日志。它应类似于此示例。

[ModuleOutput][1]"Loadingvariableport1..."[ModuleOutput][ModuleOutput]'data.frame':228obs.of9variables:[ModuleOutput][ModuleOutput]$Month.Number:int12345678910...[ModuleOutput][ModuleOutput]$Year:int1995199519951995199519951995199519951995...[ModuleOutput][ModuleOutput]$Month:Factorw/12levels"Apr","Aug","Dec",..:548197621211...[ModuleOutput][ModuleOutput]$Cotagecheese.Prod:num1.471.311.511.451.5...[ModuleOutput][ModuleOutput]$Icecream.Prod:num5.825.96.16.066.17...[ModuleOutput][ModuleOutput]$Milk.Prod:num7.667.577.687.667.71...[ModuleOutput][ModuleOutput]$N.CA.Fat.Price:num6.896.796.796.86.8...[ModuleOutput][ModuleOutput]$Month.Count:num0123456789...[ModuleOutput][ModuleOutput]$Time:POSIXct,format:"1995-01-01""1995-02-01"...从此摘要中可以看到新列实际为POSIXct类。

让我们探讨一下此数据集的一些变量。散点图矩阵是生成快速外观的好方法。我们将前面的R代码中的函数替换为str()以下行。

pairs(~Cotagecheese.Prod+Icecream.Prod+Milk.Prod+N.CA.Fat.Price,data=cadairydata,main="PairwiseScatterplotsofdairytimeseries")运行此代码,并查看发生的情况。R设备端口生成的绘图应如以下示例所示。

这些变量之间的关系中存在一些奇怪的结构。也许这种结构源于数据的趋势以及我们尚未标准化变量的事实。

若要执行关联分析,我们需要取消趋势并标准化变量。我们只需使用Rscale()函数,该函数可以同时对变量进行中心化和规范化处理。该函数可能运行较快。但是,让我们看看R中的防御性编程示例。

以下ts.detrend()函数执行这两项操作。以下两行代码对数据进行去趋势处理,并标准化值。

我们已经讨论了值转换中的防御性编程示例。这两个计算代码块包装在tryCatch()中。对于某些错误,返回原始输入向量是有意义的。在其他情况下,我们将返回零的向量。

请注意,用于去趋势的线性回归是一个时序回归。预测器变量是一个时序对象。

定义后ts.detrend(),我们将它应用于数据帧中感兴趣的变量。我们必须使用as.data.frame()将生成的列表lapply()强制添加到数据帧中的数据。由于防御方面ts.detrend(),无法处理其中一个变量不会阻止对其他变量进行正确的处理。

最后一行代码创建成对散点图。运行R代码后,散点图的结果如下所示。

可以将这些结果与前面示例中所示的结果进行比较。去除趋势和标准化变量后,这些变量之间的关系结构就不那么明显了。

##Afunctiontocomputepairwisecorrelationsfroma##listoftimeseriesvaluevectorspair.cor<-function(pair.ind,ts.list,lag.max=1,plot=FALSE){ccf(ts.list[[pair.ind[1]]],ts.list[[pair.ind[2]]],lag.max=lag.max,plot=plot)}##Alistofthepairwiseindicescorpairs<-list(c(1,2),c(1,3),c(1,4),c(2,3),c(2,4),c(3,4))##Computethelistofccfobjectscadairycorrelations<-lapply(corpairs,pair.cor,df.detrend)cadairycorrelations运行此代码将生成此处显示的日志。

df.correlations<-data.frame(do.call(rbind,lapply(cadairycorrelations,'[[',1)))c.names<-c("correlationpair","-1lag","0lag","+1lag")r.names<-c("CorrCotCheese-IceCream","CorrCotCheese-MilkProd","CorrCotCheese-FatPrice","CorrIceCream-MikProd","CorrIceCream-FatPrice","CorrMilkProd-FatPrice")##Buildadataframewiththerownamescolumnandthe##correlationdataframeandassignthecolumnnamesoutframe<-cbind(r.names,df.correlations)colnames(outframe)<-c.namesoutframe##WARNING!##ThefollowinglineworksonlyinMachineLearningStudio(classic)##WhenrunninginRStudio,thiscodewillresultinanerror#maml.mapOutputPort('outframe')第一行代码有点棘手,一些解释可能有助于理解它。从内到外工作,我们有:

运行代码将生成此处显示的输出,当我们选择“可视化”以查看结果数据集端口上的输出。和预期的一样,行名在第一列中。

我们的数据现在采用适合分析的形式,我们已确定变量之间没有明显的关联。让我们继续并创建时序预测模型。使用此模型,我们将预测2013年12个月的加州牛奶产量。

我们的预测模型包含两个成分:趋势成分和季节性成分。完满的预测是这两个成分的乘积。此类型模型被称为乘法模型。另一种可供选择的模型为加法模型。我们已经将日志转换应用于感兴趣的变量,这使得此分析变得易于处理。

#IfrunninginMachineLearningStudio(classic),uncommentthefirstlinewithmaml.mapInputPort()cadairydata<-maml.mapInputPort(1)##CreateanewcolumnasaPOSIXctobjectSys.setenv(TZ="PST8PDT")cadairydata$Time<-as.POSIXct(strptime(paste(as.character(cadairydata$Year),"-",as.character(cadairydata$Month.Number),"-0100:00:00",sep=""),"%Y-%m-%d%H:%M:%S"))str(cadairydata)运行此代码,并查看日志。结果应如下例所示。

[ModuleOutput][1]"Loadingvariableport1..."[ModuleOutput][ModuleOutput]'data.frame':228obs.of9variables:[ModuleOutput][ModuleOutput]$Month.Number:int12345678910...[ModuleOutput][ModuleOutput]$Year:int1995199519951995199519951995199519951995...[ModuleOutput][ModuleOutput]$Month:Factorw/12levels"Apr","Aug","Dec",..:548197621211...[ModuleOutput][ModuleOutput]$Cotagecheese.Prod:num1.471.311.511.451.5...[ModuleOutput][ModuleOutput]$Icecream.Prod:num5.825.96.16.066.17...[ModuleOutput][ModuleOutput]$Milk.Prod:num7.667.577.687.667.71...[ModuleOutput][ModuleOutput]$N.CA.Fat.Price:num6.896.796.796.86.8...[ModuleOutput][ModuleOutput]$Month.Count:num0123456789...[ModuleOutput][ModuleOutput]$Time:POSIXct,format:"1995-01-01""1995-02-01"...有了这个结果,我们就可以开始分析了。

构造数据帧后,需要创建训练数据集。该数据包含所有观测值,2013年的12个月的数据除外,2013年数据是测试数据集。以下代码将数据框划分为不同子集,并创建乳品生产和价格变量的图形。然后,创建四个生产和价格变量的绘图。在Map()函数中使用匿名函数定义图形的一些参数,并遍历其他两个参数的列表。如果你认为for循环会在这里正常工作,你是正确的。但是,由于R是一种功能语言,因此我们正在研究一种功能方法。

现在,我们已经创建了一个时序对象并查看了数据,接下来让我们开始为加州牛奶生产数据构建趋势模型。可以使用时序回归。从绘图中可以清楚地看出,我们需要更多的斜率和截距来准确建模训练数据中观察到的趋势。

鉴于数据规模较小,我们将在RStudio中生成趋势模型,然后将生成的模型剪切并粘贴到机器学习Studio(经典)。RStudio为此类型的交互式分析提供了交互式环境。

作为第一次尝试,我们将尝试一个多项式回归,其幂高达3。这些类型的模型过度拟合存在真正的危险。最好避免高序术语。该I()函数禁止解释内容(按原样解释内容),并允许在回归公式中编写文本解释函数。

milk.lm<-lm(Milk.Prod~Time+I(Month.Count^2)+I(Month.Count^3),data=cadairytrain)summary(milk.lm)此函数生成以下输出。

####Call:##lm(formula=Milk.Prod~Time+I(Month.Count^2)+I(Month.Count^3),##data=cadairytrain)####Residuals:##Min1QMedian3QMax##-0.12667-0.027300.002360.029430.10586####Coefficients:##EstimateStd.ErrortvaluePr(>|t|)##(Intercept)6.33e+001.45e-0143.60<2e-16***##Time1.63e-091.72e-109.47<2e-16***##I(Month.Count^2)-1.71e-064.89e-06-0.350.726##I(Month.Count^3)-3.24e-081.49e-08-2.170.031*##---##Signif.codes:0'***'0.001'**'0.01'*'0.05'.'0.1''1####Residualstandarderror:0.0418on212degreesoffreedom##MultipleR-squared:0.941,AdjustedR-squared:0.94##F-statistic:1.12e+03on3and212DF,p-value:<2e-16在此输出中的P值(Pr(>|t|))中,可以看到平方术语可能并不重要。我们将使用该update()函数通过删除平方术语来修改此模型。

milk.lm<-update(milk.lm,.~.-I(Month.Count^2))summary(milk.lm)此函数生成以下输出。

####Call:##lm(formula=Milk.Prod~Time+I(Month.Count^3),data=cadairytrain)####Residuals:##Min1QMedian3QMax##-0.12597-0.026590.001850.029630.10696####Coefficients:##EstimateStd.ErrortvaluePr(>|t|)##(Intercept)6.38e+004.07e-02156.6<2e-16***##Time1.57e-094.32e-1136.3<2e-16***##I(Month.Count^3)-3.76e-082.50e-09-15.1<2e-16***##---##Signif.codes:0'***'0.001'**'0.01'*'0.05'.'0.1''1####Residualstandarderror:0.0417on213degreesoffreedom##MultipleR-squared:0.941,AdjustedR-squared:0.94##F-statistic:1.69e+03on2and213DF,p-value:<2e-16此输出看起来更好。所有项都重要。2e-16值是默认值,不应过于认真对待。

milk.lm<-lm(Milk.Prod~Time+I(Month.Count^3),data=cadairytrain)plot(cadairytrain$Time,cadairytrain$Milk.Prod,xlab="Time",ylab="LogCAMilkProduction1000slb",type="l")lines(cadairytrain$Time,predict(milk.lm,cadairytrain),lty=2,col=2)

从图上看来趋势模型很好地拟合了数据。此外,似乎没有过度拟合的证据,如模型曲线中的奇怪摆动。

有了趋势模型之后,我们需要继续深入并考虑季节效应。我们将使用年度月份作为线性模型中的虚拟变量来捕获逐月效果。将因子变量引入模型时,不得计算截距。如果不执行此操作,公式将过度指定,R将删除其中一个所需因素,但保留截距词。

由于我们有令人满意的趋势模型,因此可以使用函数update()将新术语添加到现有模型。更新公式中的为-1删除截距项。此时在RStudio中继续运行:

milk.lm2<-update(milk.lm,.~.+Month-1)summary(milk.lm2)此函数生成以下输出。

milk.lm2<-lm(Milk.Prod~Time+I(Month.Count^3)+Month-1,data=cadairytrain)plot(cadairytrain$Time,cadairytrain$Milk.Prod,xlab="Time",ylab="LogCAMilkProduction1000slb",type="l")lines(cadairytrain$Time,predict(milk.lm2,cadairytrain),lty=2,col=2)在机器学习Studio(经典)中运行此代码将生成此处所示的绘图。

此示例中显示的数据适合相当令人鼓舞。趋势和季节性效应(月度变体)看起来合理。

作为模型的另一项检查,让我们看看残差。以下代码从两个模型中计算预测值、计算季节性模型的残差,并绘制训练数据的残差图。

##Computepredictionsfromourmodelspredict1<-predict(milk.lm,cadairydata)predict2<-predict(milk.lm2,cadairydata)##Computeandplottheresidualsresiduals<-cadairydata$Milk.Prod-predict2plot(cadairytrain$Time,residuals[1:216],xlab="Time",ylab="ResidualsofSeasonalModel")残差图如下所示。

这些残差看起来合理。除了2008-2009年经济衰退的影响外,没有特定的结构,我们的模式并没有特别充分解释。

还可以使用plot.lm()生成一系列诊断图。

##Showthediagnosticplotsforthemodelplot(milk.lm2,ask=FALSE)此代码生成以下示例中所示的一系列诊断绘图。

完成我们的示例只需做一件事。我们需要计算预测值,并且计算预测值和实际数据的误差。我们的预测针对的是2013年12个月。我们可以计算此预测的错误度量值,以计算不属于训练数据集的实际数据。此外,可以比较18年的训练数据和12个月的测试数据的性能。

大量指标用于测量时序模型的性能。在本例中,我们将使用根均方(RMS)错误。以下函数计算两个序列之间的RMS误差。

配备一个用于度量RMS错误的函数,让我们生成并输出包含RMS错误的数据帧。我们将单独包含趋势模型的术语和具有季节性因素的完整模型。以下代码使用我们构造的两个线性模型执行该作业。

##ComputetheRMSerrorinadataframe##Includetherownamesinthefirstcolumnsotheywill##appearintheoutputoftheExecuteRScriptRMS.df<-data.frame(rowNames=c("TrendModel","SeasonalModel"),Traing=c(RMS.error(predict1[1:216],cadairydata$Milk.Prod[1:216]),RMS.error(predict2[1:216],cadairydata$Milk.Prod[1:216])),Forecast=c(RMS.error(predict1[217:228],cadairydata$Milk.Prod[217:228]),RMS.error(predict2[217:228],cadairydata$Milk.Prod[217:228])))RMS.df##Thefollowinglineshouldbeexecutedonlywhenrunningin##MachineLearningStudio(classic)maml.mapOutputPort('RMS.df')运行此代码将生成结果数据集输出端口中显示的输出。

从这些结果可以看出,向模型中添加季节性因子使RMS误差显著减少。不出所料,训练数据的RMS误差略小于预测数据的误差。

RStudio记录得很好。下面是一些指向RStudio文档的关键部分的链接,可帮助你入门。

本R编程教程介绍了将R语言与机器学习Studio(经典)配合使用所需的基础知识。如果不熟悉R,CRAN上提供了两个简介:

THE END
1.AI创作图高蛋白食谱高蛋白早餐高蛋白膳食低脂肪健身餐食高蛋白饮高蛋白食谱 高蛋白早餐 高蛋白膳食 低脂肪健身餐食 高蛋白饮食 低脂食谱 十大高蛋白食物排行榜 健康早餐食法 高蛋白质饮食 高清西红柿炒鸡蛋图片 低脂肪饮食 减脂食谱 生酮饮食 减脂增肌配餐 相关图片 更多> 他的图片 关于昵图 昵图简介 网站声明 网站公约 汇图网 版权声明 联系我们 常见问题 注册 / 登录 关于https://www.nipic.com/show/48951103.html
2.WWW’24:CoFARS美团外卖推荐中基于上下文的长序列建模技术但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。 第一阶段(10天):初阶应用 该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95%https://blog.csdn.net/m0_59235699/article/details/143956108
3.智慧校园统一管理平台清单项 1.AI智能分析筛选 支持以学校,教学楼,教室号,节次,时间的组合选择来精准筛选课程,进而显示此课程的AI智能分析结 果 2.AI智能分析记录 支持按列表显示AI智能分析记录,提供学校,教学楼,教室号,,节次,时间等信息,可快速查看分析结 果 3.教学环节时序图 支持以时序图的方式来展现教学https://ztbxx.caep.cn/TPWeb/WebbuilderMIS/attach/downloadZtbAttach.jspx?attachGuid=1f9e37e3-bec3-44c9-8256-389abed0a58c&appUrlFlag=ztbAttach&siteGuid=7eb5f7f1-9041-43ad-8e13-8fcb82ea831a
4.“S”型(精选十篇)图4-5 学生任务时序图 四、结语 本管理平台主要面向四种用户:管理员、教师、审核组、学生。主要实现的是管理员后台管理、教师申报课题、审核组审核课题、学生选择课题等功能。有效的解决了高校选题管理周期长、效率低、操作难的问题,提高了高校选题管理工作的工作效率,加快了各高校的信息化建设。 https://www.360wenmi.com/f/cnkeyzxbe303.html
5.数学建模的全过程包括下面哪几个?根据《机关文件材料归档范围和文书档案保管期限规定》第12条,机关文书档案的保管期限定为()。A.问题分析 https://www.shuashuati.com/ti/f1ac0309833c448782bc29caf662f0f1.html