用于查找偶数/奇数的机器学习获得两个不同分类器的不正确/正确输出

时间:2014-08-20 10:08:18

标签: python machine-learning statistics classification scikit-learn

我尝试了一个关于假设问题的机器学习算法: -

我通过以下python代码制作了一个假的特征向量和一个假结果数据集: -

x=[]
y=[]
for i in range(0,100000):
    mylist=[]
    mylist.append(i)
    mylist.append(i)
    x.append(mylist)
    if(i%2)==0:
        y.append(0)
    else:
        y.append(1)

上面的代码给了我2个python列表,即 x = [[0,0],[1,1],[2,2] ....等等]#这个列表包含假的特征向量,有2个相同的数字

y = [0,1,0 .....等等]#这有假测试标签,0表示偶数,1表示奇数

我认为测试数据足以让ML算法学习。我使用以下python代码来训练几种不同的机器学习模型。

方法1:高斯朴素贝叶斯

from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb.fit(x,y)
x_pred = [[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9],[10,10],[11,11],[12,12],[13,13],[14,14],[15,15],[16,16]]
y_pred=gnb.predict(x_pred)
print y_pred

我得到以下错误输出,分类器无法预测: -

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

方法2:支持向量机

from sklearn import svm
clf = svm.SVC()
clf.fit(x, y)
x_pred = [[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9],[10,10],[11,11],[12,12],[13,13],[14,14],[15,15],[16,16]]
y_pred=clf.predict(x_pred)
print y_pred

我得到以下正确的输出,分类器无法预测: -

[1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0]

有人可以对此有所了解,并解释为什么一种方法的准确率为50%,而另一种方法的准确度为100%。

如果此问题标有错误的类别,请与我们联系。

1 个答案:

答案 0 :(得分:1)

朴素贝叶斯是一个参数模型:它试图用9个参数来概括你的训练集,先前的类(每个类50%)和每个类,每个特征的手段和方差。但是,您的目标值y不是输入x的均值和方差的函数,(*)因此参数是无关紧要的,模型采用的是有效的随机猜测。

相比之下,支持向量机会记住其训练集,并使用核函数将新输入与其训练输入进行比较。它应该选择其训练样本的一个子集,但对于这个问题,它被迫只记住所有这些:

>>> x = np.vstack([np.arange(100), np.arange(100)]).T
>>> y = x[:, 0] % 2
>>> from sklearn import svm
>>> clf = svm.SVC()
>>> clf.fit(x, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,
  kernel='rbf', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)
>>> clf.support_vectors_.shape
(100, 2)

由于您正在使用训练集中出现的测试样本,因此只需查看您所呈现的样本在训练集中具有的标签并将其返回,即可获得100%的准确度。如果您在训练集之外提供SVM样本,您将看到它也开始随机猜测:

>>> clf.predict(x * 2)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1])

由于乘以2会使所有特征均匀,真正的标记将全部为零,准确度为50%:随机猜测的准确性。

(*)实际上训练集中存在一些依赖性,但随着数据的增加而下降。