[英]Why are scores from sklearn cross_val_score so low?
好吧,在这里尝试获得 4 种不同算法的 cross_val_score。 我的 dataframe 看起来像这样:
target type post
1 intj "hello world shdjd"
2 entp "hello world fddf"
16 estj "hello world dsd"
4 esfp "hello world sfs"
1 intj "hello world ddfd"
type
有重复的地方。 我这样计算 cross_val 分数:
encoder = preprocessing.LabelEncoder()
y_encoded = encoder.fit_transform(result['type'])
train_x, valid_x, train_y, valid_y = model_selection.train_test_split(result['post'], y_encoded, test_size=0.30, random_state=1)
models = {'lr':LogisticRegression(multi_class = 'multinomial', solver = 'newton-cg'),
'nb':MultinomialNB(alpha = 0.0001),
'sgd':SGDClassifier(loss='hinge', penalty='l2',alpha=1e-3, random_state=42,
max_iter=5, tol=None),
'rf':RandomForestClassifier(n_estimators = 10)}
for name,clf in models.items():
pipe = Pipeline([('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', clf)])
res = cross_val_score(pipe,result.post,result.target,cv=10, n_jobs=8)
print(name,res.mean(),res.std())
这是可行的,但是平均值都在 0.3 左右。 全部的实际准确度约为 0.98,逻辑回归为 0.7。
这里有什么问题?
编辑 - 这是我如何知道每个算法的平均准确度高于 0.3(我对每个算法都这样做):
text_clf3 = Pipeline([
('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', LogisticRegression(multi_class = 'multinomial', solver = 'newton-cg')),
])
text_clf3.fit(result.post, result.target)
predicted3 = text_clf3.predict(docs_test)
print("Logistics Regression: ")
print(np.mean(predicted3 == result.target))
print(metrics.classification_report(result.target, predicted3))
print(confusion_matrix(result.target, predicted3))
print("LR Precision:",precision_score(result.target, predicted3, average='weighted'))
print("LR Recall:",recall_score(result.target, predicted3, average='weighted'))
在for
循环中的模型中,您可以衡量模型在交叉验证分区上的表现。 在您的手动编辑中,您衡量自己在docs_test
上的表现。 通常,您希望您的 CV 分数与您在样本外测试集上的表现相似。 如果您在测试集上的表现相当好,那么docs_test
可能不是随机创建的。 您可能有目标泄漏。 也许 model 恰好可以很好地对该测试集进行预测。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.