你相亲成功的几率有多高?机器学习硬核预测
一 序
人工智能(AI)是一個自從計算機被發明開始就存在的一個技術領域。從1956年Marvin Minsky、John McCarthy等人在達特茅斯學院的會議中第一次提出人工智能這個概念開始,AI這個領域的概念、技術和研究經歷了非常長足的發展。
其中,機器學習是人工智能領域當中最核心也是最廣泛應用的一個子領域,旨在通過一系列數學的方法,如統計、概率論、線性代數等方法,設計和分析讓計算機可以自動學習的算法。這些算法通過從大量數據中獲取規律,來對未知的的數據進行預測和決策。
機器學習的算法被廣泛地用到計算機視覺、語音、自然語言處理、數據挖掘、搜索、廣告、游戲、機器人、金融等各種行業。
隨著深度學習的興起,產業界對于機器學習產生了非常強烈的興趣,也使得機器學習領域開始迅速地走向工程化和系統化。
除了機器學習算法本身的不斷創新之外,數據和算力的增加也是不可忽視的:大量的數據,特別是移動互聯網的興起,使機器學習算法得以打破傳統數據量的限制;由于GPGPU等高性能處理器開始提供大量的算力,又使得我們能夠在可控的時間內(以天為單位甚至更短)進行exaflop級別的算法訓練。
在這些的綜合作用下,工業界開始浮現出大量的機器學習系統創新。以2011年Google Brain,即谷歌大腦為代表,機器學習開始迅速從實驗室轉向業界。
毫無疑問,深度學習(DeepLearning)是當下最熱門的人工智能技術,在智能推薦、圖像識別、機器翻譯、計算廣告、自動駕駛等領域都有突破性的進展和應用。而深度學習的成功很大部分得益于新的計算框架和異構計算硬件,譬如Tensorflow和NVIDIA GPU。
然而,對于算法工程師來說,要搭建這樣一套學習和工作的環境不是一件容易的事情:需要一個特定版本的操作系統(最好是Linux),一張或多張GPU卡,安裝GPU驅動,安裝深度學習計算框架和其依賴的軟件包等。在調試深度學習算法的過程中,如果說嘗試不同的驅動版本和切換各種版本的軟件庫還勉強可以接受,那么切換硬件環境,特別是更換GPU卡就傷筋動骨了。
那么,有沒有能夠一勞永逸解決這些苦惱的方式?阿里云機器學習平臺PAI出品的一款云端深度學習開發環境:DSW(Data Science Workshop)試圖告訴你,這是個肯定的答案。
二 云端IDE:阿里巴巴機器學習與PAI-DSW
經過20年的快速發展,阿里巴巴已經組建了一個龐大的商業生態圈,并在支付、云計算、本地生活服務等行業保持互聯網巨頭地位。其中電商年交易額達到5.7萬億元、占據中國網購市場超6成份額,阿里云支撐了2019年雙11 期間峰值 54.4 萬筆/秒、單日數據處理量達到 970PB 的世界級的流量洪峰,成為業界第一個實現此壯舉的云計算公司。
阿里云機器學習平臺正是伴隨著這樣龐大而復雜的阿里經濟體業務需求成長起來的。下面我們將帶著大家掀開阿里云機器學習技術大圖的一角,看看阿里云機器學習,特別是機器學習工程上的發展、沉淀和創新。
阿里機器學習技術大圖
我們從用戶和技術的兩個角度來梳理機器學習的技術體系大圖。從用戶的角度來說,根據使用機器學習的深度不同,在云棲大會上,我們展示了飛天AI平臺的技術分層關系:
從技術的角度說,機器學習從算法到底層的硬件,都涉及到不同的技術方向。下面是我們對于核心技術能力上的一個總體描述:
每個技術方向上都形成各自的布局和沉淀,接下來我們會重點講述作為機器學習重要組成部分的工程能力體系建設。
機器學習工程能力體系
阿里云在機器學習工程體系建設上,也經歷了各領域業務需求驅動和技術驅動分階段螺旋式遞進上升的過程。由最初的通過傳統機器學習算法進行數據價值的粗加工,到今天以深度學習為主、支撐各類“行業大腦”解決方案的人工智能工程體系。
阿里云的機器學習工程能力體系建設始終圍繞著更高效的融合人工智能三要素(算法、數據、算力)進行展開,即追求不斷提升整個工程體系中的計算效率、數據效率以及工程效率,從而能夠更好的支撐阿里經濟體各方面業務快速發展的需求,并通過阿里云對外進行技術輸出,推動人工智能領域的技術變革,產生更大的社會效益,實現普惠人工智能。
經過多年的發展創新,阿里云在AI托管平臺技術層進行了系統性的建設,極大提升了算法研發、共享、部署、輸出的效率,在此基礎上沉淀出多個具有用戶粘性和場景差異化的開發平臺,這里我們選取阿里云機器學習PAI(Platform of Artificial Intelligence)作為代表來著重來介紹。
PAI是一款覆蓋機器學習全流程的一站式機器學習平臺產品,集數據預處理、特征工程、自動調參、模型訓練、在線預測為一體,為用戶提供低門檻、高性能的云端機器學習服務。
PAI相關技術脫胎于阿里集團內數十個BU的上千個業務體系,沉淀了大量的覆蓋各個領域的優質分布式算法、框架、平臺等,同時也在不斷完善和擴充機器學習生態。
阿里云機器學習PAI-DSW
作為在AI戰線上辛勤耕耘的算法工作者,你是否也常常遇到下面的情形:
- 算法需要運行在GPU上,可是長時間申請不到GPU機器,只能干著急。
- 終于GPU機器申請到了,安裝GPU驅動和各種依賴,感覺是在浪費時間。
- 好不容易環境弄好了,當某天更新算法代碼后變得很慢, 排查半天才發現是GPU驅動需要升級補丁,很是無奈。
- 生產環境機器網絡隔離,在線上要debug代碼,只能使用GDB在命令行進行,開發效率大大降低。
- 在本地采用PyCharm這樣的IDE開發好代碼,而數據在生產環境,不允許下載,只能把代碼拷貝到線上機器運行,發現問題時,又得回到本地修改調試后再來一遍,非常不便。
- PAI Studio采用圖形化拖拽式,像搭積木一樣分分鐘就構建一個完整的工作流,很炫酷。但想要定制發布自己的組件時,卻不知從何下手。
在長期與算法工程師同學溝通合作的過程中,我們發現了算法工程師面臨的這些問題。提升機器學習工程效率,降低人工智能使用門檻,急需一個簡單、輕量、好用的工具平臺,從而讓算法工程師更加專注于模型設計本身。PAI DSW就是PAI團隊為解決算法工程師的以上痛點,新推出的一款云端機器學習開發IDE。
PAI-DSW集成了Jupyterlab、WebIDE等多種開源項目,在阿里巴巴集團內上百個BU和上千名工程師的打磨之下性能和功能上都進行了一定的調優。數據上打通了ODPS等多個數據源,方便用戶在構建模型的時候免去重新構建數據管道的工作。
同時,在深度學習上,PAI-DSW內置了Tensorboard,可以通過簡單的拖拽的方式來幫助深度學習的開發者更好的完成深度學習場景下神經網絡的建模。下圖展示了DSW在機器學習平臺PAI產品架構中的位置:
簡單來說,PAI-DSW可以實現多實例、多環境,GPU/CPU資源、JupyterLab、WebIDE以及全屏使用Terminal無干擾工作。目前PAI-DSW已經向所有阿里云的用戶免費開放了探索者版,只需要登陸阿里云然后打開 https://dsw-dev.data.aliyun.com/#/ 即可開始云上數據科學之旅。接下來將詳細介紹如何使用PAI-DSW這一簡單好用的工具。
三 新手上路:PAI-DSW實驗室創建攻略
Step 1 : 創建并打開你的DSW實驗室
前往 https://dsw-dev.data.aliyun.com/#/ 即可創建并進入你的實驗室。之前需要確保已經登陸了阿里云賬號和天池賬號。進入之后等待幾秒后我們會看到如下頁面:
左側是DSW實驗室的文件區,雙擊文件夾即可進入。中間是工作區,右側是計算資源區域,點擊右邊計算資源區的箭頭,即可彈出資源詳情,如下圖所示:
這里我們也可以點擊切換按鈕選擇我們需要的資源進行切換。
在文件資源管理區的頂部還有4個按鈕,從左到右分別對應的是:打開DSW Launcher啟動器,新建文件夾,上傳文件以及刷新當前文件夾。
在文件夾左側還有一欄Tab,每個圖標從上到下分別代表了:文件資源管理器,案例代碼,正在運行的Notebook,命令面板,在工作區打開的Tab,以及天池的數據搜索引擎。
然后我們回到DSW Launcher啟動器,也就是工作區默認打開的界面,然后點擊Notebook區域中的Python3,如下圖所示:
Step 2 : 創建一個Notebook
點擊了Python3圖標后,DSW會自動創建一個ipynb notebook文件。如下圖所示:
Step 3 :寫下你的第一行代碼并運行
用鼠標點擊第一個框框(我們下面以Cell稱呼),我們就可以開始從只讀模式進入編輯模式開始寫代碼了。
這里我們可以先輸入一個簡單的:
print("歡迎來到DSW👏👏👏 你可以把這里當作一個自由自在的實驗室😝,做各種你想嘗試的數據實驗 ")然后我們同時按下 shift+ enter回車這兩個鍵,就可以看到我們的執行結果了,如下圖所示:
圖中標紅的數字1表示這個Cell是第一個被執行的,藍色區域則表示當前聚焦(Focus)的Cell。我們可以在Focus的Cell按下 Enter回車鍵進入編輯模式。我們也可以按下 Esc鍵來退出編輯模式回到只讀模式。在只讀模式中,我們可以通過方向鍵上下來切換Focus的Cell。
Step 4 : 計算一個斐波那契數列
很好,現在你已經熟悉了DSW最基本的運行Cell的方式,接下來就讓我們編寫一個簡單的斐波那契數列計算的函數來計算這個數列的第10項。把下方的代碼拷貝到新生成的Cell中即可:
# 計算第 N 個斐波那契數列 的函數 def Fibonacci(n): if n<0: print("異常輸入,請確認輸入一個正整數") # 第一個斐波那契數是 0 elif n==1: return 0# 第二個斐波那契數是 1 elif n==2: return 1else: return Fibonacci(n-1)+Fibonacci(n-2) # 計算第10個斐波那契數并打印出來 print('第10個斐波那契數是:',Fibonacci(10))同樣,輸入代碼后,我們按下 shift+ enter回車 這兩個鍵,就可以看到我們的執行結果了,如下圖所示:
這樣,你就掌握了DSW最基本的創建Notebook,便攜代碼和運行代碼的方式。
四 快速進階:PAI-DSW案例實戰指南
本著理論與實踐相結合的方針,本部分將手把手教你從實戰場景參與進來,實現從入門到快速進階。
案例:大數據算命系列之用機器學習評估你的相親戰斗力
"用姓名測試愛情,80%準確率!俗話說,名如其人,緣分就是人生的后半生,為了尋找真緣分的大有人在,因此也就有了姓名緣分測試。您現在是不是也正在心動猶豫,也想要一個屬于自己的名字配對緣分測試了呢?那就請您趕緊行動吧!" 以上這段話,你一定已經在很多個微信公眾號、電視節目,甚至奇奇怪怪的小網站上看到過。
你一定很好奇,這個緣分測試背后到底是不是有科學依據支撐的。
今天,雖然不能直接幫你測試你和某個特定的人直接的緣分,但是我們可以借助哥倫比亞大學多年研究相親找對象的心血,通過幾個簡單的特征來評估你的相親戰斗力指數。
具體模型的測試頁面在這里[1]。在正式開始實驗之前,我們需要尋找一個簡單好用方便上手的工具,這里推薦阿里云的DSW探索者版[2],它對于個人開發者是免費的,同時還有免費的GPU資源可以使用,同時實驗的數據還會免費保存30天,不需要購買,只要登陸就可以使用。今天我們就會通過這個工具來探索人性的奧秘,走進兩性關系的神秘空間嘿嘿嘿。
整個實驗的數據收集于一個線下快速相親的實驗[3]。在這個實驗中,參與者被要求參加多輪與異性進行的快速相親,每輪相親持續4分鐘,在4分鐘結束后,參與者雙方會被詢問是否愿意與他們的對象再見面。只有當雙方都回答了“是”的時候,這次相親才算是配對成功。
同時,參與者也會被要求通過以量化的方式從外觀吸引力,真誠度,智商,風趣程度,事業心,興趣愛好這六個方向來評估他們的相親對象。
這個數據集同時也包含了很多參加快速相親的參與者的其他相關信息,比如地理位置,喜好,對于理想對象的偏好,收入水平,職業以及教育背景等等。關于整個數據集的具體特征描述可以參考相關文件[4]。
本次我們實驗的目的主要是為了找出,當一個人在參加快速相親時,到底會有多高的幾率能夠遇到自己心動的人并成功牽手。
在我們建模分析探索人性的秘密之前,讓我們先讀入數據,來看看我們的數據集長什么樣。
import pandas as pd df = pd.read_csv('Speed Dating Data.csv', encoding='gbk') print(df.shape)通過觀察,我們不難發現,在這短短的兩年中,這個實驗的小酒館經歷了8000多場快速相親的實驗。由此我們可以非常輕易的推斷出,小酒館的老板應該賺的盆滿缽滿(大霧)。
然后從數據的寬度來看,我們會發現一共有接近200個特征。關于每個特征的具體描述大家可以參考這篇文檔[5]。然后我們再觀察數據的完整度,看看是否有缺失數據。
percent_missing = df.isnull().sum() * 100 / len(df) missing_value_df = pd.DataFrame({'column_name': df.columns,'percent_missing': percent_missing }) missing_value_df.sort_values(by='percent_missing')通過以上代碼,我們不難發現,其實還有很多的特征是缺失的。這一點在我們后面做分析和建模的時候,都需要關注到。因為一旦一個特征缺失的數據較多,就會導致分析誤差變大或者模型過擬合/精度下降??赐陻祿耐暾潭?#xff0c;我們就可以繼續往下探索了。
然后第一個問題就來了,在這8000多場的快速相親中,到底有多少場相親成功為參加的雙方找到了合適的伴侶的?帶著這個問題,我們就可以開始我們的第一個探索性數據分析。
# 多少人通過Speed Dating找到了對象 plt.subplots(figsize=(3,3), dpi=110,) # 構造數據 size_of_groups=df.match.value_counts().valuessingle_percentage = round(size_of_groups[0]/sum(size_of_groups) * 100,2) matched_percentage = round(size_of_groups[1]/sum(size_of_groups)* 100,2) names = ['Single:' + str(single_percentage) + '%','Matched' + str(matched_percentage) + '%']# 創建餅圖 plt.pie(size_of_groups, labels=names, labeldistance=1.2, colors=Pastel1_3.hex_colors ) plt.show()從上邊的餅圖我們可以發現,真正通過快速相親找到對象的比率僅有16.47%。
然后我們就迎來了我們的第二個問題,這個比率和參加的人的性別是否有關呢?這里我們也通過Pandas自帶的filter的方式:
df[df.gender == 0]來篩選數據集中的性別。通過閱讀數據集的文檔,我們知道0代表的是女生,1代表的是男生。然后同理,我們執行類似的代碼:
# 多少女生通過Speed Dating找到了對象 plt.subplots(figsize=(3,3), dpi=110,) # 構造數據 size_of_groups=df[df.gender == 0].match.value_counts().values # 男生只需要吧0替換成1即可single_percentage = round(size_of_groups[0]/sum(size_of_groups) * 100,2) matched_percentage = round(size_of_groups[1]/sum(size_of_groups)* 100,2) names = ['Single:' + str(single_percentage) + '%','Matched' + str(matched_percentage) + '%']# 創建餅圖 plt.pie(size_of_groups, labels=names, labeldistance=1.2, colors=Pastel1_3.hex_colors ) plt.show()來找出女生和男生分別在快速相親中找到對象的幾率的。
女生的幾率:
男生的幾率:
不難發現,在快速相親中,女生相比于男生還是稍微占據一些優勢的。女生成功匹配的幾率比男生成功匹配的幾率超出了0.04。
然后第二個問題來了:是什么樣的人在參加快速相親這樣的活動呢?真的都是大齡青年(年齡大于30)嘛?這個時候我們就可以通過對參加人群的年齡分布來做一個統計分析。
# 年齡分布 age = df[np.isfinite(df['age'])]['age'] plt.hist(age,bins=35) plt.xlabel('Age') plt.ylabel('Frequency')不難發現,參加快速相親的人群主要是22~28歲的群體。這點與我們的預期有些不太符合,因為主流人群并不是大齡青年。接下來的問題就是,年齡是否會影響相親的成功率呢?和性別相比,哪個對于成功率的影響更大?這兩個問題在本文就先埋下一個伏筆,不一一探索了,希望閱讀文章的你能夠自己探索。
但是這里可以給出一個非常好用的探索相關性的方式叫做數據相關性分析。通過閱讀數據集的描述,我已經為大家選擇好了一些合適的特征去進行相關性分析。這里合適的定義是指:1)數據為數字類型,而不是字符串等無法量化的值;2)數據的缺失比率較低。
date_df = df[['iid', 'gender', 'pid', 'match', 'int_corr', 'samerace', 'age_o','race_o', 'pf_o_att', 'pf_o_sin', 'pf_o_int', 'pf_o_fun', 'pf_o_amb','pf_o_sha', 'dec_o', 'attr_o', 'sinc_o', 'intel_o', 'fun_o', 'like_o','prob_o', 'met_o', 'age', 'race', 'imprace', 'imprelig', 'goal', 'date','go_out', 'career_c', 'sports', 'tvsports', 'exercise', 'dining','museums', 'art', 'hiking', 'gaming', 'clubbing', 'reading', 'tv','theater', 'movies', 'concerts', 'music', 'shopping', 'yoga', 'attr1_1','sinc1_1', 'intel1_1', 'fun1_1', 'amb1_1', 'attr3_1', 'sinc3_1','fun3_1', 'intel3_1', 'dec', 'attr', 'sinc', 'intel', 'fun', 'like','prob', 'met' ]]# heatmap plt.subplots(figsize=(20,15)) ax = plt.axes() ax.set_title("Correlation Heatmap") corr = date_df.corr() sns.heatmap(corr, xticklabels=corr.columns.values,yticklabels=corr.columns.values)通過上面這張圖這張相關性分析的熱力圖,我們可以先關注一些特別亮的和特別暗的點。比如我們可以發現,在pf_o_att這個表示相親對象給出的外觀吸引力這個特征上,和其他相親對象給出的評分基本都是嚴重負相關的,除了pf_o_fun這一特征。由此我們可以推斷出兩個點:
- 大家會認為外觀更加吸引人的人在智商,事業心,真誠度上表現會相對較差。換句話說,可能就是顏值越高越浪。
- 幽默風趣的人更容易讓人覺得外觀上有吸引力,比如下面這位幽默風趣的男士(大霧):
然后我們再看看我們最關注的特征 match,和這一個特征相關性比較高的特征是哪幾個呢?不難發現,其實就是:
'attr_o','sinc_o','intel_o','fun_o','amb_o','shar_o'這幾個特征,分別是相親對方給出的關于外觀,真誠度,智商,風趣程度,事業線以及興趣愛好的打分。接下來我們就可以根據這個來進行建模了。首先我們將我們的特征和結果列都放到一個Dataframe中,然后再去除含有空值的紀錄。最后我們再分為X和Y用來做訓練。當然分為X,y之后,由于我們在最開始就發現只有16.47%的參與場次中成功匹配了,所以我們的數據有嚴重的不均衡,這里我們可以用SVMSMOTE[6]來增加一下我們的數據量避免模型出現過度擬合。
# preparing the data clean_df = df[['attr_o','sinc_o','intel_o','fun_o','amb_o','shar_o','match']] clean_df.dropna(inplace=True) X=clean_df[['attr_o','sinc_o','intel_o','fun_o','amb_o','shar_o',]] y=clean_df['match']oversample = imblearn.over_sampling.SVMSMOTE() X, y = oversample.fit_resample(X, y)# 做訓練集和測試集分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0, stratify=y)數據準備好之后,我們就可以進行模型的構建和訓練了。通過以下代碼,我們可以構建一個簡單的邏輯回歸的模型,并在測試集上來測試。
# logistic regression classification model model = LogisticRegression(C=1, random_state=0) lrc = model.fit(X_train, y_train) predict_train_lrc = lrc.predict(X_train) predict_test_lrc = lrc.predict(X_test) print('Training Accuracy:', metrics.accuracy_score(y_train, predict_train_lrc)) print('Validation Accuracy:', metrics.accuracy_score(y_test, predict_test_lrc))我們可以看到結果為0.83左右,這樣我們就完成了一個預測在快速相親中是否能夠成功配對的機器學習模型。針對這個模型,數據科學老司機我還專門制作了一個小游戲頁面[7],來測試你的相親戰斗力指數。
相關鏈接
[1]https://tianchi.aliyun.com/specials/promotion/dsw-hol?referFrom=alijishu
[2]https://dsw-dev.data.aliyun.com/#/
[3]https://faculty.chicagobooth.edu/emir.kamenica/documents/genderDifferences.pdf
[4]https://pai-public-data.oss-cn-beijing.aliyuncs.com/speed_dating/Speed%20Dating%20Data%20Key.doc
[5]https://pai-public-data.oss-cn-beijing.aliyuncs.com/speed_dating/Speed%20Dating%20Data%20Key.doc
[6]https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.over_sampling.SVMSMOTE.html
[7]https://tianchi.aliyun.com/specials/promotion/dsw-hol?referFrom=alijishu
原文鏈接:https://developer.aliyun.com/article/771005?
版權聲明:本文內容由阿里云實名注冊用戶自發貢獻,版權歸原作者所有,阿里云開發者社區不擁有其著作權,亦不承擔相應法律責任。具體規則請查看《阿里云開發者社區用戶服務協議》和《阿里云開發者社區知識產權保護指引》。如果您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社區將立刻刪除涉嫌侵權內容。總結
以上是生活随笔為你收集整理的你相亲成功的几率有多高?机器学习硬核预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文搞定 Docker 容器技术与常用命
- 下一篇: 如何基于K8s构建下一代DevOps平台