code

2017年9月30日 星期六

Inclusive Leadership 2 - 偏見 & EACH四心法

每個人都有偏見 (除非你成佛了)

某個在英國的實驗顯示,非白人姓氏的履歷表會減少30%的interview機會。這類潛在性偏見人們多數是不自覺的,不過這可以用作業流程來改善,例如同一個實驗中,如果不透過履歷應徵,而是詳細在網路應徵表格填寫(online form),則面試官的注意力就放在真正與工作相關的skillset。

當然偏見(有可能是好的或壞的)是幫助我們generalize某些族群的快速方式,有它的存在意義,但是這邊要明確認知的原因在這會影響商業決策,我們當然希望每個決策都是意識層面的深思熟慮,而不是受到偏見的主導。

所以管理者首先要認知自己一定有潛在性的偏見(真的發生時無法察覺),要把組織制度設計成避免這些偏見能夠作用的方式

非核心成員的個人特質

stereotypes隱含某些核心群組必須要有那些特質(例如老白男),沒有這些特徵但處在此族群者稱為others,他們的特性(非老白男)稱為otherness。

inclusive leader要用EACH四心法中的Courage來鼓舞自己踏出舒適圈去理解和感同身受這些otherness,並且用Humility來告訴自己三人行必有我師焉,非主流特徵者必定也有管理者可以效法的地方。


什麼是EACH四心法?



Empowerment(授權):主管要能分享資訊給屬下,我的工作經驗中,通常只會接收來自主管的指令,卻沒有來自主管分享的情報,這讓人感到很不被包含在核心成員中。授權廣義的來說,也是鼓勵屬下成長,培養屬下解決問題的能力,這對屬下的長期職涯發展是有幫助的,經理人的重要責任之一就是幫助屬下成長

Accountability: 和empowerment合在一起,其實就是權責相符,授權之後也要讓屬下知道他們該負起相等的責任。這不是壓力,相反的能讓屬下覺得被重視,因為身負重任。這也是真正的責任制(不過在台灣還是會有那種無聊的上下班時間要求,沒啥意義,這非結果導向該有的規範)。

Courage: 職場中要能表現出自己的意見,才能突破群體思考的困境,經理人和屬下都必須要有勇氣去“表達”。

Humility: 這是給每個經理人的忠告,保持謙虛才能知道自己在管理上的不足,也才能有意願授權屬下(不要以為自己一定比屬下強啊)。事實上這對每個人都有用,因為即便是達文西也只能專精幾個領域,何況一般人?上善若水,才有貴人出現

2017年9月29日 星期五

Applied Machine Learning in Python 18 - Data Leakage

什麼是data leakage?

就是training時洩露了prediction相關的資訊,例如誤把class label當成feature。
另一種可能就是test data被拿來當training data。
有更多其他可能性。

嚴重後果

leakage會得出suboptimal prediction。


可能發生leakage的情況

1. training data含有加工過的未來資訊,例如某個網站的visitor log,能得出某個visitor平均停留時間等,但這是一個session結束過後的統計,不是estimator在session過程中可以得到的runtime資訊。

把這個平均停留時間(session time)換成一個session到目前為止看過的網頁的話,就是一個彌補leakage的方法。

2. 如果要預測某個人是否即將要做某事,如果把那件事的屬性當成feature來train的話,也相當於把prediction拿來train。

第二類可以能延伸出相當多變種,所以data leakage是危險難以發現的。

data的來源也是一個可能造成leakage的問題,如果不清楚知道每個變數的意義,可能會誤用造成leakage。



2017年9月28日 星期四

Applied Machine Learning in Python 17 - Neural Networks

Multilayer perceptron

之前提過的linear regressor 其實就是weighted sum:


NN也是差不多的概念,不過在input和output中間多了一層hidden layer,就是某個mapping function (可以是nonlinear),稱為activation function,最後還是weighted sum output:



Activation functions

