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%的准确性。关于随机数据!
我在这里想念什么?
好吧,我想我只是想通了!这一切都归结于我们的旧机器学习对手- 多数班。
更详细地讲:我选择了一个包含25个True和25个False值的目标-完美平衡。进行留任式学习时,这会导致班级失衡,例如24 True和25 False。由于SVC设置为默认参数并在随机数据上运行,因此除了选择多数类(在此迭代中为False)之外,它可能找不到其他方法来预测结果。因此,在每次迭代中,不平衡都针对当前遗漏的样本。
总而言之-机器学习的一堂好课,以及与您的朋友分享的出色的数学谜题:)
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |