大数据算命系列之用机器学习评估你的相亲战斗力 | 《阿里云机器学习PAI-DSW入门指南》

点击可下载完整电子书《阿里云机器学习PAI-DSW入门指南》

大数据算命系列之用机器学习评估你的相亲战斗力

试爱情,80%准确率! 俗话说,名如其人,缘分就是人生的后半生,为了寻找真缘分的大有人在g a - Q ! `,因此也就有了姓名缘分测试。 您现在是不是也正在心动犹豫,^ M o也想要一个属于自己的名字配对缘分测试了呢?那就请您赶紧行动吧!" 以d N O 7 | ^ +上这段话,你一定已经在很多个微信公众号的尾部,电% { G c : 视节目之间的广告以及奇奇怪怪的小= q t { ; r K #网站上看到过了吧。

你一定很好奇,这个缘分测试背后到底是不是有科学依据支撑的。

今天,作为数据科学老司机的我,虽然不能直接帮你? 7 b 7 R 7 p B I测试你和某个特定的人直接的缘分,但是我们可以借4 G x p X n u助哥_ R ( n V 6 2 e伦比y P T # , q %亚大学多年研s p - u . # V D f究相亲找对象的心血,通过几个简单的特征来评估你的相亲战斗力指数。

具体模型的测A Z _ q q 2 zA ! ; & ! s b页面在这里在正式W / 3开始实验之g w H前,我们需要寻找一个简单好用方便上手, & - i 0的工具,这里我推荐一波阿里云的! ^ Z T c _ M 6 vDSW探索者版,它对于个人开发者是免费的,同时还有免费的GPU资源可以使用,同时实验的数据还会免费保存30天。点击这里就可以使用,不需% 6 O要购买,只要登陆就可以使用。今天我们就会F ] x - P I通过这个工具来探索人性的奥秘,走进两性关系的神秘空间嘿嘿嘿。

整个实验的数据收集于一个* S E x D从2002年到2004年的线下快速相亲的实验。在这} t 2个实验中,参与者被要求参加多轮^ r + t 5与异性进行的快速相亲,每轮相亲持续4分钟,在4分钟结束后,参与者双方会被询问是否愿意与他们的对象B $ R o再见面。只有当双方都回答了“是”的时候,这次相亲才算是配对成功。

同时,参与者也会被要求通过以量化的方式从 外观吸引力,真诚度,智商,风趣程度,事业心,兴趣爱好 这六个方向来评估他们的相亲对象。

这个数据集同时也包含了很多参加快速3 T o ! F E u `相亲的参与者的其他相关信息,比如地理位置,喜好,对于理想对象的偏好,收入水平,职业以及教育背景等等。关于整个数据集的具体特征描述可以参考这个文件。

本次我们实验的目的主要是为了找出( Q U . F /,当一个人在参加快速相亲时,到底会有多高的几率能够遇` K 2 ` }到自己心动的人并成功牵手。

在我们建模分析探索h q 7 7 q v d z M人性的秘密之前,让我们先读入数据,来看看我们的数据集长什么样。

import pandb b %as as pd
df = pd.read_csv('Speed Dating Data.csv', encoding='gbk')
print(df.shape5 . l S)

