Саморазвитие

Поможет ли ML найти идеальную пару?

Время прочтения: 5 мин.

Набор данных был собран профессорами Колумбийской бизнес-школы Рэем Фисманом и Шиной Айенгар для статьи «Гендерные различия в выборе партнера: доказательства эксперимента по скоростному знакомству» ( набор данных). Скоростные свидания — это короткие беседы, длящиеся до 4-х минут, в завершении которых участники определяют, интересует ли их собеседник или нет. Перед встречей всем участникам необходимо было заполнить онлайн-форму, содержащую личную информацию (возраст/пол/религия/увлечения), а затем дать самооценку своей привлекательности. После свидания все участники должны были решить, хотят ли они снова встретиться с партнером или нет.

Посмотрим какие особенности есть у участников эксперимента, а так же попробуем обучить модель для предсказания симпатии.

Что представляют собой данные:

Размер датафрейма: (8378, 195)

При этом, количество уникальных значений iid=551. То есть, если человек участвует в нескольких свиданиях, данные о нем дублируются.

Данные об участниках свиданий, их возрасте, поле, расе, религиозных убеждениях и т.д.:

df['gender'] = df.gender.map({1 : 'Male', 0 : 'Female'}).fillna(df.gender)
data_df['gender'] = data_df.gender.map({1 : 'Male', 0 : 'Female'}).fillna(data_df.gender)
df.gender.value_counts(dropna=False)

Количество мужчин и женщин примерно одинаково, сможем ли мы увидеть некоторые различия с точки зрения возраста?

df[['gender', 'age']].groupby('gender').agg(['mean', 'median', 'min', 'max', 'count'])

Медианное значение возраста у мужчин больше. При этом средний возраст незначительно отличается.

Датафрейм содержит информацию о расе участников, есть ли зависимость расы и возраста участника?

df[['race', 'age']].groupby('race').agg(['mean', 'median', 'min', 'max', 'count'])

Азиатские участники моложе, в то время как афроамериканцы и латиноамериканцы в среднем незначительно старше.

Посмотрим сводную статистику, с учетом возраста, пола и расы.

df[['race','gender', 'age']].groupby(['race', 'gender'])\
.agg(['mean', 'median', 'min', 'max', 'count'])

Интересно узнать, чем занимаются или чему учатся участники

df1= df[['gender', 'field_cd']].groupby(['field_cd', 'gender']).size().unstack().fillna(0)
ax = df1.plot(kind='bar', figsize=(12,6), stacked=True)
ax.set_xticklabels(ax.get_xticklabels(), fontsize=12, rotation=45)

ax.set_title('Направление обучения в зависимости от пола', fontsize=16)
ax.set_xlabel('',fontsize=1)

Подавляющее большинство изучают бизнес, финансы, экономику, естественные науки (химия, физика). Во всех направлениях  превалируют мужчины.

Зачем люди ходят на быстрые свидания? Посмотрим, как распределились причины в зависимости от пола участника.

Мужчины в качестве цели свидания указывают поиск пары в 2 раза чаще женщин. Остальные цели примерно одинаковы у участников обоих полов. Какие интересы есть у участников? Есть ли зависимости между их увлечениями?

corr = df[['sports', 'tvsports', 'exercise', 'dining', 'museums',
       'art', 'hiking', 'gaming', 'clubbing', 'reading', 'tv', 'theater',
       'movies', 'concerts', 'music', 'shopping', 'yoga']].corr()
plt.figure(figsize=(12,10))
ax = sns.heatmap(corr, cmap='GnBu')
ax.set_xticklabels(ax.get_xticklabels(), rotation=45)
ax.set_title('Зависимость между увлечениями ', fontsize=16)

На тепловой карте весьма предсказуемая картина: те, кто любит посещать музеи, увлекаются искусством, любители музыки посещают концерты, а те, кто увлечен спортом с удовольствием смотрят спортивные программы. Есть ли различия в интересах участников разных полов?

За исключением спорта, просмотра спортивных телепередач и компьютерных игр женщины проявляют более высокий интерес ко всем видам деятельности.

После того, как мы изучили данные, можно перейти к самому интересному и попытаться предсказать результат свидания.

Рассмотрим несколько моделей: логистическую регрессию, градиентный бустинг и Random Forest.

Разобьем df на train и test, будем оценивать кросс-валидацию по 4 блокам, в качестве метрики качества будем использовать точность.

kfold = KFold(n_splits = 4)
clf = LogisticRegression(random_state = 42)
cv_res_lr = cross_val_score(clf, X_train, y_train, cv = kfold, scoring = "accuracy")
cdt=RandomForestClassifier(n_estimators=7)
cv_res_dt=cross_val_score(cdt, X_train, y_train, cv=kfold, scoring = "accuracy")
cgb= GradientBoostingClassifier()
cv_res_gb = cross_val_score(cgb, X_train, y_train, cv = kfold, scoring="accuracy")
 res=pd.DataFrame({ "Model" :["LogisticRegression" , "GradientBoosting","RandomForest"], "Accuracy":[cv_res_lr.mean(), cv_res_gb.mean(),cv_res_dt.mean()]})
res

Наилучший результат дает логистическая регрессия. Посмотрим какие результаты будут на test выборке

logreg = LogisticRegression(random_state = 42, max_iter = 1200)
logreg.fit(X_train, y_train)
predict = logreg.predict(X_test)
print('Accuracy:', metrics.accuracy_score(y_test, predict))

Получился неплохой результат, который можно улучшить, добавив новые признаки (личные качества, увлечения, возраст и образование). Набор данных оказался очень интересным и обширным, можно рассматривать его с различных сторон и находить новые закономерности. Всё же, довольно сложно понять, что является главным критерием, по которому человек выбирает себе пару.

Советуем почитать