机器学习用于查找奇偶数,不同分类器输出正确/错误问题
我尝试在一个假设的问题上使用机器学习算法:
我用以下的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)
上面的代码给了我两个Python列表,分别是:
x = [[0,0],[1,1],[2,2]....等等] #这个列表包含了假的特征向量,里面有两个相同的数字
y = [0,1,0.....等等] #这个列表包含了假的测试标签,0表示偶数,1表示奇数
我认为这些测试数据足够好,可以让机器学习算法进行学习。我使用以下的Python代码来训练几种不同的机器学习模型。
方法一:高斯朴素贝叶斯
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]
方法二:支持向量机
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 个回答
朴素贝叶斯是一种参数模型:它试图用九个参数来总结你的训练数据集,包括每个类别的先验概率(比如两个类别各占50%)以及每个类别每个特征的均值和方差。不过,你的目标值 y
和输入 x
的均值和方差没有任何关系,所以这些参数其实没什么用,模型最后只能靠随机猜测来做判断。
相比之下,支持向量机(SVM)会记住它的训练数据集,并用一个叫做核函数的东西来比较新的输入和它的训练输入。它本来应该选择一部分训练样本来进行判断,但在这个问题上,它不得不记住所有的样本:
>>> 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])
由于乘以二使得所有特征都变得一致,真实的标签应该都是零,这样准确率就是50%:这就是随机猜测的准确率。
(*) 实际上在训练集中确实存在一些依赖关系,但随着数据量的增加,这种依赖关系会减弱。