Model.pb 小註解

這個檔案是用來放 model 的 protocol buffer, 所以叫做 pb. 當我們對 input raw data 做了一些前處理, 然後才去 train model. 那使用這個 model 的天命任意人, 怎麼知道要用那些 pre-processing 的手法來處理他的真實資料呢? 沒錯! 就是去看這個 model.bp.

Model.bp 不只是記錄 metadata 這麼簡單, 它只是三個主要功能之一. 這三個功能分別是:

  1. Model Graph: 把 model 的 graph 記下來. 這個 graph 不是個圖檔, 是資料結構裡面的 graph, 它定義了 model 的資料流向.
  2. Metadata: 主要是 input 和 output 的 tensor information. 不論是做前處理或是後處理都會參考到.
  3. Portability: Model 作者最初可能是用 Tensorflow, Tensorflow Lite, 或者Tensorflow.JS 開發, 使用者 deploy 的 platform 不同於作者時, 也可以參考這個檔案獲得相容性資訊.

講到前處理, 另一個 keyword 是 tf.Transform. 這個 library 專門做 Tensorflow 的前處理用. Graph 也是它產生的. tf.Transform 整合了 Apache Beam, (Google) cloud Dataflow, 和 TensorFlow 兩種不同的處理方式 [1][2].

請留意 tf.Transform 是在 pre-process 階段做 feature engineering, 而 Apache Beam 和 Cloud Dataflow 是在 feature creation 階段. 所以後者提供 API 給 tf.Transform 使用. 第三個可以執行 feture engineering 的階段是 train model. 在 [1] 裡面寫了 1,2,3 三個圈圈, 順序和我提到的相反, 但是那沒關係, 只是做個區隔.

附帶一提 Beam 可以用更多的 programming language, 像是 Java, Python, 和 SQL. Tensorflow 基本上多了 C++, Javascript, 少了 SQL. 總之學 Python 就對了.

[REF]

  1. https://ithelp.ithome.com.tw/articles/10227075
  2. https://www.tensorflow.org/tfx/transform/get_started
  3. https://towardsdatascience.com/hands-on-apache-beam-building-data-pipelines-in-python-6548898b66a5

Feature Engineering 備忘小筆記

對 AI 有興趣的我, 其實比較喜歡研究 model 的原理, 對於資料的處理沒興趣. 不過偶爾要用到某個語法, 卻又記不起來的話, 還是會有點傷腦筋! 所以筆記一下加深印象. 以後也好查詢.

  1. dataframe 轉 dataset
def df_to_dataset(dataframe):
    dataframe = dataframe.copy()
    
    labels = dataframe.pop('your target')
    ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
                            
    return ds

2. Categorical 轉 Numeral (one-hot)

from tensorflow import feature_column as fc

# invest_df is predefined dataframe

A = ['stock','bond','ETF']
B = []

for C in A:
    D = invest_df[C].unique()
    E = fc.categorical_column_with_vocabulary_list(C, D)
    F = fc.indicator_column(E)
    B.append(F)

3. Bucketized 轉 numerical

G = fc.numeric_column("net_asset")
​
# Bucketized cols
H = fc.bucketized_column(G, boundaries=[10, 20, 30, 40, 50, 60, 80, 100]) # in million USD
B.append(H)

4. Feature Cross (Bucketized + Categorical)

I = invest_df['FATFIRE_proximity'].unique()
J = fc.categorical_column_with_vocabulary_list('FATFIRE_proximity',I)
​
crossed_feature = fc.crossed_column([H, I],hash_bucket_size=1000)
crossed_feature = fc.indicator_column(crossed_feature)
B.append(crossed_feature)

5. 實際運用

# input_dim = 上述的 feature 個數, 此時 = 8
# 假設下一層是 12 nodes.
# 8 x 12 是 fully connected.

feature_layer = tf.keras.layers.DenseFeatures(B, dtype='float64')
​
model = tf.keras.Sequential([
  feature_layer,
  layers.Dense(12, input_dim=8, activation='relu'),
  layers.Dense(8, activation='relu'),
  layers.Dense(1, activation='linear',  name='your target')
])

