#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
, скорее всего, у вас есть помощники для загрузки наборов данных, поэтому вам не нужно открывать-загружать-конвертировать вручную, вам следует попробовать поискать их документы.