www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home
Занимательная история, выдающиеся люди, малоизвестные факты, находки, открытия, фальсификации. Присоединяйся!

Классификация машинного обучения: успех технических проектов Kickstarter

Дата публикации May 4, 2019

По состоянию на апрель 2019 года на Kickstarter было запущено более 400 000 проектов. Поскольку краудфандинг становится все более популярным методом привлечения капитала, я подумал, что было бы интересно изучить данные, лежащие в основе проектов Kickstarter, а также применить модель машинного обучения, чтобы предсказать, будет ли проект успешным на основе его категории и цели сбора средств. ,

Получение данных и аналитический анализ

Использованные данные были взяты из KaggleВоти предлагает данные по проектам до января 2018 года. Никакой очистки в сети или очистки данных не потребовалось (что казалось небольшим отрывом), я просто скачал CSV прямо из Kaggle.

Многие проекты финансируются на Kickstarter, поэтому я подумал, что имеет смысл сначала сравнить, сколько проектов разных типов пытаются поднять, и насколько они успешны в этом. Я выбрал только «успешные» или «неудачные» проекты, решив не беспокоиться о тех, которые были отменены, приостановлены, не определены или все еще работают.

После создания бинарной переменной для успеха / неудачи я сгруппировал данные по категориям проектов (используяgroup_by)найти среднюю цель и сумму, поднятую для каждой группы, затем упорядочить их по возрастанию средней цели и использоватьggplot2для отображения результатов.

# get only success/fail
data <- data[data$state %in% c("successful", "failed"), ]# making dummy variable based on success/fail
data$success <- as.numeric(data$state == "successful")# activate libraries
library(ggplot2)
library(dplyr)# group by project category
grouped_data <- data %>%
group_by(main_category) %>%
summarise(
target = mean(goal),
success_rate = mean(success)
)# change to data frame format
grouped_data <- as.data.frame(grouped_data)# put in correct order
grouped_data$main_category <- factor(grouped_data$main_category, levels = grouped_data$main_category[order(grouped_data$target)])
Средняя цель по сбору средств и уровень успеха для каждой группы проектов категории

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

С другой стороны, 2 из наименее успешных категорий оказываются в топ-3, когда речь идет о цели по сбору средств. Технология с наивысшей средней целью в 114 700 долл. США также является наименее успешной категорией со средним показателем успеха всего 23,8%. Журналистские проекты не сильно отстали, с 24,4%.

Если мы углубимся в статистику технических проектов, географическое распределение может дать нам немного больше шансов на низкий уровень успеха. Разделение проектов на американские и неамериканские, похоже, свидетельствует о том, что американские проекты имеют чуть больший успех (26,2% против 23,8%). Выполнение простого t-теста подтверждает (сp-value = 1.36e-08) что эта разница является статистически значимой.

# splitting US from non-US projects
us_tech_projects <- filter(tech_projects, country == "US")# checking for significantly different means
t.test(us_tech_projects$success, y = tech_projects$success, alternative = c("two.sided", "less", "greater"), mu = 0,
paired = FALSE, var.equal = FALSE, conf.level = 0.95)

Будь то узнаваемость бренда Kickstarter в США или просто влияние более состоятельного населения в целом, если вы создадите свой технический проект в США, у вас будет больше шансов на успех, чем если бы вы делали это в других местах.

Если мы выполним тот же самый t-тест, что и выше, но на этот раз для проектов с первоначальной целью ниже или выше 50 000 долларов, мы получим еще одно существенное различие между группами. Стремитесь поднять менее 50 000 долларов с вашим проектом, и ваши шансы на успех составляют 26%. Более $ 50 000, это число снижается до 16%. Очевидно, что воздействие не является бинарным, как описано здесь, но тем не менее показывает влияние постановки амбициозной цели.

Со всеми техническими проектами есть много подкатегорий:

Популярность подкатегорий технических проектов

Если мы пропустим довольно запутанно названную подкатегорию «Технологии», то некоторые из самых популярных проектов - это Приложения, Интернет, Программное обеспечение и Оборудование. Это не говорит нам много, хотя. Следующий код распечатывает показатель успешности каждой отдельной подкатегории:

sort(tapply(tech_projects$success, tech_projects$category, mean))

Это дает гораздо больше понимания, поскольку мы видим, что некоторые из наиболее успешных категорий включают 3D-печать (43%) и роботы (46%). Они возвышаются над некоторыми из самых бедных подкатегорий, таких как Приложения (7%), Интернет (8%) и Программное обеспечение (14%).

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

Чтобы выяснить это, мне пришлось разделить «запущенную» переменную из ее формата даты и времени на 2 отдельные переменные: «launch_date» и «launch_time». Отсюда я мог бы просто вычесть «launch_date» из «крайнего срока» и создать новую переменную, которая отслеживает продолжительность проекта.

# split "launched" variable into date and time variables
library(tidyr)
tech_projects <- separate(data = tech_projects, col = launched, into = c("launch_date", "launch_time"), sep = " ")# subtract from one another
tech_projects$date_diff <- as.Date(as.character(tech_projects$deadline), format="%Y-%m-%d")-
as.Date(as.character(tech_projects$launch_date), format="%Y-%m-%d")# group by sub-category before plotting
grouped_data_tech <- tech_projects %>%
group_by(category) %>%
summarise(
target = mean(date_diff),
success_rate = mean(success)
)

С помощьюggplot2диаграмма рассеяния ниже может быть построена:

Связь между продолжительностью кампании и уровнем успеха

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

Использование классификационных моделей для прогнозирования успеха проекта

Результаты, полученные до сих пор, интересны, но я хотел пойти дальше и создать пару классификационных моделей, которые смотрят на проект и определяют, будет ли проект успешным. Я собираюсь сравнить выходные данные модели опорных векторов (SVM) с моделью логистической регрессии.

Прежде чем начать, мне нужно реконструировать мою категориальную переменную «категория» в несколько фиктивных переменных, которые могут понять модели

# get the category variable
tech_projects_dummy <- select(tech_projects, category)# split into multiple dummy variables
tech_projects_dummy <- dummy.data.frame(tech_projects_dummy, sep = ".")# reattach variables of interest to tech_projects_dummy
tech_projects_dummy$goal <- tech_projects$usd_goal_real
tech_projects_dummy$success <- tech_projects$success# encode dependent variable as a factor
tech_projects_dummy$success <- factor(tech_projects_dummy$success, levels = c(0,1))

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

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

# splitting dataset into training and test set
library(caTools)
set.seed(123)
split <- sample.split(tech_projects_dummy$success, SplitRatio = 0.75)
training_set <- subset(tech_projects_dummy, split == TRUE)
test_set <- subset(tech_projects_dummy, split == FALSE)

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

# feature scaling everything but dependent variable
training_set[-18] = scale(training_set[-18])
test_set[-18] = scale(test_set[-18])

Отсюда остается только применить наши классификаторы к нашим тренировочным наборам и позволить им делать свою работу!

# fitting logistic regression to the training set
l_classifier = glm(formula = success ~ .,
family = binomial,
data = training_set)# fitting SVM to the training set
library(e1071)
svm_classifier = svm(formula = success ~ .,
data = training_set,
type = 'C-classification',
kernel = 'linear')# predicting the logistic regression test set results
l_pred = predict(l_classifier, type = 'response', newdata = test_set[-18])# create binary variable from the logistic regression predictions
l_pred = ifelse(l_pred > 0.5, 1, 0)# predicting the SVM test set results
svm_pred = predict(svm_classifier, newdata = test_set[-18])

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

# logistic regression confusion matrix
l_cm = table(test_set[,18], l_pred)# SVM confusion matrix
svm_cm = table(test_set[,18], svm_pred)

Из 6762 проектов в нашем тестовом наборе модель логистической регрессии правильно предсказала 5166 (точность 76,4%) и модель SVM 5131 (точность 75,9%). Модель логистической регрессии просто выходит на первое место, но здесь явно необходимо сделать более тонкую настройку, чтобы построить более надежный индикатор успеха технических проектов на Kickstarter.

Спасибо за прочтение! Я не эксперт, поэтому я приветствую все отзывы и конструктивную критику в комментариях.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map