1. 程式人生 > >使用Weka進行資料探勘(Weka教程九)模型序列化/持久化儲存和載入

使用Weka進行資料探勘(Weka教程九)模型序列化/持久化儲存和載入

有很多時候,你在構建了一個模型並完成調優後,你很可能會想把這個模型存入到磁碟中,免得下次再重新訓練。尤其是神經網路、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;
    }

需要注意的是,要將序列化後的物件向下轉型才可以獲取子類特有方法。