python - Scikit-learn SVC 总是在随机数据交叉验证上给出准确度 0

标签 python python-2.7 random scikit-learn svm

在下面的代码中,我创建了一个大小为 50 的随机样本集,每个样本集包含 20 个特征。然后我生成一个由一半真值和一半假值组成的随机目标向量。

所有值都存储在 Pandas 对象中,因为这模拟了以这种方式提供数据的真实场景。

然后我在循环中执行手动留一法,每次选择一个索引,删除其各自的数据,使用默认 SVC 拟合其余数据,最后对遗漏数据运行预测.

import random
import numpy as np
import pandas as pd
from sklearn.svm import SVC

n_samp = 50
m_features = 20

X_val = np.random.rand(n_samp, m_features)
X = pd.DataFrame(X_val, index=range(n_samp))
# print X_val

y_val = [True] * (n_samp/2) + [False] * (n_samp/2)
random.shuffle(y_val)
y = pd.Series(y_val, index=range(n_samp))
# print y_val

seccess_count = 0
for idx in y.index:
    clf = SVC()  # Can be inside or outside loop. Result is the same.

    # Leave-one-out for the fitting phase
    loo_X = X.drop(idx)
    loo_y = y.drop(idx)
    clf.fit(loo_X.values, loo_y.values)

    # Make a prediction on the sample that was left out
    pred_X = X.loc[idx:idx]
    pred_result = clf.predict(pred_X.values)
    print y.loc[idx], pred_result[0]  # Actual value vs. predicted value - always opposite!
    is_success = y.loc[idx] == pred_result[0]
    seccess_count += 1 if is_success else 0

print '\nSeccess Count:', seccess_count  # Almost always 0!

现在这是奇怪的部分 - 我希望得到大约 50% 的准确度,因为这是随机数据,但我几乎总是准确地得到 0!我总是说几乎,因为每运行大约 10 次这个确切的代码,我就会得到一些正确的命中。

真正令我疯狂的是,如果我选择与预测相反的答案,我将获得 100% 的准确率。关于随机数据!

我在这里错过了什么?

最佳答案

好吧,我想我刚刚弄明白了!这一切都归结为我们的机器学习宿敌 - 多数类(Class)

更详细:我选择了一个包含 25 个真值和 25 个假值的目标 - 完美平衡。在执行留一法时,这导致了类不平衡,比如 24 True 和 25 False。由于 SVC 被设置为默认参数,并在随机数据上运行,因此除了选择多数类之外,它可能找不到任何方法来预测结果,而在本次迭代中,多数类将是 False!因此,在每次迭代中,不平衡都会针对当前遗漏的样本进行调整。

总而言之 - 很好的机器学习类(class),以及与 friend 分享的绝妙数学谜语:)

关于python - Scikit-learn SVC 总是在随机数据交叉验证上给出准确度 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36863464/

相关文章:

html - 网站显示错误图像

mysql - 如何在 mysql 的 python 列表中指定用于字符串的引号?

python - 我正在创建《太空侵略者》,但它没有像应有的那样工作

python - 更新 ttk.Notebook 中选项卡开关的框架

python - 将密集矩阵从文件直接读取到稀疏 numpy 数组中?

c# - 为一组随机值生成多个范围

c - 使用 char 缓冲区随机播种

python - 为什么Python中的这段代码比C++快得多?

python - Ipython cv2.imwrite() 不保存图像

python - tf.keras.preprocessing.text.Tokenizer() 和 tfds.features.text.Tokenizer() 的比较