【问题标题】:SVM binary classifier predicts one class for all of test dataSVM 二元分类器为所有测试数据预测一个类别
【发布时间】:2020-01-19 07:55:27
【问题描述】:
我有一个包含 10 个特征的分类问题,我必须预测 1 或 0。当我通过训练测试拆分训练 SVC 模型时,数据测试部分的所有预测值都是0。数据有以下 0-1 计数:
训练模型的代码如下:
from sklearn.svm import SVC
model = SVC()
model.fit(X_train, y_train)
pred= model.predict(X_test)
from sklearn.metrics import accuracy_score
accuracy_score(y_test, pred)`
为什么它在所有情况下都预测0?
【问题讨论】:
标签:
machine-learning
scikit-learn
svm
【解决方案1】:
该模型预测更频繁的类别,即使数据集也不太不平衡。很有可能无法像现在这样从特征中预测出该类别。
【解决方案2】:
对于分类问题,运行一个虚拟分类器作为起点总是好的。这会让你知道你的模型有多好。
您可以将其用作代码:
from sklearn.dummy import DummyClassifier
dummy_classifier = DummyClassifier(strategy="most_frequent")
dummy_classifier.fit(X_train,y_train)
pred_dum= dummy_classifier.predict(X_test)
accuracy_score(y_test, pred_dum)
如果您始终预测最频繁的类别,这将为您提供准确性。如果这是例如: 100% ,这意味着您的数据集中只有一个类。 80% 的意思是,你 80% 的数据属于一个类。
第一步,您可以调整您的 SVC:
model = SVC(C=1.0, kernel=’rbf’, random_state=42)
C : float, optional (default=1.0)错误的惩罚参数C
术语。
kernel : 指定算法中使用的内核类型。它
必须是“线性”、“多边形”、“rbf”之一
这可以给你一个起点。
此外,您还应该对训练数据进行预测,以查看是否过拟合或欠拟合。
trainpred= model.predict(X_train)
accuracy_score(y_test, trainpred)