在机器学习领域,算法需要对数据进行预处理,而这些数据的大小可能各不相同。如果没有足够的计算能力来预处理这些数据,就无法进行分析。因此,问题来了:如何使用现有的系统加载和处理如此大量的数据?这个问题是有效的,因为现在即使是普通人也能产生大量的数据。生活在一个互联网经济时代,全天候地产生数据。因此,可以说公司有大量的数据需要处理,这就引出了问题:如何处理这些数据?
以下是一些可以处理大量数据的方法:
如果有一个大型数据集并且想要处理它,最简单的方法是使用抽样。它使用减少数据的简单概念。数据可以通过删除一些样本或特征,或者有时同时删除特征和样本来减少。抽样是一个创建一个新数据集的过程,这个新数据集的大小是原始样本的一定百分比,抽样是随机进行的。
Pandas有一个强大的方法来执行抽样数据,使用sample()函数,这个函数有各种有用的参数来管理抽样过程。
DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None, ignore_index=False)
参数:
让看看如何使用Pandas在著名的泰坦尼克号数据集上以百分比的形式实现抽样的最简单实现。
sample_df = df.sample(frac=0.01)
可以看到,数据框架的1%被抽样(108条记录)。这里,第一列代表原始数据框架的索引。可以使用ignore_index参数重置它。
但是抽样的主要问题是数据丢失。知道数据在机器学习中是至关重要的,特别是当想要构建一个好的模型时。
这是处理大型数据集的另一种方式。任何人都可以使用各种云服务提供商,如亚马逊AWS、谷歌云平台或微软Azure。
在云计算中,可以根据要求配置服务器,可以配置内存(主内存或核心内存),从千兆字节到千兆字节不等。
主要缺点是成本。
核心外机器学习参考了核心内存的概念,核心内存就是RAM。可以说核心外内存只是外部内存,可能是硬盘驱动器。
如果想用外行的话来定义什么是核心外机器学习,那将是:“这是一种在核心内存无法容纳的数据上训练模型的方法。”
核心外学习指的是机器学习算法与无法适应单个机器内存但可以轻松适应某些数据存储(如本地硬盘或网络存储库)的数据一起工作。
有三种方法可以分三步执行:
在正常情况下,所有的数据都在RAM中,可以在这个数据上训练模型。但在这里,无法将所有数据加载到内存中。即使在第二步提取了特征,这些特征也可能比RAM大。
因此,不能使用单个机器学习算法一次性训练所有数据。在这里,可以使用增量学习的概念,通过分批提供数据来训练机器学习算法。
正如在上面的图中看到的,第一块作为输入提供给模型M,它产生输出作为M',然后第二块作为输入提供给模型M'而不是模型M。所以,M'模型不会从头开始训练,而是从M开始训练,依此类推。
并非所有的机器学习算法都支持增量学习。一些支持的算法包括多项式朴素贝叶斯、伯努利朴素贝叶斯、感知器、SGD分类器、被动攻击性分类器、SGD回归器、被动攻击性回归器、小批量K均值等。
让看看如何实现它。有一个3GB的大型数据集,包含3千万或3亿条记录。这是一个虚拟的玩具数据集,有4个独立特征和1个目标特征,它是一个回归问题。
请注意,这只是虚拟数据,试图理解核心外机器学习的概念,所以没有专注于数据清洗和其他任务。
import pandas as pd
df = pd.read_csv('large_dataset.csv')
df.shape
df.head()
df.describe()
现在,如果尝试使用Pandas库,它将花费很多时间来读取这些记录,过程变得非常慢。所以,不使用Pandas,而是使用Vaex库,将使用这个库来训练机器学习模型。
pip install vaex
需要将数据集从csv转换为hdf5文件格式。hdf5文件格式是一种层次结构格式,数据存储效率高,因此搜索变得非常容易,这加快了操作。
import vaex
vaex_df = vaex.from_pandas(df)
type(vaex_df)
vaex_df.export_hdf5('large_data.hdf5')
vaex_df = vaex.open('large_data.hdf5')
vaex_df.head()
Vaex库之所以快,是因为它在vaex_open()时读取hdf5数据的元数据,并且根据需要,只有那些数据会被加载/加载到内存中;例如,如果使用head(),那么知道只需要前10行,vaex只会将前10行加载到内存中。同时,Pandas在使用read_csv()函数时会将所有数据加载到内存中。
不进行预处理。所以,将直接执行train_test_split()。在执行分割之前,需要先对数据进行洗牌。
vaex_df = vaex_df.shuffle()
df_train, df_test = vaex_df.ml.train_test_split(test_size=0.2)
df_train.shape
df_test.shape
下一步是训练模型,使用增量学习来训练模型。从vaex.ml模块的sklearn包中导入IncrementalPredictor类。
from vaex.ml.sklearn import IncrementalPredictor
from sklearn.linear_model import SGDRegressor
提供了独立特征(输入列,输入特征)和目标变量。
features = ['f1','f2','f3','f4']
target = 'target'
model = SGDRegressor()
创建了SGDRegressor模型,将其作为参数提供给vaex增量模型。
对于vaex增量模型,传递输入特征、目标变量、模型(即SGDRegressor),以及重要的事情,即批量大小,这不过是增量学习块(一次向模型提供多少行。在这个例子中,一次传递50万行。)
vaex_model = IncrementalPredictor(features=features, target=target, model=model, batch_size=500000)
vaex_model.fit(df=df_train,progress='widget')
在使用Vaex库的transform()函数进行预测时,Pandas将使用predict()函数来完成相同的任务。Transform()将给一个带有额外‘predict’列的数据框架。
df_test = vaex_model.transform(df_test)
df_test.head()
R2分数和MAE可以这样计算:
from sklearn.metrics import r2_score,mean_absolute_error
print(r2_score(df_test['target'].values,df_test['prediction'].values))
print(mean_absolute_error(df_test['target'].values,df_test['prediction'].values))
在这篇文章中,从一个简单的问题开始,即如何在没有足够强大的机器的情况下加载大量数据进行预处理。然后看到了为什么可能有大量的数据。然后学习了抽样技术以及如何实现它们。接下来是云计算,但云计算的主要缺点是它的成本。最后,学习了最可行和重要的技术,即核心外机器学习,已经看到了它的实现,使用了Vaex库。执行核心外机器学习的三种方式是流式数据、提取特征和训练模型。