Развитие банковских сервисов и продуктов с учетом требований регулятора

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 31.08.2016
Размер файла 678,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

· случайный выбор объекта (для сравнения со всеми другими)

· “популярные” объекты - на основании коэффициента корреляции Пирсона, исключая предметы, которые пользователь уже выбирал

· user-based коллаборативная фильтрация

· ассоциативные правила

ROC-анализ показал, что на уровне 5 ближайших объектов/соседей разницы между ведущими алгоритмами нет. На уровне анализа в 20 ближайших объектов/соседей чуть лучше ведет себя user-based коллаборативная фильтрация. Такие результаты могли получится вследствие эндогенности. То есть данные представляют собой не просто срез, а временные ряды, предпочтения людей меняются со временем и необходимо введение дополнительных переменных в анализ.

Рис. 5. Сравнение результатов работы алгоритмов

Также стоит отметить, что по этим же причинам существенно проигрывают ассоциативные правила (которые в основном используются в задаче анализа рыночной корзины “market basket analysis”).

Рис. 6. Сравнение результатов работы алгоритмов

7. Контентные методы

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

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

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

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

Переменные, которые используются для создания выборки:

· Age - возраст клиента;

· Job - сфера деятельности;

· Marital - семейное положение;

· Education - уровень образования;

· Default - результат выдачи предыдущего банковского займа;

· Balance - количество денег на всех счетах

· Housing - тип жилья;

· Loan - есть ли сейчас долг;

· Contact - канал взаимодействия, по которому клиент узнал об акции;

· Day - день, в который произошел контакт;

· Month - месяц, в который произошел контакт;

· Duration - количество дней до конца предложения с момента контакта;

· Campaign - тип предложения, который использовался

· Pdays - сколько дней назад была проведена более ранняя кампания;

· Previous - тип более ранней кампании;

· Poutcome - результат проведения более ранней кампании;

· Y - воспользуется ли клиент предложением, зависимая переменная;

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

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

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

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

Заключение

банковский программа алгоритм коллаборативный

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

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

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

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

Возможно, хранение контекстной информации сделает возможным расширение рекомендательной системы и полноценной реализации концепции customer journey.

Список использованных источников

1. Big Data Alchemy: How can Banks Maximize the Value of their Customer Data? / Capgemini Consulting, 2014 - 16 стр.

2. D. Jannach, M. Zanker, A. Felfernig, G. Friedrich Recommender Systems. An Introduction. New York: Cambridge University Press 32 Avenue of the Americas, 2011. 352 P.

3. F. Ricci, L. Rokach, B. Shapira, P.B. Kantor Recommender Systems Handbook. Springer, 2011. 842 P.

4. G. Miner, R. Nisbet, J. Elder IV Handbook of Statistical Analysis and Data Mining Applications. - 1 изд. Elsevier Publishing, 2009.

5. GlowByte Consulting внедрила IBM Campaign в ОТП Банке [Электронныи? ресурс] / Пресс-центр GlowByte Consulting. Режим доступа: http://gbconsulting.ru/about/press-center/company-news/2015/08/13/glowbyte-vnedril-ibm-campaign-otp-bank/, свободныи?. (дата обращения: 13.07.15).

6. Joshua D. Suereth. Scala in Depth// Manning, 2012.

7. Kemp, Simon. «Digital in 2016» We Are Social. N.p., 27 Jan. 2016. Web. / http://wearesocial.com/uk/special-reports/digital-in-2016

8. Mike Frampton. Mastering Apache Spark // Packt Publishing. 2015.

9. P. Melville, V. Sindhwani Recommender systems. Encyclopedia of Machine Learning. 2010.

10. R Graphics Cookbook / Winston Chang. - USA: O'Reilly, 2012 - 522 с.

11. Cay Horstmann. Scala for the Impatient, Basic Classifiers// Addison-Wesley 2012.

12. Shalizi С. Categorizing Data Vectors Types of Categorization, Basic Classifiers, Finding Simple Clusters in Data // Data Mining. 2009.

13. Social Link [Электронныи? ресурс] /НБКИ. Режим доступа: http://www.nbki.ru/servicescredit/social/connections/ свободныи?. (дата обращения: 13.05.15).

14. T. Hastie, R. Tibshirani, J. Friedman The Elements of Statistical Learning: Data Mining, Inference, and Prediction. - Second Edition. Springer, 2009.

15. U. von Luxburg, S. Ben-David Towards a Statistical Theory of Clustering // School of Computer Science, University of Waterloo, Canada. - 2015.

