---
# System prepended metadata

title: ML百日馬拉松
tags: [ML]

---

---
title: ML百日馬拉松
tags: learning,ML,Data Science,record,python
---

- Day003
    - 開始使用不太喜歡的 jupyter
    > 要使用 jupyter notebook
    - EDA (探索式資料分析 / Exploratory Data Analysis)
- Day006
    - 有過大的檔案無法上傳到 git 上所以無法使用 colab 輕鬆讀取 raw
    > 必須離開 colab 必須使用 jupyter
- Day007
    - 遇到了新東西 f-string
    :::info
    過去我們在格式化輸出的時候我們都會使用format
    但在python 3.6.2 後出來了 f-string 可以透過更方便的方式格式化輸出
    ```code
        print(f'{你的變數} second:{你的變數}')
    ```
    只要使用引號刮起來，前面加 f 之後可以在引號中間直接輸出文字，要輸出的變數只要寫在 {} 內就好
    :::
- Day008
    - outlier (離群值、例外值)
        - 超過三個標準差代表該樣本過於罕見，不是很特別就是發生某種問題
- Day009
    - CDF
        - 目的
            - 為了計算某隨機變數x在x$\le$X的機率為多少
            - 骰骰子 
                - $F_X(0.3) = 0$
                - $F_X(1) = \frac{1}{6}$
                - $F_X(2.5) = \frac{2}{6}$
                - $F_X(200) = 1$
        - $0\le F_X(x) \le1$
        - 在離散隨機變數的部分會不連續$F_X(x^-)\neq F_X(x)$
        - 在連續隨機變數的部分會連續$F_X(x^-)= F_X(x)$
- Day010
    - pandas 的 read_csv 可以讀取壓縮檔中的 csv
        - `df = pd.read_csv(path + 'house_train.csv.gz')`
    - numpy 的 log1p 可以將數值 +1 取 log
    - numpy 的 array 沒有 remove
- Day011
   - 對於回歸模型來說，資料做了標準化表現效果會比較好
   - 對於 tree base 來說則沒差
   
