关于bootstrap:七夕阿里云AI帮你算算你的战斗值

46次阅读

共计 5161 个字符,预计需要花费 13 分钟才能阅读完成。

“ 用姓名测试恋情,80% 准确率!“

“俗话说,名如其人,缘分就是人生的后半生。”

“心动不如口头,来一个属于本人的名字配对缘分测试吧!”

这些话你肯定曾经在很多微信号、电视节目,甚至奇奇怪怪的小网站上都看到过。

你肯定也很好奇,名字缘分测试背地到底是不是有科学依据撑持。

明天,作为数据迷信老司机的我,尽管不能间接帮你测试你和某个特定的人间接的缘分,然而咱们能够借助哥伦比亚大学多年钻研相亲找对象的心血,通过几个简略的特色来评估你的相亲战斗力指数。

具体模型的测试页面在这里,只是正式开始试验之前,咱们须要寻找一个简略好用不便上手的工具,这里我举荐一波阿里云的 PAI-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()

从上边的饼图咱们能够发现,真正通过疾速相亲找到对象的比率仅有 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 来减少一下咱们的数据量防止模型呈现适度拟合。

# 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 左右,这样咱们就实现了一个预测在疾速相亲中是否可能胜利配对的机器学习模型。

针对这个模型,数据迷信老司机我还专门制作了一个小游戏页面,来测试你的相亲战斗力指数。快来体验吧!

原文链接
本文为阿里云原创内容,未经容许不得转载。

正文完
 0