我尝试了一个关于假设问题的机器学习算法: -
我通过以下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%。
如果此问题标有错误的类别,请与我们联系。
答案 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%:随机猜测的准确性。
(*)实际上训练集中存在一些依赖性,但随着数据的增加而下降。