16. Y. Koren Collaborative Filtering with Temporal Dynamics. KDD'09. 2009

17. X. Su, T.M. Khoshgoftaar Survey of Collaborative Filtering Techniques. Advances in Artificial Intelligence. 2009.

18. W.P. Jones, G.W. Furnas Pictures of Relevance: A Geometric Analysis of Similarity Measures. Journal of the American society for information science. 1987.

19. А. Гомзин, А. Коршунов Системы рекомендаций: обзор современных подходов. Препринт. Москва: Труды Института системного программирования РАН. 2012. 20 С.

20. Банк УРАЛСИБ развивает маркетинговую платформу с помощью IBM Contact Optimization [Электронныи? ресурс] / Пресс-центр GlowByte Consulting. Режим доступа: http://gbconsulting.ru/about/press-center/company-news/2015/05/12/bank-uralsib-razvivaet-marketingovuyu-platformu-s-ibm-contact-optimization/, свободныи?. (дата обращения: 12.03.16).

21. Банк "Открытие" внедрил решение HP Vertica для анализа big data [Электронныи? ресурс] / Пресс-центр банка Открытиe. Режим доступа: https://www.openbank.ru/about/press/721/, свободныи?. (дата обращения: 12.03.16).

22. Бинбанк присоединился к числу пользователей биржи данных [Электронныи? ресурс] / CleverDATA. Режим доступа: http://cleverdata.ru/binbank-birzha/, свободныи?. (дата обращения: 12.03.16).

23. Большие данные не стали мэйнстримом в российских банках [Электронныи? ресурс] / Cnews. Режим доступа: http://www.cnews.ru/news/top/bolshie_dannye_ne_stali_mejnstrimom/, свободныи?. (дата обращения: 16.02.16).

24. Воронцов К. В. Методы кластеризации // 2015.

25. Заготовка килобайтов банками [Электронныи? ресурс] / Коммерсантъ. Режим доступа: http://www.kommersant.ru/doc/2609914, свободныи?. (дата обращения: 13.07.15).

26. Искусственный интеллект может не только экономить, но и зарабатывать [Электронныи? ресурс] / Bankir.ru. Режим доступа: http://bankir.ru/publikacii/20160422/iskusstvennyi-intellekt-mozhet-ne-tolko-ekonomit-no-i-zarabatyvat-10007471/, свободныи?. (дата обращения: 1.01.16).

27. Исследование рынка банковских программ лояльности 2015 / Frank Research Group, 2015 - 45 стр.

28. Как устроен рынок big data в России [Электронныи? ресурс] / Rusbase. Режим доступа: http://rusbase.com/howto/big-data-in-russia/, свободныи?. (дата обращения: 13.03.16).

29. Когда данных слишком много: банки на передовой Big Data [Электронныи? ресурс] / Slon. Режим доступа: https://slon.ru/specials/data-economics/articles/bankiri/, свободныи?. (дата обращения: 07.02.16).

30. Количество платежных карт, эмитированных кредитными организациями, по типам карт [Электронныи? ресурс] / Центральный банк РФ. Режим доступа: http://www.cbr.ru/statistics/p_sys/print.aspx?file=sheet013.htm, свободныи?. (дата обращения: 10.01.16).

Приложение 1

Настройка программной среды.

sudo apt-add-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java8-installer

java -version

wget http://www.scala-lang.org/files/archive/scala-2.11.8.deb

sudo dpkg -i scala-2.11.8.deb

sudo apt-get install scala

cd ~

sudo cat >>.bashrc

export SCALA_HOME=/usr/local/src/scala/scala-2.­11.8

export PATH=$SCALA_HOME/bin:$PATH

sudo apt-get install git

wget http://apache-mirror.rbc.ru/pub/apache/spark/spark-1.6.0/spark-1.6.0.tgz

tar -xvf spark-1.6.0.tgz

cd spark-1.6.0

sbt/sbt assembly

Spark Web UI

It is needed to open port 8080 via Azure VM endpoints for our VM

Spark Standalone cluster comes with administrative web UI

Our working environment: http://sparklyapina.cloudapp.net:8080

sudo apt-get install vsftpd

sudo vi /etc/vsftpd.conf

local_enable=YES

write_enable=YES

anonymous_enabled=NO

pasv_enable=YES

pasv_address=[Your public address]

pasv_min_port=12000

pasv_max_port=12003

