Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 742BD200D28 for ; Mon, 23 Oct 2017 09:35:39 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 727381609E0; Mon, 23 Oct 2017 07:35:39 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id C68291609CE for ; Mon, 23 Oct 2017 09:35:36 +0200 (CEST) Received: (qmail 69448 invoked by uid 500); 23 Oct 2017 07:35:35 -0000 Mailing-List: contact user-help@predictionio.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@predictionio.apache.org Delivered-To: mailing list user@predictionio.apache.org Received: (qmail 69438 invoked by uid 99); 23 Oct 2017 07:35:35 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 23 Oct 2017 07:35:35 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 6467CC4C9D for ; Mon, 23 Oct 2017 07:35:34 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 2.982 X-Spam-Level: ** X-Spam-Status: No, score=2.982 tagged_above=-999 required=6.31 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HTML_MESSAGE=2, HTML_OBFUSCATE_05_10=0.001, KAM_SHORT=0.001, MANY_SPAN_IN_TEXT=1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001, WEIRD_PORT=0.001] autolearn=disabled Authentication-Results: spamd1-us-west.apache.org (amavisd-new); dkim=pass (2048-bit key) header.d=vicomtech-org.20150623.gappssmtp.com Received: from mx1-lw-us.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id We52-86XFG67 for ; Mon, 23 Oct 2017 07:35:28 +0000 (UTC) Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with ESMTPS id 8FCFB60DDA for ; Mon, 23 Oct 2017 07:35:27 +0000 (UTC) Received: by mail-wm0-f65.google.com with SMTP id r68so7864133wmr.3 for ; Mon, 23 Oct 2017 00:35:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vicomtech-org.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=DIs/R55t+LPCh0abLmuoZW6ce1RAz6hurN0WmEgX41E=; b=ft9t86KxEpbTibO4CtEXXxgrL2GCpuH5Oo+P1Zbl5ZPfwv2/8gwfD60X+NdB8WAoFt 5hBMBM3raHsTAviINLppY36QRgXK88/K7wApY/sCd/EEJ2MN0dRa77Z5MnRMZK3XZhsB zGmgO2ExJaA0XMCPBFNyF8lttkfr8dyrvs1NhRnYJ70r080/+X5M1vqoiz+NCLQtIbKl ZXvOBdvfh9RFCyXM40Rxce1oL3DqGZBpXT7/HB1pAE2gklTQFiV1jIU/e9pvfLZ+JV26 GlQtHP/c1xQ+QJlygjKc4HFYen8TgcgWOKfWs1MbL93ujHVCmDEzhDfTy/gcB6fS1hi9 QZww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=DIs/R55t+LPCh0abLmuoZW6ce1RAz6hurN0WmEgX41E=; b=BO9PDJolBl0jIBbvpMR6w1fC2urJZMvn9uZjbXsol88CklY2v/5qXXiRpTuLphpa5o bu/2qVtNfdfn931fNd4yQwxhQSO0Y7Ufp0r/NKt/HRo7YKgdi+kY9FPy1r6rNXDQdr+v mU7WcDOwXxuBayuYeyD6wRb8P6lFEyJSPVu0p8PTh8Qrc6yV+VQjOgkRpU7kksW5Z1rW CLb+fmF0BTjfijOivUlf5uZnKPyXBINLxl8lEqydAF0oLBuzPaSPk4PnEnl+CIlplGPy Ug4YjieNjiFNjFb0jQZMdMQqM6tGeX+Y+4IBpA7qP5NHTqsklC2nC5HnU0iP5bjnW41D jK9A== X-Gm-Message-State: AMCzsaUjmR2H6+1Y57H1V4rv5gXov6GADJ/sSlqvs66PIgEuMPkGF90W B6pE8PCB0uhsKx7hL53kleDu+m8QwdxfuIRuXIZR/A== X-Google-Smtp-Source: ABhQp+TsaQ2TzlWamwgMhCsotAYSvvWTv8drqit+xbWgUOfZnZJjOIanX2oHxwJxFm9xxs8Y2+OzriWm2Jyq8nDrPSQ= X-Received: by 10.28.132.73 with SMTP id g70mr4242551wmd.33.1508744126218; Mon, 23 Oct 2017 00:35:26 -0700 (PDT) MIME-Version: 1.0 Received: by 10.28.12.20 with HTTP; Mon, 23 Oct 2017 00:11:29 -0700 (PDT) In-Reply-To: References: <89308E3D-4F19-4DE0-A8A8-6AEF6DA4EAAD@occamsmachete.com> <0EC36C23-2648-4101-8713-AE4E4D0D2C55@occamsmachete.com> <2CEA6918-B700-4A05-B84C-BAC2A04DA919@occamsmachete.com> <69FAC663-F461-4ADD-A475-F84422C0C825@occamsmachete.com> From: =?UTF-8?Q?Noelia_Os=C3=A9s_Fern=C3=A1ndez?= Date: Mon, 23 Oct 2017 09:11:29 +0200 Message-ID: Subject: Re: [ERROR] [TaskSetManager] Task 2.0 in stage 10.0 had a not serializable result To: Pat Ferrel Cc: user@predictionio.incubator.apache.org, actionml-user , Donald Szeto Content-Type: multipart/alternative; boundary="001a114445f8b356a1055c31dd49" archived-at: Mon, 23 Oct 2017 07:35:39 -0000 --001a114445f8b356a1055c31dd49 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks Pat! On 20 October 2017 at 16:53, Pat Ferrel wrote: > There are several algorithm resources. > A Math heavy one here: https://www.slideshare.net/pferrel/unified- > recommender-39986309 > A more result oriented one here: https://developer.ibm. > com/dwblog/2017/mahout-spark-correlated-cross-occurences/ > > The benefit of the CCO algorithm in the UR comes into play when you have > more than just conversions (buy for ecom, view for you) For just about al= l > other recommenders you really can only use one indicator of user > preference. Several experiments, including ones I=E2=80=99ve done, show y= ou cannot > mix buys with detail-views in ecom or your results will be worse=E2=80=94= that is > with single event recommenders like the Spark MLlib recommenders. The UR > uses multi-modal input so you can indeed improve results when using buys > with detail-views. The second post actually shows how dislikes can improv= e > results when you want to predict likes. > > In order to do this the CCO algorithm finds events that are correlated, > but it uses a statistical method that is suspicious of 100% correlation > since this is likely anomalous in the real world (caused by promotions, > give-aways, other anomalous outside influences). This statistical method = is > called the log likelihood ratio. > > On Oct 20, 2017, at 12:17 AM, Noelia Os=C3=A9s Fern=C3=A1ndez > wrote: > > Thanks for the explanation, Pat! > > I think the best course of action is for me to read the documentation and > understand how the algorithm works. Then, try again with a slightly large= r > dataset. > > Thank you very much! > > On 19 October 2017 at 17:15, Pat Ferrel wrote: > >> This sample dataset is too small with too few cooccurrences. U1 will >> never get i1 due to the blacklist (u1 has already viewed i1 so will not = be >> recommended that again). The blacklist can be disable if you want to >> recommend viewed items again but beware that they may predominate every >> recommendations set if you do tun it off since it is self-fulfilling. Wh= y >> not i2, not sure without running the math, the UR looks at things >> statistically and with this small a dataset anomalies can be seen since = the >> data is not statistically significant. I1 will show up in internal >> intermediate results (A=E2=80=99A for instance) but these are then filte= red by a >> statistical test called LLR, which requires a certain amount of data to >> work. >> >> Notice the handmade dataset has many more cooccurrences and produces >> understandable results. Also notice that in your dataset i3 and i4 can o= nly >> be recommended by =E2=80=9Cpopularity=E2=80=9D since they have no cooccu= rrence. >> >> >> >> On Oct 19, 2017, at 1:28 AM, Noelia Os=C3=A9s Fern=C3=A1ndez >> wrote: >> >> Pat, this worked!!!!! Thank you very much!!!! >> >> The only odd thing now is that all the results I get now are 0s. For >> example: >> >> Using the dataset: >> >> "u1","i1" >> "u2","i1" >> "u2","i2" >> "u3","i2" >> "u3","i3" >> "u4","i4" >> >> echo "Recommendations for user: u1" >> echo "" >> curl -H "Content-Type: application/json" -d ' >> { >> "user": "u1" >> }' http://localhost:8000/queries.json >> echo "" >> >> What I get is: >> >> {"itemScores":[{"item":"\"i2\"","score":0.0},{"item":"\"i1\" >> ","score":0.0},{"item":"\"i3\"","score":0.0},{"item":"\"i4\" >> ","score":0.0}]} >> >> >> If user u1 has viewed i1 and user u2 has viewed i1 and i2 then I think >> the algorithm should return a non-zore score for i2 (and possible i1, to= o). >> >> Even using the bigger dataset with 100 items I still get all scores 0s. >> >> So now I'm going to spend some time reading the following documentation, >> unless there is some other documentation you recommend I read first! >> >> - [The Universal Recommender](http://actionml.com/docs/ur) >> - [The Correlated Cross-Occurrence Algorithm](http://mahout.apach >> e.org/users/algorithms/intro-cooccurrence-spark.html) >> - [The Universal Recommender Slide Deck](http://www.slideshare.ne >> t/pferrel/unified-recommender-39986309) >> - [Multi-domain predictive AI or how to make one thing predict another]= ( >> https://developer.ibm.com/dwblog/2017/mahout-spark- >> correlated-cross-occurences/) >> >> Thank you very much for all your patience and help getting me to this >> point!!! >> >> Best regards, >> Noelia >> >> >> On 18 October 2017 at 18:33, Pat Ferrel wrote: >> >>> It is the UR so Events are taken from the EventStore and converted into >>> a Mahout DistributedRowMatrix of RandomAccessSparseVectors, which are b= oth >>> serializable. This path works fine and has for several years. >>> >>> This must be a config problem, like not using the MahoutKryoRegistrator= , >>> which registers the serializers for these. >>> >>> @Noelia, you have left out the sparkConf section of the engine.json. Th= e >>> one used in the integration test should work: >>> >>> { >>> "comment":" This config file uses default settings for all but the >>> required values see README.md for docs", >>> "id": "default", >>> "description": "Default settings", >>> "engineFactory": "com.actionml.RecommendationEngine", >>> "datasource": { >>> "params" : { >>> "name": "tiny_app_data.csv", >>> "appName": "TinyApp", >>> "eventNames": ["view"] >>> } >>> }, >>> "sparkConf": { <=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D T= HIS WAS LEFT OUT IN YOUR >>> ENGINE.JSON BELOW IN THIS THREAD >>> "spark.serializer": "org.apache.spark.serializer.KryoSerializer", >>> "spark.kryo.registrator": "org.apache.mahout.sparkbindings.io >>> .MahoutKryoRegistrator", >>> "spark.kryo.referenceTracking": "false", >>> "spark.kryoserializer.buffer": "300m", >>> "es.index.auto.create": "true" >>> }, >>> "algorithms": [ >>> { >>> "comment": "simplest setup where all values are default, >>> popularity based backfill, must add eventsNames", >>> "name": "ur", >>> "params": { >>> "appName": "TinyApp", >>> "indexName": "urindex", >>> "typeName": "items", >>> "comment": "must have data for the first event or the model >>> will not build, other events are optional", >>> "eventNames": ["view"] >>> } >>> } >>> ] >>> } >>> >>> >>> On Oct 18, 2017, at 8:49 AM, Donald Szeto wrote: >>> >>> Chiming in a bit. Looking at the serialization error, it looks like we >>> are just one little step away from getting this to work. >>> >>> Noelia, what does your synthesized data look like? All data that is >>> processed by Spark needs to be serializable. At some point, a >>> non-serializable vector object showing in the stack is created out of y= our >>> synthesized data. It would be great to know what your input event looks >>> like and see where in the code path has caused this. >>> >>> Regards, >>> Donald >>> >>> On Tue, Oct 17, 2017 at 12:14 AM Noelia Os=C3=A9s Fern=C3=A1ndez < >>> noses@vicomtech.org> wrote: >>> >>>> Pat, you mentioned the problem could be that the data I was using was >>>> too small. So now I'm using the attached data file as the data (4 user= s and >>>> 100 items). But I'm still getting the same error. I'm sorry I forgot t= o >>>> mention I had increased the dataset. >>>> >>>> The reason why I want to make it work with a very small dataset is >>>> because I want to be able to follow the calculations. I want to unders= tand >>>> what the UR is doing and understand the impact of changing this or tha= t, >>>> here or there... I find that easier to achieve with a small example in >>>> which I know exactly what's happening. I want to build my trust on my >>>> understanding of the UR before I move on to applying it to a real prob= lem. >>>> If I'm not confident that I know how to use it, how can I tell my clie= nt >>>> that the results I'm getting are good with any degree of confidence? >>>> >>>> >>>> >>>> >>>> >>>> On 16 October 2017 at 20:44, Pat Ferrel wrote: >>>> >>>>> So all setup is the same for the integration-test and your modified >>>>> test *except the data*? >>>>> >>>>> The error looks like a setup problem because the serialization should >>>>> happen with either test. But if the only difference really is the dat= a, >>>>> then toss it and use either real data or the integration test data, w= hy are >>>>> you trying to synthesize fake data if it causes the error? >>>>> >>>>> BTW the data you include below in this thread would never create >>>>> internal IDs as high as 94 in the vector. You must have switched to a= new >>>>> dataset??? >>>>> >>>>> I would get a dump of your data using `pio export` and make sure it= =E2=80=99s >>>>> what you thought it was. You claim to have only 4 user ids and 4 item= ids >>>>> but the serialized vector thinks you have at least 94 of user or item= ids. >>>>> Something doesn=E2=80=99t add up. >>>>> >>>>> >>>>> On Oct 16, 2017, at 4:43 AM, Noelia Os=C3=A9s Fern=C3=A1ndez < >>>>> noses@vicomtech.org> wrote: >>>>> >>>>> Pat, you are absolutely right! I increased the sleep time and now the >>>>> integration test for handmade works perfectly. >>>>> >>>>> However, the integration test adapted to run with my tiny app runs >>>>> into the same problem I've been having with this app: >>>>> >>>>> [ERROR] [TaskSetManager] Task 1.0 in stage 10.0 (TID 23) had a not >>>>> serializable result: org.apache.mahout.math.RandomAccessSparseVector >>>>> Serialization stack: >>>>> - object not serializable (class: org.apache.mahout.math.RandomAc= cessSparseVector, >>>>> value: {66:1.0,29:1.0,70:1.0,91:1.0,58:1.0,37:1.0,13:1.0,8:1.0,94:1 >>>>> .0,30:1.0,57:1.0,22:1.0,20:1.0,35:1.0,97:1.0,60:1.0,27:1.0,7 >>>>> 2:1.0,3:1.0,34:1.0,77:1.0,46:1.0,81:1.0,86:1.0,43:1.0}) >>>>> - field (class: scala.Tuple2, name: _2, type: class >>>>> java.lang.Object) >>>>> - object (class scala.Tuple2, (1,{66:1.0,29:1.0,70:1.0,91:1. >>>>> 0,58:1.0,37:1.0,13:1.0,8:1.0,94:1.0,30:1.0,57:1.0,22:1.0,20: >>>>> 1.0,35:1.0,97:1.0,60:1.0,27:1.0,72:1.0,3:1.0,34:1.0,77:1.0,46:1.0,81:= 1.0,86:1.0,43:1.0})); >>>>> not retrying >>>>> [ERROR] [TaskSetManager] Task 2.0 in stage 10.0 (TID 24) had a not >>>>> serializable result: org.apache.mahout.math.RandomAccessSparseVector >>>>> Serialization stack: >>>>> >>>>> ... >>>>> >>>>> Any ideas? >>>>> >>>>> On 15 October 2017 at 19:09, Pat Ferrel wrote= : >>>>> >>>>>> This is probably a timing issue in the integration test, which has t= o >>>>>> wait for `pio deploy` to finish before the queries can be made. If i= t >>>>>> doesn=E2=80=99t finish the queries will fail. By the time the rest o= f the test >>>>>> quits the model has been deployed so you can run queries. In the >>>>>> integration-test script increase the delay after `pio deploy=E2=80= =A6` and see if >>>>>> it passes then. >>>>>> >>>>>> This is probably an integrtion-test script problem not a problem in >>>>>> the system >>>>>> >>>>>> >>>>>> >>>>>> On Oct 6, 2017, at 4:21 AM, Noelia Os=C3=A9s Fern=C3=A1ndez < >>>>>> noses@vicomtech.org> wrote: >>>>>> >>>>>> Pat, >>>>>> >>>>>> I have run the integration test for the handmade example out of >>>>>> curiosity. Strangely enough things go more or less as expected apart= from >>>>>> the fact that I get a message saying: >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> *...[INFO] [CoreWorkflow$] Updating engine instance[INFO] >>>>>> [CoreWorkflow$] Training completed successfully.Model will remain de= ployed >>>>>> after this testWaiting 30 seconds for the server to startnohup: redi= recting >>>>>> stderr to stdout % Total % Received % Xferd Average Speed Tim= e >>>>>> Time Time Current Dload Upload >>>>>> Total Spent Left Speed 0 0 0 0 0 0 0 = 0 >>>>>> --:--:-- --:--:-- --:--:-- 0curl: (7) Failed to connect to local= host >>>>>> port 8000: Connection refused* >>>>>> So the integration test does not manage to get the recommendations >>>>>> even though the model trained and deployed successfully. However, as= soon >>>>>> as the integration test finishes, on the same terminal, I can get th= e >>>>>> recommendations by doing the following: >>>>>> >>>>>> $ curl -H "Content-Type: application/json" -d ' >>>>>> > { >>>>>> > "user": "u1" >>>>>> > }' http://localhost:8000/queries.json >>>>>> {"itemScores":[{"item":"Nexus","score":0.057719700038433075} >>>>>> ,{"item":"Surface","score":0.0}]} >>>>>> >>>>>> Isn't this odd? Can you guess what's going on? >>>>>> >>>>>> Thank you very much for all your support! >>>>>> noelia >>>>>> >>>>>> >>>>>> >>>>>> On 5 October 2017 at 19:22, Pat Ferrel wrote= : >>>>>> >>>>>>> Ok, that config should work. Does the integration test pass? >>>>>>> >>>>>>> The data you are using is extremely small and though it does look >>>>>>> like it has cooccurrences, they may not meet minimum =E2=80=9Cbig-d= ata=E2=80=9D thresholds >>>>>>> used by default. Try adding more data or use the handmade example d= ata, >>>>>>> rename purchase to view and discard the existing view data if you w= ish. >>>>>>> >>>>>>> The error is very odd and I=E2=80=99ve never seen it. If the integr= ation >>>>>>> test works I can only surmise it's your data. >>>>>>> >>>>>>> >>>>>>> On Oct 5, 2017, at 12:02 AM, Noelia Os=C3=A9s Fern=C3=A1ndez < >>>>>>> noses@vicomtech.org> wrote: >>>>>>> >>>>>>> SPARK: spark-1.6.3-bin-hadoop2.6 >>>>>>> >>>>>>> PIO: 0.11.0-incubating >>>>>>> >>>>>>> Scala: whatever gets installed when installing PIO >>>>>>> 0.11.0-incubating, I haven't installed Scala separately >>>>>>> >>>>>>> UR: ActionML's UR v0.6.0 I suppose as that's the last version >>>>>>> mentioned in the readme file. I have attached the UR zip file I dow= nloaded >>>>>>> from the actionml github account. >>>>>>> >>>>>>> Thank you for your help!! >>>>>>> >>>>>>> On 4 October 2017 at 17:20, Pat Ferrel >>>>>>> wrote: >>>>>>> >>>>>>>> What version of Scala. Spark, PIO, and UR are you using? >>>>>>>> >>>>>>>> >>>>>>>> On Oct 4, 2017, at 6:10 AM, Noelia Os=C3=A9s Fern=C3=A1ndez < >>>>>>>> noses@vicomtech.org> wrote: >>>>>>>> >>>>>>>> Hi all, >>>>>>>> >>>>>>>> I'm still trying to create a very simple app to learn to use >>>>>>>> PredictionIO and still having trouble. I have done pio build no pr= oblem. >>>>>>>> But when I do pio train I get a very long error message related to >>>>>>>> serialisation (error message copied below). >>>>>>>> >>>>>>>> pio status reports system is all ready to go. >>>>>>>> >>>>>>>> The app I'm trying to build is very simple, it only has 'view' >>>>>>>> events. Here's the engine.json: >>>>>>>> >>>>>>>> *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D* >>>>>>>> { >>>>>>>> "comment":" This config file uses default settings for all but >>>>>>>> the required values see README.md for docs", >>>>>>>> "id": "default", >>>>>>>> "description": "Default settings", >>>>>>>> "engineFactory": "com.actionml.RecommendationEngine", >>>>>>>> "datasource": { >>>>>>>> "params" : { >>>>>>>> "name": "tiny_app_data.csv", >>>>>>>> "appName": "TinyApp", >>>>>>>> "eventNames": ["view"] >>>>>>>> } >>>>>>>> }, >>>>>>>> "algorithms": [ >>>>>>>> { >>>>>>>> "comment": "simplest setup where all values are default, >>>>>>>> popularity based backfill, must add eventsNames", >>>>>>>> "name": "ur", >>>>>>>> "params": { >>>>>>>> "appName": "TinyApp", >>>>>>>> "indexName": "urindex", >>>>>>>> "typeName": "items", >>>>>>>> "comment": "must have data for the first event or the >>>>>>>> model will not build, other events are optional", >>>>>>>> "eventNames": ["view"] >>>>>>>> } >>>>>>>> } >>>>>>>> ] >>>>>>>> } >>>>>>>> *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D* >>>>>>>> >>>>>>>> The data I'm using is: >>>>>>>> >>>>>>>> "u1","i1" >>>>>>>> "u2","i1" >>>>>>>> "u2","i2" >>>>>>>> "u3","i2" >>>>>>>> "u3","i3" >>>>>>>> "u4","i4" >>>>>>>> >>>>>>>> meaning user u viewed item i. >>>>>>>> >>>>>>>> The data has been added to the database with the following python >>>>>>>> code: >>>>>>>> >>>>>>>> *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D* >>>>>>>> """ >>>>>>>> Import sample data for recommendation engine >>>>>>>> """ >>>>>>>> >>>>>>>> import predictionio >>>>>>>> import argparse >>>>>>>> import random >>>>>>>> >>>>>>>> RATE_ACTIONS_DELIMITER =3D "," >>>>>>>> SEED =3D 1 >>>>>>>> >>>>>>>> >>>>>>>> def import_events(client, file): >>>>>>>> f =3D open(file, 'r') >>>>>>>> random.seed(SEED) >>>>>>>> count =3D 0 >>>>>>>> print "Importing data..." >>>>>>>> >>>>>>>> items =3D [] >>>>>>>> users =3D [] >>>>>>>> f =3D open(file, 'r') >>>>>>>> for line in f: >>>>>>>> data =3D line.rstrip('\r\n').split(RATE_ACTIONS_DELIMITER) >>>>>>>> users.append(data[0]) >>>>>>>> items.append(data[1]) >>>>>>>> client.create_event( >>>>>>>> event=3D"view", >>>>>>>> entity_type=3D"user", >>>>>>>> entity_id=3Ddata[0], >>>>>>>> target_entity_type=3D"item", >>>>>>>> target_entity_id=3Ddata[1] >>>>>>>> ) >>>>>>>> print "Event: " + "view" + " entity_id: " + data[0] + " >>>>>>>> target_entity_id: " + data[1] >>>>>>>> count +=3D 1 >>>>>>>> f.close() >>>>>>>> >>>>>>>> users =3D set(users) >>>>>>>> items =3D set(items) >>>>>>>> print "All users: " + str(users) >>>>>>>> print "All items: " + str(items) >>>>>>>> for item in items: >>>>>>>> client.create_event( >>>>>>>> event=3D"$set", >>>>>>>> entity_type=3D"item", >>>>>>>> entity_id=3Ditem >>>>>>>> ) >>>>>>>> count +=3D 1 >>>>>>>> >>>>>>>> >>>>>>>> print "%s events are imported." % count >>>>>>>> >>>>>>>> >>>>>>>> if __name__ =3D=3D '__main__': >>>>>>>> parser =3D argparse.ArgumentParser( >>>>>>>> description=3D"Import sample data for recommendation engine") >>>>>>>> parser.add_argument('--access_key', default=3D'invald_access_key= ') >>>>>>>> parser.add_argument('--url', default=3D"http://localhost:7070") >>>>>>>> parser.add_argument('--file', default=3D"./data/tiny_app_data.cs= v") >>>>>>>> >>>>>>>> args =3D parser.parse_args() >>>>>>>> print args >>>>>>>> >>>>>>>> client =3D predictionio.EventClient( >>>>>>>> access_key=3Dargs.access_key, >>>>>>>> url=3Dargs.url, >>>>>>>> threads=3D5, >>>>>>>> qsize=3D500) >>>>>>>> import_events(client, args.file) >>>>>>>> *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D* >>>>>>>> >>>>>>>> My pio_env.sh is the following: >>>>>>>> >>>>>>>> *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D* >>>>>>>> #!/usr/bin/env bash >>>>>>>> # >>>>>>>> # Copy this file as pio-env.sh and edit it for your site's >>>>>>>> configuration. >>>>>>>> # >>>>>>>> # Licensed to the Apache Software Foundation (ASF) under one or mo= re >>>>>>>> # contributor license agreements. See the NOTICE file distributed >>>>>>>> with >>>>>>>> # this work for additional information regarding copyright >>>>>>>> ownership. >>>>>>>> # The ASF licenses this file to You under the Apache License, >>>>>>>> Version 2.0 >>>>>>>> # (the "License"); you may not use this file except in compliance >>>>>>>> with >>>>>>>> # the License. You may obtain a copy of the License at >>>>>>>> # >>>>>>>> # http://www.apache.org/licenses/LICENSE-2.0 >>>>>>>> # >>>>>>>> # Unless required by applicable law or agreed to in writing, >>>>>>>> software >>>>>>>> # distributed under the License is distributed on an "AS IS" BASIS= , >>>>>>>> # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >>>>>>>> implied. >>>>>>>> # See the License for the specific language governing permissions >>>>>>>> and >>>>>>>> # limitations under the License. >>>>>>>> # >>>>>>>> >>>>>>>> # PredictionIO Main Configuration >>>>>>>> # >>>>>>>> # This section controls core behavior of PredictionIO. It is very >>>>>>>> likely that >>>>>>>> # you need to change these to fit your site. >>>>>>>> >>>>>>>> # SPARK_HOME: Apache Spark is a hard dependency and must be >>>>>>>> configured. >>>>>>>> # SPARK_HOME=3D$PIO_HOME/vendors/spark-2.0.2-bin-hadoop2.7 >>>>>>>> SPARK_HOME=3D$PIO_HOME/vendors/spark-1.6.3-bin-hadoop2.6 >>>>>>>> >>>>>>>> POSTGRES_JDBC_DRIVER=3D$PIO_HOME/lib/postgresql-42.1.4.jar >>>>>>>> MYSQL_JDBC_DRIVER=3D$PIO_HOME/lib/mysql-connector-java-5.1.41.jar >>>>>>>> >>>>>>>> # ES_CONF_DIR: You must configure this if you have advanced >>>>>>>> configuration for >>>>>>>> # your Elasticsearch setup. >>>>>>>> # ES_CONF_DIR=3D/opt/elasticsearch >>>>>>>> #ES_CONF_DIR=3D$PIO_HOME/vendors/elasticsearch-1.7.6 >>>>>>>> >>>>>>>> # HADOOP_CONF_DIR: You must configure this if you intend to run >>>>>>>> PredictionIO >>>>>>>> # with Hadoop 2. >>>>>>>> # HADOOP_CONF_DIR=3D/opt/hadoop >>>>>>>> >>>>>>>> # HBASE_CONF_DIR: You must configure this if you intend to run >>>>>>>> PredictionIO >>>>>>>> # with HBase on a remote cluster. >>>>>>>> # HBASE_CONF_DIR=3D$PIO_HOME/vendors/hbase-1.0.0/conf >>>>>>>> >>>>>>>> # Filesystem paths where PredictionIO uses as block storage. >>>>>>>> PIO_FS_BASEDIR=3D$HOME/.pio_store >>>>>>>> PIO_FS_ENGINESDIR=3D$PIO_FS_BASEDIR/engines >>>>>>>> PIO_FS_TMPDIR=3D$PIO_FS_BASEDIR/tmp >>>>>>>> >>>>>>>> # PredictionIO Storage Configuration >>>>>>>> # >>>>>>>> # This section controls programs that make use of PredictionIO's >>>>>>>> built-in >>>>>>>> # storage facilities. Default values are shown below. >>>>>>>> # >>>>>>>> # For more information on storage configuration please refer to >>>>>>>> # http://predictionio.incubator.apache.org/system/anotherdatastore= / >>>>>>>> >>>>>>>> # Storage Repositories >>>>>>>> >>>>>>>> # Default is to use PostgreSQL >>>>>>>> PIO_STORAGE_REPOSITORIES_METADATA_NAME=3Dpio_meta >>>>>>>> PIO_STORAGE_REPOSITORIES_METADATA_SOURCE=3DELASTICSEARCH >>>>>>>> >>>>>>>> PIO_STORAGE_REPOSITORIES_EVENTDATA_NAME=3Dpio_event >>>>>>>> PIO_STORAGE_REPOSITORIES_EVENTDATA_SOURCE=3DHBASE >>>>>>>> >>>>>>>> PIO_STORAGE_REPOSITORIES_MODELDATA_NAME=3Dpio_model >>>>>>>> PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE=3DLOCALFS >>>>>>>> >>>>>>>> # Storage Data Sources >>>>>>>> >>>>>>>> # PostgreSQL Default Settings >>>>>>>> # Please change "pio" to your database name in >>>>>>>> PIO_STORAGE_SOURCES_PGSQL_URL >>>>>>>> # Please change PIO_STORAGE_SOURCES_PGSQL_USERNAME and >>>>>>>> # PIO_STORAGE_SOURCES_PGSQL_PASSWORD accordingly >>>>>>>> PIO_STORAGE_SOURCES_PGSQL_TYPE=3Djdbc >>>>>>>> PIO_STORAGE_SOURCES_PGSQL_URL=3Djdbc:postgresql://localhost/pio >>>>>>>> PIO_STORAGE_SOURCES_PGSQL_USERNAME=3Dpio >>>>>>>> PIO_STORAGE_SOURCES_PGSQL_PASSWORD=3Dpio >>>>>>>> >>>>>>>> # MySQL Example >>>>>>>> # PIO_STORAGE_SOURCES_MYSQL_TYPE=3Djdbc >>>>>>>> # PIO_STORAGE_SOURCES_MYSQL_URL=3Djdbc:mysql://localhost/pio >>>>>>>> # PIO_STORAGE_SOURCES_MYSQL_USERNAME=3Dpio >>>>>>>> # PIO_STORAGE_SOURCES_MYSQL_PASSWORD=3Dpio >>>>>>>> >>>>>>>> # Elasticsearch Example >>>>>>>> # PIO_STORAGE_SOURCES_ELASTICSEARCH_TYPE=3Delasticsearch >>>>>>>> # PIO_STORAGE_SOURCES_ELASTICSEARCH_HOSTS=3Dlocalhost >>>>>>>> # PIO_STORAGE_SOURCES_ELASTICSEARCH_PORTS=3D9200 >>>>>>>> # PIO_STORAGE_SOURCES_ELASTICSEARCH_SCHEMES=3Dhttp >>>>>>>> # PIO_STORAGE_SOURCES_ELASTICSEARCH_HOME=3D$PIO_HOME/vendors/ela >>>>>>>> sticsearch-5.2.1 >>>>>>>> # Elasticsearch 1.x Example >>>>>>>> PIO_STORAGE_SOURCES_ELASTICSEARCH_TYPE=3Delasticsearch >>>>>>>> PIO_STORAGE_SOURCES_ELASTICSEARCH_CLUSTERNAME=3DmyprojectES >>>>>>>> PIO_STORAGE_SOURCES_ELASTICSEARCH_HOSTS=3Dlocalhost >>>>>>>> PIO_STORAGE_SOURCES_ELASTICSEARCH_PORTS=3D9300 >>>>>>>> PIO_STORAGE_SOURCES_ELASTICSEARCH_HOME=3D$PIO_HOME/vendors/ela >>>>>>>> sticsearch-1.7.6 >>>>>>>> >>>>>>>> # Local File System Example >>>>>>>> PIO_STORAGE_SOURCES_LOCALFS_TYPE=3Dlocalfs >>>>>>>> PIO_STORAGE_SOURCES_LOCALFS_PATH=3D$PIO_FS_BASEDIR/models >>>>>>>> >>>>>>>> # HBase Example >>>>>>>> PIO_STORAGE_SOURCES_HBASE_TYPE=3Dhbase >>>>>>>> PIO_STORAGE_SOURCES_HBASE_HOME=3D$PIO_HOME/vendors/hbase-1.2.6 >>>>>>>> >>>>>>>> >>>>>>>> *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3DError >>>>>>>> message:* >>>>>>>> >>>>>>>> *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D* >>>>>>>> [ERROR] [TaskSetManager] Task 2.0 in stage 10.0 (TID 24) had a not >>>>>>>> serializable result: org.apache.mahout.math.RandomA >>>>>>>> ccessSparseVector >>>>>>>> Serialization stack: >>>>>>>> - object not serializable (class: >>>>>>>> org.apache.mahout.math.RandomAccessSparseVector, value: >>>>>>>> {3:1.0,2:1.0}) >>>>>>>> - field (class: scala.Tuple2, name: _2, type: class >>>>>>>> java.lang.Object) >>>>>>>> - object (class scala.Tuple2, (2,{3:1.0,2:1.0})); not retrying >>>>>>>> [ERROR] [TaskSetManager] Task 3.0 in stage 10.0 (TID 25) had a not >>>>>>>> serializable result: org.apache.mahout.math.RandomA >>>>>>>> ccessSparseVector >>>>>>>> Serialization stack: >>>>>>>> - object not serializable (class: >>>>>>>> org.apache.mahout.math.RandomAccessSparseVector, value: >>>>>>>> {0:1.0,3:1.0}) >>>>>>>> - field (class: scala.Tuple2, name: _2, type: class >>>>>>>> java.lang.Object) >>>>>>>> - object (class scala.Tuple2, (3,{0:1.0,3:1.0})); not retrying >>>>>>>> [ERROR] [TaskSetManager] Task 1.0 in stage 10.0 (TID 23) had a not >>>>>>>> serializable result: org.apache.mahout.math.RandomA >>>>>>>> ccessSparseVector >>>>>>>> Serialization stack: >>>>>>>> - object not serializable (class: >>>>>>>> org.apache.mahout.math.RandomAccessSparseVector, value: {1:1.0}) >>>>>>>> - field (class: scala.Tuple2, name: _2, type: class >>>>>>>> java.lang.Object) >>>>>>>> - object (class scala.Tuple2, (1,{1:1.0})); not retrying >>>>>>>> [ERROR] [TaskSetManager] Task 0.0 in stage 10.0 (TID 22) had a not >>>>>>>> serializable result: org.apache.mahout.math.RandomA >>>>>>>> ccessSparseVector >>>>>>>> Serialization stack: >>>>>>>> - object not serializable (class: >>>>>>>> org.apache.mahout.math.RandomAccessSparseVector, value: {0:1.0}) >>>>>>>> - field (class: scala.Tuple2, name: _2, type: class >>>>>>>> java.lang.Object) >>>>>>>> - object (class scala.Tuple2, (0,{0:1.0})); not retrying >>>>>>>> Exception in thread "main" org.apache.spark.SparkException: Job >>>>>>>> aborted due to stage failure: Task 2.0 in stage 10.0 (TID 24) had = a not >>>>>>>> serializable result: org.apache.mahout.math.RandomA >>>>>>>> ccessSparseVector >>>>>>>> Serialization stack: >>>>>>>> - object not serializable (class: >>>>>>>> org.apache.mahout.math.RandomAccessSparseVector, value: >>>>>>>> {3:1.0,2:1.0}) >>>>>>>> - field (class: scala.Tuple2, name: _2, type: class >>>>>>>> java.lang.Object) >>>>>>>> - object (class scala.Tuple2, (2,{3:1.0,2:1.0})) >>>>>>>> at org.apache.spark.scheduler.DAGScheduler.org >>>>>>>> $apache$sp >>>>>>>> ark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGS >>>>>>>> cheduler.scala:1431) >>>>>>>> at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage= $ >>>>>>>> 1.apply(DAGScheduler.scala:1419) >>>>>>>> at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage= $ >>>>>>>> 1.apply(DAGScheduler.scala:1418) >>>>>>>> at scala.collection.mutable.ResizableArray$class.foreach(Resiz= a >>>>>>>> bleArray.scala:59) >>>>>>>> at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.sc= a >>>>>>>> la:47) >>>>>>>> at org.apache.spark.scheduler.DAGScheduler.abortStage(DAGSched= u >>>>>>>> ler.scala:1418) >>>>>>>> at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTask= S >>>>>>>> etFailed$1.apply(DAGScheduler.scala:799) >>>>>>>> at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTask= S >>>>>>>> etFailed$1.apply(DAGScheduler.scala:799) >>>>>>>> at scala.Option.foreach(Option.scala:236) >>>>>>>> at org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed= ( >>>>>>>> DAGScheduler.scala:799) >>>>>>>> at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doO= n >>>>>>>> Receive(DAGScheduler.scala:1640) >>>>>>>> at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onR= e >>>>>>>> ceive(DAGScheduler.scala:1599) >>>>>>>> at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onR= e >>>>>>>> ceive(DAGScheduler.scala:1588) >>>>>>>> at org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala= : >>>>>>>> 48) >>>>>>>> at org.apache.spark.scheduler.DAGScheduler.runJob(DAGScheduler= . >>>>>>>> scala:620) >>>>>>>> at org.apache.spark.SparkContext.runJob(SparkContext.scala:183= 2 >>>>>>>> ) >>>>>>>> at org.apache.spark.SparkContext.runJob(SparkContext.scala:195= 2 >>>>>>>> ) >>>>>>>> at org.apache.spark.rdd.RDD$$anonfun$fold$1.apply(RDD.scala:10= 8 >>>>>>>> 8) >>>>>>>> at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperat= i >>>>>>>> onScope.scala:150) >>>>>>>> at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperat= i >>>>>>>> onScope.scala:111) >>>>>>>> at org.apache.spark.rdd.RDD.withScope(RDD.scala:316) >>>>>>>> at org.apache.spark.rdd.RDD.fold(RDD.scala:1082) >>>>>>>> at org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark.co= m >>>>>>>> >>>>>>>> puteNRow(CheckpointedDrmSpark.scala:188) >>>>>>>> at org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark.nr= o >>>>>>>> w$lzycompute(CheckpointedDrmSpark.scala:55) >>>>>>>> at org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark.nr= o >>>>>>>> w(CheckpointedDrmSpark.scala:55) >>>>>>>> at org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark.ne= w >>>>>>>> RowCardinality(CheckpointedDrmSpark.scala:219) >>>>>>>> at com.actionml.IndexedDatasetSpark$.apply(Preparator.scala:21= 3 >>>>>>>> ) >>>>>>>> at com.actionml.Preparator$$anonfun$3.apply(Preparator.scala:7= 1 >>>>>>>> ) >>>>>>>> at com.actionml.Preparator$$anonfun$3.apply(Preparator.scala:4= 9 >>>>>>>> ) >>>>>>>> at scala.collection.TraversableLike$$anonfun$map$1.apply(Trave= r >>>>>>>> sableLike.scala:244) >>>>>>>> at scala.collection.TraversableLike$$anonfun$map$1.apply(Trave= r >>>>>>>> sableLike.scala:244) >>>>>>>> at scala.collection.immutable.List.foreach(List.scala:318) >>>>>>>> at scala.collection.TraversableLike$class.map(TraversableLike.= s >>>>>>>> cala:244) >>>>>>>> at scala.collection.AbstractTraversable.map(Traversable.scala:= 1 >>>>>>>> 05) >>>>>>>> at com.actionml.Preparator.prepare(Preparator.scala:49) >>>>>>>> at com.actionml.Preparator.prepare(Preparator.scala:32) >>>>>>>> at org.apache.predictionio.controller.PPreparator.prepareBase(= P >>>>>>>> Preparator.scala:37) >>>>>>>> at org.apache.predictionio.controller.Engine$.train(Engine.sca= l >>>>>>>> a:671) >>>>>>>> at org.apache.predictionio.controller.Engine.train(Engine.scal= a >>>>>>>> :177) >>>>>>>> at org.apache.predictionio.workflow.CoreWorkflow$.runTrain(Cor= e >>>>>>>> Workflow.scala:67) >>>>>>>> at org.apache.predictionio.workflow.CreateWorkflow$.main(Creat= e >>>>>>>> Workflow.scala:250) >>>>>>>> at org.apache.predictionio.workflow.CreateWorkflow.main(Create= W >>>>>>>> orkflow.scala) >>>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcc= e >>>>>>>> ssorImpl.java:62) >>>>>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingM= e >>>>>>>> thodAccessorImpl.java:43) >>>>>>>> at java.lang.reflect.Method.invoke(Method.java:498) >>>>>>>> at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deplo= y >>>>>>>> $SparkSubmit$$runMain(SparkSubmit.scala:731) >>>>>>>> at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmi= t >>>>>>>> .scala:181) >>>>>>>> at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.sca= l >>>>>>>> a:206) >>>>>>>> at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala= : >>>>>>>> 121) >>>>>>>> at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) >>>>>>>> >>>>>>>> *=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D* >>>>>>>> Thank you all for your help. >>>>>>>> >>>>>>>> Best regards, >>>>>>>> noelia >>>>>>>> >>>>>>>> >>>>>>> >> >> >> >> >> >> >> >> -- >> You received this message because you are subscribed to the Google Group= s >> "actionml-user" group. >> To unsubscribe from this group and stop receiving emails from it, send a= n >> email to actionml-user+unsubscribe@googlegroups.com. >> To post to this group, send email to actionml-user@googlegroups.com. >> To view this discussion on the web visit https://groups.google.co >> m/d/msgid/actionml-user/CAMysefsW%3DeYPjUE1pc67C9D312HL_xNMt >> zmStUwDsUdHCCVU-Q%40mail.gmail.com >> >> . >> For more options, visit https://groups.google.com/d/optout. >> >> >> -- >> You received this message because you are subscribed to the Google Group= s >> "actionml-user" group. >> To unsubscribe from this group and stop receiving emails from it, send a= n >> email to actionml-user+unsubscribe@googlegroups.com. >> To post to this group, send email to actionml-user@googlegroups.com. >> To view this discussion on the web visit https://groups.google. >> com/d/msgid/actionml-user/ACE11A1B-C887-41F1-820B- >> 3B161EDCDABA%40occamsmachete.com >> >> . >> For more options, visit https://groups.google.com/d/optout. >> >> > > > -- > > > Noelia Os=C3=A9s Fern=C3=A1ndez, PhD > Senior Researcher | > Investigadora Senior > > noses@vicomtech.org > +[34] 943 30 92 30 > Data Intelligence for Energy and > Industrial Processes | Inteligencia > de Datos para Energ=C3=ADa y Procesos > Industriales > > > > > > member of: > > Legal Notice - Privacy policy > > > -- > You received this message because you are subscribed to the Google Groups > "actionml-user" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to actionml-user+unsubscribe@googlegroups.com. > To post to this group, send email to actionml-user@googlegroups.com. > To view this discussion on the web visit https://groups.google. > com/d/msgid/actionml-user/CAMysefsy0K66O9CJw- > j3qdkN7rqoXrwHOsmgaNQTioeLuvX7Xg%40mail.gmail.com > > . > For more options, visit https://groups.google.com/d/optout. > > --=20 Noelia Os=C3=A9s Fern=C3=A1ndez, PhD Senior Researcher | Investigadora Senior noses@vicomtech.org +[34] 943 30 92 30 Data Intelligence for Energy and Industrial Processes | Inteligencia de Datos para Energ=C3=ADa y Procesos Industriales member of: Legal Notice - Privacy policy --001a114445f8b356a1055c31dd49 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Thanks Pat!