6. 產生新的 Bucketetized feature 做成 Feature Cross


    M = np.linspace(0, 1, nbuckets).tolist()
    N = np.linspace(0, 1, nbuckets).tolist()

    OP = fc.bucketized_column(B['OPEN_PRICE'], M)
    CP = fc.bucketized_column(B['CLOSE_PRICE'], M)
    OV = fc.bucketized_column(B['OPEN_VOL'], N)
    CV = fc.bucketized_column(B['CLOSE_VOL'], N)

    OO = fc.crossed_column([OP, OV], nbuckets * nbuckets)
    CC = fc.crossed_column([CP, CV], nbuckets * nbuckets)

    new_bucket_cross_feature = fc.crossed_column([OO, CC], nbuckets ** 4)

7. 畫出酷炫流程圖並存檔

tf.keras.utils.plot_model(model, 'model.png', show_shapes=False, rankdir='LR') # or 'TB'

股市震盪小筆記

自美股在 7/23 (二) 開始走下坡之後, 台股先是在 8/2 (五) 大跌破千點之後, 8/5 (一) 又創記錄大跌 1807.21 點. 隨後美股看似有點回神 (其實沒有), 台股就在 8/7 (三) 創下最大的反彈記錄. 真不愧是奧運期間, 破紀錄變成日常.

看著預期中的美股下跌發生, 我準備低接美股. 至於錢從何來呢? 首先就是停泊資金的 SGOV 可以賣掉, 然後把表現怪怪的波克夏也賣掉, 這樣就有銀彈可以買入了. 為何說老巴怪呢? 我可以接受他買 Apple, 但不能接受他又迅速地把 Apple 賣掉. 難道蘋果也有地緣政治風險? 我投資老巴是因為他能判斷投資標的長期潛在價值. 如果波克夏現在只是擅長財務操作, 那跟投資對沖基金也沒什麼區別是吧. 老巴說不懂的東西不要買, 我現在不懂了, 應該要賣出才符合當年老巴的精神.

SGOV 無論什麼時候賣出都會是 100.XX 元, 非常保值可以輕鬆出脫. BRK.B 在這波股災中, 相對跌得很少, 大概掉 5% 而已, 不像 QQQ, SPY 都跌掉 15%. 大家都稱讚老黃老巴眼明手快落跑成功! 既然它掉價少, 策略又引起我的質疑, 正好可以賣掉換子彈. 昨天那部分賣在 434. 本來想賣 433 就好, 但是我會聯想到跟 PM 開會的 433R. 想想還是多賣 1 塊好了. 結果幸運分 4 筆陸續成交. 這樣一來, 陪伴我多年的波克夏也入祀忠烈祠了~~~

接下來要怎麼買呢? 這個月我開啟了定期定額的模式. 雖然可以按照跌 10% 買 10%, 跌 20% 買 20%, … 的這個原則買進. 但是我手中究竟有多少錢是變動很大的. 比方說賣 BRK.B 之前和之後就差很多. 所以我用手續費 0.1 USD 等級的定期定額, 一部分買 QQQ, 一部分買 PFF. QQQ 這單很幸運地買到 425.28, 因為那天開盤就暴跌.

買 QQQ 是我的投資重點, 基本上不會改變. 最近 Nvidia, Intel 出包, 反正就算這兩家沒事, 別家早晚也會出事. 整體而言, AI 浪潮勢不可擋, 我長期看好一籃子科技股. 只要整體會成長就好! 至於 PFF 股價雖然不會成長, 它卻能提供每個月生活費自動進帳的心理支撐. 這跟我們找工作一樣, 年薪再高, 月薪還是要有一定的水準才安心. 這算是個人偏執的心態吧.

年中投資回顧的時候, 我說希望到年底能持平就好. 不過轉眼已經跌掉了 6~8%. 如果不是民生用品和息股增值股 (KO, SHEL, VIG, NOBL) 在幫我分散壓力, 消失的就不是一台車而是一棟房了. 雖然重壓賺比較多, 但分散風險對心理還是比較健康的. 希望增持的 QQQ 能趕快回到原點, 這樣我就會創新高了.