使用机器学习将两个数字相加的模型

cav*_*ton -2 python numpy machine-learning

我正在尝试使用机器学习来对添加进行建模。但模型的预测总是相同的。这是我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

在 10000 次预测中,零预测 Y 是,并且将 X 中的两个随机变量相加,出了什么问题。

yat*_*atu 5

首先,正如评论中指出的,这是一个回归问题,而不是分类问题,而是GaussianNB一个分类器。其次,您的代码是错误的,您在同一测试集上进行预测,因为您没有重新生成用于预测的随机值。

以下是解决此问题的方法。首先,您尝试对特征和目标变量之间的线性关系进行建模,因此您希望模型学习如何使用f(X)->y线性函数进行映射,在本例中是简单的加法。因此你需要一个线性模型

所以这里我们可以使用LinearRegression. 要训​​练回归器,您可以执行以下操作:

from sklearn.linear_model import LinearRegression

X = np.random.randint(0,1000, (20000, 2))
y = X.sum(1)
lr = LinearRegression()
lr.fit(X,y)
Run Code Online (Sandbox Code Playgroud)

然后类似地使用未见过的组合生成测试测试,希望回归器能够准确预测:

X_test = X = np.random.randint(0,1000, (2000, 2))
y_test = X.sum(1)
Run Code Online (Sandbox Code Playgroud)

如果我们使用经过训练的模型进行预测,并将预测值与原始值进行比较,我们会发现该模型确实完美地映射了加法函数,正如我们所期望的那样:

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
Run Code Online (Sandbox Code Playgroud)

通过检查模型的coef_,我们可以看到模型已经学习了以下最优系数:

lr.coef_
# array([1., 1.])
Run Code Online (Sandbox Code Playgroud)

和:

lr.intercept_
# 4.547473508864641e-13 -> 0
Run Code Online (Sandbox Code Playgroud)

这基本上线性回归转化为加法,例如:

X_test[0]
# array([127, 846])
Run Code Online (Sandbox Code Playgroud)

所以我们会有这样的y_pred = 0 + 1*127 + 1*846