On 20 October 2017 at 16:53, Pat Ferrel <pat@occa= msmachete.com> wrote:
There are several algorithm resources.=C2=A0=

The benefit of the CCO algorithm in the UR = comes into play when you have more than just conversions (buy for ecom, vie= w for you) For just about all other recommenders you really can only use on= e indicator of user preference. Several experiments, including ones I=E2=80= =99ve done, show you cannot mix buys with detail-views in ecom or your resu= lts will be worse=E2=80=94that is with single event recommenders like the S= park MLlib recommenders. The UR uses multi-modal input so you can indeed im= prove results when using buys with detail-views. The second post actually s= hows how dislikes can improve results when you want to predict likes.
=

In order to do this the CCO algorithm finds events that= are correlated, but it uses a statistical method that is suspicious of 100= % correlation since this is likely anomalous in the real world (caused by p= romotions, give-aways, other anomalous outside influences). This statistica= l method is called the log likelihood ratio.

On Oct 20, 2017, at 12:17 AM, Noelia Os=C3=A9s Fern=C3=A1n= dez <noses@vico= mtech.org> wrote:

Thanks for the explanation, Pat!

I think the best course of= action is for me to read the documentation and understand how the algorith= m works. Then, try again with a slightly larger dataset.

Thank= you very much!

