Scikit-learn SVC在随机数据交叉验证中始终提供0精度

Sho*_*alt 4 python random svm python-2.7 scikit-learn

在下面的代码中,我创建了一个随机样本集,大小为50,每个样本集有20个要素。然后,我生成一个由一半True和一半False值组成的随机目标向量。

所有值都存储在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!
Run Code Online (Sandbox Code Playgroud)

现在这是一个奇怪的部分-由于这是随机数据,我希望获得大约50%的准确度,但我几乎总是准确地达到0!我几乎总是说,因为每运行10次此精确代码,我都会得到一些正确的结果。

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

我在这里想念什么?

Sho*_*alt 5

好吧,我想我只是想通了!这一切都归结于我们的旧机器学习对手- 多数班

更详细地讲:我选择了一个包含25个True和25个False值的目标-完美平衡。进行留任式学习时,这会导致班级失衡,例如24 True和25 False。由于SVC设置为默认参数并在随机数据上运行,因此除了选择多数类(在此迭代中为False)之外,它可能找不到其他方法来预测结果。因此,在每次迭代中,不平衡都针对当前遗漏的样本。

总而言之-机器学习的一堂好课,以及与您的朋友分享的出色的数学谜题:)