主要内容

使用Tall数组的大数据统计和机器学习

这个例子展示了如何使用MATLAB®和Statistics and machine learning Toolbox™对内存不足的数据执行统计分析和机器学习。

Tall数组和表是为处理内存外数据而设计的。这种类型的数据包含非常多的行(观察值),而列(变量)的数量较少。您可以使用tall数组来处理大型数据集,而不是编写专门的代码来考虑数据的巨大大小,例如使用MapReduce,其方式类似于内存中的MATLAB数组。最根本的区别在于,tall数组通常保持未求值状态,直到您请求执行计算。

当您在高数组上执行计算时,MATLAB®使用并行池(如果您有并行计算工具箱™,则默认为并行池)或本地MATLAB会话。要在使用并行计算工具箱时使用本地MATLAB会话运行示例,请使用mapreduce函数。

mapreduce (0)

本例使用单台计算机上的数据子集来开发线性回归模型,然后扩展到分析所有数据集。你可以进一步扩大这个分析:

  • 处理不能读入内存的数据

  • 使用MATLAB并行服务器™处理跨集群分布的数据

  • 与Hadoop®和Spark®等大数据系统集成

使用Tall数组的机器学习简介

Statistics and Machine learning Toolbox中的几种无监督和有监督学习算法可用于tall数组,对内存不足的数据进行数据挖掘和预测建模。这些算法适用于内存外数据,并且可以包含与内存内算法稍有不同的内容。功能包括:

  • k - means聚类

  • 线性回归

  • 广义线性回归

  • 逻辑回归

  • 判别分析

MATLAB中内存外数据的机器学习工作流程类似于内存中数据:

  1. 进行预处理

  2. 探索

  3. 开发模型

  4. 验证模型

  5. 扩展到更大的数据

本例在开发航班延误预测模型时采用了类似的结构。这些数据包括1987年至2008年航空公司航班信息的大型文件。示例目标是基于多个变量预测出发延迟。

关于tall数组基本方面的详细信息包含在示例中在MATLAB中使用Tall数组分析大数据。这个例子扩展了分析,包括使用高数组的机器学习。

创建航空公司数据的高表

数据存储库是存储大到内存无法容纳的数据集合的存储库。您可以从许多不同的文件格式创建数据存储,作为从外部数据源创建tall数组的第一步。

为示例文件创建一个数据存储airlinesmall.csv。选择感兴趣的变量,处理“NA”值作为缺失的数据,并生成数据的预览表。

Ds = datastore(fullfile(matlabroot),“工具箱”matlab的“演示”“airlinesmall.csv”));ds。SelectedVariableNames = {“年”“月”“DayofMonth”“DayOfWeek”“DepTime”“ArrDelay”“DepDelay”“距离”};ds。TreatAsMissing =“NA”;Pre =预览(ds)
pre =8×8表年月DayofMonth DayOfWeek DepTime ArrDelay DepDelay距离_________ __________ _________ _______ ________ ________ ________ 1987 1021 3 642 8 12 308 1987 10 26 1 1021 8 1 296 1987 10 23 5 2055 21 20 480 1987 10 23 5 1332 13 12 296 1987 10 22 4 629 4 -1 373 1987 10 28 3 1446 59 63 308 1987 10 8 4 928 3 -2 447 1987 10 10 6 859 11 -1 954

创建一个由数据存储支持的高表,以方便处理数据。tall数组的底层数据类型取决于数据存储的类型。在本例中,数据存储是表格文本,并返回一个高表。显示包括数据预览,并指出尺寸未知。

Tt =高(ds)
tt = Mx8高表年月DayofMonth DayOfWeek DepTime ArrDelay DepDelay距离  ____ _____ __________ _________ _______ ________ ________ ________ 1987 10 21 3 642 8 308 1987 10 26 1 1021 8 1 296 1987 10 23 5 2055 21 480 1987 10 23 5 1332 13 629年12 296 1987 10 22日4 4 1 373 1987 10 28 1446 59 63 308 1987 928 4 3 2 447 1987 10 10 6 859 11 954  : : : : : : : : : : : : : : : :