sudo service vsftpd restart

sudo sh -c 'echo "deb http://cran.rstudio.com/bin/linux/ubuntu trusty/" >> /etc/apt/sources.list'

gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9

gpg -a --export E084DAB9 | sudo apt-key add -

sudo apt-get update

sudo apt-get -y install r-base

sudo apt-get -y build-dep libcurl4-gnutls-dev

sudo apt-get -y install libcurl4-gnutls-dev

sudo apt-get install libxml2-dev

sudo apt-get install gdebi-core

sudo apt-get install libapparmor1 # Required only for Ubuntu, not Debian

wget http://download2.rstudio.org/rstudio-server-0.98.1103-amd64.deb

sudo gdebi rstudio-server-0.98.1103-amd64.deb

Приложение 2

Коллаборативная фильтрация.

data <- read.csv(file="Data.csv")

data$X <- NULL

Удаляем столбец с номерами пользователей

data.ibs <- (data[,!(names(data) %in% c("X", "user"))])

getCosine <- function(x,y)

{

this.cosine <- sum(x*y) / (sqrt(sum(x*x)) * sqrt(sum(y*y)))

return(this.cosine)

}

Сравним между собой сами страницы и составим матрицу их схожести:

data.ibs.similarity <- matrix(NA, nrow=ncol(data.ibs), ncol=ncol(data.ibs),

dimnames=list(colnames(data.ibs), colnames(data.ibs)))

for(i in 1:ncol(data.ibs)) {

Loop through the columns for each column

for(j in 1:ncol(data.ibs)) {

Fill in placeholder with cosine similarities

data.ibs.similarity[i,j] <- getCosine(as.matrix(data.ibs[i]),as.matrix(data.ibs[j])) }}

data.ibs.similarity <- as.data.frame(data.ibs.similarity)

data.neighbours<-matrix(NA,nrow=ncol(data.ibs.similarity),ncol=11,dimnames=list(colnames(data.ibs.similarity)))

for(i in 1:ncol(data.ibs)){

data.neighbours[i,]<-(t(head(n=11,rownames(data.ibs.similarity[order(data.ibs.similarity[,i],decreasing=TRUE),][i])))) }

sumproduct(purchaseHistory, similarities)/sum(similarities).

getScore <- function(history, similarities)

{

x <- sum(history*similarities)/sum(similarities)

}

holder<-matrix(NA,nrow=nrow(data),ncol=ncol(data)-1,dimnames=list((data$user),colnames(data[-1])))

for(i in 1:nrow(holder))