On 19 October 2017 at 17:15, Pat Ferrel=C2=A0<pat@occamsmachete.com><= /span>=C2= =A0wrote:
This sample dataset is too small with too few cooccurrences. U1 will nev= er get i1 due to the blacklist (u1 has already viewed i1 so will not be rec= ommended that again). The blacklist can be disable if you want to recommend= viewed items again but beware that they may predominate every recommendati= ons set if you do tun it off since it is self-fulfilling. Why not i2, not s= ure without running the math, the UR looks at things statistically and with= this small a dataset anomalies can be seen since the data is not statistic= ally significant. I1 will show up in internal intermediate results (A=E2=80= =99A for instance) but these are then filtered by a statistical test called= LLR, which requires a certain amount of data to work.=C2=A0

Notice the handmade datas= et has many more cooccurrences and produces understandable results. Also no= tice that in your dataset i3 and i4 can only be recommended by =E2=80=9Cpop= ularity=E2=80=9D since they have no cooccurrence.=C2=A0



<= div>On Oct 19, 2017, at 1:28 AM, Noelia Os=C3=A9s Fern=C3=A1ndez <noses@vicomtech.org&= gt; wrote:

Pat, this worked!!!!! Th= ank you very much!!!!

The only odd thing now is that all the r= esults I get now are 0s. For example:

Using the dataset:
"u1","i1"
"u2","i1"
"u= 2","i2"
"u3","i2"
"u3",&= quot;i3"
"u4","i4"

echo "Recom= mendations for user: u1"
echo ""
curl -H "Content= -Type: application/json" -d '
{
=C2=A0=C2=A0=C2=A0=C2=A0"user&qu= ot;: "u1"
}'=C2=A0http://localhost:8000/queries.js= on
echo ""

What I get is:
=

{"itemScores":[{"item":"\"i2\&= quot;","score":0.0},{"item":"\"i1\&= quot;","score":0.0},{"item":"\"i3\&= quot;","score":0.0},{"item":"\"i4\&= quot;","score":0.0}]}


If user u1 has viewed i1 and user u2 has viewed i1 and i2 then I thi= nk the algorithm should return a non-zore score for i2 (and possible i1, to= o).

Even using the bigger dataset with 100 items I= still get all scores 0s.

So now I'm going= to spend some time reading the following documentation, unless there is so= me other documentation you recommend I read first!

=C2=A0- [The Universal Recommender](http://actionml.com/docs/ur)
=C2=A0- [The C= orrelated Cross-Occurrence Algorithm](http://mah= out.apache.org/users/algorithms/intro-cooccurrence-spark.html= )
=C2=A0- [The Universal Recommender Slide Deck](http:= //www.slideshare.net/pferrel/unified-recommender-39986309)=C2=A0- [Multi-domain predictive AI or how to make one thing predict anoth= er](https://developer.ibm.com/dwblo= g/2017/mahout-spark-correlated-cross-occurences/)
Thank you very much for all your patience and help getting me = to this point!!!

Best regards,
Noelia


On 18 October 2017 at 18:33, Pat Ferrel=C2=A0<pat@oc= camsmachete.com>=C2=A0wrote:
It is the UR so Events are taken = from the EventStore and converted into a Mahout DistributedRowMatrix of Ran= domAccessSparseVectors, which are both serializable. This path works fine a= nd has for several years.

This must be a config problem,= like not using the MahoutKryoRegistrator, which registers the serializers = for these.

@Noelia, you have left out the sparkCon= f section of the engine.json. The one used in the integration test should w= ork:

{
=C2=A0=C2=A0"comment":" This config file uses default settings for all = but the required values see README.md for docs",
=C2=A0=C2=A0"id": "default",
=C2=A0=C2=A0"description": "Default settings",=C2=A0=C2=A0"engineFactory": "com.ac= tionml.RecommendationEngine",
=C2=A0=C2=A0"datasource": {
=C2=A0=C2=A0=C2=A0=C2=A0"params" : {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"name": "tiny_app_data.csv",
=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0"appName": &quo= t;TinyApp",
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"eventNames": ["view"]
=C2=A0=C2=A0=C2=A0=C2=A0}
=C2=A0=C2=A0},
=C2=A0=C2=A0"sparkConf":=C2=A0{ <=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D THIS WAS LEFT OUT IN YOUR ENGINE= .JSON BELOW IN THIS THREAD
=C2=A0 =C2=A0=C2=A0"spark.serializer&quo= t;:=C2=A0"org.apache.spark.serializer.KryoSerializer",<= br>=C2=A0 =C2=A0=C2=A0"spark.kryo.registrator":=C2=A0"o= rg.apache.mahout.spa= rkbindings.io.MahoutKryoRegistrator",
=C2=A0 =C2=A0=C2=A0&= quot;spark.kryo.referenceTracking":=C2=A0"false",
= =C2=A0 =C2=A0=C2=A0"spark.kryoserializer.buffer":=C2=A0"= ;300m",
=C2=A0 =C2=A0=C2=A0"es.index.auto.create":=C2=A0&= quot;true"
=C2=A0=C2=A0},
=C2=A0=C2=A0"algorithms": [
=C2=A0=C2=A0=C2=A0=C2=A0{
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0"comment": "simplest setup where all values are= default, popularity based backfill, must add eventsNames",
=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"name": &quo= t;ur",
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&= quot;params": {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"appName": "TinyApp",
=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"indexNa= me": "urindex",
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0"typeName": "items",=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&qu= ot;comment": "must have data for the first event or the model wil= l not build, other events are optional",
=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0"eventNames": [&qu= ot;view"]
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0}
=C2=A0=C2=A0=C2=A0=C2=A0}
=C2=A0=C2=A0]
}


On Oct 18, 2= 017, at 8:49 AM, Donald Szeto <donald@apache.org> wrote:

Chiming in a bit. Looking at the serializa= tion error, it looks like we are just one little step away from getting thi= s to work.

Noelia, what = does your synthesized data look like? All data that is processed by Spark n= eeds to be serializable. At some point, a non-serializable vector object sh= owing in the stack is created out of your synthesized data. It would be gre= at to know what your input event looks like and see where in the code path = has caused this.

Regards= ,
Donald

On= Tue, Oct 17, 2017 at 12:14 AM Noelia Os=C3=A9s Fern=C3=A1ndez <noses@vicomtech.org&g= t; wrote:
Pat, you mentioned the proble= m could be that the data I was using was too small. So now I'm using th= e attached data file as the data (4 users and 100 items). But I'm still= getting the same error. I'm sorry I forgot to mention I had increased = the dataset.

The reason why I want to make it work with a very= small dataset is because I want to be able to follow the calculations. I w= ant to understand what the UR is doing and understand the impact of changin= g this or that, here or there... I find that easier to achieve with a small= example in which I know exactly what's happening. I want to build my t= rust on my understanding of the UR before I move on to applying it to a rea= l problem. If I'm not confident that I know how to use it, how can I te= ll my client that the results I'm getting are good with any degree of c= onfidence?




<= br>
On 16 October 2017 at 20:44, Pat Ferrel=C2=A0<pat@occamsmachete.com>=C2=A0wrote:
So all setup is the same for the integration-test= and your modified test *except the data*?

The error loo= ks like a setup problem because the serialization should happen with either= test. But if the only difference really is the data, then toss it and use = either real data or the integration test data, why are you trying to synthe= size fake data if it causes the error?

BTW the dat= a you include below in this thread would never create internal IDs as high = as 94 in the vector. You must have switched to a new dataset???
<= br>
I would get a dump of your data using `pio export` and make s= ure it=E2=80=99s what you thought it was. You claim to have only 4 user ids= and 4 item ids but the serialized vector thinks you have at least 94 of us= er or item ids. Something doesn=E2=80=99t add up.


On Oct 16, 2017, at 4= :43 AM, Noelia Os=C3=A9s Fern=C3=A1ndez <noses@vicomtech.org> wrote:

<= div>Pat, you are absolutely right! I increased the sleep time and now the i= ntegration test for handmade works perfectly.

However, the int= egration test adapted to run with my tiny app runs into the same problem I&= #39;ve been having with this app:=C2=A0

[ERROR] [TaskSetManager] = Task 1.0 in stage 10.0 (TID 23) had a not serializable result: org.apache.m= ahout.math.RandomAccessSparseVector
Serialization stack:
=C2=A0= =C2=A0=C2=A0=C2=A0- object not serializa= ble (class: org.apache.mahout.math.RandomAccessSparseVector, value: {6= 6:1.0,29:1.0,70:1.0,91:1.0,58:1.0,37:1.0,13:1.0,8:1.0,94:1.0,30:1= .0,57:1.0,22:1.0,20:1.0,35:1.0,97:1.0,60:1.0,27:1.0,72:1.0,3:1.0,= 34:1.0,77:1.0,46:1.0,81:1.0,86:1.0,43:1.0})
=C2=A0=C2=A0=C2=A0=C2=A0- field (class: scala.Tuple2, name: _2,= type: class java.lang.Object)
=C2=A0=C2=A0=C2=A0=C2=A0- object (class scala.Tuple2, (1,{66:1.0,29:1.0,70:1.0,91= :1.0,58:1.0,37:1.0,13:1.0,8:1.0,94:1.0,30:1.0,57:1.0,22:1.0,20:1.0,35:1.0,97:1.0,60:1.0,27:1.0,72:1.0,3:1.0,34:1.0,77:1.0,46:= 1.0,81:1.0,86:1.0,43:1.0})); not retrying
[ERROR] [TaskSetManager] Task = 2.0 in stage 10.0 (TID 24) had a not serializable result: org.apache.mahout= .math.RandomAccessSparseVector
Serialization stack:

...
<= br>
Any ideas?

On 15 October 2017 at 19:09, Pat Ferrel=C2=A0<pat@occamsmachete.com&= gt;=C2=A0wrote:
This is probably a timing issue in the integration test, whic= h has to wait for `pio deploy` to finish before the queries can be made. If= it doesn=E2=80=99t finish the queries will fail. By the time the rest of t= he test quits the model has been deployed so you can run queries. In the in= tegration-test script increase the delay after `pio deploy=E2=80=A6` and se= e if it passes then.

This is probably an integrtion-test= script problem not a problem in the system



<= div>On Oct 6, 2017, at 4:21 AM, Noelia Os=C3=A9s Fern=C3=A1ndez <noses@vicomtech.org&g= t; wrote:

Pat,

I= have run the integration test for the handmade example out of curiosity. S= trangely enough things go more or less as expected apart from the fact that= I get a message saying:

...
[INFO] [CoreWorkflow$] Updating e= ngine instance
[INFO] [CoreWorkflow$] Training completed successfully.Model will remain deployed after this test
Waiting 30 seconds for the = server to start
nohup: redirecting stderr to stdout
=C2=A0=C2=A0% = Total=C2=A0=C2=A0=C2=A0 % Received % Xferd=C2=A0 Average Speed=C2=A0=C2=A0 = Time=C2=A0=C2=A0=C2=A0 Time=C2=A0=C2=A0=C2=A0=C2=A0 Time=C2=A0 Current
= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Dload=C2=A0 Upload= =C2=A0=C2=A0 Total=C2=A0=C2=A0 Spent=C2=A0=C2=A0=C2=A0 Left=C2=A0 Speed
= =C2=A0=C2=A0http://localhost:8000/queries.json
{"ite= mScores":[{"item":"Nexus","score":0= .057719700038433075},{"item":"Surface","score= ":0.0}]}

Isn't this odd? Can you guess what'= s going on?

Thank you very much for all your support!
noelia



On 5 October 2017 at 19:22, = Pat Ferrel=C2=A0<pat@occamsmachete.com>=C2=A0wrote:
Ok, that config should work. Does the integration test pass= ?

The data you are using is extremely small and though i= t does look like it has cooccurrences, they may not meet minimum =E2=80=9Cb= ig-data=E2=80=9D thresholds used by default. Try adding more data or use th= e handmade example data, rename purchase to view and discard the existing v= iew data if you wish.

The error is very odd and I= =E2=80=99ve never seen it. If the integration test works I can only surmise= it's your data.


On Oct 5, 2017= , at 12:02 AM, Noelia Os=C3=A9s Fern=C3=A1ndez <noses@vicomtech.org> wrote:
SPARK: s= park-1.6.3-bin-hadoop2.6

PIO: 0.11.0-incubating

S= cala: whatever gets installed when installing PIO 0.11.0-incubating, I have= n't installed Scala separately

UR: ActionML's UR v0.6.= 0 I suppose as that's the last version mentioned in the readme file. I = have attached the UR zip file I downloaded from the actionml github account= .

Thank you for your help!!

On 4 October 2017 at 17:20, Pat Ferrel=C2=A0<pat@occamsmachete.com>=C2=A0wrote:
What version of Scala. Spark, PIO, and UR are you using?


On Oct 4, 2017, at 6:10 AM, Noelia= Os=C3=A9s Fern=C3=A1ndez <noses@vicomtech.org> wrote:

Hi all,<= /div>

I'm still trying to create a very simple app t= o learn to use PredictionIO and still having trouble. I have done pio build= no problem. But when I do pio train I get a very long error message relate= d to serialisation (error message copied below).

p= io status reports system is all ready to go.

T= he app I'm trying to build is very simple, it only has 'view' e= vents. Here's the engine.json:

=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D
{
=C2=A0=C2=A0"comment":" This config file uses default settings for all = but the required values see README.md for docs",
=C2=A0=C2=A0"id": "default",
=C2=A0=C2=A0"description": "Default settings",=C2=A0=C2=A0"engineFactory": "com.ac= tionml.RecommendationEngine",
=C2=A0=C2=A0"datasource": {
=C2=A0=C2=A0=C2=A0=C2=A0"params" : {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"name": "tiny_app_data.csv",
=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0"appName": &quo= t;TinyApp",
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"eventNames": ["view"]
=C2=A0=C2=A0=C2=A0=C2=A0}
=C2=A0=C2=A0},
=C2=A0<= span class=3D"m_6092431424445408325m_-4020727891272643925m_-904359050213572= 4368m_-2216166021813322889m_7524115042203725766m_779908684915522544Apple-co= nverted-space">=C2=A0
"algorithms": [
=C2=A0=C2=A0=C2=A0= =C2=A0{
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"comment": "simplest setup where all value= s are default, popularity based backfill, must add eventsNames",
= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"name"= : "ur",
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"params": {
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
"appName": "TinyApp",
=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"i= ndexName": "urindex",
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0"typeName": "items&quo= t;,
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"comment": "must have data for the first event or the mod= el will not build, other events are optional",
=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0"eventNames"= : ["view"]
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0}
=C2=A0=C2=A0=C2=A0=C2=A0}
=C2=A0=C2=A0
]
}
=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D

The data I'm using is:
"u1","i1"
"u2","i1"=
"u2","i2"
"u3","i2"
"= ;u3","i3"
"u4","i4"

meaning user u viewed item i.

The data has been= added to the database with the following python code:

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
"""=
Import sample data for recommendation engine
"""
<= br>import predictionio
import argparse
import random

RATE_ACTI= ONS_DELIMITER =3D ","
SEED =3D 1


def import_events(= client, file):
=C2=A0=C2=A0f =3D open(file, '= r')
=C2=A0=C2=A0random.seed(SEED)
=C2=A0=C2=A0count =3D 0
=C2=A0=C2=A0print "Importing data..."

=C2=A0=C2=A0items =3D []
=C2=A0=C2=A0users =3D []
=C2= =A0=C2=A0f =3D open(file, 'r')
=C2=A0=C2=A0
for line in f:
=C2=A0=C2=A0=C2=A0=C2=A0data =3D line.rstrip('\r\n').split(RATE_ACTIONS= _DELIMITER)
=C2=A0=C2=A0=C2=A0=C2=A0users.append(= data[0])
=C2=A0=C2=A0=C2=A0=C2=A0items.append(dat= a[1])
=C2=A0=C2=A0=C2=A0=C2=A0client.create_event= (
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0event=3D&qu= ot;view",
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0entity_type=3D"user",
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0entity_id=3Ddata[0],
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0target_entity_type=3D"item",=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0target_entity_i= d=3Ddata[1]
=C2=A0=C2=A0=C2=A0=C2=A0)
=C2=A0= =C2=A0=C2=A0=C2=A0print "Event: " + "= view" + " entity_id: " + data[0] + " target_entity_id: = " + data[1]
=C2=A0=C2=A0=C2=A0=C2=A0count += =3D 1
=C2=A0=C2=A0f.close()

=C2=A0=C2=A0users =3D set(users)
=C2=A0=C2=A0items =3D set(items)
=C2=A0=C2=A0print "= ;All users: " + str(users)
=C2=A0=C2=A0print= "All items: " + str(items)
=C2=A0=C2=A0for item in items:
=C2=A0=C2=A0=C2=A0=C2=A0clien= t.create_event(
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0event=3D"$set",
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0entity_type=3D"item",
=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0entity_id=3Ditem
=C2=A0=C2=A0=C2= =A0=C2=A0)
=C2=A0=C2=A0=C2=A0=C2= =A0count +=3D 1


=C2=A0=C2=A0print = "%s events are imported." % count


if __name__ =3D=3D &= #39;__main__':
=C2=A0=C2=A0parser =3D argpars= e.ArgumentParser(
=C2=A0=C2=A0=C2=A0=C2=A0descrip= tion=3D"Import sample data for recommendation engine")
=C2=A0<= span class=3D"m_6092431424445408325m_-4020727891272643925m_-904359050213572= 4368m_-2216166021813322889m_7524115042203725766m_779908684915522544Apple-co= nverted-space">=C2=A0
parser.add_argument('--access_key'= , default=3D'invald_access_key')
=C2=A0=C2=A0
parser.add_argument('--url', default=3D"http://localhost:7070")=C2=A0=C2=A0parser.add_argument('--file', default=3D"./data/tiny_app_data.csv")

=C2=A0=C2=A0args =3D parser.parse_args()
=C2=A0=C2=A0print args

=C2=A0=C2=A0clie= nt =3D predictionio.EventClient(
=C2=A0=C2=A0=C2=A0=C2= =A0access_key=3Dargs.access_key,
=C2=A0=C2=A0=C2=A0=C2=A0url=3Dargs.url,
=C2=A0=C2=A0=C2=A0= =C2=A0threads=3D5,
=C2=A0=C2=A0=C2=A0=C2=A0
qsize=3D500)
=C2=A0=C2=A0import_events(client, a= rgs.file)
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
=
My pio_env.sh is the following:

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
#!/usr/bin/env bash#
# Copy this file as pio-env.sh and edit it for your site's confi= guration.
#
# Licensed to the Apache Software Foundation (ASF) under = one or more
# contributor license agreements.=C2=A0 See the NOTICE file = distributed with
# this work for additional information regarding copyri= ght ownership.
# The ASF licenses this file to You under the Apache Lice= nse, Version 2.0
# (the "License"); you may not use this file = except in compliance with
# the License.=C2=A0 You may obtain a copy of = the License at
#
#=C2=A0=C2=A0=C2=A0=C2=A0http:/= /www.apache.org/licenses/LICENSE-2.0
#
# Unless required by = applicable law or agreed to in writing, software
# distributed under the= License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANT= IES OR CONDITIONS OF ANY KIND, either express or implied.
# See the Lice= nse for the specific language governing permissions and
# limitations un= der the License.
#

# PredictionIO Main Configuration
#
# Th= is section controls core behavior of PredictionIO. It is very likely that# you need to change these to fit your site.

# SPARK_HOME: Apache = Spark is a hard dependency and must be configured.
# SPARK_HOME=3D$PIO_H= OME/vendors/spark-2.0.2-bin-hadoop2.7
SPARK_HOME=3D$PIO_HOME/vendor= s/spark-1.6.3-bin-hadoop2.6

POSTGRES_JDBC_DRIVER=3D$PIO_HOME/lib/postgresql-42.1.4.jar
MYSQL_JDBC_DRIVER=3D$PIO_HOME/lib/mysq= l-connector-java-5.1.41.jar

# ES_CONF_DIR: You must configure t= his if you have advanced configuration for
#=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 your Elasticsearch setu= p.
# ES_CONF_DIR=3D/opt/elasticsearch
#ES_CONF_DIR=3D$PIO_HOME/vendor= s/elasticsearch-1.7.6

# HADOOP_CONF_DIR: You must configure thi= s if you intend to run PredictionIO
#=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 with = Hadoop 2.
# HADOOP_CONF_DIR=3D/opt/hadoop

# HBASE_CONF_DIR: You m= ust configure this if you intend to run PredictionIO
#=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 with HBase on a remote cluster.
# HBASE_CONF_DIR=3D$PIO_HOME/vendors/hbase-1.0.0/conf

# Filesystem paths where PredictionIO uses as= block storage.
PIO_FS_BASEDIR=3D$HOME/.pio_store
PIO_FS_ENGINES= DIR=3D$PIO_FS_BASEDIR/engines
PIO_FS_TMPDIR=3D$PIO_FS_BASEDIR/= tmp

# PredictionIO Storage Configuration
#
# This section cont= rols programs that make use of PredictionIO's built-in
# storage fac= ilities. Default values are shown below.
#
# For more information on = storage configuration please refer to
#=C2=A0http://predictionio.incubator.apache.org/system/anoth= erdatastore/

# Storage Repositories

# Default is to = use PostgreSQL
PIO_STORAGE_REPOSITORIES_METADATA_NAME=3Dpio_metaPIO_STORAGE_REPOSITORIES_METADATA_SOURCE=3DELASTICSEARCH

PIO_S= TORAGE_REPOSITORIES_EVENTDATA_NAME=3Dpio_event
PIO_STORAGE_REPOSITO= RIES_EVENTDATA_SOURCE=3DHBASE

PIO_STORAGE_REPOSITORIES_MODELDATA_NAME=3Dpio_model
PIO_STORAGE_REPOSITORIES_MODELDATA_SOURCE= =3DLOCALFS

# Storage Data Sources

# PostgreSQL Default Settin= gs
# Please change "pio" to your database name in PIO_STORAGE_= SOURCES_PGSQL_URL
# Please change PIO_STORAGE_SOURCES_PGSQL_USERNAM= E and
# PIO_STORAGE_SOURCES_PGSQL_PASSWORD accordingly
PIO_STORA= GE_SOURCES_PGSQL_TYPE=3Djdbc
PIO_STORAGE_SOURCES_PGSQL_URL=3Dj= dbc:postgresql://localhost/pio
PIO_STORAGE_SOURCES_PGSQL_USE= RNAME=3Dpio
PIO_STORAGE_SOURCES_PGSQL_PASSWORD=3Dpio

# = MySQL Example
# PIO_STORAGE_SOURCES_MYSQL_TYPE=3Djdbc
# PIO_STOR= AGE_SOURCES_MYSQL_URL=3Djdbc:mysql://localhost/pio
# PIO_STO= RAGE_SOURCES_MYSQL_USERNAME=3Dpio
# PIO_STORAGE_SOURCES_MYSQL_PASS<= wbr>WORD=3Dpio

# Elasticsearch Example
# PIO_STORAGE_SOURCES_ELAS= TICSEARCH_TYPE=3Delasticsearch
# PIO_STORAGE_SOURCES_ELASTICSEARCH_HOSTS=3Dlocalhost
# PIO_STORAGE_SOURCES_ELASTICSEARCH_PORTS=3D= 9200
# PIO_STORAGE_SOURCES_ELASTICSEARCH_SCHEMES=3Dhttp
# PIO_ST= ORAGE_SOURCES_ELASTICSEARCH_HOME=3D$PIO_HOME/vendors/elasticsearc= h-5.2.1
# Elasticsearch 1.x Example
PIO_STORAGE_SOURCES_ELASTICSEARCH_TYPE=3Delasticsearch
PIO_STORAGE_SOURCES_ELASTICSEARCH_CLUSTE= RNAME=3DmyprojectES
PIO_STORAGE_SOURCES_ELASTICSEARCH_HOSTS=3Dlocal= host
PIO_STORAGE_SOURCES_ELASTICSEARCH_PORTS=3D9300
PIO_STORAGE_= SOURCES_ELASTICSEARCH_HOME=3D$PIO_HOME/vendors/elasticsearch-1.7.= 6

# Local File System Example
PIO_STORAGE_SOURCES_LOCALFS_TY= PE=3Dlocalfs
PIO_STORAGE_SOURCES_LOCALFS_PATH=3D$PIO_FS_BASEDIR/mod= els

# HBase Example
PIO_STORAGE_SOURCES_HBASE_TYPE=3DhbasePIO_STORAGE_SOURCES_HBASE_HOME=3D$PIO_HOME/vendors/hbase-1.2.6
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Error message:


=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
[ERROR] [TaskSetMan= ager] Task 2.0 in stage 10.0 (TID 24) had a not serializable result: org.ap= ache.mahout.math.RandomAccessSparseVector
Serialization stack:
= =C2=A0=C2=A0=C2=A0=C2=A0- object not serializable (c= lass: org.apache.mahout.math.RandomAccessSparseVector, value: {3:1.0,2= :1.0})
=C2=A0=C2=A0=C2=A0=C2=A0- field (class: sc= ala.Tuple2, name: _2, type: class java.lang.Object)
=C2=A0=C2=A0=C2=A0=C2=A0- object (class scala.Tuple2, (2,{3:1.0,2:1.0}))= ; not retrying
[ERROR] [TaskSetManager] Task 3.0 in stage 10.0 (TID 25) = had a not serializable result: org.apache.mahout.math.RandomAccessSpar= seVector
Serialization stack:
=C2=A0=C2=A0=C2=A0=C2= =A0- object not serializable (class: org.apache.mahout.math.RandomA<= wbr>ccessSparseVector, value: {0:1.0,3:1.0})
=C2=A0=C2=A0=C2=A0=C2=A0- field (class: scala.Tuple2, name: _2, type: class jav= a.lang.Object)
=C2=A0=C2=A0=C2=A0=C2=A0- object (= class scala.Tuple2, (3,{0:1.0,3:1.0})); not retrying
[ERROR] [TaskSetMan= ager] Task 1.0 in stage 10.0 (TID 23) had a not serializable result: org.ap= ache.mahout.math.RandomAccessSparseVector
Serialization stack:
= =C2=A0=C2=A0=C2=A0=C2=A0- object not serializable (c= lass: org.apache.mahout.math.RandomAccessSparseVector, value: {1:1.0})=
=C2=A0=C2=A0=C2=A0=C2=A0- field (class: scala.Tu= ple2, name: _2, type: class java.lang.Object)
=C2=A0=C2=A0=C2=A0=C2=A0- object (class scala.Tuple2, (1,{1:1.0})); not retryi= ng
[ERROR] [TaskSetManager] Task 0.0 in stage 10.0 (TID 22) had a not se= rializable result: org.apache.mahout.math.RandomAccessSparseVector
= Serialization stack:
=C2=A0=C2=A0=C2=A0=C2=A0- ob= ject not serializable (class: org.apache.mahout.math.RandomAccessSpars= eVector, value: {0:1.0})
=C2=A0=C2=A0=C2=A0=C2=A0= - field (class: scala.Tuple2, name: _2, type: class java.lang.Object)
= =C2=A0=C2=A0=C2=A0=C2=A0- object (class scala.Tuple2= , (0,{0:1.0})); not retrying
Exception in thread "main" org.ap= ache.spark.SparkException: Job aborted due to stage failure: Task 2.0 = in stage 10.0 (TID 24) had a not serializable result: org.apache.mahout.mat= h.RandomAccessSparseVector
Serialization stack:
=C2=A0=C2=A0=C2= =A0=C2=A0- object not serializable (class: org.apach= e.mahout.math.RandomAccessSparseVector, value: {3:1.0,2:1.0})
=C2= =A0=C2=A0=C2=A0=C2=A0- field (class: scala.Tuple2, n= ame: _2, type: class java.lang.Object)
=C2=A0=C2=A0=C2=A0=C2=A0- object (class scala.Tuple2, (2,{3:1.0,2:1.0}))
=C2=A0=C2= =A0=C2=A0=C2=A0at=C2=A0org.apache.spark.scheduler.DAGScheduler.org$apache$spark$sch= eduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.sca= la:1431)
=C2=A0=C2=A0=C2=A0=C2=A0at org.apache.sp= ark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGSchedul= er.scala:1419)
=C2=A0=C2=A0=C2=A0=C2=A0at or= g.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply= (DAGScheduler.scala:1418)
=C2=A0=C2=A0=C2=A0=C2=A0<= /span>at scala.collection.mutable.ResizableArray$class.foreach(Resiza<= wbr>bleArray.scala:59)
=C2=A0=C2=A0=C2=A0=C2=A0at= scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:4= 7)
=C2=A0=C2=A0=C2=A0=C2=A0at org.apache.spark.sc= heduler.DAGScheduler.abortStage(DAGScheduler.scala:1418)
=C2= =A0=C2=A0=C2=A0=C2=A0at org.apache.spark.scheduler.D= AGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:799)
=C2=A0=C2=A0=C2=A0=C2=A0at org.apach= e.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.app= ly(DAGScheduler.scala:799)
=C2=A0=C2=A0=C2=A0=C2=A0= at scala.Option.foreach(Option.scala:236)
=C2=A0=C2=A0=C2=A0= =C2=A0at org.apache.spark.scheduler.DAGSchedule= r.handleTaskSetFailed(DAGScheduler.scala:799)
=C2=A0=C2=A0=C2=A0=C2=A0
at org.apache.spark.scheduler.DAGSchedulerEv= entProcessLoop.doOnReceive(DAGScheduler.scala:1640)
=C2=A0=C2= =A0=C2=A0=C2=A0at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1599)
=C2= =A0=C2=A0=C2=A0=C2=A0at org.apache.spark.scheduler.D= AGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1588)=C2=A0=C2=A0=C2=A0=C2=A0at org.apache.spark.util.Ev= entLoop$$anon$1.run(EventLoop.scala:48)
=C2=A0=C2=A0=C2=A0=C2=A0at org.apache.spark.scheduler.DAGScheduler.ru= nJob(DAGScheduler.scala:620)
=C2=A0=C2=A0=C2=A0=C2= =A0at org.apache.spark.SparkContext.runJob(SparkContext.scala:1= 832)
=C2=A0=C2=A0=C2=A0=C2=A0at org.apache.s= park.SparkContext.runJob(SparkContext.scala:1952)
=C2=A0=C2=A0= =C2=A0=C2=A0at org.apache.spark.rdd.RDD$$anonfu= n$fold$1.apply(RDD.scala:1088)
=C2=A0=C2=A0=C2=A0= =C2=A0at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDO= perationScope.scala:150)
=C2=A0=C2=A0=C2=A0=C2=A0at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:111)
=C2=A0=C2=A0=C2=A0=C2=A0at = org.apache.spark.rdd.RDD.withScope(RDD.scala:316)
=C2=A0=C2=A0=C2= =A0=C2=A0at org.apache.spark.rdd.RDD.fold(RDD.s= cala:1082)
=C2=A0=C2=A0=C2=A0=C2=A0at org.apache.= mahout.sparkbindings.drm.CheckpointedDrmSpark.computeNRow(Checkpoin= tedDrmSpark.scala:188)
=C2=A0=C2=A0=C2=A0=C2=A0at org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark.nrow$lzycompute(CheckpointedDrmSpark.scala:55)
=C2=A0=C2=A0=C2=A0=C2=A0
at org.apache.mahout.sparkbindings.drm.Checkp= ointedDrmSpark.nrow(CheckpointedDrmSpark.scala:55)
=C2=A0=C2= =A0=C2=A0=C2=A0at org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark.newRowCardinality(CheckpointedDrmSpar= k.scala:219)
=C2=A0=C2=A0=C2=A0=C2=A0at com.actio= nml.IndexedDatasetSpark$.apply(Preparator.scala:213)
=C2=A0=C2= =A0=C2=A0=C2=A0at com.actionml.Preparator$$anonfun$3.apply(Preparator.scala:71)
=C2=A0=C2=A0=C2=A0= =C2=A0at com.actionml.Preparator$$anonfun$3.apply(Preparator.sc= ala:49)
=C2=A0=C2=A0=C2=A0=C2=A0at scala.col= lection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scal= a:244)
=C2=A0=C2=A0=C2=A0=C2=A0at scala.collectio= n.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)=
=C2=A0=C2=A0=C2=A0=C2=A0at scala.collection.immu= table.List.foreach(List.scala:318)
=C2=A0=C2=A0=C2=A0=C2=A0at scala.collection.TraversableLike$class.map(Traversab= leLike.scala:244)
=C2=A0=C2=A0=C2=A0=C2=A0at= scala.collection.AbstractTraversable.map(Traversable.scala:105)<= br>=C2=A0=C2=A0=C2=A0=C2=A0at com.actionml.Preparato= r.prepare(Preparator.scala:49)
=C2=A0=C2=A0=C2=A0= =C2=A0at com.actionml.Preparator.prepare(Preparator.scala:32)=C2=A0=C2=A0=C2=A0=C2=A0at org.apache.predictionio= .controller.PPreparator.prepareBase(PPreparator.scala:37)
=C2= =A0=C2=A0=C2=A0=C2=A0at org.apache.predictionio.cont= roller.Engine$.train(Engine.scala:671)
=C2=A0=C2=A0=C2=A0=C2=A0
at org.apache.predictionio.controller.Engine.t= rain(Engine.scala:177)
=C2=A0=C2=A0=C2=A0=C2=A0at org.apache.predictionio.workflow.CoreWorkflow$.runTrain(CoreWorkflow.scala:67)
=C2=A0=C2=A0=C2=A0=C2=A0at or= g.apache.predictionio.workflow.CreateWorkflow$.main(CreateWorkflo= w.scala:250)
=C2=A0=C2=A0=C2=A0=C2=A0at org.apach= e.predictionio.workflow.CreateWorkflow.main(CreateWorkflow.scala)=
=C2=A0=C2=A0=C2=A0=C2=A0at sun.reflect.NativeMet= hodAccessorImpl.invoke0(Native Method)
=C2=A0=C2=A0=C2=A0=C2=A0at sun.reflect.NativeMethodAccessorImpl.invoke(Nati= veMethodAccessorImpl.java:62)
=C2=A0=C2=A0=C2=A0=C2= =A0at sun.reflect.DelegatingMethodAccessorImpl.invoke(Delegatin= gMethodAccessorImpl.java:43)
=C2=A0=C2=A0=C2=A0=C2= =A0at java.lang.reflect.Method.invoke(Method.java:498)
=C2= =A0=C2=A0=C2=A0=C2=A0at org.apache.spark.deploy.Spar= kSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731)
=C2=A0=C2=A0=C2=A0=C2=A0at org.a= pache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181= )
=C2=A0=C2=A0=C2=A0=C2=A0at org.apache.spark.dep= loy.SparkSubmit$.submit(SparkSubmit.scala:206)
=C2=A0=C2=A0=C2= =A0=C2=A0at org.apache.spark.deploy.SparkSubmit= $.main(SparkSubmit.scala:121)
=C2=A0=C2=A0=C2=A0=C2= =A0at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scal= a)
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Thank you all f= or your help.

