--- 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