顯示具有 資料科學 標籤的文章。 顯示所有文章
顯示具有 資料科學 標籤的文章。 顯示所有文章

2025年6月25日 星期三

YOLO物件偵測的效能指標: mAP@IoU

 

mAP (mean Average Precision) for Object Detection

mAP@0.5 . 0.5 bounding box對Grond Truth 的IoU, 須達到的threshold才認定為物件。該物件為某一類旳預測機率稱為confidence。進行PR-curve 的計算。  

對每一個類別都用 PR-Curve 決定其效能, PR-Curve 底下所圍成的積即為 Average Precision,
  • 針對此類別的所有的bounding box ,計算 Recall 及 Precision
  • 在不同的recall 下(由0到1), 所對應的precision 所形成的面積,即為此類別的Average Precision,面積為 0~1 .
接著將所有類別的Average Precision值加總取平均, 即是mAP ,  此即為模型在預測各種類別的平均能力



https://youtu.be/R8tb0yNr-Qc

2025年1月10日 星期五

不平衡資料集的解決辦法


 
當樣本類別分佈很不平均時 , 如何解決?

不平衡資料集

(1) 從資料下手: 


除了用data augumentation 增加少數Minority類別的樣本資料, 也可以用Resampling 的方法,避免模型訓練後偏向回答多數(Majority)類別的答案 .
Resampling 是指反覆地從訓練資料中抽取不同的樣本子集,並對每組子集重新訓練模型,減少模型的偏差。Resampling 的方法如 Bootstrap 取樣法或 K-Fol 交叉驗證,這兩種方法其主要差異在於樣本子集的抽取方式:Bootstrap使用有放回的隨機抽樣,而 k-fold 交叉驗證則將資料分成 k 個不重疊的子集進行訓練與驗證。






  • 分割: 把訓練集(注意,這裡指的是除去最終測試集後剩下的數據)平均分成 k 個小集合(或稱為「摺」,folds)。
  • 迭代訓練與驗證: 針對這 k 個摺,重複以下步驟 k 次:
    • 訓練: 選取其中 k-1 個摺作為訓練數據來訓練模型。
    • 驗證: 用剩下那 1 個摺作為臨時的測試集(或驗證集),來評估模型的表現(例如計算準確率)。
  • 平均表現: k-摺交叉驗證最終報告的模型表現,是這 k 次驗證結果的平均值


  • (2) 從模型下手: 

    資料添增完後,可以更進一步雙管齊下去修改模型的 Loss 函數,當模型對少數類別的判別錯誤時加重懲罰,加大它的Loss。 例如 logistic regression 的 Loss 函數 可以修改成這樣。






    2024年10月8日 星期二

    描述常態分佈的特徵: 偏度與峰度




    對於常態分佈(可以Histogram 畫下來) ,除了mu (mean), sigma (variance), 還可以用 Skwness 及kurtosis 來描述, 此亦可以作為特徵。

    Skwness: 描述圖形是對稱分佈嗎? 還是左偏分佈 ? 或右偏分佈分佈? 



    偏度 k3k_3 的計算公式:

    Skewness=E[(Xμ)3]σ3\text{Skewness} = \frac{\mathbb{E}[(X - \mu)^3]}{\sigma^3}
    • 如果 k3>  0,分佈為正偏(右偏),資料分佈中有較多的數據點集中在低值區域,而右尾較長,代表有少數較大的數值偏離平均數使得 (X-u)的3次方後正更多.
    • 如果 k3 < 0,分佈為負偏(左偏),資料分佈中有較多的數據點集中在高值區域,而左尾較長,代表有少數較小的數值偏離平均數使得 (X-u)的3次方後負更多.



    峰度(Kurtosis)決定數值分布的同質性與異質性,越接近高狹峰表示越同質,越趨向低闊峰表示越異質。



    峰度 (Kurtosis) 的計算公式是:

    Kurtosis

    =1ni=1n(Xiμσ)4\text{Kurtosis} = \frac{1}{n} \sum_{i=1}^{n} \left(\frac{X_i - \mu}{\sigma}\right)^4


     標準常態分佈的峰度為 3.  為使標準常態分佈的峰度為 0,故會將原始峰度減去 3,從而更方便地比較其他分佈的峰度。也因此為峰度會有負值的原因。











     












    數據分佈的尾部厚度愈厚,表示有較多異常值(離峰較遠者),故按公式計算其峰值會較大。


    2024年10月5日 星期六

    多變量常態分佈 Normal Distribution

    Multinormal Distribution (多態性常態分佈)


    當K=1 時, 即是單維的常態分佈 f(x)


    若 u=0, covariane matrix= I  

    當K=2 時, 為雙變數的
    常態分佈 PDF f(x,y)










    2024年9月25日 星期三

    觀察資料的趨勢



    EDA 中觀察資料的趨勢

    針對Time Series Data 通常會觀察原始資料的趨勢(Trend), 季節性/週期性(Seasonality)的狀態或資料中的雜訊.



    但這些數據是怎麼取得的呢? 
    1. 趨勢線: 用原始資料的移動平均值(MA)作為長期走勢的觀察. (移動窗口可以自己設定) 
    2. 週期性 (Seaonality): 將原始資料減去趨勢線可以強調週期性的特徵
    3. 雜訊(Residual) :   原始資料減去趨勢線再減去週期性線, 剩下的值認定是噪訊(隨機波動)或短期的變化。

    可以自己用Python 完成或者利用 statsmodels 工具來完成。 statsmodels 本身提供許多不同統計模型和統計資料探索的函數。


    另外, 也可以計算ACF ( Autocorrelation)  , 自相關係數為原始資料 Xt 和 X的lagged  Xt+k計算相關係數,ACF 大小可以幫助我們了解數據中週期性的狀態。當lagged 越大 (即K愈大),ACF 通常會逐漸減少,特別是對於沒有長期相關性的數據而言。


    $$\rho_k = \frac{\sum_{t=k+1}^{n} (X_t - \bar{X})(X_{t-k} - \bar{X})}{\sum_{t=1}^{n} (X_t - \bar{X})^2}$$

    Note:$ \rho_0=1 $ 

    繪製出ACF圖, 若每隔 $i$ 之後都能看到這個峰值, 則可能存週期 $i$。序列資料可能有存在一個以上的週期,如每週會有一個週期, 而每季也有一個週期。 






    ACF圖( X軸為不同的lag k, Y軸為ACF值)

    底下ACF圖說明序列資料沒有存在週期性.


    --------------

    具有週期性的資料
     seasonal_pattern = 10 * np.sin(2 * np.pi * time / 12
     trend = 0.1 * time 
     noise = np.random.normal(0, 1, size=100
     data = seasonal_pattern + trend + noise






    ACF圖( X軸為不同的lag k, Y軸為ACF值)

    底下ACF圖說明序列資料存在一個週期性, 在Lag n*K 處都有差不多的峰值, 表示其週期性為 k

    2024年9月18日 星期三

    最大概似估計 (MLE) 與 GLL

     




    看到 y1 情況下 , 機率分佈其參數會是 $ \theta_1 $ 的可能性高於$ \theta_2 $.

    可能性的意義亦等同於  $ P( y_1 \mid \theta_1 ) > P( y_1 \mid \theta_2 ) $ , 

    但如何找到最好的$ \theta $ 使其可能性達到最大,即機率 $ P( y_1 \mid \theta )$ 能達到最大, 此即為 最大概似估計 (Maximum Likelihood Estimation) 的目標。

    若此機率模型為高斯分佈, 即什麼樣的參數 $(\mu, \sigma^2)$ , 能使 $ P(y_1 \mid \mu, \sigma^2)$ 最大.

    若你的機器學習模型是預測一個高斯分佈的參數  $(\mu, \sigma^2)$

    $$X \sim \mathcal{N}(\mu, \sigma^2)$$

    $$f(x) = \frac{1}{\sigma \sqrt{2\pi}} e^{ - \frac{(x - \mu)^2}{2 \sigma^2} }$$

    則你可以將對應答案 $y_1$ 丟入得出其機率,即 $$ f ( y_1 \mid \mu, \sigma^2) $$

    若預測的參數夠好的話,則$f(y_1\mid \mu, \sigma^2)$ 應該要很大,若取Log 改以$$X \sim \text{Log-N}(\mu, \sigma^2)$$ 表示,值也會是大的。

    $$log(f(y_1\mid \mu, \sigma^2)) = -\frac{1}{2} \log(2\pi) -\frac{1}{2}  \log(\sigma^2) - \frac{(y_1 - \mu)^2}{2 \sigma^2}$$


    此式子的最大值為 y1=μ .  y1=μ 代表我們猜得夠準才能使機率值最大 










     若預測多組 $(\mu_1, \sigma_1^2), (\mu_2, \sigma_2^2),...,(\mu_n, \sigma_n^2)$

    效能可以直接加總 $$f(y_1\mid \mu_1, \sigma_1^2) +f(y_2\mid \mu_2, \sigma_2^2)+...+f(y_n\mid \mu_n, \sigma_n^n)$$  , 或取log 值相加也可以。

     $log(f(y_1\mid \mu_1, \sigma_1^2)) +log(f(y_2\mid \mu_2, \sigma_2^2))+...+log(f(y_n\mid \mu_n, \sigma_n^n))$   ---> 這就是 GLL (Gaussian Log Likelihood)

    a^2))$$






    2024年8月3日 星期六

    iPAS 機器學習工程師參考樣題解說




    更多補充說明 :

    1.) 神經網路加入Embedding 層的用意? 
    將輸入的 sparse vector 轉換成高維度的 dense vector,如此的 dense vector可能可以表現資料更多元的特徵。

    2.) 模型效能評估為何使用RMSLE (Root Mean Square Logarithmic Error)  而不是MSE  ? 

    因為當資料數據 y 本身差異很大時, 決定MSE 的大小其實都是由數值很大的 y 所主導, 對於數值很小的 y 就顯得微不足道。  故若想要觀察每一筆資料預測的誤差不要被某一筆數量級較大的y所主導,可以使用RMSLE.


    因為RMSLE 先取 log  再計算MSE.。 由於取log 會使數值 scale 變小, 因此即使存在某些 y 很大, 對MSE 的影響也會相對變小。

    另外,也可以用MAPE, 尤其當每筆資料數據 y 都是很大的情況,用MSE 計算都將超大,故用平均絕對百分比誤差反而是一個比較能看出預測和標準答案的誤差率。

     



    Read More: 

    2021年12月10日 星期五

    為什麼Z-Score標準化後, 會得到平均數為0, 標準差為1

     1.) How can I choose between normalization and standardization in different situations?


         資料並無特別遵從常態分佈, 則使用 Normalization , 如圖片的像素常用  Normalization 將像素值壓在0~1 之間。若資料遵從常態分佈 (很多時候會假設資料是常態分佈), 則使用Standardization (z-score)


    2.) 證明: 為什麼Z-Score標準化後, 會得到平均數為0, 標準差為1 



    2019年1月10日 星期四

    AIoT軟體架構圖


    實現一個AIoT架構,一個可能的方式參考下列作法

    在Raspberry Pi 這邊, 將一個ML/DL Model 所預測出來的結果, 也許是0或1, 或是分類的softmax機率值等, 依據結果,以事件方式丟到雲端,再由雲端的程式負責進和外界的通訊,通訊的方式可以E-mail, LINE, MQTT, WebSocket等機制。

    這樣的好處是資料與通訊管理的細節都在雲端處理, 而Raspberry Pi 只會根據AI預測的結果,於條件滿足的時候再會用到網路。好處: 終端能減少網路的使用, 而且也不必霊端方面的應用邏輯。並且能專司其職,懂AI的人專注在AI身上,懂雲端/Web 技術的人就專注這些Web技術。







    #Python  code snippet 

    利用python上驗證各種通訊程序, 包含 MQTT, LinePutsh,...


    #Node.js code snippet 


    // parse application/json
    var jsonParser = bodyParser.json()

    /MQTT
    app.post('/agent/mqtt',jsonParser, function (req, res) {

      //console.log(req.body)
      console.log(req.body.topic);
      console.log(req.body.message);

    //測試Linebot是否能通
    app.post('/webhook', bot.parser());

    //Line Push
    app.post('/agent/line', function (req, res) {

      console.log('Line');

      ////Line code/////////////
     // pushLinemsg(req.body.message['0'])
     pushLinemsg(JSON.stringify(req.body.message))


      ////Repsone to http client/////
         respond_http(res);

    });





    #為使用Linebot 我們使用ngrok 來解決private IP及要提供https服務

    ./ngrok http 3010




    2a87b84c.ngrok.io/webhook 貼到Line的設定中,並verify https 200 OK, 如果可以通代表ngrok 已打通的channel







    2018年3月16日 星期五

    機器學習(Machine Learning)與深度學習(Deep Learning)



    什麼是機器學習(Machine Learning)?


    機器學習是人工智慧的其中一個分支,簡單來說它就是讓機器可以像人一樣,可藉由閱讀大量的資料建立規則而具有知識,而機器學習就是透過演算法來分析數據、從中學習來判斷或預測現實世界裡的某些事(專家其實是訓練有素的狗,機器學習大概就是這個味道) 。閱讀已知的大量資料就是所謂訓練的過程,透過足夠多的Training Data 建立出一個 Model (最佳函式), 這個Model 就是"機器的知識",之後你可以餵未知的資料給機器,機器就能進行預測或判斷 。機器學習並非手動事先用程式撰寫好指令規則來判斷,而是使用大量的數據和演算法來「訓練」機器,自動產生規則自動判斷或預測。

    什麼是類神經網路?

    類神經網路是機器學習領域中的一種方法,它企圖用模擬人類大腦中的神經網路(Neural Network)的運作方式來建構機器學習的Model。例如,眼睛看到車快撞上來了,人的反應會立刻跳開,這中間可能經過大腦無數個神經元的運算及傳導,至今人類可能都還搞不清楚大腦怎麼辦到的,因為中間過程太複雜,但從頭尾結果來看卻很簡單, 就是看到車要撞到了,人會閃。Neural Network 概念,其實正是如此,一堆資料X 而每筆資料有多個特徵值(x1,x2,x3,x4),NN中每一層的權重W就可以決定出最終的 Y (y1,y2,y3)。若中間可能有很多層,很多層就叫做 MLP(Multi-Layer Perceptron)。當層級愈多網路就愈大, 所需的參數W就要愈多,因此計算Gradient 就要花更多的時間。



    什麼是深度學習(Deep Learning)?

    它其實就是很深的Neural Network (Deep Neural Network DNN), 就是中間Hidden Layer 有很多層級。AlexNet 達到8層級, ResNet已達到100多個層級。每建構一個Hidden Layer就代表建立同款式但有著不同花樣的過濾器(Filter)/篩子,以篩出不同的特徵。愈多的Hidden Layer 就代表用了更多款式的篩子。經過Back Propagation 計算後,求得每一個款式下不同花樣的權重W。而愈重要的篩子權重愈高,愈不重要的篩子權重就會愈低。 這些W權重較大的篩子,代表用這些篩子可以篩出 X-->Y的重要成份,也就是"特徵"。這也就是深度學習最強的地方--自動特徵擷取,而不是由人來先定義好特徵。

    如何建構深度學習中的網路模型則是Deep Learning 的核心技術。 針對影像處裡的 CNN卷積神經網路(Convolution Neuron Networks) , 網路中加入Convolution及pooling 層以抽取特徵,而將能將圖片進行分類預測。RNN (Recurrent Neural Networks)主要用於文字語意處理,可以用來判斷前後文而使機器能理解一句話的意思。

    機器學習或深度學習的技術可以應用在哪?

    機器學習的演算法已廣泛應用於資料探勘、電腦視覺、自然語言處理、語音和手寫識別、生物特徵識別、DNA序列測、搜尋引擎、醫學診斷、金融數據分析與證券市場分析等方面。所以幾乎各行各業,包含金融業、零售業、製造業、醫療產業等,都會用到機器學習的技術。而以深度學習作為機器學習的方法,則多用在電腦視覺(Computer Vision)、ASR語音識別 (Automatic Speech Recognition)、NLP(自然語言處理),這種比較沒有因果關係或者連人類都很難解釋的邏輯推理。



    ===================================
    深度學習的Hello World:  "MNIST" 手寫數字辨識

    簡單說明Artifical Neural Network 基本流程, 當然也可以Deep Learning 的CNN (Constitutional Neural Network )實作它, 你就對CNN有更進一步的認識


    step: training data 將每一個手寫數字轉成pixel vector, 作為input X , 每個pixel 作為feature 




    建立Network Model (網路參數.....)


    以手寫數字"6" 示意在input layer 的態度


     訓練好Model 後, 對testing data 進行predict, 能將手寫的0~9數字Label出對應的 0~9. 然後比較正確率(Accuracy) 
    當正確率不足, 如何修改網路參數以提高正確率...正是學問之所在? 在kaggle 上目前有6萬多筆的手寫數字, 其正確率是100%......

    https://goo.gl/EcCcj7



    2018年2月12日 星期一

    KNN演算法



    監督式學習是透過資料訓練(training)出一個model 但是在KNN其實並沒有做training的動作

    最近鄰居法KNN演算法,又譯K-近鄰演算法

    KNN屬於機器學習中的監督式學習(Supervised learning)



    K=3 時, 鄰居有3人, 新加入的綠色應為 紅色三角形 那一群



    尚未分類的資料,我們要怎麼將他分類呢?這邊就是非監督式學習(Unsupervised learning)中的K-Means



    K-means主要講的就是「物以類聚」

    K-means是一個分群(Clustering)的演算法,不需要有預先標記好的資料(unlabeled data),屬於非監督式學習(Unsupervised learning)。主要是用來做常常被使用在資料分群,簡單的說就是把一堆資料根據你判斷相近的邏輯,把這一堆資料分成k群。

    用比較數學(
    嚇人)的說法就是,追求各個群組內部的均方誤差總和最小。
    argmini=1kxjSi||Xjμi||2
    (x1,x2,x3...,xn)
    S=S1,S2,,Sk, S為分割的群組集合
    μi是群組Si內所有元素xj的重心,或叫中心點。
    下面這個圖是一個資料根據不同K所分群出來的結果,顏色只是提供辨識分群用。


    1. 先決定K
      k就是最後要分成幾群,如果你希望最後資料分成 3群 ,k就是3。
    2. 在你的資料中,隨機選擇k個點做為群中心(也可以直接從資料挑)。
    3. 把每一筆資料標記上離它最近的群中心
    4. 根據同一個標記的所有資料,重新計算出群中心。
    5. 如果步驟4算出來的群中心跟原本步驟3不同,則重複步驟3

    2017年12月7日 星期四

    GPU vs CPU




    如果你要跑CNN或是RNN , 由於Training Accuracy 要降, 沒有執行一定次數的參數update是無法做到的, 所以資料量大又要不斷運算, 藉由GPU來執行,會快上超多!

    經實測結果以下面兩種平台法測試, 速度真得差了很多...



    平台1: 沒有GPU的平台
    CPU: model name   : Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
    # of Thread    : 12
    RAM: 10G
    OS: Ubuntu 16.04



    平台2 : 具有GPU的平台
    CPU model name    : Intel Core i7-7700K CPU @ 4.5GHz
    # of Thread     : 6
    GPU: GeForce GTX 1080
    RAM:  32G
    OS: Ubuntu 16.04


    DeviceQuery Example



    https://goo.gl/uMDpM1