scikit-learn训练KNN时出现'TarFile' object is not subscriptable报错
报错原因与修复方案
触发TypeError的根本原因
TarFile是Python标准库tarfile模块提供的压缩包操作句柄,本身不支持字典式键值下标访问,不存在通过tar['spam']取值的逻辑,因此直接对TarFile对象做下标取值必然抛出'TarFile' object is not subscriptable错误。- 混淆了两类数据结构的用法:scikit-learn内置数据集接口返回的Bunch对象是支持通过
['spam']/['target']键读取结构化特征、标签的,但enron1.tar.gz本身是存放原始邮件文本的目录打包压缩包,内部根本没有预设'spam'、'target'、'target_names'这些结构化键,不存在直接从压缩包里读取这些值的可能。 - 执行完全量解压、关闭TarFile对象后,依旧尝试通过原压缩包句柄获取数据,逻辑链路本身就是断裂的。
- 哪怕修正了上述访问错误,直接将原始邮件文本输入KNN分类器也会触发异常:KNN属于基于数值距离计算的模型,无法直接处理字符串格式的原始文本,必须先完成文本到数值特征的转换。
可落地的正确实现流程
- 完成tar.gz包解压后,直接操作本地解压生成的文件夹结构。标准Enron1数据集解压后会生成独立的enron1目录,目录下分设
spam(垃圾邮件文本)、ham(正常邮件文本)两个子文件夹存放原始文件。 - 调用scikit-learn内置的
load_files接口遍历目录读取文本,自动生成可支持键访问的结构化数据集:from sklearn.datasets import load_files # 替换为本地解压后enron1文件夹的实际路径 enron_dataset = load_files("本地路径/enron1") # 此时返回的Bunch对象支持键访问,可直接获取对应内容 raw_texts = enron_dataset.data labels = enron_dataset.target category_names = enron_dataset.target_names - 补充文本特征转换、数据集划分、模型训练与准确率计算环节:
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier # 文本转TF-IDF数值特征矩阵 tfidf_vectorizer = TfidfVectorizer() features = tfidf_vectorizer.fit_transform(raw_texts) # 按比例划分训练集、测试集 X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42) # 训练KNN分类器并计算准确率 knn_clf = KNeighborsClassifier() knn_clf.fit(X_train, y_train) train_accuracy = knn_clf.score(X_train, y_train) test_accuracy = knn_clf.score(X_test, y_test)
内容的提问来源于stack exchange,提问作者Calum Nairn
相关产品推荐
相关产品推荐

