Объект ‘TarFile’ не подлежит подписке?

#python

#python

Вопрос:

Я пытаюсь обучить KNeighborsClassifier из scikit-learn , но возникли некоторые проблемы с загрузкой обучающих данных из tarfile.

Вот код, который я написал:

 #Part 1 ~ Q1

import numpy as np
from sklearn.model_selection import train_test_split  
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import tarfile

tar = tarfile.open(r'C:UsersCalum NairnDownloadsenron1.tar.gz')
tar.extractall()
tar.close()

data_x = tar['spam']
data_y = tar['target']
classes = tar['target_names']

x_train,x_test,y_train,y_test = train_test_split(data_x,data_y,test_size=0.30,random_state=42) 

# Create the classifier
knnclassifier = KNeighborsClassifier()  

# Fitting the model on the train dataset
knnclassifier.fit(x_train,y_train)  

# Check the Performance on the training set  
pred_train = knnclassifier.predict(x_train)
train_accu= accuracy_score(pred_train,y_train)
print(f'The Accuracy on the train set is: {round(train_accu*100,2)}%')

# Check the Performance on the test set  
pred_test = knnclassifier.predict(x_test)
test_accu= accuracy_score(pred_test,y_test)
print(f'The Accuracy on the test set is: {round(test_accu*100,2)}%')
 

Ошибка, которую я получаю:

 TypeError                                 Traceback (most recent call last)
<ipython-input-45-fdb7523b73d9> in <module>
     11 tar.close()
     12 
---> 13 data_x = tar['spam']
     14 data_y = tar['target']
     15 classes = tar['target_names']

TypeError: 'TarFile' object is not subscriptable
 

Ответ №1:

Похоже, вам не хватает пары шагов между извлечением файла tarfile и доступом к данным, поэтому давайте разберем его.

tar это TarFile объект, и он не содержит содержимого tar или отдельных файлов внутри. По сути, это дескриптор открытого файла в файловой системе (в мире Python их обычно называют файлоподобными объектами).

tar.extractall() помещает отдельные файлы, содержащиеся в tarfile, в рабочий каталог. Это никак не изменяет tar объект, он по-прежнему не содержит фактического содержимого файла.

Затем вы пытаетесь загрузить точки данных как tar['spam'] и tar['target'] т. Д. 'TarFile' object is not subscriptable Означает, что ваш объект tar типа TarFile не поддерживает доступ к своим «элементам» по «именам», таким как 'spam' , потому что, как упоминалось выше, в нем нет никаких «элементов» внутри.

Что вам на самом деле нужно сделать, это прочитать те файлы, которые вы ранее извлекли.

 data_x_file = open('spam', 'r')
data_x_raw_text = data_x_file.read()
data_x_file.close()
 

Затем вам нужно будет преобразовать data_x_raw_text в структуру данных, подходящую для train_test_split , например, список точек данных. То, как вы это сделаете, будет зависеть от того, как отформатированы исходные данные.

Кроме того, scikit-learn или numpy , скорее всего, у вас есть помощники для загрузки наборов данных, поэтому вам не нужно открывать-загружать-конвертировать вручную, вам следует попробовать поискать их документы.