AWS-ML認證筆記 — Domain 2
Exploratory Data Analysis(佔考試24%)
任務一: 為建模準備與清理資料
- 識別並處理遺失、損壞的資料和停用詞(Stop words)
- 格式化、正規化、增強和縮放資料
- 判斷是否有足夠的標記資料(labeled data)。像是確定緩解策略、
使用資料標記工具(如 Amazon Mechanical Turk)
任務二: 進行特徵工程
- 從資料集中識別並提取特徵,包括文字、語音、圖形等資料來源
- 分析和評估特徵工程概念,如,binning、tokenization、離群值(outliers)、合成特徵(synthetic features)、one-hot encoding、降低資料維度
任務三: ML的分析與視覺化
- 建立圖表,如scatter plots、time series、直方圖(histograms)、鬚盒圖(box plots)
- 解釋描述性統計,如,相關性(correlation)、summary statistics、p 值
- 執行聚類分析(Cluster analysis),如hierarchial, diagnosis, elbow plot, cluster size
認識Python
(考試不考Python的相關知識,但要看得懂),如下圖片範例。
Pandas
Python的函式庫,可以對資料進行切割(slicing and dicing),如Data Frames、Series、用numpy進行資料互通性(interoperates)
Matplotlib
Seaborn
scikit_learn
Python對ML建模的函式庫。使用隨機森林樹進行整合式學習。例如下圖是使用 10 個決策樹的隨機森林來預測特定候選人檔案的就業情況。
Jupyter notebooks
資料科學家會用到的資料開發平台。例如以下圖示(第二個)使用Seaborn這一個函式庫,提供了“joinplot”,它將散點圖(scatterplot)與兩個軸上的直方圖結合。這使我們可以同時視覺化單一數據點和兩者的分佈
主要的資料類型
- 數字型(numerical)
- 分類型(Categorical)
- 序數(Ordinal)
數字型(numerical)
代表某種定量測量(quantitative measurement),例如人的身高、網頁載入時間、股票價格等。這再分為兩個子類型:
- 離散資料(Discrete data)
基於整數;常常對某些事件進行計數。例如客戶一年內進行了多少次購買? - 連續資料(Continuous data)
這有無限多個可能值。例如使用者結帳需要多長時間?某一天下了多少雨?
分類型(Categorical)
沒有內在數學意義的定性資料(Qualitative data)。如性別、是非題(Yes or No的二元分類)、比賽的輸贏、產品類別、政黨傾向等。我們可以將數字分配給類別,以便更緊密地呈現它們,但這些數字沒有數學上的意義。
序數(Ordinal)
一種數字型與分類型的混合。分類型的資料可以有數學上的意義。例如對某些地方的評分等級,像是1–5顆星,三顆星比兩顆星還要好之類的比較。
資料分布(Data Distributions)
常態分佈
給出資料點落在特定值的某個特定範圍內的機率。
機率質量函數(Probability Mass Function)
卜瓦松分布(Poisson Distribution)
二項式分布(Binomial Distribution)
伯努利分布(Bernoulli Distribution)
- 二項式分佈的特例
- 有一次試驗 (n=1)
- 可以將二項式分佈視為伯努利分佈之和
時間序分析(Time Series Analysis)
趨勢(Trends)
週期性
趨勢+週期性
雜訊(Noise)
- 有些變化本質上是隨機的
- 週期
- 趨勢+雜訊=時間序列
— 加法模型
— 週期變化是恆定的 - 週期性 x 趨勢 x 雜訊— — 趨勢有時會放大"週期性和雜訊"。
— 乘法模型
— 週期變化隨著趨勢的增加而增加
AWS Athena
- 一種serverless服務來查詢S3中的資料
- S3 (SQL) 的互動式查詢服務,資料不用載入進Athena
- 底層是Presto
- 支援的格式 — CSV/JSON/ORC/Parquet/Avro。CSV與JSON是人類可以看得懂的。ORC/Parquet是一種可分割的Columnar格式,而Avro能分割但不是columnar。
- 支援結構/非結構/半結構資料
使用場景
- Web 日誌的單次查詢
- 在載入到 Redshift 之前查詢暫存(或中繼)資料
- 分析S3中的CloudTrail / CloudFront / VPC / ELB等日誌
- 與 Jupyter、Zeppelin、RStudio notebooks整合
- 與 QuickSight 整合
- 透過 ODBC/JDBC 與其他視覺化工具整合
Athena計費方式
- PAYG
— 掃描每 TB 5 美元
— 成功或取消的查詢計數,失敗的查詢不計數。
— DDL(CREATE/ALTER/DROP 等)免費 - 使用Colummar格式可以節省大量費用
— ORC、Parquet
— 節省 30–90%,並有更好的效能 - Glue和S3另外計費
Athena的安全設定
- 存取控制
— IAM、ACL、S3 buckets policies
— AmazonAthenaFullAccess / AWSQuicksightAthenaAccess - 加密 S3 暫存目錄(staging directory)中的結果(Data at rest)
— 使用 S3 管理的金鑰進行伺服器端加密 (SSE-S3)
— 使用 KMS 金鑰的伺服器端加密 (SSE-KMS)
— 使用 KMS 金鑰進行用戶端加密 (CSE-KMS) - S3 bucket policies中可以進行Cross Account存取
- TLS加密
Athena的不適用場景
- 高度格式化的報告或視覺化 — 這應該用QuickSight
- ETL — 這應該用Glue
QuickSight
- 快速、簡單、基於雲端的業務分析服務
- 允許組織中的所有員工:
— 建構可視化
— 執行單次分析
— 從數據中快速獲取業務洞察
— 隨時隨地在任何裝置(瀏覽器、行動裝置)查閱 - SaaS服務
資料來源
- Redshift
- Aurora / RDS
- Athena
- EC2-hosted databases
- Files (S3 or on-premises)
- Excel
- CSV, TSV
- Common or extended log format
- AWS IoT Analytics
- Data preparation allows limited ETL
SPICE((Super-fast, Parallel, In-memory Calculation Engine)
- 資料集匯入 SPICE
— 使用columnar storage, in-memory, machine code generation
— 加速大型資料集的互動式查詢 - 每個使用者能有10GB SPICE
- 高可用與高耐用性
- 可擴展到數十萬使用者
使用場景
- 互動式的單次(Ad-hoc)探索/資料視覺化
- 儀表板和 KPI
- 分析/視覺化以下的資料來源:
— S3 中的日誌
— 地端機房的DB
— AWS(RDS、Redshift、Athena、S3)
— SaaS 應用程式,例如 Salesforce
— 任何 JDBC/ODBC 資料來源
能夠使用的ML Insights
- Anomaly detection
- Forecasting
- Auto-narratives
QuickSight Q
- 由機器學習驅動
- 透過自然語言處理回答業務問題,例如某個時間點最暢銷的商品是什麼?
- 只在某些Region有提供
- 需要有關如何使用它的個人化訓練
- 必須設定與資料集關聯的主題
— 資料集及其欄位必須是 NLP-friendly
— 必須定義如何處理日期(dates)
QuickSight的分頁報告
- 2022 11月GA
- 設計用於列印的報告
- 可能跨越許多頁面
- 可基於現有的 Quicksight 儀表板
不適用的場景
ETL — 要用Glue。雖然QuickSight還是可以做某些的資料轉換。
QuickSight的安全設置
- MFA
- VPC Connectivity —
將QuickSight的IP rang加入DB security group - Row-level —
在Enterprise版本支援Cloum-level的安全設定 - Private VPC access —
ENI(Elastic Network Interface)、AWS Direct Connect
使用者管理
- MFA
- AD整合(Enterprise版本支援)
- 基於SAML的SSO
- 使用IAM或email 來設定使用者
計價方式
- 年度訂閱:
Standard: $9 / user /month
Enterprise: $18 / user / month
Enterprise with Q: $28 / user / month - 額外 SPICE 容量(超過 10GB)
$0.25 (standard) $0.38 (enterprise) / GB / month - 每月
Standard: $12 / user / month
Enterprise: $24 / user / month
Enterprise with Q: $34 / user / month - 分頁報告、警報和異常偵測、Q capacity、reader和reader session capacity的額外費用。
QuickSight視覺化類型
- AutoGraph
- Bar Charts
用於資料的"比較和分佈"(直方圖)
- Line graphs
對於隨著時間的推移而發生的變化
- Scatter plots
資料的關聯性
- heatmap
資料的關聯性
- Pie graphs, tree maps
資料的聚合(aggregation)
- Pivot tables
表格資料 - KPIs
將主要數值與其目標值進行比較
- Geospatial Charts (maps)
- Donut Charts
整體資料的百分比
- Gauge Charts
比較量測中的值
- Word Clouds
- Tree Maps
Heirarchical Aggregation
AWS EMR(Elastic MapReduce)
- 跑在EC2上的託管 Hadoop 框架
- 包含Spark, HBase, Presto, Flink, Hive等功能
- EMR Notebooks
- 與其他AWS服務整合
EMR Cluster
- Master(Leader) node: 在單一個EC2中管理整個cluster
- Core node: 儲存HDFS資料與run tasks — 能夠scale up/down(但有風險)
- Task node: Run task,但不儲存資料(所以node掛掉也沒差)。最理想的Instance是Spot
使用場景
- 短期與長期的Cluster
— 可以使用 Spot instance啟動task node以取得臨時容量
— 可以在長期運行的cluster上使用RI來節省費用 - 直接連到(SSH)master node來運行jobs
- 透過AWS控制台提交經過編排的步驟
- EMR Serverless 讓 AWS 自動擴展節點
EMR與其他AWS服務的整合
- EC2 用於構cluster中節點的執行個體
- 所以EMR 是跑在VPC中
- S3 儲存”輸入和輸出”資料
- CloudWatch 用於監控叢集效能並配置告警
- IAM 配置權限
- CloudTrail 稽核對服務發出的請求
- 用於排程和啟動叢集的 AWS Data Pipeline
EMR Storage(HDFS)
- EMRFS Consistent View — 資料位於S3的一致性,使用DynamoDB來記憶一致性。
- Local file system
- EBS for HDFS
EMR的保證
- EMR 按小時收費(外加EC2的費用)
- 如果Core node發生故障,則會自動產生新節點
- 可以動態新增和刪除task node
- 可以調整正在運行的cluster的core node的大小
Hadoop
YARN從2.0開始集中管理來自多個資料處理框架的cluster資源。
Apache Spark
Spark的運作模式
Spark 的組件
- Spark SQL — 分散式查詢引擎,提供高達 1 毫秒的低延遲互動式查詢,比 Mapreduce 快好幾倍
- GraphX — Distributed Graph processing framework
- Spark Core —
平台的基礎作業 : 如 fault recovery/scheduling/distributing/monitor job/interacting with storage systems APIs for Java/Scala/Python/R
Spark MLLib
- Classification: logistic regression, naïve Bayes
- Regression
- Decision trees
- Recommendation engine (ALS-alternating lease squares)
- Clustering (K-Means)
- LDA (topic modeling)
- ML workflow utilities (pipelines, feature transformation, persistence)
- SVD, PCA, statistics
Spark Structured Streaming
val inputDF = spark.readStream.json("s3://logs")
inputDF.groupBy($"action", window($"time", "2 hour")).count()
.writeStream.format("jdbc").start("jdbc:mysql//...")
Spark Streaming + Kinesis
Zeppelin + Spark
- 可以交互運行 Spark 代碼(就像在 Spark shell 中一樣)
— 加快開發週期
— 實驗和探索資料 - 可以直接針對 SparkSQL 執行 SQL 查詢
- 查詢結果可以以圖表和圖形形式視覺化
- 讓 Spark 感覺更像是資料科學工具
EMR Notebook
- 與 Zeppelin 類似的概念,但可以與許多AWS服務直接整合
- 可以備份到 S3
- 從Notebook配置叢集
- 運行在VPC 內
- 只能透過 AWS 控制台存取
EMR的安全設定
- IAM policies
- Kerberos
- SSH
- IAM roles
- 可以為 Lake Formation 指定安全性配置
- 與 Apache Ranger 的原生整合 — 用於 Hadoop/Hive 上的資料安全
特徵工程(Feature Engineering)
什麼是特徵工程
- 應用對”資料”以及正在使用的”模型”的理解來建立更好的特徵來訓練模型,例如
— 應該使用哪些特徵?
— 需要以某種方式改變這些特徵嗎?
— 如何處理缺失值?
— 應該從現有特徵中建立新特徵嗎?
我們不能只丟進一些原始資料就期望得到好的結果,特徵工程就是機器學習的藝術;是應用專業知識的地方。「應用機器學習基本上就是特徵工程」 — Andrew Ng。
維度的詛咒
- 太多的特徵可能是一個問題 — — 導致Sparse data
- 每個特徵都是一個新維度
- 大部分特徵工程都是選擇與當前問題最相關的特徵,而這通常是領域知識(Domain Knowledge)發揮作用的地方
- 我們還可以採用非監督降維技術將許多特徵提取為更少的特徵,例如PCA或K-Means
估算缺失值:使用平均值
- 將缺失值替換為該這個column平均值(一個column代表單一特徵;只有從同一特徵的其他樣本中獲取平均值才有意義。)
- 快速簡單,不會影響整個資料集的平均值或樣本大小
- 當存在離群值時,中位數(Median)可能是比平均值(Mean)更好的選擇
- 但這通常非常糟糕,因為:
— 只適用於column level,忽略了特徵之間的相關性(Correlations)
— 不能用於分類特徵(Categorical features)。不過,在這種情況下可以使用出現最多次的值來補缺失值
— 不太準確
估算缺失值:丟棄
- 如果沒有很多rows有缺失值…
…並且刪除這些row不會使資料產生偏差(bias)…
……而且我們也沒有很多時間…
……也許這是一件合理的事。
但是,它永遠不會是“最佳”方法的正確答案。如果變得更好。也許我們可以替換另一個類似的field? (即review summary vs. full text)
估算缺失值:機器學習
KNN:找出 K 個「最近」(最相似)的rows並對它們的值求平均
- 假設數值資料(numerical data),而不是分類資料(categorical data)
- 有多種方法可以處理分類資料(Hamming distance),但分類資料可能更適合
深度學習:
- 建立機器學習模型來為我們的機器學習模型估算資料
- 對於分類資料效果很好,真的很好。但這很複雜。
迴歸(Regression):
- 尋找缺失值的特徵與其他特徵之間的線性或非線性關係
- 最先進的技術:MICE((Multiple Imputation by Chained Equations)
估算缺失值:取更多的資料
- 還有什麼比有真實資料更好呢
- 有時我們只需要更努力收集更多資料
處理不平衡資料(Unbalanced Data)
這是一種在「有」或「沒有」案例之間有著巨大差異,如即詐欺偵測。詐欺很少見,大多數資料都不是詐欺。不要讓術語讓您感到困惑; “有(Positive)”並不意味著“好”。而是意味著正在測試的事情就是正在發生的事情。如果機器學習模型是為了偵測詐欺而設計的,那麼詐欺就是有(Positive)的情況。而這主要是神經網路的問題
Oversampling
如果針對詐欺的已發生(Positive)資料不足以讓ML學習,則我們可以使用Oversampling。來自少數群體的複製樣本,並且這些樣本是亂數取樣的。
Undersampling
另一種是與其建立更多已發生樣本,不如刪除未發生(negative)樣本。但丟棄資料通常不是正確的答案,除非我們專門試圖避免“大數據”擴展問題。
SMOTE(Synthetic Minority Over-sampling Technique)
- 這是使用最近鄰(nearest neighbors)所產生少數類別的新樣本
- 運行少數類別的每個樣本的K-nearest-neighbors
- 根據 KNN 結果(近鄰的平均數)來建立新樣本
- 兩者(KNN與近鄰的平均數)都會產生新樣本並對多數類別進行undersamples
- 這種方式通常比oversmapling好。
調整閥值(thresholds)
在對分類(詐欺/非詐欺)進行預測時,我們有某種機率閾值(threshold of probability),此時我們會將某些內容標記為發生(Positive)案例(詐欺)。但如果誤報太多,解決此問題的一種方法是簡單地增加該閾值。這保證能減少誤報。但是,可能會導致更多的漏報。
處理離群值
變異數(variance)是衡量資料"分散"的程度。所謂變異數 (𝜎2) 只是與平均值的平方差的平均。例如(1,4,5,4,8)的變異數:
- 取平均(1,4,5,4,8)/5 = 4.4
- 每個數值與4.4的差異 →(-3.4, -0.4, 0.6, -0.4, 3.6)
- 再把差異值求平方差 →(11.56, 0.16, 0.36, 0.16, 12.96)
- 求平方差的平均值 →𝜎2= (11.56 + 0.16 + 0.36 + 0.16 + 12.96) / 5 = 5.04
𝜎這一個符號可以稱為標準差(Standard Deviation),標準差 𝜎 只是變異數的平方根。𝜎2 = 5.04。𝜎 = 5.04 = 2.24。
所以(1,4,5,4,8)這一組資料的標準差是2.24。
標準差通常用作識別異常值的方法。與平均值相差超過一個標準差的資料點可視為異常。我們可以透過資料點與平均值的「多少sigmas」來討論資料點的極端程度。
有時從訓練資料中刪除異常值是適當的,並且負責任地這麼做。了解我們為什麼要這樣做。例如:在協作過濾(collaborative filtering)中,對數千個產品進行評分的單一客戶可能會對其他人的評分產生重大影響。這可能並不理想。
另一個例子:在網路日誌資料中,異常值可能代表應該被丟棄的機器人或其他代理程式。但如果有人真的想要全台灣人的平均收入,請不要因為想要就拋棄億萬富翁這個離群值。
說白了,就是針對我們要分析的領域要有Domain Know How。AWS 的隨機切割森林(RCF)演算法附加到其許多AWS服務(如QuickSight, Kinesis Analytics, SageMaker等)中 — 它是為異常值偵測而設計的。
範例:收入差距
Binning
這是將根據值範圍將觀察結果集中在一起。
如:估計年齡,將所有 20 多歲的人歸入一個類別,將 30 多歲的人歸入另一類,依此類推。Quantile binning根據資料在資料分佈中的位置對資料進行分類,這確保Bins的大小是一致的。
Binning可以將數值資料(numeric data)轉換為序數資料(ordinal data),當測量(數值)存在不確定性時特別有用。
Transforming
- 將某些函數應用於特徵以使其更適合資料訓練
- 具有指數趨勢(exponential trend)的特徵數據可能受益於對數轉換(logarithmic transform)
- 範例:YouTube 的影片推薦。數字特徵 𝑥 也以 x平方與x開根號呈現,這允許學習超線性函數和次線性函數(super and sub-linear functions)
Encoding
這是將資料轉換為模型所需的某種新呈現。One-hot encoding:
- 為每個類別建立“buckets”
- 我們所在類別的bucket的值為 1,所有其他類別的bucket的值為 0
這在深度學習中非常常見,其中類別由單一輸出「神經元(neurons)」呈現。
Scaling/Normalization
有些模型喜歡特徵資料在 0 附近呈常態分佈(大多數神經網路),而大多數模型要求特徵資料至少縮放到可比較的值。否則,具有較大幅度的特徵將具有比應有的更多的權重。
例如:將年齡和收入建模為特徵 — 收入的值將遠高於年齡,Scikit_learn 有一個預處理器模組可以協助(MinMaxScaler 等)。記得放大結果。
Shuffling
許多演算法受益於shuffling來訓練資料。沒有shuffling,可能會從訓練資料中根據收集順序產生的雜號中進行學習。
SageMaker Ground Truth
有時我們根本沒有訓練資料,所以需要先由人類產生。例如:訓練圖像分類模型。在訓練神經網路之前,有人需要用圖像的內容來標記一堆圖像。使用Ground Truth 會將標記我們的資料以用於資料訓練目的。
當圖像被人類標記時,Ground Truth 建立自己的模型。隨著該模型的學習,只有模型不確定的圖像才會發送給人工貼標者(可能是內部員工、Mechanical Turk、外包)來確認。這可以將標籤作業的成本降低 70%。
進階版: Ground Truth Plus,一種Turnkey solution。完全外包給AWS。我們可以填寫一份申請表格,並且在作業中透過"Ground Truth Plus Project Portal"查看標記進度,最後可以在S3取得標記資料。
其他可以產生訓練標記的方式有:
- AWS Rekognition
AWS的圖像辨識服務,能自動分類圖像。 - Comprehend
針對text analysis與topic modeling的AWS服務,自動根據topics/modeling自動分類。
在 Spark 和 EMR 上為 TF-IDF 準備資料
什麼是TF-IDF:
- 代表詞彙頻率(Term Frequency)和反向文件頻率(Inverse Document Frequency)。而頻繁出現的單字可能對該文件的含義很重要。
- 重要的搜尋資料-找出與文件最相關的詞彙(terms)。文件頻率是指一個字在整個文件集中(即整個維基百科或每個網頁)出現的頻率。
- 這告訴我們無論topic是什麼,都會出現在各處的常用詞,例如「一個」、「哪個」、「並且」等。
因此,衡量詞彙與文件的相關性的方法可能是:
或者: Term Frequency x Inverse Document Frequency。也就是說,將單詞在文件中出現的頻率與它在各處出現的頻率進行比較。這可以讓我們衡量這個詞對於該文件的重要性和獨特性。
TF-IDF 實踐
我們實際上使用 IDF 的對數(log),因為詞頻呈指數分佈(distributed exponentially)。這使我們能夠更好地衡量單詞的整體流行度。 TF-IDF 假設文件只是一個“詞袋(bag of words)”。
- 將文件解析成詞袋可能是大部分工作
- 為了提高效率,單詞可以呈現為哈希值
- 那麼同義詞呢?各種時態?縮寫?大小寫?拼字錯誤?
這麼多作業要做需要Spark來協助。
Unigrams, bigrams一堆有的沒的grams
TF-IDF 的擴展不僅可以計算單詞(terms)的相關性,還可以計算二元語法(bi-gram)或更普遍的 n-gram 的相關性。例如: I love aws exams
- Unigrams:會把每個字做為一個bag,所以這句話一共有4個bag
- Bi-grams: 會把這句話分成兩個,所以是 “I love”與”aws exams”
- Tri-grams:顧名思義就是三個詞一組,但由於一定是三個詞。所以會變"I love aws"與"love aws exams"。
一個非常簡單的搜尋演算法可能是:
- 計算語料庫中每個單詞的 TF-IDF
- 對於特定的搜尋字詞,按該詞的 TF-IDF 分數對文件進行排序
- 顯示結果