Manual de Utilizaç˜ao do sistema UOR
Transcrição
Manual de Utilizaç˜ao do sistema UOR
Manual de Utilização do sistema UOR Projecto oRANKI - Detecção de Casos Raros usando Recursos Limitados. Relatório oRANKI 2010/03 Luis Torgo - [email protected] Rita P. Ribeiro - [email protected] Projecto oRANKI - Detecção de Casos Raros usando Recursos Limitados 2 Conteúdo 1 Introdução 3 2 O método UOR 2.1 Parâmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Saı́da . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 4 3 Exemplos de utilização 3.1 Exemplo 1: algae . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Exemplo 2: sales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 7 Luı́s Torgo, Rita P. Ribeiro - LIAAD/INESC Porto LA Projecto oRANKI - Detecção de Casos Raros usando Recursos Limitados 1 3 Introdução O objectivo deste manual é descrever os objectivos e a forma de utilizar o programa UOR. O principal objectivo deste programa é possibilitar a obtenção de rankings de utilidade. Dado um conjunto de casos este programa vai fornecer um ranking dos mesmos de acordo com a utilidade esperada de inspeccionar cada um deles. Em problemas de detecção de fraude com recursos limitados de inspecção, é necessário atribuir esses recursos aos casos mais promissores. Estes casos não são necessariamente aqueles que são mais provavelmente fraudes. De facto, há outros factores a ter em conta. Concretamente, há a considerar o custo da inspecção, que poderá não ser idêntico para todos os casos, e também o resultado da inspecção se se confirmar o caso como fraudulento. Poderão existir casos que têm maior probabilidade de serem fraudulentos mas que, ou por serem casos com baixo retorno ou por existirem outros casos que custem bastante menos a serem inspeccionados, seja preteridos em relação a outros com menor probabilidade. Neste contexto, propõem-se usar noções da teoria da utilidade para obter rankings de utilidade de inspecção - que é o objectivo do programa UOR. A utilidade de inspecção de um caso é estimada por, E[Ui ] = P̂i · u(B̂i − Ĉi ) + (1 − P̂i ) · u(−Ĉi ) (1) em que P̂i é a probabilidade estimada de i ser uma fraude, B̂i é o resultado esperado para a inspecção do caso i se confirmado como fraude, Ĉi é o custo estimado da inspecção de i, e u(.) é uma função de utilidade. Mais informação sobre a metodologia pode ser obtida em Torgo e Lopes [3]. 2 O método UOR O método UOR implementa o Algoritmo 1 destinado a obter os valores envolvidos na Equação 1. Algorithm 1 High-level description of the methodology. 1: procedure UOR(HistD, InspCand) B em que HistD = {hx1 , · · · , xp , C, Bi}, InspCand = {hx1 , · · · , xp i}, and x1 , · · · , xp são variáveis descrevendo cada caso 2: 3: 4: 5: B Passo 1 - Obter modelos de Custos e Benefı́cios DSC ← {hx1 , · · · , xp , Ci ∈ HistD} DSB ← {hx1 , · · · , xp , Bi ∈ HistD} Cmodel ← RegressionT ool(DSC ) Bmodel ← RegressionT ool(DSB ) 6: B Passo 2 - Obter probabilidades de outlier para InspCand P ← OutlierP robEstimator(HistD, InspCand) 7: 8: 9: 10: 11: 12: 13: B Passo 3 - Estimar Utilidades for all i ∈ InspCand do Ci ← P redict(Cmodel , i) Bi ← P redict(Bmodel , i) EUi = Pi · u(Bi − Ci ) + (1 − Pi ) · u(−Ci ) end for B Passo 4 - Obter rankings de utilidade (solução) return InspCand ordenado por EUi decrescente end procedure Luı́s Torgo, Rita P. Ribeiro - LIAAD/INESC Porto LA Projecto oRANKI - Detecção de Casos Raros usando Recursos Limitados 4 O método foi implementado na linguagem R [1]. A função UOR() implementa o Algoritmo 1 e possui a seguinte descrição: UOR(HD, ID, regrLearner, outLearner, uf = function(x) x, descrCols=1:(ncol(HD)-3), costCol=ncol(HD)-2, benCol=ncol(HD)-1) 2.1 Parâmetros A função UOR() tem uma série de parâmetros que são descritos em seguida: HD - um data frame contendo dados históricos sobre inspecções efectuadas no passado. Para cada linha é incluı́da informação sobre os descritores do caso, mas também o custo e a resultado da inspecção. ID - um data frame contendo os casos para os quais pretendemos um ranking the utilidade. Estes casos são descritos somente pelos descritores do problema uma vez que ainda desconhecemos quer os custos quer os resultados das inspecções. regrLearner - o nome de uma função do R que implementa um algoritmo de aprendizagem de modelos de regressão múltipla. outLearner - o nome de uma função do R que implementa um algoritmo de obtenção de probabilidades de outliers. uf - o nome de uma função de utilidade. Este parâmetro tem como valor por omissão uma função de utilidade igual a u(x) = x, ou seja a função identidade. descrCols - um vector com as colunas do data frame HD que são os descritores. Por omissão serão todas as colunas menos as 3 últimas (que se assume conterem o custo, benefı́cio e utilidade). costCol - a coluna de HD com o custo. Por omissão será a 3 a contar do fim. benCol - a coluna de HD com o benefı́cio. Por omissão será a 2 a contar do fim. 2.2 Saı́da A função UOR() dá como resultado uma lista com as seguintes componentes: EU - um vector com os valores estimados da utilidade para cada um dos casos em ID, apresentados na ordem das linhas desse data frame. EUrank - um vector com os mesmos valores de utilidade mas agora na ordem do rank decrescente por valor de utilidade. EC - um vector com os custos estimados para cada um dos casos em ID, apresentados na ordem das linhas desse data frame. EB - um vector com os resultados (benefı́cios) estimados para cada um dos casos em ID, apresentados na ordem das linhas desse data frame. outP - uma lista com duas componentes. A componente com o nome rank contêm um vector com a posição no ranking de cada caso do data frame ID, na ordem original das linhas deste. A componente com o nome score contêm um outro vector com o mesmo tamanho com as probabilidades estimadas de ser outlier para cada linha de ID, apresentados na ordem das linhas desse data frame. Luı́s Torgo, Rita P. Ribeiro - LIAAD/INESC Porto LA Projecto oRANKI - Detecção de Casos Raros usando Recursos Limitados 3 5 Exemplos de utilização Os exemplos a seguir ilustram a forma de utlização da função UOR(). Eles usam diferentes abordagens para a atribuição de benefı́cios e custos na identificação de outliers, e que estão inerentes ao domı́nio do problema. 3.1 Exemplo 1: algae O primeiro exemplo usa o conjunto de dados algae disponı́vel no package DMwR [2] que inclui o registo de valores de concentração de 7 micro-algas nocivas em vários rios europeus. Cada registo corresponde a uma amostra de água e é descrito por 11 variáveis, 3 contextuais para a identificação da referida amostra (estação do ano, tamanho e velocidade do rio) e 8 parâmetros fı́sico-quı́micos obtidos por testes feitos à qualidade da água da amostra. A recolha destes parâmetros para todas as amostra de água é feita de forma automática. No entanto, a avaliação dos valores de concentração de cada uma das micro-algas presentes na amostra, requer uma análise manual da mesma. O objectivo deste problema consiste em prever/identificar o aparecimento da concentração excessiva, também designada por blooms, destas algas nocivas. Estes blooms ainda que raros trazem sérios impactos para a qualidade da água, tornando-a imprópria para consumo e inviabilizando os rios como fonte de abastecimento de água potável. Vamos aplicar o método de detecção de outliers baseado em utilidade, apresentado na Secção 2, para identificar os top 20 outliers segundo o critério de utilidade para uma das 7 micro-algas, por exemplo a alga a1. Pelo facto do método que iremos usar para ranking de outliers se basear no cálculo de distâncias entre os casos, optámos por nos restringir aos dados numéricos, isto é, aos valores dos 8 parâmetros fı́sico-quı́micos. > > > > > > > > > > > > > library(DMwR) library(e1071) source('DataAndCode/UOR.R') source('DataAndCode/auxFunc.R') data(algae) a <- 1 descrVars <- 4:11 targetVar <- 11+a algae <- na.omit(algae) Algae <- algae[,descrVars] AlgaeV <- algae[,targetVar,drop=F] n <- NCOL(Algae) m <- as.numeric(rownames(Algae)) Vamos agora dividir o conjunto de dados em dois conjuntos diferentes: um que guardará toda a informação relacionada com o registo da concentração da micro-alga (histData) e outro onde essa informação será omitida para possibilitar a inspecção dos blooms da micro-alga (inspData). No conjunto histData foram incluı́dos 80% dos casos para a aprendizagem supervisionada e no conjunto inspData, os restantes 20% dos casos para a aprendizagem não supervisionada. Sobre os dados constantes no histórico, assumimos que os custos e os benefı́cios são definidos em função valor de concentração da micro-alga a1 e da distância ao valor médio observado (thr). Os custos são definidos por uma função sigmóide decrescente (cf) com centro em thr. nos dados de histórico. Os benefı́cios são definidos por uma funcão sigmoı́de crescente (bf) com centro em thr. > > > > > > > percSup <- 0.8 set.seed(1) supCases <- as.character(sample(m,as.integer(length(m)*percSup))) inspCases <- as.character(m[!(m %in% supCases)]) thr <- mean(AlgaeV[supCases,1]) cf <- function(x) (1/(1+exp((x-thr)*thr))) bf <- function(x) x*(1/(1+exp((thr-x)*thr))) Luı́s Torgo, Rita P. Ribeiro - LIAAD/INESC Porto LA Projecto oRANKI - Detecção de Casos Raros usando Recursos Limitados > > > + > > 6 c <- sapply(AlgaeV[supCases,1],cf) b <- sapply(AlgaeV[supCases,1],bf) histData <- as.data.frame(cbind(Algae[supCases,], cost=c,benef=b,util=b-c)) descrVars <- 1:n inspData <- as.data.frame(Algae[inspCases,descrVars]) Como algoritmo de regressão para a aprendizagem dos benefı́cios e custos, escolhemos as support vector machines implementadas pela função svm disponı́vel no package e1071 [2]. Para a detecção de outliers, escolhemos o método de ranking baseado nas diferenças dos grupos, implementado pela função outliers.ranking, também disponı́vel no package DMwR [2]. Finalmente, como função de utilidade usamos a função identidade definida por defeito. > rm <- learner('svm',pars=list()) > om <- learner('orhCall',pars=list()) > urank <- UOR(histData,inspData,regrLearner=rm,outLearner=om) De seguida, listamos os primeiros 20 outliers obtidos pelo algoritmo UOR. > > > + + + > > uor.idx <- urank$EUrank[1:20] idx <- as.numeric(names(urank$EU[uor.idx])) uor.ds<-cbind(idx,AlgaeV[as.character(idx),1], urank$EU[uor.idx], urank$EC[uor.idx],urank$EB[uor.idx], urank$outP$score[uor.idx]) colnames(uor.ds)<-c('idx','a1','EU','EC','EB','P(ORh)') rownames(uor.ds)<- 1:20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 idx 53 29 15 111 22 19 46 68 177 115 153 20 35 51 89 193 108 155 133 160 a1 81.900 17.100 52.200 64.300 15.500 50.600 29.500 64.200 39.700 18.100 2.200 0.000 5.300 0.000 0.000 2.200 23.700 2.800 0.000 0.000 EU EC 19.219 -0.126 14.133 0.071 13.416 0.124 12.294 0.339 11.842 0.132 9.790 0.317 9.670 0.638 8.396 0.227 7.400 0.283 7.031 0.421 5.596 0.840 4.361 0.845 3.714 0.864 3.694 0.631 3.669 0.854 3.468 0.522 3.281 0.804 2.897 0.826 2.826 0.881 2.514 0.711 EB P(ORh) 38.185 0.500 30.774 0.462 27.080 0.500 26.670 0.474 25.278 0.474 16.845 0.600 14.056 0.733 20.122 0.429 29.196 0.263 17.887 0.417 6.951 0.926 6.767 0.769 5.951 0.769 10.091 0.429 6.400 0.707 14.872 0.268 5.782 0.707 8.233 0.452 5.246 0.707 12.020 0.268 Tabela 1: Rankings de outliers do conjunto de dados algae para os valores de concentração da alga a1 Por fim, para estes primeiros 20 outliers, podemos obter o ganho de utilidade, em percentagem, que o método UOR apresentou face ao ranking de outliers que seria fornecido pelo método ORh, apenas baseado nas probabilidades estimadas. Luı́s Torgo, Rita P. Ribeiro - LIAAD/INESC Porto LA Projecto oRANKI - Detecção de Casos Raros usando Recursos Limitados UOR(ORh) 149.21001 7 P(ORh) 96.20206 O ganho de utilidade de UOR(ORh) face a P(ORh) é de 55.1 %. O resultado confirma que ao escolhermos inspeccionar os casos sugeridos pelo algoritmo UOR baseados na utilidade, obtemos um ganho claro comparativamente àquele que seria obtido se fossem inspeccionados os casos sugeridos apenas por uma técnica de ranking de outliers standard. 3.2 Exemplo 2: sales O segundo exemplo usa o conjunto de dados sales disponı́vel no package DMwR [2]. Neste conjunto estão registadas vendas de vários produtos. O objectivo aqui é identificar transacções potencialmente fraudulentas para um dado produto ('p1000'), tendo em conta todas as transacções desse produto. Existem transacções que já foram analisadas e identificados como ”fraude”ou ”ok”. Estas transacções constituem o conjunto de histórico de transacções (histSales) sobre as quais será feita a aprendizagem dos custos e benefı́cios e, portanto, da utilidade associada a cada transacção. As restantes transacções integram o conjunto de transacções a inspeccionar (inspSales) com o propósito de identicar outliers. > > > > > > > > > library(DMwR) library(e1071) library(dprep) source('DataAndCode/UOR.R') source('DataAndCode/auxFunc.R') data(sales) s <- sales[sales$Prod == 'p1000',c("Val","Quant","Insp")] histSales <- na.omit(s[s$Insp != "unkn",]) inspSales <- na.omit(s[s$Insp == "unkn",-3]) Vamos aplicar o método de detecção de outliers baseado em utilidade, apresentado na Secção 2, para identificar os top 20 outliers segundo o critério de utilidade. Neste contexto, começamos por definir os custos e os benefı́cios associados às transacções já inspeccionadas. Começamos por assumir que o trabalho de inspecção de uma transacção tem um custo fixo igual ao valor do número de horas de trabalho envolvido, por exemplo 150. Contudo, o benefı́cio está dependente do conjunto tı́pico de transacções do produto 'p1000'. Em concreto, estabeleceu-se que uma transacção será potencialmente mais fraudulenta, e portanto a sua inspecção mais benéfica, quanto mais o preço unitário envolvido (uPrice) se distanciar do preço unitário tı́pico (tPrice) obtido pela mediana dos preços unitários, tendo em conta o intervalo de preços observados para 50% das transacções (iqrPrice). Adicionalmente, quanto maior for o volume de vendas envolvido nestas transacções fraudulentas, mais benéfica deverá ser a sua identificação. Em resumo, o benefı́cio da inspecção de uma transacção é dado por uma espécie de outlying factor do preço (oPrice) calculado pela funcção de benefı́cios (bf) abaixo definida. A utilidade é o resultado da diferença entre os benefı́cios e os custos. > > > > histSales$uPrice <- histSales$Val/histSales$Quant tPrice <- median(histSales[histSales$Insp != "fraud", "uPrice"]) iqrPrice <- IQR(histSales[histSales$Insp != "fraud", "uPrice"]) cat('tPrice = ',tPrice,' iqrPrice = ',iqrPrice,"\n") tPrice = 4.589007 iqrPrice = 2.016054 > bf <- function(x) { + if(x["Insp"] == "fraud") + oPrice <- (abs(as.numeric(x["uPrice"]) - tPrice)/iqrPrice) * as.numeric(x["Quant"]) + else + oPrice <- 0 Luı́s Torgo, Rita P. Ribeiro - LIAAD/INESC Porto LA Projecto oRANKI - Detecção de Casos Raros usando Recursos Limitados 8 + } > b <- apply(histSales,1,bf) > histSales <- data.frame(Quant=histSales$Quant,Val=histSales$Val, + cost=150,benef=b,util=b-150) À semelhança do que fizemos no exemplo anterior, escolhemos como algoritmo de regressão para a aprendizagem dos benefı́cios e custos as support vector machines implementadas pela função svm() disponı́vel no package e1071 [2]. Para a detecção de outliers, escolhemos o método de ranking baseado nas diferenças dos grupos, implementado pela função outliers.ranking(), também disponı́vel no package DMwR [2]. Finalmente, como função de utilidade usamos a função identidade definida por defeito. > rm <- learner('svm',pars=list()) > om <- learner('orhCall',pars=list()) > urank <- UOR(histSales,inspSales,regrLearner=rm,outLearner=om) Na Tabela 2 estão listadas as 20 primeiras transacções identificadas pelo algoritmo UOR, por ordem decrescente de utilidade. A fim de comprovar que o algoritmo UOR é capaz de fornecer um ranking de transacções a inspeccionar potencialmente mais útil do que aquele que seria fornecido pelo método standard de ranking de outliers. > > > > > + + + + + + > + > uor.idx <- urank$EUrank[1:20] idx <- names(urank$EU[uor.idx]) uPrice <- as.numeric(inspSales[idx,"Val"]/inspSales[idx,"Quant"]) oPrice <- abs(uPrice - tPrice) * inspSales[idx,"Quant"] uor.ds<-cbind(as.numeric(idx), inspSales[idx,"Quant"],inspSales[idx,"Val"], uPrice,oPrice, urank$EU[uor.idx], urank$EC[uor.idx], urank$EB[uor.idx], urank$outP$score[uor.idx]) colnames(uor.ds)<-c('idx','Quant','Val','uPrice','oPrice', 'EU','EC','EB','P(ORh)') rownames(uor.ds)<- 1:20 Podemos observar que para os primeiros 20 casos, o ranking de outliers produzido pelo algoritmo UOR() é diferente daquele que seria produzido pelo algoritmo outliers.ranking(). Para além disso, e face aos critérios de utilidade por nós estabelecido, o algoritmo UOR() leva à identificação das 20 transacções suspeitas com maior volume de vendas envolvido o que se traduz num ganho de utilidade é de cerca 34%, conforme mostram os resultados abaixo. UOR(ORh) P(ORh) 58305.95 43498.61 O ganho de utilidade de UOR(ORh) face a P(ORh) é de 34 %. Luı́s Torgo, Rita P. Ribeiro - LIAAD/INESC Porto LA 9 Projecto oRANKI - Detecção de Casos Raros usando Recursos Limitados 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 idx Quant Val uPrice oPrice 290867 2794 2455 0.879 10366.686 362786 1627 9100 5.593 1633.686 128802 2161 4235 1.960 5681.844 362810 655 5420 8.275 2414.200 362769 213 1990 9.343 1012.542 290818 213 1990 9.343 1012.542 178906 3600 7565 2.101 8955.425 362746 1600 9655 6.034 2312.589 178907 3433 7075 2.061 8679.061 39730 3433 7185 2.093 8569.061 178908 2336 10365 4.437 354.920 290795 213 1990 9.343 1012.542 39714 916 4810 5.251 606.470 5153 922 5105 5.537 873.936 80475 6425 21980 3.421 7504.370 128793 266 2325 8.741 1104.324 178919 1588 1835 1.156 5452.343 39703 627 5515 8.796 2637.693 290784 213 1990 9.343 1012.542 178911 1416 1860 1.314 4638.034 EU 3685.232 3141.386 3128.074 3007.194 2997.460 2927.516 2927.263 2918.077 2915.828 2913.045 2871.312 2842.030 2802.095 2800.334 2765.886 2746.166 2738.995 2737.627 2735.172 2705.256 EC 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 150.000 EB P(ORh) 4572.777 0.839 4114.233 0.800 4370.765 0.750 3946.492 0.800 3846.895 0.818 3846.895 0.800 4615.895 0.667 4090.769 0.750 4598.742 0.667 4594.567 0.667 4229.837 0.714 3846.895 0.778 4025.585 0.733 4023.183 0.733 3887.848 0.750 3861.555 0.750 4248.522 0.680 3937.674 0.733 3846.895 0.750 4198.907 0.680 Tabela 2: Rankings de outliers do conjunto de dados sales para as transacções do produto p1000. Referências [1] R Development Core Team. R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, 2008. ISBN 3-900051-07-0. [2] L. Torgo. Data Mining with R, learning with case studies. Chapman and Hall/CRC, 2010. [3] L. Torgo and E. Lopes. Utility-based fraud detection. In T. Walsh, editor, Proceedings of 22th International Joint Conference on Artificial Intelligence (IJCAI’2011), pages 1517–1522. AAAI Press, 2011. Luı́s Torgo, Rita P. Ribeiro - LIAAD/INESC Porto LA