利用Amazon Machine Learning與Amazon Redshift建立二進位分類模型,amazonredshift

來源:互聯網
上載者:User

利用Amazon Machine Learning與Amazon Redshift建立二進位分類模型,amazonredshift

日常生活中的大部分決策都以二進位形式存在,具體來說就是這類問題能夠以是或者否來回答。而在商務工作中,能夠以二進位方式回答的問題也有很多。舉例來說:“這種情況是否屬於交易欺詐?”,“這位客戶是否會購買該產品?”或者“這位使用者是否存在流失風險?”等等。在機器學習機制中,我們將此稱為二進位分類問題。很多商業決策都能夠通過準確預測二進位問題的答案來得到強化。Amazon Michine Learning(簡稱Amazon ML)就提供了一套簡單而且成本低廉的選項,協助大家以快速且規模化的方式找出此類問題的答案。

在今天的文章中,我們將以Kaggle.com網站提供的執行個體作為起始。這一次,大家可以接觸到網路廣告行業當中經常涉及的點擊率預測案例。在樣本當中,大家將預測特定使用者點擊特定廣告的實際可能性。

準備用於構建機器學習模型的資料

直接從Kaggle網站擷取資料來構建這套模型當然也是可行的,不過為了強化其現實意義,我們這一次將利用Amazon Redshift作為資料中介。在多數情況下,建立機器學習模型所需要的曆史事件數目據已經被儲存在了資料倉儲當中。Amazon ML與Amazon Redshift這套強有力的組合能夠協助大家查詢相關事件資料並執行匯聚、加入或者處理等操作,從而為機器學習模型準備好所需的一切資料。我們在後文中將給出與此相關的部分樣本。

要順利完成本次指導教程,大家需要擁有一個AWS賬戶、一個Kaggle賬戶(用於下載資料集)、Amazon Redshift叢集以及SQL用戶端。如果大家還沒有建立過Amazon Redshift叢集也完全不必擔心,現在可以申請到為期兩個月的dw2.large單節點叢集免費試用期,這足以支援大家完成本次學習。

建立一套Amazon Reshift叢集

在AWS管理主控台的Supported Regions(支援地區)列表當中選定US East(美國東部,即北弗吉尼亞州地區),而後在Database部分選擇Amazon Redshift。最後選擇Launch Cluster(啟動叢集)。

在接下來的Cluster Details(叢集詳細資料)頁面當中,對該叢集及資料庫進行命名(可分別為ml-demo與dev),而後輸入主使用者名稱及密碼。


在Node Configuration(節點配置)頁面當中,對該叢集的布局進行定義。針對本次樣本所涉及的資料量,大家只需要單一dc1.large節點即可(並接入至Amazon Redshift免費層級)。


選擇Continue,在接下來的頁面中審查設定並選擇Launch Cluster(啟動叢集)。幾分鐘之後,該叢集即可正式供大家使用。這時,選定該叢集名稱並查看其配置資訊。


在這裡,大家需要注意其中的Endpoint值,要確保其能夠接入該叢集並使用下載自Kaggle網站的資料。

下載並儲存資料

點擊此處從Kaggle網站上下載培訓檔案,而後將其上傳至AmazonSimple Storage Service(即Amazon簡單儲存服務,簡稱Amazon S3)。由於檔案較大,我們需要利用AWS命令列將其進行拆分上傳。

# Download the train data from:http://www.kaggle.com/c/avazu-ctr-prediction/download/train.csv.gz# upload the file to S3aws s3 cp train.csv.gz s3:///click_thru/input/
大家可以利用多種SQL用戶端與該叢集實現對接,例如SQL-Workbench或者Aginity Workbench,當然我們也可以在基於Linux的EC2執行個體中利用終端內的psql命令實現接入。

ssh -i .pem ec2-user@ec2-.eu-west-1.compute.amazonaws.compsql -h ml-demo..us-east-1.redshift.amazonaws.com -U  -d dev -p 5439psql -h ml-demo.<CLUSTER_ID>.us-east-1.redshift.amazonaws.com -U <USER_NAME> -d dev -p 5439
在我們的SQL用戶端內建立一個表,用於儲存所有來自Kaggle網站的事件數目據。請確保每一列都使用了正確的資料類型。

CREATE TABLE click_train (  id varchar(25) not null,  click boolean,  -- the format is YYMMDDHH but defined it as string  hour char(8),  C1 varchar(20),  banner_pos smallint,  site_id varchar(10),  site_domain varchar(10),  site_category varchar(10),  app_id varchar(10),  app_domain varchar(10),  app_category varchar(10),  device_id varchar(10),  device_ip varchar(10),  device_model varchar(10),  device_type integer,  device_conn_type integer,  C14 integer,  C15 integer,  C16 integer,  C17 integer,  C18 integer,  C19 integer,  C20 integer,  C21 integer);
在SQL用戶端內,使用COPY命令將各事件複製到叢集當中:

COPY click_train FROM 's3:///input/click_thru/train.csv.gz'credentials 'aws_access_key_id=;aws_secret_access_key=' GZIPDELIMITER ','IGNOREHEADER 1;