数据进行预处理

这个例子旨在更详细地探索一天中的时间和一周中的一天。将星期几转换为带标签的分类数据,并从数字出发时间变量确定一天中的小时。

tt。DayOfWeek = categorical(t .)DayOfWeek 1:7, {“太阳”“我的”“面前”“结婚”“星期四”“星期五”“坐”});tt。人力资源= discretize(tt.DepTime,0:100:2400,0:23)
tt = Mx9高表年月DayofMonth DayOfWeek DepTime ArrDelay DepDelay距离人力资源  ____ _____ __________ _________ _______ ________ ________ ________ __ 21个外胎1987 642 8 1021 308 6 1987年10 26太阳8 2055 296 1987 10 23日星期四21 480 296 1987 10 1332年清华23日13 12 13 1987 629 22结婚4 1 373 6 1987 10 28外胎1446 59 63 308 928 1987 10 8结婚3 2 447 9 1987 10 859星期五11 1 954 8  : : : : : : : : : : : : : : : : : :

只包括2000年之后的年份,忽略缺少数据的行。根据逻辑条件识别感兴趣的数据。

Idx = tt。一年>= 2000 &~任何(ismissing (tt), 2);Tt = Tt (idx,:);

按组浏览数据

有许多探查函数可用于高数组。例如,grpstats函数计算tall数组的分组统计信息。通过使用按星期分组的汇总统计来确定数据的中心性和分布,从而探索数据。同时,探讨出发延误和到达延误之间的关系。

G = grpstats(tt(:,{)“ArrDelay”“DepDelay”“DayOfWeek”}),“DayOfWeek”“的意思是”“性病”“偏斜”“峰度”})
g = Mx11高表GroupLabel DayOfWeek GroupCount mean_ArrDelay std_ArrDelay skewness_ArrDelay kurtosis_ArrDelay mean_DepDelay std_DepDelay skewness_DepDelay kurtosis_DepDelay  __________ _________ __________ _____________ ____________ _________________ _________________ _____________ ____________ _________________ _________________ ?????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : : : : : : : : : : : : : : : : : : : : : :
C = corr(t . depdelay,t . arrdelay)
C = MxNx…高阵列???…???…? ? ? ... : : : : : :

这些命令生成更多的高数组。直到显式地将结果收集到工作区中,才执行命令。的收集命令触发执行,并尝试最小化通过数据执行计算所需的传递次数。收集要求结果变量适合内存。

[statsByDay,C] = collect (g,C)
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在2.8秒内完成评估在3.8秒内完成
statsByDay =7×11表GroupLabel DayOfWeek GroupCount mean_ArrDelay std_ArrDelay skewness_ArrDelay kurtosis_ArrDelay mean_DepDelay std_DepDelay skewness_DepDelay kurtosis_DepDelay  __________ _________ __________ _____________ ____________ _________________ _________________ _____________ ____________ _________________ _________________ {' 星期五的}星期五7339 4.1512 32.1 7.082 120.53 7.0857 29.339 8.9387 168.37{‘我的’}Mon 8443 5.2487 32.453 4.5811 37.175 6.8319 28.573 5.6468 50.271{“坐”}坐8045 7.132 33.108 3.645722.991 9.1557 29.731 4.5135 31.228 {'Sun'}太阳8570 7.7515 36.003 5.7943 80.91 9.3324 32.516 7.2146 118.25 {'Thu'} Thu 8601 10.053 36.18 4.1381 37.051 10.923 34.708 1.1414 138.38 {'Tues'} Tues 8381 6.4786 32.322 4.374 38.694 7.6083 28.394 5.2012 46.249 {'Wed'} Wed 8489 9.3324 37.406 5.1638 57.479 10 33.426 6.4336 85.426
C = 0.8966

包含结果的变量现在是工作区中的内存变量。根据这些计算,数据中会出现变化,您可以进一步研究延迟之间的相关性。

探索一周中的一天和一天中的小时的影响,并获得额外的统计信息,如平均值的标准误差和平均值的95%置信区间。您可以传递整个tall表并指定要在哪些变量上执行计算。

byDayHr = grpstats(tt,{“人力资源”“DayOfWeek”},“的意思是”扫描电镜的“meanci”},“DataVar”“DepDelay”);byDayHr = collect (byDayHr);
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在4秒内完成评估在4.8秒内完成

