为什么在Python中以这两种不同的方式使用SVM会给出非常不同的准确度分数?

为什么在Python中以这两种不同的方式使用SVM会给出非常不同的准确度分数?,python,svm,Python,Svm,使用Python和SVM,我应用了以下两段代码: 首先,我用一个数据集应用了这段代码 from sklearn.metrics import confusion_matrix from sklearn.metrics import cohen_kappa_score from sklearn.metrics import accuracy_score from sklearn.metrics import classification_report from sklearn.svm import

使用Python和SVM,我应用了以下两段代码:

首先,我用一个数据集应用了这段代码

from sklearn.metrics import confusion_matrix
from sklearn.metrics import cohen_kappa_score
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
from sklearn.svm import LinearSVC

model = LinearSVC(class_weight='balanced',C=0.01, penalty='l2').fit(X_, y)
y_preds = model.predict(X_)
report = classification_report( y, y_preds )
print(report)
print(cohen_kappa_score(y, y_preds),'\n', accuracy_score(y, y_preds), \n',confusion_matrix(y, y_preds))
这给了我这样的准确性:
0.9485714285714286

第二,我再次使用完全相同的数据集应用了这段代码

from sklearn.svm import LinearSVC
from sklearn.model_selection import cross_val_score

models = [
    LinearSVC(class_weight='balanced',C=0.01, penalty='l2', loss='squared_hinge'),
]
CV = 5
cv_df = pd.DataFrame(index=range(CV * len(models)))
entries = []
for model in models:
    model_name = model.__class__.__name__
    accuracies = cross_val_score(model, X_, y, scoring='accuracy', cv=CV)
    for fold_idx, accuracy in enumerate(accuracies):
        entries.append((model_name, fold_idx, accuracy))
cv_df = pd.DataFrame(entries, columns=['model_name', 'fold_idx', 'accuracy'])
cv_df.groupby('model_name').accuracy.mean()
精度不同:
0.797090

我的错误在哪里

如果有的话,哪种代码是正确的


在交叉验证后如何计算精度和召回率,如第二个代码中所示

在第1个代码中,您只需进行1次预测和精度计算。在第二段代码中,您进行5次预测和精度计算(使用不同的数据块),然后获得精度分数的平均值。换句话说,第二个代码给出了更可靠的准确度分数

至于你的另一个问题,如果你想对多个指标进行交叉验证,你可以使用而不是
交叉验证分数()


你好你知道交叉验证是什么意思吗?在第一种情况下,您只需进行一次预测和精度计算。在第二段代码中,您进行5次预测和精度计算(使用不同的数据块),然后获得精度分数的平均值。换句话说,第二个代码给出了更可靠的准确度分数。谢谢你,你知道如何像第二个代码那样在交叉验证后计算准确度和召回率吗?或者,这只有在没有交叉验证的情况下才可能实现!
scores = cross_validate(model, X, y, scoring=('precision', 'recall'))
print(scores['precision'])      
print(scores['recall'])