我一直在尝试处理两个包含大约40000-50000个图像的巨大文件.但每当我尝试将我的数据集转换为numpy数组时,我都会遇到内存错误.我只有大约8GB的内存并不是很多,但是,因为我缺乏python的经验,我想知道是否有任何方法可以通过使用一些我不知道的python库来解决这个问题,或者可能是优化我的代码?我想听听你对此事的看法.
我的图像处理代码:
from sklearn.cluster import MiniBatchKMeans
import numpy as np
import glob
import os
from PIL import Image
from sklearn.decomposition import PCA
image_dir1 = "C:/Users/Ai/Desktop/KAGA FOLDER/C/train"
image_dir2 = "C:/Users/Ai/Desktop/KAGA FOLDER/C/test1"
Standard_size = (300,200)
pca = PCA(n_components = 10)
file_open = lambda x,y: glob.glob(os.path.join(x,y))
def matrix_image(image):
"opens image and converts it to a m*n matrix"
image = Image.open(image)
print("changing size from %s to %s" % (str(image.size), str(Standard_size)))
image = image.resize(Standard_size)
image = list(image.getdata())
image = map(list,image)
image = np.array(image)
return image …Run Code Online (Sandbox Code Playgroud) 我在使用text_analysis上的Kaggle竞赛中的一些数据,每当我尝试使用我的算法时,我总是会在标题中描述这个相当奇怪的错误.我查了一下,它有一些东西与我的矩阵密集填充非零元素,同时呈现为稀疏矩阵.我认为这个问题在于我的代码中的train_labels,标签由24列组成,开头不常见,标签是0到1之间的浮点数(包括0和1).尽管对问题是什么有一些了解,但我不知道如何正确处理它,而我以前的尝试并没有那么好.你们对我如何解决这个问题有什么建议吗?
码:
import numpy as np
import pandas as p
import nltk
from sklearn.feature_extraction.text import TfidfVectorizer
import os
from sklearn.linear_model import RidgeCV
dir = "C:/Users/Anonymous/Desktop/KAGA FOLDER/Hashtags"
def clean_the_text(data):
alist = []
data = nltk.word_tokenize(data)
for j in data:
alist.append(j.rstrip('\n'))
alist = " ".join(alist)
return alist
def loop_data(data):
for i in range(len(data)):
data[i] = clean_the_text(data[i])
return data
if __name__ == "__main__":
print("loading data")
train_text = loop_data(list(np.array(p.read_csv(os.path.join(dir,"train.csv")))[:,1]))
test_set = loop_data(list(np.array(p.read_csv(os.path.join(dir,"test.csv")))[:,1]))
train_labels = np.array(p.read_csv(os.path.join(dir,"train.csv")))[:,4:]
#Vectorizing
vectorizer = TfidfVectorizer(max_features = 10000,strip_accents = "unicode",analyzer = …Run Code Online (Sandbox Code Playgroud) 我正在尝试对包含图像的数据集进行主成分分析,但每当我想从sklearn.decomposition模块应用pca.transform时,我都会收到此错误:*AttributeError:'PCA'对象没有属性'mean _'*.我知道这个错误意味着什么,但我不知道如何修复它.我想你们中的一些人知道如何解决这个问题.
谢谢您的帮助
我的代码:
from sklearn import svm
import numpy as np
import glob
import os
from PIL import Image
from sklearn.decomposition import PCA
image_dir1 = "C:\Users\private\Desktop\K FOLDER\private\train"
image_dir2 = "C:\Users\private\Desktop\K FOLDER\private\test1"
Standard_size = (300,200)
pca = PCA(n_components = 10)
file_open = lambda x,y: glob.glob(os.path.join(x,y))
def matrix_image(image_path):
"opens image and converts it to a m*n matrix"
image = Image.open(image_path)
print("changing size from %s to %s" % (str(image.size), str(Standard_size)))
image = image.resize(Standard_size)
image = list(image.getdata())
image = map(list,image)
image …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种加速我的代码的方法.我设法加快了代码的大部分时间,将运行时间减少到大约10个小时,但它仍然不够快,因为我已经没时间了,我正在寻找一种快速优化代码的方法.
一个例子:
text = pd.read_csv(os.path.join(dir,"text.csv"),chunksize = 5000)
new_text = [np.array(chunk)[:,2] for chunk in text]
new_text = list(itertools.chain.from_iterable(new_text))
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我以大块的形式阅读了大约600万行文本文档并将它们展平.此代码大约需要3-4个小时才能执行.这是我的计划的主要瓶颈.编辑:我意识到我不太清楚主要问题是什么,扁平化是占用大部分时间的部分.
我程序的这部分也需要很长时间:
train_dict = dict(izip(text,labels))
result = [train_dict[test[sample]] if test[sample] in train_dict else predictions[sample] for sample in xrange(len(predictions))]
Run Code Online (Sandbox Code Playgroud)
上面的代码首先使用相应的标签来压缩文本文档(这是一个机器学习任务,train_dict是训练集).在程序的早期,我在测试集上生成了预测.我的火车和测试装置之间有重复,所以我需要找到那些重复的.因此,我需要逐行迭代我的测试集(总共200万行),当我发现重复时我实际上不想使用预测标签,而是来自train_dict中副本的标签.我将此迭代的结果分配给上面代码中的变量result.
我听说python中有各种库可以加速部分代码,但我不知道哪些可以完成这项工作并且知道我没有时间去研究这个,这就是为什么我需要有人来指出我正确的方向.有没有办法可以加快上面的代码片段?
EDIT2
我再次调查过.这肯定是一个记忆问题.我尝试逐行读取文件,一段时间后速度急剧下降,此外我的ram使用率接近100%,而python的磁盘使用量急剧增加.如何减少内存占用?或者我应该找到一种方法来确保我不把所有东西都记在内存中?
edit3 由于记忆是我的问题的主要问题,我将概述我的程序的一部分.我暂时放弃了预测,这大大降低了程序的复杂性,而是在我的测试集中为每个非重复插入标准样本.
import numpy as np
import pandas as pd
import itertools
import os
train = pd.read_csv(os.path.join(dir,"Train.csv"),chunksize = 5000)
train_2 = pd.read_csv(os.path.join(dir,"Train.csv"),chunksize = 5000)
test = pd.read_csv(os.path.join(dir,"Test.csv"), chunksize = 80000)
sample = list(np.array(pd.read_csv(os.path.join(dir,"Samples.csv"))[:,2]))#this file is only 70mb
sample …Run Code Online (Sandbox Code Playgroud) 我正在从文本语料库中提取特征,并使用 td-fidf 矢量器和 scikit-learn 中的截断奇异值分解来实现这一目标。然而,由于我想尝试的算法需要密集矩阵,并且矢量化器返回稀疏矩阵,我需要将这些矩阵转换为密集数组。但是,每当我尝试转换这些数组时,我都会收到一条错误消息,告诉我我的 numpy 数组对象没有属性“toarray”。我究竟做错了什么?
功能:
def feature_extraction(train,train_test,test_set):
vectorizer = TfidfVectorizer(min_df = 3,strip_accents = "unicode",analyzer = "word",token_pattern = r'\w{1,}',ngram_range = (1,2))
print("fitting Vectorizer")
vectorizer.fit(train)
print("transforming text")
train = vectorizer.transform(train)
train_test = vectorizer.transform(train_test)
test_set = vectorizer.transform(test_set)
print("Dimensionality reduction")
svd = TruncatedSVD(n_components = 100)
svd.fit(train)
train = svd.transform(train)
train_test = svd.transform(train_test)
test_set = svd.transform(test_set)
print("convert to dense array")
train = train.toarray()
test_set = test_set.toarray()
train_test = train_test.toarray()
print(train.shape)
return train,train_test,test_set
Run Code Online (Sandbox Code Playgroud)
追溯:
Traceback (most recent call last):
File "C:\Users\Anonymous\workspace\final_submission\src\linearSVM.py", line 24, …Run Code Online (Sandbox Code Playgroud) 对于机器学习任务,我需要处理太大而无法一次全部放入我的记忆中的数据集,因此我需要将其分解为块。幸运的是,pandas.read_csv 有一个参数 chunk_size,您可以在其中指定要用于分析的数据量,然后使用 for 循环以块的形式循环遍历数据集,如下所示:
#This example can be found at http://pandas.pydata.org/pandas-docs/dev/io.html
In [120]: reader = pd.read_table('tmp.sv', sep='|', chunksize=4)
In [121]: reader
<pandas.io.parsers.TextFileReader at 0xaa94ad0>
In [122]: for chunk in reader:
.....: print(chunk)
.....:
Unnamed: 0 0 1 2 3
0 0 0.469112 -0.282863 -1.509059 -1.135632
1 1 1.212112 -0.173215 0.119209 -1.044236
2 2 -0.861849 -2.104569 -0.494929 1.071804
3 3 0.721555 -0.706771 -1.039575 0.271860
[4 rows x 5 columns]
Unnamed: 0 0 1 2 3
0 4 -0.424972 0.567020 0.276232 …Run Code Online (Sandbox Code Playgroud) 我想将一维 numpy 数组拆分为列表列表,但我不确定如何做到这一点。
基本上我正在处理一个充满标签的数组:
array(['java database servlets derby', 'java graphics groovy awt basic',
'java lucene', ..., 'javascript android',
'iphone ios ipad file uiimage',
'javascript jquery transition effect'], dtype=object)
Run Code Online (Sandbox Code Playgroud)
形状:
(5000L,)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,每一行都包含由空格分隔的标签。我想将每一行存储为一个列表,其中所有标签作为单独的元素,并将这些列表组合成一个列表列表。结果应该如下所示:
list_of_lists = [["tag","tag","tag"],["tag","tag","tag"]...]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?如果你们知道更好的方法来实现我想要的(即我可以将每个标签作为指定行的元素访问的数据结构),我会很高兴听到它。
提前致谢。
对于机器学习任务,我需要处理相当大的数据集.结果,我无法在我的算法中同时适应整个数据集.我正在寻找一种方法来训练我的算法在数据集的部分,简单地提供新的块将无法工作,因为我的算法将只是重新安装,而不会考虑前面的例子.有没有一种方法可以用来为我的算法提供新的数据,同时"记住"之前看过的数据?
编辑:我使用的算法是来自scikit-learn的SGDRegressor.
代码:
train = pd.read_csv(os.path.join(dir,"Train.csv"),chunksize = 5000)
labels = pd.read_csv(os.path.join(dir,"Labels.csv"),chunksize = 5000)
algo = SGDRegressor(n_iter = 75)
print("looping for chunks in train")
for chunk in train:
algo.fit(train,labels)
Run Code Online (Sandbox Code Playgroud) 对于机器学习问题,我为每个样本都有一个位置特征(美国的一个州),它看起来像这样:整个特征向量看起来像这样:
array(['oklahoma', 'florida', 'idaho', ..., 'pennsylvania', 'alabama',
'washington'], dtype=object)
Run Code Online (Sandbox Code Playgroud)
我不能直接用sklearn算法提供这个,因此我必须以某种方式将其转换为数字特征,但我不知道如何做到这一点.它们是转换这些字符串功能的最佳方法是什么?ASCII转换会起作用吗?
编辑:我希望我的每个州都有自己独特的数值.
我是机器学习领域的新手,我开始参加Kaggle比赛以获得一些实践经验.我正在竞争知识竞赛CIFAR 10-图像中的物体识别,你必须在10个类别中对数千个图像进行分类,我可以在那里找到我使用的所有数据.我试图实现Gridsearch来优化我的机器学习算法的参数,但每当我尝试将我的分类器与我的训练数据相匹配时,我就会收到错误.我发现了引发错误的函数,它与我的标签没有正确的类型有关,但我不知道如何解决它.我使用的标签是字符串,我对它们进行预处理,以便我可以将它们提供给算法.我在那里做错了吗?或者当我为网格搜索拆分数据集时可能出现问题?坦白说,
涉及的代码:
import glob
import os
from sklearn.svm import SVC
from sklearn import preprocessing
import pandas as pd
from sklearn import cross_validation
from sklearn import metrics
from sklearn.grid_search import GridSearchCV
def label_preprocessing(Labels):
Labels = np.array(Labels)[:,1]
le = preprocessing.LabelEncoder()
le.fit_transform(Labels)
return Labels
def model_selection(train,Labels):
parameters = {"C":[0.1,1,10,100],"gamma":[0.0001,0.001,0.01,0.1]}
X_train, X_test, y_train, y_test = cross_validation.train_test_split(train, Labels, test_size = 0.2, random_state = 0)
svm = SVC()
clf = GridSearchCV(svm,parameters)
clf = clf.fit(X_train,y_train)
print ("20 fold cv score: ",np.mean(cross_validation.cross_val_score(clf,X_test,y_test,cv = 10,scoring = "roc_auc")))
return …Run Code Online (Sandbox Code Playgroud) python ×10
scikit-learn ×6
numpy ×5
pandas ×2
arrays ×1
image ×1
list ×1
optimization ×1
performance ×1
python-2.7 ×1
scipy ×1