由于tall数组的数据分区,输出可能是无序的。重新排列内存中的数据,以便进一步探索。

x = unstack(byDayHr(:,{)“人力资源”“DayOfWeek”“mean_DepDelay”}),“mean_DepDelay”“DayOfWeek”);X =悲伤(X)
x =24×8表人力资源孙Mon外胎结婚星期四星期五坐  __ _______ ________ ________ _______ _______ _______ _______ 0 38.519 71.914 39.656 34.667 90 25.536 65.579 45.846 27.875 93.6 125.23 52.765 38.091 29.182 - 2南39 102 78.25 - -1.5南南南南南南-7.3333 - -10.5 -377.5 -6.2857 53.5南4 7 7 5南5 6 -2.2409 -3.7099 -4.0146 -3.9565 -3.5897 -3.5766 -4.1474 0.4 -1.8909 -1.9802 -1.8304 -1.3578 0.84161 -2.2537 7 8 3.4173 -0.47222 -0.18893 0.71546 0.08 1.069 -1.3221 2.3759 1.4054 1.6745 2.2345 2.96681.6727 0.88213 9 2.5325 1.6805 2.7656 2.683 5.6138 3.4838 2.5011 10 6.37 5.2868 3.2868 3.6822 7.5773 5.3372 6.9391 4.9979 11 6.9946 4.9165 5.5639 5.5936 7.0435 4.8989 5.2839 5.7081 7.9178 7.5269 8.586 13 8.0879 7.1017 5.0857 8.8082 8.2878 8.0675 6.2107 14 9.5164 5.8343 7.416 9.5954 8.6667 6.0677 8.444 15 8.1257 4.8802 7.4726 9.8674 10.235 7.167 8.6219

可视化高数组中的数据

当前,您可以使用柱状图histogram2binScatterPlot,ksdensity。所有的可视化都触发执行,类似于调用收集函数。

使用binScatterPlot来检验两者之间的关系人力资源DepDelay变量。

