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 中的两个随机变量相加,出了什么问题。
首先,正如评论中指出的,这是一个回归问题,而不是分类问题,而是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
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |