Поиск любви в эпоху цифровых технологий может быть захватывающим и ошеломляющим. С миллионами пользователей приложений для знакомств задача состоит не только в том, чтобы найти потенциальных партнеров, но и в том, чтобы найти подходящую пару. Чтобы решить эту проблему, приложения для знакомств обращаются к искусственному интеллекту и машинному обучению, чтобы подбирать пользователей на основе их интересов, поведения и даже эмоций. Приложения для знакомств используют алгоритмы искусственного интеллекта (ИИ) и машинного обучения (МО), чтобы помочь пользователям находить подходящие пары.

Один из способов, которым приложения для знакомств используют ИИ, — это анализ настроений, который помогает определить эмоции, выраженные в тексте профиля пользователя. Анализируя используемый язык и тон, алгоритмы ИИ могут определить, выражает ли пользователь положительные или отрицательные эмоции. Например, пользователь, который часто использует нецензурную лексику в сводке своего профиля, может не получить совпадений, поскольку потенциальных партнеров может оттолкнуть негатив.

Представьте себе: пользователь несколько месяцев сидит в приложении для знакомств, проводя пальцем влево и вправо, но ничего не работает. В чем проблема? После анализа настроений приложение выявляет проблему: профиль пользователя наполнен негативными эмоциями. Такие фразы, как «Я ненавижу драму» и «Я устал играть в игры», отбрасывают потенциальных партнеров куда подальше. Но с простой перефразировкой для выражения положительных эмоций, например, «Я ищу отношения без драмы» или «Я ищу кого-то, кто честен и искренен», удача пользователя может отвернуться. Все дело в привлечении потенциальных партнеров правильным языком.

В этом посте мы создадим эффективную модель машинного обучения для приложений для знакомств, мы объединим пользователей по различным факторам, таким как возраст, пол, ориентация, образование, доход и многое другое. Кроме того, мы рассчитаем оценку тональности сводок профилей пользователей для дальнейшего уточнения процесса кластеризации. Чтобы повысить точность совпадений, мы также будем рассчитывать баллы для каждого пользователя на основе тех же факторов или пользовательских предпочтений или присвоенных им весов, используя формулу, учитывающую важность каждого фактора. Сегментируя пользователей и ранжируя их на основе этих факторов, приложения для знакомств могут помочь пользователям более эффективно находить подходящих партнеров.

Создание модели машинного обучения:

Чтобы создать эффективную модель машинного обучения для приложений для знакомств, необходимо выполнить несколько ключевых шагов:

Сбор данных:

Для модели машинного обучения мы будем использовать данные из мобильного приложения для знакомств OkCupid. Приложение уникально тем, что оно вычисляет показатель совместимости на основе дополнительных вопросов, на которые пользователи могут ответить. Набор данных содержит структурированную информацию, такую ​​как возраст, пол, ориентация, телосложение, образование, этническая принадлежность, рост, доход, местонахождение и многое другое. Есть также десять столбцов эссе, которые предоставляют открытые текстовые поля в приложении, позволяя пользователям писать о себе и своих интересах. Эти колонки эссе включают такие темы, как «Мое резюме», «Что я делаю со своей жизнью», «Я действительно хорош в этом» и многое другое.

Набор данных содержит примерно 60 000 записей с 22 столбцами. В некоторых столбцах отсутствуют значения, такие как телосложение, диета и религия. Однако мы все еще можем использовать доступные данные для создания нашей модели машинного обучения. Чтобы создать модель, мы будем использовать как структурированную информацию, так и текстовые столбцы, чтобы сегментировать пользователей на основе различных факторов и вычислять их оценки настроений соответственно.

Набор данных был опубликован Альбертом Кимом и Адрианой Эскобедо-Лэнд в Журнале статистического образования в 2015 году. Авторы предоставили этот набор данных, чтобы помочь студентам познакомиться с вводными курсами по статистике и науке о данных.

  • Возраст: возраст пользователя в годах.
  • Рост: рост пользователя в сантиметрах.
  • Статус: холост ли пользователь или встречается с кем-то.
  • Доход: доход пользователя в долларах США.
  • Body_type: тип телосложения пользователя, например, подтянутый, поджарый или немного больше.
  • Диета: диетические предпочтения пользователя.
  • Напитки: как часто пользователь употребляет алкоголь.
  • Наркотики. Употребляет ли пользователь наркотики.
  • Образование: уровень образования пользователя.
  • Этническая принадлежность: этническая принадлежность пользователя.
  • Работа: профессия или работа пользователя.
  • Местоположение: местоположение пользователя.
  • Потомство: есть ли у пользователя дети, хочет ли он или не хочет иметь детей.
  • Ориентация: сексуальная ориентация пользователя.
  • Домашние животные: предпочтения пользователя в отношении домашних животных.
  • Религия: религиозные убеждения пользователя.
  • Пол: пол пользователя.
  • Курит: как часто пользователь курит.
  • Говорит: уровень владения языком пользователя.

Очистка данных:

Процесс очистки данных для набора данных OkCupid будет состоять из нескольких шагов. Во-первых, нам нужно будет проверить и обработать любые недостающие данные. В этом наборе данных отсутствуют значения в некоторых столбцах, таких как телосложение, диета и религия. Нам нужно будет выбрать наилучший подход к обработке этих пропущенных значений, будь то их вменение или удаление записей, которые их содержат.

Затем нам нужно будет проверить наличие дубликатов и удалить их, если это необходимо. Нам также потребуется обрабатывать любые выбросы или аномалии в данных, которые могут исказить наш анализ или результаты.

Чтобы использовать столбцы эссе в нашей модели анализа настроений, мы должны сначала предварительно обработать текстовые данные. Модель анализа тональности Вейдера в NLTK, которую мы используем для определения тональности в тексте, обрабатывает эту предварительную обработку. Сначала он разбивает текст на отдельные слова, удаляет общие стоп-слова, такие как «the» и «and», и применяет методы нормализации, такие как нижний регистр и определение основы, чтобы привести слова к их корневой форме. Мы переведем дюймы в см. в столбце высоты. Затем мы отбросим строки с пропущенными значениями:

# combing 0-9 essays into one profile
df["Profile"]=(df["essay0"].str.cat(df.iloc[:,-10:-1].astype(str),sep=" "))
df=df.drop(df.iloc[:,-11:-1], axis=1)
df["Profile"]=df["Profile"].fillna("Not provided")
df = df[df['income'] != -1.000000]
# change height from inches to cm
subset_with_clusters['height'] = subset_with_clusters['height'] * 2.54
# Drop any rows with missing value
df= df.dropna(subset=['body_type', 'status','drinks','diet', 'drugs', 'education', 'ethnicity', 'job', 'offspring', 'pets', 'religion', 'smokes', 'speaks'])

Наконец, нам нужно будет нормализовать данные, чтобы убедиться, что все столбцы имеют одинаковую шкалу. Это потребует масштабирования числовых столбцов, таких как возраст, рост и доход, чтобы предотвратить их непропорциональное влияние на наш анализ.

В целом, процесс очистки данных — важный шаг в подготовке данных для использования в нашей модели машинного обучения. Это гарантирует точность и значимость нашего анализа и результатов.

Разработка функций:

Шаг проектирования признаков — это процесс выбора и преобразования необработанных входных данных в функции, которые можно использовать в нашей модели машинного обучения. На этом этапе мы разделим входные переменные на две категории: числовые и категориальные. Числовые переменные включают возраст, рост, доход и оценку настроения, в то время как категориальные переменные включают тип телосложения, статус, диету, напитки, наркотики, образование, этническую принадлежность, работу, местонахождение, потомство, ориентацию, домашних животных, религию, пол, курение, и говорит.

Анализ настроений:

В дополнение к кластеризации приложения для знакомств также используют анализ настроений для анализа сводок профилей пользователей и расчета оценки настроений. Эта оценка помогает дополнительно уточнить процесс кластеризации, выявляя пользователей со схожими личностями, взглядами и убеждениями. Анализ настроений также может помочь отсеять пользователей, которые могут быть несовместимы с личностью или предпочтениями пользователя.

Чтобы определить тональность текстовых данных в столбцах эссе, мы объединим их в один столбец и воспользуемся предварительно обученной моделью VADER из библиотеки NLTK. Эта модель не требует обучения, оценки или отдельных прогнозов. Полученная оценка тональности будет добавлена ​​в качестве нового столбца в наш набор данных и будет иметь метку «положительной» или «отрицательной» тональности на основе порогового значения 0. Добавляя эту оценку, мы можем уточнить процесс кластеризации и улучшить точность совпадений.

# We will use the pre-trained VADER sentiment analysis model for feature extraction
sia = SentimentIntensityAnalyzer()
df['sentiment_score'] = df['Profile'].apply(lambda text: sia.polarity_scores(text)['compound'])

# We add a new column to the dataset containing the sentiment score for each text sample.
df['sentiment'] = np.where(df['sentiment_score'] > 0, 'positive', 'negative')

Перед предварительной обработкой данных мы выберем функции, необходимые для обучения модели ML:

# Create a subset of data with only numeric and categorical features
subset = df[['Profile','age', 'height','status','income', 'body_type', 'diet', 'drinks', 'drugs', 'education', 'ethnicity', 'job', 'location', 'offspring', 'orientation', 'pets', 'religion', 'sex', 'smokes', 'speaks', 'sentiment_score']]

В рамках процесса разработки признаков также необходимо подготовить числовые данные. В этом случае мы стандартизируем числовые признаки, чтобы гарантировать, что они находятся в одном масштабе. Это делается с помощью метода StandardScaler() из модуля sklearn.preprocessing. Затем метод fit_transform() используется для подгонки скейлера к числовым данным и их преобразования. Результатом является преобразованный массив числовых данных, стандартизированный со средним значением 0 и стандартным отклонением 1.

Чтобы подготовить категориальные переменные для использования в нашей модели, нам потребуется выполнить некоторые дополнительные шаги предварительной обработки, такие как однократное кодирование или кодирование меток. Однократное кодирование включает создание двоичного столбца для каждого уникального значения в категориальной переменной, тогда как кодирование метки включает присвоение числовой метки каждому уникальному значению.

# Separate numeric and categorical features
num_cols = ['age', 'height', 'income', 'sentiment_score']
cat_cols = ['body_type','status', 'diet', 'drinks', 'drugs', 'education', 'ethnicity', 'job', 'location', 'offspring', 'orientation', 'pets', 'religion', 'sex', 'smokes', 'speaks']
num_data = subset[num_cols].values
cat_data = subset[cat_cols].values

# Standardize numeric features
scaler = StandardScaler()
num_data = scaler.fit_transform(num_data)

# One-hot encode categorical features
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
cat_data = encoder.fit_transform(cat_data).toarray()

# Combine numeric and categorical features
data = pd.DataFrame(np.concatenate([num_data, cat_data], axis=1))

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

Выбор модели:

После выбора соответствующих функций мы выбрали алгоритм KPrototypes из библиотеки kmodes для моделирования нашего кластера. Это гибрид KMeans и KModes, который может группировать как числовые, так и категориальные переменные. Алгоритм KMeans подходит для кластеризации числовых данных, тогда как KModes эффективен для кластеризации категориальных данных. Однако KPrototypes сочетает в себе оба алгоритма и использует взвешенную комбинацию евклидова расстояния для числовых переменных и простого расстояния сопоставления для категориальных переменных для расчета различий между наблюдениями. Это делает KPrototypes подходящим выбором для кластеризации смешанных данных. Используя этот алгоритм, мы можем создавать кластеры на основе комбинации факторов, включая возраст, пол, ориентацию, образование, доход и т. д., а также оценку настроений, рассчитанную на основе сводок профилей пользователей. Это позволит нам более точно сопоставлять пользователей на основе их совместимости, облегчая пользователям поиск совместимых партнеров.

Обучение моделей:

На этапе обучения модели мы сначала объединили числовые и категориальные функции в один фрейм данных, называемый «данные». Перед применением алгоритма KPrototypes мы выполнили выбор функций с помощью анализа основных компонентов (PCA). Алгоритм PCA уменьшает размерность данных, сохраняя при этом максимально возможную дисперсию. В нашем случае мы сократили данные до 10 главных компонент.

# Separate numeric and categorical features
num_cols = ['age', 'height', 'income', 'sentiment_score']
cat_cols = ['body_type','status', 'diet', 'drinks', 'drugs', 'education', 'ethnicity', 'job', 'location', 'offspring', 'orientation', 'pets', 'religion', 'sex', 'smokes', 'speaks']
num_data = subset[num_cols].values
cat_data = subset[cat_cols].values

# Standardize numeric features
scaler = StandardScaler()
num_data = scaler.fit_transform(num_data)

# One-hot encode categorical features
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
cat_data = encoder.fit_transform(cat_data).toarray()

# Combine numeric and categorical features
data = pd.DataFrame(np.concatenate([num_data, cat_data], axis=1))

# Perform feature selection using PCA
pca = PCA(n_components=10)
reduced_data = pca.fit_transform(data)

После выбора функций мы обучили алгоритм KPrototypes с использованием фрейма данных «data». Мы указали количество кластеров равным 4 и установили параметр «verbose» равным 2, чтобы получать обновления прогресса в процессе обучения. Мы также указали, какие столбцы являются категориальными, используя параметр «категориальный», который представляет собой список индексов категориальных столбцов в кадре данных «данные».

# Cluster data using K-Prototypes
kproto = KPrototypes(n_clusters=6, verbose=2)
clusters = kproto.fit_predict(data, categorical=list(range(len(cat_cols))))

Результатом алгоритма KPrototypes является массив меток кластера, где каждая метка соответствует строке в кадре данных «данные». Эти метки указывают, к какому кластеру принадлежит каждая строка, на основе значений ее числовых и категориальных признаков. Мы добавляем эти метки кластера в новый столбец к исходным данным:

# Add cluster labels to original data
clusters_df = pd.DataFrame(clusters, columns=['cluster'], index=subset.index)
subset_with_clusters = pd.concat([subset, clusters_df], axis=1)

Оптимизация модели:

После обучения модели важно оптимизировать ее, чтобы повысить ее точность и производительность. Это может включать настройку гиперпараметров, выбор функций или даже пробу различных моделей машинного обучения.

Чтобы оптимизировать модель, параметр gamma был изменен, чтобы придать больший вес категориальным данным, что особенно полезно, когда данные содержат сочетание категориальных и числовых данных. Параметр n_init также был увеличен для повышения стабильности результатов кластеризации, которые иногда могут быть чувствительны к инициализации центроидов.

# Cluster data using K-Prototypes with modified parameters
kproto = KPrototypes(n_clusters=6, init='random', n_init=10, verbose=2, gamma=0.5)
clusters = kproto.fit_predict(data, categorical=list(range(len(cat_cols))))

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

import plotly.express as px

# Create a dataframe with reduced data and cluster labels
clustered_data = pd.DataFrame(reduced_data, columns=['PCA_1', 'PCA_2', 'PCA_3', 'PCA_4', 'PCA_5', 'PCA_6', 'PCA_7', 'PCA_8', 'PCA_9', 'PCA_10'])
clustered_data['cluster'] = clusters

# Plot the clusters using a scatter plot
fig = px.scatter(clustered_data, x='PCA_1', y='PCA_2', color='cluster', 
                 title='Cluster Visualization', hover_data=['cluster'])

# Show the plot
fig.show()

Как мы видим на рисунке выше, перекрывающиеся кластеры могут возникать, когда у разных кластеров есть общие характеристики или когда функции, используемые для кластеризации, недостаточно различаются, чтобы разделить точки данных на отдельные кластеры. Это не обязательно означает, что подход к кластеризации ошибочен, и может отражать основную структуру данных. В конкретном контексте приложений для знакомств можно ожидать перекрывающихся кластеров из-за разнообразия фона, предпочтений и поведения пользователей. Важно тщательно анализировать результаты кластеризации и интерпретировать их в контексте рассматриваемой проблемы.