常見的有以下三種(其中一種就是構成了logistic regression):


sklearn default是用relu function,通常使用relu function / tanh就能達到好的效果。
在sklearn中使用multi-layer perceptron如下:


上面是1-hidden layer,如果要改變hidden layer數目的話,hidden_layer_sizes這個參數應該是要傳至少2-element array 。

solver參數就是設定learning algorithm。

hidden layer中的neuron units控制了model complexity:


1-unit case等同於logistic regression,產生了linear decision boundary,明顯是underfitting。

如果不是只有一個hidden layer,會構成龐大的NN組織,這也就是deep learning的deep名稱的由來:


兩個hidden layers有更好的score (就這個dataset來說):



L2 Regularization Alpha

降低model complexity,MLP也可以使用L2 regularization(懲罰大的sum of squares of weights):



feature normalization也會有顯著影響!


重要參數




結論

NN適合用在input feature相似度高的情況,例如都是一張影像的pixel,preprocessing很重要,training過程需要的data / 時間 / 計算量都相當大,但是結果(deep learning)是不錯的。




Applied Machine Learning in Python 15 - Random Forest

Ensemble

這算是一種雞尾酒式的療法,結合不同ML方法的model產出一個混合式的model,random forest就是其中一種ensemble。一個decision tree容易受到overfitting的影響,但是多個random varied decision trees可以有更好的generalization。


Random Forest

下圖說明了random forest的概念:

第一步:bootstrapping samples
意思就是把X_train randomly分成幾分,每分有N個rows,可以允許重複(with replacement)。


第二步:random feature splitting node
跟建立單一decision tree不一樣的地方在於,每次split不找best split node,而是在一個random feature subset中找出一個best split node。這個過程保證所有forest中的tree一定是不同的。

這是由max_features參數控制,如果等於1,則相當於每次split都是隨機選擇一個feature,但由於tree要達到fit的目標,可能造成超長的tree且overffiting。如果max_features太大,甚至接近所有features的數目的話,那跟原本的decision tree splitting沒兩樣,會造成forest中的trees長得很類似。

第三步:prediction
可以weighted vote方式達成:


breast cancer dataset測試成果

使用max_features = 8的時候,達到了任何其他supervised learning methods(目前學過的)都達不到的好score:


最棒的優點是不需要做feature scaling等preprocessing,或是複雜的parameter tuning。
缺點是人類對這種隨機性的結構很難解讀,不容易知道為何某個預測會成功或是失敗,此外不適合用在spares feature vectors上(例如text classification)。

sklearn參數調整










2017年9月26日 星期二

Applied Machine Learning in Python 14 - Naiive Bayes Classifier

Guassian Naive Bayes Classification

之前筆記寫過:
https://fu-sheng-wang.blogspot.tw/search?q=bayes+classifier

優點就是非常快速的training和prediction過程,缺點就是generalization可能比其他方法差。
sklearn提供三種naive bayes classifiers,這邊會講到的是Gaussian Bayes classifier。

基本觀念就是把feature找出高斯分佈,然後比對input data feature看是比較可能從哪一個distribution產出的,當然這邊假設所有的feature都是gaussian distribution。

2d feature space會有3d的distribution(加上 train_y 在z軸),如果俯視圖投影到2d平面的話,下圖中有兩個guassian distributions,其交界處形成一個曲線的decision boundary:


所以也是一個linear model (decision boundary curve係數組成的function f(w) 都是一次項),也對linear model適用的對象適用,不過他問題在於假設每個feature都是conditionally independent,這在真實世界中並非如此,所以generalization的成效比較差。


2017年9月20日 星期三

Applied Machine Learning in Python 13 - 評估multiclass classifier

Confusion Matrix

multiclass confusion matrix如下:


這是數字辨識(所以有10個classes),辨識正確的instance數量都在對角線上。
這個圖適合用heat map來decorate,例如以下SVM RBF kernel:


可以看到每個數字都有不少比例被誤判成4,這讓我們可以猜測是否某些前處裡出錯囉。

永遠製作出confusion matrix來看你的classifier!


如何計算multiclass precision?

首先回憶precision定義 = 偵測出來的positive instance (分母TP+FP) 真正是positive (分子TP) 的占比有多少?
但是在binary classification才有所謂的positive和negative,多個classes怎麼算?

(1) macro-average precision
先算precision  within a class,然後再加總權重:


這三個classes的within-class precision如下:



(2) micro-average precision
這是直接把所有判斷正確者 / 所有instances,是一個一般人認知的概念。


不過這樣的話,某個class的instance佔多數的,會左右此precision。


所以當micro-average << macro-average,代表某個instance佔多數的class錯誤情況嚴重。
當macro-average << micro-average,則代表某個classh錯誤情況嚴重,這就要去查一下。



Applied Machine Learning in Python 12 - 評估binary classifier: ROC curves

Decision function return value

scikitlearn提供一個decision_function function來對已經learn好的model提出input sample的分數,提供classification thresholding參考,例如一個classifier透過decision_function對某個positive sample通常會有大的正值,對negative sample會有大的負值:


上圖中每個tuple是(true label, decision_function output)。

所以根據這個decision_function的output來調整classification threshold的話,會影響precision和recall,例如以下把threshold設定在-20:


或是把threshold設定在-10:


經過一些threshold的選擇,我們可以計算出每個precision/recall組合,並且可以plot成一個precision-recall curve:




ROC curve for binary classifier

另一個針對classifier的visualization graph稱為ROC curve:


當然最好的情況就是左上角這個點,此時FPR最小,TPR最大。
中間虛線部分就是random guess,此時猜中(TPR)和猜錯(FPR)機率均等,所以這可以看做是一個baseline,比較好的classifier的ROC curve應該要在baseline上方。

不過利用ROC curve 來判斷classifier好壞主要是看面積(AUC, area under curve),curve下方面積越大代表有較好的curve,這是顯而易見的。

2017年9月19日 星期二

RITx Project Management Life Cycle 4 - Project initiation

Initiation Phase

project被選擇過後,要怎麼起始一個project? 這就進入了第一階段: Initiation phase。



1. 首先要選出一個project manager
2. 這階段最終要產出一份project charter,這是一份大綱,包含以下概要:

  • 獲得當局正式授權
  • 商業目的與利益
  • 明確產出
  • 資源需求
  • milestones
  • 風險
  • 參與或受影響人員 (stakeholders)


Stakeholders analysis

stakeholders有兩種,一種是參與者,一種是受影響的人員。PM需要再project charter中明列這兩類人員的需求(requirements,也可以說是標準或是功能),以及他們的期望。

stakeholders是project成敗的關鍵。以下是一種分析的matrix:



出錢的或是有決定權的是老大(sponsors),另一個老大是終端使用的客戶customers,其餘人員積極參與與否也各自不同,所以每種類型的stakeholder都需要有特別的stakeholder interaction plan來應對,這詳細的細節會在planning phase列出。

其實主要還是人的問題,這邊重點應該是向上管理

這階段就要建立重要stakeholders (e.g. sponsors) 的regular communication!


Project Charter

以下是一個範例:

https://d37djvu3ytnwxt.cloudfront.net/assets/courseware/v1/cb92f10459a63e42599e8bf82eb2d265/asset-v1:RITx+PM9001x+2T2017+type@asset+block/Project_Charter_-_Friends_and_Family_Party.pdf








Applied Machine Learning in Python 11 - Binary Classification Evaluation

Accuracy is not enough

之前定義accuracy:


不過實務上光是這個指標是不夠的,因為通常會遇到imblanced classes,也就是對一個classification problem來說,多數data point是某一個class,少數data point屬於其他的class,所以處於非常不平均分布的狀況。

