sklearn 多项式回归 提取系数保存到txt中直接使用

最近在帮老师完成一个小项目,是一个多标签回归问题,具体来说,特征有15个,要预测的标签却有43个,同时因为要考虑在一个特定板子上运行,上面的python无法安装sklearn这种库,只能使用numpy等已经安装好的库。因此需要将训练好的模型的系数保存下来,这样在推理的时候直接使用系数文件,可以跳过sklearn的使用。

首先给出多项式回归的训练和保存代码:

'''多项式回归模型'''

import sklearn.pipeline as pl
import sklearn.preprocessing as sp
import sklearn.linear_model as lm

 

model = pl.make_pipeline(
    sp.PolynomialFeatures(2),
    lm.LinearRegression()
    )

model.fit(X_train, y_train)

predict = model.predict(X_test)
print(mse_score(y_test, predict))



with open('../clf.pickle', 'wb') as f:
    pickle.dump(model, f)

可以看到这里我使用了一个make_pipeline函数将制作二次多项式特征和线性回归包裹起来,sklearn中实现多项式回归的原理也就是先对存在的特征制作二次特征进行扩展,比如对于x1,x2,会扩展成x1,x2,x1*x1,x1*x2,x2*x2,然后对扩展后的特征使用线性回归算法。

接下来给出从模型中提取系数的代码:

with open('../clf.pickle', 'rb') as f:
    model1 = pickle.load(f)

a1=model1.steps[1][1].coef_
b1=model1.steps[1][1].intercept_




np.savetxt('./a1.txt',a1)
np.savetxt('./b1.txt',b1)

pipeline.steps是由元组组成的列表,pipeline.steps[0][1]是第一个估计器,pipeline.steps[1][1]是第二个估计器。这里只需要提取线性回归的系数就可以了,也就是截距和斜率。

那么如何使用这个系数文件呢?

def make_pingfang(temp):
    x0=temp[0]
    x1=temp[1]
    x2=temp[2]
    x3=temp[3]
    x4=temp[4]
    x5=temp[5]
    x6=temp[6]
    x7=temp[7]
    x8=temp[8]
    x9=temp[9]
    x10=temp[10]
    x11=temp[11]
    x12=temp[12]
    x13=temp[13]
    x14=temp[14]
    
    xck = [ 1 ,
      x0 ,
      x1 ,
      x2 ,
      x3 ,
      x4 ,
      x5 ,
      x6 ,
      x7 ,
      x8 ,
      x9 ,
      x10 ,
      x11 ,
      x12 ,
      x13 ,
      x14 ,
      x0*x0 ,
      x0*x1 ,
      x0*x2 ,
      x0*x3 ,
      x0 *x4 ,
      x0 *x5 ,
      x0 *x6 ,
      x0 *x7 ,
      x0 *x8 ,
      x0 *x9 ,
      x0 *x10 ,
      x0 *x11 ,
      x0 *x12 ,
      x0 *x13 ,
      x0 *x14 ,
      x1*x1 ,
      x1* x2 ,
      x1 *x3 ,
      x1 *x4 ,
      x1 *x5 ,
      x1 *x6 ,
      x1 *x7 ,
      x1 *x8 ,
      x1 *x9 ,
      x1 *x10 ,
      x1 *x11 ,
      x1 *x12 ,
      x1 *x13 ,
      x1* x14 ,
      x2*x2 ,
      x2* x3 ,
      x2 *x4 ,
      x2 *x5 ,
      x2 *x6 ,
      x2 *x7 ,
      x2 *x8 ,
      x2 *x9 ,
      x2 *x10 ,
      x2 *x11 ,
      x2 *x12 ,
      x2 *x13 ,
      x2 *x14 ,
      x3*x3 ,
      x3 *x4 ,
      x3 *x5 ,
      x3 *x6 ,
      x3 *x7 ,
      x3 *x8 ,
      x3 *x9 ,
      x3 *x10 ,
      x3 *x11 ,
      x3 *x12 ,
      x3 *x13 ,
      x3 *x14 ,
      x4*x4 ,
      x4* x5 ,
      x4 *x6 ,
      x4 *x7 ,
      x4 *x8 ,
      x4 *x9 ,
      x4 *x10 ,
      x4 *x11 ,
      x4 *x12 ,
      x4 *x13 ,
      x4 *x14 ,
      x5*x5,
      x5* x6 ,
      x5 *x7 ,
      x5 *x8 ,
      x5 *x9 ,
      x5* x10 ,
      x5 *x11 ,
      x5 *x12 ,
      x5 *x13 ,
      x5 *x14 ,
      x6*x6 ,
      x6 *x7 ,
      x6 *x8 ,
      x6 *x9 ,
      x6 *x10 ,
      x6 *x11 ,
      x6 *x12 ,
      x6 *x13 ,
      x6 *x14 ,
      x7*x7 ,
      x7* x8 ,
      x7* x9 ,
      x7 *x10 ,
      x7* x11 ,
      x7* x12 ,
      x7 *x13 ,
      x7 *x14 ,
      x8*x8 ,
      x8 *x9 ,
      x8 *x10 ,
      x8 *x11 ,
      x8 *x12 ,
      x8* x13 ,
      x8* x14 ,
      x9*x9,
      x9 *x10 ,
      x9 *x11 ,
      x9 *x12 ,
      x9 *x13 ,
      x9 *x14 ,
      x10*x10 ,
      x10* x11 ,
      x10* x12 ,
      x10 *x13 ,
      x10* x14 ,
      x11*x11 ,
      x11 *x12 ,
      x11* x13 ,
      x11 *x14 ,
      x12*x12,
      x12 *x13 ,
      x12 *x14 ,
      x13*x13,
      x13* x14 ,
      x14*x14 ]
    return np.array(xck)


a1 = np.loadtxt('./a1.txt')
b1 = np.loadtxt('./b1.txt')

for i in range(len(x)):
    temp = make_pingfang(x[i])
    predict1[i] = np.matmul(a1,temp) + b1

    

可以看到,这里的make_pingfang函数,这个函数就是先将输入的x的15个特征按照python二次多项式,构建出对应的特征,然后和系数相乘,从而得到结果。

 

当然这个算法的效果的确一般,如果也有人碰到了此类问题需要解决,可以考虑使用numpy手写一个神经网络试一下,我也会在之后有时间的时候进行尝试。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值