Best regards,
noelia


=
<= /div>
=







=

--=C2= =A0
You received this mess= age because you are subscribed to the Google Groups "actionml-user&quo= t; group.
To unsubscribe from thi= s group and stop receiving emails from it, send an email to=C2=A0actionml-user+unsubscribe@googlegroups.com.
To po= st to this group, send email to=C2=A0actionml-user@googlegroups.com.
To view this discussion on the web visit=C2=A0<= /span>https://groups.google.com/d= /msgid/actionml-user/CAMysefsW%3DeYPjUE1pc67C9D312HL_xNMtzmStUwDs= UdHCCVU-Q%40mail.gmail.com.
For more options, visit=C2= =A0https://groups.google.com/d/optout.

--=C2=A0
You received this message beca= use you are subscribed to the Google Groups "actionml-user" group= .
To unsubscribe from this group and stop receiving emails from it, send= an email to=C2= =A0actionml-user+unsubscribe@googlegroups.com.
To p= ost to this group, send email to=C2=A0actionml-user@googlegroups.com.
To view this discussion on the web visit=C2=A0https:/= /groups.google.com/d/msgid/actionml-user/ACE11A1B-C887-41F1-820B-= 3B161EDCDABA%40occamsmachete.com.
For more options, = visit=C2=A0https://= groups.google.com/d/optout.




