使用Weka進行資料探勘(Weka教程九)模型序列化/持久化儲存和載入
阿新 • • 發佈:2019-01-01
有很多時候,你在構建了一個模型並完成調優後,你很可能會想把這個模型存入到磁碟中,免得下次再重新訓練。尤其是神經網路、SVM等模型訓練時間非常長,重新訓練非常浪費時間。那麼怎麼持久化模型呢?
其實既然模型也是一個JAVA物件,那我就按照JAVA的序列化和反序列化方法儲存模型物件即可。
- Java中的序列化和反序列化
①java.io.ObjectOutputStream
代表物件輸出流,它的writeObject(Object obj)方法可對引數指定的obj物件進行序列化,把得到的位元組序列寫到一個目標輸出流中。
②java.io.ObjectInputStream
代表物件輸入流,它的readObject()方法從一個源輸入流中讀取位元組序列,再把它們反序列化為一個物件,並將其返回。
需要注意的是,只有實現了Serializable和Externalizable介面的類的物件才能被序列化。Externalizable介面繼承自 Serializable介面,實現Externalizable介面的類完全由自身來控制序列化的行為,而僅實現Serializable介面的類可採用預設的序列化方式 。
物件序列化包括如下步驟:
1) 建立一個物件輸出流,它可以包裝一個其他型別的目標輸出流,如檔案輸出流;
2) 通過物件輸出流的writeObject()方法寫物件
物件反序列化的步驟如下:
1) 建立一個物件輸入流,它可以包裝一個其他型別的源輸入流,如檔案輸入流;
2) 通過物件輸入流的readObject()方法讀取物件。
- 實現Weka模型的序列化
直接貼出程式碼,以J48為例
public static void persistModel(J48 model, String ModelPath) {
ObjectOutputStream oos = null ;
try {
oos = new ObjectOutputStream(
new FileOutputStream(ModelPath));
oos.writeObject(model);
oos.flush();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
- Weka模型的重新載入
重新載入模型只需要進行反序列化即可:
public static J48 reloadPersistModel(String ModelPath) {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(
new FileInputStream(new File(ModelPath)));
J48 model = (J48) ois.readObject();
return model;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
需要注意的是,要將序列化後的物件向下轉型才可以獲取子類特有方法。