После создания и оптимизации модели машинного обучения ее можно использовать для кластеризации пользователей на основе общих характеристик. Этот процесс включает группировку похожих пользователей на основе таких факторов, как возраст, пол, ориентация, образование и доход. Объединяя пользователей в кластеры, приложения для знакомств могут повысить точность совпадений, объединяя пользователей со схожим опытом и интересами.

В этой части кода к исходным данным добавляются метки кластеров, полученные с помощью алгоритма K-Prototypes. Новый кадр данных с именем clusters_df создается с метками кластера в качестве единственного столбца, а индекс этого кадра данных устанавливается таким же, как индекс подмножества исходных данных, которые использовались для кластеризации.

Затем функция concat() используется для соединения subset DataFrame с clusters_df DataFrame вдоль оси столбцов (ось = 1), создавая новый DataFrame с именем subset_with_clusters. Этот DataFrame содержит все исходные функции, а также дополнительный столбец cluster с метками кластеров, назначенными каждому наблюдению.

Рейтинг:

Наконец, приложения для знакомств используют разные алгоритмы для ранжирования пользователей на основе различных факторов, таких как возраст, пол, ориентация, образование, доход или на основе пользовательских предпочтений или присвоенных им весов. Ранжируя пользователей, приложения для знакомств могут помочь пользователям более эффективно находить подходящих партнеров. Алгоритм учитывает предпочтения пользователя, а также предпочтения других пользователей, которые ранее взаимодействовали с профилем пользователя, для создания более точных совпадений.

Чтобы ранжировать пользователей, нам нужно определить веса для каждой функции в наборе данных. Эти веса используются для расчета оценки для каждого пользователя на основе его характеристик. Чем выше оценка, тем лучше совпадение с нашим целевым пользователем.

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

# define weights for each feature
weights = {
    'age': 0.20,
    'status': 0.1,
    'sex': 0.1,
    'orientation': 0.1,
    'body_type': 0.1,
    'diet': 0.1,
    'drinks': 0.20, 
    'drugs': 0.05,
    'education': 0.15,
    'ethnicity': 0.05,
    'height': 0.30,
    'income': 0.20,
    'job': 0.10,
    'location': 0.10,
    'offspring': 0.05,
    'pets': 0.05,
    'religion': 0.05,
    'sign': 0.05,
    'smokes': 0.05,
    'speaks': 0.05,
    'sentiment_score': 0.3,
}

Веса для «возраста» и «дохода» были увеличены, чтобы соответствовать ее предпочтениям в отношении более старшего партнера с финансовой стабильностью. Вес для «роста» также был увеличен, чтобы отразить ее предпочтение более высоких партнеров, в то время как вес для «привычек употребления алкоголя» был уменьшен, чтобы показать, что ее не интересуют те, кто пьет. Вес для «sentiment_score» был увеличен, что указывает на то, что для нее важно позитивное отношение. Другие факторы, такие как работа, местоположение и образование, по-прежнему важны для нее, но не так сильно, как факторы, упомянутые выше.

Следующая часть кода похожа на вашего личного сваха, который подсчитывает баллы для каждого потенциального совпадения на основе ваших предпочтений и приоритетов. Он учитывает важность каждого фактора и соответственно присваивает веса. Например, если вас действительно волнует этническая принадлежность человека, вес, присвоенный этнической принадлежности, будет выше, чем другим факторам. После вычисления оценки код нормализует ее в диапазоне от 0 до 10, чтобы вы могли легко сравнивать и фильтровать возможные совпадения на основе их совместимости с вашими предпочтениями. Это как иметь личного помощника, который поможет вам найти свою вторую половинку!