- Day012
    - 最小最大化
        - $X_{nom}=\frac{X-X_{min}}{X_{max}-X_{min}}$
    - 標準化
        - $Z = \frac{X-\mu}{σ}$
        - 平均數: μ, 標準差 : σ
    - ，補缺失值還要注意盡量量不要破壞資料分布
    - ```python=0
        # 簡單標準化
        # 你也可以使用最大最小化 MinMaxScaler
        scaler = StandardScaler()
        df = scaler.fit_transform(df[cols])
        # 簡單估算模型好壞的方法
        estimator = LogisticRegression()
        print(cross_val_score(estimator, train_X, train_Y, cv=5).mean())
        #找眾數mode方法
        mode = df[col].value_counts().index[0]```
     
 - Day015
     - DataFrame 裡面要判斷是否為NaN有點麻煩
     - 你可以使用 numpy.isnull()
     
 - Day016
     - matplotlib 可以藉由 pyplot.use("") 這個來指定繪畫風格
         - 參數有 : ggplot、seaborn
     - KDE [參考資料](https://www.youtube.com/watch?v=x5zLaWT5KPs)
     - pandas.cut 可以依照你指定的區間拆分資料
     - pyplot.figure(figsize=(x,y),dpi=z)
         - x : 圖片寬度 (int, float) 
         - y : 圖片高度 (int, float)
         - z : 圖片的解析度 (int, float)
     - seaborn.distplot() 可以協助你畫分布圖
         - KDE 使用其中 kde 參數，就可以用此畫出來
 - Day017
     - 特徵的離散化有助於模型的疊代，提高模型表達力(非線性的輸入)
     - pandas分群
         - pd.cut(col, 群數) 等距劃分
         - pd.qcout(col, 群數) 等頻劃分
     - LabelEncoder
         - 將不同種類的標籤重新編碼成 0 ~ n_classes
         - 常用 module
             - fit : fit label
             - transform : transform labels to normalized encoding
             - fit_transform : fit label and return transform label
 - Day019
     - ![](https://i.imgur.com/xKArXu0.png =300x)
     - pandas 有 hist 畫 bar 的功能
         - 但好像遇到 nan 會報錯
         - [seaborn 好用視覺化方式](https://seaborn.pydata.org/generated/seaborn.jointplot.html)
 - Day020
     - seaborn heatmap
     `sns.heatmap(df.corr(), cmap = plt.cm.RdYlBu_r, vmin = -0.25, annot = True, vmax = 0.6)`
     > 參數說明
     > 某個 df 的 corr()，2D 的 array 就可以了
     > camp = 顯示顏色
     > annot = 是否要有數字顯示
     > vmax = 數值上限為多少，沒有則預設為最大值
     > vmin = 數值下限為多少，沒有澤預設最小值
     - pyplot.tight_layout()
         - 可以解決再多圖時會有 title 重疊情況 [參考連結](https://www.jianshu.com/p/91eb0d616adb)
     `plt.tight_layout()`
    - seaborn kdeplot
        - 幫忙畫 kde 的圖
    `sns.kdeplot(app_train.loc[app_train['TARGET'] == 0, source], label = 'target == 0')
    `
    > 參數說明
    > 某個1D的資料
    > label = 右上角的label
    - seaborn PairGrid
        - 多圖繪製方法
    ```python=1
    grid = sns.PairGrid(data = plot_data, size = 3, diag_sharey=False, hue = 'TARGET', vars = [x for x in list(plot_data.columns) if x != 'TARGET'])
    # 上半部為 scatter
    grid.map_upper(plt.scatter, alpha = 0.2)
    # 對角線畫 histogram
    grid.map_diag(sns.kdeplot)
    # 下半部放 density plot
    grid.map_lower(sns.kdeplot, cmap = plt.cm.OrRd_r)
    plt.suptitle('Ext Source and Age Features Pairs Plot', size = 32, y = 1.05)
    plt.show()
    ```
    > **PairGrid** 參數說明
    > data = 2D array
    > size = 子圖大小
    > diag_sharey = 讓最大數值成為子圖最頂
    > hue = 不同顏色的目標，可視為第三個維度，不同的label
    > vars = label 名稱
    
    > **map_upper** 參數說明
    > 看你要以哪種形式畫上半部的圖
    
    > **map_diag** 參數說明
    > 看你以哪種形式畫對角線的圖
    
    > **map_lower** 參數說明
    > 看你要以哪種形式化下半部的圖
    > cmap = 看你要以哪種顏色的

- Day021
    - sklearn.preprocessing.Imputer
        - 幫忙填補空值
    `Imputer(missing_values=’NaN’, strategy=’mean’, axis=0, verbose=0, copy=True)`
    > **Imputer** 參數說明
    > 
    - pandas.DataFrame.to_csv
- Day023 去除偏態的方法
    - scipy.stats.boxcox(x)
        - 分布去偏
    `stats.boxcox(x)[0]`
    > **scipy.stats.boxcox** 參數說明
    > x=需要放入一個1D的ndarray資料
    :::warrning
    轉換前的數值不可小於等於0
    λ要藉於0~0.5之間
    :::
    - np.log1p
        - 可以對偏度比較大的資料進行轉化，使其更加服從高斯分佈
    `np.log1p(x)`
    - np.expml(x)
        - 反向的 log1p
    `np.expm1(x)`
- Day024 one-hot-encoding, label encoding
    - 特徵性質重要性高，種類較少時適合用 one-hot-encoding
    - 適用於
    
	| \  | 儲存空間 | 適用模型 |
    | -------- | -------- | -------- |
    | Label Encoding| 需求較小   | 非深度學習模型 |
    | One Hot Encoding | 需求較大 | 深度學習模型 |
	
    - 非深度學習模型如tree base的模型


- Day025 均值編碼
    - 當類別特徵與⽬目標明顯相關時，該考慮採⽤用均值編碼
    - 平滑化的⽅方式能修正均值編碼容易易 Overfitting 的問題，但效果有限，因此仍須經過檢驗後再決定是否該使⽤用均值編碼
    ![](https://i.imgur.com/pUDVO28.png=300x)

- Day026 計數編碼、雜湊編碼
- Day029 群聚編碼
	- 群聚編碼與之前的均值編碼最主要的差異異，⼀一個是特徵彼此之間與特徵⽬目標值之間的差異異，另⼀一個最⼤大的差異異是 : 群聚編碼因為與⽬目標值無關，因此不容易易 Overfitting
	- 平均對象非目標值
	- 群聚編碼最常使⽤用的運算是 mean, 除此之外還有median、mode、max、min、count等統計量量可以使⽤

- Day030 特徵選擇
	- 相關係數過濾法
	- 嵌入法 (Embedded) 
	- GDBT
	- 特徵選擇中，計算時間較長，但是能排除共線性且比較穩定的⽅方式是梯度提升樹嵌入法
	> [github](https://github.com/henry3556108/ML-3rd-100Day/blob/master/Day_030_HW.ipynb)


- Day031 特徵評估
	- 樹狀狀模型的特徵重要性，可以分為分⽀支次數、特徵覆蓋度、損失函數降低量量
	- sklearn 樹狀狀模型與 Xgboost 的特徵重要性，最⼤大差異異就是在sklearn 只有精準度最低的「分⽀支次數」
	- 特徵重要性本⾝身的重要性，是在於本⾝身是增刪特徵的重要判定準則，在領域知識不⾜足時，成為改善模型的最⼤大幫⼿手
	> [github](https://github.com/henry3556108/ML-3rd-100Day/blob/master/Day_031_HW.ipynb)

- Day032 分類型特徵優化 - 葉編碼

- Day039
	- 赤池信息准则(AIC)
	- 贝叶斯信息准则(BIC)
	- ![](https://i.imgur.com/rl9JETo.png=200x)
	- 透過以上兩種方式能在線性回歸中找到regularization的 alpha
- Day044
	- Bagging 適用於容易 Overfitting 
		- 沒又順序的訓練
		- 決策樹
		- random forest tree -> 有Bagging的決策數
		- 單純Bagging不能使正確率提高
	- Boosting 適用於弱 Model 不容易 fit data
		- 有順序的訓練
		- GradientBoostingClassifier() => 似乎只能分兩類

- Day058
	- [非監督式 階層分群法觀察-1](https://)
	- [非監督式 階層分群法觀察-2](https://)

- Day061
	- PCA 是⼀一種線性降維⽅方，在特徵數量量過多時，或者特徵間是非線性關係，會有 underfitting
	- t-SNE 對於特徵非線性資料有更更好的降維呈現能⼒力，但資源消耗比 PCA 多
		- t-SNE 確實因為新資料進來就必須要重新訓練，以獲得到全體相關相對的降維 "視覺圖形"。所以通常, t-SNE 都是當作專案結束時的成果說明中的工具，有助於理解資料狀態。

- Day09*
	- 圖片型資料記得一定要normalization
- Day099
	- 圖片的data argumentation前需要先normalization
	- 在訓練時神經網路時，圖像資料必須要是 float32，但在做視覺化時要轉為 int 才能順利畫圖。所以為了畫圖才把資料轉為 int

---
# 額外筆記
### confusion matrix
- presision 配 recall
- sensitivity 配 specificity
- recall = sensitivity
- F1 score
- MCC
- AUC、ROC