--=C2=A0

Noelia Os=C3=A9s Fern=C3=A1n= dez, PhD
Senior Researcher |
Investigadora Senior


noses@= vicomtech.org
+[34]=C2=A0943=C2=A030=C2=A092=C2=A030=C2=A0= =C2=A0<= tr>
member of:=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0
Legal Notice - Privacy policy

--=C2=A0
You received this message because you are subscribed= to the Google Groups "actionml-user" group.
To unsubscribe from this group and stop receiving ema= ils from it, send an email to=C2=A0actionml-user+unsubscribe@googlegroup= s.com.
To post to this group, send email to=C2=A0actionml-user@googlegroups.= com.
To view this discussion on the web visit=C2=A0https://groups.google.com/d/msgid/action= ml-user/CAMysefsy0K66O9CJw-j3qdkN7rqoXrwHOsmgaNQTioeLuvX7Xg%= 40mail.gmail.com.
For more options, visit=C2=A0https://groups.googl= e.com/d/optout.
=



--=

Noelia Os= =C3=A9s Fern=C3=A1ndez, PhD
Senior Researcher |
Investigadora Senio= r


noses@vicomtech.org
+[34]=C2=A0943= =C2=A030=C2=A092=C2=A030
Data Intelligence for Energy an= d
Industrial Processes | Inteligencia
de Datos para Energ=C3=ADa y Pr= ocesos
Industriales


=C2=A0=C2=A0

member of:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0

Legal Notice - Privacy policy
--001a114445f8b356a1055c31dd49--