请求优化基于Scikit-Learn的乘法学习程序(新手友好,少改代码)
解决线性回归做乘法学习准确率低的问题
嘿,我懂你的困惑!用线性回归做加法顺风顺水,换成乘法就拉胯——这真的不怪你,因为线性回归天生只能拟合线性关系,而乘法是典型的非线性任务呀!
为啥加法行、乘法不行?
原加法任务是 Y = x1 + x2,刚好完美匹配线性模型的公式 Y = w1*x1 + w2*x2 + b(这里w1=1、w2=1、b=0),模型轻轻松松就能学到正确的权重。但乘法是 Y = x1*x2,这可不是x1和x2的线性组合,线性模型根本没法直接捕捉到这种非线性关系,自然准确率极低。
尽量少改代码的解决方案
下面给你两种改动极小的方案,都能让原有的线性回归模型搞定乘法学习:
方案1:手动添加乘积特征(改动最少)
只需要给每个样本加一个x1*x2的特征,让线性模型能直接学到这个特征和Y的线性关系:
from sklearn import linear_model from random import randint reg=linear_model.LinearRegression() # 改动点1:给每个样本添加x1*x2作为第三个特征 x=[[a, b, a*b] for a, b in [(randint(0,100), randint(0,100)) for _ in range(1000)]] # 改动点2:把Y改成乘法结果 Y=[a*b for a, b in x] reg.fit(x, Y) # 改动点3:预测时也要传入乘积特征 print(reg.predict([[56, 23, 56*23]])) # 输出会接近56*23=1288
这种方案只改了3处代码,本质是把非线性的乘法问题转换成了线性模型能处理的“对乘积特征做线性拟合”。
方案2:用PolynomialFeatures自动生成非线性特征
如果不想手动写乘积,也可以用sklearn的工具自动生成二次特征,改动也很少:
from sklearn import linear_model from sklearn.preprocessing import PolynomialFeatures # 新增导入 from random import randint reg=linear_model.LinearRegression() x=[[randint(0,100),randint(0,100)] for i in range(1000)] Y=[i[0]*i[1] for i in x] # 改动点1:Y改成乘法结果 # 新增两步:生成二次特征(包含x1*x2) poly = PolynomialFeatures(degree=2, include_bias=False) x_poly = poly.fit_transform(x) reg.fit(x_poly, Y) # 改动点2:预测时用poly转换输入 print(reg.predict(poly.transform([[56, 23]]))) # 输出接近1288
这个方案只多导入了一个工具类,加了两行特征转换代码,其他地方只改了Y的计算,同样能让线性模型准确学到乘法关系。
内容的提问来源于stack exchange,提问作者Nikhil.Nixel
相关产品推荐
相关产品推荐

