В этой главе мы будем использовать данные, собранные в первой части книги. Данные содержат текст, который описывает профили фрилансеров и почасовую ставку, которую они взимают в долларах США. Идея следующего раздела заключается в том, чтобы подобрать модель, которая, учитывая навыки фрилансера, позволяет прогнозировать его почасовую зарплату.
Следующий код показывает, как преобразовать необработанный текст, который в этом случае имеет навыки пользователя, в матрицу сумок слов. Для этого мы используем библиотеку R с именем tm. Это означает, что для каждого слова в корпусе мы создаем переменную с количеством вхождений каждой переменной.
library(tm) library(data.table) source('text_analytics/text_analytics_functions.R') data = fread('text_analytics/data/profiles.txt') rate = as.numeric(data$rate) keep = !is.na(rate) rate = rate[keep] ### Make bag of words of title and body X_all = bag_words(data$user_skills[keep]) X_all = removeSparseTerms(X_all, 0.999) X_all # <<DocumentTermMatrix (documents: 389, terms: 1422)>> # Non-/sparse entries: 4057/549101 # Sparsity : 99% # Maximal term length: 80 # Weighting : term frequency - inverse document frequency (normalized) (tf-idf) ### Make a sparse matrix with all the data X_all <- as_sparseMatrix(X_all)
Теперь, когда у нас есть текст, представленный в виде разреженной матрицы, мы можем подобрать модель, которая даст разреженное решение. Хорошей альтернативой для этого случая является использование LASSO (оператор наименьшей абсолютной усадки и выбора). Это регрессионная модель, которая способна выбирать наиболее релевантные функции для прогнозирования цели.
train_inx = 1:200 X_train = X_all[train_inx, ] y_train = rate[train_inx] X_test = X_all[-train_inx, ] y_test = rate[-train_inx] # Train a regression model library(glmnet) fit <- cv.glmnet(x = X_train, y = y_train, family = 'gaussian', alpha = 1, nfolds = 3, type.measure = 'mae') plot(fit) # Make predictions predictions = predict(fit, newx = X_test) predictions = as.vector(predictions[,1]) head(predictions) # 36.23598 36.43046 51.69786 26.06811 35.13185 37.66367 # We can compute the mean absolute error for the test data mean(abs(y_test - predictions)) # 15.02175
Теперь у нас есть модель, которая с учетом набора навыков способна предсказать почасовую зарплату фрилансера. Если будет собрано больше данных, производительность модели улучшится, но код для реализации этого конвейера будет таким же.