如果一切工作已準備就緒,大家應該會在使用以下SELECT查詢命令後看到現有記錄數量已經超過4000萬條:

dev=# SELECT count(*) FROM click_train;  count---------- 40428967(1 row)

利用來自Amazon Redshift的資料構建一套機器學習模型

在之前的文章當中,我們曾經探討過如何利用來自S3的資料檔案構建機器學習模型。事實上,此類資料也可以由來自資料庫並轉儲於SQL內的檔案提供。由於SQL轉儲操作非常常見,因此Amazon ML直接將兩類高人氣資料庫源整合在了一起,也就是Amazon RelationalDatabase Service(即Amazon關聯式資料庫服務,簡稱Amazon RDS)以及Amazon Redshift。在整合之後,我們能夠加快資料擷取過程,從而更輕鬆地直接利用“即時”資料改進機器學習模型。

要利用來自Amazon Redshift的資料構建機器學習模型,我們首先需要允許Amazon ML接入到Amazon Redshift當中。具體操作為運行UNLOAD命令對Amazon S3進行相關查詢,而後開始培訓流程的下一個階段。

在IAM控制台當中建立一個名為AML-Redshift的新角色,而後選擇Continue。

在Select Role Type(即選擇角色類型)頁面當中,為Amazon Machine Learning Role for Redshift Data Source選擇預設角色類型。


而Attach Policy(即附加策略)頁面當中,從列表中選定一種策略而後點擊Continue。


最後,審查新角色的設定資訊,複製其中的Role ARN值以備下一步使用,接著選擇Create。


在Amazon Machine Learning控制台當中,選擇Create new… Datasource and ML model(即建立新的……資料來源與機器學習模型)。


在Data Input(資料輸入)頁面當中,選擇Redshift並填寫相關資訊,具體包括剛剛建立角色的ARN值、叢集名稱、資料庫名稱、使用者名稱以及密碼內容。大家還需要指定所要使用的SELECT查詢(後文將具體說明)、S3儲存桶名稱以及作為暫存位置的檔案夾。


在SQL查詢當中,大家需要將二進位目標“點擊”作為一個整數值(0或者1),而非false或者true,從而將其轉換為int。我們還建議大家利用ORDER BY RANDOM()對記錄進行混排,從而避免資料內容的次序影響。

SELECT id,-- target field as 0/1 instead of f/t click::int, hour,       c1,            banner_pos,    site_id,       site_domain,       site_category,     app_id,            app_domain,        app_category,      device_id,         device_ip,         device_model,      device_type,       device_conn_type,  c14, c15, c16, c17, c18, c19, c20, c21 FROM click_train -- Shuffle the records ORDER BY RANDOM();

在Amazon ML嚮導中的Schema頁面內,大家可以看到Amazon已經自動從資料內識別出了其模式定義。在這一階段,我們最好審查各項屬性的建議值,同時將用於顯示類別ID的數字值變更為“Categorical”。


在Target頁面當中,選中“click”項作為目標。


遵循嚮導繼續下一步,定義行ID(id欄位)。當進行到Review頁面時,選定預設設定以建立這套機器學習模型。在預設情況下,Amazon ML會對資料進行拆分,其中70%被作為模型訓練內容、另外30%則被用於模型評估。


由於存在大量記錄需要處理,因此建立資料來源、ML模型以及評估的過程可能需要一段時間。大家可以在Amazon ML儀表板當中監控其處理進度。


在儀表板當中,大家可以看到我們之前建立的未經處理資料源已經處於“In progress”即“進行中”狀態。該資料來源中的70%內容會被作為訓練素材,而另外30%則用於模型評估。ML模型建立與評估的目前狀態則為“Pending”,即待處理,也就是等待資料來源建立工作完成。在整個流程結束後,檢查模型評估結果。

評估機器學習模型的準確度

在之前的文章當中,我們曾經探討過Amazon ML如何通過預測精度指標(單一數字)與圖形來報告對應模型的精確程度。

在這一次的二進位分類樣本中,預測精度指標被稱為AUC(即Area-Under-the-Curve,曲線下面積)。大家可以點擊此處查看Amazon ML說明文檔,從而瞭解這一臨界分值的具體含義。在本次樣本中,我們這套方案的得分為0.74:


要進一步瞭解其含義,大家可以點擊此處查看Amazon提供的評估結果可視化說明。直接選擇總體臨界值數字顯然更便於大家理解。每條記錄的預測臨界值都是一個介於0到1之間的數字值。越是接近1,就代表其越可能得到“是”的答案,而相反則代表其更可能得到“否”的答案。結合這一總體臨界值數字,對應記錄的評估結果可能分為以下四種類別:

·   真陽性(簡稱TP) – 被正確分類為“是”

·   真陰性(簡稱TN) – 被正確分類為“否”

·   假陽性(簡稱FP) – 被錯誤分類為“是”

·   假陰性(簡稱FN) – 被錯誤分類為“否”


