天天看點

大資料算命系列之用機器學習評估你的相親戰鬥力 | 《阿裡雲機器學習PAI-DSW入門指南》

點選即可參與機器學習PAI-DSW動手實驗室 點選可下載下傳完整電子書《阿裡雲機器學習PAI-DSW入門指南》

更多案例參考:

四步訓練出自己的CNN手寫識别模型 如何自己訓練一個熱狗識别模型 半小時驗證語音降噪—賈揚清邀你體驗快捷雲上開發

大資料算命系列之用機器學習評估你的相親戰鬥力

試愛情,80%準确率! 俗話說,名如其人,緣分就是人生的後半生,為了尋找真緣分的大有人在,是以也就有了姓名緣分測試。 您現在是不是也正在心動猶豫,也想要一個屬于自己的名字配對緣分測試了呢?那就請您趕緊行動吧!" 以上這段話,你一定已經在很多個微信公衆号的尾部,電視節目之間的廣告以及奇奇怪怪的小網站上看到過了吧。

你一定很好奇,這個緣分測試背後到底是不是有科學依據支撐的。

今天,作為資料科學老司機的我,雖然不能直接幫你測試你和某個特定的人直接的緣分,但是我們可以借助哥倫比亞大學多年研究相親找對象的心血,通過幾個簡單的特征來評估你的相親戰鬥力指數。

具體模型的測試頁面在

這裡

在正式開始實驗之前,我們需要尋找一個簡單好用友善上手的工具,這裡我推薦一波阿裡雲的DSW探索者版,它對于個人開發者是免費的,同時還有免費的GPU資源可以使用,同時實驗的資料還會免費儲存30天。

點選這裡

就可以使用,不需要購買,隻要登陸就可以使用。今天我們就會通過這個工具來探索人性的奧秘,走進兩性關系的神秘空間嘿嘿嘿。

整個實驗的資料收集于一個從

2002年到2004年的線下快速相親的實驗

。在這個實驗中,參與者被要求參加多輪與異性進行的快速相親,每輪相親持續4分鐘,在4分鐘結束後,參與者雙方會被詢問是否願意與他們的對象再見面。隻有當雙方都回答了“是”的時候,這次相親才算是配對成功。

同時,參與者也會被要求通過以量化的方式從 外觀吸引力,真誠度,智商,風趣程度,事業心,興趣愛好 這六個方向來評估他們的相親對象。

這個資料集同時也包含了很多參加快速相親的參與者的其他相關資訊,比如地理位置,喜好,對于理想對象的偏好,收入水準,職業以及教育背景等等。關于整個資料集的具體特征描述可以參考這個檔案。

本次我們實驗的目的主要是為了找出,當一個人在參加快速相親時,到底會有多高的幾率能夠遇到自己心動的人并成功牽手。

在我們模組化分析探索人性的秘密之前,讓我們先讀入資料,來看看我們的資料集長什麼樣。

import pandas as pd
df = pd.read_csv('Speed Dating Data.csv', encoding='gbk')
print(df.shape)           

通過觀察,我們不難發現,在這短短的兩年中,這個實驗的小酒館經曆了8000多場快速相親的實驗。由此我們可以非常輕易的推斷出,小酒館的老闆應該賺的盆滿缽滿(大霧)

然後從資料的寬度來看,我們會發現一共有接近200個特征。關于每個特征的具體描述大家可以參考

這篇文檔

。然後我們再觀察資料的完整度,看看是否有缺失資料。

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')           

通過以上代碼,我們不難發現,其實還有很多的特征是缺失的。這一點在我們後面做分析和模組化的時候,都需要關注到。因為一旦一個特征缺失的資料較多,就會導緻分析誤差變大或者模型過拟合/精度下降。看完資料的完整程度,我們就可以繼續往下探索了。

然後第一個問題就來了,在這8000多場的快速相親中,到底有多少場相親成功為參加的雙方找到了合适的伴侶的?帶着這個問題,我們就可以開始我們的第一個探索性資料分析。

# 多少人通過Speed Dating找到了對象
plt.subplots(figsize=(3,3), dpi=110,)
# 構造資料
size_of_groups=df.match.value_counts().values

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()           
大資料算命系列之用機器學習評估你的相親戰鬥力 | 《阿裡雲機器學習PAI-DSW入門指南》

從上邊的餅圖我們可以發現,真正通過快速相親找到對象的比率僅有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()           

來找出女生和男生分别在快速相親中找到對象的幾率的。

女生的幾率:

大資料算命系列之用機器學習評估你的相親戰鬥力 | 《阿裡雲機器學習PAI-DSW入門指南》

男生的幾率:

大資料算命系列之用機器學習評估你的相親戰鬥力 | 《阿裡雲機器學習PAI-DSW入門指南》

不難發現,在快速相親中,女生相比于男生還是稍微占據一些優勢的。女生成功比對的幾率比男生成功比對的幾率超出了0.04。

然後第二個問題來了:是什麼樣的人在參加快速相親這樣的活動呢?真的都是大齡青年(年齡大于30)嘛?這個時候我們就可以通過對參加人群的年齡分布來做一個統計分析。

# 年齡分布
age = df[np.isfinite(df['age'])]['age']
plt.hist(age,bins=35)
plt.xlabel('Age')
plt.ylabel('Frequency')           
大資料算命系列之用機器學習評估你的相親戰鬥力 | 《阿裡雲機器學習PAI-DSW入門指南》

不難發現,參加快速相親的人群主要是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)           
大資料算命系列之用機器學習評估你的相親戰鬥力 | 《阿裡雲機器學習PAI-DSW入門指南》

通過上面這張圖這張相關性分析的熱力圖,我們可以先關注一些特别亮的和特别暗的點。比如我們可以發現,在 pf_o_att這個表示相親對象給出的外觀吸引力這個特征上,和其他相親對象給出的評分基本都是嚴重負相關的,除了pf_o_fun這一特征。由此我們可以推斷出兩個點:

1、大家會認為外觀更加吸引人的人在智商,事業心,真誠度上表現會相對較差。換句話說,可能就是顔值越高越浪

2、幽默風趣的人更容易讓人覺得外觀上有吸引力,比如下面這位幽默風趣的男士(大霧):

大資料算命系列之用機器學習評估你的相親戰鬥力 | 《阿裡雲機器學習PAI-DSW入門指南》

然後我們再看看我們最關注的特征 match,和這一個特征相關性比較高的特征是哪幾個呢?不難發現,其實就是'attr_o','sinc_o','intel_o','fun_o','amb_o','shar_o'這幾個特征,分别是相親對方給出的關于外觀,真誠度,智商,風趣程度,事業線以及興趣愛好的打分。接下來我們就可以根據這個來進行模組化了。首先我們将我們的特征和結果列都放到一個Dataframe中,然後再去除含有空值的紀錄。 最後我們再分為X和Y用來做訓練。當然分為X,y之後,由于我們在最開始就發現隻有16.47%的參與場次中成功比對了,是以我們的資料有嚴重的不均衡,這裡我們可以用

SVMSMOTE

來增加一下我們的資料量避免模型出現過度拟合。

# 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))           
大資料算命系列之用機器學習評估你的相親戰鬥力 | 《阿裡雲機器學習PAI-DSW入門指南》

我們可以看到結果為0.83左右,這樣我們就完成了一個預測在快速相親中是否能夠成功配對的機器學習模型。針對這個模型,資料科學老司機我還專門制作了一個

小遊戲頁面

,來測試你的相親戰鬥力指數。 同時也歡迎你加入我們的DSW使用者交流群,和我們一起交流/探索更多好玩又實用的機器學習/深度學習案例。