python - sklearn.datasets.load_files 和 numpy 文件 - 他们一起顺利吗?
问题描述
我在与上述函数相对应的结构中收集了大量数据sklearn.datasets.load_file
。我想加载数据集并拟合一个基本的分类模型。我认为这样的事情会适合这项任务:
import numpy as np
import sklearn.datasets
from sklearn.ensemble import RandomForestClassifier
dataset = sklearn.datasets.load_files("data", load_content = 'False') # my dataset cannot be loaded into the memory
model = RandomForestClassifier(n_estimators=100)
model.fit(dataset.data, dataset.target)
但我收到一个错误:
ValueError: could not convert string to float: b'\x93NUMPY\x01\x00v\x00{\'descr\': \'<f8\', \'fortran_order\': False, \'shape\': (115000,), } \n\x00\x00\x00 \xf2zY?\x00\x00\x00\x00\xd8pp?\x00\x00\x00@6\xbc\x88?\x00\x00\x00@\xad9e?\x00\x00\x00\xc0\t\x1ep?\x00\x00\x00`\x1e\xf9\x8f?\x00\x00\x00\xe0!#q?\x00\x00\x00`\xb8#S\xbf\x00\x00\x00@\xb55x?\x00\x00\x00 Jp}?\x00\x00\x00 P\xdbr\xbf\x00\x00\x00@\r\xf8u\xbf\x00\x00\x00\xc0fnX?\x00\x00\x00`YI-?\x00\x00\x00\xc0\xca~f?\x00\x00\x00\xa0\xb2\xe1W\xbf\x00\x00\x00`\x8a\xcdQ\xbf\x00\x00\x00\x80\x97\x1ec\xbf\x00\x00\x00\xe0\xe4\xc1z\xbf\x00\x00\x00@\xacCR?\x00\x00\x00`\nkt?\x00\x00\x00`\xee\xf9p\xbf\x00\x00\x00\x007/w\xbf\x00\x00\x00`e\xc4x\xbf\x00\x00\x00@\xff\x84{\xbf\x00\x00\x00\xe08vk\xbf\x00\x00\x00 \xd9\x1de\xbf\x00\x00\x00\xe0\xe8YG\xbf\x00\x00\x00\x80k\xf1u\xbf\x00\x00\x00@V\xd8\x91\xbf\x00\x00\x00 9\xb1\x8f\xbf\x00\x00\x00\xe0f\x9dL?\x00\x00\x00@\xa7\xe4p\xbf\x00\x00\x00 \xb4\xc0~\xbf\x00\x00\x00\xc0\xb4\xe4\x83\xbf\x00\x00\x00\xc0\xef2\x90\xbf\x00\x00\x00\xe0\x90]\x86\xbf\x00\x00\x00@f\xb6p\xbf\x00\x00\x00\xc0X\xd0|\xbf\x00\x00\x00\x00\xaeq\x8f\xbf\x00\x00\x00\xc0\xba\xd7\x89\xbf\x00\x00\x00\xe0mw\x91\xbf\x00\x00\x00`[\xb9\x8f\xbf\x00\x00\x00@\xa0\xad\x8b\xbf\x00\x00\x00`h\xd3\x94\xbf\x00\x00\x00\xe0-c\x86\xbf\x00\x00\x00\xc0>9\x82\xbf\x00\x00\x00\xe0\x90\xbe\x91\xbf\x00\x00\x00\xa0\xce\x17\x8e\xbf\x00\x00\x00\xa0\x01\t\x8f\xbf\x00\x00\x00\xa0\xac}\x95\xbf\x00\x00\x00\xe0\x1e\x0c\x8f\xbf\x00\x00\x00\xa0\xdc\xcb\x90\xbf\x00\x00\x00\xc0\n\x0f\x96\xbf\x00\x00\x00\xc0\xba\x8a\x8b\xbf\x00\x00\x00`\x10\xe7\x95\xbf\x00\x00\x00\x00\x1ds\x9a\xbf\x00\x00\x00 \xbew\x94\xbf\x00\x00\x00\xa0\xcfl\x94\xbf\x00\x00\x00\x00J\x84\x92\xbf\x00\x00\x00\x80\xce\x8b\x97\xbf\x00\x00\x00\x80/|\x99\xbf\x00\x00\x00\xc0\xd7\x9a\x99\xbf\x00\
以这种方式加载文件显然不知道如何处理 NumPy 文件。我们有什么选择?
我目前正在将所有 NumPy 文件转换为文本文件,但这会使数据量增加三倍或四倍。有没有不同的方法来加载材料,而不是基于保存为 NumPy 文件的向量训练一个简单的模型?
解决方案
我将创建一个数据加载器生成器,它将以小块的形式加载数据。有了这个,你应该使用允许的模型,partial_fit
你可以批量训练。
我的流程将如下所示:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import SGDClassifier
# very large file
FILE_PATH = ...
FEATURES_COLUMNS = ...
TARGET_COLUMN = ...
CHUNK_SIZE = 100_000
reader = pd.read_csv(FILE_PATH, chunksize=CHUNK_SIZE, low_memory=False)
clf = SGDClassifier(loss='log') # models with partial fit
for batch_number, dataf_chunk in enumerate(reader, start=1):
# logic to get X (features) and y (target) from data chunk
X, y = dataf_chunk[FEATURES_COLUMNS], dataf_chunk[TARGET_COLUMN]
# splits to track model performance
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.1, random_state=42, stratify=y)
# [custom] preprocessors that allow data update e.g HashingVectorizer
...
# model training per batches
clf.partial_fit(X_train, y_train, classes=np.unique(y_train))
print(f"Batch number {batch_number} | Model Scores:"
f"Train score = {clf.score(X_train, y_train) : .2%}|"
f"Test score = {clf.score(X_test, y_text) : .2%}")
在 NumPy 中也有相当于卡盘阅读的功能。请参阅在 python 和 numpy 中处理大数据,内存不足,如何将部分结果保存在磁盘上?
更新:
我发现 scikit-learn 文档有一个使用yield
部分训练示例的类似示例
推荐阅读
- python - 导入在 Python shell 中工作,但不是从文件运行时
- ruby-on-rails - Rails 测试错误,NameError:未初始化的常量 User::FILL_IN
- powershell - 如何在 PowerShell 中获取变量输出
- vpn - 除了服务器端,WireGuard 无法连接到互联网
- sql - 如何在 DELETE 查询中使用 postgres 函数结果作为单独的列
- visual-studio - 我在 macOS 上的 Visual Studio 项目中不断变化的 .DS_Store 文件是什么?
- swift - 渐变层未显示在 UIButton 上
- java - 带有黑色字体的 iText 矩形
- debian-stretch - debian 上的 Wireguard - 无法访问服务器子网
- c++ - 在 C++ 类中重新定义方法