score = ((subset_with_clusters['age'] * weights['age']) +
         (subset_with_clusters['status'] * weights['status']) +
         (subset_with_clusters['sex'] * weights['sex']) +
         (subset_with_clusters['orientation'] * weights['orientation']) +
         (subset_with_clusters['body_type'] * weights['body_type']) +
         (subset_with_clusters['diet'] * weights['diet']) +
         ((subset_with_clusters['drugs']) * weights['drugs'])  +
         (subset_with_clusters['education'] * weights['education']) +
         (subset_with_clusters['ethnicity'] * weights['ethnicity']) +
         (subset_with_clusters['height'] * weights['height']) +
         (subset_with_clusters['income'] * weights['income']) +
         (subset_with_clusters['job'] * weights['job']) +
         (subset_with_clusters['location'] * weights['location']) +
         (subset_with_clusters['offspring'] * weights['offspring']) +
         (subset_with_clusters['pets'] * weights['pets']) +
         (subset_with_clusters['religion'] * weights['religion']) +
         (subset_with_clusters['sign'] * weights['sign']) +
         (subset_with_clusters['smokes'] * weights['smokes']) +
         (subset_with_clusters['speaks'] * weights['speaks']) +
         (subset_with_clusters['sentiment_score'] * 2 *  weights['sentiment_score']+
         (subset_with_clusters['drinks'] * weights['drinks']))
         )

# normalize score to range from 0 to 10
score = ((score - score.min()) / (score.max() - score.min())) * 10

# add score column to dataframe
subset_with_clusters['score'] = score

Следующая часть кода сортирует фрейм данных по оценке в порядке убывания, так что пользователи с наивысшей оценкой находятся вверху. Это означает, что первые 10 отображаемых пользователей — это те, которые, скорее всего, хорошо соответствуют предпочтениям и приоритетам пользователя женского пола. Отображая таким образом потенциальные совпадения, она может быстро и легко определить наиболее совместимых с ней пользователей.

# sort dataframe by score
subset_with_clusters = subset_with_clusters.sort_values('score', ascending=True)

# display top 10 users
subset_with_clusters.head(10)

Результаты:

Рассматриваемый пользователь придавал большое значение возрасту, доходу, росту и оценке настроения при поиске потенциальных совпадений в приложении для знакомств. Используя эти веса, наш алгоритм кластеризации и ранжирования определил кластер 1 как наиболее подходящий для пользователя на основе совместимости кластера с предпочтительным возрастом, ростом и уровнем дохода пользователя.

В то время как пользователь отдавал предпочтение возрасту в своих предпочтениях, некоторые молодые пользователи включены в кластер 1 из-за их высокого дохода и аналогичного роста. Однако кластер по-прежнему содержит большинство пользователей предпочтительного возрастного диапазона. В целом, алгоритм кластеризации и ранжирования использует целостный подход к сопоставлению пользователей на основе ряда характеристик, а не только возраста, чтобы повысить вероятность обнаружения совместимых совпадений.

Мы видим, что второму варианту 20 лет, и он часто пьет. Хотя возрасту и выпивке, возможно, придавался более высокий вес в алгоритме кластеризации, это не обязательно означает, что более высокий возраст и выпивка всегда приводят к более высокому баллу или рейтингу. Не позволяйте возрастному диапазону обмануть вас; эти совпадения по-прежнему обладают множеством качеств, которые соответствуют предпочтениям пользователя.

Заключение:

Таким образом, интеграция ИИ и машинного обучения в индустрию приложений для знакомств произвела революцию в том, как люди находят любовь в Интернете. Использование алгоритмов анализа тональности и кластеризации в сочетании с формулой, которая присваивает веса различным функциям, значительно повысило точность сопоставления и общее впечатление от пользователя. Поскольку технологии продолжают развиваться, приложения для знакомств становятся все более изощренными в своих возможностях подбора партнеров, предлагая пользователям захватывающий и эффективный способ найти свою идеальную пару. Будущее онлайн-знакомств выглядит светлым, поскольку мощь машинного обучения продолжает открывать новые возможности для поиска любви.

Рекомендации

Набор данных профилей OkCupid

(PDF) Данные OkCupid для вводных курсов по статистике и науке о данных (researchgate.net)

Подпишитесь на DDIntel Здесь.

Посетите наш сайт здесь: https://www.datadriveninvestor.com

Присоединяйтесь к нашей сети здесь: https://datadriveninvestor.com/collaborate