使用Python的scikit SVM线性支持向量分类,当我尝试进行预测时遇到错误:
ten_percent = len(raw_routes_data) / 10
# Training
training_label = all_labels[ten_percent:]
training_raw_data = raw_routes_data[ten_percent:]
training_data = DictVectorizer().fit_transform(training_raw_data).toarray()
learner = svm.LinearSVC()
learner.fit(training_data, training_label)
# Predicting
testing_label = all_labels[:ten_percent]
testing_raw_data = raw_routes_data[:ten_percent]
testing_data = DictVectorizer().fit_transform(testing_raw_data).toarray()
testing_predictions = learner.predict(testing_data)
m = metrics.classification_report(testing_label, testing_predictions)
raw_data表示为Python字典,其中包含各种旅行选项的到达时间类别以及天气数据的类别:
{'72_bus': '6.0 to 11.0', 'uber_eta': '2.0 to 3.5', 'tweet_delay': '0', 'c_train': '1.0 to 4.0', 'weather': 'Overcast', '52_bus': '16.0 to 21.0', 'uber_surging': '1.0 to 1.15', 'd_train': '17.6666666667 to 21.8333333333', 'feels_like': '27.6666666667 to 32.5'}
当我训练和拟合训练数据时,我在90%的数据上使用字典矢量化器并将其转换为数组。
提供的testing_labels表示为:
[1,2,3,3,1,2,3, ... ]
当我尝试使用LinearSVC预测我已通知时:
ValueError: X has 27 features per sample; expecting 46
我在这里缺少什么?显然,这是我适应和转换数据的方式。
答案 0 :(得分:7)
问题在于您为火车和测试创建和拟合不同的DictVectorizer
。
您应该使用列车数据创建并仅适合一个DictVectorizer
,并在测试数据上使用此对象的transform
方法来创建测试数据的要素表示。
答案 1 :(得分:0)
是的,在使用“ CountVectorizer”时,我也有类似的担忧。 当我删除对测试数据所做的其他拟合并且仅基于对训练数据所做的拟合使用“转换”方法时,它就像一块宝石一样工作。
如果在类似的问题上可以帮助社区使用测试数据预测结果,则可以共享。
谢谢, Shabir Jameel