在实际的项目应用中,经常会有一些需求就是平台之间模型可以比较通用地进行调用计算,在Python里面,一般搭建机器学习模型的话大都是会选用sklearn来进行的,毕竟这个项目太过于优秀了,训练出来的模型持久化在本地一般可以有几种形式:.m、.model、.h5和.pkl,但是这几种数据格式在java里面都没有办法直接方便地进行使用,这时候就需要对python输出的模型进行格式的转化,以便于其他语言平台可以进行加载使用。
这两天进行了相应的项目开发,已经走通整个流程,这里把完整流程浓缩出来一个教程项目记录一下备忘,也方便需要的朋友。
我这里使用的是常规六因子的数据,数据来源于网络采集,这里就不贴出来,以免出现审核问题,有需要的可以自行获取,数据不重要,用别的数据也都可以,在最开始学习的时候网上一大片都是用的iris或者boston数据集,我是觉得这样的内置数据集太过于简化,没办法细化整个流程,所以这里选择使用自己构建的数据集。
数据集截图如下所示:
首先是数据集加载:
def loadDataset(data="feature.json", target="pm25"):
"""
加载数据集
"""
try:
with open(data) as f:
feature = json.load(f)[target]
except:
feature = data[target]
for one_list in feature[:5]:
print("one_list: ", one_list)
X, y = [], []
for one_list in feature:
X.append(one_list[:-1])
y.append(one_list[-1])
return X, y
之后对原始数据集进行随机划分:
def dataSplit(dataset, label, ratio=0.3):
"""
数据集划分
"""
try:
X_train, X_test, y_train, y_test = train_test_split(
dataset, label, test_size=ratio
)
except:
dataset, label = np.array(dataset), np.array(label)
X_train, X_test, y_train, y_test = train_test_split(
dataset, label, test_size=ratio
)
print(
"--------------------------------split_data shape-----------------------------------"
)
print(len(X_train), len(y_train))
print(len(X_test), len(y_test))
return X_train, X_test, y_train, y_test
得到训练集和测试集之后就可以进行模型的构建测试了。
这里我使用的是线性回归模型,可以根据自己的需求进行替换:
def linearModelTrain(X, y, ratio=0.15, resDir="models/linear/"):
"""
线性回归模型
"""
if not os.path.exists(resDir):
os.makedirs(resDir)
X_train, X_test, y_train, y_test = dataSplit(X, y, ratio=ratio)
model = LinearRegression()
model.fit(X_train, y_train)
joblib.dump(model,resDir+"model.pkl")
pipeline = PMMLPipeline([("regressor", model)])
pipeline.fit(X_train, y_train)
sklearn2pmml(pipeline, resDir+"model.pmml", with_repr = True)
def mainModel(data="feature.json", ratio=0.3, modelDir="models/linear/"):
"""
主函数
"""
for i in range(len(FACTORS_LIST)):
oneDir = modelDir + FACTORS_LIST[i] + "/"
if not os.path.exists(oneDir):
os.makedirs(oneDir)
X, y = loadDataset(data=data, target=FACTORS_LIST[i])
linearModelTrain(X, y, ratio=ratio, resDir=oneDir)
训练完成后,模型存储结果如下:
我同时存储了pkl格式的模型和pmml格式的模型,可以看到pmml文件会比pkl更大一些。
接下来对模型进行预测分析,对于同一条样本输入,我会分别使用pkl模型和pmml模型进行预测,最后对比分析可视化:
def pklPredict(modelDir="models/linear/", X=[1, 2, 3]):
"""
pkl模型预测
"""
model = joblib.load(modelDir + "model.pkl")
y_pred = model.predict(X)
print("y_pred: ", y_pred)
return y_pred
def pmmlPredict(modelDir="models/linear/", X=[1, 2, 3]):
"""
pmml模型预测
"""
model = Model.fromFile(modelDir + "model.pmml")
y_pred = model.predict(X)
print("y_pred: ", y_pred)
return y_pred
def test4Predict(data="data.json"):
"""
测试分析
"""
plt.clf()
plt.figure(figsize=(24, 16))
for i in range(len(FACTORS_LIST)):
try:
with open(data) as f:
feature = json.load(f)[FACTORS_LIST[i]]
except:
feature = data[FACTORS_LIST[i]]
test = random.sample(feature, 100)
X, y = [], []
for one_list in test:
X.append(one_list[:-1])
y.append(one_list[-1])
pkl_pred = pklPredict(modelDir="models/" + FACTORS_LIST[i] + "/", X=X)
pmml_pred = pklPredict(modelDir="models/" + FACTORS_LIST[i] + "/", X=X)
plt.subplot(2, 3, i + 1)
plt.plot(y, label="TrueData", color="r")
plt.plot(pkl_pred, label="pkl_pred", color="g")
plt.plot(pmml_pred, label="pmml_pred", color="b")
R2_1 = calPerformance(y, pkl_pred)[-1]
R2_2 = calPerformance(pkl_pred, pmml_pred)[-1]
plt.title(FACTORS_LIST[i] + "\n" + "R2: " + str(R2_1) + ", R2: " + str(R2_2))
plt.savefig("compare.png")
结果如下所示:
这里也验证了我们的猜想,之所以只能够看到红色和蓝色两条曲线,是因为pkl模型和pmml模型的预测结果是完全一样的,后者将前者盖住了,通过标题上面的R2判定系数也可以得到同样的结论。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)