假設1000個data point中,只有一個data是positive class,其他全部是negative class,則一個永遠predict出negative 結果的Dummy classifier 會有99.9%的accuracy!!

所以accuracy是個prediction capability的好指標嗎? 看來不是絕對的,至少對imblanced classes problem來說

Dummy classifier並不真的去看data,而是採取某種heuristics (e.g. random / constant / ... ) 來決定prediction,這提供了一個比較的基礎,所謂的null metric或是baseline,任何estimator沒有比Dummy好的話,基本上就是沒用的。


Confusion Matrix

之前的筆記有介紹過了。

以下是binary classification的confusion matrix:


判斷指標


之前講過accuracy定義如下:


classification errors:



Recall / true positive rate (TPR) / sensitivity / probability of detection
recall的意義是偵測出來的positive instances佔所有positive instances的比例為何?

precision:
precision的意義是你偵測出來的positive instance真正是positive的占比有多少,也就是你對positive 的偵測的精準度有多高?

specificity / false positive rate (FPR):
意義是你把negative判斷成positive佔所有negative samples的比例。


Recall-Precision Tradeoffs



上圖中,decision boundary上方判斷為positive,下方判斷為negative。
precision ~= 0.68,也就是decision boundary上方為真正的positive samples只有68%。
recall ~= 0.87,也就是我們把所有positive samples中的87%都正確判斷為positive。


如果我們調整decision boundary如下:


則precision變成100%了,因為所有判斷成positive的samples 的確100%都是positive。
可是recall降低了 ~= 47%,只有47% positive samples被我們判斷成positive。


如果調整decision boundary變成以下:


可以看到所有positive samples都會被判斷成positive,所以recall = 100%,但是!!! false positive提高了,也就是precision降低成 36%。


recall必須要高的application發生在我們得盡量正確判斷出positive cases,例如醫學偵測。
precision必須要高的application發生使用者很在意false positive的application,例如recommendation / ranking / classification等,主要原因是user會記得小錯而放大這個觀感,而把絕大多數時候的正確當成理所當然。


F score for classifier evaluation


如果需要precision,則beta較小,e.g. 0.5。
如果需要recall,則beta較大,e.g. 2。

當beta為1的時候,是一個特殊的指標,稱為F1,通常用來檢驗classifier。


2017年9月18日 星期一

Applied Machine Learning in Python 9 - Lab: Supervised Classification

假設有以下dataset (有毒菇類):

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split


mush_df = pd.read_csv('mushrooms.csv')
mush_df2 = pd.get_dummies(mush_df)

X_mush = mush_df2.iloc[:,2:]
y_mush = mush_df2.iloc[:,1]

# use the variables X_train2, y_train2 for Question 5
X_train2, X_test2, y_train2, y_test2 = train_test_split(X_mush, y_mush, random_state=0)



使用decision tree classifier

我們利用decision tree classifier來train,並且找出此decision tree model最重要的五個features:

from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(random_state=0).fit(X_train2, y_train2)

# plot tree
from adspy_shared_utilities import plot_decision_tree
plot_decision_tree(clf, list(X_train2), np.asarray(['poison','non-poison']))
import matplotlib.pyplot as plt

可以看到以下是整個decision tree visualization,一個畫面塞不下:


找出最重要的五個features:

zipped = list(zip(list(X_train2), list(clf.feature_importances_)))
zipped.sort(key=lambda t: t[1], reverse=True)
result = [ x[0] for x in zipped[0:5]]

分別是以下:




使用SVM classifier

我們接著用svm classifier (RBF kernel)來對gamma參數做validaiton curve,看哪在什麼參數區間內的gamma能有最好的accuracy:

def validation_curve():
    from sklearn.svm import SVC
    from sklearn.model_selection import validation_curve

    # Your code here
    param_range = np.logspace(-4,1,6)
    train_scores, test_scores = validation_curve(SVC(kernel='rbf', C=1, random_state=0), X_subset, y_subset,
                                                 param_name='gamma',
                                                 param_range=param_range, cv=3,
                                                  scoring='accuracy')

    trains = np.mean(train_scores, axis=1)
    tests = np.mean(test_scores, axis=1)

    return trains,tests


檢視的gamma區間為0.0001 ~ 10,所以會有六個gamma值來檢視,每個gamma值會做3個fold validation,如果把每個gamma值的三次fold平均,結果如下:

test set:

training set:


可以看到training set gamma在第零個區間值 (i.e. 0.0001)有最糟的accuracy,所以是underfitting,而test set gamma在第五個區間值(e.g. 10) 有最糟的accuracy且training set gamma有最好的accuracy,所以是overfitting。比較好的選擇應該是gamma = 0.1。



2017年9月12日 星期二

Applied Machine Learning in Python 10 - Decision Trees

Informative split

decision tree就是在尋求最好的split方法,所謂最好意思就是在那個split node可以把某個class完全的分出來。


例如上途中,root node的split條件是花瓣長度 <= 2.35公分者,則True的path可以完全把setosa 這個class分離出來 (homogeneous),則這就是一個很好的split方法。


Pruning to overcome Overfitting problem

decision tree很容易overfitting,因為只要能有features把某個物體跟其他分開來的話,很可能一個物體最後就是一個leaf node ,這樣特徵就是很深的tree。

所以一個可能的方法就是避免tree長太深,稱為pruning。pruning有兩種,一個是一開始就限制tree的長度,另一個是完全長完之後,再prune,scikitlearn只implement了pre-pruning:




不過decision trees還是會傾向overfit,這是演算法使然。


Gradient-boosted Decision trees

這是一種ensemble方法,但是不採用randomness,而是藉由創造一系列的shallow trees (weak learners) ,後面的tree是改進前面tree而建立的(複雜度由learning rate 參數控制)。



這算是最好效果的supervised learning methods之一。
優缺點特性跟random forest一樣。



2017年9月8日 星期五

RITx Project Management Life Cycle 3 - Project Organization and Project Management Office

組織的架構對是否能夠成功推行一個project有決定性的影響。

傳統functional organization

這是以部門經理為主的組織架構,所有的resources都掌握在部門經理手中,甚至包括project manager也是部門經理的下屬,這是最常見的架構:



所有的resources都得從部門經理獲取,且這些resources必須也得support日常性的事務,並不能完全專注在某個project中。Project manager常得為了競爭這些資源焦頭爛額。

這種架構適合project scope以及resources侷限在某個部門內,不需要大量的跨部門資源時,架構簡單,權責分明是好處。

壞處是project manager基本上是執行者,並沒有辦法掌控走向 預算 資源等等。

Pure project organization

這是光譜的另一個極端,純粹的暫時性team,以project manager為領導,集合各個functional member組成fully dedicate project team:



project manager掌控了所有的資源包括預算,走向,人事。這適合長期發展某個project的狀況,壞處是這些resources是完全occupied,不被其他project或是daily operation打擾。

此外當project 結束之後,這些人員也將解散,這造成一些資源放置的問題。


Matrix organization

上面兩者是光譜的兩極端,那這個就是中間值,混合式,雙頭馬車制,這樣有比較好嗎? XD



好處就是較為focus但有彈性的resources。


以上三種情況我都見過,比較特殊的Pure project organization也嘗試過,不過是個失敗的經驗。

Project Management Office

這其實就是一個PM部門啦,在我待過的公司來說是這樣,不過看來國外之前這樣部門並非常態就是。

不過我待過有PM部門的公司,其實就變成另一個function team而已,並沒有PMO理想性的目標,例如怎麼促進project success,怎麼建立best practices,如何建立SOP for projects。

可惜。
主要也是因為以前PM只是RD的轉職去處而已,並沒有把它看作是一個真正的技能。