通过观察,我们不难发现,在这短短的两年中,这个实验的小酒馆经历了8000多场快速8 O l B相亲的实验。由此x @ * #我们可以非常轻易的推断出,小酒馆的老板应该赚w ) = 0 @ 2 A )的盆满钵满(大雾)
然后从数据的宽度来看,我们会发K B 5 % l F现一共有接近200个特征。关于每个特征的具体描述大家可以参考这篇文档。然后我们再观察数f ^ , N G ] 6 [ =据的完整度,看看是否有缺失数据。

percent_missing = df.isnulL e V = cl(w K U d).sum() * 100 / len(df)
missing_value_df = pd.DataFrame({
'column_name4 6 , g [': df.columns,
'percent_missing': percent_missing
})
missing/ A V 3_value_df.sort_values(by='per( v B , `cent_missing')

通过以上代码,我们不难发J n y t e y I b ]现,其实还有很多的特征是缺失的。这一点在我们后面做分析和建模的时候,都需要关注到。因为一旦一个特征缺失的数据较多,就会导致分析误差变大或者模型过拟合/精度下降。看完数据的完整程度,我们就可以继续往下探索了。
然后第一个问题就来了,在这8000多场的快速相亲中,到底有多少场相亲成功为参加的双方找+ { v M / 0到了合适的伴侣的?带着这个问题,我们就可以开始我们的第一个探索性a c i a ^ Y $数据分析。

# 多少人通过Speed Dating找到了对象
plt.subplots(figsize=(3,3), dpi=J _ #110,)
# 构造. W ? v数据
size_of_groups=df.match.value_counts().values
single_percentage = round(size_of_groups[0]/sum(size_of_groups) * 100,2)
matched_percentage = rM v $ 4 V !ound(size_of_groups[1]/sum(size_of_grou| O ` ( U Y Vps)* 100,2)
names = [
'Sin8 = e Fgle:' + str(single_percentage) + '%',
'Matched' + str(matched_percentage) + '%']g  + F q E P ^ L
# 创建饼图
plt.pie(
size_of_groups,
labels=names ` ` = k ( D A k,
labeldistance=1.2,
colors=Pastel1_3.hex_colors
)
plt.show()

大数据算命系列之用机器学习评估你的相亲战斗力 | 《阿里云机器学习PAI-DSW入门指南》
从上边的饼图我们可以发现,真正通过快速相亲找到对象的比率仅有16.4? L Y a f Y v7%。J i | `
然后我们就迎来了我 . : N z Y E们的第二个问题,这个比率和参加的人的性别是否有关呢B r V?这里我们也通过Pandas自带的filter的方式

df[df.g& ) K S 4 t U C Zender == 0]

来筛选数据集中T f W s的性别。$ 2 m - ! N通过阅读数据集的文档,我们知道0代表% ! 6 z _ y BJ Y 9 z ( : ` - k是女生,1代表的是男生。然后同理,我们执行类似的代码

# 多少女生通过Speed Dating找到了对象
plt.subplots(figsize=(3,3), d~ 6 J / 6 @ h T 4pi=110,)
# 构造数据
size_of_groups=dj F c l qf[df.gender == 0].matcY @ Ph.value_counts().values # 男生只需要吧0替换成1即可
single_percentage = round(size_of_grou5 ) 2 9 { 3 d !ps[0]/sum(size_of_groups) * 100,2)
matc- F u _hed_percentage = round(s{ P 9 Pize_of_groups[1]/sum(size_of_groups)* 100,2)
names = [
'Single:' + str(single_percentage) + '%',
'Matched' + str(ma+ l p ? 4 , C 5tched_percentage) + '%']
# 创建饼图
plt.pie(# w L b T `
size_of_groups,
labels=names,
labeldistan; h _ 3 Zce=1.2,
colors=Pastel1_3.hex_colors
)
plt.show()z [ d S 0 (

来找出女生d l C I J S和男生分别在快速相亲中找到对象的几率的。
女生的几率:
大数据算命系列之用机器学习评估你的相亲战斗力 | 《阿里云机器学习PAI-DSW入门指南》
男生的几率:u - O X w
大数据算命系列之用机器学习评估你的相亲战斗力 | 《阿里云机器学习PAI-DSW入门指南》
不难发现,在快速相亲中,女生相比于男生还是稍微占据一些优势的。女生成功匹配的几率比男生成功匹配的几率超出了0.04。

然后第二个问题来了:是什么样的人在参加快速相亲这样的活动呢?真的都是大龄青年(年龄大于30)嘛?这个时候我们就可以通过对参加人群的年龄分布来做一个统计分析。

# 年龄分布
age = df[np.7 $ &isfinite(df['age'])]['age']
plt.hist(age,bins=35)
plt.xlabel('Age')
plt.ylabel('Frequency')

大数据算命系列之用机器学习评估你的相亲战斗力 | 《阿里云机器学习PAI-DSW入门指南》
不难发现,参加快速相亲的人群主要是22~28岁的群体。这点与我们的预期有些不太符合,. ) = ; z因为主流人群并: i ; q [不是大龄青年。接下来的问题就是,年龄是否会s g ? & k o T影响相亲的成功率呢?和性别相比,哪个对于成功率的影响更大?这两个问题在本文就先埋下一个伏笔,不一一探索了,希望阅读文章的你能够自t } r A M n 7 /己探索。

但是这里可以给出一个非常好用的探P d -l V M I相关性的方式叫做数据相关性分析。通过阅读数据集的描述,我已经为大家选择好了一些合适的特U ~ - O征去进行相关性分析。这里合适的定义是指:1. 数据为数字类型,而不是字符串等无法量化的值。2.数a Q d据的缺失比率较低

date_df = df[[
'iid', 'gender', 'pid', 'm( u 7 w J S Patch', 'int_corr', 'samerace', 'age_o',
'race_o', 'pf_` ) ~ 4 ] &o_att', 'pf_o_sinW ` ( Y ; ! e p [', 'pf_o_int', 'pf_o_fS y c j E ]un', 'pf_o_amb',
'pf_o_sha', 'dec_o', 'attr_o', 'sinc_o', 'intel_3 ~ v (o', 'fun_o', 'like_oz M p B . 7 , 4',
'prob_o', 'met_o', 'age', 'race', 'imprace', 'imprelig', 'goalM d # q 6', 'date',
'go_out', 'career_c', 'sports', 'tvsports', 'exe: u 9 D 9 8rcise', 'dining',
'museums', 'art', 'hiking', 'gaming', 'clubbing', 'reading', 'tv',
'ths q D 6 K B J | eeater', 'movies', 'concerts', 'music', 'shopping', 'yoga', 'attr1_1',
'sinc1_1', 'intel1_1', 'fun1_1', 'amb1_1', 'attr3_1',a z $ | h i 'sinc3_1',
'fun3% x P { H_1', 'intel3_1', 'dec', 'attr', K , f ['sinc', 'iR : 4ntel', 'fuB , ^ ` 6 v R m rn', 'like',
e _ $ H n'prob', 'met'
]]
# heatmap
plt.subplots(figsize=(20,15))
ax = plt.axes()
ax.set_title("Correlation H$ = ` L M c 0 eeatmap")
corr = date_df.corr, 5 [  x()
sns.heatmap(corr,
xticklabels=corr.columns.values,
yticklabels=corr.columns.values)

大数据算命系列之用机器学习评估你的相亲战斗力 | 《阿里云机器学习PAI-DSW入门指南》
通过上面这张图这张相关性分析的热力图,我们可以先关注一些特别亮的和特别暗的点。比如我们可以发现,在 pf_o_att这个表示相亲h f I C 7对象给出的外观吸引力这个特征上,和其他相亲对象给出的评分基本都是严重负相关的,除了pf_o_fun这一特征。由此我们可以推断出两个点:
1、大家会认为外观更u ! ( $ R T W加吸引人的人在智商,事业心,真诚度上表现会相对较差。换句话说,可能就是颜值越高越浪

大数据算命系列之用机器学习评估你的相亲战斗力 | 《阿里云机器学习PAI-DSW入门指南》
2、幽默风趣的人更容易让人觉得外观上有吸引力,比如下面这位幽默风趣的男士(大雾):
大数据算命系列之用机器学习评估你的相亲战斗力 | 《阿里云机器学习PAI-DSW入门指南》
然后我们再看看我们最关注的特征 match,[ f A 1 R b X @ V和这一个特征相关性比较高的特征是哪几个呢?不难发现,A O i s . n Q其实就是'attr_o','si] 7 A = , [nc_o','intel_o','fun_o','amb_o','P ~ _ G pshar_o'这几个特征,U 1 b R 8 `分别是相亲对方给出的关于外观,真诚度,智商,风趣程度,事业线以及兴趣爱好的打分。接下来我们就可以根据u = T 3 : 2 o这个来进行建模了。首先我们将我们的特征和结果列都放到一H k f , } } V个Dataframe中,然后再去除含_ j N # t { y有空r & *值的纪录。 最后我们再分为X和Y% B L ^ * ) ^ k B用来做训练。当然分为X,y之后,由于我们在j 8 Y b ~ G W % A最开始就发现只有16.4h f I (7%的参与场次中成功匹配了,所7 $ * / Q W @ x Q以我们的数据有严重的不均衡,这里我们可以用SVMSMOTE9 1 Q J来增加一下我们的数据量避免模型出现过度拟} ? R w : O $ I R合。

# 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 = imbl= : # + F K v @ iearn.overA K F 7 ? e U_sampling.SVMSMOTE()
X, yZ K i f = oveX b L y f X U ~rsample.fit_resample(XP n ! % S } z r, y)
# 做训练集和测试集分割
X_train, X_test, y_train, y_test = train2 x =_test_split(X, y, test_size=0.2, random_state=0, stratify=y)

数据准备好之后,我们N _ 0 & - Z就可以进行模型的构建和训练了。通过以下代码,我们可以构建一个简单的逻辑回归的模型,并在测试集上来测试。

# logistic regression classification model
model = LogisticRegressO  ? C S e k }ion(C=1, random_state=0)
lrc = model.fit(X_train, y_train)
p0 r L 1 ! [ Q H `redict_train_lrc = lrc.predict(X_train)
predict_test_lrc = lrc.predict(X_test)
print('Training Accuracy:', meti 6 i c W Q 6 * yrics.accA e , Zuracy_score(y_train, predict_traint T Z n o @ :_lrc))
pY s - Rrint('Validation Accuracy:',B q # ~ } [ metrics.accuracy_L x u & 2 5 % zscore(y_test, predict_test_lrc))

大数据算命系列之用机器学习评估你的相亲战斗力 | 《阿里云机器学习PAI-DSW入门指南》
我们可以看到结果为0.83o y ) J $ -左右,这样我们就完成了一个# f Q d预测在快速相亲中是否能够成功配对的机器学习模型。针对这个模型,数据科学老司机我还专门制作了一个小游戏页面,来测试你的相亲战斗力指数。 同时也欢迎你加入我们的DSW用户交流群,和我们一起交流/探索更多好玩又实用的机器学习/深度学习案例。