在一个简单的加法预测中,在10000个预测中,零是正确的出了错

问题描述 投票:-1回答:2
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中添加了两个随机变量出了问题。

python numpy machine-learning
2个回答
3
投票

首先,如注释中所指出,这是一个回归问题,而不是分类问题,并且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])


0
投票

y_pred = 0 + 1*127 + 1*846生成0到1之间的实数随机数,因此模型仅预测了0或1且最大值为2,而x + y不是整数。

您可以使用random.random()

random.randint(a,b)
© www.soinside.com 2019 - 2024. All rights reserved.