python - 为什么以这两种不同的方式在 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 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 次预测和准确度计算。在第二个代码中,您进行 5 次预测和准确度计算(使用不同的数据集块),然后获得准确度分数的平均值/平均值。换句话说,第二个代码给出了更可靠的准确度分数。
至于您的其他问题,如果您想使用多个指标进行交叉验证,您可以使用cross_validate()
代替cross_val_score()
:
scores = cross_validate(model, X, y, scoring=('precision', 'recall'))
print(scores['precision'])
print(scores['recall'])
推荐阅读
- linux - 如何保留传递给 bash 脚本的双引号参数?
- arrays - 错误:第 1 行解析错误:foreach($result as $ ^ Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined'
- css - 导航栏使用 Bootstrap 4 将内容对齐到中心
- google-sheets - Google 表格:从数据透视表查询返回#ERROR
- javascript - 将音频文件从 NodeJS 服务器实时流式传输到多个客户端
- matlab - matlab中的异方差-稳健的F统计量
- python - AttributeError:“NoneType”对象没有属性“大小”
- c - C 客户端:recv 未按预期运行
- django - Django 表单保存覆盖
- email - CAS-6-忘记用户名无法在邮件中发送用户名