scikit RandomForestClassifier-真实结果与预测分数不匹配



我是机器学习的新手,我正在尝试使用scikit RandomForestClassifier对文本进行分类。我的问题是我的测试数据结果与sklearn分类报告不匹配。训练集有大约25k个样本,其中大约25%被标记为1,75%被标记为0。我有一个额外的1k测试集,我在训练后用它来测试。

#列车

vectorizer = TfidfVectorizer(max_features=40, stop_words=stopwords.words('english'))
X = vectorizer.fit_transform(documents).toarray()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=0)
classifier = RandomForestClassifier(
n_jobs=-1, bootstrap=False, n_estimators=200, random_state=0)
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
print(accuracy_score(y_test, y_pred))
precision    recall  f1-score   support
0       0.98      0.99      0.98      4231
1       0.95      0.90      0.92       883
accuracy                           0.97      5114

#测试

df = pandas.read_csv(input_file, header=None)
df.columns = ["data", "target"]
df, y = df.data, df.target
test_documents = []
for body in range(0, len(df)):
document = str(df[body])
test_documents.append(document)
X = vectorizer.fit_transform(test_documents).toarray()
prediction = pd.DataFrame(classifier.predict(X))
precision    recall  f1-score   support
0       0.89      0.87      0.88       856
1       0.38      0.42      0.40       154

我本来希望_U4913先生会添加这个,但我会添加的。

试试这个测试代码:

试验

df = pandas.read_csv(input_file, header=None)
df.columns = ["data", "target"]
df, y = df.data, df.target
test_documents = []
for body in range(0, len(df)):
document = str(df[body])
test_documents.append(document)
X = vectorizer.transform(test_documents).toarray()  #here is where change is!
prediction = pd.DataFrame(classifier.predict(X))

注意更改。。。我们现在使用矢量器的变换方法。我假设您可以将这个测试代码与您的训练代码放在同一个文件中,这样您的矢量器对象仍然有效。

之所以使用transform而不使用fit_transform,是因为您使用了适合特定词汇的矢量器来训练模型,并且在测试过程中可能会出现新单词。使用现有的矢量器将忽略这些新词/组合词,并有助于保持tdif矢量的一致性。与使用fit_transform相反,fit_transform可能会以完全不同的方式重新创建矢量器,矢量器会有小/大的差异。

编辑:你可能也想试试逻辑分类器。。。有时它会在这类数据上给出不错的结果。

最新更新