最近在帮老师完成一个小项目,是一个多标签回归问题,具体来说,特征有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手写一个神经网络试一下,我也会在之后有时间的时候进行尝试。