import numpy as np
import random
from sklearn.naive_bayes import GaussianNB
X=np.array([[0,1],[1,1],[2,1],[2,2],[2,3],[3,3],[3,4],[4,4],[4,5]])
Y=np.array([1,2,3,4,5,6,7,8,9])
clf = GaussianNB()
clf.fit(X,Y)
x=random.random()
y=random.random()
d=1
e=10000
accuracy=0
while d<e:
d+=1
if (clf.predict([[x, y]])) == x+y:
accuracy+=1
if d==e:
print(accuracy)
在10000个预测中,零个预测Y为Y,并且在X中添加了两个随机变量出了问题。
首先,如注释中所指出,这是一个回归问题,而不是分类问题,并且GaussianNB
是分类符。其次,您的代码是错误的,您在同一测试集上进行预测,因为您没有重新生成随机值以进行预测。
以下是您可以如何解决此问题的方法。首先,您正在尝试对要素与目标变量之间的线性关系进行建模,因此,您希望模型学习如何使用线性函数(在这种情况下为简单的加法)映射f(X)->y
。因此,您需要一个linear model。
因此在这里我们可以使用LinearRegression
。要训练回归器,您可以:
LinearRegression
然后类似地使用看不见的组合生成test测试,希望回归器应该能够准确地预测:
from sklearn.linear_model import LinearRegression
X = np.random.randint(0,1000, (20000, 2))
y = X.sum(1)
lr = LinearRegression()
lr.fit(X,y)
[如果我们使用经过训练的模型进行预测,并将预测值与原始值进行比较,那么我们会发现该模型确实完美映射了我们期望的加法函数:
X_test = X = np.random.randint(0,1000, (2000, 2))
y_test = X.sum(1)
通过检查模型的y_pred = lr.predict(X_test)
pd.DataFrame(np.vstack([y_test, y_pred]).T, columns=['Test', 'Pred']).head(10)
Test Pred
0 1110.0 1110.0
1 557.0 557.0
2 92.0 92.0
3 1210.0 1210.0
4 1176.0 1176.0
5 1542.0 1542.0
,我们可以看到模型学习了以下最佳系数:
coef_
基本上是转弯线性回归成加法,例如:
lr.coef_
# array([1., 1.])
所以我们要有lr.coef_
# array([1., 1.])
lr.intercept_
# 4.547473508864641e-13 -> 0
X_test[0]
# array([127, 846])
y_pred = 0 + 1*127 + 1*846
生成0到1之间的实数随机数,因此模型仅预测了0或1且最大值为2,而x + y不是整数。
您可以使用random.random()
random.randint(a,b)