---
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
- 
- 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 的問題,但效果有限,因此仍須經過檢驗後再決定是否該使⽤用均值編碼

- 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)
- 
- 透過以上兩種方式能在線性回歸中找到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