{

Пробегаемся по объектам-колонкам

for(j in 1:ncol(holder))

{

Считываем из ячейки объект и пользователя

user <- rownames(holder)[i]

product <- colnames(holder)[j]

Делаем пустой строкой те колонки, которые пользователь уже купил

if(as.integer(data[data$user==user,product]) == 1)

{

holder[i,j]<-""

} else {

Используем уровень похожести в 10 пользователей

topN<-((head(n=11,(data.ibs.similarity[order(data.ibs.similarity[,product],decreasing=TRUE),][product]))))

topN.names <- as.character(rownames(topN))

topN.similarities <- as.numeric(topN[,1])

Удаляем первого, потому что у него будет похожесть, равная 1

topN.similarities<-topN.similarities[-1]

topN.names<-topN.names[-1]

Смотрим историю пользователя за 10 покупок

topN.purchases<- data[,c("user",topN.names)]

topN.userPurchases<-topN.purchases[topN.purchases$user==user,]

topN.userPurchases <- as.numeric(topN.userPurchases[!(names(topN.userPurchases) %in% c("user"))])

Считаем рейтинг объекта и пользователя

holder[i,j]<-getScore(similarities=topN.similarities,history=topN.userPurchases)

data.user.scores <- holder

Проранжируем наши рекомендации:

data.germany.user.scores.holder<-matrix(NA,nrow=nrow(data.germany.user.scores),ncol=100,dimnames=list(rownames(data.germany.user.scores)))

for(i in 1:nrow(data.germany.user.scores))

{

data.germany.user.scores.holder[i,]<-names(head(n=100,(data.germany.user.scores[,order(data.germany.user.scores[i,],decreasing=TRUE)])[i,]))

}

Приложение 3

Алгоритм формирования дерева решений.

//Decision Trees

val datadir = "/home/azureuser/data"

//Create a SQL Context from Spark context

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

import sqlContext.implicits._

//Load the CSV file into a RDD

val bankData = sc.textFile(datadir + "/bank.csv")

bankData.cache()

bankData.count()

//Remove the first line (contains headers)

val firstLine=bankData.first()

val dataLines = bankData.filter(x => x != firstLine)

dataLines.count()

//Convert the RDD into a Dense Vector

//Change labels to numeric ones

import org.apache.spark.mllib.linalg.{Vector, Vectors}

import org.apache.spark.mllib.regression.LabeledPoint

def transformToNumeric( inputStr: String): Vector = {

val attList=inputStr.split(";")

val age=attList(0).toFloat

//convert outcome to float

val outcome = attList(16).contains("no") match {

case true => 1.0

case false => 0.0

}

//create indicator variables for single/married

val single = attList(2).contains("single") match {

case true => 1.0

case false => 0.0

}

val married = attList(2).contains("married") match {

case true => 1.0

case false => 0.0

}

val divorced = attList(2).contains("divorced") match {

case true => 1.0

case false => 0.0

}

//create indicator variables for education

val primary = attList(3).contains("primary") match {

case true => 1.0

case false => 0.0

}

val secondary = attList(3).contains("secondary") match {

case true => 1.0

case false => 0.0

}

val tertiary = attList(3).contains("tertiary") match {

case true => 1.0

case false => 0.0

}

//convert default to float

val default = attList(4).contains("no") match {

case true => 1.0

case false => 0.0

}

//convert balance amount to float

val balance = attList(5).contains("no") match {

case true => 1.0

case false => 0.0

}

//convert loan to float

val loan = attList(7).contains("no") match {

case true => 1.0

case false => 0.0

}

//Filter out columns not wanted at this stage

val values= Vectors.dense(outcome, age, single, married,

divorced, primary, secondary, tertiary,

default, balance, loan )

return values

}

//Change to a Vector

val bankVectors = dataLines.map(transformToNumeric)

bankVectors.cache()

bankVectors.collect()

//Statistical Analysis

import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics}

val bankStats=Statistics.colStats(bankVectors)

bankStats.min

bankStats.max

val colMeans=bankStats.mean

val colVariance=bankStats.variance

val colStdDev=colVariance.toArray.map( x => Math.sqrt(x))

Statistics.corr(bankVectors)

//Transform to a Data Frame

//Drop columns with low correlation

def transformToLabelVectors(inStr: Vector ): (Float,Vector) = {

val values = ( inStr(0).toFloat,

Vectors.dense(inStr(1),inStr(2),inStr(3),

inStr(4),inStr(5),inStr(6),inStr(7),

inStr(8),inStr(9),inStr(10)))

return values

}

val bankLp = bankVectors.map(transformToLabelVectors)

bankLp.collect()

val bankDF = sqlContext.createDataFrame(bankLp).toDF("label","features")

bankDF.select("label","features").show(10)

//Indexing needed as pre-req for Decision Trees

import org.apache.spark.ml.feature.StringIndexer

val stringIndexer = new StringIndexer()

stringIndexer.setInputCol("label")

stringIndexer.setOutputCol("indexed")

val si_model = stringIndexer.fit(bankDF)

val indexedBank = si_model.transform(bankDF)

indexedBank.select("label","indexed","features").show()

indexedBank.groupBy("label","indexed").count().show()

//Split into training and testing data

val Array(trainingData, testData) = indexedBank.randomSplit(Array(0.9, 0.1))

trainingData.count()

testData.count()

import org.apache.spark.ml.classification.DecisionTreeClassifier

import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator

//Create the model

val dtClassifier = new DecisionTreeClassifier()

dtClassifier.setMaxDepth(4)

dtClassifier.setLabelCol("indexed")

val dtModel = dtClassifier.fit(trainingData)

dtModel.numNodes

dtModel.depth

//Predict on the test data

val predictions = dtModel.transform(testData)

predictions.select("prediction","indexed","label","features").show()

val evaluator = new MulticlassClassificationEvaluator()

evaluator.setPredictionCol("prediction")

evaluator.setLabelCol("indexed")

evaluator.setMetricName("precision")

evaluator.evaluate(predictions)

//Draw a confusion matrix

predictions.groupBy("indexed","prediction").count().show()

Приложение 4

Алгоритм формирования случайного леса.

//RandomForests

val datadir = "/home/azureuser/data"

//Create a SQL Context from Spark context

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

import sqlContext.implicits._

//Load the CSV file into a RDD

val bankData = sc.textFile(datadir + "/bank.csv")

bankData.cache()

bankData.count()

//Remove the first line because of headers

val firstLine=bankData.first()

val dataLines = bankData.filter(x => x != firstLine)

dataLines.count()

//Convert the RDD into a Dense Vector

//Change labels to numeric ones

import org.apache.spark.mllib.linalg.{Vector, Vectors}

import org.apache.spark.mllib.regression.LabeledPoint

def transformToNumeric( inputStr: String): Vector = {

val attList=inputStr.split(";")

val age=attList(0).toFloat

//convert outcome to float

val outcome = attList(16).contains("no") match {

case true => 1.0

case false => 0.0

}

//create indicator variables for single/married

val single = attList(2).contains("single") match {

case true => 1.0

case false => 0.0

}

val married = attList(2).contains("married") match {

case true => 1.0

case false => 0.0

}

val divorced = attList(2).contains("divorced") match {

case true => 1.0

case false => 0.0

}

//create indicator variables for education

val primary = attList(3).contains("primary") match {

case true => 1.0

case false => 0.0

}

val secondary = attList(3).contains("secondary") match {

case true => 1.0

case false => 0.0

}

val tertiary = attList(3).contains("tertiary") match {

case true => 1.0

case false => 0.0

}

//convert default to float

val default = attList(4).contains("no") match {

case true => 1.0

case false => 0.0

}

//convert balance amount to float

val balance = attList(5).contains("no") match {

case true => 1.0

case false => 0.0

}

//convert loan to float

val loan = attList(7).contains("no") match {

case true => 1.0

case false => 0.0

}

//Filter out columns not wanted at this stage

val values= Vectors.dense(outcome, age, single, married,

divorced, primary, secondary, tertiary,

default, balance, loan )

return values

}

//Change to a Vector

val bankVectors = dataLines.map(transformToNumeric)

bankVectors.cache()

bankVectors.collect()

//Statistical Analysis

import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics}

val bankStats=Statistics.colStats(bankVectors)

bankStats.min

bankStats.max

val colMeans=bankStats.mean

val colVariance=bankStats.variance

val colStdDev=colVariance.toArray.map( x => Math.sqrt(x))

Statistics.corr(bankVectors)

//Transform to a Data Frame

//Drop columns with low correlation

def transformToLabelVectors(inStr: Vector ): (Float,Vector) = {

val values = ( inStr(0).toFloat,

Vectors.dense(inStr(1),inStr(2),inStr(3),

inStr(4),inStr(5),inStr(6),inStr(7),

inStr(8),inStr(9),inStr(10)))

return values

}

val bankLp = bankVectors.map(transformToLabelVectors)

bankLp.collect()

val bankDF = sqlContext.createDataFrame(bankLp).toDF("label","features")

bankDF.select("label","features").show(10)

//PCA

import org.apache.spark.ml.feature.PCA

val bankPCA = new PCA()

bankPCA.setK(3)

bankPCA.setInputCol("features")

bankPCA.setOutputCol("pcaFeatures")

val pcaModel = bankPCA.fit(bankDF)

val pcaResult = pcaModel.transform(bankDF).select("label","pcaFeatures")

pcaResult.show()

//Indexing for Decision Trees

import org.apache.spark.ml.feature.StringIndexer

val stringIndexer = new StringIndexer()

stringIndexer.setInputCol("label")

stringIndexer.setOutputCol("indexed")

val si_model = stringIndexer.fit(pcaResult)

val indexedBank = si_model.transform(pcaResult)

indexedBank.select("label","indexed","pcaFeatures").show()

//Split: training and testing data

val Array(trainingData, testData) = indexedBank.randomSplit(Array(0.9, 0.1))

trainingData.count()

testData.count()

import org.apache.spark.ml.classification.RandomForestClassifier

import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator

//Create the model

val rmClassifier = new RandomForestClassifier()

rmClassifier.setLabelCol("indexed")

rmClassifier.setFeaturesCol("pcaFeatures")

val rmModel = rmClassifier.fit(trainingData)

//Predict on the test data

val predictions = rmModel.transform(testData)

predictions.select("prediction","indexed","label","pcaFeatures").show()

val evaluator = new MulticlassClassificationEvaluator()

evaluator.setPredictionCol("prediction")

evaluator.setLabelCol("indexed")

evaluator.setMetricName("precision")

evaluator.evaluate(predictions)

//Draw a confusion matrix

predictions.groupBy("indexed","prediction").count().show()

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.