如果大家所獲得的整體臨界值越接近於1,那就代表著被錯誤分類為“否”的記錄越少,但與此同時被錯誤分類為“是”的記錄可能也就越多。這時候,我們就需要利用該臨界值作出商業決策了。如果每一項被錯誤分類為“是”的記錄會產生1美元的成本(假設顯示一條廣告需要花費1美元),那麼顯然應該調高該值以避免成本高企。然而如果每條被錯誤分類為“否”的記錄會讓我們錯失一筆大訂單(例如金額達1000美元的豪車購買傭金),那麼調高該值顯然更加明智。

大家可以如所示向左或向右移動滑塊來調整這一臨界值。向左側滑動意味著降低該值,這會降低被錯誤判斷為“是”的情況的出現機率,但同時也會造成更多被錯誤判斷為“否”的情況。向右側滑動以增加該臨界值則會導致相反的結果。大家也可以圖形下方Advance metrics(進階指標)內的四個滑塊對臨界值進行全方位控制。不過正所謂“天下沒有免費的午餐”,修改其中一項的數值,也會導致其它三項數值出現變化。

·   準確度(Accuracy) –這一指標反映了所有分類預測結果的整體準確比例。提高準確度意味著在兩類錯誤之間尋找平衡點。

·   假陰性比率(FalsePositive Rate) –在全部陰性結果當中,實際為陰性但被錯誤分類為陽性情況的出現比率。

·   精度(Precision) –全部陽性預測結果當中被正確分類為陽性情況的比率。我們通常利用它來避免預測結果為“是”的記錄過多的情況(這可能會造成資金浪費或者讓使用者對頻繁的無關彈窗心生反感)。換句話來說,精度的作用在于衡量大家在決定向某人發送宣傳內容時的精確程度,或者當前市場營銷預算的花費方式是否合理。感興趣的朋友可以點擊此處查看維基百科當中針對精度與召回提供的說明資訊及圖片(例如)。


·    召回(Recall) –全部陽性記錄當中被正確分別為陽性情況的比率。我們通常利用它來避免預測結果為“否”的記錄過多的情況(這可能會導致企業錯失銷售機會)。換句話來說,它代表著我們能夠通過廣告宣傳實際召回多少可能對內容感興趣的對象。在以上樣本中召回數值為0.06,這意味著只有6%的使用者屬於我們預期當中的宣傳受眾(因為他們會實際點擊廣告內容)。

舉例來說,如果我們將召回值設定為0.5,則相當於希望確保看到每條廣告的人群當中至少有50%屬於既定宣傳受眾。在這種情況下,結果會如何呢?


如大家所見,準確度的下降趨勢並不明顯(則0.83下降到了0.74),但精度則出現了大幅跳水(由0.6遞減至0.33),這意味著現在每三位廣告接收者中只有一位會實際點擊查看——而在原本的設定中,每三位廣告接收者中將有兩位實際點擊查看。這些變更完全來源於臨界值的具體調整,而不會影響或者改進模型本身。

大家可以建立更多來自Amazon Redshift的新資料來源來改進機器學習模型,例如在資料內包含更多其它相關資訊,包括基於客戶工作日及時間安排的IP地址變化(這部分資訊在Kaggle資料集中並不存在,但在實際生活中往往不難擷取),或者每天早、中、晚時段使用者的IP地址輪替。下面我們再來看幾段樣本SELECT查詢,瞭解如何通過修改最大程度利用來自Amazon Redshift資料來源的資料:

SELECT    id,    click::int,    -- Calculating the date of the week from the Hour string    date_part(dow, TO_DATE (hour, 'YYMMDDHH')) as dow,    -- Creating bins of the hours of the day based on common behaviour    case        when RIGHT(Hour,2) >= '00' and RIGHT (Hour,2) <= '05' then 'Night'        when RIGHT(Hour,2) >= '06' and RIGHT (Hour,2) <= '11' then 'Morning'        when RIGHT(Hour,2) >= '12' and RIGHT (Hour,2) <= '17' then 'Afternoon'        when RIGHT(Hour,2) >= '18' and RIGHT (Hour,2) <= '23' then 'Evening'        else 'Unknown'    end        as day_period...

要將包含有使用者其它類型資訊的資料引入這一點擊率分析模型,例如性別或者年齡,大家可以對來自Amazon Redshift資料倉儲內其它表的資料使用JOIN語句。

總結

在今天的文章中,大家瞭解了何時以及如何使用由Amazon ML提供的二進位分類機器學習模型。此外,我們也探討了如何利用Amazon Redshift作為訓練資料的資料來源、如何選定資料、將目標資料類型轉化為int以觸發二進位分類、以及如何利用RANDOM函數對資料內容進行混排。

與此同時,大家也接觸到了實現二進位分類模型評分所需要的各項指標,包括準確度、精度以及召回等。這些知識將協助大家順利構建、評估並修改自己的二進位分類模型,從而切實解決商業運營中的具體問題。

如果大家還有其它問題或者建議,請在評論欄中暢所欲言。

原文連結:

https://blogs.aws.amazon.com/bigdata/post/TxGVITXN9DT5V6/Building-a-Binary-Classification-Model-with-Amazon-Machine-Learning-and-Amazon-R

核子可樂譯



相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.