binScatterPlot (tt.Hr tt.DepDelay,“伽马”, 0.25)
使用Local MATLAB会话评估tall表达式:-通过1 / 1:在1.9秒内完成评估在2.6秒内完成评估使用Local MATLAB会话评估tall表达式:-通过1 / 1:在1.1秒内完成评估在1.2秒内完成
Ylim ([500]) xlabel(“一天中的时间”) ylabel (“延迟(分钟)”

图包含一个轴对象和其他类型为uicontrol的对象。axes对象包含一个类型为histogram2的对象。

正如在输出显示中所指出的,可视化通常对数据进行两次传递:一次执行分组,另一次执行分组计算并生成可视化。

将数据分割为训练集和验证集

为了开发机器学习模型,保留一部分数据用于训练和开发模型,另一部分数据用于测试模型是有用的。有许多方法可以将数据分成训练集和验证集。

使用datasample以获得随机抽样的数据。然后使用cvpartition将数据划分为测试集和训练集。要获得非分层分区,通过将数据样本乘以零来设置统一的分组变量。

为保证再现性,请使用设置随机数生成器的种子tallrng。结果可能因工作线程的数量和tall数组的执行环境而异。有关详情,请参阅控制代码运行的位置

tallrng (“默认”) data = datasample(tt,25000,“替换”、假);groups = 0*data.DepDelay;Y = cvpartition(groups,“坚持”, 1/3);dataTrain = data(training(y),:);dataTest = data(test(y),:);

拟合监督学习模型

建立基于几个变量的出发延误预测模型。线性回归模型函数fitlm行为类似于内存中函数。然而,使用tall数组进行计算会导致aCompactLinearModel,这对于大型数据集来说效率更高。模型拟合触发执行,因为它是一个迭代过程。

model = film (dataTrain,“ResponseVar”“DepDelay”
使用Local MATLAB会话评估tall表达式:- 2次通过1:在1.1秒内完成- 2次通过2:在2.8秒内完成评估在4.6秒内完成
模型=紧凑线性回归模型:DepDelay ~[8个预测因子中9项的线性公式]估计SE tStat pValue __________ __________ ________ __________ (Intercept) 30.715 75.873 0.40482 0.68562 Year -0.01585 0.037853 -0.41872 0.67543 Month 0.03009 0.028097 1.0709 0.28421 DayOfWeek_Mon -0.36333 0.35527 -0.86457 0.38729 DayOfWeek_Mon -0.36333 0.35245 -0.81091 0.41743 DayOfWeek_Wed -0.56082 0.35239 - 0.75883 0.11224 DayOfWeek_Thu -0.25295 0.35239 -0.71782 0.47288 DayOfWeek_Fri 0.91768 0.36625 2.5056 0.012234 DayOfWeek_Sat 0.45668 0.357851.2762 0.20191 DepTime -0.011551 0.0053851 -2.145 0.031964 ArrDelay 0.8081 0.002875 281.08 0 Distance 0.0012881 0.00016887 7.6281 2.5106e-14 Hr 1.4058 0.53785 2.6138 0.0089613 Number of observations: 16667, Error degrees of freedom: 16653 Root Mean Squared Error: 12.4 R-squared: 0.834, Adjusted R-Squared: 0.833 F-statistic vs. constant model: 6.41e+03, p-value = 0

预测和验证模型

显示显示适合信息,以及系数和相关系数统计。

模型变量包含关于拟合模型的信息作为属性,您可以使用点表示法访问这些属性。或者,双击工作区中的变量以交互方式浏览属性。

模型。Rsquared
ans =带有字段的结构体:普通:0.8335调整:0.8334

根据模型预测新的值,计算残差,并使用直方图进行可视化。的预测函数预测高数据和内存数据的新值。

pred = predict(model,dataTest);err = pred - dataTest.DepDelay;图直方图(呃,“BinLimits”(-100 100),“归一化”“pdf”
使用Local MATLAB会话评估tall表达式:-通过2中的1:在2.3秒内完成-通过2中的2:在1.4秒内完成评估在4.3秒内完成
标题(“残差直方图”

图包含一个轴对象。标题为直方图的轴对象包含直方图类型的对象。

评估和调整模型

查看显示中的输出p值,模型中可能不需要一些变量。您可以通过删除这些变量来降低模型的复杂性。

使用更紧密地检查模型中变量的重要性方差分析

A =方差分析(模型)
一个=9×5表SumSq DF MeanSq F pValue __________ _____ __________ _______ __________ Year 26.88 1 26.88 0.17533 0.67543 Month 175.84 1 175.84 1.1469 0.28421 DayofMonth 114.6 1 114.6 0.74749 0.38729 DayOfWeek 3691.4 6 615.23 4.0129 0.00050851 DepTime 705.42 1 705.42 4.6012 0.031964 ArrDelay 1.2112e+07 1 1.2112e+07 79004 0 Distance 8920.9 1 8920.9 58.188 2.5106e-14 Hr 1047.5 1 1047.5 6.8321 0.0089613 Error 2.5531e+06 16653 153.31

根据p值,变量一年,DayOfMonth对该模型不重要,因此您可以删除它们而不会对模型质量产生负面影响。

要进一步探索这些模型参数,请使用交互式可视化,例如plotSliceplotInterations,plotEffects。例如,使用plotEffects检验每个预测变量对出发延误的估计影响。

plotEffects(模型)

图包含一个轴对象。axes对象包含10个line类型的对象。

基于这些计算,ArrDelay主效应在模型中(它是高度相关的DepDelay)。其他影响是可以观察到的,但影响要小得多。此外,人力资源是由DepTime,所以这些变量中只有一个是模型所必需的。

减少变量的数量,排除所有的日期成分,然后拟合一个新的模型。

model2 = film (dataTrain,“DepDelay ~ DepTime + ArrDelay + Distance”
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在1.8秒内完成评估在2秒内完成
model2 =紧凑线性回归模型:DepDelay ~ 1 + DepTime + ArrDelay + Distance估计系数:估计SE tStat pValue _________ __________ _______ __________(截距)-1.4646 0.31696 -4.6207 3.8538e-06 DepTime 0.0025087 0.00020401 12.297 1.3333e-34 ArrDelay 0.80767 0.0028712 281.3 0距离0.0012981 0.00016886 7.6875 1.5838e-14观测数:16667,误差自由度:16663均方根误差:12.4 R-squared: 0.833,调整后的R-squared:f统计量vs常数模型:2.77e+04, p值= 0

模型开发

即使简化了模型,进一步调整变量之间的关系并包含特定的交互也是有用的。为了进一步实验,用更小的tall数组重复这个工作流。在调优模型时,为了提高性能,可以考虑在扩展到整个tall数组之前先从内存中提取少量数据。

在这个例子中,您可以使用类似逐步回归的功能,它适合于迭代的、内存中的模型开发。在对模型进行调优之后,您可以扩展到使用tall数组。

将数据的一个子集收集到工作空间中并使用stepwiselm在内存中迭代开发模型。

子集= gather(dataTest);
使用Local MATLAB会话评估tall表达式:-通过1 / 1:在1.3秒内完成评估在1.3秒内完成
sModel = stepwiselm(子集,“ResponseVar”“DepDelay”
1.增加ArrDelay, FStat = 42200.3016, pValue = 0添加DepTime, FStat = 51.7918, pValue = 6.70647e-13增加DepTime:ArrDelay, FStat = 42.4982, pValue = 7.48624e-11添加距离,FStat = 15.4303, pValue = 8.62963e-05增加ArrDelay:Distance, FStat = 231.9012, pValue = 1.135326e-51添加DayOfWeek, FStat = 3.4704, pValue = 0.0019917增加DayOfWeek:ArrDelay, FStat = 26.334, pValue = 3.16911e-31新增DayOfWeek:DepTime, FStat = 2.1732, pValue = 0.042528
sModel =线性回归模型:DepDelay ~[4个预测因子中9项的线性公式]估计SE tStat pValue ___________ __________ ________ __________ (Intercept) 1.1799 1.0675 1.1053 0.26904 DayOfWeek_Mon -2.1377 1.4298 -1.4951 0.13493 DayOfWeek_Wed -4.2868 1.4683 -2.9196 0.0035137 DayOfWeek_Wed -1.6233 1.476 -1.0998 0.27145 DayOfWeek_Thu -0.74772 1.5226 -0.49109 0.62338 DayOfWeek_Sat - 1.1121 1.5079 -1.1683 0.2427 DayOfWeek_Sat -2.1121 1.5214 -1.3882 0.16511 DepTime 7.5229e-05 0.00073613 0.10219 0.9186 ArrDelay 0.8671 0.013836 62.669 0距离0.0015163 0.00023426 6.47281.0167e-10 DayOfWeek_Mon:DepTime 0.0017633 0.0010106 1.7448 0.081056 DayOfWeek_Tues:DepTime 0.0032578 0.0010331 3.1534 0.0016194 DayOfWeek_Wed:DepTime 0.00097506 0.001044 0.93398 0.35034 dayofweek_friday:DepTime 0.0012517 0.0010694 1.1705 0.24184 DayOfWeek_Fri:DepTime 0.0026464 0.0010711 2.4707 0.013504 DayOfWeek_Sat:DepTime 0.0021477 0.0010646 2.0174 0.043689 DayOfWeek_Mon:ArrDelay -0.11023 0.014744 -7.4767 8.399e-14 DayOfWeek_Tues:ArrDelay -0.14589 0.014814 -9.8482 9.2943e-23DayOfWeek_Wed:ArrDelay -0.041878 0.012849 -3.2593 0.0011215 DayOfWeek_Thu:ArrDelay -0.096741 0.013308 -7.2693 3.9414e-13 DayOfWeek_Fri:ArrDelay -0.077713 0.015462 -5.0259 5.1147e-07 DayOfWeek_Sat:ArrDelay -0.13669 0.014652 -9.329 1.3472e -20 DepTime:ArrDelay 6.4148e-05 7.7372e-06 8.2909 1.3002e-16 ArrDelay:Distance -0.00010512 7.3888e-06 -14.227 2.1138e-45观测数:8333,误差自由度:8309标准差:12 r平方:0.845,调整后的r平方:f统计量vs常数模型:1.97e+03, p值= 0

由逐步拟合得到的模型包括相互作用项。

现在试着为高数据拟合一个模型fitlm返回的公式stepwiselm

model3 = fitlm(dataTrain, model3 . formula)
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在2秒内完成评估在2.1秒内完成
model3 =紧凑型线性回归模型:DepDelay ~[4个预测因子中9项的线性公式]估计SE tStat pValue ___________ __________ ________ __________ (Intercept) -0.31595 0.74499 -0.4241 0.6715 DayOfWeek_Mon -0.64218 1.0473 -0.61316 0.53978 DayOfWeek_Tues -0.90163 1.0383 -0.86836 0.38521 DayOfWeek_Wed -1.0798 1.0417 -1.0365 0.29997 DayOfWeek_Thu -3.2765 1.0379 -3.157 0.0015967 DayOfWeek_Fri 0.44193 1.0813 0.40869 0.68277 DayOfWeek_Sat 1.1428 1.0777 1.0604 0.28899 DepTime 0.0014188 0.00051612 2.7489 0.0059853 ArrDelay 0.72526 0.011907 60.913 0距离0.0014824 0.000170278.7059 3.4423e-18 DayOfWeek_Mon:DepTime 0.00040994 0.00073548 0.55738 0.57728 DayOfWeek_Tues:DepTime 0.00051826 0.00073645 0.70373 0.48161 DayOfWeek_Wed:DepTime 0.00058426 0.00073695 0.79281 0.4279 DayOfWeek_Thu:DepTime 0.0026229 0.00073649 3.5614 0.00036991 DayOfWeek_Fri:DepTime 0.0002959 0.000757194 0.38332 0.70149 DayOfWeek_Sat:DepTime -0.00060921 0.00075776 -0.80396 0.42143 DayOfWeek_Mon:ArrDelay -0.034886 0.010435 -3.3432 0.00082993 DayOfWeek_Tues:ArrDelay -0.0073661 0.010113 -0.72837 0.4664DayOfWeek_Wed:ArrDelay -0.028158 0.0099004 -2.8441 0.0044594 DayOfWeek_Thu:ArrDelay -0.061065 0.010381 -5.8821 4.1275e-09 DayOfWeek_Fri:ArrDelay 0.052437 0.010927 4.7987 1.6111e-06 DayOfWeek_Sat:ArrDelay 0.014205 0.01039 1.3671 0.1716 DepTime:ArrDelay 7.2632e-05 5.3946e-06 13.464 4.196e-41 ArrDelay:Distance -2.4743e-05 4.6508e-06 -5.3203 1.0496e-07 Number of observations: 16667, Error degrees of freedom: 16643 Root Mean Squared Error: 12.3 R-squared: 0.837, Adjusted R-Squared: 0.836 F-statistic vs. constant model: 3.7e+03, p-value = 0

您可以重复此过程以继续调整线性模型。然而,在这种情况下,您应该探索可能更适合此数据的不同类型的回归。例如,如果您不想包含到达延迟,那么这种类型的线性模型就不再合适了。看到高数组的逻辑回归了解更多信息。

缩放到火花

在MATLAB和Statistics and Machine Learning Toolbox中,tall数组的一个关键功能是与Hadoop和Spark等平台的连接。您甚至可以编译代码并使用MATLAB Compiler™在Spark上运行它。看到用其他产品扩展高数组下载188bet金宝搏有关使用这些产品的更多信息:下载188bet金宝搏

  • 数据库工具箱™

  • 并行计算工具箱™

  • MATLAB®并行服务器™

  • MATLAB编译器™

相关的话题